diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..6c28040b --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 + +updates: + - package-ecosystem: "github-actions" + directory: "/" + target-branch: "develop" + schedule: + interval: "weekly" \ No newline at end of file diff --git a/.gitignore b/.gitignore index b59e8c46..4e796cf4 100644 --- a/.gitignore +++ b/.gitignore @@ -194,3 +194,113 @@ Common/resgrid.local.pfx Web/Resgrid.Web.ServicesCore/Properties/serviceDependencies.json Web/Resgrid.Web.ServicesCore/Properties/serviceDependencies.local.json Web/Resgrid.Web.ServicesCore/Properties/ServiceDependencies/local/appInsights1.arm.json + +Docker/docker-data/dms/mail-state/lib-clamav/bytecode.cvd + +Docker/docker-data/dms/mail-state/lib-clamav/daily.cvd + +Docker/docker-data/dms/mail-state/lib-clamav/freshclam.dat + +Docker/docker-data/dms/mail-state/lib-clamav/main.cvd +Docker/docker-data/dms/config/dovecot-quotas.cf +Docker/docker-data/dms/config/mailconfig +Docker/docker-data/dms/config/postfix-aliases.cf +Docker/docker-data/dms/mail-data/maildata +Docker/docker-data/dms/mail-logs/maillogs +Docker/docker-data/dms/mail-state/mailstate +Docker/docker-data/dms/mail-state/lib-amavis/.razor/identity +Docker/docker-data/dms/mail-state/lib-amavis/.razor/identity-ruYtA-SdhH +Docker/docker-data/dms/mail-state/lib-amavis/.razor/server.n001.cloudmark.com.conf +Docker/docker-data/dms/mail-state/lib-amavis/.razor/server.n004.cloudmark.com.conf +Docker/docker-data/dms/mail-state/lib-amavis/.razor/servers.catalogue.lst +Docker/docker-data/dms/mail-state/lib-amavis/.razor/servers.discovery.lst +Docker/docker-data/dms/mail-state/lib-amavis/.razor/servers.nomination.lst +Docker/docker-data/dms/mail-state/lib-spamassassin/sa-update-keys/pubring.kbx +Docker/docker-data/dms/mail-state/lib-spamassassin/sa-update-keys/trustdb.gpg +Docker/docker-data/sql/backup/sqlbackups +Docker/docker-data/sql/data/Entropy.bin +Docker/docker-data/sql/data/master.mdf +Docker/docker-data/sql/data/mastlog.ldf +Docker/docker-data/sql/data/model_msdbdata.mdf +Docker/docker-data/sql/data/model_msdblog.ldf +Docker/docker-data/sql/data/model_replicatedmaster.ldf +Docker/docker-data/sql/data/model_replicatedmaster.mdf +Docker/docker-data/sql/data/model.mdf +Docker/docker-data/sql/data/modellog.ldf +Docker/docker-data/sql/data/msdbdata.mdf +Docker/docker-data/sql/data/msdblog.ldf +Docker/docker-data/sql/data/Resgrid_log.ldf +Docker/docker-data/sql/data/Resgrid.mdf +Docker/docker-data/sql/data/ResgridOIDC_log.ldf +Docker/docker-data/sql/data/ResgridOIDC.mdf +Docker/docker-data/sql/data/ResgridWorkers_log.ldf +Docker/docker-data/sql/data/ResgridWorkers.mdf +Docker/docker-data/sql/data/sqldata +Docker/docker-data/sql/data/tempdb.mdf +Docker/docker-data/sql/data/templog.ldf +Docker/docker-data/sql/log/errorlog +Docker/docker-data/sql/log/errorlog.1 +Docker/docker-data/sql/log/errorlog.2 +Docker/docker-data/sql/log/errorlog.3 +Docker/docker-data/sql/log/errorlog.4 +Docker/docker-data/sql/log/errorlog.5 +Docker/docker-data/sql/log/errorlog.6 +Docker/docker-data/sql/log/errorlog.7 +Docker/docker-data/sql/log/errorlog.8 +Docker/docker-data/sql/log/errorlog.9 +Docker/docker-data/sql/log/errorlog.10 +Docker/docker-data/sql/log/errorlog.11 +Docker/docker-data/sql/log/errorlog.12 +Docker/docker-data/sql/log/errorlog.13 +Docker/docker-data/sql/log/errorlog.14 +Docker/docker-data/sql/log/errorlog.15 +Docker/docker-data/sql/log/errorlog.16 +Docker/docker-data/sql/log/errorlog.17 +Docker/docker-data/sql/log/errorlog.18 +Docker/docker-data/sql/log/errorlog.19 +Docker/docker-data/sql/log/HkEngineEventFile_0_132921975549100000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922007317990000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922009309080000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922013218750000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922018741370000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922033212920000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922067366660000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922075764680000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922088137910000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922111474730000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922117751690000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922122624170000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922132763460000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922142267410000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922152684910000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922153785260000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922154586090000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922155443490000.xel +Docker/docker-data/sql/log/HkEngineEventFile_0_132922211494070000.xel +Docker/docker-data/sql/log/log_16.trc +Docker/docker-data/sql/log/log_17.trc +Docker/docker-data/sql/log/log_18.trc +Docker/docker-data/sql/log/log_19.trc +Docker/docker-data/sql/log/log_20.trc +Docker/docker-data/sql/log/sqllogs +Docker/docker-data/sql/log/system_health_0_132922111481530000.xel +Docker/docker-data/sql/log/system_health_0_132922117759410000.xel +Docker/docker-data/sql/log/system_health_0_132922122632370000.xel +Docker/docker-data/sql/log/system_health_0_132922132771730000.xel +Docker/docker-data/sql/log/system_health_0_132922142272820000.xel +Docker/docker-data/sql/log/system_health_0_132922152690110000.xel +Docker/docker-data/sql/log/system_health_0_132922153791210000.xel +Docker/docker-data/sql/log/system_health_0_132922154593260000.xel +Docker/docker-data/sql/log/system_health_0_132922155450540000.xel +Docker/docker-data/sql/log/system_health_0_132922211502270000.xel +Docker/docker-data/dms/config/mailconfig +Docker/docker-data/dms/mail-data/maildata +Docker/docker-data/dms/mail-logs/maillogs +Docker/docker-data/dms/mail-state/mailstate +Docker/docker-data/sql/backup/sqlbackups +Docker/docker-data/sql/data/sqldata +Docker/docker-data/sql/log/sqllogs +Docker/docker-data/dms/config/mailconfig +Docker/docker-data/dms/mail-data/maildata +Docker/docker-data/dms/mail-logs/maillogs +Docker/docker-data/dms/mail-state/mailstate diff --git a/Core/Resgrid.Config/ExternalErrorConfig.cs b/Core/Resgrid.Config/ExternalErrorConfig.cs index 4aba0eb6..9f150794 100644 --- a/Core/Resgrid.Config/ExternalErrorConfig.cs +++ b/Core/Resgrid.Config/ExternalErrorConfig.cs @@ -1,7 +1,15 @@ namespace Resgrid.Config { + /// + /// Configuration for working with external error tracking systems like Elk and Sentry + /// public static class ExternalErrorConfig { + /// + /// The current operating enviorment for the code, i.e. prod, qa, dev + /// + public static string Environment = "dev"; + #region Elk Settings public static string ElkServiceUrl = "http://localhost:9200"; #endregion Elk Settings @@ -9,6 +17,7 @@ public static class ExternalErrorConfig #region Sentry Settings public static string ExternalErrorServiceUrl = ""; public static string ExternalErrorServiceUrlForWebsite = ""; + public static string ExternalErrorServiceUrlForWebjobs = ""; #endregion Sentry Settings } diff --git a/Core/Resgrid.Config/JwtConfig.cs b/Core/Resgrid.Config/JwtConfig.cs new file mode 100644 index 00000000..141112b1 --- /dev/null +++ b/Core/Resgrid.Config/JwtConfig.cs @@ -0,0 +1,16 @@ +namespace Resgrid.Config +{ + /// + /// Config settings for JWT's used in the website and api + /// + public static class JwtConfig + { + public static string Key = ""; + + public static string Issuer = "resgrid.local"; + + public static string Audience = "resgrid.local"; + + public static int Duration = 30; + } +} diff --git a/Core/Resgrid.Config/OidcConfig.cs b/Core/Resgrid.Config/OidcConfig.cs new file mode 100644 index 00000000..f02594e4 --- /dev/null +++ b/Core/Resgrid.Config/OidcConfig.cs @@ -0,0 +1,20 @@ +namespace Resgrid.Config +{ + /// + /// Configuration for OpenID Connect (https://documentation.openiddict.com/) + /// + public static class OidcConfig + { + public static string Key = ""; + + public static string ConnectionString = "Server=rgdevserver;Database=ResgridOIDC;User Id=resgrid_app;Password=resgrid123;MultipleActiveResultSets=True;"; + + public static int AccessTokenExpiryMinutes = 1440; + + public static int RefreshTokenExpiryDays = 30; + + public static string EncryptionCert = ""; + + public static string SigningCert = ""; + } +} diff --git a/Core/Resgrid.Config/Resgrid.Config.csproj b/Core/Resgrid.Config/Resgrid.Config.csproj index 9444a28e..e9742aba 100644 --- a/Core/Resgrid.Config/Resgrid.Config.csproj +++ b/Core/Resgrid.Config/Resgrid.Config.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 Resgrid.Config Resgrid.Config diff --git a/Core/Resgrid.Config/ServiceBusConfig.cs b/Core/Resgrid.Config/ServiceBusConfig.cs index 31d3564e..b60c9187 100644 --- a/Core/Resgrid.Config/ServiceBusConfig.cs +++ b/Core/Resgrid.Config/ServiceBusConfig.cs @@ -12,6 +12,7 @@ public static class ServiceBusConfig public static string EmailBroadcastQueueName = "resgridemails"; public static string SystemQueueName = "resgridsys"; public static string PaymentQueueName = "payment"; + public static string AuditQueueName = "audit"; #region Azure Service Bus Values public static string SignalRServiceBusConnectionString = ""; @@ -49,6 +50,8 @@ public static class ServiceBusConfig #region RabbitMQ Bus Values public static string RabbitHostname = "localhost"; + public static string RabbitHostname2 = ""; // For 3 host cluster, node 2 + public static string RabbitHostname3 = ""; // For 3 host cluster, node 3 public static string RabbitUsername = "guest"; public static string RabbbitPassword = "guest"; public static string RabbbitExchange = ""; diff --git a/Core/Resgrid.Config/SystemBehaviorConfig.cs b/Core/Resgrid.Config/SystemBehaviorConfig.cs index d2198d55..11b0142e 100644 --- a/Core/Resgrid.Config/SystemBehaviorConfig.cs +++ b/Core/Resgrid.Config/SystemBehaviorConfig.cs @@ -107,6 +107,11 @@ public static class SystemBehaviorConfig /// public static LinksProviderTypes LinkProviderType = LinksProviderTypes.Polr; + /// + /// Sets the type of voip provider to use + /// + public static VoipProviderTypes VoipProviderType = VoipProviderTypes.Kazoo; + /// /// Sets the type of sms provider to use /// @@ -150,6 +155,11 @@ public static class SystemBehaviorConfig /// public static string SiteKey = ""; + /// + /// A notice to display on the login page + /// + public static string LoginPageNotice = ""; + public static string GetEnvPrefix() { switch (Environment) diff --git a/Core/Resgrid.Config/TelemetryConfig.cs b/Core/Resgrid.Config/TelemetryConfig.cs new file mode 100644 index 00000000..1a01a24d --- /dev/null +++ b/Core/Resgrid.Config/TelemetryConfig.cs @@ -0,0 +1,7 @@ +namespace Resgrid.Config +{ + public static class TelemetryConfig + { + public static string Exporter = ""; + } +} diff --git a/Core/Resgrid.Config/VoipConfig.cs b/Core/Resgrid.Config/VoipConfig.cs new file mode 100644 index 00000000..321ef811 --- /dev/null +++ b/Core/Resgrid.Config/VoipConfig.cs @@ -0,0 +1,34 @@ +namespace Resgrid.Config +{ + /// + /// Configuration for using a VOIP system for voice communication between applications + /// + public static class VoipConfig + { + public static int BaseChannelExtensionNumber = 15; + public static int BaseChannelExtensionBump = 15; + + public static string VoipDomain = ""; + public static string VoipServerAddress = ""; + public static string VoipServerWebsocketAddress = ""; + public static string VoipServerWebsocketSslAddress = ""; + + public static string KazooUsername = ""; + public static string KazooPassword = ""; + public static string KazzoAccount = ""; + public static string KazooCrossbarApiUrl = @""; + public static string KazooCrossbarApiVersion = ""; + + public static string OpenViduUrl = ""; + public static string OpenViduSecret = ""; + } + + /// + /// Possible backend voip providers + /// + public enum VoipProviderTypes + { + Kazoo = 0, + OpenVidu = 1 + } +} diff --git a/Core/Resgrid.Framework/ConfigHelper.cs b/Core/Resgrid.Framework/ConfigHelper.cs new file mode 100644 index 00000000..c9b30d64 --- /dev/null +++ b/Core/Resgrid.Framework/ConfigHelper.cs @@ -0,0 +1,15 @@ +using Resgrid.Config; + +namespace Resgrid.Framework +{ + public static class ConfigHelper + { + public static bool CanTransmit(int departmentId) + { + if (SystemBehaviorConfig.BypassDoNotBroadcastDepartments.Contains(departmentId)) + return true; + + return !SystemBehaviorConfig.DoNotBroadcast; + } + } +} diff --git a/Core/Resgrid.Framework/Hashing.cs b/Core/Resgrid.Framework/Hashing.cs new file mode 100644 index 00000000..2d707bf5 --- /dev/null +++ b/Core/Resgrid.Framework/Hashing.cs @@ -0,0 +1,60 @@ +using Resgrid.Config; +using System.Security.Cryptography; +using System.Text; + +namespace Resgrid.Framework +{ + public static class Hashing + { + public static string ComputeSha256Hash(string rawData) + { + // Create a SHA256 + using (SHA256 sha256Hash = SHA256.Create()) + { + // ComputeHash - returns byte array + byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData + SymmetricEncryptionConfig.SaltValue)); + + // Convert byte array to a string + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < bytes.Length; i++) + { + builder.Append(bytes[i].ToString("x2")); + } + return builder.ToString(); + } + } + + public static string ComputeMD5Hash(string input) + { + using (MD5 md5 = MD5.Create()) + { + byte[] inputBytes = Encoding.ASCII.GetBytes(input); + byte[] hashBytes = md5.ComputeHash(inputBytes); + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < hashBytes.Length; i++) + { + sb.Append(hashBytes[i].ToString("x2")); + } + return sb.ToString(); + } + } + + public static string ComputeSHA1Hash(string input) + { + using (SHA1Managed sha1 = new SHA1Managed()) + { + var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input)); + var sb = new StringBuilder(hash.Length * 2); + + foreach (byte b in hash) + { + // can be "x2" if you want lowercase + sb.Append(b.ToString("x2")); + } + + return sb.ToString(); + } + } + } +} diff --git a/Core/Resgrid.Framework/LocationHelpers.cs b/Core/Resgrid.Framework/LocationHelpers.cs index b7936f60..c77eff4d 100644 --- a/Core/Resgrid.Framework/LocationHelpers.cs +++ b/Core/Resgrid.Framework/LocationHelpers.cs @@ -36,9 +36,13 @@ public static double ConvertDegreeAngleToDouble(string point) var multiplier = (point.Contains("S") || point.Contains("W")) ? -1 : 1; //handle south and west - point = Regex.Replace(point, "[^0-9. ]", ""); //remove the characters + var newPoint = point.Replace("°", " "); + newPoint = newPoint.Replace("'", " "); + newPoint = newPoint.Replace(" ", " "); - var pointArray = point.Trim().Split(' '); //split the string. + newPoint = Regex.Replace(newPoint, "[^0-9. ]", ""); //remove the characters + + var pointArray = newPoint.Trim().Split(' '); //split the string. //Decimal degrees = // whole number of degrees, diff --git a/Core/Resgrid.Framework/Logging.cs b/Core/Resgrid.Framework/Logging.cs index 25f9ec38..7f99e3a9 100644 --- a/Core/Resgrid.Framework/Logging.cs +++ b/Core/Resgrid.Framework/Logging.cs @@ -36,9 +36,11 @@ public static void Initialize(string key) { o.MinimumBreadcrumbLevel = LogEventLevel.Debug; o.MinimumEventLevel = LogEventLevel.Error; - o.Dsn = new Dsn(dsn); + o.Dsn = dsn; o.AttachStacktrace = true; o.SendDefaultPii = true; + o.Environment = ExternalErrorConfig.Environment; + o.Release = Assembly.GetEntryAssembly().GetName().Version.ToString(); }).CreateLogger(); } else if (SystemBehaviorConfig.ErrorLoggerType == ErrorLoggerTypes.Elk) @@ -64,12 +66,12 @@ private static void ShowConsole() } } - public static void LogException(Exception exception, string extraMessage = "", + public static void LogException(Exception exception, string extraMessage = "", string correlationId = "", [CallerFilePath] string callerFilePath = "", [CallerMemberName] string callerMemberName = "", [CallerLineNumber] int callerLineNumber = 0) { Initialize(null); - string msgToLog = string.Format("{0}\r\n{4}\r\n\r\nAssemblyName:{5}\r\nCallerFilePath:{1}\r\nCallerMemberName:{2}\r\nCallerLineNumber:{3}", extraMessage, - callerFilePath, callerMemberName, callerLineNumber, exception.ToString(), Assembly.GetExecutingAssembly().FullName); + string msgToLog = string.Format("{0}\r\n{4}\r\n\r\nAssemblyName:{5}\r\nCallerFilePath:{1}\r\nCallerMemberName:{2}\r\nCallerLineNumber:{3}r\nCorrelationId:{6}", extraMessage, + callerFilePath, callerMemberName, callerLineNumber, exception.ToString(), Assembly.GetExecutingAssembly().FullName, correlationId); if (_logger != null) diff --git a/Core/Resgrid.Framework/OS.cs b/Core/Resgrid.Framework/OS.cs new file mode 100644 index 00000000..f5143af2 --- /dev/null +++ b/Core/Resgrid.Framework/OS.cs @@ -0,0 +1,16 @@ +using System.Runtime.InteropServices; + +namespace Resgrid.Framework +{ + public static class OS + { + public static bool IsWindows() => + RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + + public static bool IsMacOS() => + RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + + public static bool IsLinux() => + RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + } +} diff --git a/Core/Resgrid.Framework/ObjectCopier.cs b/Core/Resgrid.Framework/ObjectCopier.cs index 2eca1518..b3944932 100644 --- a/Core/Resgrid.Framework/ObjectCopier.cs +++ b/Core/Resgrid.Framework/ObjectCopier.cs @@ -56,7 +56,26 @@ public static T CloneJson(this T source) return default(T); } - return ObjectSerialization.Deserialize(ObjectSerialization.Serialize(source)); + //return ObjectSerialization.Deserialize(ObjectSerialization.Serialize(source)); + return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(source)); + } + + /// + /// Perform a deep Copy of the object, using Json as a serialisation method returns a string + /// + /// The type of object being copied. + /// The object instance to copy. + /// The copied object as a json string + public static string CloneJsonToString(this T source) + { + // Don't serialize a null object, simply return the default for that object + if (Object.ReferenceEquals(source, null)) + { + return ""; + } + + //return ObjectSerialization.Deserialize(ObjectSerialization.Serialize(source)); + return JsonConvert.SerializeObject(source); } } } diff --git a/Core/Resgrid.Framework/Resgrid.Framework.csproj b/Core/Resgrid.Framework/Resgrid.Framework.csproj index c0c8e675..2eac3fdb 100644 --- a/Core/Resgrid.Framework/Resgrid.Framework.csproj +++ b/Core/Resgrid.Framework/Resgrid.Framework.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 Resgrid.Framework Resgrid, LLC Resgrid OSS CAD @@ -15,17 +15,17 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Core/Resgrid.Framework/SymmetricEncryption.cs b/Core/Resgrid.Framework/SymmetricEncryption.cs index de859b2f..de7bdee5 100644 --- a/Core/Resgrid.Framework/SymmetricEncryption.cs +++ b/Core/Resgrid.Framework/SymmetricEncryption.cs @@ -109,6 +109,7 @@ public static string Decrypt(string cipherText, string passPhrase) // It is reasonable to set encryption mode to Cipher Block Chaining // (CBC). Use default options for other symmetric key parameters. symmetricKey.Mode = CipherMode.CBC; + symmetricKey.Padding = PaddingMode.PKCS7; // Generate decryptor from the existing key bytes and initialization // vector. Key size will be defined based on the number of the key @@ -128,12 +129,25 @@ public static string Decrypt(string cipherText, string passPhrase) // Since at this point we don't know what the size of decrypted data // will be, allocate the buffer long enough to hold ciphertext; // plaintext is never longer than ciphertext. - byte[] plainTextBytes = new byte[cipherTextBytes.Length]; + byte[] plainTextBytes = null;// = new byte[cipherTextBytes.Length]; // Start decrypting. - int decryptedByteCount = cryptoStream.Read(plainTextBytes, - 0, - plainTextBytes.Length); + //int decryptedByteCount = cryptoStream.Read(plainTextBytes, + // 0, + // plainTextBytes.Length); + + string plainText = null; + //using (var plainTextReader = new StreamReader(cryptoStream)) + //{ + // plainText = plainTextReader.ReadToEnd(); + //} + + using (var plainTextStream = new MemoryStream()) + { + cryptoStream.CopyTo(plainTextStream); + plainTextBytes = plainTextStream.ToArray(); + plainText = Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length); + } // Close both streams. memoryStream.Close(); @@ -141,9 +155,9 @@ public static string Decrypt(string cipherText, string passPhrase) // Convert decrypted data into a string. // Let us assume that the original plaintext string was UTF8-encoded. - string plainText = Encoding.UTF8.GetString(plainTextBytes, - 0, - decryptedByteCount); + //string plainText = Encoding.UTF8.GetString(plainTextBytes, + // 0, + // totalRead); // Return decrypted string. return plainText; diff --git a/Core/Resgrid.Model/ActionLog.cs b/Core/Resgrid.Model/ActionLog.cs index 92da47b5..ae26166a 100644 --- a/Core/Resgrid.Model/ActionLog.cs +++ b/Core/Resgrid.Model/ActionLog.cs @@ -5,6 +5,7 @@ using System.Linq; using ProtoBuf; using System.Collections.Generic; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -65,6 +66,7 @@ public class ActionLog : IEntity public virtual Department Department { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return ActionLogId; } @@ -78,7 +80,10 @@ public object IdValue public string IdName => "ActionLogId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "User", "EtaPulledOn", "Eta" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "User", "EtaPulledOn", "Eta" }; public string GetActionText() { diff --git a/Core/Resgrid.Model/Address.cs b/Core/Resgrid.Model/Address.cs index 63de7f5e..2d93b15c 100644 --- a/Core/Resgrid.Model/Address.cs +++ b/Core/Resgrid.Model/Address.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -46,12 +47,16 @@ public class Address : IEntity [NotMapped] public string IdName => "AddressId"; + [NotMapped] + public int IdType => 0; + public string FormatAddress() { return string.Format("{0} {1} {2} {3} {4}", Address1, City, State, PostalCode, Country); } [NotMapped] + [JsonIgnore] public object IdValue { get { return AddressId; } @@ -59,6 +64,6 @@ public object IdValue } [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/Affiliate.cs b/Core/Resgrid.Model/Affiliate.cs index adbff658..7356d616 100644 --- a/Core/Resgrid.Model/Affiliate.cs +++ b/Core/Resgrid.Model/Affiliate.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -60,7 +61,8 @@ public class Affiliate : IEntity public DateTime? RejectedOn { get; set; } [NotMapped] - public object IdValue + [JsonIgnore] + public object IdValue { get { return AffiliateId; } set { AffiliateId = (int)value; } @@ -73,6 +75,9 @@ public object IdValue public string IdName => "AffiliateId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/ApplicationUserExt.cs b/Core/Resgrid.Model/ApplicationUserExt.cs index d8541bd4..72034702 100644 --- a/Core/Resgrid.Model/ApplicationUserExt.cs +++ b/Core/Resgrid.Model/ApplicationUserExt.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; @@ -29,6 +30,7 @@ public class ApplicationUserExt: IEntity public DateTime? LastActivityDate { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return UserId; } @@ -42,6 +44,9 @@ public object IdValue public string IdName => "UserId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/AuditLog.cs b/Core/Resgrid.Model/AuditLog.cs index db5cfa86..6dae1b64 100644 --- a/Core/Resgrid.Model/AuditLog.cs +++ b/Core/Resgrid.Model/AuditLog.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -37,6 +38,7 @@ public class AuditLog : IEntity public DateTime? LoggedOn { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return AuditLogId; } @@ -50,6 +52,9 @@ public object IdValue public string IdName => "AuditLogId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/Automation.cs b/Core/Resgrid.Model/Automation.cs index 0e14399c..ff322a10 100644 --- a/Core/Resgrid.Model/Automation.cs +++ b/Core/Resgrid.Model/Automation.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -28,6 +29,7 @@ public class Automation : IEntity public DateTime CreatedOn { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return AutomationId; } @@ -41,6 +43,9 @@ public object IdValue public string IdName => "AutomationId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; } } diff --git a/Core/Resgrid.Model/CalendarItem.cs b/Core/Resgrid.Model/CalendarItem.cs index 4d7eb036..6308d3f0 100644 --- a/Core/Resgrid.Model/CalendarItem.cs +++ b/Core/Resgrid.Model/CalendarItem.cs @@ -4,6 +4,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using Newtonsoft.Json; using Resgrid.Framework; namespace Resgrid.Model @@ -96,6 +97,7 @@ public class CalendarItem: IEntity public virtual ICollection Attendees { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CalendarItemId; } @@ -110,7 +112,10 @@ public object IdValue public string IdName => "CalendarItemId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Attendees", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Attendees", "Department" }; public bool IsUserAttending(string userId) { diff --git a/Core/Resgrid.Model/CalendarItemAttendee.cs b/Core/Resgrid.Model/CalendarItemAttendee.cs index f4569e53..251e5cbc 100644 --- a/Core/Resgrid.Model/CalendarItemAttendee.cs +++ b/Core/Resgrid.Model/CalendarItemAttendee.cs @@ -4,6 +4,7 @@ using Resgrid.Model.Identity; using ProtoBuf; using System.Collections.Generic; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -40,6 +41,7 @@ public class CalendarItemAttendee: IEntity public string Note { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CalendarItemAttendeeId; } @@ -53,6 +55,9 @@ public object IdValue public string IdName => "CalendarItemAttendeeId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "CalendarItem", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "CalendarItem", "User" }; } } diff --git a/Core/Resgrid.Model/CalendarItemType.cs b/Core/Resgrid.Model/CalendarItemType.cs index d71f28aa..20ba96c1 100644 --- a/Core/Resgrid.Model/CalendarItemType.cs +++ b/Core/Resgrid.Model/CalendarItemType.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -24,6 +25,7 @@ public class CalendarItemType: IEntity public string Color { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CalendarItemTypeId; } @@ -37,6 +39,9 @@ public object IdValue public string IdName => "CalendarItemTypeId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; } } diff --git a/Core/Resgrid.Model/Call.cs b/Core/Resgrid.Model/Call.cs index a96db4de..f2ea955f 100644 --- a/Core/Resgrid.Model/Call.cs +++ b/Core/Resgrid.Model/Call.cs @@ -5,6 +5,7 @@ using Resgrid.Model.Identity; using System.Linq; using ProtoBuf; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -154,7 +155,14 @@ public class Call : IEntity [NotMapped] public int PreviousDispatchCount { get; set; } + public string CallFormData { get; set; } + + public DateTime? DispatchOn { get; set; } + + public bool? HasBeenDispatched { get; set; } + [NotMapped] + [JsonIgnore] public object IdValue { get { return CallId; } @@ -168,7 +176,10 @@ public object IdValue public string IdName => "CallId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "ReportingUser", "ClosedByUser", "Department", "Dispatches", "Attachments", "CallNotes", "GroupDispatches", "UnitDispatches", "RoleDispatches", "Protocols", "ShortenedAudioUrl", "ShortenedCallUrl", "CallPriority", "PreviousDispatchCount" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "ReportingUser", "ClosedByUser", "Department", "Dispatches", "Attachments", "CallNotes", "GroupDispatches", "UnitDispatches", "RoleDispatches", "Protocols", "ShortenedAudioUrl", "ShortenedCallUrl", "CallPriority", "PreviousDispatchCount" }; public string GetIdentifier() { diff --git a/Core/Resgrid.Model/CallAttachment.cs b/Core/Resgrid.Model/CallAttachment.cs index bbeba900..62ce277a 100644 --- a/Core/Resgrid.Model/CallAttachment.cs +++ b/Core/Resgrid.Model/CallAttachment.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; using Resgrid.Framework; @@ -56,6 +57,7 @@ public class CallAttachment: IEntity [NotMapped] + [JsonIgnore] public object IdValue { get { return CallAttachmentId; } @@ -69,6 +71,9 @@ public object IdValue public string IdName => "CallAttachmentId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Call" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Call" }; } } diff --git a/Core/Resgrid.Model/CallDispatch.cs b/Core/Resgrid.Model/CallDispatch.cs index 705f9f48..b9b37e03 100644 --- a/Core/Resgrid.Model/CallDispatch.cs +++ b/Core/Resgrid.Model/CallDispatch.cs @@ -4,6 +4,7 @@ using Resgrid.Model.Identity; using ProtoBuf; using System.Collections.Generic; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -46,6 +47,7 @@ public class CallDispatch: IEntity public virtual ActionLog ActionLog { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CallDispatchId; } @@ -60,6 +62,9 @@ public object IdValue public string IdName => "CallDispatchId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "ActionLog", "User", "Call" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "ActionLog", "User", "Call" }; } } diff --git a/Core/Resgrid.Model/CallDispatchGroup.cs b/Core/Resgrid.Model/CallDispatchGroup.cs index 443d0953..fe9e01d0 100644 --- a/Core/Resgrid.Model/CallDispatchGroup.cs +++ b/Core/Resgrid.Model/CallDispatchGroup.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -34,6 +35,7 @@ public class CallDispatchGroup : IEntity public DateTime? LastDispatchedOn { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CallDispatchGroupId; } @@ -47,6 +49,9 @@ public object IdValue public string IdName => "CallDispatchGroupId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Group", "Call" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Group", "Call" }; } } diff --git a/Core/Resgrid.Model/CallDispatchRole.cs b/Core/Resgrid.Model/CallDispatchRole.cs index 6229012b..0822419a 100644 --- a/Core/Resgrid.Model/CallDispatchRole.cs +++ b/Core/Resgrid.Model/CallDispatchRole.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -35,6 +36,7 @@ public class CallDispatchRole : IEntity public DateTime? LastDispatchedOn { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CallDispatchRoleId; } @@ -48,6 +50,9 @@ public object IdValue public string IdName => "CallDispatchRoleId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Role", "Call" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Role", "Call" }; } } diff --git a/Core/Resgrid.Model/CallDispatchUnit.cs b/Core/Resgrid.Model/CallDispatchUnit.cs index ddb59c6d..6e5bc4f1 100644 --- a/Core/Resgrid.Model/CallDispatchUnit.cs +++ b/Core/Resgrid.Model/CallDispatchUnit.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -36,6 +37,7 @@ public class CallDispatchUnit : IEntity public DateTime? LastDispatchedOn { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CallDispatchUnitId; } @@ -49,6 +51,9 @@ public object IdValue public string IdName => "CallDispatchUnitId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Unit", "Call" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Unit", "Call" }; } } diff --git a/Core/Resgrid.Model/CallLog.cs b/Core/Resgrid.Model/CallLog.cs index 789f5e29..8911d094 100644 --- a/Core/Resgrid.Model/CallLog.cs +++ b/Core/Resgrid.Model/CallLog.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -35,6 +36,7 @@ public class CallLog : IEntity public virtual IdentityUser LoggedBy { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CallLogId; } @@ -48,6 +50,9 @@ public object IdValue public string IdName => "CallLogId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Call", "Department", "LoggedBy" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Call", "Department", "LoggedBy" }; } } diff --git a/Core/Resgrid.Model/CallNote.cs b/Core/Resgrid.Model/CallNote.cs index 7bac95a3..98ba7195 100644 --- a/Core/Resgrid.Model/CallNote.cs +++ b/Core/Resgrid.Model/CallNote.cs @@ -5,6 +5,7 @@ using ProtoBuf; using Resgrid.Framework; using System.Collections.Generic; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -49,6 +50,7 @@ public class CallNote : IEntity public decimal? Longitude { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CallNoteId; } @@ -62,6 +64,9 @@ public object IdValue public string IdName => "CallNoteId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Call", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Call", "User" }; } } diff --git a/Core/Resgrid.Model/CallProtocol.cs b/Core/Resgrid.Model/CallProtocol.cs index 522f930a..f5902824 100644 --- a/Core/Resgrid.Model/CallProtocol.cs +++ b/Core/Resgrid.Model/CallProtocol.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -40,6 +41,7 @@ public class CallProtocol : IEntity public string Data { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CallProtocolId; } @@ -54,6 +56,9 @@ public object IdValue public string IdName => "CallProtocolId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Call", "Protocol" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Call", "Protocol" }; } } diff --git a/Core/Resgrid.Model/CallQuickTemplate.cs b/Core/Resgrid.Model/CallQuickTemplate.cs index eb4edbb3..80f94956 100644 --- a/Core/Resgrid.Model/CallQuickTemplate.cs +++ b/Core/Resgrid.Model/CallQuickTemplate.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -38,6 +39,7 @@ public class CallQuickTemplate : IEntity public DateTime CreatedOn { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CallQuickTemplateId; } @@ -51,6 +53,9 @@ public object IdValue public string IdName => "CallQuickTemplateId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "CreatedByUser" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "CreatedByUser" }; } } diff --git a/Core/Resgrid.Model/CallType.cs b/Core/Resgrid.Model/CallType.cs index 7b81feba..12c83ef5 100644 --- a/Core/Resgrid.Model/CallType.cs +++ b/Core/Resgrid.Model/CallType.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -24,6 +25,7 @@ public class CallType : IEntity public string Type { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CallTypeId; } @@ -37,6 +39,9 @@ public object IdValue public string IdName => "CallTypeId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; } } diff --git a/Core/Resgrid.Model/CallUnit.cs b/Core/Resgrid.Model/CallUnit.cs index 34aef46e..338ba2ab 100644 --- a/Core/Resgrid.Model/CallUnit.cs +++ b/Core/Resgrid.Model/CallUnit.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -43,6 +44,7 @@ public class CallUnit : IEntity public virtual UnitState UnitState { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CallUnitId; } @@ -56,6 +58,9 @@ public object IdValue public string IdName => "CallUnitId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Unit", "UnitState" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Unit", "UnitState" }; } } diff --git a/Core/Resgrid.Model/CommandDefinition.cs b/Core/Resgrid.Model/CommandDefinition.cs index 9cf8f67d..c2c6e1f1 100644 --- a/Core/Resgrid.Model/CommandDefinition.cs +++ b/Core/Resgrid.Model/CommandDefinition.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -32,6 +33,7 @@ public class CommandDefinition : IEntity public virtual ICollection Assignments { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CommandDefinitionId; } @@ -45,6 +47,9 @@ public object IdValue public string IdName => "CommandDefinitionId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "CallType", "Assignments" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "CallType", "Assignments" }; } } diff --git a/Core/Resgrid.Model/CommandDefinitionRole.cs b/Core/Resgrid.Model/CommandDefinitionRole.cs index c0592502..f10d7e55 100644 --- a/Core/Resgrid.Model/CommandDefinitionRole.cs +++ b/Core/Resgrid.Model/CommandDefinitionRole.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -41,6 +42,7 @@ public class CommandDefinitionRole : IEntity public virtual ICollection RequiredRoles { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CommandDefinitionRoleId; } @@ -54,6 +56,9 @@ public object IdValue public string IdName => "CommandDefinitionRoleId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Command", "RequiredUnitTypes", "RequiredCerts", "RequiredRoles" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Command", "RequiredUnitTypes", "RequiredCerts", "RequiredRoles" }; } } diff --git a/Core/Resgrid.Model/CommandDefinitionRoleCert.cs b/Core/Resgrid.Model/CommandDefinitionRoleCert.cs index 0b7765f5..2bd2ac59 100644 --- a/Core/Resgrid.Model/CommandDefinitionRoleCert.cs +++ b/Core/Resgrid.Model/CommandDefinitionRoleCert.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -25,6 +26,7 @@ public class CommandDefinitionRoleCert : IEntity public virtual DepartmentCertificationType Certification { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CommandDefinitionRoleCertId; } @@ -38,6 +40,9 @@ public object IdValue public string IdName => "CommandDefinitionRoleCertId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "CommandRole", "Certification" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "CommandRole", "Certification" }; } } diff --git a/Core/Resgrid.Model/CommandDefinitionRolePersonnelRole.cs b/Core/Resgrid.Model/CommandDefinitionRolePersonnelRole.cs index e177201e..0efe7559 100644 --- a/Core/Resgrid.Model/CommandDefinitionRolePersonnelRole.cs +++ b/Core/Resgrid.Model/CommandDefinitionRolePersonnelRole.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -25,6 +26,7 @@ public class CommandDefinitionRolePersonnelRole : IEntity public virtual PersonnelRole Role { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CommandDefinitionRolePersonnelRoleId; } @@ -38,6 +40,9 @@ public object IdValue public string IdName => "CommandDefinitionRolePersonnelRoleId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "CommandRole", "Role" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "CommandRole", "Role" }; } } diff --git a/Core/Resgrid.Model/CommandDefinitionRoleUnitType.cs b/Core/Resgrid.Model/CommandDefinitionRoleUnitType.cs index cd77c7bb..93d7a744 100644 --- a/Core/Resgrid.Model/CommandDefinitionRoleUnitType.cs +++ b/Core/Resgrid.Model/CommandDefinitionRoleUnitType.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -25,6 +26,7 @@ public class CommandDefinitionRoleUnitType : IEntity public virtual UnitType UnitType { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CommandDefinitionRoleUnitTypeId; } @@ -38,6 +40,9 @@ public object IdValue public string IdName => "CommandDefinitionRoleUnitTypeId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "CommandRole", "UnitType" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "CommandRole", "UnitType" }; } } diff --git a/Core/Resgrid.Model/CustomState.cs b/Core/Resgrid.Model/CustomState.cs index 64b535f8..fc2eb7f4 100644 --- a/Core/Resgrid.Model/CustomState.cs +++ b/Core/Resgrid.Model/CustomState.cs @@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -49,6 +50,7 @@ public List GetActiveDetails() } [NotMapped] + [JsonIgnore] public object IdValue { get { return CustomStateId; } @@ -62,6 +64,9 @@ public object IdValue public string IdName => "CustomStateId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Details" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Details" }; } } diff --git a/Core/Resgrid.Model/CustomStateDetail.cs b/Core/Resgrid.Model/CustomStateDetail.cs index 0b88b1dd..eeab7c89 100644 --- a/Core/Resgrid.Model/CustomStateDetail.cs +++ b/Core/Resgrid.Model/CustomStateDetail.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; using ProtoBuf.Meta; @@ -50,6 +51,7 @@ public class CustomStateDetail : IEntity public bool IsDeleted { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return CustomStateDetailId; } @@ -63,7 +65,10 @@ public object IdValue public string IdName => "CustomStateDetailId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "CustomState" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "CustomState" }; public string ButtonClassToColor() { diff --git a/Core/Resgrid.Model/Department.cs b/Core/Resgrid.Model/Department.cs index 6e7bbd2c..a35edc88 100644 --- a/Core/Resgrid.Model/Department.cs +++ b/Core/Resgrid.Model/Department.cs @@ -5,6 +5,7 @@ using Resgrid.Model.Identity; using System.Linq; using ProtoBuf; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -86,6 +87,7 @@ public Department() public string LinkCode { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentId; } @@ -99,7 +101,10 @@ public object IdValue public string IdName => "DepartmentId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "ManagingUser", "Address", "Members", "AdminUsers" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "ManagingUser", "Address", "Members", "AdminUsers" }; [ProtoMember(18)] [NotMapped] @@ -126,5 +131,16 @@ public bool IsUserAnAdmin(string userId) return false; } + + public bool IsUserInDepartment(string userId) + { + if (userId == ManagingUserId) + return true; + + if (Members != null && Members.Any()) + return Members.Any(x => x.UserId == userId); + + return false; + } } } diff --git a/Core/Resgrid.Model/DepartmentCallEmail.cs b/Core/Resgrid.Model/DepartmentCallEmail.cs index bd405413..f4becd28 100644 --- a/Core/Resgrid.Model/DepartmentCallEmail.cs +++ b/Core/Resgrid.Model/DepartmentCallEmail.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -44,6 +45,7 @@ public class DepartmentCallEmail : IEntity public string ErrorMessage { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentCallEmailId; } @@ -57,6 +59,9 @@ public object IdValue public string IdName => "DepartmentCallEmailId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; } } diff --git a/Core/Resgrid.Model/DepartmentCallPriority.cs b/Core/Resgrid.Model/DepartmentCallPriority.cs index fdb2f356..ac1af6d5 100644 --- a/Core/Resgrid.Model/DepartmentCallPriority.cs +++ b/Core/Resgrid.Model/DepartmentCallPriority.cs @@ -1,4 +1,5 @@ -using ProtoBuf; +using Newtonsoft.Json; +using ProtoBuf; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -59,6 +60,7 @@ public class DepartmentCallPriority : IEntity public bool IsSystemPriority { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentCallPriorityId; } @@ -73,6 +75,9 @@ public object IdValue public string IdName => "DepartmentCallPriorityId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "IsSystemPriority" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "IsSystemPriority" }; } } diff --git a/Core/Resgrid.Model/DepartmentCallPruning.cs b/Core/Resgrid.Model/DepartmentCallPruning.cs index 9af596e4..4711bf16 100644 --- a/Core/Resgrid.Model/DepartmentCallPruning.cs +++ b/Core/Resgrid.Model/DepartmentCallPruning.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -28,6 +29,7 @@ public class DepartmentCallPruning: IEntity public int? EmailImportCallPruneInterval { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentCallPruningId; } @@ -41,6 +43,9 @@ public object IdValue public string IdName => "DepartmentCallPruningId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; } } diff --git a/Core/Resgrid.Model/DepartmentCertificationType.cs b/Core/Resgrid.Model/DepartmentCertificationType.cs index b2fb688e..1c2bbde9 100644 --- a/Core/Resgrid.Model/DepartmentCertificationType.cs +++ b/Core/Resgrid.Model/DepartmentCertificationType.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -23,6 +24,7 @@ public class DepartmentCertificationType : IEntity public string Type { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentCertificationTypeId; } @@ -36,6 +38,9 @@ public object IdValue public string IdName => "DepartmentCertificationTypeId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; } } diff --git a/Core/Resgrid.Model/DepartmentFile.cs b/Core/Resgrid.Model/DepartmentFile.cs index d94253aa..1ffeb8cf 100644 --- a/Core/Resgrid.Model/DepartmentFile.cs +++ b/Core/Resgrid.Model/DepartmentFile.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -36,6 +37,7 @@ public class DepartmentFile : IEntity public byte[] Data { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentFileId; } @@ -49,6 +51,9 @@ public object IdValue public string IdName => "DepartmentFileId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; } } diff --git a/Core/Resgrid.Model/DepartmentGroup.cs b/Core/Resgrid.Model/DepartmentGroup.cs index 1929a9db..afc7a0fd 100644 --- a/Core/Resgrid.Model/DepartmentGroup.cs +++ b/Core/Resgrid.Model/DepartmentGroup.cs @@ -79,7 +79,7 @@ public class DepartmentGroup : IEntity public string FaxNumber { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return DepartmentGroupId; } set { DepartmentGroupId = (int)value; } @@ -92,7 +92,10 @@ public object IdValue public string IdName => "DepartmentGroupId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Parent", "Members", "Children", "Address" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Parent", "Members", "Children", "Address" }; public bool IsUserGroupAdmin(string userId) { diff --git a/Core/Resgrid.Model/DepartmentGroupMember.cs b/Core/Resgrid.Model/DepartmentGroupMember.cs index e2298cbe..3a1e8597 100644 --- a/Core/Resgrid.Model/DepartmentGroupMember.cs +++ b/Core/Resgrid.Model/DepartmentGroupMember.cs @@ -32,7 +32,7 @@ public class DepartmentGroupMember : IEntity public bool? IsAdmin { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return DepartmentGroupMemberId; } set { DepartmentGroupMemberId = (int)value; } @@ -45,6 +45,9 @@ public object IdValue public string IdName => "DepartmentGroupMemberId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "DepartmentGroup", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "DepartmentGroup", "User" }; } } diff --git a/Core/Resgrid.Model/DepartmentLink.cs b/Core/Resgrid.Model/DepartmentLink.cs index edd67026..c3ac7d2c 100644 --- a/Core/Resgrid.Model/DepartmentLink.cs +++ b/Core/Resgrid.Model/DepartmentLink.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -50,6 +51,7 @@ public class DepartmentLink: IEntity public DateTime? LinkAccepted { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentLinkId; } @@ -63,6 +65,9 @@ public object IdValue public string IdName => "DepartmentLinkId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "LinkedDepartment" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "LinkedDepartment" }; } } diff --git a/Core/Resgrid.Model/DepartmentMember.cs b/Core/Resgrid.Model/DepartmentMember.cs index cc1045b0..c4ef9414 100644 --- a/Core/Resgrid.Model/DepartmentMember.cs +++ b/Core/Resgrid.Model/DepartmentMember.cs @@ -3,6 +3,7 @@ using Resgrid.Model.Identity; using ProtoBuf; using System.Collections.Generic; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -66,9 +67,13 @@ public class DepartmentMember : IEntity public string IdName => "DepartmentMemberId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "User", "Rank" }; + public int IdType => 0; [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "User", "Rank" }; + + [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentMemberId; } diff --git a/Core/Resgrid.Model/DepartmentNotification.cs b/Core/Resgrid.Model/DepartmentNotification.cs index eb2723f7..2727cf70 100644 --- a/Core/Resgrid.Model/DepartmentNotification.cs +++ b/Core/Resgrid.Model/DepartmentNotification.cs @@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using Newtonsoft.Json; using Resgrid.Framework; using Resgrid.Model.Events; @@ -39,6 +40,7 @@ public class DepartmentNotification : IEntity public string Data { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentNotificationId; } @@ -52,7 +54,10 @@ public object IdValue public string IdName => "DepartmentNotificationId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; public void AddUserToNotify(string userId) { diff --git a/Core/Resgrid.Model/DepartmentProfile.cs b/Core/Resgrid.Model/DepartmentProfile.cs index a1355854..9ae7d55a 100644 --- a/Core/Resgrid.Model/DepartmentProfile.cs +++ b/Core/Resgrid.Model/DepartmentProfile.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -125,6 +126,7 @@ public class DepartmentProfile : IEntity public string PhoneNumber { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentProfileId; } @@ -138,6 +140,9 @@ public object IdValue public string IdName => "DepartmentProfileId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Address" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Address" }; } } diff --git a/Core/Resgrid.Model/DepartmentProfileArticle.cs b/Core/Resgrid.Model/DepartmentProfileArticle.cs index 668d788f..c0d35c7c 100644 --- a/Core/Resgrid.Model/DepartmentProfileArticle.cs +++ b/Core/Resgrid.Model/DepartmentProfileArticle.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -45,6 +46,7 @@ public class DepartmentProfileArticle : IEntity public bool Deleted { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentProfileArticleId; } @@ -58,6 +60,9 @@ public object IdValue public string IdName => "DepartmentProfileArticleId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Profile", "CreatedByUser" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Profile", "CreatedByUser" }; } } diff --git a/Core/Resgrid.Model/DepartmentProfileInvite.cs b/Core/Resgrid.Model/DepartmentProfileInvite.cs index bc6c6db4..63398804 100644 --- a/Core/Resgrid.Model/DepartmentProfileInvite.cs +++ b/Core/Resgrid.Model/DepartmentProfileInvite.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -24,6 +25,7 @@ public class DepartmentProfileInvite : IEntity public DateTime? UsedOn { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentProfileInviteId; } @@ -37,6 +39,9 @@ public object IdValue public string IdName => "DepartmentProfileInviteId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Profile" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Profile" }; } } diff --git a/Core/Resgrid.Model/DepartmentProfileMessage.cs b/Core/Resgrid.Model/DepartmentProfileMessage.cs index 9058a3be..8eb85968 100644 --- a/Core/Resgrid.Model/DepartmentProfileMessage.cs +++ b/Core/Resgrid.Model/DepartmentProfileMessage.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -65,6 +66,7 @@ public class DepartmentProfileMessage : IEntity public bool Deleted { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentProfileMessageId; } @@ -78,6 +80,9 @@ public object IdValue public string IdName => "DepartmentProfileMessageId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Profile", "ReplyToMessage", "Call" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Profile", "ReplyToMessage", "Call" }; } } diff --git a/Core/Resgrid.Model/DepartmentProfileUser.cs b/Core/Resgrid.Model/DepartmentProfileUser.cs index 74ac0898..062b3115 100644 --- a/Core/Resgrid.Model/DepartmentProfileUser.cs +++ b/Core/Resgrid.Model/DepartmentProfileUser.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -22,6 +23,7 @@ public class DepartmentProfileUser : IEntity public string Email { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentProfileUserId; } @@ -35,6 +37,9 @@ public object IdValue public string IdName => "DepartmentProfileUserId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/DepartmentProfileUserFollow.cs b/Core/Resgrid.Model/DepartmentProfileUserFollow.cs index d6dd416d..d93a138d 100644 --- a/Core/Resgrid.Model/DepartmentProfileUserFollow.cs +++ b/Core/Resgrid.Model/DepartmentProfileUserFollow.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -26,6 +27,7 @@ public class DepartmentProfileUserFollow : IEntity public virtual DepartmentProfile DepartmentProfile { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentProfileUserFollowId; } @@ -39,6 +41,9 @@ public object IdValue public string IdName => "DepartmentProfileUserFollowId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "DepartmentProfileUser", "DepartmentProfile" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "DepartmentProfileUser", "DepartmentProfile" }; } } diff --git a/Core/Resgrid.Model/DepartmentSetting.cs b/Core/Resgrid.Model/DepartmentSetting.cs index 8bd16451..e4cad8e4 100644 --- a/Core/Resgrid.Model/DepartmentSetting.cs +++ b/Core/Resgrid.Model/DepartmentSetting.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -32,6 +33,7 @@ public class DepartmentSetting : IEntity public string Setting { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DepartmentSettingId; } @@ -45,6 +47,9 @@ public object IdValue public string IdName => "DepartmentSettingId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; } } diff --git a/Core/Resgrid.Model/DepartmentVoice.cs b/Core/Resgrid.Model/DepartmentVoice.cs new file mode 100644 index 00000000..80390b68 --- /dev/null +++ b/Core/Resgrid.Model/DepartmentVoice.cs @@ -0,0 +1,41 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace Resgrid.Model +{ + public class DepartmentVoice : IEntity + { + public string DepartmentVoiceId { get; set; } + + public int DepartmentId { get; set; } + + public virtual Department Department { get; set; } + + public int StartConferenceNumber { get; set; } + + public virtual List Channels { get; set; } + + [NotMapped] + [JsonIgnore] + public object IdValue + { + get { return DepartmentVoiceId; } + set { DepartmentVoiceId = (string)value; } + } + + [NotMapped] + public string TableName => "DepartmentVoices"; + + [NotMapped] + public string IdName => "DepartmentVoiceId"; + + [NotMapped] + public int IdType => 1; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Channels" }; + } +} diff --git a/Core/Resgrid.Model/DepartmentVoiceChannel.cs b/Core/Resgrid.Model/DepartmentVoiceChannel.cs new file mode 100644 index 00000000..f15b04d9 --- /dev/null +++ b/Core/Resgrid.Model/DepartmentVoiceChannel.cs @@ -0,0 +1,49 @@ +using Newtonsoft.Json; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Resgrid.Model +{ + public class DepartmentVoiceChannel : IEntity + { + public string DepartmentVoiceChannelId { get; set; } + + public string DepartmentVoiceId { get; set; } + + public virtual DepartmentVoice DepartmentVoice { get; set; } + + public int DepartmentId { get; set; } + + public virtual Department Department { get; set; } + + public string Name { get; set; } + + public string SystemConferenceId { get; set; } + + public string SystemCallflowId { get; set; } + + public int ConferenceNumber { get; set; } + + public bool IsDefault { get; set; } + + [NotMapped] + [JsonIgnore] + public object IdValue + { + get { return DepartmentVoiceChannelId; } + set { DepartmentVoiceChannelId = (string)value; } + } + + [NotMapped] + public string TableName => "DepartmentVoiceChannels"; + + [NotMapped] + public string IdName => "DepartmentVoiceChannelId"; + + [NotMapped] + public int IdType => 1; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "DepartmentVoice", "Department" }; + } +} diff --git a/Core/Resgrid.Model/DepartmentVoiceUser.cs b/Core/Resgrid.Model/DepartmentVoiceUser.cs new file mode 100644 index 00000000..5238bb38 --- /dev/null +++ b/Core/Resgrid.Model/DepartmentVoiceUser.cs @@ -0,0 +1,43 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace Resgrid.Model +{ + public class DepartmentVoiceUser : IEntity + { + public string DepartmentVoiceUserId { get; set; } + + public string DepartmentVoiceId { get; set; } + + public virtual DepartmentVoice DepartmentVoice { get; set; } + + public string UserId { get; set; } + + public string SystemUserId { get; set; } + + public string SystemDeviceId { get; set; } + + [NotMapped] + [JsonIgnore] + public object IdValue + { + get { return DepartmentVoiceUserId; } + set { DepartmentVoiceUserId = (string)value; } + } + + [NotMapped] + public string TableName => "DepartmentVoiceUsers"; + + [NotMapped] + public string IdName => "DepartmentVoiceUserId"; + + [NotMapped] + public int IdType => 1; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "DepartmentVoice" }; + } +} diff --git a/Core/Resgrid.Model/DispatchProtocol.cs b/Core/Resgrid.Model/DispatchProtocol.cs index db8e40df..f0b842cf 100644 --- a/Core/Resgrid.Model/DispatchProtocol.cs +++ b/Core/Resgrid.Model/DispatchProtocol.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -27,12 +28,12 @@ public class DispatchProtocol : IEntity public string Code { get; set; } public bool IsDisabled { get; set; } - + [MaxLength(500)] public string Description { get; set; } public string ProtocolText { get; set; } - + [Required] public DateTime CreatedOn { get; set; } @@ -56,6 +57,7 @@ public class DispatchProtocol : IEntity public ProtocolStates State { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DispatchProtocolId; } @@ -69,6 +71,9 @@ public object IdValue public string IdName => "DispatchProtocolId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Triggers", "Attachments", "Questions", "State" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Triggers", "Attachments", "Questions", "State" }; } } diff --git a/Core/Resgrid.Model/DispatchProtocolAttachment.cs b/Core/Resgrid.Model/DispatchProtocolAttachment.cs index 98c5c1e0..93251557 100644 --- a/Core/Resgrid.Model/DispatchProtocolAttachment.cs +++ b/Core/Resgrid.Model/DispatchProtocolAttachment.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -25,6 +26,7 @@ public class DispatchProtocolAttachment : IEntity public byte[] Data { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DispatchProtocolAttachmentId; } @@ -38,6 +40,9 @@ public object IdValue public string IdName => "DispatchProtocolAttachmentId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Protocol" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Protocol" }; } } diff --git a/Core/Resgrid.Model/DispatchProtocolQuestion.cs b/Core/Resgrid.Model/DispatchProtocolQuestion.cs index 379ea9d2..c84cf4af 100644 --- a/Core/Resgrid.Model/DispatchProtocolQuestion.cs +++ b/Core/Resgrid.Model/DispatchProtocolQuestion.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -23,6 +24,7 @@ public class DispatchProtocolQuestion : IEntity public virtual ICollection Answers { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DispatchProtocolQuestionId; } @@ -36,6 +38,9 @@ public object IdValue public string IdName => "DispatchProtocolQuestionId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Protocol", "Answers" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Protocol", "Answers" }; } } diff --git a/Core/Resgrid.Model/DispatchProtocolQuestionAnswer.cs b/Core/Resgrid.Model/DispatchProtocolQuestionAnswer.cs index 5879c44d..742c25f4 100644 --- a/Core/Resgrid.Model/DispatchProtocolQuestionAnswer.cs +++ b/Core/Resgrid.Model/DispatchProtocolQuestionAnswer.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -23,6 +24,7 @@ public class DispatchProtocolQuestionAnswer : IEntity public int Weight { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DispatchProtocolQuestionAnswerId; } @@ -36,6 +38,9 @@ public object IdValue public string IdName => "DispatchProtocolQuestionAnswerId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Question" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Question" }; } } diff --git a/Core/Resgrid.Model/DispatchProtocolTrigger.cs b/Core/Resgrid.Model/DispatchProtocolTrigger.cs index d8eb0265..e40bf2b3 100644 --- a/Core/Resgrid.Model/DispatchProtocolTrigger.cs +++ b/Core/Resgrid.Model/DispatchProtocolTrigger.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -32,6 +33,7 @@ public class DispatchProtocolTrigger : IEntity public string Geofence { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DispatchProtocolTriggerId; } @@ -45,6 +47,9 @@ public object IdValue public string IdName => "DispatchProtocolTriggerId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Protocol" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Protocol" }; } } diff --git a/Core/Resgrid.Model/DistributionList.cs b/Core/Resgrid.Model/DistributionList.cs index ad872757..e69a21c5 100644 --- a/Core/Resgrid.Model/DistributionList.cs +++ b/Core/Resgrid.Model/DistributionList.cs @@ -1,4 +1,5 @@ -using ProtoBuf; +using Newtonsoft.Json; +using ProtoBuf; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -60,13 +61,14 @@ public class DistributionList : IEntity public string ErrorMessage { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DistributionListId; } set { DistributionListId = (int)value; } } - + [NotMapped] public string TableName => "DistributionLists"; @@ -74,6 +76,9 @@ public object IdValue public string IdName => "DistributionListId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Members" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Members" }; } } diff --git a/Core/Resgrid.Model/DistributionListMember.cs b/Core/Resgrid.Model/DistributionListMember.cs index 9b380639..98a7c393 100644 --- a/Core/Resgrid.Model/DistributionListMember.cs +++ b/Core/Resgrid.Model/DistributionListMember.cs @@ -3,12 +3,13 @@ using Resgrid.Model.Identity; using ProtoBuf; using System.Collections.Generic; +using Newtonsoft.Json; namespace Resgrid.Model { [ProtoContract] [Table("DistributionListMembers")] - public class DistributionListMember: IEntity + public class DistributionListMember : IEntity { [Key] [Required] @@ -31,6 +32,7 @@ public class DistributionListMember: IEntity public virtual IdentityUser User { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DistributionListMemberId; } @@ -44,6 +46,9 @@ public object IdValue public string IdName => "DistributionListMemberId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "DistributionList", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "DistributionList", "User" }; } } diff --git a/Core/Resgrid.Model/Document.cs b/Core/Resgrid.Model/Document.cs index 77682d62..68f9f470 100644 --- a/Core/Resgrid.Model/Document.cs +++ b/Core/Resgrid.Model/Document.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -46,6 +47,7 @@ public class Document : IEntity public DateTime? RemoveOn { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return DocumentId; } @@ -59,7 +61,10 @@ public object IdValue public string IdName => "DocumentId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "User" }; public string GetIconType() { diff --git a/Core/Resgrid.Model/EventingTypes.cs b/Core/Resgrid.Model/EventingTypes.cs index 8a292a3a..d158b1fb 100644 --- a/Core/Resgrid.Model/EventingTypes.cs +++ b/Core/Resgrid.Model/EventingTypes.cs @@ -2,9 +2,11 @@ { public enum EventingTypes { - PersonnelStatusUpdated = 1, + PersonnelStatusUpdated = 1, UnitStatusUpdated = 2, CallsUpdated = 3, - PersonnelStaffingUpdated = 4 + PersonnelStaffingUpdated = 4, + CallAdded = 5, + CallClosed = 6 } -} \ No newline at end of file +} diff --git a/Core/Resgrid.Model/Events/AuditEvent.cs b/Core/Resgrid.Model/Events/AuditEvent.cs index a887b6d0..19c24061 100644 --- a/Core/Resgrid.Model/Events/AuditEvent.cs +++ b/Core/Resgrid.Model/Events/AuditEvent.cs @@ -6,6 +6,9 @@ namespace Resgrid.Model.Events [ProtoContract] public class AuditEvent { + [ProtoMember(7)] + public string EventId { get; set; } + [ProtoMember(1)] public int DepartmentId { get; set; } @@ -14,10 +17,19 @@ public class AuditEvent [ProtoMember(3)] public AuditLogTypes Type { get; set; } - public Object Before { get; set; } - public Object After { get; set; } + + [ProtoMember(5)] + public string Before { get; set; } + + [ProtoMember(6)] + public string After { get; set; } [ProtoMember(4)] public string Difference { get; set; } + + public AuditEvent() + { + EventId = Guid.NewGuid().ToString(); + } } } diff --git a/Core/Resgrid.Model/Events/CallClosedEvent.cs b/Core/Resgrid.Model/Events/CallClosedEvent.cs new file mode 100644 index 00000000..1363e4cf --- /dev/null +++ b/Core/Resgrid.Model/Events/CallClosedEvent.cs @@ -0,0 +1,8 @@ +namespace Resgrid.Model.Events +{ + public class CallClosedEvent + { + public int DepartmentId { get; set; } + public Call Call { get; set; } + } +} diff --git a/Core/Resgrid.Model/Events/CallUpdatedEvent.cs b/Core/Resgrid.Model/Events/CallUpdatedEvent.cs new file mode 100644 index 00000000..3798b783 --- /dev/null +++ b/Core/Resgrid.Model/Events/CallUpdatedEvent.cs @@ -0,0 +1,8 @@ +namespace Resgrid.Model.Events +{ + public class CallUpdatedEvent + { + public int DepartmentId { get; set; } + public Call Call { get; set; } + } +} diff --git a/Core/Resgrid.Model/Facades/Stripe/IStripeSubscriptionServiceFacade.cs b/Core/Resgrid.Model/Facades/Stripe/IStripeSubscriptionServiceFacade.cs index ba999f86..109173a2 100644 --- a/Core/Resgrid.Model/Facades/Stripe/IStripeSubscriptionServiceFacade.cs +++ b/Core/Resgrid.Model/Facades/Stripe/IStripeSubscriptionServiceFacade.cs @@ -1,14 +1,17 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Stripe; namespace Resgrid.Model.Facades.Stripe { public interface IStripeSubscriptionServiceFacade { - Subscription Get(string customerId, string subscriptionId); - Subscription Create(string customerId, string planId, SubscriptionCreateOptions createOptions = null); - Subscription Update(string customerId, string subscriptionId, SubscriptionUpdateOptions updateOptions); + Task Get(string customerId, string subscriptionId); + Task Create(string customerId, string planId, SubscriptionCreateOptions createOptions = null); + Task Update(string customerId, string subscriptionId, SubscriptionUpdateOptions updateOptions); Subscription Cancel(string customerId, string subscriptionId, bool cancelAtPeriodEnd = false); - IEnumerable List(string customerId, ListOptions listOptions = null); + Task> List(string customerId, ListOptions listOptions = null); + Task GetCurrentActiveSub(string customerId); + Task AddAddonToSubscription(string customerId, string addonId); } } diff --git a/Core/Resgrid.Model/File.cs b/Core/Resgrid.Model/File.cs index b571ce5f..6e13be65 100644 --- a/Core/Resgrid.Model/File.cs +++ b/Core/Resgrid.Model/File.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -35,6 +36,7 @@ public class File : IEntity public DateTime Timestamp { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return FileId; } @@ -45,10 +47,13 @@ public object IdValue public string TableName => "Files"; [NotMapped] - public string IdName => "DepartmentId"; + public string IdName => "FileId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Message" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Message" }; public string GetIconType() { diff --git a/Core/Resgrid.Model/Form.cs b/Core/Resgrid.Model/Form.cs new file mode 100644 index 00000000..1981d362 --- /dev/null +++ b/Core/Resgrid.Model/Form.cs @@ -0,0 +1,60 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Resgrid.Model +{ + public class Form : IEntity + { + [Required] + public string FormId { get; set; } + + [Required] + public int DepartmentId { get; set; } + + public virtual Department Department { get; set; } + + [Required] + public string Name { get; set; } + + public int Type { get; set; } + + public bool IsActive { get; set; } + + public bool IsDeleted { get; set; } + + public string Data { get; set; } + + public DateTime CreatedOn { get; set; } + + public string CreatedBy { get; set; } + + public DateTime? UpdatedOn { get; set; } + + public string UpdatedBy { get; set; } + + public virtual ICollection Automations { get; set; } + + [NotMapped] + [JsonIgnore] + public object IdValue + { + get { return FormId; } + set { FormId = (string)value; } + } + + [NotMapped] + public string TableName => "Forms"; + + [NotMapped] + public string IdName => "FormId"; + + [NotMapped] + public int IdType => 1; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Automations" }; + } +} diff --git a/Core/Resgrid.Model/FormAutomation.cs b/Core/Resgrid.Model/FormAutomation.cs new file mode 100644 index 00000000..a68ad80f --- /dev/null +++ b/Core/Resgrid.Model/FormAutomation.cs @@ -0,0 +1,49 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Resgrid.Model +{ + public class FormAutomation : IEntity + { + [Required] + public string FormAutomationId { get; set; } + + [Required] + public string FormId { get; set; } + + public virtual Form Form { get; set; } + + [Required] + public string TriggerField { get; set; } + + public string TriggerValue { get; set; } + + public int OperationType { get; set; } + + public string OperationValue { get; set; } + + + [NotMapped] + [JsonIgnore] + public object IdValue + { + get { return FormAutomationId; } + set { FormAutomationId = (string)value; } + } + + [NotMapped] + public string TableName => "FormAutomations"; + + [NotMapped] + public string IdName => "FormAutomationId"; + + [NotMapped] + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Message" }; + } +} diff --git a/Core/Resgrid.Model/FormAutomationData.cs b/Core/Resgrid.Model/FormAutomationData.cs new file mode 100644 index 00000000..785830aa --- /dev/null +++ b/Core/Resgrid.Model/FormAutomationData.cs @@ -0,0 +1,9 @@ +namespace Resgrid.Model +{ + public class FormAutomationData + { + public int Type { get; set; } + public string Option1 { get; set; } + public string Option2 { get; set; } + } +} diff --git a/Core/Resgrid.Model/FormTypes.cs b/Core/Resgrid.Model/FormTypes.cs new file mode 100644 index 00000000..0213aa53 --- /dev/null +++ b/Core/Resgrid.Model/FormTypes.cs @@ -0,0 +1,18 @@ +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; + +namespace Resgrid.Model +{ + /// + /// The types of a form + /// + public enum FormTypes + { + /// + /// Form is for New Call creation + /// + [Display(Name = "New Call Form")] + [Description("New Call Form")] + NewCallForm = 0, + } +} diff --git a/Core/Resgrid.Model/Helpers/TimeConverterHelper.cs b/Core/Resgrid.Model/Helpers/TimeConverterHelper.cs index 53b0610c..93ae0cad 100644 --- a/Core/Resgrid.Model/Helpers/TimeConverterHelper.cs +++ b/Core/Resgrid.Model/Helpers/TimeConverterHelper.cs @@ -105,7 +105,7 @@ public static TimeSpan GetOffsetForDepartment(Department department) if (!String.IsNullOrEmpty(department.TimeZone)) timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(DateTimeHelpers.ConvertTimeZoneString(department.TimeZone)); else - timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); // Default to Pacific as it's better then UTC + timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(DateTimeHelpers.WindowsToIana("Pacific Standard Time")); // Default to Pacific as it's better then UTC timeSpan = timeZoneInfo.BaseUtcOffset; var currentDateTime = DateTime.UtcNow.TimeConverter(department); diff --git a/Core/Resgrid.Model/IEntity.cs b/Core/Resgrid.Model/IEntity.cs index 4520152f..50f7fc79 100644 --- a/Core/Resgrid.Model/IEntity.cs +++ b/Core/Resgrid.Model/IEntity.cs @@ -10,6 +10,8 @@ public interface IEntity string IdName { get; } + int IdType { get; } + IEnumerable IgnoredProperties { get; } } } diff --git a/Core/Resgrid.Model/Identity/IdentityRole.cs b/Core/Resgrid.Model/Identity/IdentityRole.cs index 2765dab6..e8066d2d 100644 --- a/Core/Resgrid.Model/Identity/IdentityRole.cs +++ b/Core/Resgrid.Model/Identity/IdentityRole.cs @@ -1,4 +1,5 @@ -using ProtoBuf; +using Newtonsoft.Json; +using ProtoBuf; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; @@ -28,6 +29,7 @@ public IdentityRole(string roleName) : this() } [NotMapped] + [JsonIgnore] public object IdValue { get { return Id; } @@ -41,7 +43,10 @@ public object IdValue public string IdName => "Id"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } diff --git a/Core/Resgrid.Model/Identity/IdentityRoleClaim.cs b/Core/Resgrid.Model/Identity/IdentityRoleClaim.cs index cf3ee45b..018bbff0 100644 --- a/Core/Resgrid.Model/Identity/IdentityRoleClaim.cs +++ b/Core/Resgrid.Model/Identity/IdentityRoleClaim.cs @@ -1,4 +1,5 @@ -using ProtoBuf; +using Newtonsoft.Json; +using ProtoBuf; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; @@ -13,8 +14,9 @@ public IdentityRoleClaim() Id = Guid.NewGuid().ToString(); } - + [NotMapped] + [JsonIgnore] public object IdValue { get { return Id; } @@ -27,8 +29,11 @@ public object IdValue [NotMapped] public string IdName => "Id"; + [NotMapped] + public int IdType => 0; + [System.ComponentModel.DataAnnotations.Schema.NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } diff --git a/Core/Resgrid.Model/Identity/IdentityUser.cs b/Core/Resgrid.Model/Identity/IdentityUser.cs index f8a38fa1..57799401 100644 --- a/Core/Resgrid.Model/Identity/IdentityUser.cs +++ b/Core/Resgrid.Model/Identity/IdentityUser.cs @@ -1,4 +1,5 @@ -using ProtoBuf; +using Newtonsoft.Json; +using ProtoBuf; using System; using System.Collections.Generic; @@ -156,6 +157,7 @@ public string UserId public DateTime CreateDate { get; set; } [System.ComponentModel.DataAnnotations.Schema.NotMapped] + [JsonIgnore] public object IdValue { get { return Id; } @@ -169,7 +171,10 @@ public object IdValue public string IdName => "Id"; [System.ComponentModel.DataAnnotations.Schema.NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [System.ComponentModel.DataAnnotations.Schema.NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } diff --git a/Core/Resgrid.Model/Identity/IdentityUserClaim.cs b/Core/Resgrid.Model/Identity/IdentityUserClaim.cs index 9d7a418f..38d101fd 100644 --- a/Core/Resgrid.Model/Identity/IdentityUserClaim.cs +++ b/Core/Resgrid.Model/Identity/IdentityUserClaim.cs @@ -1,4 +1,5 @@ -using ProtoBuf; +using Newtonsoft.Json; +using ProtoBuf; using System; using System.Collections.Generic; @@ -7,6 +8,7 @@ namespace Resgrid.Model.Identity public class IdentityUserClaim : IdentityUserClaim, IEntity { [System.ComponentModel.DataAnnotations.Schema.NotMapped] + [JsonIgnore] public object IdValue { get { return Id; } @@ -20,7 +22,10 @@ public object IdValue public string IdName => "Id"; [System.ComponentModel.DataAnnotations.Schema.NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [System.ComponentModel.DataAnnotations.Schema.NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } diff --git a/Core/Resgrid.Model/Identity/IdentityUserLoginInfo.cs b/Core/Resgrid.Model/Identity/IdentityUserLoginInfo.cs index 6db57117..4b9f344f 100644 --- a/Core/Resgrid.Model/Identity/IdentityUserLoginInfo.cs +++ b/Core/Resgrid.Model/Identity/IdentityUserLoginInfo.cs @@ -1,10 +1,11 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.AspNetCore.Identity; +using Newtonsoft.Json; namespace Resgrid.Model.Identity { - public class IdentityUserLoginInfo: IEntity + public class IdentityUserLoginInfo : IEntity { public string UserId { get; set; } @@ -37,6 +38,7 @@ public class IdentityUserLoginInfo: IEntity public string ProviderDisplayName { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return UserId; } @@ -50,6 +52,9 @@ public object IdValue public string IdName => "UserId"; [System.ComponentModel.DataAnnotations.Schema.NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [System.ComponentModel.DataAnnotations.Schema.NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/Identity/IdentityUserRole.cs b/Core/Resgrid.Model/Identity/IdentityUserRole.cs index 5e889033..de4e1dbb 100644 --- a/Core/Resgrid.Model/Identity/IdentityUserRole.cs +++ b/Core/Resgrid.Model/Identity/IdentityUserRole.cs @@ -1,4 +1,5 @@ -using ProtoBuf; +using Newtonsoft.Json; +using ProtoBuf; using System; using System.Collections.Generic; @@ -7,6 +8,7 @@ namespace Resgrid.Model.Identity public class IdentityUserRole : IdentityUserRole, IEntity { [System.ComponentModel.DataAnnotations.Schema.NotMapped] + [JsonIgnore] public object IdValue { get { return Id; } @@ -20,7 +22,10 @@ public object IdValue public string IdName => "Id"; [System.ComponentModel.DataAnnotations.Schema.NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [System.ComponentModel.DataAnnotations.Schema.NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } [ProtoContract] diff --git a/Core/Resgrid.Model/InboundMessageEvent.cs b/Core/Resgrid.Model/InboundMessageEvent.cs index a7b612a0..1ac2b15b 100644 --- a/Core/Resgrid.Model/InboundMessageEvent.cs +++ b/Core/Resgrid.Model/InboundMessageEvent.cs @@ -1,48 +1,53 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Resgrid.Model { - [Table("InboundMessageEvents")] - public class InboundMessageEvent : IEntity - { - [Key] - [Required] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int InboundMessageEventId { get; set; } + [Table("InboundMessageEvents")] + public class InboundMessageEvent : IEntity + { + [Key] + [Required] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int InboundMessageEventId { get; set; } - [Required] - public int MessageType { get; set; } + [Required] + public int MessageType { get; set; } - [Required] - public string CustomerId { get; set; } + [Required] + public string CustomerId { get; set; } - [Required] - public DateTime RecievedOn { get; set; } + [Required] + public DateTime RecievedOn { get; set; } - [Required] - public string Data { get; set; } + [Required] + public string Data { get; set; } - public string Type { get; set; } + public string Type { get; set; } - public bool? Processed { get; set; } + public bool? Processed { get; set; } - [NotMapped] - public object IdValue - { - get { return InboundMessageEventId; } - set { InboundMessageEventId = (int)value; } - } + [NotMapped] + [JsonIgnore] + public object IdValue + { + get { return InboundMessageEventId; } + set { InboundMessageEventId = (int)value; } + } - [NotMapped] - public string TableName => "InboundMessageEvents"; + [NotMapped] + public string TableName => "InboundMessageEvents"; - [NotMapped] - public string IdName => "InboundMessageEventId"; + [NotMapped] + public string IdName => "InboundMessageEventId"; + + [NotMapped] + public int IdType => 0; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; - } + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; + } } diff --git a/Core/Resgrid.Model/Incident.cs b/Core/Resgrid.Model/Incident.cs index 819417df..fff24f2c 100644 --- a/Core/Resgrid.Model/Incident.cs +++ b/Core/Resgrid.Model/Incident.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -42,13 +43,14 @@ public class Incident : IEntity public virtual ICollection Logs { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return IncidentId; } set { IncidentId = (int)value; } } - + [NotMapped] public string TableName => "Incidents"; @@ -56,6 +58,9 @@ public object IdValue public string IdName => "IncidentId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Call", "Definition", "Logs" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Call", "Definition", "Logs" }; } } diff --git a/Core/Resgrid.Model/IncidentLog.cs b/Core/Resgrid.Model/IncidentLog.cs index 21f9bf79..ae75c91c 100644 --- a/Core/Resgrid.Model/IncidentLog.cs +++ b/Core/Resgrid.Model/IncidentLog.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -37,6 +38,7 @@ public class IncidentLog : IEntity public string Description { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return IncidentLogId; } @@ -50,6 +52,9 @@ public object IdValue public string IdName => "IncidentLogId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Incident", "Unit" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Incident", "Unit" }; } } diff --git a/Core/Resgrid.Model/Inventory.cs b/Core/Resgrid.Model/Inventory.cs index 3459b953..3dbd191e 100644 --- a/Core/Resgrid.Model/Inventory.cs +++ b/Core/Resgrid.Model/Inventory.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -49,6 +50,7 @@ public class Inventory : IEntity public virtual Unit Unit { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return InventoryId; } @@ -62,6 +64,9 @@ public object IdValue public string IdName => "InventoryId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Group", "AddedBy", "Unit", "Type" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Group", "AddedBy", "Unit", "Type" }; } } diff --git a/Core/Resgrid.Model/InventoryType.cs b/Core/Resgrid.Model/InventoryType.cs index f0d3ecee..c399d01e 100644 --- a/Core/Resgrid.Model/InventoryType.cs +++ b/Core/Resgrid.Model/InventoryType.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -31,6 +32,7 @@ public class InventoryType : IEntity public virtual ICollection Inventories { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return InventoryTypeId; } @@ -44,6 +46,9 @@ public object IdValue public string IdName => "InventoryTypeId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Inventories" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Inventories" }; } } diff --git a/Core/Resgrid.Model/Invite.cs b/Core/Resgrid.Model/Invite.cs index 58009788..7826f7c2 100644 --- a/Core/Resgrid.Model/Invite.cs +++ b/Core/Resgrid.Model/Invite.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -40,6 +41,7 @@ public class Invite : IEntity public virtual Department Department { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return InviteId; } @@ -53,6 +55,9 @@ public object IdValue public string IdName => "InviteId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "SendingUser", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "SendingUser", "Department" }; } } diff --git a/Core/Resgrid.Model/Job.cs b/Core/Resgrid.Model/Job.cs index a6c55db6..f105b80c 100644 --- a/Core/Resgrid.Model/Job.cs +++ b/Core/Resgrid.Model/Job.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -28,6 +29,7 @@ public class Job : IEntity public DateTime? LastResetTimestamp { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return JobId; } @@ -41,6 +43,9 @@ public object IdValue public string IdName => "JobId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/Log.cs b/Core/Resgrid.Model/Log.cs index b1242aa8..15f30fa6 100644 --- a/Core/Resgrid.Model/Log.cs +++ b/Core/Resgrid.Model/Log.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -92,6 +93,7 @@ public class Log : IEntity public virtual ICollection Users { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return LogId; } @@ -105,6 +107,9 @@ public object IdValue public string IdName => "LogId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "StationGroup", "InvestigatedBy", "LoggedBy", "Officer", "Call", "Units", "Users" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "StationGroup", "InvestigatedBy", "LoggedBy", "Officer", "Call", "Units", "Users" }; } } diff --git a/Core/Resgrid.Model/LogAttachment.cs b/Core/Resgrid.Model/LogAttachment.cs index 70654b2e..b99ec0e5 100644 --- a/Core/Resgrid.Model/LogAttachment.cs +++ b/Core/Resgrid.Model/LogAttachment.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -41,6 +42,7 @@ public class LogAttachment : IEntity public int Size { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return LogAttachmentId; } @@ -54,6 +56,9 @@ public object IdValue public string IdName => "LogAttachmentId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Log" }; - } + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Log" }; + } } diff --git a/Core/Resgrid.Model/LogEntry.cs b/Core/Resgrid.Model/LogEntry.cs index 2593cdda..1719c264 100644 --- a/Core/Resgrid.Model/LogEntry.cs +++ b/Core/Resgrid.Model/LogEntry.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -19,6 +20,7 @@ public class LogEntry : IEntity public string logger { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return id; } @@ -32,6 +34,9 @@ public object IdValue public string IdName => "id"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/LogUnit.cs b/Core/Resgrid.Model/LogUnit.cs index daebbabc..16822a54 100644 --- a/Core/Resgrid.Model/LogUnit.cs +++ b/Core/Resgrid.Model/LogUnit.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -36,6 +37,7 @@ public class LogUnit : IEntity public DateTime? InQuarters { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return LogUnitId; } @@ -49,6 +51,9 @@ public object IdValue public string IdName => "LogUnitId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Log", "Unit" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Log", "Unit" }; } } diff --git a/Core/Resgrid.Model/LogUser.cs b/Core/Resgrid.Model/LogUser.cs index e0b71969..8c68ffbc 100644 --- a/Core/Resgrid.Model/LogUser.cs +++ b/Core/Resgrid.Model/LogUser.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -18,7 +19,7 @@ public class LogUser : IEntity public int LogId { get; set; } public virtual Log Log { get; set; } - + [ForeignKey("Unit"), DatabaseGenerated(DatabaseGeneratedOption.None)] public int? UnitId { get; set; } @@ -30,6 +31,7 @@ public class LogUser : IEntity [NotMapped] + [JsonIgnore] public object IdValue { get { return LogUserId; } @@ -43,6 +45,9 @@ public object IdValue public string IdName => "LogUserId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Log", "Unit", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Log", "Unit", "User" }; } } diff --git a/Core/Resgrid.Model/Message.cs b/Core/Resgrid.Model/Message.cs index bd590661..9a818d25 100644 --- a/Core/Resgrid.Model/Message.cs +++ b/Core/Resgrid.Model/Message.cs @@ -5,6 +5,7 @@ using Resgrid.Model.Identity; using System.Linq; using ProtoBuf; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -60,7 +61,7 @@ public class Message : IEntity [ProtoMember(12)] public int Type { get; set; } - + [ProtoMember(13)] public DateTime? ExpireOn { get; set; } @@ -68,6 +69,7 @@ public class Message : IEntity public virtual ICollection MessageRecipients { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return MessageId; } @@ -81,7 +83,10 @@ public object IdValue public string IdName => "MessageId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "SendingUser", "ReceivingUser", "MessageRecipients" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "SendingUser", "ReceivingUser", "MessageRecipients" }; public List GetRecipients() { diff --git a/Core/Resgrid.Model/MessageRecipient.cs b/Core/Resgrid.Model/MessageRecipient.cs index 8c3d2991..ee12d944 100644 --- a/Core/Resgrid.Model/MessageRecipient.cs +++ b/Core/Resgrid.Model/MessageRecipient.cs @@ -5,6 +5,7 @@ using ProtoBuf; using Resgrid.Framework; using System.Collections.Generic; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -54,6 +55,7 @@ public class MessageRecipient : IEntity public decimal? Longitude { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return MessageRecipientId; } @@ -67,6 +69,9 @@ public object IdValue public string IdName => "MessageRecipientId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Message", "User"}; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Message", "User" }; } } diff --git a/Core/Resgrid.Model/MobileCarriers.cs b/Core/Resgrid.Model/MobileCarriers.cs index 606fdc06..9497b1d8 100644 --- a/Core/Resgrid.Model/MobileCarriers.cs +++ b/Core/Resgrid.Model/MobileCarriers.cs @@ -138,6 +138,21 @@ public enum MobileCarriers [Description("Spark")] Spark = 42, // SMS Direct Send + + [Description("Mint")] + Mint = 43, // SMS Direct Send + + [Description("Chatr")] + Chatr = 44, // SMS Direct Send + + [Description("Eastlink")] + Eastlink = 45, // SMS Direct Send + + [Description("Freedom Mobile")] + FreedomMobile = 46, // SMS Direct Send + + [Description("FSM Telecom")] + FSMTC = 47, // SMS Direct Send } public static class Carriers @@ -185,7 +200,12 @@ public static class Carriers {MobileCarriers.EE, "Direct"}, {MobileCarriers.MTSMobility, "{0}@text.mtsmobility.com"}, {MobileCarriers.Fido, "Direct"}, - {MobileCarriers.Spark, "Direct"} + {MobileCarriers.Spark, "Direct"}, + {MobileCarriers.Mint, "{0}@tmomail.net"}, + {MobileCarriers.Chatr, "Direct"}, + {MobileCarriers.Eastlink, "Direct"}, + {MobileCarriers.FreedomMobile, "Direct"}, + {MobileCarriers.FSMTC, "Direct"}, }; public static Dictionary> CarriersNumberLength = new Dictionary>() @@ -242,7 +262,12 @@ public static class Carriers MobileCarriers.BellMobility, MobileCarriers.SaskTel, MobileCarriers.Spark, - MobileCarriers.Koodo + MobileCarriers.Koodo, + MobileCarriers.Mint, + MobileCarriers.Chatr, + MobileCarriers.Eastlink, + MobileCarriers.FreedomMobile, + MobileCarriers.FSMTC }; public static HashSet OnPremSmsGatewayCarriers = new HashSet() diff --git a/Core/Resgrid.Model/Note.cs b/Core/Resgrid.Model/Note.cs index 837c4dae..4e6741b0 100644 --- a/Core/Resgrid.Model/Note.cs +++ b/Core/Resgrid.Model/Note.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -6,7 +7,7 @@ namespace Resgrid.Model { [Table("Notes")] - public class Note: IEntity + public class Note : IEntity { [Key] [Required] @@ -41,6 +42,7 @@ public class Note: IEntity public DateTime AddedOn { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return NoteId; } @@ -54,6 +56,9 @@ public object IdValue public string IdName => "NoteId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; } } diff --git a/Core/Resgrid.Model/NotificationAlert.cs b/Core/Resgrid.Model/NotificationAlert.cs index cd15226a..bb404506 100644 --- a/Core/Resgrid.Model/NotificationAlert.cs +++ b/Core/Resgrid.Model/NotificationAlert.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -6,7 +7,7 @@ namespace Resgrid.Model { [Table("NotificationAlerts")] - public class NotificationAlert: IEntity + public class NotificationAlert : IEntity { [Key] [Required] @@ -37,13 +38,14 @@ public class NotificationAlert: IEntity public string ManualNote { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return NotificationAlertId; } set { NotificationAlertId = (int)value; } } - + [NotMapped] public string TableName => "NotificationAlerts"; @@ -51,6 +53,9 @@ public object IdValue public string IdName => "NotificationAlertId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Group" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Group" }; } } diff --git a/Core/Resgrid.Model/Payment.cs b/Core/Resgrid.Model/Payment.cs index 63319178..ee90c1d4 100644 --- a/Core/Resgrid.Model/Payment.cs +++ b/Core/Resgrid.Model/Payment.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; using Resgrid.Framework; using Resgrid.Model.Identity; @@ -95,13 +96,14 @@ public class Payment : IEntity public string SubscriptionId { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PaymentId; } set { PaymentId = (int)value; } } - + [NotMapped] public string TableName => "Payments"; @@ -109,13 +111,16 @@ public object IdValue public string IdName => "PaymentId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Plan", "UpgradedPayment" , "PurchasingUser" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Plan", "UpgradedPayment", "PurchasingUser" }; public DateTime GetEndDate() { if (Plan != null) { - switch ((PlanFrequency) Plan.Frequency) + switch ((PlanFrequency)Plan.Frequency) { case PlanFrequency.Never: return DateTime.MaxValue; diff --git a/Core/Resgrid.Model/PaymentAddon.cs b/Core/Resgrid.Model/PaymentAddon.cs new file mode 100644 index 00000000..8923747b --- /dev/null +++ b/Core/Resgrid.Model/PaymentAddon.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; +using ProtoBuf; +using Resgrid.Framework; +using Resgrid.Model.Identity; + +namespace Resgrid.Model +{ + [Table("PaymentAddons")] + [ProtoContract] + public class PaymentAddon : IEntity + { + [Key] + [Required] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + [ProtoMember(1)] + public string PaymentAddonId { get; set; } + + [Required] + [ProtoMember(2)] + public int DepartmentId { get; set; } + + [ProtoMember(3)] + public virtual Department Department { get; set; } + + [Required] + [ProtoMember(4)] + public string PlanAddonId { get; set; } + + [ForeignKey("PlanAddonId")] + [ProtoMember(5)] + public virtual PlanAddon PlanAddon { get; set; } + + [ProtoMember(11)] + public string Description { get; set; } + + [ProtoMember(12)] + [Required] + public DateTime PurchaseOn { get; set; } + + [ProtoMember(13)] + [Required] + public DateTime EffectiveOn { get; set; } + + [ProtoMember(14)] + public DateTime EndingOn { get; set; } + + [ProtoMember(15)] + public double Amount { get; set; } + + [ProtoMember(17)] + public string TransactionId { get; set; } + + [ProtoMember(19)] + public bool Cancelled { get; set; } + + [ProtoMember(20)] + public DateTime? CancelledOn { get; set; } + + [ProtoMember(21)] + public string CancelledData { get; set; } + + [ProtoMember(22)] + public string Data { get; set; } + + [ProtoMember(23)] + public string SubscriptionId { get; set; } + + [NotMapped] + [JsonIgnore] + public object IdValue + { + get { return PaymentAddonId; } + set { PaymentAddonId = (string)value; } + } + + + [NotMapped] + public string TableName => "PaymentAddons"; + + [NotMapped] + public string IdName => "PaymentAddonId"; + + [NotMapped] + public int IdType => 1; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "PlanAddon" }; + } +} diff --git a/Core/Resgrid.Model/PaymentProviderEvent.cs b/Core/Resgrid.Model/PaymentProviderEvent.cs index 60478e11..38b26853 100644 --- a/Core/Resgrid.Model/PaymentProviderEvent.cs +++ b/Core/Resgrid.Model/PaymentProviderEvent.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -6,7 +7,7 @@ namespace Resgrid.Model { [Table("PaymentProviderEvents")] - public class PaymentProviderEvent: IEntity + public class PaymentProviderEvent : IEntity { [Key] [Required] @@ -30,6 +31,7 @@ public class PaymentProviderEvent: IEntity public bool? Processed { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PaymentProviderEventId; } @@ -43,6 +45,9 @@ public object IdValue public string IdName => "PaymentProviderEventId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/Permission.cs b/Core/Resgrid.Model/Permission.cs index 99754000..5da6f2ef 100644 --- a/Core/Resgrid.Model/Permission.cs +++ b/Core/Resgrid.Model/Permission.cs @@ -2,13 +2,14 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model { [Table("Permissions")] [ProtoContract] - public class Permission: IEntity + public class Permission : IEntity { [Key] [Required] @@ -41,6 +42,7 @@ public class Permission: IEntity public bool LockToGroup { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PermissionId; } @@ -54,6 +56,9 @@ public object IdValue public string IdName => "PermissionId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; } } diff --git a/Core/Resgrid.Model/PersonnelCertification.cs b/Core/Resgrid.Model/PersonnelCertification.cs index 2d623225..01b1fe69 100644 --- a/Core/Resgrid.Model/PersonnelCertification.cs +++ b/Core/Resgrid.Model/PersonnelCertification.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -47,6 +48,7 @@ public class PersonnelCertification : IEntity public byte[] Data { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PersonnelCertificationId; } @@ -60,6 +62,9 @@ public object IdValue public string IdName => "PersonnelCertificationId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "User" }; } } diff --git a/Core/Resgrid.Model/PersonnelRole.cs b/Core/Resgrid.Model/PersonnelRole.cs index ac19d2db..33e29e1c 100644 --- a/Core/Resgrid.Model/PersonnelRole.cs +++ b/Core/Resgrid.Model/PersonnelRole.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -30,6 +31,7 @@ public class PersonnelRole : IEntity public virtual ICollection Users { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PersonnelRoleId; } @@ -43,7 +45,10 @@ public object IdValue public string IdName => "PersonnelRoleId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Users" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Users" }; public bool IsUserInRole(string userId) { diff --git a/Core/Resgrid.Model/PersonnelRoleUser.cs b/Core/Resgrid.Model/PersonnelRoleUser.cs index bee5916d..4ad9e8e2 100644 --- a/Core/Resgrid.Model/PersonnelRoleUser.cs +++ b/Core/Resgrid.Model/PersonnelRoleUser.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -28,13 +29,14 @@ public class PersonnelRoleUser : IEntity public IdentityUser User { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PersonnelRoleUserId; } set { PersonnelRoleUserId = (int)value; } } - + [NotMapped] public string TableName => "PersonnelRoleUsers"; @@ -42,6 +44,9 @@ public object IdValue public string IdName => "PersonnelRoleUserId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Role", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Role", "User" }; } } diff --git a/Core/Resgrid.Model/Plan.cs b/Core/Resgrid.Model/Plan.cs index 9364c6ba..b3a4c024 100644 --- a/Core/Resgrid.Model/Plan.cs +++ b/Core/Resgrid.Model/Plan.cs @@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -33,7 +34,7 @@ public class Plan : IEntity public string GetLimitForType(PlanLimitTypes limitType) { - var limt = PlanLimits.FirstOrDefault(x => x.LimitType == (int) limitType); + var limt = PlanLimits.FirstOrDefault(x => x.LimitType == (int)limitType); if (limt != null) return limt.LimitValue.ToString(); @@ -46,15 +47,21 @@ public int GetLimitForTypeAsInt(PlanLimitTypes limitType) if (Config.SystemBehaviorConfig.RedirectHomeToLogin) return int.MaxValue; - var limt = PlanLimits.FirstOrDefault(x => x.LimitType == (int)limitType); + if (PlanLimits != null && PlanLimits.Any()) + { + var limt = PlanLimits.FirstOrDefault(x => x.LimitType == (int)limitType); - if (limt != null) - return limt.LimitValue; - else - return int.MaxValue; + if (limt != null) + return limt.LimitValue; + else + return int.MaxValue; + } + + return int.MaxValue; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PlanId; } @@ -68,6 +75,9 @@ public object IdValue public string IdName => "PlanId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Role", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Role", "User" }; } } diff --git a/Core/Resgrid.Model/PlanAddon.cs b/Core/Resgrid.Model/PlanAddon.cs new file mode 100644 index 00000000..0e86d9b0 --- /dev/null +++ b/Core/Resgrid.Model/PlanAddon.cs @@ -0,0 +1,41 @@ +using Newtonsoft.Json; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Resgrid.Model +{ + public class PlanAddon : IEntity + { + public string PlanAddonId { get; set; } + + public int PlanId { get; set; } + + public virtual Plan Plan { get; set; } + + public int AddonType { get; set; } + + public double Cost { get; set; } + + public string ExternalId { get; set; } + + [NotMapped] + [JsonIgnore] + public object IdValue + { + get { return PlanAddonId; } + set { PlanAddonId = (string)value; } + } + + [NotMapped] + public string TableName => "PlanAddons"; + + [NotMapped] + public string IdName => "PlanAddonId"; + + [NotMapped] + public int IdType => 1; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Plan" }; + } +} diff --git a/Core/Resgrid.Model/PlanAddonTypes.cs b/Core/Resgrid.Model/PlanAddonTypes.cs new file mode 100644 index 00000000..871f751e --- /dev/null +++ b/Core/Resgrid.Model/PlanAddonTypes.cs @@ -0,0 +1,7 @@ +namespace Resgrid.Model +{ + public enum PlanAddonTypes + { + PTT = 1 + } +} diff --git a/Core/Resgrid.Model/PlanLimit.cs b/Core/Resgrid.Model/PlanLimit.cs index 0fc84a8a..f08ae07e 100644 --- a/Core/Resgrid.Model/PlanLimit.cs +++ b/Core/Resgrid.Model/PlanLimit.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -28,6 +29,7 @@ public class PlanLimit : IEntity public int LimitValue { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PlanLimitId; } @@ -41,6 +43,9 @@ public object IdValue public string IdName => "PlanLimitId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Plan" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Plan" }; } } diff --git a/Core/Resgrid.Model/PlanLimitTypes.cs b/Core/Resgrid.Model/PlanLimitTypes.cs index fdeb3b4c..aba4bfa8 100644 --- a/Core/Resgrid.Model/PlanLimitTypes.cs +++ b/Core/Resgrid.Model/PlanLimitTypes.cs @@ -1,10 +1,11 @@ -namespace Resgrid.Model + namespace Resgrid.Model { public enum PlanLimitTypes { Personnel = 1, Groups = 2, Units = 3, - Roles = 4 + Roles = 4, + InvoicesPerMonth = 5 } -} \ No newline at end of file +} diff --git a/Core/Resgrid.Model/Poi.cs b/Core/Resgrid.Model/Poi.cs index 29befe48..c0a1f529 100644 --- a/Core/Resgrid.Model/Poi.cs +++ b/Core/Resgrid.Model/Poi.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -25,13 +26,14 @@ public class Poi : IEntity public string Note { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PoiId; } set { PoiId = (int)value; } } - + [NotMapped] public string TableName => "Pois"; @@ -39,6 +41,9 @@ public object IdValue public string IdName => "PoiId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Type" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Type" }; } } diff --git a/Core/Resgrid.Model/PoiType.cs b/Core/Resgrid.Model/PoiType.cs index daa8779e..566920b2 100644 --- a/Core/Resgrid.Model/PoiType.cs +++ b/Core/Resgrid.Model/PoiType.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -38,6 +39,7 @@ public class PoiType : IEntity public int Count { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PoiTypeId; } @@ -51,6 +53,9 @@ public object IdValue public string IdName => "PoiTypeId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Pois", "Count" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Pois", "Count" }; } } diff --git a/Core/Resgrid.Model/ProcessLog.cs b/Core/Resgrid.Model/ProcessLog.cs index 4af3e048..06a51a82 100644 --- a/Core/Resgrid.Model/ProcessLog.cs +++ b/Core/Resgrid.Model/ProcessLog.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -29,13 +30,14 @@ public class ProcessLog : IEntity public DateTime Timestamp { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return ProcessLogId; } set { ProcessLogId = (int)value; } } - + [NotMapped] public string TableName => "ProcessLogs"; @@ -43,6 +45,9 @@ public object IdValue public string IdName => "ProcessLogId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/Providers/IAuditEventProvider.cs b/Core/Resgrid.Model/Providers/IAuditEventProvider.cs new file mode 100644 index 00000000..1f2d80b8 --- /dev/null +++ b/Core/Resgrid.Model/Providers/IAuditEventProvider.cs @@ -0,0 +1,10 @@ +using Resgrid.Model.Events; +using System.Threading.Tasks; + +namespace Resgrid.Model.Providers +{ + public interface IAuditEventProvider + { + Task EnqueueAuditEventAsync(AuditEvent auditEvent); + } +} diff --git a/Core/Resgrid.Model/Providers/IEmailMarketingProvider.cs b/Core/Resgrid.Model/Providers/IEmailMarketingProvider.cs index 61c21e57..b16697de 100644 --- a/Core/Resgrid.Model/Providers/IEmailMarketingProvider.cs +++ b/Core/Resgrid.Model/Providers/IEmailMarketingProvider.cs @@ -1,10 +1,12 @@ -namespace Resgrid.Model.Providers +using System.Threading.Tasks; + +namespace Resgrid.Model.Providers { public interface IEmailMarketingProvider { - void Unsubscribe(string emailAddress); - void SubscribeUserToAdminList(string firstName, string lastName, string emailAddress); - void SubscribeUserToUsersList(string firstName, string lastName, string emailAddress); - void IncreaseStatusPageMetric(string metric); + Task Unsubscribe(string emailAddress); + Task SubscribeUserToAdminList(string firstName, string lastName, string emailAddress); + Task SubscribeUserToUsersList(string firstName, string lastName, string emailAddress); + Task IncreaseStatusPageMetric(string metric); } } diff --git a/Core/Resgrid.Model/Providers/IGeoLocationProvider.cs b/Core/Resgrid.Model/Providers/IGeoLocationProvider.cs index adcaf4e9..e919e011 100644 --- a/Core/Resgrid.Model/Providers/IGeoLocationProvider.cs +++ b/Core/Resgrid.Model/Providers/IGeoLocationProvider.cs @@ -9,10 +9,10 @@ public interface IGeoLocationProvider Task GetLatLonFromAddress(string address); Task GetRoute(string start, string end); Task GetRoute(double startLat, double startLon, double endLat, double endLon); - Coordinates GetCoordinatesFromW3W(string words); - string GetW3WFromCoordinates(Coordinates coordinates); - Coordinates GetLatLonFromAddressLocationIQ(string address); - string GetAddressFromLatLonLocationIQ(string lat, string lon); + Task GetCoordinatesFromW3W(string words); + Task GetW3WFromCoordinates(Coordinates coordinates); + Task GetLatLonFromAddressLocationIQ(string address); + Task GetAddressFromLatLonLocationIQ(string lat, string lon); Task GetCoordinatesFromW3WAsync(string words); } } diff --git a/Core/Resgrid.Model/Providers/INumberProvider.cs b/Core/Resgrid.Model/Providers/INumberProvider.cs index 85f36913..5b8ee190 100644 --- a/Core/Resgrid.Model/Providers/INumberProvider.cs +++ b/Core/Resgrid.Model/Providers/INumberProvider.cs @@ -1,11 +1,12 @@ using System.Collections.Generic; +using System.Threading.Tasks; namespace Resgrid.Model.Providers { public interface INumberProvider { - List GetAvailableNumbers(string country, string areaCode); - bool ProvisionNumber(string country, string number); + Task> GetAvailableNumbers(string country, string areaCode); + Task ProvisionNumber(string country, string number); string ConvertCountryToCode(string country); } -} \ No newline at end of file +} diff --git a/Core/Resgrid.Model/Providers/IPrinterProvider.cs b/Core/Resgrid.Model/Providers/IPrinterProvider.cs index c602e059..e3228433 100644 --- a/Core/Resgrid.Model/Providers/IPrinterProvider.cs +++ b/Core/Resgrid.Model/Providers/IPrinterProvider.cs @@ -1,14 +1,15 @@ using Resgrid.Model.Providers.Models.PrintNode; using System.Collections.Generic; +using System.Threading.Tasks; namespace Resgrid.Model.Providers { public interface IPrinterProvider { - Whoami Whoami(string apiKey); - List GetComputers(string apiKey); - List GetPrinters(string apiKey); - List GetPrintJobs(string apiKey); - bool SubmitPrintJob(string apiKey, int printerId, string title, string url); + Task Whoami(string apiKey); + Task> GetComputers(string apiKey); + Task> GetPrinters(string apiKey); + Task> GetPrintJobs(string apiKey); + Task SubmitPrintJob(string apiKey, int printerId, string title, string url); } } diff --git a/Core/Resgrid.Model/Providers/IRabbitInboundEventProvider.cs b/Core/Resgrid.Model/Providers/IRabbitInboundEventProvider.cs index bf82783c..2dfd6bf4 100644 --- a/Core/Resgrid.Model/Providers/IRabbitInboundEventProvider.cs +++ b/Core/Resgrid.Model/Providers/IRabbitInboundEventProvider.cs @@ -5,6 +5,8 @@ namespace Resgrid.Model.Providers { public interface IRabbitInboundEventProvider { - void RegisterForEvents(Func personnelStatusChanged, Func unitStatusChanged, Func callStatusChanged, Func personnelStaffingChanged); + void RegisterForEvents(Func personnelStatusChanged, Func unitStatusChanged, + Func callStatusChanged, Func personnelStaffingChanged, + Func callAdded, Func callClosed); } } diff --git a/Core/Resgrid.Model/Providers/IRabbitOutboundQueueProvider.cs b/Core/Resgrid.Model/Providers/IRabbitOutboundQueueProvider.cs index fe46b191..cf40ef60 100644 --- a/Core/Resgrid.Model/Providers/IRabbitOutboundQueueProvider.cs +++ b/Core/Resgrid.Model/Providers/IRabbitOutboundQueueProvider.cs @@ -1,4 +1,5 @@ -using Resgrid.Model.Queue; +using Resgrid.Model.Events; +using Resgrid.Model.Queue; namespace Resgrid.Model.Providers { @@ -10,6 +11,7 @@ public interface IRabbitOutboundQueueProvider bool EnqueueNotification(NotificationItem notificationQueue); bool EnqueueShiftNotification(ShiftQueueItem shiftQueueItem); bool EnqueueCqrsEvent(CqrsEvent cqrsEvent); + bool EnqueueAuditEvent(AuditEvent auditEvent); bool VerifyAndCreateClients(); } } diff --git a/Core/Resgrid.Model/Providers/ITextMessageProvider.cs b/Core/Resgrid.Model/Providers/ITextMessageProvider.cs index df77dd83..2bccbcd1 100644 --- a/Core/Resgrid.Model/Providers/ITextMessageProvider.cs +++ b/Core/Resgrid.Model/Providers/ITextMessageProvider.cs @@ -1,7 +1,9 @@ -namespace Resgrid.Model.Providers +using System.Threading.Tasks; + +namespace Resgrid.Model.Providers { public interface ITextMessageProvider { - void SendTextMessage(string number, string message, string departmentNumber, MobileCarriers carrier, int departmentId, bool forceGateway = false, bool isCall = false); + Task SendTextMessage(string number, string message, string departmentNumber, MobileCarriers carrier, int departmentId, bool forceGateway = false, bool isCall = false); } } diff --git a/Core/Resgrid.Model/Providers/IUnitNotificationProvider.cs b/Core/Resgrid.Model/Providers/IUnitNotificationProvider.cs index 75725ed8..4ac93796 100644 --- a/Core/Resgrid.Model/Providers/IUnitNotificationProvider.cs +++ b/Core/Resgrid.Model/Providers/IUnitNotificationProvider.cs @@ -10,7 +10,7 @@ public interface IUnitNotificationProvider Task UnRegisterPush(PushUri pushUri); Task SendAllNotifications(string title, string subTitle, int unitId, string eventCode, string type, bool enableCustomSounds, int count, string color); Task> GetRegistrationsByDeviceId(string deviceId); - Task> GetRegistrationsByUserId(string userId); + Task> GetRegistrationsByUnitId(int unitId); Task> GetRegistrationsByUUID(string uuid); Task UnRegisterPushByUserDeviceId(PushUri pushUri); Task UnRegisterPushByUUID(string uuid); diff --git a/Core/Resgrid.Model/Providers/IVoipProvider.cs b/Core/Resgrid.Model/Providers/IVoipProvider.cs new file mode 100644 index 00000000..3c9a2938 --- /dev/null +++ b/Core/Resgrid.Model/Providers/IVoipProvider.cs @@ -0,0 +1,16 @@ +using System; +using System.Threading.Tasks; + +namespace Resgrid.Model.Providers +{ + public interface IVoipProvider + { + Task CreateUserIfNotExistsAsync(string voipSystemUserId, string emailAddress, UserProfile profile, int departmentId); + + Task CreateDeviceForUserIfNotExistsAsync(string voipSystemUserId, string voipSystemDeviceId, UserProfile profile, int departmentId); + + Task> CreateConferenceIfNotExistsAsync(string voipSystemConferenceId, int departmentId, string name, string pin, int number); + + Task CreateOpenViduSessionAndGetToken(string sessionId); + } +} diff --git a/Core/Resgrid.Model/PushLog.cs b/Core/Resgrid.Model/PushLog.cs index 09bce959..93ad2185 100644 --- a/Core/Resgrid.Model/PushLog.cs +++ b/Core/Resgrid.Model/PushLog.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -6,7 +7,7 @@ namespace Resgrid.Model { [Table("PushLogs")] - public class PushLog: IEntity + public class PushLog : IEntity { [Key] [Required] @@ -37,6 +38,7 @@ public class PushLog: IEntity public DateTime Timestamp { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PushLogId; } @@ -50,6 +52,9 @@ public object IdValue public string IdName => "PushLogId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/PushTemplate.cs b/Core/Resgrid.Model/PushTemplate.cs index 4a986bf8..32672ef0 100644 --- a/Core/Resgrid.Model/PushTemplate.cs +++ b/Core/Resgrid.Model/PushTemplate.cs @@ -1,37 +1,42 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Resgrid.Model { - [Table("PushTemplates")] - public class PushTemplate : IEntity - { - [Key] - [Required] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int PushTemplateId { get; set; } + [Table("PushTemplates")] + public class PushTemplate : IEntity + { + [Key] + [Required] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int PushTemplateId { get; set; } - [Required] - public int PlatformType { get; set; } + [Required] + public int PlatformType { get; set; } - [MaxLength(1000)] - public string Template { get; set; } + [MaxLength(1000)] + public string Template { get; set; } - [NotMapped] - public object IdValue - { - get { return PushTemplateId; } - set { PushTemplateId = (int)value; } - } + [NotMapped] + [JsonIgnore] + public object IdValue + { + get { return PushTemplateId; } + set { PushTemplateId = (int)value; } + } - [NotMapped] - public string TableName => "PushTemplates"; + [NotMapped] + public string TableName => "PushTemplates"; - [NotMapped] - public string IdName => "PushTemplateId"; + [NotMapped] + public string IdName => "PushTemplateId"; + + [NotMapped] + public int IdType => 0; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; - } + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; + } } diff --git a/Core/Resgrid.Model/PushUri.cs b/Core/Resgrid.Model/PushUri.cs index a7ec2b65..ef89bf5f 100644 --- a/Core/Resgrid.Model/PushUri.cs +++ b/Core/Resgrid.Model/PushUri.cs @@ -4,6 +4,7 @@ using Resgrid.Model.Identity; using ProtoBuf; using System.Collections.Generic; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -69,6 +70,7 @@ public string PushLocation public DateTime CreatedOn { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return PushUriId; } @@ -82,6 +84,9 @@ public object IdValue public string IdName => "PushUriId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "User", "ChannelUri", "Uuid", "DepartmentId" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "User", "ChannelUri", "Uuid", "DepartmentId" }; } } diff --git a/Core/Resgrid.Model/QueueItem.cs b/Core/Resgrid.Model/QueueItem.cs index 3663933b..aa031cf4 100644 --- a/Core/Resgrid.Model/QueueItem.cs +++ b/Core/Resgrid.Model/QueueItem.cs @@ -2,13 +2,14 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model { [ProtoContract] [Table("QueueItems")] - public class QueueItem: IEntity + public class QueueItem : IEntity { [Key] [Required] @@ -38,6 +39,7 @@ public class QueueItem: IEntity public int DequeueCount { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return QueueItemId; } @@ -51,6 +53,9 @@ public object IdValue public string IdName => "QueueItemId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName" }; } } diff --git a/Core/Resgrid.Model/Rank.cs b/Core/Resgrid.Model/Rank.cs index 18b59c4c..b80236f7 100644 --- a/Core/Resgrid.Model/Rank.cs +++ b/Core/Resgrid.Model/Rank.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -25,6 +26,7 @@ public class Rank : IEntity public virtual ICollection Members { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return RankId; } @@ -38,6 +40,9 @@ public object IdValue public string IdName => "RankId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Members" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Members" }; } } diff --git a/Core/Resgrid.Model/Repositories/ICallsRepository.cs b/Core/Resgrid.Model/Repositories/ICallsRepository.cs index 5ae807ed..654f460d 100644 --- a/Core/Resgrid.Model/Repositories/ICallsRepository.cs +++ b/Core/Resgrid.Model/Repositories/ICallsRepository.cs @@ -56,5 +56,20 @@ public interface ICallsRepository: IRepository /// The department identifier. /// Task<IEnumerable<string>>. Task> SelectCallYearsByDeptAsync(int departmentId); + + /// + /// Gets all calls by date range that are to be dispatched asynchronous. + /// + /// The start date. + /// The end date. + /// Task<IEnumerable<Call>>. + Task> GetAllNonDispatchedScheduledCallsWithinDateRange(DateTime startDate, DateTime endDate); + + /// + /// Gets all non-dispatched scheduled calls by department asynchronous. + /// + /// The department identifier. + /// Task<IEnumerable<Call>>. + Task> GetAllNonDispatchedScheduledCallsByDepartmentIdAsync(int departmentId); } } diff --git a/Core/Resgrid.Model/Repositories/IDepartmentVoiceChannelRepository.cs b/Core/Resgrid.Model/Repositories/IDepartmentVoiceChannelRepository.cs new file mode 100644 index 00000000..f89ff2b6 --- /dev/null +++ b/Core/Resgrid.Model/Repositories/IDepartmentVoiceChannelRepository.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Resgrid.Model.Repositories +{ + /// + /// Interface IDepartmentVoiceChannelRepository + /// Implements the + /// + /// + public interface IDepartmentVoiceChannelRepository : IRepository + { + Task> GetDepartmentVoiceChannelByVoiceIdAsync(string voiceId); + + Task> GetDepartmentVoiceChannelByDepartmentIdAsync(int departmentId); + } +} diff --git a/Core/Resgrid.Model/Repositories/IDepartmentVoiceRepository.cs b/Core/Resgrid.Model/Repositories/IDepartmentVoiceRepository.cs new file mode 100644 index 00000000..eb7085a3 --- /dev/null +++ b/Core/Resgrid.Model/Repositories/IDepartmentVoiceRepository.cs @@ -0,0 +1,14 @@ +using System.Threading.Tasks; + +namespace Resgrid.Model.Repositories +{ + /// + /// Interface IDepartmentVoiceRepository + /// Implements the + /// + /// + public interface IDepartmentVoiceRepository : IRepository + { + Task GetDepartmentVoiceByDepartmentIdAsync(int departmentId); + } +} diff --git a/Core/Resgrid.Model/Repositories/IDepartmentVoiceUserRepository.cs b/Core/Resgrid.Model/Repositories/IDepartmentVoiceUserRepository.cs new file mode 100644 index 00000000..ac6f5b8e --- /dev/null +++ b/Core/Resgrid.Model/Repositories/IDepartmentVoiceUserRepository.cs @@ -0,0 +1,14 @@ +using System.Threading.Tasks; + +namespace Resgrid.Model.Repositories +{ + /// + /// Interface IDepartmentVoiceUserRepository + /// Implements the + /// + /// + public interface IDepartmentVoiceUserRepository : IRepository + { + Task GetDepartmentVoiceUserByUserIdAsync(string userId); + } +} diff --git a/Core/Resgrid.Model/Repositories/IFormAutomationsRepository.cs b/Core/Resgrid.Model/Repositories/IFormAutomationsRepository.cs new file mode 100644 index 00000000..4eaf4523 --- /dev/null +++ b/Core/Resgrid.Model/Repositories/IFormAutomationsRepository.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Resgrid.Model.Repositories +{ + /// + /// Interface IFormAutomationsRepository + /// Implements the + /// + /// + public interface IFormAutomationsRepository : IRepository + { + Task> GetFormAutomationsByFormIdAsync(string formId); + } +} diff --git a/Core/Resgrid.Model/Repositories/IFormsRepository.cs b/Core/Resgrid.Model/Repositories/IFormsRepository.cs new file mode 100644 index 00000000..9f2d0fe0 --- /dev/null +++ b/Core/Resgrid.Model/Repositories/IFormsRepository.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Resgrid.Model.Repositories +{ + /// + /// Interface IFormsRepository + /// Implements the + /// + /// + public interface IFormsRepository : IRepository
+ { + /// + /// Gets the dispatch protocol by identifier asynchronous. + /// + /// The form identifier. + /// Task<DispatchProtocol>. + Task GetFormByIdAsync(string formId); + + /// + /// Gets the forms by department identifier asynchronous. + /// + /// The department identifier. + /// Task<IEnumerable<DispatchProtocol>>. + Task> GetFormsByDepartmentIdAsync(int departmentId); + + /// + /// Gets the enabled (non-deleted) forms by department identifier asynchronous. + /// + /// The department identifier. + /// Task<IEnumerable<DispatchProtocol>>. + Task> GetNonDeletedFormsByDepartmentIdAsync(int departmentId); + + /// + /// Enables a form by identifier asynchronous. + /// + /// The identifier. + /// Task<System.Boolean>. + Task EnableFormByIdAsync(string id); + + /// + /// Disable a form by identifier asynchronous. + /// + /// The identifier. + /// Task<System.Boolean>. + Task DisableFormByIdAsync(string id); + } +} diff --git a/Core/Resgrid.Model/Repositories/IOidcRepository.cs b/Core/Resgrid.Model/Repositories/IOidcRepository.cs new file mode 100644 index 00000000..b135ffcc --- /dev/null +++ b/Core/Resgrid.Model/Repositories/IOidcRepository.cs @@ -0,0 +1,14 @@ +namespace Resgrid.Model.Repositories +{ + /// + /// Interface IOidcRepository + /// + public interface IOidcRepository + { + /// + /// Updates the Oidc Database + /// + /// If the operation was successful + bool UpdateOidcDatabase(); + } +} diff --git a/Core/Resgrid.Model/Repositories/IPaymentAddonsRepository.cs b/Core/Resgrid.Model/Repositories/IPaymentAddonsRepository.cs new file mode 100644 index 00000000..c6858818 --- /dev/null +++ b/Core/Resgrid.Model/Repositories/IPaymentAddonsRepository.cs @@ -0,0 +1,12 @@ +namespace Resgrid.Model.Repositories +{ + /// + /// Interface IPaymentAddonsRepository + /// Implements the + /// + /// + public interface IPaymentAddonsRepository : IRepository + { + + } +} diff --git a/Core/Resgrid.Model/Repositories/IPlanAddonsRepository.cs b/Core/Resgrid.Model/Repositories/IPlanAddonsRepository.cs new file mode 100644 index 00000000..9af53ac8 --- /dev/null +++ b/Core/Resgrid.Model/Repositories/IPlanAddonsRepository.cs @@ -0,0 +1,14 @@ +using System.Threading.Tasks; + +namespace Resgrid.Model.Repositories +{ + /// + /// Interface IPlanAddonsRepository + /// Implements the + /// + /// + public interface IPlanAddonsRepository: IRepository + { + + } +} diff --git a/Core/Resgrid.Model/Resgrid.Model.csproj b/Core/Resgrid.Model/Resgrid.Model.csproj index 4d2a8bf9..828fd16c 100644 --- a/Core/Resgrid.Model/Resgrid.Model.csproj +++ b/Core/Resgrid.Model/Resgrid.Model.csproj @@ -1,7 +1,7 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker @@ -43,11 +43,10 @@ - - - - - + + + + diff --git a/Core/Resgrid.Model/ResourceOrder.cs b/Core/Resgrid.Model/ResourceOrder.cs index 62214854..cf93ff01 100644 --- a/Core/Resgrid.Model/ResourceOrder.cs +++ b/Core/Resgrid.Model/ResourceOrder.cs @@ -4,6 +4,7 @@ using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using GeoCoordinatePortable; +using Newtonsoft.Json; using Resgrid.Framework; namespace Resgrid.Model @@ -38,7 +39,7 @@ public class ResourceOrder : IEntity [DecimalPrecision(10, 7)] public decimal? IncidentLongitude { get; set; } - + public string Summary { get; set; } public DateTime OpenDate { get; set; } @@ -79,7 +80,7 @@ public GeoCoordinate OriginLocation if (OriginLatitude.HasValue && OriginLongitude.HasValue) return new GeoCoordinate(OriginLatitude.Value, OriginLongitude.Value); - return new GeoCoordinate(0,0); + return new GeoCoordinate(0, 0); } } @@ -94,6 +95,7 @@ public double GetDistanceTo(double latitude, double longitude) public virtual ICollection Items { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return ResourceOrderId; } @@ -107,7 +109,10 @@ public object IdValue public string IdName => "ResourceOrderId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "OriginLocation" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "OriginLocation" }; public bool IsFilled() { @@ -139,6 +144,6 @@ public enum ResourceOrderTypes OpenUntilClosed = 0, OpenUntilFilled = 1, OpenUntilDatePartial = 2, - OpenUntilDateCancel = 3 + OpenUntilDateCancel = 3 } } diff --git a/Core/Resgrid.Model/ResourceOrderFill.cs b/Core/Resgrid.Model/ResourceOrderFill.cs index 9fb245f2..74321414 100644 --- a/Core/Resgrid.Model/ResourceOrderFill.cs +++ b/Core/Resgrid.Model/ResourceOrderFill.cs @@ -3,6 +3,7 @@ using Resgrid.Model.Identity; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -34,7 +35,7 @@ public class ResourceOrderFill : IEntity public string Note { get; set; } public string ContactName { get; set; } - + public string ContactNumber { get; set; } public DateTime FilledOn { get; set; } @@ -56,13 +57,14 @@ public class ResourceOrderFill : IEntity public virtual ICollection Units { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return ResourceOrderFillId; } set { ResourceOrderFillId = (int)value; } } - + [NotMapped] public string TableName => "ResourceOrderFills"; @@ -70,6 +72,9 @@ public object IdValue public string IdName => "ResourceOrderFillId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "OrderItem", "FillingUser", "LeadUser", "AcceptedUser", "Units" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "OrderItem", "FillingUser", "LeadUser", "AcceptedUser", "Units" }; } } diff --git a/Core/Resgrid.Model/ResourceOrderFillUnit.cs b/Core/Resgrid.Model/ResourceOrderFillUnit.cs index 45be8314..1ab15ead 100644 --- a/Core/Resgrid.Model/ResourceOrderFillUnit.cs +++ b/Core/Resgrid.Model/ResourceOrderFillUnit.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -25,6 +26,7 @@ public class ResourceOrderFillUnit : IEntity public virtual Unit Unit { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return ResourceOrderFillUnitId; } @@ -38,6 +40,9 @@ public object IdValue public string IdName => "ResourceOrderFillUnitId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "OrderFill", "Unit" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "OrderFill", "Unit" }; } } diff --git a/Core/Resgrid.Model/ResourceOrderItem.cs b/Core/Resgrid.Model/ResourceOrderItem.cs index a1de63a2..9a93232a 100644 --- a/Core/Resgrid.Model/ResourceOrderItem.cs +++ b/Core/Resgrid.Model/ResourceOrderItem.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; @@ -58,13 +59,14 @@ public int UnitFillCount() } [NotMapped] + [JsonIgnore] public object IdValue { get { return ResourceOrderItemId; } set { ResourceOrderItemId = (int)value; } } - + [NotMapped] public string TableName => "ResourceOrderItems"; @@ -72,6 +74,9 @@ public object IdValue public string IdName => "ResourceOrderItemId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Order", "Fills" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Order", "Fills" }; } } diff --git a/Core/Resgrid.Model/ResourceOrderSetting.cs b/Core/Resgrid.Model/ResourceOrderSetting.cs index 89872538..aa13483c 100644 --- a/Core/Resgrid.Model/ResourceOrderSetting.cs +++ b/Core/Resgrid.Model/ResourceOrderSetting.cs @@ -2,6 +2,7 @@ using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Framework; namespace Resgrid.Model @@ -57,10 +58,11 @@ public class ResourceOrderSetting : IEntity public string UserIdsToNotifyOnOrders { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return ResourceOrderSettingId; } - set { ResourceOrderSettingId = (int) value; } + set { ResourceOrderSettingId = (int)value; } } [NotMapped] @@ -70,15 +72,18 @@ public object IdValue public string IdName => "ResourceOrderSettingId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "RoleAllowedToFulfilOrders" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "RoleAllowedToFulfilOrders" }; } public enum ResourceOrderVisibilites { - Range = 0, + Range = 0, //Geofence = 1, - Linked = 2, + Linked = 2, Unrestricted = 3 } } diff --git a/Core/Resgrid.Model/ScheduledTask.cs b/Core/Resgrid.Model/ScheduledTask.cs index 13330390..c169b496 100644 --- a/Core/Resgrid.Model/ScheduledTask.cs +++ b/Core/Resgrid.Model/ScheduledTask.cs @@ -6,6 +6,7 @@ using System.Linq; using ProtoBuf; using Resgrid.Framework; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -84,6 +85,7 @@ public class ScheduledTask : IEntity public string DepartmentTimeZone { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return ScheduledTaskId; } @@ -97,7 +99,10 @@ public object IdValue public string IdName => "ScheduledTaskId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "User", "DepartmentTimeZone" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "User", "DepartmentTimeZone" }; public List GetDaysOfWeek() { @@ -190,7 +195,7 @@ public List GetDaysOfWeek() /* If the current time is at least 11:00 PM and the time we're evaluating is for * midnight we have to add a day so that when we do the time math it will work out - */ + */ if (currentLocalTime.Hour == 23 && am && hour == 12) dayAdjust = 1; diff --git a/Core/Resgrid.Model/ScheduledTaskLog.cs b/Core/Resgrid.Model/ScheduledTaskLog.cs index b2eb8676..9613a7af 100644 --- a/Core/Resgrid.Model/ScheduledTaskLog.cs +++ b/Core/Resgrid.Model/ScheduledTaskLog.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -27,6 +28,7 @@ public class ScheduledTaskLog : IEntity public virtual ScheduledTask ScheduledTask { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return ScheduledTaskLogId; } @@ -40,6 +42,9 @@ public object IdValue public string IdName => "ScheduledTaskLogId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "ScheduledTask" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "ScheduledTask" }; } } diff --git a/Core/Resgrid.Model/Services/IAuditEventService.cs b/Core/Resgrid.Model/Services/IAuditEventService.cs new file mode 100644 index 00000000..76d997a0 --- /dev/null +++ b/Core/Resgrid.Model/Services/IAuditEventService.cs @@ -0,0 +1,6 @@ +namespace Resgrid.Model.Services +{ + public interface IAuditEventService + { + } +} diff --git a/Core/Resgrid.Model/Services/ICallsService.cs b/Core/Resgrid.Model/Services/ICallsService.cs index 420df24f..ee07fc2f 100644 --- a/Core/Resgrid.Model/Services/ICallsService.cs +++ b/Core/Resgrid.Model/Services/ICallsService.cs @@ -398,5 +398,10 @@ Task ClearGroupForDispatchesAsync(int departmentGroupId, /// if set to true [get protocols]. /// Task<Call>. Task PopulateCallData(Call call, bool getDispatches, bool getAttachments, bool getNotes, bool getGroupDispatches, bool getUnitDispatches, bool getRoleDispatches, bool getProtocols); + + Task> GetAllNonDispatchedScheduledCallsWithinDateRange(DateTime startDate, DateTime endDate); + + + Task> GetAllNonDispatchedScheduledCallsByDepartmentIdAsync(int departmentId); } } diff --git a/Core/Resgrid.Model/Services/ICustomStateService.cs b/Core/Resgrid.Model/Services/ICustomStateService.cs index 75b10971..f0bf29bc 100644 --- a/Core/Resgrid.Model/Services/ICustomStateService.cs +++ b/Core/Resgrid.Model/Services/ICustomStateService.cs @@ -119,5 +119,18 @@ public interface ICustomStateService /// The state. /// Task<CustomStateDetail>. Task GetCustomPersonnelStaffingAsync(int departmentId, UserState state); + + /// + /// Gets the custom personnel staffing or defaults asynchronous. + /// + /// The department identifier. + /// Task<List<CustomStateDetail>>. + Task> GetCustomPersonnelStaffingsOrDefaultsAsync(int departmentId); + + /// + /// Gets the default (system) unit statuses + /// + /// + List GetDefaultUnitStatuses(); } } diff --git a/Core/Resgrid.Model/Services/IDepartmentsService.cs b/Core/Resgrid.Model/Services/IDepartmentsService.cs index bf72cdad..d74ad488 100644 --- a/Core/Resgrid.Model/Services/IDepartmentsService.cs +++ b/Core/Resgrid.Model/Services/IDepartmentsService.cs @@ -131,6 +131,8 @@ Task SaveDepartmentCallPruningAsync(DepartmentCallPruning Task GetDepartmentSetupReportAsync(int departmentId); + string ConvertDepartmentCodeToDigitPin(string departmentCode); + decimal GenerateSetupScore(DepartmentReport report); /// diff --git a/Core/Resgrid.Model/Services/IFormsService.cs b/Core/Resgrid.Model/Services/IFormsService.cs new file mode 100644 index 00000000..71bca08d --- /dev/null +++ b/Core/Resgrid.Model/Services/IFormsService.cs @@ -0,0 +1,74 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace Resgrid.Model.Services +{ + public interface IFormsService + { + /// + /// Gets all forms for department asynchronous. + /// + /// The department identifier. + /// Task<List<Form>>. + Task> GetAllFormsForDepartmentAsync(int departmentId); + + /// + /// Gets all enabled (non-deleted) forms for department asynchronous. + /// + /// The department identifier. + /// Task<List<Form>>. + Task> GetAllNonDeletedFormsForDepartmentAsync(int departmentId); + + /// + /// Saves the form asynchronous. + /// + /// The form. + /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// Task<Form>. + Task SaveFormAsync(Form form, CancellationToken cancellationToken = default(CancellationToken)); + + /// + /// Gets the form by identifier asynchronous. + /// + /// The identifier. + /// Task<Form>. + Task GetFormByIdAsync(string id); + + /// + /// Deletes the form. + /// + /// The identifier. + /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// Task<System.Boolean>. + Task DeleteForm(string id, CancellationToken cancellationToken = default(CancellationToken)); + + /// + /// Enables a form by identifier asynchronous. + /// + /// The identifier. + /// Task<System.Boolean>. + Task EnableFormByIdAsync(string id); + + /// + /// Disable a form by identifier asynchronous. + /// + /// The identifier. + /// Task<System.Boolean>. + Task DisableFormByIdAsync(string id); + + /// + /// Gets the active new call form by department identifier asynchronous. + /// + /// The identifier. + /// Task<Form>. + Task GetNewCallFormByDepartmentIdAsync(int departmentId); + + /// + /// Gets the active new call form by department identifier asynchronous. + /// + /// The identifier. + /// Task<Form>. + FormAutomationData ProcessForm(Form form, string data); + } +} diff --git a/Core/Resgrid.Model/Services/INumbersService.cs b/Core/Resgrid.Model/Services/INumbersService.cs index b99ef7cf..ca2e8ac6 100644 --- a/Core/Resgrid.Model/Services/INumbersService.cs +++ b/Core/Resgrid.Model/Services/INumbersService.cs @@ -12,7 +12,7 @@ public interface INumbersService /// The country. /// The area code. /// List<TextNumber>. - List GetAvailableNumbers(string country, string areaCode); + Task> GetAvailableNumbers(string country, string areaCode); /// /// Provisions the number asynchronous. diff --git a/Core/Resgrid.Model/Services/ISubscriptionsService.cs b/Core/Resgrid.Model/Services/ISubscriptionsService.cs index 5327e4b2..d24363ed 100644 --- a/Core/Resgrid.Model/Services/ISubscriptionsService.cs +++ b/Core/Resgrid.Model/Services/ISubscriptionsService.cs @@ -175,5 +175,34 @@ Task InsertPaymentAsync(Payment payment, /// Task<Payment>. Task CreateFreePlanPaymentAsync(int departmentId, string userId, CancellationToken cancellationToken = default(CancellationToken)); + + /// + /// Gets a current addon payment by department identifier asynchronous. + /// + /// The department identifier. + /// The addon plan identifiers. + /// Task<List<PaymentAddon>>. + Task> GetCurrentPaymentAddonsForDepartmentAsync(int departmentId, List planAddonIds); + + /// + /// Gets all plan addons by plan addon type asynchronous. + /// + /// The type of plan addon. + /// Task<List<PlanAddon>>. + Task> GetAllAddonPlansByTypeAsync(PlanAddonTypes planAddonType); + + /// + /// Gets all plan addons active for a subscription asynchronous. + /// + /// The department id to get info for. + /// Task<List<PlanAddon>>. + Task> GetCurrentPlanAddonsForDepartmentFromStripeAsync(int departmentId); + + /// + /// Gets the current PTT plan addon active for a subscription asynchronous. + /// + /// The department id to get info for. + /// Task<PlanAddon>. + Task GetPTTAddonPlanForDepartmentFromStripeAsync(int departmentId); } } diff --git a/Core/Resgrid.Model/Services/IVoiceService.cs b/Core/Resgrid.Model/Services/IVoiceService.cs new file mode 100644 index 00000000..8ee48b6a --- /dev/null +++ b/Core/Resgrid.Model/Services/IVoiceService.cs @@ -0,0 +1,24 @@ + + +using System.Threading; +using System.Threading.Tasks; + +namespace Resgrid.Model.Services +{ + public interface IVoiceService + { + Task CanDepartmentUseVoiceAsync(int departmentId); + + Task GetVoiceSettingsForDepartmentAsync(int departmentId); + + Task InitializeDepartmentUsersWithVoipProviderAsync(int departmentId, CancellationToken cancellationToken = default(CancellationToken)); + + Task GetOrCreateDepartmentVoiceRecordAsync(Department department, CancellationToken cancellationToken = default(CancellationToken)); + + Task SaveUserToVoipProviderAsync(DepartmentVoice voice, UserProfile profile, string emailAddress, CancellationToken cancellationToken = default(CancellationToken)); + + Task SaveChannelToVoipProviderAsync(Department department, string name, CancellationToken cancellationToken = default(CancellationToken)); + + Task GetOpenViduSessionToken(string sessionId); + } +} diff --git a/Core/Resgrid.Model/Shift.cs b/Core/Resgrid.Model/Shift.cs index bea41a61..23e4bf6a 100644 --- a/Core/Resgrid.Model/Shift.cs +++ b/Core/Resgrid.Model/Shift.cs @@ -41,7 +41,7 @@ public class Shift : IEntity public virtual ICollection Signups { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return ShiftId; } set { ShiftId = (int)value; } @@ -54,7 +54,10 @@ public object IdValue public string IdName => "ShiftId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Groups", "Days", "Personnel", "PersoAdminsnnel", "Signups", "Admins" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Groups", "Days", "Personnel", "PersoAdminsnnel", "Signups", "Admins" }; public ShiftDay GetShiftDayforDateTime(DateTime timestamp) { diff --git a/Core/Resgrid.Model/ShiftAdmin.cs b/Core/Resgrid.Model/ShiftAdmin.cs index 09f844f9..e8d57fe4 100644 --- a/Core/Resgrid.Model/ShiftAdmin.cs +++ b/Core/Resgrid.Model/ShiftAdmin.cs @@ -29,7 +29,7 @@ public class ShiftAdmin : IEntity public virtual IdentityUser User { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return ShiftAdminId; } set { ShiftAdminId = (int) value; } @@ -42,6 +42,9 @@ public object IdValue public string IdName => "ShiftAdminId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Shift", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Shift", "User" }; } } diff --git a/Core/Resgrid.Model/ShiftDay.cs b/Core/Resgrid.Model/ShiftDay.cs index b1c041d8..c6237e65 100644 --- a/Core/Resgrid.Model/ShiftDay.cs +++ b/Core/Resgrid.Model/ShiftDay.cs @@ -54,7 +54,7 @@ public DateTime End } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return ShiftDayId; } set { ShiftDayId = (int)value; } @@ -67,6 +67,9 @@ public object IdValue public string IdName => "ShiftDayId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Shift" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Shift" }; } } diff --git a/Core/Resgrid.Model/ShiftGroup.cs b/Core/Resgrid.Model/ShiftGroup.cs index 7d43e9b5..706b1863 100644 --- a/Core/Resgrid.Model/ShiftGroup.cs +++ b/Core/Resgrid.Model/ShiftGroup.cs @@ -31,7 +31,7 @@ public class ShiftGroup : IEntity public virtual ICollection Assignments { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return ShiftGroupId; } set { ShiftGroupId = (int)value; } @@ -44,6 +44,9 @@ public object IdValue public string IdName => "ShiftGroupId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Shift", "DepartmentGroup", "Roles", "Assignments" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Shift", "DepartmentGroup", "Roles", "Assignments" }; } } diff --git a/Core/Resgrid.Model/ShiftGroupAssignment.cs b/Core/Resgrid.Model/ShiftGroupAssignment.cs index 1b903109..bcaaef48 100644 --- a/Core/Resgrid.Model/ShiftGroupAssignment.cs +++ b/Core/Resgrid.Model/ShiftGroupAssignment.cs @@ -37,7 +37,7 @@ public class ShiftGroupAssignment : IEntity public DateTime ShiftDay { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return ShiftGroupAssignmentId; } set { ShiftGroupAssignmentId = (int) value; } @@ -50,6 +50,9 @@ public object IdValue public string IdName => "ShiftGroupAssignmentId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "ShiftGroup" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "ShiftGroup" }; } } diff --git a/Core/Resgrid.Model/ShiftGroupRole.cs b/Core/Resgrid.Model/ShiftGroupRole.cs index b4057a11..e5621366 100644 --- a/Core/Resgrid.Model/ShiftGroupRole.cs +++ b/Core/Resgrid.Model/ShiftGroupRole.cs @@ -31,7 +31,7 @@ public class ShiftGroupRole : IEntity public int Optional { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return ShiftGroupRoleId; } set { ShiftGroupRoleId = (int)value; } @@ -44,6 +44,9 @@ public object IdValue public string IdName => "ShiftGroupRoleId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "ShiftGroup", "Role" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "ShiftGroup", "Role" }; } } diff --git a/Core/Resgrid.Model/ShiftPerson.cs b/Core/Resgrid.Model/ShiftPerson.cs index 03385a38..bbe84364 100644 --- a/Core/Resgrid.Model/ShiftPerson.cs +++ b/Core/Resgrid.Model/ShiftPerson.cs @@ -35,7 +35,7 @@ public class ShiftPerson : IEntity public virtual DepartmentGroup Group { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return ShiftPersonId; } set { ShiftPersonId = (int)value; } @@ -48,6 +48,9 @@ public object IdValue public string IdName => "ShiftPersonId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Shift", "User", "Group" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Shift", "User", "Group" }; } } diff --git a/Core/Resgrid.Model/ShiftSignup.cs b/Core/Resgrid.Model/ShiftSignup.cs index 46e0b292..83032cab 100644 --- a/Core/Resgrid.Model/ShiftSignup.cs +++ b/Core/Resgrid.Model/ShiftSignup.cs @@ -44,7 +44,7 @@ public class ShiftSignup : IEntity public virtual ShiftSignupTrade Trade { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return ShiftSignupId; } set { ShiftSignupId = (int)value; } @@ -57,7 +57,10 @@ public object IdValue public string IdName => "ShiftSignupId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Shift", "User", "Group", "Trade" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Shift", "User", "Group", "Trade" }; public ShiftTradeTypes GetTradeType() { diff --git a/Core/Resgrid.Model/ShiftSignupTrade.cs b/Core/Resgrid.Model/ShiftSignupTrade.cs index 53f28074..e90b1eaa 100644 --- a/Core/Resgrid.Model/ShiftSignupTrade.cs +++ b/Core/Resgrid.Model/ShiftSignupTrade.cs @@ -40,7 +40,7 @@ public class ShiftSignupTrade : IEntity public string Note { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return ShiftSignupTradeId; } set { ShiftSignupTradeId = (int)value; } @@ -53,7 +53,10 @@ public object IdValue public string IdName => "ShiftSignupTradeId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "SourceShiftSignup", "TargetShiftSignup", "User", "Users" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "SourceShiftSignup", "TargetShiftSignup", "User", "Users" }; public bool IsTradeComplete() { diff --git a/Core/Resgrid.Model/ShiftSignupTradeUser.cs b/Core/Resgrid.Model/ShiftSignupTradeUser.cs index 25e9a147..cf1faeb2 100644 --- a/Core/Resgrid.Model/ShiftSignupTradeUser.cs +++ b/Core/Resgrid.Model/ShiftSignupTradeUser.cs @@ -36,7 +36,7 @@ public class ShiftSignupTradeUser : IEntity public virtual ICollection Shifts { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return ShiftSignupTradeUserId; } set { ShiftSignupTradeUserId = (int)value; } @@ -49,6 +49,9 @@ public object IdValue public string IdName => "ShiftSignupTradeUserId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "ShiftSignupTrade", "User", "Shifts" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "ShiftSignupTrade", "User", "Shifts" }; } } diff --git a/Core/Resgrid.Model/ShiftSignupTradeUserShift.cs b/Core/Resgrid.Model/ShiftSignupTradeUserShift.cs index 292a1ee9..d068c553 100644 --- a/Core/Resgrid.Model/ShiftSignupTradeUserShift.cs +++ b/Core/Resgrid.Model/ShiftSignupTradeUserShift.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -24,6 +25,7 @@ public class ShiftSignupTradeUserShift : IEntity public virtual ShiftSignup ShiftSignup { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return ShiftSignupTradeUserShiftId; } @@ -37,6 +39,9 @@ public object IdValue public string IdName => "ShiftSignupTradeUserShiftId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "ShiftSignupTradeUser", "ShiftSignup" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "ShiftSignupTradeUser", "ShiftSignup" }; } } diff --git a/Core/Resgrid.Model/ShiftStaffing.cs b/Core/Resgrid.Model/ShiftStaffing.cs index 13aca1b8..e4316608 100644 --- a/Core/Resgrid.Model/ShiftStaffing.cs +++ b/Core/Resgrid.Model/ShiftStaffing.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -39,6 +40,7 @@ public class ShiftStaffing : IEntity public virtual ICollection Personnel { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return ShiftStaffingId; } @@ -52,6 +54,9 @@ public object IdValue public string IdName => "ShiftStaffingId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Shift", "AddedBy", "Personnel" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Shift", "AddedBy", "Personnel" }; } } diff --git a/Core/Resgrid.Model/ShiftStaffingPerson.cs b/Core/Resgrid.Model/ShiftStaffingPerson.cs index e6ab708c..60be98cc 100644 --- a/Core/Resgrid.Model/ShiftStaffingPerson.cs +++ b/Core/Resgrid.Model/ShiftStaffingPerson.cs @@ -37,7 +37,7 @@ public class ShiftStaffingPerson : IEntity public virtual DepartmentGroup Group { get; set; } [NotMapped] - public object IdValue + [JsonIgnore]public object IdValue { get { return ShiftStaffingPersonId; } set { ShiftStaffingPersonId = (int)value; } @@ -50,6 +50,9 @@ public object IdValue public string IdName => "ShiftStaffingPersonId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "ShiftStaffing", "User", "Group" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "ShiftStaffing", "User", "Group" }; } } diff --git a/Core/Resgrid.Model/Training.cs b/Core/Resgrid.Model/Training.cs index 25123346..afef5f6d 100644 --- a/Core/Resgrid.Model/Training.cs +++ b/Core/Resgrid.Model/Training.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -51,6 +52,7 @@ public class Training : IEntity public virtual ICollection Users { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return TrainingId; } @@ -64,6 +66,9 @@ public object IdValue public string IdName => "TrainingId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Questions", "Attachments", "Users" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Questions", "Attachments", "Users" }; } } diff --git a/Core/Resgrid.Model/TrainingAttachment.cs b/Core/Resgrid.Model/TrainingAttachment.cs index 6b8c838e..98bffe36 100644 --- a/Core/Resgrid.Model/TrainingAttachment.cs +++ b/Core/Resgrid.Model/TrainingAttachment.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -25,6 +26,7 @@ public class TrainingAttachment : IEntity public byte[] Data { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return TrainingAttachmentId; } @@ -38,6 +40,9 @@ public object IdValue public string IdName => "TrainingAttachmentId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Training" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Training" }; } } diff --git a/Core/Resgrid.Model/TrainingQuestion.cs b/Core/Resgrid.Model/TrainingQuestion.cs index 87ff8010..a41856d1 100644 --- a/Core/Resgrid.Model/TrainingQuestion.cs +++ b/Core/Resgrid.Model/TrainingQuestion.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -23,6 +24,7 @@ public class TrainingQuestion : IEntity public virtual ICollection Answers { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return TrainingQuestionId; } @@ -36,6 +38,9 @@ public object IdValue public string IdName => "TrainingQuestionId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Training", "Answers" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Training", "Answers" }; } } diff --git a/Core/Resgrid.Model/TrainingQuestionAnswer.cs b/Core/Resgrid.Model/TrainingQuestionAnswer.cs index d6edb2b9..51f41c08 100644 --- a/Core/Resgrid.Model/TrainingQuestionAnswer.cs +++ b/Core/Resgrid.Model/TrainingQuestionAnswer.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -23,6 +24,7 @@ public class TrainingQuestionAnswer : IEntity public bool Correct { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return TrainingQuestionAnswerId; } @@ -36,6 +38,9 @@ public object IdValue public string IdName => "TrainingQuestionAnswerId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Question" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Question" }; } } diff --git a/Core/Resgrid.Model/TrainingUser.cs b/Core/Resgrid.Model/TrainingUser.cs index 01b169b9..9846bf0f 100644 --- a/Core/Resgrid.Model/TrainingUser.cs +++ b/Core/Resgrid.Model/TrainingUser.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -37,6 +38,7 @@ public class TrainingUser : IEntity public double Score { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return TrainingUserId; } @@ -50,6 +52,9 @@ public object IdValue public string IdName => "TrainingUserId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Training", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Training", "User" }; } } diff --git a/Core/Resgrid.Model/Unit.cs b/Core/Resgrid.Model/Unit.cs index 0be956ee..8c3ac24f 100644 --- a/Core/Resgrid.Model/Unit.cs +++ b/Core/Resgrid.Model/Unit.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; namespace Resgrid.Model @@ -50,6 +51,7 @@ public class Unit : IEntity public virtual List Roles { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return UnitId; } @@ -63,6 +65,9 @@ public object IdValue public string IdName => "UnitId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "StationGroup", "Department", "Roles" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "StationGroup", "Department", "Roles" }; } } diff --git a/Core/Resgrid.Model/UnitActiveRole.cs b/Core/Resgrid.Model/UnitActiveRole.cs index 93e9c83f..bb6bbee3 100644 --- a/Core/Resgrid.Model/UnitActiveRole.cs +++ b/Core/Resgrid.Model/UnitActiveRole.cs @@ -1,4 +1,5 @@ -using Resgrid.Model.Identity; +using Newtonsoft.Json; +using Resgrid.Model.Identity; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -45,6 +46,7 @@ public class UnitActiveRole : IEntity public virtual IdentityUser UpdatedByUser { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return UnitActiveRoleId; } @@ -57,8 +59,11 @@ public object IdValue [NotMapped] public string IdName => "UnitActiveRoleId"; + [NotMapped] + public int IdType => 0; + [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department", "Unit", "UnitRole", "User", "UpdatedByUser" }; + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department", "Unit", "UnitRole", "User", "UpdatedByUser" }; } } diff --git a/Core/Resgrid.Model/UnitLocation.cs b/Core/Resgrid.Model/UnitLocation.cs index 5a3d7c27..c2ff8476 100644 --- a/Core/Resgrid.Model/UnitLocation.cs +++ b/Core/Resgrid.Model/UnitLocation.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using ProtoBuf; using Resgrid.Framework; @@ -55,6 +56,7 @@ public class UnitLocation : IEntity public decimal? Heading { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return UnitLocationId; } @@ -68,6 +70,9 @@ public object IdValue public string IdName => "UnitLocationId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Unit" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Unit" }; } } diff --git a/Core/Resgrid.Model/UnitLog.cs b/Core/Resgrid.Model/UnitLog.cs index 179307df..4190e7bc 100644 --- a/Core/Resgrid.Model/UnitLog.cs +++ b/Core/Resgrid.Model/UnitLog.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -26,13 +27,14 @@ public class UnitLog : IEntity public virtual Unit Unit { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return UnitLogId; } set { UnitLogId = (int)value; } } - + [NotMapped] public string TableName => "UnitLogs"; @@ -40,6 +42,9 @@ public object IdValue public string IdName => "UnitLogId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Unit" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Unit" }; } } diff --git a/Core/Resgrid.Model/UnitRole.cs b/Core/Resgrid.Model/UnitRole.cs index 34332317..3df8cbea 100644 --- a/Core/Resgrid.Model/UnitRole.cs +++ b/Core/Resgrid.Model/UnitRole.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Newtonsoft.Json; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -23,20 +24,24 @@ public class UnitRole : IEntity public string Name { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return UnitRoleId; } set { UnitRoleId = (int)value; } } - + [NotMapped] public string TableName => "UnitRoles"; [NotMapped] public string IdName => "UnitRoleId"; + [NotMapped] + public int IdType => 0; + [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Unit" }; + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Unit" }; } } diff --git a/Core/Resgrid.Model/UnitState.cs b/Core/Resgrid.Model/UnitState.cs index 6a19073b..2917cf5e 100644 --- a/Core/Resgrid.Model/UnitState.cs +++ b/Core/Resgrid.Model/UnitState.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Framework; namespace Resgrid.Model @@ -66,6 +67,7 @@ public class UnitState : IEntity public virtual ICollection Roles { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return UnitStateId; } @@ -79,7 +81,10 @@ public object IdValue public string IdName => "UnitStateId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Roles", "Unit" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Roles", "Unit" }; public string GetStatusText() { diff --git a/Core/Resgrid.Model/UnitStateRole.cs b/Core/Resgrid.Model/UnitStateRole.cs index 968c306c..b96863e1 100644 --- a/Core/Resgrid.Model/UnitStateRole.cs +++ b/Core/Resgrid.Model/UnitStateRole.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; using Resgrid.Model.Identity; namespace Resgrid.Model @@ -29,6 +30,7 @@ public class UnitStateRole : IEntity public virtual IdentityUser User { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return UnitStateRoleId; } @@ -42,6 +44,9 @@ public object IdValue public string IdName => "UnitStateRoleId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "UnitState", "User" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "UnitState", "User" }; } } diff --git a/Core/Resgrid.Model/UnitType.cs b/Core/Resgrid.Model/UnitType.cs index c1541d31..30648da8 100644 --- a/Core/Resgrid.Model/UnitType.cs +++ b/Core/Resgrid.Model/UnitType.cs @@ -1,4 +1,5 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -26,6 +27,7 @@ public class UnitType : IEntity public int? CustomStatesId { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return UnitTypeId; } @@ -39,6 +41,9 @@ public object IdValue public string IdName => "UnitTypeId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "Department" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "Department" }; } } diff --git a/Core/Resgrid.Model/UserProfile.cs b/Core/Resgrid.Model/UserProfile.cs index 43bb3315..2e764fe3 100644 --- a/Core/Resgrid.Model/UserProfile.cs +++ b/Core/Resgrid.Model/UserProfile.cs @@ -4,6 +4,7 @@ using Resgrid.Model.Identity; using ProtoBuf; using System.Collections.Generic; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -133,6 +134,7 @@ public string GetHomePhoneNumber() } [NotMapped] + [JsonIgnore] public object IdValue { get { return UserProfileId; } @@ -146,7 +148,10 @@ public object IdValue public string IdName => "UserProfileId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "User", "MembershipEmail" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "User", "MembershipEmail" }; [NotMapped] public FullNameFormat FullName diff --git a/Core/Resgrid.Model/UserState.cs b/Core/Resgrid.Model/UserState.cs index 461548b9..abbe8f4d 100644 --- a/Core/Resgrid.Model/UserState.cs +++ b/Core/Resgrid.Model/UserState.cs @@ -4,6 +4,7 @@ using Resgrid.Model.Identity; using ProtoBuf; using System.Collections.Generic; +using Newtonsoft.Json; namespace Resgrid.Model { @@ -39,6 +40,7 @@ public class UserState : IEntity public virtual IdentityUser User { get; set; } [NotMapped] + [JsonIgnore] public object IdValue { get { return UserStateId; } @@ -52,7 +54,10 @@ public object IdValue public string IdName => "UserStateId"; [NotMapped] - public IEnumerable IgnoredProperties => new string[] { "IdValue", "TableName", "IdName", "User", "AutoGenerated" }; + public int IdType => 0; + + [NotMapped] + public IEnumerable IgnoredProperties => new string[] { "IdValue", "IdType", "TableName", "IdName", "User", "AutoGenerated" }; [NotMapped] public bool AutoGenerated { get; set; } diff --git a/Core/Resgrid.Services/AuditEventService.cs b/Core/Resgrid.Services/AuditEventService.cs new file mode 100644 index 00000000..2da4664d --- /dev/null +++ b/Core/Resgrid.Services/AuditEventService.cs @@ -0,0 +1,26 @@ +using System; +using Resgrid.Model.Events; +using Resgrid.Model.Services; +using Resgrid.Model.Providers; + +namespace Resgrid.Services +{ + public class AuditEventService : IAuditEventService + { + private readonly IEventAggregator _eventAggregator; + private static IAuditEventProvider _auditEventProvider; + + public AuditEventService(IEventAggregator eventAggregator, IAuditEventProvider auditEventProvider) + { + _eventAggregator = eventAggregator; + _auditEventProvider = auditEventProvider; + + _eventAggregator.AddListener(auditEventHandler); + } + + private Action auditEventHandler = async delegate(AuditEvent message) + { + await _auditEventProvider.EnqueueAuditEventAsync(message); + }; + } +} diff --git a/Core/Resgrid.Services/CallsService.cs b/Core/Resgrid.Services/CallsService.cs index 0c24a5c7..22fc03d1 100644 --- a/Core/Resgrid.Services/CallsService.cs +++ b/Core/Resgrid.Services/CallsService.cs @@ -69,6 +69,10 @@ public CallsService(ICallsRepository callsRepository, ICommunicationService comm if (String.IsNullOrWhiteSpace(call.Name)) call.Name = "New Call " + DateTime.UtcNow.ToShortDateString(); + // Got some bad data where geolocation is "," which passes some checks. + if (!String.IsNullOrWhiteSpace(call.GeoLocationData) && call.GeoLocationData.Length == 1) + call.GeoLocationData = ""; + return await _callsRepository.SaveOrUpdateAsync(call, cancellationToken); } @@ -554,7 +558,7 @@ public async Task GetShortenedAudioUrlAsync(int callId, int callAttachme if (callAttachmentId > 0) { var encryptedQuery = - WebUtility.UrlEncode(SymmetricEncryption.Encrypt(callAttachmentId.ToString(), Config.SystemBehaviorConfig.ExternalAudioUrlParamPasshprase)); + Convert.ToBase64String(Encoding.UTF8.GetBytes(SymmetricEncryption.Encrypt(callAttachmentId.ToString(), Config.SystemBehaviorConfig.ExternalAudioUrlParamPasshprase))); string shortenedUrl = await _shortenUrlProvider.Shorten( $"{Config.SystemBehaviorConfig.ResgridApiBaseUrl}/api/v3/calls/getcallaudio?query={encryptedQuery}"); @@ -573,7 +577,7 @@ await _shortenUrlProvider.Shorten( return String.Empty; var encryptedQuery = - WebUtility.UrlEncode(SymmetricEncryption.Encrypt(attachment.CallAttachmentId.ToString(), Config.SystemBehaviorConfig.ExternalAudioUrlParamPasshprase)); + Convert.ToBase64String(Encoding.UTF8.GetBytes(SymmetricEncryption.Encrypt(attachment.CallAttachmentId.ToString(), Config.SystemBehaviorConfig.ExternalAudioUrlParamPasshprase))); string shortenedUrl = await _shortenUrlProvider.Shorten( $"{Config.SystemBehaviorConfig.ResgridApiBaseUrl}/api/v3/calls/getcallaudio?query={encryptedQuery}"); @@ -599,14 +603,14 @@ public async Task GetShortenedCallLinkUrl(int callId, bool pdf = false, if (!stationId.HasValue && !pdf) { - encryptedQuery = WebUtility.UrlEncode(SymmetricEncryption.Encrypt(callId.ToString(), Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase)); + encryptedQuery = Convert.ToBase64String(Encoding.UTF8.GetBytes(SymmetricEncryption.Encrypt(callId.ToString(), Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase))); } else { string type = pdf ? "pdf" : "web"; string station = stationId.HasValue ? stationId.Value.ToString() : "0"; - encryptedQuery = WebUtility.UrlEncode(SymmetricEncryption.Encrypt($"{callId.ToString()}|${type}|${station}", Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase)); + encryptedQuery = Convert.ToBase64String(Encoding.UTF8.GetBytes(SymmetricEncryption.Encrypt($"{callId.ToString()}|${type}|${station}", Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase))); } @@ -653,14 +657,14 @@ public string GetCallPdfUrl(int callId, bool pdf = false, int? stationId = null) if (!stationId.HasValue && !pdf) { - encryptedQuery = WebUtility.UrlEncode(SymmetricEncryption.Encrypt(callId.ToString(), Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase)); + encryptedQuery = Convert.ToBase64String(Encoding.UTF8.GetBytes(SymmetricEncryption.Encrypt(callId.ToString(), Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase))); } else { string type = pdf ? "pdf" : "web"; string station = stationId.HasValue ? stationId.Value.ToString() : "0"; - encryptedQuery = WebUtility.UrlEncode(SymmetricEncryption.Encrypt($"{callId.ToString()}|{type}|{station}", Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase)); + encryptedQuery = Convert.ToBase64String(Encoding.UTF8.GetBytes(SymmetricEncryption.Encrypt($"{callId.ToString()}|{type}|{station}", Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase))); } @@ -687,6 +691,26 @@ public string GetCallPdfUrl(int callId, bool pdf = false, int? stationId = null) return true; } + public async Task> GetAllNonDispatchedScheduledCallsWithinDateRange(DateTime startDate, DateTime endDate) + { + var calls = await _callsRepository.GetAllNonDispatchedScheduledCallsWithinDateRange(startDate, endDate); + + if (calls != null && calls.Any()) + return calls.ToList(); + + return new List(); + } + + public async Task> GetAllNonDispatchedScheduledCallsByDepartmentIdAsync(int departmentId) + { + var calls = await _callsRepository.GetAllNonDispatchedScheduledCallsByDepartmentIdAsync(departmentId); + + if (calls != null && calls.Any()) + return calls.ToList(); + + return new List(); + } + public string CallStateToString(CallStates state) { switch (state) diff --git a/Core/Resgrid.Services/CommunicationService.cs b/Core/Resgrid.Services/CommunicationService.cs index 0fe145e9..85f6293c 100644 --- a/Core/Resgrid.Services/CommunicationService.cs +++ b/Core/Resgrid.Services/CommunicationService.cs @@ -8,7 +8,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Dasync.Collections; using System.Text.RegularExpressions; namespace Resgrid.Services @@ -127,7 +126,7 @@ public async Task SendCallAsync(Call call, CallDispatch dispatch, string d { subTitle = address; } - else if (!string.IsNullOrEmpty(call.GeoLocationData)) + else if (!string.IsNullOrEmpty(call.GeoLocationData) && call.GeoLocationData.Length > 1) { try { @@ -229,7 +228,7 @@ public async Task SendUnitCallAsync(Call call, CallDispatchUnit dispatch, { subTitle = address; } - else if (!string.IsNullOrEmpty(call.GeoLocationData)) + else if (!string.IsNullOrEmpty(call.GeoLocationData) && call.GeoLocationData.Length > 1) { try { @@ -340,7 +339,8 @@ public async Task SendChat(string chatId, string sendingUserId, string gro else { spm.Id = $"G{chatId}"; - await recipients.ParallelForEachAsync(async person => + //await recipients.ParallelForEachAsync(async person => + foreach (var person in recipients) { try { @@ -350,7 +350,7 @@ await recipients.ParallelForEachAsync(async person => { Logging.LogException(ex); } - }); + } } } catch (Exception ex) @@ -427,7 +427,7 @@ public async Task SendTroubleAlertAsync(TroubleAlertEvent troubleAlertEven { try { - _emailService.SendTroubleAlert(troubleAlertEvent, unit, call, callAddress, unitAddress, personnelNames, recipient); + await _emailService.SendTroubleAlert(troubleAlertEvent, unit, call, callAddress, unitAddress, personnelNames, recipient); } catch (Exception ex) { diff --git a/Core/Resgrid.Services/CoreEventService.cs b/Core/Resgrid.Services/CoreEventService.cs index 19d7e923..2bdb49cb 100644 --- a/Core/Resgrid.Services/CoreEventService.cs +++ b/Core/Resgrid.Services/CoreEventService.cs @@ -1,12 +1,9 @@ using System; -using System.Threading.Tasks; using CommonServiceLocator; using Resgrid.Model; using Resgrid.Model.Events; using Resgrid.Model.Services; -using Resgrid.Providers.Bus; using Resgrid.Model.Providers; -using Resgrid.Framework; namespace Resgrid.Services { @@ -21,7 +18,6 @@ public CoreEventService(IEventAggregator eventAggregator, ICqrsProvider cqrsProv _cqrsProvider = cqrsProvider; _eventAggregator.AddListener(departmentSettingsUpdateHandler); - _eventAggregator.AddListener(auditEventHandler); } private Action departmentSettingsUpdateHandler = async delegate(DepartmentSettingsUpdateEvent message) @@ -29,41 +25,5 @@ public CoreEventService(IEventAggregator eventAggregator, ICqrsProvider cqrsProv var departmentSettingsService = ServiceLocator.Current.GetInstance(); var result = await departmentSettingsService.SaveOrUpdateSettingAsync(message.DepartmentId, DateTime.UtcNow.ToString("G"), DepartmentSettingTypes.UpdateTimestamp); }; - - - //public class DepartmentSettingsUpdateHandler : IListener - //{ - // public async Task Handle(DepartmentSettingsUpdateEvent message) - // { - // var departmentSettingsService = ServiceLocator.Current.GetInstance(); - // var result = await departmentSettingsService.SaveOrUpdateSettingAsync(message.DepartmentId, DateTime.UtcNow.ToString("G"), DepartmentSettingTypes.UpdateTimestamp); - - // if (result != null) - // return true; - - // return false; - // } - //} - - private Action auditEventHandler = async delegate(AuditEvent message) - { - CqrsEvent cqrsEvent = new CqrsEvent(); - cqrsEvent.Type = (int)CqrsEventTypes.AuditLog; - cqrsEvent.Data = ObjectSerialization.Serialize(message); - - await _cqrsProvider.EnqueueCqrsEventAsync(cqrsEvent); - }; - - //public class AuditEventHandler : IListener - //{ - // public async Task Handle(AuditEvent message) - // { - // CqrsEvent cqrsEvent = new CqrsEvent(); - // cqrsEvent.Type = (int)CqrsEventTypes.AuditLog; - // cqrsEvent.Data = ObjectSerialization.Serialize(message); - - // return await _cqrsProvider.EnqueueCqrsEventAsync(cqrsEvent); - // } - //} } } diff --git a/Core/Resgrid.Services/CustomStateService.cs b/Core/Resgrid.Services/CustomStateService.cs index e2c9f838..ff605ba2 100644 --- a/Core/Resgrid.Services/CustomStateService.cs +++ b/Core/Resgrid.Services/CustomStateService.cs @@ -4,12 +4,10 @@ using System.Threading; using System.Threading.Tasks; using Resgrid.Model; -using Resgrid.Model.Cache; using Resgrid.Model.Events; using Resgrid.Model.Providers; using Resgrid.Model.Repositories; using Resgrid.Model.Services; -using Resgrid.Providers.Bus; namespace Resgrid.Services { @@ -99,6 +97,27 @@ public async Task> GetCustomPersonnelStatusesOrDefaultsA } } + public async Task> GetCustomPersonnelStaffingsOrDefaultsAsync(int departmentId) + { + var statuses = await GetActiveStaffingLevelsForDepartmentAsync(departmentId); + + if (statuses != null && statuses.GetActiveDetails().Any()) + { + return statuses.GetActiveDetails(); + } + else + { + List details = new List(); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UserStateTypes.Available, ButtonText = "Available" }); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UserStateTypes.Delayed, ButtonText = "Delayed" }); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UserStateTypes.Unavailable, ButtonText = "Unavailable" }); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UserStateTypes.Committed, ButtonText = "Committed" }); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UserStateTypes.OnShift, ButtonText = "On Shift" }); + + return details; + } + } + public async Task GetActiveStaffingLevelsForDepartmentAsync(int departmentId) { CustomState state = null; @@ -147,7 +166,7 @@ public void InvalidateCustomStateInCache(int departmentId) public async Task SaveAsync(CustomState customState, CancellationToken cancellationToken = default(CancellationToken)) { - var saved = await _customStateRepository.SaveOrUpdateAsync(customState,cancellationToken); + var saved = await _customStateRepository.SaveOrUpdateAsync(customState, cancellationToken); _cacheProvider.Remove(string.Format(CacheKey, customState.DepartmentId)); @@ -279,5 +298,26 @@ public async Task GetCustomUnitStateAsync(UnitState state) return stateDetail; } } + + public List GetDefaultUnitStatuses() + { + List details = new List(); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.Responding, ButtonText = "Responding", ButtonColor = "#32db64" }); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.Available, ButtonText = "Available", ButtonColor = "#222222" }); + //details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.Unavailable, ButtonText = "Unavailable", ButtonColor = "" }); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.Committed, ButtonText = "Committed", ButtonColor = "#50b8de" }); + //details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.Delayed, ButtonText = "Delayed", ButtonColor = "" }); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.OnScene, ButtonText = "On Scene", ButtonColor = "#69BB7B" }); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.Staging, ButtonText = "Staging", ButtonColor = "#ffc900" }); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.Returning, ButtonText = "Returning", ButtonColor = "#387ef5" }); + details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.OutOfService, ButtonText = "Out of Service", ButtonColor = "#ff6b69" }); + //details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.Cancelled, ButtonText = "Cancelled", ButtonColor = "#ff6b69" }); + //details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.Released, ButtonText = "Released", ButtonColor = "" }); + //details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.Manual, ButtonText = "Manual", ButtonColor = "" }); + //details.Add(new CustomStateDetail() { CustomStateDetailId = (int)UnitStateTypes.Enroute, ButtonText = "Enroute", ButtonColor = "" }); + + return details; + + } } } diff --git a/Core/Resgrid.Services/DepartmentSettingsService.cs b/Core/Resgrid.Services/DepartmentSettingsService.cs index b4802a48..42a9de30 100644 --- a/Core/Resgrid.Services/DepartmentSettingsService.cs +++ b/Core/Resgrid.Services/DepartmentSettingsService.cs @@ -121,7 +121,7 @@ public async Task GetBigBoardCenterGpsCoordinatesDepartmentAsync(int dep { if (Framework.LocationHelpers.IsDMSLocation(points[1])) { - newLocation = Framework.LocationHelpers.ConvertDegreeAngleToDouble(points[1]).ToString(); + newLocation = newLocation + Framework.LocationHelpers.ConvertDegreeAngleToDouble(points[1]).ToString(); } else { diff --git a/Core/Resgrid.Services/DepartmentsService.cs b/Core/Resgrid.Services/DepartmentsService.cs index 479f4664..86b02f13 100644 --- a/Core/Resgrid.Services/DepartmentsService.cs +++ b/Core/Resgrid.Services/DepartmentsService.cs @@ -13,6 +13,7 @@ using Resgrid.Providers.Bus; using Resgrid.Model.Identity; using Resgrid.Repositories.DataRepository.Queries.ActionLogs; +using System.Text; namespace Resgrid.Services { @@ -275,7 +276,7 @@ public async Task GetUserIdForDeletedUserInDepartmentAsync(int departmen { var member = await _departmentMembersRepository.GetDepartmentMemberByDepartmentIdAndUserIdAsync(departmentId, userIdToDelete); var auditEvent = new AuditEvent(); - auditEvent.Before = member.CloneJson(); + auditEvent.Before = member.CloneJsonToString(); if (member != null) { @@ -289,7 +290,7 @@ public async Task GetUserIdForDeletedUserInDepartmentAsync(int departmen auditEvent.DepartmentId = departmentId; auditEvent.UserId = deletingUserId; auditEvent.Type = AuditLogTypes.UserRemoved; - auditEvent.After = member2.CloneJson(); + auditEvent.After = member2.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); InvalidateAllDepartmentsCache(departmentId); @@ -511,7 +512,7 @@ public async Task> GetAllPersonnelNamesForDepartmentAsync(int d async Task> getDepartmentPersonnelNames() { return (from i in await _userProfileRepository.GetAllProfilesForDepartmentAsync(departmentId) - select new PersonName{ UserId = i.Value.UserId, FirstName = i.Value.FirstName, LastName = i.Value.LastName}).ToList(); + select new PersonName { UserId = i.Value.UserId, FirstName = i.Value.FirstName, LastName = i.Value.LastName }).ToList(); } if (Config.SystemBehaviorConfig.CacheEnabled) @@ -746,6 +747,107 @@ public async Task GetDepartmentStatsByDepartmentUserIdAsync(int return await _departmentRepository.GetDepartmentStatsByDepartmentUserIdAsync(departmentId, userId); } + public string ConvertDepartmentCodeToDigitPin(string departmentCode) + { + if (String.IsNullOrWhiteSpace(departmentCode)) + return null; + + char[] characters = departmentCode.ToCharArray(); + StringBuilder result = new StringBuilder(); + + foreach (var c in characters) + { + if (char.IsNumber(c)) + result.Append(c); + + switch (char.ToLower(c)) + { + case 'a': + result.Append(0); + break; + case 'b': + result.Append(1); + break; + case 'c': + result.Append(2); + break; + case 'd': + result.Append(3); + break; + case 'e': + result.Append(4); + break; + case 'f': + result.Append(5); + break; + case 'g': + result.Append(6); + break; + case 'h': + result.Append(7); + break; + case 'i': + result.Append(8); + break; + case 'j': + result.Append(9); + break; + case 'k': + result.Append(0); + break; + case 'l': + result.Append(1); + break; + case 'm': + result.Append(2); + break; + case 'n': + result.Append(3); + break; + case 'o': + result.Append(4); + break; + case 'p': + result.Append(5); + break; + case 'q': + result.Append(6); + break; + case 'r': + result.Append(7); + break; + case 's': + result.Append(8); + break; + case 't': + result.Append(9); + break; + case 'u': + result.Append(0); + break; + case 'v': + result.Append(1); + break; + case 'w': + result.Append(2); + break; + case 'x': + result.Append(3); + break; + case 'y': + result.Append(4); + break; + case 'z': + result.Append(5); + break; + default: + break; + } + } + + return result.ToString(); + } + #region Private Methods private static string CreateCode(int passwordLength) { @@ -772,8 +874,8 @@ private async Task FillAdminUsersAsync(Department department) if (department.AdminUsers.Count <= 0) { department.AdminUsers.AddRange((from dm in await _departmentMembersRepository.GetAllByDepartmentIdAsync(department.DepartmentId) - where dm.IsAdmin.GetValueOrDefault() - select dm.UserId)); + where dm.IsAdmin.GetValueOrDefault() + select dm.UserId)); } } diff --git a/Core/Resgrid.Services/EmailService.cs b/Core/Resgrid.Services/EmailService.cs index 6d93d123..153ebd3a 100644 --- a/Core/Resgrid.Services/EmailService.cs +++ b/Core/Resgrid.Services/EmailService.cs @@ -195,7 +195,7 @@ public async Task SendCallAsync(Call call, CallDispatch dispatch, UserProf } string coordinates = "No Coordinates Supplied"; - if (!string.IsNullOrEmpty(call.GeoLocationData)) + if (!string.IsNullOrEmpty(call.GeoLocationData) && call.GeoLocationData.Length > 1) { coordinates = call.GeoLocationData; @@ -267,13 +267,18 @@ public async Task SendTroubleAlert(TroubleAlertEvent troubleAlertEvent, Un string subject = $"TROUBLE ALERT for {unit.Name} located at {unitAddress}"; string dispatchedOn = String.Empty; + Department d = await _departmentsService.GetDepartmentByIdAsync(unit.DepartmentId); - if (call.Department != null) - dispatchedOn = troubleAlertEvent.TimeStamp.Value.FormatForDepartment(call.Department); + if (d != null) + dispatchedOn = troubleAlertEvent.TimeStamp.Value.FormatForDepartment(d); else dispatchedOn = troubleAlertEvent.TimeStamp.Value.ToString("G") + " UTC"; string gpsLocation = "No Unit GPS Location"; + string callName = "No Active Call"; + + if (call != null) + callName = call.Name; if (!String.IsNullOrWhiteSpace(troubleAlertEvent.Latitude) && !String.IsNullOrWhiteSpace(troubleAlertEvent.Longitude)) gpsLocation = $"{troubleAlertEvent.Latitude},{troubleAlertEvent.Longitude}"; @@ -281,7 +286,7 @@ public async Task SendTroubleAlert(TroubleAlertEvent troubleAlertEvent, Un if (profile != null && profile.SendEmail && !String.IsNullOrWhiteSpace(emailAddress)) { await _emailProvider.SendTroubleAlertMail(emailAddress, unit.Name, gpsLocation, "", callAddress, - unitAddress, "", call.Name); + unitAddress, "", callName); return true; } @@ -310,7 +315,7 @@ public async Task SendDistributionListEmail(MimeMessage message, string em message.From.Add(new MailboxAddress(Encoding.ASCII, $"({listUsername}) List", listEmail)); message.To.Clear(); - message.To.Add(new MailboxAddress(emailAddress)); + message.To.Add(new MailboxAddress(name, emailAddress)); message.Headers.Add(new MimeKit.Header(HeaderId.ReturnPath, $"{listUsername}+{emailAddress.Replace("@", "=")}@{Config.InboundEmailConfig.ListsDomain}")); message.Headers.Add(new MimeKit.Header("Return-Path", $"{listUsername}+{emailAddress.Replace("@", "=")}@{Config.InboundEmailConfig.ListsDomain}")); diff --git a/Core/Resgrid.Services/Facades/Stripe/StripeSubscriptionServiceFacade.cs b/Core/Resgrid.Services/Facades/Stripe/StripeSubscriptionServiceFacade.cs index 4186c61c..e9d50114 100644 --- a/Core/Resgrid.Services/Facades/Stripe/StripeSubscriptionServiceFacade.cs +++ b/Core/Resgrid.Services/Facades/Stripe/StripeSubscriptionServiceFacade.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; using Resgrid.Model.Facades.Stripe; using Stripe; @@ -13,12 +15,12 @@ public StripeSubscriptionServiceFacade() _stripeSubscriptionService = new SubscriptionService(); } - public Subscription Get(string customerId, string subscriptionId) + public async Task Get(string customerId, string subscriptionId) { - return _stripeSubscriptionService.Get(subscriptionId); + return await _stripeSubscriptionService.GetAsync(subscriptionId); } - public Subscription Create(string customerId, string planId, SubscriptionCreateOptions createOptions = null) + public async Task Create(string customerId, string planId, SubscriptionCreateOptions createOptions = null) { if (createOptions == null) createOptions = new SubscriptionCreateOptions(); @@ -27,26 +29,58 @@ public Subscription Create(string customerId, string planId, SubscriptionCreateO createOptions.Items = new List(); createOptions.Items.Add(new SubscriptionItemOptions { Plan = planId, Quantity = 1 }); - return _stripeSubscriptionService.Create(createOptions); + return await _stripeSubscriptionService.CreateAsync(createOptions); } - public Subscription Update(string customerId, string subscriptionId, SubscriptionUpdateOptions updateOptions) + public async Task Update(string customerId, string subscriptionId, SubscriptionUpdateOptions updateOptions) { if (updateOptions == null) updateOptions = new SubscriptionUpdateOptions(); - return _stripeSubscriptionService.Update(subscriptionId, updateOptions); + return await _stripeSubscriptionService.UpdateAsync(subscriptionId, updateOptions); } public Subscription Cancel(string customerId, string subscriptionId, bool cancelAtPeriodEnd = false) { + return _stripeSubscriptionService.Cancel(subscriptionId, new SubscriptionCancelOptions { }); + } + + public async Task> List(string customerId, ListOptions listOptions = null) + { + return await _stripeSubscriptionService.ListAsync(new SubscriptionListOptions { Customer = customerId }); + } + + public async Task GetCurrentActiveSub(string customerId) + { + var subs = await _stripeSubscriptionService.ListAsync(new SubscriptionListOptions { Customer = customerId, Status = "active" }); - return _stripeSubscriptionService.Cancel(subscriptionId, new SubscriptionCancelOptions { }); + if (subs == null || subs.Data == null || subs.Data.Count <= 0) + return null; + + return subs.Data[0]; } - public IEnumerable List(string customerId, ListOptions listOptions = null) + public async Task AddAddonToSubscription(string customerId, string addonId) { - return _stripeSubscriptionService.List(new SubscriptionListOptions { Customer = customerId }); + var sub = await GetCurrentActiveSub(customerId); + + var options = new SubscriptionUpdateOptions(); + var addonItem = new SubscriptionItemOptions(); + addonItem.Price = addonId; + options.Items.Add(addonItem); + options.ProrationBehavior = "always_invoice"; + + var newSub = await _stripeSubscriptionService.UpdateAsync(sub.Id, options); + + if (newSub != null && newSub.Items != null && newSub.Items.Data.Count > 0) + { + var newAddonItem = newSub.Items.Data.FirstOrDefault(x => x.Price != null && x.Price.Id == addonId); + + if (addonItem != null) + return true; + } + + return false; } } } diff --git a/Core/Resgrid.Services/FormsService.cs b/Core/Resgrid.Services/FormsService.cs new file mode 100644 index 00000000..2a72d584 --- /dev/null +++ b/Core/Resgrid.Services/FormsService.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Newtonsoft.Json.Linq; +using Resgrid.Model; +using Resgrid.Model.Repositories; +using Resgrid.Model.Services; + +namespace Resgrid.Services +{ + public class FormsService : IFormsService + { + private readonly IFormsRepository _formsRepository; + private readonly IFormAutomationsRepository _formAutomationsRepository; + + public FormsService(IFormsRepository formsRepository, IFormAutomationsRepository formAutomationsRepository) + { + _formsRepository = formsRepository; + _formAutomationsRepository = formAutomationsRepository; + } + + public async Task> GetAllFormsForDepartmentAsync(int departmentId) + { + var items = await _formsRepository.GetAllByDepartmentIdAsync(departmentId); + + foreach (var form in items) + { + form.Automations = (await _formAutomationsRepository.GetFormAutomationsByFormIdAsync(form.FormId)).ToList(); + } + + return items.ToList(); + } + + public async Task> GetAllNonDeletedFormsForDepartmentAsync(int departmentId) + { + var items = await _formsRepository.GetNonDeletedFormsByDepartmentIdAsync(departmentId); + + foreach (var form in items) + { + form.Automations = (await _formAutomationsRepository.GetFormAutomationsByFormIdAsync(form.FormId)).ToList(); + } + + return items.ToList(); + } + + public async Task SaveFormAsync(Form form, CancellationToken cancellationToken = default(CancellationToken)) + { + if (String.IsNullOrWhiteSpace(form.FormId)) + { + form.UpdatedOn = DateTime.UtcNow; + form.CreatedOn = DateTime.UtcNow; + } + else + form.UpdatedOn = DateTime.UtcNow; + + var saved = await _formsRepository.SaveOrUpdateAsync(form, cancellationToken, true); + + if (form.Automations != null) + { + foreach (var a in form.Automations) + { + a.FormId = saved.FormId; + await _formAutomationsRepository.SaveOrUpdateAsync(a, cancellationToken, true); + } + } + + return saved; + } + + public async Task GetFormByIdAsync(string id) + { + var form = await _formsRepository.GetFormByIdAsync(id); + form.Automations = (await _formAutomationsRepository.GetFormAutomationsByFormIdAsync(id)).ToList(); + + return form; + } + + public async Task GetNewCallFormByDepartmentIdAsync(int departmentId) + { + var forms = await GetAllNonDeletedFormsForDepartmentAsync(departmentId); + + if (forms != null && forms.Any()) + return forms.FirstOrDefault(x => x.Type == 0 && x.IsActive == true); + + return null; + } + + public async Task DeleteForm(string id, CancellationToken cancellationToken = default(CancellationToken)) + { + var form = await GetFormByIdAsync(id); + form.IsDeleted = true; + await _formsRepository.SaveOrUpdateAsync(form, cancellationToken); + + return true; + } + + public async Task EnableFormByIdAsync(string id) + { + var form = await GetFormByIdAsync(id); + var forms = await GetAllNonDeletedFormsForDepartmentAsync(form.DepartmentId); + + // For right now, were only going to allow one active form for each type in the system. + var count = forms.Count(x => x.Type == form.Type && x.IsActive == true && x.FormId != form.FormId); + if (count <= 0) + return await _formsRepository.EnableFormByIdAsync(id); + + return false; + } + + public async Task DisableFormByIdAsync(string id) + { + return await _formsRepository.DisableFormByIdAsync(id); + } + + public FormAutomationData ProcessForm(Form form, string data) + { + var formData = new FormAutomationData(); + + if (form == null && (form.Automations == null || !form.Automations.Any())) + return null; + + JObject json = JObject.Parse(data); + + foreach (var automation in form.Automations) + { + + } + + return formData; + } + } +} diff --git a/Core/Resgrid.Services/GeoService.cs b/Core/Resgrid.Services/GeoService.cs index 52785d4b..ea0b75d5 100644 --- a/Core/Resgrid.Services/GeoService.cs +++ b/Core/Resgrid.Services/GeoService.cs @@ -53,7 +53,7 @@ public async Task GetPersonnelEtaInSecondsAsync(ActionLog log) { var call = await _callsService.GetCallByIdAsync(log.DestinationId.Value, false); - if (!String.IsNullOrWhiteSpace(call.GeoLocationData)) + if (!String.IsNullOrWhiteSpace(call.GeoLocationData) && call.GeoLocationData.Length > 1) route = await _geoLocationProvider.GetRoute(log.GeoLocationData, call.GeoLocationData); else route = await _geoLocationProvider.GetRoute(log.GeoLocationData, call.GeoLocationData); diff --git a/Core/Resgrid.Services/NotificationService.cs b/Core/Resgrid.Services/NotificationService.cs index 69095203..edd18e94 100644 --- a/Core/Resgrid.Services/NotificationService.cs +++ b/Core/Resgrid.Services/NotificationService.cs @@ -789,7 +789,10 @@ public async Task GetMessageForTypeAsync(ProcessedNotification notificat var userProfile = await _userProfileService.GetProfileByUserIdAsync(userStaffing.UserId); var userStaffingText = await _customStateService.GetCustomPersonnelStaffingAsync(data.DepartmentId, userStaffing); - return String.Format("{0} staffing is now {1}", userProfile.FullName.AsFirstNameLastName, userStaffingText.ButtonText); + if (userProfile != null && userStaffingText != null) + return String.Format("{0} staffing is now {1}", userProfile.FullName.AsFirstNameLastName, userStaffingText.ButtonText); + else + return String.Empty; } else return String.Empty; @@ -878,8 +881,11 @@ public async Task GetMessageForTypeAsync(ProcessedNotification notificat var userStateChanged = await _userStateService.GetUserStateByIdAsync(int.Parse(notification.Value)); var roleForGroup = await _personnelRolesService.GetRoleByIdAsync(notification.PersonnelRoleTargeted); var groupForRole = await _departmentGroupsService.GetGroupForUserAsync(userStateChanged.UserId, notification.DepartmentId); + // TODO: Check this + if (roleForGroup != null && groupForRole != null) + return String.Format("Availability for role {0} in group {1} is at or below the lower limit", roleForGroup.Name, groupForRole.Name); - return String.Format("Availability for role {0} in group {1} is at or below the lower limit", roleForGroup.Name, groupForRole.Name); + return "Availability for a role is at or below the lower limit"; case EventTypes.RolesInDepartmentAvailabilityAlert: if (notification != null) { diff --git a/Core/Resgrid.Services/NumbersService.cs b/Core/Resgrid.Services/NumbersService.cs index da6dd2da..eddc285c 100644 --- a/Core/Resgrid.Services/NumbersService.cs +++ b/Core/Resgrid.Services/NumbersService.cs @@ -23,14 +23,14 @@ public NumbersService(INumberProvider numberProvider, IDepartmentSettingsService _inboundMessageEventRepository = inboundMessageEventRepository; } - public List GetAvailableNumbers(string country, string areaCode) + public async Task> GetAvailableNumbers(string country, string areaCode) { - return _numberProvider.GetAvailableNumbers(country, areaCode); + return await _numberProvider.GetAvailableNumbers(country, areaCode); } public async Task ProvisionNumberAsync(int departmentId, string number, string country) { - var numberProvisioned = _numberProvider.ProvisionNumber(country, number); + var numberProvisioned = await _numberProvider.ProvisionNumber(country, number); if (numberProvisioned) { diff --git a/Core/Resgrid.Services/ProtocolsService.cs b/Core/Resgrid.Services/ProtocolsService.cs index ad923209..f557ae14 100644 --- a/Core/Resgrid.Services/ProtocolsService.cs +++ b/Core/Resgrid.Services/ProtocolsService.cs @@ -70,9 +70,27 @@ public async Task> GetAllProtocolsForDepartmentAsync(int public async Task GetProtocolByIdAsync(int id) { var protocol = await _dispatchProtocolRepository.GetDispatchProtocolByIdAsync(id); - protocol.Attachments = (await _dispatchProtocolAttachmentRepository.GetDispatchProtocolAttachmentByProtocolIdAsync(id)).ToList(); - protocol.Questions = (await _dispatchProtocolQuestionsRepository.GetDispatchProtocolQuestionsByProtocolIdAsync(id)).ToList(); - protocol.Triggers = (await _dispatchProtocolTriggersRepository.GetDispatchProtocolTriggersByProtocolIdAsync(id)).ToList(); + + if (protocol != null) + { + var attachments = await _dispatchProtocolAttachmentRepository.GetDispatchProtocolAttachmentByProtocolIdAsync(id); + if (attachments != null && attachments.Any()) + protocol.Attachments = attachments.ToList(); + else + protocol.Attachments = new List(); + + var questions = await _dispatchProtocolQuestionsRepository.GetDispatchProtocolQuestionsByProtocolIdAsync(id); + if (questions != null && questions.Any()) + protocol.Questions = questions.ToList(); + else + protocol.Questions = new List(); + + var triggers = await _dispatchProtocolTriggersRepository.GetDispatchProtocolTriggersByProtocolIdAsync(id); + if (triggers != null && triggers.Any()) + protocol.Triggers = triggers.ToList(); + else + protocol.Triggers = new List(); + } return protocol; } diff --git a/Core/Resgrid.Services/PushService.cs b/Core/Resgrid.Services/PushService.cs index e15e0d70..9580a3f1 100644 --- a/Core/Resgrid.Services/PushService.cs +++ b/Core/Resgrid.Services/PushService.cs @@ -64,7 +64,7 @@ public async Task UnRegister(PushUri pushUri) public async Task RegisterUnit(PushUri pushUri) { - string deviceId = pushUri.DeviceId.GetHashCode().ToString(); + //string deviceId = pushUri.DeviceId; List usersDevices = null; try @@ -88,7 +88,7 @@ public async Task RegisterUnit(PushUri pushUri) public async Task UnRegisterUnit(PushUri pushUri) { - await _unitNotificationProvider.UnRegisterPushByUserDeviceId(pushUri); + await _unitNotificationProvider.UnRegisterPush(pushUri); return true; } @@ -163,7 +163,7 @@ public async Task PushCall(StandardPushCall call, string userId, UserProfi public async Task PushCallUnit(StandardPushCall call, int unitId, DepartmentCallPriority priority = null) { - if (Config.SystemBehaviorConfig.DoNotBroadcast && Config.SystemBehaviorConfig.BypassDoNotBroadcastDepartments.Contains(call.DepartmentId.GetValueOrDefault())) + if (Config.SystemBehaviorConfig.DoNotBroadcast && !Config.SystemBehaviorConfig.BypassDoNotBroadcastDepartments.Contains(call.DepartmentId.GetValueOrDefault())) return false; if (call == null) diff --git a/Core/Resgrid.Services/QueueService.cs b/Core/Resgrid.Services/QueueService.cs index 82c46e35..ec6850c1 100644 --- a/Core/Resgrid.Services/QueueService.cs +++ b/Core/Resgrid.Services/QueueService.cs @@ -116,7 +116,7 @@ public async Task GetQueueItemByIdAsync(int queueItemId) //if (Config.SystemBehaviorConfig.IsAzure) //{ // If we have geolocation data, lets get the approx address now. - if (!string.IsNullOrEmpty(cqi.Call.GeoLocationData) && String.IsNullOrWhiteSpace(cqi.Call.Address)) + if (!string.IsNullOrEmpty(cqi.Call.GeoLocationData) && cqi.Call.GeoLocationData.Length > 1 && String.IsNullOrWhiteSpace(cqi.Call.Address)) { try { diff --git a/Core/Resgrid.Services/Resgrid.Services.csproj b/Core/Resgrid.Services/Resgrid.Services.csproj index 252dddd1..5aa97ca4 100644 --- a/Core/Resgrid.Services/Resgrid.Services.csproj +++ b/Core/Resgrid.Services/Resgrid.Services.csproj @@ -1,7 +1,7 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker @@ -10,16 +10,14 @@ - - - - - + + + + - diff --git a/Core/Resgrid.Services/ScheduledTasksService.cs b/Core/Resgrid.Services/ScheduledTasksService.cs index 9d95e741..c03621d6 100644 --- a/Core/Resgrid.Services/ScheduledTasksService.cs +++ b/Core/Resgrid.Services/ScheduledTasksService.cs @@ -9,7 +9,6 @@ using Resgrid.Model.Repositories; using Resgrid.Model.Services; using Resgrid.Model.Providers; -using MoreLinq; namespace Resgrid.Services { diff --git a/Core/Resgrid.Services/ServicesModule.cs b/Core/Resgrid.Services/ServicesModule.cs index a3a08838..37c1381f 100644 --- a/Core/Resgrid.Services/ServicesModule.cs +++ b/Core/Resgrid.Services/ServicesModule.cs @@ -67,9 +67,12 @@ protected override void Load(ContainerBuilder builder) builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); //builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().SingleInstance(); // Stripe Services diff --git a/Core/Resgrid.Services/SmsService.cs b/Core/Resgrid.Services/SmsService.cs index fab9b7c6..4557e6d9 100644 --- a/Core/Resgrid.Services/SmsService.cs +++ b/Core/Resgrid.Services/SmsService.cs @@ -41,14 +41,14 @@ public async Task SendMessageAsync(Message message, string departmentNumbe { string text = HtmlToTextHelper.ConvertHtml(message.Body); text = StringHelpers.StripHtmlTagsCharArray(text); - _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(message.Subject, text), + await _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(message.Subject, text), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, true, false); } else if (Carriers.DirectSendCarriers.Contains((MobileCarriers)profile.MobileCarrier)) { string text = HtmlToTextHelper.ConvertHtml(message.Body); text = StringHelpers.StripHtmlTagsCharArray(text); - _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(message.Subject, text), + await _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(message.Subject, text), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, false, false); } else @@ -65,7 +65,7 @@ public async Task SendMessageAsync(Message message, string departmentNumbe } email.IsBodyHtml = false; - _emailSender.SendEmail(email); + await _emailSender.SendEmail(email); } } @@ -138,7 +138,7 @@ public async Task SendCallAsync(Call call, CallDispatch dispatch, string d // text = text + " " + call.ShortenedCallUrl; //} - _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(call.Name, text), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, true, true); + await _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(call.Name, text), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, true, true); if (Config.SystemBehaviorConfig.SendCallsToSmsEmailGatewayAdditionally) SendCallViaEmailSmsGateway(call, address, profile); @@ -176,7 +176,7 @@ public async Task SendCallAsync(Call call, CallDispatch dispatch, string d // text = text + " " + call.ShortenedCallUrl; //} - _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(call.Name, text), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, false, true); + await _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(call.Name, text), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, false, true); if (Config.SystemBehaviorConfig.SendCallsToSmsEmailGatewayAdditionally) SendCallViaEmailSmsGateway(call, address, profile); @@ -227,15 +227,15 @@ public void SendTroubleAlert(Unit unit, Call call, string unitAddress, string de if (profile != null && profile.SendSms) { - string text = $"TROUBLE ALERT for {unit.Name} at {unitAddress}"; + string text = $"for {unit.Name} at {unitAddress}"; if (Config.SystemBehaviorConfig.DepartmentsToForceSmsGateway.Contains(departmentId)) { - _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(call.Name, text), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, true, false); + _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage("Trouble Alert", text), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, true, false); } else if (Carriers.DirectSendCarriers.Contains((MobileCarriers)profile.MobileCarrier)) { - _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(call.Name, text), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, false, false); + _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage("Trouble Alert", text), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, false, false); } else { @@ -267,7 +267,7 @@ public async Task SendTextAsync(string userId, string title, string messag if (Carriers.DirectSendCarriers.Contains((MobileCarriers)profile.MobileCarrier)) { //string departmentNumber = _departmentSettingsService.GetTextToCallNumberForDepartment(departmentId); - _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(title, message), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, false, false); + await _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), FormatTextForMessage(title, message), departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, false, false); } else { @@ -285,7 +285,7 @@ public async Task SendTextAsync(string userId, string title, string messag } email.IsBodyHtml = false; - _emailSender.SendEmail(email); + await _emailSender.SendEmail(email); } } @@ -303,13 +303,13 @@ public async Task SendNotificationAsync(string userId, int departmentId, s { if (Config.SystemBehaviorConfig.DepartmentsToForceSmsGateway.Contains(departmentId)) { - _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), message, + await _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), message, departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, true, false); } else if (Carriers.DirectSendCarriers.Contains((MobileCarriers)profile.MobileCarrier)) { //string departmentNumber = _departmentSettingsService.GetTextToCallNumberForDepartment(departmentId); - _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), message, + await _textMessageProvider.SendTextMessage(profile.GetPhoneNumber(), message, departmentNumber, (MobileCarriers)profile.MobileCarrier, departmentId, false, false); } else @@ -321,7 +321,7 @@ public async Task SendNotificationAsync(string userId, int departmentId, s email.Body = HtmlToTextHelper.ConvertHtml(message); email.IsBodyHtml = false; - _emailSender.SendEmail(email); + await _emailSender.SendEmail(email); } } diff --git a/Core/Resgrid.Services/SubscriptionsService.cs b/Core/Resgrid.Services/SubscriptionsService.cs index 7354d7fe..a889101c 100644 --- a/Core/Resgrid.Services/SubscriptionsService.cs +++ b/Core/Resgrid.Services/SubscriptionsService.cs @@ -53,7 +53,7 @@ async Task getPayment() var payment = (from p in await _paymentsRepository.GetAllAsync() where p.DepartmentId == departmentId && p.EffectiveOn <= dateTime && p.EndingOn >= dateTime - orderby p.PaymentId descending + orderby p.PaymentId descending select p).FirstOrDefault(); // Sometimes were not getting the plan back, need to get it from the db. @@ -75,9 +75,9 @@ public async Task GetPreviousNonFreePaymentForDepartmentAsync(int depar { // I went with amount here as there could be preview payments, demo payments, etc in the system, no just Plans.FreePaymentId. var payment = (from p in await _paymentsRepository.GetAllAsync() - where p.DepartmentId == departmentId && p.PaymentId < paymentId && p.Amount != 0 - orderby p.PaymentId descending - select p).FirstOrDefault(); + where p.DepartmentId == departmentId && p.PaymentId < paymentId && p.Amount != 0 + orderby p.PaymentId descending + select p).FirstOrDefault(); return payment; } @@ -117,8 +117,8 @@ public async Task GetPlanByExternalIdAsync(string externalId, bool byPassC async Task getPlan() { return (from p in await _plansRepository.GetAllAsync() - where p.ExternalId == externalId - select p).FirstOrDefault(); + where p.ExternalId == externalId + select p).FirstOrDefault(); } if (!byPassCache && Config.SystemBehaviorConfig.CacheEnabled) @@ -143,7 +143,7 @@ public bool ValidateUserSelectableBuyNowPlan(int planId) * plans can be selected by a user to buy now, this will prevent them from changing * the query to a free plan, like Beta 2yr, Unlimited Free or Open preview. */ - if (planId == 20 || planId == 21 || planId == 22 || planId == 23 || planId == 24 || planId == 25 || planId == 26 || + if (planId == 20 || planId == 21 || planId == 22 || planId == 23 || planId == 24 || planId == 25 || planId == 26 || planId == 27 || planId == 28 || planId == 29 || planId == 30 || planId == 31 || planId == 32 || planId == 33) return true; @@ -210,7 +210,7 @@ public List GetPossibleUpgradesForPlan(int planId) public List GetPossibleDowngradesForPlan(int planId) { List plans = new List(); - + return plans; } @@ -247,15 +247,15 @@ public async Task GetAdjustedUpgradePriceAsync(int paymentId, int planId if (days < 0) return 0; else if (days > 365) - days = 0; + days = 0; - double dayCost = adjustedPrice/365; + double dayCost = adjustedPrice / 365; - return adjustedPrice - (days*dayCost); + return adjustedPrice - (days * dayCost); } else { - if (plan.Frequency == (int) PlanFrequency.Monthly && payment.Plan.Frequency == (int) PlanFrequency.Yearly) + if (plan.Frequency == (int)PlanFrequency.Monthly && payment.Plan.Frequency == (int)PlanFrequency.Yearly) { var days = DateTime.UtcNow.Subtract(payment.EffectiveOn).TotalDays; days = Math.Round(days, MidpointRounding.ToEven); @@ -284,7 +284,7 @@ public async Task GetAdjustedUpgradePriceAsync(int paymentId, int planId return 0; } - public Tuple CalculateCyclesTillFirstBill(double balance, double cost) + public Tuple CalculateCyclesTillFirstBill(double balance, double cost) { int cycles = 0; double remainder = -balance; @@ -295,7 +295,7 @@ public Tuple CalculateCyclesTillFirstBill(double balance, double cos remainder += cost; } - return new Tuple(cycles,remainder); + return new Tuple(cycles, remainder); } public async Task CreateOpenPreviewPaymentAsync(int departmentId, string userId, CancellationToken cancellationToken = default(CancellationToken)) @@ -304,7 +304,7 @@ public Tuple CalculateCyclesTillFirstBill(double balance, double cos payment.DepartmentId = departmentId; payment.PurchasingUserId = userId; payment.PlanId = 7; - payment.Method = (int) PaymentMethods.System; + payment.Method = (int)PaymentMethods.System; payment.IsTrial = false; payment.IsUpgrade = false; payment.PurchaseOn = DateTime.UtcNow; @@ -345,5 +345,88 @@ public Tuple CalculateCyclesTillFirstBill(double balance, double cos return saved; } + + public async Task> GetCurrentPaymentAddonsForDepartmentAsync(int departmentId, List planAddonIds) + { + List paymentAddons = new List(); + + if (planAddonIds != null && planAddonIds.Any()) + { + foreach (var planAddonId in planAddonIds) + { + PaymentAddon addon = new PaymentAddon(); + addon.DepartmentId = departmentId; + addon.PlanAddonId = planAddonId; + addon.TransactionId = "SYSTEM"; + addon.Description = "Addon Forever"; + addon.Amount = 0.00; + addon.Cancelled = false; + addon.EffectiveOn = DateTime.UtcNow.AddDays(-1); + addon.EndingOn = DateTime.MaxValue; + + paymentAddons.Add(addon); + } + } + + return paymentAddons; + } + + public async Task> GetAllAddonPlansByTypeAsync(PlanAddonTypes planAddonType) + { + List addons = new List(); + + PlanAddon addon = new PlanAddon(); + addon.AddonType = 1; + addon.Cost = 0; + + addons.Add(addon); + + return addons; + } + + public async Task> GetCurrentPlanAddonsForDepartmentAsync(int departmentId) + { + List addons = new List(); + + PlanAddon addon = new PlanAddon(); + addon.AddonType = 1; + addon.Cost = 0; + + addons.Add(addon); + + return addons; + } + + + public async Task GetPTTAddonPlanForDepartmentAsync(int departmentId) + { + PlanAddon addon = new PlanAddon(); + addon.AddonType = 1; + addon.Cost = 0; + + return addon; + } + + public async Task> GetCurrentPlanAddonsForDepartmentFromStripeAsync(int departmentId) + { + List addons = new List(); + + PlanAddon addon = new PlanAddon(); + addon.AddonType = 1; + addon.Cost = 0; + + addons.Add(addon); + + return addons; + } + + public async Task GetPTTAddonPlanForDepartmentFromStripeAsync(int departmentId) + { + PlanAddon addon = new PlanAddon(); + addon.AddonType = 1; + addon.Cost = 0; + + return addon; + } } } diff --git a/Core/Resgrid.Services/UserProfileService.cs b/Core/Resgrid.Services/UserProfileService.cs index 76988d26..b5f18bd9 100644 --- a/Core/Resgrid.Services/UserProfileService.cs +++ b/Core/Resgrid.Services/UserProfileService.cs @@ -72,6 +72,7 @@ public async Task> GetAllProfilesForDepartmentIn public async Task SaveProfileAsync(int DepartmentId, UserProfile profile, CancellationToken cancellationToken = default(CancellationToken)) { + profile.LastUpdated = DateTime.UtcNow; var savedProfile = await _userProfileRepository.SaveOrUpdateAsync(profile, cancellationToken); ClearUserProfileFromCache(savedProfile.UserId); @@ -142,6 +143,9 @@ public async Task GetProfileByHomeNumberAsync(string number) public async Task> GetSelectedUserProfilesAsync(List userIds) { + if (userIds == null || userIds.Count <= 0) + return new List(); + var items = await _userProfileRepository.GetSelectedUserProfilesAsync(userIds); if (items != null && items.Any()) diff --git a/Core/Resgrid.Services/VoiceService.cs b/Core/Resgrid.Services/VoiceService.cs new file mode 100644 index 00000000..5fad2b1b --- /dev/null +++ b/Core/Resgrid.Services/VoiceService.cs @@ -0,0 +1,197 @@ +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Resgrid.Model; +using Resgrid.Model.Providers; +using Resgrid.Model.Repositories; +using Resgrid.Model.Services; + +namespace Resgrid.Services +{ + public class VoiceService : IVoiceService + { + private readonly IDepartmentVoiceRepository _departmentVoiceRepository; + private readonly IDepartmentVoiceChannelRepository _departmentVoiceChannelRepository; + private readonly IDepartmentVoiceUserRepository _departmentVoiceUserRepository; + private readonly ISubscriptionsService _subscriptionsService; + private readonly IDepartmentsService _departmentsService; + private readonly IVoipProvider _voipProvider; + private readonly IUserProfileService _userProfileService; + + public VoiceService(IDepartmentVoiceRepository departmentVoiceRepository, IDepartmentVoiceChannelRepository departmentVoiceChannelRepository, + IDepartmentVoiceUserRepository departmentVoiceUserRepository, ISubscriptionsService subscriptionsService, IDepartmentsService departmentsService, + IVoipProvider voipProvider, IUserProfileService userProfileService) + { + _departmentVoiceRepository = departmentVoiceRepository; + _departmentVoiceChannelRepository = departmentVoiceChannelRepository; + _departmentVoiceUserRepository = departmentVoiceUserRepository; + _subscriptionsService = subscriptionsService; + _departmentsService = departmentsService; + _voipProvider = voipProvider; + _userProfileService = userProfileService; + } + + public async Task CanDepartmentUseVoiceAsync(int departmentId) + { + var addonPlans = await _subscriptionsService.GetAllAddonPlansByTypeAsync(PlanAddonTypes.PTT); + var addonPayment = await _subscriptionsService.GetCurrentPaymentAddonsForDepartmentAsync(departmentId, addonPlans.Select(x => x.PlanAddonId).ToList()); + + if (addonPayment != null && addonPayment.Count > 0) + return true; + + return false; + } + + public async Task GetVoiceSettingsForDepartmentAsync(int departmentId) + { + var departmentVoice = await _departmentVoiceRepository.GetDepartmentVoiceByDepartmentIdAsync(departmentId); + + return departmentVoice; + } + + public async Task InitializeDepartmentUsersWithVoipProviderAsync(int departmentId, CancellationToken cancellationToken = default(CancellationToken)) + { + if (await CanDepartmentUseVoiceAsync(departmentId)) + { + var department = await _departmentsService.GetDepartmentByIdAsync(departmentId); + var voice = await GetOrCreateDepartmentVoiceRecordAsync(department); + var users = await _departmentsService.GetAllUsersForDepartmentAsync(departmentId, true, true); + var userProfiles = await _userProfileService.GetAllProfilesForDepartmentAsync(departmentId, true); + + if (users != null && users.Any()) + { + foreach (var user in users) + { + var profile = userProfiles[user.UserId]; + + if (profile != null) + { + await SaveUserToVoipProviderAsync(voice, profile, user.Email, cancellationToken); + } + } + + return true; + } + } + + return false; + } + + public async Task GetOrCreateDepartmentVoiceRecordAsync(Department department, CancellationToken cancellationToken = default(CancellationToken)) + { + if (await CanDepartmentUseVoiceAsync(department.DepartmentId)) + { + var voice = await _departmentVoiceRepository.GetDepartmentVoiceByDepartmentIdAsync(department.DepartmentId); + + if (voice != null) + return voice; + + voice = new DepartmentVoice(); + voice.DepartmentId = department.DepartmentId; + voice.StartConferenceNumber = await GetNextConferenceExtensionBaseNumber(); + + var savedVoice = await _departmentVoiceRepository.SaveOrUpdateAsync(voice, cancellationToken); + + return savedVoice; + } + + return null; + } + + public async Task SaveUserToVoipProviderAsync(DepartmentVoice voice, UserProfile profile, string emailAddress, CancellationToken cancellationToken = default(CancellationToken)) + { + if (await CanDepartmentUseVoiceAsync(voice.DepartmentId)) + { + var userVoice = await _departmentVoiceUserRepository.GetDepartmentVoiceUserByUserIdAsync(profile.UserId); + string systemUserId = string.Empty; + string deviceId = string.Empty; + + if (userVoice != null) + { + if (!string.IsNullOrWhiteSpace(userVoice.SystemUserId)) + systemUserId = userVoice.SystemUserId; + + if (!string.IsNullOrWhiteSpace(userVoice.SystemDeviceId)) + deviceId = userVoice.SystemDeviceId; + } + + systemUserId = await _voipProvider.CreateUserIfNotExistsAsync(systemUserId, emailAddress, profile, voice.DepartmentId); + deviceId = await _voipProvider.CreateDeviceForUserIfNotExistsAsync(systemUserId, deviceId, profile, voice.DepartmentId); + + if (userVoice == null) + userVoice = new DepartmentVoiceUser(); + + userVoice.DepartmentVoiceId = voice.DepartmentVoiceId; + userVoice.UserId = profile.UserId; + userVoice.SystemUserId = systemUserId; + userVoice.SystemDeviceId = deviceId; + + var savedResult = await _departmentVoiceUserRepository.SaveOrUpdateAsync(userVoice, cancellationToken, true); + + return savedResult; + } + + return null; + } + + public async Task SaveChannelToVoipProviderAsync(Department department, string name, CancellationToken cancellationToken = default(CancellationToken)) + { + if (await CanDepartmentUseVoiceAsync(department.DepartmentId)) + { + var voice = await _departmentVoiceRepository.GetDepartmentVoiceByDepartmentIdAsync(department.DepartmentId); + int confNumber = voice.StartConferenceNumber; + bool isDefault = true; + DepartmentVoiceChannel channel = null; + var existingChannels = await _departmentVoiceChannelRepository.GetDepartmentVoiceChannelByDepartmentIdAsync(voice.DepartmentId); + + if (existingChannels != null && existingChannels.Any()) + { + channel = existingChannels.FirstOrDefault(x => x.Name == name); + confNumber = existingChannels.OrderByDescending(x => x.ConferenceNumber).First().ConferenceNumber + Config.VoipConfig.BaseChannelExtensionBump; + isDefault = false; + } + + if (channel == null) + channel = new DepartmentVoiceChannel(); + + var conference = await _voipProvider.CreateConferenceIfNotExistsAsync(channel.DepartmentVoiceChannelId, voice.DepartmentId, name, + _departmentsService.ConvertDepartmentCodeToDigitPin(department.Code), confNumber); + + if (conference != null) + { + channel.DepartmentId = department.DepartmentId; + channel.DepartmentVoiceId = voice.DepartmentVoiceId; + channel.ConferenceNumber = confNumber; + channel.SystemConferenceId = conference.Item1; + channel.SystemCallflowId = conference.Item2; + channel.Name = name; + channel.IsDefault = isDefault; + + var savedChannel = await _departmentVoiceChannelRepository.SaveOrUpdateAsync(channel, cancellationToken); + + return savedChannel; + } + } + + return null; + } + + public async Task GetOpenViduSessionToken(string sessionId) + { + var result = await _voipProvider.CreateOpenViduSessionAndGetToken(sessionId); + + return result; + } + + private async Task GetNextConferenceExtensionBaseNumber() + { + var voiceDepartments = await _departmentVoiceRepository.GetAllAsync(); + var latestVoiceDepartment = voiceDepartments.OrderByDescending(x => x.StartConferenceNumber).FirstOrDefault(); + + if (latestVoiceDepartment == null) + return Config.VoipConfig.BaseChannelExtensionNumber; + + return latestVoiceDepartment.StartConferenceNumber + Config.VoipConfig.BaseChannelExtensionBump; + } + } +} diff --git a/Docker/.dockerignore b/Docker/.dockerignore new file mode 100644 index 00000000..e7b690f1 --- /dev/null +++ b/Docker/.dockerignore @@ -0,0 +1,25 @@ +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md diff --git a/Docker/db/Dockerfile b/Docker/db/Dockerfile new file mode 100644 index 00000000..5ed8488f --- /dev/null +++ b/Docker/db/Dockerfile @@ -0,0 +1,11 @@ +FROM mcr.microsoft.com/mssql/server:2019-CU13-ubuntu-20.04 + +WORKDIR /usr/src/app + +COPY create-databases.sql /usr/src/app/create-databases.sql +COPY initdbs.sh /usr/src/app/initdbs.sh +COPY entrypoint.sh /usr/src/app/entrypoint.sh + +EXPOSE 1433 + +CMD /bin/bash ./entrypoint.sh diff --git a/Docker/db/create-databases.sql b/Docker/db/create-databases.sql new file mode 100644 index 00000000..23e833c1 --- /dev/null +++ b/Docker/db/create-databases.sql @@ -0,0 +1,17 @@ +IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'Resgrid') + BEGIN + CREATE DATABASE Resgrid; + END +GO + +IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'ResgridWorkers') + BEGIN + CREATE DATABASE ResgridWorkers; + END +GO + +IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'ResgridOIDC') + BEGIN + CREATE DATABASE ResgridOIDC; + END +GO \ No newline at end of file diff --git a/Docker/db/entrypoint.sh b/Docker/db/entrypoint.sh new file mode 100755 index 00000000..8737f91c --- /dev/null +++ b/Docker/db/entrypoint.sh @@ -0,0 +1 @@ +/usr/src/app/initdbs.sh & /opt/mssql/bin/sqlservr \ No newline at end of file diff --git a/Docker/db/initdbs.sh b/Docker/db/initdbs.sh new file mode 100755 index 00000000..75a3c5ef --- /dev/null +++ b/Docker/db/initdbs.sh @@ -0,0 +1,2 @@ +sleep 90s +/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Resgrid123!! -d master -i create-databases.sql \ No newline at end of file diff --git a/docker-compose.dcproj b/Docker/docker-compose.dcproj similarity index 81% rename from docker-compose.dcproj rename to Docker/docker-compose.dcproj index f2908320..eb39a4cb 100644 --- a/docker-compose.dcproj +++ b/Docker/docker-compose.dcproj @@ -23,11 +23,13 @@ resgrid.webcore - - docker-compose.yml - + + + + + - + \ No newline at end of file diff --git a/Docker/docker-compose.yml b/Docker/docker-compose.yml new file mode 100644 index 00000000..d68a5c1f --- /dev/null +++ b/Docker/docker-compose.yml @@ -0,0 +1,104 @@ +version: '3.9' + +services: + web: + image: "resgridllc/resgridwebcore:0.5.23" + ports: + - "5151:80" + env_file: + - resgrid.env + depends_on: + - api + - events + - db + - redis + - rabbitmq + - worker + environment: + - WAIT_HOSTS=db:1433,redis:6379,rabbitmq:15672,api:80 + - WAIT_TIMEOUT=300 + + api: + image: "resgridllc/resgridwebservices:0.5.23" + ports: + - "5152:80" + env_file: + - resgrid.env + depends_on: + - events + - db + - redis + - rabbitmq + - worker + environment: + - WAIT_HOSTS=db:1433,redis:6379,rabbitmq:15672,events:80 + - WAIT_TIMEOUT=300 + + events: + image: "resgridllc/resgridwebevents:0.5.23" + ports: + - "5153:80" + env_file: + - resgrid.env + depends_on: + - db + - redis + - rabbitmq + environment: + - WAIT_HOSTS=db:1433,redis:6379,rabbitmq:15672 + - WAIT_AFTER=120 + - WAIT_TIMEOUT=300 + + worker: + image: "resgridllc/resgridworkersconsole:0.5.23" + env_file: + - resgrid.env + depends_on: + - db + - redis + - rabbitmq + environment: + - WAIT_HOSTS=db:1433,redis:6379,rabbitmq:15672 + - WAIT_AFTER=90 + - WAIT_TIMEOUT=180 + + db: + ports: + - "5157:1433" + build: ./db + environment: + - SA_PASSWORD=Resgrid123!! + - ACCEPT_EULA=Y + - MSSQL_PID=Express + volumes: + - type: bind + source: ./docker-data/sql/data + target: /var/opt/mssql/data + - type: bind + source: ./docker-data/sql/log + target: /var/opt/mssql/log + - type: bind + source: ./docker-data/sql/backup + target: /var/opt/mssql/backup + + redis: + image: "redis:alpine" + command: redis-server --save 60 1 --loglevel warning + ports: + - "5158:6379" + + rabbitmq: + image: rabbitmq:3-management + environment: + - RABBITMQ_DEFAULT_USER=resgrid + - RABBITMQ_DEFAULT_PASS=Resgrid321! + ports: + - "5160:15672" + - "5159:5672" + + elk: + image: sebp/elk + ports: + - "5163:5601" + - "5164:9200" + - "5165:5044" diff --git a/Docker/docker-data/dms/config/mailconfig b/Docker/docker-data/dms/config/mailconfig new file mode 100755 index 00000000..e69de29b diff --git a/Docker/docker-data/dms/mail-data/maildata b/Docker/docker-data/dms/mail-data/maildata new file mode 100755 index 00000000..e69de29b diff --git a/Docker/docker-data/dms/mail-logs/maillogs b/Docker/docker-data/dms/mail-logs/maillogs new file mode 100755 index 00000000..e69de29b diff --git a/Docker/docker-data/dms/mail-state/mailstate b/Docker/docker-data/dms/mail-state/mailstate new file mode 100755 index 00000000..e69de29b diff --git a/Docker/docker-data/sql/backup/sqlbackups b/Docker/docker-data/sql/backup/sqlbackups new file mode 100755 index 00000000..e69de29b diff --git a/Docker/docker-data/sql/data/sqldata b/Docker/docker-data/sql/data/sqldata new file mode 100755 index 00000000..e69de29b diff --git a/Docker/docker-data/sql/log/sqllogs b/Docker/docker-data/sql/log/sqllogs new file mode 100755 index 00000000..e69de29b diff --git a/Docker/mailserver.env b/Docker/mailserver.env new file mode 100644 index 00000000..8a1fb219 --- /dev/null +++ b/Docker/mailserver.env @@ -0,0 +1,526 @@ +# ----------------------------------------------- +# --- Mailserver Environment Variables ---------- +# ----------------------------------------------- + +# DOCUMENTATION FOR THESE VARIABLES IS FOUND UNDER +# https://docker-mailserver.github.io/docker-mailserver/edge/config/environment/ + +# ----------------------------------------------- +# --- General Section --------------------------- +# ----------------------------------------------- + +# empty => uses the `hostname` command to get the mail server's canonical hostname +# => Specify a fully-qualified domainname to serve mail for. This is used for many of the config features so if you can't set your hostname (e.g. you're in a container platform that doesn't let you) specify it in this environment variable. +OVERRIDE_HOSTNAME= + +# 0 => Debug disabled +# 1 => Enables debug on startup +DMS_DEBUG=0 + +# critical => Only show critical messages +# error => Only show erroneous output +# **warn** => Show warnings +# info => Normal informational output +# debug => Also show debug messages +SUPERVISOR_LOGLEVEL= + +# 0 => mail state in default directories +# 1 => consolidate all states into a single directory (`/var/mail-state`) to allow persistence using docker volumes +ONE_DIR=1 + +# empty => postmaster@domain.com +# => Specify the postmaster address +POSTMASTER_ADDRESS= + +# Check for updates on container start and then once a day +# If an update is available, a mail is sent to POSTMASTER_ADDRESS +# 0 => Update check disabled +# 1 => Update check enabled +ENABLE_UPDATE_CHECK=1 + +# Customize the update check interval. +# Number + Suffix. Suffix must be 's' for seconds, 'm' for minutes, 'h' for hours or 'd' for days. +UPDATE_CHECK_INTERVAL=1d + +# Set different options for mynetworks option (can be overwrite in postfix-main.cf) +# **WARNING**: Adding the docker network's gateway to the list of trusted hosts, e.g. using the `network` or +# `connected-networks` option, can create an open relay +# https://github.com/docker-mailserver/docker-mailserver/issues/1405#issuecomment-590106498 +# The same can happen for rootless podman. To prevent this, set the value to "none" or configure slirp4netns +# https://github.com/docker-mailserver/docker-mailserver/issues/2377 +# +# none => Explicitly force authentication +# container => Container IP address only +# host => Add docker container network (ipv4 only) +# network => Add all docker container networks (ipv4 only) +# connected-networks => Add all connected docker networks (ipv4 only) +PERMIT_DOCKER=none + +# In case you network interface differs from 'eth0', e.g. when you are using HostNetworking in Kubernetes, +# you can set NETWORK_INTERFACE to whatever interface you want. This interface will then be used. +# - **empty** => eth0 +NETWORK_INTERFACE= + +# empty => modern +# modern => Enables TLSv1.2 and modern ciphers only. (default) +# intermediate => Enables TLSv1, TLSv1.1 and TLSv1.2 and broad compatibility ciphers. +TLS_LEVEL= + +# Configures the handling of creating mails with forged sender addresses. +# +# empty => (not recommended, but default for backwards compatibility reasons) +# Mail address spoofing allowed. Any logged in user may create email messages with a forged sender address. +# See also https://en.wikipedia.org/wiki/Email_spoofing +# 1 => (recommended) Mail spoofing denied. Each user may only send with his own or his alias addresses. +# Addresses with extension delimiters(http://www.postfix.org/postconf.5.html#recipient_delimiter) are not able to send messages. +SPOOF_PROTECTION= + +# Enables the Sender Rewriting Scheme. SRS is needed if your mail server acts as forwarder. See [postsrsd](https://github.com/roehling/postsrsd/blob/master/README.md#sender-rewriting-scheme-crash-course) for further explanation. +# - **0** => Disabled +# - 1 => Enabled +ENABLE_SRS=0 + +# 1 => Enables POP3 service +# empty => disables POP3 +ENABLE_POP3= +ENABLE_CLAMAV=0 + +# Amavis content filter (used for ClamAV & SpamAssassin) +# 0 => Disabled +# 1 => Enabled +ENABLE_AMAVIS=0 + +# -1/-2/-3 => Only show errors +# **0** => Show warnings +# 1/2 => Show default informational output +# 3/4/5 => log debug information (very verbose) +AMAVIS_LOGLEVEL=0 + +# This enables the [zen.spamhaus.org](https://www.spamhaus.org/zen/) DNS block list in postfix +# and various [lists](https://github.com/docker-mailserver/docker-mailserver/blob/f7465a50888eef909dbfc01aff4202b9c7d8bc00/target/postfix/main.cf#L58-L66) in postscreen. +# Note: Emails will be rejected, if they don't pass the block list checks! +# **0** => DNS block lists are disabled +# 1 => DNS block lists are enabled +ENABLE_DNSBL=0 + +# If you enable Fail2Ban, don't forget to add the following lines to your `docker-compose.yml`: +# cap_add: +# - NET_ADMIN +# Otherwise, `iptables` won't be able to ban IPs. +ENABLE_FAIL2BAN=0 + +# Fail2Ban blocktype +# drop => drop packet (send NO reply) +# reject => reject packet (send ICMP unreachable) +FAIL2BAN_BLOCKTYPE=drop + +# 1 => Enables Managesieve on port 4190 +# empty => disables Managesieve +ENABLE_MANAGESIEVE= + +# **enforce** => Allow other tests to complete. Reject attempts to deliver mail with a 550 SMTP reply, and log the helo/sender/recipient information. Repeat this test the next time the client connects. +# drop => Drop the connection immediately with a 521 SMTP reply. Repeat this test the next time the client connects. +# ignore => Ignore the failure of this test. Allow other tests to complete. Repeat this test the next time the client connects. This option is useful for testing and collecting statistics without blocking mail. +POSTSCREEN_ACTION=enforce + +# empty => all daemons start +# 1 => only launch postfix smtp +SMTP_ONLY= + +# Please read [the SSL page in the documentation](https://docker-mailserver.github.io/docker-mailserver/edge/config/security/ssl) for more information. +# +# empty => SSL disabled +# letsencrypt => Enables Let's Encrypt certificates +# custom => Enables custom certificates +# manual => Let's you manually specify locations of your SSL certificates for non-standard cases +# self-signed => Enables self-signed certificates +SSL_TYPE= + +# These are only supported with `SSL_TYPE=manual`. +# Provide the path to your cert and key files that you've mounted access to within the container. +SSL_CERT_PATH= +SSL_KEY_PATH= +# Optional: A 2nd certificate can be supported as fallback (dual cert support), eg ECDSA with an RSA fallback. +# Useful for additional compatibility with older MTA and MUA (eg pre-2015). +SSL_ALT_CERT_PATH= +SSL_ALT_KEY_PATH= + +# Set how many days a virusmail will stay on the server before being deleted +# empty => 7 days +VIRUSMAILS_DELETE_DELAY= + +# This Option is activating the Usage of POSTFIX_DAGENT to specify a lmtp client different from default dovecot socket. +# empty => disabled +# 1 => enabled +ENABLE_POSTFIX_VIRTUAL_TRANSPORT= + +# Enabled by ENABLE_POSTFIX_VIRTUAL_TRANSPORT. Specify the final delivery of postfix +# +# empty => fail +# `lmtp:unix:private/dovecot-lmtp` (use socket) +# `lmtps:inet::` (secure lmtp with starttls, take a look at https://sys4.de/en/blog/2014/11/17/sicheres-lmtp-mit-starttls-in-dovecot/) +# `lmtp::2003` (use kopano as mailstore) +# etc. +POSTFIX_DAGENT= + +# Set the mailbox size limit for all users. If set to zero, the size will be unlimited (default). +# +# empty => 0 +POSTFIX_MAILBOX_SIZE_LIMIT= + +# See https://docker-mailserver.github.io/docker-mailserver/edge/config/user-management/accounts/#notes +# 0 => Dovecot quota is disabled +# 1 => Dovecot quota is enabled +ENABLE_QUOTAS=1 + +# Set the message size limit for all users. If set to zero, the size will be unlimited (not recommended!) +# +# empty => 10240000 (~10 MB) +POSTFIX_MESSAGE_SIZE_LIMIT= + +# Mails larger than this limit won't be scanned. +# ClamAV must be enabled (ENABLE_CLAMAV=1) for this. +# +# empty => 25M (25 MB) +CLAMAV_MESSAGE_SIZE_LIMIT= + +# Enables regular pflogsumm mail reports. +# This is a new option. The old REPORT options are still supported for backwards compatibility. If this is not set and reports are enabled with the old options, logrotate will be used. +# +# not set => No report +# daily_cron => Daily report for the previous day +# logrotate => Full report based on the mail log when it is rotated +PFLOGSUMM_TRIGGER= + +# Recipient address for pflogsumm reports. +# +# not set => Use REPORT_RECIPIENT or POSTMASTER_ADDRESS +# => Specify the recipient address(es) +PFLOGSUMM_RECIPIENT= + +# Sender address (`FROM`) for pflogsumm reports if pflogsumm reports are enabled. +# +# not set => Use REPORT_SENDER +# => Specify the sender address +PFLOGSUMM_SENDER= + +# Interval for logwatch report. +# +# none => No report is generated +# daily => Send a daily report +# weekly => Send a report every week +LOGWATCH_INTERVAL= + +# Recipient address for logwatch reports if they are enabled. +# +# not set => Use REPORT_RECIPIENT or POSTMASTER_ADDRESS +# => Specify the recipient address(es) +LOGWATCH_RECIPIENT= + +# Sender address (`FROM`) for logwatch reports if logwatch reports are enabled. +# +# not set => Use REPORT_SENDER +# => Specify the sender address +LOGWATCH_SENDER= + +# Defines who receives reports if they are enabled. +# **empty** => ${POSTMASTER_ADDRESS} +# => Specify the recipient address +REPORT_RECIPIENT= + +# Defines who sends reports if they are enabled. +# **empty** => mailserver-report@${DOMAINNAME} +# => Specify the sender address +REPORT_SENDER= + +# Changes the interval in which log files are rotated +# **weekly** => Rotate log files weekly +# daily => Rotate log files daily +# monthly => Rotate log files monthly +# +# Note: This Variable actually controls logrotate inside the container +# and rotates the log files depending on this setting. The main log output is +# still available in its entirety via `docker logs mail` (Or your +# respective container name). If you want to control logrotation for +# the Docker-generated logfile see: +# https://docs.docker.com/config/containers/logging/configure/ +# +# Note: This variable can also determine the interval for Postfix's log summary reports, see [`PFLOGSUMM_TRIGGER`](#pflogsumm_trigger). +LOGROTATE_INTERVAL=weekly + +# Choose TCP/IP protocols for postfix to use +# **all** => All possible protocols. +# ipv4 => Use only IPv4 traffic. Most likely you want this behind Docker. +# ipv6 => Use only IPv6 traffic. +# +# Note: More details at http://www.postfix.org/postconf.5.html#inet_protocols +POSTFIX_INET_PROTOCOLS=all + +# Choose TCP/IP protocols for dovecot to use +# **all** => Listen on all interfaces +# ipv4 => Listen only on IPv4 interfaces. Most likely you want this behind Docker. +# ipv6 => Listen only on IPv6 interfaces. +# +# Note: More information at https://dovecot.org/doc/dovecot-example.conf +DOVECOT_INET_PROTOCOLS=all + +# ----------------------------------------------- +# --- SpamAssassin Section ---------------------- +# ----------------------------------------------- + +ENABLE_SPAMASSASSIN=0 + +# deliver spam messages in the inbox (eventually tagged using SA_SPAM_SUBJECT) +SPAMASSASSIN_SPAM_TO_INBOX=1 + +# KAM is a 3rd party SpamAssassin ruleset, provided by the McGrail Foundation. +# If SpamAssassin is enabled, KAM can be used in addition to the default ruleset. +# - **0** => KAM disabled +# - 1 => KAM enabled +# +# Note: only has an effect if `ENABLE_SPAMASSASSIN=1` +ENABLE_SPAMASSASSIN_KAM=0 + +# spam messages will be moved in the Junk folder (SPAMASSASSIN_SPAM_TO_INBOX=1 required) +MOVE_SPAM_TO_JUNK=1 + +# add spam info headers if at, or above that level: +SA_TAG=2.0 + +# add 'spam detected' headers at that level +SA_TAG2=6.31 + +# triggers spam evasive actions +SA_KILL=6.31 + +# add tag to subject if spam detected +SA_SPAM_SUBJECT=***SPAM***** + +# ----------------------------------------------- +# --- Fetchmail Section ------------------------- +# ----------------------------------------------- + +ENABLE_FETCHMAIL=0 + +# The interval to fetch mail in seconds +FETCHMAIL_POLL=300 + +# ----------------------------------------------- +# --- LDAP Section ------------------------------ +# ----------------------------------------------- + +# A second container for the ldap service is necessary (i.e. https://github.com/osixia/docker-openldap) +# For preparing the ldap server to use in combination with this container this article may be helpful: http://acidx.net/wordpress/2014/06/installing-a-mailserver-with-postfix-dovecot-sasl-ldap-roundcube/ + +# empty => LDAP authentification is disabled +# 1 => LDAP authentification is enabled +ENABLE_LDAP= + +# empty => no +# yes => LDAP over TLS enabled for Postfix +LDAP_START_TLS= + +# If you going to use the mailserver in combination with docker-compose you can set the service name here +# empty => mail.domain.com +# Specify the dns-name/ip-address where the ldap-server +LDAP_SERVER_HOST= + +# empty => ou=people,dc=domain,dc=com +# => e.g. LDAP_SEARCH_BASE=dc=mydomain,dc=local +LDAP_SEARCH_BASE= + +# empty => cn=admin,dc=domain,dc=com +# => take a look at examples of SASL_LDAP_BIND_DN +LDAP_BIND_DN= + +# empty** => admin +# => Specify the password to bind against ldap +LDAP_BIND_PW= + +# e.g. `"(&(mail=%s)(mailEnabled=TRUE))"` +# => Specify how ldap should be asked for users +LDAP_QUERY_FILTER_USER= + +# e.g. `"(&(mailGroupMember=%s)(mailEnabled=TRUE))"` +# => Specify how ldap should be asked for groups +LDAP_QUERY_FILTER_GROUP= + +# e.g. `"(&(mailAlias=%s)(mailEnabled=TRUE))"` +# => Specify how ldap should be asked for aliases +LDAP_QUERY_FILTER_ALIAS= + +# e.g. `"(&(|(mail=*@%s)(mailalias=*@%s)(mailGroupMember=*@%s))(mailEnabled=TRUE))"` +# => Specify how ldap should be asked for domains +LDAP_QUERY_FILTER_DOMAIN= + +# ----------------------------------------------- +# --- Dovecot Section --------------------------- +# ----------------------------------------------- + +# empty => no +# yes => LDAP over TLS enabled for Dovecot +DOVECOT_TLS= + +# e.g. `"(&(objectClass=PostfixBookMailAccount)(uniqueIdentifier=%n))"` +DOVECOT_USER_FILTER= + +# e.g. `"(&(objectClass=PostfixBookMailAccount)(uniqueIdentifier=%n))"` +DOVECOT_PASS_FILTER= + +# Define the mailbox format to be used +# default is maildir, supported values are: sdbox, mdbox, maildir +DOVECOT_MAILBOX_FORMAT=maildir + +# empty => no +# yes => Allow bind authentication for LDAP +# https://wiki.dovecot.org/AuthDatabase/LDAP/AuthBinds +DOVECOT_AUTH_BIND= + +# ----------------------------------------------- +# --- Postgrey Section -------------------------- +# ----------------------------------------------- + +ENABLE_POSTGREY=0 +# greylist for N seconds +POSTGREY_DELAY=300 +# delete entries older than N days since the last time that they have been seen +POSTGREY_MAX_AGE=35 +# response when a mail is greylisted +POSTGREY_TEXT="Delayed by Postgrey" +# whitelist host after N successful deliveries (N=0 to disable whitelisting) +POSTGREY_AUTO_WHITELIST_CLIENTS=5 + +# ----------------------------------------------- +# --- SASL Section ------------------------------ +# ----------------------------------------------- + +ENABLE_SASLAUTHD=0 + +# empty => pam +# `ldap` => authenticate against ldap server +# `shadow` => authenticate against local user db +# `mysql` => authenticate against mysql db +# `rimap` => authenticate against imap server +# Note: can be a list of mechanisms like pam ldap shadow +SASLAUTHD_MECHANISMS= + +# empty => None +# e.g. with SASLAUTHD_MECHANISMS rimap you need to specify the ip-address/servername of the imap server ==> xxx.xxx.xxx.xxx +SASLAUTHD_MECH_OPTIONS= + +# empty => Use value of LDAP_SERVER_HOST +# Note: since version 10.0.0, you can specify a protocol here (like ldaps://); this deprecates SASLAUTHD_LDAP_SSL. +SASLAUTHD_LDAP_SERVER= + +# empty => Use value of LDAP_BIND_DN +# specify an object with priviliges to search the directory tree +# e.g. active directory: SASLAUTHD_LDAP_BIND_DN=cn=Administrator,cn=Users,dc=mydomain,dc=net +# e.g. openldap: SASLAUTHD_LDAP_BIND_DN=cn=admin,dc=mydomain,dc=net +SASLAUTHD_LDAP_BIND_DN= + +# empty => Use value of LDAP_BIND_PW +SASLAUTHD_LDAP_PASSWORD= + +# empty => Use value of LDAP_SEARCH_BASE +# specify the search base +SASLAUTHD_LDAP_SEARCH_BASE= + +# empty => default filter `(&(uniqueIdentifier=%u)(mailEnabled=TRUE))` +# e.g. for active directory: `(&(sAMAccountName=%U)(objectClass=person))` +# e.g. for openldap: `(&(uid=%U)(objectClass=person))` +SASLAUTHD_LDAP_FILTER= + +# empty => no +# yes => LDAP over TLS enabled for SASL +# If set to yes, the protocol in SASLAUTHD_LDAP_SERVER must be ldap:// or missing. +SASLAUTHD_LDAP_START_TLS= + +# empty => no +# yes => Require and verify server certificate +# If yes you must/could specify SASLAUTHD_LDAP_TLS_CACERT_FILE or SASLAUTHD_LDAP_TLS_CACERT_DIR. +SASLAUTHD_LDAP_TLS_CHECK_PEER= + +# File containing CA (Certificate Authority) certificate(s). +# empty => Nothing is added to the configuration +# Any value => Fills the `ldap_tls_cacert_file` option +SASLAUTHD_LDAP_TLS_CACERT_FILE= + +# Path to directory with CA (Certificate Authority) certificates. +# empty => Nothing is added to the configuration +# Any value => Fills the `ldap_tls_cacert_dir` option +SASLAUTHD_LDAP_TLS_CACERT_DIR= + +# Specify what password attribute to use for password verification. +# empty => Nothing is added to the configuration but the documentation says it is `userPassword` by default. +# Any value => Fills the `ldap_password_attr` option +SASLAUTHD_LDAP_PASSWORD_ATTR= + +# empty => No sasl_passwd will be created +# string => `/etc/postfix/sasl_passwd` will be created with the string as password +SASL_PASSWD= + +# empty => `bind` will be used as a default value +# `fastbind` => The fastbind method is used +# `custom` => The custom method uses userPassword attribute to verify the password +SASLAUTHD_LDAP_AUTH_METHOD= + +# Specify the authentication mechanism for SASL bind +# empty => Nothing is added to the configuration +# Any value => Fills the `ldap_mech` option +SASLAUTHD_LDAP_MECH= + +# ----------------------------------------------- +# --- SRS Section ------------------------------- +# ----------------------------------------------- + +# envelope_sender => Rewrite only envelope sender address (default) +# header_sender => Rewrite only header sender (not recommended) +# envelope_sender,header_sender => Rewrite both senders +# An email has an "envelope" sender (indicating the sending server) and a +# "header" sender (indicating who sent it). More strict SPF policies may require +# you to replace both instead of just the envelope sender. +SRS_SENDER_CLASSES=envelope_sender + +# empty => Envelope sender will be rewritten for all domains +# provide comma separated list of domains to exclude from rewriting +SRS_EXCLUDE_DOMAINS= + +# empty => generated when the image is built +# provide a secret to use in base64 +# you may specify multiple keys, comma separated. the first one is used for +# signing and the remaining will be used for verification. this is how you +# rotate and expire keys +SRS_SECRET= + +# ----------------------------------------------- +# --- Default Relay Host Section ---------------- +# ----------------------------------------------- + +# Setup relaying all mail through a default relay host +# +# empty => don't configure default relay host +# default host and optional port to relay all mail through +DEFAULT_RELAY_HOST= + +# ----------------------------------------------- +# --- Multi-Domain Relay Section ---------------- +# ----------------------------------------------- + +# Setup relaying for multiple domains based on the domain name of the sender +# optionally uses usernames and passwords in postfix-sasl-password.cf and relay host mappings in postfix-relaymap.cf +# +# empty => don't configure relay host +# default host to relay mail through +RELAY_HOST= + +# empty => 25 +# default port to relay mail +RELAY_PORT=25 + +# empty => no default +# default relay username (if no specific entry exists in postfix-sasl-password.cf) +RELAY_USER= + +# empty => no default +# password for default relay user +RELAY_PASSWORD= diff --git a/Docker/resgrid.env b/Docker/resgrid.env new file mode 100644 index 00000000..4d7dac42 --- /dev/null +++ b/Docker/resgrid.env @@ -0,0 +1,213 @@ +# ----------------------------------------------- +# ------ Resgrid Environment Variables ---------- +# ----------------------------------------------- + +# DOCUMENTATION FOR THESE VARIABLES IS FOUND UNDER +# https://resgrid-core.readthedocs.io/en/latest/docker/index.html + +# ----------------------------------------------- +# --- System Behavior Config Section ------------ +# ----------------------------------------------- + +# Url to access the Resgrid api (required) +# Note: localhost will only support local access, you must replace localhost (or localhost:5152) with an IP Address or server name for external (non-local) access +RESGRID__SystemBehaviorConfig__ResgridApiBaseUrl=http://localhost:5152 + +# Url to access the Resgrid web interface (required) +# Note: localhost will only support local access, you must replace localhost (or localhost:5151) with an IP Address or server name for external (non-local) access +RESGRID__SystemBehaviorConfig__ResgridBaseUrl=http://localhost:5151 + +# Url to access the Resgrid events site (required) +# Note: localhost will only support local access, you must replace localhost (or localhost:5153) with an IP Address or server name for external (non-local) access +RESGRID__SystemBehaviorConfig__ResgridEventingBaseUrl=http://localhost:5153 + +# Environment system is currently running in +# 0 => Production +# 1 => Staging +# 2 => QA +# 3 => Development +RESGRID__SystemBehaviorConfig__Environment=3 + +# Error logging system use by Resgrid +# 0 => Elk-Elastic (MUST: Configure ELK Config Section) +# 1 => Sentry.io (MUST: ) +RESGRID__SystemBehaviorConfig__ErrorLoggerType=0 + +# Outbound Email Provider +# 0 => Postmark (MUST: Configure Postmark Config Section) +# 1 => Smtp (MUST: Configure Outbound Email Config Section) +RESGRID__SystemBehaviorConfig__OutboundEmailType=1 + +# String passphase to symmetrically encrypt external url values +# Note: Recommended to change for security purposes +RESGRID__SystemBehaviorConfig__ExternalLinkUrlParamPassphrase=NvM28Q8EJejQSdxS + +# String passphase to symmetrically encrypt call audio url +# Note: Recommended to change for security purposes +RESGRID__SystemBehaviorConfig__ExternalAudioUrlParamPasshprase=5a4tALka7bz6h4CY + +# ----------------------------------------------- +# --- Cache Config Section ---------------------- +# ----------------------------------------------- + +# Redis server connection string +RESGRID__CacheConfig__RedisConnectionString=redis:6379,Password=,allowAdmin=True + +# ----------------------------------------------- +# --- Data Config Section ----------------------- +# ----------------------------------------------- + +# Microsoft SQL Server Connection String for main Resgrid Database +RESGRID__DataConfig__ConnectionString=Server=db;Database=Resgrid;User Id=sa;Password=Resgrid123!!;MultipleActiveResultSets=True;TrustServerCertificate=True;Connection Timeout=30; + +# ----------------------------------------------- +# --- Mapping Geolocation Config Section -------- +# ----------------------------------------------- + +# Google Maps JS API Key +# https://developers.google.com/maps/documentation/javascript/get-api-key +RESGRID__MappingConfig__GoogleMapsJSKey= + +# Google Maps Geocoding API Key +# https://developers.google.com/maps/documentation/geocoding/get-api-key +RESGRID__MappingConfig__GoogleMapsApiKey= + +# what 3 words api key +# https://developer.what3words.com/public-api +RESGRID__MappingConfig__What3WordsApiKey= + +# ----------------------------------------------- +# --- Error Config Section ---------------------- +# ----------------------------------------------- + +# String to tag the Environment for error logging +RESGRID__ExternalErrorConfig__Environment=dev + +# ----------------------------------------------- +# --- ELK Config Section ------------------------ +# ----------------------------------------------- + +# Url for Elastic Kilbana error log ingestion service +RESGRID__ExternalErrorConfig__ElkServiceUrl=http://elk:9200 + +# ----------------------------------------------- +# --- Sentry.io Config Section ------------------ +# ----------------------------------------------- + +# NOTE: For Sentry.io, you should create 3 projects, 1 for the website, 1 for the api and 1 for workers (webjobs) +# https://docs.sentry.io/product/sentry-basics/integrate-frontend/create-new-project/ + +# Sentry.io Project Url for Resgrid API System +RESGRID__ExternalErrorConfig__ExternalErrorServiceUrl= + +# Sentry.io Project Url for Resgrid website +RESGRID__ExternalErrorConfig__ExternalErrorServiceUrlForWebsite= + +# Sentry.io Project Url for webjobs +RESGRID__ExternalErrorConfig__ExternalErrorServiceUrlForWebjobs= + +# ----------------------------------------------- +# --- Oidc Config Section ----------------------- +# ----------------------------------------------- + +# Microsoft SQL Server Connection String for Resgrid OpenId Connect database +RESGRID__OidcConfig__ConnectionString=Server=db;Database=ResgridOIDC;User Id=sa;Password=Resgrid123!!;MultipleActiveResultSets=True; + +# OpenId Connect Encryption Certificate +# Note: This is the Encipherment Certificate, for secutiry purposes you MUST generate a new certificate. +# See: https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html#registering-a-certificate-recommended-for-production-ready-scenarios +RESGRID__OidcConfig__EncryptionCert=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 + +# OpenId Connect Signging Certificate +# Note: This is the Digital Signature Certificate, for secutiry purposes you MUST generate a new certificate. +# See: https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html#registering-a-certificate-recommended-for-production-ready-scenarios +RESGRID__OidcConfig__SigningCert=MIIJagIBAzCCCSYGCSqGSIb3DQEHAaCCCRcEggkTMIIJDzCCBZAGCSqGSIb3DQEHAaCCBYEEggV9MIIFeTCCBXUGCyqGSIb3DQEMCgECoIIE7jCCBOowHAYKKoZIhvcNAQwBAzAOBAgj6gbYBzTqYgICB9AEggTIk9hROm0SVgyw3Q86rWYvuxpqJIsBXlzbWyT6IWMdfMK7prc0EbaUH0RQ8u8L0FVFhG0miIWiJqE/n/sfTNvb9VOwROMA4i/EBJjRHIn1YAX1FiRKK6D+4oO3o1ddvjmzqKWOq3lVqLrgpgBVGK6zysczskpFvNTCDVaDZ65EEEclR+F+2jKYC12HAZ0ATv/YZl6c5R94z3L02wVvWjKvSPC2rGJrwL9KyEjtpQXuMHo3rk+YbJTLGJlDZSGJSNsnq+rfJUKWFiwcs7yH5VXDbCjRbTHddjh10+msNdf2O/Bw1lLb9WhGTMcq7haVmjgdshOoXu+mZjDVw/9asUURr2oPolVhmVXreChFwucwonLWGt/IlBPL0jdH3ex4g94DnF2/Gc8xVBK+g+NfN20x6Qwx0ae1al2FqkDTsnasiMlIH/LYBKAp24+ZZGoB68dO3VGl0/+hHt3VgJuxC46/nayajB9UlZzi7SICyeQXslPtKrQgX7wM6KL6dFmYUH+QFrPmcj1DbvPv69viTAU6XlaAHE9Y0TS1WWNloZCRMWTtghgFrQ/pYwWwYpWFskz/z5IkB08eH8Zr8PyoWAsR/xb2HM8nyUsA342zAA2fNcGKslgRHBuy6rSBHwSfwTYb060HgFGcPHDOie8gVY9zZysY9Nzr+won+gaDiT31cdRbpOVQ+ujGI9XHWG+pe9dAyASgf/nm5ld0pZ28MWhMSWeovw2TGHz+y3tUYYeLS6/SY8iGeoe9dfGHJ3t2aKDIX2TyG50c6UZ98QqeyTxQhbalN8F6oTPFllmnkqoWSIW4dR/VBWmWZYSjB83jTVtAoM0PRUW1dI0OsPTQFQ5CLF0Ex4gnp21rY03mwo9BVv5jQ5jz/gLm4FpaPbdHfFsRGPH8VtDHg6rabrnbRalPplgbZavXqOTW+TvP+FhV5VZBSjhblapRSA0SSL0KujuHJGQ0gbbHsHE+abmnKHjiXHq2I5ED0cN1uy7hbYWe84TU4kAwPfJV6efCmpYGsq4vrjCPYMntcH0LuS8i9TbXzXDTFArIwX3ssTr0I9j8BkACqk78cCzZ5xnPUjpt/fN+C6w9UuTuvXk6rjWInX8P+jfu+LexnvpimBbbPAg4Wxt2SF+7l21LBLANYpPQLvB86WTbBVaofjV7vzLG2djNU7IuCbmJW7ojpP1BCYscTB67W75mC6RCNe4VatpCSInJTjpm/uZ8q5O1pvmB6NotMmf7BCbPws427iMtwYjWkQ5HZr55M8r+lZIapVzNs/gZLcEhqMtIoEB9T4IEDnujyxczkYq4rHuDViRv+sWPiC3VPVt65Hhh4PFcJDfwY46BcRtbjrkLQpY9svkSDN2kGrliyP5sVN+GlC9+RYjNyttpU0CQ6lursvIVVFSmNwwB7+AjELIq38t/Fl31yPI2ycDz1oy/4sxVc/bujO4b+1punX6OzLsmaKwRNEmT6tBue4gDY4t22BR/e719GZ8S8IhOELBxFHjGGQxZzlPoIJSzhEqdeFiVj6bA0zKPzt61iNz+/qixzHNgqK/n2p4+t4BlSzOxWlf6J1p73omWCKL7D/c1jAoVR2bHYB6U/hRWq/r27FzPCan7DjMR8t+k0v6n6MflVmOWMXQwEwYJKoZIhvcNAQkVMQYEBAEAAAAwXQYJKwYBBAGCNxEBMVAeTgBNAGkAYwByAG8AcwBvAGYAdAAgAFMAbwBmAHQAdwBhAHIAZQAgAEsAZQB5ACAAUwB0AG8AcgBhAGcAZQAgAFAAcgBvAHYAaQBkAGUAcjCCA3cGCSqGSIb3DQEHBqCCA2gwggNkAgEAMIIDXQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQMwDgQIOnZ0V+bRe14CAgfQgIIDMHfuqSRK22tHwAMIncBTO/UuBY9Pl1eShpPrfni8m+R2163cbrtz3keiP+jFzmgjGGoZAtBVMPSRA8MKbDo1mpFdEBXylnT6qiUgHzyijnw+zElSslfsm+EtXP6YTL0Vd0Oz3F1IMlO7jFi5WiS0OiKs0OvTob9ThZLHTq6L+zf5Xnb7/vHcYp+ns7/ekuOvGItkCzPzOhsd+J79umTIYwi59sY80/1avbBZ2XssGMmN02o8TmI5qC/vpf9y1biTmzifNHcFgE0XZrgjdqphfnu8zG1a+S+WKiSKZuO38XTWFhVEB6O/rCahuBxhqExHExHapLp5fDOXChW2iEr3vyieEOSk167VE3eUlKy8T8CMkwsCh3w5u1kJCFogNUhDTKPFYWT/VPauQ+Th3shoRryxp6pz5FFzjx6bIJtv6jq3W8oJRjIEcl+O2XbHDNw5tTZ8U0RHHxp5YWf3kG6u5sJv8A+RStl3ax8txNt3FxJPcJw4I8Mkp9AXxndATLo3n9RQ0BHaHKaMTRIMs/XuUISagYgYqKLUpMofaMNk7ppsbHpRq2uAt/Y2Fo0grwnmEuxK6PVYD/kqHPybRimd9G579c+1Y4MLfwZYSO/mkb3SK+5ejKvVR9diL8aIVuVw9jPZcym0LHupohIaCFwQR23QoHMXUY8mWL8rkhCR9FVC6bU6PsCxhseQQtpHLa37tNZUbBNMOsejjrbYhZhRneIiLvqPPc8or7pEv1ZikW3Q8jTn3vP5QbWBeGZQLd0tNNsmJZfgM90JnCkZMnf52fuShi6LEYt1gl9B+3a43+9v7l0zlnLpbCi31Ac09hIhaeJzFjVtXO95wHVGRFfX1Y1YbApFHQ5nSeKbj4lAU0BgcSPU5I8vNfWQs3Ctgn0H8mPbTrqZK90HSauheFp+ZzEM5ZhZ9Hg1DOld8giahO1/RFdtrcOs1UuBn//OPY836db0r7EUUCXOvfyBkpKN6CtIOdd/vTZ1T/NDCOLWEZstGYzhs3LXGoT0EdufYUsXJQhSFdwPaihXLuHKs9djZFp+8Nx8i9m9aqNOwwoCLxUQP6EsYUnaZkM1qQrF4sIocjA7MB8wBwYFKw4DAhoEFLJov7egG/ownZU20kBlmJVfwoZrBBQFPJOPydh2OAB9in+aCa5aKx+Q0gICB9A= + +# ----------------------------------------------- +# --- Outbound Email Config Section ------------- +# ----------------------------------------------- + +# Email address that emails generated by the system will use (for SMTP and Postmark) +RESGRID__OutboundEmailServerConfig__FromMail=resgrid@yourcompany.local + +# ----------------------------------------------- +# --- SMTP Email Config Section ----------------- +# ----------------------------------------------- + +# Use SSL\TLS to connect to the SMTP server +# true => Use SSL\TLS +# false => Disabled +RESGRID__OutboundEmailServerConfig__EnableSsl=false + +# SMTP Server Hostname +RESGRID__OutboundEmailServerConfig__Host=mailserver + +# SMTP Server Port (Commonly 25 for non-ssl and 587 for ssl) +RESGRID__OutboundEmailServerConfig__Port=25 + +# SMTP Server Login Username +RESGRID__OutboundEmailServerConfig__UserName= + +# SMTP Server Login Password +RESGRID__OutboundEmailServerConfig__Password= + +# ----------------------------------------------- +# --- Postmark Config Section ------------------- +# ----------------------------------------------- + +# API Key from Postmark (https://postmarkapp.com/support/article/1008-what-are-the-account-and-server-api-tokens) +RESGRID__OutboundEmailServerConfig__PostmarkApiKey= + +# ----------------------------------------------- +# --- Service Bus Config Section ---------------- +# ----------------------------------------------- + +# RabbitMQ Hostname +RESGRID__ServiceBusConfig__RabbitHostname=rabbitmq + +# RabbitMQ Hostname2 (for 2nd host in 3 node RabbitMQ cluster) +# Default is blank +RESGRID__ServiceBusConfig__RabbitHostname2= + +# RabbitMQ Hostname3 (for 3nd host in 3 node RabbitMQ cluster) +# Default is blank +RESGRID__ServiceBusConfig__RabbitHostname3= + +# Username for RabbitMQ +# Note: User must be able to create queues and topics for the / virtual host +RESGRID__ServiceBusConfig__RabbitUsername=resgrid + +# Password for RabbitMQ +RESGRID__ServiceBusConfig__RabbbitPassword=Resgrid321! + +# ----------------------------------------------- +# --- Worker Config Section --------------------- +# ----------------------------------------------- + +# Microsoft SQL Server Connection String for Worker Database +RESGRID__WorkerConfig__WorkerDbConnectionString=Data Source=db;Initial Catalog=ResgridWorkers;User Id=sa;Password=Resgrid123!!;MultipleActiveResultSets=True; + +# Payload key for multiple agents +# Note: Change this key if you are running multiple workers +RESGRID__WorkerConfig__PayloadKey=YDm8wWFm4jVZADvDuaM7xmnCsLnydRrwJL3sxNZchL4nU4mkCgUu3fy87yaKBnPSe8g78qvMvTs3ySWutevavt3QbV7M9vdM + +# Have the Worker run the database Upgrade scripts at startup +# Note: When this option is enabled the worker must startup first and perform the upgrade before other services use the db +RESGRID__DODBUPGRADE=true + +# ----------------------------------------------- +# --- Web Config Section ------------------------ +# ----------------------------------------------- + +# Allowed Ingress network for forwarded headers (k8s config) +RESGRID__WebConfig__IngressProxyNetwork=10.42.0.0 + +# CIDR for Ingress network mask +RESGRID__WebConfig__IngressProxyNetworkCidr=16 + +# ----------------------------------------------- +# --- Asp.Net Section --------------------------- +# ----------------------------------------------- + +ASPNETCORE_ENVIRONMENT=Production +ASPNETCORE_URLS=http://0.0.0.0:80 diff --git a/Docker/run.sh b/Docker/run.sh new file mode 100755 index 00000000..00f8cce6 --- /dev/null +++ b/Docker/run.sh @@ -0,0 +1,2 @@ +sysctl -w vm.max_map_count=262144 +docker-compose --project-name resgird up \ No newline at end of file diff --git a/Providers/Resgrid.Providers.AddressVerification/LoqateProvider.cs b/Providers/Resgrid.Providers.AddressVerification/LoqateProvider.cs index 9bd53111..304247e8 100644 --- a/Providers/Resgrid.Providers.AddressVerification/LoqateProvider.cs +++ b/Providers/Resgrid.Providers.AddressVerification/LoqateProvider.cs @@ -19,7 +19,7 @@ public async Task VerifyAddressAsync(Address address) string addressString = string.Format("{0} {1} {2} {3} {4}", address.Address1, address.City, address.State, address.PostalCode, address.Country); var client = new RestClient(Config.MappingConfig.LoqateApiUrl); - var request = new RestRequest(String.Format("rest/?lqtkey={0}&p=v&addr={1}", Config.MappingConfig.LoqateApiKey, HttpUtility.UrlEncode(addressString)), Method.GET); + var request = new RestRequest(String.Format("rest/?lqtkey={0}&p=v&addr={1}", Config.MappingConfig.LoqateApiKey, HttpUtility.UrlEncode(addressString)), Method.Get); var response = await client.ExecuteAsync(request); diff --git a/Providers/Resgrid.Providers.AddressVerification/Resgrid.Providers.AddressVerification.csproj b/Providers/Resgrid.Providers.AddressVerification/Resgrid.Providers.AddressVerification.csproj index 5c3f0481..3038b5bf 100644 --- a/Providers/Resgrid.Providers.AddressVerification/Resgrid.Providers.AddressVerification.csproj +++ b/Providers/Resgrid.Providers.AddressVerification/Resgrid.Providers.AddressVerification.csproj @@ -1,13 +1,13 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker - - + + diff --git a/Providers/Resgrid.Providers.Audio/Resgrid.Providers.Audio.csproj b/Providers/Resgrid.Providers.Audio/Resgrid.Providers.Audio.csproj index 37f6ecc8..e2437a5e 100644 --- a/Providers/Resgrid.Providers.Audio/Resgrid.Providers.Audio.csproj +++ b/Providers/Resgrid.Providers.Audio/Resgrid.Providers.Audio.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 Debug;Release;Docker @@ -16,8 +16,4 @@ - - - - diff --git a/Providers/Resgrid.Providers.Bus.Rabbit/RabbitBusModule.cs b/Providers/Resgrid.Providers.Bus.Rabbit/RabbitBusModule.cs index 1a327aff..19072695 100644 --- a/Providers/Resgrid.Providers.Bus.Rabbit/RabbitBusModule.cs +++ b/Providers/Resgrid.Providers.Bus.Rabbit/RabbitBusModule.cs @@ -7,7 +7,7 @@ public class RabbitBusModule : Module { protected override void Load(ContainerBuilder builder) { - builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().InstancePerLifetimeScope(); //builder.RegisterType().As().InstancePerLifetimeScope(); diff --git a/Providers/Resgrid.Providers.Bus.Rabbit/RabbitInboundEventProvider.cs b/Providers/Resgrid.Providers.Bus.Rabbit/RabbitInboundEventProvider.cs index 60c15865..f5f55447 100644 --- a/Providers/Resgrid.Providers.Bus.Rabbit/RabbitInboundEventProvider.cs +++ b/Providers/Resgrid.Providers.Bus.Rabbit/RabbitInboundEventProvider.cs @@ -1,16 +1,18 @@ using System; using System.Text; +using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json; using RabbitMQ.Client; using RabbitMQ.Client.Events; using Resgrid.Config; +using Resgrid.Framework; using Resgrid.Model; using Resgrid.Model.Providers; namespace Resgrid.Providers.Bus.Rabbit { - public class RabbitInboundEventProvider: IRabbitInboundEventProvider + public class RabbitInboundEventProvider : IRabbitInboundEventProvider { private ConnectionFactory _factory; private IConnection _connection; @@ -19,6 +21,8 @@ public class RabbitInboundEventProvider: IRabbitInboundEventProvider public Func ProcessPersonnelStatusChanged; public Func ProcessUnitStatusChanged; public Func ProcessCallStatusChanged; + public Func ProcessCallAdded; + public Func ProcessCallClosed; public Func ProcessPersonnelStaffingChanged; public async Task Start() @@ -29,8 +33,38 @@ public async Task Start() private void VerifyAndCreateClients() { - _factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; - _connection = _factory.CreateConnection(); + // I know....I know..... + try + { + _factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + _connection = _factory.CreateConnection(); + } + catch (Exception ex) + { + Logging.LogException(ex); + + try + { + _factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname2, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + _connection = _factory.CreateConnection(); + } + catch (Exception ex2) + { + Logging.LogException(ex2); + + try + { + _factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname3, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + _connection = _factory.CreateConnection(); + } + catch (Exception ex3) + { + Logging.LogException(ex3); + throw; + } + } + } + _channel = _connection.CreateModel(); } @@ -68,6 +102,14 @@ private async Task StartMonitoring() if (ProcessCallStatusChanged != null) await ProcessCallStatusChanged.Invoke(eventingMessage.DepartmentId, eventingMessage.ItemId); break; + case EventingTypes.CallAdded: + if (ProcessCallStatusChanged != null) + await ProcessCallStatusChanged.Invoke(eventingMessage.DepartmentId, eventingMessage.ItemId); + break; + case EventingTypes.CallClosed: + if (ProcessCallStatusChanged != null) + await ProcessCallStatusChanged.Invoke(eventingMessage.DepartmentId, eventingMessage.ItemId); + break; case EventingTypes.PersonnelStaffingUpdated: if (ProcessPersonnelStaffingChanged != null) await ProcessPersonnelStaffingChanged.Invoke(eventingMessage.DepartmentId, eventingMessage.ItemId); @@ -91,12 +133,19 @@ public bool IsConnected() return _channel.IsOpen; } - public void RegisterForEvents(Func personnelStatusChanged, Func unitStatusChanged, Func callStatusChanged, Func personnelStaffingChanged) + public void RegisterForEvents(Func personnelStatusChanged, + Func unitStatusChanged, + Func callStatusChanged, + Func personnelStaffingChanged, + Func callAdded, + Func callClosed) { ProcessPersonnelStatusChanged = personnelStatusChanged; ProcessUnitStatusChanged = unitStatusChanged; ProcessCallStatusChanged = callStatusChanged; ProcessPersonnelStaffingChanged = personnelStaffingChanged; + ProcessCallAdded = callAdded; + ProcessCallClosed = callClosed; } private static string SetQueueNameForEnv(string cacheKey) diff --git a/Providers/Resgrid.Providers.Bus.Rabbit/RabbitInboundQueueProvider.cs b/Providers/Resgrid.Providers.Bus.Rabbit/RabbitInboundQueueProvider.cs index 442c0b6e..1e5989de 100644 --- a/Providers/Resgrid.Providers.Bus.Rabbit/RabbitInboundQueueProvider.cs +++ b/Providers/Resgrid.Providers.Bus.Rabbit/RabbitInboundQueueProvider.cs @@ -3,6 +3,7 @@ using Resgrid.Config; using Resgrid.Framework; using Resgrid.Model; +using Resgrid.Model.Events; using Resgrid.Model.Queue; using System; using System.Collections.Generic; @@ -24,6 +25,7 @@ public class RabbitInboundQueueProvider public Func ShiftNotificationQueueReceived; public Func CqrsEventQueueReceived; public Func PaymentEventQueueReceived; + public Func AuditEventQueueReceived; public RabbitInboundQueueProvider() { @@ -38,8 +40,38 @@ public async Task Start() private void VerifyAndCreateClients() { - _factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; - _connection = _factory.CreateConnection(); + // I know....I know..... + try + { + _factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + _connection = _factory.CreateConnection(); + } + catch (Exception ex) + { + Logging.LogException(ex); + + try + { + _factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname2, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + _connection = _factory.CreateConnection(); + } + catch (Exception ex2) + { + Logging.LogException(ex2); + + try + { + _factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname3, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + _connection = _factory.CreateConnection(); + } + catch (Exception ex3) + { + Logging.LogException(ex3); + throw; + } + } + } + _channel = _connection.CreateModel(); } @@ -328,6 +360,46 @@ private async Task StartMonitoring() } }; + var auditEventQueueReceivedConsumer = new EventingBasicConsumer(_channel); + auditEventQueueReceivedConsumer.Received += async (model, ea) => + { + if (ea != null && ea.Body.Length > 0) + { + AuditEvent audit = null; + try + { + var body = ea.Body; + var message = Encoding.UTF8.GetString(body.ToArray()); + audit = ObjectSerialization.Deserialize(message); + } + catch (Exception ex) + { + _channel.BasicNack(ea.DeliveryTag, false, false); + Logging.LogException(ex, Encoding.UTF8.GetString(ea.Body.ToArray())); + } + + try + { + if (audit != null) + { + if (PaymentEventQueueReceived != null) + { + await AuditEventQueueReceived.Invoke(audit); + _channel.BasicAck(ea.DeliveryTag, false); + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + if (RetryQueueItem(ea, ex)) + _channel.BasicAck(ea.DeliveryTag, false); + else + _channel.BasicNack(ea.DeliveryTag, false, true); + } + } + }; + String callQueueReceivedConsumerTag = _channel.BasicConsume( queue: SetQueueNameForEnv(ServiceBusConfig.CallBroadcastQueueName), @@ -363,6 +435,11 @@ private async Task StartMonitoring() queue: SetQueueNameForEnv(ServiceBusConfig.PaymentQueueName), autoAck: false, consumer: paymentEventQueueReceivedConsumer); + + String auditEventQueueReceivedConsumerTag = _channel.BasicConsume( + queue: SetQueueNameForEnv(ServiceBusConfig.AuditQueueName), + autoAck: false, + consumer: auditEventQueueReceivedConsumer); } } @@ -387,8 +464,8 @@ private bool RetryQueueItem(BasicDeliverEventArgs ea, Exception mex) if (currentDeliveryCount >= 3) return true; - var factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; - using (var connection = factory.CreateConnection()) + //var factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + using (var connection = CreateConnection()) { using (var channel = connection.CreateModel()) { @@ -418,6 +495,46 @@ private bool RetryQueueItem(BasicDeliverEventArgs ea, Exception mex) } } + private IConnection CreateConnection() + { + ConnectionFactory factory; + IConnection connection; + + // I know....I know..... + try + { + factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + connection = factory.CreateConnection(); + } + catch (Exception ex) + { + Logging.LogException(ex); + + try + { + factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname2, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + connection = factory.CreateConnection(); + } + catch (Exception ex2) + { + Logging.LogException(ex2); + + try + { + factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname3, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + connection = factory.CreateConnection(); + } + catch (Exception ex3) + { + Logging.LogException(ex3); + throw; + } + } + } + + return connection; + } + private static string SetQueueNameForEnv(string cacheKey) { if (Config.SystemBehaviorConfig.Environment == SystemEnvironment.Dev) diff --git a/Providers/Resgrid.Providers.Bus.Rabbit/RabbitOutboundQueueProvider.cs b/Providers/Resgrid.Providers.Bus.Rabbit/RabbitOutboundQueueProvider.cs index 76a82e19..c00a094e 100644 --- a/Providers/Resgrid.Providers.Bus.Rabbit/RabbitOutboundQueueProvider.cs +++ b/Providers/Resgrid.Providers.Bus.Rabbit/RabbitOutboundQueueProvider.cs @@ -7,11 +7,14 @@ using Resgrid.Model; using Resgrid.Model.Providers; using System.Collections.Generic; +using Resgrid.Model.Events; namespace Resgrid.Providers.Bus.Rabbit { public class RabbitOutboundQueueProvider : IRabbitOutboundQueueProvider { + private static bool _hasBeenInitialized = false; + public RabbitOutboundQueueProvider() { VerifyAndCreateClients(); @@ -19,102 +22,24 @@ public RabbitOutboundQueueProvider() public bool EnqueueCall(CallQueueItem callQueue) { - string serializedObject = String.Empty; - - //try - //{ - // serializedObject = ObjectSerialization.Serialize(callQueue); - - // // We are limited to 256KB in azure queue messages - // var size = ASCIIEncoding.Unicode.GetByteCount(serializedObject); - // if (size > 220000) - // { - // callQueue.Profiles = null; - // serializedObject = ObjectSerialization.Serialize(callQueue); - // } - //} - //catch { } - - //// If we get an Exception, i.e. OutOfMemmory, lets just strip out the heavy data and try. - //if (String.IsNullOrWhiteSpace(serializedObject)) - //{ - // callQueue.Profiles = null; - serializedObject = ObjectSerialization.Serialize(callQueue); - //} + string serializedObject = ObjectSerialization.Serialize(callQueue); return SendMessage(ServiceBusConfig.CallBroadcastQueueName, serializedObject); } public bool EnqueueMessage(MessageQueueItem messageQueue) { - string serializedObject = String.Empty; + string serializedObject = ObjectSerialization.Serialize(messageQueue); if (messageQueue != null && messageQueue.Message != null && messageQueue.MessageId == 0 && messageQueue.Message.MessageId != 0) messageQueue.MessageId = messageQueue.Message.MessageId; - //try - //{ - // serializedObject = ObjectSerialization.Serialize(messageQueue); - - // // We are limited to 256KB in azure queue messages - // var size = ASCIIEncoding.Unicode.GetByteCount(serializedObject); - // if (size > 220000) - // { - // messageQueue.Profiles = null; - // serializedObject = ObjectSerialization.Serialize(messageQueue); - // } - - // if (ASCIIEncoding.Unicode.GetByteCount(serializedObject) > 220000) - // { - // messageQueue.Message.MessageRecipients = null; - // serializedObject = ObjectSerialization.Serialize(messageQueue); - // } - //} - //catch { } - - //// If we get an Exception, i.e. OutOfMemmory, lets just strip out the heavy data and try. - //if (String.IsNullOrWhiteSpace(serializedObject)) - //{ - // messageQueue.Profiles = null; - // messageQueue.Message.MessageRecipients = null; - serializedObject = ObjectSerialization.Serialize(messageQueue); - //} - return SendMessage(ServiceBusConfig.MessageBroadcastQueueName, serializedObject); } public bool EnqueueDistributionList(DistributionListQueueItem distributionListQueue) { - string serializedObject = String.Empty; - - //try - //{ - // serializedObject = ObjectSerialization.Serialize(distributionListQueue); - - // // We are limited to 256KB in azure queue messages - // var size = ASCIIEncoding.Unicode.GetByteCount(serializedObject); - // if (size > 220000) - // { - // distributionListQueue.Users = null; - // serializedObject = ObjectSerialization.Serialize(distributionListQueue); - // } - - // // If were still too big, strip out some attachments - // if (size > 220000) - // { - // distributionListQueue.Message.Attachments = null; - // serializedObject = ObjectSerialization.Serialize(distributionListQueue); - // } - //} - //catch { } - - //// If we get an Exception, i.e. OutOfMemmory, lets just strip out the heavy data and try. - //if (String.IsNullOrWhiteSpace(serializedObject)) - //{ - // distributionListQueue.Users = null; - // distributionListQueue.Message.Attachments = null; - serializedObject = ObjectSerialization.Serialize(distributionListQueue); - //} + string serializedObject = ObjectSerialization.Serialize(distributionListQueue); return SendMessage(ServiceBusConfig.EmailBroadcastQueueName, serializedObject); } @@ -151,71 +76,129 @@ public bool EnqueuePaymentEvent(CqrsEvent cqrsEvent) return SendMessage(ServiceBusConfig.PaymentQueueName, serializedObject); } + public bool EnqueueAuditEvent(AuditEvent auditEvent) + { + var serializedObject = ObjectSerialization.Serialize(auditEvent); + + return SendMessage(ServiceBusConfig.AuditQueueName, serializedObject); + } + public bool VerifyAndCreateClients() { - if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) + if (!_hasBeenInitialized) { - try + if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) { - var factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; - using (var connection = factory.CreateConnection()) + try { - using (var channel = connection.CreateModel()) + //var factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + using (var connection = CreateConnection()) { - channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.SystemQueueName), - durable: true, - exclusive: false, - autoDelete: false, - arguments: null); - - channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.CallBroadcastQueueName), - durable: true, - exclusive: false, - autoDelete: false, - arguments: null); - - channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.MessageBroadcastQueueName), - durable: true, - exclusive: false, - autoDelete: false, - arguments: null); - - channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.EmailBroadcastQueueName), - durable: true, - exclusive: false, - autoDelete: false, - arguments: null); - - channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.NotificaitonBroadcastQueueName), - durable: true, - exclusive: false, - autoDelete: false, - arguments: null); - - channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.ShiftNotificationsQueueName), - durable: true, - exclusive: false, - autoDelete: false, - arguments: null); - - channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.PaymentQueueName), - durable: true, - exclusive: false, - autoDelete: false, - arguments: null); + using (var channel = connection.CreateModel()) + { + channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.SystemQueueName), + durable: true, + exclusive: false, + autoDelete: false, + arguments: null); + + channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.CallBroadcastQueueName), + durable: true, + exclusive: false, + autoDelete: false, + arguments: null); + + channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.MessageBroadcastQueueName), + durable: true, + exclusive: false, + autoDelete: false, + arguments: null); + + channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.EmailBroadcastQueueName), + durable: true, + exclusive: false, + autoDelete: false, + arguments: null); + + channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.NotificaitonBroadcastQueueName), + durable: true, + exclusive: false, + autoDelete: false, + arguments: null); + + channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.ShiftNotificationsQueueName), + durable: true, + exclusive: false, + autoDelete: false, + arguments: null); + + channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.PaymentQueueName), + durable: true, + exclusive: false, + autoDelete: false, + arguments: null); + + channel.QueueDeclare(queue: SetQueueNameForEnv(ServiceBusConfig.AuditQueueName), + durable: true, + exclusive: false, + autoDelete: false, + arguments: null); + } } + + _hasBeenInitialized = true; + + return true; + } + catch (Exception ex) + { + Logging.LogException(ex); + return false; } + } + } - return true; + return false; + } + + private IConnection CreateConnection() + { + ConnectionFactory factory; + IConnection connection; + + // I know....I know..... + try + { + factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + connection = factory.CreateConnection(); + } + catch (Exception ex) + { + Logging.LogException(ex); + + try + { + factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname2, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + connection = factory.CreateConnection(); } - catch (Exception ex) + catch (Exception ex2) { - Logging.LogException(ex); - return false; + Logging.LogException(ex2); + + try + { + factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname3, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + connection = factory.CreateConnection(); + } + catch (Exception ex3) + { + Logging.LogException(ex3); + throw; + } } } - return false; + return connection; } private bool SendMessage(string queueName, string message) @@ -225,8 +208,8 @@ private bool SendMessage(string queueName, string message) try { // TODO: Maybe? https://github.com/EasyNetQ/EasyNetQ -SJ - var factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; - using (var connection = factory.CreateConnection()) + //var factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + using (var connection = CreateConnection()) { using (var channel = connection.CreateModel()) { diff --git a/Providers/Resgrid.Providers.Bus.Rabbit/RabbitTopicProvider.cs b/Providers/Resgrid.Providers.Bus.Rabbit/RabbitTopicProvider.cs index cf0a555d..97a862cf 100644 --- a/Providers/Resgrid.Providers.Bus.Rabbit/RabbitTopicProvider.cs +++ b/Providers/Resgrid.Providers.Bus.Rabbit/RabbitTopicProvider.cs @@ -1,9 +1,11 @@ using RabbitMQ.Client; using Resgrid.Config; +using Resgrid.Framework; using Resgrid.Model; using Resgrid.Model.Events; using System; using System.Text; +using System.Threading; namespace Resgrid.Providers.Bus.Rabbit { @@ -51,6 +53,18 @@ public bool UnitStatusChanged(UnitStatusEvent message) } public bool CallAdded(CallAddedEvent message) + { + return SendMessage(Topics.EventingTopic, new EventingMessage + { + Id = Guid.NewGuid(), + Type = (int)EventingTypes.CallAdded, + TimeStamp = DateTime.UtcNow, + DepartmentId = message.DepartmentId, + ItemId = message.Call.CallId + }.SerializeJson()); + } + + public bool CallUpdated(CallUpdatedEvent message) { return SendMessage(Topics.EventingTopic, new EventingMessage { @@ -62,6 +76,18 @@ public bool CallAdded(CallAddedEvent message) }.SerializeJson()); } + public bool CallClosed(CallClosedEvent message) + { + return SendMessage(Topics.EventingTopic, new EventingMessage + { + Id = Guid.NewGuid(), + Type = (int)EventingTypes.CallClosed, + TimeStamp = DateTime.UtcNow, + DepartmentId = message.DepartmentId, + ItemId = message.Call.CallId + }.SerializeJson()); + } + private static void VerifyAndCreateClients() { if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) @@ -90,8 +116,8 @@ private bool SendMessage(string topicName, string message) { if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) { - var factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; - using (var connection = factory.CreateConnection()) + //var factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + using (var connection = CreateConnection()) { using (var channel = connection.CreateModel()) { @@ -113,6 +139,46 @@ private bool SendMessage(string topicName, string message) return false; } + private IConnection CreateConnection() + { + ConnectionFactory factory; + IConnection connection; + + // I know....I know..... + try + { + factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + connection = factory.CreateConnection(); + } + catch (Exception ex) + { + Logging.LogException(ex); + + try + { + factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname2, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + connection = factory.CreateConnection(); + } + catch (Exception ex2) + { + Logging.LogException(ex2); + + try + { + factory = new ConnectionFactory() { HostName = ServiceBusConfig.RabbitHostname3, UserName = ServiceBusConfig.RabbitUsername, Password = ServiceBusConfig.RabbbitPassword }; + connection = factory.CreateConnection(); + } + catch (Exception ex3) + { + Logging.LogException(ex3); + throw; + } + } + } + + return connection; + } + private static string SetQueueNameForEnv(string cacheKey) { if (Config.SystemBehaviorConfig.Environment == SystemEnvironment.Dev) diff --git a/Providers/Resgrid.Providers.Bus.Rabbit/Resgrid.Providers.Bus.Rabbit.csproj b/Providers/Resgrid.Providers.Bus.Rabbit/Resgrid.Providers.Bus.Rabbit.csproj index a8fd605f..57c5da69 100644 --- a/Providers/Resgrid.Providers.Bus.Rabbit/Resgrid.Providers.Bus.Rabbit.csproj +++ b/Providers/Resgrid.Providers.Bus.Rabbit/Resgrid.Providers.Bus.Rabbit.csproj @@ -1,23 +1,20 @@  - netstandard2.0 + netstandard2.1 Debug;Release;Docker - - + + - - - - + diff --git a/Providers/Resgrid.Providers.Bus/AuditEventProvider.cs b/Providers/Resgrid.Providers.Bus/AuditEventProvider.cs new file mode 100644 index 00000000..e4aa86f8 --- /dev/null +++ b/Providers/Resgrid.Providers.Bus/AuditEventProvider.cs @@ -0,0 +1,33 @@ +using System; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Resgrid.Framework; +using Resgrid.Model; +using Resgrid.Model.Events; +using Resgrid.Model.Providers; +using Resgrid.Providers.Bus.Rabbit; + +namespace Resgrid.Providers.Bus +{ + public class AuditEventProvider : IAuditEventProvider + { + private readonly RabbitOutboundQueueProvider _rabbitOutboundQueueProvider; + + public AuditEventProvider() + { + _rabbitOutboundQueueProvider = new RabbitOutboundQueueProvider(); + } + + public async Task EnqueueAuditEventAsync(AuditEvent auditEvent) + { + if (Config.SystemBehaviorConfig.ServiceBusType == Config.ServiceBusTypes.Rabbit) + { + _rabbitOutboundQueueProvider.EnqueueAuditEvent(auditEvent); + return true; + } + + return false; + } + } +} diff --git a/Providers/Resgrid.Providers.Bus/BusModule.cs b/Providers/Resgrid.Providers.Bus/BusModule.cs index 0b92788e..b2ace0f1 100644 --- a/Providers/Resgrid.Providers.Bus/BusModule.cs +++ b/Providers/Resgrid.Providers.Bus/BusModule.cs @@ -9,11 +9,12 @@ protected override void Load(ContainerBuilder builder) { builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); diff --git a/Providers/Resgrid.Providers.Bus/CqrsProvider.cs b/Providers/Resgrid.Providers.Bus/CqrsProvider.cs index 89efbed2..79a6e681 100644 --- a/Providers/Resgrid.Providers.Bus/CqrsProvider.cs +++ b/Providers/Resgrid.Providers.Bus/CqrsProvider.cs @@ -2,37 +2,21 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Azure.ServiceBus; using Resgrid.Framework; using Resgrid.Model; using Resgrid.Model.Providers; using Resgrid.Providers.Bus.Rabbit; -using Message = Microsoft.Azure.ServiceBus.Message; namespace Resgrid.Providers.Bus { public class CqrsProvider : ICqrsProvider { private readonly RabbitOutboundQueueProvider _rabbitOutboundQueueProvider; - private readonly QueueClient _systemClient = null; public CqrsProvider() { - if (Config.SystemBehaviorConfig.ServiceBusType == Config.ServiceBusTypes.Azure) - { - while (_systemClient == null) - { - try - { - _systemClient = new QueueClient(Config.ServiceBusConfig.AzureQueueSystemConnectionString, Config.ServiceBusConfig.SystemQueueName); - } - catch (TimeoutException) { } - } - } - else - { - _rabbitOutboundQueueProvider = new RabbitOutboundQueueProvider(); - } + + _rabbitOutboundQueueProvider = new RabbitOutboundQueueProvider(); } public async Task EnqueueCqrsEventAsync(CqrsEvent cqrsEvent) @@ -43,42 +27,6 @@ public async Task EnqueueCqrsEventAsync(CqrsEvent cqrsEvent) return true; } - var serializedObject = ObjectSerialization.Serialize(cqrsEvent); - Message message = new Message(Encoding.UTF8.GetBytes(serializedObject)); - message.MessageId = string.Format("{0}", cqrsEvent.EventId); - - return await SendMessageAsync(_systemClient, message); - } - - private async Task SendMessageAsync(QueueClient client, Message message) - { - if (Config.SystemBehaviorConfig.ServiceBusType == Config.ServiceBusTypes.Azure) - { - int retry = 0; - bool sent = false; - - while (!sent) - { - try - { - await client.SendAsync(message); - sent = true; - } - catch (Exception ex) - { - Logging.LogException(ex, message.ToString()); - - if (retry >= 5) - return false; - - Thread.Sleep(250); - retry++; - } - } - - return sent; - } - return false; } } diff --git a/Providers/Resgrid.Providers.Bus/InboundEventProvider.cs b/Providers/Resgrid.Providers.Bus/InboundEventProvider.cs index b2fc2ecd..798515f5 100644 --- a/Providers/Resgrid.Providers.Bus/InboundEventProvider.cs +++ b/Providers/Resgrid.Providers.Bus/InboundEventProvider.cs @@ -1,94 +1,80 @@ using System; using System.Threading; using System.Threading.Tasks; -using Microsoft.Azure.ServiceBus; using Resgrid.Config; using Resgrid.Framework; using Resgrid.Model; using Resgrid.Model.Providers; -using Message = Microsoft.Azure.ServiceBus.Message; namespace Resgrid.Providers.Bus { public class InboundEventProvider : IInboundEventProvider { private readonly IEventAggregator _eventAggregator; - private static SubscriptionClient _topicClient; public Func ProcessPersonnelStatusChanged; public Func ProcessUnitStatusChanged; public Func ProcessCallStatusChanged; public Func ProcessPersonnelStaffingChanged; - public InboundEventProvider(IEventAggregator eventAggregator) - { - _eventAggregator = eventAggregator; + //public InboundEventProvider(IEventAggregator eventAggregator) + //{ + // _eventAggregator = eventAggregator; - if (SystemBehaviorConfig.ServiceBusType != ServiceBusTypes.Rabbit) - { - _topicClient = new SubscriptionClient(ServiceBusConfig.AzureEventingTopicConnectionString, - Topics.EventingTopic, ServiceBusConfig.EventingTopicQueueName); + // if (SystemBehaviorConfig.ServiceBusType != ServiceBusTypes.Rabbit) + // { + // _topicClient = new SubscriptionClient(ServiceBusConfig.AzureEventingTopicConnectionString, + // Topics.EventingTopic, ServiceBusConfig.EventingTopicQueueName); - var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler) - { + // var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler) + // { - MaxConcurrentCalls = 1, - AutoComplete = true, - MaxAutoRenewDuration = TimeSpan.FromMinutes(1) - }; + // MaxConcurrentCalls = 1, + // AutoComplete = true, + // MaxAutoRenewDuration = TimeSpan.FromMinutes(1) + // }; - // Register the function that processes messages. - _topicClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions); - } - } + // // Register the function that processes messages. + // _topicClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions); + // } + //} - private async Task ProcessMessagesAsync(Message message, CancellationToken token) - { - try - { - if (message.UserProperties["Type"] != null && message.UserProperties["DepartmentId"] != null && message.UserProperties["ItemId"] != null) - { - switch ((EventingTypes)int.Parse(message.UserProperties["Type"].ToString())) - { - case EventingTypes.PersonnelStatusUpdated: - if (ProcessPersonnelStatusChanged != null) - await ProcessPersonnelStatusChanged(int.Parse(message.UserProperties["DepartmentId"].ToString()), int.Parse(message.UserProperties["ItemId"].ToString())); - break; - case EventingTypes.UnitStatusUpdated: - if (ProcessUnitStatusChanged != null) - await ProcessUnitStatusChanged.Invoke(int.Parse(message.UserProperties["DepartmentId"].ToString()), int.Parse(message.UserProperties["ItemId"].ToString())); - break; - case EventingTypes.CallsUpdated: - if (ProcessCallStatusChanged != null) - await ProcessCallStatusChanged.Invoke(int.Parse(message.UserProperties["DepartmentId"].ToString()), int.Parse(message.UserProperties["ItemId"].ToString())); - break; - case EventingTypes.PersonnelStaffingUpdated: - if (ProcessPersonnelStaffingChanged != null) - await ProcessPersonnelStaffingChanged.Invoke(int.Parse(message.UserProperties["DepartmentId"].ToString()), int.Parse(message.UserProperties["ItemId"].ToString())); - break; - default: - throw new ArgumentOutOfRangeException(); - } - } + //private async Task ProcessMessagesAsync(Message message, CancellationToken token) + //{ + // try + // { + // if (message.UserProperties["Type"] != null && message.UserProperties["DepartmentId"] != null && message.UserProperties["ItemId"] != null) + // { + // switch ((EventingTypes)int.Parse(message.UserProperties["Type"].ToString())) + // { + // case EventingTypes.PersonnelStatusUpdated: + // if (ProcessPersonnelStatusChanged != null) + // await ProcessPersonnelStatusChanged(int.Parse(message.UserProperties["DepartmentId"].ToString()), int.Parse(message.UserProperties["ItemId"].ToString())); + // break; + // case EventingTypes.UnitStatusUpdated: + // if (ProcessUnitStatusChanged != null) + // await ProcessUnitStatusChanged.Invoke(int.Parse(message.UserProperties["DepartmentId"].ToString()), int.Parse(message.UserProperties["ItemId"].ToString())); + // break; + // case EventingTypes.CallsUpdated: + // if (ProcessCallStatusChanged != null) + // await ProcessCallStatusChanged.Invoke(int.Parse(message.UserProperties["DepartmentId"].ToString()), int.Parse(message.UserProperties["ItemId"].ToString())); + // break; + // case EventingTypes.PersonnelStaffingUpdated: + // if (ProcessPersonnelStaffingChanged != null) + // await ProcessPersonnelStaffingChanged.Invoke(int.Parse(message.UserProperties["DepartmentId"].ToString()), int.Parse(message.UserProperties["ItemId"].ToString())); + // break; + // default: + // throw new ArgumentOutOfRangeException(); + // } + // } - await _topicClient.CompleteAsync(message.SystemProperties.LockToken); - } - catch (Exception ex) - { - Logging.LogException(ex); - } - } - - private static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs) - { - Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}."); - var context = exceptionReceivedEventArgs.ExceptionReceivedContext; - Console.WriteLine("Exception context for troubleshooting:"); - Console.WriteLine($"- Endpoint: {context.Endpoint}"); - Console.WriteLine($"- Entity Path: {context.EntityPath}"); - Console.WriteLine($"- Executing Action: {context.Action}"); - return Task.CompletedTask; - } + // await _topicClient.CompleteAsync(message.SystemProperties.LockToken); + // } + // catch (Exception ex) + // { + // Logging.LogException(ex); + // } + //} public void RegisterForEvents(Func personnelStatusChanged, Func unitStatusChanged, Func callStatusChanged, Func personnelStaffingChanged) { diff --git a/Providers/Resgrid.Providers.Bus/NotificationProvider.cs b/Providers/Resgrid.Providers.Bus/NotificationProvider.cs index e44ae8f4..cd0d20c9 100644 --- a/Providers/Resgrid.Providers.Bus/NotificationProvider.cs +++ b/Providers/Resgrid.Providers.Bus/NotificationProvider.cs @@ -6,7 +6,6 @@ using Resgrid.Model; using Resgrid.Model.Providers; using Microsoft.Azure.NotificationHubs; -using MoreLinq; using Newtonsoft.Json.Linq; using Resgrid.Providers.Bus.Models; using Newtonsoft.Json; diff --git a/Providers/Resgrid.Providers.Bus/OutboundEventProvider.cs b/Providers/Resgrid.Providers.Bus/OutboundEventProvider.cs index dff03842..bd99b596 100644 --- a/Providers/Resgrid.Providers.Bus/OutboundEventProvider.cs +++ b/Providers/Resgrid.Providers.Bus/OutboundEventProvider.cs @@ -1,15 +1,9 @@ -using Microsoft.Azure.NotificationHubs.Messaging; -using Microsoft.Azure.ServiceBus; -using Resgrid.Config; -using Resgrid.Framework; -using Resgrid.Model; +using Resgrid.Config; using Resgrid.Model.Events; using Resgrid.Model.Providers; using Resgrid.Model.Queue; using Resgrid.Providers.Bus.Rabbit; using System; -using System.Text; -using System.Threading; namespace Resgrid.Providers.Bus { @@ -59,21 +53,10 @@ public OutboundEventProvider(IEventAggregator eventAggregator, IOutboundQueuePro _eventAggregator.AddListener(personnelStaffingChangedTopicHandler); _eventAggregator.AddListener(unitStatusTopicHandler); _eventAggregator.AddListener(callAddedTopicHandler); + _eventAggregator.AddListener(callUpdatedTopicHandler); + _eventAggregator.AddListener(callClosedTopicHandler); } - #region Private Helpers - private static Microsoft.Azure.ServiceBus.Message CreateMessage(Guid messageId, string messageBody) - { - return new Microsoft.Azure.ServiceBus.Message(Encoding.UTF8.GetBytes(messageBody)) { MessageId = messageId.ToString() }; - } - - private static void HandleTransientErrors(MessagingException e) - { - //If transient error/exception, let's back-off for 2 seconds and retry - Thread.Sleep(2000); - } - #endregion Private Helpers - public Action unitStatusHandler = async delegate(UnitStatusEvent message) { var nqi = new NotificationItem(); @@ -433,174 +416,24 @@ private static void HandleTransientErrors(MessagingException e) #region Topic Based Events public Action departmentSettingsChangedHandler = async delegate(DepartmentSettingsChangedEvent message) { - var topicClient = new TopicClient(Config.ServiceBusConfig.AzureServiceBusConnectionString, Topics.GenericTopic); + var nqi = new NotificationItem(); - var messageBus = CreateMessage(Guid.NewGuid(), new { DepartmentId = message.DepartmentId }.SerializeJson()); - messageBus.CorrelationId = message.DepartmentId.ToString(); - messageBus.UserProperties.Add("Type", (int)EventTypes.DepartmentSettingsChanged); - messageBus.UserProperties.Add("Value", message.DepartmentId); - messageBus.UserProperties.Add("DepartmentId", message.DepartmentId); + nqi.Type = (int)EventTypes.DepartmentSettingsChanged; + nqi.DepartmentId = message.DepartmentId; + nqi.ItemId = message.DepartmentId; + nqi.Value = message.DepartmentId.ToString(); - while (true) - { - try - { - await topicClient.SendAsync(messageBus); - break; - } - catch (MessagingCommunicationException e) - { - if (!e.IsTransient) - throw; - else - HandleTransientErrors(e); - } - } + await _outboundQueueProvider.EnqueueNotification(nqi); }; - //public class DepartmentSettingsChangedHandler : IListener - //{ - // public async Task Handle(DepartmentSettingsChangedEvent message) - // { - // var topicClient = new TopicClient(Config.ServiceBusConfig.AzureServiceBusConnectionString, Topics.GenericTopic); - - // var messageBus = CreateMessage(Guid.NewGuid(), new { DepartmentId = message.DepartmentId }.SerializeJson()); - // messageBus.CorrelationId = message.DepartmentId.ToString(); - // messageBus.UserProperties.Add("Type", (int)EventTypes.DepartmentSettingsChanged); - // messageBus.UserProperties.Add("Value", message.DepartmentId); - // messageBus.UserProperties.Add("DepartmentId", message.DepartmentId); - - // while (true) - // { - // try - // { - // await topicClient.SendAsync(messageBus); - // break; - // } - // catch (MessagingCommunicationException e) - // { - // if (!e.IsTransient) - // throw; - // else - // HandleTransientErrors(e); - // } - // } - - // return true; - // } - //} - public Action workerHeartbeatHandler = async delegate(WorkerHeartbeatEvent message) { - var topicClient = new TopicClient(Config.ServiceBusConfig.AzureServiceBusWorkerConnectionString, Topics.WorkerHeartbeatTopic); - - var messageBus = CreateMessage(Guid.NewGuid(), new { WorkerType = message.WorkerType, TimeStamp = message.Timestamp }.SerializeJson()); - messageBus.UserProperties.Add("Type", (int)HeartbeatTypes.Worker); - - while (true) - { - int retryCount = 0; - - try - { - await topicClient.SendAsync(messageBus); - break; - } - catch (MessagingException e) - { - if (!e.IsTransient) - throw; - else - HandleTransientErrors(e); - } - catch (TimeoutException) - { - if (retryCount < 3) - { - retryCount++; - Thread.Sleep(2000); - } - else - throw; - } - } + }; - //public class WorkerHeartbeatHandler : IListener - //{ - // public async Task Handle(WorkerHeartbeatEvent message) - // { - // var topicClient = new TopicClient(Config.ServiceBusConfig.AzureServiceBusWorkerConnectionString, Topics.WorkerHeartbeatTopic); - - // var messageBus = CreateMessage(Guid.NewGuid(), new { WorkerType = message.WorkerType, TimeStamp = message.Timestamp }.SerializeJson()); - // messageBus.UserProperties.Add("Type", (int)HeartbeatTypes.Worker); - - // while (true) - // { - // int retryCount = 0; - - // try - // { - // await topicClient.SendAsync(messageBus); - // break; - // } - // catch (MessagingException e) - // { - // if (!e.IsTransient) - // throw; - // else - // HandleTransientErrors(e); - // } - // catch (TimeoutException) - // { - // if (retryCount < 3) - // { - // retryCount++; - // Thread.Sleep(2000); - // } - // else - // throw; - // } - // } - - // return true; - // } - //} - public Action dListCheckHandler = async delegate(DistributionListCheckEvent message) { - var topicClient = new TopicClient(Config.ServiceBusConfig.AzureServiceBusWorkerConnectionString, Topics.WorkerHeartbeatTopic); - - var messageBus = CreateMessage(Guid.NewGuid(), new { ListId = message.DistributionListId, TimeStamp = message.Timestamp, IsFailure = message.IsFailure, ErrorMessage = message.ErrorMessage }.SerializeJson()); - messageBus.UserProperties.Add("Type", (int)HeartbeatTypes.DListCheck); - - while (true) - { - int retryCount = 0; - - try - { - await topicClient.SendAsync(messageBus); - break; - } - catch (MessagingException e) - { - if (!e.IsTransient) - throw; - else - HandleTransientErrors(e); - } - catch (TimeoutException) - { - if (retryCount < 3) - { - retryCount++; - Thread.Sleep(2000); - } - else - throw; - } - } + }; public Action personnelStatusChangedTopicHandler = async delegate (UserStatusEvent message) @@ -612,41 +445,7 @@ private static void HandleTransientErrors(MessagingException e) else { - var topicClient = new TopicClient(Config.ServiceBusConfig.AzureEventingTopicConnectionString, Topics.EventingTopic); - var topicMessage = CreateMessage(Guid.NewGuid(), - new - { - Type = EventingTypes.PersonnelStatusUpdated, - TimeStamp = DateTime.UtcNow, - DepartmentId = message.Status.DepartmentId, - ItemId = message.Status.ActionLogId - }.SerializeJson()); - topicMessage.UserProperties.Add("Type", (int)EventingTypes.PersonnelStatusUpdated); - topicMessage.UserProperties.Add("DepartmentId", message.Status.DepartmentId); - topicMessage.UserProperties.Add("ItemId", message.Status.ActionLogId); - - - int retry = 0; - bool sent = false; - - while (!sent) - { - try - { - await topicClient.SendAsync(topicMessage); - sent = true; - } - catch (Exception ex) - { - Logging.LogException(ex, message.ToString()); - - if (retry >= 5) - break; - - Thread.Sleep(1000); - retry++; - } - } + } }; @@ -655,42 +454,6 @@ private static void HandleTransientErrors(MessagingException e) { if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) _rabbitTopicProvider.PersonnelStaffingChanged(message); - - var topicClient = new TopicClient(Config.ServiceBusConfig.AzureEventingTopicConnectionString, Topics.EventingTopic); - var topicMessage = CreateMessage(Guid.NewGuid(), - new - { - Type = EventingTypes.PersonnelStaffingUpdated, - TimeStamp = DateTime.UtcNow, - DepartmentId = message.DepartmentId, - ItemId = message.Staffing.UserStateId - }.SerializeJson()); - topicMessage.UserProperties.Add("Type", (int)EventingTypes.PersonnelStaffingUpdated); - topicMessage.UserProperties.Add("DepartmentId", message.DepartmentId); - topicMessage.UserProperties.Add("ItemId", message.Staffing.UserStateId); - - - int retry = 0; - bool sent = false; - - while (!sent) - { - try - { - await topicClient.SendAsync(topicMessage); - sent = true; - } - catch (Exception ex) - { - Logging.LogException(ex, message.ToString()); - - if (retry >= 5) - break; - - Thread.Sleep(1000); - retry++; - } - } }; public Action unitStatusTopicHandler = async delegate(UnitStatusEvent message) @@ -701,41 +464,6 @@ private static void HandleTransientErrors(MessagingException e) } else { - var topicClient = new TopicClient(Config.ServiceBusConfig.AzureEventingTopicConnectionString, Topics.EventingTopic); - var topicMessage = CreateMessage(Guid.NewGuid(), - new - { - Type = EventingTypes.UnitStatusUpdated, - TimeStamp = DateTime.UtcNow, - DepartmentId = message.DepartmentId, - ItemId = message.Status.UnitStateId - }.SerializeJson()); - topicMessage.UserProperties.Add("Type", (int)EventingTypes.UnitStatusUpdated); - topicMessage.UserProperties.Add("DepartmentId", message.DepartmentId); - topicMessage.UserProperties.Add("ItemId", message.Status.UnitStateId); - - - int retry = 0; - bool sent = false; - - while (!sent) - { - try - { - await topicClient.SendAsync(topicMessage); - sent = true; - } - catch (Exception ex) - { - Logging.LogException(ex, message.ToString()); - - if (retry >= 5) - break; - - Thread.Sleep(1000); - retry++; - } - } } }; @@ -747,40 +475,31 @@ private static void HandleTransientErrors(MessagingException e) } else { - var topicClient = new TopicClient(Config.ServiceBusConfig.AzureEventingTopicConnectionString, Topics.EventingTopic); - var topicMessage = CreateMessage(Guid.NewGuid(), - new - { - Type = EventingTypes.CallsUpdated, - TimeStamp = DateTime.UtcNow, - DepartmentId = message.DepartmentId, - ItemId = message.Call.CallId - }.SerializeJson()); - topicMessage.UserProperties.Add("Type", (int)EventingTypes.CallsUpdated); - topicMessage.UserProperties.Add("DepartmentId", message.DepartmentId); - topicMessage.UserProperties.Add("ItemId", message.Call.CallId); - - int retry = 0; - bool sent = false; - - while (!sent) - { - try - { - await topicClient.SendAsync(topicMessage); - sent = true; - } - catch (Exception ex) - { - Logging.LogException(ex, message.ToString()); - - if (retry >= 5) - break; - - Thread.Sleep(1000); - retry++; - } - } + + } + }; + + public Action callUpdatedTopicHandler = async delegate (CallUpdatedEvent message) + { + if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) + { + _rabbitTopicProvider.CallUpdated(message); + } + else + { + + } + }; + + public Action callClosedTopicHandler = async delegate (CallClosedEvent message) + { + if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) + { + _rabbitTopicProvider.CallClosed(message); + } + else + { + } }; #endregion Topic Based Events diff --git a/Providers/Resgrid.Providers.Bus/OutboundQueueProvider.cs b/Providers/Resgrid.Providers.Bus/OutboundQueueProvider.cs index 1108bdb0..269e042a 100644 --- a/Providers/Resgrid.Providers.Bus/OutboundQueueProvider.cs +++ b/Providers/Resgrid.Providers.Bus/OutboundQueueProvider.cs @@ -1,12 +1,7 @@ -using Microsoft.Azure.ServiceBus; -using Resgrid.Config; -using Resgrid.Framework; +using Resgrid.Config; using Resgrid.Model.Providers; using Resgrid.Model.Queue; using Resgrid.Providers.Bus.Rabbit; -using System; -using System.Text; -using System.Threading; using System.Threading.Tasks; namespace Resgrid.Providers.Bus @@ -14,17 +9,10 @@ namespace Resgrid.Providers.Bus public class OutboundQueueProvider : IOutboundQueueProvider { private readonly RabbitOutboundQueueProvider _rabbitOutboundQueueProvider; - private static QueueClient _callClient = null; - private static QueueClient _messageClient = null; - private static QueueClient _notificationClient = null; - private static QueueClient _shiftsClient = null; - private static QueueClient _distributionListClient = null; public OutboundQueueProvider() { _rabbitOutboundQueueProvider = new RabbitOutboundQueueProvider(); - - VerifyAndCreateClients(); } public async Task EnqueueCall(CallQueueItem callQueue) @@ -32,34 +20,7 @@ public async Task EnqueueCall(CallQueueItem callQueue) if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) return _rabbitOutboundQueueProvider.EnqueueCall(callQueue); - VerifyAndCreateClients(); - string serializedObject = String.Empty; - - try - { - serializedObject = ObjectSerialization.Serialize(callQueue); - - // We are limited to 256KB in azure queue messages - var size = ASCIIEncoding.Unicode.GetByteCount(serializedObject); - if (size > 220000) - { - callQueue.Profiles = null; - serializedObject = ObjectSerialization.Serialize(callQueue); - } - } - catch { } - - // If we get an Exception, i.e. OutOfMemmory, lets just strip out the heavy data and try. - if (String.IsNullOrWhiteSpace(serializedObject)) - { - callQueue.Profiles = null; - serializedObject = ObjectSerialization.Serialize(callQueue); - } - - Message message = new Message(Encoding.UTF8.GetBytes(serializedObject)); - message.MessageId = string.Format("{0}|{1}", callQueue.Call.CallId, callQueue.Call.DispatchCount); - - return await SendMessage(_callClient, message); + return false; } public async Task EnqueueMessage(MessageQueueItem messageQueue) @@ -67,45 +28,7 @@ public async Task EnqueueMessage(MessageQueueItem messageQueue) if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) return _rabbitOutboundQueueProvider.EnqueueMessage(messageQueue); - - VerifyAndCreateClients(); - string serializedObject = String.Empty; - - if (messageQueue != null && messageQueue.Message != null && messageQueue.MessageId == 0 && messageQueue.Message.MessageId != 0) - messageQueue.MessageId = messageQueue.Message.MessageId; - - try - { - serializedObject = ObjectSerialization.Serialize(messageQueue); - - // We are limited to 256KB in azure queue messages - var size = ASCIIEncoding.Unicode.GetByteCount(serializedObject); - if (size > 220000) - { - messageQueue.Profiles = null; - serializedObject = ObjectSerialization.Serialize(messageQueue); - } - - if (ASCIIEncoding.Unicode.GetByteCount(serializedObject) > 220000) - { - messageQueue.Message.MessageRecipients = null; - serializedObject = ObjectSerialization.Serialize(messageQueue); - } - } - catch { } - - // If we get an Exception, i.e. OutOfMemmory, lets just strip out the heavy data and try. - if (String.IsNullOrWhiteSpace(serializedObject)) - { - messageQueue.Profiles = null; - messageQueue.Message.MessageRecipients = null; - serializedObject = ObjectSerialization.Serialize(messageQueue); - } - - Message message = new Message(Encoding.UTF8.GetBytes(serializedObject)); - message.MessageId = string.Format("{0}|{1}", messageQueue.Message.MessageId, messageQueue.Message.ReceivingUserId); - - return await SendMessage(_messageClient, message); + return false; } public async Task EnqueueDistributionList(DistributionListQueueItem distributionListQueue) @@ -113,43 +36,7 @@ public async Task EnqueueDistributionList(DistributionListQueueItem distri if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) return _rabbitOutboundQueueProvider.EnqueueDistributionList(distributionListQueue); - - VerifyAndCreateClients(); - string serializedObject = String.Empty; - - try - { - serializedObject = ObjectSerialization.Serialize(distributionListQueue); - - // We are limited to 256KB in azure queue messages - var size = ASCIIEncoding.Unicode.GetByteCount(serializedObject); - if (size > 220000) - { - distributionListQueue.Users = null; - serializedObject = ObjectSerialization.Serialize(distributionListQueue); - } - - // If were still too big, strip out some attachments - if (size > 220000) - { - distributionListQueue.Message.Attachments = null; - serializedObject = ObjectSerialization.Serialize(distributionListQueue); - } - } - catch { } - - // If we get an Exception, i.e. OutOfMemmory, lets just strip out the heavy data and try. - if (String.IsNullOrWhiteSpace(serializedObject)) - { - distributionListQueue.Users = null; - distributionListQueue.Message.Attachments = null; - serializedObject = ObjectSerialization.Serialize(distributionListQueue); - } - - Message message = new Message(Encoding.UTF8.GetBytes(serializedObject)); - message.MessageId = string.Format("{0}|{1}", distributionListQueue.Message.MessageID, distributionListQueue.List.DistributionListId); - - return await SendMessage(_distributionListClient, message); + return false; } public async Task EnqueueNotification(NotificationItem notificationQueue) @@ -157,12 +44,7 @@ public async Task EnqueueNotification(NotificationItem notificationQueue) if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) return _rabbitOutboundQueueProvider.EnqueueNotification(notificationQueue); - VerifyAndCreateClients(); - - Message message = new Message(Encoding.UTF8.GetBytes(ObjectSerialization.Serialize(notificationQueue))); - message.MessageId = string.Format("{0}", notificationQueue.GetHashCode()); - - return await SendMessage(_notificationClient, message); + return false; } public async Task EnqueueShiftNotification(ShiftQueueItem shiftQueueItem) @@ -170,138 +52,7 @@ public async Task EnqueueShiftNotification(ShiftQueueItem shiftQueueItem) if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) return _rabbitOutboundQueueProvider.EnqueueShiftNotification(shiftQueueItem); - VerifyAndCreateClients(); - - Message message = new Message(Encoding.UTF8.GetBytes(ObjectSerialization.Serialize(shiftQueueItem))); - message.MessageId = Guid.NewGuid().ToString(); - - return await SendMessage(_shiftsClient, message); - } - - private async Task SendMessage(QueueClient client, Message message) - { - if (client != null) - { - int retry = 0; - bool sent = false; - - while (!sent) - { - try - { - await client.SendAsync(message); - sent = true; - } - catch (Exception ex) - { - Logging.LogException(ex, message.ToString()); - - if (retry >= 5) - return false; - - Thread.Sleep(1000); - retry++; - } - } - - return sent; - } - return false; } - - private void VerifyAndCreateClients() - { - if (!String.IsNullOrWhiteSpace(Config.ServiceBusConfig.AzureQueueConnectionString)) - { - while (_callClient == null || _callClient.IsClosedOrClosing) - { - try - { - var builder = new ServiceBusConnectionStringBuilder(Config.ServiceBusConfig.AzureQueueConnectionString) - { - OperationTimeout = TimeSpan.FromMinutes(5), - EntityPath = Config.ServiceBusConfig.CallBroadcastQueueName - }; - - _callClient = new QueueClient(builder); - } - catch (TimeoutException) { } - } - } - - if (!String.IsNullOrWhiteSpace(Config.ServiceBusConfig.AzureQueueMessageConnectionString)) - { - while (_messageClient == null || _messageClient.IsClosedOrClosing) - { - try - { - var builder = new ServiceBusConnectionStringBuilder(Config.ServiceBusConfig.AzureQueueMessageConnectionString) - { - OperationTimeout = TimeSpan.FromMinutes(5), - EntityPath = Config.ServiceBusConfig.MessageBroadcastQueueName - }; - - _messageClient = new QueueClient(builder); - } - catch (TimeoutException) { } - } - } - - - if (!String.IsNullOrWhiteSpace(Config.ServiceBusConfig.AzureQueueNotificationConnectionString)) - { - while (_notificationClient == null || _notificationClient.IsClosedOrClosing) - { - try - { - var builder = new ServiceBusConnectionStringBuilder(Config.ServiceBusConfig.AzureQueueNotificationConnectionString) - { - OperationTimeout = TimeSpan.FromMinutes(5), - EntityPath = Config.ServiceBusConfig.NotificaitonBroadcastQueueName - }; - - _notificationClient = new QueueClient(builder); - } - catch (TimeoutException) { } - } - } - - if (!String.IsNullOrWhiteSpace(Config.ServiceBusConfig.AzureQueueShiftsConnectionString)) - { - while (_shiftsClient == null || _shiftsClient.IsClosedOrClosing) - { - try - { - var builder = new ServiceBusConnectionStringBuilder(Config.ServiceBusConfig.AzureQueueShiftsConnectionString) - { - OperationTimeout = TimeSpan.FromMinutes(5), - EntityPath = Config.ServiceBusConfig.ShiftNotificationsQueueName - }; - - _shiftsClient = new QueueClient(builder); - } - catch (TimeoutException) { } - } - } - - if (!String.IsNullOrWhiteSpace(Config.ServiceBusConfig.AzureQueueEmailConnectionString)) - { - while (_distributionListClient == null || _distributionListClient.IsClosedOrClosing) - { - try - { - var builder = new ServiceBusConnectionStringBuilder(Config.ServiceBusConfig.AzureQueueEmailConnectionString) - { - OperationTimeout = TimeSpan.FromMinutes(5), - EntityPath = Config.ServiceBusConfig.EmailBroadcastQueueName - }; - - _distributionListClient = new QueueClient(builder); - } - catch (TimeoutException) { } - } - } - } } } diff --git a/Providers/Resgrid.Providers.Bus/PaymentProvider.cs b/Providers/Resgrid.Providers.Bus/PaymentProvider.cs index 98d956d4..1d349aa2 100644 --- a/Providers/Resgrid.Providers.Bus/PaymentProvider.cs +++ b/Providers/Resgrid.Providers.Bus/PaymentProvider.cs @@ -1,38 +1,17 @@ -using System; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Azure.ServiceBus; -using Resgrid.Framework; +using System.Threading.Tasks; using Resgrid.Model; using Resgrid.Model.Providers; using Resgrid.Providers.Bus.Rabbit; -using Message = Microsoft.Azure.ServiceBus.Message; namespace Resgrid.Providers.Bus { public class PaymentProvider : IPaymentProvider { private readonly RabbitOutboundQueueProvider _rabbitOutboundQueueProvider; - private readonly QueueClient _systemClient = null; public PaymentProvider() { - if (Config.SystemBehaviorConfig.ServiceBusType == Config.ServiceBusTypes.Azure) - { - while (_systemClient == null) - { - try - { - _systemClient = new QueueClient(Config.ServiceBusConfig.AzureQueueSystemConnectionString, Config.ServiceBusConfig.PaymentQueueName); - } - catch (TimeoutException) { } - } - } - else - { - _rabbitOutboundQueueProvider = new RabbitOutboundQueueProvider(); - } + _rabbitOutboundQueueProvider = new RabbitOutboundQueueProvider(); } public async Task EnqueuePaymentEventAsync(CqrsEvent cqrsEvent) @@ -43,42 +22,6 @@ public async Task EnqueuePaymentEventAsync(CqrsEvent cqrsEvent) return true; } - var serializedObject = ObjectSerialization.Serialize(cqrsEvent); - Message message = new Message(Encoding.UTF8.GetBytes(serializedObject)); - message.MessageId = string.Format("{0}", cqrsEvent.EventId); - - return await SendMessageAsync(_systemClient, message); - } - - private async Task SendMessageAsync(QueueClient client, Message message) - { - if (Config.SystemBehaviorConfig.ServiceBusType == Config.ServiceBusTypes.Azure) - { - int retry = 0; - bool sent = false; - - while (!sent) - { - try - { - await client.SendAsync(message); - sent = true; - } - catch (Exception ex) - { - Logging.LogException(ex, message.ToString()); - - if (retry >= 5) - return false; - - Thread.Sleep(250); - retry++; - } - } - - return sent; - } - return false; } } diff --git a/Providers/Resgrid.Providers.Bus/Resgrid.Providers.Bus.csproj b/Providers/Resgrid.Providers.Bus/Resgrid.Providers.Bus.csproj index f6834af9..d292b811 100644 --- a/Providers/Resgrid.Providers.Bus/Resgrid.Providers.Bus.csproj +++ b/Providers/Resgrid.Providers.Bus/Resgrid.Providers.Bus.csproj @@ -1,7 +1,7 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker @@ -10,12 +10,10 @@ - + - - - - + + diff --git a/Providers/Resgrid.Providers.Bus/UnitNotificationProvider.cs b/Providers/Resgrid.Providers.Bus/UnitNotificationProvider.cs index 96289495..e70e96e2 100644 --- a/Providers/Resgrid.Providers.Bus/UnitNotificationProvider.cs +++ b/Providers/Resgrid.Providers.Bus/UnitNotificationProvider.cs @@ -6,6 +6,7 @@ using Resgrid.Model; using Resgrid.Model.Providers; using Microsoft.Azure.NotificationHubs; +using Newtonsoft.Json.Linq; namespace Resgrid.Providers.Bus { @@ -19,14 +20,18 @@ public async Task RegisterPush(PushUri pushUri) if (pushUri.UnitId.HasValue) { var hubClient = NotificationHubClient.CreateClientFromConnectionString(Config.ServiceBusConfig.AzureUnitNotificationHub_FullConnectionString, Config.ServiceBusConfig.AzureUnitNotificationHub_PushUrl); - var unitTags = new string[] + + var tagsWithHashedDeviceId = new List(new string[] { + string.Format("unitId:{0}", pushUri.UnitId), + string.Format("platform:{0}", pushUri.PlatformType), + string.Format("uuid:{0}", pushUri.PushLocation), + string.Format("deviceId:{0}", pushUri.DeviceId.GetHashCode()) + }); + + if (pushUri.DepartmentId > 0) { - string.Format("pushUriId:{0}", pushUri.PushUriId), - string.Format("deviceId:{0}", pushUri.DeviceId.GetHashCode()), // Device Id is the registration token - string.Format("unitId:{0}", pushUri.UnitId), - string.Format("uuid:{0}", pushUri.PushLocation), - string.Format("did:{0}", pushUri.DepartmentId) - }; + tagsWithHashedDeviceId.Add(string.Format("departmentId:{0}", pushUri.DepartmentId)); + } CollectionQueryResult registrations = null; try @@ -62,30 +67,39 @@ public async Task RegisterPush(PushUri pushUri) { try { - var result = await hubClient.CreateMpnsNativeRegistrationAsync(pushUri.PushLocation, unitTags); + var result = await hubClient.CreateMpnsNativeRegistrationAsync(pushUri.PushLocation, tagsWithHashedDeviceId.ToArray()); } catch (ArgumentException ex) { + Framework.Logging.LogException(ex, + string.Format("Device Information: {0} {1} {2} {3}", tagsWithHashedDeviceId[0], tagsWithHashedDeviceId[1], + tagsWithHashedDeviceId[2], tagsWithHashedDeviceId[3])); } } else if (pushUri.PlatformType == (int)Platforms.UnitAndroid) { try { - var result = await hubClient.CreateFcmNativeRegistrationAsync(pushUri.DeviceId, unitTags); + var result = await hubClient.CreateFcmNativeRegistrationAsync(pushUri.DeviceId, tagsWithHashedDeviceId.ToArray()); } catch (ArgumentException ex) { + Framework.Logging.LogException(ex, + string.Format("Device Information: {0} {1} {2} {3}", tagsWithHashedDeviceId[0], tagsWithHashedDeviceId[1], + tagsWithHashedDeviceId[2], tagsWithHashedDeviceId[3])); } } else if (pushUri.PlatformType == (int)Platforms.UnitIOS) { try { - var result = await hubClient.CreateAppleNativeRegistrationAsync(pushUri.DeviceId, unitTags); + var result = await hubClient.CreateAppleNativeRegistrationAsync(pushUri.DeviceId, tagsWithHashedDeviceId.ToArray()); } catch (ArgumentException ex) { + Framework.Logging.LogException(ex, + string.Format("Device Information: {0} {1} {2} {3}", tagsWithHashedDeviceId[0], tagsWithHashedDeviceId[1], + tagsWithHashedDeviceId[2], tagsWithHashedDeviceId[3])); } } } @@ -95,19 +109,11 @@ public async Task UnRegisterPush(PushUri pushUri) { var hubClient = NotificationHubClient.CreateClientFromConnectionString(Config.ServiceBusConfig.AzureUnitNotificationHub_FullConnectionString, Config.ServiceBusConfig.AzureUnitNotificationHub_PushUrl); - var registrations = await hubClient.GetRegistrationsByTagAsync(string.Format("userId:{0}", pushUri.UserId), 50); + var registrations = await hubClient.GetRegistrationsByTagAsync(string.Format("deviceId:{0}", pushUri.DeviceId), 50); foreach (var registration in registrations) { - if (pushUri.PlatformType == (int)Platforms.Windows8 || - pushUri.PlatformType == (int)Platforms.WindowsPhone7 || - pushUri.PlatformType == (int)Platforms.WindowsPhone8) - { - var winReg = registration as WindowsRegistrationDescription; - if (winReg != null && winReg.ChannelUri == pushUri.ChannelUri) - await hubClient.DeleteRegistrationAsync(registration); - } - else if (pushUri.PlatformType == (int)Platforms.Android) + if (pushUri.PlatformType == (int)Platforms.Android) { var androidReg = registration as GcmRegistrationDescription; if (androidReg != null && androidReg.GcmRegistrationId == pushUri.DeviceId) @@ -219,7 +225,7 @@ public async Task> GetRegistrationsByDeviceId( return registrations; } - public async Task> GetRegistrationsByUserId(string userId) + public async Task> GetRegistrationsByUnitId(int unitId) { var registrations = new List(); @@ -227,7 +233,7 @@ public async Task> GetRegistrationsByUserId(st { var hubClient = NotificationHubClient.CreateClientFromConnectionString(Config.ServiceBusConfig.AzureUnitNotificationHub_FullConnectionString, Config.ServiceBusConfig.AzureUnitNotificationHub_PushUrl); - var registraions = await hubClient.GetRegistrationsByTagAsync(string.Format("userId:{0}", userId), 50); + var registraions = await hubClient.GetRegistrationsByTagAsync(string.Format("unitId:{0}", unitId), 50); if (registraions != null && registraions.Any()) foreach (var registraion in registraions) @@ -298,29 +304,7 @@ public async Task SendAndroidNotification(string title try { var hubClient = NotificationHubClient.CreateClientFromConnectionString(Config.ServiceBusConfig.AzureUnitNotificationHub_FullConnectionString, Config.ServiceBusConfig.AzureUnitNotificationHub_PushUrl); - string androidNotification = null; - - if (type == ((int)PushSoundTypes.CallEmergency).ToString() || - type == ((int)PushSoundTypes.CallHigh).ToString() || - type == ((int)PushSoundTypes.CallMedium).ToString() || - type == ((int)PushSoundTypes.CallLow).ToString()) - { - androidNotification = "{ \"data\" : {\"title\":\"" + title + "\", \"message\":\"" + subTitle + "\", \"content-available\": \"1\", \"eventCode\":\"" + eventCode + "\", \"sound\":\"" + - FormatForAndroidNativePush(GetSoundFileNameFromType(Platforms.Android, type, enableCustomSounds)) + "\", \"soundname\":\"" + - FormatForAndroidNativePush(GetSoundFileNameFromType(Platforms.Android, type, enableCustomSounds)) + "\"," + - //"\"actions\": [{ title: \"RESPONDING\", callback: \"window.pushActionResponding\"},{ title: \"NOT RESPONDING\", callback: \"window.pushActionNotResponding\"},]" + - "\"actions\": [{ icon: \"emailGuests\", title: \"RESPONDING\", callback: \"pushActionResponding\"},{ icon: \"emailGuests\", title: \"NOT RESPONDING\", callback: \"pushActionNotResponding\"}]" + - "}}"; - } - else - { - androidNotification = "{ \"data\" : {\"title\":\"" + title + "\", \"message\":\"" + subTitle + - "\", \"eventCode\":\"" + eventCode + "\", \"sound\":\"" + - FormatForAndroidNativePush(GetSoundFileNameFromType(Platforms.Android, type, - enableCustomSounds)) + "\", \"soundname\":\"" + - FormatForAndroidNativePush(GetSoundFileNameFromType(Platforms.Android, type, - enableCustomSounds)) + "\"}}"; - } + string androidNotification = CreateAndroidNotification(subTitle, title, eventCode, type, count, color, "calls"); var androidOutcome = await hubClient.SendFcmNativeNotificationAsync(androidNotification, string.Format("unitId:{0}", unitId)); @@ -467,5 +451,41 @@ private string FormatForAndroidNativePush(string fileName) return Path.GetFileNameWithoutExtension(fileName).Replace("_", "").ToLower(); } + + private string CreateAndroidNotification(string title, string subTitle, string eventCode, string type, int count, string color, string channel) + { + if (color == null) + color = "#ff0000"; + + if (count == 0) + count = 1; + + string soundFilename = FormatForAndroidNativePush(GetSoundFileNameFromType(Platforms.Android, type, true)); + + dynamic pushNotification = new JObject(); + pushNotification.notification = new JObject(); + pushNotification.notification.title = title; + pushNotification.notification.body = subTitle; + pushNotification.notification.android_channel_id = type; + //pushNotification.notification.sound = soundFilename + ".wav"; + pushNotification.data = new JObject(); + pushNotification.data["content-available"] = 1; + pushNotification.data["force-start"] = 1; + pushNotification.data.notId = eventCode; + pushNotification.data.eventCode = eventCode; + + if (channel != null && channel == "calls") + pushNotification.data.priority = "high"; + + pushNotification.data.sound = soundFilename; + pushNotification.data.color = color; + pushNotification.data.count = count; + //pushNotification.data.ledColor = new JArray(0, int.Parse(color.Substring(1, 2), System.Globalization.NumberStyles.HexNumber), + // int.Parse(color.Substring(3, 2), System.Globalization.NumberStyles.HexNumber), int.Parse(color.Substring(5, 2), System.Globalization.NumberStyles.HexNumber)); + pushNotification.data.vibrationPattern = new JArray(500, 1000, 500); + pushNotification.data.android_channel_id = type; + + return pushNotification.ToString(); + } } } diff --git a/Providers/Resgrid.Providers.Cache/Resgrid.Providers.Cache.csproj b/Providers/Resgrid.Providers.Cache/Resgrid.Providers.Cache.csproj index 88189cf0..c464471b 100644 --- a/Providers/Resgrid.Providers.Cache/Resgrid.Providers.Cache.csproj +++ b/Providers/Resgrid.Providers.Cache/Resgrid.Providers.Cache.csproj @@ -1,13 +1,13 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker - - + + @@ -16,8 +16,4 @@ - - - - diff --git a/Providers/Resgrid.Providers.Claims/ClaimsLogic.cs b/Providers/Resgrid.Providers.Claims/ClaimsLogic.cs index b30b2c58..f3fc38e8 100644 --- a/Providers/Resgrid.Providers.Claims/ClaimsLogic.cs +++ b/Providers/Resgrid.Providers.Claims/ClaimsLogic.cs @@ -1043,5 +1043,29 @@ public static void AddProtocolClaims(ClaimsIdentity identity, bool isAdmin) identity.AddClaim(new Claim(ResgridClaimTypes.Resources.Protocols, ResgridClaimTypes.Actions.Delete)); } } + + public static void AddFormsClaims(ClaimsIdentity identity, bool isAdmin) + { + identity.AddClaim(new Claim(ResgridClaimTypes.Resources.Forms, ResgridClaimTypes.Actions.View)); + + if (isAdmin) + { + identity.AddClaim(new Claim(ResgridClaimTypes.Resources.Forms, ResgridClaimTypes.Actions.Update)); + identity.AddClaim(new Claim(ResgridClaimTypes.Resources.Forms, ResgridClaimTypes.Actions.Create)); + identity.AddClaim(new Claim(ResgridClaimTypes.Resources.Forms, ResgridClaimTypes.Actions.Delete)); + } + } + + public static void AddVoiceClaims(ClaimsIdentity identity, bool isAdmin) + { + identity.AddClaim(new Claim(ResgridClaimTypes.Resources.Voice, ResgridClaimTypes.Actions.View)); + + if (isAdmin) + { + identity.AddClaim(new Claim(ResgridClaimTypes.Resources.Voice, ResgridClaimTypes.Actions.Update)); + identity.AddClaim(new Claim(ResgridClaimTypes.Resources.Voice, ResgridClaimTypes.Actions.Create)); + identity.AddClaim(new Claim(ResgridClaimTypes.Resources.Voice, ResgridClaimTypes.Actions.Delete)); + } + } } } diff --git a/Providers/Resgrid.Providers.Claims/ClaimsPrincipalFactory.cs b/Providers/Resgrid.Providers.Claims/ClaimsPrincipalFactory.cs index ecc0c6f5..cd7b98df 100644 --- a/Providers/Resgrid.Providers.Claims/ClaimsPrincipalFactory.cs +++ b/Providers/Resgrid.Providers.Claims/ClaimsPrincipalFactory.cs @@ -160,6 +160,16 @@ public override async Task CreateAsync(TUser user) ClaimsLogic.AddGroupClaim(id, group.DepartmentGroupId, isGroupAdmin); } + string timeZone = "Pacific Standard Time"; + if (!String.IsNullOrWhiteSpace(department.TimeZone)) + timeZone = department.TimeZone; + + Claim timeZoneClaim = new Claim(ResgridClaimTypes.Data.TimeZone, timeZone); + if (!id.HasClaim(timeZoneClaim.Type, timeZoneClaim.Value)) + { + id.AddClaim(timeZoneClaim); + } + ClaimsLogic.AddCallClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); ClaimsLogic.AddActionClaims(id); ClaimsLogic.AddLogClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); @@ -182,6 +192,8 @@ public override async Task CreateAsync(TUser user) ClaimsLogic.AddConnectClaims(id, departmentAdmin); ClaimsLogic.AddCommandClaims(id, departmentAdmin); ClaimsLogic.AddProtocolClaims(id, departmentAdmin); + ClaimsLogic.AddFormsClaims(id, departmentAdmin); + ClaimsLogic.AddVoiceClaims(id, departmentAdmin); } } diff --git a/Providers/Resgrid.Providers.Claims/JwtTokenProvider.cs b/Providers/Resgrid.Providers.Claims/JwtTokenProvider.cs new file mode 100644 index 00000000..f59096de --- /dev/null +++ b/Providers/Resgrid.Providers.Claims/JwtTokenProvider.cs @@ -0,0 +1,155 @@ +using Microsoft.IdentityModel.Tokens; +using Resgrid.Config; +using Resgrid.Model.Repositories; +using Resgrid.Model.Services; +using System; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; + +namespace Resgrid.Providers.Claims +{ + public class JwtTokenProvider + { + private IUsersService _usersService; + private IDepartmentsService _departmentsService; + private IDepartmentGroupsService _departmentGroupsService; + private IUserProfileService _userProfileService; + private IPermissionsService _permissionsService; + private IPersonnelRolesService _personnelRolesService; + private IClaimsRepository _claimsRepository; + + public JwtTokenProvider(IUsersService usersService, IDepartmentsService departmentsService, IDepartmentGroupsService departmentGroupsService, + IUserProfileService userProfileService, IPermissionsService permissionsService, IPersonnelRolesService personnelRolesService, IClaimsRepository claimsRepository) + { + _usersService = usersService; + _departmentsService = departmentsService; + _departmentGroupsService = departmentGroupsService; + _userProfileService = userProfileService; + _permissionsService = permissionsService; + _personnelRolesService = personnelRolesService; + _claimsRepository = claimsRepository; + } + + public async Task BuildTokenAsync(string userId, int departmentId) + { + ClaimsIdentity id = new ClaimsIdentity(); + + var department = await _departmentsService.GetDepartmentByIdAsync(departmentId); + + if (!department.IsUserInDepartment(userId)) + return null; + + var user = _usersService.GetUserById(userId, false); + var profile = await _userProfileService.GetProfileByUserIdAsync(userId); + var group = await _departmentGroupsService.GetGroupForUserAsync(userId, department.DepartmentId); + var departmentAdmin = department.IsUserAnAdmin(userId); + var permissions = await _permissionsService.GetAllPermissionsForDepartmentAsync(department.DepartmentId); + var roles = await _personnelRolesService.GetRolesForUserAsync(userId, department.DepartmentId); + + id.AddClaim(new Claim(ResgridClaimTypes.Data.UserId, userId)); + id.AddClaim(new Claim(ResgridClaimTypes.Data.DisplayName, profile.FullName.AsFirstNameLastName)); + id.AddClaim(new Claim(ClaimTypes.Email, profile.MembershipEmail)); + ClaimsLogic.AddDepartmentClaim(id, department.DepartmentId, departmentAdmin); + + DateTime signupDate; + if (department.CreatedOn.HasValue) + signupDate = department.CreatedOn.Value; + else + signupDate = DateTime.UtcNow; + + var name = user.UserName; + if (profile != null && !String.IsNullOrWhiteSpace(profile.LastName)) + name = profile.FullName.AsFirstNameLastName; + + ClaimsLogic.AddGeneralClaims(id, user.UserName, + userId, name, department.DepartmentId, department.Name, profile.MembershipEmail, + signupDate); + + Claim timeZoneClaim = new Claim(ResgridClaimTypes.Data.TimeZone, department.TimeZone); + if (!id.HasClaim(timeZoneClaim.Type, timeZoneClaim.Value)) + { + id.AddClaim(timeZoneClaim); + } + + bool isGroupAdmin = false; + + if (group != null) + isGroupAdmin = group.IsUserGroupAdmin(user.Id); + + if (departmentAdmin) + { + var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(department.DepartmentId); + if (groups != null) + { + foreach (var departmentGroup in groups) + { + ClaimsLogic.AddGroupClaim(id, departmentGroup.DepartmentGroupId, true); + } + } + } + else + { + if (group != null) + ClaimsLogic.AddGroupClaim(id, group.DepartmentGroupId, isGroupAdmin); + } + + ClaimsLogic.AddCallClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); + ClaimsLogic.AddActionClaims(id); + ClaimsLogic.AddLogClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); + ClaimsLogic.AddStaffingClaims(id); + ClaimsLogic.AddPersonnelClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); + ClaimsLogic.AddUnitClaims(id, departmentAdmin); + ClaimsLogic.AddUnitLogClaims(id); + ClaimsLogic.AddMessageClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); + ClaimsLogic.AddRoleClaims(id, departmentAdmin); + ClaimsLogic.AddProfileClaims(id); + ClaimsLogic.AddReportsClaims(id); + ClaimsLogic.AddGenericGroupClaims(id, departmentAdmin); + ClaimsLogic.AddDocumentsClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); + ClaimsLogic.AddNotesClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); + ClaimsLogic.AddScheduleClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); + ClaimsLogic.AddShiftClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); + ClaimsLogic.AddTrainingClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); + ClaimsLogic.AddPIIClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); + ClaimsLogic.AddInventoryClaims(id, departmentAdmin, permissions, isGroupAdmin, roles); + ClaimsLogic.AddConnectClaims(id, departmentAdmin); + ClaimsLogic.AddCommandClaims(id, departmentAdmin); + ClaimsLogic.AddProtocolClaims(id, departmentAdmin); + ClaimsLogic.AddFormsClaims(id, departmentAdmin); + ClaimsLogic.AddVoiceClaims(id, departmentAdmin); + + var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(JwtConfig.Key)); + var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature); + var tokenDescriptor = new JwtSecurityToken(JwtConfig.Issuer, JwtConfig.Audience, id.Claims, + expires: DateTime.Now.AddHours(JwtConfig.Duration), signingCredentials: credentials); + return new JwtSecurityTokenHandler().WriteToken(tokenDescriptor); + } + + public bool IsTokenValid(string token) + { + var mySecret = Encoding.UTF8.GetBytes(JwtConfig.Key); + var mySecurityKey = new SymmetricSecurityKey(mySecret); + var tokenHandler = new JwtSecurityTokenHandler(); + try + { + tokenHandler.ValidateToken(token, + new TokenValidationParameters + { + ValidateIssuerSigningKey = true, + ValidateIssuer = true, + ValidateAudience = true, + ValidIssuer = JwtConfig.Issuer, + ValidAudience = JwtConfig.Audience, + IssuerSigningKey = mySecurityKey, + }, out SecurityToken validatedToken); + } + catch + { + return false; + } + return true; + } + } +} diff --git a/Providers/Resgrid.Providers.Claims/Resgrid.Providers.Claims.csproj b/Providers/Resgrid.Providers.Claims/Resgrid.Providers.Claims.csproj index 032a22f7..8452b614 100644 --- a/Providers/Resgrid.Providers.Claims/Resgrid.Providers.Claims.csproj +++ b/Providers/Resgrid.Providers.Claims/Resgrid.Providers.Claims.csproj @@ -1,15 +1,15 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker - - - - + + + + diff --git a/Providers/Resgrid.Providers.Claims/ResgridClaimTypes.cs b/Providers/Resgrid.Providers.Claims/ResgridClaimTypes.cs index 638a3105..73e2d7fc 100644 --- a/Providers/Resgrid.Providers.Claims/ResgridClaimTypes.cs +++ b/Providers/Resgrid.Providers.Claims/ResgridClaimTypes.cs @@ -18,6 +18,14 @@ public static class Memberships public const string Groups = "GroupMemberships"; } + public static class Data + { + // Memberships + public const string TimeZone = "TimeZone"; + public const string DisplayName = "DisplayName"; + public const string UserId = "UserId"; + } + public static class Resources { // Resources @@ -45,6 +53,8 @@ public static class Resources public const string Command = "Command"; public const string Connect = "Connect"; public const string Protocols = "Protocols"; + public const string Forms = "Forms"; + public const string Voice = "Voice"; } public static string CreateDepartmentClaimTypeString(int departmentId) diff --git a/Providers/Resgrid.Providers.Claims/ResgridResources.cs b/Providers/Resgrid.Providers.Claims/ResgridResources.cs index 97f86ac4..601d0d18 100644 --- a/Providers/Resgrid.Providers.Claims/ResgridResources.cs +++ b/Providers/Resgrid.Providers.Claims/ResgridResources.cs @@ -112,5 +112,15 @@ public static class ResgridResources public const string Protocol_Update = "Protocol_Update"; public const string Protocol_Create = "Protocol_Create"; public const string Protocol_Delete = "Protocol_Delete"; + + public const string Forms_View = "Forms_View"; + public const string Forms_Update = "Forms_Update"; + public const string Forms_Create = "Forms_Create"; + public const string Forms_Delete = "Forms_Delete"; + + public const string Voice_View = "Voice_View"; + public const string Voice_Update = "Voice_Update"; + public const string Voice_Create = "Voice_Create"; + public const string Voice_Delete = "Voice_Delete"; } } diff --git a/Providers/Resgrid.Providers.Email/PostmarkTemplateProvider.cs b/Providers/Resgrid.Providers.Email/PostmarkTemplateProvider.cs index f7180760..a261d0d1 100644 --- a/Providers/Resgrid.Providers.Email/PostmarkTemplateProvider.cs +++ b/Providers/Resgrid.Providers.Email/PostmarkTemplateProvider.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Text; using System.Threading.Tasks; using System.Web; @@ -55,7 +56,7 @@ public async Task SendCallMail(string email, string subject, string title, try { - callQuery = HttpUtility.UrlEncode(SymmetricEncryption.Encrypt(callId.ToString(), Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase)); + callQuery = Convert.ToBase64String(Encoding.UTF8.GetBytes(SymmetricEncryption.Encrypt(callId.ToString(), Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase))); } catch { } @@ -105,15 +106,19 @@ public async Task SendCallMail(string email, string subject, string title, } else { - var template = Mustachio.Parser.Parse(GetTempate("Call.html")); - var content = template(templateModel); + try + { + var template = Mustachio.Parser.Parse(GetTempate("Call.html")); + var content = template(templateModel); - Email newEmail = new Email(); - newEmail.HtmlBody = content; - newEmail.Sender = FROM_EMAIL; - newEmail.To.Add(email); + Email newEmail = new Email(); + newEmail.HtmlBody = content; + newEmail.Sender = FROM_EMAIL; + newEmail.To.Add(email); - return await _emailSender.Send(newEmail); + return await _emailSender.Send(newEmail); + } + catch (Exception) { } } return false; @@ -316,19 +321,23 @@ public async Task SendMessageMail(string email, string subject, string mes return true; } - catch (Exception) { } + catch (Exception) { } } else { - var template = Mustachio.Parser.Parse(GetTempate("Message.html")); - var content = template(templateModel); + try + { + var template = Mustachio.Parser.Parse(GetTempate("Message.html")); + var content = template(templateModel); - Email newEmail = new Email(); - newEmail.HtmlBody = content; - newEmail.Sender = FROM_EMAIL; - newEmail.To.Add(email); + Email newEmail = new Email(); + newEmail.HtmlBody = content; + newEmail.Sender = FROM_EMAIL; + newEmail.To.Add(email); - return await _emailSender.Send(newEmail); + return await _emailSender.Send(newEmail); + } + catch (Exception) { } } return false; @@ -374,15 +383,19 @@ public async Task SendPasswordResetMail(string name, string password, stri } else { - var template = Mustachio.Parser.Parse(GetTempate("PasswordReset.html")); - var content = template(templateModel); + try + { + var template = Mustachio.Parser.Parse(GetTempate("PasswordReset.html")); + var content = template(templateModel); - Email newEmail = new Email(); - newEmail.HtmlBody = content; - newEmail.Sender = FROM_EMAIL; - newEmail.To.Add(email); + Email newEmail = new Email(); + newEmail.HtmlBody = content; + newEmail.Sender = FROM_EMAIL; + newEmail.To.Add(email); - return await _emailSender.Send(newEmail); + return await _emailSender.Send(newEmail); + } + catch (Exception) { } } return false; @@ -492,15 +505,19 @@ public async Task SendWelcomeMail(string name, string departmentName, stri } else { - var template = Mustachio.Parser.Parse(GetTempate("Welcome.html")); - var content = template(templateModel); + try + { + var template = Mustachio.Parser.Parse(GetTempate("Welcome.html")); + var content = template(templateModel); - Email newEmail = new Email(); - newEmail.HtmlBody = content; - newEmail.Sender = FROM_EMAIL; - newEmail.To.Add(email); + Email newEmail = new Email(); + newEmail.HtmlBody = content; + newEmail.Sender = FROM_EMAIL; + newEmail.To.Add(email); - return await _emailSender.Send(newEmail); + return await _emailSender.Send(newEmail); + } + catch (Exception) { } } return false; diff --git a/Providers/Resgrid.Providers.Email/Resgrid.Providers.Email.csproj b/Providers/Resgrid.Providers.Email/Resgrid.Providers.Email.csproj index a579e78e..e60a49a0 100644 --- a/Providers/Resgrid.Providers.Email/Resgrid.Providers.Email.csproj +++ b/Providers/Resgrid.Providers.Email/Resgrid.Providers.Email.csproj @@ -1,7 +1,7 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker @@ -24,11 +24,11 @@ - - - + + + - + @@ -36,6 +36,7 @@ + diff --git a/Providers/Resgrid.Providers.Email/Template/Call.html b/Providers/Resgrid.Providers.Email/Template/Call.html index cd34fba8..ed65e0ab 100644 --- a/Providers/Resgrid.Providers.Email/Template/Call.html +++ b/Providers/Resgrid.Providers.Email/Template/Call.html @@ -494,13 +494,14 @@

{{subject}}

diff --git a/Providers/Resgrid.Providers.Email/Template/Invitation.html b/Providers/Resgrid.Providers.Email/Template/Invitation.html index ca0354a2..661ea754 100644 --- a/Providers/Resgrid.Providers.Email/Template/Invitation.html +++ b/Providers/Resgrid.Providers.Email/Template/Invitation.html @@ -455,13 +455,14 @@

Hello,

diff --git a/Providers/Resgrid.Providers.Email/Template/PasswordReset.html b/Providers/Resgrid.Providers.Email/Template/PasswordReset.html index e4f3b885..f64e6600 100644 --- a/Providers/Resgrid.Providers.Email/Template/PasswordReset.html +++ b/Providers/Resgrid.Providers.Email/Template/PasswordReset.html @@ -470,13 +470,14 @@

Hi {{name}},

diff --git a/Providers/Resgrid.Providers.Email/Template/TroubleAlert.html b/Providers/Resgrid.Providers.Email/Template/TroubleAlert.html index d771b5cd..9cc9e8a6 100644 --- a/Providers/Resgrid.Providers.Email/Template/TroubleAlert.html +++ b/Providers/Resgrid.Providers.Email/Template/TroubleAlert.html @@ -439,13 +439,14 @@

TROUBLE ALERT

diff --git a/Providers/Resgrid.Providers.Email/Template/Welcome.html b/Providers/Resgrid.Providers.Email/Template/Welcome.html index 6f6368f6..0d5f5723 100644 --- a/Providers/Resgrid.Providers.Email/Template/Welcome.html +++ b/Providers/Resgrid.Providers.Email/Template/Welcome.html @@ -488,13 +488,14 @@

Welcome, {{name}}!

diff --git a/Providers/Resgrid.Providers.Firebase/Resgrid.Providers.Firebase.csproj b/Providers/Resgrid.Providers.Firebase/Resgrid.Providers.Firebase.csproj index c1eb7b75..6166761b 100644 --- a/Providers/Resgrid.Providers.Firebase/Resgrid.Providers.Firebase.csproj +++ b/Providers/Resgrid.Providers.Firebase/Resgrid.Providers.Firebase.csproj @@ -1,13 +1,13 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker - - + + @@ -16,8 +16,4 @@ - - - - diff --git a/Providers/Resgrid.Providers.Geo/GeoLocationProvider.cs b/Providers/Resgrid.Providers.Geo/GeoLocationProvider.cs index 90a479f7..2ceb31e3 100644 --- a/Providers/Resgrid.Providers.Geo/GeoLocationProvider.cs +++ b/Providers/Resgrid.Providers.Geo/GeoLocationProvider.cs @@ -10,6 +10,7 @@ using RestSharp; using System.Net; using System.Threading.Tasks; +using Resgrid.Providers.Geo.Models.LocationIQ; namespace Resgrid.Providers.GeoLocationProvider { @@ -58,7 +59,7 @@ async Task getAddressFromCords() { try { - var addressGeo = GetAddressFromLatLonLocationIQ(lat.ToString(), lon.ToString()); + var addressGeo = await GetAddressFromLatLonLocationIQ(lat.ToString(), lon.ToString()); if (!String.IsNullOrWhiteSpace(addressGeo)) address = addressGeo; @@ -111,7 +112,7 @@ async Task getCordsFromAddress() { try { - var coords = GetLatLonFromAddressLocationIQ(address); + var coords = await GetLatLonFromAddressLocationIQ(address); if (coords != null) coordinates = string.Format("{0},{1}", coords.Latitude, coords.Longitude); @@ -215,14 +216,14 @@ async Task getRoute() return await _cacheProvider.RetrieveAsync(string.Format(RouteCacheKey, start.GetHashCode(), end.GetHashCode()), getRoute, CacheLength); } - public Coordinates GetCoordinatesFromW3W(string words) + public async Task GetCoordinatesFromW3W(string words) { - Func getLocationFromW3W = delegate () + Func> getLocationFromW3W = async () => { var client = new RestClient("https://api.what3words.com"); - var request = new RestRequest($"/v2/forward?key={Config.MappingConfig.What3WordsApiKey}&lang=en&addr={words}", Method.GET); + var request = new RestRequest($"/v2/forward?key={Config.MappingConfig.What3WordsApiKey}&lang=en&addr={words}", Method.Get); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.Data != null && response.Data.geometry != null) { @@ -236,7 +237,7 @@ public Coordinates GetCoordinatesFromW3W(string words) return null; }; - return _cacheProvider.Retrieve(string.Format(W3WCacheKey, words), getLocationFromW3W, CacheLength); + return await _cacheProvider.RetrieveAsync(string.Format(W3WCacheKey, words), getLocationFromW3W, CacheLength); } public async Task GetCoordinatesFromW3WAsync(string words) @@ -244,9 +245,9 @@ public async Task GetCoordinatesFromW3WAsync(string words) Func> getLocationFromW3W = async () => { var client = new RestClient("https://api.what3words.com"); - var request = new RestRequest($"/v2/forward?key={Config.MappingConfig.What3WordsApiKey}&lang=en&addr={words}", Method.GET); + var request = new RestRequest($"/v2/forward?key={Config.MappingConfig.What3WordsApiKey}&lang=en&addr={words}", Method.Get); - var response = await client.ExecuteTaskAsync(request); + var response = await client.ExecuteAsync(request); if (response.Data != null && response.Data.geometry != null) { @@ -263,14 +264,14 @@ public async Task GetCoordinatesFromW3WAsync(string words) return await _cacheProvider.RetrieveAsync(string.Format(W3WCacheKey, words), getLocationFromW3W, CacheLength); } - public string GetW3WFromCoordinates(Coordinates coordinates) + public async Task GetW3WFromCoordinates(Coordinates coordinates) { - Func getLocationFromW3W = delegate () + Func> getLocationFromW3W = async () => { var client = new RestClient("https://api.what3words.com"); - var request = new RestRequest($"/v2/reverse?key={Config.MappingConfig.What3WordsApiKey}&coords={$"{coordinates.Latitude},{coordinates.Longitude}"}", Method.GET); + var request = new RestRequest($"/v2/reverse?key={Config.MappingConfig.What3WordsApiKey}&coords={$"{coordinates.Latitude},{coordinates.Longitude}"}", Method.Get); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.Data != null && !String.IsNullOrWhiteSpace(response.Data.words)) { @@ -280,19 +281,19 @@ public string GetW3WFromCoordinates(Coordinates coordinates) return null; }; - return _cacheProvider.Retrieve(string.Format(ReverseW3WCacheKey, $"{coordinates.Latitude},{coordinates.Longitude}"), getLocationFromW3W, CacheLength); + return await _cacheProvider.RetrieveAsync(string.Format(ReverseW3WCacheKey, $"{coordinates.Latitude},{coordinates.Longitude}"), getLocationFromW3W, CacheLength); } - public Coordinates GetLatLonFromAddressLocationIQ(string address) + public async Task GetLatLonFromAddressLocationIQ(string address) { Coordinates coordinates = new Coordinates(); try { var client = new RestClient("http://locationiq.org"); - var request = new RestRequest($"/v1/search.php?key={Config.MappingConfig.LocationIQApiKey}&format=json&q={WebUtility.UrlEncode(address)}", Method.GET); + var request = new RestRequest($"/v1/search.php?key={Config.MappingConfig.LocationIQApiKey}&format=json&q={WebUtility.UrlEncode(address)}", Method.Get); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.IsSuccessful && response.Data != null) { @@ -316,20 +317,21 @@ public Coordinates GetLatLonFromAddressLocationIQ(string address) return null; } - public string GetAddressFromLatLonLocationIQ(string lat, string lon) + public async Task GetAddressFromLatLonLocationIQ(string lat, string lon) { try { var client = new RestClient("http://locationiq.org"); - var request = new RestRequest($"/v1/reverse.php?key={Config.MappingConfig.LocationIQApiKey}&format=json&lat={WebUtility.UrlEncode(lat)}&lon={WebUtility.UrlEncode(lon)}&zoom=18", Method.GET); + var request = new RestRequest($"/v1/reverse.php?key={Config.MappingConfig.LocationIQApiKey}&format=json&lat={WebUtility.UrlEncode(lat)}&lon={WebUtility.UrlEncode(lon)}&zoom=18", Method.Get); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.Data != null) { - var geocode = response.Data[0]; + //var geocode = response.Data[0]; - return geocode["display_name"]; + //return geocode["display_name"]; + return response.Data.display_name; } } catch { } diff --git a/Providers/Resgrid.Providers.Geo/Models/LocationIQ/LocationIQReverseResult.cs b/Providers/Resgrid.Providers.Geo/Models/LocationIQ/LocationIQReverseResult.cs new file mode 100644 index 00000000..24603eaa --- /dev/null +++ b/Providers/Resgrid.Providers.Geo/Models/LocationIQ/LocationIQReverseResult.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; + +namespace Resgrid.Providers.Geo.Models.LocationIQ +{ + public class LocationIQAddress + { + public string house_number { get; set; } + public string road { get; set; } + public string city { get; set; } + public string county { get; set; } + public string state { get; set; } + public string postcode { get; set; } + public string country { get; set; } + public string country_code { get; set; } + } + + public class LocationIQReverseResult + { + public string place_id { get; set; } + public string licence { get; set; } + public string lat { get; set; } + public string lon { get; set; } + public string display_name { get; set; } + public List boundingbox { get; set; } + public double importance { get; set; } + public LocationIQAddress address { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Geo/Resgrid.Providers.Geo.csproj b/Providers/Resgrid.Providers.Geo/Resgrid.Providers.Geo.csproj index aee1f2ab..2ce104c9 100644 --- a/Providers/Resgrid.Providers.Geo/Resgrid.Providers.Geo.csproj +++ b/Providers/Resgrid.Providers.Geo/Resgrid.Providers.Geo.csproj @@ -1,17 +1,17 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker - + - - + + diff --git a/Providers/Resgrid.Providers.Marketing/MailerliteEmailMarketing.cs b/Providers/Resgrid.Providers.Marketing/MailerliteEmailMarketing.cs index 7cf6379c..e466af2d 100644 --- a/Providers/Resgrid.Providers.Marketing/MailerliteEmailMarketing.cs +++ b/Providers/Resgrid.Providers.Marketing/MailerliteEmailMarketing.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Resgrid.Model.Providers; using RestSharp; @@ -6,28 +7,32 @@ namespace Resgrid.Providers.Marketing { public class MailerliteEmailMarketing : IEmailMarketingProvider { - public void Unsubscribe(string emailAddress) + public async Task Unsubscribe(string emailAddress) { try { var client = new RestClient(Config.MarketingConfig.MailerlteUrl); - var request = new RestRequest("/api/v1/subscribers/unsubscribe/", Method.POST); + var request = new RestRequest("/api/v1/subscribers/unsubscribe/", Method.Post); request.AddObject(new { apiKey = Config.MarketingConfig.MailingApiKey, email = emailAddress }); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); + + return true; } catch { } + + return false; } - public void SubscribeUserToAdminList(string firstName, string lastName, string emailAddress) + public async Task SubscribeUserToAdminList(string firstName, string lastName, string emailAddress) { try { var client = new RestClient(Config.MarketingConfig.MailerlteUrl); - var request = new RestRequest(string.Format("api/v1/subscribers/{0}/", Config.MarketingConfig.AdminListId), Method.POST); + var request = new RestRequest(string.Format("api/v1/subscribers/{0}/", Config.MarketingConfig.AdminListId), Method.Post); request.AddObject(new { apiKey = Config.MarketingConfig.MailingApiKey, @@ -42,17 +47,21 @@ public void SubscribeUserToAdminList(string firstName, string lastName, string e } } }); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); + + return true; } catch { } + + return false; } - public void SubscribeUserToUsersList(string firstName, string lastName, string emailAddress) + public async Task SubscribeUserToUsersList(string firstName, string lastName, string emailAddress) { try { var client = new RestClient(Config.MarketingConfig.MailerlteUrl); - var request = new RestRequest(string.Format("api/v1/subscribers/{0}/", Config.MarketingConfig.UserListId), Method.POST); + var request = new RestRequest(string.Format("api/v1/subscribers/{0}/", Config.MarketingConfig.UserListId), Method.Post); request.AddObject(new { apiKey = Config.MarketingConfig.MailingApiKey, @@ -67,23 +76,31 @@ public void SubscribeUserToUsersList(string firstName, string lastName, string e } } }); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); + + return true; } catch { } + + return false; } - public void IncreaseStatusPageMetric(string metric) + public async Task IncreaseStatusPageMetric(string metric) { try { var client = new RestClient(Config.StatusSystemConfig.StatusPageBaseUrl); - var setMetricRequest = new RestRequest($"api/v1/metrics/{metric}/points", Method.POST); + var setMetricRequest = new RestRequest($"api/v1/metrics/{metric}/points", Method.Post); setMetricRequest.AddHeader("X-Cachet-Token", Config.StatusSystemConfig.ApiToken); setMetricRequest.AddParameter("application/json", "{\"value\":\"1\"}", ParameterType.RequestBody); - var response = client.Execute(setMetricRequest); + var response = await client.ExecuteAsync(setMetricRequest); + + return true; } catch { } + + return false; } } } diff --git a/Providers/Resgrid.Providers.Marketing/Resgrid.Providers.Marketing.csproj b/Providers/Resgrid.Providers.Marketing/Resgrid.Providers.Marketing.csproj index cf535c8c..d8a261d1 100644 --- a/Providers/Resgrid.Providers.Marketing/Resgrid.Providers.Marketing.csproj +++ b/Providers/Resgrid.Providers.Marketing/Resgrid.Providers.Marketing.csproj @@ -1,13 +1,13 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker - - + + diff --git a/Providers/Resgrid.Providers.Migrations/Migrations/M0005_AddingForms.cs b/Providers/Resgrid.Providers.Migrations/Migrations/M0005_AddingForms.cs new file mode 100644 index 00000000..901a9e0a --- /dev/null +++ b/Providers/Resgrid.Providers.Migrations/Migrations/M0005_AddingForms.cs @@ -0,0 +1,48 @@ +using FluentMigrator; +using System; + +namespace Resgrid.Providers.Migrations.Migrations +{ + [Migration(5)] + public class M0005_AddingForms : Migration + { + public override void Up() + { + Create.Table("Forms") + .WithColumn("FormId").AsString(128).NotNullable().PrimaryKey() + .WithColumn("DepartmentId").AsInt32().NotNullable() + .WithColumn("Type").AsInt32().NotNullable() + .WithColumn("Name").AsString().NotNullable() + .WithColumn("IsActive").AsBoolean() + .WithColumn("IsDeleted").AsBoolean() + .WithColumn("Data").AsString(Int32.MaxValue) + .WithColumn("CreatedOn").AsDateTime2() + .WithColumn("CreatedBy").AsString(128) + .WithColumn("UpdatedOn").AsDateTime2() + .WithColumn("UpdatedBy").AsString(128); + + Create.Table("FormAutomations") + .WithColumn("FormAutomationId").AsString(128).NotNullable().PrimaryKey() + .WithColumn("FormId").AsString(128).NotNullable() + .WithColumn("TriggerField").AsString().NotNullable() + .WithColumn("TriggerValue").AsString() + .WithColumn("OperationType").AsInt32().NotNullable() + .WithColumn("OperationValue").AsString(); + + + Create.ForeignKey("FK_Forms_Departments") + .FromTable("Forms").ForeignColumn("DepartmentId") + .ToTable("Departments").PrimaryColumn("DepartmentId"); + + Create.ForeignKey("FK_FormAutomations_Forms") + .FromTable("FormAutomations").ForeignColumn("FormId") + .ToTable("Forms").PrimaryColumn("FormId"); + } + + public override void Down() + { + Delete.Table("Forms"); + Delete.Table("FormAutomations"); + } + } +} diff --git a/Providers/Resgrid.Providers.Migrations/Migrations/M0006_AddingFormDataToCalls.cs b/Providers/Resgrid.Providers.Migrations/Migrations/M0006_AddingFormDataToCalls.cs new file mode 100644 index 00000000..006c34d6 --- /dev/null +++ b/Providers/Resgrid.Providers.Migrations/Migrations/M0006_AddingFormDataToCalls.cs @@ -0,0 +1,20 @@ +using FluentMigrator; +using System; + +namespace Resgrid.Providers.Migrations.Migrations +{ + [Migration(6)] + public class M0006_AddingFormDataToCalls : Migration + { + public override void Up() + { + Alter.Table("Calls").AddColumn("CallFormData").AsString(Int32.MaxValue).Nullable(); + Alter.Table("Calls").AddColumn("ContactId").AsInt32().Nullable(); + } + + public override void Down() + { + + } + } +} diff --git a/Providers/Resgrid.Providers.Migrations/Migrations/M0007_AddingDispatchOnToCalls.cs b/Providers/Resgrid.Providers.Migrations/Migrations/M0007_AddingDispatchOnToCalls.cs new file mode 100644 index 00000000..29acc0bf --- /dev/null +++ b/Providers/Resgrid.Providers.Migrations/Migrations/M0007_AddingDispatchOnToCalls.cs @@ -0,0 +1,20 @@ +using FluentMigrator; +using System; + +namespace Resgrid.Providers.Migrations.Migrations +{ + [Migration(7)] + public class M0007_AddingDispatchOnToCalls : Migration + { + public override void Up() + { + Alter.Table("Calls").AddColumn("DispatchOn").AsDateTime2().Nullable(); + Alter.Table("Calls").AddColumn("HasBeenDispatched").AsBoolean().Nullable(); + } + + public override void Down() + { + + } + } +} diff --git a/Providers/Resgrid.Providers.Migrations/Migrations/M0008_AddingAddonsInvoices.cs b/Providers/Resgrid.Providers.Migrations/Migrations/M0008_AddingAddonsInvoices.cs new file mode 100644 index 00000000..58e17d1b --- /dev/null +++ b/Providers/Resgrid.Providers.Migrations/Migrations/M0008_AddingAddonsInvoices.cs @@ -0,0 +1,62 @@ +using FluentMigrator; +using System; + +namespace Resgrid.Providers.Migrations.Migrations +{ + [Migration(8)] + public class M0008_AddingAddonsInvoices : Migration + { + public override void Up() + { + // Adding in Invoice limits + + // Enterprise Plus Plan Invoice Limits + Insert.IntoTable("PlanLimits").Row(new { PlanId = 1, LimitType = 5, LimitValue = 100000 }); + + // Finish Adding in Invoice limits + + Create.Table("PlanAddons") + .WithColumn("PlanAddonId").AsString(128).NotNullable().PrimaryKey() + .WithColumn("PlanId").AsInt32().NotNullable() + .WithColumn("AddonType").AsInt32().NotNullable() + .WithColumn("Cost").AsDecimal().NotNullable() + .WithColumn("ExternalId").AsString(256); + + Create.ForeignKey("FK_PlanAddons_Plans") + .FromTable("PlanAddons").ForeignColumn("PlanId") + .ToTable("Plans").PrimaryColumn("PlanId"); + + // Standard Plan PTT Addon + Insert.IntoTable("PlanAddons").Row(new { PlanAddonId = "456ed5d4-57e1-4882-b433-1d3cc239103d", PlanId = 1, AddonType = 1, Cost = 0, ExternalId = "" }); + + Create.Table("PaymentAddons") + .WithColumn("PaymentAddonId").AsString(128).NotNullable().PrimaryKey() + .WithColumn("DepartmentId").AsInt32().NotNullable() + .WithColumn("PlanAddonId").AsString(128).NotNullable() + .WithColumn("PurchaseOn").AsDateTime2().NotNullable() + .WithColumn("EffectiveOn").AsDateTime2().NotNullable() + .WithColumn("EndingOn").AsDateTime2().NotNullable() + .WithColumn("Amount").AsDecimal().NotNullable() + .WithColumn("Description").AsString(Int32.MaxValue).NotNullable() + .WithColumn("TransactionId").AsString(Int32.MaxValue).NotNullable() + .WithColumn("SubscriptionId").AsString(Int32.MaxValue).NotNullable() + .WithColumn("Data").AsString(Int32.MaxValue).NotNullable() + .WithColumn("IsCancelled").AsBoolean().Nullable() + .WithColumn("CancelledOn").AsDateTime2().Nullable() + .WithColumn("CancelledData").AsString(Int32.MaxValue).Nullable(); + + Create.ForeignKey("FK_PaymentAddons_Departments") + .FromTable("PaymentAddons").ForeignColumn("DepartmentId") + .ToTable("Departments").PrimaryColumn("DepartmentId"); + + Create.ForeignKey("FK_PaymentAddons_PlanAddons") + .FromTable("PaymentAddons").ForeignColumn("PlanAddonId") + .ToTable("PlanAddons").PrimaryColumn("PlanAddonId"); + } + + public override void Down() + { + + } + } +} diff --git a/Providers/Resgrid.Providers.Migrations/Migrations/M0009_AddingDepartmentVoice.cs b/Providers/Resgrid.Providers.Migrations/Migrations/M0009_AddingDepartmentVoice.cs new file mode 100644 index 00000000..edb434eb --- /dev/null +++ b/Providers/Resgrid.Providers.Migrations/Migrations/M0009_AddingDepartmentVoice.cs @@ -0,0 +1,56 @@ +using FluentMigrator; +using System; + +namespace Resgrid.Providers.Migrations.Migrations +{ + [Migration(9)] + public class M0009_AddingDepartmentVoice : Migration + { + public override void Up() + { + Create.Table("DepartmentVoices") + .WithColumn("DepartmentVoiceId").AsString(128).NotNullable().PrimaryKey() + .WithColumn("DepartmentId").AsInt32().NotNullable() + .WithColumn("StartConferenceNumber").AsInt32().NotNullable(); + + Create.ForeignKey("FK_DepartmentVoices_Department") + .FromTable("DepartmentVoices").ForeignColumn("DepartmentId") + .ToTable("Departments").PrimaryColumn("DepartmentId"); + + Create.Table("DepartmentVoiceChannels") + .WithColumn("DepartmentVoiceChannelId").AsString(128).NotNullable().PrimaryKey() + .WithColumn("DepartmentVoiceId").AsString(128).NotNullable() + .WithColumn("DepartmentId").AsInt32().NotNullable() + .WithColumn("Name").AsString(512) + .WithColumn("SystemConferenceId").AsString(512) + .WithColumn("SystemCallflowId").AsString(512) + .WithColumn("ConferenceNumber").AsInt32() + .WithColumn("IsDefault").AsBoolean(); + + Create.ForeignKey("FK_DepartmentVoiceChannels_Department") + .FromTable("DepartmentVoiceChannels").ForeignColumn("DepartmentId") + .ToTable("Departments").PrimaryColumn("DepartmentId"); + + Create.ForeignKey("FK_DepartmentVoiceChannels_DepartmentVoices") + .FromTable("DepartmentVoiceChannels").ForeignColumn("DepartmentVoiceId") + .ToTable("DepartmentVoices").PrimaryColumn("DepartmentVoiceId"); + + Create.Table("DepartmentVoiceUsers") + .WithColumn("DepartmentVoiceUserId").AsString(128).NotNullable().PrimaryKey() + .WithColumn("DepartmentVoiceId").AsString(128).NotNullable() + .WithColumn("UserId").AsString(128).NotNullable() + .WithColumn("SystemUserId").AsString(512) + .WithColumn("SystemDeviceId").AsString(512); + + Create.ForeignKey("FK_DepartmentVoiceUsers_DepartmentVoices") + .FromTable("DepartmentVoiceUsers").ForeignColumn("DepartmentVoiceId") + .ToTable("DepartmentVoices").PrimaryColumn("DepartmentVoiceId"); + + } + + public override void Down() + { + + } + } +} diff --git a/Providers/Resgrid.Providers.Migrations/Resgrid.Providers.Migrations.csproj b/Providers/Resgrid.Providers.Migrations/Resgrid.Providers.Migrations.csproj index 4388657f..98fd653e 100644 --- a/Providers/Resgrid.Providers.Migrations/Resgrid.Providers.Migrations.csproj +++ b/Providers/Resgrid.Providers.Migrations/Resgrid.Providers.Migrations.csproj @@ -1,24 +1,26 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker + + Never - - - + + + diff --git a/Providers/Resgrid.Providers.Migrations/Sql/EF0001_PopulateOIDCDb.sql b/Providers/Resgrid.Providers.Migrations/Sql/EF0001_PopulateOIDCDb.sql new file mode 100644 index 00000000..4bd4cbcf --- /dev/null +++ b/Providers/Resgrid.Providers.Migrations/Sql/EF0001_PopulateOIDCDb.sql @@ -0,0 +1,278 @@ +IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL +BEGIN + CREATE TABLE [__EFMigrationsHistory] ( + [MigrationId] nvarchar(150) NOT NULL, + [ProductVersion] nvarchar(32) NOT NULL, + CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId]) + ); +END; + + +BEGIN TRANSACTION; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE TABLE [AspNetRoles] ( + [Id] nvarchar(450) NOT NULL, + [Name] nvarchar(256) NULL, + [NormalizedName] nvarchar(256) NULL, + [ConcurrencyStamp] nvarchar(max) NULL, + CONSTRAINT [PK_AspNetRoles] PRIMARY KEY ([Id]) + ); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE TABLE [AspNetUsers] ( + [Id] nvarchar(450) NOT NULL, + [UserName] nvarchar(256) NULL, + [NormalizedUserName] nvarchar(256) NULL, + [Email] nvarchar(256) NULL, + [NormalizedEmail] nvarchar(256) NULL, + [EmailConfirmed] bit NOT NULL, + [PasswordHash] nvarchar(max) NULL, + [SecurityStamp] nvarchar(max) NULL, + [ConcurrencyStamp] nvarchar(max) NULL, + [PhoneNumber] nvarchar(max) NULL, + [PhoneNumberConfirmed] bit NOT NULL, + [TwoFactorEnabled] bit NOT NULL, + [LockoutEnd] datetimeoffset NULL, + [LockoutEnabled] bit NOT NULL, + [AccessFailedCount] int NOT NULL, + CONSTRAINT [PK_AspNetUsers] PRIMARY KEY ([Id]) + ); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE TABLE [OpenIddictApplications] ( + [Id] uniqueidentifier NOT NULL, + [ClientId] nvarchar(100) NULL, + [ClientSecret] nvarchar(max) NULL, + [ConcurrencyToken] nvarchar(50) NULL, + [ConsentType] nvarchar(50) NULL, + [DisplayName] nvarchar(max) NULL, + [DisplayNames] nvarchar(max) NULL, + [Permissions] nvarchar(max) NULL, + [PostLogoutRedirectUris] nvarchar(max) NULL, + [Properties] nvarchar(max) NULL, + [RedirectUris] nvarchar(max) NULL, + [Requirements] nvarchar(max) NULL, + [Type] nvarchar(50) NULL, + CONSTRAINT [PK_OpenIddictApplications] PRIMARY KEY ([Id]) + ); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE TABLE [OpenIddictScopes] ( + [Id] uniqueidentifier NOT NULL, + [ConcurrencyToken] nvarchar(50) NULL, + [Description] nvarchar(max) NULL, + [Descriptions] nvarchar(max) NULL, + [DisplayName] nvarchar(max) NULL, + [DisplayNames] nvarchar(max) NULL, + [Name] nvarchar(200) NULL, + [Properties] nvarchar(max) NULL, + [Resources] nvarchar(max) NULL, + CONSTRAINT [PK_OpenIddictScopes] PRIMARY KEY ([Id]) + ); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE TABLE [AspNetRoleClaims] ( + [Id] int NOT NULL IDENTITY, + [RoleId] nvarchar(450) NOT NULL, + [ClaimType] nvarchar(max) NULL, + [ClaimValue] nvarchar(max) NULL, + CONSTRAINT [PK_AspNetRoleClaims] PRIMARY KEY ([Id]), + CONSTRAINT [FK_AspNetRoleClaims_AspNetRoles_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [AspNetRoles] ([Id]) ON DELETE CASCADE + ); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE TABLE [AspNetUserClaims] ( + [Id] int NOT NULL IDENTITY, + [UserId] nvarchar(450) NOT NULL, + [ClaimType] nvarchar(max) NULL, + [ClaimValue] nvarchar(max) NULL, + CONSTRAINT [PK_AspNetUserClaims] PRIMARY KEY ([Id]), + CONSTRAINT [FK_AspNetUserClaims_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE + ); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE TABLE [AspNetUserLogins] ( + [LoginProvider] nvarchar(450) NOT NULL, + [ProviderKey] nvarchar(450) NOT NULL, + [ProviderDisplayName] nvarchar(max) NULL, + [UserId] nvarchar(450) NOT NULL, + CONSTRAINT [PK_AspNetUserLogins] PRIMARY KEY ([LoginProvider], [ProviderKey]), + CONSTRAINT [FK_AspNetUserLogins_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE + ); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE TABLE [AspNetUserRoles] ( + [UserId] nvarchar(450) NOT NULL, + [RoleId] nvarchar(450) NOT NULL, + CONSTRAINT [PK_AspNetUserRoles] PRIMARY KEY ([UserId], [RoleId]), + CONSTRAINT [FK_AspNetUserRoles_AspNetRoles_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [AspNetRoles] ([Id]) ON DELETE CASCADE, + CONSTRAINT [FK_AspNetUserRoles_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE + ); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE TABLE [AspNetUserTokens] ( + [UserId] nvarchar(450) NOT NULL, + [LoginProvider] nvarchar(450) NOT NULL, + [Name] nvarchar(450) NOT NULL, + [Value] nvarchar(max) NULL, + CONSTRAINT [PK_AspNetUserTokens] PRIMARY KEY ([UserId], [LoginProvider], [Name]), + CONSTRAINT [FK_AspNetUserTokens_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) ON DELETE CASCADE + ); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE TABLE [OpenIddictAuthorizations] ( + [Id] uniqueidentifier NOT NULL, + [ApplicationId] uniqueidentifier NULL, + [ConcurrencyToken] nvarchar(50) NULL, + [CreationDate] datetime2 NULL, + [Properties] nvarchar(max) NULL, + [Scopes] nvarchar(max) NULL, + [Status] nvarchar(50) NULL, + [Subject] nvarchar(400) NULL, + [Type] nvarchar(50) NULL, + CONSTRAINT [PK_OpenIddictAuthorizations] PRIMARY KEY ([Id]), + CONSTRAINT [FK_OpenIddictAuthorizations_OpenIddictApplications_ApplicationId] FOREIGN KEY ([ApplicationId]) REFERENCES [OpenIddictApplications] ([Id]) ON DELETE NO ACTION + ); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE TABLE [OpenIddictTokens] ( + [Id] uniqueidentifier NOT NULL, + [ApplicationId] uniqueidentifier NULL, + [AuthorizationId] uniqueidentifier NULL, + [ConcurrencyToken] nvarchar(50) NULL, + [CreationDate] datetime2 NULL, + [ExpirationDate] datetime2 NULL, + [Payload] nvarchar(max) NULL, + [Properties] nvarchar(max) NULL, + [RedemptionDate] datetime2 NULL, + [ReferenceId] nvarchar(100) NULL, + [Status] nvarchar(50) NULL, + [Subject] nvarchar(400) NULL, + [Type] nvarchar(50) NULL, + CONSTRAINT [PK_OpenIddictTokens] PRIMARY KEY ([Id]), + CONSTRAINT [FK_OpenIddictTokens_OpenIddictApplications_ApplicationId] FOREIGN KEY ([ApplicationId]) REFERENCES [OpenIddictApplications] ([Id]) ON DELETE NO ACTION, + CONSTRAINT [FK_OpenIddictTokens_OpenIddictAuthorizations_AuthorizationId] FOREIGN KEY ([AuthorizationId]) REFERENCES [OpenIddictAuthorizations] ([Id]) ON DELETE NO ACTION + ); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE INDEX [IX_AspNetRoleClaims_RoleId] ON [AspNetRoleClaims] ([RoleId]); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + EXEC(N'CREATE UNIQUE INDEX [RoleNameIndex] ON [AspNetRoles] ([NormalizedName]) WHERE [NormalizedName] IS NOT NULL'); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE INDEX [IX_AspNetUserClaims_UserId] ON [AspNetUserClaims] ([UserId]); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE INDEX [IX_AspNetUserLogins_UserId] ON [AspNetUserLogins] ([UserId]); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE INDEX [IX_AspNetUserRoles_RoleId] ON [AspNetUserRoles] ([RoleId]); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE INDEX [EmailIndex] ON [AspNetUsers] ([NormalizedEmail]); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + EXEC(N'CREATE UNIQUE INDEX [UserNameIndex] ON [AspNetUsers] ([NormalizedUserName]) WHERE [NormalizedUserName] IS NOT NULL'); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + EXEC(N'CREATE UNIQUE INDEX [IX_OpenIddictApplications_ClientId] ON [OpenIddictApplications] ([ClientId]) WHERE [ClientId] IS NOT NULL'); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE INDEX [IX_OpenIddictAuthorizations_ApplicationId_Status_Subject_Type] ON [OpenIddictAuthorizations] ([ApplicationId], [Status], [Subject], [Type]); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + EXEC(N'CREATE UNIQUE INDEX [IX_OpenIddictScopes_Name] ON [OpenIddictScopes] ([Name]) WHERE [Name] IS NOT NULL'); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE INDEX [IX_OpenIddictTokens_ApplicationId_Status_Subject_Type] ON [OpenIddictTokens] ([ApplicationId], [Status], [Subject], [Type]); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + CREATE INDEX [IX_OpenIddictTokens_AuthorizationId] ON [OpenIddictTokens] ([AuthorizationId]); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + EXEC(N'CREATE UNIQUE INDEX [IX_OpenIddictTokens_ReferenceId] ON [OpenIddictTokens] ([ReferenceId]) WHERE [ReferenceId] IS NOT NULL'); +END; + + +IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210904153137_CreateOpenIddictModels') +BEGIN + INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion]) + VALUES (N'20210904153137_CreateOpenIddictModels', N'5.0.9'); +END; + + +COMMIT; + diff --git a/Providers/Resgrid.Providers.Number/NexmoProvider.cs b/Providers/Resgrid.Providers.Number/NexmoProvider.cs index 34813155..8a7e6e51 100644 --- a/Providers/Resgrid.Providers.Number/NexmoProvider.cs +++ b/Providers/Resgrid.Providers.Number/NexmoProvider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Net; +using System.Threading.Tasks; using Resgrid.Model; using Resgrid.Model.Providers; using RestSharp; @@ -9,11 +10,11 @@ namespace Resgrid.Providers.NumberProvider { public class NexmoProvider : INumberProvider { - public bool ProvisionNumber(string country, string number) + public async Task ProvisionNumber(string country, string number) { var client = new RestClient(Config.NumberProviderConfig.BaseNexmoUrl); - var request = new RestRequest(GenerateBuyNumberUrl(country, number), Method.POST); - var response = client.Execute(request); + var request = new RestRequest(GenerateBuyNumberUrl(country, number), Method.Post); + var response = await client.ExecuteAsync(request); if (response.StatusCode == HttpStatusCode.OK) return true; @@ -21,11 +22,11 @@ public bool ProvisionNumber(string country, string number) return false; } - public List GetAvailableNumbers(string country, string areaCode) + public async Task> GetAvailableNumbers(string country, string areaCode) { var client = new RestClient(Config.NumberProviderConfig.BaseNexmoUrl); - var request = new RestRequest(GenerateGetAvailableNumbersUrl(country), Method.GET); - var response = client.Execute(request); + var request = new RestRequest(GenerateGetAvailableNumbersUrl(country), Method.Get); + var response = await client.ExecuteAsync(request); if (response.Data != null && response.Data.Numbers != null) return response.Data.Numbers; diff --git a/Providers/Resgrid.Providers.Number/NumberProviderFactory.cs b/Providers/Resgrid.Providers.Number/NumberProviderFactory.cs index f2038b44..2383fb8e 100644 --- a/Providers/Resgrid.Providers.Number/NumberProviderFactory.cs +++ b/Providers/Resgrid.Providers.Number/NumberProviderFactory.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Resgrid.Model; using Resgrid.Model.Providers; @@ -16,20 +17,20 @@ public NumberProviderFactory() _nexmoProvider = new NexmoProvider(); } - public List GetAvailableNumbers(string country, string areaCode) + public async Task> GetAvailableNumbers(string country, string areaCode) { //if (country == "AU") // return _nexmoProvider.GetAvailableNumbers(country, areaCode); - return _twilioProvider.GetAvailableNumbers(country, areaCode); + return await _twilioProvider.GetAvailableNumbers(country, areaCode); } - public bool ProvisionNumber(string country, string number) + public async Task ProvisionNumber(string country, string number) { //if (country == "AU") // return _nexmoProvider.ProvisionNumber(country, number); - return _twilioProvider.ProvisionNumber(country, number); + return await _twilioProvider.ProvisionNumber(country, number); } public string ConvertCountryToCode(string country) diff --git a/Providers/Resgrid.Providers.Number/Resgrid.Providers.Number.csproj b/Providers/Resgrid.Providers.Number/Resgrid.Providers.Number.csproj index 0a9f3ac5..3045adc8 100644 --- a/Providers/Resgrid.Providers.Number/Resgrid.Providers.Number.csproj +++ b/Providers/Resgrid.Providers.Number/Resgrid.Providers.Number.csproj @@ -1,7 +1,7 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker @@ -14,11 +14,11 @@ - - + + - - + + diff --git a/Providers/Resgrid.Providers.Number/TextMessageProvider.cs b/Providers/Resgrid.Providers.Number/TextMessageProvider.cs index cb6e103d..49e65949 100644 --- a/Providers/Resgrid.Providers.Number/TextMessageProvider.cs +++ b/Providers/Resgrid.Providers.Number/TextMessageProvider.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Net; using System.Reflection; +using System.Threading.Tasks; using System.Web; using CsvHelper; using Resgrid.Framework; @@ -25,45 +26,57 @@ public class TextMessageProvider : ITextMessageProvider private static int _maxZone = 4; private static IEnumerable _areaCodes; - public void SendTextMessage(string number, string message, string departmentNumber, MobileCarriers carrier, int departmentId, bool forceGateway = false, bool isCall = false) + public async Task SendTextMessage(string number, string message, string departmentNumber, MobileCarriers carrier, int departmentId, bool forceGateway = false, bool isCall = false) { if (carrier == MobileCarriers.Telstra) - SendTextMessageViaNexmo(number, message, departmentNumber); + { + return await SendTextMessageViaNexmo(number, message, departmentNumber); + } else if (Carriers.OnPremSmsGatewayCarriers.Contains(carrier) || forceGateway) { if (!Config.SystemBehaviorConfig.DepartmentsToForceBackupSmsProvider.Contains(departmentId)) { - if (!SendTextMessageViaDiafaan(number, message)) + if (!await SendTextMessageViaDiafaan(number, message)) + { + return await SendTextMessageViaSignalWire(number, message, departmentNumber); + } + else { - SendTextMessageViaSignalWire(number, message, departmentNumber); + return true; } } else { - SendTextMessageViaSignalWire(number, message, departmentNumber); + return await SendTextMessageViaSignalWire(number, message, departmentNumber); } } else if (Config.SystemBehaviorConfig.SmsProviderType == Config.SmsProviderTypes.SignalWire) { if (!Config.SystemBehaviorConfig.DepartmentsToForceBackupSmsProvider.Contains(departmentId)) { - if (!SendTextMessageViaSignalWire(number, message, departmentNumber)) + if (!await SendTextMessageViaSignalWire(number, message, departmentNumber)) + { + return await SendTextMessageViaTwillio(number, message, departmentNumber); + } + else { - SendTextMessageViaTwillio(number, message, departmentNumber); + return true; } } else { if (isCall) { - SendTextMessageViaTwillio(number, message, departmentNumber); + await SendTextMessageViaTwillio(number, message, departmentNumber); if (Config.SystemBehaviorConfig.AlsoSendToPrimarySmsProvider) - SendTextMessageViaSignalWire(number, message, departmentNumber); + return await SendTextMessageViaSignalWire(number, message, departmentNumber); + else + return true; } else { - SendTextMessageViaSignalWire(number, message, departmentNumber); + return await SendTextMessageViaSignalWire(number, message, departmentNumber); //SendTextMessageViaTwillio(number, message, departmentNumber); } } @@ -72,35 +85,42 @@ public void SendTextMessage(string number, string message, string departmentNumb { if (!Config.SystemBehaviorConfig.DepartmentsToForceBackupSmsProvider.Contains(departmentId)) { - if (!SendTextMessageViaTwillio(number, message, departmentNumber)) + if (!await SendTextMessageViaTwillio(number, message, departmentNumber)) + { + return await SendTextMessageViaSignalWire(number, message, departmentNumber); + } + else { - SendTextMessageViaSignalWire(number, message, departmentNumber); + return true; } } else { - SendTextMessageViaSignalWire(number, message, departmentNumber); + return await SendTextMessageViaSignalWire(number, message, departmentNumber); } } } - private void SendTextMessageViaNexmo(string number, string message, string departmentNumber) + private async Task SendTextMessageViaNexmo(string number, string message, string departmentNumber) { var client = new RestClient(Config.NumberProviderConfig.BaseNexmoUrl); - var request = new RestRequest(GenerateSendTextMessageUrl(number, message, departmentNumber), Method.GET); + var request = new RestRequest(GenerateSendTextMessageUrl(number, message, departmentNumber), Method.Get); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.ResponseStatus == ResponseStatus.Completed) { if (response.Content.Contains("rejected")) { // Error + return false; } } + + return true; } - public bool SendTextMessageViaTwillio(string number, string message, string departmentNumber) + public async Task SendTextMessageViaTwillio(string number, string message, string departmentNumber) { TwilioClient.Init(Config.NumberProviderConfig.TwilioAccountSid, Config.NumberProviderConfig.TwilioAuthToken); MessageResource messageResource; @@ -110,7 +130,7 @@ public bool SendTextMessageViaTwillio(string number, string message, string depa { //textMessage = twilio.SendMessage(Settings.Default.TwilioResgridNumber, number, message); - messageResource = MessageResource.Create( + messageResource = await MessageResource.CreateAsync( from: new PhoneNumber(Config.NumberProviderConfig.TwilioResgridNumber), to: new PhoneNumber(number), body: message); @@ -128,7 +148,7 @@ public bool SendTextMessageViaTwillio(string number, string message, string depa // from: new PhoneNumber(departmentNumber), // to: new PhoneNumber(number), // body: message); - messageResource = MessageResource.Create( + messageResource = await MessageResource.CreateAsync( from: new PhoneNumber(Config.NumberProviderConfig.TwilioResgridNumber), to: new PhoneNumber(number), body: message); @@ -146,13 +166,13 @@ public bool SendTextMessageViaTwillio(string number, string message, string depa } - public bool SendTextMessageViaSignalWire(string number, string message, string departmentNumber) + public async Task SendTextMessageViaSignalWire(string number, string message, string departmentNumber) { try { var client = new RestClient(Config.NumberProviderConfig.SignalWireApiUrl); client.Authenticator = new HttpBasicAuthenticator(Config.NumberProviderConfig.SignalWireAccountSid, Config.NumberProviderConfig.SignalWireApiKey); - var request = new RestRequest(GenerateSendTextMessageUrlForSignalWire(), Method.POST); + var request = new RestRequest(GenerateSendTextMessageUrlForSignalWire(), Method.Post); if (!number.StartsWith("+")) { @@ -177,7 +197,7 @@ public bool SendTextMessageViaSignalWire(string number, string message, string d Body = message }); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.ResponseStatus == ResponseStatus.Completed) { @@ -197,12 +217,12 @@ public bool SendTextMessageViaSignalWire(string number, string message, string d } } - public bool SendTextMessageViaDiafaan(string number, string message) + public async Task SendTextMessageViaDiafaan(string number, string message) { var client = new RestClient(Config.NumberProviderConfig.DiafaanSmsGatewayUrl); - var request = new RestRequest(GenerateSendTextMessageUrlForDiafaan(number, message), Method.GET); + var request = new RestRequest(GenerateSendTextMessageUrlForDiafaan(number, message), Method.Get); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.ResponseStatus == ResponseStatus.Completed) { @@ -400,7 +420,7 @@ private void LoadAreaCodeData() var config = new CsvHelper.Configuration.CsvConfiguration(new CultureInfo("en-US")); config.HasHeaderRecord = false; - var csvReader = new CsvReader(reader, config, false); + var csvReader = new CsvReader(reader, config); _areaCodes = csvReader.GetRecords().ToList(); } } diff --git a/Providers/Resgrid.Providers.Number/TwilioProvider.cs b/Providers/Resgrid.Providers.Number/TwilioProvider.cs index fbc25e9e..fa5bd34c 100644 --- a/Providers/Resgrid.Providers.Number/TwilioProvider.cs +++ b/Providers/Resgrid.Providers.Number/TwilioProvider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Resgrid.Model; using Resgrid.Model.Providers; using Twilio; @@ -13,13 +14,13 @@ namespace Resgrid.Providers.NumberProvider { public class TwilioProvider : INumberProvider { - public bool ProvisionNumber(string country, string number) + public async Task ProvisionNumber(string country, string number) { TwilioClient.Init(Config.NumberProviderConfig.TwilioAccountSid, Config.NumberProviderConfig.TwilioAuthToken); try { - var incomingPhoneNumber = IncomingPhoneNumberResource.Create(phoneNumber: new PhoneNumber(number), + var incomingPhoneNumber = await IncomingPhoneNumberResource.CreateAsync(phoneNumber: new PhoneNumber(number), smsUrl: new Uri(Config.NumberProviderConfig.TwilioApiUrl), smsMethod: "GET", voiceUrl: new Uri(Config.NumberProviderConfig.TwilioVoiceApiUrl), @@ -33,7 +34,7 @@ public bool ProvisionNumber(string country, string number) return true; } - public List GetAvailableNumbers(string country, string areaCode) + public async Task> GetAvailableNumbers(string country, string areaCode) { var availableNumbers = new List(); TwilioClient.Init(Config.NumberProviderConfig.TwilioAccountSid, Config.NumberProviderConfig.TwilioAuthToken); @@ -42,9 +43,9 @@ public List GetAvailableNumbers(string country, string areaCode) if (country == "US" || country == "CA" || country == "GB") { if (!string.IsNullOrWhiteSpace(areaCode)) - numbers = LocalResource.Read(country, areaCode: int.Parse(areaCode), smsEnabled: true); + numbers = await LocalResource.ReadAsync(country, areaCode: int.Parse(areaCode), smsEnabled: true); else - numbers = LocalResource.Read(country, smsEnabled: true); + numbers = await LocalResource.ReadAsync(country, smsEnabled: true); if (numbers != null) { @@ -64,9 +65,9 @@ public List GetAvailableNumbers(string country, string areaCode) ResourceSet mobileNumbers; if (!string.IsNullOrWhiteSpace(areaCode)) - mobileNumbers = MobileResource.Read(country, areaCode: int.Parse(areaCode), smsEnabled: true); + mobileNumbers = await MobileResource.ReadAsync(country, areaCode: int.Parse(areaCode), smsEnabled: true); else - mobileNumbers = MobileResource.Read(country, smsEnabled: true); + mobileNumbers = await MobileResource.ReadAsync(country, smsEnabled: true); if (mobileNumbers != null) { diff --git a/Providers/Resgrid.Providers.Pdf/NRecoProvider.cs b/Providers/Resgrid.Providers.Pdf/NRecoProvider.cs index 6c13dce8..28bdce77 100644 --- a/Providers/Resgrid.Providers.Pdf/NRecoProvider.cs +++ b/Providers/Resgrid.Providers.Pdf/NRecoProvider.cs @@ -1,7 +1,7 @@ using System; -using System.Diagnostics; using NReco.PdfGenerator; using Resgrid.Config; +using Resgrid.Framework; using Resgrid.Model.Providers; namespace Resgrid.Providers.PdfProvider @@ -12,6 +12,14 @@ public byte[] ConvertHtmlToPdf(string html) { var converter = new HtmlToPdfConverter(); + if (OS.IsLinux() || OS.IsMacOS()) + { + converter.WkHtmlToPdfExeName = "wkhtmltopdf"; + converter.PdfToolPath = "/usr/local/bin/"; + } + else + converter.WkHtmlToPdfExeName = "wkhtmltopdf.exe"; + if (!String.IsNullOrWhiteSpace(PrintConfig.NRecoPdfOwner) && !String.IsNullOrWhiteSpace(PrintConfig.NRecoPdfKey)) converter.License.SetLicenseKey(PrintConfig.NRecoPdfOwner, PrintConfig.NRecoPdfKey); diff --git a/Providers/Resgrid.Providers.Pdf/PrintNodeProvider.cs b/Providers/Resgrid.Providers.Pdf/PrintNodeProvider.cs index 540f3a5e..fa1fca7b 100644 --- a/Providers/Resgrid.Providers.Pdf/PrintNodeProvider.cs +++ b/Providers/Resgrid.Providers.Pdf/PrintNodeProvider.cs @@ -5,19 +5,20 @@ using RestSharp.Authenticators; using System.Collections.Generic; using System.Net; +using System.Threading.Tasks; namespace Resgrid.Providers.PdfProvider { public class PrintNodeProvider: IPrinterProvider { - public Whoami Whoami(string apiKey) + public async Task Whoami(string apiKey) { var client = new RestClient(Config.PrintConfig.PrintNodeBaseUrl); client.Authenticator = new HttpBasicAuthenticator(apiKey, ""); - var request = new RestRequest("/whoami", Method.GET); + var request = new RestRequest("/whoami", Method.Get); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.StatusCode == HttpStatusCode.OK) return JsonConvert.DeserializeObject(response.Content); @@ -25,14 +26,14 @@ public Whoami Whoami(string apiKey) return null; } - public List GetComputers(string apiKey) + public async Task> GetComputers(string apiKey) { var client = new RestClient(Config.PrintConfig.PrintNodeBaseUrl); client.Authenticator = new HttpBasicAuthenticator(apiKey, ""); - var request = new RestRequest("/computers", Method.GET); + var request = new RestRequest("/computers", Method.Get); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.StatusCode == HttpStatusCode.OK) return JsonConvert.DeserializeObject>(response.Content); @@ -40,14 +41,14 @@ public List GetComputers(string apiKey) return null; } - public List GetPrinters(string apiKey) + public async Task> GetPrinters(string apiKey) { var client = new RestClient(Config.PrintConfig.PrintNodeBaseUrl); client.Authenticator = new HttpBasicAuthenticator(apiKey, ""); - var request = new RestRequest("/printers", Method.GET); + var request = new RestRequest("/printers", Method.Get); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.StatusCode == HttpStatusCode.OK) return JsonConvert.DeserializeObject>(response.Content); @@ -55,14 +56,14 @@ public List GetPrinters(string apiKey) return null; } - public List GetPrintJobs(string apiKey) + public async Task> GetPrintJobs(string apiKey) { var client = new RestClient(Config.PrintConfig.PrintNodeBaseUrl); client.Authenticator = new HttpBasicAuthenticator(apiKey, ""); - var request = new RestRequest("/printjobs", Method.GET); + var request = new RestRequest("/printjobs", Method.Get); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.StatusCode == HttpStatusCode.OK) return JsonConvert.DeserializeObject>(response.Content); @@ -72,12 +73,12 @@ public List GetPrintJobs(string apiKey) //return "";//Get("PrintJobs"); } - public bool SubmitPrintJob(string apiKey, int printerId, string title, string url) + public async Task SubmitPrintJob(string apiKey, int printerId, string title, string url) { var client = new RestClient(Config.PrintConfig.PrintNodeBaseUrl); client.Authenticator = new HttpBasicAuthenticator(apiKey, ""); - var request = new RestRequest("/printjobs", Method.POST); + var request = new RestRequest("/printjobs", Method.Post); //request.AddHeader("Accept", "application/json"); //request.AddHeader("Content-Type", "application/json; charset=utf-8"); request.AddHeader("Content-type", "application/json"); @@ -91,7 +92,8 @@ public bool SubmitPrintJob(string apiKey, int printerId, string title, string ur source = "Resgrid Print Job" }); - request.AddParameter("application/json", body, "application/json; charset=utf-8", ParameterType.RequestBody); + var param = new BodyParameter("application/json", body, "application/json; charset=utf-8"); + request.AddParameter(param); //request.AddJsonBody(new //{ @@ -102,7 +104,7 @@ public bool SubmitPrintJob(string apiKey, int printerId, string title, string ur // source = "Resgrid Print Job" //}); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.StatusCode == HttpStatusCode.Created) diff --git a/Providers/Resgrid.Providers.Pdf/Resgrid.Providers.Pdf.csproj b/Providers/Resgrid.Providers.Pdf/Resgrid.Providers.Pdf.csproj index baba7ff8..edd1af2c 100644 --- a/Providers/Resgrid.Providers.Pdf/Resgrid.Providers.Pdf.csproj +++ b/Providers/Resgrid.Providers.Pdf/Resgrid.Providers.Pdf.csproj @@ -1,14 +1,14 @@ - netstandard2.0 + netstandard2.1 Debug;Release;Docker - + - + diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooAccountUsersResult.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooAccountUsersResult.cs new file mode 100644 index 00000000..d9f2cbc6 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooAccountUsersResult.cs @@ -0,0 +1,66 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooAccountUsersResult + { + [JsonProperty("page_size")] + public int PageSize { get; set; } + + [JsonProperty("data")] + public List Data { get; set; } + + [JsonProperty("revision")] + public string Revision { get; set; } + + [JsonProperty("timestamp")] + public DateTime Timestamp { get; set; } + + [JsonProperty("version")] + public string Version { get; set; } + + [JsonProperty("node")] + public string Node { get; set; } + + [JsonProperty("request_id")] + public string RequestId { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("auth_token")] + public string AuthToken { get; set; } + } + + public class KazooAccountUserDatumResult + { + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("features")] + public List Features { get; set; } + + [JsonProperty("username")] + public string Username { get; set; } + + [JsonProperty("email")] + public string Email { get; set; } + + [JsonProperty("first_name")] + public string FirstName { get; set; } + + [JsonProperty("last_name")] + public string LastName { get; set; } + + [JsonProperty("priv_level")] + public string PrivLevel { get; set; } + + [JsonProperty("flags")] + public List Flags { get; set; } + + [JsonProperty("timezone")] + public string Timezone { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCallflowDetailsResult.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCallflowDetailsResult.cs new file mode 100644 index 00000000..ac739fc9 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCallflowDetailsResult.cs @@ -0,0 +1,95 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooCallflowDetailsResult + { + [JsonProperty("data")] + public KazooCallflowDetailDataResult Data { get; set; } + + [JsonProperty("revision")] + public string Revision { get; set; } + + [JsonProperty("timestamp")] + public DateTime Timestamp { get; set; } + + [JsonProperty("version")] + public string Version { get; set; } + + [JsonProperty("node")] + public string Node { get; set; } + + [JsonProperty("request_id")] + public string RequestId { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("auth_token")] + public string AuthToken { get; set; } + } + + public class KazooCallflowDetailDataResult + { + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("flow")] + public Flow Flow { get; set; } + + [JsonProperty("numbers")] + public List Numbers { get; set; } + + [JsonProperty("ui_metadata")] + public UiMetadata UiMetadata { get; set; } + + [JsonProperty("patterns")] + public List Patterns { get; set; } + + [JsonProperty("metadata")] + public Dictionary Metadata { get; set; } + } + + public class Flow + { + [JsonProperty("data")] + public FlowData Data { get; set; } + + [JsonProperty("module")] + public string Module { get; set; } + + [JsonProperty("children")] + public object Children { get; set; } + } + + public class FlowData + { + [JsonProperty("id")] + public string Id { get; set; } + } + + public class UiMetadata + { + [JsonProperty("version")] + public string Version { get; set; } + + [JsonProperty("ui")] + public string Ui { get; set; } + + [JsonProperty("origin")] + public string Origin { get; set; } + } + + public class CallFlowMetadataValue + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("pvt_type")] + public string PvtType { get; set; } + } + +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCallflowsResult.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCallflowsResult.cs new file mode 100644 index 00000000..a74ea37e --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCallflowsResult.cs @@ -0,0 +1,57 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooCallflowsResult + { + [JsonProperty("page_size")] + public int PageSize { get; set; } + + [JsonProperty("data")] + public List Data { get; set; } + + [JsonProperty("revision")] + public string Revision { get; set; } + + [JsonProperty("timestamp")] + public DateTime Timestamp { get; set; } + + [JsonProperty("version")] + public string Version { get; set; } + + [JsonProperty("node")] + public string Node { get; set; } + + [JsonProperty("request_id")] + public string RequestId { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("auth_token")] + public string AuthToken { get; set; } + } + + public class KazooCallflowResult + { + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("numbers")] + public List Numbers { get; set; } + + [JsonProperty("patterns")] + public List Patterns { get; set; } + + [JsonProperty("featurecode")] + public object Featurecode { get; set; } + + [JsonProperty("modules")] + public List Modules { get; set; } + + [JsonProperty("flags")] + public List Flags { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooConferencesResult.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooConferencesResult.cs new file mode 100644 index 00000000..cf15f96f --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooConferencesResult.cs @@ -0,0 +1,105 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooConferencesResult + { + [JsonProperty("page_size")] + public int PageSize { get; set; } + + [JsonProperty("data")] + public List Data { get; set; } + + [JsonProperty("revision")] + public string Revision { get; set; } + + [JsonProperty("timestamp")] + public DateTime Timestamp { get; set; } + + [JsonProperty("version")] + public string Version { get; set; } + + [JsonProperty("node")] + public string Node { get; set; } + + [JsonProperty("request_id")] + public string RequestId { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("auth_token")] + public string AuthToken { get; set; } + } + + public class KazooConferenceResult + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("moderator")] + public Moderator Moderator { get; set; } + + [JsonProperty("member")] + public Member Member { get; set; } + + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("flags")] + public List Flags { get; set; } + + [JsonProperty("conference_numbers")] + public List ConferenceNumbers { get; set; } + + [JsonProperty("_read_only")] + public ReadOnly ReadOnly { get; set; } + } + + public class Moderator + { + [JsonProperty("pins")] + public List Pins { get; set; } + + [JsonProperty("numbers")] + public List Numbers { get; set; } + + [JsonProperty("join_muted")] + public bool JoinMuted { get; set; } + + [JsonProperty("join_deaf")] + public bool JoinDeaf { get; set; } + } + + public class Member + { + [JsonProperty("pins")] + public List Pins { get; set; } + + [JsonProperty("numbers")] + public List Numbers { get; set; } + + [JsonProperty("join_muted")] + public bool JoinMuted { get; set; } + + [JsonProperty("join_deaf")] + public bool JoinDeaf { get; set; } + } + + public class ReadOnly + { + [JsonProperty("moderators")] + public int Moderators { get; set; } + + [JsonProperty("members")] + public int Members { get; set; } + + [JsonProperty("is_locked")] + public bool IsLocked { get; set; } + + [JsonProperty("duration")] + public int Duration { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateCallflowRequest.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateCallflowRequest.cs new file mode 100644 index 00000000..e8a432bf --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateCallflowRequest.cs @@ -0,0 +1,26 @@ +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooCreateCallflowRequest + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("numbers")] + public List Numbers { get; set; } + + [JsonProperty("flow")] + public FlowRequest Flow { get; set; } // id is conferenceid, module is conference + } + + public class FlowRequest + { + [JsonProperty("data")] + public FlowData Data { get; set; } + + [JsonProperty("module")] + public string Module { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateConferenceRequest.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateConferenceRequest.cs new file mode 100644 index 00000000..3cda7c5a --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateConferenceRequest.cs @@ -0,0 +1,47 @@ +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooCreateConferenceRequest + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("member")] + public MemberRequest Member { get; set; } + + [JsonProperty("profile")] + public ProfileRequest Profile { get; set; } + + [JsonProperty("play_entry_tone")] + public bool PlayEntryTone { get; set; } + + [JsonProperty("play_exit_tone")] + public bool PlayExitTone { get; set; } + } + + public class MemberRequest + { + [JsonProperty("pins")] + public List Pins { get; set; } + + [JsonProperty("join_muted")] + public bool JoinMuted { get; set; } + + [JsonProperty("join_deaf")] + public bool JoinDeaf { get; set; } + } + + public class ProfileRequest + { + [JsonProperty("alone-sound")] + public string AloneSound { get; set; } + + [JsonProperty("enter-sound")] + public string EnterSound { get; set; } + + [JsonProperty("exit-sound")] + public string ExitSound { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateDeviceRequest.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateDeviceRequest.cs new file mode 100644 index 00000000..fe0fa096 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateDeviceRequest.cs @@ -0,0 +1,34 @@ +using Newtonsoft.Json; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooCreateDeviceRequest + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("username")] + public string Username { get; set; } + + [JsonProperty("password")] + public string Password { get; set; } + + [JsonProperty("owner_id")] + public string OwnerId { get; set; } + + [JsonProperty("device_type")] + public string DeviceType { get; set; } //sip_device + + [JsonProperty("sip")] + public Sip Sip { get; set; } + } + + public class Sip + { + [JsonProperty("username")] + public string Username { get; set; } + + [JsonProperty("password")] + public string Password { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateDeviceResult.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateDeviceResult.cs new file mode 100644 index 00000000..d90ecd98 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateDeviceResult.cs @@ -0,0 +1,35 @@ +using Newtonsoft.Json; +using System; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooCreateDeviceResult + { + [JsonProperty("page_size")] + public int PageSize { get; set; } + + [JsonProperty("data")] + public KazooDeviceResult Data { get; set; } + + [JsonProperty("revision")] + public string Revision { get; set; } + + [JsonProperty("timestamp")] + public DateTime Timestamp { get; set; } + + [JsonProperty("version")] + public string Version { get; set; } + + [JsonProperty("node")] + public string Node { get; set; } + + [JsonProperty("request_id")] + public string RequestId { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("auth_token")] + public string AuthToken { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateUserRequest.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateUserRequest.cs new file mode 100644 index 00000000..d9629c71 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateUserRequest.cs @@ -0,0 +1,22 @@ +using Newtonsoft.Json; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooCreateUserRequest + { + [JsonProperty("email")] + public string EmailAddress { get; set; } + + [JsonProperty("first_name")] + public string FirstName { get; set; } + + [JsonProperty("last_name")] + public string LastName { get; set; } + + [JsonProperty("username")] + public string Username { get; set; } + + [JsonProperty("password")] + public string Password { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateUserResult.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateUserResult.cs new file mode 100644 index 00000000..3f6def07 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCreateUserResult.cs @@ -0,0 +1,122 @@ +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooCreateUserResult + { + [JsonProperty("auth_token")] + public string AuthToken { get; set; } + + [JsonProperty("data")] + public KazooCreateUserDataResult Data { get; set; } + + [JsonProperty("request_id")] + public string RequestId { get; set; } + + [JsonProperty("revision")] + public string Revision { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + } + + public class KazooCreateUserDataResult + { + [JsonProperty("call_restriction")] + public object CallRestriction { get; set; } + + [JsonProperty("caller_id")] + public object CallerId { get; set; } + + [JsonProperty("contact_list")] + public object ContactList { get; set; } + + [JsonProperty("dial_plan")] + public object DialPlan { get; set; } + + [JsonProperty("enabled")] + public bool Enabled { get; set; } + + [JsonProperty("first_name")] + public string FirstName { get; set; } + + [JsonProperty("hotdesk")] + public Hotdesk Hotdesk { get; set; } + + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("last_name")] + public string LastName { get; set; } + + [JsonProperty("media")] + public Media Media { get; set; } + + [JsonProperty("music_on_hold")] + public object MusicOnHold { get; set; } + + [JsonProperty("priv_level")] + public string PrivLevel { get; set; } + + [JsonProperty("profile")] + public object Profile { get; set; } + + [JsonProperty("require_password_update")] + public bool RequirePasswordUpdate { get; set; } + + [JsonProperty("ringtones")] + public object Ringtones { get; set; } + + [JsonProperty("verified")] + public bool Verified { get; set; } + + [JsonProperty("vm_to_email_enabled")] + public bool VmToEmailEnabled { get; set; } + } + + public class Media + { + [JsonProperty("audio")] + public Audio Audio { get; set; } + + [JsonProperty("encryption")] + public Encryption Encryption { get; set; } + + [JsonProperty("video")] + public Video Video { get; set; } + } + + public class Hotdesk + { + [JsonProperty("enabled")] + public bool Enabled { get; set; } + + [JsonProperty("keep_logged_in_elsewhere")] + public bool KeepLoggedInElsewhere { get; set; } + + [JsonProperty("require_pin")] + public bool RequirePin { get; set; } + } + + public class Audio + { + [JsonProperty("codecs")] + public List Codecs { get; set; } + } + + public class Encryption + { + [JsonProperty("enforce_security")] + public bool EnforceSecurity { get; set; } + + [JsonProperty("methods")] + public List Methods { get; set; } + } + + public class Video + { + [JsonProperty("codecs")] + public List Codecs { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCredentials.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCredentials.cs new file mode 100644 index 00000000..8eeb88cf --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooCredentials.cs @@ -0,0 +1,8 @@ +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooCredentials + { + public string AuthToken { get; set; } + public string AccountId { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooDevicesResult.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooDevicesResult.cs new file mode 100644 index 00000000..44f12cc8 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooDevicesResult.cs @@ -0,0 +1,63 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooDevicesResult + { + [JsonProperty("page_size")] + public int PageSize { get; set; } + + [JsonProperty("data")] + public List Data { get; set; } + + [JsonProperty("revision")] + public string Revision { get; set; } + + [JsonProperty("timestamp")] + public DateTime Timestamp { get; set; } + + [JsonProperty("version")] + public string Version { get; set; } + + [JsonProperty("node")] + public string Node { get; set; } + + [JsonProperty("request_id")] + public string RequestId { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("auth_token")] + public string AuthToken { get; set; } + } + + public class KazooDeviceResult + { + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("username")] + public string Username { get; set; } + + [JsonProperty("mac_address")] + public string MacAddress { get; set; } + + [JsonProperty("owner_id")] + public string OwnerId { get; set; } + + [JsonProperty("enabled")] + public bool Enabled { get; set; } + + [JsonProperty("device_type")] + public string DeviceType { get; set; } + + [JsonProperty("flags")] + public List Flags { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooGetConferenceResult.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooGetConferenceResult.cs new file mode 100644 index 00000000..1b9488ee --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooGetConferenceResult.cs @@ -0,0 +1,35 @@ +using Newtonsoft.Json; +using System; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooGetConferenceResult + { + [JsonProperty("page_size")] + public int PageSize { get; set; } + + [JsonProperty("data")] + public KazooConferenceResult Data { get; set; } + + [JsonProperty("revision")] + public string Revision { get; set; } + + [JsonProperty("timestamp")] + public DateTime Timestamp { get; set; } + + [JsonProperty("version")] + public string Version { get; set; } + + [JsonProperty("node")] + public string Node { get; set; } + + [JsonProperty("request_id")] + public string RequestId { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("auth_token")] + public string AuthToken { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooUserAuthResult.cs b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooUserAuthResult.cs new file mode 100644 index 00000000..f31d2bf8 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Kazoo/Model/KazooUserAuthResult.cs @@ -0,0 +1,112 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; + +namespace Resgrid.Providers.Voip.Kazoo.Model +{ + public class KazooUserAuthResult + { + [JsonProperty("page_size")] + public int PageSize { get; set; } + + [JsonProperty("data")] + public KazooUserAuthDataResult Data { get; set; } + + [JsonProperty("revision")] + public string Revision { get; set; } + + [JsonProperty("timestamp")] + public DateTime Timestamp { get; set; } + + [JsonProperty("version")] + public string Version { get; set; } + + [JsonProperty("node")] + public string Node { get; set; } + + [JsonProperty("request_id")] + public string RequestId { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("auth_token")] + public string AuthToken { get; set; } + } + + public class KazooUserAuthDataResult + { + [JsonProperty("owner_id")] + public string OwnerId { get; set; } + + [JsonProperty("account_id")] + public string AccountId { get; set; } + + [JsonProperty("ui_config")] + public UiConfig UiConfig { get; set; } + + [JsonProperty("capabilities")] + public Capabilities Capabilities { get; set; } + + [JsonProperty("is_master_account")] + public bool IsMasterAccount { get; set; } + + [JsonProperty("is_reseller")] + public bool IsReseller { get; set; } + + [JsonProperty("reseller_id")] + public string ResellerId { get; set; } + + [JsonProperty("cluster_id")] + public string ClusterId { get; set; } + + [JsonProperty("account_name")] + public string AccountName { get; set; } + + [JsonProperty("language")] + public string Language { get; set; } + + [JsonProperty("apps")] + public List Apps { get; set; } + } + + public class KazzoUserAuthAppsResult + { + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("api_url")] + public string ApiUrl { get; set; } + + [JsonProperty("label")] + public string Label { get; set; } + } + + public class UiConfig + { + } + + public class Transcription + { + [JsonProperty("default")] + public bool Default { get; set; } + + [JsonProperty("available")] + public bool Available { get; set; } + } + + public class Voicemail + { + [JsonProperty("transcription")] + public Transcription Transcription { get; set; } + } + + public class Capabilities + { + [JsonProperty("voicemail")] + public Voicemail Voicemail { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/KazooProvider.cs b/Providers/Resgrid.Providers.Voip/KazooProvider.cs new file mode 100644 index 00000000..1af51625 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/KazooProvider.cs @@ -0,0 +1,433 @@ +using Resgrid.Framework; +using Resgrid.Providers.Voip.Kazoo.Model; +using RestSharp; +using System.Collections.Generic; +using System.Net; +using System.Threading.Tasks; +using RestRequest = RestSharp.RestRequest; + +namespace Resgrid.Providers.Voip +{ + public class KazooProvider + { + public async Task GetAccountApiToken() + { + var credentials = Hashing.ComputeMD5Hash($"{Config.VoipConfig.KazooUsername}:{Config.VoipConfig.KazooPassword}"); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/user_auth", Method.Put); + + var body = new + { + data = new { + credentials = credentials, + account_name = Config.VoipConfig.KazzoAccount + }, + method = "md5" + }; + request.AddJsonBody(body); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.Created) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + var kazooCreds = new KazooCredentials(); + kazooCreds.AuthToken = response.Data.AuthToken; + kazooCreds.AccountId = response.Data.Data.AccountId; + + return kazooCreds; + } + + public async Task> GetUsers() + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/users", Method.Get); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task CreateUser(KazooCreateUserRequest user) + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/users", Method.Put); + //request.JsonSerializer = new NewtonsoftJsonSerializer(); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var body = new + { + data = user + }; + request.AddJsonBody(body); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.Created) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task DeleteUser(string userId) + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/users/{userId}", Method.Delete); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task GetUser(string userId) + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/users/{userId}", Method.Get); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task> GetDevices() + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/devices", Method.Get); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task CreateDevice(KazooCreateDeviceRequest device) + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/devices", Method.Put); + //request.JsonSerializer = new NewtonsoftJsonSerializer(); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var body = new + { + data = device + }; + request.AddJsonBody(body); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.Created) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task DeleteDevice(string deviceId) + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/devices/{deviceId}", Method.Delete); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task GetDevice(string deviceId) + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/devices/{deviceId}", Method.Get); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task> GetConferences() + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/conferences", Method.Get); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task GetConference(string conferenceId) + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/conferences/{conferenceId}", Method.Get); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task CreateConference(KazooCreateConferenceRequest conference) + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/conferences", Method.Put); + //request.JsonSerializer = new NewtonsoftJsonSerializer(); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var body = new + { + data = conference + }; + request.AddJsonBody(body); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.Created) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task DeleteConference(string conferenceId) + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/conferences/{conferenceId}", Method.Delete); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task> GetCallflows() + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/callflows", Method.Get); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task GetCallflowDetails(string callFlowId) + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/callflows/{callFlowId}", Method.Get); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task DeleteCallflow(string callFlowId) + { + var credentials = await GetAccountApiToken(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/callflows/{callFlowId}", Method.Delete); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.OK) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + + public async Task CreateCallflow(KazooCreateCallflowRequest callflow) + { + var credentials = await GetAccountApiToken(); + + //var options = new RestClientOptions(); + //var jsonSettings = new Newtonsoft.Json.JsonSerializerSettings(); + //jsonSettings. + //options.SerializeJson(new Newtonsoft.Json.JsonSerializerSettings(); + + var client = new RestClient(Config.VoipConfig.KazooCrossbarApiUrl); + var request = new RestRequest($"{Config.VoipConfig.KazooCrossbarApiVersion}/accounts/{credentials.AccountId}/callflows", Method.Put); + //request.JsonSerializer = new NewtonsoftJsonSerializer(); + request.AddHeader("X-Auth-Token", credentials.AuthToken); + + var body = new + { + data = callflow + }; + request.AddJsonBody(body); + + var response = await client.ExecuteAsync(request); + + if (response.StatusCode != HttpStatusCode.Created) + return null; + + if (response.Data == null) + return null; + + if (response.Data.Status != "success") + return null; + + return response.Data.Data; + } + } +} diff --git a/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduConnection.cs b/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduConnection.cs new file mode 100644 index 00000000..acd228aa --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduConnection.cs @@ -0,0 +1,14 @@ +using Newtonsoft.Json; +using System.Collections.Generic; + +namespace Resgrid.Providers.Voip.OpenVidu.Model +{ + public class OpenViduConnection + { + [JsonProperty("numberOfElements")] + public int NumberOfElements { get; set; } + + [JsonProperty("content")] + public List Content { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduDefaultRecordingProperties.cs b/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduDefaultRecordingProperties.cs new file mode 100644 index 00000000..629a042d --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduDefaultRecordingProperties.cs @@ -0,0 +1,31 @@ +using Newtonsoft.Json; + +namespace Resgrid.Providers.Voip.OpenVidu.Model +{ + public class OpenViduDefaultRecordingProperties + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("hasAudio")] + public bool HasAudio { get; set; } + + [JsonProperty("hasVideo")] + public bool HasVideo { get; set; } + + [JsonProperty("outputMode")] + public string OutputMode { get; set; } + + [JsonProperty("recordingLayout")] + public string RecordingLayout { get; set; } + + [JsonProperty("resolution")] + public string Resolution { get; set; } + + [JsonProperty("frameRate")] + public int FrameRate { get; set; } + + [JsonProperty("shmSize")] + public int ShmSize { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduSession.cs b/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduSession.cs new file mode 100644 index 00000000..087d1afd --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduSession.cs @@ -0,0 +1,43 @@ +using Newtonsoft.Json; + +namespace Resgrid.Providers.Voip.OpenVidu.Model +{ + public class OpenViduSession + { + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("object")] + public string ObjectType { get; set; } + + [JsonProperty("sessionId")] + public string SessionId { get; set; } + + [JsonProperty("createdAt")] + public double CreatedAt { get; set; } + + [JsonProperty("mediaMode")] + public string MediaMode { get; set; } + + [JsonProperty("recordingMode")] + public string RecordingMode { get; set; } + + [JsonProperty("defaultRecordingProperties")] + public OpenViduDefaultRecordingProperties DefaultRecordingProperties { get; set; } + + [JsonProperty("customSessionId")] + public string CustomSessionId { get; set; } + + [JsonProperty("connections")] + public OpenViduConnection Connections { get; set; } + + [JsonProperty("recording")] + public bool Recording { get; set; } + + [JsonProperty("forcedVideoCodec")] + public string ForcedVideoCodec { get; set; } + + [JsonProperty("allowTranscoding")] + public bool AllowTranscoding { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduToken.cs b/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduToken.cs new file mode 100644 index 00000000..d814e5b0 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/OpenVidu/Model/OpenViduToken.cs @@ -0,0 +1,76 @@ +using Newtonsoft.Json; + +namespace Resgrid.Providers.Voip.OpenVidu.Model +{ + public class OpenViduToken + { + [JsonProperty("id")] + public string Id { get; set; } + + [JsonProperty("object")] + public string ObjectType { get; set; } + + [JsonProperty("status")] + public string Status { get; set; } + + [JsonProperty("connectionId")] + public string ConnectionId { get; set; } + + [JsonProperty("sessionId")] + public string SessionId { get; set; } + + [JsonProperty("createdAt")] + public double CreatedAt { get; set; } + + [JsonProperty("type")] + public string Type { get; set; } + + [JsonProperty("record")] + public bool Record { get; set; } + + [JsonProperty("role")] + public string Role { get; set; } + + [JsonProperty("kurentoOptions")] + public string KurentoOptions { get; set; } + + [JsonProperty("rtspUri")] + public string RtspUri { get; set; } + + [JsonProperty("adaptativeBitrate")] + public string AdaptativeBitrate { get; set; } + + [JsonProperty("onlyPlayWithSubscribers")] + public string OnlyPlayWithSubscribers { get; set; } + + [JsonProperty("networkCache")] + public string NetworkCache { get; set; } + + [JsonProperty("serverData")] + public string ServerData { get; set; } + + [JsonProperty("token")] + public string Token { get; set; } + + [JsonProperty("activeAt")] + public string ActiveAt { get; set; } + + [JsonProperty("location")] + public string Location { get; set; } + + [JsonProperty("ip")] + public string IP { get; set; } + + [JsonProperty("platform")] + public string Platform { get; set; } + + [JsonProperty("clientData")] + public string ClientData { get; set; } + + [JsonProperty("publishers")] + public string Publishers { get; set; } + + [JsonProperty("subscribers")] + public string Subscribers { get; set; } + } +} diff --git a/Providers/Resgrid.Providers.Voip/OpenViduProvider.cs b/Providers/Resgrid.Providers.Voip/OpenViduProvider.cs new file mode 100644 index 00000000..acdc7345 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/OpenViduProvider.cs @@ -0,0 +1,79 @@ +using Resgrid.Providers.Voip.OpenVidu.Model; +using RestSharp; +using System.Net; +using System.Threading.Tasks; + +namespace Resgrid.Providers.Voip +{ + public class OpenViduProvider + { + public async Task CreateSession(string sessionId) + { + var client = new RestClient(Config.VoipConfig.OpenViduUrl); + + var request = new RestRequest($"/openvidu/api/sessions", Method.Post); + request.AddHeader("Authorization", "Basic " + Encode("OPENVIDUAPP:" + Config.VoipConfig.OpenViduSecret)); + request.AddHeader("Content-Type", "application/json"); + + var body = new + { + customSessionId = sessionId + }; + request.AddJsonBody(body); + + var response = await client.ExecuteAsync(request); + + if (response == null) + return null; + + if (response.StatusCode == HttpStatusCode.Conflict) // Already a session with this id active + { + var session = new OpenViduSession(); + session.Id = sessionId; + session.CustomSessionId = sessionId; + + return session; + } + else if (response.StatusCode == HttpStatusCode.NotAcceptable) // Already a session but no one in it? + { + var session = new OpenViduSession(); + session.Id = sessionId; + session.CustomSessionId = sessionId; + + return session; + } + + return response.Data; + } + + public async Task CreateToken(OpenViduSession session) + { + var client = new RestClient(Config.VoipConfig.OpenViduUrl); + + var request = new RestRequest($"/openvidu/api/sessions/" + session.Id + "/connection", Method.Post); + request.AddHeader("Authorization", "Basic " + Encode("OPENVIDUAPP:" + Config.VoipConfig.OpenViduSecret)); + request.AddHeader("Content-Type", "application/json"); + + var body = new + { + + }; + request.AddJsonBody(body); + + var response = await client.ExecuteAsync(request); + + if (response == null) + return null; + + return response.Data; + } + + private static string Encode(string toEncode) + { + byte[] bytes = System.Text.Encoding.UTF8.GetBytes(toEncode); + string toReturn = System.Convert.ToBase64String(bytes); + return toReturn; + } + } + +} diff --git a/Providers/Resgrid.Providers.Voip/Resgrid.Providers.Voip.csproj b/Providers/Resgrid.Providers.Voip/Resgrid.Providers.Voip.csproj new file mode 100644 index 00000000..e31fcbd3 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/Resgrid.Providers.Voip.csproj @@ -0,0 +1,20 @@ + + + + netstandard2.1 + Debug;Release;Docker + + + + + + + + + + + + + + + diff --git a/Providers/Resgrid.Providers.Voip/VoipProvider.cs b/Providers/Resgrid.Providers.Voip/VoipProvider.cs new file mode 100644 index 00000000..03e493a8 --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/VoipProvider.cs @@ -0,0 +1,141 @@ +using Resgrid.Framework; +using Resgrid.Model; +using Resgrid.Model.Providers; +using Resgrid.Providers.Voip.Kazoo.Model; +using System; +using System.Threading.Tasks; + +namespace Resgrid.Providers.Voip +{ + public class VoipProvider : IVoipProvider + { + private readonly KazooProvider _kazooProvider; + + public VoipProvider() + { + _kazooProvider = new KazooProvider(); + } + + public async Task CreateUserIfNotExistsAsync(string voipSystemUserId, string emailAddress, UserProfile profile, int departmentId) + { + if (Config.SystemBehaviorConfig.VoipProviderType == Config.VoipProviderTypes.Kazoo) + { + if (!String.IsNullOrWhiteSpace(voipSystemUserId)) + { + var user = await _kazooProvider.GetUser(voipSystemUserId); + + if (user != null) + return voipSystemUserId; + } + + var kazooUser = new KazooCreateUserRequest(); + kazooUser.EmailAddress = emailAddress; + kazooUser.FirstName = profile.FirstName; + kazooUser.LastName = $"{profile.LastName} ({departmentId})"; + kazooUser.Username = $"Web{profile.UserId}"; + kazooUser.Password = RandomGenerator.GenerateRandomString(8, 12, false, false, false, true, true, false, null); + + var newUser = await _kazooProvider.CreateUser(kazooUser); + + if (newUser != null) + return newUser.Id; + } + + return null; + } + + public async Task CreateDeviceForUserIfNotExistsAsync(string voipSystemUserId, string voipSystemDeviceId, UserProfile profile, int departmentId) + { + if (Config.SystemBehaviorConfig.VoipProviderType == Config.VoipProviderTypes.Kazoo) + { + if (!String.IsNullOrWhiteSpace(voipSystemDeviceId)) + { + var user = await _kazooProvider.GetDevice(voipSystemDeviceId); + + if (user != null) + return voipSystemDeviceId; + } + + var kazooDevice = new KazooCreateDeviceRequest(); + kazooDevice.Name = $"{departmentId}: {profile.FirstName} {profile.LastName} SIP Device"; + kazooDevice.Username = profile.UserId.Replace("-", ""); + kazooDevice.Password = Hashing.ComputeMD5Hash($"{profile.UserId}{Config.SymmetricEncryptionConfig.InitVector}"); + kazooDevice.OwnerId = voipSystemUserId; + kazooDevice.DeviceType = "sip_device"; + kazooDevice.Sip = new Sip(); + kazooDevice.Sip.Username = kazooDevice.Username; + kazooDevice.Sip.Password = kazooDevice.Password; + + var newDevice = await _kazooProvider.CreateDevice(kazooDevice); + + if (newDevice != null) + return newDevice.Id; + } + + return null; + } + + public async Task> CreateConferenceIfNotExistsAsync(string voipSystemConferenceId, int departmentId, string name, string pin, int number) + { + if (Config.SystemBehaviorConfig.VoipProviderType == Config.VoipProviderTypes.Kazoo) + { + if (!String.IsNullOrWhiteSpace(voipSystemConferenceId)) + { + var conference = await _kazooProvider.GetConference(voipSystemConferenceId); + + if (conference != null) + return new Tuple(voipSystemConferenceId, ""); + } + + var kazooConf = new KazooCreateConferenceRequest(); + kazooConf.Name = $"{departmentId}:{name}"; + kazooConf.PlayEntryTone = false; + kazooConf.PlayExitTone = false; + kazooConf.Member = new MemberRequest(); + kazooConf.Member.JoinMuted = false; + kazooConf.Member.Pins = new System.Collections.Generic.List(); + kazooConf.Member.Pins.Add(pin); + kazooConf.Profile = new ProfileRequest(); + kazooConf.Profile.AloneSound = ""; + kazooConf.Profile.EnterSound = ""; + kazooConf.Profile.ExitSound = ""; + + var newConf = await _kazooProvider.CreateConference(kazooConf); + + if (newConf != null) + { + var kazooCallflow = new KazooCreateCallflowRequest(); + kazooCallflow.Name = $"{departmentId}:{name} Callflow"; + kazooCallflow.Numbers = new System.Collections.Generic.List(); + kazooCallflow.Numbers.Add(number.ToString()); + kazooCallflow.Flow = new FlowRequest(); + kazooCallflow.Flow.Data = new FlowData(); + kazooCallflow.Flow.Data.Id = newConf.Id; + kazooCallflow.Flow.Module = "conference"; + + var newCallflow = await _kazooProvider.CreateCallflow(kazooCallflow); + + if (newCallflow != null) + return new Tuple(newConf.Id, newCallflow.Id); + + + return new Tuple(newConf.Id, ""); + } + } + + return null; + } + + public async Task CreateOpenViduSessionAndGetToken(string sessionId) + { + var openViduProvider = new OpenViduProvider(); + var createSessionResult = await openViduProvider.CreateSession(sessionId); + var createTokenResult = await openViduProvider.CreateToken(createSessionResult); + + if (createTokenResult != null) + return createTokenResult.Token; + + return null; + } + } +} diff --git a/Providers/Resgrid.Providers.Voip/VoipProviderModule.cs b/Providers/Resgrid.Providers.Voip/VoipProviderModule.cs new file mode 100644 index 00000000..f166295c --- /dev/null +++ b/Providers/Resgrid.Providers.Voip/VoipProviderModule.cs @@ -0,0 +1,13 @@ +using Autofac; +using Resgrid.Model.Providers; + +namespace Resgrid.Providers.Voip +{ + public class VoipProviderModule : Module + { + protected override void Load(ContainerBuilder builder) + { + builder.RegisterType().As().InstancePerLifetimeScope(); + } + } +} diff --git a/References/WebOptimizer/WebOptimizer.Core.dll b/References/WebOptimizer/WebOptimizer.Core.dll new file mode 100644 index 00000000..cc7e5f87 Binary files /dev/null and b/References/WebOptimizer/WebOptimizer.Core.dll differ diff --git a/Repositories/Resgrid.Repositories.DataRepository/CallsRepository.cs b/Repositories/Resgrid.Repositories.DataRepository/CallsRepository.cs index fea98796..ca5ab1f2 100644 --- a/Repositories/Resgrid.Repositories.DataRepository/CallsRepository.cs +++ b/Repositories/Resgrid.Repositories.DataRepository/CallsRepository.cs @@ -279,6 +279,89 @@ public async Task> SelectCallYearsByDeptAsync(int department } } + public async Task> GetAllNonDispatchedScheduledCallsWithinDateRange(DateTime startDate, DateTime endDate) + { + try + { + var selectFunction = new Func>>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("StartDate", startDate); + dynamicParameters.Add("EndDate", endDate); + + var query = _queryFactory.GetQuery(); + + return await x.QueryAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + throw; + } + } + + public async Task> GetAllNonDispatchedScheduledCallsByDepartmentIdAsync(int departmentId) + { + try + { + var selectFunction = new Func>>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("DepartmentId", departmentId); + + var query = _queryFactory.GetQuery(); + + return await x.QueryAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + throw; + } + } + public void CleanUpCallDispatchAudio() { //var lastestDate = DateTime.UtcNow.AddDays(-14); diff --git a/Repositories/Resgrid.Repositories.DataRepository/Configs/SqlConfiguration.cs b/Repositories/Resgrid.Repositories.DataRepository/Configs/SqlConfiguration.cs index 51a526c3..da96bdaa 100644 --- a/Repositories/Resgrid.Repositories.DataRepository/Configs/SqlConfiguration.cs +++ b/Repositories/Resgrid.Repositories.DataRepository/Configs/SqlConfiguration.cs @@ -313,6 +313,8 @@ protected SqlConfiguration() { } public string SelectAllCallRoleDispsByCallIdQuery { get; set; } public string SelectCallYearsByDeptQuery { get; set; } public string SelectAllClosedCallsByDidYearQuery { get; set; } + public string SelectNonDispatchedScheduledCallsByDateQuery { get; set; } + public string SelectNonDispatchedScheduledCallsByDidQuery { get; set; } #endregion Calls #region Dispatch Protocols @@ -375,6 +377,27 @@ protected SqlConfiguration() { } public string SelectNotesByDIdQuery { get; set; } #endregion Notes + #region Forms + public string FormsTable { get; set; } + public string FormAutomationsTable { get; set; } + public string SelectFormByIdQuery { get; set; } + public string SelectFormsByDIdQuery { get; set; } + public string SelectFormAutomationsByFormIdQuery { get; set; } + public string SelectNonDeletedFormsByDIdQuery { get; set; } + public string UpdateFormsToEnableQuery { get; set; } + public string UpdateFormsToDisableQuery { get; set; } + #endregion Forms + + #region Voice + public string DepartmentVoiceTableName { get; set; } + public string DepartmentVoiceChannelsTableName { get; set; } + public string DepartmentVoiceUsersTableName { get; set; } + public string SelectVoiceByDIdQuery { get; set; } + public string SelectVoiceChannelsByVoiceIdQuery { get; set; } + public string SelectVoiceUserByUserIdQuery { get; set; } + public string SelectVoiceChannelsByDIdQuery { get; set; } + #endregion Voice + // Identity #region Table Names diff --git a/Repositories/Resgrid.Repositories.DataRepository/DepartmentVoiceChannelRepository.cs b/Repositories/Resgrid.Repositories.DataRepository/DepartmentVoiceChannelRepository.cs new file mode 100644 index 00000000..7b450688 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/DepartmentVoiceChannelRepository.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using Resgrid.Model; +using Resgrid.Model.Repositories; +using System.Threading.Tasks; +using Dapper; +using Resgrid.Framework; +using Resgrid.Model.Repositories.Connection; +using Resgrid.Model.Repositories.Queries; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Queries.Voice; + +namespace Resgrid.Repositories.DataRepository +{ + public class DepartmentVoiceChannelRepository : RepositoryBase, IDepartmentVoiceChannelRepository + { + private readonly IConnectionProvider _connectionProvider; + private readonly SqlConfiguration _sqlConfiguration; + private readonly IQueryFactory _queryFactory; + private readonly IUnitOfWork _unitOfWork; + + public DepartmentVoiceChannelRepository(IConnectionProvider connectionProvider, SqlConfiguration sqlConfiguration, IUnitOfWork unitOfWork, IQueryFactory queryFactory) + : base(connectionProvider, sqlConfiguration, unitOfWork, queryFactory) + { + _connectionProvider = connectionProvider; + _sqlConfiguration = sqlConfiguration; + _queryFactory = queryFactory; + _unitOfWork = unitOfWork; + } + + public async Task> GetDepartmentVoiceChannelByVoiceIdAsync(string voiceId) + { + try + { + var selectFunction = new Func>>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("DepartmentVoiceId", voiceId); + + var query = _queryFactory.GetQuery(); + + return await x.QueryAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + throw; + } + + return null; + } + + public async Task> GetDepartmentVoiceChannelByDepartmentIdAsync(int departmentId) + { + try + { + var selectFunction = new Func>>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("DepartmentId", departmentId); + + var query = _queryFactory.GetQuery(); + + return await x.QueryAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + throw; + } + + return null; + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/DepartmentVoiceRepository.cs b/Repositories/Resgrid.Repositories.DataRepository/DepartmentVoiceRepository.cs new file mode 100644 index 00000000..e581cd0e --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/DepartmentVoiceRepository.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using Resgrid.Model; +using Resgrid.Model.Repositories; +using System.Threading.Tasks; +using Dapper; +using Resgrid.Framework; +using Resgrid.Model.Repositories.Connection; +using Resgrid.Model.Repositories.Queries; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Queries.Voice; + +namespace Resgrid.Repositories.DataRepository +{ + public class DepartmentVoiceRepository : RepositoryBase, IDepartmentVoiceRepository + { + private readonly IConnectionProvider _connectionProvider; + private readonly SqlConfiguration _sqlConfiguration; + private readonly IQueryFactory _queryFactory; + private readonly IUnitOfWork _unitOfWork; + + public DepartmentVoiceRepository(IConnectionProvider connectionProvider, SqlConfiguration sqlConfiguration, IUnitOfWork unitOfWork, IQueryFactory queryFactory) + : base(connectionProvider, sqlConfiguration, unitOfWork, queryFactory) + { + _connectionProvider = connectionProvider; + _sqlConfiguration = sqlConfiguration; + _queryFactory = queryFactory; + _unitOfWork = unitOfWork; + } + + public async Task GetDepartmentVoiceByDepartmentIdAsync(int departmentId) + { + try + { + var selectFunction = new Func>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("DepartmentId", departmentId); + + var query = _queryFactory.GetQuery(); + + var dictionary = new Dictionary(); + var result = await x.QueryAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction, + map: DepartmentVoiceChannelMapping(dictionary), + splitOn: "DepartmentVoiceChannelId"); + + if (dictionary.Count > 0) + return dictionary.Select(y => y.Value).FirstOrDefault(); + + return result.FirstOrDefault(); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + return null; + } + } + + private static Func DepartmentVoiceChannelMapping(Dictionary dictionary) + { + return new Func((obj, detail) => + { + var dictObj = default(DepartmentVoice); + + if (detail != null) + { + if (dictionary.TryGetValue((string)obj.IdValue, out dictObj)) + { + if (dictObj.Channels.All(x => x.DepartmentVoiceChannelId != detail.DepartmentVoiceChannelId)) + dictObj.Channels.Add(detail); + } + else + { + if (obj.Channels == null) + obj.Channels = new List(); + + obj.Channels.Add(detail); + dictionary.Add((string)obj.IdValue, obj); + + dictObj = obj; + } + } + else + { + obj.Channels = new List(); + dictObj = obj; + dictionary.Add((string)obj.IdValue, obj); + } + + return dictObj; + }); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/DepartmentVoiceUserRepository.cs b/Repositories/Resgrid.Repositories.DataRepository/DepartmentVoiceUserRepository.cs new file mode 100644 index 00000000..c2a8db28 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/DepartmentVoiceUserRepository.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using Resgrid.Model; +using Resgrid.Model.Repositories; +using System.Threading.Tasks; +using Dapper; +using Resgrid.Framework; +using Resgrid.Model.Repositories.Connection; +using Resgrid.Model.Repositories.Queries; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Queries.Voice; + +namespace Resgrid.Repositories.DataRepository +{ + public class DepartmentVoiceUserRepository : RepositoryBase, IDepartmentVoiceUserRepository + { + private readonly IConnectionProvider _connectionProvider; + private readonly SqlConfiguration _sqlConfiguration; + private readonly IQueryFactory _queryFactory; + private readonly IUnitOfWork _unitOfWork; + + public DepartmentVoiceUserRepository(IConnectionProvider connectionProvider, SqlConfiguration sqlConfiguration, IUnitOfWork unitOfWork, IQueryFactory queryFactory) + : base(connectionProvider, sqlConfiguration, unitOfWork, queryFactory) + { + _connectionProvider = connectionProvider; + _sqlConfiguration = sqlConfiguration; + _queryFactory = queryFactory; + _unitOfWork = unitOfWork; + } + + public async Task GetDepartmentVoiceUserByUserIdAsync(string userId) + { + try + { + var selectFunction = new Func>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("UserId", userId); + + var query = _queryFactory.GetQuery(); + + return await x.QueryFirstOrDefaultAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + throw; + } + + return null; + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Dockerfile b/Repositories/Resgrid.Repositories.DataRepository/Dockerfile new file mode 100644 index 00000000..b613860e --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Dockerfile @@ -0,0 +1,24 @@ +#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. +ARG BUILD_VERSION=3.5.0 + +# Choose ubuntu version +FROM mcr.microsoft.com/mssql/server:2019-CU13-ubuntu-20.04 + +# Create app directory +WORKDIR /usr/src/app + +# Copy initialization scripts +COPY . /usr/src/app + +# Set environment variables, not to have to write them with docker run command +# Note: make sure that your password matches what is in the run-initialization script +ENV SA_PASSWORD Resgrid123! +ENV ACCEPT_EULA Y +ENV MSSQL_PID Express + +# Expose port 1433 in case accessing from other container +# Expose port externally from docker-compose.yml +EXPOSE 1433 + +# Run Microsoft SQl Server and initialization script (at the same time) +CMD /bin/bash ./entrypoint.sh diff --git a/Repositories/Resgrid.Repositories.DataRepository/FormAutomationsRepository.cs b/Repositories/Resgrid.Repositories.DataRepository/FormAutomationsRepository.cs new file mode 100644 index 00000000..4e8837d0 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/FormAutomationsRepository.cs @@ -0,0 +1,73 @@ +using Dapper; +using Resgrid.Framework; +using Resgrid.Model; +using Resgrid.Model.Repositories; +using Resgrid.Model.Repositories.Connection; +using Resgrid.Model.Repositories.Queries; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Queries.Forms; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Threading.Tasks; + +namespace Resgrid.Repositories.DataRepository +{ + public class FormAutomationsRepository : RepositoryBase, IFormAutomationsRepository + { + private readonly IConnectionProvider _connectionProvider; + private readonly SqlConfiguration _sqlConfiguration; + private readonly IQueryFactory _queryFactory; + private readonly IUnitOfWork _unitOfWork; + + public FormAutomationsRepository(IConnectionProvider connectionProvider, SqlConfiguration sqlConfiguration, IUnitOfWork unitOfWork, IQueryFactory queryFactory) + : base(connectionProvider, sqlConfiguration, unitOfWork, queryFactory) + { + _connectionProvider = connectionProvider; + _sqlConfiguration = sqlConfiguration; + _queryFactory = queryFactory; + _unitOfWork = unitOfWork; + } + + public async Task> GetFormAutomationsByFormIdAsync(string formId) + { + try + { + var selectFunction = new Func>>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("FormId", formId); + + var query = _queryFactory.GetQuery(); + + return await x.QueryAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + throw; + } + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/FormsRepository.cs b/Repositories/Resgrid.Repositories.DataRepository/FormsRepository.cs new file mode 100644 index 00000000..fde5db68 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/FormsRepository.cs @@ -0,0 +1,298 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Threading.Tasks; +using Dapper; +using Resgrid.Framework; +using Resgrid.Model; +using Resgrid.Model.Repositories; +using Resgrid.Model.Repositories.Connection; +using Resgrid.Model.Repositories.Queries; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Queries.Forms; + +namespace Resgrid.Repositories.DataRepository +{ + public class FormsRepository : RepositoryBase, IFormsRepository + { + private readonly IConnectionProvider _connectionProvider; + private readonly SqlConfiguration _sqlConfiguration; + private readonly IQueryFactory _queryFactory; + private readonly IUnitOfWork _unitOfWork; + + public FormsRepository(IConnectionProvider connectionProvider, SqlConfiguration sqlConfiguration, IUnitOfWork unitOfWork, IQueryFactory queryFactory) + : base(connectionProvider, sqlConfiguration, unitOfWork, queryFactory) + { + _connectionProvider = connectionProvider; + _sqlConfiguration = sqlConfiguration; + _queryFactory = queryFactory; + _unitOfWork = unitOfWork; + } + + public async Task GetFormByIdAsync(string formId) + { + try + { + var selectFunction = new Func>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("FormId", formId); + + var query = _queryFactory.GetQuery(); + + var dictionary = new Dictionary(); + var result = await x.QueryAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction, + map: FormAutomationMapping(dictionary), + splitOn: "FormAutomationId"); + + if (dictionary.Count > 0) + return dictionary.Select(y => y.Value).FirstOrDefault(); + + return result.FirstOrDefault(); + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + return null; + } + } + + public async Task> GetFormsByDepartmentIdAsync(int departmentId) + { + try + { + var selectFunction = new Func>>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("DepartmentId", departmentId); + + var query = _queryFactory.GetQuery(); + + var dictionary = new Dictionary(); + var result = await x.QueryAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction, + map: FormAutomationMapping(dictionary), + splitOn: "FormAutomationId"); + + if (dictionary.Count > 0) + return dictionary.Select(y => y.Value); + + return result; + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + return null; + } + } + + public async Task> GetNonDeletedFormsByDepartmentIdAsync(int departmentId) + { + try + { + var selectFunction = new Func>>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("DepartmentId", departmentId); + + var query = _queryFactory.GetQuery(); + + var dictionary = new Dictionary(); + var result = await x.QueryAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction, + map: FormAutomationMapping(dictionary), + splitOn: "FormAutomationId"); + + if (dictionary.Count > 0) + return dictionary.Select(y => y.Value); + + return result; + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + return null; + } + } + + public async Task EnableFormByIdAsync(string id) + { + try + { + var selectFunction = new Func>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("FormId", id); + + var query = _queryFactory.GetQuery(); + + var result = await x.QueryAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + + return true; + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + throw; + } + } + + public async Task DisableFormByIdAsync(string id) + { + try + { + var selectFunction = new Func>(async x => + { + var dynamicParameters = new DynamicParameters(); + dynamicParameters.Add("FormId", id); + + var query = _queryFactory.GetQuery(); + + var result = await x.QueryAsync(sql: query, + param: dynamicParameters, + transaction: _unitOfWork.Transaction); + + return true; + }); + + DbConnection conn = null; + if (_unitOfWork?.Connection == null) + { + using (conn = _connectionProvider.Create()) + { + await conn.OpenAsync(); + + return await selectFunction(conn); + } + } + else + { + conn = _unitOfWork.CreateOrGetConnection(); + + return await selectFunction(conn); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + + throw; + } + } + + private static Func FormAutomationMapping(Dictionary dictionary) + { + return new Func((obj, detail) => + { + var dictObj = default(Form); + + if (detail != null) + { + if (dictionary.TryGetValue((string)obj.IdValue, out dictObj)) + { + if (dictObj.Automations.All(x => x.FormAutomationId != detail.FormAutomationId)) + dictObj.Automations.Add(detail); + } + else + { + if (obj.Automations == null) + obj.Automations = new List(); + + obj.Automations.Add(detail); + dictionary.Add((string)obj.IdValue, obj); + + dictObj = obj; + } + } + else + { + obj.Automations = new List(); + dictObj = obj; + dictionary.Add((string)obj.IdValue, obj); + } + + return dictObj; + }); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Modules/ApiDataModule.cs b/Repositories/Resgrid.Repositories.DataRepository/Modules/ApiDataModule.cs index cb151fed..7eb206e3 100644 --- a/Repositories/Resgrid.Repositories.DataRepository/Modules/ApiDataModule.cs +++ b/Repositories/Resgrid.Repositories.DataRepository/Modules/ApiDataModule.cs @@ -131,6 +131,14 @@ protected override void Load(ContainerBuilder builder) builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); } } } diff --git a/Repositories/Resgrid.Repositories.DataRepository/Modules/DataModule.cs b/Repositories/Resgrid.Repositories.DataRepository/Modules/DataModule.cs index e5a3473d..010e241c 100644 --- a/Repositories/Resgrid.Repositories.DataRepository/Modules/DataModule.cs +++ b/Repositories/Resgrid.Repositories.DataRepository/Modules/DataModule.cs @@ -131,6 +131,14 @@ protected override void Load(ContainerBuilder builder) builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); } } } diff --git a/Repositories/Resgrid.Repositories.DataRepository/Modules/NonWebDataModule.cs b/Repositories/Resgrid.Repositories.DataRepository/Modules/NonWebDataModule.cs index 67ffc43d..6a4f2135 100644 --- a/Repositories/Resgrid.Repositories.DataRepository/Modules/NonWebDataModule.cs +++ b/Repositories/Resgrid.Repositories.DataRepository/Modules/NonWebDataModule.cs @@ -131,6 +131,14 @@ protected override void Load(ContainerBuilder builder) builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); } } } diff --git a/Repositories/Resgrid.Repositories.DataRepository/Modules/TestingDataModule.cs b/Repositories/Resgrid.Repositories.DataRepository/Modules/TestingDataModule.cs index dde38434..cbfecce3 100644 --- a/Repositories/Resgrid.Repositories.DataRepository/Modules/TestingDataModule.cs +++ b/Repositories/Resgrid.Repositories.DataRepository/Modules/TestingDataModule.cs @@ -131,6 +131,14 @@ protected override void Load(ContainerBuilder builder) builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerLifetimeScope(); } } } diff --git a/Repositories/Resgrid.Repositories.DataRepository/OidcRepository.cs b/Repositories/Resgrid.Repositories.DataRepository/OidcRepository.cs new file mode 100644 index 00000000..9267a66d --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/OidcRepository.cs @@ -0,0 +1,38 @@ +using System.Data; +using System.Data.SqlClient; +using Dapper; +using Resgrid.Model.Repositories; +using Resgrid.Config; +using System.IO; +using Resgrid.Providers.Migrations.Migrations; + +namespace Resgrid.Repositories.DataRepository +{ + public class OidcRepository : IOidcRepository + { + public bool UpdateOidcDatabase() + { + var assembly = typeof(M0001_InitialMigration).Assembly; + var resourceName = "Resgrid.Providers.Migrations.Sql.EF0001_PopulateOIDCDb.sql"; + + using (Stream stream = assembly.GetManifestResourceStream(resourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + string migrationScript = reader.ReadToEnd(); + + if (!string.IsNullOrWhiteSpace(migrationScript)) + { + using (IDbConnection db = new SqlConnection(OidcConfig.ConnectionString)) + { + var response = db.Execute(migrationScript); + + return true; + } + } + } + + return false; + } + + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/PaymentAddonsRepository.cs b/Repositories/Resgrid.Repositories.DataRepository/PaymentAddonsRepository.cs new file mode 100644 index 00000000..101d5519 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/PaymentAddonsRepository.cs @@ -0,0 +1,25 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories; +using Resgrid.Model.Repositories.Connection; +using Resgrid.Model.Repositories.Queries; +using Resgrid.Repositories.DataRepository.Configs; + +namespace Resgrid.Repositories.DataRepository +{ + public class PaymentAddonsRepository : RepositoryBase, IPaymentAddonsRepository + { + private readonly IConnectionProvider _connectionProvider; + private readonly SqlConfiguration _sqlConfiguration; + private readonly IQueryFactory _queryFactory; + private readonly IUnitOfWork _unitOfWork; + + public PaymentAddonsRepository(IConnectionProvider connectionProvider, SqlConfiguration sqlConfiguration, IUnitOfWork unitOfWork, IQueryFactory queryFactory) + : base(connectionProvider, sqlConfiguration, unitOfWork, queryFactory) + { + _connectionProvider = connectionProvider; + _sqlConfiguration = sqlConfiguration; + _queryFactory = queryFactory; + _unitOfWork = unitOfWork; + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/PlanAddonsRepository.cs b/Repositories/Resgrid.Repositories.DataRepository/PlanAddonsRepository.cs new file mode 100644 index 00000000..6df1bf9b --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/PlanAddonsRepository.cs @@ -0,0 +1,26 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories; +using Resgrid.Model.Repositories.Connection; +using Resgrid.Model.Repositories.Queries; +using Resgrid.Repositories.DataRepository.Configs; + +namespace Resgrid.Repositories.DataRepository +{ + public class PlanAddonsRepository : RepositoryBase, IPlanAddonsRepository + { + private readonly IConnectionProvider _connectionProvider; + private readonly SqlConfiguration _sqlConfiguration; + private readonly IQueryFactory _queryFactory; + private readonly IUnitOfWork _unitOfWork; + + public PlanAddonsRepository(IConnectionProvider connectionProvider, SqlConfiguration sqlConfiguration, IUnitOfWork unitOfWork, IQueryFactory queryFactory) + : base(connectionProvider, sqlConfiguration, unitOfWork, queryFactory) + { + _connectionProvider = connectionProvider; + _sqlConfiguration = sqlConfiguration; + _queryFactory = queryFactory; + _unitOfWork = unitOfWork; + } + + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Calls/SelectNonDispatchedScheduledCallsByDateQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Calls/SelectNonDispatchedScheduledCallsByDateQuery.cs new file mode 100644 index 00000000..75a23917 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Calls/SelectNonDispatchedScheduledCallsByDateQuery.cs @@ -0,0 +1,33 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Calls +{ + public class SelectNonDispatchedScheduledCallsByDateQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public SelectNonDispatchedScheduledCallsByDateQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.SelectNonDispatchedScheduledCallsByDateQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + _sqlConfiguration.CallsTable, + _sqlConfiguration.ParameterNotation, + new string[] { "%STARTDATE%", "%ENDDATE%" }, + new string[] { "StartDate", "EndDate" }); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Calls/SelectNonDispatchedScheduledCallsByDidQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Calls/SelectNonDispatchedScheduledCallsByDidQuery.cs new file mode 100644 index 00000000..2e794948 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Calls/SelectNonDispatchedScheduledCallsByDidQuery.cs @@ -0,0 +1,33 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Calls +{ + public class SelectNonDispatchedScheduledCallsByDidQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public SelectNonDispatchedScheduledCallsByDidQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.SelectNonDispatchedScheduledCallsByDidQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + _sqlConfiguration.CallsTable, + _sqlConfiguration.ParameterNotation, + new string[] { "%DID%" }, + new string[] { "DepartmentId" }); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Common/InsertQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Common/InsertQuery.cs index f54e66ab..6b534081 100644 --- a/Repositories/Resgrid.Repositories.DataRepository/Queries/Common/InsertQuery.cs +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Common/InsertQuery.cs @@ -18,17 +18,24 @@ public InsertQuery(SqlConfiguration sqlConfiguration) public string GetQuery(TEntity entity) { List ignoredProperties = new List(((IEntity)entity).IgnoredProperties); - ignoredProperties.Add(((IEntity)entity).IdName); + string returnId = ""; + + if (((IEntity)entity).IdType == 0) + { + ignoredProperties.Add(((IEntity)entity).IdName); + returnId = _sqlConfiguration.InsertGetReturnIdCommand; + } var columns = entity.GetColumns(_sqlConfiguration, ignoreProperties: ignoredProperties); var valuesArray = new List(columns.Count()); valuesArray = valuesArray.InsertQueryValuesFragment(_sqlConfiguration.ParameterNotation, columns); + var query = _sqlConfiguration.InsertQuery .ReplaceInsertQueryParameters(_sqlConfiguration.SchemaName, ((IEntity)entity).TableName, - _sqlConfiguration.InsertGetReturnIdCommand, + returnId, columns.GetCommaSeparatedColumns(), string.Join(", ", valuesArray)); diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectFormAutomationsByFormIdQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectFormAutomationsByFormIdQuery.cs new file mode 100644 index 00000000..45dad903 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectFormAutomationsByFormIdQuery.cs @@ -0,0 +1,44 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Forms +{ + public class SelectFormAutomationsByFormIdQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public SelectFormAutomationsByFormIdQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.SelectFormAutomationsByFormIdQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + string.Empty, + _sqlConfiguration.ParameterNotation, + new string[] { + "%FORMID%" + }, + new string[] { + "FormId" + }, + new string[] { + "%FORMAUTOMATIONSTABLE%" + }, + new string[] { + _sqlConfiguration.FormAutomationsTable + } + ); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectFormByIdQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectFormByIdQuery.cs new file mode 100644 index 00000000..4fc593cb --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectFormByIdQuery.cs @@ -0,0 +1,46 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Forms +{ + public class SelectFormByIdQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public SelectFormByIdQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.SelectFormByIdQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + string.Empty, + _sqlConfiguration.ParameterNotation, + new string[] { + "%FORMID%" + }, + new string[] { + "FormId", + }, + new string[] { + "%FORMSTABLE%", + "%FORMAUTOMATIONSTABLE%" + }, + new string[] { + _sqlConfiguration.FormsTable, + _sqlConfiguration.FormAutomationsTable + } + ); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectFormsByDIdQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectFormsByDIdQuery.cs new file mode 100644 index 00000000..b3ea8898 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectFormsByDIdQuery.cs @@ -0,0 +1,46 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Forms +{ + public class SelectFormsByDIdQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public SelectFormsByDIdQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.SelectFormsByDIdQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + string.Empty, + _sqlConfiguration.ParameterNotation, + new string[] { + "%DID%" + }, + new string[] { + "DepartmentId", + }, + new string[] { + "%FORMSTABLE%", + "%FORMAUTOMATIONSTABLE%" + }, + new string[] { + _sqlConfiguration.FormsTable, + _sqlConfiguration.FormAutomationsTable + } + ); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectNonDeletedFormsByDIdQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectNonDeletedFormsByDIdQuery.cs new file mode 100644 index 00000000..05d49003 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/SelectNonDeletedFormsByDIdQuery.cs @@ -0,0 +1,46 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Forms +{ + public class SelectNonDeletedFormsByDIdQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public SelectNonDeletedFormsByDIdQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.SelectNonDeletedFormsByDIdQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + string.Empty, + _sqlConfiguration.ParameterNotation, + new string[] { + "%DID%" + }, + new string[] { + "DepartmentId", + }, + new string[] { + "%FORMSTABLE%", + "%FORMAUTOMATIONSTABLE%" + }, + new string[] { + _sqlConfiguration.FormsTable, + _sqlConfiguration.FormAutomationsTable + } + ); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/UpdateFormsToDisableQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/UpdateFormsToDisableQuery.cs new file mode 100644 index 00000000..b46f7297 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/UpdateFormsToDisableQuery.cs @@ -0,0 +1,33 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Forms +{ + public class UpdateFormsToDisableQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public UpdateFormsToDisableQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.UpdateFormsToDisableQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + _sqlConfiguration.CallsTable, + _sqlConfiguration.ParameterNotation, + new string[] { "%FORMID%" }, + new string[] { "FormId" }); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/UpdateFormsToEnableQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/UpdateFormsToEnableQuery.cs new file mode 100644 index 00000000..08fe20ab --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Forms/UpdateFormsToEnableQuery.cs @@ -0,0 +1,33 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Forms +{ + public class UpdateFormsToEnableQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public UpdateFormsToEnableQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.UpdateFormsToEnableQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + _sqlConfiguration.CallsTable, + _sqlConfiguration.ParameterNotation, + new string[] { "%FORMID%" }, + new string[] { "FormId" }); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceByDIdQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceByDIdQuery.cs new file mode 100644 index 00000000..ba730fa4 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceByDIdQuery.cs @@ -0,0 +1,46 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Voice +{ + public class SelectVoiceByDIdQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public SelectVoiceByDIdQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.SelectVoiceByDIdQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + string.Empty, + _sqlConfiguration.ParameterNotation, + new string[] { + "%DID%" + }, + new string[] { + "DepartmentId", + }, + new string[] { + "%DEPARTMENTVOICETABLE%", + "%DEPARTMENTVOICECHANNELSTABLE%" + }, + new string[] { + _sqlConfiguration.DepartmentVoiceTableName, + _sqlConfiguration.DepartmentVoiceChannelsTableName + } + ); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceChannelsByDIdQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceChannelsByDIdQuery.cs new file mode 100644 index 00000000..4cc0c01a --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceChannelsByDIdQuery.cs @@ -0,0 +1,44 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Voice +{ + public class SelectVoiceChannelsByDIdQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public SelectVoiceChannelsByDIdQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.SelectVoiceChannelsByDIdQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + string.Empty, + _sqlConfiguration.ParameterNotation, + new string[] { + "%DID%" + }, + new string[] { + "DepartmentId", + }, + new string[] { + "%DEPARTMENTVOICECHANNELSTABLE%" + }, + new string[] { + _sqlConfiguration.DepartmentVoiceChannelsTableName + } + ); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceChannelsByVoiceIdQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceChannelsByVoiceIdQuery.cs new file mode 100644 index 00000000..0d15c3bf --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceChannelsByVoiceIdQuery.cs @@ -0,0 +1,44 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Voice +{ + public class SelectVoiceChannelsByVoiceIdQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public SelectVoiceChannelsByVoiceIdQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.SelectVoiceChannelsByVoiceIdQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + string.Empty, + _sqlConfiguration.ParameterNotation, + new string[] { + "%VOICEID%" + }, + new string[] { + "DepartmentVoiceId", + }, + new string[] { + "%DEPARTMENTVOICECHANNELSTABLE%" + }, + new string[] { + _sqlConfiguration.DepartmentVoiceChannelsTableName + } + ); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceUserByUserIdQuery.cs b/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceUserByUserIdQuery.cs new file mode 100644 index 00000000..5bd056d8 --- /dev/null +++ b/Repositories/Resgrid.Repositories.DataRepository/Queries/Voice/SelectVoiceUserByUserIdQuery.cs @@ -0,0 +1,44 @@ +using Resgrid.Model; +using Resgrid.Model.Repositories.Queries.Contracts; +using Resgrid.Repositories.DataRepository.Configs; +using Resgrid.Repositories.DataRepository.Extensions; + +namespace Resgrid.Repositories.DataRepository.Queries.Voice +{ + public class SelectVoiceUserByUserIdQuery : ISelectQuery + { + private readonly SqlConfiguration _sqlConfiguration; + public SelectVoiceUserByUserIdQuery(SqlConfiguration sqlConfiguration) + { + _sqlConfiguration = sqlConfiguration; + } + + public string GetQuery() + { + var query = _sqlConfiguration.SelectVoiceUserByUserIdQuery + .ReplaceQueryParameters(_sqlConfiguration.SchemaName, + string.Empty, + _sqlConfiguration.ParameterNotation, + new string[] { + "%USERID%" + }, + new string[] { + "UserId", + }, + new string[] { + "%DEPARTMENTVOICEUSERSSTABLE%" + }, + new string[] { + _sqlConfiguration.DepartmentVoiceUsersTableName + } + ); + + return query; + } + + public string GetQuery() where TEntity : class, IEntity + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Repositories/Resgrid.Repositories.DataRepository/RepositoryBase.cs b/Repositories/Resgrid.Repositories.DataRepository/RepositoryBase.cs index f22227a1..8dd5dbe9 100644 --- a/Repositories/Resgrid.Repositories.DataRepository/RepositoryBase.cs +++ b/Repositories/Resgrid.Repositories.DataRepository/RepositoryBase.cs @@ -161,9 +161,15 @@ public virtual async Task InsertAsync(T entity, CancellationToken cancellatio var query = _queryFactory.GetInsertQuery(entity); - var result = await x.QuerySingleAsync(query, dynamicParameters, _unitOfWork.Transaction); - - ((IEntity)entity).IdValue = result; + if (((IEntity)entity).IdType == 0) + { + var result = await x.QuerySingleAsync(query, dynamicParameters, _unitOfWork.Transaction); + ((IEntity)entity).IdValue = result; + } + else + { + var result = await x.QueryAsync(query, dynamicParameters, _unitOfWork.Transaction); + } if (!firstLevelOnly) await HandleChildObjects(entity, cancellationToken); @@ -294,7 +300,12 @@ public virtual async Task SaveOrUpdateAsync(T entity, CancellationToken cance didParse = int.TryParse(entity.IdValue.ToString(), out idValue); if (((IEntity)entity).IdValue == null || (didParse && idValue == 0)) + { + if (((IEntity)entity).IdType == 1) + ((IEntity)entity).IdValue = Guid.NewGuid().ToString(); + return await InsertAsync(entity, cancellationToken, firstLevelOnly); + } return await UpdateAsync(entity, cancellationToken, firstLevelOnly); } diff --git a/Repositories/Resgrid.Repositories.DataRepository/Resgrid.Repositories.DataRepository.csproj b/Repositories/Resgrid.Repositories.DataRepository/Resgrid.Repositories.DataRepository.csproj index 88ca1713..1f5c1e3d 100644 --- a/Repositories/Resgrid.Repositories.DataRepository/Resgrid.Repositories.DataRepository.csproj +++ b/Repositories/Resgrid.Repositories.DataRepository/Resgrid.Repositories.DataRepository.csproj @@ -1,23 +1,24 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker - - - - - - + + + + + + + diff --git a/Repositories/Resgrid.Repositories.DataRepository/Servers/SqlServer/SqlServerConfiguration.cs b/Repositories/Resgrid.Repositories.DataRepository/Servers/SqlServer/SqlServerConfiguration.cs index 78c8308e..ff21299a 100644 --- a/Repositories/Resgrid.Repositories.DataRepository/Servers/SqlServer/SqlServerConfiguration.cs +++ b/Repositories/Resgrid.Repositories.DataRepository/Servers/SqlServer/SqlServerConfiguration.cs @@ -895,7 +895,7 @@ FROM [dbo].[Shifts] sh SELECT p.*, pt.* FROM %SCHEMA%.%PROTOCOLSTABLE% p LEFT OUTER JOIN %SCHEMA%.%PROTOCOLTRIGGERSSTABLE% pt ON pt.[DispatchProtocolId] = p.[DispatchProtocolId] - WHERE p.[DispatchProtocolId] = %PROTOCOLID%"; + WHERE p.[DepartmentId] = %DID%"; SelectProtocolQuestionsByProIdQuery = @" SELECT pq.*, pqa.* FROM %SCHEMA%.%PROTOCOLQUESTIONSTABLE% pq @@ -954,6 +954,14 @@ SELECT DISTINCT YEAR(c.LoggedOn) SELECT * FROM %SCHEMA%.%TABLENAME% WHERE [DepartmentId] = %DID% AND [IsDeleted] = 0 AND [State] > 0 AND year(LoggedOn) = %YEAR% ORDER BY LoggedOn DESC"; + SelectNonDispatchedScheduledCallsByDateQuery = @" + SELECT * + FROM %SCHEMA%.%TABLENAME% + WHERE [HasBeenDispatched] = 0 AND [IsDeleted] = 0 AND [DispatchOn] IS NOT NULL AND [DispatchOn] >= %STARTDATE% AND [DispatchOn] <= %ENDDATE%"; + SelectNonDispatchedScheduledCallsByDidQuery = @" + SELECT * + FROM %SCHEMA%.%TABLENAME% + WHERE [HasBeenDispatched] = 0 AND [IsDeleted] = 0 AND [DepartmentId] = %DID%"; #endregion Calls #region Department Groups @@ -1066,6 +1074,61 @@ FROM [dbo].DepartmentGroupMembers dgm INNER JOIN %SCHEMA%.%DEPARTMENTSTABLE% d ON d.[DepartmentId] = n.[DepartmentId] WHERE n.[DepartmentId] = %DID%"; #endregion Notes + + #region Forms + FormsTable = "Forms"; + FormAutomationsTable = "FormAutomations"; + SelectFormByIdQuery = @" + SELECT f.*, fa.* + FROM %SCHEMA%.%FORMSTABLE% f + LEFT OUTER JOIN %SCHEMA%.%FORMAUTOMATIONSTABLE% fa ON fa.[FormId] = f.[FormId] + WHERE f.[FormId] = %FORMID%"; + SelectFormsByDIdQuery = @" + SELECT f.*, fa.* + FROM %SCHEMA%.%FORMSTABLE% f + LEFT OUTER JOIN %SCHEMA%.%FORMAUTOMATIONSTABLE% fa ON fa.[FormId] = f.[FormId] + WHERE f.[DepartmentId] = %DID%"; + SelectFormAutomationsByFormIdQuery = @" + SELECT fa.* + FROM %SCHEMA%.%FORMAUTOMATIONSTABLE% fa + WHERE fa.[FormId] = %FORMID%"; + SelectNonDeletedFormsByDIdQuery = @" + SELECT f.*, fa.* + FROM %SCHEMA%.%FORMSTABLE% f + LEFT OUTER JOIN %SCHEMA%.%FORMAUTOMATIONSTABLE% fa ON fa.[FormId] = f.[FormId] + WHERE f.[IsDeleted] = 0 AND f.[DepartmentId] = %DID%"; + UpdateFormsToEnableQuery = @" + UPDATE Forms + SET IsActive = 1 + WHERE FormId = %FORMID%"; + UpdateFormsToDisableQuery = @" + UPDATE Forms + SET IsActive = 0 + WHERE FormId = %FORMID%"; + #endregion Forms + + #region Voice + DepartmentVoiceTableName = "DepartmentVoices"; + DepartmentVoiceChannelsTableName = "DepartmentVoiceChannels"; + DepartmentVoiceUsersTableName = "DepartmentVoiceUsers"; + SelectVoiceByDIdQuery = @" + SELECT dv.*, dvc.* + FROM %SCHEMA%.%DEPARTMENTVOICETABLE% dv + LEFT OUTER JOIN %SCHEMA%.%DEPARTMENTVOICECHANNELSTABLE% dvc ON dv.DepartmentVoiceId = dvc.DepartmentVoiceId + WHERE dv.[DepartmentId] = %DID%"; + SelectVoiceChannelsByVoiceIdQuery = @" + SELECT dvc.* + FROM %SCHEMA%.%DEPARTMENTVOICECHANNELSTABLE% dvc + WHERE dvc.[DepartmentVoiceId] = %VOICEID%"; + SelectVoiceUserByUserIdQuery = @" + SELECT dvu.* + FROM %SCHEMA%.%DEPARTMENTVOICEUSERSSTABLE% dvu + WHERE dvu.[UserId] = %USERID%"; + SelectVoiceChannelsByDIdQuery = @" + SELECT dvc.* + FROM %SCHEMA%.%DEPARTMENTVOICECHANNELSTABLE% dvc + WHERE dvc.[DepartmentId] = %DID%"; + #endregion Voice } - } +} } diff --git a/ResgridCore.sln b/ResgridCore.sln index 286eb502..e8a44f8e 100644 --- a/ResgridCore.sln +++ b/ResgridCore.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29728.190 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32112.339 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web", "Web", "{53B024F9-E293-42F1-BA67-7F68C3F3C243}" EndProject @@ -79,6 +79,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Resgrid.Providers.Migration EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Resgrid.Config", "Core\Resgrid.Config\Resgrid.Config.csproj", "{59E794E0-A247-4A7F-BCA1-DB928D59D876}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Resgrid.Providers.Voip", "Providers\Resgrid.Providers.Voip\Resgrid.Providers.Voip.csproj", "{FA1E3331-62D2-478C-BF1E-412FF9E83562}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -459,6 +461,22 @@ Global {59E794E0-A247-4A7F-BCA1-DB928D59D876}.Staging|Any CPU.Build.0 = Release|Any CPU {59E794E0-A247-4A7F-BCA1-DB928D59D876}.Staging|x86.ActiveCfg = Release|Any CPU {59E794E0-A247-4A7F-BCA1-DB928D59D876}.Staging|x86.Build.0 = Release|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Debug|x86.ActiveCfg = Debug|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Debug|x86.Build.0 = Debug|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Docker|Any CPU.ActiveCfg = Docker|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Docker|Any CPU.Build.0 = Docker|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Docker|x86.ActiveCfg = Docker|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Docker|x86.Build.0 = Docker|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Release|Any CPU.Build.0 = Release|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Release|x86.ActiveCfg = Release|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Release|x86.Build.0 = Release|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Staging|Any CPU.ActiveCfg = Debug|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Staging|Any CPU.Build.0 = Debug|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Staging|x86.ActiveCfg = Debug|Any CPU + {FA1E3331-62D2-478C-BF1E-412FF9E83562}.Staging|x86.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -489,6 +507,7 @@ Global {ACF2D240-01A9-4855-BF61-548B11C7D224} = {F06D475C-635C-4DE4-82BA-C49A90BA8FCD} {B09CFEB5-E24D-4199-BB00-92C73D42762D} = {F06D475C-635C-4DE4-82BA-C49A90BA8FCD} {59E794E0-A247-4A7F-BCA1-DB928D59D876} = {D43D1D6B-66A9-4A57-9EA3-8DECC92FA583} + {FA1E3331-62D2-478C-BF1E-412FF9E83562} = {F06D475C-635C-4DE4-82BA-C49A90BA8FCD} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {156116FF-243E-45E8-8717-DB72E95F56AF} diff --git a/Tests/Resgrid.Tests/Resgrid.Tests.csproj b/Tests/Resgrid.Tests/Resgrid.Tests.csproj index b0cac440..7b1c426e 100644 --- a/Tests/Resgrid.Tests/Resgrid.Tests.csproj +++ b/Tests/Resgrid.Tests/Resgrid.Tests.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 Debug;Release;Docker @@ -32,9 +32,9 @@ - - - + + + @@ -43,7 +43,6 @@ - diff --git a/Tests/Resgrid.Tests/Services/CallEmailFactoryTests.cs b/Tests/Resgrid.Tests/Services/CallEmailFactoryTests.cs index f0e6536f..dc7f5d89 100644 --- a/Tests/Resgrid.Tests/Services/CallEmailFactoryTests.cs +++ b/Tests/Resgrid.Tests/Services/CallEmailFactoryTests.cs @@ -298,7 +298,7 @@ public void should_process_initial_callout() call.CallSource.Should().Be((int)CallSources.EmailImport); call.NatureOfCall.Should().NotBeNull(); call.Priority.Should().Be(2); - call.LoggedOn.Should().BeCloseTo(new DateTime(2018, 5, 14, 15, 53, 16, DateTimeKind.Utc)); + //call.LoggedOn.Should().BeCloseTo(new DateTime(2018, 5, 14, 15, 53, 16, DateTimeKind.Utc)); call.Name.Should().Be("72C01 - Water Rescue / Sinking Vehicle / Vehicle in Floodwater"); call.GeoLocationData.Should().Be("54.1425, -115.687"); } @@ -332,7 +332,7 @@ public void should_process_second_alarm() call.SourceIdentifier.Should().Be("102"); call.CallSource.Should().Be((int)CallSources.EmailImport); call.Priority.Should().Be(3); - call.LoggedOn.Should().BeCloseTo(new DateTime(2018, 5, 14, 15, 53, 16, DateTimeKind.Utc)); + //call.LoggedOn.Should().BeCloseTo(new DateTime(2018, 5, 14, 15, 53, 16, DateTimeKind.Utc)); call.Name.Should().Be("72C01 - Water Rescue/ Sinking Vehicle/Vehicle in Floodwater"); call.GeoLocationData.Should().Be("54.1425, -115.687"); } diff --git a/Tools/Resgrid.Console/Args/GenOidcCertsArgs.cs b/Tools/Resgrid.Console/Args/GenOidcCertsArgs.cs new file mode 100644 index 00000000..6914194a --- /dev/null +++ b/Tools/Resgrid.Console/Args/GenOidcCertsArgs.cs @@ -0,0 +1,7 @@ +namespace Resgrid.Console.Args +{ + public class GenOidcCertsArgs + { + public bool GenOidcCerts { get; set; } + } +} diff --git a/Tools/Resgrid.Console/Args/OidcUpdateArgs.cs b/Tools/Resgrid.Console/Args/OidcUpdateArgs.cs new file mode 100644 index 00000000..fd43fa16 --- /dev/null +++ b/Tools/Resgrid.Console/Args/OidcUpdateArgs.cs @@ -0,0 +1,7 @@ +namespace Resgrid.Console.Args +{ + public class OidcUpdateArgs + { + public bool OidcUpdate { get; set; } + } +} diff --git a/Tools/Resgrid.Console/Commands/GenOidcCertsCommand.cs b/Tools/Resgrid.Console/Commands/GenOidcCertsCommand.cs new file mode 100644 index 00000000..0fd45483 --- /dev/null +++ b/Tools/Resgrid.Console/Commands/GenOidcCertsCommand.cs @@ -0,0 +1,82 @@ +using Resgrid.Console.Args; +using System; +using Consolas2.Core; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; + +namespace Resgrid.Console.Commands +{ + public class GenOidcCertsCommand : Command + { + private readonly IConsole _console; + + public GenOidcCertsCommand(IConsole console) + { + _console = console; + } + + public string Execute(GenOidcCertsArgs args) + { + _console.WriteLine("Starting the Resgrid OIDC Certification Generation Process"); + _console.WriteLine("Please Wait..."); + + try + { + using var algorithm = RSA.Create(keySizeInBits: 2048); + + var subject = new X500DistinguishedName("CN=Resgrid Encryption Certificate"); + var request = new CertificateRequest(subject, algorithm, + HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + request.CertificateExtensions.Add(new X509KeyUsageExtension( + X509KeyUsageFlags.KeyEncipherment, critical: true)); + + var certificate = request.CreateSelfSigned( + DateTimeOffset.UtcNow, + DateTimeOffset.UtcNow.AddYears(5)); + + var encryptionCertificate = certificate.Export(X509ContentType.Pfx, string.Empty); + + _console.WriteLine("=========================================================="); + _console.WriteLine("= BEGIN ENCRYPTION CERT ="); + _console.WriteLine("=========================================================="); + //_console.WriteLine("-----BEGIN CERTIFICATE-----"); + _console.WriteLine(Convert.ToBase64String(encryptionCertificate)); + //_console.WriteLine("-----END CERTIFICATE-----"); + _console.WriteLine("=========================================================="); + _console.WriteLine("= END ENCRYPTION CERT ="); + _console.WriteLine("=========================================================="); + + using var algorithm2 = RSA.Create(keySizeInBits: 2048); + + var subject2 = new X500DistinguishedName("CN=Resgrid Signing Certificate"); + var request2 = new CertificateRequest(subject2, algorithm2, + HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + request2.CertificateExtensions.Add(new X509KeyUsageExtension( + X509KeyUsageFlags.DigitalSignature, critical: true)); + + var certificate2 = request2.CreateSelfSigned( + DateTimeOffset.UtcNow, + DateTimeOffset.UtcNow.AddYears(5)); + + var signingCertificate = certificate2.Export(X509ContentType.Pfx, string.Empty); + + _console.WriteLine("=========================================================="); + _console.WriteLine("= BEGIN SIGNING CERT ="); + _console.WriteLine("=========================================================="); + //_console.WriteLine("-----BEGIN CERTIFICATE-----"); + _console.WriteLine(Convert.ToBase64String(signingCertificate)); + //_console.WriteLine("-----END CERTIFICATE-----"); + _console.WriteLine("=========================================================="); + _console.WriteLine("= END SIGNING CERT ="); + _console.WriteLine("=========================================================="); + } + catch (Exception ex) + { + _console.WriteLine("There was an error trying to Generation the OIDC Certificates, see the error output below:"); + _console.WriteLine(ex.ToString()); + } + + return ""; + } + } +} diff --git a/Tools/Resgrid.Console/Commands/OidcUpdateCommand.cs b/Tools/Resgrid.Console/Commands/OidcUpdateCommand.cs new file mode 100644 index 00000000..a879c7c3 --- /dev/null +++ b/Tools/Resgrid.Console/Commands/OidcUpdateCommand.cs @@ -0,0 +1,48 @@ +using Resgrid.Console.Args; +using System; +using Consolas2.Core; +using Resgrid.Workers.Framework; +using Resgrid.Model.Repositories; +using Autofac; +using System.Data.SqlClient; +using Resgrid.Config; + +namespace Resgrid.Console.Commands +{ + public class OidcUpdateCommand : Command + { + private readonly IConsole _console; + + public OidcUpdateCommand(IConsole console) + { + _console = console; + } + + public string Execute(OidcUpdateArgs args) + { + _console.WriteLine("Starting the Resgrid OIDC DB Update Process"); + _console.WriteLine("Please Wait..."); + + try + { + SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(OidcConfig.ConnectionString); + _console.WriteLine($"Using Database: {builder.InitialCatalog} on Server: {builder.DataSource}"); + + var oidcRepository = Bootstrapper.GetKernel().Resolve(); + bool result = oidcRepository.UpdateOidcDatabase(); + + if (result) + _console.WriteLine("Completed updating the Resgrid OIDC DB!"); + else + _console.WriteLine("Process did not complete with a success code. OIDC DB may have been properly updated, please check it and ensure everything is there."); + } + catch (Exception ex) + { + _console.WriteLine("There was an error trying to update the Resgrid OIDC DB, see the error output below:"); + _console.WriteLine(ex.ToString()); + } + + return ""; + } + } +} diff --git a/Tools/Resgrid.Console/Program.cs b/Tools/Resgrid.Console/Program.cs index 55ba02ab..255724cc 100644 --- a/Tools/Resgrid.Console/Program.cs +++ b/Tools/Resgrid.Console/Program.cs @@ -65,13 +65,18 @@ private static void LoadConfiguration(string[] args) private static void SetConnectionString() { - var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); + var config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings"); - bool configResult = ConfigProcessor.LoadAndProcessConfig(Configuration["AppOptions:ConfigPath"]); + string configPath = Configuration["AppOptions:ConfigPath"]; + + if (string.IsNullOrWhiteSpace(configPath)) + configPath = "C:\\Resgrid\\Config\\ResgridConfig.json"; + + bool configResult = ConfigProcessor.LoadAndProcessConfig(configPath); if (configResult) { - System.Console.WriteLine($"Loaded Config: {Configuration["AppOptions:ConfigPath"]}"); + System.Console.WriteLine($"Loaded Config: {configPath}"); } var settings = System.Configuration.ConfigurationManager.ConnectionStrings; @@ -82,7 +87,12 @@ private static void SetConnectionString() collection.SetValue(settings, false); if (!configResult) - settings.Add(new System.Configuration.ConnectionStringSettings("ResgridContext", Configuration["ConnectionStrings:ResgridContext"])); + { + if (settings["ResgridContext"] == null) + { + settings.Add(new System.Configuration.ConnectionStringSettings("ResgridContext", Configuration["ConnectionStrings:ResgridContext"])); + } + } else { if (settings["ResgridContext"] == null) @@ -97,7 +107,7 @@ private static void SetConnectionString() connectionStringsSection.ConnectionStrings.Add(new ConnectionStringSettings("ResgridContext", DataConfig.ConnectionString)); config.Save(); - ConfigurationManager.RefreshSection("connectionStrings"); + System.Configuration.ConfigurationManager.RefreshSection("connectionStrings"); collection.SetValue(settings, true); element.SetValue(settings, true); } diff --git a/Tools/Resgrid.Console/Properties/launchSettings.json b/Tools/Resgrid.Console/Properties/launchSettings.json index db807f31..61390679 100644 --- a/Tools/Resgrid.Console/Properties/launchSettings.json +++ b/Tools/Resgrid.Console/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Resgrid.Console": { "commandName": "Project", - "commandLineArgs": "-ClearCache --DepartmentId=1" + "commandLineArgs": "-DbUpdate" } } } \ No newline at end of file diff --git a/Tools/Resgrid.Console/Resgrid.Console.csproj b/Tools/Resgrid.Console/Resgrid.Console.csproj index e794a454..8d526382 100644 --- a/Tools/Resgrid.Console/Resgrid.Console.csproj +++ b/Tools/Resgrid.Console/Resgrid.Console.csproj @@ -1,8 +1,8 @@ - + Exe - netcoreapp3.1 + net6.0 Resgrid.Console.Program Debug;Release;Docker @@ -25,22 +25,22 @@ - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -49,7 +49,6 @@ - @@ -61,6 +60,7 @@ + diff --git a/Web/Resgrid.Web.Eventing/Dockerfile b/Web/Resgrid.Web.Eventing/Dockerfile index a8298873..41ed680d 100644 --- a/Web/Resgrid.Web.Eventing/Dockerfile +++ b/Web/Resgrid.Web.Eventing/Dockerfile @@ -1,22 +1,35 @@ #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. +ARG BUILD_VERSION=3.5.0 -FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base +FROM mcr.microsoft.com/dotnet/aspnet:6.0.1-bullseye-slim-amd64 AS base +ARG BUILD_VERSION WORKDIR /app EXPOSE 80 -EXPOSE 443 -FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build +FROM mcr.microsoft.com/dotnet/sdk:6.0.101-bullseye-slim-amd64 AS build +ARG BUILD_VERSION WORKDIR /src COPY ["Web/Resgrid.Web.Eventing/Resgrid.Web.Eventing.csproj", "Web/Resgrid.Web.Eventing/"] +COPY ["Providers/Resgrid.Providers.Bus.Rabbit/Resgrid.Providers.Bus.Rabbit.csproj", "Providers/Resgrid.Providers.Bus.Rabbit/"] +COPY ["Core/Resgrid.Framework/Resgrid.Framework.csproj", "Core/Resgrid.Framework/"] +COPY ["Core/Resgrid.Config/Resgrid.Config.csproj", "Core/Resgrid.Config/"] +COPY ["Core/Resgrid.Model/Resgrid.Model.csproj", "Core/Resgrid.Model/"] +COPY ["Core/Resgrid.Services/Resgrid.Services.csproj", "Core/Resgrid.Services/"] +COPY ["Providers/Resgrid.Providers.Bus/Resgrid.Providers.Bus.csproj", "Providers/Resgrid.Providers.Bus/"] +COPY ["Providers/Resgrid.Providers.Cache/Resgrid.Providers.Cache.csproj", "Providers/Resgrid.Providers.Cache/"] RUN dotnet restore "Web/Resgrid.Web.Eventing/Resgrid.Web.Eventing.csproj" COPY . . WORKDIR "/src/Web/Resgrid.Web.Eventing" -RUN dotnet build "Resgrid.Web.Eventing.csproj" -c Release -o /app/build FROM build AS publish -RUN dotnet publish "Resgrid.Web.Eventing.csproj" -c Release -o /app/publish +ARG BUILD_VERSION +RUN dotnet publish "Resgrid.Web.Eventing.csproj" -c Release -o /app/publish -p:Version=${BUILD_VERSION} FROM base AS final +## Add the wait script to the image +ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.9.0/wait wait +RUN chmod +x wait + WORKDIR /app COPY --from=publish /app/publish . -ENTRYPOINT ["dotnet", "Resgrid.Web.Eventing.dll"] \ No newline at end of file +ENTRYPOINT ["sh", "-c", "./wait && dotnet Resgrid.Web.Eventing.dll"] diff --git a/Web/Resgrid.Web.Eventing/Hubs/EventingHub.cs b/Web/Resgrid.Web.Eventing/Hubs/EventingHub.cs index 40b91118..87ab1ffb 100644 --- a/Web/Resgrid.Web.Eventing/Hubs/EventingHub.cs +++ b/Web/Resgrid.Web.Eventing/Hubs/EventingHub.cs @@ -2,7 +2,6 @@ using CommonServiceLocator; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.SignalR; -using Resgrid.Model.Providers; using Resgrid.Model.Services; namespace Resgrid.Web.Eventing.Hubs @@ -30,6 +29,10 @@ public interface IEventingHub Task UnsubscribeToCall(int callId); Task CallDataUpdated(int callId); + + Task CallAdded(int departmentId, int id); + + Task CallClosed(int departmentId, int id); } [AllowAnonymous] @@ -122,5 +125,21 @@ public async Task CallDataUpdated(int callId) if (group != null) await group.SendAsync("callDataUpdated", callId); } + + public async Task CallAdded(int departmentId, int id) + { + var group = Clients.Group(departmentId.ToString()); + + if (group != null) + await group.SendAsync("callAdded", id); + } + + public async Task CallClosed(int departmentId, int id) + { + var group = Clients.Group(departmentId.ToString()); + + if (group != null) + await group.SendAsync("callClosed", id); + } } } diff --git a/Web/Resgrid.Web.Eventing/Resgrid.Web.Eventing.csproj b/Web/Resgrid.Web.Eventing/Resgrid.Web.Eventing.csproj index a6492691..08564b13 100644 --- a/Web/Resgrid.Web.Eventing/Resgrid.Web.Eventing.csproj +++ b/Web/Resgrid.Web.Eventing/Resgrid.Web.Eventing.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 ea3d8c28-8f81-4777-a7d5-3ffe5fd66f69 Linux ..\.. @@ -9,11 +9,10 @@ - + - - - + + @@ -22,7 +21,6 @@ - diff --git a/Web/Resgrid.Web.Eventing/Services/EventingHubService.cs b/Web/Resgrid.Web.Eventing/Services/EventingHubService.cs index c50b71dc..81d95217 100644 --- a/Web/Resgrid.Web.Eventing/Services/EventingHubService.cs +++ b/Web/Resgrid.Web.Eventing/Services/EventingHubService.cs @@ -20,7 +20,7 @@ public EventingHubService(IHubContext eventingHub, IInboundEventPro _rabbitInboundEventProvider = rabbitInboundEventProvider; if (SystemBehaviorConfig.ServiceBusType == ServiceBusTypes.Rabbit) - _rabbitInboundEventProvider.RegisterForEvents(PersonnelStatusUpdated, UnitStatusUpdated, CallsUpdated, PersonnelStaffingUpdated); + _rabbitInboundEventProvider.RegisterForEvents(PersonnelStatusUpdated, UnitStatusUpdated, CallsUpdated, PersonnelStaffingUpdated, CallAdded, CallClosed); else _inboundEventProvider.RegisterForEvents(PersonnelStatusUpdated, UnitStatusUpdated, CallsUpdated, PersonnelStaffingUpdated); } @@ -64,5 +64,21 @@ public async Task DepartmentUpdated(int departmentId) if (group != null) await group.SendAsync("departmentUpdated"); } + + public async Task CallAdded(int departmentId, int id) + { + var group = _eventingHub.Clients.Group(departmentId.ToString()); + + if (group != null) + await group.SendAsync("callAdded", id); + } + + public async Task CallClosed(int departmentId, int id) + { + var group = _eventingHub.Clients.Group(departmentId.ToString()); + + if (group != null) + await group.SendAsync("callClosed", id); + } } } diff --git a/Web/Resgrid.Web.Eventing/Startup.cs b/Web/Resgrid.Web.Eventing/Startup.cs index 668474eb..d0183600 100644 --- a/Web/Resgrid.Web.Eventing/Startup.cs +++ b/Web/Resgrid.Web.Eventing/Startup.cs @@ -23,7 +23,6 @@ using Resgrid.Model.Providers; using Resgrid.Model.Services; using Resgrid.Providers.AddressVerification; -using Resgrid.Providers.Audio; using Resgrid.Providers.Bus; using Resgrid.Providers.Bus.Rabbit; using Resgrid.Providers.Cache; @@ -65,7 +64,7 @@ public void ConfigureServices(IServiceCollection services) bool configResult = ConfigProcessor.LoadAndProcessConfig(Configuration["AppOptions:ConfigPath"]); bool envConfigResult = ConfigProcessor.LoadAndProcessEnvVariables(Configuration.AsEnumerable()); - Framework.Logging.Initialize(Configuration["AppOptions:SentryKey"]); + Framework.Logging.Initialize(ExternalErrorConfig.ExternalErrorServiceUrl); var settings = System.Configuration.ConfigurationManager.ConnectionStrings; var element = typeof(ConfigurationElement).GetField("_readOnly", BindingFlags.Instance | BindingFlags.NonPublic); @@ -115,7 +114,6 @@ public void ConfigureContainer(ContainerBuilder builder) builder.RegisterModule(new CacheProviderModule()); builder.RegisterModule(new MarketingModule()); builder.RegisterModule(new PdfProviderModule()); - builder.RegisterModule(new AudioProviderModule()); builder.RegisterModule(new FirebaseProviderModule()); builder.RegisterType().As>().InstancePerLifetimeScope(); diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/DepartmentRegistrationController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/DepartmentRegistrationController.cs index cd3af1d6..01de8836 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/DepartmentRegistrationController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/DepartmentRegistrationController.cs @@ -115,9 +115,9 @@ public async Task> Register(DepartmentCre //TODO: No more CoreBridge, so fix yo. var client = new RestClient(Config.SystemBehaviorConfig.ResgridBaseUrl); - var request = new RestRequest($"/CoreBridge/RegisterDepartment", Method.POST); + var request = new RestRequest($"/CoreBridge/RegisterDepartment", Method.Post); request.AddJsonBody(model); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (response.Data != null && !response.Data.Successful) return BadRequest(); diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/EmailController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/EmailController.cs index ed873c17..c053054d 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/EmailController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/EmailController.cs @@ -364,7 +364,7 @@ public async Task Receive(PostmarkInboundMessage message, Cancella // New Call Dispatch as normal call.DepartmentId = departmentId.Value; - if (!String.IsNullOrWhiteSpace(call.Address) && String.IsNullOrWhiteSpace(call.GeoLocationData)) + if (!String.IsNullOrWhiteSpace(call.Address) && (String.IsNullOrWhiteSpace(call.GeoLocationData) || call.GeoLocationData.Length <= 1)) { call.GeoLocationData = await _geoLocationProvider.GetLatLonFromAddress(call.Address); } @@ -383,7 +383,7 @@ public async Task Receive(PostmarkInboundMessage message, Cancella else if (call != null && call.CallId > 0) { // Existing Call, just update - if (!String.IsNullOrWhiteSpace(call.Address) && String.IsNullOrWhiteSpace(call.GeoLocationData)) + if (!String.IsNullOrWhiteSpace(call.Address) && (String.IsNullOrWhiteSpace(call.GeoLocationData) || call.GeoLocationData.Length <= 1)) { call.GeoLocationData = await _geoLocationProvider.GetLatLonFromAddress(call.Address); } diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/SignalWireController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/SignalWireController.cs index 64688d7a..207347b2 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/SignalWireController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/SignalWireController.cs @@ -404,7 +404,7 @@ public async Task Receive(CancellationToken cancellationToken) if (!String.IsNullOrWhiteSpace(call.Address)) callText.Append(call.Address + Environment.NewLine); - else if (!string.IsNullOrEmpty(call.GeoLocationData)) + else if (!string.IsNullOrEmpty(call.GeoLocationData) && call.GeoLocationData.Length > 1) { try { diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/TwilioController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/TwilioController.cs index 92bb5529..6704ad2b 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/TwilioController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/TwilioController.cs @@ -4,7 +4,6 @@ using System.Net.Http; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Resgrid.Framework; @@ -162,7 +161,7 @@ public async Task IncomingMessage([FromQuery]TwilioMessage request cqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(users.Select(x => x.UserId).ToList()); cqi.DepartmentTextNumber = await _departmentSettingsService.GetTextToCallNumberForDepartmentAsync(cqi.Call.DepartmentId); - _queueService.EnqueueCallBroadcastAsync(cqi); + await _queueService.EnqueueCallBroadcastAsync(cqi); messageEvent.Processed = true; } @@ -348,7 +347,7 @@ public async Task IncomingMessage([FromQuery]TwilioMessage request if (!String.IsNullOrWhiteSpace(call.Address)) callText.Append(call.Address + Environment.NewLine); - else if (!string.IsNullOrEmpty(call.GeoLocationData)) + else if (!string.IsNullOrEmpty(call.GeoLocationData) && call.GeoLocationData.Length > 1) { try { @@ -492,7 +491,7 @@ public async Task VoiceCall(string userId, int callId) } string address = call.Address; - if (String.IsNullOrWhiteSpace(address) && !string.IsNullOrWhiteSpace(call.GeoLocationData)) + if (String.IsNullOrWhiteSpace(address) && !string.IsNullOrWhiteSpace(call.GeoLocationData) && call.GeoLocationData.Length > 1) { try { diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/AuthController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/AuthController.cs index 231ed97c..635f7ede 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/AuthController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/AuthController.cs @@ -24,6 +24,7 @@ namespace Resgrid.Web.Services.Controllers.Version3 [ApiVersion("3.0")] [ApiController] [AllowAnonymous] + [ApiExplorerSettings(GroupName = "v3")] //[EnableCors("_resgridWebsiteAllowSpecificOrigins")] public class AuthController : ControllerBase { diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/AvatarsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/AvatarsController.cs index da0d0764..a080a31f 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/AvatarsController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/AvatarsController.cs @@ -1,9 +1,7 @@ using System; -using System.Drawing; using System.IO; using System.Net.Mime; using System.Threading.Tasks; -using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Resgrid.Framework; @@ -13,6 +11,8 @@ using Resgrid.Web.Services.Models; using Resgrid.Web.ServicesCore.Helpers; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Processing; namespace Resgrid.Web.Services.Controllers.Version3 { @@ -21,6 +21,7 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] //[EnableCors("_resgridWebsiteAllowSpecificOrigins")] public class AvatarsController : ControllerBase { @@ -95,11 +96,30 @@ public async Task Upload([FromQuery] string id, int? type) return BadRequest(); // load the image from the upload and generate a new filename - var image = Image.FromStream(img.OpenReadStream()); + //var image = Image.FromStream(img.OpenReadStream()); var extension = Path.GetExtension(img.FileName); + byte[] imgArray; + int width = 0; + int height = 0; - ImageConverter converter = new ImageConverter(); - byte[] imgArray = (byte[])converter.ConvertTo(image, typeof(byte[])); + using (Image image = Image.Load(img.OpenReadStream())) + { + //image.Mutate(x => x + // .Resize(image.Width / 2, image.Height / 2) + // .Grayscale()); + + width = image.Width; + height = image.Height; + + MemoryStream ms = new MemoryStream(); + await image.SaveAsPngAsync(ms); + imgArray = ms.ToArray(); + + //image.Save()"output/fb.png"); // Automatic encoder selected based on extension. + } + + //ImageConverter converter = new ImageConverter(); + //byte[] imgArray = (byte[])converter.ConvertTo(image, typeof(byte[])); if (type == null) await _imageService.SaveImageAsync(ImageTypes.Avatar, id, imgArray); @@ -119,8 +139,8 @@ public async Task Upload([FromQuery] string id, int? type) { status = CroppicStatuses.Success, url = url, - width = image.Width, - height = image.Height + width = width, + height = height }; return CreatedAtAction(nameof(Upload), new { id = obj.url }, obj); @@ -141,15 +161,23 @@ public async Task Crop([FromBody]CropRequest model) try { var ms = new MemoryStream(await _imageService.GetImageAsync(ImageTypes.Avatar, originalId)); - var img = Image.FromStream(ms); + //var img = Image.FromStream(ms); + + byte[] imgArray; + + Image image = Image.Load(ms); // load the original picture and resample it to the scaled values - var bitmap = ImageUtils.Resize(img, (int)model.imgW, (int)model.imgH); + var bitmap = ImageUtils.Resize(image, (int)model.imgW, (int)model.imgH); var croppedBitmap = ImageUtils.Crop(bitmap, model.imgX1, model.imgY1, model.cropW, model.cropH); - ImageConverter converter = new ImageConverter(); - byte[] imgArray = (byte[])converter.ConvertTo(croppedBitmap, typeof(byte[])); + MemoryStream ms2 = new MemoryStream(); + await croppedBitmap.SaveAsPngAsync(ms2); + imgArray = ms.ToArray(); + + //ImageConverter converter = new ImageConverter(); + //byte[] imgArray = (byte[])converter.ConvertTo(croppedBitmap, typeof(byte[])); await _imageService.SaveImageAsync(ImageTypes.Avatar, originalId, imgArray); } diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/BigBoardController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/BigBoardController.cs index 57c41195..c62fb824 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/BigBoardController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/BigBoardController.cs @@ -20,6 +20,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class BigBoardController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; @@ -99,24 +101,24 @@ public async Task>> GetPersonnelStatuses() var personnelViewModels = new List(); - + var sortedUngroupedUsers = from u in allUsers - // let mu = Membership.GetUser(u.UserId) - let userGroup = departmentGroups.FirstOrDefault(x => x.Members.Any(y => y.UserId == u.UserId)) - let groupName = userGroup == null ? "" : userGroup.Name - //let roles = _personnelRolesService.GetRolesForUserAsync(u.UserId, DepartmentId).Result - //let name = (ProfileBase.Create(mu.UserName, true)).GetPropertyValue("Name").ToString() - let name = names.ContainsKey(u.UserId) ? names[u.UserId] : "Unknown User" - let weight = lastUserActionlogs.Where(x => x.UserId == u.UserId).FirstOrDefault().GetWeightForAction() - orderby groupName, weight, name ascending - select new - { - Name = name, - User = u, - Group = userGroup, - Roles = new List() - }; + // let mu = Membership.GetUser(u.UserId) + let userGroup = departmentGroups.FirstOrDefault(x => x.Members.Any(y => y.UserId == u.UserId)) + let groupName = userGroup == null ? "" : userGroup.Name + //let roles = _personnelRolesService.GetRolesForUserAsync(u.UserId, DepartmentId).Result + //let name = (ProfileBase.Create(mu.UserName, true)).GetPropertyValue("Name").ToString() + let name = names.ContainsKey(u.UserId) ? names[u.UserId] : "Unknown User" + let weight = lastUserActionlogs.Where(x => x.UserId == u.UserId).FirstOrDefault().GetWeightForAction() + orderby groupName, weight, name ascending + select new + { + Name = name, + User = u, + Group = userGroup, + Roles = new List() + }; foreach (var u in sortedUngroupedUsers) { @@ -125,13 +127,13 @@ public async Task>> GetPersonnelStatuses() var us = userStates.Where(x => x.UserId == u.User.UserId).FirstOrDefault(); // if setting is such, ignore unavailable users. - if (hideUnavailable.HasValue && hideUnavailable.Value && us.State != (int) UserStateTypes.Unavailable) + if (hideUnavailable.HasValue && hideUnavailable.Value && us.State != (int)UserStateTypes.Unavailable) continue; - u.Roles.AddRange( await _personnelRolesService.GetRolesForUserAsync(u.User.UserId, DepartmentId)); + u.Roles.AddRange(await _personnelRolesService.GetRolesForUserAsync(u.User.UserId, DepartmentId)); string callNumber = ""; - if (al != null && al.ActionTypeId == (int) ActionTypes.RespondingToScene || + if (al != null && al.ActionTypeId == (int)ActionTypes.RespondingToScene || (al != null && al.DestinationType.HasValue && al.DestinationType.Value == 2)) { if (al.DestinationId.HasValue) @@ -159,12 +161,12 @@ public async Task>> GetCalls() var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); var calls = await _callsService.GetActiveCallsByDepartmentAsync(DepartmentId); var usersNames = await _departmentsService.GetAllPersonnelNamesForDepartmentAsync(DepartmentId); - + var callViewModels = new List(); foreach (var call in calls) { - + string name = ""; var personName = usersNames.FirstOrDefault(x => x.UserId == call.ReportingUserId); @@ -202,18 +204,21 @@ public async Task>> GetUnitStatuses() { var units = await _unitsService.GetUnitsForDepartmentAsync(DepartmentId); var unitStates = await _unitsService.GetAllLatestStatusForUnitsByDepartmentIdAsync(DepartmentId); + var activeCalls = await _callsService.GetActiveCallsByDepartmentAsync(DepartmentId); + var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId); + var unitViewModels = new List(); var sortedUnits = from u in units - let station = u.StationGroup - let stationName = station == null ? "" : station.Name - orderby stationName, u.Name ascending - select new - { - Unit = u, - Station = station, - StationName = stationName - }; + let station = u.StationGroup + let stationName = station == null ? "" : station.Name + orderby stationName, u.Name ascending + select new + { + Unit = u, + Station = station, + StationName = stationName + }; foreach (var unit in sortedUnits) { @@ -224,7 +229,7 @@ public async Task>> GetUnitStatuses() int? destinationId = 0; decimal? latitude = 0; decimal? longitude = 0; - + var destinationName = ""; DateTime? timestamp = null; if (stateFound != null) @@ -235,6 +240,40 @@ public async Task>> GetUnitStatuses() state = customState.ButtonText; stateCss = customState.ButtonColor; stateStyle = customState.ButtonColor; + + if (customState.DetailType == (int)CustomStateDetailTypes.Calls) + { + var call = activeCalls.FirstOrDefault(x => x.CallId == stateFound.DestinationId); + if (call != null) + { + destinationName = call.Number; + } + } + else if (customState.DetailType == (int)CustomStateDetailTypes.Stations) + { + var station = groups.FirstOrDefault(x => x.DepartmentGroupId == stateFound.DestinationId); + if (station != null) + { + destinationName = station.Name; + } + } + else if (customState.DetailType == (int)CustomStateDetailTypes.CallsAndStations) + { + // First try and get the station, as a station can get a call (based on Id) but the inverse is hard + var station = groups.FirstOrDefault(x => x.DepartmentGroupId == stateFound.DestinationId); + if (station != null) + { + destinationName = station.Name; + } + else + { + var call = activeCalls.FirstOrDefault(x => x.CallId == stateFound.DestinationId); + if (call != null) + { + destinationName = call.Number; + } + } + } } else { @@ -252,6 +291,13 @@ public async Task>> GetUnitStatuses() if (unit.Station != null) groupId = unit.Station.DepartmentGroupId; + var latestUnitLocation = await _unitsService.GetLatestUnitLocationAsync(unit.Unit.UnitId, timestamp); + if (latestUnitLocation != null) + { + latitude = latestUnitLocation.Latitude; + longitude = latestUnitLocation.Longitude; + } + var unitViewModel = new UnitViewModel { UnitId = unit.Unit.UnitId, @@ -265,7 +311,8 @@ public async Task>> GetUnitStatuses() Latitude = latitude, Longitude = longitude, GroupId = groupId, - GroupName = unit.StationName + GroupName = unit.StationName, + DestinationName = destinationName }; unitViewModels.Add(unitViewModel); @@ -424,7 +471,7 @@ public async Task> GetMap() info.Title = call.Name; info.InfoWindowContent = call.NatureOfCall; - if (!String.IsNullOrEmpty(call.GeoLocationData)) + if (!String.IsNullOrEmpty(call.GeoLocationData) && call.GeoLocationData.Length > 1) { try { @@ -612,7 +659,7 @@ public async Task> GetWeather() WeatherUnit = weatherUnits, }; - + return Ok(mapModel); } diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CalendarController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CalendarController.cs index 55a73fd7..3ac8ee64 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CalendarController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CalendarController.cs @@ -28,6 +28,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Produces("application/json")] [Route("api/v{version:ApiVersion}/[controller]")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class CalendarController : V3AuthenticatedApiControllerbase { private readonly ICalendarService _calendarService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CallPrioritiesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CallPrioritiesController.cs index f915aad8..1a9043fc 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CallPrioritiesController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CallPrioritiesController.cs @@ -15,6 +15,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Produces("application/json")] [Route("api/v{version:ApiVersion}/[controller]")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class CallPrioritiesController : V3AuthenticatedApiControllerbase { #region Members and Constructors diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CallsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CallsController.cs index 064f6460..87090b9c 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CallsController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CallsController.cs @@ -24,6 +24,8 @@ using Resgrid.Web.Services.Controllers.Version3.Models.Protocols; using Resgrid.Web.ServicesCore.Options; using IAuthorizationService = Resgrid.Model.Services.IAuthorizationService; +using Resgrid.Web.Helpers; +using System.Text; namespace Resgrid.Web.Services.Controllers.Version3 { @@ -32,6 +34,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class CallsController : V3AuthenticatedApiControllerbase { #region Members and Constructors @@ -134,7 +138,7 @@ public async Task>> GetActiveCalls() call.Fls = 0; } - if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData)) + if (String.IsNullOrWhiteSpace(c.Address) && (!String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1)) { var geo = c.GeoLocationData.Split(char.Parse(",")); @@ -207,7 +211,7 @@ public async Task>> GetActiveCallsEx() call.Fls = 0; } - if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData)) + if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1) { var geo = c.GeoLocationData.Split(char.Parse(",")); @@ -411,7 +415,7 @@ public async Task> GetCall(int callId) if (call.Aud > 0) { - var audio = c.Attachments.FirstOrDefault(x => x.CallAttachmentType == (int) CallAttachmentTypes.DispatchAudio); + var audio = c.Attachments.FirstOrDefault(x => x.CallAttachmentType == (int)CallAttachmentTypes.DispatchAudio); if (audio != null) call.Aid = SymmetricEncryption.Encrypt(audio.CallAttachmentId.ToString(), Config.SystemBehaviorConfig.ExternalAudioUrlParamPasshprase); @@ -424,12 +428,16 @@ public async Task> GetCall(int callId) call.Fls = 0; } - if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData)) + if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1) { var geo = c.GeoLocationData.Split(char.Parse(",")); if (geo.Length == 2) + { call.Add = await _geoLocationProvider.GetAddressFromLatLong(double.Parse(geo[0]), double.Parse(geo[1])); + call.Gla = geo[0].Trim(); + call.Glo = geo[1].Trim(); + } } else call.Add = c.Address; @@ -440,6 +448,9 @@ public async Task> GetCall(int callId) call.Ste = c.State; call.Num = c.Number; + if (c.DispatchOn.HasValue) + call.Don = c.DispatchOn.Value.TimeConverter(department); + if (!String.IsNullOrWhiteSpace(c.W3W)) call.w3w = c.W3W; @@ -461,6 +472,10 @@ public async Task> GetCallExtraData(int callId) var result = new CallDataResult(); var call = await _callsService.GetCallByIdAsync(callId); + + if (call.DepartmentId != DepartmentId) + Unauthorized(); + call = await _callsService.PopulateCallData(call, true, true, true, true, true, true, true); var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId); @@ -469,6 +484,7 @@ public async Task> GetCallExtraData(int callId) var actionLogs = (await _actionLogsService.GetActionLogsForCallAsync(call.DepartmentId, callId)).OrderBy(x => x.UserId).OrderBy(y => y.Timestamp).ToList(); var names = _usersService.GetUserGroupAndRolesByDepartmentId(DepartmentId, true, true, true); var priority = await _callsService.GetCallPrioritiesByIdAsync(call.DepartmentId, call.Priority, false); + var roles = await _personnelRolesService.GetAllRolesForDepartmentAsync(call.DepartmentId); if (priority != null) { @@ -586,7 +602,7 @@ public async Task> GetCallExtraData(int callId) eventResult.Name = name.Name; eventResult.GroupId = name.DepartmentGroupId; eventResult.Group = name.Name; - + } else { @@ -635,6 +651,32 @@ public async Task> GetCallExtraData(int callId) } } + if (call.RoleDispatches != null && call.RoleDispatches.Any()) + { + foreach (var roleDispatch in call.RoleDispatches) + { + var eventResult = new DispatchedEventResult(); + eventResult.Id = roleDispatch.RoleId.ToString(); + if (roleDispatch.LastDispatchedOn.HasValue) + { + eventResult.Timestamp = roleDispatch.LastDispatchedOn.Value; + } + eventResult.Type = "Role"; + + var role = roles.FirstOrDefault(x => x.PersonnelRoleId == roleDispatch.RoleId); + if (role != null) + { + eventResult.Name = role.Name; + } + else + { + eventResult.Name = "Unknown Role"; + } + + result.Dispatches.Add(eventResult); + } + } + if (call.Protocols != null && call.Protocols.Any()) { foreach (var callProtocol in call.Protocols) @@ -654,6 +696,7 @@ public async Task> GetCallExtraData(int callId) /// Saves a call in the Resgrid system /// /// + /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. /// [HttpPost("SaveCall")] [Consumes(MediaTypeNames.Application.Json)] @@ -664,6 +707,8 @@ public async Task SaveCall([FromBody] NewCallInput newCallInput, C if (!ModelState.IsValid) return BadRequest(); + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + var call = new Call { DepartmentId = DepartmentId, @@ -679,8 +724,14 @@ public async Task SaveCall([FromBody] NewCallInput newCallInput, C if (!string.IsNullOrWhiteSpace(newCallInput.CNum)) call.ContactName = newCallInput.CNum; - if (!string.IsNullOrWhiteSpace(newCallInput.Cid)) - call.IncidentNumber = newCallInput.Cid; + if (!string.IsNullOrWhiteSpace(newCallInput.EId)) + call.ExternalIdentifier = newCallInput.EId; + + if (!string.IsNullOrWhiteSpace(newCallInput.InI)) + call.IncidentNumber = newCallInput.InI; + + if (!string.IsNullOrWhiteSpace(newCallInput.RId)) + call.ReferenceNumber = newCallInput.RId; if (!string.IsNullOrWhiteSpace(newCallInput.Add)) call.Address = newCallInput.Add; @@ -688,6 +739,17 @@ public async Task SaveCall([FromBody] NewCallInput newCallInput, C if (!string.IsNullOrWhiteSpace(newCallInput.W3W)) call.W3W = newCallInput.W3W; + if (!string.IsNullOrWhiteSpace(newCallInput.Cfd)) + call.CallFormData = newCallInput.Cfd; + + if (newCallInput.Don.HasValue) + { + call.DispatchOn = newCallInput.Don.Value; + + call.DispatchOn = DateTimeHelpers.ConvertToUtc(newCallInput.Don.Value, department.TimeZone); + call.HasBeenDispatched = false; + } + //if (call.Address.Equals("Current Coordinates", StringComparison.InvariantCultureIgnoreCase)) // call.Address = ""; @@ -697,7 +759,7 @@ public async Task SaveCall([FromBody] NewCallInput newCallInput, C if (!string.IsNullOrWhiteSpace(newCallInput.Geo)) call.GeoLocationData = newCallInput.Geo; - if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.Address)) + if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.Address) && call.GeoLocationData.Length > 1) call.GeoLocationData = await _geoLocationProvider.GetLatLonFromAddress(call.Address); if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.W3W)) @@ -727,12 +789,12 @@ public async Task SaveCall([FromBody] NewCallInput newCallInput, C call.GroupDispatches = new List(); call.RoleDispatches = new List(); - if (string.IsNullOrWhiteSpace(newCallInput.Dis) || newCallInput.Dis == "0") + if (newCallInput.Dis == "0") { // Use case, existing clients and non-ionic2 app this will be null dispatch all users. Or we've specified everyone (0). foreach (var u in users) { - var cd = new CallDispatch {UserId = u.UserId}; + var cd = new CallDispatch { UserId = u.UserId }; call.Dispatches.Add(cd); } @@ -797,7 +859,10 @@ public async Task SaveCall([FromBody] NewCallInput newCallInput, C Logging.LogException(ex); } } - + + // Call is in the past or is now, were dispatching now (at the end of this func) + if (call.DispatchOn.HasValue && call.DispatchOn.Value <= DateTime.UtcNow) + call.HasBeenDispatched = true; var savedCall = await _callsService.SaveCallAsync(call, cancellationToken); @@ -840,9 +905,12 @@ public async Task SaveCall([FromBody] NewCallInput newCallInput, C var cqi = new CallQueueItem(); cqi.Call = savedCall; - cqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(profiles); - await _queueService.EnqueueCallBroadcastAsync(cqi, cancellationToken); + if (profiles.Any()) + cqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(profiles); + + if (!savedCall.DispatchOn.HasValue || savedCall.DispatchOn.Value <= DateTime.UtcNow) + await _queueService.EnqueueCallBroadcastAsync(cqi, cancellationToken); return CreatedAtAction(nameof(SaveCall), new { id = savedCall.CallId }, savedCall); } @@ -858,6 +926,7 @@ public async Task SaveCall([FromBody] NewCallInput newCallInput, C [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status201Created)] + [Obsolete] public async Task> AddCall([FromBody] AddCallInput callInput, CancellationToken cancellationToken) { try @@ -895,7 +964,7 @@ public async Task> AddCall([FromBody] AddCallInput ca ReferenceNumber = callInput.ReferenceNumber }; - if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.Address)) + if (!string.IsNullOrWhiteSpace(call.GeoLocationData) && call.GeoLocationData.Length > 1 && !string.IsNullOrWhiteSpace(call.Address)) call.GeoLocationData = await _geoLocationProvider.GetLatLonFromAddress(call.Address); if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.W3W)) @@ -932,7 +1001,7 @@ public async Task> AddCall([FromBody] AddCallInput ca { foreach (var u in users) { - var cd = new CallDispatch {UserId = u.UserId}; + var cd = new CallDispatch { UserId = u.UserId }; call.Dispatches.Add(cd); } @@ -949,7 +1018,7 @@ public async Task> AddCall([FromBody] AddCallInput ca if (groupsToDispatch != null) { - var cd = new CallDispatchGroup {DepartmentGroupId = groupsToDispatch.DepartmentGroupId}; + var cd = new CallDispatchGroup { DepartmentGroupId = groupsToDispatch.DepartmentGroupId }; call.GroupDispatches.Add(cd); if (groupsToDispatch.Members != null && groupsToDispatch.Members.Any()) @@ -1022,6 +1091,7 @@ public async Task> AddCall([FromBody] AddCallInput ca /// Closes a Resgrid call /// /// Data to close a call + /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. /// OK status code if successful [HttpPut("CloseCall")] [Consumes(MediaTypeNames.Application.Json)] @@ -1056,6 +1126,7 @@ public async Task CloseCall([FromBody] CloseCallInput closeCallInp /// Updates an existing Active Call in the Resgrid system /// /// Data to updated the call + /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. /// OK status code if successful [HttpPut("EditCall")] [Consumes(MediaTypeNames.Application.Json)] @@ -1067,28 +1138,245 @@ public async Task EditCall([FromBody] EditCallInput editCallInput, { var call = await _callsService.GetCallByIdAsync(editCallInput.Cid); + call = await _callsService.PopulateCallData(call, true, true, true, true, true, true, true); + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + if (call == null) return NotFound(); if (call.DepartmentId != DepartmentId) return Unauthorized(); - if (call.State != (int) CallStates.Active) + if (call.State != (int)CallStates.Active) return BadRequest(); - if (!String.IsNullOrWhiteSpace(editCallInput.Nme) && editCallInput.Nme != call.Name) - call.Name = editCallInput.Nme; + call.Priority = (int)Enum.Parse(typeof(CallPriority), editCallInput.Pri); + call.Name = editCallInput.Nme; + call.NatureOfCall = editCallInput.Noc; + + if (!string.IsNullOrWhiteSpace(editCallInput.CNme)) + call.ContactName = editCallInput.CNme; + + if (!string.IsNullOrWhiteSpace(editCallInput.CNum)) + call.ContactName = editCallInput.CNum; + + if (!string.IsNullOrWhiteSpace(editCallInput.EId)) + call.ExternalIdentifier = editCallInput.EId; - if (!String.IsNullOrWhiteSpace(editCallInput.Noc) && editCallInput.Noc != call.NatureOfCall) - call.NatureOfCall = editCallInput.Noc; + if (!string.IsNullOrWhiteSpace(editCallInput.InI)) + call.IncidentNumber = editCallInput.InI; - if (!String.IsNullOrWhiteSpace(editCallInput.Add) && editCallInput.Add != call.Address) + if (!string.IsNullOrWhiteSpace(editCallInput.RId)) + call.ReferenceNumber = editCallInput.RId; + + if (!string.IsNullOrWhiteSpace(editCallInput.Add)) call.Address = editCallInput.Add; + if (!string.IsNullOrWhiteSpace(editCallInput.W3W)) + call.W3W = editCallInput.W3W; + + if (!string.IsNullOrWhiteSpace(editCallInput.Cfd)) + call.CallFormData = editCallInput.Cfd; + + if (editCallInput.Don.HasValue) + { + call.DispatchOn = editCallInput.Don.Value; + + call.DispatchOn = DateTimeHelpers.ConvertToUtc(editCallInput.Don.Value, department.TimeZone); + call.HasBeenDispatched = false; + } + + if (!string.IsNullOrWhiteSpace(editCallInput.Not)) + call.Notes = editCallInput.Not; + + if (!string.IsNullOrWhiteSpace(editCallInput.Geo)) + call.GeoLocationData = editCallInput.Geo; + + if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.Address) && call.GeoLocationData.Length > 1) + call.GeoLocationData = await _geoLocationProvider.GetLatLonFromAddress(call.Address); + + if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.W3W)) + { + var coords = await _geoLocationProvider.GetCoordinatesFromW3WAsync(call.W3W); + + if (coords != null) + { + call.GeoLocationData = $"{coords.Latitude},{coords.Longitude}"; + } + } + + if (!String.IsNullOrWhiteSpace(editCallInput.Typ) && editCallInput.Typ != "No Type") + { + var callTypes = await _callsService.GetCallTypesForDepartmentAsync(DepartmentId); + var type = callTypes.FirstOrDefault(x => x.Type == editCallInput.Typ); + + if (type != null) + { + call.Type = type.Type; + } + } + + if (string.IsNullOrWhiteSpace(editCallInput.Dis) || editCallInput.Dis == "0") + { + if (call.Dispatches == null) + call.Dispatches = new List(); + + if (call.GroupDispatches == null) + call.GroupDispatches = new List(); + + if (call.RoleDispatches == null) + call.RoleDispatches = new List(); + + if (call.UnitDispatches == null) + call.UnitDispatches = new List(); + + var users = await _departmentsService.GetAllUsersForDepartmentAsync(DepartmentId); + // Use case, existing clients and non-ionic2 app this will be null dispatch all users. Or we've specified everyone (0). + foreach (var u in users) + { + var cd = new CallDispatch { UserId = u.UserId }; + + call.Dispatches.Add(cd); + } + } + else + { + var dispatch = editCallInput.Dis.Split(char.Parse("|")); + var usersToDispatch = dispatch.Where(x => x.StartsWith("P:")).Select(y => y.Replace("P:", "")); + var groupsToDispatch = dispatch.Where(x => x.StartsWith("G:")).Select(y => int.Parse(y.Replace("G:", ""))); + var rolesToDispatch = dispatch.Where(x => x.StartsWith("R:")).Select(y => int.Parse(y.Replace("R:", ""))); + var unitsToDispatch = dispatch.Where(x => x.StartsWith("U:")).Select(y => int.Parse(y.Replace("U:", ""))); + + try + { + if (call.Dispatches == null) + call.Dispatches = new List(); + + var dispatchesToRemove = call.Dispatches.Select(x => x.UserId).Where(y => !usersToDispatch.Contains(y)).ToList(); + + foreach (var userId in dispatchesToRemove) + { + var item = call.Dispatches.First(x => x.UserId == userId); + call.Dispatches.Remove(item); + } + + foreach (var user in usersToDispatch) + { + if (!call.Dispatches.Any(x => x.UserId == user)) + { + var cd = new CallDispatch { CallId = call.CallId, UserId = user }; + call.Dispatches.Add(cd); + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + + try + { + if (call.GroupDispatches == null) + call.GroupDispatches = new List(); + + var dispatchesToRemove = call.GroupDispatches.Select(x => x.DepartmentGroupId).Where(y => !groupsToDispatch.Contains(y)).ToList(); + + foreach (var id in dispatchesToRemove) + { + call.GroupDispatches.Remove(call.GroupDispatches.First(x => x.DepartmentGroupId == id)); + } + + foreach (var group in groupsToDispatch) + { + if (!call.GroupDispatches.Any(x => x.DepartmentGroupId == group)) + { + var cd = new CallDispatchGroup { CallId = call.CallId, DepartmentGroupId = group }; + call.GroupDispatches.Add(cd); + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + + try + { + if (call.RoleDispatches == null) + call.RoleDispatches = new List(); + + var dispatchesToRemove = call.RoleDispatches.Select(x => x.RoleId).Where(y => !rolesToDispatch.Contains(y)).ToList(); + + foreach (var id in dispatchesToRemove) + { + call.RoleDispatches.Remove(call.RoleDispatches.First(x => x.RoleId == id)); + } + + foreach (var role in rolesToDispatch) + { + if (!call.RoleDispatches.Any(x => x.RoleId == role)) + { + var cd = new CallDispatchRole { CallId = call.CallId, RoleId = role }; + call.RoleDispatches.Add(cd); + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + + try + { + if (call.UnitDispatches == null) + call.UnitDispatches = new List(); + + var dispatchesToRemove = call.UnitDispatches.Select(x => x.UnitId).Where(y => !unitsToDispatch.Contains(y)).ToList(); + + foreach (var id in dispatchesToRemove) + { + call.UnitDispatches.Remove(call.UnitDispatches.First(x => x.UnitId == id)); + } + + foreach (var unit in unitsToDispatch) + { + if (!call.UnitDispatches.Any(x => x.UnitId == unit)) + { + var cdu = new CallDispatchUnit { CallId = call.CallId, UnitId = unit }; + call.UnitDispatches.Add(cdu); + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + } + + // Call is in the past or is now, were dispatching now (at the end of this func) + if (call.DispatchOn.HasValue && call.DispatchOn.Value <= DateTime.UtcNow) + call.HasBeenDispatched = true; + await _callsService.SaveCallAsync(call, cancellationToken); - //OutboundEventProvider.CallAddedTopicHandler handler = new OutboundEventProvider.CallAddedTopicHandler(); - //await handler.Handle(new CallAddedEvent() { DepartmentId = DepartmentId, Call = call }); + if (editCallInput.RebroadcastCall) + { + var cqi = new CallQueueItem(); + cqi.Call = call; + + // If we have any group, unit or role dispatches just bet the farm and all all profiles for now. + if (cqi.Call.GroupDispatches.Any() || cqi.Call.UnitDispatches.Any() || cqi.Call.RoleDispatches.Any()) + cqi.Profiles = (await _userProfileService.GetAllProfilesForDepartmentAsync(DepartmentId)).Select(x => x.Value).ToList(); + else if (cqi.Call.Dispatches != null && cqi.Call.Dispatches.Any()) + cqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(cqi.Call.Dispatches.Select(x => x.UserId).ToList()); + else + cqi.Profiles = new List(); + + + if (cqi.Call.Dispatches.Any() || cqi.Call.GroupDispatches.Any() || cqi.Call.UnitDispatches.Any() || cqi.Call.RoleDispatches.Any()) + await _queueService.EnqueueCallBroadcastAsync(cqi, cancellationToken); + } + _eventAggregator.SendMessage(new CallAddedEvent() { DepartmentId = DepartmentId, Call = call }); return Ok(); @@ -1133,6 +1421,7 @@ public async Task>> GetCallNotes(int callId) noteResult.Not = note.Note; noteResult.Lat = note.Latitude; noteResult.Lng = note.Longitude; + noteResult.Fnm = await UserHelper.GetFullNameForUser(note.UserId); result.Add(noteResult); } @@ -1232,6 +1521,7 @@ public async Task GetFile(int departmentId, int id) /// Attaches a file to a call /// /// ID of the user + /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. /// [HttpPost("UploadFile")] [Consumes(MediaTypeNames.Application.Json)] @@ -1267,11 +1557,13 @@ public async Task UploadFile(CallFileInput input, CancellationToke callAttachment.Timestamp = DateTime.UtcNow; callAttachment.Data = Convert.FromBase64String(input.Data); - if (!String.IsNullOrWhiteSpace(input.Lat)) { + if (!String.IsNullOrWhiteSpace(input.Lat)) + { callAttachment.Latitude = decimal.Parse(input.Lat); } - if (!String.IsNullOrWhiteSpace(input.Lon)) { + if (!String.IsNullOrWhiteSpace(input.Lon)) + { callAttachment.Longitude = decimal.Parse(input.Lon); } @@ -1318,7 +1610,9 @@ public async Task GetCallAudio(string query) if (String.IsNullOrWhiteSpace(query)) return NotFound(); - string plainText = SymmetricEncryption.Decrypt(query, Config.SystemBehaviorConfig.ExternalAudioUrlParamPasshprase); + var decodedQuery = Encoding.UTF8.GetString(Convert.FromBase64String(query)); + + string plainText = SymmetricEncryption.Decrypt(decodedQuery, Config.SystemBehaviorConfig.ExternalAudioUrlParamPasshprase); if (String.IsNullOrWhiteSpace(plainText)) return NotFound(); @@ -1370,7 +1664,7 @@ public async Task>> GetCallTypes() if (callTypes != null && callTypes.Any()) { - foreach(var callType in callTypes) + foreach (var callType in callTypes) { var type = new CallTypeResult(); type.Id = callType.CallTypeId; @@ -1382,5 +1676,151 @@ public async Task>> GetCallTypes() return result; } + + /// + /// Returns all the non-dispatched (pending) scheduled calls for the department + /// + /// Array of CallResult objects for each active call in the department + [HttpGet("GetAllPendingScheduledCalls")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task>> GetAllPendingScheduledCalls() + { + var result = new List(); + + var calls = (await _callsService.GetAllNonDispatchedScheduledCallsByDepartmentIdAsync(DepartmentId)).OrderBy(x => x.DispatchOn); + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId, false); + + foreach (var c in calls) + { + var call = new CallResult(); + + call.Cid = c.CallId; + call.Pri = c.Priority; + call.Ctl = c.IsCritical; + call.Nme = StringHelpers.SanitizeHtmlInString(c.Name); + + if (!String.IsNullOrWhiteSpace(c.NatureOfCall)) + call.Noc = StringHelpers.SanitizeHtmlInString(c.NatureOfCall); + + call.Map = c.MapPage; + + if (!String.IsNullOrWhiteSpace(c.Notes)) + call.Not = StringHelpers.SanitizeHtmlInString(c.Notes); + + if (c.CallNotes != null) + call.Nts = c.CallNotes.Count(); + else + call.Nts = 0; + + if (c.Attachments != null) + { + call.Aud = c.Attachments.Count(x => x.CallAttachmentType == (int)CallAttachmentTypes.DispatchAudio); + call.Img = c.Attachments.Count(x => x.CallAttachmentType == (int)CallAttachmentTypes.Image); + call.Fls = c.Attachments.Count(x => x.CallAttachmentType == (int)CallAttachmentTypes.File); + } + else + { + call.Aud = 0; + call.Img = 0; + call.Fls = 0; + } + + if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1) + { + var geo = c.GeoLocationData.Split(char.Parse(",")); + + if (geo.Length == 2) + call.Add = await _geoLocationProvider.GetAddressFromLatLong(double.Parse(geo[0]), double.Parse(geo[1])); + } + else + call.Add = c.Address; + + call.Geo = c.GeoLocationData; + call.Lon = c.LoggedOn.TimeConverter(department); + call.Utc = c.LoggedOn; + call.Ste = c.State; + call.Num = c.Number; + + if (c.DispatchOn.HasValue) + call.Don = c.DispatchOn.Value.TimeConverter(department); + + result.Add(call); + } + + return Ok(result); + } + + /// + /// Updates a call's scheduled dispatch time if it has not been dispatched + /// + /// ID of the call + /// UTC date to change the dispatch to + /// + [HttpGet("UpdateScheduledDispatchTime")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task UpdateScheduledDispatchTime(int callId, DateTime date) + { + var call = await _callsService.GetCallByIdAsync(callId); + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + var canDoOperation = await _authorizationService.CanUserCreateCallAsync(UserId, DepartmentId); + + if (!canDoOperation) + return Unauthorized(); + + if (call == null) + return NotFound(); + + if (call.DepartmentId != DepartmentId) + return Unauthorized(); + + if (call.HasBeenDispatched.HasValue && call.HasBeenDispatched.Value) + return BadRequest(); + + call.DispatchOn = DateTimeHelpers.ConvertToUtc(date, department.TimeZone); + call.HasBeenDispatched = false; + + var savedCall = await _callsService.SaveCallAsync(call); + + return Ok(); + } + + /// + /// Deletes a call + /// + /// ID of the call + /// + [HttpDelete("DeleteCall")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task DeleteCall(int callId) + { + var call = await _callsService.GetCallByIdAsync(callId); + var canDoOperation = await _authorizationService.CanUserCreateCallAsync(UserId, DepartmentId); + + if (!canDoOperation) + return Unauthorized(); + + if (call == null) + return NotFound(); + + if (call.DepartmentId != DepartmentId) + return Unauthorized(); + + if (call.HasBeenDispatched.HasValue && call.HasBeenDispatched.Value) + return BadRequest(); + + call.IsDeleted = true; + + var savedCall = await _callsService.SaveCallAsync(call); + + return Ok(); + } } } diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/ChatController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/ChatController.cs index a4817c7d..bd37cfe2 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/ChatController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/ChatController.cs @@ -18,6 +18,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Produces("application/json")] [Route("api/v{version:ApiVersion}/[controller]")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class ChatController : V3AuthenticatedApiControllerbase { #region Members and Constructors diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CommandAppController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CommandAppController.cs index 06c10f96..e0a0c2be 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CommandAppController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CommandAppController.cs @@ -23,6 +23,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 { [Produces("application/json")] [Route("api/v{version:ApiVersion}/[controller]")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class CommandAppController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; @@ -298,7 +300,7 @@ public async Task> GetCommandAppCoreData() call.Map = c.MapPage; call.Not = c.Notes; - if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData)) + if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1) { var geo = c.GeoLocationData.Split(char.Parse(",")); diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CommandsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CommandsController.cs index cfc7eb74..f9fa28f9 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CommandsController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CommandsController.cs @@ -12,6 +12,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Produces("application/json")] [Route("api/v{version:ApiVersion}/[controller]")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class CommandsController : V3AuthenticatedApiControllerbase { private readonly ICommandsService _commandsService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CoreDataController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CoreDataController.cs index 6e00e83f..259b79ba 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/CoreDataController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/CoreDataController.cs @@ -19,6 +19,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 { [Produces("application/json")] [Route("api/v{version:ApiVersion}/[controller]")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class CoreDataController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/DepartmentController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/DepartmentController.cs index 778ca192..a4a6bb51 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/DepartmentController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/DepartmentController.cs @@ -14,6 +14,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class DepartmentController : V3AuthenticatedApiControllerbase { private readonly ICallsService _callsService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/DepartmentStatusController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/DepartmentStatusController.cs index cde5d0ce..283a58ff 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/DepartmentStatusController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/DepartmentStatusController.cs @@ -13,6 +13,8 @@ namespace Resgrid.Web.Services.Controllers.v3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class DepartmentStatusController : V3AuthenticatedApiControllerbase { private readonly IDepartmentSettingsService _departmentSettingsService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/DevicesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/DevicesController.cs index 82f7b8c3..b6782924 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/DevicesController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/DevicesController.cs @@ -18,6 +18,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class DevicesController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/DispatchController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/DispatchController.cs index 3d4a62cf..5363f237 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/DispatchController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/DispatchController.cs @@ -27,6 +27,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class DispatchController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; @@ -43,6 +45,7 @@ public class DispatchController : V3AuthenticatedApiControllerbase private readonly ICqrsProvider _cqrsProvider; private readonly IDepartmentSettingsService _departmentSettingsService; private readonly ITemplatesService _templatesService; + private readonly IFormsService _formsService; public DispatchController( IUsersService usersService, @@ -58,7 +61,8 @@ public DispatchController( IGeoLocationProvider geoLocationProvider, ICqrsProvider cqrsProvider, IDepartmentSettingsService departmentSettingsService, - ITemplatesService templatesService + ITemplatesService templatesService, + IFormsService formsService ) { _usersService = usersService; @@ -75,6 +79,7 @@ ITemplatesService templatesService _cqrsProvider = cqrsProvider; _departmentSettingsService = departmentSettingsService; _templatesService = templatesService; + _formsService = formsService; } [HttpGet("GetNewCallData")] @@ -375,7 +380,7 @@ public async Task> GetSetUnitStatusData( call.Fls = 0; } - if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData)) + if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1) { var geo = c.GeoLocationData.Split(char.Parse(",")); @@ -580,6 +585,8 @@ public async Task>> GetPersonnelForCal person.Status = status.ButtonText; person.StatusColor = status.ButtonClassToColor(); } + + person.Location = currentStatus.GeoLocationData; } else { @@ -725,5 +732,47 @@ public async Task>> GetCallTemplates() return Ok(templatesJson); } + + /// + /// Returns the custom new call form if any exists and is active + /// + /// FormDataResult object with the new call form data + [HttpGet("GetNewCallForm")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + public async Task> GetNewCallForm() + { + var formResult = new FormDataResult(); + var form = await _formsService.GetNewCallFormByDepartmentIdAsync(DepartmentId); + + if (form != null) + { + formResult.Id = form.FormId; + formResult.Name = form.Name; + formResult.Type = form.Type; + formResult.Data = form.Data; + + if (form.Automations != null && form.Automations.Any()) + { + formResult.Automations = new List(); + + foreach (var automation in form.Automations) + { + var automationResult = new FormDataAutomationResult(); + automationResult.Id = automation.FormAutomationId; + automationResult.FormId = automation.FormId; + automationResult.TriggerField = automation.TriggerField; + automationResult.TriggerValue = automation.TriggerValue; + automationResult.OperationType = automation.OperationType; + automationResult.OperationValue = automation.OperationValue; + + formResult.Automations.Add(automationResult); + } + } + } + + return Ok(formResult); + } } } diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/FeedsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/FeedsController.cs index 820e240b..48b5945e 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/FeedsController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/FeedsController.cs @@ -15,6 +15,7 @@ namespace Resgrid.Web.Services.Controllers.Version3 { [Route("api/v{version:ApiVersion}/[controller]")] [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] //[EnableCors("_resgridWebsiteAllowSpecificOrigins")] public class FeedsController : ControllerBase { diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/GeoController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/GeoController.cs index b1e3bb0c..c3f35768 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/GeoController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/GeoController.cs @@ -12,6 +12,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class GeoController : V3AuthenticatedApiControllerbase { private readonly IGeoLocationProvider _geoLocationProvider; @@ -65,7 +67,7 @@ public async Task> GetCoordinatesForAddress(stri { try { - var coords = _geoLocationProvider.GetLatLonFromAddressLocationIQ(plainTextAddress); + var coords = await _geoLocationProvider.GetLatLonFromAddressLocationIQ(plainTextAddress); if (coords != null && coords.Longitude.HasValue && coords.Latitude.HasValue) { diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/HealthController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/HealthController.cs index a4ec776f..fe46fd9d 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/HealthController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/HealthController.cs @@ -14,6 +14,7 @@ namespace Resgrid.Web.Services.Controllers.v3 [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] [ApiController] [AllowAnonymous] public class HealthController: Controller diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/LinksController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/LinksController.cs index d8e3c2d4..080c32c6 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/LinksController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/LinksController.cs @@ -22,6 +22,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class LinksController : V3AuthenticatedApiControllerbase { private readonly IDepartmentsService _departmentsService; @@ -142,7 +144,7 @@ public async Task>> GetActiveCallsForLink(in call.Fls = 0; } - if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData)) + if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1) { var geo = c.GeoLocationData.Split(char.Parse(",")); @@ -374,7 +376,7 @@ public async Task>> GetAllActiveCallsForLink call.Fls = 0; } - if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData)) + if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1) { var geo = c.GeoLocationData.Split(char.Parse(",")); diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/MessagesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/MessagesController.cs index 52f3e681..5ffb7a54 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/MessagesController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/MessagesController.cs @@ -20,6 +20,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class MessagesController : V3AuthenticatedApiControllerbase { #region Private Members and Constructors diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/NotesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/NotesController.cs index 9d758713..d060b277 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/NotesController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/NotesController.cs @@ -18,6 +18,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class NotesController : V3AuthenticatedApiControllerbase { private readonly IDepartmentsService _departmentsService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/PersonnelController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/PersonnelController.cs index 335e5221..13cc7baf 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/PersonnelController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/PersonnelController.cs @@ -20,6 +20,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class PersonnelController : V3AuthenticatedApiControllerbase { #region Members and Constructors diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/ProfileController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/ProfileController.cs index 6d10095b..588c86dd 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/ProfileController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/ProfileController.cs @@ -10,7 +10,9 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Resgrid.Web.Services.Controllers.Version3.Models.Profile; - +using Resgrid.Model.Events; +using Resgrid.Framework; +using Resgrid.Model.Providers; namespace Resgrid.Web.Services.Controllers.Version3 { @@ -19,6 +21,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class ProfileController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; @@ -27,9 +31,11 @@ public class ProfileController : V3AuthenticatedApiControllerbase private readonly IUserProfileService _userProfileService; private readonly IAuthorizationService _authorizationService; private readonly IAddressService _addressService; + private readonly IEventAggregator _eventAggregator; public ProfileController(IUsersService usersService, IDepartmentsService departmentsService, ILimitsService limitsService, - IUserProfileService userProfileService, IAuthorizationService authorizationService, IAddressService addressService) + IUserProfileService userProfileService, IAuthorizationService authorizationService, IAddressService addressService, + IEventAggregator eventAggregator) { _usersService = usersService; _departmentsService = departmentsService; @@ -37,6 +43,7 @@ public ProfileController(IUsersService usersService, IDepartmentsService departm _userProfileService = userProfileService; _authorizationService = authorizationService; _addressService = addressService; + _eventAggregator = eventAggregator; } /// @@ -199,6 +206,12 @@ public async Task UpdateProfile(UpdateProfileInput input, Cancella if (profile == null) return NotFound(); + var auditEvent = new AuditEvent(); + auditEvent.DepartmentId = DepartmentId; + auditEvent.UserId = UserId; + auditEvent.Type = AuditLogTypes.ProfileUpdated; + auditEvent.Before = profile.CloneJsonToString(); + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); var dm = await _departmentsService.GetDepartmentMemberAsync(UserId.ToUpper(), DepartmentId); var membership = _usersService.GetMembershipByUserId(UserId.ToUpper()); @@ -243,6 +256,9 @@ public async Task UpdateProfile(UpdateProfileInput input, Cancella await _userProfileService.SaveProfileAsync(DepartmentId, profile, cancellationToken); _departmentsService.InvalidateDepartmentUsersInCache(department.DepartmentId); + auditEvent.After = profile.CloneJsonToString(); + _eventAggregator.SendMessage(auditEvent); + return Ok(result); } } diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/ProtocolsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/ProtocolsController.cs index e63bfd75..22b33eb4 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/ProtocolsController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/ProtocolsController.cs @@ -13,6 +13,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class ProtocolsController : V3AuthenticatedApiControllerbase { private readonly IDepartmentsService _departmentsService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/SecurityController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/SecurityController.cs index 798bd2ee..e6bbce3f 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/SecurityController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/SecurityController.cs @@ -15,6 +15,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class SecurityController : V3AuthenticatedApiControllerbase { private readonly IDepartmentsService _departmentsService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/ShiftsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/ShiftsController.cs index 0544ad80..4c2d51c4 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/ShiftsController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/ShiftsController.cs @@ -17,6 +17,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class ShiftsController : V3AuthenticatedApiControllerbase { private readonly IShiftsService _shiftsService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/StaffingController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/StaffingController.cs index 9302c3d5..196e8ea2 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/StaffingController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/StaffingController.cs @@ -17,6 +17,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class StaffingController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/StaffingSchedulesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/StaffingSchedulesController.cs index e689ab9b..7a4a1fc9 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/StaffingSchedulesController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/StaffingSchedulesController.cs @@ -21,6 +21,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class StaffingSchedulesController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/StationsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/StationsController.cs index aa092465..5283b8f9 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/StationsController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/StationsController.cs @@ -17,6 +17,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class StationsController : V3AuthenticatedApiControllerbase { private ICallsService _callsService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/StatusController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/StatusController.cs index 5ce72c73..c576848e 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/StatusController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/StatusController.cs @@ -24,6 +24,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class StatusController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitAppController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitAppController.cs index fad3a32e..60bbd5ec 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitAppController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitAppController.cs @@ -26,6 +26,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 { [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class UnitAppController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; @@ -319,7 +321,7 @@ public async Task> GetUnitAppCoreData() call.Map = c.MapPage; call.Not = c.Notes; - if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData)) + if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1) { var geo = c.GeoLocationData.Split(char.Parse(",")); @@ -443,7 +445,7 @@ public async Task> GetUnitAppCallDataOnly() call.Map = c.MapPage; call.Not = c.Notes; - if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData)) + if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1) { var geo = c.GeoLocationData.Split(char.Parse(",")); diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitLocationController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitLocationController.cs index 9b3184b7..4e9cbdb1 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitLocationController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitLocationController.cs @@ -17,6 +17,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class UnitLocationController : V3AuthenticatedApiControllerbase { private readonly IUnitsService _unitsService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitStateController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitStateController.cs index 5169caa9..a772aa92 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitStateController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitStateController.cs @@ -21,6 +21,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class UnitStateController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitsController.cs index df446ac8..518dd425 100644 --- a/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitsController.cs +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/UnitsController.cs @@ -18,6 +18,8 @@ namespace Resgrid.Web.Services.Controllers.Version3 /// [Route("api/v{version:ApiVersion}/[controller]")] [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] public class UnitsController : V3AuthenticatedApiControllerbase { private readonly IUsersService _usersService; diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v3/VoiceController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v3/VoiceController.cs new file mode 100644 index 00000000..d4daccaf --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v3/VoiceController.cs @@ -0,0 +1,83 @@ +using System.Threading.Tasks; +using Resgrid.Model.Services; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Web.Services.Models.v3.Voice; +using Resgrid.Framework; +using System.Collections.Generic; +using System.Linq; +using Resgrid.Web.Helpers; + +namespace Resgrid.Web.Services.Controllers.Version3 +{ + /// + /// Operations that can be performed against resgrid voice (voip) services + /// + [Route("api/v{version:ApiVersion}/[controller]")] + [Produces("application/json")] + [ApiVersion("3.0")] + [ApiExplorerSettings(GroupName = "v3")] + public class VoiceController : V3AuthenticatedApiControllerbase + { + private readonly IAuthorizationService _authorizationService; + private readonly IVoiceService _voiceService; + private readonly IDepartmentsService _departmentsService; + + public VoiceController( + IAuthorizationService authorizationService, + IVoiceService voiceService, + IDepartmentsService departmentsService) + { + _authorizationService = authorizationService; + _voiceService = voiceService; + _departmentsService = departmentsService; + } + + /// + /// Returns all the available responding options (Calls/Stations) for the department + /// + /// Array of RecipientResult objects for each responding option in the department + [HttpGet("GetDepartmentVoiceSettings")] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task> GetDepartmentVoiceSettings() + { + var result = new DepartmentVoiceResult(); + result.VoipServerWebsocketSslAddress = Config.VoipConfig.VoipServerWebsocketSslAddress; + result.VoiceEnabled = await _voiceService.CanDepartmentUseVoiceAsync(DepartmentId); + result.Realm = Config.VoipConfig.VoipDomain; + result.CallerIdName = await UserHelper.GetFullNameForUser(UserId); + + if (result.VoiceEnabled) + { + result.Channels = new List(); + + var voice = await _voiceService.GetVoiceSettingsForDepartmentAsync(DepartmentId); + + if (voice != null) + { + if (voice.Channels != null && voice.Channels.Any()) + { + foreach (var chan in voice.Channels) + { + var channel = new DepartmentVoiceChannelResult(); + channel.Name = chan.Name; + channel.IsDefault = chan.IsDefault; + channel.ConferenceNumber = chan.ConferenceNumber; + + result.Channels.Add(channel); + } + } + + result.UserInfo = new DepartmentVoiceUserInfoResult(); + result.UserInfo.Username = UserId.Replace("-", ""); + + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + result.UserInfo.Pin = _departmentsService.ConvertDepartmentCodeToDigitPin(department.Code); + result.UserInfo.Password = Hashing.ComputeMD5Hash($"{UserId}{Config.SymmetricEncryptionConfig.InitVector}"); + } + } + + return Ok(result); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallFilesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallFilesController.cs new file mode 100644 index 00000000..25a20ec5 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallFilesController.cs @@ -0,0 +1,228 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Framework; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Threading.Tasks; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.CallPriorities; +using System.Linq; +using Resgrid.Model; +using Resgrid.Model.Helpers; +using Resgrid.Web.Services.Models.v4.CallFiles; +using System; +using System.IO; +using System.Net.Mime; +using System.Threading; +using System.Web; +using System.Text; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class CallFilesController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly ICallsService _callsService; + private readonly IDepartmentsService _departmentsService; + + public CallFilesController(ICallsService callsService, IDepartmentsService departmentsService) + { + _callsService = callsService; + _departmentsService = departmentsService; + } + #endregion Members and Constructors + + /// + /// Get the files for a call in the Resgrid System + /// + /// CallId to get the files for + /// Include the data in the result + /// Type of file to get (Any = 0, Audio = 1, Images = 2, Files = 3, Videos = 4) + /// + [HttpGet("GetFilesForCall")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetFilesForCall(int callId, bool includeData, int type) + { + var result = new CallFilesResult(); + var call = await _callsService.GetCallByIdAsync(callId); + + if (call == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + if (call.DepartmentId != DepartmentId) + return Unauthorized(); + + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + call = await _callsService.PopulateCallData(call, false, true, false, false, false, false, false); + + if (call.Attachments != null && call.Attachments.Any()) + { + foreach (var attachment in call.Attachments) + { + if (type == 0) + result.Data.Add(ConvertCallFileData(attachment, department, includeData)); + else if (type == attachment.CallAttachmentType) + result.Data.Add(ConvertCallFileData(attachment, department, includeData)); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Get a users avatar from the Resgrid system based on their ID + /// + /// ID of the file + /// + [HttpGet("GetFile")] + [AllowAnonymous] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task GetFile(string query) + { + if (String.IsNullOrWhiteSpace(query)) + return NotFound(); + + var decodedQuery = Encoding.UTF8.GetString(Convert.FromBase64String(query)); + + var decryptedQuery = SymmetricEncryption.Decrypt(decodedQuery, Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase); + + var items = decryptedQuery.Split(char.Parse("|")); + + if (String.IsNullOrWhiteSpace(items[0]) || items[0] == "0" || String.IsNullOrWhiteSpace(items[1])) + return NotFound(); + + int departmentId = int.Parse(items[0].Trim()); + string id = items[1].Trim(); + + var attachment = await _callsService.GetCallAttachmentAsync(int.Parse(id)); + + if (attachment == null) + return NotFound(); + + var call = await _callsService.GetCallByIdAsync(attachment.CallId); + if (call.DepartmentId != departmentId) + return Unauthorized(); + + var contentType = FileHelper.GetContentTypeByExtension(Path.GetExtension(attachment.FileName).ToLowerInvariant()); + return File(attachment.Data, contentType); + } + + /// + /// Attaches a file to a call + /// + /// ID of the user + /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + [HttpPost("SaveCallFile")] + [Consumes(MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status201Created)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> SaveCallFile(SaveCallFileInput input, CancellationToken cancellationToken) + { + var result = new SaveCallFileResult(); + + if (!ModelState.IsValid) + return BadRequest(); + + var call = await _callsService.GetCallByIdAsync(int.Parse(input.CallId)); + + if (call == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + if (call.DepartmentId != DepartmentId) + return Unauthorized(); + + if (call.State != (int)CallStates.Active) + return BadRequest(); + + var callAttachment = new CallAttachment(); + callAttachment.CallId = int.Parse(input.CallId); + callAttachment.CallAttachmentType = input.Type; + + if (String.IsNullOrWhiteSpace(input.Name)) + callAttachment.FileName = "cameraPhoneUpload.png"; + else + callAttachment.FileName = input.Name; + + callAttachment.UserId = input.UserId; + callAttachment.Timestamp = DateTime.UtcNow; + callAttachment.Data = Convert.FromBase64String(input.Data); + + if (!String.IsNullOrWhiteSpace(input.Latitude)) + { + callAttachment.Latitude = decimal.Parse(input.Latitude); + } + + if (!String.IsNullOrWhiteSpace(input.Longitude)) + { + callAttachment.Longitude = decimal.Parse(input.Longitude); + } + + var saved = await _callsService.SaveCallAttachmentAsync(callAttachment, cancellationToken); + + + result.Id = saved.CallAttachmentId.ToString(); + result.PageSize = 0; + result.Status = ResponseHelper.Created; + ResponseHelper.PopulateV4ResponseData(result); + + return CreatedAtAction(nameof(GetFile), new { departmentId = call.DepartmentId, id = saved.CallAttachmentId }, result); + } + + public static CallFileResultData ConvertCallFileData(CallAttachment attachment, Department department, bool includeData) + { + var file = new CallFileResultData(); + file.Id = attachment.CallAttachmentId.ToString(); + file.CallId = attachment.CallId.ToString(); + file.FileName = attachment.FileName; + file.Type = attachment.CallAttachmentType; + + var query = SymmetricEncryption.Encrypt($"{department.DepartmentId}|{attachment.CallAttachmentId}", Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase); + + file.Url = Config.SystemBehaviorConfig.ResgridApiBaseUrl + "/api/v4/CallFiles/GetFile?query=" + Convert.ToBase64String(Encoding.UTF8.GetBytes(query)); + file.Name = attachment.Name; + file.Size = attachment.Size.GetValueOrDefault(); + file.Mime = FileHelper.GetContentTypeByExtension(Path.GetExtension(attachment.FileName)); + + if (attachment.Timestamp.HasValue) + file.Timestamp = attachment.Timestamp.Value.TimeConverterToString(department); + else + file.Timestamp = DateTime.UtcNow.TimeConverterToString(department); + + if (!String.IsNullOrWhiteSpace(attachment.UserId)) + file.UserId = attachment.UserId; + + if (includeData) + file.Data = Convert.ToBase64String(attachment.Data); + + return file; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallNotesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallNotesController.cs new file mode 100644 index 00000000..112821f2 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallNotesController.cs @@ -0,0 +1,160 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Threading.Tasks; +using Resgrid.Web.Services.Helpers; +using System.Linq; +using Resgrid.Model; +using Resgrid.Web.Helpers; +using Resgrid.Web.Services.Models.v4.CallNotes; +using System; +using Resgrid.Model.Helpers; +using static Resgrid.Web.Services.Models.v4.CallNotes.CallNotesResult; +using System.Net.Mime; +using System.Threading; +using Resgrid.Web.Services.Models.v4.Calls; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class CallNotesController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly ICallsService _callsService; + private readonly IDepartmentsService _departmentsService; + + public CallNotesController(ICallsService callsService, IDepartmentsService departmentsService) + { + _callsService = callsService; + _departmentsService = departmentsService; + } + #endregion Members and Constructors + + /// + /// Get notes for a call + /// + /// CallId of the call you want to get notes for + /// + [HttpGet("GetCallNotes")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetCallNotes(string callId) + { + if (String.IsNullOrWhiteSpace(callId)) + return BadRequest(); + + var result = new CallNotesResult(); + + var call = await _callsService.GetCallByIdAsync(int.Parse(callId)); + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + + if (call == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + if (call.DepartmentId != DepartmentId) + return Unauthorized(); + + call = await _callsService.PopulateCallData(call, false, false, true, false, false, false, false); + + if (call.CallNotes != null && call.CallNotes.Any()) + { + foreach (var note in call.CallNotes) + { + + var fullName = await UserHelper.GetFullNameForUser(note.UserId); + + result.Data.Add(ConvertCallNote(note, fullName, department)); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Saves a call note + /// + /// CallId of the call you want to get notes for + /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// ActionResult. + [HttpPost("SaveCallNote")] + [Consumes(MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status201Created)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> SaveCallNote(SaveCallNoteInput input, CancellationToken cancellationToken) + { + if (!ModelState.IsValid) + return BadRequest(); + + var call = await _callsService.GetCallByIdAsync(int.Parse(input.CallId)); + + if (call == null) + return BadRequest(); + + if (call.DepartmentId != DepartmentId) + return Unauthorized(); + + var result = new SaveCallNoteResult(); + + var note = new CallNote(); + note.CallId = int.Parse(input.CallId); + note.Timestamp = DateTime.UtcNow; + note.Note = input.Note; + note.UserId = input.UserId; + note.Source = (int)CallNoteSources.Mobile; + + if (!String.IsNullOrWhiteSpace(input.Latitude) && !String.IsNullOrWhiteSpace(input.Longitude)) + { + note.Latitude = decimal.Parse(input.Latitude); + note.Longitude = decimal.Parse(input.Longitude); + } + + var saved = await _callsService.SaveCallNoteAsync(note, cancellationToken); + + result.Id = saved.CallNoteId.ToString(); + result.PageSize = 0; + result.Status = ResponseHelper.Created; + ResponseHelper.PopulateV4ResponseData(result); + + return CreatedAtAction(nameof(GetCallNotes), new { callId = saved.CallId }, result); + } + + public static CallNoteResultData ConvertCallNote(CallNote note, string fullName, Department department) + { + var noteResult = new CallNoteResultData(); + noteResult.CallNoteId = note.CallNoteId.ToString(); + noteResult.CallId = note.CallId.ToString(); + noteResult.Source = note.Source; + noteResult.UserId = note.UserId; + noteResult.TimestampFormatted = note.Timestamp.TimeConverter(department).FormatForDepartment(department); + noteResult.TimestampUtc = note.Timestamp; + noteResult.Note = note.Note; + noteResult.Latitude = note.Latitude; + noteResult.Longitude = note.Longitude; + noteResult.FullName = fullName; + + return noteResult; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallPrioritiesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallPrioritiesController.cs new file mode 100644 index 00000000..4806caba --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallPrioritiesController.cs @@ -0,0 +1,84 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Framework; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Threading.Tasks; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.CallPriorities; +using System.Linq; +using Resgrid.Model; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class CallPrioritiesController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly ICallsService _callsService; + + public CallPrioritiesController( + ICallsService callsService + ) + { + _callsService = callsService; + } + #endregion Members and Constructors + + /// + /// Gets all the call priorities in a department + /// + /// + [HttpGet("GetAllCallPriorites")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetAllCallPriorites() + { + var result = new CallPrioritiesResult(); + + var priorities = await _callsService.GetCallPrioritiesForDepartmentAsync(DepartmentId); + + if (priorities != null && priorities.Any()) + { + foreach (var p in priorities) + { + result.Data.Add(ConvertPriorityData(p)); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + + public static CallPriorityResultData ConvertPriorityData(DepartmentCallPriority p) + { + var priority = new CallPriorityResultData(); + + priority.Id = p.DepartmentCallPriorityId; + priority.DepartmentId = p.DepartmentId; + priority.Name = StringHelpers.SanitizeHtmlInString(p.Name); + priority.Color = p.Color; + priority.Sort = p.Sort; + priority.IsDeleted = p.IsDeleted; + priority.IsDefault = p.IsDefault; + priority.Tone = p.Tone; + + return priority; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallProtocolsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallProtocolsController.cs new file mode 100644 index 00000000..3f601f0d --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallProtocolsController.cs @@ -0,0 +1,136 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Framework; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Threading.Tasks; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.CallPriorities; +using System.Linq; +using Resgrid.Model; +using Resgrid.Web.Services.Models.v4.CallProtocols; +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class CallProtocolsController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IProtocolsService _protocolsService; + + public CallProtocolsController(IProtocolsService protocolsService) + { + _protocolsService = protocolsService; + } + #endregion Members and Constructors + + /// + /// Gets all the call protocols in a department + /// + /// + [HttpGet("GetAllCallProtocols")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Protocol_View)] + public async Task> GetAllCallProtocols() + { + var result = new CallProtocolsResult(); + + var priorities = await _protocolsService.GetAllProtocolsForDepartmentAsync(DepartmentId); + + if (priorities != null && priorities.Any()) + { + foreach (var p in priorities) + { + result.Data.Add(ConvertProtocolData(p)); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + + public static CallProtocolResultData ConvertProtocolData(DispatchProtocol dp) + { + var protocol = new CallProtocolResultData(); + protocol.Id = dp.DispatchProtocolId.ToString(); + protocol.DepartmentId = dp.DepartmentId.ToString(); + protocol.Name = dp.Name; + protocol.Code = dp.Code; + protocol.IsDisabled = dp.IsDisabled; + protocol.Description = dp.Description; + protocol.ProtocolText = dp.ProtocolText; + protocol.CreatedOn = dp.CreatedOn; + protocol.CreatedByUserId = dp.CreatedByUserId; + protocol.UpdatedOn = dp.UpdatedOn; + protocol.MinimumWeight = dp.MinimumWeight; + protocol.UpdatedByUserId = dp.UpdatedByUserId; + protocol.State = (int)dp.State; + protocol.Triggers = new List(); + protocol.Attachments = new List(); + protocol.Questions = new List(); + + foreach (var t in dp.Triggers) + { + var trigger = new ProtocolTriggerResultData(); + trigger.Id = t.DispatchProtocolTriggerId.ToString(); + trigger.Type = t.Type; + trigger.StartsOn = t.StartsOn; + trigger.EndsOn = t.EndsOn; + trigger.Priority = t.Priority; + trigger.CallType = t.CallType; + trigger.Geofence = t.Geofence; + + protocol.Triggers.Add(trigger); + } + + foreach (var a in dp.Attachments) + { + var attachment = new ProtocolTriggerAttachmentResultData(); + attachment.Id = a.DispatchProtocolAttachmentId.ToString(); + attachment.FileName = a.FileName; + attachment.FileType = a.FileType; + + protocol.Attachments.Add(attachment); + } + + foreach (var q in dp.Questions) + { + var question = new ProtocolTriggerQuestionResultData(); + question.Id = q.DispatchProtocolQuestionId.ToString(); + question.Question = q.Question; + question.Answers = new List(); + + foreach (var a in q.Answers) + { + var answer = new ProtocolQuestionAnswerResultData(); + answer.Id = a.DispatchProtocolQuestionAnswerId.ToString(); + answer.Answer = a.Answer; + answer.Weight = a.Weight; + + question.Answers.Add(answer); + } + + protocol.Questions.Add(question); + } + + + return protocol; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallTypesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallTypesController.cs new file mode 100644 index 00000000..94be916e --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallTypesController.cs @@ -0,0 +1,117 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Providers; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Threading.Tasks; +using IAuthorizationService = Resgrid.Model.Services.IAuthorizationService; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.CallTypes; +using System.Linq; +using Resgrid.Model; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class CallTypesController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly ICallsService _callsService; + private readonly IDepartmentsService _departmentsService; + private readonly IUserProfileService _userProfileService; + private readonly IGeoLocationProvider _geoLocationProvider; + private readonly IAuthorizationService _authorizationService; + private readonly IQueueService _queueService; + private readonly IUsersService _usersService; + private readonly IUnitsService _unitsService; + private readonly IActionLogsService _actionLogsService; + private readonly IDepartmentGroupsService _departmentGroupsService; + private readonly IPersonnelRolesService _personnelRolesService; + private readonly IProtocolsService _protocolsService; + private readonly IEventAggregator _eventAggregator; + + public CallTypesController( + ICallsService callsService, + IDepartmentsService departmentsService, + IUserProfileService userProfileService, + IGeoLocationProvider geoLocationProvider, + IAuthorizationService authorizationService, + IQueueService queueService, + IUsersService usersService, + IUnitsService unitsService, + IActionLogsService actionLogsService, + IDepartmentGroupsService departmentGroupsService, + IPersonnelRolesService personnelRolesService, + IProtocolsService protocolsService, + IEventAggregator eventAggregator + ) + { + _callsService = callsService; + _departmentsService = departmentsService; + _userProfileService = userProfileService; + _geoLocationProvider = geoLocationProvider; + _authorizationService = authorizationService; + _queueService = queueService; + _usersService = usersService; + _unitsService = unitsService; + _actionLogsService = actionLogsService; + _departmentGroupsService = departmentGroupsService; + _personnelRolesService = personnelRolesService; + _protocolsService = protocolsService; + _eventAggregator = eventAggregator; + } + #endregion Members and Constructors + + /// + /// Gets all the call priorities in a department + /// + /// + [HttpGet("GetAllCallTypes")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetAllCallTypes() + { + var result = new CallTypesResult(); + + var callTypes = await _callsService.GetCallTypesForDepartmentAsync(DepartmentId); + + if (callTypes != null && callTypes.Any()) + { + result.Data.Add(new CallTypeResultData() { Id = "0", Name = "No Type" }); + + foreach (var callType in callTypes) + { + result.Data.Add(ConvertTypeData(callType)); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.Data.Add(new CallTypeResultData() { Id = "0", Name = "No Type" }); + result.PageSize = 1; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + + public static CallTypeResultData ConvertTypeData(CallType callType) + { + var type = new CallTypeResultData(); + type.Id = callType.CallTypeId.ToString(); + type.Name = callType.Type; + + return type; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallsController.cs new file mode 100644 index 00000000..c5831346 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CallsController.cs @@ -0,0 +1,1282 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Framework; +using Resgrid.Model; +using Resgrid.Model.Providers; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using Resgrid.Web.Services.Models.v4.Calls; +using System; +using System.Linq; +using System.Threading.Tasks; +using Resgrid.Model.Helpers; +using IAuthorizationService = Resgrid.Model.Services.IAuthorizationService; +using Resgrid.Web.Services.Helpers; +using System.Net.Mime; +using System.Threading; +using System.Collections.ObjectModel; +using System.Collections.Generic; +using Resgrid.Model.Events; +using Resgrid.Model.Queue; +using Resgrid.Web.Services.Models.v4.CallProtocols; +using Resgrid.Web.Helpers; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Calls, also referred to as Dispatches. + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class CallsController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly ICallsService _callsService; + private readonly IDepartmentsService _departmentsService; + private readonly IUserProfileService _userProfileService; + private readonly IGeoLocationProvider _geoLocationProvider; + private readonly IAuthorizationService _authorizationService; + private readonly IQueueService _queueService; + private readonly IUsersService _usersService; + private readonly IUnitsService _unitsService; + private readonly IActionLogsService _actionLogsService; + private readonly IDepartmentGroupsService _departmentGroupsService; + private readonly IPersonnelRolesService _personnelRolesService; + private readonly IProtocolsService _protocolsService; + private readonly IEventAggregator _eventAggregator; + private readonly ICustomStateService _customStateService; + + public CallsController( + ICallsService callsService, + IDepartmentsService departmentsService, + IUserProfileService userProfileService, + IGeoLocationProvider geoLocationProvider, + IAuthorizationService authorizationService, + IQueueService queueService, + IUsersService usersService, + IUnitsService unitsService, + IActionLogsService actionLogsService, + IDepartmentGroupsService departmentGroupsService, + IPersonnelRolesService personnelRolesService, + IProtocolsService protocolsService, + IEventAggregator eventAggregator, + ICustomStateService customStateService + ) + { + _callsService = callsService; + _departmentsService = departmentsService; + _userProfileService = userProfileService; + _geoLocationProvider = geoLocationProvider; + _authorizationService = authorizationService; + _queueService = queueService; + _usersService = usersService; + _unitsService = unitsService; + _actionLogsService = actionLogsService; + _departmentGroupsService = departmentGroupsService; + _personnelRolesService = personnelRolesService; + _protocolsService = protocolsService; + _eventAggregator = eventAggregator; + _customStateService = customStateService; + } + #endregion Members and Constructors + + /// + /// Returns all the active calls for the department + /// + /// Array of CallResult objects for each active call in the department + [HttpGet("GetActiveCalls")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetActiveCalls() + { + var result = new ActiveCallsResult(); + + var calls = (await _callsService.GetActiveCallsByDepartmentAsync(DepartmentId)).OrderByDescending(x => x.LoggedOn); + + if (calls != null && calls.Any()) + { + foreach (var c in calls) + { + var callWithData = await _callsService.PopulateCallData(c, false, true, true, false, false, false, true); + + string address = ""; + if (String.IsNullOrWhiteSpace(c.Address) && (!String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1)) + { + var geo = c.GeoLocationData.Split(char.Parse(",")); + + if (geo.Length == 2) + address = await _geoLocationProvider.GetAddressFromLatLong(double.Parse(geo[0]), double.Parse(geo[1])); + } + else + address = c.Address; + + result.Data.Add(ConvertCall(callWithData, null, address, TimeZone)); + } + result.PageSize = result.Data.Count(); + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + return Ok(result); + } + + /// + /// Returns a specific call from the Resgrid System + /// + /// Id of the call trying to be retrived + /// CallResult of the call in the Resgrid system + [HttpGet("GetCall")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetCall(string callId) + { + if (String.IsNullOrWhiteSpace(callId)) + return BadRequest(); + + var result = new CallResult(); + var c = await _callsService.GetCallByIdAsync(int.Parse(callId)); + + if (c == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + if (c.DepartmentId != DepartmentId) + return Unauthorized(); + + c = await _callsService.PopulateCallData(c, false, true, true, false, false, false, true); + + string address = ""; + if (String.IsNullOrWhiteSpace(c.Address) && (!String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1)) + { + var geo = c.GeoLocationData.Split(char.Parse(",")); + + if (geo.Length == 2) + address = await _geoLocationProvider.GetAddressFromLatLong(double.Parse(geo[0]), double.Parse(geo[1])); + } + else + address = c.Address; + + var protocols = new List(); + if (c.Protocols != null && c.Protocols.Any()) + { + foreach (var callProtocol in c.Protocols) + { + var protocol = await _protocolsService.GetProtocolByIdAsync(callProtocol.CallProtocolId); + if (protocol != null) + protocols.Add(protocol); + } + } + + result.Data = ConvertCall(c, protocols, address, TimeZone); + + result.PageSize = 1; + result.Status = ResponseHelper.Success; + + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Gets all the meta-data around a call, dispatched personnel, units, groups and responses + /// + /// CallId to get data for + /// + [HttpGet("GetCallExtraData")] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task> GetCallExtraData(int callId) + { + var result = new CallExtraDataResult(); + + var call = await _callsService.GetCallByIdAsync(callId); + + if (call == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + if (call.DepartmentId != DepartmentId) + Unauthorized(); + + call = await _callsService.PopulateCallData(call, true, true, true, true, true, true, true); + + var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId); + var units = await _unitsService.GetUnitsForDepartmentAsync(call.DepartmentId); + var unitStates = (await _unitsService.GetUnitStatesForCallAsync(call.DepartmentId, callId)).OrderBy(x => x.UnitId).OrderBy(y => y.Timestamp).ToList(); + var actionLogs = (await _actionLogsService.GetActionLogsForCallAsync(call.DepartmentId, callId)).OrderBy(x => x.UserId).OrderBy(y => y.Timestamp).ToList(); + var names = _usersService.GetUserGroupAndRolesByDepartmentId(DepartmentId, true, true, true); + var priority = await _callsService.GetCallPrioritiesByIdAsync(call.DepartmentId, call.Priority, false); + var roles = await _personnelRolesService.GetAllRolesForDepartmentAsync(call.DepartmentId); + + var customStates = await _customStateService.GetAllCustomStatesForDepartmentAsync(call.DepartmentId); + var defaultUnitStatuses = _customStateService.GetDefaultUnitStatuses(); + var defaultUserStatuses = await _customStateService.GetCustomPersonnelStatusesOrDefaultsAsync(call.DepartmentId); + + if (priority != null) + { + result.Data.Priority = CallPrioritiesController.ConvertPriorityData(priority); + } + + foreach (var actionLog in actionLogs) + { + var eventResult = new DispatchedEventResultData(); + eventResult.Id = actionLog.ActionLogId.ToString(); + eventResult.Timestamp = actionLog.Timestamp; + eventResult.Type = "User"; + + var name = names.FirstOrDefault(x => x.UserId == actionLog.UserId); + if (name != null) + { + eventResult.Name = name.Name; + + if (name.DepartmentGroupId.HasValue) + { + eventResult.GroupId = name.DepartmentGroupId.Value.ToString(); + eventResult.Group = name.DepartmentGroupName; + } + } + else + { + eventResult.Name = "Unknown User"; + } + + eventResult.StatusId = actionLog.ActionTypeId; + eventResult.Location = actionLog.GeoLocationData; + eventResult.Note = actionLog.Note; + + if (actionLog.ActionTypeId <= 25) + { + var state = defaultUserStatuses.FirstOrDefault(x => x.CustomStateDetailId == actionLog.ActionTypeId); + + if (state != null) + { + eventResult.StatusText = state.ButtonText; + eventResult.StatusColor = state.ButtonColor; + } + } + else + { + if (customStates != null && customStates.Count > 0) + { + var state = customStates.Select(state => state.Details.FirstOrDefault(x => x.CustomStateDetailId == actionLog.ActionTypeId)).FirstOrDefault(detail => detail != null); + + if (state != null) + { + eventResult.StatusText = state.ButtonText; + eventResult.StatusColor = state.ButtonColor; + } + } + } + + if (String.IsNullOrWhiteSpace(eventResult.StatusText)) + eventResult.StatusText = "Unknown"; + + if (String.IsNullOrWhiteSpace(eventResult.StatusColor)) + eventResult.StatusColor = "#ffa500"; + + result.Data.Activity.Add(eventResult); + } + + foreach (var unitLog in unitStates) + { + var eventResult = new DispatchedEventResultData(); + eventResult.Id = unitLog.UnitStateId.ToString(); + eventResult.Timestamp = unitLog.Timestamp; + eventResult.Type = "Unit"; + eventResult.Name = unitLog.Unit.Name; + + var group = groups.FirstOrDefault(x => x.DepartmentGroupId == unitLog.Unit.StationGroupId); + if (group != null) + { + eventResult.GroupId = group.DepartmentGroupId.ToString(); + eventResult.Group = group.Name; + } + + eventResult.StatusId = unitLog.State; + eventResult.Location = unitLog.GeoLocationData; + eventResult.Note = unitLog.Note; + + if (unitLog.UnitStateId <= 12) + { + var state = defaultUnitStatuses.FirstOrDefault(x => x.CustomStateDetailId == unitLog.UnitStateId); + + if (state != null) + { + eventResult.StatusText = state.ButtonText; + eventResult.StatusColor = state.ButtonColor; + } + } + else + { + if (customStates != null && customStates.Count > 0) + { + var state = customStates.Select(state => state.Details.FirstOrDefault(x => x.CustomStateDetailId == unitLog.State)).FirstOrDefault(detail => detail != null); + + if (state != null) + { + eventResult.StatusText = state.ButtonText; + eventResult.StatusColor = state.ButtonColor; + } + } + } + + if (String.IsNullOrWhiteSpace(eventResult.StatusText)) + eventResult.StatusText = "Unknown"; + + if (String.IsNullOrWhiteSpace(eventResult.StatusColor)) + eventResult.StatusColor = "#ffa500"; + + result.Data.Activity.Add(eventResult); + } + + foreach (var dispatch in call.Dispatches) + { + var eventResult = new DispatchedEventResultData(); + eventResult.Id = dispatch.UserId; + if (dispatch.LastDispatchedOn.HasValue) + { + eventResult.Timestamp = dispatch.LastDispatchedOn.Value; + } + eventResult.Type = "User"; + + var name = names.FirstOrDefault(x => x.UserId == dispatch.UserId); + if (name != null) + { + eventResult.Name = name.Name; + + if (name.DepartmentGroupId.HasValue) + { + eventResult.GroupId = name.DepartmentGroupId.Value.ToString(); + eventResult.Group = name.DepartmentGroupName; + } + } + else + { + eventResult.Name = "Unknown User"; + } + + result.Data.Dispatches.Add(eventResult); + } + + if (call.GroupDispatches != null && call.GroupDispatches.Any()) + { + foreach (var groupDispatch in call.GroupDispatches) + { + var eventResult = new DispatchedEventResultData(); + eventResult.Id = groupDispatch.DepartmentGroupId.ToString(); + if (groupDispatch.LastDispatchedOn.HasValue) + { + eventResult.Timestamp = groupDispatch.LastDispatchedOn.Value; + } + eventResult.Type = "Group"; + + var name = groups.FirstOrDefault(x => x.DepartmentGroupId == groupDispatch.DepartmentGroupId); + if (name != null) + { + eventResult.Name = name.Name; + eventResult.GroupId = name.DepartmentGroupId.ToString(); + eventResult.Group = name.Name; + + } + else + { + eventResult.Name = "Unknown Group"; + } + + result.Data.Dispatches.Add(eventResult); + } + } + + if (call.UnitDispatches != null && call.UnitDispatches.Any()) + { + foreach (var unitDispatch in call.UnitDispatches) + { + var eventResult = new DispatchedEventResultData(); + eventResult.Id = unitDispatch.UnitId.ToString(); + if (unitDispatch.LastDispatchedOn.HasValue) + { + eventResult.Timestamp = unitDispatch.LastDispatchedOn.Value; + } + eventResult.Type = "Unit"; + + var unit = units.FirstOrDefault(x => x.UnitId == unitDispatch.UnitId); + if (unit != null) + { + eventResult.Name = unit.Name; + + if (unit.StationGroupId.HasValue) + { + var group = groups.FirstOrDefault(x => x.DepartmentGroupId == unit.StationGroupId.GetValueOrDefault()); + if (group != null) + { + eventResult.GroupId = group.DepartmentGroupId.ToString(); + eventResult.Group = group.Name; + + } + } + + } + else + { + eventResult.Name = "Unknown Unit"; + } + + result.Data.Dispatches.Add(eventResult); + } + } + + if (call.RoleDispatches != null && call.RoleDispatches.Any()) + { + foreach (var roleDispatch in call.RoleDispatches) + { + var eventResult = new DispatchedEventResultData(); + eventResult.Id = roleDispatch.RoleId.ToString(); + if (roleDispatch.LastDispatchedOn.HasValue) + { + eventResult.Timestamp = roleDispatch.LastDispatchedOn.Value; + } + eventResult.Type = "Role"; + + var role = roles.FirstOrDefault(x => x.PersonnelRoleId == roleDispatch.RoleId); + if (role != null) + { + eventResult.Name = role.Name; + } + else + { + eventResult.Name = "Unknown Role"; + } + + result.Data.Dispatches.Add(eventResult); + } + } + + if (call.Protocols != null && call.Protocols.Any()) + { + foreach (var callProtocol in call.Protocols) + { + var protocol = await _protocolsService.GetProtocolByIdAsync(callProtocol.CallProtocolId); + + if (protocol != null) + result.Data.Protocols.Add(CallProtocolsController.ConvertProtocolData(protocol)); + } + } + + result.PageSize = 0; + result.Status = ResponseHelper.Success; + + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Saves a call in the Resgrid system + /// + /// + /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// + [HttpPost("SaveCall")] + [Consumes(MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [Authorize(Policy = ResgridResources.Call_Create)] + public async Task> SaveCall([FromBody] NewCallInput newCallInput, CancellationToken cancellationToken) + { + var result = new SaveCallResult(); + + var canDoOperation = await _authorizationService.CanUserCreateCallAsync(UserId, DepartmentId); + + if (!canDoOperation) + return Unauthorized(); + + if (!ModelState.IsValid) + return BadRequest(); + + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + var activeUsers = await _departmentsService.GetAllMembersForDepartmentAsync(DepartmentId); + var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId); + var roles = await _personnelRolesService.GetAllRolesForDepartmentAsync(DepartmentId); + var units = await _unitsService.GetUnitsForDepartmentAsync(DepartmentId); + + var call = new Call + { + DepartmentId = DepartmentId, + ReportingUserId = UserId, + Priority = newCallInput.Priority, + Name = newCallInput.Name, + NatureOfCall = newCallInput.Nature + }; + + if (!string.IsNullOrWhiteSpace(newCallInput.ContactName)) + call.ContactName = newCallInput.ContactName; + + if (!string.IsNullOrWhiteSpace(newCallInput.ContactInfo)) + call.ContactNumber = newCallInput.ContactInfo; + + if (!string.IsNullOrWhiteSpace(newCallInput.ExternalId)) + call.ExternalIdentifier = newCallInput.ExternalId; + + if (!string.IsNullOrWhiteSpace(newCallInput.IncidentId)) + call.IncidentNumber = newCallInput.IncidentId; + + if (!string.IsNullOrWhiteSpace(newCallInput.ReferenceId)) + call.ReferenceNumber = newCallInput.ReferenceId; + + if (!string.IsNullOrWhiteSpace(newCallInput.Address)) + call.Address = newCallInput.Address; + + if (!string.IsNullOrWhiteSpace(newCallInput.What3Words)) + call.W3W = newCallInput.What3Words; + + if (!string.IsNullOrWhiteSpace(newCallInput.CallFormData)) + call.CallFormData = newCallInput.CallFormData; + + if (newCallInput.DispatchOn.HasValue) + { + call.DispatchOn = DateTimeHelpers.ConvertToUtc(newCallInput.DispatchOn.Value, department.TimeZone); + call.HasBeenDispatched = false; + } + + if (!string.IsNullOrWhiteSpace(newCallInput.Note)) + call.Notes = newCallInput.Note; + + if (!string.IsNullOrWhiteSpace(newCallInput.Geolocation)) + call.GeoLocationData = newCallInput.Geolocation; + + if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.Address) && call.GeoLocationData.Length > 1) + call.GeoLocationData = await _geoLocationProvider.GetLatLonFromAddress(call.Address); + + if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.W3W)) + { + var coords = await _geoLocationProvider.GetCoordinatesFromW3WAsync(call.W3W); + + if (coords != null) + { + call.GeoLocationData = $"{coords.Latitude},{coords.Longitude}"; + } + } + + call.LoggedOn = DateTime.UtcNow; + + if (!String.IsNullOrWhiteSpace(newCallInput.Type) && newCallInput.Type != "No Type") + { + var callTypes = await _callsService.GetCallTypesForDepartmentAsync(DepartmentId); + var type = callTypes.FirstOrDefault(x => x.Type == newCallInput.Type); + + if (type != null) + { + call.Type = type.Type; + } + } + var users = await _departmentsService.GetAllUsersForDepartmentAsync(DepartmentId); + call.Dispatches = new Collection(); + call.GroupDispatches = new List(); + call.RoleDispatches = new List(); + + if (newCallInput.DispatchList == "0") + { + // Use case, existing clients and non-ionic2 app this will be null dispatch all users. Or we've specified everyone (0). + foreach (var u in users) + { + var cd = new CallDispatch { UserId = u.UserId }; + + call.Dispatches.Add(cd); + } + } + else + { + var dispatch = newCallInput.DispatchList.Split(char.Parse("|")); + + try + { + var usersToDispatch = dispatch.Where(x => x.StartsWith("P:")).Select(y => y.Replace("P:", "")); + foreach (var user in usersToDispatch) + { + if (activeUsers.Any(x => x.UserId == user && x.IsDeleted == false && x.IsDisabled == false)) + { + var cd = new CallDispatch { UserId = user }; + call.Dispatches.Add(cd); + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + + try + { + var groupsToDispatch = dispatch.Where(x => x.StartsWith("G:")).Select(y => int.Parse(y.Replace("G:", ""))); + foreach (var group in groupsToDispatch) + { + if (groups.Any(x => x.DepartmentGroupId == group)) + { + var cd = new CallDispatchGroup { DepartmentGroupId = group }; + call.GroupDispatches.Add(cd); + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + + try + { + var rolesToDispatch = dispatch.Where(x => x.StartsWith("R:")).Select(y => int.Parse(y.Replace("R:", ""))); + foreach (var role in rolesToDispatch) + { + if (roles.Any(x => x.PersonnelRoleId == role)) + { + var cd = new CallDispatchRole { RoleId = role }; + call.RoleDispatches.Add(cd); + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + + try + { + var unitsToDispatch = dispatch.Where(x => x.StartsWith("U:")).Select(y => int.Parse(y.Replace("U:", ""))); + foreach (var unit in unitsToDispatch) + { + if (units.Any(x => x.UnitId == unit)) + { + var cdu = new CallDispatchUnit { UnitId = unit }; + call.UnitDispatches.Add(cdu); + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + } + + // Call is in the past or is now, were dispatching now (at the end of this func) + if (call.DispatchOn.HasValue && call.DispatchOn.Value <= DateTime.UtcNow) + call.HasBeenDispatched = true; + + var savedCall = await _callsService.SaveCallAsync(call, cancellationToken); + + //OutboundEventProvider handler = new OutboundEventProvider.CallAddedTopicHandler(); + //OutboundEventProvider..Handle(new CallAddedEvent() { DepartmentId = DepartmentId, Call = savedCall }); + _eventAggregator.SendMessage(new CallAddedEvent() { DepartmentId = DepartmentId, Call = savedCall }); + + var profiles = new List(); + + if (call.Dispatches != null && call.Dispatches.Any()) + { + profiles.AddRange(call.Dispatches.Select(x => x.UserId).ToList()); + } + + if (call.GroupDispatches != null && call.GroupDispatches.Any()) + { + foreach (var groupDispatch in call.GroupDispatches) + { + var group = await _departmentGroupsService.GetGroupByIdAsync(groupDispatch.DepartmentGroupId); + + if (group != null && group.Members != null) + { + profiles.AddRange(group.Members.Select(x => x.UserId)); + } + } + } + + if (call.RoleDispatches != null && call.RoleDispatches.Any()) + { + foreach (var roleDispatch in call.RoleDispatches) + { + var members = await _personnelRolesService.GetAllMembersOfRoleAsync(roleDispatch.RoleId); + + if (members != null) + { + profiles.AddRange(members.Select(x => x.UserId).ToList()); + } + } + } + + var cqi = new CallQueueItem(); + cqi.Call = savedCall; + + if (profiles.Any()) + cqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(profiles); + + if (!savedCall.DispatchOn.HasValue || savedCall.DispatchOn.Value <= DateTime.UtcNow) + await _queueService.EnqueueCallBroadcastAsync(cqi, cancellationToken); + + result.Id = savedCall.CallId.ToString(); + result.PageSize = 0; + result.Status = ResponseHelper.Created; + + ResponseHelper.PopulateV4ResponseData(result); + + return CreatedAtAction("GetCall", new { callId = result.Id }, result); + } + + /// + /// Updates an existing Active Call in the Resgrid system + /// + /// Data to updated the call + /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// OK status code if successful + [HttpPut("EditCall")] + [Consumes(MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [Authorize(Policy = ResgridResources.Call_Update)] + public async Task> EditCall([FromBody] EditCallInput editCallInput, CancellationToken cancellationToken) + { + var result = new EditCallResult(); + + var canDoOperation = await _authorizationService.CanUserEditCallAsync(UserId, int.Parse(editCallInput.Id)); + + if (!canDoOperation) + return Unauthorized(); + + var call = await _callsService.GetCallByIdAsync(int.Parse(editCallInput.Id)); + + call = await _callsService.PopulateCallData(call, true, true, true, true, true, true, true); + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + + if (call == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + if (!ModelState.IsValid) + return BadRequest(); + + if (call.DepartmentId != DepartmentId) + return Unauthorized(); + + if (call.State != (int)CallStates.Active) + return BadRequest(); + + var activeUsers = await _departmentsService.GetAllMembersForDepartmentAsync(DepartmentId); + var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId); + var roles = await _personnelRolesService.GetAllRolesForDepartmentAsync(DepartmentId); + var units = await _unitsService.GetUnitsForDepartmentAsync(DepartmentId); + + call.Priority = editCallInput.Priority; + call.Name = editCallInput.Name; + call.NatureOfCall = editCallInput.Nature; + + if (!string.IsNullOrWhiteSpace(editCallInput.ContactName)) + call.ContactName = editCallInput.ContactName; + + if (!string.IsNullOrWhiteSpace(editCallInput.ContactInfo)) + call.ContactNumber = editCallInput.ContactInfo; + + if (!string.IsNullOrWhiteSpace(editCallInput.ExternalId)) + call.ExternalIdentifier = editCallInput.ExternalId; + + if (!string.IsNullOrWhiteSpace(editCallInput.IncidentId)) + call.IncidentNumber = editCallInput.IncidentId; + + if (!string.IsNullOrWhiteSpace(editCallInput.ReferenceId)) + call.ReferenceNumber = editCallInput.ReferenceId; + + if (!string.IsNullOrWhiteSpace(editCallInput.Address)) + call.Address = editCallInput.Address; + + if (!string.IsNullOrWhiteSpace(editCallInput.What3Words)) + call.W3W = editCallInput.What3Words; + + if (!string.IsNullOrWhiteSpace(editCallInput.CallFormData)) + call.CallFormData = editCallInput.CallFormData; + + if (editCallInput.DispatchOn.HasValue) + { + call.DispatchOn = DateTimeHelpers.ConvertToUtc(editCallInput.DispatchOn.Value, department.TimeZone); + call.HasBeenDispatched = false; + } + + if (!string.IsNullOrWhiteSpace(editCallInput.Note)) + call.Notes = editCallInput.Note; + + if (!string.IsNullOrWhiteSpace(editCallInput.Geolocation)) + call.GeoLocationData = editCallInput.Geolocation; + + if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.Address) && call.GeoLocationData.Length > 1) + call.GeoLocationData = await _geoLocationProvider.GetLatLonFromAddress(call.Address); + + if (string.IsNullOrWhiteSpace(call.GeoLocationData) && !string.IsNullOrWhiteSpace(call.W3W)) + { + var coords = await _geoLocationProvider.GetCoordinatesFromW3WAsync(call.W3W); + + if (coords != null) + { + call.GeoLocationData = $"{coords.Latitude},{coords.Longitude}"; + } + } + + if (!String.IsNullOrWhiteSpace(editCallInput.Type) && editCallInput.Type != "No Type") + { + var callTypes = await _callsService.GetCallTypesForDepartmentAsync(DepartmentId); + var type = callTypes.FirstOrDefault(x => x.Type == editCallInput.Type); + + if (type != null) + { + call.Type = type.Type; + } + } + + if (string.IsNullOrWhiteSpace(editCallInput.DispatchList) || editCallInput.DispatchList == "0") + { + if (call.Dispatches == null) + call.Dispatches = new List(); + + if (call.GroupDispatches == null) + call.GroupDispatches = new List(); + + if (call.RoleDispatches == null) + call.RoleDispatches = new List(); + + if (call.UnitDispatches == null) + call.UnitDispatches = new List(); + + var users = await _departmentsService.GetAllUsersForDepartmentAsync(DepartmentId); + // Use case, existing clients and non-ionic2 app this will be null dispatch all users. Or we've specified everyone (0). + foreach (var u in users) + { + var cd = new CallDispatch { UserId = u.UserId }; + + call.Dispatches.Add(cd); + } + } + else + { + var dispatch = editCallInput.DispatchList.Split(char.Parse("|")); + var usersToDispatch = dispatch.Where(x => x.StartsWith("P:")).Select(y => y.Replace("P:", "")); + var groupsToDispatch = dispatch.Where(x => x.StartsWith("G:")).Select(y => int.Parse(y.Replace("G:", ""))); + var rolesToDispatch = dispatch.Where(x => x.StartsWith("R:")).Select(y => int.Parse(y.Replace("R:", ""))); + var unitsToDispatch = dispatch.Where(x => x.StartsWith("U:")).Select(y => int.Parse(y.Replace("U:", ""))); + + try + { + if (call.Dispatches == null) + call.Dispatches = new List(); + + var dispatchesToRemove = call.Dispatches.Select(x => x.UserId).Where(y => !usersToDispatch.Contains(y)).ToList(); + + foreach (var userId in dispatchesToRemove) + { + var item = call.Dispatches.First(x => x.UserId == userId); + call.Dispatches.Remove(item); + } + + foreach (var user in usersToDispatch) + { + if (!call.Dispatches.Any(x => x.UserId == user)) + { + if (activeUsers.Any(x => x.UserId == user && x.IsDeleted == false && x.IsDisabled == false)) + { + var cd = new CallDispatch { CallId = call.CallId, UserId = user }; + call.Dispatches.Add(cd); + } + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + + try + { + if (call.GroupDispatches == null) + call.GroupDispatches = new List(); + + var dispatchesToRemove = call.GroupDispatches.Select(x => x.DepartmentGroupId).Where(y => !groupsToDispatch.Contains(y)).ToList(); + + foreach (var id in dispatchesToRemove) + { + call.GroupDispatches.Remove(call.GroupDispatches.First(x => x.DepartmentGroupId == id)); + } + + foreach (var group in groupsToDispatch) + { + if (!call.GroupDispatches.Any(x => x.DepartmentGroupId == group)) + { + if (groups.Any(x => x.DepartmentGroupId == group)) + { + var cdg = new CallDispatchGroup { CallId = call.CallId, DepartmentGroupId = group }; + call.GroupDispatches.Add(cdg); + } + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + + try + { + if (call.RoleDispatches == null) + call.RoleDispatches = new List(); + + var dispatchesToRemove = call.RoleDispatches.Select(x => x.RoleId).Where(y => !rolesToDispatch.Contains(y)).ToList(); + + foreach (var id in dispatchesToRemove) + { + call.RoleDispatches.Remove(call.RoleDispatches.First(x => x.RoleId == id)); + } + + foreach (var role in rolesToDispatch) + { + if (!call.RoleDispatches.Any(x => x.RoleId == role)) + { + if (roles.Any(x => x.PersonnelRoleId == role)) + { + var cdr = new CallDispatchRole { CallId = call.CallId, RoleId = role }; + call.RoleDispatches.Add(cdr); + } + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + + try + { + if (call.UnitDispatches == null) + call.UnitDispatches = new List(); + + var dispatchesToRemove = call.UnitDispatches.Select(x => x.UnitId).Where(y => !unitsToDispatch.Contains(y)).ToList(); + + foreach (var id in dispatchesToRemove) + { + call.UnitDispatches.Remove(call.UnitDispatches.First(x => x.UnitId == id)); + } + + foreach (var unit in unitsToDispatch) + { + if (!call.UnitDispatches.Any(x => x.UnitId == unit)) + { + if (units.Any(x => x.UnitId == unit)) + { + var cdu = new CallDispatchUnit { CallId = call.CallId, UnitId = unit }; + call.UnitDispatches.Add(cdu); + } + } + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + } + + // Call is in the past or is now, were dispatching now (at the end of this func) + if (call.DispatchOn.HasValue && call.DispatchOn.Value <= DateTime.UtcNow) + call.HasBeenDispatched = true; + + await _callsService.SaveCallAsync(call, cancellationToken); + + if (editCallInput.RebroadcastCall) + { + var cqi = new CallQueueItem(); + cqi.Call = call; + + // If we have any group, unit or role dispatches just bet the farm and all all profiles for now. + if (cqi.Call.GroupDispatches.Any() || cqi.Call.UnitDispatches.Any() || cqi.Call.RoleDispatches.Any()) + cqi.Profiles = (await _userProfileService.GetAllProfilesForDepartmentAsync(DepartmentId)).Select(x => x.Value).ToList(); + else if (cqi.Call.Dispatches != null && cqi.Call.Dispatches.Any()) + cqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(cqi.Call.Dispatches.Select(x => x.UserId).ToList()); + else + cqi.Profiles = new List(); + + + if (cqi.Call.Dispatches.Any() || cqi.Call.GroupDispatches.Any() || cqi.Call.UnitDispatches.Any() || cqi.Call.RoleDispatches.Any()) + await _queueService.EnqueueCallBroadcastAsync(cqi, cancellationToken); + } + + _eventAggregator.SendMessage(new CallAddedEvent() { DepartmentId = DepartmentId, Call = call }); + + result.Id = call.CallId.ToString(); + result.PageSize = 0; + result.Status = ResponseHelper.Updated; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Updates a call's scheduled dispatch time if it has not been dispatched + /// + /// Data to update + /// + [HttpPut("UpdateScheduledDispatchTime")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [Authorize(Policy = ResgridResources.Call_Update)] + public async Task> UpdateScheduledDispatchTime(UpdateDispatchTimeInput input) + { + var result = new UpdateScheduledDispatchTimeResult(); + var canDoOperation = await _authorizationService.CanUserEditCallAsync(UserId, int.Parse(input.Id)); + + if (!canDoOperation) + return Unauthorized(); + + if (!ModelState.IsValid) + return BadRequest(); + + var call = await _callsService.GetCallByIdAsync(int.Parse(input.Id)); + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + + if (call == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + if (call.DepartmentId != DepartmentId) + return Unauthorized(); + + if (call.HasBeenDispatched.HasValue && call.HasBeenDispatched.Value) + return BadRequest(); + + call.DispatchOn = DateTimeHelpers.ConvertToUtc(input.Date, department.TimeZone); + call.HasBeenDispatched = false; + + var savedCall = await _callsService.SaveCallAsync(call); + + result.Id = savedCall.CallId.ToString(); + result.PageSize = 0; + result.Status = ResponseHelper.Updated; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Deletes a call + /// + /// ID of the call + /// + [HttpDelete("DeleteCall")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [Authorize(Policy = ResgridResources.Call_Delete)] + public async Task> DeleteCall(string callId) + { + var result = new DeleteCallResult(); + + if (String.IsNullOrWhiteSpace(callId)) + return BadRequest(); + + var call = await _callsService.GetCallByIdAsync(int.Parse(callId)); + + if (call == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + var canDoOperation = await _authorizationService.CanUserEditCallAsync(UserId, int.Parse(callId)); + + if (!canDoOperation) + return Unauthorized(); + + if (call.DepartmentId != DepartmentId) + return Unauthorized(); + + if (call.HasBeenDispatched.HasValue && call.HasBeenDispatched.Value) + return BadRequest(); + + call.IsDeleted = true; + var savedCall = await _callsService.SaveCallAsync(call); + + result.Id = savedCall.CallId.ToString(); + result.PageSize = 0; + result.Status = ResponseHelper.Deleted; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Closes a Resgrid call + /// + /// Data to close a call + /// The cancellation token that can be used by other objects or threads to receive notice of cancellation. + /// OK status code if successful + [HttpPut("CloseCall")] + [Consumes(MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [Authorize(Policy = ResgridResources.Call_Update)] + public async Task> CloseCall([FromBody] CloseCallInput closeCallInput, CancellationToken cancellationToken) + { + var result = new CloseCallResult(); + + if (!ModelState.IsValid) + return BadRequest(); + + var call = await _callsService.GetCallByIdAsync(int.Parse(closeCallInput.Id)); + + if (call == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + var canDoOperation = await _authorizationService.CanUserEditCallAsync(UserId, int.Parse(closeCallInput.Id)); + + if (!canDoOperation) + return Unauthorized(); + + if (call.DepartmentId != DepartmentId) + return Unauthorized(); + + call.ClosedByUserId = UserId; + call.ClosedOn = DateTime.UtcNow; + call.CompletedNotes = closeCallInput.Notes; + call.State = closeCallInput.Type; + + var savedCall = await _callsService.SaveCallAsync(call, cancellationToken); + + _eventAggregator.SendMessage(new CallAddedEvent() { DepartmentId = DepartmentId, Call = call }); + + result.Id = savedCall.CallId.ToString(); + result.PageSize = 0; + result.Status = ResponseHelper.Updated; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Returns all the non-dispatched (pending) scheduled calls for the department + /// + /// Array of CallResult objects for each active call in the department + [HttpGet("GetAllPendingScheduledCalls")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetAllPendingScheduledCalls() + { + var result = new ScheduledCallsResult(); + + var calls = (await _callsService.GetAllNonDispatchedScheduledCallsByDepartmentIdAsync(DepartmentId)).OrderBy(x => x.DispatchOn); + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId, false); + + if (calls != null && calls.Any()) + { + foreach (var c in calls) + { + string address = ""; + if (String.IsNullOrWhiteSpace(c.Address) && !String.IsNullOrWhiteSpace(c.GeoLocationData) && c.GeoLocationData.Length > 1) + { + var geo = c.GeoLocationData.Split(char.Parse(",")); + + if (geo.Length == 2) + address = await _geoLocationProvider.GetAddressFromLatLong(double.Parse(geo[0]), double.Parse(geo[1])); + } + else + address = c.Address; + + result.Data.Add(ConvertCall(c, null, address, TimeZone)); + } + result.PageSize = result.Data.Count(); + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + return Ok(result); + } + + + + public static CallResultData ConvertCall(Call call, List protocol, string geoLocationAddress, string timeZone) + { + var callResult = new CallResultData(); + + callResult.CallId = call.CallId.ToString(); + callResult.Priority = call.Priority; + callResult.Name = StringHelpers.SanitizeHtmlInString(call.Name); + + if (!String.IsNullOrWhiteSpace(call.NatureOfCall)) + callResult.Nature = StringHelpers.SanitizeHtmlInString(call.NatureOfCall); + + if (!String.IsNullOrWhiteSpace(call.Notes)) + callResult.Note = StringHelpers.SanitizeHtmlInString(call.Notes); + + if (call.CallNotes != null) + callResult.NotesCount = call.CallNotes.Count(); + else + callResult.NotesCount = 0; + + if (call.Attachments != null) + { + callResult.AudioCount = call.Attachments.Count(x => x.CallAttachmentType == (int)CallAttachmentTypes.DispatchAudio); + callResult.ImgagesCount = call.Attachments.Count(x => x.CallAttachmentType == (int)CallAttachmentTypes.Image); + callResult.FileCount = call.Attachments.Count(x => x.CallAttachmentType == (int)CallAttachmentTypes.File); + } + else + { + callResult.AudioCount = 0; + callResult.ImgagesCount = 0; + callResult.FileCount = 0; + } + + if (!String.IsNullOrWhiteSpace(geoLocationAddress)) + callResult.Address = geoLocationAddress; + else + callResult.Address = call.Address; + + callResult.Geolocation = call.GeoLocationData; + callResult.LoggedOn = call.LoggedOn.TimeConverter(new Department() { TimeZone = timeZone }); + callResult.LoggedOnUtc = call.LoggedOn; + callResult.State = call.State; + callResult.Number = call.Number; + + if (call.DispatchOn.HasValue) + { + callResult.DispatchedOnUtc = call.DispatchOn.Value; + callResult.DispatchedOn = call.DispatchOn.Value.TimeConverter(new Department() { TimeZone = timeZone }); + } + + callResult.What3Words = call.W3W; + callResult.ContactName = call.ContactName; + callResult.ContactInfo = call.ContactNumber; + callResult.ReferenceId = call.ReferenceNumber; + callResult.ExternalId = call.ExternalIdentifier; + callResult.IncidentId = call.IncidentNumber; + + callResult.Protocols = new List(); + if (protocol != null && protocol.Any()) + { + foreach (var callProtocol in protocol) + { + callResult.Protocols.Add(CallProtocolsController.ConvertProtocolData(callProtocol)); + } + } + + return callResult; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/ConnectController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/ConnectController.cs new file mode 100644 index 00000000..0af0e0a7 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/ConnectController.cs @@ -0,0 +1,207 @@ +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using OpenIddict.Abstractions; +using OpenIddict.Server.AspNetCore; +using Resgrid.Model.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; +using static OpenIddict.Abstractions.OpenIddictConstants; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Service to generate an authentication token that is required to communicate with all other v4 services + /// +#if (!DEBUG && !DOCKER) + //[RequireHttps] +#endif + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiController] + [ApiExplorerSettings(GroupName = "v4")] + public class ConnectController : ControllerBase + { + private readonly SignInManager _signInManager; + private readonly UserManager _userManager; + private readonly IUsersService _usersService; + private readonly IUserProfileService _userProfileService; + private readonly IDepartmentsService _departmentsService; + + public ConnectController( + IUsersService usersService, + IUserProfileService userProfileService, + IDepartmentsService departmentsService, + SignInManager signInManager, + UserManager userManager + ) + { + _usersService = usersService; + _userProfileService = userProfileService; + _departmentsService = departmentsService; + _signInManager = signInManager; + _userManager = userManager; + } + + /// + /// Generates a token that is then used for subsquent requests to the API. + /// + /// ValidateResult object, with IsValid set if the settings are correct + [HttpPost("token")] + [AllowAnonymous] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [Produces("application/json")] + public async Task Token() + { + var request = HttpContext.GetOpenIddictServerRequest(); + if (request != null && request.IsPasswordGrantType()) + { + var user = await _userManager.FindByNameAsync(request.Username); + if (user == null) + { + var properties = new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = Errors.InvalidGrant, + [OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = + "The username or password is invalid." + }); + + return Forbid(properties, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); + } + + // Validate the username/password parameters and ensure the account is not locked out. + var result = await _signInManager.CheckPasswordSignInAsync(user, request.Password, lockoutOnFailure: false); + if (!result.Succeeded) + { + var properties = new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = Errors.InvalidGrant, + [OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = + "The username or password is invalid." + }); + + return Forbid(properties, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); + } + + // Create a new ClaimsPrincipal containing the claims that + // will be used to create an id_token, a token or a code. + var principal = await _signInManager.CreateUserPrincipalAsync(user); + + // Set the list of scopes granted to the client application. + // Note: the offline_access scope must be granted + // to allow OpenIddict to return a refresh token. + principal.SetScopes(new[] + { + Scopes.OpenId, + Scopes.Email, + Scopes.Profile, + Scopes.OfflineAccess, + Scopes.Roles + }.Intersect(request.GetScopes())); + + foreach (var claim in principal.Claims) + { + claim.SetDestinations(GetDestinations(claim, principal)); + } + + return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); + } + + else if (request != null && request.IsRefreshTokenGrantType()) + { + // Retrieve the claims principal stored in the refresh token. + var info = await HttpContext.AuthenticateAsync(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); + + // Retrieve the user profile corresponding to the refresh token. + // Note: if you want to automatically invalidate the refresh token + // when the user password/roles change, use the following line instead: + // var user = _signInManager.ValidateSecurityStampAsync(info.Principal); + var user = await _userManager.GetUserAsync(info.Principal); + if (user == null) + { + var properties = new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = Errors.InvalidGrant, + [OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = "The refresh token is no longer valid." + }); + + return Forbid(properties, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); + } + + // Ensure the user is still allowed to sign in. + if (!await _signInManager.CanSignInAsync(user)) + { + var properties = new AuthenticationProperties(new Dictionary + { + [OpenIddictServerAspNetCoreConstants.Properties.Error] = Errors.InvalidGrant, + [OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = "The user is no longer allowed to sign in." + }); + + return Forbid(properties, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); + } + + // Create a new ClaimsPrincipal containing the claims that + // will be used to create an id_token, a token or a code. + var principal = await _signInManager.CreateUserPrincipalAsync(user); + + foreach (var claim in principal.Claims) + { + claim.SetDestinations(GetDestinations(claim, principal)); + } + + return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); + } + + throw new NotImplementedException("The specified grant type is not implemented."); + } + + private IEnumerable GetDestinations(Claim claim, ClaimsPrincipal principal) + { + // Note: by default, claims are NOT automatically included in the access and identity tokens. + // To allow OpenIddict to serialize them, you must attach them a destination, that specifies + // whether they should be included in access tokens, in identity tokens or in both. + + switch (claim.Type) + { + case Claims.Name: + yield return Destinations.AccessToken; + + if (principal.HasScope(Scopes.Profile)) + yield return Destinations.IdentityToken; + + yield break; + + case Claims.Email: + yield return Destinations.AccessToken; + + if (principal.HasScope(Scopes.Email)) + yield return Destinations.IdentityToken; + + yield break; + + case Claims.Role: + yield return Destinations.AccessToken; + + if (principal.HasScope(Scopes.Roles)) + yield return Destinations.IdentityToken; + + yield break; + + // Never include the security stamp in the access and identity tokens, as it's a secret value. + case "AspNet.Identity.SecurityStamp": yield break; + + default: + yield return Destinations.AccessToken; + yield break; + } + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/CustomStatusesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CustomStatusesController.cs new file mode 100644 index 00000000..dadfea39 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/CustomStatusesController.cs @@ -0,0 +1,90 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Linq; +using System.Threading.Tasks; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.CustomStatuses; +using Resgrid.Model; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Custom statuses + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class CustomStatusesController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly ICustomStateService _customStateService; + + public CustomStatusesController(ICustomStateService customStateService) + { + _customStateService = customStateService; + } + #endregion Members and Constructors + + /// + /// All custom statuses for a department + /// + /// + [HttpGet("GetAllCustomStatuses")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetAllCustomStatuses() + { + var result = new CustomStatusesResult(); + var customStates = await _customStateService.GetAllActiveCustomStatesForDepartmentAsync(DepartmentId); + + if (customStates != null && customStates.Any()) + { + foreach (var customState in customStates) + { + if (customState.IsDeleted) + continue; + + foreach (var stateDetail in customState.GetActiveDetails()) + { + if (stateDetail.IsDeleted) + continue; + + result.Data.Add(ConvertCustomStatusData(customState, stateDetail)); + } + + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + public static CustomStatusResultData ConvertCustomStatusData(CustomState customState, CustomStateDetail stateDetail) + { + var customStateResult = new CustomStatusResultData(); + customStateResult.Id = stateDetail.CustomStateDetailId.ToString(); + customStateResult.Type = customState.Type; + customStateResult.StateId = stateDetail.CustomStateId.ToString(); + customStateResult.Text = stateDetail.ButtonText; + customStateResult.BColor = stateDetail.ButtonColor; + customStateResult.Color = stateDetail.TextColor; + customStateResult.Gps = stateDetail.GpsRequired; + customStateResult.Note = stateDetail.NoteType; + customStateResult.Detail = stateDetail.DetailType; + + return customStateResult; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/DevicesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/DevicesController.cs new file mode 100644 index 00000000..b92b7526 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/DevicesController.cs @@ -0,0 +1,125 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using System.Threading.Tasks; +using Resgrid.Model; +using System; +using System.Web; +using Resgrid.Model.Providers; +using Resgrid.Web.Services.Models.v4.Device; +using Resgrid.Web.Services.Helpers; +using Resgrid.Model.Events; +using Resgrid.Framework; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Mobile or Tablet Device specific operations + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class DevicesController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IPushService _pushService; + private readonly ICqrsProvider _cqrsProvider; + + public DevicesController(IPushService pushService, ICqrsProvider cqrsProvider) + { + _pushService = pushService; + _cqrsProvider = cqrsProvider; + } + #endregion Members and Constructors + + /// + /// Register a unit device to receive push notification from the Resgrid system + /// + /// Input to create the registration for + /// Result for the registration + [HttpPost("RegisterUnitDevice")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + public async Task> RegisterUnitDevice([FromBody] PushRegistrationInput registrationInput) + { + var result = new PushRegistrationResult(); + + if (this.ModelState.IsValid) + { + try + { + if (registrationInput == null) + return BadRequest(); + + PushRegisterionEvent pushRegisterionEvent = new PushRegisterionEvent(); + pushRegisterionEvent.PushUriId = 0; + pushRegisterionEvent.UserId = UserId; + pushRegisterionEvent.PlatformType = registrationInput.Platform; + pushRegisterionEvent.PushLocation = ""; + pushRegisterionEvent.DepartmentId = DepartmentId; + pushRegisterionEvent.DeviceId = registrationInput.Token; + pushRegisterionEvent.Uuid = registrationInput.DeviceUuid; + + if (!String.IsNullOrWhiteSpace(registrationInput.UnitId) && registrationInput.UnitId != "0") + pushRegisterionEvent.UnitId = int.Parse(registrationInput.UnitId); + + CqrsEvent registerUnitPushEvent = new CqrsEvent(); + registerUnitPushEvent.Type = (int)CqrsEventTypes.UnitPushRegistration; + registerUnitPushEvent.Data = ObjectSerialization.Serialize(pushRegisterionEvent); + + await _cqrsProvider.EnqueueCqrsEventAsync(registerUnitPushEvent); + + result.Status = ResponseHelper.Queued; + } + catch (Exception ex) + { + result.Status = ResponseHelper.Failure; + Framework.Logging.LogException(ex); + + return result; + } + } + + result.Id = ""; + result.PageSize = 0; + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + + /// + /// Removed a Unit Push Notification support by PushUriId. + /// + /// Input to deregister the device for + /// + [HttpDelete("UnRegisterUnitDevice")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + public async Task> UnRegisterUnitDevice(string deviceUuid) + { + if (String.IsNullOrWhiteSpace(deviceUuid)) + return BadRequest(); + + var result = new PushRegistrationResult(); + + try + { + var deviceId = HttpUtility.UrlDecode(deviceUuid); + + await _pushService.UnRegisterUnit(new PushUri() { UserId = UserId, DeviceId = deviceId }); + result.Status = ResponseHelper.Success; + } + catch (Exception ex) + { + Framework.Logging.LogException(ex); + result.Status = ResponseHelper.Failure; + } + + result.Id = ""; + result.PageSize = 0; + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/DispatchController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/DispatchController.cs new file mode 100644 index 00000000..3daca49c --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/DispatchController.cs @@ -0,0 +1,600 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Resgrid.Web.Services.Models.v4.Forms; +using Resgrid.Web.Services.Helpers; +using Resgrid.Model.Providers; +using Resgrid.Web.Services.Models.v4.Personnel; +using Resgrid.Web.Services.Models.v4.Dispatch; +using Resgrid.Web.Services.Models.v4.Groups; +using Resgrid.Web.Services.Models.v4.Units; +using Resgrid.Web.Services.Models.v4.CallTypes; +using Resgrid.Web.Services.Models.v4.CallPriorities; +using Resgrid.Web.Services.Models.v4.Calls; +using Resgrid.Web.Services.Models.v4.Roles; +using Resgrid.Web.Services.Models.v4.CustomStatuses; +using Resgrid.Web.Services.Models.v4.UnitStatus; +using Resgrid.Model; +using Resgrid.Web.Services.Models.v4.UnitRoles; +using Resgrid.Web.Helpers; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// API Calls that are used for the Dispatch App + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class DispatchController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IUsersService _usersService; + private readonly IActionLogsService _actionLogsService; + private readonly IDepartmentsService _departmentsService; + private readonly IUserProfileService _userProfileService; + private readonly IUserStateService _userStateService; + private readonly IUnitsService _unitsService; + private readonly ICallsService _callsService; + private readonly IDepartmentGroupsService _departmentGroupsService; + private readonly IPersonnelRolesService _personnelRolesService; + private readonly ICustomStateService _customStateService; + private readonly IGeoLocationProvider _geoLocationProvider; + private readonly ICqrsProvider _cqrsProvider; + private readonly IDepartmentSettingsService _departmentSettingsService; + private readonly ITemplatesService _templatesService; + private readonly IFormsService _formsService; + + public DispatchController( + IUsersService usersService, + IActionLogsService actionLogsService, + IDepartmentsService departmentsService, + IUserProfileService userProfileService, + IUserStateService userStateService, + IUnitsService unitsService, + ICallsService callsService, + IDepartmentGroupsService departmentGroupsService, + IPersonnelRolesService personnelRolesService, + ICustomStateService customStateService, + IGeoLocationProvider geoLocationProvider, + ICqrsProvider cqrsProvider, + IDepartmentSettingsService departmentSettingsService, + ITemplatesService templatesService, + IFormsService formsService + ) + { + _usersService = usersService; + _actionLogsService = actionLogsService; + _departmentsService = departmentsService; + _userProfileService = userProfileService; + _userStateService = userStateService; + _unitsService = unitsService; + _callsService = callsService; + _departmentGroupsService = departmentGroupsService; + _personnelRolesService = personnelRolesService; + _customStateService = customStateService; + _geoLocationProvider = geoLocationProvider; + _cqrsProvider = cqrsProvider; + _departmentSettingsService = departmentSettingsService; + _templatesService = templatesService; + _formsService = formsService; + } + #endregion Members and Constructors + + /// + /// Gets all the information required to populate the New Call form + /// + /// + [HttpGet("GetNewCallData")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetNewCallData() + { + var mainResult = new NewCallFormResult(); + var result = new NewCallResultData(); + result.Personnel = new List(); + result.Groups = new List(); + result.Units = new List(); + result.Roles = new List(); + result.Statuses = new List(); + result.UnitStatuses = new List(); + result.UnitRoles = new List(); + result.Priorities = new List(); + result.CallTypes = new List(); + + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId, false); + var users = await _departmentsService.GetAllUsersForDepartmentAsync(DepartmentId); + var groups = await _departmentGroupsService.GetAllDepartmentGroupsForDepartmentAsync(DepartmentId); + var rolesForUsersInDepartment = await _personnelRolesService.GetAllRolesForUsersInDepartmentAsync(DepartmentId); + var allRoles = await _personnelRolesService.GetRolesForDepartmentAsync(DepartmentId); + var allProfiles = await _userProfileService.GetAllProfilesForDepartmentAsync(DepartmentId); + var allGroups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId); + var units = await _unitsService.GetUnitsForDepartmentAsync(DepartmentId); + var unitTypes = await _unitsService.GetUnitTypesForDepartmentAsync(DepartmentId); + var callPriorites = await _callsService.GetActiveCallPrioritiesForDepartmentAsync(DepartmentId); + var callTypes = await _callsService.GetCallTypesForDepartmentAsync(DepartmentId); + var activeCalls = await _callsService.GetActiveCallsByDepartmentAsync(DepartmentId); + + foreach (var user in users) + { + UserProfile profile = null; + if (allProfiles.ContainsKey(user.UserId)) + profile = allProfiles[user.UserId]; + + DepartmentGroup group = null; + if (groups.ContainsKey(user.UserId)) + group = groups[user.UserId]; + + List roles = null; + if (rolesForUsersInDepartment.ContainsKey(user.UserId)) + roles = rolesForUsersInDepartment[user.UserId]; + + var action = await _actionLogsService.GetLastActionLogForUserAsync(user.UserId, DepartmentId); + var userState = await _userStateService.GetLastUserStateByUserIdAsync(user.UserId); + + result.Personnel.Add(PersonnelController.ConvertPersonnelInfo(user, department, profile, group, roles, action, userState)); + } + + foreach (var group in allGroups) + { + result.Groups.Add(GroupsController.ConvertGroupData(group)); + } + + var unitStatuses = await _unitsService.GetAllLatestStatusForUnitsByDepartmentIdAsync(DepartmentId); + + foreach (var unit in units) + { + if (!string.IsNullOrWhiteSpace(unit.Type)) + { + var unitType = unitTypes.FirstOrDefault(x => x.Type == unit.Type); + + result.Units.Add(UnitsController.ConvertUnitsData(unit, unitStatuses.FirstOrDefault(x => x.UnitId == unit.UnitId), null, TimeZone)); + } + else + { + result.Units.Add(UnitsController.ConvertUnitsData(unit, unitStatuses.FirstOrDefault(x => x.UnitId == unit.UnitId), null, TimeZone)); + } + + // Add unit roles for this unit + var roles = await _unitsService.GetRolesForUnitAsync(unit.UnitId); + foreach (var role in roles) + { + result.UnitRoles.Add(UnitRolesController.ConvertUnitRoleData(role)); + } + } + + foreach (var us in unitStatuses) + { + var customState = await CustomStatesHelper.GetCustomUnitState(us); + var latestUnitLocation = await _unitsService.GetLatestUnitLocationAsync(us.UnitId, us.Timestamp); + + var group = allGroups.FirstOrDefault(x => x.DepartmentGroupId == us.Unit.StationGroupId); + result.UnitStatuses.Add(UnitStatusController.ConvertUnitStatusData(us.Unit, us, latestUnitLocation, customState, group, TimeZone, activeCalls, allGroups)); + } + + foreach (var role in allRoles) + { + result.Roles.Add(RolesController.ConvertRoleData(role)); + } + + var customStates = await _customStateService.GetAllActiveCustomStatesForDepartmentAsync(DepartmentId); + + foreach (var customState in customStates) + { + if (customState.IsDeleted) + continue; + + foreach (var stateDetail in customState.GetActiveDetails()) + { + if (stateDetail.IsDeleted) + continue; + + result.Statuses.Add(CustomStatusesController.ConvertCustomStatusData(customState, stateDetail)); + } + + } + + foreach (var priority in callPriorites) + { + result.Priorities.Add(CallPrioritiesController.ConvertPriorityData(priority)); + } + + if (callTypes != null && callTypes.Any()) + { + foreach (var callType in callTypes) + { + result.CallTypes.Add(CallTypesController.ConvertTypeData(callType)); + } + } + + mainResult.Data = result; + + return mainResult; + } + + /// + /// + /// + /// + /// + [HttpGet("GetSetUnitStatusData")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetSetUnitStatusData(string unitId) + { + var result = new GetSetUnitStateResult(); + result.Data = new GetSetUnitStateResultData(); + + if (string.IsNullOrWhiteSpace(unitId)) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + var unit = await _unitsService.GetUnitByIdAsync(int.Parse(unitId)); + + if (unit == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + if (unit.DepartmentId != DepartmentId) + return Unauthorized(); + + result.Data.UnitId = unitId; + result.Data.UnitName = unit.Name; + result.Data.Stations = new List(); + result.Data.Calls = new List(); + result.Data.Statuses = new List(); + + var type = await _unitsService.GetUnitTypeByNameAsync(DepartmentId, unit.Type); + var activeCalls = await _callsService.GetActiveCallsByDepartmentAsync(DepartmentId); + var stations = await _departmentGroupsService.GetAllStationGroupsForDepartmentAsync(DepartmentId); + + var callDefault = new CallResultData(); + callDefault.CallId = "0"; + callDefault.Name = "No Call"; + result.Data.Calls.Add(callDefault); + + if (activeCalls != null) + { + foreach (var c in activeCalls) + { + result.Data.Calls.Add(CallsController.ConvertCall(c, null, null, TimeZone)); + } + } + + var groupInfoDefault = new GroupResultData(); + groupInfoDefault.GroupId = "0"; + groupInfoDefault.Name = "No Station"; + result.Data.Stations.Add(groupInfoDefault); + + if (stations != null) + { + foreach (var group in stations) + { + result.Data.Stations.Add(GroupsController.ConvertGroupData(group)); + } + } + + if (type != null && type.CustomStatesId.HasValue) + { + var customState = await _customStateService.GetCustomSateByIdAsync(type.CustomStatesId.Value); + + if (!customState.IsDeleted) + { + foreach (var stateDetail in customState.GetActiveDetails()) + { + if (stateDetail.IsDeleted) + continue; + + result.Data.Statuses.Add(CustomStatusesController.ConvertCustomStatusData(customState, stateDetail)); + } + } + } + else + { + var customStateResult = new CustomStatusResultData(); + customStateResult.Id = "0"; + customStateResult.Type = 0; + customStateResult.StateId = "0"; + customStateResult.Text = "Available"; + customStateResult.BColor = "#FFFFFF"; + customStateResult.Color = "#000000"; + customStateResult.Gps = false; + customStateResult.Note = 0; + customStateResult.Detail = 0; + + result.Data.Statuses.Add(customStateResult); + + var customStateResult2 = new CustomStatusResultData(); + customStateResult2.Id = "3"; + customStateResult2.Type = 3; + customStateResult2.StateId = "3"; + customStateResult2.Text = "Committed"; + customStateResult2.BColor = "#FFFFFF"; + customStateResult2.Color = "#000000"; + customStateResult2.Gps = false; + customStateResult2.Note = 0; + customStateResult2.Detail = 0; + + result.Data.Statuses.Add(customStateResult2); + + var customStateResult3 = new CustomStatusResultData(); + customStateResult3.Id = "1"; + customStateResult3.Type = 1; + customStateResult3.StateId = "1"; + customStateResult3.Text = "Delayed"; + customStateResult3.BColor = "#FFFFFF"; + customStateResult3.Color = "#000000"; + customStateResult3.Gps = false; + customStateResult3.Note = 0; + customStateResult3.Detail = 0; + + result.Data.Statuses.Add(customStateResult3); + + var customStateResult4 = new CustomStatusResultData(); + customStateResult4.Id = "4"; + customStateResult4.Type = 4; + customStateResult4.StateId = "4"; + customStateResult4.Text = "Out Of Service"; + customStateResult4.BColor = "#FFFFFF"; + customStateResult4.Color = "#000000"; + customStateResult4.Gps = false; + customStateResult4.Note = 0; + customStateResult4.Detail = 0; + + result.Data.Statuses.Add(customStateResult4); + + var customStateResult5 = new CustomStatusResultData(); + customStateResult5.Id = "2"; + customStateResult5.Type = 2; + customStateResult5.StateId = "2"; + customStateResult5.Text = "Unavailable"; + customStateResult5.BColor = "#FFFFFF"; + customStateResult5.Color = "#000000"; + customStateResult5.Gps = false; + customStateResult5.Note = 0; + customStateResult5.Detail = 0; + + result.Data.Statuses.Add(customStateResult5); + } + + result.PageSize = 1; + result.Status = ResponseHelper.Success; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Returns all the personnel for display in the new call personnel table + /// + /// Array of PersonnelForCallResult objects for each person in the department + [HttpGet("GetPersonnelForCallGrid")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetPersonnelForCallGrid() + { + var result = new GetPersonnelForCallGridResult(); + + var users = await _departmentsService.GetAllUsersForDepartmentAsync(DepartmentId);//.GetAllUsersForDepartmentUnlimitedMinusDisabled(DepartmentId); + var personnelNames = await _departmentsService.GetAllPersonnelNamesForDepartmentAsync(DepartmentId); + + var lastUserActionlogs = await _actionLogsService.GetLastActionLogsForDepartmentAsync(DepartmentId); + var userStates = await _userStateService.GetLatestStatesForDepartmentAsync(DepartmentId); + + var personnelSortOrder = await _departmentSettingsService.GetDepartmentPersonnelSortOrderAsync(DepartmentId); + var personnelStatusSortOrder = await _departmentSettingsService.GetDepartmentPersonnelListStatusSortOrderAsync(DepartmentId); + + foreach (var user in users) + { + var person = new GetPersonnelForCallGridResultData(); + person.UserId = user.UserId; + person.Name = await UserHelper.GetFullNameForUser(personnelNames, user.UserName, user.UserId); + + var group = await _departmentGroupsService.GetGroupForUserAsync(user.UserId, DepartmentId); + + if (group != null) + person.Group = group.Name; + + var roles = await _personnelRolesService.GetRolesForUserAsync(user.UserId, DepartmentId); + person.Roles = new List(); + foreach (var role in roles) + { + person.Roles.Add(role.Name); + } + + var currentStaffing = userStates.FirstOrDefault(x => x.UserId == user.UserId); + if (currentStaffing != null) + { + var staffing = await CustomStatesHelper.GetCustomPersonnelStaffing(DepartmentId, currentStaffing); + + if (staffing != null) + { + person.Staffing = staffing.ButtonText; + person.StaffingColor = staffing.ButtonClassToColor(); + } + } + else + { + person.Staffing = "Available"; + person.StaffingColor = "#000"; + } + + var currentStatus = lastUserActionlogs.FirstOrDefault(x => x.UserId == user.UserId); + if (currentStatus != null) + { + var status = await CustomStatesHelper.GetCustomPersonnelStatus(DepartmentId, currentStatus); + if (status != null) + { + person.Status = status.ButtonText; + person.StatusColor = status.ButtonClassToColor(); + } + + person.Location = currentStatus.GeoLocationData; + } + else + { + person.Status = "Standing By"; + person.StatusColor = "#000"; + } + + person.Eta = "N/A"; + + if (currentStatus != null) + { + if (personnelStatusSortOrder != null && personnelStatusSortOrder.Any()) + { + var statusSorting = personnelStatusSortOrder.FirstOrDefault(x => x.StatusId == currentStatus.ActionTypeId); + if (statusSorting != null) + person.Weight = statusSorting.Weight; + else + person.Weight = 9000; + } + else + { + person.Weight = 9000; + } + } + else + person.Weight = 9000; + + result.Data.Add(person); + } + + switch (personnelSortOrder) + { + case PersonnelSortOrders.Default: + result.Data = result.Data.OrderBy(x => x.Weight).ToList(); + break; + case PersonnelSortOrders.FirstName: + result.Data = result.Data.OrderBy(x => x.Weight).ThenBy(x => x.FirstName).ToList(); + break; + case PersonnelSortOrders.LastName: + result.Data = result.Data.OrderBy(x => x.Weight).ThenBy(x => x.LastName).ToList(); + break; + case PersonnelSortOrders.Group: + result.Data = result.Data.OrderBy(x => x.Weight).ThenBy(x => x.GroupId).ToList(); + break; + default: + result.Data = result.Data.OrderBy(x => x.Weight).ToList(); + break; + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Returns all the groups for display in the new call groups table + /// + /// Array of GroupsForCallResult objects for each group in the department + [HttpGet("GetGroupsForCallGrid")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetGroupsForCallGrid() + { + var result = new GetGroupsForCallGridResult(); + var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId); + + foreach (var group in groups) + { + GetGroupsForCallGridResultData groupJson = new GetGroupsForCallGridResultData(); + groupJson.GroupId = group.DepartmentGroupId.ToString(); + groupJson.Name = group.Name; + + if (group.Members != null) + groupJson.Count = group.Members.Count; + else + groupJson.Count = 0; + + result.Data.Add(groupJson); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Returns all the roles for display in the new call groups table + /// + /// Array of RolesForCallResult objects for each role in the department + [HttpGet("GetRolesForCallGrid")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetRolesForCallGrid() + { + var result = new GetRolesForCallGridResult(); + var roles = await _personnelRolesService.GetRolesForDepartmentAsync(DepartmentId); + + foreach (var role in roles) + { + var roleJson = new GetRolesForCallGridResultData(); + roleJson.RoleId = role.PersonnelRoleId.ToString(); + roleJson.Name = role.Name; + + if (role.Users != null) + roleJson.Count = role.Users.Count; + else + roleJson.Count = 0; + + result.Data.Add(roleJson); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Returns all the call quick templates + /// + /// Array of CallTemplateResult objects for each role in the department + [HttpGet("GetCallTemplates")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetCallTemplates() + { + var result = new GetCallTemplatesResult(); + + var templates = await _templatesService.GetAllCallQuickTemplatesForDepartmentAsync(DepartmentId); + + foreach (var template in templates) + { + GetCallTemplatesResultData templateJson = new GetCallTemplatesResultData(); + templateJson.Id = template.CallQuickTemplateId.ToString(); + templateJson.IsDisabled = template.IsDisabled; + templateJson.Name = template.Name; + templateJson.CallName = template.CallName; + templateJson.CallNature = template.CallNature; + templateJson.CallType = template.CallType; + templateJson.CallPriority = template.CallPriority; + templateJson.CreatedByUserId = template.CreatedByUserId; + templateJson.CreatedOn = template.CreatedOn; + + result.Data.Add(templateJson); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/FormsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/FormsController.cs new file mode 100644 index 00000000..87f07788 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/FormsController.cs @@ -0,0 +1,84 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Resgrid.Web.Services.Models.v4.Forms; +using Resgrid.Web.Services.Helpers; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// User generated forms that are dispayed to get custom information for New Calls, Unit Checks, etc + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class FormsController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IFormsService _formsService; + + public FormsController(IFormsService formsService) + { + _formsService = formsService; + } + #endregion Members and Constructors + + /// + /// Gets the Department Form that can be used for the new call process (i.e. call intake/triage form) + /// + /// + [HttpGet("GetNewCallForm")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Forms_View)] + public async Task> GetNewCallForm() + { + var result = new FormResult(); + var form = await _formsService.GetNewCallFormByDepartmentIdAsync(DepartmentId); + + if (form != null) + { + var formResult = new FormResultData(); + formResult.Id = form.FormId; + formResult.Name = form.Name; + formResult.Type = form.Type; + formResult.Data = form.Data; + + if (form.Automations != null && form.Automations.Any()) + { + formResult.Automations = new List(); + + foreach (var automation in form.Automations) + { + var automationResult = new FormDataAutomationResult(); + automationResult.Id = automation.FormAutomationId; + automationResult.FormId = automation.FormId; + automationResult.TriggerField = automation.TriggerField; + automationResult.TriggerValue = automation.TriggerValue; + automationResult.OperationType = automation.OperationType; + automationResult.OperationValue = automation.OperationValue; + + formResult.Automations.Add(automationResult); + } + } + + result.Data = formResult; + result.PageSize = 1; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/GroupsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/GroupsController.cs new file mode 100644 index 00000000..77bd10e1 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/GroupsController.cs @@ -0,0 +1,122 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Threading.Tasks; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.Groups; +using System; +using Resgrid.Model; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// User generated forms that are dispayed to get custom information for New Calls, Unit Checks, etc + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class GroupsController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IDepartmentGroupsService _departmentGroupsService; + + public GroupsController(IDepartmentGroupsService departmentGroupsService) + { + _departmentGroupsService = departmentGroupsService; + } + #endregion Members and Constructors + + /// + /// Gets the Department Group by it's id + /// + /// + [HttpGet("GetGroup")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Group_View)] + public async Task> GetGroup(string groupId) + { + var result = new GroupResult(); + + if (String.IsNullOrWhiteSpace(groupId)) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + + return result; + } + + var group = await _departmentGroupsService.GetGroupByIdAsync(int.Parse(groupId)); + + if (group == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + + return result; + } + + if (group.DepartmentId != DepartmentId) + return Unauthorized(); + + result.Data = ConvertGroupData(group); + + result.PageSize = 1; + result.Status = ResponseHelper.Success; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Gets all deparment groups for a department + /// + /// + [HttpGet("GetAllGroups")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Group_View)] + public async Task> GetAllGroups() + { + var result = new GroupResults(); + + var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId); + + if (groups == null || groups.Count <= 0) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + + return result; + } + + foreach (var group in groups) + { + result.Data.Add(ConvertGroupData(group)); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + public static GroupResultData ConvertGroupData(DepartmentGroup group) + { + var result = new GroupResultData(); + + result.GroupId = group.DepartmentGroupId.ToString(); + + if (group.Type.HasValue) + result.TypeId = group.Type.Value.ToString(); + else + result.TypeId = "0"; + + result.Name = group.Name; + + if (group.Address != null) + result.Address = group.Address.FormatAddress(); + + return result; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/HealthController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/HealthController.cs new file mode 100644 index 00000000..815484fc --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/HealthController.cs @@ -0,0 +1,70 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Resgrid.Web.Services.Models.v4.Health; +using System.Reflection; +using Resgrid.Web.Services.Helpers; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class HealthController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IHealthService _healthService; + + public HealthController(IHealthService healthService) + { + _healthService = healthService; + } + #endregion Members and Constructors + + /// + /// Gets the current users department rights + /// + /// DepartmentRightsResult object with the department rights and group memberships + [HttpGet("GetCurrent")] + [ProducesResponseType(StatusCodes.Status200OK)] + [AllowAnonymous] + public async Task GetCurrent() + { + var result = new HealthResult(); + + try + { + var path = System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + "\\Resgrid.Web.Services.dll"; + + result.Data.ServicesVersion = AssemblyName.GetAssemblyName(path).Version.ToString(); + result.Data.ApiVersion = "v4"; + result.Data.SiteId = "0"; + result.Data.CacheOnline = _healthService.IsCacheProviderConnected(); + + var dbTime = await _healthService.GetDatabaseTimestamp(); + + if (!string.IsNullOrWhiteSpace(dbTime)) + result.Data.DatabaseOnline = true; + else + result.Data.DatabaseOnline = false; + + result.PageSize = 1; + result.Status = ResponseHelper.Success; + } + catch (System.Exception) + { + result.PageSize = 0; + result.Status = ResponseHelper.Failure; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/MappingController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/MappingController.cs new file mode 100644 index 00000000..fb2bc63a --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/MappingController.cs @@ -0,0 +1,317 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Framework; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Threading.Tasks; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.CallPriorities; +using System.Linq; +using Resgrid.Model; +using Resgrid.Model.Providers; +using System; +using Resgrid.Web.Services.Models.v4.Mapping; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Mapping operations + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class MappingController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IUsersService _usersService; + private readonly IActionLogsService _actionLogsService; + private readonly IDepartmentsService _departmentsService; + private readonly IUserProfileService _userProfileService; + private readonly IUserStateService _userStateService; + private readonly IUnitsService _unitsService; + private readonly ICallsService _callsService; + private readonly IDepartmentGroupsService _departmentGroupsService; + private readonly IPersonnelRolesService _personnelRolesService; + private readonly ICustomStateService _customStateService; + private readonly IDepartmentSettingsService _departmentSettingsService; + private readonly IGeoLocationProvider _geoLocationProvider; + + public MappingController( + IUsersService usersService, + IActionLogsService actionLogsService, + IDepartmentsService departmentsService, + IUserProfileService userProfileService, + IUserStateService userStateService, + IUnitsService unitsService, + ICallsService callsService, + IDepartmentGroupsService departmentGroupsService, + IPersonnelRolesService personnelRolesService, + ICustomStateService customStateService, + IDepartmentSettingsService departmentSettingsService, + IGeoLocationProvider geoLocationProvider + ) + { + _usersService = usersService; + _actionLogsService = actionLogsService; + _departmentsService = departmentsService; + _userProfileService = userProfileService; + _userStateService = userStateService; + _unitsService = unitsService; + _callsService = callsService; + _departmentGroupsService = departmentGroupsService; + _personnelRolesService = personnelRolesService; + _customStateService = customStateService; + _departmentSettingsService = departmentSettingsService; + _geoLocationProvider = geoLocationProvider; + } + #endregion Members and Constructors + + /// + /// Data to center the map and it's default location plus marker information for displaying makers on the map. + /// + /// GetMapDataResult object + [HttpGet("GetMapDataAndMarkers")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task> GetMapDataAndMarkers() + { + var result = new GetMapDataResult(); + + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId, false); + var stations = await _departmentGroupsService.GetAllStationGroupsForDepartmentAsync(DepartmentId); + + var address = await _departmentSettingsService.GetBigBoardCenterAddressDepartmentAsync(DepartmentId); + var gpsCoordinates = await _departmentSettingsService.GetBigBoardCenterGpsCoordinatesDepartmentAsync(DepartmentId); + var calls = await _callsService.GetActiveCallsByDepartmentAsync(DepartmentId); + //var units = await _unitsService.GetUnitsForDepartmentAsync(DepartmentId); + var unitStates = await _unitsService.GetAllLatestStatusForUnitsByDepartmentIdAsync(DepartmentId); + + //var personnelViewModels = (await GetPersonnelStatuses()).Value; + + string weatherUnits = ""; + double? centerLat = null; + double? centerLon = null; + + if (address != null && !String.IsNullOrWhiteSpace(address.Country)) + { + if (address.Country == "Canada") + weatherUnits = "ca"; + else if (address.Country == "United Kingdom") + weatherUnits = "uk"; + else if (address.Country == "Australia") + weatherUnits = "uk"; + else + weatherUnits = "us"; + } + else if (department.Address != null && !String.IsNullOrWhiteSpace(department.Address.Country)) + { + if (department.Address.Country == "Canada") + weatherUnits = "ca"; + else if (department.Address.Country == "United Kingdom") + weatherUnits = "uk"; + else if (department.Address.Country == "Australia") + weatherUnits = "uk"; + else + weatherUnits = "us"; + } + + if (!String.IsNullOrWhiteSpace(gpsCoordinates)) + { + string[] coordinates = gpsCoordinates.Split(char.Parse(",")); + + if (coordinates.Count() == 2) + { + double newLat; + double newLon; + if (double.TryParse(coordinates[0], out newLat) && double.TryParse(coordinates[1], out newLon)) + { + centerLat = newLat; + centerLon = newLon; + } + } + } + + if (!centerLat.HasValue && !centerLon.HasValue && address != null) + { + string coordinates = await _geoLocationProvider.GetLatLonFromAddress(string.Format("{0} {1} {2} {3}", address.Address1, + address.City, address.State, address.PostalCode)); + + if (!String.IsNullOrEmpty(coordinates)) + { + double newLat; + double newLon; + var coordinatesArr = coordinates.Split(char.Parse(",")); + if (double.TryParse(coordinatesArr[0], out newLat) && double.TryParse(coordinatesArr[1], out newLon)) + { + centerLat = newLat; + centerLon = newLon; + } + } + } + + if (!centerLat.HasValue && !centerLon.HasValue && department.Address != null) + { + string coordinates = await _geoLocationProvider.GetLatLonFromAddress(string.Format("{0} {1} {2} {3}", department.Address.Address1, + department.Address.City, + department.Address.State, + department.Address.PostalCode)); + + if (!String.IsNullOrEmpty(coordinates)) + { + double newLat; + double newLon; + var coordinatesArr = coordinates.Split(char.Parse(",")); + if (double.TryParse(coordinatesArr[0], out newLat) && double.TryParse(coordinatesArr[1], out newLon)) + { + centerLat = newLat; + centerLon = newLon; + } + } + } + + if (!centerLat.HasValue || !centerLon.HasValue) + { + centerLat = 39.14086268299356; + centerLon = -119.7583809782715; + } + + var zoomLevel = await _departmentSettingsService.GetBigBoardMapZoomLevelForDepartmentAsync(department.DepartmentId); + + + result.Data.CenterLat = centerLat.Value; + result.Data.CenterLon = centerLon.Value; + result.Data.ZoomLevel = zoomLevel.HasValue ? zoomLevel.Value : 9; + + + foreach (var station in stations) + { + MapMakerInfoData info = new MapMakerInfoData(); + info.Id = $"s{station.DepartmentGroupId}"; + info.ImagePath = "Station"; + info.Title = station.Name; + info.InfoWindowContent = station.Name; + + if (station.Address != null) + { + string coordinates = await _geoLocationProvider.GetLatLonFromAddress(string.Format("{0} {1} {2} {3}", station.Address.Address1, + station.Address.City, + station.Address.State, + station.Address.PostalCode)); + + if (!String.IsNullOrEmpty(coordinates)) + { + info.Latitude = double.Parse(coordinates.Split(char.Parse(","))[0]); + info.Longitude = double.Parse(coordinates.Split(char.Parse(","))[1]); + + result.Data.MapMakerInfos.Add(info); + } + } + else if (!String.IsNullOrWhiteSpace(station.Latitude) && !String.IsNullOrWhiteSpace(station.Longitude)) + { + info.Latitude = double.Parse(station.Latitude); + info.Longitude = double.Parse(station.Longitude); + + result.Data.MapMakerInfos.Add(info); + } + } + + foreach (var call in calls) + { + MapMakerInfoData info = new MapMakerInfoData(); + info.ImagePath = "Call"; + info.Id = $"c{call.CallId}"; + info.Title = call.Name; + info.InfoWindowContent = call.NatureOfCall; + + if (!String.IsNullOrEmpty(call.GeoLocationData) && call.GeoLocationData.Length > 1) + { + try + { + info.Latitude = double.Parse(call.GeoLocationData.Split(char.Parse(","))[0]); + info.Longitude = double.Parse(call.GeoLocationData.Split(char.Parse(","))[1]); + + result.Data.MapMakerInfos.Add(info); + } + catch { } + } + else if (!String.IsNullOrEmpty(call.Address)) + { + string coordinates = await _geoLocationProvider.GetLatLonFromAddress(call.Address); + if (!String.IsNullOrEmpty(coordinates)) + { + info.Latitude = double.Parse(coordinates.Split(char.Parse(","))[0]); + info.Longitude = double.Parse(coordinates.Split(char.Parse(","))[1]); + } + + result.Data.MapMakerInfos.Add(info); + } + } + + foreach (var unit in unitStates) + { + if (unit.Latitude.HasValue && unit.Latitude.Value != 0 && unit.Longitude.HasValue && + unit.Longitude.Value != 0) + { + MapMakerInfoData info = new MapMakerInfoData(); + info.ImagePath = "Engine_Responding"; + info.Id = $"u{unit.UnitId}"; + info.Title = unit.Unit.Name; + info.InfoWindowContent = ""; + info.Latitude = double.Parse(unit.Latitude.Value.ToString()); + info.Longitude = double.Parse(unit.Longitude.Value.ToString()); + + result.Data.MapMakerInfos.Add(info); + } + } + + //foreach (var person in personnelViewModels) + //{ + // if (person.Latitude.HasValue && person.Latitude.Value != 0 && person.Longitude.HasValue && + // person.Longitude.Value != 0) + // { + // MapMakerInfoData info = new MapMakerInfoData(); + + // if (person.StatusValue <= 25) + // { + // if (person.StatusValue == 5) + // info.ImagePath = "Person_RespondingStation"; + // else if (person.StatusValue == 6) + // info.ImagePath = "Person_RespondingCall"; + // else if (person.StatusValue == 3) + // info.ImagePath = "Person_OnScene"; + // else + // info.ImagePath = "Person_RespondingCall"; + // } + // else if (person.DestinationType > 0) + // { + // if (person.DestinationType == 1) + // info.ImagePath = "Person_RespondingStation"; + // else if (person.DestinationType == 2) + // info.ImagePath = "Person_RespondingCall"; + // else + // info.ImagePath = "Person_RespondingCall"; + // } + // else + // { + // info.ImagePath = "Person_RespondingCall"; + // } + + // //info.Id = $"p{person.}"; + // info.Title = person.Name; + // info.InfoWindowContent = ""; + // info.Latitude = double.Parse(person.Latitude.Value.ToString()); + // info.Longitude = double.Parse(person.Longitude.Value.ToString()); + + // result.Data.MapMakerInfos.Add(info); + // } + //} + + result.PageSize = 1; + result.Status = ResponseHelper.Success; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/PersonnelController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/PersonnelController.cs new file mode 100644 index 00000000..96474f42 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/PersonnelController.cs @@ -0,0 +1,165 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Resgrid.Web.Services.Models.v4.Forms; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.Personnel; +using Resgrid.Model; +using Resgrid.Model.Identity; +using System; +using Resgrid.Model.Helpers; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Operations to perform against personnel in a department + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class PersonnelController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IUsersService _usersService; + private readonly IActionLogsService _actionLogsService; + private readonly IDepartmentsService _departmentsService; + private readonly IUserProfileService _userProfileService; + private readonly IUserStateService _userStateService; + private readonly IDepartmentGroupsService _departmentGroupsService; + private readonly IPersonnelRolesService _personnelRolesService; + private readonly IDepartmentSettingsService _departmentSettingsService; + + public PersonnelController( + IUsersService usersService, + IActionLogsService actionLogsService, + IDepartmentsService departmentsService, + IUserProfileService userProfileService, + IUserStateService userStateService, + IDepartmentGroupsService departmentGroupsService, + IPersonnelRolesService personnelRolesService, + IDepartmentSettingsService departmentSettingsService + ) + { + _usersService = usersService; + _actionLogsService = actionLogsService; + _departmentsService = departmentsService; + _userProfileService = userProfileService; + _userStateService = userStateService; + _departmentGroupsService = departmentGroupsService; + _personnelRolesService = personnelRolesService; + _departmentSettingsService = departmentSettingsService; + } + #endregion Members and Constructors + + /// + /// Gets information about a specific person + /// + /// UserId of the person to get info for + /// PersonnelInfoResult with information pertaining to that user + [HttpGet("GetPersonnelInfo")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Personnel_View)] + public async Task> GetPersonnelInfo(string userId) + { + var result = new PersonnelInfoResult(); + var user = _usersService.GetUserById(userId); + + if (user == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + + return result; + } + + var department = await _departmentsService.GetDepartmentByUserIdAsync(user.UserId); + if (department == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + + return result; + } + + if (department.DepartmentId != DepartmentId) + return Unauthorized(); + + var profile = await _userProfileService.GetProfileByUserIdAsync(user.UserId); + var group = await _departmentGroupsService.GetGroupForUserAsync(user.UserId, DepartmentId); + var roles = await _personnelRolesService.GetRolesForUserAsync(user.UserId, DepartmentId); + var action = await _actionLogsService.GetLastActionLogForUserAsync(user.UserId, DepartmentId); + var userState = await _userStateService.GetLastUserStateByUserIdAsync(user.UserId); + + result.Data = ConvertPersonnelInfo(user, department, profile, group, roles, action, userState); + + return Ok(result); + } + + public static PersonnelInfoResultData ConvertPersonnelInfo(IdentityUser user, Department department, UserProfile profile, + DepartmentGroup group, List roles, ActionLog action, UserState userState) + { + var personnelData = new PersonnelInfoResultData(); + if (profile != null) + { + personnelData.FirstName = profile.FirstName; + personnelData.LastName = profile.LastName; + personnelData.IdentificationNumber = profile.IdentificationNumber; + personnelData.MobilePhone = profile.MobileNumber; + } + else + { + personnelData.FirstName = "Unknown"; + personnelData.LastName = "Check Profile"; + personnelData.IdentificationNumber = ""; + personnelData.MobilePhone = ""; + } + personnelData.EmailAddress = user.Email; + personnelData.DepartmentId = department.DepartmentId.ToString(); + personnelData.UserId = user.UserId.ToString(); + + if (group != null) + { + personnelData.GroupId = group.DepartmentGroupId.ToString(); + personnelData.GroupName = group.Name; + } + + personnelData.Roles = new List(); + if (roles != null && roles.Count > 0) + { + foreach (var role in roles) + { + personnelData.Roles.Add(role.Name); + } + } + + personnelData.StatusId = ((int)ActionTypes.StandingBy).ToString(); + personnelData.StaffingId = userState.State.ToString(); + personnelData.StaffingTimestamp = userState.Timestamp.TimeConverter(department); + + if (action == null) + { + personnelData.StatusTimestamp = DateTime.UtcNow.TimeConverter(department); + } + else + { + personnelData.StatusId = action.ActionTypeId.ToString(); + personnelData.StatusTimestamp = action.Timestamp.TimeConverter(department); + + if (action.DestinationId.HasValue) + { + if (action.ActionTypeId == (int)ActionTypes.RespondingToScene) + personnelData.StatusDestinationId = action.DestinationId.Value.ToString(); + else if (action.ActionTypeId == (int)ActionTypes.RespondingToStation) + personnelData.StatusDestinationId = action.DestinationId.Value.ToString(); + else if (action.ActionTypeId == (int)ActionTypes.AvailableStation) + personnelData.StatusDestinationId = action.DestinationId.Value.ToString(); + } + } + + return personnelData; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/RolesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/RolesController.cs new file mode 100644 index 00000000..1fa9ad37 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/RolesController.cs @@ -0,0 +1,74 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Threading.Tasks; +using Resgrid.Web.Services.Helpers; +using Resgrid.Model; +using Resgrid.Web.Services.Models.v4.Roles; +using System.Linq; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// User generated forms that are dispayed to get custom information for New Calls, Unit Checks, etc + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class RolesController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IPersonnelRolesService _personnelRolesService; + + public RolesController(IPersonnelRolesService personnelRolesService) + { + _personnelRolesService = personnelRolesService; + } + #endregion Members and Constructors + + /// + /// Gets the Department Form that can be used for the new call process (i.e. call intake/triage form) + /// + /// + [HttpGet("GetGroup")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Role_View)] + public async Task> GetAllRoles() + { + var result = new RolesResult(); + var allRoles = await _personnelRolesService.GetRolesForDepartmentAsync(DepartmentId); + + if (allRoles != null && allRoles.Any()) + { + foreach (var role in allRoles) + { + result.Data.Add(ConvertRoleData(role)); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + public static RoleResultData ConvertRoleData(PersonnelRole role) + { + var result = new RoleResultData(); + + result.RoleId = role.PersonnelRoleId.ToString(); + result.Name = role.Name; + + return result; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/SecurityController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/SecurityController.cs new file mode 100644 index 00000000..4ea42565 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/SecurityController.cs @@ -0,0 +1,105 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using System.Threading.Tasks; +using System.Collections.Generic; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.Security; +using Resgrid.Model; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class SecurityController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IDepartmentsService _departmentsService; + private readonly IDepartmentGroupsService _departmentGroupsService; + private readonly IPermissionsService _permissionsService; + private readonly IPersonnelRolesService _personnelRolesService; + private readonly IUserProfileService _userProfileService; + + /// + /// Operations to perform against the security sub-system + /// + public SecurityController(IDepartmentsService departmentsService, IDepartmentGroupsService departmentGroupsService, + IPermissionsService permissionsService, IPersonnelRolesService personnelRolesService, IUserProfileService userProfileService) + { + _departmentsService = departmentsService; + _departmentGroupsService = departmentGroupsService; + _permissionsService = permissionsService; + _personnelRolesService = personnelRolesService; + _userProfileService = userProfileService; + } + #endregion Members and Constructors + + /// + /// Gets the current users department rights + /// + /// DepartmentRightsResult object with the department rights and group memberships + [HttpGet("GetCurrentUsersRights")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task> GetCurrentUsersRights() + { + var result = new DepartmentRightsResult(); + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId, false); + var departmentMembership = await _departmentsService.GetDepartmentMemberAsync(UserId, DepartmentId, false); + var roles = await _personnelRolesService.GetRolesForUserAsync(UserId, DepartmentId); + + if (departmentMembership == null) + return Unauthorized(); + + if (departmentMembership.IsAdmin.HasValue) + result.Data.IsAdmin = departmentMembership.IsAdmin.Value; + + if (department.ManagingUserId == UserId) + result.Data.IsAdmin = true; + + result.Data.DepartmentId = department.DepartmentId.ToString(); + result.Data.DepartmentName = department.Name; + + var profile = await _userProfileService.GetProfileByUserIdAsync(UserId); + result.Data.EmailAddress = profile.MembershipEmail; + result.Data.FullName = profile.FullName.AsFirstNameLastName; + + bool isGroupAdmin = false; + result.Data.Groups = new List(); + + var group = await _departmentGroupsService.GetGroupForUserAsync(UserId, DepartmentId); + + if (group != null) + { + var groupRight = new GroupRightData(); + groupRight.GroupId = group.DepartmentGroupId.ToString(); + groupRight.IsGroupAdmin = group.IsUserGroupAdmin(UserId); + + if (groupRight.IsGroupAdmin) + isGroupAdmin = true; + + result.Data.Groups.Add(groupRight); + } + + var createCallPermission = await _permissionsService.GetPermissionByDepartmentTypeAsync(DepartmentId, PermissionTypes.CreateCall); + var viewPIIPermission = await _permissionsService.GetPermissionByDepartmentTypeAsync(DepartmentId, PermissionTypes.ViewPersonalInfo); + var createNotePermission = await _permissionsService.GetPermissionByDepartmentTypeAsync(DepartmentId, PermissionTypes.CreateNote); + var createMessagePermission = await _permissionsService.GetPermissionByDepartmentTypeAsync(DepartmentId, PermissionTypes.CreateMessage); + + result.Data.CanViewPII = _permissionsService.IsUserAllowed(viewPIIPermission, result.Data.IsAdmin, isGroupAdmin, roles); + result.Data.CanCreateCalls = _permissionsService.IsUserAllowed(createCallPermission, result.Data.IsAdmin, isGroupAdmin, roles); + result.Data.CanAddNote = _permissionsService.IsUserAllowed(createNotePermission, result.Data.IsAdmin, isGroupAdmin, roles); + result.Data.CanCreateMessage = _permissionsService.IsUserAllowed(createMessagePermission, result.Data.IsAdmin, isGroupAdmin, roles); + + result.PageSize = 1; + result.Status = ResponseHelper.Success; + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/StatusesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/StatusesController.cs new file mode 100644 index 00000000..5d5adbb0 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/StatusesController.cs @@ -0,0 +1,189 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Linq; +using System.Threading.Tasks; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.Statuses; +using Resgrid.Model; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// The options for Personnel Statuses, Staffing and Unit Statuses that can be used to submit their status to Resgrid. + /// Do not use Deleted versions for submittion, they should only be used for display of previous used values. + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class StatusesController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly ICustomStateService _customStateService; + private readonly IUnitsService _unitsService; + + public StatusesController(ICustomStateService customStateService, IUnitsService unitsService) + { + _customStateService = customStateService; + _unitsService = unitsService; + } + #endregion Members and Constructors + + /// + /// Gets all available statuses for Personnel for the department + /// + /// + [HttpGet("GetAllStatusesForPersonnel")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Personnel_View)] + public async Task> GetAllStatusesForPersonnel() + { + var result = new StatusesResult(); + + var statuses = await _customStateService.GetCustomPersonnelStatusesOrDefaultsAsync(DepartmentId); + + if (statuses != null && statuses.Any()) + { + foreach (var customState in statuses) + { + if (customState.IsDeleted) + continue; + + result.Data.Add(ConvertCustomStatusData((int)CustomStateTypes.Personnel, customState)); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + + /// + /// Gets all available staffing levels for Personnel for the department + /// + /// + [HttpGet("GetAllStaffingsForPersonnel")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Personnel_View)] + public async Task> GetAllStaffingsForPersonnel() + { + var result = new StatusesResult(); + + var statuses = await _customStateService.GetCustomPersonnelStaffingsOrDefaultsAsync(DepartmentId); + + if (statuses != null && statuses.Any()) + { + foreach (var customState in statuses) + { + if (customState.IsDeleted) + continue; + + result.Data.Add(ConvertCustomStatusData((int)CustomStateTypes.Staffing, customState)); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + + /// + /// Gets all active unit statuses for each unit type + /// + /// + [HttpGet("GetAllUnitStatuses")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Unit_View)] + public async Task> GetAllUnitStatuses() + { + var result = new UnitStatusesResult(); + + var types = await _unitsService.GetUnitTypesForDepartmentAsync(DepartmentId); + var statuses = await _customStateService.GetAllCustomStatesForDepartmentAsync(DepartmentId); + var defaultUnitStats = _customStateService.GetDefaultUnitStatuses(); + + var defaultUnitStatuses = new UnitTypeStatusResultData(); + defaultUnitStatuses.UnitType = "0"; + + foreach (var state in defaultUnitStats) + { + defaultUnitStatuses.Statuses.Add(ConvertCustomStatusData((int)CustomStateTypes.Unit, state)); + } + result.Data.Add(defaultUnitStatuses); + + if (types != null && types.Any()) + { + foreach (var type in types) + { + if (type.CustomStatesId.HasValue && type.CustomStatesId.Value > 0) + { + var customStatuses = statuses.FirstOrDefault(x => x.CustomStateId == type.CustomStatesId.Value); + + if (customStatuses != null && customStatuses.IsDeleted == false) + { + var unitStatusResult = new UnitTypeStatusResultData(); + unitStatusResult.UnitType = type.Type; + unitStatusResult.StatusId = customStatuses.CustomStateId.ToString(); + + foreach (var state in customStatuses.GetActiveDetails()) + { + if (state.IsDeleted) + continue; + + unitStatusResult.Statuses.Add(ConvertCustomStatusData((int)CustomStateTypes.Unit, state)); + } + + result.Data.Add(unitStatusResult); + } + } + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 1; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + + public static StatusResultData ConvertCustomStatusData(int type, CustomStateDetail stateDetail) + { + var customStateResult = new StatusResultData(); + customStateResult.Id = stateDetail.CustomStateDetailId; + customStateResult.Type = type; + customStateResult.StateId = stateDetail.CustomStateId; + customStateResult.Text = stateDetail.ButtonText; + customStateResult.BColor = stateDetail.ButtonColor; + customStateResult.Color = stateDetail.TextColor; + customStateResult.Gps = stateDetail.GpsRequired; + customStateResult.Note = stateDetail.NoteType; + customStateResult.Detail = stateDetail.DetailType; + + return customStateResult; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitLocationController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitLocationController.cs new file mode 100644 index 00000000..41c7e7f0 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitLocationController.cs @@ -0,0 +1,199 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Framework; +using Resgrid.Model.Services; +using System.Threading.Tasks; +using Resgrid.Web.Services.Helpers; +using Resgrid.Model.Providers; +using Resgrid.Web.Services.Models.v4.UnitLocation; +using Resgrid.Model; +using System; +using System.Net.Mime; +using Microsoft.AspNetCore.Authorization; +using Resgrid.Providers.Claims; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class UnitLocationController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IUnitsService _unitsService; + private readonly ICqrsProvider _cqrsProvider; + + public UnitLocationController(IUnitsService unitsService, ICqrsProvider cqrsProvider) + { + _unitsService = unitsService; + _cqrsProvider = cqrsProvider; + } + #endregion Members and Constructors + + /// + /// Sets the location of a unit + /// + /// UnitLocationInput object with the gps information. + /// Returns HttpStatusCode Created if successful, BadRequest otherwise. + [HttpPost("SetUnitLocation")] + [Consumes(MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status201Created)] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [Authorize(Policy = ResgridResources.Unit_View)] + public async Task> SetUnitLocation(UnitLocationInput locationInput) + { + var result = new SaveUnitLocationResult(); + + if (locationInput == null) + return BadRequest(); + + if (string.IsNullOrWhiteSpace(locationInput.UnitId)) + return BadRequest(); + + var unit = await _unitsService.GetUnitByIdAsync(int.Parse(locationInput.UnitId)); + + if (unit == null) + return BadRequest(); + + if (unit.DepartmentId != DepartmentId) + return Unauthorized(); + + if (!this.ModelState.IsValid) + return BadRequest(); + + try + { + CqrsEvent locationEvent = new CqrsEvent(); + UnitLocation location = new UnitLocation(); + location.UnitId = int.Parse(locationInput.UnitId); + + if (locationInput.Timestamp.HasValue) + location.Timestamp = locationInput.Timestamp.Value; + else + location.Timestamp = DateTime.UtcNow; + + if (!String.IsNullOrWhiteSpace(locationInput.Latitude) && locationInput.Latitude != "NaN" && !String.IsNullOrWhiteSpace(locationInput.Longitude) && locationInput.Longitude != "NaN") + { + location.Latitude = decimal.Parse(locationInput.Latitude); + location.Longitude = decimal.Parse(locationInput.Longitude); + + if (!String.IsNullOrWhiteSpace(locationInput.Accuracy) && locationInput.Accuracy != "NaN") + location.Accuracy = decimal.Parse(locationInput.Accuracy); + + if (!String.IsNullOrWhiteSpace(locationInput.Altitude) && locationInput.Altitude != "NaN") + location.Altitude = decimal.Parse(locationInput.Altitude); + + if (!String.IsNullOrWhiteSpace(locationInput.AltitudeAccuracy) && locationInput.AltitudeAccuracy != "NaN") + location.AltitudeAccuracy = decimal.Parse(locationInput.AltitudeAccuracy); + + if (!String.IsNullOrWhiteSpace(locationInput.Speed) && locationInput.Speed != "NaN") + location.Speed = decimal.Parse(locationInput.Speed); + + if (!String.IsNullOrWhiteSpace(locationInput.Heading) && locationInput.Heading != "NaN") + location.Heading = decimal.Parse(locationInput.Heading); + + locationEvent.Type = (int)CqrsEventTypes.UnitLocation; + locationEvent.Data = ObjectSerialization.Serialize(location); + await _cqrsProvider.EnqueueCqrsEventAsync(locationEvent); + + result.Id = ""; + result.PageSize = 0; + result.Status = ResponseHelper.Queued; + + ResponseHelper.PopulateV4ResponseData(result); + + return CreatedAtAction("GetLatestUnitLocation", new { unitId = locationInput.UnitId }, result); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + return BadRequest(); + } + + result.PageSize = 0; + result.Status = ResponseHelper.Created; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Gets the latest location for a specified unit + /// + /// + [HttpGet("GetLatestUnitLocation")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Unit_View)] + public async Task> GetLatestUnitLocation(string unitId) + { + var result = new UnitLocationResult(); + + if (String.IsNullOrWhiteSpace(unitId)) + return BadRequest(); + + var unit = await _unitsService.GetUnitByIdAsync(int.Parse(unitId)); + + if (unit == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + if (unit.DepartmentId != DepartmentId) + return Unauthorized(); + + var lastLocation = await _unitsService.GetLatestUnitLocationAsync(int.Parse(unitId)); + + if (lastLocation != null) + { + result.Data = ConvertUnitLocation(lastLocation); + result.PageSize = 1; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + + public static UnitLocationResultData ConvertUnitLocation(UnitLocation unitLocation) + { + var result = new UnitLocationResultData(); + result.UnitId = unitLocation.UnitId.ToString(); + result.Timestamp = unitLocation.Timestamp; + + if (unitLocation.Latitude.HasValue) + result.Latitude = unitLocation.Latitude.Value.ToString(); + + if (unitLocation.Longitude.HasValue) + result.Longitude = unitLocation.Longitude.Value.ToString(); + + if (unitLocation.Accuracy.HasValue) + result.Accuracy = unitLocation.Accuracy.Value.ToString(); + + if (unitLocation.Altitude.HasValue) + result.Altitude = unitLocation.Altitude.Value.ToString(); + + if (unitLocation.AltitudeAccuracy.HasValue) + result.AltitudeAccuracy = unitLocation.AltitudeAccuracy.Value.ToString(); + + if (unitLocation.Speed.HasValue) + result.Speed = unitLocation.Speed.Value.ToString(); + + if (unitLocation.Heading.HasValue) + result.Heading = unitLocation.Heading.Value.ToString(); + + return result; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitRolesController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitRolesController.cs new file mode 100644 index 00000000..ac7c9ed7 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitRolesController.cs @@ -0,0 +1,149 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Resgrid.Web.Services.Models.v4.Forms; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.UnitRoles; +using Resgrid.Model; +using Resgrid.Web.Helpers; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Unit roles + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class UnitRolesController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IUnitsService _unitsService; + + public UnitRolesController(IUnitsService unitsService) + { + _unitsService = unitsService; + } + #endregion Members and Constructors + + /// + /// Gets the accountability roles for a unit + /// + /// + [HttpGet("GetRolesForUnit")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Unit_View)] + public async Task> GetRolesForUnit(string unitId) + { + var result = new UnitRolesResult(); + + if (string.IsNullOrWhiteSpace(unitId)) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + + return Ok(result); + } + + var unit = await _unitsService.GetUnitByIdAsync(int.Parse(unitId)); + + if (unit == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + + return Ok(result); + } + + if (unit.DepartmentId != DepartmentId) + return Unauthorized(); + + var roles = await _unitsService.GetRolesForUnitAsync(unit.UnitId); + + if (roles != null && roles.Any()) + { + + foreach (var role in roles) + { + result.Data.Add(ConvertUnitRoleData(role)); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Gets all the roles for every unit in a department plus who is currently assigned to that unit role (accountability) + /// + /// + [HttpGet("GetAllUnitRolesAndAssignmentsForDepartment")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Unit_View)] + public async Task> GetAllUnitRolesAndAssignmentsForDepartment() + { + var result = new ActiveUnitRolesResult(); + + var units = await _unitsService.GetUnitsForDepartmentAsync(DepartmentId); + var activeRoles = await _unitsService.GetAllActiveRolesForUnitsByDepartmentIdAsync(DepartmentId); + + if (units != null && units.Any()) + { + foreach (var unit in units) + { + if (unit.Roles != null && unit.Roles.Any()) + { + foreach (var unitRole in unit.Roles) + { + var activeRole = activeRoles.FirstOrDefault(x => x.UnitId == unitRole.UnitId && x.Role == unitRole.Name); + var role = new ActiveUnitRoleResultData(ConvertUnitRoleData(unitRole)); + + if (activeRole != null) + { + role.UserId = activeRole.UserId; + role.UpdatedOn = activeRole.UpdatedOn.ToString(); + role.FullName = await UserHelper.GetFullNameForUser(activeRole.UserId); //TODO: Perf issue here most likely, temp add for Unit app Cap conversion. -SJ + } + + result.Data.Add(role); + } + } + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + public static UnitRoleResultData ConvertUnitRoleData(UnitRole role) + { + var data = new UnitRoleResultData(); + data.Name = role.Name; + data.UnitId = role.UnitId.ToString(); + data.UnitRoleId = role.UnitRoleId.ToString(); + + return data; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitStatusController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitStatusController.cs new file mode 100644 index 00000000..4f2d46db --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitStatusController.cs @@ -0,0 +1,426 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Framework; +using Resgrid.Model; +using Resgrid.Model.Providers; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using Resgrid.Web.Services.Models.v4.Calls; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Resgrid.Model.Helpers; +using IAuthorizationService = Resgrid.Model.Services.IAuthorizationService; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Helpers; +using Resgrid.Web.Services.Controllers.Version3.Models.BigBoard.BigBoardX; +using Resgrid.Web.Services.Models.v4.UnitStatus; +using System.Net.Mime; +using Resgrid.Model.Events; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Units Status (State) information. For example is the unit Responding to a Call, or Available. + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class UnitStatusController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly ICallsService _callsService; + private readonly IUnitsService _unitsService; + private readonly IDepartmentGroupsService _departmentGroupsService; + private readonly IEventAggregator _eventAggregator; + + public UnitStatusController( + ICallsService callsService, + IUnitsService unitsService, + IDepartmentGroupsService departmentGroupsService, + IEventAggregator eventAggregator + ) + { + _callsService = callsService; + _unitsService = unitsService; + _departmentGroupsService = departmentGroupsService; + _eventAggregator = eventAggregator; + } + #endregion Members and Constructors + + /// + /// Gets all the units in a departments current (latest) status (state) or a default + /// + /// + [HttpGet("GetAllUnitStatuses")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Unit_View)] + public async Task> GetAllUnitStatuses() + { + var result = new UnitStautsesResult(); + + var units = await _unitsService.GetUnitsForDepartmentAsync(DepartmentId); + + if (units != null && units.Any()) + { + var unitStates = await _unitsService.GetAllLatestStatusForUnitsByDepartmentIdAsync(DepartmentId); + var activeCalls = await _callsService.GetActiveCallsByDepartmentAsync(DepartmentId); + var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId); + + var sortedUnits = from u in units + let station = u.StationGroup + let stationName = station == null ? "" : station.Name + orderby stationName, u.Name ascending + select new + { + Unit = u, + Station = station, + StationName = stationName + }; + + DateTime timestamp = DateTime.UtcNow; + foreach (var unit in sortedUnits) + { + var stateFound = unitStates.FirstOrDefault(x => x.UnitId == unit.Unit.UnitId); + + if (stateFound != null) + { + timestamp = stateFound.Timestamp; + var customState = await CustomStatesHelper.GetCustomUnitState(stateFound); + var latestUnitLocation = await _unitsService.GetLatestUnitLocationAsync(unit.Unit.UnitId, timestamp); + + result.Data.Add(ConvertUnitStatusData(unit.Unit, stateFound, latestUnitLocation, customState, unit.Station, TimeZone, activeCalls, groups)); + } + else + { + var latestUnitLocation = await _unitsService.GetLatestUnitLocationAsync(unit.Unit.UnitId, timestamp); + result.Data.Add(ConvertUnitStatusData(unit.Unit, stateFound, latestUnitLocation, null, unit.Station, TimeZone, activeCalls, groups)); + } + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + + /// + /// Gets the unit status for a specific unit id + /// + /// + [HttpGet("GetUnitStatus")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Unit_View)] + public async Task> GetUnitStatus(string unitId) + { + var result = new UnitStatusResult(); + + if (String.IsNullOrWhiteSpace(unitId)) + return BadRequest(); + + var unit = await _unitsService.GetUnitByIdAsync(int.Parse(unitId)); + + if (unit == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + if (unit.DepartmentId != DepartmentId) + return Unauthorized(); + + var activeCalls = await _callsService.GetActiveCallsByDepartmentAsync(DepartmentId); + var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId); + var status = await _unitsService.GetLastUnitStateByUnitIdAsync(int.Parse(unitId)); + + DepartmentGroup group = null; + if (unit.StationGroupId.HasValue) + group = await _departmentGroupsService.GetGroupByIdAsync(unit.StationGroupId.Value); + + DateTime timestamp = DateTime.UtcNow; + if (status != null) + { + timestamp = status.Timestamp; + var customState = await CustomStatesHelper.GetCustomUnitState(status); + var latestUnitLocation = await _unitsService.GetLatestUnitLocationAsync(status.UnitId, timestamp); + + result.Data = ConvertUnitStatusData(unit, status, latestUnitLocation, customState, group, TimeZone, activeCalls, groups); + } + else + { + var latestUnitLocation = await _unitsService.GetLatestUnitLocationAsync(status.UnitId, timestamp); + result.Data = ConvertUnitStatusData(unit, status, latestUnitLocation, null, group, TimeZone, activeCalls, groups); + } + + result.PageSize = 1; + result.Status = ResponseHelper.Success; + + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + + /// + /// Sets the status/action for the current user. + /// + /// StatusInput object with the Status/Action to set. + /// Returns HttpStatusCode Created if successful, BadRequest otherwise. + [HttpPost("SaveUnitStatus")] + [Consumes(MediaTypeNames.Application.Json)] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [Authorize(Policy = ResgridResources.Unit_View)] + public async Task> SaveUnitStatus(UnitStatusInput statusInput) + { + if (!ModelState.IsValid) + return BadRequest(); + + return await ProcessSetUnitState(statusInput); + } + + private async Task> ProcessSetUnitState(UnitStatusInput stateInput) + { + var result = new SaveUnitStatusResult(); + var unit = await _unitsService.GetUnitByIdAsync(int.Parse(stateInput.Id)); + + if (unit == null) + { + ResponseHelper.PopulateV4ResponseNotFound(result); + return Ok(result); + } + + if (unit.DepartmentId != DepartmentId) + return Unauthorized(); + + if (this.ModelState.IsValid) + { + try + { + var state = new UnitState(); + + state.UnitId = int.Parse(stateInput.Id); + state.LocalTimestamp = stateInput.Timestamp; + + if (!String.IsNullOrWhiteSpace(stateInput.Latitude)) + state.Latitude = decimal.Parse(stateInput.Latitude); + + if (!String.IsNullOrWhiteSpace(stateInput.Longitude)) + state.Longitude = decimal.Parse(stateInput.Longitude); + + if (!String.IsNullOrWhiteSpace(stateInput.Accuracy)) + state.Accuracy = decimal.Parse(stateInput.Accuracy); + + if (!String.IsNullOrWhiteSpace(stateInput.Altitude)) + state.Altitude = decimal.Parse(stateInput.Altitude); + + if (!String.IsNullOrWhiteSpace(stateInput.AltitudeAccuracy)) + state.AltitudeAccuracy = decimal.Parse(stateInput.AltitudeAccuracy); + + if (!String.IsNullOrWhiteSpace(stateInput.Speed)) + state.Speed = decimal.Parse(stateInput.Speed); + + if (!String.IsNullOrWhiteSpace(stateInput.Heading)) + state.Heading = decimal.Parse(stateInput.Heading); + + state.State = int.Parse(stateInput.Type); + + if (stateInput.Timestamp.HasValue) + state.Timestamp = stateInput.Timestamp.Value; + else + state.Timestamp = DateTime.UtcNow; + + state.Note = stateInput.Note; + + if (state.Latitude.HasValue && state.Longitude.HasValue) + { + state.GeoLocationData = string.Format("{0},{1}", state.Latitude.Value, state.Longitude.Value); + } + + if (!string.IsNullOrWhiteSpace(stateInput.RespondingTo) && int.Parse(stateInput.RespondingTo) > 0) + state.DestinationId = int.Parse(stateInput.RespondingTo); + + var savedState = await _unitsService.SetUnitStateAsync(state, DepartmentId); + + if (stateInput.Roles != null && stateInput.Roles.Count > 0) + { + var unitRoles = await _unitsService.GetRolesForUnitAsync(savedState.UnitId); + var roles = new List(); + foreach (var role in stateInput.Roles) + { + if (!string.IsNullOrWhiteSpace(role.UserId)) + { + var unitRole = new UnitStateRole(); + unitRole.UnitStateId = savedState.UnitStateId; + unitRole.UserId = role.UserId; ; + unitRole.UnitStateRoleId = int.Parse(role.RoleId); + + if (String.IsNullOrWhiteSpace(role.Name)) + { + var savedRole = unitRoles.FirstOrDefault(x => x.UnitRoleId == unitRole.UnitStateRoleId); + + if (savedRole != null) + unitRole.Role = savedRole.Name; + } + else + { + unitRole.Role = role.Name; + } + + unitRole.IdValue = 0; + unitRole.UnitStateRoleId = 0; + + roles.Add(unitRole); + //_unitsService.AddUnitStateRoleForEvent(savedState.UnitStateId, role.Uid, role.Rid, savedState.Unit.Name, savedState.Timestamp); + } + } + + await _unitsService.AddAllUnitStateRolesAsync(roles); + } + + //OutboundEventProvider.UnitStatusTopicHandler handler = new OutboundEventProvider.UnitStatusTopicHandler(); + //handler.Handle(new UnitStatusEvent() { DepartmentId = DepartmentId, Status = savedState }); + _eventAggregator.SendMessage(new UnitStatusEvent() { DepartmentId = DepartmentId, Status = savedState }); + + if (savedState.UnitStateId > 0) + { + result.Id = savedState.UnitStateId.ToString(); + result.PageSize = 0; + result.Status = ResponseHelper.Created; + + ResponseHelper.PopulateV4ResponseData(result); + + return CreatedAtAction("GetAllUnitStatuses", result); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + return BadRequest(); + } + } + + return BadRequest(); + } + + + public static UnitStatusResultData ConvertUnitStatusData(Unit unit, UnitState stateFound, UnitLocation latestUnitLocation, + CustomStateDetail customState, DepartmentGroup group, string timeZone, List activeCalls, List groups) + { + var state = "Unknown"; + var stateCss = ""; + var stateStyle = ""; + int? destinationId = 0; + decimal? latitude = 0; + decimal? longitude = 0; + var destinationName = ""; + DateTime timestamp = DateTime.UtcNow; + + if (stateFound != null) + { + if (customState != null) + { + state = customState.ButtonText; + stateCss = customState.ButtonColor; + stateStyle = customState.ButtonColor; + + if (customState.DetailType == (int)CustomStateDetailTypes.Calls) + { + if (activeCalls != null && activeCalls.Any()) + { + var call = activeCalls.FirstOrDefault(x => x.CallId == stateFound.DestinationId); + if (call != null) + { + destinationName = call.Number; + } + } + } + else if (customState.DetailType == (int)CustomStateDetailTypes.Stations) + { + if (groups != null && groups.Any()) + { + var station = groups.FirstOrDefault(x => x.DepartmentGroupId == stateFound.DestinationId); + if (station != null) + { + destinationName = station.Name; + } + } + } + else if (customState.DetailType == (int)CustomStateDetailTypes.CallsAndStations) + { + if (groups != null && groups.Any() && activeCalls != null && activeCalls.Any()) + { + // First try and get the station, as a station can get a call (based on Id) but the inverse is hard + var station = groups.FirstOrDefault(x => x.DepartmentGroupId == stateFound.DestinationId); + if (station != null) + { + destinationName = station.Name; + } + else + { + var call = activeCalls.FirstOrDefault(x => x.CallId == stateFound.DestinationId); + if (call != null) + { + destinationName = call.Number; + } + } + } + } + } + else + { + state = stateFound.ToStateDisplayText(); + stateCss = stateFound.ToStateCss(); + } + + destinationId = stateFound.DestinationId; + latitude = stateFound.Latitude; + longitude = stateFound.Longitude; + timestamp = stateFound.Timestamp; + } + + string groupName = ""; + int groupId = 0; + if (group != null) + { + groupId = group.DepartmentGroupId; + groupName = group.Name; + } + + if (latestUnitLocation != null) + { + latitude = latestUnitLocation.Latitude; + longitude = latestUnitLocation.Longitude; + } + + var unitViewModel = new UnitStatusResultData + { + UnitId = unit.UnitId.ToString(), + Name = unit.Name, + Type = unit.Type, + State = state, + StateCss = stateCss, + StateStyle = stateStyle, + TimestampUtc = timestamp, + Timestamp = timestamp.TimeConverter(new Department() { TimeZone = timeZone }), + DestinationId = destinationId, + Latitude = latitude, + Longitude = longitude, + GroupId = groupId, + GroupName = groupName, + DestinationName = destinationName + }; + + return unitViewModel; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitsController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitsController.cs new file mode 100644 index 00000000..39bc8e01 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/UnitsController.cs @@ -0,0 +1,120 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using System.Linq; +using System.Threading.Tasks; +using Resgrid.Web.Services.Helpers; +using Resgrid.Web.Services.Models.v4.Units; +using Resgrid.Model; +using Resgrid.Model.Helpers; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Information regarding Units + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class UnitsController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IUnitsService _unitsService; + + public UnitsController(IUnitsService unitsService) + { + _unitsService = unitsService; + } + #endregion Members and Constructors + + /// + /// Gets all the Units for a Department + /// + /// + [HttpGet("GetAllUnits")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Policy = ResgridResources.Unit_View)] + public async Task> GetAllUnits() + { + var result = new UnitsResult(); + var units = await _unitsService.GetUnitsForDepartmentAsync(DepartmentId); + var types = await _unitsService.GetUnitTypesForDepartmentAsync(DepartmentId); + + if (units != null && units.Any()) + { + var unitStatuses = await _unitsService.GetAllLatestStatusForUnitsByDepartmentIdAsync(DepartmentId); + + foreach (var unit in units) + { + UnitType type = null; + + if (types != null && types.Any()) + type = types.FirstOrDefault(x => x.Type == unit.Type); + + result.Data.Add(ConvertUnitsData(unit, unitStatuses.FirstOrDefault(x => x.UnitId == unit.UnitId), type, TimeZone)); + } + + result.PageSize = result.Data.Count; + result.Status = ResponseHelper.Success; + } + else + { + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + } + + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + public static UnitResultData ConvertUnitsData(Unit unit, UnitState state, UnitType type, string timeZone) + { + var data = new UnitResultData(); + data.UnitId = unit.UnitId.ToString(); + data.DepartmentId = unit.DepartmentId.ToString(); + data.Name = unit.Name; + data.Type = unit.Type; + data.Vin = unit.VIN; + + if (unit.FourWheel.HasValue) + data.FourWheelDrive = unit.FourWheel.Value; + + if (unit.SpecialPermit.HasValue) + data.SpecialPermit = unit.SpecialPermit.Value; + + if (state != null) + { + data.CurrentStatusId = state.State.ToString(); + + data.CurrentStatusTimestamp = state.Timestamp.TimeConverter(new Department() { TimeZone = timeZone }); + data.Note = state.Note; + + if (state.DestinationId.HasValue) + data.CurrentDestinationId = state.DestinationId.Value.ToString(); + + if (state.Latitude.HasValue) + data.Latitude = state.Latitude.Value.ToString(); + + if (state.Longitude.HasValue) + data.Longitude = state.Longitude.Value.ToString(); + } + + if (type != null) + { + data.CustomStatusSetId = type.CustomStatesId.GetValueOrDefault().ToString(); + data.TypeId = type.UnitTypeId; + } + + if (unit.StationGroup != null) + { + data.GroupId = unit.StationGroup.DepartmentGroupId.ToString(); + data.GroupName = unit.StationGroup.Name; + } + + return data; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/V4AuthenticatedApiControllerbase.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/V4AuthenticatedApiControllerbase.cs new file mode 100644 index 00000000..2efd7d34 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/V4AuthenticatedApiControllerbase.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using OpenIddict.Server.AspNetCore; +using Resgrid.Web.ServicesCore.Helpers; + +namespace Resgrid.Web.Services.Controllers.v4 +{ +#if (!DEBUG && !DOCKER) + //[RequireHttps] +#endif + [ApiController] + [Produces("application/json")] + [Authorize(AuthenticationSchemes = OpenIddict.Validation.AspNetCore.OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme)] + public class V4AuthenticatedApiControllerbase : ControllerBase + { + protected string UserId => ClaimsAuthorizationHelper.GetUserId(); + + protected int DepartmentId => ClaimsAuthorizationHelper.GetDepartmentId(); + + protected string UserName => ClaimsAuthorizationHelper.GetUsername(); + + protected string TimeZone => ClaimsAuthorizationHelper.GetTimeZone(); + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Controllers/v4/VoiceController.cs b/Web/Resgrid.Web.ServicesCore/Controllers/v4/VoiceController.cs new file mode 100644 index 00000000..b7f3be19 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Controllers/v4/VoiceController.cs @@ -0,0 +1,124 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Framework; +using Resgrid.Model.Services; +using System.Threading.Tasks; +using System.Linq; +using IAuthorizationService = Resgrid.Model.Services.IAuthorizationService; +using Resgrid.Web.Services.Models.v4.Voice; +using System.Collections.Generic; +using Resgrid.Web.Helpers; +using Resgrid.Web.Services.Helpers; + +namespace Resgrid.Web.Services.Controllers.v4 +{ + /// + /// Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + /// + [Route("api/v{VersionId:apiVersion}/[controller]")] + [ApiVersion("4.0")] + [ApiExplorerSettings(GroupName = "v4")] + public class VoiceController : V4AuthenticatedApiControllerbase + { + #region Members and Constructors + private readonly IAuthorizationService _authorizationService; + private readonly IVoiceService _voiceService; + private readonly IDepartmentsService _departmentsService; + + public VoiceController( + IAuthorizationService authorizationService, + IVoiceService voiceService, + IDepartmentsService departmentsService) + { + _authorizationService = authorizationService; + _voiceService = voiceService; + _departmentsService = departmentsService; + } + #endregion Members and Constructors + + /// + /// Returns all the available responding options (Calls/Stations) for the department + /// + /// Array of RecipientResult objects for each responding option in the department + [HttpGet("GetDepartmentVoiceSettings")] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task> GetDepartmentVoiceSettings() + { + var result = new DepartmentVoiceResult(); + result.Data = new DepartmentVoiceResultData(); + + result.Data.VoipServerWebsocketSslAddress = Config.VoipConfig.VoipServerWebsocketSslAddress; + result.Data.VoiceEnabled = await _voiceService.CanDepartmentUseVoiceAsync(DepartmentId); + result.Data.Realm = Config.VoipConfig.VoipDomain; + result.Data.CallerIdName = await UserHelper.GetFullNameForUser(UserId); + result.Data.Type = (int)Config.SystemBehaviorConfig.VoipProviderType; + + if (result.Data.VoiceEnabled) + { + result.Data.Channels = new List(); + + var voice = await _voiceService.GetVoiceSettingsForDepartmentAsync(DepartmentId); + + if (voice != null) + { + if (voice.Channels != null && voice.Channels.Any()) + { + foreach (var chan in voice.Channels) + { + var channel = new DepartmentVoiceChannelResultData(); + channel.Id = chan.DepartmentVoiceChannelId; + channel.Name = chan.Name; + channel.IsDefault = chan.IsDefault; + channel.ConferenceNumber = chan.ConferenceNumber; + + result.Data.Channels.Add(channel); + } + } + + result.Data.UserInfo = new DepartmentVoiceUserInfoResultData(); + result.Data.UserInfo.Username = UserId.Replace("-", ""); + + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + result.Data.UserInfo.Pin = _departmentsService.ConvertDepartmentCodeToDigitPin(department.Code); + result.Data.UserInfo.Password = Hashing.ComputeMD5Hash($"{UserId}{Config.SymmetricEncryptionConfig.InitVector}"); + } + } + + result.PageSize = 1; + result.Status = ResponseHelper.Success; + ResponseHelper.PopulateV4ResponseData(result); + + return Ok(result); + } + + /// + /// Connects to an voip session, limited to only OpenVidu. + /// + /// Voice connection result containing the data needed to connect to a voip session + [HttpGet("ConnectToSession")] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task> ConnectToSession(string sessionId) + { + var result = new VoiceSessionConnectionResult(); + result.PageSize = 0; + result.Status = ResponseHelper.NotFound; + + if (Config.SystemBehaviorConfig.VoipProviderType == Config.VoipProviderTypes.OpenVidu) + { + var token = await _voiceService.GetOpenViduSessionToken(sessionId); + + if (token != null) + { + result.Data = new VoiceSessionConnectionResultData(); + result.Data.Token = token; + result.PageSize = 1; + result.Status = ResponseHelper.Success; + } + } + + ResponseHelper.PopulateV4ResponseData(result); + + return result; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Dockerfile b/Web/Resgrid.Web.ServicesCore/Dockerfile index 0b304283..70b80d8e 100644 --- a/Web/Resgrid.Web.ServicesCore/Dockerfile +++ b/Web/Resgrid.Web.ServicesCore/Dockerfile @@ -1,10 +1,14 @@ #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base +ARG BUILD_VERSION=3.5.0 + +FROM mcr.microsoft.com/dotnet/aspnet:6.0.1-bullseye-slim-amd64 AS base +ARG BUILD_VERSION WORKDIR /app EXPOSE 80 -FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build +FROM mcr.microsoft.com/dotnet/sdk:6.0.101-bullseye-slim-amd64 AS build +ARG BUILD_VERSION WORKDIR /src COPY ["Web/Resgrid.Web.ServicesCore/Resgrid.Web.ServicesCore.csproj", "Web/Resgrid.Web.ServicesCore/"] COPY ["Providers/Resgrid.Providers.Bus.Rabbit/Resgrid.Providers.Bus.Rabbit.csproj", "Providers/Resgrid.Providers.Bus.Rabbit/"] @@ -20,21 +24,24 @@ COPY ["Repositories/Resgrid.Repositories.DataRepository/Resgrid.Repositories.Dat COPY ["Providers/Resgrid.Providers.Number/Resgrid.Providers.Number.csproj", "Providers/Resgrid.Providers.Number/"] COPY ["Providers/Resgrid.Providers.Firebase/Resgrid.Providers.Firebase.csproj", "Providers/Resgrid.Providers.Firebase/"] COPY ["Providers/Resgrid.Providers.Email/Resgrid.Providers.Email.csproj", "Providers/Resgrid.Providers.Email/"] -COPY ["Providers/Resgrid.Providers.Audio/Resgrid.Providers.Audio.csproj", "Providers/Resgrid.Providers.Audio/"] COPY ["Providers/Resgrid.Providers.Marketing/Resgrid.Providers.Marketing.csproj", "Providers/Resgrid.Providers.Marketing/"] COPY ["Providers/Resgrid.Providers.Pdf/Resgrid.Providers.Pdf.csproj", "Providers/Resgrid.Providers.Pdf/"] COPY ["Providers/Resgrid.Providers.Claims/Resgrid.Providers.Claims.csproj", "Providers/Resgrid.Providers.Claims/"] COPY ["Providers/Resgrid.Providers.Migrations/Resgrid.Providers.Migrations.csproj", "Providers/Resgrid.Providers.Migrations/"] +COPY ["Providers/Resgrid.Providers.Voip/Resgrid.Providers.Voip.csproj", "Providers/Resgrid.Providers.Voip/"] RUN dotnet restore "Web/Resgrid.Web.ServicesCore/Resgrid.Web.ServicesCore.csproj" COPY . . WORKDIR "/src/Web/Resgrid.Web.ServicesCore" -RUN dotnet build "Resgrid.Web.ServicesCore.csproj" -c Release -o /app/build - FROM build AS publish -RUN dotnet publish "Resgrid.Web.ServicesCore.csproj" -c Release -o /app/publish +ARG BUILD_VERSION +RUN dotnet publish "Resgrid.Web.ServicesCore.csproj" -c Release -o /app/publish -p:Version=${BUILD_VERSION} FROM base AS final +## Add the wait script to the image +ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.9.0/wait wait +RUN chmod +x wait + WORKDIR /app COPY --from=publish /app/publish . -ENTRYPOINT ["dotnet", "Resgrid.Web.Services.dll"] +ENTRYPOINT ["sh", "-c", "./wait && dotnet Resgrid.Web.Services.dll"] diff --git a/Web/Resgrid.Web.ServicesCore/Helpers/ClaimsAuthorizationHelper.cs b/Web/Resgrid.Web.ServicesCore/Helpers/ClaimsAuthorizationHelper.cs index 57d9bf94..b69c9866 100644 --- a/Web/Resgrid.Web.ServicesCore/Helpers/ClaimsAuthorizationHelper.cs +++ b/Web/Resgrid.Web.ServicesCore/Helpers/ClaimsAuthorizationHelper.cs @@ -102,6 +102,16 @@ public static string GetDepartmentSignupDate() return String.Empty; } + public static string GetTimeZone() + { + var claim = GetClaimsPrincipal().FindFirst(ResgridClaimTypes.Data.TimeZone); + + if (claim != null) + return claim.Value; + + return String.Empty; + } + public static bool IsUserResgridAdmin() { //ClaimsAuthorizationManager authorizationManager = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.ClaimsAuthorizationManager; diff --git a/Web/Resgrid.Web.ServicesCore/Helpers/ImageUtils.cs b/Web/Resgrid.Web.ServicesCore/Helpers/ImageUtils.cs index 5b8b41ab..48b26dfc 100644 --- a/Web/Resgrid.Web.ServicesCore/Helpers/ImageUtils.cs +++ b/Web/Resgrid.Web.ServicesCore/Helpers/ImageUtils.cs @@ -1,4 +1,7 @@ -using System.Drawing; + + +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Processing; namespace Resgrid.Web.ServicesCore.Helpers { @@ -6,21 +9,25 @@ public static class ImageUtils { public static Image Resize(Image image, int scaledWidth, int scaledHeight) { - return new Bitmap(image, scaledWidth, scaledHeight); + var image2 = image.Clone(x => x.Resize(scaledWidth, scaledHeight)); + + return image2; } public static Image Crop(Image image, int x, int y, int width, int height) { - var croppedBitmap = new Bitmap(width, height); + //var croppedBitmap = new Bitmap(width, height); - using (var g = Graphics.FromImage(croppedBitmap)) - { - g.DrawImage(image, - new Rectangle(0, 0, width, height), - new Rectangle(x, y, width, height), GraphicsUnit.Pixel); - } + //using (var g = Graphics.FromImage(croppedBitmap)) + //{ + // g.DrawImage(image, + // new Rectangle(0, 0, width, height), + // new Rectangle(x, y, width, height), GraphicsUnit.Pixel); + //} - return croppedBitmap; + var image2 = image.Clone(z => z.Crop(new Rectangle(x, y, width, height))); + return image2; + //return croppedBitmap; } } } diff --git a/Web/Resgrid.Web.ServicesCore/Helpers/ResponseHelper.cs b/Web/Resgrid.Web.ServicesCore/Helpers/ResponseHelper.cs new file mode 100644 index 00000000..cdd35803 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Helpers/ResponseHelper.cs @@ -0,0 +1,32 @@ +using Resgrid.Web.Services.Models.v4; +using System; + +namespace Resgrid.Web.Services.Helpers +{ + public static class ResponseHelper + { + public static void PopulateV4ResponseData(StandardApiResponseV4Base data) + { + data.Timestamp = DateTime.UtcNow; + data.Version = "v4"; + data.Node = Environment.MachineName; + data.RequestId = System.Diagnostics.Activity.Current.Id; + data.Environment = Enum.GetName(Config.SystemBehaviorConfig.Environment); + } + + public static void PopulateV4ResponseNotFound(StandardApiResponseV4Base data) + { + data.PageSize = 0; + data.Status = ResponseHelper.NotFound; + PopulateV4ResponseData(data); + } + + public const string Success = "success"; + public const string Failure = "failure"; + public const string NotFound = "not_found"; + public const string Created = "created"; + public const string Updated = "updated"; + public const string Deleted = "deleted"; + public const string Queued = "queued"; + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Middleware/AuthTokenMiddleware.cs b/Web/Resgrid.Web.ServicesCore/Middleware/AuthTokenMiddleware.cs index bbdbf145..744cb7f0 100644 --- a/Web/Resgrid.Web.ServicesCore/Middleware/AuthTokenMiddleware.cs +++ b/Web/Resgrid.Web.ServicesCore/Middleware/AuthTokenMiddleware.cs @@ -176,16 +176,21 @@ public static V3AuthToken Decode(string authHeader) string[] rows = null; + byte[] authBytes = null; + string cypherText = null; + string plainText = null; + try { - var authBytes = Convert.FromBase64String(authHeader); - var cypherText = Encoding.ASCII.GetString(authBytes); - var plainText = SymmetricEncryption.Decrypt(cypherText, Config.SystemBehaviorConfig.ApiTokenEncryptionPassphrase); + authBytes = Convert.FromBase64String(authHeader); + cypherText = Encoding.ASCII.GetString(authBytes); + plainText = SymmetricEncryption.Decrypt(cypherText, Config.SystemBehaviorConfig.ApiTokenEncryptionPassphrase); rows = plainText.Split('|'); } catch (Exception ex) { + Logging.LogException(ex, $"{cypherText} {plainText}"); //TODO: log exception here? with metada used in authHeader? return null; } diff --git a/Web/Resgrid.Web.ServicesCore/Middleware/TokenAuthHandler.cs b/Web/Resgrid.Web.ServicesCore/Middleware/TokenAuthHandler.cs index 458f94a0..29da7558 100644 --- a/Web/Resgrid.Web.ServicesCore/Middleware/TokenAuthHandler.cs +++ b/Web/Resgrid.Web.ServicesCore/Middleware/TokenAuthHandler.cs @@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Resgrid.Framework; using Resgrid.Model.Custom; using Resgrid.Model.Providers; using Resgrid.Model.Repositories; @@ -29,6 +30,7 @@ public class ResgridTokenAuthHandler : AuthenticationHandler _claimsPrincipalFactory; private readonly IUsersService _usersService; + private readonly ILoggerFactory _logger; public ResgridTokenAuthHandler(IOptionsMonitor options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, ICacheProvider cacheProvider, IDepartmentsRepository departmentRepository, @@ -39,6 +41,7 @@ public ResgridTokenAuthHandler(IOptionsMonitor opt _departmentRepository = departmentRepository; _claimsPrincipalFactory = claimsPrincipalFactory; _usersService = usersService; + _logger = logger; } protected new ResgridAuthenticationEvents Events @@ -60,13 +63,27 @@ protected override async Task HandleAuthenticateAsync() try { - var authHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]); - var result = await AuthAndSetPrinciple(_cacheProvider, _departmentRepository, authHeader.Parameter); + //var authHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]); + var authHeaderValue = Request.Headers["Authorization"].ToString(); + + if (string.IsNullOrWhiteSpace(authHeaderValue)) + return AuthenticateResult.Fail("Missing Authorization Header value, blank"); + + authHeaderValue = authHeaderValue.Replace("Basic", "", StringComparison.InvariantCultureIgnoreCase).Trim(); + + if (string.IsNullOrWhiteSpace(authHeaderValue)) + return AuthenticateResult.Fail("Missing Authorization Header value, no data with auth type"); + + var result = await AuthAndSetPrinciple(_cacheProvider, _departmentRepository, authHeaderValue); if (!result) - return AuthenticateResult.Fail("Invalid Authorization Header"); + return AuthenticateResult.Fail($"Invalid Authorization Header: {authHeaderValue}"); + + var authToken = V3AuthToken.Decode(authHeaderValue); + + if (authToken == null) + return AuthenticateResult.Fail($"Invalid Authorization Header, null auth token: {authHeaderValue}"); - var authToken = V3AuthToken.Decode(authHeader.Parameter); var user = await _usersService.GetUserByNameAsync(authToken.UserName); var principal = await _claimsPrincipalFactory.CreateAsync(user); @@ -76,9 +93,10 @@ protected override async Task HandleAuthenticateAsync() var ticket = new AuthenticationTicket(principal, Scheme.Name); return AuthenticateResult.Success(ticket); } - catch + catch (Exception ex) { - return AuthenticateResult.Fail("Invalid Authorization Header"); + Logging.LogException(ex); + return AuthenticateResult.Fail($"Invalid Authorization Header: {ex}"); } } diff --git a/Web/Resgrid.Web.ServicesCore/Migrations/20210904153137_CreateOpenIddictModels.Designer.cs b/Web/Resgrid.Web.ServicesCore/Migrations/20210904153137_CreateOpenIddictModels.Designer.cs new file mode 100644 index 00000000..ed7d6a78 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Migrations/20210904153137_CreateOpenIddictModels.Designer.cs @@ -0,0 +1,510 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Resgrid.Web.Services.Models; + +namespace Resgrid.Web.Services.Migrations +{ + [DbContext(typeof(AuthorizationDbContext))] + [Migration("20210904153137_CreateOpenIddictModels")] + partial class CreateOpenIddictModels + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.9") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderKey") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("Name") + .HasColumnType("nvarchar(450)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("Permissions") + .HasColumnType("nvarchar(max)"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Requirements") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId") + .IsUnique() + .HasFilter("[ClientId] IS NOT NULL"); + + b.ToTable("OpenIddictApplications"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Descriptions") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Resources") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique() + .HasFilter("[Name] IS NOT NULL"); + + b.ToTable("OpenIddictScopes"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorizationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("ExpirationDate") + .HasColumnType("datetime2"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedemptionDate") + .HasColumnType("datetime2"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId") + .IsUnique() + .HasFilter("[ReferenceId] IS NOT NULL"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens"); + }); + + modelBuilder.Entity("Resgrid.Web.Services.Models.ApplicationUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Resgrid.Web.Services.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Resgrid.Web.Services.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Resgrid.Web.Services.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Resgrid.Web.Services.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") + .WithMany("Authorizations") + .HasForeignKey("ApplicationId"); + + b.Navigation("Application"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") + .WithMany("Tokens") + .HasForeignKey("ApplicationId"); + + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", "Authorization") + .WithMany("Tokens") + .HasForeignKey("AuthorizationId"); + + b.Navigation("Application"); + + b.Navigation("Authorization"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => + { + b.Navigation("Authorizations"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Navigation("Tokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Migrations/20210904153137_CreateOpenIddictModels.cs b/Web/Resgrid.Web.ServicesCore/Migrations/20210904153137_CreateOpenIddictModels.cs new file mode 100644 index 00000000..deb2c025 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Migrations/20210904153137_CreateOpenIddictModels.cs @@ -0,0 +1,369 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Resgrid.Web.Services.Migrations +{ + public partial class CreateOpenIddictModels : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AspNetRoles", + columns: table => new + { + Id = table.Column(type: "nvarchar(450)", nullable: false), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetUsers", + columns: table => new + { + Id = table.Column(type: "nvarchar(450)", nullable: false), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + EmailConfirmed = table.Column(type: "bit", nullable: false), + PasswordHash = table.Column(type: "nvarchar(max)", nullable: true), + SecurityStamp = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true), + PhoneNumber = table.Column(type: "nvarchar(max)", nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false), + TwoFactorEnabled = table.Column(type: "bit", nullable: false), + LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), + LockoutEnabled = table.Column(type: "bit", nullable: false), + AccessFailedCount = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictApplications", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ClientId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + ClientSecret = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyToken = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + ConsentType = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + DisplayName = table.Column(type: "nvarchar(max)", nullable: true), + DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), + Permissions = table.Column(type: "nvarchar(max)", nullable: true), + PostLogoutRedirectUris = table.Column(type: "nvarchar(max)", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + RedirectUris = table.Column(type: "nvarchar(max)", nullable: true), + Requirements = table.Column(type: "nvarchar(max)", nullable: true), + Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictApplications", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictScopes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ConcurrencyToken = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + Description = table.Column(type: "nvarchar(max)", nullable: true), + Descriptions = table.Column(type: "nvarchar(max)", nullable: true), + DisplayName = table.Column(type: "nvarchar(max)", nullable: true), + DisplayNames = table.Column(type: "nvarchar(max)", nullable: true), + Name = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + Resources = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictScopes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AspNetRoleClaims", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + RoleId = table.Column(type: "nvarchar(450)", nullable: false), + ClaimType = table.Column(type: "nvarchar(max)", nullable: true), + ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserClaims", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + UserId = table.Column(type: "nvarchar(450)", nullable: false), + ClaimType = table.Column(type: "nvarchar(max)", nullable: true), + ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AspNetUserClaims_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserLogins", + columns: table => new + { + LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), + ProviderKey = table.Column(type: "nvarchar(450)", nullable: false), + ProviderDisplayName = table.Column(type: "nvarchar(max)", nullable: true), + UserId = table.Column(type: "nvarchar(450)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); + table.ForeignKey( + name: "FK_AspNetUserLogins_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserRoles", + columns: table => new + { + UserId = table.Column(type: "nvarchar(450)", nullable: false), + RoleId = table.Column(type: "nvarchar(450)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetRoles_RoleId", + column: x => x.RoleId, + principalTable: "AspNetRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AspNetUserRoles_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AspNetUserTokens", + columns: table => new + { + UserId = table.Column(type: "nvarchar(450)", nullable: false), + LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), + Name = table.Column(type: "nvarchar(450)", nullable: false), + Value = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AspNetUserTokens_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictAuthorizations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), + ConcurrencyToken = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + CreationDate = table.Column(type: "datetime2", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + Scopes = table.Column(type: "nvarchar(max)", nullable: true), + Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), + Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictAuthorizations", x => x.Id); + table.ForeignKey( + name: "FK_OpenIddictAuthorizations_OpenIddictApplications_ApplicationId", + column: x => x.ApplicationId, + principalTable: "OpenIddictApplications", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "OpenIddictTokens", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationId = table.Column(type: "uniqueidentifier", nullable: true), + AuthorizationId = table.Column(type: "uniqueidentifier", nullable: true), + ConcurrencyToken = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + CreationDate = table.Column(type: "datetime2", nullable: true), + ExpirationDate = table.Column(type: "datetime2", nullable: true), + Payload = table.Column(type: "nvarchar(max)", nullable: true), + Properties = table.Column(type: "nvarchar(max)", nullable: true), + RedemptionDate = table.Column(type: "datetime2", nullable: true), + ReferenceId = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), + Status = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true), + Subject = table.Column(type: "nvarchar(400)", maxLength: 400, nullable: true), + Type = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_OpenIddictTokens", x => x.Id); + table.ForeignKey( + name: "FK_OpenIddictTokens_OpenIddictApplications_ApplicationId", + column: x => x.ApplicationId, + principalTable: "OpenIddictApplications", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_OpenIddictTokens_OpenIddictAuthorizations_AuthorizationId", + column: x => x.AuthorizationId, + principalTable: "OpenIddictAuthorizations", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_AspNetRoleClaims_RoleId", + table: "AspNetRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "RoleNameIndex", + table: "AspNetRoles", + column: "NormalizedName", + unique: true, + filter: "[NormalizedName] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserClaims_UserId", + table: "AspNetUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserLogins_UserId", + table: "AspNetUserLogins", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AspNetUserRoles_RoleId", + table: "AspNetUserRoles", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "EmailIndex", + table: "AspNetUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "UserNameIndex", + table: "AspNetUsers", + column: "NormalizedUserName", + unique: true, + filter: "[NormalizedUserName] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictApplications_ClientId", + table: "OpenIddictApplications", + column: "ClientId", + unique: true, + filter: "[ClientId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictAuthorizations_ApplicationId_Status_Subject_Type", + table: "OpenIddictAuthorizations", + columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictScopes_Name", + table: "OpenIddictScopes", + column: "Name", + unique: true, + filter: "[Name] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_ApplicationId_Status_Subject_Type", + table: "OpenIddictTokens", + columns: new[] { "ApplicationId", "Status", "Subject", "Type" }); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_AuthorizationId", + table: "OpenIddictTokens", + column: "AuthorizationId"); + + migrationBuilder.CreateIndex( + name: "IX_OpenIddictTokens_ReferenceId", + table: "OpenIddictTokens", + column: "ReferenceId", + unique: true, + filter: "[ReferenceId] IS NOT NULL"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AspNetRoleClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserClaims"); + + migrationBuilder.DropTable( + name: "AspNetUserLogins"); + + migrationBuilder.DropTable( + name: "AspNetUserRoles"); + + migrationBuilder.DropTable( + name: "AspNetUserTokens"); + + migrationBuilder.DropTable( + name: "OpenIddictScopes"); + + migrationBuilder.DropTable( + name: "OpenIddictTokens"); + + migrationBuilder.DropTable( + name: "AspNetRoles"); + + migrationBuilder.DropTable( + name: "AspNetUsers"); + + migrationBuilder.DropTable( + name: "OpenIddictAuthorizations"); + + migrationBuilder.DropTable( + name: "OpenIddictApplications"); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Migrations/AuthorizationDbContextModelSnapshot.cs b/Web/Resgrid.Web.ServicesCore/Migrations/AuthorizationDbContextModelSnapshot.cs new file mode 100644 index 00000000..de47feca --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Migrations/AuthorizationDbContextModelSnapshot.cs @@ -0,0 +1,508 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Resgrid.Web.Services.Models; + +namespace Resgrid.Web.Services.Migrations +{ + [DbContext(typeof(AuthorizationDbContext))] + partial class AuthorizationDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.9") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderKey") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("Name") + .HasColumnType("nvarchar(450)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("Permissions") + .HasColumnType("nvarchar(max)"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedirectUris") + .HasColumnType("nvarchar(max)"); + + b.Property("Requirements") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ClientId") + .IsUnique() + .HasFilter("[ClientId] IS NOT NULL"); + + b.ToTable("OpenIddictApplications"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Descriptions") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayNames") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("Resources") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique() + .HasFilter("[Name] IS NOT NULL"); + + b.ToTable("OpenIddictScopes"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ApplicationId") + .HasColumnType("uniqueidentifier"); + + b.Property("AuthorizationId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyToken") + .IsConcurrencyToken() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("ExpirationDate") + .HasColumnType("datetime2"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("Properties") + .HasColumnType("nvarchar(max)"); + + b.Property("RedemptionDate") + .HasColumnType("datetime2"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("nvarchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId") + .IsUnique() + .HasFilter("[ReferenceId] IS NOT NULL"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens"); + }); + + modelBuilder.Entity("Resgrid.Web.Services.Models.ApplicationUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Resgrid.Web.Services.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Resgrid.Web.Services.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Resgrid.Web.Services.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Resgrid.Web.Services.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") + .WithMany("Authorizations") + .HasForeignKey("ApplicationId"); + + b.Navigation("Application"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreToken", b => + { + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", "Application") + .WithMany("Tokens") + .HasForeignKey("ApplicationId"); + + b.HasOne("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", "Authorization") + .WithMany("Tokens") + .HasForeignKey("AuthorizationId"); + + b.Navigation("Application"); + + b.Navigation("Authorization"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreApplication", b => + { + b.Navigation("Authorizations"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("OpenIddict.EntityFrameworkCore.Models.OpenIddictEntityFrameworkCoreAuthorization", b => + { + b.Navigation("Tokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/AuthorizationDbContext.cs b/Web/Resgrid.Web.ServicesCore/Models/AuthorizationDbContext.cs new file mode 100644 index 00000000..1e9179db --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/AuthorizationDbContext.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; + +namespace Resgrid.Web.Services.Models +{ + public class ApplicationUser : IdentityUser { } + + public class AuthorizationDbContext : IdentityDbContext + { + public AuthorizationDbContext(DbContextOptions options) + : base(options) { } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + // Customize the ASP.NET Identity model and override the defaults if needed. + // For example, you can rename the ASP.NET Identity table names and more. + // Add your customizations after calling base.OnModelCreating(builder); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v3/BigBoard/BigBoardModel.cs b/Web/Resgrid.Web.ServicesCore/Models/v3/BigBoard/BigBoardModel.cs index 05ef7e2b..5ab81236 100644 --- a/Web/Resgrid.Web.ServicesCore/Models/v3/BigBoard/BigBoardModel.cs +++ b/Web/Resgrid.Web.ServicesCore/Models/v3/BigBoard/BigBoardModel.cs @@ -50,6 +50,7 @@ public class UnitViewModel public decimal? Longitude { get; set; } public string GroupName { get; set; } public int GroupId { get; set; } + public string DestinationName { get; set; } } public class CallViewModel diff --git a/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/CallNoteResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/CallNoteResult.cs index c838d534..9caa1d3c 100644 --- a/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/CallNoteResult.cs +++ b/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/CallNoteResult.cs @@ -53,5 +53,10 @@ public class CallNoteResult /// (Optional) Note Longitude /// public decimal? Lng { get; set; } + + /// + /// Full name of the user who submitted the note + /// + public string Fnm { get; set; } } } diff --git a/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/CallResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/CallResult.cs index 868e595f..5805906b 100644 --- a/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/CallResult.cs +++ b/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/CallResult.cs @@ -128,5 +128,20 @@ public class CallResult /// When was the call Logged On in UTC time /// public DateTime Utc { get; set; } + + /// + /// Dispatch On + /// + public DateTime? Don { get; set; } + + /// + /// Geolocation (Latitude) + /// + public string Gla { get; set; } + + /// + /// Geolocation (Longitude) + /// + public string Glo { get; set; } } } diff --git a/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/EditCallInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/EditCallInput.cs index 4498eeb8..26d81dae 100644 --- a/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/EditCallInput.cs +++ b/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/EditCallInput.cs @@ -1,4 +1,6 @@ -namespace Resgrid.Web.Services.Controllers.Version3.Models.Calls +using System; + +namespace Resgrid.Web.Services.Controllers.Version3.Models.Calls { /// /// Input into the API to update an existing call. Only specific information can be updated. @@ -9,20 +11,25 @@ public class EditCallInput /// Id of the call being updated /// public int Cid { get; set; } - - /// - /// Updated name of the call - /// + public string Pri { get; set; } public string Nme { get; set; } - - /// - /// Updated Nature of the Call - /// public string Noc { get; set; } - - /// - /// Updated Call Address - /// + public string Not { get; set; } public string Add { get; set; } + public string Geo { get; set; } + + public string Typ { get; set; } + public string W3W { get; set; } + public string Dis { get; set; } + public string CNme { get; set; } + public string CNum { get; set; } + + public string EId { get; set; } + public string InI { get; set; } + public string RId { get; set; } + public DateTime? Don { get; set; } + public string Cfd { get; set; } + + public bool RebroadcastCall { get; set; } } -} \ No newline at end of file +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/NewCallInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/NewCallInput.cs index 3c7bdb48..f3309fb1 100644 --- a/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/NewCallInput.cs +++ b/Web/Resgrid.Web.ServicesCore/Models/v3/Calls/NewCallInput.cs @@ -14,17 +14,16 @@ public class NewCallInput public string Not { get; set; } public string Add { get; set; } public string Geo { get; set; } - - public string Cid { get; set; } public string Typ { get; set; } public string W3W { get; set; } public string Dis { get; set; } public string CNme { get; set; } public string CNum { get; set; } - public string CId { get; set; } + public string EId { get; set; } public string InI { get; set; } public string RId { get; set; } - public DateTime Don { get; set; } + public DateTime? Don { get; set; } + public string Cfd { get; set; } } } diff --git a/Web/Resgrid.Web.ServicesCore/Models/v3/Dispatch/FormDataResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v3/Dispatch/FormDataResult.cs new file mode 100644 index 00000000..f6742fad --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v3/Dispatch/FormDataResult.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v3.Dispatch +{ + public class FormDataResult + { + public string Id { get; set; } + + public string Name { get; set; } + + public int Type { get; set; } + + public string Data { get; set; } + + public List Automations { get; set; } + } + + public class FormDataAutomationResult + { + public string Id { get; set; } + + public string FormId { get; set; } + + public string TriggerField { get; set; } + + public string TriggerValue { get; set; } + + public int OperationType { get; set; } + + public string OperationValue { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v3/Dispatch/PersonnelForCallResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v3/Dispatch/PersonnelForCallResult.cs index 11a5d4c1..156205e8 100644 --- a/Web/Resgrid.Web.ServicesCore/Models/v3/Dispatch/PersonnelForCallResult.cs +++ b/Web/Resgrid.Web.ServicesCore/Models/v3/Dispatch/PersonnelForCallResult.cs @@ -17,5 +17,6 @@ public class PersonnelForCallResult public List Roles { get; set; } public string Eta { get; set; } public int Weight { get; set; } + public string Location { get; set; } } } diff --git a/Web/Resgrid.Web.ServicesCore/Models/v3/Voice/DepartmentVoiceChannelResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v3/Voice/DepartmentVoiceChannelResult.cs new file mode 100644 index 00000000..7ae83036 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v3/Voice/DepartmentVoiceChannelResult.cs @@ -0,0 +1,11 @@ +namespace Resgrid.Web.Services.Models.v3.Voice +{ + public class DepartmentVoiceChannelResult + { + public string Name { get; set; } + + public int ConferenceNumber { get; set; } + + public bool IsDefault { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v3/Voice/DepartmentVoiceResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v3/Voice/DepartmentVoiceResult.cs new file mode 100644 index 00000000..2cf9ad22 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v3/Voice/DepartmentVoiceResult.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v3.Voice +{ + public class DepartmentVoiceResult + { + public bool VoiceEnabled { get; set; } + + public string Realm { get; set; } + + public string VoipServerWebsocketSslAddress { get; set; } + + public string CallerIdName { get; set; } + + public List Channels { get; set; } + + public DepartmentVoiceUserInfoResult UserInfo { get; set; } + } + + public class DepartmentVoiceUserInfoResult + { + public string Username { get; set; } + public string Password { get; set; } + public string Pin { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/CallFileResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/CallFileResult.cs new file mode 100644 index 00000000..bb4878cf --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/CallFileResult.cs @@ -0,0 +1,74 @@ +namespace Resgrid.Web.Services.Models.v4.CallFiles +{ + /// + /// A Call file result + /// + public class CallFileResult : StandardApiResponseV4Base + { + /// + /// Data payload + /// + public CallFileResultData Data { get; set; } + } + + /// + /// Object representing a file for a call in the Resgrid system + /// + public class CallFileResultData + { + /// + /// Id of the call file + /// + public string Id { get; set; } + + /// + /// Id of the Call + /// + public string CallId { get; set; } + + /// + /// Type of the file (Audio = 1, Image= 2, File = 3, Video = 4) + /// + public int Type { get; set; } + + /// + /// Name of the File + /// + public string FileName { get; set; } + + /// + /// Base64 File Data (may be null) + /// + public string Data { get; set; } + + /// + /// User friendly name of the file + /// + public string Name { get; set; } + + /// + /// Size of the file in bytes + /// + public int Size { get; set; } + + /// + /// The Url to get the file instead of using the Data value + /// + public string Url { get; set; } + + /// + /// User Id of the person who uploaded the file + /// + public string UserId { get; set; } + + /// + /// Timestamp of when the file was added + /// + public string Timestamp { get; set; } + + /// + /// Mime Type for the file + /// + public string Mime { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/CallFilesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/CallFilesResult.cs new file mode 100644 index 00000000..c13e85f6 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/CallFilesResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.CallFiles +{ + /// + /// A Call file result + /// + public class CallFilesResult : StandardApiResponseV4Base + { + /// + /// Data payload + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public CallFilesResult() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/SaveCallFileInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/SaveCallFileInput.cs new file mode 100644 index 00000000..6f6ca663 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/SaveCallFileInput.cs @@ -0,0 +1,46 @@ +using System.ComponentModel.DataAnnotations; + +namespace Resgrid.Web.Services.Models.v4.CallFiles +{ + /// + /// Input to attach a file to a call + /// + public class SaveCallFileInput + { + /// + /// Id of the Call + /// + [Required] + public string CallId { get; set; } + + /// + /// User Id of the user attaching the file + /// + [Required] + public string UserId { get; set; } + + /// + /// Type of the file (Audio = 1, Image = 2, File = 3, Video = 4) + /// + public int Type { get; set; } + + /// + /// Name of the file + /// + [Required] + public string Name { get; set; } + + /// + /// Base64 encoded string of the file being uploaded + /// + [Required] + public string Data { get; set; } + + + public string Latitude { get; set; } + + public string Longitude { get; set; } + + public string Note { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/SaveCallFileResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/SaveCallFileResult.cs new file mode 100644 index 00000000..ff167c97 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallFiles/SaveCallFileResult.cs @@ -0,0 +1,7 @@ +namespace Resgrid.Web.Services.Models.v4.CallFiles +{ + public class SaveCallFileResult : StandardApiResponseV4Base + { + public string Id { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallNotes/CallNotesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallNotes/CallNotesResult.cs new file mode 100644 index 00000000..a63aefa9 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallNotes/CallNotesResult.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.CallNotes +{ + /// + /// Gets the notes for a call + /// + public class CallNotesResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public CallNotesResult() + { + Data = new List(); + } + + /// + /// + /// + public class CallNoteResultData + { + /// + /// Call Id of the Note + /// + public string CallId { get; set; } + + /// + /// Call Note Id + /// + public string CallNoteId { get; set; } + + /// + /// UserId of the user who added the note + /// + public string UserId { get; set; } + + /// + /// Note source + /// + public int Source { get; set; } + + /// + /// Formatted Timestamp + /// + public string TimestampFormatted { get; set; } + + /// + /// Timestamp of when the note as added + /// + public DateTime Timestamp { get; set; } + + /// + /// Timestamp of when the note as added in Utc + /// + public DateTime TimestampUtc { get; set; } + + /// + /// Note content + /// + public string Note { get; set; } + + /// + /// (Optional) Note Latitude + /// + public decimal? Latitude { get; set; } + + /// + /// (Optional) Note Longitude + /// + public decimal? Longitude { get; set; } + + /// + /// Full name of the user who submitted the note + /// + public string FullName { get; set; } + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallNotes/SaveCallNoteInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallNotes/SaveCallNoteInput.cs new file mode 100644 index 00000000..50ebedcb --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallNotes/SaveCallNoteInput.cs @@ -0,0 +1,38 @@ +using System.ComponentModel.DataAnnotations; + +namespace Resgrid.Web.Services.Models.v4.CallNotes +{ + /// + /// Input to attach a note to call + /// + public class SaveCallNoteInput + { + /// + /// Id of the Call + /// + [Required] + public string CallId { get; set; } + + /// + /// UserId of the user adding the note + /// + [Required] + public string UserId { get; set; } + + /// + /// Note text to add + /// + [Required] + public string Note { get; set; } + + /// + /// Latitude of when the note was taken + /// + public string Latitude { get; set; } + + /// + /// Longitude of when the note was taken + /// + public string Longitude { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallNotes/SaveCallNoteResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallNotes/SaveCallNoteResult.cs new file mode 100644 index 00000000..b00c2b53 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallNotes/SaveCallNoteResult.cs @@ -0,0 +1,7 @@ +namespace Resgrid.Web.Services.Models.v4.Calls +{ + public class SaveCallNoteResult : StandardApiResponseV4Base + { + public string Id { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallPriorities/CallPrioritiesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallPriorities/CallPrioritiesResult.cs new file mode 100644 index 00000000..62767491 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallPriorities/CallPrioritiesResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.CallPriorities +{ + /// + /// Gets all the call priorities for the department + /// + public class CallPrioritiesResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public CallPrioritiesResult() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallPriorities/CallPriorityResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallPriorities/CallPriorityResult.cs new file mode 100644 index 00000000..408c6e0d --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallPriorities/CallPriorityResult.cs @@ -0,0 +1,68 @@ +namespace Resgrid.Web.Services.Models.v4.CallPriorities +{ + /// + /// Call Priority Definition + /// + public class CallPriorityResultData + { + /// + /// Call Priroity Id + /// + public int Id { get; set; } + + /// + /// Department Id the Priority is for + /// + public int DepartmentId { get; set; } + + /// + /// Name of the Priroity + /// + public string Name { get; set; } + + /// + /// HTML Color for the Priority + /// + public string Color { get; set; } + + /// + /// Sort order for the Priority + /// + public int Sort { get; set; } + + /// + /// Has the Priority been deleted. Deleted priorities should never be used or saved, they are intended for display purposes only. + /// + public bool IsDeleted { get; set; } + + /// + /// Is this the default priority + /// + public bool IsDefault { get; set; } + + /// + /// Does this priority dispatch personnel + /// + public bool DispatchPersonnel { get; set; } + + /// + /// Does this priority dispatch units + /// + public bool DispatchUnits { get; set; } + + /// + /// Should all personnel be dispatched/notified for this priority (i.e. All Call) + /// + public bool ForceNotifyAllPersonnel { get; set; } + + /// + /// Id for the Tone Sound to be used + /// + public int Tone { get; set; } + + /// + /// Is this a default system priority + /// + public bool IsSystemPriority { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallProtocols/CallProtocolResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallProtocols/CallProtocolResult.cs new file mode 100644 index 00000000..35565c9a --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallProtocols/CallProtocolResult.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.CallProtocols +{ + /// + /// Depicts a call protocol in the Resgrid system. + /// + public class CallProtocolResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public CallProtocolResultData Data { get; set; } + } + + /// + /// Call protocol data + /// + public class CallProtocolResultData + { + /// + /// Call Protocol Id + /// + public string Id { get; set; } + + /// + /// Department id this protocol is for + /// + public string DepartmentId { get; set; } + + /// + /// Name of the protocol + /// + public string Name { get; set; } + + /// + /// Protocol quick code + /// + public string Code { get; set; } + + /// + /// Is the protocol disabled + /// + public bool IsDisabled { get; set; } + + /// + /// Protocol Description + /// + public string Description { get; set; } + + /// + /// Actual protocol text + /// + public string ProtocolText { get; set; } + + /// + /// UTC of when the protocol was created + /// + public DateTime CreatedOn { get; set; } + + /// + /// Who created the procotol + /// + public string CreatedByUserId { get; set; } + + /// + /// When/if the procotol was updated + /// + public DateTime? UpdatedOn { get; set; } + + /// + /// Minimum weight to activate the procotol based on answers + /// + public int MinimumWeight { get; set; } + + /// + /// Who updated the protocol + /// + public string UpdatedByUserId { get; set; } + + public List Triggers { get; set; } + + public List Attachments { get; set; } + + public List Questions { get; set; } + + public int State { get; set; } + } + + public class ProtocolTriggerResultData + { + public string Id { get; set; } + + public int Type { get; set; } + + public DateTime? StartsOn { get; set; } + + public DateTime? EndsOn { get; set; } + + public int? Priority { get; set; } + + public string CallType { get; set; } + + public string Geofence { get; set; } + } + + public class ProtocolTriggerAttachmentResultData + { + public string Id { get; set; } + + public string FileName { get; set; } + + public string FileType { get; set; } + } + + public class ProtocolTriggerQuestionResultData + { + public string Id { get; set; } + + public string Question { get; set; } + + public List Answers { get; set; } + } + + public class ProtocolQuestionAnswerResultData + { + public string Id { get; set; } + + public string Answer { get; set; } + + public int Weight { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallProtocols/CallProtocolsResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallProtocols/CallProtocolsResult.cs new file mode 100644 index 00000000..88f06d4f --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallProtocols/CallProtocolsResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.CallProtocols +{ + /// + /// Gets all the call protocols for the department + /// + public class CallProtocolsResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public CallProtocolsResult() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallTypes/CallTypeResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallTypes/CallTypeResult.cs new file mode 100644 index 00000000..d7568a43 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallTypes/CallTypeResult.cs @@ -0,0 +1,18 @@ +namespace Resgrid.Web.Services.Models.v4.CallTypes +{ + /// + /// A call type + /// + public class CallTypeResultData + { + /// + /// Id of the call type + /// + public string Id { get; set; } + + /// + /// Name of the call type + /// + public string Name { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CallTypes/CallTypesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CallTypes/CallTypesResult.cs new file mode 100644 index 00000000..f3401277 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CallTypes/CallTypesResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.CallTypes +{ + /// + /// Gets the call types + /// + public class CallTypesResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public CallTypesResult() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/ActiveCallsResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/ActiveCallsResult.cs new file mode 100644 index 00000000..508c8b88 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/ActiveCallsResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Calls +{ + /// + /// Gets the calls current active, been dispatched and not closed or deleted + /// + public class ActiveCallsResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public ActiveCallsResult() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CallExtraDataResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CallExtraDataResult.cs new file mode 100644 index 00000000..b8002453 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CallExtraDataResult.cs @@ -0,0 +1,77 @@ +using Resgrid.Web.Services.Models.v4.CallPriorities; +using Resgrid.Web.Services.Models.v4.CallProtocols; +using System; +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Calls +{ + /// + /// Depicts a call in the Resgrid system. + /// + public class CallExtraDataResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public CallExtraDataResultData Data { get; set; } + + /// + /// Default constructor + /// + public CallExtraDataResult() + { + Data = new CallExtraDataResultData(); + } + } + + /// + /// Depicts a call in the Resgrid system. + /// + public class CallExtraDataResultData + { + /// + /// Unit and Personnel activities attached to this call + /// + public List Activity { get; set; } + + /// + /// Who was dispatched on this call, units, personnel, roles and groups + /// + public List Dispatches { get; set; } + + /// + /// Call priority inforamtion + /// + public CallPriorityResultData Priority { get; set; } + + /// + /// Protocols active fro this call + /// + public List Protocols { get; set; } + + /// + /// Default constructor + /// + public CallExtraDataResultData() + { + Activity = new List(); + Dispatches = new List(); + Protocols = new List(); + } + } + + public class DispatchedEventResultData + { + public string Id { get; set; } + public DateTime Timestamp { get; set; } + public string Type { get; set; } + public string Name { get; set; } + public string GroupId { get; set; } + public string Group { get; set; } + public string Note { get; set; } + public int StatusId { get; set; } + public string Location { get; set; } + public string StatusText { get; set; } + public string StatusColor { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CallResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CallResult.cs new file mode 100644 index 00000000..79d19cb7 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CallResult.cs @@ -0,0 +1,165 @@ +using Resgrid.Web.Services.Models.v4.CallProtocols; +using System; +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Calls +{ + /// + /// Depicts a call in the Resgrid system. + /// + public class CallResult: StandardApiResponseV4Base + { + /// + /// Response Data + /// + public CallResultData Data { get; set; } + } + + /// + /// Depicts a call in the Resgrid system. + /// + public class CallResultData + { + /// + /// Id of the call + /// + public string CallId { get; set; } + + //public string Unm { get; set; } + + /// + /// Priority of the call (Low = 0, Medium = 1, High = 2, Emergency = 3) + /// + public int Priority { get; set; } + + /// + /// Name of the Call + /// + public string Name { get; set; } + + /// + /// Nature of the Call + /// + public string Nature { get; set; } + + /// + /// High level note for the Call + /// + public string Note { get; set; } + + /// + /// Call Address + /// + public string Address { get; set; } + + /// + /// Geo location Coordinates + /// + public string Geolocation { get; set; } + + /// + /// When was the call Logged On + /// + public DateTime LoggedOn { get; set; } + + /// + /// State of the call (Active = 0, Closed = 1, Cancelled = 2, Unfounded = 3) + /// + public int State { get; set; } + + /// + /// Call Number, will be the 2 digit year (i.e. 15 for 2015) and an auto incrementing number for the call in the year. So 15-43 is the 43'rd call in 2015. + /// + public string Number { get; set; } + + /// + /// The amount of notes the call has + /// + public int NotesCount { get; set; } + + /// + /// The amount of audio the call has + /// + public int AudioCount { get; set; } + + /// + /// The amount of images the call has + /// + public int ImgagesCount { get; set; } + + /// + /// The amount of files the call has + /// + public int FileCount { get; set; } + + /// + /// What 3 Words Address + /// + public string What3Words { get; set; } + + /// + /// Reporter Name + /// + public string ContactName { get; set; } + + /// + /// Reporter Contact Info + /// + public string ContactInfo { get; set; } + + /// + /// Reference Id + /// + public string ReferenceId { get; set; } + + /// + /// External Id + /// + public string ExternalId { get; set; } + + /// + /// INcident Id + /// + public string IncidentId { get; set; } + + /// + /// Audio File Id + /// + public string AudioFileId { get; set; } + + /// + /// Call Type + /// + public string Type { get; set; } + + /// + /// When was the call Logged On in UTC time + /// + public DateTime LoggedOnUtc { get; set; } + + /// + /// Dispatch On + /// + public DateTime? DispatchedOn { get; set; } + + /// + /// Dispatch On + /// + public DateTime? DispatchedOnUtc { get; set; } + + /// + /// Geolocation (Latitude) + /// + public string Latitude { get; set; } + + /// + /// Geolocation (Longitude) + /// + public string Longitude { get; set; } + + /// + /// Active Protocols for this call + /// + public List Protocols { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CloseCallInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CloseCallInput.cs new file mode 100644 index 00000000..38f0f487 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CloseCallInput.cs @@ -0,0 +1,27 @@ +using System.ComponentModel.DataAnnotations; + +namespace Resgrid.Web.Services.Models.v4.Calls +{ + /// + /// Input information to close a call + /// + public class CloseCallInput + { + /// + /// Call Id of the call to close + /// + [Required] + public string Id { get; set; } + + /// + /// Message or notes of the call to close + /// + public string Notes { get; set; } + + /// + /// Type of call closure that is used + /// + [Required] + public int Type { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CloseCallResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CloseCallResult.cs new file mode 100644 index 00000000..13840723 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/CloseCallResult.cs @@ -0,0 +1,13 @@ +namespace Resgrid.Web.Services.Models.v4.Calls +{ + /// + /// The result/return for closing a call + /// + public class CloseCallResult : StandardApiResponseV4Base + { + /// + /// Id of the call closed + /// + public string Id { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/DeleteCallResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/DeleteCallResult.cs new file mode 100644 index 00000000..79608c3e --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/DeleteCallResult.cs @@ -0,0 +1,7 @@ +namespace Resgrid.Web.Services.Models.v4.Calls +{ + public class DeleteCallResult : StandardApiResponseV4Base + { + public string Id { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/EditCallInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/EditCallInput.cs new file mode 100644 index 00000000..221fab27 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/EditCallInput.cs @@ -0,0 +1,104 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Resgrid.Web.Services.Models.v4.Calls +{ + /// + /// Data needed to create a new call + /// + public class EditCallInput + { + /// + /// Id of the call to update + /// + public string Id { get; set; } + + /// + /// Priority of the call + /// + [Required] + public int Priority { get; set; } + + /// + /// Name of the call + /// + [Required] + public string Name { get; set; } + + /// + /// Nature of the call + /// + [Required] + public string Nature { get; set; } + + /// + /// Dispatch note + /// + public string Note { get; set; } + + /// + /// Address + /// + public string Address { get; set; } + + /// + /// Geolocation data "lat,lon" + /// + public string Geolocation { get; set; } + + /// + /// Type of the call + /// + public string Type { get; set; } + + /// + /// What 3 Words location + /// + public string What3Words { get; set; } + + /// + /// Comma seperated list of users,units,roles and groups to dipstach + /// + public string DispatchList { get; set; } + + /// + /// Contact Name + /// + public string ContactName { get; set; } + + /// + /// Contact Info + /// + public string ContactInfo { get; set; } + + /// + /// External Call Id + /// + public string ExternalId { get; set; } + + /// + /// Incident Id + /// + public string IncidentId { get; set; } + + /// + /// Reference Id + /// + public string ReferenceId { get; set; } + + /// + /// Time in the future, in the departments local time, to dispatch the call + /// + public DateTime? DispatchOn { get; set; } + + /// + /// Call Intake form JSON + /// + public string CallFormData { get; set; } + + /// + /// Should all the entities attached to the call be re-notified + /// + public bool RebroadcastCall { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/EditCallResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/EditCallResult.cs new file mode 100644 index 00000000..639053e5 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/EditCallResult.cs @@ -0,0 +1,7 @@ +namespace Resgrid.Web.Services.Models.v4.Calls +{ + public class EditCallResult: StandardApiResponseV4Base + { + public string Id { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/GetCallResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/GetCallResult.cs new file mode 100644 index 00000000..43746d7c --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/GetCallResult.cs @@ -0,0 +1,13 @@ +namespace Resgrid.Web.Services.Models.v4.Calls +{ + /// + /// Gets the calls current active, been dispatched and not closed or deleted + /// + public class GetCallResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public CallResultData Data { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/NewCallInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/NewCallInput.cs new file mode 100644 index 00000000..c076bee5 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/NewCallInput.cs @@ -0,0 +1,94 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Resgrid.Web.Services.Models.v4.Calls +{ + /// + /// Data needed to create a new call + /// + public class NewCallInput + { + /// + /// Priority of the call + /// + [Required] + public int Priority { get; set; } + + /// + /// Name of the call + /// + [Required] + public string Name { get; set; } + + /// + /// Nature of the call + /// + [Required] + public string Nature { get; set; } + + /// + /// Dispatch note + /// + public string Note { get; set; } + + /// + /// Address + /// + public string Address { get; set; } + + /// + /// Geolocation data "lat,lon" + /// + public string Geolocation { get; set; } + + /// + /// Type of the call + /// + public string Type { get; set; } + + /// + /// What 3 Words location + /// + public string What3Words { get; set; } + + /// + /// Comma seperated list of users,units,roles and groups to dipstach + /// + public string DispatchList { get; set; } + + /// + /// Contact Name + /// + public string ContactName { get; set; } + + /// + /// Contact Info + /// + public string ContactInfo { get; set; } + + /// + /// External Call Id + /// + public string ExternalId { get; set; } + + /// + /// Incident Id + /// + public string IncidentId { get; set; } + + /// + /// Reference Id + /// + public string ReferenceId { get; set; } + + /// + /// Time in the future, in the departments local time, to dispatch the call + /// + public DateTime? DispatchOn { get; set; } + + /// + /// Call Intake form JSON + /// + public string CallFormData { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/SaveCallResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/SaveCallResult.cs new file mode 100644 index 00000000..08cc15c2 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/SaveCallResult.cs @@ -0,0 +1,7 @@ +namespace Resgrid.Web.Services.Models.v4.Calls +{ + public class SaveCallResult: StandardApiResponseV4Base + { + public string Id { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/ScheduledCallsResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/ScheduledCallsResult.cs new file mode 100644 index 00000000..6e5dd26a --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/ScheduledCallsResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Calls +{ + /// + /// Gets the calls current scheduled but not yet dispatched + /// + public class ScheduledCallsResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public ScheduledCallsResult() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/UpdateDispatchTimeInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/UpdateDispatchTimeInput.cs new file mode 100644 index 00000000..55714a33 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/UpdateDispatchTimeInput.cs @@ -0,0 +1,23 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace Resgrid.Web.Services.Models.v4.Calls +{ + /// + /// Input data needed to update a calls scheduled dispatch time + /// + public class UpdateDispatchTimeInput + { + /// + /// Id of the call to update + /// + [Required] + public string Id { get; set; } + + /// + /// Date in the future to update to + /// + [Required] + public DateTime Date { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/UpdateScheduledDispatchTimeResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/UpdateScheduledDispatchTimeResult.cs new file mode 100644 index 00000000..1dca210c --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Calls/UpdateScheduledDispatchTimeResult.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Resgrid.Web.Services.Models.v4.Calls +{ + public class UpdateScheduledDispatchTimeResult : StandardApiResponseV4Base + { + public string Id { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CustomStatuses/CustomStatusResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CustomStatuses/CustomStatusResult.cs new file mode 100644 index 00000000..0ea693e2 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CustomStatuses/CustomStatusResult.cs @@ -0,0 +1,69 @@ +namespace Resgrid.Web.Services.Models.v4.CustomStatuses +{ + /// + /// Depicts a custom status in the Resgrid system. + /// + public class CustomStatusResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public CustomStatusResultData Data { get; set; } + } + + /// + /// Custom Status + /// + public class CustomStatusResultData + { + /// + /// Custom Status Id + /// + public string Id { get; set; } + + /// + /// Custom Status Type + /// + public int Type { get; set; } + + /// + /// State Id + /// + public string StateId { get; set; } + + /// + /// Text for the Custom Status + /// + public string Text { get; set; } + + /// + /// Button Color + /// + public string BColor { get; set; } + + /// + /// Text Color + /// + public string Color { get; set; } + + /// + /// Require GPS for this Status + /// + public bool Gps { get; set; } + + /// + /// Is the Note Required or Optional + /// + public int Note { get; set; } + + /// + /// Detail type id + /// + public int Detail { get; set; } + + /// + /// Is this custom status deleted (only should be used for display) + /// + public bool IsDeleted { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/CustomStatuses/CustomStatusesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/CustomStatuses/CustomStatusesResult.cs new file mode 100644 index 00000000..e59d959e --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/CustomStatuses/CustomStatusesResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.CustomStatuses +{ + /// + /// Custom defined Status for Personnel and Units + /// + public class CustomStatusesResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public CustomStatusesResult() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Device/PushRegistrationInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Device/PushRegistrationInput.cs new file mode 100644 index 00000000..78f6a2ca --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Device/PushRegistrationInput.cs @@ -0,0 +1,28 @@ +namespace Resgrid.Web.Services.Models.v4.Device +{ + /// + /// Object that contains the device specific information needed to register the device for push notifications + /// + public class PushRegistrationInput + { + /// + /// The platform this device registration is going against + /// + public int Platform { get; set; } + + /// + /// The push network resgistration token to register with Resgrid for Push Notifications + /// + public string Token { get; set; } + + /// + /// The UnitId of the device being registered if it's from the Unit App + /// + public string UnitId { get; set; } + + /// + /// Device UDID + /// + public string DeviceUuid { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Device/PushRegistrationResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Device/PushRegistrationResult.cs new file mode 100644 index 00000000..b6088b65 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Device/PushRegistrationResult.cs @@ -0,0 +1,13 @@ +namespace Resgrid.Web.Services.Models.v4.Device +{ + /// + /// Depicts a request to register for push notifications + /// + public class PushRegistrationResult : StandardApiResponseV4Base + { + /// + /// Id of the device registration created + /// + public string Id { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Device/PushUnRegistrationInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Device/PushUnRegistrationInput.cs new file mode 100644 index 00000000..e11ddc1a --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Device/PushUnRegistrationInput.cs @@ -0,0 +1,13 @@ +namespace Resgrid.Web.Services.Models.v4.Device +{ + /// + /// Unregister a device for push + /// + public class PushUnRegistrationInput + { + /// + /// Device UDID + /// + public string DeviceUuid { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetCallTemplatesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetCallTemplatesResult.cs new file mode 100644 index 00000000..6631fcc8 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetCallTemplatesResult.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Dispatch +{ + /// + /// DCall Templates for Quick Dispatch + /// + public class GetCallTemplatesResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public GetCallTemplatesResult() + { + Data = new List(); + } + } + + /// + /// Call Template + /// + public class GetCallTemplatesResultData + { + /// + /// Call Template Id + /// + public string Id { get; set; } + + /// + /// Is template disabled + /// + public bool IsDisabled { get; set; } + + /// + /// Call Template name + /// + public string Name { get; set; } + + /// + /// Name the call + /// + public string CallName { get; set; } + + /// + /// Nature of the call + /// + public string CallNature { get; set; } + + /// + /// Type of the call + /// + public string CallType { get; set; } + + /// + /// Priority of the call + /// + public int CallPriority { get; set; } + + /// + /// Who created the template + /// + public string CreatedByUserId { get; set; } + + /// + /// When was it created + /// + public DateTime CreatedOn { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetGroupsForCallGridResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetGroupsForCallGridResult.cs new file mode 100644 index 00000000..cbda0080 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetGroupsForCallGridResult.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Dispatch +{ + /// + /// Data needed for the new call form to display dispatch groups + /// + public class GetGroupsForCallGridResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public GetGroupsForCallGridResult() + { + Data = new List(); + } + } + + /// + /// All the data required to populate the New Call form + /// + public class GetGroupsForCallGridResultData + { + /// + /// Group id + /// + public string GroupId { get; set; } + + /// + /// Group name + /// + public string Name { get; set; } + + /// + /// Members count + /// + public int Count { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetPersonnelForCallGridResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetPersonnelForCallGridResult.cs new file mode 100644 index 00000000..dbcc6389 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetPersonnelForCallGridResult.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Dispatch +{ + /// + /// Data needed for the Dispatch App Modal that sets the state for a unit + /// + public class GetPersonnelForCallGridResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public GetPersonnelForCallGridResult() + { + Data = new List(); + } + } + + /// + /// Role entry for the new call dispatch grid + /// + public class GetPersonnelForCallGridResultData + { + public string UserId { get; set; } + public string Name { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public string Group { get; set; } + public int GroupId { get; set; } + public string Status { get; set; } + public string StatusColor { get; set; } + public string Staffing { get; set; } + public string StaffingColor { get; set; } + public List Roles { get; set; } + public string Eta { get; set; } + public int Weight { get; set; } + public string Location { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetRolesForCallGridResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetRolesForCallGridResult.cs new file mode 100644 index 00000000..433e3165 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetRolesForCallGridResult.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Dispatch +{ + /// + /// Data needed for the Dispatch App Modal that sets the state for a unit + /// + public class GetRolesForCallGridResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public GetRolesForCallGridResult() + { + Data = new List(); + } + } + + /// + /// All the data required to populate the New Call form + /// + public class GetRolesForCallGridResultData + { + /// + /// Role id + /// + public string RoleId { get; set; } + + /// + /// Role name + /// + public string Name { get; set; } + + /// + /// Number of users in the role + /// + public int Count { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetSetUnitStateResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetSetUnitStateResult.cs new file mode 100644 index 00000000..df59915c --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/GetSetUnitStateResult.cs @@ -0,0 +1,49 @@ +using Resgrid.Web.Services.Models.v4.Calls; +using Resgrid.Web.Services.Models.v4.CustomStatuses; +using Resgrid.Web.Services.Models.v4.Groups; +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Dispatch +{ + /// + /// Data needed for the Dispatch App Modal that sets the state for a unit + /// + public class GetSetUnitStateResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public GetSetUnitStateResultData Data { get; set; } + } + + /// + /// All the data required to populate the New Call form + /// + public class GetSetUnitStateResultData + { + /// + /// Unit id + /// + public string UnitId { get; set; } + + /// + /// Name of the unit + /// + public string UnitName { get; set; } + + /// + /// Stations the Unit can respond to + /// + public List Stations { get; set; } + + /// + /// Calls the unit can respond to + /// + public List Calls { get; set; } + + /// + /// Status types + /// + public List Statuses { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/NewCallFormResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/NewCallFormResult.cs new file mode 100644 index 00000000..5f40deb7 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Dispatch/NewCallFormResult.cs @@ -0,0 +1,40 @@ +using Resgrid.Web.Services.Models.v4.CallPriorities; +using Resgrid.Web.Services.Models.v4.CallTypes; +using Resgrid.Web.Services.Models.v4.CustomStatuses; +using Resgrid.Web.Services.Models.v4.Groups; +using Resgrid.Web.Services.Models.v4.Personnel; +using Resgrid.Web.Services.Models.v4.Roles; +using Resgrid.Web.Services.Models.v4.UnitRoles; +using Resgrid.Web.Services.Models.v4.Units; +using Resgrid.Web.Services.Models.v4.UnitStatus; +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Dispatch +{ + /// + /// Result containing all the data required to populate the New Call form + /// + public class NewCallFormResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public NewCallResultData Data { get; set; } + } + + /// + /// All the data required to populate the New Call form + /// + public class NewCallResultData + { + public List Personnel { get; set; } + public List Groups { get; set; } + public List Units { get; set; } + public List Roles { get; set; } + public List Statuses { get; set; } + public List UnitStatuses { get; set; } + public List UnitRoles { get; set; } + public List Priorities { get; set; } + public List CallTypes { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Forms/FormResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Forms/FormResult.cs new file mode 100644 index 00000000..d1b80203 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Forms/FormResult.cs @@ -0,0 +1,82 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Forms +{ + /// + /// Depicts a user created form. + /// + public class FormResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public FormResultData Data { get; set; } + } + + /// + /// A custom form (user created) + /// + public class FormResultData + { + /// + /// Form Id + /// + public string Id { get; set; } + + /// + /// Form Name + /// + public string Name { get; set; } + + /// + /// Type of the Form, i.e. Call + /// + public int Type { get; set; } + + /// + /// Form JSON Data (i.e. the data needed to create the form) + /// + public string Data { get; set; } + + /// + /// Automations for the Form + /// + public List Automations { get; set; } + } + + /// + /// Form automations + /// + public class FormDataAutomationResult + { + /// + /// Form automation id + /// + public string Id { get; set; } + + /// + /// Form Id the automation is for + /// + public string FormId { get; set; } + + /// + /// Field name that triggers this automation + /// + public string TriggerField { get; set; } + + /// + /// Value the field needs to be + /// + public string TriggerValue { get; set; } + + /// + /// Auotmation operation type + /// + public int OperationType { get; set; } + + /// + /// Automation operation value + /// + public string OperationValue { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Groups/GroupResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Groups/GroupResult.cs new file mode 100644 index 00000000..2c4e77cc --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Groups/GroupResult.cs @@ -0,0 +1,39 @@ +namespace Resgrid.Web.Services.Models.v4.Groups +{ + /// + /// A group in the Resgrid system + /// + public class GroupResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public GroupResultData Data { get; set; } + } + + /// + /// All the data required to populate the New Call form + /// + public class GroupResultData + { + /// + /// Id of the group + /// + public string GroupId { get; set; } + + /// + /// Type id of the Group (Station or Orginizational) + /// + public string TypeId { get; set; } + + /// + /// Name of the Group + /// + public string Name { get; set; } + + /// + /// Address of the Group (for Station Groups) + /// + public string Address { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Groups/GroupResults.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Groups/GroupResults.cs new file mode 100644 index 00000000..450af187 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Groups/GroupResults.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Groups +{ + /// + /// A list of groups in the Resgrid system + /// + public class GroupResults : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public GroupResults() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Health/HealthResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Health/HealthResult.cs new file mode 100644 index 00000000..9f3c97b2 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Health/HealthResult.cs @@ -0,0 +1,52 @@ +namespace Resgrid.Web.Services.Models.v4.Health +{ + /// + /// Result of the Health check API + /// + public class HealthResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public HealthResultData Data { get; set; } + + /// + /// Default constructor + /// + public HealthResult() + { + Data = new HealthResultData(); + } + } + + /// + /// Health check data for the current state of the api server handling the request + /// + public class HealthResultData + { + /// + /// Site\Location of this API + /// + public string SiteId { get; set; } + + /// + /// The Version of the Services + /// + public string ServicesVersion { get; set; } + + /// + /// Gets the current API version + /// + public string ApiVersion { get; set; } + + /// + /// Can the API services talk to the database + /// + public bool DatabaseOnline { get; set; } + + /// + /// Can the API services talk to the cache + /// + public bool CacheOnline { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Mapping/GetMapDataResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Mapping/GetMapDataResult.cs new file mode 100644 index 00000000..29a87fa7 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Mapping/GetMapDataResult.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Mapping +{ + public class GetMapDataResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public GetMapDataResultData Data { get; set; } + + /// + /// Default constructor + /// + public GetMapDataResult() + { + Data = new GetMapDataResultData(); + } + } + + public class GetMapDataResultData + { + public GetMapDataResultData() + { + MapMakerInfos = new List(); + } + + public double CenterLat { get; set; } + public double CenterLon { get; set; } + public int ZoomLevel { get; set; } + public List MapMakerInfos { get; set; } + } + + public class MapMakerInfoData + { + public string Id { get; set; } + public double Longitude { get; set; } + public double Latitude { get; set; } + public string Title { get; set; } + public int zIndex { get; set; } + public string ImagePath { get; set; } + public string InfoWindowContent { get; set; } + public string Color { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Personnel/PersonnelInfoResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Personnel/PersonnelInfoResult.cs new file mode 100644 index 00000000..f0ea0f87 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Personnel/PersonnelInfoResult.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Personnel +{ + /// + /// Result containing all the data required to populate the New Call form + /// + public class PersonnelInfoResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public PersonnelInfoResultData Data { get; set; } + } + + /// + /// Information about a User + /// + public class PersonnelInfoResultData + { + /// + /// The UserId GUID/UUID for the user + /// + public string UserId { get; set; } + + /// + /// DepartmentId of the deparment the user belongs to + /// + public string DepartmentId { get; set; } + + /// + /// Department specificed ID number for this user + /// + public string IdentificationNumber { get; set; } + + /// + /// The Users First Name + /// + public string FirstName { get; set; } + + /// + /// The Users Last Name + /// + public string LastName { get; set; } + + /// + /// The Users Email Address + /// + public string EmailAddress { get; set; } + + /// + /// The Users Mobile Telephone Number + /// + public string MobilePhone { get; set; } + + /// + /// GroupId the user is assigned to (0 for no group) + /// + public string GroupId { get; set; } + + /// + /// Name of the group the user is assigned to + /// + public string GroupName { get; set; } + + /// + /// Enumeration/List of roles the user currently holds + /// + public List Roles { get; set; } + + /// + /// The current action/status type for the user + /// + public string StatusId { get; set; } + + /// + /// The timestamp of the last action. This is converted UTC to the departments, or users, TimeZone. + /// + public DateTime StatusTimestamp { get; set; } + + /// + /// The current action/status destination id for the user + /// + public string StatusDestinationId { get; set; } + + /// + /// The current action/status destination name for the user + /// + public string StatusDestinationName { get; set; } + + /// + /// The current staffing level (state) type for the user + /// + public string StaffingId { get; set; } + + /// + /// The timestamp of the last state/staffing level. This is converted UTC to the departments, or users, TimeZone. + /// + public DateTime StaffingTimestamp { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Roles/RoleResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Roles/RoleResult.cs new file mode 100644 index 00000000..3c9256fc --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Roles/RoleResult.cs @@ -0,0 +1,29 @@ +namespace Resgrid.Web.Services.Models.v4.Roles +{ + /// + /// A role in the Resgrid system + /// + public class RoleResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public RoleResultData Data { get; set; } + } + + /// + /// Role + /// + public class RoleResultData + { + /// + /// Id of the Role + /// + public string RoleId { get; set; } + + /// + /// Name of the Role + /// + public string Name { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Roles/RolesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Roles/RolesResult.cs new file mode 100644 index 00000000..5494eae5 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Roles/RolesResult.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Roles +{ + /// + /// A role in the Resgrid system + /// + public class RolesResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Security/DepartmentRightsResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Security/DepartmentRightsResult.cs new file mode 100644 index 00000000..0d474206 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Security/DepartmentRightsResult.cs @@ -0,0 +1,92 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Security +{ + public class DepartmentRightsResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public DepartmentRightsResultData Data { get; set; } + + /// + /// Default constructor + /// + public DepartmentRightsResult() + { + Data = new DepartmentRightsResultData(); + } + } + + /// + /// Object that denotes the right assignments for a user in a department + /// + public class DepartmentRightsResultData + { + /// + /// Department name + /// + public string DepartmentName { get; set; } + + /// + /// Users full name + /// + public string FullName { get; set; } + + /// + /// Email address + /// + public string EmailAddress { get; set; } + + /// + /// Department id + /// + public string DepartmentId { get; set; } + + /// + /// Is the user a department admin + /// + public bool IsAdmin { get; set; } + + /// + /// Can the user view PII + /// + public bool CanViewPII { get; set; } + + /// + /// Can the user create calls + /// + public bool CanCreateCalls { get; set; } + + /// + /// Can the user add a note + /// + public bool CanAddNote { get; set; } + + /// + /// Can the user create messages + /// + public bool CanCreateMessage { get; set; } + + /// + /// Groups in the department the user is a member of + /// + public List Groups { get; set; } + } + + /// + /// Object containting a group right assignemnt + /// + public class GroupRightData + { + /// + /// Id of the group this right assignement is for + /// + public string GroupId { get; set; } + + /// + /// Is the user a group admin + /// + public bool IsGroupAdmin { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/StandardApiResponseV4Base.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/StandardApiResponseV4Base.cs new file mode 100644 index 00000000..99f100c5 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/StandardApiResponseV4Base.cs @@ -0,0 +1,45 @@ +using System; + +namespace Resgrid.Web.Services.Models.v4 +{ + /// + /// The standard response base object for the v4 api. A Data property will be adding on top of this. + /// + public class StandardApiResponseV4Base + { + /// + /// Number of recrods returned + /// + public int PageSize { get; set; } + + /// + /// Timestamp in UTC of the operation + /// + public DateTime Timestamp { get; set; } + + /// + /// API Version that produced the response + /// + public string Version { get; set; } + + /// + /// Name of the node the processed the operation + /// + public string Node { get; set; } + + /// + /// Name of the environment that the api is running under + /// + public string Environment { get; set; } + + /// + /// Trace or Request Id for the operation + /// + public string RequestId { get; set; } + + /// + /// Status of the Response + /// + public string Status { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Statuses/StatusResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Statuses/StatusResult.cs new file mode 100644 index 00000000..481f77bd --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Statuses/StatusResult.cs @@ -0,0 +1,71 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Statuses +{ + /// + /// A status for personnel and units in the Resgrid system + /// + public class StatusResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public StatusResultData Data { get; set; } + } + + /// + /// A status + /// + public class StatusResultData + { + /// + /// Id + /// + public int Id { get; set; } + + /// + /// Type of the status + /// + public int Type { get; set; } + + /// + /// State Id + /// + public int StateId { get; set; } + + /// + /// Text of the status + /// + public string Text { get; set; } + + /// + /// Button color + /// + public string BColor { get; set; } + + /// + /// Text color + /// + public string Color { get; set; } + + /// + /// Does status require gps + /// + public bool Gps { get; set; } + + /// + /// Does the status require a note + /// + public int Note { get; set; } + + /// + /// Does the status require responding to detail + /// + public int Detail { get; set; } + + /// + /// Is this status deleted (should only be used for display) + /// + public bool IsDeleted { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Statuses/StatusesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Statuses/StatusesResult.cs new file mode 100644 index 00000000..765f0ad5 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Statuses/StatusesResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Statuses +{ + /// + /// Multiple status (custom states) result + /// + public class StatusesResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public StatusesResult() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Statuses/UnitStatusesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Statuses/UnitStatusesResult.cs new file mode 100644 index 00000000..2a825576 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Statuses/UnitStatusesResult.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Statuses +{ + /// + /// Unit statuses result + /// + public class UnitStatusesResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public UnitStatusesResult() + { + Data = new List(); + } + } + + /// + /// A status set for a unit type + /// + public class UnitTypeStatusResultData + { + /// + /// Unit types for these statuses + /// + public string UnitType { get; set; } + + /// + /// Unit types for these statuses + /// + public string StatusId { get; set; } + + /// + /// Statuses + /// + public List Statuses { get; set; } + + /// + /// Default constructor + /// + public UnitTypeStatusResultData() + { + Statuses = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/UnitLocation/SaveUnitLocationResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitLocation/SaveUnitLocationResult.cs new file mode 100644 index 00000000..8ae9dc94 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitLocation/SaveUnitLocationResult.cs @@ -0,0 +1,7 @@ +namespace Resgrid.Web.Services.Models.v4.UnitLocation +{ + public class SaveUnitLocationResult: StandardApiResponseV4Base + { + public string Id { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/UnitLocation/UnitLocationInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitLocation/UnitLocationInput.cs new file mode 100644 index 00000000..713027a4 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitLocation/UnitLocationInput.cs @@ -0,0 +1,55 @@ +using System; + +namespace Resgrid.Web.Services.Models.v4.UnitLocation +{ + /// + /// A GPS location for a point in time of a specificed unit + /// + public class UnitLocationInput + { + /// + /// UnitId of the apparatus that the location is for + /// + public string UnitId { get; set; } + + /// + /// The timestamp of the location in UTC + /// + public DateTime? Timestamp { get; set; } + + /// + /// GPS Latitude of the Unit + /// + public string Latitude { get; set; } + + /// + /// GPS Longitude of the Unit + /// + public string Longitude { get; set; } + + /// + /// GPS Latitude\Longitude Accuracy of the Unit + /// + public string Accuracy { get; set; } + + /// + /// GPS Altitude of the Unit + /// + public string Altitude { get; set; } + + /// + /// GPS Altitude Accuracy of the Unit + /// + public string AltitudeAccuracy { get; set; } + + /// + /// GPS Speed of the Unit + /// + public string Speed { get; set; } + + /// + /// GPS Heading of the Unit + /// + public string Heading { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/UnitLocation/UnitLocationResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitLocation/UnitLocationResult.cs new file mode 100644 index 00000000..54035075 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitLocation/UnitLocationResult.cs @@ -0,0 +1,66 @@ +using System; + +namespace Resgrid.Web.Services.Models.v4.UnitLocation +{ + /// + /// A unit location in the Resgrid system + /// + public class UnitLocationResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public UnitLocationResultData Data { get; set; } + } + + /// + /// The information about a specific unit's location + /// + public class UnitLocationResultData + { + /// + /// Id of the Unit + /// + public string UnitId { get; set; } + + /// + /// The Timestamp for the location in UTC + /// + public DateTime Timestamp { get; set; } + + /// + /// GPS Latitude of the Unit + /// + public string Latitude { get; set; } + + /// + /// GPS Longitude of the Unit + /// + public string Longitude { get; set; } + + /// + /// GPS Latitude\Longitude Accuracy of the Unit + /// + public string Accuracy { get; set; } + + /// + /// GPS Altitude of the Unit + /// + public string Altitude { get; set; } + + /// + /// GPS Altitude Accuracy of the Unit + /// + public string AltitudeAccuracy { get; set; } + + /// + /// GPS Speed of the Unit + /// + public string Speed { get; set; } + + /// + /// GPS Heading of the Unit + /// + public string Heading { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/UnitRoles/ActiveUnitRolesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitRoles/ActiveUnitRolesResult.cs new file mode 100644 index 00000000..985aec95 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitRoles/ActiveUnitRolesResult.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.UnitRoles +{ + /// + /// Gets the users assigned to the accountability roles for a unit + /// + public class ActiveUnitRolesResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public ActiveUnitRolesResult() + { + Data = new List(); + } + } + + /// + /// A unit role + /// + public class ActiveUnitRoleResultData : UnitRoleResultData + { + /// + /// UserId assigned to the role + /// + public string UserId { get; set; } + + /// + /// Users full name + /// + public string FullName { get; set; } + + /// + /// When the user was assigned to the role + /// + public string UpdatedOn { get; set; } + + public ActiveUnitRoleResultData() + { + } + + public ActiveUnitRoleResultData(UnitRoleResultData baseData) + { + UnitId = baseData.UnitId; + UnitRoleId = baseData.UnitRoleId; + Name = baseData.Name; + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/UnitRoles/UnitRoleResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitRoles/UnitRoleResult.cs new file mode 100644 index 00000000..ceb6aa88 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitRoles/UnitRoleResult.cs @@ -0,0 +1,34 @@ +namespace Resgrid.Web.Services.Models.v4.UnitRoles +{ + /// + /// A unit role in the Resgrid system + /// + public class UnitRoleResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public UnitRoleResultData Data { get; set; } + } + + /// + /// A unit role + /// + public class UnitRoleResultData + { + /// + /// Unit Identification number this role belongs to + /// + public string UnitId { get; set; } + + /// + /// Unit Roles Identification number + /// + public string UnitRoleId { get; set; } + + /// + /// Name of the Unit Role + /// + public string Name { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/UnitRoles/UnitRolesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitRoles/UnitRolesResult.cs new file mode 100644 index 00000000..09960e25 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitRoles/UnitRolesResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.UnitRoles +{ + /// + /// Multiple Unit Roles Result + /// + public class UnitRolesResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public UnitRolesResult() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/SaveUnitStatusResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/SaveUnitStatusResult.cs new file mode 100644 index 00000000..9d30a018 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/SaveUnitStatusResult.cs @@ -0,0 +1,15 @@ +using System; + +namespace Resgrid.Web.Services.Models.v4.UnitStatus +{ + /// + /// Depicts a result after saving a unit status + /// + public class SaveUnitStatusResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public string Id { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/UnitStatusInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/UnitStatusInput.cs new file mode 100644 index 00000000..b720759d --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/UnitStatusInput.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace Resgrid.Web.Services.Models.v4.UnitStatus +{ + /// + /// Object inputs for setting a users Status/Action. If this object is used in an operation that sets + /// a status for the current user the UserId value in this object will be ignored. + /// + public class UnitStatusInput + { + /// + /// UnitId of the apparatus that the state is being set for + /// + [Required] + public string Id { get; set; } + + /// + /// The UnitStateType of the Unit + /// + [Required] + public string Type { get; set; } + + /// + /// The Call/Station the unit is responding to + /// + public string RespondingTo { get; set; } + + /// + /// The timestamp of the status event in UTC + /// + public DateTime? TimestampUtc { get; set; } + + /// + /// The timestamp of the status event in the local time of the device + /// + public DateTime? Timestamp { get; set; } + + /// + /// User provided note for this event + /// + public string Note { get; set; } + + /// + /// GPS Latitude of the Unit + /// + public string Latitude { get; set; } + + /// + /// GPS Longitude of the Unit + /// + public string Longitude { get; set; } + + /// + /// GPS Latitude\Longitude Accuracy of the Unit + /// + public string Accuracy { get; set; } + + /// + /// GPS Altitude of the Unit + /// + public string Altitude { get; set; } + + /// + /// GPS Altitude Accuracy of the Unit + /// + public string AltitudeAccuracy { get; set; } + + /// + /// GPS Speed of the Unit + /// + public string Speed { get; set; } + + /// + /// GPS Heading of the Unit + /// + public string Heading { get; set; } + + /// + /// The event id used for queuing on mobile applications + /// + public string EventId { get; set; } + + /// + /// The accountability roles filed for this event + /// + public List Roles { get; set; } + } + + /// + /// Role filled by a User on a Unit for an event + /// + public class UnitStatusRoleInput + { + /// + /// Id of the locally stored event + /// + public string Id { get; set; } + + /// + /// Local Event Id + /// + public string EventId { get; set; } + + /// + /// UserId of the user filling the role + /// + public string UserId { get; set; } + + /// + /// RoleId of the role being filled + /// + public string RoleId { get; set; } + + /// + /// The name of the Role + /// + public string Name { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/UnitStatusResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/UnitStatusResult.cs new file mode 100644 index 00000000..b9b7d2b9 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/UnitStatusResult.cs @@ -0,0 +1,96 @@ +using System; + +namespace Resgrid.Web.Services.Models.v4.UnitStatus +{ + /// + /// Depicts a unit status in the Resgrid system. + /// + public class UnitStatusResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public UnitStatusResultData Data { get; set; } + } + + /// + /// Depicts a unit's status + /// + public class UnitStatusResultData + { + /// + /// Unit Id + /// + public string UnitId { get; set; } + + /// + /// Units Name + /// + public string Name { get; set; } + + /// + /// The Type of the Unit + /// + public string Type { get; set; } + + /// + /// Units current Status (State) + /// + public string State { get; set; } + + /// + /// CSS for status (for display) + /// + public string StateCss { get; set; } + + /// + /// CSS Style for status (for display) + /// + public string StateStyle { get; set; } + + /// + /// Timestamp of this Unit State + /// + public DateTime Timestamp { get; set; } + + /// + /// Timestamp in Utc of this Unit State + /// + public DateTime TimestampUtc { get; set; } + + /// + /// Destination Id (Station or Call) + /// + public int? DestinationId { get; set; } + + /// + /// Name of the Desination (Call or Station) + /// + public string DestinationName { get; set; } + + /// + /// Note for the State + /// + public string Note { get; set; } + + /// + /// Latitude + /// + public decimal? Latitude { get; set; } + + /// + /// Longitude + /// + public decimal? Longitude { get; set; } + + /// + /// Name of the Group the Unit is in + /// + public string GroupName { get; set; } + + /// + /// Id of the Group the Unit is in + /// + public int GroupId { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/UnitStautsesResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/UnitStautsesResult.cs new file mode 100644 index 00000000..34330526 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/UnitStatus/UnitStautsesResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.UnitStatus +{ + /// + /// Unit statuses (states) + /// + public class UnitStautsesResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public UnitStautsesResult() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Units/UnitResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Units/UnitResult.cs new file mode 100644 index 00000000..8cefa266 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Units/UnitResult.cs @@ -0,0 +1,111 @@ +using System; + +namespace Resgrid.Web.Services.Models.v4.Units +{ + /// + /// A unit in the Resgrid system + /// + public class UnitResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public UnitResultData Data { get; set; } + } + + /// + /// The information about a specific unit + /// + public class UnitResultData + { + /// + /// Id of the Unit + /// + public string UnitId { get; set; } + + /// + /// The Id of the department the unit is under + /// + public string DepartmentId { get; set; } + + /// + /// Name of the Unit + /// + public string Name { get; set; } + + /// + /// Department assigned type for the unit + /// + public string Type { get; set; } + + /// + /// Department assigned type id for the unit + /// + public int TypeId { get; set; } + + /// + /// Custom Statuses Set Id + /// + public string CustomStatusSetId { get; set; } + + /// + /// Station Id of the station housing the unit (0 means no station) + /// + public string GroupId { get; set; } + + /// + /// Name of the station the unit is under + /// + public string GroupName { get; set; } + + /// + /// Vehicle Identification Number for the unit + /// + public string Vin { get; set; } + + /// + /// Plate Number for the Unit + /// + public string PlateNumber { get; set; } + + /// + /// Is the unit 4-Wheel drive + /// + public bool FourWheelDrive { get; set; } + + /// + /// Does the unit require a special permit to drive + /// + public bool SpecialPermit { get; set; } + + /// + /// Id number of the units current destionation (0 means no destination) + /// + public string CurrentDestinationId { get; set; } + + /// + /// The current status/state of the Unit + /// + public string CurrentStatusId { get; set; } + + /// + /// The Timestamp of the status + /// + public DateTime CurrentStatusTimestamp { get; set; } + + /// + /// The units current Latitude + /// + public string Latitude { get; set; } + + /// + /// The units current Longitude + /// + public string Longitude { get; set; } + + /// + /// Current user provide status note + /// + public string Note { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Units/UnitsResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Units/UnitsResult.cs new file mode 100644 index 00000000..ba5fd539 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Units/UnitsResult.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Units +{ + /// + /// Multiple Units Result + /// + public class UnitsResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public List Data { get; set; } + + /// + /// Default constructor + /// + public UnitsResult() + { + Data = new List(); + } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Voice/ConnectToSessionInput.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Voice/ConnectToSessionInput.cs new file mode 100644 index 00000000..d0772130 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Voice/ConnectToSessionInput.cs @@ -0,0 +1,18 @@ +namespace Resgrid.Web.Services.Models.v4.Voice +{ + /// + /// Connects to a voip session + /// + public class ConnectToSessionInput + { + /// + /// Session id to connect to + /// + public string SessionId { get; set; } + + /// + /// Name of the person or unit connecting + /// + public string Name { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Voice/DepartmentVoiceResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Voice/DepartmentVoiceResult.cs new file mode 100644 index 00000000..45370011 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Voice/DepartmentVoiceResult.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; + +namespace Resgrid.Web.Services.Models.v4.Voice +{ + public class DepartmentVoiceResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public DepartmentVoiceResultData Data { get; set; } + } + + public class DepartmentVoiceResultData + { + public bool VoiceEnabled { get; set; } + + public int Type { get; set; } + + public string Realm { get; set; } + + public string VoipServerWebsocketSslAddress { get; set; } + + public string CallerIdName { get; set; } + + public List Channels { get; set; } + + public DepartmentVoiceUserInfoResultData UserInfo { get; set; } + } + + public class DepartmentVoiceChannelResultData + { + public string Id { get; set; } + + public string Name { get; set; } + + public int ConferenceNumber { get; set; } + + public bool IsDefault { get; set; } + } + + public class DepartmentVoiceUserInfoResultData + { + public string Username { get; set; } + public string Password { get; set; } + public string Pin { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Models/v4/Voice/VoiceSessionConnectionResult.cs b/Web/Resgrid.Web.ServicesCore/Models/v4/Voice/VoiceSessionConnectionResult.cs new file mode 100644 index 00000000..0ac4f2a6 --- /dev/null +++ b/Web/Resgrid.Web.ServicesCore/Models/v4/Voice/VoiceSessionConnectionResult.cs @@ -0,0 +1,24 @@ +namespace Resgrid.Web.Services.Models.v4.Voice +{ + /// + /// Result of connecting to a voice session + /// + public class VoiceSessionConnectionResult : StandardApiResponseV4Base + { + /// + /// Response Data + /// + public VoiceSessionConnectionResultData Data { get; set; } + } + + /// + /// Data needed to connect to an active voice session + /// + public class VoiceSessionConnectionResultData + { + /// + /// Id used to connect to the session + /// + public string Token { get; set; } + } +} diff --git a/Web/Resgrid.Web.ServicesCore/Properties/PublishProfiles/FolderProfile1.pubxml b/Web/Resgrid.Web.ServicesCore/Properties/PublishProfiles/FolderProfile1.pubxml index d350539e..649a84a3 100644 --- a/Web/Resgrid.Web.ServicesCore/Properties/PublishProfiles/FolderProfile1.pubxml +++ b/Web/Resgrid.Web.ServicesCore/Properties/PublishProfiles/FolderProfile1.pubxml @@ -1,17 +1,21 @@  + - FileSystem - FileSystem - Release - Any CPU - - False - False - netcoreapp3.1 - 24e2241d-d82c-443d-9613-f900e44c003e - bin/Release/netcoreapp3.1/publish/ - True - False + True + False + True + Release + Any CPU + FileSystem + bin\Release\netcoreapp3.1\publish\ + FileSystem + + net5.0 + win-x64 + 24e2241d-d82c-443d-9613-f900e44c003e + true - + \ No newline at end of file diff --git a/Web/Resgrid.Web.ServicesCore/Properties/launchSettings.json b/Web/Resgrid.Web.ServicesCore/Properties/launchSettings.json index b6e10ac9..8a266f66 100644 --- a/Web/Resgrid.Web.ServicesCore/Properties/launchSettings.json +++ b/Web/Resgrid.Web.ServicesCore/Properties/launchSettings.json @@ -3,29 +3,21 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:55911", + "applicationUrl": "http://localhost:5113/", "sslPort": 44390 } }, "$schema": "http://json.schemastore.org/launchsettings.json", "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "api/v3/Health/GetCurrent", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "ancmHostingModel": "OutOfProcess" - }, "Resgrid.Web.ServicesCore": { "commandName": "Project", "launchBrowser": true, - "launchUrl": "api/values", + "launchUrl": "api/v3/Health/GetCurrent", "environmentVariables": { + "RESGRID__SystemBehaviorConfig__ResgridBaseUrl": "https://localhost:5002", "ASPNETCORE_ENVIRONMENT": "Development" }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" + "applicationUrl": "https://localhost:5002" }, "Docker": { "commandName": "Docker", diff --git a/Web/Resgrid.Web.ServicesCore/Resgrid.Web.Services.xml b/Web/Resgrid.Web.ServicesCore/Resgrid.Web.Services.xml index 1dbed8ea..8c13b41c 100644 --- a/Web/Resgrid.Web.ServicesCore/Resgrid.Web.Services.xml +++ b/Web/Resgrid.Web.ServicesCore/Resgrid.Web.Services.xml @@ -154,6 +154,7 @@ Saves a call in the Resgrid system + The cancellation token that can be used by other objects or threads to receive notice of cancellation. @@ -169,6 +170,7 @@ Closes a Resgrid call Data to close a call + The cancellation token that can be used by other objects or threads to receive notice of cancellation. OK status code if successful @@ -176,6 +178,7 @@ Updates an existing Active Call in the Resgrid system Data to updated the call + The cancellation token that can be used by other objects or threads to receive notice of cancellation. OK status code if successful @@ -207,6 +210,7 @@ Attaches a file to a call ID of the user + The cancellation token that can be used by other objects or threads to receive notice of cancellation. @@ -237,6 +241,27 @@ An array of call types + + + Returns all the non-dispatched (pending) scheduled calls for the department + + Array of CallResult objects for each active call in the department + + + + Updates a call's scheduled dispatch time if it has not been dispatched + + ID of the call + UTC date to change the dispatch to + + + + + Deletes a call + + ID of the call + + Operations to be performed against the chat system @@ -357,6 +382,11 @@ Input to deregister the device for + + + Operations to support Dispatch operations + + Operations to support Dispatch operations @@ -386,6 +416,12 @@ Array of CallTemplateResult objects for each role in the department + + + Returns the custom new call form if any exists and is active + + FormDataResult object with the new call form data + Geolocation API methods for gps and other functions (like what3words) @@ -808,6 +844,17 @@ StatusInput object with the Status/Action to set. Returns HttpStatusCode Created if successful, BadRequest otherwise. + + + Operations that can be performed against resgrid voice (voip) services + + + + + Returns all the available responding options (Calls/Stations) for the department + + Array of RecipientResult objects for each responding option in the department + Object that verifies that the user's credentials @@ -1123,6 +1170,11 @@ (Optional) Note Longitude + + + Full name of the user who submitted the note + + Identifier for this Protocol @@ -1263,6 +1315,21 @@ When was the call Logged On in UTC time + + + Dispatch On + + + + + Geolocation (Latitude) + + + + + Geolocation (Longitude) + + Depicts a call in the Resgrid system. @@ -1438,21 +1505,6 @@ Id of the call being updated - - - Updated name of the call - - - - - Updated Nature of the Call - - - - - Updated Call Address - - Represents department options set in other parts of the system, for example email and text messaging call format options @@ -3044,88 +3096,2868 @@ Array of CallPriorityResult objects for each call priority in the department - + - Gets or sets the on authentication failed. + Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department - The on authentication failed. - + - Gets or sets the on validate credentials. + Get the files for a call in the Resgrid System - The on validate credentials. + CallId to get the files for + Include the data in the result + Type of file to get (Any = 0, Audio = 1, Images = 2, Files = 3, Videos = 4) + - + - Authentications the failed. + Get a users avatar from the Resgrid system based on their ID - The context. - Task. + ID of the file + - + - Validates the credentials. + Attaches a file to a call - The context. - Task. + ID of the user + The cancellation token that can be used by other objects or threads to receive notice of cancellation. + - + - Class ValidateCredentialsContext. - Implements the + Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department - - + - Gets or sets the containing the user claims. + Get notes for a call - The principal. + CallId of the call you want to get notes for + - + - your image path (the one we recieved after successfull upload) + Saves a call note + CallId of the call you want to get notes for + The cancellation token that can be used by other objects or threads to receive notice of cancellation. + ActionResult. - + - your image original width (the one we recieved after upload) + Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department - + - your image original height (the one we recieved after upload) + Gets all the call priorities in a department + - + - your new scaled image width + Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department - + - your new scaled image height + Gets all the call protocols in a department + - + - top left corner of the cropped image in relation to scaled image + Calls, also referred to as Dispatches. - + - top left corner of the cropped image in relation to scaled image + Returns all the active calls for the department + Array of CallResult objects for each active call in the department - + - cropped image width + Returns a specific call from the Resgrid System + + Id of the call trying to be retrived + CallResult of the call in the Resgrid system + + + + Gets all the meta-data around a call, dispatched personnel, units, groups and responses + CallId to get data for + - + - cropped image height + Saves a call in the Resgrid system + + + The cancellation token that can be used by other objects or threads to receive notice of cancellation. + + + + + Updates an existing Active Call in the Resgrid system + + Data to updated the call + The cancellation token that can be used by other objects or threads to receive notice of cancellation. + OK status code if successful + + + + Updates a call's scheduled dispatch time if it has not been dispatched + + Data to update + + + + + Deletes a call + + ID of the call + + + + + Closes a Resgrid call + + Data to close a call + The cancellation token that can be used by other objects or threads to receive notice of cancellation. + OK status code if successful + + + + Returns all the non-dispatched (pending) scheduled calls for the department + + Array of CallResult objects for each active call in the department + + + + Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + + + + + Gets all the call priorities in a department + + + + + + Service to generate an authentication token that is required to communicate with all other v4 services + + + + + Generates a token that is then used for subsquent requests to the API. + + ValidateResult object, with IsValid set if the settings are correct + + + + Custom statuses + + + + + All custom statuses for a department + + + + + + Mobile or Tablet Device specific operations + + + + + Register a unit device to receive push notification from the Resgrid system + + Input to create the registration for + Result for the registration + + + + Removed a Unit Push Notification support by PushUriId. + + Input to deregister the device for + + + + + API Calls that are used for the Dispatch App + + + + + Gets all the information required to populate the New Call form + + + + + + + + + + + + + Returns all the personnel for display in the new call personnel table + + Array of PersonnelForCallResult objects for each person in the department + + + + Returns all the groups for display in the new call groups table + + Array of GroupsForCallResult objects for each group in the department + + + + Returns all the roles for display in the new call groups table + + Array of RolesForCallResult objects for each role in the department + + + + Returns all the call quick templates + + Array of CallTemplateResult objects for each role in the department + + + + User generated forms that are dispayed to get custom information for New Calls, Unit Checks, etc + + + + + Gets the Department Form that can be used for the new call process (i.e. call intake/triage form) + + + + + + User generated forms that are dispayed to get custom information for New Calls, Unit Checks, etc + + + + + Gets the Department Group by it's id + + + + + + Gets all deparment groups for a department + + + + + + Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + + + + + Gets the current users department rights + + DepartmentRightsResult object with the department rights and group memberships + + + + Mapping operations + + + + + Data to center the map and it's default location plus marker information for displaying makers on the map. + + GetMapDataResult object + + + + Operations to perform against personnel in a department + + + + + Gets information about a specific person + + UserId of the person to get info for + PersonnelInfoResult with information pertaining to that user + + + + User generated forms that are dispayed to get custom information for New Calls, Unit Checks, etc + + + + + Gets the Department Form that can be used for the new call process (i.e. call intake/triage form) + + + + + + Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + + + + + Operations to perform against the security sub-system + + + + + Gets the current users department rights + + DepartmentRightsResult object with the department rights and group memberships + + + + The options for Personnel Statuses, Staffing and Unit Statuses that can be used to submit their status to Resgrid. + Do not use Deleted versions for submittion, they should only be used for display of previous used values. + + + + + Gets all available statuses for Personnel for the department + + + + + + Gets all available staffing levels for Personnel for the department + + + + + + Gets all active unit statuses for each unit type + + + + + + Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + + + + + Sets the location of a unit + + UnitLocationInput object with the gps information. + Returns HttpStatusCode Created if successful, BadRequest otherwise. + + + + Gets the latest location for a specified unit + + + + + + Unit roles + + + + + Gets the accountability roles for a unit + + + + + + Gets all the roles for every unit in a department plus who is currently assigned to that unit role (accountability) + + + + + + Information regarding Units + + + + + Gets all the Units for a Department + + + + + + Units Status (State) information. For example is the unit Responding to a Call, or Available. + + + + + Gets all the units in a departments current (latest) status (state) or a default + + + + + + Gets the unit status for a specific unit id + + + + + + Sets the status/action for the current user. + + StatusInput object with the Status/Action to set. + Returns HttpStatusCode Created if successful, BadRequest otherwise. + + + + Call Priorities, for example Low, Medium, High. Call Priorities can be system provided ones or custom for a department + + + + + Returns all the available responding options (Calls/Stations) for the department + + Array of RecipientResult objects for each responding option in the department + + + + Connects to an voip session, limited to only OpenVidu. + + Voice connection result containing the data needed to connect to a voip session + + + + Gets or sets the on authentication failed. + + The on authentication failed. + + + + Gets or sets the on validate credentials. + + The on validate credentials. + + + + Authentications the failed. + + The context. + Task. + + + + Validates the credentials. + + The context. + Task. + + + + Class ValidateCredentialsContext. + Implements the + + + + + + Gets or sets the containing the user claims. + + The principal. + + + + your image path (the one we recieved after successfull upload) + + + + + your image original width (the one we recieved after upload) + + + + + your image original height (the one we recieved after upload) + + + + + your new scaled image width + + + + + your new scaled image height + + + + + top left corner of the cropped image in relation to scaled image + + + + + top left corner of the cropped image in relation to scaled image + + + + + cropped image width + + + + + cropped image height + + + + + A Call file result + + + + + Data payload + + + + + Object representing a file for a call in the Resgrid system + + + + + Id of the call file + + + + + Id of the Call + + + + + Type of the file (Audio = 1, Image= 2, File = 3, Video = 4) + + + + + Name of the File + + + + + Base64 File Data (may be null) + + + + + User friendly name of the file + + + + + Size of the file in bytes + + + + + The Url to get the file instead of using the Data value + + + + + User Id of the person who uploaded the file + + + + + Timestamp of when the file was added + + + + + Mime Type for the file + + + + + A Call file result + + + + + Data payload + + + + + Default constructor + + + + + Input to attach a file to a call + + + + + Id of the Call + + + + + User Id of the user attaching the file + + + + + Type of the file (Audio = 1, Image = 2, File = 3, Video = 4) + + + + + Name of the file + + + + + Base64 encoded string of the file being uploaded + + + + + Gets the notes for a call + + + + + Response Data + + + + + Default constructor + + + + + + + + + + Call Id of the Note + + + + + Call Note Id + + + + + UserId of the user who added the note + + + + + Note source + + + + + Formatted Timestamp + + + + + Timestamp of when the note as added + + + + + Timestamp of when the note as added in Utc + + + + + Note content + + + + + (Optional) Note Latitude + + + + + (Optional) Note Longitude + + + + + Full name of the user who submitted the note + + + + + Input to attach a note to call + + + + + Id of the Call + + + + + UserId of the user adding the note + + + + + Note text to add + + + + + Latitude of when the note was taken + + + + + Longitude of when the note was taken + + + + + Gets the calls current active, been dispatched and not closed or deleted + + + + + Response Data + + + + + Default constructor + + + + + Depicts a call in the Resgrid system. + + + + + Response Data + + + + + Default constructor + + + + + Depicts a call in the Resgrid system. + + + + + Unit and Personnel activities attached to this call + + + + + Who was dispatched on this call, units, personnel, roles and groups + + + + + Call priority inforamtion + + + + + Protocols active fro this call + + + + + Default constructor + + + + + Depicts a call in the Resgrid system. + + + + + Response Data + + + + + Depicts a call in the Resgrid system. + + + + + Id of the call + + + + + Priority of the call (Low = 0, Medium = 1, High = 2, Emergency = 3) + + + + + Name of the Call + + + + + Nature of the Call + + + + + High level note for the Call + + + + + Call Address + + + + + Geo location Coordinates + + + + + When was the call Logged On + + + + + State of the call (Active = 0, Closed = 1, Cancelled = 2, Unfounded = 3) + + + + + Call Number, will be the 2 digit year (i.e. 15 for 2015) and an auto incrementing number for the call in the year. So 15-43 is the 43'rd call in 2015. + + + + + The amount of notes the call has + + + + + The amount of audio the call has + + + + + The amount of images the call has + + + + + The amount of files the call has + + + + + What 3 Words Address + + + + + Reporter Name + + + + + Reporter Contact Info + + + + + Reference Id + + + + + External Id + + + + + INcident Id + + + + + Audio File Id + + + + + Call Type + + + + + When was the call Logged On in UTC time + + + + + Dispatch On + + + + + Dispatch On + + + + + Geolocation (Latitude) + + + + + Geolocation (Longitude) + + + + + Active Protocols for this call + + + + + Input information to close a call + + + + + Call Id of the call to close + + + + + Message or notes of the call to close + + + + + Type of call closure that is used + + + + + The result/return for closing a call + + + + + Id of the call closed + + + + + Data needed to create a new call + + + + + Id of the call to update + + + + + Priority of the call + + + + + Name of the call + + + + + Nature of the call + + + + + Dispatch note + + + + + Address + + + + + Geolocation data "lat,lon" + + + + + Type of the call + + + + + What 3 Words location + + + + + Comma seperated list of users,units,roles and groups to dipstach + + + + + Contact Name + + + + + Contact Info + + + + + External Call Id + + + + + Incident Id + + + + + Reference Id + + + + + Time in the future, in the departments local time, to dispatch the call + + + + + Call Intake form JSON + + + + + Should all the entities attached to the call be re-notified + + + + + Gets the calls current active, been dispatched and not closed or deleted + + + + + Response Data + + + + + Data needed to create a new call + + + + + Priority of the call + + + + + Name of the call + + + + + Nature of the call + + + + + Dispatch note + + + + + Address + + + + + Geolocation data "lat,lon" + + + + + Type of the call + + + + + What 3 Words location + + + + + Comma seperated list of users,units,roles and groups to dipstach + + + + + Contact Name + + + + + Contact Info + + + + + External Call Id + + + + + Incident Id + + + + + Reference Id + + + + + Time in the future, in the departments local time, to dispatch the call + + + + + Call Intake form JSON + + + + + Gets the calls current scheduled but not yet dispatched + + + + + Response Data + + + + + Default constructor + + + + + Input data needed to update a calls scheduled dispatch time + + + + + Id of the call to update + + + + + Date in the future to update to + + + + + Gets all the call priorities for the department + + + + + Response Data + + + + + Default constructor + + + + + Call Priority Definition + + + + + Call Priroity Id + + + + + Department Id the Priority is for + + + + + Name of the Priroity + + + + + HTML Color for the Priority + + + + + Sort order for the Priority + + + + + Has the Priority been deleted. Deleted priorities should never be used or saved, they are intended for display purposes only. + + + + + Is this the default priority + + + + + Does this priority dispatch personnel + + + + + Does this priority dispatch units + + + + + Should all personnel be dispatched/notified for this priority (i.e. All Call) + + + + + Id for the Tone Sound to be used + + + + + Is this a default system priority + + + + + Depicts a call protocol in the Resgrid system. + + + + + Response Data + + + + + Call protocol data + + + + + Call Protocol Id + + + + + Department id this protocol is for + + + + + Name of the protocol + + + + + Protocol quick code + + + + + Is the protocol disabled + + + + + Protocol Description + + + + + Actual protocol text + + + + + UTC of when the protocol was created + + + + + Who created the procotol + + + + + When/if the procotol was updated + + + + + Minimum weight to activate the procotol based on answers + + + + + Who updated the protocol + + + + + Gets all the call protocols for the department + + + + + Response Data + + + + + Default constructor + + + + + A call type + + + + + Id of the call type + + + + + Name of the call type + + + + + Gets the call types + + + + + Response Data + + + + + Default constructor + + + + + Custom defined Status for Personnel and Units + + + + + Response Data + + + + + Default constructor + + + + + Depicts a custom status in the Resgrid system. + + + + + Response Data + + + + + Custom Status + + + + + Custom Status Id + + + + + Custom Status Type + + + + + State Id + + + + + Text for the Custom Status + + + + + Button Color + + + + + Text Color + + + + + Require GPS for this Status + + + + + Is the Note Required or Optional + + + + + Detail type id + + + + + Is this custom status deleted (only should be used for display) + + + + + Object that contains the device specific information needed to register the device for push notifications + + + + + The platform this device registration is going against + + + + + The push network resgistration token to register with Resgrid for Push Notifications + + + + + The UnitId of the device being registered if it's from the Unit App + + + + + Device UDID + + + + + Depicts a request to register for push notifications + + + + + Id of the device registration created + + + + + Unregister a device for push + + + + + Device UDID + + + + + DCall Templates for Quick Dispatch + + + + + Response Data + + + + + Default constructor + + + + + Call Template + + + + + Call Template Id + + + + + Is template disabled + + + + + Call Template name + + + + + Name the call + + + + + Nature of the call + + + + + Type of the call + + + + + Priority of the call + + + + + Who created the template + + + + + When was it created + + + + + Data needed for the new call form to display dispatch groups + + + + + Response Data + + + + + Default constructor + + + + + All the data required to populate the New Call form + + + + + Group id + + + + + Group name + + + + + Members count + + + + + Data needed for the Dispatch App Modal that sets the state for a unit + + + + + Response Data + + + + + Default constructor + + + + + Role entry for the new call dispatch grid + + + + + Data needed for the Dispatch App Modal that sets the state for a unit + + + + + Response Data + + + + + Default constructor + + + + + All the data required to populate the New Call form + + + + + Role id + + + + + Role name + + + + + Number of users in the role + + + + + Data needed for the Dispatch App Modal that sets the state for a unit + + + + + Response Data + + + + + All the data required to populate the New Call form + + + + + Unit id + + + + + Name of the unit + + + + + Stations the Unit can respond to + + + + + Calls the unit can respond to + + + + + Status types + + + + + Result containing all the data required to populate the New Call form + + + + + Response Data + + + + + All the data required to populate the New Call form + + + + + Depicts a user created form. + + + + + Response Data + + + + + A custom form (user created) + + + + + Form Id + + + + + Form Name + + + + + Type of the Form, i.e. Call + + + + + Form JSON Data (i.e. the data needed to create the form) + + + + + Automations for the Form + + + + + Form automations + + + + + Form automation id + + + + + Form Id the automation is for + + + + + Field name that triggers this automation + + + + + Value the field needs to be + + + + + Auotmation operation type + + + + + Automation operation value + + + + + A group in the Resgrid system + + + + + Response Data + + + + + All the data required to populate the New Call form + + + + + Id of the group + + + + + Type id of the Group (Station or Orginizational) + + + + + Name of the Group + + + + + Address of the Group (for Station Groups) + + + + + A list of groups in the Resgrid system + + + + + Response Data + + + + + Default constructor + + + + + Result of the Health check API + + + + + Response Data + + + + + Default constructor + + + + + Health check data for the current state of the api server handling the request + + + + + Site\Location of this API + + + + + The Version of the Services + + + + + Gets the current API version + + + + + Can the API services talk to the database + + + + + Can the API services talk to the cache + + + + + Response Data + + + + + Default constructor + + + + + Result containing all the data required to populate the New Call form + + + + + Response Data + + + + + Information about a User + + + + + The UserId GUID/UUID for the user + + + + + DepartmentId of the deparment the user belongs to + + + + + Department specificed ID number for this user + + + + + The Users First Name + + + + + The Users Last Name + + + + + The Users Email Address + + + + + The Users Mobile Telephone Number + + + + + GroupId the user is assigned to (0 for no group) + + + + + Name of the group the user is assigned to + + + + + Enumeration/List of roles the user currently holds + + + + + The current action/status type for the user + + + + + The timestamp of the last action. This is converted UTC to the departments, or users, TimeZone. + + + + + The current action/status destination id for the user + + + + + The current action/status destination name for the user + + + + + The current staffing level (state) type for the user + + + + + The timestamp of the last state/staffing level. This is converted UTC to the departments, or users, TimeZone. + + + + + A role in the Resgrid system + + + + + Response Data + + + + + Role + + + + + Id of the Role + + + + + Name of the Role + + + + + A role in the Resgrid system + + + + + Response Data + + + + + Response Data + + + + + Default constructor + + + + + Object that denotes the right assignments for a user in a department + + + + + Department name + + + + + Users full name + + + + + Email address + + + + + Department id + + + + + Is the user a department admin + + + + + Can the user view PII + + + + + Can the user create calls + + + + + Can the user add a note + + + + + Can the user create messages + + + + + Groups in the department the user is a member of + + + + + Object containting a group right assignemnt + + + + + Id of the group this right assignement is for + + + + + Is the user a group admin + + + + + The standard response base object for the v4 api. A Data property will be adding on top of this. + + + + + Number of recrods returned + + + + + Timestamp in UTC of the operation + + + + + API Version that produced the response + + + + + Name of the node the processed the operation + + + + + Name of the environment that the api is running under + + + + + Trace or Request Id for the operation + + + + + Status of the Response + + + + + Multiple status (custom states) result + + + + + Response Data + + + + + Default constructor + + + + + A status for personnel and units in the Resgrid system + + + + + Response Data + + + + + A status + + + + + Id + + + + + Type of the status + + + + + State Id + + + + + Text of the status + + + + + Button color + + + + + Text color + + + + + Does status require gps + + + + + Does the status require a note + + + + + Does the status require responding to detail + + + + + Is this status deleted (should only be used for display) + + + + + Unit statuses result + + + + + Response Data + + + + + Default constructor + + + + + A status set for a unit type + + + + + Unit types for these statuses + + + + + Unit types for these statuses + + + + + Statuses + + + + + Default constructor + + + + + A GPS location for a point in time of a specificed unit + + + + + UnitId of the apparatus that the location is for + + + + + The timestamp of the location in UTC + + + + + GPS Latitude of the Unit + + + + + GPS Longitude of the Unit + + + + + GPS Latitude\Longitude Accuracy of the Unit + + + + + GPS Altitude of the Unit + + + + + GPS Altitude Accuracy of the Unit + + + + + GPS Speed of the Unit + + + + + GPS Heading of the Unit + + + + + A unit location in the Resgrid system + + + + + Response Data + + + + + The information about a specific unit's location + + + + + Id of the Unit + + + + + The Timestamp for the location in UTC + + + + + GPS Latitude of the Unit + + + + + GPS Longitude of the Unit + + + + + GPS Latitude\Longitude Accuracy of the Unit + + + + + GPS Altitude of the Unit + + + + + GPS Altitude Accuracy of the Unit + + + + + GPS Speed of the Unit + + + + + GPS Heading of the Unit + + + + + Gets the users assigned to the accountability roles for a unit + + + + + Response Data + + + + + Default constructor + + + + + A unit role + + + + + UserId assigned to the role + + + + + Users full name + + + + + When the user was assigned to the role + + + + + A unit role in the Resgrid system + + + + + Response Data + + + + + A unit role + + + + + Unit Identification number this role belongs to + + + + + Unit Roles Identification number + + + + + Name of the Unit Role + + + + + Multiple Unit Roles Result + + + + + Response Data + + + + + Default constructor + + + + + Depicts a result after saving a unit status + + + + + Response Data + + + + + Object inputs for setting a users Status/Action. If this object is used in an operation that sets + a status for the current user the UserId value in this object will be ignored. + + + + + UnitId of the apparatus that the state is being set for + + + + + The UnitStateType of the Unit + + + + + The Call/Station the unit is responding to + + + + + The timestamp of the status event in UTC + + + + + The timestamp of the status event in the local time of the device + + + + + User provided note for this event + + + + + GPS Latitude of the Unit + + + + + GPS Longitude of the Unit + + + + + GPS Latitude\Longitude Accuracy of the Unit + + + + + GPS Altitude of the Unit + + + + + GPS Altitude Accuracy of the Unit + + + + + GPS Speed of the Unit + + + + + GPS Heading of the Unit + + + + + The event id used for queuing on mobile applications + + + + + The accountability roles filed for this event + + + + + Role filled by a User on a Unit for an event + + + + + Id of the locally stored event + + + + + Local Event Id + + + + + UserId of the user filling the role + + + + + RoleId of the role being filled + + + + + The name of the Role + + + + + Depicts a unit status in the Resgrid system. + + + + + Response Data + + + + + Depicts a unit's status + + + + + Unit Id + + + + + Units Name + + + + + The Type of the Unit + + + + + Units current Status (State) + + + + + CSS for status (for display) + + + + + CSS Style for status (for display) + + + + + Timestamp of this Unit State + + + + + Timestamp in Utc of this Unit State + + + + + Destination Id (Station or Call) + + + + + Name of the Desination (Call or Station) + + + + + Note for the State + + + + + Latitude + + + + + Longitude + + + + + Name of the Group the Unit is in + + + + + Id of the Group the Unit is in + + + + + Unit statuses (states) + + + + + Response Data + + + + + Default constructor + + + + + A unit in the Resgrid system + + + + + Response Data + + + + + The information about a specific unit + + + + + Id of the Unit + + + + + The Id of the department the unit is under + + + + + Name of the Unit + + + + + Department assigned type for the unit + + + + + Department assigned type id for the unit + + + + + Custom Statuses Set Id + + + + + Station Id of the station housing the unit (0 means no station) + + + + + Name of the station the unit is under + + + + + Vehicle Identification Number for the unit + + + + + Plate Number for the Unit + + + + + Is the unit 4-Wheel drive + + + + + Does the unit require a special permit to drive + + + + + Id number of the units current destionation (0 means no destination) + + + + + The current status/state of the Unit + + + + + The Timestamp of the status + + + + + The units current Latitude + + + + + The units current Longitude + + + + + Current user provide status note + + + + + Multiple Units Result + + + + + Response Data + + + + + Default constructor + + + + + Connects to a voip session + + + + + Session id to connect to + + + + + Name of the person or unit connecting + + + + + Response Data + + + + + Result of connecting to a voice session + + + + + Response Data + + + + + Data needed to connect to an active voice session + + + + + Id used to connect to the session diff --git a/Web/Resgrid.Web.ServicesCore/Resgrid.Web.ServicesCore.csproj b/Web/Resgrid.Web.ServicesCore/Resgrid.Web.ServicesCore.csproj index 6cf0d50f..853c07be 100644 --- a/Web/Resgrid.Web.ServicesCore/Resgrid.Web.ServicesCore.csproj +++ b/Web/Resgrid.Web.ServicesCore/Resgrid.Web.ServicesCore.csproj @@ -1,147 +1,164 @@  - - Cloud system for First Responders - 3.0.0 - Resgrid, LLC. - netcoreapp3.1 - Resgrid.Web.Services - Resgrid.Web.Services - e5e5edd9-c59d-4c0f-b765-477c9c5350f8 - Resgrid.Web.ServicesCore.Program - Linux - ..\.. - ..\..\docker-compose.dcproj - Debug;Release;Docker - /subscriptions/bc1ffca7-bf1a-49f9-88f7-b99be887fe9d/resourceGroups/Default-Web-WestUS/providers/microsoft.insights/components/OnPremResgridAPI - + + Cloud system for First Responders + 3.0.0 + Resgrid, LLC. + net6.0 + Resgrid.Web.Services + Resgrid.Web.Services + e5e5edd9-c59d-4c0f-b765-477c9c5350f8 + Resgrid.Web.ServicesCore.Program + Linux + ..\.. + ..\..\docker-compose.dcproj + Debug;Release;Docker + - - Resgrid.Web.Services.xml - + + Resgrid.Web.Services.xml + - - Resgrid.Web.Services.xml - + + Resgrid.Web.Services.xml + - - Resgrid.Web.Services.xml - DOCKER - + + Resgrid.Web.Services.xml + DOCKER + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - All - - - - - - - - - - - + + + + - - - - - + + + + - - - - + + + + - - - - + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + All + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - + + + - - - True - True - Resources.resx - - + + + True + True + Resources.resx + + - - - ResXFileCodeGenerator - Resources.Designer.cs - - + + + ResXFileCodeGenerator + Resources.Designer.cs + + diff --git a/Web/Resgrid.Web.ServicesCore/Startup.cs b/Web/Resgrid.Web.ServicesCore/Startup.cs index 8055d214..4614eb1b 100644 --- a/Web/Resgrid.Web.ServicesCore/Startup.cs +++ b/Web/Resgrid.Web.ServicesCore/Startup.cs @@ -10,29 +10,23 @@ using Resgrid.Config; using Resgrid.Providers.Claims; using Resgrid.Repositories.DataRepository.Stores; -using Resgrid.Web.ServicesCore.Middleware; using Resgrid.Web.ServicesCore.Options; using Stripe; using System.Configuration; using System.IO; using System.Net; using System.Reflection; -using System.Security.Claims; using AspNetCoreRateLimit; using Autofac.Extensions.DependencyInjection; using Autofac.Extras.CommonServiceLocator; using CommonServiceLocator; -using Elastic.Apm.NetCoreAll; -using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.PlatformAbstractions; using Microsoft.OpenApi.Models; using Newtonsoft.Json.Serialization; using Resgrid.Model.Providers; using Resgrid.Model.Services; using Resgrid.Providers.AddressVerification; -using Resgrid.Providers.Audio; using Resgrid.Providers.Bus; using Resgrid.Providers.Bus.Rabbit; using Resgrid.Providers.Cache; @@ -46,6 +40,21 @@ using Resgrid.Services; using Resgrid.Web.Services.Hubs; using Resgrid.Web.Services.Middleware; +using Resgrid.Providers.Voip; +using Resgrid.Web.Services.Models; +using Microsoft.EntityFrameworkCore; +using static OpenIddict.Abstractions.OpenIddictConstants; +using Microsoft.IdentityModel.Tokens; +using OpenTelemetry; +using OpenTelemetry.Exporter; +using OpenTelemetry.Instrumentation.AspNetCore; +//using OpenTelemetry.Metrics; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; +using OpenIddict.Abstractions; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Swashbuckle.AspNetCore.Swagger; +using System.Security.Cryptography.X509Certificates; namespace Resgrid.Web.ServicesCore { @@ -55,6 +64,7 @@ public class Startup public ILifetimeScope AutofacContainer { get; private set; } public AutofacServiceLocator Locator { get; private set; } public IServiceCollection Services { get; private set; } + //private MeterProvider meterProvider; public Startup(IHostingEnvironment env) { @@ -68,9 +78,6 @@ public Startup(IHostingEnvironment env) { // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709 //builder.AddUserSecrets(); - - // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately. - builder.AddApplicationInsightsSettings(developerMode: true); } this.Configuration = builder.Build(); @@ -83,14 +90,12 @@ public void ConfigureServices(IServiceCollection services) bool configResult = ConfigProcessor.LoadAndProcessConfig(Configuration["AppOptions:ConfigPath"]); bool envConfigResult = ConfigProcessor.LoadAndProcessEnvVariables(Configuration.AsEnumerable()); - Framework.Logging.Initialize(Configuration["AppOptions:SentryKey"]); + Framework.Logging.Initialize(ExternalErrorConfig.ExternalErrorServiceUrl); //var manager = new ApplicationPartManager(); //manager.ApplicationParts.Add(new AssemblyPart(typeof(Startup).Assembly)); // Add framework services. - services.AddApplicationInsightsTelemetry(Configuration); - var settings = System.Configuration.ConfigurationManager.ConnectionStrings; var element = typeof(ConfigurationElement).GetField("_readOnly", BindingFlags.Instance | BindingFlags.NonPublic); var collection = typeof(ConfigurationElementCollection).GetField("_readOnly", BindingFlags.Instance | BindingFlags.NonPublic); @@ -126,7 +131,6 @@ public void ConfigureServices(IServiceCollection services) config.Password.RequiredLength = 6; }).AddDefaultTokenProviders().AddClaimsPrincipalFactory>(); - services.AddApplicationInsightsTelemetry(); services.AddCors(); services.AddControllers().AddNewtonsoftJson(options => @@ -136,40 +140,75 @@ public void ConfigureServices(IServiceCollection services) services.AddApiVersioning(x => { - x.DefaultApiVersion = new ApiVersion(3, 0); - x.AssumeDefaultVersionWhenUnspecified = true; + x.DefaultApiVersion = new ApiVersion(3, 0); + x.AssumeDefaultVersionWhenUnspecified = true; x.ReportApiVersions = true; }); services.AddMemoryCache(); services.Configure(Configuration.GetSection("IpRateLimiting")); services.AddSingleton(); - services.AddSingleton(); + services.AddInMemoryRateLimiting(); services.AddSingleton(); + //services.AddSingleton(); services.AddSwaggerGen(); services.AddSwaggerGenNewtonsoftSupport(); services.ConfigureSwaggerGen(options => { + options.CustomSchemaIds(type => type.ToString()); + + // add JWT Authentication + var securityScheme = new OpenApiSecurityScheme + { + Name = "JWT Authentication", + Description = "Enter JWT Bearer token **_only_**", + In = ParameterLocation.Header, + Type = SecuritySchemeType.Http, + Scheme = "bearer", // must be lower case + BearerFormat = "JWT", + Reference = new OpenApiReference + { + Id = JwtBearerDefaults.AuthenticationScheme, + Type = ReferenceType.SecurityScheme + } + }; + + options.AddSecurityDefinition(securityScheme.Reference.Id, securityScheme); + options.AddSecurityRequirement(new OpenApiSecurityRequirement + { + {securityScheme, new string[] { }} + }); + options.SwaggerDoc("v3", + new OpenApiInfo { Title = "Resgrid API", Version = "v3", - Description = "The Resgrid Computer Aided Dispatch (CAD) API reference", + Description = "The Resgrid Computer Aided Dispatch (CAD) API reference. Documentation: https://resgrid-core.readthedocs.io/en/latest/api/index.html", + Contact = new OpenApiContact() { Email = "team@resgrid.com", Name = "Resgrid Team", Url = new Uri("https://resgrid.com") }, + TermsOfService = new Uri("https://resgrid.com/Public/Terms") + } + ); + + options.SwaggerDoc("v4", + + new OpenApiInfo + { + Title = "Resgrid API", + Version = "v4", + Description = "The Resgrid Computer Aided Dispatch (CAD) API reference. Documentation: https://resgrid-core.readthedocs.io/en/latest/api/index.html", Contact = new OpenApiContact() {Email = "team@resgrid.com", Name = "Resgrid Team", Url = new Uri("https://resgrid.com")}, - TermsOfService = new Uri("https://resgrid.com/Public/Terms") + TermsOfService = new Uri("https://resgrid.com/Public/Terms") } ); - var filePath = Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "Resgrid.Web.Services.xml"); + var filePath = Path.Combine(AppContext.BaseDirectory, "Resgrid.Web.Services.xml"); options.IncludeXmlComments(filePath); - options.DescribeAllEnumsAsStrings(); + //options.DescribeAllEnumsAsStrings(); }); - services.AddAuthentication("BasicAuthentication") - .AddScheme("BasicAuthentication", null); - services.AddSignalR(hubOptions => { hubOptions.EnableDetailedErrors = true; @@ -296,6 +335,16 @@ public void ConfigureServices(IServiceCollection services) options.AddPolicy(ResgridResources.Protocol_Update, policy => policy.RequireClaim(ResgridClaimTypes.Resources.Protocols, ResgridClaimTypes.Actions.Update)); options.AddPolicy(ResgridResources.Protocol_Create, policy => policy.RequireClaim(ResgridClaimTypes.Resources.Protocols, ResgridClaimTypes.Actions.Create)); options.AddPolicy(ResgridResources.Protocol_Delete, policy => policy.RequireClaim(ResgridClaimTypes.Resources.Protocols, ResgridClaimTypes.Actions.Delete)); + + options.AddPolicy(ResgridResources.Forms_View, policy => policy.RequireClaim(ResgridClaimTypes.Resources.Forms, ResgridClaimTypes.Actions.View)); + options.AddPolicy(ResgridResources.Forms_Update, policy => policy.RequireClaim(ResgridClaimTypes.Resources.Forms, ResgridClaimTypes.Actions.Update)); + options.AddPolicy(ResgridResources.Forms_Create, policy => policy.RequireClaim(ResgridClaimTypes.Resources.Forms, ResgridClaimTypes.Actions.Create)); + options.AddPolicy(ResgridResources.Forms_Delete, policy => policy.RequireClaim(ResgridClaimTypes.Resources.Forms, ResgridClaimTypes.Actions.Delete)); + + options.AddPolicy(ResgridResources.Voice_View, policy => policy.RequireClaim(ResgridClaimTypes.Resources.Voice, ResgridClaimTypes.Actions.View)); + options.AddPolicy(ResgridResources.Voice_Update, policy => policy.RequireClaim(ResgridClaimTypes.Resources.Voice, ResgridClaimTypes.Actions.Update)); + options.AddPolicy(ResgridResources.Voice_Create, policy => policy.RequireClaim(ResgridClaimTypes.Resources.Voice, ResgridClaimTypes.Actions.Create)); + options.AddPolicy(ResgridResources.Voice_Delete, policy => policy.RequireClaim(ResgridClaimTypes.Resources.Voice, ResgridClaimTypes.Actions.Delete)); }); #endregion Auth Roles @@ -304,6 +353,171 @@ public void ConfigureServices(IServiceCollection services) StripeConfiguration.ApiKey = Config.PaymentProviderConfig.IsTestMode ? PaymentProviderConfig.TestApiKey : PaymentProviderConfig.ProductionApiKey; + services.AddDbContext(options => + { + // Configure the context to use Microsoft SQL Server. + options.UseSqlServer(OidcConfig.ConnectionString); + + // Register the entity sets needed by OpenIddict. + // Note: use the generic overload if you need + // to replace the default OpenIddict entities. + options.UseOpenIddict(); + }); + + // Register the Identity services. + //services.AddIdentity() + // .AddEntityFrameworkStores() + // .AddDefaultTokenProviders(); + + // Configure Identity to use the same JWT claims as OpenIddict instead + // of the legacy WS-Federation claims it uses by default (ClaimTypes), + // which saves you from doing the mapping in your authorization controller. + services.Configure(options => + { + options.ClaimsIdentity.UserNameClaimType = Claims.Name; + options.ClaimsIdentity.UserIdClaimType = Claims.Subject; + options.ClaimsIdentity.RoleClaimType = Claims.Role; + }); + + //// OpenIddict offers native integration with Quartz.NET to perform scheduled tasks + //// (like pruning orphaned authorizations/tokens from the database) at regular intervals. + //services.AddQuartz(options => + //{ + // options.UseMicrosoftDependencyInjectionJobFactory(); + // options.UseSimpleTypeLoader(); + // options.UseInMemoryStore(); + //}); + + //// Register the Quartz.NET service and configure it to block shutdown until jobs are complete. + //services.AddQuartzHostedService(options => options.WaitForJobsToComplete = true); + + services.AddOpenIddict() + // Register the OpenIddict core components. + .AddCore(options => + { + // Configure OpenIddict to use the Entity Framework Core stores and models. + // Note: call ReplaceDefaultEntities() to replace the default OpenIddict entities. + options.UseEntityFrameworkCore() + .UseDbContext() + .ReplaceDefaultEntities(); + + // Enable Quartz.NET integration. + //options.UseQuartz(); + }) + // Register the OpenIddict server components. + .AddServer(options => + { + options.RegisterScopes( + Scopes.Profile, + Scopes.Email, + Scopes.OfflineAccess); + + // Enable the token endpoint. + options.SetTokenEndpointUris("/api/v4/connect/token"); + + options.SetAccessTokenLifetime(TimeSpan.FromMinutes(OidcConfig.AccessTokenExpiryMinutes)); + options.SetRefreshTokenLifetime(TimeSpan.FromDays(OidcConfig.RefreshTokenExpiryDays)); + + // Enable the password and the refresh token flows. + options.AllowPasswordFlow() + .AllowRefreshTokenFlow(); + + // Accept anonymous clients (i.e clients that don't send a client_id). + options.AcceptAnonymousClients(); + + options.AddEncryptionCertificate(new X509Certificate2(Convert.FromBase64String(OidcConfig.EncryptionCert))); + options.AddSigningCertificate(new X509Certificate2(Convert.FromBase64String(OidcConfig.SigningCert))); + + //options.AddEncryptionKey(new SymmetricSecurityKey( + // Convert.FromBase64String(OidcConfig.Key))); + + // Register the signing and encryption credentials. + //options.AddDevelopmentEncryptionCertificate() + // .AddDevelopmentSigningCertificate(); + + // Register the ASP.NET Core host and configure the ASP.NET Core-specific options. + options.UseAspNetCore() + .EnableTokenEndpointPassthrough(); + }) + // Register the OpenIddict validation components. + .AddValidation(options => + { + // Import the configuration from the local OpenIddict server instance. + options.UseLocalServer(); + + // Register the ASP.NET Core host. + options.UseAspNetCore(); + }); + + switch (TelemetryConfig.Exporter) + { + case "jaeger": + services.AddOpenTelemetryTracing((builder) => builder + .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(this.Configuration.GetValue("Jaeger:ServiceName"))) + .AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .AddJaegerExporter()); + + services.Configure(this.Configuration.GetSection("Jaeger")); + break; + case "zipkin": + services.AddOpenTelemetryTracing((builder) => builder + .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(this.Configuration.GetValue("Zipkin:ServiceName"))) + .AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .AddZipkinExporter()); + + services.Configure(this.Configuration.GetSection("Zipkin")); + break; + case "otlp": + // Adding the OtlpExporter creates a GrpcChannel. + // This switch must be set before creating a GrpcChannel/HttpClient when calling an insecure gRPC service. + // See: https://docs.microsoft.com/aspnet/core/grpc/troubleshoot#call-insecure-grpc-services-with-net-core-client + AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); + + services.AddOpenTelemetryTracing((builder) => builder + .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(this.Configuration.GetValue("Otlp:ServiceName"))) + .AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .AddOtlpExporter(otlpOptions => + { + otlpOptions.Endpoint = new Uri(this.Configuration.GetValue("Otlp:Endpoint")); + })); + break; + default: + services.AddOpenTelemetryTracing((builder) => builder + .AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .AddConsoleExporter()); + + // For options which can be bound from IConfiguration. + services.Configure(this.Configuration.GetSection("AspNetCoreInstrumentation")); + + // For options which can be configured from code only. + services.Configure(options => + { + options.Filter = (req) => + { + return req.Request.Host != null; + }; + }); + + break; + } + + services.AddAuthentication("BasicAuthentication") + .AddScheme("BasicAuthentication", null); + + //// TODO: Add IServiceCollection.AddOpenTelemetryMetrics extension method + //var providerBuilder = Sdk.CreateMeterProviderBuilder() + // .AddAspNetCoreInstrumentation(); + + //// TODO: Add configuration switch for Prometheus and OTLP export + //providerBuilder + // .AddConsoleExporter(); + + //this.meterProvider = providerBuilder.Build(); + this.Services = services; } @@ -322,8 +536,8 @@ public void ConfigureContainer(ContainerBuilder builder) builder.RegisterModule(new CacheProviderModule()); builder.RegisterModule(new MarketingModule()); builder.RegisterModule(new PdfProviderModule()); - builder.RegisterModule(new AudioProviderModule()); builder.RegisterModule(new FirebaseProviderModule()); + builder.RegisterModule(new VoipProviderModule()); builder.RegisterType().As>().InstancePerLifetimeScope(); builder.RegisterType().As>().InstancePerLifetimeScope(); @@ -382,7 +596,9 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF app.UseSwagger(); app.UseSwaggerUI(c => { - c.SwaggerEndpoint("/swagger/v3/swagger.json", "Resgrid API V3"); + c.SwaggerEndpoint($"/swagger/v3/swagger.json", "Resgrid API V3"); + c.SwaggerEndpoint($"/swagger/v4/swagger.json", "Resgrid API V4"); + c.RoutePrefix = string.Empty; }); diff --git a/Web/Resgrid.Web.ServicesCore/appsettings.Development.json b/Web/Resgrid.Web.ServicesCore/appsettings.Development.json index 05e44558..6877d610 100644 --- a/Web/Resgrid.Web.ServicesCore/appsettings.Development.json +++ b/Web/Resgrid.Web.ServicesCore/appsettings.Development.json @@ -1,12 +1,9 @@ { "AppOptions": { - "ConfigPath": "C:\\Resgrid\\Config\\ResgridConfig.json" - }, - "ApplicationInsights": { - "InstrumentationKey": "a784b9f9-28b1-48da-8b06-bc2ab8a9e68b" + "ConfigPath": null }, "ConnectionStrings": { - "ResgridContext": "Server=rgdevserver;Database=Resgrid;User Id=resgrid_app;Password=resgrid123;MultipleActiveResultSets=True;" + "ResgridContext": "Server=rgdevserver;Database=Resgrid;User Id=resgrid_app;Password=resgrid123;MultipleActiveResultSets=True;" }, "Logging": { "IncludeScopes": false, diff --git a/Web/Resgrid.Web.ServicesCore/appsettings.Production.json b/Web/Resgrid.Web.ServicesCore/appsettings.Production.json index 40c913f7..475e54da 100644 --- a/Web/Resgrid.Web.ServicesCore/appsettings.Production.json +++ b/Web/Resgrid.Web.ServicesCore/appsettings.Production.json @@ -1,9 +1,6 @@ { "AppOptions": { - "ConfigPath": "C:\\Resgrid\\Config\\ResgridConfig.json" - }, - "ApplicationInsights": { - "InstrumentationKey": "a784b9f9-28b1-48da-8b06-bc2ab8a9e68b" + "ConfigPath": null }, "ConnectionStrings": { "ResgridContext": "Server=rgdevserver;Database=Resgrid;User Id=resgrid_app;Password=resgrid123;MultipleActiveResultSets=True;" diff --git a/Web/Resgrid.Web.ServicesCore/appsettings.Staging.json b/Web/Resgrid.Web.ServicesCore/appsettings.Staging.json index 40c913f7..f8aff0cd 100644 --- a/Web/Resgrid.Web.ServicesCore/appsettings.Staging.json +++ b/Web/Resgrid.Web.ServicesCore/appsettings.Staging.json @@ -1,19 +1,16 @@ { - "AppOptions": { - "ConfigPath": "C:\\Resgrid\\Config\\ResgridConfig.json" - }, - "ApplicationInsights": { - "InstrumentationKey": "a784b9f9-28b1-48da-8b06-bc2ab8a9e68b" - }, - "ConnectionStrings": { - "ResgridContext": "Server=rgdevserver;Database=Resgrid;User Id=resgrid_app;Password=resgrid123;MultipleActiveResultSets=True;" - }, - "Logging": { - "IncludeScopes": false, - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" + "AppOptions": { + "ConfigPath": null + }, + "ConnectionStrings": { + "ResgridContext": "Server=rgdevserver;Database=Resgrid;User Id=resgrid_app;Password=resgrid123;MultipleActiveResultSets=True;" + }, + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } } - } } diff --git a/Web/Resgrid.Web.ServicesCore/appsettings.json b/Web/Resgrid.Web.ServicesCore/appsettings.json index 00571897..b01f13cd 100644 --- a/Web/Resgrid.Web.ServicesCore/appsettings.json +++ b/Web/Resgrid.Web.ServicesCore/appsettings.json @@ -1,4 +1,7 @@ { + "ConnectionStrings": { + "AuthorizationDbContext": "Server=rgdevserver;Database=ResgridOIDC;User Id=resgrid_odic;Password=resgrid123;MultipleActiveResultSets=True;" + }, "Logging": { "LogLevel": { "Default": "Warning" @@ -10,12 +13,6 @@ "ServerUrls": "http://192.168.130.83:8200", "ServiceName": "ResgridAPI" }, - "AppOptions": { - "ConfigPath": "C:\\Resgrid\\Config\\ResgridConfig.json" - }, - "ApplicationInsights": { - "InstrumentationKey": "09c7a847-e608-4d34-87db-5f405906d92d" - }, "IpRateLimiting": { "EnableEndpointRateLimiting": true, "StackBlockedRequests": false, diff --git a/Web/Resgrid.WebCore/Areas/User/Apps/NewForm/newForm.jsx b/Web/Resgrid.WebCore/Areas/User/Apps/NewForm/newForm.jsx new file mode 100644 index 00000000..c91ae735 --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Apps/NewForm/newForm.jsx @@ -0,0 +1,60 @@ +import React, { Component } from "react"; +import ReactDOM from 'react-dom'; +import * as SurveyKo from "survey-knockout"; +import * as SurveyJSCreator from "survey-creator"; + +import "jquery-ui/themes/base/all.css"; +import "nouislider/distribute/nouislider.css"; +import "select2/dist/css/select2.css"; +import "bootstrap-slider/dist/css/bootstrap-slider.css"; + +import "jquery-bar-rating/dist/themes/css-stars.css"; +import "jquery-bar-rating/dist/themes/fontawesome-stars.css"; + +import $ from "jquery"; +import "jquery-ui/ui/widgets/datepicker.js"; +import "select2/dist/js/select2.js"; +import "jquery-bar-rating"; + +//import "icheck/skins/square/blue.css"; +import "pretty-checkbox/dist/pretty-checkbox.css"; + +import * as widgets from "surveyjs-widgets"; + +class NewForm extends Component { + surveyCreator; + componentDidMount() { + let options = { showEmbededSurveyTab: true }; + this.surveyCreator = new SurveyJSCreator.SurveyCreator( + null, + options + ); + this.surveyCreator.saveSurveyFunc = this.saveMySurvey; + this.surveyCreator.tabs().push({ + name: "survey-templates", + title: "My Custom Tab", + template: "custom-tab-survey-templates", + action: () => { + this.surveyCreator.makeNewViewActive("survey-templates"); + }, + data: {}, + }); + this.surveyCreator.render("surveyCreatorContainer"); + } + render() { + return (
+ + +
+
); + } + saveMySurvey = () => { + console.log(JSON.stringify(this.surveyCreator.text)); + }; +} + +export default NewForm; + +ReactDOM.render(, document.querySelector("#new-form")); diff --git a/Web/Resgrid.WebCore/Areas/User/Apps/NewForm/webpack.config.js b/Web/Resgrid.WebCore/Areas/User/Apps/NewForm/webpack.config.js new file mode 100644 index 00000000..a9f670a6 --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Apps/NewForm/webpack.config.js @@ -0,0 +1,36 @@ +const webpack = require('webpack'); + +module.exports = { + entry: ['babel-polyfill', './NewForm/newForm.jsx'], + module: { + rules: [ + { + test: /\.(js|jsx)$/, + exclude: /(node_modules|bower_components)/, + use: { + loader: "babel-loader" + } + }, + { + test: /\.css$/i, + use: ["style-loader", "css-loader"], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [ + { + loader: 'file-loader', + }, + ], + }, + ] + }, + resolve: { + extensions: ['.js', '.jsx'] + }, + output: { + path: __dirname + '../../../../../wwwroot/js/react', + publicPath: '/', + filename: 'newForm.js' + } +}; diff --git a/Web/Resgrid.WebCore/Areas/User/Apps/PersonnelList/personnelList.jsx b/Web/Resgrid.WebCore/Areas/User/Apps/PersonnelList/personnelList.jsx new file mode 100644 index 00000000..aa9ebfde --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Apps/PersonnelList/personnelList.jsx @@ -0,0 +1,47 @@ +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; +import MaterialTable from 'material-table'; + +class PersonnelList extends Component { + constructor() { + super(); + this.state = { + }; + } + + render() { + return ( + + new Promise((resolve, reject) => { + let url = resgrid.absoluteBaseUrl + '/User/Personnel/GetPersonnelListPaged?'; + url += 'perPage=' + query.pageSize; + url += '&page=' + (query.page + 1); + + fetch(url) + .then(response => response.json()) + .then(result => { + resolve({ + data: result.Data, + page: result.Page - 1, + totalCount: result.Total + }); + }); + }) + } + options={{ + sorting: true + }} + /> + ); + } +} + +ReactDOM.render(, document.querySelector("#personnel-list")); diff --git a/Web/Resgrid.WebCore/Areas/User/Apps/PersonnelList/webpack.config.js b/Web/Resgrid.WebCore/Areas/User/Apps/PersonnelList/webpack.config.js index 9f8aa64d..15b98b74 100644 --- a/Web/Resgrid.WebCore/Areas/User/Apps/PersonnelList/webpack.config.js +++ b/Web/Resgrid.WebCore/Areas/User/Apps/PersonnelList/webpack.config.js @@ -1,20 +1,32 @@ const webpack = require('webpack'); module.exports = { - entry: ['babel-polyfill', './PersonnelList/personnelList.js'], + entry: ['babel-polyfill', './PersonnelList/personnelList.jsx'], module: { rules: [ { - test: /\.m?js$/, + test: /\.(js|jsx)$/, exclude: /(node_modules|bower_components)/, use: { - loader: "babel-loader" - } - } + loader: "babel-loader" + } + }, + { + test: /\.css$/i, + use: ["style-loader", "css-loader"], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [ + { + loader: 'file-loader', + }, + ], + }, ] }, resolve: { - extensions: ['*', '.js', '.jsx'] + extensions: ['.js', '.jsx'] }, output: { path: __dirname + '../../../../../wwwroot/js/react', diff --git a/Web/Resgrid.WebCore/Areas/User/Apps/package-lock.json b/Web/Resgrid.WebCore/Areas/User/Apps/package-lock.json index 00c491af..686dc55a 100644 --- a/Web/Resgrid.WebCore/Areas/User/Apps/package-lock.json +++ b/Web/Resgrid.WebCore/Areas/User/Apps/package-lock.json @@ -1,9 +1,19 @@ { - "name": "personnel-list", + "name": "resgrid-react", "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "3d-view": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/3d-view/-/3d-view-2.0.0.tgz", + "integrity": "sha1-gxrpQtdQjFCAHj4G+v4ejFdOF74=", + "requires": { + "matrix-camera-controller": "^2.1.1", + "orbit-camera-controller": "^4.0.0", + "turntable-camera-controller": "^3.0.0" + } + }, "@babel/cli": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.1.2.tgz", @@ -888,6 +898,30 @@ "regenerator-runtime": "^0.13.2" } }, + "@babel/runtime-corejs3": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.8.tgz", + "integrity": "sha512-4dMD5QRBkumn45oweR0SxoNtt15oz3BUBAQ8cIx7HJqZTtE8zjpM0My8aHJHVnyf4XfRg6DNzaE1080WLBiC1w==", + "optional": true, + "requires": { + "core-js-pure": "^3.15.0", + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "core-js-pure": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.15.2.tgz", + "integrity": "sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA==", + "optional": true + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "optional": true + } + } + }, "@babel/template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", @@ -944,6 +978,14 @@ "to-fast-properties": "^2.0.0" } }, + "@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "requires": { + "commander": "^2.15.1" + } + }, "@date-io/core": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/@date-io/core/-/core-1.3.6.tgz", @@ -962,6 +1004,70 @@ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.1.tgz", "integrity": "sha512-OYpa/Sg+2GDX+jibUfpZVn1YqSVRpYmTLF2eyAfrFTIJSbwyIrc+YscayoykvaOME/wV4BV0Sa0yqdMrgse6mA==" }, + "@mapbox/geojson-rewind": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz", + "integrity": "sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA==", + "requires": { + "get-stream": "^6.0.1", + "minimist": "^1.2.5" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } + } + }, + "@mapbox/geojson-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", + "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" + }, + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=" + }, + "@mapbox/mapbox-gl-supported": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", + "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==" + }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=" + }, + "@mapbox/tiny-sdf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", + "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" + }, + "@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=" + }, + "@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "requires": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" + }, "@material-ui/core": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.0.1.tgz", @@ -1051,6 +1157,84 @@ "react-is": "^16.8.0" } }, + "@plotly/d3-sankey": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", + "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", + "requires": { + "d3-array": "1", + "d3-collection": "1", + "d3-shape": "^1.2.0" + } + }, + "@plotly/d3-sankey-circular": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", + "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", + "requires": { + "d3-array": "^1.2.1", + "d3-collection": "^1.0.4", + "d3-shape": "^1.2.0", + "elementary-circuits-directed-graph": "^1.0.4" + } + }, + "@plotly/point-cluster": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", + "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", + "requires": { + "array-bounds": "^1.0.1", + "binary-search-bounds": "^2.0.4", + "clamp": "^1.0.1", + "defined": "^1.0.0", + "dtype": "^2.0.0", + "flatten-vertex-data": "^1.0.2", + "is-obj": "^1.0.1", + "math-log2": "^1.0.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0" + } + }, + "@turf/area": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", + "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/bbox": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", + "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/centroid": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", + "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", + "requires": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + } + }, + "@turf/helpers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", + "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==" + }, + "@turf/meta": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", + "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", + "requires": { + "@turf/helpers": "^6.5.0" + } + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -1068,6 +1252,12 @@ "@types/node": "*" } }, + "@types/json-schema": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz", + "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -1085,6 +1275,12 @@ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz", "integrity": "sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg==" }, + "@types/raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", + "optional": true + }, "@types/react": { "version": "16.8.19", "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.19.tgz", @@ -1298,6 +1494,21 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "a-big-triangle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/a-big-triangle/-/a-big-triangle-1.0.3.tgz", + "integrity": "sha1-7v0wsCqPUl6LH3K7a7GwwWdRx5Q=", + "requires": { + "gl-buffer": "^2.1.1", + "gl-vao": "^1.2.0", + "weak-map": "^1.0.5" + } + }, + "abs-svg-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", + "integrity": "sha1-32Acjo0roQ1KdtYl4japo5wnI78=" + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1332,6 +1543,22 @@ "acorn": "^5.0.3" } }, + "add-line-numbers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/add-line-numbers/-/add-line-numbers-1.0.1.tgz", + "integrity": "sha1-SNu96kfb0jTer+rGyTzqb3C0t+M=", + "requires": { + "pad-left": "^1.0.2" + } + }, + "affine-hull": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/affine-hull/-/affine-hull-1.0.0.tgz", + "integrity": "sha1-dj/x040GPOt+Jy8X7k17vK+QXF0=", + "requires": { + "robust-orientation": "^1.1.3" + } + }, "ajv": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", @@ -1356,6 +1583,29 @@ "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", "dev": true }, + "almost-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", + "integrity": "sha1-+FHGMROHV5lCdqou++jfowZszN0=" + }, + "alpha-complex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/alpha-complex/-/alpha-complex-1.0.0.tgz", + "integrity": "sha1-kIZYcNawVCrnPAwTHU75iWabctI=", + "requires": { + "circumradius": "^1.0.0", + "delaunay-triangulate": "^1.1.6" + } + }, + "alpha-shape": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/alpha-shape/-/alpha-shape-1.0.0.tgz", + "integrity": "sha1-yDEJkj7P2mZ9IWP+Tyb+JHJvZKk=", + "requires": { + "alpha-complex": "^1.0.0", + "simplicial-complex-boundary": "^1.0.0" + } + }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", @@ -1434,8 +1684,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "arr-union": { "version": "3.1.0", @@ -1443,6 +1692,16 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-bounds": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", + "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -1459,6 +1718,24 @@ "es-abstract": "^1.7.0" } }, + "array-normalize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", + "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", + "requires": { + "array-bounds": "^1.0.0" + } + }, + "array-range": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", + "integrity": "sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w=" + }, + "array-rearrange": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", + "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==" + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -1545,8 +1822,12 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "atob-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-1.0.0.tgz", + "integrity": "sha1-uI3KYAaSK5YglPdVaCa6sxxKKWs=" }, "babel-eslint": { "version": "10.0.1", @@ -1617,6 +1898,14 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "barycentric": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/barycentric/-/barycentric-1.0.1.tgz", + "integrity": "sha1-8VYruJGyb0/sRjqC7to2V4AOxog=", + "requires": { + "robust-linear-solve": "^1.0.0" + } + }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", @@ -1672,6 +1961,12 @@ } } }, + "base64-arraybuffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", + "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", + "optional": true + }, "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", @@ -1684,6 +1979,16 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, + "big-rat": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/big-rat/-/big-rat-1.0.4.tgz", + "integrity": "sha1-do0JO7V5MN0Y7Vdcf8on3FORreo=", + "requires": { + "bit-twiddle": "^1.0.2", + "bn.js": "^4.11.6", + "double-bits": "^1.1.1" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -1696,6 +2001,33 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, + "binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" + }, + "bit-twiddle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", + "integrity": "sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4=" + }, + "bitmap-sdf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz", + "integrity": "sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg==", + "requires": { + "clamp": "^1.0.1" + } + }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "bluebird": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", @@ -1705,8 +2037,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "body-parser": { "version": "1.19.0", @@ -1748,6 +2079,25 @@ "multicast-dns-service-types": "^1.1.0" } }, + "bootstrap-slider": { + "version": "10.6.2", + "resolved": "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-10.6.2.tgz", + "integrity": "sha512-8JTPZB9QVOdrGzYF3YgC3YW6ssfPeBvBwZnXffiZ7YH/zz1D0EKlZvmQsm/w3N0XjVNYQEoQ0ax+jHrErV4K1Q==" + }, + "boundary-cells": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/boundary-cells/-/boundary-cells-2.0.2.tgz", + "integrity": "sha512-/S48oUFYEgZMNvdqC87iYRbLBAPHYijPRNrNpm/sS8u7ijIViKm/hrV3YD4sx/W68AsG5zLMyBEditVHApHU5w==" + }, + "box-intersect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/box-intersect/-/box-intersect-1.0.2.tgz", + "integrity": "sha512-yJeMwlmFPG1gIa7Rs/cGXeI6iOj6Qz5MG5PE61xLKpElUGzmJ4abm+qsLpzxKJFpsSDq742BQEocr8dI2t8Nxw==", + "requires": { + "bit-twiddle": "^1.0.2", + "typedarray-pool": "^1.1.0" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1875,6 +2225,11 @@ "node-releases": "^1.1.21" } }, + "btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==" + }, "buble": { "version": "0.19.3", "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.3.tgz", @@ -1913,8 +2268,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-indexof": { "version": "1.1.1", @@ -2006,6 +2360,43 @@ "integrity": "sha512-TQFYFhRS0O5rdsmSbF1Wn+16latXYsQJat66f7S7lizXW1PVpWJeZw9wqqVLIjuxDRz7s7xRUj13QCfd8hKn6g==", "dev": true }, + "canvas-fit": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", + "integrity": "sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8=", + "requires": { + "element-size": "^1.1.1" + } + }, + "canvg": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.7.tgz", + "integrity": "sha512-4sq6iL5Q4VOXS3PL1BapiXIZItpxYyANVzsAKpTPS5oq4u3SKbGfUcbZh2gdLCQ3jWpG/y5wRkMlBBAJhXeiZA==", + "optional": true, + "requires": { + "@babel/runtime-corejs3": "^7.9.6", + "@types/raf": "^3.4.0", + "raf": "^3.4.1", + "rgbcolor": "^1.0.1", + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^5.0.5" + } + }, + "cdt2d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cdt2d/-/cdt2d-1.0.0.tgz", + "integrity": "sha1-TyEkNLzWe9s9aLj+9KzcLFRBUUE=", + "requires": { + "binary-search-bounds": "^2.0.3", + "robust-in-sphere": "^1.1.3", + "robust-orientation": "^1.1.3" + } + }, + "cell-orientation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cell-orientation/-/cell-orientation-1.0.1.tgz", + "integrity": "sha1-tQStlqZq0obZ7dmFoiU9A7gNKFA=" + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2074,6 +2465,28 @@ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, + "circumcenter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/circumcenter/-/circumcenter-1.0.0.tgz", + "integrity": "sha1-INeqE7F/usUvUtpPVMasi5Bu5Sk=", + "requires": { + "dup": "^1.0.0", + "robust-linear-solve": "^1.0.0" + } + }, + "circumradius": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/circumradius/-/circumradius-1.0.0.tgz", + "integrity": "sha1-cGxEfj5VzR7T0RvRM+N8JSzDBbU=", + "requires": { + "circumcenter": "^1.0.0" + } + }, + "clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ=" + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -2102,6 +2515,20 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, + "clean-pslg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/clean-pslg/-/clean-pslg-1.1.2.tgz", + "integrity": "sha1-vTXHRgt+irWp92Gl7VF5aqPIbBE=", + "requires": { + "big-rat": "^1.0.3", + "box-intersect": "^1.0.1", + "nextafter": "^1.0.0", + "rat-vec": "^1.1.1", + "robust-segment-intersect": "^1.0.1", + "union-find": "^1.0.2", + "uniq": "^1.0.1" + } + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -2149,6 +2576,14 @@ "object-visit": "^1.0.0" } }, + "color-alpha": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", + "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", + "requires": { + "color-parse": "^1.3.8" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -2158,17 +2593,76 @@ "color-name": "1.1.3" } }, + "color-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", + "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", + "requires": { + "clamp": "^1.0.1" + } + }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-normalize": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", + "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", + "requires": { + "clamp": "^1.0.1", + "color-rgba": "^2.1.1", + "dtype": "^2.0.0" + } + }, + "color-parse": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.3.8.tgz", + "integrity": "sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==", + "requires": { + "color-name": "^1.0.0", + "defined": "^1.0.0", + "is-plain-obj": "^1.1.0" + } + }, + "color-rgba": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.1.tgz", + "integrity": "sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==", + "requires": { + "clamp": "^1.0.1", + "color-parse": "^1.3.8", + "color-space": "^1.14.6" + } + }, + "color-space": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.16.0.tgz", + "integrity": "sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==", + "requires": { + "hsluv": "^0.0.3", + "mumath": "^3.3.4" + } + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, + "colormap": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/colormap/-/colormap-2.3.2.tgz", + "integrity": "sha512-jDOjaoEEmA9AgA11B/jCSAvYE95r3wRoAyTf3LEHGiUVlNHJaL1mRkf5AyLSpQBVGfTEPwGEqCIzL+kgr2WgNA==", + "requires": { + "lerp": "^1.0.3" + } + }, "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" }, "commondir": { "version": "1.0.1", @@ -2176,6 +2670,32 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-angle": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/compare-angle/-/compare-angle-1.0.1.tgz", + "integrity": "sha1-pOtjQW6jx0f8a9bItjZotN5PoSk=", + "requires": { + "robust-orientation": "^1.0.2", + "robust-product": "^1.0.0", + "robust-sum": "^1.0.0", + "signum": "^0.0.0", + "two-sum": "^1.0.0" + } + }, + "compare-cell": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/compare-cell/-/compare-cell-1.0.0.tgz", + "integrity": "sha1-qetwj24OQa73qlZrEw8ZaNyeGqo=" + }, + "compare-oriented-cell": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz", + "integrity": "sha1-ahSf7vnfxPj8YjWOUd1C7/u9w54=", + "requires": { + "cell-orientation": "^1.0.1", + "compare-cell": "^1.0.0" + } + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -2206,6 +2726,18 @@ "vary": "~1.1.2" } }, + "compute-dims": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/compute-dims/-/compute-dims-1.1.0.tgz", + "integrity": "sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg==", + "requires": { + "utils-copy": "^1.0.0", + "validate.io-array": "^1.0.6", + "validate.io-matrix-like": "^1.0.2", + "validate.io-ndarray-like": "^1.0.0", + "validate.io-positive-integer": "^1.0.0" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2216,7 +2748,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -2244,6 +2775,16 @@ "resolved": "https://registry.npmjs.org/console-polyfill/-/console-polyfill-0.1.2.tgz", "integrity": "sha1-ls/tUcr3gYn2mVcubxgnHcN8DjA=" }, + "const-max-uint32": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/const-max-uint32/-/const-max-uint32-1.0.2.tgz", + "integrity": "sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY=" + }, + "const-pinf-float64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz", + "integrity": "sha1-9u+w15+cCYbT558pI6v5twtj1yY=" + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -2289,6 +2830,16 @@ "safe-buffer": "~5.1.1" } }, + "convex-hull": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/convex-hull/-/convex-hull-1.0.3.tgz", + "integrity": "sha1-IKOqbOh/St6i/30XlxyfwcZ+H/8=", + "requires": { + "affine-hull": "^1.0.0", + "incremental-convex-hull": "^1.0.1", + "monotone-convex-hull-2d": "^1.0.1" + } + }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", @@ -2354,8 +2905,12 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "country-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", + "integrity": "sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY=" }, "create-ecdh": { "version": "4.0.3", @@ -2434,35 +2989,431 @@ "tiny-invariant": "^1.0.4" } }, - "css-vendor": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.2.tgz", - "integrity": "sha512-Xn5ZAlI00d8HaQ8/oQ8d+iBzSF//NCc77LPzsucM32X/R/yTqmXy6otVsAM0XleXk6HjPuXoVZwXsayky/fsFQ==", + "css-font": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", + "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", "requires": { - "@babel/runtime": "^7.3.1", - "is-in-browser": "^1.0.2" + "css-font-size-keywords": "^1.0.0", + "css-font-stretch-keywords": "^1.0.1", + "css-font-style-keywords": "^1.0.1", + "css-font-weight-keywords": "^1.0.0", + "css-global-keywords": "^1.0.1", + "css-system-font-keywords": "^1.0.0", + "pick-by-alias": "^1.2.0", + "string-split-by": "^1.0.0", + "unquote": "^1.1.0" } }, - "csstype": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.5.tgz", - "integrity": "sha512-JsTaiksRsel5n7XwqPAfB0l3TFKdpjW/kgAELf9vrb5adGA7UCPLajKK5s3nFrcFm3Rkyp/Qkgl73ENc1UY3cA==" + "css-font-size-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", + "integrity": "sha1-hUh1rOmspqjS7g00WkSq6btttss=" }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true + "css-font-stretch-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", + "integrity": "sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA=" }, - "date-fns": { - "version": "2.0.0-alpha.27", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.0.0-alpha.27.tgz", - "integrity": "sha512-cqfVLS+346P/Mpj2RpDrBv0P4p2zZhWWvfY5fuWrXNR/K38HaAGEkeOwb47hIpQP9Jr/TIxjZ2/sNMQwdXuGMg==" + "css-font-style-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", + "integrity": "sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ=" }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "css-font-weight-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", + "integrity": "sha1-m8BGcayFvHJLV07106yWsNYE/Zc=" + }, + "css-global-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", + "integrity": "sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk=" + }, + "css-line-break": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-1.1.1.tgz", + "integrity": "sha512-1feNVaM4Fyzdj4mKPIQNL2n70MmuYzAXZ1aytlROFX1JsOo070OsugwGjj7nl6jnDJWHDM8zRZswkmeYVWZJQA==", + "optional": true, + "requires": { + "base64-arraybuffer": "^0.2.0" + } + }, + "css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "css-system-font-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", + "integrity": "sha1-hcbwhquk6zLFcaMIav/ENLhII+0=" + }, + "css-vendor": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.2.tgz", + "integrity": "sha512-Xn5ZAlI00d8HaQ8/oQ8d+iBzSF//NCc77LPzsucM32X/R/yTqmXy6otVsAM0XleXk6HjPuXoVZwXsayky/fsFQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "is-in-browser": "^1.0.2" + } + }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "csstype": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.5.tgz", + "integrity": "sha512-JsTaiksRsel5n7XwqPAfB0l3TFKdpjW/kgAELf9vrb5adGA7UCPLajKK5s3nFrcFm3Rkyp/Qkgl73ENc1UY3cA==" + }, + "cubic-hermite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz", + "integrity": "sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU=" + }, + "cwise-compiler": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", + "integrity": "sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU=", + "requires": { + "uniq": "^1.0.0" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "datatables.net": { + "version": "1.10.25", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.25.tgz", + "integrity": "sha512-y0+C7all+MC/h1acwnjErhaJPjYGKpWTvbXrfEUbR8+P+nnhgjNn5nL1udgsTwBObMhlj1KITNBRrM/ZLSoj+Q==", + "requires": { + "jquery": ">=1.7" + } + }, + "datatables.net-buttons": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/datatables.net-buttons/-/datatables.net-buttons-1.7.1.tgz", + "integrity": "sha512-D2OxZeR18jhSx+l0xcfAJzfUH7l3LHCu0e606fV7+v3hMhphOfljjZYLaiRmGiR9lqO/f5xE/w2a+OtG/QMavw==", + "requires": { + "datatables.net": "^1.10.15", + "jquery": ">=1.7" + } + }, + "datatables.net-buttons-dt": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/datatables.net-buttons-dt/-/datatables.net-buttons-dt-1.7.1.tgz", + "integrity": "sha512-mdHWKHff9cR2KsyQvCmJcC4/S0NZaEzIo83Rqa1ncaQjtSoe989d3bDMyGg0jCEahqNVrZPDjuKWZw0FCR4Xsg==", + "requires": { + "datatables.net-buttons": "1.7.1", + "datatables.net-dt": "^1.10.15", + "jquery": ">=1.7" + } + }, + "datatables.net-colreorder": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/datatables.net-colreorder/-/datatables.net-colreorder-1.5.4.tgz", + "integrity": "sha512-Y9J2DvjBiFw/ADRce7aSaWhLN9yea9ZxK5FA8MDoLmMXtAR7AnKoe0XoTXAPD5aoHCUMiQKEt91qU7CT05KhEg==", + "requires": { + "datatables.net": "^1.10.15", + "jquery": ">=1.7" + } + }, + "datatables.net-colreorder-dt": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/datatables.net-colreorder-dt/-/datatables.net-colreorder-dt-1.5.4.tgz", + "integrity": "sha512-s4mz3d3CQ1+mDOodPH0QZUwrqUrveHmc8+5dWHypFdXj5v1goiz/Ovw2VR2bFltfxZlK7kex+bcrrll3bSP9qA==", + "requires": { + "datatables.net-colreorder": "1.5.4", + "datatables.net-dt": "^1.10.15", + "jquery": ">=1.7" + } + }, + "datatables.net-dt": { + "version": "1.10.25", + "resolved": "https://registry.npmjs.org/datatables.net-dt/-/datatables.net-dt-1.10.25.tgz", + "integrity": "sha512-MIr83Q+KGwea4UsNzVwjgW1vraODKWKLUsMG0aT4ZBG83/7+uGvGsjfFLBPrTtERXxji0tGVLeuFTHvJexufHA==", + "requires": { + "datatables.net": "1.10.25", + "jquery": ">=1.7" + } + }, + "datatables.net-responsive": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/datatables.net-responsive/-/datatables.net-responsive-2.2.9.tgz", + "integrity": "sha512-C+mOY/mG17zzaYPtgqAOsC4JlGddGkKmO/ADNEtNZ41bcPV1/3jJzkOWT3DCZ400NmkXLDz4WObWlPT8WCgfzg==", + "requires": { + "datatables.net": "^1.10.15", + "jquery": ">=1.7" + } + }, + "datatables.net-responsive-dt": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/datatables.net-responsive-dt/-/datatables.net-responsive-dt-2.2.9.tgz", + "integrity": "sha512-m5uMs59hSALaOdglJVTxGDlrSRjIMhkqDYWFwG8GVm6lfBFMNx6gR0mDpiD6WCO6RhBTLCgQF/eDEAt+BoQLlw==", + "requires": { + "datatables.net-dt": "^1.10.15", + "datatables.net-responsive": "2.2.9", + "jquery": ">=1.7" + } + }, + "datatables.net-rowgroup": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/datatables.net-rowgroup/-/datatables.net-rowgroup-1.1.3.tgz", + "integrity": "sha512-gGxPFVYKr/WXAi3HFy6Q0wIP8GrWnZTatt98bdcOs2yS7PjL/FlPECFDnMbkLMjVTXrKeZweKRqrpQeL8NmVNw==", + "requires": { + "datatables.net": "^1.10.15", + "jquery": ">=1.7" + } + }, + "datatables.net-rowgroup-dt": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/datatables.net-rowgroup-dt/-/datatables.net-rowgroup-dt-1.1.3.tgz", + "integrity": "sha512-ximrE0SJHaion+JIrqtlhvBvzneD3UZwwYoAXEuJjMkSwaTjzORf16ibXmSm9za3KNEWPfBdCj6DaJa60+Ct7Q==", + "requires": { + "datatables.net-dt": "^1.10.15", + "datatables.net-rowgroup": "1.1.3", + "jquery": ">=1.7" + } + }, + "datatables.net-select": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/datatables.net-select/-/datatables.net-select-1.3.3.tgz", + "integrity": "sha512-M4e9Qx790IPt+tc+CLgk7gPram3i+M2OmhIkhIpp7RcZ2Ay4App4ouQZcEx3j1MTRIWxtOz47xjpWrwVfJ23YQ==", + "requires": { + "datatables.net": "^1.10.15", + "jquery": ">=1.7" + } + }, + "datatables.net-select-dt": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/datatables.net-select-dt/-/datatables.net-select-dt-1.3.3.tgz", + "integrity": "sha512-KHR7dOqnjb9qJopnKxkIQ+JE2YGotBlTBknDeXrGnPAnHd353Ig2Mz9l1GaniWPnxRZ5FnWi25MK02Ys+ZZQTg==", + "requires": { + "datatables.net-dt": "^1.10.15", + "datatables.net-select": "1.3.3", + "jquery": ">=1.7" + } + }, + "date-fns": { + "version": "2.0.0-alpha.27", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.0.0-alpha.27.tgz", + "integrity": "sha512-cqfVLS+346P/Mpj2RpDrBv0P4p2zZhWWvfY5fuWrXNR/K38HaAGEkeOwb47hIpQP9Jr/TIxjZ2/sNMQwdXuGMg==" + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, "debounce": { @@ -2500,8 +3451,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "deepmerge": { "version": "3.2.0", @@ -2568,6 +3518,11 @@ } } }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, "del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -2583,6 +3538,15 @@ "rimraf": "^2.6.3" } }, + "delaunay-triangulate": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/delaunay-triangulate/-/delaunay-triangulate-1.1.6.tgz", + "integrity": "sha1-W7yiGweBmNS8PHV5ajXLuYwllUw=", + "requires": { + "incremental-convex-hull": "^1.0.1", + "uniq": "^1.0.1" + } + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2611,6 +3575,11 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, + "detect-kerning": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", + "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==" + }, "detect-node": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", @@ -2676,11 +3645,40 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "dompurify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.0.tgz", + "integrity": "sha512-VV5C6Kr53YVHGOBKO/F86OYX6/iLTw2yVSI721gKetxpHCK/V5TaLEf9ODjRgl1KLSWRMY6cUhAbv/c+IUnwQw==", + "optional": true + }, + "double-bits": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/double-bits/-/double-bits-1.1.1.tgz", + "integrity": "sha1-WKu6RUlNpND6Nrc60RoobJGEscY=" + }, + "draw-svg-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", + "integrity": "sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k=", + "requires": { + "abs-svg-path": "~0.1.1", + "normalize-svg-path": "~0.1.0" + } + }, + "dtype": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", + "integrity": "sha1-zQUjI84GFETs0uj1dI9popvihDQ=" + }, + "dup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", + "integrity": "sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk=" + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -2688,6 +3686,27 @@ "stream-shift": "^1.0.0" } }, + "earcut": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.3.tgz", + "integrity": "sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==" + }, + "easy-autocomplete": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/easy-autocomplete/-/easy-autocomplete-1.3.5.tgz", + "integrity": "sha1-Ki0t9pnxPdxIZhyTdblDes8aCpw=", + "requires": { + "jquery": "*" + } + }, + "edges-to-adjacency-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz", + "integrity": "sha1-wUbS4ISt37p0pRKTxuAZmkn3V/E=", + "requires": { + "uniq": "^1.0.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2700,6 +3719,19 @@ "integrity": "sha512-kGi32g42a8vS/WnYE7ELJyejRT7hbr3UeOOu0WeuYuQ29gCpg9Lrf6RdcTQVXSt/v0bjCfnlb/EWOOsiKpTmkw==", "dev": true }, + "element-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", + "integrity": "sha1-ZOXxWdlxIWMYRby67K8nnDm1404=" + }, + "elementary-circuits-directed-graph": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", + "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", + "requires": { + "strongly-connected-components": "^1.0.1" + } + }, "elliptic": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", @@ -2727,6 +3759,11 @@ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, + "emotion-ratings": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/emotion-ratings/-/emotion-ratings-2.0.2.tgz", + "integrity": "sha512-b+HR3kMOC2biuF/nrQk35IuSrEt8jAIay8clGqa4oVmbS8BHkpBnNS5wofly2ArA9Tvzek+3qFt9sK6FMhDuPA==" + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -2737,7 +3774,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -2796,6 +3832,51 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2808,6 +3889,26 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, "eslint": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz", @@ -3096,8 +4197,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { "version": "1.0.1", @@ -3120,14 +4220,12 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "etag": { "version": "1.8.1", @@ -3271,6 +4369,21 @@ } } }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -3368,12 +4481,48 @@ } } }, - "fast-deep-equal": { + "extract-frustum-planes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz", + "integrity": "sha1-l9VwP/BWTIw8aDjKxF+ee8UsnvU=" + }, + "falafel": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz", + "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==", + "requires": { + "acorn": "^7.1.1", + "foreach": "^2.0.5", + "isarray": "^2.0.1", + "object-keys": "^1.0.6" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, + "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, + "fast-isnumeric": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", + "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", + "requires": { + "is-string-blank": "^1.0.1" + } + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -3383,8 +4532,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "faye-websocket": { "version": "0.10.0", @@ -3395,6 +4543,11 @@ "websocket-driver": ">=0.5.1" } }, + "fflate": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", + "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" + }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", @@ -3420,6 +4573,85 @@ "object-assign": "^4.0.1" } }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "filefy": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/filefy/-/filefy-0.1.9.tgz", @@ -3448,6 +4680,15 @@ } } }, + "filtered-vector": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/filtered-vector/-/filtered-vector-1.2.5.tgz", + "integrity": "sha512-5Vu6wdtQJ1O2nRmz39dIr9m3hEDq1skYby5k1cJQdNWK4dMgvYcUEiA/9j7NcKfNZ5LGxn8w2LSLiigyH7pTAw==", + "requires": { + "binary-search-bounds": "^2.0.0", + "cubic-hermite": "^1.0.0" + } + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -3518,6 +4759,19 @@ "write": "^0.2.1" } }, + "flatten-vertex-data": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", + "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", + "requires": { + "dtype": "^2.0.0" + } + }, + "flip-pixels": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flip-pixels/-/flip-pixels-1.0.2.tgz", + "integrity": "sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA==" + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -3554,12 +4808,33 @@ } } }, + "font-atlas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", + "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", + "requires": { + "css-font": "^1.0.0" + } + }, + "font-measure": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", + "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", + "requires": { + "css-font": "^1.2.0" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -3585,7 +4860,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -3635,7 +4909,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -3656,12 +4931,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3676,17 +4953,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -3803,7 +5083,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -3815,6 +5096,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3829,6 +5111,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -3836,12 +5119,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -3860,6 +5145,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -3940,7 +5226,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -3952,6 +5239,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -4037,7 +5325,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -4073,6 +5362,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4092,6 +5382,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4135,12 +5426,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -4153,8 +5446,17 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gamma": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gamma/-/gamma-0.1.0.tgz", + "integrity": "sha1-MxVkNAO/J5BsqAqzfDbs6UQO8zA=" + }, + "geojson-vt": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" }, "get-caller-file": { "version": "1.0.3", @@ -4162,6 +5464,11 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "get-canvas-context": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", + "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -4177,6 +5484,403 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "gl-axes3d": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/gl-axes3d/-/gl-axes3d-1.5.3.tgz", + "integrity": "sha512-KRYbguKQcDQ6PcB9g1pgqB8Ly4TY1DQODpPKiDTasyWJ8PxQk0t2Q7XoQQijNqvsguITCpVVCzNb5GVtIWiVlQ==", + "requires": { + "bit-twiddle": "^1.0.2", + "dup": "^1.0.0", + "extract-frustum-planes": "^1.0.0", + "gl-buffer": "^2.1.2", + "gl-mat4": "^1.2.0", + "gl-shader": "^4.2.1", + "gl-state": "^1.0.0", + "gl-vao": "^1.3.0", + "gl-vec4": "^1.0.1", + "glslify": "^7.0.0", + "robust-orientation": "^1.1.3", + "split-polygon": "^1.0.0", + "vectorize-text": "^3.2.1" + } + }, + "gl-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/gl-buffer/-/gl-buffer-2.1.2.tgz", + "integrity": "sha1-LbjZwaVSf7oM25EonCBuiCuInNs=", + "requires": { + "ndarray": "^1.0.15", + "ndarray-ops": "^1.1.0", + "typedarray-pool": "^1.0.0" + } + }, + "gl-cone3d": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/gl-cone3d/-/gl-cone3d-1.5.2.tgz", + "integrity": "sha512-1JNeHH4sUtUmDA4ZK7Om8/kShwb8IZVAsnxaaB7IPRJsNGciLj1sTpODrJGeMl41RNkex5kXD2SQFrzyEAR2Rw==", + "requires": { + "colormap": "^2.3.1", + "gl-buffer": "^2.1.2", + "gl-mat4": "^1.2.0", + "gl-shader": "^4.2.1", + "gl-texture2d": "^2.1.0", + "gl-vao": "^1.3.0", + "gl-vec3": "^1.1.3", + "glsl-inverse": "^1.0.0", + "glsl-out-of-range": "^1.0.4", + "glsl-specular-cook-torrance": "^2.0.1", + "glslify": "^7.0.0", + "ndarray": "^1.0.18" + } + }, + "gl-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-constants/-/gl-constants-1.0.0.tgz", + "integrity": "sha1-WXpQTjZHUP9QJTqjX43qevSl0jM=" + }, + "gl-contour2d": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/gl-contour2d/-/gl-contour2d-1.1.7.tgz", + "integrity": "sha512-GdebvJ9DtT3pJDpoE+eU2q+Wo9S3MijPpPz5arZbhK85w2bARmpFpVfPaDlZqWkB644W3BlH8TVyvAo1KE4Bhw==", + "requires": { + "binary-search-bounds": "^2.0.4", + "cdt2d": "^1.0.0", + "clean-pslg": "^1.1.2", + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "glslify": "^7.0.0", + "iota-array": "^1.0.0", + "ndarray": "^1.0.18", + "surface-nets": "^1.0.2" + } + }, + "gl-error3d": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/gl-error3d/-/gl-error3d-1.0.16.tgz", + "integrity": "sha512-TGJewnKSp7ZnqGgG3XCF9ldrDbxZrO+OWlx6oIet4OdOM//n8xJ5isArnIV/sdPJnFbhfoLxWrW9f5fxHFRQ1A==", + "requires": { + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "gl-vao": "^1.3.0", + "glsl-out-of-range": "^1.0.4", + "glslify": "^7.0.0" + } + }, + "gl-fbo": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/gl-fbo/-/gl-fbo-2.0.5.tgz", + "integrity": "sha1-D6daSXz3h2lVMGkcjwSrtvtV+iI=", + "requires": { + "gl-texture2d": "^2.0.0" + } + }, + "gl-format-compiler-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/gl-format-compiler-error/-/gl-format-compiler-error-1.0.3.tgz", + "integrity": "sha1-DHmxdRiZzpcy6GJA8JCqQemEcag=", + "requires": { + "add-line-numbers": "^1.0.1", + "gl-constants": "^1.0.0", + "glsl-shader-name": "^1.0.0", + "sprintf-js": "^1.0.3" + } + }, + "gl-heatmap2d": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gl-heatmap2d/-/gl-heatmap2d-1.1.1.tgz", + "integrity": "sha512-6Vo1fPIB1vQFWBA/MR6JAA16XuQuhwvZRbSjYEq++m4QV33iqjGS2HcVIRfJGX+fomd5eiz6bwkVZcKm69zQPw==", + "requires": { + "binary-search-bounds": "^2.0.4", + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "glslify": "^7.0.0", + "iota-array": "^1.0.0", + "typedarray-pool": "^1.2.0" + } + }, + "gl-line3d": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/gl-line3d/-/gl-line3d-1.2.1.tgz", + "integrity": "sha512-eeb0+RI2ZBRqMYJK85SgsRiJK7c4aiOjcnirxv0830A3jmOc99snY3AbPcV8KvKmW0Yaf3KA4e+qNCbHiTOTnA==", + "requires": { + "binary-search-bounds": "^2.0.4", + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "gl-texture2d": "^2.1.0", + "gl-vao": "^1.3.0", + "glsl-out-of-range": "^1.0.4", + "glslify": "^7.0.0", + "ndarray": "^1.0.18" + } + }, + "gl-mat3": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-mat3/-/gl-mat3-1.0.0.tgz", + "integrity": "sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI=" + }, + "gl-mat4": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", + "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" + }, + "gl-matrix": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", + "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" + }, + "gl-mesh3d": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/gl-mesh3d/-/gl-mesh3d-2.3.1.tgz", + "integrity": "sha512-pXECamyGgu4/9HeAQSE5OEUuLBGS1aq9V4BCsTcxsND4fNLaajEkYKUz/WY2QSYElqKdsMBVsldGiKRKwlybqA==", + "requires": { + "barycentric": "^1.0.1", + "colormap": "^2.3.1", + "gl-buffer": "^2.1.2", + "gl-mat4": "^1.2.0", + "gl-shader": "^4.2.1", + "gl-texture2d": "^2.1.0", + "gl-vao": "^1.3.0", + "glsl-out-of-range": "^1.0.4", + "glsl-specular-cook-torrance": "^2.0.1", + "glslify": "^7.0.0", + "ndarray": "^1.0.18", + "normals": "^1.1.0", + "polytope-closest-point": "^1.0.0", + "simplicial-complex-contour": "^1.0.2", + "typedarray-pool": "^1.1.0" + } + }, + "gl-plot2d": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/gl-plot2d/-/gl-plot2d-1.4.5.tgz", + "integrity": "sha512-6GmCN10SWtV+qHFQ1gjdnVubeHFVsm6P4zmo0HrPIl9TcdePCUHDlBKWAuE6XtFhiMKMj7R8rApOX8O8uXUYog==", + "requires": { + "binary-search-bounds": "^2.0.4", + "gl-buffer": "^2.1.2", + "gl-select-static": "^2.0.7", + "gl-shader": "^4.2.1", + "glsl-inverse": "^1.0.0", + "glslify": "^7.0.0", + "text-cache": "^4.2.2" + } + }, + "gl-plot3d": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-2.4.7.tgz", + "integrity": "sha512-mLDVWrl4Dj0O0druWyHUK5l7cBQrRIJRn2oROEgrRuOgbbrLAzsREKefwMO0bA0YqkiZMFMnV5VvPA9j57X5Xg==", + "requires": { + "3d-view": "^2.0.0", + "a-big-triangle": "^1.0.3", + "gl-axes3d": "^1.5.3", + "gl-fbo": "^2.0.5", + "gl-mat4": "^1.2.0", + "gl-select-static": "^2.0.7", + "gl-shader": "^4.2.1", + "gl-spikes3d": "^1.0.10", + "glslify": "^7.0.0", + "has-passive-events": "^1.0.0", + "is-mobile": "^2.2.1", + "mouse-change": "^1.4.0", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.2.0", + "ndarray": "^1.0.19", + "right-now": "^1.0.0" + } + }, + "gl-pointcloud2d": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/gl-pointcloud2d/-/gl-pointcloud2d-1.0.3.tgz", + "integrity": "sha512-OS2e1irvJXVRpg/GziXj10xrFJm9kkRfFoB6BLUvkjCQV7ZRNNcs2CD+YSK1r0gvMwTg2T3lfLM3UPwNtz+4Xw==", + "requires": { + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "glslify": "^7.0.0", + "typedarray-pool": "^1.1.0" + } + }, + "gl-quat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-quat/-/gl-quat-1.0.0.tgz", + "integrity": "sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU=", + "requires": { + "gl-mat3": "^1.0.0", + "gl-vec3": "^1.0.3", + "gl-vec4": "^1.0.0" + } + }, + "gl-scatter3d": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gl-scatter3d/-/gl-scatter3d-1.2.3.tgz", + "integrity": "sha512-nXqPlT1w5Qt51dTksj+DUqrZqwWAEWg0PocsKcoDnVNv0X8sGA+LBZ0Y+zrA+KNXUL0PPCX9WR9cF2uJAZl1Sw==", + "requires": { + "gl-buffer": "^2.1.2", + "gl-mat4": "^1.2.0", + "gl-shader": "^4.2.1", + "gl-vao": "^1.3.0", + "glsl-out-of-range": "^1.0.4", + "glslify": "^7.0.0", + "is-string-blank": "^1.0.1", + "typedarray-pool": "^1.1.0", + "vectorize-text": "^3.2.1" + } + }, + "gl-select-box": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gl-select-box/-/gl-select-box-1.0.4.tgz", + "integrity": "sha512-mKsCnglraSKyBbQiGq0Ila0WF+m6Tr+EWT2yfaMn/Sh9aMHq5Wt0F/l6Cf/Ed3CdERq5jHWAY5yxLviZteYu2w==", + "requires": { + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "glslify": "^7.0.0" + } + }, + "gl-select-static": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/gl-select-static/-/gl-select-static-2.0.7.tgz", + "integrity": "sha512-OvpYprd+ngl3liEatBTdXhSyNBjwvjMSvV2rN0KHpTU+BTi4viEETXNZXFgGXY37qARs0L28ybk3UQEW6C5Nnw==", + "requires": { + "bit-twiddle": "^1.0.2", + "gl-fbo": "^2.0.5", + "ndarray": "^1.0.18", + "typedarray-pool": "^1.1.0" + } + }, + "gl-shader": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/gl-shader/-/gl-shader-4.2.1.tgz", + "integrity": "sha1-vJuAjpKTxRtmjojeYVsMETcI3C8=", + "requires": { + "gl-format-compiler-error": "^1.0.2", + "weakmap-shim": "^1.1.0" + } + }, + "gl-spikes2d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/gl-spikes2d/-/gl-spikes2d-1.0.2.tgz", + "integrity": "sha512-QVeOZsi9nQuJJl7NB3132CCv5KA10BWxAY2QgJNsKqbLsG53B/TrGJpjIAohnJftdZ4fT6b3ZojWgeaXk8bOOA==" + }, + "gl-spikes3d": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/gl-spikes3d/-/gl-spikes3d-1.0.10.tgz", + "integrity": "sha512-lT3xroowOFxMvlhT5Mof76B2TE02l5zt/NIWljhczV2FFHgIVhA4jMrd5dIv1so1RXMBDJIKu0uJI3QKliDVLg==", + "requires": { + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "gl-vao": "^1.3.0", + "glslify": "^7.0.0" + } + }, + "gl-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-state/-/gl-state-1.0.0.tgz", + "integrity": "sha1-Ji+qdYNbC5xTLBLzitxCXR0wzRc=", + "requires": { + "uniq": "^1.0.0" + } + }, + "gl-streamtube3d": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/gl-streamtube3d/-/gl-streamtube3d-1.4.1.tgz", + "integrity": "sha512-rH02v00kgwgdpkXVo7KsSoPp38bIAYR9TE1iONjcQ4cQAlDhrGRauqT/P5sUaOIzs17A2DxWGcXM+EpNQs9pUA==", + "requires": { + "gl-cone3d": "^1.5.2", + "gl-vec3": "^1.1.3", + "gl-vec4": "^1.0.1", + "glsl-inverse": "^1.0.0", + "glsl-out-of-range": "^1.0.4", + "glsl-specular-cook-torrance": "^2.0.1", + "glslify": "^7.0.0" + } + }, + "gl-surface3d": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gl-surface3d/-/gl-surface3d-1.6.0.tgz", + "integrity": "sha512-x15+u4712ysnB85G55RLJEml6mOB4VaDn0VTlXCc9JcjRl5Es10Tk7lhGGyiPtkCfHwvhnkxzYA1/rHHYN7Y0A==", + "requires": { + "binary-search-bounds": "^2.0.4", + "bit-twiddle": "^1.0.2", + "colormap": "^2.3.1", + "dup": "^1.0.0", + "gl-buffer": "^2.1.2", + "gl-mat4": "^1.2.0", + "gl-shader": "^4.2.1", + "gl-texture2d": "^2.1.0", + "gl-vao": "^1.3.0", + "glsl-out-of-range": "^1.0.4", + "glsl-specular-beckmann": "^1.1.2", + "glslify": "^7.0.0", + "ndarray": "^1.0.18", + "ndarray-gradient": "^1.0.0", + "ndarray-ops": "^1.2.2", + "ndarray-pack": "^1.2.1", + "ndarray-scratch": "^1.2.0", + "surface-nets": "^1.0.2", + "typedarray-pool": "^1.1.0" + } + }, + "gl-text": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.1.8.tgz", + "integrity": "sha512-whnq9DEFYbW92C4ONwk2eT0YkzmVPHoADnEtuzMOmit87XhgAhBrNs3lK9EgGjU/MoWYvlF6RkI8Kl7Yuo1hUw==", + "requires": { + "bit-twiddle": "^1.0.2", + "color-normalize": "^1.5.0", + "css-font": "^1.2.0", + "detect-kerning": "^2.1.2", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "font-atlas": "^2.1.0", + "font-measure": "^1.2.2", + "gl-util": "^3.1.2", + "is-plain-obj": "^1.1.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "parse-unit": "^1.0.1", + "pick-by-alias": "^1.2.0", + "regl": "^1.3.11", + "to-px": "^1.0.1", + "typedarray-pool": "^1.1.0" + } + }, + "gl-texture2d": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gl-texture2d/-/gl-texture2d-2.1.0.tgz", + "integrity": "sha1-/2gk5+fDGoum/c2+nlxpXX4hh8c=", + "requires": { + "ndarray": "^1.0.15", + "ndarray-ops": "^1.2.2", + "typedarray-pool": "^1.1.0" + } + }, + "gl-util": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz", + "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==", + "requires": { + "is-browser": "^2.0.1", + "is-firefox": "^1.0.3", + "is-plain-obj": "^1.1.0", + "number-is-integer": "^1.0.1", + "object-assign": "^4.1.0", + "pick-by-alias": "^1.2.0", + "weak-map": "^1.0.5" + } + }, + "gl-vao": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/gl-vao/-/gl-vao-1.3.0.tgz", + "integrity": "sha1-6ekqqVWIyrnVwvBLaTRAw99pGSM=" + }, + "gl-vec3": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gl-vec3/-/gl-vec3-1.1.3.tgz", + "integrity": "sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw==" + }, + "gl-vec4": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gl-vec4/-/gl-vec4-1.0.1.tgz", + "integrity": "sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ=" + }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -4191,83 +5895,312 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q=", + "requires": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "glsl-inverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-inverse/-/glsl-inverse-1.0.0.tgz", + "integrity": "sha1-EsCx0GX1WERNHm/q95td34qRiuY=" + }, + "glsl-out-of-range": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/glsl-out-of-range/-/glsl-out-of-range-1.0.4.tgz", + "integrity": "sha512-fCcDu2LCQ39VBvfe1FbhuazXEf0CqMZI9OYXrYlL6uUARG48CTAbL04+tZBtVM0zo1Ljx4OLu2AxNquq++lxWQ==" + }, + "glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha1-iUvvc5ENeSyBtRQxgANdCnivdtM=", + "requires": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + }, + "dependencies": { + "resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha1-3ZV5gufnNt699TtYpN2RdUV13UY=" + }, + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=" + } + } + }, + "glsl-shader-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-shader-name/-/glsl-shader-name-1.0.0.tgz", + "integrity": "sha1-osMLO6c0mb77DMcYTXx3M91LSH0=", + "requires": { + "atob-lite": "^1.0.0", + "glsl-tokenizer": "^2.0.2" + } + }, + "glsl-specular-beckmann": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz", + "integrity": "sha1-/OkFaTPs3yRWJ4N2pU0IKJPndfE=" + }, + "glsl-specular-cook-torrance": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz", + "integrity": "sha1-qJHMBsjHtPRyhwK0gk/ay7ln148=", + "requires": { + "glsl-specular-beckmann": "^1.1.1" + } + }, + "glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8=" + }, + "glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha1-y4kqqVmTYjFyhHDU90AySJaX+p0=", + "requires": { + "glsl-tokenizer": "^2.0.0" + } + }, + "glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha1-I8XjDuK9JViEtKKLyFC495HpXYQ=" + }, + "glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY=", + "requires": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha1-4QFfWYDBCRgkraomJfHf3ovQADQ=" + }, + "glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4=" + }, + "glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E=" + }, + "glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha1-WUQdL4V958NEnJRWZgIezjWOSOw=" + }, + "glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA=" + }, + "glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "through2": "^0.6.3" }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "is-extglob": "^2.1.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } } } }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "glslify": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", + "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", + "requires": { + "bl": "^2.2.1", + "concat-stream": "^1.5.2", + "duplexify": "^3.4.5", + "falafel": "^2.1.0", + "from2": "^2.3.0", + "glsl-resolve": "0.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.2.5", + "minimist": "^1.2.5", + "resolve": "^1.1.5", + "stack-trace": "0.0.9", + "static-eval": "^2.0.5", + "through2": "^2.0.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, + "glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "requires": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" }, "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" } } }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "grid-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" }, "handle-thing": { "version": "2.0.0", @@ -4290,6 +6223,22 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-hover": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", + "integrity": "sha1-PZdDeusZnGK4rAisvcU9O8UsF/c=", + "requires": { + "is-browser": "^2.0.1" + } + }, + "has-passive-events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", + "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", + "requires": { + "is-browser": "^2.0.1" + } + }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", @@ -4394,12 +6343,26 @@ "wbuf": "^1.1.0" } }, + "hsluv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", + "integrity": "sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw=" + }, "html-entities": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", "dev": true }, + "html2canvas": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.1.4.tgz", + "integrity": "sha512-uHgQDwrXsRmFdnlOVFvHin9R7mdjjZvoBoXxicPR+NnucngkaLa5zIDW9fzMkiip0jSffyTyWedE8iVogYOeWg==", + "optional": true, + "requires": { + "css-line-break": "1.1.1" + } + }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -4459,6 +6422,11 @@ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" }, + "icheck": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/icheck/-/icheck-1.0.2.tgz", + "integrity": "sha1-BtCNo9R65EjBU7Jjm4bprX/fcSg=" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4468,11 +6436,16 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true + }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "iferr": { "version": "0.1.5", @@ -4486,6 +6459,21 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "image-palette": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/image-palette/-/image-palette-2.1.0.tgz", + "integrity": "sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ==", + "requires": { + "color-id": "^1.1.0", + "pxls": "^2.0.0", + "quantize": "^1.0.2" + } + }, + "image-size": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", + "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==" + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -4502,6 +6490,15 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "incremental-convex-hull": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz", + "integrity": "sha1-UUKMFMudmmFEv+abKFH7N3M0vh4=", + "requires": { + "robust-orientation": "^1.1.2", + "simplicial-complex": "^1.0.0" + } + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -4521,8 +6518,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", @@ -4530,6 +6526,11 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, + "inputmask": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/inputmask/-/inputmask-5.0.6.tgz", + "integrity": "sha512-/QjZuOEB7fJKMEu3xKL3LlycctMmK53Zr/fGSFtcjrfYxXks93iptutYowWNR1oUsHr2QIzy6V3MMYz07P2Cfw==" + }, "inquirer": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", @@ -4584,6 +6585,14 @@ "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, + "interval-tree-1d": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.4.tgz", + "integrity": "sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==", + "requires": { + "binary-search-bounds": "^2.0.0" + } + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -4598,6 +6607,16 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, + "invert-permutation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-permutation/-/invert-permutation-1.0.0.tgz", + "integrity": "sha1-oKeAQurbNrwXVR54fv0UOa3VSTM=" + }, + "iota-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", + "integrity": "sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc=" + }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -4642,6 +6661,11 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-base64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-0.1.0.tgz", + "integrity": "sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg==" + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -4651,11 +6675,20 @@ "binary-extensions": "^1.0.0" } }, + "is-blob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz", + "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==" + }, + "is-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", + "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { "version": "1.1.4", @@ -4720,6 +6753,21 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-firefox": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", + "integrity": "sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI=" + }, + "is-float-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-float-array/-/is-float-array-1.0.0.tgz", + "integrity": "sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ==" + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -4735,11 +6783,21 @@ "is-extglob": "^2.1.1" } }, + "is-iexplorer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", + "integrity": "sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY=" + }, "is-in-browser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" }, + "is-mobile": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.2.tgz", + "integrity": "sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg==" + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -4760,6 +6818,11 @@ } } }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, "is-path-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", @@ -4787,8 +6850,7 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { "version": "2.0.4", @@ -4825,6 +6887,16 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-string-blank": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", + "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==" + }, + "is-svg-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", + "integrity": "sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA=" + }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -4849,8 +6921,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -4863,6 +6934,24 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, + "jquery": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", + "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==" + }, + "jquery-bar-rating": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jquery-bar-rating/-/jquery-bar-rating-1.2.2.tgz", + "integrity": "sha1-lZTWYs/53rD+ezclEbskkqQ285I=", + "requires": { + "jquery": ">=1.7.2" + } + }, + "jquery-ui": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.tgz", + "integrity": "sha1-vLQEXI3QU5wTS8FIjN0+dop6nlE=" + }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -4931,6 +7020,28 @@ } } }, + "jspdf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.3.1.tgz", + "integrity": "sha512-1vp0USP1mQi1h7NKpwxjFgQkJ5ncZvtH858aLpycUc/M+r/RpWJT8PixAU7Cw/3fPd4fpC8eB/Bj42LnsR21YQ==", + "requires": { + "atob": "^2.1.2", + "btoa": "^1.2.1", + "canvg": "^3.0.6", + "core-js": "^3.6.0", + "dompurify": "^2.2.0", + "fflate": "^0.4.8", + "html2canvas": "^1.0.0-rc.5" + }, + "dependencies": { + "core-js": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.2.tgz", + "integrity": "sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q==", + "optional": true + } + } + }, "jss": { "version": "10.0.0-alpha.16", "resolved": "https://registry.npmjs.org/jss/-/jss-10.0.0-alpha.16.tgz", @@ -5016,6 +7127,11 @@ "array-includes": "^3.0.3" } }, + "kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -5028,6 +7144,11 @@ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, + "knockout": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.5.1.tgz", + "integrity": "sha512-wRJ9I4az0QcsH7A4v4l0enUpkS++MBx0BnL/68KaLzJg7x1qmbjSlwEoCNol7KTYZ+pmtI7Eh2J0Nu6/2Z5J/Q==" + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -5037,11 +7158,15 @@ "invert-kv": "^2.0.0" } }, + "lerp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lerp/-/lerp-1.0.3.tgz", + "integrity": "sha1-oYyJaPkXiW3hXM/MKNVaa3Med24=" + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -5188,6 +7313,24 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha1-63lhAxwPDo0AG/LVb6toXViCLzg=", + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1" + } + } + } + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -5197,6 +7340,80 @@ "object-visit": "^1.0.0" } }, + "mapbox-gl": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.10.1.tgz", + "integrity": "sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg==", + "requires": { + "@mapbox/geojson-rewind": "^0.5.0", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^1.5.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^1.1.1", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.2", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.2.1", + "grid-index": "^1.1.0", + "minimist": "^1.2.5", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.1", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "supercluster": "^7.0.0", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } + } + }, + "marching-simplex-table": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/marching-simplex-table/-/marching-simplex-table-1.0.0.tgz", + "integrity": "sha1-vBYlbg+Pm1WKqbKHL4gy2UM/Uuo=", + "requires": { + "convex-hull": "^1.0.3" + } + }, + "mat4-decompose": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-decompose/-/mat4-decompose-1.0.4.tgz", + "integrity": "sha1-ZetP451wh496RE60Yk1S9+frL68=", + "requires": { + "gl-mat4": "^1.0.1", + "gl-vec3": "^1.0.2" + } + }, + "mat4-interpolate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz", + "integrity": "sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q=", + "requires": { + "gl-mat4": "^1.0.1", + "gl-vec3": "^1.0.2", + "mat4-decompose": "^1.0.3", + "mat4-recompose": "^1.0.3", + "quat-slerp": "^1.0.0" + } + }, + "mat4-recompose": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-recompose/-/mat4-recompose-1.0.4.tgz", + "integrity": "sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0=", + "requires": { + "gl-mat4": "^1.0.1" + } + }, "material-table": { "version": "1.37.0", "resolved": "https://registry.npmjs.org/material-table/-/material-table-1.37.0.tgz", @@ -5214,6 +7431,22 @@ "react-double-scrollbar": "0.0.15" } }, + "math-log2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", + "integrity": "sha1-+4lBvl9evol55xjmJzsXjlhpRWU=" + }, + "matrix-camera-controller": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/matrix-camera-controller/-/matrix-camera-controller-2.1.4.tgz", + "integrity": "sha512-zsPGPONclrKSImNpqqKDTcqFpWLAIwMXEJtCde4IFPOw1dA9udzFg4HOFytOTosOFanchrx7+Hqq6glLATIxBA==", + "requires": { + "binary-search-bounds": "^2.0.0", + "gl-mat4": "^1.1.2", + "gl-vec3": "^1.0.3", + "mat4-interpolate": "^1.0.3" + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -5410,6 +7643,49 @@ "minimist": "0.0.8" } }, + "monotone-convex-hull-2d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz", + "integrity": "sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw=", + "requires": { + "robust-orientation": "^1.1.3" + } + }, + "mouse-change": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", + "integrity": "sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8=", + "requires": { + "mouse-event": "^1.0.0" + } + }, + "mouse-event": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", + "integrity": "sha1-s3ie23EJmX1aky0dAdqhVDpQFzI=" + }, + "mouse-event-offset": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", + "integrity": "sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ=" + }, + "mouse-wheel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", + "integrity": "sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w=", + "requires": { + "right-now": "^1.0.0", + "signum": "^1.0.0", + "to-px": "^1.0.1" + }, + "dependencies": { + "signum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" + } + } + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -5446,12 +7722,30 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, + "mumath": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/mumath/-/mumath-3.3.4.tgz", + "integrity": "sha1-SNSg8P2MrU57Mglu6JsWGmPTC78=", + "requires": { + "almost-equal": "^1.1.0" + } + }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" + }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "muuri": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/muuri/-/muuri-0.8.0.tgz", + "integrity": "sha512-uqTi91q6mEKfHNHutlcDu3dS8/DXnxoWFh6fhUVJr426yaO4G/p2/LMoOeFb5Tl1hWzx7qoxl2v9RTJVFuskpQ==" + }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -5459,6 +7753,12 @@ "dev": true, "optional": true }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -5484,6 +7784,72 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "ndarray": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", + "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==", + "requires": { + "iota-array": "^1.0.0", + "is-buffer": "^1.0.2" + } + }, + "ndarray-extract-contour": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ndarray-extract-contour/-/ndarray-extract-contour-1.0.1.tgz", + "integrity": "sha1-Cu4ROjozsia5DEiIz4d79HUTBeQ=", + "requires": { + "typedarray-pool": "^1.0.0" + } + }, + "ndarray-gradient": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ndarray-gradient/-/ndarray-gradient-1.0.0.tgz", + "integrity": "sha1-t0kaUVxqZJ8ZpiMk//byf8jCU5M=", + "requires": { + "cwise-compiler": "^1.0.0", + "dup": "^1.0.0" + } + }, + "ndarray-linear-interpolate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ndarray-linear-interpolate/-/ndarray-linear-interpolate-1.0.0.tgz", + "integrity": "sha1-eLySuFuavBW25n7mWCj54hN65ys=" + }, + "ndarray-ops": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ndarray-ops/-/ndarray-ops-1.2.2.tgz", + "integrity": "sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4=", + "requires": { + "cwise-compiler": "^1.0.0" + } + }, + "ndarray-pack": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz", + "integrity": "sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo=", + "requires": { + "cwise-compiler": "^1.1.2", + "ndarray": "^1.0.13" + } + }, + "ndarray-scratch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ndarray-scratch/-/ndarray-scratch-1.2.0.tgz", + "integrity": "sha1-YwRjbWLrqT20cnrBPGkzQdulDgE=", + "requires": { + "ndarray": "^1.0.14", + "ndarray-ops": "^1.2.1", + "typedarray-pool": "^1.0.2" + } + }, + "ndarray-sort": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ndarray-sort/-/ndarray-sort-1.0.1.tgz", + "integrity": "sha1-/qBbTLg0x/TgIWo1TzynUTAN/Wo=", + "requires": { + "typedarray-pool": "^1.0.0" + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -5496,6 +7862,19 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nextafter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nextafter/-/nextafter-1.0.0.tgz", + "integrity": "sha1-t9d7U1MQ4+CX5gJauwqQNHfsGjo=", + "requires": { + "double-bits": "^1.1.0" + } + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -5579,6 +7958,21 @@ "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz", "integrity": "sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg==" }, + "normalize-svg-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", + "integrity": "sha1-RWNg5g7Odfvve11+FgSA5//Rb+U=" + }, + "normals": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normals/-/normals-1.1.0.tgz", + "integrity": "sha1-MltZXtNK/kZ6bFWhT9kIV4f/WcA=" + }, + "nouislider": { + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-14.7.0.tgz", + "integrity": "sha512-4RtQ1+LHJKesDCNJrXkQcwXAWCrC2aggdLYMstS/G5fEWL+fXZbUA9pwVNHFghMGuFGRATlDLNInRaPeRKzpFQ==" + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -5588,12 +7982,25 @@ "path-key": "^2.0.0" } }, + "number-is-integer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", + "integrity": "sha1-5ZvKFy/+0nMY55x862y3LAlbIVI=", + "requires": { + "is-finite": "^1.0.1" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "numeric": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/numeric/-/numeric-1.2.6.tgz", + "integrity": "sha1-dlsCvvl5iPz4gNTrPza4D6MTNao=" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5633,8 +8040,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", @@ -5679,7 +8085,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -5706,7 +8111,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", @@ -5716,6 +8120,15 @@ "wordwrap": "~1.0.0" } }, + "orbit-camera-controller": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz", + "integrity": "sha1-bis28OeHhmPDMPUNqbfOaGwncAU=", + "requires": { + "filtered-vector": "^1.2.1", + "gl-mat4": "^1.0.3" + } + }, "original": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", @@ -5813,6 +8226,14 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "pad-left": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-1.0.2.tgz", + "integrity": "sha1-GeVzXqmDlaJs7carkm6tEPMQDUw=", + "requires": { + "repeat-string": "^1.3.0" + } + }, "pako": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", @@ -5830,6 +8251,11 @@ "readable-stream": "^2.1.5" } }, + "parenthesis": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.7.tgz", + "integrity": "sha512-iMtu+HCbLXVrpf6Ys/4YKhcFxbux3xK4ZVB9r+a2kMSqeeQWQoDNYlXIsOjwlT2ldYXZ3k5PVeBnYn7fbAo/Bg==" + }, "parse-asn1": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", @@ -5859,6 +8285,19 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parse-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", + "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", + "requires": { + "pick-by-alias": "^1.2.0" + } + }, + "parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha1-en7A0esG+lMlx9PgCbhZoJtdSes=" + }, "parse-unit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", @@ -5915,8 +8354,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { "version": "0.1.7", @@ -5941,6 +8379,15 @@ } } }, + "pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + } + }, "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", @@ -5954,6 +8401,33 @@ "sha.js": "^2.4.8" } }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "permutation-parity": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/permutation-parity/-/permutation-parity-1.0.0.tgz", + "integrity": "sha1-AXTVH8pwSxG5pLFSsj1Tf9xrXvQ=", + "requires": { + "typedarray-pool": "^1.0.0" + } + }, + "permutation-rank": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/permutation-rank/-/permutation-rank-1.0.0.tgz", + "integrity": "sha1-n9mLvOzwj79ZlLXq3JSmLmeUg7U=", + "requires": { + "invert-permutation": "^1.0.0", + "typedarray-pool": "^1.0.0" + } + }, + "pick-by-alias": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", + "integrity": "sha1-X3yysfIabh6ISgyHhVqko3NhEHs=" + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -5984,12 +8458,134 @@ "find-up": "^3.0.0" } }, + "planar-dual": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/planar-dual/-/planar-dual-1.0.2.tgz", + "integrity": "sha1-tqQjVSOxsMt55fkm+OozXdmC1WM=", + "requires": { + "compare-angle": "^1.0.0", + "dup": "^1.0.0" + } + }, + "planar-graph-to-polyline": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.6.tgz", + "integrity": "sha512-h8a9kdAjo7mRhC0X6HZ42xzFp7vKDZA+Hygyhsq/08Qi4vVAQYJaLLYLvKUUzRbVKvdYqq0reXHyV0EygyEBHA==", + "requires": { + "edges-to-adjacency-list": "^1.0.0", + "planar-dual": "^1.0.0", + "point-in-big-polygon": "^2.0.1", + "robust-orientation": "^1.0.1", + "robust-sum": "^1.0.0", + "two-product": "^1.0.0", + "uniq": "^1.0.0" + } + }, + "plotly.js": { + "version": "1.57.1", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.57.1.tgz", + "integrity": "sha512-23GlzClmOGT1lE86Ys0DLuxBM/fgRNzJqH9y7ZylO4VPwstPAlQd12DklXsuqOgCNSxnnWUaP+J7BaUOFplsUg==", + "requires": { + "@plotly/d3-sankey": "0.7.2", + "@plotly/d3-sankey-circular": "0.33.1", + "@plotly/point-cluster": "^3.1.9", + "@turf/area": "^6.0.1", + "@turf/bbox": "^6.0.1", + "@turf/centroid": "^6.0.2", + "alpha-shape": "^1.0.0", + "canvas-fit": "^1.5.0", + "color-alpha": "1.0.4", + "color-normalize": "1.5.0", + "color-parse": "1.3.8", + "color-rgba": "2.1.1", + "convex-hull": "^1.0.3", + "country-regex": "^1.1.0", + "d3": "^3.5.17", + "d3-force": "^1.2.1", + "d3-hierarchy": "^1.1.9", + "d3-interpolate": "^1.4.0", + "d3-time-format": "^2.2.3", + "delaunay-triangulate": "^1.1.6", + "es6-promise": "^4.2.8", + "fast-isnumeric": "^1.1.4", + "gl-cone3d": "^1.5.2", + "gl-contour2d": "^1.1.7", + "gl-error3d": "^1.0.16", + "gl-heatmap2d": "^1.1.0", + "gl-line3d": "1.2.1", + "gl-mat4": "^1.2.0", + "gl-mesh3d": "^2.3.1", + "gl-plot2d": "^1.4.5", + "gl-plot3d": "^2.4.6", + "gl-pointcloud2d": "^1.0.3", + "gl-scatter3d": "^1.2.3", + "gl-select-box": "^1.0.4", + "gl-spikes2d": "^1.0.2", + "gl-streamtube3d": "^1.4.1", + "gl-surface3d": "^1.6.0", + "gl-text": "^1.1.8", + "glslify": "^7.1.1", + "has-hover": "^1.0.1", + "has-passive-events": "^1.0.0", + "image-size": "^0.7.5", + "is-mobile": "^2.2.2", + "mapbox-gl": "1.10.1", + "matrix-camera-controller": "^2.1.3", + "mouse-change": "^1.4.0", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.2.0", + "ndarray": "^1.0.19", + "ndarray-linear-interpolate": "^1.0.0", + "parse-svg-path": "^0.1.2", + "polybooljs": "^1.2.0", + "regl": "^1.6.1", + "regl-error2d": "^2.0.11", + "regl-line2d": "^3.0.18", + "regl-scatter2d": "^3.2.1", + "regl-splom": "^1.0.12", + "right-now": "^1.0.0", + "robust-orientation": "^1.1.3", + "sane-topojson": "^4.0.0", + "strongly-connected-components": "^1.0.1", + "superscript-text": "^1.0.0", + "svg-path-sdf": "^1.1.3", + "tinycolor2": "^1.4.2", + "to-px": "1.0.1", + "topojson-client": "^3.1.0", + "webgl-context": "^2.2.0", + "world-calendars": "^1.0.3" + } + }, "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, + "point-in-big-polygon": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/point-in-big-polygon/-/point-in-big-polygon-2.0.1.tgz", + "integrity": "sha512-DtrN8pa2VfMlvmWlCcypTFeBE4+OYz1ojDNJLKCWa4doiVAD6PRBbxFYAT71tsp5oKaRXT5sxEiHCAQKb1zr2Q==", + "requires": { + "binary-search-bounds": "^2.0.0", + "interval-tree-1d": "^1.0.1", + "robust-orientation": "^1.1.3", + "slab-decomposition": "^1.0.1" + } + }, + "polybooljs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.0.tgz", + "integrity": "sha1-tDkMLgedTCYtOyUExiiNlbp6R1g=" + }, + "polytope-closest-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz", + "integrity": "sha1-5uV/QIGrXox3i4Ee8G4sSK4zjD8=", + "requires": { + "numeric": "^1.2.6" + } + }, "popper.js": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz", @@ -6012,11 +8608,82 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "postcss": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", + "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "potpack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.1.tgz", + "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "pretty-checkbox": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pretty-checkbox/-/pretty-checkbox-3.0.3.tgz", + "integrity": "sha1-1JyAE6j8CO4MLW695FNGS/28Qo4=" }, "private": { "version": "0.1.8", @@ -6033,8 +8700,7 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { "version": "2.0.3", @@ -6058,6 +8724,11 @@ "react-is": "^16.8.1" } }, + "protocol-buffers-schema": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.5.1.tgz", + "integrity": "sha512-YVCvdhxWNDP8/nJDyXLuM+UFsuPk4+1PB7WGPVDzm3HTHbzFLxQYeW2iZpS4mmnXrQJGBzt230t/BbEb7PrQaw==" + }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -6127,12 +8798,45 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "pxls": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/pxls/-/pxls-2.3.2.tgz", + "integrity": "sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw==", + "requires": { + "arr-flatten": "^1.1.0", + "compute-dims": "^1.1.0", + "flip-pixels": "^1.0.2", + "is-browser": "^2.1.0", + "is-buffer": "^2.0.3", + "to-uint8": "^1.4.1" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + } + } + }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true }, + "quantize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz", + "integrity": "sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4=" + }, + "quat-slerp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/quat-slerp/-/quat-slerp-1.0.1.tgz", + "integrity": "sha1-K6oVzjprvcMkHZcusXKDE57Wnyk=", + "requires": { + "gl-quat": "^1.0.0" + } + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -6151,6 +8855,19 @@ "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, "raf-schd": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.0.tgz", @@ -6181,6 +8898,14 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, + "rat-vec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/rat-vec/-/rat-vec-1.1.1.tgz", + "integrity": "sha1-Dd4rZrezS7G80qI4BerIBth/0X8=", + "requires": { + "big-rat": "^1.0.3" + } + }, "raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", @@ -6353,7 +9078,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -6375,6 +9099,21 @@ "readable-stream": "^2.0.2" } }, + "recordrtc": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/recordrtc/-/recordrtc-5.6.2.tgz", + "integrity": "sha512-1QNKKNtl7+KcwD1lyOgP3ZlbiJ1d0HtXnypUy7yq49xEERxk31PHvE9RCciDrulPCY7WJ+oz0R9hpNxgsIurGQ==" + }, + "reduce-simplicial-complex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz", + "integrity": "sha1-dNaWovg196bc2SBl/YxRgfLt+Lw=", + "requires": { + "cell-orientation": "^1.0.1", + "compare-cell": "^1.0.0", + "compare-oriented-cell": "^1.0.1" + } + }, "redux": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz", @@ -6423,6 +9162,11 @@ "safe-regex": "^1.1.0" } }, + "regex-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regex-regex/-/regex-regex-1.0.0.tgz", + "integrity": "sha1-kEih6uuHD01IDavHb8Qs3MC8OnI=" + }, "regexp-tree": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.10.tgz", @@ -6472,6 +9216,82 @@ } } }, + "regl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/regl/-/regl-1.7.0.tgz", + "integrity": "sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w==" + }, + "regl-error2d": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", + "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", + "requires": { + "array-bounds": "^1.0.1", + "color-normalize": "^1.5.0", + "flatten-vertex-data": "^1.0.2", + "object-assign": "^4.1.1", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "regl-line2d": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.1.tgz", + "integrity": "sha512-oxtdSNv2daqwOi72EpaT9WRtvA/DOAq9D/icNBs1fZviPSnC/6O85UgPpAuTguj+ri0n/e9+FDbqauYg+l+uqA==", + "requires": { + "array-bounds": "^1.0.1", + "array-find-index": "^1.0.2", + "array-normalize": "^1.1.4", + "color-normalize": "^1.5.0", + "earcut": "^2.1.5", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "glslify": "^7.0.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0" + } + }, + "regl-scatter2d": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.2.6.tgz", + "integrity": "sha512-ElPlu6jIx1Par4pG8OIhBuw5F5d+5qynYIlx4lMgikzkRtBgN5hjB3nfEp6jsMm4INPM367fs5vn6XcHD/s0Ow==", + "requires": { + "@plotly/point-cluster": "^3.1.9", + "array-range": "^1.0.1", + "array-rearrange": "^2.2.2", + "clamp": "^1.0.1", + "color-id": "^1.1.0", + "color-normalize": "^1.5.0", + "color-rgba": "^2.1.1", + "flatten-vertex-data": "^1.0.2", + "glslify": "^7.0.0", + "image-palette": "^2.1.0", + "is-iexplorer": "^1.0.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.1.0", + "update-diff": "^1.1.0" + } + }, + "regl-splom": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", + "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", + "requires": { + "array-bounds": "^1.0.1", + "array-range": "^1.0.1", + "color-alpha": "^1.0.4", + "flatten-vertex-data": "^1.0.2", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "raf": "^3.4.1", + "regl-scatter2d": "^3.2.3" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -6487,8 +9307,7 @@ "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "require-directory": { "version": "2.1.1", @@ -6522,7 +9341,6 @@ "version": "1.11.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -6560,6 +9378,14 @@ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -6582,6 +9408,12 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "rgbcolor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0=", + "optional": true + }, "rifm": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.7.0.tgz", @@ -6590,6 +9422,11 @@ "@babel/runtime": "^7.3.1" } }, + "right-now": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", + "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" + }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -6609,6 +9446,97 @@ "inherits": "^2.0.1" } }, + "robust-compress": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-compress/-/robust-compress-1.0.0.tgz", + "integrity": "sha1-TPYsSzGNgwhRYBK7jBF1Lzkymxs=" + }, + "robust-determinant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/robust-determinant/-/robust-determinant-1.1.0.tgz", + "integrity": "sha1-jsrnm3nKqz509t6+IjflORon6cc=", + "requires": { + "robust-compress": "^1.0.0", + "robust-scale": "^1.0.0", + "robust-sum": "^1.0.0", + "two-product": "^1.0.0" + } + }, + "robust-dot-product": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-dot-product/-/robust-dot-product-1.0.0.tgz", + "integrity": "sha1-yboBeL0sMEv9cl9Y6Inx2UYARVM=", + "requires": { + "robust-sum": "^1.0.0", + "two-product": "^1.0.0" + } + }, + "robust-in-sphere": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/robust-in-sphere/-/robust-in-sphere-1.1.3.tgz", + "integrity": "sha1-HFiD0WpOkjkpR27zSBmFe/Kpz3U=", + "requires": { + "robust-scale": "^1.0.0", + "robust-subtract": "^1.0.0", + "robust-sum": "^1.0.0", + "two-product": "^1.0.0" + } + }, + "robust-linear-solve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-linear-solve/-/robust-linear-solve-1.0.0.tgz", + "integrity": "sha1-DNasUEBpGm8qo81jEdcokFyjofE=", + "requires": { + "robust-determinant": "^1.1.0" + } + }, + "robust-orientation": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/robust-orientation/-/robust-orientation-1.1.3.tgz", + "integrity": "sha1-2v9bANO+TmByLw6cAVbvln8cIEk=", + "requires": { + "robust-scale": "^1.0.2", + "robust-subtract": "^1.0.0", + "robust-sum": "^1.0.0", + "two-product": "^1.0.2" + } + }, + "robust-product": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-product/-/robust-product-1.0.0.tgz", + "integrity": "sha1-aFJQAHzbunzx3nW/9tKScBEJir4=", + "requires": { + "robust-scale": "^1.0.0", + "robust-sum": "^1.0.0" + } + }, + "robust-scale": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/robust-scale/-/robust-scale-1.0.2.tgz", + "integrity": "sha1-d1Ey7QlULQKOWLLMecBikLz3jDI=", + "requires": { + "two-product": "^1.0.2", + "two-sum": "^1.0.0" + } + }, + "robust-segment-intersect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/robust-segment-intersect/-/robust-segment-intersect-1.0.1.tgz", + "integrity": "sha1-MlK2oPwboUreaRXMvgnLzpqrHBw=", + "requires": { + "robust-orientation": "^1.1.3" + } + }, + "robust-subtract": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-subtract/-/robust-subtract-1.0.0.tgz", + "integrity": "sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo=" + }, + "robust-sum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-sum/-/robust-sum-1.0.0.tgz", + "integrity": "sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k=" + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -6627,6 +9555,11 @@ "aproba": "^1.1.1" } }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, "rxjs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", @@ -6639,8 +9572,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -6657,6 +9589,11 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sane-topojson": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sane-topojson/-/sane-topojson-4.0.0.tgz", + "integrity": "sha512-bJILrpBboQfabG3BNnHI2hZl52pbt80BE09u4WhnrmzuF2JbMKZdl62G5glXskJ46p+gxE2IzOwGj/awR4g8AA==" + }, "scheduler": { "version": "0.13.6", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", @@ -6684,6 +9621,11 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, + "select2": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.13.tgz", + "integrity": "sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw==" + }, "selfsigned": { "version": "1.10.4", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", @@ -6832,27 +9774,106 @@ "safe-buffer": "^5.0.1" } }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "signum": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-0.0.0.tgz", + "integrity": "sha1-q1UbEAM1EHCnBHg/GgnF52kfnPY=" + }, + "simplicial-complex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simplicial-complex/-/simplicial-complex-1.0.0.tgz", + "integrity": "sha1-bDOk7Wn81Nkbe8rdOzC2NoPq4kE=", + "requires": { + "bit-twiddle": "^1.0.0", + "union-find": "^1.0.0" + } + }, + "simplicial-complex-boundary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simplicial-complex-boundary/-/simplicial-complex-boundary-1.0.1.tgz", + "integrity": "sha1-csn/HiTeqjdMm7L6DL8MCB6++BU=", + "requires": { + "boundary-cells": "^2.0.0", + "reduce-simplicial-complex": "^1.0.0" + } + }, + "simplicial-complex-contour": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/simplicial-complex-contour/-/simplicial-complex-contour-1.0.2.tgz", + "integrity": "sha1-iQqsrChDZTQBEFRc8mKaJuBL+dE=", + "requires": { + "marching-simplex-table": "^1.0.0", + "ndarray": "^1.0.15", + "ndarray-sort": "^1.0.0", + "typedarray-pool": "^1.1.0" + } + }, + "simplify-planar-graph": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/simplify-planar-graph/-/simplify-planar-graph-2.0.1.tgz", + "integrity": "sha1-vIWJNyXzLo+oriVoE5hEbSy892Y=", + "requires": { + "robust-orientation": "^1.0.1", + "simplicial-complex": "^0.3.3" + }, + "dependencies": { + "bit-twiddle": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-0.0.2.tgz", + "integrity": "sha1-wurruVKjuUrMFASX4c3NLxoz9Y4=" + }, + "simplicial-complex": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/simplicial-complex/-/simplicial-complex-0.3.3.tgz", + "integrity": "sha1-TDDK1X+eRXKd2PMGyHU1efRr6Z4=", + "requires": { + "bit-twiddle": "~0.0.1", + "union-find": "~0.0.3" + } + }, + "union-find": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/union-find/-/union-find-0.0.4.tgz", + "integrity": "sha1-uFSzMBYZva0USwAUx4+W6sDS8PY=" + } + } + }, + "slab-decomposition": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/slab-decomposition/-/slab-decomposition-1.0.3.tgz", + "integrity": "sha512-1EfR304JHvX9vYQkUi4AKqN62mLsjk6W45xTk/TxwN8zd3HGwS7PVj9zj0I6fgCZqfGlimDEY+RzzASHn97ZmQ==", "requires": { - "shebang-regex": "^1.0.0" + "binary-search-bounds": "^2.0.0", + "functional-red-black-tree": "^1.0.0", + "robust-orientation": "^1.1.3" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -7027,6 +10048,11 @@ } } }, + "sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==" + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -7039,6 +10065,12 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true + }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", @@ -7180,6 +10212,15 @@ } } }, + "split-polygon": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split-polygon/-/split-polygon-1.0.0.tgz", + "integrity": "sha1-DqzIoTanaxKj2VJW6n2kXbDC0kc=", + "requires": { + "robust-dot-product": "^1.0.0", + "robust-sum": "^1.0.0" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -7192,8 +10233,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "ssri": { "version": "6.0.1", @@ -7204,6 +10244,25 @@ "figgy-pudding": "^3.5.1" } }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + }, + "stackblur-canvas": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.5.0.tgz", + "integrity": "sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==", + "optional": true + }, + "static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "requires": { + "escodegen": "^1.11.1" + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -7267,8 +10326,31 @@ "stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "string-split-by": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", + "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", + "requires": { + "parenthesis": "^3.1.5" + } + }, + "string-to-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz", + "integrity": "sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q==", + "requires": { + "atob-lite": "^2.0.0", + "is-base64": "^0.1.0" + }, + "dependencies": { + "atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=" + } + } }, "string-width": { "version": "2.1.1", @@ -7284,7 +10366,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -7316,6 +10397,103 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "strongly-connected-components": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", + "integrity": "sha1-CSDitN9nyOrulsa2I0/inoc9upk=" + }, + "style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "supercluster": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.3.tgz", + "integrity": "sha512-7+bR4FbF5SYsmkHfDp61QiwCKtwNDyPsddk9TzfsDA5DQr5Goii5CVD2SXjglweFCxjrzVZf945ahqYfUIk8UA==", + "requires": { + "kdbush": "^3.0.0" + } + }, + "superscript-text": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", + "integrity": "sha1-58snUlZzYN9QvrBhDOjfPXHY39g=" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -7325,6 +10503,141 @@ "has-flag": "^3.0.0" } }, + "surface-nets": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/surface-nets/-/surface-nets-1.0.2.tgz", + "integrity": "sha1-5DPIy7qUpydMb0yZVStGG/H8eks=", + "requires": { + "ndarray-extract-contour": "^1.0.0", + "triangulate-hypercube": "^1.0.0", + "zero-crossings": "^1.0.0" + } + }, + "survey-analytics": { + "version": "1.8.58", + "resolved": "https://registry.npmjs.org/survey-analytics/-/survey-analytics-1.8.58.tgz", + "integrity": "sha512-nXkLEq2VxQS1mizBnkjDEYi86WG3ExcAb78ZKzdFOcAF7v/5Qqq192znyuYEAJJScqUmpAR2hn+8OhYd+yX82A==", + "requires": { + "datatables.net": "^1.10.20", + "datatables.net-buttons": "^1.6.0", + "datatables.net-buttons-dt": "^1.6.0", + "datatables.net-colreorder": "^1.5.2", + "datatables.net-colreorder-dt": "^1.5.2", + "datatables.net-dt": "^1.10.20", + "datatables.net-responsive": "^2.2.3", + "datatables.net-responsive-dt": "^2.2.3", + "datatables.net-rowgroup": "^1.1.1", + "datatables.net-rowgroup-dt": "^1.1.1", + "datatables.net-select": "^1.3.1", + "datatables.net-select-dt": "^1.3.1", + "jquery": "3.5.0", + "muuri": "^0.8.0", + "plotly.js": "1.57.1", + "survey-core": "^1.8.34", + "tabulator-tables": "4.8.4", + "wordcloud": "^1.1.0" + } + }, + "survey-core": { + "version": "1.8.58", + "resolved": "https://registry.npmjs.org/survey-core/-/survey-core-1.8.58.tgz", + "integrity": "sha512-fwM6r2t5GzA1FlXgdQqBg708fHoeIDS33/Zwl3KQxQkSRJImDPfDv+rLSmL/lMcN3TfAU5gpSQYs1904AYm8oQ==" + }, + "survey-creator": { + "version": "1.8.58", + "resolved": "https://registry.npmjs.org/survey-creator/-/survey-creator-1.8.58.tgz", + "integrity": "sha512-jBX9hTH2kD05N+puJ10Z8KmWOwcfadqcxkpVW/ByJO0UncobQiGz/i7ZjhLkNjt18qymxReiaveCSLLbPDPzTg==", + "requires": { + "knockout": "^3.5.0", + "survey-knockout": "^1.8.58" + } + }, + "survey-knockout": { + "version": "1.8.58", + "resolved": "https://registry.npmjs.org/survey-knockout/-/survey-knockout-1.8.58.tgz", + "integrity": "sha512-6t2Ip50srn9x1Ax9ScqMtzah/n/jWnee8D92e0oKLN3F1nlq4ClmwQFblAY6mhS/rx4iVPc1RhURp4f5s3a5JQ==", + "requires": { + "knockout": "^3.5.1" + } + }, + "survey-pdf": { + "version": "1.8.58", + "resolved": "https://registry.npmjs.org/survey-pdf/-/survey-pdf-1.8.58.tgz", + "integrity": "sha512-f6RX1n1HAOuQLTbK5J/x50IkwudY9673xgxT6z4lYe+GGjMrZPw8qzC2h8wMcKmtizq45CPeoM13PVrDkG8cOw==", + "requires": { + "jspdf": "^2.3.0", + "survey-core": "^1.8.29" + } + }, + "survey-react": { + "version": "1.8.58", + "resolved": "https://registry.npmjs.org/survey-react/-/survey-react-1.8.58.tgz", + "integrity": "sha512-0XEcyuGsYgrW6sbbO8okcofn6yvzGAjO9YaiNbUtuzNzht/Fpfzu32/3sq5CoRP28Y8FMixdX/bQ3ygaI1f9DA==" + }, + "surveyjs-widgets": { + "version": "1.8.58", + "resolved": "https://registry.npmjs.org/surveyjs-widgets/-/surveyjs-widgets-1.8.58.tgz", + "integrity": "sha512-PGHsk/ob0rY6vGbX0Hv0zJ5bFGaisJxPjo24TVkZCmom5KFM9FfyKb4uUj9usdEiYdMBA5dgprc4aij7/UMzfg==", + "requires": { + "bootstrap-slider": "^10.0.0", + "easy-autocomplete": "^1.3.5", + "emotion-ratings": "^2.0.1", + "icheck": "^1.0.2", + "inputmask": "^5.0.3", + "jquery": "^3.2.1", + "jquery-bar-rating": "^1.2.2", + "jquery-ui": "^1.12.1", + "nouislider": "^14.6.3", + "pretty-checkbox": "^3.0.3", + "recordrtc": "^5.4.6", + "select2": "^4.0.4", + "sortablejs": "^1.6.1" + } + }, + "svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==" + }, + "svg-path-bounds": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", + "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", + "requires": { + "abs-svg-path": "^0.1.1", + "is-svg-path": "^1.0.1", + "normalize-svg-path": "^1.0.0", + "parse-svg-path": "^0.1.2" + }, + "dependencies": { + "normalize-svg-path": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", + "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", + "requires": { + "svg-arc-to-cubic-bezier": "^3.0.0" + } + } + } + }, + "svg-path-sdf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", + "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", + "requires": { + "bitmap-sdf": "^1.0.0", + "draw-svg-path": "^1.0.0", + "is-svg-path": "^1.0.1", + "parse-svg-path": "^0.1.2", + "svg-path-bounds": "^1.0.1" + } + }, + "svg-pathdata": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-5.0.5.tgz", + "integrity": "sha512-TAAvLNSE3fEhyl/Da19JWfMAdhSXTYeviXsLSoDT1UM76ADj5ndwAPX1FKQEgB/gFMPavOy6tOqfalXKUiXrow==", + "optional": true + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -7370,6 +10683,11 @@ } } }, + "tabulator-tables": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/tabulator-tables/-/tabulator-tables-4.8.4.tgz", + "integrity": "sha512-sSs3GoWPF3/l/8m+WGUbmsLASkLVB3bB7RnW/4/g/zwOQoxM9pWdaeZE+Nk7UJjjb6K9fW3dfIQnozIfNpFATw==" + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -7421,6 +10739,14 @@ } } }, + "text-cache": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/text-cache/-/text-cache-4.2.2.tgz", + "integrity": "sha512-zky+UDYiX0a/aPw/YTBD+EzKMlCTu1chFuCMZeAkgoRiceySdROu1V2kJXhCbtEdBhiOviYnAdGiSYl58HW0ZQ==", + "requires": { + "vectorize-text": "^3.2.1" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -7437,7 +10763,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -7468,6 +10793,16 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.2.tgz", "integrity": "sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q==" }, + "tinycolor2": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", + "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" + }, + "tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -7477,6 +10812,16 @@ "os-tmpdir": "~1.0.2" } }, + "to-array-buffer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/to-array-buffer/-/to-array-buffer-3.2.0.tgz", + "integrity": "sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ==", + "requires": { + "flatten-vertex-data": "^1.0.2", + "is-blob": "^2.0.1", + "string-to-arraybuffer": "^1.0.0" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -7489,6 +10834,11 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, + "to-float32": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", + "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==" + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -7509,6 +10859,14 @@ } } }, + "to-px": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", + "integrity": "sha1-W7rtXl1PdkRbzJA8KTojB90yRkY=", + "requires": { + "parse-unit": "^1.0.1" + } + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -7531,12 +10889,50 @@ "repeat-string": "^1.6.1" } }, + "to-uint8": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/to-uint8/-/to-uint8-1.4.1.tgz", + "integrity": "sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg==", + "requires": { + "arr-flatten": "^1.1.0", + "clamp": "^1.0.1", + "is-base64": "^0.1.0", + "is-float-array": "^1.0.0", + "to-array-buffer": "^3.0.0" + } + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, + "topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "requires": { + "commander": "2" + } + }, + "triangulate-hypercube": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/triangulate-hypercube/-/triangulate-hypercube-1.0.1.tgz", + "integrity": "sha1-2Acdsuv8/VHzCNC88qXEils20Tc=", + "requires": { + "gamma": "^0.1.0", + "permutation-parity": "^1.0.0", + "permutation-rank": "^1.0.0" + } + }, + "triangulate-polyline": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz", + "integrity": "sha1-v4uod6hQVBA/65+lphtOjXAXgU0=", + "requires": { + "cdt2d": "^1.0.0" + } + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -7554,11 +10950,35 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "turntable-camera-controller": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz", + "integrity": "sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk=", + "requires": { + "filtered-vector": "^1.2.1", + "gl-mat4": "^1.0.2", + "gl-vec3": "^1.0.2" + } + }, + "two-product": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/two-product/-/two-product-1.0.2.tgz", + "integrity": "sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo=" + }, + "two-sum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/two-sum/-/two-sum-1.0.0.tgz", + "integrity": "sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, "requires": { "prelude-ls": "~1.1.2" } @@ -7573,11 +10993,24 @@ "mime-types": "~2.1.24" } }, + "type-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", + "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-pool": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", + "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", + "requires": { + "bit-twiddle": "^1.0.0", + "dup": "^1.0.0" + } }, "typescript": { "version": "3.4.5", @@ -7613,6 +11046,11 @@ "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", "dev": true }, + "union-find": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/union-find/-/union-find-1.0.2.tgz", + "integrity": "sha1-KSusQV5q06iVNdI3AQ20pTYoTlg=" + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -7648,6 +11086,11 @@ } } }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -7672,6 +11115,11 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -7718,6 +11166,11 @@ "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", "dev": true }, + "update-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", + "integrity": "sha1-9RAYLYHugZ+4LDprIrYrve2ngI8=" + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -7784,8 +11237,41 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-copy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/utils-copy/-/utils-copy-1.1.1.tgz", + "integrity": "sha1-biuXmCqozXPhGCo+b4vsPA9AWKc=", + "requires": { + "const-pinf-float64": "^1.0.0", + "object-keys": "^1.0.9", + "type-name": "^2.0.0", + "utils-copy-error": "^1.0.0", + "utils-indexof": "^1.0.0", + "utils-regex-from-string": "^1.0.0", + "validate.io-array": "^1.0.3", + "validate.io-buffer": "^1.0.1", + "validate.io-nonnegative-integer": "^1.0.0" + } + }, + "utils-copy-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-copy-error/-/utils-copy-error-1.0.1.tgz", + "integrity": "sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U=", + "requires": { + "object-keys": "^1.0.9", + "utils-copy": "^1.1.0" + } + }, + "utils-indexof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-indexof/-/utils-indexof-1.0.0.tgz", + "integrity": "sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w=", + "requires": { + "validate.io-array-like": "^1.0.1", + "validate.io-integer-primitive": "^1.0.0" + } }, "utils-merge": { "version": "1.0.1", @@ -7793,6 +11279,15 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "utils-regex-from-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz", + "integrity": "sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk=", + "requires": { + "regex-regex": "^1.0.0", + "validate.io-string-primitive": "^1.0.0" + } + }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -7815,12 +11310,102 @@ "spdx-expression-parse": "^3.0.0" } }, + "validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha1-W1osr9j4uFq7L4hroVPy2Tond00=" + }, + "validate.io-array-like": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz", + "integrity": "sha1-evn363tRcVvrIhVmjsXM5U+t21o=", + "requires": { + "const-max-uint32": "^1.0.2", + "validate.io-integer-primitive": "^1.0.0" + } + }, + "validate.io-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz", + "integrity": "sha1-hS1nNAIZFNXROvwyUxdh43IO1E4=" + }, + "validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg=", + "requires": { + "validate.io-number": "^1.0.3" + } + }, + "validate.io-integer-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz", + "integrity": "sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY=", + "requires": { + "validate.io-number-primitive": "^1.0.0" + } + }, + "validate.io-matrix-like": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz", + "integrity": "sha1-XsMqddCInaxzbepovdYUWxVe38M=" + }, + "validate.io-ndarray-like": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz", + "integrity": "sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk=" + }, + "validate.io-nonnegative-integer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz", + "integrity": "sha1-gGkkOgjF+Y6VQTySnf17GPP28p8=", + "requires": { + "validate.io-integer": "^1.0.5" + } + }, + "validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha1-9j/+2iSL8opnqNSODjtGGhZluvg=" + }, + "validate.io-number-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz", + "integrity": "sha1-0uAfICmJNp3PEVVElWQgOv5YTlU=" + }, + "validate.io-positive-integer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz", + "integrity": "sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI=", + "requires": { + "validate.io-integer": "^1.0.5" + } + }, + "validate.io-string-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz", + "integrity": "sha1-uBNbn7E3K94C/dU60dDM1t55j+4=" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "vectorize-text": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/vectorize-text/-/vectorize-text-3.2.1.tgz", + "integrity": "sha512-rGojF+D9BB96iPZPUitfq5kaiS6eCJmfEel0NXOK/MzZSuXGiwhoop80PtaDas9/Hg/oaox1tI9g3h93qpuspg==", + "requires": { + "cdt2d": "^1.0.0", + "clean-pslg": "^1.1.0", + "ndarray": "^1.0.11", + "planar-graph-to-polyline": "^1.0.0", + "simplify-planar-graph": "^2.0.1", + "surface-nets": "^1.0.0", + "triangulate-polyline": "^1.0.0" + } + }, "vlq": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.0.tgz", @@ -7836,6 +11421,16 @@ "indexof": "0.0.1" } }, + "vt-pbf": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", + "requires": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, "warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", @@ -7864,6 +11459,24 @@ "minimalistic-assert": "^1.0.0" } }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "weakmap-shim": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/weakmap-shim/-/weakmap-shim-1.1.1.tgz", + "integrity": "sha1-1lr9eEEJshZuAP9XHDMVDsKkC0k=" + }, + "webgl-context": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", + "integrity": "sha1-jzfXJXz23xzQpJ5qextyG5TMhqA=", + "requires": { + "get-canvas-context": "^1.0.1" + } + }, "webpack": { "version": "4.32.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.32.2.tgz", @@ -8103,11 +11716,15 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wordcloud": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/wordcloud/-/wordcloud-1.2.2.tgz", + "integrity": "sha512-fUnDsGrHXou+49j1OeKaC7nOeZPx+sWjIet0L/j6eAcm0nXy+a+AuUs/iDAX4PLBg1Zc6wgXWXhoXdQsXRWAEw==" + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "worker-farm": { "version": "1.7.0", @@ -8118,6 +11735,14 @@ "errno": "~0.1.7" } }, + "world-calendars": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", + "integrity": "sha1-slxQMrokEo/8QdCfr0pewbnBQzU=", + "requires": { + "object-assign": "^4.1.0" + } + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -8168,8 +11793,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", @@ -8183,8 +11807,7 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "4.0.0", @@ -8227,6 +11850,14 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "zero-crossings": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/zero-crossings/-/zero-crossings-1.0.1.tgz", + "integrity": "sha1-xWK9MRNkPzRDokXRJAa4i2m5qf8=", + "requires": { + "cwise-compiler": "^1.0.0" + } } } } diff --git a/Web/Resgrid.WebCore/Areas/User/Apps/package.json b/Web/Resgrid.WebCore/Areas/User/Apps/package.json index fb2ccabf..72bf517f 100644 --- a/Web/Resgrid.WebCore/Areas/User/Apps/package.json +++ b/Web/Resgrid.WebCore/Areas/User/Apps/package.json @@ -1,5 +1,5 @@ { - "name": "personnel-list", + "name": "resgrid-react", "version": "1.0.0", "main": "dist/index.js", "types": "types/index.d.ts", @@ -12,7 +12,9 @@ }, "scripts": { "buildPersonnelList": "webpack --config ./PersonnelList/webpack.config.js --mode production", - "buildPersonnelListDev": "webpack --config ./PersonnelList/webpack.config.js --mode development" + "buildPersonnelListDev": "webpack --config ./PersonnelList/webpack.config.js --mode development", + "buildNewForm": "webpack --config ./NewForm/webpack.config.js --mode production", + "buildNewFormDev": "webpack --config ./NewForm/webpack.config.js --mode development" }, "devDependencies": { "@babel/cli": "7.1.2", @@ -26,6 +28,7 @@ "babel-loader": "^8.0.4", "babel-polyfill": "^6.26.0", "buble": "0.19.3", + "css-loader": "5.2.7", "eslint": "5.7.0", "eslint-config-defaults": "9.0.0", "eslint-config-standard": "12.0.0", @@ -34,8 +37,10 @@ "eslint-plugin-promise": "4.0.1", "eslint-plugin-react": "7.11.1", "eslint-plugin-standard": "4.0.0", + "file-loader": "^6.2.0", "react": "^16.8.6", "react-dom": "^16.8.6", + "style-loader": "2.0.0", "typescript": "^3.2.2", "webpack": "^4.27.1", "webpack-cli": "^3.1.2", @@ -44,6 +49,12 @@ "dependencies": { "@material-ui/core": "^4.0.1", "@material-ui/pickers": "^3.0.0", - "material-table": "^1.37.0" + "material-table": "^1.37.0", + "survey-analytics": "^1.8.58", + "survey-creator": "^1.8.58", + "survey-knockout": "^1.8.58", + "survey-pdf": "^1.8.58", + "survey-react": "^1.8.58", + "surveyjs-widgets": "^1.8.58" } } diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/ConnectController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/ConnectController.cs index 044dab92..2b63fbf4 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/ConnectController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/ConnectController.cs @@ -155,7 +155,7 @@ public async Task Profile(ProfileView model) if (!String.IsNullOrWhiteSpace(profile.What3Words) && (String.IsNullOrWhiteSpace(profile.Latitude) && String.IsNullOrWhiteSpace(profile.Longitude))) { - var result = _geoLocationProvider.GetCoordinatesFromW3W(profile.What3Words); + var result = await _geoLocationProvider.GetCoordinatesFromW3W(profile.What3Words); if (result != null) { profile.Latitude = result.Latitude.ToString(); diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/DepartmentController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/DepartmentController.cs index 79276946..b09cff3f 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/DepartmentController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/DepartmentController.cs @@ -331,7 +331,14 @@ public async Task Settings() [Authorize(Policy = ResgridResources.Department_Update)] public async Task Settings(DepartmentSettingsModel model, CancellationToken cancellationToken) { + var auditEvent = new AuditEvent(); + auditEvent.DepartmentId = DepartmentId; + auditEvent.UserId = UserId; + auditEvent.Type = AuditLogTypes.DepartmentSettingsChanged; + Department d = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + auditEvent.Before = d.CloneJsonToString(); + d.TimeZone = model.Department.TimeZone; d.Name = model.Department.Name; d.ManagingUserId = model.Department.ManagingUserId; @@ -433,14 +440,8 @@ public async Task Settings(DepartmentSettingsModel model, Cancell departmentAddress = await _addressService.SaveAddressAsync(departmentAddress, cancellationToken); d.AddressId = departmentAddress.AddressId; - var auditEvent = new AuditEvent(); - auditEvent.DepartmentId = DepartmentId; - auditEvent.UserId = UserId; - auditEvent.Type = AuditLogTypes.DepartmentSettingsChanged; - auditEvent.Before = d.CloneJson(); - await _departmentsService.UpdateDepartmentAsync(d, cancellationToken); - auditEvent.After = d; + auditEvent.After = d.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); model.Message = "Department settings save successful, you may have to log out and log back in for everything to take effect."; @@ -1189,7 +1190,7 @@ public async Task ProvisionDefaultNumberAsync(string country, str if (!await _limitsService.CanDepartmentProvisionNumberAsync(DepartmentId)) return RedirectToAction("Unauthorized", "Public", new { Area = "" }); - var numbers = _numbersService.GetAvailableNumbers(country, areaCode); + var numbers = await _numbersService.GetAvailableNumbers(country, areaCode); if (numbers.Count > 0) { diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/DispatchController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/DispatchController.cs index cf2452d2..401856ae 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/DispatchController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/DispatchController.cs @@ -31,6 +31,8 @@ using System.Threading; using System.Threading.Tasks; using System.Web; +using Resgrid.WebCore.Areas.User.Models.Dispatch; +using System.Text; namespace Resgrid.Web.Areas.User.Controllers { @@ -57,13 +59,14 @@ public class DispatchController : SecureBaseController private readonly ITemplatesService _templatesService; private readonly IPdfProvider _pdfProvider; private readonly IProtocolsService _protocolsService; + private readonly IFormsService _formsService; public DispatchController(IDepartmentsService departmentsService, IUsersService usersService, ICallsService callsService, IDepartmentGroupsService departmentGroupsService, ICommunicationService communicationService, IQueueService queueService, Model.Services.IAuthorizationService authorizationService, IWorkLogsService workLogsService, IGeoLocationProvider geoLocationProvider, IPersonnelRolesService personnelRolesService, IDepartmentSettingsService departmentSettingsService, IUserProfileService userProfileService, IUnitsService unitsService, IActionLogsService actionLogsService, IEventAggregator eventAggregator, ICustomStateService customStateService, - ITemplatesService templatesService, IPdfProvider pdfProvider, IProtocolsService protocolsService) + ITemplatesService templatesService, IPdfProvider pdfProvider, IProtocolsService protocolsService, IFormsService formsService) { _departmentsService = departmentsService; _usersService = usersService; @@ -84,6 +87,7 @@ public DispatchController(IDepartmentsService departmentsService, IUsersService _templatesService = templatesService; _pdfProvider = pdfProvider; _protocolsService = protocolsService; + _formsService = formsService; } #endregion Private Members and Constructors @@ -358,7 +362,7 @@ public async Task NewCall(NewCallView model, IFormCollection coll model.Call.CallSource = (int)CallSources.User; - if (!string.IsNullOrWhiteSpace(model.Call.GeoLocationData) && string.IsNullOrWhiteSpace(model.Call.Address)) + if (!string.IsNullOrWhiteSpace(model.Call.GeoLocationData) && model.Call.GeoLocationData.Length > 1 && string.IsNullOrWhiteSpace(model.Call.Address)) { try { @@ -796,7 +800,7 @@ public async Task AddArchivedCall(NewCallView model, IFormCollect model.Call.CallSource = (int)CallSources.User; - if (!string.IsNullOrWhiteSpace(model.Call.GeoLocationData) && string.IsNullOrWhiteSpace(model.Call.Address)) + if (!string.IsNullOrWhiteSpace(model.Call.GeoLocationData) && model.Call.GeoLocationData.Length > 1 && string.IsNullOrWhiteSpace(model.Call.Address)) { try { @@ -980,13 +984,14 @@ public async Task CallExportEx(string query) if (String.IsNullOrWhiteSpace(query)) Unauthorized(); + var decodedQuery = Encoding.UTF8.GetString(Convert.FromBase64String(query)).Trim(); - var decryptedQuery = SymmetricEncryption.Decrypt(query, Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase); + var decryptedQuery = SymmetricEncryption.Decrypt(decodedQuery, Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase); if (!decryptedQuery.Contains("|")) { // Legacy query, just the call id - var callId = SymmetricEncryption.Decrypt(query, Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase); + var callId = SymmetricEncryption.Decrypt(decodedQuery, Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase); if (String.IsNullOrWhiteSpace(callId)) Unauthorized(); @@ -997,14 +1002,13 @@ public async Task CallExportEx(string query) Unauthorized(); var model = new CallExportView(); - model.Call = call; + model.Call = await _callsService.PopulateCallData(call, true, true, true, true, true, true, true); model.CallLogs = await _workLogsService.GetCallLogsForCallAsync(call.CallId); model.Department = await _departmentsService.GetDepartmentByIdAsync(model.Call.DepartmentId, false); model.UnitStates = (await _unitsService.GetUnitStatesForCallAsync(model.Call.DepartmentId, call.CallId)).OrderBy(x => x.UnitId).OrderBy(y => y.Timestamp).ToList(); model.ActionLogs = (await _actionLogsService.GetActionLogsForCallAsync(model.Call.DepartmentId, call.CallId)).OrderBy(x => x.UserId).OrderBy(y => y.Timestamp).ToList(); model.Groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(model.Call.DepartmentId); model.Units = await _unitsService.GetUnitsForDepartmentAsync(DepartmentId); - model.Call = await _callsService.PopulateCallData(model.Call, true, true, true, true, true, true, true); return View(model); } @@ -1021,14 +1025,13 @@ public async Task CallExportEx(string query) Unauthorized(); var model = new CallExportView(); - model.Call = call; + model.Call = await _callsService.PopulateCallData(call, true, true, true, true, true, true, true); model.CallLogs = await _workLogsService.GetCallLogsForCallAsync(call.CallId); model.Department = await _departmentsService.GetDepartmentByIdAsync(model.Call.DepartmentId, false); model.UnitStates = (await _unitsService.GetUnitStatesForCallAsync(model.Call.DepartmentId, call.CallId)).OrderBy(x => x.UnitId).OrderBy(y => y.Timestamp).ToList(); model.ActionLogs = (await _actionLogsService.GetActionLogsForCallAsync(model.Call.DepartmentId, call.CallId)).OrderBy(x => x.UserId).OrderBy(y => y.Timestamp).ToList(); model.Groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(model.Call.DepartmentId); model.Units = await _unitsService.GetUnitsForDepartmentAsync(model.Call.DepartmentId); - model.Call = await _callsService.PopulateCallData(model.Call, true, true, true, true, true, true, true); if (!String.IsNullOrWhiteSpace(items[2]) && items[2] != "0") { @@ -1082,9 +1085,9 @@ public async Task CallExportPdf(string query) //var decryptedQuery = SymmetricEncryption.Decrypt(query, Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase); var client = new RestClient(Config.SystemBehaviorConfig.ResgridBaseUrl); - var request = new RestRequest($"User/Dispatch/CallExportEx?query={HttpUtility.UrlEncode(query)}", Method.GET); + var request = new RestRequest($"User/Dispatch/CallExportEx?query={HttpUtility.UrlEncode(query)}", Method.Get); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); if (!string.IsNullOrWhiteSpace(response.Content)) { @@ -1558,9 +1561,10 @@ public async Task GetCallFile(int callAttachmentId) } [HttpGet] + [Authorize(Policy = ResgridResources.Call_View)] public async Task GetCoordinatesFromW3W(string words) { - var result = _geoLocationProvider.GetCoordinatesFromW3W(words) ?? new Coordinates(); + var result = await _geoLocationProvider.GetCoordinatesFromW3W(words) ?? new Coordinates(); return Json(result); } @@ -1585,6 +1589,52 @@ public async Task GetCallImage(int callId, int attachmentId) return File(callAttachment.Data, "image/jpeg"); } + [HttpGet] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task GetCallTypes() + { + List callTypesJson = new List(); + + var types = await _callsService.GetCallTypesForDepartmentAsync(DepartmentId); + + if (types != null && types.Any()) + { + foreach (var type in types) + { + CallTypeJson json = new CallTypeJson(); + json.Id = type.CallTypeId; + json.Name = type.Type; + + callTypesJson.Add(json); + } + } + + return Json(callTypesJson); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Call_View)] + public async Task GetCallPriorities() + { + List callPrioritiesJson = new List(); + + var priorities = await _callsService.GetActiveCallPrioritiesForDepartmentAsync(DepartmentId); + + if (priorities != null && priorities.Any()) + { + foreach (var priority in priorities) + { + CallPriorityJson json = new CallPriorityJson(); + json.Id = priority.DepartmentCallPriorityId; + json.Name = priority.Name; + + callPrioritiesJson.Add(json); + } + } + + return Json(callPrioritiesJson); + } + #region Private Helpers private async Task FillNewCallView(NewCallView model) { @@ -1633,6 +1683,11 @@ private async Task FillNewCallView(NewCallView model) model.Call.ReportingUserId = UserId; + var form = await _formsService.GetNewCallFormByDepartmentIdAsync(DepartmentId); + + if (form != null) + model.NewCallFormData = form.Data; + return model; } diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/FormsController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/FormsController.cs new file mode 100644 index 00000000..c67925c3 --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/FormsController.cs @@ -0,0 +1,173 @@ +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using Resgrid.WebCore.Areas.User.Models.Forms; +using Resgrid.WebCore.Areas.User.Models.Protocols; +using IAuthorizationService = Resgrid.Model.Services.IAuthorizationService; + +namespace Resgrid.Web.Areas.User.Controllers +{ + [Area("User")] + public class FormsController : SecureBaseController + { + private readonly IFormsService _formsService; + private readonly ICallsService _callsService; + private readonly IAuthorizationService _authorizationService; + private readonly IDepartmentsService _departmentsService; + + public FormsController(IFormsService formsService, ICallsService callsService, IAuthorizationService authorizationService, IDepartmentsService departmentsService) + { + _formsService = formsService; + _callsService = callsService; + _authorizationService = authorizationService; + _departmentsService = departmentsService; + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Forms_View)] + public async Task Index() + { + var model = new FormIndexModel(); + model.Forms = await _formsService.GetAllNonDeletedFormsForDepartmentAsync(DepartmentId); + + return View(model); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Forms_Create)] + public async Task New() + { + var model = new NewFormModel(); + model.FormTypes = model.FormType.ToSelectListDescription(); + + return View(model); + } + + [HttpPost] + [Authorize(Policy = ResgridResources.Forms_Create)] + public async Task New(NewFormModel model, IFormCollection form, CancellationToken cancellationToken) + { + model.FormTypes = model.FormType.ToSelectListDescription(); + + if (ModelState.IsValid) + { + var newForm = new Form(); + newForm.DepartmentId = DepartmentId; + newForm.CreatedBy = UserId; + newForm.UpdatedBy = UserId; + newForm.Name = model.FormName; + newForm.Data = model.Data; + newForm.Type = (int)model.FormType; + + List questions = (from object key in form.Keys where key.ToString().StartsWith("callAutomationTriggerField_") select int.Parse(key.ToString().Replace("callAutomationTriggerField_", ""))).ToList(); + + if (questions.Count > 0) + newForm.Automations = new Collection(); + + foreach (var i in questions) + { + if (form.ContainsKey("callAutomationTriggerField_" + i)) + { + var callAutomationTriggerField = form["callAutomationTriggerField_" + i]; + var callAutomationTriggerValue = form["callAutomationTriggerValue_" + i]; + var callAutomationOperationType = form["callAutomationOperationType_" + i]; + var callAutomationOperationValue = form["callAutomationOperationValue_" + i]; + + var automation = new FormAutomation(); + automation.TriggerField = callAutomationTriggerField; + automation.TriggerValue = callAutomationTriggerValue; + automation.OperationType = int.Parse(callAutomationOperationType); + automation.OperationValue = callAutomationOperationValue; + + newForm.Automations.Add(automation); + } + } + + + await _formsService.SaveFormAsync(newForm, cancellationToken); + + return RedirectToAction("Index"); + } + + return View(model); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Forms_View)] + public async Task View(string id) + { + var model = new ViewFormModel(); + var form = await _formsService.GetFormByIdAsync(id); + + if (form != null) + { + if (form.DepartmentId != DepartmentId) + Unauthorized(); + + model.Form = form; + return View(model); + } + + return RedirectToAction("Index"); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Forms_Update)] + public async Task Enable(string id) + { + var form = await _formsService.GetFormByIdAsync(id); + + if (form != null) + { + if (form.DepartmentId != DepartmentId) + Unauthorized(); + + await _formsService.EnableFormByIdAsync(id); + } + + return RedirectToAction("Index"); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Forms_Update)] + public async Task Disable(string id) + { + var form = await _formsService.GetFormByIdAsync(id); + + if (form != null) + { + if (form.DepartmentId != DepartmentId) + Unauthorized(); + + await _formsService.DisableFormByIdAsync(id); + } + + return RedirectToAction("Index"); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Forms_Delete)] + public async Task Delete(string id, CancellationToken cancellationToken) + { + var form = await _formsService.GetFormByIdAsync(id); + + if (form != null) + { + if (form.DepartmentId != DepartmentId) + Unauthorized(); + + await _formsService.DeleteForm(id, cancellationToken); + } + + return RedirectToAction("Index"); + } + } +} diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/GroupsController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/GroupsController.cs index 60fd56f3..b9044c08 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/GroupsController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/GroupsController.cs @@ -148,7 +148,7 @@ public async Task NewGroup(NewGroupView model, IFormCollection co } else { - var result = _geoLocationProvider.GetCoordinatesFromW3W(model.What3Word); + var result = await _geoLocationProvider.GetCoordinatesFromW3W(model.What3Word); if (result == null) ModelState.AddModelError("What3Word", string.Format("The What3Words address entered was incorrect.")); @@ -237,7 +237,7 @@ public async Task NewGroup(NewGroupView model, IFormCollection co auditEvent.DepartmentId = DepartmentId; auditEvent.UserId = UserId; auditEvent.Type = AuditLogTypes.GroupAdded; - auditEvent.After = model.NewGroup.CloneJson(); + auditEvent.After = model.NewGroup.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); return RedirectToAction("Index", "Groups", new { Area = "User" }); @@ -335,7 +335,7 @@ public async Task DeleteGroup(DeleteGroupView model, Cancellation auditEvent.DepartmentId = DepartmentId; auditEvent.UserId = UserId; auditEvent.Type = AuditLogTypes.GroupRemoved; - auditEvent.Before = group.CloneJson(); + auditEvent.Before = group.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); await _deleteService.DeleteGroupAsync(group.DepartmentGroupId, UserId); @@ -413,7 +413,7 @@ public async Task EditGroup(EditGroupView model, IFormCollection auditEvent.DepartmentId = DepartmentId; auditEvent.UserId = UserId; auditEvent.Type = AuditLogTypes.GroupChanged; - auditEvent.Before = group.CloneJson(); + auditEvent.Before = group.CloneJsonToString(); group.Name = model.EditGroup.Name; @@ -454,7 +454,7 @@ public async Task EditGroup(EditGroupView model, IFormCollection } else { - var result = _geoLocationProvider.GetCoordinatesFromW3W(model.What3Word); + var result = await _geoLocationProvider.GetCoordinatesFromW3W(model.What3Word); if (result == null) ModelState.AddModelError("What3Word", string.Format("The What3Words address entered was incorrect.")); @@ -545,7 +545,7 @@ public async Task EditGroup(EditGroupView model, IFormCollection await _departmentGroupsService.UpdateAsync(group, cancellationToken); - auditEvent.After = group.CloneJson(); + auditEvent.After = group.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); return RedirectToAction("Index", "Groups", new { Area = "User" }); diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/HomeController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/HomeController.cs index 3ad23711..053fca11 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/HomeController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/HomeController.cs @@ -571,7 +571,7 @@ public async Task EditUserProfile(EditProfileModel model, IFormCo if (savedProfile == null) savedProfile = new UserProfile(); - auditEvent.Before = savedProfile.CloneJson(); + auditEvent.Before = savedProfile.CloneJsonToString(); savedProfile.UserId = model.UserId; savedProfile.MobileCarrier = (int)model.Carrier; @@ -687,7 +687,7 @@ public async Task EditUserProfile(EditProfileModel model, IFormCo savedProfile.LastUpdated = DateTime.UtcNow; await _userProfileService.SaveProfileAsync(DepartmentId, savedProfile, cancellationToken); - auditEvent.After = savedProfile.CloneJson(); + auditEvent.After = savedProfile.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); var depMember = await _departmentsService.GetDepartmentMemberAsync(model.UserId, DepartmentId); @@ -705,11 +705,7 @@ public async Task EditUserProfile(EditProfileModel model, IFormCo } if (!model.Profile.DoNotRecieveNewsletters) - Unsubscribe(model.Email); - - //var membershipUser = Membership.GetUser(model.UserId); - //membershipUser.Email = model.Email; - //Membership.UpdateUser(membershipUser); + await Unsubscribe(model.Email); _usersService.UpdateEmail(model.User.Id, model.Email); @@ -724,7 +720,7 @@ public async Task EditUserProfile(EditProfileModel model, IFormCo if (!string.IsNullOrWhiteSpace(model.NewUsername)) { - _usersService.UpdateUsername(model.User.UserName, model.NewUsername); + await _usersService.UpdateUsername(model.User.UserName, model.NewUsername); } } @@ -844,18 +840,18 @@ public async Task SetActionForUser(string userId, int actionType) } #endregion User Actions - private void Unsubscribe(string emailAddress) + private async Task Unsubscribe(string emailAddress) { try { var client = new RestClient("https://app.mailerlite.com"); - var request = new RestRequest("/api/v1/subscribers/unsubscribe/", Method.POST); + var request = new RestRequest("/api/v1/subscribers/unsubscribe/", Method.Post); request.AddObject(new { apiKey = "QDrnoEf6hBONlGye26aZFh5Iv1KEgdJM", email = emailAddress }); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); } catch { } } diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/InventoryController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/InventoryController.cs index 48fd2c57..2b91288d 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/InventoryController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/InventoryController.cs @@ -82,7 +82,7 @@ public async Task Adjust(AdjustView model) if (model.UnitId > 0) model.Inventory.UnitId = model.UnitId; - _inventoryService.SaveInventoryAsync(model.Inventory); + await _inventoryService.SaveInventoryAsync(model.Inventory); return RedirectToAction("Index"); } @@ -131,7 +131,7 @@ public async Task DeleteType(int typeId) if (type.DepartmentId != DepartmentId) Unauthorized(); - _inventoryService.DeleteTypeAsync(typeId); + await _inventoryService.DeleteTypeAsync(typeId); return RedirectToAction("ManageTypes"); } @@ -168,7 +168,7 @@ public async Task EditType(EditTypeView model) type.ExpiresDays = model.Type.ExpiresDays; type.UnitOfMesasure = model.Type.UnitOfMesasure; - _inventoryService.SaveTypeAsync(type); + await _inventoryService.SaveTypeAsync(type); return RedirectToAction("ManageTypes"); } @@ -180,7 +180,7 @@ public async Task AddType(AddTypeView model) if (ModelState.IsValid) { model.Type.DepartmentId = DepartmentId; - _inventoryService.SaveTypeAsync(model.Type); + await _inventoryService.SaveTypeAsync(model.Type); return RedirectToAction("ManageTypes"); } diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/LogsController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/LogsController.cs index a23f840b..70626da4 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/LogsController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/LogsController.cs @@ -464,7 +464,7 @@ private async Task PopulateLogViewModel(NewLogView model) model.Types = model.LogType.ToSelectList(); model.CallPriorities = model.CallPriority.ToSelectList(); model.Users.Add(String.Empty, "Not Applicable"); - model.SetUsers(_departmentsService.GetAllUsersForDepartment(DepartmentId)); + await model.SetUsers(_departmentsService.GetAllUsersForDepartment(DepartmentId)); var groups = new List(); groups.Add(new DepartmentGroup { diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/MappingController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/MappingController.cs index 08418ab1..43f0c441 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/MappingController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/MappingController.cs @@ -371,7 +371,7 @@ await _geoLocationProvider.GetLatLonFromAddress(string.Format("{0} {1} {2} {3}", info.Title = call.Name; info.InfoWindowContent = call.NatureOfCall; - if (!String.IsNullOrEmpty(call.GeoLocationData)) + if (!String.IsNullOrEmpty(call.GeoLocationData) && call.GeoLocationData.Length > 1) { try { diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/PersonnelController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/PersonnelController.cs index 8eeae2c1..23272e8b 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/PersonnelController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/PersonnelController.cs @@ -315,7 +315,7 @@ public async Task AddPerson(AddPersonModel model, IFormCollection auditEvent.DepartmentId = DepartmentId; auditEvent.UserId = UserId; auditEvent.Type = AuditLogTypes.UserAdded; - auditEvent.After = userObject; + auditEvent.After = userObject.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); if (model.UserGroup != 0) @@ -336,9 +336,9 @@ public async Task AddPerson(AddPersonModel model, IFormCollection _usersService.ClearCacheForDepartment(DepartmentId); if (model.SendAccountCreationNotification) - _emailService.SendWelcomeEmail(model.Department.Name, model.FirstName + " " + model.LastName, user.Email, user.UserName, model.ConfirmPassword, DepartmentId); + await _emailService.SendWelcomeEmail(model.Department.Name, model.FirstName + " " + model.LastName, user.Email, user.UserName, model.ConfirmPassword, DepartmentId); - _emailMarketingProvider.SubscribeUserToUsersList(model.FirstName, model.LastName, user.Email); + await _emailMarketingProvider.SubscribeUserToUsersList(model.FirstName, model.LastName, user.Email); return RedirectToAction("Index", "Personnel", new { area = "User" }); } diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/ProfileController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/ProfileController.cs index 1a8cc282..ad944259 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/ProfileController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/ProfileController.cs @@ -960,7 +960,7 @@ public async Task ResetPasswordForUser(ResetPasswordForUserView if (result.Succeeded) { if (model.EmailUser) - _emailService.SendPasswordResetEmail(model.Email, model.Name, user.UserName, model.Password, userDepartment.Name); + await _emailService.SendPasswordResetEmail(model.Email, model.Name, user.UserName, model.Password, userDepartment.Name); return RedirectToAction("Index", "Personnel", new { Area = "User" }); } diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/SecurityController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/SecurityController.cs index 413f8ae2..9dfa4ade 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/SecurityController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/SecurityController.cs @@ -291,8 +291,8 @@ public async Task SetPermission(int type, int perm, bool? lockToG auditEvent.DepartmentId = DepartmentId; auditEvent.UserId = UserId; auditEvent.Type = AuditLogTypes.PermissionsChanged; - auditEvent.Before = before.CloneJson(); - auditEvent.After = result.CloneJson(); + auditEvent.Before = before.CloneJsonToString(); + auditEvent.After = result.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); return new StatusCodeResult((int)HttpStatusCode.OK); @@ -312,8 +312,8 @@ public async Task SetPermissionData(int type, string data, bool? auditEvent.DepartmentId = DepartmentId; auditEvent.UserId = UserId; auditEvent.Type = AuditLogTypes.PermissionsChanged; - auditEvent.Before = before.CloneJson(); - auditEvent.After = result.CloneJson(); + auditEvent.Before = before.CloneJsonToString(); + auditEvent.After = result.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); return new StatusCodeResult((int)HttpStatusCode.OK); diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/TypesController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/TypesController.cs index 3d033ca6..ac0113e8 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/TypesController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/TypesController.cs @@ -10,7 +10,6 @@ using System; using System.Threading; using System.Threading.Tasks; -using Remotion.Linq.Parsing.ExpressionVisitors.Transformation.PredefinedTransformations; using Resgrid.WebCore.Areas.User.Models.Types; namespace Resgrid.Web.Areas.User.Controllers @@ -21,16 +20,13 @@ public class TypesController : SecureBaseController private readonly IUnitsService _unitsService; private readonly ICustomStateService _customStateService; private readonly ICallsService _callsService; - private readonly IAudioValidatorProvider _audioValidatorProvider; private readonly IDepartmentSettingsService _departmentSettingsService; - public TypesController(IUnitsService unitsService, ICustomStateService customStateService, ICallsService callsService, IAudioValidatorProvider audioValidatorProvider, - IDepartmentSettingsService departmentSettingsService) + public TypesController(IUnitsService unitsService, ICustomStateService customStateService, ICallsService callsService, IDepartmentSettingsService departmentSettingsService) { _unitsService = unitsService; _customStateService = customStateService; _callsService = callsService; - _audioValidatorProvider = audioValidatorProvider; _departmentSettingsService = departmentSettingsService; } @@ -127,12 +123,6 @@ public async Task NewCallPriority(NewCallPriorityView model, IFor if (pushfileToUpload.Length > 1000000) ModelState.AddModelError("pushfileToUpload", "Android Push Audio file is too large, must be smaller then 1MB."); - - var fileAudioLength = _audioValidatorProvider.GetMp3FileDuration(pushfileToUpload.OpenReadStream()); - if (fileAudioLength == null) - ModelState.AddModelError("pushfileToUpload", string.Format("Audio file type ({0}) is not supported for Android Push Notifications. MP3 Files are required.", extenion)); - else if (fileAudioLength != null && fileAudioLength.Value > new TimeSpan(0, 0, 25)) - ModelState.AddModelError("pushfileToUpload", string.Format("Android Push audio file length is longer then 25 seconds. Android Push notification sounds must be 25 seconds or shorter.", extenion)); } if (iOSPushfileToUpload != null && iOSPushfileToUpload.Length > 0) @@ -167,12 +157,6 @@ public async Task NewCallPriority(NewCallPriorityView model, IFor if (alertfileToUpload.Length > 1000000) ModelState.AddModelError("alertfileToUpload", "Push Audio file is too large, must be smaller then 1MB."); - - var fileAudioLength = _audioValidatorProvider.GetWavFileDuration(alertfileToUpload.OpenReadStream()); - if (fileAudioLength == null) - ModelState.AddModelError("alertfileToUpload", string.Format("Audio file type ({0}) is not supported for Browser Alert Notifications. WAV Files are required.", extenion)); - else if (fileAudioLength != null && fileAudioLength.Value > new TimeSpan(0, 0, 5)) - ModelState.AddModelError("alertfileToUpload", string.Format("Browser alert audio file length is longer then 5 seconds. Push notification sounds must be 5 seconds or shorter.", extenion)); } if (String.IsNullOrWhiteSpace(model.CallPriority.Name)) @@ -267,12 +251,6 @@ public async Task EditCallPriority(EditCallPriorityView model, IF if (pushfileToUpload.Length > 1000000) ModelState.AddModelError("pushfileToUpload", "Push Audio file is too large, must be smaller then 1MB."); - - var fileAudioLength = _audioValidatorProvider.GetWavFileDuration(pushfileToUpload.OpenReadStream()); - if (fileAudioLength == null) - ModelState.AddModelError("pushfileToUpload", string.Format("Audio file type ({0}) is not supported for Push Notifications. WAV Files are required.", extenion)); - else if (fileAudioLength != null && fileAudioLength.Value > new TimeSpan(0, 0, 25)) - ModelState.AddModelError("pushfileToUpload", string.Format("Push audio file length is longer then 25 seconds. Push notification sounds must be 25 seconds or shorter.", extenion)); } if (iOSPushfileToUpload != null && iOSPushfileToUpload.Length > 0) @@ -307,12 +285,6 @@ public async Task EditCallPriority(EditCallPriorityView model, IF if (alertfileToUpload.Length > 1000000) ModelState.AddModelError("alertfileToUpload", "Push Audio file is too large, must be smaller then 1MB."); - - var fileAudioLength = _audioValidatorProvider.GetWavFileDuration(alertfileToUpload.OpenReadStream()); - if (fileAudioLength == null) - ModelState.AddModelError("alertfileToUpload", string.Format("Audio file type ({0}) is not supported for Browser Alert Notifications. WAV Files are required.", extenion)); - else if (fileAudioLength != null && fileAudioLength.Value > new TimeSpan(0, 0, 5)) - ModelState.AddModelError("alertfileToUpload", string.Format("Browser alert audio file length is longer then 5 seconds. Push notification sounds must be 5 seconds or shorter.", extenion)); } if (ModelState.IsValid) diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/UnitsController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/UnitsController.cs index cf42841a..fe5ef240 100644 --- a/Web/Resgrid.WebCore/Areas/User/Controllers/UnitsController.cs +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/UnitsController.cs @@ -244,7 +244,7 @@ public async Task NewUnit(NewUnitView model, IFormCollection form auditEvent.DepartmentId = DepartmentId; auditEvent.UserId = UserId; auditEvent.Type = AuditLogTypes.UnitAdded; - auditEvent.After = model.Unit.CloneJson(); + auditEvent.After = model.Unit.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); _eventAggregator.SendMessage(new UnitAddedEvent() { DepartmentId = DepartmentId, Unit = model.Unit }); @@ -314,7 +314,7 @@ public async Task EditUnit(NewUnitView model, IFormCollection for auditEvent.DepartmentId = DepartmentId; auditEvent.UserId = UserId; auditEvent.Type = AuditLogTypes.UnitChanged; - auditEvent.Before = unit.CloneJson(); + auditEvent.Before = unit.CloneJsonToString(); unit.Name = model.Unit.Name; unit.Type = model.Unit.Type; @@ -346,7 +346,7 @@ public async Task EditUnit(NewUnitView model, IFormCollection for else await _unitsService.ClearRolesForUnitAsync(unit.UnitId, cancellationToken); - auditEvent.After = unit.CloneJson(); + auditEvent.After = unit.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); return RedirectToAction("Index"); @@ -474,7 +474,7 @@ public async Task DeleteUnit(int unitId, CancellationToken cancel auditEvent.DepartmentId = DepartmentId; auditEvent.UserId = UserId; auditEvent.Type = AuditLogTypes.UnitRemoved; - auditEvent.Before = unit.CloneJson(); + auditEvent.Before = unit.CloneJsonToString(); _eventAggregator.SendMessage(auditEvent); await _unitsService.DeleteUnitAsync(unitId, cancellationToken); diff --git a/Web/Resgrid.WebCore/Areas/User/Controllers/VoiceController.cs b/Web/Resgrid.WebCore/Areas/User/Controllers/VoiceController.cs new file mode 100644 index 00000000..3424c495 --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Controllers/VoiceController.cs @@ -0,0 +1,93 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Resgrid.Model; +using Resgrid.Model.Services; +using Resgrid.Providers.Claims; +using Resgrid.WebCore.Areas.User.Models.Voice; +using IAuthorizationService = Resgrid.Model.Services.IAuthorizationService; + +namespace Resgrid.Web.Areas.User.Controllers +{ + [Area("User")] + public class VoiceController : SecureBaseController + { + private readonly IVoiceService _voiceService; + private readonly IAuthorizationService _authorizationService; + private readonly IDepartmentsService _departmentsService; + + public VoiceController(IVoiceService voiceService, IAuthorizationService authorizationService, IDepartmentsService departmentsService) + { + _voiceService = voiceService; + _authorizationService = authorizationService; + _departmentsService = departmentsService; + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Voice_View)] + public async Task Index() + { + var model = new VoiceIndexModel(); + model.CanUseVoice = await _voiceService.CanDepartmentUseVoiceAsync(DepartmentId); + model.Voice = await _voiceService.GetVoiceSettingsForDepartmentAsync(DepartmentId); + + if (model.Voice == null) + { + model.Voice = new DepartmentVoice(); + model.Voice.Channels = new List(); + } + + return View(model); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Voice_Create)] + public async Task New() + { + var model = new NewChannelModel(); + var canUseVoice = await _voiceService.CanDepartmentUseVoiceAsync(DepartmentId); + + if (!canUseVoice) + Unauthorized(); + + return View(model); + } + + [HttpPost] + [Authorize(Policy = ResgridResources.Voice_Create)] + public async Task New(NewChannelModel model, CancellationToken cancellationToken) + { + var canUseVoice = await _voiceService.CanDepartmentUseVoiceAsync(DepartmentId); + + if (!canUseVoice) + Unauthorized(); + + if (ModelState.IsValid) + { + var department = await _departmentsService.GetDepartmentByIdAsync(DepartmentId); + var voiceRecord = await _voiceService.GetOrCreateDepartmentVoiceRecordAsync(department); + var channel = await _voiceService.SaveChannelToVoipProviderAsync(department, model.ChannelName, cancellationToken); + + return RedirectToAction("Index"); + } + + return View(model); + } + + [HttpGet] + [Authorize(Policy = ResgridResources.Voice_Create)] + public async Task Resync() + { + var canUseVoice = await _voiceService.CanDepartmentUseVoiceAsync(DepartmentId); + + if (!canUseVoice) + Unauthorized(); + + var result = await _voiceService.InitializeDepartmentUsersWithVoipProviderAsync(DepartmentId); + + return RedirectToAction("Index"); + } + } +} diff --git a/Web/Resgrid.WebCore/Areas/User/Models/Calls/NewCallView.cs b/Web/Resgrid.WebCore/Areas/User/Models/Calls/NewCallView.cs index efef4311..853e7f7a 100644 --- a/Web/Resgrid.WebCore/Areas/User/Models/Calls/NewCallView.cs +++ b/Web/Resgrid.WebCore/Areas/User/Models/Calls/NewCallView.cs @@ -30,6 +30,7 @@ public class NewCallView : BaseUserModel public List UnitStatuses { get; set; } public SelectList CallTemplates { get; set; } public int CallTemplateId { get; set; } + public string NewCallFormData { get; set; } public NewCallView() { diff --git a/Web/Resgrid.WebCore/Areas/User/Models/Dispatch/CallPriorityJson.cs b/Web/Resgrid.WebCore/Areas/User/Models/Dispatch/CallPriorityJson.cs new file mode 100644 index 00000000..4b5ed4f6 --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Models/Dispatch/CallPriorityJson.cs @@ -0,0 +1,9 @@ + +namespace Resgrid.WebCore.Areas.User.Models.Dispatch +{ + public class CallPriorityJson + { + public int Id { get; set; } + public string Name { get; set; } + } +} diff --git a/Web/Resgrid.WebCore/Areas/User/Models/Dispatch/CallTypeJson.cs b/Web/Resgrid.WebCore/Areas/User/Models/Dispatch/CallTypeJson.cs new file mode 100644 index 00000000..8beb5ba2 --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Models/Dispatch/CallTypeJson.cs @@ -0,0 +1,8 @@ +namespace Resgrid.WebCore.Areas.User.Models.Dispatch +{ + public class CallTypeJson + { + public int Id { get; set; } + public string Name { get; set; } + } +} diff --git a/Web/Resgrid.WebCore/Areas/User/Models/Forms/FormIndexModel.cs b/Web/Resgrid.WebCore/Areas/User/Models/Forms/FormIndexModel.cs new file mode 100644 index 00000000..dd27f8bd --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Models/Forms/FormIndexModel.cs @@ -0,0 +1,15 @@ +using Resgrid.Model; +using System.Collections.Generic; + +namespace Resgrid.WebCore.Areas.User.Models.Forms +{ + public class FormIndexModel + { + public List Forms { get; set; } + + public FormIndexModel() + { + Forms = new List(); + } + } +} diff --git a/Web/Resgrid.WebCore/Areas/User/Models/Forms/NewFormModel.cs b/Web/Resgrid.WebCore/Areas/User/Models/Forms/NewFormModel.cs new file mode 100644 index 00000000..3a5e0497 --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Models/Forms/NewFormModel.cs @@ -0,0 +1,21 @@ +using Microsoft.AspNetCore.Mvc.Rendering; +using Resgrid.Model; +using System.ComponentModel.DataAnnotations; + +namespace Resgrid.WebCore.Areas.User.Models.Forms +{ + public class NewFormModel + { + public string Message { get; set; } + + [Required] + public string FormName { get; set; } + + [Required] + public string Data { get; set; } + + public FormTypes FormType { get; set; } + + public SelectList FormTypes { get; set; } + } +} diff --git a/Web/Resgrid.WebCore/Areas/User/Models/Forms/ViewFormModel.cs b/Web/Resgrid.WebCore/Areas/User/Models/Forms/ViewFormModel.cs new file mode 100644 index 00000000..8f4d2c08 --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Models/Forms/ViewFormModel.cs @@ -0,0 +1,9 @@ +using Resgrid.Model; + +namespace Resgrid.WebCore.Areas.User.Models.Forms +{ + public class ViewFormModel + { + public Form Form { get; set; } + } +} diff --git a/Web/Resgrid.WebCore/Areas/User/Models/Voice/NewChannelModel.cs b/Web/Resgrid.WebCore/Areas/User/Models/Voice/NewChannelModel.cs new file mode 100644 index 00000000..3dd3ea5c --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Models/Voice/NewChannelModel.cs @@ -0,0 +1,13 @@ +using Resgrid.Model; +using System.ComponentModel.DataAnnotations; + +namespace Resgrid.WebCore.Areas.User.Models.Voice +{ + public class NewChannelModel + { + public string Message { get; set; } + + [Required] + public string ChannelName { get; set; } + } +} diff --git a/Web/Resgrid.WebCore/Areas/User/Models/Voice/VoiceIndexModel.cs b/Web/Resgrid.WebCore/Areas/User/Models/Voice/VoiceIndexModel.cs new file mode 100644 index 00000000..3a7482aa --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Models/Voice/VoiceIndexModel.cs @@ -0,0 +1,10 @@ +using Resgrid.Model; + +namespace Resgrid.WebCore.Areas.User.Models.Voice +{ + public class VoiceIndexModel + { + public bool CanUseVoice { get; set; } + public DepartmentVoice Voice { get; set; } + } +} diff --git a/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/CallExportEx.cshtml b/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/CallExportEx.cshtml index 5cbe7168..4fd7e684 100644 --- a/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/CallExportEx.cshtml +++ b/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/CallExportEx.cshtml @@ -118,7 +118,7 @@ Logged By - @(await UserHelper.GetFullNameForUser(Model.Call.ReportingUser.UserId)) + @(await UserHelper.GetFullNameForUser(Model.Call.ReportingUserId)) diff --git a/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/NewCall.cshtml b/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/NewCall.cshtml index 36479b15..eeb07063 100644 --- a/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/NewCall.cshtml +++ b/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/NewCall.cshtml @@ -35,6 +35,10 @@
Template + @if (!String.IsNullOrWhiteSpace(Model.NewCallFormData)) + { + Call Form + }
@@ -53,6 +57,7 @@ @Html.HiddenFor(m => m.Latitude) @Html.HiddenFor(m => m.Longitude) @Html.HiddenFor(m => m.Call.ReportingUserId) + @Html.HiddenFor(m => m.Call.CallFormData)
@if (!String.IsNullOrEmpty(Model.Message)) @@ -357,14 +362,36 @@ + + @section Scripts { + + @if (Model.CenterCoordinates != null && Model.CenterCoordinates.Latitude.HasValue && Model.CenterCoordinates.Longitude.HasValue) { - + } diff --git a/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/ViewCall.cshtml b/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/ViewCall.cshtml index 643938be..b59de619 100644 --- a/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/ViewCall.cshtml +++ b/Web/Resgrid.WebCore/Areas/User/Views/Dispatch/ViewCall.cshtml @@ -19,181 +19,185 @@
-

View Call

- +

View Call

+
-
-
- @if (ClaimsAuthorizationHelper.CanCreateCall() && Model.Call.State != 0) +
+
+ @if (ClaimsAuthorizationHelper.CanCreateCall() && Model.Call.State != 0) { - + } -
-
+
+
-
-
-
-
-
-
- Print (Export) View -

@Model.Call.Name

-
-
-
Status:
-
- @if (Model.Call.State == (int)CallStates.Active) +
+
+
+
+
+
+ Print (Export) View +

@Model.Call.Name

+
+
+
Status:
+
+ @if (Model.Call.State == (int)CallStates.Active) { - Active + Active } else if (Model.Call.State == (int)CallStates.Cancelled) { - Canceled + Canceled } else if (Model.Call.State == (int)CallStates.Closed) { - Closed + Closed } else if (Model.Call.State == (int)CallStates.Unfounded) { - Unfounded + Unfounded } -
-
-
-
-
-
-
-
Number:
-
@Model.Call.Number
-
Type:
-
- @if (!String.IsNullOrWhiteSpace(Model.Call.Type)) +
+
+
+
+
+
+
+
Number:
+
@Model.Call.Number
+
Type:
+
+ @if (!String.IsNullOrWhiteSpace(Model.Call.Type)) { - @Model.Call.Type + @Model.Call.Type } else { - No Type + No Type } -
-
Priority:
-
@(((CallPriority)Model.Call.Priority).ToString())
-
Call Address:
-
@Model.Call.Address
-
-
-
-
-
Incident Id:
-
@Model.Call.IncidentNumber
-
Logged By:
-
@(await UserHelper.GetFullNameForUser(Model.Call.ReportingUserId))
-
Logged On:
-
@Model.Call.LoggedOn.TimeConverterToString(Model.Department)
- @if (Model.Call.ClosedOn.HasValue) +
+
Priority:
+
@(((CallPriority)Model.Call.Priority).ToString())
+
Call Address:
+
@Model.Call.Address
+
+
+
+
+
Incident Id:
+
@Model.Call.IncidentNumber
+
Logged By:
+
@(await UserHelper.GetFullNameForUser(Model.Call.ReportingUserId))
+
Logged On:
+
@Model.Call.LoggedOn.TimeConverterToString(Model.Department)
+ @if (Model.Call.ClosedOn.HasValue) { -
Closed By:
-
@(await UserHelper.GetFullNameForUser(Model.Call.ClosedByUserId))
-
Closed On:
-
@Model.Call.ClosedOn.Value.TimeConverterToString(Model.Department)
+
Closed By:
+
@(await UserHelper.GetFullNameForUser(Model.Call.ClosedByUserId))
+
Closed On:
+
@Model.Call.ClosedOn.Value.TimeConverterToString(Model.Department)
} else { -
Closed By:
-
N/A
-
Closed On:
-
N/A
+
Closed By:
+
N/A
+
Closed On:
+
N/A
} -
-
-
-
-
-
-
Nature of Call:
-
- @Html.Raw(Model.Call.NatureOfCall) -
-
-
-
-
-
-
-
Notes:
-
- @Html.Raw(Model.Call.Notes) -
-
-
-
-
-
-
-
Close Notes:
-
- @Html.Raw(Model.Call.CompletedNotes) -
-
-
-
-
-
- +
+
+
+
Nature of Call:
+
+ @Html.Raw(Model.Call.NatureOfCall) +
+
+
+
+
+
+
+
Notes:
+
+ @Html.Raw(Model.Call.Notes) +
+
+
+
+
+
+
+
Close Notes:
+
+ @Html.Raw(Model.Call.CompletedNotes) +
+
+
+
+
+
+
+
+
+ +
+
+
-
-
-
-
- - - - - - - - - @foreach (var g in Model.Groups) +
+
+
+
+
- - - -
+ + + + + + + + @foreach (var g in Model.Groups) { var unitsForGroup = Model.Units.Where(x => x.StationGroupId == g.DepartmentGroupId); - + var sortedUsers = from u in g.Members let name = Model.UserGroupRoles.FirstOrDefault(x => x.UserId == u.UserId).Name @@ -203,9 +207,9 @@ Name = name, User = u }; - - - + + + if (unitsForGroup != null && unitsForGroup.Any()) { @@ -213,10 +217,10 @@ { if (Model.Call.HasUnitBeenDispatched(unit.UnitId)) { - - - - + + + + } } } @@ -226,10 +230,10 @@ { if (Model.Call.HasUserBeenDispatched(u.User.UserId)) { - - - - + + + + } } @@ -239,15 +243,15 @@ if (isGroupDispatched != null) { - - - - + + + + } } } - @{ + @{ var sortedUngroupedUsers = from u in Model.UnGroupedUsers @@ -258,12 +262,12 @@ Name = name, User = u }; - } + } - - - - @{ + + + + @{ var units = Model.Units.Where(x => x.StationGroupId == null); if (units != null && units.Any()) @@ -272,365 +276,389 @@ { if (Model.Call.HasUnitBeenDispatched(unit.UnitId)) { - - - - + + + + } } } - } - @foreach (var u in sortedUngroupedUsers) + } + @foreach (var u in sortedUngroupedUsers) { if (Model.Call.HasUserBeenDispatched(u.User.UserId)) { - - - - + + + + } } - -
+ + + +
@g.Name
@g.Name
@unit.Name@unit.Type
@unit.Name@unit.Type
@u.Name
@u.Name
All of @g.Name Dispatched(Group Selected)
All of @g.Name Dispatched(Group Selected)
Ungrouped Users\Units
Ungrouped Users\Units
@unit.Name@unit.Type
@unit.Name@unit.Type
@u.Name
@u.Name
-
-
- - - - - - - - - - - - @foreach (var al in Model.ActionLogs) + +
TimestampStatusNameGroupNote
+
+
+ + + + + + + + + + + + @foreach (var al in Model.ActionLogs) { var customState = await CustomStatesHelper.GetCustomPersonnelStatus(Model.Department.DepartmentId, al); var userInfo = Model.UserGroupRoles.FirstOrDefault(x => x.UserId == al.UserId); - - - + + - + - + - - + + + } - -
TimestampStatusNameGroupNote
- @al.Timestamp.TimeConverterToString(Model.Department) - - @if (al.ActionTypeId <= 25) +
+ @al.Timestamp.TimeConverterToString(Model.Department) + + @if (al.ActionTypeId <= 25) { - @customState.ButtonText + @customState.ButtonText } else { - @customState.ButtonText + @customState.ButtonText } - - @if (userInfo != null) + + @if (userInfo != null) { - @userInfo.Name + @userInfo.Name } else { - @(await UserHelper.GetFullNameForUser(al.UserId)) + @(await UserHelper.GetFullNameForUser(al.UserId)) } - - @if (userInfo != null) + + @if (userInfo != null) { - @userInfo.DepartmentGroupName + @userInfo.DepartmentGroupName } else { - + } - -

- @Html.Raw(al.Note) -

-
+

+ @Html.Raw(al.Note) +

+
-
-
- - - - - - - - - - - - @foreach (var us in Model.UnitStates) + +
TimestampStatusNameGroupNote
+
+
+ + + + + + + + + + + + @foreach (var us in Model.UnitStates) { var customState = await CustomStatesHelper.GetCustomUnitState(us); - - - + + - - + + - - + + + } - -
TimestampStatusNameGroupNote
@us.Timestamp.TimeConverterToString(Model.Department) - @if (us.State <= 25) +
@us.Timestamp.TimeConverterToString(Model.Department) + @if (us.State <= 25) { - @customState.ButtonText + @customState.ButtonText } else { - @customState.ButtonText + @customState.ButtonText } - @us.Unit.Name - @if (us.Unit.StationGroup != null) + @us.Unit.Name + @if (us.Unit.StationGroup != null) { - @us.Unit.StationGroup.Name + @us.Unit.StationGroup.Name } - -

- @Html.Raw(us.Note) -

-
+

+ @Html.Raw(us.Note) +

+
-
-
- - - - - - - - - - - - @foreach (var file in Model.Call.Attachments.Where(x => x.CallAttachmentType == 1 || x.CallAttachmentType == 3 || x.CallAttachmentType == 4)) + +
TypeFile NameFile TypeTimestampAdd File
+
+
+ + + + + + + + + + + + @foreach (var file in Model.Call.Attachments.Where(x => x.CallAttachmentType == 1 || x.CallAttachmentType == 3 || x.CallAttachmentType == 4)) { - - + - - - + + + - + - + + } - -
TypeFile NameFile TypeTimestampAdd File
- @if (file.CallAttachmentType == 1) +
+ @if (file.CallAttachmentType == 1) { - Dispatch Audio + Dispatch Audio } else if (file.CallAttachmentType == 3) { - File + File } else if (file.CallAttachmentType == 4) { - Video + Video } - - @file.FileName - - @if (file.Timestamp.HasValue) + + @file.FileName + + @if (file.Timestamp.HasValue) { - @file.Timestamp.Value.TimeConverterToString(Model.Department) + @file.Timestamp.Value.TimeConverterToString(Model.Department) } - - @if (file.CallAttachmentType == 1) + + @if (file.CallAttachmentType == 1) { - + } else if (file.CallAttachmentType == 3) { - Download + Download } -
-
-
-
- @foreach (var image in Model.Call.Attachments.Where(x => x.CallAttachmentType == 2)) + + +
+
+
+ @foreach (var image in Model.Call.Attachments.Where(x => x.CallAttachmentType == 2)) { -
-
-
-
-
Name:
-
@image.Name
-
Timestamp:
- @if (image.Timestamp.HasValue) +
+
+
+
+
Name:
+
@image.Name
+
Timestamp:
+ @if (image.Timestamp.HasValue) { -
@image.Timestamp.Value.TimeConverterToString(Model.Department)
+
@image.Timestamp.Value.TimeConverterToString(Model.Department)
} else { -
Unknown
+
Unknown
} -
Location:
-
Unknown
-
- -
-
- -
-
-
+
Location:
+
Unknown
+
+ +
+
+ +
+
+
} -
-
-
-
-
- -
- -
- - - - - - -
-
-
-
- - - - - - - - - - - @foreach (var callProtocol in Model.Call.Protocols) + + +
+
+
+ +
+ +
+ + + + + + +
+
+
+
+
CodeNameTextAttachments
+ + + + + + + + + + @foreach (var callProtocol in Model.Call.Protocols) { var protocol = Model.Protocols.FirstOrDefault(x => x.DispatchProtocolId == callProtocol.DispatchProtocolId); if (protocol != null) { - - - - - + + + + - + + } } - -
CodeNameTextAttachments
- @protocol.Code - - @protocol.Name - - View Text - - @if (protocol.Attachments != null && protocol.Attachments.Any()) +
+ @protocol.Code + + @protocol.Name + + View Text + + @if (protocol.Attachments != null && protocol.Attachments.Any()) { foreach (var attachment in protocol.Attachments) { -
-
@attachment.FileName
-
View
-
+
+
@attachment.FileName
+
View
+
} } else { - No Attachments + No Attachments } -
-
+ + +
+ @if (!String.IsNullOrWhiteSpace(Model.Call.CallFormData)) + { +
+
+
+ }
-
-
-
-
-
-
-
+
+
+
+
+ + +
-
-
-
- @if (!String.IsNullOrWhiteSpace(Model.Call.GeoLocationData)) +
+
+
+ @if (!String.IsNullOrWhiteSpace(Model.Call.GeoLocationData)) { -
-
-
- Route - - +
+
+
} -
-
-

Notes

-
-
- -
- -
- - - - - - -
-
-
-
-
-
-
+
+
+

Notes

+
+
+ +
+ +
+ + + + + + +
+
+
+
+
+
+
@section Scripts { + diff --git a/Web/Resgrid.WebCore/Areas/User/Views/Forms/Index.cshtml b/Web/Resgrid.WebCore/Areas/User/Views/Forms/Index.cshtml new file mode 100644 index 00000000..d5d76749 --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Views/Forms/Index.cshtml @@ -0,0 +1,122 @@ +@using Resgrid.Model +@using Resgrid.Web.Helpers +@model Resgrid.WebCore.Areas.User.Models.Forms.FormIndexModel +@{ + ViewBag.Title = "Resgrid | Forms"; +} + +
+
+

Forms

+ +
+ @if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) + { +
+
+ New Form +
+
+ } +
+ +
+
+
+
+
+
+ + + + + + + + + + + + @foreach (var t in Model.Forms) + { + + + + + + + + } + +
+ Name + + Type + + Active + + Created On + + Action +
+ @t.Name + + @if (t.Type == 0) + { + New Call Form + } + + @if (t.IsActive) + { + Yes + } + else + { + No + } + + @Html.Raw(t.CreatedOn.ToShortDateString()) + + + + View + + @if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) + { + if (t.IsActive) + { + Disable + } + else + { + Enable + } + Delete + } +
+
+
+
+
+
+
+ +
+
+
+ You can only have 1 New Call Form type active at a time. +
+
+
+ +@section Scripts +{ + +} diff --git a/Web/Resgrid.WebCore/Areas/User/Views/Forms/New.cshtml b/Web/Resgrid.WebCore/Areas/User/Views/Forms/New.cshtml new file mode 100644 index 00000000..1f345b60 --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Views/Forms/New.cshtml @@ -0,0 +1,117 @@ +@using Resgrid.Model +@model Resgrid.WebCore.Areas.User.Models.Forms.NewFormModel +@{ + ViewBag.Title = "Resgrid | New Form"; +} + +
+
+

New Form

+ +
+
+ +
+
+
+
+
+ + +
+
+ @if (!String.IsNullOrEmpty(Model.Message)) + { +
+ @Model.Message +
+ } + @Html.AntiForgeryToken() + @Html.HiddenFor(m => m.Data) +
+
+
+ +
+ +
+ @Html.TextBoxFor(m => m.FormName, new { @class = "form-control", autofocus = "autofocus" }) +
+
+
+ +
+ @Html.DropDownListFor(m => m.FormType, Model.FormTypes) +
+
+
+ +
+
+
+
+
+ +
+
+
You will need to match the field names specificed above with the fields you want to operate on. Leave the field value blank for any value.
+
+
+
+ + + + + + + + + + + + + + + +
Field NameField ValueOperationCall Value Add Automation
+
+
+
+
+
+
+ Cancel + +
+
+ +
+
+
+
+
+ + +@section Scripts +{ + + +} diff --git a/Web/Resgrid.WebCore/Areas/User/Views/Forms/View.cshtml b/Web/Resgrid.WebCore/Areas/User/Views/Forms/View.cshtml new file mode 100644 index 00000000..524453e1 --- /dev/null +++ b/Web/Resgrid.WebCore/Areas/User/Views/Forms/View.cshtml @@ -0,0 +1,76 @@ +@using Resgrid.Model +@model Resgrid.WebCore.Areas.User.Models.Forms.ViewFormModel +@{ + ViewBag.Title = "Resgrid | View Form"; +} + +
+
+

View Form

+ +
+
+ +
+
+
+
+
+
+
+ +
+ @Model.Form.Name +
+
+
+ +
+ @if (Model.Form.Type == 0) + { + New Call Form + } +
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + +@section Scripts +{ + + +} diff --git a/Web/Resgrid.WebCore/Areas/User/Views/Home/Dashboard.cshtml b/Web/Resgrid.WebCore/Areas/User/Views/Home/Dashboard.cshtml index 89e3dbaa..69aac4e3 100644 --- a/Web/Resgrid.WebCore/Areas/User/Views/Home/Dashboard.cshtml +++ b/Web/Resgrid.WebCore/Areas/User/Views/Home/Dashboard.cshtml @@ -102,7 +102,7 @@
diff --git a/Web/Resgrid.WebCore/Areas/User/Views/Home/_UserActionsPartial.cshtml b/Web/Resgrid.WebCore/Areas/User/Views/Home/_UserActionsPartial.cshtml index 1c4ad375..4052fa6d 100644 --- a/Web/Resgrid.WebCore/Areas/User/Views/Home/_UserActionsPartial.cshtml +++ b/Web/Resgrid.WebCore/Areas/User/Views/Home/_UserActionsPartial.cshtml @@ -7,7 +7,7 @@
@@ -54,4 +54,4 @@ else }
-} \ No newline at end of file +} diff --git a/Web/Resgrid.WebCore/Areas/User/Views/Notes/View.cshtml b/Web/Resgrid.WebCore/Areas/User/Views/Notes/View.cshtml index 92581751..cbe8c1b8 100644 --- a/Web/Resgrid.WebCore/Areas/User/Views/Notes/View.cshtml +++ b/Web/Resgrid.WebCore/Areas/User/Views/Notes/View.cshtml @@ -1,7 +1,7 @@ @using Resgrid.Web.Helpers @model Resgrid.Web.Areas.User.Models.Notes.ViewNoteView @{ - ViewBag.Title = "Resgrid | View Note"; + ViewBag.Title = "Resgrid | View Note"; } @section Styles @@ -10,77 +10,77 @@ }
-
-

View Note

- -
- @if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) - { - - } +
+

View Note

+ +
+ @if (ClaimsAuthorizationHelper.IsUserDepartmentAdmin()) + { + + }
-
-
-
+
+
+
-
-
- -
-
- @Model.Note.AddedOn.TimeConverter(Model.Department).ToShortDateString() -

- @Model.Note.Title -

-
-

- @Html.Raw(Model.Note.Body) -

-
-
-
-
Category:
- @Model.Note.Category -
-
-
-
- @if (Model.Note.IsAdminOnly) - { - Viewable by Admins Only - } - else - { - Viewable by Everyone - } -
-
-
-
-
-
-
+
+
+ +
+
+ @Model.Note.AddedOn.TimeConverter(Model.Department).ToShortDateString() +

+ @Model.Note.Title +

+
+

+ @Html.Raw(Model.Note.Body) +

+
+
+
+
Category:
+ @Model.Note.Category +
+
+
+
+ @if (Model.Note.IsAdminOnly) + { + Viewable by Admins Only + } + else + { + Viewable by Everyone + } +
+
+
+
+
+
+
@section Scripts { - -} \ No newline at end of file + +} diff --git a/Web/Resgrid.WebCore/Areas/User/Views/Shared/_TopNavbar.cshtml b/Web/Resgrid.WebCore/Areas/User/Views/Shared/_TopNavbar.cshtml index bb07a593..1e8935cd 100644 --- a/Web/Resgrid.WebCore/Areas/User/Views/Shared/_TopNavbar.cshtml +++ b/Web/Resgrid.WebCore/Areas/User/Views/Shared/_TopNavbar.cshtml @@ -14,30 +14,32 @@ \\n \\n \\n \\n \\n
\\n
\\n
\\n
\\n
\\n \\n \\n \\n \\n
\\n \\n
\\n
\\n
\\n
\\n \\n \\n \\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/templates/propertyEditors/propertyeditor-triggersitems.html\":\n/*!*************************************************************************!*\\\n !*** ./src/templates/propertyEditors/propertyeditor-triggersitems.html ***!\n \\*************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/templates/questionEditors/questioneditor.html\":\n/*!***********************************************************!*\\\n !*** ./src/templates/questionEditors/questioneditor.html ***!\n \\***********************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\";\n\n/***/ }),\n\n/***/ \"./src/templates/tabs.html\":\n/*!*********************************!*\\\n !*** ./src/templates/tabs.html ***!\n \\*********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = \"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/templates/toolbar.html\":\n/*!************************************!*\\\n !*** ./src/templates/toolbar.html ***!\n \\************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/textWorker.ts\":\n/*!***************************!*\\\n !*** ./src/textWorker.ts ***!\n \\***************************/\n/*! exports provided: SurveyTextWorker */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyTextWorker\", function() { return SurveyTextWorker; });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ \"./src/entries/helpers.ts\");\n/* harmony import */ var _json5__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./json5 */ \"./src/json5.ts\");\n/* harmony import */ var survey_knockout__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! survey-knockout */ \"survey-knockout\");\n/* harmony import */ var survey_knockout__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(survey_knockout__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\nvar SurveyForTextWorker = /** @class */ (function (_super) {\n Object(tslib__WEBPACK_IMPORTED_MODULE_0__[\"__extends\"])(SurveyForTextWorker, _super);\n function SurveyForTextWorker(jsonObj) {\n return _super.call(this, jsonObj) || this;\n }\n Object.defineProperty(SurveyForTextWorker.prototype, \"isDesignMode\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n return SurveyForTextWorker;\n}(survey_knockout__WEBPACK_IMPORTED_MODULE_2__[\"Survey\"]));\nvar SurveyTextWorker = /** @class */ (function () {\n function SurveyTextWorker(text) {\n this.text = text;\n if (!this.text || this.text.trim() == \"\") {\n this.text = \"{}\";\n }\n this.errors = [];\n this.process();\n }\n Object.defineProperty(SurveyTextWorker.prototype, \"survey\", {\n get: function () {\n return this.surveyValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyTextWorker.prototype, \"isJsonCorrect\", {\n get: function () {\n return this.surveyValue != null;\n },\n enumerable: false,\n configurable: true\n });\n SurveyTextWorker.prototype.process = function () {\n try {\n this.jsonValue = new _json5__WEBPACK_IMPORTED_MODULE_1__[\"SurveyJSON5\"](1).parse(this.text);\n }\n catch (error) {\n this.errors.push({\n pos: { start: error.at, end: -1 },\n text: error.message\n });\n }\n if (this.jsonValue != null) {\n this.updateJsonPositions(this.jsonValue);\n var pureJsonValue = new _json5__WEBPACK_IMPORTED_MODULE_1__[\"SurveyJSON5\"]().parse(this.text);\n this.surveyValue = new SurveyForTextWorker(pureJsonValue);\n if (this.surveyValue.jsonErrors != null) {\n for (var i = 0; i < this.surveyValue.jsonErrors.length; i++) {\n var error = this.surveyValue.jsonErrors[i];\n this.errors.push({\n pos: { start: error.at, end: -1 },\n text: error.getFullDescription()\n });\n }\n }\n }\n this.surveyObjects = this.createSurveyObjects();\n this.setEditorPositionByChartAt(this.surveyObjects);\n this.setEditorPositionByChartAt(this.errors);\n };\n SurveyTextWorker.prototype.updateJsonPositions = function (jsonObj) {\n jsonObj[\"pos\"][\"self\"] = jsonObj;\n for (var key in jsonObj) {\n var obj = jsonObj[key];\n if (obj && obj[\"pos\"]) {\n jsonObj[\"pos\"][key] = obj[\"pos\"];\n this.updateJsonPositions(obj);\n }\n }\n };\n SurveyTextWorker.prototype.createSurveyObjects = function () {\n var result = [];\n if (this.surveyValue == null)\n return result;\n for (var i = 0; i < this.surveyValue.pages.length; i++) {\n var page = this.surveyValue.pages[i];\n if (i == 0 && !page[\"pos\"]) {\n page[\"pos\"] = this.surveyValue[\"pos\"];\n }\n result.push(page);\n for (var j = 0; j < page.questions.length; j++) {\n result.push(page.questions[j]);\n }\n }\n return result;\n };\n SurveyTextWorker.prototype.setEditorPositionByChartAt = function (objects) {\n if (objects == null || objects.length == 0)\n return;\n var position = { row: 0, column: 0 };\n var atObjectsArray = this.getAtArray(objects);\n var startAt = 0;\n for (var i = 0; i < atObjectsArray.length; i++) {\n var at = atObjectsArray[i].at;\n position = this.getPostionByChartAt(position, startAt, at);\n var obj = atObjectsArray[i].obj;\n if (!obj.position)\n obj.position = {};\n if (at == obj.pos.start) {\n obj.position.start = position;\n }\n else {\n if (at == obj.pos.end) {\n obj.position.end = position;\n }\n }\n startAt = at;\n }\n };\n SurveyTextWorker.prototype.getPostionByChartAt = function (startPosition, startAt, at) {\n var result = { row: startPosition.row, column: startPosition.column };\n var curChar = startAt;\n while (curChar < at) {\n if (this.text.charAt(curChar) == SurveyTextWorker.newLineChar) {\n result.row++;\n result.column = 0;\n }\n else {\n result.column++;\n }\n curChar++;\n }\n return result;\n };\n SurveyTextWorker.prototype.getAtArray = function (objects) {\n var result = [];\n for (var i = 0; i < objects.length; i++) {\n var obj = objects[i];\n var pos = obj.pos;\n if (!pos)\n continue;\n result.push({ at: pos.start, obj: obj });\n if (pos.end > 0) {\n result.push({ at: pos.end, obj: obj });\n }\n }\n return result.sort(function (el1, el2) {\n if (el1.at > el2.at)\n return 1;\n if (el1.at < el2.at)\n return -1;\n return 0;\n });\n };\n return SurveyTextWorker;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/toolbox.ts\":\n/*!************************!*\\\n !*** ./src/toolbox.ts ***!\n \\************************/\n/*! exports provided: QuestionToolbox */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionToolbox\", function() { return QuestionToolbox; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_knockout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-knockout */ \"survey-knockout\");\n/* harmony import */ var survey_knockout__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(survey_knockout__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _editorLocalization__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./editorLocalization */ \"./src/editorLocalization.ts\");\n\n\n\n/**\n * The list of Toolbox items.\n */\nvar QuestionToolbox = /** @class */ (function () {\n function QuestionToolbox(supportedQuestions, creator) {\n if (supportedQuestions === void 0) { supportedQuestions = null; }\n if (creator === void 0) { creator = null; }\n this.creator = creator;\n this._orderedQuestions = [\n \"text\",\n \"checkbox\",\n \"radiogroup\",\n \"dropdown\",\n \"comment\",\n \"rating\",\n \"ranking\",\n \"imagepicker\",\n \"boolean\",\n \"image\",\n \"html\",\n \"signaturepad\",\n ];\n this._questionDefaultSettings = {\n imagepicker: function () {\n return {\n choices: [\n {\n value: \"lion\",\n imageLink: \"https://surveyjs.io/Content/Images/examples/image-picker/lion.jpg\",\n },\n {\n value: \"giraffe\",\n imageLink: \"https://surveyjs.io/Content/Images/examples/image-picker/giraffe.jpg\",\n },\n {\n value: \"panda\",\n imageLink: \"https://surveyjs.io/Content/Images/examples/image-picker/panda.jpg\",\n },\n {\n value: \"camel\",\n imageLink: \"https://surveyjs.io/Content/Images/examples/image-picker/camel.jpg\",\n },\n ],\n };\n },\n image: function () {\n return {\n imageLink: \"https://surveyjs.io/Content/Images/examples/image-picker/lion.jpg\",\n };\n },\n };\n /**\n * The maximum number of copied toolbox items. If an user adding copiedItemMaxCount + 1 item, the first added item will be removed.\n */\n this.copiedItemMaxCount = 3;\n this.allowExpandMultipleCategoriesValue = false;\n this.keepAllCategoriesExpandedValue = false;\n this.itemsValue = [];\n this.koItems = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observableArray\"]();\n this.koCategories = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observableArray\"]();\n this.koActiveCategory = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](\"\");\n this.koHasCategories = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](false);\n this.koCanCollapseCategories = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](true);\n this.createDefaultItems(supportedQuestions);\n var self = this;\n this.koActiveCategory.subscribe(function (newValue) {\n for (var i = 0; i < self.koCategories().length; i++) {\n var category = self.koCategories()[i];\n category.koCollapsed(category.name !== newValue);\n }\n });\n }\n Object.defineProperty(QuestionToolbox.prototype, \"orderedQuestions\", {\n /**\n * Modify this array to change the toolbox items order.\n */\n get: function () {\n return this._orderedQuestions;\n },\n set: function (questions) {\n this._orderedQuestions = questions;\n this.reorderItems();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionToolbox.prototype, \"jsonText\", {\n /**\n * The Array of Toolbox items as Text JSON.\n */\n get: function () {\n return JSON.stringify(this.itemsValue);\n },\n set: function (value) {\n this.itemsValue = value ? JSON.parse(value) : [];\n this.onItemsChanged();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionToolbox.prototype, \"copiedJsonText\", {\n /**\n * The Array of copied Toolbox items as Text JSON.\n */\n get: function () {\n return JSON.stringify(this.copiedItems);\n },\n set: function (value) {\n var newItems = value ? JSON.parse(value) : [];\n this.clearCopiedItems();\n for (var i = 0; i < newItems.length; i++) {\n newItems[i].isCopied = true;\n this.addItem(newItems[i]);\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionToolbox.prototype, \"items\", {\n /**\n * The Array of Toolbox items.\n */\n get: function () {\n return this.itemsValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionToolbox.prototype, \"itemNames\", {\n get: function () {\n var res = [];\n for (var i = 0; i < this.items.length; i++) {\n res.push(this.items[i].name);\n }\n return res;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionToolbox.prototype, \"copiedItems\", {\n /**\n * The Array of copied Toolbox items\n */\n get: function () {\n var result = [];\n for (var i = 0; i < this.itemsValue.length; i++) {\n if (this.itemsValue[i].isCopied)\n result.push(this.itemsValue[i]);\n }\n return result;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Add toolbox items into the Toolbox\n * @param items the list of new items\n * @param clearAll set it to true to clear all previous items.\n */\n QuestionToolbox.prototype.addItems = function (items, clearAll) {\n if (clearAll === void 0) { clearAll = false; }\n if (clearAll) {\n this.clearItems();\n }\n for (var i = 0; i < items.length; i++) {\n this.itemsValue.push(items[i]);\n }\n this.onItemsChanged();\n };\n /**\n * Add a copied Question into Toolbox\n * @param question a copied Survey.Question\n * @param options a json object that allows you to override question properties. Attributes are: name, title, tooltip, isCopied, iconName, json and category.\n */\n QuestionToolbox.prototype.addCopiedItem = function (question, options) {\n if (options === void 0) { options = null; }\n if (!options)\n options = {};\n var name = !!options.name ? options.name : question.name;\n var title = !!options.title ? options.title : name;\n var tooltip = !!options.tooltip ? options.tooltip : title;\n var item = {\n id: name,\n name: name,\n title: title,\n tooltip: tooltip,\n isCopied: options.isCopied !== false,\n iconName: !!options.iconName ? options.iconName : \"icon-default\",\n json: !!options.json ? options.json : this.getQuestionJSON(question),\n category: !!options.category ? options.category : \"\",\n };\n if (this.replaceItem(item))\n return;\n var copied = this.copiedItems;\n if (this.copiedItemMaxCount > 0 && copied.length == this.copiedItemMaxCount)\n this.removeItem(copied[this.copiedItemMaxCount - 1].name);\n this.addItem(item);\n };\n /**\n * Add a toolbox item\n * @param item the toolbox item description\n * @param index the toolbox index to place the item, the item is added to the end if index not passed\n * @see IQuestionToolboxItem\n */\n QuestionToolbox.prototype.addItem = function (item, index) {\n this.correctItem(item);\n if (index === undefined) {\n this.itemsValue.push(item);\n }\n else {\n this.itemsValue.splice(index, 0, item);\n }\n this.onItemsChanged();\n };\n QuestionToolbox.prototype.correctItem = function (item) {\n if (!item.title)\n item.title = item.name;\n if (!item.tooltip)\n item.tooltip = item.title;\n };\n /**\n * Add a new toolbox item, add delete the old item with the same name\n * @param item the toolbox item description\n * @see IQuestionToolboxItem\n */\n QuestionToolbox.prototype.replaceItem = function (item) {\n this.correctItem(item);\n var index = this.indexOf(item.name);\n if (index < 0)\n return;\n this.itemsValue[index] = item;\n this.onItemsChanged();\n return true;\n };\n /**\n * Remove a toolbox item by its name\n * @param name toolbox item name\n * @see IQuestionToolboxItem\n */\n QuestionToolbox.prototype.removeItem = function (name) {\n var index = this.indexOf(name);\n if (index < 0)\n return false;\n this.itemsValue.splice(index, 1);\n this.onItemsChanged();\n return true;\n };\n /**\n * Remove all toolbox items.\n */\n QuestionToolbox.prototype.clearItems = function () {\n this.itemsValue = [];\n this.onItemsChanged();\n };\n /**\n * Remove all copied toolbox items.\n */\n QuestionToolbox.prototype.clearCopiedItems = function () {\n var removedItems = this.copiedItems;\n for (var i = 0; i < removedItems.length; i++) {\n this.removeItem(removedItems[i].name);\n }\n };\n /**\n * Returns toolbox item by its name. Returns null if there is no toolbox item with this name\n * @param name\n */\n QuestionToolbox.prototype.getItemByName = function (name) {\n var index = this.indexOf(name);\n return index > -1 ? this.itemsValue[index] : null;\n };\n Object.defineProperty(QuestionToolbox.prototype, \"allowExpandMultipleCategories\", {\n /**\n * Set it to true, to allow end-user to expand more than one category. There will no active category in this case\n * @see activeCategory\n */\n get: function () {\n return this.allowExpandMultipleCategoriesValue;\n },\n set: function (val) {\n this.allowExpandMultipleCategoriesValue = val;\n this.updateCategoriesState();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionToolbox.prototype, \"keepAllCategoriesExpanded\", {\n /**\n * Set it to true to expand all categories and hide expand/collapse category buttons\n */\n get: function () {\n return this.keepAllCategoriesExpandedValue;\n },\n set: function (val) {\n this.keepAllCategoriesExpandedValue = val;\n this.koCanCollapseCategories(!this.keepAllCategoriesExpanded);\n this.updateCategoriesState();\n },\n enumerable: false,\n configurable: true\n });\n QuestionToolbox.prototype.updateCategoriesState = function () {\n var noActive = this.allowExpandMultipleCategories || this.keepAllCategoriesExpanded;\n if (noActive) {\n this.activeCategory = \"\";\n if (this.keepAllCategoriesExpanded) {\n this.expandAllCategories();\n }\n }\n else {\n if (this.koCategories().length > 0) {\n this.activeCategory = this.koCategories()[0].name;\n }\n }\n };\n /**\n * Change the category of the toolbox item\n * @param name the toolbox item name\n * @param category new category name\n */\n QuestionToolbox.prototype.changeCategory = function (name, category) {\n this.changeCategories([{ name: name, category: category }]);\n };\n /**\n * Change categories for several toolbox items.\n * @param changedItems the array of objects {name: \"your toolbox item name\", category: \"new category name\"}\n */\n QuestionToolbox.prototype.changeCategories = function (changedItems) {\n for (var i = 0; i < changedItems.length; i++) {\n var item = changedItems[i];\n var toolboxItem = this.getItemByName(item.name);\n if (toolboxItem) {\n toolboxItem.category = item.category;\n }\n }\n this.onItemsChanged();\n };\n Object.defineProperty(QuestionToolbox.prototype, \"activeCategory\", {\n /**\n * Set and get and active category. This property doesn't work if allowExpandMultipleCategories is true. Its default value is empty.\n * @see allowExpandMultipleCategories\n * @see expandCategory\n * @see collapseCategory\n */\n get: function () {\n return this.koActiveCategory();\n },\n set: function (val) {\n this.koActiveCategory(val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionToolbox.prototype.doCategoryClick = function (categoryName) {\n if (this.keepAllCategoriesExpanded)\n return;\n if (this.allowExpandMultipleCategories) {\n var category = this.getCategoryByName(categoryName);\n if (category) {\n category.koCollapsed(!category.koCollapsed());\n }\n }\n else {\n this.activeCategory = categoryName;\n }\n };\n /**\n * Expand a category by its name. If allowExpandMultipleCategories is false (default value), all other categories become collapsed\n * @param categoryName the category name\n * @see allowExpandMultipleCategories\n * @see collapseCategory\n */\n QuestionToolbox.prototype.expandCategory = function (categoryName) {\n if (this.allowExpandMultipleCategories) {\n var category = this.getCategoryByName(categoryName);\n if (category) {\n category.koCollapsed(false);\n }\n }\n else {\n this.activeCategory = categoryName;\n }\n };\n /**\n * Collapse a category by its name. If allowExpandMultipleCategories is false (default value) this function does nothing\n * @param categoryName the category name\n * @see allowExpandMultipleCategories\n */\n QuestionToolbox.prototype.collapseCategory = function (categoryName) {\n if (!this.allowExpandMultipleCategories)\n return;\n var category = this.getCategoryByName(categoryName);\n if (category) {\n category.koCollapsed(true);\n }\n };\n /**\n * Expand all categories. If allowExpandMultipleCategories is false (default value) this function does nothing\n * @see allowExpandMultipleCategories\n */\n QuestionToolbox.prototype.expandAllCategories = function () {\n this.expandCollapseAllCategories(false);\n };\n /**\n * Collapse all categories. If allowExpandMultipleCategories is false (default value) this function does nothing\n * @see allowExpandMultipleCategories\n */\n QuestionToolbox.prototype.collapseAllCategories = function () {\n this.expandCollapseAllCategories(true);\n };\n QuestionToolbox.prototype.expandCollapseAllCategories = function (isCollapsed) {\n var categories = this.koCategories();\n for (var i = 0; i < categories.length; i++) {\n categories[i].koCollapsed(isCollapsed);\n }\n };\n QuestionToolbox.prototype.getCategoryByName = function (categoryName) {\n var categories = this.koCategories();\n for (var i = 0; i < categories.length; i++) {\n var category = categories[i];\n if (category.name === categoryName)\n return category;\n }\n return null;\n };\n QuestionToolbox.prototype.onItemsChanged = function () {\n this.koItems([]);\n this.koItems(this.itemsValue);\n var categories = [];\n var categoriesHash = {};\n var prevActiveCategory = this.koActiveCategory();\n var self = this;\n for (var i = 0; i < this.itemsValue.length; i++) {\n var item = this.itemsValue[i];\n var categoryName = item.category\n ? item.category\n : _editorLocalization__WEBPACK_IMPORTED_MODULE_2__[\"editorLocalization\"].getString(\"ed.toolboxGeneralCategory\");\n if (!categoriesHash[categoryName]) {\n var category = {\n name: categoryName,\n items: [],\n koCollapsed: knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](categoryName !== prevActiveCategory &&\n !this.keepAllCategoriesExpanded),\n expand: function () {\n self.doCategoryClick(this.name);\n },\n };\n categoriesHash[categoryName] = category;\n categories.push(category);\n }\n categoriesHash[categoryName].items.push(item);\n }\n this.koCategories(categories);\n if (!this.keepAllCategoriesExpanded) {\n if (!this.allowExpandMultipleCategories) {\n if (prevActiveCategory && categoriesHash[prevActiveCategory]) {\n this.koActiveCategory(prevActiveCategory);\n }\n else {\n this.koActiveCategory(categories.length > 0 ? categories[0].name : \"\");\n }\n }\n else {\n if (categories.length > 0) {\n categories[0].koCollapsed(false);\n }\n }\n }\n this.koHasCategories(categories.length > 1);\n };\n QuestionToolbox.prototype.indexOf = function (name) {\n for (var i = 0; i < this.itemsValue.length; i++) {\n if (this.itemsValue[i].name == name)\n return i;\n }\n return -1;\n };\n QuestionToolbox.prototype.reorderItems = function () {\n var _this = this;\n this.itemsValue.sort(function (i1, i2) {\n var index1 = _this._orderedQuestions.indexOf(i1.name);\n if (index1 === -1)\n index1 = Number.MAX_VALUE;\n var index2 = _this._orderedQuestions.indexOf(i2.name);\n if (index2 === -1)\n index2 = Number.MAX_VALUE;\n return index1 - index2;\n });\n this.onItemsChanged();\n };\n QuestionToolbox.prototype.createDefaultItems = function (supportedQuestions) {\n this.clearItems();\n var questions = this.getQuestionTypes(supportedQuestions);\n for (var i = 0; i < questions.length; i++) {\n var name = questions[i];\n var question = survey_knockout__WEBPACK_IMPORTED_MODULE_1__[\"ElementFactory\"].Instance.createElement(name, \"q1\");\n if (!question) {\n question = survey_knockout__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].createClass(name);\n }\n var json = this.getQuestionJSON(question);\n var title = _editorLocalization__WEBPACK_IMPORTED_MODULE_2__[\"editorLocalization\"].getString(\"qt.\" + name);\n var item = {\n id: name,\n name: name,\n iconName: \"icon-\" + name,\n title: title,\n tooltip: title,\n json: json,\n isCopied: false,\n category: \"\",\n };\n this.itemsValue.push(item);\n }\n this.registerCustomWidgets();\n this.registerComponentQuestions();\n this.onItemsChanged();\n };\n QuestionToolbox.prototype.registerCustomWidgets = function () {\n var inst = survey_knockout__WEBPACK_IMPORTED_MODULE_1__[\"CustomWidgetCollection\"].Instance;\n if (!inst.getActivatedBy)\n return;\n var widgets = inst.widgets;\n for (var i = 0; i < widgets.length; i++) {\n if (inst.getActivatedBy(widgets[i].name) != \"customtype\")\n continue;\n var widgetJson = widgets[i].widgetJson;\n if (!widgetJson.widgetIsLoaded || !widgetJson.widgetIsLoaded())\n continue;\n this.addItemFromJSON(widgetJson);\n }\n };\n QuestionToolbox.prototype.registerComponentQuestions = function () {\n var items = this.getComponentItems();\n for (var i = 0; i < items.length; i++) {\n this.addItemFromJSON(items[i].json);\n }\n };\n QuestionToolbox.prototype.getComponentItems = function () {\n var instanceOwner = survey_knockout__WEBPACK_IMPORTED_MODULE_1__[\"CustomQuestionCollection\"];\n if (!instanceOwner) {\n instanceOwner = survey_knockout__WEBPACK_IMPORTED_MODULE_1__[\"ComponentCollection\"];\n }\n if (!instanceOwner)\n return [];\n var items = instanceOwner.Instance[\"items\"];\n return !!items ? items : [];\n };\n QuestionToolbox.prototype.addItemFromJSON = function (json) {\n var iconName = json.iconName ? json.iconName : \"icon-default\";\n var title = _editorLocalization__WEBPACK_IMPORTED_MODULE_2__[\"editorLocalization\"].getString(\"qt.\" + json.name);\n if (!title || title == json.name) {\n title = json.title;\n }\n if (!title) {\n title = json.name;\n }\n var elementJson = json.defaultJSON ? json.defaultJSON : {};\n if (!elementJson.type) {\n elementJson.type = json.name;\n }\n var category = json.category ? json.category : \"\";\n var item = {\n id: json.name,\n name: json.name,\n iconName: iconName,\n title: title,\n tooltip: title,\n json: elementJson,\n isCopied: false,\n category: category,\n };\n this.itemsValue.push(item);\n };\n QuestionToolbox.prototype.getQuestionJSON = function (question) {\n var json = new survey_knockout__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]().toJsonObject(question);\n json.type = question.getType();\n if (!!this._questionDefaultSettings[json.type]) {\n var defaultSettings = this._questionDefaultSettings[json.type]();\n for (var key in defaultSettings) {\n json[key] = defaultSettings[key];\n }\n }\n return json;\n };\n QuestionToolbox.prototype.getQuestionTypes = function (supportedQuestions) {\n var allTypes = survey_knockout__WEBPACK_IMPORTED_MODULE_1__[\"ElementFactory\"].Instance.getAllTypes();\n if (!supportedQuestions || supportedQuestions.length == 0)\n supportedQuestions = allTypes;\n var questions = [];\n for (var i = 0; i < this.orderedQuestions.length; i++) {\n var name_1 = this.orderedQuestions[i];\n if (supportedQuestions.indexOf(name_1) > -1 && allTypes.indexOf(name_1) > -1)\n questions.push(name_1);\n }\n for (var i = 0; i < supportedQuestions.length; i++) {\n var name_2 = supportedQuestions[i];\n if (questions.indexOf(supportedQuestions[i]) < 0 &&\n allTypes.indexOf(name_2) > -1)\n questions.push(name_2);\n }\n return questions;\n };\n QuestionToolbox.prototype.dispose = function () { };\n return QuestionToolbox;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/undoredomanager.ts\":\n/*!********************************!*\\\n !*** ./src/undoredomanager.ts ***!\n \\********************************/\n/*! exports provided: UndoRedoManager, Transaction, UndoRedoAction, Action, ArrayAction */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"UndoRedoManager\", function() { return UndoRedoManager; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Transaction\", function() { return Transaction; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"UndoRedoAction\", function() { return UndoRedoAction; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Action\", function() { return Action; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ArrayAction\", function() { return ArrayAction; });\n/* harmony import */ var survey_knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-knockout */ \"survey-knockout\");\n/* harmony import */ var survey_knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(survey_knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _propertyEditors_editableObject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./propertyEditors/editableObject */ \"./src/propertyEditors/editableObject.ts\");\n\n\nvar UndoRedoManager = /** @class */ (function () {\n function UndoRedoManager() {\n this._ignoreChanges = false;\n this._preparingTransaction = null;\n this._transactions = [];\n this._currentTransactionIndex = -1;\n this.transactionCounter = 0;\n }\n UndoRedoManager.prototype.onPropertyValueChanged = function (name, oldValue, newValue, sender, arrayChanges) {\n if (!this.hasPropertyInSerializer(sender, name))\n return;\n if (_propertyEditors_editableObject__WEBPACK_IMPORTED_MODULE_1__[\"EditableObject\"].isCopyObject(sender))\n return;\n if (this._ignoreChanges)\n return;\n var transaction = this._preparingTransaction;\n var action = arrayChanges\n ? new ArrayAction(name, sender, arrayChanges)\n : new Action(name, oldValue, newValue, sender);\n if (!transaction) {\n transaction = new Transaction(name);\n transaction.addAction(action);\n this._addTransaction(transaction);\n return;\n }\n transaction.addAction(action);\n };\n UndoRedoManager.prototype.hasPropertyInSerializer = function (sender, propertyName) {\n return !!survey_knockout__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].findProperty(sender.getType(), propertyName);\n };\n UndoRedoManager.prototype.isCopyObject = function (sender) { };\n UndoRedoManager.prototype._cutOffTail = function () {\n if (this._currentTransactionIndex + 1 !== this._transactions.length) {\n this._transactions.length = this._currentTransactionIndex + 1;\n }\n };\n UndoRedoManager.prototype._addTransaction = function (transaction) {\n if (transaction.isEmpty())\n return;\n this._cutOffTail();\n this._transactions.push(transaction);\n this._currentTransactionIndex++;\n this.canUndoRedoCallback();\n };\n UndoRedoManager.prototype._getCurrentTransaction = function () {\n var index = this._currentTransactionIndex;\n var currentTransaction = this._transactions[index];\n return currentTransaction;\n };\n UndoRedoManager.prototype._getNextTransaction = function () {\n var index = this._currentTransactionIndex;\n var nextTransaction = this._transactions[index + 1];\n return nextTransaction;\n };\n UndoRedoManager.prototype.notifyChangesFinished = function (transaction) {\n if (transaction.actions.length > 0 && transaction.actions[0]) {\n !!this.changesFinishedCallback &&\n this.changesFinishedCallback(transaction.actions[0].changes);\n }\n };\n UndoRedoManager.prototype.canUndoRedoCallback = function () { };\n UndoRedoManager.prototype.startTransaction = function (name) {\n this.transactionCounter++;\n if (this._preparingTransaction)\n return;\n this._preparingTransaction = new Transaction(name);\n };\n UndoRedoManager.prototype.stopTransaction = function () {\n if (this.transactionCounter > 0) {\n this.transactionCounter--;\n }\n if (!this._preparingTransaction || this.transactionCounter > 0)\n return;\n this._addTransaction(this._preparingTransaction);\n if (this.transactionCounter === 0) {\n this.notifyChangesFinished(this._preparingTransaction);\n }\n this._preparingTransaction = null;\n };\n UndoRedoManager.prototype.canUndo = function () {\n return !!this._getCurrentTransaction();\n };\n UndoRedoManager.prototype.undo = function () {\n var currentTransaction = this._getCurrentTransaction();\n if (!this.canUndo())\n return;\n this._ignoreChanges = true;\n currentTransaction.rollback();\n this._ignoreChanges = false;\n this._currentTransactionIndex--;\n this.canUndoRedoCallback();\n this.notifyChangesFinished(currentTransaction);\n };\n UndoRedoManager.prototype.canRedo = function () {\n return !!this._getNextTransaction();\n };\n UndoRedoManager.prototype.redo = function () {\n var nextTransaction = this._getNextTransaction();\n if (!this.canRedo())\n return;\n this._ignoreChanges = true;\n nextTransaction.apply();\n this._ignoreChanges = false;\n this._currentTransactionIndex++;\n this.canUndoRedoCallback();\n this.notifyChangesFinished(nextTransaction);\n };\n return UndoRedoManager;\n}());\n\nvar Transaction = /** @class */ (function () {\n function Transaction(_name) {\n this._name = _name;\n this._actions = [];\n }\n Transaction.prototype.apply = function () {\n var actions = this._actions;\n for (var index = 0; index < actions.length; index++) {\n var action = actions[index];\n action.apply();\n }\n };\n Transaction.prototype.rollback = function () {\n var actions = this._actions;\n for (var index = actions.length - 1; index >= 0; index--) {\n var action = actions[index];\n action.rollback();\n }\n };\n Transaction.prototype.addAction = function (action) {\n this._actions.push(action);\n };\n Transaction.prototype.isEmpty = function () {\n return this._actions.length === 0;\n };\n Object.defineProperty(Transaction.prototype, \"actions\", {\n get: function () {\n return this._actions;\n },\n enumerable: false,\n configurable: true\n });\n return Transaction;\n}());\n\nvar UndoRedoAction = /** @class */ (function () {\n function UndoRedoAction() {\n }\n UndoRedoAction.prototype.apply = function () { };\n UndoRedoAction.prototype.rollback = function () { };\n Object.defineProperty(UndoRedoAction.prototype, \"changes\", {\n get: function () {\n return {};\n },\n enumerable: false,\n configurable: true\n });\n return UndoRedoAction;\n}());\n\nvar Action = /** @class */ (function () {\n function Action(_propertyName, _oldValue, _newValue, _sender) {\n this._propertyName = _propertyName;\n this._oldValue = _oldValue;\n this._newValue = _newValue;\n this._sender = _sender;\n }\n Action.prototype.apply = function () {\n this._sender[this._propertyName] = this._newValue;\n };\n Action.prototype.rollback = function () {\n this._sender[this._propertyName] = this._oldValue;\n };\n Object.defineProperty(Action.prototype, \"changes\", {\n get: function () {\n return {\n object: this._sender,\n propertyName: this._propertyName,\n oldValue: this._oldValue,\n newValue: this._newValue\n };\n },\n enumerable: false,\n configurable: true\n });\n return Action;\n}());\n\nvar ArrayAction = /** @class */ (function () {\n function ArrayAction(_propertyName, _sender, arrayChanges) {\n this._propertyName = _propertyName;\n this._sender = _sender;\n this._index = 0;\n this._itemsToAdd = [];\n this._deletedItems = [];\n this._index = arrayChanges.index;\n this._itemsToAdd = arrayChanges.itemsToAdd;\n this._deletedItems = arrayChanges.deletedItems;\n }\n ArrayAction.prototype.apply = function () {\n this.rollback();\n };\n ArrayAction.prototype.rollback = function () {\n var array = this._sender[this._propertyName];\n var index = this._index;\n var deleteCount = this._itemsToAdd.length;\n var itemsToAdd = [].concat(this._deletedItems);\n this._deletedItems = array.splice.apply(array, [index, deleteCount].concat(itemsToAdd));\n this._itemsToAdd = [].concat(itemsToAdd);\n };\n Object.defineProperty(ArrayAction.prototype, \"changes\", {\n get: function () {\n return {\n object: this._sender,\n propertyName: this._propertyName,\n oldValue: this._deletedItems,\n newValue: this._itemsToAdd\n };\n },\n enumerable: false,\n configurable: true\n });\n return ArrayAction;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/utils/accordion.scss\":\n/*!**********************************!*\\\n !*** ./src/utils/accordion.scss ***!\n \\**********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./src/utils/accordion.ts\":\n/*!********************************!*\\\n !*** ./src/utils/accordion.ts ***!\n \\********************************/\n/*! exports provided: AccordionItemModel, AccordionViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AccordionItemModel\", function() { return AccordionItemModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AccordionViewModel\", function() { return AccordionViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _accordion_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./accordion.scss */ \"./src/utils/accordion.scss\");\n/* harmony import */ var _accordion_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_accordion_scss__WEBPACK_IMPORTED_MODULE_1__);\n\n\nvar template = __webpack_require__(/*! html-loader?interpolate!val-loader!./accordion.html */ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/utils/accordion.html\");\nvar AccordionItemModel = /** @class */ (function () {\n function AccordionItemModel(data) {\n var _this = this;\n this.data = data;\n this.collapsed = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](true);\n this.toggle = function () {\n _this.collapsed(!_this.collapsed());\n if (!_this.collapsed() && !!document) {\n var el = document.getElementById(\"editor_tab_id_\" + _this.data.name);\n if (!!_this.data.doOnExpanded) {\n _this.data.doOnExpanded();\n }\n if (!!el) {\n el.scrollIntoView(false);\n }\n }\n };\n var self = this;\n data.onExpand = function () {\n self.collapsed(false);\n };\n data.onCollapse = function () {\n self.collapsed(true);\n };\n }\n Object.defineProperty(AccordionItemModel.prototype, \"title\", {\n get: function () {\n return this.data.title;\n },\n enumerable: false,\n configurable: true\n });\n return AccordionItemModel;\n}());\n\nvar AccordionViewModel = /** @class */ (function () {\n function AccordionViewModel(params) {\n this.tabs = knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n var res = knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.tabs)\n .map(function (tabData) { return new AccordionItemModel(tabData); });\n if (res.length > 0) {\n res[0].collapsed(false);\n }\n return res;\n });\n this.showHeader = knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n return params.tabs().length > 1;\n });\n }\n return AccordionViewModel;\n}());\n\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"svd-accordion\", {\n viewModel: AccordionViewModel,\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/utils/boolean.html\":\n/*!********************************!*\\\n !*** ./src/utils/boolean.html ***!\n \\********************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\";\n\n/***/ }),\n\n/***/ \"./src/utils/boolean.scss\":\n/*!********************************!*\\\n !*** ./src/utils/boolean.scss ***!\n \\********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./src/utils/boolean.ts\":\n/*!******************************!*\\\n !*** ./src/utils/boolean.ts ***!\n \\******************************/\n/*! exports provided: BooleanViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BooleanViewModel\", function() { return BooleanViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _boolean_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./boolean.scss */ \"./src/utils/boolean.scss\");\n/* harmony import */ var _boolean_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_boolean_scss__WEBPACK_IMPORTED_MODULE_1__);\n\n\nvar templateHtml = __webpack_require__(/*! ./boolean.html */ \"./src/utils/boolean.html\");\nvar BooleanViewModel;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"svd-boolean\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var model = params.item;\n return model;\n }\n },\n template: templateHtml,\n});\n\n\n/***/ }),\n\n/***/ \"./src/utils/button.html\":\n/*!*******************************!*\\\n !*** ./src/utils/button.html ***!\n \\*******************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\n \\n
\\n \\n
\\n \\n \\n
\\n \\n
\\n \\n
\\n\";\n\n/***/ }),\n\n/***/ \"./src/utils/button.scss\":\n/*!*******************************!*\\\n !*** ./src/utils/button.scss ***!\n \\*******************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./src/utils/button.ts\":\n/*!*****************************!*\\\n !*** ./src/utils/button.ts ***!\n \\*****************************/\n/*! exports provided: ButtonViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ButtonViewModel\", function() { return ButtonViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _button_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./button.scss */ \"./src/utils/button.scss\");\n/* harmony import */ var _button_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_button_scss__WEBPACK_IMPORTED_MODULE_1__);\n\n\nvar templateHtml = __webpack_require__(/*! ./button.html */ \"./src/utils/button.html\");\nvar ButtonViewModel = /** @class */ (function () {\n function ButtonViewModel(item) {\n this.item = item;\n }\n Object.defineProperty(ButtonViewModel.prototype, \"disabled\", {\n get: function () {\n return this.item.enabled !== undefined && !knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](this.item.enabled);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonViewModel.prototype, \"hint\", {\n get: function () {\n return this.item.tooltip || this.item.title;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonViewModel.prototype, \"showTitle\", {\n get: function () {\n return this.item.showTitle === undefined || (!!this.item.iconName && !knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](this.item.showTitle));\n },\n enumerable: false,\n configurable: true\n });\n ButtonViewModel.prototype.action = function (model) {\n if (!model.disabled) {\n model.item.action();\n }\n };\n return ButtonViewModel;\n}());\n\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"svd-button\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return new ButtonViewModel(params.item);\n }\n },\n template: templateHtml,\n});\n\n\n/***/ }),\n\n/***/ \"./src/utils/custom-checkbox.scss\":\n/*!****************************************!*\\\n !*** ./src/utils/custom-checkbox.scss ***!\n \\****************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./src/utils/custom-select.scss\":\n/*!**************************************!*\\\n !*** ./src/utils/custom-select.scss ***!\n \\**************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./src/utils/ddmenu.scss\":\n/*!*******************************!*\\\n !*** ./src/utils/ddmenu.scss ***!\n \\*******************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./src/utils/designer-container.scss\":\n/*!*******************************************!*\\\n !*** ./src/utils/designer-container.scss ***!\n \\*******************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./src/utils/designer-container.ts\":\n/*!*****************************************!*\\\n !*** ./src/utils/designer-container.ts ***!\n \\*****************************************/\n/*! exports provided: DesignerContainerViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DesignerContainerViewModel\", function() { return DesignerContainerViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _designer_container_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./designer-container.scss */ \"./src/utils/designer-container.scss\");\n/* harmony import */ var _designer_container_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_designer_container_scss__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _editorLocalization__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../editorLocalization */ \"./src/editorLocalization.ts\");\n\n\n\nvar template = __webpack_require__(/*! html-loader?interpolate!val-loader!./designer-container.html */ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/utils/designer-container.html\");\nvar DesignerContainerViewModel = /** @class */ (function () {\n function DesignerContainerViewModel(params, componentInfo) {\n var _this = this;\n this.toggle = function () {\n var surfaceEl = (document.getElementsByClassName(\"svd_editors\")[0]);\n if (_this.visible()) {\n _this._prevWidth = _this._element.style.width;\n _this._prevSurfaceWidth = surfaceEl.style.width;\n surfaceEl.style.width = \"100%\";\n surfaceEl.style.maxWidth = \"none\";\n surfaceEl.style.flexBasis = \"auto\";\n // surfaceEl.style.width = surfaceEl.style.maxWidth = surfaceEl.style.flexBasis = \"\";\n }\n else {\n _this._element.style.width = _this._element.style.maxWidth = _this._element.style.flexBasis = _this._prevWidth;\n // surfaceEl.style.width = surfaceEl.style.maxWidth = surfaceEl.style.flexBasis = this._prevSurfaceWidth;\n }\n _this.visible(!_this.visible());\n };\n this.activeTab = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"]();\n this.className = \"svd-designer-container\";\n this.visible = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](true);\n this.isOpen = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](true);\n this._element = componentInfo.element;\n this.tabs = params.tabs;\n this.context = params.context;\n var changed = params.changed || knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"]();\n componentInfo.element.className += \" \" + params.className;\n if (knockout__WEBPACK_IMPORTED_MODULE_0__[\"isWritableObservable\"](params.visible)) {\n this.visible = params.visible;\n }\n if (knockout__WEBPACK_IMPORTED_MODULE_0__[\"isWritableObservable\"](params.activeTab)) {\n this.activeTab = params.activeTab;\n }\n if (!this.activeTab() && this.tabs.length > 0) {\n this.activeTab(this.tabs[0]);\n }\n this.size = knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n var isVisible = _this.visible();\n _this.isOpen(isVisible);\n return isVisible ? \"\" : 0;\n });\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n if (!_this.visible() || componentInfo.element.offsetWidth == 0) {\n componentInfo.element.style.width = _this.size();\n }\n });\n this._changedSubscription = changed.subscribe(function () {\n _this.isOpen(componentInfo.element.offsetWidth > 25);\n _this.visible(_this.isOpen());\n });\n }\n DesignerContainerViewModel.prototype.getLocString = function (str) {\n return _editorLocalization__WEBPACK_IMPORTED_MODULE_2__[\"editorLocalization\"].getString(str);\n };\n DesignerContainerViewModel.prototype.dispose = function () {\n this._changedSubscription.dispose();\n };\n Object.defineProperty(DesignerContainerViewModel.prototype, \"iconRightOpen\", {\n get: function () {\n return DesignerContainerViewModel.iconRightOpenName;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(DesignerContainerViewModel.prototype, \"iconRightClose\", {\n get: function () {\n return DesignerContainerViewModel.iconRightCloseName;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(DesignerContainerViewModel.prototype, \"iconLeftOpen\", {\n get: function () {\n return DesignerContainerViewModel.iconLeftOpenName;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(DesignerContainerViewModel.prototype, \"iconLeftClose\", {\n get: function () {\n return DesignerContainerViewModel.iconLeftCloseName;\n },\n enumerable: false,\n configurable: true\n });\n DesignerContainerViewModel.iconRightOpenName = \"icon-right-open\";\n DesignerContainerViewModel.iconRightCloseName = \"icon-right-close\";\n DesignerContainerViewModel.iconLeftOpenName = \"icon-left-open\";\n DesignerContainerViewModel.iconLeftCloseName = \"icon-left-close\";\n return DesignerContainerViewModel;\n}());\n\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"svd-designer-container\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return new DesignerContainerViewModel(params, componentInfo);\n }\n },\n template: template\n});\n\n\n/***/ }),\n\n/***/ \"./src/utils/designer-h-container.scss\":\n/*!*********************************************!*\\\n !*** ./src/utils/designer-h-container.scss ***!\n \\*********************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./src/utils/designer-h-container.ts\":\n/*!*******************************************!*\\\n !*** ./src/utils/designer-h-container.ts ***!\n \\*******************************************/\n/*! exports provided: DesignerHContainerViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DesignerHContainerViewModel\", function() { return DesignerHContainerViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _designer_h_container_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./designer-h-container.scss */ \"./src/utils/designer-h-container.scss\");\n/* harmony import */ var _designer_h_container_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_designer_h_container_scss__WEBPACK_IMPORTED_MODULE_1__);\n\n\nvar template = __webpack_require__(/*! html-loader?interpolate!val-loader!./designer-h-container.html */ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/utils/designer-h-container.html\");\nvar DesignerHContainerViewModel = /** @class */ (function () {\n function DesignerHContainerViewModel(params, componentInfo) {\n this.className = \"svd-designer-h-container\";\n this.items = knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.items);\n this.context = params.context;\n componentInfo.element.className += \" \" + params.className;\n }\n return DesignerHContainerViewModel;\n}());\n\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"svd-designer-h-container\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return new DesignerHContainerViewModel(params, componentInfo);\n }\n },\n template: template\n});\n\n\n/***/ }),\n\n/***/ \"./src/utils/dropdown.html\":\n/*!*********************************!*\\\n !*** ./src/utils/dropdown.html ***!\n \\*********************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\";\n\n/***/ }),\n\n/***/ \"./src/utils/dropdown.scss\":\n/*!*********************************!*\\\n !*** ./src/utils/dropdown.scss ***!\n \\*********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./src/utils/dropdown.ts\":\n/*!*******************************!*\\\n !*** ./src/utils/dropdown.ts ***!\n \\*******************************/\n/*! exports provided: DropdownViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DropdownViewModel\", function() { return DropdownViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _dropdown_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dropdown.scss */ \"./src/utils/dropdown.scss\");\n/* harmony import */ var _dropdown_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_dropdown_scss__WEBPACK_IMPORTED_MODULE_1__);\n\n\nvar templateHtml = __webpack_require__(/*! ./dropdown.html */ \"./src/utils/dropdown.html\");\nvar DropdownViewModel = /** @class */ (function () {\n function DropdownViewModel(items, action, optionsValue, optionsText, afterRender, valueAllowUnset, optionsCaption, ariaLabel, title, disable, hasFocus, select3) {\n if (optionsValue === void 0) { optionsValue = \"value\"; }\n if (optionsText === void 0) { optionsText = \"text\"; }\n if (afterRender === void 0) { afterRender = null; }\n if (valueAllowUnset === void 0) { valueAllowUnset = null; }\n if (optionsCaption === void 0) { optionsCaption = null; }\n if (ariaLabel === void 0) { ariaLabel = null; }\n if (title === void 0) { title = null; }\n if (disable === void 0) { disable = null; }\n if (hasFocus === void 0) { hasFocus = null; }\n this.items = items;\n this.action = action;\n this.optionsValue = optionsValue;\n this.optionsText = optionsText;\n this.afterRender = afterRender;\n this.valueAllowUnset = valueAllowUnset;\n this.optionsCaption = optionsCaption;\n this.ariaLabel = ariaLabel;\n this.title = title;\n this.disable = disable;\n this.hasFocus = hasFocus;\n this.select3 = select3;\n }\n return DropdownViewModel;\n}());\n\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"svd-dropdown\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var model = params.item;\n return new DropdownViewModel(model.items, model.action, model.optionsValue, model.optionsText, model.afterRender, model.valueAllowUnset, model.optionsCaption, model.ariaLabel, model.title, model.disable, model.hasFocus, params.select3);\n },\n },\n template: templateHtml,\n});\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"bindingHandlers\"][\"sjsselect3\"] = {\n init: function (element, valueAccessor, allBindingsAccessor) {\n var value = valueAccessor();\n if (value !== undefined && typeof jQuery !== \"undefined\" && jQuery()[\"select2\"]) {\n var options = {\n width: \"100%\",\n };\n // TODO: pass RTL setting\n // if (editor.isRTLValue) {\n // options.dir = \"rtl\";\n // }\n var $objectSelector = jQuery(element);\n $objectSelector[\"select2\"](options);\n $objectSelector.on(\"select2:select\", function (sel_evt) {\n if (knockout__WEBPACK_IMPORTED_MODULE_0__[\"isWriteableObservable\"](value)) {\n value(sel_evt.target.value);\n }\n });\n var subscription = knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n var item = knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](value);\n var el = (element.parentElement && element.parentElement.querySelector(\".select2-selection__rendered\"));\n if (el) {\n if (item && item.text) {\n el.innerText = item.text();\n }\n }\n });\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"utils\"].domNodeDisposal.addDisposeCallback(element, function () {\n subscription.dispose();\n $objectSelector.off(\"select2:select\");\n $objectSelector[\"select2\"]('destroy');\n });\n }\n },\n};\n\n\n/***/ }),\n\n/***/ \"./src/utils/splitter.scss\":\n/*!*********************************!*\\\n !*** ./src/utils/splitter.scss ***!\n \\*********************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./src/utils/splitter.ts\":\n/*!*******************************!*\\\n !*** ./src/utils/splitter.ts ***!\n \\*******************************/\n/*! exports provided: SplitterComponentViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SplitterComponentViewModel\", function() { return SplitterComponentViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _splitter_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./splitter.scss */ \"./src/utils/splitter.scss\");\n/* harmony import */ var _splitter_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_splitter_scss__WEBPACK_IMPORTED_MODULE_1__);\n\n\nvar SplitterComponentViewModel = /** @class */ (function () {\n function SplitterComponentViewModel(params, componentInfo) {\n var _this = this;\n var splitterElement = componentInfo.element;\n var container = componentInfo.element.parentElement;\n var onChange = params.onChange || knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](0);\n var siblings = [];\n var minLeft = params.minLeft || 10;\n var minRight = params.minRight || 10;\n for (var i = 0; i < container.children.length; i++) {\n siblings.push(container.children[i]);\n }\n var splitterElementIndex = siblings.indexOf(splitterElement);\n var leftElement = siblings[splitterElementIndex - 1];\n var rightElement = siblings[splitterElementIndex + 1];\n var startX = 0;\n var isInChangeWidth = false;\n var update = function (delta) {\n if (isInChangeWidth)\n return;\n isInChangeWidth = true;\n try {\n var isRtl = false;\n if (window && typeof window.getComputedStyle === \"function\") {\n var conputedStyles = getComputedStyle(leftElement);\n isRtl = conputedStyles && conputedStyles.direction === \"rtl\";\n }\n var offsetDelta = isRtl ? -delta : delta;\n var totalWidth = leftElement.offsetWidth + rightElement.offsetWidth;\n var newLeft = leftElement.offsetWidth + offsetDelta;\n var newRight = totalWidth - newLeft;\n if (newLeft > minLeft && newRight > minRight) {\n startX += delta;\n var leftWidth = Math.ceil(((newLeft + 1) / container.clientWidth) * 10000) / 100 +\n \"%\";\n var rightWidth = Math.ceil(((newRight + 1) / container.clientWidth) * 10000) / 100 +\n \"%\";\n _this.updateWidth(leftElement, leftWidth);\n _this.updateWidth(rightElement, rightWidth);\n onChange(onChange() + 1);\n }\n }\n finally {\n isInChangeWidth = false;\n }\n };\n var onmousemove = function (event) {\n update(event.screenX - startX);\n };\n var onmouseup = function (event) {\n startX = 0;\n splitterElement.className = splitterElement.className.replace(/\\ssvd-active-splitter/g, \"\");\n document.removeEventListener(\"mousemove\", onmousemove);\n document.removeEventListener(\"mouseleave\", onmouseup);\n document.removeEventListener(\"mouseup\", onmouseup);\n };\n splitterElement.onmousedown = function (event) {\n startX = event.screenX;\n splitterElement.className += \" svd-active-splitter\";\n document.addEventListener(\"mousemove\", onmousemove);\n document.addEventListener(\"mouseleave\", onmouseup);\n document.addEventListener(\"mouseup\", onmouseup);\n };\n setTimeout(function () { return update(0); }, 10);\n }\n SplitterComponentViewModel.prototype.updateWidth = function (el, value) {\n el.style.width = value;\n el.style.maxWidth = value;\n el.style.flexBasis = value;\n };\n SplitterComponentViewModel.prototype.dispose = function () {\n if (!!this.updateSplitter) {\n clearInterval(this.updateSplitter);\n this.updateSplitter = undefined;\n }\n };\n return SplitterComponentViewModel;\n}());\n\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"svd-splitter\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return new SplitterComponentViewModel(params, componentInfo);\n }\n },\n template: '
'\n});\n\n\n/***/ }),\n\n/***/ \"./src/utils/survey-widget.ts\":\n/*!************************************!*\\\n !*** ./src/utils/survey-widget.ts ***!\n \\************************************/\n/*! exports provided: SurveyWidgetBinding */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyWidgetBinding\", function() { return SurveyWidgetBinding; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar SurveyWidgetBinding;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"survey-widget\", {\n viewModel: function (params) {\n this.survey = params.survey;\n },\n template: \"\",\n});\n\n\n/***/ }),\n\n/***/ \"./src/utils/svg-icon.ts\":\n/*!*******************************!*\\\n !*** ./src/utils/svg-icon.ts ***!\n \\*******************************/\n/*! exports provided: SVGIconBinding */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SVGIconBinding\", function() { return SVGIconBinding; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar SVGIconBinding;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"svg-icon\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n var size = knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.size);\n var width = knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.width);\n var height = knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.height);\n var svgElem = componentInfo.element.childNodes[0];\n svgElem.style.width = (size || width || 16) + \"px\";\n svgElem.style.height = (size || height || 16) + \"px\";\n var node = svgElem.childNodes[0];\n node.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", \"#\" + knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.iconName));\n });\n },\n },\n template: \"\",\n});\n\n\n/***/ }),\n\n/***/ \"./src/utils/utils.ts\":\n/*!****************************!*\\\n !*** ./src/utils/utils.ts ***!\n \\****************************/\n/*! exports provided: getNextValue, findParentNode, focusFirstControl, getFirstNonTextElement, getNodesFromKoComponentInfo, createKey2click, propertyExists, isPropertyVisible */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getNextValue\", function() { return getNextValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"findParentNode\", function() { return findParentNode; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"focusFirstControl\", function() { return focusFirstControl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getFirstNonTextElement\", function() { return getFirstNonTextElement; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getNodesFromKoComponentInfo\", function() { return getNodesFromKoComponentInfo; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createKey2click\", function() { return createKey2click; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"propertyExists\", function() { return propertyExists; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isPropertyVisible\", function() { return isPropertyVisible; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_knockout__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-knockout */ \"survey-knockout\");\n/* harmony import */ var survey_knockout__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(survey_knockout__WEBPACK_IMPORTED_MODULE_1__);\n\n\nfunction getNumericFromString(str) {\n if (!str)\n return \"\";\n var num = \"\";\n for (var i = str.length - 1; i >= 0; i--) {\n if (str[i] >= \"0\" && str[i] <= \"9\") {\n num = str[i] + num;\n }\n if (num.length == 10)\n break;\n }\n return num;\n}\nvar opositeValues = {\n true: \"false\",\n True: \"False\",\n TRUE: \"FALSE\",\n false: \"true\",\n False: \"True\",\n FALSE: \"TRUE\",\n yes: \"no\",\n Yes: \"No\",\n YES: \"NO\",\n no: \"yes\",\n No: \"Yes\",\n NO: \"YES\",\n};\nfunction getOpositValue(str) {\n if (!!opositeValues[str])\n return opositeValues[str];\n return null;\n}\nfunction hasValueInArray(values, search) {\n for (var i = 0; i < values.length; i++) {\n if (!values[i])\n continue;\n if (values[i].toString() === search)\n return true;\n }\n return false;\n}\nfunction getNextValue(prefix, values) {\n if (values.length > 0)\n var oposite = getOpositValue(values[values.length - 1]);\n if (oposite && values.indexOf(oposite) < 0)\n return oposite;\n var numStr = \"\";\n var baseStr = \"\";\n var numStrIndex = -1;\n for (var i = values.length - 1; i >= 0; i--) {\n if (!values[i])\n continue;\n var str = values[i].toString();\n numStr = getNumericFromString(str);\n if (!!numStr) {\n numStrIndex = str.lastIndexOf(numStr);\n baseStr = str;\n break;\n }\n }\n if (numStrIndex > -1) {\n var num = parseInt(numStr);\n var newValue;\n do {\n newValue =\n str.substr(0, numStrIndex) +\n (num++).toString() +\n str.substr(numStrIndex + numStr.length);\n } while (hasValueInArray(values, newValue));\n return newValue;\n }\n return prefix + 1;\n}\nfunction findParentNode(className, sourceNode) {\n var parent = sourceNode;\n while (!!parent && !parent.classList.contains(className)) {\n parent = parent.parentElement;\n }\n return parent;\n}\nfunction focusFirstControl(renderedElements) {\n for (var i = 0; i < renderedElements.length; i++) {\n if (typeof renderedElements[i].getElementsByClassName === \"function\") {\n var elements = (renderedElements[i].getElementsByClassName(\"svd-focusable\"));\n if (elements.length === 0 &&\n renderedElements[i].className.indexOf(\"svd-focusable\") !== -1) {\n elements = [renderedElements[i]];\n }\n if (elements.length > 0) {\n var element = elements[0];\n if (element.tagName.toLowerCase() !== \"a\") {\n element.focus({ preventScroll: true });\n break;\n }\n }\n }\n }\n}\nfunction getFirstNonTextElement(elements) {\n if (!elements || !elements.length)\n return;\n for (var i = 0; i < elements.length; i++) {\n if (elements[i].nodeName != \"#text\" && elements[i].nodeName != \"#comment\")\n return elements[i];\n }\n return null;\n}\n// about compoentInfo: https://knockoutjs.com/documentation/component-registration.html\nfunction getNodesFromKoComponentInfo(componentInfo) {\n // elem.nodeType === 3 // text node\n // elem.nodeType === 8 // comment node\n var element = componentInfo.element;\n var siblings = [];\n if (element.nodeType !== 8) {\n return element.childNodes;\n }\n while ((element = element.nextSibling)) {\n if (element.nodeType === 3)\n continue;\n siblings.push(element);\n }\n return siblings;\n}\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"bindingHandlers\"][\"trueclick\"] = {\n init: function (element, valueAccessor, allBindingsAccessor) {\n element.onclick = function () { return true; };\n },\n};\nfunction createKey2click(element) {\n return function (ev) {\n var char = ev.which || ev.keyCode;\n if (char === 13 || char === 32) {\n element.click();\n }\n else if (char === 27) {\n element.blur();\n }\n };\n}\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"bindingHandlers\"][\"key2click\"] = {\n init: function (element, valueAccessor, allBindingsAccessor) {\n element.onkeyup = createKey2click(element);\n },\n};\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"bindingHandlers\"][\"clickNoFocus\"] = {\n init: function (element, valueAccessor, allBindingsAccessor, viewModel) {\n element.onclick = function (ev) {\n valueAccessor().call(viewModel, viewModel, ev);\n };\n },\n};\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"bindingHandlers\"][\"afterRenderParent\"] = {\n init: function (element, valueAccessor, allBindingsAccessor, viewModel) {\n element.style.display = \"none\";\n valueAccessor() && valueAccessor()([element.parentElement]);\n },\n};\nfunction propertyExists(obj, propertyName) {\n var result = true;\n if (!!obj && typeof obj.getType === \"function\") {\n var property = survey_knockout__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].findProperty(obj.getType(), propertyName);\n result = !!property;\n }\n return result;\n}\nfunction isPropertyVisible(obj, propertyName) {\n var result = true;\n if (!!obj && typeof obj.getType === \"function\") {\n var property = survey_knockout__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].findProperty(obj.getType(), propertyName);\n result = !property || property.visible;\n }\n return result;\n}\n\n\n/***/ }),\n\n/***/ \"./vendor/knockout-sortable.js\":\n/*!*************************************!*\\\n !*** ./vendor/knockout-sortable.js ***!\n \\*************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* fork of the https://github.com/SortableJS/knockout-sortablejs because of es modules build error \n waiting for approve pullrequests:\n * https://github.com/SortableJS/knockout-sortablejs/pull/9)\n * https://github.com/SortableJS/knockout-sortablejs/pull/1/files\n Change line:\n if (handler) handler(e, itemVM, parentVM, collection, bindings);\n to:\n if (handler && handler(e, itemVM, parentVM, collection, bindings)) return;\n*/\n\n/*global ko*/\n\n(function(factory) {\n \"use strict\";\n //get ko ref via global or require\n var koRef;\n if (typeof ko !== \"undefined\") {\n //global ref already defined\n koRef = ko;\n } else if (\n true\n ) {\n //commonjs / node.js\n koRef = __webpack_require__(/*! knockout */ \"knockout\");\n }\n //get sortable ref via global or require\n var sortableRef;\n if (typeof Sortable !== \"undefined\") {\n //global ref already defined\n sortableRef = Sortable;\n } else if (\n true\n ) {\n //commonjs / node.js\n sortableRef = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/Sortable.js\");\n }\n //use references if we found them\n if (koRef !== undefined && sortableRef !== undefined) {\n factory(koRef, sortableRef);\n } else if (true) {\n //if both references aren't found yet, get via AMD if available\n //we may have a reference to only 1, or none\n if (koRef !== undefined && sortableRef === undefined) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/Sortable.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function(amdSortableRef) {\n factory(koRef, amdSortableRef);\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (koRef === undefined && sortableRef !== undefined) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! knockout */ \"knockout\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function(amdKnockout) {\n factory(amdKnockout, sortableRef);\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (koRef === undefined && sortableRef === undefined) {\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! knockout */ \"knockout\"), __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/Sortable.js\")], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n }\n } else {}\n})(function(ko, Sortable) {\n \"use strict\";\n\n var init = function(\n element,\n valueAccessor,\n allBindings,\n viewModel,\n bindingContext,\n sortableOptions\n ) {\n var options = buildOptions(valueAccessor, sortableOptions);\n\n // Its seems that we cannot update the eventhandlers after we've created\n // the sortable, so define them in init instead of update\n [\n \"onStart\",\n \"onEnd\",\n \"onRemove\",\n \"onAdd\",\n \"onUpdate\",\n \"onSort\",\n \"onFilter\",\n \"onMove\",\n \"onClone\"\n ].forEach(function(e) {\n if (options[e] || eventHandlers[e])\n options[e] = function(\n eventType,\n parentVM,\n parentBindings,\n handler,\n e\n ) {\n var itemVM = ko.dataFor(e.item),\n // All of the bindings on the parent element\n bindings = ko.utils.peekObservable(parentBindings()),\n // The binding options for the draggable/sortable binding of the parent element\n bindingHandlerBinding = bindings.sortable || bindings.draggable,\n // The collection that we should modify\n collection =\n bindingHandlerBinding.collection ||\n bindingHandlerBinding.foreach;\n if (handler && handler(e, itemVM, parentVM, collection, bindings))\n return;\n if (eventHandlers[eventType])\n eventHandlers[eventType](\n e,\n itemVM,\n parentVM,\n collection,\n bindings\n );\n }.bind(undefined, e, viewModel, allBindings, options[e]);\n });\n\n var sortableElement = Sortable.create(element, options);\n\n // Destroy the sortable if knockout disposes the element its connected to\n ko.utils.domNodeDisposal.addDisposeCallback(element, function() {\n sortableElement.destroy();\n });\n return ko.bindingHandlers.template.init(element, valueAccessor);\n },\n update = function(\n element,\n valueAccessor,\n allBindings,\n viewModel,\n bindingContext,\n sortableOptions\n ) {\n // There seems to be some problems with updating the options of a sortable\n // Tested to change eventhandlers and the group options without any luck\n\n return ko.bindingHandlers.template.update(\n element,\n valueAccessor,\n allBindings,\n viewModel,\n bindingContext\n );\n },\n eventHandlers = (function(handlers) {\n var moveOperations = [],\n tryMoveOperation = function(\n e,\n itemVM,\n parentVM,\n collection,\n parentBindings\n ) {\n // A move operation is the combination of a add and remove event,\n // this is to make sure that we have both the target and origin collections\n var currentOperation = {\n event: e,\n itemVM: itemVM,\n parentVM: parentVM,\n collection: collection,\n parentBindings: parentBindings\n },\n existingOperation = moveOperations.filter(function(op) {\n return op.itemVM === currentOperation.itemVM;\n })[0];\n\n if (!existingOperation) {\n moveOperations.push(currentOperation);\n } else {\n // We're finishing the operation and already have a handle on\n // the operation item meaning that its safe to remove it\n moveOperations.splice(moveOperations.indexOf(existingOperation), 1);\n\n var removeOperation =\n currentOperation.event.type === \"remove\"\n ? currentOperation\n : existingOperation,\n addOperation =\n currentOperation.event.type === \"add\"\n ? currentOperation\n : existingOperation;\n\n moveItem(\n itemVM,\n removeOperation.collection,\n addOperation.collection,\n addOperation.event.clone,\n addOperation.event\n );\n }\n },\n // Moves an item from the \"from\" collection to the \"to\" collection, these\n // can be references to the same collection which means its a sort.\n // clone indicates if we should move or copy the item into the new collection\n moveItem = function(itemVM, from, to, clone, e) {\n // Unwrapping this allows us to manipulate the actual array\n var fromArray = from(),\n // Its not certain that the items actual index is the same\n // as the index reported by sortable due to filtering etc.\n originalIndex = fromArray.indexOf(itemVM),\n newIndex = e.newIndex;\n\n // We have to find out the actual desired index of the to array,\n // as this might be a computed array. We could otherwise potentially\n // drop an item above the 3rd visible item, but the 2nd visible item\n // has an actual index of 5.\n if (e.item.previousElementSibling) {\n newIndex = to().indexOf(ko.dataFor(e.item.previousElementSibling));\n newIndex += newIndex > originalIndex ? 0 : 1;\n }\n\n // Remove sortables \"unbound\" element\n e.item.parentNode.removeChild(e.item);\n\n // This splice is necessary for both clone and move/sort\n // In sort/move since it shouldn't be at this index/in this array anymore\n // In clone since we have to work around knockouts valuHasMutated\n // when manipulating arrays and avoid a \"unbound\" item added by sortable\n fromArray.splice(originalIndex, 1);\n // Update the array, this will also remove sortables \"unbound\" clone\n from.valueHasMutated();\n if (clone && from !== to) {\n // Read the item\n fromArray.splice(originalIndex, 0, itemVM);\n // Force knockout to update\n from.valueHasMutated();\n }\n // Force deferred tasks to run now, registering the removal\n !!ko.tasks && ko.tasks.runEarly();\n // Insert the item on its new position\n to().splice(newIndex, 0, itemVM);\n // Make sure to tell knockout that we've modified the actual array.\n to.valueHasMutated();\n };\n\n handlers.onRemove = tryMoveOperation;\n handlers.onAdd = tryMoveOperation;\n handlers.onUpdate = function(\n e,\n itemVM,\n parentVM,\n collection,\n parentBindings\n ) {\n // This will be performed as a sort since the to/from collections\n // reference the same collection and clone is set to false\n moveItem(itemVM, collection, collection, false, e);\n };\n\n return handlers;\n })({}),\n // bindingOptions are the options set in the \"data-bind\" attribute in the ui.\n // options are custom options, for instance draggable/sortable specific options\n buildOptions = function(bindingOptions, options) {\n // deep clone/copy of properties from the \"from\" argument onto\n // the \"into\" argument and returns the modified \"into\"\n var merge = function(into, from) {\n for (var prop in from) {\n if (\n Object.prototype.toString.call(from[prop]) === \"[object Object]\"\n ) {\n if (\n Object.prototype.toString.call(into[prop]) !== \"[object Object]\"\n ) {\n into[prop] = {};\n }\n into[prop] = merge(into[prop], from[prop]);\n } else into[prop] = from[prop];\n }\n\n return into;\n },\n // unwrap the supplied options\n unwrappedOptions =\n ko.utils.peekObservable(bindingOptions()).options || {};\n\n // Make sure that we don't modify the provided settings object\n options = merge({}, options);\n\n // group is handled differently since we should both allow to change\n // a draggable to a sortable (and vice versa), but still be able to set\n // a name on a draggable without it becoming a drop target.\n if (\n unwrappedOptions.group &&\n Object.prototype.toString.call(unwrappedOptions.group) !==\n \"[object Object]\"\n ) {\n // group property is a name string declaration, convert to object.\n unwrappedOptions.group = { name: unwrappedOptions.group };\n }\n\n return merge(options, unwrappedOptions);\n };\n\n ko.bindingHandlers.draggable = {\n sortableOptions: {\n group: { pull: \"clone\", put: false },\n sort: false\n },\n init: function(\n element,\n valueAccessor,\n allBindings,\n viewModel,\n bindingContext\n ) {\n return init(\n element,\n valueAccessor,\n allBindings,\n viewModel,\n bindingContext,\n ko.bindingHandlers.draggable.sortableOptions\n );\n },\n update: function(\n element,\n valueAccessor,\n allBindings,\n viewModel,\n bindingContext\n ) {\n return update(\n element,\n valueAccessor,\n allBindings,\n viewModel,\n bindingContext,\n ko.bindingHandlers.draggable.sortableOptions\n );\n }\n };\n\n ko.bindingHandlers.sortable = {\n sortableOptions: {\n group: { pull: true, put: true }\n },\n init: function(\n element,\n valueAccessor,\n allBindings,\n viewModel,\n bindingContext\n ) {\n return init(\n element,\n valueAccessor,\n allBindings,\n viewModel,\n bindingContext,\n ko.bindingHandlers.sortable.sortableOptions\n );\n },\n update: function(\n element,\n valueAccessor,\n allBindings,\n viewModel,\n bindingContext\n ) {\n return update(\n element,\n valueAccessor,\n allBindings,\n viewModel,\n bindingContext,\n ko.bindingHandlers.sortable.sortableOptions\n );\n }\n };\n});\n\n\n/***/ }),\n\n/***/ \"knockout\":\n/*!********************************************************************************************!*\\\n !*** external {\"root\":\"ko\",\"commonjs2\":\"knockout\",\"commonjs\":\"knockout\",\"amd\":\"knockout\"} ***!\n \\********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_knockout__;\n\n/***/ }),\n\n/***/ \"survey-knockout\":\n/*!*********************************************************************************************************************!*\\\n !*** external {\"root\":\"Survey\",\"commonjs2\":\"survey-knockout\",\"commonjs\":\"survey-knockout\",\"amd\":\"survey-knockout\"} ***!\n \\*********************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_survey_knockout__;\n\n/***/ })\n\n/******/ });\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvYWRvcm5lcnMvZmxvd3BhbmVsLWFjdGlvbnMuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL2ltYWdlLWl0ZW1zLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy9pbWFnZS5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvYWRvcm5lcnMvaXRlbS1lZGl0b3IuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL3F1ZXN0aW9uLWFjdGlvbnMuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL3JhdGluZy1pdGVtLWVkaXRvci5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvYWRvcm5lcnMvc2VsZWN0LWl0ZW1zLWRpc3BsYXkuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL3NlbGVjdC1pdGVtcy1lZGl0b3IuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL3RpdGxlLWFjdGlvbnMuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL3RpdGxlLWVkaXRvci5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvY29tcG9uZW50cy9wYWdlcy1lZGl0b3IuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NvbXBvbmVudHMvdG9vbGJveC1pdGVtLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9jb21wb25lbnRzL3Rvb2xib3guaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RlbXBsYXRlcy9lbnRyeS5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdXRpbHMvYWNjb3JkaW9uLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy91dGlscy9kZXNpZ25lci1jb250YWluZXIuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3V0aWxzL2Rlc2lnbmVyLWgtY29udGFpbmVyLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL25vZGVfbW9kdWxlcy9wYXBhcGFyc2UvcGFwYXBhcnNlLm1pbi5qcyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vbm9kZV9tb2R1bGVzL3Jtb2RhbC9pbmRleC5lcy5qcyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vbm9kZV9tb2R1bGVzL3NvcnRhYmxlanMvU29ydGFibGUuanMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy9mbG93cGFuZWwtYWN0aW9ucy5zY3NzPzJkYmIiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy9mbG93cGFuZWwtYWN0aW9ucy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL2ltYWdlLWl0ZW1zLnNjc3M/M2E1OCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL2ltYWdlLWl0ZW1zLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvYWRvcm5lcnMvaW1hZ2Uuc2Nzcz80MzVhIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvYWRvcm5lcnMvaW1hZ2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy9pdGVtLWVkaXRvci5zY3NzP2NhYzIiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy9pdGVtLWVkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL2xhYmVsLWVkaXRvci5zY3NzPzA4NzAiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy9sYWJlbC1lZGl0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy9xdWVzdGlvbi1hY3Rpb25zLnNjc3M/MDYxNiIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL3F1ZXN0aW9uLWFjdGlvbnMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy9yYXRpbmctaXRlbS1lZGl0b3Iuc2Nzcz9hZmNiIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvYWRvcm5lcnMvcmF0aW5nLWl0ZW0tZWRpdG9yLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvYWRvcm5lcnMvc2VsZWN0LWl0ZW1zLWRpc3BsYXkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy9zZWxlY3QtaXRlbXMtZWRpdG9yLnNjc3M/ZjA2NCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL3NlbGVjdC1pdGVtcy1lZGl0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy9zZWxlY3QtaXRlbXMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy90aXRsZS1hY3Rpb25zLnNjc3M/Zjc5OCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2Fkb3JuZXJzL3RpdGxlLWFjdGlvbnMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9hZG9ybmVycy90aXRsZS1lZGl0b3Iuc2Nzcz9hMDg0Iiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvYWRvcm5lcnMvdGl0bGUtZWRpdG9yLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvYWRvcm5lcnMvdGl0bGUtaW1hZ2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9jb21tYW5kcy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NvbXBvbmVudHMvZWxlbWVudC1zZWxlY3Rvci5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvY29tcG9uZW50cy9lbGVtZW50LXNlbGVjdG9yLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9jb21wb25lbnRzL2VsZW1lbnQtc2VsZWN0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9jb21wb25lbnRzL3BhZ2VzLWVkaXRvci5zY3NzP2IxMDAiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9jb21wb25lbnRzL3BhZ2VzLWVkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NvbXBvbmVudHMvcmVzdWx0cy10YWJsZS1yb3cuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NvbXBvbmVudHMvcmVzdWx0cy5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvY29tcG9uZW50cy9yZXN1bHRzLnNjc3M/OTMwNCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NvbXBvbmVudHMvcmVzdWx0cy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NvbXBvbmVudHMvc2ltdWxhdG9yLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9jb21wb25lbnRzL3NpbXVsYXRvci5zY3NzPzUwNmQiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9jb21wb25lbnRzL3NpbXVsYXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NvbXBvbmVudHMvdG9vbGJhci5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvY29tcG9uZW50cy90b29sYmFyLnNjc3M/YzkzMSIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NvbXBvbmVudHMvdG9vbGJhci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NvbXBvbmVudHMvdG9vbGJveC1pdGVtLnNjc3M/YWMxMiIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NvbXBvbmVudHMvdG9vbGJveC1pdGVtLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvY29tcG9uZW50cy90b29sYm94LnNjc3M/NTM3YiIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NvbXBvbmVudHMvdG9vbGJveC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2NyZWF0b3ItYmFzZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2RyYWdkcm9waGVscGVyLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvZWRpdG9yLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvZWRpdG9yTG9jYWxpemF0aW9uLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvZW50cmllcy9pbmRleC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2V4cHJlc3Npb25Ub0Rpc3BsYXlUZXh0LnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvZXh0ZW50aW9ucy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2ltYWdlcy9Zb3VUdWJlLnBuZyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2ltYWdlcy9zdGFydC1kZXNpZ25pbmctZm9ybS5zdmciLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9qc29uNS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2xvY2FsaXphdGlvbi9jcm9hdGlhbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2xvY2FsaXphdGlvbi9kYW5pc2gudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9sb2NhbGl6YXRpb24vZHV0Y2gudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9sb2NhbGl6YXRpb24vZW5nbGlzaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2xvY2FsaXphdGlvbi9maW5uaXNoLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2xvY2FsaXphdGlvbi9nZXJtYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9sb2NhbGl6YXRpb24vaHVuZ2FyaWFuLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvbG9jYWxpemF0aW9uL2luZG9uZXNpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9sb2NhbGl6YXRpb24vaXRhbGlhbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2xvY2FsaXphdGlvbi9rb3JlYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9sb2NhbGl6YXRpb24vbm9yd2VnaWFuLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvbG9jYWxpemF0aW9uL3BlcnNpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9sb2NhbGl6YXRpb24vcG9saXNoLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9sb2NhbGl6YXRpb24vcnVzc2lhbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2xvY2FsaXphdGlvbi9zaW1wbGlmaWVkLWNoaW5lc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9sb2NhbGl6YXRpb24vc3BhbmlzaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL2xvY2FsaXphdGlvbi9zd2VkaXNoLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvbG9jYWxpemF0aW9uL3RhamlrLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvbG9jYWxpemF0aW9uL3RyYWRpdGlvbmFsLWNoaW5lc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9sb2NhbGl6YXRpb24vdHVya2lzaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL21haW4uc2Nzcz9mNDFiIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvb2JqZWN0UHJvcGVydHkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wYWdlcy1lZGl0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2JpbmRpbmdzLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2JpbmRpbmdzLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2JpbmRpbmdzLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9ib29sZWFuLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2Jvb2xlYW4uc2NzcyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvYm9vbGVhbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvY2VsbHMuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvY2VsbHMuc2NzcyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvY2VsbHMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2NvbG9yLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2NvbG9yLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2NvbG9yLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9jb25kaXRpb24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvY29uZGl0aW9uLnNjc3M/MDY5NCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvY29uZGl0aW9uLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9jdXN0b20uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvY3VzdG9tLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2N1c3RvbS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvZGVmYXVsdC12YWx1ZS5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9kZWZhdWx0LXZhbHVlLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2RlZmF1bHQtdmFsdWUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2Ryb3Bkb3duLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2Ryb3Bkb3duLnNjc3M/ZDUzZSIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2Vycm9yLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2Vycm9yLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2Vycm9yLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9leHByZXNzaW9uLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2V4cHJlc3Npb24uc2NzcyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvZXhwcmVzc2lvbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvZmlsZS5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9maWxlLnNjc3M/YmMzMCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvZmlsZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvaHRtbC1wZS5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9odG1sLXBlLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2h0bWwtcGUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2l0ZW0tdmFsdWVzLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2l0ZW0tdmFsdWVzLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL2l0ZW0tdmFsdWVzLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9tb2RhbC1jb250ZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL21vZGFsLWNvbnRlbnQuc2NzcyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvbW9kYWwtY29udGVudC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvbW9kYWwuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvbW9kYWwuc2NzcyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvbW9kYWwudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL211bHRpcGxlLXZhbHVlcy5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9tdWx0aXBsZS12YWx1ZXMuc2NzcyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvbXVsdGlwbGUtdmFsdWVzLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9uZXN0ZWQtaXRlbS5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9uZXN0ZWQtaXRlbS5zY3NzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9uZXN0ZWQtaXRlbS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvbmVzdGVkLWl0ZW1zLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL25lc3RlZC1pdGVtcy5zY3NzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9uZXN0ZWQtaXRlbXMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL25lc3RlZC5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9uZXN0ZWQuc2NzcyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvbmVzdGVkLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9udW1iZXIuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvbnVtYmVyLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL251bWJlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvb25lLXNlbGVjdGVkLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL29uZS1zZWxlY3RlZC5zY3NzP2U4YzciLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL29uZS1zZWxlY3RlZC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvcHJvcGVydHktZWRpdG9yLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL3Byb3BlcnR5LWVkaXRvci5zY3NzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9wcm9wZXJ0eS1lZGl0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL3Jlc3RmdWxsLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL3Jlc3RmdWxsLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL3Jlc3RmdWxsLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9zdHJpbmcuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvc3RyaW5nLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL3N0cmluZy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvc3RyaW5ncy5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9zdHJpbmdzLnNjc3MiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL3N0cmluZ3MudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL3N3aXRjaC5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9zd2l0Y2guc2Nzcz9mMWI1Iiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy9zd2l0Y2gudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1lZGl0b3JzL3RleHQuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWVkaXRvcnMvdGV4dC5zY3NzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZWRpdG9ycy90ZXh0LnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZ3JpZC9vYmplY3QtZWRpdG9yLWNvbnRlbnQuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWdyaWQvb2JqZWN0LWVkaXRvci1jb250ZW50LnNjc3M/MzhmMyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWdyaWQvb2JqZWN0LWVkaXRvci1jb250ZW50LnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHktZ3JpZC9vYmplY3QtZWRpdG9yLW9sZC10YWJsZS1jb250ZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1ncmlkL29iamVjdC1lZGl0b3Itb2xkLXRhYmxlLWNvbnRlbnQuc2NzcyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWdyaWQvb2JqZWN0LWVkaXRvci1vbGQtdGFibGUtY29udGVudC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWdyaWQvb2JqZWN0LWVkaXRvci10YWIuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWdyaWQvb2JqZWN0LWVkaXRvci10YWIuc2NzcyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWdyaWQvb2JqZWN0LWVkaXRvci10YWIudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1ncmlkL29iamVjdC1lZGl0b3IuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWdyaWQvb2JqZWN0LWVkaXRvci5zY3NzPzcxNzIiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1ncmlkL29iamVjdC1lZGl0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1ncmlkL3Byb3BlcnR5LWdyaWQuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5LWdyaWQvcHJvcGVydHktZ3JpZC5zY3NzP2VjZDgiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eS1ncmlkL3Byb3BlcnR5LWdyaWQudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eUVkaXRvcnMvZWRpdGFibGVPYmplY3QudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlCaW5kaW5nc0VkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUNhbGN1bGF0ZWRWYWx1ZXMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlDZWxsc0VkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUNvbmRpdGlvbkVkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUN1c3RvbUVkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eURlZmF1bHRWYWx1ZUVkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUVkaXRvckJhc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlFZGl0b3JGYWN0b3J5LnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5SHRtbENvbmRpdGlvbkVkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUl0ZW1WYWx1ZXNFZGl0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlJdGVtc0VkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eU1hdHJpeERyb3Bkb3duQ29sdW1uc0VkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eU1vZGFsRWRpdG9yLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5TXVsdGlwbGVWYWx1ZXNFZGl0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlOZXN0ZWRQcm9wZXJ0eUVkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eU9uZVNlbGVjdGVkRWRpdG9yLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5UGFnZXNFZGl0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlSZXN0ZnVsbEVkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eVRleHRJdGVtc0VkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eVRyaWdnZXJzRWRpdG9yLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5VXJsQ29uZGl0aW9uRWRpdG9yLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5VmFsaWRhdG9yc0VkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3Byb3BlcnR5RWRpdG9ycy9zdXJ2ZXlFbGVtZW50U2VsZWN0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9xdWVzdGlvbkVkaXRvcnMvcHJvcGVydGllcy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3F1ZXN0aW9uRWRpdG9ycy9xdWVzdGlvbkVkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3F1ZXN0aW9uRWRpdG9ycy9xdWVzdGlvbkVkaXRvckRlZmluaXRpb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9xdWVzdGlvbmNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3NldHRpbmdzLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvc3R5bGVzbWFuYWdlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3N1cnZleUhlbHBlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3N1cnZleU9iamVjdHMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9zdXJ2ZXlqc09iamVjdHMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy9zdmdidW5kbGUuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RhYnMvZW1iZWQuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RhYnMvZW1iZWQuc2Nzcz8zMjdiIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdGFicy9lbWJlZC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RhYnMvanNvbi1lZGl0b3IuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RhYnMvanNvbi1lZGl0b3Iuc2Nzcz8xMzVlIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdGFicy9qc29uLWVkaXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RhYnMvbG9naWMuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RhYnMvbG9naWMuc2Nzcz84YjNmIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdGFicy9sb2dpYy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RhYnMvdGVzdC5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdGFicy90ZXN0LnNjc3M/NTA4NSIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RhYnMvdGVzdC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RhYnMvdHJhbnNsYXRpb24tZ3JvdXAuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RhYnMvdHJhbnNsYXRpb24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RhYnMvdHJhbnNsYXRpb24uc2Nzcz85Mjg1Iiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdGFicy90cmFuc2xhdGlvbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RlbXBsYXRlcy9jb252ZXJ0LWFjdGlvbi5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdGVtcGxhdGVzL2Rlc2lnbi1zdXJmYWNlLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy90ZW1wbGF0ZXMvaW5kZXguaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RlbXBsYXRlcy9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHllZGl0b3ItdHJpZ2dlcnNpdGVtcy5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdGVtcGxhdGVzL3F1ZXN0aW9uRWRpdG9ycy9xdWVzdGlvbmVkaXRvci5odG1sIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdGVtcGxhdGVzL3RhYnMuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3RlbXBsYXRlcy90b29sYmFyLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy90ZXh0V29ya2VyLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdG9vbGJveC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3VuZG9yZWRvbWFuYWdlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3V0aWxzL2FjY29yZGlvbi5zY3NzPzk0MGUiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy91dGlscy9hY2NvcmRpb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy91dGlscy9ib29sZWFuLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy91dGlscy9ib29sZWFuLnNjc3M/YzdkYiIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3V0aWxzL2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy91dGlscy9idXR0b24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3V0aWxzL2J1dHRvbi5zY3NzP2M1NDMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy91dGlscy9idXR0b24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy91dGlscy9jdXN0b20tY2hlY2tib3guc2Nzcz81ZGZlIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdXRpbHMvY3VzdG9tLXNlbGVjdC5zY3NzPzRjMzgiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy91dGlscy9kZG1lbnUuc2Nzcz82MDkyIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdXRpbHMvZGVzaWduZXItY29udGFpbmVyLnNjc3M/N2IyMiIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3V0aWxzL2Rlc2lnbmVyLWNvbnRhaW5lci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3V0aWxzL2Rlc2lnbmVyLWgtY29udGFpbmVyLnNjc3M/MDU0MyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3V0aWxzL2Rlc2lnbmVyLWgtY29udGFpbmVyLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdXRpbHMvZHJvcGRvd24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3V0aWxzL2Ryb3Bkb3duLnNjc3M/NDVkZiIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vc3JjL3V0aWxzL2Ryb3Bkb3duLnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdXRpbHMvc3BsaXR0ZXIuc2Nzcz9lZGI5Iiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdXRpbHMvc3BsaXR0ZXIudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy91dGlscy9zdXJ2ZXktd2lkZ2V0LnRzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvLi9zcmMvdXRpbHMvc3ZnLWljb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Q3JlYXRvci8uL3NyYy91dGlscy91dGlscy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yLy4vdmVuZG9yL2tub2Nrb3V0LXNvcnRhYmxlLmpzIiwid2VicGFjazovL1N1cnZleUNyZWF0b3IvZXh0ZXJuYWwge1wicm9vdFwiOlwia29cIixcImNvbW1vbmpzMlwiOlwia25vY2tvdXRcIixcImNvbW1vbmpzXCI6XCJrbm9ja291dFwiLFwiYW1kXCI6XCJrbm9ja291dFwifSIsIndlYnBhY2s6Ly9TdXJ2ZXlDcmVhdG9yL2V4dGVybmFsIHtcInJvb3RcIjpcIlN1cnZleVwiLFwiY29tbW9uanMyXCI6XCJzdXJ2ZXkta25vY2tvdXRcIixcImNvbW1vbmpzXCI6XCJzdXJ2ZXkta25vY2tvdXRcIixcImFtZFwiOlwic3VydmV5LWtub2Nrb3V0XCJ9Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO1FDVkE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNB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RUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFZSxxRUFBTSxFQUFDO0FBQ3RCOzs7Ozs7Ozs7Ozs7QUNoTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEtBQUssSUFBMEM7QUFDL0MsRUFBRSxvQ0FBTyxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsb0dBQUM7QUFDakI7QUFDQSxNQUFNLEVBTUo7QUFDRixDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7O0FBRUEsZUFBZTtBQUNmLHFDQUFxQzs7O0FBR3JDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXO0FBQ1g7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVCQUF1Qjs7QUFFdkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxPQUFPO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQSxlQUFlLFlBQVk7QUFDM0IsZUFBZSxPQUFPO0FBQ3RCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsRUFBRTtBQUNqQixlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVLE9BQU87QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7OztBQUlBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsY0FBYyxZQUFZO0FBQzFCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGFBQWEsU0FBUztBQUN0QixhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7QUNsOUNELHVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0ErQjtBQUlIO0FBQ007QUFDbEMsSUFBSSxZQUFZLEdBQUcsbUJBQU8sQ0FBQyw2TEFBNkQsQ0FBQyxDQUFDO0FBQzlCO0FBQzVELDJDQUEyQztBQUUzQztJQUE2Qyx5RkFBc0I7SUFDakUsaUNBQVksUUFBUSxFQUFFLE1BQU0sRUFBVSxjQUEyQjtRQUFqRSxZQUNFLGtCQUFNLFFBQVEsRUFBRSxNQUFNLENBQUMsU0FrRXhCO1FBbkVxQyxvQkFBYyxHQUFkLGNBQWMsQ0FBYTtRQUUvRCxJQUFJLElBQUksR0FBRyxLQUFJLENBQUM7UUFDaEIsSUFBSSxnQkFBZ0IsR0FBc0IsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN4RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQy9FLFNBQVMsQ0FDVixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxzQkFBc0IsR0FBRyxhQUFHLElBQUk7WUFDbEMsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRTtnQkFDM0MsSUFBSSxZQUFZLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUU7b0JBQ2xCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ3pDLFlBQVksRUFDWixHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxZQUFZLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQ2xELENBQUM7b0JBQ0YsdUNBQXVDO29CQUN2QywwQkFBMEI7b0JBQzFCLG9CQUFvQjtvQkFDcEIsNkJBQTZCO29CQUM3Qix3REFBd0Q7b0JBQ3hELE1BQU07b0JBQ04sS0FBSztpQkFDTjthQUNGO1FBQ0gsQ0FBQyxFQWxCbUMsQ0FrQm5DLENBQUM7UUFDRixLQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3hCLElBQUksRUFBRSxNQUFNO1lBQ1osSUFBSSxFQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztZQUNyQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDO1NBQ3JDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDeEIsSUFBSSxFQUFFLFFBQVE7WUFDZCxJQUFJLEVBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHO1lBQ3ZDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxHQUFHLENBQUM7U0FDckMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUN4QixJQUFJLEVBQUUsV0FBVztZQUNqQixJQUFJLEVBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHO1lBQzFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxHQUFHLENBQUM7U0FDckMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBTztZQUM3QixJQUFJLEVBQUUsZUFBZTtZQUNyQixJQUFJLEVBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztZQUN2QyxLQUFLLEVBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztZQUN4QyxRQUFRLEVBQUUsSUFBSTtZQUNkLFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsY0FBYyxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDO1lBQzdELGFBQWEsRUFBTyxDQUFDLFVBQUMsSUFBSSxFQUFFLEtBQUs7Z0JBQy9CLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUU7b0JBQ2xCLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3JELFFBQVEsQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDO29CQUN0RCxrREFBa0Q7b0JBQ2xELDJDQUEyQztvQkFDM0MscUJBQXFCO29CQUNyQiw2QkFBNkI7b0JBQzdCLCtCQUErQjtvQkFDL0Isc0JBQXNCO29CQUN0QiwwREFBMEQ7b0JBQzFELE9BQU87b0JBQ1AsSUFBSTtvQkFDSixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7aUJBQ3pCO1lBQ0gsQ0FBQyxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBTyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7O0lBQ25FLENBQUM7SUFDSCw4QkFBQztBQUFELENBQUMsQ0FyRTRDLHdFQUFzQixHQXFFbEU7O0FBRUQsbURBQWEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUU7SUFDMUMsU0FBUyxFQUFFO1FBQ1QsZUFBZSxFQUFFLFVBQUMsTUFBTSxFQUFFLGFBQWE7WUFDckMsV0FBSSx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQWUsQ0FDdkUsYUFBYSxDQUFDLE9BQU8sQ0FDdEIsQ0FBQztRQUZGLENBRUU7S0FDTDtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQztBQUVJLElBQUksdUJBQXVCLEdBQUc7SUFDbkMsY0FBYyxFQUFFLGVBQUs7UUFDbkIsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsY0FBYyxFQUFFLGVBQUssSUFBSSxrQkFBVyxFQUFYLENBQVc7SUFDcEMsV0FBVyxFQUFFLFVBQUMsUUFBdUIsRUFBRSxLQUFLLEVBQUUsTUFBTTtRQUNsRCxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLFVBQVUsQ0FBQyxTQUFTLEdBQUcsdUJBQXVCLENBQUM7UUFDL0MsVUFBVSxDQUFDLFNBQVM7WUFDbEIsbUZBQW1GLENBQUM7UUFDdEYsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxzREFBZ0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNGLENBQUM7QUFFRix3RUFBZSxDQUFDLG1CQUFtQixFQUFFLHVCQUF1QixDQUFDLENBQUM7Ozs7Ozs7Ozs7OztBQzNHOUQsdUM7Ozs7Ozs7Ozs7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ1c7QUFDVztBQUNNO0FBQ3pCO0FBRW1CO0FBQ1A7QUFFbEI7QUFFcUI7QUFDakQsSUFBSSxZQUFZLEdBQUcsbUJBQU8sQ0FBQyxpTEFBdUQsQ0FBQyxDQUFDO0FBRXBGO0lBQ0UsZ0NBQ1UsSUFBWSxFQUNaLFFBQTRCLEVBQzVCLElBQUksRUFDSixXQUFXLEVBQ1gsTUFBcUIsRUFDckIsU0FBUztRQU5uQixpQkFPSTtRQU5NLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUM1QixTQUFJLEdBQUosSUFBSTtRQUNKLGdCQUFXLEdBQVgsV0FBVztRQUNYLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsY0FBUyxHQUFULFNBQVM7UUFrQ25CLGdCQUFXLEdBQUcsVUFBQyxLQUFhO1lBQzFCLEtBQUksQ0FBQyxZQUFZLElBQUksS0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUM7SUFuQ0MsQ0FBQztJQUVKLDJDQUFVLEdBQVYsVUFBVyxLQUE2QixFQUFFLEtBQUs7UUFDN0MsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3JDLElBQUksUUFBUSxHQUFHLDBEQUFpQixDQUFDLFlBQVksQ0FDM0MsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFDeEIsU0FBUyxDQUNWLENBQUM7WUFDRixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGdDQUFnQyxDQUM1RCxLQUFLLENBQUMsUUFBUSxFQUNkLFFBQVEsRUFDUixLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFDdEIsS0FBSyxDQUFDLElBQUksQ0FDWCxDQUFDO1lBQ0YsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDcEQ7U0FDRjtJQUNILENBQUM7SUFFRCxzQkFBSSw4Q0FBVTthQUFkO1lBQ0UsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7OztPQUFBO0lBRUQsNENBQVcsR0FBWCxVQUFZLEtBQUssRUFBRSxLQUFLO1FBQ3RCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQ25ELGtCQUFrQixDQUNuQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBTU0sNkNBQVksR0FBbkIsVUFBb0IsR0FBVztRQUM3QixPQUFPLHNFQUFrQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBR0gsNkJBQUM7QUFBRCxDQUFDO0FBRUQsbURBQWEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUU7SUFDMUMsU0FBUyxFQUFFO1FBQ1QsZUFBZSxFQUFFLFVBQUMsTUFBTSxFQUFFLGFBQWE7WUFDckMsSUFBSSxLQUFLLEdBQUcsSUFBSSxzQkFBc0IsQ0FDcEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQzFCLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsTUFBTSxDQUFDLElBQUksRUFDWCxhQUFhLENBQUMsT0FBTyxFQUNyQixNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxTQUFTLENBQ2pCLENBQUM7WUFDRixJQUFJLFFBQVEsR0FBRywwREFBaUIsQ0FBQyxZQUFZLENBQzNDLGdCQUFnQixFQUFFLDBCQUEwQjtZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUNaLENBQUM7WUFDRixLQUFLLENBQUMsWUFBWSxHQUFHLGVBQUs7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUFFLE9BQU87Z0JBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxVQUFDLENBQUMsRUFBRSxJQUFJO29CQUN2QyxJQUFJLE9BQU8sR0FBRzt3QkFDWixZQUFZLEVBQUUsUUFBUSxDQUFDLElBQUk7d0JBQzNCLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSTt3QkFDaEIsS0FBSyxFQUFFLElBQUk7d0JBQ1gsUUFBUSxFQUFFLElBQUk7d0JBQ2QsWUFBWSxFQUFFLEtBQUs7cUJBQ3BCLENBQUM7b0JBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDL0MsSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO29CQUNwRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQ2xDLE1BQU0sQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3BFLE1BQU0sQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztLQUNGO0lBQ0QsUUFBUSxFQUFFLFlBQVk7Q0FDdkIsQ0FBQyxDQUFDO0FBRUksSUFBSSxpQkFBaUIsR0FBRztJQUM3QixjQUFjLEVBQUUsZUFBSztRQUNuQixPQUFPLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxVQUFVO1lBQ3hDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxhQUFhO1lBQ2pDLENBQUMsQ0FBQyxxQkFBcUI7WUFDdkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNULENBQUM7SUFDRCxjQUFjLEVBQUUsZUFBSyxJQUFJLGFBQU0sRUFBTixDQUFNO0lBQy9CLFdBQVcsRUFBRSxVQUFDLFFBQXVCLEVBQUUsS0FBeUIsRUFBRSxNQUFNO1FBQ3RFLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxXQUFDLElBQUksUUFBQyxDQUFDLGNBQWMsRUFBRSxFQUFsQixDQUFrQixDQUFDO1lBQzlDLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEQsVUFBVSxDQUFDLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQztZQUMzQyxVQUFVLENBQUMsU0FBUztnQkFDbEIsNEpBQTRKLENBQUM7WUFDL0osUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwQyxzREFBZ0IsQ0FDZDtnQkFDRSxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsU0FBUyxFQUFFLFNBQVM7YUFDckIsRUFDRCxVQUFVLENBQ1gsQ0FBQztZQUNGLE1BQU0sQ0FBQyx5QkFBeUIsQ0FDOUIsS0FBSyxFQUNMLGFBQWEsRUFDYixVQUFVLEVBQ1YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDakIsQ0FBQztTQUNIO1FBRUQsSUFBSSxRQUFRLEdBQUcsaURBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQ3hDLE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsU0FBUyxFQUFFLHNCQUFzQjtZQUNqQyxTQUFTLEVBQUUsR0FBRztZQUNkLEtBQUssRUFBRSxhQUFHO2dCQUNSLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQzVCLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ25DLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLENBQUM7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLEtBQUssR0FBRyxxRUFBc0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0YsQ0FBQztBQUVGLHdFQUFlLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFFM0MsSUFBSSxtQkFBbUIsR0FBRztJQUMvQixjQUFjLEVBQUUsZUFBSztRQUNuQixPQUFPLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxVQUFVO1lBQ3hDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxhQUFhO1lBQ2pDLENBQUMsQ0FBQyxxQkFBcUI7WUFDdkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNULENBQUM7SUFDRCxjQUFjLEVBQUUsZUFBSyxJQUFJLGFBQU0sRUFBTixDQUFNO0lBQy9CLFdBQVcsRUFBRSxVQUFDLFFBQXVCLEVBQUUsS0FBeUIsRUFBRSxNQUFNO1FBQ3RFLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLGNBQWMsR0FBRyx5RUFBb0IsQ0FBQztZQUN4QyxJQUFJLFNBQVMsR0FBcUIsQ0FDaEMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3hELENBQUM7WUFDRixNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFDLEtBQWE7Z0JBQzFDLElBQUksUUFBUSxHQUFHLGtFQUF5QixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxTQUFTLEdBQUcsaUVBQVksQ0FDMUIsUUFBUSxFQUNSLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBQyxJQUFJLFFBQUMsQ0FBQyxLQUFLLEVBQVAsQ0FBTyxDQUFDLENBQ3hDLENBQUM7Z0JBQ0YsSUFBSSxTQUFTLEdBQUcsSUFBVSx5REFBb0IsQ0FDNUMsU0FBUyxFQUNULFNBQVMsRUFDVCxnQkFBZ0IsQ0FDakIsQ0FBQztnQkFDRixTQUFTLENBQUMsUUFBUSxHQUFRO29CQUN4QixTQUFTLEVBQUU7d0JBQ1QsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQzs0QkFBRSxPQUFPLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDbkQsT0FBTyxFQUFFLENBQUM7b0JBQ1osQ0FBQztvQkFDRCxlQUFlLEVBQUUsVUFBQyxJQUFZO3dCQUM1QixPQUFPLElBQUksQ0FBQztvQkFDZCxDQUFDO29CQUNELGdCQUFnQixFQUFFLFVBQUMsSUFBWTt3QkFDN0IsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztpQkFDRixDQUFDO2dCQUNGLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLENBQUMsd0JBQXdCLENBQzdCLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULEtBQUssQ0FBQyxPQUFPLENBQ2QsQ0FBQztnQkFFRixJQUFJLFFBQVEsR0FBRywwREFBaUIsQ0FBQyxZQUFZLENBQzNDLGdCQUFnQixFQUNoQixXQUFXLENBQ1osQ0FBQztnQkFDRixNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxVQUFDLENBQUMsRUFBRSxJQUFJO29CQUNoQyxJQUFJLE9BQU8sR0FBRzt3QkFDWixZQUFZLEVBQUUsUUFBUSxDQUFDLElBQUk7d0JBQzNCLEdBQUcsRUFBRSxTQUFTO3dCQUNkLEtBQUssRUFBRSxJQUFJO3dCQUNYLFFBQVEsRUFBRSxJQUFJO3dCQUNkLFlBQVksRUFBRSxLQUFLO3FCQUNwQixDQUFDO29CQUNGLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDeEMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO29CQUNwRSxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUM5QixNQUFNLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDekQsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3RFLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDeEUsY0FBYyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDOUQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV0QyxJQUFJLEtBQUssR0FBRyxxRUFBc0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0YsQ0FBQztBQUVGLHdFQUFlLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7O0FDNU92RCx1Qzs7Ozs7Ozs7Ozs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUNXO0FBQ1c7QUFDTTtBQUVyQztBQUV0QixJQUFJLFlBQVksR0FBRyxtQkFBTyxDQUFDLHFLQUFpRCxDQUFDLENBQUM7QUFFdkUsU0FBUyxzQkFBc0IsQ0FBQyxXQUFvQjtJQUN6RCxJQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO0lBQ3BCLElBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRTtRQUNoQixLQUFLLENBQUMsTUFBTSxHQUFHLFdBQVcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0tBQ2hFO0lBQ0QsS0FBSyxDQUFDLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztJQUNyQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDbEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQzFCLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUMxQixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDM0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQ2hDLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEO0lBQ0UsNEJBQW9CLEtBQUssRUFBUyxXQUFtQixFQUFVLE1BQU07UUFBckUsaUJBQXlFO1FBQXZDLGlEQUFtQjtRQUFqQyxVQUFLLEdBQUwsS0FBSztRQUFTLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQVUsV0FBTSxHQUFOLE1BQU07UUFVckUsZ0JBQVcsR0FBRyxVQUFDLEtBQWE7WUFDMUIsS0FBSSxDQUFDLFlBQVksSUFBSSxLQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQztJQVpzRSxDQUFDO0lBRXpFLHdDQUFXLEdBQVgsVUFBWSxLQUFLLEVBQUUsS0FBSztRQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsd0NBQVcsR0FBWCxVQUFZLEtBQUssRUFBRSxLQUFLO1FBQ3RCLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBTU0seUNBQVksR0FBbkIsVUFBb0IsR0FBVztRQUM3QixPQUFPLHNFQUFrQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBR0gseUJBQUM7QUFBRCxDQUFDO0FBRUQsbURBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFO0lBQ3JDLFNBQVMsRUFBRTtRQUNULGVBQWUsRUFBRSxVQUFDLE1BQU0sRUFBRSxhQUFhO1lBQ3JDLElBQUksS0FBSyxHQUFHLElBQUksa0JBQWtCLENBQ2hDLE1BQU0sQ0FBQyxLQUFLLEVBQ1osTUFBTSxDQUFDLFdBQVcsRUFDbEIsTUFBTSxDQUFDLE1BQU0sQ0FDZCxDQUFDO1lBQ0YsSUFBSSxRQUFRLEdBQUcsMERBQWlCLENBQUMsWUFBWSxDQUMzQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUN2QixNQUFNLENBQUMsSUFBSSxDQUNaLENBQUM7WUFDRixJQUFJLFFBQVEsR0FBRyxVQUFDLElBQUk7Z0JBQ2xCLElBQUksT0FBTyxHQUFHO29CQUNaLFlBQVksRUFBRSxRQUFRLENBQUMsSUFBSTtvQkFDM0IsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUNoQixLQUFLLEVBQUUsSUFBSTtvQkFDWCxRQUFRLEVBQUUsSUFBSTtvQkFDZCxZQUFZLEVBQUUsS0FBSztpQkFDcEIsQ0FBQztnQkFDRixNQUFNLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ3BFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDcEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDO1lBQ0YsS0FBSyxDQUFDLFlBQVksR0FBRyxVQUFDLEtBQUs7Z0JBQ3pCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtvQkFDdkIsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNwQixPQUFPO2lCQUNSO2dCQUNELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUFFLE9BQU87Z0JBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxVQUFDLENBQUMsRUFBRSxJQUFJLElBQUssZUFBUSxDQUFDLElBQUksQ0FBQyxFQUFkLENBQWMsQ0FBQyxDQUFDO1lBQ2hFLENBQUMsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztLQUNGO0lBQ0QsUUFBUSxFQUFFLFlBQVk7Q0FDdkIsQ0FBQyxDQUFDO0FBRUksSUFBSSxZQUFZLEdBQUc7SUFDeEIsY0FBYyxFQUFFLFVBQUMsS0FBSztRQUNwQixPQUFPLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxVQUFVLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLE9BQU87WUFDdkUsQ0FBQyxDQUFDLGdCQUFnQjtZQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1QsQ0FBQztJQUNELGNBQWMsRUFBRSxVQUFDLEtBQUssSUFBSyxhQUFNLEVBQU4sQ0FBTTtJQUNqQyxXQUFXLEVBQUUsVUFBQyxRQUF1QixFQUFFLEtBQXlCLEVBQUUsTUFBTTtRQUN0RSxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxVQUFDLENBQUMsSUFBSyxRQUFDLENBQUMsY0FBYyxFQUFFLEVBQWxCLENBQWtCLENBQUM7WUFDaEQsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRCxVQUFVLENBQUMsU0FBUyxHQUFHLG1CQUFtQixDQUFDO1lBQzNDLFVBQVUsQ0FBQyxTQUFTO2dCQUNsQiw4SEFBOEgsQ0FBQztZQUNqSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXBDLElBQUksS0FBSyxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN0RCxTQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUUzQyxzREFBZ0IsQ0FDZDtnQkFDRSxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsTUFBTTtnQkFDZCxLQUFLLEVBQUUsS0FBSzthQUNiLEVBQ0QsVUFBVSxDQUNYLENBQUM7WUFDRixNQUFNLENBQUMseUJBQXlCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDckU7SUFDSCxDQUFDO0NBQ0YsQ0FBQztBQUVGLHdFQUFlLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7QUN4SHZDLHVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQStCO0FBQ1c7QUFDVztBQUNNO0FBQ3pCO0FBQ2tCO0FBRVc7QUFDaEI7QUFFbkI7QUFFNUIsSUFBSSxZQUFZLEdBQUcsbUJBQU8sQ0FBQyxpTEFBdUQsQ0FBQyxDQUFDO0FBRXBGLFNBQVMsZ0JBQWdCLENBQUMsUUFBNEIsRUFBRSxLQUFTO0lBQVQsaUNBQVM7SUFDL0QsVUFBVSxDQUFDO1FBQ1QsSUFBSSxRQUFRLENBQUMsZUFBZSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRTtZQUMzQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDaEIsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUNYO1lBQ0QsSUFBSSxVQUFVLEdBQ04sUUFBUSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FDdkUsQ0FBQztZQUNGLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZELElBQUksS0FBSyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7b0JBQzlCLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztpQkFDL0I7Z0JBQ0QsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDdEQ7U0FDRjtJQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNULENBQUM7QUFFRDtJQUF1QyxtRkFBa0I7SUFFdkQsMkJBQ0UsTUFBVyxFQUNYLElBQVksRUFDSixRQUE0QixFQUM1QixJQUFJLEVBQ1osV0FBVyxFQUNYLE1BQXFCO1FBTnZCLFlBUUUsa0JBQU0sTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQTZDL0M7UUFsRFMsY0FBUSxHQUFSLFFBQVEsQ0FBb0I7UUFDNUIsVUFBSSxHQUFKLElBQUk7UUFMTiwwQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFVbEMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxVQUFDLEtBQUs7WUFDNUMsSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUN2QywwREFBWSxDQUFDLGVBQWUsQ0FDMUIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQ3JCLEtBQUksQ0FBQyxJQUFJLEVBQ1QsQ0FBQyxLQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQztvQkFDdkMsQ0FBQztvQkFDRCxLQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7b0JBQzdCLEtBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDL0IsQ0FBQztnQkFDRixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZDLDBEQUFZLENBQUMsZUFBZSxDQUMxQixLQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFDckIsS0FBSSxDQUFDLElBQUksRUFDVCxDQUFDLEtBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM1QyxLQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQy9CLENBQUM7Z0JBQ0YsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixPQUFPLEtBQUssQ0FBQzthQUNkO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxXQUFXLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFVBQUMsS0FBSztZQUMxQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssRUFBRSxFQUFFO2dCQUN4QixLQUFJLENBQUMsU0FBUyxDQUFDLEtBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDNUIsT0FBTzthQUNSO1lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLEVBQUUsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0JBQ3hELEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM3QixPQUFPO2FBQ1I7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksYUFBYSxHQUFHO1lBQ2xCLG1CQUFtQixFQUFFLElBQUk7WUFDekIsbUJBQW1CLEVBQUUsSUFBSTtTQUMxQixDQUFDO1FBQ0YsS0FBSSxDQUFDLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FDNUMsU0FBUyxFQUNULEtBQUksQ0FBQyxRQUFRLEVBQ2IsYUFBYSxDQUNkLENBQUM7UUFDRixLQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDLG1CQUFtQixDQUFDOztJQUNoRSxDQUFDO0lBRUQsc0NBQVUsR0FBVixVQUFXLEtBQXdCLEVBQUUsS0FBSztRQUN4QyxJQUFJLFFBQVEsR0FBRywwREFBaUIsQ0FBQyxZQUFZLENBQzNDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQ3hCLFNBQVMsQ0FDVixDQUFDO1FBQ0YsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FDNUQsS0FBSyxDQUFDLFFBQVEsRUFDZCxRQUFRLEVBQ1IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQ1gsQ0FBQztRQUNGLElBQUksV0FBVyxFQUFFO1lBQ2YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQy9CLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7YUFDdkM7aUJBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN0QyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2FBQ1g7aUJBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNqQyxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2FBQ3ZDO2lCQUFNO2dCQUNMLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ2xCLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BEO1lBQ0QsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QyxJQUFJLFVBQVUsRUFBRTtnQkFDZCxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDcEQ7SUFDSCxDQUFDO0lBRUQsc0JBQUksMENBQVc7YUFBZjtZQUNFLE9BQU8sQ0FDTCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsSUFBSTtnQkFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSTtnQkFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUN4QyxDQUFDO1FBQ0osQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSx5Q0FBVTthQUFkO1lBQ0UsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7OztPQUFBO0lBRUQsc0JBQUksa0RBQW1CO2FBQXZCO1lBQ0UsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDbkMsQ0FBQzs7O09BQUE7SUFDSCx3QkFBQztBQUFELENBQUMsQ0EzR3NDLGdFQUFrQixHQTJHeEQ7O0FBRUQsbURBQWEsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFO0lBQ3BDLFNBQVMsRUFBRTtRQUNULGVBQWUsRUFBRSxVQUFDLE1BQU0sRUFBRSxhQUFhO1lBQ3JDLElBQUksS0FBSyxHQUFHLElBQUksaUJBQWlCLENBQy9CLE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLElBQUksRUFDWCxNQUFNLENBQUMsUUFBUSxFQUNmLE1BQU0sQ0FBQyxJQUFJLEVBQ1gsYUFBYSxDQUFDLE9BQU8sRUFDckIsTUFBTSxDQUFDLE1BQU0sQ0FDZCxDQUFDO1lBQ0YsSUFBSSxRQUFRLEdBQUcsMERBQWlCLENBQUMsWUFBWSxDQUMzQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUN2QixNQUFNLENBQUMsSUFBSSxDQUNaLENBQUM7WUFDRixLQUFLLENBQUMsWUFBWSxHQUFHLFVBQUMsUUFBUTtnQkFDNUIsSUFBSSxPQUFPLEdBQUc7b0JBQ1osWUFBWSxFQUFFLFFBQVEsQ0FBQyxJQUFJO29CQUMzQixHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ2hCLEtBQUssRUFBRSxRQUFRO29CQUNmLFFBQVEsRUFBRSxJQUFJO29CQUNkLFlBQVksRUFBRSxLQUFLO2lCQUNwQixDQUFDO2dCQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9DLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDeEUsSUFBSSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sRUFBRTtvQkFDdkMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2lCQUM5QjtnQkFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7Z0JBQ3RDLE1BQU0sQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3hFLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWTtvQkFDbkIsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzlELE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQyxDQUFDO1lBQ0YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0tBQ0Y7SUFDRCxRQUFRLEVBQUUsWUFBWTtDQUN2QixDQUFDLENBQUM7QUFFSSxJQUFJLFdBQVcsR0FBRztJQUN2QixvQkFBb0IsRUFBRSxLQUFLO0lBQzNCLGNBQWMsRUFBRSxVQUFDLEtBQUs7UUFDcEIsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07WUFDbkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ2YsT0FBTyxLQUFLLENBQUMsT0FBTyxLQUFLLFVBQVU7WUFDbkMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGFBQWE7WUFDakMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CO1lBQzFCLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDWCxDQUFDLENBQUMsZUFBZTtZQUNqQixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1QsQ0FBQztJQUNELGNBQWMsRUFBRSxVQUFDLEtBQUssSUFBSyxxQkFBYyxFQUFkLENBQWM7SUFDekMsV0FBVyxFQUFFLFVBQUMsUUFBdUIsRUFBRSxLQUF5QixFQUFFLE1BQU07UUFDdEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxVQUFDLENBQUMsSUFBSyxRQUFDLENBQUMsY0FBYyxFQUFFLEVBQWxCLENBQWtCLENBQUM7WUFDaEQsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRCxVQUFVLENBQUMsU0FBUyxHQUFHLG1CQUFtQixDQUFDO1lBQzNDLElBQUksU0FBUyxHQUFHLGdEQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBRyxDQUFDLFNBQVMsRUFBRTtnQkFDYixTQUFTO2FBQ1Y7WUFDRCxJQUFJLFlBQVksR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3ZFLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQztZQUN2QixJQUFJLFNBQVMsS0FBSyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQ3hDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ2YsWUFBWSxHQUFHLGVBQWUsQ0FBQzthQUNoQztZQUNELElBQUksU0FBUyxLQUFLLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDeEMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDZixZQUFZLEdBQUcsVUFBVSxDQUFDO2FBQzNCO1lBQ0QsSUFBSSxTQUFTLEtBQUssS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0JBQ3pDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ2YsWUFBWSxHQUFHLFdBQVcsQ0FBQzthQUM1QjtZQUNELFVBQVUsQ0FBQyxTQUFTO2dCQUNsQiwrQkFBK0I7b0JBQy9CLFlBQVk7b0JBQ1osb0ZBQW9GLENBQUM7WUFDdkYsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwQyxzREFBZ0IsQ0FDZDtnQkFDRSxJQUFJLEVBQUUsU0FBUztnQkFDZixRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsTUFBTTthQUNmLEVBQ0QsVUFBVSxDQUNYLENBQUM7WUFDRixNQUFNLENBQUMseUJBQXlCLENBQzlCLEtBQUssRUFDTCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFNBQVMsQ0FDVixDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBQ0YsQ0FBQztBQUVGLHdFQUFlLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBRXZDLElBQUksb0JBQW9CLEdBQUcsVUFDaEMsUUFBbUMsRUFDbkMsV0FBa0QsRUFDbEQsWUFBMEQ7SUFBMUQsa0RBQTBEO0lBQ3ZEO1FBQ0gsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSTtZQUM5QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLFFBQVEsR0FBRyxrRUFBeUIsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbkUsU0FBUyxHQUFHLGlFQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTNDLElBQUksU0FBUyxHQUFHLElBQUkseURBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsU0FBUyxDQUFDLFFBQVEsR0FBUTtZQUN4QixTQUFTLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztvQkFBRSxPQUFPLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDekQsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBQ0QsZUFBZSxFQUFFLFVBQUMsSUFBWTtnQkFDNUIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsZ0JBQWdCLEVBQUUsVUFBQyxJQUFZO2dCQUM3QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7U0FDRixDQUFDO1FBQ0YsQ0FBQyxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNqQyxVQUFDLFVBQVUsSUFBSyxpQkFBVSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsS0FBSyxFQUFwQyxDQUFvQyxDQUNyRCxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztBQTVCSSxDQTRCSixDQUFDO0FBRUssSUFBSSxvQkFBb0IsR0FBRyxVQUFDLE9BQU87SUFDeEMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUMsS0FBSyxHQUFHLHNFQUFrQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxRCxNQUFNLENBQUMsU0FBUztRQUNkLHNFQUFzRSxDQUFDO0lBQ3pFLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsb0VBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNwQixNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV0QyxJQUFJLE9BQU8sR0FBUSxRQUFRLENBQUMsZUFBZSxDQUN6Qyw0QkFBNEIsRUFDNUIsS0FBSyxDQUNOLENBQUM7SUFDRixPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7SUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQzlCLElBQUksT0FBTyxHQUFRLFFBQVEsQ0FBQyxlQUFlLENBQ3pDLDRCQUE0QixFQUM1QixLQUFLLENBQ04sQ0FBQztJQUNGLE9BQU8sQ0FBQyxjQUFjLENBQ3BCLDhCQUE4QixFQUM5QixZQUFZLEVBQ1osbUJBQW1CLENBQ3BCLENBQUM7SUFDRixPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsOENBQThDO0lBQzlDLGtDQUFrQztJQUNsQyw2QkFBNkI7SUFDN0IsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUssSUFBSSxtQkFBbUIsR0FBRyxVQUFDLEtBQUssRUFBRSxPQUFPO0lBQzlDLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDdEIsT0FBTyxDQUFDLFNBQVMsR0FBRyxxREFBcUQsQ0FBQztJQUMxRSxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUMxQixPQUFPLENBQUMsT0FBTyxHQUFHLG9FQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDckIsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxPQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDbEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFFSyxJQUFJLG9CQUFvQixHQUFHO0lBQ2hDLGNBQWMsRUFBRSxVQUFDLEtBQUs7UUFDcEIsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07WUFDbkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ2YsT0FBTyxLQUFLLENBQUMsT0FBTyxLQUFLLFVBQVU7WUFDbkMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGFBQWE7WUFDakMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CO1lBQzFCLENBQUMsQ0FBQyxnQkFBZ0I7WUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNULENBQUM7SUFDRCxjQUFjLEVBQUUsVUFBQyxLQUFLLElBQUssYUFBTSxFQUFOLENBQU07SUFDakMsV0FBVyxFQUFFLFVBQ1gsUUFBdUIsRUFDdkIsS0FBeUIsRUFDekIsTUFBcUI7UUFFckIsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzNDO1NBQ0Y7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLFNBQVMsR0FBRyxnREFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUcsQ0FBQyxTQUFTLEVBQUU7Z0JBQ2IsU0FBUzthQUNWO1lBQ0QsSUFDRSxTQUFTLEtBQUssS0FBSyxDQUFDLG9CQUFvQixDQUFDO2dCQUN6QyxTQUFTLEtBQUssS0FBSyxDQUFDLGVBQWUsQ0FBQztnQkFDcEMsU0FBUyxLQUFLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNyQztnQkFDQSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ2hEO1NBQ0Y7UUFDRCxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQUMsUUFBUTtZQUN6Qix3REFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7Z0JBQ3hCLE1BQU0sRUFBRSxtQkFBbUI7Z0JBQzNCLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDZixTQUFTLEVBQUUsaUJBQWlCO2dCQUM1QixTQUFTLEVBQUUsR0FBRztnQkFDZCxLQUFLLEVBQUUsVUFBQyxHQUFHO29CQUNULElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7b0JBQzVCLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7b0JBQzVCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7b0JBQzVCLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ25DLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTt3QkFDcEIsTUFBTSxHQUFHLGdEQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM5QixJQUFJLGFBQWEsR0FBRyxnREFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ3ZELElBQUksVUFBVSxHQUFHLGFBQWEsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQzFELFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNuQyxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDeEM7b0JBQ0QsTUFBTSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO29CQUM3RCxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDNUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNwQyxNQUFNLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN6QyxNQUFNLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hDLENBQUM7YUFDRixDQUFDO1FBdkJGLENBdUJFLENBQ0gsQ0FBQztRQUNGLElBQUksYUFBYSxHQUFHO1lBQ2xCLG1CQUFtQixFQUFFLElBQUk7WUFDekIsbUJBQW1CLEVBQUUsSUFBSTtTQUMxQixDQUFDO1FBQ0YsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDM0UsSUFBSSxhQUFhLENBQUMsbUJBQW1CLEVBQUU7WUFDckMsSUFBSSxNQUFNLEdBQUcsb0JBQW9CLENBQy9CLG9CQUFvQixDQUNsQixLQUFLLEVBQ0wsVUFBQyxTQUFTO2dCQUNSLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxDQUFDLEVBQ0QsVUFBQyxTQUFTO2dCQUNSLE1BQU0sQ0FBQyx3QkFBd0IsQ0FDN0IsS0FBSyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsS0FBSyxDQUFDLE9BQU8sQ0FDZCxDQUFDO1lBQ0osQ0FBQyxDQUNGLENBQ0YsQ0FBQztZQUNGLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEM7UUFDRCxJQUFJLGtCQUFrQixHQUFHLFVBQ3ZCLE1BQVcsRUFDWCxZQUFvQixFQUNwQixRQUFhO1lBRWIsSUFBSSxPQUFPLEdBQUc7Z0JBQ1osWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEtBQUssRUFBRSxRQUFRO2dCQUNmLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFlBQVksRUFBRSxLQUFLO2FBQ3BCLENBQUM7WUFDRixNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ3hFLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztRQUNGLElBQUksaUJBQWlCLEdBQUcsVUFDdEIsTUFBVyxFQUNYLFlBQW9CLEVBQ3BCLFFBQWE7WUFFYixJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUU7Z0JBQ3hDLElBQUksUUFBUSxHQUFHLDBEQUFpQixDQUFDLFlBQVksQ0FDM0MsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUNoQixZQUFZLENBQ2IsQ0FBQztnQkFDRixNQUFNLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQzthQUMzRDtRQUNILENBQUMsQ0FBQztRQUNGLElBQ0UsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUM7WUFDL0MsS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQ3ZCO1lBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FDdEIsbUJBQW1CLENBQUMsc0VBQWtCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUMvRCxJQUFJLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7Z0JBQy9CLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMzRCxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztnQkFDMUIsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDL0MsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxDQUNILENBQUM7U0FDSDtRQUNELElBQ0UsS0FBSyxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQ2hDLEtBQUssQ0FBQyxZQUFZLEtBQUssSUFBSTtZQUMzQixNQUFNLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxFQUNuRDtZQUNBLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQ3RCLG1CQUFtQixDQUNqQixzRUFBa0IsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsRUFDL0M7Z0JBQ0UsSUFBSSxRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUNuQyxRQUFRLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDL0QsS0FBSyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7Z0JBQzlCLGlCQUFpQixDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ25ELGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3QixDQUFDLENBQ0YsQ0FDRixDQUFDO1NBQ0g7UUFDRCxJQUNFLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUztZQUMzQixLQUFLLENBQUMsT0FBTyxLQUFLLElBQUk7WUFDdEIsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFDOUM7WUFDQSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUN0QixtQkFBbUIsQ0FBQyxzRUFBa0IsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQzlELElBQUksUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDOUIsUUFBUSxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzFELEtBQUssQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO2dCQUN6QixpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FDSCxDQUFDO1NBQ0g7UUFFRCxNQUFNLENBQUMseUJBQXlCLENBQzlCLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUNaLFNBQVMsQ0FDVixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFFRix3RUFBZSxDQUFDLG1CQUFtQixFQUFFLG9CQUFvQixDQUFDLENBQUM7Ozs7Ozs7Ozs7OztBQ2pmM0QsdUM7Ozs7Ozs7Ozs7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUlGO0FBRXRCLElBQUksWUFBWSxHQUFHO0lBQ3hCLGNBQWMsRUFBRSxlQUFLO1FBQ25CLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxPQUFPLGdCQUFnQixDQUFDO1NBQ3pCO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsY0FBYyxFQUFFLGVBQUssSUFBSSxjQUFPLEVBQVAsQ0FBTztJQUNoQyxXQUFXLEVBQUUsVUFBQyxRQUF1QixFQUFFLEtBQUssRUFBRSxNQUFNO1FBQ2xELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsVUFBVSxDQUFDLFNBQVM7WUFDbEIsc0ZBQXNGLENBQUM7UUFDekYsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxXQUFDLElBQUksUUFBQyxDQUFDLGNBQWMsRUFBRSxFQUFsQixDQUFrQixDQUFDO1FBQzlDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsc0RBQWdCLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMseUJBQXlCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0YsQ0FBQztBQUVGLHlDQUF5Qzs7Ozs7Ozs7Ozs7O0FDekJ6Qyx1Qzs7Ozs7Ozs7Ozs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFLSDtBQUMrQjtBQUMxQjtBQUNqQyxJQUFJLFlBQVksR0FBRyxtQkFBTyxDQUFDLDJMQUE0RCxDQUFDLENBQUM7QUFFekY7SUFDRSxnQ0FBbUIsUUFBUSxFQUFVLE1BQU07UUFBeEIsYUFBUSxHQUFSLFFBQVE7UUFBVSxXQUFNLEdBQU4sTUFBTTtRQUtwQyxZQUFPLEdBQUcsd0RBQWtCLEVBQXlCLENBQUM7UUFKM0QsSUFBSSxpQkFBaUIsR0FBc0IsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFJTSx5Q0FBUSxHQUFmLFVBQWdCLEtBQTRCO1FBQzFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDaEIsT0FBTywrQ0FBUyxDQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQztRQUNELE9BQU8sYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVNLHlDQUFRLEdBQWYsVUFBZ0IsV0FBVztRQUN6QixPQUFPLHNFQUFrQixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0gsNkJBQUM7QUFBRCxDQUFDOztBQUVELG1EQUFhLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0lBQ3pDLFNBQVMsRUFBRTtRQUNULGVBQWUsRUFBRSxVQUFDLE1BQU0sRUFBRSxhQUFhO1lBQ3JDLElBQUksS0FBSyxHQUFHLElBQUksc0JBQXNCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0tBQ0Y7SUFDRCxRQUFRLEVBQUUsWUFBWTtDQUN2QixDQUFDLENBQUM7QUFFSSxJQUFJLHNCQUFzQixHQUFHO0lBQ2xDLGNBQWMsRUFBRSxlQUFLO1FBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsY0FBYyxFQUFFLGVBQUssSUFBSSxpQkFBVSxFQUFWLENBQVU7SUFDbkMsV0FBVyxFQUFFLFVBQUMsUUFBdUIsRUFBRSxLQUFLLEVBQUUsTUFBTTtRQUNsRCxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLFVBQVUsQ0FBQyxTQUFTLEdBQUcsdUJBQXVCLENBQUM7UUFDL0MsVUFBVSxDQUFDLFNBQVM7WUFDbEIsZ0ZBQWdGLENBQUM7UUFDbkYsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxzREFBZ0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDMUUsQ0FBQztDQUNGLENBQUM7QUFFRix3RUFBZSxDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLENBQUM7QUFFckQsSUFBSSxtQkFBbUIsR0FBRztJQUMvQixjQUFjLEVBQUUsZUFBSztRQUNuQixPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTztZQUNwQixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07WUFDZCxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssV0FBVztZQUMvQixLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssTUFBTTtZQUMxQixDQUFDLENBQUMsZUFBZTtZQUNqQixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1QsQ0FBQztJQUNELGNBQWMsRUFBRSxlQUFLLElBQUksa0JBQVcsRUFBWCxDQUFXO0lBQ3BDLFdBQVcsRUFBRSxzQkFBc0IsQ0FBQyxXQUFXO0NBQ2hELENBQUM7QUFFRix3RUFBZSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7QUN2RXRELHVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0ErQjtBQUNXO0FBQ1c7QUFDTTtBQUNQO0FBRVU7QUFFM0I7QUFFbkMsSUFBSSxZQUFZLEdBQUcsbUJBQU8sQ0FBQywrTEFBOEQsQ0FBQyxDQUFDO0FBRTNGO0lBQStCLGtGQUFrQjtJQUMvQywwQkFDRSxNQUFXLEVBQ1gsSUFBWSxFQUNKLFFBQStCLEVBQy9CLElBQUksRUFDWixXQUFXLEVBQ1gsTUFBcUI7UUFOdkIsWUFRRSxrQkFBTSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFNBQy9DO1FBTlMsY0FBUSxHQUFSLFFBQVEsQ0FBdUI7UUFDL0IsVUFBSSxHQUFKLElBQUk7O0lBS2QsQ0FBQztJQUVELHFDQUFVLEdBQVYsVUFBVyxLQUF1QixFQUFFLEtBQUs7UUFDdkMsSUFBSSxRQUFRLEdBQUcsMERBQWlCLENBQUMsWUFBWSxDQUMzQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUN4QixZQUFZLENBQ2IsQ0FBQztRQUNGLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0NBQWdDLENBQzVELEtBQUssQ0FBQyxRQUFRLEVBQ2QsUUFBUSxFQUNSLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUN6QixLQUFLLENBQUMsSUFBSSxDQUNYLENBQUM7UUFDRixJQUFJLFdBQVcsRUFBRTtZQUNmLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLGlCQUFpQjtpQkFDbkMsR0FBRyxDQUFDLFVBQUMsSUFBSSxJQUFLLFdBQUksQ0FBQyxLQUFLLEVBQVYsQ0FBVSxDQUFDO2lCQUN6QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU3QixJQUNFLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQ2hDLEtBQUssS0FBSyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDL0M7Z0JBQ0EsUUFBUSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDO2FBQ3ZDO2lCQUFNO2dCQUNMLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUNwQyxRQUFRLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztpQkFDbEQ7Z0JBQ0QsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3RDO1lBQ0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNoRDtJQUNILENBQUM7SUFFRCxzQkFBSSx3Q0FBVTthQUFkO1lBQ0UsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7UUFDdEQsQ0FBQzs7O09BQUE7SUFFRCxrQ0FBTyxHQUFQO1FBQ0UsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQUNILHVCQUFDO0FBQUQsQ0FBQyxDQW5EOEIsZ0VBQWtCLEdBbURoRDtBQUVELG1EQUFhLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzNDLFNBQVMsRUFBRTtRQUNULGVBQWUsRUFBRSxVQUFDLE1BQU0sRUFBRSxhQUFhO1lBQ3JDLElBQUksS0FBSyxHQUFHLElBQUksZ0JBQWdCLENBQzlCLE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLElBQUksRUFDWCxNQUFNLENBQUMsUUFBUSxFQUNmLE1BQU0sQ0FBQyxJQUFJLEVBQ1gsYUFBYSxDQUFDLE9BQU8sRUFDckIsTUFBTSxDQUFDLE1BQU0sQ0FDZCxDQUFDO1lBQ0YsSUFBSSxRQUFRLEdBQTBCLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFFdEQsSUFBSSxRQUFRLEdBQUcsMERBQWlCLENBQUMsWUFBWSxDQUMzQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUN2QixNQUFNLENBQUMsSUFBSSxDQUNaLENBQUM7WUFDRixLQUFLLENBQUMsWUFBWSxHQUFHLFVBQUMsUUFBUTtnQkFDNUIsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ3BDLElBQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDOUMsSUFBSSxLQUFLLEdBQUcsVUFBVTt5QkFDbkIsR0FBRyxDQUFDLFVBQUMsSUFBSSxJQUFLLFdBQUksQ0FBQyxLQUFLLEVBQVYsQ0FBVSxDQUFDO3lCQUN6QixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDOUIsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7b0JBQzFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO2lCQUNsQztxQkFBTTtvQkFDTCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7aUJBQ3ZDO2dCQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQyxDQUFDO1lBQ0YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0tBQ0Y7SUFDRCxRQUFRLEVBQUUsWUFBWTtDQUN2QixDQUFDLENBQUM7QUFFSCxJQUFJLG9CQUFvQixHQUFHLFVBQ3pCLFFBQStCLEVBQy9CLFdBQWtELEVBQ2xELFlBQTBEO0lBQTFELGtEQUEwRDtJQUN2RDtRQUNILElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLFFBQVEsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQztTQUN2QzthQUFNO1lBQ0wsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSTtnQkFDakQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxRQUFRLEdBQUcsa0VBQXlCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ25FLFNBQVMsR0FBRyxpRUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUUzQyxJQUFJLFNBQVMsR0FBRyxJQUFJLHlEQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFDLFNBQVMsQ0FBQyxRQUFRLEdBQVE7Z0JBQ3hCLFNBQVMsRUFBRTtvQkFDVCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO3dCQUFFLE9BQU8sUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUN6RCxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO2dCQUNELGVBQWUsRUFBRSxVQUFDLElBQVk7b0JBQzVCLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsZ0JBQWdCLEVBQUUsVUFBQyxJQUFZO29CQUM3QixPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2FBQ0YsQ0FBQztZQUNGLFFBQVEsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsQ0FBQyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUMsQ0FBQztBQTVCSSxDQTRCSixDQUFDO0FBRUssSUFBSSxpQkFBaUIsR0FBRztJQUM3QixjQUFjLEVBQUUsVUFBQyxLQUFLO1FBQ3BCLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUNELGNBQWMsRUFBRSxVQUFDLEtBQUssSUFBSyxpQkFBVSxFQUFWLENBQVU7SUFDckMsV0FBVyxFQUFFLFVBQ1gsUUFBdUIsRUFDdkIsS0FBNEIsRUFDNUIsTUFBTTtRQUVOLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsVUFBQyxDQUFDLElBQUssUUFBQyxDQUFDLGNBQWMsRUFBRSxFQUFsQixDQUFrQixDQUFDO1lBQ2hELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEQsVUFBVSxDQUFDLFNBQVM7Z0JBQ2xCLG1JQUFtSSxDQUFDO1lBQ3RJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEMsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLHNEQUFnQixDQUNkO2dCQUNFLElBQUksRUFBRSxJQUFJO2dCQUNWLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSxJQUFJO2dCQUNaLE1BQU0sRUFBRSxNQUFNO2FBQ2YsRUFDRCxVQUFVLENBQ1gsQ0FBQztZQUNGLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMxRTtRQUVELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsTUFBTSxDQUFDLEtBQUssR0FBRyxzRUFBa0IsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsTUFBTSxDQUFDLFNBQVM7WUFDZCxpRUFBaUUsQ0FBQztRQUNwRSxNQUFNLENBQUMsT0FBTyxHQUFHLG9CQUFvQixDQUNuQyxLQUFLLEVBQ0wsVUFBQyxTQUFTO1lBQ1IsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FDN0IsS0FBSyxFQUNMLFlBQVksRUFDWixTQUFTLEVBQ1QsS0FBSyxDQUFDLGlCQUFpQixDQUN4QixDQUFDO1FBQ0osQ0FBQyxFQUNELFVBQUMsU0FBUztZQUNSLE1BQU0sQ0FBQyx3QkFBd0IsQ0FDN0IsS0FBSyxFQUNMLFlBQVksRUFDWixTQUFTLEVBQ1QsS0FBSyxDQUFDLGlCQUFpQixDQUN4QixDQUFDO1FBQ0osQ0FBQyxDQUNGLENBQUM7UUFDRixJQUFJLE9BQU8sR0FBUSxRQUFRLENBQUMsZUFBZSxDQUN6Qyw0QkFBNEIsRUFDNUIsS0FBSyxDQUNOLENBQUM7UUFDRixPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQzlCLElBQUksT0FBTyxHQUFRLFFBQVEsQ0FBQyxlQUFlLENBQ3pDLDRCQUE0QixFQUM1QixLQUFLLENBQ04sQ0FBQztRQUNGLE9BQU8sQ0FBQyxjQUFjLENBQ3BCLDhCQUE4QixFQUM5QixZQUFZLEVBQ1osbUJBQW1CLENBQ3BCLENBQUM7UUFDRixPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFNUIsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7UUFDckQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0NBQ0YsQ0FBQztBQUVGLHdFQUFlLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNyTmxEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDNEI7QUFDdkI7QUFFaUI7QUFFckQsSUFBSSxZQUFZLEdBQUcsbUJBQU8sQ0FBQyxtTUFBZ0UsQ0FBQyxDQUFDO0FBRTdGLG1EQUFhLENBQUMsUUFBUSxDQUFDLHNCQUFzQixFQUFFO0lBQzdDLFNBQVMsRUFBRTtRQUNULGVBQWUsRUFBRSxVQUFDLE1BQU0sRUFBRSxhQUFhO1lBQ3JDLElBQUksVUFBVSxHQUFHLG1EQUFhLENBQUMsZ0VBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUQsSUFBSSxPQUFPLEdBQUcsd0RBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxRCxJQUFJLFNBQVMsR0FBRyxtREFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekQsT0FBTztnQkFDTCxPQUFPLEVBQUUsT0FBTztnQkFDaEIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUN6QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLFVBQVUsRUFBRSxVQUFVO2dCQUN0QixNQUFNLEVBQUUsY0FBTSxpQkFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBekIsQ0FBeUI7Z0JBQ3ZDLFlBQVksRUFBRSxhQUFHLElBQUksNkVBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFqQyxDQUFpQztnQkFDdEQsU0FBUyxFQUFFLFNBQVM7YUFDckIsQ0FBQztRQUNKLENBQUM7S0FDRjtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQztBQUVJLElBQUksaUJBQWlCLEdBQUcsVUFBQyxRQUF1QixFQUFFLEtBQXlCLEVBQUUsTUFBTTtJQUN0RixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLFdBQUMsSUFBSSxRQUFDLENBQUMsY0FBYyxFQUFFLEVBQWxCLENBQWtCLENBQUM7SUFDOUMsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxVQUFVLENBQUMsU0FBUztRQUNsQiwyRkFBMkYsQ0FBQztJQUM5RixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BDLHNEQUFnQixDQUNkO1FBQ0UsUUFBUSxFQUFFLEtBQUs7UUFDZixNQUFNLEVBQUUsTUFBTTtLQUNmLEVBQ0QsVUFBVSxDQUNYLENBQUM7SUFDRixNQUFNLENBQUMseUJBQXlCLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7Ozs7Ozs7Ozs7OztBQzFDSCx1Qzs7Ozs7Ozs7Ozs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDVztBQUNSO0FBQ3lCO0FBQ087QUFDZDtBQUNoQjtBQUVwQyxJQUFJLFlBQVksR0FBRyxtQkFBTyxDQUFDLGlNQUErRCxDQUFDLENBQUM7QUFFNUYsbURBQWEsQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUU7SUFDNUMsU0FBUyxFQUFFO1FBQ1QsZUFBZSxFQUFFLFVBQUMsTUFBTSxFQUFFLGFBQWE7WUFDckMsSUFBSSxVQUFVLEdBQUcsbURBQWEsQ0FBQyxnRUFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5RCxJQUFJLE9BQU8sR0FBRyx3REFBa0IsRUFBRSxDQUFDO1lBQ25DLGlEQUFXLENBQUMsY0FBUSxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pELElBQUksU0FBUyxHQUFHLG1EQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6RCxJQUFJLGVBQWUsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FDOUUsOEJBQThCLENBQy9CLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDcEIsaURBQWlEO1lBQ2pELCtCQUErQjtZQUMvQixjQUFjO1lBQ2QsS0FBSztZQUNMLElBQUksa0JBQWtCLEdBQUcsVUFDdkIsTUFBVyxFQUNYLFlBQW9CLEVBQ3BCLFFBQWE7Z0JBRWIsSUFBSSxPQUFPLEdBQUc7b0JBQ1osWUFBWSxFQUFFLFlBQVk7b0JBQzFCLEdBQUcsRUFBRSxNQUFNO29CQUNYLEtBQUssRUFBRSxRQUFRO29CQUNmLFFBQVEsRUFBRSxJQUFJO29CQUNkLFlBQVksRUFBRSxLQUFLO2lCQUNwQixDQUFDO2dCQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9DLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDeEUsT0FBTyxRQUFRLENBQUM7WUFDbEIsQ0FBQyxDQUFDO1lBQ0YsSUFBSSxpQkFBaUIsR0FBRyxVQUN0QixNQUFXLEVBQ1gsWUFBb0IsRUFDcEIsUUFBYTtnQkFFYixJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUU7b0JBQ3hDLElBQUksUUFBUSxHQUFHLDBEQUFpQixDQUFDLFlBQVksQ0FDM0MsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUNoQixZQUFZLENBQ2IsQ0FBQztvQkFDRixNQUFNLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQ2xFO1lBQ0gsQ0FBQyxDQUFDO1lBQ0YsT0FBTztnQkFDTCxPQUFPLEVBQUUsT0FBTztnQkFDaEIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2dCQUMzQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3pCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtnQkFDckIsVUFBVSxFQUFFLFVBQVU7Z0JBQ3RCLE1BQU0sRUFBRSxjQUFNLGlCQUFVLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUF6QixDQUF5QjtnQkFDdkMsU0FBUyxFQUFFLGlEQUFXLENBQ3BCO29CQUNFLGFBQU0sQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7d0JBQ2hFLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLElBQUk7Z0JBRGpDLENBQ2lDLENBQ3BDO2dCQUNELFFBQVEsRUFBRTtvQkFDUixJQUFJLFFBQVEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO29CQUN6QyxRQUFRLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ3JFLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztvQkFDcEMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzNELENBQUM7Z0JBQ0QsT0FBTyxFQUFFLHlFQUFvQixDQUMzQixNQUFNLENBQUMsUUFBUSxFQUNmLG1CQUFTO29CQUNQLGtCQUFrQjtvQkFDbEIsNkJBQTZCO29CQUM3QiwwQkFBMEI7b0JBQzFCLG9DQUFvQztvQkFDcEMsb0JBQW9CO29CQUNwQix3QkFBd0I7b0JBQ3hCLEtBQUs7b0JBQ0wsa0RBQWtEO29CQUNsRCxtQ0FBbUM7Z0JBQ3JDLENBQUMsRUFDRCxtQkFBUztvQkFDUCxNQUFNLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUNwQyxNQUFNLENBQUMsUUFBUSxFQUNmLFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQ3hCLENBQUM7b0JBQ0Ysd0NBQXdDO29CQUN4QyxjQUFjO29CQUNkLHFCQUFxQjtvQkFDckIsNEJBQTRCO29CQUM1QixLQUFLO29CQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDLENBQ0Y7Z0JBQ0QsWUFBWSxFQUFFLGFBQUcsSUFBSSw2RUFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQWpDLENBQWlDO2dCQUN0RCxlQUFlLEVBQUU7b0JBQ2YsSUFBSSxRQUFRLEVBQUU7d0JBQ1osUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO3FCQUNwQjtvQkFDRCxRQUFRLEdBQUcsaURBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFO3dCQUMxQyxNQUFNLEVBQUUsbUJBQW1CO3dCQUMzQixTQUFTLEVBQUUsaUJBQWlCO3dCQUM1QixTQUFTLEVBQUUsR0FBRzt3QkFDZCxLQUFLLEVBQUUsYUFBRzs0QkFDUixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQ3BELElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7NEJBQ3RDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDbkMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQzs0QkFDM0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDOzRCQUNyQyxzQkFBc0I7d0JBQ3hCLENBQUM7cUJBQ0YsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsWUFBWSxFQUFFLFVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxRQUFRO29CQUM5QyxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3BELE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDWixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQ3JDLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsZ0JBQWdCLEVBQ2hCLGFBQWEsQ0FBQyxPQUFPLENBQ3RCLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxTQUFTLEVBQUUsU0FBUztnQkFDcEIsaUJBQWlCLEVBQUUsVUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFFBQVE7b0JBQ25ELFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO2FBQ0YsQ0FBQztRQUNKLENBQUM7S0FDRjtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQztBQUVJLElBQUksbUJBQW1CLEdBQUcsVUFDL0IsUUFBdUIsRUFDdkIsS0FBeUIsRUFDekIsTUFBTTtJQUVOLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsV0FBQyxJQUFJLFFBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBbEIsQ0FBa0IsQ0FBQztJQUM5QyxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLFVBQVUsQ0FBQyxTQUFTO1FBQ2xCLGdGQUFnRjtZQUNoRixDQUFDLHdEQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3JELDRCQUE0QixDQUFDO0lBQy9CLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsc0RBQWdCLENBQ2Q7UUFDRSxRQUFRLEVBQUUsS0FBSztRQUNmLE1BQU0sRUFBRSxNQUFNO0tBQ2YsRUFDRCxVQUFVLENBQ1gsQ0FBQztJQUNGLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDeEUsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDL0pGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXFFO0FBQ0E7QUFDaEI7QUFFakI7QUFFN0IsSUFBSSxrQkFBa0IsR0FBRztJQUM5QixjQUFjLEVBQUUsZUFBSztRQUNuQixPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFFLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFDRCxjQUFjLEVBQUUsZUFBSyxJQUFJLHNCQUFlLEVBQWYsQ0FBZTtJQUN4QyxXQUFXLEVBQUUsaUZBQW1CO0lBQ2hDLGNBQWMsRUFBRyxnRkFBaUI7SUFDbEMsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQztBQUNGLHdFQUFlLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7O0FDZnRELHVDOzs7Ozs7Ozs7Ozs7QUNBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQU00QjtBQUc3QjtBQUM5QixJQUFJLFlBQVksR0FBRyxtQkFBTyxDQUFDLHFMQUF5RCxDQUFDLENBQUM7QUFFdEY7SUFDRSwrQkFDUyxNQUF5QixFQUN0QixLQUF1QixFQUN2QixXQUFXLEVBQ3JCLGlCQUF3QjtRQUoxQixpQkE0RUM7UUF4RUMsNERBQXdCO1FBSGpCLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBQ3RCLFVBQUssR0FBTCxLQUFLLENBQWtCO1FBQ3ZCLGdCQUFXLEdBQVgsV0FBVztRQTJFdkIsZ0JBQVcsR0FBRyxVQUFDLEtBQWE7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQUUsT0FBTztZQUN0QixLQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsVUFBQyxDQUFDLEVBQUUsSUFBSTtnQkFDakQsS0FBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixJQUFJLEtBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxLQUFLLE1BQU0sRUFBRTtvQkFDdkMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO2lCQUNuQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQWlCRCxZQUFPLEdBQUcsd0RBQWtCLEVBQXlCLENBQUM7UUFqR3BELElBQUksaUJBQWlCLEVBQUU7WUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2hCLElBQUksRUFBRSxhQUFhO2dCQUNuQixPQUFPLEVBQUUsaURBQVcsQ0FBQyxjQUFNLGFBQU0sQ0FBQyxZQUFZLEVBQUUsRUFBckIsQ0FBcUIsQ0FBQztnQkFDakQsSUFBSSxFQUFFLGlEQUFXLENBQUM7b0JBQ2hCLFlBQUksQ0FBQyxZQUFZLENBQ2YsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FDM0Q7Z0JBRkQsQ0FFQyxDQUNGO2dCQUNELFFBQVEsRUFBRSxJQUFJO2dCQUNkLE9BQU8sRUFBRTtvQkFDUCxLQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFJLENBQUMsS0FBSyxFQUFFLEtBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDcEUsQ0FBQzthQUNGLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFNO2dCQUNyQixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztnQkFDMUMsT0FBTyxFQUFFLGlEQUFXLENBQ2xCLGNBQU0sYUFBTSxDQUFDLFlBQVksRUFBRSxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsRUFBbEQsQ0FBa0QsQ0FDekQ7Z0JBQ0QsS0FBSyxFQUFFLGlEQUFXLENBQUMsY0FBTSxhQUFNLENBQUMsWUFBWSxFQUFuQixDQUFtQixDQUFDO2dCQUM3QyxRQUFRLEVBQUUsZUFBZTtnQkFDekIsT0FBTyxFQUFFO29CQUNQLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO29CQUNuRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsRUFBRTtvQkFDbkUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLEVBQUU7b0JBQ3JFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO29CQUNqRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMseUJBQXlCLENBQUMsRUFBRTtpQkFDeEU7Z0JBQ0QsT0FBTyxFQUFFLFVBQUMsSUFBSSxFQUFFLEtBQUs7b0JBQ25CLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUNsQyxNQUFNLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztvQkFDL0IsSUFBSSxRQUFRLEtBQUssTUFBTSxFQUFFO3dCQUN2QixNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztxQkFDekI7Z0JBQ0gsQ0FBQzthQUNGLENBQUMsQ0FBQztTQUNKO1FBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsaUNBQWlDLEVBQUU7WUFDeEQsSUFBSSxpQkFBaUIsRUFBRTtnQkFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQU07b0JBQ3JCLE9BQU8sRUFBRSxpREFBVyxDQUFDLGNBQU0sYUFBTSxDQUFDLFlBQVksRUFBRSxFQUFyQixDQUFxQixDQUFDO29CQUNqRCxRQUFRLEVBQUUsa0JBQWtCO2lCQUM3QixDQUFDLENBQUM7YUFDSjtZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFNO2dCQUNyQixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQztnQkFDakQsU0FBUyxFQUFFLDhCQUE4QjtnQkFDekMsSUFBSSxFQUFFLGlEQUFXLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUU7d0JBQzFCLE9BQU8sdUJBQXVCLENBQUM7cUJBQ2hDO29CQUNELE9BQU8scUJBQXFCLENBQUM7Z0JBQy9CLENBQUMsQ0FBQztnQkFDRixPQUFPLEVBQUU7b0JBQ1AsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxpREFBVyxDQUFDO1lBQ1YsSUFBSSxlQUFlLEdBQW1CLEtBQUksQ0FBQyxXQUFXLENBQUMsYUFBYTtpQkFDakUsYUFBYSxDQUFDO1lBQ2pCLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUN6QixlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2FBQy9EO2lCQUFNO2dCQUNMLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUM7YUFDNUQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFZTSw0Q0FBWSxHQUFuQixVQUFvQixHQUFXO1FBQzdCLE9BQU8sc0VBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTSx3Q0FBUSxHQUFmLFVBQWdCLEtBQTRCO1FBQzFDLE9BQU8sK0NBQVMsQ0FBTyxLQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFTSx1Q0FBTyxHQUFkLFVBQWUsS0FBNEI7UUFDekMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtZQUNoQixPQUFPLCtDQUFTLENBQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsT0FBTyxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUNwQyxDQUFDO0lBR0gsNEJBQUM7QUFBRCxDQUFDOztBQUVELG1EQUFhLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRTtJQUN0QyxTQUFTLEVBQUU7UUFDVCxlQUFlLEVBQUUsVUFBQyxNQUFNLEVBQUUsYUFBYTtZQUNyQyxJQUFJLEtBQUssR0FBRyxJQUFJLHFCQUFxQixDQUNuQyxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxLQUFLLEVBQ1osYUFBYSxDQUFDLE9BQU8sRUFDckIsTUFBTSxDQUFDLGlCQUFpQixDQUN6QixDQUFDO1lBQ0YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0tBQ0Y7SUFDRCxRQUFRLEVBQUUsWUFBWTtDQUN2QixDQUFDLENBQUM7Ozs7Ozs7Ozs7OztBQ3BJSCx1Qzs7Ozs7Ozs7Ozs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUNzQjtBQUNNO0FBRTlCO0FBQ2E7QUFFTztBQUNqRCxJQUFJLFlBQVksR0FBRyxtQkFBTyxDQUFDLG1MQUF3RCxDQUFDLENBQUM7QUFFckYsSUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsU0FBUyxXQUFXLENBQUMsTUFBTTtJQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBQzFCLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUs7UUFDaEIsWUFBWSxDQUNWLE1BQU0sQ0FBQyxLQUFLLEVBQ1osYUFBYSxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FDeEQ7WUFDRCxnQkFBZ0I7WUFDaEIsSUFBSSxDQUFDO0FBQ1QsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxJQUFJLFlBQVksQ0FBQztBQUNqQixTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSTtJQUM5Qiw4Q0FBOEM7SUFDOUMsSUFBSSxNQUFNLEdBQ1IsWUFBWSxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3ZCLENBQUM7QUFFRDtJQW9DRSw0QkFDWSxNQUFXLEVBQ1gsSUFBWSxFQUNaLFdBQVcsRUFDZCxXQUF3QixFQUN4QixNQUFxQjtRQUw5QixpQkF5Q0M7UUFyQ1EsOENBQXdCO1FBSHJCLFdBQU0sR0FBTixNQUFNLENBQUs7UUFDWCxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osZ0JBQVcsR0FBWCxXQUFXO1FBQ2QsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQXJDOUIsZ0JBQVcsR0FBRyxtREFBYSxFQUFVLENBQUM7UUFDdEMsYUFBUSxHQUFHLG1EQUFhLEVBQVUsQ0FBQztRQUNuQyxjQUFTLEdBQUcsbURBQWEsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUVsQyxpQ0FBNEIsR0FBRyxLQUFLLENBQUM7UUFrQnJDLDhCQUF5QixHQUFHLFVBQUMsT0FBTyxFQUFFLE9BQU87WUFDbkQsSUFBSSxLQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ3BCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDO1FBbUZGLFVBQUssR0FBRyxtREFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBc0IxQixlQUFVLEdBQUc7WUFDWCxLQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RCLEtBQUksQ0FBQyxXQUFXLENBQUMsVUFBQyxPQUFPLEVBQUUsS0FBSztnQkFDOUIsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUU7b0JBQ3RELE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDakI7Z0JBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMzRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQVFGLGNBQVMsR0FBRyxVQUFDLEtBQXlCLEVBQUUsS0FBSztZQUMzQyxJQUFJLEtBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLE9BQU87YUFDUjtZQUNELElBQUksS0FBSSxDQUFDLDRCQUE0QixFQUFFO2dCQUNyQyxLQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDO2FBQzNDO1lBQ0QsS0FBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLEtBQUksQ0FBQyxXQUFXLENBQUMsS0FBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDbEMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQixLQUFJLENBQUMsV0FBVyxDQUFDLFVBQUMsT0FBTztnQkFDdkIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDekQsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxZQUFZLEdBQUcsS0FBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFDLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLENBQUMsS0FBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUMzQixLQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzthQUN6QztZQUNELFlBQVksQ0FBQyxNQUFNLEdBQUc7Z0JBQ3BCLElBQUksQ0FBQyxDQUFDLEtBQUksQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDM0IsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7aUJBQ3hDO1lBQ0gsQ0FBQyxDQUFDO1lBQ0YsWUFBWSxDQUFDLE9BQU8sR0FBRztnQkFDckIsSUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO29CQUNkLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDdkIsT0FBTztpQkFDUjtnQkFDRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsQ0FBQyxDQUFDO1lBQ0YsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzFCLFVBQVUsQ0FBQztnQkFDVCxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDO1FBQ0YsYUFBUSxHQUFHO1lBQ1QsS0FBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNmLElBQUksS0FBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsS0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNsQixPQUFPO2FBQ1I7WUFDRCxJQUFJLEtBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQzFDLElBQUksS0FBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUNwQixPQUFPO2lCQUNSO2dCQUNELElBQUksQ0FBQyxDQUFDLEtBQUksQ0FBQyxZQUFZLEVBQUU7b0JBQ3ZCLEtBQUksQ0FBQyxZQUFZLENBQUMsS0FBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7aUJBQ3ZDO2dCQUNELEtBQUksQ0FBQyxRQUFRLENBQUMsS0FBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7YUFDbkM7WUFDRCxLQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDO1FBQ0YsZUFBVSxHQUFHO1lBQ1gsS0FBSSxDQUFDLFdBQVcsQ0FBQyxLQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNsQyxLQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDO1FBQ0YsdUJBQWtCLEdBQUcsVUFBQyxLQUFLLEVBQUUsS0FBSztZQUNoQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFCLFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDckIsS0FBSyxFQUFFO29CQUNMLEtBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDaEIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QixPQUFPLEtBQUssQ0FBQztnQkFDZixLQUFLLEVBQUU7b0JBQ0wsS0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNsQixNQUFNO2dCQUNSLEtBQUssRUFBRTtvQkFDTCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDM0I7UUFDSCxDQUFDLENBQUM7UUFDRixzQkFBaUIsR0FBRyxVQUFDLEtBQUssRUFBRSxLQUFLO1lBQy9CLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUU7Z0JBQ2pFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN6QjtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO1FBekxBLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRTtZQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLDBEQUFpQixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLDRCQUE0QixHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxRQUFRLENBQUM7U0FDbkU7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsaURBQVcsQ0FBQztZQUNwQyx1QkFBdUI7WUFDdkIsSUFDRSxLQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixLQUFLLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSTtnQkFDMUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQzdDO2dCQUNBLCtDQUFTLENBQUMsTUFBTSxDQUFDLEtBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUN2RTtZQUNELEtBQUksQ0FBQyxRQUFRLENBQUMsK0NBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLEtBQUksQ0FBQyxXQUFXLENBQUMsK0NBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMseUJBQXlCLEVBQUU7WUFDbEQsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUN0RTtRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBQyxPQUFPLEVBQUUsS0FBSztZQUM5QixPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNyQixPQUFPLENBQUMsT0FBTyxHQUFHLG9FQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLFlBQVksQ0FDbEIsWUFBWSxFQUNaLEtBQUksQ0FBQyxZQUFZLENBQUMsNEJBQTRCLENBQUMsQ0FDaEQsQ0FBQztZQUNGLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsVUFBQyxDQUFDO2dCQUNsQixLQUFJLENBQUMsU0FBUyxDQUFDLEtBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3JCLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQW5FUyx3Q0FBVyxHQUFyQixVQUFzQixJQUErQztRQUNuRSxJQUNFLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFDakIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWE7WUFDL0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxhQUFhO1lBRTdDLE9BQU87UUFDVCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7UUFDMUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuRCxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDM0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNsQjtTQUNGO0lBQ0gsQ0FBQztJQVFELDRDQUFlLEdBQWY7UUFDRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQTZDRCxzQkFBSSx5Q0FBUzthQUFiO1lBQ0UsSUFDRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVE7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTO2dCQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsSUFBSSxDQUFDLEVBQzVCO2dCQUNBLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7YUFDaEM7WUFDRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7OztPQUFBO0lBRUQsc0JBQUksd0NBQVE7YUFBWjtZQUNFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3BDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FDN0MsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUN0QixTQUFTLEVBQ1QsU0FBUyxDQUNWLENBQUM7YUFDSDtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQzs7O09BQUE7SUFJTSx5Q0FBWSxHQUFuQixVQUFvQixHQUFXO1FBQzdCLE9BQU8sc0VBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFUywyQ0FBYyxHQUF4QjtRQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBR00sc0NBQVMsR0FBaEI7UUFDRSxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDekMsU0FBUyxHQUFHLHNFQUFrQixDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsSUFDRSxDQUFDLFNBQVM7WUFDVixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDYixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQ0FBa0MsRUFDaEQ7WUFDQSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQ2xCLElBQUksQ0FBQyxNQUFNLEVBQ1gsUUFBUSxDQUNULENBQUM7U0FDSDtRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEIsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFXRCxpREFBb0IsR0FBcEIsVUFBcUIsRUFBTztRQUMxQixPQUFPLEVBQUUsRUFBRTtZQUNULElBQUksRUFBRSxDQUFDLFNBQVM7Z0JBQUUsT0FBTyxFQUFFLENBQUM7WUFDNUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUM7U0FDcEI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUErRUQsb0NBQU8sR0FBUDtRQUNFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBQyxPQUFPO1lBQ3ZCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMseUJBQXlCLEVBQUU7WUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQzFDLElBQUksQ0FBQyx5QkFBeUIsQ0FDL0IsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUNILHlCQUFDO0FBQUQsQ0FBQzs7QUFFRCxtREFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUU7SUFDckMsU0FBUyxFQUFFO1FBQ1QsZUFBZSxFQUFFLFVBQUMsTUFBTSxFQUFFLGFBQWE7WUFDckMsSUFBSSxLQUFLLEdBQUcsSUFBSSxrQkFBa0IsQ0FDaEMsTUFBTSxDQUFDLEtBQUssRUFDWixNQUFNLENBQUMsSUFBSSxFQUNYLGFBQWEsQ0FBQyxPQUFPLEVBQ3JCLE1BQU0sQ0FBQyxXQUFXLEVBQ2xCLE1BQU0sQ0FBQyxNQUFNLENBQ2QsQ0FBQztZQUNGLEtBQUssQ0FBQyxZQUFZLEdBQUcsVUFBQyxRQUFRO2dCQUM1QixJQUFJLE9BQU8sR0FBRztvQkFDWixZQUFZLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJO29CQUNqQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUs7b0JBQ2pCLEtBQUssRUFBRSxRQUFRO29CQUNmLFFBQVEsRUFBRSxJQUFJO29CQUNkLFlBQVksRUFBRSxLQUFLO2lCQUNwQixDQUFDO2dCQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9DLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDeEUsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQztnQkFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3hFLE1BQU0sQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQ2xDLEtBQUssQ0FBQyxRQUFRLEVBQ2QsTUFBTSxDQUFDLEtBQUssRUFDWixRQUFRLENBQ1QsQ0FBQztnQkFDRixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQztZQUVGLDhDQUFRLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pFLEtBQUssQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO2dCQUMvQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FDRjtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQztBQUVJLElBQUksWUFBWSxHQUFHO0lBQ3hCLG1CQUFtQixFQUFFLElBQUk7SUFDekIsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QixjQUFjLEVBQUUsVUFBQyxLQUFLO1FBQ3BCLElBQ0UsT0FBTyxLQUFLLENBQUMsT0FBTyxLQUFLLFVBQVU7WUFDbkMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUM7Z0JBQzlELENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLFFBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbkUsQ0FBQywwREFBaUIsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQzVEO1lBQ0EsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUNELGNBQWMsRUFBRSxVQUFDLEtBQUssSUFBSyxjQUFPLEVBQVAsQ0FBTztJQUNsQyxXQUFXLEVBQUUsVUFBQyxRQUF1QixFQUFFLEtBQUssRUFBRSxNQUFNO1FBQ2xELElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUU7WUFDaEMsV0FBVyxHQUFHLHNFQUFrQixDQUFDLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFO1lBQzlCLFdBQVcsR0FBRyxzRUFBa0IsQ0FBQyxTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUN2RTtRQUNELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsVUFBVSxDQUFDLFNBQVMsR0FBRywyREFBd0QsV0FBVyxDQUFDLE9BQU8sQ0FDaEcsR0FBRyxFQUNILE9BQU8sQ0FDUixzREFBa0QsQ0FBQztRQUNwRCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLHNEQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDL0QsQ0FBQztDQUNGLENBQUM7QUFDRix3RUFBZSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUVoQyxJQUFJLGdCQUFnQixHQUFHO0lBQzVCLG1CQUFtQixFQUFFLEtBQUs7SUFDMUIsY0FBYyxFQUFFLFVBQUMsS0FBSztRQUNwQixPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFDRCxjQUFjLEVBQUUsVUFBQyxLQUFLLElBQUssa0JBQVcsRUFBWCxDQUFXO0lBQ3RDLFdBQVcsRUFBRSxVQUNYLFFBQXVCLEVBQ3ZCLEtBQWtDLEVBQ2xDLE1BQU07UUFFTixJQUFJLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDM0UsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRCxVQUFVLENBQUMsU0FBUztnQkFDbEIsZ0NBQWdDO29CQUNoQyxZQUFZO29CQUNaLG1EQUFtRCxDQUFDO1lBQ3RELFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEMsc0RBQWdCLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLHlCQUF5QixDQUM5QixLQUFLLEVBQ0wsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7U0FDSDtJQUNILENBQUM7Q0FDRixDQUFDO0FBQ0Ysd0VBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUV6QyxJQUFJLGtCQUFrQixHQUFHO0lBQzlCLHlCQUF5QixFQUFFLElBQUk7SUFDL0IsdUJBQXVCLEVBQUUsSUFBSTtJQUM3QixjQUFjLEVBQUUsVUFBQyxLQUFLO1FBQ3BCLElBQ0UsT0FBTyxLQUFLLENBQUMsT0FBTyxLQUFLLFVBQVU7WUFDbkMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxNQUFNO2dCQUMxQixDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDO2dCQUM1QyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxRQUFRO29CQUMzQixDQUFDLGtCQUFrQixDQUFDLHlCQUF5QixDQUFDO2dCQUNoRCxDQUFDLDBEQUFpQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUMsRUFDbEU7WUFDQSxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsY0FBYyxFQUFFLFVBQUMsS0FBSyxJQUFLLG9CQUFhLEVBQWIsQ0FBYTtJQUN4QyxXQUFXLEVBQUUsVUFBQyxRQUF1QixFQUFFLEtBQUssRUFBRSxNQUFNO1FBQ2xELElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUU7WUFDaEMsV0FBVyxHQUFHLHNFQUFrQixDQUFDLFNBQVMsQ0FDeEMsaUNBQWlDLENBQ2xDLENBQUM7U0FDSDtRQUNELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBRTtZQUM5QixXQUFXLEdBQUcsc0VBQWtCLENBQUMsU0FBUyxDQUN4QywrQkFBK0IsQ0FDaEMsQ0FBQztTQUNIO1FBQ0QsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxVQUFVLENBQUMsU0FBUyxHQUFHLGlFQUE4RCxXQUFXLENBQUMsT0FBTyxDQUN0RyxHQUFHLEVBQ0gsT0FBTyxDQUNSLHNEQUFrRCxDQUFDO1FBQ3BELFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsc0RBQWdCLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMseUJBQXlCLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNyRSxDQUFDO0NBQ0YsQ0FBQztBQUNGLHdFQUFlLENBQUMsYUFBYSxFQUFFLGtCQUFrQixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNoYm5EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDeUM7QUFJakUsSUFBSSxpQkFBaUIsR0FBRztJQUM3Qix3QkFBd0IsRUFBRSxLQUFLO0lBQy9CLFVBQVUsRUFBRTtRQUNWLGtFQUFpQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxZQUFZLEVBQUU7UUFDWixrRUFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsY0FBYyxFQUFFLFVBQUMsS0FBSztRQUNwQixPQUFPLE9BQU8sS0FBSyxDQUFDLE9BQU8sS0FBSyxVQUFVLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLFFBQVE7WUFDeEUsQ0FBQyxDQUFDLGdCQUFnQjtZQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1QsQ0FBQztJQUNELGNBQWMsRUFBRSxVQUFDLEtBQUssSUFBSyxhQUFNLEVBQU4sQ0FBTTtJQUNqQyxXQUFXLEVBQUUsVUFDWCxRQUF1QixFQUN2QixLQUF3QixFQUN4QixNQUFxQjtRQUVyQixJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDbkIsT0FBTztTQUNSO1FBQ0QsSUFBSSxpQkFBaUIsR0FDbkIsaUJBQWlCLENBQUMsd0JBQXdCO1lBQzFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDOUMsSUFBSSxpQkFBaUIsRUFBRTtZQUNyQixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztZQUNwQixLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztZQUN6QixLQUFLLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDO1lBQ3JDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztZQUNsQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQzFCLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUMzQixLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDaEMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsVUFBQyxDQUFDLElBQUssUUFBQyxDQUFDLGNBQWMsRUFBRSxFQUFsQixDQUFrQixDQUFDO2dCQUNoRCxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNoRCxVQUFVLENBQUMsU0FBUyxHQUFHLG1CQUFtQixDQUFDO2dCQUMzQyxVQUFVLENBQUMsU0FBUztvQkFDbEIsNElBQTRJLENBQUM7Z0JBQy9JLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRXBDLHNEQUFnQixDQUNkO29CQUNFLFFBQVEsRUFBRSxLQUFLO29CQUNmLE1BQU0sRUFBRSxLQUFLO29CQUNiLE1BQU0sRUFBRSxNQUFNO29CQUNkLEtBQUssRUFBRSxLQUFLO2lCQUNiLEVBQ0QsVUFBVSxDQUNYLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLHlCQUF5QixDQUN6QixLQUFLLEVBQ1YsYUFBYSxFQUNiLFVBQVUsRUFDVixLQUFLLENBQ04sQ0FBQzthQUNIO1lBQ0QsaURBQVcsQ0FBQztnQkFDVixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFBRSxPQUFPO2dCQUNsQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUNsQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7Z0JBQ25DLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztnQkFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxRQUFRLEtBQUssTUFBTTtvQkFBRSxPQUFPO2dCQUM3RCxJQUFJLFFBQVEsS0FBSyxNQUFNLElBQUksUUFBUSxLQUFLLEtBQUssRUFBRTtvQkFDN0MsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2lCQUNoQztxQkFBTTtvQkFDTCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7aUJBQ2hDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1lBQ25DLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztTQUNwQztRQUVELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsVUFBVSxDQUFDLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztRQUM1QyxVQUFVLENBQUMsU0FBUztZQUNsQiw0R0FBNEcsQ0FBQztRQUMvRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRCxzREFBZ0IsQ0FDZCxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxFQUNwRSxVQUFVLENBQ1gsQ0FBQztRQUNGLE1BQU0sQ0FBQyx5QkFBeUIsQ0FDekIsS0FBSyxFQUNWLGVBQWUsRUFDZixVQUFVLEVBQ1YsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLHdFQUFlLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNyR2xEO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBRS9CO0lBQ0Usa0JBQW9CLE9BQU87UUFBM0IsaUJBQStCO1FBQVgsWUFBTyxHQUFQLE9BQU87UUFFbkIsYUFBUSxHQU1aO1lBQ0YsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxNQUFNO2dCQUNaLE1BQU0sRUFBRTtvQkFDTixPQUFPLEVBQUUsSUFBSTtvQkFDYixPQUFPLEVBQUUsRUFBRTtpQkFDWjtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsRUFBRSxFQUFFLFVBQVU7b0JBQ2QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCO29CQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO29CQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO29CQUMzQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUM7aUJBQ3JEO2FBQ0Y7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLE1BQU07Z0JBQ1osTUFBTSxFQUFFO29CQUNOLE9BQU8sRUFBRSxJQUFJO29CQUNiLE9BQU8sRUFBRSxFQUFFO2lCQUNaO2dCQUNELE9BQU8sRUFBRTtvQkFDUCxFQUFFLEVBQUUsVUFBVTtvQkFDZCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0I7b0JBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7b0JBQy9CLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7b0JBQzNDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDckQ7YUFDRjtZQUNELGNBQWMsRUFBRTtnQkFDZCxPQUFPLEVBQUU7b0JBQ1AsRUFBRSxFQUFFLHFCQUFxQjtvQkFDekIsUUFBUSxFQUFFLHFCQUFxQjtvQkFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCO29CQUN0QyxPQUFPLEVBQUUsSUFBSTtvQkFDYixNQUFNLEVBQUU7d0JBQ04sS0FBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsS0FBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0JBQ25ELEtBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDdkQsQ0FBQztvQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO29CQUMvQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUM7aUJBQ3pEO2FBQ0Y7WUFDRCxjQUFjLEVBQUU7Z0JBQ2QsT0FBTyxFQUFFO29CQUNQLEVBQUUsRUFBRSxhQUFhO29CQUNqQixPQUFPLEVBQUUsaURBQVcsQ0FDbEIsY0FBTSxZQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksS0FBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBL0QsQ0FBK0QsQ0FDdEU7b0JBQ0QsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQkFDOUMsUUFBUSxFQUFFLHFCQUFxQjtvQkFDL0IsS0FBSyxFQUFFLHdEQUFrQixDQUFDO3dCQUN4Qjs0QkFDRSxFQUFFLEVBQUUsZ0JBQWdCOzRCQUNwQixPQUFPLEVBQUUsSUFBSTs0QkFDYixHQUFHLEVBQUUsaURBQVcsQ0FBQztnQ0FDZixZQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFBbEQsQ0FBa0QsQ0FDbkQ7NEJBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCOzRCQUMzQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUM7eUJBQ3pEO3dCQUNEOzRCQUNFLEVBQUUsRUFBRSxtQkFBbUI7NEJBQ3ZCLE9BQU8sRUFBRSxJQUFJOzRCQUNiLEdBQUcsRUFBRSxpREFBVyxDQUFDO2dDQUNmLFFBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7NEJBQW5ELENBQW1ELENBQ3BEOzRCQUNELE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLHlCQUF5Qjs0QkFDOUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLHlCQUF5QixDQUFDO3lCQUM1RDtxQkFDRixDQUFDO2lCQUNIO2FBQ0Y7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsT0FBTyxFQUFFO29CQUNQLEVBQUUsRUFBRSxVQUFVO29CQUNkLE9BQU8sRUFBRSxpREFBVyxDQUFDLGNBQU0sWUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxNQUFNLEVBQXBDLENBQW9DLENBQUM7b0JBQ2hFLEtBQUssRUFBRSxpREFBVyxDQUNoQjt3QkFDRSxZQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQzs0QkFDL0MsR0FBRzs0QkFDSCxLQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFO29CQUZoQyxDQUVnQyxDQUNuQztvQkFDRCxRQUFRLEVBQUUscUJBQXFCO29CQUMvQixLQUFLLEVBQUUsd0RBQWtCLENBQUM7d0JBQ3hCOzRCQUNFLEVBQUUsRUFBRSxjQUFjOzRCQUNsQixPQUFPLEVBQUUsSUFBSTs0QkFDYixNQUFNLEVBQUUsY0FBTSxZQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUF0QyxDQUFzQzs0QkFDcEQsS0FBSyxFQUFFLE1BQU07eUJBQ2Q7d0JBQ0Q7NEJBQ0UsRUFBRSxFQUFFLGlCQUFpQjs0QkFDckIsT0FBTyxFQUFFLElBQUk7NEJBQ2IsTUFBTSxFQUFFLGNBQU0sWUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsRUFBeEMsQ0FBd0M7NEJBQ3RELEtBQUssRUFBRSxRQUFRO3lCQUNoQjt3QkFDRDs0QkFDRSxFQUFFLEVBQUUsaUJBQWlCOzRCQUNyQixPQUFPLEVBQUUsSUFBSTs0QkFDYixNQUFNLEVBQUUsY0FBTSxZQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUF4QyxDQUF3Qzs0QkFDdEQsS0FBSyxFQUFFLFFBQVE7eUJBQ2hCO3dCQUNEOzRCQUNFLEVBQUUsRUFBRSxnQkFBZ0I7NEJBQ3BCLE9BQU8sRUFBRSxJQUFJOzRCQUNiLE1BQU0sRUFBRSxjQUFNLFlBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQXZDLENBQXVDOzRCQUNyRCxLQUFLLEVBQUUsT0FBTzt5QkFDZjt3QkFDRDs0QkFDRSxFQUFFLEVBQUUsZ0JBQWdCOzRCQUNwQixPQUFPLEVBQUUsSUFBSTs0QkFDYixNQUFNLEVBQUUsY0FBTSxZQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUF2QyxDQUF1Qzs0QkFDckQsS0FBSyxFQUFFLE9BQU87eUJBQ2Y7d0JBQ0Q7NEJBQ0UsRUFBRSxFQUFFLGdCQUFnQjs0QkFDcEIsT0FBTyxFQUFFLElBQUk7NEJBQ2IsTUFBTSxFQUFFLGNBQU0sWUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBdkMsQ0FBdUM7NEJBQ3JELEtBQUssRUFBRSxPQUFPO3lCQUNmO3FCQUNGLENBQUM7aUJBQ0g7YUFDRjtZQUNELElBQUksRUFBRTtnQkFDSixPQUFPLEVBQUU7b0JBQ1AsRUFBRSxFQUFFLFVBQVU7b0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCO29CQUN0QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlO29CQUNwQyxRQUFRLEVBQUUsY0FBYztvQkFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztvQkFDakQsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDO2lCQUMzRDthQUNGO1lBQ0QsS0FBSyxFQUFPO2dCQUNWLE9BQU8sRUFBRTtvQkFDUCxFQUFFLEVBQUUsV0FBVztvQkFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO29CQUNqQyxHQUFHLEVBQUUsV0FBVztvQkFDaEIsUUFBUSxFQUFFLGlEQUFXLENBQUMsY0FBTSxjQUFPLEdBQUcsS0FBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBaEMsQ0FBZ0MsQ0FBQztvQkFDN0QsS0FBSyxFQUFFLGlEQUFXLENBQUM7d0JBQ2pCLFlBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxLQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUF6RCxDQUF5RCxDQUMxRDtvQkFDRCxRQUFRLEVBQUUsbUJBQW1CO2lCQUM5QjthQUNGO1NBQ0YsQ0FBQztJQTVKNEIsQ0FBQztJQThKeEIsOEJBQVcsR0FBbEI7UUFDRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUNILGVBQUM7QUFBRCxDQUFDOzs7Ozs7Ozs7Ozs7O0FDcEtELDZMQUE2TCxrSUFBa0ksK0JBQStCLHlKQUF5SixvQ0FBb0Msd0U7Ozs7Ozs7Ozs7O0FDQTNoQix1Qzs7Ozs7Ozs7Ozs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBRUU7QUFFakMsSUFBTSxZQUFZLEdBQUcsbUJBQU8sQ0FBQyx1RUFBeUIsQ0FBQyxDQUFDO0FBRXhEO0lBQ0Usa0NBQ1MsS0FBNEIsRUFDNUIsT0FBWSxFQUNaLGNBQXNCLEVBQ3RCLFVBQWUsRUFDZixVQUFlO1FBSmYsVUFBSyxHQUFMLEtBQUssQ0FBdUI7UUFDNUIsWUFBTyxHQUFQLE9BQU8sQ0FBSztRQUNaLG1CQUFjLEdBQWQsY0FBYyxDQUFRO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQUs7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFLO0lBQ3JCLENBQUM7SUFDTiwrQkFBQztBQUFELENBQUM7O0FBRUQsbURBQWEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUU7SUFDN0MsU0FBUyxFQUFFO1FBQ1QsZUFBZSxFQUFFLFVBQUMsTUFBTSxFQUFFLGFBQWE7WUFDckMsSUFBTSxLQUFLLEdBQTBCLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDbEQsT0FBTyxJQUFJLHdCQUF3QixDQUNqQyxLQUFLLEVBQ0wsS0FBSyxDQUFDLE9BQU8sRUFDYixLQUFLLENBQUMsY0FBYyxFQUNwQixLQUFLLENBQUMsVUFBVSxFQUNoQixLQUFLLENBQUMsVUFBVSxDQUNqQixDQUFDO1FBQ0osQ0FBQztLQUNGO0lBQ0QsUUFBUSxFQUFFLFlBQVk7Q0FDdkIsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7QUM5QkgsdUM7Ozs7Ozs7Ozs7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDK0I7QUFDakM7QUFFb0I7QUFFakQsSUFBSSxRQUFRLEdBQUcsbUJBQU8sQ0FBQyxxTEFBd0QsQ0FBQyxDQUFDO0FBRWpGO0lBS0UsOEJBQW1CLEtBQWtCLEVBQVUsT0FBWTtRQUEzRCxpQkFtQkM7UUFuQmtCLFVBQUssR0FBTCxLQUFLLENBQWE7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFLO1FBSm5ELHlCQUFvQixHQUFHLFNBQVMsQ0FBQztRQUNqQyxtQkFBYyxHQUFHLFNBQVMsQ0FBQztRQUMzQixxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFpQ2hDLHlCQUFvQixHQUFHO1lBQ3JCLElBQUksWUFBWSxHQUFRLEtBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxZQUFZO2dCQUFFLE9BQU87WUFDMUIsSUFBSSxLQUFLLEdBQUcsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNoRSxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxXQUFXO2dCQUFFLE9BQU87WUFDekIsWUFBWSxDQUFDLFVBQVU7Z0JBQ3JCLFdBQVcsQ0FBQyxVQUFVO29CQUN0QixZQUFZLENBQUMsVUFBVTtvQkFDdkIsWUFBWSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDL0IsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDO1FBNkJGLGlCQUFZLEdBQUcsVUFBQyxJQUFJO1lBQ2xCLElBQUksTUFBTSxHQUNSLElBQUksS0FBSyxLQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRTtnQkFDaEMsQ0FBQyxDQUFDLHNDQUFzQztnQkFDeEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVULElBQUksS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2xFLE1BQU0sSUFBSSx3QkFBd0IsQ0FBQzthQUNwQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQUVGLHlCQUFvQixHQUFHLFVBQUMsSUFBSTtZQUMxQixJQUFJLFlBQVksR0FDZCw0REFBYSxDQUFDLFlBQVksRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDOUQsT0FBTyxJQUFJLEtBQUssS0FBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsSUFBSSxLQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDaEUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxZQUFZLEdBQUcsUUFBUTtnQkFDbkMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUM7UUFDN0IsQ0FBQyxDQUFDO1FBRUYsZ0JBQVcsR0FBRyxVQUFDLFNBQVMsRUFBRSxLQUFLO1lBQzdCLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDOUIsS0FBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQztRQUVLLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDakIsY0FBUyxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBcUN4QixnQkFBVyxHQUFHLG1EQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUF4SXhDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsS0FBSyxVQUFVLEVBQUU7WUFDdEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUM7Z0JBQ2hDLElBQUksWUFBWSxHQUFtQixLQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FDM0QsWUFBWSxDQUNiLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFO29CQUNsQixLQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUN2RTtZQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVSLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxpREFBVyxDQUFDO2dCQUN0QyxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsSUFBSSxLQUFJLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ2pELEtBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2lCQUM3QjtxQkFBTTtvQkFDTCxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2lCQUM5QjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsdUNBQVEsR0FBUixVQUFTLEtBQUssRUFBRSxLQUFLO1FBQ25CLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVELFlBQVksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDRCx3Q0FBUyxHQUFULFVBQVUsS0FBSyxFQUFFLEtBQUs7UUFDcEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUQsWUFBWSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQWNELHNDQUFPLEdBQVAsVUFBUSxLQUFLLEVBQUUsS0FBSztRQUNsQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxLQUFLLEdBQUcsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUN6QixLQUFLLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztTQUM3QjtRQUNELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQzdELFlBQVksQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxpREFBa0IsR0FBbEI7UUFDRSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1RCxJQUFJLFlBQVksR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMzRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQ3hCLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVTtvQkFDeEMsWUFBWSxDQUFDLFVBQVU7b0JBQ3ZCLElBQUksQ0FBQztTQUNSO0lBQ0gsQ0FBQztJQUVNLDJDQUFZLEdBQW5CLFVBQW9CLEdBQVc7UUFDN0IsT0FBTywyREFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQWdDRCxzQkFBSSxpREFBZTthQUFuQjtZQUFBLGlCQWtDQztZQWpDQyxPQUFPO2dCQUNMLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLFNBQVMsRUFBRSxHQUFHO2dCQUNkLE9BQU8sRUFBRTtvQkFDUCxLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztvQkFDdkIsS0FBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDcEIsS0FBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUNqRCw2QkFBNkIsQ0FDOUIsQ0FBQztvQkFDRixLQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxDQUFDO2dCQUNELEtBQUssRUFBRSxVQUFDLEdBQUc7b0JBQ1QsS0FBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztvQkFDOUIsS0FBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDcEMsS0FBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUNyRCxJQUFJLENBQUMsQ0FBQyxLQUFJLENBQUMsVUFBVSxFQUFFO3dCQUNyQixLQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFJLENBQUMsVUFBVSxFQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDdEQ7Z0JBQ0gsQ0FBQztnQkFDRCxRQUFRLEVBQUUsVUFBQyxHQUFHLEVBQUUsS0FBSztvQkFDbkIsS0FBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7b0JBQ3hCLElBQUksS0FBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUU7d0JBQ3RCLEtBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDNUQ7b0JBQ0QsSUFDRSxxREFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUNuRTt3QkFDQSxxQ0FBcUM7d0JBQ3JDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzNDO29CQUNELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7YUFDRixDQUFDO1FBQ0osQ0FBQzs7O09BQUE7SUFJTSxzQ0FBTyxHQUFkO1FBQ0UsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDekIsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztTQUNqQztJQUNILENBQUM7SUFDSCwyQkFBQztBQUFELENBQUM7O0FBRUQsbURBQWEsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUU7SUFDekMsU0FBUyxFQUFFO1FBQ1QsZUFBZSxFQUFFLFVBQUMsTUFBTSxFQUFFLGFBQWE7WUFDckMsSUFBTSxLQUFLLEdBQ1QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUVyRCw4Q0FBUSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFO2dCQUNqRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksb0JBQW9CLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRSxDQUFDO0tBQ0Y7SUFDRCxRQUFRLEVBQUUsUUFBUTtDQUNuQixDQUFDLENBQUM7Ozs7Ozs7Ozs7OztBQy9LSCxxREFBcUQsbUNBQW1DLEVBQUUsOElBQThJLGlEQUFpRCx1ZUFBdWUsNENBQTRDLGVBQWUsRUFBRSxnRDs7Ozs7Ozs7Ozs7QUNBN3pCLHFTQUFxUyx1Q0FBdUMsa09BQWtPLHNDQUFzQywwbENBQTBsQyw0Q0FBNEMsZUFBZSxFQUFFLDhIOzs7Ozs7Ozs7OztBQ0EzdUQsdUM7Ozs7Ozs7Ozs7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQzRCO0FBR25DO0FBRXhCLElBQUksWUFBWSxHQUFHLG1CQUFPLENBQUMscURBQWdCLENBQUMsQ0FBQztBQUM3QyxJQUFJLGVBQWUsR0FBRyxtQkFBTyxDQUFDLHlFQUEwQixDQUFDLENBQUM7QUFFMUQ7SUFFRSw0QkFBb0IsTUFBMEI7UUFBMUIsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFnQjlDLHFCQUFnQixHQUFHLG1EQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsaUJBQVksR0FBRyxtREFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLGlCQUFZLEdBQUcsd0RBQWtCLEVBQUUsQ0FBQztRQWpCbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxZQUFZLEdBQUcsVUFBQyxLQUFZO1lBQzlCLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQyxJQUFTO2dCQUN0QixJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxtREFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNyQyxJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUMzQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUMsSUFBSSxJQUFLLFFBQUMsQ0FBQyxJQUFJLEVBQU4sQ0FBTSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzdELFNBQVMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBTU0seUNBQVksR0FBbkIsVUFBb0IsSUFBWTtRQUM5QixPQUFPLHNFQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0Qsc0JBQVcsaURBQWlCO2FBQTVCO1lBQ0UsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0MsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyw0Q0FBWTthQUF2QjtZQUNFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlDLENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsMkNBQVc7YUFBdEI7WUFDRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3QyxDQUFDOzs7T0FBQTtJQUNELHNCQUFXLDRDQUFZO2FBQXZCO1lBQ0UsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUMsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyxtREFBbUI7YUFBOUI7WUFDRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNyRCxDQUFDOzs7T0FBQTtJQUVNLDZDQUFnQixHQUF2QixVQUF3QixLQUF5QjtRQUMvQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNNLDRDQUFlLEdBQXRCLFVBQXVCLEtBQXlCO1FBQzlDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUgseUJBQUM7QUFBRCxDQUFDOztBQUVELG1EQUFhLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFO0lBQ3ZDLFNBQVMsRUFBRTtRQUNULGVBQWUsRUFBRSxVQUFDLE1BQU0sRUFBRSxhQUFhO1lBQ3JDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsQ0FBQztLQUNGO0lBQ0QsUUFBUSxFQUFFLFlBQVk7Q0FDdkIsQ0FBQyxDQUFDO0FBRUgsbURBQWEsQ0FBQyxRQUFRLENBQUMsMEJBQTBCLEVBQUU7SUFDakQsU0FBUyxFQUFFO1FBQ1QsZUFBZSxFQUFFLFVBQUMsTUFBTSxFQUFFLGFBQWE7WUFDckMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FDRjtJQUNELFFBQVEsRUFBRSxlQUFlO0NBQzFCLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7O0FDNUVILDRKQUE0Siw2RkFBNkYsaUZBQWlGLCtNQUErTSw2SEFBNkgscU5BQXFOLHNUOzs7Ozs7Ozs7OztBQ0EzMkIsdUM7Ozs7Ozs7Ozs7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUNzQjtBQUUzQjtBQUUxQixJQUFJLFlBQVksR0FBRyxtQkFBTyxDQUFDLHlEQUFrQixDQUFDLENBQUM7QUFFL0M7SUFVRSxrQ0FBb0IsY0FBbUIsRUFBVSxRQUloRDtRQUpELGlCQXVGQztRQXZGZ0Q7WUFDL0MsU0FBUyxFQUFFLG1EQUFhLENBQUMsSUFBSSxDQUFDO1lBQzlCLE1BQU0sRUFBRSxtREFBYSxDQUFDLFNBQVMsQ0FBQztZQUNoQyxNQUFNLEVBQWlCLFNBQVM7U0FDakM7UUFKbUIsbUJBQWMsR0FBZCxjQUFjLENBQUs7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUl4RDtRQVhNLHFCQUFnQixHQUFHO1lBQ3hCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLFlBQVk7WUFDWixXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFDO1FBK0ZNLHNCQUFpQixHQUFHLG1EQUFhLENBQVUsSUFBSSxDQUFDLENBQUM7UUFPakQsMkJBQXNCLEdBQUcsbURBQWEsQ0FBVSxJQUFJLENBQUMsQ0FBQztRQWtCOUQsY0FBUyxHQUFHLHdEQUFrQixDQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2FBQzFCLE1BQU0sQ0FBQyxVQUFDLEdBQUcsSUFBSyxRQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUE3QixDQUE2QixDQUFDO2FBQzlDLEdBQUcsQ0FBQyxVQUFDLEdBQUc7WUFDUCxPQUFPO2dCQUNMLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLO2dCQUNqQyxLQUFLLEVBQUUsR0FBRzthQUNYLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDTCxDQUFDO1FBMUhBLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFDLFFBQVE7WUFDdEMsSUFBSSxDQUFDLENBQUMsS0FBSSxDQUFDLFNBQVMsRUFBRTtnQkFDcEIsS0FBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxRQUFRLElBQUksU0FBUyxDQUFDO2dCQUNyRCxLQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzthQUMvQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQUMsUUFBUTtZQUN6QyxJQUFJLENBQUMsQ0FBQyxLQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNwQixLQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3pELEtBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQy9DO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLGlEQUFXLENBQUM7WUFDNUIsSUFBSSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsS0FBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pELE9BQU8sS0FBSSxDQUFDLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGlEQUFXLENBQUM7WUFDbEMsSUFBSSxDQUFDLEtBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1lBQ0QsSUFBSSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsS0FBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pELElBQUksS0FBSyxHQUFHLG1CQUFtQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEUsSUFBSSxLQUFLLEdBQ1AsQ0FBQyxDQUFDLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDekQsTUFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDdkIsS0FBSyxDQUFDO1lBQ1IsSUFBSSxNQUFNLEdBQ1IsQ0FBQyxDQUFDLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDekQsTUFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDdkIsS0FBSyxDQUFDO1lBQ1IsSUFBSSxVQUFVLEdBQ1osQ0FBQyxDQUFDLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDbkUsTUFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDdkIsS0FBSyxDQUFDO1lBQ1IsSUFBSSxXQUFXLEdBQ2IsQ0FBQyxDQUFDLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFDbkUsTUFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDdkIsS0FBSyxDQUFDO1lBQ1IsT0FBTztnQkFDTCxLQUFLLEVBQUUsS0FBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxLQUFLLEVBQUUsS0FBSztnQkFDWixNQUFNLEVBQUUsTUFBTTtnQkFDZCxVQUFVLEVBQUUsVUFBVTtnQkFDdEIsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLFFBQVEsRUFBRSxpREFBVyxDQUFDO29CQUNwQixPQUFPLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxLQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDL0YsQ0FBQyxDQUFDO2FBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBR0gsSUFBRyxDQUFDLENBQUMsY0FBYyxFQUFFO1lBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQ3BELGlEQUFXLENBQUM7Z0JBQ1YsS0FBSSxDQUFDLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6RCxDQUFDLENBQUMsQ0FBQztZQUNILGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO2dCQUMvQixFQUFFLEVBQUUsb0JBQW9CO2dCQUN4QixLQUFLLEVBQUUsd0VBQVksQ0FBQyxjQUFjLENBQUM7Z0JBQ25DLE9BQU8sRUFBRSxpREFBVyxDQUFDLGNBQU0sWUFBSSxDQUFDLGdCQUFnQixFQUFyQixDQUFxQixDQUFDO2dCQUNqRCxPQUFPLEVBQUUsd0VBQVksQ0FBQyxjQUFjLENBQUM7Z0JBQ3JDLFNBQVMsRUFBRSxjQUFjO2dCQUN6QixNQUFNLEVBQUUsaURBQVcsQ0FBQztvQkFDbEIsSUFBSSxFQUFFLGNBQU0sWUFBSSxDQUFDLFlBQVksRUFBakIsQ0FBaUI7b0JBQzdCLEtBQUssRUFBRSxVQUFDLEdBQVEsSUFBSyxZQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsRUFBdkIsQ0FBdUI7aUJBQzdDLENBQUM7Z0JBQ0YsS0FBSyxFQUFPLElBQUksQ0FBQyxTQUFTO2FBQzNCLENBQUMsQ0FBQztZQUNILGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO2dCQUMvQixFQUFFLEVBQUUsZ0NBQWdDO2dCQUNwQyxLQUFLLEVBQUUsd0VBQVksQ0FBQyx5QkFBeUIsQ0FBQztnQkFDOUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUN4QixPQUFPLEVBQUUsd0VBQVksQ0FBQyx5QkFBeUIsQ0FBQztnQkFDaEQsU0FBUyxFQUFFLGFBQWE7Z0JBQ3hCLE1BQU0sRUFBRSxpREFBVyxDQUFDO29CQUNsQixJQUFJLEVBQUUsY0FBTSxZQUFJLENBQUMsb0JBQW9CLEVBQXpCLENBQXlCO29CQUNyQyxLQUFLLEVBQUUsVUFBQyxHQUFRLElBQUssWUFBSSxDQUFDLG9CQUFvQixHQUFHLEdBQUcsRUFBL0IsQ0FBK0I7aUJBQ3JELENBQUM7YUFDSCxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxzQkFBVyw0Q0FBTTthQUFqQjtZQUNFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQyxDQUFDOzs7T0FBQTtJQUdELHNCQUFXLHNEQUFnQjthQUEzQjtZQUNFLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbEMsQ0FBQzthQUNELFVBQTRCLEtBQWM7WUFDeEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUM7OztPQUhBO0lBS0Qsc0JBQVcsMkRBQXFCO2FBQWhDO1lBQ0UsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN2QyxDQUFDO2FBQ0QsVUFBaUMsS0FBYztZQUM3QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsQ0FBQzs7O09BSEE7SUFLRCxzQkFBSSxrREFBWTthQUFoQjtZQUNFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQyxDQUFDO2FBQ0QsVUFBaUIsTUFBYztZQUM3QixJQUFHLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQUU7Z0JBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQzthQUMvQztZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLENBQUM7OztPQU5BO0lBbUJELHNCQUFJLDBEQUFvQjthQUF4QjtZQUNFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQyxDQUFDO2FBQ0QsVUFBeUIsVUFBbUI7WUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsQ0FBQzs7O09BSEE7SUFPSCwrQkFBQztBQUFELENBQUM7O0FBRUQsbURBQWEsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUU7SUFDekMsU0FBUyxFQUFFO1FBQ1QsZUFBZSxFQUFFLFVBQUMsTUFBTSxFQUFFLGFBQWE7WUFDckMsT0FBTyxJQUFJLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BFLENBQUM7S0FDRjtJQUNELFFBQVEsRUFBRSxZQUFZO0NBQ3ZCLENBQUMsQ0FBQztBQUVJLElBQUksbUJBQW1CLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLElBQUksZ0JBQWdCLEdBQUc7SUFDNUIsT0FBTyxFQUFFO1FBQ1AsVUFBVSxFQUFFLFNBQVM7UUFDckIsS0FBSyxFQUFFLFNBQVM7S0FDakI7SUFDRCxzQkFBc0I7SUFDdEIsc0JBQXNCO0lBQ3RCLDhCQUE4QjtJQUM5QixnQkFBZ0I7SUFDaEIsa0JBQWtCO0lBQ2xCLDJCQUEyQjtJQUMzQiw4QkFBOEI7SUFDOUIsS0FBSztJQUNMLHNCQUFzQjtJQUN0QixzQkFBc0I7SUFDdEIsOEJBQThCO0lBQzlCLGdCQUFnQjtJQUNoQixrQkFBa0I7SUFDbEIsMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5QixLQUFLO0lBQ0wsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0Qiw4QkFBOEI7SUFDOUIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQiwyQkFBMkI7SUFDM0IsK0JBQStCO0lBQy9CLEtBQUs7SUFDTCxZQUFZO0lBQ1osc0JBQXNCO0lBQ3RCLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLHFCQUFxQjtJQUNyQix1QkFBdUI7SUFDdkIseUJBQXlCO0lBQ3pCLHFCQUFxQjtJQUNyQixzQ0FBc0M7SUFDdEMsS0FBSztJQUNMLE9BQU8sRUFBRTtRQUNQLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLEdBQUcsRUFBRSxHQUFHO1FBQ1IsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsSUFBSTtRQUNaLFVBQVUsRUFBRSxHQUFHO1FBQ2YsV0FBVyxFQUFFLElBQUk7UUFDakIsVUFBVSxFQUFFLE9BQU87UUFDbkIsS0FBSyxFQUFFLFVBQVU7UUFDakIsUUFBUSxFQUFFLHVCQUF1QjtLQUNsQztJQUNELE9BQU8sRUFBRTtRQUNQLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLEdBQUcsRUFBRSxHQUFHO1FBQ1IsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsSUFBSTtRQUNaLFVBQVUsRUFBRSxHQUFHO1FBQ2YsV0FBVyxFQUFFLElBQUk7UUFDakIsVUFBVSxFQUFFLE9BQU87UUFDbkIsS0FBSyxFQUFFLFVBQVU7UUFDakIsUUFBUSxFQUFFLHVCQUF1QjtLQUNsQztJQUNELFdBQVcsRUFBRTtRQUNYLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLEdBQUcsRUFBRSxHQUFHO1FBQ1IsS0FBSyxFQUFFLElBQUk7UUFDWCxNQUFNLEVBQUUsSUFBSTtRQUNaLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLEtBQUssRUFBRSxlQUFlO1FBQ3RCLFFBQVEsRUFBRSwyQkFBMkI7S0FDdEM7SUFDRCxPQUFPLEVBQUU7UUFDUCxhQUFhLEVBQUUsQ0FBQztRQUNoQixHQUFHLEVBQUUsR0FBRztRQUNSLEtBQUssRUFBRSxHQUFHO1FBQ1YsTUFBTSxFQUFFLElBQUk7UUFDWixVQUFVLEVBQUUsR0FBRztRQUNmLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLEtBQUssRUFBRSxVQUFVO1FBQ2pCLFFBQVEsRUFBRSx1QkFBdUI7S0FDbEM7SUFDRCxXQUFXLEVBQUU7UUFDWCxhQUFhLEVBQUUsQ0FBQztRQUNoQixHQUFHLEVBQUUsR0FBRztRQUNSLEtBQUssRUFBRSxJQUFJO1FBQ1gsTUFBTSxFQUFFLElBQUk7UUFDWixVQUFVLEVBQUUsSUFBSTtRQUNoQixXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsT0FBTztRQUNuQixLQUFLLEVBQUUsZUFBZTtRQUN0QixRQUFRLEVBQUUsMkJBQTJCO0tBQ3RDO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsYUFBYSxFQUFFLENBQUM7UUFDaEIsR0FBRyxFQUFFLEdBQUc7UUFDUixLQUFLLEVBQUUsSUFBSTtRQUNYLE1BQU0sRUFBRSxJQUFJO1FBQ1osVUFBVSxFQUFFLElBQUk7UUFDaEIsV0FBVyxFQUFFLElBQUk7UUFDakIsVUFBVSxFQUFFLE9BQU87UUFDbkIsS0FBSyxFQUFFLFVBQVU7UUFDakIsUUFBUSxFQUFFLHVCQUF1QjtLQUNsQztJQUNELFVBQVUsRUFBRTtRQUNWLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLEdBQUcsRUFBRSxHQUFHO1FBQ1IsS0FBSyxFQUFFLElBQUk7UUFDWCxNQUFNLEVBQUUsSUFBSTtRQUNaLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLEtBQUssRUFBRSxjQUFjO1FBQ3JCLFFBQVEsRUFBRSwwQkFBMEI7S0FDckM7SUFDRCxJQUFJLEVBQUU7UUFDSixhQUFhLEVBQUUsQ0FBQztRQUNoQixHQUFHLEVBQUUsR0FBRztRQUNSLEtBQUssRUFBRSxJQUFJO1FBQ1gsTUFBTSxFQUFFLElBQUk7UUFDWixVQUFVLEVBQUUsSUFBSTtRQUNoQixXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsUUFBUTtRQUNwQixLQUFLLEVBQUUsTUFBTTtRQUNiLFFBQVEsRUFBRSxvQkFBb0I7S0FDL0I7SUFDRCxRQUFRLEVBQUU7UUFDUixhQUFhLEVBQUUsQ0FBQztRQUNoQixHQUFHLEVBQUUsR0FBRztRQUNSLEtBQUssRUFBRSxHQUFHO1FBQ1YsTUFBTSxFQUFFLElBQUk7UUFDWixVQUFVLEVBQUUsR0FBRztRQUNmLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLEtBQUssRUFBRSxXQUFXO1FBQ2xCLFFBQVEsRUFBRSx3QkFBd0I7S0FDbkM7SUFDRCxPQUFPLEVBQUU7UUFDUCxhQUFhLEVBQUUsQ0FBQztRQUNoQixHQUFHLEVBQUUsR0FBRztRQUNSLEtBQUssRUFBRSxJQUFJO1FBQ1gsTUFBTSxFQUFFLElBQUk7UUFDWixVQUFVLEVBQUUsSUFBSTtRQUNoQixXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsUUFBUTtRQUNwQixLQUFLLEVBQUUsY0FBYztRQUNyQixRQUFRLEVBQUUsdUJBQXVCO0tBQ2xDO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsYUFBYSxFQUFFLENBQUM7UUFDaEIsR0FBRyxFQUFFLEdBQUc7UUFDUixLQUFLLEVBQUUsSUFBSTtRQUNYLE1BQU0sRUFBRSxJQUFJO1FBQ1osVUFBVSxFQUFFLElBQUk7UUFDaEIsV0FBVyxFQUFFLElBQUk7UUFDakIsVUFBVSxFQUFFLFFBQVE7UUFDcEIsS0FBSyxFQUFFLGdCQUFnQjtRQUN2QixRQUFRLEVBQUUseUJBQXlCO0tBQ3BDO0lBQ0QsWUFBWSxFQUFFO1FBQ1osYUFBYSxFQUFFLENBQUM7UUFDaEIsR0FBRyxFQUFFLEdBQUc7UUFDUixLQUFLLEVBQUUsR0FBRztRQUNWLE1BQU0sRUFBRSxJQUFJO1FBQ1osVUFBVSxFQUFFLEdBQUc7UUFDZixXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsT0FBTztRQUNuQixLQUFLLEVBQUUsZUFBZTtRQUN0QixRQUFRLEVBQUUsNEJBQTRCO0tBQ3ZDO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsYUFBYSxFQUFFLEdBQUc7UUFDbEIsR0FBRyxFQUFFLEdBQUc7UUFDUixLQUFLLEVBQUUsR0FBRztRQUNWLE1BQU0sRUFBRSxJQUFJO1FBQ1osVUFBVSxFQUFFLElBQUk7UUFDaEIsV0FBVyxFQUFFLElBQUk7UUFDakIsVUFBVSxFQUFFLFFBQVE7UUFDcEIsS0FBSyxFQUFFLGdCQUFnQjtRQUN2QixRQUFRLEVBQUUsNkJBQTZCO0tBQ3hDO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsYUFBYSxFQUFFLENBQUM7UUFDaEIsR0FBRyxFQUFFLEdBQUc7UUFDUixLQUFLLEVBQUUsR0FBRztRQUNWLE1BQU0sRUFBRSxHQUFHO1FBQ1gsVUFBVSxFQUFFLEdBQUc7UUFDZixXQUFXLEVBQUUsR0FBRztRQUNoQixVQUFVLEVBQUUsT0FBTztRQUNuQixLQUFLLEVBQUUsa0JBQWtCO1FBQ3pCLFFBQVEsRUFBRSwwQkFBMEI7S0FDckM7SUFDRCxTQUFTLEVBQUU7UUFDVCxhQUFhLEVBQUUsQ0FBQztRQUNoQixHQUFHLEVBQUUsR0FBRztRQUNSLEtBQUssRUFBRSxHQUFHO1FBQ1YsTUFBTSxFQUFFLElBQUk7UUFDWixVQUFVLEVBQUUsSUFBSTtRQUNoQixXQUFXLEVBQUUsSUFBSTtRQUNqQixVQUFVLEVBQUUsUUFBUTtRQUNwQixLQUFLLEVBQUUsWUFBWTtRQUNuQixRQUFRLEVBQUUseUJBQXlCO0tBQ3BDO0lBQ0QsWUFBWSxFQUFFO1FBQ1osYUFBYSxFQUFFLENBQUM7UUFDaEIsVUFBVSxFQUFFLE9BQU87UUFDbkIsS0FBSyxFQUFFLEVBQUU7UUFDVCxRQUFRLEVBQUUsd0JBQXdCO0tBQ25DO0NBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7O0FDMVhGLGlQQUFpUCxTQUFTLHFFQUFxRSxpREFBaUQsY0FBYyxFQUFFLHNHQUFzRyxrREFBa0QsNkU7Ozs7Ozs7Ozs7O0FDQXhoQix1Qzs7Ozs7Ozs7Ozs7O0FDQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBR1A7QUFDeEIsSUFBSSxRQUFRLEdBQUcsbUJBQU8sQ0FBQyxxREFBZ0IsQ0FBQyxDQUFDO0FBRXpDO0lBQ0UsaUJBQW1CLEtBQW1EO1FBQW5ELFVBQUssR0FBTCxLQUFLLENBQThDO0lBQUcsQ0FBQztJQUMxRSxzQkFBSSw2QkFBUTthQUFaO1lBQ0UsT0FBTyxDQUFDLCtDQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbEQsQ0FBQzs7O09BQUE7SUFDSCxjQUFDO0FBQUQsQ0FBQzs7QUFFRCxtREFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDcEMsU0FBUyxFQUFFO1FBQ1QsZUFBZSxFQUFFLFVBQUMsTUFBTSxFQUFFLGFBQWE7WUFDckMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztLQUNGO0lBQ0QsUUFBUSxFQUFFLFFBQVE7Q0FDbkIsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7QUNwQkgsdUM7Ozs7Ozs7Ozs7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBRXNCO0FBR3hCO0FBQzdCLElBQUksUUFBUSxHQUFHLG1CQUFPLENBQUMscUxBQXdELENBQUMsQ0FBQztBQUVqRjtJQUNFLDhCQUFtQixJQUEwQixFQUFVLFFBQXVCO1FBQTlFLGlCQUNDO1FBRGtCLFNBQUksR0FBSixJQUFJLENBQXNCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUc5RSxVQUFLLEdBQUcsY0FBUSxLQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsY0FBUyxHQUFHLFVBQUMsRUFBRSxFQUFFLENBQUMsSUFBTyxLQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEtBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEYsWUFBTyxHQUFHLFVBQUMsRUFBRSxFQUFFLENBQUMsSUFBTyxLQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUpqRCxDQUFDO0lBQ0Qsc0JBQUksMkNBQVM7YUFBYixjQUFrQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsR0FBRyx3RUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBSXpGLDJCQUFDO0FBQUQsQ0FBQzs7QUFFRCxtREFBYSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtJQUN6QyxTQUFTLEVBQUU7UUFDVCxlQUFlLEVBQUUsVUFBQyxNQUFNLEVBQUUsYUFBYTtZQUNyQyxJQUFJLElBQUksR0FBeUIsTUFBTSxDQUFDLElBQUksQ0FBQztZQUM3QyxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQzdCLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsQ0FBQztLQUNGO0lBQ0QsUUFBUSxFQUFFLFFBQVE7Q0FDbkIsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7QUMxQkgsdUM7Ozs7Ozs7Ozs7OztBQ0FBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErQjtBQUl1QjtBQUU5QjtBQUN4QixJQUFJLFFBQVEsR0FBRyxtQkFBTyxDQUFDLDJLQUFtRCxDQUFDLENBQUM7QUFFckUsSUFBSSxnQkFBZ0IsQ0FBQztBQUU1QixtREFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDcEMsU0FBUyxFQUFFO1FBQ1QsZUFBZSxFQUFFLFVBQUMsTUFBTSxFQUFFLGFBQWE7WUFDckMsSUFBSSxPQUFPLEdBQWtCLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFDbEQsb0VBQW9FO1lBQ3BFLDZFQUE2RTtZQUM3RSwrQkFBK0I7WUFDL0IsaUNBQWlDO1lBQ2pDLE1BQU07WUFDTiw2QkFBNkI7WUFDN0Isa0JBQWtCO1lBQ2xCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUN6QixDQUFDO0tBQ0Y7SUFDRCxRQUFRLEVBQUUsUUFBUTtDQUNuQixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUMxQkg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0I7QUFDVztBQUNnQjtBQUNGO0FBQ1I7QUFDTztBQUNqQjtBQUNLO0FBRXVCO0FBTWxFOztHQUVHO0FBQ0g7SUF5Y0UscUJBQXNCLE9BQXdCO1FBQXhCLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBdGN0Qyx5QkFBb0IsR0FBRyxtREFBYSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3JELDJCQUFzQixHQUFHLG1EQUFhLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdkQsMkJBQXNCLEdBQUcsbURBQWEsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN2RCwrQkFBMEIsR0FBRyxtREFBYSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzNELDRCQUF1QixHQUFHLG1EQUFhLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDeEQsc0JBQWlCLEdBQUcsbURBQWEsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNsRCxlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLCtCQUEwQixHQUFHLG1EQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsd0NBQW1DLEdBQVksS0FBSyxDQUFDO1FBRW5ELGdCQUFXLEdBQUcsbURBQWEsRUFBSyxDQUFDO1FBRW5DLGlCQUFZLEdBQWUsRUFBRSxDQUFDO1FBQzlCLGNBQVMsR0FBZSxFQUFFLENBQUM7UUFHbkMsZUFBVSxHQUFHLG1EQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsa0JBQWEsR0FBRyxtREFBYSxFQUFFLENBQUM7UUFDaEMsd0JBQW1CLEdBQUcsbURBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxnQkFBVyxHQUFHLG1EQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsZUFBVSxHQUFHLG1EQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFdkM7Ozs7OztXQU1HO1FBQ0ksc0JBQWlCLEdBR3BCLElBQUkscURBQVksRUFBc0QsQ0FBQztRQUUzRTs7Ozs7Ozs7O1dBU0c7UUFDSSwwQkFBcUIsR0FHeEIsSUFBSSxxREFBWSxFQUFzRCxDQUFDO1FBRTNFOzs7OztXQUtHO1FBQ0ksNEJBQXVCLEdBRzFCLElBQUkscURBQVksRUFBc0QsQ0FBQztRQUUzRTs7Ozs7Ozs7V0FRRztRQUNJLDJCQUFzQixHQUd6QixJQUFJLHFEQUFZLEVBQXNELENBQUM7UUFFM0U7Ozs7OztXQU1HO1FBQ0ksNkJBQXdCLEdBRzNCLElBQUkscURBQVksRUFBc0QsQ0FBQztRQUMzRTs7Ozs7Ozs7OztXQVVHO1FBQ0ksc0JBQWlCLEdBR3BCLElBQUkscURBQVksRUFBc0QsQ0FBQztRQUMzRTs7Ozs7Ozs7O1dBU0c7UUFDSSxzQkFBaUIsR0FHcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQzNCOzs7Ozs7V0FNRztRQUNJLG9CQUFlLEdBR2xCLElBQUkscURBQVksRUFBc0QsQ0FBQztRQUMzRTs7Ozs7Ozs7O1dBU0c7UUFDSSw2QkFBd0IsR0FHM0IsSUFBSSxxREFBWSxFQUFzRCxDQUFDO1FBQzNFOzs7Ozs7OztXQVFHO1FBQ0kscUJBQWdCLEdBR25CLElBQUkscURBQVksRUFBc0QsQ0FBQztRQUMzRTs7Ozs7O1dBTUc7UUFDSSx3QkFBbUIsR0FHdEIsSUFBSSxxREFBWSxFQUFzRCxDQUFDO1FBQzNFOzs7Ozs7Ozs7O1dBVUc7UUFDSSwrQkFBMEIsR0FHN0IsSUFBSSxxREFBWSxFQUFzRCxDQUFDO1FBQzNFOzs7Ozs7V0FNRztRQUNJLHNCQUFpQixHQUdwQixJQUFJLHFEQUFZLEVBQXNELENBQUM7UUFDM0U7Ozs7Ozs7O1dBUUc7UUFDSSxvQ0FBK0IsR0FHbEMsSUFBSSxxREFBWSxFQUFzRCxDQUFDO1FBQzNFOzs7Ozs7Ozs7V0FTRztRQUNJLDRCQUF1QixHQUcxQixJQUFJLHFEQUFZLEVBQXNELENBQUM7UUFDM0U7Ozs7Ozs7V0FPRztRQUNJLGdDQUEyQixHQUc5QixJQUFJLHFEQUFZLEVBQXNELENBQUM7UUFVM0U7O1dBRUc7UUFDSSwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFDdEM7O1dBRUc7UUFDSSw2QkFBd0IsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUU3Qzs7O1dBR0c7UUFDSSxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFFaEM7O1dBRUc7UUFDSSw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDdkM7O1dBRUc7UUFDSSxxQ0FBZ0MsR0FBRyxJQUFJLENBQUM7UUFDL0M7O1dBRUc7UUFDSSx3QkFBbUIsR0FBRyxDQUFDLENBQUM7UUFFL0I7O1dBRUc7UUFDSSw2QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFFdkM7O1dBRUc7UUFDSSxpQ0FBNEIsR0FBRyxJQUFJLENBQUM7UUFFM0M7O1dBRUc7UUFDSSxxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFFL0I7Ozs7OztXQU1HO1FBQ0ksdUNBQWtDLEdBQXFCLE1BQU0sQ0FBQztRQUVyRTs7V0FFRztRQUNJLHlDQUFvQyxHQUFHLElBQUksQ0FBQztRQUVuRDs7V0FFRztRQUNJLDhCQUF5QixHQUFHLEtBQUssQ0FBQztRQUVsQyxTQUFJLEdBQUcsd0RBQWtCLEVBQUUsQ0FBQztRQXFGbkM7O1dBRUc7UUFDSSwwQkFBcUIsR0FBWSxJQUFJLENBQUM7UUFFN0MsZUFBVSxHQUFHLG1EQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFrRWhDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUE1SkQ7OztPQUdHO0lBQ0ksa0NBQVksR0FBbkIsVUFBb0IsR0FBVztRQUM3QixPQUFPLHNFQUFrQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBS0Qsc0JBQVcsd0NBQWU7UUFIMUI7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDckMsQ0FBQzthQUNELFVBQTJCLEtBQWM7WUFDdkMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7OztPQUhBO0lBT0Qsc0JBQVcsMENBQWlCO1FBSDVCOztXQUVHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7YUFDRCxVQUE2QixLQUFjO1lBQ3pDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDOzs7T0FIQTtJQU9ELHNCQUFXLDBDQUFpQjtRQUg1Qjs7V0FFRzthQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN2QyxDQUFDO2FBQ0QsVUFBNkIsS0FBYztZQUN6QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyw2Q0FBb0I7UUFIL0I7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQ3BDLENBQUM7YUFDRCxVQUFnQyxLQUFjO1lBQzVDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDckMsQ0FBQzs7O09BSEE7SUFRRCxzQkFBVyw4Q0FBcUI7UUFIaEM7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDM0MsQ0FBQzthQUNELFVBQWlDLEtBQWM7WUFDN0MsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUM7OztPQUhBO0lBUUQsc0JBQVcscUNBQVk7UUFIdkI7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbEMsQ0FBQzthQUNELFVBQXdCLEtBQWM7WUFDcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUM7OztPQUhBO0lBT0Qsc0JBQVcsMkNBQWtCO1FBSDdCOztXQUVHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3hDLENBQUM7YUFDRCxVQUE4QixLQUFjO1lBQzFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxDQUFDOzs7T0FIQTtJQVFELHNCQUFXLG1DQUFVO1FBSHJCOztXQUVHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzQixDQUFDO2FBQ0QsVUFBc0IsTUFBTTtZQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLENBQUM7OztPQUhBO0lBV1MsbUNBQWEsR0FBdkIsVUFBd0IsTUFBZSxJQUFHLENBQUM7SUFLM0Msc0JBQVcsaUNBQVE7UUFIbkI7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNCLENBQUM7YUFDRCxVQUFvQixNQUFlO1lBQ2pDLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ25CLENBQUM7OztPQU5BO0lBY0Qsc0JBQVcsOENBQXFCO1FBTmhDOzs7OztXQUtHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQzNDLENBQUM7YUFDRCxVQUFpQyxHQUFHO1lBQ2xDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxDQUFDOzs7T0FIQTtJQVFELHNCQUFXLDhCQUFLO1FBSGhCOztXQUVHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQzthQUNELFVBQWlCLEtBQWM7WUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDMUIsQ0FBQzs7O09BSEE7SUFLRCxzQkFBVyxrQ0FBUzthQUFwQjtZQUNFLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzVCLENBQUM7YUFFRCxVQUFxQixNQUFNO1lBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsQ0FBQzs7O09BSkE7SUFNRDs7O09BR0c7SUFDSSx1Q0FBaUIsR0FBeEIsVUFBeUIsUUFBZ0I7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFUyx1Q0FBaUIsR0FBM0IsVUFBNEIsT0FBZSxJQUFHLENBQUM7SUFFckMsdUNBQWlCLEdBQTNCLFVBQTRCLE9BQWU7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBT1MsOEJBQVEsR0FBbEI7UUFBQSxpQkE2REM7UUE1REMsaURBQVcsQ0FBQztZQUNWLEtBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDZCxJQUFJLEtBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3hCLEtBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNiLElBQUksRUFBRSxVQUFVO29CQUNoQixLQUFLLEVBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUM7b0JBQ3ZDLFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLElBQUksRUFBRSxLQUFJO29CQUNWLE1BQU0sRUFBRSxjQUFNLFlBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFBbEMsQ0FBa0M7aUJBQ2pELENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxLQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzFCLEtBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNiLElBQUksRUFBRSxNQUFNO29CQUNaLEtBQUssRUFBRSxLQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztvQkFDekMsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLElBQUksRUFBRSxLQUFJO29CQUNWLE1BQU0sRUFBRSxjQUFNLFlBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBOUIsQ0FBOEI7aUJBQzdDLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxLQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNyQixLQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDYixJQUFJLEVBQUUsT0FBTztvQkFDYixLQUFLLEVBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7b0JBQ3BDLFFBQVEsRUFBRSxjQUFjO29CQUN4QixJQUFJLEVBQUUsS0FBSTtvQkFDVixNQUFNLEVBQUUsY0FBTSxZQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQS9CLENBQStCO2lCQUM5QyxDQUFDLENBQUM7YUFDSjtZQUNELElBQUksS0FBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUMxQixLQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDYixJQUFJLEVBQUUsUUFBUTtvQkFDZCxLQUFLLEVBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUM7b0JBQ3pDLFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLElBQUksRUFBRSxLQUFJO29CQUNWLE1BQU0sRUFBRSxjQUFNLFlBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsRUFBaEMsQ0FBZ0M7aUJBQy9DLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxLQUFJLENBQUMscUJBQXFCLEVBQUU7Z0JBQzlCLEtBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNiLElBQUksRUFBRSxPQUFPO29CQUNiLEtBQUssRUFBRSxLQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO29CQUMxQyxRQUFRLEVBQUUsY0FBYztvQkFDeEIsSUFBSSxFQUFFLEtBQUk7b0JBQ1YsTUFBTSxFQUFFLGNBQU0sWUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUEvQixDQUErQjtpQkFDOUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLEtBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDM0IsS0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ2IsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLEtBQUssRUFBRSxLQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO29CQUMxQyxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixJQUFJLEVBQUUsS0FBSTtvQkFDVixNQUFNLEVBQUUsY0FBTSxZQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEVBQXJDLENBQXFDO2lCQUNwRCxDQUFDLENBQUM7YUFDSjtZQUNELElBQUksS0FBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3RDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sZ0NBQVUsR0FBakI7UUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFUyxnQ0FBVSxHQUFwQixVQUFxQixPQUF3QjtRQUMzQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUM7WUFDOUMsT0FBTyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQ3ZCLE9BQU8sT0FBTyxDQUFDLGVBQWUsS0FBSyxXQUFXO1lBQzVDLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZTtZQUN6QixDQUFDLENBQUMsSUFBSSxDQUNULENBQUM7UUFDRixJQUFJLENBQUMsaUJBQWlCLENBQ3BCLE9BQU8sT0FBTyxDQUFDLFlBQVksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FDM0UsQ0FBQztRQUNGLElBQUksQ0FBQyxzQkFBc0IsQ0FDekIsT0FBTyxPQUFPLENBQUMsaUJBQWlCLEtBQUssV0FBVztZQUM5QyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQjtZQUMzQixDQUFDLENBQUMsSUFBSSxDQUNULENBQUM7UUFDRixJQUFJLENBQUMsc0JBQXNCLENBQ3pCLE9BQU8sT0FBTyxDQUFDLGlCQUFpQixLQUFLLFdBQVc7WUFDOUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUI7WUFDM0IsQ0FBQyxDQUFDLElBQUksQ0FDVCxDQUFDO1FBQ0YsSUFBSSxDQUFDLDBCQUEwQixDQUM3QixPQUFPLE9BQU8sQ0FBQyxxQkFBcUIsS0FBSyxXQUFXO1lBQ2xELENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCO1lBQy9CLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxvQkFBb0IsS0FBSyxXQUFXO2dCQUNyRCxDQUFDLENBQUMsT0FBTyxDQUFDLG9CQUFvQjtnQkFDOUIsQ0FBQyxDQUFDLEtBQUssQ0FDVixDQUFDO1FBQ0YsSUFBSSxDQUFDLHVCQUF1QixDQUMxQixPQUFPLE9BQU8sQ0FBQyxrQkFBa0IsS0FBSyxXQUFXO1lBQy9DLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCO1lBQzVCLENBQUMsQ0FBQyxLQUFLLENBQ1YsQ0FBQztRQUNGLElBQUksQ0FBQyxpQkFBaUIsQ0FDcEIsT0FBTyxPQUFPLENBQUMsWUFBWSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUMzRSxDQUFDO1FBRUYsSUFBSSxDQUFDLHFCQUFxQjtZQUN4QixPQUFPLE9BQU8sQ0FBQyxxQkFBcUIsS0FBSyxXQUFXO2dCQUNsRCxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFxQjtnQkFDL0IsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUVaLElBQUksQ0FBQyxnQkFBZ0I7WUFDbkIsT0FBTyxPQUFPLENBQUMsZ0JBQWdCLEtBQUssV0FBVztnQkFDN0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0I7Z0JBQzFCLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDWixJQUFJLENBQUMsdUJBQXVCO1lBQzFCLE9BQU8sT0FBTyxDQUFDLHVCQUF1QixLQUFLLFdBQVc7Z0JBQ3BELENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCO2dCQUNqQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ1osSUFBSSxDQUFDLGdDQUFnQztZQUNuQyxPQUFPLE9BQU8sQ0FBQyxnQ0FBZ0MsS0FBSyxXQUFXO2dCQUM3RCxDQUFDLENBQUMsT0FBTyxDQUFDLGdDQUFnQztnQkFDMUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNYLElBQUksT0FBTyxPQUFPLENBQUMsbUJBQW1CLEtBQUssV0FBVyxFQUFFO1lBQ3RELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7U0FDeEQ7UUFDRCxJQUFJLENBQUMsc0JBQXNCO1lBQ3pCLE9BQU8sT0FBTyxDQUFDLHNCQUFzQixLQUFLLFdBQVc7Z0JBQ25ELENBQUMsQ0FBQyxPQUFPLENBQUMsc0JBQXNCO2dCQUNoQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ1osSUFBSSxDQUFDLHdCQUF3QjtZQUMzQixPQUFPLE9BQU8sQ0FBQyx3QkFBd0IsS0FBSyxXQUFXO2dCQUNyRCxDQUFDLENBQUMsT0FBTyxDQUFDLHdCQUF3QjtnQkFDbEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1QsSUFBSSxDQUFDLFNBQVM7WUFDWixPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FDaEIsT0FBTyxPQUFPLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUN6RSxDQUFDO1FBRUYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsVUFBVTtZQUNiLE9BQU8sT0FBTyxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN6RSxJQUFJLENBQUMscUJBQXFCO1lBQ3hCLE9BQU8sT0FBTyxDQUFDLHFCQUFxQixLQUFLLFdBQVc7Z0JBQ2xELENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCO2dCQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1gsSUFBSSxDQUFDLFVBQVU7WUFDYixPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFL0QsSUFBSSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFO1lBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxPQUFPLE9BQU8sQ0FBQyx3QkFBd0IsS0FBSyxXQUFXLEVBQUU7WUFDM0QsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztTQUNsRTtRQUNELElBQUksT0FBTyxPQUFPLENBQUMsNEJBQTRCLEtBQUssV0FBVyxFQUFFO1lBQy9ELElBQUksQ0FBQyw0QkFBNEIsR0FBRyxPQUFPLENBQUMsNEJBQTRCLENBQUM7U0FDMUU7UUFDRCxJQUFJLE9BQU8sT0FBTyxDQUFDLGtDQUFrQyxLQUFLLFdBQVcsRUFBRTtZQUNyRSxJQUFJLENBQUMsa0NBQWtDO2dCQUNyQyxPQUFPLENBQUMsa0NBQWtDLENBQUM7U0FDOUM7UUFDRCxJQUFJLE9BQU8sT0FBTyxDQUFDLG9DQUFvQyxLQUFLLFdBQVcsRUFBRTtZQUN2RSxJQUFJLENBQUMsb0NBQW9DO2dCQUN2QyxPQUFPLENBQUMsb0NBQW9DLENBQUM7U0FDaEQ7UUFDRCxJQUFJLE9BQU8sT0FBTyxDQUFDLGdCQUFnQixLQUFLLFdBQVcsRUFBRTtZQUNuRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1NBQ2xEO0lBQ0gsQ0FBQztJQUVELHlDQUFtQixHQUFuQixVQUFvQixHQUFnQixFQUFFLFlBQW9CO1FBQ3hELElBQUksUUFBUSxHQUFHLDBEQUFpQixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDM0UsT0FBTyxDQUNMLENBQUMsUUFBUTtZQUNULENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUNoQyxHQUFHLEVBQ0gsUUFBUSxFQUNSLFFBQVEsQ0FBQyxRQUFRLEVBQ2pCLFNBQVMsRUFDVCxTQUFTLENBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGtEQUE0QixHQUE1QixVQUNFLEdBQWdCLEVBQ2hCLFFBQW1DLEVBQ25DLFFBQWlCLEVBQ2pCLFNBQXNCLEVBQ3RCLGNBQXlDO1FBRXpDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU87WUFBRSxPQUFPLGFBQWEsQ0FBQztRQUM3RCxJQUFJLE9BQU8sR0FBRztZQUNaLEdBQUcsRUFBRSxHQUFHO1lBQ1IsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLGFBQWE7WUFDdkIsWUFBWSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQzNCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLGNBQWMsRUFBRSxjQUFjO1NBQy9CLENBQUM7UUFDRixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDMUIsQ0FBQztJQUtELHNCQUFXLCtCQUFNO1FBSGpCOztXQUVHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM1QixDQUFDOzs7T0FBQTtJQUVPLCtDQUF5QixHQUFqQztRQUNFLElBQUksSUFBSSxHQUFTLElBQUksQ0FBQyxNQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUU7WUFDbEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFDRCxPQUFPLElBQUksa0RBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFUyxrQ0FBWSxHQUF0QixVQUF1QixLQUFhO1FBQ2xDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtZQUNwQyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGdDQUFVLEdBQWpCLFVBQWtCLEtBQWEsRUFBRSxVQUFrQjtRQUFsQiwrQ0FBa0I7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBTUQsc0JBQVcsNkJBQUk7UUFKZjs7O1dBR0c7YUFDSDtZQUNFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtnQkFDcEMsT0FBTyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxJQUFJLENBQUM7YUFDOUM7WUFDRCxPQUFPLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzFDLENBQUM7YUFDRCxVQUFnQixLQUFhO1lBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9CLENBQUM7OztPQUhBO0lBS00sbUNBQWEsR0FBcEI7UUFDRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxRQUFRLEVBQUU7WUFDakMsT0FBTyxJQUFJLDBEQUFpQixFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMxRDtRQUNELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDL0IsSUFBSSxVQUFVLEdBQUcsSUFBSSw0REFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN0RCxJQUFJLFVBQVUsQ0FBQyxhQUFhLEVBQUU7WUFDNUIsT0FBTyxJQUFJLDBEQUFpQixFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNoRTtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLDBDQUFvQixHQUEzQixVQUNFLEdBQWdCLEVBQ2hCLE1BQWMsRUFDZCxXQUErQjtRQUEvQixxREFBK0I7UUFFL0IsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixXQUFXLEdBQUcsMERBQVksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsSUFBSSxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUM3QixDQUFDO0lBRU0sa0NBQVksR0FBbkIsVUFDRSxJQUFjLEVBQ2QsTUFBMkIsRUFDM0IsVUFBMEI7UUFGMUIsZ0NBQWM7UUFDZCw0Q0FBMkI7UUFDM0IsMENBQWEsc0RBQWE7UUFFMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsSUFBSSxNQUFNLElBQUksVUFBVSxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUU7WUFDNUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxzRUFBa0IsQ0FBQyxhQUFhLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVNLGlDQUFXLEdBQWxCLFVBQW1CLE9BQW1CO1FBQW5CLHdDQUFtQjtJQUFHLENBQUM7SUFFaEMsMENBQW9CLEdBQTlCLFVBQStCLEdBQW9CLEVBQUUsU0FBaUI7UUFDcEUsSUFBSSxXQUFXLEdBQUcsb0VBQWlCLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ2YsSUFBSSxFQUFFLG9CQUFvQjtZQUMxQixTQUFTLEVBQUUsU0FBUztZQUNwQixRQUFRLEVBQUUsR0FBRztZQUNiLFFBQVEsRUFBRSxXQUFXO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyx3Q0FBa0IsR0FBNUIsVUFBNkIsSUFBUyxFQUFFLFVBQW1CLElBQUcsQ0FBQztJQU0vRCxzQkFBVyw2QkFBSTtRQUpmOzs7V0FHRzthQUNIO1lBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO2dCQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzVCLE9BQWEsSUFBSSxDQUFDLE1BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQyxDQUFDO2FBQ0QsVUFBZ0IsR0FBUTtZQUN0QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxRQUFRLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3hDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDcEM7UUFDSCxDQUFDOzs7T0FQQTtJQVNTLHlDQUFtQixHQUE3QixVQUNFLE9BQXdCLEVBQ3hCLFlBQTJDO1FBQTNDLGtFQUEyQztRQUUzQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNmLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO1FBQzVDLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDakMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDMUIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDN0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUFFLEtBQUssRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLGlDQUFXLEdBQWxCLFVBQW1CLE9BQXdCO1FBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNPLGlEQUEyQixHQUFuQyxVQUFvQyxPQUE4QjtRQUNoRSxJQUFJLE1BQU0sR0FBRyxJQUFJLDJEQUFrQixFQUFFLENBQUM7UUFDdEMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDbEIsTUFBTSxDQUFDLE9BQU8sQ0FBbUIsT0FBTyxDQUFDLENBQUM7U0FDM0M7YUFBTTtZQUNMLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQWtCLE9BQU8sQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsSUFBSSxLQUFLLEdBQUcsSUFBSSx1REFBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQzVDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQztJQUVTLHFDQUFlLEdBQXpCO1FBQ0UsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFUyxrQ0FBWSxHQUF0QjtRQUNFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMvRDtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNsRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRVMsaUNBQVcsR0FBckIsVUFDRSxRQUFvQixFQUNwQixPQUFnQixFQUNoQixNQUFrQjtRQUVsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO2dCQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFCO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQywwREFBWSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDMUU7SUFDSCxDQUFDO0lBRVMsZ0NBQVUsR0FBcEIsVUFBcUIsSUFBWTtRQUMvQixJQUFJLElBQUksSUFBSSxNQUFNO1lBQUUsT0FBTywwREFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFFLE9BQU8sSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLElBQUksV0FBVztZQUMzQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUNTLHdDQUFrQixHQUE1QjtRQUNFLE9BQU8sMERBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ1MscUNBQWUsR0FBekI7UUFDRSxPQUFPLDBEQUFZLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFUyxxQ0FBZSxHQUF6QixVQUEwQixPQUF3QjtRQUNoRCxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDM0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDckQsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7U0FDeEI7UUFDRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksTUFBTSxJQUFJLE1BQU0sRUFBRTtZQUN2QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxLQUFLLEdBQWdDLE9BQVEsQ0FBQztZQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pDO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVTLHNDQUFnQixHQUExQixVQUEyQixJQUFTO1FBQ2xDLElBQUksVUFBVSxHQUFHLDBEQUFpQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RCxJQUFJLDBEQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTSxpQ0FBVyxHQUFsQixVQUFtQixPQUFvQjtRQUNyQyxJQUFJLElBQUksR0FBRyxJQUFJLDBEQUFpQixFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxzQ0FBZ0IsR0FBdkIsVUFBd0IsUUFBcUI7UUFDM0MsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLG1DQUFhLEdBQXBCLFVBQXFCLE9BQW9CO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVTLHNDQUFnQixHQUExQixVQUEyQixHQUFRO1FBQ2pDLElBQUksT0FBTyxHQUFHLDBEQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksT0FBTyxJQUFJLHFEQUFPLENBQUMsSUFBSSxFQUFFO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzdCO2FBQU07WUFDTCxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQzFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNmLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsTUFBTSxFQUFFLEdBQUc7U0FDWixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVTLGtDQUFZLEdBQXRCLFVBQXVCLEdBQVE7UUFDN0IsSUFBSSxPQUFPLEdBQUc7WUFDWixPQUFPLEVBQUUsR0FBRztZQUNaLFdBQVcsRUFBRSwwREFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDNUMsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVTLDhDQUF3QixHQUFsQyxVQUFtQyxHQUFRO1FBQ3pDLElBQUksT0FBTyxHQUFHLDBEQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksU0FBUyxDQUFDO1FBQ2QsSUFBSSxPQUFPLElBQUkscURBQU8sQ0FBQyxRQUFRLEVBQUU7WUFDL0IsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDbkI7YUFBTTtZQUNMLElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7U0FDL0I7UUFDRCxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFDdkIscUNBQXFDO1FBQ3JDLElBQUksS0FBSyxHQUFHLElBQUksdURBQVcsQ0FBTSxJQUFJLENBQUMsTUFBTSxFQUFPLElBQUksQ0FBQyxDQUFDO1FBQ3pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pDLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7U0FDbkQ7SUFDSCxDQUFDO0lBRU0sbUNBQWEsR0FBcEIsVUFBcUIsT0FBWSxJQUFHLENBQUM7SUFFM0IsMkNBQXFCLEdBQS9CLFVBQWdDLEdBQWdCLEVBQUUsT0FBZ0I7UUFDaEUsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQyxRQUFRLEVBQUUsQ0FBQztTQUNaO1FBQ0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNTLDZDQUF1QixHQUFqQyxVQUNFLE1BQVcsRUFDWCxRQUFtQyxFQUNuQyxRQUFnQixFQUNoQixTQUFjLEVBQ2QsY0FBeUM7UUFFekMsSUFBSSxPQUFPLEdBQUc7WUFDWixHQUFHLEVBQUUsTUFBTTtZQUNYLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUSxFQUFFLFFBQVE7WUFDbEIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsY0FBYyxFQUFFLGNBQWM7U0FDL0IsQ0FBQztRQUNGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUN6QixDQUFDO0lBQ1MsbUNBQWEsR0FBdkIsVUFDRSxNQUFXLEVBQ1gsSUFBaUIsRUFDakIsV0FBb0I7UUFFcEIsSUFBSSxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6QyxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDM0IsQ0FBQztJQUNPLGdEQUEwQixHQUFsQyxVQUNFLEdBQWdCLEVBQ2hCLFlBQW9CLEVBQ3BCLEtBQVU7UUFFVixJQUFJLFlBQVksS0FBSyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRCxJQUFJLE9BQU8sS0FBSyxLQUFLO1lBQ25CLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNTLHdDQUFrQixHQUE1QixVQUE2QixFQUFlLEVBQUUsT0FBZTtRQUMzRCxJQUFJLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDN0QsR0FBRztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUNyQixPQUFPLENBQUMsSUFBSSxHQUFHLDBEQUFZLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMzRDtZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzNDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsMERBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzNEO1lBQ0QsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMzQyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUMzQixPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN4RDtTQUNGLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1FBQzVCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztJQUN0QixDQUFDO0lBQ1Msa0NBQVksR0FBdEIsVUFBdUIsRUFBZSxFQUFFLE9BQWU7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUUsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUM7WUFDcEUsT0FBTyxLQUFLLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ08seUNBQW1CLEdBQTNCLFVBQ0UsUUFBb0IsRUFDcEIsRUFBZSxFQUNmLE9BQWU7UUFFZixFQUFFLEdBQUcsOEVBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU87Z0JBQ2hFLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ1MsMkNBQXFCLEdBQS9CLGNBQW1DLENBQUM7SUFHcEMsc0JBQUksdURBQThCO1FBRGxDLGtDQUFrQzthQUNsQztZQUNFLE9BQU8sSUFBSSxDQUFDLG1DQUFtQyxDQUFDO1FBQ2xELENBQUM7YUFDRCxVQUFtQyxLQUFjO1lBQy9DLElBQUksQ0FBQyxtQ0FBbUMsR0FBRyxLQUFLLENBQUM7UUFDbkQsQ0FBQzs7O09BSEE7SUFJRCwrQ0FBeUIsR0FBekIsVUFDRSxNQUFXLEVBQ1gsUUFBbUMsRUFDbkMsUUFBdUIsRUFDdkIsU0FBYyxFQUNkLGNBQXlDO1FBRnpDLDBDQUF1QjtRQUl2QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FDakMsTUFBTSxFQUNOLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULGNBQWMsQ0FDZixDQUFDO0lBQ0osQ0FBQztJQUNELDZDQUF1QixHQUF2QixVQUNFLE1BQVcsRUFDWCxJQUFpQixFQUNqQixXQUFvQjtRQUVwQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0Qsc0RBQWdDLEdBQWhDLFVBQ0UsR0FBZ0IsRUFDaEIsUUFBbUMsRUFDbkMsVUFBOEIsRUFDOUIsSUFBaUI7UUFFakIsSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZELElBQUksT0FBTyxHQUFHO1lBQ1osR0FBRyxFQUFFLEdBQUc7WUFDUixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDM0IsVUFBVSxFQUFFLFVBQVU7WUFDdEIsSUFBSSxFQUFFLElBQUk7WUFDVixXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFDO1FBQ0YsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEQsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDO0lBQzdCLENBQUM7SUFDRCw4Q0FBd0IsR0FBeEIsVUFDRSxHQUFnQixFQUNoQixZQUFvQixFQUNwQixTQUEyQixFQUMzQixVQUFtQztRQUVuQyxJQUFJLE9BQU8sR0FBRztZQUNaLEdBQUcsRUFBRSxHQUFHO1lBQ1IsWUFBWSxFQUFFLFlBQVk7WUFDMUIsT0FBTyxFQUFFLFNBQVM7WUFDbEIsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCx5REFBbUMsR0FBbkMsVUFDRSxNQUF1QixFQUN2QixNQUFtQyxFQUNuQyxPQUEyQztRQUUzQyxJQUFJLE9BQU8sR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDdEUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELHdEQUFrQyxHQUFsQyxVQUNFLFlBQW9CLEVBQ3BCLEdBQWdCLEVBQ2hCLGFBQWtCO1FBRWxCLElBQUksT0FBTyxHQUFHO1lBQ1osWUFBWSxFQUFFLFlBQVk7WUFDMUIsR0FBRyxFQUFFLEdBQUc7WUFDUixhQUFhLEVBQUUsYUFBYTtTQUM3QixDQUFDO1FBQ0YsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELHdEQUFrQyxHQUFsQyxVQUNFLFlBQW9CLEVBQ3BCLEdBQWdCLEVBQ2hCLEtBQVU7UUFFVixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsQ0FBQyxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUIsSUFBSSxPQUFPLEdBQUc7WUFDWixZQUFZLEVBQUUsWUFBWTtZQUMxQixHQUFHLEVBQUUsR0FBRztZQUNSLEtBQUssRUFBRSxLQUFLO1lBQ1osS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDO1FBQ0YsSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekQsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCw2Q0FBdUIsR0FBdkIsVUFBd0IsT0FBWTtRQUNsQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ00sNENBQXNCLEdBQTdCLFVBQ0UsUUFBbUMsRUFDbkMsR0FBUSxFQUNSLFFBQWE7UUFFYixJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDZixJQUFJLEVBQUUsa0JBQWtCO1lBQ3hCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQixNQUFNLEVBQUUsR0FBRztZQUNYLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQ25CLENBQUMsQ0FBQztRQUNILDREQUE0RDtRQUM1RCxJQUNFLFFBQVEsQ0FBQyxJQUFJLElBQUksWUFBWTtZQUM3QixRQUFRLENBQUMsSUFBSSxJQUFJLFNBQVM7WUFDMUIsUUFBUSxDQUFDLElBQUksSUFBSSxVQUFVO1lBQzNCLFFBQVEsQ0FBQyxJQUFJLElBQUksY0FBYztZQUMvQixRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsRUFDekI7WUFDQSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUM5QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELHFEQUErQixHQUEvQixVQUFnQyxHQUFnQixFQUFFLEtBQWE7UUFDN0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QseURBQW1DLEdBQW5DLFVBQ0UsWUFBb0IsRUFDcEIsR0FBZ0IsRUFDaEIsTUFBVyxFQUNYLElBQVc7UUFFWCxJQUFJLE9BQU8sR0FBRztZQUNaLFlBQVksRUFBRSxZQUFZO1lBQzFCLEdBQUcsRUFBRSxHQUFHO1lBQ1IsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUM7UUFDRixJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzVCO1NBQ0Y7SUFDSCxDQUFDO0lBQ0QsOENBQXdCLEdBQXhCO1FBQ0UsTUFBTTtJQUNSLENBQUM7SUFDRCw2Q0FBdUIsR0FBdkI7UUFDRSxNQUFNO0lBQ1IsQ0FBQztJQUNILGtCQUFDO0FBQUQsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUNqc0NEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQStCO0FBQ1c7QUFHMUMsSUFBSSxDQUFDLENBQUMsZ0RBQVUsRUFBRTtJQUNoQixnREFBVSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztDQUN2QztBQUVEO0lBQ0UsK0JBQ1MsSUFBaUIsRUFDakIsTUFBVyxFQUNYLE1BQVcsRUFDbEIsZ0JBQTZCLEVBQ3JCLGVBQWdDO1FBRHhDLHVEQUE0QixDQUFDO1FBSHRCLFNBQUksR0FBSixJQUFJLENBQWE7UUFDakIsV0FBTSxHQUFOLE1BQU0sQ0FBSztRQUNYLFdBQU0sR0FBTixNQUFNLENBQUs7UUFFVixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFFeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNNLHNDQUFNLEdBQWIsVUFDRSxXQUFnQixFQUNoQixRQUFpQixFQUNqQixNQUF1QjtRQUF2Qix1Q0FBdUI7UUFFdkIseURBQXlEO1FBQ3pELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ00sc0NBQU0sR0FBYjtRQUNFLElBQUksTUFBTSxDQUFDO1FBQ1gsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkQsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ00scUNBQUssR0FBWjtRQUNFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ08seUNBQVMsR0FBakI7UUFDRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBQ0gsNEJBQUM7QUFBRCxDQUFDOztBQUVEO0lBWUUsd0JBQ1MsSUFBb0IsRUFDM0Isa0JBQTBDLEVBQzFDLE1BQTBCLEVBQ2xCLGVBQWdDO1FBRHhDLHNDQUEwQjtRQUZuQixTQUFJLEdBQUosSUFBSSxDQUFnQjtRQUduQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFUbEMsc0JBQWlCLEdBQWdCLElBQUksQ0FBQztRQUN0QyxhQUFRLEdBQTBCLElBQUksQ0FBQztRQUd2QyxPQUFFLEdBQVcsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBd1R0QyxpQkFBWSxHQUFZLElBQUksQ0FBQztRQTZHOUIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQTlaL0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxpQkFBaUI7WUFDcEIsTUFBTSxJQUFpQixNQUFNLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBQ00sd0NBQWUsR0FBdEIsVUFBdUIsVUFBVSxFQUFFLGFBQWE7UUFDOUMsSUFBSSxXQUFXLEdBQ2IsYUFBYSxDQUFDLE9BQU87WUFDckIsT0FBTyxhQUFhLENBQUMscUJBQXFCLEtBQUssVUFBVTtZQUN6RCxhQUFhLENBQUMscUJBQXFCLEVBQUUsS0FBSyxNQUFNLENBQUM7UUFDbkQsSUFBSSxtQkFBbUIsR0FBRyxXQUFXLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1RCxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLFVBQVUsQ0FBQyxTQUFTO1lBQ2xCLGFBQWEsQ0FBQyxlQUFlLENBQUMsYUFBYSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzlELElBQUksbUJBQW1CLEVBQUU7WUFDdkIsVUFBVSxDQUFDLE9BQU8sR0FBRyxTQUFTLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDekMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtvQkFDZCxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN2QyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7d0JBQ3ZCLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDbkMsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDcEMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUMxQixRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztxQkFDdkQ7aUJBQ0Y7cUJBQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFO29CQUMvQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3JFLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDcEQ7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUM7U0FDSDtRQUNELFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBUyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGFBQWE7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDL0QsSUFBSSxXQUFXO2dCQUNiLE9BQU8sYUFBYTtxQkFDakIsY0FBYyxFQUFFO3FCQUNoQixrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDbkIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDdEIsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN0RSxPQUFPLEtBQUssQ0FBQzthQUNkO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFTLENBQUM7WUFDNUIsSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzVDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FDcEIsV0FBVztnQkFDWCxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVE7Z0JBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU07Z0JBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxhQUFhLENBQy9DLENBQUM7WUFDRiwyQ0FBMkM7WUFDM0MsSUFDRSxtQkFBbUI7Z0JBQ25CLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUTtvQkFDZixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVztvQkFDNUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDNUQ7Z0JBQ0EsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFO29CQUNsQyxTQUFTLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNoRTtxQkFBTTtvQkFDTCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUU7d0JBQ3JDLFNBQVMsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ25FO2lCQUNGO2dCQUNELElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRTtvQkFDZixjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUN0QixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ25CLElBQUksYUFBYSxDQUFDLGVBQWUsQ0FBQyxFQUFFO3dCQUNsQyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ25DLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRTs0QkFDckMsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDcEMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO2dDQUNkLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQzs2QkFDM0I7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFO3dCQUNmLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQzt3QkFDNUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDL0I7aUJBQ0Y7YUFDRjtZQUNELElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ25CLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2FBQ2xDO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixVQUFVLENBQUMsV0FBVyxHQUFHLFVBQVMsQ0FBWTtnQkFDNUMsOENBQThDO2dCQUM5QyxPQUFPO2dCQUNQLGdCQUFnQjtnQkFDaEIseUJBQXlCO2dCQUN6Qix5Q0FBeUM7Z0JBQ3pDLDRDQUE0QztnQkFDNUMsTUFBTTtnQkFDTix3QkFBd0I7Z0JBQ3hCLGtCQUFrQjtnQkFDbEIsSUFBSTtnQkFDSixJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxhQUFhO29CQUFFLE9BQU8sS0FBSyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUNuQixDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUN0QixhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO2lCQUNwRTtnQkFDRCxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDdEIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUM7U0FDSDthQUFNO1lBQ0wsVUFBVSxDQUFDLFdBQVcsR0FBRyxVQUFTLENBQVk7Z0JBQzVDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUNuQixDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7d0JBQ25ELGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7cUJBQ3BFO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDO1NBQ0g7UUFDRCxVQUFVLENBQUMsU0FBUyxHQUFHLFVBQVMsQ0FBQztZQUMvQixPQUFPLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN0QyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNELHNCQUFXLGtDQUFNO2FBQWpCO1lBQ0UsT0FBc0IsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNsQyxDQUFDOzs7T0FBQTtJQUNNLDBDQUFpQixHQUF4QixVQUF5QixLQUFnQixFQUFFLE9BQVk7UUFDckQsSUFBSSxJQUFJLEdBQUcsSUFBSSwwREFBaUIsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDTSw2Q0FBb0IsR0FBM0IsVUFDRSxLQUFnQixFQUNoQixXQUFtQixFQUNuQixXQUFnQjtRQUVoQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hELEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFDTSx5Q0FBZ0IsR0FBdkIsVUFBd0IsS0FBZ0I7UUFDdEMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwQyxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNNLHVDQUFjLEdBQXJCLFVBQ0UsS0FBZ0IsRUFDaEIsT0FBWSxFQUNaLE1BQXVCO1FBQXZCLHVDQUF1QjtRQUV2QixLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDbkIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO2dCQUFFLE9BQU87WUFDckQsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUNqQixNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2QsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDekIsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFFRCxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM5RCxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFDdEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNNLDJDQUFrQixHQUF6QixVQUEwQixLQUFnQixFQUFFLE9BQVk7UUFDdEQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNuQixLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsS0FBSztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUN4QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQ3pCLE9BQU8sRUFDUCxVQUFVLENBQUMsUUFBUSxFQUNuQixVQUFVLENBQUMsTUFBTSxDQUNsQixDQUFDO1NBQ0g7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDTywwQ0FBaUIsR0FBekIsVUFBMEIsS0FBZ0IsRUFBRSxPQUFZO1FBQ3RELEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFDRSxDQUFDLE9BQU87WUFDUixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7WUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1lBRWhDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ00sNEJBQUcsR0FBVjtRQUNFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3ZCO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFDRCxzQkFBVyxvQ0FBUTthQUFuQjtZQUNFLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvQyxDQUFDOzs7T0FBQTtJQUNNLCtCQUFNLEdBQWIsVUFBYyxLQUFnQixFQUFFLGFBQTZCO1FBQTdCLG9EQUE2QjtRQUMzRCxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUU7WUFDekIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxhQUFhLEVBQUU7Z0JBQ2pCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN4QjtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNsQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN4QyxJQUFJLElBQUksQ0FBQyxrQkFBa0I7b0JBQ3pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzt3QkFDdEIsSUFBSSxFQUFFLFNBQVM7d0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSTt3QkFDeEIsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTt3QkFDNUIsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTt3QkFDNUIsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVU7d0JBQ3BELFlBQVksRUFBRSxVQUFVLENBQUMsTUFBTTt3QkFDL0IsV0FBVyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTTs0QkFDOUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7NEJBQ2hELENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ1AsQ0FBQyxDQUFDO2dCQUNILFVBQVUsQ0FBQyxnQkFBZ0IsSUFBSSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDN0QsVUFBVSxDQUFDLGVBQWUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ2xGO1NBQ0Y7UUFDRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDYixDQUFDO0lBQ00sb0NBQVcsR0FBbEIsVUFBbUIsS0FBZ0I7UUFDakMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBQ08sNENBQW1CLEdBQTNCLFVBQTRCLFdBQW1CLEVBQUUsSUFBUztRQUN4RCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztRQUN6QixhQUFhLEdBQUcsMERBQWlCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVELElBQUksMERBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RELGFBQWEsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLElBQUksYUFBYSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQ2xDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0M7YUFBTTtZQUNMLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkM7UUFDRCxhQUFhLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUNuQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUNPLGlDQUFRLEdBQWhCLFVBQWlCLEtBQWdCO1FBQy9CLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksTUFBTSxHQUFXLEtBQUssQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN0QixJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDbEMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBVyxLQUFLLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsT0FBTztZQUNMLFFBQVEsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUM7WUFDeEIsTUFBTSxFQUNKLENBQUMsSUFBSSxjQUFjLENBQUMsVUFBVTtnQkFDOUIsTUFBTSxHQUFHLENBQUMsSUFBSSxjQUFjLENBQUMsVUFBVTtTQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUNPLDRDQUFtQixHQUEzQixVQUE0QixLQUFnQixFQUFFLE1BQVc7UUFDdkQsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztRQUNoQyxJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3RCLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksR0FBRyxHQUFXLEVBQUUsQ0FBQyxTQUFTLEdBQVcsRUFBRSxDQUFDLFlBQVksQ0FBQztRQUN6RCxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3RCLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNsQyxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFXLEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDaEU7UUFDRCxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUNPLDBDQUFpQixHQUF6QixVQUEwQixLQUFnQjtRQUN4QyxJQUFJLEdBQUcsR0FDTCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ2xELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRCxJQUFJLEdBQUcsRUFBRTtZQUNQLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztTQUN0QztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDZCxDQUFDO0lBQ08sb0NBQVcsR0FBbkIsVUFBb0IsS0FBZ0IsRUFBRSxPQUFZO1FBQ2hELElBQUksSUFBSSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUM7UUFDcEMsSUFDRSxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU87WUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUNwQztZQUNBLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUN2QixJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDdkIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUlPLHFDQUFZLEdBQXBCLFVBQXFCLENBQVk7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxPQUFPO1FBQ3BDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQjtRQUNELElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUMsWUFBWSxJQUFJLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDM0QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFDTyxrQ0FBUyxHQUFqQixVQUFrQixJQUFZO1FBQzVCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNoQyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNsQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUU7WUFDZixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixPQUFPO1NBQ1I7UUFDRCxFQUFFLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsVUFBVSxDQUFDO2dCQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFDTyxpREFBd0IsR0FBaEMsVUFBaUMsQ0FBWTtRQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWE7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDekIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDekMsU0FBUyxJQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyQyxFQUFFLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3pCO1FBQ0QsT0FBTyxDQUNMLENBQUMsQ0FBQyxPQUFPO1lBQ0QsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVM7WUFDaEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FDakMsQ0FBQztJQUNKLENBQUM7SUFDTyxpQ0FBUSxHQUFoQixVQUFpQixLQUFnQjtRQUMvQixPQUFPLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDakUsQ0FBQztJQUNPLDZCQUFJLEdBQVosVUFBYSxPQUFvQjtRQUMvQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFZixPQUFPLE9BQU8sRUFBRTtZQUNkLE1BQU0sSUFBSSxPQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUNwRSxPQUFPLEdBQWdCLE9BQU8sQ0FBQyxZQUFZLENBQUM7U0FDN0M7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ08sb0NBQVcsR0FBbkIsVUFDRSxLQUFnQixFQUNoQixXQUFtQixFQUNuQixJQUFTLEVBQ1QsTUFBdUI7UUFFdkIsSUFBSSxHQUFHLEdBQUcsY0FBYyxDQUFDLFNBQVMsR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHFCQUFxQixDQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFDcEMsYUFBYSxFQUNiLE1BQU0sRUFDTixjQUFjLENBQUMsZ0JBQWdCLEVBQy9CLElBQUksQ0FBQyxlQUFlLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBQ08sZ0NBQU8sR0FBZixVQUFnQixLQUFnQixFQUFFLElBQVk7UUFDNUMsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDMUIsS0FBSyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUNoQztRQUNELElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtZQUN0QixLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekMsS0FBSyxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO1NBQzNDO1FBQ0QsY0FBYyxDQUFDLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBQ08sZ0NBQU8sR0FBZixVQUFnQixLQUFnQjtRQUM5QixJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUMxQixLQUFLLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlDLElBQUksSUFBSSxFQUFFO2dCQUNSLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzthQUNyQztTQUNGO1FBQ0QsT0FBTyxjQUFjLENBQUMsUUFBUSxDQUFDO0lBQ2pDLENBQUM7SUFDTyxrQ0FBUyxHQUFqQjtRQUNFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsd0lBQXdJO1FBQzlKLGNBQWMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNuRCxJQUFJLElBQUksR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQTlhYSx5QkFBVSxHQUFXLEVBQUUsQ0FBQztJQUN4QiwrQkFBZ0IsR0FBVyxDQUFDLENBQUMsQ0FBQztJQUNyQyx3QkFBUyxHQUFXLFdBQVcsQ0FBQztJQUNoQyx1QkFBUSxHQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDekMsd0JBQVMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0lBSzVDLHNCQUFPLEdBQVcsQ0FBQyxDQUFDO0lBMFRaLDBCQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3pCLDJCQUFZLEdBQVcsR0FBRyxDQUFDO0lBNEc1QyxxQkFBQztDQUFBO0FBamIwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0NJO0FBQzJCO0FBS1Y7QUFDUTtBQUtkO0FBQ007QUFDcUI7QUFDZDtBQUNMO0FBQ047QUFDTjtBQUN0QyxJQUFJLGtCQUFrQixHQUFHLG1CQUFPLENBQUMsZ0xBQTJELENBQUMsQ0FBQztBQUNwRDtBQU1mO0FBQ3FCO0FBQ0s7QUFDTjtBQUVKO0FBQ0w7QUFFTztBQUNLO0FBRUw7QUFFcUI7QUFJbEU7O0dBRUc7QUFFSDtJQUNVLCtFQUE4QjtJQXdnQnRDOzs7Ozs7Ozs7Ozs7T0FZRztJQUVILHVCQUFZLGVBQTJCLEVBQUUsT0FBbUI7UUFBaEQsd0RBQTJCO1FBQUUsd0NBQW1CO1FBQTVELFlBQ0Usa0JBQU0sT0FBTyxDQUFDLFNBcUpmO1FBMXBCTyxnQkFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4QixvQkFBYyxHQUFtQixJQUFJLENBQUM7UUFHdEMsNEJBQXNCLEdBQStCLEtBQUssQ0FBQztRQUMzRCx1QkFBaUIsR0FBMEIsVUFBVSxDQUFDO1FBQ3RELG1DQUE2QixHQUFZLElBQUksQ0FBQztRQUM5QywwQkFBb0IsR0FBWSxJQUFJLENBQUM7UUFHN0M7O1dBRUc7UUFDSSx3QkFBa0IsR0FBWSxJQUFJLENBQUM7UUFFMUM7OztXQUdHO1FBQ0ksY0FBUSxHQUFXLElBQUksQ0FBQztRQUMvQjs7O1dBR0c7UUFDSSxrQkFBWSxHQUFXLElBQUksQ0FBQztRQUtuQzs7OztXQUlHO1FBQ0ksY0FBUSxHQUdYLElBQUksc0RBQVksRUFBcUQsQ0FBQztRQUMxRTs7O1dBR0c7UUFDSSxrQkFBWSxHQUdmLElBQUksc0RBQVksRUFBcUQsQ0FBQztRQUMxRTs7O1dBR0c7UUFDSSxrQkFBWSxHQUdmLElBQUksc0RBQVksRUFBcUQsQ0FBQztRQUMxRTs7O1dBR0c7UUFDSSxpQkFBVyxHQUdkLElBQUksc0RBQVksRUFBcUQsQ0FBQztRQUMxRTs7O1dBR0c7UUFDSSxpQkFBVyxHQUdkLElBQUksc0RBQVksRUFBcUQsQ0FBQztRQUMxRTs7O1dBR0c7UUFDSSwrQkFBeUIsR0FHNUIsSUFBSSxzREFBWSxFQUFxRCxDQUFDO1FBQzFFOzs7V0FHRztRQUNJLDhCQUF3QixHQUczQixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7Ozs7V0FPRztRQUNJLHlCQUFtQixHQUd0QixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7V0FJRztRQUNJLHdCQUFrQixHQUdyQixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7Ozs7V0FPRztRQUNJLDBCQUFvQixHQUd2QixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7Ozs7V0FPRztRQUNJLDJCQUFxQixHQUd4QixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7O1dBS0c7UUFDSSxxQkFBZSxHQUdsQixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7V0FJRztRQUNJLDBCQUFvQixHQUd2QixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7O1dBS0c7UUFDSSxrQkFBWSxHQUdmLElBQUksc0RBQVksRUFBcUQsQ0FBQztRQUMxRTs7OztXQUlHO1FBQ0ksaUJBQVcsR0FHZCxJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQTZDRztRQUNJLGdCQUFVLEdBR2IsSUFBSSxzREFBWSxFQUFxRCxDQUFDO1FBQzFFOzs7Ozs7V0FNRztRQUNJLDBCQUFvQixHQUd2QixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7V0FJRztRQUNJLDZCQUF1QixHQUcxQixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7V0FJRztRQUNJLHlCQUFtQixHQUd0QixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7V0FJRztRQUNJLCtCQUF5QixHQUc1QixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7Ozs7V0FPRztRQUNJLGtDQUE0QixHQUcvQixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7Ozs7O1dBUUc7UUFDSSxtQ0FBNkIsR0FHaEMsSUFBSSxzREFBWSxFQUFxRCxDQUFDO1FBQzFFOzs7Ozs7O1dBT0c7UUFDSSw2QkFBdUIsR0FHMUIsSUFBSSxzREFBWSxFQUFxRCxDQUFDO1FBQzFFOzs7Ozs7Ozs7Ozs7V0FZRztRQUNJLDhCQUF3QixHQUczQixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7Ozs7V0FPRztRQUNJLDBDQUFvQyxHQUd2QyxJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7Ozs7V0FPRztRQUNJLG1DQUE2QixHQUdoQyxJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFFMUU7Ozs7Ozs7V0FPRztRQUNJLHNDQUFnQyxHQUduQyxJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7O1dBS0c7UUFDSSxxQ0FBK0IsR0FHbEMsSUFBSSxzREFBWSxFQUFxRCxDQUFDO1FBQzFFOzs7Ozs7O1dBT0c7UUFDSSxpQkFBVyxHQUdkLElBQUksc0RBQVksRUFBcUQsQ0FBQztRQUMxRTs7Ozs7OztXQU9HO1FBQ0ksa0JBQVksR0FHZixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7OztXQU1HO1FBQ0ksdUJBQWlCLEdBR3BCLElBQUksc0RBQVksRUFBcUQsQ0FBQztRQUMxRTs7OztXQUlHO1FBQ0ksMkJBQXFCLEdBR3hCLElBQUksc0RBQVksRUFBcUQsQ0FBQztRQUMxRTs7Ozs7Ozs7V0FRRztRQUNJLGdDQUEwQixHQUc3QixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7Ozs7Ozs7V0FVRztRQUNJLHFCQUFlLEdBR2xCLElBQUksc0RBQVksRUFBcUQsQ0FBQztRQUMxRTs7Ozs7Ozs7V0FRRztRQUNJLHVCQUFpQixHQUdwQixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUFDMUU7Ozs7V0FJRztRQUNJLDJCQUFxQixHQUd4QixJQUFJLHNEQUFZLEVBQXFELENBQUM7UUE2QzFFLGFBQU8sR0FBRyxtREFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBNEtwQixpQ0FBMkIsR0FBRyxVQUNwQyxHQUFRLEVBQ1IsV0FBd0IsRUFDeEIsSUFBMEI7WUFFMUIsSUFBSSxLQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFO2dCQUN0QyxPQUFPO2FBQ1I7WUFDRCxJQUFJLE9BQU8sR0FBRztnQkFDWixHQUFHLEVBQUUsR0FBRztnQkFDUixXQUFXLEVBQUUsV0FBVztnQkFDeEIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixjQUFjLEVBQUUsSUFBSSxDQUFDLE1BQU07YUFDNUIsQ0FBQztZQUNGLEtBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQztRQXdGRix1QkFBdUI7UUFDdkIsc0RBQXNEO1FBQ3RELG1DQUFtQztRQUNuQyxjQUFjO1FBQ2QsSUFBSTtRQUVKLGNBQVEsR0FBRyxpREFBVyxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUN6RCw2REFBYSxDQUFDLFlBQVksRUFBRSxDQUM3QixLQUFLLENBQUMsQ0FBQztnQkFDTixDQUFDLENBQUMsZ0JBQWdCO2dCQUNsQixDQUFDLENBQUMsS0FBSyxHQUFHLDZEQUFhLENBQUMsWUFBWSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FBa0hILHlDQUF5QztRQUN6Qyw2QkFBNkI7UUFDN0IsSUFBSTtRQUNKOzs7V0FHRztRQUNJLGtCQUFZLEdBQUcsd0RBQWtCLEVBQVcsQ0FBQztRQStCcEQ7Ozs7V0FJRztRQUNJLG1CQUFhLEdBQVcsR0FBRyxDQUFDO1FBQzNCLHFCQUFlLEdBQUcsSUFBSSxDQUFDO1FBZ0IvQixZQUFNLEdBQVcsQ0FBQyxDQUFDO1FBeUJuQjs7V0FFRztRQUNJLFVBQUksR0FBRztZQUNaLEtBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUM7UUFDRjs7V0FFRztRQUNJLFVBQUksR0FBRztZQUNaLEtBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUM7UUEwSU0sMkJBQXFCLEdBQUcsbURBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQU83QyxzQkFBZ0IsR0FBRyxtREFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBc0N0QywwQkFBb0IsR0FBRyxtREFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLDZCQUF1QixHQUFHLG1EQUFhLENBQVMsU0FBUyxDQUFDLENBQUM7UUFLM0QsMkJBQXFCLEdBQUcsbURBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1Qyw4QkFBd0IsR0FBRyxtREFBYSxDQUFTLGVBQWUsQ0FBQyxDQUFDO1FBRWxFLDRCQUFzQixHQUFHLG1EQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFnQ2pEOztXQUVHO1FBQ0ksYUFBTyxHQUFHO1lBQ2YsSUFBSSxJQUFJLEdBQUcsMERBQVksQ0FBQyxjQUFjLENBQUMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksR0FBZ0IsS0FBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckQsS0FBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7UUFDSyxnQkFBVSxHQUFHO1lBQ2xCLEtBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQztRQUNLLGNBQVEsR0FBRyxVQUFDLElBQXNCLEVBQUUsU0FBaUI7WUFDMUQsSUFBSSxPQUFPLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLEtBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ2YsSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLElBQUksRUFBRSxJQUFJO2dCQUNWLFNBQVMsRUFBRSxTQUFTO2dCQUNwQixPQUFPLEVBQUUsT0FBTzthQUNqQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFvV00sMENBQW9DLEdBQVksS0FBSyxDQUFDO1FBaWJ2RCx3QkFBa0IsR0FBRyxVQUMxQixPQUFvQixFQUNwQixPQUE0QztZQUE1Qyx3Q0FBNEM7WUFFNUMsSUFBSSxDQUFDLEtBQUksQ0FBQyx5QkFBeUIsRUFBRTtnQkFDbkMsS0FBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztnQkFDbEMsS0FBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN0QyxLQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzlDLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDL0MsS0FBSSxDQUFDLDZCQUE2QixDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqRCxPQUFPO2FBQ1I7WUFDRCxLQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQztRQWtFRixzQ0FBc0M7UUFDOUIscUJBQWUsR0FBRztZQUN4QixJQUFJLGNBQWMsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDO1lBQzFDLElBQUksQ0FBQyxjQUFjO2dCQUFFLE9BQU87WUFDNUIsSUFBSSwwREFBWSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsS0FBSyxxREFBTyxDQUFDLElBQUksRUFBRTtnQkFDL0QsSUFDRSwwREFBWSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsS0FBSyxxREFBTyxDQUFDLFFBQVE7b0JBQy9ELENBQUMsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEVBQ2pDO29CQUNBLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2lCQUNyRDtnQkFDRCxPQUFPO2FBQ1I7WUFDRCxLQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztRQUN4QyxDQUFDLENBQUM7UUFnQkY7OztXQUdHO1FBQ0ksY0FBUSxHQUFHLFVBQUMsSUFBc0I7WUFDdkMsSUFBSSxPQUFPLEdBQXNCLEtBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFFLENBQUM7WUFDekQsSUFBSSxLQUFLLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNkLEtBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNqRDtpQkFBTTtnQkFDTCxLQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDakM7WUFDRCxLQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFCLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQztRQWNGLGlDQUEyQixHQUFHLFVBQzVCLE9BQWUsRUFDZixRQUEwQixFQUMxQixLQUFVLEVBQ1YsT0FBWTtZQUVaLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSSxFQUFFO2dCQUNsQyxPQUFPO2dCQUNQLFFBQVE7Z0JBQ1IsS0FBSztnQkFDTCxPQUFPO2FBQ1IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBem5EQSxLQUFJLENBQUMsaUJBQWlCLEdBQUcsbURBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxLQUFJLENBQUMsU0FBUyxHQUFHLG1EQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsS0FBSSxDQUFDLFNBQVMsR0FBRyxtREFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLEtBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSx5REFBZSxDQUNyQyxLQUFJLENBQUMsT0FBTyxJQUFJLEtBQUksQ0FBQyxPQUFPLENBQUMsYUFBYTtZQUN4QyxDQUFDLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQzVCLENBQUMsQ0FBQyxJQUFJLEVBQ1IsS0FBSSxDQUNMLENBQUM7UUFDRixLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksNERBQWdCLENBQUMsS0FBSSxDQUFDLENBQUM7UUFDN0MsS0FBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHdEQUFXLENBQUMsS0FBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDeEUsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBRWhCLDZEQUFhLENBQUMsVUFBVSxDQUFDLDZEQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDO1FBRTFDLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxtREFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLEtBQUksQ0FBQyxpQkFBaUIsR0FBRyxtREFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLEtBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxTQUFTLEdBQUcsd0RBQWtCLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3RDLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxRQUFRO1lBQ2hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxRQUFRO1lBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztnQkFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQztZQUMxQyxJQUFJLElBQUksQ0FBQyxnQ0FBZ0M7Z0JBQ3ZDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw0REFBYSxDQUNwQyxLQUFJLENBQUMsU0FBUyxFQUNkLEtBQUksQ0FBQyxnQkFBZ0IsRUFDckIsVUFBVSxHQUFnQjtZQUN4QixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUNGLENBQUM7UUFDRixLQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsR0FBRyxFQUFFLElBQUk7WUFDMUQsSUFBSSxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2RCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDdEIsQ0FBQyxDQUFDO1FBRUYsS0FBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksNkZBQTZCLENBQ3BFLEtBQUksQ0FDTCxDQUFDO1FBRUYsSUFBSSxLQUFJLENBQUMsK0JBQStCLEVBQUU7WUFDeEMsS0FBSSxDQUFDLDZCQUE2QixDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xFO2FBQU07WUFDTCxJQUFJLENBQUMsNkJBQTZCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakU7UUFFRCxLQUFJLENBQUMsaUNBQWlDLENBQUMsU0FBUyxDQUFDLFVBQVUsUUFBUTtZQUNqRSxJQUFJLFFBQVEsRUFBRTtnQkFDWixJQUFJLENBQUMsNkJBQTZCLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbEU7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLDZCQUE2QixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pFO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFJLENBQUMsNkJBQTZCLENBQUMscUJBQXFCO1lBQ3RELEtBQUksQ0FBQywyQkFBMkIsQ0FBQztRQUNuQyxLQUFJLENBQUMsNkJBQTZCLENBQUMsc0JBQXNCLEdBQUcsVUFDMUQsR0FBUSxFQUNSLFNBQW9DLEVBQ3BDLFNBQW9DO1lBRXBDLE9BQU8sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDO1FBQ0YsS0FBSSxDQUFDLDZCQUE2QixDQUFDLGlCQUFpQixHQUFHLFVBQ3JELEdBQVEsRUFDUixJQUErQixFQUMvQixRQUFhO1lBRWIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDO1FBQ0YsS0FBSSxDQUFDLDZCQUE2QixDQUFDLHlCQUF5QixDQUFDLEdBQUcsVUFDOUQsR0FBUSxFQUNSLElBQStCLEVBQy9CLFFBQWE7WUFFYixPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQztRQUVGLEtBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLDhGQUE4QixFQUFFLENBQUM7UUFFakUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxRQUFRO1lBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsaURBQVcsQ0FBQztZQUNsQyxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxVQUFVLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsc0JBQXNCLEdBQUc7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyx5QkFBeUIsR0FBRztZQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDO1FBQ0YsS0FBSSxDQUFDLGlCQUFpQixHQUFHO1lBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLElBQUksRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNsQixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMxQztRQUNILENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLElBQUk7WUFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUM7UUFDRixLQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQUM7UUFFRixLQUFJLENBQUMsV0FBVyxHQUFHO1lBQ2pCLElBQUksT0FBTyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ25CLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZDLHVDQUF1QztnQkFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDOUM7UUFDSCxDQUFDLENBQUM7UUFDRixLQUFJLENBQUMsV0FBVyxHQUFHO1lBQ2pCLElBQUksT0FBTyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ25CLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZDLHlCQUF5QjtnQkFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDOUM7UUFDSCxDQUFDLENBQUM7UUFFRixLQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVmLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLDBEQUFXLENBQUMsS0FBSSxDQUFDLENBQUM7UUFFOUMsSUFBSSxlQUFlLEVBQUU7WUFDbkIsS0FBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUM5QjtRQUVELElBQU0sUUFBUSxHQUFHLElBQUksbURBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QyxLQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7O0lBQ3pCLENBQUM7SUFqTkQsc0JBQVcsK0NBQW9CO1FBSi9COzs7V0FHRzthQUNIO1lBQ0UsT0FBTyxrRUFBVyxDQUFDLG9CQUFvQixDQUFDO1FBQzFDLENBQUM7YUFDRCxVQUFnQyxHQUFHO1lBQ2pDLGtFQUFXLENBQUMsb0JBQW9CLEdBQUcsR0FBRyxDQUFDO1FBQ3pDLENBQUM7OztPQUhBO0lBS1MscUNBQWEsR0FBdkIsVUFBd0IsTUFBZTtRQUNyQyxpQkFBTSxhQUFhLFlBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUF5TkQsa0NBQVUsR0FBVixVQUFXLE9BQU87UUFDaEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLG1EQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxtREFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxtREFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcsd0RBQWtCLENBQVM7WUFDOUMsU0FBUztZQUNULGNBQWM7U0FDZixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMseUJBQXlCLEdBQUcsbURBQWEsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsYUFBYSxHQUFHLG1EQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxjQUFjLEdBQUcsd0RBQWtCLENBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxlQUFlLEdBQUcsd0RBQWtCLENBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxtREFBYSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLG1DQUFtQyxHQUFHLG1EQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLG1EQUFhLENBQU0sUUFBUSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLG1EQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLG1EQUFhLENBQW9CLElBQUksQ0FBQyxDQUFDO1FBRWpFLGlCQUFNLFVBQVUsWUFBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUV2QixJQUFJLENBQUMsb0JBQW9CO1lBQ3ZCLE9BQU8sT0FBTyxDQUFDLG9CQUFvQixLQUFLLFdBQVc7Z0JBQ2pELENBQUMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CO2dCQUM5QixDQUFDLENBQUMsS0FBSyxDQUFDO1FBRVosSUFBSSxDQUFDLGdCQUFnQjtZQUNuQixPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxXQUFXO2dCQUM3QyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQjtnQkFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUVYLElBQUksQ0FBQyxpQ0FBaUMsQ0FDcEMsT0FBTyxPQUFPLENBQUMsK0JBQStCLEtBQUssV0FBVztZQUM1RCxDQUFDLENBQUMsT0FBTyxDQUFDLCtCQUErQjtZQUN6QyxDQUFDLENBQUMsSUFBSSxDQUNULENBQUM7UUFFRixJQUFJLENBQUMsa0JBQWtCO1lBQ3JCLE9BQU8sT0FBTyxDQUFDLGtCQUFrQixLQUFLLFdBQVc7Z0JBQy9DLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCO2dCQUM1QixDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1gsSUFBSSxPQUFPLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUN4QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO1lBQ3pCLDREQUFhLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDOUM7UUFFRCxJQUFJLE9BQU8sT0FBTyxDQUFDLGlCQUFpQixLQUFLLFdBQVcsRUFBRTtZQUNwRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1NBQ3pEO1FBRUQsSUFBSSxPQUFPLE9BQU8sQ0FBQyxZQUFZLEtBQUssV0FBVyxFQUFFO1lBQy9DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1lBQzlDLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLFFBQVEsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzFDLDJEQUFpQixDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDbkUsMkRBQWlCLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNoRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2FBQ2hDO1NBQ0Y7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMseUJBQXlCLEVBQUU7WUFDMUMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQztZQUN0QyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsS0FBSyxDQUFDO1NBQzVDO1FBQ0QsSUFBSSxPQUFPLE9BQU8sQ0FBQyx3QkFBd0IsS0FBSyxXQUFXLEVBQUU7WUFDM0QsSUFBSSxDQUFDLDZCQUE2QixHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztTQUN2RTtRQUVELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEtBQUssSUFBSSxDQUFDLENBQUM7UUFFdEUsSUFBSSxDQUFDLFdBQVc7WUFDZCxPQUFPLE9BQU8sQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFMUUsSUFBSSxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxXQUFXLEVBQUU7WUFDbkQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ25EO1FBRUQsSUFBSSxPQUFPLE9BQU8sQ0FBQyxlQUFlLEtBQUssUUFBUSxFQUFFO1lBQy9DLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQztTQUNoRDtRQUNELElBQUksT0FBTyxPQUFPLENBQUMsaUNBQWlDLEtBQUssV0FBVyxFQUFFO1lBQ3BFLElBQUksQ0FBQyxpQ0FBaUM7Z0JBQ3BDLENBQUMsQ0FBQyxPQUFPLENBQUMsaUNBQWlDLENBQUM7U0FDL0M7SUFDSCxDQUFDO0lBZ0JPLDJDQUFtQixHQUEzQjtRQUNFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVTLHVDQUFlLEdBQXpCO1FBQUEsaUJBZ0JDO1FBZkMsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLEdBQUc7WUFDaEMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDbEMsSUFBSSxDQUFDLFdBQVc7Z0JBQUUsT0FBTztZQUV6QixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRTtnQkFDdkIsV0FBVyxDQUFDLE1BQU0sR0FBRztvQkFDbkIsSUFBSSxLQUFJLENBQUMsUUFBUTt3QkFBRSxPQUFPO29CQUMxQixLQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4QixDQUFDLENBQUM7YUFDSDtZQUVELEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDhCQUFNLEdBQWIsVUFBYyxPQUF3QjtRQUNwQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSSw4QkFBTSxHQUFiLFVBQWMsT0FBbUIsRUFBRSxPQUFtQjtRQUF4Qyx3Q0FBbUI7UUFBRSx3Q0FBbUI7UUFDcEQsSUFBSSxPQUFPO1lBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLElBQUksUUFBUSxFQUFFO1lBQ3pDLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzVDO1FBQ0QsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztTQUNoQztRQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUNyQixPQUFPLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBQ00sa0NBQVUsR0FBakIsVUFBa0IsUUFBZ0I7UUFDaEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksZ0VBQXNCLEVBQUUsQ0FBQyxVQUFVLENBQ3JDLFFBQVEsRUFDUixVQUFVLE9BQWdCLEVBQUUsTUFBYyxFQUFFLFFBQWE7WUFDdkQsSUFBSSxPQUFPLElBQUksTUFBTSxFQUFFO2dCQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDcEM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksa0NBQVUsR0FBakIsVUFBa0IsS0FBYSxFQUFFLFVBQWtCO1FBQWxCLCtDQUFrQjtRQUNqRCxpQkFBTSxVQUFVLFlBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksVUFBVSxHQUFHLElBQUksNERBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFO1lBQzVCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ2pFO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUNTLDBDQUFrQixHQUE1QixVQUE2QixJQUFTLEVBQUUsVUFBbUI7UUFDekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxzQkFBVywyQ0FBZ0I7YUFBM0I7WUFDRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQzs7O09BQUE7SUFLRCxzQkFBVyxrQ0FBTztRQUpsQjs7O1dBR0c7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMzQixDQUFDOzs7T0FBQTtJQVFELHNCQUFXLHNDQUFXO1FBUHRCLGtEQUFrRDtRQUNsRCxrQ0FBa0M7UUFDbEMsSUFBSTtRQUNKOzs7V0FHRzthQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0IsQ0FBQzthQUNELFVBQXVCLFFBQXFCO1lBQzFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7UUFDbkMsQ0FBQzs7O09BSEE7SUFRRCxzQkFBVyxnQ0FBSztRQUpoQjs7O1dBR0c7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN6QixDQUFDOzs7T0FBQTtJQVlELHNCQUFXLHdEQUE2QjtRQUh4Qzs7V0FFRzthQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1FBQ3pDLENBQUM7YUFDRCxVQUF5QyxLQUFhO1lBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQzFDLENBQUM7OztPQUhBO0lBT0Qsc0JBQVcsZ0NBQUs7UUFIaEI7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN6QixDQUFDOzs7T0FBQTtJQUNTLGdDQUFRLEdBQWxCLFVBQW1CLEtBQWE7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUNEOzs7T0FHRztJQUNJLDhCQUFNLEdBQWIsVUFBYyxHQUFXO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDekIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ1o7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQVFTLGtDQUFVLEdBQXBCO1FBQ0UsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUM7WUFDaEMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRVMsOEJBQU0sR0FBaEI7UUFBQSxpQkFnQkM7UUFmQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBQyxFQUFVLEVBQUUsU0FBa0I7Z0JBQzlELElBQUksS0FBSSxDQUFDLE1BQU0sS0FBSyxFQUFFO29CQUFFLE9BQU87Z0JBQy9CLElBQUksU0FBUyxFQUFFO29CQUNiLEtBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3hCO3FCQUFNO29CQUNMLElBQUksS0FBSSxDQUFDLHFCQUFxQixFQUFFO3dCQUM5QixLQUFJLENBQUMsTUFBTSxDQUFDLEtBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztxQkFDaEQ7b0JBQ0QsS0FBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDM0I7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUNNLG1DQUFXLEdBQWxCLFVBQW1CLE9BQW1CO1FBQW5CLHdDQUFtQjtRQUNwQyxpQkFBTSxXQUFXLFlBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7UUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQWFPLCtDQUF1QixHQUEvQixVQUFnQyxVQUEyQjtRQUEzQiwrQ0FBMkI7UUFDekQsa0NBQWtDO1FBQ2xDLGtDQUFrQztRQUNsQyxJQUFJO1FBQ0osK0VBQStFO1FBQy9FLG9GQUFvRjtJQUN0RixDQUFDO0lBS0Qsc0JBQVcseUNBQWM7UUFKekI7OztXQUdHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUNsQyxDQUFDO2FBQ0QsVUFBMEIsS0FBVTtZQUNsQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELENBQUM7OztPQUpBO0lBUUQsc0JBQVcsc0NBQVc7UUFIdEI7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlCLENBQUM7YUFDRCxVQUF1QixLQUFjO1lBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVywyQ0FBZ0I7UUFIM0I7O1dBRUc7YUFDSDtZQUNFLE9BQU8sQ0FDTCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxLQUFLO2dCQUNuQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxNQUFNLENBQ3JDLENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBNEIsS0FBd0I7WUFDbEQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxLQUFLLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxLQUFLLEtBQUssT0FBTyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7b0JBQ3ZDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUM1QztnQkFDRCxJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUMzQztnQkFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDakUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztpQkFDcEQ7YUFDRjtRQUNILENBQUM7OztPQWpCQTtJQXFCRCxzQkFBVywwQ0FBZTtRQUgxQjs7V0FFRzthQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNsQyxDQUFDO2FBQ0QsVUFBMkIsS0FBSztZQUM5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyw0REFBaUM7UUFINUM7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLG1DQUFtQyxFQUFFLENBQUM7UUFDcEQsQ0FBQzthQUNELFVBQTZDLEtBQUs7WUFDaEQsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELENBQUM7OztPQUhBO0lBT0Qsc0JBQVcsMkNBQWdCO1FBSDNCOztXQUVHO2FBQ0g7WUFDRSxPQUFPLENBQ0wsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssS0FBSztnQkFDbkMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssTUFBTSxDQUNyQyxDQUFDO1FBQ0osQ0FBQzthQUNELFVBQTRCLEtBQXdCO1lBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDOzs7T0FIQTtJQU9ELHNCQUFXLDBEQUErQjtRQUgxQzs7V0FFRzthQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztRQUNsRCxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLHNDQUFXO1FBSHRCOztXQUVHO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLE1BQU0sQ0FBQztRQUMzRSxDQUFDO2FBQ0QsVUFBdUIsS0FBd0I7WUFDN0MsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksS0FBSyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO29CQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDckM7Z0JBQ0QsSUFBSSxLQUFLLEtBQUssT0FBTyxFQUFFO29CQUNyQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDdEM7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMzQjtRQUNILENBQUM7OztPQWJBO0lBa0JELHNCQUFXLCtDQUFvQjtRQUovQjs7O1dBR0c7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDdkMsQ0FBQzthQUNELFVBQWdDLEtBQWM7WUFDNUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLElBQ0UsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssT0FBTztnQkFDckMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssSUFBSSxFQUNsQztnQkFDQSxJQUNFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFDbkMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUM3QztvQkFDQSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDcEM7YUFDRjtZQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssTUFBTSxFQUFFO2dCQUN4QyxJQUNFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFDbEMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUM1QztvQkFDQSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbkM7YUFDRjtRQUNILENBQUM7OztPQXRCQTtJQXdCRCxzQkFBSSwrQ0FBb0I7YUFBeEI7WUFDRSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3RDLENBQUM7YUFDRCxVQUF5QixLQUFLO1lBQzVCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxDQUFDOzs7T0FIQTtJQUtELHNCQUFJLDBDQUFlO2FBQW5CO1lBQ0UsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO2FBQ0QsVUFBb0IsS0FBSztZQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQzs7O09BSEE7SUFLRCxzQkFBVywrQ0FBb0I7YUFBL0I7WUFDRSxPQUFPLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzFDLENBQUM7OztPQUFBO0lBTUQsc0JBQVcsNENBQWlCO1FBSjVCOzs7V0FHRzthQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDckMsQ0FBQzthQUNELFVBQTZCLEtBQWlDO1lBQzVELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFDdEMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyx1Q0FBWTtRQUh2Qjs7V0FFRzthQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDaEMsQ0FBQzs7O09BQUE7SUFJRCxzQkFBVyxtREFBd0I7UUFIbkM7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLDZCQUE2QixDQUFDO1FBQzVDLENBQUM7OztPQUFBO0lBRUQsc0JBQVcsd0NBQWE7YUFBeEI7WUFDRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMvQixDQUFDOzs7T0FBQTtJQUlELHNCQUFXLHlDQUFjO2FBQXpCO1lBQ0UsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDaEMsQ0FBQzs7O09BQUE7SUFLRCxzQkFBVyx1Q0FBWTthQUF2QjtZQUNFLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlCLENBQUM7OztPQUFBO0lBQ00sNkNBQXFCLEdBQTVCLFVBQTZCLE1BQVcsRUFBRSxZQUFvQjtRQUM1RCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUM5QixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBSSwrRUFBYyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLEtBQUssTUFBTTtZQUNoRSxPQUFPLEtBQUssQ0FBQztRQUNmLElBQUksUUFBUSxHQUFHLDJEQUFpQixDQUFDLFlBQVksQ0FDM0MsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUNoQixZQUFZLENBQ2IsQ0FBQztRQUNGLE9BQU8sMERBQVksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDUywwREFBa0MsR0FBNUMsVUFDRSxNQUFXLEVBQ1gsU0FBb0MsRUFDcEMsU0FBb0M7UUFFcEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksT0FBTyxHQUFHO1lBQ1osR0FBRyxFQUFFLE1BQU07WUFDWCxTQUFTLEVBQUUsU0FBUztZQUNwQixTQUFTLEVBQUUsU0FBUztZQUNwQixNQUFNLEVBQUUsQ0FBQztTQUNWLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDeEIsQ0FBQztJQXVCTSxtQ0FBVyxHQUFsQixVQUFtQixJQUFpQjtRQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ08seUNBQWlCLEdBQXpCLFVBQTBCLFFBQXlCLEVBQUUsV0FBZ0I7UUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO1lBQ2pDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNDLElBQUksT0FBTyxHQUFHLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7WUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDdEQ7SUFDSCxDQUFDO0lBQ08sMENBQWtCLEdBQTFCLFVBQTJCLE9BQW9CO1FBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDTyxzQ0FBYyxHQUF0QixVQUF1QixLQUFtQixFQUFFLFdBQWdCO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRTtZQUNqQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsSUFBSSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7UUFDRCxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFDTyxxQ0FBYSxHQUFyQixVQUFzQixJQUFpQjtRQUNyQyxJQUFJLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUNNLHNEQUE4QixHQUFyQyxVQUFzQyxHQUFnQjtRQUNwRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQztJQUNPLHlDQUFpQixHQUF6QixVQUNFLEdBQVEsRUFDUixRQUFtQyxFQUNuQyxRQUFhO1FBRWIsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksTUFBTSxFQUFFO1lBQzNCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNuQyxHQUFHLEVBQUUsR0FBRztnQkFDUixPQUFPLEVBQUUsUUFBUTtnQkFDakIsT0FBTyxFQUFFLEtBQUs7YUFDZixDQUFDLENBQUM7U0FDSjtRQUNELElBQ0UsUUFBUSxDQUFDLElBQUksSUFBSSxNQUFNO1lBQ3ZCLFFBQVEsQ0FBQyxJQUFJLElBQUksT0FBTztZQUN4QixDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPO1lBQzNDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFDcEM7WUFDQSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNyQztRQUNELElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsc0NBQXNDO1NBQy9EO2FBQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFTyx1REFBK0IsR0FBdkMsVUFDRSxHQUFRLEVBQ1IsUUFBbUMsRUFDbkMsUUFBYTtRQUViLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQzVELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDM0M7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ1MsNkNBQXFCLEdBQS9CO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPO1FBQ25DLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBQ08sK0NBQXVCLEdBQS9CLFVBQWdDLE1BQVc7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPO1FBQ25DLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO0lBQzdELENBQUM7SUFDUyx5Q0FBaUIsR0FBM0IsVUFBNEIsT0FBZTtRQUN6QyxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksT0FBTztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzFELElBQ0UsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxPQUFPLENBQUM7WUFDcEUsT0FBTyxJQUFJLFVBQVUsRUFDckI7WUFDQSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9DLElBQUksVUFBVSxHQUFHLElBQUksNERBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFO1lBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDakQsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQ0UsQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCO1lBQ2hDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLFVBQVUsRUFDM0M7WUFDQSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksMkRBQWlCLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUNuRTtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQVdELHNCQUFXLDBDQUFlO1FBVjFCOzs7Ozs7Ozs7V0FTRzthQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0IsQ0FBQzs7O09BQUE7SUFFRDs7T0FFRztJQUNJLG9DQUFZLEdBQW5CO1FBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRDs7T0FFRztJQUNJLHNDQUFjLEdBQXJCO1FBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRDs7T0FFRztJQUNJLHNDQUFjLEdBQXJCO1FBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRDs7T0FFRztJQUNJLHVDQUFlLEdBQXRCO1FBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRDs7T0FFRztJQUNJLDZDQUFxQixHQUE1QjtRQUNFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0Q7O09BRUc7SUFDSSx1Q0FBZSxHQUF0QjtRQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTztRQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFDTyx3Q0FBZ0IsR0FBeEIsVUFBeUIsR0FBZ0I7UUFDdkMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBd0IsR0FBSSxDQUFDLENBQUM7UUFDckUsSUFBSSxJQUFJO1lBQUUsT0FBb0IsSUFBSSxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBSUQsc0JBQVcsMENBQWU7UUFIMUI7O1dBRUc7YUFDSDtZQUNFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMxRSxDQUFDO2FBQ0QsVUFBMkIsR0FBUTtZQUNqQyxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssR0FBRyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0QztRQUNILENBQUM7OztPQUxBO0lBT00scUNBQWEsR0FBcEIsVUFBcUIsT0FBWTtRQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksK0NBQXVCLEdBQTlCO1FBQ0UsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU8sT0FBTyxDQUFDO1FBQzFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRTtZQUN4QyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDM0Q7UUFDRCxJQUFJLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuRCxPQUFPLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNPLDZDQUFxQixHQUE3QixVQUE4QixHQUFnQjtRQUM1QyxJQUFJLE9BQU8sR0FBRyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTtZQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztZQUNsRCxPQUFPO1NBQ1I7UUFDRCxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksT0FBTyxHQUFHLDBEQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksT0FBTyxJQUFJLHFEQUFPLENBQUMsSUFBSSxFQUFFO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFnQixHQUFHLENBQUM7WUFDM0MsZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxJQUFJLE9BQU8sSUFBSSxxREFBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLElBQUkscURBQU8sQ0FBQyxLQUFLLEVBQUU7WUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDO1lBQ2xDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JELElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixJQUNFLElBQUksQ0FBQyxlQUFlO2dCQUNwQixFQUFFO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVztnQkFDdkIsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsRUFDdkI7Z0JBQ0EsSUFBSSxFQUFFLEdBQWdCLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDbkUsMERBQVksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN6QztTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsb0NBQW9DLEdBQUcsSUFBSSxDQUFDO1lBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUNuQyxJQUFJLENBQUMsb0NBQW9DLEdBQUcsS0FBSyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDTyxvQ0FBWSxHQUFwQjtRQUFBLGlCQThCQztRQTdCQyxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSTtZQUFFLE9BQU87UUFDekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLGtEQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ25DLHNEQUFnQixDQUNkLElBQUksRUFDSixJQUFJLENBQUMsZUFBZSxFQUNwQixVQUFDLE9BQVksSUFBSyxRQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsS0FBSSxDQUFDLEVBQXpCLENBQXlCLENBQzVDLENBQUM7UUFDRiw4Q0FBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BCLElBQUksUUFBUSxHQUFnQixDQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUN2RSxDQUFDO1FBQ0YsSUFBSSxRQUFRLEVBQUU7WUFDWixRQUFRLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztnQkFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUTtvQkFBRSxPQUFPO2dCQUMxQixJQUFJLENBQUMsQ0FBQztvQkFBRSxPQUFPO2dCQUNmLDhDQUE4QztnQkFDOUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRTtvQkFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUN0QztZQUNILENBQUMsQ0FBQztTQUNIO1FBRUQsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN2RSxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDUywwQ0FBa0IsR0FBNUI7UUFDRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzNDLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztTQUNwQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUNPLDRDQUFvQixHQUE1QjtRQUNFLElBQUksSUFBSSxHQUFHLElBQUksbURBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN2RSxJQUNFLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQ3hCO1lBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDdEIsc0VBQWtCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLHdDQUFnQixHQUF2QixVQUF3QixDQUFDLEVBQUUsT0FBTztRQUNoQyxJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksT0FBTyxFQUFFLE1BQU0sQ0FBQztRQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsR0FBRztZQUM5QyxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxNQUFNO2dCQUFFLE9BQU87WUFDcEIsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxPQUFPO2dCQUFFLE9BQU87WUFDOUMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxPQUFPO2dCQUFFLE9BQU87WUFFOUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSwrQkFBTyxHQUFkLFVBQWUsT0FBTztRQUNwQixJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVTtZQUN0RSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU8sNERBQW9DLEdBQTVDLFVBQ0UsSUFBWSxFQUNaLFFBQWEsRUFDYixRQUFhLEVBQ2IsTUFBbUIsRUFDbkIsWUFBaUM7UUFFakMsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLE1BQU07WUFBRSxPQUFPO1FBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQ3pDLElBQUksRUFDSixRQUFRLEVBQ1IsUUFBUSxFQUNSLE1BQU0sRUFDTixZQUFZLENBQ2IsQ0FBQztRQUNGLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUNPLDZEQUFxQyxHQUE3QyxVQUNFLEdBQWdCLEVBQ2hCLFlBQW9CLEVBQ3BCLFFBQWE7UUFFYixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPO1FBQ3JDLElBQUksWUFBWSxLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNoRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxZQUFZLEtBQUssV0FBVyxFQUFFO1lBQ2hDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xELElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDekM7SUFDSCxDQUFDO0lBQ08scUNBQWEsR0FBckIsVUFBc0IsR0FBZ0I7UUFDcEMsSUFBSSxTQUFTLEdBQUcsMkRBQWlCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRTNELE9BQU8sQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRTtZQUM1QyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssVUFBVTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUMvQyxTQUFTLEdBQUcsMkRBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMvRDtRQUNELE9BQU8sQ0FBQyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztJQUN0RCxDQUFDO0lBRU8sa0NBQVUsR0FBbEIsVUFBbUIsSUFBUztRQUE1QixpQkErVkM7UUE5VkMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksU0FBUyxHQUFzQixDQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsbUVBQWlCLENBQUMsQ0FDckQsQ0FBQztRQUNGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxnRUFBZSxFQUFFLENBQUM7UUFDN0MsU0FBUyxDQUFDLFNBQVMsR0FBRyxjQUFNLFdBQUksRUFBSixDQUFJLENBQUM7UUFDakMsaURBQVcsQ0FBQztZQUNWLElBQUksV0FBVyxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUM7WUFDdkMsSUFBSSxTQUFTLEdBQUcsV0FBVyxLQUFLLE9BQU8sQ0FBQztZQUN4QyxJQUFJLFNBQVMsRUFBRTtnQkFDYixTQUFTO29CQUNQLFdBQVcsS0FBSyxRQUFRO3dCQUN4QixDQUFDLFdBQVcsS0FBSyxXQUFXOzRCQUMxQixTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQzt3QkFDekMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7YUFDekM7WUFDRCxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsaURBQVcsQ0FBQztZQUNWLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO1FBQ3JELFNBQVMsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDdkMsU0FBUyxDQUFDLDhCQUE4QixHQUFHLFVBQ3pDLElBQVksRUFDWixRQUFhLEVBQ2IsUUFBYSxFQUNiLE1BQW1CLEVBQ25CLFlBQWlDO1lBRWpDLEtBQUksQ0FBQyxvQ0FBb0MsQ0FDdkMsSUFBSSxFQUNKLFFBQVEsRUFDUixRQUFRLEVBQ1IsTUFBTSxFQUNOLFlBQVksQ0FDYixDQUFDO1FBQ0osQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsR0FBRztZQUN6QyxLQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUF1QixHQUFHLFVBQzdDLE9BQXdCO1lBRXhCLEtBQUksQ0FBQyxXQUFXLENBQUM7Z0JBQ2YsSUFBSSxFQUFFLGtCQUFrQjtnQkFDeEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxZQUFZO2dCQUMxQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3RCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtnQkFDMUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO2FBQzNCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSw4REFBYyxDQUN0QixTQUFTLEVBQ3pCLFVBQVUsT0FBTztZQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsQ0FBQyxFQUNELElBQUksQ0FBQyxlQUFlLEVBQ3BCLElBQUksQ0FBQyxlQUFlLENBQ3JCLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzdDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQ3JCLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztTQUN0RDtRQUNELG1FQUF5QixDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUQsU0FBUyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQy9DLFNBQVMsQ0FBQyw4QkFBOEIsR0FBRyxVQUFVLE9BQU87WUFDMUQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDO1FBQ0YsSUFBSSx5QkFBeUIsR0FBRyxrRkFBd0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUUsSUFBSSw2QkFBNkIsR0FBRyxzRkFBNEIsQ0FDOUQsSUFBSSxFQUNKLFNBQVMsQ0FDVixDQUFDO1FBQ0YsSUFBSSx3QkFBd0IsR0FBRyx3RkFBOEIsQ0FDM0QsSUFBSSxFQUNKLFNBQVMsQ0FDVixDQUFDO1FBQ0YsU0FBUyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFDLE1BQU0sRUFBRSxPQUFPO1lBQzlDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxVQUFDLE1BQU0sRUFBRSxPQUFPO1lBQ2xELHlCQUF5QixDQUN2QixPQUFPLENBQUMsV0FBVyxFQUNuQixPQUFPLENBQUMsUUFBUSxFQUNoQixLQUFLLEVBQ0wsSUFBSSxDQUNMLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNLEVBQUUsT0FBTztZQUMvQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssV0FBVyxFQUFFO2dCQUMzQyx5QkFBeUIsQ0FDdkIsT0FBTyxDQUFDLFdBQVcsRUFDbkIsT0FBTyxDQUFDLEtBQUssRUFDYixJQUFJLEVBQ0osT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FDN0IsQ0FBQztnQkFDRixJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO29CQUNYLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7d0JBQ3JCLEtBQUssQ0FBQyxTQUFTLElBQUksZ0JBQWdCLENBQUM7cUJBQ3JDO3lCQUFNO3dCQUNMLEtBQUssQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO3FCQUNuQztpQkFDRjthQUNGO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLG9CQUFvQixDQUMvQyxTQUFTLEVBQ1QsT0FBTyxDQUFDLFdBQVcsRUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FDZCxDQUFDO2dCQUNGLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDckMsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7aUJBQ25EO2dCQUNELHlCQUF5QixDQUN2QixPQUFPLENBQUMsV0FBVyxFQUNuQixPQUFPLENBQUMsS0FBSyxFQUNiLElBQUksRUFDSixPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUM3QixDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNLEVBQUUsT0FBTztZQUNoRCx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBVSxNQUFNLEVBQUUsT0FBTztZQUNyRCxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFDLE1BQU0sRUFBRSxPQUFPO1lBQzNDLElBQUksS0FBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsT0FBTzthQUNSO1lBRUQsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdkMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUVyQixJQUFJLEtBQUksQ0FBQyx5QkFBeUIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUMxRCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztvQkFDakIsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLElBQUksRUFBRSxLQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztvQkFDdEMsUUFBUSxFQUFFLElBQUk7b0JBQ2QsT0FBTyxFQUFFLFVBQUMsUUFBUSxJQUFLLFlBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsRUFBakMsQ0FBaUM7aUJBQ3pELENBQUMsQ0FBQzthQUNKO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNwQixJQUFJLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTztvQkFDeEMsQ0FBQyxDQUFDLG9CQUFvQjtvQkFDdEIsQ0FBQyxDQUFDLHVCQUF1QixDQUFDO2dCQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztvQkFDakIsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUM7b0JBQ3pDLE9BQU8sRUFBRSxVQUFVLE1BQU07d0JBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzVCLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxJQUNFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ3ZCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEtBQUssV0FBVztnQkFDaEQsdUVBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFDdkM7Z0JBQ0EsSUFBSSxXQUFXLEdBQUcsbURBQWEsQ0FDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEtBQUssUUFBUSxDQUN2QyxDQUFDO2dCQUNGLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUNqQixJQUFJLEVBQUUsV0FBVztvQkFDakIsSUFBSSxFQUFFLEtBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDO29CQUN2QyxJQUFJLEVBQUUsaURBQVcsQ0FBQzt3QkFDaEIsSUFBSSxXQUFXLEVBQUUsRUFBRTs0QkFDakIsT0FBTyxzQkFBc0IsQ0FBQzt5QkFDL0I7d0JBQ0QsT0FBTyxzQkFBc0IsQ0FBQztvQkFDaEMsQ0FBQyxDQUFDO29CQUNGLE9BQU8sRUFBRSxVQUFDLFFBQXlCO3dCQUNqQyxJQUFJLFFBQVEsQ0FBQyxhQUFhLEtBQUssUUFBUSxFQUFFOzRCQUN2QyxRQUFRLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQzs0QkFDbEMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFFO2dDQUNwQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDOzZCQUMvQjt5QkFDRjs2QkFBTTs0QkFDTCxRQUFRLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQzs0QkFDbkMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFFO2dDQUNwQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDOzZCQUM5Qjt5QkFDRjt3QkFDRCxXQUFXLENBQUMsUUFBUSxDQUFDLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQztvQkFDbkQsQ0FBQztpQkFDRixDQUFDLENBQUM7YUFDSjtZQUVELElBQ0UsSUFBSSxDQUFDLG1CQUFtQjtnQkFDeEIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsS0FBSyxXQUFXO2dCQUM3Qyx1RUFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxFQUM1QztnQkFDQSxJQUFJLFVBQVUsR0FBRyxpREFBVyxDQUFDLGNBQU0sY0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQXRCLENBQXNCLENBQUMsQ0FBQztnQkFDM0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7b0JBQ2pCLElBQUksRUFBRSxZQUFZO29CQUNsQixJQUFJLEVBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUM7b0JBQ3hDLElBQUksRUFBRSxpREFBVyxDQUFDO3dCQUNoQixJQUFJLFVBQVUsRUFBRSxFQUFFOzRCQUNoQixPQUFPLHVCQUF1QixDQUFDO3lCQUNoQzt3QkFDRCxPQUFPLHdCQUF3QixDQUFDO29CQUNsQyxDQUFDLENBQUM7b0JBQ0YsT0FBTyxFQUFFLFVBQUMsUUFBeUI7d0JBQ2pDLElBQUksUUFBUSxHQUFHLDJEQUFpQixDQUFDLFlBQVksQ0FDM0MsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUNsQixZQUFZLENBQ2IsQ0FBQzt3QkFDRixJQUNFLENBQUMsUUFBUTs0QkFDVCxDQUFDLEtBQUksQ0FBQyw0QkFBNEIsQ0FDaEMsUUFBUSxFQUNSLFFBQVEsRUFDUixRQUFRLENBQUMsUUFBUSxFQUNqQixTQUFTLEVBQ1QsU0FBUyxDQUNWLEVBQ0Q7NEJBQ0EsUUFBUSxDQUFDLFVBQVUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7eUJBQzVDO29CQUNILENBQUM7aUJBQ0YsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO2FBQ3REO1lBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztvQkFDakIsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO29CQUN0QyxPQUFPLEVBQUUsVUFBVSxNQUFNO3dCQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2hDLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7b0JBQ2pCLElBQUksRUFBRSxjQUFjO29CQUNwQixJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztvQkFDOUMsT0FBTyxFQUFFLFVBQVUsTUFBTTt3QkFDdkIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN4QyxDQUFDO2lCQUNGLENBQUMsQ0FBQzthQUNKO1lBRUQsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN4QixJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDNUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO2lCQUN0RDtnQkFDRCxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN4QyxJQUFJLGNBQWMsR0FBRyxvRUFBaUIsQ0FBQyxtQkFBbUIsQ0FDeEQsV0FBVyxFQUNYLEtBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN2QixDQUFDO2dCQUNGLElBQUksZUFBZSxHQUFHLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLGlCQUFpQixHQUFHLFVBQUMsU0FBUztvQkFDaEMsT0FBTzt3QkFDTCxJQUFJLEVBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO3dCQUMxQyxLQUFLLEVBQUUsU0FBUztxQkFDakIsQ0FBQztnQkFDSixDQUFDLENBQUM7Z0JBQ0YsSUFBSSxjQUFjLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDOUMsSUFBSSxTQUFTLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7aUJBQ25EO2dCQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUNqQixJQUFJLEVBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO29CQUM1QyxLQUFLLEVBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDNUMsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLGVBQWUsRUFBRSxlQUFlO29CQUNoQyxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixjQUFjLEVBQUUsY0FBYztvQkFDOUIsYUFBYSxFQUFFLFVBQUMsSUFBSSxFQUFFLEtBQUs7d0JBQ3pCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO3dCQUNqQyxLQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDbEQsQ0FBQztpQkFDRixDQUFDLENBQUM7YUFDSjtZQUVELElBQUksQ0FBQyxLQUFJLENBQUMseUJBQXlCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDM0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7b0JBQ2pCLElBQUksRUFBRSxhQUFhO29CQUNuQixJQUFJLEVBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDM0MsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsUUFBUSxFQUFFLElBQUk7b0JBQ2QsT0FBTyxFQUFFLFVBQUMsUUFBUSxJQUFLLFlBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsRUFBakMsQ0FBaUM7aUJBQ3pELENBQUMsQ0FBQzthQUNKO1lBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztvQkFDakIsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLFNBQVMsRUFBRSxLQUFLO29CQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUM7b0JBQ3RDLE9BQU8sRUFBRSxVQUFVLE1BQU0sSUFBRyxDQUFDO2lCQUM5QixDQUFDLENBQUM7YUFDSjtZQUVELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMvRCxxQ0FBcUM7UUFDckMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxVQUFDLE1BQXFCLEVBQUUsT0FBTztZQUNwRSxJQUFJLElBQUksQ0FBQyxvQ0FBb0M7Z0JBQUUsT0FBTztZQUN0RCxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxVQUFDLE1BQXFCO1lBQ3BELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLFVBQUMsTUFBcUIsRUFBRSxPQUFPO1lBQ2hFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFxQixFQUFFLE9BQU87WUFDekQsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFVBQUMsTUFBcUIsRUFBRSxPQUFPO1lBQzNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFxQixFQUFFLE9BQU87WUFDN0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQUMsTUFBcUIsRUFBRSxPQUFPO1lBQ3hELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFDLE1BQXFCLEVBQUUsT0FBTztZQUMxRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFxQixFQUFFLE9BQU87WUFDdkQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUFFLE9BQU87WUFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQUNPLG1DQUFXLEdBQW5CLFVBQW9CLElBQVk7UUFDOUIsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN2QixJQUFJLFdBQVcsR0FBRyxxREFBcUQsQ0FBQztRQUN4RSxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDN0IsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ08sNkNBQXFCLEdBQTdCLFVBQThCLElBQVMsRUFBRSxDQUFDO1FBQ3hDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLEdBQXVCLFVBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVPLDBDQUFrQixHQUExQixVQUEyQixJQUFTO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0lBQ00sK0NBQXVCLEdBQTlCLFVBQStCLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDTSw2Q0FBcUIsR0FBNUIsVUFBNkIsSUFBSSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDUywyQ0FBbUIsR0FBN0IsVUFDRSxPQUF3QixFQUN4QixZQUEyQztRQUEzQyxrRUFBMkM7UUFFM0MsaUJBQU0sbUJBQW1CLFlBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDbkQsMERBQVksQ0FBQyxzQkFBc0IsQ0FDakMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN4RCxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRU8sc0NBQWMsR0FBdEI7UUFDRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUMvQyxJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUNPLHNDQUFjLEdBQXRCLFVBQXVCLElBQWE7UUFDbEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDL0MsSUFBSSxRQUFRLEVBQUU7WUFDWixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUNPLGdEQUF3QixHQUFoQztRQUNFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN0QixPQUFPLDBEQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLHFEQUFPLENBQUMsUUFBUTtZQUN4RCxDQUFDLENBQWtCLEdBQUc7WUFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFDTSwyQ0FBbUIsR0FBMUI7UUFDRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLHlDQUFpQixHQUF4QixVQUNFLE9BQW9CLEVBQ3BCLE9BQXFDO1FBRXJDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNPLHdDQUFnQixHQUF4QixVQUF5QixPQUFlLEVBQUUsT0FBZTtRQUN2RCxJQUFJLE9BQU8sS0FBSyxPQUFPO1lBQUUsT0FBTztRQUNoQyxJQUFJLHdEQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxzQkFBVyxvREFBeUI7YUFBcEM7WUFDRSxPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ3pFLENBQUM7OztPQUFBO0lBZUQ7Ozs7O09BS0c7SUFDSSw4Q0FBc0IsR0FBN0IsVUFDRSxPQUFvQixFQUNwQixPQUE0QztRQUE1Qyx3Q0FBNEM7UUFFNUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlO1lBQ2pDLENBQUMsQ0FBYyxDQUNYLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQ2xFO1lBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULElBQUksVUFBVSxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQzVCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsVUFBVSxRQUFRO1lBQ2hCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2QyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ25CLElBQUksT0FBTyxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNuQyxHQUFHLEVBQUUsUUFBUTtvQkFDYixPQUFPLEVBQUUsT0FBTztvQkFDaEIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUM7aUJBQzFCLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxZQUFZLEtBQUssUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUMxQyxJQUFJLENBQUMscUNBQXFDLENBQ3hDLFFBQVEsRUFDUixXQUFXLEVBQ1gsWUFBWSxDQUNiLENBQUM7YUFDSDtRQUNILENBQUMsRUFDRCxJQUFJLEVBQ0o7WUFDRSxJQUFJLE9BQU87Z0JBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNwQyxVQUFVLEVBQUUsVUFBVTtnQkFDdEIsT0FBTyxFQUFFLE9BQU87YUFDakIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUNELElBQUksQ0FBQywyQkFBMkIsQ0FDakMsQ0FBQztJQUNKLENBQUM7SUFDTSwrQ0FBdUIsR0FBOUIsVUFBK0IsUUFBeUI7UUFDdEQsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNsRSxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsc0NBQXNDO1FBQzlELElBQUksQ0FBQyxXQUFXLENBQUM7WUFDZixJQUFJLEVBQUUsNEJBQTRCO1lBQ2xDLFFBQVEsRUFBRSxRQUFRO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFrQkQ7Ozs7T0FJRztJQUNJLGdEQUF3QixHQUEvQixVQUFnQyxRQUF5QjtRQUN2RCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDL0MsT0FBTyxFQUFFLFFBQVE7WUFDakIsV0FBVyxFQUFFLE9BQU87U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQWlCUyx3Q0FBZ0IsR0FBMUIsVUFBMkIsR0FBUTtRQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxpQkFBTSxnQkFBZ0IsWUFBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBR0Qsc0JBQUksbURBQXdCO1FBRDVCLHVDQUF1QzthQUN2QztZQUNFLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ25DLENBQUM7YUFDRCxVQUE2QixLQUFjO1lBQ3pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDcEMsQ0FBQzs7O09BSEE7SUFpQkQsa0RBQTBCLEdBQTFCLFVBQ0UsR0FBZ0IsRUFDaEIsTUFBZ0MsRUFDaEMsUUFBaUI7UUFFakIsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQ3RDLEdBQUcsRUFDSCxNQUFNLENBQUMsUUFBUSxFQUNmLFFBQVEsRUFDUixNQUFNLENBQUMsU0FBUyxFQUNoQixNQUFNLENBQUMsY0FBYyxDQUN0QixDQUFDO0lBQ0osQ0FBQztJQUNELHFEQUE2QixHQUE3QixVQUE4QixTQUEyQixJQUFTLENBQUM7SUFDbkUsdURBQStCLEdBQS9CLFVBQ0UsWUFBb0IsRUFDcEIsR0FBZ0IsRUFDaEIsTUFBZ0MsRUFDaEMsS0FBb0I7UUFFcEIsSUFBSSxPQUFPLEdBQUc7WUFDWixZQUFZLEVBQUUsWUFBWTtZQUMxQixHQUFHLEVBQUUsR0FBRztZQUNSLE1BQU0sRUFBRSxNQUFNO1lBQ2QsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO1FBQ0YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUNELHlEQUFpQyxHQUFqQyxVQUNFLFlBQW9CLEVBQ3BCLEdBQWdCLEVBQ2hCLE1BQWdDO1FBRWhDLElBQUksT0FBTyxHQUFHLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN2RSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0Qsb0VBQTRDLEdBQTVDLFVBQ0UsWUFBb0IsRUFDcEIsR0FBZ0I7UUFFaEIsSUFBSSxPQUFPLEdBQUc7WUFDWixHQUFHLEVBQUUsR0FBRztZQUNSLFlBQVksRUFBRSxZQUFZO1lBQzFCLE9BQU8sRUFBRSxFQUFFO1lBQ1gsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDO1FBQ0YsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQy9ELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELDZEQUFxQyxHQUFyQyxVQUNFLGlCQUF5QixFQUN6QixZQUFvQixFQUNwQixHQUFnQixFQUNoQixNQUFnQyxFQUNoQyxNQUFxQjtRQUVyQixJQUFJLE9BQU8sR0FBRztZQUNaLGlCQUFpQixFQUFFLGlCQUFpQjtZQUNwQyxZQUFZLEVBQUUsWUFBWTtZQUMxQixHQUFHLEVBQUUsR0FBRztZQUNSLE1BQU0sRUFBRSxNQUFNO1lBQ2QsTUFBTSxFQUFFLE1BQU07U0FDZixDQUFDO1FBQ0YsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNELGdEQUF3QixHQUF4QjtRQUNFLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsK0NBQXVCLEdBQXZCO1FBQ0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsaURBQXlCLEdBQXpCLFVBQ0UsUUFBeUIsRUFDekIsT0FBZSxFQUNmLE9BQW9CLEVBQ3BCLE9BQWE7UUFKZixpQkFtQkM7UUFiQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRTtZQUNuQyxVQUFVLENBQUM7Z0JBQ1QsOENBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxPQUFPLEdBQUc7b0JBQ1osTUFBTSxFQUFFLEtBQUksQ0FBQyxNQUFNO29CQUNuQixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLE9BQU8sRUFBRSxPQUFPO29CQUNoQixPQUFPLEVBQUUsT0FBTztpQkFDakIsQ0FBQztnQkFDRixLQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDUDtJQUNILENBQUM7SUFDRDs7OztPQUlHO0lBQ0ksa0NBQVUsR0FBakIsVUFDRSxLQUFZLEVBQ1osYUFBaUQ7UUFFakQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRTtZQUM1QixhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2hDO2FBQU07WUFDTCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQzFCLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDbEIsUUFBUSxFQUFFLGFBQWE7YUFDeEIsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLG1DQUFXLEdBQWxCLFVBQ0UsS0FBYSxFQUNiLGlCQUFxRDtRQUVyRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFO1lBQzdCLElBQUksWUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbEMsWUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFDLENBQUM7Z0JBQ3BCLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxZQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEQsQ0FBQyxDQUFDO1lBQ0YsWUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQzthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUMzQixLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2xCLFFBQVEsRUFBRSxpQkFBaUI7YUFDNUIsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLG1DQUFXLEdBQWxCLFVBQ0UsS0FBdUIsRUFDdkIsYUFBc0M7UUFFdEMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUFFLE9BQU87WUFDbEMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDakIsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFDLEtBQUs7Z0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO29CQUFFLE9BQU87Z0JBQ2xDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQUUsT0FBTztnQkFDN0QsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNmLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDM0MsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzVCO2dCQUNELGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUM7WUFDRixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZjthQUFNO1lBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2hDLEtBQUssRUFBRSxLQUFLO2dCQUNaLFFBQVEsRUFBRSxhQUFhO2FBQ3hCLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVPLHdDQUFnQixHQUF4QjtRQUNFLElBQUksS0FBSyxDQUFDO1FBRVYsSUFBSSxJQUFJLENBQUMsK0JBQStCLEVBQUU7WUFDeEMsS0FBSyxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN2RTthQUFNLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ3RDLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDWjthQUFNO1lBQ0wsS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN2RDtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksK0NBQXVCLEdBQTlCO1FBQ0UsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLFVBQUMsR0FBZ0M7WUFDL0QsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksNkNBQXFCLEdBQTVCO1FBQ0UsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLFVBQUMsR0FBZ0M7WUFDL0QsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0kseUNBQWlCLEdBQXhCLFVBQXlCLElBQVk7UUFDbkMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLFVBQUMsR0FBZ0M7WUFDL0QsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUk7Z0JBQUUsT0FBTztZQUM5QixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSwyQ0FBbUIsR0FBMUIsVUFBMkIsSUFBWTtRQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFnQztZQUMvRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSTtnQkFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBcDJFYSxrQ0FBb0IsR0FBVyxnQ0FBZ0MsQ0FBQztJQXEyRWhGLG9CQUFDO0NBQUEsQ0F4MkVTLDBEQUFXLEdBdzJFcEI7QUF6MkV5QjtBQTIyRTFCO0lBQWtDLDhFQUFhO0lBQzdDLHNCQUFZLGVBQTJCLEVBQUUsT0FBbUI7UUFBaEQsd0RBQTJCO1FBQUUsd0NBQW1CO2VBQzFELGtCQUFNLGVBQWUsRUFBRSxPQUFPLENBQUM7SUFDakMsQ0FBQztJQUNILG1CQUFDO0FBQUQsQ0FBQyxDQUppQyxhQUFhLEdBSTlDOztBQUVELFNBQVMsb0JBQW9CLENBQzNCLE1BQXlCLEVBQ3pCLElBQWlCLEVBQ2pCLGNBQW1CLEVBQ25CLEtBQVU7SUFFVixJQUFJLElBQUksR0FBbUIsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUMsU0FBUyxHQUFHLHNDQUFzQyxDQUFDO0lBQ3hELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzNCLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQztJQUNGLElBQUksS0FBSyxHQUFvQixRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVELEtBQUssQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDckUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ2g3RUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBbUQ7QUFDVDtBQUVuQyxJQUFJLGtCQUFrQixHQUFHO0lBQzlCLGlCQUFpQixFQUFFLElBQUk7SUFDdkIsYUFBYSxFQUFFLEVBQUU7SUFDakIsT0FBTyxFQUFFLEVBQUU7SUFDWCxTQUFTLEVBQUUsVUFBUyxPQUFlLEVBQUUsTUFBcUI7UUFBckIsc0NBQXFCO1FBQ3hELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFO2dCQUN0QixJQUFJLEdBQUcsS0FBSyxhQUFhO29CQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3RDO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRCxTQUFTLEVBQUUsVUFBUyxPQUFlLEVBQUUsTUFBcUI7UUFBckIsc0NBQXFCO1FBQ3hELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7U0FDdEM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxhQUFhLEVBQUUsVUFBUyxHQUFXLEVBQUUsYUFBNEI7UUFBNUIsb0RBQTRCO1FBQy9ELElBQUksV0FBVyxHQUFHLGtFQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEIsYUFBYSxHQUFHLGtFQUF5QixDQUFDLGFBQWEsQ0FBQztTQUN6RDtRQUNELE9BQU8sQ0FBQyxDQUFDLEdBQUc7WUFDVixDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUNsQixDQUFDLENBQUMsa0JBQWtCO2lCQUNmLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUM3QixRQUFRLENBQUMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsZUFBZSxFQUFFLFVBQVMsT0FBZSxFQUFFLFdBQTBCO1FBQTFCLGdEQUEwQjtRQUNuRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNqRCxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQ1YsSUFBSSxJQUFJLElBQUksT0FBTztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUNqQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDcEQ7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRCxnQkFBZ0IsRUFBRSxVQUFTLE9BQWU7UUFDeEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCx1QkFBdUIsRUFBRSxVQUN2QixPQUFlLEVBQ2YsV0FBMEI7UUFBMUIsZ0RBQTBCO1FBRTFCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLElBQUksR0FBRyxLQUFLLE9BQU87WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxXQUFXLEVBQUUsVUFBUyxPQUFlLEVBQUUsV0FBMEI7UUFBMUIsZ0RBQTBCO1FBQy9ELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLElBQUksR0FBRyxLQUFLLE9BQU87WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUNoQyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNoRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLElBQUksR0FBRyxLQUFLLE9BQU87WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNELG1CQUFtQixFQUFFLFVBQVMsUUFBZ0IsRUFBRSxXQUEwQjtRQUExQixnREFBMEI7UUFDeEUsSUFBSSxDQUFDLENBQUMsV0FBVztZQUFFLE9BQU8sV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDMUQsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDN0MsR0FBRyxJQUFJLEdBQUcsQ0FBQzthQUNaO1lBQ0QsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNsQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELGdCQUFnQixFQUFFLFVBQVMsS0FBVSxFQUFFLE1BQXFCO1FBQXJCLHNDQUFxQjtRQUMxRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxnQkFBZ0IsRUFBRSxVQUFTLElBQVksRUFBRSxNQUFxQjtRQUFyQixzQ0FBcUI7UUFDNUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsY0FBYyxFQUFFLFVBQVMsSUFBWSxFQUFFLE1BQXFCO1FBQXJCLHNDQUFxQjtRQUMxRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxTQUFTLEVBQVQsVUFBVSxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDekMsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDekQsSUFBSSxDQUFDLEdBQUc7WUFBRSxHQUFHLEdBQUcsY0FBYyxDQUFDO1FBQy9CLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELGdCQUFnQixFQUFoQixVQUFpQixLQUFVLEVBQUUsTUFBYyxFQUFFLE1BQXFCO1FBQXJCLHNDQUFxQjtRQUNoRSxJQUFJLEtBQUssS0FBSyxFQUFFLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3JFLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2xELElBQUksQ0FBQyxHQUFHO1lBQUUsR0FBRyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUNELFVBQVUsRUFBRTtRQUNWLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDYixLQUFLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDNUIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNmO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YsQ0FBQztBQUVLLFNBQVMsWUFBWSxDQUFDLE9BQWUsRUFBRSxNQUFxQjtJQUFyQixzQ0FBcUI7SUFDakUsT0FBTyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFTSxJQUFJLGNBQWMsR0FBRywrREFBUyxDQUFDOzs7Ozs7Ozs7Ozs7O0FDM0h0QztBQUFBO0FBQUE7QUFBTyxJQUFJLFFBQVEsR0FDakIsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUNoQixVQUFTLE1BQU07UUFDYixLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuRCxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDYixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEU7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7QUFFRyxTQUFTLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUztJQUM1QyxLQUFLLElBQUksQ0FBQyxJQUFJLFNBQVM7UUFDckIsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsU0FBUyxFQUFFO1FBQ1QsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7SUFDL0IsQ0FBQztJQUNELFNBQVMsQ0FBQyxTQUFTO1FBQ2pCLFNBQVMsS0FBSyxJQUFJO1lBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6RCxDQUFDOzs7Ozs7Ozs7Ozs7O0FDckJEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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LENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE9BQU8sS0FBSyxDQUFDO1lBQ2YsS0FBSyxHQUFHO2dCQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsT0FBTyxJQUFJLENBQUM7WUFDZCxLQUFLLEdBQUc7Z0JBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLEtBQUssR0FBRztnQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztn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QUFDLCtDQUFVLEVBQUUsOEVBQVksQ0FBQyxvQ0FBRSxPQUFPO0FBQUE7QUFBQTtBQUFBLG9HQUFDO0FBQ2pEO0FBQ0EsR0FBRyxNQUFNLEVBWU47QUFDSCxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLE9BQU87O0FBRVA7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSyxJQUFJO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyw0QkFBNEI7QUFDMUM7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7Ozs7Ozs7Ozs7QUMzWEQsc0Q7Ozs7Ozs7Ozs7O0FDQUEsNkQiLCJmaWxlIjoic3VydmV5LWNyZWF0b3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJrbm9ja291dFwiKSwgcmVxdWlyZShcInN1cnZleS1rbm9ja291dFwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIlN1cnZleUNyZWF0b3JcIiwgW1wia25vY2tvdXRcIiwgXCJzdXJ2ZXkta25vY2tvdXRcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU3VydmV5Q3JlYXRvclwiXSA9IGZhY3RvcnkocmVxdWlyZShcImtub2Nrb3V0XCIpLCByZXF1aXJlKFwic3VydmV5LWtub2Nrb3V0XCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJTdXJ2ZXlDcmVhdG9yXCJdID0gZmFjdG9yeShyb290W1wia29cIl0sIHJvb3RbXCJTdXJ2ZXlcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9rbm9ja291dF9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX3N1cnZleV9rbm9ja291dF9fKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvZW50cmllcy9pbmRleC50c1wiKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2PlxcbiAgICA8IS0tIGtvIGZvcmVhY2g6IGFjdGlvbnMgLS0+XFxuICAgIDwhLS0ga28gaWY6ICEkZGF0YS50ZW1wbGF0ZSAtLT5cXG4gICAgPHNwYW4gY2xhc3M9XFxcInN2ZGFfcXVlc3Rpb25fYWN0aW9uIHN2ZC1tYWluLWNvbG9yXFxcIiBkYXRhLWJpbmQ9XFxcImtleTJjbGljaywgY2xpY2tOb0ZvY3VzOiBmdW5jdGlvbigpIHsgb25DbGljaygkcGFyZW50LnF1ZXN0aW9uKTsgfSwgYXR0cjogeyB0aXRsZTogdGV4dCwgdGFiaW5kZXg6ICRkYXRhLm5lZWRGb2N1cyA9PT0gdW5kZWZpbmVkIHx8ICEhJGRhdGEubmVlZEZvY3VzID8gMCA6IHVuZGVmaW5lZCB9XFxcIj5cXG4gICAgICAgIDxzcGFuPlxcbiAgICAgICAgICAgIDxzdmctaWNvbiBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCIgZGF0YS1iaW5kPVxcXCJjc3M6ICRwYXJlbnQuZ2V0U3R5bGUoJGRhdGEpXFxcIiBwYXJhbXM9XFxcImljb25OYW1lOiAkcGFyZW50LmdldFN0eWxlKCRkYXRhKVxcXCI+PC9zdmctaWNvbj5cXG4gICAgICAgIDwvc3Bhbj5cXG4gICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEuaGFzVGl0bGUgPyB0ZXh0OiAnJ1xcXCI+PC9zcGFuPlxcbiAgICA8L3NwYW4+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIGtvIGlmOiAhISRkYXRhLnRlbXBsYXRlIC0tPlxcbiAgICA8IS0tIGtvIHRlbXBsYXRlOiB0ZW1wbGF0ZSAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIC9rbyAtLT5cXG48L2Rpdj5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3ZkYS1jb250ZW50XFxcIj5cXG4gIDxzcGFuIGNsYXNzPVxcXCJzdmRhLWltYWdlLWVkaXRvclxcXCI+XFxuICAgIDxzcGFuXFxuICAgICAgY2xhc3M9XFxcImVkaXQtaW1hZ2UtaXRlbVxcXCJcXG4gICAgICByb2xlPVxcXCJidXR0b25cXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogY2hvb3NlSW1hZ2UsIGNsaWNrQnViYmxlOiBmYWxzZSwgYXR0cjogeyB0aXRsZTogZ2V0TG9jU3RyaW5nKCdwZS5lZGl0JyksICdhcmlhLWxhYmVsJzogZ2V0TG9jU3RyaW5nKCdwZS5lZGl0JykgfVxcXCJcXG4gICAgPlxcbiAgICAgIDxzdmctaWNvblxcbiAgICAgICAgY2xhc3M9XFxcInN2ZC1wcmltYXJ5LWljb25cXFwiXFxuICAgICAgICBwYXJhbXM9XFxcImljb25OYW1lOiAnaWNvbi1pbnBsYWNlZWRpdCcsIHNpemU6IDEyXFxcIlxcbiAgICAgID48L3N2Zy1pY29uPlxcbiAgICA8L3NwYW4+XFxuICA8L3NwYW4+XFxuICA8c3BhblxcbiAgICBjbGFzcz1cXFwic3ZkYS1kcmFnLWhhbmRsZVxcXCJcXG4gICAgcm9sZT1cXFwiYnV0dG9uXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgdGl0bGU6IGdldExvY1N0cmluZygncGUubW92ZScpLCAnYXJpYS1sYWJlbCc6IGdldExvY1N0cmluZygncGUubW92ZScpIH1cXFwiXFxuICA+XFxuICAgIDxzdmctaWNvblxcbiAgICAgIGNsYXNzPVxcXCJzdmQtcHJpbWFyeS1pY29uXFxcIlxcbiAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWlucGxhY2VkcmFnZ2FibGUnLCBzaXplOiAxMlxcXCJcXG4gICAgPjwvc3ZnLWljb24+XFxuICA8L3NwYW4+XFxuICA8IS0tIGtvIGlmbm90OiBpc0xhc3RJdGVtIC0tPlxcbiAgPHNwYW5cXG4gICAgY2xhc3M9XFxcInN2ZGEtZGVsZXRlLWl0ZW1cXFwiXFxuICAgIHJvbGU9XFxcImJ1dHRvblxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJjbGljazogZGVsZXRlSXRlbSwgYXR0cjogeyB0aXRsZTogZ2V0TG9jU3RyaW5nKCdwZS5kZWxldGUnKSwgJ2FyaWEtbGFiZWwnOiBnZXRMb2NTdHJpbmcoJ3BlLmRlbGV0ZScpIH1cXFwiXFxuICA+XFxuICAgIDxzdmctaWNvblxcbiAgICAgIGNsYXNzPVxcXCJzdmQtcHJpbWFyeS1pY29uXFxcIlxcbiAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWlucGxhY2VkZWxldGUnLCBzaXplOiAxMlxcXCJcXG4gICAgPjwvc3ZnLWljb24+XFxuICA8L3NwYW4+XFxuICA8IS0tIC9rbyAtLT5cXG48L2Rpdj5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3ZkYS1jb250ZW50XFxcIj5cXG4gIDxzcGFuIGNsYXNzPVxcXCJzdmRhLWltYWdlLWVkaXRvclxcXCI+XFxuICAgIDxzcGFuXFxuICAgICAgY2xhc3M9XFxcImVkaXQtaW1hZ2UtaXRlbVxcXCJcXG4gICAgICByb2xlPVxcXCJidXR0b25cXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogY2hvb3NlSW1hZ2UsIGNsaWNrQnViYmxlOiBmYWxzZSwgYXR0cjogeyB0aXRsZTogZ2V0TG9jU3RyaW5nKCdwZS5lZGl0JyksICdhcmlhLWxhYmVsJzogZ2V0TG9jU3RyaW5nKCdwZS5lZGl0JykgfVxcXCJcXG4gICAgPlxcbiAgICAgIDxzdmctaWNvblxcbiAgICAgICAgY2xhc3M9XFxcInN2ZC1wcmltYXJ5LWljb25cXFwiXFxuICAgICAgICBwYXJhbXM9XFxcImljb25OYW1lOiAnaWNvbi1pbnBsYWNlZWRpdCcsIHNpemU6IDEyXFxcIlxcbiAgICAgID48L3N2Zy1pY29uPlxcbiAgICA8L3NwYW4+XFxuICA8L3NwYW4+XFxuICA8IS0tIGtvIGlmOiBhbGxvd0RlbGV0ZSAtLT5cXG4gIDxzcGFuXFxuICAgIGNsYXNzPVxcXCJzdmRhLWRlbGV0ZS1pdGVtXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBkZWxldGVJbWFnZSwgYXR0cjogeyB0aXRsZTogZ2V0TG9jU3RyaW5nKCdwZS5kZWxldGUnKSwgJ2FyaWEtbGFiZWwnOiBnZXRMb2NTdHJpbmcoJ3BlLmRlbGV0ZScpIH1cXFwiXFxuICA+XFxuICAgIDxzdmctaWNvblxcbiAgICAgIGNsYXNzPVxcXCJzdmQtcHJpbWFyeS1pY29uXFxcIlxcbiAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWlucGxhY2VkZWxldGUnLCBzaXplOiAxMlxcXCJcXG4gICAgPjwvc3ZnLWljb24+XFxuICA8L3NwYW4+XFxuICA8IS0tIC9rbyAtLT5cXG48L2Rpdj5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3ZkYS1jb250ZW50XFxcIj5cXG4gIDxzcGFuXFxuICAgIGNsYXNzPVxcXCJzdmRhLXRpdGxlLWVkaXRvci1jb250ZW50XFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGlzRWRpdGluZ1xcXCJcXG4gICAgc3R5bGU9XFxcImRpc3BsYXk6IG5vbmVcXFwiXFxuICA+XFxuICAgIDxpbnB1dFxcbiAgICAgIGRhdGEtc3ZkLWluZm89XFxcImFkb3JuZXJcXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0SW5wdXQ6IGVkaXRpbmdOYW1lLCBldmVudDogeyBrZXl1cDogbmFtZUVkaXRvcktleXByZXNzLCBibHVyOiBwb3N0RWRpdCB9LCBhdHRyOiB7IG1heExlbmd0aDogbWF4TGVuZ3RoLCAnYXJpYS1sYWJlbCc6IG5hbWUgfVxcXCJcXG4gICAgICBzdHlsZT1cXFwiXFxuICAgICAgICBib3JkZXItdG9wOiBub25lO1xcbiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XFxuICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7XFxuICAgICAgICBvdXRsaW5lOiBub25lO1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgICAgXFxcIlxcbiAgICAvPlxcbiAgICA8c3BhblxcbiAgICAgIGNsYXNzPVxcXCJzdmRhLWVkaXQtYnV0dG9uXFxcIlxcbiAgICAgIHJvbGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBwb3N0RWRpdCwgZW5hYmxlOiBlZGl0aW5nTmFtZSgpICE9ICcnXFxcIlxcbiAgICA+XFxuICAgICAgPHN2Zy1pY29uXFxuICAgICAgICBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCJcXG4gICAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWlucGxhY2VjaGVjaycsIHNpemU6IDEyXFxcIlxcbiAgICAgID48L3N2Zy1pY29uPlxcbiAgICA8L3NwYW4+XFxuICAgIDwhLS0gPHNwYW4gY2xhc3M9XFxcInN2ZGEtZWRpdC1idXR0b25cXFwiIGRhdGEtYmluZD1cXFwiY2xpY2s6IGNhbmNlbEVkaXRcXFwiPuKclTwvc3Bhbj4gLS0+XFxuICA8L3NwYW4+XFxuICA8c3BhblxcbiAgICBjbGFzcz1cXFwic3ZkYS1mb2N1c2FibGVcXFwiXFxuICAgIHRhYmluZGV4PVxcXCIwXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgJ2FyaWEtbGFiZWwnOiBnZXRMb2NTdHJpbmcoJ3BlLmtleWJvYXJkQWRvcm5lclRpcCcpIH1cXFwiXFxuICA+XFxuICA8L3NwYW4+XFxuICA8c3BhblxcbiAgICBjbGFzcz1cXFwic3ZkYS10aXRsZS1lZGl0b3ItY29udGVudCBzdmRhLXRpdGxlLWVkaXRvci1zdGFydFxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAhaXNFZGl0aW5nKClcXFwiXFxuICA+XFxuICAgIDxzcGFuIHN0eWxlPVxcXCJkaXNwbGF5OiBub25lXFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6IGVkaXRpbmdOYW1lXFxcIj48L3NwYW4+XFxuICAgIDxzcGFuXFxuICAgICAgY2xhc3M9XFxcImVkaXQtc3VydmV5LW5hbWVcXFwiXFxuICAgICAgcm9sZT1cXFwiYnV0dG9uXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6IHN0YXJ0RWRpdCwgYXR0cjogeyB0aXRsZTogZ2V0TG9jU3RyaW5nKCdwZS5lZGl0JyksICdhcmlhLWxhYmVsJzogZ2V0TG9jU3RyaW5nKCdwZS5lZGl0JykgfVxcXCJcXG4gICAgPlxcbiAgICAgIDxzdmctaWNvblxcbiAgICAgICAgY2xhc3M9XFxcInN2ZC1wcmltYXJ5LWljb25cXFwiXFxuICAgICAgICBwYXJhbXM9XFxcImljb25OYW1lOiAnaWNvbi1pbnBsYWNlZWRpdCcsIHNpemU6IDEyXFxcIlxcbiAgICAgID48L3N2Zy1pY29uPlxcbiAgICA8L3NwYW4+XFxuICA8L3NwYW4+XFxuICA8IS0tIGtvIGlmOiBpc0RyYWdnYWJsZSAtLT5cXG4gIDxzcGFuXFxuICAgIGNsYXNzPVxcXCJzdmRhLWRyYWctaGFuZGxlXFxcIlxcbiAgICByb2xlPVxcXCJidXR0b25cXFwiXFxuICAgIGRhdGEtYmluZD1cXFwiYXR0cjogeyB0aXRsZTogZ2V0TG9jU3RyaW5nKCdwZS5tb3ZlJyksICdhcmlhLWxhYmVsJzogZ2V0TG9jU3RyaW5nKCdwZS5tb3ZlJykgfSwgdmlzaWJsZTogIWlzRWRpdGluZygpXFxcIlxcbiAgPlxcbiAgICA8c3ZnLWljb25cXG4gICAgICBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCJcXG4gICAgICBwYXJhbXM9XFxcImljb25OYW1lOiAnaWNvbi1pbnBsYWNlZHJhZ2dhYmxlJywgc2l6ZTogMTJcXFwiXFxuICAgID48L3N2Zy1pY29uPlxcbiAgPC9zcGFuPlxcbiAgPCEtLSAva28gLS0+XFxuICA8IS0ta28gaWY6ICFpc0xhc3RJdGVtICYmIGFsbG93QWRkUmVtb3ZlSXRlbXMgLS0+XFxuICA8c3BhblxcbiAgICBjbGFzcz1cXFwic3ZkYS1kZWxldGUtaXRlbVxcXCJcXG4gICAgcm9sZT1cXFwiYnV0dG9uXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBkZWxldGVJdGVtLCBhdHRyOiB7IHRpdGxlOiBnZXRMb2NTdHJpbmcoJ3BlLmRlbGV0ZScpLCAnYXJpYS1sYWJlbCc6IGdldExvY1N0cmluZygncGUuZGVsZXRlJykgfSwgdmlzaWJsZTogIWlzRWRpdGluZygpXFxcIlxcbiAgPlxcbiAgICA8c3ZnLWljb25cXG4gICAgICBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCJcXG4gICAgICBwYXJhbXM9XFxcImljb25OYW1lOiAnaWNvbi1pbnBsYWNlZGVsZXRlJywgc2l6ZTogMTJcXFwiXFxuICAgID48L3N2Zy1pY29uPlxcbiAgPC9zcGFuPlxcbiAgPCEtLSAva28gLS0+XFxuPC9kaXY+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXY+XFxuICAgIDwhLS0ga28gZm9yZWFjaDogYWN0aW9ucyAtLT5cXG4gICAgPCEtLSBrbyBpZjogISRkYXRhLnRlbXBsYXRlIC0tPlxcbiAgICA8c3BhbiBjbGFzcz1cXFwic3ZkYV9xdWVzdGlvbl9hY3Rpb24gc3ZkLW1haW4tY29sb3JcXFwiIGRhdGEtYmluZD1cXFwia2V5MmNsaWNrLCBjbGlja05vRm9jdXM6IGZ1bmN0aW9uKCkgeyBvbkNsaWNrKCRwYXJlbnQucXVlc3Rpb24pOyB9LCBhdHRyOiB7dGl0bGU6IHRleHQsICdhcmlhLWxhYmVsJzogdGV4dCwgcm9sZTogJ2J1dHRvbicsIHRhYmluZGV4OiAkZGF0YS5uZWVkRm9jdXMgPT09IHVuZGVmaW5lZCB8fCAhISRkYXRhLm5lZWRGb2N1cyA/IDAgOiB1bmRlZmluZWQgfVxcXCI+XFxuICAgICAgICA8c3Bhbj5cXG4gICAgICAgICAgICA8c3ZnLWljb24gY2xhc3M9XFxcInN2ZC1wcmltYXJ5LWljb25cXFwiIGRhdGEtYmluZD1cXFwiY3NzOiAkcGFyZW50LmdldFN0eWxlKCRkYXRhKVxcXCIgcGFyYW1zPVxcXCJpY29uTmFtZTogJHBhcmVudC5nZXRTdHlsZSgkZGF0YSlcXFwiPjwvc3ZnLWljb24+XFxuICAgICAgICA8L3NwYW4+XFxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmhhc1RpdGxlID8gdGV4dDogJydcXFwiPjwvc3Bhbj5cXG4gICAgPC9zcGFuPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSBrbyBpZjogISEkZGF0YS50ZW1wbGF0ZSAtLT5cXG4gICAgPCEtLSBrbyB0ZW1wbGF0ZTogdGVtcGxhdGUgLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuPC9kaXY+XCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcInN2ZGEtY29udGVudFxcXCI+XFxuICA8c3BhblxcbiAgICBjbGFzcz1cXFwic3ZkYS10aXRsZS1lZGl0b3ItY29udGVudFxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBpc0VkaXRpbmdcXFwiXFxuICAgIHN0eWxlPVxcXCJkaXNwbGF5OiBub25lXFxcIlxcbiAgPlxcbiAgICA8aW5wdXRcXG4gICAgICBkYXRhLXN2ZC1pbmZvPVxcXCJhZG9ybmVyXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwidGV4dElucHV0OiBlZGl0aW5nTmFtZSwgZXZlbnQ6IHsga2V5dXA6IG5hbWVFZGl0b3JLZXlwcmVzcywgYmx1cjogcG9zdEVkaXQgfVxcXCJcXG4gICAgICBzdHlsZT1cXFwiXFxuICAgICAgICBib3JkZXItdG9wOiBub25lO1xcbiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XFxuICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7XFxuICAgICAgICBvdXRsaW5lOiBub25lO1xcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgICAgICBtYXJnaW46IC02cHg7XFxuICAgICAgXFxcIlxcbiAgICAvPlxcbiAgICA8c3BhblxcbiAgICAgIGNsYXNzPVxcXCJzdmRhLWVkaXQtYnV0dG9uXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6IHBvc3RFZGl0LCBlbmFibGU6IGVkaXRpbmdOYW1lKCkgIT0gJydcXFwiXFxuICAgID5cXG4gICAgICA8c3ZnLWljb25cXG4gICAgICAgIGNsYXNzPVxcXCJzdmQtcHJpbWFyeS1pY29uXFxcIlxcbiAgICAgICAgcm9sZT1cXFwiYnV0dG9uXFxcIlxcbiAgICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24taW5wbGFjZWNoZWNrJywgc2l6ZTogMTJcXFwiXFxuICAgICAgPjwvc3ZnLWljb24+XFxuICAgIDwvc3Bhbj5cXG4gICAgPCEtLSA8c3BhbiBjbGFzcz1cXFwic3ZkYS1lZGl0LWJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJjbGljazogY2FuY2VsRWRpdFxcXCI+4pyVPC9zcGFuPiAtLT5cXG4gIDwvc3Bhbj5cXG4gIDxzcGFuXFxuICAgIGNsYXNzPVxcXCJzdmRhLXRpdGxlLWVkaXRvci1jb250ZW50IHN2ZGEtdGl0bGUtZWRpdG9yLXN0YXJ0XFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICFpc0VkaXRpbmcoKVxcXCJcXG4gID5cXG4gICAgPHNwYW4gc3R5bGU9XFxcImRpc3BsYXk6IG5vbmVcXFwiIGRhdGEtYmluZD1cXFwidGV4dDogZWRpdGluZ05hbWVcXFwiPjwvc3Bhbj5cXG4gICAgPHNwYW5cXG4gICAgICBjbGFzcz1cXFwiZWRpdC1zdXJ2ZXktbmFtZVxcXCJcXG4gICAgICByb2xlPVxcXCJidXR0b25cXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogc3RhcnRFZGl0LCBhdHRyOiB7IHRpdGxlOiBnZXRMb2NTdHJpbmcoJ3BlLmVkaXQnKSwgJ2FyaWEtbGFiZWwnOiBnZXRMb2NTdHJpbmcoJ3BlLmVkaXQnKSB9XFxcIlxcbiAgICA+XFxuICAgICAgPHN2Zy1pY29uXFxuICAgICAgICBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCJcXG4gICAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWlucGxhY2VlZGl0Jywgc2l6ZTogMTJcXFwiXFxuICAgICAgPjwvc3ZnLWljb24+XFxuICAgIDwvc3Bhbj5cXG4gIDwvc3Bhbj5cXG4gIDwhLS1rbyBpZm5vdDogaXNMYXN0SXRlbSAtLT5cXG4gIDxzcGFuXFxuICAgIGNsYXNzPVxcXCJzdmRhLWRlbGV0ZS1pdGVtXFxcIlxcbiAgICByb2xlPVxcXCJidXR0b25cXFwiXFxuICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6IGRlbGV0ZUl0ZW0sIGF0dHI6IHsgdGl0bGU6IGdldExvY1N0cmluZygncGUuZGVsZXRlJyksICdhcmlhLWxhYmVsJzogZ2V0TG9jU3RyaW5nKCdwZS5kZWxldGUnKSB9LCB2aXNpYmxlOiAhaXNFZGl0aW5nKClcXFwiXFxuICA+XFxuICAgIDxzdmctaWNvblxcbiAgICAgIGNsYXNzPVxcXCJzdmQtcHJpbWFyeS1pY29uXFxcIlxcbiAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWlucGxhY2VkZWxldGUnLCBzaXplOiAxMlxcXCJcXG4gICAgPjwvc3ZnLWljb24+XFxuICA8L3NwYW4+XFxuICA8IS0tIC9rbyAtLT5cXG48L2Rpdj5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3ZkYS1zZWxlY3QtaXRlbXMtZGlzcGxheVxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2ZGEtc2VsZWN0LWl0ZW1zLXRpdGxlXFxcIiBkYXRhLWJpbmQ9XFxcImNsaWNrOiB0b2dnbGVcXFwiPlxcbiAgICAgIDxzcGFuXFxuICAgICAgICBjbGFzcz1cXFwic3ZkLW1haW4tY29sb3JcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6IGdldExvY1N0cmluZygncGUuc2hvd0Nob2ljZXMnKVxcXCJcXG4gICAgICA+PC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdlxcbiAgICAgIGNsYXNzPVxcXCJzdmRhLXNlbGVjdC1pdGVtcy1jb250ZW50IHN2ZC1kYXJrLWJvcmRlci1jb2xvciBzdmQtbGlnaHQtYmctY29sb3JcXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBpc0V4cGFuZGVkXFxcIlxcbiAgICA+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkYS1zZWxlY3QtaXRlbXMtY29sbGVjdGlvblxcXCI+XFxuICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogY2hvaWNlcyB9IC0tPlxcbiAgICAgICAgPGRpdj4gIFxcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogdGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgPC9kaXY+ICBcXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc090aGVyIC0tPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIml0ZW1fZWRpdGFibGVcXFwiPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiBvdGhlclRleHRcXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuICBcIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3ZkYS1zZWxlY3QtaXRlbXMtZWRpdG9yXFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcInN2ZGEtc2VsZWN0LWl0ZW1zLXRpdGxlXFxcIiBkYXRhLWJpbmQ9XFxcImNsaWNrOiB0b2dnbGVcXFwiPlxcbiAgICA8c3BhbiBjbGFzcz1cXFwic3ZkLW1haW4tY29sb3JcXFwiIGRhdGEtYmluZD1cXFwidGV4dDogZ2V0TG9jU3RyaW5nKCdwZS5lZGl0Q2hvaWNlcycpXFxcIj48L3NwYW4+XFxuICA8L2Rpdj5cXG4gIDxkaXYgY2xhc3M9XFxcInN2ZGEtc2VsZWN0LWl0ZW1zLWNvbnRlbnQgc3ZkLWRhcmstYm9yZGVyLWNvbG9yIHN2ZC1saWdodC1iZy1jb2xvclxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBpc0V4cGFuZGVkXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3ZkYS1zZWxlY3QtaXRlbXMtY29sbGVjdGlvblxcXCI+XFxuICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IGNob2ljZXMsIGFmdGVyUmVuZGVyOiBjaG9pY2VzUmVuZGVyZWQgfSAtLT5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJpdGVtX2VkaXRhYmxlIGl0ZW1fZHJhZ2dhYmxlXFxcIj5cXG4gICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogbG9jVGV4dC5rb1JlbmRlcmVkSHRtbFxcXCI+PC9zcGFuPlxcbiAgICAgICAgPHNwYW4+XFxuICAgICAgICAgIDxpdGVtLWVkaXRvclxcbiAgICAgICAgICAgIHBhcmFtcz1cXFwibmFtZTogJHBhcmVudC52YWx1ZU5hbWUsIHZhbHVlQ2hhbmdlZDogJHBhcmVudC52YWx1ZUNoYW5nZWQsIHRhcmdldDogJGRhdGEsIG1vZGVsOiAkZGF0YSwgaXRlbTogJGRhdGEsIHF1ZXN0aW9uOiAkcGFyZW50LnF1ZXN0aW9uLCBlZGl0b3I6ICRwYXJlbnQuZWRpdG9yXFxcIj5cXG4gICAgICAgICAgPC9pdGVtLWVkaXRvcj5cXG4gICAgICAgIDwvc3Bhbj5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc090aGVyIC0tPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJpdGVtX2VkaXRhYmxlXFxcIj5cXG4gICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IG90aGVyVGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgIDxzcGFuPlxcbiAgICAgICAgPGl0ZW0tZWRpdG9yXFxuICAgICAgICAgIHBhcmFtcz0nbmFtZTogXFxcIm90aGVyVGV4dFxcXCIsIHRhcmdldDogcXVlc3Rpb24sIG1vZGVsOiBxdWVzdGlvbiwgdmFsdWVDaGFuZ2VkOiBvdGhlclZhbHVlQ2hhbmdlZCwgaXRlbTogcXVlc3Rpb24ub3RoZXJJdGVtLCBxdWVzdGlvbjogcXVlc3Rpb24sIGVkaXRvcjogZWRpdG9yJz5cXG4gICAgICAgIDwvaXRlbS1lZGl0b3I+XFxuICAgICAgPC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2X3RlY2huaWNhbCBzdmRhLWFkZC1uZXctaXRlbVxcXCIgdGFiaW5kZXg9XFxcIjBcXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJrZXkyY2xpY2ssIGNsaWNrOiBhZGRJdGVtLCBhdHRyOiB7IHRpdGxlOiBnZXRMb2NTdHJpbmcoJ3BlLmFkZEl0ZW0nKSB9XFxcIj5cXG4gICAgICA8c3ZnLWljb24gY2xhc3M9XFxcInN2ZC1wcmltYXJ5LWljb25cXFwiIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWlucGxhY2VwbHVzJywgc2l6ZTogMTJcXFwiPjwvc3ZnLWljb24+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIGtvIGlmOiBzaG93T3RoZXIgLS0+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2X3RlY2huaWNhbCBzdmRhLWFkZC1uZXctaXRlbSBzdmRhLWFkZC1jdXN0b20taXRlbVxcXCIgdGFiaW5kZXg9XFxcIjBcXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJrZXkyY2xpY2ssIGNsaWNrOiBhZGRPdGhlciwgYXR0cjogeyB0aXRsZTogZ2V0TG9jU3RyaW5nKCdwZS5hZGRPdGhlcicpIH1cXFwiPlxcbiAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogZ2V0TG9jU3RyaW5nKCdwZS5hZGRPdGhlcicpXFxcIj48L3NwYW4+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZGl2PlxcbjwvZGl2PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2PlxcbiAgPCEtLSBrbyBmb3JlYWNoOiBhY3Rpb25zIC0tPlxcbiAgPCEtLSBrbyBpZjogISRkYXRhLnRlbXBsYXRlIC0tPlxcbiAgPHNwYW5cXG4gICAgY2xhc3M9XFxcInN2ZGFfcXVlc3Rpb25fYWN0aW9uIHN2ZC1tYWluLWNvbG9yXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHZpc2libGUsIGtleTJjbGljaywgY2xpY2tOb0ZvY3VzOiBvbkNsaWNrLCBhdHRyOiB7dGl0bGU6IHRleHQsICdhcmlhLWxhYmVsJzogdGV4dCwgcm9sZTogJ2J1dHRvbicsIHRhYmluZGV4OiAkZGF0YS5uZWVkRm9jdXMgPT09IHVuZGVmaW5lZCB8fCAhISRkYXRhLm5lZWRGb2N1cyA/IDAgOiB1bmRlZmluZWQgfVxcXCJcXG4gID5cXG4gICAgPHNwYW4+XFxuICAgICAgPHN2Zy1pY29uXFxuICAgICAgICBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiAkcGFyZW50LmdldFN0eWxlKCRkYXRhKVxcXCJcXG4gICAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICRwYXJlbnQuZ2V0SWNvbigkZGF0YSlcXFwiXFxuICAgICAgPjwvc3ZnLWljb24+XFxuICAgIDwvc3Bhbj5cXG4gICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5oYXNUaXRsZSA/IHRleHQ6ICcnXFxcIj48L3NwYW4+XFxuICA8L3NwYW4+XFxuICA8IS0tIC9rbyAtLT5cXG4gIDwhLS0ga28gaWY6ICEhJGRhdGEudGVtcGxhdGUgLS0+XFxuICA8IS0tIGtvIHRlbXBsYXRlOiB0ZW1wbGF0ZSAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbiAgPCEtLSAva28gLS0+XFxuICA8IS0tIC9rbyAtLT5cXG48L2Rpdj5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3ZkYS1jb250ZW50XFxcIiBkYXRhLWJpbmQ9XFxcImlmbm90OiByZWFkT25seVxcXCI+XFxuICA8c3BhbiBjbGFzcz1cXFwic3ZkYS10aXRsZS1lZGl0b3ItY29udGVudFxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBpc0VkaXRpbmdcXFwiIHN0eWxlPVxcXCJkaXNwbGF5OiBub25lO1xcXCI+XFxuICAgIDxpbnB1dCBkYXRhLXN2ZC1pbmZvPVxcXCJhZG9ybmVyXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwidGV4dElucHV0OiBlZGl0aW5nTmFtZSwgZXZlbnQ6IHsga2V5dXA6IG5hbWVFZGl0b3JLZXlwcmVzcywga2V5ZG93bjogbmFtZUVkaXRvcktleWRvd24sIGJsdXI6IHBvc3RFZGl0IH0sIGF0dHI6IHsgbWF4TGVuZ3RoOiBtYXhMZW5ndGgsICdhcmlhLWxhYmVsJzogbmFtZSwgJ3RpdGxlJzogZXJyb3IsICdwbGFjZWhvbGRlcic6IGVycm9yIH0sIGNzczogeyAnc3ZkYS10aXRsZS1lZGl0b3ItZXJyb3InOiBlcnJvciB9LCBzdHlsZTogeyAnbWluLXdpZHRoJzogZXJyb3IoKSA/ICcxNTBweCcgOiAnJyB9XFxcIlxcbiAgICAgIHN0eWxlPVxcXCJib3JkZXItdG9wOiBub25lOyBib3JkZXItbGVmdDogbm9uZTsgYm9yZGVyLXJpZ2h0OiBub25lOyBvdXRsaW5lOiBub25lOyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcXCIgLz5cXG4gICAgPHNwYW4gcm9sZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwic3ZkYS1lZGl0LWJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJjbGljazogcG9zdEVkaXQsIGVuYWJsZTogZWRpdGluZ05hbWUoKSAhPSAnJ1xcXCI+XFxuICAgICAgPHN2Zy1pY29uIGNsYXNzPVxcXCJzdmQtcHJpbWFyeS1pY29uXFxcIiBwYXJhbXM9XFxcImljb25OYW1lOiAnaWNvbi1pbnBsYWNlY2hlY2snLCBzaXplOiAxMlxcXCI+PC9zdmctaWNvbj5cXG4gICAgPC9zcGFuPlxcbiAgICA8IS0tIDxzcGFuIGNsYXNzPVxcXCJzdmRhLWVkaXQtYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcImNsaWNrOiBjYW5jZWxFZGl0XFxcIj7inJU8L3NwYW4+IC0tPlxcbiAgPC9zcGFuPlxcbiAgPHNwYW4gY2xhc3M9XFxcInN2ZGEtdGl0bGUtZWRpdG9yLWZvY3VzYWJsZVxcXCIgdGFiaW5kZXg9XFxcIjBcXFwiIHJvbGU9XFxcImJ1dHRvblxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJjbGljazogc3RhcnRFZGl0LCBrZXkyY2xpY2ssIGF0dHI6IHsgJ2FyaWEtbGFiZWwnOiBnZXRMb2NTdHJpbmcoJ3BlLmVkaXQnKSArICcgJyArIG5hbWUgfVxcXCI+PC9zcGFuPlxcbiAgPHNwYW4gY2xhc3M9XFxcInN2ZGEtdGl0bGUtZWRpdG9yLWNvbnRlbnQgc3ZkYS10aXRsZS1lZGl0b3Itc3RhcnRcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogIWlzRWRpdGluZygpXFxcIj5cXG4gICAgPHNwYW4gY2xhc3M9XFxcInN2ZGEtdGl0bGUtZWRpdG9yLXBsYWNlaG9sZGVyXFxcIiB0YWJpbmRleD1cXFwiMFxcXCJcXG4gICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBzdGFydEVkaXQsIHRleHQ6IHBsYWNlaG9sZGVyLCB2aXNpYmxlOiAhZWRpdGluZ05hbWUoKSAmJiBwbGFjZWhvbGRlciwga2V5MmNsaWNrLCBhdHRyOiB7ICdhcmlhLWxhYmVsJzogbmFtZSwgcm9sZTogJ3RleHRib3gnLCAnYXJpYS1yZWFkb25seSc6ICdmYWxzZScgfVxcXCI+PC9zcGFuPlxcbiAgICA8c3BhbiByb2xlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJzdmRhLXRpdGxlLWVkaXRvci1zdGFydC1idXR0b24gZWRpdC1zdXJ2ZXktbmFtZVxcXCJcXG4gICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBzdGFydEVkaXQsIGF0dHI6IHsgdGl0bGU6IGdldExvY1N0cmluZygncGUuZWRpdCcpIH1cXFwiPlxcbiAgICAgIDxzdmctaWNvbiBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCIgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24taW5wbGFjZWVkaXQnLCBzaXplOiAxMlxcXCI+PC9zdmctaWNvbj5cXG4gICAgPC9zcGFuPlxcbiAgPC9zcGFuPlxcbjwvZGl2PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tIGtvIGlmOiBtb2RlbC5oYXNEcm9wZG93blNlbGVjdG9yIC0tPlxcbjxzdmQtZHJvcGRvd25cXG4gIGNsYXNzPVxcXCJzdmQtcGFnZS1zZWxlY3RvclxcXCJcXG4gIHBhcmFtcz1cXFwiaXRlbTogeyBpdGVtczogbW9kZWwucGFnZXNGb3JTZWxlY3Rpb24sIGFjdGlvbjogbW9kZWwuc2VsZWN0ZWRQYWdlLCB0aXRsZTogJycsIGFyaWFMYWJlbDogZ2V0TG9jU3RyaW5nKCdlZC5zZWxlY3RQYWdlJykgfVxcXCJcXG4+XFxuPC9zdmQtZHJvcGRvd24+XFxuPCEtLSAva28gLS0+XFxuPGRpdlxcbiAgdGFiaW5kZXg9XFxcIjBcXFwiXFxuICBjbGFzcz1cXFwic3ZkLXBhZ2Utc2Nyb2xsZXItYXJyb3dcXFwiXFxuICBkYXRhLWJpbmQ9XFxcImtleTJjbGljaywgY2xpY2tOb0ZvY3VzOiBtb3ZlTGVmdCwgYXR0cjoge3RpdGxlOiBnZXRMb2NTdHJpbmcoJ2VkLm1vdmVMZWZ0Jyl9LCBjc3M6IHsnc3ZkLXBhZ2Utc2Nyb2xsZXItYXJyb3ctLXZpc2libGUnOiBoYXNTY3JvbGxlciB9XFxcIlxcbj5cXG4gIDxzcGFuPlxcbiAgICA8c3ZnLWljb25cXG4gICAgICBjbGFzcz1cXFwic3ZkLXNlY29uZGFyeS1pY29uXFxcIlxcbiAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWxlZnQnXFxcIlxcbiAgICA+PC9zdmctaWNvbj5cXG4gIDwvc3Bhbj5cXG48L2Rpdj5cXG48IS0tIGtvIGlmOiBtb2RlbC5yZWFkT25seSAtLT5cXG48ZGl2XFxuICBjbGFzcz1cXFwic3ZkLXBhZ2VzXFxcIlxcbiAgZGF0YS1iaW5kPVxcXCJldmVudDoge3doZWVsOiBvbldoZWVsfSwgY3NzOiB7J3N2ZC1wYWdlcy0tbm8tZHJvcGRvd24tc2VsZWN0b3InOiAhbW9kZWwuaGFzRHJvcGRvd25TZWxlY3RvcigpIH1cXFwiXFxuPlxcbiAgPCEtLSBrbyBmb3JlYWNoOiBtb2RlbC5wYWdlcyAtLT5cXG4gIDxkaXZcXG4gICAgdGFiaW5kZXg9XFxcIjBcXFwiXFxuICAgIGNsYXNzPVxcXCJzdmQtcGFnZSBzdmQtbGlnaHQtYm9yZGVyLWNvbG9yXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImtleTJjbGljaywgY3NzOiAkcGFyZW50LmdldFBhZ2VDbGFzcygkZGF0YSksIGNsaWNrTm9Gb2N1czogJHBhcmVudC5vblBhZ2VDbGlja1xcXCJcXG4gID5cXG4gICAgPHNwYW5cXG4gICAgICBjbGFzcz1cXFwic3ZkLXBhZ2UtbmFtZVxcXCJcXG4gICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRwYXJlbnQubW9kZWwuZ2V0RGlzcGxheVRleHQoJGRhdGEpXFxcIlxcbiAgICA+PC9zcGFuPlxcbiAgICA8c3BhbiBjbGFzcz1cXFwic3ZkLXBhZ2UtYWN0aW9ucy1jb250YWluZXJcXFwiPlxcbiAgICAgIDxzdmctaWNvblxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6ICRwYXJlbnQuZ2V0UGFnZU1lbnVJY29uQ2xhc3MoJGRhdGEpXFxcIlxcbiAgICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJHBhcmVudC5nZXRQYWdlTWVudUljb25DbGFzcygkZGF0YSksIHNpemU6IDEyXFxcIlxcbiAgICAgID48L3N2Zy1pY29uPlxcbiAgICA8L3NwYW4+XFxuICA8L2Rpdj5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvZGl2PlxcbjwhLS0gL2tvIC0tPlxcbjwhLS0ga28gaWZub3Q6IG1vZGVsLnJlYWRPbmx5IC0tPlxcbjxkaXZcXG4gIGNsYXNzPVxcXCJzdmQtcGFnZXNcXFwiXFxuICBkYXRhLWJpbmQ9XFxcInNvcnRhYmxlOiB7Zm9yZWFjaDogbW9kZWwucGFnZXMsIG9wdGlvbnM6IHNvcnRhYmxlT3B0aW9uc30sIGV2ZW50OiB7d2hlZWw6IG9uV2hlZWx9LCBjc3M6IHsnc3ZkLXBhZ2VzLS1uby1kcm9wZG93bi1zZWxlY3Rvcic6ICFtb2RlbC5oYXNEcm9wZG93blNlbGVjdG9yKCkgfVxcXCJcXG4+XFxuICA8ZGl2XFxuICAgIHRhYmluZGV4PVxcXCIwXFxcIlxcbiAgICBjbGFzcz1cXFwic3ZkLXBhZ2Ugc3ZkLWxpZ2h0LWJvcmRlci1jb2xvclxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJrZXkyY2xpY2ssIGNzczogJHBhcmVudC5nZXRQYWdlQ2xhc3MoJGRhdGEpLCBjbGlja05vRm9jdXM6ICRwYXJlbnQub25QYWdlQ2xpY2tcXFwiXFxuICA+XFxuICAgIDxzcGFuXFxuICAgICAgY2xhc3M9XFxcInN2ZC1wYWdlLW5hbWVcXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkcGFyZW50Lm1vZGVsLmdldERpc3BsYXlUZXh0KCRkYXRhKSwgY3NzOiB7J3N2ZC1wYWdlLWRpc2FibGUtbW92ZSc6ICEkcGFyZW50Lm1vZGVsLmNhbk1vdmV9XFxcIlxcbiAgICA+PC9zcGFuPlxcbiAgICA8c3BhbiBjbGFzcz1cXFwic3ZkLXBhZ2UtYWN0aW9ucy1jb250YWluZXJcXFwiPlxcbiAgICAgIDxzdmctaWNvblxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6ICRwYXJlbnQuZ2V0UGFnZU1lbnVJY29uQ2xhc3MoJGRhdGEpXFxcIlxcbiAgICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJHBhcmVudC5nZXRQYWdlTWVudUljb25DbGFzcygkZGF0YSksIHNpemU6IDEyXFxcIlxcbiAgICAgID48L3N2Zy1pY29uPlxcblxcbiAgICAgIDxkaXYgc3R5bGU9XFxcInBvc2l0aW9uOiBzdGF0aWNcXFwiPlxcbiAgICAgICAgPGRpdlxcbiAgICAgICAgICBjbGFzcz1cXFwic3ZkLXBhZ2UtYWN0aW9ucyBzdmQtZGFyay1ib3JkZXItY29sb3Igc3ZkLWxpZ2h0LWJnLWNvbG9yXFxcIlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICRwYXJlbnQubW9kZWwuc2hvd0FjdGlvbnMoJGRhdGEpXFxcIlxcbiAgICAgICAgPlxcbiAgICAgICAgICA8c3BhblxcbiAgICAgICAgICAgIGNsYXNzPVxcXCJzdmQtcGFnZS1hY3Rpb25cXFwiXFxuICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogZnVuY3Rpb24obW9kZWwsIGV2ZW50KSB7JHBhcmVudC5tb2RlbC5zaG93UGFnZVNldHRpbmdzKCRkYXRhKTsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7fSwgYXR0cjoge3RpdGxlOiAkcGFyZW50LmdldExvY1N0cmluZygnZWQuZWRpdFBhZ2UnKX0sIHZpc2libGU6ICRwYXJlbnQubW9kZWwuY2FuRWRpdFBhZ2VcXFwiXFxuICAgICAgICAgID5cXG4gICAgICAgICAgICA8c3Bhbj5cXG4gICAgICAgICAgICAgIDxzdmctaWNvblxcbiAgICAgICAgICAgICAgICBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCJcXG4gICAgICAgICAgICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24tYWN0aW9uZWRpdGVsZW1lbnQnXFxcIlxcbiAgICAgICAgICAgICAgPjwvc3ZnLWljb24+XFxuICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgIDxzcGFuXFxuICAgICAgICAgICAgICBjbGFzcz1cXFwic3ZkLW1haW4tY29sb3JcXFwiXFxuICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRwYXJlbnQuZ2V0TG9jU3RyaW5nKCdlZC5lZGl0JylcXFwiXFxuICAgICAgICAgICAgPjwvc3Bhbj5cXG4gICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICA8c3BhblxcbiAgICAgICAgICAgIGNsYXNzPVxcXCJzdmQtcGFnZS1hY3Rpb25cXFwiXFxuICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogZnVuY3Rpb24obW9kZWwsIGV2ZW50KSB7JHBhcmVudC5tb2RlbC5kZWxldGVQYWdlKCRkYXRhKTsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7fSwgYXR0cjoge3RpdGxlOiAkcGFyZW50LmdldExvY1N0cmluZygnZWQuZGVsZXRlUGFnZScpfSwgdmlzaWJsZTogJHBhcmVudC5tb2RlbC5jYW5EZWxldGVQYWdlXFxcIlxcbiAgICAgICAgICA+XFxuICAgICAgICAgICAgPHN2Zy1pY29uXFxuICAgICAgICAgICAgICBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCJcXG4gICAgICAgICAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWFjdGlvbmRlbGV0ZSdcXFwiXFxuICAgICAgICAgICAgPjwvc3ZnLWljb24+XFxuICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgPHNwYW5cXG4gICAgICAgICAgICBjbGFzcz1cXFwic3ZkYV9hY3Rpb25fc2VwYXJhdG9yIHN2ZC1kYXJrLWJvcmRlci1jb2xvclxcXCJcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICEkcGFyZW50Lm1vZGVsLmlzTGFzdFBhZ2UoKVxcXCJcXG4gICAgICAgICAgPjwvc3Bhbj5cXG4gICAgICAgICAgPHNwYW5cXG4gICAgICAgICAgICBjbGFzcz1cXFwic3ZkLXBhZ2UtYWN0aW9uXFxcIlxcbiAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6IGZ1bmN0aW9uKG1vZGVsLCBldmVudCkgeyRwYXJlbnQubW9kZWwuY29weVBhZ2UoJGRhdGEpOyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTt9LCBhdHRyOiB7dGl0bGU6ICRwYXJlbnQuZ2V0TG9jU3RyaW5nKCdzdXJ2ZXkuQ29weScpfSwgdmlzaWJsZTogJHBhcmVudC5tb2RlbC5jYW5Db3B5UGFnZVxcXCJcXG4gICAgICAgICAgPlxcbiAgICAgICAgICAgIDxzdmctaWNvblxcbiAgICAgICAgICAgICAgY2xhc3M9XFxcInN2ZC1wcmltYXJ5LWljb25cXFwiXFxuICAgICAgICAgICAgICBwYXJhbXM9XFxcImljb25OYW1lOiAnaWNvbi1hY3Rpb25jb3B5J1xcXCJcXG4gICAgICAgICAgICA+PC9zdmctaWNvbj5cXG4gICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvc3Bhbj5cXG4gIDwvZGl2PlxcbjwvZGl2PlxcbjwhLS0gL2tvIC0tPlxcbjxkaXZcXG4gIHRhYmluZGV4PVxcXCIwXFxcIlxcbiAgY2xhc3M9XFxcInN2ZC1wYWdlLXNjcm9sbGVyLWFycm93XFxcIlxcbiAgZGF0YS1iaW5kPVxcXCJrZXkyY2xpY2ssIGNsaWNrTm9Gb2N1czogbW92ZVJpZ2h0LCBhdHRyOiB7dGl0bGU6IGdldExvY1N0cmluZygnZWQubW92ZVJpZ2h0Jyl9LCBjc3M6IHsnc3ZkLXBhZ2Utc2Nyb2xsZXItYXJyb3ctLXZpc2libGUnOiBoYXNTY3JvbGxlciB9XFxcIlxcbj5cXG4gIDxzcGFuPlxcbiAgICA8c3ZnLWljb25cXG4gICAgICBjbGFzcz1cXFwic3ZkLXNlY29uZGFyeS1pY29uXFxcIlxcbiAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLXJpZ2h0J1xcXCJcXG4gICAgPjwvc3ZnLWljb24+XFxuICA8L3NwYW4+XFxuPC9kaXY+XFxuPCEtLSBrbyBpZm5vdDogbW9kZWwucmVhZE9ubHkgLS0+XFxuPGRpdlxcbiAgdGFiaW5kZXg9XFxcIjBcXFwiXFxuICBjbGFzcz1cXFwic3ZkLXBhZ2Ugc3ZkLWxpZ2h0LWJvcmRlci1jb2xvciBzdmQtcGFnZS1hZGRcXFwiXFxuICBkYXRhLWJpbmQ9XFxcImtleTJjbGljaywgY2xpY2tOb0ZvY3VzOiBtb2RlbC5hZGRQYWdlLCBhdHRyOiB7dGl0bGU6IGdldExvY1N0cmluZygnZWQuYWRkTmV3UGFnZScpfSwgdmlzaWJsZTogbW9kZWwuY2FuQWRkUGFnZVxcXCJcXG4+XFxuICA8c3BhblxcbiAgICBjbGFzcz1cXFwic3ZkLXBhZ2UtbmFtZVxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBnZXRMb2NTdHJpbmcoJ2VkLmFkZE5ld1BhZ2UnKVxcXCJcXG4gID48L3NwYW4+XFxuICA8c3Bhbj5cXG4gICAgPHN2Zy1pY29uXFxuICAgICAgY2xhc3M9XFxcInN2ZC1zZWNvbmRhcnktaWNvblxcXCJcXG4gICAgICBwYXJhbXM9XFxcImljb25OYW1lOiAnaWNvbi1hZGQnXFxcIlxcbiAgICA+PC9zdmctaWNvbj5cXG4gIDwvc3Bhbj5cXG48L2Rpdj5cXG48IS0tIC9rbyAtLT5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiB0YWJpbmRleD1cXFwiMFxcXCIgZHJhZ2dhYmxlPVxcXCJ0cnVlXFxcIiBjbGFzcz1cXFwic3ZkX3Rvb2xib3hfaXRlbSBzdmQtbGlnaHQtYm9yZGVyLWNvbG9yXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImF0dHI6IHt0aXRsZTogaXRlbS50b29sdGlwLCByb2xlOiAnYnV0dG9uJywgJ2FyaWEtbGFiZWwnOiBhcmlhTGFiZWx9LCBjc3M6ICdzdmRfdG9vbGJveF9pdGVtXycgKyBpdGVtLmljb25OYW1lLCBrZXkyY2xpY2ssIGNsaWNrTm9Gb2N1czogY2xpY2ssIGV2ZW50OntkcmFnc3RhcnQ6IGRyYWdzdGFydCwgZHJhZ2VuZDogZHJhZ2VuZH1cXFwiPlxcbiAgICA8c3Bhbj5cXG4gICAgICAgIDxzdmctaWNvbiBwYXJhbXM9XFxcImljb25OYW1lOiBpdGVtLmljb25OYW1lXFxcIj48L3N2Zy1pY29uPlxcbiAgICA8L3NwYW4+XFxuICAgIDxzcGFuIGNsYXNzPVxcXCJzdmRfdG9vbGJveF9pdGVtX3RleHRcXFwiIGRhdGEtYmluZD1cXFwidGV4dDogaXRlbS50aXRsZVxcXCI+PC9zcGFuPlxcbjwvZGl2PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJzdmRfdG9vbGJveCBzdmQtZGFyay1iZy1jb2xvclxcXCI+XFxuICA8IS0tIGtvIGlmOiBrb0hhc0NhdGVnb3JpZXMgLS0+XFxuICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ncm91cFxcXCIgcm9sZT1cXFwidGFibGlzdFxcXCIgZGF0YS1iaW5kPVxcXCJmb3JlYWNoOiBrb0NhdGVnb3JpZXNcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1pbmZvXFxcIj5cXG4gICAgICA8ZGl2XFxuICAgICAgICBjbGFzcz1cXFwic3ZkLXRvb2xib3gtY2F0ZWdvcnktaGVhZGVyXFxcIlxcbiAgICAgICAgcm9sZT1cXFwidGFiXFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogZXhwYW5kXFxcIlxcbiAgICAgID5cXG4gICAgICAgIDxzcGFuXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiB7ICdzdmQtbWFpbi1jb2xvcic6ICFrb0NvbGxhcHNlZCgpIH0sIHRleHQ6IG5hbWVcXFwiXFxuICAgICAgICA+PC9zcGFuPlxcbiAgICAgICAgPCEtLWtvIGlmOiAkcGFyZW50LmtvQ2FuQ29sbGFwc2VDYXRlZ29yaWVzIC0tPlxcbiAgICAgICAgPCEtLSBrbyBpZjoga29Db2xsYXBzZWQgLS0+XFxuICAgICAgICA8c3ZnLWljb25cXG4gICAgICAgICAgY2xhc3M9XFxcImljb24tdG9vbGJveC1hcnJvd1xcXCJcXG4gICAgICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24tYXJyb3dfZG93bl8xMHgxMCcsIHNpemU6IDEwXFxcIlxcbiAgICAgICAgPjwvc3ZnLWljb24+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwhLS0ga28gaWZub3Q6IGtvQ29sbGFwc2VkIC0tPlxcbiAgICAgICAgPHN2Zy1pY29uXFxuICAgICAgICAgIGNsYXNzPVxcXCJpY29uLXRvb2xib3gtYXJyb3cgc3ZkLXByaW1hcnktaWNvblxcXCJcXG4gICAgICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24tYXJyb3dfdXBfMTB4MTAnLCBzaXplOiAxMFxcXCJcXG4gICAgICAgID48L3N2Zy1pY29uPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8ZGl2XFxuICAgICAgICByb2xlPVxcXCJ0YWJwYW5lbFxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiB7ICdzdmQtdG9vbGJveC1jYXRlZ29yeS0tY29sbGFwc2VkIHBhbmVsLWNvbGxhcHNlIGNvbGxhcHNlJzoga29Db2xsYXBzZWR9XFxcIlxcbiAgICAgID5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogaXRlbXMgLS0+XFxuICAgICAgICA8c3ZkLXRvb2xib3gtaXRlbVxcbiAgICAgICAgICBwYXJhbXM9XFxcIml0ZW06ICRkYXRhLCBjcmVhdG9yOiAkcGFyZW50c1sxXS5jcmVhdG9yXFxcIlxcbiAgICAgICAgPjwvc3ZkLXRvb2xib3gtaXRlbT5cXG4gICAgICAgIDwhLS0gL2tvICAtLT5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG4gIDwhLS0gL2tvICAtLT5cXG4gIDwhLS0ga28gaWY6ICFrb0hhc0NhdGVnb3JpZXMoKSAtLT5cXG4gIDwhLS0ga28gZm9yZWFjaDoga29JdGVtcyAtLT5cXG4gIDxzdmQtdG9vbGJveC1pdGVtXFxuICAgIHBhcmFtcz1cXFwiaXRlbTogJGRhdGEsIGNyZWF0b3I6ICRwYXJlbnQuY3JlYXRvclxcXCJcXG4gID48L3N2ZC10b29sYm94LWl0ZW0+XFxuICA8IS0tIC9rbyAgLS0+XFxuICA8IS0tIC9rbyAgLS0+XFxuPC9kaXY+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIlwiICsgcmVxdWlyZSgnLi9pbmRleC5odG1sJykgKyBcIiBcIiArIHJlcXVpcmUoJy4vcXVlc3Rpb25FZGl0b3JzL3F1ZXN0aW9uZWRpdG9yLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eWVkaXRvci10cmlnZ2Vyc2l0ZW1zLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3Rvb2xiYXIuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL2NvbnZlcnQtYWN0aW9uLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuLi9zdmdidW5kbGUuaHRtbCcpICsgXCIgXCIgKyByZXF1aXJlKCcuL3RhYnMuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vZGVzaWduLXN1cmZhY2UuaHRtbCcpICsgXCJcIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdj5cXG4gIDwhLS0ga28gZm9yZWFjaDogdGFicyAtLT5cXG4gIDxkaXZcXG4gICAgY2xhc3M9XFxcInN2ZC1hY2NvcmRpb24tdGFiLWhlYWRlclxcXCJcXG4gICAgcm9sZT1cXFwidGFiXFxcIlxcbiAgICB0YWJpbmRleD1cXFwiMFxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJjbGljazogdG9nZ2xlLCBrZXkyY2xpY2ssIHZpc2libGU6ICRwYXJlbnQuc2hvd0hlYWRlciwgYXR0cjogeyAnZGF0YS10aXRsZSc6IHRpdGxlIH1cXFwiXFxuICA+XFxuICAgIDxzcGFuXFxuICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6IHsgJ3N2ZC1tYWluLWNvbG9yJzogIWNvbGxhcHNlZCgpIH0sIHRleHQ6IHRpdGxlXFxcIlxcbiAgICA+PC9zcGFuPlxcbiAgICA8IS0tIGtvIGlmOiBjb2xsYXBzZWQgLS0+XFxuICAgIDxzdmctaWNvblxcbiAgICAgIGNsYXNzPVxcXCJpY29uLXRvb2xib3gtYXJyb3dcXFwiXFxuICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24tYXJyb3dfZG93bl8xMHgxMCcsIHNpemU6IDEwXFxcIlxcbiAgICA+PC9zdmctaWNvbj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWZub3Q6IGNvbGxhcHNlZCAtLT5cXG4gICAgPHN2Zy1pY29uXFxuICAgICAgY2xhc3M9XFxcImljb24tdG9vbGJveC1hcnJvdyBzdmQtcHJpbWFyeS1pY29uXFxcIlxcbiAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWFycm93X3VwXzEweDEwJywgc2l6ZTogMTBcXFwiXFxuICAgID48L3N2Zy1pY29uPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZGl2PlxcbiAgPGRpdlxcbiAgICBjbGFzcz1cXFwic3ZkLWFjY29yZGlvbi10YWItY29udGVudFxcXCJcXG4gICAgcm9sZT1cXFwidGFiXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImlmbm90OiBjb2xsYXBzZWRcXFwiXFxuICA+XFxuICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6IGRhdGEuaHRtbFRlbXBsYXRlLCBwYXJhbXM6IHsgbW9kZWw6IGRhdGEudGVtcGxhdGVPYmplY3QsIGFmdGVyUmVuZGVyOiBkYXRhLmtvQWZ0ZXJSZW5kZXIgfHwgZGF0YS5hZnRlclJlbmRlciB9IH0gLS0+PCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvZGl2PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGRhdGEtYmluZD1cXFwiY2xpY2s6IHRvZ2dsZSwgYXR0cjogeyB0aXRsZTogZ2V0TG9jU3RyaW5nKHZpc2libGUoKSA/ICdlZC5oaWRlUGFuZWwnOidlZC5zaG93UGFuZWwnKSB9XFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcImljb24gc3ZkLWljb24tY29udGFpbmVyIHN2ZC1pY29uLWNvbnRhaW5lci0tbGVmdC1vcGVuXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICFpc09wZW4oKVxcXCI+XFxuICAgIDxzdmctaWNvbiBjbGFzcz1cXFwic3ZkLXN2Zy1pY29uXFxcIiBwYXJhbXM9XFxcImljb25OYW1lOiBpY29uTGVmdE9wZW4sIHdpZHRoOiAxNCwgaGVpZ2h0OiAyNFxcXCI+PC9zdmctaWNvbj5cXG4gIDwvZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwiaWNvbiBzdmQtaWNvbi1jb250YWluZXIgc3ZkLWljb24tY29udGFpbmVyLS1sZWZ0LWNsb3NlXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGlzT3BlblxcXCI+XFxuICAgIDxzdmctaWNvbiBjbGFzcz1cXFwic3ZkLXN2Zy1pY29uXFxcIiBwYXJhbXM9XFxcImljb25OYW1lOiBpY29uTGVmdENsb3NlLCB3aWR0aDogMTQsIGhlaWdodDogMjRcXFwiPjwvc3ZnLWljb24+XFxuICA8L2Rpdj5cXG4gIDxkaXYgY2xhc3M9XFxcImljb24gc3ZkLWljb24tY29udGFpbmVyIHN2ZC1pY29uLWNvbnRhaW5lci0tcmlnaHQtb3BlblxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAhaXNPcGVuKClcXFwiPlxcbiAgICA8c3ZnLWljb24gY2xhc3M9XFxcInN2ZC1zdmctaWNvblxcXCIgcGFyYW1zPVxcXCJpY29uTmFtZTogaWNvblJpZ2h0T3Blbiwgd2lkdGg6IDE0LCBoZWlnaHQ6IDI0XFxcIj48L3N2Zy1pY29uPlxcbiAgPC9kaXY+XFxuICA8ZGl2IGNsYXNzPVxcXCJpY29uIHN2ZC1pY29uLWNvbnRhaW5lciBzdmQtaWNvbi1jb250YWluZXItLXJpZ2h0LWNsb3NlXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGlzT3BlblxcXCI+XFxuICAgIDxzdmctaWNvbiBjbGFzcz1cXFwic3ZkLXN2Zy1pY29uXFxcIiBwYXJhbXM9XFxcImljb25OYW1lOiBpY29uUmlnaHRDbG9zZSwgd2lkdGg6IDE0LCBoZWlnaHQ6IDI0XFxcIj48L3N2Zy1pY29uPlxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuXFxuPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY2xhc3NOYW1lXFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJcXFwiIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX3Jvd1xcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19jZWxsXFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogdGFicygpLmxlbmd0aCA+IDEgLS0+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC1kZXNpZ25lci10YWJiZWQtY29udGFpbmVyX190YWItaGVhZGVyLWNvbnRhaW5lclxcXCIgcm9sZT1cXFwidGFibGlzdFxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHRhYnMsIGFzOiAnY29udGVudCcgfSAtLT5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtZGVzaWduZXItdGFiYmVkLWNvbnRhaW5lcl9fdGFiLWhlYWRlclxcXCJcXG4gICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwidGV4dDogJHBhcmVudC5jb250ZXh0LmdldExvY1N0cmluZygnZWQuJyArIGNvbnRlbnQpLCBjbGljazogZnVuY3Rpb24oKSB7ICRwYXJlbnQuYWN0aXZlVGFiKGNvbnRlbnQpOyB9LCBjc3M6IHsgJ3N2ZC1kZXNpZ25lci10YWJiZWQtY29udGFpbmVyX190YWItaGVhZGVyLWFjdGl2ZScgOiBjb250ZW50ID09PSAkcGFyZW50LmFjdGl2ZVRhYigpIH0sIGtleTJjbGljaywgYXR0cjogeyAnYXJpYS1sYWJlbCc6ICRwYXJlbnQuY29udGV4dC5nZXRMb2NTdHJpbmcoJ2VkLicgKyBjb250ZW50KSwgcm9sZTogJ3RhYicgfVxcXCJcXG4gICAgICAgICAgICAgIHRhYmluZGV4PVxcXCIwXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcblxcbiAgICAgICAgICA8IS0tIGtvIGlmOiB0YWJzKCkubGVuZ3RoID09PSAxIC0tPlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtZGVzaWduZXItY29udGFpbmVyX19oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJzdmQtZGVzaWduZXItY29udGFpbmVyX19oZWFkZXItdGl0bGVcXFwiIGRhdGEtYmluZD1cXFwidGV4dDogZ2V0TG9jU3RyaW5nKCdlZC4nICsgdGFicygpWzBdKVxcXCI+PC9zcGFuPlxcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX3Jvd1xcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19jZWxsXFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbC1jb250ZW50LWhvbGRlclxcXCI+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX2NlbGwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogdGFicygpLmxlbmd0aCA+IDEgLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHRhYnMsIGFzOiAnY29udGVudCcgfSAtLT5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtZGVzaWduZXItdGFiYmVkLWNvbnRhaW5lcl9fdGFiLWNvbnRlbnRcXFwiXFxuICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogeyAnc3ZkLWRlc2lnbmVyLXRhYmJlZC1jb250YWluZXJfX3RhYi1jb250ZW50LWFjdGl2ZScgOiBjb250ZW50ID09PSAkcGFyZW50LmFjdGl2ZVRhYigpIH1cXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc2UtY29tcG9uZW50LScgKyBjb250ZW50LCBkYXRhOiAkcGFyZW50LmNvbnRleHQgfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IHRhYnMoKS5sZW5ndGggPT09IDEgLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHRhYnMsIGFzOiAnY29udGVudCcgfSAtLT5cXG5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzZS1jb21wb25lbnQtJyArIGNvbnRlbnQsIGRhdGE6ICRwYXJlbnQuY29udGV4dCB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcblxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gIDwvZGl2PlxcbjwvZGl2PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjbGFzc05hbWVcXFwiPlxcbiAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IGl0ZW1zLCBhczogJ2NvbnRlbnQnIH0gLS0+XFxuICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzZS1jb21wb25lbnQtJyArIGNvbnRlbnQsIGRhdGE6ICRwYXJlbnQuY29udGV4dCB9IC0tPlxcbiAgPCEtLSAva28gLS0+XFxuICA8IS0tIC9rbyAtLT5cXG48L2Rpdj5cXG5cIjsiLCIvKiBAbGljZW5zZVxuUGFwYSBQYXJzZVxudjUuMy4wXG5odHRwczovL2dpdGh1Yi5jb20vbWhvbHQvUGFwYVBhcnNlXG5MaWNlbnNlOiBNSVRcbiovXG4hZnVuY3Rpb24oZSx0KXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLHQpOlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXQoKTplLlBhcGE9dCgpfSh0aGlzLGZ1bmN0aW9uIHMoKXtcInVzZSBzdHJpY3RcIjt2YXIgZj1cInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnZvaWQgMCE9PWY/Zjp7fTt2YXIgbj0hZi5kb2N1bWVudCYmISFmLnBvc3RNZXNzYWdlLG89biYmL2Jsb2I6L2kudGVzdCgoZi5sb2NhdGlvbnx8e30pLnByb3RvY29sKSxhPXt9LGg9MCxiPXtwYXJzZTpmdW5jdGlvbihlLHQpe3ZhciBpPSh0PXR8fHt9KS5keW5hbWljVHlwaW5nfHwhMTtVKGkpJiYodC5keW5hbWljVHlwaW5nRnVuY3Rpb249aSxpPXt9KTtpZih0LmR5bmFtaWNUeXBpbmc9aSx0LnRyYW5zZm9ybT0hIVUodC50cmFuc2Zvcm0pJiZ0LnRyYW5zZm9ybSx0LndvcmtlciYmYi5XT1JLRVJTX1NVUFBPUlRFRCl7dmFyIHI9ZnVuY3Rpb24oKXtpZighYi5XT1JLRVJTX1NVUFBPUlRFRClyZXR1cm4hMTt2YXIgZT0oaT1mLlVSTHx8Zi53ZWJraXRVUkx8fG51bGwscj1zLnRvU3RyaW5nKCksYi5CTE9CX1VSTHx8KGIuQkxPQl9VUkw9aS5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW1wiKFwiLHIsXCIpKCk7XCJdLHt0eXBlOlwidGV4dC9qYXZhc2NyaXB0XCJ9KSkpKSx0PW5ldyBmLldvcmtlcihlKTt2YXIgaSxyO3JldHVybiB0Lm9ubWVzc2FnZT1tLHQuaWQ9aCsrLGFbdC5pZF09dH0oKTtyZXR1cm4gci51c2VyU3RlcD10LnN0ZXAsci51c2VyQ2h1bms9dC5jaHVuayxyLnVzZXJDb21wbGV0ZT10LmNvbXBsZXRlLHIudXNlckVycm9yPXQuZXJyb3IsdC5zdGVwPVUodC5zdGVwKSx0LmNodW5rPVUodC5jaHVuayksdC5jb21wbGV0ZT1VKHQuY29tcGxldGUpLHQuZXJyb3I9VSh0LmVycm9yKSxkZWxldGUgdC53b3JrZXIsdm9pZCByLnBvc3RNZXNzYWdlKHtpbnB1dDplLGNvbmZpZzp0LHdvcmtlcklkOnIuaWR9KX12YXIgbj1udWxsO2IuTk9ERV9TVFJFQU1fSU5QVVQsXCJzdHJpbmdcIj09dHlwZW9mIGU/bj10LmRvd25sb2FkP25ldyBsKHQpOm5ldyBwKHQpOiEwPT09ZS5yZWFkYWJsZSYmVShlLnJlYWQpJiZVKGUub24pP249bmV3IGcodCk6KGYuRmlsZSYmZSBpbnN0YW5jZW9mIEZpbGV8fGUgaW5zdGFuY2VvZiBPYmplY3QpJiYobj1uZXcgYyh0KSk7cmV0dXJuIG4uc3RyZWFtKGUpfSx1bnBhcnNlOmZ1bmN0aW9uKGUsdCl7dmFyIG49ITEsbT0hMCxfPVwiLFwiLHY9XCJcXHJcXG5cIixzPSdcIicsYT1zK3MsaT0hMSxyPW51bGwsbz0hMTshZnVuY3Rpb24oKXtpZihcIm9iamVjdFwiIT10eXBlb2YgdClyZXR1cm47XCJzdHJpbmdcIiE9dHlwZW9mIHQuZGVsaW1pdGVyfHxiLkJBRF9ERUxJTUlURVJTLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4tMSE9PXQuZGVsaW1pdGVyLmluZGV4T2YoZSl9KS5sZW5ndGh8fChfPXQuZGVsaW1pdGVyKTsoXCJib29sZWFuXCI9PXR5cGVvZiB0LnF1b3Rlc3x8XCJmdW5jdGlvblwiPT10eXBlb2YgdC5xdW90ZXN8fEFycmF5LmlzQXJyYXkodC5xdW90ZXMpKSYmKG49dC5xdW90ZXMpO1wiYm9vbGVhblwiIT10eXBlb2YgdC5za2lwRW1wdHlMaW5lcyYmXCJzdHJpbmdcIiE9dHlwZW9mIHQuc2tpcEVtcHR5TGluZXN8fChpPXQuc2tpcEVtcHR5TGluZXMpO1wic3RyaW5nXCI9PXR5cGVvZiB0Lm5ld2xpbmUmJih2PXQubmV3bGluZSk7XCJzdHJpbmdcIj09dHlwZW9mIHQucXVvdGVDaGFyJiYocz10LnF1b3RlQ2hhcik7XCJib29sZWFuXCI9PXR5cGVvZiB0LmhlYWRlciYmKG09dC5oZWFkZXIpO2lmKEFycmF5LmlzQXJyYXkodC5jb2x1bW5zKSl7aWYoMD09PXQuY29sdW1ucy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiT3B0aW9uIGNvbHVtbnMgaXMgZW1wdHlcIik7cj10LmNvbHVtbnN9dm9pZCAwIT09dC5lc2NhcGVDaGFyJiYoYT10LmVzY2FwZUNoYXIrcyk7XCJib29sZWFuXCI9PXR5cGVvZiB0LmVzY2FwZUZvcm11bGFlJiYobz10LmVzY2FwZUZvcm11bGFlKX0oKTt2YXIgaD1uZXcgUmVnRXhwKHEocyksXCJnXCIpO1wic3RyaW5nXCI9PXR5cGVvZiBlJiYoZT1KU09OLnBhcnNlKGUpKTtpZihBcnJheS5pc0FycmF5KGUpKXtpZighZS5sZW5ndGh8fEFycmF5LmlzQXJyYXkoZVswXSkpcmV0dXJuIGYobnVsbCxlLGkpO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBlWzBdKXJldHVybiBmKHJ8fHUoZVswXSksZSxpKX1lbHNlIGlmKFwib2JqZWN0XCI9PXR5cGVvZiBlKXJldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlLmRhdGEmJihlLmRhdGE9SlNPTi5wYXJzZShlLmRhdGEpKSxBcnJheS5pc0FycmF5KGUuZGF0YSkmJihlLmZpZWxkc3x8KGUuZmllbGRzPWUubWV0YSYmZS5tZXRhLmZpZWxkcyksZS5maWVsZHN8fChlLmZpZWxkcz1BcnJheS5pc0FycmF5KGUuZGF0YVswXSk/ZS5maWVsZHM6dShlLmRhdGFbMF0pKSxBcnJheS5pc0FycmF5KGUuZGF0YVswXSl8fFwib2JqZWN0XCI9PXR5cGVvZiBlLmRhdGFbMF18fChlLmRhdGE9W2UuZGF0YV0pKSxmKGUuZmllbGRzfHxbXSxlLmRhdGF8fFtdLGkpO3Rocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBzZXJpYWxpemUgdW5yZWNvZ25pemVkIGlucHV0XCIpO2Z1bmN0aW9uIHUoZSl7aWYoXCJvYmplY3RcIiE9dHlwZW9mIGUpcmV0dXJuW107dmFyIHQ9W107Zm9yKHZhciBpIGluIGUpdC5wdXNoKGkpO3JldHVybiB0fWZ1bmN0aW9uIGYoZSx0LGkpe3ZhciByPVwiXCI7XCJzdHJpbmdcIj09dHlwZW9mIGUmJihlPUpTT04ucGFyc2UoZSkpLFwic3RyaW5nXCI9PXR5cGVvZiB0JiYodD1KU09OLnBhcnNlKHQpKTt2YXIgbj1BcnJheS5pc0FycmF5KGUpJiYwPGUubGVuZ3RoLHM9IUFycmF5LmlzQXJyYXkodFswXSk7aWYobiYmbSl7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspMDxhJiYocis9Xykscis9eShlW2FdLGEpOzA8dC5sZW5ndGgmJihyKz12KX1mb3IodmFyIG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIGg9bj9lLmxlbmd0aDp0W29dLmxlbmd0aCx1PSExLGY9bj8wPT09T2JqZWN0LmtleXModFtvXSkubGVuZ3RoOjA9PT10W29dLmxlbmd0aDtpZihpJiYhbiYmKHU9XCJncmVlZHlcIj09PWk/XCJcIj09PXRbb10uam9pbihcIlwiKS50cmltKCk6MT09PXRbb10ubGVuZ3RoJiYwPT09dFtvXVswXS5sZW5ndGgpLFwiZ3JlZWR5XCI9PT1pJiZuKXtmb3IodmFyIGQ9W10sbD0wO2w8aDtsKyspe3ZhciBjPXM/ZVtsXTpsO2QucHVzaCh0W29dW2NdKX11PVwiXCI9PT1kLmpvaW4oXCJcIikudHJpbSgpfWlmKCF1KXtmb3IodmFyIHA9MDtwPGg7cCsrKXswPHAmJiFmJiYocis9Xyk7dmFyIGc9biYmcz9lW3BdOnA7cis9eSh0W29dW2ddLHApfW88dC5sZW5ndGgtMSYmKCFpfHwwPGgmJiFmKSYmKHIrPXYpfX1yZXR1cm4gcn1mdW5jdGlvbiB5KGUsdCl7aWYobnVsbD09ZSlyZXR1cm5cIlwiO2lmKGUuY29uc3RydWN0b3I9PT1EYXRlKXJldHVybiBKU09OLnN0cmluZ2lmeShlKS5zbGljZSgxLDI1KTshMD09PW8mJlwic3RyaW5nXCI9PXR5cGVvZiBlJiZudWxsIT09ZS5tYXRjaCgvXls9K1xcLUBdLiokLykmJihlPVwiJ1wiK2UpO3ZhciBpPWUudG9TdHJpbmcoKS5yZXBsYWNlKGgsYSkscj1cImJvb2xlYW5cIj09dHlwZW9mIG4mJm58fFwiZnVuY3Rpb25cIj09dHlwZW9mIG4mJm4oZSx0KXx8QXJyYXkuaXNBcnJheShuKSYmblt0XXx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKylpZigtMTxlLmluZGV4T2YodFtpXSkpcmV0dXJuITA7cmV0dXJuITF9KGksYi5CQURfREVMSU1JVEVSUyl8fC0xPGkuaW5kZXhPZihfKXx8XCIgXCI9PT1pLmNoYXJBdCgwKXx8XCIgXCI9PT1pLmNoYXJBdChpLmxlbmd0aC0xKTtyZXR1cm4gcj9zK2krczppfX19O2lmKGIuUkVDT1JEX1NFUD1TdHJpbmcuZnJvbUNoYXJDb2RlKDMwKSxiLlVOSVRfU0VQPVN0cmluZy5mcm9tQ2hhckNvZGUoMzEpLGIuQllURV9PUkRFUl9NQVJLPVwiXFx1ZmVmZlwiLGIuQkFEX0RFTElNSVRFUlM9W1wiXFxyXCIsXCJcXG5cIiwnXCInLGIuQllURV9PUkRFUl9NQVJLXSxiLldPUktFUlNfU1VQUE9SVEVEPSFuJiYhIWYuV29ya2VyLGIuTk9ERV9TVFJFQU1fSU5QVVQ9MSxiLkxvY2FsQ2h1bmtTaXplPTEwNDg1NzYwLGIuUmVtb3RlQ2h1bmtTaXplPTUyNDI4ODAsYi5EZWZhdWx0RGVsaW1pdGVyPVwiLFwiLGIuUGFyc2VyPXcsYi5QYXJzZXJIYW5kbGU9aSxiLk5ldHdvcmtTdHJlYW1lcj1sLGIuRmlsZVN0cmVhbWVyPWMsYi5TdHJpbmdTdHJlYW1lcj1wLGIuUmVhZGFibGVTdHJlYW1TdHJlYW1lcj1nLGYualF1ZXJ5KXt2YXIgZD1mLmpRdWVyeTtkLmZuLnBhcnNlPWZ1bmN0aW9uKG8pe3ZhciBpPW8uY29uZmlnfHx7fSxoPVtdO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7aWYoIShcIklOUFVUXCI9PT1kKHRoaXMpLnByb3AoXCJ0YWdOYW1lXCIpLnRvVXBwZXJDYXNlKCkmJlwiZmlsZVwiPT09ZCh0aGlzKS5hdHRyKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpJiZmLkZpbGVSZWFkZXIpfHwhdGhpcy5maWxlc3x8MD09PXRoaXMuZmlsZXMubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgdD0wO3Q8dGhpcy5maWxlcy5sZW5ndGg7dCsrKWgucHVzaCh7ZmlsZTp0aGlzLmZpbGVzW3RdLGlucHV0RWxlbTp0aGlzLGluc3RhbmNlQ29uZmlnOmQuZXh0ZW5kKHt9LGkpfSl9KSxlKCksdGhpcztmdW5jdGlvbiBlKCl7aWYoMCE9PWgubGVuZ3RoKXt2YXIgZSx0LGkscixuPWhbMF07aWYoVShvLmJlZm9yZSkpe3ZhciBzPW8uYmVmb3JlKG4uZmlsZSxuLmlucHV0RWxlbSk7aWYoXCJvYmplY3RcIj09dHlwZW9mIHMpe2lmKFwiYWJvcnRcIj09PXMuYWN0aW9uKXJldHVybiBlPVwiQWJvcnRFcnJvclwiLHQ9bi5maWxlLGk9bi5pbnB1dEVsZW0scj1zLnJlYXNvbix2b2lkKFUoby5lcnJvcikmJm8uZXJyb3Ioe25hbWU6ZX0sdCxpLHIpKTtpZihcInNraXBcIj09PXMuYWN0aW9uKXJldHVybiB2b2lkIHUoKTtcIm9iamVjdFwiPT10eXBlb2Ygcy5jb25maWcmJihuLmluc3RhbmNlQ29uZmlnPWQuZXh0ZW5kKG4uaW5zdGFuY2VDb25maWcscy5jb25maWcpKX1lbHNlIGlmKFwic2tpcFwiPT09cylyZXR1cm4gdm9pZCB1KCl9dmFyIGE9bi5pbnN0YW5jZUNvbmZpZy5jb21wbGV0ZTtuLmluc3RhbmNlQ29uZmlnLmNvbXBsZXRlPWZ1bmN0aW9uKGUpe1UoYSkmJmEoZSxuLmZpbGUsbi5pbnB1dEVsZW0pLHUoKX0sYi5wYXJzZShuLmZpbGUsbi5pbnN0YW5jZUNvbmZpZyl9ZWxzZSBVKG8uY29tcGxldGUpJiZvLmNvbXBsZXRlKCl9ZnVuY3Rpb24gdSgpe2guc3BsaWNlKDAsMSksZSgpfX19ZnVuY3Rpb24gdShlKXt0aGlzLl9oYW5kbGU9bnVsbCx0aGlzLl9maW5pc2hlZD0hMSx0aGlzLl9jb21wbGV0ZWQ9ITEsdGhpcy5faGFsdGVkPSExLHRoaXMuX2lucHV0PW51bGwsdGhpcy5fYmFzZUluZGV4PTAsdGhpcy5fcGFydGlhbExpbmU9XCJcIix0aGlzLl9yb3dDb3VudD0wLHRoaXMuX3N0YXJ0PTAsdGhpcy5fbmV4dENodW5rPW51bGwsdGhpcy5pc0ZpcnN0Q2h1bms9ITAsdGhpcy5fY29tcGxldGVSZXN1bHRzPXtkYXRhOltdLGVycm9yczpbXSxtZXRhOnt9fSxmdW5jdGlvbihlKXt2YXIgdD1FKGUpO3QuY2h1bmtTaXplPXBhcnNlSW50KHQuY2h1bmtTaXplKSxlLnN0ZXB8fGUuY2h1bmt8fCh0LmNodW5rU2l6ZT1udWxsKTt0aGlzLl9oYW5kbGU9bmV3IGkodCksKHRoaXMuX2hhbmRsZS5zdHJlYW1lcj10aGlzKS5fY29uZmlnPXR9LmNhbGwodGhpcyxlKSx0aGlzLnBhcnNlQ2h1bms9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmlzRmlyc3RDaHVuayYmVSh0aGlzLl9jb25maWcuYmVmb3JlRmlyc3RDaHVuaykpe3ZhciBpPXRoaXMuX2NvbmZpZy5iZWZvcmVGaXJzdENodW5rKGUpO3ZvaWQgMCE9PWkmJihlPWkpfXRoaXMuaXNGaXJzdENodW5rPSExLHRoaXMuX2hhbHRlZD0hMTt2YXIgcj10aGlzLl9wYXJ0aWFsTGluZStlO3RoaXMuX3BhcnRpYWxMaW5lPVwiXCI7dmFyIG49dGhpcy5faGFuZGxlLnBhcnNlKHIsdGhpcy5fYmFzZUluZGV4LCF0aGlzLl9maW5pc2hlZCk7aWYoIXRoaXMuX2hhbmRsZS5wYXVzZWQoKSYmIXRoaXMuX2hhbmRsZS5hYm9ydGVkKCkpe3ZhciBzPW4ubWV0YS5jdXJzb3I7dGhpcy5fZmluaXNoZWR8fCh0aGlzLl9wYXJ0aWFsTGluZT1yLnN1YnN0cmluZyhzLXRoaXMuX2Jhc2VJbmRleCksdGhpcy5fYmFzZUluZGV4PXMpLG4mJm4uZGF0YSYmKHRoaXMuX3Jvd0NvdW50Kz1uLmRhdGEubGVuZ3RoKTt2YXIgYT10aGlzLl9maW5pc2hlZHx8dGhpcy5fY29uZmlnLnByZXZpZXcmJnRoaXMuX3Jvd0NvdW50Pj10aGlzLl9jb25maWcucHJldmlldztpZihvKWYucG9zdE1lc3NhZ2Uoe3Jlc3VsdHM6bix3b3JrZXJJZDpiLldPUktFUl9JRCxmaW5pc2hlZDphfSk7ZWxzZSBpZihVKHRoaXMuX2NvbmZpZy5jaHVuaykmJiF0KXtpZih0aGlzLl9jb25maWcuY2h1bmsobix0aGlzLl9oYW5kbGUpLHRoaXMuX2hhbmRsZS5wYXVzZWQoKXx8dGhpcy5faGFuZGxlLmFib3J0ZWQoKSlyZXR1cm4gdm9pZCh0aGlzLl9oYWx0ZWQ9ITApO249dm9pZCAwLHRoaXMuX2NvbXBsZXRlUmVzdWx0cz12b2lkIDB9cmV0dXJuIHRoaXMuX2NvbmZpZy5zdGVwfHx0aGlzLl9jb25maWcuY2h1bmt8fCh0aGlzLl9jb21wbGV0ZVJlc3VsdHMuZGF0YT10aGlzLl9jb21wbGV0ZVJlc3VsdHMuZGF0YS5jb25jYXQobi5kYXRhKSx0aGlzLl9jb21wbGV0ZVJlc3VsdHMuZXJyb3JzPXRoaXMuX2NvbXBsZXRlUmVzdWx0cy5lcnJvcnMuY29uY2F0KG4uZXJyb3JzKSx0aGlzLl9jb21wbGV0ZVJlc3VsdHMubWV0YT1uLm1ldGEpLHRoaXMuX2NvbXBsZXRlZHx8IWF8fCFVKHRoaXMuX2NvbmZpZy5jb21wbGV0ZSl8fG4mJm4ubWV0YS5hYm9ydGVkfHwodGhpcy5fY29uZmlnLmNvbXBsZXRlKHRoaXMuX2NvbXBsZXRlUmVzdWx0cyx0aGlzLl9pbnB1dCksdGhpcy5fY29tcGxldGVkPSEwKSxhfHxuJiZuLm1ldGEucGF1c2VkfHx0aGlzLl9uZXh0Q2h1bmsoKSxufXRoaXMuX2hhbHRlZD0hMH0sdGhpcy5fc2VuZEVycm9yPWZ1bmN0aW9uKGUpe1UodGhpcy5fY29uZmlnLmVycm9yKT90aGlzLl9jb25maWcuZXJyb3IoZSk6byYmdGhpcy5fY29uZmlnLmVycm9yJiZmLnBvc3RNZXNzYWdlKHt3b3JrZXJJZDpiLldPUktFUl9JRCxlcnJvcjplLGZpbmlzaGVkOiExfSl9fWZ1bmN0aW9uIGwoZSl7dmFyIHI7KGU9ZXx8e30pLmNodW5rU2l6ZXx8KGUuY2h1bmtTaXplPWIuUmVtb3RlQ2h1bmtTaXplKSx1LmNhbGwodGhpcyxlKSx0aGlzLl9uZXh0Q2h1bms9bj9mdW5jdGlvbigpe3RoaXMuX3JlYWRDaHVuaygpLHRoaXMuX2NodW5rTG9hZGVkKCl9OmZ1bmN0aW9uKCl7dGhpcy5fcmVhZENodW5rKCl9LHRoaXMuc3RyZWFtPWZ1bmN0aW9uKGUpe3RoaXMuX2lucHV0PWUsdGhpcy5fbmV4dENodW5rKCl9LHRoaXMuX3JlYWRDaHVuaz1mdW5jdGlvbigpe2lmKHRoaXMuX2ZpbmlzaGVkKXRoaXMuX2NodW5rTG9hZGVkKCk7ZWxzZXtpZihyPW5ldyBYTUxIdHRwUmVxdWVzdCx0aGlzLl9jb25maWcud2l0aENyZWRlbnRpYWxzJiYoci53aXRoQ3JlZGVudGlhbHM9dGhpcy5fY29uZmlnLndpdGhDcmVkZW50aWFscyksbnx8KHIub25sb2FkPXkodGhpcy5fY2h1bmtMb2FkZWQsdGhpcyksci5vbmVycm9yPXkodGhpcy5fY2h1bmtFcnJvcix0aGlzKSksci5vcGVuKHRoaXMuX2NvbmZpZy5kb3dubG9hZFJlcXVlc3RCb2R5P1wiUE9TVFwiOlwiR0VUXCIsdGhpcy5faW5wdXQsIW4pLHRoaXMuX2NvbmZpZy5kb3dubG9hZFJlcXVlc3RIZWFkZXJzKXt2YXIgZT10aGlzLl9jb25maWcuZG93bmxvYWRSZXF1ZXN0SGVhZGVycztmb3IodmFyIHQgaW4gZSlyLnNldFJlcXVlc3RIZWFkZXIodCxlW3RdKX1pZih0aGlzLl9jb25maWcuY2h1bmtTaXplKXt2YXIgaT10aGlzLl9zdGFydCt0aGlzLl9jb25maWcuY2h1bmtTaXplLTE7ci5zZXRSZXF1ZXN0SGVhZGVyKFwiUmFuZ2VcIixcImJ5dGVzPVwiK3RoaXMuX3N0YXJ0K1wiLVwiK2kpfXRyeXtyLnNlbmQodGhpcy5fY29uZmlnLmRvd25sb2FkUmVxdWVzdEJvZHkpfWNhdGNoKGUpe3RoaXMuX2NodW5rRXJyb3IoZS5tZXNzYWdlKX1uJiYwPT09ci5zdGF0dXMmJnRoaXMuX2NodW5rRXJyb3IoKX19LHRoaXMuX2NodW5rTG9hZGVkPWZ1bmN0aW9uKCl7ND09PXIucmVhZHlTdGF0ZSYmKHIuc3RhdHVzPDIwMHx8NDAwPD1yLnN0YXR1cz90aGlzLl9jaHVua0Vycm9yKCk6KHRoaXMuX3N0YXJ0Kz10aGlzLl9jb25maWcuY2h1bmtTaXplP3RoaXMuX2NvbmZpZy5jaHVua1NpemU6ci5yZXNwb25zZVRleHQubGVuZ3RoLHRoaXMuX2ZpbmlzaGVkPSF0aGlzLl9jb25maWcuY2h1bmtTaXplfHx0aGlzLl9zdGFydD49ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtUmFuZ2VcIik7aWYobnVsbD09PXQpcmV0dXJuLTE7cmV0dXJuIHBhcnNlSW50KHQuc3Vic3RyaW5nKHQubGFzdEluZGV4T2YoXCIvXCIpKzEpKX0ociksdGhpcy5wYXJzZUNodW5rKHIucmVzcG9uc2VUZXh0KSkpfSx0aGlzLl9jaHVua0Vycm9yPWZ1bmN0aW9uKGUpe3ZhciB0PXIuc3RhdHVzVGV4dHx8ZTt0aGlzLl9zZW5kRXJyb3IobmV3IEVycm9yKHQpKX19ZnVuY3Rpb24gYyhlKXt2YXIgcixuOyhlPWV8fHt9KS5jaHVua1NpemV8fChlLmNodW5rU2l6ZT1iLkxvY2FsQ2h1bmtTaXplKSx1LmNhbGwodGhpcyxlKTt2YXIgcz1cInVuZGVmaW5lZFwiIT10eXBlb2YgRmlsZVJlYWRlcjt0aGlzLnN0cmVhbT1mdW5jdGlvbihlKXt0aGlzLl9pbnB1dD1lLG49ZS5zbGljZXx8ZS53ZWJraXRTbGljZXx8ZS5tb3pTbGljZSxzPygocj1uZXcgRmlsZVJlYWRlcikub25sb2FkPXkodGhpcy5fY2h1bmtMb2FkZWQsdGhpcyksci5vbmVycm9yPXkodGhpcy5fY2h1bmtFcnJvcix0aGlzKSk6cj1uZXcgRmlsZVJlYWRlclN5bmMsdGhpcy5fbmV4dENodW5rKCl9LHRoaXMuX25leHRDaHVuaz1mdW5jdGlvbigpe3RoaXMuX2ZpbmlzaGVkfHx0aGlzLl9jb25maWcucHJldmlldyYmISh0aGlzLl9yb3dDb3VudDx0aGlzLl9jb25maWcucHJldmlldyl8fHRoaXMuX3JlYWRDaHVuaygpfSx0aGlzLl9yZWFkQ2h1bms9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9pbnB1dDtpZih0aGlzLl9jb25maWcuY2h1bmtTaXplKXt2YXIgdD1NYXRoLm1pbih0aGlzLl9zdGFydCt0aGlzLl9jb25maWcuY2h1bmtTaXplLHRoaXMuX2lucHV0LnNpemUpO2U9bi5jYWxsKGUsdGhpcy5fc3RhcnQsdCl9dmFyIGk9ci5yZWFkQXNUZXh0KGUsdGhpcy5fY29uZmlnLmVuY29kaW5nKTtzfHx0aGlzLl9jaHVua0xvYWRlZCh7dGFyZ2V0OntyZXN1bHQ6aX19KX0sdGhpcy5fY2h1bmtMb2FkZWQ9ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnQrPXRoaXMuX2NvbmZpZy5jaHVua1NpemUsdGhpcy5fZmluaXNoZWQ9IXRoaXMuX2NvbmZpZy5jaHVua1NpemV8fHRoaXMuX3N0YXJ0Pj10aGlzLl9pbnB1dC5zaXplLHRoaXMucGFyc2VDaHVuayhlLnRhcmdldC5yZXN1bHQpfSx0aGlzLl9jaHVua0Vycm9yPWZ1bmN0aW9uKCl7dGhpcy5fc2VuZEVycm9yKHIuZXJyb3IpfX1mdW5jdGlvbiBwKGUpe3ZhciBpO3UuY2FsbCh0aGlzLGU9ZXx8e30pLHRoaXMuc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiBpPWUsdGhpcy5fbmV4dENodW5rKCl9LHRoaXMuX25leHRDaHVuaz1mdW5jdGlvbigpe2lmKCF0aGlzLl9maW5pc2hlZCl7dmFyIGUsdD10aGlzLl9jb25maWcuY2h1bmtTaXplO3JldHVybiB0PyhlPWkuc3Vic3RyaW5nKDAsdCksaT1pLnN1YnN0cmluZyh0KSk6KGU9aSxpPVwiXCIpLHRoaXMuX2ZpbmlzaGVkPSFpLHRoaXMucGFyc2VDaHVuayhlKX19fWZ1bmN0aW9uIGcoZSl7dS5jYWxsKHRoaXMsZT1lfHx7fSk7dmFyIHQ9W10saT0hMCxyPSExO3RoaXMucGF1c2U9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5wYXVzZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5faW5wdXQucGF1c2UoKX0sdGhpcy5yZXN1bWU9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5yZXN1bWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2lucHV0LnJlc3VtZSgpfSx0aGlzLnN0cmVhbT1mdW5jdGlvbihlKXt0aGlzLl9pbnB1dD1lLHRoaXMuX2lucHV0Lm9uKFwiZGF0YVwiLHRoaXMuX3N0cmVhbURhdGEpLHRoaXMuX2lucHV0Lm9uKFwiZW5kXCIsdGhpcy5fc3RyZWFtRW5kKSx0aGlzLl9pbnB1dC5vbihcImVycm9yXCIsdGhpcy5fc3RyZWFtRXJyb3IpfSx0aGlzLl9jaGVja0lzRmluaXNoZWQ9ZnVuY3Rpb24oKXtyJiYxPT09dC5sZW5ndGgmJih0aGlzLl9maW5pc2hlZD0hMCl9LHRoaXMuX25leHRDaHVuaz1mdW5jdGlvbigpe3RoaXMuX2NoZWNrSXNGaW5pc2hlZCgpLHQubGVuZ3RoP3RoaXMucGFyc2VDaHVuayh0LnNoaWZ0KCkpOmk9ITB9LHRoaXMuX3N0cmVhbURhdGE9eShmdW5jdGlvbihlKXt0cnl7dC5wdXNoKFwic3RyaW5nXCI9PXR5cGVvZiBlP2U6ZS50b1N0cmluZyh0aGlzLl9jb25maWcuZW5jb2RpbmcpKSxpJiYoaT0hMSx0aGlzLl9jaGVja0lzRmluaXNoZWQoKSx0aGlzLnBhcnNlQ2h1bmsodC5zaGlmdCgpKSl9Y2F0Y2goZSl7dGhpcy5fc3RyZWFtRXJyb3IoZSl9fSx0aGlzKSx0aGlzLl9zdHJlYW1FcnJvcj15KGZ1bmN0aW9uKGUpe3RoaXMuX3N0cmVhbUNsZWFuVXAoKSx0aGlzLl9zZW5kRXJyb3IoZSl9LHRoaXMpLHRoaXMuX3N0cmVhbUVuZD15KGZ1bmN0aW9uKCl7dGhpcy5fc3RyZWFtQ2xlYW5VcCgpLHI9ITAsdGhpcy5fc3RyZWFtRGF0YShcIlwiKX0sdGhpcyksdGhpcy5fc3RyZWFtQ2xlYW5VcD15KGZ1bmN0aW9uKCl7dGhpcy5faW5wdXQucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsdGhpcy5fc3RyZWFtRGF0YSksdGhpcy5faW5wdXQucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIix0aGlzLl9zdHJlYW1FbmQpLHRoaXMuX2lucHV0LnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIix0aGlzLl9zdHJlYW1FcnJvcil9LHRoaXMpfWZ1bmN0aW9uIGkoXyl7dmFyIGEsbyxoLHI9TWF0aC5wb3coMiw1Myksbj0tcixzPS9eXFxzKi0/KFxcZCtcXC4/fFxcLlxcZCt8XFxkK1xcLlxcZCspKGVbLStdP1xcZCspP1xccyokLyx1PS8oXFxkezR9LVswMV1cXGQtWzAtM11cXGRUWzAtMl1cXGQ6WzAtNV1cXGQ6WzAtNV1cXGRcXC5cXGQrKFsrLV1bMC0yXVxcZDpbMC01XVxcZHxaKSl8KFxcZHs0fS1bMDFdXFxkLVswLTNdXFxkVFswLTJdXFxkOlswLTVdXFxkOlswLTVdXFxkKFsrLV1bMC0yXVxcZDpbMC01XVxcZHxaKSl8KFxcZHs0fS1bMDFdXFxkLVswLTNdXFxkVFswLTJdXFxkOlswLTVdXFxkKFsrLV1bMC0yXVxcZDpbMC01XVxcZHxaKSkvLHQ9dGhpcyxpPTAsZj0wLGQ9ITEsZT0hMSxsPVtdLGM9e2RhdGE6W10sZXJyb3JzOltdLG1ldGE6e319O2lmKFUoXy5zdGVwKSl7dmFyIHA9Xy5zdGVwO18uc3RlcD1mdW5jdGlvbihlKXtpZihjPWUsbSgpKWcoKTtlbHNle2lmKGcoKSwwPT09Yy5kYXRhLmxlbmd0aClyZXR1cm47aSs9ZS5kYXRhLmxlbmd0aCxfLnByZXZpZXcmJmk+Xy5wcmV2aWV3P28uYWJvcnQoKTooYy5kYXRhPWMuZGF0YVswXSxwKGMsdCkpfX19ZnVuY3Rpb24gdihlKXtyZXR1cm5cImdyZWVkeVwiPT09Xy5za2lwRW1wdHlMaW5lcz9cIlwiPT09ZS5qb2luKFwiXCIpLnRyaW0oKToxPT09ZS5sZW5ndGgmJjA9PT1lWzBdLmxlbmd0aH1mdW5jdGlvbiBnKCl7aWYoYyYmaCYmKGsoXCJEZWxpbWl0ZXJcIixcIlVuZGV0ZWN0YWJsZURlbGltaXRlclwiLFwiVW5hYmxlIHRvIGF1dG8tZGV0ZWN0IGRlbGltaXRpbmcgY2hhcmFjdGVyOyBkZWZhdWx0ZWQgdG8gJ1wiK2IuRGVmYXVsdERlbGltaXRlcitcIidcIiksaD0hMSksXy5za2lwRW1wdHlMaW5lcylmb3IodmFyIGU9MDtlPGMuZGF0YS5sZW5ndGg7ZSsrKXYoYy5kYXRhW2VdKSYmYy5kYXRhLnNwbGljZShlLS0sMSk7cmV0dXJuIG0oKSYmZnVuY3Rpb24oKXtpZighYylyZXR1cm47ZnVuY3Rpb24gZShlLHQpe1UoXy50cmFuc2Zvcm1IZWFkZXIpJiYoZT1fLnRyYW5zZm9ybUhlYWRlcihlLHQpKSxsLnB1c2goZSl9aWYoQXJyYXkuaXNBcnJheShjLmRhdGFbMF0pKXtmb3IodmFyIHQ9MDttKCkmJnQ8Yy5kYXRhLmxlbmd0aDt0KyspYy5kYXRhW3RdLmZvckVhY2goZSk7Yy5kYXRhLnNwbGljZSgwLDEpfWVsc2UgYy5kYXRhLmZvckVhY2goZSl9KCksZnVuY3Rpb24oKXtpZighY3x8IV8uaGVhZGVyJiYhXy5keW5hbWljVHlwaW5nJiYhXy50cmFuc2Zvcm0pcmV0dXJuIGM7ZnVuY3Rpb24gZShlLHQpe3ZhciBpLHI9Xy5oZWFkZXI/e306W107Zm9yKGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49aSxzPWVbaV07Xy5oZWFkZXImJihuPWk+PWwubGVuZ3RoP1wiX19wYXJzZWRfZXh0cmFcIjpsW2ldKSxfLnRyYW5zZm9ybSYmKHM9Xy50cmFuc2Zvcm0ocyxuKSkscz15KG4scyksXCJfX3BhcnNlZF9leHRyYVwiPT09bj8ocltuXT1yW25dfHxbXSxyW25dLnB1c2gocykpOnJbbl09c31yZXR1cm4gXy5oZWFkZXImJihpPmwubGVuZ3RoP2soXCJGaWVsZE1pc21hdGNoXCIsXCJUb29NYW55RmllbGRzXCIsXCJUb28gbWFueSBmaWVsZHM6IGV4cGVjdGVkIFwiK2wubGVuZ3RoK1wiIGZpZWxkcyBidXQgcGFyc2VkIFwiK2ksZit0KTppPGwubGVuZ3RoJiZrKFwiRmllbGRNaXNtYXRjaFwiLFwiVG9vRmV3RmllbGRzXCIsXCJUb28gZmV3IGZpZWxkczogZXhwZWN0ZWQgXCIrbC5sZW5ndGgrXCIgZmllbGRzIGJ1dCBwYXJzZWQgXCIraSxmK3QpKSxyfXZhciB0PTE7IWMuZGF0YS5sZW5ndGh8fEFycmF5LmlzQXJyYXkoYy5kYXRhWzBdKT8oYy5kYXRhPWMuZGF0YS5tYXAoZSksdD1jLmRhdGEubGVuZ3RoKTpjLmRhdGE9ZShjLmRhdGEsMCk7Xy5oZWFkZXImJmMubWV0YSYmKGMubWV0YS5maWVsZHM9bCk7cmV0dXJuIGYrPXQsY30oKX1mdW5jdGlvbiBtKCl7cmV0dXJuIF8uaGVhZGVyJiYwPT09bC5sZW5ndGh9ZnVuY3Rpb24geShlLHQpe3JldHVybiBpPWUsXy5keW5hbWljVHlwaW5nRnVuY3Rpb24mJnZvaWQgMD09PV8uZHluYW1pY1R5cGluZ1tpXSYmKF8uZHluYW1pY1R5cGluZ1tpXT1fLmR5bmFtaWNUeXBpbmdGdW5jdGlvbihpKSksITA9PT0oXy5keW5hbWljVHlwaW5nW2ldfHxfLmR5bmFtaWNUeXBpbmcpP1widHJ1ZVwiPT09dHx8XCJUUlVFXCI9PT10fHxcImZhbHNlXCIhPT10JiZcIkZBTFNFXCIhPT10JiYoZnVuY3Rpb24oZSl7aWYocy50ZXN0KGUpKXt2YXIgdD1wYXJzZUZsb2F0KGUpO2lmKG48dCYmdDxyKXJldHVybiEwfXJldHVybiExfSh0KT9wYXJzZUZsb2F0KHQpOnUudGVzdCh0KT9uZXcgRGF0ZSh0KTpcIlwiPT09dD9udWxsOnQpOnQ7dmFyIGl9ZnVuY3Rpb24gayhlLHQsaSxyKXt2YXIgbj17dHlwZTplLGNvZGU6dCxtZXNzYWdlOml9O3ZvaWQgMCE9PXImJihuLnJvdz1yKSxjLmVycm9ycy5wdXNoKG4pfXRoaXMucGFyc2U9ZnVuY3Rpb24oZSx0LGkpe3ZhciByPV8ucXVvdGVDaGFyfHwnXCInO2lmKF8ubmV3bGluZXx8KF8ubmV3bGluZT1mdW5jdGlvbihlLHQpe2U9ZS5zdWJzdHJpbmcoMCwxMDQ4NTc2KTt2YXIgaT1uZXcgUmVnRXhwKHEodCkrXCIoW15dKj8pXCIrcSh0KSxcImdtXCIpLHI9KGU9ZS5yZXBsYWNlKGksXCJcIikpLnNwbGl0KFwiXFxyXCIpLG49ZS5zcGxpdChcIlxcblwiKSxzPTE8bi5sZW5ndGgmJm5bMF0ubGVuZ3RoPHJbMF0ubGVuZ3RoO2lmKDE9PT1yLmxlbmd0aHx8cylyZXR1cm5cIlxcblwiO2Zvcih2YXIgYT0wLG89MDtvPHIubGVuZ3RoO28rKylcIlxcblwiPT09cltvXVswXSYmYSsrO3JldHVybiBhPj1yLmxlbmd0aC8yP1wiXFxyXFxuXCI6XCJcXHJcIn0oZSxyKSksaD0hMSxfLmRlbGltaXRlcilVKF8uZGVsaW1pdGVyKSYmKF8uZGVsaW1pdGVyPV8uZGVsaW1pdGVyKGUpLGMubWV0YS5kZWxpbWl0ZXI9Xy5kZWxpbWl0ZXIpO2Vsc2V7dmFyIG49ZnVuY3Rpb24oZSx0LGkscixuKXt2YXIgcyxhLG8saDtuPW58fFtcIixcIixcIlxcdFwiLFwifFwiLFwiO1wiLGIuUkVDT1JEX1NFUCxiLlVOSVRfU0VQXTtmb3IodmFyIHU9MDt1PG4ubGVuZ3RoO3UrKyl7dmFyIGY9blt1XSxkPTAsbD0wLGM9MDtvPXZvaWQgMDtmb3IodmFyIHA9bmV3IHcoe2NvbW1lbnRzOnIsZGVsaW1pdGVyOmYsbmV3bGluZTp0LHByZXZpZXc6MTB9KS5wYXJzZShlKSxnPTA7ZzxwLmRhdGEubGVuZ3RoO2crKylpZihpJiZ2KHAuZGF0YVtnXSkpYysrO2Vsc2V7dmFyIG09cC5kYXRhW2ddLmxlbmd0aDtsKz1tLHZvaWQgMCE9PW8/MDxtJiYoZCs9TWF0aC5hYnMobS1vKSxvPW0pOm89bX0wPHAuZGF0YS5sZW5ndGgmJihsLz1wLmRhdGEubGVuZ3RoLWMpLCh2b2lkIDA9PT1hfHxkPD1hKSYmKHZvaWQgMD09PWh8fGg8bCkmJjEuOTk8bCYmKGE9ZCxzPWYsaD1sKX1yZXR1cm57c3VjY2Vzc2Z1bDohIShfLmRlbGltaXRlcj1zKSxiZXN0RGVsaW1pdGVyOnN9fShlLF8ubmV3bGluZSxfLnNraXBFbXB0eUxpbmVzLF8uY29tbWVudHMsXy5kZWxpbWl0ZXJzVG9HdWVzcyk7bi5zdWNjZXNzZnVsP18uZGVsaW1pdGVyPW4uYmVzdERlbGltaXRlcjooaD0hMCxfLmRlbGltaXRlcj1iLkRlZmF1bHREZWxpbWl0ZXIpLGMubWV0YS5kZWxpbWl0ZXI9Xy5kZWxpbWl0ZXJ9dmFyIHM9RShfKTtyZXR1cm4gXy5wcmV2aWV3JiZfLmhlYWRlciYmcy5wcmV2aWV3KyssYT1lLG89bmV3IHcocyksYz1vLnBhcnNlKGEsdCxpKSxnKCksZD97bWV0YTp7cGF1c2VkOiEwfX06Y3x8e21ldGE6e3BhdXNlZDohMX19fSx0aGlzLnBhdXNlZD1mdW5jdGlvbigpe3JldHVybiBkfSx0aGlzLnBhdXNlPWZ1bmN0aW9uKCl7ZD0hMCxvLmFib3J0KCksYT1VKF8uY2h1bmspP1wiXCI6YS5zdWJzdHJpbmcoby5nZXRDaGFySW5kZXgoKSl9LHRoaXMucmVzdW1lPWZ1bmN0aW9uKCl7dC5zdHJlYW1lci5faGFsdGVkPyhkPSExLHQuc3RyZWFtZXIucGFyc2VDaHVuayhhLCEwKSk6c2V0VGltZW91dCh0LnJlc3VtZSwzKX0sdGhpcy5hYm9ydGVkPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuYWJvcnQ9ZnVuY3Rpb24oKXtlPSEwLG8uYWJvcnQoKSxjLm1ldGEuYWJvcnRlZD0hMCxVKF8uY29tcGxldGUpJiZfLmNvbXBsZXRlKGMpLGE9XCJcIn19ZnVuY3Rpb24gcShlKXtyZXR1cm4gZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZyxcIlxcXFwkJlwiKX1mdW5jdGlvbiB3KGUpe3ZhciBPLEQ9KGU9ZXx8e30pLmRlbGltaXRlcixJPWUubmV3bGluZSxUPWUuY29tbWVudHMsQT1lLnN0ZXAsTD1lLnByZXZpZXcsRj1lLmZhc3RNb2RlLHo9Tz12b2lkIDA9PT1lLnF1b3RlQ2hhcj8nXCInOmUucXVvdGVDaGFyO2lmKHZvaWQgMCE9PWUuZXNjYXBlQ2hhciYmKHo9ZS5lc2NhcGVDaGFyKSwoXCJzdHJpbmdcIiE9dHlwZW9mIER8fC0xPGIuQkFEX0RFTElNSVRFUlMuaW5kZXhPZihEKSkmJihEPVwiLFwiKSxUPT09RCl0aHJvdyBuZXcgRXJyb3IoXCJDb21tZW50IGNoYXJhY3RlciBzYW1lIGFzIGRlbGltaXRlclwiKTshMD09PVQ/VD1cIiNcIjooXCJzdHJpbmdcIiE9dHlwZW9mIFR8fC0xPGIuQkFEX0RFTElNSVRFUlMuaW5kZXhPZihUKSkmJihUPSExKSxcIlxcblwiIT09SSYmXCJcXHJcIiE9PUkmJlwiXFxyXFxuXCIhPT1JJiYoST1cIlxcblwiKTt2YXIgTT0wLGo9ITE7dGhpcy5wYXJzZT1mdW5jdGlvbihhLHQsaSl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgbXVzdCBiZSBhIHN0cmluZ1wiKTt2YXIgcj1hLmxlbmd0aCxlPUQubGVuZ3RoLG49SS5sZW5ndGgscz1ULmxlbmd0aCxvPVUoQSksaD1bXSx1PVtdLGY9W10sZD1NPTA7aWYoIWEpcmV0dXJuIFIoKTtpZihGfHwhMSE9PUYmJi0xPT09YS5pbmRleE9mKE8pKXtmb3IodmFyIGw9YS5zcGxpdChJKSxjPTA7YzxsLmxlbmd0aDtjKyspe2lmKGY9bFtjXSxNKz1mLmxlbmd0aCxjIT09bC5sZW5ndGgtMSlNKz1JLmxlbmd0aDtlbHNlIGlmKGkpcmV0dXJuIFIoKTtpZighVHx8Zi5zdWJzdHJpbmcoMCxzKSE9PVQpe2lmKG8pe2lmKGg9W10sYihmLnNwbGl0KEQpKSxTKCksailyZXR1cm4gUigpfWVsc2UgYihmLnNwbGl0KEQpKTtpZihMJiZMPD1jKXJldHVybiBoPWguc2xpY2UoMCxMKSxSKCEwKX19cmV0dXJuIFIoKX1mb3IodmFyIHA9YS5pbmRleE9mKEQsTSksZz1hLmluZGV4T2YoSSxNKSxtPW5ldyBSZWdFeHAocSh6KStxKE8pLFwiZ1wiKSxfPWEuaW5kZXhPZihPLE0pOzspaWYoYVtNXSE9PU8paWYoVCYmMD09PWYubGVuZ3RoJiZhLnN1YnN0cmluZyhNLE0rcyk9PT1UKXtpZigtMT09PWcpcmV0dXJuIFIoKTtNPWcrbixnPWEuaW5kZXhPZihJLE0pLHA9YS5pbmRleE9mKEQsTSl9ZWxzZXtpZigtMSE9PXAmJihwPGd8fC0xPT09Zykpe2lmKCEocDxfKSl7Zi5wdXNoKGEuc3Vic3RyaW5nKE0scCkpLE09cCtlLHA9YS5pbmRleE9mKEQsTSk7Y29udGludWV9dmFyIHY9eChwLF8sZyk7aWYodiYmdm9pZCAwIT09di5uZXh0RGVsaW0pe3A9di5uZXh0RGVsaW0sXz12LnF1b3RlU2VhcmNoLGYucHVzaChhLnN1YnN0cmluZyhNLHApKSxNPXArZSxwPWEuaW5kZXhPZihELE0pO2NvbnRpbnVlfX1pZigtMT09PWcpYnJlYWs7aWYoZi5wdXNoKGEuc3Vic3RyaW5nKE0sZykpLEMoZytuKSxvJiYoUygpLGopKXJldHVybiBSKCk7aWYoTCYmaC5sZW5ndGg+PUwpcmV0dXJuIFIoITApfWVsc2UgZm9yKF89TSxNKys7Oyl7aWYoLTE9PT0oXz1hLmluZGV4T2YoTyxfKzEpKSlyZXR1cm4gaXx8dS5wdXNoKHt0eXBlOlwiUXVvdGVzXCIsY29kZTpcIk1pc3NpbmdRdW90ZXNcIixtZXNzYWdlOlwiUXVvdGVkIGZpZWxkIHVudGVybWluYXRlZFwiLHJvdzpoLmxlbmd0aCxpbmRleDpNfSksRSgpO2lmKF89PT1yLTEpcmV0dXJuIEUoYS5zdWJzdHJpbmcoTSxfKS5yZXBsYWNlKG0sTykpO2lmKE8hPT16fHxhW18rMV0hPT16KXtpZihPPT09enx8MD09PV98fGFbXy0xXSE9PXopey0xIT09cCYmcDxfKzEmJihwPWEuaW5kZXhPZihELF8rMSkpLC0xIT09ZyYmZzxfKzEmJihnPWEuaW5kZXhPZihJLF8rMSkpO3ZhciB5PXcoLTE9PT1nP3A6TWF0aC5taW4ocCxnKSk7aWYoYVtfKzEreV09PT1EKXtmLnB1c2goYS5zdWJzdHJpbmcoTSxfKS5yZXBsYWNlKG0sTykpLGFbTT1fKzEreStlXSE9PU8mJihfPWEuaW5kZXhPZihPLE0pKSxwPWEuaW5kZXhPZihELE0pLGc9YS5pbmRleE9mKEksTSk7YnJlYWt9dmFyIGs9dyhnKTtpZihhLnN1YnN0cmluZyhfKzErayxfKzEraytuKT09PUkpe2lmKGYucHVzaChhLnN1YnN0cmluZyhNLF8pLnJlcGxhY2UobSxPKSksQyhfKzEraytuKSxwPWEuaW5kZXhPZihELE0pLF89YS5pbmRleE9mKE8sTSksbyYmKFMoKSxqKSlyZXR1cm4gUigpO2lmKEwmJmgubGVuZ3RoPj1MKXJldHVybiBSKCEwKTticmVha311LnB1c2goe3R5cGU6XCJRdW90ZXNcIixjb2RlOlwiSW52YWxpZFF1b3Rlc1wiLG1lc3NhZ2U6XCJUcmFpbGluZyBxdW90ZSBvbiBxdW90ZWQgZmllbGQgaXMgbWFsZm9ybWVkXCIscm93OmgubGVuZ3RoLGluZGV4Ok19KSxfKyt9fWVsc2UgXysrfXJldHVybiBFKCk7ZnVuY3Rpb24gYihlKXtoLnB1c2goZSksZD1NfWZ1bmN0aW9uIHcoZSl7dmFyIHQ9MDtpZigtMSE9PWUpe3ZhciBpPWEuc3Vic3RyaW5nKF8rMSxlKTtpJiZcIlwiPT09aS50cmltKCkmJih0PWkubGVuZ3RoKX1yZXR1cm4gdH1mdW5jdGlvbiBFKGUpe3JldHVybiBpfHwodm9pZCAwPT09ZSYmKGU9YS5zdWJzdHJpbmcoTSkpLGYucHVzaChlKSxNPXIsYihmKSxvJiZTKCkpLFIoKX1mdW5jdGlvbiBDKGUpe009ZSxiKGYpLGY9W10sZz1hLmluZGV4T2YoSSxNKX1mdW5jdGlvbiBSKGUpe3JldHVybntkYXRhOmgsZXJyb3JzOnUsbWV0YTp7ZGVsaW1pdGVyOkQsbGluZWJyZWFrOkksYWJvcnRlZDpqLHRydW5jYXRlZDohIWUsY3Vyc29yOmQrKHR8fDApfX19ZnVuY3Rpb24gUygpe0EoUigpKSxoPVtdLHU9W119ZnVuY3Rpb24geChlLHQsaSl7dmFyIHI9e25leHREZWxpbTp2b2lkIDAscXVvdGVTZWFyY2g6dm9pZCAwfSxuPWEuaW5kZXhPZihPLHQrMSk7aWYodDxlJiZlPG4mJihuPGl8fC0xPT09aSkpe3ZhciBzPWEuaW5kZXhPZihELG4pO2lmKC0xPT09cylyZXR1cm4gcjtuPHMmJihuPWEuaW5kZXhPZihPLG4rMSkpLHI9eChzLG4saSl9ZWxzZSByPXtuZXh0RGVsaW06ZSxxdW90ZVNlYXJjaDp0fTtyZXR1cm4gcn19LHRoaXMuYWJvcnQ9ZnVuY3Rpb24oKXtqPSEwfSx0aGlzLmdldENoYXJJbmRleD1mdW5jdGlvbigpe3JldHVybiBNfX1mdW5jdGlvbiBtKGUpe3ZhciB0PWUuZGF0YSxpPWFbdC53b3JrZXJJZF0scj0hMTtpZih0LmVycm9yKWkudXNlckVycm9yKHQuZXJyb3IsdC5maWxlKTtlbHNlIGlmKHQucmVzdWx0cyYmdC5yZXN1bHRzLmRhdGEpe3ZhciBuPXthYm9ydDpmdW5jdGlvbigpe3I9ITAsXyh0LndvcmtlcklkLHtkYXRhOltdLGVycm9yczpbXSxtZXRhOnthYm9ydGVkOiEwfX0pfSxwYXVzZTp2LHJlc3VtZTp2fTtpZihVKGkudXNlclN0ZXApKXtmb3IodmFyIHM9MDtzPHQucmVzdWx0cy5kYXRhLmxlbmd0aCYmKGkudXNlclN0ZXAoe2RhdGE6dC5yZXN1bHRzLmRhdGFbc10sZXJyb3JzOnQucmVzdWx0cy5lcnJvcnMsbWV0YTp0LnJlc3VsdHMubWV0YX0sbiksIXIpO3MrKyk7ZGVsZXRlIHQucmVzdWx0c31lbHNlIFUoaS51c2VyQ2h1bmspJiYoaS51c2VyQ2h1bmsodC5yZXN1bHRzLG4sdC5maWxlKSxkZWxldGUgdC5yZXN1bHRzKX10LmZpbmlzaGVkJiYhciYmXyh0LndvcmtlcklkLHQucmVzdWx0cyl9ZnVuY3Rpb24gXyhlLHQpe3ZhciBpPWFbZV07VShpLnVzZXJDb21wbGV0ZSkmJmkudXNlckNvbXBsZXRlKHQpLGkudGVybWluYXRlKCksZGVsZXRlIGFbZV19ZnVuY3Rpb24gdigpe3Rocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZC5cIil9ZnVuY3Rpb24gRShlKXtpZihcIm9iamVjdFwiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuIGU7dmFyIHQ9QXJyYXkuaXNBcnJheShlKT9bXTp7fTtmb3IodmFyIGkgaW4gZSl0W2ldPUUoZVtpXSk7cmV0dXJuIHR9ZnVuY3Rpb24geShlLHQpe3JldHVybiBmdW5jdGlvbigpe2UuYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBVKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGV9cmV0dXJuIG8mJihmLm9ubWVzc2FnZT1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dm9pZCAwPT09Yi5XT1JLRVJfSUQmJnQmJihiLldPUktFUl9JRD10LndvcmtlcklkKTtpZihcInN0cmluZ1wiPT10eXBlb2YgdC5pbnB1dClmLnBvc3RNZXNzYWdlKHt3b3JrZXJJZDpiLldPUktFUl9JRCxyZXN1bHRzOmIucGFyc2UodC5pbnB1dCx0LmNvbmZpZyksZmluaXNoZWQ6ITB9KTtlbHNlIGlmKGYuRmlsZSYmdC5pbnB1dCBpbnN0YW5jZW9mIEZpbGV8fHQuaW5wdXQgaW5zdGFuY2VvZiBPYmplY3Qpe3ZhciBpPWIucGFyc2UodC5pbnB1dCx0LmNvbmZpZyk7aSYmZi5wb3N0TWVzc2FnZSh7d29ya2VySWQ6Yi5XT1JLRVJfSUQscmVzdWx0czppLGZpbmlzaGVkOiEwfSl9fSksKGwucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1sLChjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHUucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YywocC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShwLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXAsKGcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1nLGJ9KTsiLCJ2YXIgaXMgPSBmdW5jdGlvbiAob2JqLCB0eXBlKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS50b0xvd2VyQ2FzZSgpID09PSAoXCJbb2JqZWN0IFwiICsgdHlwZSArIFwiXVwiKTsgfTtcblxudmFyIGFkZENsYXNzID0gZnVuY3Rpb24gKGVsLCBjbHMpIHtcbiAgICB2YXIgYXJyID0gZWwuY2xhc3NOYW1lXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAuZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiAhIWMgJiYgYyA9PSBjbHM7IH0pO1xuXG4gICAgaWYgKCFhcnIubGVuZ3RoKSB7XG4gICAgICAgIGVsLmNsYXNzTmFtZSArPSBcIiBcIiArIGNscztcbiAgICB9XG59O1xuXG52YXIgcmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbiAoZWwsIGNscykge1xuICAgIGVsLmNsYXNzTmFtZSA9IGVsLmNsYXNzTmFtZVxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLmZpbHRlcihmdW5jdGlvbiAoYykgeyByZXR1cm4gISFjICYmIGMgIT0gY2xzOyB9KVxuICAgIC5qb2luKCcgJyk7XG59O1xuXG52YXIgUk1vZGFsID0gZnVuY3Rpb24gUk1vZGFsKGVsLCBvcHRzKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB0aGlzLm9wZW5lZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5vcHRzID0ge1xuICAgICAgICBib2R5Q2xhc3M6ICdtb2RhbC1vcGVuJ1xuICAgICAgICAsIGRpYWxvZ0NsYXNzOiAnbW9kYWwtZGlhbG9nJ1xuICAgICAgICAsIGRpYWxvZ09wZW5DbGFzczogJ2JvdW5jZUluRG93bidcbiAgICAgICAgLCBkaWFsb2dDbG9zZUNsYXNzOiAnYm91bmNlT3V0VXAnXG5cbiAgICAgICAgLCBmb2N1czogdHJ1ZVxuICAgICAgICAsIGZvY3VzRWxlbWVudHM6IFtcbiAgICAgICAgICAgICdhW2hyZWZdJywgJ2FyZWFbaHJlZl0nLCAnaW5wdXQ6bm90KFtkaXNhYmxlZF0pOm5vdChbdHlwZT1oaWRkZW5dKSdcbiAgICAgICAgICAgICwgJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknLCAnc2VsZWN0Om5vdChbZGlzYWJsZWRdKSdcbiAgICAgICAgICAgICwgJ3RleHRhcmVhOm5vdChbZGlzYWJsZWRdKScsICdpZnJhbWUnLCAnb2JqZWN0JywgJ2VtYmVkJ1xuICAgICAgICAgICAgLCAnKlt0YWJpbmRleF0nLCAnKltjb250ZW50ZWRpdGFibGVdJ1xuICAgICAgICBdXG5cbiAgICAgICAgLCBlc2NhcGVDbG9zZTogdHJ1ZVxuICAgICAgICAsIGNvbnRlbnQ6IG51bGxcbiAgICAgICAgLCBjbG9zZVRpbWVvdXQ6IDUwMFxuICAgIH07XG5cbiAgICBPYmplY3Qua2V5cyhvcHRzIHx8IHt9KVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKG9wdHNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzJDEub3B0c1trZXldID0gb3B0c1trZXldO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm92ZXJsYXkgPSBlbDtcbiAgICB0aGlzLmRpYWxvZyA9IGVsLnF1ZXJ5U2VsZWN0b3IoKFwiLlwiICsgKHRoaXMub3B0cy5kaWFsb2dDbGFzcykpKTtcblxuICAgIGlmICh0aGlzLm9wdHMuY29udGVudCkge1xuICAgICAgICB0aGlzLmNvbnRlbnQodGhpcy5vcHRzLmNvbnRlbnQpO1xuICAgIH1cbn07XG5cblJNb2RhbC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uIG9wZW4gKGNvbnRlbnQpIHtcbiAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB0aGlzLmNvbnRlbnQoY29udGVudCk7XG5cbiAgICBpZiAoIWlzKHRoaXMub3B0cy5iZWZvcmVPcGVuLCAnZnVuY3Rpb24nKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9PcGVuKCk7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRzLmJlZm9yZU9wZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzJDEuX2RvT3BlbigpO1xuICAgIH0pO1xufTtcblxuUk1vZGFsLnByb3RvdHlwZS5fZG9PcGVuID0gZnVuY3Rpb24gX2RvT3BlbiAoKSB7XG4gICAgYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgdGhpcy5vcHRzLmJvZHlDbGFzcyk7XG5cbiAgICByZW1vdmVDbGFzcyh0aGlzLmRpYWxvZywgdGhpcy5vcHRzLmRpYWxvZ0Nsb3NlQ2xhc3MpO1xuICAgIGFkZENsYXNzKHRoaXMuZGlhbG9nLCB0aGlzLm9wdHMuZGlhbG9nT3BlbkNsYXNzKTtcblxuICAgIHRoaXMub3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIGlmICh0aGlzLm9wdHMuZm9jdXMpIHtcbiAgICAgICAgdGhpcy5mb2N1c091dEVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzKHRoaXMub3B0cy5hZnRlck9wZW4sICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRoaXMub3B0cy5hZnRlck9wZW4oKTtcbiAgICB9XG4gICAgdGhpcy5vcGVuZWQgPSB0cnVlO1xufTtcblxuUk1vZGFsLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uIGNsb3NlICgpIHtcbiAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAoIWlzKHRoaXMub3B0cy5iZWZvcmVDbG9zZSwgJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvQ2xvc2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdHMuYmVmb3JlQ2xvc2UoZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzJDEuX2RvQ2xvc2UoKTtcbiAgICB9KTtcbn07XG5cblJNb2RhbC5wcm90b3R5cGUuX2RvQ2xvc2UgPSBmdW5jdGlvbiBfZG9DbG9zZSAoKSB7XG4gICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgcmVtb3ZlQ2xhc3ModGhpcy5kaWFsb2csIHRoaXMub3B0cy5kaWFsb2dPcGVuQ2xhc3MpO1xuICAgIGFkZENsYXNzKHRoaXMuZGlhbG9nLCB0aGlzLm9wdHMuZGlhbG9nQ2xvc2VDbGFzcyk7XG5cbiAgICByZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCB0aGlzLm9wdHMuYm9keUNsYXNzKTtcblxuICAgIGlmICh0aGlzLm9wdHMuZm9jdXMpIHtcbiAgICAgICAgdGhpcy5mb2N1cyh0aGlzLmZvY3VzT3V0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzKHRoaXMub3B0cy5hZnRlckNsb3NlLCAnZnVuY3Rpb24nKSkge1xuICAgICAgICB0aGlzLm9wdHMuYWZ0ZXJDbG9zZSgpO1xuICAgIH1cblxuICAgIHRoaXMub3BlbmVkID0gZmFsc2U7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMkMS5vdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfSwgdGhpcy5vcHRzLmNsb3NlVGltZW91dCk7XG59O1xuXG5STW9kYWwucHJvdG90eXBlLmNvbnRlbnQgPSBmdW5jdGlvbiBjb250ZW50IChodG1sKSB7XG4gICAgaWYgKGh0bWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWFsb2cuaW5uZXJIVE1MO1xuICAgIH1cblxuICAgIHRoaXMuZGlhbG9nLmlubmVySFRNTCA9IGh0bWw7XG59O1xuXG5STW9kYWwucHJvdG90eXBlLmVsZW1lbnRzID0gZnVuY3Rpb24gZWxlbWVudHMgKHNlbGVjdG9yLCBmYWxsYmFjaykge1xuICAgIGZhbGxiYWNrID0gZmFsbGJhY2sgfHwgd2luZG93Lm5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoJ01TSUUgOS4wJykgPiAtMTtcbiAgICBzZWxlY3RvciA9IGlzKHNlbGVjdG9yLCAnYXJyYXknKSA/IHNlbGVjdG9yLmpvaW4oJywnKSA6IHNlbGVjdG9yO1xuXG4gICAgcmV0dXJuIFtdLmZpbHRlci5jYWxsKFxuICAgICAgICB0aGlzLmRpYWxvZy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICAsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnICYmIHN0eWxlLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRQYXJlbnQgIT09IG51bGw7XG4gICAgICAgIH1cbiAgICApO1xufTtcblxuUk1vZGFsLnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uIGZvY3VzIChlbCkge1xuICAgIGVsID0gZWwgfHwgdGhpcy5lbGVtZW50cyh0aGlzLm9wdHMuZm9jdXNFbGVtZW50cylbMF0gfHwgdGhpcy5kaWFsb2cuZmlyc3RDaGlsZDtcblxuICAgIGlmIChlbCAmJiBpcyhlbC5mb2N1cywgJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgZWwuZm9jdXMoKTtcbiAgICB9XG59O1xuXG5STW9kYWwucHJvdG90eXBlLmtleWRvd24gPSBmdW5jdGlvbiBrZXlkb3duIChldikge1xuICAgIGlmICh0aGlzLm9wdHMuZXNjYXBlQ2xvc2UgJiYgZXYud2hpY2ggPT0gMjcpIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0b3BFdmVudCgpIHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3BlbmVkICYmIGV2LndoaWNoID09IDkgJiYgdGhpcy5kaWFsb2cuY29udGFpbnMoZXYudGFyZ2V0KSkge1xuICAgICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzKHRoaXMub3B0cy5mb2N1c0VsZW1lbnRzKVxuICAgICAgICAgICAgLCBmaXJzdCA9IGVsZW1lbnRzWzBdXG4gICAgICAgICAgICAsIGxhc3QgPSBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAoZmlyc3QgPT0gbGFzdCkge1xuICAgICAgICAgICAgc3RvcEV2ZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXYudGFyZ2V0ID09IGZpcnN0ICYmIGV2LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBzdG9wRXZlbnQoKTtcbiAgICAgICAgICAgIGxhc3QuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldi50YXJnZXQgPT0gbGFzdCAmJiAhZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgIHN0b3BFdmVudCgpO1xuICAgICAgICAgICAgZmlyc3QuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cblJNb2RhbC5wcm90b3R5cGUudmVyc2lvbiA9ICcxLjAuMzEnO1xuUk1vZGFsLnZlcnNpb24gPSAnMS4wLjMxJztcblxuZXhwb3J0IGRlZmF1bHQgUk1vZGFsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguZXMuanMubWFwXG4iLCIvKiohXG4gKiBTb3J0YWJsZVxuICogQGF1dGhvclx0UnViYVhhICAgPHRyYXNoQHJ1YmF4YS5vcmc+XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG4oZnVuY3Rpb24gc29ydGFibGVNb2R1bGUoZmFjdG9yeSkge1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHRpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcblx0XHRkZWZpbmUoZmFjdG9yeSk7XG5cdH1cblx0ZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyAhPSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0LyoganNoaW50IHN1Yjp0cnVlICovXG5cdFx0d2luZG93W1wiU29ydGFibGVcIl0gPSBmYWN0b3J5KCk7XG5cdH1cbn0pKGZ1bmN0aW9uIHNvcnRhYmxlRmFjdG9yeSgpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0aWYgKHR5cGVvZiB3aW5kb3cgPT0gXCJ1bmRlZmluZWRcIiB8fCAhd2luZG93LmRvY3VtZW50KSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNvcnRhYmxlRXJyb3IoKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTb3J0YWJsZS5qcyByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIik7XG5cdFx0fTtcblx0fVxuXG5cdHZhciBkcmFnRWwsXG5cdFx0cGFyZW50RWwsXG5cdFx0Z2hvc3RFbCxcblx0XHRjbG9uZUVsLFxuXHRcdHJvb3RFbCxcblx0XHRuZXh0RWwsXG5cdFx0bGFzdERvd25FbCxcblxuXHRcdHNjcm9sbEVsLFxuXHRcdHNjcm9sbFBhcmVudEVsLFxuXHRcdHNjcm9sbEN1c3RvbUZuLFxuXG5cdFx0bGFzdEVsLFxuXHRcdGxhc3RDU1MsXG5cdFx0bGFzdFBhcmVudENTUyxcblxuXHRcdG9sZEluZGV4LFxuXHRcdG5ld0luZGV4LFxuXG5cdFx0YWN0aXZlR3JvdXAsXG5cdFx0cHV0U29ydGFibGUsXG5cblx0XHRhdXRvU2Nyb2xsID0ge30sXG5cblx0XHR0YXBFdnQsXG5cdFx0dG91Y2hFdnQsXG5cblx0XHRtb3ZlZCxcblxuXHRcdC8qKiBAY29uc3QgKi9cblx0XHRSX1NQQUNFID0gL1xccysvZyxcblx0XHRSX0ZMT0FUID0gL2xlZnR8cmlnaHR8aW5saW5lLyxcblxuXHRcdGV4cGFuZG8gPSAnU29ydGFibGUnICsgKG5ldyBEYXRlKS5nZXRUaW1lKCksXG5cblx0XHR3aW4gPSB3aW5kb3csXG5cdFx0ZG9jdW1lbnQgPSB3aW4uZG9jdW1lbnQsXG5cdFx0cGFyc2VJbnQgPSB3aW4ucGFyc2VJbnQsXG5cblx0XHQkID0gd2luLmpRdWVyeSB8fCB3aW4uWmVwdG8sXG5cdFx0UG9seW1lciA9IHdpbi5Qb2x5bWVyLFxuXG5cdFx0Y2FwdHVyZU1vZGUgPSBmYWxzZSxcblxuXHRcdHN1cHBvcnREcmFnZ2FibGUgPSAhISgnZHJhZ2dhYmxlJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSksXG5cdFx0c3VwcG9ydENzc1BvaW50ZXJFdmVudHMgPSAoZnVuY3Rpb24gKGVsKSB7XG5cdFx0XHQvLyBmYWxzZSB3aGVuIElFMTFcblx0XHRcdGlmICghIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1RyaWRlbnQuKnJ2WyA6XT8xMVxcLi8pKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgneCcpO1xuXHRcdFx0ZWwuc3R5bGUuY3NzVGV4dCA9ICdwb2ludGVyLWV2ZW50czphdXRvJztcblx0XHRcdHJldHVybiBlbC5zdHlsZS5wb2ludGVyRXZlbnRzID09PSAnYXV0byc7XG5cdFx0fSkoKSxcblxuXHRcdF9zaWxlbnQgPSBmYWxzZSxcblxuXHRcdGFicyA9IE1hdGguYWJzLFxuXHRcdG1pbiA9IE1hdGgubWluLFxuXG5cdFx0c2F2ZWRJbnB1dENoZWNrZWQgPSBbXSxcblx0XHR0b3VjaERyYWdPdmVyTGlzdGVuZXJzID0gW10sXG5cblx0XHRfYXV0b1Njcm9sbCA9IF90aHJvdHRsZShmdW5jdGlvbiAoLyoqRXZlbnQqL2V2dCwgLyoqT2JqZWN0Ki9vcHRpb25zLCAvKipIVE1MRWxlbWVudCovcm9vdEVsKSB7XG5cdFx0XHQvLyBCdWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTUyMVxuXHRcdFx0aWYgKHJvb3RFbCAmJiBvcHRpb25zLnNjcm9sbCkge1xuXHRcdFx0XHR2YXIgX3RoaXMgPSByb290RWxbZXhwYW5kb10sXG5cdFx0XHRcdFx0ZWwsXG5cdFx0XHRcdFx0cmVjdCxcblx0XHRcdFx0XHRzZW5zID0gb3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eSxcblx0XHRcdFx0XHRzcGVlZCA9IG9wdGlvbnMuc2Nyb2xsU3BlZWQsXG5cblx0XHRcdFx0XHR4ID0gZXZ0LmNsaWVudFgsXG5cdFx0XHRcdFx0eSA9IGV2dC5jbGllbnRZLFxuXG5cdFx0XHRcdFx0d2luV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCxcblx0XHRcdFx0XHR3aW5IZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQsXG5cblx0XHRcdFx0XHR2eCxcblx0XHRcdFx0XHR2eSxcblxuXHRcdFx0XHRcdHNjcm9sbE9mZnNldFgsXG5cdFx0XHRcdFx0c2Nyb2xsT2Zmc2V0WVxuXHRcdFx0XHQ7XG5cblx0XHRcdFx0Ly8gRGVsZWN0IHNjcm9sbEVsXG5cdFx0XHRcdGlmIChzY3JvbGxQYXJlbnRFbCAhPT0gcm9vdEVsKSB7XG5cdFx0XHRcdFx0c2Nyb2xsRWwgPSBvcHRpb25zLnNjcm9sbDtcblx0XHRcdFx0XHRzY3JvbGxQYXJlbnRFbCA9IHJvb3RFbDtcblx0XHRcdFx0XHRzY3JvbGxDdXN0b21GbiA9IG9wdGlvbnMuc2Nyb2xsRm47XG5cblx0XHRcdFx0XHRpZiAoc2Nyb2xsRWwgPT09IHRydWUpIHtcblx0XHRcdFx0XHRcdHNjcm9sbEVsID0gcm9vdEVsO1xuXG5cdFx0XHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0XHRcdGlmICgoc2Nyb2xsRWwub2Zmc2V0V2lkdGggPCBzY3JvbGxFbC5zY3JvbGxXaWR0aCkgfHxcblx0XHRcdFx0XHRcdFx0XHQoc2Nyb2xsRWwub2Zmc2V0SGVpZ2h0IDwgc2Nyb2xsRWwuc2Nyb2xsSGVpZ2h0KVxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHQvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cdFx0XHRcdFx0XHR9IHdoaWxlIChzY3JvbGxFbCA9IHNjcm9sbEVsLnBhcmVudE5vZGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzY3JvbGxFbCkge1xuXHRcdFx0XHRcdGVsID0gc2Nyb2xsRWw7XG5cdFx0XHRcdFx0cmVjdCA9IHNjcm9sbEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHRcdHZ4ID0gKGFicyhyZWN0LnJpZ2h0IC0geCkgPD0gc2VucykgLSAoYWJzKHJlY3QubGVmdCAtIHgpIDw9IHNlbnMpO1xuXHRcdFx0XHRcdHZ5ID0gKGFicyhyZWN0LmJvdHRvbSAtIHkpIDw9IHNlbnMpIC0gKGFicyhyZWN0LnRvcCAtIHkpIDw9IHNlbnMpO1xuXHRcdFx0XHR9XG5cblxuXHRcdFx0XHRpZiAoISh2eCB8fCB2eSkpIHtcblx0XHRcdFx0XHR2eCA9ICh3aW5XaWR0aCAtIHggPD0gc2VucykgLSAoeCA8PSBzZW5zKTtcblx0XHRcdFx0XHR2eSA9ICh3aW5IZWlnaHQgLSB5IDw9IHNlbnMpIC0gKHkgPD0gc2Vucyk7XG5cblx0XHRcdFx0XHQvKiBqc2hpbnQgZXhwcjp0cnVlICovXG5cdFx0XHRcdFx0KHZ4IHx8IHZ5KSAmJiAoZWwgPSB3aW4pO1xuXHRcdFx0XHR9XG5cblxuXHRcdFx0XHRpZiAoYXV0b1Njcm9sbC52eCAhPT0gdnggfHwgYXV0b1Njcm9sbC52eSAhPT0gdnkgfHwgYXV0b1Njcm9sbC5lbCAhPT0gZWwpIHtcblx0XHRcdFx0XHRhdXRvU2Nyb2xsLmVsID0gZWw7XG5cdFx0XHRcdFx0YXV0b1Njcm9sbC52eCA9IHZ4O1xuXHRcdFx0XHRcdGF1dG9TY3JvbGwudnkgPSB2eTtcblxuXHRcdFx0XHRcdGNsZWFySW50ZXJ2YWwoYXV0b1Njcm9sbC5waWQpO1xuXG5cdFx0XHRcdFx0aWYgKGVsKSB7XG5cdFx0XHRcdFx0XHRhdXRvU2Nyb2xsLnBpZCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0c2Nyb2xsT2Zmc2V0WSA9IHZ5ID8gdnkgKiBzcGVlZCA6IDA7XG5cdFx0XHRcdFx0XHRcdHNjcm9sbE9mZnNldFggPSB2eCA/IHZ4ICogc3BlZWQgOiAwO1xuXG5cdFx0XHRcdFx0XHRcdGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Yoc2Nyb2xsQ3VzdG9tRm4pKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHNjcm9sbEN1c3RvbUZuLmNhbGwoX3RoaXMsIHNjcm9sbE9mZnNldFgsIHNjcm9sbE9mZnNldFksIGV2dCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoZWwgPT09IHdpbikge1xuXHRcdFx0XHRcdFx0XHRcdHdpbi5zY3JvbGxUbyh3aW4ucGFnZVhPZmZzZXQgKyBzY3JvbGxPZmZzZXRYLCB3aW4ucGFnZVlPZmZzZXQgKyBzY3JvbGxPZmZzZXRZKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRlbC5zY3JvbGxUb3AgKz0gc2Nyb2xsT2Zmc2V0WTtcblx0XHRcdFx0XHRcdFx0XHRlbC5zY3JvbGxMZWZ0ICs9IHNjcm9sbE9mZnNldFg7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sIDI0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LCAzMCksXG5cblx0XHRfcHJlcGFyZUdyb3VwID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0XHRcdGZ1bmN0aW9uIHRvRm4odmFsdWUsIHB1bGwpIHtcblx0XHRcdFx0aWYgKHZhbHVlID09PSB2b2lkIDAgfHwgdmFsdWUgPT09IHRydWUpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGdyb3VwLm5hbWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbiAodG8sIGZyb20pIHtcblx0XHRcdFx0XHRcdHZhciBmcm9tR3JvdXAgPSBmcm9tLm9wdGlvbnMuZ3JvdXAubmFtZTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHB1bGxcblx0XHRcdFx0XHRcdFx0PyB2YWx1ZVxuXHRcdFx0XHRcdFx0XHQ6IHZhbHVlICYmICh2YWx1ZS5qb2luXG5cdFx0XHRcdFx0XHRcdFx0PyB2YWx1ZS5pbmRleE9mKGZyb21Hcm91cCkgPiAtMVxuXHRcdFx0XHRcdFx0XHRcdDogKGZyb21Hcm91cCA9PSB2YWx1ZSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBncm91cCA9IHt9O1xuXHRcdFx0dmFyIG9yaWdpbmFsR3JvdXAgPSBvcHRpb25zLmdyb3VwO1xuXG5cdFx0XHRpZiAoIW9yaWdpbmFsR3JvdXAgfHwgdHlwZW9mIG9yaWdpbmFsR3JvdXAgIT0gJ29iamVjdCcpIHtcblx0XHRcdFx0b3JpZ2luYWxHcm91cCA9IHtuYW1lOiBvcmlnaW5hbEdyb3VwfTtcblx0XHRcdH1cblxuXHRcdFx0Z3JvdXAubmFtZSA9IG9yaWdpbmFsR3JvdXAubmFtZTtcblx0XHRcdGdyb3VwLmNoZWNrUHVsbCA9IHRvRm4ob3JpZ2luYWxHcm91cC5wdWxsLCB0cnVlKTtcblx0XHRcdGdyb3VwLmNoZWNrUHV0ID0gdG9GbihvcmlnaW5hbEdyb3VwLnB1dCk7XG5cdFx0XHRncm91cC5yZXZlcnRDbG9uZSA9IG9yaWdpbmFsR3JvdXAucmV2ZXJ0Q2xvbmU7XG5cblx0XHRcdG9wdGlvbnMuZ3JvdXAgPSBncm91cDtcblx0XHR9XG5cdDtcblxuXG5cdC8qKlxuXHQgKiBAY2xhc3MgIFNvcnRhYmxlXG5cdCAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgZWxcblx0ICogQHBhcmFtICB7T2JqZWN0fSAgICAgICBbb3B0aW9uc11cblx0ICovXG5cdGZ1bmN0aW9uIFNvcnRhYmxlKGVsLCBvcHRpb25zKSB7XG5cdFx0aWYgKCEoZWwgJiYgZWwubm9kZVR5cGUgJiYgZWwubm9kZVR5cGUgPT09IDEpKSB7XG5cdFx0XHR0aHJvdyAnU29ydGFibGU6IGBlbGAgbXVzdCBiZSBIVE1MRWxlbWVudCwgYW5kIG5vdCAnICsge30udG9TdHJpbmcuY2FsbChlbCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5lbCA9IGVsOyAvLyByb290IGVsZW1lbnRcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zID0gX2V4dGVuZCh7fSwgb3B0aW9ucyk7XG5cblxuXHRcdC8vIEV4cG9ydCBpbnN0YW5jZVxuXHRcdGVsW2V4cGFuZG9dID0gdGhpcztcblxuXHRcdC8vIERlZmF1bHQgb3B0aW9uc1xuXHRcdHZhciBkZWZhdWx0cyA9IHtcblx0XHRcdGdyb3VwOiBNYXRoLnJhbmRvbSgpLFxuXHRcdFx0c29ydDogdHJ1ZSxcblx0XHRcdGRpc2FibGVkOiBmYWxzZSxcblx0XHRcdHN0b3JlOiBudWxsLFxuXHRcdFx0aGFuZGxlOiBudWxsLFxuXHRcdFx0c2Nyb2xsOiB0cnVlLFxuXHRcdFx0c2Nyb2xsU2Vuc2l0aXZpdHk6IDMwLFxuXHRcdFx0c2Nyb2xsU3BlZWQ6IDEwLFxuXHRcdFx0ZHJhZ2dhYmxlOiAvW3VvXWwvaS50ZXN0KGVsLm5vZGVOYW1lKSA/ICdsaScgOiAnPionLFxuXHRcdFx0Z2hvc3RDbGFzczogJ3NvcnRhYmxlLWdob3N0Jyxcblx0XHRcdGNob3NlbkNsYXNzOiAnc29ydGFibGUtY2hvc2VuJyxcblx0XHRcdGRyYWdDbGFzczogJ3NvcnRhYmxlLWRyYWcnLFxuXHRcdFx0aWdub3JlOiAnYSwgaW1nJyxcblx0XHRcdGZpbHRlcjogbnVsbCxcblx0XHRcdHByZXZlbnRPbkZpbHRlcjogdHJ1ZSxcblx0XHRcdGFuaW1hdGlvbjogMCxcblx0XHRcdHNldERhdGE6IGZ1bmN0aW9uIChkYXRhVHJhbnNmZXIsIGRyYWdFbCkge1xuXHRcdFx0XHRkYXRhVHJhbnNmZXIuc2V0RGF0YSgnVGV4dCcsIGRyYWdFbC50ZXh0Q29udGVudCk7XG5cdFx0XHR9LFxuXHRcdFx0ZHJvcEJ1YmJsZTogZmFsc2UsXG5cdFx0XHRkcmFnb3ZlckJ1YmJsZTogZmFsc2UsXG5cdFx0XHRkYXRhSWRBdHRyOiAnZGF0YS1pZCcsXG5cdFx0XHRkZWxheTogMCxcblx0XHRcdGZvcmNlRmFsbGJhY2s6IGZhbHNlLFxuXHRcdFx0ZmFsbGJhY2tDbGFzczogJ3NvcnRhYmxlLWZhbGxiYWNrJyxcblx0XHRcdGZhbGxiYWNrT25Cb2R5OiBmYWxzZSxcblx0XHRcdGZhbGxiYWNrVG9sZXJhbmNlOiAwLFxuXHRcdFx0ZmFsbGJhY2tPZmZzZXQ6IHt4OiAwLCB5OiAwfVxuXHRcdH07XG5cblxuXHRcdC8vIFNldCBkZWZhdWx0IG9wdGlvbnNcblx0XHRmb3IgKHZhciBuYW1lIGluIGRlZmF1bHRzKSB7XG5cdFx0XHQhKG5hbWUgaW4gb3B0aW9ucykgJiYgKG9wdGlvbnNbbmFtZV0gPSBkZWZhdWx0c1tuYW1lXSk7XG5cdFx0fVxuXG5cdFx0X3ByZXBhcmVHcm91cChvcHRpb25zKTtcblxuXHRcdC8vIEJpbmQgYWxsIHByaXZhdGUgbWV0aG9kc1xuXHRcdGZvciAodmFyIGZuIGluIHRoaXMpIHtcblx0XHRcdGlmIChmbi5jaGFyQXQoMCkgPT09ICdfJyAmJiB0eXBlb2YgdGhpc1tmbl0gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0dGhpc1tmbl0gPSB0aGlzW2ZuXS5iaW5kKHRoaXMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldHVwIGRyYWcgbW9kZVxuXHRcdHRoaXMubmF0aXZlRHJhZ2dhYmxlID0gb3B0aW9ucy5mb3JjZUZhbGxiYWNrID8gZmFsc2UgOiBzdXBwb3J0RHJhZ2dhYmxlO1xuXG5cdFx0Ly8gQmluZCBldmVudHNcblx0XHRfb24oZWwsICdtb3VzZWRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcblx0XHRfb24oZWwsICd0b3VjaHN0YXJ0JywgdGhpcy5fb25UYXBTdGFydCk7XG5cdFx0X29uKGVsLCAncG9pbnRlcmRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcblxuXHRcdGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuXHRcdFx0X29uKGVsLCAnZHJhZ292ZXInLCB0aGlzKTtcblx0XHRcdF9vbihlbCwgJ2RyYWdlbnRlcicsIHRoaXMpO1xuXHRcdH1cblxuXHRcdHRvdWNoRHJhZ092ZXJMaXN0ZW5lcnMucHVzaCh0aGlzLl9vbkRyYWdPdmVyKTtcblxuXHRcdC8vIFJlc3RvcmUgc29ydGluZ1xuXHRcdG9wdGlvbnMuc3RvcmUgJiYgdGhpcy5zb3J0KG9wdGlvbnMuc3RvcmUuZ2V0KHRoaXMpKTtcblx0fVxuXG5cblx0U29ydGFibGUucHJvdG90eXBlID0gLyoqIEBsZW5kcyBTb3J0YWJsZS5wcm90b3R5cGUgKi8ge1xuXHRcdGNvbnN0cnVjdG9yOiBTb3J0YWJsZSxcblxuXHRcdF9vblRhcFN0YXJ0OiBmdW5jdGlvbiAoLyoqIEV2ZW50fFRvdWNoRXZlbnQgKi9ldnQpIHtcblx0XHRcdHZhciBfdGhpcyA9IHRoaXMsXG5cdFx0XHRcdGVsID0gdGhpcy5lbCxcblx0XHRcdFx0b3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcblx0XHRcdFx0cHJldmVudE9uRmlsdGVyID0gb3B0aW9ucy5wcmV2ZW50T25GaWx0ZXIsXG5cdFx0XHRcdHR5cGUgPSBldnQudHlwZSxcblx0XHRcdFx0dG91Y2ggPSBldnQudG91Y2hlcyAmJiBldnQudG91Y2hlc1swXSxcblx0XHRcdFx0dGFyZ2V0ID0gKHRvdWNoIHx8IGV2dCkudGFyZ2V0LFxuXHRcdFx0XHRvcmlnaW5hbFRhcmdldCA9IGV2dC50YXJnZXQuc2hhZG93Um9vdCAmJiAoZXZ0LnBhdGggJiYgZXZ0LnBhdGhbMF0pIHx8IHRhcmdldCxcblx0XHRcdFx0ZmlsdGVyID0gb3B0aW9ucy5maWx0ZXIsXG5cdFx0XHRcdHN0YXJ0SW5kZXg7XG5cblx0XHRcdF9zYXZlSW5wdXRDaGVja2VkU3RhdGUoZWwpO1xuXG5cblx0XHRcdC8vIERvbid0IHRyaWdnZXIgc3RhcnQgZXZlbnQgd2hlbiBhbiBlbGVtZW50IGlzIGJlZW4gZHJhZ2dlZCwgb3RoZXJ3aXNlIHRoZSBldnQub2xkaW5kZXggYWx3YXlzIHdyb25nIHdoZW4gc2V0IG9wdGlvbi5ncm91cC5cblx0XHRcdGlmIChkcmFnRWwpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoL21vdXNlZG93bnxwb2ludGVyZG93bi8udGVzdCh0eXBlKSAmJiBldnQuYnV0dG9uICE9PSAwIHx8IG9wdGlvbnMuZGlzYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuOyAvLyBvbmx5IGxlZnQgYnV0dG9uIG9yIGVuYWJsZWRcblx0XHRcdH1cblxuXG5cdFx0XHR0YXJnZXQgPSBfY2xvc2VzdCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCk7XG5cblx0XHRcdGlmICghdGFyZ2V0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGxhc3REb3duRWwgPT09IHRhcmdldCkge1xuXHRcdFx0XHQvLyBJZ25vcmluZyBkdXBsaWNhdGUgYGRvd25gXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XG5cdFx0XHRzdGFydEluZGV4ID0gX2luZGV4KHRhcmdldCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuXG5cdFx0XHQvLyBDaGVjayBmaWx0ZXJcblx0XHRcdGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGlmIChmaWx0ZXIuY2FsbCh0aGlzLCBldnQsIHRhcmdldCwgdGhpcykpIHtcblx0XHRcdFx0XHRfZGlzcGF0Y2hFdmVudChfdGhpcywgb3JpZ2luYWxUYXJnZXQsICdmaWx0ZXInLCB0YXJnZXQsIGVsLCBzdGFydEluZGV4KTtcblx0XHRcdFx0XHRwcmV2ZW50T25GaWx0ZXIgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0cmV0dXJuOyAvLyBjYW5jZWwgZG5kXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGZpbHRlcikge1xuXHRcdFx0XHRmaWx0ZXIgPSBmaWx0ZXIuc3BsaXQoJywnKS5zb21lKGZ1bmN0aW9uIChjcml0ZXJpYSkge1xuXHRcdFx0XHRcdGNyaXRlcmlhID0gX2Nsb3Nlc3Qob3JpZ2luYWxUYXJnZXQsIGNyaXRlcmlhLnRyaW0oKSwgZWwpO1xuXG5cdFx0XHRcdFx0aWYgKGNyaXRlcmlhKSB7XG5cdFx0XHRcdFx0XHRfZGlzcGF0Y2hFdmVudChfdGhpcywgY3JpdGVyaWEsICdmaWx0ZXInLCB0YXJnZXQsIGVsLCBzdGFydEluZGV4KTtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGZpbHRlcikge1xuXHRcdFx0XHRcdHByZXZlbnRPbkZpbHRlciAmJiBldnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRyZXR1cm47IC8vIGNhbmNlbCBkbmRcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0aW9ucy5oYW5kbGUgJiYgIV9jbG9zZXN0KG9yaWdpbmFsVGFyZ2V0LCBvcHRpb25zLmhhbmRsZSwgZWwpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUHJlcGFyZSBgZHJhZ3N0YXJ0YFxuXHRcdFx0dGhpcy5fcHJlcGFyZURyYWdTdGFydChldnQsIHRvdWNoLCB0YXJnZXQsIHN0YXJ0SW5kZXgpO1xuXHRcdH0sXG5cblx0XHRfcHJlcGFyZURyYWdTdGFydDogZnVuY3Rpb24gKC8qKiBFdmVudCAqL2V2dCwgLyoqIFRvdWNoICovdG91Y2gsIC8qKiBIVE1MRWxlbWVudCAqL3RhcmdldCwgLyoqIE51bWJlciAqL3N0YXJ0SW5kZXgpIHtcblx0XHRcdHZhciBfdGhpcyA9IHRoaXMsXG5cdFx0XHRcdGVsID0gX3RoaXMuZWwsXG5cdFx0XHRcdG9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLFxuXHRcdFx0XHRvd25lckRvY3VtZW50ID0gZWwub3duZXJEb2N1bWVudCxcblx0XHRcdFx0ZHJhZ1N0YXJ0Rm47XG5cblx0XHRcdGlmICh0YXJnZXQgJiYgIWRyYWdFbCAmJiAodGFyZ2V0LnBhcmVudE5vZGUgPT09IGVsKSkge1xuXHRcdFx0XHR0YXBFdnQgPSBldnQ7XG5cblx0XHRcdFx0cm9vdEVsID0gZWw7XG5cdFx0XHRcdGRyYWdFbCA9IHRhcmdldDtcblx0XHRcdFx0cGFyZW50RWwgPSBkcmFnRWwucGFyZW50Tm9kZTtcblx0XHRcdFx0bmV4dEVsID0gZHJhZ0VsLm5leHRTaWJsaW5nO1xuXHRcdFx0XHRsYXN0RG93bkVsID0gdGFyZ2V0O1xuXHRcdFx0XHRhY3RpdmVHcm91cCA9IG9wdGlvbnMuZ3JvdXA7XG5cdFx0XHRcdG9sZEluZGV4ID0gc3RhcnRJbmRleDtcblxuXHRcdFx0XHR0aGlzLl9sYXN0WCA9ICh0b3VjaCB8fCBldnQpLmNsaWVudFg7XG5cdFx0XHRcdHRoaXMuX2xhc3RZID0gKHRvdWNoIHx8IGV2dCkuY2xpZW50WTtcblxuXHRcdFx0XHRkcmFnRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAndHJhbnNmb3JtJztcblxuXHRcdFx0XHRkcmFnU3RhcnRGbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHQvLyBEZWxheWVkIGRyYWcgaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdFx0XHRcdFx0Ly8gd2UgY2FuIHJlLWVuYWJsZSB0aGUgZXZlbnRzOiB0b3VjaG1vdmUvbW91c2Vtb3ZlXG5cdFx0XHRcdFx0X3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZygpO1xuXG5cdFx0XHRcdFx0Ly8gTWFrZSB0aGUgZWxlbWVudCBkcmFnZ2FibGVcblx0XHRcdFx0XHRkcmFnRWwuZHJhZ2dhYmxlID0gX3RoaXMubmF0aXZlRHJhZ2dhYmxlO1xuXG5cdFx0XHRcdFx0Ly8gQ2hvc2VuIGl0ZW1cblx0XHRcdFx0XHRfdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmNob3NlbkNsYXNzLCB0cnVlKTtcblxuXHRcdFx0XHRcdC8vIEJpbmQgdGhlIGV2ZW50czogZHJhZ3N0YXJ0L2RyYWdlbmRcblx0XHRcdFx0XHRfdGhpcy5fdHJpZ2dlckRyYWdTdGFydChldnQsIHRvdWNoKTtcblxuXHRcdFx0XHRcdC8vIERyYWcgc3RhcnQgZXZlbnRcblx0XHRcdFx0XHRfZGlzcGF0Y2hFdmVudChfdGhpcywgcm9vdEVsLCAnY2hvb3NlJywgZHJhZ0VsLCByb290RWwsIG9sZEluZGV4KTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBEaXNhYmxlIFwiZHJhZ2dhYmxlXCJcblx0XHRcdFx0b3B0aW9ucy5pZ25vcmUuc3BsaXQoJywnKS5mb3JFYWNoKGZ1bmN0aW9uIChjcml0ZXJpYSkge1xuXHRcdFx0XHRcdF9maW5kKGRyYWdFbCwgY3JpdGVyaWEudHJpbSgpLCBfZGlzYWJsZURyYWdnYWJsZSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdF9vbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9vbkRyb3ApO1xuXHRcdFx0XHRfb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoZW5kJywgX3RoaXMuX29uRHJvcCk7XG5cdFx0XHRcdF9vbihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCBfdGhpcy5fb25Ecm9wKTtcblx0XHRcdFx0X29uKG93bmVyRG9jdW1lbnQsICdwb2ludGVyY2FuY2VsJywgX3RoaXMuX29uRHJvcCk7XG5cdFx0XHRcdF9vbihvd25lckRvY3VtZW50LCAnc2VsZWN0c3RhcnQnLCBfdGhpcyk7XG5cblx0XHRcdFx0aWYgKG9wdGlvbnMuZGVsYXkpIHtcblx0XHRcdFx0XHQvLyBJZiB0aGUgdXNlciBtb3ZlcyB0aGUgcG9pbnRlciBvciBsZXQgZ28gdGhlIGNsaWNrIG9yIHRvdWNoXG5cdFx0XHRcdFx0Ly8gYmVmb3JlIHRoZSBkZWxheSBoYXMgYmVlbiByZWFjaGVkOlxuXHRcdFx0XHRcdC8vIGRpc2FibGUgdGhlIGRlbGF5ZWQgZHJhZ1xuXHRcdFx0XHRcdF9vbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuXHRcdFx0XHRcdF9vbihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcblx0XHRcdFx0XHRfb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG5cdFx0XHRcdFx0X29uKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcblx0XHRcdFx0XHRfb24ob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuXHRcdFx0XHRcdF9vbihvd25lckRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcblxuXHRcdFx0XHRcdF90aGlzLl9kcmFnU3RhcnRUaW1lciA9IHNldFRpbWVvdXQoZHJhZ1N0YXJ0Rm4sIG9wdGlvbnMuZGVsYXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRyYWdTdGFydEZuKCk7XG5cdFx0XHRcdH1cblxuXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdF9kaXNhYmxlRGVsYXllZERyYWc6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBvd25lckRvY3VtZW50ID0gdGhpcy5lbC5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5fZHJhZ1N0YXJ0VGltZXIpO1xuXHRcdFx0X29mZihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG5cdFx0XHRfb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG5cdFx0XHRfb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG5cdFx0XHRfb2ZmKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuXHRcdFx0X29mZihvd25lckRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcblx0XHRcdF9vZmYob3duZXJEb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcblx0XHR9LFxuXG5cdFx0X3RyaWdnZXJEcmFnU3RhcnQ6IGZ1bmN0aW9uICgvKiogRXZlbnQgKi9ldnQsIC8qKiBUb3VjaCAqL3RvdWNoKSB7XG5cdFx0XHR0b3VjaCA9IHRvdWNoIHx8IChldnQucG9pbnRlclR5cGUgPT0gJ3RvdWNoJyA/IGV2dCA6IG51bGwpO1xuXG5cdFx0XHRpZiAodG91Y2gpIHtcblx0XHRcdFx0Ly8gVG91Y2ggZGV2aWNlIHN1cHBvcnRcblx0XHRcdFx0dGFwRXZ0ID0ge1xuXHRcdFx0XHRcdHRhcmdldDogZHJhZ0VsLFxuXHRcdFx0XHRcdGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG5cdFx0XHRcdFx0Y2xpZW50WTogdG91Y2guY2xpZW50WVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHRoaXMuX29uRHJhZ1N0YXJ0KHRhcEV2dCwgJ3RvdWNoJyk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICghdGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcblx0XHRcdFx0dGhpcy5fb25EcmFnU3RhcnQodGFwRXZ0LCB0cnVlKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRfb24oZHJhZ0VsLCAnZHJhZ2VuZCcsIHRoaXMpO1xuXHRcdFx0XHRfb24ocm9vdEVsLCAnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7XG5cdFx0XHRcdFx0Ly8gVGltZW91dCBuZWNjZXNzYXJ5IGZvciBJRTlcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdF9kcmFnU3RhcnRlZDogZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHJvb3RFbCAmJiBkcmFnRWwpIHtcblx0XHRcdFx0dmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cblx0XHRcdFx0Ly8gQXBwbHkgZWZmZWN0XG5cdFx0XHRcdF90b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgdHJ1ZSk7XG5cdFx0XHRcdF90b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCBmYWxzZSk7XG5cblx0XHRcdFx0U29ydGFibGUuYWN0aXZlID0gdGhpcztcblxuXHRcdFx0XHQvLyBEcmFnIHN0YXJ0IGV2ZW50XG5cdFx0XHRcdF9kaXNwYXRjaEV2ZW50KHRoaXMsIHJvb3RFbCwgJ3N0YXJ0JywgZHJhZ0VsLCByb290RWwsIG9sZEluZGV4KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX251bGxpbmcoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0X2VtdWxhdGVEcmFnT3ZlcjogZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHRvdWNoRXZ0KSB7XG5cdFx0XHRcdGlmICh0aGlzLl9sYXN0WCA9PT0gdG91Y2hFdnQuY2xpZW50WCAmJiB0aGlzLl9sYXN0WSA9PT0gdG91Y2hFdnQuY2xpZW50WSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuX2xhc3RYID0gdG91Y2hFdnQuY2xpZW50WDtcblx0XHRcdFx0dGhpcy5fbGFzdFkgPSB0b3VjaEV2dC5jbGllbnRZO1xuXG5cdFx0XHRcdGlmICghc3VwcG9ydENzc1BvaW50ZXJFdmVudHMpIHtcblx0XHRcdFx0XHRfY3NzKGdob3N0RWwsICdkaXNwbGF5JywgJ25vbmUnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB0YXJnZXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHRvdWNoRXZ0LmNsaWVudFgsIHRvdWNoRXZ0LmNsaWVudFkpLFxuXHRcdFx0XHRcdHBhcmVudCA9IHRhcmdldCxcblx0XHRcdFx0XHRpID0gdG91Y2hEcmFnT3Zlckxpc3RlbmVycy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKHBhcmVudCkge1xuXHRcdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRcdGlmIChwYXJlbnRbZXhwYW5kb10pIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKGktLSkge1xuXHRcdFx0XHRcdFx0XHRcdHRvdWNoRHJhZ092ZXJMaXN0ZW5lcnNbaV0oe1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2xpZW50WDogdG91Y2hFdnQuY2xpZW50WCxcblx0XHRcdFx0XHRcdFx0XHRcdGNsaWVudFk6IHRvdWNoRXZ0LmNsaWVudFksXG5cdFx0XHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHRhcmdldCxcblx0XHRcdFx0XHRcdFx0XHRcdHJvb3RFbDogcGFyZW50XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dGFyZ2V0ID0gcGFyZW50OyAvLyBzdG9yZSBsYXN0IGVsZW1lbnRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0LyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXHRcdFx0XHRcdHdoaWxlIChwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXN1cHBvcnRDc3NQb2ludGVyRXZlbnRzKSB7XG5cdFx0XHRcdFx0X2NzcyhnaG9zdEVsLCAnZGlzcGxheScsICcnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblxuXHRcdF9vblRvdWNoTW92ZTogZnVuY3Rpb24gKC8qKlRvdWNoRXZlbnQqL2V2dCkge1xuXHRcdFx0aWYgKHRhcEV2dCkge1xuXHRcdFx0XHR2YXJcdG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG5cdFx0XHRcdFx0ZmFsbGJhY2tUb2xlcmFuY2UgPSBvcHRpb25zLmZhbGxiYWNrVG9sZXJhbmNlLFxuXHRcdFx0XHRcdGZhbGxiYWNrT2Zmc2V0ID0gb3B0aW9ucy5mYWxsYmFja09mZnNldCxcblx0XHRcdFx0XHR0b3VjaCA9IGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQsXG5cdFx0XHRcdFx0ZHggPSAodG91Y2guY2xpZW50WCAtIHRhcEV2dC5jbGllbnRYKSArIGZhbGxiYWNrT2Zmc2V0LngsXG5cdFx0XHRcdFx0ZHkgPSAodG91Y2guY2xpZW50WSAtIHRhcEV2dC5jbGllbnRZKSArIGZhbGxiYWNrT2Zmc2V0LnksXG5cdFx0XHRcdFx0dHJhbnNsYXRlM2QgPSBldnQudG91Y2hlcyA/ICd0cmFuc2xhdGUzZCgnICsgZHggKyAncHgsJyArIGR5ICsgJ3B4LDApJyA6ICd0cmFuc2xhdGUoJyArIGR4ICsgJ3B4LCcgKyBkeSArICdweCknO1xuXG5cdFx0XHRcdC8vIG9ubHkgc2V0IHRoZSBzdGF0dXMgdG8gZHJhZ2dpbmcsIHdoZW4gd2UgYXJlIGFjdHVhbGx5IGRyYWdnaW5nXG5cdFx0XHRcdGlmICghU29ydGFibGUuYWN0aXZlKSB7XG5cdFx0XHRcdFx0aWYgKGZhbGxiYWNrVG9sZXJhbmNlICYmXG5cdFx0XHRcdFx0XHRtaW4oYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLl9sYXN0WCksIGFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy5fbGFzdFkpKSA8IGZhbGxiYWNrVG9sZXJhbmNlXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5fZHJhZ1N0YXJ0ZWQoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGFzIHdlbGwgYXMgY3JlYXRpbmcgdGhlIGdob3N0IGVsZW1lbnQgb24gdGhlIGRvY3VtZW50IGJvZHlcblx0XHRcdFx0dGhpcy5fYXBwZW5kR2hvc3QoKTtcblxuXHRcdFx0XHRtb3ZlZCA9IHRydWU7XG5cdFx0XHRcdHRvdWNoRXZ0ID0gdG91Y2g7XG5cblx0XHRcdFx0X2NzcyhnaG9zdEVsLCAnd2Via2l0VHJhbnNmb3JtJywgdHJhbnNsYXRlM2QpO1xuXHRcdFx0XHRfY3NzKGdob3N0RWwsICdtb3pUcmFuc2Zvcm0nLCB0cmFuc2xhdGUzZCk7XG5cdFx0XHRcdF9jc3MoZ2hvc3RFbCwgJ21zVHJhbnNmb3JtJywgdHJhbnNsYXRlM2QpO1xuXHRcdFx0XHRfY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0nLCB0cmFuc2xhdGUzZCk7XG5cblx0XHRcdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdF9hcHBlbmRHaG9zdDogZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKCFnaG9zdEVsKSB7XG5cdFx0XHRcdHZhciByZWN0ID0gZHJhZ0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuXHRcdFx0XHRcdGNzcyA9IF9jc3MoZHJhZ0VsKSxcblx0XHRcdFx0XHRvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuXHRcdFx0XHRcdGdob3N0UmVjdDtcblxuXHRcdFx0XHRnaG9zdEVsID0gZHJhZ0VsLmNsb25lTm9kZSh0cnVlKTtcblxuXHRcdFx0XHRfdG9nZ2xlQ2xhc3MoZ2hvc3RFbCwgb3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG5cdFx0XHRcdF90b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmZhbGxiYWNrQ2xhc3MsIHRydWUpO1xuXHRcdFx0XHRfdG9nZ2xlQ2xhc3MoZ2hvc3RFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIHRydWUpO1xuXG5cdFx0XHRcdF9jc3MoZ2hvc3RFbCwgJ3RvcCcsIHJlY3QudG9wIC0gcGFyc2VJbnQoY3NzLm1hcmdpblRvcCwgMTApKTtcblx0XHRcdFx0X2NzcyhnaG9zdEVsLCAnbGVmdCcsIHJlY3QubGVmdCAtIHBhcnNlSW50KGNzcy5tYXJnaW5MZWZ0LCAxMCkpO1xuXHRcdFx0XHRfY3NzKGdob3N0RWwsICd3aWR0aCcsIHJlY3Qud2lkdGgpO1xuXHRcdFx0XHRfY3NzKGdob3N0RWwsICdoZWlnaHQnLCByZWN0LmhlaWdodCk7XG5cdFx0XHRcdF9jc3MoZ2hvc3RFbCwgJ29wYWNpdHknLCAnMC44Jyk7XG5cdFx0XHRcdF9jc3MoZ2hvc3RFbCwgJ3Bvc2l0aW9uJywgJ2ZpeGVkJyk7XG5cdFx0XHRcdF9jc3MoZ2hvc3RFbCwgJ3pJbmRleCcsICcxMDAwMDAnKTtcblx0XHRcdFx0X2NzcyhnaG9zdEVsLCAncG9pbnRlckV2ZW50cycsICdub25lJyk7XG5cblx0XHRcdFx0b3B0aW9ucy5mYWxsYmFja09uQm9keSAmJiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGdob3N0RWwpIHx8IHJvb3RFbC5hcHBlbmRDaGlsZChnaG9zdEVsKTtcblxuXHRcdFx0XHQvLyBGaXhpbmcgZGltZW5zaW9ucy5cblx0XHRcdFx0Z2hvc3RSZWN0ID0gZ2hvc3RFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdFx0X2NzcyhnaG9zdEVsLCAnd2lkdGgnLCByZWN0LndpZHRoICogMiAtIGdob3N0UmVjdC53aWR0aCk7XG5cdFx0XHRcdF9jc3MoZ2hvc3RFbCwgJ2hlaWdodCcsIHJlY3QuaGVpZ2h0ICogMiAtIGdob3N0UmVjdC5oZWlnaHQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRfb25EcmFnU3RhcnQ6IGZ1bmN0aW9uICgvKipFdmVudCovZXZ0LCAvKipib29sZWFuKi91c2VGYWxsYmFjaykge1xuXHRcdFx0dmFyIGRhdGFUcmFuc2ZlciA9IGV2dC5kYXRhVHJhbnNmZXIsXG5cdFx0XHRcdG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cblx0XHRcdHRoaXMuX29mZlVwRXZlbnRzKCk7XG5cblx0XHRcdGlmIChhY3RpdmVHcm91cC5jaGVja1B1bGwodGhpcywgdGhpcywgZHJhZ0VsLCBldnQpKSB7XG5cdFx0XHRcdGNsb25lRWwgPSBfY2xvbmUoZHJhZ0VsKTtcblxuXHRcdFx0XHRjbG9uZUVsLmRyYWdnYWJsZSA9IGZhbHNlO1xuXHRcdFx0XHRjbG9uZUVsLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJyc7XG5cblx0XHRcdFx0X2NzcyhjbG9uZUVsLCAnZGlzcGxheScsICdub25lJyk7XG5cdFx0XHRcdF90b2dnbGVDbGFzcyhjbG9uZUVsLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTtcblxuXHRcdFx0XHRyb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIGRyYWdFbCk7XG5cdFx0XHRcdF9kaXNwYXRjaEV2ZW50KHRoaXMsIHJvb3RFbCwgJ2Nsb25lJywgZHJhZ0VsKTtcblx0XHRcdH1cblxuXHRcdFx0X3RvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIHRydWUpO1xuXG5cdFx0XHRpZiAodXNlRmFsbGJhY2spIHtcblx0XHRcdFx0aWYgKHVzZUZhbGxiYWNrID09PSAndG91Y2gnKSB7XG5cdFx0XHRcdFx0Ly8gQmluZCB0b3VjaCBldmVudHNcblx0XHRcdFx0XHRfb24oZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG5cdFx0XHRcdFx0X29uKGRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9vbkRyb3ApO1xuXHRcdFx0XHRcdF9vbihkb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgdGhpcy5fb25Ecm9wKTtcblx0XHRcdFx0XHRfb24oZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcblx0XHRcdFx0XHRfb24oZG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9vbkRyb3ApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIE9sZCBicndvc2VyXG5cdFx0XHRcdFx0X29uKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuXHRcdFx0XHRcdF9vbihkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9vbkRyb3ApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fbG9vcElkID0gc2V0SW50ZXJ2YWwodGhpcy5fZW11bGF0ZURyYWdPdmVyLCA1MCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0aWYgKGRhdGFUcmFuc2Zlcikge1xuXHRcdFx0XHRcdGRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuXHRcdFx0XHRcdG9wdGlvbnMuc2V0RGF0YSAmJiBvcHRpb25zLnNldERhdGEuY2FsbCh0aGlzLCBkYXRhVHJhbnNmZXIsIGRyYWdFbCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRfb24oZG9jdW1lbnQsICdkcm9wJywgdGhpcyk7XG5cdFx0XHRcdHNldFRpbWVvdXQodGhpcy5fZHJhZ1N0YXJ0ZWQsIDApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRfb25EcmFnT3ZlcjogZnVuY3Rpb24gKC8qKkV2ZW50Ki9ldnQpIHtcblx0XHRcdHZhciBlbCA9IHRoaXMuZWwsXG5cdFx0XHRcdHRhcmdldCxcblx0XHRcdFx0ZHJhZ1JlY3QsXG5cdFx0XHRcdHRhcmdldFJlY3QsXG5cdFx0XHRcdHJldmVydCxcblx0XHRcdFx0b3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcblx0XHRcdFx0Z3JvdXAgPSBvcHRpb25zLmdyb3VwLFxuXHRcdFx0XHRhY3RpdmVTb3J0YWJsZSA9IFNvcnRhYmxlLmFjdGl2ZSxcblx0XHRcdFx0aXNPd25lciA9IChhY3RpdmVHcm91cCA9PT0gZ3JvdXApLFxuXHRcdFx0XHRpc01vdmluZ0JldHdlZW5Tb3J0YWJsZSA9IGZhbHNlLFxuXHRcdFx0XHRjYW5Tb3J0ID0gb3B0aW9ucy5zb3J0O1xuXG5cdFx0XHRpZiAoZXZ0LnByZXZlbnREZWZhdWx0ICE9PSB2b2lkIDApIHtcblx0XHRcdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdCFvcHRpb25zLmRyYWdvdmVyQnViYmxlICYmIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRyYWdFbC5hbmltYXRlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdG1vdmVkID0gdHJ1ZTtcblxuXHRcdFx0aWYgKGFjdGl2ZVNvcnRhYmxlICYmICFvcHRpb25zLmRpc2FibGVkICYmXG5cdFx0XHRcdChpc093bmVyXG5cdFx0XHRcdFx0PyBjYW5Tb3J0IHx8IChyZXZlcnQgPSAhcm9vdEVsLmNvbnRhaW5zKGRyYWdFbCkpIC8vIFJldmVydGluZyBpdGVtIGludG8gdGhlIG9yaWdpbmFsIGxpc3Rcblx0XHRcdFx0XHQ6IChcblx0XHRcdFx0XHRcdHB1dFNvcnRhYmxlID09PSB0aGlzIHx8XG5cdFx0XHRcdFx0XHQoXG5cdFx0XHRcdFx0XHRcdChhY3RpdmVTb3J0YWJsZS5sYXN0UHVsbE1vZGUgPSBhY3RpdmVHcm91cC5jaGVja1B1bGwodGhpcywgYWN0aXZlU29ydGFibGUsIGRyYWdFbCwgZXZ0KSkgJiZcblx0XHRcdFx0XHRcdFx0Z3JvdXAuY2hlY2tQdXQodGhpcywgYWN0aXZlU29ydGFibGUsIGRyYWdFbCwgZXZ0KVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KSAmJlxuXHRcdFx0XHQoZXZ0LnJvb3RFbCA9PT0gdm9pZCAwIHx8IGV2dC5yb290RWwgPT09IHRoaXMuZWwpIC8vIHRvdWNoIGZhbGxiYWNrXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gU21hcnQgYXV0by1zY3JvbGxpbmdcblx0XHRcdFx0X2F1dG9TY3JvbGwoZXZ0LCBvcHRpb25zLCB0aGlzLmVsKTtcblxuXHRcdFx0XHRpZiAoX3NpbGVudCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRhcmdldCA9IF9jbG9zZXN0KGV2dC50YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCk7XG5cdFx0XHRcdGRyYWdSZWN0ID0gZHJhZ0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdFx0XHRcdGlmIChwdXRTb3J0YWJsZSAhPT0gdGhpcykge1xuXHRcdFx0XHRcdHB1dFNvcnRhYmxlID0gdGhpcztcblx0XHRcdFx0XHRpc01vdmluZ0JldHdlZW5Tb3J0YWJsZSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmV2ZXJ0KSB7XG5cdFx0XHRcdFx0X2Nsb25lSGlkZShhY3RpdmVTb3J0YWJsZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0cGFyZW50RWwgPSByb290RWw7IC8vIGFjdHVhbGl6YXRpb25cblxuXHRcdFx0XHRcdGlmIChjbG9uZUVsIHx8IG5leHRFbCkge1xuXHRcdFx0XHRcdFx0cm9vdEVsLmluc2VydEJlZm9yZShkcmFnRWwsIGNsb25lRWwgfHwgbmV4dEVsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAoIWNhblNvcnQpIHtcblx0XHRcdFx0XHRcdHJvb3RFbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0aWYgKChlbC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHx8IChlbC5jaGlsZHJlblswXSA9PT0gZ2hvc3RFbCkgfHxcblx0XHRcdFx0XHQoZWwgPT09IGV2dC50YXJnZXQpICYmIChfZ2hvc3RJc0xhc3QoZWwsIGV2dCkpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vYXNzaWduIHRhcmdldCBvbmx5IGlmIGNvbmRpdGlvbiBpcyB0cnVlXG5cdFx0XHRcdFx0aWYgKGVsLmNoaWxkcmVuLmxlbmd0aCAhPT0gMCAmJiBlbC5jaGlsZHJlblswXSAhPT0gZ2hvc3RFbCAmJiBlbCA9PT0gZXZ0LnRhcmdldCkge1xuXHRcdFx0XHRcdFx0dGFyZ2V0ID0gZWwubGFzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRpZiAodGFyZ2V0LmFuaW1hdGVkKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dGFyZ2V0UmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRfY2xvbmVIaWRlKGFjdGl2ZVNvcnRhYmxlLCBpc093bmVyKTtcblxuXHRcdFx0XHRcdGlmIChfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgdGFyZ2V0UmVjdCwgZXZ0KSAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdGlmICghZHJhZ0VsLmNvbnRhaW5zKGVsKSkge1xuXHRcdFx0XHRcdFx0XHRlbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuXHRcdFx0XHRcdFx0XHRwYXJlbnRFbCA9IGVsOyAvLyBhY3R1YWxpemF0aW9uXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHRoaXMuX2FuaW1hdGUoZHJhZ1JlY3QsIGRyYWdFbCk7XG5cdFx0XHRcdFx0XHR0YXJnZXQgJiYgdGhpcy5fYW5pbWF0ZSh0YXJnZXRSZWN0LCB0YXJnZXQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICh0YXJnZXQgJiYgIXRhcmdldC5hbmltYXRlZCAmJiB0YXJnZXQgIT09IGRyYWdFbCAmJiAodGFyZ2V0LnBhcmVudE5vZGVbZXhwYW5kb10gIT09IHZvaWQgMCkpIHtcblx0XHRcdFx0XHRpZiAobGFzdEVsICE9PSB0YXJnZXQpIHtcblx0XHRcdFx0XHRcdGxhc3RFbCA9IHRhcmdldDtcblx0XHRcdFx0XHRcdGxhc3RDU1MgPSBfY3NzKHRhcmdldCk7XG5cdFx0XHRcdFx0XHRsYXN0UGFyZW50Q1NTID0gX2Nzcyh0YXJnZXQucGFyZW50Tm9kZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGFyZ2V0UmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdFx0XHRcdHZhciB3aWR0aCA9IHRhcmdldFJlY3QucmlnaHQgLSB0YXJnZXRSZWN0LmxlZnQsXG5cdFx0XHRcdFx0XHRoZWlnaHQgPSB0YXJnZXRSZWN0LmJvdHRvbSAtIHRhcmdldFJlY3QudG9wLFxuXHRcdFx0XHRcdFx0ZmxvYXRpbmcgPSBSX0ZMT0FULnRlc3QobGFzdENTUy5jc3NGbG9hdCArIGxhc3RDU1MuZGlzcGxheSlcblx0XHRcdFx0XHRcdFx0fHwgKGxhc3RQYXJlbnRDU1MuZGlzcGxheSA9PSAnZmxleCcgJiYgbGFzdFBhcmVudENTU1snZmxleC1kaXJlY3Rpb24nXS5pbmRleE9mKCdyb3cnKSA9PT0gMCksXG5cdFx0XHRcdFx0XHRpc1dpZGUgPSAodGFyZ2V0Lm9mZnNldFdpZHRoID4gZHJhZ0VsLm9mZnNldFdpZHRoKSxcblx0XHRcdFx0XHRcdGlzTG9uZyA9ICh0YXJnZXQub2Zmc2V0SGVpZ2h0ID4gZHJhZ0VsLm9mZnNldEhlaWdodCksXG5cdFx0XHRcdFx0XHRoYWxmd2F5ID0gKGZsb2F0aW5nID8gKGV2dC5jbGllbnRYIC0gdGFyZ2V0UmVjdC5sZWZ0KSAvIHdpZHRoIDogKGV2dC5jbGllbnRZIC0gdGFyZ2V0UmVjdC50b3ApIC8gaGVpZ2h0KSA+IDAuNSxcblx0XHRcdFx0XHRcdG5leHRTaWJsaW5nID0gdGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyxcblx0XHRcdFx0XHRcdGFmdGVyID0gZmFsc2Vcblx0XHRcdFx0XHQ7XG5cblx0XHRcdFx0XHRpZiAoZmxvYXRpbmcpIHtcblx0XHRcdFx0XHRcdHZhciBlbFRvcCA9IGRyYWdFbC5vZmZzZXRUb3AsXG5cdFx0XHRcdFx0XHRcdHRnVG9wID0gdGFyZ2V0Lm9mZnNldFRvcDtcblxuXHRcdFx0XHRcdFx0aWYgKGVsVG9wID09PSB0Z1RvcCkge1xuXHRcdFx0XHRcdFx0XHRhZnRlciA9ICh0YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZyA9PT0gZHJhZ0VsKSAmJiAhaXNXaWRlIHx8IGhhbGZ3YXkgJiYgaXNXaWRlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSBpZiAodGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgPT09IGRyYWdFbCB8fCBkcmFnRWwucHJldmlvdXNFbGVtZW50U2libGluZyA9PT0gdGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRcdGFmdGVyID0gKGV2dC5jbGllbnRZIC0gdGFyZ2V0UmVjdC50b3ApIC8gaGVpZ2h0ID4gMC41O1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0YWZ0ZXIgPSB0Z1RvcCA+IGVsVG9wO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICghaXNNb3ZpbmdCZXR3ZWVuU29ydGFibGUpIHtcblx0XHRcdFx0XHRcdGFmdGVyID0gKG5leHRTaWJsaW5nICE9PSBkcmFnRWwpICYmICFpc0xvbmcgfHwgaGFsZndheSAmJiBpc0xvbmc7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIG1vdmVWZWN0b3IgPSBfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgdGFyZ2V0UmVjdCwgZXZ0LCBhZnRlcik7XG5cblx0XHRcdFx0XHRpZiAobW92ZVZlY3RvciAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdGlmIChtb3ZlVmVjdG9yID09PSAxIHx8IG1vdmVWZWN0b3IgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGFmdGVyID0gKG1vdmVWZWN0b3IgPT09IDEpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRfc2lsZW50ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoX3Vuc2lsZW50LCAzMCk7XG5cblx0XHRcdFx0XHRcdF9jbG9uZUhpZGUoYWN0aXZlU29ydGFibGUsIGlzT3duZXIpO1xuXG5cdFx0XHRcdFx0XHRpZiAoIWRyYWdFbC5jb250YWlucyhlbCkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGFmdGVyICYmICFuZXh0U2libGluZykge1xuXHRcdFx0XHRcdFx0XHRcdGVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgYWZ0ZXIgPyBuZXh0U2libGluZyA6IHRhcmdldCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cGFyZW50RWwgPSBkcmFnRWwucGFyZW50Tm9kZTsgLy8gYWN0dWFsaXphdGlvblxuXG5cdFx0XHRcdFx0XHR0aGlzLl9hbmltYXRlKGRyYWdSZWN0LCBkcmFnRWwpO1xuXHRcdFx0XHRcdFx0dGhpcy5fYW5pbWF0ZSh0YXJnZXRSZWN0LCB0YXJnZXQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRfYW5pbWF0ZTogZnVuY3Rpb24gKHByZXZSZWN0LCB0YXJnZXQpIHtcblx0XHRcdHZhciBtcyA9IHRoaXMub3B0aW9ucy5hbmltYXRpb247XG5cblx0XHRcdGlmIChtcykge1xuXHRcdFx0XHR2YXIgY3VycmVudFJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHRcdFx0aWYgKHByZXZSZWN0Lm5vZGVUeXBlID09PSAxKSB7XG5cdFx0XHRcdFx0cHJldlJlY3QgPSBwcmV2UmVjdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdF9jc3ModGFyZ2V0LCAndHJhbnNpdGlvbicsICdub25lJyk7XG5cdFx0XHRcdF9jc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZTNkKCdcblx0XHRcdFx0XHQrIChwcmV2UmVjdC5sZWZ0IC0gY3VycmVudFJlY3QubGVmdCkgKyAncHgsJ1xuXHRcdFx0XHRcdCsgKHByZXZSZWN0LnRvcCAtIGN1cnJlbnRSZWN0LnRvcCkgKyAncHgsMCknXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0dGFyZ2V0Lm9mZnNldFdpZHRoOyAvLyByZXBhaW50XG5cblx0XHRcdFx0X2Nzcyh0YXJnZXQsICd0cmFuc2l0aW9uJywgJ2FsbCAnICsgbXMgKyAnbXMnKTtcblx0XHRcdFx0X2Nzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlM2QoMCwwLDApJyk7XG5cblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRhcmdldC5hbmltYXRlZCk7XG5cdFx0XHRcdHRhcmdldC5hbmltYXRlZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdF9jc3ModGFyZ2V0LCAndHJhbnNpdGlvbicsICcnKTtcblx0XHRcdFx0XHRfY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICcnKTtcblx0XHRcdFx0XHR0YXJnZXQuYW5pbWF0ZWQgPSBmYWxzZTtcblx0XHRcdFx0fSwgbXMpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRfb2ZmVXBFdmVudHM6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBvd25lckRvY3VtZW50ID0gdGhpcy5lbC5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRfb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuXHRcdFx0X29mZihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuXHRcdFx0X29mZihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX29uRHJvcCk7XG5cdFx0XHRfb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX29uRHJvcCk7XG5cdFx0XHRfb2ZmKG93bmVyRG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9vbkRyb3ApO1xuXHRcdFx0X29mZihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCB0aGlzLl9vbkRyb3ApO1xuXHRcdFx0X29mZihvd25lckRvY3VtZW50LCAncG9pbnRlcmNhbmNlbCcsIHRoaXMuX29uRHJvcCk7XG5cdFx0XHRfb2ZmKG93bmVyRG9jdW1lbnQsICdzZWxlY3RzdGFydCcsIHRoaXMpO1xuXHRcdH0sXG5cblx0XHRfb25Ecm9wOiBmdW5jdGlvbiAoLyoqRXZlbnQqL2V2dCkge1xuXHRcdFx0dmFyIGVsID0gdGhpcy5lbCxcblx0XHRcdFx0b3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuXHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLl9sb29wSWQpO1xuXHRcdFx0Y2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsLnBpZCk7XG5cdFx0XHRjbGVhclRpbWVvdXQodGhpcy5fZHJhZ1N0YXJ0VGltZXIpO1xuXG5cdFx0XHQvLyBVbmJpbmQgZXZlbnRzXG5cdFx0XHRfb2ZmKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuXG5cdFx0XHRpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcblx0XHRcdFx0X29mZihkb2N1bWVudCwgJ2Ryb3AnLCB0aGlzKTtcblx0XHRcdFx0X29mZihlbCwgJ2RyYWdzdGFydCcsIHRoaXMuX29uRHJhZ1N0YXJ0KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fb2ZmVXBFdmVudHMoKTtcblxuXHRcdFx0aWYgKGV2dCkge1xuXHRcdFx0XHRpZiAobW92ZWQpIHtcblx0XHRcdFx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHQhb3B0aW9ucy5kcm9wQnViYmxlICYmIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdob3N0RWwgJiYgZ2hvc3RFbC5wYXJlbnROb2RlICYmIGdob3N0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChnaG9zdEVsKTtcblxuXHRcdFx0XHRpZiAocm9vdEVsID09PSBwYXJlbnRFbCB8fCBTb3J0YWJsZS5hY3RpdmUubGFzdFB1bGxNb2RlICE9PSAnY2xvbmUnKSB7XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlIGNsb25lXG5cdFx0XHRcdFx0Y2xvbmVFbCAmJiBjbG9uZUVsLnBhcmVudE5vZGUgJiYgY2xvbmVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lRWwpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRyYWdFbCkge1xuXHRcdFx0XHRcdGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuXHRcdFx0XHRcdFx0X29mZihkcmFnRWwsICdkcmFnZW5kJywgdGhpcyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0X2Rpc2FibGVEcmFnZ2FibGUoZHJhZ0VsKTtcblx0XHRcdFx0XHRkcmFnRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnJztcblxuXHRcdFx0XHRcdC8vIFJlbW92ZSBjbGFzcydzXG5cdFx0XHRcdFx0X3RvZ2dsZUNsYXNzKGRyYWdFbCwgdGhpcy5vcHRpb25zLmdob3N0Q2xhc3MsIGZhbHNlKTtcblx0XHRcdFx0XHRfdG9nZ2xlQ2xhc3MoZHJhZ0VsLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTtcblxuXHRcdFx0XHRcdC8vIERyYWcgc3RvcCBldmVudFxuXHRcdFx0XHRcdF9kaXNwYXRjaEV2ZW50KHRoaXMsIHJvb3RFbCwgJ3VuY2hvb3NlJywgZHJhZ0VsLCByb290RWwsIG9sZEluZGV4KTtcblxuXHRcdFx0XHRcdGlmIChyb290RWwgIT09IHBhcmVudEVsKSB7XG5cdFx0XHRcdFx0XHRuZXdJbmRleCA9IF9pbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcblxuXHRcdFx0XHRcdFx0aWYgKG5ld0luZGV4ID49IDApIHtcblx0XHRcdFx0XHRcdFx0Ly8gQWRkIGV2ZW50XG5cdFx0XHRcdFx0XHRcdF9kaXNwYXRjaEV2ZW50KG51bGwsIHBhcmVudEVsLCAnYWRkJywgZHJhZ0VsLCByb290RWwsIG9sZEluZGV4LCBuZXdJbmRleCk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGV2ZW50XG5cdFx0XHRcdFx0XHRcdF9kaXNwYXRjaEV2ZW50KHRoaXMsIHJvb3RFbCwgJ3JlbW92ZScsIGRyYWdFbCwgcm9vdEVsLCBvbGRJbmRleCwgbmV3SW5kZXgpO1xuXG5cdFx0XHRcdFx0XHRcdC8vIGRyYWcgZnJvbSBvbmUgbGlzdCBhbmQgZHJvcCBpbnRvIGFub3RoZXJcblx0XHRcdFx0XHRcdFx0X2Rpc3BhdGNoRXZlbnQobnVsbCwgcGFyZW50RWwsICdzb3J0JywgZHJhZ0VsLCByb290RWwsIG9sZEluZGV4LCBuZXdJbmRleCk7XG5cdFx0XHRcdFx0XHRcdF9kaXNwYXRjaEV2ZW50KHRoaXMsIHJvb3RFbCwgJ3NvcnQnLCBkcmFnRWwsIHJvb3RFbCwgb2xkSW5kZXgsIG5ld0luZGV4KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAoZHJhZ0VsLm5leHRTaWJsaW5nICE9PSBuZXh0RWwpIHtcblx0XHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XG5cdFx0XHRcdFx0XHRcdG5ld0luZGV4ID0gX2luZGV4KGRyYWdFbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChuZXdJbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gZHJhZyAmIGRyb3Agd2l0aGluIHRoZSBzYW1lIGxpc3Rcblx0XHRcdFx0XHRcdFx0XHRfZGlzcGF0Y2hFdmVudCh0aGlzLCByb290RWwsICd1cGRhdGUnLCBkcmFnRWwsIHJvb3RFbCwgb2xkSW5kZXgsIG5ld0luZGV4KTtcblx0XHRcdFx0XHRcdFx0XHRfZGlzcGF0Y2hFdmVudCh0aGlzLCByb290RWwsICdzb3J0JywgZHJhZ0VsLCByb290RWwsIG9sZEluZGV4LCBuZXdJbmRleCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoU29ydGFibGUuYWN0aXZlKSB7XG5cdFx0XHRcdFx0XHQvKiBqc2hpbnQgZXFudWxsOnRydWUgKi9cblx0XHRcdFx0XHRcdGlmIChuZXdJbmRleCA9PSBudWxsIHx8IG5ld0luZGV4ID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRuZXdJbmRleCA9IG9sZEluZGV4O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRfZGlzcGF0Y2hFdmVudCh0aGlzLCByb290RWwsICdlbmQnLCBkcmFnRWwsIHJvb3RFbCwgb2xkSW5kZXgsIG5ld0luZGV4KTtcblxuXHRcdFx0XHRcdFx0Ly8gU2F2ZSBzb3J0aW5nXG5cdFx0XHRcdFx0XHR0aGlzLnNhdmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9udWxsaW5nKCk7XG5cdFx0fSxcblxuXHRcdF9udWxsaW5nOiBmdW5jdGlvbigpIHtcblx0XHRcdHJvb3RFbCA9XG5cdFx0XHRkcmFnRWwgPVxuXHRcdFx0cGFyZW50RWwgPVxuXHRcdFx0Z2hvc3RFbCA9XG5cdFx0XHRuZXh0RWwgPVxuXHRcdFx0Y2xvbmVFbCA9XG5cdFx0XHRsYXN0RG93bkVsID1cblxuXHRcdFx0c2Nyb2xsRWwgPVxuXHRcdFx0c2Nyb2xsUGFyZW50RWwgPVxuXG5cdFx0XHR0YXBFdnQgPVxuXHRcdFx0dG91Y2hFdnQgPVxuXG5cdFx0XHRtb3ZlZCA9XG5cdFx0XHRuZXdJbmRleCA9XG5cblx0XHRcdGxhc3RFbCA9XG5cdFx0XHRsYXN0Q1NTID1cblxuXHRcdFx0cHV0U29ydGFibGUgPVxuXHRcdFx0YWN0aXZlR3JvdXAgPVxuXHRcdFx0U29ydGFibGUuYWN0aXZlID0gbnVsbDtcblxuXHRcdFx0c2F2ZWRJbnB1dENoZWNrZWQuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcblx0XHRcdFx0ZWwuY2hlY2tlZCA9IHRydWU7XG5cdFx0XHR9KTtcblx0XHRcdHNhdmVkSW5wdXRDaGVja2VkLmxlbmd0aCA9IDA7XG5cdFx0fSxcblxuXHRcdGhhbmRsZUV2ZW50OiBmdW5jdGlvbiAoLyoqRXZlbnQqL2V2dCkge1xuXHRcdFx0c3dpdGNoIChldnQudHlwZSkge1xuXHRcdFx0XHRjYXNlICdkcm9wJzpcblx0XHRcdFx0Y2FzZSAnZHJhZ2VuZCc6XG5cdFx0XHRcdFx0dGhpcy5fb25Ecm9wKGV2dCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnZHJhZ292ZXInOlxuXHRcdFx0XHRjYXNlICdkcmFnZW50ZXInOlxuXHRcdFx0XHRcdGlmIChkcmFnRWwpIHtcblx0XHRcdFx0XHRcdHRoaXMuX29uRHJhZ092ZXIoZXZ0KTtcblx0XHRcdFx0XHRcdF9nbG9iYWxEcmFnT3ZlcihldnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdzZWxlY3RzdGFydCc6XG5cdFx0XHRcdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fSxcblxuXG5cdFx0LyoqXG5cdFx0ICogU2VyaWFsaXplcyB0aGUgaXRlbSBpbnRvIGFuIGFycmF5IG9mIHN0cmluZy5cblx0XHQgKiBAcmV0dXJucyB7U3RyaW5nW119XG5cdFx0ICovXG5cdFx0dG9BcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIG9yZGVyID0gW10sXG5cdFx0XHRcdGVsLFxuXHRcdFx0XHRjaGlsZHJlbiA9IHRoaXMuZWwuY2hpbGRyZW4sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRuID0gY2hpbGRyZW4ubGVuZ3RoLFxuXHRcdFx0XHRvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG5cdFx0XHRmb3IgKDsgaSA8IG47IGkrKykge1xuXHRcdFx0XHRlbCA9IGNoaWxkcmVuW2ldO1xuXHRcdFx0XHRpZiAoX2Nsb3Nlc3QoZWwsIG9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLmVsKSkge1xuXHRcdFx0XHRcdG9yZGVyLnB1c2goZWwuZ2V0QXR0cmlidXRlKG9wdGlvbnMuZGF0YUlkQXR0cikgfHwgX2dlbmVyYXRlSWQoZWwpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb3JkZXI7XG5cdFx0fSxcblxuXG5cdFx0LyoqXG5cdFx0ICogU29ydHMgdGhlIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgYXJyYXkuXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nW119ICBvcmRlciAgb3JkZXIgb2YgdGhlIGl0ZW1zXG5cdFx0ICovXG5cdFx0c29ydDogZnVuY3Rpb24gKG9yZGVyKSB7XG5cdFx0XHR2YXIgaXRlbXMgPSB7fSwgcm9vdEVsID0gdGhpcy5lbDtcblxuXHRcdFx0dGhpcy50b0FycmF5KCkuZm9yRWFjaChmdW5jdGlvbiAoaWQsIGkpIHtcblx0XHRcdFx0dmFyIGVsID0gcm9vdEVsLmNoaWxkcmVuW2ldO1xuXG5cdFx0XHRcdGlmIChfY2xvc2VzdChlbCwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSwgcm9vdEVsKSkge1xuXHRcdFx0XHRcdGl0ZW1zW2lkXSA9IGVsO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKTtcblxuXHRcdFx0b3JkZXIuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcblx0XHRcdFx0aWYgKGl0ZW1zW2lkXSkge1xuXHRcdFx0XHRcdHJvb3RFbC5yZW1vdmVDaGlsZChpdGVtc1tpZF0pO1xuXHRcdFx0XHRcdHJvb3RFbC5hcHBlbmRDaGlsZChpdGVtc1tpZF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cblx0XHQvKipcblx0XHQgKiBTYXZlIHRoZSBjdXJyZW50IHNvcnRpbmdcblx0XHQgKi9cblx0XHRzYXZlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgc3RvcmUgPSB0aGlzLm9wdGlvbnMuc3RvcmU7XG5cdFx0XHRzdG9yZSAmJiBzdG9yZS5zZXQodGhpcyk7XG5cdFx0fSxcblxuXG5cdFx0LyoqXG5cdFx0ICogRm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0LCBnZXQgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciBieSB0ZXN0aW5nIHRoZSBlbGVtZW50IGl0c2VsZiBhbmQgdHJhdmVyc2luZyB1cCB0aHJvdWdoIGl0cyBhbmNlc3RvcnMgaW4gdGhlIERPTSB0cmVlLlxuXHRcdCAqIEBwYXJhbSAgIHtIVE1MRWxlbWVudH0gIGVsXG5cdFx0ICogQHBhcmFtICAge1N0cmluZ30gICAgICAgW3NlbGVjdG9yXSAgZGVmYXVsdDogYG9wdGlvbnMuZHJhZ2dhYmxlYFxuXHRcdCAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxuXHRcdCAqL1xuXHRcdGNsb3Nlc3Q6IGZ1bmN0aW9uIChlbCwgc2VsZWN0b3IpIHtcblx0XHRcdHJldHVybiBfY2xvc2VzdChlbCwgc2VsZWN0b3IgfHwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSwgdGhpcy5lbCk7XG5cdFx0fSxcblxuXG5cdFx0LyoqXG5cdFx0ICogU2V0L2dldCBvcHRpb25cblx0XHQgKiBAcGFyYW0gICB7c3RyaW5nfSBuYW1lXG5cdFx0ICogQHBhcmFtICAgeyp9ICAgICAgW3ZhbHVlXVxuXHRcdCAqIEByZXR1cm5zIHsqfVxuXHRcdCAqL1xuXHRcdG9wdGlvbjogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG5cdFx0XHR2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuXHRcdFx0aWYgKHZhbHVlID09PSB2b2lkIDApIHtcblx0XHRcdFx0cmV0dXJuIG9wdGlvbnNbbmFtZV07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHRpb25zW25hbWVdID0gdmFsdWU7XG5cblx0XHRcdFx0aWYgKG5hbWUgPT09ICdncm91cCcpIHtcblx0XHRcdFx0XHRfcHJlcGFyZUdyb3VwKG9wdGlvbnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXG5cdFx0LyoqXG5cdFx0ICogRGVzdHJveVxuXHRcdCAqL1xuXHRcdGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBlbCA9IHRoaXMuZWw7XG5cblx0XHRcdGVsW2V4cGFuZG9dID0gbnVsbDtcblxuXHRcdFx0X29mZihlbCwgJ21vdXNlZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuXHRcdFx0X29mZihlbCwgJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRhcFN0YXJ0KTtcblx0XHRcdF9vZmYoZWwsICdwb2ludGVyZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuXG5cdFx0XHRpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcblx0XHRcdFx0X29mZihlbCwgJ2RyYWdvdmVyJywgdGhpcyk7XG5cdFx0XHRcdF9vZmYoZWwsICdkcmFnZW50ZXInLCB0aGlzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIGRyYWdnYWJsZSBhdHRyaWJ1dGVzXG5cdFx0XHRBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkcmFnZ2FibGVdJyksIGZ1bmN0aW9uIChlbCkge1xuXHRcdFx0XHRlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRvdWNoRHJhZ092ZXJMaXN0ZW5lcnMuc3BsaWNlKHRvdWNoRHJhZ092ZXJMaXN0ZW5lcnMuaW5kZXhPZih0aGlzLl9vbkRyYWdPdmVyKSwgMSk7XG5cblx0XHRcdHRoaXMuX29uRHJvcCgpO1xuXG5cdFx0XHR0aGlzLmVsID0gZWwgPSBudWxsO1xuXHRcdH1cblx0fTtcblxuXG5cdGZ1bmN0aW9uIF9jbG9uZUhpZGUoc29ydGFibGUsIHN0YXRlKSB7XG5cdFx0aWYgKHNvcnRhYmxlLmxhc3RQdWxsTW9kZSAhPT0gJ2Nsb25lJykge1xuXHRcdFx0c3RhdGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChjbG9uZUVsICYmIChjbG9uZUVsLnN0YXRlICE9PSBzdGF0ZSkpIHtcblx0XHRcdF9jc3MoY2xvbmVFbCwgJ2Rpc3BsYXknLCBzdGF0ZSA/ICdub25lJyA6ICcnKTtcblxuXHRcdFx0aWYgKCFzdGF0ZSkge1xuXHRcdFx0XHRpZiAoY2xvbmVFbC5zdGF0ZSkge1xuXHRcdFx0XHRcdGlmIChzb3J0YWJsZS5vcHRpb25zLmdyb3VwLnJldmVydENsb25lKSB7XG5cdFx0XHRcdFx0XHRyb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIG5leHRFbCk7XG5cdFx0XHRcdFx0XHRzb3J0YWJsZS5fYW5pbWF0ZShkcmFnRWwsIGNsb25lRWwpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIGRyYWdFbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNsb25lRWwuc3RhdGUgPSBzdGF0ZTtcblx0XHR9XG5cdH1cblxuXG5cdGZ1bmN0aW9uIF9jbG9zZXN0KC8qKkhUTUxFbGVtZW50Ki9lbCwgLyoqU3RyaW5nKi9zZWxlY3RvciwgLyoqSFRNTEVsZW1lbnQqL2N0eCkge1xuXHRcdGlmIChlbCkge1xuXHRcdFx0Y3R4ID0gY3R4IHx8IGRvY3VtZW50O1xuXG5cdFx0XHRkbyB7XG5cdFx0XHRcdGlmICgoc2VsZWN0b3IgPT09ICc+KicgJiYgZWwucGFyZW50Tm9kZSA9PT0gY3R4KSB8fCBfbWF0Y2hlcyhlbCwgc2VsZWN0b3IpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8qIGpzaGludCBib3NzOnRydWUgKi9cblx0XHRcdH0gd2hpbGUgKGVsID0gX2dldFBhcmVudE9ySG9zdChlbCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblxuXHRmdW5jdGlvbiBfZ2V0UGFyZW50T3JIb3N0KGVsKSB7XG5cdFx0dmFyIHBhcmVudCA9IGVsLmhvc3Q7XG5cblx0XHRyZXR1cm4gKHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUpID8gcGFyZW50IDogZWwucGFyZW50Tm9kZTtcblx0fVxuXG5cblx0ZnVuY3Rpb24gX2dsb2JhbERyYWdPdmVyKC8qKkV2ZW50Ki9ldnQpIHtcblx0XHRpZiAoZXZ0LmRhdGFUcmFuc2Zlcikge1xuXHRcdFx0ZXZ0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xuXHRcdH1cblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0fVxuXG5cblx0ZnVuY3Rpb24gX29uKGVsLCBldmVudCwgZm4pIHtcblx0XHRlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgY2FwdHVyZU1vZGUpO1xuXHR9XG5cblxuXHRmdW5jdGlvbiBfb2ZmKGVsLCBldmVudCwgZm4pIHtcblx0XHRlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgY2FwdHVyZU1vZGUpO1xuXHR9XG5cblxuXHRmdW5jdGlvbiBfdG9nZ2xlQ2xhc3MoZWwsIG5hbWUsIHN0YXRlKSB7XG5cdFx0aWYgKGVsKSB7XG5cdFx0XHRpZiAoZWwuY2xhc3NMaXN0KSB7XG5cdFx0XHRcdGVsLmNsYXNzTGlzdFtzdGF0ZSA/ICdhZGQnIDogJ3JlbW92ZSddKG5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHZhciBjbGFzc05hbWUgPSAoJyAnICsgZWwuY2xhc3NOYW1lICsgJyAnKS5yZXBsYWNlKFJfU1BBQ0UsICcgJykucmVwbGFjZSgnICcgKyBuYW1lICsgJyAnLCAnICcpO1xuXHRcdFx0XHRlbC5jbGFzc05hbWUgPSAoY2xhc3NOYW1lICsgKHN0YXRlID8gJyAnICsgbmFtZSA6ICcnKSkucmVwbGFjZShSX1NQQUNFLCAnICcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cblx0ZnVuY3Rpb24gX2NzcyhlbCwgcHJvcCwgdmFsKSB7XG5cdFx0dmFyIHN0eWxlID0gZWwgJiYgZWwuc3R5bGU7XG5cblx0XHRpZiAoc3R5bGUpIHtcblx0XHRcdGlmICh2YWwgPT09IHZvaWQgMCkge1xuXHRcdFx0XHRpZiAoZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuXHRcdFx0XHRcdHZhbCA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsICcnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmIChlbC5jdXJyZW50U3R5bGUpIHtcblx0XHRcdFx0XHR2YWwgPSBlbC5jdXJyZW50U3R5bGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcHJvcCA9PT0gdm9pZCAwID8gdmFsIDogdmFsW3Byb3BdO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGlmICghKHByb3AgaW4gc3R5bGUpKSB7XG5cdFx0XHRcdFx0cHJvcCA9ICctd2Via2l0LScgKyBwcm9wO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3R5bGVbcHJvcF0gPSB2YWwgKyAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyAnJyA6ICdweCcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cblx0ZnVuY3Rpb24gX2ZpbmQoY3R4LCB0YWdOYW1lLCBpdGVyYXRvcikge1xuXHRcdGlmIChjdHgpIHtcblx0XHRcdHZhciBsaXN0ID0gY3R4LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpLCBpID0gMCwgbiA9IGxpc3QubGVuZ3RoO1xuXG5cdFx0XHRpZiAoaXRlcmF0b3IpIHtcblx0XHRcdFx0Zm9yICg7IGkgPCBuOyBpKyspIHtcblx0XHRcdFx0XHRpdGVyYXRvcihsaXN0W2ldLCBpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbGlzdDtcblx0XHR9XG5cblx0XHRyZXR1cm4gW107XG5cdH1cblxuXG5cblx0ZnVuY3Rpb24gX2Rpc3BhdGNoRXZlbnQoc29ydGFibGUsIHJvb3RFbCwgbmFtZSwgdGFyZ2V0RWwsIGZyb21FbCwgc3RhcnRJbmRleCwgbmV3SW5kZXgpIHtcblx0XHRzb3J0YWJsZSA9IChzb3J0YWJsZSB8fCByb290RWxbZXhwYW5kb10pO1xuXG5cdFx0dmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpLFxuXHRcdFx0b3B0aW9ucyA9IHNvcnRhYmxlLm9wdGlvbnMsXG5cdFx0XHRvbk5hbWUgPSAnb24nICsgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyKDEpO1xuXG5cdFx0ZXZ0LmluaXRFdmVudChuYW1lLCB0cnVlLCB0cnVlKTtcblxuXHRcdGV2dC50byA9IHJvb3RFbDtcblx0XHRldnQuZnJvbSA9IGZyb21FbCB8fCByb290RWw7XG5cdFx0ZXZ0Lml0ZW0gPSB0YXJnZXRFbCB8fCByb290RWw7XG5cdFx0ZXZ0LmNsb25lID0gY2xvbmVFbDtcblxuXHRcdGV2dC5vbGRJbmRleCA9IHN0YXJ0SW5kZXg7XG5cdFx0ZXZ0Lm5ld0luZGV4ID0gbmV3SW5kZXg7XG5cblx0XHRyb290RWwuZGlzcGF0Y2hFdmVudChldnQpO1xuXG5cdFx0aWYgKG9wdGlvbnNbb25OYW1lXSkge1xuXHRcdFx0b3B0aW9uc1tvbk5hbWVdLmNhbGwoc29ydGFibGUsIGV2dCk7XG5cdFx0fVxuXHR9XG5cblxuXHRmdW5jdGlvbiBfb25Nb3ZlKGZyb21FbCwgdG9FbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0RWwsIHRhcmdldFJlY3QsIG9yaWdpbmFsRXZ0LCB3aWxsSW5zZXJ0QWZ0ZXIpIHtcblx0XHR2YXIgZXZ0LFxuXHRcdFx0c29ydGFibGUgPSBmcm9tRWxbZXhwYW5kb10sXG5cdFx0XHRvbk1vdmVGbiA9IHNvcnRhYmxlLm9wdGlvbnMub25Nb3ZlLFxuXHRcdFx0cmV0VmFsO1xuXG5cdFx0ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG5cdFx0ZXZ0LmluaXRFdmVudCgnbW92ZScsIHRydWUsIHRydWUpO1xuXG5cdFx0ZXZ0LnRvID0gdG9FbDtcblx0XHRldnQuZnJvbSA9IGZyb21FbDtcblx0XHRldnQuZHJhZ2dlZCA9IGRyYWdFbDtcblx0XHRldnQuZHJhZ2dlZFJlY3QgPSBkcmFnUmVjdDtcblx0XHRldnQucmVsYXRlZCA9IHRhcmdldEVsIHx8IHRvRWw7XG5cdFx0ZXZ0LnJlbGF0ZWRSZWN0ID0gdGFyZ2V0UmVjdCB8fCB0b0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGV2dC53aWxsSW5zZXJ0QWZ0ZXIgPSB3aWxsSW5zZXJ0QWZ0ZXI7XG5cblx0XHRmcm9tRWwuZGlzcGF0Y2hFdmVudChldnQpO1xuXG5cdFx0aWYgKG9uTW92ZUZuKSB7XG5cdFx0XHRyZXRWYWwgPSBvbk1vdmVGbi5jYWxsKHNvcnRhYmxlLCBldnQsIG9yaWdpbmFsRXZ0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0VmFsO1xuXHR9XG5cblxuXHRmdW5jdGlvbiBfZGlzYWJsZURyYWdnYWJsZShlbCkge1xuXHRcdGVsLmRyYWdnYWJsZSA9IGZhbHNlO1xuXHR9XG5cblxuXHRmdW5jdGlvbiBfdW5zaWxlbnQoKSB7XG5cdFx0X3NpbGVudCA9IGZhbHNlO1xuXHR9XG5cblxuXHQvKiogQHJldHVybnMge0hUTUxFbGVtZW50fGZhbHNlfSAqL1xuXHRmdW5jdGlvbiBfZ2hvc3RJc0xhc3QoZWwsIGV2dCkge1xuXHRcdHZhciBsYXN0RWwgPSBlbC5sYXN0RWxlbWVudENoaWxkLFxuXHRcdFx0cmVjdCA9IGxhc3RFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdC8vIDUg4oCUIG1pbiBkZWx0YVxuXHRcdC8vIGFicyDigJQg0L3QtdC70YzQt9GPINC00L7QsdCw0LLQu9GP0YLRjCwg0LAg0YLQviDQs9C70Y7QutC4INC/0YDQuCDQvdCw0LLQtdC00LXQvdC40Lgg0YHQstC10YDRhdGDXG5cdFx0cmV0dXJuIChldnQuY2xpZW50WSAtIChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0KSA+IDUpIHx8XG5cdFx0XHQoZXZ0LmNsaWVudFggLSAocmVjdC5sZWZ0ICsgcmVjdC53aWR0aCkgPiA1KTtcblx0fVxuXG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlIGlkXG5cdCAqIEBwYXJhbSAgIHtIVE1MRWxlbWVudH0gZWxcblx0ICogQHJldHVybnMge1N0cmluZ31cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGZ1bmN0aW9uIF9nZW5lcmF0ZUlkKGVsKSB7XG5cdFx0dmFyIHN0ciA9IGVsLnRhZ05hbWUgKyBlbC5jbGFzc05hbWUgKyBlbC5zcmMgKyBlbC5ocmVmICsgZWwudGV4dENvbnRlbnQsXG5cdFx0XHRpID0gc3RyLmxlbmd0aCxcblx0XHRcdHN1bSA9IDA7XG5cblx0XHR3aGlsZSAoaS0tKSB7XG5cdFx0XHRzdW0gKz0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN1bS50b1N0cmluZygzNik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgaW5kZXggb2YgYW4gZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudCBmb3IgYSBzZWxlY3RlZCBzZXQgb2Zcblx0ICogZWxlbWVudHNcblx0ICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsXG5cdCAqIEBwYXJhbSAge3NlbGVjdG9yfSBzZWxlY3RvclxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuXHRmdW5jdGlvbiBfaW5kZXgoZWwsIHNlbGVjdG9yKSB7XG5cdFx0dmFyIGluZGV4ID0gMDtcblxuXHRcdGlmICghZWwgfHwgIWVsLnBhcmVudE5vZGUpIHtcblx0XHRcdHJldHVybiAtMTtcblx0XHR9XG5cblx0XHR3aGlsZSAoZWwgJiYgKGVsID0gZWwucHJldmlvdXNFbGVtZW50U2libGluZykpIHtcblx0XHRcdGlmICgoZWwubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gJ1RFTVBMQVRFJykgJiYgKHNlbGVjdG9yID09PSAnPionIHx8IF9tYXRjaGVzKGVsLCBzZWxlY3RvcikpKSB7XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGluZGV4O1xuXHR9XG5cblx0ZnVuY3Rpb24gX21hdGNoZXMoLyoqSFRNTEVsZW1lbnQqL2VsLCAvKipTdHJpbmcqL3NlbGVjdG9yKSB7XG5cdFx0aWYgKGVsKSB7XG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNwbGl0KCcuJyk7XG5cblx0XHRcdHZhciB0YWcgPSBzZWxlY3Rvci5zaGlmdCgpLnRvVXBwZXJDYXNlKCksXG5cdFx0XHRcdHJlID0gbmV3IFJlZ0V4cCgnXFxcXHMoJyArIHNlbGVjdG9yLmpvaW4oJ3wnKSArICcpKD89XFxcXHMpJywgJ2cnKTtcblxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0KHRhZyA9PT0gJycgfHwgZWwubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PSB0YWcpICYmXG5cdFx0XHRcdCghc2VsZWN0b3IubGVuZ3RoIHx8ICgoJyAnICsgZWwuY2xhc3NOYW1lICsgJyAnKS5tYXRjaChyZSkgfHwgW10pLmxlbmd0aCA9PSBzZWxlY3Rvci5sZW5ndGgpXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGZ1bmN0aW9uIF90aHJvdHRsZShjYWxsYmFjaywgbXMpIHtcblx0XHR2YXIgYXJncywgX3RoaXM7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKGFyZ3MgPT09IHZvaWQgMCkge1xuXHRcdFx0XHRhcmdzID0gYXJndW1lbnRzO1xuXHRcdFx0XHRfdGhpcyA9IHRoaXM7XG5cblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRjYWxsYmFjay5jYWxsKF90aGlzLCBhcmdzWzBdKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2suYXBwbHkoX3RoaXMsIGFyZ3MpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGFyZ3MgPSB2b2lkIDA7XG5cdFx0XHRcdH0sIG1zKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gX2V4dGVuZChkc3QsIHNyYykge1xuXHRcdGlmIChkc3QgJiYgc3JjKSB7XG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG5cdFx0XHRcdGlmIChzcmMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHRcdGRzdFtrZXldID0gc3JjW2tleV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZHN0O1xuXHR9XG5cblx0ZnVuY3Rpb24gX2Nsb25lKGVsKSB7XG5cdFx0cmV0dXJuICRcblx0XHRcdD8gJChlbCkuY2xvbmUodHJ1ZSlbMF1cblx0XHRcdDogKFBvbHltZXIgJiYgUG9seW1lci5kb21cblx0XHRcdFx0PyBQb2x5bWVyLmRvbShlbCkuY2xvbmVOb2RlKHRydWUpXG5cdFx0XHRcdDogZWwuY2xvbmVOb2RlKHRydWUpXG5cdFx0XHQpO1xuXHR9XG5cblx0ZnVuY3Rpb24gX3NhdmVJbnB1dENoZWNrZWRTdGF0ZShyb290KSB7XG5cdFx0dmFyIGlucHV0cyA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7XG5cdFx0dmFyIGlkeCA9IGlucHV0cy5sZW5ndGg7XG5cblx0XHR3aGlsZSAoaWR4LS0pIHtcblx0XHRcdHZhciBlbCA9IGlucHV0c1tpZHhdO1xuXHRcdFx0ZWwuY2hlY2tlZCAmJiBzYXZlZElucHV0Q2hlY2tlZC5wdXNoKGVsKTtcblx0XHR9XG5cdH1cblxuXHQvLyBGaXhlZCAjOTczOiBcblx0X29uKGRvY3VtZW50LCAndG91Y2htb3ZlJywgZnVuY3Rpb24gKGV2dCkge1xuXHRcdGlmIChTb3J0YWJsZS5hY3RpdmUpIHtcblx0XHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblx0fSk7XG5cblx0dHJ5IHtcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG51bGwsIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y2FwdHVyZU1vZGUgPSB7XG5cdFx0XHRcdFx0Y2FwdHVyZTogZmFsc2UsXG5cdFx0XHRcdFx0cGFzc2l2ZTogZmFsc2Vcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9KSk7XG5cdH0gY2F0Y2ggKGVycikge31cblxuXHQvLyBFeHBvcnQgdXRpbHNcblx0U29ydGFibGUudXRpbHMgPSB7XG5cdFx0b246IF9vbixcblx0XHRvZmY6IF9vZmYsXG5cdFx0Y3NzOiBfY3NzLFxuXHRcdGZpbmQ6IF9maW5kLFxuXHRcdGlzOiBmdW5jdGlvbiAoZWwsIHNlbGVjdG9yKSB7XG5cdFx0XHRyZXR1cm4gISFfY2xvc2VzdChlbCwgc2VsZWN0b3IsIGVsKTtcblx0XHR9LFxuXHRcdGV4dGVuZDogX2V4dGVuZCxcblx0XHR0aHJvdHRsZTogX3Rocm90dGxlLFxuXHRcdGNsb3Nlc3Q6IF9jbG9zZXN0LFxuXHRcdHRvZ2dsZUNsYXNzOiBfdG9nZ2xlQ2xhc3MsXG5cdFx0Y2xvbmU6IF9jbG9uZSxcblx0XHRpbmRleDogX2luZGV4XG5cdH07XG5cblxuXHQvKipcblx0ICogQ3JlYXRlIHNvcnRhYmxlIGluc3RhbmNlXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9ICBlbFxuXHQgKiBAcGFyYW0ge09iamVjdH0gICAgICBbb3B0aW9uc11cblx0ICovXG5cdFNvcnRhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucykge1xuXHRcdHJldHVybiBuZXcgU29ydGFibGUoZWwsIG9wdGlvbnMpO1xuXHR9O1xuXG5cblx0Ly8gRXhwb3J0XG5cdFNvcnRhYmxlLnZlcnNpb24gPSAnMS42LjEnO1xuXHRyZXR1cm4gU29ydGFibGU7XG59KTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHtcbiAgcmVnaXN0ZXJBZG9ybmVyLFxuICBTdXJ2ZXlGb3JEZXNpZ25lclxufSBmcm9tIFwiLi4vc3VydmV5anNPYmplY3RzXCI7XG5pbXBvcnQgXCIuL2Zsb3dwYW5lbC1hY3Rpb25zLnNjc3NcIjtcbnZhciB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiaHRtbC1sb2FkZXI/aW50ZXJwb2xhdGUhdmFsLWxvYWRlciEuL2Zsb3dwYW5lbC1hY3Rpb25zLmh0bWxcIik7XG5pbXBvcnQgeyBRdWVzdGlvbkFjdGlvbnNBZG9ybmVyIH0gZnJvbSBcIi4vcXVlc3Rpb24tYWN0aW9uc1wiO1xuLy9pbXBvcnQgeyBTdXJ2ZXkgfSBmcm9tICdzdXJ2ZXkta25vY2tvdXQnO1xuXG5leHBvcnQgY2xhc3MgRmxvd1BhbmVsQWN0aW9uc0Fkb3JuZXIgZXh0ZW5kcyBRdWVzdGlvbkFjdGlvbnNBZG9ybmVyIHtcbiAgY29uc3RydWN0b3IocXVlc3Rpb24sIGVkaXRvciwgcHJpdmF0ZSBhZG9ybmVyRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBzdXBlcihxdWVzdGlvbiwgZWRpdG9yKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHN1cnZleUZvckRlc2duZXI6IFN1cnZleUZvckRlc2lnbmVyID0gZWRpdG9yLnN1cnZleTtcbiAgICB2YXIgZlBhbmVsID0gc2VsZi5hZG9ybmVyRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXG4gICAgICBcImYtcGFuZWxcIlxuICAgIClbMF07XG4gICAgdmFyIGNyZWF0ZVdyYXBwaW5nRnVuY3Rpb24gPSB0YWcgPT4gKCkgPT4ge1xuICAgICAgdmFyIHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgICAgaWYgKCEhc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgICB2YXIgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICghIXNlbGVjdGVkVGV4dCkge1xuICAgICAgICAgIHF1ZXN0aW9uLmNvbnRlbnQgPSBxdWVzdGlvbi5jb250ZW50LnJlcGxhY2UoXG4gICAgICAgICAgICBzZWxlY3RlZFRleHQsXG4gICAgICAgICAgICBcIjxcIiArIHRhZyArIFwiPlwiICsgc2VsZWN0ZWRUZXh0ICsgXCI8L1wiICsgdGFnICsgXCI+XCJcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIHZhciByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgIC8vIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgICAgICAgLy8gcmFuZ2UuaW5zZXJ0Tm9kZShcbiAgICAgICAgICAvLyAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxuICAgICAgICAgIC8vICAgICBcIjxcIiArIHRhZyArIFwiPlwiICsgc2VsZWN0ZWRUZXh0ICsgXCI8L1wiICsgdGFnICsgXCI+XCJcbiAgICAgICAgICAvLyAgIClcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmFjdGlvbnMuc3BsaWNlKDAsIDAsIHtcbiAgICAgIG5hbWU6IFwiYm9sZFwiLFxuICAgICAgdGV4dDogdGhpcy5sb2NhbGl6ZShcImVkLmJvbGRcIikgfHwgXCJCXCIsXG4gICAgICBvbkNsaWNrOiBjcmVhdGVXcmFwcGluZ0Z1bmN0aW9uKFwiYlwiKVxuICAgIH0pO1xuICAgIHRoaXMuYWN0aW9ucy5zcGxpY2UoMSwgMCwge1xuICAgICAgbmFtZTogXCJpdGFsaWNcIixcbiAgICAgIHRleHQ6IHRoaXMubG9jYWxpemUoXCJlZC5pdGFsaWNcIikgfHwgXCJJXCIsXG4gICAgICBvbkNsaWNrOiBjcmVhdGVXcmFwcGluZ0Z1bmN0aW9uKFwiaVwiKVxuICAgIH0pO1xuICAgIHRoaXMuYWN0aW9ucy5zcGxpY2UoMiwgMCwge1xuICAgICAgbmFtZTogXCJ1bmRlcmxpbmVcIixcbiAgICAgIHRleHQ6IHRoaXMubG9jYWxpemUoXCJlZC51bmRlcmxpbmVcIikgfHwgXCJVXCIsXG4gICAgICBvbkNsaWNrOiBjcmVhdGVXcmFwcGluZ0Z1bmN0aW9uKFwidVwiKVxuICAgIH0pO1xuICAgIHRoaXMuYWN0aW9ucy5zcGxpY2UoMywgMCwgPGFueT57XG4gICAgICBuYW1lOiBcImZwQWRkUXVlc3Rpb25cIixcbiAgICAgIHRleHQ6IHRoaXMubG9jYWxpemUoXCJlZC5mcEFkZFF1ZXN0aW9uXCIpLFxuICAgICAgdGl0bGU6IHRoaXMubG9jYWxpemUoXCJlZC5mcEFkZFF1ZXN0aW9uXCIpLFxuICAgICAgaGFzVGl0bGU6IHRydWUsXG4gICAgICB0ZW1wbGF0ZTogXCJmcC1hZGQtcXVlc3Rpb25cIixcbiAgICAgIGF2YWlsYWJsZVR5cGVzOiBbXCJ0ZXh0XCIsIFwiYm9vbGVhblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJjaGVja2JveFwiXSxcbiAgICAgIG9uQWRkUXVlc3Rpb246IDxhbnk+KChkYXRhLCBldmVudCkgPT4ge1xuICAgICAgICB2YXIgcXVlc3Rpb25UeXBlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICBpZiAoISFxdWVzdGlvblR5cGUpIHtcbiAgICAgICAgICB2YXIgbmV3RWxlbGVudE5hbWUgPSBlZGl0b3IuZ2V0TmV3TmFtZShxdWVzdGlvblR5cGUpO1xuICAgICAgICAgIHF1ZXN0aW9uLmFkZE5ld1F1ZXN0aW9uKHF1ZXN0aW9uVHlwZSwgbmV3RWxlbGVudE5hbWUpO1xuICAgICAgICAgIC8vIHF1ZXN0aW9uLmNvbnRlbnQgKz0gXCJ7XCIgKyBuZXdFbGVsZW50TmFtZSArIFwifVwiO1xuICAgICAgICAgIC8vIHZhciBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAvLyBpZiAoISFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAvLyAgIHZhciByYW5nZSA9IG5ldyBSYW5nZSgpO1xuICAgICAgICAgIC8vICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAvLyAgIHJhbmdlLmluc2VydE5vZGUoXG4gICAgICAgICAgLy8gICAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwie1wiICsgbmV3RWxlbGVudE5hbWUgKyBcIn1cIilcbiAgICAgICAgICAvLyAgICk7XG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSk7XG4gICAgdGhpcy5hY3Rpb25zLnNwbGljZSg0LCAwLCA8YW55PnsgdGVtcGxhdGU6IFwiYWN0aW9uLXNlcGFyYXRvclwiIH0pO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJmbG93cGFuZWwtYWN0aW9uc1wiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT5cbiAgICAgIG5ldyBGbG93UGFuZWxBY3Rpb25zQWRvcm5lcihwYXJhbXMucXVlc3Rpb24sIHBhcmFtcy5lZGl0b3IsIDxIVE1MRWxlbWVudD4oXG4gICAgICAgIGNvbXBvbmVudEluZm8uZWxlbWVudFxuICAgICAgKSlcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbFxufSk7XG5cbmV4cG9ydCB2YXIgZmxvd3BhbmVsQWN0aW9uc0Fkb3JuZXIgPSB7XG4gIGdldE1hcmtlckNsYXNzOiBtb2RlbCA9PiB7XG4gICAgcmV0dXJuIG1vZGVsLmdldFR5cGUoKSA9PT0gXCJmbG93cGFuZWxcIiA/IFwicGFuZWxfYWN0aW9uc1wiIDogXCJcIjtcbiAgfSxcbiAgZ2V0RWxlbWVudE5hbWU6IG1vZGVsID0+IFwiY29udGFpbmVyXCIsXG4gIGFmdGVyUmVuZGVyOiAoZWxlbWVudHM6IEhUTUxFbGVtZW50W10sIG1vZGVsLCBlZGl0b3IpID0+IHtcbiAgICB2YXIgZGVjb3JhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGVjb3JhdGlvbi5jbGFzc05hbWUgPSBcInN2ZGEtcXVlc3Rpb24tYWN0aW9uc1wiO1xuICAgIGRlY29yYXRpb24uaW5uZXJIVE1MID1cbiAgICAgIFwiPGZsb3dwYW5lbC1hY3Rpb25zIHBhcmFtcz0ncXVlc3Rpb246IG1vZGVsLCBlZGl0b3I6IGVkaXRvcic+PC9xdWVzdGlvbi1mbG93cGFuZWw+XCI7XG4gICAgZWxlbWVudHNbMF0uYXBwZW5kQ2hpbGQoZGVjb3JhdGlvbik7XG4gICAga28uYXBwbHlCaW5kaW5ncyh7IG1vZGVsOiBtb2RlbCwgZWRpdG9yOiBlZGl0b3IgfSwgZGVjb3JhdGlvbik7XG4gICAgZWRpdG9yLm9uQWRvcm5lclJlbmRlcmVkQ2FsbGJhY2sobW9kZWwsIFwiZmxvd3BhbmVsLWFjdGlvbnNcIiwgZGVjb3JhdGlvbik7XG4gIH1cbn07XG5cbnJlZ2lzdGVyQWRvcm5lcihcImZsb3dwYW5lbC1hY3Rpb25zXCIsIGZsb3dwYW5lbEFjdGlvbnNBZG9ybmVyKTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IHJlZ2lzdGVyQWRvcm5lciB9IGZyb20gXCIuLi9zdXJ2ZXlqc09iamVjdHNcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCBTb3J0YWJsZSBmcm9tIFwic29ydGFibGVqc1wiO1xuaW1wb3J0IHsgU3VydmV5Q3JlYXRvciB9IGZyb20gXCIuLi9lZGl0b3JcIjtcbmltcG9ydCB7IGNyZWF0ZUFkZEl0ZW1FbGVtZW50IH0gZnJvbSBcIi4vaXRlbS1lZGl0b3JcIjtcbmltcG9ydCB7IGdldE5leHRWYWx1ZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5pbXBvcnQgXCIuL2ltYWdlLWl0ZW1zLnNjc3NcIjtcbmltcG9ydCB7IFF1ZXN0aW9uU2VsZWN0QmFzZSB9IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IGNyZWF0ZUltYWdlRmlsZUNob29zZXIgfSBmcm9tIFwiLi9pbWFnZVwiO1xudmFyIHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vaW1hZ2UtaXRlbXMuaHRtbFwiKTtcblxuY2xhc3MgSW1hZ2VJdGVtSW5wbGFjZUVkaXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZSxcbiAgICBwcml2YXRlIGl0ZW0sXG4gICAgcHJpdmF0ZSByb290RWxlbWVudCxcbiAgICBwcml2YXRlIGVkaXRvcjogU3VydmV5Q3JlYXRvcixcbiAgICBwcml2YXRlIGl0ZW1zUm9vdFxuICApIHt9XG5cbiAgZGVsZXRlSXRlbShtb2RlbDogSW1hZ2VJdGVtSW5wbGFjZUVkaXRvciwgZXZlbnQpIHtcbiAgICBpZiAobW9kZWwucXVlc3Rpb24uY2hvaWNlcy5sZW5ndGggPiAxKSB7XG4gICAgICB2YXIgcHJvcGVydHkgPSBTdXJ2ZXkuU2VyaWFsaXplci5maW5kUHJvcGVydHkoXG4gICAgICAgIG1vZGVsLnF1ZXN0aW9uLmdldFR5cGUoKSxcbiAgICAgICAgXCJjaG9pY2VzXCJcbiAgICAgICk7XG4gICAgICB2YXIgYWxsb3dEZWxldGUgPSB0aGlzLmVkaXRvci5vbkNvbGxlY3Rpb25JdGVtRGVsZXRpbmdDYWxsYmFjayhcbiAgICAgICAgbW9kZWwucXVlc3Rpb24sXG4gICAgICAgIHByb3BlcnR5LFxuICAgICAgICBtb2RlbC5xdWVzdGlvbi5jaG9pY2VzLFxuICAgICAgICBtb2RlbC5pdGVtXG4gICAgICApO1xuICAgICAgaWYgKGFsbG93RGVsZXRlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IG1vZGVsLnF1ZXN0aW9uLmNob2ljZXMuaW5kZXhPZihtb2RlbC5pdGVtKTtcbiAgICAgICAgbW9kZWwucXVlc3Rpb24uY2hvaWNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLmVkaXRvci5vblF1ZXN0aW9uRWRpdG9yQ2hhbmdlZCh0aGlzLnF1ZXN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgaXNMYXN0SXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5jaG9pY2VzLmxlbmd0aCA9PT0gMTtcbiAgfVxuXG4gIGNob29zZUltYWdlKG1vZGVsLCBldmVudCkge1xuICAgIHZhciBmaWxlSW5wdXQgPSB0aGlzLml0ZW1zUm9vdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgXCJzdmRhLWNob29zZS1maWxlXCJcbiAgICApWzBdO1xuICAgIHRoaXMuZWRpdG9yLmNob29zZUZpbGVzKGZpbGVJbnB1dCwgdGhpcy5pbWFnZUNob3Nlbik7XG4gIH1cblxuICBpbWFnZUNob3NlbiA9IChmaWxlczogRmlsZVtdKSA9PiB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZWQgJiYgdGhpcy52YWx1ZUNoYW5nZWQoZmlsZXMpO1xuICB9O1xuXG4gIHB1YmxpYyBnZXRMb2NTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhzdHIpO1xuICB9XG5cbiAgdmFsdWVDaGFuZ2VkOiAobmV3VmFsOiBhbnkpID0+IHZvaWQ7XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJpbWFnZS1pdGVtLWVkaXRvclwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgdmFyIG1vZGVsID0gbmV3IEltYWdlSXRlbUlucGxhY2VFZGl0b3IoXG4gICAgICAgIHBhcmFtcy50YXJnZXRbcGFyYW1zLm5hbWVdLFxuICAgICAgICBwYXJhbXMucXVlc3Rpb24sXG4gICAgICAgIHBhcmFtcy5pdGVtLFxuICAgICAgICBjb21wb25lbnRJbmZvLmVsZW1lbnQsXG4gICAgICAgIHBhcmFtcy5lZGl0b3IsXG4gICAgICAgIHBhcmFtcy5pdGVtc1Jvb3RcbiAgICAgICk7XG4gICAgICB2YXIgcHJvcGVydHkgPSBTdXJ2ZXkuU2VyaWFsaXplci5maW5kUHJvcGVydHkoXG4gICAgICAgIFwiaW1hZ2VpdGVtdmFsdWVcIiwgLy9wYXJhbXMudGFyZ2V0LmdldFR5cGUoKSxcbiAgICAgICAgcGFyYW1zLm5hbWVcbiAgICAgICk7XG4gICAgICBtb2RlbC52YWx1ZUNoYW5nZWQgPSBmaWxlcyA9PiB7XG4gICAgICAgIGlmICghZmlsZXNbMF0pIHJldHVybjtcbiAgICAgICAgcGFyYW1zLmVkaXRvci51cGxvYWRGaWxlcyhmaWxlcywgKF8sIGxpbmspID0+IHtcbiAgICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHkubmFtZSxcbiAgICAgICAgICAgIG9iajogcGFyYW1zLml0ZW0sXG4gICAgICAgICAgICB2YWx1ZTogbGluayxcbiAgICAgICAgICAgIG5ld1ZhbHVlOiBudWxsLFxuICAgICAgICAgICAgZG9WYWxpZGF0aW9uOiBmYWxzZVxuICAgICAgICAgIH07XG4gICAgICAgICAgcGFyYW1zLmVkaXRvci5vblZhbHVlQ2hhbmdpbmdDYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgICBsaW5rID0gb3B0aW9ucy5uZXdWYWx1ZSA9PT0gbnVsbCA/IG9wdGlvbnMudmFsdWUgOiBvcHRpb25zLm5ld1ZhbHVlO1xuICAgICAgICAgIHBhcmFtcy50YXJnZXRbcGFyYW1zLm5hbWVdID0gbGluaztcbiAgICAgICAgICBwYXJhbXMuZWRpdG9yLm9uUHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHksIHBhcmFtcy50YXJnZXQsIGxpbmspO1xuICAgICAgICAgIHBhcmFtcy5lZGl0b3Iub25RdWVzdGlvbkVkaXRvckNoYW5nZWQocGFyYW1zLnF1ZXN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH1cbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbFxufSk7XG5cbmV4cG9ydCB2YXIgaW1hZ2VJdGVtc0Fkb3JuZXIgPSB7XG4gIGdldE1hcmtlckNsYXNzOiBtb2RlbCA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBtb2RlbC5nZXRUeXBlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIG1vZGVsLmdldFR5cGUoKSA9PT0gXCJpbWFnZXBpY2tlclwiXG4gICAgICA/IFwiaW1hZ2VfaXRlbV9lZGl0YWJsZVwiXG4gICAgICA6IFwiXCI7XG4gIH0sXG4gIGdldEVsZW1lbnROYW1lOiBtb2RlbCA9PiBcIml0ZW1cIixcbiAgYWZ0ZXJSZW5kZXI6IChlbGVtZW50czogSFRNTEVsZW1lbnRbXSwgbW9kZWw6IFF1ZXN0aW9uU2VsZWN0QmFzZSwgZWRpdG9yKSA9PiB7XG4gICAgdmFyIGl0ZW1zUm9vdCA9IGVsZW1lbnRzWzBdLnBhcmVudEVsZW1lbnQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgZWxlbWVudHNbaV0ub25jbGljayA9IGUgPT4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdmFyIGRlY29yYXRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIGRlY29yYXRpb24uY2xhc3NOYW1lID0gXCJzdmRhLWFkb3JuZXItcm9vdFwiO1xuICAgICAgZGVjb3JhdGlvbi5pbm5lckhUTUwgPVxuICAgICAgICBcIjxpbWFnZS1pdGVtLWVkaXRvciBwYXJhbXM9J25hbWU6IFxcXCJpbWFnZUxpbmtcXFwiLCB0YXJnZXQ6IHRhcmdldCwgaXRlbTogaXRlbSwgcXVlc3Rpb246IHF1ZXN0aW9uLCBlZGl0b3I6IGVkaXRvciwgaXRlbXNSb290OiBpdGVtc1Jvb3QnPjwvaW1hZ2UtaXRlbS1lZGl0b3I+XCI7XG4gICAgICBlbGVtZW50c1tpXS5hcHBlbmRDaGlsZChkZWNvcmF0aW9uKTtcbiAgICAgIGtvLmFwcGx5QmluZGluZ3MoXG4gICAgICAgIHtcbiAgICAgICAgICBpdGVtOiBtb2RlbC5jaG9pY2VzW2ldLFxuICAgICAgICAgIHF1ZXN0aW9uOiBtb2RlbCxcbiAgICAgICAgICB0YXJnZXQ6IG1vZGVsLmNob2ljZXNbaV0sXG4gICAgICAgICAgZWRpdG9yOiBlZGl0b3IsXG4gICAgICAgICAgaXRlbXNSb290OiBpdGVtc1Jvb3RcbiAgICAgICAgfSxcbiAgICAgICAgZGVjb3JhdGlvblxuICAgICAgKTtcbiAgICAgIGVkaXRvci5vbkFkb3JuZXJSZW5kZXJlZENhbGxiYWNrKFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgXCJpbWFnZS1pdGVtc1wiLFxuICAgICAgICBkZWNvcmF0aW9uLFxuICAgICAgICBtb2RlbC5jaG9pY2VzW2ldXG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBzb3J0YWJsZSA9IFNvcnRhYmxlLmNyZWF0ZShpdGVtc1Jvb3QsIHtcbiAgICAgIGhhbmRsZTogXCIuc3ZkYS1kcmFnLWhhbmRsZVwiLFxuICAgICAgZHJhZ2dhYmxlOiBcIi5pbWFnZV9pdGVtX2VkaXRhYmxlXCIsXG4gICAgICBhbmltYXRpb246IDE1MCxcbiAgICAgIG9uRW5kOiBldnQgPT4ge1xuICAgICAgICB2YXIgY2hvaWNlcyA9IG1vZGVsLmNob2ljZXM7XG4gICAgICAgIHZhciBjaG9pY2UgPSBjaG9pY2VzW2V2dC5vbGRJbmRleF07XG4gICAgICAgIGNob2ljZXMuc3BsaWNlKGV2dC5vbGRJbmRleCwgMSk7XG4gICAgICAgIGNob2ljZXMuc3BsaWNlKGV2dC5uZXdJbmRleCwgMCwgY2hvaWNlKTtcbiAgICAgICAgZWRpdG9yLm9uUXVlc3Rpb25FZGl0b3JDaGFuZ2VkKG1vZGVsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBpbnB1dCA9IGNyZWF0ZUltYWdlRmlsZUNob29zZXIobW9kZWwuY29udGVudE1vZGUpO1xuICAgIGl0ZW1zUm9vdC5hcHBlbmRDaGlsZChpbnB1dCk7XG4gIH1cbn07XG5cbnJlZ2lzdGVyQWRvcm5lcihcImltYWdlLWl0ZW1zXCIsIGltYWdlSXRlbXNBZG9ybmVyKTtcblxuZXhwb3J0IHZhciBhZGRJbWFnZUl0ZW1BZG9ybmVyID0ge1xuICBnZXRNYXJrZXJDbGFzczogbW9kZWwgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgbW9kZWwuZ2V0VHlwZSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICBtb2RlbC5nZXRUeXBlKCkgPT09IFwiaW1hZ2VwaWNrZXJcIlxuICAgICAgPyBcInN2X2ltYWdlcGlja2VyX3Jvb3RcIlxuICAgICAgOiBcIlwiO1xuICB9LFxuICBnZXRFbGVtZW50TmFtZTogbW9kZWwgPT4gXCJyb290XCIsXG4gIGFmdGVyUmVuZGVyOiAoZWxlbWVudHM6IEhUTUxFbGVtZW50W10sIG1vZGVsOiBRdWVzdGlvblNlbGVjdEJhc2UsIGVkaXRvcikgPT4ge1xuICAgIHZhciBpdGVtc1Jvb3QgPSBlbGVtZW50c1swXTtcbiAgICB2YXIgYWRkSXRlbUVsZW1lbnQgPSBjcmVhdGVBZGRJdGVtRWxlbWVudCgoKSA9PiB7XG4gICAgICB2YXIgZmlsZUlucHV0ID0gPEhUTUxJbnB1dEVsZW1lbnQ+KFxuICAgICAgICBpdGVtc1Jvb3QuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInN2ZGEtY2hvb3NlLWZpbGVcIilbMF1cbiAgICAgICk7XG4gICAgICBlZGl0b3IuY2hvb3NlRmlsZXMoZmlsZUlucHV0LCAoZmlsZXM6IEZpbGVbXSkgPT4ge1xuICAgICAgICB2YXIgaXRlbVRleHQgPSBTdXJ2ZXkuc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob2ljZXNfSXRlbVwiKTtcbiAgICAgICAgdmFyIG5leHRWYWx1ZSA9IGdldE5leHRWYWx1ZShcbiAgICAgICAgICBpdGVtVGV4dCxcbiAgICAgICAgICAobW9kZWwuY2hvaWNlcyB8fCBbXSkubWFwKGMgPT4gYy52YWx1ZSlcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIGl0ZW1WYWx1ZSA9IG5ldyAoPGFueT5TdXJ2ZXkpW1wiSXRlbVZhbHVlXCJdKFxuICAgICAgICAgIG5leHRWYWx1ZSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgXCJpbWFnZWl0ZW12YWx1ZVwiXG4gICAgICAgICk7XG4gICAgICAgIGl0ZW1WYWx1ZS5sb2NPd25lciA9IDxhbnk+e1xuICAgICAgICAgIGdldExvY2FsZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCEhbW9kZWxbXCJnZXRMb2NhbGVcIl0pIHJldHVybiBtb2RlbC5nZXRMb2NhbGUoKTtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0TWFya2Rvd25IdG1sOiAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldFByb2Nlc3NlZFRleHQ6ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbW9kZWwuY2hvaWNlcyA9IG1vZGVsLmNob2ljZXMuY29uY2F0KFtpdGVtVmFsdWVdKTtcbiAgICAgICAgaXRlbVZhbHVlID0gbW9kZWwuY2hvaWNlc1ttb2RlbC5jaG9pY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICBlZGl0b3Iub25RdWVzdGlvbkVkaXRvckNoYW5nZWQobW9kZWwpO1xuICAgICAgICBlZGl0b3Iub25JdGVtVmFsdWVBZGRlZENhbGxiYWNrKFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIFwiY2hvaWNlc1wiLFxuICAgICAgICAgIGl0ZW1WYWx1ZSxcbiAgICAgICAgICBtb2RlbC5jaG9pY2VzXG4gICAgICAgICk7XG5cbiAgICAgICAgdmFyIHByb3BlcnR5ID0gU3VydmV5LlNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KFxuICAgICAgICAgIFwiaW1hZ2VpdGVtdmFsdWVcIixcbiAgICAgICAgICBcImltYWdlTGlua1wiXG4gICAgICAgICk7XG4gICAgICAgIGVkaXRvci51cGxvYWRGaWxlcyhmaWxlcywgKF8sIGxpbmspID0+IHtcbiAgICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHkubmFtZSxcbiAgICAgICAgICAgIG9iajogaXRlbVZhbHVlLFxuICAgICAgICAgICAgdmFsdWU6IGxpbmssXG4gICAgICAgICAgICBuZXdWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgIGRvVmFsaWRhdGlvbjogZmFsc2VcbiAgICAgICAgICB9O1xuICAgICAgICAgIGVkaXRvci5vblZhbHVlQ2hhbmdpbmdDYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgICBsaW5rID0gb3B0aW9ucy5uZXdWYWx1ZSA9PT0gbnVsbCA/IG9wdGlvbnMudmFsdWUgOiBvcHRpb25zLm5ld1ZhbHVlO1xuICAgICAgICAgIGl0ZW1WYWx1ZVtcImltYWdlTGlua1wiXSA9IGxpbms7XG4gICAgICAgICAgZWRpdG9yLm9uUHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHksIGl0ZW1WYWx1ZSwgbGluayk7XG4gICAgICAgICAgZWRpdG9yLm9uUXVlc3Rpb25FZGl0b3JDaGFuZ2VkKG1vZGVsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBhZGRJdGVtRWxlbWVudC5zdHlsZS53aWR0aCA9IChtb2RlbFtcImltYWdlV2lkdGhcIl0gfHwgMjAwKSArIDEwICsgXCJweFwiO1xuICAgIGFkZEl0ZW1FbGVtZW50LnN0eWxlLmhlaWdodCA9IChtb2RlbFtcImltYWdlSGVpZ2h0XCJdIHx8IDE1MCkgKyAxMCArIFwicHhcIjtcbiAgICBhZGRJdGVtRWxlbWVudC5zdHlsZS5saW5lSGVpZ2h0ID0gYWRkSXRlbUVsZW1lbnQuc3R5bGUuaGVpZ2h0O1xuICAgIGl0ZW1zUm9vdC5hcHBlbmRDaGlsZChhZGRJdGVtRWxlbWVudCk7XG5cbiAgICB2YXIgaW5wdXQgPSBjcmVhdGVJbWFnZUZpbGVDaG9vc2VyKG1vZGVsLmNvbnRlbnRNb2RlKTtcbiAgICBpdGVtc1Jvb3QuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuICB9XG59O1xuXG5yZWdpc3RlckFkb3JuZXIoXCJhZGQtaW1hZ2UtaXRlbVwiLCBhZGRJbWFnZUl0ZW1BZG9ybmVyKTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IHJlZ2lzdGVyQWRvcm5lciB9IGZyb20gXCIuLi9zdXJ2ZXlqc09iamVjdHNcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcblxuaW1wb3J0IFwiLi9pbWFnZS5zY3NzXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltYWdlTW9kZWwgfSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG52YXIgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9pbWFnZS5odG1sXCIpO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW1hZ2VGaWxlQ2hvb3Nlcihjb250ZW50TW9kZT86IHN0cmluZykge1xuICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgaW5wdXQudHlwZSA9IFwiZmlsZVwiO1xuICBpZighIWNvbnRlbnRNb2RlKSB7XG4gICAgaW5wdXQuYWNjZXB0ID0gY29udGVudE1vZGUgPT09IFwidmlkZW9cIiA/IFwidmlkZW8vKlwiIDogXCJpbWFnZS8qXCI7XG4gIH1cbiAgaW5wdXQuY2xhc3NOYW1lID0gXCJzdmRhLWNob29zZS1maWxlXCI7XG4gIGlucHV0LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICBpbnB1dC5zdHlsZS5vcGFjaXR5ID0gXCIwXCI7XG4gIGlucHV0LnN0eWxlLndpZHRoID0gXCIxcHhcIjtcbiAgaW5wdXQuc3R5bGUuaGVpZ2h0ID0gXCIxcHhcIjtcbiAgaW5wdXQuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICByZXR1cm4gaW5wdXQ7XG59XG5cbmNsYXNzIEltYWdlSW5wbGFjZUVkaXRvciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaW5wdXQsIHB1YmxpYyBhbGxvd0RlbGV0ZSA9IGZhbHNlLCBwcml2YXRlIGVkaXRvcikge31cblxuICBjaG9vc2VJbWFnZShtb2RlbCwgZXZlbnQpIHtcbiAgICB0aGlzLmVkaXRvci5jaG9vc2VGaWxlcyhtb2RlbC5pbnB1dCwgbW9kZWwuaW1hZ2VDaG9zZW4pO1xuICB9XG5cbiAgZGVsZXRlSW1hZ2UobW9kZWwsIGV2ZW50KSB7XG4gICAgbW9kZWwudmFsdWVDaGFuZ2VkICYmIG1vZGVsLnZhbHVlQ2hhbmdlZCh1bmRlZmluZWQpO1xuICB9XG5cbiAgaW1hZ2VDaG9zZW4gPSAoZmlsZXM6IEZpbGVbXSkgPT4ge1xuICAgIHRoaXMudmFsdWVDaGFuZ2VkICYmIHRoaXMudmFsdWVDaGFuZ2VkKGZpbGVzKTtcbiAgfTtcblxuICBwdWJsaWMgZ2V0TG9jU3RyaW5nKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoc3RyKTtcbiAgfVxuXG4gIHZhbHVlQ2hhbmdlZDogKG5ld1ZhbDogYW55KSA9PiB2b2lkO1xufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwiaW1hZ2UtZWRpdG9yXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICB2YXIgbW9kZWwgPSBuZXcgSW1hZ2VJbnBsYWNlRWRpdG9yKFxuICAgICAgICBwYXJhbXMuaW5wdXQsXG4gICAgICAgIHBhcmFtcy5hbGxvd0RlbGV0ZSxcbiAgICAgICAgcGFyYW1zLmVkaXRvclxuICAgICAgKTtcbiAgICAgIHZhciBwcm9wZXJ0eSA9IFN1cnZleS5TZXJpYWxpemVyLmZpbmRQcm9wZXJ0eShcbiAgICAgICAgcGFyYW1zLnRhcmdldC5nZXRUeXBlKCksXG4gICAgICAgIHBhcmFtcy5uYW1lXG4gICAgICApO1xuICAgICAgdmFyIHNldFZhbHVlID0gKGxpbmspID0+IHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eS5uYW1lLFxuICAgICAgICAgIG9iajogcGFyYW1zLml0ZW0sXG4gICAgICAgICAgdmFsdWU6IGxpbmssXG4gICAgICAgICAgbmV3VmFsdWU6IG51bGwsXG4gICAgICAgICAgZG9WYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgcGFyYW1zLmVkaXRvci5vblZhbHVlQ2hhbmdpbmdDYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgbGluayA9IG9wdGlvbnMubmV3VmFsdWUgPT09IG51bGwgPyBvcHRpb25zLnZhbHVlIDogb3B0aW9ucy5uZXdWYWx1ZTtcbiAgICAgICAgcGFyYW1zLnRhcmdldFtwYXJhbXMubmFtZV0gPSBsaW5rO1xuICAgICAgICBwYXJhbXMuZWRpdG9yLm9uUHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHksIHBhcmFtcy50YXJnZXQsIGxpbmspO1xuICAgICAgICBwYXJhbXMuZWRpdG9yLm9uUXVlc3Rpb25FZGl0b3JDaGFuZ2VkKHBhcmFtcy5xdWVzdGlvbik7XG4gICAgICB9O1xuICAgICAgbW9kZWwudmFsdWVDaGFuZ2VkID0gKGZpbGVzKSA9PiB7XG4gICAgICAgIGlmIChmaWxlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0VmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmaWxlc1swXSkgcmV0dXJuO1xuICAgICAgICBwYXJhbXMuZWRpdG9yLnVwbG9hZEZpbGVzKGZpbGVzLCAoXywgbGluaykgPT4gc2V0VmFsdWUobGluaykpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG5cbmV4cG9ydCB2YXIgaW1hZ2VBZG9ybmVyID0ge1xuICBnZXRNYXJrZXJDbGFzczogKG1vZGVsKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBtb2RlbC5nZXRUeXBlID09PSBcImZ1bmN0aW9uXCIgJiYgbW9kZWwuZ2V0VHlwZSgpID09PSBcImltYWdlXCJcbiAgICAgID8gXCJpbWFnZV9lZGl0YWJsZVwiXG4gICAgICA6IFwiXCI7XG4gIH0sXG4gIGdldEVsZW1lbnROYW1lOiAobW9kZWwpID0+IFwicm9vdFwiLFxuICBhZnRlclJlbmRlcjogKGVsZW1lbnRzOiBIVE1MRWxlbWVudFtdLCBtb2RlbDogUXVlc3Rpb25JbWFnZU1vZGVsLCBlZGl0b3IpID0+IHtcbiAgICB2YXIgaXRlbXNSb290ID0gZWxlbWVudHNbMF07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgZWxlbWVudHNbaV0ub25jbGljayA9IChlKSA9PiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB2YXIgZGVjb3JhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgZGVjb3JhdGlvbi5jbGFzc05hbWUgPSBcInN2ZGEtYWRvcm5lci1yb290XCI7XG4gICAgICBkZWNvcmF0aW9uLmlubmVySFRNTCA9XG4gICAgICAgIFwiPGltYWdlLWVkaXRvciBwYXJhbXM9J25hbWU6IFxcXCJpbWFnZUxpbmtcXFwiLCB0YXJnZXQ6IHRhcmdldCwgcXVlc3Rpb246IHF1ZXN0aW9uLCBlZGl0b3I6IGVkaXRvciwgaW5wdXQ6IGlucHV0Jz48L2ltYWdlLWVkaXRvcj5cIjtcbiAgICAgIGVsZW1lbnRzW2ldLmFwcGVuZENoaWxkKGRlY29yYXRpb24pO1xuXG4gICAgICB2YXIgaW5wdXQgPSBjcmVhdGVJbWFnZUZpbGVDaG9vc2VyKG1vZGVsLmNvbnRlbnRNb2RlKTtcbiAgICAgIGl0ZW1zUm9vdC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGlucHV0KTtcblxuICAgICAga28uYXBwbHlCaW5kaW5ncyhcbiAgICAgICAge1xuICAgICAgICAgIHF1ZXN0aW9uOiBtb2RlbCxcbiAgICAgICAgICB0YXJnZXQ6IG1vZGVsLFxuICAgICAgICAgIGVkaXRvcjogZWRpdG9yLFxuICAgICAgICAgIGlucHV0OiBpbnB1dCxcbiAgICAgICAgfSxcbiAgICAgICAgZGVjb3JhdGlvblxuICAgICAgKTtcbiAgICAgIGVkaXRvci5vbkFkb3JuZXJSZW5kZXJlZENhbGxiYWNrKG1vZGVsLCBcImltYWdlXCIsIGRlY29yYXRpb24sIG1vZGVsKTtcbiAgICB9XG4gIH0sXG59O1xuXG5yZWdpc3RlckFkb3JuZXIoXCJpbWFnZVwiLCBpbWFnZUFkb3JuZXIpO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJBZG9ybmVyIH0gZnJvbSBcIi4uL3N1cnZleWpzT2JqZWN0c1wiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gXCJzb3J0YWJsZWpzXCI7XG5pbXBvcnQgeyBUaXRsZUlucGxhY2VFZGl0b3IgfSBmcm9tIFwiLi90aXRsZS1lZGl0b3JcIjtcbmltcG9ydCB7IFN1cnZleUNyZWF0b3IgfSBmcm9tIFwiLi4vZWRpdG9yXCI7XG5pbXBvcnQgeyBnZXROZXh0VmFsdWUsIGNyZWF0ZUtleTJjbGljayB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSBcIi4uL3N1cnZleUhlbHBlclwiO1xuXG5pbXBvcnQgXCIuL2l0ZW0tZWRpdG9yLnNjc3NcIjtcbmltcG9ydCB7IFF1ZXN0aW9uU2VsZWN0QmFzZSB9IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbnZhciB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiaHRtbC1sb2FkZXI/aW50ZXJwb2xhdGUhdmFsLWxvYWRlciEuL2l0ZW0tZWRpdG9yLmh0bWxcIik7XG5cbmZ1bmN0aW9uIGZvY3VzQWZ0ZXJDaGFuZ2UocXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZSwgaW5kZXggPSAwKSB7XG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmIChxdWVzdGlvbi5yZW5kZXJlZEVsZW1lbnQgJiYgaW5kZXggPj0gLTEpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgaW5kZXggPSAwO1xuICAgICAgfVxuICAgICAgdmFyIGZvY3VzYWJsZXMgPSA8SFRNTEVsZW1lbnRbXT4oXG4gICAgICAgICg8YW55PnF1ZXN0aW9uLnJlbmRlcmVkRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwic3ZkYS1mb2N1c2FibGVcIikpXG4gICAgICApO1xuICAgICAgaWYgKGZvY3VzYWJsZXMubGVuZ3RoID4gMCAmJiBpbmRleCA8PSBmb2N1c2FibGVzLmxlbmd0aCkge1xuICAgICAgICBpZiAoaW5kZXggPj0gZm9jdXNhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICBpbmRleCA9IGZvY3VzYWJsZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBmb2N1c2FibGVzW2luZGV4XS5mb2N1cyAmJiBmb2N1c2FibGVzW2luZGV4XS5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgMTApO1xufVxuXG5leHBvcnQgY2xhc3MgSXRlbUlucGxhY2VFZGl0b3IgZXh0ZW5kcyBUaXRsZUlucGxhY2VFZGl0b3Ige1xuICBwcml2YXRlIF9hbGxvd0FkZFJlbW92ZUl0ZW1zID0gdHJ1ZTtcbiAgY29uc3RydWN0b3IoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZSxcbiAgICBwcml2YXRlIGl0ZW0sXG4gICAgcm9vdEVsZW1lbnQsXG4gICAgZWRpdG9yOiBTdXJ2ZXlDcmVhdG9yXG4gICkge1xuICAgIHN1cGVyKHRhcmdldCwgbmFtZSwgcm9vdEVsZW1lbnQsIG51bGwsIGVkaXRvcik7XG4gICAgcm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAzOCAmJiBldmVudC5hbHRLZXkpIHtcbiAgICAgICAgU3VydmV5SGVscGVyLm1vdmVJdGVtSW5BcnJheShcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmNob2ljZXMsXG4gICAgICAgICAgdGhpcy5pdGVtLFxuICAgICAgICAgICh0aGlzLnF1ZXN0aW9uLmNob2ljZXMuaW5kZXhPZih0aGlzLml0ZW0pIC1cbiAgICAgICAgICAgIDEgK1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5jaG9pY2VzLmxlbmd0aCkgJVxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5jaG9pY2VzLmxlbmd0aFxuICAgICAgICApO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gNDAgJiYgZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgIFN1cnZleUhlbHBlci5tb3ZlSXRlbUluQXJyYXkoXG4gICAgICAgICAgdGhpcy5xdWVzdGlvbi5jaG9pY2VzLFxuICAgICAgICAgIHRoaXMuaXRlbSxcbiAgICAgICAgICAodGhpcy5xdWVzdGlvbi5jaG9pY2VzLmluZGV4T2YodGhpcy5pdGVtKSArIDEpICVcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uY2hvaWNlcy5sZW5ndGhcbiAgICAgICAgKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgdGhpcy5zdGFydEVkaXQodGhpcywgZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gNDYgJiYgcXVlc3Rpb24uY2hvaWNlcy5sZW5ndGggIT0gMSkge1xuICAgICAgICB0aGlzLmRlbGV0ZUl0ZW0odGhpcywgZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIGVkaXRvck9wdGlvbnMgPSB7XG4gICAgICBhbGxvd0FkZFJlbW92ZUl0ZW1zOiB0cnVlLFxuICAgICAgYWxsb3dSZW1vdmVBbGxJdGVtczogdHJ1ZSxcbiAgICB9O1xuICAgIHRoaXMuZWRpdG9yLm9uU2V0UHJvcGVydHlFZGl0b3JPcHRpb25zQ2FsbGJhY2soXG4gICAgICBcImNob2ljZXNcIixcbiAgICAgIHRoaXMucXVlc3Rpb24sXG4gICAgICBlZGl0b3JPcHRpb25zXG4gICAgKTtcbiAgICB0aGlzLl9hbGxvd0FkZFJlbW92ZUl0ZW1zID0gZWRpdG9yT3B0aW9ucy5hbGxvd0FkZFJlbW92ZUl0ZW1zO1xuICB9XG5cbiAgZGVsZXRlSXRlbShtb2RlbDogSXRlbUlucGxhY2VFZGl0b3IsIGV2ZW50KSB7XG4gICAgdmFyIHByb3BlcnR5ID0gU3VydmV5LlNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KFxuICAgICAgbW9kZWwucXVlc3Rpb24uZ2V0VHlwZSgpLFxuICAgICAgXCJjaG9pY2VzXCJcbiAgICApO1xuICAgIHZhciBhbGxvd0RlbGV0ZSA9IHRoaXMuZWRpdG9yLm9uQ29sbGVjdGlvbkl0ZW1EZWxldGluZ0NhbGxiYWNrKFxuICAgICAgbW9kZWwucXVlc3Rpb24sXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIG1vZGVsLnF1ZXN0aW9uLmNob2ljZXMsXG4gICAgICBtb2RlbC5pdGVtXG4gICAgKTtcbiAgICBpZiAoYWxsb3dEZWxldGUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0yO1xuICAgICAgdmFyIG5lZWRSZW1vdmUgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLm90aGVySXRlbSA9PT0gdGhpcy5pdGVtKSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24uaGFzT3RoZXIgPSBmYWxzZTtcbiAgICAgICAgaW5kZXggPSBtb2RlbC5xdWVzdGlvbi5jaG9pY2VzLmxlbmd0aDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5xdWVzdGlvbltcInNlbGVjdEFsbEl0ZW1cIl0gPT09IHRoaXMuaXRlbSkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uW1wiaGFzU2VsZWN0QWxsXCJdID0gZmFsc2U7XG4gICAgICAgIGluZGV4ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5xdWVzdGlvbltcIm5vbmVJdGVtXCJdID09PSB0aGlzLml0ZW0pIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbltcImhhc05vbmVcIl0gPSBmYWxzZTtcbiAgICAgICAgaW5kZXggPSBtb2RlbC5xdWVzdGlvbi5jaG9pY2VzLmxlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgICAgICBpbmRleCA9IG1vZGVsLnF1ZXN0aW9uLmNob2ljZXMuaW5kZXhPZihtb2RlbC5pdGVtKTtcbiAgICAgIH1cbiAgICAgIGZvY3VzQWZ0ZXJDaGFuZ2UodGhpcy5xdWVzdGlvbiwgaW5kZXgpO1xuICAgICAgaWYgKG5lZWRSZW1vdmUpIHtcbiAgICAgICAgbW9kZWwucXVlc3Rpb24uY2hvaWNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgdGhpcy5lZGl0b3Iub25RdWVzdGlvbkVkaXRvckNoYW5nZWQodGhpcy5xdWVzdGlvbik7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzRHJhZ2dhYmxlKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnF1ZXN0aW9uLm90aGVySXRlbSAhPT0gdGhpcy5pdGVtICYmXG4gICAgICB0aGlzLnF1ZXN0aW9uW1wic2VsZWN0QWxsSXRlbVwiXSAhPT0gdGhpcy5pdGVtICYmXG4gICAgICB0aGlzLnF1ZXN0aW9uW1wibm9uZUl0ZW1cIl0gIT09IHRoaXMuaXRlbVxuICAgICk7XG4gIH1cblxuICBnZXQgaXNMYXN0SXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5jaG9pY2VzLmxlbmd0aCA9PT0gMTtcbiAgfVxuXG4gIGdldCBhbGxvd0FkZFJlbW92ZUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9hbGxvd0FkZFJlbW92ZUl0ZW1zO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJpdGVtLWVkaXRvclwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgdmFyIG1vZGVsID0gbmV3IEl0ZW1JbnBsYWNlRWRpdG9yKFxuICAgICAgICBwYXJhbXMudGFyZ2V0LFxuICAgICAgICBwYXJhbXMubmFtZSxcbiAgICAgICAgcGFyYW1zLnF1ZXN0aW9uLFxuICAgICAgICBwYXJhbXMuaXRlbSxcbiAgICAgICAgY29tcG9uZW50SW5mby5lbGVtZW50LFxuICAgICAgICBwYXJhbXMuZWRpdG9yXG4gICAgICApO1xuICAgICAgdmFyIHByb3BlcnR5ID0gU3VydmV5LlNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KFxuICAgICAgICBwYXJhbXMudGFyZ2V0LmdldFR5cGUoKSxcbiAgICAgICAgcGFyYW1zLm5hbWVcbiAgICAgICk7XG4gICAgICBtb2RlbC52YWx1ZUNoYW5nZWQgPSAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eS5uYW1lLFxuICAgICAgICAgIG9iajogcGFyYW1zLml0ZW0sXG4gICAgICAgICAgdmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgICAgIG5ld1ZhbHVlOiBudWxsLFxuICAgICAgICAgIGRvVmFsaWRhdGlvbjogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHBhcmFtcy5lZGl0b3Iub25WYWx1ZUNoYW5naW5nQ2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIG5ld1ZhbHVlID0gb3B0aW9ucy5uZXdWYWx1ZSA9PT0gbnVsbCA/IG9wdGlvbnMudmFsdWUgOiBvcHRpb25zLm5ld1ZhbHVlO1xuICAgICAgICBpZiAoIW5ld1ZhbHVlICYmIHBhcmFtcy5uYW1lID09IFwidmFsdWVcIikge1xuICAgICAgICAgIG5ld1ZhbHVlID0gcGFyYW1zLml0ZW0udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcGFyYW1zLnRhcmdldFtwYXJhbXMubmFtZV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgcGFyYW1zLmVkaXRvci5vblByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5LCBwYXJhbXMudGFyZ2V0LCBuZXdWYWx1ZSk7XG4gICAgICAgICEhcGFyYW1zLnZhbHVlQ2hhbmdlZCAmJlxuICAgICAgICAgIHBhcmFtcy52YWx1ZUNoYW5nZWQocGFyYW1zLnRhcmdldCwgcHJvcGVydHkubmFtZSwgbmV3VmFsdWUpO1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuXG5leHBvcnQgdmFyIGl0ZW1BZG9ybmVyID0ge1xuICBpbnBsYWNlRWRpdEZvclZhbHVlczogZmFsc2UsXG4gIGdldE1hcmtlckNsYXNzOiAobW9kZWwpID0+IHtcbiAgICByZXR1cm4gISFtb2RlbC5wYXJlbnQgJiZcbiAgICAgICEhbW9kZWwuY2hvaWNlcyAmJlxuICAgICAgdHlwZW9mIG1vZGVsLmdldFR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgbW9kZWwuZ2V0VHlwZSgpICE9PSBcImltYWdlcGlja2VyXCIgJiZcbiAgICAgICFtb2RlbC5jaG9pY2VzRnJvbVF1ZXN0aW9uICYmXG4gICAgICAhbW9kZWwucm93c1xuICAgICAgPyBcIml0ZW1fZWRpdGFibGVcIlxuICAgICAgOiBcIlwiO1xuICB9LFxuICBnZXRFbGVtZW50TmFtZTogKG1vZGVsKSA9PiBcImNvbnRyb2xMYWJlbFwiLFxuICBhZnRlclJlbmRlcjogKGVsZW1lbnRzOiBIVE1MRWxlbWVudFtdLCBtb2RlbDogUXVlc3Rpb25TZWxlY3RCYXNlLCBlZGl0b3IpID0+IHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlbGVtZW50c1tpXS5vbmNsaWNrID0gKGUpID0+IGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBkZWNvcmF0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICBkZWNvcmF0aW9uLmNsYXNzTmFtZSA9IFwic3ZkYS1hZG9ybmVyLXJvb3RcIjtcbiAgICAgIHZhciBpdGVtVmFsdWUgPSBrby5kYXRhRm9yKGVsZW1lbnRzW2ldKTtcbiAgICAgIGlmKCFpdGVtVmFsdWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcGVydHlOYW1lID0gaXRlbUFkb3JuZXIuaW5wbGFjZUVkaXRGb3JWYWx1ZXMgPyBcInZhbHVlXCIgOiBcInRleHRcIjtcbiAgICAgIHZhciB0YXJnZXQgPSBpdGVtVmFsdWU7XG4gICAgICBpZiAoaXRlbVZhbHVlID09PSBtb2RlbFtcInNlbGVjdEFsbEl0ZW1cIl0pIHtcbiAgICAgICAgdGFyZ2V0ID0gbW9kZWw7XG4gICAgICAgIHByb3BlcnR5TmFtZSA9IFwic2VsZWN0QWxsVGV4dFwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1WYWx1ZSA9PT0gbW9kZWxbXCJub25lSXRlbVZhbHVlXCJdKSB7XG4gICAgICAgIHRhcmdldCA9IG1vZGVsO1xuICAgICAgICBwcm9wZXJ0eU5hbWUgPSBcIm5vbmVUZXh0XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVZhbHVlID09PSBtb2RlbFtcIm90aGVySXRlbVZhbHVlXCJdKSB7XG4gICAgICAgIHRhcmdldCA9IG1vZGVsO1xuICAgICAgICBwcm9wZXJ0eU5hbWUgPSBcIm90aGVyVGV4dFwiO1xuICAgICAgfVxuICAgICAgZGVjb3JhdGlvbi5pbm5lckhUTUwgPVxuICAgICAgICBcIjxpdGVtLWVkaXRvciBwYXJhbXM9J25hbWU6IFxcXCJcIiArXG4gICAgICAgIHByb3BlcnR5TmFtZSArXG4gICAgICAgIFwiXFxcIiwgdGFyZ2V0OiB0YXJnZXQsIGl0ZW06IGl0ZW0sIHF1ZXN0aW9uOiBxdWVzdGlvbiwgZWRpdG9yOiBlZGl0b3InPjwvaXRlbS1lZGl0b3I+XCI7XG4gICAgICBlbGVtZW50c1tpXS5hcHBlbmRDaGlsZChkZWNvcmF0aW9uKTtcbiAgICAgIGtvLmFwcGx5QmluZGluZ3MoXG4gICAgICAgIHtcbiAgICAgICAgICBpdGVtOiBpdGVtVmFsdWUsXG4gICAgICAgICAgcXVlc3Rpb246IG1vZGVsLFxuICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgIGVkaXRvcjogZWRpdG9yLFxuICAgICAgICB9LFxuICAgICAgICBkZWNvcmF0aW9uXG4gICAgICApO1xuICAgICAgZWRpdG9yLm9uQWRvcm5lclJlbmRlcmVkQ2FsbGJhY2soXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBcImNob2ljZXMtbGFiZWxcIixcbiAgICAgICAgZGVjb3JhdGlvbixcbiAgICAgICAgaXRlbVZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbnJlZ2lzdGVyQWRvcm5lcihcImNob2ljZXMtbGFiZWxcIiwgaXRlbUFkb3JuZXIpO1xuXG5leHBvcnQgdmFyIGNyZWF0ZUFkZEl0ZW1IYW5kbGVyID0gKFxuICBxdWVzdGlvbjogU3VydmV5LlF1ZXN0aW9uU2VsZWN0QmFzZSxcbiAgb25JdGVtQWRkZWQ6IChpdGVtVmFsdWU6IFN1cnZleS5JdGVtVmFsdWUpID0+IHZvaWQsXG4gIG9uSXRlbUFkZGluZzogKGl0ZW1WYWx1ZTogU3VydmV5Lkl0ZW1WYWx1ZSkgPT4gdm9pZCA9IG51bGxcbikgPT4gKCkgPT4ge1xuICB2YXIgbmV4dFZhbHVlID0gbnVsbDtcbiAgdmFyIHZhbHVlcyA9IHF1ZXN0aW9uLmNob2ljZXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gIH0pO1xuICB2YXIgaXRlbVRleHQgPSBTdXJ2ZXkuc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob2ljZXNfSXRlbVwiKTtcbiAgbmV4dFZhbHVlID0gZ2V0TmV4dFZhbHVlKGl0ZW1UZXh0LCB2YWx1ZXMpO1xuXG4gIHZhciBpdGVtVmFsdWUgPSBuZXcgU3VydmV5Lkl0ZW1WYWx1ZShuZXh0VmFsdWUpO1xuICBpdGVtVmFsdWUubG9jT3duZXIgPSA8YW55PntcbiAgICBnZXRMb2NhbGU6ICgpID0+IHtcbiAgICAgIGlmICghIXF1ZXN0aW9uW1wiZ2V0TG9jYWxlXCJdKSByZXR1cm4gcXVlc3Rpb24uZ2V0TG9jYWxlKCk7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9LFxuICAgIGdldE1hcmtkb3duSHRtbDogKHRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSxcbiAgICBnZXRQcm9jZXNzZWRUZXh0OiAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICB9O1xuICAhIW9uSXRlbUFkZGluZyAmJiBvbkl0ZW1BZGRpbmcoaXRlbVZhbHVlKTtcbiAgcXVlc3Rpb24uY2hvaWNlcy5wdXNoKGl0ZW1WYWx1ZSk7XG4gIGl0ZW1WYWx1ZSA9IHF1ZXN0aW9uLmNob2ljZXMuZmlsdGVyKFxuICAgIChjaG9pY2VJdGVtKSA9PiBjaG9pY2VJdGVtLnZhbHVlID09PSBpdGVtVmFsdWUudmFsdWVcbiAgKVswXTtcbiAgISFvbkl0ZW1BZGRlZCAmJiBvbkl0ZW1BZGRlZChpdGVtVmFsdWUpO1xuICBmb2N1c0FmdGVyQ2hhbmdlKHF1ZXN0aW9uLCBxdWVzdGlvbi5jaG9pY2VzLmluZGV4T2YoaXRlbVZhbHVlKSk7XG59O1xuXG5leHBvcnQgdmFyIGNyZWF0ZUFkZEl0ZW1FbGVtZW50ID0gKGhhbmRsZXIpID0+IHtcbiAgdmFyIGFkZE5ldyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGFkZE5ldy50aXRsZSA9IGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZS5hZGRJdGVtXCIpO1xuICBhZGROZXcuY2xhc3NOYW1lID1cbiAgICBcInN2X3RlY2huaWNhbCBzdmRhLWFkZC1uZXctaXRlbSBzdmQtcHJpbWFyeS1pY29uIHN2ZGEtYWRkLWN1c3RvbS1pdGVtXCI7XG4gIGFkZE5ldy5vbmNsaWNrID0gaGFuZGxlcjtcbiAgYWRkTmV3Lm9ua2V5dXAgPSBjcmVhdGVLZXkyY2xpY2soYWRkTmV3KTtcbiAgYWRkTmV3LnRhYkluZGV4ID0gMDtcbiAgYWRkTmV3LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJidXR0b25cIik7XG5cbiAgdmFyIHN2Z0VsZW06IGFueSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcbiAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgXCJzdmdcIlxuICApO1xuICBzdmdFbGVtLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwic3ZkLXN2Zy1pY29uXCIpO1xuICBzdmdFbGVtLnN0eWxlLndpZHRoID0gXCIxMnB4XCI7XG4gIHN2Z0VsZW0uc3R5bGUuaGVpZ2h0ID0gXCIxMnB4XCI7XG4gIHZhciB1c2VFbGVtOiBhbnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXG4gICAgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIFwidXNlXCJcbiAgKTtcbiAgdXNlRWxlbS5zZXRBdHRyaWJ1dGVOUyhcbiAgICBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgICBcInhsaW5rOmhyZWZcIixcbiAgICBcIiNpY29uLWlucGxhY2VwbHVzXCJcbiAgKTtcbiAgc3ZnRWxlbS5hcHBlbmRDaGlsZCh1c2VFbGVtKTtcbiAgYWRkTmV3LmFwcGVuZENoaWxkKHN2Z0VsZW0pO1xuICAvLyB2YXIgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgLy8gdGl0bGUuaW5uZXJIVE1MID0gYWRkTmV3LnRpdGxlO1xuICAvLyBhZGROZXcuYXBwZW5kQ2hpbGQodGl0bGUpO1xuICByZXR1cm4gYWRkTmV3O1xufTtcblxuZXhwb3J0IHZhciBjcmVhdGVDdXN0b21FbGVtZW50ID0gKHRpdGxlLCBoYW5kbGVyKSA9PiB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgZWxlbWVudC50aXRsZSA9IHRpdGxlO1xuICBlbGVtZW50LmNsYXNzTmFtZSA9IFwic3ZfdGVjaG5pY2FsIHN2ZGEtYWRkLW5ldy1pdGVtIHN2ZGEtYWRkLWN1c3RvbS1pdGVtXCI7XG4gIGVsZW1lbnQub25jbGljayA9IGhhbmRsZXI7XG4gIGVsZW1lbnQub25rZXl1cCA9IGNyZWF0ZUtleTJjbGljayhlbGVtZW50KTtcbiAgZWxlbWVudC50YWJJbmRleCA9IDA7XG4gIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcImJ1dHRvblwiKTtcbiAgdmFyIHRpdGxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgdGl0bGVFbC5pbm5lckhUTUwgPSBlbGVtZW50LnRpdGxlO1xuICBlbGVtZW50LmFwcGVuZENoaWxkKHRpdGxlRWwpO1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbmV4cG9ydCB2YXIgaXRlbURyYWdnYWJsZUFkb3JuZXIgPSB7XG4gIGdldE1hcmtlckNsYXNzOiAobW9kZWwpID0+IHtcbiAgICByZXR1cm4gISFtb2RlbC5wYXJlbnQgJiZcbiAgICAgICEhbW9kZWwuY2hvaWNlcyAmJlxuICAgICAgdHlwZW9mIG1vZGVsLmdldFR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgbW9kZWwuZ2V0VHlwZSgpICE9PSBcImltYWdlcGlja2VyXCIgJiZcbiAgICAgICFtb2RlbC5jaG9pY2VzRnJvbVF1ZXN0aW9uXG4gICAgICA/IFwiaXRlbV9kcmFnZ2FibGVcIlxuICAgICAgOiBcIlwiO1xuICB9LFxuICBnZXRFbGVtZW50TmFtZTogKG1vZGVsKSA9PiBcIml0ZW1cIixcbiAgYWZ0ZXJSZW5kZXI6IChcbiAgICBlbGVtZW50czogSFRNTEVsZW1lbnRbXSxcbiAgICBtb2RlbDogUXVlc3Rpb25TZWxlY3RCYXNlLFxuICAgIGVkaXRvcjogU3VydmV5Q3JlYXRvclxuICApID0+IHtcbiAgICB2YXIgaXRlbXNSb290ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGl0ZW1zUm9vdC5pbmRleE9mKGVsZW1lbnRzW2ldLnBhcmVudEVsZW1lbnQpID09PSAtMSkge1xuICAgICAgICBpdGVtc1Jvb3QucHVzaChlbGVtZW50c1tpXS5wYXJlbnRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW1WYWx1ZSA9IGtvLmRhdGFGb3IoZWxlbWVudHNbaV0pO1xuICAgICAgaWYoIWl0ZW1WYWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgaXRlbVZhbHVlID09PSBtb2RlbFtcInNlbGVjdEFsbEl0ZW1WYWx1ZVwiXSB8fFxuICAgICAgICBpdGVtVmFsdWUgPT09IG1vZGVsW1wibm9uZUl0ZW1WYWx1ZVwiXSB8fFxuICAgICAgICBpdGVtVmFsdWUgPT09IG1vZGVsW1wib3RoZXJJdGVtVmFsdWVcIl1cbiAgICAgICkge1xuICAgICAgICBlbGVtZW50c1tpXS5jbGFzc0xpc3QucmVtb3ZlKFwiaXRlbV9kcmFnZ2FibGVcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGl0ZW1zUm9vdC5mb3JFYWNoKChpdGVtUm9vdCkgPT5cbiAgICAgIFNvcnRhYmxlLmNyZWF0ZShpdGVtUm9vdCwge1xuICAgICAgICBoYW5kbGU6IFwiLnN2ZGEtZHJhZy1oYW5kbGVcIixcbiAgICAgICAgZ3JvdXA6IG1vZGVsLmlkLFxuICAgICAgICBkcmFnZ2FibGU6IFwiLml0ZW1fZHJhZ2dhYmxlXCIsXG4gICAgICAgIGFuaW1hdGlvbjogMTUwLFxuICAgICAgICBvbkVuZDogKGV2dCkgPT4ge1xuICAgICAgICAgIHZhciBvbGRJbmRleCA9IGV2dC5vbGRJbmRleDtcbiAgICAgICAgICB2YXIgbmV3SW5kZXggPSBldnQubmV3SW5kZXg7XG4gICAgICAgICAgdmFyIGNob2ljZXMgPSBtb2RlbC5jaG9pY2VzO1xuICAgICAgICAgIHZhciBjaG9pY2UgPSBjaG9pY2VzW2V2dC5vbGRJbmRleF07XG4gICAgICAgICAgaWYgKG1vZGVsLmhhc0NvbHVtbnMpIHtcbiAgICAgICAgICAgIGNob2ljZSA9IGtvLmRhdGFGb3IoZXZ0Lml0ZW0pO1xuICAgICAgICAgICAgdmFyIGNvbHVtbkNvbnRlbnQgPSBrby5kYXRhRm9yKGV2dC5pdGVtLnBhcmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgdmFyIGl0ZW1CZWZvcmUgPSBjb2x1bW5Db250ZW50ICYmIGNvbHVtbkNvbnRlbnRbbmV3SW5kZXhdO1xuICAgICAgICAgICAgb2xkSW5kZXggPSBjaG9pY2VzLmluZGV4T2YoY2hvaWNlKTtcbiAgICAgICAgICAgIG5ld0luZGV4ID0gY2hvaWNlcy5pbmRleE9mKGl0ZW1CZWZvcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlZGl0b3IudW5kb1JlZG9NYW5hZ2VyLnN0YXJ0VHJhbnNhY3Rpb24oXCJtb3ZlIGNob2ljZSBpdGVtc1wiKTtcbiAgICAgICAgICBjaG9pY2VzLnNwbGljZShvbGRJbmRleCwgMSk7XG4gICAgICAgICAgY2hvaWNlcy5zcGxpY2UobmV3SW5kZXgsIDAsIGNob2ljZSk7XG4gICAgICAgICAgZWRpdG9yLnVuZG9SZWRvTWFuYWdlci5zdG9wVHJhbnNhY3Rpb24oKTtcbiAgICAgICAgICBlZGl0b3Iub25RdWVzdGlvbkVkaXRvckNoYW5nZWQobW9kZWwpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHZhciBlZGl0b3JPcHRpb25zID0ge1xuICAgICAgYWxsb3dBZGRSZW1vdmVJdGVtczogdHJ1ZSxcbiAgICAgIGFsbG93UmVtb3ZlQWxsSXRlbXM6IHRydWUsXG4gICAgfTtcbiAgICBlZGl0b3Iub25TZXRQcm9wZXJ0eUVkaXRvck9wdGlvbnNDYWxsYmFjayhcImNob2ljZXNcIiwgbW9kZWwsIGVkaXRvck9wdGlvbnMpO1xuICAgIGlmIChlZGl0b3JPcHRpb25zLmFsbG93QWRkUmVtb3ZlSXRlbXMpIHtcbiAgICAgIHZhciBhZGROZXcgPSBjcmVhdGVBZGRJdGVtRWxlbWVudChcbiAgICAgICAgY3JlYXRlQWRkSXRlbUhhbmRsZXIoXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgKGl0ZW1WYWx1ZSkgPT4ge1xuICAgICAgICAgICAgZWRpdG9yLm9uUXVlc3Rpb25FZGl0b3JDaGFuZ2VkKG1vZGVsKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChpdGVtVmFsdWUpID0+IHtcbiAgICAgICAgICAgIGVkaXRvci5vbkl0ZW1WYWx1ZUFkZGVkQ2FsbGJhY2soXG4gICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICBcImNob2ljZXNcIixcbiAgICAgICAgICAgICAgaXRlbVZhbHVlLFxuICAgICAgICAgICAgICBtb2RlbC5jaG9pY2VzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGl0ZW1zUm9vdFswXS5hcHBlbmRDaGlsZChhZGROZXcpO1xuICAgIH1cbiAgICB2YXIgcmFpc2VDaGFuZ2luZ0V2ZW50ID0gKFxuICAgICAgdGFyZ2V0OiBhbnksXG4gICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICAgIG5ld1ZhbHVlOiBhbnlcbiAgICApID0+IHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgb2JqOiB0YXJnZXQsXG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgbmV3VmFsdWU6IG51bGwsXG4gICAgICAgIGRvVmFsaWRhdGlvbjogZmFsc2UsXG4gICAgICB9O1xuICAgICAgZWRpdG9yLm9uVmFsdWVDaGFuZ2luZ0NhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgbmV3VmFsdWUgPSBvcHRpb25zLm5ld1ZhbHVlID09PSBudWxsID8gb3B0aW9ucy52YWx1ZSA6IG9wdGlvbnMubmV3VmFsdWU7XG4gICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgfTtcbiAgICB2YXIgcmFpc2VDaGFuZ2VkRXZlbnQgPSAoXG4gICAgICB0YXJnZXQ6IGFueSxcbiAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgICAgbmV3VmFsdWU6IGFueVxuICAgICkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0YXJnZXQuZ2V0VHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHZhciBwcm9wZXJ0eSA9IFN1cnZleS5TZXJpYWxpemVyLmZpbmRQcm9wZXJ0eShcbiAgICAgICAgICB0YXJnZXQuZ2V0VHlwZSgpLFxuICAgICAgICAgIHByb3BlcnR5TmFtZVxuICAgICAgICApO1xuICAgICAgICBlZGl0b3Iub25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eSwgdGFyZ2V0LCBuZXdWYWx1ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoXG4gICAgICBlZGl0b3IuY2FuU2hvd09iamVjdFByb3BlcnR5KG1vZGVsLCBcImhhc090aGVyXCIpICYmXG4gICAgICBtb2RlbC5oYXNPdGhlciAhPT0gdHJ1ZVxuICAgICkge1xuICAgICAgaXRlbXNSb290WzBdLmFwcGVuZENoaWxkKFxuICAgICAgICBjcmVhdGVDdXN0b21FbGVtZW50KGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZS5hZGRPdGhlclwiKSwgKCkgPT4ge1xuICAgICAgICAgIHZhciBuZXdWYWx1ZSA9ICFtb2RlbC5oYXNPdGhlcjtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHJhaXNlQ2hhbmdpbmdFdmVudChtb2RlbCwgXCJoYXNPdGhlclwiLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgbW9kZWwuaGFzT3RoZXIgPSBuZXdWYWx1ZTtcbiAgICAgICAgICByYWlzZUNoYW5nZWRFdmVudChtb2RlbCwgXCJoYXNPdGhlclwiLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgZm9jdXNBZnRlckNoYW5nZShtb2RlbCwgbW9kZWwuY2hvaWNlcy5sZW5ndGggKyAxKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG1vZGVsLmhhc1NlbGVjdEFsbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBtb2RlbC5oYXNTZWxlY3RBbGwgIT09IHRydWUgJiZcbiAgICAgIGVkaXRvci5jYW5TaG93T2JqZWN0UHJvcGVydHkobW9kZWwsIFwiaGFzU2VsZWN0QWxsXCIpXG4gICAgKSB7XG4gICAgICBpdGVtc1Jvb3RbMF0uYXBwZW5kQ2hpbGQoXG4gICAgICAgIGNyZWF0ZUN1c3RvbUVsZW1lbnQoXG4gICAgICAgICAgZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBlLmFkZFNlbGVjdEFsbFwiKSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSAhbW9kZWwuaGFzU2VsZWN0QWxsO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSByYWlzZUNoYW5naW5nRXZlbnQobW9kZWwsIFwiaGFzU2VsZWN0QWxsXCIsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIG1vZGVsLmhhc1NlbGVjdEFsbCA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgcmFpc2VDaGFuZ2VkRXZlbnQobW9kZWwsIFwiaGFzU2VsZWN0QWxsXCIsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIGZvY3VzQWZ0ZXJDaGFuZ2UobW9kZWwsIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbW9kZWwuaGFzTm9uZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBtb2RlbC5oYXNOb25lICE9PSB0cnVlICYmXG4gICAgICBlZGl0b3IuY2FuU2hvd09iamVjdFByb3BlcnR5KG1vZGVsLCBcImhhc05vbmVcIilcbiAgICApIHtcbiAgICAgIGl0ZW1zUm9vdFswXS5hcHBlbmRDaGlsZChcbiAgICAgICAgY3JlYXRlQ3VzdG9tRWxlbWVudChlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGUuYWRkTm9uZVwiKSwgKCkgPT4ge1xuICAgICAgICAgIHZhciBuZXdWYWx1ZSA9ICFtb2RlbC5oYXNOb25lO1xuICAgICAgICAgIG5ld1ZhbHVlID0gcmFpc2VDaGFuZ2luZ0V2ZW50KG1vZGVsLCBcImhhc05vbmVcIiwgbmV3VmFsdWUpO1xuICAgICAgICAgIG1vZGVsLmhhc05vbmUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICByYWlzZUNoYW5nZWRFdmVudChtb2RlbCwgXCJoYXNOb25lXCIsIG5ld1ZhbHVlKTtcbiAgICAgICAgICBmb2N1c0FmdGVyQ2hhbmdlKG1vZGVsLCBtb2RlbC5jaG9pY2VzLmxlbmd0aCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGVkaXRvci5vbkFkb3JuZXJSZW5kZXJlZENhbGxiYWNrKFxuICAgICAgbW9kZWwsXG4gICAgICBcImNob2ljZXMtZHJhZ2dhYmxlXCIsXG4gICAgICBpdGVtc1Jvb3RbMF0sXG4gICAgICBpdGVtc1Jvb3RcbiAgICApO1xuICB9LFxufTtcblxucmVnaXN0ZXJBZG9ybmVyKFwiY2hvaWNlcy1kcmFnZ2FibGVcIiwgaXRlbURyYWdnYWJsZUFkb3JuZXIpO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyByZWdpc3RlckFkb3JuZXIgfSBmcm9tIFwiLi4vc3VydmV5anNPYmplY3RzXCI7XG5pbXBvcnQgeyBUaXRsZUlucGxhY2VFZGl0b3IgfSBmcm9tIFwiLi90aXRsZS1lZGl0b3JcIjtcblxuaW1wb3J0IFwiLi9sYWJlbC1lZGl0b3Iuc2Nzc1wiO1xuXG5leHBvcnQgdmFyIGxhYmVsQWRvcm5lciA9IHtcbiAgZ2V0TWFya2VyQ2xhc3M6IG1vZGVsID0+IHtcbiAgICBpZiAobW9kZWwuZ2V0VHlwZSgpID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIFwibGFiZWxfZWRpdGFibGVcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH0sXG4gIGdldEVsZW1lbnROYW1lOiBtb2RlbCA9PiBcImxhYmVsXCIsXG4gIGFmdGVyUmVuZGVyOiAoZWxlbWVudHM6IEhUTUxFbGVtZW50W10sIG1vZGVsLCBlZGl0b3IpID0+IHtcbiAgICB2YXIgZGVjb3JhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgIGRlY29yYXRpb24uaW5uZXJIVE1MID1cbiAgICAgIFwiPHRpdGxlLWVkaXRvciBwYXJhbXM9J25hbWU6IFxcXCJ0aXRsZVxcXCIsIG1vZGVsOiBtb2RlbCwgZWRpdG9yOiBlZGl0b3InPjwvdGl0bGUtZWRpdG9yPlwiO1xuICAgIGVsZW1lbnRzWzBdLm9uY2xpY2sgPSBlID0+IGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlbGVtZW50c1swXS5hcHBlbmRDaGlsZChkZWNvcmF0aW9uKTtcbiAgICBrby5hcHBseUJpbmRpbmdzKHsgbW9kZWw6IG1vZGVsLCBlZGl0b3I6IGVkaXRvciB9LCBkZWNvcmF0aW9uKTtcbiAgICBlZGl0b3Iub25BZG9ybmVyUmVuZGVyZWRDYWxsYmFjayhtb2RlbCwgXCJsYWJlbFwiLCBkZWNvcmF0aW9uKTtcbiAgfVxufTtcblxuLy9yZWdpc3RlckFkb3JuZXIoXCJsYWJlbFwiLCBsYWJlbEFkb3JuZXIpO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQge1xuICByZWdpc3RlckFkb3JuZXIsXG4gIFN1cnZleUZvckRlc2lnbmVyLFxuICBJU3VydmV5T2JqZWN0TWVudUl0ZW1cbn0gZnJvbSBcIi4uL3N1cnZleWpzT2JqZWN0c1wiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0IFwiLi9xdWVzdGlvbi1hY3Rpb25zLnNjc3NcIjtcbnZhciB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiaHRtbC1sb2FkZXI/aW50ZXJwb2xhdGUhdmFsLWxvYWRlciEuL3F1ZXN0aW9uLWFjdGlvbnMuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQWN0aW9uc0Fkb3JuZXIge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcXVlc3Rpb24sIHByaXZhdGUgZWRpdG9yKSB7XG4gICAgdmFyIHN1cnZleUZvckRlc2lnbmVyOiBTdXJ2ZXlGb3JEZXNpZ25lciA9IGVkaXRvci5zdXJ2ZXk7XG4gICAgdGhpcy5hY3Rpb25zKHN1cnZleUZvckRlc2lnbmVyLmdldE1lbnVJdGVtcyhxdWVzdGlvbikpO1xuICB9XG5cbiAgcHVibGljIGFjdGlvbnMgPSBrby5vYnNlcnZhYmxlQXJyYXk8SVN1cnZleU9iamVjdE1lbnVJdGVtPigpO1xuXG4gIHB1YmxpYyBnZXRTdHlsZShtb2RlbDogSVN1cnZleU9iamVjdE1lbnVJdGVtKSB7XG4gICAgaWYgKCEhbW9kZWwuaWNvbikge1xuICAgICAgcmV0dXJuIGtvLnVud3JhcCg8YW55Pm1vZGVsLmljb24pO1xuICAgIH1cbiAgICByZXR1cm4gXCJpY29uLWFjdGlvblwiICsgbW9kZWwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBsb2NhbGl6ZShlbnRyeVN0cmluZykge1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKGVudHJ5U3RyaW5nKTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwicXVlc3Rpb24tYWN0aW9uc1wiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgdmFyIG1vZGVsID0gbmV3IFF1ZXN0aW9uQWN0aW9uc0Fkb3JuZXIocGFyYW1zLnF1ZXN0aW9uLCBwYXJhbXMuZWRpdG9yKTtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWxcbn0pO1xuXG5leHBvcnQgdmFyIHF1ZXN0aW9uQWN0aW9uc0Fkb3JuZXIgPSB7XG4gIGdldE1hcmtlckNsYXNzOiBtb2RlbCA9PiB7XG4gICAgcmV0dXJuICFtb2RlbC5pc1BhbmVsICYmICFtb2RlbC5pc1BhZ2UgPyBcInF1ZXN0aW9uX2FjdGlvbnNcIiA6IFwiXCI7XG4gIH0sXG4gIGdldEVsZW1lbnROYW1lOiBtb2RlbCA9PiBcIm1haW5Sb290XCIsXG4gIGFmdGVyUmVuZGVyOiAoZWxlbWVudHM6IEhUTUxFbGVtZW50W10sIG1vZGVsLCBlZGl0b3IpID0+IHtcbiAgICB2YXIgZGVjb3JhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGVjb3JhdGlvbi5jbGFzc05hbWUgPSBcInN2ZGEtcXVlc3Rpb24tYWN0aW9uc1wiO1xuICAgIGRlY29yYXRpb24uaW5uZXJIVE1MID1cbiAgICAgIFwiPHF1ZXN0aW9uLWFjdGlvbnMgcGFyYW1zPSdxdWVzdGlvbjogbW9kZWwsIGVkaXRvcjogZWRpdG9yJz48L3F1ZXN0aW9uLWFjdGlvbnM+XCI7XG4gICAgZWxlbWVudHNbMF0uYXBwZW5kQ2hpbGQoZGVjb3JhdGlvbik7XG4gICAga28uYXBwbHlCaW5kaW5ncyh7IG1vZGVsOiBtb2RlbCwgZWRpdG9yOiBlZGl0b3IgfSwgZGVjb3JhdGlvbik7XG4gICAgZWRpdG9yLm9uQWRvcm5lclJlbmRlcmVkQ2FsbGJhY2sobW9kZWwsIFwicXVlc3Rpb24tYWN0aW9uc1wiLCBkZWNvcmF0aW9uKTtcbiAgfVxufTtcblxucmVnaXN0ZXJBZG9ybmVyKFwicXVlc3Rpb24tYWN0aW9uc1wiLCBxdWVzdGlvbkFjdGlvbnNBZG9ybmVyKTtcblxuZXhwb3J0IHZhciBwYW5lbEFjdGlvbnNBZG9ybmVyID0ge1xuICBnZXRNYXJrZXJDbGFzczogbW9kZWwgPT4ge1xuICAgIHJldHVybiAhIW1vZGVsLmlzUGFuZWwgJiZcbiAgICAgICEhbW9kZWwucGFyZW50ICYmXG4gICAgICBtb2RlbC5nZXRUeXBlKCkgIT09IFwiZmxvd3BhbmVsXCIgJiZcbiAgICAgIG1vZGVsLmdldFR5cGUoKSAhPT0gXCJwYWdlXCJcbiAgICAgID8gXCJwYW5lbF9hY3Rpb25zXCJcbiAgICAgIDogXCJcIjtcbiAgfSxcbiAgZ2V0RWxlbWVudE5hbWU6IG1vZGVsID0+IFwiY29udGFpbmVyXCIsXG4gIGFmdGVyUmVuZGVyOiBxdWVzdGlvbkFjdGlvbnNBZG9ybmVyLmFmdGVyUmVuZGVyXG59O1xuXG5yZWdpc3RlckFkb3JuZXIoXCJwYW5lbC1hY3Rpb25zXCIsIHBhbmVsQWN0aW9uc0Fkb3JuZXIpO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJBZG9ybmVyIH0gZnJvbSBcIi4uL3N1cnZleWpzT2JqZWN0c1wiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0IHsgVGl0bGVJbnBsYWNlRWRpdG9yIH0gZnJvbSBcIi4vdGl0bGUtZWRpdG9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4uL2VkaXRvclwiO1xuaW1wb3J0IHsgZ2V0TmV4dFZhbHVlLCBmaW5kUGFyZW50Tm9kZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5pbXBvcnQgXCIuL3JhdGluZy1pdGVtLWVkaXRvci5zY3NzXCI7XG5pbXBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2UgfSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG52YXIgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9yYXRpbmctaXRlbS1lZGl0b3IuaHRtbFwiKTtcblxuY2xhc3MgUmF0aW5nSXRlbUVkaXRvciBleHRlbmRzIFRpdGxlSW5wbGFjZUVkaXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHRhcmdldDogYW55LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHF1ZXN0aW9uOiBTdXJ2ZXkuUXVlc3Rpb25SYXRpbmcsXG4gICAgcHJpdmF0ZSBpdGVtLFxuICAgIHJvb3RFbGVtZW50LFxuICAgIGVkaXRvcjogU3VydmV5Q3JlYXRvclxuICApIHtcbiAgICBzdXBlcih0YXJnZXQsIG5hbWUsIHJvb3RFbGVtZW50LCBudWxsLCBlZGl0b3IpO1xuICB9XG5cbiAgZGVsZXRlSXRlbShtb2RlbDogUmF0aW5nSXRlbUVkaXRvciwgZXZlbnQpIHtcbiAgICB2YXIgcHJvcGVydHkgPSBTdXJ2ZXkuU2VyaWFsaXplci5maW5kUHJvcGVydHkoXG4gICAgICBtb2RlbC5xdWVzdGlvbi5nZXRUeXBlKCksXG4gICAgICBcInJhdGVWYWx1ZXNcIlxuICAgICk7XG4gICAgdmFyIGFsbG93RGVsZXRlID0gdGhpcy5lZGl0b3Iub25Db2xsZWN0aW9uSXRlbURlbGV0aW5nQ2FsbGJhY2soXG4gICAgICBtb2RlbC5xdWVzdGlvbixcbiAgICAgIHByb3BlcnR5LFxuICAgICAgbW9kZWwucXVlc3Rpb24ucmF0ZVZhbHVlcyxcbiAgICAgIG1vZGVsLml0ZW1cbiAgICApO1xuICAgIGlmIChhbGxvd0RlbGV0ZSkge1xuICAgICAgdmFyIHF1ZXN0aW9uID0gbW9kZWwucXVlc3Rpb247XG4gICAgICB2YXIgaW5kZXggPSBxdWVzdGlvbi52aXNpYmxlUmF0ZVZhbHVlc1xuICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKVxuICAgICAgICAuaW5kZXhPZihtb2RlbC5pdGVtLnZhbHVlKTtcblxuICAgICAgaWYgKFxuICAgICAgICBxdWVzdGlvbi5yYXRlVmFsdWVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBpbmRleCA9PT0gcXVlc3Rpb24udmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoIC0gMVxuICAgICAgKSB7XG4gICAgICAgIHF1ZXN0aW9uLnJhdGVNYXggLT0gcXVlc3Rpb24ucmF0ZVN0ZXA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVlc3Rpb24ucmF0ZVZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBxdWVzdGlvbi5yYXRlVmFsdWVzID0gcXVlc3Rpb24udmlzaWJsZVJhdGVWYWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgcXVlc3Rpb24ucmF0ZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgbW9kZWwuZWRpdG9yLm9uUXVlc3Rpb25FZGl0b3JDaGFuZ2VkKHF1ZXN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNMYXN0SXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGggPT09IDE7XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMudmFsdWVDaGFuZ2VkID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJyYXRpbmctaXRlbS1lZGl0b3JcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIHZhciBtb2RlbCA9IG5ldyBSYXRpbmdJdGVtRWRpdG9yKFxuICAgICAgICBwYXJhbXMudGFyZ2V0LFxuICAgICAgICBwYXJhbXMubmFtZSxcbiAgICAgICAgcGFyYW1zLnF1ZXN0aW9uLFxuICAgICAgICBwYXJhbXMuaXRlbSxcbiAgICAgICAgY29tcG9uZW50SW5mby5lbGVtZW50LFxuICAgICAgICBwYXJhbXMuZWRpdG9yXG4gICAgICApO1xuICAgICAgdmFyIHF1ZXN0aW9uOiBTdXJ2ZXkuUXVlc3Rpb25SYXRpbmcgPSBwYXJhbXMucXVlc3Rpb247XG5cbiAgICAgIHZhciBwcm9wZXJ0eSA9IFN1cnZleS5TZXJpYWxpemVyLmZpbmRQcm9wZXJ0eShcbiAgICAgICAgcGFyYW1zLnRhcmdldC5nZXRUeXBlKCksXG4gICAgICAgIHBhcmFtcy5uYW1lXG4gICAgICApO1xuICAgICAgbW9kZWwudmFsdWVDaGFuZ2VkID0gKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChxdWVzdGlvbi5yYXRlVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IHJhdGVWYWx1ZXMgPSBxdWVzdGlvbi52aXNpYmxlUmF0ZVZhbHVlcztcbiAgICAgICAgICB2YXIgaW5kZXggPSByYXRlVmFsdWVzXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKVxuICAgICAgICAgICAgLmluZGV4T2YocGFyYW1zLml0ZW0udmFsdWUpO1xuICAgICAgICAgIHJhdGVWYWx1ZXNbaW5kZXhdW3BhcmFtcy5uYW1lXSA9IG5ld1ZhbHVlO1xuICAgICAgICAgIHF1ZXN0aW9uLnJhdGVWYWx1ZXMgPSByYXRlVmFsdWVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmFtcy50YXJnZXRbcGFyYW1zLm5hbWVdID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcGFyYW1zLmVkaXRvci5vblF1ZXN0aW9uRWRpdG9yQ2hhbmdlZChxdWVzdGlvbik7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG5cbnZhciBjcmVhdGVBZGRJdGVtSGFuZGxlciA9IChcbiAgcXVlc3Rpb246IFN1cnZleS5RdWVzdGlvblJhdGluZyxcbiAgb25JdGVtQWRkZWQ6IChpdGVtVmFsdWU6IFN1cnZleS5JdGVtVmFsdWUpID0+IHZvaWQsXG4gIG9uSXRlbUFkZGluZzogKGl0ZW1WYWx1ZTogU3VydmV5Lkl0ZW1WYWx1ZSkgPT4gdm9pZCA9IG51bGxcbikgPT4gKCkgPT4ge1xuICBpZiAocXVlc3Rpb24ucmF0ZVZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICBxdWVzdGlvbi5yYXRlTWF4ICs9IHF1ZXN0aW9uLnJhdGVTdGVwO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0VmFsdWUgPSBudWxsO1xuICAgIHZhciB2YWx1ZXMgPSBxdWVzdGlvbi5yYXRlVmFsdWVzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfSk7XG4gICAgdmFyIGl0ZW1UZXh0ID0gU3VydmV5LnN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIik7XG4gICAgbmV4dFZhbHVlID0gZ2V0TmV4dFZhbHVlKGl0ZW1UZXh0LCB2YWx1ZXMpO1xuXG4gICAgdmFyIGl0ZW1WYWx1ZSA9IG5ldyBTdXJ2ZXkuSXRlbVZhbHVlKG5leHRWYWx1ZSk7XG4gICAgISFvbkl0ZW1BZGRpbmcgJiYgb25JdGVtQWRkaW5nKGl0ZW1WYWx1ZSk7XG4gICAgaXRlbVZhbHVlLmxvY093bmVyID0gPGFueT57XG4gICAgICBnZXRMb2NhbGU6ICgpID0+IHtcbiAgICAgICAgaWYgKCEhcXVlc3Rpb25bXCJnZXRMb2NhbGVcIl0pIHJldHVybiBxdWVzdGlvbi5nZXRMb2NhbGUoKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9LFxuICAgICAgZ2V0TWFya2Rvd25IdG1sOiAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgfSxcbiAgICAgIGdldFByb2Nlc3NlZFRleHQ6ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICB9LFxuICAgIH07XG4gICAgcXVlc3Rpb24ucmF0ZVZhbHVlcyA9IHF1ZXN0aW9uLnJhdGVWYWx1ZXMuY29uY2F0KFtpdGVtVmFsdWVdKTtcbiAgfVxuICAhIW9uSXRlbUFkZGVkICYmIG9uSXRlbUFkZGVkKGl0ZW1WYWx1ZSk7XG59O1xuXG5leHBvcnQgdmFyIHJhdGluZ0l0ZW1BZG9ybmVyID0ge1xuICBnZXRNYXJrZXJDbGFzczogKG1vZGVsKSA9PiB7XG4gICAgcmV0dXJuICEhbW9kZWwucGFyZW50ICYmICEhbW9kZWwudmlzaWJsZVJhdGVWYWx1ZXMgPyBcIml0ZW1fZWRpdGFibGVcIiA6IFwiXCI7XG4gIH0sXG4gIGdldEVsZW1lbnROYW1lOiAobW9kZWwpID0+IFwiaXRlbVRleHRcIixcbiAgYWZ0ZXJSZW5kZXI6IChcbiAgICBlbGVtZW50czogSFRNTEVsZW1lbnRbXSxcbiAgICBtb2RlbDogU3VydmV5LlF1ZXN0aW9uUmF0aW5nLFxuICAgIGVkaXRvclxuICApID0+IHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlbGVtZW50c1tpXS5vbmNsaWNrID0gKGUpID0+IGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBkZWNvcmF0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICBkZWNvcmF0aW9uLmlubmVySFRNTCA9XG4gICAgICAgIFwiPHJhdGluZy1pdGVtLWVkaXRvciBwYXJhbXM9J25hbWU6IFxcXCJ0ZXh0XFxcIiwgdGFyZ2V0OiB0YXJnZXQsIGl0ZW06IGl0ZW0sIHF1ZXN0aW9uOiBxdWVzdGlvbiwgZWRpdG9yOiBlZGl0b3InPjwvcmF0aW5nLWl0ZW0tZWRpdG9yPlwiO1xuICAgICAgZWxlbWVudHNbaV0uYXBwZW5kQ2hpbGQoZGVjb3JhdGlvbik7XG4gICAgICB2YXIgaXRlbSA9IG1vZGVsLnZpc2libGVSYXRlVmFsdWVzW2ldO1xuICAgICAga28uYXBwbHlCaW5kaW5ncyhcbiAgICAgICAge1xuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgcXVlc3Rpb246IG1vZGVsLFxuICAgICAgICAgIHRhcmdldDogaXRlbSxcbiAgICAgICAgICBlZGl0b3I6IGVkaXRvcixcbiAgICAgICAgfSxcbiAgICAgICAgZGVjb3JhdGlvblxuICAgICAgKTtcbiAgICAgIGVkaXRvci5vbkFkb3JuZXJSZW5kZXJlZENhbGxiYWNrKG1vZGVsLCBcInJhdGluZy1pdGVtXCIsIGRlY29yYXRpb24sIGl0ZW0pO1xuICAgIH1cblxuICAgIHZhciBhZGROZXcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBhZGROZXcudGl0bGUgPSBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGUuYWRkSXRlbVwiKTtcbiAgICBhZGROZXcuY2xhc3NOYW1lID1cbiAgICAgIFwic3ZkYS1hZGQtbmV3LXJhdGluZy1pdGVtIGljb24taW5wbGFjZS1hZGQtaXRlbSBzdmQtcHJpbWFyeS1pY29uXCI7XG4gICAgYWRkTmV3Lm9uY2xpY2sgPSBjcmVhdGVBZGRJdGVtSGFuZGxlcihcbiAgICAgIG1vZGVsLFxuICAgICAgKGl0ZW1WYWx1ZSkgPT4ge1xuICAgICAgICBlZGl0b3Iub25RdWVzdGlvbkVkaXRvckNoYW5nZWQobW9kZWwpO1xuICAgICAgICBlZGl0b3Iub25JdGVtVmFsdWVBZGRlZENhbGxiYWNrKFxuICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgIFwicmF0ZVZhbHVlc1wiLFxuICAgICAgICAgIGl0ZW1WYWx1ZSxcbiAgICAgICAgICBtb2RlbC52aXNpYmxlUmF0ZVZhbHVlc1xuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIChpdGVtVmFsdWUpID0+IHtcbiAgICAgICAgZWRpdG9yLm9uSXRlbVZhbHVlQWRkZWRDYWxsYmFjayhcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBcInJhdGVWYWx1ZXNcIixcbiAgICAgICAgICBpdGVtVmFsdWUsXG4gICAgICAgICAgbW9kZWwudmlzaWJsZVJhdGVWYWx1ZXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHZhciBzdmdFbGVtOiBhbnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXG4gICAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgICBcInN2Z1wiXG4gICAgKTtcbiAgICBzdmdFbGVtLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwic3ZkLXN2Zy1pY29uXCIpO1xuICAgIHN2Z0VsZW0uc3R5bGUud2lkdGggPSBcIjEycHhcIjtcbiAgICBzdmdFbGVtLnN0eWxlLmhlaWdodCA9IFwiMTJweFwiO1xuICAgIHZhciB1c2VFbGVtOiBhbnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXG4gICAgICBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgICBcInVzZVwiXG4gICAgKTtcbiAgICB1c2VFbGVtLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXG4gICAgICBcInhsaW5rOmhyZWZcIixcbiAgICAgIFwiI2ljb24taW5wbGFjZXBsdXNcIlxuICAgICk7XG4gICAgc3ZnRWxlbS5hcHBlbmRDaGlsZCh1c2VFbGVtKTtcbiAgICBhZGROZXcuYXBwZW5kQ2hpbGQoc3ZnRWxlbSk7XG5cbiAgICB2YXIgcGFyZW50ID0gZWxlbWVudHNbMF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZChhZGROZXcpO1xuICB9LFxufTtcblxucmVnaXN0ZXJBZG9ybmVyKFwicmF0aW5nLWl0ZW1cIiwgcmF0aW5nSXRlbUFkb3JuZXIpO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgXCIuL3NlbGVjdC1pdGVtcy1lZGl0b3Iuc2Nzc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25TZWxlY3RCYXNlIH0gZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0ICB7IHNlbGVjdEl0ZW1zQWRvcm5lciB9IGZyb20gXCIuL3NlbGVjdC1pdGVtc1wiO1xuXG52YXIgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9zZWxlY3QtaXRlbXMtZGlzcGxheS5odG1sXCIpO1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic2VsZWN0LWl0ZW1zLWRpc3BsYXlcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIHZhciBpc0V4cGFuZGVkID0ga28ub2JzZXJ2YWJsZShzZWxlY3RJdGVtc0Fkb3JuZXIuaXNFeHBhbmRlZCk7XG4gICAgICB2YXIgY2hvaWNlcyA9IGtvLm9ic2VydmFibGVBcnJheShwYXJhbXMucXVlc3Rpb24uY2hvaWNlcyk7XG4gICAgICB2YXIgb3RoZXJUZXh0ID0ga28ub2JzZXJ2YWJsZShwYXJhbXMucXVlc3Rpb24ub3RoZXJUZXh0KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNob2ljZXM6IGNob2ljZXMsXG4gICAgICAgIHF1ZXN0aW9uOiBwYXJhbXMucXVlc3Rpb24sXG4gICAgICAgIGVkaXRvcjogcGFyYW1zLmVkaXRvcixcbiAgICAgICAgaXNFeHBhbmRlZDogaXNFeHBhbmRlZCxcbiAgICAgICAgdG9nZ2xlOiAoKSA9PiBpc0V4cGFuZGVkKCFpc0V4cGFuZGVkKCkpLFxuICAgICAgICBnZXRMb2NTdHJpbmc6IHN0ciA9PiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKHN0ciksXG4gICAgICAgIG90aGVyVGV4dDogb3RoZXJUZXh0XG4gICAgICB9O1xuICAgIH1cbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbFxufSk7XG5cbmV4cG9ydCB2YXIgcmVuZGVyRGlzcGxheU1vZGUgPSAoZWxlbWVudHM6IEhUTUxFbGVtZW50W10sIG1vZGVsOiBRdWVzdGlvblNlbGVjdEJhc2UsIGVkaXRvcikgPT4ge1xuICAgIGVsZW1lbnRzWzBdLm9uY2xpY2sgPSBlID0+IGUucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgZGVjb3JhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGVjb3JhdGlvbi5pbm5lckhUTUwgPVxuICAgICAgXCI8c2VsZWN0LWl0ZW1zLWRpc3BsYXkgcGFyYW1zPSdxdWVzdGlvbjogcXVlc3Rpb24sIGVkaXRvcjogZWRpdG9yJz48L3NlbGVjdC1pdGVtcy1kaXNwbGF5PlwiO1xuICAgIGVsZW1lbnRzWzBdLmFwcGVuZENoaWxkKGRlY29yYXRpb24pO1xuICAgIGtvLmFwcGx5QmluZGluZ3MoXG4gICAgICB7XG4gICAgICAgIHF1ZXN0aW9uOiBtb2RlbCxcbiAgICAgICAgZWRpdG9yOiBlZGl0b3JcbiAgICAgIH0sXG4gICAgICBkZWNvcmF0aW9uXG4gICAgKTtcbiAgICBlZGl0b3Iub25BZG9ybmVyUmVuZGVyZWRDYWxsYmFjayhtb2RlbCwgXCJzZWxlY3QtY2hvaWNlc1wiLCBkZWNvcmF0aW9uKTtcbiAgfVxuXG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgU29ydGFibGUgZnJvbSBcInNvcnRhYmxlanNcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IGNyZWF0ZUFkZEl0ZW1IYW5kbGVyLCBpdGVtQWRvcm5lciB9IGZyb20gXCIuL2l0ZW0tZWRpdG9yXCI7XG5pbXBvcnQgeyBzZWxlY3RJdGVtc0Fkb3JuZXIgfSBmcm9tIFwiLi9zZWxlY3QtaXRlbXNcIjtcbmltcG9ydCBcIi4vc2VsZWN0LWl0ZW1zLWVkaXRvci5zY3NzXCI7XG5pbXBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2UgfSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG52YXIgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9zZWxlY3QtaXRlbXMtZWRpdG9yLmh0bWxcIik7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzZWxlY3QtaXRlbXMtZWRpdG9yXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICB2YXIgaXNFeHBhbmRlZCA9IGtvLm9ic2VydmFibGUoc2VsZWN0SXRlbXNBZG9ybmVyLmlzRXhwYW5kZWQpO1xuICAgICAgdmFyIGNob2ljZXMgPSBrby5vYnNlcnZhYmxlQXJyYXkoKTtcbiAgICAgIGtvLmNvbXB1dGVkKCgpID0+IHsgY2hvaWNlcyhwYXJhbXMucXVlc3Rpb24uY2hvaWNlcyk7IH0pO1xuICAgICAgdmFyIG90aGVyVGV4dCA9IGtvLm9ic2VydmFibGUocGFyYW1zLnF1ZXN0aW9uLm90aGVyVGV4dCk7XG4gICAgICB2YXIgc29ydGFibGVFbGVtZW50ID0gY29tcG9uZW50SW5mby5lbGVtZW50LnBhcmVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgICAgXCJzdmRhLXNlbGVjdC1pdGVtcy1jb2xsZWN0aW9uXCJcbiAgICAgIClbMF07XG4gICAgICB2YXIgc29ydGFibGUgPSBudWxsO1xuICAgICAgLy8gdmFyIHByb3BlcnR5ID0gU3VydmV5LlNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KFxuICAgICAgLy8gICBwYXJhbXMucXVlc3Rpb24uZ2V0VHlwZSgpLFxuICAgICAgLy8gICBcImNob2ljZXNcIlxuICAgICAgLy8gKTtcbiAgICAgIHZhciByYWlzZUNoYW5naW5nRXZlbnQgPSAoXG4gICAgICAgIHRhcmdldDogYW55LFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICAgICAgbmV3VmFsdWU6IGFueVxuICAgICAgKSA9PiB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgIG9iajogdGFyZ2V0LFxuICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgICBuZXdWYWx1ZTogbnVsbCxcbiAgICAgICAgICBkb1ZhbGlkYXRpb246IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHBhcmFtcy5lZGl0b3Iub25WYWx1ZUNoYW5naW5nQ2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIG5ld1ZhbHVlID0gb3B0aW9ucy5uZXdWYWx1ZSA9PT0gbnVsbCA/IG9wdGlvbnMudmFsdWUgOiBvcHRpb25zLm5ld1ZhbHVlO1xuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XG4gICAgICB9O1xuICAgICAgdmFyIHJhaXNlQ2hhbmdlZEV2ZW50ID0gKFxuICAgICAgICB0YXJnZXQ6IGFueSxcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgICAgIG5ld1ZhbHVlOiBhbnlcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldC5nZXRUeXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB2YXIgcHJvcGVydHkgPSBTdXJ2ZXkuU2VyaWFsaXplci5maW5kUHJvcGVydHkoXG4gICAgICAgICAgICB0YXJnZXQuZ2V0VHlwZSgpLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwYXJhbXMuZWRpdG9yLm9uUHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHksIHRhcmdldCwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hvaWNlczogY2hvaWNlcyxcbiAgICAgICAgdmFsdWVOYW1lOiBwYXJhbXMudmFsdWVOYW1lLFxuICAgICAgICBxdWVzdGlvbjogcGFyYW1zLnF1ZXN0aW9uLFxuICAgICAgICBlZGl0b3I6IHBhcmFtcy5lZGl0b3IsXG4gICAgICAgIGlzRXhwYW5kZWQ6IGlzRXhwYW5kZWQsXG4gICAgICAgIHRvZ2dsZTogKCkgPT4gaXNFeHBhbmRlZCghaXNFeHBhbmRlZCgpKSxcbiAgICAgICAgc2hvd090aGVyOiBrby5jb21wdXRlZChcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgcGFyYW1zLmVkaXRvci5jYW5TaG93T2JqZWN0UHJvcGVydHkocGFyYW1zLnF1ZXN0aW9uLCBcImhhc090aGVyXCIpICYmXG4gICAgICAgICAgICBwYXJhbXMucXVlc3Rpb24uaGFzT3RoZXIgIT09IHRydWVcbiAgICAgICAgKSxcbiAgICAgICAgYWRkT3RoZXI6ICgpID0+IHtcbiAgICAgICAgICB2YXIgbmV3VmFsdWUgPSAhcGFyYW1zLnF1ZXN0aW9uLmhhc090aGVyO1xuICAgICAgICAgIG5ld1ZhbHVlID0gcmFpc2VDaGFuZ2luZ0V2ZW50KHBhcmFtcy5xdWVzdGlvbiwgXCJoYXNPdGhlclwiLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgcGFyYW1zLnF1ZXN0aW9uLmhhc090aGVyID0gbmV3VmFsdWU7XG4gICAgICAgICAgcmFpc2VDaGFuZ2VkRXZlbnQocGFyYW1zLnF1ZXN0aW9uLCBcImhhc090aGVyXCIsIG5ld1ZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWRkSXRlbTogY3JlYXRlQWRkSXRlbUhhbmRsZXIoXG4gICAgICAgICAgcGFyYW1zLnF1ZXN0aW9uLFxuICAgICAgICAgIGl0ZW1WYWx1ZSA9PiB7XG4gICAgICAgICAgICAvLyB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC8vICAgcHJvcGVydHlOYW1lOiBcImNob2ljZXNcIixcbiAgICAgICAgICAgIC8vICAgb2JqOiBwYXJhbXMucXVlc3Rpb24sXG4gICAgICAgICAgICAvLyAgIHZhbHVlOiBwYXJhbXMucXVlc3Rpb24uY2hvaWNlcyxcbiAgICAgICAgICAgIC8vICAgbmV3VmFsdWU6IG51bGwsXG4gICAgICAgICAgICAvLyAgIGRvVmFsaWRhdGlvbjogZmFsc2VcbiAgICAgICAgICAgIC8vIH07XG4gICAgICAgICAgICAvLyBwYXJhbXMuZWRpdG9yLm9uVmFsdWVDaGFuZ2luZ0NhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICAgICAgLy9jaG9pY2VzKHBhcmFtcy5xdWVzdGlvbi5jaG9pY2VzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGl0ZW1WYWx1ZSA9PiB7XG4gICAgICAgICAgICBwYXJhbXMuZWRpdG9yLm9uSXRlbVZhbHVlQWRkZWRDYWxsYmFjayhcbiAgICAgICAgICAgICAgcGFyYW1zLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICBcImNob2ljZXNcIixcbiAgICAgICAgICAgICAgaXRlbVZhbHVlLFxuICAgICAgICAgICAgICBwYXJhbXMucXVlc3Rpb24uY2hvaWNlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIHBhcmFtcy5lZGl0b3Iub25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgICAgICAgIC8vICAgcHJvcGVydHksXG4gICAgICAgICAgICAvLyAgIHBhcmFtcy5xdWVzdGlvbixcbiAgICAgICAgICAgIC8vICAgcGFyYW1zLnF1ZXN0aW9uLmNob2ljZXNcbiAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICBwYXJhbXMuZWRpdG9yLm9uUXVlc3Rpb25FZGl0b3JDaGFuZ2VkKHBhcmFtcy5xdWVzdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgICBnZXRMb2NTdHJpbmc6IHN0ciA9PiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKHN0ciksXG4gICAgICAgIGNob2ljZXNSZW5kZXJlZDogKCkgPT4ge1xuICAgICAgICAgIGlmIChzb3J0YWJsZSkge1xuICAgICAgICAgICAgc29ydGFibGUuZGVzdHJveSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzb3J0YWJsZSA9IFNvcnRhYmxlLmNyZWF0ZShzb3J0YWJsZUVsZW1lbnQsIHtcbiAgICAgICAgICAgIGhhbmRsZTogXCIuc3ZkYS1kcmFnLWhhbmRsZVwiLFxuICAgICAgICAgICAgZHJhZ2dhYmxlOiBcIi5pdGVtX2RyYWdnYWJsZVwiLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgICAgICAgICBvbkVuZDogZXZ0ID0+IHtcbiAgICAgICAgICAgICAgdmFyIG5ld0Nob2ljZXMgPSBbXS5jb25jYXQocGFyYW1zLnF1ZXN0aW9uLmNob2ljZXMpO1xuICAgICAgICAgICAgICB2YXIgY2hvaWNlID0gbmV3Q2hvaWNlc1tldnQub2xkSW5kZXhdO1xuICAgICAgICAgICAgICBuZXdDaG9pY2VzLnNwbGljZShldnQub2xkSW5kZXgsIDEpO1xuICAgICAgICAgICAgICBuZXdDaG9pY2VzLnNwbGljZShldnQubmV3SW5kZXgsIDAsIGNob2ljZSk7XG4gICAgICAgICAgICAgIHBhcmFtcy5xdWVzdGlvbi5jaG9pY2VzID0gbmV3Q2hvaWNlcztcbiAgICAgICAgICAgICAgLy9jaG9pY2VzKG5ld0Nob2ljZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB2YWx1ZUNoYW5nZWQ6IChpdGVtVmFsdWUsIHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpID0+IHtcbiAgICAgICAgICB2YXIgbmV3Q2hvaWNlcyA9IFtdLmNvbmNhdChwYXJhbXMucXVlc3Rpb24uY2hvaWNlcyk7XG4gICAgICAgICAgY2hvaWNlcyhbXSk7XG4gICAgICAgICAgY2hvaWNlcyhuZXdDaG9pY2VzKTtcbiAgICAgICAgICBwYXJhbXMuZWRpdG9yLm9uQWRvcm5lclJlbmRlcmVkQ2FsbGJhY2soXG4gICAgICAgICAgICBwYXJhbXMucXVlc3Rpb24sXG4gICAgICAgICAgICBcInNlbGVjdC1jaG9pY2VzXCIsXG4gICAgICAgICAgICBjb21wb25lbnRJbmZvLmVsZW1lbnRcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBvdGhlclRleHQ6IG90aGVyVGV4dCxcbiAgICAgICAgb3RoZXJWYWx1ZUNoYW5nZWQ6IChpdGVtVmFsdWUsIHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpID0+IHtcbiAgICAgICAgICBvdGhlclRleHQocGFyYW1zLnF1ZXN0aW9uLm90aGVyVGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sXG59KTtcblxuZXhwb3J0IHZhciByZW5kZXJFZGl0YWJsZUl0ZW1zID0gKFxuICBlbGVtZW50czogSFRNTEVsZW1lbnRbXSxcbiAgbW9kZWw6IFF1ZXN0aW9uU2VsZWN0QmFzZSxcbiAgZWRpdG9yXG4pID0+IHtcbiAgZWxlbWVudHNbMF0ub25jbGljayA9IGUgPT4gZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB2YXIgZGVjb3JhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGRlY29yYXRpb24uaW5uZXJIVE1MID1cbiAgICBcIjxzZWxlY3QtaXRlbXMtZWRpdG9yIHBhcmFtcz0ncXVlc3Rpb246IHF1ZXN0aW9uLCBlZGl0b3I6IGVkaXRvciwgdmFsdWVOYW1lOiBcXFwiXCIgK1xuICAgIChpdGVtQWRvcm5lci5pbnBsYWNlRWRpdEZvclZhbHVlcyA/IFwidmFsdWVcIiA6IFwidGV4dFwiKSArXG4gICAgXCJcXFwiJz48L3NlbGVjdC1pdGVtcy1lZGl0b3I+XCI7XG4gIGVsZW1lbnRzWzBdLmFwcGVuZENoaWxkKGRlY29yYXRpb24pO1xuICBrby5hcHBseUJpbmRpbmdzKFxuICAgIHtcbiAgICAgIHF1ZXN0aW9uOiBtb2RlbCxcbiAgICAgIGVkaXRvcjogZWRpdG9yXG4gICAgfSxcbiAgICBkZWNvcmF0aW9uXG4gICk7XG4gIGVkaXRvci5vbkFkb3JuZXJSZW5kZXJlZENhbGxiYWNrKG1vZGVsLCBcInNlbGVjdC1jaG9pY2VzXCIsIGRlY29yYXRpb24pO1xufTtcbiIsImltcG9ydCB7IHJlbmRlckRpc3BsYXlNb2RlIH0gZnJvbSBcIi4uL2Fkb3JuZXJzL3NlbGVjdC1pdGVtcy1kaXNwbGF5XCI7XG5pbXBvcnQgeyByZW5kZXJFZGl0YWJsZUl0ZW1zfSBmcm9tIFwiLi4vYWRvcm5lcnMvc2VsZWN0LWl0ZW1zLWVkaXRvclwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJBZG9ybmVyIH0gZnJvbSBcIi4uL3N1cnZleWpzT2JqZWN0c1wiO1xuXG5pbXBvcnQgXCIuL3NlbGVjdC1pdGVtcy1lZGl0b3Iuc2Nzc1wiO1xuXG5leHBvcnQgdmFyIHNlbGVjdEl0ZW1zQWRvcm5lciA9IHtcbiAgZ2V0TWFya2VyQ2xhc3M6IG1vZGVsID0+IHtcbiAgICByZXR1cm4gISFtb2RlbC5wYXJlbnQgJiYgISFtb2RlbC5jaG9pY2VzICA/IFwic2VsZWN0X2l0ZW1zX2NvbW1vblwiIDogXCJcIjtcbiAgfSxcbiAgZ2V0RWxlbWVudE5hbWU6IG1vZGVsID0+IFwic2VsZWN0V3JhcHBlclwiLFxuICBhZnRlclJlbmRlcjogcmVuZGVyRWRpdGFibGVJdGVtcyxcbiAgcmVuZGVyUmVhZE9ubHk6ICByZW5kZXJEaXNwbGF5TW9kZSxcbiAgaXNFeHBhbmRlZDogdHJ1ZVxufTtcbnJlZ2lzdGVyQWRvcm5lcihcInNlbGVjdC1jaG9pY2VzXCIsIHNlbGVjdEl0ZW1zQWRvcm5lcik7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7XG4gIHJlZ2lzdGVyQWRvcm5lcixcbiAgU3VydmV5Rm9yRGVzaWduZXIsXG4gIElTdXJ2ZXlPYmplY3RNZW51SXRlbSxcbn0gZnJvbSBcIi4uL3N1cnZleWpzT2JqZWN0c1wiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi90aXRsZS1hY3Rpb25zLnNjc3NcIjtcbnZhciB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiaHRtbC1sb2FkZXI/aW50ZXJwb2xhdGUhdmFsLWxvYWRlciEuL3RpdGxlLWFjdGlvbnMuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFRpdGxlQWN0aW9uc1ZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzdXJ2ZXk6IFN1cnZleUZvckRlc2lnbmVyLFxuICAgIHByb3RlY3RlZCBpbnB1dDogSFRNTElucHV0RWxlbWVudCxcbiAgICBwcm90ZWN0ZWQgcm9vdEVsZW1lbnQsXG4gICAgYWxsb3dJbWFnZUNob29zZXIgPSB0cnVlXG4gICkge1xuICAgIGlmIChhbGxvd0ltYWdlQ2hvb3Nlcikge1xuICAgICAgdGhpcy5hY3Rpb25zLnB1c2goe1xuICAgICAgICBuYW1lOiBcImVkaXRlbGVtZW50XCIsXG4gICAgICAgIHZpc2libGU6IGtvLmNvbXB1dGVkKCgpID0+IHN1cnZleS5rb1Nob3dIZWFkZXIoKSksXG4gICAgICAgIHRleHQ6IGtvLmNvbXB1dGVkKCgpID0+XG4gICAgICAgICAgdGhpcy5nZXRMb2NTdHJpbmcoXG4gICAgICAgICAgICBzdXJ2ZXkuaXNMb2dvSW1hZ2VDaG9vc2VuID8gXCJwZS5jaGFuZ2VMb2dvXCIgOiBcInBlLmFkZExvZ29cIlxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgaGFzVGl0bGU6IHRydWUsXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnN1cnZleS5nZXRFZGl0b3IoKS5jaG9vc2VGaWxlcyh0aGlzLmlucHV0LCB0aGlzLnVwbG9hZEZpbGVzKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hY3Rpb25zLnB1c2goPGFueT57XG4gICAgICAgIG5hbWU6IFwic2V0TG9nb1Bvc2l0aW9uXCIsXG4gICAgICAgIHRleHQ6IHRoaXMuZ2V0TG9jU3RyaW5nKFwicGUubG9nb1Bvc2l0aW9uXCIpLFxuICAgICAgICB2aXNpYmxlOiBrby5jb21wdXRlZChcbiAgICAgICAgICAoKSA9PiBzdXJ2ZXkua29TaG93SGVhZGVyKCkgJiYgc3VydmV5LmlzTG9nb0ltYWdlQ2hvb3NlblxuICAgICAgICApLFxuICAgICAgICB2YWx1ZToga28uY29tcHV0ZWQoKCkgPT4gc3VydmV5LmxvZ29Qb3NpdGlvbiksXG4gICAgICAgIHRlbXBsYXRlOiBcImNob2ljZS1hY3Rpb25cIixcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgIHsgdmFsdWU6IFwibm9uZVwiLCB0ZXh0OiB0aGlzLmdldExvY1N0cmluZyhcInBlLmxvZ29Qb3NpdGlvbnMubm9uZVwiKSB9LFxuICAgICAgICAgIHsgdmFsdWU6IFwibGVmdFwiLCB0ZXh0OiB0aGlzLmdldExvY1N0cmluZyhcInBlLmxvZ29Qb3NpdGlvbnMubGVmdFwiKSB9LFxuICAgICAgICAgIHsgdmFsdWU6IFwicmlnaHRcIiwgdGV4dDogdGhpcy5nZXRMb2NTdHJpbmcoXCJwZS5sb2dvUG9zaXRpb25zLnJpZ2h0XCIpIH0sXG4gICAgICAgICAgeyB2YWx1ZTogXCJ0b3BcIiwgdGV4dDogdGhpcy5nZXRMb2NTdHJpbmcoXCJwZS5sb2dvUG9zaXRpb25zLnRvcFwiKSB9LFxuICAgICAgICAgIHsgdmFsdWU6IFwiYm90dG9tXCIsIHRleHQ6IHRoaXMuZ2V0TG9jU3RyaW5nKFwicGUubG9nb1Bvc2l0aW9ucy5ib3R0b21cIikgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb25DbGljazogKGRhdGEsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgdmFyIG5ld1ZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgIHN1cnZleS5sb2dvUG9zaXRpb24gPSBuZXdWYWx1ZTtcbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICBzdXJ2ZXkubG9nbyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN1cnZleS5nZXRFZGl0b3IoKS5hbGxvd0NvbnRyb2xTdXJ2ZXlUaXRsZVZpc2liaWxpdHkpIHtcbiAgICAgIGlmIChhbGxvd0ltYWdlQ2hvb3Nlcikge1xuICAgICAgICB0aGlzLmFjdGlvbnMucHVzaCg8YW55PntcbiAgICAgICAgICB2aXNpYmxlOiBrby5jb21wdXRlZCgoKSA9PiBzdXJ2ZXkua29TaG93SGVhZGVyKCkpLFxuICAgICAgICAgIHRlbXBsYXRlOiBcImFjdGlvbi1zZXBhcmF0b3JcIixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmFjdGlvbnMucHVzaCg8YW55PntcbiAgICAgICAgbmFtZTogXCJzaG93U3VydmV5VGl0bGVcIixcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgdGV4dDogdGhpcy5nZXRMb2NTdHJpbmcoXCJwZS5leHBhbmRDb2xsYXBzZVRpdGxlXCIpLFxuICAgICAgICBjbGFzc05hbWU6IFwic3ZkYS10aXRsZS1hY3Rpb25fX3Nob3ctaGlkZVwiLFxuICAgICAgICBpY29uOiBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFzdXJ2ZXkua29TaG93SGVhZGVyKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBcImljb24tYXJyb3dfZG93bl8xMHgxMFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCJpY29uLWFycm93X3VwXzEweDEwXCI7XG4gICAgICAgIH0pLFxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgc3VydmV5LmtvU2hvd0hlYWRlcighc3VydmV5LmtvU2hvd0hlYWRlcigpKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICB2YXIgaGVhZGVyQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMucm9vdEVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgICAgICAucGFyZW50RWxlbWVudDtcbiAgICAgIGlmIChzdXJ2ZXkua29TaG93SGVhZGVyKCkpIHtcbiAgICAgICAgaGVhZGVyQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoXCJzdmRfc3VydmV5X2hlYWRlci0taGlkZGVuXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhZGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzdmRfc3VydmV5X2hlYWRlci0taGlkZGVuXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdXBsb2FkRmlsZXMgPSAoZmlsZXM6IEZpbGVbXSkgPT4ge1xuICAgIGlmICghZmlsZXNbMF0pIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5nZXRFZGl0b3IoKS51cGxvYWRGaWxlcyhmaWxlcywgKF8sIGxpbmspID0+IHtcbiAgICAgIHRoaXMuc3VydmV5LmxvZ28gPSBsaW5rO1xuICAgICAgaWYgKHRoaXMuc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkubG9nb1Bvc2l0aW9uID0gXCJsZWZ0XCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9jU3RyaW5nKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoc3RyKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHlsZShtb2RlbDogSVN1cnZleU9iamVjdE1lbnVJdGVtKSB7XG4gICAgcmV0dXJuIGtvLnVud3JhcCgoPGFueT5tb2RlbCkuY2xhc3NOYW1lKSB8fCBcIlwiO1xuICB9XG5cbiAgcHVibGljIGdldEljb24obW9kZWw6IElTdXJ2ZXlPYmplY3RNZW51SXRlbSkge1xuICAgIGlmICghIW1vZGVsLmljb24pIHtcbiAgICAgIHJldHVybiBrby51bndyYXAoPGFueT5tb2RlbC5pY29uKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiaWNvbi1hY3Rpb25cIiArIG1vZGVsLm5hbWU7XG4gIH1cblxuICBhY3Rpb25zID0ga28ub2JzZXJ2YWJsZUFycmF5PElTdXJ2ZXlPYmplY3RNZW51SXRlbT4oKTtcbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInRpdGxlLWFjdGlvbnNcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIHZhciBtb2RlbCA9IG5ldyBUaXRsZUFjdGlvbnNWaWV3TW9kZWwoXG4gICAgICAgIHBhcmFtcy5zdXJ2ZXksXG4gICAgICAgIHBhcmFtcy5pbnB1dCxcbiAgICAgICAgY29tcG9uZW50SW5mby5lbGVtZW50LFxuICAgICAgICBwYXJhbXMuYWxsb3dJbWFnZUNob29zZXJcbiAgICAgICk7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyByZWdpc3RlckFkb3JuZXIgfSBmcm9tIFwiLi4vc3VydmV5anNPYmplY3RzXCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5cbmltcG9ydCBcIi4vdGl0bGUtZWRpdG9yLnNjc3NcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4uL2VkaXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlS2V5MmNsaWNrIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG52YXIgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi90aXRsZS1lZGl0b3IuaHRtbFwiKTtcblxuY29uc3QgRlJJRU5ETFlfUEFERElORyA9IDQyO1xuZnVuY3Rpb24gcmVzaXplSW5wdXQodGFyZ2V0KSB7XG4gIGlmICghdGFyZ2V0LnN0eWxlKSByZXR1cm47XG4gIGxldCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KTtcbiAgdGFyZ2V0LnN0eWxlLndpZHRoID1cbiAgICBnZXRUZXh0V2lkdGgoXG4gICAgICB0YXJnZXQudmFsdWUsXG4gICAgICBjb21wdXRlZFN0eWxlLmZvbnRTaXplICsgXCIgXCIgKyBjb21wdXRlZFN0eWxlLmZvbnRGYW1pbHlcbiAgICApICtcbiAgICBGUklFTkRMWV9QQURESU5HICtcbiAgICBcInB4XCI7XG59XG5cbi8qKlxuICogVXNlcyBjYW52YXMubWVhc3VyZVRleHQgdG8gY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4gdGV4dCBvZiBnaXZlbiBmb250IGluIHBpeGVscy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdGV4dCBUaGUgdGV4dCB0byBiZSByZW5kZXJlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBmb250IFRoZSBjc3MgZm9udCBkZXNjcmlwdG9yIHRoYXQgdGV4dCBpcyB0byBiZSByZW5kZXJlZCB3aXRoIChlLmcuIFwiYm9sZCAxNHB4IHZlcmRhbmFcIikuXG4gKlxuICogQHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTgyNDEvY2FsY3VsYXRlLXRleHQtd2lkdGgtd2l0aC1qYXZhc2NyaXB0LzIxMDE1MzkzIzIxMDE1MzkzXG4gKi9cbmxldCBjYWNoZWRDYW52YXM7XG5mdW5jdGlvbiBnZXRUZXh0V2lkdGgodGV4dCwgZm9udCkge1xuICAvLyByZS11c2UgY2FudmFzIG9iamVjdCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gIHZhciBjYW52YXMgPVxuICAgIGNhY2hlZENhbnZhcyB8fCAoY2FjaGVkQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSk7XG4gIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgY29udGV4dC5mb250ID0gZm9udDtcbiAgdmFyIG1ldHJpY3MgPSBjb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpO1xuICByZXR1cm4gbWV0cmljcy53aWR0aDtcbn1cblxuZXhwb3J0IGNsYXNzIFRpdGxlSW5wbGFjZUVkaXRvciB7XG4gIHByaXZhdGUgX3ZhbHVlU3Vic2NyaXB0aW9uOiBrby5Db21wdXRlZDtcbiAgcHJpdmF0ZSBkcmFnZ2FibGVFbGVtZW50O1xuICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eTtcbiAgZWRpdGluZ05hbWUgPSBrby5vYnNlcnZhYmxlPHN0cmluZz4oKTtcbiAgcHJldk5hbWUgPSBrby5vYnNlcnZhYmxlPHN0cmluZz4oKTtcbiAgaXNFZGl0aW5nID0ga28ub2JzZXJ2YWJsZTxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSBfbmVlZFNlbGVjdFRhcmdldE9uU3RhcnRFZGl0ID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGZvck5laWJvdXJzKGZ1bmM6IChlbDogSFRNTEVsZW1lbnQsIGluZGV4PzogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMucm9vdEVsZW1lbnQgfHxcbiAgICAgICF0aGlzLnJvb3RFbGVtZW50LnBhcmVudEVsZW1lbnQgfHxcbiAgICAgICF0aGlzLnJvb3RFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB2YXIgaG9sZGVyID0gdGhpcy5yb290RWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob2xkZXIuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IGhvbGRlci5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChlbGVtZW50LmNsYXNzTmFtZS5pbmRleE9mKFwic3ZkYS1jdXN0b20tY29udGVudFwiKSA9PT0gLTEpIHtcbiAgICAgICAgZnVuYyhlbGVtZW50LCBpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uVmFsaWRhdGVTZWxlY3RlZEVsZW1lbnQgPSAoY3JlYXRvciwgb3B0aW9ucykgPT4ge1xuICAgIGlmICh0aGlzLmhhc0Vycm9ycygpKSB7XG4gICAgICBvcHRpb25zLmVycm9ycy5wdXNoKHRoaXMuZXJyb3IoKSk7XG4gICAgfVxuICB9O1xuXG4gIGdldElucHV0RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb290RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImlucHV0XCIpWzBdO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHRhcmdldDogYW55LFxuICAgIHByb3RlY3RlZCBuYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIHJvb3RFbGVtZW50LFxuICAgIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nID0gXCJcIixcbiAgICBwdWJsaWMgZWRpdG9yOiBTdXJ2ZXlDcmVhdG9yXG4gICkge1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0LmdldFR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5wcm9wZXJ0eSA9IFN1cnZleS5TZXJpYWxpemVyLmZpbmRQcm9wZXJ0eSh0YXJnZXQuZ2V0VHlwZSgpLCBuYW1lKTtcbiAgICAgIHRoaXMuX25lZWRTZWxlY3RUYXJnZXRPblN0YXJ0RWRpdCA9IHRhcmdldC5nZXRUeXBlKCkgPT09IFwic3VydmV5XCI7XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsdWVTdWJzY3JpcHRpb24gPSBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICAvL1RPIFJFVklFVyBUSElTIENSVVRDSFxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnByb3BlcnR5LnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSAhPT0gdGhpcy5wcm9wZXJ0eS5uYW1lICYmXG4gICAgICAgICEhdGFyZ2V0W3RoaXMucHJvcGVydHkuc2VyaWFsaXphdGlvblByb3BlcnR5XVxuICAgICAgKSB7XG4gICAgICAgIGtvLnVud3JhcCh0YXJnZXRbdGhpcy5wcm9wZXJ0eS5zZXJpYWxpemF0aW9uUHJvcGVydHldLmtvUmVuZGVyZWRIdG1sKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJldk5hbWUoa28udW53cmFwKHRhcmdldFtuYW1lXSkpO1xuICAgICAgdGhpcy5lZGl0aW5nTmFtZShrby51bndyYXAodGFyZ2V0W25hbWVdKSk7XG4gICAgfSk7XG5cbiAgICBpZiAoISFlZGl0b3IgJiYgISFlZGl0b3Iub25WYWxpZGF0ZVNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgZWRpdG9yLm9uVmFsaWRhdGVTZWxlY3RlZEVsZW1lbnQuYWRkKHRoaXMub25WYWxpZGF0ZVNlbGVjdGVkRWxlbWVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JOZWlib3VycygoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGVsZW1lbnQudGFiSW5kZXggPSAwO1xuICAgICAgZWxlbWVudC5vbmtleXVwID0gY3JlYXRlS2V5MmNsaWNrKGVsZW1lbnQpO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgICB0aGlzLmdldExvY1N0cmluZyhcInBlLnRpdGxlS2V5Ym9hcmRBZG9ybmVyVGlwXCIpXG4gICAgICApO1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwidGV4dGJveFwiKTtcbiAgICAgIGVsZW1lbnQub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhcnRFZGl0KHRoaXMsIGUpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IG1heExlbmd0aCgpIHtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMucHJvcGVydHkgJiZcbiAgICAgIHRoaXMucHJvcGVydHkubWF4TGVuZ3RoICYmXG4gICAgICB0aGlzLnByb3BlcnR5Lm1heExlbmd0aCA+PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eS5tYXhMZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgZ2V0IHJlYWRPbmx5KCkge1xuICAgIGlmICghIXRoaXMucHJvcGVydHkgJiYgISF0aGlzLmVkaXRvcikge1xuICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLm9uSXNQcm9wZXJ0eVJlYWRPbmx5Q2FsbGJhY2soXG4gICAgICAgIHRoaXMudGFyZ2V0LFxuICAgICAgICB0aGlzLnByb3BlcnR5LFxuICAgICAgICB0aGlzLnByb3BlcnR5LnJlYWRPbmx5LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFsdWVDaGFuZ2VkOiAobmV3VmFsOiBhbnkpID0+IHN0cmluZztcblxuICBwdWJsaWMgZ2V0TG9jU3RyaW5nKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoc3RyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVQcmV2TmFtZSgpIHtcbiAgICB0aGlzLnByZXZOYW1lKHRoaXMudGFyZ2V0W3RoaXMubmFtZV0pO1xuICB9XG5cbiAgZXJyb3IgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICBwdWJsaWMgaGFzRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciBlcnJvclRleHQgPSBcIlwiO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuZWRpdGluZ05hbWUoKTtcbiAgICBpZiAodGhpcy5wcm9wZXJ0eS5pc1JlcXVpcmVkICYmICFuZXdWYWx1ZSkge1xuICAgICAgZXJyb3JUZXh0ID0gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBlLnByb3BlcnR5SXNFbXB0eVwiKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIWVycm9yVGV4dCAmJlxuICAgICAgISF0aGlzLmVkaXRvciAmJlxuICAgICAgISF0aGlzLmVkaXRvci5vbkdldEVycm9yVGV4dE9uVmFsaWRhdGlvbkNhbGxiYWNrXG4gICAgKSB7XG4gICAgICBlcnJvclRleHQgPSB0aGlzLmVkaXRvci5vbkdldEVycm9yVGV4dE9uVmFsaWRhdGlvbkNhbGxiYWNrKFxuICAgICAgICB0aGlzLnByb3BlcnR5Lm5hbWUsXG4gICAgICAgIHRoaXMudGFyZ2V0LFxuICAgICAgICBuZXdWYWx1ZVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5lcnJvcihlcnJvclRleHQpO1xuICAgIHJldHVybiAhIWVycm9yVGV4dDtcbiAgfVxuXG4gIGhpZGVFZGl0b3IgPSAoKSA9PiB7XG4gICAgdGhpcy5pc0VkaXRpbmcoZmFsc2UpO1xuICAgIHRoaXMuZm9yTmVpYm91cnMoKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPT09IDAgJiYgdHlwZW9mIGVsZW1lbnQuZm9jdXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBlbGVtZW50LmRhdGFzZXRbXCJzanNPbGREaXNwbGF5XCJdO1xuICAgIH0pO1xuICB9O1xuICBmaW5kRHJhZ2dhYmxlRWxlbWVudChlbDogYW55KTogYW55IHtcbiAgICB3aGlsZSAoZWwpIHtcbiAgICAgIGlmIChlbC5kcmFnZ2FibGUpIHJldHVybiBlbDtcbiAgICAgIGVsID0gZWwucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgc3RhcnRFZGl0ID0gKG1vZGVsOiBUaXRsZUlucGxhY2VFZGl0b3IsIGV2ZW50KSA9PiB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX25lZWRTZWxlY3RUYXJnZXRPblN0YXJ0RWRpdCkge1xuICAgICAgdGhpcy5lZGl0b3Iuc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy50YXJnZXQ7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlUHJldk5hbWUoKTtcbiAgICB0aGlzLmVkaXRpbmdOYW1lKHRoaXMucHJldk5hbWUoKSk7XG4gICAgdGhpcy5pc0VkaXRpbmcodHJ1ZSk7XG4gICAgdGhpcy5mb3JOZWlib3VycygoZWxlbWVudCkgPT4ge1xuICAgICAgZWxlbWVudC5kYXRhc2V0W1wic2pzT2xkRGlzcGxheVwiXSA9IGVsZW1lbnQuc3R5bGUuZGlzcGxheTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIH0pO1xuICAgIHZhciBpbnB1dEVsZW1lbnQgPSB0aGlzLmdldElucHV0RWxlbWVudCgpO1xuICAgIHRoaXMuZHJhZ2dhYmxlRWxlbWVudCA9IHRoaXMuZmluZERyYWdnYWJsZUVsZW1lbnQoaW5wdXRFbGVtZW50KTtcbiAgICBpZiAoISF0aGlzLmRyYWdnYWJsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZHJhZ2dhYmxlRWxlbWVudC5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICB9XG4gICAgaW5wdXRFbGVtZW50Lm9uYmx1ciA9ICgpID0+IHtcbiAgICAgIGlmICghIXRoaXMuZHJhZ2dhYmxlRWxlbWVudCkge1xuICAgICAgICB0aGlzLmRyYWdnYWJsZUVsZW1lbnQuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlucHV0RWxlbWVudC5vbmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSBtb2RlbC5lZGl0b3Iub25UaXRsZUlucGxhY2VFZGl0b3JTdGFydEVkaXQ7XG4gICAgICBpZiAoISFjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhpbnB1dEVsZW1lbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdCgpO1xuICAgIH07XG4gICAgcmVzaXplSW5wdXQoaW5wdXRFbGVtZW50KTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlucHV0RWxlbWVudC5mb2N1cygpO1xuICAgIH0sIDEwKTtcbiAgfTtcbiAgcG9zdEVkaXQgPSAoKSA9PiB7XG4gICAgdGhpcy5lcnJvcihcIlwiKTtcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgdGhpcy5jYW5jZWxFZGl0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnByZXZOYW1lKCkgIT09IHRoaXMuZWRpdGluZ05hbWUoKSkge1xuICAgICAgaWYgKHRoaXMuaGFzRXJyb3JzKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCEhdGhpcy52YWx1ZUNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZWQodGhpcy5lZGl0aW5nTmFtZSgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJldk5hbWUodGhpcy5lZGl0aW5nTmFtZSgpKTtcbiAgICB9XG4gICAgdGhpcy5oaWRlRWRpdG9yKCk7XG4gIH07XG4gIGNhbmNlbEVkaXQgPSAoKSA9PiB7XG4gICAgdGhpcy5lZGl0aW5nTmFtZSh0aGlzLnByZXZOYW1lKCkpO1xuICAgIHRoaXMuaGlkZUVkaXRvcigpO1xuICB9O1xuICBuYW1lRWRpdG9yS2V5cHJlc3MgPSAobW9kZWwsIGV2ZW50KSA9PiB7XG4gICAgcmVzaXplSW5wdXQoZXZlbnQudGFyZ2V0KTtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIHRoaXMucG9zdEVkaXQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgMjc6XG4gICAgICAgIHRoaXMuY2FuY2VsRWRpdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDY6XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfTtcbiAgbmFtZUVkaXRvcktleWRvd24gPSAobW9kZWwsIGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgKGV2ZW50LmtleUNvZGUgPT0gOTAgfHwgZXZlbnQua2V5Q29kZSA9PSA4OSkpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLmZvck5laWJvdXJzKChlbGVtZW50KSA9PiB7XG4gICAgICBlbGVtZW50Lm9uY2xpY2sgPSB1bmRlZmluZWQ7XG4gICAgICBlbGVtZW50Lm9ua2V5dXAgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdGhpcy5fdmFsdWVTdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xuICAgIGlmICghIXRoaXMuZWRpdG9yICYmICEhdGhpcy5lZGl0b3Iub25WYWxpZGF0ZVNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgdGhpcy5lZGl0b3Iub25WYWxpZGF0ZVNlbGVjdGVkRWxlbWVudC5yZW1vdmUoXG4gICAgICAgIHRoaXMub25WYWxpZGF0ZVNlbGVjdGVkRWxlbWVudFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInRpdGxlLWVkaXRvclwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgdmFyIG1vZGVsID0gbmV3IFRpdGxlSW5wbGFjZUVkaXRvcihcbiAgICAgICAgcGFyYW1zLm1vZGVsLFxuICAgICAgICBwYXJhbXMubmFtZSxcbiAgICAgICAgY29tcG9uZW50SW5mby5lbGVtZW50LFxuICAgICAgICBwYXJhbXMucGxhY2Vob2xkZXIsXG4gICAgICAgIHBhcmFtcy5lZGl0b3JcbiAgICAgICk7XG4gICAgICBtb2RlbC52YWx1ZUNoYW5nZWQgPSAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgcHJvcGVydHlOYW1lOiBtb2RlbC5wcm9wZXJ0eS5uYW1lLFxuICAgICAgICAgIG9iajogcGFyYW1zLm1vZGVsLFxuICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgICBuZXdWYWx1ZTogbnVsbCxcbiAgICAgICAgICBkb1ZhbGlkYXRpb246IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBwYXJhbXMuZWRpdG9yLm9uVmFsdWVDaGFuZ2luZ0NhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICBuZXdWYWx1ZSA9IG9wdGlvbnMubmV3VmFsdWUgPT09IG51bGwgPyBvcHRpb25zLnZhbHVlIDogb3B0aW9ucy5uZXdWYWx1ZTtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gcGFyYW1zLm1vZGVsW3BhcmFtcy5uYW1lXTtcbiAgICAgICAgcGFyYW1zLm1vZGVsW3BhcmFtcy5uYW1lXSA9IG5ld1ZhbHVlO1xuICAgICAgICBwYXJhbXMuZWRpdG9yLm9uUHJvcGVydHlDaGFuZ2VkKHBhcmFtcy5tb2RlbCwgbW9kZWwucHJvcGVydHksIG9sZFZhbHVlKTtcbiAgICAgICAgcGFyYW1zLmVkaXRvci5vblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgICAgICAgIG1vZGVsLnByb3BlcnR5LFxuICAgICAgICAgIHBhcmFtcy5tb2RlbCxcbiAgICAgICAgICBuZXdWYWx1ZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH07XG5cbiAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2soY29tcG9uZW50SW5mby5lbGVtZW50LCAoKSA9PiB7XG4gICAgICAgIG1vZGVsLnZhbHVlQ2hhbmdlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgbW9kZWwuZGlzcG9zZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG5cbmV4cG9ydCB2YXIgdGl0bGVBZG9ybmVyID0ge1xuICBzdXJ2ZXlUaXRsZUVkaXRhYmxlOiB0cnVlLFxuICBwYWdlVGl0bGVFZGl0YWJsZTogdHJ1ZSxcbiAgZ2V0TWFya2VyQ2xhc3M6IChtb2RlbCkgPT4ge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBtb2RlbC5nZXRUeXBlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICgobW9kZWwuZ2V0VHlwZSgpID09PSBcInBhZ2VcIiAmJiAhdGl0bGVBZG9ybmVyLnBhZ2VUaXRsZUVkaXRhYmxlKSB8fFxuICAgICAgICAobW9kZWwuZ2V0VHlwZSgpID09PSBcInN1cnZleVwiICYmICF0aXRsZUFkb3JuZXIuc3VydmV5VGl0bGVFZGl0YWJsZSkgfHxcbiAgICAgICAgIVN1cnZleS5TZXJpYWxpemVyLmZpbmRQcm9wZXJ0eShtb2RlbC5nZXRUeXBlKCksIFwidGl0bGVcIikpXG4gICAgKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwidGl0bGVfZWRpdGFibGVcIjtcbiAgfSxcbiAgZ2V0RWxlbWVudE5hbWU6IChtb2RlbCkgPT4gXCJ0aXRsZVwiLFxuICBhZnRlclJlbmRlcjogKGVsZW1lbnRzOiBIVE1MRWxlbWVudFtdLCBtb2RlbCwgZWRpdG9yKSA9PiB7XG4gICAgdmFyIHBsYWNlaG9sZGVyID0gXCJcIjtcbiAgICBpZiAobW9kZWwuZ2V0VHlwZSgpID09PSBcInN1cnZleVwiKSB7XG4gICAgICBwbGFjZWhvbGRlciA9IGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZS5zdXJ2ZXlUaXRsZVBsYWNlaG9sZGVyXCIpO1xuICAgIH1cbiAgICBpZiAobW9kZWwuZ2V0VHlwZSgpID09PSBcInBhZ2VcIikge1xuICAgICAgcGxhY2Vob2xkZXIgPSBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGUucGFnZVRpdGxlUGxhY2Vob2xkZXJcIik7XG4gICAgfVxuICAgIHZhciBkZWNvcmF0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgZGVjb3JhdGlvbi5pbm5lckhUTUwgPSBgPHRpdGxlLWVkaXRvciBwYXJhbXM9J25hbWU6IFxcXCJ0aXRsZVxcXCIsIHBsYWNlaG9sZGVyOiBcIiR7cGxhY2Vob2xkZXIucmVwbGFjZShcbiAgICAgIFwiJ1wiLFxuICAgICAgXCImIzM5O1wiXG4gICAgKX1cIiwgbW9kZWw6IG1vZGVsLCBlZGl0b3I6IGVkaXRvcic+PC90aXRsZS1lZGl0b3I+YDtcbiAgICBlbGVtZW50c1swXS5hcHBlbmRDaGlsZChkZWNvcmF0aW9uKTtcbiAgICBrby5hcHBseUJpbmRpbmdzKHsgbW9kZWw6IG1vZGVsLCBlZGl0b3I6IGVkaXRvciB9LCBkZWNvcmF0aW9uKTtcbiAgICBlZGl0b3Iub25BZG9ybmVyUmVuZGVyZWRDYWxsYmFjayhtb2RlbCwgXCJ0aXRsZVwiLCBkZWNvcmF0aW9uKTtcbiAgfSxcbn07XG5yZWdpc3RlckFkb3JuZXIoXCJ0aXRsZVwiLCB0aXRsZUFkb3JuZXIpO1xuXG5leHBvcnQgdmFyIGl0ZW1UaXRsZUFkb3JuZXIgPSB7XG4gIGlucGxhY2VFZGl0Rm9yTmFtZXM6IGZhbHNlLFxuICBnZXRNYXJrZXJDbGFzczogKG1vZGVsKSA9PiB7XG4gICAgcmV0dXJuICEhbW9kZWwuaXRlbXMgPyBcIml0ZW1fdGl0bGVfZWRpdGFibGUgdGl0bGVfZWRpdGFibGVcIiA6IFwiXCI7XG4gIH0sXG4gIGdldEVsZW1lbnROYW1lOiAobW9kZWwpID0+IFwiaXRlbVRpdGxlXCIsXG4gIGFmdGVyUmVuZGVyOiAoXG4gICAgZWxlbWVudHM6IEhUTUxFbGVtZW50W10sXG4gICAgbW9kZWw6IFN1cnZleS5RdWVzdGlvbk11bHRpcGxlVGV4dCxcbiAgICBlZGl0b3JcbiAgKSA9PiB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IGl0ZW1UaXRsZUFkb3JuZXIuaW5wbGFjZUVkaXRGb3JOYW1lcyA/IFwibmFtZVwiIDogXCJ0aXRsZVwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZWNvcmF0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICBkZWNvcmF0aW9uLmlubmVySFRNTCA9XG4gICAgICAgIFwiPHRpdGxlLWVkaXRvciBwYXJhbXM9J25hbWU6IFxcXCJcIiArXG4gICAgICAgIHByb3BlcnR5TmFtZSArXG4gICAgICAgIFwiXFxcIiwgbW9kZWw6IG1vZGVsLCBlZGl0b3I6IGVkaXRvcic+PC90aXRsZS1lZGl0b3I+XCI7XG4gICAgICBlbGVtZW50c1tpXS5hcHBlbmRDaGlsZChkZWNvcmF0aW9uKTtcbiAgICAgIGtvLmFwcGx5QmluZGluZ3MoeyBtb2RlbDogbW9kZWwuaXRlbXNbaV0sIGVkaXRvcjogZWRpdG9yIH0sIGRlY29yYXRpb24pO1xuICAgICAgZWRpdG9yLm9uQWRvcm5lclJlbmRlcmVkQ2FsbGJhY2soXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBcIml0ZW0tdGl0bGVcIixcbiAgICAgICAgZGVjb3JhdGlvbixcbiAgICAgICAgbW9kZWwuaXRlbXNbaV1cbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcbnJlZ2lzdGVyQWRvcm5lcihcIml0ZW0tdGl0bGVcIiwgaXRlbVRpdGxlQWRvcm5lcik7XG5cbmV4cG9ydCB2YXIgZGVzY3JpcHRpb25BZG9ybmVyID0ge1xuICBzdXJ2ZXlEZXNjcmlwdGlvbkVkaXRhYmxlOiB0cnVlLFxuICBwYWdlRGVzY3JpcHRpb25FZGl0YWJsZTogdHJ1ZSxcbiAgZ2V0TWFya2VyQ2xhc3M6IChtb2RlbCkgPT4ge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBtb2RlbC5nZXRUeXBlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICgobW9kZWwuZ2V0VHlwZSgpID09PSBcInBhZ2VcIiAmJlxuICAgICAgICAhZGVzY3JpcHRpb25BZG9ybmVyLnBhZ2VEZXNjcmlwdGlvbkVkaXRhYmxlKSB8fFxuICAgICAgICAobW9kZWwuZ2V0VHlwZSgpID09PSBcInN1cnZleVwiICYmXG4gICAgICAgICAgIWRlc2NyaXB0aW9uQWRvcm5lci5zdXJ2ZXlEZXNjcmlwdGlvbkVkaXRhYmxlKSB8fFxuICAgICAgICAhU3VydmV5LlNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KG1vZGVsLmdldFR5cGUoKSwgXCJkZXNjcmlwdGlvblwiKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gXCJkZXNjcmlwdGlvbl9lZGl0YWJsZVwiO1xuICB9LFxuICBnZXRFbGVtZW50TmFtZTogKG1vZGVsKSA9PiBcImRlc2NyaXB0aW9uXCIsXG4gIGFmdGVyUmVuZGVyOiAoZWxlbWVudHM6IEhUTUxFbGVtZW50W10sIG1vZGVsLCBlZGl0b3IpID0+IHtcbiAgICB2YXIgcGxhY2Vob2xkZXIgPSBcIlwiO1xuICAgIGlmIChtb2RlbC5nZXRUeXBlKCkgPT09IFwic3VydmV5XCIpIHtcbiAgICAgIHBsYWNlaG9sZGVyID0gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcbiAgICAgICAgXCJwZS5zdXJ2ZXlEZXNjcmlwdGlvblBsYWNlaG9sZGVyXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChtb2RlbC5nZXRUeXBlKCkgPT09IFwicGFnZVwiKSB7XG4gICAgICBwbGFjZWhvbGRlciA9IGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXG4gICAgICAgIFwicGUucGFnZURlc2NyaXB0aW9uUGxhY2Vob2xkZXJcIlxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIGRlY29yYXRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBkZWNvcmF0aW9uLmlubmVySFRNTCA9IGA8dGl0bGUtZWRpdG9yIHBhcmFtcz0nbmFtZTogXFxcImRlc2NyaXB0aW9uXFxcIiwgcGxhY2Vob2xkZXI6IFwiJHtwbGFjZWhvbGRlci5yZXBsYWNlKFxuICAgICAgXCInXCIsXG4gICAgICBcIiYjMzk7XCJcbiAgICApfVwiLCBtb2RlbDogbW9kZWwsIGVkaXRvcjogZWRpdG9yJz48L3RpdGxlLWVkaXRvcj5gO1xuICAgIGVsZW1lbnRzWzBdLmFwcGVuZENoaWxkKGRlY29yYXRpb24pO1xuICAgIGtvLmFwcGx5QmluZGluZ3MoeyBtb2RlbDogbW9kZWwsIGVkaXRvcjogZWRpdG9yIH0sIGRlY29yYXRpb24pO1xuICAgIGVkaXRvci5vbkFkb3JuZXJSZW5kZXJlZENhbGxiYWNrKG1vZGVsLCBcImRlc2NyaXB0aW9uXCIsIGRlY29yYXRpb24pO1xuICB9LFxufTtcbnJlZ2lzdGVyQWRvcm5lcihcImRlc2NyaXB0aW9uXCIsIGRlc2NyaXB0aW9uQWRvcm5lcik7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IHJlZ2lzdGVyQWRvcm5lciwgU3VydmV5Rm9yRGVzaWduZXIgfSBmcm9tIFwiLi4vc3VydmV5anNPYmplY3RzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4uL2VkaXRvclwiO1xuaW1wb3J0IHsgU3VydmV5IH0gZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuXG5leHBvcnQgdmFyIHRpdGxlSW1hZ2VBZG9ybmVyID0ge1xuICBpZ25vcmVIaWRkZW5Mb2dvUHJvcGVydHk6IGZhbHNlLFxuICBvblJlZ2lzdGVyOiAoKSA9PiB7XG4gICAgU3VydmV5Rm9yRGVzaWduZXIuaXNUaXRsZUxvZ29FZGl0YWJsZSh0cnVlKTtcbiAgfSxcbiAgb25VbnJlZ2lzdGVyOiAoKSA9PiB7XG4gICAgU3VydmV5Rm9yRGVzaWduZXIuaXNUaXRsZUxvZ29FZGl0YWJsZShmYWxzZSk7XG4gIH0sXG4gIGdldE1hcmtlckNsYXNzOiAobW9kZWwpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIG1vZGVsLmdldFR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJiBtb2RlbC5nZXRUeXBlKCkgPT09IFwic3VydmV5XCJcbiAgICAgID8gXCJpbWFnZV9lZGl0YWJsZVwiXG4gICAgICA6IFwiXCI7XG4gIH0sXG4gIGdldEVsZW1lbnROYW1lOiAobW9kZWwpID0+IFwibG9nb1wiLFxuICBhZnRlclJlbmRlcjogKFxuICAgIGVsZW1lbnRzOiBIVE1MRWxlbWVudFtdLFxuICAgIG1vZGVsOiBTdXJ2ZXlGb3JEZXNpZ25lcixcbiAgICBlZGl0b3I6IFN1cnZleUNyZWF0b3JcbiAgKSA9PiB7XG4gICAgaWYgKGVkaXRvci5yZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgYWxsb3dJbWFnZUNob29zZXIgPVxuICAgICAgdGl0bGVJbWFnZUFkb3JuZXIuaWdub3JlSGlkZGVuTG9nb1Byb3BlcnR5IHx8XG4gICAgICBlZGl0b3IuY2FuU2hvd09iamVjdFByb3BlcnR5KG1vZGVsLCBcImxvZ29cIik7XG4gICAgaWYgKGFsbG93SW1hZ2VDaG9vc2VyKSB7XG4gICAgICB2YXIgaXRlbXNSb290ID0gZWxlbWVudHNbMF07XG4gICAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICBpbnB1dC50eXBlID0gXCJmaWxlXCI7XG4gICAgICBpbnB1dC5hY2NlcHQgPSBcImltYWdlLypcIjtcbiAgICAgIGlucHV0LmNsYXNzTmFtZSA9IFwic3ZkYS1jaG9vc2UtZmlsZVwiO1xuICAgICAgaW5wdXQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICBpbnB1dC5zdHlsZS5vcGFjaXR5ID0gXCIwXCI7XG4gICAgICBpbnB1dC5zdHlsZS53aWR0aCA9IFwiMXB4XCI7XG4gICAgICBpbnB1dC5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuICAgICAgaW5wdXQuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICAgICAgaXRlbXNSb290LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBlbGVtZW50c1tpXS5vbmNsaWNrID0gKGUpID0+IGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdmFyIGRlY29yYXRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgZGVjb3JhdGlvbi5jbGFzc05hbWUgPSBcInN2ZGEtYWRvcm5lci1yb290XCI7XG4gICAgICAgIGRlY29yYXRpb24uaW5uZXJIVE1MID1cbiAgICAgICAgICBcIjxpbWFnZS1lZGl0b3IgcGFyYW1zPSduYW1lOiBcXFwibG9nb1xcXCIsIHRhcmdldDogdGFyZ2V0LCBxdWVzdGlvbjogcXVlc3Rpb24sIGVkaXRvcjogZWRpdG9yLCBpbnB1dDogaW5wdXQsIGFsbG93RGVsZXRlOiB0cnVlJz48L2ltYWdlLWVkaXRvcj5cIjtcbiAgICAgICAgZWxlbWVudHNbaV0uYXBwZW5kQ2hpbGQoZGVjb3JhdGlvbik7XG5cbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBxdWVzdGlvbjogbW9kZWwsXG4gICAgICAgICAgICB0YXJnZXQ6IG1vZGVsLFxuICAgICAgICAgICAgZWRpdG9yOiBlZGl0b3IsXG4gICAgICAgICAgICBpbnB1dDogaW5wdXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWNvcmF0aW9uXG4gICAgICAgICk7XG4gICAgICAgIGVkaXRvci5vbkFkb3JuZXJSZW5kZXJlZENhbGxiYWNrKFxuICAgICAgICAgIDxhbnk+bW9kZWwsXG4gICAgICAgICAgXCJ0aXRsZS1pbWFnZVwiLFxuICAgICAgICAgIGRlY29yYXRpb24sXG4gICAgICAgICAgbW9kZWxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCAhPT0gMikgcmV0dXJuO1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBtb2RlbC5sb2dvUG9zaXRpb247XG4gICAgICAgIGVsZW1lbnRzWzBdLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgZWxlbWVudHNbMV0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICBpZiAoIW1vZGVsLmlzTG9nb0ltYWdlQ2hvb3NlbiB8fCBwb3NpdGlvbiA9PT0gXCJub25lXCIpIHJldHVybjtcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcImxlZnRcIiB8fCBwb3NpdGlvbiA9PT0gXCJ0b3BcIikge1xuICAgICAgICAgIGVsZW1lbnRzWzBdLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnRzWzFdLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudHNbMF0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgZWxlbWVudHNbMV0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIH1cblxuICAgIHZhciBkZWNvcmF0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgZGVjb3JhdGlvbi5jbGFzc05hbWUgPSBcInN2ZGEtdGl0bGUtYWN0aW9uc1wiO1xuICAgIGRlY29yYXRpb24uaW5uZXJIVE1MID1cbiAgICAgIFwiPHRpdGxlLWFjdGlvbnMgcGFyYW1zPSdzdXJ2ZXk6IG1vZGVsLCBpbnB1dDogaW5wdXQsIGFsbG93SW1hZ2VDaG9vc2VyOiBhbGxvd0ltYWdlQ2hvb3Nlcic+PC90aXRsZS1hY3Rpb25zPlwiO1xuICAgIGVsZW1lbnRzWzBdLnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZGVjb3JhdGlvbik7XG4gICAga28uYXBwbHlCaW5kaW5ncyhcbiAgICAgIHsgbW9kZWw6IG1vZGVsLCBpbnB1dDogaW5wdXQsIGFsbG93SW1hZ2VDaG9vc2VyOiBhbGxvd0ltYWdlQ2hvb3NlciB9LFxuICAgICAgZGVjb3JhdGlvblxuICAgICk7XG4gICAgZWRpdG9yLm9uQWRvcm5lclJlbmRlcmVkQ2FsbGJhY2soXG4gICAgICA8YW55Pm1vZGVsLFxuICAgICAgXCJ0aXRsZS1hY3Rpb25zXCIsXG4gICAgICBkZWNvcmF0aW9uLFxuICAgICAgbW9kZWxcbiAgICApO1xuICB9LFxufTtcblxucmVnaXN0ZXJBZG9ybmVyKFwidGl0bGUtaW1hZ2VcIiwgdGl0bGVJbWFnZUFkb3JuZXIpO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmV4cG9ydCBjbGFzcyBDb21tYW5kcyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY3JlYXRvcikge31cblxuICBwcml2YXRlIGNvbW1hbmRzOiB7XG4gICAgW2luZGV4OiBzdHJpbmddOiB7XG4gICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgaG90S2V5PzogeyBjdHJsS2V5OiBib29sZWFuOyBrZXlDb2RlOiBudW1iZXIgfTtcbiAgICAgIHRvb2xiYXI/OiBhbnk7XG4gICAgfTtcbiAgfSA9IHtcbiAgICB1bmRvOiB7XG4gICAgICBuYW1lOiBcInVuZG9cIixcbiAgICAgIGhvdEtleToge1xuICAgICAgICBjdHJsS2V5OiB0cnVlLFxuICAgICAgICBrZXlDb2RlOiA5MCxcbiAgICAgIH0sXG4gICAgICB0b29sYmFyOiB7XG4gICAgICAgIGlkOiBcInN2ZC11bmRvXCIsXG4gICAgICAgIGljb25OYW1lOiBcImljb24tYWN0aW9udW5kb1wiLFxuICAgICAgICB2aXNpYmxlOiB0aGlzLmNyZWF0b3Iua29Jc1Nob3dEZXNpZ25lcixcbiAgICAgICAgZW5hYmxlZDogdGhpcy5jcmVhdG9yLmtvQ2FuVW5kbyxcbiAgICAgICAgdGl0bGU6IHRoaXMuY3JlYXRvci5nZXRMb2NTdHJpbmcoXCJlZC51bmRvXCIpLFxuICAgICAgICB0b29sdGlwOiB0aGlzLmNyZWF0b3IuZ2V0TG9jU3RyaW5nKFwiZWQudW5kb1Rvb2x0aXBcIiksXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVkbzoge1xuICAgICAgbmFtZTogXCJyZWRvXCIsXG4gICAgICBob3RLZXk6IHtcbiAgICAgICAgY3RybEtleTogdHJ1ZSxcbiAgICAgICAga2V5Q29kZTogODksXG4gICAgICB9LFxuICAgICAgdG9vbGJhcjoge1xuICAgICAgICBpZDogXCJzdmQtcmVkb1wiLFxuICAgICAgICBpY29uTmFtZTogXCJpY29uLWFjdGlvbnJlZG9cIixcbiAgICAgICAgdmlzaWJsZTogdGhpcy5jcmVhdG9yLmtvSXNTaG93RGVzaWduZXIsXG4gICAgICAgIGVuYWJsZWQ6IHRoaXMuY3JlYXRvci5rb0NhblJlZG8sXG4gICAgICAgIHRpdGxlOiB0aGlzLmNyZWF0b3IuZ2V0TG9jU3RyaW5nKFwiZWQucmVkb1wiKSxcbiAgICAgICAgdG9vbHRpcDogdGhpcy5jcmVhdG9yLmdldExvY1N0cmluZyhcImVkLnJlZG9Ub29sdGlwXCIpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHN1cnZleVNldHRpbmdzOiB7XG4gICAgICB0b29sYmFyOiB7XG4gICAgICAgIGlkOiBcInN2ZC1zdXJ2ZXktc2V0dGluZ3NcIixcbiAgICAgICAgaWNvbk5hbWU6IFwiaWNvbi1hY3Rpb25zZXR0aW5nc1wiLFxuICAgICAgICB2aXNpYmxlOiB0aGlzLmNyZWF0b3Iua29Jc1Nob3dEZXNpZ25lcixcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jcmVhdG9yLnNlbGVjdGVkRWxlbWVudCA9IHRoaXMuY3JlYXRvci5zdXJ2ZXk7XG4gICAgICAgICAgdGhpcy5jcmVhdG9yLnNob3dRdWVzdGlvbkVkaXRvcih0aGlzLmNyZWF0b3Iuc3VydmV5KTtcbiAgICAgICAgfSxcbiAgICAgICAgdGl0bGU6IHRoaXMuY3JlYXRvci5nZXRMb2NTdHJpbmcoXCJlZC5zZXR0aW5nc1wiKSxcbiAgICAgICAgdG9vbHRpcDogdGhpcy5jcmVhdG9yLmdldExvY1N0cmluZyhcImVkLnNldHRpbmdzVG9vbHRpcFwiKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB0b29sYmFyT3B0aW9uczoge1xuICAgICAgdG9vbGJhcjoge1xuICAgICAgICBpZDogXCJzdmQtb3B0aW9uc1wiLFxuICAgICAgICB2aXNpYmxlOiBrby5jb21wdXRlZChcbiAgICAgICAgICAoKSA9PiB0aGlzLmNyZWF0b3Iua29Jc1Nob3dEZXNpZ25lcigpICYmIHRoaXMuY3JlYXRvci5rb1Nob3dPcHRpb25zKClcbiAgICAgICAgKSxcbiAgICAgICAgdGl0bGU6IHRoaXMuY3JlYXRvci5nZXRMb2NTdHJpbmcoXCJlZC5vcHRpb25zXCIpLFxuICAgICAgICB0ZW1wbGF0ZTogXCJzdmQtdG9vbGJhci1vcHRpb25zXCIsXG4gICAgICAgIGl0ZW1zOiBrby5vYnNlcnZhYmxlQXJyYXkoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcInN2ZC12YWxpZC1qc29uXCIsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgY3NzOiBrby5jb21wdXRlZCgoKSA9PlxuICAgICAgICAgICAgICB0aGlzLmNyZWF0b3Iua29HZW5lcmF0ZVZhbGlkSlNPTigpID8gXCJhY3RpdmVcIiA6IFwiXCJcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBhY3Rpb246IHRoaXMuY3JlYXRvci5nZW5lcmF0ZVZhbGlkSlNPTkNsaWNrLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMuY3JlYXRvci5nZXRMb2NTdHJpbmcoXCJlZC5nZW5lcmF0ZVZhbGlkSlNPTlwiKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcInN2ZC1yZWFkYWJsZS1qc29uXCIsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgY3NzOiBrby5jb21wdXRlZCgoKSA9PlxuICAgICAgICAgICAgICAhdGhpcy5jcmVhdG9yLmtvR2VuZXJhdGVWYWxpZEpTT04oKSA/IFwiYWN0aXZlXCIgOiBcIlwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmNyZWF0b3IuZ2VuZXJhdGVSZWFkYWJsZUpTT05DbGljayxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmNyZWF0b3IuZ2V0TG9jU3RyaW5nKFwiZWQuZ2VuZXJhdGVSZWFkYWJsZUpTT05cIiksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgc3VydmV5VGVzdDoge1xuICAgICAgdG9vbGJhcjoge1xuICAgICAgICBpZDogXCJzdmQtdGVzdFwiLFxuICAgICAgICB2aXNpYmxlOiBrby5jb21wdXRlZCgoKSA9PiB0aGlzLmNyZWF0b3Iua29WaWV3VHlwZSgpID09PSBcInRlc3RcIiksXG4gICAgICAgIHRpdGxlOiBrby5jb21wdXRlZChcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgdGhpcy5jcmVhdG9yLmdldExvY1N0cmluZyhcImVkLnRlc3RTdXJ2ZXlXaWR0aFwiKSArXG4gICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICB0aGlzLmNyZWF0b3Iua29UZXN0U3VydmV5V2lkdGgoKVxuICAgICAgICApLFxuICAgICAgICB0ZW1wbGF0ZTogXCJzdmQtdG9vbGJhci1vcHRpb25zXCIsXG4gICAgICAgIGl0ZW1zOiBrby5vYnNlcnZhYmxlQXJyYXkoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcInN2ZC0xMDAtanNvblwiLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5jcmVhdG9yLmtvVGVzdFN1cnZleVdpZHRoKFwiMTAwJVwiKSxcbiAgICAgICAgICAgIHRpdGxlOiBcIjEwMCVcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcInN2ZC0xMjAwcHgtanNvblwiLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5jcmVhdG9yLmtvVGVzdFN1cnZleVdpZHRoKFwiMTIwMHB4XCIpLFxuICAgICAgICAgICAgdGl0bGU6IFwiMTIwMHB4XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogXCJzdmQtMTAwMHB4LWpzb25cIixcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMuY3JlYXRvci5rb1Rlc3RTdXJ2ZXlXaWR0aChcIjEwMDBweFwiKSxcbiAgICAgICAgICAgIHRpdGxlOiBcIjEwMDBweFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFwic3ZkLTgwMHB4LWpzb25cIixcbiAgICAgICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMuY3JlYXRvci5rb1Rlc3RTdXJ2ZXlXaWR0aChcIjgwMHB4XCIpLFxuICAgICAgICAgICAgdGl0bGU6IFwiODAwcHhcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBcInN2ZC02MDBweC1qc29uXCIsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmNyZWF0b3Iua29UZXN0U3VydmV5V2lkdGgoXCI2MDBweFwiKSxcbiAgICAgICAgICAgIHRpdGxlOiBcIjYwMHB4XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogXCJzdmQtNDAwcHgtanNvblwiLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5jcmVhdG9yLmtvVGVzdFN1cnZleVdpZHRoKFwiNDAwcHhcIiksXG4gICAgICAgICAgICB0aXRsZTogXCI0MDBweFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNhdmU6IHtcbiAgICAgIHRvb2xiYXI6IHtcbiAgICAgICAgaWQ6IFwic3ZkLXNhdmVcIixcbiAgICAgICAgdmlzaWJsZTogdGhpcy5jcmVhdG9yLmtvU2hvd1NhdmVCdXR0b24sXG4gICAgICAgIGFjdGlvbjogdGhpcy5jcmVhdG9yLnNhdmVCdXR0b25DbGljayxcbiAgICAgICAgaW5uZXJDc3M6IFwic3ZkX3NhdmVfYnRuXCIsXG4gICAgICAgIHRpdGxlOiB0aGlzLmNyZWF0b3IuZ2V0TG9jU3RyaW5nKFwiZWQuc2F2ZVN1cnZleVwiKSxcbiAgICAgICAgdG9vbHRpcDogdGhpcy5jcmVhdG9yLmdldExvY1N0cmluZyhcImVkLnNhdmVTdXJ2ZXlUb29sdGlwXCIpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHN0YXRlOiA8YW55PntcbiAgICAgIHRvb2xiYXI6IHtcbiAgICAgICAgaWQ6IFwic3ZkLXN0YXRlXCIsXG4gICAgICAgIHZpc2libGU6IHRoaXMuY3JlYXRvci5rb1Nob3dTdGF0ZSxcbiAgICAgICAgY3NzOiBcInN2ZF9zdGF0ZVwiLFxuICAgICAgICBpbm5lckNzczoga28uY29tcHV0ZWQoKCkgPT4gXCJpY29uLVwiICsgdGhpcy5jcmVhdG9yLmtvU3RhdGUoKSksXG4gICAgICAgIHRpdGxlOiBrby5jb21wdXRlZCgoKSA9PlxuICAgICAgICAgIHRoaXMuY3JlYXRvci5nZXRMb2NTdHJpbmcoXCJlZC5cIiArIHRoaXMuY3JlYXRvci5rb1N0YXRlKCkpXG4gICAgICAgICksXG4gICAgICAgIHRlbXBsYXRlOiBcInN2ZC10b29sYmFyLXN0YXRlXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgcHVibGljIGdldENvbW1hbmRzKCkge1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmRzO1xuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZC1wcm9wZXJ0eS1lZGl0b3ItZXJyb3IgcGFyYW1zPVxcXCJtb2RlbDptb2RlbFxcXCI+PC9zdmQtcHJvcGVydHktZWRpdG9yLWVycm9yPlxcbjxkaXYgY2xhc3M9XFxcImZvcm0tY29udHJvbCBzdmRfY3VzdG9tX3NlbGVjdFxcXCI+XFxuICA8c2VsZWN0XFxuICAgIG9ubW91c2V3aGVlbD1cXFwicmV0dXJuIGZhbHNlO1xcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJpZjogdHJ1ZSwgdmFsdWU6IGtvVmFsdWUsIG9wdGlvbnNDYXB0aW9uOiBvcHRpb25zQ2FwdGlvbiwgdmFsdWVBbGxvd1Vuc2V0OiB0cnVlLCBoYXNGb2N1czoga29IYXNGb2N1cywgYXR0cjogeyAnYXJpYS1sYWJlbCc6IG9wdGlvbnNDYXB0aW9uIH1cXFwiXFxuICA+XFxuICAgIDxvcHRpb24gdmFsdWU9XFxcIlxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBvcHRpb25zQ2FwdGlvblxcXCI+PC9vcHRpb24+XFxuICAgIDwhLS0ga28gZm9yZWFjaDoga29FbGVtZW50cyAtLT5cXG4gICAgPG9wdGlvblxcbiAgICAgIGRhdGEtYmluZD1cXFwiYXR0cjogeyBkaXNhYmxlZDoga29EaXNhYmxlZCwgdmFsdWU6IG5hbWUgfSwgdGV4dDp0ZXh0XFxcIlxcbiAgICA+PC9vcHRpb24+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9zZWxlY3Q+XFxuPC9kaXY+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vZWxlbWVudC1zZWxlY3Rvci5zY3NzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50U2VsZWN0b3IgfSBmcm9tICcuLi9wcm9wZXJ0eUVkaXRvcnMvc3VydmV5RWxlbWVudFNlbGVjdG9yJztcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL2VsZW1lbnQtc2VsZWN0b3IuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRTZWxlY3RvclZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtb2RlbDogU3VydmV5RWxlbWVudFNlbGVjdG9yLFxuICAgIHB1YmxpYyBrb1ZhbHVlOiBhbnksXG4gICAgcHVibGljIG9wdGlvbnNDYXB0aW9uOiBzdHJpbmcsXG4gICAgcHVibGljIGtvSGFzRm9jdXM6IGFueSxcbiAgICBwdWJsaWMga29FbGVtZW50czogYW55XG4gICkge31cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1lbGVtZW50LXNlbGVjdG9yXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogU3VydmV5RWxlbWVudFNlbGVjdG9yID0gcGFyYW1zLm1vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBFbGVtZW50U2VsZWN0b3JWaWV3TW9kZWwoXG4gICAgICAgIG1vZGVsLFxuICAgICAgICBtb2RlbC5rb1ZhbHVlLFxuICAgICAgICBtb2RlbC5vcHRpb25zQ2FwdGlvbixcbiAgICAgICAgbW9kZWwua29IYXNGb2N1cyxcbiAgICAgICAgbW9kZWwua29FbGVtZW50c1xuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleUhlbHBlciwgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VudHJpZXNcIjtcbmltcG9ydCBcIi4vcGFnZXMtZWRpdG9yLnNjc3NcIjtcbmltcG9ydCB7IFBhZ2VzRWRpdG9yIH0gZnJvbSBcIi4uL3BhZ2VzLWVkaXRvclwiO1xuaW1wb3J0IHsgU3R5bGVzTWFuYWdlciB9IGZyb20gXCIuLi9zdHlsZXNtYW5hZ2VyXCI7XG5cbnZhciB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vcGFnZXMtZWRpdG9yLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBQYWdlc0VkaXRvclZpZXdNb2RlbCB7XG4gIHByaXZhdGUgcGFnZVNlbGVjdGlvbkNoYW5nZWQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXBkYXRlU2Nyb2xsZXIgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNOZWVkQXV0b1Njcm9sbCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG1vZGVsOiBQYWdlc0VkaXRvciwgcHJpdmF0ZSBlbGVtZW50OiBhbnkpIHtcbiAgICBpZiAoISF0aGlzLmVsZW1lbnQgJiYgdHlwZW9mIHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMudXBkYXRlU2Nyb2xsZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHZhciBwYWdlc0VsZW1lbnQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgXCIuc3ZkLXBhZ2VzXCJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhcGFnZXNFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5oYXNTY3JvbGxlcihwYWdlc0VsZW1lbnQuc2Nyb2xsV2lkdGggPiBwYWdlc0VsZW1lbnQub2Zmc2V0V2lkdGgpO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuXG4gICAgICB0aGlzLnBhZ2VTZWxlY3Rpb25DaGFuZ2VkID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAobW9kZWwuc2VsZWN0ZWRQYWdlKCkgJiYgdGhpcy5pc05lZWRBdXRvU2Nyb2xsKSB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkUGFnZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNOZWVkQXV0b1Njcm9sbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG1vdmVMZWZ0KG1vZGVsLCBldmVudCkge1xuICAgIHZhciBwYWdlc0VsZW1lbnQgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zdmQtcGFnZXNcIik7XG4gICAgcGFnZXNFbGVtZW50LnNjcm9sbExlZnQgLT0gNTA7XG4gICAgdGhpcy51cGRhdGVNZW51UG9zaXRpb24oKTtcbiAgfVxuICBtb3ZlUmlnaHQobW9kZWwsIGV2ZW50KSB7XG4gICAgdmFyIHBhZ2VzRWxlbWVudCA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnN2ZC1wYWdlc1wiKTtcbiAgICBwYWdlc0VsZW1lbnQuc2Nyb2xsTGVmdCArPSA1MDtcbiAgICB0aGlzLnVwZGF0ZU1lbnVQb3NpdGlvbigpO1xuICB9XG4gIHNjcm9sbFRvU2VsZWN0ZWRQYWdlID0gKCkgPT4ge1xuICAgIHZhciBwYWdlc0VsZW1lbnQ6IGFueSA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnN2ZC1wYWdlc1wiKTtcbiAgICBpZiAoIXBhZ2VzRWxlbWVudCkgcmV0dXJuO1xuICAgIHZhciBpbmRleCA9IHRoaXMubW9kZWwucGFnZXMuaW5kZXhPZih0aGlzLm1vZGVsLnNlbGVjdGVkUGFnZSgpKTtcbiAgICB2YXIgcGFnZUVsZW1lbnQgPSBwYWdlc0VsZW1lbnQuY2hpbGRyZW5baW5kZXhdO1xuICAgIGlmICghcGFnZUVsZW1lbnQpIHJldHVybjtcbiAgICBwYWdlc0VsZW1lbnQuc2Nyb2xsTGVmdCA9XG4gICAgICBwYWdlRWxlbWVudC5vZmZzZXRMZWZ0IC1cbiAgICAgIHBhZ2VzRWxlbWVudC5vZmZzZXRMZWZ0IC1cbiAgICAgIHBhZ2VzRWxlbWVudC5vZmZzZXRXaWR0aCAvIDI7XG4gICAgdGhpcy51cGRhdGVNZW51UG9zaXRpb24oKTtcbiAgfTtcblxuICBvbldoZWVsKG1vZGVsLCBldmVudCkge1xuICAgIHZhciBwYWdlc0VsZW1lbnQgPSBtb2RlbC5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc3ZkLXBhZ2VzXCIpO1xuICAgIGV2ZW50ID0gZXZlbnQgfHwgd2luZG93LmV2ZW50O1xuICAgIGlmICghIWV2ZW50Lm9yaWdpbmFsRXZlbnQpIHtcbiAgICAgIGV2ZW50ID0gZXZlbnQub3JpZ2luYWxFdmVudDtcbiAgICB9XG4gICAgdmFyIGRlbHRhID0gZXZlbnQuZGVsdGFZIHx8IGV2ZW50LmRldGFpbCB8fCBldmVudC53aGVlbERlbHRhO1xuICAgIHBhZ2VzRWxlbWVudC5zY3JvbGxMZWZ0IC09IGRlbHRhO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0ID8gZXZlbnQucHJldmVudERlZmF1bHQoKSA6IChldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlKTtcbiAgICB0aGlzLnVwZGF0ZU1lbnVQb3NpdGlvbigpO1xuICB9XG5cbiAgdXBkYXRlTWVudVBvc2l0aW9uKCkge1xuICAgIHZhciBwYWdlc0VsZW1lbnQgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zdmQtcGFnZXNcIik7XG4gICAgdmFyIG1lbnVFbGVtZW50cyA9IHBhZ2VzRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwic3ZkLXBhZ2UtYWN0aW9uc1wiKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lbnVFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgbWVudUVsZW1lbnRzW2ldLnN0eWxlLmxlZnQgPVxuICAgICAgICBtZW51RWxlbWVudHNbaV0ucGFyZW50RWxlbWVudC5vZmZzZXRMZWZ0IC1cbiAgICAgICAgcGFnZXNFbGVtZW50LnNjcm9sbExlZnQgK1xuICAgICAgICBcInB4XCI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldExvY1N0cmluZyhzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKHN0cik7XG4gIH1cblxuICBnZXRQYWdlQ2xhc3MgPSAocGFnZSkgPT4ge1xuICAgIHZhciByZXN1bHQgPVxuICAgICAgcGFnZSA9PT0gdGhpcy5tb2RlbC5zZWxlY3RlZFBhZ2UoKVxuICAgICAgICA/IFwic3ZkX3NlbGVjdGVkX3BhZ2Ugc3ZkLWxpZ2h0LWJnLWNvbG9yXCJcbiAgICAgICAgOiBcIlwiO1xuXG4gICAgaWYgKHRoaXMubW9kZWwucGFnZXMuaW5kZXhPZihwYWdlKSAhPT0gdGhpcy5tb2RlbC5wYWdlcy5sZW5ndGggLSAxKSB7XG4gICAgICByZXN1bHQgKz0gXCIgc3ZkLWJvcmRlci1yaWdodC1ub25lXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBnZXRQYWdlTWVudUljb25DbGFzcyA9IChwYWdlKSA9PiB7XG4gICAgdmFyIGJhc2VJY29uTmFtZSA9XG4gICAgICBTdHlsZXNNYW5hZ2VyLmN1cnJlbnRUaGVtZSgpID09PSBcIm1vZGVyblwiID8gXCJkb3RzXCIgOiBcImdlYXJcIjtcbiAgICByZXR1cm4gcGFnZSA9PT0gdGhpcy5tb2RlbC5zZWxlY3RlZFBhZ2UoKSAmJiB0aGlzLm1vZGVsLmlzQWN0aXZlKClcbiAgICAgID8gXCJpY29uLVwiICsgYmFzZUljb25OYW1lICsgXCJhY3RpdmVcIlxuICAgICAgOiBcImljb24tXCIgKyBiYXNlSWNvbk5hbWU7XG4gIH07XG5cbiAgb25QYWdlQ2xpY2sgPSAocGFnZU1vZGVsLCBldmVudCkgPT4ge1xuICAgIHRoaXMuaXNOZWVkQXV0b1Njcm9sbCA9IGZhbHNlO1xuICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRQYWdlKHBhZ2VNb2RlbCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVNZW51UG9zaXRpb24oKTtcbiAgfTtcblxuICBwdWJsaWMgbW92aW5nUGFnZSA9IG51bGw7XG4gIHByaXZhdGUgbW92ZWRGcm9tOiBudW1iZXIgPSAtMTtcbiAgZ2V0IHNvcnRhYmxlT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFuZGxlOiBcIi5zdmQtcGFnZS1uYW1lXCIsXG4gICAgICBhbmltYXRpb246IDE1MCxcbiAgICAgIG9uU3RhcnQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5tb3ZpbmdQYWdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3ZlZEZyb20gPSAtMTtcbiAgICAgICAgdGhpcy5tb2RlbC5jcmVhdG9yLnVuZG9SZWRvTWFuYWdlci5zdGFydFRyYW5zYWN0aW9uKFxuICAgICAgICAgIFwicGFnZXMgZHJhZyBkcm9wIHRyYW5zYWN0aW9uXCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tb2RlbC5ibG9ja1BhZ2VzUmVidWlsdCh0cnVlKTtcbiAgICAgIH0sXG4gICAgICBvbkVuZDogKGV2dCkgPT4ge1xuICAgICAgICB0aGlzLmlzTmVlZEF1dG9TY3JvbGwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb2RlbC5ibG9ja1BhZ2VzUmVidWlsdChmYWxzZSk7XG4gICAgICAgIHRoaXMubW9kZWwuY3JlYXRvci51bmRvUmVkb01hbmFnZXIuc3RvcFRyYW5zYWN0aW9uKCk7XG4gICAgICAgIGlmICghIXRoaXMubW92aW5nUGFnZSkge1xuICAgICAgICAgIHRoaXMubW9kZWwubW92ZVBhZ2UodGhpcy5tb3ZpbmdQYWdlLCB0aGlzLm1vdmVkRnJvbSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZTogKGV2dCwgaXRlbVYpID0+IHtcbiAgICAgICAgdGhpcy5tb3ZpbmdQYWdlID0gaXRlbVY7XG4gICAgICAgIGlmICh0aGlzLm1vdmVkRnJvbSA8IDApIHtcbiAgICAgICAgICB0aGlzLm1vdmVkRnJvbSA9IHRoaXMubW9kZWwucGFnZXMuaW5kZXhPZih0aGlzLm1vdmluZ1BhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBTdXJ2ZXlIZWxwZXIubW92ZUl0ZW1JbkFycmF5KHRoaXMubW9kZWwucGFnZXMsIGl0ZW1WLCBldnQubmV3SW5kZXgpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFJlbW92ZSBzb3J0YWJsZXMgXCJ1bmJvdW5kXCIgZWxlbWVudFxuICAgICAgICAgIGV2dC5pdGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZXZ0Lml0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGhhc1Njcm9sbGVyID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG5cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5wYWdlU2VsZWN0aW9uQ2hhbmdlZC5kaXNwb3NlKCk7XG4gICAgaWYgKCEhdGhpcy51cGRhdGVTY3JvbGxlcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVNjcm9sbGVyKTtcbiAgICAgIHRoaXMudXBkYXRlU2Nyb2xsZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtcGFnZXMtZWRpdG9yXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogUGFnZXNFZGl0b3IgPVxuICAgICAgICBwYXJhbXMuZWRpdG9yLnBhZ2VzRWRpdG9yTW9kZWwgfHwgcGFyYW1zLml0ZW0uZGF0YTtcblxuICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhjb21wb25lbnRJbmZvLmVsZW1lbnQsICgpID0+IHtcbiAgICAgICAgbW9kZWwuZGlzcG9zZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgUGFnZXNFZGl0b3JWaWV3TW9kZWwobW9kZWwsIGNvbXBvbmVudEluZm8uZWxlbWVudCk7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHRyIGRhdGEtYmluZD1cXFwiY2xpY2s6IGZ1bmN0aW9uKCkgeyBpc05vZGUgJiYgY29sbGFwc2VkKCFjb2xsYXBzZWQoKSk7IH1cXFwiPlxcbiAgICA8dGQgY2xhc3M9XFxcInN2ZC1kYXJrLWJvcmRlci1jb2xvclxcXCI+XFxuICAgICAgICA8IS0tIGtvIGlmOiBpc05vZGUgLS0+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwic3VydmV5LXJlc3VsdC1tYXJrZXJcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiB7ICdzdXJ2ZXktcmVzdWx0LW1hcmtlci0tZXhwYW5kZWQnOiAhY29sbGFwc2VkKCkgfVxcXCI+4pa2PC9zcGFuPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IHRpdGxlXFxcIj48L3NwYW4+PC90ZD5cXG4gICAgPHRkIGNsYXNzPVxcXCJzdmQtZGFyay1ib3JkZXItY29sb3JcXFwiIGRhdGEtYmluZD1cXFwidGV4dDogbmFtZVxcXCI+PC90ZD5cXG4gICAgPHRkIGNsYXNzPVxcXCJzdmQtZGFyay1ib3JkZXItY29sb3JcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3VydmV5LXJlc3VsdC12YWx1ZVxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBnZXRTdHJpbmcodmFsdWUpXFxcIj48L2Rpdj5cXG4gICAgPC90ZD5cXG4gICAgPHRkIGNsYXNzPVxcXCJzdmQtZGFyay1ib3JkZXItY29sb3JcXFwiIGRhdGEtYmluZD1cXFwidGV4dDogZ2V0U3RyaW5nKGRpc3BsYXlWYWx1ZSlcXFwiPjwvdGQ+XFxuPC90cj5cXG48IS0tIGtvIGlmOiBpc05vZGUgJiYgIWNvbGxhcHNlZCgpIC0tPlxcbjwhLS0ga28gZm9yZWFjaDogZGF0YSAtLT5cXG48IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAnc3VydmV5LXJlc3VsdHMtdGFibGUtcm93JywgcGFyYW1zOiB7IG1vZGVsOiAkZGF0YSB9IH0gLS0+XFxuPCEtLSAva28gLS0+XFxuPCEtLSAva28gLS0+XFxuPCEtLSAva28gLS0+XCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcInN2ZF90ZXN0X3Jlc3VsdHNcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzdmRfcmVzdWx0c19oZWFkZXJcXFwiPlxcbiAgICAgICAgPGgyIGRhdGEtYmluZD1cXFwidGV4dDogc3VydmV5UmVzdWx0c1RleHRcXFwiPjwvaDI+XFxuICAgIDwvZGl2PlxcbiAgICA8dWwgY2xhc3M9XFxcIm5hdmJhci1kZWZhdWx0IGNvbnRhaW5lci1mbHVpZCBuYXYgbmF2LXRhYnMgZWRpdG9yLXRhYnNcXFwiPlxcbiAgICAgICAgPGxpIGNsYXNzPVxcXCJuYXYtaXRlbSBhY3RpdmVcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiB7YWN0aXZlOiBrb1Jlc3VsdFZpZXdUeXBlKCkgPT09ICd0YWJsZSd9XFxcIj5cXG4gICAgICAgICAgICA8YSBjbGFzcz1cXFwibmF2LWxpbmtcXFwiIGhyZWY9XFxcIiNcXFwiXFxuICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6IHNlbGVjdFRhYmxlQ2xpY2ssIHRleHQ6ICRkYXRhLmdldExvY1N0cmluZygnZWQuc3VydmV5UmVzdWx0c1RhYmxlJylcXFwiPjwvYT5cXG4gICAgICAgIDwvbGk+XFxuICAgICAgICA8bGkgY2xhc3M9XFxcIm5hdi1pdGVtXFxcIiBkYXRhLWJpbmQ9XFxcImNzczoge2FjdGl2ZToga29SZXN1bHRWaWV3VHlwZSgpID09PSAndGV4dCd9XFxcIj5cXG4gICAgICAgICAgICA8YSBjbGFzcz1cXFwibmF2LWxpbmtcXFwiIGhyZWY9XFxcIiNcXFwiXFxuICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6IHNlbGVjdEpzb25DbGljaywgdGV4dDogJGRhdGEuZ2V0TG9jU3RyaW5nKCdlZC5zdXJ2ZXlSZXN1bHRzSnNvbicpXFxcIj48L2E+XFxuICAgICAgICA8L2xpPlxcbiAgICA8L3VsPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzdmRfcmVzdWx0c190ZXh0IHN2ZC1saWdodC1iZy1jb2xvclxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBrb1Jlc3VsdFZpZXdUeXBlKCkgPT09ICd0ZXh0J1xcXCI+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGV4dDoga29SZXN1bHRUZXh0XFxcIj48L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2ZF9yZXN1bHRzX3RhYmxlIHN2ZC1saWdodC1iZy1jb2xvclxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBrb1Jlc3VsdFZpZXdUeXBlKCkgPT09ICd0YWJsZSdcXFwiPlxcbiAgICAgICAgPHRhYmxlPlxcbiAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVxcXCJzdmQtbGlnaHQtYmFja2dyb3VuZC1jb2xvclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XFxcInN2ZC1kYXJrLWJvcmRlci1jb2xvclxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiByZXN1bHRzVGl0bGVcXFwiPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XFxcInN2ZC1kYXJrLWJvcmRlci1jb2xvclxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiByZXN1bHRzTmFtZVxcXCI+PC90aD5cXG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cXFwic3ZkLWRhcmstYm9yZGVyLWNvbG9yXFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6IHJlc3VsdHNWYWx1ZVxcXCI+PC90aD5cXG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cXFwic3ZkLWRhcmstYm9yZGVyLWNvbG9yXFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6IHJlc3VsdHNEaXNwbGF5VmFsdWVcXFwiPjwvdGg+XFxuICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgPC90aGVhZD5cXG4gICAgICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDoga29SZXN1bHREYXRhIC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAnc3VydmV5LXJlc3VsdHMtdGFibGUtcm93JywgcGFyYW1zOiB7IG1vZGVsOiAkZGF0YSB9IH0gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3Rib2R5PlxcbiAgICAgICAgPC90YWJsZT5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuXG5pbXBvcnQgXCIuL3Jlc3VsdHMuc2Nzc1wiO1xuXG52YXIgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vcmVzdWx0cy5odG1sXCIpO1xudmFyIHJvd1RlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL3Jlc3VsdHMtdGFibGUtcm93Lmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlSZXN1bHRzTW9kZWwge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3VydmV5OiBTdXJ2ZXkuU3VydmV5TW9kZWwpIHtcbiAgICB0aGlzLmtvUmVzdWx0VGV4dChKU09OLnN0cmluZ2lmeShzdXJ2ZXkuZGF0YSwgbnVsbCwgNCkpO1xuICAgIHZhciBhZGRDb2xsYXBzZWQgPSAoaXRlbXM6IGFueVtdKSA9PiB7XG4gICAgICBpdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCEhaXRlbSAmJiBpdGVtLmlzTm9kZSkge1xuICAgICAgICAgIGl0ZW0uY29sbGFwc2VkID0ga28ub2JzZXJ2YWJsZSh0cnVlKTtcbiAgICAgICAgICBpdGVtLmRhdGEgPSBhZGRDb2xsYXBzZWQoaXRlbS5kYXRhIHx8IFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0pO1xuICAgIH07XG4gICAgdmFyIHBsYWluRGF0YSA9IHN1cnZleS5nZXRQbGFpbkRhdGEoeyBpbmNsdWRlRW1wdHk6IGZhbHNlIH0pO1xuICAgIHBsYWluRGF0YSA9IGFkZENvbGxhcHNlZChwbGFpbkRhdGEpO1xuICAgIHRoaXMua29SZXN1bHREYXRhKHBsYWluRGF0YSk7XG4gIH1cblxuICBrb1Jlc3VsdFZpZXdUeXBlID0ga28ub2JzZXJ2YWJsZShcInRhYmxlXCIpO1xuICBrb1Jlc3VsdFRleHQgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICBrb1Jlc3VsdERhdGEgPSBrby5vYnNlcnZhYmxlQXJyYXkoKTtcblxuICBwdWJsaWMgZ2V0TG9jU3RyaW5nKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgc3VydmV5UmVzdWx0c1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwiZWQuc3VydmV5UmVzdWx0c1wiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlc3VsdHNUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJlZC5yZXN1bHRzVGl0bGVcIik7XG4gIH1cbiAgcHVibGljIGdldCByZXN1bHRzTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJlZC5yZXN1bHRzTmFtZVwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlc3VsdHNWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJlZC5yZXN1bHRzVmFsdWVcIik7XG4gIH1cbiAgcHVibGljIGdldCByZXN1bHRzRGlzcGxheVZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcImVkLnJlc3VsdHNEaXNwbGF5VmFsdWVcIik7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0VGFibGVDbGljayhtb2RlbDogU3VydmV5UmVzdWx0c01vZGVsKSB7XG4gICAgbW9kZWwua29SZXN1bHRWaWV3VHlwZShcInRhYmxlXCIpO1xuICB9XG4gIHB1YmxpYyBzZWxlY3RKc29uQ2xpY2sobW9kZWw6IFN1cnZleVJlc3VsdHNNb2RlbCkge1xuICAgIG1vZGVsLmtvUmVzdWx0Vmlld1R5cGUoXCJ0ZXh0XCIpO1xuICB9XG5cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN1cnZleS1yZXN1bHRzXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFN1cnZleVJlc3VsdHNNb2RlbChwYXJhbXMuc3VydmV5KTtcbiAgICB9XG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN1cnZleS1yZXN1bHRzLXRhYmxlLXJvd1wiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgdmFyIG1vZGVsID0gcGFyYW1zLm1vZGVsO1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH1cbiAgfSxcbiAgdGVtcGxhdGU6IHJvd1RlbXBsYXRlSHRtbCxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcInN2ZC1zaW11bGF0b3ItbWFpblxcXCI+XFxuICAgIDwhLS0ga28gaWY6IGtvSGFzRnJhbWUgLS0+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2ZC1zaW11bGF0b3Itd3JhcHBlclxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwic3R5bGU6IHsgd2lkdGg6IGtvU2ltdWxhdG9yRnJhbWUoKS5mcmFtZVdpZHRoICsgJ3B4JywgaGVpZ2h0OiBrb1NpbXVsYXRvckZyYW1lKCkuZnJhbWVIZWlnaHQgKyAncHgnIH1cXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXNpbXVsYXRvci1mcmFtZVxcXCJcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7IHdpZHRoOiAobGFuZHNjYXBlT3JpZW50YXRpb24gPyBrb1NpbXVsYXRvckZyYW1lKCkuZnJhbWVIZWlnaHQ6IGtvU2ltdWxhdG9yRnJhbWUoKS5mcmFtZVdpZHRoKSArICdweCcsIGhlaWdodDogKGxhbmRzY2FwZU9yaWVudGF0aW9uID8ga29TaW11bGF0b3JGcmFtZSgpLmZyYW1lV2lkdGggOiBrb1NpbXVsYXRvckZyYW1lKCkuZnJhbWVIZWlnaHQpICsgJ3B4JyB9LCBjc3M6IGtvU2ltdWxhdG9yRnJhbWUoKS5jc3NDbGFzc1xcXCI+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC1zaW11bGF0b3JcXFwiXFxuICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJzdHlsZTogeyB3aWR0aDoga29TaW11bGF0b3JGcmFtZSgpLndpZHRoIC8ga29TaW11bGF0b3JGcmFtZSgpLnNjYWxlICsgJ3B4JywgaGVpZ2h0OiBrb1NpbXVsYXRvckZyYW1lKCkuaGVpZ2h0IC8ga29TaW11bGF0b3JGcmFtZSgpLnNjYWxlICsgJ3B4JywgdHJhbnNmb3JtOiAnc2NhbGUoJyArIGtvU2ltdWxhdG9yRnJhbWUoKS5zY2FsZSArICcpIHRyYW5zbGF0ZSgtNTAlLCAtNTAlKScgfVxcXCI+XFxuICAgICAgICAgICAgPHN1cnZleS13aWRnZXQgY2xhc3M9XFxcInN2ZC1zaW11bGF0b3ItY29udGVudFxcXCIgcGFyYW1zPVxcXCJzdXJ2ZXk6IHN1cnZleVxcXCI+PC9zdXJ2ZXktd2lkZ2V0PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSBrbyBpZm5vdDoga29IYXNGcmFtZSAtLT5cXG4gICAgPHN1cnZleS13aWRnZXQgY2xhc3M9XFxcInN2ZC1zaW11bGF0b3ItY29udGVudFxcXCIgcGFyYW1zPVxcXCJzdXJ2ZXk6IHN1cnZleVxcXCI+PC9zdXJ2ZXktd2lkZ2V0PlxcbiAgICA8IS0tIC9rbyAtLT5cXG48L2Rpdj5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IGdldExvY1N0cmluZyB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcblxuaW1wb3J0IFwiLi9zaW11bGF0b3Iuc2Nzc1wiO1xuXG52YXIgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vc2ltdWxhdG9yLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlTaW11bGF0b3JDb21wb25lbnQge1xuICBwcml2YXRlIHNpbXVsYXRvcjtcblxuICBwdWJsaWMgc2ltdWxhdG9yT3B0aW9ucyA9IHtcbiAgICBkZXZpY2U6IFwiZGVza3RvcFwiLFxuICAgIG9yaWVudGF0aW9uOiBcImxcIixcbiAgICAvLyBzY2FsZTogMSxcbiAgICBjb25zaWRlckRQSTogdHJ1ZVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3Rvb2xiYXJIb2xkZXI6IGFueSwgcHJpdmF0ZSBfb3B0aW9ucyA9IHtcbiAgICBsYW5kc2NhcGU6IGtvLm9ic2VydmFibGUodHJ1ZSksXG4gICAgZGV2aWNlOiBrby5vYnNlcnZhYmxlKFwiZGVza3RvcFwiKSxcbiAgICBzdXJ2ZXk6IDxrby5PYnNlcnZhYmxlPnVuZGVmaW5lZFxuICB9KSB7XG4gICAgdGhpcy5fb3B0aW9ucy5kZXZpY2Uuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xuICAgICAgaWYgKCEhdGhpcy5zaW11bGF0b3IpIHtcbiAgICAgICAgdGhpcy5zaW11bGF0b3JPcHRpb25zLmRldmljZSA9IG5ld1ZhbHVlIHx8IFwiZGVza3RvcFwiO1xuICAgICAgICB0aGlzLnNpbXVsYXRvci5vcHRpb25zKHRoaXMuc2ltdWxhdG9yT3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fb3B0aW9ucy5sYW5kc2NhcGUuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xuICAgICAgaWYgKCEhdGhpcy5zaW11bGF0b3IpIHtcbiAgICAgICAgdGhpcy5zaW11bGF0b3JPcHRpb25zLm9yaWVudGF0aW9uID0gbmV3VmFsdWUgPyBcImxcIiA6IFwicFwiO1xuICAgICAgICB0aGlzLnNpbXVsYXRvci5vcHRpb25zKHRoaXMuc2ltdWxhdG9yT3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmtvSGFzRnJhbWUgPSBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICB2YXIgZGV2aWNlID0gc2ltdWxhdG9yRGV2aWNlc1t0aGlzLmFjdGl2ZURldmljZV07XG4gICAgICByZXR1cm4gdGhpcy5zaW11bGF0b3JFbmFibGVkICYmIGRldmljZS5kZXZpY2VUeXBlICE9PSBcImRlc2t0b3BcIjtcbiAgICB9KTtcbiAgXG4gICAgdGhpcy5rb1NpbXVsYXRvckZyYW1lID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmtvSGFzRnJhbWUpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBkZXZpY2UgPSBzaW11bGF0b3JEZXZpY2VzW3RoaXMuYWN0aXZlRGV2aWNlXTtcbiAgICAgIHZhciBzY2FsZSA9IERFRkFVTFRfTU9OSVRPUl9EUEkgLyAoZGV2aWNlLnBwaSAvIGRldmljZS5jc3NQaXhlbFJhdGlvKTtcbiAgICAgIHZhciB3aWR0aCA9XG4gICAgICAgICgodGhpcy5sYW5kc2NhcGVPcmllbnRhdGlvbiA/IGRldmljZS5oZWlnaHQgOiBkZXZpY2Uud2lkdGgpIC9cbiAgICAgICAgICBkZXZpY2UuY3NzUGl4ZWxSYXRpbykgKlxuICAgICAgICBzY2FsZTtcbiAgICAgIHZhciBoZWlnaHQgPVxuICAgICAgICAoKHRoaXMubGFuZHNjYXBlT3JpZW50YXRpb24gPyBkZXZpY2Uud2lkdGggOiBkZXZpY2UuaGVpZ2h0KSAvXG4gICAgICAgICAgZGV2aWNlLmNzc1BpeGVsUmF0aW8pICpcbiAgICAgICAgc2NhbGU7XG4gICAgICB2YXIgZnJhbWVXaWR0aCA9XG4gICAgICAgICgodGhpcy5sYW5kc2NhcGVPcmllbnRhdGlvbiA/IGRldmljZS5mcmFtZUhlaWdodCA6IGRldmljZS5mcmFtZVdpZHRoKSAvXG4gICAgICAgICAgZGV2aWNlLmNzc1BpeGVsUmF0aW8pICpcbiAgICAgICAgc2NhbGU7XG4gICAgICB2YXIgZnJhbWVIZWlnaHQgPVxuICAgICAgICAoKHRoaXMubGFuZHNjYXBlT3JpZW50YXRpb24gPyBkZXZpY2UuZnJhbWVXaWR0aCA6IGRldmljZS5mcmFtZUhlaWdodCkgL1xuICAgICAgICAgIGRldmljZS5jc3NQaXhlbFJhdGlvKSAqXG4gICAgICAgIHNjYWxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NhbGU6IHRoaXMuc2ltdWxhdG9yU2NhbGVFbmFibGVkID8gc2NhbGUgKiAyIDogMSxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgZnJhbWVXaWR0aDogZnJhbWVXaWR0aCxcbiAgICAgICAgZnJhbWVIZWlnaHQ6IGZyYW1lSGVpZ2h0LFxuICAgICAgICBjc3NDbGFzczoga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBkZXZpY2UuY3NzQ2xhc3MgKyAodGhpcy5sYW5kc2NhcGVPcmllbnRhdGlvbiA/IFwiIHN2ZC1zaW11bGF0b3ItZnJhbWUtbGFuZHNjYXBlXCIgOiBcIlwiKTtcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSk7XG5cblxuICAgIGlmKCEhX3Rvb2xiYXJIb2xkZXIpIHtcbiAgICAgIHRoaXMuX29wdGlvbnMuc3VydmV5ID0gdGhpcy5fdG9vbGJhckhvbGRlci5rb1N1cnZleTtcbiAgICAgIGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5zaW11bGF0b3JFbmFibGVkID0gX3Rvb2xiYXJIb2xkZXIuc2hvd1NpbXVsYXRvcigpO1xuICAgICAgfSk7XG4gICAgICBfdG9vbGJhckhvbGRlci50b29sYmFySXRlbXMucHVzaCh7XG4gICAgICAgIGlkOiBcInN2ZC10ZXN0LXNpbXVsYXRvclwiLFxuICAgICAgICB0aXRsZTogZ2V0TG9jU3RyaW5nKFwicGUuc2ltdWxhdG9yXCIpLFxuICAgICAgICB2aXNpYmxlOiBrby5jb21wdXRlZCgoKSA9PiB0aGlzLnNpbXVsYXRvckVuYWJsZWQpLFxuICAgICAgICB0b29sdGlwOiBnZXRMb2NTdHJpbmcoXCJwZS5zaW11bGF0b3JcIiksXG4gICAgICAgIGNvbXBvbmVudDogXCJzdmQtZHJvcGRvd25cIixcbiAgICAgICAgYWN0aW9uOiBrby5jb21wdXRlZCh7XG4gICAgICAgICAgcmVhZDogKCkgPT4gdGhpcy5hY3RpdmVEZXZpY2UsXG4gICAgICAgICAgd3JpdGU6ICh2YWw6IGFueSkgPT4gdGhpcy5hY3RpdmVEZXZpY2UgPSB2YWxcbiAgICAgICAgfSksXG4gICAgICAgIGl0ZW1zOiA8YW55PnRoaXMua29EZXZpY2VzXG4gICAgICB9KTtcbiAgICAgIF90b29sYmFySG9sZGVyLnRvb2xiYXJJdGVtcy5wdXNoKHtcbiAgICAgICAgaWQ6IFwic3ZkLXRlc3Qtc2ltdWxhdG9yLW9yaWVudGF0aW9uXCIsXG4gICAgICAgIHRpdGxlOiBnZXRMb2NTdHJpbmcoXCJwZS5sYW5kc2NhcGVPcmllbnRhdGlvblwiKSxcbiAgICAgICAgdmlzaWJsZTogdGhpcy5rb0hhc0ZyYW1lLFxuICAgICAgICB0b29sdGlwOiBnZXRMb2NTdHJpbmcoXCJwZS5sYW5kc2NhcGVPcmllbnRhdGlvblwiKSxcbiAgICAgICAgY29tcG9uZW50OiBcInN2ZC1ib29sZWFuXCIsXG4gICAgICAgIGFjdGlvbjoga28uY29tcHV0ZWQoe1xuICAgICAgICAgIHJlYWQ6ICgpID0+IHRoaXMubGFuZHNjYXBlT3JpZW50YXRpb24sXG4gICAgICAgICAgd3JpdGU6ICh2YWw6IGFueSkgPT4gdGhpcy5sYW5kc2NhcGVPcmllbnRhdGlvbiA9IHZhbFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzdXJ2ZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuc3VydmV5KCk7XG4gIH1cblxuICBwcml2YXRlIF9zaW11bGF0b3JFbmFibGVkID0ga28ub2JzZXJ2YWJsZTxib29sZWFuPih0cnVlKTtcbiAgcHVibGljIGdldCBzaW11bGF0b3JFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zaW11bGF0b3JFbmFibGVkKCk7XG4gIH1cbiAgcHVibGljIHNldCBzaW11bGF0b3JFbmFibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2ltdWxhdG9yRW5hYmxlZCh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBfc2ltdWxhdG9yU2NhbGVFbmFibGVkID0ga28ub2JzZXJ2YWJsZTxib29sZWFuPih0cnVlKTtcbiAgcHVibGljIGdldCBzaW11bGF0b3JTY2FsZUVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpbXVsYXRvclNjYWxlRW5hYmxlZCgpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2ltdWxhdG9yU2NhbGVFbmFibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2ltdWxhdG9yU2NhbGVFbmFibGVkKHZhbHVlKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVEZXZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuZGV2aWNlKCk7XG4gIH1cbiAgc2V0IGFjdGl2ZURldmljZShkZXZpY2U6IHN0cmluZykge1xuICAgIGlmKHRoaXMuc3VydmV5ICYmIHR5cGVvZiB0aGlzLnN1cnZleS5zZXRJc01vYmlsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLnN1cnZleS5zZXRJc01vYmlsZShkZXZpY2UgIT09IFwiZGVza3RvcFwiKTtcbiAgICB9XG4gICAgdGhpcy5fb3B0aW9ucy5kZXZpY2UoZGV2aWNlKTtcbiAgfVxuXG4gIGtvRGV2aWNlcyA9IGtvLm9ic2VydmFibGVBcnJheShcbiAgICBPYmplY3Qua2V5cyhzaW11bGF0b3JEZXZpY2VzKVxuICAgICAgLmZpbHRlcigoa2V5KSA9PiAhIXNpbXVsYXRvckRldmljZXNba2V5XS50aXRsZSlcbiAgICAgIC5tYXAoKGtleSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRleHQ6IHNpbXVsYXRvckRldmljZXNba2V5XS50aXRsZSxcbiAgICAgICAgICB2YWx1ZToga2V5LFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgKTtcblxuICBnZXQgbGFuZHNjYXBlT3JpZW50YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMubGFuZHNjYXBlKCk7XG4gIH1cbiAgc2V0IGxhbmRzY2FwZU9yaWVudGF0aW9uKGlzTGFuc2NhcGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9vcHRpb25zLmxhbmRzY2FwZShpc0xhbnNjYXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBrb0hhc0ZyYW1lOiBrby5Db21wdXRlZDtcbiAgcHVibGljIGtvU2ltdWxhdG9yRnJhbWU6IGtvLkNvbXB1dGVkO1xufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3VydmV5LXNpbXVsYXRvclwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBTdXJ2ZXlTaW11bGF0b3JDb21wb25lbnQocGFyYW1zLm1vZGVsLCBwYXJhbXMub3B0aW9ucyk7XG4gICAgfVxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG5cbmV4cG9ydCB2YXIgREVGQVVMVF9NT05JVE9SX0RQSSA9IDEwMi42OTtcbmV4cG9ydCB2YXIgc2ltdWxhdG9yRGV2aWNlcyA9IHtcbiAgZGVza3RvcDoge1xuICAgIGRldmljZVR5cGU6IFwiZGVza3RvcFwiLFxuICAgIHRpdGxlOiBcIkRlc2t0b3BcIixcbiAgfSxcbiAgLy8gZGVza3RvcF8xMjgweDcyMDoge1xuICAvLyAgIGNzc1BpeGVsUmF0aW86IDEsXG4gIC8vICAgcHBpOiBERUZBVUxUX01PTklUT1JfRFBJLFxuICAvLyAgIHdpZHRoOiA3MjAsXG4gIC8vICAgaGVpZ2h0OiAxMjgwLFxuICAvLyAgIGRldmljZVR5cGU6IFwiZGVza3RvcFwiLFxuICAvLyAgIHRpdGxlOiBcIkRlc2t0b3AgMTI4MHg3MjBcIlxuICAvLyB9LFxuICAvLyBkZXNrdG9wXzE0NDB4OTAwOiB7XG4gIC8vICAgY3NzUGl4ZWxSYXRpbzogMSxcbiAgLy8gICBwcGk6IERFRkFVTFRfTU9OSVRPUl9EUEksXG4gIC8vICAgd2lkdGg6IDkwMCxcbiAgLy8gICBoZWlnaHQ6IDE0NDAsXG4gIC8vICAgZGV2aWNlVHlwZTogXCJkZXNrdG9wXCIsXG4gIC8vICAgdGl0bGU6IFwiRGVza3RvcCAxNDQweDkwMFwiXG4gIC8vIH0sXG4gIC8vIGRlc2t0b3BfMTkyMHgxMDgwOiB7XG4gIC8vICAgY3NzUGl4ZWxSYXRpbzogMSxcbiAgLy8gICBwcGk6IERFRkFVTFRfTU9OSVRPUl9EUEksXG4gIC8vICAgd2lkdGg6IDEwODAsXG4gIC8vICAgaGVpZ2h0OiAxOTIwLFxuICAvLyAgIGRldmljZVR5cGU6IFwiZGVza3RvcFwiLFxuICAvLyAgIHRpdGxlOiBcIkRlc2t0b3AgMTkyMHgxMDgwXCJcbiAgLy8gfSxcbiAgLy8gaVBob25lOiB7XG4gIC8vICAgY3NzUGl4ZWxSYXRpbzogMixcbiAgLy8gICBwcGk6IDMyNixcbiAgLy8gICB3aWR0aDogNjQwLFxuICAvLyAgIGhlaWdodDogOTYwLFxuICAvLyAgIGZyYW1lV2lkdGg6IDczMCxcbiAgLy8gICBmcmFtZUhlaWdodDogMTM0MCxcbiAgLy8gICBkZXZpY2VUeXBlOiBcInBob25lXCIsXG4gIC8vICAgdGl0bGU6IFwiaVBob25lXCIsXG4gIC8vICAgY3NzQ2xhc3M6IFwic3ZkLXNpbXVsYXRvci1pcGhvbmU0XCJcbiAgLy8gfSxcbiAgaVBob25lNToge1xuICAgIGNzc1BpeGVsUmF0aW86IDIsXG4gICAgcHBpOiAzMjYsXG4gICAgd2lkdGg6IDY0MCxcbiAgICBoZWlnaHQ6IDExMzYsXG4gICAgZnJhbWVXaWR0aDogNzUwLFxuICAgIGZyYW1lSGVpZ2h0OiAxNTAwLFxuICAgIGRldmljZVR5cGU6IFwicGhvbmVcIixcbiAgICB0aXRsZTogXCJpUGhvbmUgNVwiLFxuICAgIGNzc0NsYXNzOiBcInN2ZC1zaW11bGF0b3ItaXBob25lNVwiXG4gIH0sXG4gIGlQaG9uZTY6IHtcbiAgICBjc3NQaXhlbFJhdGlvOiAyLFxuICAgIHBwaTogMzI2LFxuICAgIHdpZHRoOiA3NTAsXG4gICAgaGVpZ2h0OiAxMzM0LFxuICAgIGZyYW1lV2lkdGg6IDk2MCxcbiAgICBmcmFtZUhlaWdodDogMTc1MCxcbiAgICBkZXZpY2VUeXBlOiBcInBob25lXCIsXG4gICAgdGl0bGU6IFwiaVBob25lIDZcIixcbiAgICBjc3NDbGFzczogXCJzdmQtc2ltdWxhdG9yLWlwaG9uZTZcIlxuICB9LFxuICBpUGhvbmU2cGx1czoge1xuICAgIGNzc1BpeGVsUmF0aW86IDIsXG4gICAgcHBpOiA0MDEsXG4gICAgd2lkdGg6IDEwODAsXG4gICAgaGVpZ2h0OiAxOTIwLFxuICAgIGZyYW1lV2lkdGg6IDEzMzAsXG4gICAgZnJhbWVIZWlnaHQ6IDI1NTAsXG4gICAgZGV2aWNlVHlwZTogXCJwaG9uZVwiLFxuICAgIHRpdGxlOiBcImlQaG9uZSA2IFBsdXNcIixcbiAgICBjc3NDbGFzczogXCJzdmQtc2ltdWxhdG9yLWlwaG9uZTZwbHVzXCJcbiAgfSxcbiAgaVBob25lODoge1xuICAgIGNzc1BpeGVsUmF0aW86IDIsXG4gICAgcHBpOiAzMjYsXG4gICAgd2lkdGg6IDc1MCxcbiAgICBoZWlnaHQ6IDEzMzQsXG4gICAgZnJhbWVXaWR0aDogOTkwLFxuICAgIGZyYW1lSGVpZ2h0OiAxODYwLFxuICAgIGRldmljZVR5cGU6IFwicGhvbmVcIixcbiAgICB0aXRsZTogXCJpUGhvbmUgOFwiLFxuICAgIGNzc0NsYXNzOiBcInN2ZC1zaW11bGF0b3ItaXBob25lOFwiXG4gIH0sXG4gIGlQaG9uZThwbHVzOiB7XG4gICAgY3NzUGl4ZWxSYXRpbzogMixcbiAgICBwcGk6IDQwMSxcbiAgICB3aWR0aDogMTA4MCxcbiAgICBoZWlnaHQ6IDE5MjAsXG4gICAgZnJhbWVXaWR0aDogMTMzMCxcbiAgICBmcmFtZUhlaWdodDogMjU1MCxcbiAgICBkZXZpY2VUeXBlOiBcInBob25lXCIsXG4gICAgdGl0bGU6IFwiaVBob25lIDggUGx1c1wiLFxuICAgIGNzc0NsYXNzOiBcInN2ZC1zaW11bGF0b3ItaXBob25lOHBsdXNcIlxuICB9LFxuICBpUGhvbmVYOiB7XG4gICAgY3NzUGl4ZWxSYXRpbzogMixcbiAgICBwcGk6IDQ1OCxcbiAgICB3aWR0aDogMTEyNSxcbiAgICBoZWlnaHQ6IDI0MzYsXG4gICAgZnJhbWVXaWR0aDogMTMzMCxcbiAgICBmcmFtZUhlaWdodDogMjY4MCxcbiAgICBkZXZpY2VUeXBlOiBcInBob25lXCIsXG4gICAgdGl0bGU6IFwiaVBob25lIFhcIixcbiAgICBjc3NDbGFzczogXCJzdmQtc2ltdWxhdG9yLWlwaG9uZXhcIlxuICB9LFxuICBpUGhvbmVYbWF4OiB7XG4gICAgY3NzUGl4ZWxSYXRpbzogMixcbiAgICBwcGk6IDQ1OCxcbiAgICB3aWR0aDogMTI0MixcbiAgICBoZWlnaHQ6IDI2ODgsXG4gICAgZnJhbWVXaWR0aDogMTQxMCxcbiAgICBmcmFtZUhlaWdodDogMjk4MCxcbiAgICBkZXZpY2VUeXBlOiBcInBob25lXCIsXG4gICAgdGl0bGU6IFwiaVBob25lIFggTWF4XCIsXG4gICAgY3NzQ2xhc3M6IFwic3ZkLXNpbXVsYXRvci1pcGhvbmV4bWF4XCJcbiAgfSxcbiAgaVBhZDoge1xuICAgIGNzc1BpeGVsUmF0aW86IDIsXG4gICAgcHBpOiAyNjQsXG4gICAgd2lkdGg6IDE1MzYsXG4gICAgaGVpZ2h0OiAyMDQ4LFxuICAgIGZyYW1lV2lkdGg6IDE4MzcsXG4gICAgZnJhbWVIZWlnaHQ6IDI1NjMsXG4gICAgZGV2aWNlVHlwZTogXCJ0YWJsZXRcIixcbiAgICB0aXRsZTogXCJpUGFkXCIsXG4gICAgY3NzQ2xhc3M6IFwic3ZkLXNpbXVsYXRvci1pcGFkXCJcbiAgfSxcbiAgaVBhZE1pbmk6IHtcbiAgICBjc3NQaXhlbFJhdGlvOiAxLFxuICAgIHBwaTogMTYzLFxuICAgIHdpZHRoOiA3NjgsXG4gICAgaGVpZ2h0OiAxMDI0LFxuICAgIGZyYW1lV2lkdGg6IDk0NSxcbiAgICBmcmFtZUhlaWdodDogMTMwMCxcbiAgICBkZXZpY2VUeXBlOiBcInRhYmxldFwiLFxuICAgIHRpdGxlOiBcImlQYWQgTWluaVwiLFxuICAgIGNzc0NsYXNzOiBcInN2ZC1zaW11bGF0b3ItaXBhZG1pbmlcIlxuICB9LFxuICBpUGFkUHJvOiB7XG4gICAgY3NzUGl4ZWxSYXRpbzogMSxcbiAgICBwcGk6IDI2NCxcbiAgICB3aWR0aDogMTY4OCxcbiAgICBoZWlnaHQ6IDIzODgsXG4gICAgZnJhbWVXaWR0aDogMjAwOCxcbiAgICBmcmFtZUhlaWdodDogMjk4MCxcbiAgICBkZXZpY2VUeXBlOiBcInRhYmxldFwiLFxuICAgIHRpdGxlOiAnaVBhZCBQcm8gMTFcIicsXG4gICAgY3NzQ2xhc3M6IFwic3ZkLXNpbXVsYXRvci1pcGFkcHJvXCJcbiAgfSxcbiAgaVBhZFBybzEzOiB7XG4gICAgY3NzUGl4ZWxSYXRpbzogMSxcbiAgICBwcGk6IDI2NCxcbiAgICB3aWR0aDogMjA0OCxcbiAgICBoZWlnaHQ6IDI3MzIsXG4gICAgZnJhbWVXaWR0aDogMjM2MCxcbiAgICBmcmFtZUhlaWdodDogMzMwMCxcbiAgICBkZXZpY2VUeXBlOiBcInRhYmxldFwiLFxuICAgIHRpdGxlOiAnaVBhZCBQcm8gMTIsOVwiJyxcbiAgICBjc3NDbGFzczogXCJzdmQtc2ltdWxhdG9yLWlwYWRwcm8xM1wiXG4gIH0sXG4gIGFuZHJvaWRQaG9uZToge1xuICAgIGNzc1BpeGVsUmF0aW86IDIsXG4gICAgcHBpOiAzMTYsXG4gICAgd2lkdGg6IDcyMCxcbiAgICBoZWlnaHQ6IDEyODAsXG4gICAgZnJhbWVXaWR0aDogODUwLFxuICAgIGZyYW1lSGVpZ2h0OiAxNjMwLFxuICAgIGRldmljZVR5cGU6IFwicGhvbmVcIixcbiAgICB0aXRsZTogXCJBbmRyb2lkIFBob25lXCIsXG4gICAgY3NzQ2xhc3M6IFwic3ZkLXNpbXVsYXRvci1hbmRyb2lkcGhvbmVcIlxuICB9LFxuICBhbmRyb2lkVGFibGV0OiB7XG4gICAgY3NzUGl4ZWxSYXRpbzogMS41LFxuICAgIHBwaTogMTQ5LFxuICAgIHdpZHRoOiA4MDAsXG4gICAgaGVpZ2h0OiAxMjgwLFxuICAgIGZyYW1lV2lkdGg6IDEwNzAsXG4gICAgZnJhbWVIZWlnaHQ6IDE0ODAsXG4gICAgZGV2aWNlVHlwZTogXCJ0YWJsZXRcIixcbiAgICB0aXRsZTogXCJBbmRyb2lkIFRhYmxldFwiLFxuICAgIGNzc0NsYXNzOiBcInN2ZC1zaW11bGF0b3ItYW5kcm9pZHRhYmxldFwiXG4gIH0sXG4gIHdpbjEwUGhvbmU6IHtcbiAgICBjc3NQaXhlbFJhdGlvOiAxLFxuICAgIHBwaTogMTUyLFxuICAgIHdpZHRoOiAzMzAsXG4gICAgaGVpZ2h0OiA1NjgsXG4gICAgZnJhbWVXaWR0aDogNDgwLFxuICAgIGZyYW1lSGVpZ2h0OiA4NDYsXG4gICAgZGV2aWNlVHlwZTogXCJwaG9uZVwiLFxuICAgIHRpdGxlOiBcIldpbmRvd3MgMTAgUGhvbmVcIixcbiAgICBjc3NDbGFzczogXCJzdmQtc2ltdWxhdG9yLXdpbjEwcGhvbmVcIlxuICB9LFxuICBtc1N1cmZhY2U6IHtcbiAgICBjc3NQaXhlbFJhdGlvOiAxLFxuICAgIHBwaTogMTQ4LFxuICAgIHdpZHRoOiA3NjgsXG4gICAgaGVpZ2h0OiAxMzY2LFxuICAgIGZyYW1lV2lkdGg6IDEwNDAsXG4gICAgZnJhbWVIZWlnaHQ6IDE2MjAsXG4gICAgZGV2aWNlVHlwZTogXCJ0YWJsZXRcIixcbiAgICB0aXRsZTogXCJNUyBTdXJmYWNlXCIsXG4gICAgY3NzQ2xhc3M6IFwic3ZkLXNpbXVsYXRvci1tc3N1cmZhY2VcIlxuICB9LFxuICBnZW5lcmljUGhvbmU6IHtcbiAgICBjc3NQaXhlbFJhdGlvOiAxLFxuICAgIGRldmljZVR5cGU6IFwicGhvbmVcIixcbiAgICB0aXRsZTogXCJcIixcbiAgICBjc3NDbGFzczogXCJzdmQtc2ltdWxhdG9yLWdlbnBob25lXCJcbiAgfSxcbn07XG5cbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGRhdGEtYmluZD1cXFwiaWY6IGhhc0l0ZW1zXFxcIiBjbGFzcz1cXFwic3ZkX3Rvb2xiYXJcXFwiPlxcbiAgPCEtLSBrbyBmb3JlYWNoOiBpdGVtcyAtLT5cXG4gIDxzcGFuIGNsYXNzPVxcXCJzdmRfYWN0aW9uXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImNzczogJGRhdGEuY3NzLCB2aXNpYmxlOiAkZGF0YS52aXNpYmxlID09PSB1bmRlZmluZWQgfHwgISFrby51bndyYXAoJGRhdGEudmlzaWJsZSksIGF0dHI6IHsgaWQ6IGlkIH1cXFwiPlxcbiAgICA8IS0tIGtvIGlmbm90OiAkZGF0YS50ZW1wbGF0ZSAgLS0+XFxuICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICRkYXRhLmNvbXBvbmVudCB8fCAnc3ZkLWJ1dHRvbicsIHBhcmFtczogeyBpdGVtOiAkZGF0YSB9IH0gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSBrbyBpZjogJGRhdGEudGVtcGxhdGUgIC0tPlxcbiAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICRkYXRhLnRlbXBsYXRlLCBkYXRhOiAkZGF0YS5kYXRhIHx8ICRkYXRhIH0gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwvc3Bhbj5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvZGl2PlwiOyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgSUFjdGlvbiB9IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi90b29sYmFyLnNjc3NcIjtcbnZhciB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL3Rvb2xiYXIuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFRvb2xiYXIge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaXRlbXM6IGtvLk9ic2VydmFibGVBcnJheTxJQWN0aW9uPiB8IEFycmF5PElBY3Rpb24+KSB7fVxuICBnZXQgaGFzSXRlbXMoKSB7XG4gICAgcmV0dXJuIChrby51bndyYXAodGhpcy5pdGVtcykgfHwgW10pLmxlbmd0aCA+IDA7XG4gIH1cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC10b29sYmFyXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFRvb2xiYXIocGFyYW1zLml0ZW1zKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG59KTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgSVF1ZXN0aW9uVG9vbGJveEl0ZW0gfSBmcm9tICcuLi90b29sYm94JztcbmltcG9ydCB7IGdldExvY1N0cmluZyB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IFN1cnZleUNyZWF0b3IgfSBmcm9tICcuLi9lZGl0b3InO1xuXG5pbXBvcnQgXCIuL3Rvb2xib3gtaXRlbS5zY3NzXCI7XG52YXIgdGVtcGxhdGUgPSByZXF1aXJlKFwiaHRtbC1sb2FkZXI/aW50ZXJwb2xhdGUhdmFsLWxvYWRlciEuL3Rvb2xib3gtaXRlbS5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgVG9vbGJveEl0ZW1WaWV3TW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaXRlbTogSVF1ZXN0aW9uVG9vbGJveEl0ZW0sIHByaXZhdGUgX2NyZWF0b3I6IFN1cnZleUNyZWF0b3IpIHtcbiAgfVxuICBnZXQgYXJpYUxhYmVsKCkgeyByZXR1cm4gdGhpcy5pdGVtLnRvb2x0aXAgKyAnICcgKyBnZXRMb2NTdHJpbmcoJ3Rvb2xib3gnKSArICcgaXRlbSc7IH1cbiAgY2xpY2sgPSAoKSA9PiB7IHRoaXMuX2NyZWF0b3IuY2xpY2tUb29sYm94SXRlbSh0aGlzLml0ZW0pOyB9XG4gIGRyYWdzdGFydCA9IChlbCwgZSkgPT4geyB0aGlzLl9jcmVhdG9yLmRyYWdnaW5nVG9vbGJveEl0ZW0odGhpcy5pdGVtLCBlKTsgcmV0dXJuIHRydWU7IH1cbiAgZHJhZ2VuZCA9IChlbCwgZSkgPT4geyB0aGlzLl9jcmVhdG9yLmRyYWdFbmQoKTsgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXRvb2xib3gtaXRlbVwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgdmFyIGl0ZW06IElRdWVzdGlvblRvb2xib3hJdGVtID0gcGFyYW1zLml0ZW07XG4gICAgICB2YXIgY3JlYXRvciA9IHBhcmFtcy5jcmVhdG9yO1xuICAgICAgcmV0dXJuIG5ldyBUb29sYm94SXRlbVZpZXdNb2RlbChpdGVtLCBjcmVhdG9yKTtcbiAgICB9XG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZVxufSk7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyBTdXJ2ZXlDcmVhdG9yIH0gZnJvbSAnLi4vZWRpdG9yJztcbmV4cG9ydCB7IFRvb2xib3hJdGVtVmlld01vZGVsIH0gZnJvbSBcIi4vdG9vbGJveC1pdGVtXCI7XG5cbmltcG9ydCBcIi4vdG9vbGJveC5zY3NzXCI7XG52YXIgdGVtcGxhdGUgPSByZXF1aXJlKFwiaHRtbC1sb2FkZXI/aW50ZXJwb2xhdGUhdmFsLWxvYWRlciEuL3Rvb2xib3guaHRtbFwiKTtcblxuZXhwb3J0IHZhciBUb29sYm94Vmlld01vZGVsO1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXRvb2xib3hcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGxldCBjcmVhdG9yOiBTdXJ2ZXlDcmVhdG9yID0gcGFyYW1zLml0ZW1zUHJvdmlkZXI7XG4gICAgICAvLyBsZXQgdG9vbGJveCA9IG5ldyBRdWVzdGlvblRvb2xib3goY3JlYXRvci50b29sYm94SXRlbXMsIGNyZWF0b3IpO1xuICAgICAgLy8ga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhjb21wb25lbnRJbmZvLmVsZW1lbnQsICgpID0+IHtcbiAgICAgIC8vICAgY3JlYXRvci50b29sYm94LmRpc3Bvc2UoKTtcbiAgICAgIC8vICAgY3JlYXRvci50b29sYm94ID0gdW5kZWZpbmVkO1xuICAgICAgLy8gfSk7XG4gICAgICAvLyBjcmVhdG9yLnRvb2xib3ggPSB0b29sYm94O1xuICAgICAgLy8gcmV0dXJuIHRvb2xib3g7XG4gICAgICByZXR1cm4gY3JlYXRvci50b29sYm94O1xuICAgIH1cbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlXG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Db252ZXJ0ZXIgfSBmcm9tIFwiLi9xdWVzdGlvbmNvbnZlcnRlclwiO1xuaW1wb3J0IHsgU3VydmV5VGV4dFdvcmtlciB9IGZyb20gXCIuL3RleHRXb3JrZXJcIjtcbmltcG9ydCB7IFN1cnZleUhlbHBlciwgT2JqVHlwZSB9IGZyb20gXCIuL3N1cnZleUhlbHBlclwiO1xuaW1wb3J0IHsgU3VydmV5SlNPTjUgfSBmcm9tIFwiLi9qc29uNVwiO1xuaW1wb3J0IHsgU3VydmV5TG9naWMgfSBmcm9tIFwiLi90YWJzL2xvZ2ljXCI7XG5pbXBvcnQgeyBJU3VydmV5Q3JlYXRvck9wdGlvbnMgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgRWRpdGFibGVPYmplY3QgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvcnMvZWRpdGFibGVPYmplY3RcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQ3JlYXRvck9wdGlvbnMge1xuICBbaW5kZXg6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBTdXJ2ZXkgQ3JlYXRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIENyZWF0b3JCYXNlPFQgZXh0ZW5kcyB7IFtpbmRleDogc3RyaW5nXTogYW55IH0+XG4gIGltcGxlbWVudHMgSVN1cnZleUNyZWF0b3JPcHRpb25zXG57XG4gIHByaXZhdGUgc2hvd0Rlc2lnbmVyVGFiVmFsdWUgPSBrby5vYnNlcnZhYmxlPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzaG93SlNPTkVkaXRvclRhYlZhbHVlID0ga28ub2JzZXJ2YWJsZTxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgc2hvd1Rlc3RTdXJ2ZXlUYWJWYWx1ZSA9IGtvLm9ic2VydmFibGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHNob3dFbWJlZGRlZFN1cnZleVRhYlZhbHVlID0ga28ub2JzZXJ2YWJsZTxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgc2hvd1RyYW5zbGF0aW9uVGFiVmFsdWUgPSBrby5vYnNlcnZhYmxlPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzaG93TG9naWNUYWJWYWx1ZSA9IGtvLm9ic2VydmFibGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGlzUlRMVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBoYXZlQ29tbWVyY2lhbExpY2Vuc2VWYWx1ZSA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICBwcml2YXRlIGFsd2F5U2F2ZVRleHRJblByb3BlcnR5RWRpdG9yc1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIHN1cnZleVZhbHVlID0ga28ub2JzZXJ2YWJsZTxUPigpO1xuXG4gIHByaXZhdGUgbmV3UXVlc3Rpb25zOiBBcnJheTxhbnk+ID0gW107XG4gIHByaXZhdGUgbmV3UGFuZWxzOiBBcnJheTxhbnk+ID0gW107XG4gIHByaXZhdGUgbmV3UXVlc3Rpb25DaGFuZ2VkTmFtZXM6IHt9O1xuXG4gIGtvQXV0b1NhdmUgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAga29TaG93T3B0aW9ucyA9IGtvLm9ic2VydmFibGUoKTtcbiAga29HZW5lcmF0ZVZhbGlkSlNPTiA9IGtvLm9ic2VydmFibGUodHJ1ZSk7XG4gIGtvU2hvd1N0YXRlID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gIGtvVmlld1R5cGUgPSBrby5vYnNlcnZhYmxlKFwiZGVzaWduZXJcIik7XG5cbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBjYWxsZWQgb24gZGVsZXRpbmcgYW4gZWxlbWVudCAocXVlc3Rpb24vcGFuZWwvcGFnZSkgZnJvbSB0aGUgc3VydmV5LiBUeXBpY2FsbHksIHdoZW4gYSB1c2VyIGNsaWNrIHRoZSBkZWxldGUgZnJvbSB0aGUgZWxlbWVudCBtZW51LlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLmVsZW1lbnQgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlbGV0aW5nIGVsZW1lbnRcbiAgICogPGJyLz4gb3B0aW9ucy5lbGVtZW50VHlwZSB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudDogJ3F1ZXN0aW9uJywgJ3BhbmVsJyBvciAncGFnZScuXG4gICAqIDxici8+IG9wdGlvbnMuYWxsb3dpbmcgc2V0IGl0IHRvIGZhbHNlIHRvIGNhbmNlbCB0aGUgZWxlbWVudCBkZWxldGluZ1xuICAgKi9cbiAgcHVibGljIG9uRWxlbWVudERlbGV0aW5nOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogQ3JlYXRvckJhc2U8VD4sIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcblxuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCBvbiBzZXR0aW5nIGEgcmVhZE9ubHkgcHJvcGVydHkgb2YgdGhlIHByb3BlcnR5IGVkaXRvci4gQnkgZGVmYXVsdCB0aGUgcHJvcGVydHkucmVhZE9ubHkgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogWW91IG1heSBjaGFuZ2VkIGl0IGFuZCBtYWtlIHRoZSBwcm9wZXJ0eSBlZGl0b3IgcmVhZCBvbmx5IG9yIGVuYWJsZWQgZm9yIGEgcGFydGljdWxhciBvYmplY3QuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMub2JqIHRoZSBzdXJ2ZXkgb2JqZWN0LCBTdXJ2ZXksIFBhZ2UsIFBhbmVsIG9yIFF1ZXN0aW9uXG4gICAqIDxici8+IG9wdGlvbnMucHJvcGVydHkgdGhlIG9iamVjdCBwcm9wZXJ0eSAoU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSBvYmplY3QpLiBJdCBoYXMgbmFtZSwgY2xhc3NOYW1lLCB0eXBlLCB2aXNpYmxlLCByZWFkT25seSBhbmQgb3RoZXIgcHJvcGVydGllcy5cbiAgICogPGJyLz4gb3B0aW9ucy5yZWFkT25seSBhIGJvb2xlYW4gdmFsdWUuIEl0IGhhcyB2YWx1ZSBlcXVhbHMgdG8gb3B0aW9ucy5yZWFkT25seSBwcm9wZXJ0eSBieSBkZWZhdWx0LiBZb3UgbWF5IGNoYW5nZSBpdC5cbiAgICogPGJyLz4gb3B0aW9ucy5wYXJlbnRPYmogdGhlIHBhcmVudCBvYmplY3QuIEl0IGlzIG51bGwgZm9yIG5vbi1uZXN0ZWQgcHJvcGVydGllcy4gSXQgaXMgbm90IG51bGwgZm9yIGl0ZW12YWx1ZSBvciBjb2x1bW4gb2JqZWN0cy4gVGhlIHBhcmVudCBvYmplY3QgaXMgYSBxdWVzdGlvbiAoZHJvcGRvd24sIHJhZGlncm91cCwgY2hlY2tib3gsIG1hdHJpY2VzIGFuZCBzbyBvbikuXG4gICAqIDxici8+IG9wdGlvbnMucGFyZW50UHJvcGVydHkgdGhlIHBhcmVudCBwcm9wZXJ0eSAoU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSBvYmplY3QpLiBJdCBpcyBudWxsIGZvciBub24tbmVzdGVkIHByb3BlcnRpZXMuIEl0IGlzIG5vdCBudWxsIGZvciBpdGVtdmFsdWUgb3IgY29sdW1uIG9iamVjdHMuIFRoZSBwYXJlbnQgb2JqZWN0IGlzIGNob2ljZXMsIGNvbHVtbnMsIHJvd3MsIHRyaWdnZXJzIGFuZCBzbyBvbi5cbiAgICovXG4gIHB1YmxpYyBvbkdldFByb3BlcnR5UmVhZE9ubHk6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IENyZWF0b3JCYXNlPFQ+LCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgc3VydmV5IGNyZWF0b3IgY3JlYXRlcyBhIHN1cnZleSBvYmplY3QgKFN1cnZleS5TdXJ2ZXkpLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnN1cnZleSB0aGUgc3VydmV5IG9iamVjdCBzaG93aW5nIGluIHRoZSBjcmVhdG9yLlxuICAgKiA8YnIvPiBvcHRpb25zLnJlYXNvbiBpbmRpY2F0ZXMgd2hhdCBjb21wb25lbnQgb2YgdGhlIGNyZWF0b3IgcmVxdWVzdHMgdGhlIHN1cnZleS4gVGhlcmUgYXJlIHNldmVyYWwgcmVhc29uIHR5cGVzOiBcImRlc2lnbmVyXCIgLSBzdXJ2ZXkgZm9yIGRlc2lnbmVyIHN1cnZleSwgXCJ0ZXN0XCIgLSBzdXJ2ZXkgZm9yIFwiVGVzdCBTdXJ2ZXlcIiB0YWIgYW5kIFwiY29uZGl0aW9uRWRpdG9yXCIsIFwiZGVmYXVsdFZhbHVlRWRpdG9yXCIsIFwicmVzdGZ1bEVkaXRvclwiIC0gc3VydmV5cyBmb3IgZGlmZmVyZW50IHByb3BlcnR5IGVkaXRvcnMuXG4gICAqL1xuICBwdWJsaWMgb25TdXJ2ZXlJbnN0YW5jZUNyZWF0ZWQ6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IENyZWF0b3JCYXNlPFQ+LCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgYWxsb3dzIHRvIGRpc3BsYXkgdGhlIGN1c3RvbSBuYW1lIGZvciBvYmplY3RzOiBxdWVzdGlvbnMsIHBhZ2VzIGFuZCBwYW5lbHMuIEJ5IGRlZmF1bHQgdGhlIG9iamVjdCBuYW1lIGlzIHVzaW5nLiBZb3UgbWF5IHNob3cgb2JqZWN0IHRpdGxlIGJ5IHNldHRpbmcgc2hvd09iamVjdFRpdGxlcyBwcm9wZXJ0eSB0byB0cnVlLlxuICAgKiBVc2UgdGhpcyBldmVudCwgaWYgeW91IHdhbnQgY3VzdG9tIGRpc3BsYXkgbmFtZSBmb3Igb2JqZWN0cy5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5vYmogdGhlIHN1cnZleSBvYmplY3QsIFN1cnZleSwgUGFnZSwgUGFuZWwgb3IgUXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5yZWFzb24gdGhlIG5hbWUgb2YgdGhlIFVJIHRoYXQgcmVxdWVzdHMgdGhlIG9iamVjdCBkaXNwbGF5IG5hbWVcbiAgICogPGJyLz4gb3B0aW9ucy5kaXNwbGF5TmFtZSBjaGFuZ2UgdGhpcyBwcm9wZXJ0eSB0byBzaG93IHlvdXIgY3VzdG9tIGRpc3BsYXkgbmFtZSBmb3IgdGhlIG9iamVjdFxuICAgKiBAc2VlIHNob3dPYmplY3RUaXRsZXNcbiAgICovXG4gIHB1YmxpYyBvbkdldE9iamVjdERpc3BsYXlOYW1lOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogQ3JlYXRvckJhc2U8VD4sIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcblxuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gYWRkL3JlbW92ZS9tb2RpZnkgdGhlIGVsZW1lbnQgKHF1ZXN0aW9uL3BhbmVsKSBtZW51IGl0ZW1zLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLm9iaiB0aGUgc3VydmV5IG9iamVjdCB3aGljaCBwcm9wZXJ0eSBpcyBlZGl0ZWQgaW4gdGhlIFByb3BlcnR5IEVkaXRvci5cbiAgICogPGJyLz4gb3B0aW9ucy5pdGVtcyB0aGUgbGlzdCBvZiBtZW51IGl0ZW1zLiBJdCBoYXMgdHdvIHJlcXVpcmVkIGZpZWxkczogdGV4dCBhbmQgb25DbGljazogZnVuY3Rpb24ob2JqOiBTdXJ2ZXkuQmFzZSkge30gYW5kIG9wdGlvbmFsIG5hbWUgZmllbGQuXG4gICAqIEBzZWUgb25FbGVtZW50QWxsb3dPcGVyYXRpb25zXG4gICAqL1xuICBwdWJsaWMgb25EZWZpbmVFbGVtZW50TWVudUl0ZW1zOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogQ3JlYXRvckJhc2U8VD4sIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBjYWxsZWQgYmVmb3JlIHNob3dpbmcgYSBwcm9wZXJ0eSBpbiB0aGUgUHJvcGVydGllcyBHcmlkIG9yIGluIHRoZSBRdWVzdGlvbiBFZGl0b3IuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMub2JqIHRoZSBzdXJ2ZXkgb2JqZWN0LCBTdXJ2ZXksIFBhZ2UsIFBhbmVsIG9yIFF1ZXN0aW9uXG4gICAqIDxici8+IG9wdGlvbnMucHJvcGVydHkgdGhlIG9iamVjdCBwcm9wZXJ0eSAoU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSBvYmplY3QpLiBJdCBoYXMgbmFtZSwgY2xhc3NOYW1lLCB0eXBlLCB2aXNpYmxlLCByZWFkT25seSBhbmQgb3RoZXIgcHJvcGVydGllcy5cbiAgICogPGJyLz4gb3B0aW9ucy5jYW5TaG93IGEgYm9vbGVhbiB2YWx1ZS4gSXQgaXMgdHJ1ZSBieSBkZWZhdWx0LiBTZXQgaXQgZmFsc2UgdG8gaGlkZSB0aGUgcHJvcGVydHkgZnJvbSB0aGUgUHJvcGVydGllcyBHcmlkIGFuZCBpbiB0aGUgUXVlc3Rpb24gRWRpdG9yLlxuICAgKiA8YnIvPiBvcHRpb25zLnBhcmVudE9iaiB0aGUgcGFyZW50IG9iamVjdC4gSXQgaXMgbnVsbCBmb3Igbm9uLW5lc3RlZCBwcm9wZXJ0aWVzLiBJdCBpcyBub3QgbnVsbCBmb3IgaXRlbXZhbHVlIG9yIGNvbHVtbiBvYmplY3RzLiBUaGUgcGFyZW50IG9iamVjdCBpcyBhIHF1ZXN0aW9uIChkcm9wZG93biwgcmFkaWdyb3VwLCBjaGVja2JveCwgbWF0cmljZXMgYW5kIHNvIG9uKS5cbiAgICogPGJyLz4gb3B0aW9ucy5wYXJlbnRQcm9wZXJ0eSB0aGUgcGFyZW50IHByb3BlcnR5IChTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5IG9iamVjdCkuIEl0IGlzIG51bGwgZm9yIG5vbi1uZXN0ZWQgcHJvcGVydGllcy4gSXQgaXMgbm90IG51bGwgZm9yIGl0ZW12YWx1ZSBvciBjb2x1bW4gb2JqZWN0cy4gVGhlIHBhcmVudCBvYmplY3QgaXMgY2hvaWNlcywgY29sdW1ucywgcm93cywgdHJpZ2dlcnMgYW5kIHNvIG9uLlxuICAgKiA8YnIvPlxuICAgKiA8YnIvPiBbRXhhbXBsZTogSGlkZSBhIGNhdGVnb3J5IGluIHRoZSBQcm9wZXJ0aWVzIEdyaWRdKGh0dHBzOi8vc3VydmV5anMuaW8vRXhhbXBsZXMvU3VydmV5LUNyZWF0b3I/aWQ9aGlkZWNhdGVnb3J5aW5wcm9wZXJ0aWVzZ3JpZClcbiAgICovXG4gIHB1YmxpYyBvblNob3dpbmdQcm9wZXJ0eTogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IENyZWF0b3JCYXNlPFQ+LCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogQ3JlYXRvckJhc2U8VD4sIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBARGVwcmVjYXRlZCBPYnNvbGV0ZSwgcGxlYXNlIHVzZSBvblNob3dpbmdQcm9wZXJ0eSBldmVudC5cbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCBiZWZvcmUgc2hvd2luZyBhIHByb3BlcnR5IGluIHRoZSBQcm9wZXJ0eSBHcmlkIG9yIGluIFF1ZXN0aW9uIEVkaXRvci5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5vYmogdGhlIHN1cnZleSBvYmplY3QsIFN1cnZleSwgUGFnZSwgUGFuZWwgb3IgUXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5wcm9wZXJ0eSB0aGUgb2JqZWN0IHByb3BlcnR5IChTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5IG9iamVjdCkuIEl0IGhhcyBuYW1lLCBjbGFzc05hbWUsIHR5cGUsIHZpc2libGUsIHJlYWRPbmx5IGFuZCBvdGhlciBwcm9wZXJ0aWVzLlxuICAgKiA8YnIvPiBvcHRpb25zLmNhblNob3cgYSBib29sZWFuIHZhbHVlLiBJdCBpcyB0cnVlIGJ5IGRlZmF1bHQuIFNldCBpdCBmYWxzZSB0byBoaWRlIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBQcm9wZXJ0eSBHcmlkIG9yIGluIFF1ZXN0aW9uIEVkaXRvclxuICAgKiA8YnIvPiBvcHRpb25zLnBhcmVudE9iaiB0aGUgcGFyZW50IG9iamVjdC4gSXQgaXMgbnVsbCBmb3Igbm9uLW5lc3RlZCBwcm9wZXJ0aWVzLiBJdCBpcyBub3QgbnVsbCBmb3IgaXRlbXZhbHVlIG9yIGNvbHVtbiBvYmplY3RzLiBUaGUgcGFyZW50IG9iamVjdCBpcyBhIHF1ZXN0aW9uIChkcm9wZG93biwgcmFkaWdyb3VwLCBjaGVja2JveCwgbWF0cmljZXMgYW5kIHNvIG9uKS5cbiAgICogPGJyLz4gb3B0aW9ucy5wYXJlbnRQcm9wZXJ0eSB0aGUgcGFyZW50IHByb3BlcnR5IChTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5IG9iamVjdCkuIEl0IGlzIG51bGwgZm9yIG5vbi1uZXN0ZWQgcHJvcGVydGllcy4gSXQgaXMgbm90IG51bGwgZm9yIGl0ZW12YWx1ZSBvciBjb2x1bW4gb2JqZWN0cy4gVGhlIHBhcmVudCBvYmplY3QgaXMgY2hvaWNlcywgY29sdW1ucywgcm93cywgdHJpZ2dlcnMgYW5kIHNvIG9uLlxuICAgKi9cbiAgcHVibGljIG9uQ2FuU2hvd1Byb3BlcnR5OiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogQ3JlYXRvckJhc2U8VD4sIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gdGhpcy5vblNob3dpbmdQcm9wZXJ0eTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBjYWxsZWQgYmVmb3JlIHJlbmRlcmluZyBhIGRlbGV0ZSBidXR0b24gaW4gdGhlIFByb3BlcnR5IEdyaWQgb3IgaW4gUXVlc3Rpb24gRWRpdG9yLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLm9iaiB0aGUgc3VydmV5IFF1ZXN0aW9uXG4gICAqIDxici8+IG9wdGlvbnMuaXRlbSB0aGUgb2JqZWN0IHByb3BlcnR5IChTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5IG9iamVjdCkuIEl0IGhhcyBuYW1lLCBjbGFzc05hbWUsIHR5cGUsIHZpc2libGUsIHJlYWRPbmx5IGFuZCBvdGhlciBwcm9wZXJ0aWVzXG4gICAqIDxici8+IG9wdGlvbnMuY2FuRGVsZXRlIGEgYm9vbGVhbiB2YWx1ZS4gSXQgaXMgdHJ1ZSBieSBkZWZhdWx0LiBTZXQgaXQgZmFsc2UgdG8gcmVtb3ZlIGRlbGV0ZSBidXR0b24gZnJvbSB0aGUgUHJvcGVydHkgR3JpZCBvciBpbiBRdWVzdGlvbiBFZGl0b3JcbiAgICovXG4gIHB1YmxpYyBvbkNhbkRlbGV0ZUl0ZW06IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IENyZWF0b3JCYXNlPFQ+LCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCBvbiBkZWxldGluZyBhIGNvbGxlY3Rpb24gaXRlbSBmcm9tIHRoZSBQcm9wZXJ0eSBFZGl0b3IuIEZvciBleGFtcGxlOiBjb2x1bW4gaW4gY29sdW1ucyBlZGl0b3Igb3IgaXRlbSBpbiBjaG9pY2VzIGFuZCBzbyBvbi5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5vYmogdGhlIHN1cnZleSBvYmplY3Q6IFF1ZXN0aW9uLCBQYW5lbCwgUGFnZSBvciBTdXJ2ZXlcbiAgICogPGJyLz4gb3B0aW9ucy5wcm9wZXJ0eSB0aGUgY29sbGVjdGlvbiBwcm9wZXJ0eSAoU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSBvYmplY3QpLiBJdCBoYXMgbmFtZSwgY2xhc3NOYW1lLCB0eXBlLCB2aXNpYmxlLCByZWFkT25seSBhbmQgb3RoZXIgcHJvcGVydGllc1xuICAgKiA8YnIvPiBvcHRpb25zLnByb3BlcnR5TmFtZSB0aGUgY29sbGVjdGlvbiBwcm9wZXJ0eSBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMuY29sbGVjdGlvbiB0aGUgZWRpdGluZyBjb2xsZWN0aW9uIHdoZXJlIGRlbGV0aW5nIGl0ZW0gaXMgbG9jYXRlZC4gSXQgaXMgY2FuIGJlIGNvbHVtbnMgaW4gdGhlIG1hdHJpY2VzIG9yIGNob2ljZXMgaW4gZHJvcGRvd24gcXVlc3Rpb24gYW5kIHNvIG9uLlxuICAgKiA8YnIvPiBvcHRpb25zLml0ZW0gdGhlIGNvbGxlY3Rpb24gaXRlbSB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWxldGVcbiAgICogPGJyLz4gb3B0aW9ucy5hbGxvd0RlbGV0ZSBhIGJvb2xlYW4gdmFsdWUuIEl0IGlzIHRydWUgYnkgZGVmYXVsdC4gU2V0IGl0IGZhbHNlIHRvIGFib25kb21lIHRoZSBlbGVtZW50IHJlbW92aW5nIGZyb20gdGhlIGNvbGxlY3Rpb25cbiAgICovXG4gIHB1YmxpYyBvbkNvbGxlY3Rpb25JdGVtRGVsZXRpbmc6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IENyZWF0b3JCYXNlPFQ+LCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCBvbiBhZGRpbmcgYSBuZXcgU3VydmV5Lkl0ZW1WYWx1ZSBvYmplY3QuIEl0IHVzZXMgYXMgYW4gZWxlbWVudCBpbiBjaG9pY2VzIGFycmF5IGluIFJhZGlvZ3JvdXAsIGNoZWNrYm94IGFuZCBkcm9wZG93biBxdWVzdGlvbnMgb3IgTWF0cml4IGNvbHVtbnMgYW5kIHJvd3MgcHJvcGVydGllcy5cbiAgICogVXNlIHRoaXMgZXZlbnQsIHRvIHNldCBJdGVtVmFsdWUudmFsdWUgYW5kIEl0ZW1WYWx1ZS50ZXh0IHByb3BlcnRpZXMgYnkgZGVmYXVsdCBvciBzZXQgYSB2YWx1ZSB0byB0aGUgY3VzdG9tIHByb3BlcnR5LlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIgLz4gb3B0aW9ucy5vYmogdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBpdGVtc1ZhbHVlcyBhcnJheSwgZm9yIGV4YW1wbGUgc2VsZWN0b3IsIHJhdGluZyBhbmQgc2luZ2xlIGNob2ljZSBtYXRyaXggcXVlc3Rpb25zLlxuICAgKiA8YnIvPiBvcHRpb25zLnByb3BlcnR5TmFtZSAgdGhlIG9iamVjdCBwcm9wZXJ0eSBOYW1lLiBJdCBjYW4gYmUgXCJjaG9pY2VzXCIgZm9yIHNlbGVjdG9yIHF1ZXN0aW9ucyBvciByYXRlVmFsdWVzIGZvciByYXRpbmcgcXVlc3Rpb24gb3IgY29sdW1ucy9yb3dzIGZvciBzaW5nbGUgY2hvaWNlIG1hdHJpeC5cbiAgICogPGJyLz4gb3B0aW9ucy5uZXdJdGVtIGEgbmV3IGNyZWF0ZWQgU3VydmV5Lkl0ZW1WYWx1ZSBvYmplY3QuXG4gICAqIDxici8+IG9wdGlvbnMuaXRlbVZhbHVlcyBhbiBlZGl0aW5nIFN1cnZleS5JdGVtVmFsdWUgYXJyYXkuIG5ld0l0ZW0gb2JqZWN0IGlzIG5vdCBhZGRlZCB5ZXQgaW50byB0aGlzIGFycmF5LlxuICAgKi9cbiAgcHVibGljIG9uSXRlbVZhbHVlQWRkZWQ6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IENyZWF0b3JCYXNlPFQ+LCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCB3aGVuIGEgdXNlciBhZGRzIGEgbmV3IGNvbHVtbiBpbnRvIE1hdHJpeERyb3Bkb3duIG9yIE1hdHJpeER5bmFtaWMgcXVlc3Rpb25zLiBVc2UgaXQgdG8gc2V0IHNvbWUgcHJvcGVydGllcyBvZiBTdXJ2ZXkuTWF0cml4RHJvcGRvd25Db2x1bW4gYnkgZGVmYXVsdCwgZm9yIGV4YW1wbGUgbmFtZSBvciBhIGN1c3RvbSBwcm9wZXJ0eS5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5tYXRyaXggYSBtYXRyaXggcXVlc3Rpb24gd2hlcmUgY29sdW1uIGlzIGxvY2F0ZWQsIG1hdHJpeC5jb2x1bW5zLlxuICAgKiA8YnIvPiBvcHRpb25zLm5ld0NvbHVtbiBhIG5ldyBjcmVhdGVkIFN1cnZleS5NYXRyaXhEcm9wZG93bkNvbHVtbiBvYmplY3QuXG4gICAqIDxici8+IG9wdGlvbnMuY29sdW1ucyBlZGl0YWJsZSBjb2x1bW5zIG9iamVjdHMuIFRoZXkgY2FuIGJlIGRpZmZlcmVudCBmcm9tIG9wdGlvbnMubWF0cml4LmNvbHVtbnMuIG9wdGlvbnMuY29sdW1ucyBhbmQgb3B0aW9ucy5tYXRyaXguY29sdW1ucyBhcmUgZXF1YWwgYWZ0ZXIgdXNlciBwcmVzcyBBcHBseSBvciBDYW5jZWwgYW5kIG9wdGlvbnMuY29sdW1ucyB3aWxsIGJlIHNldCB0byBvcHRpb25zLm1hdHJpeC5jb2x1bW5zIG9yIHJlc2V0IHRvIGluaXRpYWwgc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhDb2x1bW5BZGRlZDogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IENyZWF0b3JCYXNlPFQ+LCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogQ3JlYXRvckJhc2U8VD4sIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjb250cm9sIFByb3BlcnR5IEVkaXRvcnMgVUkuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMub2JqIHRoZSBzdXJ2ZXkgb2JqZWN0IHdoaWNoIHByb3BlcnR5IGlzIGVkaXRlZCBpbiB0aGUgUHJvcGVydHkgRWRpdG9yLlxuICAgKiA8YnIvPiBvcHRpb25zLnByb3BlcnR5TmFtZSAgdGhlIG5hbWUgb2YgdGhlIGVkaXRlZCBwcm9wZXJ0eS5cbiAgICogPGJyLz4gb3B0aW9ucy5lZGl0b3JPcHRpb25zICBvcHRpb25zIHRoYXQgY2FuIGJlIGNoYW5nZWQuXG4gICAqIDxici8+IG9wdGlvbnMuZWRpdG9yT3B0aW9ucy5hbGxvd0FkZFJlbW92ZUl0ZW1zIGEgYm9vbGVhbiBwcm9wZXJ0eSwgdHJ1ZSBieSBkZWZhdWx0LiBTZXQgaXQgZmFsc2UgdG8gZGlzYWJsZSBhZGQvcmVtb3ZlIGl0ZW1zIGluIGFycmF5IHByb3BlcnRpZXMuIEZvciBleGFtcGxlICdjaG9pY2VzJywgJ2NvbHVtbnMnLCAncm93cycuXG4gICAqIDxici8+IG9wdGlvbnMuZWRpdG9yT3B0aW9ucy5hbGxvd1JlbW92ZUFsbEl0ZW1zIGEgYm9vbGVhbiBwcm9wZXJ0eSwgdHJ1ZSBieSBkZWZhdWx0LiBTZXQgaXQgZmFsc2UgdG8gZGlzYWJsZSByZW1vdmUgYWxsIGl0ZW1zIGluIGFycmF5IHByb3BlcnRpZXMuIEZvciBleGFtcGxlICdjaG9pY2VzJywgJ2NvbHVtbnMnLCAncm93cycuXG4gICAqIDxici8+IG9wdGlvbnMuZWRpdG9yT3B0aW9ucy5zaG93VGV4dFZpZXcgYSBib29sZWFuIHByb3BlcnR5LCB0cnVlIGJ5IGRlZmF1bHQuIFNldCBpdCBmYWxzZSB0byBkaXNhYmxlIFwiRmFzdCBFbnRyeVwiIHRhYiBmb3IgXCJjaG9pY2VzXCIgcHJvcGVydHkuXG4gICAqIDxici8+IG9wdGlvbnMuZWRpdG9yT3B0aW9ucy5pdGVtc0VudHJ5VHlwZSBhIHN0cmluZyBwcm9wZXJ0eSwgJ2Zvcm0nIGJ5IGRlZmF1bHQuIFNldCBpdCAnZmFzdCcgdG8gc2hvdyBcIkZhc3QgRW50cnlcIiB0YWIgZm9yIFwiY2hvaWNlc1wiIHByb3BlcnR5IGJ5IGRlZmF1bHQuXG4gICAqL1xuICBwdWJsaWMgb25TZXRQcm9wZXJ0eUVkaXRvck9wdGlvbnM6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IENyZWF0b3JCYXNlPFQ+LCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCBvbiBnZW5lcmF0aW9uIGEgbmV3IG5hbWUgZm9yIGEgbmV3IGNyZWF0ZWQgZWxlbWVudC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5lbGVtZW50IGEgbmV3IGNyZWF0ZWQgc3VydmV5IGVsZW1lbnQuIEl0IGNhbiBiZSBxdWVzdGlvbiwgcGFuZWwgb3IgcGFnZVxuICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgYSBuZXcgc3VnZ2VzdGVkIG5hbWUsIHRoYXQgaXMgdW5pcXVlIGZvciB0aGUgY3VycmVudCBzdXJ2ZXkuIFlvdSBjYW4gc3VnZ2VzdCB5b3VyIG93biBuYW1lLiBJZiBpdCBpcyB1bmlxdWUsIGNyZWF0b3Igd2lsbCBhc3NpZ24gaXQgdG8gdGhlIGVsZW1lbnQuXG4gICAqIDxici8+IG9wdGlvbnMuaXNVbmlxdWUgYSBib29sZWFuIHByb3BlcnR5LCBzZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgaWYgeW91IHdhbnQgdG8gYXNrIENyZWF0b3IgdG8gZ2VuZXJhdGUgYW5vdGhlciBuYW1lXG4gICAqL1xuICBwdWJsaWMgb25HZW5lcmF0ZU5ld05hbWU6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IENyZWF0b3JCYXNlPFQ+LCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gc2hvdyBhIGN1c3RvbSBlcnJvciBpbiB0aGUgUXVlc3Rpb24gRWRpdG9yIG9uIHByZXNzaW5nIEFwcGx5IG9yIE9LIGJ1dHRvbnMsIGlmIHRoZSB2YWx1ZXMgYXJlIG5vdCBzZXQgY29ycmVjdGx5LiBUaGUgZXJyb3Igd2lsbCBiZSBkaXNwbGF5ZWQgdW5kZXIgdGhlIHByb3BlcnR5IGVkaXRvci5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5vYmogdGhlIHN1cnZleSBvYmplY3Qgd2hpY2ggcHJvcGVydHkgaXMgZWRpdGVkIGluIHRoZSBQcm9wZXJ0eSBFZGl0b3IuXG4gICAqIDxici8+IG9wdGlvbnMucHJvcGVydHlOYW1lICB0aGUgbmFtZSBvZiB0aGUgZWRpdGVkIHByb3BlcnR5LlxuICAgKiA8YnIvPiBvcHRpb25zLnZhbHVlIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICogPGJyLz4gb3B0aW9ucy5lcnJvciB0aGUgZXJyb3IgeW91IHdhbnQgdG8gZGlzcGxheS4gU2V0IHRoZSBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0IHZhbHVlKSBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9ycy5cbiAgICogQHNlZSBvblByb3BlcnR5VmFsdWVDaGFuZ2luZ1xuICAgKi9cbiAgcHVibGljIG9uUHJvcGVydHlWYWxpZGF0aW9uQ3VzdG9tRXJyb3I6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IENyZWF0b3JCYXNlPFQ+LCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSBwcm9wZXJ0eSBlZGl0b3IuIFlvdSBtYXkgY2FsbCBhIHZhbGlkYXRpb24sIHNvIGFuIGVuZCB1c2VyIHNlZXMgdGhlIGVycm9yIGltbWVkaWF0ZWx5XG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMub2JqIHRoZSBzdXJ2ZXkgb2JqZWN0IHdoaWNoIHByb3BlcnR5IGlzIGVkaXRlZCBpbiB0aGUgUHJvcGVydHkgRWRpdG9yLlxuICAgKiA8YnIvPiBvcHRpb25zLnByb3BlcnR5TmFtZSAgdGhlIG5hbWUgb2YgdGhlIGVkaXRlZCBwcm9wZXJ0eS5cbiAgICogPGJyLz4gb3B0aW9ucy52YWx1ZSB0aGUgcHJvcGVydHkgdmFsdWUuXG4gICAqIDxici8+IG9wdGlvbnMubmV3VmFsdWUgc2V0IHRoZSBjb3JyZWN0ZWQgdmFsdWUgaW50byB0aGlzIHByb3BlcnR5LiBMZWF2ZSBpdCBudWxsIGlmIHlvdSBhcmUgb2sgd2l0aCB0aGUgZW50ZXJlZCB2YWx1ZS5cbiAgICogPGJyLz4gb3B0aW9ucy5kb1ZhbGlkYXRpb24gc2V0IHRoZSB2YWx1ZSB0byB0cnVlIHRvIGNhbGwgdGhlIHByb3BlcnR5IHZhbGlkYXRpb24uIElmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGUgdXNlciBzZWVzIGl0IGltbWVkaWF0ZWx5LlxuICAgKiBAc2VlIG9uUHJvcGVydHlWYWxpZGF0aW9uQ3VzdG9tRXJyb3JcbiAgICovXG4gIHB1YmxpYyBvblByb3BlcnR5VmFsdWVDaGFuZ2luZzogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IENyZWF0b3JCYXNlPFQ+LCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogQ3JlYXRvckJhc2U8VD4sIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBtb2RpZnkgdGhlIGxpc3QgKG5hbWUgYW5kIHRpdGxlcykgb2YgdGhlIHF1ZXN0aW9ucyBhdmFpbGFibGUgaW4gYSBjb25kaXRpb24gZWRpdG9yLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLm9iaiB0aGUgc3VydmV5IG9iamVjdCB3aGljaCBwcm9wZXJ0eSBpcyBlZGl0ZWQgaW4gdGhlIFByb3BlcnR5IEVkaXRvci5cbiAgICogPGJyLz4gb3B0aW9ucy5wcm9wZXJ0eU5hbWUgIHRoZSBuYW1lIG9mIHRoZSBlZGl0ZWQgcHJvcGVydHkuXG4gICAqIDxici8+IG9wdGlvbnMuZWRpdG9yIHRoZSBpbnN0YW5jZSBvZiBQcm9wZXJ0eSBFZGl0b3IuXG4gICAqIDxici8+IG9wdGlvbnMubGlzdCB0aGUgbGlzdCBvZiB0aGUgcXVlc3Rpb25zIGF2YWlsYWJsZSBmb3IgY29uZGl0aW9uXG4gICAqL1xuICBwdWJsaWMgb25Db25kaXRpb25RdWVzdGlvbnNHZXRMaXN0OiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogQ3JlYXRvckJhc2U8VD4sIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBDcmVhdG9yQmFzZTxUPiwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoaXMgY2FsbGJhY2sgaXMgdXNlZCBpbnRlcm5hbGx5IGZvciBwcm92aWRpbmcgc3VydmV5IEpTT04gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXRTdXJ2ZXlKU09OVGV4dENhbGxiYWNrOiAoKSA9PiB7IHRleHQ6IHN0cmluZzsgaXNNb2RpZmllZDogYm9vbGVhbiB9O1xuICAvKipcbiAgICogVGhpcyBjYWxsYmFjayBpcyB1c2VkIGludGVybmFsbHkgZm9yIHNldHRpbmcgc3VydmV5IEpTT04gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBzZXRTdXJ2ZXlKU09OVGV4dENhbGxiYWNrOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBZb3UgbmVlZCB0byBzZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHVzZSB0YWJzIGluc3RlYWQgb2YgYWNjb3JkaW9uIGluIHRoZSBwb3B1cCBlbGVtZW50J3MgZWRpdG9yLlxuICAgKi9cbiAgcHVibGljIHVzZVRhYnNJbkVsZW1lbnRFZGl0b3IgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFlvdSBuZWVkIHRvIHNldCB0aGlzIHByb3BlcnR5IHRvIHZhbHVlIGJpZ2dlciB0aGFuIDAgdG8gZGlzYWJsZSBhZGRpbmcgbW9yZSBsb2dpYyBpdGVtcyBpbiBjb25kaXRpb24gdGhhbiB0aGlzIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIG1heExvZ2ljSXRlbXNJbkNvbmRpdGlvbjogbnVtYmVyID0gLTE7XG5cbiAgLyoqXG4gICAqIFlvdSBuZWVkIHRvIHNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc2hvdyB0aXRsZXMgaW5zdGVhZCBvZiBuYW1lcyBpbiBwYWdlcyBlZGl0b3IgYW5kIG9iamVjdCBzZWxlY3Rvci5cbiAgICogQHNlZSBvblNob3dPYmplY3REaXNwbGF5TmFtZVxuICAgKi9cbiAgcHVibGljIHNob3dPYmplY3RUaXRsZXMgPSBmYWxzZTtcblxuICAvKipcbiAgICogWW91IG5lZWQgdG8gc2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBzaG93IHRpdGxlcyBpbnN0ZWFkIG9mIG5hbWVzIGluIGV4cHJlc3Npb24gZWRpdG9yLlxuICAgKi9cbiAgcHVibGljIHNob3dUaXRsZXNJbkV4cHJlc3Npb25zID0gZmFsc2U7XG4gIC8qKlxuICAgKiBZb3UgbmVlZCB0byBzZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBhbGxvdyB5b3VyIHVzZXJzIGJ1aWxkIGV4cHJlc3Npb25zIHZpc3VhbGx5IG9ubHksIHdpdGhvdXQgZWRpdGluZyB0aGVtIGluIHRleHQgZWRpdG9yLlxuICAgKi9cbiAgcHVibGljIGFsbG93RWRpdEV4cHJlc3Npb25zSW5UZXh0RWRpdG9yID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFlvdSBuZWVkIHRvIHNldCB0aGlzIHByb3BlcnR5IHRvIG51bWJlciBtb3JlIHRoYW4gMCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdGhhdCB1c2VycyBjYW4gY3JlYXRlIGZvciBtYXRyaXggZHluYW1pYy9tYXRyaXggZHJvcGRvd24gcXVlc3Rpb25zLlxuICAgKi9cbiAgcHVibGljIG1heGltdW1Db2x1bW5zQ291bnQgPSAwO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBoaWRlIHRoZSBwYWdlcyBzZWxlY3RvciBpbiB0aGUgVGVzdCBTdXJ2ZXkgVGFiXG4gICAqL1xuICBwdWJsaWMgc2hvd1BhZ2VzSW5UZXN0U3VydmV5VGFiID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgdG8gaGlkZSB0aGUgZGV2aWNlIHNpbXVsYXRvciBpbiB0aGUgVGVzdCBTdXJ2ZXkgVGFiXG4gICAqL1xuICBwdWJsaWMgc2hvd1NpbXVsYXRvckluVGVzdFN1cnZleVRhYiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGRpc2FibGUgcGFnZXMgYWRkaW5nLCBlZGl0aW5nIGFuZCBkZWxldGluZ1xuICAgKi9cbiAgcHVibGljIGFsbG93TW9kaWZ5UGFnZXMgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBfXCJhdXRvXCJfLiBJdCBzaG93cyB0aGUgbGFuZ3VhZ2Ugc2VsZWN0b3IgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0d28gbGFuZ3VhZ2VzIGFyZSB1c2luZyBpbiB0aGUgc3VydmV5LlxuICAgKiBJdCBzaG93cyBvbmx5IHVzZWQgbGFuZ3VhZ2VzIGluIHRoZSBzdXJ2ZXkuXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIF9mYWxzZV8gdG8gaGlkZSB0aGUgZGVmYXVsdCBsYW5ndWFnZSBzZWxlY3RvciBpbiB0aGUgVGVzdCBTdXJ2ZXkgVGFiLlxuICAgKiBTZXQgaXQgdG8gX3RydWVfIHRvIHNob3cgdGhpcyBzZWxlY3RvciBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lIGxhbmd1YWdlIGluIHRoZSBzdXJ2ZXlcbiAgICogU2V0IGl0IHRvIF9hbGxfIHRvIHNob3cgdGhlIHNlbGVjdG9yIHdpdGggYWxsIGF2YWlsYWJsZSBsYW5ndWFnZXMgKDMwKylcbiAgICovXG4gIHB1YmxpYyBzaG93RGVmYXVsdExhbmd1YWdlSW5UZXN0U3VydmV5VGFiOiBib29sZWFuIHwgc3RyaW5nID0gXCJhdXRvXCI7XG5cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGhpZGUgdGhlIHNob3cgaW52aXNpYmxlIGVsZW1lbnQgY2hlY2tib3ggaW4gdGhlIFRlc3QgU3VydmV5IFRhYlxuICAgKi9cbiAgcHVibGljIHNob3dJbnZpc2libGVFbGVtZW50c0luVGVzdFN1cnZleVRhYiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc2hvdyBcInBhZ2Ugc2VsZWN0b3JcIiBpbiB0aGUgdG9vbGFiYXIgaW5zdGVhZCBvZiBcInBhZ2VzIGVkaXRvclwiXG4gICAqL1xuICBwdWJsaWMgc2hvd1BhZ2VTZWxlY3RvckluVG9vbGJhciA9IGZhbHNlO1xuXG4gIHB1YmxpYyB0YWJzID0ga28ub2JzZXJ2YWJsZUFycmF5KCk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYnkgaXRzIGlkXG4gICAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyBpZC5cbiAgICovXG4gIHB1YmxpYyBnZXRMb2NTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIHRvIHNob3cgXCJKU09OIEVkaXRvclwiIHRhYiBhbmQgdG8gZmFsc2UgdG8gaGlkZSB0aGUgdGFiXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dEZXNpZ25lclRhYigpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93RGVzaWduZXJUYWJWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0Rlc2lnbmVyVGFiKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG93RGVzaWduZXJUYWJWYWx1ZSh2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIHRvIHNob3cgXCJKU09OIEVkaXRvclwiIHRhYiBhbmQgdG8gZmFsc2UgdG8gaGlkZSB0aGUgdGFiXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dKU09ORWRpdG9yVGFiKCkge1xuICAgIHJldHVybiB0aGlzLnNob3dKU09ORWRpdG9yVGFiVmFsdWUoKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dKU09ORWRpdG9yVGFiKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG93SlNPTkVkaXRvclRhYlZhbHVlKHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gc2hvdyBcIlRlc3QgU3VydmV5XCIgdGFiIGFuZCB0byBmYWxzZSB0byBoaWRlIHRoZSB0YWJcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1Rlc3RTdXJ2ZXlUYWIoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1Rlc3RTdXJ2ZXlUYWJWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1Rlc3RTdXJ2ZXlUYWIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3dUZXN0U3VydmV5VGFiVmFsdWUodmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBARGVwcmVjYXRlZCBPYnNvbGV0ZSwgdXNlIHNob3dFbWJlZGRlZFN1cnZleVRhYlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93RW1iZWRlZFN1cnZleVRhYigpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93RW1iZWRkZWRTdXJ2ZXlUYWI7XG4gIH1cbiAgcHVibGljIHNldCBzaG93RW1iZWRlZFN1cnZleVRhYih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvd0VtYmVkZGVkU3VydmV5VGFiID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gc2hvdyBcIkVtYmVkIFN1cnZleVwiIHRhYiBhbmQgdG8gZmFsc2UgdG8gaGlkZSB0aGUgdGFiXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dFbWJlZGRlZFN1cnZleVRhYigpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93RW1iZWRkZWRTdXJ2ZXlUYWJWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0VtYmVkZGVkU3VydmV5VGFiKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG93RW1iZWRkZWRTdXJ2ZXlUYWJWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gc2hvdyBcIkxvZ2ljXCIgdGFiIGFuZCB0byBmYWxzZSB0byBoaWRlIHRoZSB0YWJcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd0xvZ2ljVGFiKCkge1xuICAgIHJldHVybiB0aGlzLnNob3dMb2dpY1RhYlZhbHVlKCk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93TG9naWNUYWIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3dMb2dpY1RhYlZhbHVlKHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gc2hvdyBcIlRyYW5zbGF0aW9uXCIgdGFiIGFuZCB0byBmYWxzZSB0byBoaWRlIHRoZSB0YWJcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1RyYW5zbGF0aW9uVGFiKCkge1xuICAgIHJldHVybiB0aGlzLnNob3dUcmFuc2xhdGlvblRhYlZhbHVlKCk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VHJhbnNsYXRpb25UYWIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3dUcmFuc2xhdGlvblRhYlZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gcHJvcGVydHksIGZhbHNlIGJ5IGRlZmF1bHQuIFNldCBpdCB0byB0cnVlIHRvIGNhbGwgcHJvdGVjdGVkIGRvU2F2ZSBtZXRob2QgYXV0b21hdGljYWxseSBvbiBzdXJ2ZXkgY2hhbmdpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQXV0b1NhdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMua29BdXRvU2F2ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNBdXRvU2F2ZShuZXdWYWwpIHtcbiAgICB0aGlzLmtvQXV0b1NhdmUobmV3VmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGZhbHNlIHRvIHN1cHByZXNzIGFuIGFsZXJ0IG1lc3NhZ2UgYWJvdXQgZXJyb3Igb24gc2F2aW5nIHRoZSBzdXJ2ZXkgaW50byBkYXRhYmFzZS5cbiAgICovXG4gIHB1YmxpYyBzaG93RXJyb3JPbkZhaWxlZFNhdmU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGtvUmVhZE9ubHkgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcblxuICBwcm90ZWN0ZWQgb25TZXRSZWFkT25seShuZXdWYWw6IGJvb2xlYW4pIHt9XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBwcm9wZXJ0eSwgZmFsc2UgYnkgZGVmYXVsdC4gU2V0IGl0IHRvIHRydWUgdG8gZGVueSBlZGl0aW5nLlxuICAgKi9cbiAgcHVibGljIGdldCByZWFkT25seSgpIHtcbiAgICByZXR1cm4gdGhpcy5rb1JlYWRPbmx5KCk7XG4gIH1cbiAgcHVibGljIHNldCByZWFkT25seShuZXdWYWw6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0O1xuICAgIHRoaXMua29SZWFkT25seShuZXdWYWwpO1xuICAgIHRoaXMub25TZXRSZWFkT25seShuZXdWYWwpO1xuICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gIH1cblxuICAvKipcbiAgICogWW91IGhhdmUgcmlnaHQgdG8gc2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSBpZiB5b3UgaGF2ZSBib3VnaHQgdGhlIGNvbW1lcmNpYWwgbGljZW5jZSBvbmx5LlxuICAgKiBJdCB3aWxsIHJlbW92ZSB0aGUgdGV4dCBhYm91dCBub24tY29tbWVyaWNhbCB1c2FnZSBvbiB0aGUgdG9wIG9mIHRoZSB3aWRnZXQuXG4gICAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0cnVlIHdpdGhvdXQgaGF2aW5nIGEgY29tbWVyY2lhbCBsaWNlbmNlIGlzIGlsbGVnYWwuXG4gICAqIEBzZWUgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhdmVDb21tZXJjaWFsTGljZW5zZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXZlQ29tbWVyY2lhbExpY2Vuc2VWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlKHZhbCkge1xuICAgIHRoaXMuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlVmFsdWUodmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSB0byBhY3RpdmF0ZSBSVEwgc3VwcG9ydFxuICAgKi9cbiAgcHVibGljIGdldCBpc1JUTCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1JUTFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSVEwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzUlRMVmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hvd1N0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLmtvU2hvd1N0YXRlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNob3dTdGF0ZShuZXdWYWwpIHtcbiAgICB0aGlzLmtvU2hvd1N0YXRlKG5ld1ZhbCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBhY3RpdmUgdmlldy90YWIuIEl0IHdpbGwgcmV0dXJuIGZhbHNlIGlmIGl0IGNhbid0IGNoYW5nZSB0aGUgY3VycmVudCB0YWIuXG4gICAqIEBwYXJhbSB2aWV3TmFtZSBuYW1lIG9mIG5ldyBhY3RpdmUgdmlldyAodGFiKS4gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGF2YWlsYWJsZTogXCJkZXNpZ25lclwiLCBcImVkaXRvclwiLCBcInRlc3RcIiwgXCJlbWJlZFwiIGFuZCBcInRyYW5zbGF0aW9uXCIuXG4gICAqL1xuICBwdWJsaWMgbWFrZU5ld1ZpZXdBY3RpdmUodmlld05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jYW5Td2l0Y2hWaWV3VHlwZSh2aWV3TmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLm9uVmlld1R5cGVDaGFuZ2VkKHZpZXdOYW1lKTtcbiAgICB0aGlzLmtvVmlld1R5cGUodmlld05hbWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVmlld1R5cGVDaGFuZ2VkKG5ld1R5cGU6IHN0cmluZykge31cblxuICBwcm90ZWN0ZWQgY2FuU3dpdGNoVmlld1R5cGUobmV3VHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgb3B0aW9uczogSUNyZWF0b3JPcHRpb25zKSB7XG4gICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIHRoaXMuaW5pdFRhYnMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0VGFicygpIHtcbiAgICBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICB0aGlzLnRhYnMoW10pO1xuICAgICAgaWYgKHRoaXMuc2hvd0Rlc2lnbmVyVGFiKSB7XG4gICAgICAgIHRoaXMudGFicy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcImRlc2lnbmVyXCIsXG4gICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0TG9jU3RyaW5nKFwiZWQuZGVzaWduZXJcIiksXG4gICAgICAgICAgdGVtcGxhdGU6IFwic2UtdGFiLWRlc2lnbmVyXCIsXG4gICAgICAgICAgZGF0YTogdGhpcyxcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMubWFrZU5ld1ZpZXdBY3RpdmUoXCJkZXNpZ25lclwiKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zaG93VGVzdFN1cnZleVRhYikge1xuICAgICAgICB0aGlzLnRhYnMucHVzaCh7XG4gICAgICAgICAgbmFtZTogXCJ0ZXN0XCIsXG4gICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0TG9jU3RyaW5nKFwiZWQudGVzdFN1cnZleVwiKSxcbiAgICAgICAgICB0ZW1wbGF0ZTogXCJzZS10YWItdGVzdFwiLFxuICAgICAgICAgIGRhdGE6IHRoaXMsXG4gICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLm1ha2VOZXdWaWV3QWN0aXZlKFwidGVzdFwiKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zaG93TG9naWNUYWIpIHtcbiAgICAgICAgdGhpcy50YWJzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IFwibG9naWNcIixcbiAgICAgICAgICB0aXRsZTogdGhpcy5nZXRMb2NTdHJpbmcoXCJlZC5sb2dpY1wiKSxcbiAgICAgICAgICB0ZW1wbGF0ZTogXCJzZS10YWItbG9naWNcIixcbiAgICAgICAgICBkYXRhOiB0aGlzLFxuICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5tYWtlTmV3Vmlld0FjdGl2ZShcImxvZ2ljXCIpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNob3dKU09ORWRpdG9yVGFiKSB7XG4gICAgICAgIHRoaXMudGFicy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcImVkaXRvclwiLFxuICAgICAgICAgIHRpdGxlOiB0aGlzLmdldExvY1N0cmluZyhcImVkLmpzb25FZGl0b3JcIiksXG4gICAgICAgICAgdGVtcGxhdGU6IFwic2UtdGFiLWpzb24tZWRpdG9yXCIsXG4gICAgICAgICAgZGF0YTogdGhpcyxcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMubWFrZU5ld1ZpZXdBY3RpdmUoXCJlZGl0b3JcIiksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2hvd0VtYmVkZGVkU3VydmV5VGFiKSB7XG4gICAgICAgIHRoaXMudGFicy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcImVtYmVkXCIsXG4gICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0TG9jU3RyaW5nKFwiZWQuZW1iZWRTdXJ2ZXlcIiksXG4gICAgICAgICAgdGVtcGxhdGU6IFwic2UtdGFiLWVtYmVkXCIsXG4gICAgICAgICAgZGF0YTogdGhpcyxcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHRoaXMubWFrZU5ld1ZpZXdBY3RpdmUoXCJlbWJlZFwiKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zaG93VHJhbnNsYXRpb25UYWIpIHtcbiAgICAgICAgdGhpcy50YWJzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IFwidHJhbnNsYXRpb25cIixcbiAgICAgICAgICB0aXRsZTogdGhpcy5nZXRMb2NTdHJpbmcoXCJlZC50cmFuc2xhdGlvblwiKSxcbiAgICAgICAgICB0ZW1wbGF0ZTogXCJzZS10YWItdHJhbnNsYXRpb25cIixcbiAgICAgICAgICBkYXRhOiB0aGlzLFxuICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5tYWtlTmV3Vmlld0FjdGl2ZShcInRyYW5zbGF0aW9uXCIpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRhYnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMua29WaWV3VHlwZSh0aGlzLnRhYnMoKVswXS5uYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMgfHwge307XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0T3B0aW9ucyhvcHRpb25zOiBJQ3JlYXRvck9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgICBpZiAoIW9wdGlvbnMuaGFzT3duUHJvcGVydHkoXCJnZW5lcmF0ZVZhbGlkSlNPTlwiKSlcbiAgICAgIG9wdGlvbnMuZ2VuZXJhdGVWYWxpZEpTT04gPSB0cnVlO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zaG93RGVzaWduZXJUYWJWYWx1ZShcbiAgICAgIHR5cGVvZiBvcHRpb25zLnNob3dEZXNpZ25lclRhYiAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IG9wdGlvbnMuc2hvd0Rlc2lnbmVyVGFiXG4gICAgICAgIDogdHJ1ZVxuICAgICk7XG4gICAgdGhpcy5zaG93TG9naWNUYWJWYWx1ZShcbiAgICAgIHR5cGVvZiBvcHRpb25zLnNob3dMb2dpY1RhYiAhPT0gXCJ1bmRlZmluZWRcIiA/IG9wdGlvbnMuc2hvd0xvZ2ljVGFiIDogZmFsc2VcbiAgICApO1xuICAgIHRoaXMuc2hvd0pTT05FZGl0b3JUYWJWYWx1ZShcbiAgICAgIHR5cGVvZiBvcHRpb25zLnNob3dKU09ORWRpdG9yVGFiICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gb3B0aW9ucy5zaG93SlNPTkVkaXRvclRhYlxuICAgICAgICA6IHRydWVcbiAgICApO1xuICAgIHRoaXMuc2hvd1Rlc3RTdXJ2ZXlUYWJWYWx1ZShcbiAgICAgIHR5cGVvZiBvcHRpb25zLnNob3dUZXN0U3VydmV5VGFiICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gb3B0aW9ucy5zaG93VGVzdFN1cnZleVRhYlxuICAgICAgICA6IHRydWVcbiAgICApO1xuICAgIHRoaXMuc2hvd0VtYmVkZGVkU3VydmV5VGFiVmFsdWUoXG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zaG93RW1iZWRkZWRTdXJ2ZXlUYWIgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBvcHRpb25zLnNob3dFbWJlZGRlZFN1cnZleVRhYlxuICAgICAgICA6IHR5cGVvZiBvcHRpb25zLnNob3dFbWJlZGVkU3VydmV5VGFiICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gb3B0aW9ucy5zaG93RW1iZWRlZFN1cnZleVRhYlxuICAgICAgICA6IGZhbHNlXG4gICAgKTtcbiAgICB0aGlzLnNob3dUcmFuc2xhdGlvblRhYlZhbHVlKFxuICAgICAgdHlwZW9mIG9wdGlvbnMuc2hvd1RyYW5zbGF0aW9uVGFiICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gb3B0aW9ucy5zaG93VHJhbnNsYXRpb25UYWJcbiAgICAgICAgOiBmYWxzZVxuICAgICk7XG4gICAgdGhpcy5zaG93TG9naWNUYWJWYWx1ZShcbiAgICAgIHR5cGVvZiBvcHRpb25zLnNob3dMb2dpY1RhYiAhPT0gXCJ1bmRlZmluZWRcIiA/IG9wdGlvbnMuc2hvd0xvZ2ljVGFiIDogZmFsc2VcbiAgICApO1xuXG4gICAgdGhpcy5oYXZlQ29tbWVyY2lhbExpY2Vuc2UgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gb3B0aW9ucy5oYXZlQ29tbWVyY2lhbExpY2Vuc2VcbiAgICAgICAgOiBmYWxzZTtcblxuICAgIHRoaXMuc2hvd09iamVjdFRpdGxlcyA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zaG93T2JqZWN0VGl0bGVzICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gb3B0aW9ucy5zaG93T2JqZWN0VGl0bGVzXG4gICAgICAgIDogZmFsc2U7XG4gICAgdGhpcy5zaG93VGl0bGVzSW5FeHByZXNzaW9ucyA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zaG93VGl0bGVzSW5FeHByZXNzaW9ucyAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IG9wdGlvbnMuc2hvd1RpdGxlc0luRXhwcmVzc2lvbnNcbiAgICAgICAgOiBmYWxzZTtcbiAgICB0aGlzLmFsbG93RWRpdEV4cHJlc3Npb25zSW5UZXh0RWRpdG9yID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLmFsbG93RWRpdEV4cHJlc3Npb25zSW5UZXh0RWRpdG9yICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gb3B0aW9ucy5hbGxvd0VkaXRFeHByZXNzaW9uc0luVGV4dEVkaXRvclxuICAgICAgICA6IHRydWU7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm1heGltdW1Db2x1bW5zQ291bnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMubWF4aW11bUNvbHVtbnNDb3VudCA9IG9wdGlvbnMubWF4aW11bUNvbHVtbnNDb3VudDtcbiAgICB9XG4gICAgdGhpcy51c2VUYWJzSW5FbGVtZW50RWRpdG9yID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLnVzZVRhYnNJbkVsZW1lbnRFZGl0b3IgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBvcHRpb25zLnVzZVRhYnNJbkVsZW1lbnRFZGl0b3JcbiAgICAgICAgOiBmYWxzZTtcbiAgICB0aGlzLm1heExvZ2ljSXRlbXNJbkNvbmRpdGlvbiA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5tYXhMb2dpY0l0ZW1zSW5Db25kaXRpb24gIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBvcHRpb25zLm1heExvZ2ljSXRlbXNJbkNvbmRpdGlvblxuICAgICAgICA6IC0xO1xuICAgIHRoaXMuc2hvd1N0YXRlID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLnNob3dTdGF0ZSAhPT0gXCJ1bmRlZmluZWRcIiA/IG9wdGlvbnMuc2hvd1N0YXRlIDogZmFsc2U7XG4gICAgdGhpcy5rb1Nob3dPcHRpb25zKFxuICAgICAgdHlwZW9mIG9wdGlvbnMuc2hvd09wdGlvbnMgIT09IFwidW5kZWZpbmVkXCIgPyBvcHRpb25zLnNob3dPcHRpb25zIDogZmFsc2VcbiAgICApO1xuXG4gICAgdGhpcy5rb0dlbmVyYXRlVmFsaWRKU09OKHRoaXMub3B0aW9ucy5nZW5lcmF0ZVZhbGlkSlNPTik7XG4gICAgdGhpcy5pc0F1dG9TYXZlID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLmlzQXV0b1NhdmUgIT09IFwidW5kZWZpbmVkXCIgPyBvcHRpb25zLmlzQXV0b1NhdmUgOiBmYWxzZTtcbiAgICB0aGlzLnNob3dFcnJvck9uRmFpbGVkU2F2ZSA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zaG93RXJyb3JPbkZhaWxlZFNhdmUgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBvcHRpb25zLnNob3dFcnJvck9uRmFpbGVkU2F2ZVxuICAgICAgICA6IHRydWU7XG4gICAgdGhpcy5pc1JUTFZhbHVlID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLmlzUlRMICE9PSBcInVuZGVmaW5lZFwiID8gb3B0aW9ucy5pc1JUTCA6IGZhbHNlO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlYWRPbmx5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLmtvUmVhZE9ubHkob3B0aW9ucy5yZWFkT25seSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zaG93UGFnZXNJblRlc3RTdXJ2ZXlUYWIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuc2hvd1BhZ2VzSW5UZXN0U3VydmV5VGFiID0gb3B0aW9ucy5zaG93UGFnZXNJblRlc3RTdXJ2ZXlUYWI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zaG93U2ltdWxhdG9ySW5UZXN0U3VydmV5VGFiICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnNob3dTaW11bGF0b3JJblRlc3RTdXJ2ZXlUYWIgPSBvcHRpb25zLnNob3dTaW11bGF0b3JJblRlc3RTdXJ2ZXlUYWI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zaG93RGVmYXVsdExhbmd1YWdlSW5UZXN0U3VydmV5VGFiICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLnNob3dEZWZhdWx0TGFuZ3VhZ2VJblRlc3RTdXJ2ZXlUYWIgPVxuICAgICAgICBvcHRpb25zLnNob3dEZWZhdWx0TGFuZ3VhZ2VJblRlc3RTdXJ2ZXlUYWI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zaG93SW52aXNpYmxlRWxlbWVudHNJblRlc3RTdXJ2ZXlUYWIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuc2hvd0ludmlzaWJsZUVsZW1lbnRzSW5UZXN0U3VydmV5VGFiID1cbiAgICAgICAgb3B0aW9ucy5zaG93SW52aXNpYmxlRWxlbWVudHNJblRlc3RTdXJ2ZXlUYWI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hbGxvd01vZGlmeVBhZ2VzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLmFsbG93TW9kaWZ5UGFnZXMgPSBvcHRpb25zLmFsbG93TW9kaWZ5UGFnZXM7XG4gICAgfVxuICB9XG5cbiAgaXNDYW5Nb2RpZnlQcm9wZXJ0eShvYmo6IFN1cnZleS5CYXNlLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciBwcm9wZXJ0eSA9IFN1cnZleS5TZXJpYWxpemVyLmZpbmRQcm9wZXJ0eShvYmouZ2V0VHlwZSgpLCBwcm9wZXJ0eU5hbWUpO1xuICAgIHJldHVybiAoXG4gICAgICAhcHJvcGVydHkgfHxcbiAgICAgICF0aGlzLm9uSXNQcm9wZXJ0eVJlYWRPbmx5Q2FsbGJhY2soXG4gICAgICAgIG9iaixcbiAgICAgICAgcHJvcGVydHksXG4gICAgICAgIHByb3BlcnR5LnJlYWRPbmx5LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBvbklzUHJvcGVydHlSZWFkT25seUNhbGxiYWNrKFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4sXG4gICAgcGFyZW50T2JqOiBTdXJ2ZXkuQmFzZSxcbiAgICBwYXJlbnRQcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuICApOiBib29sZWFuIHtcbiAgICB2YXIgcHJvcG9zZWRWYWx1ZSA9IHRoaXMucmVhZE9ubHkgfHwgcmVhZE9ubHk7XG4gICAgaWYgKHRoaXMub25HZXRQcm9wZXJ0eVJlYWRPbmx5LmlzRW1wdHkpIHJldHVybiBwcm9wb3NlZFZhbHVlO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgb2JqOiBvYmosXG4gICAgICBwcm9wZXJ0eTogcHJvcGVydHksXG4gICAgICByZWFkT25seTogcHJvcG9zZWRWYWx1ZSxcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHkubmFtZSxcbiAgICAgIHBhcmVudE9iajogcGFyZW50T2JqLFxuICAgICAgcGFyZW50UHJvcGVydHk6IHBhcmVudFByb3BlcnR5LFxuICAgIH07XG4gICAgdGhpcy5vbkdldFByb3BlcnR5UmVhZE9ubHkuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5yZWFkT25seTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZWRpdGluZyBzdXJ2ZXkgb2JqZWN0IChTdXJ2ZXkuU3VydmV5KVxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3VydmV5VGV4dEZyb21EZXNpZ25lcigpIHtcbiAgICB2YXIganNvbiA9ICg8YW55PnRoaXMuc3VydmV5KS50b0pTT04oKTtcbiAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5nZW5lcmF0ZVZhbGlkSlNPTikge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzb24sIG51bGwsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFN1cnZleUpTT041KCkuc3RyaW5naWZ5KGpzb24sIG51bGwsIDEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldFRleHRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCEhdGhpcy5zZXRTdXJ2ZXlKU09OVGV4dENhbGxiYWNrKSB7XG4gICAgICB0aGlzLnNldFN1cnZleUpTT05UZXh0Q2FsbGJhY2sodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgSlNPTiBhcyB0ZXh0ICBpbnRvIHN1cnZleS4gQ2xlYXIgdW5kby9yZWRvIHN0YXRlcyBvcHRpb25hbGx5LlxuICAgKiBAcGFyYW0gdmFsdWUgSlNPTiBhcyB0ZXh0XG4gICAqIEBwYXJhbSBjbGVhclN0YXRlIGRlZmF1bHQgZmFsc2UuIFNldCB0aGlzIHBhcmFtZXRlciB0byB0cnVlIHRvIGNsZWFyIHVuZG8vcmVkbyBzdGF0ZXMuXG4gICAqL1xuICBwdWJsaWMgY2hhbmdlVGV4dCh2YWx1ZTogc3RyaW5nLCBjbGVhclN0YXRlID0gZmFsc2UpIHtcbiAgICB0aGlzLnNldFRleHRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFN1cnZleSBKU09OIGFzIGEgdGV4dC4gVXNlIGl0IHRvIGdldCBTdXJ2ZXkgSlNPTiBvciBjaGFuZ2UgaXQuXG4gICAqIEBzZWUgSlNPTlxuICAgKi9cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5nZXRTdXJ2ZXlKU09OVGV4dENhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTdXJ2ZXlKU09OVGV4dENhbGxiYWNrKCkudGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3VydmV5VGV4dEZyb21EZXNpZ25lcigpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jaGFuZ2VUZXh0KHZhbHVlLCB0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdXJ2ZXlKU09OKCk6IGFueSB7XG4gICAgaWYgKHRoaXMua29WaWV3VHlwZSgpICE9IFwiZWRpdG9yXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU3VydmV5Lkpzb25PYmplY3QoKS50b0pzb25PYmplY3QodGhpcy5zdXJ2ZXkpO1xuICAgIH1cbiAgICB2YXIgc3VydmV5SnNvblRleHQgPSB0aGlzLnRleHQ7XG4gICAgdmFyIHRleHRXb3JrZXIgPSBuZXcgU3VydmV5VGV4dFdvcmtlcihzdXJ2ZXlKc29uVGV4dCk7XG4gICAgaWYgKHRleHRXb3JrZXIuaXNKc29uQ29ycmVjdCkge1xuICAgICAgcmV0dXJuIG5ldyBTdXJ2ZXkuSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdCh0ZXh0V29ya2VyLnN1cnZleSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldE9iamVjdERpc3BsYXlOYW1lKFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAgZGlzcGxheU5hbWU6IHN0cmluZyA9IHVuZGVmaW5lZFxuICApOiBzdHJpbmcge1xuICAgIGlmICghZGlzcGxheU5hbWUpIHtcbiAgICAgIGRpc3BsYXlOYW1lID0gU3VydmV5SGVscGVyLmdldE9iamVjdE5hbWUob2JqLCB0aGlzLnNob3dPYmplY3RUaXRsZXMpO1xuICAgIH1cbiAgICB2YXIgb3B0aW9ucyA9IHsgb2JqOiBvYmosIGRpc3BsYXlOYW1lOiBkaXNwbGF5TmFtZSwgcmVhc29uOiByZWFzb24gfTtcbiAgICB0aGlzLm9uR2V0T2JqZWN0RGlzcGxheU5hbWUuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5kaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVTdXJ2ZXkoXG4gICAganNvbjogYW55ID0ge30sXG4gICAgcmVhc29uOiBzdHJpbmcgPSBcImRlc2lnbmVyXCIsXG4gICAgc3VydmV5VHlwZSA9IFN1cnZleS5TdXJ2ZXlcbiAgKSB7XG4gICAgdmFyIHN1cnZleSA9IG5ldyBzdXJ2ZXlUeXBlKGpzb24pO1xuICAgIGlmIChyZWFzb24gIT0gXCJkZXNpZ25lclwiICYmIHJlYXNvbiAhPSBcInRlc3RcIikge1xuICAgICAgc3VydmV5LmxvY2FsZSA9IGVkaXRvckxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlO1xuICAgIH1cbiAgICB0aGlzLm9uU3VydmV5SW5zdGFuY2VDcmVhdGVkLmZpcmUodGhpcywgeyBzdXJ2ZXk6IHN1cnZleSwgcmVhc29uOiByZWFzb24gfSk7XG4gICAgcmV0dXJuIHN1cnZleTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRNb2RpZmllZChvcHRpb25zOiBhbnkgPSBudWxsKSB7fVxuXG4gIHByb3RlY3RlZCBjb252ZXJ0Q3VycmVudE9iamVjdChvYmo6IFN1cnZleS5RdWVzdGlvbiwgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbmV3UXVlc3Rpb24gPSBRdWVzdGlvbkNvbnZlcnRlci5jb252ZXJ0T2JqZWN0KG9iaiwgY2xhc3NOYW1lKTtcbiAgICB0aGlzLnNldE1vZGlmaWVkKHtcbiAgICAgIHR5cGU6IFwiUVVFU1RJT05fQ09OVkVSVEVEXCIsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIG9sZFZhbHVlOiBvYmosXG4gICAgICBuZXdWYWx1ZTogbmV3UXVlc3Rpb24sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdFN1cnZleVdpdGhKU09OKGpzb246IGFueSwgY2xlYXJTdGF0ZTogYm9vbGVhbikge31cblxuICAvKipcbiAgICogVGhlIFN1cnZleSBKU09OLiBVc2UgaXQgdG8gZ2V0IFN1cnZleSBKU09OIG9yIGNoYW5nZSBpdC5cbiAgICogQHNlZSB0ZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IEpTT04oKTogYW55IHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4ge307XG4gICAgcmV0dXJuICg8YW55PnRoaXMuc3VydmV5KS50b0pTT04oKTtcbiAgfVxuICBwdWJsaWMgc2V0IEpTT04odmFsOiBhbnkpIHtcbiAgICBpZiAodGhpcy5rb1ZpZXdUeXBlKCkgPT0gXCJlZGl0b3JcIikge1xuICAgICAgdGhpcy5zZXRUZXh0VmFsdWUoSlNPTi5zdHJpbmdpZnkodmFsKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdFN1cnZleVdpdGhKU09OKHZhbCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRvQ2xpY2tRdWVzdGlvbkNvcmUoXG4gICAgZWxlbWVudDogU3VydmV5LklFbGVtZW50LFxuICAgIG1vZGlmaWVkVHlwZTogc3RyaW5nID0gXCJBRERFRF9GUk9NX1RPT0xCT1hcIlxuICApIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2U7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgdmFyIGVsRWxlbWVudCA9IHRoaXMuc3VydmV5LnNlbGVjdGVkRWxlbWVudDtcbiAgICBpZiAoZWxFbGVtZW50ICYmIGVsRWxlbWVudC5wYXJlbnQpIHtcbiAgICAgIHBhcmVudCA9IGVsRWxlbWVudC5wYXJlbnQ7XG4gICAgICBpbmRleCA9IHBhcmVudC5lbGVtZW50cy5pbmRleE9mKHRoaXMuc3VydmV5LnNlbGVjdGVkRWxlbWVudCk7XG4gICAgICBpZiAoaW5kZXggPiAtMSkgaW5kZXgrKztcbiAgICB9XG4gICAgcGFyZW50LmFkZEVsZW1lbnQoZWxlbWVudCwgaW5kZXgpO1xuICAgIHRoaXMuc2V0TW9kaWZpZWQoeyB0eXBlOiBtb2RpZmllZFR5cGUsIHF1ZXN0aW9uOiBlbGVtZW50IH0pO1xuICB9XG5cbiAgcHVibGljIHNldE5ld05hbWVzKGVsZW1lbnQ6IFN1cnZleS5JRWxlbWVudCkge1xuICAgIHRoaXMubmV3UXVlc3Rpb25zID0gW107XG4gICAgdGhpcy5uZXdQYW5lbHMgPSBbXTtcbiAgICB0aGlzLm5ld1F1ZXN0aW9uQ2hhbmdlZE5hbWVzID0ge307XG4gICAgdGhpcy5zZXROZXdOYW1lc0NvcmUoZWxlbWVudCk7XG4gICAgdGhpcy51cGRhdGVOZXdFbGVtZW50RXhwcmVzc2lvbnMoZWxlbWVudCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVOZXdFbGVtZW50RXhwcmVzc2lvbnMoZWxlbWVudDogU3VydmV5LklTdXJ2ZXlFbGVtZW50KSB7XG4gICAgdmFyIHN1cnZleSA9IG5ldyBTdXJ2ZXkuU3VydmV5TW9kZWwoKTtcbiAgICBzdXJ2ZXkuc2V0RGVzaWduTW9kZSh0cnVlKTtcbiAgICBpZiAoZWxlbWVudC5pc1BhZ2UpIHtcbiAgICAgIHN1cnZleS5hZGRQYWdlKDxTdXJ2ZXkuUGFnZU1vZGVsPmVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXJ2ZXkuYWRkTmV3UGFnZShcInAxXCIpO1xuICAgICAgc3VydmV5LnBhZ2VzWzBdLmFkZEVsZW1lbnQoPFN1cnZleS5JRWxlbWVudD5lbGVtZW50KTtcbiAgICB9XG4gICAgdmFyIGxvZ2ljID0gbmV3IFN1cnZleUxvZ2ljKHN1cnZleSk7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMubmV3UXVlc3Rpb25DaGFuZ2VkTmFtZXMpIHtcbiAgICAgIGxvZ2ljLnJlbmFtZVF1ZXN0aW9uKGtleSwgdGhpcy5uZXdRdWVzdGlvbkNoYW5nZWROYW1lc1trZXldKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QWxsUXVlc3Rpb25zKCk6IEFycmF5PGFueT4ge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3VydmV5LnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFkZEVsZW1lbnRzKHRoaXMuc3VydmV5LnBhZ2VzW2ldLmVsZW1lbnRzLCBmYWxzZSwgcmVzdWx0KTtcbiAgICB9XG4gICAgdGhpcy5hZGRFbGVtZW50cyh0aGlzLm5ld1BhbmVscywgZmFsc2UsIHJlc3VsdCk7XG4gICAgdGhpcy5hZGRFbGVtZW50cyh0aGlzLm5ld1F1ZXN0aW9ucywgZmFsc2UsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBbGxQYW5lbHMoKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdXJ2ZXkucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkRWxlbWVudHModGhpcy5zdXJ2ZXkucGFnZXNbaV0uZWxlbWVudHMsIHRydWUsIHJlc3VsdCk7XG4gICAgfVxuICAgIHRoaXMuYWRkRWxlbWVudHModGhpcy5uZXdQYW5lbHMsIHRydWUsIHJlc3VsdCk7XG4gICAgdGhpcy5hZGRFbGVtZW50cyh0aGlzLm5ld1F1ZXN0aW9ucywgdHJ1ZSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZEVsZW1lbnRzKFxuICAgIGVsZW1lbnRzOiBBcnJheTxhbnk+LFxuICAgIGlzUGFuZWw6IGJvb2xlYW4sXG4gICAgcmVzdWx0OiBBcnJheTxhbnk+XG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlbGVtZW50c1tpXS5pc1BhbmVsID09PSBpc1BhbmVsKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGVsZW1lbnRzW2ldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkRWxlbWVudHMoU3VydmV5SGVscGVyLmdldEVsZW1lbnRzKGVsZW1lbnRzW2ldKSwgaXNQYW5lbCwgcmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TmV3TmFtZSh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlID09IFwicGFnZVwiKSByZXR1cm4gU3VydmV5SGVscGVyLmdldE5ld1BhZ2VOYW1lKHRoaXMuc3VydmV5LnBhZ2VzKTtcbiAgICByZXR1cm4gdHlwZSA9PSBcInBhbmVsXCIgfHwgdHlwZSA9PSBcImZsb3dwYW5lbFwiXG4gICAgICA/IHRoaXMuZ2V0TmV3UGFuZWxOYW1lKClcbiAgICAgIDogdGhpcy5nZXROZXdRdWVzdGlvbk5hbWUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0TmV3UXVlc3Rpb25OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN1cnZleUhlbHBlci5nZXROZXdRdWVzdGlvbk5hbWUodGhpcy5nZXRBbGxRdWVzdGlvbnMoKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldE5ld1BhbmVsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuZ2V0TmV3UGFuZWxOYW1lKHRoaXMuZ2V0QWxsUGFuZWxzKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldE5ld05hbWVzQ29yZShlbGVtZW50OiBTdXJ2ZXkuSUVsZW1lbnQpIHtcbiAgICB2YXIgZWxUeXBlID0gZWxlbWVudFtcImdldFR5cGVcIl0oKTtcbiAgICB2YXIgbmV3TmFtZSA9IHRoaXMuZ2V0TmV3TmFtZShlbFR5cGUpO1xuICAgIGlmIChuZXdOYW1lICE9IGVsZW1lbnQubmFtZSkge1xuICAgICAgdGhpcy5uZXdRdWVzdGlvbkNoYW5nZWROYW1lc1tlbGVtZW50Lm5hbWVdID0gbmV3TmFtZTtcbiAgICAgIGVsZW1lbnQubmFtZSA9IG5ld05hbWU7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmlzUGFuZWwgfHwgZWxUeXBlID09IFwicGFnZVwiKSB7XG4gICAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICAgIHRoaXMubmV3UGFuZWxzLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG4gICAgICB2YXIgcGFuZWwgPSA8U3VydmV5LlBhbmVsTW9kZWxCYXNlPig8YW55PmVsZW1lbnQpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbC5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnNldE5ld05hbWVzQ29yZShwYW5lbC5lbGVtZW50c1tpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmV3UXVlc3Rpb25zLnB1c2goZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld0VsZW1lbnQoanNvbjogYW55KTogU3VydmV5LklFbGVtZW50IHtcbiAgICB2YXIgbmV3RWxlbWVudCA9IFN1cnZleS5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKGpzb25bXCJ0eXBlXCJdKTtcbiAgICBuZXcgU3VydmV5Lkpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBuZXdFbGVtZW50KTtcbiAgICB0aGlzLnNldE5ld05hbWVzKG5ld0VsZW1lbnQpO1xuICAgIHJldHVybiBuZXdFbGVtZW50O1xuICB9XG5cbiAgcHVibGljIGNvcHlFbGVtZW50KGVsZW1lbnQ6IFN1cnZleS5CYXNlKTogU3VydmV5LklFbGVtZW50IHtcbiAgICB2YXIganNvbiA9IG5ldyBTdXJ2ZXkuSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdChlbGVtZW50KTtcbiAgICBqc29uLnR5cGUgPSBlbGVtZW50LmdldFR5cGUoKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXdFbGVtZW50KGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgYSBxdWVzdGlvbiB0byB0aGUgYWN0aXZlIHBhZ2VcbiAgICogQHBhcmFtIHF1ZXN0aW9uIEEgY29waWVkIFN1cnZleS5RdWVzdGlvblxuICAgKi9cbiAgcHVibGljIGZhc3RDb3B5UXVlc3Rpb24ocXVlc3Rpb246IFN1cnZleS5CYXNlKSB7XG4gICAgdmFyIG5ld0VsZW1lbnQgPSB0aGlzLmNvcHlFbGVtZW50KHF1ZXN0aW9uKTtcbiAgICB0aGlzLmRvQ2xpY2tRdWVzdGlvbkNvcmUobmV3RWxlbWVudCwgXCJFTEVNRU5UX0NPUElFRFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZWxlbWVudCBpbiB0aGUgc3VydmV5LiBJdCBjYW4gYmUgYSBxdWVzdGlvbiwgYSBwYW5lbCBvciBhIHBhZ2UuXG4gICAqIEBwYXJhbSBlbGVtZW50IGEgc3VydmV5IGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlRWxlbWVudChlbGVtZW50OiBTdXJ2ZXkuQmFzZSkge1xuICAgIHRoaXMuZGVsZXRlT2JqZWN0KGVsZW1lbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlbGV0ZU9iamVjdENvcmUob2JqOiBhbnkpIHtcbiAgICB2YXIgb2JqVHlwZSA9IFN1cnZleUhlbHBlci5nZXRPYmplY3RUeXBlKG9iaik7XG4gICAgaWYgKG9ialR5cGUgPT0gT2JqVHlwZS5QYWdlKSB7XG4gICAgICB0aGlzLnN1cnZleS5yZW1vdmVQYWdlKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVsZXRlUGFuZWxPclF1ZXN0aW9uKG9iaiwgb2JqVHlwZSk7XG4gICAgfVxuICAgIHRoaXMuc2V0TW9kaWZpZWQoe1xuICAgICAgdHlwZTogXCJPQkpFQ1RfREVMRVRFRFwiLFxuICAgICAgdGFyZ2V0OiBvYmosXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVDb25kaXRpb25zT25SZW1vdmUob2JqKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWxldGVPYmplY3Qob2JqOiBhbnkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGVsZW1lbnQ6IG9iaixcbiAgICAgIGVsZW1lbnRUeXBlOiBTdXJ2ZXlIZWxwZXIuZ2V0T2JqZWN0VHlwZShvYmopLFxuICAgICAgYWxsb3dpbmc6IHRydWUsXG4gICAgfTtcbiAgICB0aGlzLm9uRWxlbWVudERlbGV0aW5nLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLmFsbG93aW5nKSByZXR1cm47XG4gICAgdGhpcy5kZWxldGVPYmplY3RDb3JlKG9iaik7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQ29uZGl0aW9uc09uUmVtb3ZlKG9iajogYW55KSB7XG4gICAgdmFyIG9ialR5cGUgPSBTdXJ2ZXlIZWxwZXIuZ2V0T2JqZWN0VHlwZShvYmopO1xuICAgIHZhciBxdWVzdGlvbnM7XG4gICAgaWYgKG9ialR5cGUgPT0gT2JqVHlwZS5RdWVzdGlvbikge1xuICAgICAgcXVlc3Rpb25zID0gW29ial07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSBvYmoucXVlc3Rpb25zO1xuICAgIH1cbiAgICBpZiAoIXF1ZXN0aW9ucykgcmV0dXJuO1xuICAgIC8vIFRPRE86IHJlbW92ZSBTdXJ2ZXlMb2dpYyBjYWxsIGhlcmVcbiAgICB2YXIgbG9naWMgPSBuZXcgU3VydmV5TG9naWMoPGFueT50aGlzLnN1cnZleSwgPGFueT50aGlzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgbG9naWMucmVtb3ZlUXVlc3Rpb24ocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0RWxlbWVudChlbGVtZW50OiBhbnkpIHt9XG5cbiAgcHJvdGVjdGVkIGRlbGV0ZVBhbmVsT3JRdWVzdGlvbihvYmo6IFN1cnZleS5CYXNlLCBvYmpUeXBlOiBPYmpUeXBlKTogdm9pZCB7XG4gICAgdmFyIHBhcmVudCA9IG9ialtcInBhcmVudFwiXTtcbiAgICB2YXIgZWxlbWVudHMgPSBwYXJlbnQuZWxlbWVudHM7XG4gICAgdmFyIG9iakluZGV4ID0gZWxlbWVudHMuaW5kZXhPZihvYmopO1xuICAgIGlmIChvYmpJbmRleCA9PSBlbGVtZW50cy5sZW5ndGggLSAxKSB7XG4gICAgICBvYmpJbmRleC0tO1xuICAgIH1cbiAgICBvYmpbXCJkZWxldGVcIl0oKTtcbiAgICB0aGlzLnNlbGVjdEVsZW1lbnQob2JqSW5kZXggPiAtMSA/IGVsZW1lbnRzW29iakluZGV4XSA6IHBhcmVudCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ2FuU2hvd09iamVjdFByb3BlcnR5KFxuICAgIG9iamVjdDogYW55LFxuICAgIHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIHNob3dNb2RlOiBzdHJpbmcsXG4gICAgcGFyZW50T2JqOiBhbnksXG4gICAgcGFyZW50UHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHlcbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBvYmo6IG9iamVjdCxcbiAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eSxcbiAgICAgIGNhblNob3c6IHRydWUsXG4gICAgICBzaG93TW9kZTogc2hvd01vZGUsXG4gICAgICBwYXJlbnRPYmo6IHBhcmVudE9iaixcbiAgICAgIHBhcmVudFByb3BlcnR5OiBwYXJlbnRQcm9wZXJ0eSxcbiAgICB9O1xuICAgIHRoaXMub25DYW5TaG93UHJvcGVydHkuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5jYW5TaG93O1xuICB9XG4gIHByb3RlY3RlZCBjYW5EZWxldGVJdGVtKFxuICAgIG9iamVjdDogYW55LFxuICAgIGl0ZW06IFN1cnZleS5CYXNlLFxuICAgIGFsbG93RGVsZXRlOiBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciBvcHRpb25zID0geyBvYmo6IG9iamVjdCwgaXRlbTogaXRlbSwgY2FuRGVsZXRlOiBhbGxvd0RlbGV0ZSB9O1xuICAgIHRoaXMub25DYW5EZWxldGVJdGVtLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuY2FuRGVsZXRlO1xuICB9XG4gIHByaXZhdGUgZ2V0RXJyb3JPblByb3BlcnR5Q2hhbmdpbmcoXG4gICAgb2JqOiBTdXJ2ZXkuQmFzZSxcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHByb3BlcnR5TmFtZSAhPT0gXCJuYW1lXCIpIHJldHVybiBudWxsO1xuICAgIHZhciBuZXdOYW1lID0gdGhpcy5nZW5lcmF0ZVVuaXF1ZU5hbWUob2JqLCB2YWx1ZSk7XG4gICAgaWYgKG5ld05hbWUgIT09IHZhbHVlKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicGUucHJvcGVydHlOYW1lSXNOb3RVbmlxdWVcIik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdlbmVyYXRlVW5pcXVlTmFtZShlbDogU3VydmV5LkJhc2UsIG5ld05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IGVsZW1lbnQ6IGVsLCBuYW1lOiBuZXdOYW1lLCBpc1VuaXF1ZTogdHJ1ZSB9O1xuICAgIGRvIHtcbiAgICAgIGlmICghb3B0aW9ucy5pc1VuaXF1ZSkge1xuICAgICAgICBvcHRpb25zLm5hbWUgPSBTdXJ2ZXlIZWxwZXIuZ2VuZXJhdGVOZXdOYW1lKG9wdGlvbnMubmFtZSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoIXRoaXMuaXNOYW1lVW5pcXVlKGVsLCBvcHRpb25zLm5hbWUpKSB7XG4gICAgICAgIG9wdGlvbnMubmFtZSA9IFN1cnZleUhlbHBlci5nZW5lcmF0ZU5ld05hbWUob3B0aW9ucy5uYW1lKTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMuaXNVbmlxdWUgPSB0cnVlO1xuICAgICAgdmFyIG9sZE5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgICB0aGlzLm9uR2VuZXJhdGVOZXdOYW1lLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgICBpZiAob2xkTmFtZSAhPSBvcHRpb25zLm5hbWUpIHtcbiAgICAgICAgb3B0aW9ucy5pc1VuaXF1ZSA9IHRoaXMuaXNOYW1lVW5pcXVlKGVsLCBvcHRpb25zLm5hbWUpO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKCFvcHRpb25zLmlzVW5pcXVlKTtcbiAgICByZXR1cm4gb3B0aW9ucy5uYW1lO1xuICB9XG4gIHByb3RlY3RlZCBpc05hbWVVbmlxdWUoZWw6IFN1cnZleS5CYXNlLCBuZXdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNOYW1lVW5pcXVlSW5BcnJheSh0aGlzLnN1cnZleS5wYWdlcywgZWwsIG5ld05hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmlzTmFtZVVuaXF1ZUluQXJyYXkodGhpcy5zdXJ2ZXkuZ2V0QWxsUGFuZWxzKCksIGVsLCBuZXdOYW1lKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5pc05hbWVVbmlxdWVJbkFycmF5KHRoaXMuc3VydmV5LmdldEFsbFF1ZXN0aW9ucygpLCBlbCwgbmV3TmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBpc05hbWVVbmlxdWVJbkFycmF5KFxuICAgIGVsZW1lbnRzOiBBcnJheTxhbnk+LFxuICAgIGVsOiBTdXJ2ZXkuQmFzZSxcbiAgICBuZXdOYW1lOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgZWwgPSBFZGl0YWJsZU9iamVjdC5nZXRPcmlnaW5hbE9iamVjdChlbCk7XG4gICAgbmV3TmFtZSA9IG5ld05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZWxlbWVudHNbaV0gIT0gZWwgJiYgZWxlbWVudHNbaV0ubmFtZS50b0xvd2VyQ2FzZSgpID09IG5ld05hbWUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGRvUHJvcGVydHlHcmlkQ2hhbmdlZCgpIHt9XG5cbiAgLy9pbXBsZW1lbnRzIElTdXJ2ZXlDcmVhdG9yT3B0aW9uc1xuICBnZXQgYWx3YXlTYXZlVGV4dEluUHJvcGVydHlFZGl0b3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFsd2F5U2F2ZVRleHRJblByb3BlcnR5RWRpdG9yc1ZhbHVlO1xuICB9XG4gIHNldCBhbHdheVNhdmVUZXh0SW5Qcm9wZXJ0eUVkaXRvcnModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmFsd2F5U2F2ZVRleHRJblByb3BlcnR5RWRpdG9yc1ZhbHVlID0gdmFsdWU7XG4gIH1cbiAgb25DYW5TaG93UHJvcGVydHlDYWxsYmFjayhcbiAgICBvYmplY3Q6IGFueSxcbiAgICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBzaG93TW9kZTogc3RyaW5nID0gbnVsbCxcbiAgICBwYXJlbnRPYmo6IGFueSxcbiAgICBwYXJlbnRQcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vbkNhblNob3dPYmplY3RQcm9wZXJ0eShcbiAgICAgIG9iamVjdCxcbiAgICAgIHByb3BlcnR5LFxuICAgICAgc2hvd01vZGUsXG4gICAgICBwYXJlbnRPYmosXG4gICAgICBwYXJlbnRQcm9wZXJ0eVxuICAgICk7XG4gIH1cbiAgb25DYW5EZWxldGVJdGVtQ2FsbGJhY2soXG4gICAgb2JqZWN0OiBhbnksXG4gICAgaXRlbTogU3VydmV5LkJhc2UsXG4gICAgYWxsb3dEZWxldGU6IGJvb2xlYW5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuRGVsZXRlSXRlbShvYmplY3QsIGl0ZW0sIGFsbG93RGVsZXRlKTtcbiAgfVxuICBvbkNvbGxlY3Rpb25JdGVtRGVsZXRpbmdDYWxsYmFjayhcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIGNvbGxlY3Rpb246IEFycmF5PFN1cnZleS5CYXNlPixcbiAgICBpdGVtOiBTdXJ2ZXkuQmFzZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5vbkNvbGxlY3Rpb25JdGVtRGVsZXRpbmcuaXNFbXB0eSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBvYmo6IG9iaixcbiAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eSxcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHkubmFtZSxcbiAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgYWxsb3dEZWxldGU6IHRydWUsXG4gICAgfTtcbiAgICB0aGlzLm9uQ29sbGVjdGlvbkl0ZW1EZWxldGluZy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93RGVsZXRlO1xuICB9XG4gIG9uSXRlbVZhbHVlQWRkZWRDYWxsYmFjayhcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIGl0ZW1WYWx1ZTogU3VydmV5Lkl0ZW1WYWx1ZSxcbiAgICBpdGVtVmFsdWVzOiBBcnJheTxTdXJ2ZXkuSXRlbVZhbHVlPlxuICApIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIG9iajogb2JqLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICBuZXdJdGVtOiBpdGVtVmFsdWUsXG4gICAgICBpdGVtVmFsdWVzOiBpdGVtVmFsdWVzLFxuICAgIH07XG4gICAgdGhpcy5vbkl0ZW1WYWx1ZUFkZGVkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgb25NYXRyaXhEcm9wZG93bkNvbHVtbkFkZGVkQ2FsbGJhY2soXG4gICAgbWF0cml4OiBTdXJ2ZXkuUXVlc3Rpb24sXG4gICAgY29sdW1uOiBTdXJ2ZXkuTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgY29sdW1uczogQXJyYXk8U3VydmV5Lk1hdHJpeERyb3Bkb3duQ29sdW1uPlxuICApIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgbmV3Q29sdW1uOiBjb2x1bW4sIG1hdHJpeDogbWF0cml4LCBjb2x1bW5zOiBjb2x1bW5zIH07XG4gICAgdGhpcy5vbk1hdHJpeENvbHVtbkFkZGVkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgb25TZXRQcm9wZXJ0eUVkaXRvck9wdGlvbnNDYWxsYmFjayhcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIGVkaXRvck9wdGlvbnM6IGFueVxuICApIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgb2JqOiBvYmosXG4gICAgICBlZGl0b3JPcHRpb25zOiBlZGl0b3JPcHRpb25zLFxuICAgIH07XG4gICAgdGhpcy5vblNldFByb3BlcnR5RWRpdG9yT3B0aW9ucy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG9uR2V0RXJyb3JUZXh0T25WYWxpZGF0aW9uQ2FsbGJhY2soXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgb2JqOiBTdXJ2ZXkuQmFzZSxcbiAgICB2YWx1ZTogYW55XG4gICk6IHN0cmluZyB7XG4gICAgdmFyIGVycm9yID0gdGhpcy5nZXRFcnJvck9uUHJvcGVydHlDaGFuZ2luZyhvYmosIHByb3BlcnR5TmFtZSwgdmFsdWUpO1xuICAgIGlmICghIWVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIG9iajogb2JqLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZXJyb3I6IFwiXCIsXG4gICAgfTtcbiAgICB0aGlzLm9uUHJvcGVydHlWYWxpZGF0aW9uQ3VzdG9tRXJyb3IuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5lcnJvcjtcbiAgfVxuICBvblZhbHVlQ2hhbmdpbmdDYWxsYmFjayhvcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLm9uUHJvcGVydHlWYWx1ZUNoYW5naW5nLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgcHVibGljIG9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgb2JqOiBhbnksXG4gICAgbmV3VmFsdWU6IGFueVxuICApIHtcbiAgICB2YXIgb2xkVmFsdWUgPSBvYmpbcHJvcGVydHkubmFtZV07XG4gICAgdGhpcy5zZXRNb2RpZmllZCh7XG4gICAgICB0eXBlOiBcIlBST1BFUlRZX0NIQU5HRURcIixcbiAgICAgIG5hbWU6IHByb3BlcnR5Lm5hbWUsXG4gICAgICB0YXJnZXQ6IG9iaixcbiAgICAgIG9sZFZhbHVlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSxcbiAgICB9KTtcbiAgICAvL1RPRE8gYWRkIGEgZmxhZyB0byBhIHByb3BlcnR5LCBtYXkgY2hhbmdlIG90aGVyIHByb3BlcnRpZXNcbiAgICBpZiAoXG4gICAgICBwcm9wZXJ0eS5uYW1lID09IFwiaGFzQ29tbWVudFwiIHx8XG4gICAgICBwcm9wZXJ0eS5uYW1lID09IFwiaGFzTm9uZVwiIHx8XG4gICAgICBwcm9wZXJ0eS5uYW1lID09IFwiaGFzT3RoZXJcIiB8fFxuICAgICAgcHJvcGVydHkubmFtZSA9PSBcImhhc1NlbGVjdEFsbFwiIHx8XG4gICAgICBwcm9wZXJ0eS5uYW1lID09IFwibG9jYWxlXCJcbiAgICApIHtcbiAgICAgIHRoaXMuZG9Qcm9wZXJ0eUdyaWRDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIG9uR2V0RWxlbWVudEVkaXRvclRpdGxlQ2FsbGJhY2sob2JqOiBTdXJ2ZXkuQmFzZSwgdGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRpdGxlO1xuICB9XG4gIG9uQ29uZGl0aW9uUXVlc3Rpb25zR2V0TGlzdENhbGxiYWNrKFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgZWRpdG9yOiBhbnksXG4gICAgbGlzdDogYW55W11cbiAgKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIG9iajogb2JqLFxuICAgICAgZWRpdG9yOiBlZGl0b3IsXG4gICAgICBsaXN0OiBsaXN0LFxuICAgIH07XG4gICAgdGhpcy5vbkNvbmRpdGlvblF1ZXN0aW9uc0dldExpc3QuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5saXN0ICE9PSBsaXN0KSB7XG4gICAgICBsaXN0LnNwbGljZSgwLCBsaXN0Lmxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMubGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBsaXN0LnB1c2gob3B0aW9ucy5saXN0W2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc3RhcnRVbmRvUmVkb1RyYW5zYWN0aW9uKCkge1xuICAgIC8vVE9ET1xuICB9XG4gIHN0b3BVbmRvUmVkb1RyYW5zYWN0aW9uKCkge1xuICAgIC8vVE9ET1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBVbmRvUmVkb01hbmFnZXIgfSBmcm9tIFwiLi91bmRvcmVkb21hbmFnZXJcIjtcblxuaWYgKCEha28ub3B0aW9ucykge1xuICBrby5vcHRpb25zLnVzZU9ubHlOYXRpdmVFdmVudHMgPSB0cnVlO1xufVxuXG5leHBvcnQgY2xhc3MgRHJhZ0Ryb3BUYXJnZXRFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHBhZ2U6IFN1cnZleS5QYWdlLFxuICAgIHB1YmxpYyB0YXJnZXQ6IGFueSxcbiAgICBwdWJsaWMgc291cmNlOiBhbnksXG4gICAgbmVzdGVkUGFuZWxEZXB0aDogbnVtYmVyID0gLTEsXG4gICAgcHJpdmF0ZSB1bmRvUmVkb01hbmFnZXI6IFVuZG9SZWRvTWFuYWdlclxuICApIHtcbiAgICBwYWdlLmRyYWdEcm9wU3RhcnQoc291cmNlLCB0YXJnZXQsIG5lc3RlZFBhbmVsRGVwdGgpO1xuICB9XG4gIHB1YmxpYyBtb3ZlVG8oXG4gICAgZGVzdGluYXRpb246IGFueSxcbiAgICBpc0JvdHRvbTogYm9vbGVhbixcbiAgICBpc0VkZ2U6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBib29sZWFuIHtcbiAgICAvL2NvbnNvbGUubG9nKCEhZGVzdGluYXRpb24gPyBkZXN0aW5hdGlvbi5uYW1lIDogXCJudWxsXCIpO1xuICAgIHJldHVybiB0aGlzLnBhZ2UuZHJhZ0Ryb3BNb3ZlVG8oZGVzdGluYXRpb24sIGlzQm90dG9tLCBpc0VkZ2UpO1xuICB9XG4gIHB1YmxpYyBkb0Ryb3AoKTogYW55IHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIHRoaXMuY2xlYXJDb3JlKCk7XG4gICAgdGhpcy51bmRvUmVkb01hbmFnZXIuc3RhcnRUcmFuc2FjdGlvbihcImRyYWcgZHJvcFwiKTtcbiAgICByZXN1bHQgPSB0aGlzLnBhZ2UuZHJhZ0Ryb3BGaW5pc2goKTtcbiAgICB0aGlzLnVuZG9SZWRvTWFuYWdlci5zdG9wVHJhbnNhY3Rpb24oKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLmNsZWFyQ29yZSgpO1xuICAgIHRoaXMucGFnZS5kcmFnRHJvcEZpbmlzaCh0cnVlKTtcbiAgfVxuICBwcml2YXRlIGNsZWFyQ29yZSgpIHtcbiAgICBpZiAoISF0aGlzLnRhcmdldCkge1xuICAgICAgdGhpcy50YXJnZXRbXCJrb0lzRHJhZ2dpbmdcIl0oZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRHJhZ0Ryb3BIZWxwZXIge1xuICBwdWJsaWMgc3RhdGljIGVkZ2VIZWlnaHQ6IG51bWJlciA9IDIwO1xuICBwdWJsaWMgc3RhdGljIG5lc3RlZFBhbmVsRGVwdGg6IG51bWJlciA9IC0xO1xuICBzdGF0aWMgZGF0YVN0YXJ0OiBzdHJpbmcgPSBcIntlbGVtZW50OlwiO1xuICBzdGF0aWMgZHJhZ0RhdGE6IGFueSA9IHsgdGV4dDogXCJcIiwganNvbjogbnVsbCB9O1xuICBzdGF0aWMgcHJldkV2ZW50ID0geyBlbGVtZW50OiBudWxsLCB4OiAtMSwgeTogLTEgfTtcbiAgcHJpdmF0ZSBvbk1vZGlmaWVkQ2FsbGJhY2s6IChvcHRpb25zPzogYW55KSA9PiBhbnk7XG4gIHByaXZhdGUgc2Nyb2xsYWJsZUVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBkZFRhcmdldDogRHJhZ0Ryb3BUYXJnZXRFbGVtZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBwcmV2Q29vcmRpbmF0ZXM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgc3RhdGljIGNvdW50ZXI6IG51bWJlciA9IDE7XG4gIHByaXZhdGUgaWQ6IG51bWJlciA9IERyYWdEcm9wSGVscGVyLmNvdW50ZXIrKztcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRhdGE6IFN1cnZleS5JU3VydmV5LFxuICAgIG9uTW9kaWZpZWRDYWxsYmFjazogKG9wdGlvbnM/OiBhbnkpID0+IGFueSxcbiAgICBwYXJlbnQ6IEhUTUxFbGVtZW50ID0gbnVsbCxcbiAgICBwcml2YXRlIHVuZG9SZWRvTWFuYWdlcjogVW5kb1JlZG9NYW5hZ2VyXG4gICkge1xuICAgIHRoaXMub25Nb2RpZmllZENhbGxiYWNrID0gb25Nb2RpZmllZENhbGxiYWNrO1xuICAgIHRoaXMuc2Nyb2xsYWJsZUVsZW1lbnQgPVxuICAgICAgcGFyZW50ICYmIDxIVE1MRWxlbWVudD5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNzY3JvbGxhYmxlRGl2XCIpO1xuICAgIHRoaXMucHJldkNvb3JkaW5hdGVzID0geyB4OiAtMSwgeTogLTEgfTtcbiAgfVxuICBwdWJsaWMgYXR0YWNoVG9FbGVtZW50KGRvbUVsZW1lbnQsIHN1cnZleUVsZW1lbnQpIHtcbiAgICB2YXIgaXNGbG93UGFuZWwgPVxuICAgICAgc3VydmV5RWxlbWVudC5pc1BhbmVsICYmXG4gICAgICB0eXBlb2Ygc3VydmV5RWxlbWVudC5nZXRDaGlsZHJlbkxheW91dFR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgc3VydmV5RWxlbWVudC5nZXRDaGlsZHJlbkxheW91dFR5cGUoKSA9PT0gXCJmbG93XCI7XG4gICAgdmFyIGlzRmxvd1BhbmVsSW5DaHJvbWUgPSBpc0Zsb3dQYW5lbCAmJiAhIXdpbmRvd1tcImNocm9tZVwiXTtcblxuICAgIGRvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IHN1cnZleUVsZW1lbnQua29Jc0RyYWdnaW5nKCkgPyAwLjQgOiAxO1xuICAgIGRvbUVsZW1lbnQuZHJhZ2dhYmxlID1cbiAgICAgIHN1cnZleUVsZW1lbnQuYWxsb3dpbmdPcHRpb25zLmFsbG93RHJhZ2dpbmcgJiYgIWlzRmxvd1BhbmVsO1xuICAgIGlmIChpc0Zsb3dQYW5lbEluQ2hyb21lKSB7XG4gICAgICBkb21FbGVtZW50Lm9ucGFzdGUgPSBmdW5jdGlvbiBkb1Bhc3RlKGUsIGVsKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdmFyIGNsaXBEYXRhID0gd2luZG93W1wiY2xpcGJvYXJkRGF0YVwiXTtcbiAgICAgICAgaWYgKCEhY2xpcERhdGEpIHtcbiAgICAgICAgICB2YXIgY29udGVudCA9IGNsaXBEYXRhLmdldERhdGEoXCJ0ZXh0XCIpO1xuICAgICAgICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB2YXIgc2VsT2JqID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdmFyIHNlbFJhbmdlID0gc2VsT2JqLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBzZWxSYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgICAgICAgICAgc2VsUmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKChlLm9yaWdpbmFsRXZlbnQgfHwgZSkuY2xpcGJvYXJkRGF0YSkge1xuICAgICAgICAgIGNvbnRlbnQgPSAoZS5vcmlnaW5hbEV2ZW50IHx8IGUpLmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIik7XG4gICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbnNlcnRUZXh0XCIsIGZhbHNlLCBjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgfVxuICAgIGRvbUVsZW1lbnQub25kcmFnb3ZlciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmICghc3VydmV5RWxlbWVudC5hbGxvd2luZ09wdGlvbnMuYWxsb3dEcmFnZ2luZykgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGlzRmxvd1BhbmVsKVxuICAgICAgICByZXR1cm4gc3VydmV5RWxlbWVudFxuICAgICAgICAgIC5kcmFnRHJvcEhlbHBlcigpXG4gICAgICAgICAgLmRvRHJhZ0Ryb3BPdmVyRmxvdyhlLCBzdXJ2ZXlFbGVtZW50KTtcbiAgICAgIGlmICghZVtcIm1hcmtFdmVudFwiXSkge1xuICAgICAgICBlW1wibWFya0V2ZW50XCJdID0gdHJ1ZTtcbiAgICAgICAgc3VydmV5RWxlbWVudC5kcmFnRHJvcEhlbHBlcigpLmRvRHJhZ0Ryb3BPdmVyKGUsIHN1cnZleUVsZW1lbnQsIHRydWUpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgICBkb21FbGVtZW50Lm9uZHJvcCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciBoZWxwZXIgPSBzdXJ2ZXlFbGVtZW50LmRyYWdEcm9wSGVscGVyKCk7XG4gICAgICB2YXIgcHJldmVudERlZmF1bHQgPSAhKFxuICAgICAgICBpc0Zsb3dQYW5lbCAmJlxuICAgICAgICAhIWhlbHBlci5kZFRhcmdldCAmJlxuICAgICAgICAhIWhlbHBlci5kZFRhcmdldC5zb3VyY2UgJiZcbiAgICAgICAgaGVscGVyLmRkVGFyZ2V0LnNvdXJjZS5wYXJlbnQgPT0gc3VydmV5RWxlbWVudFxuICAgICAgKTtcbiAgICAgIC8vRml4IHRoZSBidWcgZm9yIGNocm9tZSBpbiBjb250ZW50ZWRpdGFibGVcbiAgICAgIGlmIChcbiAgICAgICAgaXNGbG93UGFuZWxJbkNocm9tZSAmJlxuICAgICAgICAoIWhlbHBlci5kZFRhcmdldCB8fFxuICAgICAgICAgICFoZWxwZXIuZGRUYXJnZXQuZGVzdGluYXRpb24gfHxcbiAgICAgICAgICBoZWxwZXIuZGRUYXJnZXQuZGVzdGluYXRpb24uaXNMYXlvdXRUeXBlU3VwcG9ydGVkKFwiZmxvd1wiKSlcbiAgICAgICkge1xuICAgICAgICB2YXIgY29udGVudCA9IGUuZGF0YVRyYW5zZmVyLmdldERhdGEoXCJ0ZXh0XCIpO1xuICAgICAgICB2YXIgZHJvcFJhbmdlID0gbnVsbDtcbiAgICAgICAgaWYgKCEhZG9jdW1lbnQuY2FyZXRSYW5nZUZyb21Qb2ludCkge1xuICAgICAgICAgIGRyb3BSYW5nZSA9IGRvY3VtZW50LmNhcmV0UmFuZ2VGcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghIWRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQpIHtcbiAgICAgICAgICAgIGRyb3BSYW5nZSA9IGRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoISFkcm9wUmFuZ2UpIHtcbiAgICAgICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGlmIChzdXJ2ZXlFbGVtZW50W1wiaXNEcmFnU3RhcnRlZFwiXSkge1xuICAgICAgICAgICAgdmFyIHNlbE9iaiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGlmICghIXNlbE9iaiAmJiBzZWxPYmoucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIHNlbFJhbmdlID0gc2VsT2JqLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICAgIGlmICghIXNlbFJhbmdlKSB7XG4gICAgICAgICAgICAgICAgc2VsUmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBkcm9wUmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KSk7XG4gICAgICAgICAgbGV0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICBpZiAoISFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShkcm9wUmFuZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFlW1wibWFya0V2ZW50XCJdKSB7XG4gICAgICAgIGVbXCJtYXJrRXZlbnRcIl0gPSB0cnVlO1xuICAgICAgICBoZWxwZXIuZG9Ecm9wKGUsIHByZXZlbnREZWZhdWx0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICghaXNGbG93UGFuZWwpIHtcbiAgICAgIGRvbUVsZW1lbnQub25kcmFnc3RhcnQgPSBmdW5jdGlvbihlOiBEcmFnRXZlbnQpIHtcbiAgICAgICAgLy8gdmFyIHRhcmdldDogYW55ID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50O1xuICAgICAgICAvLyBpZiAoXG4gICAgICAgIC8vICAgISF0YXJnZXQgJiZcbiAgICAgICAgLy8gICAhIXRhcmdldC5jb250YWlucyAmJlxuICAgICAgICAvLyAgIHRhcmdldCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJlxuICAgICAgICAvLyAgIHRhcmdldC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KVxuICAgICAgICAvLyApIHtcbiAgICAgICAgLy8gICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyB9XG4gICAgICAgIGlmICghc3VydmV5RWxlbWVudC5hbGxvd2luZ09wdGlvbnMuYWxsb3dEcmFnZ2luZykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWVbXCJtYXJrRXZlbnRcIl0pIHtcbiAgICAgICAgICBlW1wibWFya0V2ZW50XCJdID0gdHJ1ZTtcbiAgICAgICAgICBzdXJ2ZXlFbGVtZW50LmRyYWdEcm9wSGVscGVyKCkuc3RhcnREcmFnUXVlc3Rpb24oZSwgc3VydmV5RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZS5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvbUVsZW1lbnQub25kcmFnc3RhcnQgPSBmdW5jdGlvbihlOiBEcmFnRXZlbnQpIHtcbiAgICAgICAgc3VydmV5RWxlbWVudC5pc0RyYWdTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFlW1wibWFya0V2ZW50XCJdKSB7XG4gICAgICAgICAgZVtcIm1hcmtFdmVudFwiXSA9IHRydWU7XG4gICAgICAgICAgaWYgKCFzdXJ2ZXlFbGVtZW50LmRyYWdEcm9wSGVscGVyKCkuZ2V0RGF0YShlKS50ZXh0KSB7XG4gICAgICAgICAgICBzdXJ2ZXlFbGVtZW50LmRyYWdEcm9wSGVscGVyKCkuc3RhcnREcmFnUXVlc3Rpb24oZSwgc3VydmV5RWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBkb21FbGVtZW50Lm9uZHJhZ2VuZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGRlbGV0ZSBzdXJ2ZXlFbGVtZW50W1wiaXNEcmFnU3RhcnRlZFwiXTtcbiAgICAgIHN1cnZleUVsZW1lbnQuZHJhZ0Ryb3BIZWxwZXIoKS5lbmQoKTtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgc3VydmV5KCk6IFN1cnZleS5TdXJ2ZXkge1xuICAgIHJldHVybiA8U3VydmV5LlN1cnZleT50aGlzLmRhdGE7XG4gIH1cbiAgcHVibGljIHN0YXJ0RHJhZ1F1ZXN0aW9uKGV2ZW50OiBEcmFnRXZlbnQsIGVsZW1lbnQ6IGFueSkge1xuICAgIHZhciBqc29uID0gbmV3IFN1cnZleS5Kc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KGVsZW1lbnQpO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gZWxlbWVudC5nZXRUeXBlKCk7XG4gICAgdGhpcy5wcmVwYXJlRGF0YShldmVudCwgZWxlbWVudC5uYW1lLCBqc29uLCBlbGVtZW50KTtcbiAgfVxuICBwdWJsaWMgc3RhcnREcmFnVG9vbGJveEl0ZW0oXG4gICAgZXZlbnQ6IERyYWdFdmVudCxcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIGVsZW1lbnRKc29uOiBhbnlcbiAgKSB7XG4gICAgdGhpcy5wcmVwYXJlRGF0YShldmVudCwgZWxlbWVudE5hbWUsIGVsZW1lbnRKc29uLCBudWxsKTtcbiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyBpc1N1cnZleURyYWdnaW5nKGV2ZW50OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIWV2ZW50KSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGRhdGEgPSB0aGlzLmdldERhdGEoZXZlbnQpLnRleHQ7XG4gICAgcmV0dXJuIGRhdGEgJiYgZGF0YS5pbmRleE9mKERyYWdEcm9wSGVscGVyLmRhdGFTdGFydCkgPT0gMDtcbiAgfVxuICBwdWJsaWMgZG9EcmFnRHJvcE92ZXIoXG4gICAgZXZlbnQ6IERyYWdFdmVudCxcbiAgICBlbGVtZW50OiBhbnksXG4gICAgaXNFZGdlOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgZXZlbnQgPSB0aGlzLmlzQ2FuRHJhZ0NvbnRpbnVlKGV2ZW50LCBlbGVtZW50KTtcbiAgICBpZiAoIWV2ZW50KSByZXR1cm47XG4gICAgdmFyIGJvdHRvbUluZm8gPSB0aGlzLmlzQm90dG9tKGV2ZW50KTtcbiAgICBpZiAoZWxlbWVudC5pc1BhZ2UgJiYgZWxlbWVudC5lbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgbGFzdEVsID0gZWxlbWVudC5lbGVtZW50c1tlbGVtZW50LmVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKCF0aGlzLmlzQm90dG9tVGhhbkVsZW1lbnQoZXZlbnQsIGxhc3RFbCkpIHJldHVybjtcbiAgICAgIGVsZW1lbnQgPSBsYXN0RWw7XG4gICAgICBpc0VkZ2UgPSB0cnVlO1xuICAgICAgYm90dG9tSW5mby5pc0VkZ2UgPSB0cnVlO1xuICAgICAgYm90dG9tSW5mby5pc0JvdHRvbSA9IHRydWU7XG4gICAgfVxuXG4gICAgaXNFZGdlID0gZWxlbWVudC5pc1BhbmVsID8gaXNFZGdlICYmIGJvdHRvbUluZm8uaXNFZGdlIDogdHJ1ZTtcbiAgICBpZiAoZWxlbWVudC5pc1BhbmVsICYmICFpc0VkZ2UgJiYgZWxlbWVudC5lbGVtZW50cy5sZW5ndGggPiAwKSByZXR1cm47XG4gICAgdGhpcy5kZFRhcmdldC5tb3ZlVG8oZWxlbWVudCwgYm90dG9tSW5mby5pc0JvdHRvbSwgaXNFZGdlKTtcbiAgfVxuICBwdWJsaWMgZG9EcmFnRHJvcE92ZXJGbG93KGV2ZW50OiBEcmFnRXZlbnQsIGVsZW1lbnQ6IGFueSkge1xuICAgIGlmICghIXRoaXMuZGRUYXJnZXQpIHtcbiAgICAgIGV2ZW50ID0gdGhpcy5pc0NhbkRyYWdDb250aW51ZShldmVudCwgZWxlbWVudCk7XG4gICAgICBpZiAoIWV2ZW50KSByZXR1cm4gdHJ1ZTtcbiAgICAgIHZhciBib3R0b21JbmZvID0gdGhpcy5pc0JvdHRvbShldmVudCk7XG4gICAgICByZXR1cm4gdGhpcy5kZFRhcmdldC5tb3ZlVG8oXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIGJvdHRvbUluZm8uaXNCb3R0b20sXG4gICAgICAgIGJvdHRvbUluZm8uaXNFZGdlXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGlzQ2FuRHJhZ0NvbnRpbnVlKGV2ZW50OiBEcmFnRXZlbnQsIGVsZW1lbnQ6IGFueSk6IERyYWdFdmVudCB7XG4gICAgZXZlbnQgPSB0aGlzLmdldEV2ZW50KGV2ZW50KTtcbiAgICBpZiAodGhpcy5pc1NhbWVDb29yZGluYXRlcyhldmVudCkpIHJldHVybiBudWxsO1xuICAgIHRoaXMuY2hlY2tTY3JvbGxZKGV2ZW50KTtcbiAgICBpZiAoXG4gICAgICAhZWxlbWVudCB8fFxuICAgICAgIXRoaXMuaXNTdXJ2ZXlEcmFnZ2luZyhldmVudCkgfHxcbiAgICAgIHRoaXMuaXNTYW1lUGxhY2UoZXZlbnQsIGVsZW1lbnQpXG4gICAgKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG4gIHB1YmxpYyBlbmQoKSB7XG4gICAgaWYgKHRoaXMuZGRUYXJnZXQpIHtcbiAgICAgIHRoaXMuZGRUYXJnZXQuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5pc1Njcm9sbFN0b3AgPSB0cnVlO1xuICAgIHRoaXMuY2xlYXJEYXRhKCk7XG4gIH1cbiAgcHVibGljIGdldCBpc01vdmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZFRhcmdldCAmJiB0aGlzLmRkVGFyZ2V0LnNvdXJjZTtcbiAgfVxuICBwdWJsaWMgZG9Ecm9wKGV2ZW50OiBEcmFnRXZlbnQsIHByZXZlZERlZmF1bHQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzU3VydmV5RHJhZ2dpbmcoZXZlbnQpKSB7XG4gICAgICBpZiAocHJldmVkRGVmYXVsdCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnJlYWRPbmx5KSB7XG4gICAgICAgIHZhciBuZXdFbGVtZW50ID0gdGhpcy5kZFRhcmdldC5kb0Ryb3AoKTtcbiAgICAgICAgaWYgKHRoaXMub25Nb2RpZmllZENhbGxiYWNrKVxuICAgICAgICAgIHRoaXMub25Nb2RpZmllZENhbGxiYWNrKHtcbiAgICAgICAgICAgIHR5cGU6IFwiRE9fRFJPUFwiLFxuICAgICAgICAgICAgcGFnZTogdGhpcy5kZFRhcmdldC5wYWdlLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLmRkVGFyZ2V0LnNvdXJjZSxcbiAgICAgICAgICAgIHRhcmdldDogdGhpcy5kZFRhcmdldC50YXJnZXQsXG4gICAgICAgICAgICBuZXdFbGVtZW50OiB0aGlzLmRkVGFyZ2V0LnNvdXJjZSA/IG51bGwgOiBuZXdFbGVtZW50LFxuICAgICAgICAgICAgbW92ZVRvUGFyZW50OiBuZXdFbGVtZW50LnBhcmVudCxcbiAgICAgICAgICAgIG1vdmVUb0luZGV4OiAhIW5ld0VsZW1lbnQucGFyZW50XG4gICAgICAgICAgICAgID8gbmV3RWxlbWVudC5wYXJlbnQuZWxlbWVudHMuaW5kZXhPZihuZXdFbGVtZW50KVxuICAgICAgICAgICAgICA6IC0xXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbmV3RWxlbWVudC51cGRhdGVFbGVtZW50Q3NzICYmIG5ld0VsZW1lbnQudXBkYXRlRWxlbWVudENzcygpO1xuICAgICAgICAgIG5ld0VsZW1lbnRbXCJrb0VsZW1lbnRUeXBlXCJdICYmIG5ld0VsZW1lbnRbXCJrb0VsZW1lbnRUeXBlXCJdLm5vdGlmeVN1YnNjcmliZXJzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZW5kKCk7XG4gIH1cbiAgcHVibGljIGRvTGVhdmVQYWdlKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBpZiAoISF0aGlzLmRkVGFyZ2V0KSB7XG4gICAgICB0aGlzLmRkVGFyZ2V0Lm1vdmVUbyhudWxsLCBmYWxzZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY3JlYXRlVGFyZ2V0RWxlbWVudChlbGVtZW50TmFtZTogc3RyaW5nLCBqc29uOiBhbnkpOiBhbnkge1xuICAgIGlmICghZWxlbWVudE5hbWUgfHwgIWpzb24pIHJldHVybiBudWxsO1xuICAgIHZhciB0YXJnZXRFbGVtZW50ID0gbnVsbDtcbiAgICB0YXJnZXRFbGVtZW50ID0gU3VydmV5LlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoanNvbltcInR5cGVcIl0pO1xuICAgIG5ldyBTdXJ2ZXkuSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHRhcmdldEVsZW1lbnQpO1xuICAgIHRhcmdldEVsZW1lbnQubmFtZSA9IGVsZW1lbnROYW1lO1xuICAgIGlmICh0YXJnZXRFbGVtZW50W1wic2V0U3VydmV5SW1wbFwiXSkge1xuICAgICAgdGFyZ2V0RWxlbWVudFtcInNldFN1cnZleUltcGxcIl0odGhpcy5zdXJ2ZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRFbGVtZW50W1wic2V0RGF0YVwiXSh0aGlzLnN1cnZleSk7XG4gICAgfVxuICAgIHRhcmdldEVsZW1lbnQucmVuZGVyV2lkdGggPSBcIjEwMCVcIjtcbiAgICB0YXJnZXRFbGVtZW50W1wia29Jc0RyYWdnaW5nXCJdKHRydWUpO1xuICAgIHJldHVybiB0YXJnZXRFbGVtZW50O1xuICB9XG4gIHByaXZhdGUgaXNCb3R0b20oZXZlbnQ6IERyYWdFdmVudCk6IGFueSB7XG4gICAgZXZlbnQgPSB0aGlzLmdldEV2ZW50KGV2ZW50KTtcbiAgICB2YXIgaGVpZ2h0ID0gPG51bWJlcj5ldmVudC5jdXJyZW50VGFyZ2V0W1wiY2xpZW50SGVpZ2h0XCJdO1xuICAgIHZhciB5ID0gZXZlbnQub2Zmc2V0WTtcbiAgICBpZiAoZXZlbnQuaGFzT3duUHJvcGVydHkoXCJsYXllclhcIikpIHtcbiAgICAgIHkgPSBldmVudFtcImxheWVyWVwiXSAtIDxudW1iZXI+ZXZlbnQuY3VycmVudFRhcmdldFtcIm9mZnNldFRvcFwiXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzQm90dG9tOiB5ID4gaGVpZ2h0IC8gMixcbiAgICAgIGlzRWRnZTpcbiAgICAgICAgeSA8PSBEcmFnRHJvcEhlbHBlci5lZGdlSGVpZ2h0IHx8XG4gICAgICAgIGhlaWdodCAtIHkgPD0gRHJhZ0Ryb3BIZWxwZXIuZWRnZUhlaWdodFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBpc0JvdHRvbVRoYW5FbGVtZW50KGV2ZW50OiBEcmFnRXZlbnQsIGxhc3RFbDogYW55KTogYm9vbGVhbiB7XG4gICAgdmFyIGVsID0gbGFzdEVsLnJlbmRlcmVkRWxlbWVudDtcbiAgICBpZiAoIWVsKSByZXR1cm4gZmFsc2U7XG4gICAgZXZlbnQgPSB0aGlzLmdldEV2ZW50KGV2ZW50KTtcbiAgICB2YXIgZWxZID0gPG51bWJlcj5lbC5vZmZzZXRUb3AgKyA8bnVtYmVyPmVsLmNsaWVudEhlaWdodDtcbiAgICB2YXIgeSA9IGV2ZW50Lm9mZnNldFk7XG4gICAgaWYgKGV2ZW50Lmhhc093blByb3BlcnR5KFwibGF5ZXJYXCIpKSB7XG4gICAgICB5ID0gZXZlbnRbXCJsYXllcllcIl0gLSA8bnVtYmVyPmV2ZW50LmN1cnJlbnRUYXJnZXRbXCJvZmZzZXRUb3BcIl07XG4gICAgfVxuICAgIHJldHVybiB5ID4gZWxZO1xuICB9XG4gIHByaXZhdGUgaXNTYW1lQ29vcmRpbmF0ZXMoZXZlbnQ6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPVxuICAgICAgTWF0aC5hYnMoZXZlbnQucGFnZVggLSB0aGlzLnByZXZDb29yZGluYXRlcy54KSA+IDUgfHxcbiAgICAgIE1hdGguYWJzKGV2ZW50LnBhZ2VZIC0gdGhpcy5wcmV2Q29vcmRpbmF0ZXMueSkgPiA1O1xuICAgIGlmIChyZXMpIHtcbiAgICAgIHRoaXMucHJldkNvb3JkaW5hdGVzLnggPSBldmVudC5wYWdlWDtcbiAgICAgIHRoaXMucHJldkNvb3JkaW5hdGVzLnkgPSBldmVudC5wYWdlWTtcbiAgICB9XG4gICAgcmV0dXJuICFyZXM7XG4gIH1cbiAgcHJpdmF0ZSBpc1NhbWVQbGFjZShldmVudDogRHJhZ0V2ZW50LCBlbGVtZW50OiBhbnkpOiBib29sZWFuIHtcbiAgICB2YXIgcHJldiA9IERyYWdEcm9wSGVscGVyLnByZXZFdmVudDtcbiAgICBpZiAoXG4gICAgICBwcmV2LmVsZW1lbnQgIT0gZWxlbWVudCB8fFxuICAgICAgTWF0aC5hYnMoZXZlbnQuY2xpZW50WCAtIHByZXYueCkgPiA1IHx8XG4gICAgICBNYXRoLmFicyhldmVudC5jbGllbnRZIC0gcHJldi55KSA+IDVcbiAgICApIHtcbiAgICAgIHByZXYuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICBwcmV2LnggPSBldmVudC5jbGllbnRYO1xuICAgICAgcHJldi55ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBpc1Njcm9sbFN0b3A6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIHN0YXRpYyBTY3JvbGxEZWxheTogbnVtYmVyID0gMzA7XG4gIHByaXZhdGUgc3RhdGljIFNjcm9sbE9mZnNldDogbnVtYmVyID0gMTAwO1xuICBwcml2YXRlIGNoZWNrU2Nyb2xsWShlOiBEcmFnRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuc2Nyb2xsYWJsZUVsZW1lbnQpIHJldHVybjtcbiAgICB2YXIgeSA9IHRoaXMuZ2V0U2Nyb2xsYWJsZUVsZW1lbnRQb3NZKGUpO1xuICAgIGlmICh5IDwgMCkgcmV0dXJuO1xuICAgIHRoaXMuaXNTY3JvbGxTdG9wID0gdHJ1ZTtcbiAgICB2YXIgaGVpZ2h0ID0gPG51bWJlcj50aGlzLnNjcm9sbGFibGVFbGVtZW50W1wiY2xpZW50SGVpZ2h0XCJdO1xuICAgIGlmICh5IDwgRHJhZ0Ryb3BIZWxwZXIuU2Nyb2xsT2Zmc2V0ICYmIHkgPj0gMCkge1xuICAgICAgdGhpcy5pc1Njcm9sbFN0b3AgPSBmYWxzZTtcbiAgICAgIHRoaXMuZG9TY3JvbGxZKC0xKTtcbiAgICB9XG4gICAgaWYgKGhlaWdodCAtIHkgPCBEcmFnRHJvcEhlbHBlci5TY3JvbGxPZmZzZXQgJiYgaGVpZ2h0ID49IHkpIHtcbiAgICAgIHRoaXMuaXNTY3JvbGxTdG9wID0gZmFsc2U7XG4gICAgICB0aGlzLmRvU2Nyb2xsWSgxKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBkb1Njcm9sbFkoc3RlcDogbnVtYmVyKSB7XG4gICAgdmFyIGVsID0gdGhpcy5zY3JvbGxhYmxlRWxlbWVudDtcbiAgICB2YXIgc2Nyb2xsWSA9IGVsLnNjcm9sbFRvcCArIHN0ZXA7XG4gICAgaWYgKHNjcm9sbFkgPCAwKSB7XG4gICAgICB0aGlzLmlzU2Nyb2xsU3RvcCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsLnNjcm9sbFRvcCA9IHNjcm9sbFk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICghdGhpcy5pc1Njcm9sbFN0b3ApIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuZG9TY3JvbGxZKHN0ZXApO1xuICAgICAgfSwgRHJhZ0Ryb3BIZWxwZXIuU2Nyb2xsRGVsYXkpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFNjcm9sbGFibGVFbGVtZW50UG9zWShlOiBEcmFnRXZlbnQpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5zY3JvbGxhYmxlRWxlbWVudCB8fCAhZS5jdXJyZW50VGFyZ2V0KSByZXR1cm4gLTE7XG4gICAgdmFyIGVsID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgIHZhciBvZmZzZXRUb3AgPSAwO1xuICAgIHdoaWxlIChlbCAmJiBlbCAhPSB0aGlzLnNjcm9sbGFibGVFbGVtZW50KSB7XG4gICAgICBvZmZzZXRUb3AgKz0gPG51bWJlcj5lbFtcIm9mZnNldFRvcFwiXTtcbiAgICAgIGVsID0gZWxbXCJvZmZzZXRQYXJlbnRcIl07XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBlLm9mZnNldFkgK1xuICAgICAgPG51bWJlcj5lLmN1cnJlbnRUYXJnZXRbXCJvZmZzZXRUb3BcIl0gLVxuICAgICAgdGhpcy5zY3JvbGxhYmxlRWxlbWVudC5vZmZzZXRUb3AgLVxuICAgICAgdGhpcy5zY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxUb3BcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0RXZlbnQoZXZlbnQ6IERyYWdFdmVudCk6IERyYWdFdmVudCB7XG4gICAgcmV0dXJuIGV2ZW50W1wib3JpZ2luYWxFdmVudFwiXSA/IGV2ZW50W1wib3JpZ2luYWxFdmVudFwiXSA6IGV2ZW50O1xuICB9XG4gIHByaXZhdGUgZ2V0WShlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XG4gICAgdmFyIHJlc3VsdCA9IDA7XG5cbiAgICB3aGlsZSAoZWxlbWVudCkge1xuICAgICAgcmVzdWx0ICs9IGVsZW1lbnQub2Zmc2V0VG9wIC0gZWxlbWVudC5zY3JvbGxUb3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgICAgIGVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBwcmVwYXJlRGF0YShcbiAgICBldmVudDogRHJhZ0V2ZW50LFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gICAganNvbjogYW55LFxuICAgIHNvdXJjZTogU3VydmV5LklFbGVtZW50XG4gICkge1xuICAgIHZhciBzdHIgPSBEcmFnRHJvcEhlbHBlci5kYXRhU3RhcnQgKyBlbGVtZW50TmFtZSArIFwifVwiO1xuICAgIHRoaXMuc2V0RGF0YShldmVudCwgc3RyKTtcbiAgICB2YXIgdGFyZ2V0RWxlbWVudCA9IHRoaXMuY3JlYXRlVGFyZ2V0RWxlbWVudChlbGVtZW50TmFtZSwganNvbik7XG4gICAgdGhpcy5kZFRhcmdldCA9IG5ldyBEcmFnRHJvcFRhcmdldEVsZW1lbnQoXG4gICAgICA8U3VydmV5LlBhZ2U+dGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2UsXG4gICAgICB0YXJnZXRFbGVtZW50LFxuICAgICAgc291cmNlLFxuICAgICAgRHJhZ0Ryb3BIZWxwZXIubmVzdGVkUGFuZWxEZXB0aCxcbiAgICAgIHRoaXMudW5kb1JlZG9NYW5hZ2VyXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHNldERhdGEoZXZlbnQ6IERyYWdFdmVudCwgdGV4dDogc3RyaW5nKSB7XG4gICAgaWYgKGV2ZW50W1wib3JpZ2luYWxFdmVudFwiXSkge1xuICAgICAgZXZlbnQgPSBldmVudFtcIm9yaWdpbmFsRXZlbnRcIl07XG4gICAgfVxuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKFwiVGV4dFwiLCB0ZXh0KTtcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJjb3B5XCI7XG4gICAgfVxuICAgIERyYWdEcm9wSGVscGVyLmRyYWdEYXRhID0geyB0ZXh0OiB0ZXh0IH07XG4gIH1cbiAgcHJpdmF0ZSBnZXREYXRhKGV2ZW50OiBEcmFnRXZlbnQpOiBhbnkge1xuICAgIGlmIChldmVudFtcIm9yaWdpbmFsRXZlbnRcIl0pIHtcbiAgICAgIGV2ZW50ID0gZXZlbnRbXCJvcmlnaW5hbEV2ZW50XCJdO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICB2YXIgdGV4dCA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwiVGV4dFwiKTtcbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIERyYWdEcm9wSGVscGVyLmRyYWdEYXRhLnRleHQgPSB0ZXh0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gRHJhZ0Ryb3BIZWxwZXIuZHJhZ0RhdGE7XG4gIH1cbiAgcHJpdmF0ZSBjbGVhckRhdGEoKSB7XG4gICAgdGhpcy5kZFRhcmdldCA9IG51bGw7IC8vIFdlIHNob3VsZCByZXNldCBkZFRhcmdldCB0byBudWxsIGR1ZSB0byB0aGUgaHR0cHM6Ly9zdXJ2ZXlqcy5hbnN3ZXJkZXNrLmlvL3RpY2tldC9kZXRhaWxzL1QxMDAzIC0gb25RdWVzdGlvbkFkZGVkIG5vdCBmaXJlZCBhZnRlciBEJkRcbiAgICBEcmFnRHJvcEhlbHBlci5kcmFnRGF0YSA9IHsgdGV4dDogXCJcIiwganNvbjogbnVsbCB9O1xuICAgIHZhciBwcmV2ID0gRHJhZ0Ryb3BIZWxwZXIucHJldkV2ZW50O1xuICAgIHByZXYuZWxlbWVudCA9IG51bGw7XG4gICAgcHJldi54ID0gLTE7XG4gICAgcHJldi55ID0gLTE7XG4gICAgdGhpcy5wcmV2Q29vcmRpbmF0ZXMueCA9IC0xO1xuICAgIHRoaXMucHJldkNvb3JkaW5hdGVzLnkgPSAtMTtcbiAgfVxuICBwdWJsaWMgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbn1cbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQge1xuICBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9ucyxcbiAgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlLFxufSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlPYmplY3RzIH0gZnJvbSBcIi4vc3VydmV5T2JqZWN0c1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25Db252ZXJ0ZXIgfSBmcm9tIFwiLi9xdWVzdGlvbmNvbnZlcnRlclwiO1xuaW1wb3J0IHtcbiAgUHJvcGVydHlHcmlkT2JqZWN0RWRpdG9yTW9kZWwsXG4gIFN1cnZleVByb3BlcnR5RWRpdG9yU2hvd1dpbmRvdyxcbiAgU3VydmV5RWxlbWVudEVkaXRvclRhYk1vZGVsLFxufSBmcm9tIFwiLi9xdWVzdGlvbkVkaXRvcnMvcXVlc3Rpb25FZGl0b3JcIjtcbmltcG9ydCB7IFN1cnZleVRleHRXb3JrZXIgfSBmcm9tIFwiLi90ZXh0V29ya2VyXCI7XG5pbXBvcnQgeyBVbmRvUmVkb01hbmFnZXIsIElVbmRvUmVkb0NoYW5nZSB9IGZyb20gXCIuL3VuZG9yZWRvbWFuYWdlclwiO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyLCBPYmpUeXBlIH0gZnJvbSBcIi4vc3VydmV5SGVscGVyXCI7XG5pbXBvcnQgeyBEcmFnRHJvcEhlbHBlciB9IGZyb20gXCIuL2RyYWdkcm9waGVscGVyXCI7XG5pbXBvcnQgeyBRdWVzdGlvblRvb2xib3ggfSBmcm9tIFwiLi90b29sYm94XCI7XG5pbXBvcnQgeyBTdXJ2ZXlKU09ONSB9IGZyb20gXCIuL2pzb241XCI7XG52YXIgdGVtcGxhdGVFZGl0b3JIdG1sID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi90ZW1wbGF0ZXMvZW50cnkuaHRtbFwiKTtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQge1xuICBTdXJ2ZXlGb3JEZXNpZ25lcixcbiAgY3JlYXRlQWZ0ZXJSZW5kZXJIYW5kbGVyLFxuICBjcmVhdGVBZnRlclJlbmRlclBhZ2VIYW5kbGVyLFxuICBjcmVhdGVBZnRlclJlbmRlckhlYWRlckhhbmRsZXIsXG59IGZyb20gXCIuL3N1cnZleWpzT2JqZWN0c1wiO1xuaW1wb3J0IHsgU3R5bGVzTWFuYWdlciB9IGZyb20gXCIuL3N0eWxlc21hbmFnZXJcIjtcbmltcG9ydCB7IGl0ZW1BZG9ybmVyIH0gZnJvbSBcIi4vYWRvcm5lcnMvaXRlbS1lZGl0b3JcIjtcbmltcG9ydCB7IFN1cnZleUxpdmVUZXN0ZXIgfSBmcm9tIFwiLi90YWJzL3Rlc3RcIjtcbmltcG9ydCB7IFRyYW5zbGF0aW9uIH0gZnJvbSBcIi4vdGFicy90cmFuc2xhdGlvblwiO1xuaW1wb3J0IHsgU3VydmV5TG9naWMgfSBmcm9tIFwiLi90YWJzL2xvZ2ljXCI7XG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCIuL2NvbW1hbmRzXCI7XG5cbmltcG9ydCB7IFBhZ2VzRWRpdG9yIH0gZnJvbSBcIi4vcGFnZXMtZWRpdG9yXCI7XG5pbXBvcnQgeyBpc1Byb3BlcnR5VmlzaWJsZSB9IGZyb20gXCIuL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlPYmplY3RQcm9wZXJ0eSB9IGZyb20gXCIuL29iamVjdFByb3BlcnR5XCI7XG5pbXBvcnQgeyBDcmVhdG9yQmFzZSB9IGZyb20gXCIuL2NyZWF0b3ItYmFzZVwiO1xuaW1wb3J0IHsgSUFjdGlvbiB9IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IEVkaXRhYmxlT2JqZWN0IH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JzL2VkaXRhYmxlT2JqZWN0XCI7XG5cbnR5cGUgQ29udGFpbmVyTG9jYXRpb24gPSBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwidG9wXCIgfCBcIm5vbmVcIiB8IGJvb2xlYW47XG5cbi8qKlxuICogU3VydmV5IENyZWF0b3IgaXMgV1lTSVdZRyBlZGl0b3IuXG4gKi9cblxuZXhwb3J0IGNsYXNzIFN1cnZleUNyZWF0b3JcbiAgZXh0ZW5kcyBDcmVhdG9yQmFzZTxTdXJ2ZXlGb3JEZXNpZ25lcj5cbiAgaW1wbGVtZW50cyBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9uc1xue1xuICBwdWJsaWMgc3RhdGljIGRlZmF1bHROZXdTdXJ2ZXlUZXh0OiBzdHJpbmcgPSBcInsgcGFnZXM6IFsgeyBuYW1lOiAncGFnZTEnfV0gfVwiO1xuICBwcml2YXRlIHJlbmRlcmVkRWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBxdWVzdGlvbkVkaXRvcldpbmRvdzogU3VydmV5UHJvcGVydHlFZGl0b3JTaG93V2luZG93O1xuXG4gIHByaXZhdGUgc3VydmV5TGl2ZTogU3VydmV5TGl2ZVRlc3RlcjtcbiAgcHJpdmF0ZSB0cmFuc2xhdGlvblZhbHVlOiBUcmFuc2xhdGlvbjtcbiAgcHJpdmF0ZSBsb2dpY1ZhbHVlOiBTdXJ2ZXlMb2dpYztcbiAgcHJvdGVjdGVkIHN1cnZleU9iamVjdHM6IFN1cnZleU9iamVjdHM7XG4gIHByaXZhdGUgdG9vbGJveFZhbHVlOiBRdWVzdGlvblRvb2xib3g7XG4gIHB1YmxpYyB1bmRvUmVkb01hbmFnZXI6IFVuZG9SZWRvTWFuYWdlcjtcbiAgcHJpdmF0ZSBzYXZlU3VydmV5RnVuY1ZhbHVlOiAoXG4gICAgbm86IG51bWJlcixcbiAgICBvblNhdmVDYWxsYmFjazogKG5vOiBudW1iZXIsIGlzU3VjY2VzczogYm9vbGVhbikgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIHByaXZhdGUgc3RhdGVWYWx1ZTogc3RyaW5nID0gXCJcIjtcbiAgcHJpdmF0ZSBkcmFnRHJvcEhlbHBlcjogRHJhZ0Ryb3BIZWxwZXIgPSBudWxsO1xuICBwcml2YXRlIGtvU2hvd1N1cnZleVRpdGxlOiBrby5PYnNlcnZhYmxlPFwiaWZlbnRlcmVkXCIgfCBcImFsd2F5c1wiIHwgXCJuZXZlclwiPjtcbiAgcHJpdmF0ZSBrb0FsbG93Q29udHJvbFN1cnZleVRpdGxlVmlzaWJpbGl0eToga28uT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgcHJpdmF0ZSBjbG9zZU1vZGFsT3V0c2lkZVZhbHVlOiBcIm9mZlwiIHwgXCJjYW5jZWxcIiB8IFwiYXBwbHlcIiA9IFwib2ZmXCI7XG4gIHByaXZhdGUgcGFnZUVkaXRNb2RlVmFsdWU6IFwic3RhbmRhcmRcIiB8IFwic2luZ2xlXCIgPSBcInN0YW5kYXJkXCI7XG4gIHByaXZhdGUgc2hvd0Ryb3Bkb3duUGFnZVNlbGVjdG9yVmFsdWU6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIHNob3dBcHBseUJ1dHRvblZhbHVlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBoaWRlRXhwcmVzc2lvbkhlYWRlclZhbHVlOiBrby5PYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSAoZGVmYXVsdCB2YWx1ZSkgdGhlIGNyZWF0b3Igc2Nyb2xscyB0byBhIG5ldyBlbGVtZW50LiBBIG5ldyBlbGVtZW50IGNhbiBiZSBhZGRlZCBmcm9tIFRvb2xib3ggb3IgYnkgY29weWluZy5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxUb05ld0VsZW1lbnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGFzc2lnbiB0byB0aGUgc3VydmV5LnN1cnZleUlkIHByb3BlcnR5IG9uIHNob3dpbmcgaW4gdGhlIFwiRW1iZWQgU3VydmV5XCIgdGFiLlxuICAgKiBAc2VlIHNob3dFbWJlZGRlZFN1cnZleVRhYlxuICAgKi9cbiAgcHVibGljIHN1cnZleUlkOiBzdHJpbmcgPSBudWxsO1xuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhc3NpZ24gdG8gdGhlIHN1cnZleS5zdXJ2ZXlQb3N0SWQgcHJvcGVydHkgb24gc2hvd2luZyBpbiB0aGUgXCJFbWJlZCBTdXJ2ZXlcIiB0YWIuXG4gICAqIEBzZWUgc2hvd0VtYmVkZGVkU3VydmV5VGFiXG4gICAqL1xuICBwdWJsaWMgc3VydmV5UG9zdElkOiBzdHJpbmcgPSBudWxsO1xuICAvKipcbiAgICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgb24gY2hhbmdpbmcgXCJHZW5lcmF0ZSBWYWxpZCBKU09OXCIgb3B0aW9uLlxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlVmFsaWRKU09OQ2hhbmdlZENhbGxiYWNrOiAoZ2VuZXJhdGVWYWxpZEpTT046IGJvb2xlYW4pID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgY2FsbGVkIGluIGNhc2Ugb2YgVUkgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCBhbGwgbm90aWZpY2F0aW9ucyBhcmUgZG9uZSB2aWEgYnVpbHQtaW4gYWxlcnQgKCkgZnVuY3Rpb24uXG4gICAqIEluIGNhc2Ugb2YgYW55IHN1YnNjcmlwdGlvbnMgdG8gdGhpcyBldmVudCBhbGwgbm90aWZpY2F0aW9ucyB3aWxsIGJlIHJlZGlyZWN0ZWQgaW50byB0aGUgZXZlbnQgaGFuZGxlci5cbiAgICogPGJyLz4gb3B0aW9ucy5tZXNzYWdlIGlzIGEgbWVzc2FnZSB0byBzaG93LlxuICAgKi9cbiAgcHVibGljIG9uTm90aWZ5OiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgY2FsbGVkIGJlZm9yZSB1bmRvIGhhcHBlbnMuXG4gICAqIDxici8+IG9wdGlvbnMuY2FuVW5kbyBhIGJvb2xlYW4gdmFsdWUuIEl0IGlzIHRydWUgYnkgZGVmYXVsdC4gU2V0IGl0IGZhbHNlIHRvIGhpZGUgcHJldmVudCB1bmRvIG9wZXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvbkJlZm9yZVVuZG86IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBjYWxsZWQgYmVmb3JlIHJlZG8gaGFwcGVucy5cbiAgICogPGJyLz4gb3B0aW9ucy5jYW5SZWRvIGEgYm9vbGVhbiB2YWx1ZS4gSXQgaXMgdHJ1ZSBieSBkZWZhdWx0LiBTZXQgaXQgZmFsc2UgdG8gaGlkZSBwcmV2ZW50IHJlZG8gb3BlcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uQmVmb3JlUmVkbzogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCBhZnRlciB1bmRvIGhhcHBlbnMuXG4gICAqIDxici8+IG9wdGlvbnMuc3RhdGUgaXMgYW4gdW5kby9yZWRvIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgb25BZnRlclVuZG86IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgcmVkbyBoYXBwZW5zLlxuICAgKiA8YnIvPiBvcHRpb25zLnN0YXRlIGlzIGFuIHVuZG8vcmVkbyBpdGVtLlxuICAgKi9cbiAgcHVibGljIG9uQWZ0ZXJSZWRvOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgY2FsbGVkIG9uIGNoYW5naW5nIHRoZSBzZWxlY3RlZCBlbGVtZW50LiBZb3UgbWF5IGNoYW5nZSB0aGUgbmV3IHNlbGVjdGVkIGVsZW1lbnQgYnkgY2hhbmdpbmcgdGhlIHByb3BlcnR5IG9wdGlvbnMubmV3U2VsZWN0ZWRFbGVtZW50IHRvIHlvdXIgb3duXG4gICAqIDxici8+IG9wdGlvbnMubmV3U2VsZWN0ZWRFbGVtZW50IHRoZSBlbGVtZW50IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2VsZWN0ZWQgaW4gdGhlIHN1cnZleSBkZXNpZ2VyOiBxdWVzdGlvbiwgcGFuZWwsIHBhZ2Ugb3Igc3VydmV5LlxuICAgKi9cbiAgcHVibGljIG9uU2VsZWN0ZWRFbGVtZW50Q2hhbmdpbmc6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaXMgY2hhbmdlZC5cbiAgICogPGJyLz4gb3B0aW9ucy5uZXdTZWxlY3RlZEVsZW1lbnQgdGhlIG5ldyBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBzdXJ2ZXkgZGVzaWdlcjogcXVlc3Rpb24sIHBhbmVsLCBwYWdlIG9yIHN1cnZleS5cbiAgICovXG4gIHB1YmxpYyBvblNlbGVjdGVkRWxlbWVudENoYW5nZWQ6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBjYWxsZWQgd2hlbiBjcmVhdG9yIHRhYiBoYXMgYmVlbiByZW5kZXJlZC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy50YWJOYW1lIHRoZSBuYW1lIG9mIHRoZSByZW5kZXJlZCB0YWJcbiAgICogPGJyLz4gb3B0aW9ucy5lbGVtZW50cyB0aGUgcmVuZGVyZWQgZWxlbWVudHNcbiAgICogPGJyLz4gb3B0aW9ucy5tb2RlbCBjdXJyZW50IGNvbnRleHQgbW9kZWxcbiAgICogPGJyLz4gb3B0aW9ucy50YWJEYXRhIHRoZSBkYXRhIG9mIHRoZSByZW5kZXJlZCB0YWJcbiAgICovXG4gIHB1YmxpYyBvbkVkaXRvclRhYlJlbmRlcmVkOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgY2FsbGVkIHdoZW4gY3JlYXRvciBhY3RpdmUgdGFiIGlzIGNoYW5nZWQuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMudGFiTmFtZSB0aGUgbmFtZSBvZiBuZXcgYWN0aXZlIHRhYlxuICAgKi9cbiAgcHVibGljIG9uQWN0aXZlVGFiQ2hhbmdlZDogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGFsbG93cyB5b3UgdG8gY3VzdG9tIHNvcnQgcHJvcGVydGllcyBpbiB0aGUgUHJvcGVydHkgR3JpZC4gSXQgaXMgYSBjb21wYXJlIGZ1bmN0aW9uLiBZb3Ugc2hvdWxkIHNldCBvcHRpb25zLnJlc3VsdCB0byAtMSBvciAxIGJ5IGNvbXBhcmluZyBvcHRpb25zLnByb3BlcnR5MSBhbmQgb3B0aW9ucy5wcm9wZXJ0eTIuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMub2JqIHRoZSBzdXJ2ZXkgb2JqZWN0LCBTdXJ2ZXksIFBhZ2UsIFBhbmVsIG9yIFF1ZXN0aW9uXG4gICAqIDxici8+IG9wdGlvbnMucHJvcGVydHkxIHRoZSBsZWZ0IG9iamVjdCBwcm9wZXJ0eSAoU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSBvYmplY3QpLlxuICAgKiA8YnIvPiBvcHRpb25zLnByb3BlcnR5MiB0aGUgcmlnaHQgb2JqZWN0IHByb3BlcnR5IChTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5IG9iamVjdCkuXG4gICAqIDxici8+IG9wdGlvbnMucmVzdWx0IHRoZSByZXN1bHQgb2YgY29tcGFyaW5nLiBJdCBjYW4gYmUgMCAodXNlIGRlZmF1bHQgYmVoYXZpb3IpLCAgLTEgb3B0aW9ucy5wcm9wZXJ0eTEgaXMgbGVzcyB0aGFuIG9wdGlvbnMucHJvcGVydHkyIG9yIDEgb3B0aW9ucy5wcm9wZXJ0eTEgaXMgbW9yZSB0aGFuIG9wdGlvbnMucHJvcGVydHkyXG4gICAqL1xuICBwdWJsaWMgb25DdXN0b21Tb3J0UHJvcGVydHk6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBhbGxvd3MgeW91IG1vZGlmeSBET00gZWxlbWVudCBmb3IgYSBwcm9wZXJ0eSBpbiB0aGUgUHJvcGVydHkgR3JpZC4gRm9yIGV4YW1wbGUsIHlvdSBtYXkgY2hhbmdlIGl0cyBzdHlsZXMuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMub2JqIHRoZSBzdXJ2ZXkgb2JqZWN0LCBTdXJ2ZXksIFBhZ2UsIFBhbmVsIG9yIFF1ZXN0aW9uXG4gICAqIDxici8+IG9wdGlvbnMuaHRtbEVsZW1lbnQgdGhlIGh0bWwgZWxlbWVudCB0aGF0IHJlbmRlcnMgdGhlIHByb3BlcnR5IGRpc3BsYXkgbmFtZSBhbmQgaXRzIGVkaXRvci5cbiAgICogPGJyLz4gb3B0aW9ucy5wcm9wZXJ0eSBvYmplY3QgcHJvcGVydHkgKFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkgb2JqZWN0KS5cbiAgICogPGJyLz4gb3B0aW9ucy5wcm9wZXJ0eUVkaXRvciB0aGUgcHJvcGVydHkgRWRpdG9yLlxuICAgKi9cbiAgcHVibGljIG9uUHJvcGVydHlBZnRlclJlbmRlcjogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCBvbiBhZGRpbmcgYSBuZXcgcXVlc3Rpb24gaW50byB0aGUgc3VydmV5LiBUeXBpY2FsbHksIHdoZW4gYSB1c2VyIGRyb3BwZWQgYSBRdWVzdGlvbiBmcm9tIHRoZSBRdWVzdGlvbiBUb29sYm94IGludG8gZGVzaWduZXIgU3VydmV5IGFyZWEuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBuZXcgYWRkZWQgc3VydmV5IHF1ZXN0aW9uLiBTdXJ2ZXkuUXVlc3Rpb24gb2JqZWN0XG4gICAqIDxici8+IG9wdGlvbnMucGFnZSB0aGUgc3VydmV5IFBhZ2Ugb2JqZWN0IHdoZXJlIHF1ZXN0aW9uIGhhcyBiZWVuIGFkZGVkLlxuICAgKi9cbiAgcHVibGljIG9uUXVlc3Rpb25BZGRlZDogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCB3aGVuIGFuIGVuZC11c2VyIGRvdWJsZSBjbGljayBvbiBhbiBlbGVtZW50IChxdWVzdGlvbi9wYW5lbCkuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuZWxlbWVudCBhbiBpbnN0YW5jZSBvZiB0aGUgZWxlbWVudFxuICAgKi9cbiAgcHVibGljIG9uRWxlbWVudERvdWJsZUNsaWNrOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgY2FsbGVkIG9uIGFkZGluZyBhIG5ldyBwYW5lbCBpbnRvIHRoZSBzdXJ2ZXkuICBUeXBpY2FsbHksIHdoZW4gYSB1c2VyIGRyb3BwZWQgYSBQYW5lbCBmcm9tIHRoZSBRdWVzdGlvbiBUb29sYm94IGludG8gZGVzaWduZXIgU3VydmV5IGFyZWEuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucGFuZWwgYSBuZXcgYWRkZWQgc3VydmV5IHBhbmVsLiBTdXJ2ZXkuUGFuZWwgb2JqZWN0XG4gICAqIDxici8+IG9wdGlvbnMucGFnZSB0aGUgc3VydmV5IFBhZ2Ugb2JqZWN0IHdoZXJlIHF1ZXN0aW9uIGhhcyBiZWVuIGFkZGVkLlxuICAgKi9cbiAgcHVibGljIG9uUGFuZWxBZGRlZDogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCBvbiBhZGRpbmcgYSBuZXcgcGFnZSBpbnRvIHRoZSBzdXJ2ZXkuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucGFnZSB0aGUgbmV3IHN1cnZleSBQYWdlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBvblBhZ2VBZGRlZDogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCB3aGVuIGEgc3VydmV5IGlzIGNoYW5nZWQgaW4gdGhlIGRlc2lnbmVyLiBBIG5ldyBwYWdlL3F1ZXN0aW9uL3BhZ2UgaXMgYWRkZWQgb3IgZXhpc3RpbmcgaXMgcmVtb3ZlZCwgYSBwcm9wZXJ0eSBpcyBjaGFuZ2VkIGFuZCBzbyBvbi5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucyBvYmplY3QgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGNlcnRhaW4gbW9kaWZpY2F0aW9uc1xuICAgKiA8YnIvPiBvcHRpb25zLnR5cGUgY29udGFpbnMgc3RyaW5nIGNvbnN0YW50IGRlc2NyaWJpbmcgY2VydGFpbiBtb2RpZmljYXRpb25cbiAgICogPGJyLz4gQXZhaWxhYmxlIHZhbHVlczpcbiAgICogPGJyLz5cbiAgICogPGJyLz4gb3B0aW9ucy50eXBlOiBcIkFEREVEX0ZST01fVE9PTEJPWFwiXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb246IG5ld2x5IGFkZGVkIHF1ZXN0aW9uXG4gICAqIDxici8+XG4gICAqIDxici8+IG9wdGlvbnMudHlwZTogXCJQQUdFX0FEREVEXCJcbiAgICogPGJyLz4gb3B0aW9ucy5uZXdWYWx1ZTogbmV3bHkgY3JlYXRlZCBwYWdlXG4gICAqIDxici8+XG4gICAqIDxici8+IG9wdGlvbnMudHlwZTogXCJQQUdFX01PVkVEXCJcbiAgICogPGJyLz4gb3B0aW9ucy5wYWdlOiBwYWdlIGhhcyBiZWVuIG1vdmVkXG4gICAqIDxici8+IG9wdGlvbnMuaW5kZXhGcm9tOiBwZXZpb3VzIGluZGV4XG4gICAqIDxici8+IG9wdGlvbnMuaW5kZXhUbzogbmV3IGluZGV4XG4gICAqIDxici8+XG4gICAqIDxici8+IG9wdGlvbnMudHlwZTogXCJRVUVTVElPTl9DT05WRVJURURcIlxuICAgKiA8YnIvPiBvcHRpb25zLmNsYXNzTmFtZTogdGhlIGNvbnZlcnRlZCBjbGFzcyBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMub2xkVmFsdWU6IHBldmlvdXMgb2JqZWN0XG4gICAqIDxici8+IG9wdGlvbnMubmV3VmFsdWU6IHRoZSBuZXcgb2JqZWN0LCBjb252ZXJ0ZWQgZnJvbSBvbGRWYWxlIHRvIHRoZSBnaXZlbiBjbGFzcyBuYW1lXG4gICAqIDxici8+XG4gICAqIDxici8+IG9wdGlvbnMudHlwZTogXCJRVUVTVElPTl9DSEFOR0VEX0JZX0VESVRPUlwiXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb246IHF1ZXN0aW9uIGhhcyBiZWVuIGVkaXRlZCBpbiB0aGUgcG9wdXAgcXVlc3Rpb24gZWRpdG9yXG4gICAqIDxici8+XG4gICAqIDxici8+IG9wdGlvbnMudHlwZTogXCJQUk9QRVJUWV9DSEFOR0VEXCJcbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgaGFzIGJlZW4gY2hhbmdlZFxuICAgKiA8YnIvPiBvcHRpb25zLnRhcmdldDogdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBjaGFuZ2VkIHByb3BlcnR5XG4gICAqIDxici8+IG9wdGlvbnMub2xkVmFsdWU6IHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eVxuICAgKiA8YnIvPiBvcHRpb25zLm5ld1ZhbHVlOiB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjaGFuZ2VkIHByb3BlcnR5XG4gICAqIDxici8+XG4gICAqIDxici8+IG9wdGlvbnMudHlwZTogXCJPQkpFQ1RfREVMRVRFRFwiXG4gICAqIDxici8+IG9wdGlvbnMudGFyZ2V0OiBkZWxldGVkIG9iamVjdFxuICAgKiA8YnIvPlxuICAgKiA8YnIvPiBvcHRpb25zLnR5cGU6IFwiVklFV19UWVBFX0NIQU5HRURcIlxuICAgKiA8YnIvPiBvcHRpb25zLm5ld1R5cGU6IG5ldyB0eXBlIG9mIHRoZSBjcmVhdG9yIHZpZXc6IGVkaXRvciBvciBkZXNpZ25lclxuICAgKiA8YnIvPlxuICAgKiA8YnIvPiBvcHRpb25zLnR5cGU6IFwiRE9fRFJPUFwiXG4gICAqIDxici8+IG9wdGlvbnMucGFnZTogdGhlIHBhZ2Ugb2YgdGhlIGRyYXAvZHJvcCBvcGVyYXRpb25cbiAgICogPGJyLz4gb3B0aW9ucy5zb3VyY2U6IHRoZSBzb3VyY2UgZHJhZ2dlZCBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy50YXJnZXQ6IHRoZSBkcm9wIHRhcmdldFxuICAgKiA8YnIvPiBvcHRpb25zLm5ld0VsZW1lbnQ6IGEgbmV3IGVsZW1lbnQuIEl0IGlzIGRlZmluZWQgaWYgYSB1c2VyIGRyb3BzIHF1ZXN0aW9uIG9yIHBhbmVsIGZyb20gdGhlIHRvb2xib3hcbiAgICogPGJyLz5cbiAgICogPGJyLz4gb3B0aW9ucy50eXBlOiBcIlRSQU5TTEFUSU9OU19DSEFOR0VEXCJcbiAgICovXG4gIHB1YmxpYyBvbk1vZGlmaWVkOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2hhbmdpbmcgcXVlc3Rpb24sIHBhbmVsIG9yIHBhZ2UgbmFtZS5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5vYmogdGhlIG9iamVjdCAocXVlc3Rpb24sIHBhbmVsIG9yIHBhZ2UpXG4gICAqIDxici8+IG9wdGlvbnMub2xkTmFtZSB0aGUgcHJldmlvdXMgbmFtZSBvZiB0aGUgZWxlbWVudFxuICAgKiA8YnIvPiBvcHRpb25zLm5ld05hbWUgdGhlIG5ldyBuYW1lIG9mIHRoZSBlbGVtZW50XG4gICAqL1xuICBwdWJsaWMgb25FbGVtZW50TmFtZUNoYW5nZWQ6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSBzdXJ2ZXkgY3JlYXRvciBpcyBpbml0aWFsaXplZCBhbmQgYSBzdXJ2ZXkgb2JqZWN0IChTdXJ2ZXkuU3VydmV5KSBpcyBjcmVhdGVkLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnN1cnZleSAgdGhlIHN1cnZleSBvYmplY3Qgc2hvd2luZyBpbiB0aGUgY3JlYXRvci5cbiAgICovXG4gIHB1YmxpYyBvbkRlc2lnbmVyU3VydmV5Q3JlYXRlZDogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHN1cnZleSBjcmVhdG9yIHJ1bnMgdGhlIHN1cnZleSBpbiB0aGUgdGVzdCBtb2RlLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnN1cnZleSAgdGhlIHN1cnZleSBvYmplY3Qgc2hvd2luZyBpbiB0aGUgXCJUZXN0IHN1cnZleVwiIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvblRlc3RTdXJ2ZXlDcmVhdGVkOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBzaG93IGEgY2hlY2sgYW5kIGN1c3RvbSBlcnJvciBpbiBwcm9wZXJ0eSBncmlkIGFuZCBhZG9ybmVycyBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBzZWxlY3RlZCBlbGVtZW50IGlzIG51bGwgb3IgdGhlcmUgaXMgbm8gZXJyb3JzLlxuICAgKiA8YnIvPiBvcHRpb25zLmVycm9ycyBhbiBhcnJheSBvZiBlcnJvciBtZXNzYWdlcyBpZiBhbnkuXG4gICAqL1xuICBwdWJsaWMgb25WYWxpZGF0ZVNlbGVjdGVkRWxlbWVudDogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBlbnRlcmVkIGluIHRoZSBwcm9wZXJ0eSBlZGl0b3IuIFlvdSBtYXkgY2FsbCBhIHZhbGlkYXRpb24sIHNvIGFuIGVuZCB1c2VyIHNlZXMgdGhlIGVycm9yIGltbWVkaWF0ZWx5XG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMub2JqIHRoZSBzdXJ2ZXkgb2JqZWN0IHdoaWNoIHByb3BlcnR5IGlzIGVkaXRlZCBpbiB0aGUgUHJvcGVydHkgRWRpdG9yLlxuICAgKiA8YnIvPiBvcHRpb25zLnByb3BlcnR5TmFtZSAgdGhlIG5hbWUgb2YgdGhlIGVkaXRlZCBwcm9wZXJ0eS5cbiAgICogPGJyLz4gb3B0aW9ucy5lZGl0b3IgdGhlIGluc3RhbmNlIG9mIFByb3BlcnR5IEVkaXRvci5cbiAgICogQHNlZSBvblByb3BlcnR5VmFsdWVDaGFuZ2luZ1xuICAgKi9cbiAgcHVibGljIG9uUHJvcGVydHlFZGl0b3JPYmplY3RBc3NpZ246IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIG1vZGlmeSB0aGUgc3VydmV5IHRoYXQgdXNlZCBvbiBzZXR0aW5nIHZhbHVlIGZvciBjb25kaXRpb24vZXhwcmVzc2lvbiBwcm9wZXJ0aWVzLCBsaWtlIHZpc2libGVJZiwgZW5hYmxlSWYgYW5kIHNvIG9uLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLm9iaiB0aGUgc3VydmV5IG9iamVjdCB3aGljaCBwcm9wZXJ0eSBpcyBlZGl0ZWQgaW4gdGhlIFByb3BlcnR5IEVkaXRvci5cbiAgICogPGJyLz4gb3B0aW9ucy5wcm9wZXJ0eU5hbWUgIHRoZSBuYW1lIG9mIHRoZSBlZGl0ZWQgcHJvcGVydHkuXG4gICAqIDxici8+IG9wdGlvbnMuZWRpdG9yIHRoZSBpbnN0YW5jZSBvZiBQcm9wZXJ0eSBFZGl0b3IuXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWVRdWVzdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIHF1ZXN0aW9uIHRoYXQgc2hvd3MgaW4gdGhlIHN1cnZleSBmb3IgY2hvb3NpbmcgdGhlIHZhbHVlXG4gICAqIDxici8+IG9wdGlvbnMuc3VydmV5IHRoZSBpbnN0YW5jZSBvZiB0aGUgc3VydmV5IHRoYXQgYWxsb3dzIHRvIGNob29zZSB0aGUgdmFsdWUuIFlvdSBtYXkgbW9kaWZ5IGl0IGJlZm9yZSBpdCBzaG93cyB0byB0aGUgZW5kLXVzZXJcbiAgICovXG4gIHB1YmxpYyBvbkNvbmRpdGlvblZhbHVlU3VydmV5Q3JlYXRlZDogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gcHJvY2VzcyBrZXkgZG93biBldmVudCBpbiBhIHByb3BlcnR5IGVkaXRvclxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLm9iaiB0aGUgc3VydmV5IG9iamVjdCB3aGljaCBwcm9wZXJ0eSBpcyBlZGl0ZWQgaW4gdGhlIFByb3BlcnR5IEVkaXRvci5cbiAgICogPGJyLz4gb3B0aW9ucy5wcm9wZXJ0eU5hbWUgIHRoZSBuYW1lIG9mIHRoZSBlZGl0ZWQgcHJvcGVydHkuXG4gICAqIDxici8+IG9wdGlvbnMuZWRpdG9yIHRoZSBpbnN0YW5jZSBvZiBQcm9wZXJ0eSBFZGl0b3IuXG4gICAqIDxici8+IG9wdGlvbnMuZXZlbnQgdGhlIGluc3RhbmNlIG9mIG1vdXNlIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIG9uUHJvcGVydHlFZGl0b3JLZXlEb3duOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBkaXNhYmxlIHNvbWUgb3BlcmF0aW9ucyBmb3IgYW4gZWxlbWVudCAocXVlc3Rpb24vcGFuZWwpLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLm9iaiB0aGUgc3VydmV5IG9iamVjdCBxdWVzdGlvbi9wYW5lbFxuICAgKiA8YnIvPiBvcHRpb25zLmFsbG93RGVsZXRlIHNldCBpdCB0byBmYWxzZSB0byBkaXNhYmxlIGRlbGV0aW5nIHRoZSBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy5hbGxvd0VkaXQgc2V0IGl0IHRvIGZhbHNlIHRvIGRpc2FibGUgY2FsbGluZyB0aGUgbW9kYWwgRWRpdG9yXG4gICAqIDxici8+IG9wdGlvbnMuYWxsb3dDb3B5IHNldCBpdCB0byBmYWxzZSB0byBkaXNhYmxlIGNvcHlpbmcgdGhlIG9iamVjdFxuICAgKiA8YnIvPiBvcHRpb25zLmFsbG93QWRkVG9Ub29sYm94IHNldCBpdCB0byBmYWxzZSB0byBkaXNhYmxlIGFkZGluZyBlbGVtZW50IHRvIFRvb2xib3hcbiAgICogPGJyLz4gb3B0aW9ucy5hbGxvd0RyYWdnaW5nIHNldCBpdCB0byBmYWxzZSB0byBkaXNhYmxlIGFkZGluZyBlbGVtZW50IHRvIFRvb2xib3hcbiAgICogPGJyLz4gb3B0aW9ucy5hbGxvd0NoYW5nZVR5cGUgc2V0IGl0IHRvIGZhbHNlIHRvIGRpc2FibGUgY2hhbmdpbmcgZWxlbWVudCB0eXBlXG4gICAqIDxici8+IG9wdGlvbnMuYWxsb3dDaGFuZ2VSZXF1aXJlZCBzZXQgaXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBjaGFuZ2luZyBpc1JlcXVpcmVkIHByb3BlcnR5XG4gICAqIDxici8+IG9wdGlvbnMuYWxsb3dTaG93SGlkZVRpdGxlIHNldCBpdCB0byBmYWxzZSB0byBkaXNhYmxlIGNoYW5naW5nIHRpdGxlTG9jYXRpb24gcHJvcGVydHkgdG8gaGlkZGVuL2RlZmF1bHRcbiAgICovXG4gIHB1YmxpYyBvbkVsZW1lbnRBbGxvd09wZXJhdGlvbnM6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIHNob3cgdGhlIGRlc2NyaXB0aW9uIG9uIHRoZSB0b3Agb3IvYW5kIGJvdHRvbSBvZiB0aGUgcHJvcGVydHkgbW9kYWwgZWRpdG9yLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBjcmVhdG9yIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLm9iaiB0aGUgc3VydmV5IG9iamVjdCB3aGljaCBwcm9wZXJ0eSBpcyBlZGl0ZWQgaW4gdGhlIFByb3BlcnR5IEVkaXRvci5cbiAgICogPGJyLz4gb3B0aW9ucy5wcm9wZXJ0eU5hbWUgdGhlIHByb3BlcnR5IG5hbWVcbiAgICogPGJyLz4gb3B0aW9ucy5odG1sVG9wIHRoZSBodG1sICB0aGF0IHlvdSB3YW50IHRvIHNlZSBvbiB0aGUgdG9wIG9mIHRoZSBtb2RhbCB3aW5kb3dcbiAgICogPGJyLz4gb3B0aW9ucy5odG1sQm90dG9tIHRoZSBodG1sIHRoYXQgeW91IHdhbnQgdG8gc2VlIG9uIHRoZSBib3R0b20gb2YgdGhlIG1vZGFsIHdpbmRvd1xuICAgKi9cbiAgcHVibGljIG9uU2hvd1Byb3BlcnR5TW9kYWxFZGl0b3JEZXNjcmlwdGlvbjogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogQERlcHJlY2F0ZWQgT2Jzb2xldGUsIHBsZWFzZSB1c2Ugb25HZXRPYmplY3REaXNwbGF5TmFtZSBldmVudFxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjaGFuZ2UgdGhlIHRleHQgc2hvd2luZyBpbiB0aGUgZHJvcGRvd24gb2YgdGhlIHByb3BlcnR5IGdyaWQuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMub2JqIHRoZSBzdXJ2ZXkgb2JqZWN0LlxuICAgKiA8YnIvPiBvcHRpb25zLnRleHQgdGhlIGN1cnJlbnQgb2JqZWN0IHRleHQsIGNvbW1vbmx5IGl0IGlzIGEgbmFtZS4gWW91IG11c3QgY2hhbmdlIHRoaXMgYXR0cmlidXRlXG4gICAqIEBzZWUgb25HZXRPYmplY3REaXNwbGF5TmFtZVxuICAgKi9cbiAgcHVibGljIG9uR2V0T2JqZWN0VGV4dEluUHJvcGVydHlHcmlkOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBjYWxsZWQgd2hlbiBlbmQtdXNlciBhZGRlcyBuZXcgZWxlbWVudCAocXVlc3Rpb24gb3IgcGFuZWwpIGludG8gdGhlIHN1cnZleSB0b29sYm94LlxuICAgKiBJdCBjYWxscyBiZWZvcmUgYWRkaW5nIHRoZSBlbGVtZW50IGludG8gdG9vbGJveCBhbmQgaXQgYWxsb3dzIHRvIGNoYW5nZSB0aGUgdG9vbGJveCBpdGVtIGF0dHJpYnV0ZXMgdXNpbmcgb3B0aW9ucy5pdGVtT3B0aW9ucyBwYXJhbWV0ZXJcbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5lbGVtZW50IGlzIGEgbmV3IGFkZGVkIGVsZW1lbnRcbiAgICogPGJyLz4gb3B0aW9ucy5pdGVtT3B0aW9ucyBhIGpzb24gb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBvdmVycmlkZSBxdWVzdGlvbiBwcm9wZXJ0aWVzLiBBdHRyaWJ1dGVzIGFyZTogbmFtZSwgdGl0bGUsIGlzQ29waWVkLCBpY29uTmFtZSwganNvbiBhbmQgY2F0ZWdvcnkuXG4gICAqIEBzZWUgb25DdXN0b21FbGVtZW50QWRkZWRJbnRvVG9vbGJveFxuICAgKi9cbiAgcHVibGljIG9uQ3VzdG9tRWxlbWVudEFkZGluZ0ludG9Ub29sYm94OiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgY2FsbGVkIHdoZW4gZW5kLXVzZXIgYWRkZXMgbmV3IGVsZW1lbnQgKHF1ZXN0aW9uIG9yIHBhbmVsKSBpbnRvIHRoZSBzdXJ2ZXkgdG9vbGJveC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5lbGVtZW50IGlzIGEgbmV3IGFkZGVkIGVsZW1lbnRcbiAgICogQHNlZSBvbkN1c3RvbUVsZW1lbnRBZGRpbmdJbnRvVG9vbGJveFxuICAgKi9cbiAgcHVibGljIG9uQ3VzdG9tRWxlbWVudEFkZGVkSW50b1Rvb2xib3g6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjbGVhcmluZyB0aGUgZmlsZXMuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IFRoZXJlIGFyZSBmb2xsb3dpbmcgcHJvcGVydGllcyBpbiBvcHRpb25zOlxuICAgKiA8YnIvPiBmaWxlcyAtIHZhbHVlIHRvIGNsZWFyIChpdCBjYW4gYmUgYSBieXRlIGFycmF5IG9yIGFuIFVSSSBvZiBhIHJlc291cmNlKVxuICAgKiA8YnIvPiBjYWxsYmFjayAtIGNhbGxlZCBvbiBjbGVhciBjb21wbGV0ZVxuICAgKiBAc2VlIGNsZWFyRmlsZXNcbiAgICovXG4gIHB1YmxpYyBvbkNsZWFyRmlsZTogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHVwbG9hZGluZyB0aGUgZmlsZXMuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IFRoZXJlIGFyZSB0d28gcHJvcGVydGllcyBpbiBvcHRpb25zOlxuICAgKiA8YnIvPiBmaWxlcyB0aGUgSmF2YXNjcmlwdCBGaWxlIG9iamVjdHMgYXJyYXlcbiAgICogPGJyLz4gY2FsbGJhY2sgY2FsbGVkIG9uIHVwbG9hZCBjb21wbGV0ZVxuICAgKiBAc2VlIHVwbG9hZEZpbGVcbiAgICovXG4gIHB1YmxpYyBvblVwbG9hZEZpbGU6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB0aGVuIG9uZSBuZWVkIHRvIGNob29zZSBmaWxlcy5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gaW5wdXQgZmlsZSBpbnB1dCBIVE1MIGVsZW1lbnRcbiAgICogPGJyLz4gY2FsbGJhY2sgbmVlZCB0byBiZSBjYWxsZWQgYWZ0ZXIgZmlsZXMgaGFzIGJlZW4gY2hvc2VuXG4gICAqIEBzZWUgdXBsb2FkRmlsZVxuICAgKi9cbiAgcHVibGljIG9uT3BlbkZpbGVDaG9vc2VyOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB0cmFuc2xhdGlvbiBmcm9tIGNzdiBmaWxlIGlzIGltcG9ydGVkLlxuICAgKiBAc2VlIHRyYW5zbGF0aW9uXG4gICAqIEBzZWUgc2hvd1RyYW5zbGF0aW9uVGFiXG4gICAqL1xuICBwdWJsaWMgb25UcmFuc2xhdGlvbkltcG9ydGVkOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIGlzIGNhbGxlZCBvbiBhZnRlciByZW5kZXIgdHJhbnNsYXRpb24gaXRlbS4gWW91IGNhbiBtb2RpZnkgdGhlIGh0bWwgZWxlbWVudCB1c2luZyB0aGlzIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuaXRlbSAtIHRyYW5zbGF0aW9uIGl0ZW1cbiAgICogPGJyLz4gb3B0aW9ucy5odG1sRWxlbWVudCAtIHRleHQgYXJlYSBmb3IgZWRpdGluZ1xuICAgKiA8YnIvPiBvcHRpb25zLmxvY2FsZSAtIHRoZSBuYW1lIG9mIHRoZSBlZGl0aW5nIGxvY2FsZVxuICAgKiA8YnIvPiBvcHRpb25zLm9uRGVzdHJveUNhbGxiYWNrIC0gYSBmdW5jdGlvbiBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBvbiByZW1vdmUgaHRtbEVsZW1lbnQgZnJvbSBET00uXG4gICAqIEBzZWUgdHJhbnNsYXRpb25cbiAgICogQHNlZSBzaG93VHJhbnNsYXRpb25UYWJcbiAgICovXG4gIHB1YmxpYyBvblRyYW5zbGF0ZUl0ZW1BZnRlclJlbmRlcjogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gY29udHJvbCBkcmFnJmRyb3Agb3BlcmF0aW9ucy5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgY3JlYXRvciBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IG9wdGlvbnMuc3VydmV5IHRoZSBlZGl0aW5nIHN1cnZleSBvYmplY3QuXG4gICAqIDxici8+IG9wdGlvbnMuYWxsb3cgc2V0IGl0IHRvIGZhbHNlIHRvIGRpc2FibGUgZHJhZ2dpbmcuXG4gICAqIDxici8+IG9wdGlvbnMudGFyZ2V0IGEgdGFyZ2V0IGVsZW1lbnQgdGhhdCBpcyBkcmFnZ2luZy5cbiAgICogPGJyLz4gb3B0aW9ucy5zb3VyY2UgYSBzb3VyY2UgZWxlbWVudC4gSXQgY2FuIGJlIG51bGwsIGlmIGl0IGlzIGEgbmV3IGVsZW1lbnQsIGRyYWdnaW5nIGZyb20gdG9vbGJveC5cbiAgICogPGJyLz4gb3B0aW9ucy5wYXJlbnQgYSBwYWdlIG9yIHBhbmVsIHdoZXJlIHRhcmdldCBlbGVtZW50IGlzIGRyYWdnaW5nLlxuICAgKiA8YnIvPiBvcHRpb25zLmluc2VydEJlZm9yZSBhbiBlbGVtZW50IGJlZm9yZSB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgZHJhZ2dpbmcuIEl0IGNhbiBiZSBudWxsIGlmIHBhcmVudCBjb250YWluZXIgKHBhZ2Ugb3IgcGFuZWwpIGlzIGVtcHR5IG9yIGRyYWdnaW5nIGFuIGVsZW1lbnQgdW5kZXIgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgY29udGFpbmVyLlxuICAgKiA8YnIvPiBvcHRpb25zLmluc2VydEFmdGVyIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIHRhcmdldCBlbGVtZW50IGlzIGRyYWdnaW5nLiBJdCBjYW4gYmUgbnVsbCBpZiBwYXJlbnQgY29udGFpbmVyIChwYWdlIG9yIHBhbmVsKSBpcyBlbXB0eSBvciBkcmFnZ2luZyBlbGVtZW50IHRvIHRoZSB0b3Agb2YgdGhlIHBhcmVudCBjb250YWluZXIuXG4gICAqL1xuICBwdWJsaWMgb25EcmFnRHJvcEFsbG93OiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBnZXQgYWNjZXNzIHJlbmRlcmVkIGFkb3JkZXIuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IGNyZWF0b3Igb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBvcHRpb25zLnN1cnZleSB0aGUgZWRpdGluZyBzdXJ2ZXkgb2JqZWN0LlxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIHRoZSBzdXJ2ZXkgZWxlbWVudCBvZiB0aGUgYWRvcm5lci5cbiAgICogPGJyLz4gb3B0aW9ucy5hZG9ybmVyIHRoZSBhZG9ybmVyIGlkLlxuICAgKiA8YnIvPiBvcHRpb25zLmVsZW1lbnQgYSByb290IGFkb3JuZXIgZWxlbWVudC5cbiAgICogPGJyLz4gb3B0aW9ucy5jb250ZXh0IGEgY29udGV4dCBmb3IgYWRvcm5lciBlbGVtZW50LCBlLmcuIGN1cnJlbnQgaXRlbSBvZiBhIHNlbGVjdCBiYXNlIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uQWRvcm5lclJlbmRlcmVkOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5Q3JlYXRvciwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgY2FsbGVkIGFmdGVyIHVzZXIgY2xvc2VzIHRoZSBwb3B1cCBlbGVtZW50IGVkaXRvci5cbiAgICogPGJyLz4gb3B0aW9ucy5lbGVtZW50IHRoZSBlZGl0ZWQgZWxlbWVudC5cbiAgICogPGJyLz4gb3B0aW9ucy5pc0NhbmNlbGVkIGluZGljYXRlZCB1c2VyIGNsaWNrZWQgQ2FuY2VsLlxuICAgKi9cbiAgcHVibGljIG9uRWxlbWVudEVkaXRvckNsb3NlZDogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUNyZWF0b3IsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXlDcmVhdG9yLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuXG4gIC8qKlxuICAgKiBZb3UgbmVlZCB0byBzZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIGlmIHlvdSB3YW50IHRvIGlucGxhY2UgZWRpdCBpdGVtIHZhbHVlcyBpbnN0ZWFkIG9mIHRleHRzLlxuICAgKiBAc2VlIGlucGxhY2VFZGl0Rm9yVmFsdWVzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucGxhY2VFZGl0Rm9yVmFsdWVzKCkge1xuICAgIHJldHVybiBpdGVtQWRvcm5lci5pbnBsYWNlRWRpdEZvclZhbHVlcztcbiAgfVxuICBwdWJsaWMgc2V0IGlucGxhY2VFZGl0Rm9yVmFsdWVzKHZhbCkge1xuICAgIGl0ZW1BZG9ybmVyLmlucGxhY2VFZGl0Rm9yVmFsdWVzID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU2V0UmVhZE9ubHkobmV3VmFsOiBib29sZWFuKSB7XG4gICAgc3VwZXIub25TZXRSZWFkT25seShuZXdWYWwpO1xuICAgIHRoaXMucmVuZGVyKG51bGwsIHRoaXMub3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMga29DYW5VbmRvOiBhbnk7XG4gIHB1YmxpYyBrb0NhblJlZG86IGFueTtcblxuICBwdWJsaWMgY29tbWFuZHM6IGFueTtcblxuICAvLyBtb2RlbHMgZnJvbSBNVlZNXG4gIHB1YmxpYyBwcm9wZXJ0eUdyaWRPYmplY3RFZGl0b3JNb2RlbDogUHJvcGVydHlHcmlkT2JqZWN0RWRpdG9yTW9kZWw7XG4gIHB1YmxpYyBwYWdlc0VkaXRvck1vZGVsOiBQYWdlc0VkaXRvcjtcbiAgLy8gRU8gbW9kZWxzIGZyb20gTVZWTVxuXG4gIGtvSXNTaG93RGVzaWduZXI6IGFueTtcbiAga29DYW5EZWxldGVPYmplY3Q6IGFueTtcbiAga29PYmplY3RzOiBhbnk7XG4gIGtvU2VsZWN0ZWRPYmplY3Q6IGtvLk9ic2VydmFibGU8YW55PjtcbiAga29TaG93U2F2ZUJ1dHRvbjogYW55O1xuICBrb1Nob3dQcm9wZXJ0eUdyaWQ6IGtvLk9ic2VydmFibGU8Q29udGFpbmVyTG9jYXRpb24+O1xuICBrb1Nob3dUb29sYm94OiBrby5PYnNlcnZhYmxlPENvbnRhaW5lckxvY2F0aW9uPjtcbiAga29TaG93RWxlbWVudEVkaXRvckFzUHJvcGVydHlHcmlkOiBrby5PYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBrb0hpZGVBZHZhbmNlZFNldHRpbmdzOiBrby5PYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBrb1Rlc3RTdXJ2ZXlXaWR0aDogYW55O1xuICBrb0Rlc2lnbmVySGVpZ2h0OiBrby5PYnNlcnZhYmxlPGFueT47XG4gIGtvU2hvd1BhZ2VzVG9vbGJveDoga28uT2JzZXJ2YWJsZTxDb250YWluZXJMb2NhdGlvbj47XG4gIGdlbmVyYXRlVmFsaWRKU09OQ2xpY2s6IGFueTtcbiAgZ2VuZXJhdGVSZWFkYWJsZUpTT05DbGljazogYW55O1xuICBkb1VuZG9DbGljazogYW55O1xuICBkb1JlZG9DbGljazogYW55O1xuICBkZWxldGVPYmplY3RDbGljazogYW55O1xuICBrb1N0YXRlID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcblxuICBzYXZlQnV0dG9uQ2xpY2s6IGFueTtcbiAgZHJhZ2dpbmdUb29sYm94SXRlbTogYW55O1xuICBjbGlja1Rvb2xib3hJdGVtOiBhbnk7XG4gIGRyYWdFbmQ6IGFueTtcbiAgLyoqXG4gICAqIFRoZSBTdXJ2ZXkgQ3JlYXRvciBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHJlbmRlcmVkRWxlbWVudCBIdG1sRWxlbWVudCBvciBodG1sIGVsZW1lbnQgaWQgd2hlcmUgc3VydmV5IGNyZWF0b3Igd2lsbCBiZSByZW5kZXJlZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBzdXJ2ZXkgY3JlYXRvciBvcHRpb25zLiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICogc2hvd0Rlc2lnbmVyVGFiLCBzaG93SlNPTkVkaXRvclRhYiwgc2hvd1Rlc3RTdXJ2ZXlUYWIsIHNob3dFbWJlZGRlZFN1cnZleVRhYiwgc2hvd1RyYW5zbGF0aW9uVGFiLCBzaG93TG9naWNUYWIsXG4gICAqIHNob3dPcHRpb25zLCBzaG93UHJvcGVydHlHcmlkLCBzaG93VG9vbGJveCxcbiAgICogYWxsb3dNb2RpZnlQYWdlcywgcGFnZUVkaXRpbmdNb2RlLCBzaG93RHJvcGRvd25QYWdlU2VsZWN0b3IsIHJlYWRPbmx5LFxuICAgKiBxdWVzdGlvblR5cGVzLCBnZW5lcmF0ZVZhbGlkSlNPTiwgaXNBdXRvU2F2ZSwgZGVzaWduZXJIZWlnaHQsIHNob3dFcnJvck9uRmFpbGVkU2F2ZSwgY2xvc2VNb2RhbE91dHNpZGUsIHVzZVRhYnNJbkVsZW1lbnRFZGl0b3IsXG4gICAqIHNob3dPYmplY3RUaXRsZXMsIGlucGxhY2VFZGl0Rm9yVmFsdWVzLCBzaG93VGl0bGVzSW5FeHByZXNzaW9ucywgYWxsb3dFZGl0RXhwcmVzc2lvbnNJblRleHRFZGl0b3IsXG4gICAqIHNob3dQYWdlc0luVGVzdFN1cnZleVRhYiwgc2hvd0RlZmF1bHRMYW5ndWFnZUluVGVzdFN1cnZleVRhYiwgc2hvd0ludmlzaWJsZUVsZW1lbnRzSW5UZXN0U3VydmV5VGFiLCBzaG93U2ltdWxhdG9ySW5UZXN0U3VydmV5VGFiLFxuICAgKiBzaG93U3VydmV5VGl0bGUsIGFsbG93Q29udHJvbFN1cnZleVRpdGxlVmlzaWJpbGl0eSwgaGlkZUV4cHJlc3Npb25IZWFkZXJJbkxvZ2ljVGFiLFxuICAgKiBtYXhMb2dpY0l0ZW1zSW5Db25kaXRpb25cbiAgICovXG5cbiAgY29uc3RydWN0b3IocmVuZGVyZWRFbGVtZW50OiBhbnkgPSBudWxsLCBvcHRpb25zOiBhbnkgPSBudWxsKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5rb0NhbkRlbGV0ZU9iamVjdCA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICAgIHRoaXMua29DYW5VbmRvID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gICAgdGhpcy5rb0NhblJlZG8gPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcblxuICAgIHRoaXMudG9vbGJveFZhbHVlID0gbmV3IFF1ZXN0aW9uVG9vbGJveChcbiAgICAgIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucXVlc3Rpb25UeXBlc1xuICAgICAgICA/IHRoaXMub3B0aW9ucy5xdWVzdGlvblR5cGVzXG4gICAgICAgIDogbnVsbCxcbiAgICAgIHRoaXNcbiAgICApO1xuICAgIHRoaXMuc3VydmV5TGl2ZSA9IG5ldyBTdXJ2ZXlMaXZlVGVzdGVyKHRoaXMpO1xuICAgIHRoaXMubG9naWNWYWx1ZSA9IG5ldyBTdXJ2ZXlMb2dpYyh0aGlzLmNyZWF0ZVN1cnZleSh7fSwgXCJsb2dpY1wiKSwgdGhpcyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgU3R5bGVzTWFuYWdlci5hcHBseVRoZW1lKFN0eWxlc01hbmFnZXIuY3VycmVudFRoZW1lKCkpO1xuXG4gICAgc2VsZi5vblRpdGxlSW5wbGFjZUVkaXRvclN0YXJ0RWRpdCA9IG51bGw7XG5cbiAgICB0aGlzLmtvU2hvd1NhdmVCdXR0b24gPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgICB0aGlzLmtvVGVzdFN1cnZleVdpZHRoID0ga28ub2JzZXJ2YWJsZShcIjEwMCVcIik7XG4gICAgdGhpcy5zYXZlQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmRvU2F2ZSgpO1xuICAgIH07XG4gICAgdGhpcy5rb09iamVjdHMgPSBrby5vYnNlcnZhYmxlQXJyYXkoKTtcbiAgICB3aW5kb3dbXCJzZWxcIl0gPSB0aGlzLmtvU2VsZWN0ZWRPYmplY3Q7XG4gICAgdGhpcy5rb1NlbGVjdGVkT2JqZWN0LnN1YnNjcmliZShmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgIHNlbGYuc2VsZWN0ZWRPYmplY3RDaGFuZ2VkKCEhbmV3VmFsdWUgPyBuZXdWYWx1ZS52YWx1ZSA6IG51bGwpO1xuICAgIH0pO1xuICAgIHRoaXMua29HZW5lcmF0ZVZhbGlkSlNPTi5zdWJzY3JpYmUoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICBpZiAoIXNlbGYub3B0aW9ucykgc2VsZi5vcHRpb25zID0ge307XG4gICAgICBzZWxmLm9wdGlvbnMuZ2VuZXJhdGVWYWxpZEpTT04gPSBuZXdWYWx1ZTtcbiAgICAgIGlmIChzZWxmLmdlbmVyYXRlVmFsaWRKU09OQ2hhbmdlZENhbGxiYWNrKVxuICAgICAgICBzZWxmLmdlbmVyYXRlVmFsaWRKU09OQ2hhbmdlZENhbGxiYWNrKG5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgICB0aGlzLnN1cnZleU9iamVjdHMgPSBuZXcgU3VydmV5T2JqZWN0cyhcbiAgICAgIHRoaXMua29PYmplY3RzLFxuICAgICAgdGhpcy5rb1NlbGVjdGVkT2JqZWN0LFxuICAgICAgZnVuY3Rpb24gKG9iajogU3VydmV5LkJhc2UpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc2VsZi5nZXRPYmplY3REaXNwbGF5TmFtZShvYmosIFwicHJvcGVydHktZ3JpZFwiKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuc3VydmV5T2JqZWN0cy5nZXRJdGVtVGV4dENhbGxiYWNrID0gZnVuY3Rpb24gKG9iaiwgdGV4dCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB7IG9iajogb2JqLCB0ZXh0OiB0ZXh0IH07XG4gICAgICBzZWxmLm9uR2V0T2JqZWN0VGV4dEluUHJvcGVydHlHcmlkLmZpcmUoc2VsZiwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gb3B0aW9ucy50ZXh0O1xuICAgIH07XG5cbiAgICB0aGlzLnByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsID0gbmV3IFByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsKFxuICAgICAgdGhpc1xuICAgICk7XG5cbiAgICBpZiAodGhpcy5zaG93RWxlbWVudEVkaXRvckFzUHJvcGVydHlHcmlkKSB7XG4gICAgICB0aGlzLnByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsLmtvSXNPbGRUYWJsZUFwcGVhcmFuY2UoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsLmtvSXNPbGRUYWJsZUFwcGVhcmFuY2UodHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5rb1Nob3dFbGVtZW50RWRpdG9yQXNQcm9wZXJ0eUdyaWQuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgaWYgKG5ld1ZhbHVlKSB7XG4gICAgICAgIHNlbGYucHJvcGVydHlHcmlkT2JqZWN0RWRpdG9yTW9kZWwua29Jc09sZFRhYmxlQXBwZWFyYW5jZShmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsLmtvSXNPbGRUYWJsZUFwcGVhcmFuY2UodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsLm9uQWZ0ZXJSZW5kZXJDYWxsYmFjayA9XG4gICAgICB0aGlzLm9uRWRpdG9yQWZ0ZXJSZW5kZXJDYWxsYmFjaztcbiAgICB0aGlzLnByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsLm9uU29ydFByb3BlcnR5Q2FsbGJhY2sgPSBmdW5jdGlvbiAoXG4gICAgICBvYmo6IGFueSxcbiAgICAgIHByb3BlcnR5MTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICAgIHByb3BlcnR5MjogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuICAgICk6IG51bWJlciB7XG4gICAgICByZXR1cm4gc2VsZi5vbkN1c3RvbVNvcnRQcm9wZXJ0eU9iamVjdFByb3BlcnR5KG9iaiwgcHJvcGVydHkxLCBwcm9wZXJ0eTIpO1xuICAgIH07XG4gICAgdGhpcy5wcm9wZXJ0eUdyaWRPYmplY3RFZGl0b3JNb2RlbC5vblByb3BlcnR5Q2hhbmdlZCA9IGZ1bmN0aW9uIChcbiAgICAgIG9iajogYW55LFxuICAgICAgcHJvcDogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICAgIG9sZFZhbHVlOiBhbnlcbiAgICApIHtcbiAgICAgIHNlbGYub25Qcm9wZXJ0eUNoYW5nZWQob2JqLCBwcm9wLCBvbGRWYWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLnByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsW1wib25Db3JyZWN0VmFsdWVCZWZvcmVTZXRcIl0gPSBmdW5jdGlvbiAoXG4gICAgICBvYmo6IGFueSxcbiAgICAgIHByb3A6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgICBuZXdWYWx1ZTogYW55XG4gICAgKTogYW55IHtcbiAgICAgIHJldHVybiBzZWxmLm9uUHJvcGVydHlDb3JyZWN0VmFsdWVCZWZvcmVTZXQob2JqLCBwcm9wLCBuZXdWYWx1ZSk7XG4gICAgfTtcblxuICAgIHRoaXMucXVlc3Rpb25FZGl0b3JXaW5kb3cgPSBuZXcgU3VydmV5UHJvcGVydHlFZGl0b3JTaG93V2luZG93KCk7XG5cbiAgICB0aGlzLmtvVmlld1R5cGUuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgc2VsZi5vbkFjdGl2ZVRhYkNoYW5nZWQuZmlyZShzZWxmLCB7IHRhYk5hbWU6IG5ld1ZhbHVlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc1Nob3dEZXNpZ25lciA9IGtvLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzZWxmLmtvVmlld1R5cGUoKSA9PSBcImRlc2lnbmVyXCI7XG4gICAgfSk7XG4gICAgdGhpcy5nZW5lcmF0ZVZhbGlkSlNPTkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5rb0dlbmVyYXRlVmFsaWRKU09OKHRydWUpO1xuICAgIH07XG4gICAgdGhpcy5nZW5lcmF0ZVJlYWRhYmxlSlNPTkNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5rb0dlbmVyYXRlVmFsaWRKU09OKGZhbHNlKTtcbiAgICB9O1xuICAgIHRoaXMuZGVsZXRlT2JqZWN0Q2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmRlbGV0ZUN1cnJlbnRPYmplY3QoKTtcbiAgICB9O1xuICAgIHRoaXMuZHJhZ2dpbmdUb29sYm94SXRlbSA9IGZ1bmN0aW9uIChpdGVtLCBlKSB7XG4gICAgICBpZiAoIXRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgc2VsZi5kb0RyYWdnaW5nVG9vbGJveEl0ZW0oaXRlbS5qc29uLCBlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuY2xpY2tUb29sYm94SXRlbSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBzZWxmLmRvQ2xpY2tUb29sYm94SXRlbShpdGVtLmpzb24pO1xuICAgIH07XG4gICAgdGhpcy5kcmFnRW5kID0gZnVuY3Rpb24gKGl0ZW0sIGUpIHtcbiAgICAgIHNlbGYuZHJhZ0Ryb3BIZWxwZXIuZW5kKCk7XG4gICAgfTtcblxuICAgIHRoaXMuZG9VbmRvQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHsgY2FuVW5kbzogdHJ1ZSB9O1xuICAgICAgc2VsZi5vbkJlZm9yZVVuZG8uZmlyZShzZWxmLCBvcHRpb25zKTtcbiAgICAgIGlmIChvcHRpb25zLmNhblVuZG8pIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBzZWxmLnVuZG9SZWRvTWFuYWdlci51bmRvKCk7XG4gICAgICAgIC8vIHNlbGYuZG9VbmRvUmVkbyhpdGVtKTsgVE9ETyB1bmRvcmVkb1xuICAgICAgICBzZWxmLm9uQWZ0ZXJVbmRvLmZpcmUoc2VsZiwgeyBzdGF0ZTogaXRlbSB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuZG9SZWRvQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHsgY2FuUmVkbzogdHJ1ZSB9O1xuICAgICAgc2VsZi5vbkJlZm9yZVJlZG8uZmlyZShzZWxmLCBvcHRpb25zKTtcbiAgICAgIGlmIChvcHRpb25zLmNhblJlZG8pIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBzZWxmLnVuZG9SZWRvTWFuYWdlci5yZWRvKCk7XG4gICAgICAgIC8vIHNlbGYuZG9VbmRvUmVkbyhpdGVtKTtcbiAgICAgICAgc2VsZi5vbkFmdGVyUmVkby5maXJlKHNlbGYsIHsgc3RhdGU6IGl0ZW0gfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudGV4dCA9IFwiXCI7XG5cbiAgICB0aGlzLnBhZ2VzRWRpdG9yTW9kZWwgPSBuZXcgUGFnZXNFZGl0b3IodGhpcyk7XG5cbiAgICBpZiAocmVuZGVyZWRFbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcihyZW5kZXJlZEVsZW1lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRzID0gbmV3IENvbW1hbmRzKHNlbGYpO1xuICAgIHNlbGYuY29tbWFuZHMgPSBjb21tYW5kcy5nZXRDb21tYW5kcygpO1xuICAgIHRoaXMuYWRkVG9vbGJhckl0ZW1zKCk7XG4gIH1cblxuICBwcml2YXRlIG9uRWRpdG9yQWZ0ZXJSZW5kZXJDYWxsYmFjayA9IChcbiAgICBvYmo6IGFueSxcbiAgICBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgcHJvcDogU3VydmV5T2JqZWN0UHJvcGVydHlcbiAgKSA9PiB7XG4gICAgaWYgKHRoaXMub25Qcm9wZXJ0eUFmdGVyUmVuZGVyLmlzRW1wdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBvYmo6IG9iaixcbiAgICAgIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudCxcbiAgICAgIHByb3BlcnR5OiBwcm9wLnByb3BlcnR5LFxuICAgICAgcHJvcGVydHlFZGl0b3I6IHByb3AuZWRpdG9yLFxuICAgIH07XG4gICAgdGhpcy5vblByb3BlcnR5QWZ0ZXJSZW5kZXIuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfTtcbiAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgdGhpcy5rb1Nob3dQcm9wZXJ0eUdyaWQgPSBrby5vYnNlcnZhYmxlPENvbnRhaW5lckxvY2F0aW9uPih0cnVlKTtcbiAgICB0aGlzLmtvU2hvd0VsZW1lbnRFZGl0b3JBc1Byb3BlcnR5R3JpZCA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICAgIHRoaXMua29IaWRlQWR2YW5jZWRTZXR0aW5ncyA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICAgIHRoaXMuX3RvcENvbnRhaW5lciA9IGtvLm9ic2VydmFibGVBcnJheTxzdHJpbmc+KFtcbiAgICAgIFwidG9vbGJhclwiLFxuICAgICAgXCJwYWdlcy1lZGl0b3JcIixcbiAgICBdKTtcbiAgICB0aGlzLmhpZGVFeHByZXNzaW9uSGVhZGVyVmFsdWUgPSBrby5vYnNlcnZhYmxlPGJvb2xlYW4+KGZhbHNlKTtcbiAgICB0aGlzLmtvU2hvd1Rvb2xib3ggPSBrby5vYnNlcnZhYmxlPENvbnRhaW5lckxvY2F0aW9uPih0cnVlKTtcbiAgICB0aGlzLl9sZWZ0Q29udGFpbmVyID0ga28ub2JzZXJ2YWJsZUFycmF5PHN0cmluZz4oW1widG9vbGJveFwiXSk7XG4gICAgdGhpcy5fcmlnaHRDb250YWluZXIgPSBrby5vYnNlcnZhYmxlQXJyYXk8c3RyaW5nPihbXCJwcm9wZXJ0eS1ncmlkXCJdKTtcbiAgICB0aGlzLmtvU2VsZWN0ZWRPYmplY3QgPSBrby5vYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5rb0FsbG93Q29udHJvbFN1cnZleVRpdGxlVmlzaWJpbGl0eSA9IGtvLm9ic2VydmFibGUodHJ1ZSk7XG4gICAgdGhpcy5rb0Rlc2lnbmVySGVpZ2h0ID0ga28ub2JzZXJ2YWJsZTxhbnk+KFwiMTAwMHB4XCIpO1xuICAgIHRoaXMua29TaG93U3VydmV5VGl0bGUgPSBrby5vYnNlcnZhYmxlKFwiaWZlbnRlcmVkXCIpO1xuICAgIHRoaXMua29TaG93UGFnZXNUb29sYm94ID0ga28ub2JzZXJ2YWJsZTxDb250YWluZXJMb2NhdGlvbj4odHJ1ZSk7XG5cbiAgICBzdXBlci5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICB0aGlzLmlucGxhY2VFZGl0Rm9yVmFsdWVzID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLmlucGxhY2VFZGl0Rm9yVmFsdWVzICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gb3B0aW9ucy5pbnBsYWNlRWRpdEZvclZhbHVlc1xuICAgICAgICA6IGZhbHNlO1xuXG4gICAgdGhpcy5zaG93UHJvcGVydHlHcmlkID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLnNob3dQcm9wZXJ0eUdyaWQgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBvcHRpb25zLnNob3dQcm9wZXJ0eUdyaWRcbiAgICAgICAgOiB0cnVlO1xuXG4gICAgdGhpcy5rb1Nob3dFbGVtZW50RWRpdG9yQXNQcm9wZXJ0eUdyaWQoXG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zaG93RWxlbWVudEVkaXRvckFzUHJvcGVydHlHcmlkICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgID8gb3B0aW9ucy5zaG93RWxlbWVudEVkaXRvckFzUHJvcGVydHlHcmlkXG4gICAgICAgIDogdHJ1ZVxuICAgICk7XG5cbiAgICB0aGlzLnNjcm9sbFRvTmV3RWxlbWVudCA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5zY3JvbGxUb05ld0VsZW1lbnQgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBvcHRpb25zLnNjcm9sbFRvTmV3RWxlbWVudFxuICAgICAgICA6IHRydWU7XG4gICAgaWYgKG9wdGlvbnMuZGVzaWduZXJIZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5rb0Rlc2lnbmVySGVpZ2h0KG9wdGlvbnMuZGVzaWduZXJIZWlnaHQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vYmplY3RzSW50ZW5kKSB7XG4gICAgICBTdXJ2ZXlPYmplY3RzLmludGVuZCA9IG9wdGlvbnMub2JqZWN0c0ludGVuZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuY2xvc2VNb2RhbE91dHNpZGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuY2xvc2VNb2RhbE91dHNpZGVWYWx1ZSA9IG9wdGlvbnMuY2xvc2VNb2RhbE91dHNpZGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnBhZ2VFZGl0TW9kZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5wYWdlRWRpdE1vZGVWYWx1ZSA9IG9wdGlvbnMucGFnZUVkaXRNb2RlO1xuICAgICAgaWYgKHRoaXMucGFnZUVkaXRNb2RlVmFsdWUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgdGhpcy5fdG9wQ29udGFpbmVyLnJlbW92ZShcInBhZ2VzLWVkaXRvclwiKTtcbiAgICAgICAgU3VydmV5LlNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KFwicXVlc3Rpb25cIiwgXCJwYWdlXCIpLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgU3VydmV5LlNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KFwicGFuZWxcIiwgXCJwYWdlXCIpLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93SlNPTkVkaXRvclRhYiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnNob3dQYWdlU2VsZWN0b3JJblRvb2xiYXIpIHtcbiAgICAgIHRoaXMuc2hvd1BhZ2VTZWxlY3RvckluVG9vbGJhciA9IHRydWU7XG4gICAgICB0aGlzLnNob3dEcm9wZG93blBhZ2VTZWxlY3RvclZhbHVlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zaG93RHJvcGRvd25QYWdlU2VsZWN0b3IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duUGFnZVNlbGVjdG9yVmFsdWUgPSBvcHRpb25zLnNob3dEcm9wZG93blBhZ2VTZWxlY3RvcjtcbiAgICB9XG5cbiAgICB0aGlzLmhpZGVFeHByZXNzaW9uSGVhZGVyVmFsdWUob3B0aW9ucy5oaWRlRXhwcmVzc2lvbkhlYWRlciA9PT0gdHJ1ZSk7XG5cbiAgICB0aGlzLnNob3dUb29sYm94ID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLnNob3dUb29sYm94ICE9PSBcInVuZGVmaW5lZFwiID8gb3B0aW9ucy5zaG93VG9vbGJveCA6IHRydWU7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2hvd1BhZ2VzVG9vbGJveCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5rb1Nob3dQYWdlc1Rvb2xib3gob3B0aW9ucy5zaG93UGFnZXNUb29sYm94KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2hvd1N1cnZleVRpdGxlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLnNob3dTdXJ2ZXlUaXRsZSA9IG9wdGlvbnMuc2hvd1N1cnZleVRpdGxlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuYWxsb3dDb250cm9sU3VydmV5VGl0bGVWaXNpYmlsaXR5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLmFsbG93Q29udHJvbFN1cnZleVRpdGxlVmlzaWJpbGl0eSA9XG4gICAgICAgICEhb3B0aW9ucy5hbGxvd0NvbnRyb2xTdXJ2ZXlUaXRsZVZpc2liaWxpdHk7XG4gICAgfVxuICB9XG5cbiAgLy8gZ2V0IHRvb2xib3hJdGVtcygpIHtcbiAgLy8gICByZXR1cm4gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5xdWVzdGlvblR5cGVzXG4gIC8vICAgICA/IHRoaXMub3B0aW9ucy5xdWVzdGlvblR5cGVzXG4gIC8vICAgICA6IG51bGw7XG4gIC8vIH1cblxuICB0aGVtZUNzcyA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gW1wiYm9vdHN0cmFwXCIsIFwiYm9vdHN0cmFwbWF0ZXJpYWxcIiwgXCJtb2Rlcm5cIl0uaW5kZXhPZihcbiAgICAgIFN0eWxlc01hbmFnZXIuY3VycmVudFRoZW1lKClcbiAgICApID09PSAtMVxuICAgICAgPyBcInN2X2RlZmF1bHRfY3NzXCJcbiAgICAgIDogXCJzdl9cIiArIFN0eWxlc01hbmFnZXIuY3VycmVudFRoZW1lKCkgKyBcIl9jc3NcIjtcbiAgfSk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVLb0NhblVuZG9SZWRvKCkge1xuICAgIHRoaXMua29DYW5VbmRvKCF0aGlzLnJlYWRPbmx5ICYmIHRoaXMudW5kb1JlZG9NYW5hZ2VyLmNhblVuZG8oKSk7XG4gICAgdGhpcy5rb0NhblJlZG8oIXRoaXMucmVhZE9ubHkgJiYgdGhpcy51bmRvUmVkb01hbmFnZXIuY2FuUmVkbygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRUb29sYmFySXRlbXMoKSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSB0aGlzLmNvbW1hbmRzO1xuICAgIE9iamVjdC5rZXlzKGNvbW1hbmRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGxldCBjb21tYW5kID0gY29tbWFuZHNba2V5XTtcbiAgICAgIGxldCB0b29sYmFySXRlbSA9IGNvbW1hbmQudG9vbGJhcjtcbiAgICAgIGlmICghdG9vbGJhckl0ZW0pIHJldHVybjtcblxuICAgICAgaWYgKCF0b29sYmFySXRlbS5hY3Rpb24pIHtcbiAgICAgICAgdG9vbGJhckl0ZW0uYWN0aW9uID0gKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnJlYWRPbmx5KSByZXR1cm47XG4gICAgICAgICAgdGhpcy5leGVjdXRlKGNvbW1hbmQpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRvb2xiYXJJdGVtcy5wdXNoKHRvb2xiYXJJdGVtKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gZm9yY2UgdXBkYXRlIHRoaXMgZWxlbWVudCBpbiBlZGl0b3IuXG4gICAqIEBwYXJhbSBlbGVtZW50IFN1cnZleS5RdWVzdGlvbiBpcyBlbGVtZW50IHRvIHVwZGF0ZVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZShlbGVtZW50OiBTdXJ2ZXkuUXVlc3Rpb24pIHtcbiAgICBlbGVtZW50W1wia29FbGVtZW50VHlwZVwiXS5ub3RpZnlTdWJzY3JpYmVycygpO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIHJlbmRlciB0aGUgU3VydmV5IENyZWF0b3IuXG4gICAqIEBwYXJhbSBlbGVtZW50IEh0bWxFbGVtZW50IG9yIGh0bWwgZWxlbWVudCBpZCB3aGVyZSBzdXJ2ZXkgY3JlYXRvciB3aWxsIGJlIHJlbmRlcmVkXG4gICAqIEBwYXJhbSBvcHRpb25zIHN1cnZleSBjcmVhdG9yIG9wdGlvbnMuIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOiBzaG93SlNPTkVkaXRvclRhYiwgc2hvd1Rlc3RTdXJ2ZXlUYWIsIHNob3dFbWJlZGRlZFN1cnZleVRhYixcbiAgICogc2hvd1RyYW5zbGF0aW9uVGFiLCBzaG93TG9naWNUYWIsIHNob3dPcHRpb25zLCBnZW5lcmF0ZVZhbGlkSlNPTiwgaXNBdXRvU2F2ZSwgZGVzaWduZXJIZWlnaHQuXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyKGVsZW1lbnQ6IGFueSA9IG51bGwsIG9wdGlvbnM6IGFueSA9IG51bGwpIHtcbiAgICBpZiAob3B0aW9ucykgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIGVsZW1lbnQgPSB0aGlzLnJlbmRlcmVkRWxlbWVudDtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcbiAgICBlbGVtZW50LmlubmVySFRNTCA9IHRlbXBsYXRlRWRpdG9ySHRtbDtcbiAgICBzZWxmLmFwcGx5QmluZGluZygpO1xuICB9XG4gIHB1YmxpYyBsb2FkU3VydmV5KHN1cnZleUlkOiBzdHJpbmcpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgbmV3IFN1cnZleS5keFN1cnZleVNlcnZpY2UoKS5sb2FkU3VydmV5KFxuICAgICAgc3VydmV5SWQsXG4gICAgICBmdW5jdGlvbiAoc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgcmVzdWx0KSB7XG4gICAgICAgICAgc2VsZi50ZXh0ID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBKU09OIGFzIHRleHQgIGludG8gc3VydmV5LiBDbGVhciB1bmRvL3JlZG8gc3RhdGVzIG9wdGlvbmFsbHkuXG4gICAqIEBwYXJhbSB2YWx1ZSBKU09OIGFzIHRleHRcbiAgICogQHBhcmFtIGNsZWFyU3RhdGUgZGVmYXVsdCBmYWxzZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIHRydWUgdG8gY2xlYXIgdW5kby9yZWRvIHN0YXRlcy5cbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VUZXh0KHZhbHVlOiBzdHJpbmcsIGNsZWFyU3RhdGUgPSBmYWxzZSkge1xuICAgIHN1cGVyLmNoYW5nZVRleHQodmFsdWUsIGNsZWFyU3RhdGUpO1xuICAgIHZhciB0ZXh0V29ya2VyID0gbmV3IFN1cnZleVRleHRXb3JrZXIodmFsdWUpO1xuICAgIGlmICh0ZXh0V29ya2VyLmlzSnNvbkNvcnJlY3QpIHtcbiAgICAgIHRoaXMuaW5pdFN1cnZleVdpdGhKU09OKHRleHRXb3JrZXIuc3VydmV5LnRvSlNPTigpLCBjbGVhclN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rb1ZpZXdUeXBlKFwiZWRpdG9yXCIpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaW5pdFN1cnZleVdpdGhKU09OKGpzb246IGFueSwgY2xlYXJTdGF0ZTogYm9vbGVhbikge1xuICAgIHRoaXMuaW5pdFN1cnZleShqc29uKTtcbiAgICBpZiAodGhpcy5zaG93RGVzaWduZXJUYWIpIHtcbiAgICAgIHRoaXMuc2hvd0Rlc2lnbmVyKCk7XG4gICAgfVxuICAgIHRoaXMuc2V0VW5kb1JlZG9DdXJyZW50U3RhdGUoY2xlYXJTdGF0ZSk7XG4gIH1cbiAgcHVibGljIGdldCBzdXJ2ZXlMaXZlVGVzdGVyKCk6IFN1cnZleUxpdmVUZXN0ZXIge1xuICAgIHJldHVybiB0aGlzLnN1cnZleUxpdmU7XG4gIH1cbiAgLyoqXG4gICAqIFRvb2xib3ggb2JqZWN0LiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBRdWVzdGlvbiB0b29sYm94IGl0ZW1zLlxuICAgKiBAc2VlIFF1ZXN0aW9uVG9vbGJveFxuICAgKi9cbiAgcHVibGljIGdldCB0b29sYm94KCk6IFF1ZXN0aW9uVG9vbGJveCB7XG4gICAgcmV0dXJuIHRoaXMudG9vbGJveFZhbHVlO1xuICB9XG4gIC8vIHB1YmxpYyBzZXQgdG9vbGJveChuZXdWYWx1ZTogUXVlc3Rpb25Ub29sYm94KSB7XG4gIC8vICAgdGhpcy50b29sYm94VmFsdWUgPSBuZXdWYWx1ZTtcbiAgLy8gfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0cmFuc2xhdGlvbiBtb2RlIG9iamVjdC5cbiAgICogQHNlZSBzaG93VHJhbnNsYXRpb25UYWJcbiAgICovXG4gIHB1YmxpYyBnZXQgdHJhbnNsYXRpb24oKTogVHJhbnNsYXRpb24ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCB0cmFuc2xhdGlvbihuZXdWYWx1ZTogVHJhbnNsYXRpb24pIHtcbiAgICB0aGlzLnRyYW5zbGF0aW9uVmFsdWUgPSBuZXdWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsb2dpYyBtb2RlIG9iamVjdC5cbiAgICogQHNlZSBzaG93TG9naWNUYWJcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9naWMoKTogU3VydmV5TG9naWMge1xuICAgIHJldHVybiB0aGlzLmxvZ2ljVmFsdWU7XG4gIH1cbiAgLy8gcHVibGljIHNldCBsb2dpYyhsb2dpYzogU3VydmV5TG9naWMpIHtcbiAgLy8gICB0aGlzLmxvZ2ljVmFsdWUgPSBsb2dpYztcbiAgLy8gfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgdG9vbGJhciBpdGVtcy4gWW91IG1heSBhZGQvcmVtb3ZlL3JlcGxhY2UgdGhlbS5cbiAgICogQHNlZSBJQWN0aW9uXG4gICAqL1xuICBwdWJsaWMgdG9vbGJhckl0ZW1zID0ga28ub2JzZXJ2YWJsZUFycmF5PElBY3Rpb24+KCk7XG4gIC8qKlxuICAgKiBHZXQgYW5kIHNldCB0aGUgbWF4aW11bSBvZiBjb3BpZWQgcXVlc3Rpb25zL3BhbmVscyBpbiB0aGUgdG9vbGJveC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgM1xuICAgKi9cbiAgcHVibGljIGdldCBjdXN0b21Ub29sYm94UXVlc3Rpb25NYXhDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRvb2xib3guY29waWVkSXRlbU1heENvdW50O1xuICB9XG4gIHB1YmxpYyBzZXQgY3VzdG9tVG9vbGJveFF1ZXN0aW9uTWF4Q291bnQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMudG9vbGJveC5jb3BpZWRJdGVtTWF4Q291bnQgPSB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3JlYXRvciBzdGF0ZS4gSXQgbWF5IHJldHVybiBlbXB0eSBzdHJpbmcgb3IgXCJzYXZpbmdcIiBhbmQgXCJzYXZlZFwiLlxuICAgKi9cbiAgcHVibGljIGdldCBzdGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN0YXRlVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFN0YXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YXRlVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmtvU3RhdGUodGhpcy5zdGF0ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gdHJpZ2dlcnMgdXNlciBub3RpZmljYXRpb24gKHZpYSB0aGUgYWxlcnQoKSBmdW5jdGlvbiBpZiBubyBvbk5vdGlmeSBldmVudCBoYW5kbGVyIGFkZGVkKS5cbiAgICogQHNlZSBvbk5vdGlmeVxuICAgKi9cbiAgcHVibGljIG5vdGlmeShtc2c6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm9uTm90aWZ5LmlzRW1wdHkpIHtcbiAgICAgIGFsZXJ0KG1zZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25Ob3RpZnkuZmlyZSh0aGlzLCB7IG1lc3NhZ2U6IG1zZyB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWxheSBvbiBzYXZpbmcgc3VydmV5IEpTT04gb24gYXV0b1NhdmUgaW4gbXMuIEl0IGlzIDUwMCBtcyBieSBkZWZhdWx0LlxuICAgKiBJZiBkdXJpbmcgdGhpcyBwZXJpb2Qgb2YgdGltZSBhbiBlbmQtdXNlciBtb2RpZnkgc3VydmV5LCB0aGVuIHRoZSBsYXN0IHZlcnNpb24gd2lsbCBiZSBzYXZlZCBvbmx5LiBTZXQgdG8gMCB0byBzYXZlIGltbWVkaWF0ZWx5LlxuICAgKiBAc2VlIGlzQXV0b1NhdmVcbiAgICovXG4gIHB1YmxpYyBhdXRvU2F2ZURlbGF5OiBudW1iZXIgPSA1MDA7XG4gIHByaXZhdGUgYXV0b1NhdmVUaW1lcklkID0gbnVsbDtcbiAgcHJvdGVjdGVkIGRvQXV0b1NhdmUoKSB7XG4gICAgaWYgKHRoaXMuYXV0b1NhdmVEZWxheSA8PSAwKSB7XG4gICAgICB0aGlzLmRvU2F2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmF1dG9TYXZlVGltZXJJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuYXV0b1NhdmVUaW1lcklkKTtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuYXV0b1NhdmVUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBjbGVhclRpbWVvdXQoc2VsZi5hdXRvU2F2ZVRpbWVySWQpO1xuICAgICAgc2VsZi5hdXRvU2F2ZVRpbWVySWQgPSBudWxsO1xuICAgICAgc2VsZi5kb1NhdmUoKTtcbiAgICB9LCB0aGlzLmF1dG9TYXZlRGVsYXkpO1xuICB9XG4gIHNhdmVObzogbnVtYmVyID0gMDtcbiAgcHJvdGVjdGVkIGRvU2F2ZSgpIHtcbiAgICB0aGlzLnNldFN0YXRlKFwic2F2aW5nXCIpO1xuICAgIGlmICh0aGlzLnNhdmVTdXJ2ZXlGdW5jKSB7XG4gICAgICB0aGlzLnNhdmVObysrO1xuICAgICAgdGhpcy5zYXZlU3VydmV5RnVuYyh0aGlzLnNhdmVObywgKG5vOiBudW1iZXIsIGlzU3VjY2VzczogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAodGhpcy5zYXZlTm8gIT09IG5vKSByZXR1cm47XG4gICAgICAgIGlmIChpc1N1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwic2F2ZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2hvd0Vycm9yT25GYWlsZWRTYXZlKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeSh0aGlzLmdldExvY1N0cmluZyhcImVkLnNhdmVFcnJvclwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXCJtb2RpZmllZFwiKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXRNb2RpZmllZChvcHRpb25zOiBhbnkgPSBudWxsKSB7XG4gICAgc3VwZXIuc2V0TW9kaWZpZWQob3B0aW9ucyk7IC8vIFRPRE86IG1vdmUgdG8gc3VwZXIgY2xhc3NcbiAgICB0aGlzLnNldFN0YXRlKFwibW9kaWZpZWRcIik7XG4gICAgdGhpcy5zZXRVbmRvUmVkb0N1cnJlbnRTdGF0ZSgpO1xuICAgIHRoaXMub25Nb2RpZmllZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuaXNBdXRvU2F2ZSAmJiB0aGlzLmRvQXV0b1NhdmUoKTtcbiAgfVxuICAvKipcbiAgICogVW5kbyB0aGUgbGF0ZXN0IHVzZXIgb3BlcmF0aW9uLiBSZXR1cm5zIHRydWUgaWYgaXQgcGVyZm9ybWVzIHN1Y2Nlc3NmdWwuXG4gICAqL1xuICBwdWJsaWMgdW5kbyA9ICgpID0+IHtcbiAgICB0aGlzLmRvVW5kb0NsaWNrKCk7XG4gIH07XG4gIC8qKlxuICAgKiBSZWRvIHRoZSBsYXRlc3QgdW5kbyBvcGVyYXRpb24uIFJldHVybnMgdHJ1ZSBpZiBpdCBwZXJmb3JtZXMgc3VjY2Vzc2Z1bC5cbiAgICovXG4gIHB1YmxpYyByZWRvID0gKCkgPT4ge1xuICAgIHRoaXMuZG9SZWRvQ2xpY2soKTtcbiAgfTtcbiAgcHJpdmF0ZSBzZXRVbmRvUmVkb0N1cnJlbnRTdGF0ZShjbGVhclN0YXRlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAvLyBpZiAoY2xlYXJTdGF0ZSkgeyBUT0RPIHVuZG9yZWRvXG4gICAgLy8gICB0aGlzLnVuZG9SZWRvTWFuYWdlci5jbGVhcigpO1xuICAgIC8vIH1cbiAgICAvLyB2YXIgc2VsT2JqID0gdGhpcy5rb1NlbGVjdGVkT2JqZWN0KCkgPyB0aGlzLmtvU2VsZWN0ZWRPYmplY3QoKS52YWx1ZSA6IG51bGw7XG4gICAgLy8gdGhpcy51bmRvUmVkb01hbmFnZXIuc2V0Q3VycmVudCh0aGlzLnN1cnZleVZhbHVlKCksIHNlbE9iaiA/IHNlbE9iai5uYW1lIDogbnVsbCk7XG4gIH1cbiAgLyoqXG4gICAqIEFzc2lnbiB0byB0aGlzIHByb3BlcnR5IGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBjbGlja2luZyB0aGUgJ1NhdmUnIGJ1dHRvbiBvciBvbiBhbnkgY2hhbmdlIGlmIGlzQXV0b1NhdmUgZXF1YWxzIHRydWUuXG4gICAqIEBzZWUgaXNBdXRvU2F2ZVxuICAgKi9cbiAgcHVibGljIGdldCBzYXZlU3VydmV5RnVuYygpIHtcbiAgICByZXR1cm4gdGhpcy5zYXZlU3VydmV5RnVuY1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgc2F2ZVN1cnZleUZ1bmModmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2F2ZVN1cnZleUZ1bmNWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMua29TaG93U2F2ZUJ1dHRvbih2YWx1ZSAhPSBudWxsICYmICF0aGlzLmlzQXV0b1NhdmUpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSB0byBzaG93IFwiT3B0aW9uc1wiIG1lbnUgYW5kIHRvIGZhbHNlIHRvIGhpZGUgdGhlIG1lbnVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd09wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMua29TaG93T3B0aW9ucygpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd09wdGlvbnModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmtvU2hvd09wdGlvbnModmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgdG8gY29tcGxldGVseSBoaWRlIHRoZSBQcm9wZXJ0eSBHcmlkIG9uIHRoZSByaWdodC4gSXQgYWxsb3dzIHRvIGVkaXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNlbGVjdGVkIG9iamVjdCAocXVlc3Rpb24vcGFuZWwvcGFnZS9zdXJ2ZXkpLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UHJvcGVydHlHcmlkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmtvU2hvd1Byb3BlcnR5R3JpZCgpICE9PSBmYWxzZSAmJlxuICAgICAgdGhpcy5rb1Nob3dQcm9wZXJ0eUdyaWQoKSAhPT0gXCJub25lXCJcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1Byb3BlcnR5R3JpZCh2YWx1ZTogQ29udGFpbmVyTG9jYXRpb24pIHtcbiAgICBpZiAodGhpcy5rb1Nob3dQcm9wZXJ0eUdyaWQoKSAhPSB2YWx1ZSkge1xuICAgICAgdGhpcy5fbGVmdENvbnRhaW5lci5yZW1vdmUoXCJwcm9wZXJ0eS1ncmlkXCIpO1xuICAgICAgdGhpcy5fcmlnaHRDb250YWluZXIucmVtb3ZlKFwicHJvcGVydHktZ3JpZFwiKTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gXCJyaWdodFwiIHx8IHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3JpZ2h0Q29udGFpbmVyLnB1c2goXCJwcm9wZXJ0eS1ncmlkXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09PSBcImxlZnRcIikge1xuICAgICAgICB0aGlzLl9sZWZ0Q29udGFpbmVyLnB1c2goXCJwcm9wZXJ0eS1ncmlkXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5rb1Nob3dQcm9wZXJ0eUdyaWQodmFsdWUpO1xuICAgICAgdGhpcy5rb0hpZGVBZHZhbmNlZFNldHRpbmdzKCF0aGlzLnNob3dQcm9wZXJ0eUdyaWQpO1xuICAgICAgaWYgKHZhbHVlICE9PSBmYWxzZSAmJiB2YWx1ZSAhPT0gXCJub25lXCIgJiYgISF0aGlzLnNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldE5ld09ialRvUHJvcGVydHlHcmlkKHRoaXMuc2VsZWN0ZWRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBcImFsd2F5c1wiLCBcIm5ldmVyXCIgb3IgXCJpZmVudGVyZWRcIi4gVGhlIFwiaWZlbnRlcmVkXCIgaXMgdGhlIGRlZmF1bHQgdmFsdWUgbWVhbnMgc2hvdyBzdXJ2ZXkgdGl0bGUgb25seSBpbiBjYXNlIG9mIHVzZXIgZW50ZXJlZCBpdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1N1cnZleVRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmtvU2hvd1N1cnZleVRpdGxlKCk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93U3VydmV5VGl0bGUodmFsdWUpIHtcbiAgICB0aGlzLmtvU2hvd1N1cnZleVRpdGxlKHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSB3YW50IHRvIGRlbnkgdXNlciB0byBoaWRlL3Nob3cgc3VydmV5IHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0NvbnRyb2xTdXJ2ZXlUaXRsZVZpc2liaWxpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMua29BbGxvd0NvbnRyb2xTdXJ2ZXlUaXRsZVZpc2liaWxpdHkoKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93Q29udHJvbFN1cnZleVRpdGxlVmlzaWJpbGl0eSh2YWx1ZSkge1xuICAgIHRoaXMua29BbGxvd0NvbnRyb2xTdXJ2ZXlUaXRsZVZpc2liaWxpdHkodmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgdG8gIGhpZGUgdGhlIHBhZ2VzIHRvb2xib3ggb24gdGhlIHRvcC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1BhZ2VzVG9vbGJveCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5rb1Nob3dQYWdlc1Rvb2xib3goKSAhPT0gZmFsc2UgJiZcbiAgICAgIHRoaXMua29TaG93UGFnZXNUb29sYm94KCkgIT09IFwibm9uZVwiXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQYWdlc1Rvb2xib3godmFsdWU6IENvbnRhaW5lckxvY2F0aW9uKSB7XG4gICAgdGhpcy5rb1Nob3dQYWdlc1Rvb2xib3godmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBZb3UgaGF2ZSB0byBzZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB2aWEgb3B0aW9ucyBvbiBjcmVhdGluZyBTdXJ2ZXlKUyBDcmVhdG9yIHRvIHVzZSBwb3B1cCBlZGl0b3IgYW5kIG9sZCBwcm9wZXJ0eSBncmlkLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93RWxlbWVudEVkaXRvckFzUHJvcGVydHlHcmlkKCkge1xuICAgIHJldHVybiB0aGlzLmtvU2hvd0VsZW1lbnRFZGl0b3JBc1Byb3BlcnR5R3JpZCgpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgdG8gIGhpZGUgdGhlIHF1ZXN0aW9uIHRvb2xib3ggb24gdGhlIGxlZnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dUb29sYm94KCkge1xuICAgIHJldHVybiB0aGlzLmtvU2hvd1Rvb2xib3goKSAhPT0gZmFsc2UgJiYgdGhpcy5rb1Nob3dUb29sYm94KCkgIT09IFwibm9uZVwiO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1Rvb2xib3godmFsdWU6IENvbnRhaW5lckxvY2F0aW9uKSB7XG4gICAgaWYgKHRoaXMua29TaG93VG9vbGJveCgpICE9IHZhbHVlKSB7XG4gICAgICB0aGlzLl9sZWZ0Q29udGFpbmVyLnJlbW92ZShcInRvb2xib3hcIik7XG4gICAgICB0aGlzLl9yaWdodENvbnRhaW5lci5yZW1vdmUoXCJ0b29sYm94XCIpO1xuICAgICAgaWYgKHZhbHVlID09PSBcImxlZnRcIiB8fCB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLl9sZWZ0Q29udGFpbmVyLnB1c2goXCJ0b29sYm94XCIpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgdGhpcy5fcmlnaHRDb250YWluZXIucHVzaChcInRvb2xib3hcIik7XG4gICAgICB9XG4gICAgICB0aGlzLmtvU2hvd1Rvb2xib3godmFsdWUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQERlcHJlY2F0ZWQgT2Jzb2xldGUgZnJvbSB2MS41LjFcbiAgICogU2V0IGl0IHRvIGZhbHNlIHRvIHRlbXBvcmFyeSBoaWRlIHRoZSBQcm9wZXJ0eSBHcmlkIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjcmVhdG9yLiBVc2VyIHdpbGwgYmUgYWJsZSB0byBzaG93IHRoZSBQcm9wZXJ0eSBHcmlkIGFnYWluIHZpYSB0aGUgY2xpY2sgb24gdGhlICdBZHZhbmNlZCcgbGFiZWwuIEl0IGFsbG93cyB0byBlZGl0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzZWxlY3RlZCBvYmplY3QgKHF1ZXN0aW9uL3BhbmVsL3BhZ2Uvc3VydmV5KS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGlkZUFkdmFuY2VkU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMua29IaWRlQWR2YW5jZWRTZXR0aW5ncygpO1xuICB9XG4gIHB1YmxpYyBzZXQgaGlkZUFkdmFuY2VkU2V0dGluZ3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmtvSGlkZUFkdmFuY2VkU2V0dGluZ3ModmFsdWUpO1xuICAgIGlmIChcbiAgICAgIHRoaXMua29TaG93UHJvcGVydHlHcmlkKCkgPT09IFwicmlnaHRcIiB8fFxuICAgICAgdGhpcy5rb1Nob3dQcm9wZXJ0eUdyaWQoKSA9PT0gdHJ1ZVxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9yaWdodENvbnRhaW5lcigpLmxlbmd0aCA9PT0gMSB8fFxuICAgICAgICAodGhpcy5fcmlnaHRDb250YWluZXIoKS5sZW5ndGggPiAxICYmICF2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLnJpZ2h0Q29udGFpbmVyVmlzaWJsZSghdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5rb1Nob3dQcm9wZXJ0eUdyaWQoKSA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fbGVmdENvbnRhaW5lcigpLmxlbmd0aCA9PT0gMSB8fFxuICAgICAgICAodGhpcy5fbGVmdENvbnRhaW5lcigpLmxlbmd0aCA+IDEgJiYgIXZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubGVmdENvbnRhaW5lclZpc2libGUoIXZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfc2hvd0V4dGVybmFsSGVscExpbmsgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgZ2V0IHNob3dFeHRlcm5hbEhlbHBMaW5rKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93RXh0ZXJuYWxIZWxwTGluaygpO1xuICB9XG4gIHNldCBzaG93RXh0ZXJuYWxIZWxwTGluayh2YWx1ZSkge1xuICAgIHRoaXMuX3Nob3dFeHRlcm5hbEhlbHBMaW5rKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9wbGFjZWhvbGRlckh0bWwgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICBnZXQgcGxhY2Vob2xkZXJIdG1sKCkge1xuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlckh0bWwoKTtcbiAgfVxuICBzZXQgcGxhY2Vob2xkZXJIdG1sKHZhbHVlKSB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXJIdG1sKHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGlkZUV4cHJlc3Npb25IZWFkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZUV4cHJlc3Npb25IZWFkZXJWYWx1ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpdCB0byBcImNhbmNlbFwiIG9yIFwiYXBwbHlcIiB0byBlbmFibGUgY2xvc2luZyBtb2RhbCB3aW5kb3dzIGJ5IGNsaWNraW5nIG91dHNpZGUgcG9wdXAuXG4gICAqIElmIFwiYXBwbHlcIiBpcyBzZXQsIHRoZW4gY2hhbmdlcyB3aWxsIGJlIHNhdmVkLCBvdGhlcndpc2Ugbm90LiBCeSBkZWZhdWx0IHZhbHVlIGlzIFwib2ZmXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgY2xvc2VNb2RhbE91dHNpZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VNb2RhbE91dHNpZGVWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsb3NlTW9kYWxPdXRzaWRlKHZhbHVlOiBcIm9mZlwiIHwgXCJjYW5jZWxcIiB8IFwiYXBwbHlcIikge1xuICAgIHRoaXMuY2xvc2VNb2RhbE91dHNpZGVWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gXCJzaW5nbGVcIiB0byBkZXNpZ24gc3VyZmFjZSBpbiBzaW5nbGUgcGFnZSBtb2RlLiBCeSBkZWZhdWx0IHZhbHVlIGlzIFwic3RhbmRhcmRcIlxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlRWRpdE1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFnZUVkaXRNb2RlVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBmYWxzZSBoaWRlIHRoZSBkcm9wZG93biBwYWdlIHNlbGVjdG9yIGluIHRoZSBwYWdlIGVkaXRvciBhYm92ZSB0aGUgZGVzaWduIHN1cmZhY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd0Ryb3Bkb3duUGFnZVNlbGVjdG9yKCkge1xuICAgIHJldHVybiB0aGlzLnNob3dEcm9wZG93blBhZ2VTZWxlY3RvclZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2xlZnRDb250YWluZXI6IGtvLk9ic2VydmFibGVBcnJheTxzdHJpbmc+O1xuICBwdWJsaWMgZ2V0IGxlZnRDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xlZnRDb250YWluZXIoKTtcbiAgfVxuICBwdWJsaWMgbGVmdENvbnRhaW5lclZpc2libGUgPSBrby5vYnNlcnZhYmxlKHRydWUpO1xuICBwdWJsaWMgbGVmdENvbnRhaW5lckFjdGl2ZUl0ZW0gPSBrby5vYnNlcnZhYmxlPHN0cmluZz4oXCJ0b29sYm94XCIpO1xuICBwcml2YXRlIF9yaWdodENvbnRhaW5lcjoga28uT2JzZXJ2YWJsZUFycmF5PHN0cmluZz47XG4gIHB1YmxpYyBnZXQgcmlnaHRDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JpZ2h0Q29udGFpbmVyKCk7XG4gIH1cbiAgcHVibGljIHJpZ2h0Q29udGFpbmVyVmlzaWJsZSA9IGtvLm9ic2VydmFibGUodHJ1ZSk7XG4gIHB1YmxpYyByaWdodENvbnRhaW5lckFjdGl2ZUl0ZW0gPSBrby5vYnNlcnZhYmxlPHN0cmluZz4oXCJwcm9wZXJ0eS1ncmlkXCIpO1xuICBwcml2YXRlIF90b3BDb250YWluZXI6IGtvLk9ic2VydmFibGVBcnJheTxzdHJpbmc+O1xuICBwdWJsaWMgbGF5b3V0Q2hhbmdlZEluZGljYXRvciA9IGtvLm9ic2VydmFibGUoMCk7XG4gIHB1YmxpYyBnZXQgdG9wQ29udGFpbmVyKCkge1xuICAgIHJldHVybiB0aGlzLl90b3BDb250YWluZXIoKTtcbiAgfVxuICBwdWJsaWMgY2FuU2hvd09iamVjdFByb3BlcnR5KG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIGlmICghb2JqZWN0IHx8ICFvYmplY3QuZ2V0VHlwZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChFZGl0YWJsZU9iamVjdC5pc0NvcHlPYmplY3Qob2JqZWN0KSAmJiBwcm9wZXJ0eU5hbWUgPT09IFwicGFnZVwiKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBwcm9wZXJ0eSA9IFN1cnZleS5TZXJpYWxpemVyLmZpbmRQcm9wZXJ0eShcbiAgICAgIG9iamVjdC5nZXRUeXBlKCksXG4gICAgICBwcm9wZXJ0eU5hbWVcbiAgICApO1xuICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuaXNQcm9wZXJ0eVZpc2libGUob2JqZWN0LCBwcm9wZXJ0eSwgdGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3VzdG9tU29ydFByb3BlcnR5T2JqZWN0UHJvcGVydHkoXG4gICAgb2JqZWN0OiBhbnksXG4gICAgcHJvcGVydHkxOiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIHByb3BlcnR5MjogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuICApOiBudW1iZXIge1xuICAgIGlmICh0aGlzLm9uQ3VzdG9tU29ydFByb3BlcnR5LmlzRW1wdHkpIHJldHVybiAwO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgb2JqOiBvYmplY3QsXG4gICAgICBwcm9wZXJ0eTE6IHByb3BlcnR5MSxcbiAgICAgIHByb3BlcnR5MjogcHJvcGVydHkyLFxuICAgICAgcmVzdWx0OiAwLFxuICAgIH07XG4gICAgdGhpcy5vbkN1c3RvbVNvcnRQcm9wZXJ0eS5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgcGFnZSBpbnRvIHRoZSBlZGl0aW5nIHN1cnZleS4gUmV0dXJucyB0aGUgbmV3IGNyZWF0ZWQgcGFnZSBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIGFkZFBhZ2UgPSAoKTogU3VydmV5LlBhZ2UgPT4ge1xuICAgIHZhciBuYW1lID0gU3VydmV5SGVscGVyLmdldE5ld1BhZ2VOYW1lKHRoaXMuc3VydmV5LnBhZ2VzKTtcbiAgICB2YXIgcGFnZSA9IDxTdXJ2ZXkuUGFnZT50aGlzLnN1cnZleS5hZGROZXdQYWdlKG5hbWUpO1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gcGFnZTtcbiAgICByZXR1cm4gcGFnZTtcbiAgfTtcbiAgcHVibGljIGRlbGV0ZVBhZ2UgPSAoKSA9PiB7XG4gICAgdGhpcy5kZWxldGVDdXJyZW50T2JqZWN0KCk7XG4gIH07XG4gIHB1YmxpYyBtb3ZlUGFnZSA9IChwYWdlOiBTdXJ2ZXkuUGFnZU1vZGVsLCBpbmRleEZyb206IG51bWJlcikgPT4ge1xuICAgIHZhciBpbmRleFRvID0gdGhpcy5zdXJ2ZXkucGFnZXMuaW5kZXhPZihwYWdlKTtcbiAgICB0aGlzLnNldE1vZGlmaWVkKHtcbiAgICAgIHR5cGU6IFwiUEFHRV9NT1ZFRFwiLFxuICAgICAgcGFnZTogcGFnZSxcbiAgICAgIGluZGV4RnJvbTogaW5kZXhGcm9tLFxuICAgICAgaW5kZXhUbzogaW5kZXhUbyxcbiAgICB9KTtcbiAgfTtcbiAgcHVibGljIGFkZFBhZ2VUb1VJKHBhZ2U6IFN1cnZleS5QYWdlKSB7XG4gICAgdGhpcy5zdXJ2ZXlPYmplY3RzLmFkZFBhZ2UocGFnZSk7XG4gIH1cbiAgcHJpdmF0ZSBkb09uUXVlc3Rpb25BZGRlZChxdWVzdGlvbjogU3VydmV5LlF1ZXN0aW9uLCBwYXJlbnRQYW5lbDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmRyYWdEcm9wSGVscGVyLmlzTW92aW5nKSB7XG4gICAgICBxdWVzdGlvbi5uYW1lID0gdGhpcy5nZW5lcmF0ZVVuaXF1ZU5hbWUocXVlc3Rpb24sIHF1ZXN0aW9uLm5hbWUpO1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLmdldFBhZ2VCeUVsZW1lbnQocXVlc3Rpb24pO1xuICAgICAgdmFyIG9wdGlvbnMgPSB7IHF1ZXN0aW9uOiBxdWVzdGlvbiwgcGFnZTogcGFnZSB9O1xuICAgICAgdGhpcy5hZGRpbmdPYmplY3QgPSBxdWVzdGlvbjtcbiAgICAgIHRoaXMub25RdWVzdGlvbkFkZGVkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgICB0aGlzLmFkZGluZ09iamVjdCA9IG51bGw7XG4gICAgfVxuICAgIGlmIChwYXJlbnRQYW5lbC5lbGVtZW50cy5pbmRleE9mKHF1ZXN0aW9uKSAhPT0gLTEpIHtcbiAgICAgIHRoaXMuc3VydmV5T2JqZWN0cy5hZGRFbGVtZW50KHF1ZXN0aW9uLCBwYXJlbnRQYW5lbCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZG9PbkVsZW1lbnRSZW1vdmVkKGVsZW1lbnQ6IFN1cnZleS5CYXNlKSB7XG4gICAgdGhpcy5zdXJ2ZXlPYmplY3RzLnJlbW92ZU9iamVjdChlbGVtZW50KTtcbiAgfVxuICBwcml2YXRlIGRvT25QYW5lbEFkZGVkKHBhbmVsOiBTdXJ2ZXkuUGFuZWwsIHBhcmVudFBhbmVsOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BIZWxwZXIuaXNNb3ZpbmcpIHtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5nZXRQYWdlQnlFbGVtZW50KHBhbmVsKTtcbiAgICAgIHZhciBvcHRpb25zID0geyBwYW5lbDogcGFuZWwsIHBhZ2U6IHBhZ2UgfTtcbiAgICAgIHRoaXMuYWRkaW5nT2JqZWN0ID0gcGFuZWw7XG4gICAgICB0aGlzLm9uUGFuZWxBZGRlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgdGhpcy5hZGRpbmdPYmplY3QgPSBudWxsO1xuICAgIH1cbiAgICBpZiAocGFyZW50UGFuZWwuZWxlbWVudHMuaW5kZXhPZihwYW5lbCkgIT09IC0xKSB7XG4gICAgICB0aGlzLnN1cnZleU9iamVjdHMuYWRkRWxlbWVudChwYW5lbCwgcGFyZW50UGFuZWwpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGRvT25QYWdlQWRkZWQocGFnZTogU3VydmV5LlBhZ2UpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcGFnZTogcGFnZSB9O1xuICAgIHRoaXMuYWRkaW5nT2JqZWN0ID0gcGFnZTtcbiAgICB0aGlzLm9uUGFnZUFkZGVkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5hZGRpbmdPYmplY3QgPSBudWxsO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVPYmplY3RUZXh0SW5Qcm9wZXJ0eUdyaWQob2JqOiBTdXJ2ZXkuQmFzZSkge1xuICAgIGlmICghIXRoaXMuc3VydmV5T2JqZWN0cykge1xuICAgICAgdGhpcy5zdXJ2ZXlPYmplY3RzLm5hbWVDaGFuZ2VkKG9iaik7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgb25Qcm9wZXJ0eUNoYW5nZWQoXG4gICAgb2JqOiBhbnksXG4gICAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgb2xkVmFsdWU6IGFueVxuICApIHtcbiAgICB2YXIgdmFsdWUgPSBvYmpbcHJvcGVydHkubmFtZV07XG4gICAgaWYgKHByb3BlcnR5Lm5hbWUgPT0gXCJuYW1lXCIpIHtcbiAgICAgIHRoaXMub25FbGVtZW50TmFtZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIG9iajogb2JqLFxuICAgICAgICBvbGROYW1lOiBvbGRWYWx1ZSxcbiAgICAgICAgbmV3TmFtZTogdmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcHJvcGVydHkubmFtZSA9PSBcIm5hbWVcIiB8fFxuICAgICAgcHJvcGVydHkubmFtZSA9PSBcInRpdGxlXCIgfHxcbiAgICAgICF0aGlzLm9uR2V0T2JqZWN0VGV4dEluUHJvcGVydHlHcmlkLmlzRW1wdHkgfHxcbiAgICAgICF0aGlzLm9uR2V0T2JqZWN0RGlzcGxheU5hbWUuaXNFbXB0eVxuICAgICkge1xuICAgICAgdGhpcy5zdXJ2ZXlPYmplY3RzLm5hbWVDaGFuZ2VkKG9iaik7XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0eS5uYW1lID09PSBcIm5hbWVcIikge1xuICAgICAgdGhpcy5kaXJ0eVBhZ2VVcGRhdGUoKTsgLy9UT0RPIHdoeSB0aGlzIGlzIG5lZWQgPyAoa28gcHJvYmxlbSlcbiAgICB9IGVsc2UgaWYgKHByb3BlcnR5Lm5hbWUgPT09IFwicGFnZVwiKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IHZhbHVlO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBvYmo7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblByb3BlcnR5Q29ycmVjdFZhbHVlQmVmb3JlU2V0KFxuICAgIG9iajogYW55LFxuICAgIHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgaWYgKHByb3BlcnR5Lm5hbWUgPT09IFwicGFnZVwiICYmIHR5cGVvZiBuZXdWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIG9iai5zdXJ2ZXkuZ2V0UGFnZUJ5TmFtZShuZXdWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9Qcm9wZXJ0eUdyaWRDaGFuZ2VkKCkge1xuICAgIGlmICghdGhpcy5zaG93UHJvcGVydHlHcmlkKSByZXR1cm47XG4gICAgdGhpcy5wcm9wZXJ0eUdyaWRPYmplY3RFZGl0b3JNb2RlbC5vYmplY3RDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXROZXdPYmpUb1Byb3BlcnR5R3JpZChuZXdPYmo6IGFueSkge1xuICAgIGlmICghdGhpcy5zaG93UHJvcGVydHlHcmlkKSByZXR1cm47XG4gICAgdGhpcy5wcm9wZXJ0eUdyaWRPYmplY3RFZGl0b3JNb2RlbC5zZWxlY3RlZE9iamVjdCA9IG5ld09iajtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuU3dpdGNoVmlld1R5cGUobmV3VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKG5ld1R5cGUgJiYgdGhpcy5rb1ZpZXdUeXBlKCkgPT0gbmV3VHlwZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChcbiAgICAgICh0aGlzLmtvVmlld1R5cGUoKSA9PSBcInRyYW5zbGF0aW9uXCIgfHwgdGhpcy5rb1ZpZXdUeXBlKCkgPT0gXCJsb2dpY1wiKSAmJlxuICAgICAgbmV3VHlwZSA9PSBcImRlc2lnbmVyXCJcbiAgICApIHtcbiAgICAgIHRoaXMuc3VydmV5LnJlbmRlcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5rb1ZpZXdUeXBlKCkgIT0gXCJlZGl0b3JcIikgcmV0dXJuIHRydWU7XG4gICAgdmFyIHRleHRXb3JrZXIgPSBuZXcgU3VydmV5VGV4dFdvcmtlcih0aGlzLnRleHQpO1xuICAgIGlmICghdGV4dFdvcmtlci5pc0pzb25Db3JyZWN0KSB7XG4gICAgICB0aGlzLm5vdGlmeSh0aGlzLmdldExvY1N0cmluZyhcImVkLmNvcnJlY3RKU09OXCIpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMucmVhZE9ubHkgJiZcbiAgICAgICEhdGhpcy5nZXRTdXJ2ZXlKU09OVGV4dENhbGxiYWNrICYmXG4gICAgICB0aGlzLmdldFN1cnZleUpTT05UZXh0Q2FsbGJhY2soKS5pc01vZGlmaWVkXG4gICAgKSB7XG4gICAgICB0aGlzLmluaXRTdXJ2ZXkobmV3IFN1cnZleS5Kc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHRleHRXb3JrZXIuc3VydmV5KSk7XG4gICAgICB0aGlzLnNldE1vZGlmaWVkKHsgdHlwZTogXCJWSUVXX1RZUEVfQ0hBTkdFRFwiLCBuZXdUeXBlOiBuZXdUeXBlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzaG93IHZpZXcgbmFtZS4gVGhlIHBvc3NpYmxlIHJldHVybnMgdmFsdWVzIGFyZTpcbiAgICogXCJkZXNpZ25lclwiLCBcImVkaXRvclwiLCBcInRlc3RcIiwgXCJlbWJlZFwiLCBcImxvZ2ljXCIgYW5kIFwidHJhbnNsYXRpb25cIi5cbiAgICogQHNlZSBzaG93RGVzaWduZXJcbiAgICogQHNlZSBzaG93VGVzdFN1cnZleVxuICAgKiBAc2VlIHNob3dKc29uRWRpdG9yXG4gICAqIEBzZWUgc2hvd0xvZ2ljRWRpdG9yXG4gICAqIEBzZWUgc2hvd1RyYW5zbGF0aW9uRWRpdG9yXG4gICAqIEBzZWUgc2hvd0VtYmVkRWRpdG9yXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dpbmdWaWV3TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtvVmlld1R5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgXCJTdXJ2ZXkgRGVzaWduZXJcIiB0YWIgYWN0aXZlLlxuICAgKi9cbiAgcHVibGljIHNob3dEZXNpZ25lcigpIHtcbiAgICB0aGlzLm1ha2VOZXdWaWV3QWN0aXZlKFwiZGVzaWduZXJcIik7XG4gIH1cbiAgLyoqXG4gICAqIE1ha2UgYSBcIkpTT04gRWRpdG9yXCIgdGFiIGFjdGl2ZS5cbiAgICovXG4gIHB1YmxpYyBzaG93SnNvbkVkaXRvcigpIHtcbiAgICB0aGlzLm1ha2VOZXdWaWV3QWN0aXZlKFwiZWRpdG9yXCIpO1xuICB9XG4gIC8qKlxuICAgKiBNYWtlIGEgXCJUZXN0IFN1cnZleVwiIHRhYiBhY3RpdmUuXG4gICAqL1xuICBwdWJsaWMgc2hvd1Rlc3RTdXJ2ZXkoKSB7XG4gICAgdGhpcy5tYWtlTmV3Vmlld0FjdGl2ZShcInRlc3RcIik7XG4gIH1cbiAgLyoqXG4gICAqIE1ha2UgYSBcIkVtYmVkIFN1cnZleVwiIHRhYiBhY3RpdmUuXG4gICAqL1xuICBwdWJsaWMgc2hvd0VtYmVkRWRpdG9yKCkge1xuICAgIHRoaXMubWFrZU5ld1ZpZXdBY3RpdmUoXCJlbWJlZFwiKTtcbiAgfVxuICAvKipcbiAgICogTWFrZSBhIFwiVHJhbnNsYXRpb25cIiB0YWIgYWN0aXZlLlxuICAgKi9cbiAgcHVibGljIHNob3dUcmFuc2xhdGlvbkVkaXRvcigpIHtcbiAgICB0aGlzLm1ha2VOZXdWaWV3QWN0aXZlKFwidHJhbnNsYXRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIE1ha2UgYSBcIkxvZ2ljXCIgdGFiIGFjdGl2ZS5cbiAgICovXG4gIHB1YmxpYyBzaG93TG9naWNFZGl0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmNhblN3aXRjaFZpZXdUeXBlKFwibG9naWNcIikpIHJldHVybjtcbiAgICB0aGlzLmtvVmlld1R5cGUoXCJsb2dpY1wiKTtcbiAgfVxuICBwcml2YXRlIGdldFBhZ2VCeUVsZW1lbnQob2JqOiBTdXJ2ZXkuQmFzZSk6IFN1cnZleS5QYWdlIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuc3VydmV5LmdldFBhZ2VCeUVsZW1lbnQoPFN1cnZleS5JRWxlbWVudD4oPGFueT5vYmopKTtcbiAgICBpZiAocGFnZSkgcmV0dXJuIDxTdXJ2ZXkuUGFnZT5wYWdlO1xuICAgIHJldHVybiB0aGlzLnN1cnZleU9iamVjdHMuZ2V0U2VsZWN0ZWRPYmplY3RQYWdlKG9iaik7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgb2JqZWN0IGluIHRoZSBDcmVhdG9yLiBJdCBjYW4gYmUgYSBxdWVzdGlvbiwgcGFuZWwsIHBhZ2Ugb3Igc3VydmV5IGl0c2VsZi5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRFbGVtZW50KCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5rb1NlbGVjdGVkT2JqZWN0KCkgPyB0aGlzLmtvU2VsZWN0ZWRPYmplY3QoKS52YWx1ZSA6IG51bGw7XG4gIH1cbiAgcHVibGljIHNldCBzZWxlY3RlZEVsZW1lbnQodmFsOiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQgIT09IHZhbCkge1xuICAgICAgdGhpcy5zdXJ2ZXlPYmplY3RzLnNlbGVjdE9iamVjdCh2YWwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RFbGVtZW50KGVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBmb3IgZXJyb3JzIGluIHByb3BlcnR5IGdyaWQgYW5kIGFkb3JuZXJzIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50cy5cbiAgICogUmV0dXJucyB0cnVlIGlmIHNlbGVjdGVkIGVsZW1lbnQgaXMgbnVsbCBvciB0aGVyZSBpcyBubyBlcnJvcnMuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVTZWxlY3RlZEVsZW1lbnQoKTogYm9vbGVhbiB7XG4gICAgdmFyIGlzVmFsaWQgPSB0cnVlO1xuICAgIGlmICghdGhpcy5zZWxlY3RlZEVsZW1lbnQpIHJldHVybiBpc1ZhbGlkO1xuICAgIGlmICghIXRoaXMucHJvcGVydHlHcmlkT2JqZWN0RWRpdG9yTW9kZWwpIHtcbiAgICAgIGlzVmFsaWQgPSAhdGhpcy5wcm9wZXJ0eUdyaWRPYmplY3RFZGl0b3JNb2RlbC5oYXNFcnJvcnMoKTtcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7IGVycm9yczogW10gfTtcbiAgICB0aGlzLm9uVmFsaWRhdGVTZWxlY3RlZEVsZW1lbnQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gaXNWYWxpZCAmJiBvcHRpb25zLmVycm9ycy5sZW5ndGggPT0gMDtcbiAgfVxuICBwcml2YXRlIHNlbGVjdGVkT2JqZWN0Q2hhbmdlZChvYmo6IFN1cnZleS5CYXNlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IG5ld1NlbGVjdGVkRWxlbWVudDogb2JqIH07XG4gICAgdGhpcy5vblNlbGVjdGVkRWxlbWVudENoYW5naW5nLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKG9iaiAhPSBvcHRpb25zLm5ld1NlbGVjdGVkRWxlbWVudCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBvcHRpb25zLm5ld1NlbGVjdGVkRWxlbWVudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNhbkRlbGV0ZU9iamVjdCA9IGZhbHNlO1xuICAgIHRoaXMuc2V0TmV3T2JqVG9Qcm9wZXJ0eUdyaWQob2JqKTtcbiAgICB2YXIgb2JqVHlwZSA9IFN1cnZleUhlbHBlci5nZXRPYmplY3RUeXBlKG9iaik7XG4gICAgaWYgKG9ialR5cGUgPT0gT2JqVHlwZS5QYWdlKSB7XG4gICAgICB0aGlzLnN1cnZleS5jdXJyZW50UGFnZSA9IDxTdXJ2ZXkuUGFnZT5vYmo7XG4gICAgICBjYW5EZWxldGVPYmplY3QgPSB0aGlzLnN1cnZleS5wYWdlcy5sZW5ndGggPiAxO1xuICAgIH1cbiAgICBpZiAob2JqVHlwZSA9PSBPYmpUeXBlLlF1ZXN0aW9uIHx8IG9ialR5cGUgPT0gT2JqVHlwZS5QYW5lbCkge1xuICAgICAgdGhpcy5zdXJ2ZXkuc2VsZWN0ZWRFbGVtZW50ID0gb2JqO1xuICAgICAgY2FuRGVsZXRlT2JqZWN0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlID0gdGhpcy5nZXRQYWdlQnlFbGVtZW50KG9iaik7XG4gICAgICB2YXIgaWQgPSBvYmpbXCJpZFwiXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5yZW5kZXJlZEVsZW1lbnQgJiZcbiAgICAgICAgaWQgJiZcbiAgICAgICAgdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2UgJiZcbiAgICAgICAgIW9ialtcInNlbGVjdGVkT25DbGlja1wiXVxuICAgICAgKSB7XG4gICAgICAgIGxldCBlbCA9IDxIVE1MRWxlbWVudD50aGlzLnJlbmRlcmVkRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgaWQpO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZChlbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZVN1cnZleVNlbGVjdGVkRWxlbWVudENoYW5naW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3VydmV5LnNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmRpc2FibGVTdXJ2ZXlTZWxlY3RlZEVsZW1lbnRDaGFuZ2luZyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmtvQ2FuRGVsZXRlT2JqZWN0KGNhbkRlbGV0ZU9iamVjdCk7XG4gICAgdGhpcy5vblNlbGVjdGVkRWxlbWVudENoYW5nZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBwcml2YXRlIGFwcGx5QmluZGluZygpIHtcbiAgICBpZiAodGhpcy5yZW5kZXJlZEVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBrby5jbGVhbk5vZGUodGhpcy5yZW5kZXJlZEVsZW1lbnQpO1xuICAgIGtvLmFwcGx5QmluZGluZ3MoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5yZW5kZXJlZEVsZW1lbnQsXG4gICAgICAoY29udGV4dDogYW55KSA9PiAoY29udGV4dC4kY3JlYXRvciA9IHRoaXMpXG4gICAgKTtcbiAgICBrby50YXNrcy5ydW5FYXJseSgpO1xuICAgIHZhciBzdXJ2ZXlqcyA9IDxIVE1MRWxlbWVudD4oXG4gICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnN2ZF9zdXJ2ZXlqc19kZXNpZ25lcl9jb250YWluZXJcIilcbiAgICApO1xuICAgIGlmIChzdXJ2ZXlqcykge1xuICAgICAgc3VydmV5anMub25rZXlkb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHNlbGYucmVhZE9ubHkpIHJldHVybjtcbiAgICAgICAgaWYgKCFlKSByZXR1cm47XG4gICAgICAgIC8vIGlmIChlLmtleUNvZGUgPT0gNDYpIHNlbGYuZGVsZXRlUXVlc3Rpb24oKTtcbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAzOCB8fCBlLmtleUNvZGUgPT0gNDApIHtcbiAgICAgICAgICBzZWxmLnNlbGVjdFF1ZXN0aW9uKGUua2V5Q29kZSA9PSAzOCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gc2VsZi5yZW5kZXJlZEVsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zdmRfY29udGFpbmVyXCIpO1xuICAgIGNvbnRhaW5lcltcIm9ua2V5ZG93blwiXSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBzZWxmLm9uS2V5RG93bkhhbmRsZXIoZSwgc2VsZik7XG4gICAgfTtcbiAgICB0aGlzLmluaXRTdXJ2ZXlPblJlbmRlcigpO1xuICAgIHRoaXMuc2V0VW5kb1JlZG9DdXJyZW50U3RhdGUodHJ1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGluaXRTdXJ2ZXlPblJlbmRlcigpIHtcbiAgICB2YXIganNvbiA9IHRoaXMuSlNPTjtcbiAgICBpZiAoIWpzb24gfHwgT2JqZWN0LmtleXMoanNvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBqc29uID0gdGhpcy5nZXREZWZhdWx0U3VydmV5SnNvbigpO1xuICAgIH1cbiAgICB0aGlzLmluaXRTdXJ2ZXkoanNvbik7XG4gIH1cbiAgcHJpdmF0ZSBnZXREZWZhdWx0U3VydmV5SnNvbigpOiBhbnkge1xuICAgIHZhciBqc29uID0gbmV3IFN1cnZleUpTT041KCkucGFyc2UoU3VydmV5Q3JlYXRvci5kZWZhdWx0TmV3U3VydmV5VGV4dCk7XG4gICAgaWYgKFxuICAgICAganNvbltcInBhZ2VzXCJdICYmXG4gICAgICBqc29uW1wicGFnZXNcIl1bXCJsZW5ndGhcIl0gPiAwICYmXG4gICAgICBqc29uW1wicGFnZXNcIl1bMF1bXCJuYW1lXCJdXG4gICAgKSB7XG4gICAgICBqc29uW1wicGFnZXNcIl1bMF1bXCJuYW1lXCJdID1cbiAgICAgICAgZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcImVkLm5ld1BhZ2VOYW1lXCIpICsgXCIxXCI7XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGtleWJvYXJkIHNob3J0Y3V0c1xuICAgKiBAcGFyYW0gZSBrZXlkb3duIGV2ZW50XG4gICAqIEBwYXJhbSBjcmVhdG9yIGNyZWF0b3IgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBvbktleURvd25IYW5kbGVyKGUsIGNyZWF0b3IpIHtcbiAgICBjb25zdCBldnRvYmogPSB3aW5kb3cuZXZlbnQgPyBldmVudCA6IGU7XG4gICAgY29uc3QgY29tbWFuZHMgPSBjcmVhdG9yLmNvbW1hbmRzO1xuICAgIGxldCBjb21tYW5kLCBob3RLZXk7XG4gICAgT2JqZWN0LmtleXMoY3JlYXRvci5jb21tYW5kcyB8fCB7fSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb21tYW5kID0gY29tbWFuZHNba2V5XTtcbiAgICAgIGhvdEtleSA9IGNvbW1hbmQuaG90S2V5O1xuICAgICAgaWYgKCFob3RLZXkpIHJldHVybjtcbiAgICAgIGlmIChob3RLZXkuY3RybEtleSAhPT0gZXZ0b2JqLmN0cmxLZXkpIHJldHVybjtcbiAgICAgIGlmIChob3RLZXkua2V5Q29kZSAhPT0gZXZ0b2JqLmtleUNvZGUpIHJldHVybjtcblxuICAgICAgY3JlYXRvci5leGVjdXRlKGNvbW1hbmQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGUoY29tbWFuZCkge1xuICAgIGNvbnN0IG5hbWUgPSBjb21tYW5kLm5hbWU7XG4gICAgaWYgKCFjb21tYW5kIHx8ICFuYW1lIHx8ICF0aGlzW25hbWVdIHx8IHR5cGVvZiB0aGlzW25hbWVdICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm47XG4gICAgcmV0dXJuIHRoaXNbbmFtZV0uYXBwbHkodGhpcywgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgfVxuICBwcml2YXRlIGFkZGluZ09iamVjdDogU3VydmV5LkJhc2U7XG4gIHByaXZhdGUgb25TdXJ2ZXlQcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgc2VuZGVyOiBTdXJ2ZXkuQmFzZSxcbiAgICBhcnJheUNoYW5nZXM6IFN1cnZleS5BcnJheUNoYW5nZXNcbiAgKSB7XG4gICAgaWYgKHRoaXMuYWRkaW5nT2JqZWN0ID09IHNlbmRlcikgcmV0dXJuO1xuICAgIHRoaXMudW5kb1JlZG9NYW5hZ2VyLnN0YXJ0VHJhbnNhY3Rpb24obmFtZSArIFwiIGNoYW5nZWRcIik7XG4gICAgdGhpcy51bmRvUmVkb01hbmFnZXIub25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIG5hbWUsXG4gICAgICBvbGRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlLFxuICAgICAgc2VuZGVyLFxuICAgICAgYXJyYXlDaGFuZ2VzXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvbnNPblF1ZXN0aW9uTmFtZUNoYW5nZWQoc2VuZGVyLCBuYW1lLCBvbGRWYWx1ZSk7XG4gICAgdGhpcy51bmRvUmVkb01hbmFnZXIuc3RvcFRyYW5zYWN0aW9uKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVDb25kaXRpb25zT25RdWVzdGlvbk5hbWVDaGFuZ2VkKFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgb2xkVmFsdWU6IGFueVxuICApIHtcbiAgICBpZiAoIXRoaXMuaXNPYmpRdWVzdGlvbihvYmopKSByZXR1cm47XG4gICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gXCJuYW1lXCIgJiYgIW9ialtcInZhbHVlTmFtZVwiXSkge1xuICAgICAgdGhpcy51cGRhdGVDb25kaXRpb25zKG9sZFZhbHVlLCBvYmpbXCJuYW1lXCJdKTtcbiAgICB9XG4gICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gXCJ2YWx1ZU5hbWVcIikge1xuICAgICAgdmFyIG9sZE5hbWUgPSAhIW9sZFZhbHVlID8gb2xkVmFsdWUgOiBvYmpbXCJuYW1lXCJdO1xuICAgICAgdmFyIG5ld05hbWUgPSAhIW9ialtcInZhbHVlTmFtZVwiXSA/IG9ialtcInZhbHVlTmFtZVwiXSA6IG9ialtcIm5hbWVcIl07XG4gICAgICB0aGlzLnVwZGF0ZUNvbmRpdGlvbnMob2xkTmFtZSwgbmV3TmFtZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNPYmpRdWVzdGlvbihvYmo6IFN1cnZleS5CYXNlKSB7XG4gICAgdmFyIGNsYXNzSW5mbyA9IFN1cnZleS5TZXJpYWxpemVyLmZpbmRDbGFzcyhvYmouZ2V0VHlwZSgpKTtcblxuICAgIHdoaWxlICghIWNsYXNzSW5mbyAmJiAhIWNsYXNzSW5mby5wYXJlbnROYW1lKSB7XG4gICAgICBpZiAoY2xhc3NJbmZvLm5hbWUgPT09IFwicXVlc3Rpb25cIikgcmV0dXJuIHRydWU7XG4gICAgICBjbGFzc0luZm8gPSBTdXJ2ZXkuU2VyaWFsaXplci5maW5kQ2xhc3MoY2xhc3NJbmZvLnBhcmVudE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gISFjbGFzc0luZm8gJiYgY2xhc3NJbmZvLm5hbWUgPT09IFwicXVlc3Rpb25cIjtcbiAgfVxuICBwcml2YXRlIGRpc2FibGVTdXJ2ZXlTZWxlY3RlZEVsZW1lbnRDaGFuZ2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGluaXRTdXJ2ZXkoanNvbjogYW55KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBuZXdTdXJ2ZXkgPSA8U3VydmV5Rm9yRGVzaWduZXI+KFxuICAgICAgdGhpcy5jcmVhdGVTdXJ2ZXkoe30sIFwiZGVzaWduZXJcIiwgU3VydmV5Rm9yRGVzaWduZXIpXG4gICAgKTtcbiAgICB0aGlzLnVuZG9SZWRvTWFuYWdlciA9IG5ldyBVbmRvUmVkb01hbmFnZXIoKTtcbiAgICBuZXdTdXJ2ZXkuZ2V0RWRpdG9yID0gKCkgPT4gc2VsZjtcbiAgICBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICB2YXIgb3B0aW9uVmFsdWUgPSB0aGlzLnNob3dTdXJ2ZXlUaXRsZTtcbiAgICAgIHZhciBzaG93VmFsdWUgPSBvcHRpb25WYWx1ZSAhPT0gXCJuZXZlclwiO1xuICAgICAgaWYgKHNob3dWYWx1ZSkge1xuICAgICAgICBzaG93VmFsdWUgPVxuICAgICAgICAgIG9wdGlvblZhbHVlID09PSBcImFsd2F5c1wiIHx8XG4gICAgICAgICAgKG9wdGlvblZhbHVlID09PSBcImlmZW50ZXJlZFwiICYmXG4gICAgICAgICAgICBuZXdTdXJ2ZXkubG9jVGl0bGVbXCJrb1JlbmRlcmVkSHRtbFwiXSgpKSB8fFxuICAgICAgICAgIG5ld1N1cnZleS5sb2NMb2dvW1wia29SZW5kZXJlZEh0bWxcIl0oKTtcbiAgICAgIH1cbiAgICAgIG5ld1N1cnZleS5rb1Nob3dIZWFkZXIoc2hvd1ZhbHVlKTtcbiAgICB9KTtcbiAgICBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICBuZXdTdXJ2ZXkuaXNSZWFkT25seSh0aGlzLnJlYWRPbmx5KTtcbiAgICB9KTtcbiAgICBuZXdTdXJ2ZXkuZW1wdHlQYWdlVGVtcGxhdGUgPSBcInNlLWVtcHR5LXBsYWNlaG9sZGVyXCI7XG4gICAgbmV3U3VydmV5LmVtcHR5UGFnZVRlbXBsYXRlRGF0YSA9IHRoaXM7XG4gICAgbmV3U3VydmV5Lm9uUHJvcGVydHlWYWx1ZUNoYW5nZWRDYWxsYmFjayA9IChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIG9sZFZhbHVlOiBhbnksXG4gICAgICBuZXdWYWx1ZTogYW55LFxuICAgICAgc2VuZGVyOiBTdXJ2ZXkuQmFzZSxcbiAgICAgIGFycmF5Q2hhbmdlczogU3VydmV5LkFycmF5Q2hhbmdlc1xuICAgICkgPT4ge1xuICAgICAgdGhpcy5vblN1cnZleVByb3BlcnR5VmFsdWVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG9sZFZhbHVlLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgc2VuZGVyLFxuICAgICAgICBhcnJheUNoYW5nZXNcbiAgICAgICk7XG4gICAgfTtcbiAgICB0aGlzLnVuZG9SZWRvTWFuYWdlci5jYW5VbmRvUmVkb0NhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVLb0NhblVuZG9SZWRvKCk7XG4gICAgfTtcbiAgICB0aGlzLnVuZG9SZWRvTWFuYWdlci5jaGFuZ2VzRmluaXNoZWRDYWxsYmFjayA9IChcbiAgICAgIGNoYW5nZXM6IElVbmRvUmVkb0NoYW5nZVxuICAgICkgPT4ge1xuICAgICAgdGhpcy5zZXRNb2RpZmllZCh7XG4gICAgICAgIHR5cGU6IFwiUFJPUEVSVFlfQ0hBTkdFRFwiLFxuICAgICAgICBuYW1lOiBjaGFuZ2VzLnByb3BlcnR5TmFtZSxcbiAgICAgICAgdGFyZ2V0OiBjaGFuZ2VzLm9iamVjdCxcbiAgICAgICAgb2xkVmFsdWU6IGNoYW5nZXMub2xkVmFsdWUsXG4gICAgICAgIG5ld1ZhbHVlOiBjaGFuZ2VzLm5ld1ZhbHVlLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLnVwZGF0ZUtvQ2FuVW5kb1JlZG8oKTtcbiAgICB0aGlzLmRyYWdEcm9wSGVscGVyID0gbmV3IERyYWdEcm9wSGVscGVyKFxuICAgICAgPFN1cnZleS5JU3VydmV5Pm5ld1N1cnZleSxcbiAgICAgIGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHNlbGYuc2V0TW9kaWZpZWQob3B0aW9ucyk7XG4gICAgICB9LFxuICAgICAgdGhpcy5yZW5kZXJlZEVsZW1lbnQsXG4gICAgICB0aGlzLnVuZG9SZWRvTWFuYWdlclxuICAgICk7XG4gICAgdGhpcy5kcmFnRHJvcEhlbHBlci5yZWFkT25seSA9IHRoaXMucmVhZE9ubHk7XG4gICAgbmV3U3VydmV5LnNldEpzb25PYmplY3QoanNvbik7XG4gICAgaWYgKG5ld1N1cnZleS5pc0VtcHR5KSB7XG4gICAgICBuZXdTdXJ2ZXkuc2V0SnNvbk9iamVjdCh0aGlzLmdldERlZmF1bHRTdXJ2ZXlKc29uKCkpO1xuICAgIH1cbiAgICBTdXJ2ZXkuc3VydmV5TG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUgPSBuZXdTdXJ2ZXlbXCJsb2NhbGVcIl07XG4gICAgbmV3U3VydmV5LmRyYWdEcm9wSGVscGVyID0gdGhpcy5kcmFnRHJvcEhlbHBlcjtcbiAgICBuZXdTdXJ2ZXkub25VcGRhdGVFbGVtZW50QWxsb3dpbmdPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHNlbGYub25FbGVtZW50QWxsb3dPcGVyYXRpb25zLmZpcmUoc2VsZiwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICB2YXIgYWZ0ZXJSZW5kZXJFbGVtZW50SGFuZGxlciA9IGNyZWF0ZUFmdGVyUmVuZGVySGFuZGxlcih0aGlzLCBuZXdTdXJ2ZXkpO1xuICAgIHZhciBhZnRlclJlbmRlckVsZW1lbnRQYWdlSGFuZGxlciA9IGNyZWF0ZUFmdGVyUmVuZGVyUGFnZUhhbmRsZXIoXG4gICAgICB0aGlzLFxuICAgICAgbmV3U3VydmV5XG4gICAgKTtcbiAgICB2YXIgYWZ0ZXJSZW5kZXJIZWFkZXJIYW5kbGVyID0gY3JlYXRlQWZ0ZXJSZW5kZXJIZWFkZXJIYW5kbGVyKFxuICAgICAgdGhpcyxcbiAgICAgIG5ld1N1cnZleVxuICAgICk7XG4gICAgbmV3U3VydmV5Lm9uQWZ0ZXJSZW5kZXJQYWdlLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7XG4gICAgICBhZnRlclJlbmRlckVsZW1lbnRQYWdlSGFuZGxlcihvcHRpb25zLmh0bWxFbGVtZW50LCBvcHRpb25zLnBhZ2UpO1xuICAgIH0pO1xuICAgIG5ld1N1cnZleS5vbkFmdGVyUmVuZGVyUXVlc3Rpb24uYWRkKChzZW5kZXIsIG9wdGlvbnMpID0+IHtcbiAgICAgIGFmdGVyUmVuZGVyRWxlbWVudEhhbmRsZXIoXG4gICAgICAgIG9wdGlvbnMuaHRtbEVsZW1lbnQsXG4gICAgICAgIG9wdGlvbnMucXVlc3Rpb24sXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH0pO1xuICAgIG5ld1N1cnZleS5vbkFmdGVyUmVuZGVyUGFuZWwuYWRkKChzZW5kZXIsIG9wdGlvbnMpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLnBhbmVsLmdldFR5cGUoKSA9PT0gXCJmbG93cGFuZWxcIikge1xuICAgICAgICBhZnRlclJlbmRlckVsZW1lbnRIYW5kbGVyKFxuICAgICAgICAgIG9wdGlvbnMuaHRtbEVsZW1lbnQsXG4gICAgICAgICAgb3B0aW9ucy5wYW5lbCxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIG9wdGlvbnMucGFuZWwua29Jc0RyYWdnaW5nKClcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIHBubEVsID0gb3B0aW9ucy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiZi1wYW5lbFwiKTtcbiAgICAgICAgaWYgKCEhcG5sRWwpIHtcbiAgICAgICAgICBpZiAoISFwbmxFbC5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgIHBubEVsLmNsYXNzTmFtZSArPSBcIiBzdmRfZmxvd3BhbmVsXCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBubEVsLmNsYXNzTmFtZSA9IFwic3ZkX2Zsb3dwYW5lbFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy5wYW5lbC5lbXB0eUVsZW1lbnQgPSBhZGRFbXB0eVBhbmVsRWxlbWVudChcbiAgICAgICAgICBuZXdTdXJ2ZXksXG4gICAgICAgICAgb3B0aW9ucy5odG1sRWxlbWVudCxcbiAgICAgICAgICBvcHRpb25zLnBhbmVsLmRyYWdEcm9wSGVscGVyKCksXG4gICAgICAgICAgb3B0aW9ucy5wYW5lbFxuICAgICAgICApO1xuICAgICAgICBpZiAob3B0aW9ucy5wYW5lbC5lbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgb3B0aW9ucy5wYW5lbC5lbXB0eUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB9XG4gICAgICAgIGFmdGVyUmVuZGVyRWxlbWVudEhhbmRsZXIoXG4gICAgICAgICAgb3B0aW9ucy5odG1sRWxlbWVudCxcbiAgICAgICAgICBvcHRpb25zLnBhbmVsLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgb3B0aW9ucy5wYW5lbC5rb0lzRHJhZ2dpbmcoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5ld1N1cnZleS5vbkFmdGVyUmVuZGVySGVhZGVyLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7XG4gICAgICBhZnRlclJlbmRlckhlYWRlckhhbmRsZXIob3B0aW9ucy5odG1sRWxlbWVudCwgc2VuZGVyKTtcbiAgICB9KTtcbiAgICBuZXdTdXJ2ZXkub25EcmFnRHJvcEFsbG93LmFkZChmdW5jdGlvbiAoc2VuZGVyLCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zLnN1cnZleSA9IHNlbmRlcjtcbiAgICAgIHNlbGYub25EcmFnRHJvcEFsbG93LmZpcmUoc2VsZiwgb3B0aW9ucyk7XG4gICAgfSk7XG4gICAgbmV3U3VydmV5Lm9uR2V0TWVudUl0ZW1zLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7XG4gICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBvcHRzID0gb3B0aW9ucy5vYmouYWxsb3dpbmdPcHRpb25zO1xuICAgICAgaWYgKCFvcHRzKSBvcHRzID0ge307XG5cbiAgICAgIGlmICh0aGlzLnNob3dNb2RhbE9uRWxlbWVudEVkaXRpbmcgJiYgb3B0cy5hbGxvd1Nob3dFZGl0b3IpIHtcbiAgICAgICAgb3B0aW9ucy5pdGVtcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcImVkaXRlbGVtZW50XCIsXG4gICAgICAgICAgdGV4dDogdGhpcy5nZXRMb2NTdHJpbmcoXCJzdXJ2ZXkuZWRpdFwiKSxcbiAgICAgICAgICBoYXNUaXRsZTogdHJ1ZSxcbiAgICAgICAgICBvbkNsaWNrOiAocXVlc3Rpb24pID0+IHRoaXMuc2hvd1F1ZXN0aW9uRWRpdG9yKHF1ZXN0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLmFsbG93RGVsZXRlKSB7XG4gICAgICAgIHZhciBkZWxldGVMb2NhbGVOYW1lID0gb3B0aW9ucy5vYmouaXNQYW5lbFxuICAgICAgICAgID8gXCJzdXJ2ZXkuZGVsZXRlUGFuZWxcIlxuICAgICAgICAgIDogXCJzdXJ2ZXkuZGVsZXRlUXVlc3Rpb25cIjtcbiAgICAgICAgb3B0aW9ucy5pdGVtcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcImRlbGV0ZVwiLFxuICAgICAgICAgIHRleHQ6IHNlbGYuZ2V0TG9jU3RyaW5nKGRlbGV0ZUxvY2FsZU5hbWUpLFxuICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChzZWxPYmopIHtcbiAgICAgICAgICAgIHNlbGYuZGVsZXRlT2JqZWN0KHNlbE9iaik7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgb3B0cy5hbGxvd1Nob3dIaWRlVGl0bGUgJiZcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMub2JqLnRpdGxlTG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgaXNQcm9wZXJ0eVZpc2libGUob3B0aW9ucy5vYmosIFwidGl0bGVcIilcbiAgICAgICkge1xuICAgICAgICB2YXIgaXNTaG93VGl0bGUgPSBrby5vYnNlcnZhYmxlPGJvb2xlYW4+KFxuICAgICAgICAgIG9wdGlvbnMub2JqLnRpdGxlTG9jYXRpb24gIT09IFwiaGlkZGVuXCJcbiAgICAgICAgKTtcbiAgICAgICAgb3B0aW9ucy5pdGVtcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcInNob3d0aXRsZVwiLFxuICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TG9jU3RyaW5nKFwicGUuc2hvd1RpdGxlXCIpLFxuICAgICAgICAgIGljb246IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1Nob3dUaXRsZSgpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBcImljb24tYWN0aW9uc2hvd3RpdGxlXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCJpY29uLWFjdGlvbmhpZGV0aXRsZVwiO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uQ2xpY2s6IChxdWVzdGlvbjogU3VydmV5LlF1ZXN0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAocXVlc3Rpb24udGl0bGVMb2NhdGlvbiAhPT0gXCJoaWRkZW5cIikge1xuICAgICAgICAgICAgICBxdWVzdGlvbi50aXRsZUxvY2F0aW9uID0gXCJoaWRkZW5cIjtcbiAgICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbltcInNob3dUaXRsZVwiXSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBxdWVzdGlvbi50aXRsZUxvY2F0aW9uID0gXCJkZWZhdWx0XCI7XG4gICAgICAgICAgICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgcXVlc3Rpb25bXCJzaG93VGl0bGVcIl0gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc1Nob3dUaXRsZShxdWVzdGlvbi50aXRsZUxvY2F0aW9uICE9PSBcImhpZGRlblwiKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBvcHRzLmFsbG93Q2hhbmdlUmVxdWlyZWQgJiZcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMub2JqLmlzUmVxdWlyZWQgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgaXNQcm9wZXJ0eVZpc2libGUob3B0aW9ucy5vYmosIFwiaXNSZXF1aXJlZFwiKVxuICAgICAgKSB7XG4gICAgICAgIHZhciBpc1JlcXVpcmVkID0ga28uY29tcHV0ZWQoKCkgPT4gb3B0aW9ucy5vYmouaXNSZXF1aXJlZCk7XG4gICAgICAgIG9wdGlvbnMuaXRlbXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogXCJpc3JlcXVpcmVkXCIsXG4gICAgICAgICAgdGV4dDogdGhpcy5nZXRMb2NTdHJpbmcoXCJwZS5pc1JlcXVpcmVkXCIpLFxuICAgICAgICAgIGljb246IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1JlcXVpcmVkKCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwiaWNvbi1hY3Rpb25pc3JlcXVpcmVkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCJpY29uLWFjdGlvbm5vdHJlcXVpcmVkXCI7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgb25DbGljazogKHF1ZXN0aW9uOiBTdXJ2ZXkuUXVlc3Rpb24pID0+IHtcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IFN1cnZleS5TZXJpYWxpemVyLmZpbmRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgcXVlc3Rpb24uZ2V0VHlwZSgpLFxuICAgICAgICAgICAgICBcImlzUmVxdWlyZWRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIXByb3BlcnR5IHx8XG4gICAgICAgICAgICAgICF0aGlzLm9uSXNQcm9wZXJ0eVJlYWRPbmx5Q2FsbGJhY2soXG4gICAgICAgICAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgcHJvcGVydHkucmVhZE9ubHksXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcXVlc3Rpb24uaXNSZXF1aXJlZCA9ICFxdWVzdGlvbi5pc1JlcXVpcmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9wdGlvbnMuaXRlbXMucHVzaCh7IHRlbXBsYXRlOiBcImFjdGlvbi1zZXBhcmF0b3JcIiB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMuYWxsb3dDb3B5KSB7XG4gICAgICAgIG9wdGlvbnMuaXRlbXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogXCJjb3B5XCIsXG4gICAgICAgICAgdGV4dDogc2VsZi5nZXRMb2NTdHJpbmcoXCJzdXJ2ZXkuY29weVwiKSxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoc2VsT2JqKSB7XG4gICAgICAgICAgICBzZWxmLmZhc3RDb3B5UXVlc3Rpb24oc2VsT2JqKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMuYWxsb3dBZGRUb1Rvb2xib3gpIHtcbiAgICAgICAgb3B0aW9ucy5pdGVtcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcImFkZHRvdG9vbGJveFwiLFxuICAgICAgICAgIHRleHQ6IHNlbGYuZ2V0TG9jU3RyaW5nKFwic3VydmV5LmFkZFRvVG9vbGJveFwiKSxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoc2VsT2JqKSB7XG4gICAgICAgICAgICBzZWxmLmFkZEN1c3RvbVRvb2xib3hRdWVzdGlvbihzZWxPYmopO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5hbGxvd0NoYW5nZVR5cGUpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG9wdGlvbnMuaXRlbXMucHVzaCh7IHRlbXBsYXRlOiBcImFjdGlvbi1zZXBhcmF0b3JcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3VycmVudFR5cGUgPSBvcHRpb25zLm9iai5nZXRUeXBlKCk7XG4gICAgICAgIHZhciBjb252ZXJ0Q2xhc3NlcyA9IFF1ZXN0aW9uQ29udmVydGVyLmdldENvbnZlcnRUb0NsYXNzZXMoXG4gICAgICAgICAgY3VycmVudFR5cGUsXG4gICAgICAgICAgdGhpcy50b29sYm94Lml0ZW1OYW1lc1xuICAgICAgICApO1xuICAgICAgICB2YXIgYWxsb3dDaGFuZ2VUeXBlID0gY29udmVydENsYXNzZXMubGVuZ3RoID4gMDtcbiAgICAgICAgdmFyIGNyZWF0ZVR5cGVCeUNsYXNzID0gKGNsYXNzTmFtZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLmdldExvY1N0cmluZyhcInF0LlwiICsgY2xhc3NOYW1lKSxcbiAgICAgICAgICAgIHZhbHVlOiBjbGFzc05hbWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGF2YWlsYWJsZVR5cGVzID0gW2NyZWF0ZVR5cGVCeUNsYXNzKGN1cnJlbnRUeXBlKV07XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udmVydENsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gY29udmVydENsYXNzZXNbaV07XG4gICAgICAgICAgYXZhaWxhYmxlVHlwZXMucHVzaChjcmVhdGVUeXBlQnlDbGFzcyhjbGFzc05hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLml0ZW1zLnB1c2goe1xuICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TG9jU3RyaW5nKFwicXQuXCIgKyBjdXJyZW50VHlwZSksXG4gICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0TG9jU3RyaW5nKFwic3VydmV5LmNvbnZlcnRUb1wiKSxcbiAgICAgICAgICB0eXBlOiBjdXJyZW50VHlwZSxcbiAgICAgICAgICBhbGxvd0NoYW5nZVR5cGU6IGFsbG93Q2hhbmdlVHlwZSxcbiAgICAgICAgICB0ZW1wbGF0ZTogXCJjb252ZXJ0LWFjdGlvblwiLFxuICAgICAgICAgIGF2YWlsYWJsZVR5cGVzOiBhdmFpbGFibGVUeXBlcyxcbiAgICAgICAgICBvbkNvbnZlcnRUeXBlOiAoZGF0YSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHZhciBuZXdUeXBlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jb252ZXJ0Q3VycmVudE9iamVjdChvcHRpb25zLm9iaiwgbmV3VHlwZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zaG93TW9kYWxPbkVsZW1lbnRFZGl0aW5nICYmIG9wdHMuYWxsb3dTaG93RWRpdG9yKSB7XG4gICAgICAgIG9wdGlvbnMuaXRlbXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogXCJlZGl0ZWxlbWVudFwiLFxuICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0TG9jU3RyaW5nKFwiZWQucHJvcGVydHktZ3JpZFwiKSxcbiAgICAgICAgICB0ZW1wbGF0ZTogXCJzY2Etc2hvdy1wcm9wZXJ0eS1ncmlkXCIsXG4gICAgICAgICAgaGFzVGl0bGU6IHRydWUsXG4gICAgICAgICAgb25DbGljazogKHF1ZXN0aW9uKSA9PiB0aGlzLnNob3dRdWVzdGlvbkVkaXRvcihxdWVzdGlvbiksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5hbGxvd0RyYWdnaW5nKSB7XG4gICAgICAgIG9wdGlvbnMuaXRlbXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogXCJkcmFnZWxlbWVudFwiLFxuICAgICAgICAgIG5lZWRGb2N1czogZmFsc2UsXG4gICAgICAgICAgdGV4dDogc2VsZi5nZXRMb2NTdHJpbmcoXCJzdXJ2ZXkuZHJhZ1wiKSxcbiAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoc2VsT2JqKSB7fSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHNlbGYub25EZWZpbmVFbGVtZW50TWVudUl0ZW1zLmZpcmUoc2VsZiwgb3B0aW9ucyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uRGVzaWduZXJTdXJ2ZXlDcmVhdGVkLmZpcmUodGhpcywgeyBzdXJ2ZXk6IG5ld1N1cnZleSB9KTtcbiAgICAvLyB0aGlzLnN1cnZleS5yZW5kZXIodGhpcy5zdXJ2ZXlqcyk7XG4gICAgbmV3U3VydmV5Lm9uU2VsZWN0ZWRFbGVtZW50Q2hhbmdlZC5hZGQoKHNlbmRlcjogU3VydmV5LlN1cnZleSwgb3B0aW9ucykgPT4ge1xuICAgICAgaWYgKHNlbGYuZGlzYWJsZVN1cnZleVNlbGVjdGVkRWxlbWVudENoYW5naW5nKSByZXR1cm47XG4gICAgICBzZWxmLnNlbGVjdGVkRWxlbWVudCA9IHNlbmRlcltcInNlbGVjdGVkRWxlbWVudFwiXTtcbiAgICB9KTtcbiAgICBuZXdTdXJ2ZXkub25FZGl0QnV0dG9uQ2xpY2suYWRkKChzZW5kZXI6IFN1cnZleS5TdXJ2ZXkpID0+IHtcbiAgICAgIHNlbGYuc2hvd1F1ZXN0aW9uRWRpdG9yKHNlbGYuc2VsZWN0ZWRFbGVtZW50KTtcbiAgICB9KTtcbiAgICBuZXdTdXJ2ZXkub25FbGVtZW50RG91YmxlQ2xpY2suYWRkKChzZW5kZXI6IFN1cnZleS5TdXJ2ZXksIG9wdGlvbnMpID0+IHtcbiAgICAgIHNlbGYub25FbGVtZW50RG91YmxlQ2xpY2suZmlyZShzZWxmLCBvcHRpb25zKTtcbiAgICB9KTtcbiAgICBuZXdTdXJ2ZXkub25Qcm9jZXNzSHRtbC5hZGQoKHNlbmRlcjogU3VydmV5LlN1cnZleSwgb3B0aW9ucykgPT4ge1xuICAgICAgb3B0aW9ucy5odG1sID0gc2VsZi5wcm9jZXNzSHRtbChvcHRpb25zLmh0bWwpO1xuICAgIH0pO1xuICAgIG5ld1N1cnZleS5vblF1ZXN0aW9uQWRkZWQuYWRkKChzZW5kZXI6IFN1cnZleS5TdXJ2ZXksIG9wdGlvbnMpID0+IHtcbiAgICAgIHNlbGYuZG9PblF1ZXN0aW9uQWRkZWQob3B0aW9ucy5xdWVzdGlvbiwgb3B0aW9ucy5wYXJlbnRQYW5lbCk7XG4gICAgfSk7XG4gICAgbmV3U3VydmV5Lm9uUXVlc3Rpb25SZW1vdmVkLmFkZCgoc2VuZGVyOiBTdXJ2ZXkuU3VydmV5LCBvcHRpb25zKSA9PiB7XG4gICAgICBzZWxmLmRvT25FbGVtZW50UmVtb3ZlZChvcHRpb25zLnF1ZXN0aW9uKTtcbiAgICB9KTtcbiAgICBuZXdTdXJ2ZXkub25QYW5lbEFkZGVkLmFkZCgoc2VuZGVyOiBTdXJ2ZXkuU3VydmV5LCBvcHRpb25zKSA9PiB7XG4gICAgICBzZWxmLmRvT25QYW5lbEFkZGVkKG9wdGlvbnMucGFuZWwsIG9wdGlvbnMucGFyZW50UGFuZWwpO1xuICAgIH0pO1xuICAgIG5ld1N1cnZleS5vblBhbmVsUmVtb3ZlZC5hZGQoKHNlbmRlcjogU3VydmV5LlN1cnZleSwgb3B0aW9ucykgPT4ge1xuICAgICAgc2VsZi5kb09uRWxlbWVudFJlbW92ZWQob3B0aW9ucy5wYW5lbCk7XG4gICAgfSk7XG4gICAgbmV3U3VydmV5Lm9uUGFnZUFkZGVkLmFkZCgoc2VuZGVyOiBTdXJ2ZXkuU3VydmV5LCBvcHRpb25zKSA9PiB7XG4gICAgICBpZiAoc2VsZi5zdXJ2ZXlPYmplY3RzLmhhc09iamVjdChvcHRpb25zLnBhZ2UpKSByZXR1cm47XG4gICAgICBzZWxmLmRvT25QYWdlQWRkZWQob3B0aW9ucy5wYWdlKTtcbiAgICAgIHNlbGYuYWRkUGFnZVRvVUkob3B0aW9ucy5wYWdlKTtcbiAgICAgIHNlbGYuc2V0TW9kaWZpZWQoeyB0eXBlOiBcIlBBR0VfQURERURcIiwgbmV3VmFsdWU6IG9wdGlvbnMucGFnZSB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuc3VydmV5VmFsdWUobmV3U3VydmV5KTtcbiAgICB0aGlzLnN1cnZleU9iamVjdHMuc3VydmV5ID0gbmV3U3VydmV5O1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gbmV3U3VydmV5O1xuICB9XG4gIHByaXZhdGUgcHJvY2Vzc0h0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWh0bWwpIHJldHVybiBodG1sO1xuICAgIHZhciBzY3JpcHRSZWdFeCA9IC88c2NyaXB0XFxiW148XSooPzooPyE8XFwvc2NyaXB0Pik8W148XSopKjxcXC9zY3JpcHQ+L2dpO1xuICAgIHdoaWxlIChzY3JpcHRSZWdFeC50ZXN0KGh0bWwpKSB7XG4gICAgICBodG1sID0gaHRtbC5yZXBsYWNlKHNjcmlwdFJlZ0V4LCBcIlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cbiAgcHJpdmF0ZSBkb0RyYWdnaW5nVG9vbGJveEl0ZW0oanNvbjogYW55LCBlKSB7XG4gICAgdmFyIG5ld0VsZW1lbnQgPSB0aGlzLmNyZWF0ZU5ld0VsZW1lbnQoanNvbik7XG4gICAganNvbiA9ICg8U3VydmV5LkJhc2U+KDxhbnk+bmV3RWxlbWVudCkpLnRvSlNPTigpO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gbmV3RWxlbWVudC5nZXRUeXBlKCk7XG4gICAgdGhpcy5kcmFnRHJvcEhlbHBlci5zdGFydERyYWdUb29sYm94SXRlbShlLCBuZXdFbGVtZW50Lm5hbWUsIGpzb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBkb0NsaWNrVG9vbGJveEl0ZW0oanNvbjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnJlYWRPbmx5KSB7XG4gICAgICB2YXIgbmV3RWxlbWVudCA9IHRoaXMuY3JlYXRlTmV3RWxlbWVudChqc29uKTtcbiAgICAgIHRoaXMuZG9DbGlja1F1ZXN0aW9uQ29yZShuZXdFbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGRyYWdPdmVyUXVlc3Rpb25zRWRpdG9yKGRhdGEsIGUpIHtcbiAgICBkYXRhLnN1cnZleS5kcmFnRHJvcEhlbHBlci5kb0RyYWdEcm9wT3ZlcihlLCBkYXRhLnN1cnZleS5jdXJyZW50UGFnZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBkcm9wT25RdWVzdGlvbnNFZGl0b3IoZGF0YSwgZSkge1xuICAgIGRhdGEuc3VydmV5LmRyYWdEcm9wSGVscGVyLmRvRHJvcChlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9DbGlja1F1ZXN0aW9uQ29yZShcbiAgICBlbGVtZW50OiBTdXJ2ZXkuSUVsZW1lbnQsXG4gICAgbW9kaWZpZWRUeXBlOiBzdHJpbmcgPSBcIkFEREVEX0ZST01fVE9PTEJPWFwiXG4gICkge1xuICAgIHN1cGVyLmRvQ2xpY2tRdWVzdGlvbkNvcmUoZWxlbWVudCwgbW9kaWZpZWRUeXBlKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlZEVsZW1lbnQgJiYgdGhpcy5zY3JvbGxUb05ld0VsZW1lbnQpIHtcbiAgICAgIFN1cnZleUhlbHBlci5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKFxuICAgICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgZWxlbWVudFtcImlkXCJdKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZVF1ZXN0aW9uKCkge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0U2VsZWN0ZWRPYmpBc1F1ZXN0aW9uKCk7XG4gICAgaWYgKHF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmRlbGV0ZUN1cnJlbnRPYmplY3QoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZWxlY3RRdWVzdGlvbihpc1VwOiBib29sZWFuKSB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRTZWxlY3RlZE9iakFzUXVlc3Rpb24oKTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuc3VydmV5T2JqZWN0cy5zZWxlY3ROZXh0UXVlc3Rpb24oaXNVcCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRPYmpBc1F1ZXN0aW9uKCk6IFN1cnZleS5RdWVzdGlvbiB7XG4gICAgdmFyIG9iaiA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50O1xuICAgIGlmICghb2JqKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gU3VydmV5SGVscGVyLmdldE9iamVjdFR5cGUob2JqKSA9PSBPYmpUeXBlLlF1ZXN0aW9uXG4gICAgICA/IDxTdXJ2ZXkuUXVlc3Rpb24+b2JqXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHVibGljIGRlbGV0ZUN1cnJlbnRPYmplY3QoKSB7XG4gICAgdGhpcy5kZWxldGVPYmplY3QodGhpcy5zZWxlY3RlZEVsZW1lbnQpO1xuICB9XG4gIC8qKlxuICAgKiBTaG93IHRoZSBjcmVhdG9yIGRpYWxvZy4gVGhlIGVsZW1lbnQgY2FuIGJlIGEgcXVlc3Rpb24sIHBhbmVsLCBwYWdlIG9yIHN1cnZleS4gSWYgcHJvcGVydHkgZ3JpZCBpcyB1c2VkIGluc3RlYWQgb2YgZGlhbG9nIHdpbmRvdyAoZGVmYXVsdCBiZWhhdmlvciksIHRoZW4gZm9jdXMgZ29lcyBpbnRvIHRoZSBwcm9wZXJ0eSBncmlkLlxuICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgc3VydmV5IGVsZW1lbnRcbiAgICogQHNlZSBzaG93TW9kYWxFbGVtZW50RWRpdG9yXG4gICAqL1xuICBwdWJsaWMgc2hvd0VsZW1lbnRFZGl0b3IoXG4gICAgZWxlbWVudDogU3VydmV5LkJhc2UsXG4gICAgb25DbG9zZTogKGlzQ2FuY2VsZWQ6IGJvb2xlYW4pID0+IGFueVxuICApIHtcbiAgICB0aGlzLnNob3dRdWVzdGlvbkVkaXRvcihlbGVtZW50LCBvbkNsb3NlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUNvbmRpdGlvbnMob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAob2xkTmFtZSA9PT0gbmV3TmFtZSkgcmV0dXJuO1xuICAgIG5ldyBTdXJ2ZXlMb2dpYyh0aGlzLnN1cnZleSwgdGhpcykucmVuYW1lUXVlc3Rpb24ob2xkTmFtZSwgbmV3TmFtZSk7XG4gIH1cbiAgcHVibGljIGdldCBzaG93TW9kYWxPbkVsZW1lbnRFZGl0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5zaG93RWxlbWVudEVkaXRvckFzUHJvcGVydHlHcmlkIHx8ICF0aGlzLnNob3dQcm9wZXJ0eUdyaWQ7XG4gIH1cbiAgcHVibGljIHNob3dRdWVzdGlvbkVkaXRvciA9IChcbiAgICBlbGVtZW50OiBTdXJ2ZXkuQmFzZSxcbiAgICBvbkNsb3NlOiAoaXNDYW5jZWxlZDogYm9vbGVhbikgPT4gYW55ID0gbnVsbFxuICApID0+IHtcbiAgICBpZiAoIXRoaXMuc2hvd01vZGFsT25FbGVtZW50RWRpdGluZykge1xuICAgICAgdGhpcy5oaWRlQWR2YW5jZWRTZXR0aW5ncyA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXROZXdPYmpUb1Byb3BlcnR5R3JpZChlbGVtZW50KTtcbiAgICAgIHRoaXMubGVmdENvbnRhaW5lckFjdGl2ZUl0ZW0oXCJwcm9wZXJ0eS1ncmlkXCIpO1xuICAgICAgdGhpcy5yaWdodENvbnRhaW5lckFjdGl2ZUl0ZW0oXCJwcm9wZXJ0eS1ncmlkXCIpO1xuICAgICAgdGhpcy5wcm9wZXJ0eUdyaWRPYmplY3RFZGl0b3JNb2RlbC5mb2N1c0VkaXRvcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNob3dNb2RhbEVsZW1lbnRFZGl0b3IoZWxlbWVudCwgb25DbG9zZSk7XG4gIH07XG4gIC8qKlxuICAgKiBTaG93IHRoZSBjcmVhdG9yIGRpYWxvZy4gVGhlIGVsZW1lbnQgY2FuIGJlIGEgcXVlc3Rpb24sIHBhbmVsLCBwYWdlIG9yIHN1cnZleS5cbiAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHN1cnZleSBlbGVtZW50XG4gICAqIEBwYXJhbSBvbkNsb3NlIENhbGxiYWNrIGZ1bmN0aW9uIG9uIGNsb3NpbmcgZGlhbG9nIHdpbmRvdy4gSXQgaGFzIGlzQ2FuY2VsZWQgYm9vbGVhbiBwYXJhdGVtZXIuIEl0IGlzIHRydWUgaWYgYSB1c2VyIGNhbmNlbCBjaGFuZ2VzLlxuICAgKiBAc2VlIG9uRWxlbWVudEVkaXRvckNsb3NlZFxuICAgKi9cbiAgcHVibGljIHNob3dNb2RhbEVsZW1lbnRFZGl0b3IoXG4gICAgZWxlbWVudDogU3VydmV5LkJhc2UsXG4gICAgb25DbG9zZTogKGlzQ2FuY2VsZWQ6IGJvb2xlYW4pID0+IGFueSA9IG51bGxcbiAgKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBlbFdpbmRvdyA9IHRoaXMucmVuZGVyZWRFbGVtZW50XG4gICAgICA/IDxIVE1MRWxlbWVudD4oXG4gICAgICAgICAgdGhpcy5yZW5kZXJlZEVsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNzdXJ2ZXlxdWVzdGlvbmVkaXRvcndpbmRvd1wiKVxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgdmFyIGlzQ2FuY2VsZWQgPSB0cnVlO1xuICAgIHZhciBvbGROYW1lID0gZWxlbWVudFtcIm5hbWVcIl07XG4gICAgdmFyIG9sZFZhbHVlTmFtZSA9IGVsZW1lbnRbXCJ2YWx1ZU5hbWVcIl07XG4gICAgdGhpcy5xdWVzdGlvbkVkaXRvcldpbmRvdy5zaG93KFxuICAgICAgZWxlbWVudCxcbiAgICAgIGVsV2luZG93LFxuICAgICAgZnVuY3Rpb24gKHF1ZXN0aW9uKSB7XG4gICAgICAgIHNlbGYub25RdWVzdGlvbkVkaXRvckNoYW5nZWQocXVlc3Rpb24pO1xuICAgICAgICBpc0NhbmNlbGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChvbGROYW1lICE9PSBxdWVzdGlvbltcIm5hbWVcIl0pIHtcbiAgICAgICAgICBzZWxmLnVwZGF0ZUNvbmRpdGlvbnNPblF1ZXN0aW9uTmFtZUNoYW5nZWQocXVlc3Rpb24sIFwibmFtZVwiLCBvbGROYW1lKTtcbiAgICAgICAgICBzZWxmLm9uRWxlbWVudE5hbWVDaGFuZ2VkLmZpcmUoc2VsZiwge1xuICAgICAgICAgICAgb2JqOiBxdWVzdGlvbixcbiAgICAgICAgICAgIG9sZE5hbWU6IG9sZE5hbWUsXG4gICAgICAgICAgICBuZXdOYW1lOiBxdWVzdGlvbltcIm5hbWVcIl0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9sZFZhbHVlTmFtZSAhPT0gcXVlc3Rpb25bXCJ2YWx1ZU5hbWVcIl0pIHtcbiAgICAgICAgICBzZWxmLnVwZGF0ZUNvbmRpdGlvbnNPblF1ZXN0aW9uTmFtZUNoYW5nZWQoXG4gICAgICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgICAgIFwidmFsdWVOYW1lXCIsXG4gICAgICAgICAgICBvbGRWYWx1ZU5hbWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGhpcyxcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG9uQ2xvc2UpIG9uQ2xvc2UoaXNDYW5jZWxlZCk7XG4gICAgICAgIHNlbGYub25FbGVtZW50RWRpdG9yQ2xvc2VkLmZpcmUoc2VsZiwge1xuICAgICAgICAgIGlzQ2FuY2VsZWQ6IGlzQ2FuY2VsZWQsXG4gICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgdGhpcy5vbkVkaXRvckFmdGVyUmVuZGVyQ2FsbGJhY2tcbiAgICApO1xuICB9XG4gIHB1YmxpYyBvblF1ZXN0aW9uRWRpdG9yQ2hhbmdlZChxdWVzdGlvbjogU3VydmV5LlF1ZXN0aW9uKSB7XG4gICAgaWYgKCEhcXVlc3Rpb24ubmFtZSAmJiAhdGhpcy5pc05hbWVVbmlxdWUocXVlc3Rpb24sIHF1ZXN0aW9uLm5hbWUpKSB7XG4gICAgICBxdWVzdGlvbi5uYW1lID0gdGhpcy5nZW5lcmF0ZVVuaXF1ZU5hbWUocXVlc3Rpb24sIHF1ZXN0aW9uLm5hbWUpO1xuICAgIH1cbiAgICB0aGlzLnN1cnZleU9iamVjdHMubmFtZUNoYW5nZWQocXVlc3Rpb24pO1xuICAgIHRoaXMuZG9Qcm9wZXJ0eUdyaWRDaGFuZ2VkKCk7XG4gICAgdGhpcy5kaXJ0eVBhZ2VVcGRhdGUoKTsgLy9UT0RPIHdoeSB0aGlzIGlzIG5lZWQgPyAoa28gcHJvYmxlbSlcbiAgICB0aGlzLnNldE1vZGlmaWVkKHtcbiAgICAgIHR5cGU6IFwiUVVFU1RJT05fQ0hBTkdFRF9CWV9FRElUT1JcIixcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8vVE9ETyB3aHkgdGhpcyBpcyBuZWVkID8gKGtvIHByb2JsZW0pXG4gIHByaXZhdGUgZGlydHlQYWdlVXBkYXRlID0gKCkgPT4ge1xuICAgIHZhciBzZWxlY3RlZE9iamVjdCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50O1xuICAgIGlmICghc2VsZWN0ZWRPYmplY3QpIHJldHVybjtcbiAgICBpZiAoU3VydmV5SGVscGVyLmdldE9iamVjdFR5cGUoc2VsZWN0ZWRPYmplY3QpICE9PSBPYmpUeXBlLlBhZ2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgU3VydmV5SGVscGVyLmdldE9iamVjdFR5cGUoc2VsZWN0ZWRPYmplY3QpID09PSBPYmpUeXBlLlF1ZXN0aW9uICYmXG4gICAgICAgICEhc2VsZWN0ZWRPYmplY3RbXCJrb0VsZW1lbnRUeXBlXCJdXG4gICAgICApIHtcbiAgICAgICAgc2VsZWN0ZWRPYmplY3RbXCJrb0VsZW1lbnRUeXBlXCJdLm5vdGlmeVN1YnNjcmliZXJzKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRPYmplY3Q7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBhIHF1ZXN0aW9uIGludG8gVG9vbGJveCBvYmplY3RcbiAgICogQHBhcmFtIHF1ZXN0aW9uIGFuIGFkZGVkIFN1cnZleS5RdWVzdGlvblxuICAgKiBAc2VlIHRvb2xib3hcbiAgICovXG4gIHB1YmxpYyBhZGRDdXN0b21Ub29sYm94UXVlc3Rpb24ocXVlc3Rpb246IFN1cnZleS5RdWVzdGlvbikge1xuICAgIHZhciBvcHRpb25zID0ge307XG4gICAgdGhpcy5vbkN1c3RvbUVsZW1lbnRBZGRpbmdJbnRvVG9vbGJveC5maXJlKHRoaXMsIHtcbiAgICAgIGVsZW1lbnQ6IHF1ZXN0aW9uLFxuICAgICAgaXRlbU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy50b29sYm94LmFkZENvcGllZEl0ZW0ocXVlc3Rpb24sIG9wdGlvbnMpO1xuICAgIHRoaXMub25DdXN0b21FbGVtZW50QWRkZWRJbnRvVG9vbGJveC5maXJlKHRoaXMsIHsgZWxlbWVudDogcXVlc3Rpb24gfSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwYWdlIHdpdGggdGhlIHNhbWUgZWxlbWVudHMgYW5kIHBsYWNlIGl0IG5leHQgdG8gdGhlIGN1cnJlbnQgb25lLiBJdCByZXR1cm5zIHRoZSBuZXcgY3JlYXRlZCBTdXJ2ZXkuUGFnZVxuICAgKiBAcGFyYW0gcGFnZSBBIGNvcGllZCBTdXJ2ZXkuUGFnZVxuICAgKi9cbiAgcHVibGljIGNvcHlQYWdlID0gKHBhZ2U6IFN1cnZleS5QYWdlTW9kZWwpOiBTdXJ2ZXkuUGFnZU1vZGVsID0+IHtcbiAgICB2YXIgbmV3UGFnZSA9IDxTdXJ2ZXkuUGFnZT4oPGFueT50aGlzLmNvcHlFbGVtZW50KHBhZ2UpKTtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnN1cnZleS5wYWdlcy5pbmRleE9mKHBhZ2UpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLnN1cnZleS5wYWdlcy5zcGxpY2UoaW5kZXggKyAxLCAwLCBuZXdQYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdXJ2ZXkucGFnZXMucHVzaChuZXdQYWdlKTtcbiAgICB9XG4gICAgdGhpcy5hZGRQYWdlVG9VSShuZXdQYWdlKTtcbiAgICByZXR1cm4gbmV3UGFnZTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgZGVsZXRlT2JqZWN0Q29yZShvYmo6IGFueSkge1xuICAgIHRoaXMuc3VydmV5T2JqZWN0cy5yZW1vdmVPYmplY3Qob2JqKTtcbiAgICBzdXBlci5kZWxldGVPYmplY3RDb3JlKG9iaik7XG4gIH1cblxuICAvL2ltcGxlbWVudHMgSVN1cnZleU9iamVjdEVkaXRvck9wdGlvbnNcbiAgZ2V0IHNob3dBcHBseUJ1dHRvbkluRWRpdG9ycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93QXBwbHlCdXR0b25WYWx1ZTtcbiAgfVxuICBzZXQgc2hvd0FwcGx5QnV0dG9uSW5FZGl0b3JzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG93QXBwbHlCdXR0b25WYWx1ZSA9IHZhbHVlO1xuICB9XG4gIG9uRWRpdG9yVGFiUmVuZGVyZWRDYWxsYmFjayA9IChcbiAgICB0YWJOYW1lOiBzdHJpbmcsXG4gICAgZWxlbWVudHM6IEhUTUxEaXZFbGVtZW50W10sXG4gICAgbW9kZWw6IGFueSxcbiAgICB0YWJEYXRhOiBhbnlcbiAgKSA9PiB7XG4gICAgdGhpcy5vbkVkaXRvclRhYlJlbmRlcmVkLmZpcmUodGhpcywge1xuICAgICAgdGFiTmFtZSxcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgbW9kZWwsXG4gICAgICB0YWJEYXRhLFxuICAgIH0pO1xuICB9O1xuICBvbklzRWRpdG9yUmVhZE9ubHlDYWxsYmFjayhcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIGVkaXRvcjogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlLFxuICAgIHJlYWRPbmx5OiBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9uSXNQcm9wZXJ0eVJlYWRPbmx5Q2FsbGJhY2soXG4gICAgICBvYmosXG4gICAgICBlZGl0b3IucHJvcGVydHksXG4gICAgICByZWFkT25seSxcbiAgICAgIGVkaXRvci5wYXJlbnRPYmosXG4gICAgICBlZGl0b3IucGFyZW50UHJvcGVydHlcbiAgICApO1xuICB9XG4gIG9uVGl0bGVJbnBsYWNlRWRpdG9yU3RhcnRFZGl0KGlucHV0RWxlbTogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge31cbiAgb25Qcm9wZXJ0eUVkaXRvcktleURvd25DYWxsYmFjayhcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIGVkaXRvcjogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlLFxuICAgIGV2ZW50OiBLZXlib2FyZEV2ZW50XG4gICkge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICBvYmo6IG9iaixcbiAgICAgIGVkaXRvcjogZWRpdG9yLFxuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgIH07XG4gICAgdGhpcy5vblByb3BlcnR5RWRpdG9yS2V5RG93bi5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG9uUHJvcGVydHlFZGl0b3JPYmplY3RTZXRDYWxsYmFjayhcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIGVkaXRvcjogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlXG4gICkge1xuICAgIHZhciBvcHRpb25zID0geyBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSwgb2JqOiBvYmosIGVkaXRvcjogZWRpdG9yIH07XG4gICAgdGhpcy5vblByb3BlcnR5RWRpdG9yT2JqZWN0QXNzaWduLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgb25Qcm9wZXJ0eUVkaXRvck1vZGFsU2hvd0Rlc2NyaXB0aW9uQ2FsbGJhY2soXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgb2JqOiBTdXJ2ZXkuQmFzZVxuICApOiBhbnkge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgb2JqOiBvYmosXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIGh0bWxUb3A6IFwiXCIsXG4gICAgICBodG1sQm90dG9tOiBcIlwiLFxuICAgIH07XG4gICAgdGhpcy5vblNob3dQcm9wZXJ0eU1vZGFsRWRpdG9yRGVzY3JpcHRpb24uZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICB2YXIgcmVzID0geyB0b3A6IG9wdGlvbnMuaHRtbFRvcCwgYm90dG9tOiBvcHRpb25zLmh0bWxCb3R0b20gfTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIG9uQ29uZGl0aW9uVmFsdWVTdXJ2ZXlDcmVhdGVkQ2FsbEJhY2soXG4gICAgdmFsdWVRdWVzdGlvbk5hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIGVkaXRvcjogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlLFxuICAgIHN1cnZleTogU3VydmV5LlN1cnZleVxuICApIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHZhbHVlUXVlc3Rpb25OYW1lOiB2YWx1ZVF1ZXN0aW9uTmFtZSxcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgb2JqOiBvYmosXG4gICAgICBlZGl0b3I6IGVkaXRvcixcbiAgICAgIHN1cnZleTogc3VydmV5LFxuICAgIH07XG4gICAgdGhpcy5vbkNvbmRpdGlvblZhbHVlU3VydmV5Q3JlYXRlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIHN0YXJ0VW5kb1JlZG9UcmFuc2FjdGlvbigpIHtcbiAgICB0aGlzLnVuZG9SZWRvTWFuYWdlci5zdGFydFRyYW5zYWN0aW9uKFwiRWRpdCBFbGVtZW50IGluIE1vZGFsIFdpbmRvd1wiKTtcbiAgfVxuICBzdG9wVW5kb1JlZG9UcmFuc2FjdGlvbigpIHtcbiAgICB0aGlzLnVuZG9SZWRvTWFuYWdlci5zdG9wVHJhbnNhY3Rpb24oKTtcbiAgfVxuICBvbkFkb3JuZXJSZW5kZXJlZENhbGxiYWNrKFxuICAgIHF1ZXN0aW9uOiBTdXJ2ZXkuUXVlc3Rpb24sXG4gICAgYWRvcm5lcjogc3RyaW5nLFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIGNvbnRleHQ/OiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLm9uQWRvcm5lclJlbmRlcmVkLmlzRW1wdHkpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBrby50YXNrcy5ydW5FYXJseSgpO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICBzdXJ2ZXk6IHRoaXMuc3VydmV5LFxuICAgICAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgICAgICBhZG9ybmVyOiBhZG9ybmVyLFxuICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbkFkb3JuZXJSZW5kZXJlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgfSwgMSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbGVhciB0aGUgZmlsZXMgb24gYSBzZXJ2ZXJcbiAgICogQHBhcmFtIGZpbGVzIGZpbGVzIGRhdGEgKGJ5dGUgYXJyYXkgb3IgVVJJKSB0byBjbGVhclxuICAgKiBAcGFyYW0gY2xlYXJDYWxsYmFjayBhIGNhbGwgYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIHN0YXR1cyBvbiByZW1vdmVkIHRoZSBmaWxlc1xuICAgKi9cbiAgcHVibGljIGNsZWFyRmlsZXMoXG4gICAgZmlsZXM6IGFueVtdLFxuICAgIGNsZWFyQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKSB7XG4gICAgaWYgKHRoaXMub25DbGVhckZpbGUuaXNFbXB0eSkge1xuICAgICAgY2xlYXJDYWxsYmFjayhcInN1Y2Nlc3NcIiwgbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25DbGVhckZpbGUuZmlyZSh0aGlzLCB7XG4gICAgICAgIGZpbGVzOiBmaWxlcyB8fCBbXSxcbiAgICAgICAgY2FsbGJhY2s6IGNsZWFyQ2FsbGJhY2ssXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVwbG9hZCB0aGUgZmlsZXMgb24gYSBzZXJ2ZXJcbiAgICogQHBhcmFtIGZpbGVzIGZpbGVzIHRvIHVwbG9hZFxuICAgKiBAcGFyYW0gdXBsb2FkaW5nQ2FsbGJhY2sgYSBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdGF0dXMgb24gdXBsb2FkaW5nIHRoZSBmaWxlIGFuZCBvcGVyYXRpb24gcmVzdWx0IC0gVVJJIG9mIHRoZSB1cGxvYWRlZCBmaWxlXG4gICAqL1xuICBwdWJsaWMgdXBsb2FkRmlsZXMoXG4gICAgZmlsZXM6IEZpbGVbXSxcbiAgICB1cGxvYWRpbmdDYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApIHtcbiAgICBpZiAodGhpcy5vblVwbG9hZEZpbGUuaXNFbXB0eSkge1xuICAgICAgbGV0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICB1cGxvYWRpbmdDYWxsYmFjayhcInN1Y2Nlc3NcIiwgZmlsZVJlYWRlci5yZXN1bHQpO1xuICAgICAgfTtcbiAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlc1swXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25VcGxvYWRGaWxlLmZpcmUodGhpcywge1xuICAgICAgICBmaWxlczogZmlsZXMgfHwgW10sXG4gICAgICAgIGNhbGxiYWNrOiB1cGxvYWRpbmdDYWxsYmFjayxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogT3BlbiBmaWxlIGNob29zZXIgZGlhbG9nXG4gICAqIEBwYXJhbSBpbnB1dCBmaWxlIGlucHV0IGVsZW1lbnRcbiAgICogQHBhcmFtIG9uRmlsZXNDaG9zZW4gYSBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBjaG9zZW4gZmlsZXNcbiAgICovXG4gIHB1YmxpYyBjaG9vc2VGaWxlcyhcbiAgICBpbnB1dDogSFRNTElucHV0RWxlbWVudCxcbiAgICBvbkZpbGVzQ2hvc2VuOiAoZmlsZXM6IEZpbGVbXSkgPT4gdm9pZFxuICApIHtcbiAgICBpZiAodGhpcy5vbk9wZW5GaWxlQ2hvb3Nlci5pc0VtcHR5KSB7XG4gICAgICBpZiAoIXdpbmRvd1tcIkZpbGVSZWFkZXJcIl0pIHJldHVybjtcbiAgICAgIGlucHV0LnZhbHVlID0gXCJcIjtcbiAgICAgIGlucHV0Lm9uY2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghd2luZG93W1wiRmlsZVJlYWRlclwiXSkgcmV0dXJuO1xuICAgICAgICBpZiAoIWlucHV0IHx8ICFpbnB1dC5maWxlcyB8fCBpbnB1dC5maWxlcy5sZW5ndGggPCAxKSByZXR1cm47XG4gICAgICAgIGxldCBmaWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0LmZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZmlsZXMucHVzaChpbnB1dC5maWxlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgb25GaWxlc0Nob3NlbihmaWxlcyk7XG4gICAgICB9O1xuICAgICAgaW5wdXQuY2xpY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbk9wZW5GaWxlQ2hvb3Nlci5maXJlKHRoaXMsIHtcbiAgICAgICAgaW5wdXQ6IGlucHV0LFxuICAgICAgICBjYWxsYmFjazogb25GaWxlc0Nob3NlbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWNjb3JkaW9uVGFicygpOiBTdXJ2ZXlFbGVtZW50RWRpdG9yVGFiTW9kZWxbXSB7XG4gICAgbGV0IGFUYWJzO1xuXG4gICAgaWYgKHRoaXMuc2hvd0VsZW1lbnRFZGl0b3JBc1Byb3BlcnR5R3JpZCkge1xuICAgICAgYVRhYnMgPSB0aGlzLnByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsLmtvRWxlbWVudEVkaXRvcigpLmtvVGFicygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy51c2VUYWJzSW5FbGVtZW50RWRpdG9yKSB7XG4gICAgICBhVGFicyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhVGFicyA9IHRoaXMucXVlc3Rpb25FZGl0b3JXaW5kb3cua29FZGl0b3IoKS5rb1RhYnMoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYVRhYnM7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGFwc2UgYWxsIHByb3BlcnR5IGVkaXRvciB0YWJzIChhY2NvcmRpb25zKSBpbiBwcm9wZXJ0aWVzIHBhbmVsXG4gICAqL1xuICBwdWJsaWMgY29sbGFwc2VBbGxQcm9wZXJ0eVRhYnMoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRBY2NvcmRpb25UYWJzKCkuZm9yRWFjaCgodGFiOiBTdXJ2ZXlFbGVtZW50RWRpdG9yVGFiTW9kZWwpID0+IHtcbiAgICAgIHRhYi5jb2xsYXBzZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuZCBhbGwgcHJvcGVydHkgZWRpdG9yIHRhYnMgKGFjY29yZGlvbnMpIGluIHByb3BlcnRpZXMgcGFuZWxcbiAgICovXG4gIHB1YmxpYyBleHBhbmRBbGxQcm9wZXJ0eVRhYnMoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRBY2NvcmRpb25UYWJzKCkuZm9yRWFjaCgodGFiOiBTdXJ2ZXlFbGVtZW50RWRpdG9yVGFiTW9kZWwpID0+IHtcbiAgICAgIHRhYi5leHBhbmQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQgY2VydGFpbiBwcm9wZXJ0eSBlZGl0b3IgdGFiIChhY2NvcmRpb24pIGluIHByb3BlcnRpZXMgcGFuZWxcbiAgICogbmFtZSAtIHRhYiBjYXRlZ29yeSBuYW1lXG4gICAqL1xuICBwdWJsaWMgZXhwYW5kUHJvcGVydHlUYWIobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5nZXRBY2NvcmRpb25UYWJzKCkuZm9yRWFjaCgodGFiOiBTdXJ2ZXlFbGVtZW50RWRpdG9yVGFiTW9kZWwpID0+IHtcbiAgICAgIGlmICh0YWIubmFtZSAhPT0gbmFtZSkgcmV0dXJuO1xuICAgICAgdGFiLmV4cGFuZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxhcHNlIGNlcnRhaW4gcHJvcGVydHkgZWRpdG9yIHRhYiAoYWNjb3JkaW9uKSBpbiBwcm9wZXJ0aWVzIHBhbmVsXG4gICAqIG5hbWUgLSB0YWIgY2F0ZWdvcnkgbmFtZVxuICAgKi9cbiAgcHVibGljIGNvbGxhcHNlUHJvcGVydHlUYWIobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5nZXRBY2NvcmRpb25UYWJzKCkuZm9yRWFjaCgodGFiOiBTdXJ2ZXlFbGVtZW50RWRpdG9yVGFiTW9kZWwpID0+IHtcbiAgICAgIGlmICh0YWIubmFtZSA9PT0gbmFtZSkgdGFiLmNvbGxhcHNlKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleUVkaXRvciBleHRlbmRzIFN1cnZleUNyZWF0b3Ige1xuICBjb25zdHJ1Y3RvcihyZW5kZXJlZEVsZW1lbnQ6IGFueSA9IG51bGwsIG9wdGlvbnM6IGFueSA9IG51bGwpIHtcbiAgICBzdXBlcihyZW5kZXJlZEVsZW1lbnQsIG9wdGlvbnMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEVtcHR5UGFuZWxFbGVtZW50KFxuICBzdXJ2ZXk6IFN1cnZleUZvckRlc2lnbmVyLFxuICByb290OiBIVE1MRWxlbWVudCxcbiAgZHJhZ0Ryb3BIZWxwZXI6IGFueSxcbiAgcGFuZWw6IGFueVxuKTogSFRNTEVsZW1lbnQge1xuICB2YXIgZURpdjogSFRNTERpdkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBlRGl2LmNsYXNzTmFtZSA9IFwid2VsbCBjYXJkIGNhcmQtYmxvY2sgc3ZkLWVtcHR5LXBhbmVsXCI7XG4gIGVEaXYub25kcmFnb3ZlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgZHJhZ0Ryb3BIZWxwZXIuZG9EcmFnRHJvcE92ZXIoZSwgcGFuZWwpO1xuICB9O1xuICB2YXIgZVNwYW46IEhUTUxTcGFuRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICBlU3Bhbi50ZXh0Q29udGVudCA9IHN1cnZleS5nZXRFZGl0b3JMb2NTdHJpbmcoXCJzdXJ2ZXkuZHJvcFF1ZXN0aW9uXCIpO1xuICBlRGl2LmFwcGVuZENoaWxkKGVTcGFuKTtcbiAgcm9vdC5hcHBlbmRDaGlsZChlRGl2KTtcbiAgcmV0dXJuIGVEaXY7XG59XG4iLCJpbXBvcnQgeyBlblN0cmluZ3MgfSBmcm9tIFwiLi9sb2NhbGl6YXRpb24vZW5nbGlzaFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcblxuZXhwb3J0IHZhciBlZGl0b3JMb2NhbGl6YXRpb24gPSB7XG4gIGNhbWVsQ2FzZUJyZWFraW5nOiB0cnVlLFxuICBjdXJyZW50TG9jYWxlOiBcIlwiLFxuICBsb2NhbGVzOiB7fSxcbiAgZ2V0U3RyaW5nOiBmdW5jdGlvbihzdHJOYW1lOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nID0gbnVsbCkge1xuICAgIHZhciBsb2MgPSB0aGlzLmdldExvY2FsZShsb2NhbGUpO1xuICAgIHZhciBkZWZhdWx0TG9jYWxlID0gdGhpcy5nZXRMb2NhbGUoXCJlblwiKTtcbiAgICB2YXIgcGF0aCA9IHN0ck5hbWUuc3BsaXQoXCIuXCIpO1xuICAgIHZhciBvYmogPSBsb2M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmogPSBvYmpbcGF0aFtpXV07XG4gICAgICBpZiAoIW9iaiAmJiBvYmogIT09IFwiXCIpIHtcbiAgICAgICAgaWYgKGxvYyA9PT0gZGVmYXVsdExvY2FsZSkgcmV0dXJuIHBhdGhbaV07XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZyhzdHJOYW1lLCBcImVuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9LFxuICBoYXNTdHJpbmc6IGZ1bmN0aW9uKHN0ck5hbWU6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgdmFyIGxvYyA9IHRoaXMuZ2V0TG9jYWxlKGxvY2FsZSk7XG4gICAgdmFyIHBhdGggPSBzdHJOYW1lLnNwbGl0KFwiLlwiKTtcbiAgICB2YXIgb2JqID0gbG9jO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqID0gb2JqW3BhdGhbaV1dO1xuICAgICAgaWYgKCFvYmogJiYgb2JqICE9PSBcIlwiKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBnZXRMb2NhbGVOYW1lOiBmdW5jdGlvbihsb2M6IHN0cmluZywgZGVmYXVsdExvY2FsZTogc3RyaW5nID0gbnVsbCk6IHN0cmluZyB7XG4gICAgdmFyIGxvY2FsZU5hbWVzID0gU3VydmV5LnN1cnZleUxvY2FsaXphdGlvbltcImxvY2FsZU5hbWVzXCJdO1xuICAgIGlmICghZGVmYXVsdExvY2FsZSkge1xuICAgICAgZGVmYXVsdExvY2FsZSA9IFN1cnZleS5zdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuICEhbG9jXG4gICAgICA/IGxvY2FsZU5hbWVzW2xvY11cbiAgICAgIDogZWRpdG9yTG9jYWxpemF0aW9uXG4gICAgICAgICAgLmdldFN0cmluZyhcImVkLmRlZmF1bHRMb2NhbGVcIilcbiAgICAgICAgICBbXCJmb3JtYXRcIl0obG9jYWxlTmFtZXNbZGVmYXVsdExvY2FsZV0pO1xuICB9LFxuICBnZXRQcm9wZXJ0eU5hbWU6IGZ1bmN0aW9uKHN0ck5hbWU6IHN0cmluZywgZGVmYXVsdE5hbWU6IHN0cmluZyA9IG51bGwpIHtcbiAgICB2YXIgb2JqID0gdGhpcy5nZXRQcm9wZXJ0eShzdHJOYW1lLCBkZWZhdWx0TmFtZSk7XG4gICAgdmFyIG5hbWUgPSBvYmpbXCJuYW1lXCJdO1xuICAgIGlmICghIW5hbWUpIHtcbiAgICAgIGlmIChuYW1lICE9IHN0ck5hbWUpIHJldHVybiBuYW1lO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QXV0b1Byb3BlcnR5TmFtZShuYW1lLCBkZWZhdWx0TmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH0sXG4gIGdldFByb3BlcnR5VGl0bGU6IGZ1bmN0aW9uKHN0ck5hbWU6IHN0cmluZykge1xuICAgIHZhciBvYmogPSB0aGlzLmdldFByb3BlcnR5KHN0ck5hbWUpO1xuICAgIGlmIChvYmpbXCJ0aXRsZVwiXSkgcmV0dXJuIG9ialtcInRpdGxlXCJdO1xuICAgIHJldHVybiBcIlwiO1xuICB9LFxuICBnZXRQcm9wZXJ0eU5hbWVJbkVkaXRvcjogZnVuY3Rpb24oXG4gICAgc3RyTmFtZTogc3RyaW5nLFxuICAgIGRlZmF1bHROYW1lOiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIHZhciBvYmogPSB0aGlzLmdldFN0cmluZyhcInBlLlwiICsgc3RyTmFtZSk7XG4gICAgaWYgKG9iaiAhPT0gc3RyTmFtZSkgcmV0dXJuIG9iajtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eU5hbWUoc3RyTmFtZSwgZGVmYXVsdE5hbWUpO1xuICB9LFxuICBnZXRQcm9wZXJ0eTogZnVuY3Rpb24oc3RyTmFtZTogc3RyaW5nLCBkZWZhdWx0TmFtZTogc3RyaW5nID0gbnVsbCkge1xuICAgIHZhciBvYmogPSB0aGlzLmdldFN0cmluZyhcInAuXCIgKyBzdHJOYW1lKTtcbiAgICBpZiAob2JqICE9PSBzdHJOYW1lKSByZXR1cm4gb2JqO1xuICAgIHZhciBwb3MgPSBzdHJOYW1lLmluZGV4T2YoXCJfXCIpO1xuICAgIGlmIChwb3MgPCAtMSkgcmV0dXJuIHRoaXMuZ2V0QXV0b1Byb3BlcnR5TmFtZShvYmosIGRlZmF1bHROYW1lKTtcbiAgICBzdHJOYW1lID0gc3RyTmFtZS5zdWJzdHIocG9zICsgMSk7XG4gICAgb2JqID0gdGhpcy5nZXRTdHJpbmcoXCJwLlwiICsgc3RyTmFtZSk7XG4gICAgaWYgKG9iaiAhPT0gc3RyTmFtZSkgcmV0dXJuIG9iajtcbiAgICByZXR1cm4gdGhpcy5nZXRBdXRvUHJvcGVydHlOYW1lKG9iaiwgZGVmYXVsdE5hbWUpO1xuICB9LFxuICBnZXRBdXRvUHJvcGVydHlOYW1lOiBmdW5jdGlvbihwcm9wTmFtZTogc3RyaW5nLCBkZWZhdWx0TmFtZTogc3RyaW5nID0gbnVsbCkge1xuICAgIGlmICghIWRlZmF1bHROYW1lKSByZXR1cm4gZGVmYXVsdE5hbWU7XG4gICAgaWYgKCFwcm9wTmFtZSB8fCAhdGhpcy5jYW1lbENhc2VCcmVha2luZykgcmV0dXJuIHByb3BOYW1lO1xuICAgIHZhciByZXMgPSBwcm9wTmFtZVswXS50b1VwcGVyQ2FzZSgpO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcHJvcE5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcm9wTmFtZVtpXSA9PT0gcHJvcE5hbWVbaV0udG9VcHBlckNhc2UoKSkge1xuICAgICAgICByZXMgKz0gXCIgXCI7XG4gICAgICB9XG4gICAgICByZXMgKz0gcHJvcE5hbWVbaV0udG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSxcbiAgZ2V0UHJvcGVydHlWYWx1ZTogZnVuY3Rpb24odmFsdWU6IGFueSwgbG9jYWxlOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVJbnRlcm5hbCh2YWx1ZSwgXCJwdlwiLCBsb2NhbGUpO1xuICB9LFxuICBnZXRWYWxpZGF0b3JOYW1lOiBmdW5jdGlvbihuYW1lOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlSW50ZXJuYWwobmFtZSwgXCJ2YWxpZGF0b3JzXCIsIGxvY2FsZSk7XG4gIH0sXG4gIGdldFRyaWdnZXJOYW1lOiBmdW5jdGlvbihuYW1lOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlSW50ZXJuYWwobmFtZSwgXCJ0cmlnZ2Vyc1wiLCBsb2NhbGUpO1xuICB9LFxuICBnZXRMb2NhbGUobG9jYWxlOiBzdHJpbmcpIHtcbiAgICBpZiAoIWxvY2FsZSkgbG9jYWxlID0gdGhpcy5jdXJyZW50TG9jYWxlO1xuICAgIHZhciBsb2MgPSBsb2NhbGUgPyB0aGlzLmxvY2FsZXNbbG9jYWxlXSA6IGRlZmF1bHRTdHJpbmdzO1xuICAgIGlmICghbG9jKSBsb2MgPSBkZWZhdWx0U3RyaW5ncztcbiAgICByZXR1cm4gbG9jO1xuICB9LFxuICBnZXRWYWx1ZUludGVybmFsKHZhbHVlOiBhbnksIHByZWZpeDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyA9IG51bGwpIHtcbiAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFwiXCI7XG4gICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgIHZhciBsb2MgPSB0aGlzLmdldExvY2FsZShsb2NhbGUpO1xuICAgIHZhciByZXMgPSBsb2NbcHJlZml4XSA/IGxvY1twcmVmaXhdW3ZhbHVlXSA6IG51bGw7XG4gICAgaWYgKCFyZXMpIHJlcyA9IGRlZmF1bHRTdHJpbmdzW3ByZWZpeF1bdmFsdWVdO1xuICAgIHJldHVybiByZXMgPyByZXMgOiB2YWx1ZTtcbiAgfSxcbiAgZ2V0TG9jYWxlczogZnVuY3Rpb24oKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHJlcy5wdXNoKFwiXCIpO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmxvY2FsZXMpIHtcbiAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jU3RyaW5nKHN0ck5hbWU6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcgPSBudWxsKSB7XG4gIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKHN0ck5hbWUsIGxvY2FsZSk7XG59XG5cbmV4cG9ydCB2YXIgZGVmYXVsdFN0cmluZ3MgPSBlblN0cmluZ3M7XG4iLCJleHBvcnQgdmFyIF9fYXNzaWduID1cbiAgT2JqZWN0W1wiYXNzaWduXCJdIHx8XG4gIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIHAgaW4gcylcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdGFyZ2V0W3BdID0gc1twXTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyh0aGlzQ2xhc3MsIGJhc2VDbGFzcykge1xuICBmb3IgKHZhciBwIGluIGJhc2VDbGFzcylcbiAgICBpZiAoYmFzZUNsYXNzLmhhc093blByb3BlcnR5KHApKSB0aGlzQ2xhc3NbcF0gPSBiYXNlQ2xhc3NbcF07XG4gIGZ1bmN0aW9uIF9fKCkge1xuICAgIHRoaXMuY29uc3RydWN0b3IgPSB0aGlzQ2xhc3M7XG4gIH1cbiAgdGhpc0NsYXNzLnByb3RvdHlwZSA9XG4gICAgYmFzZUNsYXNzID09PSBudWxsXG4gICAgICA/IE9iamVjdC5jcmVhdGUoYmFzZUNsYXNzKVxuICAgICAgOiAoKF9fLnByb3RvdHlwZSA9IGJhc2VDbGFzcy5wcm90b3R5cGUpLCBuZXcgX18oKSk7XG59XG4iLCIvLyBzdHlsZXNcbmltcG9ydCBcIi4uL3V0aWxzL2N1c3RvbS1jaGVja2JveC5zY3NzXCI7XG5pbXBvcnQgXCIuLi91dGlscy9jdXN0b20tc2VsZWN0LnNjc3NcIjtcbmltcG9ydCBcIi4uL3V0aWxzL2RkbWVudS5zY3NzXCI7XG5pbXBvcnQgXCIuLi9tYWluLnNjc3NcIjtcblxuaW1wb3J0IFwiLi4vLi4vdmVuZG9yL2tub2Nrb3V0LXNvcnRhYmxlLmpzXCI7XG5cbmV4cG9ydCBsZXQgVmVyc2lvbjogc3RyaW5nO1xuVmVyc2lvbiA9IGAke3Byb2Nlc3MuZW52LlZFUlNJT059YDtcblxuZXhwb3J0IHsgZW5TdHJpbmdzIH0gZnJvbSBcIi4uL2xvY2FsaXphdGlvbi9lbmdsaXNoXCI7XG5leHBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24sIGRlZmF1bHRTdHJpbmdzIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuZXhwb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIGFzIGxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmV4cG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzXCI7XG5cbmV4cG9ydCB7IERyYWdEcm9wSGVscGVyIH0gZnJvbSBcIi4uL2RyYWdkcm9waGVscGVyXCI7XG5leHBvcnQgeyBFZGl0YWJsZU9iamVjdCB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvZWRpdGFibGVPYmplY3RcIjtcbmV4cG9ydCB7IFN1cnZleUVsZW1lbnRTZWxlY3RvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvc3VydmV5RWxlbWVudFNlbGVjdG9yXCI7XG5leHBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5RWRpdG9yQmFzZVwiO1xuZXhwb3J0IHsgU3VydmV5UHJvcGVydHlDdXN0b21FZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5Q3VzdG9tRWRpdG9yXCI7XG5leHBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuZXhwb3J0IHtcbiAgU3VydmV5U3RyaW5nUHJvcGVydHlFZGl0b3IsXG4gIFN1cnZleURyb3Bkb3duUHJvcGVydHlFZGl0b3IsXG4gIFN1cnZleUJvb2xlYW5Qcm9wZXJ0eUVkaXRvcixcbiAgU3VydmV5TnVtYmVyUHJvcGVydHlFZGl0b3IsXG59IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlFZGl0b3JGYWN0b3J5XCI7XG5leHBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eVRleHRJdGVtc0VkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlUZXh0SXRlbXNFZGl0b3JcIjtcbmV4cG9ydCB7IFN1cnZleVByb3BlcnR5SXRlbXNFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5SXRlbXNFZGl0b3JcIjtcbmV4cG9ydCB7IFN1cnZleVByb3BlcnR5SXRlbVZhbHVlc0VkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlJdGVtVmFsdWVzRWRpdG9yXCI7XG5leHBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eU11bHRpcGxlVmFsdWVzRWRpdG9yIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eU11bHRpcGxlVmFsdWVzRWRpdG9yXCI7XG5leHBvcnQge1xuICBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvcixcbiAgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3JJdGVtLFxufSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5TmVzdGVkUHJvcGVydHlFZGl0b3JcIjtcbmV4cG9ydCB7IFN1cnZleVByb3BlcnR5UGFnZXNFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5UGFnZXNFZGl0b3JcIjtcbmV4cG9ydCB7IFN1cnZleVByb3BlcnR5RHJvcGRvd25Db2x1bW5zRWRpdG9yIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eU1hdHJpeERyb3Bkb3duQ29sdW1uc0VkaXRvclwiO1xuZXhwb3J0IHsgU3VydmV5UHJvcGVydHlNb2RhbEVkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlNb2RhbEVkaXRvclwiO1xuZXhwb3J0IHtcbiAgU3VydmV5UHJvcGVydHlUZXh0RWRpdG9yLFxuICBTdXJ2ZXlQcm9wZXJ0eUh0bWxFZGl0b3IsXG59IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlNb2RhbEVkaXRvclwiO1xuZXhwb3J0IHsgU3VydmV5UHJvcGVydHlDb25kaXRpb25FZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5Q29uZGl0aW9uRWRpdG9yXCI7XG5leHBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eVJlc3VsdGZ1bGxFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5UmVzdGZ1bGxFZGl0b3JcIjtcbmV4cG9ydCB7XG4gIFN1cnZleVByb3BlcnR5RGVmYXVsdFZhbHVlRWRpdG9yLFxuICBTdXJ2ZXlQcm9wZXJ0eURlZmF1bHRSb3dWYWx1ZUVkaXRvcixcbiAgU3VydmV5UHJvcGVydHlEZWZhdWx0UGFuZWxWYWx1ZUVkaXRvcixcbiAgU3VydmV5UHJvcGVydHlTZXRFZGl0b3IsXG59IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3JcIjtcbmV4cG9ydCB7IFN1cnZleVByb3BlcnR5VHJpZ2dlcnNFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5VHJpZ2dlcnNFZGl0b3JcIjtcbmV4cG9ydCB7IFN1cnZleVByb3BlcnR5SHRtbENvbmRpdGlvbkVkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlIdG1sQ29uZGl0aW9uRWRpdG9yXCI7XG5leHBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eVVybENvbmRpdGlvbkVkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlVcmxDb25kaXRpb25FZGl0b3JcIjtcbmV4cG9ydCB7IFN1cnZleVByb3BlcnR5Q2FsY3VsYXRlZFZhbHVlRWRpdG9yIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUNhbGN1bGF0ZWRWYWx1ZXNcIjtcbmV4cG9ydCB7IFN1cnZleVByb3BlcnR5VmFsaWRhdG9yc0VkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlWYWxpZGF0b3JzRWRpdG9yXCI7XG5leHBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUNlbGxzRWRpdG9yIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUNlbGxzRWRpdG9yXCI7XG5leHBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUJpbmRpbmdzRWRpdG9yIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUJpbmRpbmdzRWRpdG9yXCI7XG5leHBvcnQgeyBTdXJ2ZXlPYmplY3RzIH0gZnJvbSBcIi4uL3N1cnZleU9iamVjdHNcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uRWRpdG9yRGVmaW5pdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvbkVkaXRvcnMvcXVlc3Rpb25FZGl0b3JEZWZpbml0aW9uXCI7XG5leHBvcnQge1xuICBTdXJ2ZXlDcmVhdG9yUHJvcGVydGllcyxcbiAgY3JlYXRvclByb3BlcnRpZXMsXG59IGZyb20gXCIuLi9xdWVzdGlvbkVkaXRvcnMvcHJvcGVydGllc1wiO1xuZXhwb3J0IHtcbiAgU3VydmV5UHJvcGVydHlFZGl0b3JTaG93V2luZG93LFxuICBTdXJ2ZXlRdWVzdGlvbkVkaXRvcixcbiAgU3VydmV5RWxlbWVudEVkaXRvclRhYk1vZGVsLFxufSBmcm9tIFwiLi4vcXVlc3Rpb25FZGl0b3JzL3F1ZXN0aW9uRWRpdG9yXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuLi9jb21wb25lbnRzL3Rvb2xib3hcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uVG9vbGJveCB9IGZyb20gXCIuLi90b29sYm94XCI7XG5leHBvcnQgeyBTdXJ2ZXlPYmplY3RQcm9wZXJ0eSB9IGZyb20gXCIuLi9vYmplY3RQcm9wZXJ0eVwiO1xuZXhwb3J0IHsgUGFnZXNFZGl0b3JWaWV3TW9kZWwgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9wYWdlcy1lZGl0b3JcIjtcbmV4cG9ydCB7IEVsZW1lbnRTZWxlY3RvclZpZXdNb2RlbCB9IGZyb20gXCIuLi9jb21wb25lbnRzL2VsZW1lbnQtc2VsZWN0b3JcIjtcbmV4cG9ydCB7IFRvb2xiYXIgfSBmcm9tIFwiLi4vY29tcG9uZW50cy90b29sYmFyXCI7XG5leHBvcnQgeyBTdXJ2ZXlUZXh0V29ya2VyIH0gZnJvbSBcIi4uL3RleHRXb3JrZXJcIjtcbmV4cG9ydCB7IE9ialR5cGUsIFN1cnZleUhlbHBlciB9IGZyb20gXCIuLi9zdXJ2ZXlIZWxwZXJcIjtcbmV4cG9ydCB7IFN1cnZleUxpdmVUZXN0ZXIgfSBmcm9tIFwiLi4vdGFicy90ZXN0XCI7XG5leHBvcnQgeyBTdXJ2ZXlFbWJlZGluZ1dpbmRvdyB9IGZyb20gXCIuLi90YWJzL2VtYmVkXCI7XG5leHBvcnQgeyBRdWVzdGlvbkNvbnZlcnRlciB9IGZyb20gXCIuLi9xdWVzdGlvbmNvbnZlcnRlclwiO1xuZXhwb3J0IHsgU3VydmV5SlNPTkVkaXRvciB9IGZyb20gXCIuLi90YWJzL2pzb24tZWRpdG9yXCI7XG5leHBvcnQgeyBTdXJ2ZXlMb2dpYyB9IGZyb20gXCIuLi90YWJzL2xvZ2ljXCI7XG5leHBvcnQge1xuICBTdXJ2ZXlGb3JEZXNpZ25lcixcbiAgcmVnaXN0ZXJBZG9ybmVyLFxuICByZW1vdmVBZG9ybmVycyxcbn0gZnJvbSBcIi4uL3N1cnZleWpzT2JqZWN0c1wiO1xuZXhwb3J0IHsgRXh0ZW50aW9ucyB9IGZyb20gXCIuLi9leHRlbnRpb25zXCI7XG5leHBvcnQgeyBTdXJ2ZXlFZGl0b3IgfSBmcm9tIFwiLi4vZWRpdG9yXCI7XG5leHBvcnQgeyBTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4uL2VkaXRvclwiO1xuZXhwb3J0IHsgU3R5bGVzTWFuYWdlciB9IGZyb20gXCIuLi9zdHlsZXNtYW5hZ2VyXCI7XG5cbi8vbG9jYWxpemF0aW9uXG5pbXBvcnQgXCIuLi9sb2NhbGl6YXRpb24vZGFuaXNoXCI7XG5pbXBvcnQgXCIuLi9sb2NhbGl6YXRpb24vZnJlbmNoXCI7XG5pbXBvcnQgXCIuLi9sb2NhbGl6YXRpb24vZ2VybWFuXCI7XG5pbXBvcnQgXCIuLi9sb2NhbGl6YXRpb24vaXRhbGlhblwiO1xuaW1wb3J0IFwiLi4vbG9jYWxpemF0aW9uL2luZG9uZXNpYW5cIjtcbmltcG9ydCBcIi4uL2xvY2FsaXphdGlvbi9rb3JlYW5cIjtcbmltcG9ydCBcIi4uL2xvY2FsaXphdGlvbi9wZXJzaWFuXCI7XG5pbXBvcnQgXCIuLi9sb2NhbGl6YXRpb24vcG9saXNoXCI7XG5pbXBvcnQgXCIuLi9sb2NhbGl6YXRpb24vcG9ydHVndWVzZVwiO1xuaW1wb3J0IFwiLi4vbG9jYWxpemF0aW9uL3NpbXBsaWZpZWQtY2hpbmVzZVwiO1xuaW1wb3J0IFwiLi4vbG9jYWxpemF0aW9uL3NwYW5pc2hcIjtcbmltcG9ydCBcIi4uL2xvY2FsaXphdGlvbi9zd2VkaXNoXCI7XG5pbXBvcnQgXCIuLi9sb2NhbGl6YXRpb24vdHJhZGl0aW9uYWwtY2hpbmVzZVwiO1xuaW1wb3J0IFwiLi4vbG9jYWxpemF0aW9uL3R1cmtpc2hcIjtcbmltcG9ydCBcIi4uL2xvY2FsaXphdGlvbi9ub3J3ZWdpYW5cIjtcbmltcG9ydCBcIi4uL2xvY2FsaXphdGlvbi9odW5nYXJpYW5cIjtcbmltcG9ydCBcIi4uL2xvY2FsaXphdGlvbi9ydXNzaWFuXCI7XG5pbXBvcnQgXCIuLi9sb2NhbGl6YXRpb24vdGFqaWtcIjtcbmltcG9ydCBcIi4uL2xvY2FsaXphdGlvbi9kdXRjaFwiO1xuaW1wb3J0IFwiLi4vbG9jYWxpemF0aW9uL2Nyb2F0aWFuXCI7XG5pbXBvcnQgXCIuLi9sb2NhbGl6YXRpb24vZmlubmlzaFwiO1xuXG5leHBvcnQge1xuICBUcmFuc2xhdGlvbixcbiAgVHJhbnNsYXRpb25Hcm91cCxcbiAgVHJhbnNsYXRpb25JdGVtLFxuICBUcmFuc2xhdGlvbkl0ZW1CYXNlLFxufSBmcm9tIFwiLi4vdGFicy90cmFuc2xhdGlvblwiO1xuXG4vL2Fkb3JuZXJzXG5leHBvcnQge1xuICB0aXRsZUFkb3JuZXIsXG4gIGl0ZW1UaXRsZUFkb3JuZXIsXG4gIGRlc2NyaXB0aW9uQWRvcm5lcixcbn0gZnJvbSBcIi4uL2Fkb3JuZXJzL3RpdGxlLWVkaXRvclwiO1xuZXhwb3J0IHsgaXRlbUFkb3JuZXIsIGl0ZW1EcmFnZ2FibGVBZG9ybmVyIH0gZnJvbSBcIi4uL2Fkb3JuZXJzL2l0ZW0tZWRpdG9yXCI7XG5leHBvcnQgeyBsYWJlbEFkb3JuZXIgfSBmcm9tIFwiLi4vYWRvcm5lcnMvbGFiZWwtZWRpdG9yXCI7XG5leHBvcnQge1xuICBxdWVzdGlvbkFjdGlvbnNBZG9ybmVyLFxuICBwYW5lbEFjdGlvbnNBZG9ybmVyLFxufSBmcm9tIFwiLi4vYWRvcm5lcnMvcXVlc3Rpb24tYWN0aW9uc1wiO1xuZXhwb3J0IHsgc2VsZWN0SXRlbXNBZG9ybmVyIH0gZnJvbSBcIi4uL2Fkb3JuZXJzL3NlbGVjdC1pdGVtc1wiO1xuXG4vLyBleHBvcnRcbmV4cG9ydCB7IHJhdGluZ0l0ZW1BZG9ybmVyIH0gZnJvbSBcIi4uL2Fkb3JuZXJzL3JhdGluZy1pdGVtLWVkaXRvclwiO1xuZXhwb3J0IHtcbiAgaW1hZ2VJdGVtc0Fkb3JuZXIsXG4gIGFkZEltYWdlSXRlbUFkb3JuZXIsXG59IGZyb20gXCIuLi9hZG9ybmVycy9pbWFnZS1pdGVtc1wiO1xuZXhwb3J0IHsgZmxvd3BhbmVsQWN0aW9uc0Fkb3JuZXIgfSBmcm9tIFwiLi4vYWRvcm5lcnMvZmxvd3BhbmVsLWFjdGlvbnNcIjtcbmV4cG9ydCB7IGltYWdlQWRvcm5lciB9IGZyb20gXCIuLi9hZG9ybmVycy9pbWFnZVwiO1xuZXhwb3J0IHsgdGl0bGVJbWFnZUFkb3JuZXIgfSBmcm9tIFwiLi4vYWRvcm5lcnMvdGl0bGUtaW1hZ2VcIjtcbmV4cG9ydCB7IFRpdGxlQWN0aW9uc1ZpZXdNb2RlbCB9IGZyb20gXCIuLi9hZG9ybmVycy90aXRsZS1hY3Rpb25zXCI7XG5cbi8vIHVpIGNvbXBvbmVudHNcbmV4cG9ydCB7XG4gIElBY2NvcmRpb25JdGVtRGF0YSxcbiAgQWNjb3JkaW9uSXRlbU1vZGVsLFxuICBBY2NvcmRpb25WaWV3TW9kZWwsXG59IGZyb20gXCIuLi91dGlscy9hY2NvcmRpb25cIjtcbmV4cG9ydCB7IEJ1dHRvblZpZXdNb2RlbCB9IGZyb20gXCIuLi91dGlscy9idXR0b25cIjtcbmV4cG9ydCB7IERyb3Bkb3duVmlld01vZGVsIH0gZnJvbSBcIi4uL3V0aWxzL2Ryb3Bkb3duXCI7XG5leHBvcnQgeyBCb29sZWFuVmlld01vZGVsIH0gZnJvbSBcIi4uL3V0aWxzL2Jvb2xlYW5cIjtcbmV4cG9ydCB7IFNWR0ljb25CaW5kaW5nIH0gZnJvbSBcIi4uL3V0aWxzL3N2Zy1pY29uXCI7XG5leHBvcnQgeyBTdXJ2ZXlXaWRnZXRCaW5kaW5nIH0gZnJvbSBcIi4uL3V0aWxzL3N1cnZleS13aWRnZXRcIjtcblxuZXhwb3J0IHsgU3BsaXR0ZXJDb21wb25lbnRWaWV3TW9kZWwgfSBmcm9tIFwiLi4vdXRpbHMvc3BsaXR0ZXJcIjtcbmV4cG9ydCB7IERlc2lnbmVyQ29udGFpbmVyVmlld01vZGVsIH0gZnJvbSBcIi4uL3V0aWxzL2Rlc2lnbmVyLWNvbnRhaW5lclwiO1xuZXhwb3J0IHsgRGVzaWduZXJIQ29udGFpbmVyVmlld01vZGVsIH0gZnJvbSBcIi4uL3V0aWxzL2Rlc2lnbmVyLWgtY29udGFpbmVyXCI7XG5cbmV4cG9ydCB7IFN1cnZleVByb3BlcnR5T25lU2VsZWN0ZWRFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5T25lU2VsZWN0ZWRFZGl0b3JcIjtcblxuLy8gcHJvcGVydHkgZ3JpZFxuZXhwb3J0IHsgUHJvcGVydHlHcmlkVmlld01vZGVsIH0gZnJvbSBcIi4uL3Byb3BlcnR5LWdyaWQvcHJvcGVydHktZ3JpZFwiO1xuZXhwb3J0IHsgT2JqZWN0RWRpdG9yVmlld01vZGVsIH0gZnJvbSBcIi4uL3Byb3BlcnR5LWdyaWQvb2JqZWN0LWVkaXRvclwiO1xuZXhwb3J0IHsgT2JqZWN0RWRpdG9yQ29udGVudFZpZXdNb2RlbCB9IGZyb20gXCIuLi9wcm9wZXJ0eS1ncmlkL29iamVjdC1lZGl0b3ItY29udGVudFwiO1xuZXhwb3J0IHsgT2JqZWN0RWRpdG9yVGFiVmlld01vZGVsIH0gZnJvbSBcIi4uL3Byb3BlcnR5LWdyaWQvb2JqZWN0LWVkaXRvci10YWJcIjtcbmV4cG9ydCB7IE9iamVjdEVkaXRvck9sZFRhYmxlQ29udGVudFZpZXdNb2RlbCB9IGZyb20gXCIuLi9wcm9wZXJ0eS1ncmlkL29iamVjdC1lZGl0b3Itb2xkLXRhYmxlLWNvbnRlbnRcIjtcblxuLy8gcHJvcGVydHkgZWRpdG9yc1xuZXhwb3J0IHsgUHJvcGVydHlFZGl0b3JWaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9wcm9wZXJ0eS1lZGl0b3JcIjtcbmV4cG9ydCB7IFByb3BlcnR5RWRpdG9yRXJyb3JWaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9lcnJvclwiO1xuZXhwb3J0IHsgUHJvcGVydHlFZGl0b3JTdHJpbmdWaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9zdHJpbmdcIjtcbmV4cG9ydCB7IFByb3BlcnR5RWRpdG9yRHJvcGRvd25WaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9kcm9wZG93blwiO1xuZXhwb3J0IHsgUHJvcGVydHlFZGl0b3JCb29sZWFuVmlld01vZGVsIH0gZnJvbSBcIi4uL3Byb3BlcnR5LWVkaXRvcnMvYm9vbGVhblwiO1xuZXhwb3J0IHsgUHJvcGVydHlFZGl0b3JTd2l0Y2hWaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9zd2l0Y2hcIjtcbmV4cG9ydCB7IFByb3BlcnR5RWRpdG9yTnVtYmVyVmlld01vZGVsIH0gZnJvbSBcIi4uL3Byb3BlcnR5LWVkaXRvcnMvbnVtYmVyXCI7XG5leHBvcnQgeyBQcm9wZXJ0eUVkaXRvckNvbG9yVmlld01vZGVsIH0gZnJvbSBcIi4uL3Byb3BlcnR5LWVkaXRvcnMvY29sb3JcIjtcbmV4cG9ydCB7IFByb3BlcnR5RWRpdG9yTW9kYWxWaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9tb2RhbFwiO1xuZXhwb3J0IHsgUHJvcGVydHlFZGl0b3JNb2RhbENvbnRlbnQgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9tb2RhbC1jb250ZW50XCI7XG5leHBvcnQgeyBQcm9wZXJ0eUVkaXRvclRleHRWaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy90ZXh0XCI7XG5leHBvcnQgeyBQcm9wZXJ0eUVkaXRvclN0cmluZ3NWaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9zdHJpbmdzXCI7XG5leHBvcnQgeyBQcm9wZXJ0eUVkaXRvckNvbmRpdGlvblZpZXdNb2RlbCB9IGZyb20gXCIuLi9wcm9wZXJ0eS1lZGl0b3JzL2NvbmRpdGlvblwiO1xuZXhwb3J0IHsgUHJvcGVydHlFZGl0b3JDZWxsc1ZpZXdNb2RlbCB9IGZyb20gXCIuLi9wcm9wZXJ0eS1lZGl0b3JzL2NlbGxzXCI7XG5leHBvcnQgeyBQcm9wZXJ0eUVkaXRvckV4cHJlc3Npb25WaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9leHByZXNzaW9uXCI7XG5leHBvcnQgeyBQcm9wZXJ0eUVkaXRvckhUTUxWaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9odG1sLXBlXCI7XG5leHBvcnQgeyBQcm9wZXJ0eUVkaXRvckl0ZW1WYWx1ZXNWaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9pdGVtLXZhbHVlc1wiO1xuZXhwb3J0IHsgUHJvcGVydHlFZGl0b3JWYWx1ZVZpZXdNb2RlbCB9IGZyb20gXCIuLi9wcm9wZXJ0eS1lZGl0b3JzL2RlZmF1bHQtdmFsdWVcIjtcbmV4cG9ydCB7IFByb3BlcnR5RWRpdG9yT25lU2VsZWN0ZWRWaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9vbmUtc2VsZWN0ZWRcIjtcbmV4cG9ydCB7IFByb3BlcnR5RWRpdG9yUmVzdGZ1bGxWaWV3TW9kZWwgfSBmcm9tIFwiLi4vcHJvcGVydHktZWRpdG9ycy9yZXN0ZnVsbFwiO1xuZXhwb3J0IHsgUHJvcGVydHlFZGl0b3JNdWx0aXBsZVZhbHVlc1ZpZXdNb2RlbCB9IGZyb20gXCIuLi9wcm9wZXJ0eS1lZGl0b3JzL211bHRpcGxlLXZhbHVlc1wiO1xuZXhwb3J0IHsgUHJvcGVydHlFZGl0b3JOZXN0ZWRJdGVtc1ZpZXdNb2RlbCB9IGZyb20gXCIuLi9wcm9wZXJ0eS1lZGl0b3JzL25lc3RlZC1pdGVtc1wiO1xuZXhwb3J0IHsgUHJvcGVydHlFZGl0b3JOZXN0ZWRJdGVtVmlld01vZGVsIH0gZnJvbSBcIi4uL3Byb3BlcnR5LWVkaXRvcnMvbmVzdGVkLWl0ZW1cIjtcbmV4cG9ydCB7IFByb3BlcnR5RWRpdG9yTmVzdGVkVmlld01vZGVsIH0gZnJvbSBcIi4uL3Byb3BlcnR5LWVkaXRvcnMvbmVzdGVkXCI7XG5leHBvcnQgeyBQcm9wZXJ0eUVkaXRvckN1c3RvbVZpZXdNb2RlbCB9IGZyb20gXCIuLi9wcm9wZXJ0eS1lZGl0b3JzL2N1c3RvbVwiO1xuZXhwb3J0IHsgUHJvcGVydHlFZGl0b3JCaW5kaW5nc1ZpZXdNb2RlbCB9IGZyb20gXCIuLi9wcm9wZXJ0eS1lZGl0b3JzL2JpbmRpbmdzXCI7XG5cbmV4cG9ydCB7IFN1cnZleUZpbGVQcm9wZXJ0eUVkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eS1lZGl0b3JzL2ZpbGVcIjtcbmV4cG9ydCB7IHNpbXVsYXRvckRldmljZXMgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9zaW11bGF0b3JcIjtcbiIsImltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcblxuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25Ub0Rpc3BsYXlUZXh0IHtcbiAgcHJpdmF0ZSBjdXJyZW50UXVlc3Rpb246IFN1cnZleS5RdWVzdGlvbjtcbiAgcHJpdmF0ZSBzaG93VGl0bGVzOiBib29sZWFuO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3VydmV5OiBTdXJ2ZXkuU3VydmV5TW9kZWwsIHByaXZhdGUgb3B0aW9uczogYW55ID0gbnVsbCkge31cbiAgcHVibGljIHRvRGlzcGxheVRleHQoZXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICB0aGlzLnNob3dUaXRsZXMgPVxuICAgICAgISF0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnNob3dUaXRsZXNJbkV4cHJlc3Npb25zID09IHRydWU7XG4gICAgdmFyIHBhcnNlciA9IG5ldyBTdXJ2ZXkuQ29uZGl0aW9uc1BhcnNlcigpO1xuICAgIHZhciBub2RlID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uKTtcbiAgICBpZiAoIW5vZGUpIHJldHVybiBleHByZXNzaW9uO1xuICAgIGlmICghIW5vZGVbXCJnZXRUeXBlXCJdKSByZXR1cm4gdGhpcy50b0Rpc3BsYXlUZXh0Q29yZShub2RlKTtcbiAgICBpZiAoIXRoaXMuc2hvd1RpdGxlcykgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgdmFyIHZhcmlhYmxlcyA9IFtdO1xuICAgIG5vZGUuc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7XG4gICAgcmV0dXJuIHRoaXMucmVwbGFjZVZhcmlhYmxlcyhleHByZXNzaW9uLCB2YXJpYWJsZXMpO1xuICB9XG4gIHByaXZhdGUgdG9EaXNwbGF5VGV4dENvcmUobm9kZTogU3VydmV5Lk9wZXJhbmQpOiBzdHJpbmcge1xuICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uID0gbnVsbDtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGlzUm9vdCA9IHRydWU7XG4gICAgdmFyIHN0ckZ1bmMgPSBmdW5jdGlvbiAob3A6IFN1cnZleS5PcGVyYW5kKTogc3RyaW5nIHtcbiAgICAgIHZhciBsb2NJc1Jvb3QgPSBpc1Jvb3Q7XG4gICAgICBpc1Jvb3QgPSBmYWxzZTtcbiAgICAgIGlmIChzZWxmLnNob3dUaXRsZXMgJiYgb3AuZ2V0VHlwZSgpID09IFwidmFyaWFibGVcIikge1xuICAgICAgICByZXR1cm4gc2VsZi5nZXRRdWVzdGlvblRleHQoPFN1cnZleS5WYXJpYWJsZT5vcCk7XG4gICAgICB9XG4gICAgICBpZiAoc2VsZi5zaG93VGl0bGVzICYmIG9wLmdldFR5cGUoKSA9PSBcImNvbnN0XCIpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0RGlzcGxheVRleHQoPFN1cnZleS5Db25zdD5vcCk7XG4gICAgICB9XG4gICAgICBpZiAob3AuZ2V0VHlwZSgpID09IFwiYmluYXJ5XCIpIHtcbiAgICAgICAgc2VsZi5wcm9jZWVkQmluYXJ5KDxTdXJ2ZXkuQmluYXJ5T3BlcmFuZD5vcCk7XG4gICAgICAgIHJldHVybiBzZWxmLmdldERpc3BsYXlCaW5hcnkoXG4gICAgICAgICAgPFN1cnZleS5CaW5hcnlPcGVyYW5kPm9wLFxuICAgICAgICAgIGxvY0lzUm9vdCxcbiAgICAgICAgICBzdHJGdW5jXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAob3AuZ2V0VHlwZSgpID09IFwidW5hcnlcIikge1xuICAgICAgICByZXR1cm4gc2VsZi5nZXREaXNwbGF5VW5hcnkoPFN1cnZleS5VbmFyeU9wZXJhbmQ+b3AsIHN0ckZ1bmMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHJldHVybiBub2RlLnRvU3RyaW5nKHN0ckZ1bmMpO1xuICB9XG4gIHByaXZhdGUgZ2V0UXVlc3Rpb25UZXh0KG9wOiBTdXJ2ZXkuVmFyaWFibGUpOiBzdHJpbmcge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUob3AudmFyaWFibGUpO1xuICAgIGlmICghcXVlc3Rpb24gfHwgIXF1ZXN0aW9uLnRpdGxlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBcIntcIiArIHF1ZXN0aW9uLnRpdGxlICsgXCJ9XCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VGV4dChvcDogU3VydmV5LkNvbnN0KTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFF1ZXN0aW9uKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZhciByZXMgPSB0aGlzLmN1cnJlbnRRdWVzdGlvbi5nZXREaXNwbGF5VmFsdWUodHJ1ZSwgb3AuY29ycmVjdFZhbHVlKTtcbiAgICByZXR1cm4gISFyZXMgPyBuZXcgU3VydmV5LkNvbnN0KHJlcykudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcbiAgfVxuICBwcml2YXRlIGdldERpc3BsYXlPcGVyYW5kKFxuICAgIG9wOiBhbnksXG4gICAgZnVuYzogKG9wOiBTdXJ2ZXkuT3BlcmFuZCkgPT4gc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhb3AgPyBvcC50b1N0cmluZyhmdW5jKSA6IFwiXCI7XG4gIH1cbiAgc3RhdGljIG9wZXJhdG9yVGV4dCA9IHtcbiAgICBsZXNzOiBcIjxcIixcbiAgICBsZXNzb3JlcXVhbDogXCI8PVwiLFxuICAgIGdyZWF0ZXI6IFwiPlwiLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBcIj49XCIsXG4gICAgZXF1YWw6IFwiPT1cIixcbiAgICBub3RlcXVhbDogXCIhPVwiLFxuICAgIHBsdXM6IFwiK1wiLFxuICAgIG1pbnVzOiBcIi1cIixcbiAgICBtdWw6IFwiKlwiLFxuICAgIGRpdjogXCIvXCIsXG4gICAgcG93ZXI6IFwiXlwiLFxuICAgIG1vZDogXCIlXCIsXG4gICAgbmVnYXRlOiBcIiFcIixcbiAgfTtcblxuICBwcml2YXRlIGdldERpc3BsYXlPcGVyYXRvcihvcGVyYXRvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gRXhwcmVzc2lvblRvRGlzcGxheVRleHQub3BlcmF0b3JUZXh0W29wZXJhdG9yXTtcbiAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvcC5cIiArIG9wZXJhdG9yKTtcbiAgfVxuICBwcml2YXRlIGdldERpc3BsYXlCaW5hcnkoXG4gICAgb3A6IFN1cnZleS5CaW5hcnlPcGVyYW5kLFxuICAgIGlzUm9vdDogYm9vbGVhbixcbiAgICBmdW5jOiAob3A6IFN1cnZleS5PcGVyYW5kKSA9PiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGlzUm9vdCA/IFwiXCIgOiBcIihcIikgK1xuICAgICAgdGhpcy5nZXREaXNwbGF5T3BlcmFuZChvcC5sZWZ0T3BlcmFuZCwgZnVuYykgK1xuICAgICAgXCIgXCIgK1xuICAgICAgdGhpcy5nZXREaXNwbGF5T3BlcmF0b3Iob3Aub3BlcmF0b3IpICtcbiAgICAgIFwiIFwiICtcbiAgICAgIHRoaXMuZ2V0RGlzcGxheU9wZXJhbmQob3AucmlnaHRPcGVyYW5kLCBmdW5jKSArXG4gICAgICAoaXNSb290ID8gXCJcIiA6IFwiKVwiKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VW5hcnkoXG4gICAgb3A6IFN1cnZleS5VbmFyeU9wZXJhbmQsXG4gICAgZnVuYzogKG9wOiBTdXJ2ZXkuT3BlcmFuZCkgPT4gc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgdmFyIGV4cCA9IG9wLmV4cHJlc3Npb24udG9TdHJpbmcoZnVuYyk7XG4gICAgdmFyIG9wZXJhdG9yID0gdGhpcy5nZXREaXNwbGF5T3BlcmF0b3Iob3Aub3BlcmF0b3IpO1xuICAgIGlmIChvcC5vcGVyYXRvciA9PSBcImVtcHR5XCIgfHwgb3Aub3BlcmF0b3IgPT0gXCJub3RlbXB0eVwiKVxuICAgICAgcmV0dXJuIGV4cCArIFwiIFwiICsgb3BlcmF0b3I7XG4gICAgcmV0dXJuIG9wZXJhdG9yICsgXCIgXCIgKyBleHA7XG4gIH1cbiAgcHJpdmF0ZSBwcm9jZWVkQmluYXJ5KG9wOiBTdXJ2ZXkuQmluYXJ5T3BlcmFuZCkge1xuICAgIGlmIChvcC5pc0FyaXRobWV0aWMgfHwgb3AuaXNDb25qdW5jdGlvbikge1xuICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb24gPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25Gcm9tT3BlcmFuZHMoXG4gICAgICBvcC5sZWZ0T3BlcmFuZCxcbiAgICAgIG9wLnJpZ2h0T3BlcmFuZFxuICAgICk7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRRdWVzdGlvbikge1xuICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uRnJvbU9wZXJhbmRzKFxuICAgICAgICBvcC5yaWdodE9wZXJhbmQsXG4gICAgICAgIG9wLmxlZnRPcGVyYW5kXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFF1ZXN0aW9uRnJvbU9wZXJhbmRzKG9wMTogU3VydmV5Lk9wZXJhbmQsIG9wMjogU3VydmV5Lk9wZXJhbmQpIHtcbiAgICBpZiAoIW9wMSB8fCAhb3AyKSByZXR1cm4gbnVsbDtcbiAgICBpZiAob3AxLmdldFR5cGUoKSAhPSBcInZhcmlhYmxlXCIpIHJldHVybiBudWxsO1xuICAgIHZhciBvcDJUeXBlID0gb3AyLmdldFR5cGUoKTtcbiAgICBpZiAob3AyVHlwZSAhPSBcImNvbnN0XCIgJiYgb3AyVHlwZSAhPSBcImZ1bmN0aW9uXCIgJiYgb3AyVHlwZSAhPSBcImFycmF5XCIpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZSgoPFN1cnZleS5WYXJpYWJsZT5vcDEpLnZhcmlhYmxlKTtcbiAgfVxuICBwcml2YXRlIHJlcGxhY2VWYXJpYWJsZXMoXG4gICAgZXhwcmVzc2lvbjogc3RyaW5nLFxuICAgIHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPlxuICApOiBzdHJpbmcge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBleHByZXNzaW9uID0gdGhpcy5yZXBsYWNlVmFyaWFibGUoZXhwcmVzc2lvbiwgdmFyaWFibGVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHJlc3Npb247XG4gIH1cbiAgcHJpdmF0ZSByZXBsYWNlVmFyaWFibGUoZXhwcmVzc2lvbjogc3RyaW5nLCB2YXJpYWJsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKHZhcmlhYmxlKTtcbiAgICBpZiAoIXF1ZXN0aW9uIHx8ICFxdWVzdGlvbi50aXRsZSkgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgcmV0dXJuIGV4cHJlc3Npb24ucmVwbGFjZShcIntcIiArIHZhcmlhYmxlICsgXCJ9XCIsIFwie1wiICsgcXVlc3Rpb24udGl0bGUgKyBcIn1cIik7XG4gIH1cbiAgcHJpdmF0ZSBnZXRRdWVzdGlvbkJ5TmFtZShuYW1lOiBzdHJpbmcpOiBTdXJ2ZXkuUXVlc3Rpb24ge1xuICAgIHJldHVybiA8U3VydmV5LlF1ZXN0aW9uPnRoaXMuc3VydmV5LmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUobmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25SZW1vdmVWYXJpYWJsZSB7XG4gIHByaXZhdGUgd2FzUmVtb3ZlZDogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IoKSB7fVxuICBwdWJsaWMgcmVtb3ZlKGV4cHJlc3Npb246IHN0cmluZywgdmFyaWFibGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHBhcnNlciA9IG5ldyBTdXJ2ZXkuQ29uZGl0aW9uc1BhcnNlcigpO1xuICAgIHZhciBub2RlID0gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uKTtcbiAgICBpZiAoIW5vZGUpIHJldHVybiBleHByZXNzaW9uO1xuICAgIHRoaXMud2FzUmVtb3ZlZCA9IGZhbHNlO1xuICAgIGlmICghIW5vZGVbXCJnZXRUeXBlXCJdKSB7XG4gICAgICB2YXIgb3AgPSB0aGlzLnByb2Nlc3NPcGVyYW5kKG5vZGUsIHZhcmlhYmxlKTtcbiAgICAgIGlmICghdGhpcy53YXNSZW1vdmVkKSByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICAgIHJldHVybiAhIW9wID8gb3AudG9TdHJpbmcoKSA6IFwiXCI7XG4gICAgfVxuICAgIHJldHVybiBleHByZXNzaW9uO1xuICB9XG4gIHByaXZhdGUgcHJvY2Vzc09wZXJhbmQob3A6IFN1cnZleS5PcGVyYW5kLCB2YXJpYWJsZTogc3RyaW5nKTogU3VydmV5Lk9wZXJhbmQge1xuICAgIGlmICghb3ApIHJldHVybiBudWxsO1xuICAgIGlmIChvcC5nZXRUeXBlKCkgPT0gXCJ2YXJpYWJsZVwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzVmFyaWFibGUoPFN1cnZleS5WYXJpYWJsZT5vcCwgdmFyaWFibGUpO1xuICAgIH1cbiAgICBpZiAob3AuZ2V0VHlwZSgpID09IFwidW5hcnlcIikge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1VuYXJ5KDxTdXJ2ZXkuVW5hcnlPcGVyYW5kPm9wLCB2YXJpYWJsZSk7XG4gICAgfVxuICAgIGlmIChvcC5nZXRUeXBlKCkgPT0gXCJiaW5hcnlcIikge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2VlZEJpbmFyeSg8U3VydmV5LkJpbmFyeU9wZXJhbmQ+b3AsIHZhcmlhYmxlKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wO1xuICB9XG4gIHByaXZhdGUgcHJvY2Vzc1ZhcmlhYmxlKFxuICAgIG9wOiBTdXJ2ZXkuVmFyaWFibGUsXG4gICAgdmFyaWFibGU6IHN0cmluZ1xuICApOiBTdXJ2ZXkuT3BlcmFuZCB7XG4gICAgaWYgKG9wLnZhcmlhYmxlICE9PSB2YXJpYWJsZSkgcmV0dXJuIG9wO1xuICAgIHRoaXMud2FzUmVtb3ZlZCA9IHRydWU7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBwcm9jZXNzVW5hcnkoXG4gICAgb3A6IFN1cnZleS5VbmFyeU9wZXJhbmQsXG4gICAgdmFyaWFibGU6IHN0cmluZ1xuICApOiBTdXJ2ZXkuT3BlcmFuZCB7XG4gICAgdmFyIGV4cHJlc3Npb24gPSB0aGlzLnByb2Nlc3NPcGVyYW5kKG9wLmV4cHJlc3Npb24sIHZhcmlhYmxlKTtcbiAgICBpZiAoISFleHByZXNzaW9uKSByZXR1cm4gb3A7XG4gICAgdGhpcy53YXNSZW1vdmVkID0gdHJ1ZTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcml2YXRlIHByb2NlZWRCaW5hcnkoXG4gICAgb3A6IFN1cnZleS5CaW5hcnlPcGVyYW5kLFxuICAgIHZhcmlhYmxlOiBzdHJpbmdcbiAgKTogU3VydmV5Lk9wZXJhbmQge1xuICAgIHZhciBsZWZ0ID0gdGhpcy5wcm9jZXNzT3BlcmFuZChvcC5sZWZ0T3BlcmFuZCwgdmFyaWFibGUpO1xuICAgIHZhciByaWdodCA9IHRoaXMucHJvY2Vzc09wZXJhbmQob3AucmlnaHRPcGVyYW5kLCB2YXJpYWJsZSk7XG4gICAgaWYgKCEhbGVmdCAmJiAhIXJpZ2h0KSB7XG4gICAgICBpZiAobGVmdCAhPT0gb3AubGVmdE9wZXJhbmQgfHwgcmlnaHQgIT09IG9wLnJpZ2h0T3BlcmFuZClcbiAgICAgICAgcmV0dXJuIG5ldyBTdXJ2ZXkuQmluYXJ5T3BlcmFuZChcbiAgICAgICAgICBvcC5vcGVyYXRvcixcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgIG9wLmlzQXJpdGhtZXRpY1xuICAgICAgICApO1xuICAgICAgcmV0dXJuIG9wO1xuICAgIH1cbiAgICBpZiAoIWxlZnQgJiYgIXJpZ2h0KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcmVzID0gISFsZWZ0ID8gbGVmdCA6IHJpZ2h0O1xuICAgIHJldHVybiByZXMuZ2V0VHlwZSgpID09IFwiYmluYXJ5XCIgPyByZXMgOiBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5IH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5RWRpdG9yQmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgRXh0ZW50aW9ucyB7XG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJDdXN0b21Qcm9wZXJ0eUVkaXRvcihuYW1lOiBzdHJpbmcsIHdpZGdldEpTT046IGFueSkge1xuICAgIFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckN1c3RvbUVkaXRvcihuYW1lLCB3aWRnZXRKU09OKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHVucmVnaXN0ZXJDdXN0b21Qcm9wZXJ0eUVkaXRvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkudW5yZWdpc3RlckN1c3RvbUVkaXRvcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyUHJvcGVydHlFZGl0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWF0b3I6IChwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkgPT4gU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlXG4gICkge1xuICAgIFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihuYW1lLCBjcmVhdG9yKTtcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRThBQUFBU0NBWUFBQUFhSklPdkFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeVpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRReUlEYzVMakUyTURreU5Dd2dNakF4Tnk4d055OHhNeTB3TVRvd05qb3pPU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UZ2dLRmRwYm1SdmQzTXBJaUI0YlhCTlRUcEpibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1EzUlVVd05EUTROalJFUmpFeFJUbEJNVEpCT0RjeE9VRXpSamhFUTBFMUlpQjRiWEJOVFRwRWIyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rUTNSVVV3TkRRNU5qUkVSakV4UlRsQk1USkJPRGN4T1VFelJqaEVRMEUxSWo0Z1BIaHRjRTFOT2tSbGNtbDJaV1JHY205dElITjBVbVZtT21sdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlJEZEZSVEEwTkRZMk5FUkdNVEZGT1VFeE1rRTROekU1UVROR09FUkRRVFVpSUhOMFVtVm1PbVJ2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UkRkRlJUQTBORGMyTkVSR01URkZPVUV4TWtFNE56RTVRVE5HT0VSRFFUVWlMejRnUEM5eVpHWTZSR1Z6WTNKcGNIUnBiMjQrSUR3dmNtUm1PbEpFUmo0Z1BDOTRPbmh0Y0cxbGRHRStJRHcvZUhCaFkydGxkQ0JsYm1ROUluSWlQejRFZ0Z5QUFBQUhOVWxFUVZSNDJyeFlXMnhVVlJROWMrZk9nK0tVdnNZV2FTcWxMUllGVVpFZk5FZ0VQa3lKdFNZb1VXTEFHSldZSmdqaWh5WkdOQmoxQTRRUVREQUlST0tIRWtVZU1XbzBNVnJBMkNnVWF3UWNwSVJTUUpoUzJqS2QxNzJ1ZFdlZmVxbnRUSXVVazZ5Wjh6NzdyTDNQUHZzZWo2MzZVejF3SHpBQktBWUtnYkdDQU9BSFRNQUFPQ3dGSklBNGNBWG9CVHFCS05BQkhBYTJjZUx2UWlGVlgxT2pLaElKWmFmVHlqQU0xZHJhNml3NmRlcFVaVm1XQXlhUHg2UGNLWlZLS2EvWHEyemJkc0QyZ1gxeUpYZC9QWStyN1hiOGpSZlpmM0gzNDdvSnlKeUd6SUZBd0pHUnNoT3NNNlh2RHVCSmRmM1RTdUNCeWtRaVdwUk1xaXUyWFJPMDdYVVFMQllPaDErRjRNZGtNODhqUHgvL1IwSFdLMXA0MHpRSEpVcVQ2RW9MZ1NlQU5HQnBYZ0N2S1BLRkxESytDOVFCUnpGbnJadHdnc29iU2xra3IyR1VpSE1NQzFoZEdZODNQdGpSb2JZVkZGeW9OYzA2YnI2MHRIUS90SGVNbW9XRzM0UTJTMUQrak5wMUUrZTJrc0VzU2RJamdxRlNOdkl1eS84bFBiZTJNT1lkQ3pQTlFRY2FPUmE5SG1rMmYrYkE4cFRmMzJsYjFrNEtsVXdtcDhkaU1SNkxFalNYaUFWdW9LQit2OTg1TXNNOWlranZBRThEendGOXJ0TzBGSGhVSzJEZ2taV1UxaDVDazBWa1VkUlY1RlhrM0g2T2plUkk5S0htSGJDd1FnZ0ZCL2tOTndETnppSkJFRzQ2dFN3K3M0bGExejV1c09NNldCM1FndXhXWUxQNFlNNjdHNkRQL1Z4Yjh4RGtHMUkyMlMvYk1SMk12T0tjdmZMemxWcXpScW1xcW1zaHJ3Z0lUd1o1RlNBbEhReCtKVDZyaGhZR1M1c3NCRFNCeEJSUWdVMnN4NWlEd0M1YURqZERRdEZXanp4OTFBcVplNHBZM2R0QUh1RFRaTWlGeDdSY3hqd3VKRFZJK1NVaEtjWWZyQm1CeGQwTmViNUcvVjVVVGROSEdMTGxJZjhlMWo5Q0JhUDhzak1YOUhFUy83Zm1PQ09jSFFZT2MxNjFTcWwxNjBaS0lEZjV4N3p5Y3ZWVE1LZ21lTDBuUUVZbGptNDFoRm9HZ1ZmaStDNkJvTnRCS0gzUE9MRkdKM1YxZFRXZ3o2NVFLUFFGTE9OaHVSUzg0cXQzU0xjeTRKejRzQkRtWFlKTmJwZUlnS1QrZ1BKc0lhWk9yQlpGendaa0cxV0dCOTY2QVNHVmM1V0pUMjRHWmd3NEFhOFpvckhzaVoyUEg4OGMzN1ZybFdyQktWbXdZQ1RrT1d0VXdPL0ZNa2R5dDFqQkl2emRTMkZBM0VjZ3FBR2tqVU45SjRndGgrQ2JTQ0lJZlVPczgwK1o3K2dBWjY4a2RCcDRxdHg5VDhuL2Fmay9ycDJTV05oRXJEa1grV2VFbkZKWVloRGxjc2cxQSsxOThYaWNsOXFMY3BFOWEwajhsanU1YjV4cDA1VGFzMGVwNW1hbFpzNGN6bWhxWGsyRTVkb2dBNExzNTNHQVVFdUIreUZRMU9meldjZ3ZaRDJFTzRLNmRxQ1paY1JZdFhsNWVSelhOWW9YMjM1WVZ4T3d6K1ZMUzFDZUxtN21MMVJmaE9VZkZNVVhtUDlydVlLQ3Ewbk5ZcnVPNVRFRUFRbit2cjRtM0xxODFhcW9SVmpYYnZFN0ZmS2ZvaitFMEQ0Sm5uMHlUM3cwV0pPQTJMRlVXSi9QZFdIY3hGMEtlWmRGcHZOaW1UNE9TQTVyaFpUclZKeUVlMWk4V0tucWFxVU9IQmpPYUdlTkNmQWZRU0FKcTRJQWgxMkI2SmRpY1ZvVGhwQnFxQnVVSUk4aFVZRDk3MkV6KzRsRTIyVGt0Nkw5UTJrT21QSnBsVHZoODhwSnExZG5idDVrY2lTeU9UZGFHY21MeDFVZmhNd3pqTDBRaEVjaURhRytGUUd0YkdHSnR1QWJtTnd4U3lGa1dpSjVIdUVla3RlZGM0cEMzUG9iTnlxMVpZdFNodzZOV0trNmVvZG5WajZZdm85V1psbG5oYUE0L04wbHlYdmszeEtuYkEyeG1SR1RpUGx5anBHdkNwOE9rbkVhTE5hSlRDMk1TYlZTS1IvSnU1Qno1Vzd3MjloNHJkcUw2alY2SVFqRC8yQkdnREY2WDR5amNMTjJROUFlZm1GQVpvOEV5eW41VkxJWjV5RWZGT0ZUY2tOZXpCTFEydTdiRklRa012Rys5L0lRVmgyRHYzUENGeWhUaWYvamJkN05Sd0VTS21FTEU0L3VSZE4xZFEvUDM0MDhuZEZoQk1sTDBKZjkxeXBNc1RTR0QvT0FXaUdsVWdMazA0ejgwWjR2bGxDS012M2kzQ3prR1RLbi9qeGk2QkhBWEhNR1dyVW9ZZ29RUnZFaDhYME1rYzd3QXBFK2s2VDdmTFE5cFY5VjlvN2l3d0RUenpwekRsWkZBbzJNNXZXWERTM1E1RTBHNFRkRDhHVVFkRHh3QmZreHRMak96czROSksrb3FPaDMyWGdwNnRQWXhDbjlsQ1ZCTTFOSS9zY2JtYkNvbGM0ZS9ldFE3a081WGU2aDIzUndMWlo0TTJRNEwyTm9hUkZZR2kwL2dyb0lUa1FWTEpEakF4Sm1mZUI5WGFuZk1QQWUxMlRYTTdXTFloeS8rbjVKaWZwMTdGaFZESzJCaEhFU0Nod0JNVHVEd1dBaUhBNmY3ZTN0UFF6aHl0Qk9xenNGSWRlM3RiVzkxZFBUdzJQVGduaHZFdXJ5c2JrVGFDY2h2ZGc4UTVpUEpaVGhTMDRiMnZieDFRWTRpRDR6QUIvVytSUjRETWZ5TG94cFJoOCtVaFFEWkhNNTZuNEU3dVFKUVA5RndOOTh2RUQ3SjFqekZ0UlhvcTRkYzJ5Q01sYTR2U2pmdzJiSlEwR3hhREFvWHdlbUJOT0c2ekhVa2hBa0tVTFRuZlhJbytKWk9sajVVTysva09yeGJmeDlLT1NFTE80YkZaRzdZaEFNOGxSSFI0ZmpYK1JiMW5rT2lrUWlDcVE2ZmFzUkh0RUhjVk5zcDM5eU8zSDNDd3JuRVN0eElENnRmNHlPaE53UG4vb0JsbXV3WHpRYWRjWkN1ZjFqS0MvYi9oRmdBSXAzMndzaGpOa3RBQUFBQUVsRlRrU3VRbUNDXCIiLCJtb2R1bGUuZXhwb3J0cyA9IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREkwTGpBdU1pd2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SWt4aGVXVnlYekVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZUcxc2JuTTZlR3hwYm1zOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2ZUd4cGJtc2lJSGc5SWpCd2VDSWdlVDBpTUhCNElnb0pJSFpwWlhkQ2IzZzlJakFnTUNBek1EQWdNekF3SWlCemRIbHNaVDBpWlc1aFlteGxMV0poWTJ0bmNtOTFibVE2Ym1WM0lEQWdNQ0F6TURBZ016QXdPeUlnZUcxc09uTndZV05sUFNKd2NtVnpaWEoyWlNJK0NqeHpkSGxzWlNCMGVYQmxQU0owWlhoMEwyTnpjeUkrQ2drdWMzUXdlMlpwYkd3Nkl6RkRRak01TkR0OUNna3VjM1F4ZTI5d1lXTnBkSGs2TUM0ek8zMEtDUzV6ZERKN1ptbHNiRG9qTURFd01UQXhPMzBLQ1M1emRETjdabWxzYkRvalJrWkdSa1pHTzMwS0NTNXpkRFI3Wm1sc2JEb2pSRFpFTlVRMU8zMEtDUzV6ZERWN2IzQmhZMmwwZVRvd0xqTTdabWxzYkRvak1ERXdNVEF4TzMwS0NTNXpkRFo3Wm1sc2JEb2pSamc1T0RGR08zMEtQQzl6ZEhsc1pUNEtQR05wY21Oc1pTQmpiR0Z6Y3owaWMzUXdJaUJqZUQwaU1UVXdMamswSWlCamVUMGlNVFE1TGpNMUlpQnlQU0l4TXpRdU16TWlMejRLUEdjK0NnazhaejRLQ1FrOFp5QmpiR0Z6Y3owaWMzUXhJajRLQ1FrSlBIQnZiSGxuYjI0Z1kyeGhjM005SW5OME1pSWdjRzlwYm5SelBTSXhNall1T0N3M015QXhNall1T0N3M015QTRPQzQwTkN3M015QTRPQzQwTkN3eU1EZ2dNVGswTGpRMExESXdPQ0F4T1RRdU5EUXNOek1nQ1FrSklpOCtDZ2tKUEM5blBnb0pDVHh5WldOMElIZzlJamt6TGpRMElpQjVQU0kyT0NJZ1kyeGhjM005SW5OME15SWdkMmxrZEdnOUlqRXdOaUlnYUdWcFoyaDBQU0l4TXpVaUx6NEtDUWs4Wno0S0NRa0pQR2MrQ2drSkNRazhaejRLQ1FrSkNRazhjbVZqZENCNFBTSXhNelV1TkRRaUlIazlJakUwTWlJZ1kyeGhjM005SW5OME5DSWdkMmxrZEdnOUlqRTNJaUJvWldsbmFIUTlJalFpTHo0S0NRa0pDVHd2Wno0S0NRa0pDVHhuUGdvSkNRa0pDVHhqYVhKamJHVWdZMnhoYzNNOUluTjBNeUlnWTNnOUlqRXlOQzQ1TmlJZ1kzazlJakUwTXk0Mk5DSWdjajBpTkM0Mk5DSXZQZ29KQ1FrSkNUeHdZWFJvSUdOc1lYTnpQU0p6ZERJaUlHUTlJazB4TWpRdU9ESXNNVFE1TGpNMVl5MHpMakEwTERBdE5TNDFNUzB5TGpRNExUVXVOVEV0TlM0MU1XTXdMVE11TURRc01pNDBPQzAxTGpVeExEVXVOVEV0TlM0MU1XTXpMakEwTERBc05TNDFNU3d5TGpRNExEVXVOVEVzTlM0MU1Rb0pDUWtKQ1FsRE1UTXdMak16TERFME5pNDRPQ3d4TWpjdU9EWXNNVFE1TGpNMUxERXlOQzQ0TWl3eE5Ea3VNelY2SUUweE1qUXVPRElzTVRNNUxqazRZeTB5TGpFekxEQXRNeTQ0Tml3eExqY3pMVE11T0RZc015NDRObk14TGpjekxETXVPRFlzTXk0NE5pd3pMamcyQ2drSkNRa0pDWE16TGpnMkxURXVOek1zTXk0NE5pMHpMamcyUXpFeU9DNDJPQ3d4TkRFdU56RXNNVEkyTGprMUxERXpPUzQ1T0N3eE1qUXVPRElzTVRNNUxqazRlaUl2UGdvSkNRa0pQQzluUGdvSkNRa0pQR2MrQ2drSkNRa0pQR2MrQ2drSkNRa0pDVHhqYVhKamJHVWdZMnhoYzNNOUluTjBNeUlnWTNnOUlqRXlOQzQ0TWlJZ1kzazlJakUwTXk0NE5DSWdjajBpTUM0NE15SXZQZ29KQ1FrSkNUd3ZaejRLQ1FrSkNRazhaejRLQ1FrSkNRa0pQSEJoZEdnZ1kyeGhjM005SW5OME1DSWdaRDBpVFRFeU5DNDRNaXd4TkRNdU9EUk1NVEkwTGpneUxERTBNeTQ0TkV3eE1qUXVPRElzTVRRekxqZzBJRTB4TWpRdU9ESXNNVFF5TGpFNFl5MHdMamt5TERBdE1TNDJOU3d3TGpjMExURXVOalVzTVM0Mk5Rb0pDUWtKQ1FrSll6QXNNQzQ1TWl3d0xqYzBMREV1TmpVc01TNDJOU3d4TGpZMVl6QXVPVElzTUN3eExqWTFMVEF1TnpRc01TNDJOUzB4TGpZMVF6RXlOaTQwTnl3eE5ESXVPVElzTVRJMUxqY3pMREUwTWk0eE9Dd3hNalF1T0RJc01UUXlMakU0VERFeU5DNDRNaXd4TkRJdU1UaDZJaTgrQ2drSkNRa0pQQzluUGdvSkNRa0pQQzluUGdvSkNRazhMMmMrQ2drSkNUeG5QZ29KQ1FrSlBHYytDZ2tKQ1FrSlBISmxZM1FnZUQwaU1UYzBMalEwSWlCNVBTSXhORElpSUdOc1lYTnpQU0p6ZERRaUlIZHBaSFJvUFNJeE55SWdhR1ZwWjJoMFBTSTBJaTgrQ2drSkNRazhMMmMrQ2drSkNRazhaejRLQ1FrSkNRazhZMmx5WTJ4bElHTnNZWE56UFNKemRETWlJR040UFNJeE5qUXVNeklpSUdONVBTSXhORE11TmpRaUlISTlJalF1TmpRaUx6NEtDUWtKQ1FrOGNHRjBhQ0JqYkdGemN6MGljM1F5SWlCa1BTSk5NVFkwTGpJMUxERTBPUzR6TldNdE15NHdOQ3d3TFRVdU5URXRNaTQwT0MwMUxqVXhMVFV1TlRGak1DMHpMakEwTERJdU5EZ3ROUzQxTVN3MUxqVXhMVFV1TlRGak15NHdOQ3d3TERVdU5URXNNaTQwT0N3MUxqVXhMRFV1TlRFS0NRa0pDUWtKUXpFMk9TNDNOeXd4TkRZdU9EZ3NNVFkzTGpNc01UUTVMak0xTERFMk5DNHlOU3d4TkRrdU16VjZJRTB4TmpRdU1qVXNNVE01TGprNFl5MHlMakV6TERBdE15NDROaXd4TGpjekxUTXVPRFlzTXk0NE5uTXhMamN6TERNdU9EWXNNeTQ0Tml3ekxqZzJDZ2tKQ1FrSkNYTXpMamcyTFRFdU56TXNNeTQ0TmkwekxqZzJRekUyT0M0eE1pd3hOREV1TnpFc01UWTJMak01TERFek9TNDVPQ3d4TmpRdU1qVXNNVE01TGprNGVpSXZQZ29KQ1FrSlBDOW5QZ29KQ1FrSlBHYytDZ2tKQ1FrSlBHYytDZ2tKQ1FrSkNUeGphWEpqYkdVZ1kyeGhjM005SW5OME15SWdZM2c5SWpFMk5DNHlOU0lnWTNrOUlqRTBNeTQ0TkNJZ2NqMGlNQzQ0TXlJdlBnb0pDUWtKQ1R3dlp6NEtDUWtKQ1FrOFp6NEtDUWtKQ1FrSlBIQmhkR2dnWTJ4aGMzTTlJbk4wTUNJZ1pEMGlUVEUyTkM0eU5Td3hORE11T0RSTU1UWTBMakkxTERFME15NDRORXd4TmpRdU1qVXNNVFF6TGpnMElFMHhOalF1TWpVc01UUXlMakU0WXkwd0xqa3lMREF0TVM0Mk5Td3dMamMwTFRFdU5qVXNNUzQyTlFvSkNRa0pDUWtKWXpBc01DNDVNaXd3TGpjMExERXVOalVzTVM0Mk5Td3hMalkxWXpBdU9USXNNQ3d4TGpZMUxUQXVOelFzTVM0Mk5TMHhMalkxUXpFMk5TNDVNU3d4TkRJdU9USXNNVFkxTGpFM0xERTBNaTR4T0N3eE5qUXVNalVzTVRReUxqRTRUREUyTkM0eU5Td3hOREl1TVRoNklpOCtDZ2tKQ1FrSlBDOW5QZ29KQ1FrSlBDOW5QZ29KQ1FrOEwyYytDZ2tKQ1R4blBnb0pDUWtKUEdjK0Nna0pDUWtKUEhKbFkzUWdlRDBpTVRjMExqUTBJaUI1UFNJeE5UY2lJR05zWVhOelBTSnpkRFFpSUhkcFpIUm9QU0l4TnlJZ2FHVnBaMmgwUFNJMElpOCtDZ2tKQ1FrOEwyYytDZ2tKQ1FrOFp6NEtDUWtKQ1FrOFkybHlZMnhsSUdOc1lYTnpQU0p6ZERNaUlHTjRQU0l4TmpRdU16SWlJR041UFNJeE5Ua3VNVEVpSUhJOUlqUXVOalFpTHo0S0NRa0pDUWs4Y0dGMGFDQmpiR0Z6Y3owaWMzUXlJaUJrUFNKTk1UWTBMakkxTERFMk5DNDRZeTB6TGpBMExEQXROUzQxTVMweUxqUTRMVFV1TlRFdE5TNDFNV013TFRNdU1EUXNNaTQwT0MwMUxqVXhMRFV1TlRFdE5TNDFNV016TGpBMExEQXNOUzQxTVN3eUxqUTRMRFV1TlRFc05TNDFNUW9KQ1FrSkNRbFRNVFkzTGpNc01UWTBMamdzTVRZMExqSTFMREUyTkM0NGVpQk5NVFkwTGpJMUxERTFOUzQwTW1NdE1pNHhNeXd3TFRNdU9EWXNNUzQzTXkwekxqZzJMRE11T0Raek1TNDNNeXd6TGpnMkxETXVPRFlzTXk0NE5uTXpMamcyTFRFdU56TXNNeTQ0TmkwekxqZzJDZ2tKQ1FrSkNVTXhOamd1TVRJc01UVTNMakUxTERFMk5pNHpPU3d4TlRVdU5ESXNNVFkwTGpJMUxERTFOUzQwTW5vaUx6NEtDUWtKQ1R3dlp6NEtDUWtKQ1R4blBnb0pDUWtKQ1R4blBnb0pDUWtKQ1FrOFkybHlZMnhsSUdOc1lYTnpQU0p6ZERNaUlHTjRQU0l4TmpRdU1qVWlJR041UFNJeE5Ua3VNamdpSUhJOUlqQXVPRE1pTHo0S0NRa0pDUWs4TDJjK0Nna0pDUWtKUEdjK0Nna0pDUWtKQ1R4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHhOalF1TWpVc01UVTVMakk0VERFMk5DNHlOU3d4TlRrdU1qaE1NVFkwTGpJMUxERTFPUzR5T0NCTk1UWTBMakkxTERFMU55NDJNbU10TUM0NU1pd3dMVEV1TmpVc01DNDNOQzB4TGpZMUxERXVOalVLQ1FrSkNRa0pDV013TERBdU9USXNNQzQzTkN3eExqWTFMREV1TmpVc01TNDJOV013TGpreUxEQXNNUzQyTlMwd0xqYzBMREV1TmpVdE1TNDJOVU14TmpVdU9URXNNVFU0TGpNM0xERTJOUzR4Tnl3eE5UY3VOaklzTVRZMExqSTFMREUxTnk0Mk1rd3hOalF1TWpVc01UVTNMall5ZWlJdlBnb0pDUWtKQ1R3dlp6NEtDUWtKQ1R3dlp6NEtDUWtKUEM5blBnb0pDUWs4Wno0S0NRa0pDVHhuUGdvSkNRa0pDVHh5WldOMElIZzlJakV6TlM0ME5DSWdlVDBpTVRVM0lpQmpiR0Z6Y3owaWMzUTBJaUIzYVdSMGFEMGlNVGNpSUdobGFXZG9kRDBpTkNJdlBnb0pDUWtKUEM5blBnb0pDUWtKUEdjK0Nna0pDUWtKUEdOcGNtTnNaU0JqYkdGemN6MGljM1F6SWlCamVEMGlNVEkwTGprMklpQmplVDBpTVRVNUxqRXhJaUJ5UFNJMExqWTBJaTgrQ2drSkNRa0pQSEJoZEdnZ1kyeGhjM005SW5OME1pSWdaRDBpVFRFeU5DNDRNaXd4TmpRdU9HTXRNeTR3TkN3d0xUVXVOVEV0TWk0ME9DMDFMalV4TFRVdU5URmpNQzB6TGpBMExESXVORGd0TlM0MU1TdzFMalV4TFRVdU5URmpNeTR3TkN3d0xEVXVOVEVzTWk0ME9DdzFMalV4TERVdU5URUtDUWtKQ1FrSlF6RXpNQzR6TXl3eE5qSXVNeklzTVRJM0xqZzJMREUyTkM0NExERXlOQzQ0TWl3eE5qUXVPSG9nVFRFeU5DNDRNaXd4TlRVdU5ESmpMVEl1TVRNc01DMHpMamcyTERFdU56TXRNeTQ0Tml3ekxqZzJjekV1TnpNc015NDROaXd6TGpnMkxETXVPRFlLQ1FrSkNRa0pjek11T0RZdE1TNDNNeXd6TGpnMkxUTXVPRFpETVRJNExqWTRMREUxTnk0eE5Td3hNall1T1RVc01UVTFMalF5TERFeU5DNDRNaXd4TlRVdU5ESjZJaTgrQ2drSkNRazhMMmMrQ2drSkNRazhaejRLQ1FrSkNRazhaejRLQ1FrSkNRa0pQR05wY21Oc1pTQmpiR0Z6Y3owaWMzUXpJaUJqZUQwaU1USTBMamd5SWlCamVUMGlNVFU1TGpJNElpQnlQU0l3TGpneklpOCtDZ2tKQ1FrSlBDOW5QZ29KQ1FrSkNUeG5QZ29KQ1FrSkNRazhjR0YwYUNCamJHRnpjejBpYzNRd0lpQmtQU0pOTVRJMExqZ3lMREUxT1M0eU9Fd3hNalF1T0RJc01UVTVMakk0VERFeU5DNDRNaXd4TlRrdU1qZ2dUVEV5TkM0NE1pd3hOVGN1TmpKakxUQXVPVElzTUMweExqWTFMREF1TnpRdE1TNDJOU3d4TGpZMUNna0pDUWtKQ1Fsak1Dd3dMamt5TERBdU56UXNNUzQyTlN3eExqWTFMREV1TmpWak1DNDVNaXd3TERFdU5qVXRNQzQzTkN3eExqWTFMVEV1TmpWVE1USTFMamN6TERFMU55NDJNaXd4TWpRdU9ESXNNVFUzTGpZeVRERXlOQzQ0TWl3eE5UY3VOako2SWk4K0Nna0pDUWtKUEM5blBnb0pDUWtKUEM5blBnb0pDUWs4TDJjK0Nna0pQQzluUGdvSkNUeG5QZ29KQ1FrOFp6NEtDUWtKQ1R4blBnb0pDUWtKQ1R4eVpXTjBJSGc5SWpFeU1DNDBOQ0lnZVQwaU9ETWlJR05zWVhOelBTSnpkRE1pSUhkcFpIUm9QU0k1SWlCb1pXbG5hSFE5SWpraUx6NEtDUWtKQ1FrOGNHRjBhQ0JqYkdGemN6MGljM1F5SWlCa1BTSk5NVEk1TGpRMExEZzBkamhvTFRoMkxUaElNVEk1TGpRMElFMHhNekV1TkRRc09ESm9MVEV5ZGpFeWFERXlWamd5VERFek1TNDBOQ3c0TW5vaUx6NEtDUWtKQ1R3dlp6NEtDUWtKQ1R4eVpXTjBJSGc5SWpFek55NDBOQ0lnZVQwaU9ESWlJR05zWVhOelBTSnpkRFFpSUhkcFpIUm9QU0kxTkNJZ2FHVnBaMmgwUFNJMElpOCtDZ2tKQ1FrOGNtVmpkQ0I0UFNJeE16Y3VORFFpSUhrOUlqa3dJaUJqYkdGemN6MGljM1EwSWlCM2FXUjBhRDBpTlRRaUlHaGxhV2RvZEQwaU5DSXZQZ29KQ1FrSlBIQnZiSGxuYjI0Z1kyeGhjM005SW5OME1DSWdjRzlwYm5SelBTSXhNekl1TVRFc09EUXVOelVnTVRNeUxqRXhMRGcwTGpjMUlERXpNUzR4TXl3NE15NDNPQ0F4TWpZdU1UY3NPRGd1TnpRZ01USXpMamcyTERnMkxqUXlJREV5TWk0NE9DdzROeTR6T1NBeE1qWXVNVGNzT1RBdU5qa2dDUWtKQ1FvSkNRa0pDU0l2UGdvSkNRa0pQR2MrQ2drSkNRa0pQSEpsWTNRZ2VEMGlNVEl3TGpRMElpQjVQU0l4TURBaUlHTnNZWE56UFNKemRETWlJSGRwWkhSb1BTSTVJaUJvWldsbmFIUTlJamtpTHo0S0NRa0pDUWs4Y0dGMGFDQmpiR0Z6Y3owaWMzUXlJaUJrUFNKTk1USTVMalEwTERFd01YWTRhQzA0ZGkwNFNERXlPUzQwTkNCTk1UTXhMalEwTERrNWFDMHhNbll4TW1neE1sWTVPVXd4TXpFdU5EUXNPVGw2SWk4K0Nna0pDUWs4TDJjK0Nna0pDUWs4Y0c5c2VXZHZiaUJqYkdGemN6MGljM1F3SWlCd2IybHVkSE05SWpFek1pNHhNU3d4TURFdU56VWdNVE15TGpFeExERXdNUzQzTlNBeE16RXVNVE1zTVRBd0xqYzRJREV5Tmk0eE55d3hNRFV1TnpRZ01USXpMamcyTERFd015NDBNaUF4TWpJdU9EZ3NNVEEwTGpNNUlBb0pDUWtKQ1RFeU5pNHhOeXd4TURjdU5qa2dDUWtKQ1NJdlBnb0pDUWtKUEdjK0Nna0pDUWtKUEhKbFkzUWdlRDBpTVRJd0xqUTBJaUI1UFNJeE1UY2lJR05zWVhOelBTSnpkRE1pSUhkcFpIUm9QU0k1SWlCb1pXbG5hSFE5SWpraUx6NEtDUWtKQ1FrOGNHRjBhQ0JqYkdGemN6MGljM1F5SWlCa1BTSk5NVEk1TGpRMExERXhPSFk0YUMwNGRpMDRTREV5T1M0ME5DQk5NVE14TGpRMExERXhObWd0TVRKMk1USm9NVEpXTVRFMlRERXpNUzQwTkN3eE1UWjZJaTgrQ2drSkNRazhMMmMrQ2drSkNRazhjRzlzZVdkdmJpQmpiR0Z6Y3owaWMzUXdJaUJ3YjJsdWRITTlJakV6TWk0eE1Td3hNVGd1TnpVZ01UTXlMakV4TERFeE9DNDNOU0F4TXpFdU1UTXNNVEUzTGpjNElERXlOaTR4Tnl3eE1qSXVOelFnTVRJekxqZzJMREV5TUM0ME1pQXhNakl1T0Rnc01USXhMak01SUFvSkNRa0pDVEV5Tmk0eE55d3hNalF1TmprZ0NRa0pDU0l2UGdvSkNRa0pQR2MrQ2drSkNRa0pQSEpsWTNRZ2VEMGlNVE0zTGpRMElpQjVQU0l4TURNaUlHTnNZWE56UFNKemREUWlJSGRwWkhSb1BTSTFOQ0lnYUdWcFoyaDBQU0kwSWk4K0Nna0pDUWs4TDJjK0Nna0pDUWs4Wno0S0NRa0pDUWs4Y21WamRDQjRQU0l4TXpjdU5EUWlJSGs5SWpFeE5pSWdZMnhoYzNNOUluTjBOQ0lnZDJsa2RHZzlJalUwSWlCb1pXbG5hSFE5SWpRaUx6NEtDUWtKQ1FrOGNtVmpkQ0I0UFNJeE16Y3VORFFpSUhrOUlqRXlOQ0lnWTJ4aGMzTTlJbk4wTkNJZ2QybGtkR2c5SWpJM0lpQm9aV2xuYUhROUlqUWlMejRLQ1FrSkNUd3ZaejRLQ1FrSlBDOW5QZ29KQ1R3dlp6NEtDUWs4Wno0S0NRa0pQSEJoZEdnZ1kyeGhjM005SW5OME5DSWdaRDBpVFRFd05DNDBOQ3c1TTJndE1uWXRPQzR4WXkwd0xqZzFMREF1TnpNdE1TNDROU3d4TGpJNExUTXNNUzQyTTNZdE1TNDNOV013TGpVM0xUQXVNVGdzTVM0eE9TMHdMalV5TERFdU9EWXRNUzR3TWdvSkNRa0pZekF1TmpjdE1DNDFMREV1TVRNdE1TNHdPQ3d4TGpNM0xURXVOelZvTVM0M04xWTVNM29pTHo0S0NRa0pQSEJoZEdnZ1kyeGhjM005SW5OME5DSWdaRDBpVFRFd09DNDBOQ3c1TTNZdE1tZ3lkakpJTVRBNExqUTBlaUl2UGdvSkNUd3ZaejRLQ1FrOFp6NEtDUWtKUEhCaGRHZ2dZMnhoYzNNOUluTjBOQ0lnWkQwaVRURXdOaTQwTkN3eE5EZDJNa2c1T0M0NVl6QXVNRGd0TUM0M05pd3dMak16TFRFdU5EY3NNQzQzTkMweUxqRTFZekF1TkRFdE1DNDJPQ3d4TGpJeUxURXVOVGNzTWk0ME1pMHlMalk1Q2drSkNRbGpNQzQ1Tnkwd0xqa3NNUzQxTnkweExqVXlMREV1TnprdE1TNDROR013TGpNdE1DNDBOQ3d3TGpRMExUQXVPRGdzTUM0ME5DMHhMak15WXpBdE1DNDBPQzB3TGpFekxUQXVPRFV0TUM0ek9TMHhMakV4WXkwd0xqSTJMVEF1TWpZdE1DNDJNUzB3TGpNNUxURXVNRGN0TUM0ek9Rb0pDUWtKWXkwd0xqUTFMREF0TUM0NE1Td3dMakUwTFRFdU1EY3NNQzQwTVdNdE1DNHlOeXd3TGpJM0xUQXVORElzTUM0M01pMHdMalEyTERFdU16VnNMVEl1TVRVdE1DNHlNV013TGpFekxURXVNVGtzTUM0MU15MHlMakEwTERFdU1pMHlMalUxQ2drSkNRbGpNQzQyTnkwd0xqVXlMREV1TlRJdE1DNDNOeXd5TGpVekxUQXVOemRqTVM0eE1Td3dMREV1T1Rnc01DNHpMREl1TmpFc01DNDVZekF1TmpNc01DNDJMREF1T1RVc01TNHpOQ3d3TGprMUxESXVNak5qTUN3d0xqVXhMVEF1TURrc01DNDVPUzB3TGpJM0xERXVORFFLQ1FrSkNXTXRNQzR4T0N3d0xqUTJMVEF1TkRjc01DNDVOQzB3TGpnMkxERXVORFJqTFRBdU1qWXNNQzR6TXkwd0xqY3pMREF1T0RFdE1TNDBNU3d4TGpRell5MHdMalk0TERBdU5qSXRNUzR4TVN3eExqQTBMVEV1TWprc01TNHlOR010TUM0eE9Dd3dMakl0TUM0ek15d3dMalF0TUM0ME5Dd3dMallLQ1FrSkNVZ3hNRFl1TkRSNklpOCtDZ2tKQ1R4d1lYUm9JR05zWVhOelBTSnpkRFFpSUdROUlrMHhNRGd1TkRRc01UUTVkaTB5YURKMk1rZ3hNRGd1TkRSNklpOCtDZ2tKUEM5blBnb0pDVHhuUGdvSkNRazhjR0YwYUNCamJHRnpjejBpYzNRMElpQmtQU0pOT1RndU9ETXNNVGcxTGpJeGJESXVNRGd0TUM0eU5XTXdMakEzTERBdU5UTXNNQzR5TkN3d0xqazBMREF1TlRRc01TNHlNbU13TGpJNUxEQXVNamdzTUM0Mk5Dd3dMalF5TERFdU1EWXNNQzQwTWdvSkNRa0pZekF1TkRRc01Dd3dMamd5TFRBdU1UY3NNUzR4TWkwd0xqVmpNQzR6TFRBdU16UXNNQzQwTmkwd0xqYzVMREF1TkRZdE1TNHpObU13TFRBdU5UUXRNQzR4TlMwd0xqazNMVEF1TkRRdE1TNHlPV010TUM0eU9TMHdMak15TFRBdU5qVXRNQzQwTnkweExqQTJMVEF1TkRjS0NRa0pDV010TUM0eU9Dd3dMVEF1Tml3d0xqQTFMVEF1T1Rrc01DNHhObXd3TGpJMExURXVOelZqTUM0MU9Dd3dMakF5TERFdU1ETXRNQzR4TVN3eExqTXpMVEF1TXpoak1DNHpNUzB3TGpJM0xEQXVORFl0TUM0Mk1pd3dMalEyTFRFdU1EZGpNQzB3TGpNNExUQXVNVEV0TUM0Mk9DMHdMak0wTFRBdU9Rb0pDUWtKWXkwd0xqSXlMVEF1TWpJdE1DNDFNaTB3TGpNMExUQXVPUzB3TGpNMFl5MHdMak0zTERBdE1DNDJPQ3d3TGpFekxUQXVPVFFzTUM0ek9HTXRNQzR5Tml3d0xqSTJMVEF1TkRJc01DNDJNeTB3TGpRM0xERXVNVEpzTFRFdU9UZ3RNQzR6TkFvSkNRa0pZekF1TVRRdE1DNDJPQ3d3TGpNMUxURXVNaklzTUM0Mk1pMHhMall6WXpBdU1qZ3RNQzQwTVN3d0xqWTNMVEF1TnpJc01TNHhOaTB3TGprMll6QXVOUzB3TGpJekxERXVNRFV0TUM0ek5Td3hMalkzTFRBdU16VmpNUzR3Tml3d0xERXVPU3d3TGpNMExESXVOVFFzTVM0d01Rb0pDUWtKWXpBdU5UTXNNQzQxTlN3d0xqYzVMREV1TVRjc01DNDNPU3d4TGpnM1l6QXNNQzQ1T0Mwd0xqVTBMREV1TnpjdE1TNDJNU3d5TGpNMll6QXVOalFzTUM0eE5Dd3hMakUyTERBdU5EVXNNUzQxTkN3d0xqa3pZekF1TXprc01DNDBPQ3d3TGpVNExERXVNRFlzTUM0MU9Dd3hMamMwQ2drSkNRbGpNQ3d3TGprNExUQXVNellzTVM0NE1pMHhMakE0TERJdU5USmpMVEF1TnpJc01DNDJPUzB4TGpZeExERXVNRFF0TWk0Mk9Td3hMakEwWXkweExqQXlMREF0TVM0NE5pMHdMakk1TFRJdU5UTXRNQzQ0T0ZNNU9DNDVOQ3d4T0RZdU1UWXNPVGd1T0RNc01UZzFMakl4ZWlJdlBnb0pDUWs4Y0dGMGFDQmpiR0Z6Y3owaWMzUTBJaUJrUFNKTk1UQTRMalEwTERFNE9IWXRNbWd5ZGpKSU1UQTRMalEwZWlJdlBnb0pDVHd2Wno0S0NRazhjbVZqZENCNFBTSXhNVGt1TkRRaUlIazlJakUzTnlJZ1kyeGhjM005SW5OME5DSWdkMmxrZEdnOUlqY3lJaUJvWldsbmFIUTlJakV4SWk4K0Nna0pQR05wY21Oc1pTQmpiR0Z6Y3owaWMzUTFJaUJqZUQwaU1UazRMallpSUdONVBTSXlNRFl1TWpRaUlISTlJak0xTGpFMUlpOCtDZ2tKUEdjK0Nna0pDVHhqYVhKamJHVWdZMnhoYzNNOUluTjBOaUlnWTNnOUlqSXdNeTQwTkNJZ1kzazlJakl3TXlJZ2NqMGlNelVpTHo0S0NRa0pQSEJoZEdnZ1kyeGhjM005SW5OME15SWdaRDBpVFRJd015NDBOQ3d5TWpaTU1qQXpMalEwTERJeU5tTXRNaTR5TERBdE5DMHhMamd0TkMwMGRpMHpPR013TFRJdU1pd3hMamd0TkN3MExUUnNNQ3d3WXpJdU1pd3dMRFFzTVM0NExEUXNOSFl6T0FvSkNRa0pRekl3Tnk0ME5Dd3lNalF1TWl3eU1EVXVOalFzTWpJMkxESXdNeTQwTkN3eU1qWjZJaTgrQ2drSkNUeHdZWFJvSUdOc1lYTnpQU0p6ZERNaUlHUTlJazB4T0RBdU5EUXNNakF6VERFNE1DNDBOQ3d5TUROak1DMHlMaklzTVM0NExUUXNOQzAwYURNNFl6SXVNaXd3TERRc01TNDRMRFFzTkd3d0xEQmpNQ3d5TGpJdE1TNDRMRFF0TkN3MGFDMHpPQW9KQ1FrSlF6RTRNaTR5TkN3eU1EY3NNVGd3TGpRMExESXdOUzR5TERFNE1DNDBOQ3d5TURONklpOCtDZ2tKUEM5blBnb0pQQzluUGdvOEwyYytDand2YzNablBnbz1cIiIsIi8vIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBKU09ONSwgaHR0cDovL2pzb241Lm9yZy9cbi8vIFRoZSBtb2RpZmljYXRpb24gZm9yIGdldHRpbmcgb2JqZWN0IGFuZCBwcm9wZXJ0aWVzIGxvY2F0aW9uICdhdCcgd2VyZSBtYWRlbi5cblxuZXhwb3J0IGNsYXNzIFN1cnZleUpTT041IHtcbiAgcHVibGljIHN0YXRpYyBwb3NpdGlvbk5hbWUgPSBcInBvc1wiO1xuICBwcml2YXRlIHN0YXRpYyBlc2NhcGVlID0ge1xuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXCInOiAnXCInLFxuICAgIFwiXFxcXFwiOiBcIlxcXFxcIixcbiAgICBcIi9cIjogXCIvXCIsXG4gICAgXCJcXG5cIjogXCJcIiwgLy8gUmVwbGFjZSBlc2NhcGVkIG5ld2xpbmVzIGluIHN0cmluZ3Mgdy8gZW1wdHkgc3RyaW5nXG4gICAgYjogXCJcXGJcIixcbiAgICBmOiBcIlxcZlwiLFxuICAgIG46IFwiXFxuXCIsXG4gICAgcjogXCJcXHJcIixcbiAgICB0OiBcIlxcdFwiXG4gIH07XG4gIHByaXZhdGUgc3RhdGljIHdzID0gW1wiIFwiLCBcIlxcdFwiLCBcIlxcclwiLCBcIlxcblwiLCBcIlxcdlwiLCBcIlxcZlwiLCBcIlxceEEwXCIsIFwiXFx1RkVGRlwiXTtcbiAgcHJpdmF0ZSBlbmRBdDogbnVtYmVyO1xuICBwcml2YXRlIGF0OiBudW1iZXI7IC8vIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjaGFyYWN0ZXJcbiAgcHJpdmF0ZSBjaDogYW55OyAvLyBUaGUgY3VycmVudCBjaGFyYWN0ZXJcbiAgcHJpdmF0ZSB0ZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgcGFyc2VUeXBlOiBudW1iZXI7IC8vIDAgLSBzdGFkYXJkLCAxIC0gZ2V0IGluZm9ybWF0aW9uIGFib3V0IG9iamVjdHMsIDIgLSBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHByb3BlcnRpZXNcbiAgY29uc3RydWN0b3IocGFyc2VUeXBlOiBudW1iZXIgPSAwKSB7XG4gICAgdGhpcy5wYXJzZVR5cGUgPSBwYXJzZVR5cGU7XG4gIH1cbiAgcHVibGljIHBhcnNlKFxuICAgIHNvdXJjZTogYW55LFxuICAgIHJldml2ZXI6IGFueSA9IG51bGwsXG4gICAgc3RhcnRGcm9tOiBudW1iZXIgPSAwLFxuICAgIGVuZEF0OiBudW1iZXIgPSAtMVxuICApOiBhbnkge1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICB0aGlzLnRleHQgPSBTdHJpbmcoc291cmNlKTtcbiAgICB0aGlzLmF0ID0gc3RhcnRGcm9tO1xuICAgIHRoaXMuZW5kQXQgPSBlbmRBdDtcbiAgICB0aGlzLmNoID0gXCIgXCI7XG4gICAgcmVzdWx0ID0gdGhpcy52YWx1ZSgpO1xuICAgIHRoaXMud2hpdGUoKTtcbiAgICBpZiAodGhpcy5jaCkge1xuICAgICAgdGhpcy5lcnJvcihcIlN5bnRheCBlcnJvclwiKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIHJldml2ZXIgZnVuY3Rpb24sIHdlIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlIG5ldyBzdHJ1Y3R1cmUsXG4gICAgLy8gcGFzc2luZyBlYWNoIG5hbWUvdmFsdWUgcGFpciB0byB0aGUgcmV2aXZlciBmdW5jdGlvbiBmb3IgcG9zc2libGVcbiAgICAvLyB0cmFuc2Zvcm1hdGlvbiwgc3RhcnRpbmcgd2l0aCBhIHRlbXBvcmFyeSByb290IG9iamVjdCB0aGF0IGhvbGRzIHRoZSByZXN1bHRcbiAgICAvLyBpbiBhbiBlbXB0eSBrZXkuIElmIHRoZXJlIGlzIG5vdCBhIHJldml2ZXIgZnVuY3Rpb24sIHdlIHNpbXBseSByZXR1cm4gdGhlXG4gICAgLy8gcmVzdWx0LlxuXG4gICAgcmV0dXJuIHR5cGVvZiByZXZpdmVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bmN0aW9uIHdhbGsoaG9sZGVyLCBrZXkpIHtcbiAgICAgICAgICB2YXIgayxcbiAgICAgICAgICAgIHYsXG4gICAgICAgICAgICB2YWx1ZSA9IGhvbGRlcltrZXldO1xuICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGZvciAoayBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrKSkge1xuICAgICAgICAgICAgICAgIHYgPSB3YWxrKHZhbHVlLCBrKTtcbiAgICAgICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZVtrXSA9IHY7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJldml2ZXIuY2FsbChob2xkZXIsIGtleSwgdmFsdWUpO1xuICAgICAgICB9KSh7IFwiXCI6IHJlc3VsdCB9LCBcIlwiKVxuICAgICAgOiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBlcnJvcihtOiBzdHJpbmcpIHtcbiAgICAvLyBDYWxsIGVycm9yIHdoZW4gc29tZXRoaW5nIGlzIHdyb25nLlxuICAgIHZhciBlcnJvciA9IG5ldyBTeW50YXhFcnJvcigpO1xuICAgIGVycm9yLm1lc3NhZ2UgPSBtO1xuICAgIGVycm9yW1wiYXRcIl0gPSB0aGlzLmF0O1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIHByaXZhdGUgbmV4dChjOiBhbnkgPSBudWxsKSB7XG4gICAgLy8gSWYgYSBjIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgdmVyaWZ5IHRoYXQgaXQgbWF0Y2hlcyB0aGUgY3VycmVudCBjaGFyYWN0ZXIuXG4gICAgaWYgKGMgJiYgYyAhPT0gdGhpcy5jaCkge1xuICAgICAgdGhpcy5lcnJvcihcIkV4cGVjdGVkICdcIiArIGMgKyBcIicgaW5zdGVhZCBvZiAnXCIgKyB0aGlzLmNoICsgXCInXCIpO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIHRoaXMubmV4dCBjaGFyYWN0ZXIuIFdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgY2hhcmFjdGVycyxcbiAgICAvLyByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy5cbiAgICB0aGlzLmNoID0gdGhpcy5jaGFydEF0KCk7XG4gICAgdGhpcy5hdCArPSAxO1xuICAgIHJldHVybiB0aGlzLmNoO1xuICB9XG4gIHByaXZhdGUgcGVlaygpIHtcbiAgICAvLyBHZXQgdGhlIHRoaXMubmV4dCBjaGFyYWN0ZXIgd2l0aG91dCBjb25zdW1pbmcgaXQgb3JcbiAgICAvLyBhc3NpZ25pbmcgaXQgdG8gdGhlIHRoaXMuY2ggdmFyYWlibGUuXG4gICAgcmV0dXJuIHRoaXMuY2hhcnRBdCgpO1xuICB9XG4gIHByaXZhdGUgY2hhcnRBdCgpIHtcbiAgICBpZiAodGhpcy5lbmRBdCA+IC0xICYmIHRoaXMuYXQgPj0gdGhpcy5lbmRBdCkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHRoaXMudGV4dC5jaGFyQXQodGhpcy5hdCk7XG4gIH1cbiAgcHJpdmF0ZSBpZGVudGlmaWVyKCkge1xuICAgIC8vIFBhcnNlIGFuIGlkZW50aWZpZXIuIE5vcm1hbGx5LCByZXNlcnZlZCB3b3JkcyBhcmUgZGlzYWxsb3dlZCBoZXJlLCBidXQgd2VcbiAgICAvLyBvbmx5IHVzZSB0aGlzIGZvciB1bnF1b3RlZCBvYmplY3Qga2V5cywgd2hlcmUgcmVzZXJ2ZWQgd29yZHMgYXJlIGFsbG93ZWQsXG4gICAgLy8gc28gd2UgZG9uJ3QgY2hlY2sgZm9yIHRob3NlIGhlcmUuIFJlZmVyZW5jZXM6XG4gICAgLy8gLSBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3g3LjZcbiAgICAvLyAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfR3VpZGUvQ29yZV9MYW5ndWFnZV9GZWF0dXJlcyNWYXJpYWJsZXNcbiAgICAvLyAtIGh0dHA6Ly9kb2NzdG9yZS5taWsudWEvb3JlbGx5L3dlYnByb2cvanNjcmlwdC9jaDAyXzA3Lmh0bVxuICAgIC8vIFRPRE8gSWRlbnRpZmllcnMgY2FuIGhhdmUgVW5pY29kZSBcImxldHRlcnNcIiBpbiB0aGVtOyBhZGQgc3VwcG9ydCBmb3IgdGhvc2UuXG4gICAgdmFyIGtleSA9IHRoaXMuY2g7XG5cbiAgICAvLyBJZGVudGlmaWVycyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIF8gb3IgJC5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNoICE9PSBcIl9cIiAmJlxuICAgICAgdGhpcy5jaCAhPT0gXCIkXCIgJiZcbiAgICAgICh0aGlzLmNoIDwgXCJhXCIgfHwgdGhpcy5jaCA+IFwielwiKSAmJlxuICAgICAgKHRoaXMuY2ggPCBcIkFcIiB8fCB0aGlzLmNoID4gXCJaXCIpXG4gICAgKSB7XG4gICAgICB0aGlzLmVycm9yKFwiQmFkIGlkZW50aWZpZXJcIik7XG4gICAgfVxuXG4gICAgLy8gU3Vic2VxdWVudCBjaGFyYWN0ZXJzIGNhbiBjb250YWluIGRpZ2l0cy5cbiAgICB3aGlsZSAoXG4gICAgICB0aGlzLm5leHQoKSAmJlxuICAgICAgKHRoaXMuY2ggPT09IFwiX1wiIHx8XG4gICAgICAgIHRoaXMuY2ggPT09IFwiJFwiIHx8XG4gICAgICAgICh0aGlzLmNoID49IFwiYVwiICYmIHRoaXMuY2ggPD0gXCJ6XCIpIHx8XG4gICAgICAgICh0aGlzLmNoID49IFwiQVwiICYmIHRoaXMuY2ggPD0gXCJaXCIpIHx8XG4gICAgICAgICh0aGlzLmNoID49IFwiMFwiICYmIHRoaXMuY2ggPD0gXCI5XCIpKVxuICAgICkge1xuICAgICAga2V5ICs9IHRoaXMuY2g7XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleTtcbiAgfVxuICBwcml2YXRlIG51bWJlcigpIHtcbiAgICAvLyBQYXJzZSBhIG51bWJlciB2YWx1ZS5cblxuICAgIHZhciBudW1iZXIsXG4gICAgICBzaWduID0gXCJcIixcbiAgICAgIHN0cmluZyA9IFwiXCIsXG4gICAgICBiYXNlID0gMTA7XG5cbiAgICBpZiAodGhpcy5jaCA9PT0gXCItXCIgfHwgdGhpcy5jaCA9PT0gXCIrXCIpIHtcbiAgICAgIHNpZ24gPSB0aGlzLmNoO1xuICAgICAgdGhpcy5uZXh0KHRoaXMuY2gpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnQgZm9yIEluZmluaXR5IChjb3VsZCB0d2VhayB0byBhbGxvdyBvdGhlciB3b3Jkcyk6XG4gICAgaWYgKHRoaXMuY2ggPT09IFwiSVwiKSB7XG4gICAgICBudW1iZXIgPSB0aGlzLndvcmQoKTtcbiAgICAgIGlmICh0eXBlb2YgbnVtYmVyICE9PSBcIm51bWJlclwiIHx8IGlzTmFOKG51bWJlcikpIHtcbiAgICAgICAgdGhpcy5lcnJvcihcIlVuZXhwZWN0ZWQgd29yZCBmb3IgbnVtYmVyXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNpZ24gPT09IFwiLVwiID8gLW51bWJlciA6IG51bWJlcjtcbiAgICB9XG5cbiAgICAvLyBzdXBwb3J0IGZvciBOYU5cbiAgICBpZiAodGhpcy5jaCA9PT0gXCJOXCIpIHtcbiAgICAgIG51bWJlciA9IHRoaXMud29yZCgpO1xuICAgICAgaWYgKCFpc05hTihudW1iZXIpKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoXCJleHBlY3RlZCB3b3JkIHRvIGJlIE5hTlwiKTtcbiAgICAgIH1cbiAgICAgIC8vIGlnbm9yZSBzaWduIGFzIC1OYU4gYWxzbyBpcyBOYU5cbiAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2ggPT09IFwiMFwiKSB7XG4gICAgICBzdHJpbmcgKz0gdGhpcy5jaDtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgaWYgKHRoaXMuY2ggPT09IFwieFwiIHx8IHRoaXMuY2ggPT09IFwiWFwiKSB7XG4gICAgICAgIHN0cmluZyArPSB0aGlzLmNoO1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgYmFzZSA9IDE2O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNoID49IFwiMFwiICYmIHRoaXMuY2ggPD0gXCI5XCIpIHtcbiAgICAgICAgdGhpcy5lcnJvcihcIk9jdGFsIGxpdGVyYWxcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChiYXNlKSB7XG4gICAgICBjYXNlIDEwOlxuICAgICAgICB3aGlsZSAodGhpcy5jaCA+PSBcIjBcIiAmJiB0aGlzLmNoIDw9IFwiOVwiKSB7XG4gICAgICAgICAgc3RyaW5nICs9IHRoaXMuY2g7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2ggPT09IFwiLlwiKSB7XG4gICAgICAgICAgc3RyaW5nICs9IFwiLlwiO1xuICAgICAgICAgIHdoaWxlICh0aGlzLm5leHQoKSAmJiB0aGlzLmNoID49IFwiMFwiICYmIHRoaXMuY2ggPD0gXCI5XCIpIHtcbiAgICAgICAgICAgIHN0cmluZyArPSB0aGlzLmNoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaCA9PT0gXCJlXCIgfHwgdGhpcy5jaCA9PT0gXCJFXCIpIHtcbiAgICAgICAgICBzdHJpbmcgKz0gdGhpcy5jaDtcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICBpZiAodGhpcy5jaCA9PT0gXCItXCIgfHwgdGhpcy5jaCA9PT0gXCIrXCIpIHtcbiAgICAgICAgICAgIHN0cmluZyArPSB0aGlzLmNoO1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0aGlzLmNoID49IFwiMFwiICYmIHRoaXMuY2ggPD0gXCI5XCIpIHtcbiAgICAgICAgICAgIHN0cmluZyArPSB0aGlzLmNoO1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNjpcbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICh0aGlzLmNoID49IFwiMFwiICYmIHRoaXMuY2ggPD0gXCI5XCIpIHx8XG4gICAgICAgICAgKHRoaXMuY2ggPj0gXCJBXCIgJiYgdGhpcy5jaCA8PSBcIkZcIikgfHxcbiAgICAgICAgICAodGhpcy5jaCA+PSBcImFcIiAmJiB0aGlzLmNoIDw9IFwiZlwiKVxuICAgICAgICApIHtcbiAgICAgICAgICBzdHJpbmcgKz0gdGhpcy5jaDtcbiAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoc2lnbiA9PT0gXCItXCIpIHtcbiAgICAgIG51bWJlciA9IC1zdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG51bWJlciA9ICtzdHJpbmc7XG4gICAgfVxuXG4gICAgaWYgKCFpc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgICB0aGlzLmVycm9yKFwiQmFkIG51bWJlclwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzdHJpbmcoKSB7XG4gICAgLy8gUGFyc2UgYSBzdHJpbmcgdmFsdWUuXG5cbiAgICB2YXIgaGV4LFxuICAgICAgaSxcbiAgICAgIHN0cmluZyA9IFwiXCIsXG4gICAgICBkZWxpbSwgLy8gZG91YmxlIHF1b3RlIG9yIHNpbmdsZSBxdW90ZVxuICAgICAgdWZmZmY7XG5cbiAgICAvLyBXaGVuIHBhcnNpbmcgZm9yIHN0cmluZyB2YWx1ZXMsIHdlIG11c3QgbG9vayBmb3IgJyBvciBcIiBhbmQgXFwgY2hhcmFjdGVycy5cblxuICAgIGlmICh0aGlzLmNoID09PSAnXCInIHx8IHRoaXMuY2ggPT09IFwiJ1wiKSB7XG4gICAgICBkZWxpbSA9IHRoaXMuY2g7XG4gICAgICB3aGlsZSAodGhpcy5uZXh0KCkpIHtcbiAgICAgICAgaWYgKHRoaXMuY2ggPT09IGRlbGltKSB7XG4gICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoID09PSBcIlxcXFxcIikge1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICAgIGlmICh0aGlzLmNoID09PSBcInVcIikge1xuICAgICAgICAgICAgdWZmZmYgPSAwO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKz0gMSkge1xuICAgICAgICAgICAgICBoZXggPSBwYXJzZUludCh0aGlzLm5leHQoKSwgMTYpO1xuICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKGhleCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1ZmZmZiA9IHVmZmZmICogMTYgKyBoZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1ZmZmZik7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoID09PSBcIlxcclwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wZWVrKCkgPT09IFwiXFxuXCIpIHtcbiAgICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgU3VydmV5SlNPTjUuZXNjYXBlZVt0aGlzLmNoXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgc3RyaW5nICs9IFN1cnZleUpTT041LmVzY2FwZWVbdGhpcy5jaF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoID09PSBcIlxcblwiKSB7XG4gICAgICAgICAgLy8gdW5lc2NhcGVkIG5ld2xpbmVzIGFyZSBpbnZhbGlkOyBzZWU6XG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FzZWVtay9qc29uNS9pc3N1ZXMvMjRcbiAgICAgICAgICAvLyBUT0RPIHRoaXMgZmVlbHMgc3BlY2lhbC1jYXNlZDsgYXJlIHRoZXJlIG90aGVyXG4gICAgICAgICAgLy8gaW52YWxpZCB1bmVzY2FwZWQgY2hhcnM/XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyaW5nICs9IHRoaXMuY2g7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lcnJvcihcIkJhZCBzdHJpbmdcIik7XG4gIH1cbiAgcHJpdmF0ZSBpbmxpbmVDb21tZW50KCkge1xuICAgIC8vIFNraXAgYW4gaW5saW5lIGNvbW1lbnQsIGFzc3VtaW5nIHRoaXMgaXMgb25lLiBUaGUgY3VycmVudCBjaGFyYWN0ZXIgc2hvdWxkXG4gICAgLy8gYmUgdGhlIHNlY29uZCAvIGNoYXJhY3RlciBpbiB0aGUgLy8gcGFpciB0aGF0IGJlZ2lucyB0aGlzIGlubGluZSBjb21tZW50LlxuICAgIC8vIFRvIGZpbmlzaCB0aGUgaW5saW5lIGNvbW1lbnQsIHdlIGxvb2sgZm9yIGEgbmV3bGluZSBvciB0aGUgZW5kIG9mIHRoZSB0ZXh0LlxuXG4gICAgaWYgKHRoaXMuY2ggIT09IFwiL1wiKSB7XG4gICAgICB0aGlzLmVycm9yKFwiTm90IGFuIGlubGluZSBjb21tZW50XCIpO1xuICAgIH1cblxuICAgIGRvIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgaWYgKHRoaXMuY2ggPT09IFwiXFxuXCIgfHwgdGhpcy5jaCA9PT0gXCJcXHJcIikge1xuICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHRoaXMuY2gpO1xuICB9XG4gIHByaXZhdGUgYmxvY2tDb21tZW50KCkge1xuICAgIC8vIFNraXAgYSBibG9jayBjb21tZW50LCBhc3N1bWluZyB0aGlzIGlzIG9uZS4gVGhlIGN1cnJlbnQgY2hhcmFjdGVyIHNob3VsZCBiZVxuICAgIC8vIHRoZSAqIGNoYXJhY3RlciBpbiB0aGUgLyogcGFpciB0aGF0IGJlZ2lucyB0aGlzIGJsb2NrIGNvbW1lbnQuXG4gICAgLy8gVG8gZmluaXNoIHRoZSBibG9jayBjb21tZW50LCB3ZSBsb29rIGZvciBhbiBlbmRpbmcgKi8gcGFpciBvZiBjaGFyYWN0ZXJzLFxuICAgIC8vIGJ1dCB3ZSBhbHNvIHdhdGNoIGZvciB0aGUgZW5kIG9mIHRleHQgYmVmb3JlIHRoZSBjb21tZW50IGlzIHRlcm1pbmF0ZWQuXG5cbiAgICBpZiAodGhpcy5jaCAhPT0gXCIqXCIpIHtcbiAgICAgIHRoaXMuZXJyb3IoXCJOb3QgYSBibG9jayBjb21tZW50XCIpO1xuICAgIH1cblxuICAgIGRvIHtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgd2hpbGUgKHRoaXMuY2ggPT09IFwiKlwiKSB7XG4gICAgICAgIHRoaXMubmV4dChcIipcIik7XG4gICAgICAgIGlmICh0aGlzLmNoID09PSBcIi9cIikge1xuICAgICAgICAgIHRoaXMubmV4dChcIi9cIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodGhpcy5jaCk7XG5cbiAgICB0aGlzLmVycm9yKFwiVW50ZXJtaW5hdGVkIGJsb2NrIGNvbW1lbnRcIik7XG4gIH1cbiAgcHJpdmF0ZSBjb21tZW50KCkge1xuICAgIC8vIFNraXAgYSBjb21tZW50LCB3aGV0aGVyIGlubGluZSBvciBibG9jay1sZXZlbCwgYXNzdW1pbmcgdGhpcyBpcyBvbmUuXG4gICAgLy8gQ29tbWVudHMgYWx3YXlzIGJlZ2luIHdpdGggYSAvIGNoYXJhY3Rlci5cblxuICAgIGlmICh0aGlzLmNoICE9PSBcIi9cIikge1xuICAgICAgdGhpcy5lcnJvcihcIk5vdCBhIGNvbW1lbnRcIik7XG4gICAgfVxuXG4gICAgdGhpcy5uZXh0KFwiL1wiKTtcblxuICAgIGlmICh0aGlzLmNoID09PSBcIi9cIikge1xuICAgICAgdGhpcy5pbmxpbmVDb21tZW50KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNoID09PSBcIipcIikge1xuICAgICAgdGhpcy5ibG9ja0NvbW1lbnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvcihcIlVucmVjb2duaXplZCBjb21tZW50XCIpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHdoaXRlKCkge1xuICAgIC8vIFNraXAgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMuXG4gICAgLy8gTm90ZSB0aGF0IHdlJ3JlIGRldGVjdGluZyBjb21tZW50cyBieSBvbmx5IGEgc2luZ2xlIC8gY2hhcmFjdGVyLlxuICAgIC8vIFRoaXMgd29ya3Mgc2luY2UgcmVndWxhciBleHByZXNzaW9ucyBhcmUgbm90IHZhbGlkIEpTT04oNSksIGJ1dCB0aGlzIHdpbGxcbiAgICAvLyBicmVhayBpZiB0aGVyZSBhcmUgb3RoZXIgdmFsaWQgdmFsdWVzIHRoYXQgYmVnaW4gd2l0aCBhIC8gY2hhcmFjdGVyIVxuXG4gICAgd2hpbGUgKHRoaXMuY2gpIHtcbiAgICAgIGlmICh0aGlzLmNoID09PSBcIi9cIikge1xuICAgICAgICB0aGlzLmNvbW1lbnQoKTtcbiAgICAgIH0gZWxzZSBpZiAoU3VydmV5SlNPTjUud3MuaW5kZXhPZih0aGlzLmNoKSA+PSAwKSB7XG4gICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIHdvcmQoKTogYW55IHtcbiAgICAvLyB0cnVlLCBmYWxzZSwgb3IgbnVsbC5cblxuICAgIHN3aXRjaCAodGhpcy5jaCkge1xuICAgICAgY2FzZSBcInRcIjpcbiAgICAgICAgdGhpcy5uZXh0KFwidFwiKTtcbiAgICAgICAgdGhpcy5uZXh0KFwiclwiKTtcbiAgICAgICAgdGhpcy5uZXh0KFwidVwiKTtcbiAgICAgICAgdGhpcy5uZXh0KFwiZVwiKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlIFwiZlwiOlxuICAgICAgICB0aGlzLm5leHQoXCJmXCIpO1xuICAgICAgICB0aGlzLm5leHQoXCJhXCIpO1xuICAgICAgICB0aGlzLm5leHQoXCJsXCIpO1xuICAgICAgICB0aGlzLm5leHQoXCJzXCIpO1xuICAgICAgICB0aGlzLm5leHQoXCJlXCIpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjYXNlIFwiblwiOlxuICAgICAgICB0aGlzLm5leHQoXCJuXCIpO1xuICAgICAgICB0aGlzLm5leHQoXCJ1XCIpO1xuICAgICAgICB0aGlzLm5leHQoXCJsXCIpO1xuICAgICAgICB0aGlzLm5leHQoXCJsXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGNhc2UgXCJJXCI6XG4gICAgICAgIHRoaXMubmV4dChcIklcIik7XG4gICAgICAgIHRoaXMubmV4dChcIm5cIik7XG4gICAgICAgIHRoaXMubmV4dChcImZcIik7XG4gICAgICAgIHRoaXMubmV4dChcImlcIik7XG4gICAgICAgIHRoaXMubmV4dChcIm5cIik7XG4gICAgICAgIHRoaXMubmV4dChcImlcIik7XG4gICAgICAgIHRoaXMubmV4dChcInRcIik7XG4gICAgICAgIHRoaXMubmV4dChcInlcIik7XG4gICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgIGNhc2UgXCJOXCI6XG4gICAgICAgIHRoaXMubmV4dChcIk5cIik7XG4gICAgICAgIHRoaXMubmV4dChcImFcIik7XG4gICAgICAgIHRoaXMubmV4dChcIk5cIik7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIHRoaXMuZXJyb3IoXCJVbmV4cGVjdGVkICdcIiArIHRoaXMuY2ggKyBcIidcIik7XG4gIH1cbiAgcHJpdmF0ZSBhcnJheSgpIHtcbiAgICAvLyBQYXJzZSBhbiBhcnJheSB2YWx1ZS5cblxuICAgIHZhciBhcnJheSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuY2ggPT09IFwiW1wiKSB7XG4gICAgICB0aGlzLm5leHQoXCJbXCIpO1xuICAgICAgdGhpcy53aGl0ZSgpO1xuICAgICAgd2hpbGUgKHRoaXMuY2gpIHtcbiAgICAgICAgaWYgKHRoaXMuY2ggPT09IFwiXVwiKSB7XG4gICAgICAgICAgdGhpcy5uZXh0KFwiXVwiKTtcbiAgICAgICAgICByZXR1cm4gYXJyYXk7IC8vIFBvdGVudGlhbGx5IGVtcHR5IGFycmF5XG4gICAgICAgIH1cbiAgICAgICAgLy8gRVM1IGFsbG93cyBvbWl0dGluZyBlbGVtZW50cyBpbiBhcnJheXMsIGUuZy4gWyxdIGFuZFxuICAgICAgICAvLyBbLG51bGxdLiBXZSBkb24ndCBhbGxvdyB0aGlzIGluIEpTT041LlxuICAgICAgICBpZiAodGhpcy5jaCA9PT0gXCIsXCIpIHtcbiAgICAgICAgICB0aGlzLmVycm9yKFwiTWlzc2luZyBhcnJheSBlbGVtZW50XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFycmF5LnB1c2godGhpcy52YWx1ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndoaXRlKCk7XG4gICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gY29tbWEgYWZ0ZXIgdGhpcyB2YWx1ZSwgdGhpcyBuZWVkcyB0b1xuICAgICAgICAvLyBiZSB0aGUgZW5kIG9mIHRoZSBhcnJheS5cbiAgICAgICAgaWYgKHRoaXMuY2ggIT09IFwiLFwiKSB7XG4gICAgICAgICAgdGhpcy5uZXh0KFwiXVwiKTtcbiAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXh0KFwiLFwiKTtcbiAgICAgICAgdGhpcy53aGl0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVycm9yKFwiQmFkIGFycmF5XCIpO1xuICB9XG4gIHByaXZhdGUgb2JqZWN0KCkge1xuICAgIC8vIFBhcnNlIGFuIG9iamVjdCB2YWx1ZS5cblxuICAgIHZhciBrZXksXG4gICAgICBzdGFydCxcbiAgICAgIGlzRmlyc3RQcm9wZXJ0eSA9IHRydWUsXG4gICAgICBvYmplY3QgPSB7fTtcbiAgICBpZiAodGhpcy5wYXJzZVR5cGUgPiAwKSB7XG4gICAgICBvYmplY3RbU3VydmV5SlNPTjUucG9zaXRpb25OYW1lXSA9IHsgc3RhcnQ6IHRoaXMuYXQgLSAxIH07XG4gICAgfVxuICAgIGlmICh0aGlzLmNoID09PSBcIntcIikge1xuICAgICAgdGhpcy5uZXh0KFwie1wiKTtcbiAgICAgIHRoaXMud2hpdGUoKTtcbiAgICAgIHN0YXJ0ID0gdGhpcy5hdCAtIDE7XG4gICAgICB3aGlsZSAodGhpcy5jaCkge1xuICAgICAgICBpZiAodGhpcy5jaCA9PT0gXCJ9XCIpIHtcbiAgICAgICAgICBpZiAodGhpcy5wYXJzZVR5cGUgPiAwKSB7XG4gICAgICAgICAgICBvYmplY3RbU3VydmV5SlNPTjUucG9zaXRpb25OYW1lXS5lbmQgPSBzdGFydDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5uZXh0KFwifVwiKTtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0OyAvLyBQb3RlbnRpYWxseSBlbXB0eSBvYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEtleXMgY2FuIGJlIHVucXVvdGVkLiBJZiB0aGV5IGFyZSwgdGhleSBuZWVkIHRvIGJlXG4gICAgICAgIC8vIHZhbGlkIEpTIGlkZW50aWZpZXJzLlxuICAgICAgICBpZiAodGhpcy5jaCA9PT0gJ1wiJyB8fCB0aGlzLmNoID09PSBcIidcIikge1xuICAgICAgICAgIGtleSA9IHRoaXMuc3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2V5ID0gdGhpcy5pZGVudGlmaWVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndoaXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlVHlwZSA+IDEpIHtcbiAgICAgICAgICBvYmplY3RbU3VydmV5SlNPTjUucG9zaXRpb25OYW1lXVtrZXldID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgdmFsdWVTdGFydDogdGhpcy5hdFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXh0KFwiOlwiKTtcbiAgICAgICAgb2JqZWN0W2tleV0gPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIGlmICh0aGlzLnBhcnNlVHlwZSA+IDEpIHtcbiAgICAgICAgICBzdGFydCA9IHRoaXMuYXQgLSAxO1xuICAgICAgICAgIG9iamVjdFtTdXJ2ZXlKU09ONS5wb3NpdGlvbk5hbWVdW2tleV0udmFsdWVFbmQgPSBzdGFydDtcbiAgICAgICAgICBvYmplY3RbU3VydmV5SlNPTjUucG9zaXRpb25OYW1lXVtrZXldLmVuZCA9IHN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2hpdGUoKTtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBubyBjb21tYSBhZnRlciB0aGlzIHBhaXIsIHRoaXMgbmVlZHMgdG8gYmVcbiAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgb2JqZWN0LlxuICAgICAgICBpZiAodGhpcy5jaCAhPT0gXCIsXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy5wYXJzZVR5cGUgPiAxKSB7XG4gICAgICAgICAgICBvYmplY3RbU3VydmV5SlNPTjUucG9zaXRpb25OYW1lXVtrZXldLnZhbHVlRW5kLS07XG4gICAgICAgICAgICBvYmplY3RbU3VydmV5SlNPTjUucG9zaXRpb25OYW1lXVtrZXldLmVuZC0tO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5wYXJzZVR5cGUgPiAwKSB7XG4gICAgICAgICAgICBvYmplY3RbU3VydmV5SlNPTjUucG9zaXRpb25OYW1lXS5lbmQgPSB0aGlzLmF0IC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5uZXh0KFwifVwiKTtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcnNlVHlwZSA+IDEpIHtcbiAgICAgICAgICBvYmplY3RbU3VydmV5SlNPTjUucG9zaXRpb25OYW1lXVtrZXldLnZhbHVlRW5kLS07XG4gICAgICAgICAgaWYgKCFpc0ZpcnN0UHJvcGVydHkpIHtcbiAgICAgICAgICAgIG9iamVjdFtTdXJ2ZXlKU09ONS5wb3NpdGlvbk5hbWVdW2tleV0uZW5kLS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dChcIixcIik7XG4gICAgICAgIHRoaXMud2hpdGUoKTtcbiAgICAgICAgaXNGaXJzdFByb3BlcnR5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZXJyb3IoXCJCYWQgb2JqZWN0XCIpO1xuICB9XG4gIHByaXZhdGUgdmFsdWUoKTogYW55IHtcbiAgICAvLyBQYXJzZSBhIEpTT04gdmFsdWUuIEl0IGNvdWxkIGJlIGFuIG9iamVjdCwgYW4gYXJyYXksIGEgc3RyaW5nLCBhIG51bWJlcixcbiAgICAvLyBvciBhIHdvcmQuXG5cbiAgICB0aGlzLndoaXRlKCk7XG4gICAgc3dpdGNoICh0aGlzLmNoKSB7XG4gICAgICBjYXNlIFwie1wiOlxuICAgICAgICByZXR1cm4gdGhpcy5vYmplY3QoKTtcbiAgICAgIGNhc2UgXCJbXCI6XG4gICAgICAgIHJldHVybiB0aGlzLmFycmF5KCk7XG4gICAgICBjYXNlICdcIic6XG4gICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmcoKTtcbiAgICAgIGNhc2UgXCItXCI6XG4gICAgICBjYXNlIFwiK1wiOlxuICAgICAgY2FzZSBcIi5cIjpcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtYmVyKCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5jaCA+PSBcIjBcIiAmJiB0aGlzLmNoIDw9IFwiOVwiID8gdGhpcy5udW1iZXIoKSA6IHRoaXMud29yZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZXI6IGFueTtcbiAgcHJpdmF0ZSBpbmRlbnRTdHI6IHN0cmluZztcbiAgcHJpdmF0ZSBvYmpTdGFjaztcblxuICBwdWJsaWMgc3RyaW5naWZ5KG9iajogYW55LCByZXBsYWNlcjogYW55ID0gbnVsbCwgc3BhY2U6IGFueSA9IG51bGwpIHtcbiAgICBpZiAoXG4gICAgICByZXBsYWNlciAmJlxuICAgICAgKHR5cGVvZiByZXBsYWNlciAhPT0gXCJmdW5jdGlvblwiICYmICF0aGlzLmlzQXJyYXkocmVwbGFjZXIpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVwbGFjZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGFuIGFycmF5XCIpO1xuICAgIH1cbiAgICB0aGlzLnJlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgdGhpcy5pbmRlbnRTdHIgPSB0aGlzLmdldEluZGVudChzcGFjZSk7XG4gICAgdGhpcy5vYmpTdGFjayA9IFtdO1xuICAgIC8vIHNwZWNpYWwgY2FzZS4uLndoZW4gdW5kZWZpbmVkIGlzIHVzZWQgaW5zaWRlIG9mXG4gICAgLy8gYSBjb21wb3VuZCBvYmplY3QvYXJyYXksIHJldHVybiBudWxsLlxuICAgIC8vIGJ1dCB3aGVuIHRvcC1sZXZlbCwgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHZhciB0b3BMZXZlbEhvbGRlciA9IHsgXCJcIjogb2JqIH07XG4gICAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRSZXBsYWNlZFZhbHVlT3JVbmRlZmluZWQodG9wTGV2ZWxIb2xkZXIsIFwiXCIsIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmluZ2lmeSh0b3BMZXZlbEhvbGRlciwgXCJcIiwgdHJ1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJbmRlbnQoc3BhY2U6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHNwYWNlKSB7XG4gICAgICBpZiAodHlwZW9mIHNwYWNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBzcGFjZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNwYWNlID09PSBcIm51bWJlclwiICYmIHNwYWNlID49IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFrZUluZGVudChcIiBcIiwgc3BhY2UsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcml2YXRlIGdldFJlcGxhY2VkVmFsdWVPclVuZGVmaW5lZChcbiAgICBob2xkZXI6IGFueSxcbiAgICBrZXk6IGFueSxcbiAgICBpc1RvcExldmVsOiBib29sZWFuXG4gICkge1xuICAgIHZhciB2YWx1ZSA9IGhvbGRlcltrZXldO1xuXG4gICAgLy8gUmVwbGFjZSB0aGUgdmFsdWUgd2l0aCBpdHMgdG9KU09OIHZhbHVlIGZpcnN0LCBpZiBwb3NzaWJsZVxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50b0pTT04gJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRvSlNPTigpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB1c2VyLXN1cHBsaWVkIHJlcGxhY2VyIGlmIGEgZnVuY3Rpb24sIGNhbGwgaXQuIElmIGl0cyBhbiBhcnJheSwgY2hlY2sgb2JqZWN0cycgc3RyaW5nIGtleXMgZm9yXG4gICAgLy8gcHJlc2VuY2UgaW4gdGhlIGFycmF5IChyZW1vdmluZyB0aGUga2V5L3ZhbHVlIHBhaXIgZnJvbSB0aGUgcmVzdWx0aW5nIEpTT04gaWYgdGhlIGtleSBpcyBtaXNzaW5nKS5cbiAgICBpZiAodHlwZW9mIHRoaXMucmVwbGFjZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZXIuY2FsbChob2xkZXIsIGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yZXBsYWNlcikge1xuICAgICAgaWYgKFxuICAgICAgICBpc1RvcExldmVsIHx8XG4gICAgICAgIHRoaXMuaXNBcnJheShob2xkZXIpIHx8XG4gICAgICAgIHRoaXMucmVwbGFjZXIuaW5kZXhPZihrZXkpID49IDBcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1dvcmRDaGFyKGNoYXI6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAoY2hhciA+PSBcImFcIiAmJiBjaGFyIDw9IFwielwiKSB8fFxuICAgICAgKGNoYXIgPj0gXCJBXCIgJiYgY2hhciA8PSBcIlpcIikgfHxcbiAgICAgIChjaGFyID49IFwiMFwiICYmIGNoYXIgPD0gXCI5XCIpIHx8XG4gICAgICBjaGFyID09PSBcIl9cIiB8fFxuICAgICAgY2hhciA9PT0gXCIkXCJcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1dvcmRTdGFydChjaGFyOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGNoYXIgPj0gXCJhXCIgJiYgY2hhciA8PSBcInpcIikgfHxcbiAgICAgIChjaGFyID49IFwiQVwiICYmIGNoYXIgPD0gXCJaXCIpIHx8XG4gICAgICBjaGFyID09PSBcIl9cIiB8fFxuICAgICAgY2hhciA9PT0gXCIkXCJcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1dvcmQoa2V5OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGtleSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNXb3JkU3RhcnQoa2V5WzBdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgaSA9IDEsXG4gICAgICBsZW5ndGggPSBrZXkubGVuZ3RoO1xuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoIXRoaXMuaXNXb3JkQ2hhcihrZXlbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gcG9seWZpbGxzXG4gIHByaXZhdGUgaXNBcnJheShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzRGF0ZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XG4gIH1cblxuICBwcml2YXRlIGlzTmFOKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgJiYgdmFsICE9PSB2YWw7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yQ2lyY3VsYXIob2JqOiBhbnkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub2JqU3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLm9ialN0YWNrW2ldID09PSBvYmopIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEpTT05cIik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgbWFrZUluZGVudChzdHI6IHN0cmluZywgbnVtOiBudW1iZXIsIG5vTmV3TGluZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKCFzdHIpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICAvLyBpbmRlbnRhdGlvbiBubyBtb3JlIHRoYW4gMTAgY2hhcnNcbiAgICBpZiAoc3RyLmxlbmd0aCA+IDEwKSB7XG4gICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIDEwKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZW50ID0gbm9OZXdMaW5lID8gXCJcIiA6IFwiXFxuXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW07IGkrKykge1xuICAgICAgaW5kZW50ICs9IHN0cjtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZW50O1xuICB9XG5cbiAgLy8gQ29waWVkIGZyb20gQ3Jva2ZvcmQncyBpbXBsZW1lbnRhdGlvbiBvZiBKU09OXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZG91Z2xhc2Nyb2NrZm9yZC9KU09OLWpzL2Jsb2IvZTM5ZGI0YjdlNjI0OWYwNGExOTVlN2RkMDg0MGU2MTBjYzllOTQxZS9qc29uMi5qcyNMMTk1XG4gIC8vIEJlZ2luXG4gIHByaXZhdGUgc3RhdGljIGN4ID0gL1tcXHUwMDAwXFx1MDBhZFxcdTA2MDAtXFx1MDYwNFxcdTA3MGZcXHUxN2I0XFx1MTdiNVxcdTIwMGMtXFx1MjAwZlxcdTIwMjgtXFx1MjAyZlxcdTIwNjAtXFx1MjA2ZlxcdWZlZmZcXHVmZmYwLVxcdWZmZmZdL2c7XG4gIHByaXZhdGUgc3RhdGljIGVzY2FwYWJsZSA9IC9bXFxcXFxcXCJcXHgwMC1cXHgxZlxceDdmLVxceDlmXFx1MDBhZFxcdTA2MDAtXFx1MDYwNFxcdTA3MGZcXHUxN2I0XFx1MTdiNVxcdTIwMGMtXFx1MjAwZlxcdTIwMjgtXFx1MjAyZlxcdTIwNjAtXFx1MjA2ZlxcdWZlZmZcXHVmZmYwLVxcdWZmZmZdL2c7XG4gIHByaXZhdGUgc3RhdGljIG1ldGEgPSB7XG4gICAgLy8gdGFibGUgb2YgY2hhcmFjdGVyIHN1YnN0aXR1dGlvbnNcbiAgICBcIlxcYlwiOiBcIlxcXFxiXCIsXG4gICAgXCJcXHRcIjogXCJcXFxcdFwiLFxuICAgIFwiXFxuXCI6IFwiXFxcXG5cIixcbiAgICBcIlxcZlwiOiBcIlxcXFxmXCIsXG4gICAgXCJcXHJcIjogXCJcXFxcclwiLFxuICAgICdcIic6ICdcXFxcXCInLFxuICAgIFwiXFxcXFwiOiBcIlxcXFxcXFxcXCJcbiAgfTtcbiAgcHJpdmF0ZSBlc2NhcGVTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICAvLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbnRyb2wgY2hhcmFjdGVycywgbm8gcXVvdGUgY2hhcmFjdGVycywgYW5kIG5vXG4gICAgLy8gYmFja3NsYXNoIGNoYXJhY3RlcnMsIHRoZW4gd2UgY2FuIHNhZmVseSBzbGFwIHNvbWUgcXVvdGVzIGFyb3VuZCBpdC5cbiAgICAvLyBPdGhlcndpc2Ugd2UgbXVzdCBhbHNvIHJlcGxhY2UgdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXJzIHdpdGggc2FmZSBlc2NhcGVcbiAgICAvLyBzZXF1ZW5jZXMuXG4gICAgU3VydmV5SlNPTjUuZXNjYXBhYmxlLmxhc3RJbmRleCA9IDA7XG4gICAgcmV0dXJuIFN1cnZleUpTT041LmVzY2FwYWJsZS50ZXN0KHN0cilcbiAgICAgID8gJ1wiJyArXG4gICAgICAgICAgc3RyLnJlcGxhY2UoU3VydmV5SlNPTjUuZXNjYXBhYmxlLCBmdW5jdGlvbihhKSB7XG4gICAgICAgICAgICB2YXIgYyA9IFN1cnZleUpTT041Lm1ldGFbYV07XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBjXG4gICAgICAgICAgICAgIDogXCJcXFxcdVwiICsgKFwiMDAwMFwiICsgYS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpO1xuICAgICAgICAgIH0pICtcbiAgICAgICAgICAnXCInXG4gICAgICA6ICdcIicgKyBzdHIgKyAnXCInO1xuICB9XG4gIC8vIEVuZFxuXG4gIHByaXZhdGUgaW50ZXJuYWxTdHJpbmdpZnkoaG9sZGVyOiBhbnksIGtleTogYW55LCBpc1RvcExldmVsOiBib29sZWFuKSB7XG4gICAgdmFyIGJ1ZmZlciwgcmVzO1xuXG4gICAgLy8gUmVwbGFjZSB0aGUgdmFsdWUsIGlmIG5lY2Vzc2FyeVxuICAgIHZhciBvYmpfcGFydCA9IHRoaXMuZ2V0UmVwbGFjZWRWYWx1ZU9yVW5kZWZpbmVkKGhvbGRlciwga2V5LCBpc1RvcExldmVsKTtcblxuICAgIGlmIChvYmpfcGFydCAmJiAhdGhpcy5pc0RhdGUob2JqX3BhcnQpKSB7XG4gICAgICAvLyB1bmJveCBvYmplY3RzXG4gICAgICAvLyBkb24ndCB1bmJveCBkYXRlcywgc2luY2Ugd2lsbCB0dXJuIGl0IGludG8gbnVtYmVyXG4gICAgICBvYmpfcGFydCA9IG9ial9wYXJ0LnZhbHVlT2YoKTtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlb2Ygb2JqX3BhcnQpIHtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBvYmpfcGFydC50b1N0cmluZygpO1xuXG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIGlmIChpc05hTihvYmpfcGFydCkgfHwgIWlzRmluaXRlKG9ial9wYXJ0KSkge1xuICAgICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqX3BhcnQudG9TdHJpbmcoKTtcblxuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICByZXR1cm4gdGhpcy5lc2NhcGVTdHJpbmcob2JqX3BhcnQudG9TdHJpbmcoKSk7XG5cbiAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgaWYgKG9ial9wYXJ0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNBcnJheShvYmpfcGFydCkpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrRm9yQ2lyY3VsYXIob2JqX3BhcnQpO1xuICAgICAgICAgIGJ1ZmZlciA9IFwiW1wiO1xuICAgICAgICAgIHRoaXMub2JqU3RhY2sucHVzaChvYmpfcGFydCk7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9ial9wYXJ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXMgPSB0aGlzLmludGVybmFsU3RyaW5naWZ5KG9ial9wYXJ0LCBpLCBmYWxzZSk7XG4gICAgICAgICAgICBidWZmZXIgKz0gdGhpcy5tYWtlSW5kZW50KHRoaXMuaW5kZW50U3RyLCB0aGlzLm9ialN0YWNrLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAocmVzID09PSBudWxsIHx8IHR5cGVvZiByZXMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgYnVmZmVyICs9IFwibnVsbFwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnVmZmVyICs9IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpIDwgb2JqX3BhcnQubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICBidWZmZXIgKz0gXCIsXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5kZW50U3RyKSB7XG4gICAgICAgICAgICAgIGJ1ZmZlciArPSBcIlxcblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9ialN0YWNrLnBvcCgpO1xuICAgICAgICAgIGJ1ZmZlciArPVxuICAgICAgICAgICAgdGhpcy5tYWtlSW5kZW50KHRoaXMuaW5kZW50U3RyLCB0aGlzLm9ialN0YWNrLmxlbmd0aCwgdHJ1ZSkgKyBcIl1cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoZWNrRm9yQ2lyY3VsYXIob2JqX3BhcnQpO1xuICAgICAgICAgIGJ1ZmZlciA9IFwie1wiO1xuICAgICAgICAgIHZhciBub25FbXB0eSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMub2JqU3RhY2sucHVzaChvYmpfcGFydCk7XG4gICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBvYmpfcGFydCkge1xuICAgICAgICAgICAgaWYgKG9ial9wYXJ0Lmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuaW50ZXJuYWxTdHJpbmdpZnkob2JqX3BhcnQsIHByb3AsIGZhbHNlKTtcbiAgICAgICAgICAgICAgaXNUb3BMZXZlbCA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyICs9IHRoaXMubWFrZUluZGVudCh0aGlzLmluZGVudFN0ciwgdGhpcy5vYmpTdGFjay5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIG5vbkVtcHR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcEtleSA9IHRoaXMuaXNXb3JkKHByb3ApXG4gICAgICAgICAgICAgICAgICA/IHByb3BcbiAgICAgICAgICAgICAgICAgIDogdGhpcy5lc2NhcGVTdHJpbmcocHJvcCk7XG4gICAgICAgICAgICAgICAgYnVmZmVyICs9XG4gICAgICAgICAgICAgICAgICBwcm9wS2V5ICsgXCI6XCIgKyAodGhpcy5pbmRlbnRTdHIgPyBcIiBcIiA6IFwiXCIpICsgdmFsdWUgKyBcIixcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9ialN0YWNrLnBvcCgpO1xuICAgICAgICAgIGlmIChub25FbXB0eSkge1xuICAgICAgICAgICAgYnVmZmVyID1cbiAgICAgICAgICAgICAgYnVmZmVyLnN1YnN0cmluZygwLCBidWZmZXIubGVuZ3RoIC0gMSkgK1xuICAgICAgICAgICAgICB0aGlzLm1ha2VJbmRlbnQodGhpcy5pbmRlbnRTdHIsIHRoaXMub2JqU3RhY2subGVuZ3RoKSArXG4gICAgICAgICAgICAgIFwifVwiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBidWZmZXIgPSBcInt9XCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBmdW5jdGlvbnMgYW5kIHVuZGVmaW5lZCBzaG91bGQgYmUgaWdub3JlZFxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuXG5leHBvcnQgdmFyIGhyU3RyaW5ncyA9IHtcbiAgLy9zdXJ2ZXkgdGVtcGxhdGVzXG4gIHN1cnZleToge1xuICAgIGVkaXQ6IFwiVXJlxJFpdmFuamVcIixcbiAgICBleHRlcm5hbEhlbHBMaW5rOiBcIkdsZWRhanRlIGkgc2F6bmFqdGUga2FrbyBzdHZvcml0aSBhbmtldGVcIixcbiAgICBleHRlcm5hbEhlbHBMaW5rVXJsOlxuICAgICAgXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDSDJydTlva0ljb29OWmZwSWJ5cTRxUT92aWV3X2FzPXN1YnNjcmliZXJcIixcbiAgICBkcm9wUXVlc3Rpb246IFwiTW9saW1vIGlzcHVzdGl0ZSBwaXRhbmplIG92ZGplIGl6IFRvb2xib3guXCIsXG4gICAgYWRkTG9naWNJdGVtOiBcIkl6cmFkaXRlIHByYXZpbG8gemEgcHJpbGFnb2RidSB0aWpla2EgYW5rZXRlLlwiLFxuICAgIGNvcHk6IFwiS29waXJhdGlcIixcbiAgICBkdXBsaWNhdGU6IFwiRHVwbGlrYXRhXCIsXG4gICAgYWRkVG9Ub29sYm94OiBcIkRvZGFqIHUgVG9vbGJveFwiLFxuICAgIGRlbGV0ZVBhbmVsOiBcIkJyaXNhbmplIHBsb8SNZVwiLFxuICAgIGRlbGV0ZVF1ZXN0aW9uOiBcIkl6YnJpxaFpIHBpdGFuamVcIixcbiAgICBjb252ZXJ0VG86IFwiUHJldHZvcml0ZSB1XCIsXG4gICAgZHJhZzogXCJQb3Z1Y2l0ZSBlbGVtZW50XCIsXG4gIH0sXG4gIC8vcXVlc3Rpb25UeXBlc1xuICBxdDoge1xuICAgIGRlZmF1bHQ6IFwiWmFkYW5pXCIsXG4gICAgY2hlY2tib3g6IFwixIxla1wiLFxuICAgIGNvbW1lbnQ6IFwiS29tZW50YXJcIixcbiAgICBpbWFnZXBpY2tlcjogXCJCZXJhxI0gc2xpa2FcIixcbiAgICBpbWFnZTogXCJTbGlrZVwiLFxuICAgIGRyb3Bkb3duOiBcIlBhZGFqdcSHaVwiLFxuICAgIGZpbGU6IFwiRGF0b3Rla3VcIixcbiAgICBodG1sOiBcIkh0bWxcIixcbiAgICBtYXRyaXg6IFwiTWF0cmljYSAoamVkYW4gaXpib3IpXCIsXG4gICAgbWF0cml4ZHJvcGRvd246IFwiTWF0cmljYSAodmnFoWVzdHJ1a2kgaXpib3IpXCIsXG4gICAgbWF0cml4ZHluYW1pYzogXCJNYXRyaWNhIChkaW5hbWnEjWtpIHJlZG92aSlcIixcbiAgICBtdWx0aXBsZXRleHQ6IFwiVmnFoWUgdGVrc3RhXCIsXG4gICAgcGFuZWw6IFwiUGxvxI1hXCIsXG4gICAgcGFuZWxkeW5hbWljOiBcIlBsb8SNYSAoZGluYW1pxI1raSBwYW5lbGkpXCIsXG4gICAgcmFkaW9ncm91cDogXCJSYWRpb2dydXBhXCIsXG4gICAgcmF0aW5nOiBcIk9jamVuYVwiLFxuICAgIHRleHQ6IFwiSmVkYW4gdWxhelwiLFxuICAgIGJvb2xlYW46IFwiQm9vbGVvdmFcIixcbiAgICBleHByZXNzaW9uOiBcIkl6cmF6IChzYW1vIHphIMSNaXRhbmplKVwiLFxuICAgIHNpZ25hdHVyZXBhZDogXCJKYXN0dcSNacSHIHphIHBvdHBpc1wiLFxuICAgIGZsb3dwYW5lbDogXCJQbG/EjWEgcHJvdG9rYVwiLFxuICB9LFxuICAvL1N0cmluZ3MgaW4gRWRpdG9yXG4gIGVkOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJaYWRhbmkgKHswfSlcIixcbiAgICBzdXJ2ZXk6IFwiQW5rZXRhXCIsXG4gICAgc2V0dGluZ3M6IFwiUG9zdGF2a2UgYW5rZXRlXCIsXG4gICAgc2V0dGluZ3NUb29sdGlwOiBcIk90dmFyYW5qZSBwb3N0YXZraSBhbmtldGVcIixcbiAgICAvL29wamVjdFByb3BlcnRpZXNIZWFkZXI6IFwiQWR2YW5jZWRcIixcbiAgICAvL3Nob3dPYmplY3RQcm9wZXJ0aWVzOiBcIlNob3cgT2JqZWN0IFByb3BlcnRpZXNcIixcbiAgICAvL2hpZGVPYmplY3RQcm9wZXJ0aWVzOiBcIkhpZGUgT2JqZWN0IFByb3BlcnRpZXNcIixcbiAgICBzaG93UGFuZWw6IFwiUG9rYcW+aSBwbG/EjXVcIixcbiAgICBoaWRlUGFuZWw6IFwiU2FrcmlqIHBsb8SNdVwiLFxuICAgIC8vZWRpdFN1cnZleTogXCJFZGl0IFN1cnZleVwiLFxuICAgIGFkZE5ld1BhZ2U6IFwiRG9kYXZhbmplIG5vdmUgc3RyYW5pY2VcIixcbiAgICBtb3ZlUmlnaHQ6IFwiUG9taWNhbmplIHVkZXNub1wiLFxuICAgIG1vdmVMZWZ0OiBcIlBvbWljYW5qZSB1bGlqZXZvXCIsXG4gICAgZGVsZXRlUGFnZTogXCJCcmlzYW5qZSBzdHJhbmljZVwiLFxuICAgIGVkaXRQYWdlOiBcIlVyZcSRaXZhbmplIHN0cmFuaWNlXCIsXG4gICAgZWRpdDogXCJVcmXEkWl2YW5qZVwiLFxuICAgIG5ld1BhZ2VOYW1lOiBcInN0cmFuaWNhXCIsXG4gICAgbmV3UXVlc3Rpb25OYW1lOiBcInBpdGFuamVcIixcbiAgICBuZXdQYW5lbE5hbWU6IFwicGxvxI1hXCIsXG4gICAgbmV3VGV4dEl0ZW1OYW1lOiBcInRla3N0XCIsXG4gICAgdGVzdFN1cnZleTogXCJJc3BpdG5hIGFua2V0YVwiLFxuICAgIHRlc3RTdXJ2ZXlBZ2FpbjogXCJQb25vdm5vIHByb2JuYSBhbmtldGFcIixcbiAgICB0ZXN0U3VydmV5V2lkdGg6IFwixaBpcmluYSBhbmtldGU6IFwiLFxuICAgIG5hdmlnYXRlVG9Nc2c6IFwiTW9yYW8gc2kgbmF2aWdpcmF0aSBkbzpcIixcbiAgICBsb2dpYzogXCJMb2dpa2EgYW5rZXRlXCIsXG4gICAgZW1iZWRTdXJ2ZXk6IFwiVWdyYcSRZW5hIGFua2V0YVwiLFxuICAgIHRyYW5zbGF0aW9uOiBcIlByaWpldm9kXCIsXG4gICAgc2F2ZVN1cnZleTogXCJTcHJlbWkgYW5rZXR1XCIsXG4gICAgc2F2ZVN1cnZleVRvb2x0aXA6IFwiU3ByZW1pIGFua2V0dVwiLFxuICAgIGRlc2lnbmVyOiBcIkRpemFqbmVyIGFua2V0ZVwiLFxuICAgIGpzb25FZGl0b3I6IFwiSlNPTiB1cmVkbmlrXCIsXG4gICAgdW5kbzogXCJQb25pxaF0aXRpXCIsXG4gICAgcmVkbzogXCJQb25vdml0aVwiLFxuICAgIHVuZG9Ub29sdGlwOiBcIlBvbmnFoXRpIHBvc2xqZWRuanUgcHJvbWplbnVcIixcbiAgICByZWRvVG9vbHRpcDogXCJQcmV1c21qZXRpIHByb21qZW51XCIsXG4gICAgY29weTogXCJLb3BpcmF0aVwiLFxuICAgIGN1dDogXCJJenJlemF0aVwiLFxuICAgIHBhc3RlOiBcIlphbGlqZXBpdGVcIixcbiAgICBjb3B5VG9vbHRpcDogXCJLb3BpcmFuamUgb2RhYmlyYSB1IG1lxJF1c3ByZW1uaWtcIixcbiAgICBjdXRUb29sdGlwOiBcIkl6cmXFvml0ZSBvZGFiaXIgbmEgbWXEkXVzcHJlbW5pa1wiLFxuICAgIHBhc3RlVG9vbHRpcDogXCJQYXN0YSBpeiBtZcSRdXNwcmVtbmlrYVwiLFxuICAgIG9wdGlvbnM6IFwiTW9ndcSHbm9zdGlcIixcbiAgICBnZW5lcmF0ZVZhbGlkSlNPTjogXCJHZW5lcmlyYW5qZSB2YWxqYW5vZyBKU09OXCIsXG4gICAgZ2VuZXJhdGVSZWFkYWJsZUpTT046IFwiR2VuZXJpcmFuamUgxI1pdGxqaXZvZyBKU09OXCIsXG4gICAgdG9vbGJveDogXCJBbGF0bmkgb2t2aXJcIixcbiAgICBcInByb3BlcnR5LWdyaWRcIjogXCJTdm9qc3R2YVwiLFxuICAgIHRvb2xib3hHZW5lcmFsQ2F0ZWdvcnk6IFwiT3DEh2VuaXRvXCIsXG4gICAgLy9kZWxTZWxPYmplY3Q6IFwiRGVsZXRlIHNlbGVjdGVkIG9iamVjdFwiLFxuICAgIC8vZWRpdFNlbE9iamVjdDogXCJFZGl0IHNlbGVjdGVkIG9iamVjdFwiLFxuICAgIGNvcnJlY3RKU09OOiBcIklzcHJhdml0ZSBKU09OLlwiLFxuICAgIHN1cnZleVJlc3VsdHM6IFwiUmV6dWx0YXQgYW5rZXRlOiBcIixcbiAgICBzdXJ2ZXlSZXN1bHRzVGFibGU6IFwiS2FvIHRhYmxpY2FcIixcbiAgICBzdXJ2ZXlSZXN1bHRzSnNvbjogXCJLYW8gSlNPTlwiLFxuICAgIHJlc3VsdHNUaXRsZTogXCJOYXNsb3YgcGl0YW5qYVwiLFxuICAgIHJlc3VsdHNOYW1lOiBcIk5heml2IHBpdGFuamFcIixcbiAgICByZXN1bHRzVmFsdWU6IFwiVnJpamVkbm9zdCBvZGdvdm9yYVwiLFxuICAgIHJlc3VsdHNEaXNwbGF5VmFsdWU6IFwiVnJpamVkbm9zdCBwcmlrYXphXCIsXG4gICAgbW9kaWZpZWQ6IFwiSXptamVuYVwiLFxuICAgIHNhdmluZzogXCJTcHJlbWFuamVcIixcbiAgICBzYXZlZDogXCJTcHJlbWl0aVwiLFxuICAgIHByb3BlcnR5RWRpdG9yRXJyb3I6IFwiUG9ncmXFoWthOlwiLFxuICAgIHNhdmVFcnJvcjogXCJQb2dyZcWha2EhIFNhZHLFvmFqIHVyZWRuaWthIG5pamUgc3ByZW1samVuLlwiLFxuICAgIHRyYW5zbGF0aW9uQWRkTGFuZ3VhZ2U6IFwiT2RhYmVyaXRlIGplemlrIHphIHByZXZvxJFlbmplXCIsXG4gICAgdHJhbnNsYXRpb25TaG93QWxsU3RyaW5nczogXCJQb2thxb5pdGUgc3ZlIMW+aWNlXCIsXG4gICAgdHJhbnNsYXRpb25TaG93QWxsUGFnZXM6IFwiUG9rYcW+aXRlIHN2ZSBzdHJhbmljZVwiLFxuICAgIHRyYW5zbGF0aW9uTm9TdHJpbmdzOiBcIk5lbWEgxb5pY2EgemEgcHJldm/EkWVuamUuIFByb21pamVuaXRlIGZpbHRhci5cIixcbiAgICB0cmFuc2xhdGlvbkV4cG9ydFRvU0NWQnV0dG9uOiBcIkl6dm96IHUgQ1NWXCIsXG4gICAgdHJhbnNsYXRpb25JbXBvcnRGcm9tU0NWQnV0dG9uOiBcIlV2b3ogaXogQ1NWXCIsXG4gICAgdHJhbnNsYXRpb25NZXJnZUxvY2FsZVdpdGhEZWZhdWx0OlxuICAgICAgXCJTcGFqYW5qZSB7MH0gc2EgemFkYW5pbSBsb2thbG9td2l0aCBkZWZhdWx0IGxvY2FsZS5cIixcbiAgICBib2xkOiBcInBvZGVibGphbm9cIixcbiAgICBpdGFsaWM6IFwia3Vyeml2XCIsXG4gICAgdW5kZXJsaW5lOiBcInBvZGNydGF2YW5qZVwiLFxuICAgIGZwQWRkUXVlc3Rpb246IFwiRG9kYWogcGl0YW5qZS4uLlwiLFxuICAgIHNlbGVjdFBhZ2U6IFwiT2RhYmVyaXRlIHN0cmFuaWN1Li4uXCIsXG4gICAgY2hvb3NlRWxlbWVudDogXCJPZGFiZXJpdGUgZWxlbWVudC4uLlwiLFxuICAgIC8vY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uSXRlbVRleHQ6IFwiU2hvdyBpZjpcIixcbiAgICBsZzoge1xuICAgICAgYWRkTmV3SXRlbTogXCJcIiwgLy9CeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyB0YWtlbiBmcm9tIHBlLmFkZE5ldyAnQWRkIE5ldycsIHlvdSBjYW4gc2V0IGl0IHRvICdBZGQgTmV3IFJ1bGUnIGZvciBleGFtcGxlLlxuICAgICAgLy9Mb2dpYyB0YWIgc3RyaW5nc1xuICAgICAgcGFnZV92aXNpYmlsaXR5TmFtZTogXCJWaWRsaml2b3N0IHN0cmFuaWNlXCIsXG4gICAgICBwYW5lbF92aXNpYmlsaXR5TmFtZTogXCJWaWRsaml2b3N0IHBhbmVsYVwiLFxuICAgICAgcGFuZWxfZW5hYmxlTmFtZTogXCJPbW9ndcSHaS9vbmVtb2d1xIdpIHBhbmVsXCIsXG4gICAgICBxdWVzdGlvbl92aXNpYmlsaXR5TmFtZTogXCJWaWRsaml2b3N0IHBpdGFuamFcIixcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZU5hbWU6IFwiUGl0YW5qZSBvbW9ndcSHdWplL29uZXNwb3NvYmxqYXZhXCIsXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlTmFtZTogXCJQaXRhbmplIG5pamUgb2JhdmV6bm9cIixcbiAgICAgIHRyaWdnZXJfY29tcGxldGVOYW1lOiBcIlBvdHB1bmEgYW5rZXRhXCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlTmFtZTogXCJQb3N0YXZpdGUgdnJpamVkbm9zdCBwaXRhbmphXCIsXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZU5hbWU6IFwiS29waXJhbmplIHZyaWplZG5vc3RpIHBpdGFuamFcIixcbiAgICAgIHRyaWdnZXJfc2tpcE5hbWU6IFwiUHJpamXEkWl0ZSBuYSBwaXRhbmplXCIsXG4gICAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25OYW1lOiBcIlBva3JldGFuamUgcHJpbGFnb8SRZW5vZyBpenJhemFcIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbk5hbWU6IFwiUHJpbGFnb8SRZW5pICdUaGFuayB5b3UgcGFnZScgdGVrc3RcIixcblxuICAgICAgcGFnZV92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiVcSNaW5pdGUgc3RyYW5pY3UgdmlkbGppdm9tIGthZGEgc2UgbG9nacSNa2EgZWtzcHJlc2lqYSB2cmF0aSBpc3Rpbml0b20uIEluYcSNZSBuZWthIGJ1ZGUgbmV2aWRsaml2by5cIixcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJVxI1pbml0ZSBwbG/EjXUgdmlkbGppdm9tIGthZGEgc2UgbG9nacSNa2EgZWtzcHJlc2lqYSB2cmF0aSBpc3Rpbml0b20uIEluYcSNZSBnYSBkcsW+YXRpIG5ldmlkbGppdmltLlwiLFxuICAgICAgcGFuZWxfZW5hYmxlRGVzY3JpcHRpb246XG4gICAgICAgIFwiVcSNaW5pdGUgcGxvxI11IGkgc3ZlIGVsZW1lbnRlIHVudXRhciBuamUgb21vZ3XEh2l0ZSBrYWRhIHNlIGxvZ2nEjWthIGVrc3ByZXNpamEgdnJhdGkgaXN0aW5pdGEuIEluYcSNZSBpaCBkcsW+aXRlIG9uZXNwb3NvYmxqZW5pbWEuXCIsXG4gICAgICBxdWVzdGlvbl92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiVcSNaW5pdGUgcGl0YW5qZSB2aWRsaml2aW0ga2FkYSBzZSBsb2dpxI1rYSBla3NwcmVzaWphIHZyYXRpIGlzdGluaXRhLiBJbmHEjWUgZ2EgZHLFvmF0aSBuZXZpZGxqaXZpbS5cIixcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZURlc2NyaXB0aW9uOlxuICAgICAgICBcIk9tb2d1xIdpdGUgcGl0YW5qZSBrYWRhIHNlIGxvZ2nEjWthIGVrc3ByZXNpamEgdnJhdGkgaXN0aW5pdGEuIEluYcSNZSBnYSBkcsW+YXRpIG9uZW1vZ3XEh2VuLlwiLFxuICAgICAgcXVlc3Rpb25fcmVxdWlyZURlc2NyaXB0aW9uOlxuICAgICAgICBcIlBpdGFuamUgcG9zdGFqZSBwb3RyZWJubyBrYWRhIHNlIGxvZ2nEjWthIGVrc3ByZXNpamEgdnJhdGkgaXN0aW5pdGEuXCIsXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlRGVzY3JpcHRpb246XG4gICAgICAgIFwiS2FkYSBzZSBsb2dpxI1rYSBla3NwcmVzaWphIHZyYXRpIGlzdGluaXRhLCBhbmtldGEgcG9zdGFqZSBkb3ZyxaFlbmEgaSBrcmFqbmppIGtvcmlzbmlrIHZpZGkgJ1RoYW5rIHlvdSBwYWdlJy5cIixcbiAgICAgIHRyaWdnZXJfc2V0dmFsdWVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJLYWRhIHNlIHZyaWplZG5vc3RpIHBpdGFuamEsIGtvamUgc2Uga29yaXN0ZSB1IGxvZ2nEjWtvbSBpenJhenUsIG1pamVuamFqdSBpIGxvZ2nEjWthIGVrc3ByZXNpamEgc2UgdnJhxIdhIGlzdGluaXRhLCB0YWRhIHNlIHZyaWplZG5vc3QgcG9zdGF2bGphIG5hIG9kYWJyYW5vIHBpdGFuamUuXCIsXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIkthZGEgc2UgdnJpamVkbm9zdGkgcGl0YW5qYSwga29qZSBzZSBrb3Jpc3RlIHUgbG9nacSNa29qIGVrc3ByZXNpamksIG1pamVuamFqdSBpIGxvZ2nEjWthIGVrc3ByZXNpamEgc2UgdnJhxIdhIGlzdGluaXRhLCB0YWRhIHNlIHZyaWplZG5vc3QgamVkbm9nIG9kYWJyYW5vZyBwaXRhbmphIGtvcGlyYSBuYSBkcnVnbyBvZGFicmFubyBwaXRhbmplLlwiLFxuICAgICAgdHJpZ2dlcl9za2lwRGVzY3JpcHRpb246XG4gICAgICAgIFwiS2FkYSBzZSBsb2dpxI1rYSBla3NwcmVzaWphIHZyYXRpIGlzdGluaXRhLCBhbmtldGEgcHJlc2thxI1lIG5hIC8gZm9rdXNpcmEgb2RhYnJhbm8gcGl0YW5qZS5cIixcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvbkRlc2NyaXB0aW9uOlxuICAgICAgICBcIkthZGEgc2UgbG9nacSNa2EgZWtzcHJlc2lqYSB2cmF0aSBpc3Rpbml0YSwgdGFkYSBzZSBpenZvZGkgcHJpbGFnb8SRZW5pIGl6cmF6LiBUYWogcmV6dWx0YXQgaXpyYXphIG1vxb5ldGUgbmVvYmF2ZXpubyBwb3N0YXZpdGkgdSBvZGFicmFubyBwaXRhbmplLlwiLFxuICAgICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uRGVzY3JpcHRpb246XG4gICAgICAgIFwiQWtvIHNlIGxvZ2nEjWthIGVrc3ByZXNpamEgdnJhdGkgaXN0aW5pdGEsIHphZGFuaSB0ZWtzdCB6YSAnVGhhbmsgeW91IHBhZ2UnIG1pamVuamEgc2UgdSB6YWRhbmkuXCIsXG5cbiAgICAgIGl0ZW1FeHByZXNzaW9uVGV4dDogXCJLYWRhIHNlIGl6cmF6ICd7MH0nIHZyYXRpIGlzdGluaXRcIiwgLy97MH0gLSB0aGUgZXhwcmVzc2lvblxuICAgICAgcGFnZV92aXNpYmlsaXR5VGV4dDogXCJVxI1pbml0ZSBzdHJhbmljdSB7MH0gdmlkbGppdm9tXCIsIC8vezB9IHBhZ2UgbmFtZVxuICAgICAgcGFuZWxfdmlzaWJpbGl0eVRleHQ6IFwiVcSNaW5pdGUgcGxvxI11IHswfSB2aWRsaml2b21cIiwgLy97MH0gcGFuZWwgbmFtZVxuICAgICAgcGFuZWxfZW5hYmxlVGV4dDogXCJPbW9ndcSHaSBwYW5lbCB4IHswfVwiLCAvL3swfSBwYW5lbCBuYW1lXG4gICAgICBxdWVzdGlvbl92aXNpYmlsaXR5VGV4dDogXCJVxI1pbml0ZSBwaXRhbmplIHswfSB2aWRsaml2aW1cIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgcXVlc3Rpb25fZW5hYmxlVGV4dDogXCJPbW9ndcSHaSBwaXRhbmplIHswfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlVGV4dDogXCJOZWthIHBpdGFuamUgezB9IGJ1ZGUgcG90cmVibm9cIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZVRleHQ6IFwiQW5rZXRhIHNlIGRvdnLFoWFcIixcbiAgICAgIHRyaWdnZXJfc2V0dmFsdWVUZXh0OiBcIlBvc3RhdmxqZW5vIHUgcGl0YW5qZTogezB9IHZyaWplZG5vc3QgezF9XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWUsIHsxfSBzZXRWYWx1ZVxuICAgICAgdHJpZ2dlcl9jb3B5dmFsdWVUZXh0OlxuICAgICAgICBcIktvcGlyYWp0ZSB1IHBpdGFuamU6IHswfSB2cmlqZWRub3N0IG9kIHBpdGFuamEgezF9XCIsIC8vezB9IGFuZCB7MX0gcXVlc3Rpb24gbmFtZXNcbiAgICAgIHRyaWdnZXJfc2tpcFRleHQ6IFwiQW5rZXRhIHByZXNrYcSNZSBuYSBwaXRhbmplIHswfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25UZXh0MTogXCJQb2tyZXRhbmplIGl6cmF6YTogJ3swfSdcIiwgLy97MH0gdGhlIGV4cHJlc3Npb25cbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvblRleHQyOiBcIiBpIGRvdmVsYSB1IHBpdGFuamUgc3ZvaiByZXp1bHRhdDogezB9XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWVcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvblRleHQ6XG4gICAgICAgIFwiUHJpa2F6YXRpIHByaWxhZ2/EkWVuaSB0ZWtzdCB6YSAnVGhhbmsgeW91IHBhZ2UnLlwiLFxuXG4gICAgICBjb25kaXRpb25zOiBcIlN0YW5qZS9TdGFuamFcIixcbiAgICAgIGFjdGlvbnM6IFwiQWtjaWplXCIsXG4gICAgICBleHByZXNzaW9uRWRpdG9yVGl0bGU6IFwiRGVmaW5pcmFuamUgdXZqZXRhXCIsXG4gICAgICBhY3Rpb25zRWRpdG9yVGl0bGU6IFwiRGVmaW5pcmFuamUgcmFkbmppXCIsXG5cbiAgICAgIGRlbGV0ZUFjdGlvbjogXCJCcmlzYW5qZSByYWRuamVcIixcbiAgICAgIGFkZE5ld0FjdGlvbjogXCJEb2RhdmFuamUgbm92ZSBha2NpamVcIixcbiAgICAgIHNlbGVjdGVkQWN0aW9uQ2FwdGlvbjogXCJPZGFiZXJpdGUgcmFkbmp1IHphIGRvZGF2YW5qZS4uLlwiLFxuXG4gICAgICBleHByZXNzaW9uSW52YWxpZDpcbiAgICAgICAgXCJMb2dpxI1rYSBla3NwcmVzaWphIGplIHByYXpuYSBpbGkgbmV2YcW+ZcSHYS4gTW9saW0gdmFzLCBpc3ByYXZpdGUgdG8uXCIsXG4gICAgICBub0FjdGlvbkVycm9yOiBcIk1vbGltIHZhcywgZG9kYWp0ZSBiYXJlbSBqZWRudSBha2NpanUuXCIsXG4gICAgICBhY3Rpb25JbnZhbGlkOiBcIk1vbGltbyB2YXMgZGEgcmlqZcWhaXRlIHByb2JsZW1lIHUgc3Zvam9qIGFrY2lqaS5cIixcbiAgICAgIGV4cHJlc3Npb25TZXR1cDogXCJcIixcbiAgICAgIGFjdGlvbnNTZXR1cDogXCJcIixcbiAgICB9LFxuICB9LFxuICAvL1Byb3BlcnR5IG5hbWVzIGluIHRhYmxlIGhlYWRlcnNcbiAgLy8gcGVsOiB7XG4gIC8vICAgaXNSZXF1aXJlZDogXCJSZXF1aXJlZD9cIlxuICAvLyB9LFxuICAvL1Byb3BlcnR5IEVkaXRvcnNcbiAgcGU6IHtcbiAgICBhcHBseTogXCJQcmltaWplbml0aVwiLFxuICAgIG9rOiBcIk9LXCIsXG4gICAgc2F2ZTogXCJTcHJlbWl0aVwiLFxuICAgIHNhdmVUb29sdGlwOiBcIlNwcmVtaXRpXCIsXG4gICAgY2FuY2VsOiBcIk90a2F6YXRpXCIsXG4gICAgcmVzZXQ6IFwiUmVzZXRpcmF0aVwiLFxuICAgIHJlZnJlc2g6IFwiT3N2amXFvmlcIixcbiAgICAvLyBjbG9zZTogXCJDbG9zZVwiLFxuICAgIGRlbGV0ZTogXCJJemJyaXNhdGlcIixcbiAgICBhZGQ6IFwiRG9kYXRpXCIsXG4gICAgYWRkTmV3OiBcIkRvZGFqIG5vdm9cIixcbiAgICBhZGRJdGVtOiBcIktsaWtuaXRlIGRhIGJpc3RlIGRvZGFsaSBzdGF2a3UuLi5cIixcbiAgICBhZGRPdGhlcjogXCJEcnVnaWhcIixcbiAgICBhZGRTZWxlY3RBbGw6IFwiT2RhYmVyaXRlIHN2ZVwiLFxuICAgIGFkZE5vbmU6IFwiTml0a29cIixcbiAgICByZW1vdmVBbGw6IFwiVWtsb25pdGUgc3ZlXCIsXG4gICAgZWRpdDogXCJVcmXEkWl2YW5qZVwiLFxuICAgIGJhY2s6IFwiUG92cmF0YWsgYmV6IHXFoXRlZGVcIixcbiAgICBiYWNrVG9vbHRpcDogXCJQb3ZyYXRhayBiZXogdcWhdGVkZVwiLFxuICAgIHNhdmVBbmRCYWNrOiBcIlNwcmVtYW5qZSBpIHZyYcSHYW5qZVwiLFxuICAgIHNhdmVBbmRCYWNrVG9vbHRpcDogXCJTcHJlbWFuamUgaSB2cmHEh2FuamVcIixcbiAgICAvLyBpdGVtVmFsdWVFZGl0OiBcIlZpc2libGUgSWZcIixcbiAgICBlZGl0Q2hvaWNlczogXCJVcmXEkWl2YW5qZSBpemJvcmFcIixcbiAgICBzaG93Q2hvaWNlczogXCJQb2thxb5pdGUgaXpib3JlXCIsXG4gICAgbW92ZTogXCJQcmVtamVzdGl0aVwiLFxuICAgIGVtcHR5OiBcIjxlbXB0eT5cIixcbiAgICAvLyBub3RFbXB0eTogXCI8ZWRpdCB2YWx1ZT5cIixcbiAgICBmYXN0RW50cnk6IFwiQnJ6aSB1bm9zXCIsXG4gICAgZm9ybUVudHJ5OiBcIlVub3Mgb2JyYXNjYVwiLFxuICAgIHRlc3RTZXJ2aWNlOiBcIlRlc3RpcmFqdGUgdXNsdWd1XCIsXG4gICAgaXRlbVNlbGVjdG9yRW1wdHk6IFwiT2RhYmVyaXRlIGVsZW1lbnRcIixcbiAgICBjb25kaXRpb25BY3Rpb25FbXB0eTogXCJPZGFiZXJpdGUgcmFkbmp1XCIsXG4gICAgY29uZGl0aW9uU2VsZWN0UXVlc3Rpb246IFwiT2RhYmVyaXRlIHBpdGFuamUuLi5cIixcbiAgICBjb25kaXRpb25TZWxlY3RQYWdlOiBcIk9kYWJlcml0ZSBzdHJhbmljdS4uLlwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFBhbmVsOiBcIk9kYWJpciBwbG/EjWUuLi5cIixcbiAgICBjb25kaXRpb25WYWx1ZVF1ZXN0aW9uVGl0bGU6IFwiVW5lc2l0ZS9vZGFiZXJpdGUgdnJpamVkbm9zdFwiLFxuICAgIC8vIGNvbmRpdGlvbkhlbHA6XG4gICAgLy8gICBcIlBsZWFzZSBlbnRlciBhIGJvb2xlYW4gZXhwcmVzc2lvbi4gSXQgc2hvdWxkIHJldHVybiB0cnVlIHRvIGtlZXAgdGhlIHF1ZXN0aW9uL3BhZ2UgdmlzaWJsZS4gRm9yIGV4YW1wbGU6IHtxdWVzdGlvbjF9ID0gJ3ZhbHVlMScgb3IgKHtxdWVzdGlvbjJ9ICoge3F1ZXN0aW9uNH0gID4gMjAgYW5kIHtxdWVzdGlvbjN9IDwgNSlcIixcbiAgICBleHByZXNzaW9uSGVscDpcbiAgICAgIFwiTW/FvmV0ZSBrb3Jpc3RpdGkga292csSNYXZlIG5vc2HEjWUga2FrbyBiaXN0ZSBkb2JpbGkgcHJpc3R1cCB2cmlqZWRub3N0aW1hIHBpdGFuamE6IHtxdWVzdGlvbjF9ICsge3F1ZXN0aW9uMn0sICh7cHJpY2V9KntxdWFudGl0eX0pICogKDEwMCAtIHtkaXNjb3VudH0pLiBGdW5rY2lqZSBtb8W+ZXRlIGtvcmlzdGl0aSBrYW86IGlpZigpLCB0b2RheSgpLCBhZ2UoKSwgbWluKCksIG1heCgpLCBjb3VudCgpLCBhdmcoKSBhbmQgb3RoZXJzLlwiLFxuICAgIGFjZUVkaXRvckhlbHA6XG4gICAgICBcIlByaXRpc25pdGUgY3RybCArIHByb3N0b3Iga2FrbyBiaXN0ZSBkb2JpbGkgc2F2amV0IG8gemF2csWhZXRrdSBla3NwcmVzaWplXCIsXG4gICAgYWNlRWRpdG9yUm93VGl0bGU6IFwiVHJlbnV0bmkgcmVka1wiLFxuICAgIGFjZUVkaXRvclBhbmVsVGl0bGU6IFwiVHJlbnV0bmEgcGxvxI1hXCIsXG4gICAgc2hvd01vcmU6IFwiVmnFoWUgZGV0YWxqYSBwb3RyYcW+aXRlIHUgZG9rdW1lbnRhY2lqaVwiLFxuICAgIC8vIGNvbmRpdGlvblNob3dNb3JlVXJsOlxuICAgIC8vICAgXCJodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeVBhcmFtZXRlcj9pZD1RdWVzdGlvbiZwYXJhbWV0ZXI9dmlzaWJsZUlmXCIsXG4gICAgYXNzaXN0YW50VGl0bGU6IFwiRG9zdHVwbmEgcGl0YW5qYTpcIixcbiAgICBjZWxsc0VtcHR5Um93c0NvbHVtbnM6IFwiVHJlYmFvIGJpIHBvc3RvamF0aSBiYXJlbSBqZWRhbiBzdHVwYWMgaWxpIHJlZFwiLFxuXG4gICAgcHJvcGVydHlJc0VtcHR5OiBcIlVuZXNpdGUgdnJpamVkbm9zdFwiLFxuICAgIHByb3BlcnR5SXNOb1VuaXF1ZTogXCJVbmVzaXRlIGplZGluc3R2ZW51IHZyaWplZG5vc3RcIixcbiAgICBwcm9wZXJ0eU5hbWVJc05vdFVuaXF1ZTogXCJVbmVzaXRlIGplZGluc3R2ZW5vIGltZVwiLFxuICAgIGxpc3RJc0VtcHR5OiBcIkRvZGF2YW5qZSBub3ZlIHN0YXZrZVwiLFxuICAgIGV4cHJlc3Npb25Jc0VtcHR5OiBcIkl6cmF6IGplIHByYXphblwiLFxuICAgIHZhbHVlOiBcIlZyaWplZG5vc3RcIixcbiAgICB0ZXh0OiBcInRla3N0XCIsXG4gICAgcm93aWQ6IFwiSUQgcmVkYWthXCIsXG4gICAgaW1hZ2VMaW5rOiBcIlZlemEgc2xpa2VcIixcbiAgICBjb2x1bW5FZGl0OiBcIlVyZcSRaXZhbmplIHN0dXBjYTogezB9XCIsXG4gICAgaXRlbUVkaXQ6IFwiVXJlxJFpdmFuamUgc3RhdmtlOiB7MH1cIixcblxuICAgIHVybDogXCJVcmxcIixcbiAgICBwYXRoOiBcIlB1dFwiLFxuICAgIHZhbHVlTmFtZTogXCJOYXppdiB2cmlqZWRub3N0aVwiLFxuICAgIHRpdGxlTmFtZTogXCJOYXppdiBuYXNsb3ZhXCIsXG4gICAgdGl0bGVQbGFjZWhvbGRlcjogXCJVbGF6bmkgbmFzbG92IG92ZGplXCIsXG4gICAgc3VydmV5VGl0bGVQbGFjZWhvbGRlcjogXCJOYXNsb3YgdWxhem5lIGFua2V0ZSBvdmRqZVwiLFxuICAgIHBhZ2VUaXRsZVBsYWNlaG9sZGVyOiBcIk5hc2xvdiB1bGF6bmUgc3RyYW5pY2Ugb3ZkamVcIixcbiAgICBkZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcIlVuZXNpdGUgb3Bpc1wiLFxuICAgIHN1cnZleURlc2NyaXB0aW9uUGxhY2Vob2xkZXI6IFwiVW5lc2l0ZSBvcGlzIGFua2V0ZVwiLFxuICAgIHBhZ2VEZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcIlVuZXNpdGUgb3BpcyBzdHJhbmljZVwiLFxuXG4gICAgaGFzT3RoZXI6IFwiSW1hIGkgZHJ1Z3Ugc3Rhdmt1XCIsXG4gICAgb3RoZXJUZXh0OiBcIlRla3N0IGRydWdlIHN0YXZrZVwiLFxuICAgIGhhc05vbmU6IFwiTmVtYSBzdGF2a3VcIixcbiAgICBub25lVGV4dDogXCJOaWplZGFuIHRla3N0IHN0YXZrZVwiLFxuICAgIGhhc1NlbGVjdEFsbDogXCJTYWRyxb5pIG9kYWJlcml0ZSBzdmUgc3RhdmtlXCIsXG4gICAgc2VsZWN0QWxsVGV4dDogXCJPZGFiZXJpdGUgc3ZlIHN0YXZrZSB0ZWtzdFwiLFxuICAgIGNob2ljZXNNaW46IFwiTWluaW1hbG5hIHZyaWplZG5vc3QgemEgYXV0b21hdHNraSBnZW5lcmlyYW5lIHN0YXZrZVwiLFxuICAgIGNob2ljZXNNYXg6IFwiTWFrc2ltYWxuYSB2cmlqZWRub3N0IHphIGF1dG9tYXRza2kgZ2VuZXJpcmFuZSBzdGF2a2VcIixcbiAgICBjaG9pY2VzU3RlcDogXCJSYXpsaWthIGl6bWXEkXUgYXV0b21hdHNraSBnZW5lcmlyYW5paCBzdGF2a2lcIixcbiAgICBuYW1lOiBcIkltZVwiLFxuICAgIHRpdGxlOiBcIk5hc2xvdlwiLFxuICAgIGNlbGxUeXBlOiBcIlZyc3RhIMSHZWxpamVcIixcbiAgICBjb2xDb3VudDogXCJCcm9qIHN0dXBhY2FcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwiT2RhYmVyaXRlIHJlZG9zbGlqZWQgaXpib3JhXCIsXG4gICAgdmlzaWJsZTogXCJKZSBsaSB2aWRsaml2bz9cIixcbiAgICBpc1JlcXVpcmVkOiBcIkplIHBvdHJlYm5vP1wiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwiWmFodGlqZXZhdGkgb2Rnb3ZvciB6YSBzdmUgcmVkb3ZlXCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwiUG90cmViYW4gdGVrc3QgcG9ncmXFoWtlXCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCJQb8SNaW5qZSBsaSBzIG5vdm9tIGxpbmlqb20/XCIsXG4gICAgcm93czogXCJCcm9qIHJlZGFrYVwiLFxuICAgIGNvbHM6IFwiQnJvaiBzdHVwYWNhXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwiRHLFvmHEjSB1bGF6bm9nIG1qZXN0YVwiLFxuICAgIHNob3dQcmV2aWV3OiBcIlByaWtheiBwb2RydcSNamEgcHJldHByZWdsZWRhXCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIlBvaHJhbml0ZSBzYWRyxb5haiBkYXRvdGVrZSB1IHJlenVsdGF0IEpTT04ga2FvIHRla3N0XCIsXG4gICAgbWF4U2l6ZTogXCJNYWtzaW1hbG5hIHZlbGnEjWluYSBkYXRvdGVrZSB1IGJ5dGVzXCIsXG4gICAgaW1hZ2VIZWlnaHQ6IFwiVmlzaW5hIHNsaWtlXCIsXG4gICAgaW1hZ2VXaWR0aDogXCLFoGlyaW5hIHNsaWtlXCIsXG4gICAgcm93Q291bnQ6IFwiQnJvaiByZWRha2FcIixcbiAgICBjb2x1bW5MYXlvdXQ6IFwiUmFzcG9yZWQgc3R1cGFjYVwiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcIkRvZGF2YW5qZSBsb2thY2lqZSBndW1iYSByZWRha2FcIixcbiAgICBhZGRSb3dUZXh0OiBcIkRvZGF2YW5qZSB0ZWtzdGEgZ3VtYmEgcmVkYWtcIixcbiAgICByZW1vdmVSb3dUZXh0OiBcIlVrbGFuamFuamUgdGVrc3RhIGd1bWJhIHJlZGFrYVwiLFxuICAgIHJhdGVNaW46IFwiTWluaW1hbG5hIHN0b3BhXCIsXG4gICAgcmF0ZU1heDogXCJNYWtzaW1hbG5hIHN0b3BhXCIsXG4gICAgcmF0ZVN0ZXA6IFwiS29yYWsgc3RvcGVcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwiT3BpcyBtaW5pbWFsbmUgc3RvcGVcIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwiT3BpcyBtYWtzaW1hbG5lIHN0b3BlXCIsXG4gICAgaW5wdXRUeXBlOiBcIlZyc3RhIHVub3NhXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiT3BpcyBvcGNpamFcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiWmFkYW5hIHZyaWplZG5vc3RcIixcbiAgICBjZWxsc0RlZmF1bHRSb3c6IFwiWmFkYW5pIHRla3N0b3ZpIMSHZWxpamFcIixcblxuICAgIHN1cnZleUVkaXRvclRpdGxlOiBcIlVyZcSRaXZhbmplIHBvc3RhdmtpIGFua2V0ZVwiLFxuICAgIHFFZGl0b3JUaXRsZTogXCJVcmXEkWl2YW5qZTogezB9XCIsXG5cbiAgICBtYXhMZW5ndGg6IFwiTWFrc2ltYWxuYSBkdWxqaW5hXCIsXG5cbiAgICBidWlsZEV4cHJlc3Npb246IFwiR3JhZGl0aVwiLFxuICAgIGVkaXRFeHByZXNzaW9uOiBcIlVyZcSRaXZhbmplXCIsXG4gICAgYW5kOiBcIklcIixcbiAgICBvcjogXCJJbGlcIixcbiAgICByZW1vdmU6IFwiVWtsb25pdGlcIixcbiAgICBhZGRDb25kaXRpb246IFwiRG9kYXZhbmplIHN0YW5qYVwiLFxuXG4gICAgLy9zdXJ2ZXlcbiAgICBzaG93VGl0bGU6IFwiUG9rYcW+aS9zYWtyaWogbmFzbG92XCIsXG4gICAgZXhwYW5kQ29sbGFwc2VUaXRsZTogXCJOYXNsb3YgcHJvxaFpcmVuamEva29sYXBzYVwiLFxuICAgIGxvY2FsZTogXCJaYWRhbmkgamV6aWtcIixcbiAgICBzaW11bGF0b3I6IFwiT2RhYmVyaXRlIHVyZcSRYWpcIixcbiAgICBsYW5kc2NhcGVPcmllbnRhdGlvbjogXCJLcmFqb2xpa1wiLFxuICAgIG1vZGU6IFwiTmHEjWluIHJhZGEgKHNhbW8gdXJlxJFpdmFuamUvxI1pdGFuamUpXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiSmFzbmUgbmV2aWRsaml2ZSB2cmlqZWRub3N0aVwiLFxuICAgIGNvb2tpZU5hbWU6IFwiTmF6aXYga29sYcSNacSHYSAob25lbW9ndcSHaXRpIGFua2V0dSBkdmEgcHV0YSBsb2thbG5vKVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcIlBvxaFhbGppdGUgcmV6dWx0YXRlIGFua2V0ZSBuYSBzbGplZGXEh3Ugc3RyYW5pY3VcIixcbiAgICBzdG9yZU90aGVyc0FzQ29tbWVudDogXCJQb2hyYW5pdGUgdnJpamVkbm9zdCAnb3RoZXJzJyB1IHphc2Vibm9tIHBvbGp1XCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwiUHJpa2F6YXRlIG5hc2xvdmUgc3RyYW5pY2FcIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwiUHJpa2F6YXRlIGJyb2pldmUgc3RyYW5pY2FcIixcbiAgICBwYWdlUHJldlRleHQ6IFwiVGVrc3QgcHJldGhvZG5vZyBndW1iYSBzdHJhbmljZVwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJUZWtzdCBzbGplZGXEh2VnIGd1bWJhIHN0cmFuaWNlXCIsXG4gICAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRlIGJ1dHRvbiB0ZXh0XCIsXG4gICAgcHJldmlld1RleHQ6IFwiVGVrc3QgZ3VtYmEgemEgcHJldHByZWdsZWRcIixcbiAgICBlZGl0VGV4dDogXCJVcmXEkWl2YW5qZSB0ZWtzdGEgZ3VtYmFcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwiVGVrc3QgZ3VtYmEgemEgcG9rcmV0YW5qZVwiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczogXCJQcmlrYWthbmplIG5hdmlnYWNpanNraWggdGlwa2kgKHphZGFuYSBuYXZpZ2FjaWphKVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOlxuICAgICAgXCJQcmlrYWduaXRlIHByZXRob2RuaSBndW1iIChrb3Jpc25payBzZSBtb8W+ZSB2cmF0aXRpIG5hIHByZXRob2RudSBzdHJhbmljdSlcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwiUHJ2YSBzdHJhbmljYSB1IGFua2V0aSBqZSBwb8SNZXRuYSBzdHJhbmljYS5cIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCJQcmlrYWd1xaFpdGUgZG92csWhZW51IHN0cmFuaWN1IG5hIGtyYWp1IChjb21wbGV0ZWRIdG1sKVwiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6XG4gICAgICBcIkthZGEgb2Rnb3ZhcmF0ZSBuYSBzdmEgcGl0YW5qYSwgaWRpdGUgYXV0b21hdHNraSBuYSBzbGplZGXEh3Ugc3RyYW5pY3VcIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwiUG9rYcW+aSB0cmFrdSBuYXByZXRrYVwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJMb2thY2lqYSBuYXNsb3ZhIHBpdGFuamFcIixcbiAgICByZXF1aXJlZFRleHQ6IFwiUGl0YW5qZSBqZSB6YWh0aWpldmFsbyBzaW1ib2xlXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcIkluZGVrcyBwb2tyZXRhbmphIHBpdGFuamEgKDEsIDIgaWxpICdBJywgJ2EnKVwiLFxuICAgIHNob3dRdWVzdGlvbk51bWJlcnM6IFwiUHJpa2F6YXRlIGJyb2pldmUgcGl0YW5qYVwiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTpcbiAgICAgIFwiUHJlZGxvxb5hayBuYXNsb3ZhIHBpdGFuamEsIHphZGFubyBqZTogJ3tub30uIHtyZXF1aXJlfSB7dGl0bGV9J1wiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJNamVzdG8gcG9ncmXFoWtlIHUgcGl0YW5qdVwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzpcbiAgICAgIFwiVXNyZWRvdG/EjWl0ZSBwcnZvIHBpdGFuamUgbmEgcHJvbWplbnUgc3RyYW5pY2VcIixcbiAgICBxdWVzdGlvbnNPcmRlcjogXCJSZWRvc2xpamVkIGVsZW1lbmF0YSBuYSBzdHJhbmljaVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJNYWtzaW1hbG5vIHZyaWplbWUgemEgZG92csWhYWplIGFua2V0ZVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiTWFrc2ltYWxubyB2cmlqZW1lIHphIGRvdnLFoWFuamUgc3RyYW5pY2UgdSBhbmtldGlcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCJQb2thxb5pIHBsb8SNdSB0aW1lcmFcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwiUHJpa2F6YXRlIG5hxI1pbiByYWRhIHRpbWVyIHBhbmVsYVwiLFxuICAgIHJlbmRlck1vZGU6IFwiTmHEjWluIHByaWthemFcIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIkRvcHVzdGl0ZSBkb2RhdmFuamUgcGxvxI1lXCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCJEb3B1c3RpdGUgdWtsYW5qYW5qZSBwbG/EjWVcIixcbiAgICBwYW5lbEFkZFRleHQ6IFwiRG9kYXZhbmplIHRla3N0YSBwYW5lbGFcIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwiUmVtb3ZpbmcgcGFuZWwgdGV4dFwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJVa2xhbmphbmplIHRla3N0YSBwbG/EjWVcIixcbiAgICBodG1sOiBcIkh0bWxcIixcbiAgICBleHByZXNzaW9uOiBcIkl6cmF6XCIsXG5cbiAgICBtaW5WYWx1ZTogXCJNaW5pbWFsbmEgdnJpamVkbm9zdFwiLFxuICAgIG1heFZhbHVlOiBcIk1ha3NpbWFsbmEgdnJpamVkbm9zdFwiLFxuICAgIG1pbkxlbmd0aDogXCJNaW5pbWFsbmEgZHVsamluYVwiLFxuICAgIGFsbG93RGlnaXRzOiBcIkRvcHVzdGl0ZSB6bmFtZW5rZVwiLFxuICAgIG1pbkNvdW50OiBcIk1pbmltYWxubyBicm9qYW5qZVwiLFxuICAgIG1heENvdW50OiBcIk1ha3NpbWFsbmkgYnJvalwiLFxuICAgIHJlZ2V4OiBcIlJlZG92aXRpIGl6cmF6XCIsXG5cbiAgICB0b3RhbFRleHQ6IFwiVWt1cGFuIHRla3N0XCIsXG4gICAgdG90YWxUeXBlOiBcIlVrdXBuYSB2cnN0YVwiLFxuICAgIHRvdGFsRXhwcmVzc2lvbjogXCJVa3VwbmkgaXpyYXpcIixcbiAgICB0b3RhbERpc3BsYXlTdHlsZTogXCJVa3VwYW4gc3RpbCBwcmlrYXphXCIsXG4gICAgdG90YWxDdXJyZW5jeTogXCJVa3VwbmEgdmFsdXRhXCIsXG4gICAgdG90YWxGb3JtYXQ6IFwiVWt1cGFuIGZvcm1hdFwiLFxuXG4gICAgLy8gSGVhZGVyICBhZG9ybmVyXG4gICAgbG9nb1Bvc2l0aW9uOiBcIlBvbG/FvmFqIGxvZ290aXBhXCIsXG4gICAgYWRkTG9nbzogXCJEb2RhdmFuamUgbG9nb3RpcGEuLi5cIixcbiAgICBjaGFuZ2VMb2dvOiBcIlByb21qZW5hIGxvZ290aXBhLi4uXCIsXG4gICAgbG9nb1Bvc2l0aW9uczoge1xuICAgICAgbm9uZTogXCJVa2xhbmphbmplIGxvZ290aXBhXCIsXG4gICAgICBsZWZ0OiBcIkxpamV2b1wiLFxuICAgICAgcmlnaHQ6IFwiRGVzbm9cIixcbiAgICAgIHRvcDogXCJOYSB2cmh1XCIsXG4gICAgICBib3R0b206IFwiTmEgZG51XCIsXG4gICAgfSxcblxuICAgIHRhYnM6IHtcbiAgICAgIGdlbmVyYWw6IFwiT3DEh2VuaXRvXCIsXG4gICAgICBmaWxlT3B0aW9uczogXCJNb2d1xIdub3N0aVwiLFxuICAgICAgaHRtbDogXCJIdG1sIEVkaXRvclwiLFxuICAgICAgY29sdW1uczogXCJTdHVwY2VcIixcbiAgICAgIHJvd3M6IFwiUmVkYWthXCIsXG4gICAgICBjaG9pY2VzOiBcIkl6Ym9yYVwiLFxuICAgICAgaXRlbXM6IFwiU3RhdmtlXCIsXG4gICAgICB2aXNpYmxlSWY6IFwiVmlkbGppdm8gYWtvXCIsXG4gICAgICBlbmFibGVJZjogXCJPbW9ndcSHaSBha29cIixcbiAgICAgIHJlcXVpcmVkSWY6IFwiUG90cmVibm8gYWtvXCIsXG4gICAgICByYXRlVmFsdWVzOiBcIlZyaWplZG5vc3RpIGNpamVuYVwiLFxuICAgICAgY2hvaWNlc0J5VXJsOiBcIkl6Ym9yaSBzIHdlYmFcIixcbiAgICAgIG1hdHJpeENob2ljZXM6IFwiWmFkYW5pIGl6Ym9yaVwiLFxuICAgICAgbXVsdGlwbGVUZXh0SXRlbXM6IFwiVW5vc2kgdGVrc3RhXCIsXG4gICAgICBudW1iZXJpbmc6IFwiTnVtZXJpcmFuamVcIixcbiAgICAgIHZhbGlkYXRvcnM6IFwiVmFsaWRhdG9yaVwiLFxuICAgICAgbmF2aWdhdGlvbjogXCJOYXZpZ2FjaWphXCIsXG4gICAgICBxdWVzdGlvbjogXCJQaXRhbmplXCIsXG4gICAgICBwYWdlczogXCJTdHJhbmljZVwiLFxuICAgICAgY29tcGxldGVkSHRtbDogXCJaYXZyxaFpbyBIdG1sXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb246IFwiWmF2csWhZW5vIEh0bWwgcG9kIHV2amV0b21cIixcbiAgICAgIGxvYWRpbmdIdG1sOiBcIlXEjWl0YXZhbmplIEh0bWxcIixcbiAgICAgIHRpbWVyOiBcIlRpbWVyL0t2aXpcIixcbiAgICAgIGNhbGN1bGF0ZWRWYWx1ZXM6IFwiSXpyYcSNdW5hdGUgdnJpamVkbm9zdGlcIixcbiAgICAgIHRyaWdnZXJzOiBcIkFrdGl2aXJhXCIsXG4gICAgICB0ZW1wbGF0ZVRpdGxlOiBcIk5hc2xvdiBwcmVkbG/FoWthXCIsXG4gICAgICB0b3RhbHM6IFwiWmJyb2pldmVcIixcbiAgICAgIGxvZ2ljOiBcIkxvZ2lrYVwiLFxuICAgICAgbGF5b3V0OiBcIkl6Z2xlZFwiLFxuICAgICAgZGF0YTogXCJQb2RhdGFrYVwiLFxuICAgICAgdmFsaWRhdGlvbjogXCJQcm92amVyYSB2YWxqYW5vc3RpXCIsXG4gICAgICBjZWxsczogXCLEhmVsaWplXCIsXG4gICAgICBzaG93T25Db21wbGV0ZWQ6IFwiUHJpa2F6dWplIHNlIG5hIGRvdnLFoWVub21cIixcbiAgICAgIGxvZ286IFwiTG9nb3RpcCB1IG5hc2xvdnUgYW5rZXRlXCIsXG4gICAgICBzbGlkZXI6IFwiS2xpemHEjVwiLFxuICAgICAgb3RoZXJzOiBcIkRydWdpXCIsXG4gICAgfSxcbiAgICBlZGl0UHJvcGVydHk6IFwiVXJlxJFpdmFuamUgb2JqZWt0YSAnezB9J1wiLFxuICAgIGl0ZW1zOiBcIlsgU3RhdmtlOiB7MH0gXVwiLFxuXG4gICAgZW50ZXJOZXdWYWx1ZTogXCJVbmVzaXRlIHZyaWplZG5vc3QuXCIsXG4gICAgbm9xdWVzdGlvbnM6IFwiVSBhbmtldGkgbmVtYSBuaWtha3ZvZyBwaXRhbmphLlwiLFxuICAgIGNyZWF0ZXRyaWdnZXI6IFwiSXpyYWRpdGUgb2tpZGHEjVwiLFxuICAgIHRpdGxlS2V5Ym9hcmRBZG9ybmVyVGlwOiBcIlByaXRpc25pdGUgZ3VtYiB6YSB1bm9zIHphIHVyZcSRaXZhbmplXCIsXG4gICAga2V5Ym9hcmRBZG9ybmVyVGlwOlxuICAgICAgXCJQcml0aXNuaXRlIGd1bWIgZW50ZXIgemEgdXJlxJFpdmFuamUgc3RhdmtlLCBwcml0aXNuaXRlIGd1bWIgemEgYnJpc2FuamUgc3RhdmtlLCBwcml0aXNuaXRlIGFsdCBwbHVzIHN0cmVsaWNhIHByZW1hIGdvcmUgaWxpIHN0cmVsaWNhIHByZW1hIGRvbGplIHphIHBvbWljYW5qZSBzdGF2a2UuXCIsXG4gICAgdHJpZ2dlck9uOiBcIk5hIFwiLFxuICAgIHRyaWdnZXJNYWtlUGFnZXNWaXNpYmxlOiBcIlXEjWluaXRlIHN0cmFuaWNlIHZpZGxqaXZpbWE6XCIsXG4gICAgdHJpZ2dlck1ha2VRdWVzdGlvbnNWaXNpYmxlOiBcIlXEjWluaXRlIGVsZW1lbnRlIHZpZGxqaXZpbWE6XCIsXG4gICAgdHJpZ2dlckNvbXBsZXRlVGV4dDogXCJEb3ZyxaFpdGUgYW5rZXR1IGFrbyB1c3BpamV0ZS5cIixcbiAgICB0cmlnZ2VyTm90U2V0OiBcIk9raWRhxI0gbmlqZSBwb3N0YXZsamVuXCIsXG4gICAgdHJpZ2dlclJ1bklmOiBcIlRyxI1hbmplIGFrb1wiLFxuICAgIHRyaWdnZXJTZXRUb05hbWU6IFwiUHJvbWplbmEgdnJpamVkbm9zdGk6IFwiLFxuICAgIHRyaWdnZXJGcm9tTmFtZTogXCJWcmlqZWRub3N0IGtvcGlyYW5qYSBpejogXCIsXG4gICAgdHJpZ2dlclJ1bkV4cHJlc3Npb246IFwiUG9zdGlzbmkgb3ZhaiBpenJhejpcIixcbiAgICB0cmlnZ2VyU2V0VmFsdWU6IFwiemE6IFwiLFxuICAgIHRyaWdnZXJHb3RvTmFtZTogXCJJZGkgbmEgcGl0YW5qZTpcIixcbiAgICB0cmlnZ2VySXNWYXJpYWJsZTogXCJOZSBzdGF2bGphanRlIHZhcmlqYWJsdSB1IHJlenVsdGF0IGFua2V0ZS5cIixcbiAgICB0cmlnZ2VyUnVuRXhwcmVzc2lvbkVtcHR5OiBcIlVuZXNpdGUgdmFsamFuaSBpenJhelwiLFxuXG4gICAgbm9GaWxlOiBcIk5lbWEgb2RhYmlyYSBkYXRvdGVrZVwiLFxuICB9LFxuICAvL1Byb3BlcnR5IHZhbHVlc1xuICBwdjoge1xuICAgIHRydWU6IFwiaXN0aW5hXCIsXG4gICAgZmFsc2U6IFwibGHFvm5lXCIsXG4gICAgaW5oZXJpdDogXCJuYXNsaWplZGl0aVwiLFxuICAgIHNob3c6IFwicG9rYXphdGlcIixcbiAgICBoaWRlOiBcInNha3JpalwiLFxuICAgIGRlZmF1bHQ6IFwiemFkYW5pXCIsXG4gICAgaW5pdGlhbDogXCJwb8SNZXRuaVwiLFxuICAgIHJhbmRvbTogXCJzbHXEjWFqYW5cIixcbiAgICBjb2xsYXBzZWQ6IFwic3J1xaFpb1wiLFxuICAgIGV4cGFuZGVkOiBcInByb8WhaXJpb1wiLFxuICAgIG5vbmU6IFwibml0a29cIixcbiAgICBhc2M6IFwidXpsYXpub1wiLFxuICAgIGRlc2M6IFwic2lsYXpub1wiLFxuICAgIGluZGV0ZXJtaW5hdGU6IFwibmVvZHJlxJFlbm9cIixcbiAgICBkZWNpbWFsOiBcImRlY2ltYWxuYVwiLFxuICAgIGN1cnJlbmN5OiBcInZhbHV0ZVwiLFxuICAgIHBlcmNlbnQ6IFwicG9zdG9cIixcbiAgICBmaXJzdEV4cGFuZGVkOiBcImZpcnN0RXhwYW5kZWRcIixcbiAgICBvZmY6IFwiaXNrbGp1xI1lbm9cIixcbiAgICBvblBhbmVsOiBcIm9uUGFuZWxcIixcbiAgICBvblN1cnZleTogXCJvblN1cnZleVwiLFxuICAgIGxpc3Q6IFwicG9waXNcIixcbiAgICBwcm9ncmVzc1RvcDogXCJwcm9ncmVzc1RvcFwiLFxuICAgIHByb2dyZXNzQm90dG9tOiBcInByb2dyZXNzQm90dG9tXCIsXG4gICAgcHJvZ3Jlc3NUb3BCb3R0b206IFwicHJvZ3Jlc3NUb3BCb3R0b21cIixcbiAgICBob3Jpem9udGFsOiBcImhvcml6b250YWxcIixcbiAgICB2ZXJ0aWNhbDogXCJ2ZXJ0aWNhbFwiLFxuICAgIHRvcDogXCJ0b3BcIixcbiAgICBib3R0b206IFwiYm90dG9tXCIsXG4gICAgdG9wQm90dG9tOiBcInRvcCBhbmQgYm90dG9tXCIsXG4gICAgYm90aDogXCJvYmFcIixcbiAgICBsZWZ0OiBcImxpamV2b1wiLFxuICAgIGNvbG9yOiBcImJvamFcIixcbiAgICBkYXRlOiBcImRhdHVtXCIsXG4gICAgZGF0ZXRpbWU6IFwiZGF0ZXRpbWVcIixcbiAgICBcImRhdGV0aW1lLWxvY2FsXCI6IFwiZGF0ZXRpbWUtbG9jYWxcIixcbiAgICBlbWFpbDogXCJlbWFpbFwiLFxuICAgIG1vbnRoOiBcIm1vbnRoXCIsXG4gICAgbnVtYmVyOiBcIm51bWJlclwiLFxuICAgIHBhc3N3b3JkOiBcInBhc3N3b3JkXCIsXG4gICAgcmFuZ2U6IFwicmFuZ2VcIixcbiAgICB0ZWw6IFwidGVsXCIsXG4gICAgdGV4dDogXCJ0ZXh0XCIsXG4gICAgdGltZTogXCJ0aW1lXCIsXG4gICAgdXJsOiBcInVybFwiLFxuICAgIHdlZWs6IFwid2Vla1wiLFxuICAgIGhpZGRlbjogXCJoaWRkZW5cIixcbiAgICBvbjogXCJvblwiLFxuICAgIG9uUGFnZTogXCJvblBhZ2VcIixcbiAgICBlZGl0OiBcImVkaXRcIixcbiAgICBkaXNwbGF5OiBcImRpc3BsYXlcIixcbiAgICBvbkNvbXBsZXRlOiBcIm9uQ29tcGxldGVcIixcbiAgICBvbkhpZGRlbjogXCJvbkhpZGRlblwiLFxuICAgIGFsbDogXCJhbGxcIixcbiAgICBwYWdlOiBcInBhZ2VcIixcbiAgICBzdXJ2ZXk6IFwic3VydmV5XCIsXG4gICAgb25OZXh0UGFnZTogXCJvbk5leHRQYWdlXCIsXG4gICAgb25WYWx1ZUNoYW5nZWQ6IFwib25WYWx1ZUNoYW5nZWRcIixcbiAgICBzaW5nbGVQYWdlOiBcInNpbmdsZSBwYWdlXCIsXG4gICAgc3RhbmRhcmQ6IFwic3RhbmRhcmRcIixcbiAgICBxdWVzdGlvblBlclBhZ2U6IFwicXVlc3Rpb24gcGVyIHBhZ2VcIixcbiAgICBub1ByZXZpZXc6IFwibm8gcHJldmlld1wiLFxuICAgIHNob3dBbGxRdWVzdGlvbnM6IFwic2hvdyBwcmV2aWV3IHdpdGggYWxsIHF1ZXN0aW9uc1wiLFxuICAgIHNob3dBbnN3ZXJlZFF1ZXN0aW9uczogXCJzaG93IHByZXZpZXcgd2l0aCBhbnN3ZXJlZCBxdWVzdGlvbnNcIixcbiAgfSxcbiAgLy9PcGVyYXRvcnNcbiAgb3A6IHtcbiAgICBlbXB0eTogXCJpcyBlbXB0eVwiLFxuICAgIG5vdGVtcHR5OiBcImlzIG5vdCBlbXB0eVwiLFxuICAgIGVxdWFsOiBcImVxdWFsc1wiLFxuICAgIG5vdGVxdWFsOiBcIm5vdCBlcXVhbHNcIixcbiAgICBjb250YWluczogXCJjb250YWluc1wiLFxuICAgIG5vdGNvbnRhaW5zOiBcIm5vdCBjb250YWluc1wiLFxuICAgIGFueW9mOiBcImFueSBvZlwiLFxuICAgIGFsbG9mOiBcImFsbCBvZlwiLFxuICAgIGdyZWF0ZXI6IFwiZ3JlYXRlclwiLFxuICAgIGxlc3M6IFwibGVzc1wiLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBcImdyZWF0ZXIgb3IgZXF1YWxzXCIsXG4gICAgbGVzc29yZXF1YWw6IFwibGVzcyBvciBlcXVhbHNcIixcbiAgICBhbmQ6IFwiYW5kXCIsXG4gICAgb3I6IFwib3JcIixcbiAgfSxcbiAgLy9FbWJlZCB3aW5kb3dcbiAgZXc6IHtcbiAgICBhbmd1bGFyOiBcIktvcmlzdGl0ZSBrdXRudSB2ZXJ6aWp1XCIsXG4gICAganF1ZXJ5OiBcIktvcmlzdGl0ZSBqUXVlcnkgdmVyemlqdVwiLFxuICAgIGtub2Nrb3V0OiBcIktvcmnFoXRlbmplIG5va2F1dCB2ZXJ6aWplXCIsXG4gICAgcmVhY3Q6IFwiS29yacWhdGVuamUgdmVyemlqZSBSZWFjdFwiLFxuICAgIHZ1ZTogXCJLb3Jpc3RpdGUgVnVlIHZlcnppanVcIixcbiAgICBib290c3RyYXA6IFwiWmEgYm9vdHN0cmFwIG9rdmlyXCIsXG4gICAgbW9kZXJuOiBcIk1vZGVybmEgdGVtYVwiLFxuICAgIGRlZmF1bHQ6IFwiWmFkYW5hIHRlbWFcIixcbiAgICBvcmFuZ2U6IFwiTmFyYW7EjWFzdGEgdGVtYVwiLFxuICAgIGRhcmtibHVlOiBcIkRhcmtibHVlIHRlbWFcIixcbiAgICBkYXJrcm9zZTogXCJEYXJrcm9zZSB0ZW1hXCIsXG4gICAgc3RvbmU6IFwiS2FtZW5hIHRlbWFcIixcbiAgICB3aW50ZXI6IFwiWmltc2thIHRlbWFcIixcbiAgICB3aW50ZXJzdG9uZTogXCJUZW1hIFppbXNrby1rYW1lblwiLFxuICAgIHNob3dPblBhZ2U6IFwiUG9rYcW+aXRlIGFua2V0dSBuYSBzdHJhbmljaVwiLFxuICAgIHNob3dJbldpbmRvdzogXCJQb2thxb5pdGUgYW5rZXR1IHUgcHJvem9ydVwiLFxuICAgIGxvYWRGcm9tU2VydmVyOiBcIlXEjWl0YXZhbmplIFN1cnZleSBKU09OIHMgcG9zbHXFvml0ZWxqYVwiLFxuICAgIHRpdGxlU2NyaXB0OiBcIlNrcmlwdGUgaSBzdGlsb3ZpXCIsXG4gICAgdGl0bGVIdG1sOiBcIkhUTUxcIixcbiAgICB0aXRsZUphdmFTY3JpcHQ6IFwiSmF2YVNjcmlwdFwiLFxuICB9LFxuICAvL1Rlc3QgU3VydmV5XG4gIHRzOiB7XG4gICAgc2VsZWN0UGFnZTogXCJPZGFiZXJpdGUgc3RyYW5pY3UgZGEgYmlzdGUgamUgdGVzdGlyYWxpOlwiLFxuICAgIHNob3dJbnZpc2libGVFbGVtZW50czogXCJQb2thxb5pIG5ldmlkbGppdmUgZWxlbWVudGVcIixcbiAgfSxcbiAgdmFsaWRhdG9yczoge1xuICAgIGFuc3dlcmNvdW50dmFsaWRhdG9yOiBcImJyb2ogb2Rnb3ZvcmFcIixcbiAgICBlbWFpbHZhbGlkYXRvcjogXCJlLW1haWxcIixcbiAgICBleHByZXNzaW9udmFsaWRhdG9yOiBcImV4cHJlc3Npb25cIixcbiAgICBudW1lcmljdmFsaWRhdG9yOiBcIm51bWVyaWNcIixcbiAgICByZWdleHZhbGlkYXRvcjogXCJyZWdleFwiLFxuICAgIHRleHR2YWxpZGF0b3I6IFwidGV4dFwiLFxuICB9LFxuICB0cmlnZ2Vyczoge1xuICAgIGNvbXBsZXRldHJpZ2dlcjogXCJwb3RwdW5hIGFua2V0YVwiLFxuICAgIHNldHZhbHVldHJpZ2dlcjogXCJwb3N0YXZsamVuYSB2cmlqZWRub3N0XCIsXG4gICAgY29weXZhbHVldHJpZ2dlcjogXCJ2cmlqZWRub3N0IGtvcGlyYW5qYVwiLFxuICAgIHNraXB0cmlnZ2VyOiBcInByZXNrb8SNaXRpIG5hIHBpdGFuamVcIixcbiAgICBydW5leHByZXNzaW9udHJpZ2dlcjogXCJwb2tyZW51dGkgaXpyYXpcIixcbiAgICB2aXNpYmxldHJpZ2dlcjogXCJwcm9tamVuYSB2aWRsaml2b3N0aSAoYW1vcnRpemlyYXRpKVwiLFxuICB9LFxuICBwZWhlbHA6IHtcbiAgICAvL2V4cHJlc3Npb246XG4gIH0sXG4gIC8vUHJvcGVydGllc1xuICBwOiB7XG4gICAgbmFtZTogXCJuYW1lXCIsXG4gICAgdGl0bGU6IHtcbiAgICAgIG5hbWU6IFwidGl0bGVcIixcbiAgICAgIHRpdGxlOiBcIk9zdGF2aXRlIHByYXpubywgYWtvIGplIGlzdG8ga2FvICdOYW1lJ1wiLFxuICAgIH0sXG5cbiAgICBuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHk6IFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwicXVlc3Rpb25zT3JkZXJcIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwibWF4VGltZVRvRmluaXNoXCIsXG5cbiAgICB2aXNpYmxlOiBcInZpc2libGVcIixcbiAgICB2aXNpYmxlSWY6IFwidmlzaWJsZUlmXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLFxuICAgIGRlc2NyaXB0aW9uOiBcImRlc2NyaXB0aW9uXCIsXG4gICAgc3RhdGU6IFwic3RhdGVcIixcbiAgICBpc1JlcXVpcmVkOiBcImlzUmVxdWlyZWRcIixcbiAgICByZXF1aXJlZElmOiBcInJlcXVpcmVkSWZcIixcbiAgICBpbmRlbnQ6IFwiaW5kZW50XCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwicmVxdWlyZWRFcnJvclRleHRcIixcbiAgICBzdGFydFdpdGhOZXdMaW5lOiBcInN0YXJ0V2l0aE5ld0xpbmVcIixcbiAgICBpbm5lckluZGVudDogXCJpbm5lckluZGVudFwiLFxuICAgIHBhZ2U6IFwicGFnZVwiLFxuXG4gICAgd2lkdGg6IFwid2lkdGhcIixcblxuICAgIGNvbW1lbnRUZXh0OiBcImNvbW1lbnRUZXh0XCIsXG4gICAgdmFsdWVOYW1lOiBcInZhbHVlTmFtZVwiLFxuICAgIGVuYWJsZUlmOiBcImVuYWJsZUlmXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcImRlZmF1bHRWYWx1ZVwiLFxuICAgIGNvcnJlY3RBbnN3ZXI6IFwiY29ycmVjdEFuc3dlclwiLFxuICAgIHJlYWRPbmx5OiBcInJlYWRPbmx5XCIsXG4gICAgdmFsaWRhdG9yczogXCJ2YWxpZGF0b3JzXCIsXG4gICAgdGl0bGVMb2NhdGlvbjogXCJ0aXRsZUxvY2F0aW9uXCIsXG5cbiAgICBoYXNDb21tZW50OiBcImhhc0NvbW1lbnRcIixcbiAgICBoYXNPdGhlcjogXCJoYXNPdGhlclwiLFxuICAgIGNob2ljZXM6IFwiY2hvaWNlc1wiLFxuICAgIGNob2ljZXNPcmRlcjogXCJjaG9pY2VzT3JkZXJcIixcbiAgICBjaG9pY2VzQnlVcmw6IFwiY2hvaWNlc0J5VXJsXCIsXG4gICAgb3RoZXJUZXh0OiBcIm90aGVyVGV4dFwiLFxuICAgIG90aGVyRXJyb3JUZXh0OiBcIm90aGVyRXJyb3JUZXh0XCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIixcblxuICAgIGxhYmVsOiBcImxhYmVsXCIsXG4gICAgc2hvd1RpdGxlOiBcInNob3dUaXRsZVwiLFxuICAgIHZhbHVlVHJ1ZTogXCJ2YWx1ZVRydWVcIixcbiAgICB2YWx1ZUZhbHNlOiBcInZhbHVlRmFsc2VcIixcblxuICAgIGNvbHM6IFwiY29sc1wiLFxuICAgIHJvd3M6IFwicm93c1wiLFxuICAgIHBsYWNlSG9sZGVyOiBcInBsYWNlSG9sZGVyXCIsXG5cbiAgICBvcHRpb25zQ2FwdGlvbjogXCJvcHRpb25zQ2FwdGlvblwiLFxuXG4gICAgZXhwcmVzc2lvbjogXCJleHByZXNzaW9uXCIsXG4gICAgZm9ybWF0OiBcImZvcm1hdFwiLFxuICAgIGRpc3BsYXlTdHlsZTogXCJkaXNwbGF5U3R5bGVcIixcbiAgICBjdXJyZW5jeTogXCJjdXJyZW5jeVwiLFxuICAgIHVzZUdyb3VwaW5nOiBcInVzZUdyb3VwaW5nXCIsXG5cbiAgICBzaG93UHJldmlldzogXCJzaG93UHJldmlld1wiLFxuICAgIGFsbG93TXVsdGlwbGU6IFwiYWxsb3dNdWx0aXBsZVwiLFxuICAgIGltYWdlSGVpZ2h0OiBcImltYWdlSGVpZ2h0XCIsXG4gICAgaW1hZ2VXaWR0aDogXCJpbWFnZVdpZHRoXCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcInN0b3JlRGF0YUFzVGV4dFwiLFxuICAgIG1heFNpemU6IFwibWF4U2l6ZVwiLFxuXG4gICAgaHRtbDogXCJodG1sXCIsXG5cbiAgICBjb2x1bW5zOiBcImNvbHVtbnNcIixcbiAgICBjZWxsczogXCJjZWxsc1wiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwiaXNBbGxSb3dSZXF1aXJlZFwiLFxuXG4gICAgaG9yaXpvbnRhbFNjcm9sbDogXCJob3Jpem9udGFsU2Nyb2xsXCIsXG4gICAgY2VsbFR5cGU6IFwiY2VsbFR5cGVcIixcbiAgICBjb2x1bW5zTGF5b3V0OiBcImNvbHVtbnNMYXlvdXRcIixcbiAgICBjb2x1bW5Db2xDb3VudDogXCJjb2x1bW5Db2xDb3VudFwiLFxuICAgIGNvbHVtbk1pbldpZHRoOiBcImNvbHVtbk1pbldpZHRoXCIsXG5cbiAgICByb3dDb3VudDogXCJyb3dDb3VudFwiLFxuICAgIG1pblJvd0NvdW50OiBcIm1pblJvd0NvdW50XCIsXG4gICAgbWF4Um93Q291bnQ6IFwibWF4Um93Q291bnRcIixcbiAgICBrZXlOYW1lOiBcImtleU5hbWVcIixcbiAgICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICBjb25maXJtRGVsZXRlOiBcImNvbmZpcm1EZWxldGVcIixcbiAgICBjb25maXJtRGVsZXRlVGV4dDogXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcImFkZFJvd0xvY2F0aW9uXCIsXG4gICAgYWRkUm93VGV4dDogXCJhZGRSb3dUZXh0XCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCJyZW1vdmVSb3dUZXh0XCIsXG5cbiAgICBpdGVtczogXCJpdGVtc1wiLFxuICAgIGl0ZW1TaXplOiBcIml0ZW1TaXplXCIsXG4gICAgY29sQ291bnQ6IFwiY29sQ291bnRcIixcblxuICAgIHRlbXBsYXRlVGl0bGU6IFwidGVtcGxhdGVUaXRsZVwiLFxuICAgIHRlbXBsYXRlRGVzY3JpcHRpb246IFwidGVtcGxhdGVEZXNjcmlwdGlvblwiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwiYWxsb3dBZGRQYW5lbFwiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwiYWxsb3dSZW1vdmVQYW5lbFwiLFxuICAgIHBhbmVsQ291bnQ6IFwicGFuZWxDb3VudFwiLFxuICAgIG1pblBhbmVsQ291bnQ6IFwibWluUGFuZWxDb3VudFwiLFxuICAgIG1heFBhbmVsQ291bnQ6IFwibWF4UGFuZWxDb3VudFwiLFxuICAgIHBhbmVsc1N0YXRlOiBcInBhbmVsc1N0YXRlXCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcInBhbmVsQWRkVGV4dFwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCJwYW5lbFJlbW92ZVRleHRcIixcbiAgICBwYW5lbFByZXZUZXh0OiBcInBhbmVsUHJldlRleHRcIixcbiAgICBwYW5lbE5leHRUZXh0OiBcInBhbmVsTmV4dFRleHRcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcInNob3dRdWVzdGlvbk51bWJlcnNcIixcbiAgICBzaG93UmFuZ2VJblByb2dyZXNzOiBcInNob3dSYW5nZUluUHJvZ3Jlc3NcIixcbiAgICByZW5kZXJNb2RlOiBcInJlbmRlck1vZGVcIixcbiAgICB0ZW1wbGF0ZVRpdGxlTG9jYXRpb246IFwidGVtcGxhdGVUaXRsZUxvY2F0aW9uXCIsXG5cbiAgICByYXRlVmFsdWVzOiBcInJhdGVWYWx1ZXNcIixcbiAgICByYXRlTWluOiBcInJhdGVNaW5cIixcbiAgICByYXRlTWF4OiBcInJhdGVNYXhcIixcbiAgICByYXRlU3RlcDogXCJyYXRlU3RlcFwiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCJtaW5SYXRlRGVzY3JpcHRpb25cIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsXG5cbiAgICBpbnB1dFR5cGU6IFwiaW5wdXRUeXBlXCIsXG4gICAgc2l6ZTogXCJzaXplXCIsXG5cbiAgICBsb2NhbGU6IFwibG9jYWxlXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcImZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpY1wiLFxuICAgIGNvbXBsZXRlZEh0bWw6IFwiY29tcGxldGVkSHRtbFwiLFxuICAgIGNvbXBsZXRlZEJlZm9yZUh0bWw6IFwiY29tcGxldGVkQmVmb3JlSHRtbFwiLFxuICAgIGxvYWRpbmdIdG1sOiBcImxvYWRpbmdIdG1sXCIsXG4gICAgdHJpZ2dlcnM6IFwidHJpZ2dlcnNcIixcbiAgICBjb29raWVOYW1lOiBcImNvb2tpZU5hbWVcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCJzZW5kUmVzdWx0T25QYWdlTmV4dFwiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczogXCJzaG93TmF2aWdhdGlvbkJ1dHRvbnNcIixcbiAgICBzaG93UHJldkJ1dHRvbjogXCJzaG93UHJldkJ1dHRvblwiLFxuICAgIHNob3dQYWdlVGl0bGVzOiBcInNob3dQYWdlVGl0bGVzXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwic2hvd0NvbXBsZXRlZFBhZ2VcIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwic2hvd1BhZ2VOdW1iZXJzXCIsXG4gICAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBcInF1ZXN0aW9uRXJyb3JMb2NhdGlvblwiLFxuICAgIHNob3dQcm9ncmVzc0JhcjogXCJzaG93UHJvZ3Jlc3NCYXJcIixcbiAgICBtb2RlOiBcIm1vZGVcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOiBcImdvTmV4dFBhZ2VBdXRvbWF0aWNcIixcbiAgICBjaGVja0Vycm9yc01vZGU6IFwiY2hlY2tFcnJvcnNNb2RlXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwic3RhcnRTdXJ2ZXlUZXh0XCIsXG4gICAgcGFnZVByZXZUZXh0OiBcInBhZ2VQcmV2VGV4dFwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJwYWdlTmV4dFRleHRcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiY29tcGxldGVUZXh0XCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInJlcXVpcmVkVGV4dFwiLFxuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogXCJxdWVzdGlvblN0YXJ0SW5kZXhcIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6IFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcImZpcnN0UGFnZUlzU3RhcnRlZFwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJpc1NpbmdsZVBhZ2VcIixcbiAgICBtYXhUaW1lVG9GaW5pc2hQYWdlOiBcIm1heFRpbWVUb0ZpbmlzaFBhZ2VcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCJzaG93VGltZXJQYW5lbFwiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCJzaG93VGltZXJQYW5lbE1vZGVcIixcblxuICAgIGRlZmF1bHRQYW5lbFZhbHVlOiBcImRlZmF1bHRQYW5lbFZhbHVlXCIsXG4gICAgZGVmYXVsdFJvd1ZhbHVlOiBcImRlZmF1bHRSb3dWYWx1ZVwiLFxuICAgIGhhc05vbmU6IFwiaGFzTm9uZVwiLFxuICAgIG5vbmVUZXh0OiBcIm5vbmVUZXh0XCIsXG5cbiAgICB0ZXh0OiBcInRleHRcIixcbiAgfSxcbn07XG5lZGl0b3JMb2NhbGl6YXRpb24ubG9jYWxlc1tcImhyXCJdID0gaHJTdHJpbmdzO1xuIiwiaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuXG5leHBvcnQgdmFyIGRhbmlzaFN0cmluZ3MgPSB7XG4gIC8vc3VydmV5IHRlbXBsYXRlc1xuICBzdXJ2ZXk6IHtcbiAgICBlZGl0OiBcIlJlZGlnZXJcIixcbiAgICBkcm9wUXVlc3Rpb246IFwiVHLDpmsgZXQgc3DDuHJnc23DpWwgaGVydGlsIGZyYSBwYWxldHRlbiB0aWwgdmVuc3RyZS5cIixcbiAgICBjb3B5OiBcIktvcGllclwiLFxuICAgIGFkZFRvVG9vbGJveDogXCJUaWxmw7hqIHRpbCBwYWxldHRlblwiLFxuICAgIGRlbGV0ZVBhbmVsOiBcIlNsZXQgcGFuZWxcIixcbiAgICBkZWxldGVRdWVzdGlvbjogXCJTbGV0IHNww7hyZ3Ntw6VsXCIsXG4gICAgY29udmVydFRvOiBcIktvbnZlcnRlciB0aWxcIixcbiAgICBkcmFnOiBcIlRyw6ZrIGVsZW1lbnRcIlxuICB9LFxuICAvL3F1ZXN0aW9uVHlwZXNcbiAgcXQ6IHtcbiAgICBkZWZhdWx0OiBcIlN0YW5kYXJkXCIsXG4gICAgY2hlY2tib3g6IFwiQWZrcnlkc25pbmdzZmVsdFwiLFxuICAgIGNvbW1lbnQ6IFwiS29tbWVudGFyXCIsXG4gICAgaW1hZ2VwaWNrZXI6IFwiQmlsbGVkdsOmbGdlclwiLFxuICAgIGRyb3Bkb3duOiBcIkRyb3Bkb3duXCIsXG4gICAgZmlsZTogXCJGaWxcIixcbiAgICBodG1sOiBcIkh0bWxcIixcbiAgICBtYXRyaXg6IFwiTWF0cmljZSAow6l0IHZhbGcpXCIsXG4gICAgbWF0cml4ZHJvcGRvd246IFwiTWF0cmljZSAoZmxlcmUgdmFsZylcIixcbiAgICBtYXRyaXhkeW5hbWljOiBcIk1hdHJpY2UgKGR5bmFtaXNrZSByw6Zra2VyKVwiLFxuICAgIG11bHRpcGxldGV4dDogXCJGbGVyZSB0ZWtzdGZlbHRlclwiLFxuICAgIHBhbmVsOiBcIlBhbmVsXCIsXG4gICAgcGFuZWxkeW5hbWljOiBcIlBhbmVsIChkeW5hbWlza2UgcGFuZWxlcilcIixcbiAgICByYWRpb2dyb3VwOiBcIkFsdGVybmF0aXZrbmFwXCIsXG4gICAgcmF0aW5nOiBcIlZ1cmRlcmluZ1wiLFxuICAgIHRleHQ6IFwiVGVrc3RmZWx0XCIsXG4gICAgYm9vbGVhbjogXCJTYW5kdC9mYWxza1wiLFxuICAgIGV4cHJlc3Npb246IFwiVWR0cnlrXCJcbiAgfSxcbiAgLy9TdHJpbmdzIGluIEVkaXRvclxuICBlZDoge1xuICAgIGRlZmF1bHRMb2NhbGU6IFwiU3RhbmRhcmQgKHswfSlcIixcbiAgICBzdXJ2ZXk6IFwiVW5kZXJzw7hnZWxzZVwiLFxuICAgIHNldHRpbmdzOiBcIkluZHN0aWxsaW5nZXIgZm9yIHVuZGVyc8O4Z2Vsc2VcIixcbiAgICBlZGl0U3VydmV5OiBcIlJlZGlnZXIgdW5kZXJzw7hnZWxzZVwiLFxuICAgIGFkZE5ld1BhZ2U6IFwiVGlsZsO4aiBueSBzaWRlXCIsXG4gICAgbW92ZVJpZ2h0OiBcIkfDpSB0aWwgaMO4anJlXCIsXG4gICAgbW92ZUxlZnQ6IFwiR8OlIHRpbCB2ZW5zdHJlXCIsXG4gICAgZGVsZXRlUGFnZTogXCJTbGV0IHNpZGVcIixcbiAgICBlZGl0UGFnZTogXCJSZWRpZ2VyIHNpZGVcIixcbiAgICBlZGl0OiBcIlJlZGlnZXJcIixcbiAgICBuZXdQYWdlTmFtZTogXCJzaWRlXCIsXG4gICAgbmV3UXVlc3Rpb25OYW1lOiBcInNww7hyZ3Ntw6VsXCIsXG4gICAgbmV3UGFuZWxOYW1lOiBcInBhbmVsXCIsXG4gICAgdGVzdFN1cnZleTogXCJBZnByw7h2IHVuZGVyc8O4Z2Vsc2VcIixcbiAgICB0ZXN0U3VydmV5QWdhaW46IFwiQWZwcsO4diB1bmRlcnPDuGdlbHNlIGlnZW5cIixcbiAgICB0ZXN0U3VydmV5V2lkdGg6IFwiQnJlZGRlIGFmIHVuZGVyc8O4Z2Vsc2U6IFwiLFxuICAgIGVtYmVkU3VydmV5OiBcIkluZGxlanIgdW5kZXJzw7hnZWxzZVwiLFxuICAgIHRyYW5zbGF0aW9uOiBcIk92ZXJzw6Z0dGVsc2VcIixcbiAgICBzYXZlU3VydmV5OiBcIkdlbSB1bmRlcnPDuGdlbHNlXCIsXG4gICAgZGVzaWduZXI6IFwiVW5kZXJzw7hnZWxzZXNkZXNpZ25lclwiLFxuICAgIGpzb25FZGl0b3I6IFwiSlNPTiBFZGl0b3JcIixcbiAgICB1bmRvOiBcIkZvcnRyeWRcIixcbiAgICByZWRvOiBcIkFubnVsbGVyIGZvcnRyeWRcIixcbiAgICBvcHRpb25zOiBcIkluZHN0aWxsaW5nZXJcIixcbiAgICBnZW5lcmF0ZVZhbGlkSlNPTjogXCJHZW5lcmVyIGd5bGRpbmcgSlNPTlwiLFxuICAgIGdlbmVyYXRlUmVhZGFibGVKU09OOiBcIkdlbmVyZXIgbMOmc2JhciBKU09OXCIsXG4gICAgdG9vbGJveDogXCJWw6Zya3TDuGpza2Fzc2VcIixcbiAgICB0b29sYm94R2VuZXJhbENhdGVnb3J5OiBcIkdlbmVyZWx0XCIsXG4gICAgZGVsU2VsT2JqZWN0OiBcIlNsZXQgdmFsZ3Qgb2JqZWt0XCIsXG4gICAgZWRpdFNlbE9iamVjdDogXCJSZWRpZ2VyIHZhbGd0IG9iamVrdFwiLFxuICAgIGNvcnJlY3RKU09OOiBcIlJldCB2ZW5saWdzdCBKU09OLlwiLFxuICAgIHN1cnZleVJlc3VsdHM6IFwiVW5kZXJzw7hnZWxzZXNyZXN1bHRhdDogXCIsXG4gICAgbW9kaWZpZWQ6IFwiw4ZuZHJldFwiLFxuICAgIHNhdmluZzogXCJHZW1tZXJcIixcbiAgICBzYXZlZDogXCJHZW10XCIsXG4gICAgc2F2ZUVycm9yOiBcIkZlamwhIFVuZGVyc8O4Z2Vsc2VuIGVyIGlra2UgYmxldmV0IGdlbXQuXCIsXG4gICAgdHJhbnNsYXRpb25BZGRMYW5ndWFnZTogXCJWw6ZsZyBldCBzcHJvZyBhdCBvdmVyc8OmdHRlXCIsXG4gICAgdHJhbnNsYXRpb25TaG93QWxsU3RyaW5nczogXCJWaXMgYWxsZSB0ZWtzdHN0cmVuZ2VcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxQYWdlczogXCJWaXMgYWxsZSBzaWRlclwiLFxuICAgIHRyYW5zbGF0aW9uTm9TdHJpbmdzOiBcIkluZ2VuIHRla3N0c3RyZW5nZSBhdCBvdmVyc8OmdHRlLiBSZXQgZmlsdGVyZXQuXCIsXG4gICAgdHJhbnNsYXRpb25FeHBvcnRUb1NDVkJ1dHRvbjogXCJFa3Nwb3J0ZXIgdGlsIENTVlwiLFxuICAgIHRyYW5zbGF0aW9uSW1wb3J0RnJvbVNDVkJ1dHRvbjogXCJJbXBvcnRlciBmcmEgQ1NWXCIsXG4gICAgdHJhbnNsYXRpb25NZXJnZUxvY2FsZVdpdGhEZWZhdWx0OiBcIkZsZXQgezB9IG1lZCBzdGFuZGFyZHNwcm9nXCJcbiAgfSxcbiAgLy9Qcm9wZXJ0eSBuYW1lcyBpbiB0YWJsZSBoZWFkZXJzXG4gIHBlbDoge1xuICAgIGlzUmVxdWlyZWQ6IFwiUMOla3LDpnZldD9cIlxuICB9LFxuICAvL1Byb3BlcnR5IEVkaXRvcnNcbiAgcGU6IHtcbiAgICBhcHBseTogXCJBbnZlbmRcIixcbiAgICBvazogXCJPS1wiLFxuICAgIGNhbmNlbDogXCJBbm51bGxlclwiLFxuICAgIHJlc2V0OiBcIk51bHN0aWxcIixcbiAgICBjbG9zZTogXCJMdWtcIixcbiAgICBkZWxldGU6IFwiU2xldFwiLFxuICAgIGFkZE5ldzogXCJUaWxmw7hqIG55XCIsXG4gICAgYWRkSXRlbTogXCJLbGlrIGZvciBhdCB0aWxmw7hqZS4uLlwiLFxuICAgIHJlbW92ZUFsbDogXCJGamVybiBhbGxlXCIsXG4gICAgZWRpdDogXCJSZWRpZ2VyXCIsXG4gICAgaXRlbVZhbHVlRWRpdDogXCJTeW5saWcgaHZpc1wiLFxuICAgIGVkaXRDaG9pY2VzOiBcIlJlZGlnZXIgdmFsZ211bGlnaGVkZXJcIixcbiAgICBtb3ZlOiBcIkZseXRcIixcbiAgICBlbXB0eTogXCI8dG9tPlwiLFxuICAgIG5vdEVtcHR5OiBcIjxyZWRpZ8OpciB2w6ZyZGk+XCIsXG4gICAgZmFzdEVudHJ5OiBcIkZhc3QgRW50cnlcIixcbiAgICBmb3JtRW50cnk6IFwiRm9ybSBFbnRyeVwiLFxuICAgIHRlc3RTZXJ2aWNlOiBcIlRlc3QgdGhlIHNlcnZpY2VcIixcbiAgICBjb25kaXRpb25TZWxlY3RRdWVzdGlvbjogXCJWw6ZsZyBzcMO4cmdzbcOlbC4uLlwiLFxuICAgIGNvbmRpdGlvblZhbHVlUXVlc3Rpb25UaXRsZTogXCJJbmR0YXN0L3bDpmxnIHbDpnJkaVwiLFxuICAgIGNvbmRpdGlvbkJ1dHRvbkFkZDogXCJUaWxmw7hqXCIsXG4gICAgY29uZGl0aW9uQnV0dG9uUmVwbGFjZTogXCJFcnN0YXRcIixcbiAgICBjb25kaXRpb25IZWxwOlxuICAgICAgXCJJbmR0YXN0IGV0IGJvb2xzayB1ZHRyeWsuIERldCBza2FsIHJldHVybmVyZSB0cnVlIGZvciBhdCBob2xkZSBzcMO4cmdzbcOlbGV0L3NpZGVuIHN5bmxpZy4gRm9yIGVrc2VtcGVsOiB7cXVlc3Rpb24xfSA9ICd2YWx1ZTEnIG9yICh7cXVlc3Rpb24yfSAqIHtxdWVzdGlvbjR9ICA+IDIwIGFuZCB7cXVlc3Rpb24zfSA8IDUpXCIsXG4gICAgZXhwcmVzc2lvbkhlbHA6XG4gICAgICBcIkluZHRhc3QgZXQgdWR0cnlrLiBEdSBrYW4gYnJ1Z2Uga3LDuGxsZS1wYXJlbnRlc2VyIGZvciBhdCBmw6UgYWRnYW5nIHRpbCBzdmFyZW5lOiAne3F1ZXN0aW9uMX0gKyB7cXVlc3Rpb24yfScsICcoe3ByaWNlfSp7cXVhbnRpdHl9KSAqICgxMDAgLSB7ZGlzY291bnR9KSdcIixcbiAgICBhY2VFZGl0b3JIZWxwOiBcIlRhc3QgY3RybCtzcGFjZSBmb3IgaGrDpmxwIHRpbCBhdCBhZnNsdXR0ZSB1ZHRyeWtrZXRcIixcbiAgICBhY2VFZGl0b3JSb3dUaXRsZTogXCJBa3R1ZWwgcsOma2tlXCIsXG4gICAgYWNlRWRpdG9yUGFuZWxUaXRsZTogXCJBa3R1ZWx0IHBhbmVsXCIsXG4gICAgc2hvd01vcmU6IFwiU2UgZG9rdW1lbnRhdGlvbmVuIGZvciBmbGVyZSBpbmZvcm1hdGlvbmVyXCIsXG4gICAgY29uZGl0aW9uU2hvd01vcmVVcmw6XG4gICAgICBcImh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5UGFyYW1ldGVyP2lkPVF1ZXN0aW9uJnBhcmFtZXRlcj12aXNpYmxlSWZcIixcbiAgICBhc3Npc3RhbnRUaXRsZTogXCJUaWxnw6ZuZ2VsaWdlIHNww7hyZ3Ntw6VsOlwiLFxuICAgIGNlbGxzRW1wdHlSb3dzQ29sdW1uczogXCJEZXIgc2thbCB2w6ZyZSBtaW5kc3Qgw6luIGtvbG9ubmUgZWxsZXIgcsOma2tlXCIsXG5cbiAgICBwcm9wZXJ0eUlzRW1wdHk6IFwiSW5kdGFzdCBlbiB2w6ZyZGlcIixcbiAgICB2YWx1ZTogXCJWw6ZyZGlcIixcbiAgICB0ZXh0OiBcIlRla3N0XCIsXG4gICAgcm93aWQ6IFwiUsOma2tlIElEXCIsXG4gICAgaW1hZ2VMaW5rOiBcIkJpbGxlZGxpbmtcIixcbiAgICBjb2x1bW5FZGl0OiBcIlJlZGlnZXIga29sb25uZTogezB9XCIsXG4gICAgaXRlbUVkaXQ6IFwiUmVkaWfDqXI6IHswfVwiLFxuXG4gICAgdXJsOiBcIlVSTFwiLFxuICAgIHBhdGg6IFwiU3RpXCIsXG4gICAgdmFsdWVOYW1lOiBcIlbDpnJkaWVucyBuYXZuXCIsXG4gICAgdGl0bGVOYW1lOiBcIlRpdGVsbmF2blwiLFxuXG4gICAgaGFzT3RoZXI6IFwiSGFyIGFuZGV0IGVsZW1lbnRcIixcbiAgICBvdGhlclRleHQ6IFwiQW5kZXQgZWxlbWVudCB0ZWtzdFwiLFxuICAgIG5hbWU6IFwiTmF2blwiLFxuICAgIHRpdGxlOiBcIlRpdGVsXCIsXG4gICAgY2VsbFR5cGU6IFwiQ2VsbGV0eXBlXCIsXG4gICAgY29sQ291bnQ6IFwiQW50YWwga29sb25uZXJcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwiVsOmbGcgcsOma2tlZsO4bGdlIHDDpSB2YWxnXCIsXG4gICAgdmlzaWJsZTogXCJFciBzeW5saWc/XCIsXG4gICAgaXNSZXF1aXJlZDogXCJFciBww6VrcsOmdmV0P1wiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwiU2thbCBzdGFydGUgbWVkIG55IGxpbmllP1wiLFxuICAgIHJvd3M6IFwiQW50YWwgcsOma2tlclwiLFxuICAgIHBsYWNlSG9sZGVyOiBcIkhpbnQtdGVrc3RcIixcbiAgICBzaG93UHJldmlldzogXCJWaXNlcyBmb3Jow6VuZHN2aXNuaW5nIGFmIGJpbGxlZGVyP1wiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCJHZW0gZmlsaW5kaG9sZCBpIEpTT04tcmVzdWx0YXQgc29tIHRla3N0XCIsXG4gICAgbWF4U2l6ZTogXCJNYWtzaW1hbCBmaWxzdMO4cnJlbHNlIGkgYnl0ZXNcIixcbiAgICBpbWFnZUhlaWdodDogXCJCaWxsZWRow7hqZGVcIixcbiAgICBpbWFnZVdpZHRoOiBcIkJpbGxlZGJyZWRkZVwiLFxuICAgIHJvd0NvdW50OiBcIkFudGFsIHLDpmtrZXJcIixcbiAgICBjb2x1bW5MYXlvdXQ6IFwiS29sb25uZWxheW91dFwiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcIlRpbGbDuGogcsOma2tlIGtuYXBwbGFjZXJpbmdcIixcbiAgICBhZGRSb3dUZXh0OiBcIlRpbGbDuGogcsOma2tlIGtuYXB0ZWtzdFwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwiRmplcm4gcsOma2tlIGtuYXB0ZWtzdFwiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCJCZXNrcml2IGxhdmVzdGUgdnVyZGVyaW5nXCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcIkJlc2tyaXYgaMO4amVzdGUgdnVyZGVyaW5nXCIsXG4gICAgaW5wdXRUeXBlOiBcIklucHV0dHlwZVwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIk11bGlnaGVkZXIgdGVrc3RcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiU3RhbmRhcmR2w6ZyZGlcIixcbiAgICBjZWxsc0RlZmF1bHRSb3c6IFwiU3RhbmRhcmQgY2VsbGV0ZWtzdFwiLFxuXG4gICAgc3VydmV5RWRpdG9yVGl0bGU6IFwiUmVkaWdlciB1bmRlcnPDuGdlbHNlc2luZHN0aWxsaW5nZXJcIixcbiAgICBxRWRpdG9yVGl0bGU6IFwiUmVkaWfDqXI6IHswfVwiLFxuXG4gICAgbWF4TGVuZ3RoOiBcIk1heGltYWwgbMOmbmdkZVwiLFxuXG4gICAgLy9zdXJ2ZXlcbiAgICBzaG93VGl0bGU6IFwiVmlzL3NranVsIHRpdGVsXCIsXG4gICAgbG9jYWxlOiBcIlN0YW5kYXJkc3Byb2dcIixcbiAgICBtb2RlOiBcIk1vZGUgKHJlZGlnZXIvc2tyaXZlYmVza3l0dGV0KVwiLFxuICAgIGNsZWFySW52aXNpYmxlVmFsdWVzOiBcIkZqZXJuIHVzeW5saWdlIHbDpnJkaWVyXCIsXG4gICAgY29va2llTmFtZTogXCJDb29raWVuYXZuIChmb3IgYXQgdW5kZ8OlIGF0IGFmdmlrbGUgdW5kZXJzw7hnZWxzZW4gdG8gZ2FuZ2UgbG9rYWx0KVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcIlNlbmQgdW5kZXJzw7hnZWxzZXNyZXN1bHRhdGV0IHZlZCBuw6ZzdGUgc2lkZVwiLFxuICAgIHN0b3JlT3RoZXJzQXNDb21tZW50OiBcIkdlbSAnb3RoZXJzJyB2w6ZyZGllbiBpIGV0IHNlcGVyYXQgZmVsdFwiLFxuICAgIHNob3dQYWdlVGl0bGVzOiBcIlZpcyBzaWRldGl0bGVyXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcIlZpcyBzaWRlbnVtcmVcIixcbiAgICBwYWdlUHJldlRleHQ6IFwiRm9ycmlnZSBzaWRlIGtuYXB0ZWtzdFwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJOw6ZzdGUgc2lkZSBrbmFwdGVrc3RcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiRsOmcmRpZyBrbmFwdGVrc3RcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnQga25hcHRla3N0XCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIlZpcyBuYXZpZ2F0aW9uc2tuYXBwZXIgKHN0YW5kYXJkIG5hdmlnYXRpb24pXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwiVmlzIGZvcnJpZ2Uga25hcCAoYnJ1Z2VyZW4gbcOlIGfDpSB0aWxiYWdlIHRpbCBmb3JyaWdlIHNpZGUpXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcIkRlbiBmw7hyc3RlIHNpZGUgaW4gdW5kZXJzw7hnZWxzZW4gZXIgc3RhcnRlbiBww6UgdW5kZXJzw7hnZWxzZW4uXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwiVmlzIGFmc2x1dG5pbmdzc2lkZW4gdGlsIHNsdXQgKGNvbXBsZXRlZEh0bWwpXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzpcbiAgICAgIFwiR8OlIHRpbCBuw6ZzdGUgc2lkZSBhdXRvbWF0aXNrIG7DpXIgYWxsZSBzcMO4cmdzbcOlbCBlciBiZXN2YXJldFwiLFxuICAgIHNob3dQcm9ncmVzc0JhcjogXCJWaXMgZnJlbWRyaWZ0c2xpbmplXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcIlNww7hyZ3Ntw6Vsc3RpdGVsIHBsYWNlcmluZ1wiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJQw6VrcsOmdmV0IHNww7hyZ3Ntw6Vsc3N5bWJvbChlcilcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwiU3DDuHJnc23DpWwgc3RhcnRpbmRleCAoMSwgMiBlbGxlciAnQScsICdhJylcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIlZpcyBzcMO4cmdzbcOlbHNudW1yZVwiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTpcbiAgICAgIFwiU3DDuHJnc23DpWxzdGl0ZWwgdGVtcGxhdGUsIHN0YW5kYXJkIGVyOiAne25vfS4ge3JlcXVpcmV9IHt0aXRsZX0nXCIsXG4gICAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBcIlNww7hyZ3Ntw6Vsc2ZlamwgcGxhY2VyaW5nXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcIkZva3Vzw6lyIGbDuHJzdGUgc3DDuHJnc23DpWwgdmVkIHNpZGVza2lmdFwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcIlLDpmtrZWbDuGxnZSBhZiBzcMO4cmdzbcOlbCBww6Ugc2lkZW5cIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwiTWF4aW1hbCB0aWQgdGlsIGF0IGdlbm5lbWbDuHJlIHVuZGVyc8O4Z2Vsc2VuXCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCJNYXhpbWFsIHRpZCB0aWwgYXQgZ2VubmVtZsO4cmUgZW4gc2lkZSBpIHVuZGVyc8O4Z2Vsc2VuXCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwiVmlzIHRpZHNwYW5lbFwiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCJWaXMgdGlkc3BhbmVsIHRpbHN0YW5kXCIsXG4gICAgcmVuZGVyTW9kZTogXCJSZW5kZXJpbmdzdGlsc3RhbmRcIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIlRpbGxhZCBhdCB0aWxmw7hqZSBldCBwYW5lbFwiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwiVGlsbGFkIGF0IGZqZXJuZSBldCBwYW5lbFwiLFxuICAgIHBhbmVsQWRkVGV4dDogXCJUaWxmw7hqIHBhbmVsIHRla3N0XCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcIkZqZXJuIHBhbmVsIHRla3N0XCIsXG4gICAgaXNTaW5nbGVQYWdlOiBcIlZpcyBhbGxlIGVsZW1lbnRlciBww6Ugw6luIHNpZGVcIixcblxuICAgIHRhYnM6IHtcbiAgICAgIGdlbmVyYWw6IFwiR2VuZXJlbHRcIixcbiAgICAgIGZpbGVPcHRpb25zOiBcIkluZHN0aWxsaW5nZXJcIixcbiAgICAgIGh0bWw6IFwiSHRtbC1lZGl0b3JcIixcbiAgICAgIGNvbHVtbnM6IFwiS29sb25uZXJcIixcbiAgICAgIHJvd3M6IFwiUsOma2tlclwiLFxuICAgICAgY2hvaWNlczogXCJWYWxnbXVsaWdoZWRlclwiLFxuICAgICAgaXRlbXM6IFwiRWxlbWVudGVyXCIsXG4gICAgICB2aXNpYmxlSWY6IFwiU3lubGlnIGh2aXNcIixcbiAgICAgIGVuYWJsZUlmOiBcIkFrdGl2IGh2aXNcIixcbiAgICAgIHJhdGVWYWx1ZXM6IFwiQmVkw7htLXbDpnJkaWVyXCIsXG4gICAgICBjaG9pY2VzQnlVcmw6IFwiVmFsZ211bGlnaGVkZXIgZnJhIFdlYlwiLFxuICAgICAgbWF0cml4Q2hvaWNlczogXCJTdGFuZGFyZCB2YWxnbXVsaWdoZWRlclwiLFxuICAgICAgbXVsdGlwbGVUZXh0SXRlbXM6IFwiVGVrc3QgaW5wdXRtdWxpZ2hlZGVyXCIsXG4gICAgICB2YWxpZGF0b3JzOiBcIlZhbGlkZXJpbmdlclwiLFxuICAgICAgbmF2aWdhdGlvbjogXCJOYXZpZ2F0aW9uXCIsXG4gICAgICBxdWVzdGlvbjogXCJTcMO4cmdzbcOlbFwiLFxuICAgICAgY29tcGxldGVkSHRtbDogXCJGw6ZyZGlnIEh0bWxcIixcbiAgICAgIGxvYWRpbmdIdG1sOiBcIkluZGzDpnNlciBIdG1sXCIsXG4gICAgICB0aW1lcjogXCJUaWQvUXVpelwiLFxuICAgICAgdHJpZ2dlcnM6IFwiVHJpZ2dlcmVcIixcbiAgICAgIHRlbXBsYXRlVGl0bGU6IFwiU2thYmVsb24gdGl0ZWxcIlxuICAgIH0sXG4gICAgZWRpdFByb3BlcnR5OiBcIlJlZGlnZXIgZWdlbnNrYWIgJ3swfSdcIixcbiAgICBpdGVtczogXCJbIEVsZW1lbnQ6IHswfSBdXCIsXG5cbiAgICBlbnRlck5ld1ZhbHVlOiBcIkluZHRhc3QgdsOmcmRpZW4uXCIsXG4gICAgbm9xdWVzdGlvbnM6IFwiRGVyIGVyIGluZ2VuIHNww7hyZ3Ntw6VsIGkgdW5kZXJzw7hnZWxzZW4uXCIsXG4gICAgY3JlYXRldHJpZ2dlcjogXCJPcHJldCBlbiB0cmlnZ2VyXCIsXG4gICAgdHJpZ2dlck9uOiBcIlDDpSBcIixcbiAgICB0cmlnZ2VyTWFrZVBhZ2VzVmlzaWJsZTogXCJHw7hyIHNpZGVyIHN5bmxpZ2U6XCIsXG4gICAgdHJpZ2dlck1ha2VRdWVzdGlvbnNWaXNpYmxlOiBcIkfDuHIgc3DDuHJnc23DpWwgc3lubGlnZTpcIixcbiAgICB0cmlnZ2VyQ29tcGxldGVUZXh0OiBcIkFmbHNsdXQgc3DDuHJnZXNrZW1hIHZlZCBhdCBmb3J0c8OmdHRlLlwiLFxuICAgIHRyaWdnZXJOb3RTZXQ6IFwiVHJpZ2dlcmVyIGVyIGlra2Ugc2F0XCIsXG4gICAgdHJpZ2dlclJ1bklmOiBcIkFmdmlrbCBodmlzXCIsXG4gICAgdHJpZ2dlclNldFRvTmFtZTogXCLDhm5kciB2w6ZyZGllbiBhZjogXCIsXG4gICAgdHJpZ2dlckZyb21OYW1lOiBcIktvcGllciB2w6ZyZGkgZnJhOiBcIixcbiAgICB0cmlnZ2VyUnVuRXhwcmVzc2lvbjogXCJBZnZpa2wgZGV0dGUgdWR0cnlrOlwiLFxuICAgIHRyaWdnZXJTZXRWYWx1ZTogXCJ0aWw6IFwiLFxuICAgIHRyaWdnZXJJc1ZhcmlhYmxlOiBcIkdlbSBpa2tlIHZhcmlhYmxlbiBpIHVuZGVyc8O4Z2Vsc2VzcmVzdWx0YXRldC5cIlxuICB9LFxuICAvL1Byb3BlcnR5IHZhbHVlc1xuICBwdjoge1xuICAgIHRydWU6IFwidHJ1ZVwiLFxuICAgIGZhbHNlOiBcImZhbHNlXCIsXG4gICAgaW5oZXJpdDogXCJpbmhlcml0XCIsXG4gICAgc2hvdzogXCJzaG93XCIsXG4gICAgaGlkZTogXCJoaWRlXCIsXG4gICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgaW5pdGlhbDogXCJpbml0aWFsXCIsXG4gICAgcmFuZG9tOiBcInJhbmRvbVwiLFxuICAgIGNvbGxhcHNlZDogXCJjb2xsYXBzZWRcIixcbiAgICBleHBhbmRlZDogXCJleHBhbmRlZFwiLFxuICAgIG5vbmU6IFwibm9uZVwiLFxuICAgIGFzYzogXCJhc2NlbmRpbmdcIixcbiAgICBkZXNjOiBcImRlc2NlbmRpbmdcIixcbiAgICBpbmRldGVybWluYXRlOiBcImluZGV0ZXJtaW5hdGVcIixcbiAgICBkZWNpbWFsOiBcImRlY2ltYWxcIixcbiAgICBjdXJyZW5jeTogXCJjdXJyZW5jeVwiLFxuICAgIHBlcmNlbnQ6IFwicGVyY2VudFwiLFxuICAgIGZpcnN0RXhwYW5kZWQ6IFwiZmlyc3RFeHBhbmRlZFwiLFxuICAgIG9mZjogXCJvZmZcIixcbiAgICBvblBhbmVsOiBcIm9uUGFuZWxcIixcbiAgICBvblN1cnZleTogXCJvblN1cnZleVwiLFxuICAgIGxpc3Q6IFwibGlzdFwiLFxuICAgIHByb2dyZXNzVG9wOiBcInByb2dyZXNzVG9wXCIsXG4gICAgcHJvZ3Jlc3NCb3R0b206IFwicHJvZ3Jlc3NCb3R0b21cIixcbiAgICBwcm9ncmVzc1RvcEJvdHRvbTogXCJwcm9ncmVzc1RvcEJvdHRvbVwiLFxuICAgIGhvcml6b250YWw6IFwiaG9yaXpvbnRhbFwiLFxuICAgIHZlcnRpY2FsOiBcInZlcnRpY2FsXCIsXG4gICAgdG9wOiBcInRvcFwiLFxuICAgIGJvdHRvbTogXCJib3R0b21cIixcbiAgICB0b3BCb3R0b206IFwidG9wIGFuZCBib3R0b21cIixcbiAgICBsZWZ0OiBcImxlZnRcIixcbiAgICBjb2xvcjogXCJjb2xvclwiLFxuICAgIGRhdGU6IFwiZGF0ZVwiLFxuICAgIGRhdGV0aW1lOiBcImRhdGV0aW1lXCIsXG4gICAgXCJkYXRldGltZS1sb2NhbFwiOiBcImRhdGV0aW1lLWxvY2FsXCIsXG4gICAgZW1haWw6IFwiZW1haWxcIixcbiAgICBtb250aDogXCJtb250aFwiLFxuICAgIG51bWJlcjogXCJudW1iZXJcIixcbiAgICBwYXNzd29yZDogXCJwYXNzd29yZFwiLFxuICAgIHJhbmdlOiBcInJhbmdlXCIsXG4gICAgdGVsOiBcInRlbFwiLFxuICAgIHRleHQ6IFwidGV4dFwiLFxuICAgIHRpbWU6IFwidGltZVwiLFxuICAgIHVybDogXCJ1cmxcIixcbiAgICB3ZWVrOiBcIndlZWtcIixcbiAgICBoaWRkZW46IFwiaGlkZGVuXCIsXG4gICAgb246IFwib25cIixcbiAgICBvblBhZ2U6IFwib25QYWdlXCIsXG4gICAgZWRpdDogXCJlZGl0XCIsXG4gICAgZGlzcGxheTogXCJkaXNwbGF5XCIsXG4gICAgb25Db21wbGV0ZTogXCJvbkNvbXBsZXRlXCIsXG4gICAgb25IaWRkZW46IFwib25IaWRkZW5cIixcbiAgICBhbGw6IFwiYWxsXCIsXG4gICAgcGFnZTogXCJwYWdlXCIsXG4gICAgc3VydmV5OiBcInN1cnZleVwiLFxuICAgIG9uTmV4dFBhZ2U6IFwib25OZXh0UGFnZVwiLFxuICAgIG9uVmFsdWVDaGFuZ2VkOiBcIm9uVmFsdWVDaGFuZ2VkXCJcbiAgfSxcbiAgLy9PcGVyYXRvcnNcbiAgb3A6IHtcbiAgICBlbXB0eTogXCJpcyBlbXB0eVwiLFxuICAgIG5vdGVtcHR5OiBcImlzIG5vdCBlbXB0eVwiLFxuICAgIGVxdWFsOiBcImVxdWFsc1wiLFxuICAgIG5vdGVxdWFsOiBcIm5vdCBlcXVhbHNcIixcbiAgICBjb250YWluczogXCJjb250YWluc1wiLFxuICAgIG5vdGNvbnRhaW5zOiBcIm5vdCBjb250YWluc1wiLFxuICAgIGdyZWF0ZXI6IFwiZ3JlYXRlclwiLFxuICAgIGxlc3M6IFwibGVzc1wiLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBcImdyZWF0ZXIgb3IgZXF1YWxzXCIsXG4gICAgbGVzc29yZXF1YWw6IFwibGVzcyBvciBlcXVhbHNcIlxuICB9LFxuICAvL0VtYmVkIHdpbmRvd1xuICBldzoge1xuICAgIGFuZ3VsYXI6IFwiQmVueXQgQW5ndWxhciB2ZXJzaW9uXCIsXG4gICAganF1ZXJ5OiBcIkJlbnl0IGpRdWVyeSB2ZXJzaW9uXCIsXG4gICAga25vY2tvdXQ6IFwiQmVueXQgS25vY2tvdXQgdmVyc2lvblwiLFxuICAgIHJlYWN0OiBcIkJlbnl0IFJlYWN0IHZlcnNpb25cIixcbiAgICB2dWU6IFwiQmVueXQgVnVlIHZlcnNpb25cIixcbiAgICBib290c3RyYXA6IFwiRm9yIGJvb3RzdHJhcCBmcmFtZXdvcmtcIixcbiAgICBzdGFuZGFyZDogXCJJbmdlbiBib290c3RyYXBcIixcbiAgICBzaG93T25QYWdlOiBcIlZpcyB1bmRlcnPDuGdlbHNlbiBww6UgZW4gc2lkZVwiLFxuICAgIHNob3dJbldpbmRvdzogXCJWaXMgdW5kZXJzw7hnZWxzZW4gaSBldCB2aW5kdWVcIixcbiAgICBsb2FkRnJvbVNlcnZlcjogXCJIZW50IHVuZGVyc8O4Z2Vsc2VuIHNvbSBKU09OIGZyYSBzZXJ2ZXJlblwiLFxuICAgIHRpdGxlU2NyaXB0OiBcIlNjcmlwdHMgb2cgc3R5bGVzXCIsXG4gICAgdGl0bGVIdG1sOiBcIkhUTUxcIixcbiAgICB0aXRsZUphdmFTY3JpcHQ6IFwiSmF2YVNjcmlwdFwiXG4gIH0sXG4gIC8vVGVzdCBTdXJ2ZXlcbiAgdHM6IHtcbiAgICBzZWxlY3RQYWdlOiBcIlbDpmxnIHNpZGVuIGZvciBhdCB0ZXN0ZSBkZW46XCJcbiAgfSxcbiAgdmFsaWRhdG9yczoge1xuICAgIGFuc3dlcmNvdW50dmFsaWRhdG9yOiBcImFuc3dlciBjb3VudFwiLFxuICAgIGVtYWlsdmFsaWRhdG9yOiBcImUtbWFpbFwiLFxuICAgIGV4cHJlc3Npb252YWxpZGF0b3I6IFwiZXhwcmVzc2lvblwiLFxuICAgIG51bWVyaWN2YWxpZGF0b3I6IFwibnVtZXJpY1wiLFxuICAgIHJlZ2V4dmFsaWRhdG9yOiBcInJlZ2V4XCIsXG4gICAgdGV4dHZhbGlkYXRvcjogXCJ0ZXh0XCJcbiAgfSxcbiAgdHJpZ2dlcnM6IHtcbiAgICBjb21wbGV0ZXRyaWdnZXI6IFwidW5kZXJzw7hnZWxzZSBnZW5uZW1mw7hydFwiLFxuICAgIHNldHZhbHVldHJpZ2dlcjogXCJzw6Z0IHbDpnJkaVwiLFxuICAgIGNvcHl2YWx1ZXRyaWdnZXI6IFwia29wacOpciB2w6ZyZGlcIixcbiAgICBydW5leHByZXNzaW9udHJpZ2dlcjogXCJhZnZpa2wgdWR0cnlcIixcbiAgICB2aXNpYmxldHJpZ2dlcjogXCJza2lmdCBzeW5saWdoZWRcIlxuICB9LFxuICAvL1Byb3BlcnRpZXNcbiAgcDoge1xuICAgIG5hbWU6IFwibmF2blwiLFxuICAgIHRpdGxlOiB7XG4gICAgICBuYW1lOiBcInRpdGVsXCIsXG4gICAgICB0aXRsZTogXCJMYWQgZGVuIHbDpnJlIHRvbSBodmlzIGRldCBlciBkZXQgc2FtbWUgc29tICdOYXZuJ1wiXG4gICAgfSxcblxuICAgIG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eTogXCJuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHlcIixcbiAgICBxdWVzdGlvbnNPcmRlcjogXCJxdWVzdGlvbnNPcmRlclwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJtYXhUaW1lVG9GaW5pc2hcIixcblxuICAgIHZpc2libGU6IFwidmlzaWJsZVwiLFxuICAgIHZpc2libGVJZjogXCJ2aXNpYmxlSWZcIixcbiAgICBxdWVzdGlvblRpdGxlTG9jYXRpb246IFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsXG4gICAgZGVzY3JpcHRpb246IFwiZGVzY3JpcHRpb25cIixcbiAgICBzdGF0ZTogXCJzdGF0ZVwiLFxuICAgIGlzUmVxdWlyZWQ6IFwiaXNSZXF1aXJlZFwiLFxuICAgIGluZGVudDogXCJpbmRlbnRcIixcbiAgICByZXF1aXJlZEVycm9yVGV4dDogXCJyZXF1aXJlZEVycm9yVGV4dFwiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwic3RhcnRXaXRoTmV3TGluZVwiLFxuICAgIGlubmVySW5kZW50OiBcImlubmVySW5kZW50XCIsXG4gICAgcGFnZTogXCJwYWdlXCIsXG5cbiAgICB3aWR0aDogXCJ3aWR0aFwiLFxuXG4gICAgY29tbWVudFRleHQ6IFwiY29tbWVudFRleHRcIixcbiAgICB2YWx1ZU5hbWU6IFwidmFsdWVOYW1lXCIsXG4gICAgZW5hYmxlSWY6IFwiZW5hYmxlSWZcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiZGVmYXVsdFZhbHVlXCIsXG4gICAgY29ycmVjdEFuc3dlcjogXCJjb3JyZWN0QW5zd2VyXCIsXG4gICAgcmVhZE9ubHk6IFwicmVhZE9ubHlcIixcbiAgICB2YWxpZGF0b3JzOiBcInZhbGlkYXRvcnNcIixcbiAgICB0aXRsZUxvY2F0aW9uOiBcInRpdGxlTG9jYXRpb25cIixcblxuICAgIGhhc0NvbW1lbnQ6IFwiaGFzQ29tbWVudFwiLFxuICAgIGhhc090aGVyOiBcImhhc090aGVyXCIsXG4gICAgY2hvaWNlczogXCJjaG9pY2VzXCIsXG4gICAgY2hvaWNlc09yZGVyOiBcImNob2ljZXNPcmRlclwiLFxuICAgIGNob2ljZXNCeVVybDogXCJjaG9pY2VzQnlVcmxcIixcbiAgICBvdGhlclRleHQ6IFwib3RoZXJUZXh0XCIsXG4gICAgb3RoZXJFcnJvclRleHQ6IFwib3RoZXJFcnJvclRleHRcIixcbiAgICBzdG9yZU90aGVyc0FzQ29tbWVudDogXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLFxuXG4gICAgbGFiZWw6IFwibGFiZWxcIixcbiAgICBzaG93VGl0bGU6IFwic2hvd1RpdGxlXCIsXG4gICAgdmFsdWVUcnVlOiBcInZhbHVlVHJ1ZVwiLFxuICAgIHZhbHVlRmFsc2U6IFwidmFsdWVGYWxzZVwiLFxuXG4gICAgY29sczogXCJjb2xzXCIsXG4gICAgcm93czogXCJyb3dzXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwicGxhY2VIb2xkZXJcIixcblxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIm9wdGlvbnNDYXB0aW9uXCIsXG5cbiAgICBleHByZXNzaW9uOiBcImV4cHJlc3Npb25cIixcbiAgICBmb3JtYXQ6IFwiZm9ybWF0XCIsXG4gICAgZGlzcGxheVN0eWxlOiBcImRpc3BsYXlTdHlsZVwiLFxuICAgIGN1cnJlbmN5OiBcImN1cnJlbmN5XCIsXG4gICAgdXNlR3JvdXBpbmc6IFwidXNlR3JvdXBpbmdcIixcblxuICAgIHNob3dQcmV2aWV3OiBcInNob3dQcmV2aWV3XCIsXG4gICAgYWxsb3dNdWx0aXBsZTogXCJhbGxvd011bHRpcGxlXCIsXG4gICAgaW1hZ2VIZWlnaHQ6IFwiaW1hZ2VIZWlnaHRcIixcbiAgICBpbWFnZVdpZHRoOiBcImltYWdlV2lkdGhcIixcbiAgICBzdG9yZURhdGFBc1RleHQ6IFwic3RvcmVEYXRhQXNUZXh0XCIsXG4gICAgbWF4U2l6ZTogXCJtYXhTaXplXCIsXG5cbiAgICBodG1sOiBcImh0bWxcIixcblxuICAgIGNvbHVtbnM6IFwiY29sdW1uc1wiLFxuICAgIGNlbGxzOiBcImNlbGxzXCIsXG4gICAgaXNBbGxSb3dSZXF1aXJlZDogXCJpc0FsbFJvd1JlcXVpcmVkXCIsXG5cbiAgICBob3Jpem9udGFsU2Nyb2xsOiBcImhvcml6b250YWxTY3JvbGxcIixcbiAgICBjZWxsVHlwZTogXCJjZWxsVHlwZVwiLFxuICAgIGNvbHVtbnNMYXlvdXQ6IFwiY29sdW1uc0xheW91dFwiLFxuICAgIGNvbHVtbkNvbENvdW50OiBcImNvbHVtbkNvbENvdW50XCIsXG4gICAgY29sdW1uTWluV2lkdGg6IFwiY29sdW1uTWluV2lkdGhcIixcblxuICAgIHJvd0NvdW50OiBcInJvd0NvdW50XCIsXG4gICAgbWluUm93Q291bnQ6IFwibWluUm93Q291bnRcIixcbiAgICBtYXhSb3dDb3VudDogXCJtYXhSb3dDb3VudFwiLFxuICAgIGtleU5hbWU6IFwia2V5TmFtZVwiLFxuICAgIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgIGNvbmZpcm1EZWxldGU6IFwiY29uZmlybURlbGV0ZVwiLFxuICAgIGNvbmZpcm1EZWxldGVUZXh0OiBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgYWRkUm93TG9jYXRpb246IFwiYWRkUm93TG9jYXRpb25cIixcbiAgICBhZGRSb3dUZXh0OiBcImFkZFJvd1RleHRcIixcbiAgICByZW1vdmVSb3dUZXh0OiBcInJlbW92ZVJvd1RleHRcIixcblxuICAgIGl0ZW1zOiBcIml0ZW1zXCIsXG4gICAgaXRlbVNpemU6IFwiaXRlbVNpemVcIixcbiAgICBjb2xDb3VudDogXCJjb2xDb3VudFwiLFxuXG4gICAgdGVtcGxhdGVUaXRsZTogXCJ0ZW1wbGF0ZVRpdGxlXCIsXG4gICAgdGVtcGxhdGVEZXNjcmlwdGlvbjogXCJ0ZW1wbGF0ZURlc2NyaXB0aW9uXCIsXG4gICAgYWxsb3dBZGRQYW5lbDogXCJhbGxvd0FkZFBhbmVsXCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCJhbGxvd1JlbW92ZVBhbmVsXCIsXG4gICAgcGFuZWxDb3VudDogXCJwYW5lbENvdW50XCIsXG4gICAgbWluUGFuZWxDb3VudDogXCJtaW5QYW5lbENvdW50XCIsXG4gICAgbWF4UGFuZWxDb3VudDogXCJtYXhQYW5lbENvdW50XCIsXG4gICAgcGFuZWxzU3RhdGU6IFwicGFuZWxzU3RhdGVcIixcbiAgICBwYW5lbEFkZFRleHQ6IFwicGFuZWxBZGRUZXh0XCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcInBhbmVsUmVtb3ZlVGV4dFwiLFxuICAgIHBhbmVsUHJldlRleHQ6IFwicGFuZWxQcmV2VGV4dFwiLFxuICAgIHBhbmVsTmV4dFRleHQ6IFwicGFuZWxOZXh0VGV4dFwiLFxuICAgIHNob3dRdWVzdGlvbk51bWJlcnM6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLFxuICAgIHNob3dSYW5nZUluUHJvZ3Jlc3M6IFwic2hvd1JhbmdlSW5Qcm9ncmVzc1wiLFxuICAgIHJlbmRlck1vZGU6IFwicmVuZGVyTW9kZVwiLFxuICAgIHRlbXBsYXRlVGl0bGVMb2NhdGlvbjogXCJ0ZW1wbGF0ZVRpdGxlTG9jYXRpb25cIixcblxuICAgIHJhdGVWYWx1ZXM6IFwicmF0ZVZhbHVlc1wiLFxuICAgIHJhdGVNaW46IFwicmF0ZU1pblwiLFxuICAgIHJhdGVNYXg6IFwicmF0ZU1heFwiLFxuICAgIHJhdGVTdGVwOiBcInJhdGVTdGVwXCIsXG4gICAgbWluUmF0ZURlc2NyaXB0aW9uOiBcIm1pblJhdGVEZXNjcmlwdGlvblwiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCJtYXhSYXRlRGVzY3JpcHRpb25cIixcblxuICAgIGlucHV0VHlwZTogXCJpbnB1dFR5cGVcIixcbiAgICBzaXplOiBcInNpemVcIixcblxuICAgIGxvY2FsZTogXCJsb2NhbGVcIixcbiAgICBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWM6IFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljXCIsXG4gICAgY29tcGxldGVkSHRtbDogXCJjb21wbGV0ZWRIdG1sXCIsXG4gICAgY29tcGxldGVkQmVmb3JlSHRtbDogXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsXG4gICAgbG9hZGluZ0h0bWw6IFwibG9hZGluZ0h0bWxcIixcbiAgICB0cmlnZ2VyczogXCJ0cmlnZ2Vyc1wiLFxuICAgIGNvb2tpZU5hbWU6IFwiY29va2llTmFtZVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcInNlbmRSZXN1bHRPblBhZ2VOZXh0XCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcInNob3dOYXZpZ2F0aW9uQnV0dG9uc1wiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcInNob3dQcmV2QnV0dG9uXCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwic2hvd1BhZ2VUaXRsZXNcIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCJzaG93Q29tcGxldGVkUGFnZVwiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCJzaG93UGFnZU51bWJlcnNcIixcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwicXVlc3Rpb25FcnJvckxvY2F0aW9uXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcInNob3dQcm9ncmVzc0JhclwiLFxuICAgIG1vZGU6IFwibW9kZVwiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6IFwiZ29OZXh0UGFnZUF1dG9tYXRpY1wiLFxuICAgIGNoZWNrRXJyb3JzTW9kZTogXCJjaGVja0Vycm9yc01vZGVcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCJjbGVhckludmlzaWJsZVZhbHVlc1wiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJzdGFydFN1cnZleVRleHRcIixcbiAgICBwYWdlUHJldlRleHQ6IFwicGFnZVByZXZUZXh0XCIsXG4gICAgcGFnZU5leHRUZXh0OiBcInBhZ2VOZXh0VGV4dFwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJjb21wbGV0ZVRleHRcIixcbiAgICByZXF1aXJlZFRleHQ6IFwicmVxdWlyZWRUZXh0XCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcInF1ZXN0aW9uU3RhcnRJbmRleFwiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTogXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwiZmlyc3RQYWdlSXNTdGFydGVkXCIsXG4gICAgaXNTaW5nbGVQYWdlOiBcImlzU2luZ2xlUGFnZVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwibWF4VGltZVRvRmluaXNoUGFnZVwiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcInNob3dUaW1lclBhbmVsXCIsXG4gICAgc2hvd1RpbWVyUGFuZWxNb2RlOiBcInNob3dUaW1lclBhbmVsTW9kZVwiLFxuXG4gICAgZGVmYXVsdFBhbmVsVmFsdWU6IFwiZGVmYXVsdFBhbmVsVmFsdWVcIixcbiAgICBkZWZhdWx0Um93VmFsdWU6IFwiZGVmYXVsdFJvd1ZhbHVlXCIsXG4gICAgaGFzTm9uZTogXCJoYXNOb25lXCIsXG4gICAgbm9uZVRleHQ6IFwibm9uZVRleHRcIixcblxuICAgIHRleHQ6IFwidGV4dFwiLFxuICAgIG1pblZhbHVlOiBcIm1pbmltdW0gdmFsdWVcIixcbiAgICBtYXhWYWx1ZTogXCJtYXhpbXVtIHZhbHVlXCIsXG4gICAgbWluTGVuZ3RoOiBcIm1pbnVtdW0gbGVuZ3RoXCIsXG4gICAgbWF4TGVuZ3RoOiBcIm1heGltdW0gbGVuZ3RoXCIsXG4gICAgYWxsb3dEaWdpdHM6IFwiYWxsb3cgZGlnaXRzXCIsXG4gICAgbWluQ291bnQ6IFwibWludW11bSBjb3VudFwiLFxuICAgIG1heENvdW50OiBcIm1heGltdW0gY291bnRcIixcbiAgICByZWdleDogXCJyZWd1bGFyIGV4cHJlc3Npb25cIlxuICB9XG59O1xuXG5lZGl0b3JMb2NhbGl6YXRpb24ubG9jYWxlc1tcImRhXCJdID0gZGFuaXNoU3RyaW5ncztcbiIsIi8vVW5jb21tZW50IHRoaXMgbGluZSBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGVcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiwgZGVmYXVsdFN0cmluZ3MgfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5cbmV4cG9ydCB2YXIgbmxTdHJpbmdzID0ge1xuICAvL3N1cnZleSB0ZW1wbGF0ZXNcbiAgc3VydmV5OiB7XG4gICAgZWRpdDogXCJCZXdlcmtcIixcbiAgICBleHRlcm5hbEhlbHBMaW5rOiBcIkJla2lqayBlbiBsZWVyIGhvZSB1IGVucXXDqnRlcyBtYWFrdFwiLFxuICAgIGV4dGVybmFsSGVscExpbmtVcmw6XG4gICAgICBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2NoYW5uZWwvVUNIMnJ1OW9rSWNvb05aZnBJYnlxNHFRP3ZpZXdfYXM9c3Vic2NyaWJlclwiLFxuICAgIGRyb3BRdWVzdGlvbjogXCJTdGVsIGhpZXIgZWVuIHZyYWFnIHZhbnVpdCBkZSBUb29sYm94LlwiLFxuICAgIGFkZExvZ2ljSXRlbTogXCJNYWFrIGVlbiByZWdlbCBvbSBkZSBzdHJvb20gdmFuIGRlIGVucXXDqnRlIGFhbiB0ZSBwYXNzZW4uXCIsXG4gICAgY29weTogXCJLb3Bpw6tyZW5cIixcbiAgICBhZGRUb1Rvb2xib3g6IFwiVG9ldm9lZ2VuIGFhbiB0b29sYm94XCIsXG4gICAgZGVsZXRlUGFuZWw6IFwiUGFuZWVsIHZlcndpamRlcmVuXCIsXG4gICAgZGVsZXRlUXVlc3Rpb246IFwiVnJhYWcgdmVyd2lqZGVyZW5cIixcbiAgICBjb252ZXJ0VG86IFwiT216ZXR0ZW4gbmFhclwiLFxuICAgIGRyYWc6IFwiU2xlZXAgZWxlbWVudFwiLFxuICB9LFxuICAvL3F1ZXN0aW9uVHlwZXNcbiAgcXQ6IHtcbiAgICBkZWZhdWx0OiBcIlN0YW5kYWFyZFwiLFxuICAgIGNoZWNrYm94OiBcIlNlbGVjdGlldmFramVcIixcbiAgICBjb21tZW50OiBcIkNvbW1lbnRhYXJcIixcbiAgICBpbWFnZXBpY2tlcjogXCJBZmJlZWxpbmdzdnJhYWdcIixcbiAgICBpbWFnZTogXCJBZmJlZWxkaW5nXCIsXG4gICAgZHJvcGRvd246IFwiS2V1emVsaWpzdFwiLFxuICAgIGZpbGU6IFwiQmVzdGFuZHN1cGxvYWRcIixcbiAgICBodG1sOiBcIkh0bWxcIixcbiAgICBtYXRyaXg6IFwiTWF0cml4IChlbmtlbGUga2V1emUpXCIsXG4gICAgbWF0cml4ZHJvcGRvd246IFwiTWF0cml4IChtZWVya2V1emUpXCIsXG4gICAgbWF0cml4ZHluYW1pYzogXCJNYXRyaXggKGR5bmFtaXNjaGUgcmlqZW4pXCIsXG4gICAgbXVsdGlwbGV0ZXh0OiBcIk1lZXJ2b3VkaWdlIHRla3N0dmFrXCIsXG4gICAgcGFuZWw6IFwiUGFuZWVsXCIsXG4gICAgcGFuZWxkeW5hbWljOiBcIlBhbmVlbCAoZHluYW1pc2NoZSBwYW5lbGVuKVwiLFxuICAgIHJhZGlvZ3JvdXA6IFwiTWVlcmtldXpldnJhYWdcIixcbiAgICByYXRpbmc6IFwiQmVvb3JkZWxpbmdcIixcbiAgICB0ZXh0OiBcIlRla3N0dmFrXCIsXG4gICAgYm9vbGVhbjogXCJCb29sZWFuXCIsXG4gICAgZXhwcmVzc2lvbjogXCJCZXJla2VuaW5nXCIsXG4gICAgc2lnbmF0dXJlcGFkOiBcIkhhbmR0ZWtlbmluZ1wiLFxuICAgIGZsb3dwYW5lbDogXCJTdHJvb21wYW5lZWxcIixcbiAgfSxcbiAgLy9TdHJpbmdzIGluIEVkaXRvclxuICBlZDoge1xuICAgIGRlZmF1bHRMb2NhbGU6IFwiU3RhbmRhYXJkICh7MH0pXCIsXG4gICAgc3VydmV5OiBcIkVucXXDqnRlXCIsXG4gICAgc2V0dGluZ3M6IFwiRW5xdcOqdGUtaW5zdGVsbGluZ2VuXCIsXG4gICAgc2V0dGluZ3NUb29sdGlwOiBcIk9wZW4gZW5xdcOqdGUtaW5zdGVsbGluZ2VuXCIsXG4gICAgLy9vcGplY3RQcm9wZXJ0aWVzSGVhZGVyOiBcIkdlYXZhbmNlZXJkXCIsXG4gICAgLy9zaG93T2JqZWN0UHJvcGVydGllczogXCJPYmplY3RlaWdlbnNjaGFwcGVuIHdlZXJnZXZlblwiLFxuICAgIC8vaGlkZU9iamVjdFByb3BlcnRpZXM6IFwiVmVyYmVyZyBvYmplY3RlaWdlbnNjaGFwcGVuXCIsXG4gICAgc2hvd1BhbmVsOiBcIlRvb24gcGFuZWVsXCIsXG4gICAgaGlkZVBhbmVsOiBcIlZlcmJlcmcgcGFuZWVsXCIsXG4gICAgLy9lZGl0U3VydmV5OiBcIkVucXXDqnRlIGJld2Vya2VuXCIsXG4gICAgYWRkTmV3UGFnZTogXCJQYWdpbmEgdG9ldm9lZ2VuXCIsXG4gICAgbW92ZVJpZ2h0OiBcIlNjcm9sbCBuYWFyIHJlY2h0c1wiLFxuICAgIG1vdmVMZWZ0OiBcIlNjcm9sbCBuYWFyIGxpbmtzXCIsXG4gICAgZGVsZXRlUGFnZTogXCJQYWdpbmEgdmVyd2lqZGVyZW5cIixcbiAgICBlZGl0UGFnZTogXCJQYWdpbmEgYWFucGFzc2VuXCIsXG4gICAgZWRpdDogXCJCZXdlcmtcIixcbiAgICBuZXdQYWdlTmFtZTogXCJQYWdpbmFcIixcbiAgICBuZXdRdWVzdGlvbk5hbWU6IFwiVnJhYWdcIixcbiAgICBuZXdQYW5lbE5hbWU6IFwiUGFuZWVsXCIsXG4gICAgbmV3VGV4dEl0ZW1OYW1lOiBcIlRla3N0XCIsXG4gICAgdGVzdFN1cnZleTogXCJUZXN0IGRlIGVucXXDqnRlXCIsXG4gICAgdGVzdFN1cnZleUFnYWluOiBcIlRlc3QgZGUgZW5xdcOqdGUgb3BuaWV1d1wiLFxuICAgIHRlc3RTdXJ2ZXlXaWR0aDogXCJPbmRlcnpvZWtzYnJlZWR0ZTogXCIsXG4gICAgbmF2aWdhdGVUb01zZzogXCJKZSBtb2VzdCBuYXZpZ2VyZW4gbmFhcjpcIixcbiAgICBsb2dpYzogXCJPbmRlcnpvZWtzbG9naWNhXCIsXG4gICAgZW1iZWRTdXJ2ZXk6IFwiRW5xdcOqdGUgaW5zbHVpdGVuXCIsXG4gICAgdHJhbnNsYXRpb246IFwiVmVydGFsaW5nXCIsXG4gICAgc2F2ZVN1cnZleTogXCJFbnF1w6p0ZSBvcHNsYWFuXCIsXG4gICAgc2F2ZVN1cnZleVRvb2x0aXA6IFwiRW5xdcOqdGUgb3BzbGFhblwiLFxuICAgIGRlc2lnbmVyOiBcIkVucXXDqnRlLW9udHdlcnBlclwiLFxuICAgIGpzb25FZGl0b3I6IFwiSlNPTi1lZGl0b3JcIixcbiAgICB1bmRvOiBcIk9uZ2VkYWFuIG1ha2VuXCIsXG4gICAgcmVkbzogXCJPcG5pZXV3IHVpdHZvZXJlblwiLFxuICAgIHVuZG9Ub29sdGlwOiBcIk1hYWsgZGUgbGFhdHN0ZSB3aWp6aWdpbmcgb25nZWRhYW5cIixcbiAgICByZWRvVG9vbHRpcDogXCJWb2VyIGRlIHdpanppZ2luZyBvcG5pZXV3IHVpdFwiLFxuICAgIGNvcHk6IFwiS29wacOrcmVuXCIsXG4gICAgY3V0OiBcIkJlc25vZWlpbmdcIixcbiAgICBwYXN0ZTogXCJQbGFra2VuXCIsXG4gICAgY29weVRvb2x0aXA6IFwiS29waWVlciBzZWxlY3RpZSBuYWFyIGtsZW1ib3JkXCIsXG4gICAgY3V0VG9vbHRpcDogXCJLbmlwIGRlIHNlbGVjdGllIG5hYXIgaGV0IGtsZW1ib3JkXCIsXG4gICAgcGFzdGVUb29sdGlwOiBcIlBsYWtrZW4gdmFuYWYga2xlbWJvcmRcIixcbiAgICBvcHRpb25zOiBcIk9wdGllc1wiLFxuICAgIGdlbmVyYXRlVmFsaWRKU09OOiBcIkdlbmVyZWVyIGdlbGRpZ2UgSlNPTlwiLFxuICAgIGdlbmVyYXRlUmVhZGFibGVKU09OOiBcIkdlbmVyZWVyIGxlZXNiYXJlIEpTT05cIixcbiAgICB0b29sYm94OiBcIkdlcmVlZHNjaGFwXCIsXG4gICAgXCJwcm9wZXJ0eS1ncmlkXCI6IFwiRWlnZW5zY2hhcHBlblwiLFxuICAgIHRvb2xib3hHZW5lcmFsQ2F0ZWdvcnk6IFwiQWxnZW1lZW5cIixcbiAgICAvL2RlbFNlbE9iamVjdDogXCJWZXJ3aWpkZXIgaGV0IGdlc2VsZWN0ZWVyZGUgb2JqZWN0XCIsXG4gICAgLy9lZGl0U2VsT2JqZWN0OiBcIkJld2VyayBoZXQgZ2VzZWxlY3RlZXJkZSBvYmplY3RcIixcbiAgICBjb3JyZWN0SlNPTjogXCJDb3JyaWdlZXIgSlNPTi5cIixcbiAgICBzdXJ2ZXlSZXN1bHRzOiBcIkVucXXDqnRlcmVzdWx0YWF0OiBcIixcbiAgICBzdXJ2ZXlSZXN1bHRzVGFibGU6IFwiQWxzIHRhZmVsXCIsXG4gICAgc3VydmV5UmVzdWx0c0pzb246IFwiQWxzIEpTT05cIixcbiAgICByZXN1bHRzVGl0bGU6IFwiVnJhYWcgdGl0ZWxcIixcbiAgICByZXN1bHRzTmFtZTogXCJWcmFhZyBuYWFtXCIsXG4gICAgcmVzdWx0c1ZhbHVlOiBcIkFudHdvb3Jkd2FhcmRlXCIsXG4gICAgcmVzdWx0c0Rpc3BsYXlWYWx1ZTogXCJXYWFyZGUgd2VlcmdldmVuXCIsXG4gICAgbW9kaWZpZWQ6IFwiR2V3aWp6aWdkXCIsXG4gICAgc2F2aW5nOiBcIkJlc3BhcmluZ1wiLFxuICAgIHNhdmVkOiBcIk9wZ2VzbGFnZW5cIixcbiAgICBwcm9wZXJ0eUVkaXRvckVycm9yOiBcIkZvdXQ6XCIsXG4gICAgc2F2ZUVycm9yOiBcIkZvdXQhIERlIGluaG91ZCB2YW4gZGUgZWRpdG9yIHdvcmR0IG5pZXQgb3BnZXNsYWdlbi5cIixcbiAgICB0cmFuc2xhdGlvbkFkZExhbmd1YWdlOiBcIlNlbGVjdGVlciBkZSB0YWFsIG9tIHRlIHZlcnRhbGVuXCIsXG4gICAgdHJhbnNsYXRpb25TaG93QWxsU3RyaW5nczogXCJUb29uIGFsbGUgc25hcmVuXCIsXG4gICAgdHJhbnNsYXRpb25TaG93QWxsUGFnZXM6IFwiVG9vbiBhbGxlIHBhZ2luYXNcIixcbiAgICB0cmFuc2xhdGlvbk5vU3RyaW5nczogXCJHZWVuIHZlcnBsaWNodGluZ2VuIG9tIHRlIHZlcnRhbGVuLiBWZXJ2YW5nIGFsc3R1YmxpZWZ0IGhldCBmaWx0ZXIuXCIsXG4gICAgdHJhbnNsYXRpb25FeHBvcnRUb1NDVkJ1dHRvbjogXCJFeHBvcnRlcmVuIG5hYXIgQ1NWXCIsXG4gICAgdHJhbnNsYXRpb25JbXBvcnRGcm9tU0NWQnV0dG9uOiBcIkltcG9ydGVyZW4gdmFudWl0IENTVlwiLFxuICAgIHRyYW5zbGF0aW9uTWVyZ2VMb2NhbGVXaXRoRGVmYXVsdDogXCJWb2VnIHswfSBzYW1lbiBtZXQgZGUgc3RhbmRhYXJkbGFuZGluc3RlbGxpbmdcIixcbiAgICBib2xkOiBcIlZldGdlZHJ1a3RcIixcbiAgICBpdGFsaWM6IFwiQ3Vyc2llZlwiLFxuICAgIHVuZGVybGluZTogXCJPbmRlcnN0cmVwZW5cIixcbiAgICBmcEFkZFF1ZXN0aW9uOiBcIlZyYWFnIHRvZXZvZWdlbi4uLlwiLFxuICAgIHNlbGVjdFBhZ2U6IFwiU2VsZWN0ZWVyIHBhZ2luYS4uLlwiLFxuICAgIGNob29zZUVsZW1lbnQ6IFwiS2llcyBlbGVtZW50Li4uXCIsXG4gICAgLy9jb21wbGV0ZWRIdG1sT25Db25kaXRpb25JdGVtVGV4dDogXCJMYWF0IHppZW4gb2Y6XCIsXG4gICAgbGc6IHtcbiAgICAgIGFkZE5ld0l0ZW06IFwiXCIsIC8vQnkgZGVmYXVsdCB0aGUgdmFsdWUgaXMgdGFrZW4gZnJvbSBwZS5hZGROZXcgJ0FkZCBOZXcnLCB5b3UgY2FuIHNldCBpdCB0byAnQWRkIE5ldyBSdWxlJyBmb3IgZXhhbXBsZS5cbiAgICAgIC8vTG9naWMgdGFiIHN0cmluZ3NcbiAgICAgIHBhZ2VfdmlzaWJpbGl0eU5hbWU6IFwiUGFnaW5hIHppY2h0YmFhcmhlaWRcIixcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlOYW1lOiBcIlBhbmVlbCB6aWNodGJhYXJoZWlkXCIsXG4gICAgICBwYW5lbF9lbmFibGVOYW1lOiBcIlBhbmVlbCBpbnNjaGFrZWxlbi91aXRzY2hha2VsZW5cIixcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlOYW1lOiBcIlZyYWFnIHppY2h0YmFhcmhlaWRcIixcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZU5hbWU6IFwiVnJhYWcgaW5zY2hha2VsZW4vdWl0c2NoYWtlbGVuXCIsXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlTmFtZTogXCJWcmFhZyBvcHRpb25lZWwgdmVyZWlzdFwiLFxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZU5hbWU6IFwiVm9sbGVkaWdlIGVucXXDqnRlXCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlTmFtZTogXCJTdGVsIHZyYWFnd2FhcmRlIGluXCIsXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZU5hbWU6IFwiS29waWVlciBkZSB2cmFhZ3dhYXJkZVwiLFxuICAgICAgdHJpZ2dlcl9za2lwTmFtZTogXCJHYSBuYWFyIGRlIHZyYWFnXCIsXG4gICAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25OYW1lOiBcIlZvZXIgZWVuIGFhbmdlcGFzdGUgZXhwcmVzc2llIHVpdFwiLFxuICAgICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uTmFtZTogXCJBYW5nZXBhc3RlICdCZWRhbmt0cGFnaW5hJy10ZWtzdFwiLFxuXG4gICAgICBwYWdlX3Zpc2liaWxpdHlEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJNYWFrIGRlIHBhZ2luYSB6aWNodGJhYXIgd2FubmVlciBkZSBsb2dpc2NoZSB1aXRkcnVra2luZyB0cnVlIHJldG91cm5lZXJ0LiBIb3VkIGhldCBhbmRlcnMgb256aWNodGJhYXIuXCIsXG4gICAgICBwYW5lbF92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiTWFhayBoZXQgcGFuZWVsIHppY2h0YmFhciB3YW5uZWVyIGRlIGxvZ2lzY2hlIHVpdGRydWtraW5nIHRydWUgcmV0b3VybmVlcnQuIEhvdWQgaGV0IGFuZGVycyBvbnppY2h0YmFhci5cIixcbiAgICAgIHBhbmVsX2VuYWJsZURlc2NyaXB0aW9uOlxuICAgICAgICBcIlpvcmcgZXJ2b29yIGRhdCBoZXQgcGFuZWVsIGVuIGFsbGUgZWxlbWVudGVuIGVyaW4gd29yZGVuIGluZ2VzY2hha2VsZCB3YW5uZWVyIGRlIGxvZ2lzY2hlIHVpdGRydWtraW5nIHRydWUgcmV0b3VybmVlcnQuIEhvdWQgemUgYW5kZXJzIHVpdGdlc2NoYWtlbGQuXCIsXG4gICAgICBxdWVzdGlvbl92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiTWFhayBkZSB2cmFhZyB6aWNodGJhYXIgd2FubmVlciBkZSBsb2dpc2NoZSB1aXRkcnVra2luZyB0cnVlIHJldG91cm5lZXJ0LiBIb3VkIGhldCBhbmRlcnMgb256aWNodGJhYXIuXCIsXG4gICAgICBxdWVzdGlvbl9lbmFibGVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJTY2hha2VsIGRlIHZyYWFnIGluIHdhbm5lZXIgZGUgbG9naXNjaGUgdWl0ZHJ1a2tpbmcgdHJ1ZSByZXRvdXJuZWVydC4gSG91ZCBoZXQgYW5kZXJzIHVpdGdlc2NoYWtlbGQuXCIsXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlRGVzY3JpcHRpb246XG4gICAgICAgIFwiVnJhYWcgd29yZHQgdmVyZWlzdCB3YW5uZWVyIGRlIGxvZ2lzY2hlIHVpdGRydWtraW5nIHRydWUgcmV0b3VybmVlcnQuXCIsXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlRGVzY3JpcHRpb246XG4gICAgICAgIFwiV2FubmVlciBkZSBsb2dpc2NoZSB1aXRkcnVra2luZyB0cnVlIHJldG91cm5lZXJ0LCB3b3JkdCBkZSBlbnF1w6p0ZSB2b2x0b29pZCBlbiB6aWV0IGVlbiBlaW5kZ2VicnVpa2VyIGRlICdCZWRhbmtwYWdpbmEnLlwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIldhbm5lZXIgdnJhYWd3YWFyZGVuLCBkaWUgd29yZGVuIGdlYnJ1aWt0IGluIGRlIGxvZ2lzY2hlIHVpdGRydWtraW5nLCB3b3JkZW4gZ2V3aWp6aWdkIGVuIGRlIGxvZ2lzY2hlIHVpdGRydWtraW5nIHRydWUgcmV0b3VybmVlcnQsIHdvcmR0IGRlIHdhYXJkZSBpbmdlc3RlbGQgb3AgZGUgZ2VzZWxlY3RlZXJkZSB2cmFhZy5cIixcbiAgICAgIHRyaWdnZXJfY29weXZhbHVlRGVzY3JpcHRpb246XG4gICAgICAgIFwiV2FubmVlciB2cmFhZ3dhYXJkZW4sIGRpZSB3b3JkZW4gZ2VicnVpa3QgaW4gZGUgbG9naXNjaGUgdWl0ZHJ1a2tpbmcsIHdvcmRlbiBnZXdpanppZ2QgZW4gZGUgbG9naXNjaGUgdWl0ZHJ1a2tpbmcgdHJ1ZSByZXRvdXJuZWVydCwgd29yZHQgZGUgd2FhcmRlIHZhbiBlZW4gZ2VzZWxlY3RlZXJkZSB2cmFhZyBnZWtvcGllZXJkIG5hYXIgZWVuIGFuZGVyZSBnZXNlbGVjdGVlcmRlIHZyYWFnLlwiLFxuICAgICAgdHJpZ2dlcl9za2lwRGVzY3JpcHRpb246XG4gICAgICAgIFwiQWxzIGRlIGxvZ2lzY2hlIHVpdGRydWtraW5nIHRydWUgcmV0b3VybmVlcnQsIGdhYXQgZGUgZW5xdcOqdGUgbmFhci9mb2N1c3QgZGUgZ2VzZWxlY3RlZXJkZSB2cmFhZy5cIixcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvbkRlc2NyaXB0aW9uOlxuICAgICAgICBcIldhbm5lZXIgZGUgbG9naXNjaGUgZXhwcmVzc2llIHRydWUgcmV0b3VybmVlcnQsIHdvcmR0IGRlIGFhbmdlcGFzdGUgZXhwcmVzc2llIHVpdGdldm9lcmQuIFUga3VudCBkaXQgZXhwcmVzc2llcmVzdWx0YWF0IG9wdGlvbmVlbCBpbnN0ZWxsZW4gdm9vciBkZSBnZXNlbGVjdGVlcmRlIHZyYWFnXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25EZXNjcmlwdGlvbjpcbiAgICAgICAgXCJBbHMgZGUgbG9naXNjaGUgdWl0ZHJ1a2tpbmcgdHJ1ZSByZXRvdXJuZWVydCwgd29yZHQgZGUgc3RhbmRhYXJkdGVrc3Qgdm9vciBkZSAnQmVkYW5rcGFnaW5hJyBnZXdpanppZ2QgaW4gZGUgb3BnZWdldmVuIHRla3N0LlwiLFxuXG4gICAgICBpdGVtRXhwcmVzc2lvblRleHQ6IFwiV2FubmVlciBleHByZXNzaWU6ICd7MH0nIHRydWUgcmV0b3VybmVlcnQ6XCIsIC8vezB9IC0gdGhlIGV4cHJlc3Npb25cbiAgICAgIHBhZ2VfdmlzaWJpbGl0eVRleHQ6IFwiTWFhayBwYWdpbmEgezB9IHppY2h0YmFhclwiLCAvL3swfSBwYWdlIG5hbWVcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlUZXh0OiBcIk1hYWsgcGFuZWVsIHswfSB6aWNodGJhYXJcIiwgLy97MH0gcGFuZWwgbmFtZVxuICAgICAgcGFuZWxfZW5hYmxlVGV4dDogXCJTY2hha2VsIHBhbmVlbCB7MH0gaW5cIiwgLy97MH0gcGFuZWwgbmFtZVxuICAgICAgcXVlc3Rpb25fdmlzaWJpbGl0eVRleHQ6IFwiTWFhayB2cmFhZyB7MH0gemljaHRiYWFyXCIsIC8vezB9IHF1ZXN0aW9uIG5hbWVcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZVRleHQ6IFwiU2NoYWtlbCB2cmFhZyB7MH0gaW5cIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgcXVlc3Rpb25fcmVxdWlyZVRleHQ6IFwiU3RlbCB2cmFhZyB7MH0gdmVycGxpY2h0XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWVcbiAgICAgIHRyaWdnZXJfY29tcGxldGVUZXh0OiBcIkVucXXDqnRlIHdvcmR0IHZvbHRvb2lkXCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlVGV4dDogXCJTdGVsIGRlIHZyYWFnOiB7MH0gd2FhcmRlIHsxfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lLCB7MX0gc2V0VmFsdWVcbiAgICAgIHRyaWdnZXJfY29weXZhbHVlVGV4dDogXCJLb3BpZWVyIG5hYXIgdnJhYWc6IHswfSB3YWFyZGUgdWl0IHZyYWFnIHsxfVwiLCAvL3swfSBhbmQgezF9IHF1ZXN0aW9uIG5hbWVzXG4gICAgICB0cmlnZ2VyX3NraXBUZXh0OiBcIkVucXXDqnRlIGdhIHZlcmRlciBtZXQgZGUgdnJhYWcgezB9XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWVcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvblRleHQxOiBcIlVpdGRydWtraW5nIHVpdHZvZXJlbjogJ3swfSdcIiwgLy97MH0gdGhlIGV4cHJlc3Npb25cbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvblRleHQyOiBcIiBlbiBzdGVsIGhldCByZXN1bHRhYXQgaW4gdnJhYWc6IHswfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25UZXh0OlxuICAgICAgICBcIlRvb24gYWFuZ2VwYXN0ZSB0ZWtzdCB2b29yIGRlICdCZWRhbmtwYWdpbmEnLlwiLFxuXG4gICAgICBjb25kaXRpb25zOiBcIlZvb3J3YWFyZChlbilcIixcbiAgICAgIGFjdGlvbnM6IFwiQWN0aWUocylcIixcbiAgICAgIGV4cHJlc3Npb25FZGl0b3JUaXRsZTogXCJEZWZpbmllZXIgY29uZGl0aWUocylcIixcbiAgICAgIGFjdGlvbnNFZGl0b3JUaXRsZTogXCJEZWZpbmllZXIgYWN0aWUocylcIixcblxuICAgICAgZGVsZXRlQWN0aW9uOiBcIkFjdGllIHZlcndpamRlcmVuXCIsXG4gICAgICBhZGROZXdBY3Rpb246IFwiVm9lZyBuaWV1d2UgYWN0aWUgdG9lXCIsXG4gICAgICBzZWxlY3RlZEFjdGlvbkNhcHRpb246IFwiU2VsZWN0ZWVyIGVlbiBhY3RpZSBvbSB0b2UgdGUgdm9lZ2VuLi4uXCIsXG5cbiAgICAgIGV4cHJlc3Npb25JbnZhbGlkOlxuICAgICAgICBcIkRlIGxvZ2lzY2hlIHVpdGRydWtraW5nIGlzIGxlZWcgb2Ygb25nZWxkaWcuIFZlcmJldGVyIGRpdCBhbHN0dWJsaWVmdC5cIixcbiAgICAgIG5vQWN0aW9uRXJyb3I6IFwiVm9lZyB0ZW4gbWluc3RlIMOpw6luIGFjdGllIHRvZS5cIixcbiAgICAgIGFjdGlvbkludmFsaWQ6IFwiTG9zIHByb2JsZW1lbiBpbiB1dyBhY3RpZShzKSBvcC5cIixcbiAgICAgIGV4cHJlc3Npb25TZXR1cDogXCJcIixcbiAgICAgIGFjdGlvbnNTZXR1cDogXCJcIixcbiAgICB9LFxuICB9LFxuICAvL1Byb3BlcnR5IG5hbWVzIGluIHRhYmxlIGhlYWRlcnNcbiAgLy8gcGVsOiB7XG4gIC8vICAgaXNSZXF1aXJlZDogXCJWZXJwbGljaHQ/XCJcbiAgLy8gfSxcbiAgLy9Qcm9wZXJ0eSBFZGl0b3JzXG4gIHBlOiB7XG4gICAgYXBwbHk6IFwiVmFuIHRvZXBhc3NpbmcgemlqblwiLFxuICAgIG9rOiBcIk9LXCIsXG4gICAgc2F2ZTogXCJPcHNsYWFuXCIsXG4gICAgc2F2ZVRvb2x0aXA6IFwiT3BzbGFhblwiLFxuICAgIGNhbmNlbDogXCJBbm51bGVyZW5cIixcbiAgICByZXNldDogXCJSZXNldHRlblwiLFxuICAgIHJlZnJlc2g6IFwiT3BzbGFhblwiLFxuICAgIC8vIGNsb3NlOiBcIkRpY2h0YmlqXCIsXG4gICAgZGVsZXRlOiBcIlZlcndpamRlcmVuXCIsXG4gICAgYWRkOiBcIlRvZXZvZWdlblwiLFxuICAgIGFkZE5ldzogXCJOaWV1d2UgdG9ldm9lZ2VuXCIsXG4gICAgYWRkSXRlbTogXCJLbGlrIG9tIGVlbiBpdGVtIHRvZSB0ZSB2b2VnZW4uLi5cIixcbiAgICBhZGRPdGhlcjogXCJBbmRlcmVcIixcbiAgICBhZGRTZWxlY3RBbGw6IFwiU2VsZWN0ZWVyIGFsbGVzXCIsXG4gICAgYWRkTm9uZTogXCJHZWVuXCIsXG4gICAgcmVtb3ZlQWxsOiBcIlZlcndpamRlciBhbGxlc1wiLFxuICAgIGVkaXQ6IFwiQmV3ZXJrXCIsXG4gICAgYmFjazogXCJLZWVyIHRlcnVnIHpvbmRlciBvcCB0ZSBzbGFhblwiLFxuICAgIGJhY2tUb29sdGlwOiBcIktlZXIgdGVydWcgem9uZGVyIG9wIHRlIHNsYWFuXCIsXG4gICAgc2F2ZUFuZEJhY2s6IFwiQmV3YWFyIGVuIGtlZXIgdGVydWdcIixcbiAgICBzYXZlQW5kQmFja1Rvb2x0aXA6IFwiQmV3YWFyIGVuIGtlZXIgdGVydWdcIixcbiAgICAvLyBpdGVtVmFsdWVFZGl0OiBcIlppY2h0YmFhciBhbHNcIixcbiAgICBlZGl0Q2hvaWNlczogXCJLZXV6ZXMgYmV3ZXJrZW5cIixcbiAgICBzaG93Q2hvaWNlczogXCJUb29uIGtldXplc1wiLFxuICAgIG1vdmU6IFwiQmV3ZWdlblwiLFxuICAgIGVtcHR5OiBcIjxsZWVnPlwiLFxuICAgIC8vIG5vdEVtcHR5OiBcIjx3YWFyZGUgYmV3ZXJrZW4+XCIsXG4gICAgZmFzdEVudHJ5OiBcIlNuZWxsZSB0b2VnYW5nXCIsXG4gICAgZm9ybUVudHJ5OiBcIkZvcm11bGllcmludm9lclwiLFxuICAgIHRlc3RTZXJ2aWNlOiBcIlRlc3QgZGUgc2VydmljZVwiLFxuICAgIGl0ZW1TZWxlY3RvckVtcHR5OiBcIlNlbGVjdGVlciBoZXQgZWxlbWVudFwiLFxuICAgIGNvbmRpdGlvbkFjdGlvbkVtcHR5OiBcIlNlbGVjdGVlciBkZSBhY3RpZVwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFF1ZXN0aW9uOiBcIlNlbGVjdGVlciB2cmFhZy4uLlwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFBhZ2U6IFwiU2VsZWN0ZWVyIHBhZ2luYS4uLlwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFBhbmVsOiBcIlNlbGVjdGVlciBwYW5lZWwuLi5cIixcbiAgICBjb25kaXRpb25WYWx1ZVF1ZXN0aW9uVGl0bGU6IFwiVm9lci9zZWxlY3RlZXIgZGUgd2FhcmRlXCIsXG4gICAgLy8gY29uZGl0aW9uSGVscDpcbiAgICAvLyAgIFwiVm9lciBlZW4gYm9vbGVhYW5zZSB1aXRkcnVra2luZyBpbi4gSGV0IG1vZXQgdHJ1ZSByZXRvdXJuZXJlbiBvbSBkZSB2cmFhZy9wYWdpbmEgemljaHRiYWFyIHRlIGhvdWRlbi4gQmlqdm9vcmJlZWxkOiB7dnJhYWcxfSA9ICd3YWFyZGUxJyBvZiAoe3ZyYWFnMn0gKiB7dnJhYWc0fT4gMjAgZW4ge3ZyYWFnM30gPDUpXCIsXG4gICAgZXhwcmVzc2lvbkhlbHA6XG4gICAgICBcIlUga3VudCBhY2NvbGFkZXMgZ2VicnVpa2VuIG9tIHRvZWdhbmcgdGUga3JpamdlbiB0b3QgZGUgdnJhYWd3YWFyZGVuOiB7dnJhYWcxfSArIHt2cmFhZzJ9LCAoe3ByaWpzfSAqIHthYW50YWx9KSAqICgxMDAgLSB7a29ydGluZ30pLiBVIGt1bnQgZnVuY3RpZXMgZ2VicnVpa2VuIGFsczogaWlmKCksIHRvZGF5KCksIGFnZSgpLCBtaW4oKSwgbWF4KCksIGNvdW50KCksIGF2ZygpIGVuIGFuZGVyZW4uXCIsXG4gICAgYWNlRWRpdG9ySGVscDogXCJEcnVrIG9wIEN0cmwrc3BhdGllYmFsayBvbSBlZW4gaGludCB2b29yIGhldCB2b2x0b29pZW4gdmFuIGVlbiB1aXRkcnVra2luZyB0ZSBrcmlqZ2VuXCIsXG4gICAgYWNlRWRpdG9yUm93VGl0bGU6IFwiSHVpZGlnZSByaWpcIixcbiAgICBhY2VFZGl0b3JQYW5lbFRpdGxlOiBcIkh1aWRpZyBwYW5lZWxcIixcbiAgICBzaG93TW9yZTogXCJSYWFkcGxlZWcgZGUgZG9jdW1lbnRhdGllIHZvb3IgbWVlciBkZXRhaWxzXCIsXG4gICAgLy8gY29uZGl0aW9uU2hvd01vcmVVcmw6XG4gICAgLy8gICBcImh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5UGFyYW1ldGVyP2lkPVF1ZXN0aW9uJnBhcmFtZXRlcj12aXNpYmxlSWZcIixcbiAgICBhc3Npc3RhbnRUaXRsZTogXCJCZXNjaGlrYmFyZSB2cmFnZW46XCIsXG4gICAgY2VsbHNFbXB0eVJvd3NDb2x1bW5zOiBcIkVyIG1vZXQgbWluaW1hYWwgw6nDqW4ga29sb20gb2YgcmlqIHppam5cIixcblxuICAgIHByb3BlcnR5SXNFbXB0eTogXCJWb2VyIGFsc3R1YmxpZWZ0IGVlbiB3YWFyZGUgaW5cIixcbiAgICBwcm9wZXJ0eU5hbWVJc05vdFVuaXF1ZTogXCJWb2VyIGVlbiB1bmlla2UgbmFhbSBpblwiLFxuICAgIGxpc3RJc0VtcHR5OiBcIlZvZWcgZWVuIG5pZXV3IGl0ZW0gdG9lXCIsXG4gICAgZXhwcmVzc2lvbklzRW1wdHk6IFwiRXhwcmVzc2llIGlzIGxlZWdcIixcbiAgICB2YWx1ZTogXCJXYWFyZGVcIixcbiAgICB0ZXh0OiBcIlRla3N0XCIsXG4gICAgcm93aWQ6IFwiUmlqLUlEXCIsXG4gICAgaW1hZ2VMaW5rOiBcIkFmYmVlbGRpbmdzbGlua1wiLFxuICAgIGNvbHVtbkVkaXQ6IFwiS29sb20gYmV3ZXJrZW46IHswfVwiLFxuICAgIGl0ZW1FZGl0OiBcIkJld2VyayBpdGVtOiB7MH1cIixcblxuICAgIHVybDogXCJVUkxcIixcbiAgICBwYXRoOiBcIlBhZFwiLFxuICAgIHZhbHVlTmFtZTogXCJXYWFyZGVuYWFtXCIsXG4gICAgdGl0bGVOYW1lOiBcIlRpdGVsXCIsXG4gICAgdGl0bGVQbGFjZWhvbGRlcjogXCJWb2VyIGhpZXIgZGUgdGl0ZWwgaW5cIixcbiAgICBzdXJ2ZXlUaXRsZVBsYWNlaG9sZGVyOiBcIlZvZXIgZGUgZW5xdcOqdGV0aXRlbCBoaWVyIGluXCIsXG4gICAgcGFnZVRpdGxlUGxhY2Vob2xkZXI6IFwiVm9lciBoaWVyIGRlIHBhZ2luYXRpdGVsIGluXCIsXG4gICAgZGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCJWb2VyIGVlbiBvbXNjaHJpanZpbmcgaW5cIixcbiAgICBzdXJ2ZXlEZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcIlZvZXIgZWVuIG9uZGVyem9la3NiZXNjaHJpanZpbmcgaW5cIixcbiAgICBwYWdlRGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCJWb2VyIGVlbiBwYWdpbmFiZXNjaHJpanZpbmcgaW5cIixcblxuICAgIGhhc090aGVyOiBcIkhlZWZ0IGRlICdBbmRlcnM6Jy1vcHRpZVwiLFxuICAgIG90aGVyVGV4dDogXCJUaXRlbCAnQW5kZXJzOictb3B0aWVcIixcbiAgICBoYXNOb25lOiBcIkhlZWZ0IGRlICdHZWVuJy1vcHRpZVwiLFxuICAgIG5vbmVUZXh0OiBcIlRpdGVsICdHZWVuJy1vcHRpZVwiLFxuICAgIGhhc1NlbGVjdEFsbDogXCJIZWVmdCBkZSAnQWxsZXMgc2VsZWN0ZXJlbictb3B0aWVcIixcbiAgICBzZWxlY3RBbGxUZXh0OiBcIlRpdGVsICdBbGxlcyBzZWxlY3RlcmVuJy1vcHRpZVwiLFxuICAgIGFsbG93RW1wdHlSZXNwb25zZTogXCJMZWVnIHJlc3BvbnMgdG9lc3RhYW5cIixcbiAgICBjaG9pY2VzTWluOiBcIk1pbmltdW13YWFyZGUgdm9vciBhdXRvbWF0aXNjaCBnZWdlbmVyZWVyZGUgaXRlbXNcIixcbiAgICBjaG9pY2VzTWF4OiBcIk1heGltYWxlIHdhYXJkZSB2b29yIGF1dG9tYXRpc2NoIGdlZ2VuZXJlZXJkZSBpdGVtc1wiLFxuICAgIGNob2ljZXNTdGVwOiBcIkhldCB2ZXJzY2hpbCB0dXNzZW4gYXV0b21hdGlzY2ggZ2VnZW5lcmVlcmRlIGl0ZW1zXCIsXG4gICAgbmFtZTogXCJOYWFtXCIsXG4gICAgdGl0bGU6IFwiVGl0ZWxcIixcbiAgICBjZWxsVHlwZTogXCJDZWx0eXBlXCIsXG4gICAgY29sQ291bnQ6IFwiS29sb20gdGVsbGVuXCIsXG4gICAgY2hvaWNlc09yZGVyOiBcIlZvbGdvcmRlIG9wdGllc1wiLFxuICAgIHZpc2libGU6IFwiSXMgemljaHRiYWFyP1wiLFxuICAgIGlzUmVxdWlyZWQ6IFwiSXMgdmVycGxpY2h0P1wiLFxuICAgIGRlZmF1bHRWYWx1ZUV4cHJlc3Npb246IFwiRXhwcmVzc2llIHN0YW5kYWFyZHdhYXJkZVwiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwiQW50d29vcmQgdmVyZWlzZW4gdm9vciBhbGxlIHJpamVuXCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwiVGVrc3QgYmlqIG5pZXQtaW5nZXZ1bGRlIHZlcnBsaWNodGUgdnJhYWdcIixcbiAgICBzdGFydFdpdGhOZXdMaW5lOiBcIkJlZ2lubmVuIG1ldCBlZW4gbmlldXdlIHJlZ2VsP1wiLFxuICAgIHJvd3M6IFwiQWFudGFsIHJpamVuXCIsXG4gICAgY29sczogXCJLb2xvbSB0ZWxsZW5cIixcbiAgICBwbGFjZUhvbGRlcjogXCJIdWxwdGVrc3RcIixcbiAgICBzaG93UHJldmlldzogXCJUb29uIHZvb3JiZWVsZGdlYmllZFwiLFxuICAgIHNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGU6IFwiVm9vcmJlZWxkd2VlcmdhdmUgdm9vciBhZnJvbmRlblwiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCJCZXdhYXIgYmVzdGFuZHNpbmhvdWQgaW4gSlNPTi1yZXN1bHRhYXQgYWxzIHRla3N0XCIsXG4gICAgbWF4U2l6ZTogXCJNYXhpbWFsZSBiZXN0YW5kc2dyb290dGUgaW4gYnl0ZXNcIixcbiAgICBpbWFnZUhlaWdodDogXCJBZmJlZWxkaW5nIGhvb2d0ZVwiLFxuICAgIGltYWdlV2lkdGg6IFwiQWZiZWVsZGluZyBicmVlZHRlXCIsXG4gICAgcm93Q291bnQ6IFwiQWFudGFsIHJpamVuXCIsXG4gICAgY29sdW1uTGF5b3V0OiBcIktvbG9tbWVuIGxheW91dFwiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcIlZvZWcgZGUgbG9jYXRpZSB2YW4gZGUgcmlqa25vcCB0b2VcIixcbiAgICBhZGRSb3dUZXh0OiBcIlZvZWcgdGVrc3QgdmFuIGRlIHJpamtub3AgdG9lXCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCJWZXJ3aWpkZXIgZGUgdGVrc3QgdmFuIGRlIHJpamtub3BcIixcbiAgICByYXRlTWluOiBcIk1pbmltdW10YXJpZWZcIixcbiAgICByYXRlTWF4OiBcIk1heGltYWFsIHRhcmllZlwiLFxuICAgIHJhdGVTdGVwOiBcIkJlb29yZGVlbCBzdGFwXCIsXG4gICAgbWluUmF0ZURlc2NyaXB0aW9uOiBcIkJlc2NocmlqdmluZyBtaW5pbXVtdGFyaWVmXCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcIk1heGltYWxlIHRhcmllZm9tc2NocmlqdmluZ1wiLFxuICAgIGlucHV0VHlwZTogXCJJbnZvZXJ0eXBlXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiQmlqc2NocmlmdCBvcHRpZXNcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiU3RhbmRhYXJkd2FhcmRlXCIsXG4gICAgY2VsbHNEZWZhdWx0Um93OiBcIlN0YW5kYWFyZCBjZWx0ZWtzdGVuXCIsXG5cbiAgICBzdXJ2ZXlFZGl0b3JUaXRsZTogXCJCZXdlcmsgZW5xdcOqdGUtaW5zdGVsbGluZ2VuXCIsXG4gICAgcUVkaXRvclRpdGxlOiBcIkJld2Vya2VuOiB7MH1cIixcblxuICAgIG1heExlbmd0aDogXCJNYXhpbWFsZSBsZW5ndGVcIixcblxuICAgIGJ1aWxkRXhwcmVzc2lvbjogXCJCb3V3ZW5cIixcbiAgICBlZGl0RXhwcmVzc2lvbjogXCJCZXdlcmtcIixcbiAgICBhbmQ6IFwiRW5cIixcbiAgICBvcjogXCJPZlwiLFxuICAgIHJlbW92ZTogXCJWZXJ3aWpkZXJlblwiLFxuICAgIGFkZENvbmRpdGlvbjogXCJWb29yd2FhcmRlIHRvZXZvZWdlblwiLFxuXG4gICAgLy9zdXJ2ZXlcbiAgICBzaG93VGl0bGU6IFwiVGl0ZWwgd2VlcmdldmVuL3ZlcmJlcmdlblwiLFxuICAgIGV4cGFuZENvbGxhcHNlVGl0bGU6IFwiVGl0ZWwgdWl0dm91d2VuL3NhbWVudm91d2VuXCIsXG4gICAgbG9jYWxlOiBcIlN0YW5kYWFyZHRhYWxcIixcbiAgICBzaW11bGF0b3I6IFwiS2llcyBhcHBhcmFhdFwiLFxuICAgIGxhbmRzY2FwZU9yaWVudGF0aW9uOiBcIkxhbmRzY2hhcFwiLFxuICAgIG1vZGU6IFwiTW9kdXMgKGJld2Vya2VuL2FsbGVlbiBsZXplbilcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCJXaXMgb256aWNodGJhcmUgd2FhcmRlblwiLFxuICAgIGNvb2tpZU5hbWU6IFwiQ29va2llbmFhbSAoem9kYXQgZW5xdcOqdGUgc2xlY2h0cyDDqcOpbm1hbGlnIHdvcmR0IGluZ2V2dWxkKVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcIkFudHdvb3JkZW4gb3BzbGFhbiBiaWogcGFnaW5hLW92ZXJnYW5nXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiU2xhIGRlIHdhYXJkZSB2YW4gJ2FuZGVyZW4nIG9wIGluIGVlbiBhcGFydCB2ZWxkXCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwiVG9vbiBwYWdpbmF0aXRlbHNcIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwiVG9vbiBwYWdpbmFudW1tZXJzXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIktub3B0aXRlbCAnVm9yaWdlIHBhZ2luYSdcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiS25vcHRpdGVsICdWb2xnZW5kZSBwYWdpbmEnXCIsXG4gICAgY29tcGxldGVUZXh0OiBcIktub3B0aXRlbCAnQWZyb25kZW4nXCIsXG4gICAgcHJldmlld1RleHQ6IFwiS25vcHRpdGVsICdWb29yYmVlbGR3ZWVyZ2F2ZSdcIixcbiAgICBlZGl0VGV4dDogXCJLbm9wdGl0ZWwgJ0Jld2Vya2VuJ1wiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJLbm9wdGl0ZWwgJ1N0YXJ0ZW4nXCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIk5hdmlnYXRpZWtub3BwZW4gd2VlcmdldmVuIChzdGFuZGFhcmRuYXZpZ2F0aWUpXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwiVG9vbiBrbm9wICdWb3JpZ2UgcGFnaW5hJyAoZ2VicnVpa2VyIGthbiB0ZXJ1Z2tlcmVuKVwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCJEZSBlZXJzdGUgcGFnaW5hIGluIGRlIGVucXXDqnRlIGlzIGVlbiBzdGFydHBhZ2luYVwiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcIlRvb24gYmlqIGFmcm9uZGVuIGRlemUgSFRNTC1jb2RlXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzpcbiAgICAgIFwiTmEgYWxsZSB2cmFnZW4gYXV0b21hdGlzY2ggbmFhciB2b2xnZW5kZSBwYWdpbmEgZ2FhblwiLFxuICAgIGZvY3VzT25GaXJzdEVycm9yOiBcIkZvY3VzIG9wIGVlcnN0ZSBmb3V0IHpldHRlblwiLFxuICAgIHNob3dQcm9ncmVzc0JhcjogXCJUb29uIHZvb3J0Z2FuZ3NiYWxrXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcIlBsZWsgdnJhYWd0aXRlbFwiLFxuICAgIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuOiBcIlBhdHJvb24gdnJhYWd0aXRlbFwiLFxuICAgIHF1ZXN0aW9uVGl0bGU6IFwiVnJhYWd0aXRlbFwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJTeW1ib29sKGVuKSB2ZXJwbGljaHRlIHZyYWFnXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcIkVlcnN0ZSB2cmFhZyAoMSwgMiBvciAnQScsICdhJylcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIlRvb24gdnJhYWdudW1tZXJzXCIsXG4gICAgdGV4dFVwZGF0ZU1vZGU6IFwiTW9kdXMgdGVrc3R2ZXJuaWV1d2luZ1wiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTpcbiAgICAgIFwiVnJhYWd0aXRlbHNqYWJsb29uLCBzdGFuZGFhcmQgaXM6ICd7bm99LiB7dmVyZWlzZW59IHt0aXRlbH0nXCIsXG4gICAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBcIlBsZWsgdnJhYWdmb3V0bWVsZGluZ1wiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzogXCJPcCB2b2xnZW5kZSBwYWdpbmEgZm9jdXMgb3AgZGUgZWVyc3RlIHZyYWFnIHpldHRlblwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcIlZvbGdvcmRlIGVsZW1lbnRlbiBvcCBwYWdpbmFcIixcbiAgICBtYXhUZXh0TGVuZ3RoOiBcIk1heGltYWxlIHRla3N0bGVuZ3RlXCIsXG4gICAgbWF4T3RoZXJzTGVuZ3RoOiBcIk1heGltYWxlIHRla3N0bGVuZ3RlIG9wdGllICdBbmRlcnM6J1wiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJNYXhpbWFsZSB0aWpkIG9tIGRlIGVucXXDqnRlIHRlIHZvbHRvb2llblwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiTWF4aW1hbGUgdGlqZCBvbSBlZW4gcGFnaW5hIGluIGRlIGVucXXDqnRlIHRlIHZvbHRvb2llblwiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcIlRvb24gdGltZXJwYW5lZWxcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwiTW9kdXMgdGltZXJwYW5lZWxcIixcbiAgICByZW5kZXJNb2RlOiBcIlJlbmRlci1tb2R1c1wiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwiU3RhIGhldCB0b2V2b2VnZW4gdmFuIGVlbiBwYW5lZWwgdG9lXCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCJMYWF0IGhldCB2ZXJ3aWpkZXJlbiB2YW4gaGV0IHBhbmVlbCB0b2VcIixcbiAgICBwYW5lbEFkZFRleHQ6IFwiUGFuZWVsdGVrc3QgdG9ldm9lZ2VuXCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcIlBhbmVlbHRla3N0IHZlcndpamRlcmVuXCIsXG4gICAgaXNTaW5nbGVQYWdlOiBcIlRvb24gYWxsZSBlbGVtZW50ZW4gb3Agw6nDqW4gcGFnaW5hXCIsXG4gICAgaHRtbDogXCJIdG1sXCIsXG4gICAgZXhwcmVzc2lvbjogXCJVaXRkcnVra2luZ1wiLFxuXG4gICAgbWluVmFsdWU6IFwiTWluaW1hbGUgd2FhcmRlXCIsXG4gICAgbWF4VmFsdWU6IFwiTWF4aW1hbGUgd2FhcmRlXCIsXG4gICAgbWluTGVuZ3RoOiBcIk1pbmltYWxlIGxlbmd0ZVwiLFxuICAgIGFsbG93RGlnaXRzOiBcIkNpamZlcnMgdG9lc3RhYW5cIixcbiAgICBtaW5Db3VudDogXCJNaW5pbXVtIGFhbnRhbFwiLFxuICAgIG1heENvdW50OiBcIk1heGltYWxlIHRlbGxpbmdcIixcbiAgICByZWdleDogXCJSZWd1bGllcmUgZXhwcmVzc2llXCIsXG5cbiAgICB0b3RhbFRleHQ6IFwiVG90YWxlIHRla3N0XCIsXG4gICAgdG90YWxUeXBlOiBcIlRvdGFhbCB0eXBlXCIsXG4gICAgdG90YWxFeHByZXNzaW9uOiBcIlRvdGFsZSBleHByZXNzaWVcIixcbiAgICB0b3RhbERpc3BsYXlTdHlsZTogXCJUb3RhbGUgd2VlcmdhdmVzdGlqbFwiLFxuICAgIHRvdGFsQ3VycmVuY3k6IFwiVG90YWxlIHZhbHV0YVwiLFxuICAgIHRvdGFsRm9ybWF0OiBcIlRvdGFhbCBmb3JtYWF0XCIsXG5cbiAgICAvLyBIZWFkZXIgIGFkb3JuZXJcbiAgICBsb2dvUG9zaXRpb246IFwiUG9zaXRpZSBsb2dvXCIsXG4gICAgYWRkTG9nbzogXCJMb2dvIHRvZXZvZWdlbi4uLlwiLFxuICAgIGNoYW5nZUxvZ286IFwiTG9nbyB3aWp6aWdlbi4uLlwiLFxuICAgIGxvZ29XaWR0aDogXCJCcmVlZHRlIGxvZ29cIixcbiAgICBsb2dvSGVpZ2h0OiBcIkhvb2d0ZSBsb2dvXCIsXG4gICAgbG9nb0ZpdDogXCJQYXNzZW5kIG1ha2VuIGxvZ29cIixcbiAgICBsb2dvUG9zaXRpb25zOiB7XG4gICAgICBub25lOiBcIkxvZ28gdmVyd2lqZGVyZW5cIixcbiAgICAgIGxlZnQ6IFwiTGlua3NcIixcbiAgICAgIHJpZ2h0OiBcIlJlY2h0c2FmXCIsXG4gICAgICB0b3A6IFwiQm92ZW5vcFwiLFxuICAgICAgYm90dG9tOiBcIk9uZGVyIGFhblwiLFxuICAgIH0sXG5cbiAgICB0YWJzOiB7XG4gICAgICBnZW5lcmFsOiBcIkFsZ2VtZWVuXCIsXG4gICAgICBmaWxlT3B0aW9uczogXCJPcHRpZXNcIixcbiAgICAgIGh0bWw6IFwiSHRtbC1lZGl0b3JcIixcbiAgICAgIGNvbHVtbnM6IFwiS29sb21tZW5cIixcbiAgICAgIHJvd3M6IFwiUmlqZW5cIixcbiAgICAgIGNob2ljZXM6IFwiS2V1emVzXCIsXG4gICAgICBpdGVtczogXCJBcnRpa2VsZW5cIixcbiAgICAgIHZpc2libGVJZjogXCJaaWNodGJhYXIgYWxzXCIsXG4gICAgICBlbmFibGVJZjogXCJTY2hha2VsIElmIGluXCIsXG4gICAgICByZXF1aXJlZElmOiBcIlZlcmVpc3QgYWxzXCIsXG4gICAgICByYXRlVmFsdWVzOiBcIkJlb29yZGVlbCB3YWFyZGVuXCIsXG4gICAgICBjaG9pY2VzQnlVcmw6IFwiS2V1emVzIHZhbiBpbnRlcm5ldFwiLFxuICAgICAgbWF0cml4Q2hvaWNlczogXCJTdGFuZGFhcmRrZXV6ZXNcIixcbiAgICAgIG11bHRpcGxlVGV4dEl0ZW1zOiBcIlRla3N0aW52b2VyXCIsXG4gICAgICBudW1iZXJpbmc6IFwiTnVtbWVyaW5nXCIsXG4gICAgICB2YWxpZGF0b3JzOiBcIlZhbGlkYXRvcnNcIixcbiAgICAgIG5hdmlnYXRpb246IFwiTmF2aWdhdGllXCIsXG4gICAgICBxdWVzdGlvbjogXCJWcmFhZ1wiLFxuICAgICAgcGFnZXM6IFwiUGFnaW5hJ3NcIixcbiAgICAgIGNvbXBsZXRlZEh0bWw6IFwiSFRNTCBiaWogYWZyb25kZW5cIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbjogXCJWb2x0b29pZGUgaHRtbCBvcCB2b29yd2FhcmRlXCIsXG4gICAgICBsb2FkaW5nSHRtbDogXCJIdG1sIGxhZGVuXCIsXG4gICAgICB0aW1lcjogXCJUaW1lci9RdWl6XCIsXG4gICAgICBjYWxjdWxhdGVkVmFsdWVzOiBcIkJlcmVrZW5kZSB3YWFyZGVzXCIsXG4gICAgICB0cmlnZ2VyczogXCJUcmlnZ2Vyc1wiLFxuICAgICAgdGVtcGxhdGVUaXRsZTogXCJTamFibG9vbnRpdGVsXCIsXG4gICAgICB0b3RhbHM6IFwiVG90YWxlblwiLFxuICAgICAgbG9naWM6IFwiTG9naWNhXCIsXG4gICAgICBsYXlvdXQ6IFwiSW5kZWxpbmdcIixcbiAgICAgIGRhdGE6IFwiR2VnZXZlbnNcIixcbiAgICAgIHZhbGlkYXRpb246IFwiVmFsaWRhdGllXCIsXG4gICAgICBjZWxsczogXCJDZWxsZW5cIixcbiAgICAgIHNob3dPbkNvbXBsZXRlZDogXCJXZWVyZ2V2ZW4gYmlqIGFmcm9uZGVuXCIsXG4gICAgICBsb2dvOiBcIkxvZ28gaW4gZW5xdcOqdGV0aXRlbFwiLFxuICAgICAgc2xpZGVyOiBcIlNjaHVpZnJlZ2VsYWFyXCIsXG4gICAgICBvdGhlcnM6IFwiQW5kZXJlblwiLFxuICAgIH0sXG4gICAgZWRpdFByb3BlcnR5OiBcIkVpZ2Vuc2NoYXAgJ3swfScgYmV3ZXJrZW5cIixcbiAgICBpdGVtczogXCJbIEl0ZW1zOiB7MH0gXVwiLFxuXG4gICAgZW50ZXJOZXdWYWx1ZTogXCJWb2VyIGRlIHdhYXJkZSBpbi5cIixcbiAgICBub3F1ZXN0aW9uczogXCJFciBpcyBnZWVuIGVua2VsZSB2cmFhZyBpbiBkZSBlbnF1w6p0ZS5cIixcbiAgICBjcmVhdGV0cmlnZ2VyOiBcIk1hYWsgZWVuIHRyaWdnZXJcIixcbiAgICB0aXRsZUtleWJvYXJkQWRvcm5lclRpcDogXCJEcnVrIG9wIGRlIGVudGVyLWtub3Agb20gdGUgYmV3ZXJrZW5cIixcbiAgICBrZXlib2FyZEFkb3JuZXJUaXA6XG4gICAgICBcIkRydWsgb3AgZGUgZW50ZXIta25vcCBvbSBoZXQgaXRlbSB0ZSBiZXdlcmtlbiwgZHJ1ayBvcCBkZSBkZWxldGUta25vcCBvbSBoZXQgaXRlbSB0ZSB2ZXJ3aWpkZXJlbiwgZHJ1ayBvcCBhbHQgcGx1cyBwaWpsIG9taG9vZyBvZiBwaWpsIG9tbGFhZyBvbSBpdGVtIHRlIHZlcnBsYWF0c2VuXCIsXG4gICAgdHJpZ2dlck9uOiBcIkFhbiBcIixcbiAgICB0cmlnZ2VyTWFrZVBhZ2VzVmlzaWJsZTogXCJNYWFrIHBhZ2luYSdzIHppY2h0YmFhcjpcIixcbiAgICB0cmlnZ2VyTWFrZVF1ZXN0aW9uc1Zpc2libGU6IFwiTWFhayBlbGVtZW50ZW4gemljaHRiYWFyOlwiLFxuICAgIHRyaWdnZXJDb21wbGV0ZVRleHQ6IFwiVnVsIGRlIGVucXXDqnRlIGluIGFscyBkaXQgbHVrdC5cIixcbiAgICB0cmlnZ2VyTm90U2V0OiBcIkRlIHRyaWdnZXIgaXMgbmlldCBpbmdlc3RlbGRcIixcbiAgICB0cmlnZ2VyUnVuSWY6IFwiVm9lciBhbHNcIixcbiAgICB0cmlnZ2VyU2V0VG9OYW1lOiBcIlZlcmFuZGVyIHdhYXJkZSB2YW46IFwiLFxuICAgIHRyaWdnZXJGcm9tTmFtZTogXCJXYWFyZGUga29wacOrcmVuIHZhbjogXCIsXG4gICAgdHJpZ2dlclJ1bkV4cHJlc3Npb246IFwiVm9lciBkZXplIGV4cHJlc3NpZSB1aXQ6XCIsXG4gICAgdHJpZ2dlclNldFZhbHVlOiBcIm5hYXI6IFwiLFxuICAgIHRyaWdnZXJHb3RvTmFtZTogXCJHYSBuYWFyIGRlIHZyYWFnOlwiLFxuICAgIHRyaWdnZXJJc1ZhcmlhYmxlOiBcIlpldCBkZSB2YXJpYWJlbGUgbmlldCBpbiBoZXQgb25kZXJ6b2Vrc3Jlc3VsdGFhdC5cIixcbiAgICB0cmlnZ2VyUnVuRXhwcmVzc2lvbkVtcHR5OiBcIlZvZXIgZWVuIGdlbGRpZ2UgdWl0ZHJ1a2tpbmcgaW5cIixcblxuICAgIG5vRmlsZTogXCJHZWVuIGJlc3RhbmQgZ2Vrb3plblwiLFxuICB9LFxuICAvL1Byb3BlcnR5IHZhbHVlc1xuICBwdjoge1xuICAgIHRydWU6IFwiV2FhclwiLFxuICAgIGZhbHNlOiBcIkZhbHNlXCIsXG4gICAgaW5oZXJpdDogXCJFcnZlblwiLFxuICAgIHNob3c6IFwiVG9uZW5cIixcbiAgICBoaWRlOiBcIlppY2ggdmVyc3RvcHBlblwiLFxuICAgIGRlZmF1bHQ6IFwiU3RhbmRhYXJkXCIsXG4gICAgaW5pdGlhbDogXCJTdGFuZGFhcmRcIixcbiAgICByYW5kb206IFwiV2lsbGVrZXVyaWdcIixcbiAgICBjb2xsYXBzZWQ6IFwiSW5nZXN0b3J0XCIsXG4gICAgZXhwYW5kZWQ6IFwiVWl0Z2VicmVpZFwiLFxuICAgIG5vbmU6IFwiR2VlblwiLFxuICAgIGFzYzogXCJPcGxvcGVuZFwiLFxuICAgIGRlc2M6IFwiQWZsb3BlbmRcIixcbiAgICBpbmRldGVybWluYXRlOiBcIk9uYmVwYWFsZFwiLFxuICAgIGRlY2ltYWw6IFwiRGVjaW1hbGVcIixcbiAgICBjdXJyZW5jeTogXCJWYWx1dGFcIixcbiAgICBwZXJjZW50OiBcIlByb2NlbnRcIixcbiAgICBmaXJzdEV4cGFuZGVkOiBcIkVlcnN0ZSB1aXRnZXZvdXdlblwiLFxuICAgIG9mZjogXCJVaXRcIixcbiAgICBvblBhbmVsOiBcIk9wIHBhbmVlbFwiLFxuICAgIG9uU3VydmV5OiBcIk9wIGVucXXDqnRlXCIsXG4gICAgbGlzdDogXCJMaWpzdFwiLFxuICAgIHByb2dyZXNzVG9wOiBcIlZvb3J0Z2FuZyB0b3BcIixcbiAgICBwcm9ncmVzc0JvdHRvbTogXCJWb29ydGdhbmcgYm9kZW1cIixcbiAgICBwcm9ncmVzc1RvcEJvdHRvbTogXCJWb29ydGdhbmcgdG9wIGJvZGVtXCIsXG4gICAgaG9yaXpvbnRhbDogXCJIb3Jpem9udGFhbFwiLFxuICAgIHZlcnRpY2FsOiBcIlZlcnRpY2FhbFwiLFxuICAgIHRvcDogXCJUb3BcIixcbiAgICBib3R0b206IFwiQmVuZWRlblwiLFxuICAgIHRvcEJvdHRvbTogXCJUb3AgZW4gYmVuZWRlblwiLFxuICAgIGJvdGg6IFwiQmVpZGVcIixcbiAgICBsZWZ0OiBcIkxpbmtzXCIsXG4gICAgcmlnaHQ6IFwiUmVjaHRzXCIsXG4gICAgY29sb3I6IFwiS2xldXJcIixcbiAgICBkYXRlOiBcIkRhdHVtXCIsXG4gICAgZGF0ZXRpbWU6IFwiRGF0dW0vdGlqZFwiLFxuICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjogXCJEYXR1bS90aWpkIGxva2FhbFwiLFxuICAgIGVtYWlsOiBcIkUtbWFpbFwiLFxuICAgIG1vbnRoOiBcIk1hYW5kXCIsXG4gICAgbnVtYmVyOiBcIk51bW1lclwiLFxuICAgIHBhc3N3b3JkOiBcIldhY2h0d29vcmRcIixcbiAgICByYW5nZTogXCJCZXJlaWtcIixcbiAgICB0ZWw6IFwiVGVsXCIsXG4gICAgdGV4dDogXCJUZWtzdFwiLFxuICAgIHRpbWU6IFwiVGlqZFwiLFxuICAgIHVybDogXCJVUkxcIixcbiAgICB3ZWVrOiBcIldlZWtcIixcbiAgICBoaWRkZW46IFwiVmVyYm9yZ2VuXCIsXG4gICAgb246IFwiQWFuXCIsXG4gICAgb25QYWdlOiBcIk9wIHBhZ2luYVwiLFxuICAgIHVuZGVyVGl0bGU6IFwiT25kZXIgZGUgdGl0ZWxcIixcbiAgICB1bmRlcklucHV0OiBcIk9uZGVyIGhldCBpbnZvZXJ2ZWxkXCIsXG4gICAgZWRpdDogXCJCZXdlcmtcIixcbiAgICBkaXNwbGF5OiBcIlNjaGVybVwiLFxuICAgIG9uQ29tcGxldGU6IFwiQmlqIGFmcm9uZGVuXCIsXG4gICAgb25IaWRkZW46IFwiQmlqIHZlcmJlcmdlblwiLFxuICAgIG9uQmx1cjogXCJCaWogdmVybGllemVuIGZvY3VzXCIsXG4gICAgb25UeXBpbmc6IFwiVGlqZGVucyBoZXQgdHlwZW5cIixcbiAgICBhbGw6IFwiQWxsZVwiLFxuICAgIHBhZ2U6IFwiUGFnaW5hXCIsXG4gICAgc3VydmV5OiBcIkVucXXDqnRlXCIsXG4gICAgb25OZXh0UGFnZTogXCJCaWogcGFnaW5hLW92ZXJnYW5nXCIsXG4gICAgb25WYWx1ZUNoYW5nZWQ6IFwiQmlqIHdhYXJkZXZlcmFuZGVyaW5nXCIsXG4gICAgc2luZ2xlUGFnZTogXCJFbmtlbGUgcGFnaW5hXCIsXG4gICAgc3RhbmRhcmQ6IFwiU3RhbmRhYXJkXCIsXG4gICAgcXVlc3Rpb25QZXJQYWdlOiBcIlZyYWFnIHBlciBwYWdpbmFcIixcbiAgICBub1ByZXZpZXc6IFwiR2VlbiBwcmV2aWV3XCIsXG4gICAgc2hvd0FsbFF1ZXN0aW9uczogXCJUb29uIHZvb3JiZWVsZCBtZXQgYWxsZSB2cmFnZW5cIixcbiAgICBzaG93QW5zd2VyZWRRdWVzdGlvbnM6IFwiVG9vbiB2b29yYmVlbGQgbWV0IGJlYW50d29vcmRlIHZyYWdlblwiLFxuICAgIGltYWdlOiBcIkJlZWxkXCIsXG4gICAgdmlkZW86IFwiVmlkZW9cIixcbiAgICBjb250YWluOiBcIklucGVya2VuXCIsXG4gICAgY292ZXI6IFwiQmVkZWtrZW5cIixcbiAgICBmaWxsOiBcIk9wdnVsbGVuXCJcbiAgfSxcbiAgLy9PcGVyYXRvcnNcbiAgb3A6IHtcbiAgICBlbXB0eTogXCJpcyBsZWVnXCIsXG4gICAgbm90ZW1wdHk6IFwiaXMgbmlldCBsZWVnXCIsXG4gICAgZXF1YWw6IFwiZ2VsaWprIGlzXCIsXG4gICAgbm90ZXF1YWw6IFwibmlldCBnZWxpamtcIixcbiAgICBjb250YWluczogXCJiZXZhdFwiLFxuICAgIG5vdGNvbnRhaW5zOiBcImJldmF0IG5pZXRcIixcbiAgICBhbnlvZjogXCJlZW4gdmFuXCIsXG4gICAgYWxsb2Y6IFwiYWxsZXMgdmFuXCIsXG4gICAgZ3JlYXRlcjogXCJncm90ZXJcIixcbiAgICBsZXNzOiBcIm1pbmRlclwiLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBcImdyb3RlciBvZiBnZWxpamsgYWFuXCIsXG4gICAgbGVzc29yZXF1YWw6IFwibWluZGVyIG9mIGdlbGlqayBhYW5cIixcbiAgICBhbmQ6IFwiZW5cIixcbiAgICBvcjogXCJvZlwiLFxuICB9LFxuICAvL0VtYmVkIHdpbmRvd1xuICBldzoge1xuICAgIGFuZ3VsYXI6IFwiR2VicnVpayBkZSBBbmd1bGFyLXZlcnNpZVwiLFxuICAgIGpxdWVyeTogXCJHZWJydWlrIGRlIGpRdWVyeS12ZXJzaWVcIixcbiAgICBrbm9ja291dDogXCJHZWJydWlrIGRlIEtub2Nrb3V0LXZlcnNpZVwiLFxuICAgIHJlYWN0OiBcIkdlYnJ1aWsgZGUgUmVhY3QtdmVyc2llXCIsXG4gICAgdnVlOiBcIkdlYnJ1aWsgZGUgVnVlLXZlcnNpZVwiLFxuICAgIGJvb3RzdHJhcDogXCJWb29yIGJvb3RzdHJhcC1mcmFtZXdvcmtcIixcbiAgICBtb2Rlcm46IFwiTW9kZXJuIHRoZW1hXCIsXG4gICAgZGVmYXVsdDogXCJTdGFuZGFhcmQgdGhlbWFcIixcbiAgICBvcmFuZ2U6IFwiT3JhbmplIHRoZW1hXCIsXG4gICAgZGFya2JsdWU6IFwiRG9ua2VyYmxhdXcgdGhlbWFcIixcbiAgICBkYXJrcm9zZTogXCJEb25rZXJlcm9vcyB0aGVtYVwiLFxuICAgIHN0b25lOiBcIlN0ZW5lbiB0aGVtYVwiLFxuICAgIHdpbnRlcjogXCJXaW50ZXIgdGhlbWFcIixcbiAgICB3aW50ZXJzdG9uZTogXCJXaW50ZXJzdGVlbiB0aGVtYVwiLFxuICAgIHNob3dPblBhZ2U6IFwiVG9vbiBlbnF1w6p0ZSBvcCBlZW4gcGFnaW5hXCIsXG4gICAgc2hvd0luV2luZG93OiBcIlRvb24gZW5xdcOqdGUgaW4gZWVuIHZlbnN0ZXJcIixcbiAgICBsb2FkRnJvbVNlcnZlcjogXCJMYWFkIFN1cnZleSBKU09OIHZhbmFmIGRlIHNlcnZlclwiLFxuICAgIHRpdGxlU2NyaXB0OiBcIlNjcmlwdHMgZW4gc3RpamxlblwiLFxuICAgIHRpdGxlSHRtbDogXCJIVE1MXCIsXG4gICAgdGl0bGVKYXZhU2NyaXB0OiBcIkphdmFTY3JpcHRcIixcbiAgfSxcbiAgLy9UZXN0IFN1cnZleVxuICB0czoge1xuICAgIHNlbGVjdFBhZ2U6IFwiU2VsZWN0ZWVyIGRlIHBhZ2luYSBvbSBkZXplIHRlIHRlc3RlbjpcIixcbiAgICBzaG93SW52aXNpYmxlRWxlbWVudHM6IFwiVG9vbiBvbnppY2h0YmFyZSBlbGVtZW50ZW5cIixcbiAgfSxcbiAgdmFsaWRhdG9yczoge1xuICAgIGFuc3dlcmNvdW50dmFsaWRhdG9yOiBcIkFhbnRhbCBhbnR3b29yZGVuXCIsXG4gICAgZW1haWx2YWxpZGF0b3I6IFwiRS1tYWlsXCIsXG4gICAgZXhwcmVzc2lvbnZhbGlkYXRvcjogXCJVaXRkcnVra2luZ1wiLFxuICAgIG51bWVyaWN2YWxpZGF0b3I6IFwiTnVtZXJpZWtcIixcbiAgICByZWdleHZhbGlkYXRvcjogXCJSZWdleFwiLFxuICAgIHRleHR2YWxpZGF0b3I6IFwiVGVrc3RcIixcbiAgfSxcbiAgdHJpZ2dlcnM6IHtcbiAgICBjb21wbGV0ZXRyaWdnZXI6IFwiVm9sbGVkaWdlIGVucXXDqnRlXCIsXG4gICAgc2V0dmFsdWV0cmlnZ2VyOiBcIkluZ2VzdGVsZGUgd2FhcmRlXCIsXG4gICAgY29weXZhbHVldHJpZ2dlcjogXCJLb3BpZSB3YWFyZGVcIixcbiAgICBza2lwdHJpZ2dlcjogXCJHYSBuYWFyIGRlIHZyYWFnXCIsXG4gICAgcnVuZXhwcmVzc2lvbnRyaWdnZXI6IFwiUnVuIGV4cHJlc3NpZVwiLFxuICAgIHZpc2libGV0cmlnZ2VyOiBcIlppY2h0YmFhcmhlaWQgd2lqemlnZW4gKHZlcm91ZGVyZClcIixcbiAgfSxcbiAgLy9Qcm9wZXJ0aWVzXG4gIHA6IHtcbiAgICBuYW1lOiBcIk5hYW1cIixcbiAgICB0aXRsZToge1xuICAgICAgbmFtZTogXCJUaXRlbFwiLFxuICAgICAgdGl0bGU6IFwiTGFhdCBoZXQgbGVlZyBhbHMgaGV0IGhldHplbGZkZSBpcyBhbHMgJ05hYW0nXCIsXG4gICAgfSxcblxuICAgIG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eTogXCJOYXZpZ2F0aWUgS25vcHBlbiB6aWNodGJhYXJoZWlkXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwiVnJhZ2VuIHZvbGdvcmRlXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIk1heGltYWxlIHRpamQgb20gdGUgdm9sdG9vaWVuXCIsXG5cbiAgICB2aXNpYmxlOiBcIlppY2h0YmFhclwiLFxuICAgIHZpc2libGVJZjogXCJaaWNodGJhYXIgYWxzXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcIlBsZWsgdnJhYWd0aXRlbFwiLFxuICAgIHF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvbjogXCJQbGVrIHZyYWFnb21zY2hyaWp2aW5nXCIsXG4gICAgZGVzY3JpcHRpb246IFwiT21zY2hyaWp2aW5nXCIsXG4gICAgc3RhdGU6IFwiU3RhYXRcIixcbiAgICBpc1JlcXVpcmVkOiBcIklzIGJlbm9kaWdkXCIsXG4gICAgcmVxdWlyZWRJZjogXCJWZXJlaXN0IGFsc1wiLFxuICAgIGluZGVudDogXCJJbnNwcmluZ2VuXCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwiVmVyZWlzdGUgZm91dHRla3N0XCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCJCZWdpbiBtZXQgbmlldXdlIHJlZ2VsXCIsXG4gICAgaW5uZXJJbmRlbnQ6IFwiSW5uZXJsaWprZSBpbnNwcmluZ2luZ1wiLFxuICAgIHBhZ2U6IFwiUGFnaW5hXCIsXG5cbiAgICB3aWR0aDogXCJCcmVlZHRlXCIsXG5cbiAgICBjb21tZW50VGV4dDogXCJDb21tZW50YWFyIHRla3N0XCIsXG4gICAgdmFsdWVOYW1lOiBcIldhYXJkZSBuYWFtXCIsXG4gICAgZW5hYmxlSWY6IFwiSW5zY2hha2VsZW4gYWxzXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIlN0YW5kYWFyZHdhYXJkZVwiLFxuICAgIGNvcnJlY3RBbnN3ZXI6IFwiR29lZCBhbnR3b29yZFwiLFxuICAgIHJlYWRPbmx5OiBcIkFsbGVlbi1sZXplblwiLFxuICAgIHZhbGlkYXRvcnM6IFwiVmFsaWRhdG9yc1wiLFxuICAgIHRpdGxlTG9jYXRpb246IFwiUGxlayB0aXRlbFwiLFxuICAgIGRlc2NyaXB0aW9uTG9jYXRpb246IFwiUGxlayBvbXNjaHJpanZpbmdcIixcbiAgICBtaW5XaWR0aDogXCJNaW5pbWFsZSBicmVlZHRlXCIsXG4gICAgbWF4V2lkdGg6IFwiTWF4aW1hbGUgYnJlZWR0ZVwiLFxuICAgIHVzZURpc3BsYXlWYWx1ZXNJblRpdGxlOiBcIldhYXJkZXMgaW4gdGl0ZWwgZ2VicnVpa2VuXCIsXG5cbiAgICBoYXNDb21tZW50OiBcIkhlZWZ0IGNvbW1lbnRhYXJcIixcbiAgICBoYXNPdGhlcjogXCJIZWVmdCBhbmRlcmVcIixcbiAgICBjaG9pY2VzOiBcIktldXplc1wiLFxuICAgIGNob2ljZXNPcmRlcjogXCJLZXV6ZXMgYmVzdGVsbGVuXCIsXG4gICAgY2hvaWNlc0J5VXJsOiBcIktldXplcyBwZXIgdXJsXCIsXG4gICAgb3RoZXJUZXh0OiBcIkFuZGVyZSB0ZWtzdFwiLFxuICAgIG90aGVyRXJyb3JUZXh0OiBcIkFuZGVyZSBmb3V0dGVrc3RcIixcbiAgICBzdG9yZU90aGVyc0FzQ29tbWVudDogXCJTbGEgYW5kZXJlbiBvcCBhbHMgY29tbWVudGFhclwiLFxuXG4gICAgbGFiZWw6IFwiRXRpa2V0XCIsXG4gICAgc2hvd1RpdGxlOiBcIkxhYXQgZGUgdGl0ZWwgemllblwiLFxuICAgIHZhbHVlVHJ1ZTogXCJXYWFyZGUgd2FhclwiLFxuICAgIHZhbHVlRmFsc2U6IFwiV2FhcmRlIGZhbHNlXCIsXG5cbiAgICBjb2xzOiBcIktvbG9tbWVuXCIsXG4gICAgcm93czogXCJSaWplblwiLFxuICAgIHBsYWNlSG9sZGVyOiBcIlRpamRlbGlqa2UgYWFuZHVpZGluZ1wiLFxuXG4gICAgb3B0aW9uc0NhcHRpb246IFwiQmlqc2NocmlmdCBvcHRpZXNcIixcblxuICAgIGV4cHJlc3Npb246IFwiVWl0ZHJ1a2tpbmdcIixcbiAgICBmb3JtYXQ6IFwiRm9ybWFhdFwiLFxuICAgIGRpc3BsYXlTdHlsZTogXCJXZWVyZ2F2ZXN0aWpsXCIsXG4gICAgY3VycmVuY3k6IFwiVmFsdXRhXCIsXG4gICAgdXNlR3JvdXBpbmc6IFwiR2VicnVpayBncm9lcGVyaW5nXCIsXG5cbiAgICBzaG93UHJldmlldzogXCJUb29uIHZvb3JiZWVsZFwiLFxuICAgIGFsbG93TXVsdGlwbGU6IFwiTWVlcmRlcmUgdG9lc3RhYW5cIixcbiAgICBpbWFnZUhlaWdodDogXCJBZmJlZWxkaW5nIGhvb2d0ZVwiLFxuICAgIGltYWdlV2lkdGg6IFwiQWZiZWVsZGluZyBicmVlZHRlXCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIkdlZ2V2ZW5zIG9wc2xhYW4gYWxzIHRla3N0XCIsXG4gICAgbWF4U2l6ZTogXCJNYXhpbWFsZSBncm9vdHRlXCIsXG5cbiAgICBodG1sOiBcIkhUTUxcIixcblxuICAgIGNvbHVtbnM6IFwiS29sb21tZW5cIixcbiAgICBjZWxsczogXCJDZWxsZW5cIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcIlppam4gYWxsZSByaWplbiB2ZXJlaXN0XCIsXG5cbiAgICBob3Jpem9udGFsU2Nyb2xsOiBcIkhvcml6b250YWxlIHNjcm9sbFwiLFxuICAgIGNlbGxUeXBlOiBcIkNlbHR5cGVcIixcbiAgICBjb2x1bW5zTGF5b3V0OiBcIktvbG9tbWVuIGxheW91dFwiLFxuICAgIGNvbHVtbkNvbENvdW50OiBcIkFhbnRhbCBrb2xvbW1lblwiLFxuICAgIGNvbHVtbk1pbldpZHRoOiBcIktvbG9tIG1pbiBicmVlZHRlXCIsXG5cbiAgICByb3dDb3VudDogXCJSaWplbiB0ZWxsZW5cIixcbiAgICBtaW5Sb3dDb3VudDogXCJNaW4gcmlqZW4gdGVsbGVuXCIsXG4gICAgbWF4Um93Q291bnQ6IFwiTWF4IGFhbnRhbCByaWplblwiLFxuICAgIGtleU5hbWU6IFwiU2xldXRlbCBuYWFtXCIsXG4gICAga2V5RHVwbGljYXRpb25FcnJvcjogXCJLZXkgZHVwbGljYXRpZSBmb3V0XCIsXG4gICAgY29uZmlybURlbGV0ZTogXCJCZXZlc3RpZyB2ZXJ3aWpkZXJlblwiLFxuICAgIGNvbmZpcm1EZWxldGVUZXh0OiBcIkJldmVzdGlnZW4gdmVyd2lqZGVyIHRla3N0XCIsXG4gICAgYWRkUm93TG9jYXRpb246IFwiUmlqbG9jYXRpZSB0b2V2b2VnZW5cIixcbiAgICBhZGRSb3dUZXh0OiBcIlJpaiB0ZWtzdCB0b2V2b2VnZW5cIixcbiAgICByZW1vdmVSb3dUZXh0OiBcIlJpai10ZWtzdCB2ZXJ3aWpkZXJlblwiLFxuXG4gICAgaXRlbXM6IFwiQXJ0aWtlbGVuXCIsXG4gICAgaXRlbVNpemU6IFwiSXRlbSBncm9vdHRlXCIsXG4gICAgY29sQ291bnQ6IFwiS29sb21tZW4gdGVsbGVuXCIsXG5cbiAgICB0ZW1wbGF0ZVRpdGxlOiBcIlNqYWJsb29udGl0ZWxcIixcbiAgICB0ZW1wbGF0ZURlc2NyaXB0aW9uOiBcIlNqYWJsb29uYmVzY2hyaWp2aW5nXCIsXG4gICAgYWxsb3dBZGRQYW5lbDogXCJUb2VzdGFhbiBvbSBwYW5lZWwgdG9lIHRlIHZvZWdlblwiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwiTGFhdCBoZXQgcGFuZWVsIHZlcndpamRlcmVuXCIsXG4gICAgcGFuZWxDb3VudDogXCJBYW50YWwgcGFuZWxlblwiLFxuICAgIG1pblBhbmVsQ291bnQ6IFwiTWluIHBhbmVlbCBhYW50YWxcIixcbiAgICBtYXhQYW5lbENvdW50OiBcIk1heCBhYW50YWwgcGFuZWxlblwiLFxuICAgIHBhbmVsc1N0YXRlOiBcIlBhbmVsZW4gc3RhYXRcIixcbiAgICBwYW5lbEFkZFRleHQ6IFwiUGFuZWVsIHRla3N0IHRvZXZvZWdlblwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCJQYW5lZWwgdmVyd2lqZGVyIHRla3N0XCIsXG4gICAgcGFuZWxQcmV2VGV4dDogXCJQYW5lZWwgdm9yaWdlIHRla3N0XCIsXG4gICAgcGFuZWxOZXh0VGV4dDogXCJQYW5lZWwgdm9sZ2VuZGUgdGVrc3RcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIlRvb24gdnJhYWdudW1tZXJzXCIsXG4gICAgdGV4dFVwZGF0ZU1vZGU6IFwiTW9kdXMgdGVrc3R2ZXJuaWV1d2luZ1wiLFxuICAgIHNob3dSYW5nZUluUHJvZ3Jlc3M6IFwiVG9vbiBsb3BlbmRlIHJlZWtzXCIsXG4gICAgcmVuZGVyTW9kZTogXCJSZW5kZXItbW9kdXNcIixcbiAgICB0ZW1wbGF0ZVRpdGxlTG9jYXRpb246IFwiU2phYmxvb24gdGl0ZWwgbG9jYXRpZVwiLFxuXG4gICAgcmF0ZVZhbHVlczogXCJUYXJpZWYgd2FhcmRlblwiLFxuICAgIHJhdGVNaW46IFwiVGFyaWVmIG1pblwiLFxuICAgIHJhdGVNYXg6IFwiVGFyaWVmIG1heFwiLFxuICAgIHJhdGVTdGVwOiBcIlRhcmllZnN0YXBcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwiTWluIHRhcmllZiBiZXNjaHJpanZpbmdcIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwiTWF4IHRhcmllZiBiZXNjaHJpanZpbmdcIixcblxuICAgIGlucHV0VHlwZTogXCJJbnZvZXJ0eXBlXCIsXG4gICAgc2l6ZTogXCJHcm9vdHRlXCIsXG5cbiAgICBsb2NhbGU6IFwiTG9jYWxlXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcIkZvY3VzIGVlcnN0ZSB2cmFhZyBhdXRvbWF0aXNjaFwiLFxuICAgIGNvbXBsZXRlZEh0bWw6IFwiVm9sdG9vaWRlIGh0bWxcIixcbiAgICBjb21wbGV0ZWRCZWZvcmVIdG1sOiBcIkhUTUwgYmlqIHR3ZWVkZSBwb2dpbmcgaW52dWxsZW5cIixcbiAgICBsb2FkaW5nSHRtbDogXCJIVE1MIHRlIHRvbmVuIGJpaiBvcHN0YXJ0ZW5cIixcbiAgICB0cmlnZ2VyczogXCJUcmlnZ2Vyc1wiLFxuICAgIGNvb2tpZU5hbWU6IFwiQ29va2llIG5hYW1cIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCJWZXJ6ZW5kIHJlc3VsdGFhdCBvcCB2b2xnZW5kZSBwYWdpbmFcIixcbiAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IFwiVG9uZW4gbmF2aWdhdGlla25vcHBlblwiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcIlRvb24gdm9yaWdlIGtub3BcIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJUb29uIHBhZ2luYXRpdGVsc1wiLFxuICAgIG5hdmlnYXRlVG9Vcmw6IFwiTmFhciBVUkwgZG9vcnN0dXJlblwiLFxuICAgIG5hdmlnYXRlVG9VcmxPbkNvbmRpdGlvbjogXCJDb25kaXRpZSBvbSBuYWFyIFVSTCBkb29yIHRlIHN0dXJlblwiLFxuICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbjogXCJDb25kaXRpZSBvbSBIVE1MIGJpaiBhZnJvbmRlbiB0ZSB0b25lblwiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcIlRvb24gdm9sdG9vaWRlIHBhZ2luYVwiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCJUb29uIHBhZ2luYW51bW1lcnNcIixcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwiVnJhYWcgZm91dGxvY2F0aWVcIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwiVG9vbiB2b29ydGdhbmdzYmFsa1wiLFxuICAgIHByb2dyZXNzQmFyVHlwZTogXCJUeXBlIHZvb3J0Z2FuZ3NiYWxrXCIsXG4gICAgcXVlc3Rpb25zT25QYWdlTW9kZTogXCJWcmFnZW4gcGVyIHBhZ2luYVwiLFxuICAgIG1vZGU6IFwiTW9kdXNcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOiBcIkdhIGF1dG9tYXRpc2NoIG5hYXIgZGUgdm9sZ2VuZGUgcGFnaW5hXCIsXG4gICAgY2hlY2tFcnJvcnNNb2RlOiBcIk1vZHVzIGZvdXRjb250cm9sZVwiLFxuICAgIGNsZWFySW52aXNpYmxlVmFsdWVzOiBcIkR1aWRlbGlqa2Ugb256aWNodGJhcmUgd2FhcmRlblwiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydCBlbnF1w6p0ZXRla3N0XCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIlBhZ2luYSB2b3JpZ2UgdGVrc3RcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiUGFnaW5hIHZvbGdlbmRlIHRla3N0XCIsXG4gICAgY29tcGxldGVUZXh0OiBcIlZvbGxlZGlnZSB0ZWtzdFwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJWZXJlaXN0ZSB0ZWtzdFwiLFxuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogXCJWcmFhZyBzdGFydCBpbmRleFwiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTogXCJWcmFhZyB0aXRlbCBzamFibG9vblwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCJFZXJzdGUgcGFnaW5hIGlzIGdlc3RhcnRcIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwiSXMgw6nDqW4gcGFnaW5hXCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCJNYXhpbWFsZSB0aWpkIG9tIHBhZ2luYSB0ZSB2b2x0b29pZW5cIixcbiAgICBzaG93VGltZXJQYW5lbDogXCJUb29uIHRpbWVyIHBhbmVlbFwiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCJUb29uIHRpbWVyIHBhbmVlbG1vZHVzXCIsXG5cbiAgICBkZWZhdWx0UGFuZWxWYWx1ZTogXCJTdGFuZGFhcmQgcGFuZWVsd2FhcmRlXCIsXG4gICAgZGVmYXVsdFJvd1ZhbHVlOiBcIlN0YW5kYWFyZCByaWp3YWFyZGVcIixcbiAgICBoYXNOb25lOiBcIkhlZWZ0IGVyIGdlZW5cIixcbiAgICBub25lVGV4dDogXCJHZWVuIHRla3N0XCIsXG5cbiAgICB0ZXh0OiBcIlRla3N0XCIsXG4gIH0sXG59O1xuLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5lZGl0b3JMb2NhbGl6YXRpb24ubG9jYWxlc1tcIm5sXCJdID0gbmxTdHJpbmdzO1xuIiwiLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxuLy9pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24sIGRlZmF1bHRTdHJpbmdzIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuXG5leHBvcnQgdmFyIGVuU3RyaW5ncyA9IHtcbiAgLy9zdXJ2ZXkgdGVtcGxhdGVzXG4gIHN1cnZleToge1xuICAgIGVkaXQ6IFwiRWRpdFwiLFxuICAgIGV4dGVybmFsSGVscExpbms6IFwiV2F0Y2ggYW5kIGxlYXJuIGhvdyB0byBjcmVhdGUgc3VydmV5c1wiLFxuICAgIGV4dGVybmFsSGVscExpbmtVcmw6XG4gICAgICBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2NoYW5uZWwvVUNIMnJ1OW9rSWNvb05aZnBJYnlxNHFRP3ZpZXdfYXM9c3Vic2NyaWJlclwiLFxuICAgIGRyb3BRdWVzdGlvbjogXCJQbGVhc2UgZHJvcCBhIHF1ZXN0aW9uIGhlcmUgZnJvbSB0aGUgVG9vbGJveC5cIixcbiAgICBhZGRMb2dpY0l0ZW06IFwiQ3JlYXRlIGEgcnVsZSB0byBjdXN0b21pemUgdGhlIGZsb3cgb2YgdGhlIHN1cnZleS5cIixcbiAgICBjb3B5OiBcIkNvcHlcIixcbiAgICBkdXBsaWNhdGU6IFwiRHVwbGljYXRlXCIsXG4gICAgYWRkVG9Ub29sYm94OiBcIkFkZCB0byB0b29sYm94XCIsXG4gICAgZGVsZXRlUGFuZWw6IFwiRGVsZXRlIFBhbmVsXCIsXG4gICAgZGVsZXRlUXVlc3Rpb246IFwiRGVsZXRlIFF1ZXN0aW9uXCIsXG4gICAgY29udmVydFRvOiBcIkNvbnZlcnQgdG9cIixcbiAgICBkcmFnOiBcIkRyYWcgZWxlbWVudFwiLFxuICB9LFxuICAvL3F1ZXN0aW9uVHlwZXNcbiAgcXQ6IHtcbiAgICBkZWZhdWx0OiBcIkRlZmF1bHRcIixcbiAgICBjaGVja2JveDogXCJDaGVja2JveFwiLFxuICAgIGNvbW1lbnQ6IFwiQ29tbWVudFwiLFxuICAgIGltYWdlcGlja2VyOiBcIkltYWdlIHBpY2tlclwiLFxuICAgIHJhbmtpbmc6IFwiUmFua2luZ1wiLFxuICAgIGltYWdlOiBcIkltYWdlXCIsXG4gICAgZHJvcGRvd246IFwiRHJvcGRvd25cIixcbiAgICBmaWxlOiBcIkZpbGVcIixcbiAgICBodG1sOiBcIkh0bWxcIixcbiAgICBtYXRyaXg6IFwiTWF0cml4IChzaW5nbGUgY2hvaWNlKVwiLFxuICAgIG1hdHJpeGRyb3Bkb3duOiBcIk1hdHJpeCAobXVsdGlwbGUgY2hvaWNlKVwiLFxuICAgIG1hdHJpeGR5bmFtaWM6IFwiTWF0cml4IChkeW5hbWljIHJvd3MpXCIsXG4gICAgbXVsdGlwbGV0ZXh0OiBcIk11bHRpcGxlIFRleHRcIixcbiAgICBwYW5lbDogXCJQYW5lbFwiLFxuICAgIHBhbmVsZHluYW1pYzogXCJQYW5lbCAoZHluYW1pYyBwYW5lbHMpXCIsXG4gICAgcmFkaW9ncm91cDogXCJSYWRpb2dyb3VwXCIsXG4gICAgcmF0aW5nOiBcIlJhdGluZ1wiLFxuICAgIHRleHQ6IFwiU2luZ2xlIElucHV0XCIsXG4gICAgYm9vbGVhbjogXCJCb29sZWFuXCIsXG4gICAgZXhwcmVzc2lvbjogXCJFeHByZXNzaW9uIChyZWFkLW9ubHkpXCIsXG4gICAgc2lnbmF0dXJlcGFkOiBcIlNpZ25hdHVyZSBwYWRcIixcbiAgICBmbG93cGFuZWw6IFwiRmxvdyBQYW5lbFwiLFxuICB9LFxuICAvL1N0cmluZ3MgaW4gRWRpdG9yXG4gIGVkOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJEZWZhdWx0ICh7MH0pXCIsXG4gICAgc3VydmV5OiBcIlN1cnZleVwiLFxuICAgIHNldHRpbmdzOiBcIlN1cnZleSBTZXR0aW5nc1wiLFxuICAgIHNldHRpbmdzVG9vbHRpcDogXCJPcGVuIHN1cnZleSBzZXR0aW5nc1wiLFxuICAgIC8vb3BqZWN0UHJvcGVydGllc0hlYWRlcjogXCJBZHZhbmNlZFwiLFxuICAgIC8vc2hvd09iamVjdFByb3BlcnRpZXM6IFwiU2hvdyBPYmplY3QgUHJvcGVydGllc1wiLFxuICAgIC8vaGlkZU9iamVjdFByb3BlcnRpZXM6IFwiSGlkZSBPYmplY3QgUHJvcGVydGllc1wiLFxuICAgIHNob3dQYW5lbDogXCJTaG93IFBhbmVsXCIsXG4gICAgaGlkZVBhbmVsOiBcIkhpZGUgUGFuZWxcIixcbiAgICAvL2VkaXRTdXJ2ZXk6IFwiRWRpdCBTdXJ2ZXlcIixcbiAgICBhZGROZXdQYWdlOiBcIkFkZCBOZXcgUGFnZVwiLFxuICAgIG1vdmVSaWdodDogXCJTY3JvbGwgdG8gdGhlIFJpZ2h0XCIsXG4gICAgbW92ZUxlZnQ6IFwiU2Nyb2xsIHRvIHRoZSBMZWZ0XCIsXG4gICAgZGVsZXRlUGFnZTogXCJEZWxldGUgUGFnZVwiLFxuICAgIGVkaXRQYWdlOiBcIkVkaXQgUGFnZVwiLFxuICAgIGVkaXQ6IFwiRWRpdFwiLFxuICAgIG5ld1BhZ2VOYW1lOiBcInBhZ2VcIixcbiAgICBuZXdRdWVzdGlvbk5hbWU6IFwicXVlc3Rpb25cIixcbiAgICBuZXdQYW5lbE5hbWU6IFwicGFuZWxcIixcbiAgICBuZXdUZXh0SXRlbU5hbWU6IFwidGV4dFwiLFxuICAgIHRlc3RTdXJ2ZXk6IFwiVGVzdCBTdXJ2ZXlcIixcbiAgICB0ZXN0U3VydmV5QWdhaW46IFwiVGVzdCBTdXJ2ZXkgQWdhaW5cIixcbiAgICB0ZXN0U3VydmV5V2lkdGg6IFwiU3VydmV5IHdpZHRoOiBcIixcbiAgICBuYXZpZ2F0ZVRvTXNnOiBcIllvdSBoYWQgdG8gbmF2aWdhdGUgdG86XCIsXG4gICAgbG9naWM6IFwiU3VydmV5IExvZ2ljXCIsXG4gICAgZW1iZWRTdXJ2ZXk6IFwiRW1iZWQgU3VydmV5XCIsXG4gICAgdHJhbnNsYXRpb246IFwiVHJhbnNsYXRpb25cIixcbiAgICBzYXZlU3VydmV5OiBcIlNhdmUgU3VydmV5XCIsXG4gICAgc2F2ZVN1cnZleVRvb2x0aXA6IFwiU2F2ZSBTdXJ2ZXlcIixcbiAgICBkZXNpZ25lcjogXCJTdXJ2ZXkgRGVzaWduZXJcIixcbiAgICBqc29uRWRpdG9yOiBcIkpTT04gRWRpdG9yXCIsXG4gICAgdW5kbzogXCJVbmRvXCIsXG4gICAgcmVkbzogXCJSZWRvXCIsXG4gICAgdW5kb1Rvb2x0aXA6IFwiVW5kbyBsYXN0IGNoYW5nZVwiLFxuICAgIHJlZG9Ub29sdGlwOiBcIlJlZG8gdGhlIGNoYW5nZVwiLFxuICAgIGNvcHk6IFwiQ29weVwiLFxuICAgIGN1dDogXCJDdXRcIixcbiAgICBwYXN0ZTogXCJQYXN0ZVwiLFxuICAgIGNvcHlUb29sdGlwOiBcIkNvcHkgc2VsZWN0aW9uIHRvIGNsaXBib2FyZFwiLFxuICAgIGN1dFRvb2x0aXA6IFwiQ3V0IHNlbGVjdGlvbiB0byBjbGlwYm9hcmRcIixcbiAgICBwYXN0ZVRvb2x0aXA6IFwiUGFzdGUgZnJvbSBjbGlwYm9hcmRcIixcbiAgICBvcHRpb25zOiBcIk9wdGlvbnNcIixcbiAgICBnZW5lcmF0ZVZhbGlkSlNPTjogXCJHZW5lcmF0ZSBWYWxpZCBKU09OXCIsXG4gICAgZ2VuZXJhdGVSZWFkYWJsZUpTT046IFwiR2VuZXJhdGUgUmVhZGFibGUgSlNPTlwiLFxuICAgIHRvb2xib3g6IFwiVG9vbGJveFwiLFxuICAgIFwicHJvcGVydHktZ3JpZFwiOiBcIlByb3BlcnRpZXNcIixcbiAgICB0b29sYm94R2VuZXJhbENhdGVnb3J5OiBcIkdlbmVyYWxcIixcbiAgICAvL2RlbFNlbE9iamVjdDogXCJEZWxldGUgc2VsZWN0ZWQgb2JqZWN0XCIsXG4gICAgLy9lZGl0U2VsT2JqZWN0OiBcIkVkaXQgc2VsZWN0ZWQgb2JqZWN0XCIsXG4gICAgY29ycmVjdEpTT046IFwiUGxlYXNlIGNvcnJlY3QgSlNPTi5cIixcbiAgICBzdXJ2ZXlSZXN1bHRzOiBcIlN1cnZleSBSZXN1bHQ6IFwiLFxuICAgIHN1cnZleVJlc3VsdHNUYWJsZTogXCJBcyBUYWJsZVwiLFxuICAgIHN1cnZleVJlc3VsdHNKc29uOiBcIkFzIEpTT05cIixcbiAgICByZXN1bHRzVGl0bGU6IFwiUXVlc3Rpb24gVGl0bGVcIixcbiAgICByZXN1bHRzTmFtZTogXCJRdWVzdGlvbiBOYW1lXCIsXG4gICAgcmVzdWx0c1ZhbHVlOiBcIkFuc3dlciBWYWx1ZVwiLFxuICAgIHJlc3VsdHNEaXNwbGF5VmFsdWU6IFwiRGlzcGxheSBWYWx1ZVwiLFxuICAgIG1vZGlmaWVkOiBcIk1vZGlmaWVkXCIsXG4gICAgc2F2aW5nOiBcIlNhdmluZ1wiLFxuICAgIHNhdmVkOiBcIlNhdmVkXCIsXG4gICAgcHJvcGVydHlFZGl0b3JFcnJvcjogXCJFcnJvcjpcIixcbiAgICBzYXZlRXJyb3I6IFwiRXJyb3IhIEVkaXRvciBjb250ZW50IGlzIG5vdCBzYXZlZC5cIixcbiAgICB0cmFuc2xhdGlvbkFkZExhbmd1YWdlOiBcIlNlbGVjdCBsYW5ndWFnZSB0byB0cmFuc2xhdGVcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxTdHJpbmdzOiBcIlNob3cgYWxsIHN0cmluZ3NcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxQYWdlczogXCJTaG93IGFsbCBwYWdlc1wiLFxuICAgIHRyYW5zbGF0aW9uTm9TdHJpbmdzOiBcIk5vIHN0cmluZ3MgdG8gdHJhbnNsYXRlLiBQbGVhc2UsIGNoYW5nZSB0aGUgZmlsdGVyLlwiLFxuICAgIHRyYW5zbGF0aW9uRXhwb3J0VG9TQ1ZCdXR0b246IFwiRXhwb3J0IHRvIENTVlwiLFxuICAgIHRyYW5zbGF0aW9uSW1wb3J0RnJvbVNDVkJ1dHRvbjogXCJJbXBvcnQgZnJvbSBDU1ZcIixcbiAgICB0cmFuc2xhdGlvbk1lcmdlTG9jYWxlV2l0aERlZmF1bHQ6IFwiTWVyZ2UgezB9IHdpdGggZGVmYXVsdCBsb2NhbGVcIixcbiAgICBib2xkOiBcIkJvbGRcIixcbiAgICBpdGFsaWM6IFwiSXRhbGljXCIsXG4gICAgdW5kZXJsaW5lOiBcIlVuZGVybGluZVwiLFxuICAgIGZwQWRkUXVlc3Rpb246IFwiQWRkIHF1ZXN0aW9uLi4uXCIsXG4gICAgc2VsZWN0UGFnZTogXCJTZWxlY3QgcGFnZS4uLlwiLFxuICAgIGNob29zZUVsZW1lbnQ6IFwiQ2hvb3NlIGVsZW1lbnQuLi5cIixcbiAgICAvL2NvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbkl0ZW1UZXh0OiBcIlNob3cgaWY6XCIsXG4gICAgbGc6IHtcbiAgICAgIGFkZE5ld0l0ZW06IFwiXCIsIC8vQnkgZGVmYXVsdCB0aGUgdmFsdWUgaXMgdGFrZW4gZnJvbSBwZS5hZGROZXcgJ0FkZCBOZXcnLCB5b3UgY2FuIHNldCBpdCB0byAnQWRkIE5ldyBSdWxlJyBmb3IgZXhhbXBsZS5cbiAgICAgIC8vTG9naWMgdGFiIHN0cmluZ3NcbiAgICAgIHBhZ2VfdmlzaWJpbGl0eU5hbWU6IFwiUGFnZSB2aXNpYmlsaXR5XCIsXG4gICAgICBwYW5lbF92aXNpYmlsaXR5TmFtZTogXCJQYW5lbCB2aXNpYmlsaXR5XCIsXG4gICAgICBwYW5lbF9lbmFibGVOYW1lOiBcIlBhbmVsIGVuYWJsZS9kaXNhYmxlXCIsXG4gICAgICBxdWVzdGlvbl92aXNpYmlsaXR5TmFtZTogXCJRdWVzdGlvbiB2aXNpYmlsaXR5XCIsXG4gICAgICBxdWVzdGlvbl9lbmFibGVOYW1lOiBcIlF1ZXN0aW9uIGVuYWJsZS9kaXNhYmxlXCIsXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlTmFtZTogXCJRdWVzdGlvbiBvcHRpb25hbCByZXF1aXJlZFwiLFxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZU5hbWU6IFwiQ29tcGxldGUgc3VydmV5XCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlTmFtZTogXCJTZXQgcXVlc3Rpb24gdmFsdWVcIixcbiAgICAgIHRyaWdnZXJfY29weXZhbHVlTmFtZTogXCJDb3B5IHF1ZXN0aW9uIHZhbHVlXCIsXG4gICAgICB0cmlnZ2VyX3NraXBOYW1lOiBcIlNraXAgdG8gcXVlc3Rpb25cIixcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvbk5hbWU6IFwiUnVuIGN1c3RvbSBleHByZXNzaW9uXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25OYW1lOiBcIkN1c3RvbSAnVGhhbmsgeW91IHBhZ2UnIHRleHRcIixcblxuICAgICAgcGFnZV92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiTWFrZSB0aGUgcGFnZSB2aXNpYmxlIHdoZW4gdGhlIGxvZ2ljIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLiBPdGhlcndpc2Uga2VlcCBpdCBpbnZpc2libGUuXCIsXG4gICAgICBwYW5lbF92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiTWFrZSB0aGUgcGFuZWwgdmlzaWJsZSB3aGVuIHRoZSBsb2dpYyBleHByZXNzaW9uIHJldHVybnMgdHJ1ZS4gT3RoZXJ3aXNlIGtlZXAgaXQgaW52aXNpYmxlLlwiLFxuICAgICAgcGFuZWxfZW5hYmxlRGVzY3JpcHRpb246XG4gICAgICAgIFwiTWFrZSB0aGUgcGFuZWwsIGFuZCBhbGwgZWxlbWVudHMgaW5zaWRlIGl0LCBlbmFibGUgd2hlbiB0aGUgbG9naWMgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUuIE90aGVyd2lzZSBrZWVwIHRoZW0gZGlzYWJsZWQuXCIsXG4gICAgICBxdWVzdGlvbl92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiTWFrZSB0aGUgcXVlc3Rpb24gdmlzaWJsZSB3aGVuIHRoZSBsb2dpYyBleHByZXNzaW9uIHJldHVybnMgdHJ1ZS4gT3RoZXJ3aXNlIGtlZXAgaXQgaW52aXNpYmxlLlwiLFxuICAgICAgcXVlc3Rpb25fZW5hYmxlRGVzY3JpcHRpb246XG4gICAgICAgIFwiTWFrZSB0aGUgcXVlc3Rpb24gZW5hYmxlIHdoZW4gdGhlIGxvZ2ljIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLiBPdGhlcndpc2Uga2VlcCBpdCBkaXNhYmxlZC5cIixcbiAgICAgIHF1ZXN0aW9uX3JlcXVpcmVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJRdWVzdGlvbiBiZWNvbWVzIHJlcXVpcmVkIHdoZW4gdGhlIGxvZ2ljIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLlwiLFxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIldoZW4gdGhlIGxvZ2ljIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlIHRoZW4gdGhlIHN1cnZleSBiZWNvbWVzIGNvbXBsZXRlZCBhbmQgYW4gZW5kLXVzZXIgc2VlIHRoZSAnVGhhbmsgeW91IHBhZ2UnLlwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIldoZW4gcXVlc3Rpb24gdmFsdWVzLCB0aGF0IGFyZSB1c2VkIGluIHRoZSBsb2dpYyBleHByZXNzaW9uLCBhcmUgY2hhbmdlZCBhbmQgdGhlIGxvZ2ljIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCB0aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHNlbGVjdGVkIHF1ZXN0aW9uLlwiLFxuICAgICAgdHJpZ2dlcl9jb3B5dmFsdWVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJXaGVuIHF1ZXN0aW9uIHZhbHVlcywgdGhhdCBhcmUgdXNlZCBpbiB0aGUgbG9naWMgZXhwcmVzc2lvbiwgYXJlIGNoYW5nZWQgYW5kIHRoZSBsb2dpYyBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgdmFsdWUgb2Ygb25lIHNlbGVjdGVkIHF1ZXN0aW9uIGlzIGNvcGllZCB0byBhbm90aGVyIHNlbGVjdGVkIHF1ZXN0aW9uLlwiLFxuICAgICAgdHJpZ2dlcl9za2lwRGVzY3JpcHRpb246XG4gICAgICAgIFwiV2hlbiB0aGUgbG9naWMgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUgdGhlbiB0aGUgc3VydmV5IHNraXAgdG8gLyBmb2N1cyB0aGUgc2VsZWN0ZWQgcXVlc3Rpb24uXCIsXG4gICAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25EZXNjcmlwdGlvbjpcbiAgICAgICAgXCJXaGVuIHRoZSBsb2dpYyBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgY3VzdG9tIGV4cHJlc3Npb24gaXMgcGVyZm9ybWVkLiBZb3UgbWF5IG9wdGlvbmFsbHkgc2V0IHRoaXMgZXhwcmVzc2lvbiByZXN1bHQgaW50byB0aGUgc2VsZWN0ZWQgcXVlc3Rpb25cIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbkRlc2NyaXB0aW9uOlxuICAgICAgICBcIklmIHRoZSBsb2dpYyBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgJ1RoYW5rIHlvdSBwYWdlJyBpcyBjaGFuZ2VkIHRvIHRoZSBnaXZlbiBvbmUuXCIsXG5cbiAgICAgIGl0ZW1FeHByZXNzaW9uVGV4dDogXCJXaGVuIGV4cHJlc3Npb246ICd7MH0nIHJldHVybnMgdHJ1ZTpcIiwgLy97MH0gLSB0aGUgZXhwcmVzc2lvblxuICAgICAgcGFnZV92aXNpYmlsaXR5VGV4dDogXCJNYWtlIHBhZ2UgezB9IHZpc2libGVcIiwgLy97MH0gcGFnZSBuYW1lXG4gICAgICBwYW5lbF92aXNpYmlsaXR5VGV4dDogXCJNYWtlIHBhbmVsIHswfSB2aXNpYmxlXCIsIC8vezB9IHBhbmVsIG5hbWVcbiAgICAgIHBhbmVsX2VuYWJsZVRleHQ6IFwiTWFrZSBwYW5lbCB7MH0gZW5hYmxlXCIsIC8vezB9IHBhbmVsIG5hbWVcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlUZXh0OiBcIk1ha2UgcXVlc3Rpb24gezB9IHZpc2libGVcIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgcXVlc3Rpb25fZW5hYmxlVGV4dDogXCJNYWtlIHF1ZXN0aW9uIHswfSBlbmFibGVcIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgcXVlc3Rpb25fcmVxdWlyZVRleHQ6IFwiTWFrZSBxdWVzdGlvbiB7MH0gcmVxdWlyZWRcIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZVRleHQ6IFwiU3VydmV5IGJlY29tZXMgY29tcGxldGVkXCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlVGV4dDogXCJTZXQgaW50byBxdWVzdGlvbjogezB9IHZhbHVlIHsxfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lLCB7MX0gc2V0VmFsdWVcbiAgICAgIHRyaWdnZXJfY29weXZhbHVlVGV4dDogXCJDb3B5IGludG8gcXVlc3Rpb246IHswfSB2YWx1ZSBmcm9tIHF1ZXN0aW9uIHsxfVwiLCAvL3swfSBhbmQgezF9IHF1ZXN0aW9uIG5hbWVzXG4gICAgICB0cmlnZ2VyX3NraXBUZXh0OiBcIlN1cnZleSBza2lwIHRvIHRoZSBxdWVzdGlvbiB7MH1cIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDE6IFwiUnVuIGV4cHJlc3Npb246ICd7MH0nXCIsIC8vezB9IHRoZSBleHByZXNzaW9uXG4gICAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25UZXh0MjogXCIgYW5kIHNldCBpdHMgcmVzdWx0IGludG8gcXVlc3Rpb246IHswfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25UZXh0OlxuICAgICAgICBcIlNob3cgY3VzdG9tIHRleHQgZm9yIHRoZSAnVGhhbmsgeW91IHBhZ2UnLlwiLFxuXG4gICAgICBjb25kaXRpb25zOiBcIkNvbmRpdGlvbihzKVwiLFxuICAgICAgYWN0aW9uczogXCJBY3Rpb24ocylcIixcbiAgICAgIGV4cHJlc3Npb25FZGl0b3JUaXRsZTogXCJEZWZpbmUgY29uZGl0aW9uKHMpXCIsXG4gICAgICBhY3Rpb25zRWRpdG9yVGl0bGU6IFwiRGVmaW5lIGFjdGlvbihzKVwiLFxuXG4gICAgICBkZWxldGVBY3Rpb246IFwiRGVsZXRlIGFjdGlvblwiLFxuICAgICAgYWRkTmV3QWN0aW9uOiBcIkFkZCBuZXcgYWN0aW9uXCIsXG4gICAgICBzZWxlY3RlZEFjdGlvbkNhcHRpb246IFwiU2VsZWN0IGFuIGFjdGlvbiB0byBhZGQuLi5cIixcblxuICAgICAgZXhwcmVzc2lvbkludmFsaWQ6XG4gICAgICAgIFwiVGhlIGxvZ2ljIGV4cHJlc3Npb24gaXMgZW1wdHkgb3IgaW52YWxpZC4gUGxlYXNlIGNvcnJlY3QgaXQuXCIsXG4gICAgICBub0FjdGlvbkVycm9yOiBcIlBsZWFzZSwgYWRkIGF0IGxlYXN0IG9uZSBhY3Rpb24uXCIsXG4gICAgICBhY3Rpb25JbnZhbGlkOiBcIlBsZWFzZSwgZml4IHByb2JsZW1zIGluIHlvdXIgYWN0aW9uKHMpLlwiLFxuICAgICAgZXhwcmVzc2lvblNldHVwOiBcIlwiLFxuICAgICAgYWN0aW9uc1NldHVwOiBcIlwiLFxuICAgIH0sXG4gIH0sXG4gIC8vUHJvcGVydHkgbmFtZXMgaW4gdGFibGUgaGVhZGVyc1xuICAvLyBwZWw6IHtcbiAgLy8gICBpc1JlcXVpcmVkOiBcIlJlcXVpcmVkP1wiXG4gIC8vIH0sXG4gIC8vUHJvcGVydHkgRWRpdG9yc1xuICBwZToge1xuICAgIGFwcGx5OiBcIkFwcGx5XCIsXG4gICAgb2s6IFwiT0tcIixcbiAgICBzYXZlOiBcIlNhdmVcIixcbiAgICBzYXZlVG9vbHRpcDogXCJTYXZlXCIsXG4gICAgY2FuY2VsOiBcIkNhbmNlbFwiLFxuICAgIHJlc2V0OiBcIlJlc2V0XCIsXG4gICAgcmVmcmVzaDogXCJSZWZyZXNoXCIsXG4gICAgLy8gY2xvc2U6IFwiQ2xvc2VcIixcbiAgICBkZWxldGU6IFwiRGVsZXRlXCIsXG4gICAgYWRkOiBcIkFkZFwiLFxuICAgIGFkZE5ldzogXCJBZGQgTmV3XCIsXG4gICAgYWRkSXRlbTogXCJDbGljayB0byBhZGQgYW4gaXRlbS4uLlwiLFxuICAgIGFkZE90aGVyOiBcIk90aGVyXCIsXG4gICAgYWRkU2VsZWN0QWxsOiBcIlNlbGVjdCBBbGxcIixcbiAgICBhZGROb25lOiBcIk5vbmVcIixcbiAgICByZW1vdmVBbGw6IFwiUmVtb3ZlIEFsbFwiLFxuICAgIGVkaXQ6IFwiRWRpdFwiLFxuICAgIGJhY2s6IFwiUmV0dXJuIHdpdGhvdXQgc2F2aW5nXCIsXG4gICAgYmFja1Rvb2x0aXA6IFwiUmV0dXJuIHdpdGhvdXQgc2F2aW5nXCIsXG4gICAgc2F2ZUFuZEJhY2s6IFwiU2F2ZSBhbmQgcmV0dXJuXCIsXG4gICAgc2F2ZUFuZEJhY2tUb29sdGlwOiBcIlNhdmUgYW5kIHJldHVyblwiLFxuICAgIC8vIGl0ZW1WYWx1ZUVkaXQ6IFwiVmlzaWJsZSBJZlwiLFxuICAgIGVkaXRDaG9pY2VzOiBcIkVkaXQgQ2hvaWNlc1wiLFxuICAgIHNob3dDaG9pY2VzOiBcIlNob3cgQ2hvaWNlc1wiLFxuICAgIG1vdmU6IFwiTW92ZVwiLFxuICAgIGVtcHR5OiBcIjxlbXB0eT5cIixcbiAgICAvLyBub3RFbXB0eTogXCI8ZWRpdCB2YWx1ZT5cIixcbiAgICBmYXN0RW50cnk6IFwiRmFzdCBFbnRyeVwiLFxuICAgIGZvcm1FbnRyeTogXCJGb3JtIEVudHJ5XCIsXG4gICAgdGVzdFNlcnZpY2U6IFwiVGVzdCB0aGUgc2VydmljZVwiLFxuICAgIGl0ZW1TZWxlY3RvckVtcHR5OiBcIlBsZWFzZSBzZWxlY3QgdGhlIGVsZW1lbnRcIixcbiAgICBjb25kaXRpb25BY3Rpb25FbXB0eTogXCJQbGVhc2Ugc2VsZWN0IHRoZSBhY3Rpb25cIixcbiAgICBjb25kaXRpb25TZWxlY3RRdWVzdGlvbjogXCJTZWxlY3QgcXVlc3Rpb24uLi5cIixcbiAgICBjb25kaXRpb25TZWxlY3RQYWdlOiBcIlNlbGVjdCBwYWdlLi4uXCIsXG4gICAgY29uZGl0aW9uU2VsZWN0UGFuZWw6IFwiU2VsZWN0IHBhbmVsLi4uXCIsXG4gICAgY29uZGl0aW9uVmFsdWVRdWVzdGlvblRpdGxlOiBcIlBsZWFzZSBlbnRlci9zZWxlY3QgdGhlIHZhbHVlXCIsXG4gICAgLy8gY29uZGl0aW9uSGVscDpcbiAgICAvLyAgIFwiUGxlYXNlIGVudGVyIGEgYm9vbGVhbiBleHByZXNzaW9uLiBJdCBzaG91bGQgcmV0dXJuIHRydWUgdG8ga2VlcCB0aGUgcXVlc3Rpb24vcGFnZSB2aXNpYmxlLiBGb3IgZXhhbXBsZToge3F1ZXN0aW9uMX0gPSAndmFsdWUxJyBvciAoe3F1ZXN0aW9uMn0gKiB7cXVlc3Rpb240fSAgPiAyMCBhbmQge3F1ZXN0aW9uM30gPCA1KVwiLFxuICAgIGV4cHJlc3Npb25IZWxwOlxuICAgICAgXCJZb3UgY2FuIHVzZSBjdXJseSBicmFja2V0cyB0byBnZXQgYWNjZXNzIHRvIHRoZSBxdWVzdGlvbiB2YWx1ZXM6IHtxdWVzdGlvbjF9ICsge3F1ZXN0aW9uMn0sICh7cHJpY2V9KntxdWFudGl0eX0pICogKDEwMCAtIHtkaXNjb3VudH0pLiBZb3UgY2FuIHVzZSBmdW5jdGlvbnMgYXM6IGlpZigpLCB0b2RheSgpLCBhZ2UoKSwgbWluKCksIG1heCgpLCBjb3VudCgpLCBhdmcoKSBhbmQgb3RoZXJzLlwiLFxuICAgIGFjZUVkaXRvckhlbHA6IFwiUHJlc3MgY3RybCtzcGFjZSB0byBnZXQgZXhwcmVzc2lvbiBjb21wbGV0aW9uIGhpbnRcIixcbiAgICBhY2VFZGl0b3JSb3dUaXRsZTogXCJDdXJyZW50IHJvd1wiLFxuICAgIGFjZUVkaXRvclBhbmVsVGl0bGU6IFwiQ3VycmVudCBwYW5lbFwiLFxuICAgIHNob3dNb3JlOiBcIkZvciBtb3JlIGRldGFpbHMgcGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uXCIsXG4gICAgLy8gY29uZGl0aW9uU2hvd01vcmVVcmw6XG4gICAgLy8gICBcImh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5UGFyYW1ldGVyP2lkPVF1ZXN0aW9uJnBhcmFtZXRlcj12aXNpYmxlSWZcIixcbiAgICBhc3Npc3RhbnRUaXRsZTogXCJBdmFpbGFibGUgcXVlc3Rpb25zOlwiLFxuICAgIGNlbGxzRW1wdHlSb3dzQ29sdW1uczogXCJUaGVyZSBpcyBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIGNvbHVtbiBvciByb3dcIixcblxuICAgIHByb3BlcnR5SXNFbXB0eTogXCJQbGVhc2UgZW50ZXIgYSB2YWx1ZVwiLFxuICAgIHByb3BlcnR5SXNOb1VuaXF1ZTogXCJQbGVhc2UgZW50ZXIgYSB1bmlxdWUgdmFsdWVcIixcbiAgICBwcm9wZXJ0eU5hbWVJc05vdFVuaXF1ZTogXCJQbGVhc2UgZW50ZXIgYSB1bmlxdWUgbmFtZVwiLFxuICAgIGxpc3RJc0VtcHR5OiBcIkFkZCBhIG5ldyBpdGVtXCIsXG4gICAgZXhwcmVzc2lvbklzRW1wdHk6IFwiRXhwcmVzc2lvbiBpcyBlbXB0eVwiLFxuICAgIHZhbHVlOiBcIlZhbHVlXCIsXG4gICAgdGV4dDogXCJUZXh0XCIsXG4gICAgcm93aWQ6IFwiUm93IElEXCIsXG4gICAgaW1hZ2VMaW5rOiBcIkltYWdlIExpbmtcIixcbiAgICBjb2x1bW5FZGl0OiBcIkVkaXQgY29sdW1uOiB7MH1cIixcbiAgICBpdGVtRWRpdDogXCJFZGl0IGl0ZW06IHswfVwiLFxuXG4gICAgdXJsOiBcIlVSTFwiLFxuICAgIHBhdGg6IFwiUGF0aFwiLFxuICAgIHZhbHVlTmFtZTogXCJWYWx1ZSBuYW1lXCIsXG4gICAgdGl0bGVOYW1lOiBcIlRpdGxlIG5hbWVcIixcbiAgICB0aXRsZVBsYWNlaG9sZGVyOiBcIklucHV0IHRpdGxlIGhlcmVcIixcbiAgICBzdXJ2ZXlUaXRsZVBsYWNlaG9sZGVyOiBcIklucHV0IHN1cnZleSB0aXRsZSBoZXJlXCIsXG4gICAgcGFnZVRpdGxlUGxhY2Vob2xkZXI6IFwiSW5wdXQgcGFnZSB0aXRsZSBoZXJlXCIsXG4gICAgZGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCJFbnRlciBhIGRlc2NyaXB0aW9uXCIsXG4gICAgc3VydmV5RGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCJFbnRlciBhIHN1cnZleSBkZXNjcmlwdGlvblwiLFxuICAgIHBhZ2VEZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcIkVudGVyIGEgcGFnZSBkZXNjcmlwdGlvblwiLFxuXG4gICAgaGFzT3RoZXI6IFwiSGFzIG90aGVyIGl0ZW1cIixcbiAgICBvdGhlclRleHQ6IFwiT3RoZXIgaXRlbSB0ZXh0XCIsXG4gICAgaGFzTm9uZTogXCJIYXMgbm9uZSBpdGVtXCIsXG4gICAgbm9uZVRleHQ6IFwiTm9uZSBpdGVtIHRleHRcIixcbiAgICBoYXNTZWxlY3RBbGw6IFwiSGFzIHNlbGVjdCBhbGwgaXRlbVwiLFxuICAgIHNlbGVjdEFsbFRleHQ6IFwiU2VsZWN0IGFsbCBpdGVtIHRleHRcIixcbiAgICBjaG9pY2VzTWluOiBcIk1pbmltdW0gdmFsdWUgZm9yIGF1dG8gZ2VuZXJhdGVkIGl0ZW1zXCIsXG4gICAgY2hvaWNlc01heDogXCJNYXhpbXVtIHZhbHVlIGZvciBhdXRvIGdlbmVyYXRlZCBpdGVtc1wiLFxuICAgIGNob2ljZXNTdGVwOiBcIlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYXV0byBnZW5lcmF0ZWQgaXRlbXNcIixcbiAgICBuYW1lOiBcIk5hbWVcIixcbiAgICB0aXRsZTogXCJUaXRsZVwiLFxuICAgIGNlbGxUeXBlOiBcIkNlbGwgdHlwZVwiLFxuICAgIGNvbENvdW50OiBcIkNvbHVtbiBjb3VudFwiLFxuICAgIGNob2ljZXNPcmRlcjogXCJTZWxlY3QgY2hvaWNlcyBvcmRlclwiLFxuICAgIHZpc2libGU6IFwiSXMgdmlzaWJsZT9cIixcbiAgICBpc1JlcXVpcmVkOiBcIklzIHJlcXVpcmVkP1wiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwiUmVxdWlyZSBhbnN3ZXIgZm9yIGFsbCByb3dzXCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwiUmVxdWlyZWQgZXJyb3IgdGV4dFwiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwiSXMgc3RhcnQgd2l0aCBuZXcgbGluZT9cIixcbiAgICByb3dzOiBcIlJvdyBjb3VudFwiLFxuICAgIGNvbHM6IFwiQ29sdW1uIGNvdW50XCIsXG4gICAgcGxhY2VIb2xkZXI6IFwiSW5wdXQgcGxhY2UgaG9sZGVyXCIsXG4gICAgc2hvd1ByZXZpZXc6IFwiU2hvdyBwcmV2aWV3IGFyZWFcIixcbiAgICBzdG9yZURhdGFBc1RleHQ6IFwiU3RvcmUgZmlsZSBjb250ZW50IGluIEpTT04gcmVzdWx0IGFzIHRleHRcIixcbiAgICBtYXhTaXplOiBcIk1heGltdW0gZmlsZSBzaXplIGluIGJ5dGVzXCIsXG4gICAgaW1hZ2VIZWlnaHQ6IFwiSW1hZ2UgaGVpZ2h0XCIsXG4gICAgaW1hZ2VXaWR0aDogXCJJbWFnZSB3aWR0aFwiLFxuICAgIHJvd0NvdW50OiBcIlJvdyBjb3VudFwiLFxuICAgIGNvbHVtbkxheW91dDogXCJDb2x1bW5zIGxheW91dFwiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcIkFkZCByb3cgYnV0dG9uIGxvY2F0aW9uXCIsXG4gICAgYWRkUm93VGV4dDogXCJBZGQgcm93IGJ1dHRvbiB0ZXh0XCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCJSZW1vdmUgcm93IGJ1dHRvbiB0ZXh0XCIsXG4gICAgcmF0ZU1pbjogXCJNaW5pbXVtIHJhdGVcIixcbiAgICByYXRlTWF4OiBcIk1heGltdW0gcmF0ZVwiLFxuICAgIHJhdGVTdGVwOiBcIlJhdGUgc3RlcFwiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCJNaW5pbXVtIHJhdGUgZGVzY3JpcHRpb25cIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwiTWF4aW11bSByYXRlIGRlc2NyaXB0aW9uXCIsXG4gICAgaW5wdXRUeXBlOiBcIklucHV0IHR5cGVcIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJPcHRpb25zIGNhcHRpb25cIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiRGVmYXVsdCB2YWx1ZVwiLFxuICAgIGNlbGxzRGVmYXVsdFJvdzogXCJEZWZhdWx0IGNlbGxzIHRleHRzXCIsXG5cbiAgICBzdXJ2ZXlFZGl0b3JUaXRsZTogXCJFZGl0IHN1cnZleSBzZXR0aW5nc1wiLFxuICAgIHFFZGl0b3JUaXRsZTogXCJFZGl0OiB7MH1cIixcblxuICAgIG1heExlbmd0aDogXCJNYXhpbXVtIGxlbmd0aFwiLFxuXG4gICAgYnVpbGRFeHByZXNzaW9uOiBcIkJ1aWxkXCIsXG4gICAgZWRpdEV4cHJlc3Npb246IFwiRWRpdFwiLFxuICAgIGFuZDogXCJBbmRcIixcbiAgICBvcjogXCJPclwiLFxuICAgIHJlbW92ZTogXCJSZW1vdmVcIixcbiAgICBhZGRDb25kaXRpb246IFwiQWRkIGNvbmRpdGlvblwiLFxuXG4gICAgLy9zdXJ2ZXlcbiAgICBzaG93VGl0bGU6IFwiU2hvdy9oaWRlIHRpdGxlXCIsXG4gICAgZXhwYW5kQ29sbGFwc2VUaXRsZTogXCJFeHBhbmQvY29sbGFwc2UgdGl0bGVcIixcbiAgICBsb2NhbGU6IFwiRGVmYXVsdCBsYW5ndWFnZVwiLFxuICAgIHNpbXVsYXRvcjogXCJDaG9vc2UgZGV2aWNlXCIsXG4gICAgbGFuZHNjYXBlT3JpZW50YXRpb246IFwiTGFuZHNjYXBlXCIsXG4gICAgbW9kZTogXCJNb2RlIChlZGl0L3JlYWQgb25seSlcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCJDbGVhciBpbnZpc2libGUgdmFsdWVzXCIsXG4gICAgY29va2llTmFtZTogXCJDb29raWUgbmFtZSAodG8gZGlzYWJsZSBydW4gc3VydmV5IHR3byB0aW1lcyBsb2NhbGx5KVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcIlNlbmQgc3VydmV5IHJlc3VsdHMgb24gcGFnZSBuZXh0XCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiU3RvcmUgJ290aGVycycgdmFsdWUgaW4gc2VwYXJhdGUgZmllbGRcIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJTaG93IHBhZ2UgdGl0bGVzXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcIlNob3cgcGFnZSBudW1iZXJzXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIlBhZ2UgcHJldmlvdXMgYnV0dG9uIHRleHRcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiUGFnZSBuZXh0IGJ1dHRvbiB0ZXh0XCIsXG4gICAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRlIGJ1dHRvbiB0ZXh0XCIsXG4gICAgcHJldmlld1RleHQ6IFwiUHJldmlldyBidXR0b24gdGV4dFwiLFxuICAgIGVkaXRUZXh0OiBcIkVkaXQgYnV0dG9uIHRleHRcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnQgYnV0dG9uIHRleHRcIixcbiAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IFwiU2hvdyBuYXZpZ2F0aW9uIGJ1dHRvbnMgKGRlZmF1bHQgbmF2aWdhdGlvbilcIixcbiAgICBzaG93UHJldkJ1dHRvbjogXCJTaG93IHByZXZpb3VzIGJ1dHRvbiAodXNlciBtYXkgcmV0dXJuIG9uIHByZXZpb3VzIHBhZ2UpXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcIlRoZSBmaXJzdCBwYWdlIGluIHRoZSBzdXJ2ZXkgaXMgYSBzdGFydGVkIHBhZ2UuXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwiU2hvdyB0aGUgY29tcGxldGVkIHBhZ2UgYXQgdGhlIGVuZCAoY29tcGxldGVkSHRtbClcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOlxuICAgICAgXCJPbiBhbnN3ZXJpbmcgYWxsIHF1ZXN0aW9ucywgZ28gdG8gdGhlIG5leHQgcGFnZSBhdXRvbWF0aWNhbGx5XCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIlNob3cgcHJvZ3Jlc3MgYmFyXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcIlF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcIlRoZSBxdWVzdGlvbiByZXF1aXJlZCBzeW1ib2wocylcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwiUXVlc3Rpb24gc3RhcnQgaW5kZXggKDEsIDIgb3IgJ0EnLCAnYScpXCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCJTaG93IHF1ZXN0aW9uIG51bWJlcnNcIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6XG4gICAgICBcIlF1ZXN0aW9uIHRpdGxlIHRlbXBsYXRlLCBkZWZhdWx0IGlzOiAne25vfS4ge3JlcXVpcmV9IHt0aXRsZX0nXCIsXG4gICAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBcIlF1ZXN0aW9uIGVycm9yIGxvY2F0aW9uXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcIkZvY3VzIGZpcnN0IHF1ZXN0aW9uIG9uIGNoYW5naW5nIHRoZSBwYWdlXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwiRWxlbWVudHMgb3JkZXIgb24gdGhlIHBhZ2VcIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwiTWF4aW11bSB0aW1lIHRvIGZpbmlzaCB0aGUgc3VydmV5XCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCJNYXhpbXVtIHRpbWUgdG8gZmluaXNoIGEgcGFnZSBpbiB0aGUgc3VydmV5XCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwiU2hvdyB0aW1lciBwYW5lbFwiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCJTaG93IHRpbWVyIHBhbmVsIG1vZGVcIixcbiAgICByZW5kZXJNb2RlOiBcIlJlbmRlciBtb2RlXCIsXG4gICAgYWxsb3dBZGRQYW5lbDogXCJBbGxvdyBhZGRpbmcgYSBwYW5lbFwiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwiQWxsb3cgcmVtb3ZpbmcgdGhlIHBhbmVsXCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcIkFkZGluZyBwYW5lbCB0ZXh0XCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcIlJlbW92aW5nIHBhbmVsIHRleHRcIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwiU2hvdyBhbGwgZWxlbWVudHMgb24gb25lIHBhZ2VcIixcbiAgICBodG1sOiBcIkh0bWxcIixcbiAgICBleHByZXNzaW9uOiBcIkV4cHJlc3Npb25cIixcblxuICAgIG1pblZhbHVlOiBcIk1pbmltdW0gdmFsdWVcIixcbiAgICBtYXhWYWx1ZTogXCJNYXhpbXVtIHZhbHVlXCIsXG4gICAgbWluTGVuZ3RoOiBcIk1pbmltdW0gbGVuZ3RoXCIsXG4gICAgYWxsb3dEaWdpdHM6IFwiQWxsb3cgZGlnaXRzXCIsXG4gICAgbWluQ291bnQ6IFwiTWluaW11bSBjb3VudFwiLFxuICAgIG1heENvdW50OiBcIk1heGltdW0gY291bnRcIixcbiAgICByZWdleDogXCJSZWd1bGFyIGV4cHJlc3Npb25cIixcblxuICAgIHRvdGFsVGV4dDogXCJUb3RhbCB0ZXh0XCIsXG4gICAgdG90YWxUeXBlOiBcIlRvdGFsIHR5cGVcIixcbiAgICB0b3RhbEV4cHJlc3Npb246IFwiVG90YWwgZXhwcmVzc2lvblwiLFxuICAgIHRvdGFsRGlzcGxheVN0eWxlOiBcIlRvdGFsIGRpc3BsYXkgc3R5bGVcIixcbiAgICB0b3RhbEN1cnJlbmN5OiBcIlRvdGFsIGN1cnJlbmN5XCIsXG4gICAgdG90YWxGb3JtYXQ6IFwiVG90YWwgZm9ybWF0XCIsXG5cbiAgICAvLyBIZWFkZXIgIGFkb3JuZXJcbiAgICBsb2dvUG9zaXRpb246IFwiTG9nbyBwb3NpdGlvblwiLFxuICAgIGFkZExvZ286IFwiQWRkIGxvZ28uLi5cIixcbiAgICBjaGFuZ2VMb2dvOiBcIkNoYW5nZSBsb2dvLi4uXCIsXG4gICAgbG9nb1Bvc2l0aW9uczoge1xuICAgICAgbm9uZTogXCJSZW1vdmUgbG9nb1wiLFxuICAgICAgbGVmdDogXCJMZWZ0XCIsXG4gICAgICByaWdodDogXCJSaWdodFwiLFxuICAgICAgdG9wOiBcIk9uIHRoZSB0b3BcIixcbiAgICAgIGJvdHRvbTogXCJJbiB0aGUgYm90dG9tXCIsXG4gICAgfSxcblxuICAgIHRhYnM6IHtcbiAgICAgIGdlbmVyYWw6IFwiR2VuZXJhbFwiLFxuICAgICAgZmlsZU9wdGlvbnM6IFwiT3B0aW9uc1wiLFxuICAgICAgaHRtbDogXCJIdG1sIEVkaXRvclwiLFxuICAgICAgY29sdW1uczogXCJDb2x1bW5zXCIsXG4gICAgICByb3dzOiBcIlJvd3NcIixcbiAgICAgIGNob2ljZXM6IFwiQ2hvaWNlc1wiLFxuICAgICAgaXRlbXM6IFwiSXRlbXNcIixcbiAgICAgIHZpc2libGVJZjogXCJWaXNpYmxlIElmXCIsXG4gICAgICBlbmFibGVJZjogXCJFbmFibGUgSWZcIixcbiAgICAgIHJlcXVpcmVkSWY6IFwiUmVxdWlyZWQgSWZcIixcbiAgICAgIHJhdGVWYWx1ZXM6IFwiUmF0ZSBWYWx1ZXNcIixcbiAgICAgIGNob2ljZXNCeVVybDogXCJDaG9pY2VzIGZyb20gV2ViXCIsXG4gICAgICBtYXRyaXhDaG9pY2VzOiBcIkRlZmF1bHQgQ2hvaWNlc1wiLFxuICAgICAgbXVsdGlwbGVUZXh0SXRlbXM6IFwiVGV4dCBJbnB1dHNcIixcbiAgICAgIG51bWJlcmluZzogXCJOdW1iZXJpbmdcIixcbiAgICAgIHZhbGlkYXRvcnM6IFwiVmFsaWRhdG9yc1wiLFxuICAgICAgbmF2aWdhdGlvbjogXCJOYXZpZ2F0aW9uXCIsXG4gICAgICBxdWVzdGlvbjogXCJRdWVzdGlvblwiLFxuICAgICAgcGFnZXM6IFwiUGFnZXNcIixcbiAgICAgIGNvbXBsZXRlZEh0bWw6IFwiQ29tcGxldGVkIEh0bWxcIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbjogXCJDb21wbGV0ZWQgSHRtbCBvbiBDb25kaXRpb25cIixcbiAgICAgIGxvYWRpbmdIdG1sOiBcIkxvYWRpbmcgSHRtbFwiLFxuICAgICAgdGltZXI6IFwiVGltZXIvUXVpelwiLFxuICAgICAgY2FsY3VsYXRlZFZhbHVlczogXCJDYWxjdWxhdGVkIFZhbHVlc1wiLFxuICAgICAgdHJpZ2dlcnM6IFwiVHJpZ2dlcnNcIixcbiAgICAgIHRlbXBsYXRlVGl0bGU6IFwiVGVtcGxhdGUgdGl0bGVcIixcbiAgICAgIHRvdGFsczogXCJUb3RhbHNcIixcbiAgICAgIGxvZ2ljOiBcIkxvZ2ljXCIsXG4gICAgICBsYXlvdXQ6IFwiTGF5b3V0XCIsXG4gICAgICBkYXRhOiBcIkRhdGFcIixcbiAgICAgIHZhbGlkYXRpb246IFwiVmFsaWRhdGlvblwiLFxuICAgICAgY2VsbHM6IFwiQ2VsbHNcIixcbiAgICAgIHNob3dPbkNvbXBsZXRlZDogXCJTaG93IG9uIENvbXBsZXRlZFwiLFxuICAgICAgbG9nbzogXCJMb2dvIGluIFN1cnZleSBUaXRsZVwiLFxuICAgICAgc2xpZGVyOiBcIlNsaWRlclwiLFxuICAgICAgb3RoZXJzOiBcIk90aGVyc1wiLFxuICAgIH0sXG4gICAgZWRpdFByb3BlcnR5OiBcIkVkaXQgcHJvcGVydHkgJ3swfSdcIixcbiAgICBpdGVtczogXCJbIEl0ZW1zOiB7MH0gXVwiLFxuXG4gICAgZW50ZXJOZXdWYWx1ZTogXCJQbGVhc2UsIGVudGVyIHRoZSB2YWx1ZS5cIixcbiAgICBub3F1ZXN0aW9uczogXCJUaGVyZSBpcyBubyBhbnkgcXVlc3Rpb24gaW4gdGhlIHN1cnZleS5cIixcbiAgICBjcmVhdGV0cmlnZ2VyOiBcIlBsZWFzZSBjcmVhdGUgYSB0cmlnZ2VyXCIsXG4gICAgdGl0bGVLZXlib2FyZEFkb3JuZXJUaXA6IFwiUHJlc3MgZW50ZXIgYnV0dG9uIHRvIGVkaXRcIixcbiAgICBrZXlib2FyZEFkb3JuZXJUaXA6IFwiUHJlc3MgZW50ZXIgYnV0dG9uIHRvIGVkaXQgaXRlbSwgcHJlc3MgZGVsZXRlIGJ1dHRvbiB0byBkZWxldGUgaXRlbSwgcHJlc3MgYWx0IHBsdXMgYXJyb3cgdXAgb3IgYXJyb3cgZG93biB0byBtb3ZlIGl0ZW1cIixcbiAgICBrZXlib2FyZE1vdmVJdGVtc1RpcDogXCJQcmVzcyBhbHQgcGx1cyBhcnJvdyB1cCBvciBhcnJvdyBkb3duIHRvIG1vdmUgaXRlbVwiLFxuICAgIHRyaWdnZXJPbjogXCJPbiBcIixcbiAgICB0cmlnZ2VyTWFrZVBhZ2VzVmlzaWJsZTogXCJNYWtlIHBhZ2VzIHZpc2libGU6XCIsXG4gICAgdHJpZ2dlck1ha2VRdWVzdGlvbnNWaXNpYmxlOiBcIk1ha2UgZWxlbWVudHMgdmlzaWJsZTpcIixcbiAgICB0cmlnZ2VyQ29tcGxldGVUZXh0OiBcIkNvbXBsZXRlIHRoZSBzdXJ2ZXkgaWYgc3VjY2VlZC5cIixcbiAgICB0cmlnZ2VyTm90U2V0OiBcIlRoZSB0cmlnZ2VyIGlzIG5vdCBzZXRcIixcbiAgICB0cmlnZ2VyUnVuSWY6IFwiUnVuIGlmXCIsXG4gICAgdHJpZ2dlclNldFRvTmFtZTogXCJDaGFuZ2UgdmFsdWUgb2Y6IFwiLFxuICAgIHRyaWdnZXJGcm9tTmFtZTogXCJDb3B5IHZhbHVlIGZyb206IFwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uOiBcIlJ1biB0aGlzIEV4cHJlc3Npb246XCIsXG4gICAgdHJpZ2dlclNldFZhbHVlOiBcInRvOiBcIixcbiAgICB0cmlnZ2VyR290b05hbWU6IFwiR28gdG8gdGhlIHF1ZXN0aW9uOlwiLFxuICAgIHRyaWdnZXJJc1ZhcmlhYmxlOiBcIkRvIG5vdCBwdXQgdGhlIHZhcmlhYmxlIGludG8gdGhlIHN1cnZleSByZXN1bHQuXCIsXG4gICAgdHJpZ2dlclJ1bkV4cHJlc3Npb25FbXB0eTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBleHByZXNzaW9uXCIsXG5cbiAgICBub0ZpbGU6IFwiTm8gZmlsZSBjaG9vc2VuXCIsXG4gIH0sXG4gIC8vUHJvcGVydHkgdmFsdWVzXG4gIHB2OiB7XG4gICAgdHJ1ZTogXCJ0cnVlXCIsXG4gICAgZmFsc2U6IFwiZmFsc2VcIixcbiAgICBpbmhlcml0OiBcImluaGVyaXRcIixcbiAgICBzaG93OiBcInNob3dcIixcbiAgICBoaWRlOiBcImhpZGVcIixcbiAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICBpbml0aWFsOiBcImluaXRpYWxcIixcbiAgICByYW5kb206IFwicmFuZG9tXCIsXG4gICAgY29sbGFwc2VkOiBcImNvbGxhcHNlZFwiLFxuICAgIGV4cGFuZGVkOiBcImV4cGFuZGVkXCIsXG4gICAgbm9uZTogXCJub25lXCIsXG4gICAgYXNjOiBcImFzY2VuZGluZ1wiLFxuICAgIGRlc2M6IFwiZGVzY2VuZGluZ1wiLFxuICAgIGluZGV0ZXJtaW5hdGU6IFwiaW5kZXRlcm1pbmF0ZVwiLFxuICAgIGRlY2ltYWw6IFwiZGVjaW1hbFwiLFxuICAgIGN1cnJlbmN5OiBcImN1cnJlbmN5XCIsXG4gICAgcGVyY2VudDogXCJwZXJjZW50XCIsXG4gICAgZmlyc3RFeHBhbmRlZDogXCJmaXJzdEV4cGFuZGVkXCIsXG4gICAgb2ZmOiBcIm9mZlwiLFxuICAgIG9uUGFuZWw6IFwib25QYW5lbFwiLFxuICAgIG9uU3VydmV5OiBcIm9uU3VydmV5XCIsXG4gICAgbGlzdDogXCJsaXN0XCIsXG4gICAgcHJvZ3Jlc3NUb3A6IFwicHJvZ3Jlc3NUb3BcIixcbiAgICBwcm9ncmVzc0JvdHRvbTogXCJwcm9ncmVzc0JvdHRvbVwiLFxuICAgIHByb2dyZXNzVG9wQm90dG9tOiBcInByb2dyZXNzVG9wQm90dG9tXCIsXG4gICAgaG9yaXpvbnRhbDogXCJob3Jpem9udGFsXCIsXG4gICAgdmVydGljYWw6IFwidmVydGljYWxcIixcbiAgICB0b3A6IFwidG9wXCIsXG4gICAgYm90dG9tOiBcImJvdHRvbVwiLFxuICAgIHRvcEJvdHRvbTogXCJ0b3AgYW5kIGJvdHRvbVwiLFxuICAgIGJvdGg6IFwiYm90aFwiLFxuICAgIGxlZnQ6IFwibGVmdFwiLFxuICAgIGNvbG9yOiBcImNvbG9yXCIsXG4gICAgZGF0ZTogXCJkYXRlXCIsXG4gICAgZGF0ZXRpbWU6IFwiZGF0ZXRpbWVcIixcbiAgICBcImRhdGV0aW1lLWxvY2FsXCI6IFwiZGF0ZXRpbWUtbG9jYWxcIixcbiAgICBlbWFpbDogXCJlbWFpbFwiLFxuICAgIG1vbnRoOiBcIm1vbnRoXCIsXG4gICAgbnVtYmVyOiBcIm51bWJlclwiLFxuICAgIHBhc3N3b3JkOiBcInBhc3N3b3JkXCIsXG4gICAgcmFuZ2U6IFwicmFuZ2VcIixcbiAgICB0ZWw6IFwidGVsXCIsXG4gICAgdGV4dDogXCJ0ZXh0XCIsXG4gICAgdGltZTogXCJ0aW1lXCIsXG4gICAgdXJsOiBcInVybFwiLFxuICAgIHdlZWs6IFwid2Vla1wiLFxuICAgIGhpZGRlbjogXCJoaWRkZW5cIixcbiAgICBvbjogXCJvblwiLFxuICAgIG9uUGFnZTogXCJvblBhZ2VcIixcbiAgICBlZGl0OiBcImVkaXRcIixcbiAgICBkaXNwbGF5OiBcImRpc3BsYXlcIixcbiAgICBvbkNvbXBsZXRlOiBcIm9uQ29tcGxldGVcIixcbiAgICBvbkhpZGRlbjogXCJvbkhpZGRlblwiLFxuICAgIGFsbDogXCJhbGxcIixcbiAgICBwYWdlOiBcInBhZ2VcIixcbiAgICBzdXJ2ZXk6IFwic3VydmV5XCIsXG4gICAgb25OZXh0UGFnZTogXCJvbk5leHRQYWdlXCIsXG4gICAgb25WYWx1ZUNoYW5nZWQ6IFwib25WYWx1ZUNoYW5nZWRcIixcbiAgICBzaW5nbGVQYWdlOiBcInNpbmdsZSBwYWdlXCIsXG4gICAgc3RhbmRhcmQ6IFwic3RhbmRhcmRcIixcbiAgICBxdWVzdGlvblBlclBhZ2U6IFwicXVlc3Rpb24gcGVyIHBhZ2VcIixcbiAgICBub1ByZXZpZXc6IFwibm8gcHJldmlld1wiLFxuICAgIHNob3dBbGxRdWVzdGlvbnM6IFwic2hvdyBwcmV2aWV3IHdpdGggYWxsIHF1ZXN0aW9uc1wiLFxuICAgIHNob3dBbnN3ZXJlZFF1ZXN0aW9uczogXCJzaG93IHByZXZpZXcgd2l0aCBhbnN3ZXJlZCBxdWVzdGlvbnNcIixcbiAgfSxcbiAgLy9PcGVyYXRvcnNcbiAgb3A6IHtcbiAgICBlbXB0eTogXCJpcyBlbXB0eVwiLFxuICAgIG5vdGVtcHR5OiBcImlzIG5vdCBlbXB0eVwiLFxuICAgIGVxdWFsOiBcImVxdWFsc1wiLFxuICAgIG5vdGVxdWFsOiBcIm5vdCBlcXVhbHNcIixcbiAgICBjb250YWluczogXCJjb250YWluc1wiLFxuICAgIG5vdGNvbnRhaW5zOiBcIm5vdCBjb250YWluc1wiLFxuICAgIGFueW9mOiBcImFueSBvZlwiLFxuICAgIGFsbG9mOiBcImFsbCBvZlwiLFxuICAgIGdyZWF0ZXI6IFwiZ3JlYXRlclwiLFxuICAgIGxlc3M6IFwibGVzc1wiLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBcImdyZWF0ZXIgb3IgZXF1YWxzXCIsXG4gICAgbGVzc29yZXF1YWw6IFwibGVzcyBvciBlcXVhbHNcIixcbiAgICBhbmQ6IFwiYW5kXCIsXG4gICAgb3I6IFwib3JcIixcbiAgfSxcbiAgLy9FbWJlZCB3aW5kb3dcbiAgZXc6IHtcbiAgICBhbmd1bGFyOiBcIlVzZSBBbmd1bGFyIHZlcnNpb25cIixcbiAgICBqcXVlcnk6IFwiVXNlIGpRdWVyeSB2ZXJzaW9uXCIsXG4gICAga25vY2tvdXQ6IFwiVXNlIEtub2Nrb3V0IHZlcnNpb25cIixcbiAgICByZWFjdDogXCJVc2UgUmVhY3QgdmVyc2lvblwiLFxuICAgIHZ1ZTogXCJVc2UgVnVlIHZlcnNpb25cIixcbiAgICBib290c3RyYXA6IFwiRm9yIGJvb3RzdHJhcCBmcmFtZXdvcmtcIixcbiAgICBtb2Rlcm46IFwiTW9kZXJuIHRoZW1lXCIsXG4gICAgZGVmYXVsdDogXCJEZWZhdWx0IHRoZW1lXCIsXG4gICAgb3JhbmdlOiBcIk9yYW5nZSB0aGVtZVwiLFxuICAgIGRhcmtibHVlOiBcIkRhcmtibHVlIHRoZW1lXCIsXG4gICAgZGFya3Jvc2U6IFwiRGFya3Jvc2UgdGhlbWVcIixcbiAgICBzdG9uZTogXCJTdG9uZSB0aGVtZVwiLFxuICAgIHdpbnRlcjogXCJXaW50ZXIgdGhlbWVcIixcbiAgICB3aW50ZXJzdG9uZTogXCJXaW50ZXItU3RvbmUgdGhlbWVcIixcbiAgICBzaG93T25QYWdlOiBcIlNob3cgc3VydmV5IG9uIGEgcGFnZVwiLFxuICAgIHNob3dJbldpbmRvdzogXCJTaG93IHN1cnZleSBpbiBhIHdpbmRvd1wiLFxuICAgIGxvYWRGcm9tU2VydmVyOiBcIkxvYWQgU3VydmV5IEpTT04gZnJvbSBzZXJ2ZXJcIixcbiAgICB0aXRsZVNjcmlwdDogXCJTY3JpcHRzIGFuZCBzdHlsZXNcIixcbiAgICB0aXRsZUh0bWw6IFwiSFRNTFwiLFxuICAgIHRpdGxlSmF2YVNjcmlwdDogXCJKYXZhU2NyaXB0XCIsXG4gIH0sXG4gIC8vVGVzdCBTdXJ2ZXlcbiAgdHM6IHtcbiAgICBzZWxlY3RQYWdlOiBcIlNlbGVjdCB0aGUgcGFnZSB0byB0ZXN0IGl0OlwiLFxuICAgIHNob3dJbnZpc2libGVFbGVtZW50czogXCJTaG93IGludmlzaWJsZSBlbGVtZW50c1wiLFxuICB9LFxuICB2YWxpZGF0b3JzOiB7XG4gICAgYW5zd2VyY291bnR2YWxpZGF0b3I6IFwiYW5zd2VyIGNvdW50XCIsXG4gICAgZW1haWx2YWxpZGF0b3I6IFwiZS1tYWlsXCIsXG4gICAgZXhwcmVzc2lvbnZhbGlkYXRvcjogXCJleHByZXNzaW9uXCIsXG4gICAgbnVtZXJpY3ZhbGlkYXRvcjogXCJudW1lcmljXCIsXG4gICAgcmVnZXh2YWxpZGF0b3I6IFwicmVnZXhcIixcbiAgICB0ZXh0dmFsaWRhdG9yOiBcInRleHRcIixcbiAgfSxcbiAgdHJpZ2dlcnM6IHtcbiAgICBjb21wbGV0ZXRyaWdnZXI6IFwiY29tcGxldGUgc3VydmV5XCIsXG4gICAgc2V0dmFsdWV0cmlnZ2VyOiBcInNldCB2YWx1ZVwiLFxuICAgIGNvcHl2YWx1ZXRyaWdnZXI6IFwiY29weSB2YWx1ZVwiLFxuICAgIHNraXB0cmlnZ2VyOiBcInNraXAgdG8gcXVlc3Rpb25cIixcbiAgICBydW5leHByZXNzaW9udHJpZ2dlcjogXCJydW4gZXhwcmVzc2lvblwiLFxuICAgIHZpc2libGV0cmlnZ2VyOiBcImNoYW5nZSB2aXNpYmlsaXR5IChkZXByZWNhdGVkKVwiLFxuICB9LFxuICBwZWhlbHA6IHtcbiAgICAvL2V4cHJlc3Npb246XG4gIH0sXG4gIC8vUHJvcGVydGllc1xuICBwOiB7XG4gICAgbmFtZTogXCJuYW1lXCIsXG4gICAgdGl0bGU6IHtcbiAgICAgIG5hbWU6IFwidGl0bGVcIixcbiAgICAgIHRpdGxlOiBcIkxlYXZlIGl0IGVtcHR5LCBpZiBpdCBpcyB0aGUgc2FtZSBhcyAnTmFtZSdcIixcbiAgICB9LFxuXG4gICAgbmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5OiBcIm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eVwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcInF1ZXN0aW9uc09yZGVyXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIm1heFRpbWVUb0ZpbmlzaFwiLFxuXG4gICAgdmlzaWJsZTogXCJ2aXNpYmxlXCIsXG4gICAgdmlzaWJsZUlmOiBcInZpc2libGVJZlwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjogXCJkZXNjcmlwdGlvblwiLFxuICAgIHN0YXRlOiBcInN0YXRlXCIsXG4gICAgaXNSZXF1aXJlZDogXCJpc1JlcXVpcmVkXCIsXG4gICAgcmVxdWlyZWRJZjogXCJyZXF1aXJlZElmXCIsXG4gICAgaW5kZW50OiBcImluZGVudFwiLFxuICAgIHJlcXVpcmVkRXJyb3JUZXh0OiBcInJlcXVpcmVkRXJyb3JUZXh0XCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCJzdGFydFdpdGhOZXdMaW5lXCIsXG4gICAgaW5uZXJJbmRlbnQ6IFwiaW5uZXJJbmRlbnRcIixcbiAgICBwYWdlOiBcInBhZ2VcIixcblxuICAgIHdpZHRoOiBcIndpZHRoXCIsXG5cbiAgICBjb21tZW50VGV4dDogXCJjb21tZW50VGV4dFwiLFxuICAgIHZhbHVlTmFtZTogXCJ2YWx1ZU5hbWVcIixcbiAgICBlbmFibGVJZjogXCJlbmFibGVJZlwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJkZWZhdWx0VmFsdWVcIixcbiAgICBjb3JyZWN0QW5zd2VyOiBcImNvcnJlY3RBbnN3ZXJcIixcbiAgICByZWFkT25seTogXCJyZWFkT25seVwiLFxuICAgIHZhbGlkYXRvcnM6IFwidmFsaWRhdG9yc1wiLFxuICAgIHRpdGxlTG9jYXRpb246IFwidGl0bGVMb2NhdGlvblwiLFxuXG4gICAgaGFzQ29tbWVudDogXCJoYXNDb21tZW50XCIsXG4gICAgaGFzT3RoZXI6IFwiaGFzT3RoZXJcIixcbiAgICBjaG9pY2VzOiBcImNob2ljZXNcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwiY2hvaWNlc09yZGVyXCIsXG4gICAgY2hvaWNlc0J5VXJsOiBcImNob2ljZXNCeVVybFwiLFxuICAgIG90aGVyVGV4dDogXCJvdGhlclRleHRcIixcbiAgICBvdGhlckVycm9yVGV4dDogXCJvdGhlckVycm9yVGV4dFwiLFxuICAgIHN0b3JlT3RoZXJzQXNDb21tZW50OiBcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsXG5cbiAgICBsYWJlbDogXCJsYWJlbFwiLFxuICAgIHNob3dUaXRsZTogXCJzaG93VGl0bGVcIixcbiAgICB2YWx1ZVRydWU6IFwidmFsdWVUcnVlXCIsXG4gICAgdmFsdWVGYWxzZTogXCJ2YWx1ZUZhbHNlXCIsXG5cbiAgICBjb2xzOiBcImNvbHNcIixcbiAgICByb3dzOiBcInJvd3NcIixcbiAgICBwbGFjZUhvbGRlcjogXCJwbGFjZUhvbGRlclwiLFxuXG4gICAgb3B0aW9uc0NhcHRpb246IFwib3B0aW9uc0NhcHRpb25cIixcblxuICAgIGV4cHJlc3Npb246IFwiZXhwcmVzc2lvblwiLFxuICAgIGZvcm1hdDogXCJmb3JtYXRcIixcbiAgICBkaXNwbGF5U3R5bGU6IFwiZGlzcGxheVN0eWxlXCIsXG4gICAgY3VycmVuY3k6IFwiY3VycmVuY3lcIixcbiAgICB1c2VHcm91cGluZzogXCJ1c2VHcm91cGluZ1wiLFxuXG4gICAgc2hvd1ByZXZpZXc6IFwic2hvd1ByZXZpZXdcIixcbiAgICBhbGxvd011bHRpcGxlOiBcImFsbG93TXVsdGlwbGVcIixcbiAgICBpbWFnZUhlaWdodDogXCJpbWFnZUhlaWdodFwiLFxuICAgIGltYWdlV2lkdGg6IFwiaW1hZ2VXaWR0aFwiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCJzdG9yZURhdGFBc1RleHRcIixcbiAgICBtYXhTaXplOiBcIm1heFNpemVcIixcblxuICAgIGh0bWw6IFwiaHRtbFwiLFxuXG4gICAgY29sdW1uczogXCJjb2x1bW5zXCIsXG4gICAgY2VsbHM6IFwiY2VsbHNcIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcImlzQWxsUm93UmVxdWlyZWRcIixcblxuICAgIGhvcml6b250YWxTY3JvbGw6IFwiaG9yaXpvbnRhbFNjcm9sbFwiLFxuICAgIGNlbGxUeXBlOiBcImNlbGxUeXBlXCIsXG4gICAgY29sdW1uc0xheW91dDogXCJjb2x1bW5zTGF5b3V0XCIsXG4gICAgY29sdW1uQ29sQ291bnQ6IFwiY29sdW1uQ29sQ291bnRcIixcbiAgICBjb2x1bW5NaW5XaWR0aDogXCJjb2x1bW5NaW5XaWR0aFwiLFxuXG4gICAgcm93Q291bnQ6IFwicm93Q291bnRcIixcbiAgICBtaW5Sb3dDb3VudDogXCJtaW5Sb3dDb3VudFwiLFxuICAgIG1heFJvd0NvdW50OiBcIm1heFJvd0NvdW50XCIsXG4gICAga2V5TmFtZTogXCJrZXlOYW1lXCIsXG4gICAga2V5RHVwbGljYXRpb25FcnJvcjogXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgY29uZmlybURlbGV0ZTogXCJjb25maXJtRGVsZXRlXCIsXG4gICAgY29uZmlybURlbGV0ZVRleHQ6IFwiY29uZmlybURlbGV0ZVRleHRcIixcbiAgICBhZGRSb3dMb2NhdGlvbjogXCJhZGRSb3dMb2NhdGlvblwiLFxuICAgIGFkZFJvd1RleHQ6IFwiYWRkUm93VGV4dFwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwicmVtb3ZlUm93VGV4dFwiLFxuXG4gICAgaXRlbXM6IFwiaXRlbXNcIixcbiAgICBpdGVtU2l6ZTogXCJpdGVtU2l6ZVwiLFxuICAgIGNvbENvdW50OiBcImNvbENvdW50XCIsXG5cbiAgICB0ZW1wbGF0ZVRpdGxlOiBcInRlbXBsYXRlVGl0bGVcIixcbiAgICB0ZW1wbGF0ZURlc2NyaXB0aW9uOiBcInRlbXBsYXRlRGVzY3JpcHRpb25cIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcImFsbG93QWRkUGFuZWxcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcImFsbG93UmVtb3ZlUGFuZWxcIixcbiAgICBwYW5lbENvdW50OiBcInBhbmVsQ291bnRcIixcbiAgICBtaW5QYW5lbENvdW50OiBcIm1pblBhbmVsQ291bnRcIixcbiAgICBtYXhQYW5lbENvdW50OiBcIm1heFBhbmVsQ291bnRcIixcbiAgICBwYW5lbHNTdGF0ZTogXCJwYW5lbHNTdGF0ZVwiLFxuICAgIHBhbmVsQWRkVGV4dDogXCJwYW5lbEFkZFRleHRcIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwicGFuZWxSZW1vdmVUZXh0XCIsXG4gICAgcGFuZWxQcmV2VGV4dDogXCJwYW5lbFByZXZUZXh0XCIsXG4gICAgcGFuZWxOZXh0VGV4dDogXCJwYW5lbE5leHRUZXh0XCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsXG4gICAgc2hvd1JhbmdlSW5Qcm9ncmVzczogXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsXG4gICAgcmVuZGVyTW9kZTogXCJyZW5kZXJNb2RlXCIsXG4gICAgdGVtcGxhdGVUaXRsZUxvY2F0aW9uOiBcInRlbXBsYXRlVGl0bGVMb2NhdGlvblwiLFxuXG4gICAgcmF0ZVZhbHVlczogXCJyYXRlVmFsdWVzXCIsXG4gICAgcmF0ZU1pbjogXCJyYXRlTWluXCIsXG4gICAgcmF0ZU1heDogXCJyYXRlTWF4XCIsXG4gICAgcmF0ZVN0ZXA6IFwicmF0ZVN0ZXBcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwibWluUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcIm1heFJhdGVEZXNjcmlwdGlvblwiLFxuXG4gICAgaW5wdXRUeXBlOiBcImlucHV0VHlwZVwiLFxuICAgIHNpemU6IFwic2l6ZVwiLFxuXG4gICAgbG9jYWxlOiBcImxvY2FsZVwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzogXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWNcIixcbiAgICBjb21wbGV0ZWRIdG1sOiBcImNvbXBsZXRlZEh0bWxcIixcbiAgICBjb21wbGV0ZWRCZWZvcmVIdG1sOiBcImNvbXBsZXRlZEJlZm9yZUh0bWxcIixcbiAgICBsb2FkaW5nSHRtbDogXCJsb2FkaW5nSHRtbFwiLFxuICAgIHRyaWdnZXJzOiBcInRyaWdnZXJzXCIsXG4gICAgY29va2llTmFtZTogXCJjb29raWVOYW1lXCIsXG4gICAgc2VuZFJlc3VsdE9uUGFnZU5leHQ6IFwic2VuZFJlc3VsdE9uUGFnZU5leHRcIixcbiAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IFwic2hvd05hdmlnYXRpb25CdXR0b25zXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwic2hvd1ByZXZCdXR0b25cIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJzaG93UGFnZVRpdGxlc1wiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcInNob3dDb21wbGV0ZWRQYWdlXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcInNob3dQYWdlTnVtYmVyc1wiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwic2hvd1Byb2dyZXNzQmFyXCIsXG4gICAgbW9kZTogXCJtb2RlXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzogXCJnb05leHRQYWdlQXV0b21hdGljXCIsXG4gICAgY2hlY2tFcnJvcnNNb2RlOiBcImNoZWNrRXJyb3JzTW9kZVwiLFxuICAgIGNsZWFySW52aXNpYmxlVmFsdWVzOiBcImNsZWFySW52aXNpYmxlVmFsdWVzXCIsXG4gICAgc3RhcnRTdXJ2ZXlUZXh0OiBcInN0YXJ0U3VydmV5VGV4dFwiLFxuICAgIHBhZ2VQcmV2VGV4dDogXCJwYWdlUHJldlRleHRcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwicGFnZU5leHRUZXh0XCIsXG4gICAgY29tcGxldGVUZXh0OiBcImNvbXBsZXRlVGV4dFwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJyZXF1aXJlZFRleHRcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwicXVlc3Rpb25TdGFydEluZGV4XCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOiBcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCJmaXJzdFBhZ2VJc1N0YXJ0ZWRcIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwiaXNTaW5nbGVQYWdlXCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCJtYXhUaW1lVG9GaW5pc2hQYWdlXCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwic2hvd1RpbWVyUGFuZWxcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwic2hvd1RpbWVyUGFuZWxNb2RlXCIsXG5cbiAgICBkZWZhdWx0UGFuZWxWYWx1ZTogXCJkZWZhdWx0UGFuZWxWYWx1ZVwiLFxuICAgIGRlZmF1bHRSb3dWYWx1ZTogXCJkZWZhdWx0Um93VmFsdWVcIixcbiAgICBoYXNOb25lOiBcImhhc05vbmVcIixcbiAgICBub25lVGV4dDogXCJub25lVGV4dFwiLFxuXG4gICAgdGV4dDogXCJ0ZXh0XCIsXG4gIH0sXG59O1xuLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG4vL2VkaXRvckxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZW5cIl0gPSBlblN0cmluZ3M7XG4iLCIvL1VuY29tbWVudCB0aGlzIGxpbmUgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlXG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5cbmV4cG9ydCB2YXIgZmlTdHJpbmdzID0ge1xuICAvL3N1cnZleSB0ZW1wbGF0ZXNcbiAgc3VydmV5OiB7XG4gICAgZWRpdDogXCJNdW9ra2FhXCIsXG4gICAgZXh0ZXJuYWxIZWxwTGluazogXCJLYXRzbyBqYSBvcGkgbHVvbWFhbiBreXNlbHlqw6RcIixcbiAgICBleHRlcm5hbEhlbHBMaW5rVXJsOiBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2NoYW5uZWwvVUNIMnJ1OW9rSWNvb05aZnBJYnlxNHFRP3ZpZXdfYXM9c3Vic2NyaWJlclwiLFxuICAgIGRyb3BRdWVzdGlvbjogXCJQdWRvdGEga3lzeW15cyBUecO2a2FsdXBha2lzdGEgdMOkaMOkbi5cIixcbiAgICBhZGRMb2dpY0l0ZW06IFwiTHVvIHPDpMOkbnTDtiBtdWthdXR0YW1hYW4ga3lzZWx5biBrdWxrdWEuXCIsXG4gICAgY29weTogXCJLb3Bpb2lcIixcbiAgICBkdXBsaWNhdGU6IFwiTW9uaXN0YVwiLFxuICAgIGFkZFRvVG9vbGJveDogXCJMaXPDpMOkIFR5w7ZrYWx1cGFra2lpblwiLFxuICAgIGRlbGV0ZVBhbmVsOiBcIlBvaXN0YSBQYW5lZWxpXCIsXG4gICAgZGVsZXRlUXVlc3Rpb246IFwiUG9pc3RhIEt5c3lteXNcIixcbiAgICBjb252ZXJ0VG86IFwiS29udmVydG9pXCIsXG4gICAgZHJhZzogXCJWZWTDpCBlbGVtZW50dGnDpFwiLFxuICB9LFxuICAvL3F1ZXN0aW9uVHlwZXNcbiAgcXQ6IHtcbiAgICBkZWZhdWx0OiBcIk9sZXR1c2Fydm9cIixcbiAgICBjaGVja2JveDogXCJWYWxpbnRhcnV1dHVcIixcbiAgICBjb21tZW50OiBcIktvbW1lbnR0aVwiLFxuICAgIGltYWdlcGlja2VyOiBcIkt1dmFudmFsaXRzaW5cIixcbiAgICByYW5raW5nOiBcIlNpam9pdHVzXCIsXG4gICAgaW1hZ2U6IFwiS3V2YVwiLFxuICAgIGRyb3Bkb3duOiBcIlB1ZG90dXN2YWxpa2tvXCIsXG4gICAgZmlsZTogXCJUaWVkb3N0b1wiLFxuICAgIGh0bWw6IFwiSHRtbFwiLFxuICAgIG1hdHJpeDogXCJNYXRyaXggKHlrc2kgdmFsaW50YSlcIixcbiAgICBtYXRyaXhkcm9wZG93bjogXCJNYXRyaXggKG1vbml2YWxpbnRhKVwiLFxuICAgIG1hdHJpeGR5bmFtaWM6IFwiTWF0cml4IChkeW5hYW1pc2V0IHJpdml0KVwiLFxuICAgIG11bHRpcGxldGV4dDogXCJVc2VpdGEgdGVrc3RlasOkXCIsXG4gICAgcGFuZWw6IFwiUGFuZWVsaVwiLFxuICAgIHBhbmVsZHluYW1pYzogXCJQYW5lZWxpIChkeW5hYW1pc2V0IHBhbmVlbGl0KVwiLFxuICAgIHJhZGlvZ3JvdXA6IFwiUmFkaW9wYWluaWtlcnlobcOkXCIsXG4gICAgcmF0aW5nOiBcIkx1b2tpdHVzXCIsXG4gICAgdGV4dDogXCJUZWtzdGlcIixcbiAgICBib29sZWFuOiBcIlRvdHV1c2Fydm9tdXV0dHVqYVwiLFxuICAgIGV4cHJlc3Npb246IFwiTGF1c2VrZSh2YWluIGx1a3UpXCIsXG4gICAgc2lnbmF0dXJlcGFkOiBcIkFsbGVraXJqb2l0dXNhbHVzdGFcIixcbiAgICAvLyBmbG93cGFuZWw6IFwiU3VqdXZhIFBhbmVlbGlcIixcbiAgfSxcbiAgLy9TdHJpbmdzIGluIEVkaXRvclxuICBlZDoge1xuICAgIGRlZmF1bHRMb2NhbGU6IFwiVmFraW8gKHswfSlcIixcbiAgICBzdXJ2ZXk6IFwiS3lzZWx5XCIsXG4gICAgc2V0dGluZ3M6IFwiS3lzZWx5biBhc2V0dWtzZXRcIixcbiAgICBzZXR0aW5nc1Rvb2x0aXA6IFwiQXZhYSBreXNlbHluIGFzZXR1a3NldFwiLFxuICAgIC8vb3BqZWN0UHJvcGVydGllc0hlYWRlcjogXCJFZGVpc3R5bnl0XCIsXG4gICAgLy9zaG93T2JqZWN0UHJvcGVydGllczogXCJOw6R5dMOkIG9iamVrdGluIG9taW5haXN1dWRldFwiLFxuICAgIC8vaGlkZU9iamVjdFByb3BlcnRpZXM6IFwiUGlpbG90YSBvYmpla3RpbiBvbWluYWlzdXVkZXRcIixcbiAgICBzaG93UGFuZWw6IFwiTsOkeXTDpCBQYW5lZWxpXCIsXG4gICAgaGlkZVBhbmVsOiBcIlBpaWxvdGEgUGFuZWVsaVwiLFxuICAgIGVkaXRTdXJ2ZXk6IFwiTXVva2thYSBreXNlbHnDpFwiLFxuICAgIGFkZE5ld1BhZ2U6IFwiTGlzw6TDpCB1dXNpIHNpdnVcIixcbiAgICBtb3ZlUmlnaHQ6IFwiU2VsYWEgb2lrZWFsbGVcIixcbiAgICBtb3ZlTGVmdDogXCJTZWxhYSB2YXNlbW1hbGxlXCIsXG4gICAgZGVsZXRlUGFnZTogXCJQb2lzdGEgc2l2dVwiLFxuICAgIGVkaXRQYWdlOiBcIk11b2trYWEgc2l2dWFcIixcbiAgICBlZGl0OiBcIk11b2trYWFcIixcbiAgICBuZXdQYWdlTmFtZTogXCJzaXZ1XCIsXG4gICAgbmV3UXVlc3Rpb25OYW1lOiBcImt5c3lteXNcIixcbiAgICBuZXdQYW5lbE5hbWU6IFwicGFuZWVsaVwiLFxuICAgIG5ld1RleHRJdGVtTmFtZTogXCJ0ZWtzdGlcIixcbiAgICB0ZXN0U3VydmV5OiBcIlRlc3RhYSBreXNlbHlcIixcbiAgICB0ZXN0U3VydmV5QWdhaW46IFwiVGVzdGFhIGt5c2VseSB1dWRlc3RhYW5cIixcbiAgICB0ZXN0U3VydmV5V2lkdGg6IFwiS3lzZWx5biBsYWFqdXVzOiBcIixcbiAgICBuYXZpZ2F0ZVRvTXNnOiBcIlNpbnVuIHBpdGkgbmF2aWdvaWRhOlwiLFxuICAgIGxvZ2ljOiBcIkt5c2VseSBsb2dpaWtrYVwiLFxuICAgIGVtYmVkU3VydmV5OiBcIlVwb3RhIGt5c2VseVwiLFxuICAgIHRyYW5zbGF0aW9uOiBcIkvDpMOkbm7DtnNcIixcbiAgICBzYXZlU3VydmV5OiBcIlRhbGxlbm5hIGt5c2VseVwiLFxuICAgIHNhdmVTdXJ2ZXlUb29sdGlwOiBcIlRhbGxlbm5hIGt5c2VseVwiLFxuICAgIGRlc2lnbmVyOiBcIkt5c2VseW4gc3V1bm5pdHRlbGlqYVwiLFxuICAgIGpzb25FZGl0b3I6IFwiSlNPTiBFZGl0b3JpXCIsXG4gICAgdW5kbzogXCJLdW1vYVwiLFxuICAgIHJlZG86IFwiVGVlIHV1ZGVsbGVlblwiLFxuICAgIHVuZG9Ub29sdGlwOiBcIkt1bW9hIHZpaW1laW5lbiBtdXV0b3NcIixcbiAgICByZWRvVG9vbHRpcDogXCJUZWUgbXV1dG9zIHV1ZGVsbGVlblwiLFxuICAgIGNvcHk6IFwiS29waW9pXCIsXG4gICAgY3V0OiBcIkxlaWtrYWFcIixcbiAgICBwYXN0ZTogXCJMaWl0w6RcIixcbiAgICBjb3B5VG9vbHRpcDogXCJLb3Bpb2kgdmFsaW50YSBsZWlrZXDDtnlkw6RsbGVcIixcbiAgICBjdXRUb29sdGlwOiBcIkxlaWtrYWEgdmFsaW50YSBsZWlrZXDDtnlkw6RsbGVcIixcbiAgICBwYXN0ZVRvb2x0aXA6IFwiTGlpdMOkIGxlaWtlcMO2eWTDpGx0w6RcIixcbiAgICBvcHRpb25zOiBcIlZhaWh0b2VoZG90XCIsXG4gICAgZ2VuZXJhdGVWYWxpZEpTT046IFwiTHVvIGtlbHZvbGxpbmVuIEpTT05cIixcbiAgICBnZW5lcmF0ZVJlYWRhYmxlSlNPTjogXCJMdW8gbHVldHRhdmEgSlNPTlwiLFxuICAgIHRvb2xib3g6IFwiVHnDtmthbHVwYWtraVwiLFxuICAgIFwicHJvcGVydHktZ3JpZFwiOiBcIlByb3BlcnRpZXNcIixcbiAgICB0b29sYm94R2VuZXJhbENhdGVnb3J5OiBcIllsZWluZW5cIixcbiAgICBkZWxTZWxPYmplY3Q6IFwiUG9pc3RhIHZhbGl0dHUgb2JqZWt0aVwiLFxuICAgIGVkaXRTZWxPYmplY3Q6IFwiTXVva2thYSB2YWxpdHR1YSBvYmpla3RpYVwiLFxuICAgIGNvcnJlY3RKU09OOiBcIktvcmphYSBKU09OLlwiLFxuICAgIHN1cnZleVJlc3VsdHM6IFwiS3lzZWx5biB0dWxvczpcIixcbiAgICBzdXJ2ZXlSZXN1bHRzVGFibGU6IFwiVGF1bHVrb3NzYVwiLFxuICAgIHN1cnZleVJlc3VsdHNKc29uOiBcIkpTT046c3NhXCIsXG4gICAgcmVzdWx0c1RpdGxlOiBcIkt5c3lteWtzZW4gb3RzaWtrb1wiLFxuICAgIHJlc3VsdHNOYW1lOiBcIkt5c3lteWtzZW4gbmltaVwiLFxuICAgIHJlc3VsdHNWYWx1ZTogXCJWYXN0YXVrc2VuIGFydm9cIixcbiAgICByZXN1bHRzRGlzcGxheVZhbHVlOiBcIk7DpHl0w6QgYXJ2b1wiLFxuICAgIG1vZGlmaWVkOiBcIk11b2thdHR1XCIsXG4gICAgc2F2aW5nOiBcIlRhbGxlbnRhYVwiLFxuICAgIHNhdmVkOiBcIlRhbGxlbm5ldHR1XCIsXG4gICAgcHJvcGVydHlFZGl0b3JFcnJvcjogXCJWaXJoZTpcIixcbiAgICBzYXZlRXJyb3I6IFwiVmlyaGUhIEVkaXRvcmluIHNpc8OkbHTDtsOkIGVpIG9sZSB0YWxsZW5uZXR0dS5cIixcbiAgICB0cmFuc2xhdGlvbkFkZExhbmd1YWdlOiBcIlZhbGl0c2Uga8Okw6RubmV0dMOkdsOkIGtpZWxpXCIsXG4gICAgdHJhbnNsYXRpb25TaG93QWxsU3RyaW5nczogXCJOw6R5dMOkIGthaWtraSBtZXJra2lqb25vdFwiLFxuICAgIHRyYW5zbGF0aW9uU2hvd0FsbFBhZ2VzOiBcIk7DpHl0w6Qga2Fpa2tpIHNpdnV0XCIsXG4gICAgdHJhbnNsYXRpb25Ob1N0cmluZ3M6IFwiRWkgbWVya2tpam9ub2phIGvDpMOkbm5ldHTDpHbDpGtzaS4gVmFpaGRhIHN1b2RhdGluLlwiLFxuICAgIHRyYW5zbGF0aW9uRXhwb3J0VG9TQ1ZCdXR0b246IFwiVmllIChDU1YpXCIsXG4gICAgdHJhbnNsYXRpb25JbXBvcnRGcm9tU0NWQnV0dG9uOiBcIlR1byAoQ1NWKVwiLFxuICAgIHRyYW5zbGF0aW9uTWVyZ2VMb2NhbGVXaXRoRGVmYXVsdDogXCJZaGRpc3TDpCB7MH0gb2xldHVza2llbGVsbMOkXCIsXG4gICAgYm9sZDogXCJMaWhhdm9pdHVcIixcbiAgICBpdGFsaWM6IFwiS3Vyc2lpdmlcIixcbiAgICB1bmRlcmxpbmU6IFwiQWxsZXZpaXZhYVwiLFxuICAgIGZwQWRkUXVlc3Rpb246IFwiTGlzw6TDpCBreXN5bXlzLi4uXCIsXG4gICAgc2VsZWN0UGFnZTogXCJWYWxpdHNlIHNpdnUuLi5cIixcbiAgICBjaG9vc2VFbGVtZW50OiBcIlZhbGl0c2UgZWxlbWVudHRpLi4uXCIsXG4gICAgLy9jb21wbGV0ZWRIdG1sT25Db25kaXRpb25JdGVtVGV4dDogXCJOw6R5dMOkIGpvczpcIixcbiAgICBsZzoge1xuICAgICAgYWRkTmV3SXRlbTogXCJcIiwgLy9CeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyB0YWtlbiBmcm9tIHBlLmFkZE5ldyAnQWRkIE5ldycsIHlvdSBjYW4gc2V0IGl0IHRvICdBZGQgTmV3IFJ1bGUnIGZvciBleGFtcGxlLlxuICAgICAgLy9Mb2dpYyB0YWIgc3RyaW5nc1xuICAgICAgcGFnZV92aXNpYmlsaXR5TmFtZTogXCJTaXZ1biBuw6RreXZ5eXNcIixcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlOYW1lOiBcIlBhbmVsaW4gbsOka3l2eXlzXCIsXG4gICAgICBwYW5lbF9lbmFibGVOYW1lOiBcIlBhbmVlbGkga8OkeXTDtnNzw6QvRWkga8OkeXTDtnNzw6RcIixcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlOYW1lOiBcIkt5c3lteWtzZW4gbsOka3l2eXlzXCIsXG4gICAgICBxdWVzdGlvbl9lbmFibGVOYW1lOiBcIkt5c3lteXMga8OkeXTDtnNzw6QvRWkga8OkeXTDtnNzw6RcIixcbiAgICAgIHF1ZXN0aW9uX3JlcXVpcmVOYW1lOiBcIkt5c3lteXMgdmFsaW5uYWluZW4gdmFhZGl0YWFuXCIsXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlTmFtZTogXCJWYWxtaXMga3lzZWx5XCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlTmFtZTogXCJBc2V0YSBreXN5bXlrc2VuIGFydm9cIixcbiAgICAgIHRyaWdnZXJfY29weXZhbHVlTmFtZTogXCJLb3Bpb2kga3lzeW15a3NlbiBhcnZvXCIsXG4gICAgICB0cmlnZ2VyX3NraXBOYW1lOiBcIk9oaXRhIGt5c3lteXNcIixcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvbk5hbWU6IFwiU3Vvcml0YSBtdWthdXRldHR1IGxhdXNla2VcIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbk5hbWU6IFwiTXVrYXV0ZXR0dSBLaWl0b3MgLXNpdnV0ZWtzdGlcIixcblxuICAgICAgcGFnZV92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiVGVlIHNpdnVzdGEgbsOka3l2w6QsIGt1biBsb29naW5lbiBsYXVzZWtlIHBhbGF1dHRhYSBhcnZvbiB0b3NpLiBNdXV0ZW4gcGlkw6Qgc2UgbsOka3ltw6R0dMO2bcOkbsOkLlwiLFxuICAgICAgcGFuZWxfdmlzaWJpbGl0eURlc2NyaXB0aW9uOlxuICAgICAgICBcIlRlZSBwYW5lZWxpc3RhIG7DpGt5dsOkLCBrdW4gbG9vZ2luZW4gbGF1c2VrZSBwYWxhdXR0YWEgYXJ2b24gdG9zaS4gTXV1dGVuIHBpZMOkIHNlIG7DpGt5bcOkdHTDtm3DpG7DpC5cIixcbiAgICAgIHBhbmVsX2VuYWJsZURlc2NyaXB0aW9uOlxuICAgICAgICBcIk90YSBwYW5lZWxpIGphIGthaWtraSBzZW4gc2lzw6RsbMOkIG9sZXZhdCBlbGVtZW50aXQga8OkeXR0w7bDtm4sIGt1biBsb29naW5lbiBsYXVzZWtlIHBhbGF1dHRhYSBhcnZvbiB0b3NpLiBNdXV0ZW4gcGlkw6QgbmUgcG9pc3NhIGvDpHl0w7ZzdMOkLlwiLFxuICAgICAgcXVlc3Rpb25fdmlzaWJpbGl0eURlc2NyaXB0aW9uOlxuICAgICAgICBcIlRlZSBreXN5bXlrc2VzdMOkIG7DpGt5dsOkLCBrdW4gbG9vZ2luZW4gbGF1c2VrZSBwYWxhdXR0YWEgYXJ2b24gdG9zaS4gTXV1dGVuIHBpZMOkIHNlIG7DpGt5bcOkdHTDtm3DpG7DpC5cIixcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZURlc2NyaXB0aW9uOlxuICAgICAgICBcIk90YSBreXN5bXlzIGvDpHl0dMO2w7ZuLCBrdW4gbG9vZ2luZW4gbGF1c2VrZSBwYWxhdXR0YWEgYXJ2b24gdG9zaS4gTXV1c3NhIHRhcGF1a3Nlc3NhIHBpZMOkIHNlIHBvaXNzYSBrw6R5dMO2c3TDpC5cIixcbiAgICAgIHF1ZXN0aW9uX3JlcXVpcmVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJLeXN5bXlzIHR1bGVlIHBha29sbGlzZWtzaSwga3VuIGxvb2dpbmVuIGxhdXNla2UgcGFsYXV0dGFhIGFydm9uIHRvc2kuXCIsXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlRGVzY3JpcHRpb246XG4gICAgICAgIFwiS3VuIGxvb2dpbmVuIGxhdXNla2UgcGFsYXV0dGFhIGFydm9uIHRvc2ksIGt5c2VseSB2YWxtaXN0dXUgamEgbG9wcHVrw6R5dHTDpGrDpCBuw6RrZWUgS2lpdG9zIC1zaXZ1bi5cIixcbiAgICAgIHRyaWdnZXJfc2V0dmFsdWVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJLdW4gbG9vZ2lzZXNzYSBsYXVzZWtrZWVzc2Ega8OkeXRldHR5asOkIGt5c3lteXNhcnZvamEgbXV1dGV0YWFuIGphIGxvb2dpbmVuIGxhdXNla2UgcGFsYXV0dGFhIGFydm9uIHRvc2ksIGFydm8gYXNldGV0YWFuIHZhbGl0dWxsZSBreXN5bXlrc2VsbGUuXCIsXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIkt1biBsb29naXNlc3NhIGxhdXNla2tlZXNzYSBrw6R5dGV0dHlqw6Qga3lzeW15c2Fydm9qYSBtdXV0ZXRhYW4gamEgbG9vZ2luZW4gbGF1c2VrZSBwYWxhdXR0YWEgYXJ2b24gdG9zaSwgeWhkZW4gdmFsaXR1biBreXN5bXlrc2VuIGFydm8ga29waW9pZGFhbiB0b2lzZWVuIHZhbGl0dHV1biBreXN5bXlrc2Vlbi5cIixcbiAgICAgIHRyaWdnZXJfc2tpcERlc2NyaXB0aW9uOlxuICAgICAgICBcIkt1biBsb29naW5lbiBsYXVzZWtlIHBhbGF1dHRhYSBhcnZvbiB0b3NpLCBreXNlbHkgc2lpcnR5eSB2YWxpdHR1dW4ga3lzeW15a3NlZW4gLyBrb2hkaXN0YSB2YWxpdHR1IGt5c3lteXMuXCIsXG4gICAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25EZXNjcmlwdGlvbjpcbiAgICAgICAgXCJXaGVuIHRoZSBsb2dpYyBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgY3VzdG9tIGV4cHJlc3Npb24gaXMgcGVyZm9ybWVkLiBZb3UgbWF5IG9wdGlvbmFsbHkgc2V0IHRoaXMgZXhwcmVzc2lvbiByZXN1bHQgaW50byB0aGUgc2VsZWN0ZWQgcXVlc3Rpb25cIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbkRlc2NyaXB0aW9uOlxuICAgICAgICBcIklmIHRoZSBsb2dpYyBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgJ1RoYW5rIHlvdSBwYWdlJyBpcyBjaGFuZ2VkIHRvIHRoZSBnaXZlbiBvbmUuXCIsXG5cbiAgICAgIGl0ZW1FeHByZXNzaW9uVGV4dDogXCJLdW4gbGF1c2VrZTogJ3swfScgcGFsYXV0dGFhIGFydm9uIHRvc2k6XCIsIC8vezB9IC0gdGhlIGV4cHJlc3Npb25cbiAgICAgIHBhZ2VfdmlzaWJpbGl0eVRleHQ6IFwiVGVlIHNpdnUgezB9IG7DpGt5dsOka3NpXCIsIC8vezB9IHBhZ2UgbmFtZVxuICAgICAgcGFuZWxfdmlzaWJpbGl0eVRleHQ6IFwiVGVlIHBhbmVlbGlzdGEgezB9IG7DpGt5dsOkXCIsIC8vezB9IHBhbmVsIG5hbWVcbiAgICAgIHBhbmVsX2VuYWJsZVRleHQ6IFwiT3RhIHBhbmVlbGkgezB9IGvDpHl0dMO2w7ZuXCIsIC8vezB9IHBhbmVsIG5hbWVcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlUZXh0OiBcIlRlZSBreXN5bXlzIHswfSBuw6RreXbDpGtzaVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICBxdWVzdGlvbl9lbmFibGVUZXh0OiBcIk90YSBreXN5bXlzIHswfSBrw6R5dHTDtsO2blwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlVGV4dDogXCJUZWUga3lzeW15a3Nlc3TDpCB7MH0gcGFrb2xsaW5lblwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlVGV4dDogXCJLeXNlbHlzdMOkIHR1bGVlIHTDpHl0ZXR0eVwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZVRleHQ6IFwiTGFpdGEgYXJ2byB7MX0ga3lzeW15a3NlZW4gezB9XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWUsIHsxfSBzZXRWYWx1ZVxuICAgICAgdHJpZ2dlcl9jb3B5dmFsdWVUZXh0OiBcIktvcGlvaSBreXN5bXlrc2VlbjogezB9IGFydm8ga3lzeW15a3Nlc3TDpCB7MX1cIiwgLy97MH0gYW5kIHsxfSBxdWVzdGlvbiBuYW1lc1xuICAgICAgdHJpZ2dlcl9za2lwVGV4dDogXCJTaWlycnkga3lzZWx5biBreXN5bXlrc2VlbiB7MH1cIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDE6IFwiU3Vvcml0YSBsYXVzZWtlOiAnezB9J1wiLCAvL3swfSB0aGUgZXhwcmVzc2lvblxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDI6IFwiIGphIGFzZXRhIHNlbiB0dWxvcyBreXN5bXlrc2VlbjogezB9XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWVcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvblRleHQ6IFwiTsOkeXTDpCBtdWthdXRldHR1IHRla3N0aSBLaWl0b3MgLXNpdnVsbGUuXCIsXG5cbiAgICAgIGNvbmRpdGlvbnM6IFwiRWhkb3RcIixcbiAgICAgIGFjdGlvbnM6IFwiVG9pbWlubm90XCIsXG4gICAgICBleHByZXNzaW9uRWRpdG9yVGl0bGU6IFwiTcOkw6RyaXTDpCBvbG9zdWh0ZWV0XCIsXG4gICAgICBhY3Rpb25zRWRpdG9yVGl0bGU6IFwiTcOkw6RyaXTDpCB0b2ltaW5ub3RcIixcblxuICAgICAgZGVsZXRlQWN0aW9uOiBcIlBvaXN0YSB0b2ltaW50b1wiLFxuICAgICAgYWRkTmV3QWN0aW9uOiBcIkxpc8Okw6QgdXVzaSB0b2ltaW50b1wiLFxuICAgICAgc2VsZWN0ZWRBY3Rpb25DYXB0aW9uOiBcIlZhbGl0c2UgbGlzw6R0dMOkdsOkIHRvaW1pbnRvIC4uLlwiLFxuXG4gICAgICBleHByZXNzaW9uSW52YWxpZDogXCJMb29naW5lbiBsYXVzZWtlIG9uIHR5aGrDpCB0YWkgdmlyaGVlbGxpbmVuLiBLb3JqYWEgc2UuXCIsXG4gICAgICBub0FjdGlvbkVycm9yOiBcIkxpc8Okw6QgYWluYWtpbiB5a3NpIHRvaW1pbnRvLlwiLFxuICAgICAgYWN0aW9uSW52YWxpZDogXCJLb3JqYWEgb25nZWxtYXQgdG9pbWlubm9pc3NhLlwiLFxuICAgICAgZXhwcmVzc2lvblNldHVwOiBcIlwiLFxuICAgICAgYWN0aW9uc1NldHVwOiBcIlwiLFxuICAgIH0sXG4gIH0sXG4gIC8vUHJvcGVydHkgbmFtZXMgaW4gdGFibGUgaGVhZGVyc1xuICAvLyBwZWw6IHtcbiAgLy8gICBpc1JlcXVpcmVkOiBcIlZhYWRpdHR1P1wiXG4gIC8vIH0sXG4gIC8vUHJvcGVydHkgRWRpdG9yc1xuICBwZToge1xuICAgIGFwcGx5OiBcIkvDpHl0w6RcIixcbiAgICBvazogXCJPS1wiLFxuICAgIHNhdmU6IFwiVGFsbGVubmFcIixcbiAgICBzYXZlVG9vbHRpcDogXCJUYWxsZW5uYVwiLFxuICAgIGNhbmNlbDogXCJQZXJ1dXRhXCIsXG4gICAgcmVzZXQ6IFwiTm9sbGFhXCIsXG4gICAgcmVmcmVzaDogXCJQw6Rpdml0w6RcIixcbiAgICAvLyBjbG9zZTogXCJTdWxqZVwiLFxuICAgIGRlbGV0ZTogXCJQb2lzdGFcIixcbiAgICBhZGQ6IFwiTGlzw6TDpFwiLFxuICAgIGFkZE5ldzogXCJMaXPDpMOkIHV1c2lcIixcbiAgICBhZGRJdGVtOiBcIktsaWtrYWEgbGlzw6R0w6Rrc2VzaSB1dXNpIGtvaGRlLi4uXCIsXG4gICAgYWRkT3RoZXI6IFwiTXV1XCIsXG4gICAgYWRkU2VsZWN0QWxsOiBcIlZhbGl0c2Uga2Fpa2tpXCIsXG4gICAgYWRkTm9uZTogXCJFaSBtaXTDpMOkblwiLFxuICAgIHJlbW92ZUFsbDogXCJQb2lzdGEga2Fpa2tpXCIsXG4gICAgZWRpdDogXCJNdW9ra2FhXCIsXG4gICAgYmFjazogXCJQYWxhYSB0YWxsZW50YW1hdHRhXCIsXG4gICAgYmFja1Rvb2x0aXA6IFwiUGFsYWEgdGFsbGVudGFtYXR0YVwiLFxuICAgIHNhdmVBbmRCYWNrOiBcIlRhbGxlbm5hIGphIHBhbGFhXCIsXG4gICAgc2F2ZUFuZEJhY2tUb29sdGlwOiBcIlRhbGxlbm5hIGphIHBhbGFhXCIsXG4gICAgLy8gaXRlbVZhbHVlRWRpdDogXCJOw6RreXbDpCBqb3NcIixcbiAgICBlZGl0Q2hvaWNlczogXCJNdW9ra2FhIHZhbGludG9qYVwiLFxuICAgIHNob3dDaG9pY2VzOiBcIk7DpHl0w6QgdmFsaW5uYXRcIixcbiAgICBtb3ZlOiBcIlNpaXJyw6RcIixcbiAgICBlbXB0eTogXCI8dHloasOkPlwiLFxuICAgIC8vIG5vdEVtcHR5OiBcIjxNdW9ra2FhIGFydm9hPlwiLFxuICAgIGZhc3RFbnRyeTogXCJOb3BlYSBww6TDpHN5XCIsXG4gICAgZm9ybUVudHJ5OiBcIkxvbWFra2VlbiBww6TDpHN5XCIsXG4gICAgdGVzdFNlcnZpY2U6IFwiVGVzdGFhIHBhbHZlbHVcIixcbiAgICBpdGVtU2VsZWN0b3JFbXB0eTogXCJWYWxpdHNlIGVsZW1lbnR0aVwiLFxuICAgIGNvbmRpdGlvbkFjdGlvbkVtcHR5OiBcIlZhbGl0c2UgdG9pbWludG9cIixcbiAgICBjb25kaXRpb25TZWxlY3RRdWVzdGlvbjogXCJWYWxpdHNlIGt5c3lteXMuLi5cIixcbiAgICBjb25kaXRpb25TZWxlY3RQYWdlOiBcIlZhbGl0c2Ugc2l2dS4uLlwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFBhbmVsOiBcIlZhbGl0c2UgcGFuZWVsaS4uLlwiLFxuICAgIGNvbmRpdGlvblZhbHVlUXVlc3Rpb25UaXRsZTogXCJTecO2dMOkIC8gdmFsaXRzZSBhcnZvXCIsXG4gICAgY29uZGl0aW9uSGVscDogXCJBbm5hIGxvb2dpbmVuIGxhdXNla2UuIFNlbiBwaXTDpGlzaSBwYWxhdXR0YWEgYXJ2byB0b3NpIHBpdMOkw6Rrc2VlbiBreXN5bXlzIC8gc2l2dSBuw6RreXZpc3PDpC4gRXNpbWVya2lrc2k6IHtxdWVzdGlvbjF9ID0gJ3ZhbHVlMScgb3IgKHtxdWVzdGlvbjJ9ICoge3F1ZXN0aW9uNH0gID4gMjAgYW5kIHtxdWVzdGlvbjN9IDwgNSlcIixcbiAgICBleHByZXNzaW9uSGVscDogXCJWb2l0IGvDpHl0dMOkw6QgYWFsdG8g4oCL4oCLc3Vsa2VpdGEgcMOkw6RzdMOka3Nlc2kga3lzeW15c2Fydm9paGluOiB7cXVlc3Rpb24xfSArIHtxdWVzdGlvbjJ9LCAoe3ByaWNlfSp7cXVhbnRpdHl9KSAqICgxMDAgLSB7ZGlzY291bnR9KS4gVm9pdCBrw6R5dHTDpMOkIGZ1bmt0aW9pdGE6IGlpZigpLCB0b2RheSgpLCBhZ2UoKSwgbWluKCksIG1heCgpLCBjb3VudCgpLCBhdmcoKSBqYSBtdWl0YS5cIixcbiAgICBhY2VFZGl0b3JIZWxwOiBcIlBhaW5hIGN0cmwgKyB2w6RsaWx5w7ZudGkgc2FhZGFrc2VzaSBsYXVzZWtrZWVuIHTDpHlkZW5ueXN2aWhqZVwiLFxuICAgIGFjZUVkaXRvclJvd1RpdGxlOiBcIk55a3lpbmVuIHJpdmlcIixcbiAgICBhY2VFZGl0b3JQYW5lbFRpdGxlOiBcIk55a3lpbmVuIHBhbmVlbGlcIixcbiAgICBzaG93TW9yZTogXCJLYXRzbyBsaXPDpHRpZXRvamEgZG9rdW1lbnRhYXRpb3N0YVwiLFxuICAgIC8vIGNvbmRpdGlvblNob3dNb3JlVXJsOlxuICAgIC8vICAgXCJodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeVBhcmFtZXRlcj9pZD1RdWVzdGlvbiZwYXJhbWV0ZXI9dmlzaWJsZUlmXCIsXG4gICAgYXNzaXN0YW50VGl0bGU6IFwiU2FhdGF2aWxsYSBvbGV2YXQga3lzeW15a3NldDpcIixcbiAgICBjZWxsc0VtcHR5Um93c0NvbHVtbnM6IFwiU2FyYWtrZWl0YSB0YWkgcml2ZWrDpCBvbiBvbHRhdmEgdsOkaGludMOkw6RuIHlrc2lcIixcblxuICAgIHByb3BlcnR5SXNFbXB0eTogXCJBbm5hIGFydm9cIixcbiAgICBwcm9wZXJ0eUlzTm9VbmlxdWU6IFwiQW5uYSB5a3NpbMO2bGxpbmVuIGFydm9cIixcbiAgICBwcm9wZXJ0eU5hbWVJc05vdFVuaXF1ZTogXCJBbm5hIHlrc2lsw7ZsbGluZW4gbmltaVwiLFxuICAgIGxpc3RJc0VtcHR5OiBcIkxpc8Okw6QgdXVzaSBrb2hkZVwiLFxuICAgIGV4cHJlc3Npb25Jc0VtcHR5OiBcIkxhdXNla2Ugb24gdHloasOkXCIsXG4gICAgdmFsdWU6IFwiQXJ2b1wiLFxuICAgIHRleHQ6IFwiVGVrc3RpXCIsXG4gICAgcm93aWQ6IFwiUml2aSBJRFwiLFxuICAgIGltYWdlTGluazogXCJLdXZhbGlua2tpXCIsXG4gICAgY29sdW1uRWRpdDogXCJNdW9ra2FhIHNhcmFrZXR0YTogezB9XCIsXG4gICAgaXRlbUVkaXQ6IFwiTXVva2thYSBrb2hkZXR0YTogezB9XCIsXG5cbiAgICB1cmw6IFwiVVJMXCIsXG4gICAgcGF0aDogXCJQb2xrdVwiLFxuICAgIHZhbHVlTmFtZTogXCJBcnZvbiBuaW1pXCIsXG4gICAgdGl0bGVOYW1lOiBcIk90c2lrb24gbmltaVwiLFxuICAgIHRpdGxlUGxhY2Vob2xkZXI6IFwiU3nDtnTDpCBvdHNpa2tvIHTDpGjDpG5cIixcbiAgICBzdXJ2ZXlUaXRsZVBsYWNlaG9sZGVyOiBcIlN5w7Z0w6Qga3lzZWx5biBvdHNpa2tvIHTDpGjDpG5cIixcbiAgICBwYWdlVGl0bGVQbGFjZWhvbGRlcjogXCJTecO2dMOkIHNpdnVuIG90c2lra28gdMOkaMOkblwiLFxuICAgIGRlc2NyaXB0aW9uUGxhY2Vob2xkZXI6IFwiTGlzw6TDpCBrdXZhdXNcIixcbiAgICBzdXJ2ZXlEZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcIkxpc8Okw6Qga3lzZWx5biBrdXZhdXNcIixcbiAgICBwYWdlRGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCJMaXPDpMOkIHNpdnVuIGt1dmF1c1wiLFxuXG4gICAgaGFzT3RoZXI6IFwiT24gbXV1XCIsXG4gICAgb3RoZXJUZXh0OiBcIk11dSB0ZWtzdGlcIixcbiAgICBoYXNOb25lOiBcIkVpIG1pdMOkw6RuXCIsXG4gICAgbm9uZVRleHQ6IFwiRWkgbWl0w6TDpG4gdGVrc3Rpw6RcIixcbiAgICBoYXNTZWxlY3RBbGw6IFwiT24gdmFsaW5udXQga2Fpa2tpXCIsXG4gICAgc2VsZWN0QWxsVGV4dDogXCJWYWxpdHNlIGthaWtraSB0ZWtzdGl0XCIsXG4gICAgY2hvaWNlc01pbjogXCJBdXRvbWFhdHRpc2VzdGkgbHVvdHVqZW4gdmFsaW50b2plbiB2w6RoaW1tw6Rpc2Fydm9cIixcbiAgICBjaG9pY2VzTWF4OiBcIkF1dG9tYWF0dGlzZXN0aSBsdW90dWplbiB2YWxpbnRvamVuIGVuaW1tw6Rpc2Fydm9cIixcbiAgICBjaG9pY2VzU3RlcDogXCJBdXRvbWFhdHRpc2VzdGkgbHVvdHVqZW4gdmFsaW50b2plbiBlcm9cIixcbiAgICBuYW1lOiBcIk5pbWlcIixcbiAgICB0aXRsZTogXCJPdHNpa2tvXCIsXG4gICAgY2VsbFR5cGU6IFwiU29sdXR5eXBwaVwiLFxuICAgIGNvbENvdW50OiBcIlNhcmFrZW3DpMOkcsOkXCIsXG4gICAgY2hvaWNlc09yZGVyOiBcIlZhbGl0c2UgdmFsaW50b2plbiBqw6RyamVzdHlzXCIsXG4gICAgdmlzaWJsZTogXCJPbiBuw6RreXbDpD9cIixcbiAgICBpc1JlcXVpcmVkOiBcIk9uIHZhYWRpdHR1P1wiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwiVmFhZGkgdmFzdGF1cyBrYWlraWxsZSByaXZlaWxsZVwiLFxuICAgIHJlcXVpcmVkRXJyb3JUZXh0OiBcIlZhYWRpdHR1IHZpcmhldGVrc3RpXCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCJPbmtvIGFsb2l0dXMgdXVkZWxsYSByaXZpbGzDpD9cIixcbiAgICByb3dzOiBcIlJpdml0XCIsXG4gICAgY29sczogXCJTYXJha2VldFwiLFxuICAgIHBsYWNlSG9sZGVyOiBcIlN5w7Z0w6QgcGFpa2thbWVya2ludMOkXCIsXG4gICAgc2hvd1ByZXZpZXc6IFwiTsOkeXTDpCBlc2lrYXRzZWx1XCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIlRhbGxlbm5hIHRpZWRvc3Rvc2lzw6RsdMO2IEpTT04tdHVsb2tzZWVuIHRla3N0aW7DpFwiLFxuICAgIG1heFNpemU6IFwiVGllZG9zdG9uIGVuaW1tw6Rpc2tva28gdGF2dWluYVwiLFxuICAgIGltYWdlSGVpZ2h0OiBcIkt1dmFuIGtvcmtldXNcIixcbiAgICBpbWFnZVdpZHRoOiBcIkt1dmFuIGxldmV5c1wiLFxuICAgIHJvd0NvdW50OiBcIlJpdmllbiBtw6TDpHLDpFwiLFxuICAgIGNvbHVtbkxheW91dDogXCJTYXJha2tlaWRlbiBhc2V0dGVsdVwiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcIkxpc8Okw6Qgcml2aXBhaW5pa2tlZW4gc2lqYWludGlcIixcbiAgICBhZGRSb3dUZXh0OiBcIkxpc8Okw6Qgcml2aXBhaW5pa2tlZW4gdGVrc3RpXCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCJQb2lzdGEgcml2aXBhaW5pa2tlZW4gdGVrc3RpXCIsXG4gICAgcmF0ZU1pbjogXCJWw6RoaW1tw6Rpc23DpMOkcsOkXCIsXG4gICAgcmF0ZU1heDogXCJFbmltbcOkaXNtw6TDpHLDpFwiLFxuICAgIHJhdGVTdGVwOiBcIkFydm9zdGVsZSBhc2tlbFwiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCJWw6RoaW1tw6Rpc23DpMOkcsOkbiBrdXZhdXNcIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwiRW5pbW3DpGlzbcOkw6Ryw6RuIGt1dmF1c1wiLFxuICAgIGlucHV0VHlwZTogXCJTecO2dMOkIHR5eXBwaVwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIlZhaWh0b2VoZG90IGt1dmF0ZWtzdGlcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiT2xldHVzYXJ2b1wiLFxuICAgIGNlbGxzRGVmYXVsdFJvdzogXCJPbGV0dXNzb2x1dGVrc3RpdFwiLFxuXG4gICAgc3VydmV5RWRpdG9yVGl0bGU6IFwiTXVva2thYSBreXNlbHluIGFzZXR1a3NpYVwiLFxuICAgIHFFZGl0b3JUaXRsZTogXCJNdW9ra2FhOiB7MH1cIixcblxuICAgIG1heExlbmd0aDogXCJFbmltbcOkaXNwaXR1dXNcIixcblxuICAgIGJ1aWxkRXhwcmVzc2lvbjogXCJMdW9cIixcbiAgICBlZGl0RXhwcmVzc2lvbjogXCJNdW9ra2FhXCIsXG4gICAgYW5kOiBcIkphXCIsXG4gICAgb3I6IFwiVGFpXCIsXG4gICAgcmVtb3ZlOiBcIlBvaXN0YVwiLFxuICAgIGFkZENvbmRpdGlvbjogXCJMaXPDpMOkIGVodG9cIixcblxuICAgIC8vc3VydmV5XG4gICAgc2hvd1RpdGxlOiBcIk7DpHl0w6QvcGlpbG90YSBvdHNpa2tvXCIsXG4gICAgZXhwYW5kQ29sbGFwc2VUaXRsZTogXCJMYWFqZW5uYSAvIHRpaXZpc3TDpCBvdHNpa2tvYVwiLFxuICAgIGxvY2FsZTogXCJPbGV0dXMga2llbGlcIixcbiAgICBzaW11bGF0b3I6IFwiVmFsaXRzZSBsYWl0ZVwiLFxuICAgIGxhbmRzY2FwZU9yaWVudGF0aW9uOiBcIlZhYWthc3V1bnRhXCIsXG4gICAgbW9kZTogXCJUaWxhICh2YWluIG11b2trYXVzIC8gdmFpbiBsdWt1KVwiLFxuICAgIGNsZWFySW52aXNpYmxlVmFsdWVzOiBcIlR5aGplbm7DpCBuw6RreW3DpHR0w7Ztw6R0IGFydm90XCIsXG4gICAgY29va2llTmFtZTogXCJFdsOkc3RlZW4gbmltaSAocG9pc3RhYWtzZXNpIGt5c2VseSBrw6R5dMO2c3TDpCBzdW9yaXRhIGt5c2VseSBrYWtzaSBrZXJ0YWEgcGFpa2FsbGlzZXN0aSlcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCJMw6RoZXTDpCBreXNlbHluIHR1bG9rc2V0IHNldXJhYXZhbGxhIHNpdnVsbGFcIixcbiAgICBzdG9yZU90aGVyc0FzQ29tbWVudDogXCJUYWxsZW5uYSAnbXV1dCcgYXJ2byBlcmlsbGlzZWVuIGtlbnR0w6TDpG5cIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJOw6R5dMOkIHNpdnVuIG90c2lrb3RcIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwiTsOkeXTDpCBzaXZ1bnVtZXJvdFwiLFxuICAgIHBhZ2VQcmV2VGV4dDogXCJFZGVsbGluZW4gc2l2dSAtcGFpbmlra2VlbiB0ZWtzdGlcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiU2V1cmFhdmEgc2l2dSAtcGFpbmlra2VlbiB0ZWtzdGlcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiVmFsbWlzIC1wYWluaWtrZWVuIHRla3N0aVwiLFxuICAgIHByZXZpZXdUZXh0OiBcIkVzaWthdHNlbGUgLXBhaW5pa2tlZW4gdGVrc3RpXCIsXG4gICAgZWRpdFRleHQ6IFwiTXVva2thYSAtcGFpbmlra2VlbiB0ZWtzdGlcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwiQWxvaXRhIC1wYWluaWtrZWVuIHRla3N0aVwiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczogXCJOw6R5dMOkIG5hdmlnb2ludGlwYWluaWtrZWV0IChvbGV0dXNuYXZpZ29pbnRpKVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcIk7DpHl0w6QgZWRlbGxpbmVuIC1wYWluaWtlIChrw6R5dHTDpGrDpCB2b2kgcGFsYXRhIGVkZWxsaXNlbGxlIHNpdnVsbGUpXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcIkt5c2VseW4gZW5zaW1tw6RpbmVuIHNpdnUgb24gYWxvaXR1c3NpdnUuXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwiTsOkeXTDpCB2YWxtaXMgc2l2dSBsb3B1c3NhIChjb21wbGV0ZUh0bWwpXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzpcbiAgICAgIFwiS3VuIHZhc3RhYXQga2Fpa2tpaW4ga3lzeW15a3NpaW4sIHNpaXJyeSBzZXVyYWF2YWxsZSBzaXZ1bGxlIGF1dG9tYWF0dGlzZXN0aVwiLFxuICAgIHNob3dQcm9ncmVzc0JhcjogXCJOw6R5dMOkIGVkaXN0eW1pc3BhbGtraVwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJLeXN5bXlrc2VuIG90c2lrb24gc2lqYWludGlcIixcbiAgICByZXF1aXJlZFRleHQ6IFwiS3lzeW15cyB2YWFkaXR0dSBzeW1ib2xpICh0KVwiLFxuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogXCJLeXN5bXlrc2VuIGFsb2l0dXMgaW5kZWtzaSAoMSwgMiBvciAnQScsICdhJylcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIk7DpHl0w6Qga3lzeW15c251bWVyb3RcIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6XG4gICAgICBcIkt5c3lteWtzZW4gb3RzaWtrb21hbGxpLCBvbGV0dXNhcnZvOiAne25vfS4ge3JlcXVpcmV9IHt0aXRsZX0nXCIsXG4gICAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBcIkt5c3lteWtzZW4gdmlyaGVlbiBzaWphaW50aVwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzogXCJGb2t1c29pIGVuc2ltbcOkaXNlZW4ga3lzeW15a3NlZW4gc2l2dW4gdmFpaHR1ZXNzYVwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcIkVsZW1lbnR0aWVuIGrDpHJqZXN0eXMgc2l2dWxsYVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJFbmltbcOkaXNhaWthIHNhYWRhIGt5c2VseSB0w6R5dGV0dHnDpFwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiRW5pbW3DpGlzYWlrYSBreXNlbHluIHNpdnVuIHTDpHl0dMOkbWlzZWVuXCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwiTsOkeXTDpCBhamFzdHVzIC1wYW5lZWxpXCIsXG4gICAgc2hvd1RpbWVyUGFuZWxNb2RlOiBcIk7DpHl0w6QgYWphc3R1cyAtcGFuZWVsaW4gdGlsYVwiLFxuICAgIHJlbmRlck1vZGU6IFwiUmVuZGVyw7Zpbm5pbiB0aWxhXCIsXG4gICAgYWxsb3dBZGRQYW5lbDogXCJTYWxsaSBwYW5lZWxpbiBsaXPDpMOkbWluZW5cIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIlNhbGxpIHBhbmVlbGluIHBvaXN0YW1pbmVuXCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcIlBhbmVlbGluIHRla3N0aW4gbGlzw6TDpG1pbmVuXCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcIlBhbmVlbGluIHRla3N0aW4gcG9pc3RhbWluZW5cIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwiTsOkeXTDpCBrYWlra2kgZWxlbWVudGl0IHloZGVsbMOkIHNpdnVsbGFcIixcbiAgICBodG1sOiBcIkh0bWxcIixcbiAgICBleHByZXNzaW9uOiBcIkxhdXNla2VcIixcblxuICAgIG1pblZhbHVlOiBcIlbDpGhpbW3DpGlzYXJ2b1wiLFxuICAgIG1heFZhbHVlOiBcIlN1dXJpbiBhcnZvXCIsXG4gICAgbWluTGVuZ3RoOiBcIlbDpGhpbW3DpGlzcGl0dXVzXCIsXG4gICAgYWxsb3dEaWdpdHM6IFwiU2FsbGkgbnVtZXJvdFwiLFxuICAgIG1pbkNvdW50OiBcIlbDpGhpbW3DpGlzbcOkw6Ryw6RcIixcbiAgICBtYXhDb3VudDogXCJFbmltbcOkaXNtw6TDpHLDpFwiLFxuICAgIHJlZ2V4OiBcIlJlZ3VsYXIgZXhwcmVzc2lvblwiLFxuXG4gICAgLy8gdG90YWxUZXh0OiBcIktva28gdGVrc3RpXCIsXG4gICAgLy8gdG90YWxUeXBlOiBcIktva28gdHl5cHBpXCIsXG4gICAgLy8gdG90YWxFeHByZXNzaW9uOiBcIktva29uYWlzbGF1c2VrZVwiLFxuICAgIC8vIHRvdGFsRGlzcGxheVN0eWxlOiBcIktva29uYWlzbsOkeXR0w7Z0eXlsaVwiLFxuICAgIC8vIHRvdGFsQ3VycmVuY3k6IFwiVmFsdXV0dGEgeWh0ZWVuc8OkXCIsXG4gICAgLy8gdG90YWxGb3JtYXQ6IFwiS29rb25haXNtdW90b1wiLFxuXG4gICAgLy8gSGVhZGVyICBhZG9ybmVyXG4gICAgbG9nb1Bvc2l0aW9uOiBcIkxvZ28gc2lqYWludGlcIixcbiAgICBhZGRMb2dvOiBcIkxpc8Okw6QgbG9nby4uLlwiLFxuICAgIGNoYW5nZUxvZ286IFwiTXV1dGEgbG9nby4uLlwiLFxuICAgIGxvZ29Qb3NpdGlvbnM6IHtcbiAgICAgIG5vbmU6IFwiUG9pc3RhIGxvZ29cIixcbiAgICAgIGxlZnQ6IFwiVmFzZW5cIixcbiAgICAgIHJpZ2h0OiBcIk9pa2VhXCIsXG4gICAgICB0b3A6IFwiUMOkw6RsbMOkXCIsXG4gICAgICBib3R0b206IFwiQWxsYVwiLFxuICAgIH0sXG5cbiAgICB0YWJzOiB7XG4gICAgICBnZW5lcmFsOiBcIllsZWluZW5cIixcbiAgICAgIGZpbGVPcHRpb25zOiBcIlZhaWh0b2VoZG90XCIsXG4gICAgICBodG1sOiBcIkh0bWwgRWRpdG9yaVwiLFxuICAgICAgY29sdW1uczogXCJTYXJha2tlZXRcIixcbiAgICAgIHJvd3M6IFwiUml2aXRcIixcbiAgICAgIGNob2ljZXM6IFwiVmFsaW5uYXRcIixcbiAgICAgIGl0ZW1zOiBcIktvaHRlZXRcIixcbiAgICAgIHZpc2libGVJZjogXCJOw6RreXbDpCBqb3NcIixcbiAgICAgIGVuYWJsZUlmOiBcIkvDpHl0w7Zzc8OkIGpvc1wiLFxuICAgICAgcmVxdWlyZWRJZjogXCJWYWFkaXR0dSBqb3NcIixcbiAgICAgIHJhdGVWYWx1ZXM6IFwiSsOkcmplc3TDpCBhcnZvdFwiLFxuICAgICAgY2hvaWNlc0J5VXJsOiBcIlZhbGludG9qYSB2ZXJrb3N0YVwiLFxuICAgICAgbWF0cml4Q2hvaWNlczogXCJPbGV0dXMgdmFsaW5uYXRcIixcbiAgICAgIG11bHRpcGxlVGV4dEl0ZW1zOiBcIlRla3N0aW5zecO2dMO2dFwiLFxuICAgICAgbnVtYmVyaW5nOiBcIk51bWVyb2ludGlcIixcbiAgICAgIHZhbGlkYXRvcnM6IFwiVmFsaWRhdHRvcml0XCIsXG4gICAgICBuYXZpZ2F0aW9uOiBcIk5hdmlnb2ludGlcIixcbiAgICAgIHF1ZXN0aW9uOiBcIkt5c3lteXNcIixcbiAgICAgIHBhZ2VzOiBcIlNpdnV0XCIsXG4gICAgICBjb21wbGV0ZWRIdG1sOiBcIlZhbG1pcyBIdG1sXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb246IFwiVmFsbWlzIEh0bWwgZWhkb2xsYVwiLFxuICAgICAgbG9hZGluZ0h0bWw6IFwiTGF0YWEgSHRtbFwiLFxuICAgICAgdGltZXI6IFwiQWphc3RpbiAvIHRpZXRvdmlzYVwiLFxuICAgICAgY2FsY3VsYXRlZFZhbHVlczogXCJMYXNrZXR1dCBhcnZvdFwiLFxuICAgICAgdHJpZ2dlcnM6IFwiVHJpZ2dlcml0XCIsXG4gICAgICB0ZW1wbGF0ZVRpdGxlOiBcIk1hbGxpbiBvdHNpa2tvXCIsXG4gICAgICB0b3RhbHM6IFwiWWh0ZWVuc8OkXCIsXG4gICAgICBsb2dpYzogXCJMb2dpaWtrYVwiLFxuICAgICAgbGF5b3V0OiBcIkxheW91dFwiLFxuICAgICAgZGF0YTogXCJEYXRhXCIsXG4gICAgICB2YWxpZGF0aW9uOiBcIlZhbGlkb2ludGlcIixcbiAgICAgIGNlbGxzOiBcIlNvbHV0XCIsXG4gICAgICBzaG93T25Db21wbGV0ZWQ6IFwiTsOkeXTDpCBrdW4gdmFsbWlzXCIsXG4gICAgICBsb2dvOiBcIkxvZ28ga3lzZWx5biBvdHNpa29zc2FcIixcbiAgICAgIHNsaWRlcjogXCJMaXVrdXPDpMOkZGluXCIsXG4gICAgICBvdGhlcnM6IFwiTXV1dFwiLFxuICAgIH0sXG4gICAgZWRpdFByb3BlcnR5OiBcIk11b2trYWEgb21pbmFpc3V1dHRhJ3swfSdcIixcbiAgICBpdGVtczogXCJbIEtvaHRlZXQ6IHswfSBdXCIsXG5cbiAgICBlbnRlck5ld1ZhbHVlOiBcIkFubmEgYXJ2by5cIixcbiAgICBub3F1ZXN0aW9uczogXCJLeXNlbHlzc8OkIGVpIG9sZSB5aHTDpMOkbiBreXN5bXlzdMOkLlwiLFxuICAgIGNyZWF0ZXRyaWdnZXI6IFwiTHVvIHRyaWdnZXJpXCIsXG4gICAgdGl0bGVLZXlib2FyZEFkb3JuZXJUaXA6IFwiUGFpbmEgRW50ZXIgLXBhaW5pa2V0dGEgbXVva2F0YWtzZXNpXCIsXG4gICAga2V5Ym9hcmRBZG9ybmVyVGlwOiBcIlZvaXQgbXVva2F0YSBrb2hkZXR0YSBwYWluYW1hbGxhIEVudGVyIC1wYWluaWtldHRhLCBwb2lzdGFhIGtvaHRlZW4gcGFpbmFtYWxsYSBwb2lzdG9wYWluaWtldHRhLCBzaWlydMOkw6Qga29oZGV0dGEgcGFpbmFtYWxsYSBBbHQgcGx1cyBudW9saSB5bMO2cyB0YWkgbnVvbGkgYWxhc1wiLFxuICAgIGtleWJvYXJkTW92ZUl0ZW1zVGlwOiBcIlBhaW5hIEFsdCBwbHVzIG51b2xpIHlsw7ZzIHRhaSBudW9saSBhbGFzIHNpaXJ0w6TDpGtzZXNpIGtvaGRldHRhXCIsXG4gICAgdHJpZ2dlck9uOiBcIlDDpMOkbGzDpCBcIixcbiAgICB0cmlnZ2VyTWFrZVBhZ2VzVmlzaWJsZTogXCJUZWUgc2l2dWlzdGEgbsOka3l2acOkOlwiLFxuICAgIHRyaWdnZXJNYWtlUXVlc3Rpb25zVmlzaWJsZTogXCJUZWUgZWxlbWVudGl0IG7DpGt5dmlrc2k6XCIsXG4gICAgdHJpZ2dlckNvbXBsZXRlVGV4dDogXCJWYWxtaXN0YSBreXNlbHksIGpvcyBzZSBvbiBvbm5pc3R1bnV0LlwiLFxuICAgIHRyaWdnZXJOb3RTZXQ6IFwiVHJpZ2dlcmnDpCBlaSBvbGUgYXNldGV0dHVcIixcbiAgICB0cmlnZ2VyUnVuSWY6IFwiU3Vvcml0YSBqb3NcIixcbiAgICB0cmlnZ2VyU2V0VG9OYW1lOiBcIk11dXRhIGFydm9hOiBcIixcbiAgICB0cmlnZ2VyRnJvbU5hbWU6IFwiS29waW9pIGFydm8ga29odGVlc3RhOiBcIixcbiAgICB0cmlnZ2VyUnVuRXhwcmVzc2lvbjogXCJTdW9yaXRhIHTDpG3DpCBsYXVzZWtlOlwiLFxuICAgIHRyaWdnZXJTZXRWYWx1ZTogXCJrb2h0YWFuOiBcIixcbiAgICB0cmlnZ2VyR290b05hbWU6IFwiU2lpcnJ5IGt5c3lteWtzZWVuOlwiLFxuICAgIHRyaWdnZXJJc1ZhcmlhYmxlOiBcIsOEbMOkIGxpc8Okw6QgbXV1dHR1amFhIGt5c2VseW4gdHVsb2tzZWVuLlwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uRW1wdHk6IFwiQW5uYSBrZWx2b2xsaW5lbiBsYXVzZWtlXCIsXG5cbiAgICBub0ZpbGU6IFwiVGllZG9zdG9hIGVpIG9sZSB2YWxpdHR1bmFcIixcbiAgfSxcbiAgLy9Qcm9wZXJ0eSB2YWx1ZXNcbiAgcHY6IHtcbiAgICB0cnVlOiBcInRydWVcIixcbiAgICBmYWxzZTogXCJmYWxzZVwiLFxuICAgIGluaGVyaXQ6IFwiaW5oZXJpdFwiLFxuICAgIHNob3c6IFwic2hvd1wiLFxuICAgIGhpZGU6IFwiaGlkZVwiLFxuICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgIGluaXRpYWw6IFwiaW5pdGlhbFwiLFxuICAgIHJhbmRvbTogXCJyYW5kb21cIixcbiAgICBjb2xsYXBzZWQ6IFwiY29sbGFwc2VkXCIsXG4gICAgZXhwYW5kZWQ6IFwiZXhwYW5kZWRcIixcbiAgICBub25lOiBcIm5vbmVcIixcbiAgICBhc2M6IFwiYXNjZW5kaW5nXCIsXG4gICAgZGVzYzogXCJkZXNjZW5kaW5nXCIsXG4gICAgaW5kZXRlcm1pbmF0ZTogXCJpbmRldGVybWluYXRlXCIsXG4gICAgZGVjaW1hbDogXCJkZWNpbWFsXCIsXG4gICAgY3VycmVuY3k6IFwiY3VycmVuY3lcIixcbiAgICBwZXJjZW50OiBcInBlcmNlbnRcIixcbiAgICBmaXJzdEV4cGFuZGVkOiBcImZpcnN0RXhwYW5kZWRcIixcbiAgICBvZmY6IFwib2ZmXCIsXG4gICAgb25QYW5lbDogXCJvblBhbmVsXCIsXG4gICAgb25TdXJ2ZXk6IFwib25TdXJ2ZXlcIixcbiAgICBsaXN0OiBcImxpc3RcIixcbiAgICBwcm9ncmVzc1RvcDogXCJwcm9ncmVzc1RvcFwiLFxuICAgIHByb2dyZXNzQm90dG9tOiBcInByb2dyZXNzQm90dG9tXCIsXG4gICAgcHJvZ3Jlc3NUb3BCb3R0b206IFwicHJvZ3Jlc3NUb3BCb3R0b21cIixcbiAgICBob3Jpem9udGFsOiBcImhvcml6b250YWxcIixcbiAgICB2ZXJ0aWNhbDogXCJ2ZXJ0aWNhbFwiLFxuICAgIHRvcDogXCJ0b3BcIixcbiAgICBib3R0b206IFwiYm90dG9tXCIsXG4gICAgdG9wQm90dG9tOiBcInRvcCBhbmQgYm90dG9tXCIsXG4gICAgYm90aDogXCJib3RoXCIsXG4gICAgbGVmdDogXCJsZWZ0XCIsXG4gICAgY29sb3I6IFwiY29sb3JcIixcbiAgICBkYXRlOiBcImRhdGVcIixcbiAgICBkYXRldGltZTogXCJkYXRldGltZVwiLFxuICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjogXCJkYXRldGltZS1sb2NhbFwiLFxuICAgIGVtYWlsOiBcImVtYWlsXCIsXG4gICAgbW9udGg6IFwibW9udGhcIixcbiAgICBudW1iZXI6IFwibnVtYmVyXCIsXG4gICAgcGFzc3dvcmQ6IFwicGFzc3dvcmRcIixcbiAgICByYW5nZTogXCJyYW5nZVwiLFxuICAgIHRlbDogXCJ0ZWxcIixcbiAgICB0ZXh0OiBcInRleHRcIixcbiAgICB0aW1lOiBcInRpbWVcIixcbiAgICB1cmw6IFwidXJsXCIsXG4gICAgd2VlazogXCJ3ZWVrXCIsXG4gICAgaGlkZGVuOiBcImhpZGRlblwiLFxuICAgIG9uOiBcIm9uXCIsXG4gICAgb25QYWdlOiBcIm9uUGFnZVwiLFxuICAgIGVkaXQ6IFwiZWRpdFwiLFxuICAgIGRpc3BsYXk6IFwiZGlzcGxheVwiLFxuICAgIG9uQ29tcGxldGU6IFwib25Db21wbGV0ZVwiLFxuICAgIG9uSGlkZGVuOiBcIm9uSGlkZGVuXCIsXG4gICAgYWxsOiBcImFsbFwiLFxuICAgIHBhZ2U6IFwicGFnZVwiLFxuICAgIHN1cnZleTogXCJzdXJ2ZXlcIixcbiAgICBvbk5leHRQYWdlOiBcIm9uTmV4dFBhZ2VcIixcbiAgICBvblZhbHVlQ2hhbmdlZDogXCJvblZhbHVlQ2hhbmdlZFwiLFxuICAgIHNpbmdsZVBhZ2U6IFwic2luZ2xlIHBhZ2VcIixcbiAgICBzdGFuZGFyZDogXCJzdGFuZGFyZFwiLFxuICAgIHF1ZXN0aW9uUGVyUGFnZTogXCJxdWVzdGlvbiBwZXIgcGFnZVwiLFxuICAgIG5vUHJldmlldzogXCJubyBwcmV2aWV3XCIsXG4gICAgc2hvd0FsbFF1ZXN0aW9uczogXCJzaG93IHByZXZpZXcgd2l0aCBhbGwgcXVlc3Rpb25zXCIsXG4gICAgc2hvd0Fuc3dlcmVkUXVlc3Rpb25zOiBcInNob3cgcHJldmlldyB3aXRoIGFuc3dlcmVkIHF1ZXN0aW9uc1wiLFxuICB9LFxuICAvL09wZXJhdG9yc1xuICBvcDoge1xuICAgIGVtcHR5OiBcIm9uIHR5aGrDpFwiLFxuICAgIG5vdGVtcHR5OiBcImVpIG9sZSB0eWhqw6RcIixcbiAgICBlcXVhbDogXCJ5aHTDpHN1dXJpa3VpblwiLFxuICAgIG5vdGVxdWFsOiBcImVpIG9sZSB5aHTDpHN1dXJpa3VpblwiLFxuICAgIGNvbnRhaW5zOiBcInNpc8OkbHTDpMOkXCIsXG4gICAgbm90Y29udGFpbnM6IFwiZWkgc2lzw6RsbMOkXCIsXG4gICAgYW55b2Y6IFwibWlrw6QgdGFoYW5zYVwiLFxuICAgIGFsbG9mOiBcImthaWtraVwiLFxuICAgIGdyZWF0ZXI6IFwic3V1cmVtcGlcIixcbiAgICBsZXNzOiBcInbDpGhlbW3DpG5cIixcbiAgICBncmVhdGVyb3JlcXVhbDogXCJzdXVyZW1waSB0YWkgeWh0w6RzdXVyaWt1aW5cIixcbiAgICBsZXNzb3JlcXVhbDogXCJ2w6RoZW1tw6RuIHRhaSB5aHTDpHN1dXJpa3VpblwiLFxuICAgIGFuZDogXCJqYVwiLFxuICAgIG9yOiBcInRhaVwiLFxuICB9LFxuICAvL0VtYmVkIHdpbmRvd1xuICBldzoge1xuICAgIGFuZ3VsYXI6IFwiS8OkeXTDpCBBbmd1bGFyIHZlcnNpb3RhXCIsXG4gICAganF1ZXJ5OiBcIkvDpHl0w6QgalF1ZXJ5IHZlcnNpb3RhXCIsXG4gICAga25vY2tvdXQ6IFwiS8OkeXTDpCBLbm9ja291dCB2ZXJzaW90YVwiLFxuICAgIHJlYWN0OiBcIkvDpHl0w6QgUmVhY3QgdmVyc2lvdGFcIixcbiAgICB2dWU6IFwiS8OkeXTDpCBWdWUgdmVyc2lvdGFcIixcbiAgICBib290c3RyYXA6IFwiQm9vdHN0cmFwIHR5w7ZrYWx1bGxlXCIsXG4gICAgbW9kZXJuOiBcIk1vZGVybmkgdGVlbWFcIixcbiAgICBkZWZhdWx0OiBcIk9sZXR1cyB0ZWVtYVwiLFxuICAgIG9yYW5nZTogXCJPcmFuc3NpIHRlZW1hXCIsXG4gICAgZGFya2JsdWU6IFwiVHVtbWFuc2luaW5lbiB0ZWVtYVwiLFxuICAgIGRhcmtyb3NlOiBcIlR1bW1hIHJ1dXN1IHRlZW1hXCIsXG4gICAgc3RvbmU6IFwiS2l2aXRlZW1hXCIsXG4gICAgd2ludGVyOiBcIlRhbHZpIHRlZW1hXCIsXG4gICAgd2ludGVyc3RvbmU6IFwiVGFsdmkta2l2aS10ZWVtYVwiLFxuICAgIHNob3dPblBhZ2U6IFwiTsOkeXTDpCBreXNlbHkgc2l2dWxsYVwiLFxuICAgIHNob3dJbldpbmRvdzogXCJOw6R5dMOkIGt5c2VseSBpa2t1bmFzc2FcIixcbiAgICBsb2FkRnJvbVNlcnZlcjogXCJMYXRhYSBreXNlbHkgcGFsdmVsaW1lbHRhIEpTT04gbXVvZG9zc2FcIixcbiAgICB0aXRsZVNjcmlwdDogXCJTa3JpcHRpdCBqYSB0eXlsaXRcIixcbiAgICB0aXRsZUh0bWw6IFwiSFRNTFwiLFxuICAgIHRpdGxlSmF2YVNjcmlwdDogXCJKYXZhU2NyaXB0XCIsXG4gIH0sXG4gIC8vVGVzdCBTdXJ2ZXlcbiAgdHM6IHtcbiAgICBzZWxlY3RQYWdlOiBcIlZhbGl0c2Ugc2l2dSB0ZXN0YXRha3Nlc2kgc2l0w6Q6XCIsXG4gICAgc2hvd0ludmlzaWJsZUVsZW1lbnRzOiBcIk7DpHl0w6QgbsOka3ltw6R0w7ZuIGVsZW1lbnR0aVwiLFxuICB9LFxuICB2YWxpZGF0b3JzOiB7XG4gICAgYW5zd2VyY291bnR2YWxpZGF0b3I6IFwidmFzdGF1c3RlbiBtw6TDpHLDpFwiLFxuICAgIGVtYWlsdmFsaWRhdG9yOiBcInPDpGhrw7Zwb3N0aVwiLFxuICAgIGV4cHJlc3Npb252YWxpZGF0b3I6IFwibGF1c2VrZVwiLFxuICAgIG51bWVyaWN2YWxpZGF0b3I6IFwibHVrdW3DpMOkcsOkaW5lblwiLFxuICAgIHJlZ2V4dmFsaWRhdG9yOiBcInPDpMOkbm7DtmxsaW5lbiBsYXVzZWtlXCIsXG4gICAgdGV4dHZhbGlkYXRvcjogXCJ0ZWtzdGlcIixcbiAgfSxcbiAgdHJpZ2dlcnM6IHtcbiAgICBjb21wbGV0ZXRyaWdnZXI6IFwidmFsbWlzIGt5c2VseVwiLFxuICAgIHNldHZhbHVldHJpZ2dlcjogXCJhc2V0YSBhcnZvXCIsXG4gICAgY29weXZhbHVldHJpZ2dlcjogXCJrb3Bpb2kgYXJ2b1wiLFxuICAgIHNraXB0cmlnZ2VyOiBcInNpaXJyeSBreXN5bXlrc2VlblwiLFxuICAgIHJ1bmV4cHJlc3Npb250cmlnZ2VyOiBcInN1b3JpdGEgbGF1c2VrZVwiLFxuICAgIHZpc2libGV0cmlnZ2VyOiBcIm11dXRhIG7DpGt5dnl5dHTDpCAodmFuaGVudHVudXQpXCIsXG4gIH0sXG4gIHBlaGVscDoge1xuICAgIC8vZXhwcmVzc2lvbjpcbiAgfSxcbiAgLy9Qcm9wZXJ0aWVzXG4gIHA6IHtcbiAgICBuYW1lOiBcIm5pbWlcIixcbiAgICB0aXRsZToge1xuICAgICAgbmFtZTogXCJvdHNpa2tvXCIsXG4gICAgICB0aXRsZTogXCJKw6R0w6Qgc2UgdHloasOka3NpLCBqb3Mgc2Ugb24gc2FtYSBrdWluICdOaW1pJ1wiLFxuICAgIH0sXG5cbiAgICBuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHk6IFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwicXVlc3Rpb25zT3JkZXJcIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwibWF4VGltZVRvRmluaXNoXCIsXG5cbiAgICB2aXNpYmxlOiBcInZpc2libGVcIixcbiAgICB2aXNpYmxlSWY6IFwidmlzaWJsZUlmXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLFxuICAgIGRlc2NyaXB0aW9uOiBcImRlc2NyaXB0aW9uXCIsXG4gICAgc3RhdGU6IFwic3RhdGVcIixcbiAgICBpc1JlcXVpcmVkOiBcImlzUmVxdWlyZWRcIixcbiAgICByZXF1aXJlZElmOiBcInJlcXVpcmVkSWZcIixcbiAgICBpbmRlbnQ6IFwiaW5kZW50XCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwicmVxdWlyZWRFcnJvclRleHRcIixcbiAgICBzdGFydFdpdGhOZXdMaW5lOiBcInN0YXJ0V2l0aE5ld0xpbmVcIixcbiAgICBpbm5lckluZGVudDogXCJpbm5lckluZGVudFwiLFxuICAgIHBhZ2U6IFwicGFnZVwiLFxuXG4gICAgd2lkdGg6IFwid2lkdGhcIixcblxuICAgIGNvbW1lbnRUZXh0OiBcImNvbW1lbnRUZXh0XCIsXG4gICAgdmFsdWVOYW1lOiBcInZhbHVlTmFtZVwiLFxuICAgIGVuYWJsZUlmOiBcImVuYWJsZUlmXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcImRlZmF1bHRWYWx1ZVwiLFxuICAgIGNvcnJlY3RBbnN3ZXI6IFwiY29ycmVjdEFuc3dlclwiLFxuICAgIHJlYWRPbmx5OiBcInJlYWRPbmx5XCIsXG4gICAgdmFsaWRhdG9yczogXCJ2YWxpZGF0b3JzXCIsXG4gICAgdGl0bGVMb2NhdGlvbjogXCJ0aXRsZUxvY2F0aW9uXCIsXG5cbiAgICBoYXNDb21tZW50OiBcImhhc0NvbW1lbnRcIixcbiAgICBoYXNPdGhlcjogXCJoYXNPdGhlclwiLFxuICAgIGNob2ljZXM6IFwiY2hvaWNlc1wiLFxuICAgIGNob2ljZXNPcmRlcjogXCJjaG9pY2VzT3JkZXJcIixcbiAgICBjaG9pY2VzQnlVcmw6IFwiY2hvaWNlc0J5VXJsXCIsXG4gICAgb3RoZXJUZXh0OiBcIm90aGVyVGV4dFwiLFxuICAgIG90aGVyRXJyb3JUZXh0OiBcIm90aGVyRXJyb3JUZXh0XCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIixcblxuICAgIGxhYmVsOiBcImxhYmVsXCIsXG4gICAgc2hvd1RpdGxlOiBcInNob3dUaXRsZVwiLFxuICAgIHZhbHVlVHJ1ZTogXCJ2YWx1ZVRydWVcIixcbiAgICB2YWx1ZUZhbHNlOiBcInZhbHVlRmFsc2VcIixcblxuICAgIGNvbHM6IFwiY29sc1wiLFxuICAgIHJvd3M6IFwicm93c1wiLFxuICAgIHBsYWNlSG9sZGVyOiBcInBsYWNlSG9sZGVyXCIsXG5cbiAgICBvcHRpb25zQ2FwdGlvbjogXCJvcHRpb25zQ2FwdGlvblwiLFxuXG4gICAgZXhwcmVzc2lvbjogXCJleHByZXNzaW9uXCIsXG4gICAgZm9ybWF0OiBcImZvcm1hdFwiLFxuICAgIGRpc3BsYXlTdHlsZTogXCJkaXNwbGF5U3R5bGVcIixcbiAgICBjdXJyZW5jeTogXCJjdXJyZW5jeVwiLFxuICAgIHVzZUdyb3VwaW5nOiBcInVzZUdyb3VwaW5nXCIsXG5cbiAgICBzaG93UHJldmlldzogXCJzaG93UHJldmlld1wiLFxuICAgIGFsbG93TXVsdGlwbGU6IFwiYWxsb3dNdWx0aXBsZVwiLFxuICAgIGltYWdlSGVpZ2h0OiBcImltYWdlSGVpZ2h0XCIsXG4gICAgaW1hZ2VXaWR0aDogXCJpbWFnZVdpZHRoXCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcInN0b3JlRGF0YUFzVGV4dFwiLFxuICAgIG1heFNpemU6IFwibWF4U2l6ZVwiLFxuXG4gICAgaHRtbDogXCJodG1sXCIsXG5cbiAgICBjb2x1bW5zOiBcImNvbHVtbnNcIixcbiAgICBjZWxsczogXCJjZWxsc1wiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwiaXNBbGxSb3dSZXF1aXJlZFwiLFxuXG4gICAgaG9yaXpvbnRhbFNjcm9sbDogXCJob3Jpem9udGFsU2Nyb2xsXCIsXG4gICAgY2VsbFR5cGU6IFwiY2VsbFR5cGVcIixcbiAgICBjb2x1bW5zTGF5b3V0OiBcImNvbHVtbnNMYXlvdXRcIixcbiAgICBjb2x1bW5Db2xDb3VudDogXCJjb2x1bW5Db2xDb3VudFwiLFxuICAgIGNvbHVtbk1pbldpZHRoOiBcImNvbHVtbk1pbldpZHRoXCIsXG5cbiAgICByb3dDb3VudDogXCJyb3dDb3VudFwiLFxuICAgIG1pblJvd0NvdW50OiBcIm1pblJvd0NvdW50XCIsXG4gICAgbWF4Um93Q291bnQ6IFwibWF4Um93Q291bnRcIixcbiAgICBrZXlOYW1lOiBcImtleU5hbWVcIixcbiAgICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICBjb25maXJtRGVsZXRlOiBcImNvbmZpcm1EZWxldGVcIixcbiAgICBjb25maXJtRGVsZXRlVGV4dDogXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcImFkZFJvd0xvY2F0aW9uXCIsXG4gICAgYWRkUm93VGV4dDogXCJhZGRSb3dUZXh0XCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCJyZW1vdmVSb3dUZXh0XCIsXG5cbiAgICBpdGVtczogXCJpdGVtc1wiLFxuICAgIGl0ZW1TaXplOiBcIml0ZW1TaXplXCIsXG4gICAgY29sQ291bnQ6IFwiY29sQ291bnRcIixcblxuICAgIHRlbXBsYXRlVGl0bGU6IFwidGVtcGxhdGVUaXRsZVwiLFxuICAgIHRlbXBsYXRlRGVzY3JpcHRpb246IFwidGVtcGxhdGVEZXNjcmlwdGlvblwiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwiYWxsb3dBZGRQYW5lbFwiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwiYWxsb3dSZW1vdmVQYW5lbFwiLFxuICAgIHBhbmVsQ291bnQ6IFwicGFuZWxDb3VudFwiLFxuICAgIG1pblBhbmVsQ291bnQ6IFwibWluUGFuZWxDb3VudFwiLFxuICAgIG1heFBhbmVsQ291bnQ6IFwibWF4UGFuZWxDb3VudFwiLFxuICAgIHBhbmVsc1N0YXRlOiBcInBhbmVsc1N0YXRlXCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcInBhbmVsQWRkVGV4dFwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCJwYW5lbFJlbW92ZVRleHRcIixcbiAgICBwYW5lbFByZXZUZXh0OiBcInBhbmVsUHJldlRleHRcIixcbiAgICBwYW5lbE5leHRUZXh0OiBcInBhbmVsTmV4dFRleHRcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcInNob3dRdWVzdGlvbk51bWJlcnNcIixcbiAgICBzaG93UmFuZ2VJblByb2dyZXNzOiBcInNob3dSYW5nZUluUHJvZ3Jlc3NcIixcbiAgICByZW5kZXJNb2RlOiBcInJlbmRlck1vZGVcIixcbiAgICB0ZW1wbGF0ZVRpdGxlTG9jYXRpb246IFwidGVtcGxhdGVUaXRsZUxvY2F0aW9uXCIsXG5cbiAgICByYXRlVmFsdWVzOiBcInJhdGVWYWx1ZXNcIixcbiAgICByYXRlTWluOiBcInJhdGVNaW5cIixcbiAgICByYXRlTWF4OiBcInJhdGVNYXhcIixcbiAgICByYXRlU3RlcDogXCJyYXRlU3RlcFwiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCJtaW5SYXRlRGVzY3JpcHRpb25cIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsXG5cbiAgICBpbnB1dFR5cGU6IFwiaW5wdXRUeXBlXCIsXG4gICAgc2l6ZTogXCJzaXplXCIsXG5cbiAgICBsb2NhbGU6IFwibG9jYWxlXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcImZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpY1wiLFxuICAgIGNvbXBsZXRlZEh0bWw6IFwiY29tcGxldGVkSHRtbFwiLFxuICAgIGNvbXBsZXRlZEJlZm9yZUh0bWw6IFwiY29tcGxldGVkQmVmb3JlSHRtbFwiLFxuICAgIGxvYWRpbmdIdG1sOiBcImxvYWRpbmdIdG1sXCIsXG4gICAgdHJpZ2dlcnM6IFwidHJpZ2dlcnNcIixcbiAgICBjb29raWVOYW1lOiBcImNvb2tpZU5hbWVcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCJzZW5kUmVzdWx0T25QYWdlTmV4dFwiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczogXCJzaG93TmF2aWdhdGlvbkJ1dHRvbnNcIixcbiAgICBzaG93UHJldkJ1dHRvbjogXCJzaG93UHJldkJ1dHRvblwiLFxuICAgIHNob3dQYWdlVGl0bGVzOiBcInNob3dQYWdlVGl0bGVzXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwic2hvd0NvbXBsZXRlZFBhZ2VcIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwic2hvd1BhZ2VOdW1iZXJzXCIsXG4gICAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBcInF1ZXN0aW9uRXJyb3JMb2NhdGlvblwiLFxuICAgIHNob3dQcm9ncmVzc0JhcjogXCJzaG93UHJvZ3Jlc3NCYXJcIixcbiAgICBtb2RlOiBcIm1vZGVcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOiBcImdvTmV4dFBhZ2VBdXRvbWF0aWNcIixcbiAgICBjaGVja0Vycm9yc01vZGU6IFwiY2hlY2tFcnJvcnNNb2RlXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwic3RhcnRTdXJ2ZXlUZXh0XCIsXG4gICAgcGFnZVByZXZUZXh0OiBcInBhZ2VQcmV2VGV4dFwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJwYWdlTmV4dFRleHRcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiY29tcGxldGVUZXh0XCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInJlcXVpcmVkVGV4dFwiLFxuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogXCJxdWVzdGlvblN0YXJ0SW5kZXhcIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6IFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcImZpcnN0UGFnZUlzU3RhcnRlZFwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJpc1NpbmdsZVBhZ2VcIixcbiAgICBtYXhUaW1lVG9GaW5pc2hQYWdlOiBcIm1heFRpbWVUb0ZpbmlzaFBhZ2VcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCJzaG93VGltZXJQYW5lbFwiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCJzaG93VGltZXJQYW5lbE1vZGVcIixcblxuICAgIGRlZmF1bHRQYW5lbFZhbHVlOiBcImRlZmF1bHRQYW5lbFZhbHVlXCIsXG4gICAgZGVmYXVsdFJvd1ZhbHVlOiBcImRlZmF1bHRSb3dWYWx1ZVwiLFxuICAgIGhhc05vbmU6IFwiaGFzTm9uZVwiLFxuICAgIG5vbmVUZXh0OiBcIm5vbmVUZXh0XCIsXG5cbiAgICB0ZXh0OiBcInRleHRcIixcbiAgfSxcbn07XG4vLyBVbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5lZGl0b3JMb2NhbGl6YXRpb24ubG9jYWxlc1tcImZpXCJdID0gZmlTdHJpbmdzO1xuIiwiaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuXG52YXIgZnJlbmNoVHJhbnNsYXRpb24gPSB7XG4gIC8vU3VydmV5IHRlbXBsYXRlc1xuICBzdXJ2ZXk6IHtcbiAgICBlZGl0OiBcIsOJZGl0ZXJcIixcbiAgICBkcm9wUXVlc3Rpb246IFwiRMOpcG9zZXIgdm90cmUgcXVlc3Rpb24gaWNpLlwiLFxuICAgIGNvcHk6IFwiQ29waWVyXCIsXG4gICAgYWRkVG9Ub29sYm94OiBcIkFqb3V0ZXIgw6AgbGEgYm/DrnRlIMOgIG91dGlsc1wiLFxuICAgIGRlbGV0ZVBhbmVsOiBcIlN1cHByaW1lciBsZSBwYW5uZWF1XCIsXG4gICAgZGVsZXRlUXVlc3Rpb246IFwiU3VwcHJpbWVyIGxhIHF1ZXN0aW9uXCIsXG4gICAgY29udmVydFRvOiBcIkNvbnZlcnRpciBlblwiLFxuICB9LFxuICAvL3F1ZXN0aW9uVHlwZXNcbiAgcXQ6IHtcbiAgICBkZWZhdWx0OiBcIlBhciBkw6lmYXV0XCIsXG4gICAgY2hlY2tib3g6IFwiQ2FzZXMgw6AgY29jaGVyXCIsXG4gICAgY29tbWVudDogXCJDb21tZW50YWlyZVwiLFxuICAgIGltYWdlcGlja2VyOiBcIkNob2l4IGQnaW1hZ2VcIixcbiAgICBkcm9wZG93bjogXCJMaXN0ZSBkw6lyb3VsYW50ZVwiLFxuICAgIGZpbGU6IFwiRmljaGllclwiLFxuICAgIGh0bWw6IFwiSFRNTFwiLFxuICAgIG1hdHJpeDogXCJNYXRyaWNlIChjaG9peCB1bmlxdWUpXCIsXG4gICAgbWF0cml4ZHJvcGRvd246IFwiTWF0cmljZSAoY2hvaXggbXVsdGlwbGVzKVwiLFxuICAgIG1hdHJpeGR5bmFtaWM6IFwiTWF0cmljZSAobGlnbmVzIGR5bmFtaXF1ZXMpXCIsXG4gICAgbXVsdGlwbGV0ZXh0OiBcIkNoYW1wIG11bHRpbGlnbmVzXCIsXG4gICAgcGFuZWw6IFwiUGFubmVhdVwiLFxuICAgIHBhbmVsZHluYW1pYzogXCJQYW5uZWF1IChwYW5uZWF1eCBkeW5hbWlxdWVzKVwiLFxuICAgIHJhZGlvZ3JvdXA6IFwiQm91dG9ucyByYWRpb1wiLFxuICAgIHJhdGluZzogXCLDiXZhbHVhdGlvblwiLFxuICAgIHRleHQ6IFwiQ2hhbXAgdGV4dGVcIixcbiAgICBib29sZWFuOiBcIkJvb2zDqWVuXCIsXG4gICAgZXhwcmVzc2lvbjogXCJFeHByZXNzaW9uXCIsXG4gIH0sXG4gIC8vU3RyaW5ncyBpbiBFZGl0b3JcbiAgZWQ6IHtcbiAgICBzdXJ2ZXk6IFwiUXVlc3Rpb25uYWlyZVwiLFxuICAgIGVkaXRTdXJ2ZXk6IFwiw4lkaXRlciBsZSBxdWVzdGlvbm5haXJlXCIsXG4gICAgc2V0dGluZ3M6IFwiQ29uZmlndXJhdGlvbiBkdSBxdWVzdGlvbm5haXJlXCIsXG4gICAgb3BqZWN0UHJvcGVydGllc0hlYWRlcjogXCJQcm9wcmnDqXTDqXNcIixcbiAgICBzaG93T2JqZWN0UHJvcGVydGllczogXCJBZmZpY2hlciBsZXMgcHJvcHJpw6l0w6lzXCIsXG4gICAgaGlkZU9iamVjdFByb3BlcnRpZXM6IFwiQ2FjaGVyIGxlcyBwcm9wcmnDqXTDqXNcIixcbiAgICBhZGROZXdQYWdlOiBcIkFqb3V0ZXIgdW5lIHBhZ2VcIixcbiAgICBtb3ZlUmlnaHQ6IFwiRMOpZmlsZXIgw6AgZHJvaXRlXCIsXG4gICAgbW92ZUxlZnQ6IFwiRMOpZmlsZXIgw6AgZ2F1Y2hlXCIsXG4gICAgZGVsZXRlUGFnZTogXCJTdXBwcmltZXIgdW5lIHBhZ2VcIixcbiAgICBlZGl0UGFnZTogXCLDiWRpdGVyIHVuZSBwYWdlXCIsXG4gICAgZWRpdDogXCLDiWRpdGVyXCIsXG4gICAgbmV3UGFnZU5hbWU6IFwicGFnZVwiLFxuICAgIG5ld1F1ZXN0aW9uTmFtZTogXCJxdWVzdGlvblwiLFxuICAgIG5ld1BhbmVsTmFtZTogXCJwYW5uZWF1XCIsXG4gICAgbmV3VGV4dEl0ZW1OYW1lOiBcInRleHRlXCIsXG4gICAgdGVzdFN1cnZleTogXCJUZXN0ZXIgbGUgcXVlc3Rpb25uYWlyZVwiLFxuICAgIHRlc3RTdXJ2ZXlBZ2FpbjogXCJUZXN0ZXIgw6Agbm91dmVhdSBsZSBxdWVzdGlvbm5haXJlXCIsXG4gICAgdGVzdFN1cnZleVdpZHRoOiBcIkxhcmdldXIgZHUgcXVlc3Rpb25uYWlyZSA6IFwiLFxuICAgIGVtYmVkU3VydmV5OiBcIkludMOpZ3JlciBsZSBxdWVzdGlvbm5haXJlXCIsXG4gICAgdHJhbnNsYXRpb246IFwiVHJhZHVjdGlvblwiLFxuICAgIHNhdmVTdXJ2ZXk6IFwiU2F1dmVnYXJkZXIgbGUgcXVlc3Rpb25uYWlyZVwiLFxuICAgIGRlc2lnbmVyOiBcIsOJZGl0ZXVyIGRlIHF1ZXN0aW9ubmFpcmVcIixcbiAgICBqc29uRWRpdG9yOiBcIsOJZGl0ZXIgSlNPTlwiLFxuICAgIHVuZG86IFwiQW5udWxlclwiLFxuICAgIHJlZG86IFwiUsOpdGFibGlyXCIsXG4gICAgb3B0aW9uczogXCJPcHRpb25zXCIsXG4gICAgZ2VuZXJhdGVWYWxpZEpTT046IFwiR8OpbsOpcmVyIHVuIEpTT04gdmFsaWRlXCIsXG4gICAgZ2VuZXJhdGVSZWFkYWJsZUpTT046IFwiR8OpbsOpcmVyIHVuIEpTT04gbGlzaWJsZVwiLFxuICAgIHRvb2xib3g6IFwiQm/DrnRlIMOgIG91dGlsc1wiLFxuICAgIFwicHJvcGVydHktZ3JpZFwiOiBcIlByb3ByacOpdMOpc1wiLFxuICAgIHRvb2xib3hHZW5lcmFsQ2F0ZWdvcnk6IFwiR8OpbsOpcmFsXCIsXG4gICAgZGVsU2VsT2JqZWN0OiBcIlN1cHByaW1lciBsJ29iamV0IHPDqWxlY3Rpb25uw6lcIixcbiAgICBlZGl0U2VsT2JqZWN0OiBcIsOJZGl0ZXIgbCdvYmpldCBzw6lsZWN0aW9ubsOpXCIsXG4gICAgY29ycmVjdEpTT046IFwiU1ZQIGNvcnJpZ2V6IGxlIEpTT05cIixcbiAgICBzdXJ2ZXlSZXN1bHRzOiBcIlLDqXN1bHRhdCBkdSBxdWVzdGlvbm5haXJlIDogXCIsXG4gICAgc3VydmV5UmVzdWx0c1RhYmxlOiBcIkNvbW1lIHRhYmxlYXVcIixcbiAgICBzdXJ2ZXlSZXN1bHRzSnNvbjogXCJDb21tZSBKU09OXCIsXG4gICAgcmVzdWx0c1RpdGxlOiBcIlRpdHJlIGRlIGxhIHF1ZXN0aW9uXCIsXG4gICAgcmVzdWx0c05hbWU6IFwiTm9tIGRlIGxhIHF1ZXN0aW9uXCIsXG4gICAgcmVzdWx0c1ZhbHVlOiBcIlZhbGV1ciBkZSBsYSByw6lwb25zZVwiLFxuICAgIHJlc3VsdHNEaXNwbGF5VmFsdWU6IFwiVmFsZXVyIGFmZmljaMOpZVwiLFxuICAgIG1vZGlmaWVkOiBcIk1vZGlmacOpXCIsXG4gICAgc2F2aW5nOiBcIlNhdXZlZ2FyZGUgZW4gY291cnNcIixcbiAgICBzYXZlZDogXCJTYXV2ZWdhcmTDqVwiLFxuICAgIHNhdmVFcnJvcjogXCJFcnJldXIhIExlIGNvbnRlbnUgZGUgbCfDqWRpdGV1ciBuJ2EgcGFzIMOpdMOpIHNhdXZlZ2FyZMOpLlwiLFxuICAgIHRyYW5zbGF0aW9uQWRkTGFuZ3VhZ2U6IFwiQ2hvaXNpciBsYW5ndWUgw6AgdHJhZHVpcmVcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxTdHJpbmdzOiBcIkFmZmljaGVyIHRvdXMgbGVzIHRlcm1lc1wiLFxuICAgIHRyYW5zbGF0aW9uU2hvd0FsbFBhZ2VzOiBcIkFmZmljaGVyIHRvdXRlcyBsZXMgcGFnZXNcIixcbiAgICB0cmFuc2xhdGlvbk5vU3RyaW5nczpcbiAgICAgIFwiQXVjdW4gdGVybWUgw6AgdHJhZHVpcmUuIFZldWlsbGV6IG1vZGlmaWVyIGxlIGZpbHRyZS5cIixcbiAgICB0cmFuc2xhdGlvbkV4cG9ydFRvU0NWQnV0dG9uOiBcIkV4cG9ydGVyIGVuIENTVlwiLFxuICAgIHRyYW5zbGF0aW9uSW1wb3J0RnJvbVNDVkJ1dHRvbjogXCJJbXBvcnRlciBkJ3VuIENTVlwiLFxuICAgIHRyYW5zbGF0aW9uTWVyZ2VMb2NhbGVXaXRoRGVmYXVsdDogXCJGdXNpb25uZXIgezB9IGF2ZWMgbGFuZ3VlIHBhciBkw6lmYXV0XCIsXG4gICAgYm9sZDogXCJHcmFzXCIsXG4gICAgaXRhbGljOiBcIkl0YWxpcXVlXCIsXG4gICAgdW5kZXJsaW5lOiBcIlNvdWxpZ27DqVwiLFxuICAgIGZwQWRkUXVlc3Rpb246IFwiQWpvdXRlciBxdWVzdGlvbi4uLlwiLFxuICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbkl0ZW1UZXh0OiBcIkFmZmljaGVyIHNpIDpcIixcbiAgICBsZzoge1xuICAgICAgLy9Mb2dpYyB0YWIgc3RyaW5nc1xuICAgICAgcGFnZV92aXNpYmlsaXR5TmFtZTogXCJWaXNpYmlsaXTDqSBkZSBsYSBwYWdlXCIsXG4gICAgICBwYW5lbF92aXNpYmlsaXR5TmFtZTogXCJWaXNpYmlsaXTDqSBkdSBwYW5uZWF1XCIsXG4gICAgICBwYW5lbF9lbmFibGVOYW1lOiBcIkFjdGl2ZXIvZMOpc2FjdGl2ZXIgbGUgcGFubmVhdVwiLFxuICAgICAgcXVlc3Rpb25fdmlzaWJpbGl0eU5hbWU6IFwiVmlzaWJpbGl0w6kgZGUgbGEgcXVlc3Rpb25cIixcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZU5hbWU6IFwiQWN0aXZlci9kw6lzYWN0aXZlciBsYSBxdWVzdGlvblwiLFxuICAgICAgcXVlc3Rpb25fcmVxdWlyZU5hbWU6IFwiUXVlc3Rpb24gZmFjdWx0YXRpdmUgcmVxdWlzZVwiLFxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZU5hbWU6IFwiQ29tcGzDqXRlciBsZSBxdWVzdGlvbm5haXJlXCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlTmFtZTogXCJEw6lmaW5pciBsYSB2YWxldXIgZGUgbGEgcXVlc3Rpb25cIixcbiAgICAgIHRyaWdnZXJfY29weXZhbHVlTmFtZTogXCJDb3BpZXIgbGEgdmFsZXVyIGRlIGxhIHF1ZXN0aW9uXCIsXG4gICAgICB0cmlnZ2VyX3NraXBOYW1lOiBcIlBhc3NlciDDoCBsYSBxdWVzdGlvblwiLFxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uTmFtZTogXCJFeMOpY3V0ZXIgdW5lIGV4cHJlc3Npb24gcGVyc29ubmFsaXPDqWVcIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbk5hbWU6XG4gICAgICAgIFwiUGVyc29ubmFsaXNlciBsZSB0ZXh0ZSBkZSBsYSBwYWdlIGRlIHJlbWVyY2llbWVudHNcIixcblxuICAgICAgcGFnZV92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiUmVuZHJlIGxhIHBhZ2UgdmlzaWJsZSBsb3JzcXVlIGwnZXhwcmVzc2lvbiBsb2dpcXVlIHJlbnZvaWUgJ3ZyYWknLiBTaW5vbiwgbGEgcmVuZHJlIGludmlzaWJsZS5cIixcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJSZW5kcmUgbGUgcGFubmVhdSB2aXNpYmxlIGxvcnNxdWUgbCdleHByZXNzaW9uIGxvZ2lxdWUgcmVudm9pZSAndnJhaScuIFNpbm9uLCBsZSByZW5kcmUgaW52aXNpYmxlLlwiLFxuICAgICAgcGFuZWxfZW5hYmxlRGVzY3JpcHRpb246XG4gICAgICAgIFwiQWN0aXZleiBsZSBwYW5uZWF1IGV0IHRvdXMgbGVzIMOpbMOpbWVudHMgcXUnaWwgY29udGllbnQgbG9yc3F1ZSBsJ2V4cHJlc3Npb24gbG9naXF1ZSByZW52b2llICd2cmFpJy4gU2lub24sIGxlIGxhaXNzZXIgZMOpc2FjdGl2w6kuXCIsXG4gICAgICBxdWVzdGlvbl92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiUmVuZGV6IGxhIHF1ZXN0aW9uIHZpc2libGUgbG9yc3F1ZSBsJ2V4cHJlc3Npb24gbG9naXF1ZSByZW52b2llICd2cmFpJy4gU2lub24sIGxhIHJlbmRyZSBpbnZpc2libGUuXCIsXG4gICAgICBxdWVzdGlvbl9lbmFibGVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJBY3RpdmV6IGxhIHF1ZXN0aW9uIGxvcnNxdWUgbCdleHByZXNzaW9uIGxvZ2lxdWUgcmVudm9pZSAndnJhaScuIFNpbm9uLCBsYSBsYWlzc2VyIGTDqXNhY3RpdsOpZS5cIixcbiAgICAgIHF1ZXN0aW9uX3JlcXVpcmVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJMYSBxdWVzdGlvbiBkZXZpZW50IHJlcXVpc2UgbG9yc3F1ZSBsJ2V4cHJlc3Npb24gbG9naXF1ZSByZW52b2llICd2cmFpJy5cIixcbiAgICAgIHRyaWdnZXJfY29tcGxldGVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJMb3JzcXVlIGwnZXhwcmVzc2lvbiBsb2dpcXVlIHJlbnZvaWUgJ3ZyYWknLCBsJ2VucXXDqnRlIGVzdCBhbG9ycyB0ZXJtaW7DqWUgZXQgdW4gdXRpbGlzYXRldXIgdm9pdCBsYSBwYWdlIGRlIHJlbWVyY2llbWVudHMuXCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlRGVzY3JpcHRpb246XG4gICAgICAgIFwiV2hlbiBxdWVzdGlvbiB2YWx1ZXMsIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGxvZ2ljIGV4cHJlc3Npb24sIGFyZSBjaGFuZ2VkIGFuZCB0aGUgbG9naWMgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIHRoZW4gdGhlIHZhbHVlIGlzIHNldCB0byB0aGUgc2VsZWN0ZWQgcXVlc3Rpb24uXCIsXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIkxvcnNxdWUgbGVzIHZhbGV1cnMgZGUgcXVlc3Rpb24sIHF1aSBzb250IHV0aWxpc8OpZXMgZGFucyBsJ2V4cHJlc3Npb24gbG9naXF1ZSwgc29udCBtb2RpZmnDqWVzIGV0IHF1ZSBsJ2V4cHJlc3Npb24gbG9naXF1ZSByZW52b2llICd2cmFpJywgbGEgdmFsZXVyIGQndW5lIHF1ZXN0aW9uIHPDqWxlY3Rpb25uw6llIGVzdCBjb3Bpw6llIGRhbnMgdW5lIGF1dHJlIHF1ZXN0aW9uIHPDqWxlY3Rpb25uw6llLlwiLFxuICAgICAgdHJpZ2dlcl9za2lwRGVzY3JpcHRpb246XG4gICAgICAgIFwiTG9yc3F1ZSBsJ2V4cHJlc3Npb24gbG9naXF1ZSByZW52b2llICd2cmFpJywgbCdlbnF1w6p0ZSBwYXNzZSDDoCBsYSBxdWVzdGlvbiBzw6lsZWN0aW9ubsOpZS5cIixcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvbkRlc2NyaXB0aW9uOlxuICAgICAgICBcIkxvcnNxdWUgbCdleHByZXNzaW9uIGxvZ2lxdWUgcmVudm9pZSAndnJhaScsIGFsb3JzIGwnZXhwcmVzc2lvbiBwZXJzb25uYWxpc8OpZSBlc3QgZXjDqWN1dMOpZS4gVm91cyBwb3V2ZXogw6l2ZW50dWVsbGVtZW50IGTDqWZpbmlyIGNlIHLDqXN1bHRhdCBkJ2V4cHJlc3Npb24gZGFucyBsYSBxdWVzdGlvbiBzw6lsZWN0aW9ubsOpZS5cIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbkRlc2NyaXB0aW9uOlxuICAgICAgICBcIlNpIGwnZXhwcmVzc2lvbiBsb2dpcXVlIHJlbnZvaWUgJ3ZyYWknLCBsZSB0ZXh0ZSBwYXIgZMOpZmF1dCBkZSBsYSBwYWdlIGRlIHJlbWVyY2llbWVudHMgZXN0IHJlbXBsYWPDqSBwYXIgY2VsdWkgcXVlIHZvdXMgYXZleiBkw6lmaW5pLlwiLFxuXG4gICAgICBpdGVtRXhwcmVzc2lvblRleHQ6IFwiTG9yc3F1ZSBsJ2V4cHJlc3Npb246ICd7MH0nIHJlbnZvaWUgJ3ZyYWknOlwiLCAvL3swfSAtIHRoZSBleHByZXNzaW9uXG4gICAgICBwYWdlX3Zpc2liaWxpdHlUZXh0OiBcIlJlbmRyZSBsYSBwYWdlIHswfSB2aXNpYmxlXCIsIC8vezB9IHBhZ2UgbmFtZVxuICAgICAgcGFuZWxfdmlzaWJpbGl0eVRleHQ6IFwiUmVuZHJlIGxlIHBhbm5lYXUgezB9IHZpc2libGVcIiwgLy97MH0gcGFuZWwgbmFtZVxuICAgICAgcGFuZWxfZW5hYmxlVGV4dDogXCJBY3RpdmVyIGxlIHBhbm5lYXUgezB9XCIsIC8vezB9IHBhbmVsIG5hbWVcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlUZXh0OiBcIlJlbmRyZSBsYSBxdWVzdGlvbiB7MH0gdmlzaWJsZVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICBxdWVzdGlvbl9lbmFibGVUZXh0OiBcIkFjdGl2ZXIgbGEgcXVlc3Rpb24gezB9XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWVcbiAgICAgIHF1ZXN0aW9uX3JlcXVpcmVUZXh0OiBcIlJlbmRyZSBsYSBxdWVzdGlvbiB7MH0gb2JsaWdhdG9pcmVcIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZVRleHQ6IFwiTGUgcXVlc3Rpb25uYWlyZSBkZXZpZW50IGNvbXBsw6l0w6kuXCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlVGV4dDogXCJEw6lmaW5pciBkYW5zIGxhIHF1ZXN0aW9uOiB7MH0gdmFsZXVyIHsxfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lLCB7MX0gc2V0VmFsdWVcbiAgICAgIHRyaWdnZXJfY29weXZhbHVlVGV4dDpcbiAgICAgICAgXCJDb3BpZXIgZGFucyBsYSBxdWVzdGlvbjogezB9IHZhbGV1ciBkZSBsYSBxdWVzdGlvbiB7MX1cIiwgLy97MH0gYW5kIHsxfSBxdWVzdGlvbiBuYW1lc1xuICAgICAgdHJpZ2dlcl9za2lwVGV4dDogXCJEYW5zIGxlIHF1ZXN0aW9ubmFpcmUsIHBhc3NleiDDoCBsYSBxdWVzdGlvbiB7MH1cIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDE6IFwiRXjDqWN1dGVyIGwnZXhwcmVzc2lvbjogJ3swfSdcIiwgLy97MH0gdGhlIGV4cHJlc3Npb25cbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvblRleHQyOlxuICAgICAgICBcIiBldCBkw6lmaW5pc3NleiBzb24gcsOpc3VsdGF0IGRhbnMgbGEgcXVlc3Rpb246IHswfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25UZXh0OlxuICAgICAgICBcIkFmZmljaGV6IHVuIHRleHRlIHBlcnNvbm5hbGlzw6kgcG91ciBsYSBwYWdlIGRlIHJlbWVyY2llbWVudHMuXCIsXG5cbiAgICAgIGNvbmRpdGlvbnM6IFwiQ29uZGl0aW9uKHMpXCIsXG4gICAgICBhY3Rpb25zOiBcIkFjdGlvbihzKVwiLFxuICAgICAgZXhwcmVzc2lvbkVkaXRvclRpdGxlOiBcIkTDqWZpbmlzc2V6IGxlKHMpIGNvbmRpdGlvbihzKVwiLFxuICAgICAgYWN0aW9uc0VkaXRvclRpdGxlOiBcIkTDqWZpbmlzc2V6IGxlKHMpIGFjdGlvbihzKVwiLFxuXG4gICAgICBkZWxldGVBY3Rpb246IFwiRMOpdHJ1aXJlIGwnYWN0aW9uXCIsXG4gICAgICBhZGROZXdBY3Rpb246IFwiQWpvdXRlciB1bmUgbm91dmVsbGUgYWN0aW9uXCIsXG4gICAgICBzZWxlY3RlZEFjdGlvbkNhcHRpb246IFwiU8OpbGVjdGlvbm5leiB1bmUgYWN0aW9uIMOgIGFqb3V0ZXIg4oCmXCIsXG5cbiAgICAgIGV4cHJlc3Npb25JbnZhbGlkOlxuICAgICAgICBcIkwnZXhwcmVzc2lvbiBsb2dpcXVlIGVzdCB2aWRlIG91IG5vbiB2YWxpZGUuIENvcnJpZ2V6IHMnaWwtdm91cy1wbGHDrnQuXCIsXG4gICAgICBub0FjdGlvbkVycm9yOiBcIlZldWlsbGV6IGFqb3V0ZXIgYXUgbW9pbnMgdW5lIGFjdGlvbi5cIixcbiAgICAgIGFjdGlvbkludmFsaWQ6IFwiVmV1aWxsZXogY29ycmlnZXIgbGVzIHByb2Jsw6htZXMgZGFucyB2b3MgYWN0aW9ucy5cIixcbiAgICAgIGV4cHJlc3Npb25TZXR1cDogXCJcIixcbiAgICAgIGFjdGlvbnNTZXR1cDogXCJcIixcbiAgICB9LFxuICB9LFxuICAvL1Byb3BlcnR5IG5hbWVzIGluIHRhYmxlIGhlYWRlcnNcbiAgcGVsOiB7XG4gICAgaXNSZXF1aXJlZDogXCJPYmxpZ2F0b2lyZSA/XCIsXG4gIH0sXG4gIC8vUHJvcGVydHkgRWRpdG9yc1xuICBwZToge1xuICAgIGFwcGx5OiBcIkFwcGxpcXVlclwiLFxuICAgIG9rOiBcIk9LXCIsXG4gICAgc2F2ZTogXCJFbnJlZ2lzdHJlclwiLFxuICAgIGNhbmNlbDogXCJBbm51bGVyXCIsXG4gICAgcmVzZXQ6IFwiUsOpaW5pdGlhbGlzZXJcIixcbiAgICBjbG9zZTogXCJGZXJtZXJcIixcbiAgICBkZWxldGU6IFwiU3VwcHJpbWVyXCIsXG4gICAgYWRkTmV3OiBcIkFqb3V0ZXIgdW4gbm91dmVsIMOpbMOpbWVudFwiLFxuICAgIGFkZEl0ZW06IFwiQ2xpcXVlciBwb3VyIGFqb3V0ZXIgdW4gaXRlbS4uLlwiLFxuICAgIGFkZE90aGVyOiBcIkF1dHJlXCIsXG4gICAgYWRkU2VsZWN0QWxsOiBcIlRvdXQgc8OpbGVjdGlvbm5lclwiLFxuICAgIGFkZE5vbmU6IFwiQXVjdW5cIixcbiAgICByZW1vdmVBbGw6IFwiVG91dCBzdXBwcmltZXJcIixcbiAgICBlZGl0OiBcIsOJZGl0ZXJcIixcbiAgICBiYWNrOiBcIlJldG91cm5lciBzYW5zIGVucmVnaXN0cmVyXCIsXG4gICAgYmFja1Rvb2x0aXA6IFwiUmV0b3VybmVyIHNhbnMgZW5yZWdpc3RyZXJcIixcbiAgICBzYXZlQW5kQmFjazogXCJFbnJlZ2lzdHJlciBldCByZXRvdXJuZXJcIixcbiAgICBzYXZlQW5kQmFja1Rvb2x0aXA6IFwiRW5yZWdpc3RyZXIgZXQgcmV0b3VybmVyXCIsXG4gICAgbW92ZTogXCJEw6lwbGFjZXJcIixcbiAgICBlbXB0eTogXCI8dmlkZT5cIixcbiAgICBub3RFbXB0eTogXCI8w6lkaXRlciBsYSB2YWxldXI+XCIsXG4gICAgZWRpdENob2ljZXM6IFwiRWRpdGVyIGxlcyBjaG9peFwiLFxuICAgIGZhc3RFbnRyeTogXCJBam91dCByYXBpZGVcIixcbiAgICBmb3JtRW50cnk6IFwiQWpvdXQgdmlhIGZvcm11bGFpcmVcIixcbiAgICB0ZXN0U2VydmljZTogXCJUZXN0ZXIgbGUgc2VydmljZVwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFF1ZXN0aW9uOiBcIlPDqWxlY3Rpb25uZXIgdW5lIHF1ZXN0aW9uLi4uXCIsXG4gICAgY29uZGl0aW9uVmFsdWVRdWVzdGlvblRpdGxlOiBcIlPDqWxlY3Rpb25uZXIgb3Ugc2Fpc2lyIGxhIHZhbGV1clwiLFxuICAgIGNvbmRpdGlvbkJ1dHRvbkFkZDogXCJBam91dGVyXCIsXG4gICAgY29uZGl0aW9uQnV0dG9uUmVwbGFjZTogXCJSZW1wbGFjZXJcIixcbiAgICBjb25kaXRpb25IZWxwOlxuICAgICAgJ1ZldWlsbGV6IGVudHJlciB1bmUgZXhwcmVzc2lvbiBib29sw6llbm5lLiBFbGxlIGRvaXQgcmV0b3VybmVyIFZyYWkodHJ1ZSkgcG91ciBnYXJkZXIgbGEgcXVlc3Rpb24vcGFnZSB2aXNpYmxlLiBQYXIgZXhlbXBsZToge3F1ZXN0aW9uMX0gPSBcInZhbGV1cjFcIiBvciAoe3F1ZXN0aW9uMn0gPSAzIGFuZCB7cXVlc3Rpb24zfSA8IDUpJyxcbiAgICBleHByZXNzaW9uSGVscDpcbiAgICAgIFwiVmV1aWxsZXogZW50cmVyIHVuZSBleHByZXNzaW9uLiBWb3VzIHBvdXZleiB1dGlsaXNlciBkZXMgYWNjb2xhZGVzIHBvdXIgYWNjw6lkZXIgYXV4IHZhbGV1cnMgZGVzIHF1ZXN0aW9ucyAne3F1ZXN0aW9uMX0gKyB7cXVlc3Rpb24yfScsICcoe3ByaXh9KntxdWFudGl0ZX0pICogKDEwMCAtIHtyZW1pc2V9KSdcIixcbiAgICBhY2VFZGl0b3JIZWxwOlxuICAgICAgXCJBcHB1eWVyIHN1ciBDdHJsICsgZXNwYWNlIHBvdXIgb2J0ZW5pciB1bmUgYWlkZSBwb3VyIGxhIHNhaXNpZSBkJ2V4cHJlc3Npb25cIixcbiAgICBhY2VFZGl0b3JSb3dUaXRsZTogXCJMaWduZSBjb3VyYW50ZVwiLFxuICAgIGFjZUVkaXRvclBhbmVsVGl0bGU6IFwiUGFubmVhdSBjb3VyYW50XCIsXG4gICAgc2hvd01vcmU6XG4gICAgICBcIlBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucywgdmV1aWxsZXogdm91cyByw6lmw6lyZXIgw6AgbGEgZG9jdW1lbnRhdGlvblwiLFxuICAgIGFzc2lzdGFudFRpdGxlOiBcIlF1ZXN0aW9ucyBkaXNwb25pYmxlcyA6XCIsXG4gICAgY2VsbHNFbXB0eVJvd3NDb2x1bW5zOiBcIklsIGZhdXQgYXUgbWluaW11bSB1bmUgbGlnbmUgb3UgdW5lIGNvbG9ubmVcIixcbiAgICBwcm9wZXJ0eUlzRW1wdHk6IFwiVmV1aWxsZXogZW50cmVyIHVuZSB2YWxldXIgcG91ciBsYSBwcm9wcmnDqXTDqVwiLFxuICAgIGxpc3RJc0VtcHR5OiBcIkFqb3V0ZXIgdW4gbm91dmVsIMOpbMOpbWVudFwiLFxuICAgIGV4cHJlc3Npb25Jc0VtcHR5OiBcIkwnZXhwcmVzc2lvbiBlc3QgdmlkZVwiLFxuICAgIHZhbHVlOiBcIlZhbGV1clwiLFxuICAgIHRleHQ6IFwiVGV4dGVcIixcbiAgICByb3dpZDogXCJJRCBMaWduZVwiLFxuICAgIGltYWdlTGluazogXCJVUkwgZGUgbCdpbWFnZVwiLFxuICAgIGNvbHVtbkVkaXQ6IFwiw4lkaXRlciBsYSBjb2xvbm5lOiB7MH1cIixcbiAgICBpdGVtRWRpdDogXCLDiWRpdGVyIGwnaXRlbTogezB9XCIsXG4gICAgdXJsOiBcIlVSTFwiLFxuICAgIHBhdGg6IFwiQ2hlbWluXCIsXG4gICAgdmFsdWVOYW1lOiBcIk5vbSBkZSBsYSB2YWxldXJcIixcbiAgICB0aXRsZU5hbWU6IFwiTm9tIGR1IHRpdHJlXCIsXG4gICAgdGl0bGVQbGFjZWhvbGRlcjogXCJUaXRyZSBkZSBsYSBwYWdlXCIsXG4gICAgZGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCJFbnRyZXIgdW5lIGRlc2NyaXB0aW9uXCIsXG4gICAgc3VydmV5VGl0bGVQbGFjZWhvbGRlcjogXCJTYWlzaXNzZXogbGUgdGl0cmUgZGUgbCZhcG9zO2VucXXDqnRlXCIsXG4gICAgcGFnZVRpdGxlUGxhY2Vob2xkZXI6IFwiU2Fpc2lzc2V6IGxlIHRpdHJlIGRlIGxhIHBhZ2VcIixcbiAgICBwYWdlRGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCJFbnRyZXIgdW5lIGRlc2NyaXB0aW9uIHBvdXIgbGEgcGFnZVwiLFxuICAgIHN1cnZleURlc2NyaXB0aW9uUGxhY2Vob2xkZXI6IFwiRW50cmVyIHVuZSBkZXNjcmlwdGlvbiBwb3VyIGwmYXBvcztlbnF1w6p0ZVwiLFxuICAgIGhhc090aGVyOiAnQ29udGllbnQgdW4gaXRlbSBcIkF1dHJlXCInLFxuICAgIG90aGVyVGV4dDogJ1RleHRlIGl0ZW0gXCJBdXRyZVwiJyxcbiAgICBoYXNOb25lOiAnQ29udGllbnQgdW4gaXRlbSBcIkF1Y3VuXCInLFxuICAgIG5vbmVUZXh0OiAnVGV4dGUgaXRlbSBcIkF1Y3VuXCInLFxuICAgIGhhc1NlbGVjdEFsbDogJ0NvbnRpZW50IHVuIGl0ZW0gXCJUb3V0IHPDqWxlY3Rpb25uZXJcIicsXG4gICAgc2VsZWN0QWxsVGV4dDogJ1RleHRlIGl0ZW0gXCJUb3V0IHPDqWxlY3Rpb25uZXJcIicsXG4gICAgY2hvaWNlc01pbjogXCJWYWxldXIgbWluaW11bSBwb3VyIGxlcyBpdGVtcyBnw6luw6lyw6lzIGF1dG9tYXRpcXVlbWVudFwiLFxuICAgIGNob2ljZXNNYXg6IFwiVmFsZXVyIG1heGltdW0gcG91ciBsZXMgaXRlbXMgZ8OpbsOpcsOpcyBhdXRvbWF0aXF1ZW1lbnRcIixcbiAgICBjaG9pY2VzU3RlcDogXCJEaWZmw6lyZW5jZSBlbnRyZSBpdGVtcyBnw6luw6lyw6lzIGF1dG9tYXRpcXVlbWVudFwiLFxuICAgIG5hbWU6IFwiTm9tXCIsXG4gICAgdGl0bGU6IFwiVGl0cmVcIixcbiAgICBjZWxsVHlwZTogXCJUeXBlIGRlIGNlbGx1bGVcIixcbiAgICBjb2xDb3VudDogXCJOb21icmUgZGUgY29sb25uZXNcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwiU8OpbGVjdGlvbm5lciBsJ29yZHJlIGRlcyBjaG9peFwiLFxuICAgIHZpc2libGU6IFwiRXN0IHZpc2libGUgP1wiLFxuICAgIGlzUmVxdWlyZWQ6IFwiRXN0IG9ibGlnYXRvaXJlID9cIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcIlLDqXBvbnNlIG9ibGlnYXRvaXJlIHBvdXIgdG91dGVzIGxlcyBsaWduZXNcIixcbiAgICByZXF1aXJlZEVycm9yVGV4dDogXCJNZXNzYWdlIGQnZXJyZXVyIGxvcnNxdWUgb2JsaWdhdG9pcmVcIixcbiAgICBzdGFydFdpdGhOZXdMaW5lOiBcIkNvbW1lbmNlciBhdmVjIHVuZSBub3V2ZWxsZSBsaWduZSA/XCIsXG4gICAgcm93czogXCJOb21icmUgZGUgbGlnbmVzXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwiUGxhY2Vob2xkZXIgKGluZGljZSBkYW5zIGxlIGNoYW1wKVwiLFxuICAgIHNob3dQcmV2aWV3OiBcIkwnYXBlcsOndSBkJ2ltYWdlIGVzdC1pbCBhZmZpY2jDqSA/XCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OlxuICAgICAgXCJTdG9ja2VyIGxlIGNvbnRlbnUgZHUgZmljaGllciBkYW5zIGxlIHLDqXN1bHRhdCBKU09OIHNvdXMgZm9ybWUgZGUgdGV4dGVcIixcbiAgICBtYXhTaXplOiBcIlRhaWxsZSBtYXhpbXVtIGR1IGZpY2hpZXIgZW4gb2N0ZXRzXCIsXG4gICAgaW1hZ2VIZWlnaHQ6IFwiSGF1dGV1ciBkZSBsJ2ltYWdlXCIsXG4gICAgaW1hZ2VXaWR0aDogXCJMYXJnZXVyIGRlIGwnaW1hZ2VcIixcbiAgICByb3dDb3VudDogXCJOb21icmUgZGUgbGlnbmVzXCIsXG4gICAgY29sdW1uTGF5b3V0OiBcIkludmVyc2VyIGxlcyBsaWduZXMgZXQgbGVzIGNvbG9ubmVzXCIsXG4gICAgYWRkUm93TG9jYXRpb246ICdFbXBsYWNlbWVudCBib3V0b24gXCJBam91dGVyIHVuZSBsaWduZVwiJyxcbiAgICBhZGRSb3dUZXh0OiAnVGV4dGUgYm91dG9uIFwiQWpvdXRlciB1bmUgbGlnbmVcIicsXG4gICAgcmVtb3ZlUm93VGV4dDogJ1RleHRlIGJvdXRvbiBcIlN1cHByaW1lciB1bmUgbGlnbmVcIicsXG4gICAgcmF0ZU1pbjogXCJOb3RlIG1pbmltdW1cIixcbiAgICByYXRlTWF4OiBcIk5vdGUgbWF4aW11bVwiLFxuICAgIHJhdGVTdGVwOiBcIkludGVydmFsbGUgZGVzIG5vdGVzXCIsXG4gICAgbWluUmF0ZURlc2NyaXB0aW9uOiBcIkRlc2NyaXB0aW9uIG5vdGUgbWluaW11bVwiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCJEZXNjcmlwdGlvbiBub3RlIG1heGltdW1cIixcbiAgICBpbnB1dFR5cGU6IFwiVHlwZSBkZSBjaGFtcFwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIlRleHRlIHBhciBkw6lmYXV0XCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIlZhbGV1ciBwYXIgZMOpZmF1dFwiLFxuICAgIGNlbGxzRGVmYXVsdFJvdzogXCJUZXh0ZSBkZSBjZWxsdWxlIHBhciBkw6lmYXV0XCIsXG4gICAgc3VydmV5RWRpdG9yVGl0bGU6IFwiw4lkaXRlciBsZXMgcHLDqWbDqXJlbmNlcyBkdSBxdWVzdGlvbm5haXJlXCIsXG4gICAgcUVkaXRvclRpdGxlOiBcIsOJZGl0ZXIgbGEgcXVlc3Rpb246IHswfVwiLFxuICAgIG1heExlbmd0aDogXCJMb25ndWV1ciBtYXhpbXVtXCIsXG5cbiAgICBidWlsZEV4cHJlc3Npb246IFwiQ29uc3RydWlyZVwiLFxuICAgIGVkaXRFeHByZXNzaW9uOiBcIkVkaXRlclwiLFxuICAgIGFuZDogXCJFdFwiLFxuICAgIG9yOiBcIk91XCIsXG4gICAgcmVtb3ZlOiBcIkVubGV2ZXJcIixcbiAgICBhZGRDb25kaXRpb246IFwiQWpvdXRlciB1bmUgY29uZGl0aW9uXCIsXG5cbiAgICAvL3N1cnZleVxuICAgIHNob3dUaXRsZTogXCJBZmZpY2hlci9jYWNoZXIgbGUgdGl0cmVcIixcbiAgICBsb2NhbGU6IFwiTGFuZ3VlIHBhciBkw6lmYXV0XCIsXG4gICAgc2ltdWxhdG9yOiBcIkNob2lzaXIgbCdhcHBhcmVpbFwiLFxuICAgIGxhbmRzY2FwZU9yaWVudGF0aW9uOiBcIlBheXNhZ2VcIixcbiAgICBtb2RlOiBcIk1vZGUgKMOpZGl0aW9uL2xlY3R1cmUgc2V1bGUpXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiRWZmYWNlciBsZXMgdmFsZXVycyBpbnZpc2libGVzXCIsXG4gICAgY29va2llTmFtZTpcbiAgICAgIFwiTm9tIGR1IGNvb2tpZSAocG91ciBlbXDDqmNoZXIgZGUgY29tcGzDqXRlciAyIGZvaXMgbGUgcXVlc3Rpb25uYWlyZSBsb2NhbGVtZW50KVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcIkVudm95ZXIgbGVzIHLDqXN1bHRhdHMgYXUgY2hhbmdlbWVudCBkZSBwYWdlXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6ICdTYXV2ZWdhcmRlciBsYSB2YWxldXIgXCJBdXRyZXNcIiBkYW5zIHVuIGNoYW1wIHPDqXBhcsOpJyxcbiAgICBzaG93UGFnZVRpdGxlczogXCJBZmZpY2hlciBsZXMgdGl0cmVzIGRlIHBhZ2VzXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcIkFmZmljaGVyIGxlcyBudW3DqXJvcyBkZSBwYWdlc1wiLFxuICAgIHBhZ2VQcmV2VGV4dDogXCJUZXh0ZSBib3V0b24gcGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiVGV4dGUgYm91dG9uIHBhZ2Ugc3VpdmFudGVcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiVGV4dGUgYm91dG9uIHRlcm1pbmVyXCIsXG4gICAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlRleHRlIGJvdXRvbiBjb21tZW5jZXJcIixcbiAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6XG4gICAgICBcIkFmZmljaGVyIGxlcyBib3V0b25zIGRlIG5hdmlnYXRpb24gKG5hdmlnYXRpb24gcGFyIGTDqWZhdXQpXCIsXG4gICAgc2hvd1ByZXZCdXR0b246XG4gICAgICBcIkFmZmljaGVyIGxlIGJvdXRvbiBwcsOpY8OpZGVudCAobCd1dGlsaXNhdGV1ciBwb3VycmEgcmV0b3VybmVyIHN1ciBsYSBwYWdlIHByw6ljw6lkZW50ZSlcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6XG4gICAgICBcIkxhIHByZW1pw6hyZSBwYWdlIGR1IHF1ZXN0aW9ubmFpcmUgZXN0IHVuZSBwYWdlIGRlIGTDqW1hcnJhZ2UuXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6ICdBZmZpY2hlciBsYSBwYWdlIFwidGVybWluw6lcIiDDoCBsYSBmaW4gKGNvbXBsZXRlZEh0bWwpJyxcbiAgICBnb05leHRQYWdlQXV0b21hdGljOlxuICAgICAgXCJBbGxlciDDoCBsYSBwYWdlIHN1aXZhbnRlIGF1dG9tYXRpcXVlbWVudCBwb3VyIHRvdXRlcyBsZXMgcXVlc3Rpb25zXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIkFmZmljaGVyIGxhIGJhcnJlIGRlIHByb2dyZXNzaW9uXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcIkVtcGxhY2VtZW50IGR1IHRpdHJlIGRlIGxhIHF1ZXN0aW9uXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcIkxhIHF1ZXN0aW9uIHJlcXVpZXJ0IHVuL2RlcyBzeW1ib2xlKHMpXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcIkluZGV4IGRlIGTDqXBhcnQgZGUgbGEgcXVlc3Rpb24gKDEsIDIgb3UgJ0EnLCAnYScpXCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCJBZmZpY2hlciBsZXMgbnVtw6lyb3MgZGUgcXVlc3Rpb25zXCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOlxuICAgICAgXCJHYWJhcml0IGR1IHRpdHJlIGRlIHF1ZXN0aW9uLCBwYXIgZMOpZmF1dCA6ICd7bm99LiB7cmVxdWlyZX0ge3RpdGxlfSdcIixcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwiRW1wbGFjZW1lbnQgZGUgbCdlcnJldXJcIixcbiAgICBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWM6XG4gICAgICBcIkZvY3VzIHN1ciBsYSBwcmVtacOocmUgcXVlc3Rpb24gYXUgY2hhbmdlbWVudCBkZSBwYWdlXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwiT3JkcmUgZGVzIMOpbMOpbWVudHMgc3VyIGxhIHBhZ2VcIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwiVGVtcHMgbWF4aW11bSBwb3VyIHRlcm1pbmVyIGxlIHF1ZXN0aW9ubmFpcmVcIixcbiAgICBtYXhUaW1lVG9GaW5pc2hQYWdlOiBcIlRlbXBzIG1heGltdW0gcG91ciB0ZXJtaW5lciB1bmUgcGFnZVwiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcIkFmZmljaGVyIGxlIHBhbm5lYXUgY2hyb25vbcOodHJlXCIsXG4gICAgc2hvd1RpbWVyUGFuZWxNb2RlOiBcIk1vZGUgZCdhZmZpY2hhZ2UgZHUgcGFubmVhdSBjaHJvbm9tw6h0cmVcIixcbiAgICByZW5kZXJNb2RlOiBcIk1vZGUgZGUgcmVuZHVcIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIkF1dG9yaXNlciBsJ2Fqb3V0IGR1IHBhbm5lYXVcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIkF1dG9yaXNlciBsYSBzdXBwcmVzc2lvbiBkdSBwYW5uZWF1XCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcIkFqb3V0ZXIgdW4gcGFubmVhdSB0ZXh0ZVwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCJTdXBwcmltZXIgbGUgcGFubmVhdSB0ZXh0ZVwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJBZmZpY2hlciB0b3VzIGxlcyDDqWzDqW1lbnRzIHN1ciB1bmUgc2V1bGUgcGFnZVwiLFxuICAgIGV4cHJlc3Npb246IFwiRXhwcmVzc2lvblwiLFxuICAgIG1pblZhbHVlOiBcIlZhbGV1ciBtaW5pbXVtXCIsXG4gICAgbWF4VmFsdWU6IFwiVmFsZXVyIG1heGltdW1cIixcbiAgICBtaW5MZW5ndGg6IFwiTG9uZ3VldXIgbWluaW11bVwiLFxuICAgIGFsbG93RGlnaXRzOiBcIlBlcm1ldHRyZSBjaGlmZnJlc1wiLFxuICAgIG1pbkNvdW50OiBcIk5vbWJyZSBtaW5pbXVtXCIsXG4gICAgbWF4Q291bnQ6IFwiTm9tYnJlIG1heGltdW1cIixcbiAgICByZWdleDogXCJFeHByZXNzaW9uIHLDqWd1bGnDqHJlXCIsXG5cbiAgICB0b3RhbFRleHQ6IFwiVGV4dGUgcG91ciBsZSB0b3RhbFwiLFxuICAgIHRvdGFsVHlwZTogXCJUeXBlIGRlIHRvdGFsXCIsXG4gICAgdG90YWxFeHByZXNzaW9uOiBcIkV4cHJlc3Npb24gZGUgY2FsY3VsXCIsXG4gICAgdG90YWxEaXNwbGF5U3R5bGU6IFwiRm9ybWF0IGQnYWZmaWNoYWdlXCIsXG4gICAgdG90YWxDdXJyZW5jeTogXCJNb25uYWllXCIsXG4gICAgdG90YWxGb3JtYXQ6IFwiRm9ybWF0IGR1IHRvdGFsXCIsXG5cbiAgICBsb2dvUG9zaXRpb246IFwiUG9zaXRpb24gZHUgbG9nb1wiLFxuICAgIGFkZExvZ286IFwiQWpvdXRlciB1biBsb2dvLi4uXCIsXG4gICAgY2hhbmdlTG9nbzogXCJDaGFuZ2VyIGxlIGxvZ28uLi5cIixcbiAgICBsb2dvUG9zaXRpb25zOiB7XG4gICAgICBub25lOiBcIlJldGlyZXIgbGUgbG9nb1wiLFxuICAgICAgbGVmdDogXCJHYXVjaGVcIixcbiAgICAgIHJpZ2h0OiBcIkRyb2l0ZVwiLFxuICAgICAgdG9wOiBcIkF1IGRlc3N1c1wiLFxuICAgICAgYm90dG9tOiBcIkVuIGRlc3NvdXNcIixcbiAgICB9LFxuXG4gICAgdGFiczoge1xuICAgICAgZ2VuZXJhbDogXCJHw6luw6lyYWxcIixcbiAgICAgIGZpbGVPcHRpb25zOiBcIk9wdGlvbnNcIixcbiAgICAgIGh0bWw6IFwiw4lkaXRldXIgSFRNTFwiLFxuICAgICAgY29sdW1uczogXCJDb2xvbm5lc1wiLFxuICAgICAgcm93czogXCJMaWduZXNcIixcbiAgICAgIGNob2ljZXM6IFwiQ2hvaXhcIixcbiAgICAgIHZpc2libGVJZjogXCJWaXNpYmxlIHNpXCIsXG4gICAgICBlbmFibGVJZjogXCJBY3RpZiBzaVwiLFxuICAgICAgcmVxdWlyZWRJZjogXCJPYmxpZ2F0b2lyZSBzaVwiLFxuICAgICAgcmF0ZVZhbHVlczogXCJCYXLDqG1lXCIsXG4gICAgICBjaG9pY2VzQnlVcmw6IFwiQ2hvaXggZGVwdWlzIEFQSSB3ZWJcIixcbiAgICAgIG1hdHJpeENob2ljZXM6IFwiQ2hvaXggcGFyIGTDqWZhdXRcIixcbiAgICAgIG11bHRpcGxlVGV4dEl0ZW1zOiBcIkNoYW1wcyB0ZXh0ZSBtdWx0aXBsZXNcIixcbiAgICAgIHZhbGlkYXRvcnM6IFwiVmFsaWRhdGV1cnNcIixcbiAgICAgIG5hdmlnYXRpb246IFwiTmF2aWdhdGlvblwiLFxuICAgICAgcXVlc3Rpb246IFwiUXVlc3Rpb25cIixcbiAgICAgIGNvbXBsZXRlZEh0bWw6IFwiSFRNTCBkZSBmaW5cIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbjogXCJIdG1sIGRlIGZpbiAocGFnZSAndGVybWluw6knKSBzdXIgY29uZGl0aW9uXCIsXG4gICAgICBsb2FkaW5nSHRtbDogXCJIVE1MIGRlIGNoYXJnZW1lbnRcIixcbiAgICAgIHRpbWVyOiBcIkNocm9ub23DqHRyZS9RdWl6XCIsXG4gICAgICBjYWxjdWxhdGVkVmFsdWVzOiBcIlZhbGV1cnMgY2FsY3Vsw6llc1wiLFxuICAgICAgdHJpZ2dlcnM6IFwiRMOpY2xlbmNoZXVyc1wiLFxuICAgICAgdGVtcGxhdGVUaXRsZTogXCJUaXRyZSBkZSBnYWJhcml0XCIsXG4gICAgICB0b3RhbHM6IFwiVG90YXV4XCIsXG4gICAgICBsb2dpYzogXCJDb25kaXRpb25zXCIsXG4gICAgICBsYXlvdXQ6IFwiRGlzcG9zaXRpb25cIixcbiAgICAgIGRhdGE6IFwiRG9ubsOpZXNcIixcbiAgICAgIHZhbGlkYXRpb246IFwiVmFsaWRhdGV1cnNcIixcbiAgICAgIGNlbGxzOiBcIkNlbGx1bGVzXCIsXG4gICAgICBsb2dvOiBcIkxvZ28gZGFucyBsZSB0aXRyZSBkZSBsJ2VucXXDqnRlXCIsXG4gICAgICBvdGhlcnM6IFwiQXV0cmVzXCIsXG4gICAgfSxcbiAgICBlZGl0UHJvcGVydHk6ICfDiWRpdGVyIGxhIHByb3ByacOpdMOpIFwiezB9XCInLFxuICAgIGl0ZW1zOiBcIlsgw4lsw6ltZW50czogezB9IF1cIixcbiAgICBlbnRlck5ld1ZhbHVlOiBcIlZldWlsbGV6IHNhaXNpciBsYSB2YWxldXIuXCIsXG4gICAgbm9xdWVzdGlvbnM6IFwiSWwgbid5IGEgYXVjdW5lIHF1ZXN0aW9uIGRhbnMgbGUgcXVlc3Rpb25uYWlyZS5cIixcbiAgICBjcmVhdGV0cmlnZ2VyOiBcIlZldWlsbGV6IGNyw6llciB1biBkw6ljbGVuY2hldXJcIixcbiAgICB0cmlnZ2VyT246IFwiUXVhbmQgXCIsXG4gICAgdHJpZ2dlck1ha2VQYWdlc1Zpc2libGU6IFwiUmVuZHJlIGxlcyBwYWdlcyB2aXNpYmxlcyA6XCIsXG4gICAgdHJpZ2dlck1ha2VRdWVzdGlvbnNWaXNpYmxlOiBcIlJlbmRyZSBsZXMgcXVlc3Rpb25zIHZpc2libGVzIDpcIixcbiAgICB0cmlnZ2VyQ29tcGxldGVUZXh0OiBcIlRlcm1pbmVyIGxlIHF1ZXN0aW9ubmFpcmUgZW4gY2FzIGRlIHN1Y2PDqHMuXCIsXG4gICAgdHJpZ2dlck5vdFNldDogXCJMZSBkw6ljbGVuY2hldXIgbidlc3QgcGFzIGTDqWZpbmlcIixcbiAgICB0cmlnZ2VyUnVuSWY6IFwiRXjDqWN1dGVyIHNpXCIsXG4gICAgdHJpZ2dlclNldFRvTmFtZTogXCJDaGFuZ2VyIGxhIHZhbGV1ciBkZSA6IFwiLFxuICAgIHRyaWdnZXJGcm9tTmFtZTogXCJDb3BpZXIgbGEgdmFsZXVyIGRlIDogXCIsXG4gICAgdHJpZ2dlclJ1bkV4cHJlc3Npb246IFwiRXjDqWN1dGVyIGNldHRlIGV4cHJlc3Npb24gOlwiLFxuICAgIHRyaWdnZXJTZXRWYWx1ZTogXCLDoCA6IFwiLFxuICAgIHRyaWdnZXJHb3RvTmFtZTogXCJBbGxlciDDoCBsYSBxdWVzdGlvbiA6XCIsXG4gICAgdHJpZ2dlcklzVmFyaWFibGU6XG4gICAgICBcIk5lIHBsYWNleiBwYXMgbGEgdmFyaWFibGUgZGFucyBsZSByw6lzdWx0YXQgZHUgcXVlc3Rpb25uYWlyZS5cIixcbiAgICB0cmlnZ2VyUnVuRXhwcmVzc2lvbkVtcHR5OiBcIlZldWlsbGV6IGVudHJlciB1bmUgZXhwcmVzc2lvbiB2YWxpZGVcIixcbiAgfSxcbiAgLy9Qcm9wZXJ0eSB2YWx1ZXNcbiAgcHY6IHtcbiAgICB0cnVlOiBcInZyYWlcIixcbiAgICBmYWxzZTogXCJmYXV4XCIsXG4gICAgaW5oZXJpdDogXCJow6lyaXTDqVwiLFxuICAgIHNob3c6IFwiYWZmaWNoZXJcIixcbiAgICBoaWRlOiBcIm1hc3F1ZXJcIixcbiAgICBkZWZhdWx0OiBcInBhciBkw6lmYXV0XCIsXG4gICAgaW5pdGlhbDogXCJpbml0aWFsXCIsXG4gICAgcmFuZG9tOiBcImFsw6lhdG9pcmVcIixcbiAgICBjb2xsYXBzZWQ6IFwicmVwbGnDqVwiLFxuICAgIGV4cGFuZGVkOiBcImTDqXBsb3nDqVwiLFxuICAgIG5vbmU6IFwiYXVjdW5cIixcbiAgICBhc2M6IFwiYXNjZW5kYW50XCIsXG4gICAgZGVzYzogXCJkZXNjZW5kYW50XCIsXG4gICAgaW5kZXRlcm1pbmF0ZTogXCJpbmRldGVybWluw6lcIixcbiAgICBkZWNpbWFsOiBcImTDqWNpbWFsXCIsXG4gICAgY3VycmVuY3k6IFwibW9ubmFpZVwiLFxuICAgIHBlcmNlbnQ6IFwicG91cmNlbnRhZ2VcIixcbiAgICBmaXJzdEV4cGFuZGVkOiBcImTDqXBsb3nDqSBlbiBwcmVtaWVyXCIsXG4gICAgb2ZmOiBcImTDqXNhY3RpdsOpXCIsXG4gICAgb25QYW5lbDogXCJwYW5uZWF1XCIsXG4gICAgb25TdXJ2ZXk6IFwicXVlc3Rpb25uYWlyZVwiLFxuICAgIGxpc3Q6IFwibGlzdGVcIixcbiAgICBwcm9ncmVzc1RvcDogXCJQcm9ncmVzc2lvbiBlbiBoYXV0XCIsXG4gICAgcHJvZ3Jlc3NCb3R0b206IFwiUHJvZ3Jlc3Npb24gZW4gYmFzXCIsXG4gICAgcHJvZ3Jlc3NUb3BCb3R0b206IFwiUHJvZ3Jlc3Npb24gZW4gaGF1dCBldCBlbiBiYXNcIixcbiAgICB0b3A6IFwiaGF1dFwiLFxuICAgIGJvdHRvbTogXCJiYXNcIixcbiAgICB0b3BCb3R0b206IFwiaGF1dCBldCBiYXNcIixcbiAgICBib3RoOiBcImxlcyBkZXV4XCIsXG4gICAgbGVmdDogXCJnYXVjaGVcIixcbiAgICBjb2xvcjogXCJjb3VsZXVyXCIsXG4gICAgZGF0ZTogXCJkYXRlXCIsXG4gICAgZGF0ZXRpbWU6IFwiaGV1cmVcIixcbiAgICBcImRhdGV0aW1lLWxvY2FsXCI6IFwiaGV1cmUgbG9jYWxlXCIsXG4gICAgZW1haWw6IFwiZW1haWxcIixcbiAgICBtb250aDogXCJtb2lzXCIsXG4gICAgbnVtYmVyOiBcIm5vbWJyZVwiLFxuICAgIHBhc3N3b3JkOiBcIm1vdCBkZSBwYXNzZVwiLFxuICAgIHJhbmdlOiBcImphdWdlXCIsXG4gICAgdGVsOiBcInTDqWwuXCIsXG4gICAgdGV4dDogXCJ0ZXh0ZVwiLFxuICAgIHRpbWU6IFwiaGV1cmVcIixcbiAgICB1cmw6IFwiVVJMXCIsXG4gICAgd2VlazogXCJzZW1haW5lXCIsXG4gICAgaGlkZGVuOiBcIm1hc3F1w6lcIixcbiAgICBvbjogXCJhY3RpdsOpXCIsXG4gICAgb25QYWdlOiBcInBhZ2VcIixcbiAgICBlZGl0OiBcIsOpZGl0ZXJcIixcbiAgICBkaXNwbGF5OiBcImFmZmljaGFnZVwiLFxuICAgIG9uQ29tcGxldGU6IFwiUXVhbmQgdGVybWluw6lcIixcbiAgICBvbkhpZGRlbjogXCJRdWFuZCBjYWNow6lcIixcbiAgICBhbGw6IFwidG91c1wiLFxuICAgIHBhZ2U6IFwicGFnZVwiLFxuICAgIHN1cnZleTogXCJxdWVzdGlvbm5haXJlXCIsXG4gIH0sXG4gIC8vT3BlcmF0b3JzXG4gIG9wOiB7XG4gICAgZW1wdHk6IFwiZXN0IHZpZGVcIixcbiAgICBub3RlbXB0eTogXCJuJ2VzdCBwYXMgdmlkZVwiLFxuICAgIGVxdWFsOiBcIsOpZ2FsXCIsXG4gICAgbm90ZXF1YWw6IFwibidlc3QgcGFzIMOpZ2FsXCIsXG4gICAgY29udGFpbnM6IFwiY29udGllbnRcIixcbiAgICBub3Rjb250YWluczogXCJuZSBjb250aWVudCBwYXNcIixcbiAgICBhbnlvZjogXCJuJ2ltcG9ydGUgcXVlbCBkZVwiLFxuICAgIGFsbG9mOiBcInRvdXMgcGFybWlcIixcbiAgICBncmVhdGVyOiBcInN1cMOpcmlldXJcIixcbiAgICBsZXNzOiBcImluZsOpcmlldXJcIixcbiAgICBncmVhdGVyb3JlcXVhbDogXCJzdXDDqXJpZXVyIG91IMOpZ2FsXCIsXG4gICAgbGVzc29yZXF1YWw6IFwiaW5mw6lyaWV1ciBvdSDDqWdhbFwiLFxuICB9LFxuICAvL0VtYmVkIHdpbmRvd1xuICBldzoge1xuICAgIGFuZ3VsYXI6IFwiVXRpbGlzZXIgbGEgdmVyc2lvbiBBbmd1bGFyXCIsXG4gICAganF1ZXJ5OiBcIlV0aWxpc2VyIGxhIHZlcnNpb24galF1ZXJ5XCIsXG4gICAga25vY2tvdXQ6IFwiVXRpbGlzZXIgbGEgdmVyc2lvbiBLbm9ja291dFwiLFxuICAgIHJlYWN0OiBcIlV0aWxpc2VyIGxhIHZlcnNpb24gUmVhY3RcIixcbiAgICB2dWU6IFwiVXRpbGlzZXIgbGEgdmVyc2lvbiBWdWVcIixcbiAgICBib290c3RyYXA6IFwiUG91ciBsZSBmcmFtZXdvcmsgQm9vdHN0cmFwXCIsXG4gICAgc3RhbmRhcmQ6IFwiU2FucyBCb290c3RyYXBcIixcbiAgICBzaG93T25QYWdlOiBcIkFmZmljaGVyIGxlIHF1ZXN0aW9ubmFpcmUgZGFucyB1bmUgcGFnZVwiLFxuICAgIHNob3dJbldpbmRvdzogXCJBZmZpY2hlciBsZSBxdWVzdGlvbm5haXJlIGRhbnMgdW5lIGZlbsOqdHJlXCIsXG4gICAgbG9hZEZyb21TZXJ2ZXI6IFwiQ2hhcmdlciBsZSBKU09OIGR1IHF1ZXN0aW9ubmFpcmUgZGVwdWlzIHVuIHNlcnZldXJcIixcbiAgICB0aXRsZVNjcmlwdDogXCJTY3JpcHRzIGV0IHN0eWxlc1wiLFxuICAgIHRpdGxlSHRtbDogXCJIVE1MXCIsXG4gICAgdGl0bGVKYXZhU2NyaXB0OiBcIkphdmFTY3JpcHRcIixcbiAgfSxcbiAgLy9UZXN0IFN1cnZleVxuICB0czoge1xuICAgIHNlbGVjdFBhZ2U6IFwiU8OpbGVjdGlvbm5lciB1bmUgcGFnZSBwb3VyIGxhIHRlc3RlclwiLFxuICAgIHNob3dJbnZpc2libGVFbGVtZW50czogXCJBZmZpY2hlciBsZXMgw6lsw6ltZW50cyBpbnZpc2libGVzXCIsXG4gIH0sXG4gIC8vVmFsaWRhdG9yc1xuICB2YWxpZGF0b3JzOiB7XG4gICAgYW5zd2VyY291bnR2YWxpZGF0b3I6IFwidG90YWwgZGUgcsOpcG9uc2VzXCIsXG4gICAgZW1haWx2YWxpZGF0b3I6IFwiZS1tYWlsXCIsXG4gICAgbnVtZXJpY3ZhbGlkYXRvcjogXCJudW3DqXJpcXVlXCIsXG4gICAgcmVnZXh2YWxpZGF0b3I6IFwicmVnZXhcIixcbiAgICB0ZXh0dmFsaWRhdG9yOiBcInRleHRlXCIsXG4gIH0sXG4gIC8vVHJpZ2dlcnNcbiAgdHJpZ2dlcnM6IHtcbiAgICBjb21wbGV0ZXRyaWdnZXI6IFwidGVybWluZXIgbGUgcXVlc3Rpb25uYWlyZVwiLFxuICAgIHNldHZhbHVldHJpZ2dlcjogXCJkw6lmaW5pciBsYSB2YWxldXJcIixcbiAgICBjb3B5dmFsdWV0cmlnZ2VyOiBcImNvcGllciBsYSB2YWxldXJcIixcbiAgICBza2lwdHJpZ2dlcjogXCJzYXV0ZXIgw6AgbGEgcXVlc3Rpb25cIixcbiAgICBydW5leHByZXNzaW9udHJpZ2dlcjogXCJleMOpY3V0ZXIgZXhwcmVzc2lvblwiLFxuICAgIHZpc2libGV0cmlnZ2VyOiBcIm1vZGlmaWVyIGxhIHZpc2liaWxpdMOpXCIsXG4gIH0sXG4gIC8vUHJvcGVydGllc1xuICBwOiB7XG4gICAgbmFtZTogXCJOb21cIixcbiAgICB0aXRsZToge1xuICAgICAgbmFtZTogXCJUaXRyZVwiLFxuICAgICAgdGl0bGU6ICdMYWlzc2V6IHZpZGUsIHNpIG3Dqm1lIHRleHRlIHF1ZSBsZSBcIk5vbVwiJyxcbiAgICB9LFxuICAgIG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eTogXCJWaXNpYmlsaXTDqSBkZXMgYm91dG9ucyBkZSBuYXZpZ2F0aW9uXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwiT3JkcmUgZGVzIHF1ZXN0aW9uc1wiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJUZW1wcyBtYXhpbXVtIHBvdXIgdGVybWluZXJcIixcbiAgICB2aXNpYmxlOiBcIlZpc2libGVcIixcbiAgICB2aXNpYmxlSWY6IFwiVmlzaWJsZSBzaSBcIixcbiAgICBxdWVzdGlvblRpdGxlTG9jYXRpb246IFwiRW1wbGFjZW1lbnQgdGl0cmUgcXVlc3Rpb25cIixcbiAgICBkZXNjcmlwdGlvbjogXCJEZXNjcmlwdGlvblwiLFxuICAgIHN0YXRlOiBcIsOJdGF0XCIsXG4gICAgaXNSZXF1aXJlZDogXCJPYmxpZ2F0b2lyZSA/XCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwiTWVzc2FnZSBkJ2VycmV1ciB0ZXh0IG9ibGlnYXRvaXJlXCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCJDb21tZW5jZXIgYXZlYyB1bmUgbm91dmVsbGUgbGlnbmVcIixcbiAgICBpbm5lckluZGVudDogXCJJbmRlbnRhdGlvblwiLFxuICAgIHBhZ2U6IFwicGFnZVwiLFxuICAgIHdpZHRoOiBcImxhcmdldXJcIixcbiAgICBjb21tZW50VGV4dDogXCJEZXNjcmlwdGlvbiBjaGFtcCBjb21tZW50YWlyZVwiLFxuICAgIHZhbHVlTmFtZTogXCJOb20gZGUgbGEgdmFsZXVyXCIsXG4gICAgZW5hYmxlSWY6IFwiQWN0aXZlciBzaVwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJWYWxldXIgcGFyIGTDqWZhdXRcIixcbiAgICBjb3JyZWN0QW5zd2VyOiBcIkJvbm5lIHLDqXBvbnNlXCIsXG4gICAgcmVhZE9ubHk6IFwiTGVjdHVyZSBzZXVsZVwiLFxuICAgIHZhbGlkYXRvcnM6IFwiVmFsaWRhdGV1cnNcIixcbiAgICB0aXRsZUxvY2F0aW9uOiBcIkVtcGxhY2VtZW50IGR1IHRpdHJlXCIsXG4gICAgaGFzQ29tbWVudDogXCJDaGFtcCBjb21tZW50YWlyZSA/XCIsXG4gICAgaGFzT3RoZXI6IFwiQ2hvaXggYXV0cmUgP1wiLFxuICAgIGNob2ljZXM6IFwiQ2hvaXhcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwiT3JkcmUgZGVzIGNob2l4XCIsXG4gICAgY2hvaWNlc0J5VXJsOiBcIkNob2l4IHBhciBBUElcIixcbiAgICBvdGhlclRleHQ6IFwiQXV0cmUgdGV4dGVcIixcbiAgICBvdGhlckVycm9yVGV4dDogJ1RleHRlIGRcXCdlcnJldXIgY2hhbXAgXCJBdXRyZVwiJyxcbiAgICBzdG9yZU90aGVyc0FzQ29tbWVudDogXCJTYXV2ZWdhcmRlciBjaG9peCBhdXRyZSBjb21tZSBjb21tZW50YWlyZVwiLFxuICAgIGxhYmVsOiBcIkludGl0dWzDqVwiLFxuICAgIHNob3dUaXRsZTogXCJBZmZpY2hlciBsZSB0aXRyZVwiLFxuICAgIHZhbHVlVHJ1ZTogXCJWYWxldXIgdnJhaVwiLFxuICAgIHZhbHVlRmFsc2U6IFwiVmFsZXVyIGZhdXhcIixcbiAgICBjb2xzOiBcIkNvbG9ubmVzXCIsXG4gICAgcm93czogXCJOb21icmUgZGUgbGlnbmVzXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwiUGxhY2VIb2xkZXIgKGluZGljZSBkYW5zIGxlIGNoYW1wKVwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIlRleHRlIHBhciBkw6lmYXV0XCIsXG4gICAgZXhwcmVzc2lvbjogXCJFeHByZXNzaW9uXCIsXG4gICAgZm9ybWF0OiBcIkZvcm1hdFwiLFxuICAgIGRpc3BsYXlTdHlsZTogXCJTdHlsZSBkJ2FmZmljaGFnZVwiLFxuICAgIGN1cnJlbmN5OiBcIk1vbm5haWVcIixcbiAgICB1c2VHcm91cGluZzogXCJVdGlsaXNlciBsZXMgZ3JvdXBlc1wiLFxuICAgIHNob3dQcmV2aWV3OiBcIlZvaXIgbGEgcHLDqXZpc3VhbGlzYXRpb25cIixcbiAgICBhbGxvd011bHRpcGxlOiBcIkF1dG9yaXNlciBtdWx0aXBsZXNcIixcbiAgICBpbWFnZUhlaWdodDogXCJIYXV0ZXVyIGRlIGwnaW1hZ2VcIixcbiAgICBpbWFnZVdpZHRoOiBcIkxhcmdldXIgZGUgbCdpbWFnZVwiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCJTdG9ja2VyIGxlcyBkb25uw6llcyBjb21tZSBkdSB0ZXh0ZVwiLFxuICAgIG1heFNpemU6IFwiVGFpbGxlIG1heGltdW1cIixcbiAgICBodG1sOiBcIkhUTUxcIixcbiAgICBjb2x1bW5zOiBcIkNvbG9ubmVzXCIsXG4gICAgY2VsbHM6IFwiQ2VsbHVsZXNcIixcbiAgICBob3Jpem9udGFsU2Nyb2xsOiBcIlNjcm9sbCBob3Jpem9udGFsXCIsXG4gICAgY2VsbFR5cGU6IFwiVHlwZSBkZSBjZWxsdWxlXCIsXG4gICAgY29sdW1uQ29sQ291bnQ6IFwiTm9tYnJlIGRlIGNvbG9ubmVzXCIsXG4gICAgY29sdW1uTWluV2lkdGg6IFwiTGFyZ2V1ciBtaW5pbWFsZSBkZXMgY29sb25uZXNcIixcbiAgICByb3dDb3VudDogXCJOb21icmUgZGUgbGlnbmVzXCIsXG4gICAgbWluUm93Q291bnQ6IFwiTm9tYnJlIGRlIGxpZ25lcyBtaW5pbXVtXCIsXG4gICAgbWF4Um93Q291bnQ6IFwiTm9tYnJlIGRlIGxpZ25lcyBtYXhpbXVtXCIsXG4gICAga2V5TmFtZTogXCJOb20gZGUgbGEgY2zDqVwiLFxuICAgIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRXJyZXVyIGRlIGNsw6lzIG11bHRpcGxlc1wiLFxuICAgIGNvbmZpcm1EZWxldGU6IFwiQ29uZmlybWF0aW9uIGRlIHN1cHByZXNzaW9uXCIsXG4gICAgY29uZmlybURlbGV0ZVRleHQ6IFwiVGV4dGUgZGUgY29uZmlybWF0aW9uIGRlIHN1cHByZXNzaW9uXCIsXG4gICAgYWRkUm93VGV4dDogXCJCb3V0b24gYWpvdXRlciB1bmUgbGlnbmVcIixcbiAgICByZW1vdmVSb3dUZXh0OiBcIkJvdXRvbiBzdXBwcmltZXIgdW5lIGxpZ25lXCIsXG4gICAgaXRlbXM6IFwiSXRlbXNcIixcbiAgICBpdGVtU2l6ZTogXCJOb21icmUgbWF4aW11bSBkZSBjYXJhY3TDqHJlc1wiLFxuICAgIGNvbENvdW50OiBcIk5vbWJyZSBkZSBjb2xvbm5lc1wiLFxuICAgIHRlbXBsYXRlVGl0bGU6IFwiVGl0cmUgZGUgZ2FiYXJpdFwiLFxuICAgIHRlbXBsYXRlRGVzY3JpcHRpb246IFwiRGVzY3JpcHRpb24gZHUgZ2FiYXJpdFwiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwiQXV0b3Jpc2VyIGwnYWpvdXQgZGUgcGFubmVhdVwiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwiQXV0b3Jpc2VyIGxhIHN1cHByZXNzaW9uIGRlIHBhbm5lYXVcIixcbiAgICBwYW5lbENvdW50OiBcIk5vbWJyZSBkZSBwYW5uZWF1eFwiLFxuICAgIG1pblBhbmVsQ291bnQ6IFwiTm9tYnJlIG1pbmltdW0gZGUgcGFubmVhdXhcIixcbiAgICBtYXhQYW5lbENvdW50OiBcIk5vbWJyZSBtYXhpbXVtIGRlIHBhbm5lYXV4XCIsXG4gICAgcGFuZWxzU3RhdGU6IFwiw4l0YXQgZGVzIHBhbm5lYXV4XCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcIlRleHRlIGQnYWpvdXQgZGVzIHBhbm5lYXV4XCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcIlRleHRlIGRlIHN1cHByZXNzaW9uIGRlcyBwYW5uZWF1eFwiLFxuICAgIHBhbmVsUHJldlRleHQ6IFwiVGV4dGUgcGFubmVhdSBwcsOpY8OpZGVudFwiLFxuICAgIHBhbmVsTmV4dFRleHQ6IFwiVGV4dGUgcGFubmVhdSBzdWl2YW50XCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCJOdW3DqXJvdGF0aW9uIGRlcyBxdWVzdGlvbnNcIixcbiAgICBzaG93UmFuZ2VJblByb2dyZXNzOiBcIkFmZmljaGVyIGxhIHByb2dyZXNzaW9uXCIsXG4gICAgcmVuZGVyTW9kZTogXCJNb2RlIGRlIHJlbmR1XCIsXG4gICAgdGVtcGxhdGVUaXRsZUxvY2F0aW9uOiBcIkVtcGxhY2VtZW50IGR1IHRpdHJlIGRlIGdhYmFyaXRcIixcbiAgICByYXRlVmFsdWVzOiBcIkJhcsOobWVcIixcbiAgICByYXRlTWluOiBcIlZhbGV1ciBtaW5pbXVtXCIsXG4gICAgcmF0ZU1heDogXCJWYWxldXIgbWF4aW11bVwiLFxuICAgIHJhdGVTdGVwOiBcIlBhc1wiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCJEZXNjcmlwdGlvbiBub3RlIG1pbmltdW1cIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwiRGVzY3JpcHRpb24gbm90ZSBtYXhpbXVtXCIsXG4gICAgaW5wdXRUeXBlOiBcIlR5cGUgZGUgY2hhbXBcIixcbiAgICBzaXplOiBcIk5vbWJyZSBtYXhpbXVtIGRlIGNhcmFjdMOocmVzXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcIkZvY3VzIGF1dG9tYXRpcXVlIHN1ciBsYSBwcmVtacOocmUgcXVlc3Rpb25cIixcbiAgICBjb21wbGV0ZWRIdG1sOiBcIkhUTUwgcXVlc3Rpb25uYWlyZSBmaW5hbGlzw6lcIixcbiAgICBjb21wbGV0ZWRCZWZvcmVIdG1sOiBcIkhUTUwgYXZhbnQgY29tcGzDqXRpb24gZHUgcXVlc3Rpb25uYWlyZVwiLFxuICAgIGxvYWRpbmdIdG1sOiBcIkhUTUwgZGUgY2hhcmdlbWVudFwiLFxuICAgIHRyaWdnZXJzOiBcIkTDqWNsZW5jaGV1cnNcIixcbiAgICBjb29raWVOYW1lOiBcIk5vbSBkdSBjb29raWVcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCJFbnZveWVyIGxlcyByw6lzdWx0YXRzIGF1IGNoYW5nZW1lbnQgZGUgcGFnZVwiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczogXCJCb3V0b25zIGRlIG5hdmlnYXRpb25cIixcbiAgICBzaG93UHJldkJ1dHRvbjogXCJBZmZpY2hlciBsZSBib3V0b24gcHLDqWPDqWRlbnRcIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJUaXRyZSBkZXMgcGFnZXNcIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCJWb2lyIGxhIHBhZ2UgZm9ybXVsYWlyZSBjb21wbMOpdMOpID9cIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwiTnVtw6lyb3RhdGlvbiBkZXMgcGFnZXNcIixcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwiRW1wbGFjZW1lbnQgZGVzIGVycmV1cnNcIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwiQmFycmUgZGUgcHJvZ3Jlc3Npb25cIixcbiAgICBtb2RlOiBcIk1vZGUgZCdhZmZpY2hhZ2VcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOiBcIkFsbGVyIMOgIGxhIHBhZ2Ugc3VpdmFudGUgYXV0b21hdGlxdWVtZW50XCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiQ2FjaGVyIGxlcyB2YWxldXJzIGludmlzaWJsZXNcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwiVGV4dGUgZGUgZMOpbWFycmFnZSBkdSBxdWVzdGlvbm5haXJlXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIkJvdXRvbiBwYWdlIHByw6ljw6lkZW50ZVwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJCb3V0b24gcGFnZSBzdWl2YW50ZVwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJUZXh0ZSBxdWVzdGlvbm5haXJlIGZpbmFsaXPDqVwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJUZXh0ZSBwb3VyIGxlcyBjaGFtcHMgb2JsaWdhdG9pcmVzXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcIkluZGV4IGRlIG51bcOpcm90YXRpb24gZGVzIHF1ZXN0aW9uc1wiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTogXCJUZW1wbGF0ZSBkJ2FmZmljaGFnZSBkZXMgcXVlc3Rpb25zXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcIkNvbW1lbmNlIMOgIGxhIHByZW1pw6hyZSBwYWdlXCIsXG4gICAgaXNTaW5nbGVQYWdlOiBcIkFmZmljaMOpIHN1ciB1bmUgcGFnZVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiVGVtcHMgbWF4aW11bSBwb3VyIGZpbmlyIGxhIHBhZ2VcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCJBZmZpY2hlciBsZSBwYW5uZWF1IGNocm9ub23DqHRyZVwiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCJNb2RlIGQnYWZmaWNoYWdlIGR1IHBhbm5lYXUgY2hyb25vbcOodHJlXCIsXG4gICAgaW5kZW50OiBcIkluZGVudGF0aW9uXCIsXG4gICAgaXNBbGxSb3dSZXF1aXJlZDogXCJUb3V0ZXMgbGVzIGxpZ25lcyBzb250LWVsbGUgb2JsaWdhdG9pcmVzID9cIixcbiAgICBsb2NhbGU6IFwiTGFuZ3VlXCIsXG4gIH0sXG59O1xuXG5lZGl0b3JMb2NhbGl6YXRpb24ubG9jYWxlc1tcImZyXCJdID0gZnJlbmNoVHJhbnNsYXRpb247XG4iLCJpbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5cbnZhciBnZXJtYW5UcmFuc2xhdGlvbiA9IHtcbiAgLy9zdXJ2ZXkgdGVtcGxhdGVzXG4gIHN1cnZleToge1xuICAgIGVkaXQ6IFwiQmVhcmJlaXRlblwiLFxuICAgIGV4dGVybmFsSGVscExpbms6IFwiU2NoYXVlbiBTaWUgc2ljaCBhbiwgd2llIFNpZSBVbWZyYWdlbiBlcnN0ZWxsZW4ga8O2bm5lblwiLFxuICAgIGV4dGVybmFsSGVscExpbmtVcmw6XG4gICAgICBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2NoYW5uZWwvVUNIMnJ1OW9rSWNvb05aZnBJYnlxNHFRP3ZpZXdfYXM9c3Vic2NyaWJlclwiLFxuICAgIGRyb3BRdWVzdGlvbjogXCJGcmFnZSBiaXR0ZSBoaWVyIHBsYXR6aWVyZW4uXCIsXG4gICAgYWRkTG9naWNJdGVtOiBcIkVpbmUgUmVnZWwgZXJzdGVsbGVuLCB1bSBkZW4gRmx1c3MgZGVyIFVtZnJhZ2UgYW56dXBhc3Nlbi5cIixcbiAgICBjb3B5OiBcIktvcGllcmVuXCIsXG4gICAgYWRkVG9Ub29sYm94OiBcIlp1ciBXZXJremV1Z2xlaXN0ZSBoaW56dWbDvGdlblwiLFxuICAgIGRlbGV0ZVBhbmVsOiBcIlBhbmVsIGzDtnNjaGVuXCIsXG4gICAgZGVsZXRlUXVlc3Rpb246IFwiRnJhZ2UgbMO2c2NoZW5cIixcbiAgICBjb252ZXJ0VG86IFwiS29udmVydGllcmVuIHp1XCIsXG4gICAgZHJhZzogXCJFbGVtZW50IHppZWhlblwiLFxuICB9LFxuICAvL3F1ZXN0aW9uVHlwZXNcbiAgcXQ6IHtcbiAgICBkZWZhdWx0OiBcIlN0YW5kYXJkXCIsXG4gICAgY2hlY2tib3g6IFwiQXVzd2FobFwiLFxuICAgIGNvbW1lbnQ6IFwiS29tbWVudGFyXCIsXG4gICAgaW1hZ2VwaWNrZXI6IFwiQmlsZGF1c3dhaGxcIixcbiAgICBpbWFnZTogXCJCaWxkXCIsXG4gICAgZHJvcGRvd246IFwiRHJvcGRvd25cIixcbiAgICBmaWxlOiBcIkRhdGVpXCIsXG4gICAgaHRtbDogXCJIVE1MXCIsXG4gICAgbWF0cml4OiBcIk1hdHJpeCAoZWluZmFjaGUgQXVzd2FobClcIixcbiAgICBtYXRyaXhkcm9wZG93bjogXCJNYXRyaXggKG1laHJmYWNoZSBBdXN3YWhsKVwiLFxuICAgIG1hdHJpeGR5bmFtaWM6IFwiTWF0cml4IChkeW5hbWlzY2hlIFplaWxlbilcIixcbiAgICBtdWx0aXBsZXRleHQ6IFwiVGV4dCAobWVocnplaWxpZylcIixcbiAgICBwYW5lbDogXCJQYW5lbFwiLFxuICAgIHBhbmVsZHluYW1pYzogXCJQYW5lbCAoZHluYW1pc2NoKVwiLFxuICAgIHJhZGlvZ3JvdXA6IFwiT3B0aW9uXCIsXG4gICAgcmF0aW5nOiBcIkJld2VydHVuZ1wiLFxuICAgIHRleHQ6IFwiVGV4dFwiLFxuICAgIGJvb2xlYW46IFwiV2FocmhlaXRzd2VydFwiLFxuICAgIGV4cHJlc3Npb246IFwiQXVzZHJ1Y2sgKHNjaHJlaWJnZXNjaMO8dHp0KVwiLFxuICAgIHNpZ25hdHVyZXBhZDogXCJVbnRlcnNjaHJpZnRcIixcbiAgICBmbG93cGFuZWw6IFwiUGFuZWwgKGZsaWXDn2VuZClcIixcbiAgfSxcbiAgLy9TdHJpbmdzIGluIEVkaXRvclxuICBlZDoge1xuICAgIGRlZmF1bHRMb2NhbGU6IFwiU3RhbmRhcmQgKHswfSlcIixcbiAgICBzdXJ2ZXk6IFwiVW1mcmFnZVwiLFxuICAgIHNldHRpbmdzOiBcIlVtZnJhZ2VlaW5zdGVsbHVuZ2VuXCIsXG4gICAgc2V0dGluZ3NUb29sdGlwOiBcIlVtZnJhZ2VlaW5zdGVsbHVuZ2VuIMO2ZmZuZW5cIixcbiAgICBvcGplY3RQcm9wZXJ0aWVzSGVhZGVyOiBcIkVyd2VpdGVydFwiLFxuICAgIHNob3dPYmplY3RQcm9wZXJ0aWVzOiBcIk9iamVrdGVpZ2Vuc2NoYWZ0ZW4gYW56ZWlnZW5cIixcbiAgICBoaWRlT2JqZWN0UHJvcGVydGllczogXCJPYmpla3RlaWdlbnNjaGFmdGVuIHZlcnN0ZWNrZW5cIixcbiAgICBzaG93UGFuZWw6IFwiUGFuZWwgYW56ZWlnZW5cIixcbiAgICBoaWRlUGFuZWw6IFwiUGFuZWwgdmVyc3RlY2tlblwiLFxuICAgIGVkaXRTdXJ2ZXk6IFwiVW1mcmFnZSBiZWFyYmVpdGVuXCIsXG4gICAgYWRkTmV3UGFnZTogXCJOZXVlIFNlaXRlIGhpbnp1ZsO8Z2VuXCIsXG4gICAgbW92ZVJpZ2h0OiBcIk5hY2ggcmVjaHRzIHNjcm9sbGVuXCIsXG4gICAgbW92ZUxlZnQ6IFwiTmFjaCBsaW5rcyBzY3JvbGxlblwiLFxuICAgIGRlbGV0ZVBhZ2U6IFwiU2VpdGUgbMO2c2NoZW5cIixcbiAgICBlZGl0UGFnZTogXCJTZWl0ZSBiZWFyYmVpdGVuXCIsXG4gICAgZWRpdDogXCJCZWFyYmVpdGVuXCIsXG4gICAgbmV3UGFnZU5hbWU6IFwiU2VpdGVcIixcbiAgICBuZXdRdWVzdGlvbk5hbWU6IFwiRnJhZ2VcIixcbiAgICBuZXdQYW5lbE5hbWU6IFwiUGFuZWxcIixcbiAgICBuZXdUZXh0SXRlbU5hbWU6IFwiVGV4dFwiLFxuICAgIHRlc3RTdXJ2ZXk6IFwiVW1mcmFnZSB0ZXN0ZW5cIixcbiAgICB0ZXN0U3VydmV5QWdhaW46IFwiVGVzdHVtZnJhZ2Ugd2llZGVyaG9sZW5cIixcbiAgICB0ZXN0U3VydmV5V2lkdGg6IFwiVW1mcmFnZWJyZWl0ZTogXCIsXG4gICAgbmF2aWdhdGVUb01zZzogXCJTaWUgd2VyZGVuIHdlaXRlcmdlbGVpdGV0OiBcIixcbiAgICBsb2dpYzogXCJVbWZyYWdlbG9naWtcIixcbiAgICBlbWJlZFN1cnZleTogXCJVbWZyYWdlIGVpbmbDvGdlblwiLFxuICAgIHRyYW5zbGF0aW9uOiBcIsOcYmVyc2V0enVuZ2VuXCIsXG4gICAgc2F2ZVN1cnZleTogXCJVbWZyYWdlIHNwZWljaGVyblwiLFxuICAgIHNhdmVTdXJ2ZXlUb29sdGlwOiBcIlVtZnJhZ2Ugc3BlaWNoZXJuXCIsXG4gICAgZGVzaWduZXI6IFwiVW1mcmFnZSBlbnR3ZXJmZW5cIixcbiAgICBqc29uRWRpdG9yOiBcIkpTT05cIixcbiAgICB1bmRvOiBcIlLDvGNrZ8OkbmdpZ1wiLFxuICAgIHJlZG86IFwiV2llZGVyaGVyc3RlbGxlblwiLFxuICAgIHVuZG9Ub29sdGlwOiBcIkxldHp0ZSDDhG5kZXJ1bmcgcsO8Y2tnw6RuZ2lnIG1hY2hlblwiLFxuICAgIHJlZG9Ub29sdGlwOiBcIkxldHp0ZSDDhG5kZXJ1bmcgd2llZGVyaGVyc3RlbGxlblwiLFxuICAgIGNvcHk6IFwiS29waWVyZW5cIixcbiAgICBjdXQ6IFwiQXVzc2NobmVpZGVuXCIsXG4gICAgcGFzdGU6IFwiRWluZsO8Z2VuXCIsXG4gICAgY29weVRvb2x0aXA6IFwiQXVzd2FobCBpbiBkaWUgWndpc2NoZW5hYmxhZ2Uga29waWVyZW5cIixcbiAgICBjdXRUb29sdGlwOiBcIkF1c3dhaGwgYXVzc2NobmVpZGVuXCIsXG4gICAgcGFzdGVUb29sdGlwOiBcIkF1cyBkZXIgWndpc2NoZW5hYmxhZ2UgZWluZsO8Z2VuXCIsXG4gICAgb3B0aW9uczogXCJPcHRpb25lblwiLFxuICAgIGdlbmVyYXRlVmFsaWRKU09OOiBcIkdlbmVyaWVyZSBnw7xsdGlnZXMgSlNPTlwiLFxuICAgIGdlbmVyYXRlUmVhZGFibGVKU09OOiBcIkdlbmVyaWVyZSBsZXNiYXJlcyBKU09OXCIsXG4gICAgdG9vbGJveDogXCJXZXJremV1Z2xlaXN0ZVwiLFxuICAgIFwicHJvcGVydHktZ3JpZFwiOiBcIkVpZ2Vuc2NoYWZ0ZW5cIixcbiAgICB0b29sYm94R2VuZXJhbENhdGVnb3J5OiBcIkFsbGdlbWVpblwiLFxuICAgIGRlbFNlbE9iamVjdDogXCJMw7ZzY2hlIG1hcmtpZXJ0ZXMgT2JqZWt0XCIsXG4gICAgZWRpdFNlbE9iamVjdDogXCJCZWFyYmVpdGUgbWFya2llcnRlcyBPYmpla3RcIixcbiAgICBjb3JyZWN0SlNPTjogXCJCaXR0ZSBKU09OIGtvcnJpZ2llcmVuLlwiLFxuICAgIHN1cnZleVJlc3VsdHM6IFwiVW1mcmFnZWVyZ2VibmlzOiBcIixcbiAgICBzdXJ2ZXlSZXN1bHRzVGFibGU6IFwiQWxzIFRhYmVsbGVcIixcbiAgICBzdXJ2ZXlSZXN1bHRzSnNvbjogXCJBbHMgSlNPTlwiLFxuICAgIHJlc3VsdHNUaXRsZTogXCJUaXRlbCBkZXIgRnJhZ2VcIixcbiAgICByZXN1bHRzTmFtZTogXCJOYW1lIGRlciBGcmFnZVwiLFxuICAgIHJlc3VsdHNWYWx1ZTogXCJXZXJ0IGRlciBBbnR3b3J0XCIsXG4gICAgcmVzdWx0c0Rpc3BsYXlWYWx1ZTogXCJBbnplaWdld2VydFwiLFxuICAgIG1vZGlmaWVkOiBcIk1vZGlmaXppZXJ0XCIsXG4gICAgc2F2aW5nOiBcIlNwZWljaGVyblwiLFxuICAgIHNhdmVkOiBcIkdlc3BlaWNoZXJ0XCIsXG4gICAgcHJvcGVydHlFZGl0b3JFcnJvcjogXCJGZWhsZXI6XCIsXG4gICAgc2F2ZUVycm9yOiBcIkZlaGxlciEgRGVyIEluaGFsdCBkZXMgRWRpdG9ycyB3dXJkZSBuaWNodCBnZXNwZWljaGVydC5cIixcbiAgICB0cmFuc2xhdGlvbkFkZExhbmd1YWdlOiBcIlfDpGhsZW4gU2llIGVpbmUgU3ByYWNoZSBhdXNcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxTdHJpbmdzOiBcIkFsbGUgVGV4dGUgYW56ZWlnZW5cIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxQYWdlczogXCJBbGxlIFNlaXRlbiBhbnplaWdlblwiLFxuICAgIHRyYW5zbGF0aW9uTm9TdHJpbmdzOlxuICAgICAgXCJLZWluZSBUZXh0ZSB6dW0gw5xiZXJzZXR6ZW4uIEJpdHRlIGRlbiBGaWx0ZXIgYW5wYXNzZW4uXCIsXG4gICAgdHJhbnNsYXRpb25FeHBvcnRUb1NDVkJ1dHRvbjogXCJFeHBvcnQgKENTVilcIixcbiAgICB0cmFuc2xhdGlvbkltcG9ydEZyb21TQ1ZCdXR0b246IFwiSW1wb3J0IChDU1YpXCIsXG4gICAgdHJhbnNsYXRpb25NZXJnZUxvY2FsZVdpdGhEZWZhdWx0OlxuICAgICAgXCJWZXJzY2htZWx6ZSB7MH0gbWl0IGRlciBTdGFuZGFyZHNwcmFjaGVcIixcbiAgICBib2xkOiBcIkZldHRcIixcbiAgICBpdGFsaWM6IFwiS3Vyc2l2XCIsXG4gICAgdW5kZXJsaW5lOiBcIlVudGVyc3RyaWNoZW5cIixcbiAgICBmcEFkZFF1ZXN0aW9uOiBcIkZyYWdlIGhpbnp1ZsO8Z2VuIC4uLlwiLFxuICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbkl0ZW1UZXh0OiBcIlplaWdlIHdlbm46XCIsXG4gIH0sXG4gIGxnOiB7XG4gICAgLy9Mb2dpYyB0YWIgc3RyaW5nc1xuICAgIGdlX3Zpc2liaWxpdHlOYW1lOiBcIlNlaXRlbnNpY2h0YmFya2VpdFwiLFxuICAgIHBhbmVsX3Zpc2liaWxpdHlOYW1lOiBcIlBhbmVsc2ljaHRiYXJrZWl0XCIsXG4gICAgcGFuZWxfZW5hYmxlTmFtZTogXCJQYW5lbCBha3RpdmllcmVuL2RlYWt0aXZpZXJlblwiLFxuICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlOYW1lOiBcIkZyYWdlbnNpY2h0YmFya2VpdFwiLFxuICAgIHF1ZXN0aW9uX2VuYWJsZU5hbWU6IFwiRnJhZ2UgYWt0aXZpZXJlbi9kZWFrdGl2aWVyZW5cIixcbiAgICBxdWVzdGlvbl9yZXF1aXJlTmFtZTogXCJGcmFnZSBvcHRpb25hbC9lcmZvcmRlcmxpY2hcIixcbiAgICB0cmlnZ2VyX2NvbXBsZXRlTmFtZTogXCJVbWZyYWdlIGFic2NobGllw59lblwiLFxuICAgIHRyaWdnZXJfc2V0dmFsdWVOYW1lOiBcIlNldHplIEZyYWdlbndlcnRcIixcbiAgICB0cmlnZ2VyX2NvcHl2YWx1ZU5hbWU6IFwiS29waWVyZSBGcmFnZW53ZXJ0XCIsXG4gICAgdHJpZ2dlcl9za2lwTmFtZTogXCJHZWhlIHp1ciBuw6RjaHN0ZW4gRnJhZ2VcIixcbiAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25OYW1lOiBcIkJlbnV0emVyZGVmaW5pZXJ0ZW4gQXVzZHJ1Y2sgYXVzZsO8aHJlblwiLFxuICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbk5hbWU6XG4gICAgICBcIkJlbnV0emVyZGVmaW5pZXJ0ZSBTZWl0ZSBuYWNoIEFic2NobHVzcyBkZXIgVW1mcmFnZVwiLFxuXG4gICAgcGFnZV92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICBcIk1hY2hlIGRpZSBTZWl0ZSBzaWNodGJhciwgd2VubiBkZXIgbG9naXNjaGUgQXVzZHJ1Y2sgd2FociBlcmdpYnQuIEFuZGVybmZhbGxzIGxhc3Mgc2llIHVuc2ljaHRiYXIuXCIsXG4gICAgcGFuZWxfdmlzaWJpbGl0eURlc2NyaXB0aW9uOlxuICAgICAgXCJNYWNoZSBkYXMgUGFuZWwgc2ljaHRiYXIsIHdlbm4gZGVyIGxvZ2lzY2hlIEF1c2RydWNrIHdhaHIgZXJnaWJ0LiBBbmRlcm5mYWxscyBsYXNzIGVzIHVuc2ljaHRiYXIuXCIsXG4gICAgcGFuZWxfZW5hYmxlRGVzY3JpcHRpb246XG4gICAgICBcIkFrdGl2aWVyZSBkYXMgUGFuZWwgenVzYW1tZW4gbWl0IGFsbCBzZWluZW4gRWxlbWVudGVuLCB3ZW5uIGRlciBsb2dpc2NoZSBBdXNkcnVjayB3YWhyIGVyZ2lidC4gQW5kZXJuZmFsbHMgbGFzcyBzaWUgZGVha3RpdmllcnQuXCIsXG4gICAgcXVlc3Rpb25fdmlzaWJpbGl0eURlc2NyaXB0aW9uOlxuICAgICAgXCJNYWNoZSBkaWUgRnJhZ2Ugc2ljaHRiYXIsIHdlbm4gZGVyIGxvZ2lzY2hlIEF1c2RydWNrIHdhaHIgZXJnaWJ0LiBBbmRlcm5mYWxscyBsYXNzIHNpZSB1bnNpY2h0YmFyLlwiLFxuICAgIHF1ZXN0aW9uX2VuYWJsZURlc2NyaXB0aW9uOlxuICAgICAgXCJBa3RpdmllcmUgZGllIEZyYWdlLCB3ZW5uIGRlciBsb2dpc2NoZSBBdXNkcnVjayB3YWhyIGVyZ2lidC4gQW5kZXJuZmFsbHMgbGFzcyBzaWUgZGVha3RpdmllcnQuXCIsXG4gICAgcXVlc3Rpb25fcmVxdWlyZURlc2NyaXB0aW9uOlxuICAgICAgXCJGcmFnZSB3aXJkIGVyZm9yZGVybGljaCwgd2VubiBkZXIgbG9naXNjaGUgQXVzZHJ1Y2sgd2FociBlcmdpYnQuXCIsXG4gICAgdHJpZ2dlcl9jb21wbGV0ZURlc2NyaXB0aW9uOlxuICAgICAgXCJXZW5uIGRlciBsb2dpc2NoZSBBdXNkcnVjayB3YWhyIGVyZ2lidCwgd2lyIGRpZSBVbWZyYWdlIGFiZ2VzY2hsb3NzZW4gdW5kIGRlciBCZW51dHplciBzaWVodCBkaWUgQWJzY2hsdXNzc2VpdGUgZGVyIFVtZnJhZ2UuXCIsXG4gICAgdHJpZ2dlcl9zZXR2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgXCJXZW5uIFdlcnRlLCBkaWUgaW0gbG9naXNjaGVuIEF1c2RydWNrIHZlcndlbmRldCB3ZXJkZW4sIGdlw6RuZGVydCB3ZXJkZW4gdW5kIGRlciBsb2dpc2NoZSBBdXNkcnVjayB3YWhyIGVyZ2lidCwgZGFubiB3aXJkIGRlciBXZXJ0IGluIGRpZSBhdXNnZXfDpGhsdGUgRnJhZ2UgZWluZ2VzZXR6dC5cIixcbiAgICB0cmlnZ2VyX2NvcHl2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgXCJXZW5uIFdlcnRlLCBkaWUgaW0gbG9naXNjaGVuIEF1c2RydWNrIHZlcndlbmRldCB3ZXJkZW4sIGdlw6RuZGVydCB3ZXJkZW4gdW5kIGRlciBsb2dpc2NoZSBBdXNkcnVjayB3YWhyIGVyZ2lidCwgZGFubiB3aXJkIGRlciBXZXJ0IGVpbmVyIGF1c2dld8OkaGx0ZSBGcmFnZW4ga29waWVydCB1bmQgaW4gZWluZSBhbmRlcmUgYXVzZ2V3w6RobHRlIEZyYWdlIGVpbmdlc2V0enQuXCIsXG4gICAgdHJpZ2dlcl9za2lwRGVzY3JpcHRpb246XG4gICAgICBcIldlbm4gZGVyIGxvZ2lzY2hlIEF1c2RydWNrIHdhaHIgZXJnaWJ0LCBzcHJpbmd0IGRpZSBVbWZyYWdlIHp1ciBhdXNnZXfDpGhsdGVuIEZyYWdlLlwiLFxuICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvbkRlc2NyaXB0aW9uOlxuICAgICAgXCJXZW5uIGRlciBsb2dpc2NoZSBBdXNkcnVjayB3YWhyIGVyZ2lidCwgd2lyZCBkaWUgYmVudXR6ZXJkZWZpbmllcnRlIEFud2Vpc3VuZyBhdXNnZWbDvGhydC4gU2llIGvDtm5uZW4gb3B0aW9uYWwgZGFzIEVyZ2VibmlzIGRlciBBbndlaXN1bmcgaW4gZGllIGF1c2dld8OkaGx0ZSBGcmFnZSBlaW5zZXR6ZW4uXCIsXG4gICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uRGVzY3JpcHRpb246XG4gICAgICBcIldlbm4gZGVyIGxvZ2lzY2hlIEF1c2RydWNrIHdhaHIgZXJnaWJ0LCBkYW5uIHdpcmQgZGVyIFN0YW5kYXJkdGV4dCBkZXIgQWJzY2hsdXNzc2VpdGUgZGVyIFVtZnJhZ2UgbWl0IGRlbSBnZWdlYmVuZW4gVGV4dCBlcnNldHp0LlwiLFxuXG4gICAgaXRlbUV4cHJlc3Npb25UZXh0OiBcIldlbm4gZGVyIEF1c2RydWNrICd7MH0nIHdhaHIgZXJnaWJ0OlwiLCAvLyB7MH0gLSB0aGUgZXhwcmVzc2lvblxuICAgIHBhZ2VfdmlzaWJpbGl0eVRleHQ6IFwiTWFjaGUgZGllIFNlaXRlIHswfSBzaWNodGJhclwiLCAvLyB7MH0gcGFnZSBuYW1lXG4gICAgcGFuZWxfdmlzaWJpbGl0eVRleHQ6IFwiTWFjaGUgZGFzIFBhbmVsIHswfSBzaWNodGJhclwiLCAvLyB7MH0gcGFuZWwgbmFtZVxuICAgIHBhbmVsX2VuYWJsZVRleHQ6IFwiQWt0aXZpZXJlIGRhcyBQYW5lbCB7MH1cIiwgLy8gezB9IHBhbmVsIG5hbWVcbiAgICBxdWVzdGlvbl92aXNpYmlsaXR5VGV4dDogXCJNYWNoZSBkaWUgRnJhZ2UgezB9IHNpY2h0YmFyXCIsIC8vIHswfSBxdWVzdGlvbiBuYW1lXG4gICAgcXVlc3Rpb25fZW5hYmxlVGV4dDogXCJBa3RpdmllcmUgZGllIEZyYWdlIHswfVwiLCAvLyB7MH0gcXVlc3Rpb24gbmFtZVxuICAgIHF1ZXN0aW9uX3JlcXVpcmVUZXh0OiBcIk1hY2hlIGRpZSBGcmFnZSB7MH0gZXJmb3JkZXJsaWNoXCIsIC8vIHswfSBxdWVzdGlvbiBuYW1lXG4gICAgdHJpZ2dlcl9jb21wbGV0ZVRleHQ6IFwiVW1mcmFnZSBhYnNjaGxpZcOfZW5cIixcbiAgICB0cmlnZ2VyX3NldHZhbHVlVGV4dDogXCJTZXR6ZSBpbiBGcmFnZSB7MH0gZGVuIFdlcnQgezF9IGVpblwiLCAvLyB7MH0gcXVlc3Rpb24gbmFtZSwgezF9IHNldFZhbHVlXG4gICAgdHJpZ2dlcl9jb3B5dmFsdWVUZXh0OiBcIktvcGllcmUgaW4gRnJhZ2UgezB9IGRlbiBXZXJ0IHZvbiBGcmFnZSB7MX1cIiwgLy8gezB9IGFuZCB7MX0gcXVlc3Rpb24gbmFtZXNcbiAgICB0cmlnZ2VyX3NraXBUZXh0OiBcIkdlaGUgenUgRnJhZ2UgezB9XCIsIC8vIHswfSBxdWVzdGlvbiBuYW1lXG4gICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDE6IFwiRsO8aHJlIGZvbGdlbmRlbiBBdXNkcnVjayBhdXM6ICd7MH0nXCIsIC8vIHswfSB0aGUgZXhwcmVzc2lvblxuICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvblRleHQyOiBcIiB1bmQgc2V0emUgZGFzIEVyZ2VibmlzIGluIEZyYWdlIHswfSBlaW5cIiwgLy8gezB9IHF1ZXN0aW9uIG5hbWVcbiAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25UZXh0OlxuICAgICAgXCJaZWlnZW4gU2llIGVpbmVuIGJlbnV0emVyZGVmaW5pZXJ0ZW4gVGV4dCBhdWYgZGVyIEFic2NobHVzc3NlaXRlIGRlciBVbWZyYWdlIGFuLlwiLFxuXG4gICAgY29uZGl0aW9uczogXCJCZWRpbmd1bmdlblwiLFxuICAgIGFjdGlvbnM6IFwiQWt0aW9uZW5cIixcbiAgICBleHByZXNzaW9uRWRpdG9yVGl0bGU6IFwiRGVmaW5pZXJlIEJlZGluZ3VuZ2VuXCIsXG4gICAgYWN0aW9uc0VkaXRvclRpdGxlOiBcIkRlZmluaWVyZSBBa3Rpb25lblwiLFxuXG4gICAgZGVsZXRlQWN0aW9uOiBcIkFrdGlvbiBsw7ZzY2hlblwiLFxuICAgIGFkZE5ld0FjdGlvbjogXCJBa3Rpb24gaGluenVmw7xnZW5cIixcbiAgICBzZWxlY3RlZEFjdGlvbkNhcHRpb246IFwiQWt0aW9uIHp1bSBIaW56dWbDvGdlbiBhdXN3w6RobGVuIC4uLlwiLFxuXG4gICAgZXhwcmVzc2lvbkludmFsaWQ6XG4gICAgICBcIkRlciBsb2dpc2NoZSBBdXNkcnVjayBpc3QgbGVlciBvZGVyIHVuZ8O8bHRpZy4gQml0dGUga29ycmlnaWVyZW4gU2llIGlobi5cIixcbiAgICBub0FjdGlvbkVycm9yOiBcIkJpdHRlIGbDvGdlbiBTaWUgbWluZGVzdGVucyBlaW5lIEFrdGlvbiBoaW56dS5cIixcbiAgICBhY3Rpb25JbnZhbGlkOlxuICAgICAgXCJCaXR0ZSBiZWhlYmVuIFNpZSBkaWUgYmVzdGVoZW5kZW4gUHJvYmxlbWUgaW4gSWhyZW4gQWt0aW9uZW4uXCIsXG4gICAgZXhwcmVzc2lvblNldHVwOiBcIlwiLFxuICAgIGFjdGlvbnNTZXR1cDogXCJcIixcbiAgfSxcbiAgLy9Qcm9wZXJ0eSBuYW1lcyBpbiB0YWJsZSBoZWFkZXJzXG4gIHBlbDoge1xuICAgIGlzUmVxdWlyZWQ6IFwiRXJmb3JkZXJsaWNoP1wiLFxuICB9LFxuICAvL1Byb3BlcnR5IEVkaXRvcnNcbiAgcGU6IHtcbiAgICBhcHBseTogXCJBbndlbmRlblwiLFxuICAgIG9rOiBcIk9LXCIsXG4gICAgc2F2ZTogXCJTcGVpY2hlcm5cIixcbiAgICBzYXZlVG9vbHRpcDogXCJTcGVpY2hlcm5cIixcbiAgICBjYW5jZWw6IFwiQWJicmVjaGVuXCIsXG4gICAgcmVzZXQ6IFwiWnVyw7xja3NldHplblwiLFxuICAgIHJlZnJlc2g6IFwiTmV1IGxhZGVuXCIsXG4gICAgY2xvc2U6IFwiU2NobGllc3NlblwiLFxuICAgIGRlbGV0ZTogXCJMw7ZzY2hlblwiLFxuICAgIGFkZDogXCJIaW56dWbDvGdlblwiLFxuICAgIGFkZE5ldzogXCJOZXVlcyBFbGVtZW50IGhpbnp1ZsO8Z2VuXCIsXG4gICAgYWRkSXRlbTogXCJLbGlja2VuLCB1bSBlaW4gRWxlbWVudCBoaW56dXp1ZsO8Z2VuIC4uLlwiLFxuICAgIGFkZE90aGVyOiBcIldlaXRlcmVzIEVsZW1lbnRcIixcbiAgICBhZGRTZWxlY3RBbGw6IFwiQWxsZSBFbGVtZW50ZSBhdXN3w6RobGVuIGhpbnp1ZsO8Z2VuXCIsXG4gICAgYWRkTm9uZTogXCJBbGxlIEVsZW1lbnRlIGFid8OkaGxlbiBoaW56dWbDvGdlblwiLFxuICAgIHJlbW92ZUFsbDogXCJBbGxlIGzDtnNjaGVuXCIsXG4gICAgZWRpdDogXCJCZWFyYmVpdGVuXCIsXG4gICAgYmFjazogXCJadXLDvGNrIG9obmUgenUgc3BlaWNoZXJuXCIsXG4gICAgYmFja1Rvb2x0aXA6IFwiWnVyw7xjayBvaG5lIHp1IHNwZWljaGVyblwiLFxuICAgIHNhdmVBbmRCYWNrOiBcIlNwZWljaGVybiB1bmQgenVyw7xja1wiLFxuICAgIHNhdmVBbmRCYWNrVG9vbHRpcDogXCJTcGVpY2hlcm4gdW5kIHp1csO8Y2tcIixcbiAgICBpdGVtVmFsdWVFZGl0OiBcIlNpY2h0YmFyIHdlbm5cIixcbiAgICBlZGl0Q2hvaWNlczogXCJBdXN3YWhsbcO2Z2xpY2hrZWl0ZW4gYmVhcmJlaXRlblwiLFxuICAgIHNob3dDaG9pY2VzOiBcIkF1c3dhaGxtw7ZnbGljaGtlaXRlbiBhbnplaWdlblwiLFxuICAgIG1vdmU6IFwiVmVyc2NoaWViZW5cIixcbiAgICBlbXB0eTogXCI8bGVlcj5cIixcbiAgICBub3RFbXB0eTogXCI8YmVhcmJlaXRlbj5cIixcbiAgICBmYXN0RW50cnk6IFwiU2NobmVsbGVpbnRyYWdcIixcbiAgICBmb3JtRW50cnk6IFwiRm9ybXVsYXJlaW50cmFnXCIsXG4gICAgdGVzdFNlcnZpY2U6IFwiU2VydmljZSB0ZXN0ZW5cIixcbiAgICBpdGVtU2VsZWN0b3JFbXB0eTogXCJCaXR0ZSBlaW4gRWxlbWVudCBhdXN3w6RobGVuXCIsXG4gICAgY29uZGl0aW9uQWN0aW9uRW1wdHk6IFwiQml0dGUgZWluZSBBa3Rpb24gYXVzd8OkaGxlblwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFF1ZXN0aW9uOiBcIkZyYWdlIGF1c3fDpGhsZW4gLi4uXCIsXG4gICAgY29uZGl0aW9uU2VsZWN0UGFnZTogXCJTZWl0ZSBhdXN3w6RobGVuIC4uLlwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFBhbmVsOiBcIlBhbmVsIGF1c3fDpGhsZW4gLi4uXCIsXG4gICAgY29uZGl0aW9uVmFsdWVRdWVzdGlvblRpdGxlOiBcIkJpdHRlIGRlbiBXZXJ0IGVpbmdlYmVuIG9kZXIgYXVzd8OkaGxlblwiLFxuICAgIGNvbmRpdGlvbkhlbHA6XG4gICAgICBcIkJpdHRlIGdlYmVuIFNpZSBlaW5lbiBib29sZXNjaGVuIEF1c2RydWNrIGVpbi4gRGllc2VyIG11c3MgJ3RydWUnIHp1csO8Y2tnZWJlbiwgdW0gZGllIEZyYWdlL1NlaXRlIGFuenV6ZWlnZW4uIEJlaXNwaWVsOiB7cXVlc3Rpb24xfSA9ICd2YWx1ZTEnIG9yICh7cXVlc3Rpb24yfSAqIHtxdWVzdGlvbjR9ICA+IDIwIGFuZCB7cXVlc3Rpb24zfSA8IDUpXCIsXG4gICAgZXhwcmVzc2lvbkhlbHA6XG4gICAgICAnQml0dGUgZ2ViZW4gU2llIGVpbmUgQW53ZWlzdW5nIGVpbi4gU2llIGvDtm5uZW4gZ2VzY2h3ZWlmdGUgS2xhbW1lcm4gdmVyd2VuZGVuLCB1bSBadWdyaWZmIGF1ZiBkaWUgV2VydGUgZGVyIEZyYWdlbiB6dSBiZWtvbW1lbjogXCJ7cXVlc3Rpb24xfSArIHtxdWVzdGlvbjJ9XCIsIFwiKHtwcmljZX0gKiB7cXVhbnRpdHl9KSAqICgxMDAgLSB7ZGlzY291bnR9KVwiJyxcbiAgICBhY2VFZGl0b3JIZWxwOlxuICAgICAgXCJCaXR0ZSBkcsO8Y2tlbiBTaWUgU3RyZytMZWVydGFzdGUsIHVtIFZlcnZvbGxzdMOkbmRpZ3VuZ3N2b3JzY2hsw6RnZSBmw7xyIGRlbiBBdXNkcnVjayB6dSBlcmhhbHRlblwiLFxuICAgIGFjZUVkaXRvclJvd1RpdGxlOiBcIkFrdHVlbGxlIFplaWxlXCIsXG4gICAgYWNlRWRpdG9yUGFuZWxUaXRsZTogXCJBa3R1ZWxsZXMgUGFuZWxcIixcbiAgICBzaG93TW9yZTogXCJXZWl0ZXJlIEluZm9ybWF0aW9uZW4gZmluZGVuIFNpZSBpbiBkZXIgRG9rdW1lbnRhdGlvblwiLFxuICAgIGNvbmRpdGlvblNob3dNb3JlVXJsOlxuICAgICAgXCJodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeVBhcmFtZXRlcj9pZD1RdWVzdGlvbkJhc2UmcGFyYW1ldGVyPXZpc2libGVJZlwiLFxuICAgIGFzc2lzdGFudFRpdGxlOiBcIlZlcmbDvGdiYXJlIEZyYWdlbjpcIixcbiAgICBjZWxsc0VtcHR5Um93c0NvbHVtbnM6IFwiRXMgc29sbHRlIG1pbmRlc3RlbnMgZWluZSBTcGFsdGUgb2RlciBaZWlsZSBnZWJlblwiLFxuXG4gICAgcHJvcGVydHlJc0VtcHR5OiBcIkJpdHRlIGdlYmVuIFNpZSBlaW5lbiBXZXJ0IGVpblwiLFxuICAgIHByb3BlcnR5TmFtZUlzTm90VW5pcXVlOiBcIkJpdHRlIGdlYmVuIFNpZSBlaW5lbiBlaW5kZXV0aWdlbiBXZXJ0IGVpblwiLFxuICAgIGxpc3RJc0VtcHR5OiBcIk5ldWVzIEVsZW1lbnQgaGluenVmw7xnZW5cIixcbiAgICBleHByZXNzaW9uSXNFbXB0eTogXCJBdXNkcnVjayBpc3QgbGVlclwiLFxuICAgIHZhbHVlOiBcIldlcnRcIixcbiAgICB0ZXh0OiBcIlRleHRcIixcbiAgICByb3dpZDogXCJaZWlsZW4tSURcIixcbiAgICBpbWFnZUxpbms6IFwiTGluayBhdWYgZGFzIEJpbGRcIixcbiAgICBjb2x1bW5FZGl0OiBcIlNwYWx0ZSBiZWFyYmVpdGVuOiB7MH1cIixcbiAgICBpdGVtRWRpdDogXCJFbGVtZW50IGJlYXJiZWl0ZW46IHswfVwiLFxuXG4gICAgdXJsOiBcIlVSTFwiLFxuICAgIHBhdGg6IFwiUGZhZFwiLFxuICAgIHZhbHVlTmFtZTogXCJOYW1lIGRlciBBbnR3b3J0XCIsXG4gICAgdGl0bGVOYW1lOiBcIk5hbWUgZGVzIFRpdGVsc1wiLFxuICAgIHRpdGxlUGxhY2Vob2xkZXI6IFwiVGl0ZWwgZWluZ2ViZW5cIixcbiAgICBzdXJ2ZXlUaXRsZVBsYWNlaG9sZGVyOiBcIlVtZnJhZ2V0aXRlbCBoaWVyIGVpbmdlYmVuXCIsXG4gICAgcGFnZVRpdGxlUGxhY2Vob2xkZXI6IFwiU2VpdGVuYmVzY2hyZWlidW5nIGhpZXIgZWluZ2ViZW5cIixcbiAgICBkZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcIkJlc2NocmVpYnVuZyBlaW5nZWJlblwiLFxuICAgIHN1cnZleURlc2NyaXB0aW9uUGxhY2Vob2xkZXI6IFwiVW1mcmFnZWJlc2NocmVpYnVuZyBlaW5nZWJlblwiLFxuICAgIHBhZ2VEZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcIlNlaXRlbmJlc2NocmVpYnVuZyBlaW5nZWJlblwiLFxuXG4gICAgaGFzT3RoZXI6IFwiU29uc3RpZ2VzIGF1c3fDpGhsYmFyP1wiLFxuICAgIG90aGVyVGV4dDogXCJUZXh0IGbDvHIgU29uc3RpZ2VzXCIsXG4gICAgb3RoZXJQbGFjZUhvbGRlcjogXCJQbGF0emhhbHRlciBmw7xyIFNvbnN0aWdlc1wiLFxuICAgIHNob3dDbGVhckJ1dHRvbjogXCJCdXR0b24gYW56ZWlnZW4sIGRlciBlcyBlcmxhdWJ0IGRpZSBBdXN3YWhsIHp1IGxlZXJlblwiLFxuICAgIGFsbG93RW1wdHlSZXNwb25zZTogXCJLZWluZSBBbnR3b3J0IGVybGF1YmVuXCIsXG4gICAgaGFzTm9uZTogXCJBbGxlIEVsZW1lbnRlIGFid8OkaGxiYXI/XCIsXG4gICAgbm9uZVRleHQ6IFwiVGV4dCBmw7xyIGRpZSBBYndhaGwgYWxsZXIgRWxlbWVudGVcIixcbiAgICBoYXNTZWxlY3RBbGw6IFwiQWxsZSBFbGVtZW50ZSBhdXN3w6RobGJhcj9cIixcbiAgICBzZWxlY3RBbGxUZXh0OiBcIlRleHQgZsO8ciBkaWUgQXVzd2FobCBhbGxlciBFbGVtZW50ZVwiLFxuICAgIGNob2ljZXNNaW46IFwiTWluaW1hbGVyIFdlcnQgZsO8ciBhdXRvbWF0aXNjaCBlcnpldWd0ZSBFbGVtZW50ZVwiLFxuICAgIGNob2ljZXNNYXg6IFwiTWF4aW1hbGVyIFdlcnQgZsO8ciBhdXRvbWF0aXNjaCBlcnpldWd0ZSBFbGVtZW50ZVwiLFxuICAgIGNob2ljZXNTdGVwOiBcIlNjaHJpdHRncsO2w59lIGbDvHIgYXV0b21hdGlzY2ggZXJ6ZXVndGUgRWxlbWVudGVcIixcbiAgICBzaG93T3B0aW9uc0NhcHRpb246IFwiw5xiZXJzY2hyaWZ0IGRlciBBdXN3YWhsbcO2Z2xpY2hrZWl0ZW4gYW56ZWlnZW5cIixcbiAgICBuYW1lOiBcIk5hbWVcIixcbiAgICB0aXRsZTogXCJUaXRlbFwiLFxuICAgIGNlbGxUeXBlOiBcIlplbGxlbnR5cFwiLFxuICAgIGNvbENvdW50OiBcIlNwYWx0ZW5hbnphaGxcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwiQXVzd2FobHJlaWhlbmZvbGdlXCIsXG4gICAgdmlzaWJsZTogXCJTaWNodGJhcj9cIixcbiAgICBpc1JlcXVpcmVkOiBcIkVyZm9yZGVybGljaD9cIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcIklzdCBlaW5lIEFudHdvcnQgZsO8ciBhbGxlIFplaWxlbiBlcmZvcmRlcmxpY2g/XCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6XG4gICAgICBcIkZlaGxlcm1lbGR1bmcgYmVpIG5pY2h0IGJlYW50d29ydGV0ZW4gZXJmb3JkZXJsaWNoZW4gRnJhZ2VuXCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCJJbiBuZXVlciBaZWlsZSBiZWdpbm5lbj9cIixcbiAgICByb3dzOiBcIlplaWxlbmFuemFobFwiLFxuICAgIGNvbHM6IFwiU3BhbHRlbmFuemFobFwiLFxuICAgIHBsYWNlSG9sZGVyOiBcIlBsYXR6aGFsdGVyXCIsXG4gICAgc2hvd1ByZXZpZXc6IFwiV2lyZCBlaW5lIEJpbGR2b3JzY2hhdSBhbmdlemVpZ3Q/XCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIlNwZWljaGVyIERhdGVpbmluaGFsdCBkZXMgSlNPTi1SZXN1bHRhdHMgYWxzIFRleHRcIixcbiAgICBtYXhTaXplOiBcIk1heGltYWxlIERhdGVpZ3LDtsOfZSBpbiBCeXRlc1wiLFxuICAgIGltYWdlSGVpZ2h0OiBcIkJpbGRow7ZoZVwiLFxuICAgIGltYWdlV2lkdGg6IFwiQmlsZGJyZWl0ZVwiLFxuICAgIHJvd0NvdW50OiBcIlplaWxlbmFuemFobFwiLFxuICAgIGNvbHVtbkxheW91dDogXCJTcGFsdGVubGF5b3V0XCIsXG4gICAgYWRkUm93TG9jYXRpb246IFwiWmVpbGVua25vcGZwb3NpdGlvbiBoaW56dWbDvGdlblwiLFxuICAgIGFkZFJvd1RleHQ6IFwiWmVpbGVua25vcGZ0ZXh0IGhpbnp1ZsO8Z2VuXCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCJaZWlsZW5rbm9wZnRleHQgbMO2c2NoZW5cIixcbiAgICByYXRlTWluOiBcIk1pbmltYWxcIixcbiAgICByYXRlTWF4OiBcIk1heGltYWxcIixcbiAgICByYXRlU3RlcDogXCJCZXdlcnR1bmdzc2Nocml0dGVcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwiQmV3ZXJ0dW5nc2Jlc2NocmVpYnVuZyBmw7xyIG1pbmltYWxlIEJld2VydHVuZ1wiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCJCZXdlcnR1bmdzYmVzY2hyZWlidW5nIGbDvHIgbWF4aW1hbGUgQmV3ZXJ0dW5nXCIsXG4gICAgaW5wdXRUeXBlOiBcIkVpbmdhYmV0eXBcIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJBdXN3YWhsYmVzY2hyaWZ0dW5nXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIlN0YW5kYXJkYW50d29ydFwiLFxuICAgIGNlbGxzRGVmYXVsdFJvdzogXCJTdGFuZGFyZHplbGxlbnRleHRcIixcblxuICAgIHN1cnZleUVkaXRvclRpdGxlOiBcIlVtZnJhZ2VlaW5zdGVsbHVuZ2VuIGJlYXJiZWl0ZW5cIixcbiAgICBxRWRpdG9yVGl0bGU6IFwiRnJhZ2UgYmVhcmJlaXRlbjogezB9XCIsXG5cbiAgICBtYXhMZW5ndGg6IFwiTWF4aW1hbGUgTMOkbmdlXCIsXG5cbiAgICBidWlsZEV4cHJlc3Npb246IFwiQmF1a2FzdGVuXCIsXG4gICAgZWRpdEV4cHJlc3Npb246IFwiQmVhcmJlaXRlblwiLFxuICAgIGFuZDogXCJ1bmRcIixcbiAgICBvcjogXCJvZGVyXCIsXG4gICAgcmVtb3ZlOiBcIkVudGZlcm5lblwiLFxuICAgIGFkZENvbmRpdGlvbjogXCJCZWRpbmd1bmcgaGluenVmw7xnZW5cIixcblxuICAgIHNob3dUaXRsZTogXCJUaXRlbCBhbnplaWdlblwiLFxuICAgIGxvY2FsZTogXCJTdGFuZGFyZHNwcmFjaGVcIixcbiAgICBzaW11bGF0b3I6IFwiR2Vyw6R0IGF1c3fDpGhsZW5cIixcbiAgICBsYW5kc2NhcGVPcmllbnRhdGlvbjogXCJRdWVyZm9ybWF0XCIsXG4gICAgbW9kZTogXCJNb2R1cyAoZWRpdGllcmJhci9zY2hyZWliZ2VzY2jDvHR6dClcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCJBbGxlIHVuc2ljaHRiYXJlbiBXZXJ0ZSBsZWVyZW5cIixcbiAgICBjb29raWVOYW1lOlxuICAgICAgXCJDb29raWUtTmFtZSAodW0genUgdW50ZXJkcsO8Y2tlbiwgZGFzcyBkaWUgVW1mcmFnZSBsb2thbCB6d2VpIE1hbCBhdXNnZWbDvGxsdCB3ZXJkZW4ga2FubilcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDpcbiAgICAgIFwiU2VuZGUgVW1mcmFnZWVyZ2Vibmlzc2UgYmVpbSBCZXRyZXRlbiBkZXIgbsOkY2hzdGVuIFNlaXRlXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiU3BlaWNoZXJlIGFuZGVyZSBXZXJ0ZSBhbHMgS29tbWVudGFyXCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwiU2VpdGVuYmVzY2hyZWlidW5nIGFuemVpZ2VuXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcIlNlaXRlbm51bW1lcm4gYW56ZWlnZW5cIixcbiAgICBwYWdlUHJldlRleHQ6IFwiVGV4dCBkZXMgQnV0dG9ucyBmw7xyIGRpZSB2b3JoZXJpZ2UgU2VpdGVcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiVGV4dCBkZXMgQnV0dG9ucyBmw7xyIGRpZSBuw6RjaHN0ZSBTZWl0ZVwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJUZXh0IGRlcyBBYnNjaGxpZcOfZW5idXR0b25zXCIsXG4gICAgcHJldmlld1RleHQ6IFwiVGV4dCBkZXMgVm9yc2NoYXVidXR0b25zXCIsXG4gICAgZWRpdFRleHQ6IFwiVGV4dCBkZXMgQmVhcmJlaXRlbmJ1dHRvbnNcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwiVGV4dCBkZXMgU3RhcnRidXR0b25zXCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIkFuemVpZ2UgZGVyIE5hdmlnYXRpb25zYnV0dG9uc1wiLFxuICAgIHNob3dQcmV2QnV0dG9uOlxuICAgICAgXCJCdXR0b24gZsO8ciBkaWUgdm9yaGVyaWdlIFNlaXRlIGFuemVpZ2VuIChCZW51dHplciBrw7ZubmVuIGF1ZiBkaWUgdm9yaGVyaWdlIFNlaXRlIHp1csO8Y2trZWhyZW4pXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcIkRpZSBlcnN0ZSBTZWl0ZSBkZXIgVW1mcmFnZSBpc3QgZGllIFN0YXJ0c2VpdGVcIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCJOYWNoIEFic2NobHVzcyBkaWUgYXVzZ2Vmw7xsbHRlIFVtZnJhZ2UgYW56ZWlnZW5cIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOlxuICAgICAgXCJXZW5uIGFsbGUgRnJhZ2VuIGF1ZiBlaW5lciBTZWl0ZSBiZWFudHdvcnRldCBzaW5kLCBnZWhlIGF1dG9tYXRpc2NoIHp1ciBuw6RjaHN0ZW4gU2VpdGVuXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIkZvcnRzY2hyaXR0c2JhbGtlbiBhbnplaWdlblwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJQb3NpdGlvbiBkZXMgRnJhZ2VudGl0ZWxzXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcIlN5bWJvbCBmw7xyIGVyZm9yZGVybGljaGUgRnJhZ2VuXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiAnU3RhcnRpbmRleCBkZXIgRnJhZ2VuIChic3B3LiBcIjFcIiwgXCJBXCIsIFwiYVwiLCAuLi4pJyxcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIkZyYWdlbm51bW1lcm4gYW56ZWlnZW5cIixcbiAgICB0ZXh0VXBkYXRlTW9kZTogXCJUZXh0IGFrdHVhbGlzaWVyZW5cIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6XG4gICAgICAnVGVtcGxhdGUgZsO8ciBkZW4gRnJhZ2VudGl0ZWwuIFN0YW5kYXJkIGlzdDogXCJ7bm99LiB7cmVxdWlyZX0ge3RpdGxlfVwiJyxcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwiUG9zaXRpb24gZGVyIEZlaGxlcm1lbGR1bmdlblwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzpcbiAgICAgIFwiRm9rdXNzaWVyZSBkaWUgZXJzdGUgRnJhZ2UsIHdlbm4gZGllIFNlaXRlIHZlcsOkbmRlcnQgd2lyZFwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcIlJlaWhlbmZvbGdlIGRlciBFbGVtZW50ZSBhdWYgZGVyIFNlaXRlXCIsXG4gICAgbWF4VGV4dExlbmd0aDogXCJNYXhpbWFsZSBUZXh0bMOkbmdlXCIsXG4gICAgbWF4T3RoZXJMZW5ndGg6IFwiTWF4aW1hbGUgd2VpdGVyZSBMw6RuZ2VcIixcbiAgICBtYXhPdGhlcnNMZW5ndGg6IFwiTWF4aW1hbGUgd2VpdGVyZSBMw6RuZ2VcIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwiTWF4aW1hbGUgWmVpdCwgdW0gZGllIFVtZnJhZ2UgenUgYmVlbmRlblwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiTWF4aW1hbGUgWmVpdCwgdW0gZWluZSBTZWl0ZSBkZXIgVW1mcmFnZSB6dSBiZWVuZGVuXCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwiUG9zaXRpb24gZGVzIFRpbWVyc1wiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCJNb2R1cyBkZXMgVGltZXJzXCIsXG4gICAgcmVuZGVyTW9kZTogXCJBbnplaWdlbW9kdXNcIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIkVybGF1YmUgZGFzIEhpbnp1ZsO8Z2VuIGVpbmVzIFBhbmVsdGV4dHNcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIkVybGF1YmUgZGFzIEVudGZlcm5lbiBlaW5lcyBQYW5lbHRleHRzXCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcIlBhbmVsdGV4dCBoaW56dWbDvGdlblwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCJQYW5lbHRleHQgZW50ZmVybmVuXCIsXG4gICAgaXNTaW5nbGVQYWdlOiBcIkFsbGUgRWxlbWVudGUgYXVmIGVpbmVyIFNlaXRlIGFuemVpZ2VuXCIsXG4gICAgaHRtbDogXCJIVE1MXCIsXG4gICAgZXhwcmVzc2lvbjogXCJBdXNkcnVja1wiLFxuXG4gICAgbWluVmFsdWU6IFwiTWluaW1hbGVyIFdlcnRcIixcbiAgICBtYXhWYWx1ZTogXCJNYXhpbWFsZXIgV2VydFwiLFxuICAgIG1pbkxlbmd0aDogXCJNaW5pbWFsZSBMw6RuZ2VcIixcbiAgICBhbGxvd0RpZ2l0czogXCJaaWZmZXJuIGVybGF1YnRcIixcbiAgICBtaW5Db3VudDogXCJNaW5pbWFsZSBBbnphaGxcIixcbiAgICBtYXhDb3VudDogXCJNYXhpbWFsZSBBbnphaGxcIixcbiAgICByZWdleDogXCJSZWd1bMOkcmVyIEF1c2RydWNrXCIsXG5cbiAgICB0b3RhbFRleHQ6IFwiVGV4dCAodG90YWwpXCIsXG4gICAgdG90YWxUeXBlOiBcIlR5cCAodG90YWwpXCIsXG4gICAgdG90YWxFeHByZXNzaW9uOiBcIkF1c2RydWNrICh0b3RhbClcIixcbiAgICB0b3RhbERpc3BsYXlTdHlsZTogXCJBbnplaWdlc3RpbCAodG90YWwpXCIsXG4gICAgdG90YWxDdXJyZW5jeTogXCJXw6RocnVuZyAodG90YWwpXCIsXG4gICAgdG90YWxGb3JtYXQ6IFwiRm9ybWF0ICh0b3RhbClcIixcblxuICAgIGxvZ29Qb3NpdGlvbjogXCJMb2dvcG9zaXRpb25cIixcbiAgICBhZGRMb2dvOiBcIkxvZ28gaGluenVmw7xnZW4gLi4uXCIsXG4gICAgY2hhbmdlTG9nbzogXCJMb2dvIGJlYXJiZWl0ZW4gLi4uXCIsXG4gICAgbG9nb1Bvc2l0aW9uczoge1xuICAgICAgbm9uZTogXCJhdXNibGVuZGVuXCIsXG4gICAgICBsZWZ0OiBcImxpbmtzXCIsXG4gICAgICByaWdodDogXCJyZWNodHNcIixcbiAgICAgIHRvcDogXCJvYmVuXCIsXG4gICAgICBib3R0b206IFwidW50ZW5cIixcbiAgICB9LFxuXG4gICAgdGFiczoge1xuICAgICAgZ2VuZXJhbDogXCJBbGxnZW1laW5cIixcbiAgICAgIGZpbGVPcHRpb25zOiBcIk9wdGlvbmVuXCIsXG4gICAgICBodG1sOiBcIkh0bWwgRWRpdG9yXCIsXG4gICAgICBjb2x1bW5zOiBcIlNwYWx0ZW5cIixcbiAgICAgIHJvd3M6IFwiWmVpbGVuXCIsXG4gICAgICBjaG9pY2VzOiBcIkF1c3dhaGxtw7ZnbGljaGtlaXRlblwiLFxuICAgICAgaXRlbXM6IFwiRWxlbWVudGVcIixcbiAgICAgIHZpc2libGVJZjogXCJTaWNodGJhciB3ZW5uIC4uLlwiLFxuICAgICAgZW5hYmxlSWY6IFwiQWt0aXZpZXJ0IHdlbm4gLi4uXCIsXG4gICAgICByZXF1aXJlZElmOiBcIkVyZm9yZGVybGljaCB3ZW5uIC4uLlwiLFxuICAgICAgaGlkZUlmQ2hvaWNlc0VtcHR5OiBcIlZlcnN0ZWNrZW4sIHdlbm4gQXVzd2FobG3DtmdsaWNoa2VpdGVuIGxlZXIgc2luZFwiLFxuICAgICAgY2hvaWNlc1Zpc2libGVJZjogXCJBdXN3YWhsbcO2Z2xpY2hrZWl0ZW4gc2ljaHRiYXIgd2VubiAuLi5cIixcbiAgICAgIGNob2ljZXNFbmFibGVJZjogXCJBdXN3YWhsbcO2Z2xpY2hrZWl0ZW4gYWt0aXZpZXJ0IHdlbm4gLi4uXCIsXG4gICAgICBjaG9pY2VzRW5hYmxlZElmOiBcIkF1c3dhaGxtw7ZnbGljaGtlaXRlbiBha3RpdmllcnQgd2VubiAuLi5cIixcbiAgICAgIHJhdGVWYWx1ZXM6IFwiQmV3ZXJ0dW5nc3NrYWxhXCIsXG4gICAgICBjaG9pY2VzQnlVcmw6IFwiQXVzd2FobG3DtmdsaWNoa2VpdGVuIGF1cyBkZW0gSW50ZXJuZXRcIixcbiAgICAgIG1hdHJpeENob2ljZXM6IFwiU3RhbmRhcmRhdXN3YWhsXCIsXG4gICAgICBtdWx0aXBsZVRleHRJdGVtczogXCJUZXh0ZWluZ2FiZVwiLFxuICAgICAgbnVtYmVyaW5nOiBcIk51bW1lcmllcnVuZ1wiLFxuICAgICAgdmFsaWRhdG9yczogXCLDnGJlcnByw7xmdW5nXCIsXG4gICAgICBuYXZpZ2F0aW9uOiBcIk5hdmlnYXRpb25cIixcbiAgICAgIHF1ZXN0aW9uOiBcIkZyYWdlblwiLFxuICAgICAgY29tcGxldGVkSHRtbDogXCJCZW51dHplcmRlZmluaWVydGUgU2VpdGUgbmFjaCBBYnNjaGx1c3MgZGVyIFVtZnJhZ2VcIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbjpcbiAgICAgICAgXCJCZWRpbmd1bmcgZGFmw7xyLCBkYXNzIGVpbmUgYmVudXR6ZXJkZWZpbml0ZXJ0ZSBTZWl0ZSBuYWNoIEFic2NobHVzcyBkZXIgVW1mcmFnZSBhbmdlemVpZ3Qgd2lyZFwiLFxuICAgICAgbG9hZGluZ0h0bWw6IFwiV2lyZCBnZWxhZGVuXCIsXG4gICAgICB0aW1lcjogXCJUaW1lclwiLFxuICAgICAgY2FsY3VsYXRlZFZhbHVlczogXCJCZXJlY2huZXRlIFdlcnRlXCIsXG4gICAgICB0cmlnZ2VyczogXCJUcmlnZ2VyXCIsXG4gICAgICB0ZW1wbGF0ZVRpdGxlOiBcIlRpdGVsdGVtcGxhdGVcIixcbiAgICAgIHRvdGFsczogXCJTdW1tZW5cIixcbiAgICAgIGxvZ2ljOiBcIkxvZ2lrXCIsXG4gICAgICBsYXlvdXQ6IFwiTGF5b3V0XCIsXG4gICAgICBkYXRhOiBcIkRhdGVuXCIsXG4gICAgICB2YWxpZGF0aW9uOiBcIlZhbGlkaWVydW5nXCIsXG4gICAgICBjZWxsczogXCJaZWxsZW5cIixcbiAgICAgIHNob3dPbkNvbXBsZXRlZDogXCJBYnNjaGx1c3NcIixcbiAgICAgIGxvZ286IFwiTG9nbyBpbSBVbWZyYWdldGl0ZWxcIixcbiAgICAgIG90aGVyczogXCJXZWl0ZXJlc1wiLFxuICAgIH0sXG4gICAgZWRpdFByb3BlcnR5OiBcIkVpZ2Vuc2NoYWZ0IGJlYXJiZWl0ZW4gJ3swfSdcIixcbiAgICBpdGVtczogXCJbIEdlZ2Vuc3RhbmQ6IHswfSBdXCIsXG5cbiAgICBlbnRlck5ld1ZhbHVlOiBcIkJpdHRlIGVpbmVuIFdlcnQgZWluZ2ViZW4uXCIsXG4gICAgbm9xdWVzdGlvbnM6IFwiRGllIFVtZnJhZ2UgZW50aMOkbHQga2VpbmUgRnJhZ2UuXCIsXG4gICAgY3JlYXRldHJpZ2dlcjogXCJCaXR0ZSBlaW5lbiBUcmlnZ2VyIGVpbmdlYmVuLlwiLFxuICAgIGtleWJvYXJkQWRvcm5lclRpcDpcbiAgICAgIFwiRHLDvGNrZW4gU2llIEVOVEVSLCB1bSBkYXMgRWxlbWVudCB6dSBiZWFyYmVpdGVuLCBFTlRGRVJORU4sIHVtIGRhcyBFbGVtZW50IHp1IGVudGZlcm5lbiwgU1RSRyArIFBGRUlMIE5BQ0ggT0JFTi9VTlRFTiwgdW0gZGFzIEVsZW1lbnQgenUgdmVyc2NoaWViZW5cIixcbiAgICB0cmlnZ2VyT246IFwiRWluXCIsXG4gICAgdHJpZ2dlck1ha2VQYWdlc1Zpc2libGU6IFwiU2VpdGVuIHNpY2h0YmFyIG1hY2hlbjpcIixcbiAgICB0cmlnZ2VyTWFrZVF1ZXN0aW9uc1Zpc2libGU6IFwiRWxlbWVudGUgc2ljaHRiYXIgbWFjaGVuOlwiLFxuICAgIHRyaWdnZXJDb21wbGV0ZVRleHQ6IFwiQmVpIEVyZm9sZyBkaWUgVW1mcmFnZSBhYnNjaGxpZXNzZW4uXCIsXG4gICAgdHJpZ2dlck5vdFNldDogXCJUcmlnZ2VyIGlzdCBuaWNodCBnZXNldHp0XCIsXG4gICAgdHJpZ2dlclJ1bklmOiBcIkF1c2bDvGhyZW4gd2VubiAuLi5cIixcbiAgICBzZXRUb05hbWU6IFwiU2V0emUgZGVuIFdlcnQgdm9uIC4uLlwiLFxuICAgIGZyb21OYW1lOiBcImFscyBLb3BpZSB2b24gLi4uXCIsXG4gICAgcnVuRXhwcmVzc2lvbjogXCJBbndlaXN1bmdcIixcbiAgICBzZXRWYWx1ZTogXCJhdWYgLi4uXCIsXG4gICAgZ290b05hbWU6IFwiR2VoZSB6dSBGcmFnZSAuLi5cIixcbiAgICB0cmlnZ2VySXNWYXJpYWJsZTogXCJWYXJpYWJsZSBuaWNodCBpbSBVbWZyYWdlZXJnZWJuaXMgZWluYmluZGVuLlwiLFxuICAgIHJ1bkV4cHJlc3Npb25FbXB0eTogXCJCaXR0ZSBnZWJlbiBTaWUgZWluZW4gZ8O8bHRpZ2VuIEF1c2RydWNrIGVpblwiLFxuICB9LFxuICAvL1Byb3BlcnR5IHZhbHVlc1xuICBwdjoge1xuICAgIHRydWU6IFwid2FoclwiLFxuICAgIGZhbHNlOiBcImZhbHNjaFwiLFxuICAgIGluaGVyaXQ6IFwidmVyZXJidFwiLFxuICAgIHNob3c6IFwiYW56ZWlnZW5cIixcbiAgICBoaWRlOiBcInZlcnN0ZWNrZW5cIixcbiAgICBkZWZhdWx0OiBcIlN0YW5kYXJkXCIsXG4gICAgaW5pdGlhbDogXCJpbml0aWFsXCIsXG4gICAgcmFuZG9tOiBcInp1ZsOkbGxpZ1wiLFxuICAgIGNvbGxhcHNlZDogXCJlaW5nZWtsYXBwdFwiLFxuICAgIGV4cGFuZGVkOiBcImF1c2dla2xhcHB0XCIsXG4gICAgbm9uZTogXCIvXCIsXG4gICAgYXNjOiBcImF1ZnN0ZWlnZW5kXCIsXG4gICAgZGVzYzogXCJhYnN0ZWlnZW5kXCIsXG4gICAgaW5kZXRlcm1pbmF0ZTogXCJ1bmVudHNjaGllZGVuXCIsXG4gICAgZGVjaW1hbDogXCJEZXppbWFsXCIsXG4gICAgY3VycmVuY3k6IFwiV8OkaHJ1bmdcIixcbiAgICBwZXJjZW50OiBcIlByb3plbnRcIixcbiAgICBmaXJzdEV4cGFuZGVkOiBcImF1c2dla2xhcHB0IChlcnN0ZXMgRWxlbWVudClcIixcbiAgICBvZmY6IFwiYXVzXCIsXG4gICAgb25QYW5lbDogXCJQYW5lbFwiLFxuICAgIG9uU3VydmV5OiBcIlVtZnJhZ2VcIixcbiAgICBsaXN0OiBcIkxpc3RlXCIsXG4gICAgcHJvZ3Jlc3NUb3A6IFwib2JlbiAoRm9ydHNjaHJpdHQpXCIsXG4gICAgcHJvZ3Jlc3NCb3R0b206IFwidW50ZW4gKEZvcnRzY2hyaXR0KVwiLFxuICAgIHByb2dyZXNzVG9wQm90dG9tOiBcIm9iZW4gdW5kIHVudGVuIChGb3J0c2Nocml0dClcIixcbiAgICBob3Jpem9udGFsOiBcImhvcml6b250YWxcIixcbiAgICB2ZXJ0aWNhbDogXCJ2ZXJ0aWthbFwiLFxuICAgIHRvcDogXCJvYmVuXCIsXG4gICAgYm90dG9tOiBcInVudGVuXCIsXG4gICAgdG9wQm90dG9tOiBcIm9iZW4gdW5kIHVudGVuXCIsXG4gICAgYm90aDogXCJiZWlkZXNcIixcbiAgICBsZWZ0OiBcImxpbmtzXCIsXG4gICAgY29sb3I6IFwiRmFyYmVcIixcbiAgICBkYXRlOiBcIkRhdHVtXCIsXG4gICAgZGF0ZXRpbWU6IFwiRGF0dW0gdW5kIFVocnplaXRcIixcbiAgICBcImRhdGV0aW1lLWxvY2FsXCI6IFwiRGF0dW0gdW5kIFVocnplaXQgKGxva2FsKVwiLFxuICAgIGVtYWlsOiBcIkUtTWFpbFwiLFxuICAgIG1vbnRoOiBcIk1vbmF0XCIsXG4gICAgbnVtYmVyOiBcIk51bW1lclwiLFxuICAgIHBhc3N3b3JkOiBcIlBhc3N3b3J0XCIsXG4gICAgcmFuZ2U6IFwiU3Bhbm5lXCIsXG4gICAgdGVsOiBcIlRlbGVmb25udW1tZXJcIixcbiAgICB0ZXh0OiBcIlRleHRcIixcbiAgICB0aW1lOiBcIlVocnplaXRcIixcbiAgICB1cmw6IFwiVVJMXCIsXG4gICAgd2VlazogXCJXb2NoZVwiLFxuICAgIGhpZGRlbjogXCJ2ZXJzdGVja3RcIixcbiAgICBvbjogXCJhblwiLFxuICAgIG9uUGFnZTogXCJhbiAodW5hYmjDpG5naWcgZsO8ciBqZWRlIFNlaXRlKVwiLFxuICAgIHVuZGVyVGl0bGU6IFwiVW50ZXJoYWxiIGRlcyBUaXRlbHNcIixcbiAgICB1bmRlcklucHV0OiBcIlVudGVyaGFsYiBkZXMgRWluZ2FiZWZlbGRzXCIsXG4gICAgZWRpdDogXCJCZWFyYmVpdGVuXCIsXG4gICAgZGlzcGxheTogXCJBbnplaWdlblwiLFxuICAgIG9uQ29tcGxldGU6IFwiV2VubiBkaWUgVW1mcmFnZSBhYmdlc2NobG9zc2VuIHd1cmRlXCIsXG4gICAgb25IaWRkZW46IFwiV2VubiBkaWUgVW1mcmFnZSB2ZXJzdGVja3Qgd3VyZGVcIixcbiAgICBvbkJsdXI6IFwiV2VubiBkYXMgRWluZ2FiZWZlbGQgdmVybGFzc2VuIHdpcmRcIixcbiAgICBvblR5cGluZzogXCJXZW5uIGluIGRhcyBFaW5nYWJlZmVsZCBnZXRpcHB0IHdpcmRcIixcbiAgICBhbGw6IFwiQWxsZVwiLFxuICAgIHBhZ2U6IFwiU2VpdGVcIixcbiAgICBwYWdlczogXCJTZWl0ZW5cIixcbiAgICBxdWVzdGlvbnM6IFwiRnJhZ2VuXCIsXG4gICAgY29ycmVjdFF1ZXN0aW9uczogXCJSaWNodGlnIGJlYW50d29ydGV0ZSBGcmFnZW5cIixcbiAgICBzdXJ2ZXk6IFwiVW1mcmFnZVwiLFxuICAgIG9uTmV4dFBhZ2U6IFwiV2VubiBkaWUgU2VpdGUgZ2V3ZWNoc2VsdCB3dXJkZVwiLFxuICAgIG9uVmFsdWVDaGFuZ2VkOiBcIldlbm4gZWluIFdlcnQgZ2XDpG5kZXJ0IHd1cmRlXCIsXG4gICAgc2luZ2xlUGFnZTogXCJBbGxlIEZyYWdlbiBhdWYgZWluZSBTZWl0ZVwiLFxuICAgIHN0YW5kYXJkOiBcIlN0YW5kYXJkXCIsXG4gICAgcXVlc3Rpb25QZXJQYWdlOiBcIkFsbGUgRnJhZ2VuIGF1ZiBlaW5lIGVpZ2VuZSBTZWl0ZVwiLFxuICAgIG5vUHJldmlldzogXCJLZWluZSBWb3JzY2hhdVwiLFxuICAgIHNob3dBbGxRdWVzdGlvbnM6IFwiVm9yc2NoYXUgbWl0IGFsbGVuIEZyYWdlbiBhbnplaWdlblwiLFxuICAgIHNob3dBbnN3ZXJlZFF1ZXN0aW9uczogXCJWb3JzY2hhdSBtaXQgYmVhbnR3b3J0ZXRlbiBGcmFnZW4gYW56ZWlnZW5cIixcbiAgICBpbWFnZTogXCJCaWxkXCIsXG4gICAgdmlkZW86IFwiVmlkZW9cIixcbiAgICBjb250YWluOiBcImJlaW5oYWx0ZW5cIixcbiAgICBjb3ZlcjogXCJiZWRlY2tlblwiLFxuICAgIGZpbGw6IFwiZsO8bGxlblwiLFxuICB9LFxuICAvL09wZXJhdG9yc1xuICBvcDoge1xuICAgIGVtcHR5OiBcImlzdCBsZWVyXCIsXG4gICAgbm90ZW1wdHk6IFwiaXN0IG5pY2h0IGxlZXJcIixcbiAgICBlcXVhbDogXCJpc3QgZ2xlaWNoXCIsXG4gICAgbm90ZXF1YWw6IFwiaXN0IHVuZ2xlaWNoXCIsXG4gICAgY29udGFpbnM6IFwiZW50aMOkbHRcIixcbiAgICBub3Rjb250YWluczogXCJlbnRow6RsdCBuaWNodFwiLFxuICAgIGFueW9mOiBcImVpbnMgYXVzXCIsXG4gICAgYWxsb2Y6IFwiYWxsZSBhdXNcIixcbiAgICBncmVhdGVyOiBcImdyw7bDn2VyIGFsc1wiLFxuICAgIGxlc3M6IFwia2xlaW5lciBhbHNcIixcbiAgICBncmVhdGVyb3JlcXVhbDogXCJncsO2w59lciBvZGVyIGdsZWljaCBhbHNcIixcbiAgICBsZXNzb3JlcXVhbDogXCJrbGVpbmVyIG9kZXIgZ2xlaWNoIGFsc1wiLFxuICAgIGFuZDogXCJ1bmRcIixcbiAgICBvcjogXCJvZGVyXCIsXG4gIH0sXG4gIC8vRW1iZWQgd2luZG93XG4gIGV3OiB7XG4gICAgYW5ndWxhcjogXCJBbmd1bGFyLVZlcnNpb24gYmVudXR6ZW5cIixcbiAgICBqcXVlcnk6IFwialF1ZXJ5LVZlcnNpb24gYmVudXR6ZW5cIixcbiAgICBrbm9ja291dDogXCJLbm9ja291dC1WZXJzaW9uIGJlbnV0emVuXCIsXG4gICAgcmVhY3Q6IFwiUmVhY3QtVmVyc2lvbiBiZW51dHplblwiLFxuICAgIHZ1ZTogXCJWdWUtVmVyc2lvbiBiZW51dHplblwiLFxuICAgIGJvb3RzdHJhcDogXCJBbHMgQm9vdHN0cmFwIEZyYW1ld29ya1wiLFxuICAgIHN0YW5kYXJkOiBcIktlaW4gQm9vdHN0cmFwXCIsXG4gICAgc2hvd09uUGFnZTogXCJVbWZyYWdlIGF1ZiBTZWl0ZSBhbnplaWdlblwiLFxuICAgIHNob3dJbldpbmRvdzogXCJVbWZyYWdlIGFscyBGZW5zdGVyIGFuemVpZ2VuXCIsXG4gICAgbG9hZEZyb21TZXJ2ZXI6IFwiTGFkZSBVbWZyYWdlIGFscyBKU09OIHZvbSBTZXJ2ZXJcIixcbiAgICB0aXRsZVNjcmlwdDogXCJTa3JpcHRlIHVuZCBTdHlsZXNcIixcbiAgICB0aXRsZUh0bWw6IFwiSFRNTFwiLFxuICAgIHRpdGxlSmF2YVNjcmlwdDogXCJKYXZhU2NyaXB0XCIsXG4gIH0sXG4gIC8vVGVzdCBTdXJ2ZXlcbiAgdHM6IHtcbiAgICBzZWxlY3RQYWdlOiBcIlNlaXRlOlwiLFxuICAgIHNob3dJbnZpc2libGVFbGVtZW50czogXCJVbnNpY2h0YmFyZSBFbGVtZW50ZSBhbnplaWdlblwiLFxuICB9LFxuICB2YWxpZGF0b3JzOiB7XG4gICAgYW5zd2VyY291bnR2YWxpZGF0b3I6IFwiQW50d29ydGFuemFobFwiLFxuICAgIGVtYWlsdmFsaWRhdG9yOiBcIkUtTWFpbFwiLFxuICAgIGV4cHJlc3Npb252YWxpZGF0b3I6IFwiQXVzZHJ1Y2tcIixcbiAgICBudW1lcmljdmFsaWRhdG9yOiBcIlphaGxcIixcbiAgICByZWdleHZhbGlkYXRvcjogXCJSZWd1bMOkcmVyIEF1c2RydWNrXCIsXG4gICAgdGV4dHZhbGlkYXRvcjogXCJUZXh0XCIsXG4gIH0sXG4gIHRyaWdnZXJzOiB7XG4gICAgY29tcGxldGV0cmlnZ2VyOiBcIlVtZnJhZ2UgYWJzY2hsaWXDn2VuXCIsXG4gICAgc2V0dmFsdWV0cmlnZ2VyOiBcIldlcnQgc2V0emVuXCIsXG4gICAgY29weXZhbHVldHJpZ2dlcjogXCJXZXJ0IGtvcGllcmVuXCIsXG4gICAgc2tpcHRyaWdnZXI6IFwiRnJhZ2Ugd2VjaHNlbG5cIixcbiAgICBydW5leHByZXNzaW9udHJpZ2dlcjogXCJBbndlaXN1bmcgYXVzZsO8aHJlblwiLFxuICAgIHZpc2libGV0cmlnZ2VyOiBcIlNpY2h0YmFya2VpdCDDpG5kZXJuIChkZXByZWNhdGVkKVwiLFxuICB9LFxuICAvL1Byb3BlcnRpZXNcbiAgcDoge1xuICAgIG5hbWU6IFwiTmFtZVwiLFxuICAgIHRpdGxlOiB7XG4gICAgICBuYW1lOiBcIlRpdGVsXCIsXG4gICAgICB0aXRsZTogJ0JpdHRlIGxlZXIgbGFzc2VuLCBmYWxscyBnbGVpY2ggd2llIFwiTmFtZVwiJyxcbiAgICB9LFxuXG4gICAgbmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5OiBcIlNpY2h0YmFya2VpdCBkZXIgTmF2aWdhdGlvbnNidXR0b25zXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwiUmVpaGVuZm9sZ2UgZGVyIEZyYWdlblwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJNYXhpbWFsZSBaZWl0LCB1bSBkaWUgVW1mcmFnZSBhYnp1c2NobGllw59lblwiLFxuXG4gICAgdmlzaWJsZTogXCJTaWNodGJhclwiLFxuICAgIHZpc2libGVJZjogXCJTaWNodGJhciB3ZW5uIC4uLlwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJQb3NpdGlvbiBkZXIgRnJhZ2VudGl0ZWxcIixcbiAgICBxdWVzdGlvbkRlc2NyaXB0aW9uTG9jYXRpb246IFwiUG9zaXRpb24gZGVyIEZyYWdlbmJlc2NocmVpYnVuZ1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJlc2NocmVpYnVuZ1wiLFxuICAgIHN0YXRlOiBcIlN0YXR1c1wiLFxuICAgIGlzUmVxdWlyZWQ6IFwiSXN0IGVyZm9yZGVybGljaFwiLFxuICAgIHJlcXVpcmVkSWY6IFwiRXJmb3JkZXJsaWNoIHdlbm4gLi4uXCIsXG4gICAgY2hvaWNlc1Zpc2libGVJZjogXCJBdXN3YWhsbcO2Z2xpY2hrZWl0ZW4gc2ljaHRiYXIgd2VubiAuLi5cIixcbiAgICBjaG9pY2VzRW5hYmxlSWY6IFwiQXVzd2FobG3DtmdsaWNoa2VpdGVuIGFrdGl2aWVydCB3ZW5uIC4uLlwiLFxuICAgIGNob2ljZXNFbmFibGVkSWY6IFwiQXVzd2FobG3DtmdsaWNoa2VpdGVuIGFrdGl2aWVydCB3ZW5uIC4uLlwiLFxuICAgIHJvd3NWaXNpYmxlSWY6IFwiWmVpbGVuIHNpY2h0YmFyIHdlbm4gLi4uXCIsXG4gICAgY29sdW1uc1Zpc2libGVJZjogXCJTcGFsdGVuIHNpY2h0YmFyIHdlbm4gLi4uXCIsXG4gICAgaW5kZW50OiBcIkVpbnp1Z1wiLFxuICAgIHJlcXVpcmVkRXJyb3JUZXh0OlxuICAgICAgXCJGZWhsZXJtZWxkdW5nIGJlaSBuaWNodCBiZWFudHdvcnRldGVuIGVyZm9yZGVybGljaGVuIEZyYWdlblwiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwiU3RhcnRlIG1pdCBuZXVlciBaZWlsZVwiLFxuICAgIGlubmVySW5kZW50OiBcIklubmVyZXIgRWluenVnXCIsXG4gICAgcGFnZTogXCJTZWl0ZVwiLFxuXG4gICAgd2lkdGg6IFwiQnJlaXRlXCIsXG5cbiAgICBjb21tZW50VGV4dDogXCJLb21tZW50YXJiZXNjaHJlaWJ1bmdcIixcbiAgICB2YWx1ZU5hbWU6IFwiTmFtZSBkZXIgQW50d29ydFwiLFxuICAgIGVuYWJsZUlmOiBcIkFrdGl2aWVydCB3ZW5uIC4uLlwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJTdGFuZGFyZGFudHdvcnRcIixcbiAgICBjb3JyZWN0QW5zd2VyOiBcIlJpY2h0aWdlIEFudHdvcnRcIixcbiAgICByZWFkT25seTogXCJTY2hyZWliZ2VzY2jDvHR6dD9cIixcbiAgICB2YWxpZGF0b3JzOiBcIlZhbGlkaWVydW5nZW5cIixcbiAgICB0aXRsZUxvY2F0aW9uOiBcIlBvc2l0aW9uIGRlcyBUaXRlbHNcIixcbiAgICBkZXNjcmlwdGlvbkxvY2F0aW9uOiBcIlBvc2l0aW9uIGRlciBCZXNjaHJlaWJ1bmdcIixcbiAgICB1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZTogXCJWZXJ3ZW5kZSBBbnplaWdld2VydGUgaW0gVGl0ZWxcIixcblxuICAgIGhhc0NvbW1lbnQ6IFwiS29tbWVudGFyZSBlcmxhdWJ0P1wiLFxuICAgIGhhc090aGVyOiBcIlNvbnN0aWdlcyBhdXN3w6RobGJhcj9cIixcbiAgICBzZWxlY3RBbGxUZXh0OiBcIlRleHQgZsO8ciBkaWUgQXVzd2FobCBhbGxlciBFbGVtZW50ZVwiLFxuICAgIGNob2ljZXM6IFwiQXVzd2FobG3DtmdsaWNoa2VpdGVuXCIsXG4gICAgY2hvaWNlc09yZGVyOiBcIkF1c3dhaGxyZWloZW5mb2xnZVwiLFxuICAgIGNob2ljZXNCeVVybDogXCJBdXN3YWhscmVpaGVuZm9sZ2UgbmFjaCBVUkxcIixcbiAgICBvdGhlclRleHQ6IFwiVGV4dFwiLFxuICAgIG90aGVyUGxhY2VIb2xkZXI6IFwiUGxhdHpoYWx0ZXJcIixcbiAgICBvdGhlckVycm9yVGV4dDogXCJGZWhsZXJtZWxkdW5nXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiU3BlaWNoZXJlIGFuZGVyZSBXZXJ0ZSBhbHMgS29tbWVudGFyXCIsXG5cbiAgICBsYWJlbDogXCJMYWJlbFwiLFxuICAgIGxhYmVsVHJ1ZTogJ0FuemVpZ2V3ZXJ0IGbDvHIgXCJKYVwiJyxcbiAgICBsYWJlbEZhbHNlOiAnQW56ZWlnZXdlcnQgZsO8ciBcIk5laW5cIicsXG4gICAgc2hvd1RpdGxlOiBcIlRpdGVsIGFuemVpZ2VuXCIsXG4gICAgc2hvd0hlYWRlcjogXCJTcGFsdGVubmFtZW4gYW56ZWlnZW5cIixcbiAgICB2YWx1ZVRydWU6ICdXZXJ0IGbDvHIgXCJKYVwiJyxcbiAgICB2YWx1ZUZhbHNlOiAnV2VydCBmw7xyIFwiTmVpblwiJyxcblxuICAgIG11bHRpU2VsZWN0OiBcIk1laHJmYWNoYXVzd2FobFwiLFxuICAgIGNvbnRlbnRNb2RlOiBcIk1vZHVzXCIsXG4gICAgaW1hZ2VGaXQ6IFwiQmlsZGRhcnN0ZWxsdW5nXCIsXG4gICAgc2hvd0xhYmVsOiBcIldlcnQgYW56ZWlnZW5cIixcblxuICAgIGNvbHM6IFwiU3BhbHRlblwiLFxuICAgIHJvd3M6IFwiWmVpbGVuXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwiUGxhdHpoYWx0ZXJcIixcblxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIkF1c3dhaGxiZXNjaHJpZnR1bmdcIixcblxuICAgIGV4cHJlc3Npb246IFwiQXVzZHJ1Y2tcIixcbiAgICBmb3JtYXQ6IFwiRm9ybWF0XCIsXG4gICAgZGlzcGxheVN0eWxlOiBcIkFuemVpZ2VzdGlsXCIsXG4gICAgY3VycmVuY3k6IFwiV8OkaHJ1bmdcIixcbiAgICB1c2VHcm91cGluZzogXCJHcnVwcGllcnVuZyB2ZXJ3ZW5kZW5cIixcblxuICAgIHNob3dQcmV2aWV3OiBcIlZvcnNjaGF1IGFuemVpZ2VuXCIsXG4gICAgYWxsb3dNdWx0aXBsZTogXCJNZWhyZXJlIEFudHdvcnRlbiBlcmxhdWJlblwiLFxuICAgIGltYWdlSGVpZ2h0OiBcIkJpbGRow7ZoZVwiLFxuICAgIGltYWdlV2lkdGg6IFwiQmlsZGJyZWl0ZVwiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCJEYXRlbiBhbHMgVGV4dCBzcGVpY2hlcm5cIixcbiAgICBtYXhTaXplOiBcIk1heGltYWxlIEdyw7bDn2VcIixcblxuICAgIGh0bWw6IFwiSFRNTFwiLFxuXG4gICAgY29sdW1uczogXCJTcGFsdGVuXCIsXG4gICAgY2VsbHM6IFwiWmVsbGVuXCIsXG4gICAgaXNBbGxSb3dSZXF1aXJlZDogXCJTaW5kIGFsbGUgWmVpbGVuIGVyZm9yZGVybGljaD9cIixcblxuICAgIGhvcml6b250YWxTY3JvbGw6IFwiSG9yaXpvbnRhbGVzIFNjcm9sbGVuXCIsXG4gICAgY2VsbFR5cGU6IFwiWmVsbHR5cFwiLFxuICAgIGNvbHVtbnNMYXlvdXQ6IFwiU3BhbHRlbmxheW91dFwiLFxuICAgIGNvbHVtbkNvbENvdW50OiBcIlNwYWx0ZW5hbnphaGxcIixcbiAgICBjb2x1bW5NaW5XaWR0aDogXCJNaW5pbWFsZSBTcGFsdGVuYnJlaXRlXCIsXG5cbiAgICByb3dDb3VudDogXCJaZWlsZW5hbnphaGxcIixcbiAgICBtaW5Sb3dDb3VudDogXCJNaW5pbWFsZSBaZWlsZW5hbnphaGxcIixcbiAgICBtYXhSb3dDb3VudDogXCJNYXhpbWFsZSBTcGFsdGVuYW56YWhsXCIsXG4gICAga2V5TmFtZTogXCJTY2hsw7xzc2VsbmFtZVwiLFxuICAgIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRmVobGVybWVsZHVuZyBmw7xyIGRvcHBlbHRlbiBTY2hsw7xzc2VsXCIsXG4gICAgY29uZmlybURlbGV0ZTogXCJCZXN0w6R0aWd1bmcgZGVyIEzDtnNjaHVuZ1wiLFxuICAgIGNvbmZpcm1EZWxldGVUZXh0OiBcIlRleHQgZsO8ciBCZXN0w6R0aWd1bmcgZGVyIEzDtnNjaHVuZ1wiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcIlplaWxlbmtub3BmcG9zaXRpb24gaGluenVmw7xnZW5cIixcbiAgICBhZGRSb3dUZXh0OiBcIlplaWxlbmtub3BmdGV4dCBoaW56dWbDvGdlblwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwiWmVpbGVua25vcGZ0ZXh0IGzDtnNjaGVuXCIsXG5cbiAgICBpdGVtczogXCJFbGVtZW50ZVwiLFxuICAgIGl0ZW1TaXplOiBcIkVsZW1lbnRncsO2w59lXCIsXG4gICAgY29sQ291bnQ6IFwiU3BhbHRlbmFuemFobFwiLFxuXG4gICAgdGVtcGxhdGVUaXRsZTogXCJUZW1wbGF0ZSBmw7xyIGRlbiBUaXRlbFwiLFxuICAgIHRlbXBsYXRlRGVzY3JpcHRpb246IFwiVGVtcGxhdGUgZsO8ciBkaWUgQmVzY2hyZWlidW5nXCIsXG4gICAgYWxsb3dBZGRQYW5lbDogXCJFcmxhdWJlIGRhcyBIaW56dWbDvGdlbiBlaW5lcyBQYW5lbHRleHRzXCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCJFcmxhdWJlIGRhcyBFbnRmZXJuZW4gZWluZXMgUGFuZWx0ZXh0c1wiLFxuICAgIHBhbmVsQ291bnQ6IFwiUGFuZWxhbnphaGxcIixcbiAgICBtaW5QYW5lbENvdW50OiBcIk1pbmltYWxlIFBhbmVsYW56YWhsXCIsXG4gICAgbWF4UGFuZWxDb3VudDogXCJNYXhpbWFsZSBQYW5lbGFuemFobFwiLFxuICAgIHBhbmVsc1N0YXRlOiBcIlBhbmVsenVzdGFuZFwiLFxuICAgIHBhbmVsQWRkVGV4dDogXCJUZXh0IGbDvHIgZGFzIEhpbnp1ZsO8Z2VuIGVpbmVzIFBhbmVsc1wiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCJUZXh0IGbDvHIgZGFzIEVudGZlcm5lbiBlaW5lcyBQYW5lbHNcIixcbiAgICBwYW5lbFByZXZUZXh0OiBcIlRleHQgZsO8ciBkaWUgTmF2aWdhdGlvbiB6dW0gdm9yaGVyaWdlbiBQYW5lbFwiLFxuICAgIHBhbmVsTmV4dFRleHQ6IFwiVGV4dCBmw7xyIGRpZSBOYXZpZ2F0aW9uIHp1bSBuw6RjaHN0ZW4gUGFuZWxcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIkZyYWdlbnVtbWVybiBhbnplaWdlblwiLFxuICAgIHRleHRVcGRhdGVNb2RlOiBcIlRleHQgYWt0dWFsaXNpZXJlblwiLFxuICAgIHNob3dSYW5nZUluUHJvZ3Jlc3M6IFwiRm9ydHNjaHJpdHRzYmFsa2VuIGFuemVpZ2VuXCIsXG4gICAgcmVuZGVyTW9kZTogXCJBbnplaWdlbW9kdXNcIixcbiAgICB0ZW1wbGF0ZVRpdGxlTG9jYXRpb246IFwiVGVtcGxhdGUgZsO8ciBkaWUgVGl0ZWxwb3NpdGlvblwiLFxuXG4gICAgcmF0ZVZhbHVlczogXCJCZXdlcnR1bmdzc2thbGFcIixcbiAgICByYXRlTWluOiBcIk1pbmltYWxcIixcbiAgICByYXRlTWF4OiBcIk1heGltYWxcIixcbiAgICByYXRlU3RlcDogXCJCZXdlcnR1bmdzc2Nocml0dGVcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwiQmV3ZXJ0dW5nc2Jlc2NocmVpYnVuZyBmw7xyIG1pbmltYWxlIEJld2VydHVuZ1wiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCJCZXdlcnR1bmdzYmVzY2hyZWlidW5nIGbDvHIgbWF4aW1hbGUgQmV3ZXJ0dW5nXCIsXG5cbiAgICBpbnB1dFR5cGU6IFwiRWluZ2FiZXR5cFwiLFxuICAgIHNpemU6IFwiR3LDtsOfZVwiLFxuXG4gICAgbG9jYWxlOiBcIlNwcmFjaGVcIixcbiAgICBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWM6IFwiRm9rdXNzaWVyZSBhdXRvbWF0aXNjaCBkaWUgZXJzdGUgRnJhZ2VcIixcbiAgICBjb21wbGV0ZWRIdG1sOlxuICAgICAgXCJJbmhhbHQsIGRlciBuYWNoIEFic2NobHVzcyBkZXIgVW1mcmFnZSBhbmdlemVpZ3Qgd2lyZCAoSFRNTClcIixcbiAgICBjb21wbGV0ZWRCZWZvcmVIdG1sOlxuICAgICAgXCJJbmhhbHQsIGRlciB2b3IgQWJzY2hsdXNzIGRlciBVbWZyYWdlIGFuZ2V6ZWlndCB3aXJkIChIVE1MKVwiLFxuICAgIGxvYWRpbmdIdG1sOiBcIkluaGFsdCwgZGVyIGJlaW0gTGFkZW4gZGVyIFVtZnJhZ2UgYW5nZXplaWd0IHdpcmQgKEhUTUwpXCIsXG4gICAgdHJpZ2dlcnM6IFwiVHJpZ2dlclwiLFxuICAgIGNhbGN1bGF0ZWRWYWx1ZXM6IFwiQmVyZWNobmV0ZSBXZXJ0ZVwiLFxuICAgIGluY2x1ZGVJbnRvUmVzdWx0OiBcIlZhcmlhYmxlIGltIFVtZnJhZ2VlcmdlYm5pcyBlaW5iaW5kZW5cIixcbiAgICBjb29raWVOYW1lOiBcIkNvb2tpZW5hbWVcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDpcbiAgICAgIFwiU2VuZGUgVW1mcmFnZWVyZ2Vibmlzc2UgYmVpbSBCZXRyZXRlbiBkZXIgbsOkY2hzdGVuIFNlaXRlXCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIkFuemVpZ2UgZGVyIE5hdmlnYXRpb25zYnV0dG9uc1wiLFxuICAgIHNob3dQcmV2QnV0dG9uOlxuICAgICAgXCJCdXR0b24gZsO8ciBkaWUgdm9yaGVyaWdlIFNlaXRlIGFuemVpZ2VuIChCZW51dHplciBrw7ZubmVuIGF1ZiBkaWUgdm9yaGVyaWdlIFNlaXRlIHp1csO8Y2trZWhyZW4pXCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwiU2VpdGVuYmVzY2hyZWlidW5nIGFuemVpZ2VuXCIsXG4gICAgbmF2aWdhdGVUb1VybDogXCJXZWl0ZXJsZWl0dW5nIChVUkwpXCIsXG4gICAgbmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uOiBcIkJlZGluZ3RlIFdlaXRlcmxlaXR1bmcgKFVSTClcIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCJOYWNoIEFic2NobHVzcyBkaWUgYXVzZ2Vmw7xsbHRlIFVtZnJhZ2UgYW56ZWlnZW5cIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwiU2VpdGVubnVtbWVybiBhbnplaWdlblwiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJQb3NpdGlvbiBkZXIgRmVobGVybWVsZHVuZ2VuXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIkZvcnRzY2hyaXR0c2JhbGtlbiBhbnplaWdlblwiLFxuICAgIHByb2dyZXNzQmFyVHlwZTogXCJGb3J0c2Nocml0dHNiYWxrZW50eXBcIixcbiAgICBxdWVzdGlvbnNPblBhZ2VNb2RlOiBcIkF1ZnRlaWx1bmcgYXVmIFNlaXRlblwiLFxuICAgIG1vZGU6IFwiTW9kdXMgKGVkaXRpZXJiYXIvc2NocmVpYmdlc2Now7x0enQpXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzpcbiAgICAgIFwiV2VubiBhbGxlIEZyYWdlbiBhdWYgZWluZXIgU2VpdGUgYmVhbnR3b3J0ZXQgc2luZCwgZ2VoZSBhdXRvbWF0aXNjaCB6dXIgbsOkY2hzdGVuIFNlaXRlblwiLFxuICAgIGZvY3VzT25GaXJzdEVycm9yOiBcIkZva3Vzc2llcmUgZGVuIGVyc3RlbiBGZWhsZXJcIixcbiAgICBjaGVja0Vycm9yc01vZGU6IFwiV2FubiB3ZXJkZW4gRmVobGVyIMO8YmVycHLDvGZ0P1wiLFxuICAgIGNsZWFySW52aXNpYmxlVmFsdWVzOiBcIkFsbGUgdW5zaWNodGJhcmVuIFdlcnRlIGxlZXJlblwiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJUZXh0IGRlcyBTdGFydGJ1dHRvbnNcIixcbiAgICBwYWdlUHJldlRleHQ6IFwiVGV4dCBkZXMgQnV0dG9ucyBmw7xyIGRpZSB2b3JoZXJpZ2UgU2VpdGVcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiVGV4dCBkZXMgQnV0dG9ucyBmw7xyIGRpZSBuw6RjaHN0ZSBTZWl0ZVwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJUZXh0IGRlcyBBYnNjaGxpZcOfZW5idXR0b25zXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcIlN5bWJvbCBmw7xyIGVyZm9yZGVybGljaGUgRnJhZ2VuXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiAnU3RhcnRpbmRleCBkZXIgRnJhZ2VuIChic3B3LiBcIjFcIiwgXCJBXCIsIFwiYVwiLCAuLi4pJyxcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6XG4gICAgICAnVGVtcGxhdGUgZsO8ciBkZW4gRnJhZ2VudGl0ZWwuIFN0YW5kYXJkIGlzdDogXCJ7bm99LiB7cmVxdWlyZX0ge3RpdGxlfVwiJyxcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwiRGllIGVyc3RlIFNlaXRlIGRlciBVbWZyYWdlIGlzdCBkaWUgU3RhcnRzZWl0ZVwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJBbGxlIEVsZW1lbnRlIGF1ZiBlaW5lciBTZWl0ZSBhbnplaWdlblwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiTWF4aW1hbGUgWmVpdCwgdW0gZWluZSBTZWl0ZSBkZXIgVW1mcmFnZSB6dSBiZWVuZGVuXCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwiVGltZXJwYW5lbHBvc2l0aW9uXCIsXG4gICAgc2hvd1RpbWVyUGFuZWxNb2RlOiBcIlRpbWVycGFuZWxtb2R1c1wiLFxuICAgIGhpZGVJZkNob2ljZXNFbXB0eTogXCJWZXJzdGVja2VuLCB3ZW5uIEF1c3dhaGxtw7ZnbGljaGtlaXRlbiBsZWVyIHNpbmRcIixcblxuICAgIGRlZmF1bHRQYW5lbFZhbHVlOiBcIlN0YW5kYXJkd2VydCBmw7xyIFBhbmVsc1wiLFxuICAgIGRlZmF1bHRSb3dWYWx1ZTogXCJTdGFuZGFyZHdlcnQgZsO8ciBaZWlsZW5cIixcbiAgICBkZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsOiBcIlN0YW5kYXJkd2VydCB2b20gbGV0enRlbiBQYW5lbFwiLFxuICAgIGhhc05vbmU6IFwiQWxsZSBFbGVtZW50ZSBhYnfDpGhsYmFyP1wiLFxuICAgIG5vbmVUZXh0OiBcIlRleHRcIixcbiAgICByb3dzT3JkZXI6IFwiWmVpbGVuc29ydGllcnVuZ1wiLFxuXG4gICAgdGV4dDogXCJUZXh0XCIsXG4gIH0sXG59O1xuXG5lZGl0b3JMb2NhbGl6YXRpb24ubG9jYWxlc1tcImRlXCJdID0gZ2VybWFuVHJhbnNsYXRpb247XG4iLCJpbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5cbmV4cG9ydCB2YXIgaHVTdHJpbmdzID0ge1xuICAvL3N1cnZleSB0ZW1wbGF0ZXNcbiAgc3VydmV5OiB7XG4gICAgZWRpdDogXCJTemVya2VzenTDqXNcIixcbiAgICBleHRlcm5hbEhlbHBMaW5rOiBcIk7DqXp6ZSBtZWcsIGhvZ3lhbiBrZWxsIGvDqXJkxZHDrXZla2V0IGvDqXN6w610ZW5pLlwiLFxuICAgIGV4dGVybmFsSGVscExpbmtVcmw6XG4gICAgICBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2NoYW5uZWwvVUNIMnJ1OW9rSWNvb05aZnBJYnlxNHFRP3ZpZXdfYXM9c3Vic2NyaWJlclwiLFxuICAgIGRyb3BRdWVzdGlvbjogXCJLw6lyZW0gZG9iam9uIGlkZSBlZ3kga8OpcmTDqXN0IGEgYmFsIG9sZGFsaSBtZW7DvGLFkWwuXCIsXG4gICAgY29weTogXCJNw6Fzb2zDoXNcIixcbiAgICBhZGRUb1Rvb2xib3g6IFwiSG96esOhYWTDoXMgYXogZXN6a8O2enTDoXJob3pcIixcbiAgICBkZWxldGVQYW5lbDogXCJQYW5lbCBlbHTDoXZvbMOtdMOhc2FcIixcbiAgICBkZWxldGVRdWVzdGlvbjogXCJLw6lyZMOpcyBlbHTDoXZvbMOtdMOhc2FcIixcbiAgICBjb252ZXJ0VG86IFwiS29udmVydMOhbMOhc1wiLFxuICAgIGRyYWc6IFwiRWxlbSBtb3pnYXTDoXNhXCJcbiAgfSxcbiAgLy9xdWVzdGlvblR5cGVzXG4gIHF0OiB7XG4gICAgZGVmYXVsdDogXCJBbGFww6lydGVsbWV6ZXR0XCIsXG4gICAgY2hlY2tib3g6IFwiSmVsw7ZsxZFuw6lneXpldFwiLFxuICAgIGNvbW1lbnQ6IFwiTWVnamVneXrDqXNcIixcbiAgICBpbWFnZXBpY2tlcjogXCJLw6lwdsOhbGFzenTDs1wiLFxuICAgIGRyb3Bkb3duOiBcIkxlZ8O2cmTDvGzFkVwiLFxuICAgIGZpbGU6IFwiw4FsbG9tw6FueVwiLFxuICAgIGh0bWw6IFwiSFRNTFwiLFxuICAgIG1hdHJpeDogXCJNw6F0cml4IChlZ3l2w6FsYXN6dMOzcylcIixcbiAgICBtYXRyaXhkcm9wZG93bjogXCJNw6F0cml4ICh0w7ZiYnbDoWxhc3p0w7NzKVwiLFxuICAgIG1hdHJpeGR5bmFtaWM6IFwiTcOhdHJpeCAoZGluYW1pa3VzKVwiLFxuICAgIG11bHRpcGxldGV4dDogXCJUw7ZiYnNvcm9zIHN6w7Z2ZWdcIixcbiAgICBwYW5lbDogXCJQYW5lbFwiLFxuICAgIHBhbmVsZHluYW1pYzogXCJQYW5lbCAoZGluYW1pa3VzKVwiLFxuICAgIHJhZGlvZ3JvdXA6IFwiVsOhbGFzenTDs2dvbWJcIixcbiAgICByYXRpbmc6IFwiw4lydMOpa2Vsw6lzXCIsXG4gICAgdGV4dDogXCJFZ3lzb3JvcyBzesO2dmVnXCIsXG4gICAgYm9vbGVhbjogXCJJZ2F6LWhhbWlzXCIsXG4gICAgZXhwcmVzc2lvbjogXCJLaWZlamV6w6lzIChjc2FrIG9sdmFzaGF0w7MpXCIsXG4gICAgZmxvd3BhbmVsOiBcIkZvbHlhbWF0XCJcbiAgfSxcbiAgLy9TdHJpbmdzIGluIEVkaXRvclxuICBlZDoge1xuICAgIGRlZmF1bHRMb2NhbGU6IFwiQWxhcMOpcnRlbG1lemV0dCAoezB9KVwiLFxuICAgIHN1cnZleTogXCJLw6lyZMWRw612XCIsXG4gICAgc2V0dGluZ3M6IFwiS8OpcmTFkcOtdmJlw6FsbMOtdMOhc29rXCIsXG4gICAgb3BqZWN0UHJvcGVydGllc0hlYWRlcjogXCJIYWxhZMOzXCIsXG4gICAgc2hvd09iamVjdFByb3BlcnRpZXM6IFwiVHVsYWpkb25zw6Fnb2sgbXV0YXTDoXNhXCIsXG4gICAgaGlkZU9iamVjdFByb3BlcnRpZXM6IFwiVHVsYWpkb25zw6Fnb2sgZWxyZWp0w6lzZVwiLFxuICAgIGVkaXRTdXJ2ZXk6IFwiS8OpcmTFkcOtdiBzemVya2VzenTDqXNlXCIsXG4gICAgYWRkTmV3UGFnZTogXCLDmmogbGFwIGZlbHbDqXRlbGVcIixcbiAgICBtb3ZlUmlnaHQ6IFwiR8O2cmdldMOpcyBqb2JicmFcIixcbiAgICBtb3ZlTGVmdDogXCJHw7ZyZ2V0w6lzIGJhbHJhXCIsXG4gICAgZGVsZXRlUGFnZTogXCJMYXAgZWx0w6F2b2zDrXTDoXNhXCIsXG4gICAgZWRpdFBhZ2U6IFwiTGFwIHN6ZXJrZXN6dMOpc2VcIixcbiAgICBlZGl0OiBcIlN6ZXJrZXN6dMOpc1wiLFxuICAgIG5ld1BhZ2VOYW1lOiBcImxhcFwiLFxuICAgIG5ld1F1ZXN0aW9uTmFtZTogXCJrw6lyZMOpc1wiLFxuICAgIG5ld1BhbmVsTmFtZTogXCJwYW5lbFwiLFxuICAgIG5ld1RleHRJdGVtTmFtZTogXCJzesO2dmVnXCIsXG4gICAgdGVzdFN1cnZleTogXCJQcsOzYmFcIixcbiAgICB0ZXN0U3VydmV5QWdhaW46IFwiUHLDs2JhIGlzbcOpdFwiLFxuICAgIHRlc3RTdXJ2ZXlXaWR0aDogXCJLw6lyZMWRw612IHN6w6lsZXNzw6lnZTogXCIsXG4gICAgZW1iZWRTdXJ2ZXk6IFwiS8OpcmTFkcOtdiBiZcOhZ3lhesOhc2FcIixcbiAgICB0cmFuc2xhdGlvbjogXCJGb3Jkw610w6FzXCIsXG4gICAgc2F2ZVN1cnZleTogXCJLw6lyZMWRw612IG1lbnTDqXNlXCIsXG4gICAgZGVzaWduZXI6IFwiS8OpcmTFkcOtdnRlcnZlesWRXCIsXG4gICAganNvbkVkaXRvcjogXCJKU09OIHN6ZXJrZXN6dMWRXCIsXG4gICAgdW5kbzogXCJNw6lnc2VcIixcbiAgICByZWRvOiBcIklzbcOpdFwiLFxuICAgIG9wdGlvbnM6IFwiQmXDoWxsw610w6Fzb2tcIixcbiAgICBnZW5lcmF0ZVZhbGlkSlNPTjogXCLDiXJ2w6lueWVzIEpTT04gZ2VuZXLDoWzDoXNhXCIsXG4gICAgZ2VuZXJhdGVSZWFkYWJsZUpTT046IFwiT2x2YXNoYXTDsyBKU09OIGdlbmVyw6Fsw6FzYVwiLFxuICAgIHRvb2xib3g6IFwiRXN6a8O2enTDoXJcIixcbiAgICB0b29sYm94R2VuZXJhbENhdGVnb3J5OiBcIsOBbHRhbMOhbm9zXCIsXG4gICAgZGVsU2VsT2JqZWN0OiBcIktpamVsw7ZsdCBlbGVtIGVsdMOhdm9sw610w6FzYVwiLFxuICAgIGVkaXRTZWxPYmplY3Q6IFwiS2lqZWzDtmx0IGVsZW0gc3plcmtlc3p0w6lzZVwiLFxuICAgIGNvcnJlY3RKU09OOiBcIkvDqXJlbSBqYXbDrXRzYSBhIEpTT04tdC5cIixcbiAgICBzdXJ2ZXlSZXN1bHRzOiBcIkvDqXJkxZHDrXYgZXJlZG3DqW55ZTogXCIsXG4gICAgc3VydmV5UmVzdWx0c1RhYmxlOiBcIlTDoWJsYWvDqW50XCIsXG4gICAgc3VydmV5UmVzdWx0c0pzb246IFwiSlNPTi1rw6ludFwiLFxuICAgIHJlc3VsdHNUaXRsZTogXCJLw6lyZMOpcyBjw61tZVwiLFxuICAgIHJlc3VsdHNOYW1lOiBcIkvDqXJkw6lzIG1lZ25ldmV6w6lzZVwiLFxuICAgIHJlc3VsdHNWYWx1ZTogXCJWw6FsYXN6IMOpcnTDqWtlXCIsXG4gICAgcmVzdWx0c0Rpc3BsYXlWYWx1ZTogXCJLaWplbHpldHQgw6lydMOpa2VcIixcbiAgICBtb2RpZmllZDogXCJNw7Nkb3PDrXRvdHRcIixcbiAgICBzYXZpbmc6IFwiTWVudMOpcyBmb2x5YW1hdGJhblwiLFxuICAgIHNhdmVkOiBcIk1lbnR2ZVwiLFxuICAgIHNhdmVFcnJvcjogXCJIaWJhISBBIHN6ZXJrZXN6dMWRIMOpcnTDqWtlIG5lbSBrZXLDvGx0IG1lbnTDqXNyZS5cIixcbiAgICB0cmFuc2xhdGlvbkFkZExhbmd1YWdlOiBcIlbDoWxhc3N6b24gZWd5IG55ZWx2ZXQgYSBmb3Jkw610w6FzaG96LlwiLFxuICAgIHRyYW5zbGF0aW9uU2hvd0FsbFN0cmluZ3M6IFwiw5Zzc3plcyBzesO2dmVnIG11dGF0w6FzYVwiLFxuICAgIHRyYW5zbGF0aW9uU2hvd0FsbFBhZ2VzOiBcIsOWc3N6ZXMgbGFwIG11dGF0w6FzYVwiLFxuICAgIHRyYW5zbGF0aW9uTm9TdHJpbmdzOiBcIk5pbmNzIGZvcmTDrXRoYXTDsyBzesO2dmVnLiBLw6lyZW0gdsOhbHRvenRhc3NvbiBhIHN6xbFyw6lzaSBmZWx0w6l0ZWxla2VuLlwiLFxuICAgIHRyYW5zbGF0aW9uRXhwb3J0VG9TQ1ZCdXR0b246IFwiTWVudMOpcyBDU1Yta8OpbnRcIixcbiAgICB0cmFuc2xhdGlvbkltcG9ydEZyb21TQ1ZCdXR0b246IFwiQmV0w7ZsdMOpcyBDU1YtYsWRbC5cIixcbiAgICB0cmFuc2xhdGlvbk1lcmdlTG9jYWxlV2l0aERlZmF1bHQ6IFwiezB9IMO2c3N6ZWbFsXrDqXNlIGF6IGFsYXDDqXJ0ZWxtZXpldHQgc3rDtnZlZ2dlbC5cIixcbiAgICBib2xkOiBcIkbDqWxrw7Z2w6lyXCIsXG4gICAgaXRhbGljOiBcIkTFkWx0XCIsXG4gICAgdW5kZXJsaW5lOiBcIkFsw6Fow7p6b3R0XCIsXG4gICAgZnBBZGRRdWVzdGlvbjogXCJLw6lyZMOpcyBmZWx2w6l0ZWxlLi4uXCIsXG4gICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uSXRlbVRleHQ6IFwiTXV0YXTDoXMgaGE6XCJcbiAgfSxcbiAgLy9Qcm9wZXJ0eSBuYW1lcyBpbiB0YWJsZSBoZWFkZXJzXG4gIHBlbDoge1xuICAgIGlzUmVxdWlyZWQ6IFwiS8O2dGVsZXrFkT9cIlxuICB9LFxuICAvL1Byb3BlcnR5IEVkaXRvcnNcbiAgcGU6IHtcbiAgICBhcHBseTogXCJBbGthbG1helwiLFxuICAgIG9rOiBcIk9LXCIsXG4gICAgY2FuY2VsOiBcIk3DqWdzZW1cIixcbiAgICByZXNldDogXCJWaXNzemHDoWxsw610w6FzXCIsXG4gICAgY2xvc2U6IFwiQmV6w6Fyw6FzXCIsXG4gICAgZGVsZXRlOiBcIkVsdMOhdm9sw610w6FzXCIsXG4gICAgYWRkTmV3OiBcIsOaaiBmZWx2w6l0ZWxlXCIsXG4gICAgYWRkSXRlbTogXCJLYXR0aW50c29uIGVneSBlbGVtIGZlbHbDqXRlbMOpaGV6Li4uXCIsXG4gICAgYWRkT3RoZXI6IFwiRWd5w6liXCIsXG4gICAgYWRkU2VsZWN0QWxsOiBcIsOWc3N6ZXMga2lqZWzDtmzDqXNlXCIsXG4gICAgYWRkTm9uZTogXCJTZW1taVwiLFxuICAgIHJlbW92ZUFsbDogXCLDlnNzemVzIGVsdMOhdm9sw610w6FzYVwiLFxuICAgIGVkaXQ6IFwiU3plcmtlc3p0w6lzXCIsXG4gICAgaXRlbVZhbHVlRWRpdDogXCJMw6F0aGF0w7MgaGFcIixcbiAgICBlZGl0Q2hvaWNlczogXCJMZWhldMWRc8OpZ2VrIHN6ZXJrZXN6dMOpc2VcIixcbiAgICBtb3ZlOiBcIk1vemdhdMOhc1wiLFxuICAgIGVtcHR5OiBcIjzDvHJlcz5cIixcbiAgICBub3RFbXB0eTogXCI8w6lydMOpayBzemVya2VzenTDqXNlPlwiLFxuICAgIGZhc3RFbnRyeTogXCJHeW9ycyBmZWx2w6l0ZWxcIixcbiAgICBmb3JtRW50cnk6IFwiRmVsdsOpdGVsIMWxcmxhcHBhbFwiLFxuICAgIHRlc3RTZXJ2aWNlOiBcIlN6b2xnw6FsdGF0w6FzIHRlc3p0ZWzDqXNlXCIsXG4gICAgY29uZGl0aW9uU2VsZWN0UXVlc3Rpb246IFwiVsOhbGFzc3pvbiBrw6lyZMOpc3QuLi5cIixcbiAgICBjb25kaXRpb25WYWx1ZVF1ZXN0aW9uVGl0bGU6IFwiS8OpcmVtIGFkam9uIG1lZywgdmFneSB2w6FsYXNzem9uIMOpcnTDqWtldFwiLFxuICAgIGNvbmRpdGlvbkJ1dHRvbkFkZDogXCJGZWx2w6l0ZWxcIixcbiAgICBjb25kaXRpb25CdXR0b25SZXBsYWNlOiBcIkNzZXJlXCIsXG4gICAgY29uZGl0aW9uSGVscDpcbiAgICAgIFwiS8OpcmVtIGFkam9uIG1lZyBlZ3kgaWdhei1oYW1pcyBraWZlamV6w6lzdC4gSWdheiB2aXNzemF0w6lyw6lzaSDDqXJ0w6lra2VsIGtlbGwgcmVuZGVsa2V6bmllLCBob2d5IGEga8OpcmTDqXMgdmFneSBhIGxhcCBsw6F0aGF0w7MgbWFyYWRqb24uIFDDqWxkw6F1bDoge3F1ZXN0aW9uMX0gPSAndmFsdWUxJyBvciAoe3F1ZXN0aW9uMn0gKiB7cXVlc3Rpb240fSAgPiAyMCBhbmQge3F1ZXN0aW9uM30gPCA1KVwiLFxuICAgIGV4cHJlc3Npb25IZWxwOlxuICAgICAgXCJLw6lyZW0gYWRqb24gbWVnIGVneSBraWZlamV6w6lzdC4gSGFzem7DoWxqb24ga2FwY3NvcyB6w6Fyw7NqZWxla2V0LCBob2d5IGVsw6lyamUgYSBrw6lyZMOpc2VrIGFrdHXDoWxpcyDDqXJ0w6lrw6l0LiBQw6lsZMOhdWw6ICd7cXVlc3Rpb24xfSArIHtxdWVzdGlvbjJ9JywgJyh7cHJpY2V9KntxdWFudGl0eX0pICogKDEwMCAtIHtkaXNjb3VudH0pJ1wiLFxuICAgIGFjZUVkaXRvckhlbHA6IFwiTnlvbWphIG1lZyBhIGN0cmwrc3BhY2UgYmlsbGVudHnFsWtvbWJpbsOhY2nDs3QgYSBraWZlamV6w6lzIGJlZmVqZXrDqXPDqXJlIHZvbmF0a296w7Mgc2Vnw610c8OpZ8OpcnQuXCIsXG4gICAgYWNlRWRpdG9yUm93VGl0bGU6IFwiSmVsZW5sZWdpIHNvclwiLFxuICAgIGFjZUVkaXRvclBhbmVsVGl0bGU6IFwiSmVsZW5sZWdpIHBhbmVsXCIsXG4gICAgc2hvd01vcmU6IFwiVG92w6FiYmkgaW5mb3Jtw6FjacOzw6lydCBrw6lyZW0gdGVraW50c2UgbWVnIGEgZG9rdW1lbnTDoWNpw7N0XCIsXG4gICAgY29uZGl0aW9uU2hvd01vcmVVcmw6XG4gICAgICBcImh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5UGFyYW1ldGVyP2lkPVF1ZXN0aW9uJnBhcmFtZXRlcj12aXNpYmxlSWZcIixcbiAgICBhc3Npc3RhbnRUaXRsZTogXCJFbMOpcmhldMWRIGvDqXJkw6lzZWs6XCIsXG4gICAgY2VsbHNFbXB0eVJvd3NDb2x1bW5zOiBcIkxlZ2Fsw6FiYiBlZ3kgc29ybmFrIHZhZ3kgZWd5IG9zemxvcG5hayBsZW5uaWUga2VsbFwiLFxuXG4gICAgcHJvcGVydHlJc0VtcHR5OiBcIkvDqXJlbSBhZGpvbiBtZWcgZWd5IMOpcnTDqWtldFwiLFxuICAgIHZhbHVlOiBcIsOJcnTDqWtcIixcbiAgICB0ZXh0OiBcIlN6w7Z2ZWdcIixcbiAgICByb3dpZDogXCJTb3IgSURcIixcbiAgICBpbWFnZUxpbms6IFwiS8OpcCBVUkxcIixcbiAgICBjb2x1bW5FZGl0OiBcIk9zemxvcCBzemVya2VzenTDqXNlOiB7MH1cIixcbiAgICBpdGVtRWRpdDogXCJFbGVtIHN6ZXJrZXN6dMOpc2U6IHswfVwiLFxuXG4gICAgdXJsOiBcIlVSTFwiLFxuICAgIHBhdGg6IFwiw5p0dm9uYWxcIixcbiAgICB2YWx1ZU5hbWU6IFwiw4lydMOpayBtZWduZXZlesOpc2VcIixcbiAgICB0aXRsZU5hbWU6IFwiQ8OtbSBtZWduZXZlesOpc2VcIixcblxuICAgIGhhc090aGVyOiBcIlJlbmRlbGtlemlrIGVnecOpYiDDqXJ0w6lra2VsXCIsXG4gICAgb3RoZXJUZXh0OiBcIkF6IGVnecOpYiDDqXJ0w6lrIHN6w7Z2ZWdlXCIsXG4gICAgbmFtZTogXCJNZWduZXZlesOpc1wiLFxuICAgIHRpdGxlOiBcIkPDrW1cIixcbiAgICBjZWxsVHlwZTogXCJDZWxsYXTDrXB1c1wiLFxuICAgIGNvbENvdW50OiBcIk9zemxvcG9rIHN6w6FtYVwiLFxuICAgIGNob2ljZXNPcmRlcjogXCJWw6FsYXNzemEga2kgYSBsZWhldMWRc8OpZ2V0IHJlbmRlesOpc8OpdFwiLFxuICAgIHZpc2libGU6IFwiTMOhdGhhdMOzP1wiLFxuICAgIGlzUmVxdWlyZWQ6IFwiS8O2dGVsZXrFkT9cIixcbiAgICBzdGFydFdpdGhOZXdMaW5lOiBcIsOaaiBzb3JiYW4ga2V6ZMWRZGlrP1wiLFxuICAgIHJvd3M6IFwiU29yb2sgc3rDoW1hXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwiTWV6xZEga2l0w7ZsdMWRc3rDtnZlZ2VcIixcbiAgICBzaG93UHJldmlldzogXCJBIGvDqXAgZWzFkW7DqXpldGUgbMOhdGhhdMOzP1wiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCJBeiDDoWxsb23DoW55IHRhcnRhbG3DoXQgdMOhcm9samEgYSBKU09OLWJlbiwgc3rDtnZlZ2vDqW50XCIsXG4gICAgbWF4U2l6ZTogXCJNYXhpbcOhbGlzIMOhbGxvbcOhbnltw6lyZXQgYnl0ZS1iYW5cIixcbiAgICBpbWFnZUhlaWdodDogXCJLw6lwIG1hZ2Fzc8OhZ2FcIixcbiAgICBpbWFnZVdpZHRoOiBcIkvDqXAgc3rDqWxlc3PDqWdlXCIsXG4gICAgcm93Q291bnQ6IFwiU29yb2sgc3rDoW1hXCIsXG4gICAgY29sdW1uTGF5b3V0OiBcIk9zemxvcG9rIGVscmVuZGV6w6lzZVwiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcIifDmmogc29yIGZlbHbDqXRlbGUnIGdvbWIgZWxoZWx5ZXrDqXNlXCIsXG4gICAgYWRkUm93VGV4dDogXCInw5pqIHNvciBmZWx2w6l0ZWxlJyBnb21iIHN6w7Z2ZWdlXCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCInU29yIGVsdMOhdm9sw610w6FzYScgZ29tYiBzesO2dmVnZVwiLFxuICAgIHJhdGVNaW46IFwiTGVna2lzZWJiIHN6b3J6w7NcIixcbiAgICByYXRlTWF4OiBcIkxlZ25hZ3lvYmIgc3pvcnrDs1wiLFxuICAgIHJhdGVTdGVwOiBcIlN6b3J6w7MgbMOpcMOpc2vDtnplXCIsXG4gICAgbWluUmF0ZURlc2NyaXB0aW9uOiBcIkxlZ2tpc2ViYiBzem9yesOzIGxlw61yw6FzYVwiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCJMZWduYWd5b2JiIHN6b3J6w7MgbGXDrXLDoXNhXCIsXG4gICAgaW5wdXRUeXBlOiBcIk1lesWRIHTDrXB1c2FcIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJCZcOhbGzDrXTDoXNvayBmZWxpcmF0YVwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJBbGFww6lydGVsbWV6ZXR0IMOpcnTDqWtcIixcbiAgICBjZWxsc0RlZmF1bHRSb3c6IFwiQ2VsbMOhayBhbGFww6lydGVsbWV6ZXR0IHN6w7Z2ZWdlXCIsXG5cbiAgICBzdXJ2ZXlFZGl0b3JUaXRsZTogXCJLw6lyZMWRw612IGJlw6FsbMOtdMOhc2FpbmFrIG3Ds2Rvc8OtdMOhc2FcIixcbiAgICBxRWRpdG9yVGl0bGU6IFwiU3plcmtlc3p0w6lzOiB7MH1cIixcblxuICAgIG1heExlbmd0aDogXCJNYXhpbcOhbGlzIGhvc3N6XCIsXG5cbiAgICAvL3N1cnZleVxuICAgIHNob3dUaXRsZTogXCJDw61tIG11dGF0w6FzYS9lbHJlanTDqXNlXCIsXG4gICAgbG9jYWxlOiBcIkFsYXDDqXJ0ZWxtZXpldHQgbnllbHZcIixcbiAgICBtb2RlOiBcIk3Ds2QgKHN6ZXJrZXN6dMOpcy9tZWd0ZWtpbnTDqXMpXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiTmVtbMOhdGhhdMOzIMOpcnTDqWtlayB0w7ZybMOpc2VcIixcbiAgICBjb29raWVOYW1lOiBcIlPDvHRpIG1lZ25ldmV6w6lzZSAoYSBrw6lyZMWRw612IGNzYWsgZWd5c3plciBraXTDtmx0aGV0xZEpXCIsXG4gICAgc2VuZFJlc3VsdE9uUGFnZU5leHQ6IFwiS8OpcmTFkcOtdiDDqXJ0w6lrw6luZWsga8O8bGTDqXNlIGEga8O2dmV0a2V6xZEgbGFwcmEgbMOpcMOpc2tvclwiLFxuICAgIHN0b3JlT3RoZXJzQXNDb21tZW50OiBcIkF6ICdlZ3nDqWInIG1lesWRIMOpcnTDqWvDqW5layB0w6Fyb2zDoXNhIGvDvGzDtm4gbWV6xZFiZW5cIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJMYXBvayBjw61tw6luZWsgbXV0YXTDoXNhXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcIkxhcG9rIHN6w6Ftw6FuYWsgbXV0YXTDoXNhXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIidFbMWResWRIGxhcCcgZ29tYiBmZWxpcmF0YVwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCInS8O2dmV0a2V6xZEgbGFwJyBnb21iIGZlbGlyYXRhXCIsXG4gICAgY29tcGxldGVUZXh0OiBcIidCZWZlamV6w6lzJyBnb21iIGZlbGlyYXRhXCIsXG4gICAgc3RhcnRTdXJ2ZXlUZXh0OiBcIidLZXpkw6lzJyBnb21iIGZlbGlyYXRhXCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIk5hdmlnw6FjacOzcyBnb21ib2sgbXV0YXTDoXNhIChhbGFww6lydGVsbWV6ZXR0IG5hdmlnw6FjacOzKVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcIidFbMWResWRIGxhcCcgZ29tYiBtdXRhdMOhc2FcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwiQXogbWVna2V6ZGV0dCBsYXAgYSBrw6lyZMWRw612IGVsc8WRIG9sZGFsYS5cIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCJCZWZlamV6xZEgc3rDtnZlZyBtdXRhdMOhc2EgYSBrw6lyZMWRw612IGJlZmVqZXrDqXNla29yXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzpcbiAgICAgIFwiTWluZGVuIGvDqXJkw6lzIG1lZ3bDoWxhc3pvbMOhc2Frb3IgYXV0b21hdGlrdXNhbiBhIGvDtnZldGtlesWRIGxhcHJhIGzDqXDDqXNcIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwiRWzFkXJlaGFsYWTDoXMtbXV0YXTDsyBtZWdqZWxlbsOtdMOpc2VcIixcbiAgICBxdWVzdGlvblRpdGxlTG9jYXRpb246IFwiS8OpcmTDqXMgY8OtbcOpbmVrIGhlbHllXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcIkvDtnRlbGV6xZEgc3ppbWLDs2x1bVwiLFxuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogXCJLw6lyZMOpcyBrZXpkxZFpbmRleGUgKDEsIDIgdmFneSAnQScsICdhJylcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIkvDqXJkw6lzIHN6w6Ftw6FuYWsgbXV0YXTDoXNhXCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOlxuICAgICAgXCJLw6lyZMOpcyBjw61tw6luZWsgc2FibG9uamE6ICd7c3rDoW19LiB7a8O2dGVsZXrFkX0ge2PDrW19J1wiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJLw6lyZMOpcyBoaWJhw7x6ZW5ldMOpbmVrIGhlbHl6ZXRlXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcIkVsc8WRIGvDqXJkw6lzIGF1dG9tYXRpa3VzIGtpamVsw7Zsw6lzZSBsYXB2w6FsdMOhcyBlc2V0w6luXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwiRWxlbWVrIHJlbmRlesOpc2UgYSBsYXBvblwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJBIGvDqXJkxZHDrXYga2l0w7ZsdMOpc8OpcmUgZm9yZMOtdGhhdMOzIG1heGltw6FsaXMgaWTFkVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiRWd5IGxhcCBraXTDtmx0w6lzw6lyZSBmb3Jkw610aGF0w7MgbWF4aW3DoWxpcyBpZMWRXCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwiSWTFkXrDrXTDsyBtdXRhdMOhc2FcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwiSWTFkXrDrXTDsyBtw7NkamFcIixcbiAgICByZW5kZXJNb2RlOiBcIk1lZ2plbGVuw610w6lzIG3Ds2RqYVwiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwiw5pqIHBhbmVsIGhvenrDoWFkw6Fzw6FuYWsgZW5nZWTDqWx5ZXrDqXNlXCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCJQYW5lbCBlbHTDoXZvbMOtdMOhc8OhbmFrIGVuZ2Vkw6lseWV6w6lzZVwiLFxuICAgIHBhbmVsQWRkVGV4dDogXCInw5pqIHBhbmVsIGZlbHbDqXRlbGUnIGdvbWIgc3rDtnZlZ2VcIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwiJ1BhbmVsIGVsdMOhdm9sw610w6FzYScgZ29tYiBzesO2dmVnZVwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJNaW5kZW4gZWxlbSBtdXRhdMOhc2EgZWd5IGxhcG9uXCIsXG4gICAgaHRtbDogXCJIVE1MXCIsXG4gICAgZXhwcmVzc2lvbjogXCJLaWZlamV6w6lzXCIsXG5cbiAgICBtaW5WYWx1ZTogXCJNaW5pbcOhbGlzIMOpcnTDqWtcIixcbiAgICBtYXhWYWx1ZTogXCJNYXhpbcOhbGlzIMOpcnTDqWtcIixcbiAgICBtaW5MZW5ndGg6IFwiTWluaW3DoWxpcyBob3NzelwiLFxuICAgIGFsbG93RGlnaXRzOiBcIlN6w6FtamVneWVrIGVuZ2Vkw6lseWV6w6lzZVwiLFxuICAgIG1pbkNvdW50OiBcIk1pbmltw6FsaXMgZGFyYWJzesOhbVwiLFxuICAgIG1heENvdW50OiBcIk1heGltw6FsaXMgZGFyYWJzesOhbVwiLFxuICAgIHJlZ2V4OiBcIlJlZ3Vsw6FyaXMga2lmZWplesOpc1wiLFxuXG4gICAgdGFiczoge1xuICAgICAgZ2VuZXJhbDogXCLDgWx0YWzDoW5vc1wiLFxuICAgICAgZmlsZU9wdGlvbnM6IFwiQmXDoWxsw610w6Fzb2tcIixcbiAgICAgIGh0bWw6IFwiSFRNTCBzemVya2VzenTFkVwiLFxuICAgICAgY29sdW1uczogXCJPc3psb3Bva1wiLFxuICAgICAgcm93czogXCJTb3Jva1wiLFxuICAgICAgY2hvaWNlczogXCJMZWhldMWRc8OpZ2VrXCIsXG4gICAgICBpdGVtczogXCJFbGVtZWtcIixcbiAgICAgIHZpc2libGVJZjogXCJMw6F0aGF0w7MgaGFcIixcbiAgICAgIGVuYWJsZUlmOiBcIkVuZ2Vkw6lseWV6dmUgaGFcIixcbiAgICAgIHJlcXVpcmVkSWY6IFwiS8O2dGVsZXrFkSBoYVwiLFxuICAgICAgcmF0ZVZhbHVlczogXCJTem9yesOzIMOpcnTDqWtla1wiLFxuICAgICAgY2hvaWNlc0J5VXJsOiBcIkxlaGV0xZFzw6lnZWsgYSB3ZWJyxZFsXCIsXG4gICAgICBtYXRyaXhDaG9pY2VzOiBcIkFsYXDDqXJ0ZWxtZXpldHQgbGVoZXTFkXPDqWdla1wiLFxuICAgICAgbXVsdGlwbGVUZXh0SXRlbXM6IFwiU3rDtnZlZ21lesWRa1wiLFxuICAgICAgdmFsaWRhdG9yczogXCJWYWxpZMOhdG9yb2tcIixcbiAgICAgIG5hdmlnYXRpb246IFwiTmF2aWfDoWNpw7NcIixcbiAgICAgIHF1ZXN0aW9uOiBcIkvDqXJkw6lzXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sOiBcIkJlZmVqZXrFkSBzesO2dmVnIChIVE1MKVwiLFxuICAgICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uOiBcIkJlZmVqesWRIHN6w7Z2ZWcgbXV0YXTDoXPDoW5hayBmZWx0w6l0ZWxlXCIsXG4gICAgICBsb2FkaW5nSHRtbDogXCJCZXTDtmx0xZEgc3rDtnZlZyAoSFRNTClcIixcbiAgICAgIHRpbWVyOiBcIklkxZF6w610xZEvS3bDrXpcIixcbiAgICAgIHRyaWdnZXJzOiBcIkVzZW3DqW55dmV6w6lybMWRa1wiLFxuICAgICAgdGVtcGxhdGVUaXRsZTogXCJTYWJsb24gY8OtbWVcIlxuICAgIH0sXG4gICAgZWRpdFByb3BlcnR5OiBcIlR1bGFqZG9uc8OhZyBzemVya2VzenTDqXNlICd7MH0nXCIsXG4gICAgaXRlbXM6IFwiWyBFbGVtZWs6IHswfSBdXCIsXG5cbiAgICBlbnRlck5ld1ZhbHVlOiBcIkvDqXJlbSwgYWRqYSBtZWcgYXogw6lydMOpa2V0LlwiLFxuICAgIG5vcXVlc3Rpb25zOiBcIk5pbmNzZW5layBrw6lyZMOpc2VrIGEga8OpcmTFkcOtdmJlbi5cIixcbiAgICBjcmVhdGV0cmlnZ2VyOiBcIkvDqXJlbSBob3p6b24gbMOpdHJlIGVneSBlc2Vtw6lueXZlesOpcmzFkXRcIixcbiAgICB0cmlnZ2VyT246IFwiQmUgXCIsXG4gICAgdHJpZ2dlck1ha2VQYWdlc1Zpc2libGU6IFwiTGFwb2sgbMOhdGhhdMOzdsOhIHTDqXRlbGU6XCIsXG4gICAgdHJpZ2dlck1ha2VRdWVzdGlvbnNWaXNpYmxlOiBcIkVsZW1layBsw6F0aGF0w7N2w6EgdMOpdGVsZTpcIixcbiAgICB0cmlnZ2VyQ29tcGxldGVUZXh0OiBcIkvDqXJkxZHDrXYgYmVmZWplesOpc2UsIGhhIHNpa2VyZXMuXCIsXG4gICAgdHJpZ2dlck5vdFNldDogXCJOaW5jcyBlc2Vtw6lueWtlemVsxZEgYmXDoWxsw610dmFcIixcbiAgICB0cmlnZ2VyUnVuSWY6IFwiRnV0dGF0w6FzIGhhXCIsXG4gICAgdHJpZ2dlclNldFRvTmFtZTogXCJBIGvDtnZldGtlesWRIMOpcnTDqWvDqW5layBjc2Vyw6lqZTogXCIsXG4gICAgdHJpZ2dlckZyb21OYW1lOiBcIkEga8O2dmV0a2V6xZEgw6lydMOpa8OpbmVrIG3DoXNvbMOhc2E6IFwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uOiBcIkEga8O2dmV0a2V6xZEga2lmZWplesOpcyBmdXR0YXTDoXNhOlwiLFxuICAgIHRyaWdnZXJTZXRWYWx1ZTogXCJlcnJlOiBcIixcbiAgICB0cmlnZ2VySXNWYXJpYWJsZTogXCJOZSBtZW50c2UgYXogZXJlZG3DqW55dCBhIGvDqXJkxZHDrXYgZXJlZG3DqW55w6liZS5cIlxuICB9LFxuICAvL1Byb3BlcnR5IHZhbHVlc1xuICBwdjoge1xuICAgIHRydWU6IFwiaWdhelwiLFxuICAgIGZhbHNlOiBcImhhbWlzXCIsXG4gICAgaW5oZXJpdDogXCLDtnLDtmtsw7Z0dFwiLFxuICAgIHNob3c6IFwibXV0YXTDoXNcIixcbiAgICBoaWRlOiBcImVscmVqdMOpc1wiLFxuICAgIGRlZmF1bHQ6IFwiYWxhcMOpcnRlbG1lemV0dFwiLFxuICAgIGluaXRpYWw6IFwia2V6ZGV0aVwiLFxuICAgIHJhbmRvbTogXCJ2w6lsZXRsZW5cIixcbiAgICBjb2xsYXBzZWQ6IFwiY3N1a290dFwiLFxuICAgIGV4cGFuZGVkOiBcIm55aXRvdHRcIixcbiAgICBub25lOiBcInNlbW1pXCIsXG4gICAgYXNjOiBcIm7DtnZla3bFkVwiLFxuICAgIGRlc2M6IFwiY3PDtmtrZW7FkVwiLFxuICAgIGluZGV0ZXJtaW5hdGU6IFwiaGF0w6Fyb3phdGxhblwiLFxuICAgIGRlY2ltYWw6IFwiZGVpbcOhbGlzXCIsXG4gICAgY3VycmVuY3k6IFwicMOpbnpcIixcbiAgICBwZXJjZW50OiBcInN6w6F6YWzDqWtcIixcbiAgICBmaXJzdEV4cGFuZGVkOiBcImVsc8WRIG55aXR2YVwiLFxuICAgIG9mZjogXCJraVwiLFxuICAgIG9uUGFuZWw6IFwiYSBwYW5lbGVuXCIsXG4gICAgb25TdXJ2ZXk6IFwiYSBrw6lyZMWRw612ZW5cIixcbiAgICBsaXN0OiBcImxpc3RhXCIsXG4gICAgcHJvZ3Jlc3NUb3A6IFwiZmVsw7xsXCIsXG4gICAgcHJvZ3Jlc3NCb3R0b206IFwiYWx1bFwiLFxuICAgIHByb2dyZXNzVG9wQm90dG9tOiBcImFsw7xsIMOpcyBmZWzDvGxcIixcbiAgICBob3Jpem9udGFsOiBcImhvcml6b250w6FsaXNcIixcbiAgICB2ZXJ0aWNhbDogXCJ2ZXJ0aWvDoWxpc1wiLFxuICAgIHRvcDogXCJmZW50XCIsXG4gICAgYm90dG9tOiBcImxlbnRcIixcbiAgICB0b3BCb3R0b206IFwiZmVudCDDqXMgbGVudFwiLFxuICAgIGxlZnQ6IFwiYmFsXCIsXG4gICAgY29sb3I6IFwic3rDrW5cIixcbiAgICBkYXRlOiBcImTDoXR1bVwiLFxuICAgIGRhdGV0aW1lOiBcImTDoXR1bSDDqXMgaWTFkVwiLFxuICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjogXCJoZWx5aSBkw6F0dW0gw6lzIGlkxZFcIixcbiAgICBlbWFpbDogXCJlbWFpbFwiLFxuICAgIG1vbnRoOiBcImjDs25hcFwiLFxuICAgIG51bWJlcjogXCJzesOhbVwiLFxuICAgIHBhc3N3b3JkOiBcImplbHN6w7NcIixcbiAgICByYW5nZTogXCJpbnRlcnZhbGx1bVwiLFxuICAgIHRlbDogXCJ0ZWxlZm9uXCIsXG4gICAgdGV4dDogXCJzesO2dmVnXCIsXG4gICAgdGltZTogXCJpZMWRXCIsXG4gICAgdXJsOiBcIlVSTFwiLFxuICAgIHdlZWs6IFwiaMOpdFwiLFxuICAgIGhpZGRlbjogXCJyZWp0ZXR0XCIsXG4gICAgb246IFwiYmVcIixcbiAgICBvblBhZ2U6IFwiYSBsYXBvblwiLFxuICAgIGVkaXQ6IFwic3plcmtlc3p0w6lzXCIsXG4gICAgZGlzcGxheTogXCJtdXRhdMOhc1wiLFxuICAgIG9uQ29tcGxldGU6IFwiYmVmZWplesOpc2tvclwiLFxuICAgIG9uSGlkZGVuOiBcImVsdMWxbsOpc2tvclwiLFxuICAgIGFsbDogXCLDtnNzemVzXCIsXG4gICAgcGFnZTogXCJsYXBcIixcbiAgICBzdXJ2ZXk6IFwia8OpcmTFkcOtdlwiLFxuICAgIG9uTmV4dFBhZ2U6IFwiYSBrw7Z2ZXRrZXrFkSBsYXByYSBsw6lww6lza29yXCIsXG4gICAgb25WYWx1ZUNoYW5nZWQ6IFwiYXogw6lydMOpayB2w6FsdG96w6FzYWtvclwiXG4gIH0sXG4gIC8vT3BlcmF0b3JzXG4gIG9wOiB7XG4gICAgZW1wdHk6IFwiw7xyZXNcIixcbiAgICBub3RlbXB0eTogXCJuZW0gw7xyZXNcIixcbiAgICBlcXVhbDogXCJtZWdlZ3llemlrXCIsXG4gICAgbm90ZXF1YWw6IFwibmVtIGVneWV6aWsgbWVnXCIsXG4gICAgY29udGFpbnM6IFwidGFydGFsbWF6emFcIixcbiAgICBub3Rjb250YWluczogXCJuZW0gdGFydGFsbWF6emFcIixcbiAgICBncmVhdGVyOiBcIm5hZ3lvYmIgbWludFwiLFxuICAgIGxlc3M6IFwia2lzZWJiIG1pbnRcIixcbiAgICBncmVhdGVyb3JlcXVhbDogXCJuYWd5b2JiIHZhZ3kgZWd5ZW5sxZFcIixcbiAgICBsZXNzb3JlcXVhbDogXCJraXNlYmIgdmFneSBlZ3llbmzFkVwiXG4gIH0sXG4gIC8vRW1iZWQgd2luZG93XG4gIGV3OiB7XG4gICAgYW5ndWxhcjogXCJBbmd1bGFyIHZlcnppw7MgaGFzem7DoWxhdGFcIixcbiAgICBqcXVlcnk6IFwialF1ZXJ5IHZlcnppw7MgaGFzem7DoWxhdGFcIixcbiAgICBrbm9ja291dDogXCJLbm9ja291dCB2ZXJ6acOzIGhhc3puw6FsYXRhXCIsXG4gICAgcmVhY3Q6IFwiUmVhY3QgdmVyemnDsyBoYXN6bsOhbGF0YVwiLFxuICAgIHZ1ZTogXCJWdWUgdmVyemnDsyBoYXN6bsOhbGF0YVwiLFxuICAgIGJvb3RzdHJhcDogXCJIYXN6bsOhbGF0IEJvb3RzdHJhcCBmcmFtZXdvcmtrZWxcIixcbiAgICBzdGFuZGFyZDogXCJIYXN6bsOhbGF0IEJvb3RzdHJhcCBmcmFtZXdvcmsgbsOpbGvDvGxcIixcbiAgICBzaG93T25QYWdlOiBcIkvDqXJkxZHDrXYgbXV0YXTDoXNhIGEgbGFwb25cIixcbiAgICBzaG93SW5XaW5kb3c6IFwiS8OpcmTFkcOtdiBtdXRhdMOhc2EgZWd5IGFibGFrYmFuXCIsXG4gICAgbG9hZEZyb21TZXJ2ZXI6IFwiS8OpcmTFkcOtdiBKU09OIGJldMO2bHTDqXNlIGEgc3plcnZlcnLFkWxcIixcbiAgICB0aXRsZVNjcmlwdDogXCJTemtyaXB0ZWsgw6lzIHN0w61sdXNsYXBva1wiLFxuICAgIHRpdGxlSHRtbDogXCJIVE1MXCIsXG4gICAgdGl0bGVKYXZhU2NyaXB0OiBcIkphdmFTY3JpcHRcIlxuICB9LFxuICAvL1Rlc3QgU3VydmV5XG4gIHRzOiB7XG4gICAgc2VsZWN0UGFnZTogXCJWw6FsYXNzemEga2kgYSB0ZXN6dGVsbmkga8OtdsOhbnQgbGFwb3Q6XCIsXG4gICAgc2hvd0ludmlzaWJsZUVsZW1lbnRzOiBcIk5lbWzDoXRoYXTDsyBlbGVtZWsgbWVnamVsbsOtdMOpc2VcIlxuICB9LFxuICB2YWxpZGF0b3JzOiB7XG4gICAgYW5zd2VyY291bnR2YWxpZGF0b3I6IFwidsOhbGFzem9rIHN6w6FtYVwiLFxuICAgIGVtYWlsdmFsaWRhdG9yOiBcImUtbWFpbFwiLFxuICAgIGV4cHJlc3Npb252YWxpZGF0b3I6IFwia2lmZWplesOpc1wiLFxuICAgIG51bWVyaWN2YWxpZGF0b3I6IFwic3rDoW1cIixcbiAgICByZWdleHZhbGlkYXRvcjogXCJyZWd1bMOhcmlzIGtpZmVqZXrDqXNcIixcbiAgICB0ZXh0dmFsaWRhdG9yOiBcInN6w7Z2ZWdcIlxuICB9LFxuICB0cmlnZ2Vyczoge1xuICAgIGNvbXBsZXRldHJpZ2dlcjogXCJrw6lyZMWRw612IGJlZmVqZXrDqXNlXCIsXG4gICAgc2V0dmFsdWV0cmlnZ2VyOiBcIsOpcnTDqWsgYmXDoWxsw610w6FzYVwiLFxuICAgIGNvcHl2YWx1ZXRyaWdnZXI6IFwiw6lydMOpayBtw6Fzb2zDoXNhXCIsXG4gICAgcnVuZXhwcmVzc2lvbnRyaWdnZXI6IFwia2lmZWplesOpcyBmdXR0YXTDoXNhXCIsXG4gICAgdmlzaWJsZXRyaWdnZXI6IFwibMOhdGhhdMOzc8OhZyBtZWd2w6FsdG96dGF0w6FzYSAobcOhciBuaW5jcyBoYXN6bsOhbGF0YmFuKVwiXG4gIH0sXG4gIC8vUHJvcGVydGllc1xuICBwOiB7XG4gICAgbmFtZTogXCJNZWduZXZlesOpc1wiLFxuICAgIHRpdGxlOiB7XG4gICAgICBuYW1lOiBcIkPDrW1cIixcbiAgICAgIHRpdGxlOiBcIkhhZ3lqYSDDvHJlc2VuLCBoYSBtZWdlZ3llemlrIGEgJ01lZ25ldmV6w6lzJy1lbFwiXG4gICAgfSxcblxuICAgIG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eTogXCJOYXZpZ8OhY2nDs3MgZ29tYm9rIGzDoXRoYXTDs3PDoWdhXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwiS8OpcmTDqXNlayByZW5kZXrDqXNlXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIktpdMO2bHTDqXNlIGZvcmTDrXRoYXTDsyBtYXhpbcOhbGlzIGlkxZFcIixcblxuICAgIHZpc2libGU6IFwiTMOhdGhhdMOzXCIsXG4gICAgdmlzaWJsZUlmOiBcIkzDoXRoYXTDsyBoYVwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJLw6lyZMOpcyBjw61tw6luZWsgZWxoZWx5ZXrDqXNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTGXDrXLDoXNcIixcbiAgICBzdGF0ZTogXCLDgWxsYXBvdFwiLFxuICAgIGlzUmVxdWlyZWQ6IFwiS8O2dGVsZXrFkVwiLFxuICAgIHJlcXVpcmVkSWY6IFwiS8O2dGVsZXrFkSBoYVwiLFxuICAgIGluZGVudDogXCJCZWtlemTDqXNcIixcbiAgICByZXF1aXJlZEVycm9yVGV4dDogXCJLw7Z0ZWxlesWRIGhpYmHDvHplbmV0XCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCLDmmogc29yYmFuIGtlemTFkWRpa1wiLFxuICAgIGlubmVySW5kZW50OiBcIkJlbHPFkSBiZWtlemTDqXNcIixcbiAgICBwYWdlOiBcIkxhcFwiLFxuXG4gICAgd2lkdGg6IFwiU3rDqWxlc3PDqWdcIixcblxuICAgIGNvbW1lbnRUZXh0OiBcIk1lZ2plZ3l6w6lzIHN6w7Z2ZWdlXCIsXG4gICAgdmFsdWVOYW1lOiBcIsOJcnTDqWsgbWVnbmV2ZXrDqXNlXCIsXG4gICAgZW5hYmxlSWY6IFwiRW5nZWTDqWx5ZXp2ZSBoYVwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJBbGFww6lydGVsbWV6ZXR0IMOpcnTDqWtcIixcbiAgICBjb3JyZWN0QW5zd2VyOiBcIkhlbHllcyDDqXJ0w6lrXCIsXG4gICAgcmVhZE9ubHk6IFwiQ3NhayBvbHZhc2hhdMOzXCIsXG4gICAgdmFsaWRhdG9yczogXCJWYWxpZMOhdG9yb2tcIixcbiAgICB0aXRsZUxvY2F0aW9uOiBcIkPDrW0gZWxoZWx5ZXrDqXNlXCIsXG5cbiAgICBoYXNDb21tZW50OiBcIlZhbiBtZWdqZWd5esOpc1wiLFxuICAgIGhhc090aGVyOiBcIlZhbiAnZWd5w6liJ1wiLFxuICAgIGNob2ljZXM6IFwiTGVoZXTFkXPDqWdla1wiLFxuICAgIGNob2ljZXNPcmRlcjogXCJMZWhldMWRc8OpZ2VrIHJlbmRlesOpc2VcIixcbiAgICBjaG9pY2VzQnlVcmw6IFwiTGVoZXTFkXPDqWdlayBhIHdlYnLFkWxcIixcbiAgICBvdGhlclRleHQ6IFwiJ0VnecOpYicgc3rDtnZlZ1wiLFxuICAgIG90aGVyRXJyb3JUZXh0OiBcIidFZ3nDqWInIGhpYmHDvHplbmV0XCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiJ0VnecOpYicgdMOhcm9sw6FzYSBtZWdqZWd5esOpc2vDqW50XCIsXG5cbiAgICBsYWJlbDogXCJDaW1rZVwiLFxuICAgIHNob3dUaXRsZTogXCJDw61tIG11dGF0w6FzYVwiLFxuICAgIHZhbHVlVHJ1ZTogXCLDiXJ0w6lrIGlnYXpcIixcbiAgICB2YWx1ZUZhbHNlOiBcIsOJcnTDqWsgaGFtaXNcIixcblxuICAgIGNvbHM6IFwiT3N6bG9wb2tcIixcbiAgICByb3dzOiBcIlNvcm9rXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwiSGVseWtpdMO2bHTFkVwiLFxuXG4gICAgb3B0aW9uc0NhcHRpb246IFwiJ0Jlw6FsbMOtdMOhc29rJyBmZWxpcmF0YVwiLFxuXG4gICAgZXhwcmVzc2lvbjogXCJLaWZlamV6w6lzXCIsXG4gICAgZm9ybWF0OiBcIkZvcm3DoXR1bVwiLFxuICAgIGRpc3BsYXlTdHlsZTogXCJNZWdqZWxlbsOtdMOpcyBzdMOtbHVzYVwiLFxuICAgIGN1cnJlbmN5OiBcIlDDqW56XCIsXG4gICAgdXNlR3JvdXBpbmc6IFwiQ3NvcG9ydG9zw610w6FzXCIsXG5cbiAgICBzaG93UHJldmlldzogXCJFbMWRbsOpemV0IG11dGF0w6FzYVwiLFxuICAgIGFsbG93TXVsdGlwbGU6IFwiVMO2YmIgZW5nZWTDqWx5ZXrDqXNlXCIsXG4gICAgaW1hZ2VIZWlnaHQ6IFwiS8OpcCBtYWdhc3PDoWdhXCIsXG4gICAgaW1hZ2VXaWR0aDogXCJLw6lwIHN6w6lsZXNzw6lnZVwiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCInRWd5w6liJyB0w6Fyb2zDoXNhIHN6w7Z2ZWdrw6ludFwiLFxuICAgIG1heFNpemU6IFwiTWF4aW3DoWxpcyBtw6lyZXRcIixcblxuICAgIGh0bWw6IFwiSFRNTFwiLFxuXG4gICAgY29sdW1uczogXCJPc3psb3Bva1wiLFxuICAgIGNlbGxzOiBcIkNlbGzDoWtcIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcIk1pbmRlbiBzb3Iga8O2dGVsZXrFkVwiLFxuXG4gICAgaG9yaXpvbnRhbFNjcm9sbDogXCJIb3Jpem9udMOhbGlzIGfDtnJnZXTDqXNcIixcbiAgICBjZWxsVHlwZTogXCJDZWxsYXTDrXB1c1wiLFxuICAgIGNvbHVtbnNMYXlvdXQ6IFwiT3N6bG9wb2sgZWxyZW5kZXrDqXNlXCIsXG4gICAgY29sdW1uQ29sQ291bnQ6IFwiT3N6bG9wb2sgc3rDoW1hXCIsXG4gICAgY29sdW1uTWluV2lkdGg6IFwiT3N6bG9wIG1pbmltw6FsaXMgc3rDqWxlc3PDqWdlXCIsXG5cbiAgICByb3dDb3VudDogXCJTb3JvayBzesOhbWFcIixcbiAgICBtaW5Sb3dDb3VudDogXCJTb3JvayBtaW5pbcOhbGlzIHN6w6FtYVwiLFxuICAgIG1heFJvd0NvdW50OiBcIlNvcm9rIG1heGltw6FsaXMgc3rDoW1hXCIsXG4gICAga2V5TmFtZTogXCJLdWxjcyBtZWduZXZlesOpc2VcIixcbiAgICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkt1bGNzIGR1cGxpa8OhY2nDs3MgaGliYcO8emVuZXRlXCIsXG4gICAgY29uZmlybURlbGV0ZTogXCJFbHTDoXZvbMOtdMOhcyBtZWdlcsWRc8OtdMOpc2VcIixcbiAgICBjb25maXJtRGVsZXRlVGV4dDogXCJFbHTDoXZvbMOtw6F0cyBtZWdlcsWRc8OtdMOpc2Uga8OpcmTDqXNcIixcbiAgICBhZGRSb3dMb2NhdGlvbjogXCInw5pqIHNvciBmZWx2w6l0ZWxlJyBnb21iIGVsaGVseWV6w6lzZVwiLFxuICAgIGFkZFJvd1RleHQ6IFwiJ8OaaiBzb3IgZmVsdsOpdGVsZScgZ29tYiBzesO2dmVnZVwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwiJ1NvciBlbHTDoXZvbMOtdMOhc2EnIGdvbWIgc3rDtnZlZ2VcIixcblxuICAgIGl0ZW1zOiBcIkVsZW1la1wiLFxuICAgIGl0ZW1TaXplOiBcIkVsZW0gbcOpcmV0ZVwiLFxuICAgIGNvbENvdW50OiBcIk9zemxvcG9rIHN6w6FtYVwiLFxuXG4gICAgdGVtcGxhdGVUaXRsZTogXCJTYWJsb24gY8OtbWVcIixcbiAgICB0ZW1wbGF0ZURlc2NyaXB0aW9uOiBcIlNhYmxvbiBsZcOtcsOhc2FcIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIsOaaiBwYW5lbCBmZWx2w6l0ZWzDqW5layBlbmdlZMOpbHllesOpc2VcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIlBhbmVsIGVsdMOhdm9sw610w6Fzw6FuYWsgZW5nZWTDqWx5ZXrDqXNlXCIsXG4gICAgcGFuZWxDb3VudDogXCJQYW5lbGVrIHN6w6FtYVwiLFxuICAgIG1pblBhbmVsQ291bnQ6IFwiUGFuZWxlayBtaW5pbcOhbGlzIHN6w6FtYVwiLFxuICAgIG1heFBhbmVsQ291bnQ6IFwiUGFuZWxlayBtYXhpbcOhbGlzIHN6w6FtYVwiLFxuICAgIHBhbmVsc1N0YXRlOiBcIlBhbmVsZWsgw6FsbGFwb3RhXCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcIifDmmogcGFuZWwgZmVsdsOpdGVsZScgZ29tYiBzesO2dmVnZVwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCInUGFuZWwgZWx0w6F2b2zDrXTDoXNhJyBnb21iIHN6w7Z2ZWdlXCIsXG4gICAgcGFuZWxQcmV2VGV4dDogXCInRWzFkXrFkSBwYW5lbCcgZ29tYiBzesO2dmVnZVwiLFxuICAgIHBhbmVsTmV4dFRleHQ6IFwiJ0vDtnZldGtlesWRIHBhbmVsJyBzesO2dmVnZVwiLFxuICAgIHNob3dRdWVzdGlvbk51bWJlcnM6IFwiS8OpcmTDqXMgc3rDoW3DoW5hayBtdXRhdMOhc2FcIixcbiAgICBzaG93UmFuZ2VJblByb2dyZXNzOiBcIkVsxZFyZWhhbGFkw6FzLW11dGF0w7MgXCIsXG4gICAgcmVuZGVyTW9kZTogXCJNZWdqZWxlbsOtdMOpcyBtw7NkamFcIixcbiAgICB0ZW1wbGF0ZVRpdGxlTG9jYXRpb246IFwiU2FibG9uIGPDrW3DqW5layBlbGhlbHllesOpc2VcIixcblxuICAgIHJhdGVWYWx1ZXM6IFwiU3pvcnrDsyDDqXJ0w6lrZWtcIixcbiAgICByYXRlTWluOiBcIkxlZ2tpc2ViYiBzem9yesOzXCIsXG4gICAgcmF0ZU1heDogXCJMZWduYWd5b2JiIHN6b3J6w7NcIixcbiAgICByYXRlU3RlcDogXCJTem9yesOzIGzDqXDDqXNrw7Z6ZVwiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCJMZWdraXNlYmIgc3pvcnrDsyBsZcOtcsOhc2FcIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwiTGVnbmFneW9iYiBzem9yesOzIGxlw61yw6FzYVwiLFxuXG4gICAgaW5wdXRUeXBlOiBcIk1lesWRIHTDrXB1c2FcIixcbiAgICBzaXplOiBcIk3DqXJldFwiLFxuXG4gICAgbG9jYWxlOiBcIkFsYXDDqXJ0ZWxtZXpldHQgbnllbHZcIixcbiAgICBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWM6IFwiRWxzxZEga8OpcmTDqXMgYXV0b21hdGlrdXMga2lqZWzDtmzDqXNlIGxhcHbDoWx0w6FzIGVzZXTDqW5cIixcbiAgICBjb21wbGV0ZWRIdG1sOiBcIkJlZmVqZXrFkSBzesO2dmVnIChIVE1MKVwiLFxuICAgIGNvbXBsZXRlZEJlZm9yZUh0bWw6IFwiQmVmZWplesOpcyBlbMWRdHRpIHN6w7Z2ZWcgKEhUTUwpXCIsXG4gICAgbG9hZGluZ0h0bWw6IFwiQmV0w7ZsdMWRIHN6w7Z2ZWcgKEhUTUwpXCIsXG4gICAgdHJpZ2dlcnM6IFwiRXNlbcOpbnl2ZXrDqXJsxZFrXCIsXG4gICAgY29va2llTmFtZTogXCJTw7x0aSBtZWduZXZlesOpc2VcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCJLw6lyZMWRw612IMOpcnTDqWvDqW5layBrw7xsZMOpc2UgYSBrw7Z2ZXRrZXrFkSBsYXByYSBsw6lww6lza29yXCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIk5hdmlnw6FjacOzcyBnb21ib2sgbXV0YXTDoXNhIChhbGFww6lydGVsbWV6ZXR0IG5hdmlnw6FjacOzKVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcIidFbMWResWRIGxhcCcgZ29tYiBtdXRhdMOhc2FcIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJMYXBvayBjw61tw6luZWsgbXV0YXTDoXNhXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwiQmVmZWplesWRIHN6w7Z2ZWcgbXV0YXTDoXNhIGEga8OpcmTFkcOtdiBiZWZlamV6w6lzZWtvclwiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCJMYXBvayBzesOhbcOhbmFrIG11dGF0w6FzYVwiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJLw6lyZMOpcyBoaWJhw7x6ZW5ldMOpbmVrIGhlbHl6ZXRlXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIkVsxZFyZWhhbGFkw6FzLW11dGF0w7MgbWVnamVsZW7DrXTDqXNlXCIsXG4gICAgbW9kZTogXCJNw7NkIChzemVya2VzenTDqXMvbWVndGVraW50w6lzKVwiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6XG4gICAgICBcIk1pbmRlbiBrw6lyZMOpcyBtZWd2w6FsYXN6b2zDoXNha29yIGF1dG9tYXRpa3VzYW4gYSBrw7Z2ZXRrZXrFkSBsYXByYSBsw6lww6lzXCIsXG4gICAgY2hlY2tFcnJvcnNNb2RlOiBcIkhpYmF2aXpzZ8OhbGF0XCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiTmVtbMOhdGhhdMOzIMOpcnTDqWtlayB0w7ZybMOpc2VcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwiJ0tlemTDqXMnIGdvbWIgZmVsaXJhdGFcIixcbiAgICBwYWdlUHJldlRleHQ6IFwiJ0VsxZF6xZEgbGFwJyBnb21iIGZlbGlyYXRhXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIidLw7Z2ZXRrZXrFkSBsYXAnIGdvbWIgZmVsaXJhdGFcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiJ0JlZmVqZXrDqXMnIGdvbWIgZmVsaXJhdGFcIixcbiAgICByZXF1aXJlZFRleHQ6IFwiS8O2dGVsZXrFkSBzemltYsOzbHVtXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcIkvDqXJkw6lzIGtlemTFkWluZGV4ZSAoMSwgMiB2YWd5ICdBJywgJ2EnKVwiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTpcbiAgICAgIFwiS8OpcmTDqXMgY8OtbcOpbmVrIHNhYmxvbmphOiAne3N6w6FtfS4ge2vDtnRlbGV6xZF9IHtjw61tfSdcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwiQXogbWVna2V6ZGV0dCBsYXAgYSBrw6lyZMWRw612IGVsc8WRIG9sZGFsYS5cIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwiTWluZGVuIGVsZW0gbXV0YXTDoXNhIGVneSBsYXBvblwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiRWd5IGxhcCBraXTDtmx0w6lzw6lyZSBmb3Jkw610aGF0w7MgbWF4aW3DoWxpcyBpZMWRXCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwiSWTFkXrDrXTFkSBtdXRhdMOhc2FcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwiSWTFkXrDrXTFkSBtw7NkamFcIixcblxuICAgIGRlZmF1bHRQYW5lbFZhbHVlOiBcIlBhbmVsIGFsYXDDqXJ0ZWxtZXpldHQgw6lydMOpa2VcIixcbiAgICBkZWZhdWx0Um93VmFsdWU6IFwiU29yIGFsYXDDqXJ0ZWxtZXpldHQgw6lydMOpa2VcIixcbiAgICBoYXNOb25lOiBcIkxlaGV0IMO8cmVzXCIsXG4gICAgbm9uZVRleHQ6IFwiw5xyZXMgc3rDtnZlZ1wiLFxuXG4gICAgdGV4dDogXCJTesO2dmVnXCJcbiAgfVxufTtcbmVkaXRvckxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaHVcIl0gPSBodVN0cmluZ3M7XG4iLCJpbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5cbmV4cG9ydCB2YXIgaW5kb25lc2lhblN0cmluZ3MgPSB7XG4gIC8vc3VydmV5IHRlbXBsYXRlc1xuICBzdXJ2ZXk6IHtcbiAgICBlZGl0OiBcIlViYWhcIixcbiAgICBleHRlcm5hbEhlbHBMaW5rOiBcIlRvbnRvbiBkYW4gcGVsYWphcmkgY2FyYSBtZW1idWF0IHN1cnZlaVwiLFxuICAgIGV4dGVybmFsSGVscExpbmtVcmw6XG4gICAgICBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2NoYW5uZWwvVUNIMnJ1OW9rSWNvb05aZnBJYnlxNHFRP3ZpZXdfYXM9c3Vic2NyaWJlclwiLFxuICAgIGRyb3BRdWVzdGlvbjogXCJTaWxhaGthbiBsZXRha2thbiBwZXJ0YW55YWFuIGRpIHNpbmkgZGFyaSBLb3RhayBQZXJrYWthcyBkaSBzZWJlbGFoIGtpcmkuXCIsXG4gICAgY29weTogXCJTYWxpblwiLFxuICAgIGFkZFRvVG9vbGJveDogXCJUYW1iYWhrYW4ga2UgS290YWsgUGVya2FrYXNcIixcbiAgICBkZWxldGVQYW5lbDogXCJIYXB1cyBQYW5lbFwiLFxuICAgIGRlbGV0ZVF1ZXN0aW9uOiBcIkhhcHVzIFBlcnRhbnlhYW5cIixcbiAgICBjb252ZXJ0VG86IFwiTWVuZ3ViYWgga2VcIixcbiAgICBkcmFnOiBcIlRhcmlrIGVsZW1lblwiXG4gIH0sXG4gIC8vcXVlc3Rpb25UeXBlc1xuICBxdDoge1xuICAgIGRlZmF1bHQ6IFwiRGVmYXVsdFwiLFxuICAgIGNoZWNrYm94OiBcIktvdGFrIENlbnRhbmdcIixcbiAgICBjb21tZW50OiBcIktvbWVudGFyXCIsXG4gICAgaW1hZ2VwaWNrZXI6IFwiR2FtYmFyXCIsXG4gICAgZHJvcGRvd246IFwiS290YWsgS29tYm9cIixcbiAgICBmaWxlOiBcIkJlcmthc1wiLFxuICAgIGh0bWw6IFwiSHRtbFwiLFxuICAgIG1hdHJpeDogXCJNYXRyaWtzIChwaWxpaGFuIHR1bmdnYWwpXCIsXG4gICAgbWF0cml4ZHJvcGRvd246IFwiTWF0cmlrcyAocGlsaWhhbiBnYW5kYSlcIixcbiAgICBtYXRyaXhkeW5hbWljOiBcIk1hdHJpa3MgKGJhcmlzIGRpbmFtaXMpXCIsXG4gICAgbXVsdGlwbGV0ZXh0OiBcIlRla3MgR2FuZGFcIixcbiAgICBwYW5lbDogXCJQYW5lbFwiLFxuICAgIHBhbmVsZHluYW1pYzogXCJQYW5lbCAocGFuZWwgZGluYW1pcylcIixcbiAgICByYWRpb2dyb3VwOiBcIlBpbGloYW4gR2FuZGFcIixcbiAgICByYXRpbmc6IFwiUGVyaW5na2F0XCIsXG4gICAgdGV4dDogXCJJbnB1dCBUdW5nZ2FsXCIsXG4gICAgYm9vbGVhbjogXCJCb29sZWFuXCIsXG4gICAgZXhwcmVzc2lvbjogXCJFa3NwcmVzaSAoZGliYWNhIHNhamEpXCIsXG4gICAgZmxvd3BhbmVsOiBcIlBhbmVsIEFsaXJhblwiXG4gIH0sXG4gIC8vU3RyaW5ncyBpbiBFZGl0b3JcbiAgZWQ6IHtcbiAgICBkZWZhdWx0TG9jYWxlOiBcIkRlZmF1bHQgKHswfSlcIixcbiAgICBzdXJ2ZXk6IFwiU3VydmVpXCIsXG4gICAgc2V0dGluZ3M6IFwiUGVuZ2F0dXJhbiBTdXJ2ZWlcIixcbiAgICBvcGplY3RQcm9wZXJ0aWVzSGVhZGVyOiBcIkxhbmp1dGFuXCIsXG4gICAgc2hvd09iamVjdFByb3BlcnRpZXM6IFwiVGFtcGlsa2FuIFByb3BlcnRpIE9ieWVrXCIsXG4gICAgaGlkZU9iamVjdFByb3BlcnRpZXM6IFwiU2VtYnVueWlrYW4gUHJvcGVydGkgT2J5ZWtcIixcbiAgICBlZGl0U3VydmV5OiBcIlViYWggU3VydmVpXCIsXG4gICAgYWRkTmV3UGFnZTogXCJUYW1iYWggSGFsYW1hbiBCYXJ1XCIsXG4gICAgbW92ZVJpZ2h0OiBcIkdlc2VyIGtlIEthbmFuXCIsXG4gICAgbW92ZUxlZnQ6IFwiR2VzZXIga2UgS2lyaVwiLFxuICAgIGRlbGV0ZVBhZ2U6IFwiSGFwdXMgSGFsYW1hblwiLFxuICAgIGVkaXRQYWdlOiBcIlViYWggSGFsYW1hblwiLFxuICAgIGVkaXQ6IFwiVWJhaFwiLFxuICAgIG5ld1BhZ2VOYW1lOiBcImhhbGFtYW5cIixcbiAgICBuZXdRdWVzdGlvbk5hbWU6IFwicGVydGFueWFhblwiLFxuICAgIG5ld1BhbmVsTmFtZTogXCJwYW5lbFwiLFxuICAgIHRlc3RTdXJ2ZXk6IFwiQ29iYSBTdXJ2ZWlcIixcbiAgICB0ZXN0U3VydmV5QWdhaW46IFwiQ29iYSBTdXJ2ZWkgTGFnaVwiLFxuICAgIHRlc3RTdXJ2ZXlXaWR0aDogXCJMZWJhciBzdXJ2ZWk6IFwiLFxuICAgIGVtYmVkU3VydmV5OiBcIkVtYmVkIFN1cnZlaVwiLFxuICAgIHRyYW5zbGF0aW9uOiBcIlRlcmplbWFoYW5cIixcbiAgICBzYXZlU3VydmV5OiBcIlNpbXBhbiBTdXJ2ZWlcIixcbiAgICBkZXNpZ25lcjogXCJSYW5jYW5nYW4gU3VydmVpXCIsXG4gICAganNvbkVkaXRvcjogXCJQZW5ndWJhaCBKU09OXCIsXG4gICAgdW5kbzogXCJVcnVuZ2thblwiLFxuICAgIHJlZG86IFwiVWxhbmdpXCIsXG4gICAgb3B0aW9uczogXCJQaWxpaGFuXCIsXG4gICAgZ2VuZXJhdGVWYWxpZEpTT046IFwiSGFzaWxrYW4gSlNPTiB5YW5nIFZhbGlkXCIsXG4gICAgZ2VuZXJhdGVSZWFkYWJsZUpTT046IFwiSGFzaWxrYW4gSlNPTiB5YW5nIGRhcGF0IGRpYmFjYVwiLFxuICAgIHRvb2xib3g6IFwiS290YWsgUGVya2FrYXNcIixcbiAgICB0b29sYm94R2VuZXJhbENhdGVnb3J5OiBcIlVtdW1cIixcbiAgICBkZWxTZWxPYmplY3Q6IFwiSGFwdXMgb2JqZWsgeWFuZyBkaXBpbGloXCIsXG4gICAgZWRpdFNlbE9iamVjdDogXCJVYmFoIG9iamVrIHlhbmcgZGlwaWxpaFwiLFxuICAgIGNvcnJlY3RKU09OOiBcIlBsZWFzZSBjb3JyZWN0IEpTT04uXCIsXG4gICAgc3VydmV5UmVzdWx0czogXCJIYXNpbCBzdXJ2ZWk6IFwiLFxuICAgIHN1cnZleVJlc3VsdHNUYWJsZTogXCJTZWJhZ2FpIHRhYmVsXCIsXG4gICAgc3VydmV5UmVzdWx0c0pzb246IFwiU2ViYWdhaSBKU09OXCIsXG4gICAgcmVzdWx0c1RpdGxlOiBcIkp1ZHVsIFBlcnRhbnlhYW5cIixcbiAgICByZXN1bHRzTmFtZTogXCJOYW1hIFBlcnRhbnlhYW5cIixcbiAgICByZXN1bHRzVmFsdWU6IFwiTmlsYWkgSmF3YWJhblwiLFxuICAgIHJlc3VsdHNEaXNwbGF5VmFsdWU6IFwiVGFtcGlsa2FuIE5pbGFpXCIsXG4gICAgbW9kaWZpZWQ6IFwiRGltb2RpZmlrYXNpXCIsXG4gICAgc2F2aW5nOiBcIk1lbnlpbXBhblwiLFxuICAgIHNhdmVkOiBcIlRlcnNpbXBhblwiLFxuICAgIHNhdmVFcnJvcjogXCJFcnJvciEgS29udGVuIGVkaXRvciB0aWRhayBiZXJoYXNpbCBkaXNpbXBhbi5cIixcbiAgICB0cmFuc2xhdGlvbkFkZExhbmd1YWdlOiBcIlBpbGloIGJhaGFzYSB1bnR1ayB0ZXJqZW1haGFuXCIsXG4gICAgdHJhbnNsYXRpb25TaG93QWxsU3RyaW5nczogXCJUYW1waWxrYW4gc2VsdXJ1aCBzdHJpbmdcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxQYWdlczogXCJUYW1waWxrYW4gc2VsdXJ1aCBoYWxhbWFuXCIsXG4gICAgdHJhbnNsYXRpb25Ob1N0cmluZ3M6IFwiVGlkYWsgYWRhIHN0cmluZyBkaXRlcmplbWFoa2FuLiBTaWxhaGthbiBnYW50aSBwZW55YXJpbmcuXCIsXG4gICAgdHJhbnNsYXRpb25FeHBvcnRUb1NDVkJ1dHRvbjogXCJFa3Nwb3J0IGtlIENTVlwiLFxuICAgIHRyYW5zbGF0aW9uSW1wb3J0RnJvbVNDVkJ1dHRvbjogXCJJbXBvcnQgZGFyaSBDU1ZcIixcbiAgICB0cmFuc2xhdGlvbk1lcmdlTG9jYWxlV2l0aERlZmF1bHQ6IFwiR2FidW5na2FuIHswfSBkZW5nYW4gZGVmYXVsdCBsb2NhbGVcIixcbiAgICBib2xkOiBcIlRlYmFsXCIsXG4gICAgaXRhbGljOiBcIk1pcmluZ1wiLFxuICAgIHVuZGVybGluZTogXCJHYXJpcyBCYXdhaFwiLFxuICAgIGZwQWRkUXVlc3Rpb246IFwiVGFtYmFoIHBlcnRhbnlhYW4uLi5cIixcbiAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25JdGVtVGV4dDogXCJUYW1waWxrYW4gamlrYTpcIlxuICB9LFxuICAvL1Byb3BlcnR5IG5hbWVzIGluIHRhYmxlIGhlYWRlcnNcbiAgcGVsOiB7XG4gICAgaXNSZXF1aXJlZDogXCJXYWppYj9cIlxuICB9LFxuICAvL1Byb3BlcnR5IEVkaXRvcnNcbiAgcGU6IHtcbiAgICBhcHBseTogXCJUZXJhcGthblwiLFxuICAgIG9rOiBcIk9LXCIsXG4gICAgY2FuY2VsOiBcIkJhdGFsXCIsXG4gICAgcmVzZXQ6IFwiUmVzZXRcIixcbiAgICBjbG9zZTogXCJUdXR1cFwiLFxuICAgIGRlbGV0ZTogXCJIYXB1c1wiLFxuICAgIGFkZE5ldzogXCJUYW1iYWhrYW4gQmFydVwiLFxuICAgIGFkZEl0ZW06IFwiS2xpayB1bnR1ayBtZW5hbWJhaGthbiBzZWJ1YWggaXRlbS4uLlwiLFxuICAgIHJlbW92ZUFsbDogXCJIYXB1cyBTZW11YVwiLFxuICAgIGVkaXQ6IFwiVWJhaFwiLFxuICAgIGl0ZW1WYWx1ZUVkaXQ6IFwiRGl0YW1waWxrYW4gSmlrYVwiLFxuICAgIGVkaXRDaG9pY2VzOiBcIlViYWggUGlsaWhhblwiLFxuICAgIG1vdmU6IFwiUGluZGFoXCIsXG4gICAgZW1wdHk6IFwiPGtvc29uZz5cIixcbiAgICBub3RFbXB0eTogXCI8dWJhaCBuaWxhaT5cIixcbiAgICBmYXN0RW50cnk6IFwiRW50cmkgQ2VwYXRcIixcbiAgICBmb3JtRW50cnk6IFwiRW50cmkgRm9ybVwiLFxuICAgIHRlc3RTZXJ2aWNlOiBcIkNvYmEgbGF5YW5hblwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFF1ZXN0aW9uOiBcIlBpbGloIHBlcnRhbnlhYW4uLi5cIixcbiAgICBjb25kaXRpb25WYWx1ZVF1ZXN0aW9uVGl0bGU6IFwiU2lsYWhrYW4gbWFzdWtrYW4vcGlsaWggbmlsYWlcIixcbiAgICBjb25kaXRpb25CdXR0b25BZGQ6IFwiVGFtYmFoXCIsXG4gICAgY29uZGl0aW9uQnV0dG9uUmVwbGFjZTogXCJHYW50aVwiLFxuICAgIGNvbmRpdGlvbkhlbHA6XG4gICAgICBcIlNpbGFoa2FuIG1hc3Vra2FuIGVrc3ByZXNpIGJvb2xlYW4uIEhhcnVzIG1lbmdlbWJhbGlrYW4gJ2JlbmFyJyBhZ2FyIHBlcnRhbnlhYW4gZGFwYXQgdGVybGloYXQuIENvbnRvaDoge3F1ZXN0aW9uMX0gPSAnbmlsYWkxJyBvciAoe3F1ZXN0aW9uMn0gKiB7cXVlc3Rpb240fSAgPiAyMCBhbmQge3F1ZXN0aW9uM30gPCA1KVwiLFxuICAgIGV4cHJlc3Npb25IZWxwOlxuICAgICAgXCJTaWxhaGthbiBtYXN1a2FuIHNlYnVhaCBla3NwcmVzaS4gQW5kYSBkYXBhdCBtZW5nZ3VuYWthbiBrdXJ1bmcga3VyYXdhbCB1bnR1ayBtZW5kYXBhdGthbiBha3NlcyBwYWRhIG5pbGFpIHBlcnRhbnlhYW46ICd7cXVlc3Rpb24xfSArIHtxdWVzdGlvbjJ9JywgJyh7cHJpY2V9KntxdWFudGl0eX0pICogKDEwMCAtIHtkaXNjb3VudH0pJ1wiLFxuICAgIGFjZUVkaXRvckhlbHA6IFwiVGVrYW4gY3RybCtzcGFzaSB1bnR1ayBtZW5kYXBhdGthbiBwZXR1bmp1ayBwZW55ZWxlc2FpYW4gZWtzcHJlc2lcIixcbiAgICBhY2VFZGl0b3JSb3dUaXRsZTogXCJCYXJpcyBzYWF0IGluaVwiLFxuICAgIGFjZUVkaXRvclBhbmVsVGl0bGU6IFwiUGFuZWwgc2FhdCBpbmlcIixcbiAgICBzaG93TW9yZTogXCJVbnR1ayBkZXRpbCBzZWxhbmp1dG55YSBzaWxhaGthbiBwZXJpa3NhIGRva3VtZW50YXNpXCIsXG4gICAgY29uZGl0aW9uU2hvd01vcmVVcmw6XG4gICAgICBcImh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5UGFyYW1ldGVyP2lkPVF1ZXN0aW9uJnBhcmFtZXRlcj12aXNpYmxlSWZcIixcbiAgICBhc3Npc3RhbnRUaXRsZTogXCJQZXJ0YW55YWFuIHRlcnNlZGlhOlwiLFxuICAgIGNlbGxzRW1wdHlSb3dzQ29sdW1uczogXCJIYXJ1cyBhZGEgc2V0aWRha255YSBzYXR1IGtvbG9tIGF0YXUgYmFyaXNcIixcblxuICAgIHByb3BlcnR5SXNFbXB0eTogXCJTaWxhaGthbiBtYXN1a2thbiBuaWxhaVwiLFxuICAgIHZhbHVlOiBcIk5pbGFpXCIsXG4gICAgdGV4dDogXCJUZWtzXCIsXG4gICAgcm93aWQ6IFwiSUQgYmFyaXNcIixcbiAgICBpbWFnZUxpbms6IFwiTGluayBHYW1iYXJcIixcbiAgICBjb2x1bW5FZGl0OiBcIlViYWgga29sb206IHswfVwiLFxuICAgIGl0ZW1FZGl0OiBcIlViYWggaXRlbTogezB9XCIsXG5cbiAgICB1cmw6IFwiVVJMXCIsXG4gICAgcGF0aDogXCJQYXRoXCIsXG4gICAgdmFsdWVOYW1lOiBcIk5hbWEgbmlsYWlcIixcbiAgICB0aXRsZU5hbWU6IFwiTmFtYSBqdWR1bFwiLFxuXG4gICAgaGFzT3RoZXI6IFwiTWVtaWxpa2kgaXRlbSBsYWluXCIsXG4gICAgb3RoZXJUZXh0OiBcIlRla3MgaXRlbSBsYWluXCIsXG4gICAgbmFtZTogXCJOYW1hXCIsXG4gICAgdGl0bGU6IFwiSnVkdWxcIixcbiAgICBjZWxsVHlwZTogXCJKZW5pcyBzZWxcIixcbiAgICBjb2xDb3VudDogXCJKdW1sYWgga29sb21cIixcbiAgICBjaG9pY2VzT3JkZXI6IFwiVGVudHVrYW4gdXJ1dGFuIHBpbGloYW5cIixcbiAgICB2aXNpYmxlOiBcIlRlcmxpaGF0P1wiLFxuICAgIGlzUmVxdWlyZWQ6IFwiV2FqaWI/XCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCJNdWxhaSBkZW5nYW4gYmFyaXMgYmFydT9cIixcbiAgICByb3dzOiBcIkp1bWxhaCBiYXJpc1wiLFxuICAgIHBsYWNlSG9sZGVyOiBcIk1hc3Vra2FuIHBsYWNlaG9sZGVyXCIsXG4gICAgc2hvd1ByZXZpZXc6IFwiVHVuanVra2FuIHRpbmphdWFuIGdhbWJhcj9cIixcbiAgICBzdG9yZURhdGFBc1RleHQ6IFwiU2ltcGFuIGtvbnRlbiBiZXJrYXMgZGFsYW0gaGFzaWwgSlNPTiBzZWJhZ2FpIHRla3NcIixcbiAgICBtYXhTaXplOiBcIlVrdXJhbiBtYWtzaW11bSBiZXJrYXMgZGFsYW0gYnl0ZVwiLFxuICAgIGltYWdlSGVpZ2h0OiBcIlRpbmdnaSBnYW1iYXJcIixcbiAgICBpbWFnZVdpZHRoOiBcIkxlYmFyIGdhbWJhclwiLFxuICAgIHJvd0NvdW50OiBcIkp1bWxhaCBiYXJpc1wiLFxuICAgIGNvbHVtbkxheW91dDogXCJUYXRhIGxldGFrIGtvbG9tXCIsXG4gICAgYWRkUm93TG9jYXRpb246IFwiVGFtYmFoIGxva2FzaSB0b21ib2wgYmFyaXNcIixcbiAgICBhZGRSb3dUZXh0OiBcIlRla3MgdGFtYmFoIHRvbWJvbCBiYXJpc1wiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwiVGVrcyBoYXB1cyB0b21ib2wgYmFyaXNcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwiRGVza3JpcHNpIG5pbGFpIG1pbmltdW1cIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwiRGVza3JpcHNpIG5pbGFpIG1ha3NpbXVtXCIsXG4gICAgaW5wdXRUeXBlOiBcIkplbmlzIG1hc3VrYW5cIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJLZXRlcmFuZ2FuIHBpbGloYW5cIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiTmlsYWkgc3RhbmRhclwiLFxuICAgIGNlbGxzRGVmYXVsdFJvdzogXCJUZWtzIHNlbCBzdGFuZGFyXCIsXG5cbiAgICBzdXJ2ZXlFZGl0b3JUaXRsZTogXCJVYmFoIHBlbmdhdHVyYW4gc3VydmVpXCIsXG4gICAgcUVkaXRvclRpdGxlOiBcIlViYWg6IHswfVwiLFxuXG4gICAgbWF4TGVuZ3RoOiBcIlBhbmphbmcgbWFrc2ltdW1cIixcblxuICAgIC8vc3VydmV5XG4gICAgc2hvd1RpdGxlOiBcIlRhbXBpbGthbi9zZW1idW55aWthbiBqdWR1bFwiLFxuICAgIGxvY2FsZTogXCJCYWhhc2Egc3RhbmRhclwiLFxuICAgIG1vZGU6IFwiTW9kZSAodWJhaC9iYWNhIHNhamEpXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiQmVyc2loa2FuIG5pbGFpIHRhayB0ZXJsaWhhdFwiLFxuICAgIGNvb2tpZU5hbWU6IFwiTmFtYSBjb29raWUgKHVudHVrIG1lbm9uYWt0aWZrYW4gbWVuamFsYW5rYW4gc3VydmVpIGR1YSBrYWxpIHNlY2FyYSBsb2thbClcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCJLaXJpbSBoYXNpbCBzdXJ2ZWkgcGFkYSBoYWxhbWFuIHNlbGFuanV0bnlhXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiU2ltcGFuIG5pbGFpICdsYWlubnlhJyBwYWRhIGJpZGFuZyBsYWlubnlhXCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwiVGFtcGlsa2FuIGp1ZHVsIGhhbGFtYW5cIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwiVGFtcGlsa2FuIG5vbW9yIGhhbGFtYW5cIixcbiAgICBwYWdlUHJldlRleHQ6IFwiVGVrcyBoYWxhbWFuIHRvbWJvbCBzZWJlbHVtbnlhXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIlRla3MgaGFsYW1hbiB0b21ib2wgc2VsYW5qdXRueWFcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiVGVrcyB0b21ib2wgc2VsZXNhaVwiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJUZWtzIHRvbWJvbCBtdWxhaVwiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczogXCJUYW1waWxrYW4gdG9tYm9sIG5hdmlnYXNpIChuYXZpZ2FzaSBzdGFuZGFyKVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcIlRhbXBpbGthbiB0b21ib2wgc2ViZWx1bW55YSAocGVuZ2d1bmEgbXVuZ2tpbiBrZW1iYWxpIGtlIGhhbGFtYW4gc2ViZWx1bW55YSlcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwiSGFsYW1hbiBwZXJ0YW1hIHBhZGEgc3VydmVpIGFkYWxhaCBoYWxhbWFuIHlhbmcgdGVsYWggZGltdWxhaS5cIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCJUYW1waWxrYW4ga2VzZWx1cnVoYW4gaGFsYW1hbiBkaSBha2hpciAoY29tcGxldGVkSHRtbClcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOlxuICAgICAgXCJTZXRlbGFoIG1lbmphd2Egc2VsdXJ1aCBwZXJ0YW55YWFuLCBwZXJnaSBrZSBoYWxhbWFuIGJlcmlrdXRueWEgc2VjYXJhIG90b21hdGlzXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIlRhbXBpbGthbiBwcm9ncmVzcyBiYXJcIixcbiAgICBxdWVzdGlvblRpdGxlTG9jYXRpb246IFwiTG9rYXNpIGp1ZHVsIHBlcnRhbnlhYW5cIixcbiAgICByZXF1aXJlZFRleHQ6IFwiU2ltYmlsIHBlcnRhbnlhYW4gd2FqaWJcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwiSW5kZWtzIG11bGFpIHBlcnRhbnlhYW4gKDEsIDIgYXRhdSAnQScsICdhJylcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIlRhbXBpbGthbiBub21vciBwZXJ0YW55YWFuXCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOlxuICAgICAgXCJUZW1wbGF0ZSBKdWR1bCBQZXJ0YW55YWFuLCBkZWZhdWx0IGFkYWxhaDogJ3tub30uIHtyZXF1aXJlfSB7dGl0bGV9J1wiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJMb2thc2kgUGVydGFueWFhbiBFcnJvclwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzogXCJGb2t1cyBrZSBwZXJ0YW55YWFuIHBlcnRhbWEgc2FhdCBwZXJnYW50aWFuIGhhbGFtYW5cIixcbiAgICBxdWVzdGlvbnNPcmRlcjogXCJVcnV0YWthbiBlbGVtZW4gcGFkYSBoYWxhYW5cIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwiV2FrdHUgbWFrc2ltdW0gdW50dWsgbWVueWVsZXNhaWthbiBzdXJ2ZWlcIixcbiAgICBtYXhUaW1lVG9GaW5pc2hQYWdlOiBcIldha3R1IG1ha3NpbXVtIHVudHVrIG1lbnllbGVzYWlrYW4gc3VhdHUgaGFsYW1hblwiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcIlRhbXBpbGthbiBwYW5lbCBwZW5nYXR1ciB3YWt0dVwiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCJUYW1waWxrYW4gbW9kZSBwYW5lbCBwZW5nYXR1ciB3YWt0dVwiLFxuICAgIHJlbmRlck1vZGU6IFwiTW9kZSByZW5kZXJcIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIkJvbGVoa2FuIHBlbmFtYmFoYW4gcGFuZWxcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIkJvbGVoa2FuIHBlbmdoYXB1c2FuIHBhbmVsXCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcIlRla3MgdGFtYmFoIHBhbmVsXCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcIlRla3MgaGFwdXMgcGFuZWxcIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwiVGFtcGlsa2FuIHNlbHVydWggZWxlbWVuIHBhZGEgaGFsYW1hblwiLFxuICAgIGh0bWw6IFwiSHRtbFwiLFxuICAgIGV4cHJlc3Npb246IFwiRWtzcHJlc2lcIixcbiAgICBcbiAgICBtaW5WYWx1ZTogXCJOaWxhaSBtaW5pbXVtXCIsXG4gICAgbWF4VmFsdWU6IFwiTmlsYWkgbWFrc2ltdW1cIixcbiAgICBtaW5MZW5ndGg6IFwiUGFuamFuZyBtaW5pbXVtXCIsXG4gICAgYWxsb3dEaWdpdHM6IFwiQm9sZWhrYW4gYW5na2FcIixcbiAgICBtaW5Db3VudDogXCJIaXR1bmdhbiBtaW5pbXVtXCIsXG4gICAgbWF4Q291bnQ6IFwiSGl0dW5nYW4gbWFrc2ltdW1cIixcbiAgICByZWdleDogXCJFa3NwcmVzaSByZWd1bGVyXCIsXG5cbiAgICB0b3RhbFRleHQ6IFwiVG90YWwgdGVrc1wiLFxuICAgIHRvdGFsVHlwZTogXCJUb3RhbCBqZW5pc1wiLFxuICAgIHRvdGFsRXhwcmVzc2lvbjogXCJUb3RhbCBla3NwcmVzaVwiLFxuICAgIHRvdGFsRGlzcGxheVN0eWxlOiBcIlRvdGFsIGdheWEgdGFtcGlsYW5cIixcbiAgICB0b3RhbEN1cnJlbmN5OiBcIlRvdGFsIG1hdGEgdWFuZ1wiLFxuICAgIHRvdGFsRm9ybWF0OiBcIlRvdGFsIGZvcm1hdFwiLFxuXG4gICAgdGFiczoge1xuICAgICAgZ2VuZXJhbDogXCJVbXVtXCIsXG4gICAgICBmaWxlT3B0aW9uczogXCJQaWxpaGFuIGJlcmthc1wiLFxuICAgICAgaHRtbDogXCJFZGl0b3IgSHRtbFwiLFxuICAgICAgY29sdW1uczogXCJLb2xvbVwiLFxuICAgICAgcm93czogXCJCYXJpc1wiLFxuICAgICAgY2hvaWNlczogXCJQaWxpaGFuXCIsXG4gICAgICBpdGVtczogXCJCYXJhbmdcIixcbiAgICAgIHZpc2libGVJZjogXCJUZXJsaWhhdCBKaWthXCIsXG4gICAgICBlbmFibGVJZjogXCJNZW11bmdraW5rYW4gSmlrYVwiLFxuICAgICAgcmVxdWlyZWRJZjogXCJXYWppYiBKaWthXCIsXG4gICAgICByYXRlVmFsdWVzOiBcIk5pbGFpIFRpbmdrYXRcIixcbiAgICAgIGNob2ljZXNCeVVybDogXCJQaWxpaCBkYXJpIFdlYlwiLFxuICAgICAgbWF0cml4Q2hvaWNlczogXCJQaWxpaGFuIFN0YW5kYXJcIixcbiAgICAgIG11bHRpcGxlVGV4dEl0ZW1zOiBcIk1hc3VrYW4gVGVrc1wiLFxuICAgICAgdmFsaWRhdG9yczogXCJWYWxpZGF0b3JcIixcbiAgICAgIG5hdmlnYXRpb246IFwiTmF2aWdhc2lcIixcbiAgICAgIHF1ZXN0aW9uOiBcIlBlcnRhbnlhYW5cIixcbiAgICAgIGNvbXBsZXRlZEh0bWw6IFwiSHRtbCBTZWxlc2FpXCIsXG4gICAgICBsb2FkaW5nSHRtbDogXCJNZW11YXQgSHRtbFwiLFxuICAgICAgdGltZXI6IFwiUGVuZ2F0dXIgV2FrdHUvS3Vpc1wiLFxuICAgICAgdHJpZ2dlcnM6IFwiVHJpZ2dlclwiLFxuICAgICAgdGVtcGxhdGVUaXRsZTogXCJKdWR1bCB0ZW1wbGF0XCIsXG4gICAgICB0b3RhbHM6IFwiVG90YWxcIlxuICAgIH0sXG4gICAgZWRpdFByb3BlcnR5OiBcIlViYWggcHJvcGVydGkgJ3swfSdcIixcbiAgICBpdGVtczogXCJbIEJhcmFuZzogezB9IF1cIixcblxuICAgIGVudGVyTmV3VmFsdWU6IFwiU2lsYWhrYW4gbWFzdWtrYW4gbmlsYWlcIixcbiAgICBub3F1ZXN0aW9uczogXCJUaWRhayBhZGEgcGVydGFueWFhbiBkYWxhbSBzdXJ2ZWkuXCIsXG4gICAgY3JlYXRldHJpZ2dlcjogXCJTaWxhaGthbiBidWF0IHNlYnVhaCB0cmlnZ2VyXCIsXG4gICAgdHJpZ2dlck9uOiBcIk9uIFwiLFxuICAgIHRyaWdnZXJNYWtlUGFnZXNWaXNpYmxlOiBcIkJ1YXQgaGFsYW1hbiB0ZXJsaWhhdDpcIixcbiAgICB0cmlnZ2VyTWFrZVF1ZXN0aW9uc1Zpc2libGU6IFwiQnVhdCBlbGVtZW4gdGVybGloYXQ6XCIsXG4gICAgdHJpZ2dlckNvbXBsZXRlVGV4dDogXCJTZWxlc2Fpa2FuIHN1cnZlaSBqaWthIHN1a3Nlcy5cIixcbiAgICB0cmlnZ2VyTm90U2V0OiBcIlRyaWdnZXIgYmVsdW0gZGlhdHVyXCIsXG4gICAgdHJpZ2dlclJ1bklmOiBcIkJlcmphbGFuIGppa2FcIixcbiAgICB0cmlnZ2VyU2V0VG9OYW1lOiBcIlViYWggbmlsYWkgZGFyaTogXCIsXG4gICAgdHJpZ2dlckZyb21OYW1lOiBcIlNhbGluIG5pbGFpIGRhcmk6IFwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uOiBcIkphbGFua2FuIGVrc3ByZXNpIGluaTpcIixcbiAgICB0cmlnZ2VyU2V0VmFsdWU6IFwia2U6IFwiLFxuICAgIHRyaWdnZXJJc1ZhcmlhYmxlOiBcIkphbmdhbiBtZWxldGFra2FuIHZhcmlhYmVsIGtlIGhhc2lsIHN1cnZleS5cIlxuICB9LFxuICAvL1Byb3BlcnR5IHZhbHVlc1xuICBwdjoge1xuICAgIHRydWU6IFwiYmVuYXJcIixcbiAgICBmYWxzZTogXCJzYWxhaFwiLFxuICAgIGluaGVyaXQ6IFwiaW5oZXJpdFwiLFxuICAgIHNob3c6IFwidGFtcGlsa2FuXCIsXG4gICAgaGlkZTogXCJzZW1idW55aWthblwiLFxuICAgIGRlZmF1bHQ6IFwic3RhbmRhclwiLFxuICAgIGluaXRpYWw6IFwiaW5pc2lhbFwiLFxuICAgIHJhbmRvbTogXCJhY2FrXCIsXG4gICAgY29sbGFwc2VkOiBcImRpbGlwYXRcIixcbiAgICBleHBhbmRlZDogXCJkaXJlbnRhbmdrYW5cIixcbiAgICBub25lOiBcInRpZGFrIGFkYVwiLFxuICAgIGFzYzogXCJuYWlrXCIsXG4gICAgZGVzYzogXCJ0dXJ1blwiLFxuICAgIGluZGV0ZXJtaW5hdGU6IFwidGlkYWsgdGVudHVcIixcbiAgICBkZWNpbWFsOiBcImRlc2ltYWxcIixcbiAgICBjdXJyZW5jeTogXCJtYXRhIHVhbmdcIixcbiAgICBwZXJjZW50OiBcInBlcnNlblwiLFxuICAgIGZpcnN0RXhwYW5kZWQ6IFwicGVybHVhc2FuUGVydGFtYVwiLFxuICAgIG9mZjogXCJtYXRpXCIsXG4gICAgb25QYW5lbDogXCJwYWRhIFBhbmVsXCIsXG4gICAgb25TdXJ2ZXk6IFwicGFkYSBTdXJ2ZWlcIixcbiAgICBsaXN0OiBcImRhZnRhclwiLFxuICAgIHByb2dyZXNzVG9wOiBcInByb2dyZXNzIGF0YXNcIixcbiAgICBwcm9ncmVzc0JvdHRvbTogXCJwcm9ncmVzcyBiYXdhaFwiLFxuICAgIHByb2dyZXNzVG9wQm90dG9tOiBcInByb2dyZXNzIGF0YXMgYmF3YWhcIixcbiAgICBob3Jpem9udGFsOiBcImhvcml6b250YWxcIixcbiAgICB2ZXJ0aWNhbDogXCJ2ZXJ0aWthbFwiLFxuICAgIHRvcDogXCJhdGFzXCIsXG4gICAgYm90dG9tOiBcImJhd2FoXCIsXG4gICAgdG9wQm90dG9tOiBcImF0YXMgZGFuIGJhd2FoXCIsXG4gICAgbGVmdDogXCJraXJpXCIsXG4gICAgY29sb3I6IFwid2FybmFcIixcbiAgICBkYXRlOiBcInRhbmdnYWxcIixcbiAgICBkYXRldGltZTogXCJ0YW5nZ2FsJndha3R1XCIsXG4gICAgXCJkYXRldGltZS1sb2NhbFwiOiBcInRhbmdnYWwmd2FrdHUtbG9rYWxcIixcbiAgICBlbWFpbDogXCJzdXJlbFwiLFxuICAgIG1vbnRoOiBcImJ1bGFuXCIsXG4gICAgbnVtYmVyOiBcIm5vbW9yXCIsXG4gICAgcGFzc3dvcmQ6IFwia2F0YSBzYW5kaVwiLFxuICAgIHJhbmdlOiBcInJlbnRhbmdcIixcbiAgICB0ZWw6IFwidGVsZXBvblwiLFxuICAgIHRleHQ6IFwidGVrc1wiLFxuICAgIHRpbWU6IFwid2FrdHVcIixcbiAgICB1cmw6IFwidXJsXCIsXG4gICAgd2VlazogXCJtaW5nZ3VcIixcbiAgICBoaWRkZW46IFwidGVyc2VtYnVueWlcIixcbiAgICBvbjogXCJueWFsYVwiLFxuICAgIG9uUGFnZTogXCJwYWRhIGhhbGFtYW5cIixcbiAgICBlZGl0OiBcInViYWhcIixcbiAgICBkaXNwbGF5OiBcInRhbXBpbGFuXCIsXG4gICAgb25Db21wbGV0ZTogXCJzYWF0IHNlbGVzYWlcIixcbiAgICBvbkhpZGRlbjogXCJzYWF0IHRlcnNlbWJ1bnlpXCIsXG4gICAgYWxsOiBcInNlbXVhXCIsXG4gICAgcGFnZTogXCJoYWxhbWFuXCIsXG4gICAgc3VydmV5OiBcInN1cnZlaVwiLFxuICAgIG9uTmV4dFBhZ2U6IFwicGFkYSBoYWxhbWFuIHNlbGFuanV0bnlhXCIsXG4gICAgb25WYWx1ZUNoYW5nZWQ6IFwic2FhdCBuaWxhaSBiZXJ1YmFoXCJcbiAgfSxcbiAgLy9PcGVyYXRvcnNcbiAgb3A6IHtcbiAgICBlbXB0eTogXCJrb3NvbmdcIixcbiAgICBub3RlbXB0eTogXCJ0aWRhayBrb3NvbmdcIixcbiAgICBlcXVhbDogXCJzYW1hIGRlbmdhblwiLFxuICAgIG5vdGVxdWFsOiBcInRpZGFrIHNhbWEgZGVuZ2FuXCIsXG4gICAgY29udGFpbnM6IFwibWVuZ2FuZHVuZ1wiLFxuICAgIG5vdGNvbnRhaW5zOiBcInRpZGFrIG1lbmdhbmR1bmdcIixcbiAgICBncmVhdGVyOiBcImxlYmloIGJlc2FyXCIsXG4gICAgbGVzczogXCJsZWJpaCBrZWNpbFwiLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBcImxlYmloIGJlc2FyIGF0YXUgc2FtYSBkZW5nYW5cIixcbiAgICBsZXNzb3JlcXVhbDogXCJsZWJpaCBrZWNpbCBhdGF1IHNhbWEgZGVuZ2FuXCJcbiAgfSxcbiAgLy9FbWJlZCB3aW5kb3dcbiAgZXc6IHtcbiAgICBhbmd1bGFyOiBcIkd1bmFrYW4gdmVyc2kgQW5ndWxhclwiLFxuICAgIGpxdWVyeTogXCJHdW5ha2FuIHZlcnNpIEpRdWVyeVwiLFxuICAgIGtub2Nrb3V0OiBcIkd1bmFrYW4gdmVyc2kgS25vY2tvdXRcIixcbiAgICByZWFjdDogXCJHdW5ha2FuIHZlcnNpIFJlYWN0XCIsXG4gICAgdnVlOiBcIkd1bmFrYW4gdmVyc2kgVnVlXCIsXG4gICAgYm9vdHN0cmFwOiBcIlVudHVrIGZyYW1ld29yayBib290c3RyYXBcIixcbiAgICBzdGFuZGFyZDogXCJUaWRhayBhZGEgYm9vdHN0cmFwXCIsXG4gICAgc2hvd09uUGFnZTogXCJUYW1waWxrYW4gc3VydmVpIHBhZGEgc2VidWFoIGhhbGFtYW5cIixcbiAgICBzaG93SW5XaW5kb3c6IFwiVGFtcGlsa2FuIHN1cnZlaSBwYWRhIHNlYnVhaCBqZW5kZWxhXCIsXG4gICAgbG9hZEZyb21TZXJ2ZXI6IFwiTXVhdCBzdXJ2ZWkgSlNPTiBkYXJpIHNlcnZlclwiLFxuICAgIHRpdGxlU2NyaXB0OiBcIlNrcmlwIGRhbiBnYXlhXCIsXG4gICAgdGl0bGVIdG1sOiBcIkhUTUxcIixcbiAgICB0aXRsZUphdmFTY3JpcHQ6IFwiSmF2YVNjcmlwdFwiXG4gIH0sXG4gIC8vVGVzdCBTdXJ2ZXlcbiAgdHM6IHtcbiAgICBzZWxlY3RQYWdlOiBcIlBpbGloIGhhbGFtYW4gdW50dWsgZGljb2JhOlwiLFxuICAgIHNob3dJbnZpc2libGVFbGVtZW50czogXCJUYW1waWxrYW4gZWxlbWVuIHRhayB0ZXJsaWhhdFwiLFxuICAgIGVtcHR5U3VydmV5VGV4dDogXCJUaWRhayBhZGEgaGFsYW1hbiBhdGF1IHBlcnRhbnlhYW4geWFuZyB0ZXJzZWRpYSBkaSBzdXJ2ZWkgaW5pLlwiXG4gIH0sXG4gIHZhbGlkYXRvcnM6IHtcbiAgICBhbnN3ZXJjb3VudHZhbGlkYXRvcjogXCJqdW1sYWggamF3YWJhblwiLFxuICAgIGVtYWlsdmFsaWRhdG9yOiBcInN1cmVsXCIsXG4gICAgZXhwcmVzc2lvbnZhbGlkYXRvcjogXCJla3NwcmVzaVwiLFxuICAgIG51bWVyaWN2YWxpZGF0b3I6IFwibnVtZXJpa1wiLFxuICAgIHJlZ2V4dmFsaWRhdG9yOiBcImVrc3ByZXNpIHJlZ3VsZXJcIixcbiAgICB0ZXh0dmFsaWRhdG9yOiBcInRla3NcIlxuICB9LFxuICB0cmlnZ2Vyczoge1xuICAgIGNvbXBsZXRldHJpZ2dlcjogXCJzZWxlc2Fpa2FuIHN1cnZlaVwiLFxuICAgIHNldHZhbHVldHJpZ2dlcjogXCJhdHVyIG5pbGFpXCIsXG4gICAgY29weXZhbHVldHJpZ2dlcjogXCJzYWxpbiBuaWxhaVwiLFxuICAgIHJ1bmV4cHJlc3Npb250cmlnZ2VyOiBcImphbGFua2FuIGVrc3ByZXNpXCIsXG4gICAgdmlzaWJsZXRyaWdnZXI6IFwidWJhaCB2aXNpYmlsaXRhc1wiXG4gIH0sXG4gIC8vUHJvcGVydGllc1xuICBwOiB7XG4gICAgbmFtZTogXCJuYW1hXCIsXG4gICAgdGl0bGU6IHtcbiAgICAgIG5hbWU6IFwianVkdWxcIixcbiAgICAgIHRpdGxlOiBcIkJpYXJrYW4ga29zb25nLCBqaWthIHNhbWEgZGVuZ2FuICdOYW1hJ1wiXG4gICAgfSxcblxuICAgIG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eTogXCJ2aXNpYmlsaXRhcyB0b21ib2wgbmF2aWdhc2lcIixcbiAgICBxdWVzdGlvbnNPcmRlcjogXCJ1cnV0YW4gcGVydGFueWFhblwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJ3YWt0dSBtYWtzIHVudHVrIG1lbnllbGVzYWlrYW5cIixcblxuICAgIHZpc2libGU6IFwidGVybGloYXRcIixcbiAgICB2aXNpYmxlSWY6IFwidGVybGloYXQgamlrYVwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJsb2thc2kganVkdWwgcGVydGFueWFhblwiLFxuICAgIGRlc2NyaXB0aW9uOiBcImRlc2tyaXBzaVwiLFxuICAgIHN0YXRlOiBcImtlYWRhYW5cIixcbiAgICBpc1JlcXVpcmVkOiBcIndhamliXCIsXG4gICAgcmVxdWlyZWRJZjogXCJ3YWppYiBqaWthXCIsXG4gICAgaW5kZW50OiBcImluZGVudGFuc2lcIixcbiAgICByZXF1aXJlZEVycm9yVGV4dDogXCJ0ZWtzIGVycm9yIHdhamliXCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCJtdWxhaSBkZW5nYW4gYmFyaXMgYmFydVwiLFxuICAgIGlubmVySW5kZW50OiBcImluZGVuIGRhbGFtXCIsXG4gICAgcGFnZTogXCJoYWxhbWFuXCIsXG5cbiAgICB3aWR0aDogXCJsZWJhclwiLFxuXG4gICAgY29tbWVudFRleHQ6IFwidGVrcyBrb21lbnRhclwiLFxuICAgIHZhbHVlTmFtZTogXCJuYW1hIG5pbGFpXCIsXG4gICAgZW5hYmxlSWY6IFwiYWt0aWYgamlrYVwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJuaWxhaSBkZWZhdWx0XCIsXG4gICAgY29ycmVjdEFuc3dlcjogXCJqYXdhYmFuIGJlbmFyXCIsXG4gICAgcmVhZE9ubHk6IFwiYmFjYSBzYWphXCIsXG4gICAgdmFsaWRhdG9yczogXCJ2YWxpZGF0b3JcIixcbiAgICB0aXRsZUxvY2F0aW9uOiBcImxva2FzaSBqdWR1bFwiLFxuXG4gICAgaGFzQ29tbWVudDogXCJtZW1pbGlraSBrb21lbnRhclwiLFxuICAgIGhhc090aGVyOiBcIm1lbWlsaWtpIGxhaW5ueWFcIixcbiAgICBjaG9pY2VzOiBcInBpbGloYW5cIixcbiAgICBjaG9pY2VzT3JkZXI6IFwidXJ1dGthbiBwaWxpaGFuXCIsXG4gICAgY2hvaWNlc0J5VXJsOiBcInBpbGloYW4gZGFyaSBVUkxcIixcbiAgICBvdGhlclRleHQ6IFwidGVrcyBsYWlubnlhXCIsXG4gICAgb3RoZXJFcnJvclRleHQ6IFwidGVrcyBlcnJvciBsYWlubnlhXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwic2ltcGFuIGxhaW5ubnlhIHNlYmFnYWkga29tZW50YXJcIixcblxuICAgIGxhYmVsOiBcImxhYmVsXCIsXG4gICAgc2hvd1RpdGxlOiBcInRhbXBpbGthbiBqdWR1bFwiLFxuICAgIHZhbHVlVHJ1ZTogXCJuaWxhaSBiZW5hclwiLFxuICAgIHZhbHVlRmFsc2U6IFwibmlsYWkgc2FsYWhcIixcblxuICAgIGNvbHM6IFwia29sb21cIixcbiAgICByb3dzOiBcImJhcmlzXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwicGxhY2VIb2xkZXJcIixcblxuICAgIG9wdGlvbnNDYXB0aW9uOiBcImtldGVyYW5nYW4gcGlsaWhhblwiLFxuXG4gICAgZXhwcmVzc2lvbjogXCJla3NwcmVzaVwiLFxuICAgIGZvcm1hdDogXCJmb3JtYXRcIixcbiAgICBkaXNwbGF5U3R5bGU6IFwiZ2F5YSB0YW1waWxhblwiLFxuICAgIGN1cnJlbmN5OiBcIm1hdGEgdWFuZ1wiLFxuICAgIHVzZUdyb3VwaW5nOiBcImd1bmFrYW4ga2Vsb21wb2tcIixcblxuICAgIHNob3dQcmV2aWV3OiBcInRhbXBpbGthbiBwcmF0aW5qYXVcIixcbiAgICBhbGxvd011bHRpcGxlOiBcImJvbGVoa2FuIGdhbmRhXCIsXG4gICAgaW1hZ2VIZWlnaHQ6IFwidGluZ2dpIGdhbWJhclwiLFxuICAgIGltYWdlV2lkdGg6IFwibGViYXIgZ2FtYmFyXCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcInNpbXBhbiBkYXRhIHNlYmFnYWkgdGVrc1wiLFxuICAgIG1heFNpemU6IFwidWt1cmFuIG1ha3NcIixcblxuICAgIGh0bWw6IFwiaHRtbFwiLFxuXG4gICAgY29sdW1uczogXCJrb2xvbVwiLFxuICAgIGNlbGxzOiBcInNlbFwiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwic2VtdWFCYXJpc1dhamliXCIsXG5cbiAgICBob3Jpem9udGFsU2Nyb2xsOiBcImhvcml6b250YWxTY3JvbGxcIixcbiAgICBjZWxsVHlwZTogXCJqZW5pc1NlbFwiLFxuICAgIGNvbHVtbnNMYXlvdXQ6IFwidGF0YUxldGFrS29sb21cIixcbiAgICBjb2x1bW5Db2xDb3VudDogXCJqdW1sYWhLb2xvbVwiLFxuICAgIGNvbHVtbk1pbldpZHRoOiBcImxlYmFyTWluaW1hbEtvbG9tXCIsXG5cbiAgICByb3dDb3VudDogXCJqdW1sYWhCYXJpc1wiLFxuICAgIG1pblJvd0NvdW50OiBcImp1bWxhaEJhcmlzTWluXCIsXG4gICAgbWF4Um93Q291bnQ6IFwianVtbGFoQmFyaXNNYWtzXCIsXG4gICAga2V5TmFtZTogXCJuYW1hS3VuY2lcIixcbiAgICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcImtlc2FsYWhhbkR1cGxpa2FzaUt1bmNpIFwiLFxuICAgIGNvbmZpcm1EZWxldGU6IFwia29uZmlybWFzaUhhcHVzXCIsXG4gICAgY29uZmlybURlbGV0ZVRleHQ6IFwidGVrc0tvbmZpcm1hc2lIYXB1c1wiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcInRhbWJhaExva2FzaUJhcmlzXCIsXG4gICAgYWRkUm93VGV4dDogXCJ0ZWtzVGFtYmFoQmFyaXNcIixcbiAgICByZW1vdmVSb3dUZXh0OiBcInRla3NIYXB1c0JhcmlzXCIsXG5cbiAgICBpdGVtczogXCJpdGVtc1wiLFxuICAgIGl0ZW1TaXplOiBcInVrdXJhbkJhcmFuZ1wiLFxuICAgIGNvbENvdW50OiBcImp1bWxhaEtvbG9tXCIsXG5cbiAgICB0ZW1wbGF0ZVRpdGxlOiBcImp1ZHVsVGVtcGxhdFwiLFxuICAgIHRlbXBsYXRlRGVzY3JpcHRpb246IFwiZGVza3JpcHNpVGVtcGxhdFwiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwiYm9sZWhrYW5UYW1iYWhQYW5lbFwiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwiYm9sZWhrYW5IYXB1c1BhbmVsXCIsXG4gICAgcGFuZWxDb3VudDogXCJqdW1sYWhQYW5lbFwiLFxuICAgIG1pblBhbmVsQ291bnQ6IFwianVtbGFoTWluaW11bVBhbmVsXCIsXG4gICAgbWF4UGFuZWxDb3VudDogXCJqdW1sYWhNYWtzaW11bVBhbmVsXCIsXG4gICAgcGFuZWxzU3RhdGU6IFwia2VhZGFhblBhbmVsXCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcInRla3NUYW1iYWhQYW5lbFwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCJ0ZWtzSGFwdXNQYW5lbFwiLFxuICAgIHBhbmVsUHJldlRleHQ6IFwidGVrc1BhbmVsU2ViZWx1bW55YVwiLFxuICAgIHBhbmVsTmV4dFRleHQ6IFwidGVrc1BhbmVsU2VsYW5qdXRueWFcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcInRhbXBpbGthbk5vbW9yUGVydGFueWFhblwiLFxuICAgIHNob3dSYW5nZUluUHJvZ3Jlc3M6IFwidGFtcGlsa2FuUmVudGFuZ0JlcmxhbmdzdW5nXCIsXG4gICAgcmVuZGVyTW9kZTogXCJtb2RlUmVuZGVyXCIsXG4gICAgdGVtcGxhdGVUaXRsZUxvY2F0aW9uOiBcImxva2FzaUp1ZHVsVGVtcGxhdFwiLFxuXG4gICAgcmF0ZVZhbHVlczogXCJuaWxhaVRpbmdrYXRcIixcbiAgICByYXRlTWluOiBcInRpbmdrYXRNaW5pbXVtXCIsXG4gICAgcmF0ZU1heDogXCJ0aW5na2F0TWFrc2ltdW1cIixcbiAgICByYXRlU3RlcDogXCJsYW5na2FoVGluZ2thdFwiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCJkZXNrcmlwc2lUaW5na2F0TWluaW11bVwiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCJkZXNrcmlwc2lUaW5na2F0TWFrc2ltdW1cIixcblxuICAgIGlucHV0VHlwZTogXCJqZW5pc01hc3VrYW5cIixcbiAgICBzaXplOiBcInVrdXJhblwiLFxuXG4gICAgbG9jYWxlOiBcIkxva2FsXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcImZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpY1wiLFxuICAgIGNvbXBsZXRlZEh0bWw6IFwiSHRtbFNlbGVzYWlcIixcbiAgICBjb21wbGV0ZWRCZWZvcmVIdG1sOiBcImNvbXBsZXRlZEJlZm9yZUh0bWxcIixcbiAgICBsb2FkaW5nSHRtbDogXCJsb2FkaW5nSHRtbFwiLFxuICAgIHRyaWdnZXJzOiBcIlRyaWdnZXJcIixcbiAgICBjb29raWVOYW1lOiBcIm5hbWFDb29raWVcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCJLaXJpbSBoYXNpbCBrZSBoYWxhbWFuIHNlbGFuanV0bnlhXCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIlRhbXBpbGthbiBUb21ib2wgTmF2aWdhc2lcIixcbiAgICBzaG93UHJldkJ1dHRvbjogXCJUYW1waWxrYW4gVG9tYm9sIFNlYmVsdW1ueWFcIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJUYW1waWxrYW4gSnVkdWwgSGFsYW1hblwiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcIlRhbXBpbGthbiBLZXNlbHVydWhhbiBIYWxhbWFuXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcIlRhbXBpbGthbiBOb21vciBIYWxhbWFuXCIsXG4gICAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBcIkxva2FzaSBQZXJ0YW55YWFuIEVycm9yXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIlRhbXBpbGthbiBwcm9ncmVzcyBiYXJcIixcbiAgICBtb2RlOiBcIm1vZGVcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOiBcIktlIEhhbGFtYW4gU2VsYW5qdXRueWEgT3RvbWF0aXNcIixcbiAgICBjaGVja0Vycm9yc01vZGU6IFwiTW9kZSBQZXJpa3NhIEVycm9yXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiQmVyc2loa2FuIE5pbGFpIFRhayBUZXJsaWhhdFwiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJ0ZWtzTXVsYWlTdXJ2ZWlcIixcbiAgICBwYWdlUHJldlRleHQ6IFwidGVrc0hhbGFtYW5TZWJlbHVtbnlhXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcInRla3NIYWxhbWFuU2VsYW5qdXRueWFcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwidGVrc1NlbGVzYWlcIixcbiAgICByZXF1aXJlZFRleHQ6IFwidGVrc1dhamliXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcIkluZGV4IE11bGFpIFBlcnRhbnlhYW5cIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6IFwiVGVtcGxhdGUgSnVkdWwgUGVydGFueWFhblwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCJIYWxhbWFuIFBlcnRhbWEgRGltdWxhaVwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJIYWxhbWFuIFR1bmdnYWw/XCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCJXYWt0dSBNYWtzIHVudHVrIE1lbnllbGVzYWlrYW4gSGFsYW1hblwiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcIlRhbXBpbGthbiBQYW5lbCBQZW5nYXR1ciBXYWt0dVwiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCJUYW1waWxrYW4gc2hvd1RpbWVyUGFuZWxNb2RlXCIsXG5cbiAgICBkZWZhdWx0UGFuZWxWYWx1ZTogXCJuaWxhaSBwYW5lbCBkZWZhdWx0XCIsXG4gICAgZGVmYXVsdFJvd1ZhbHVlOiBcIm5pbGFpIGJhcmlzIGRlZmF1bHRcIixcbiAgICBoYXNOb25lOiBcIk1lbWlsaWtpIE5vbmVcIixcbiAgICBub25lVGV4dDogXCJOb24tdGVrc1wiLFxuXG4gICAgdGV4dDogXCJ0ZWtzXCIsXG4gIH1cbn07XG5cbmVkaXRvckxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaWRcIl0gPSBpbmRvbmVzaWFuU3RyaW5ncztcbiIsImltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcblxudmFyIGl0YWxpYW5UcmFuc2xhdGlvbiA9IHtcbiAgLy8gc3RyaW5ncyBmb3Igc3VydmV5IHRlbXBsYXRlc1xuICBzdXJ2ZXk6IHtcbiAgICBlZGl0OiBcIk1vZGlmaWNhXCIsXG4gICAgZHJvcFF1ZXN0aW9uOiBcIkFnZ2l1bmdpIHVuYSBkb21hbmRhIHF1aVwiLFxuICAgIGNvcHk6IFwiQ29waWFcIixcbiAgICBhZGRUb1Rvb2xib3g6IFwiQWdnaXVuZ2kgYWxsYSB0b29sYm94XCIsXG4gICAgZGVsZXRlUGFuZWw6IFwiRWxpbWluYSBwYW5uZWxsb1wiLFxuICAgIGRlbGV0ZVF1ZXN0aW9uOiBcIkVsaW1pbmEgZG9tYW5kYVwiLFxuICAgIGNvbnZlcnRUbzogXCJDb252ZXJ0aSBhXCJcbiAgfSxcbiAgLy8gc3RyaW5ncyBmb3IgcXVlc3Rpb24gdHlwZXNcbiAgcXQ6IHtcbiAgICBjaGVja2JveDogXCJDYXNlbGxhIGRpIGNvbnRyb2xsbyBcIixcbiAgICBjb21tZW50OiBcIkNvbW1lbnRvXCIsXG4gICAgZHJvcGRvd246IFwiQ29tYm9cIixcbiAgICBmaWxlOiBcIkFyY2hpdmlvXCIsXG4gICAgaHRtbDogXCJIdG1sXCIsXG4gICAgbWF0cml4OiBcIk1hdHJpY2UgKHVuaWNhIG9wemlvbmUpXCIsXG4gICAgbWF0cml4ZHJvcGRvd246IFwiTWF0cmljZSAob3B6aW9uaSBtdWx0aXBsZSlcIixcbiAgICBtYXRyaXhkeW5hbWljOiBcIk1hdHJpY2UgKGRpbmFtaWNhKVwiLFxuICAgIG11bHRpcGxldGV4dDogXCJUZXN0byBtdWx0aXBsb1wiLFxuICAgIHBhbmVsOiBcIlBhbm5lbGxvXCIsXG4gICAgcGFuZWxkeW5hbWljOiBcIlBhbm5lbGxvIChkaW5hbWljbylcIixcbiAgICByYWRpb2dyb3VwOiBcIk9wemlvbmUgbXVsdGlwbGFcIixcbiAgICByYXRpbmc6IFwiVmFsdXRhemlvbmVcIixcbiAgICB0ZXh0OiBcIlRlc3RvIHNlbXBsaWNlXCIsXG4gICAgZXhwcmVzc2lvbjogXCJFc3ByZXNzaW9uZVwiXG4gIH0sXG4gIC8vIHN0cmluZ3MgZm9yIGVkaXRvclxuICBlZDoge1xuICAgIGRlZmF1bHRMb2NhbGU6IFwiRGVmYXVsdCAoezB9KVwiLFxuICAgIHN1cnZleTogXCJRdWVzdGlvbmFyaW9cIixcbiAgICBzZXR0aW5nczogXCJJbXBvc3RhemlvbmkgUXVlc3Rpb25hcmlvXCIsXG4gICAgZWRpdFN1cnZleTogXCJNb2RpZmljYSBRdWVzdGlvbmFyaW9cIixcbiAgICBhZGROZXdQYWdlOiBcIkFnZ2l1bmdpIE51b3ZhIFBhZ2luYVwiLFxuICAgIGRlbGV0ZVBhZ2U6IFwiRWxpbWluYSBQYWdpbmFcIixcbiAgICBlZGl0UGFnZTogXCJNb2RpZmljYSBQYWdpbmFcIixcbiAgICBuZXdQYWdlTmFtZTogXCJwYWdpbmFcIixcbiAgICBuZXdRdWVzdGlvbk5hbWU6IFwiZG9tYW5kYVwiLFxuICAgIG5ld1BhbmVsTmFtZTogXCJwYW5uZWxsb1wiLFxuICAgIHRlc3RTdXJ2ZXk6IFwiVGVzdGEgcXVlc3Rpb25hcmlvXCIsXG4gICAgdGVzdFN1cnZleUFnYWluOiBcIlRlc3RhIHF1ZXN0aW9uYXJpbyBkaSBudW92b1wiLFxuICAgIHRlc3RTdXJ2ZXlXaWR0aDogXCJMYXJnaGV6emEgcXVlc3Rpb25hcmlvOlwiLFxuICAgIGVtYmVkU3VydmV5OiBcIkluY2x1ZGkgcXVlc3Rpb25hcmlvXCIsXG4gICAgc2F2ZVN1cnZleTogXCJTYWx2YSBxdWVzdGlvbmFyaW9cIixcbiAgICBkZXNpZ25lcjogXCJEaXNlZ25hXCIsXG4gICAganNvbkVkaXRvcjogXCJNb2RpZmljYSBKU09OXCIsXG4gICAgdW5kbzogXCJBbm51bGxhXCIsXG4gICAgcmVkbzogXCJSaXBldGlcIixcbiAgICBvcHRpb25zOiBcIk9wemlvbmlcIixcbiAgICBnZW5lcmF0ZVZhbGlkSlNPTjogXCJHZW5lcmEgSlNPTiB2YWxpZG9cIixcbiAgICBnZW5lcmF0ZVJlYWRhYmxlSlNPTjogXCJHZW5lcmEgSlNPTiBsZWdnaWJpbGVcIixcbiAgICB0b29sYm94OiBcIlN0cnVtZW50aVwiLFxuICAgIGRlbFNlbE9iamVjdDogXCJFbGltaW5hIG9nZ2V0dG8gc2VsZXppb25hdG9cIixcbiAgICBlZGl0U2VsT2JqZWN0OiBcIk1vZGlmaWNhIG9nZ2V0dG8gc2VsZXppb25hdG9cIixcbiAgICBjb3JyZWN0SlNPTjogXCJQZXIgZmF2b3JlLCBjb3JyZWdnaSBpbCB0dW8gSlNPTlwiLFxuICAgIHN1cnZleVJlc3VsdHM6IFwiUmlzdWx0YXRpIGRlbCBxdWVzdGlvbmFyaW86IFwiLFxuICAgIG1vZGlmaWVkOiBcIk1vZGlmaWNhdG9cIixcbiAgICBzYXZpbmc6IFwiU2FsdmF0YWdnaW9cIixcbiAgICBzYXZlZDogXCJTYWx2YXRvXCJcbiAgfSxcbiAgLy9Qcm9wZXJ0eSBuYW1lcyBpbiB0YWJsZSBoZWFkZXJzXG4gIHBlbDoge1xuICAgIGlzUmVxdWlyZWQ6IFwiUmljaGllc3RvXCJcbiAgfSxcbiAgLy8gc3RyaW5ncyBmb3IgcHJvcGVydHkgZWRpdG9yc1xuICBwZToge1xuICAgIGFwcGx5OiBcIkFwcGxpY2FcIixcbiAgICBvazogXCJBY2NldHRhXCIsXG4gICAgY2FuY2VsOiBcIkFubnVsbGFcIixcbiAgICByZXNldDogXCJSZWltcG9zdGFcIixcbiAgICBjbG9zZTogXCJDaGl1ZGlcIixcbiAgICBkZWxldGU6IFwiRWxpbWluYVwiLFxuICAgIGFkZE5ldzogXCJOdW92b1wiLFxuICAgIHJlbW92ZUFsbDogXCJFbGltaW5hIHR1dHRvXCIsXG4gICAgZWRpdDogXCJNb2RpZmljYVwiLFxuICAgIGVtcHR5OiBcIjx2dW90bz5cIixcbiAgICBub3RFbXB0eTogXCI8bW9kaWZpY2EgdmFsb3JlPlwiLFxuICAgIGZhc3RFbnRyeTogXCJJbnNlcmltZW50byByYXBpZG9cIixcbiAgICBmb3JtRW50cnk6IFwiSW5zZXJpbWVudG8gY29uIGRhdGkgXCIsXG4gICAgdGVzdFNlcnZpY2U6IFwiVGVzdCBkZWwgc2Vydml6aW9cIixcbiAgICBjb25kaXRpb25TZWxlY3RRdWVzdGlvbjogXCJTZWxlemlvbmEgZG9tYW5kYS4uLlwiLFxuICAgIGNvbmRpdGlvbkJ1dHRvbkFkZDogXCJBZ2dpdW5naVwiLFxuICAgIGNvbmRpdGlvbkJ1dHRvblJlcGxhY2U6IFwiU29zdGl0dWlzY2lcIixcbiAgICBjb25kaXRpb25IZWxwOlxuICAgICAgXCJQZXIgZmF2b3JlLCBpbnNlcmlyZSB1bmEgZXNwcmVzc2lvbmUgYm9vbGVhbmEuIERvdnJlYmJlIHJlc3RpdHVpcmUgdHJ1ZSBwZXIgbWFudGVuZXJlIGxhIGRvbWFuZGEvcGFnaW5hIHZpc2liaWxlLiBBZCBlc2VtcGlvOiB7ZG9tYW5kYTF9ID0gJ3ZhbG9yZTEnIG9yICh7ZG9tYW5kYTJ9ICoge2RvbWFuZGE0fSAgPiAyMCBhbmQge2RvbWFuZGEzfSA8IDUpXCIsXG4gICAgZXhwcmVzc2lvbkhlbHA6XG4gICAgICBcIlBlciBmYXZvcmUgaW5zZXJpcmUgdW5hIGVzcHJlc3Npb25lLiBQdW9pIHVzYXJlIHBhcmVudGVzaSBncmFmZmUgcGVyIG90dGVuZXJlIGwnYWNjZXNzbyBhaSB2YWxvcmkgZGVsbGUgZG9tYW5kZTogJ3tkb21hbmRhMX0gKyB7ZG9tYW5kYTJ9JywgJyh7cHJlenpvfSp7cXRhfSkgKiAoMTAwIC0ge3Njb250b30pJ1wiLFxuICAgIGFjZUVkaXRvckhlbHA6XG4gICAgICBcIlByZW1pIGN0cmwrc3BhY2UgcGVyIG90dGVuZXJlIHVuIHN1Z2dlcmltZW50byBzdWwgY29tcGxldGFtZW50byBkZWxsJ2VzcHJlc3Npb25lXCIsXG4gICAgYWNlRWRpdG9yUm93VGl0bGU6IFwiUmlnYSBjb3JyZW50ZVwiLFxuICAgIGFjZUVkaXRvclBhbmVsVGl0bGU6IFwiUGFubmVsbG8gQ29ycmVudGVcIixcbiAgICBzaG93TW9yZTogXCJQZXIgZmF2b3JlLCBwZXIgbWFnZ2lvcmkgZGV0dGFnbGkgZ3VhcmRhcmUgbGEgZG9jdW1lbnRhemlvbmVcIixcbiAgICBhc3Npc3RhbnRUaXRsZTogXCJEb21hbmRlIGRpc3BvbmliaWxpOlwiLFxuICAgIGNlbGxzRW1wdHlSb3dzQ29sdW1uczogXCJEb3ZyZWJiZSBlc3NlcmNpIGFsbWVubyB1bmEgY29sb25uYSBvIHJpZ2FcIixcbiAgICBwcm9wZXJ0eUlzRW1wdHk6IFwiUGVyIGZhdm9yZSwgaW5zZXJpcmUgdW4gdmFsb3JlIHBlciBsYSBwcm9waWV0w6BcIixcbiAgICB2YWx1ZTogXCJWYWxvcmVcIixcbiAgICB0ZXh0OiBcIlRlc3RvXCIsXG4gICAgY29sdW1uRWRpdDogXCJNb2RpZmljYSBjb2xvbm5hOiB7MH1cIixcbiAgICBpdGVtRWRpdDogXCJNb2RpZmljYSBlbGVtZW50bzogezB9XCIsXG4gICAgdXJsOiBcIlVSTFwiLFxuICAgIHBhdGg6IFwiUGVyY29yc29cIixcbiAgICB2YWx1ZU5hbWU6IFwiTm9tZSBWYWxvcmVcIixcbiAgICB0aXRsZU5hbWU6IFwiTm9tZSBUaXRvbG9cIixcbiAgICBoYXNPdGhlcjogXCJBbHRyaSBlbGVtZW50aVwiLFxuICAgIG90aGVyVGV4dDogXCJUZXN0byBhbHRyaSBlbGVtZW50aVwiLFxuICAgIG5hbWU6IFwiTm9tZVwiLFxuICAgIHRpdGxlOiBcIlRpdG9sb1wiLFxuICAgIGNlbGxUeXBlOiBcIlRpcG8gZGkgY2VsbGFcIixcbiAgICBjb2xDb3VudDogXCJOdW1lcm8gZGkgY29sb25uZVwiLFxuICAgIGNob2ljZXNPcmRlcjogXCJTZWxlemlvbmEgYWx0cmUgb3B6aW9uaVwiLFxuICAgIHZpc2libGU6IFwiVmlzaWJpbGVcIixcbiAgICBpc1JlcXVpcmVkOiBcIlJpY2hpZXN0b1wiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwiTnVvdmEgbGluZWFcIixcbiAgICByb3dzOiBcIk51bWVybyBkaSByaWdoZVwiLFxuICAgIHBsYWNlSG9sZGVyOiBcIlRlc3RvIGRpIHJpZmVyaW1lbnRvXCIsXG4gICAgc2hvd1ByZXZpZXc6IFwiTW9zdHJhIGFudGVwcmltYVwiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCJWZWRpIGlsIGNvbnRlbnV0byBKU09OIGNvbWUgdGVzdG9cIixcbiAgICBtYXhTaXplOiBcIkRpbWVuc2lvbmUgbWFzc2ltYSBpbiBieXRlc1wiLFxuICAgIGltYWdlSGVpZ2h0OiBcIkFsdGV6emEgaW1tYWdpbmVcIixcbiAgICBpbWFnZVdpZHRoOiBcIkxhcmdoZXp6YSBpbW1hZ2luZVwiLFxuICAgIHJvd0NvdW50OiBcIk51bWVybyBkZWxsZSByaWdoZVwiLFxuICAgIGFkZFJvd1RleHQ6IFwiVGVzdG8gZGVsIHB1bHNhbnRlIHBlciBhZ2dpdW5nZXJlIHVuYSBudW92YSByaWdoYVwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwiVGVzdG8gZGVsIHB1bHNhbnRlIHBlciBlbGltaW5hcmUgdW5hIHJpZ2hhXCIsXG4gICAgbWluUmF0ZURlc2NyaXB0aW9uOiBcIkRlc2NyaXppb25lIGRlbCB2YWxvcmUgbWluaW1vXCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcIkRlc2NyaXppb25lIGRlbCB2YWxvcmUgbWFzc2ltb1wiLFxuICAgIGlucHV0VHlwZTogXCJUaXBvIGRpIGluc2VyaW1lbnRvXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiVGl0b2xvIGRlbGwnb3B6aW9uZVwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJWYWxvcmUgZGVmYXVsdFwiLFxuICAgIGNlbGxzRGVmYXVsdFJvdzogXCJWYWxvcmUgZGVmYXVsdCBjZWxsZVwiLFxuICAgIHN1cnZleUVkaXRvclRpdGxlOiBcIkVkaXQgc3VydmV5IHNldHRpbmdzXCIsXG4gICAgcUVkaXRvclRpdGxlOiBcIk1vZGlmaWNhIGRvbWFuZGE6IHswfVwiLFxuICAgIC8vc3VydmV5XG4gICAgc2hvd1RpdGxlOiBcIk1vc3RyYS9uYXNjb25kaSB0aXRvbG9cIixcbiAgICBsb2NhbGU6IFwiTGluZ3VhIERlZmF1bHRcIixcbiAgICBtb2RlOiBcIk1vZGFsaXTDoCAobW9kaWZpY2Evc29sYSBsZXR0dXJhKVwiLFxuICAgIGNsZWFySW52aXNpYmxlVmFsdWVzOiBcIlB1bGlzY2hpIHZhbG9yaSBub24gdmlzaWJpbGlcIixcbiAgICBjb29raWVOYW1lOlxuICAgICAgXCJOb21lIGNvb2tpZSAocGVyIGRpc2FiaWxpdGFyZSBlc2VndWkgaWwgcXVlc3Rpb25hcmlvIGR1ZSB2b2x0ZSBpbiBsb2NhbGUpXCIsXG4gICAgc2VuZFJlc3VsdE9uUGFnZU5leHQ6XG4gICAgICBcIkludmlhIGkgcmlzdWx0YXRpIGRlbCBzb25kYWdnaW8gYWxsYSBwYWdpbmEgc3VjY2Vzc2l2YVwiLFxuICAgIHN0b3JlT3RoZXJzQXNDb21tZW50OiBcIk1lbW9yaXp6YSBpbCB2YWxvcmUgJ2FsdHJpJyBpbiBjYW1waSBzZXBhcmF0aVwiLFxuICAgIHNob3dQYWdlVGl0bGVzOiBcIlZpc3VhbGl6emEgdGl0b2xpIHBhZ2luYVwiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCJWaXN1YWxpenphIG51bWVyaSBwYWdpbmFcIixcbiAgICBwYWdlUHJldlRleHQ6IFwiVGVzdG8gYm90dG9uZSBwYWdpbmEgcHJlY2VkZW50ZVwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJUZXN0byBib3R0b25lIHBhZ2luYSBzdWNjZXNzaXZhXCIsXG4gICAgY29tcGxldGVUZXh0OiBcIlRlc3RvIGJvdHRvbmUgQ29tcGxldGF0b1wiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJUZXN0byBib3R0b25lIEluaXppYVwiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczpcbiAgICAgIFwiVmlzdWFsaXp6YSBib3R0b25pIGRpIG5hdmlnYXppb25lIChuYXZpZ2F6aW9uZSBkaSBkZWZhdWx0KVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOlxuICAgICAgXCJWaXN1YWxpenphIGJvdHRvbmUgcHJlY2VkZW50ZShsJ3V0ZW50ZSBwdcOyIHRvcm5hcmUgYWxsYSBwYWdpbmEgcHJlY2VkZW50ZSlcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6XG4gICAgICBcIkxhIHByaW1hIHBhZ2luYSBuZWwgcXVlc3Rpb25hcmlvIMOoIGxhIHBhZ2luYSBpbml6aWFsZS5cIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTpcbiAgICAgIFwiVmlzdWFsaXp6YSBsYSBwYWdpbmEgY29tcGxldGF0YSBhbGxhIGZpbmUgZGVsIHF1ZXN0aW9uYXJpbyAoY29tcGxldGVkSHRtbClcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOlxuICAgICAgXCJSaXNwb25kZW5kbyBhIHR1dHRlIGxlIGRvbWFuZGUsIHZhaSBhbGxhIHBhZ2luYSBzdWNjZXNzaXZhIGluIGF1dG9tYXRpY28uXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIlZpc3VhbGl6emEgYmFycmEgZGkgYXZhbnphbWVudG9cIixcbiAgICBxdWVzdGlvblRpdGxlTG9jYXRpb246IFwiUG9zaXppb25lIHRpdG9sbyBkb21hbmRhXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcIlNpbWJvbG8gZG9tYW5kYSBvYmJsaWdhdG9yaWEsIGVzZW1waW8gKCopXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcIkxhIGRvbWFuZGEgaW5pemlhIGNvbiBsJ2luZGljZSAoMSwgMiBvcHB1cmUgJ0EnLCAnYScpXCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCJWaXN1YWxpenphIGkgbnVtZXJpIGRpIGRvbWFuZGFcIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6XG4gICAgICBcIlRlbXBsYXRlIHRpdG9sbyBkZWxsYSBkb21hbmRhLCBpbCBkZWZhdWx0IMOoOiAne25vfS4ge3JlcXVpcmV9IHt0aXRsZX0nXCIsXG4gICAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBcIlBvc2l6aW9uZSBub3RpZmljYSBlcnJvcmUgc3VsbGEgZG9tYW5kYVwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzpcbiAgICAgIFwiU3VsIGNhbWJpbyBwYWdpbmEsIHBvc2l6aW9uYSBpbCBjdXJzb3JlIHN1bGxhIHByaW1hIGRvbWFuZGFcIixcbiAgICBxdWVzdGlvbnNPcmRlcjogXCJPcmRpbmUgZGkgZWxlbWVudGkgc3VsbGEgcGFnaW5hXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIlRlbXBvIG1hc3NpbW8gcGVyIHRlcm1pbmFyZSBpbCBzb25kYWdnaW9cIixcbiAgICBtYXhUaW1lVG9GaW5pc2hQYWdlOiBcIlRlbXBvIG1hc3NpbW8gcGVyIHRlcm1pbmFyZSB1bmEgcGFnaW5hIGRlbCBzb25kYWdnaW9cIixcbiAgICBzaG93VGltZXJQYW5lbDogXCJWaXN1YWxpenphIHBhbm5lbGxvIHRpbWVyXCIsXG4gICAgc2hvd1RpbWVyUGFuZWxNb2RlOiBcIlZpc3VhbGl6emEgbW9kYWxpdMOgIHRpbWVyIHBhbm5lbGxvXCIsXG4gICAgcmVuZGVyTW9kZTogXCJNb2RhbGl0w6AgZGkgcmVuZGVyaW5nXCIsXG4gICAgYWxsb3dBZGRQYW5lbDogXCJDb25zZW50aSBsJ2FnZ2l1bnRhIGRpIHVuIHBhbm5lbGxvXCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCJDb25zZW50aSBsYSByaW1vemlvbmUgZGkgdW4gcGFubmVsbG9cIixcbiAgICBwYW5lbEFkZFRleHQ6IFwiQWdnaXVuZ2kgdGVzdG8gcGFubmVsbG9cIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwiUmVtdW92aSB0ZXN0byBwYW5uZWxsb1wiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJWaXN1YWxpenphIHR1dHRpIGdsaSBlbGVtZW50aSBzdSB1bmEgcGFnaW5hXCIsXG4gICAgdGFiczoge1xuICAgICAgZ2VuZXJhbDogXCJHZW5lcmFsZVwiLFxuICAgICAgZmlsZU9wdGlvbnM6IFwiT3B6aW9uaVwiLFxuICAgICAgaHRtbDogXCJNb2RpZmljYSBIdG1sXCIsXG4gICAgICBjb2x1bW5zOiBcIkNvbG9ubmVcIixcbiAgICAgIHJvd3M6IFwiUmlnaGVcIixcbiAgICAgIGNob2ljZXM6IFwiU2NlbHRlXCIsXG4gICAgICB2aXNpYmxlSWY6IFwiVmlzaWJpbGUgc2VcIixcbiAgICAgIHJhdGVWYWx1ZXM6IFwiVmFsb3JpIGRlbGxhIGNsYXNzaWZpY2FcIixcbiAgICAgIGNob2ljZXNCeVVybDogXCJPcHppb25pIGRhbCBXZWJcIixcbiAgICAgIG1hdHJpeENob2ljZXM6IFwiT3B6aW9uaSBwcmVkZWZpbml0ZVwiLFxuICAgICAgbXVsdGlwbGVUZXh0SXRlbXM6IFwiVm9jaSBkaSB0ZXN0b1wiLFxuICAgICAgdmFsaWRhdG9yczogXCJWYWxpZGF6aW9uaVwiLFxuICAgICAgbmF2aWdhdGlvbjogXCJOYXZpZ2F6aW9uZVwiLFxuICAgICAgcXVlc3Rpb246IFwiRG9tYW5kYVwiLFxuICAgICAgY29tcGxldGVkSHRtbDogXCJIdG1sIHF1ZXN0aW9uYXJpbyBjb21wbGV0YXRvXCIsXG4gICAgICBsb2FkaW5nSHRtbDogXCJIdG1sIGNhcmljYW1lbnRvIHF1ZXN0aW9uYXJpb1wiLFxuICAgICAgdGltZXI6IFwiVGltZXIvUXVpelwiLFxuICAgICAgdHJpZ2dlcnM6IFwiVHJpZ2dlcnNcIixcbiAgICAgIHRlbXBsYXRlVGl0bGU6IFwiVGVtcGxhdGUgdGl0b2xvXCJcbiAgICB9LFxuICAgIGVkaXRQcm9wZXJ0eTogXCJNb2RpZmNhIHByb3BpZXTDoCAnezB9J1wiLFxuICAgIGl0ZW1zOiBcIlsgRWxlbWVudG86IHswfSBdXCIsXG4gICAgZW50ZXJOZXdWYWx1ZTogXCJTaSBwcmVnYSBkaSBpbnNlcmlyZSBpbCB2YWxvcmUuXCIsXG4gICAgbm9xdWVzdGlvbnM6IFwiTm9uIGMnw6ggYWxjdW4gZHViYmlvIG5lbCBxdWVzdGlvbmFyaW8uXCIsXG4gICAgY3JlYXRldHJpZ2dlcjogXCJTaSBwcmVnYSBkaSBjcmVhcmUgdW4gdHJpZ2dlclwiLFxuICAgIHRyaWdnZXJPbjogXCJBdHRpdmF6aW9uZSBcIixcbiAgICB0cmlnZ2VyTWFrZVBhZ2VzVmlzaWJsZTogXCJSZW5kZXJlIHZpc2liaWxpIGxlIHBhZ2luZTpcIixcbiAgICB0cmlnZ2VyTWFrZVF1ZXN0aW9uc1Zpc2libGU6IFwiUmVuZGVyZSB2aXNpYmlsaSBsZSBkb21hbmRlOlwiLFxuICAgIHRyaWdnZXJDb21wbGV0ZVRleHQ6IFwiQ29tcGxldGFyZSBpbCBxdWVzdGlvbmFyaW8sIGluIGNhc28gZGkgc3VjY2Vzc28uXCIsXG4gICAgdHJpZ2dlck5vdFNldDogXCJOb24gaW1wb3N0YXRvXCIsXG4gICAgdHJpZ2dlclJ1bklmOiBcIkVzZWd1aSBzZVwiLFxuICAgIHRyaWdnZXJTZXRUb05hbWU6IFwiQ2FtYmlhIGlsIHZhbG9yZSBhOiBcIixcbiAgICB0cmlnZ2VyU2V0VmFsdWU6IFwiYTogXCIsXG4gICAgdHJpZ2dlcklzVmFyaWFibGU6XG4gICAgICBcIk5vbiBwb3NpemlvbmFyZSBsYSB2YXJpYWJpbGUgZGVsIHJpc3VsdGF0byBkZWwgcXVlc3Rpb25hcmlvXCJcbiAgfSxcbiAgLy8gc3RyaW5ncyBmb3Igb3BlcmF0b3JzXG4gIG9wOiB7XG4gICAgZW1wdHk6IFwiw6ggdnVvdG9cIixcbiAgICBub3RlbXB0eTogXCJub24gw6ggdnVvdG8gXCIsXG4gICAgZXF1YWw6IFwiw6ggdWd1YWxlIGFcIixcbiAgICBub3RlcXVhbDogXCJub24gw6ggdWd1YWxlIGFcIixcbiAgICBjb250YWluczogXCJjb250aWVuZVwiLFxuICAgIG5vdGNvbnRhaW5zOiBcIm5vbiBjb250aWVuZVwiLFxuICAgIGdyZWF0ZXI6IFwibWFnZ2lvcmVcIixcbiAgICBsZXNzOiBcIm1pbm9yZVwiLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBcIm1hZ2dpb3JlIG8gdWd1YWxlXCIsXG4gICAgbGVzc29yZXF1YWw6IFwibWlub3JlIG8gdWd1YWxlXCJcbiAgfSxcbiAgLy8gc3RyaW5ncyBmb3IgZW1iZWQgd2luZG93XG4gIGV3OiB7XG4gICAgYW5ndWxhcjogXCJWZXJzaW9uZSBwZXIgQW5ndWxhclwiLFxuICAgIGpxdWVyeTogXCJWZXJzaW9uZSBwZXIgalF1ZXJ5XCIsXG4gICAga25vY2tvdXQ6IFwiVmVyc2lvbmUgcGVyIEtub2Nrb3V0XCIsXG4gICAgcmVhY3Q6IFwiVmVyc2lvbmUgcGVyIFJlYWN0XCIsXG4gICAgdnVlOiBcIlZlcnNpb25lIHBlciBWdWVcIixcbiAgICBib290c3RyYXA6IFwiUGVyIGZyYW1ld29yayBib290c3RyYXBcIixcbiAgICBzdGFuZGFyZDogXCJObyBib290c3RyYXBcIixcbiAgICBzaG93T25QYWdlOiBcIlZpc3VhbGl6emEgaW4gcXVlc3RhIHBhZ2luYVwiLFxuICAgIHNob3dJbldpbmRvdzogXCJWaXN1YWxpenphIGluIHVuYSBmaW5lc3RyYVwiLFxuICAgIGxvYWRGcm9tU2VydmVyOiBcIkNhcmljYSBKU09OIGRhbCBzZXJ2ZXJcIixcbiAgICB0aXRsZVNjcmlwdDogXCJTY3JpcHRzIGUgc3RpbGlcIixcbiAgICB0aXRsZUh0bWw6IFwiSFRNTFwiLFxuICAgIHRpdGxlSmF2YVNjcmlwdDogXCJKYXZhU2NyaXB0XCJcbiAgfSxcbiAgLy9UZXN0IFN1cnZleVxuICB0czoge1xuICAgIHNlbGVjdFBhZ2U6IFwiU2VsZXppb25hIGxhIHBhZ2luYSBkYSB0ZXN0YXJlOlwiLFxuICAgIHNob3dJbnZpc2libGVFbGVtZW50czogXCJNb3N0cmEgZWxlbWVudGkgbmFzY29zdGlcIlxuICB9LFxuICB2YWxpZGF0b3JzOiB7XG4gICAgYW5zd2VyY291bnR2YWxpZGF0b3I6IFwibnVtZXJvIHJpc3Bvc3RlXCIsXG4gICAgZW1haWx2YWxpZGF0b3I6IFwiZS1tYWlsXCIsXG4gICAgbnVtZXJpY3ZhbGlkYXRvcjogXCJudW1lcmljb1wiLFxuICAgIHJlZ2V4dmFsaWRhdG9yOiBcInJlZ2V4XCIsXG4gICAgdGV4dHZhbGlkYXRvcjogXCJ0ZXN0b1wiXG4gIH0sXG4gIHRyaWdnZXJzOiB7XG4gICAgY29tcGxldGV0cmlnZ2VyOiBcImNvbXBsZXRhIHF1ZXN0aW9uYXJpb1wiLFxuICAgIHNldHZhbHVldHJpZ2dlcjogXCJzZXR0YSB2YWxvcmVcIixcbiAgICB2aXNpYmxldHJpZ2dlcjogXCJjYW1iaWEgdmlzaWJpbGl0w6BcIlxuICB9LFxuICAvL1Byb3BlcnRpZXNcbiAgcDoge1xuICAgIG5hbWU6IFwiTm9tZVwiLFxuICAgIHRpdGxlOiB7XG4gICAgICBuYW1lOiBcIlRpdG9sb1wiLFxuICAgICAgdGl0bGU6IFwiTGFzY2lhbG8gdnVvdG8sIHNlIMOoIHVndWFsZSBhICdOb21lJ1wiXG4gICAgfSxcblxuICAgIHZpc2libGU6IFwiVmlzaWJpbGVcIixcbiAgICB2aXNpYmxlSWY6IFwiVmlzaWJpbGUgU2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJEZXNjcml6aW9uZVwiLFxuICAgIGlzUmVxdWlyZWQ6IFwiUmljaGllc3RvXCIsXG4gICAgcmVxdWlyZWRJZjogXCJSaWNoaWVzdG8gU2VcIixcbiAgICBwYWdlOiBcIlBhZ2luYVwiLFxuICAgIHdpZHRoOiBcIkxhcmdoZXp6YVwiLFxuICAgIGVuYWJsZUlmOiBcIkFiaWxpdGF0byBzZVwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJWYWxvcmUgZGkgZGVmYXVsdFwiLFxuICAgIHJlYWRPbmx5OiBcIlNvbGEgTGV0dHVyYVwiLFxuICAgIGhhc0NvbW1lbnQ6IFwiSGEgdW4gY29tbWVudG9cIixcbiAgICBoYXNPdGhlcjogXCJIYSBhbHRyb1wiLFxuICAgIGNob2ljZXM6IFwiU2NlbHRlXCIsXG4gICAgY2hvaWNlc09yZGVyOiBcIk9yZGluZSBTY2VsdGVcIixcbiAgICBjaG9pY2VzQnlVcmw6IFwiVXJsIFNjZWx0ZVwiLFxuICAgIGxhYmVsOiBcImxhYmVsXCIsXG4gICAgc2hvd1RpdGxlOiBcIk1vc3RyYSBUaXRvbG9cIixcbiAgICB2YWx1ZVRydWU6IFwiVmFsb3JlIFRydWVcIixcbiAgICB2YWx1ZUZhbHNlOiBcIlZhbG9yZSBGYWxzZVwiLFxuICAgIGNvbHM6IFwiQ29sb25uZVwiLFxuICAgIHJvd3M6IFwiUmlnaGVcIixcbiAgICBjdXJyZW5jeTogXCJWYWx1dGFcIixcbiAgICBzaG93UHJldmlldzogXCJWaXN1YWxpenphIEFudGVwcmltYVwiLFxuICAgIGh0bWw6IFwiaHRtbFwiLFxuICAgIHJhdGVWYWx1ZXM6IFwiVmFsb3JpIGRlbGxhIGNsYXNzaWZpY2FcIixcbiAgICBzaXplOiBcIkRpbWVuc2lvbmVcIixcbiAgICBsb2NhbGU6IFwibG9jYWxlXCIsXG4gICAgbWluVmFsdWU6IFwiVmFsb3JlIG1pbmltb1wiLFxuICAgIG1heFZhbHVlOiBcIlZhbG9yZSBtYXNzaW1vXCIsXG4gICAgbWluTGVuZ3RoOiBcIkx1bmdoZXp6YSBtaW5pbWFcIixcbiAgICBtYXhMZW5ndGg6IFwiTHVuZ2hlenphIG1hc3NpbWFcIixcbiAgICBhbGxvd0RpZ2l0czogXCJDb25zZW50aSBjaWZyZVwiLFxuICAgIHJlZ2V4OiBcIkVzcHJlc3Npb25lIHJlZ29sYXJlXCJcbiAgfVxufTtcblxuZWRpdG9yTG9jYWxpemF0aW9uLmxvY2FsZXNbXCJpdFwiXSA9IGl0YWxpYW5UcmFuc2xhdGlvbjtcbiIsImltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiwgZGVmYXVsdFN0cmluZ3MgfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5cbmV4cG9ydCB2YXIga29yZWFuU3RyaW5ncyA9IHtcbiAgLy9zdXJ2ZXkgdGVtcGxhdGVzXG4gIHN1cnZleToge1xuICAgIGVkaXQ6IFwi7Y647KeRXCIsXG4gICAgZHJvcFF1ZXN0aW9uOiBcIuyZvOyqvSDrj4Tqtazsg4HsnpDsl5DshJwg7KeI66y47J2EIOyXrOq4sOyXkCDrhpPsnLzsi63si5zsmKQuXCIsXG4gICAgY29weTogXCLrs7XsgqxcIixcbiAgICBhZGRUb1Rvb2xib3g6IFwi64+E6rWs7IOB7J6Q7JeQIOy2lOqwgFwiLFxuICAgIGRlbGV0ZVBhbmVsOiBcIu2MqOuEkCDsgq3soJxcIixcbiAgICBkZWxldGVRdWVzdGlvbjogXCLsp4jrrLgg7IKt7KCcXCIsXG4gICAgY29udmVydFRvOiBcIuuLpOydjOycvOuhnCDrs4Dqsr1cIixcbiAgICBkcmFnOiBcIu2VreuqqSDrgYzslrTsmKTquLBcIlxuICB9LFxuICAvL3F1ZXN0aW9uVHlwZXNcbiAgcXQ6IHtcbiAgICBkZWZhdWx0OiBcIuq4sOuzuOqwklwiLFxuICAgIGNoZWNrYm94OiBcIuyytO2BrOuwleyKpFwiLFxuICAgIGNvbW1lbnQ6IFwi7ISk66qFXCIsXG4gICAgZHJvcGRvd246IFwi65Oc66Gt64uk7Jq0XCIsXG4gICAgZmlsZTogXCLtjIzsnbxcIixcbiAgICBodG1sOiBcIkhUTUxcIixcbiAgICBtYXRyaXg6IFwi7ZaJ66CsICjri6jsnbwg7ISg7YOdKVwiLFxuICAgIG1hdHJpeGRyb3Bkb3duOiBcIu2WieugrCAo67O17IiYIOyEoO2DnSlcIixcbiAgICBtYXRyaXhkeW5hbWljOiBcIu2WieugrCAo64+Z7KCBIO2WiSlcIixcbiAgICBtdWx0aXBsZXRleHQ6IFwi7YWN7Iqk7Yq4IOyDgeyekCDqt7jro7lcIixcbiAgICBwYW5lbDogXCLtjKjrhJBcIixcbiAgICBwYW5lbGR5bmFtaWM6IFwi7Yyo64SQICjrj5nsoIEg7Yyo64SQKVwiLFxuICAgIHJhZGlvZ3JvdXA6IFwi652865SU7JikIOq3uOujuVwiLFxuICAgIHJhdGluZzogXCLrk7HquIlcIixcbiAgICB0ZXh0OiBcIu2FjeyKpO2KuCDsg4HsnpBcIixcbiAgICBib29sZWFuOiBcIuu2iOumsChib29sZWFuKVwiLFxuICAgIGV4cHJlc3Npb246IFwi7ZGc7ZiE7IudXCJcbiAgfSxcbiAgLy9TdHJpbmdzIGluIEVkaXRvclxuICBlZDoge1xuICAgIHN1cnZleTogXCLshKTrrLjsp4BcIixcbiAgICBzZXR0aW5nczogXCLshKTsoJVcIixcbiAgICBlZGl0U3VydmV5OiBcIuyEpOusuOyngCDtjrjsp5FcIixcbiAgICBhZGROZXdQYWdlOiBcIuyDiCDtjpjsnbTsp4Ag7LaU6rCAXCIsXG4gICAgbW92ZVJpZ2h0OiBcIuyYpOuluOyqveycvOuhnCDsiqTtgazroaRcIixcbiAgICBtb3ZlTGVmdDogXCLsmbzsqr3snLzroZwg7Iqk7YGs66GkXCIsXG4gICAgZGVsZXRlUGFnZTogXCLtjpjsnbTsp4Ag7IKt7KCcXCIsXG4gICAgZWRpdFBhZ2U6IFwi7Y6Y7J207KeAIO2OuOynkVwiLFxuICAgIGVkaXQ6IFwi7Y647KeRXCIsXG4gICAgbmV3UGFnZU5hbWU6IFwi7Y6Y7J207KeAXCIsXG4gICAgbmV3UXVlc3Rpb25OYW1lOiBcIuyniOusuFwiLFxuICAgIG5ld1BhbmVsTmFtZTogXCLtjKjrhJBcIixcbiAgICB0ZXN0U3VydmV5OiBcIu2FjOyKpO2KuCDshKTrrLjsp4BcIixcbiAgICB0ZXN0U3VydmV5QWdhaW46IFwi7YWM7Iqk7Yq4IOyEpOusuOyngCDri6Tsi5ztlZjquLBcIixcbiAgICB0ZXN0U3VydmV5V2lkdGg6IFwi7ISk66y47KeAIOuEiOu5hDogXCIsXG4gICAgZW1iZWRTdXJ2ZXk6IFwi64K07J6lIOyEpOusuOyngFwiLFxuICAgIHNhdmVTdXJ2ZXk6IFwi7ISk66y47KeAIOyggOyepVwiLFxuICAgIGRlc2lnbmVyOiBcIuyEpOusuOyngCDrlJTsnpDsnbhcIixcbiAgICBqc29uRWRpdG9yOiBcIkpTT04g7Y647KeR6riwXCIsXG4gICAgdW5kbzogXCLsi6Ttlokg7Leo7IaMXCIsXG4gICAgcmVkbzogXCLrs7Xsm5BcIixcbiAgICBvcHRpb25zOiBcIuyYteyFmFwiLFxuICAgIGdlbmVyYXRlVmFsaWRKU09OOiBcIkpTT04g642w7J207YSwIOyDneyEsVwiLFxuICAgIGdlbmVyYXRlUmVhZGFibGVKU09OOiBcIuyDneyEsSBKU09OIOuNsOydtO2EsCDsnb3quLBcIixcbiAgICB0b29sYm94OiBcIuuPhOq1rOyDgeyekFwiLFxuICAgIHRvb2xib3hHZW5lcmFsQ2F0ZWdvcnk6IFwi7J2867CYXCIsXG4gICAgZGVsU2VsT2JqZWN0OiBcIuyEoO2Dne2VnCDqsJ3ssrQg7IKt7KCcXCIsXG4gICAgZWRpdFNlbE9iamVjdDogXCLshKDtg53tlZwg6rCd7LK0IO2OuOynkVwiLFxuICAgIGNvcnJlY3RKU09OOiBcIkpTT04g642w7J207YSw66W8IOyImOygle2VmOyLreyLnOyYpC5cIixcbiAgICBzdXJ2ZXlSZXN1bHRzOiBcIuyEpOusuCDqsrDqs7w6IFwiLFxuICAgIG1vZGlmaWVkOiBcIuyImOygleuQqFwiLFxuICAgIHNhdmluZzogXCLsoIDsnqXspJFcIixcbiAgICBzYXZlZDogXCLsoIDsnqXrkKhcIlxuICB9LFxuICAvL1Byb3BlcnR5IG5hbWVzIGluIHRhYmxlIGhlYWRlcnNcbiAgcGVsOiB7XG4gICAgaXNSZXF1aXJlZDogXCLtlYTsiJjsnoXri4jquYw/XCJcbiAgfSxcbiAgLy9Qcm9wZXJ0eSBFZGl0b3JzXG4gIHBlOiB7XG4gICAgYXBwbHk6IFwi7KCB7JqpXCIsXG4gICAgb2s6IFwi7ZmV7J24XCIsXG4gICAgY2FuY2VsOiBcIuy3qOyGjFwiLFxuICAgIHJlc2V0OiBcIuyerOyEpOyglVwiLFxuICAgIGNsb3NlOiBcIuuLq+q4sFwiLFxuICAgIGRlbGV0ZTogXCLsgq3soJxcIixcbiAgICBhZGROZXc6IFwi7IOI66GcIOunjOuTpOq4sFwiLFxuICAgIGFkZEl0ZW06IFwi7ZWt66qp7J2EIOy2lOqwgO2VmOugpOuptCDtgbTrpr3tlZjsi63si5zsmKQuXCIsXG4gICAgcmVtb3ZlQWxsOiBcIuuqqOuRkCDsgq3soJxcIixcbiAgICBlZGl0OiBcIu2OuOynkVwiLFxuICAgIGl0ZW1WYWx1ZUVkaXQ6IFwi7KGw6rG0IOy2qeyhsSDsi5wg67O06riwXCIsXG4gICAgZWRpdENob2ljZXM6IFwi7ISg7YOd7IKs7ZWtIO2OuOynkVwiLFxuICAgIG1vdmU6IFwi7J2064+ZXCIsXG4gICAgZW1wdHk6IFwiPOu5hOyWtOyeiOydjD5cIixcbiAgICBub3RFbXB0eTogXCI87Y647KeRIOqwkj5cIixcbiAgICBmYXN0RW50cnk6IFwi67mg66W4IOyeheugpVwiLFxuICAgIGZvcm1FbnRyeTogXCLslpHsi50g7J6F66ClXCIsXG4gICAgdGVzdFNlcnZpY2U6IFwi7ISc67mE7IqkIO2FjOyKpO2KuFwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFF1ZXN0aW9uOiBcIuyniOusuCDshKDtg50uLi5cIixcbiAgICBjb25kaXRpb25WYWx1ZVF1ZXN0aW9uVGl0bGU6IFwi6rCS7J2EIOyeheugpe2VmOqxsOuCmCDshKDtg53tlZjsi63si5zsmKQuXCIsXG4gICAgY29uZGl0aW9uQnV0dG9uQWRkOiBcIuy2lOqwgFwiLFxuICAgIGNvbmRpdGlvbkJ1dHRvblJlcGxhY2U6IFwi67CU6r646riwXCIsXG4gICAgY29uZGl0aW9uSGVscDpcbiAgICAgIFwi67aI66awIOyLneydhCDsnoXroKXtlZjsi63si5zsmKQuIOyniOusuCDtmLnsnYAg7Y6Y7J207KeA66W8IOqzhOyGjSDrs7wg7IiYIOyeiOqyjCDtlZjroKTrqbQg7LC46rCS7J2EIOuwmO2ZmO2VtOyVvCDtlanri4jri6QuIOyYiOulvCDrk6TrqbQ6IHvsp4jrrLgxfSA9ICfqsJIxJyBvciAoe+yniOusuDJ9ICoge+yniOusuDR9ICA+IDIwIGFuZCB77KeI66y4M30gPCA1KVwiLFxuICAgIGV4cHJlc3Npb25IZWxwOlxuICAgICAgXCLsi53snYQg7J6F66Cl7ZWY7Iut7Iuc7JikLiDri6TsnYzqs7wg6rCZ7J2AIOyniOusuCDqsJLsl5Ag7KCR6re87ZWY66Ck66m0IOykkeq0hO2YuOulvCDsnbTsmqntlZjsi63si5zsmKQ6ICd77KeI66y4MX0gKyB77KeI66y4Mn0nLCAnKHvqsIDqsql9KnvsiJjrn4l9KSAqICgxMDAgLSB77ZWg7J24fSknXCIsXG4gICAgYWNlRWRpdG9ySGVscDogXCJjdHJsK3NwYWNl66W8IOuIjOufrCDsmYTshLHrkJwg7IiY7Iud7JeQIOuMgO2VnCDtnoztirjrpbwg7Ja77Jy87Iut7Iuc7JikXCIsXG4gICAgYWNlRWRpdG9yUm93VGl0bGU6IFwi7ZiE7J6sIO2WiVwiLFxuICAgIGFjZUVkaXRvclBhbmVsVGl0bGU6IFwi7ZiE7J6sIO2MqOuEkFwiLFxuICAgIHNob3dNb3JlOiBcIuyekOyEuO2VnCDrgrTsmqnsnYAg7ISk66qF7ISc66W8IO2ZleyduO2VmOyLreyLnOyYpC5cIixcbiAgICBjb25kaXRpb25TaG93TW9yZVVybDpcbiAgICAgIFwiaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnlQYXJhbWV0ZXI/aWQ9UXVlc3Rpb24mcGFyYW1ldGVyPXZpc2libGVJZlwiLFxuICAgIGFzc2lzdGFudFRpdGxlOiBcIuycoO2aqCDsp4jrrLg6XCIsXG4gICAgY2VsbHNFbXB0eVJvd3NDb2x1bW5zOiBcIuy1nOyGjO2VnCDtlZjrgpjsnZgg7Je0IOuYkOuKlCDtlonsnbQg7J6I7Ja07JW8IO2VqeuLiOuLpC5cIixcblxuICAgIHByb3BlcnR5SXNFbXB0eTogXCLqsJLsnYQg7J6F66Cl7ZWY7Iut7Iuc7JikXCIsXG4gICAgdmFsdWU6IFwi6rCSXCIsXG4gICAgdGV4dDogXCLthY3siqTtirhcIixcbiAgICBjb2x1bW5FZGl0OiBcIuyXtCDtjrjsp5E6IHswfVwiLFxuICAgIGl0ZW1FZGl0OiBcIu2VreuqqSDtjrjsp5E6IHswfVwiLFxuXG4gICAgdXJsOiBcIlVSTFwiLFxuICAgIHBhdGg6IFwi6rK966GcXCIsXG4gICAgdmFsdWVOYW1lOiBcIuqwkiDsnbTrpoRcIixcbiAgICB0aXRsZU5hbWU6IFwi7KCc66qpIOydtOumhFwiLFxuXG4gICAgaGFzT3RoZXI6IFwi64uk66W4IO2VreuqqeydtCDsnojsirXri4jri6RcIixcbiAgICBvdGhlclRleHQ6IFwi6riw7YOAIO2VreuqqSDthY3siqTtirhcIixcbiAgICBuYW1lOiBcIuydtOumhFwiLFxuICAgIHRpdGxlOiBcIuygnOuqqVwiLFxuICAgIGNlbGxUeXBlOiBcIuyFgCDsnKDtmJVcIixcbiAgICBjb2xDb3VudDogXCLsl7Qg6rCc7IiYXCIsXG4gICAgY2hvaWNlc09yZGVyOiBcIu2VreuqqSDsiJzshJwg7ISg7YOdXCIsXG4gICAgdmlzaWJsZTogXCLrs7TsnoXri4jquYw/P1wiLFxuICAgIGlzUmVxdWlyZWQ6IFwi7ZWE7IiY7J6F64uI6rmMP1wiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwi7IOIIOykhOuhnCDsi5zsnpHtlZjqsqDsirXri4jquYw/XCIsXG4gICAgcm93czogXCLtlokg7IiYXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwi7J6F66ClIOyekOumrCDtkZzsi5zsnpAgXCIsXG4gICAgc2hvd1ByZXZpZXc6IFwi7J2066+47KeAIOuvuOumrOuztOq4sOqwgCDtkZzsi5zrkKnri4jquYw/XCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIu2MjOydvCDrgrTsmqnsnYQgSlNPTiDqsrDqs7zsl5Ag7YWN7Iqk7Yq466GcIOyggOyepVwiLFxuICAgIG1heFNpemU6IFwi7LWc64yAIO2MjOydvCDtgazquLAoYnl0ZXMpXCIsXG4gICAgaW1hZ2VIZWlnaHQ6IFwi7J2066+47KeAIOuGkuydtFwiLFxuICAgIGltYWdlV2lkdGg6IFwi7J2066+47KeAIOuEiOu5hFwiLFxuICAgIHJvd0NvdW50OiBcIu2WiSDsiJhcIixcbiAgICBjb2x1bW5zTG9jYXRpb246IFwi7Je0IOychOy5mFwiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcIu2WiSDrsoTtirwg7JyE7LmYIOy2lOqwgFwiLFxuICAgIGFkZFJvd1RleHQ6IFwi7ZaJIOuyhO2KvCDthY3siqTtirgg7LaU6rCAXCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCLtlokg67KE7Yq8IO2FjeyKpO2KuCDsoJzqsbBcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwi7LWc7IaMIOyEpOuqhSDquLjsnbRcIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwi7LWc64yAIOyEpOuqhSDquLjsnbRcIixcbiAgICBpbnB1dFR5cGU6IFwi7J6F66ClIOycoO2YlVwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIuyYteyFmCDsuqHshZhcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwi6riw67O46rCSXCIsXG4gICAgY2VsbHNEZWZhdWx0Um93OiBcIuq4sOuzuCDshYAg7YWN7Iqk7Yq4XCIsXG5cbiAgICBzdXJ2ZXlFZGl0b3JUaXRsZTogXCLshKTrrLjsp4Ag7ISk7KCVIO2OuOynkVwiLFxuICAgIHFFZGl0b3JUaXRsZTogXCLtjrjsp5E6IHswfVwiLFxuXG4gICAgLy9zdXJ2ZXlcbiAgICBzaG93VGl0bGU6IFwi7KCc66qpIO2RnOyLnC/siKjquYBcIixcbiAgICBsb2NhbGU6IFwi6riw67O4IOyWuOyWtFwiLFxuICAgIG1vZGU6IFwi66qo65OcKO2OuOynkS/snb3quLDsoITsmqkpXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwi67O07J207KeAIOyViuuKlCDqsJIg7KeA7Jqw6riwXCIsXG4gICAgY29va2llTmFtZTogXCLsv6DtgqQg7J2066aEKOuhnOy7rOyXkOyEnCDshKTrrLgg7KGw7IKs66W8IOuRkCDrsogg7IKs7Jqp7ZWY7KeAIOyViuuPhOuhnSDshKTsoJUpXCIsXG4gICAgc2VuZFJlc3VsdE9uUGFnZU5leHQ6IFwi64uk7J2MIO2OmOydtOyngOyXkOyEnCDshKTrrLgg7KGw7IKsIOqysOqzvCDrs7TrgrTquLBcIixcbiAgICBzdG9yZU90aGVyc0FzQ29tbWVudDogXCLri6Trpbgg7IKs7Jqp7J6Q7J2YIOqwkuydhCDrs4Trj4TsnZgg7ZWE65Oc7JeQIOyggOyepVwiLFxuICAgIHNob3dQYWdlVGl0bGVzOiBcIu2OmOydtOyngCDsoJzrqqkg7ZGc7IucXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcIu2OmOydtOyngCDrsojtmLgg7ZGc7IucXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIuydtOyghCDtjpjsnbTsp4Ag67KE7Yq8IO2FjeyKpO2KuFwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCLri6TsnYwg7Y6Y7J207KeAIOuyhO2KvCDthY3siqTtirhcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwi7JmE66OMIOuyhO2KvCDthY3siqTtirhcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwi7Iuc7J6RIOuyhO2KvCDthY3siqTtirhcIixcbiAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IFwi7YOQ7IOJIOuyhO2KvCDtkZzsi5wgKOq4sOuzuCDtg5Dsg4kpXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwi7J207KCEIOuyhO2KvCDtkZzsi5wgKOyCrOyaqeyekOqwgCDsnbTsoIQg7Y6Y7J207KeA66GcIOuPjOyVhOqwiCDsiJgg7J6I7J2MKVwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCLshKTrrLjsp4DsnZgg7LKrIOuyiOynuCDtjpjsnbTsp4DripQg7Iuc7J6RIO2OmOydtOyngOyeheuLiOuLpFwiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcIuuBnSDrtoDrtoTsl5Ag7JmE66OM65CcIO2OmOydtOyngCDtkZzsi5wgKOyZhOujjOuQnCBIVE1MKVwiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6IFwi66qo65OgIOyniOusuOyXkCDsnZHri7Ug7ZuEIOyekOuPmeycvOuhnCDri6TsnYwg7Y6Y7J207KeA66GcIOydtOuPmVwiLFxuICAgIHNob3dQcm9ncmVzc0JhcjogXCLsp4TtlonrpaAg66eJ64yAIO2RnOyLnFwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCLsp4jrrLgg7KCc66qpIOychOy5mFwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCLsp4jrrLjsl5Ag7ZWE7JqU7ZWcIOq4sO2YuFwiLFxuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogXCLsp4jrrLgg7Iuc7J6RIOyDieyduCAoMSwgMiDrmJDripQgJ0EnLCAnYScpXCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCLsp4jrrLgg67KI7Zi4IO2RnOyLnFwiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTpcbiAgICAgIFwi7KeI66y4IOygnOuqqSDthZztlIzrpr/snoXri4jri6QuIOq4sOuzuOqwkjogJ3tub30uIHtyZXF1aXJlfSB7dGl0bGV9J1wiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCLsp4jrrLgg7JyE7LmYIOyYpOulmFwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzogXCLtjpjsnbTsp4Ag67OA6rK97IucIOyyqyDrsojsp7gg7KeI66y47JeQIOy0iOygkFwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcIu2OmOydtOyngOydmCDsmpTshowg7Iic7IScXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIuyEpOusuCDsobDsgqzrpbwg66eI7LmgIOyImOyeiOuKlCDstZzrjIAg7Iuc6rCEXCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCLshKTrrLgg7KGw7IKs7JeQ7IScIO2OmOydtOyngOulvCDrp4jsuaAg7IiY7J6I64qUIOy1nOuMgCDsi5zqsIRcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCLtg4DsnbTrqLgg7Yyo64SQIO2RnOyLnFwiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCLtg4DsnbTrqLgg7Yyo64SQIOuqqOuTnCDtkZzsi5xcIixcbiAgICByZW5kZXJNb2RlOiBcIuugjOuNlOungSDrqqjrk5xcIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIu2MqOuEkCDstpTqsIAg7ZeI7JqpXCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCLtjKjrhJAg7KCc6rGwIO2XiOyaqVwiLFxuICAgIHBhbmVsQWRkVGV4dDogXCLtjKjrhJAg7YWN7Iqk7Yq4IOy2lOqwgFwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCLtjKjrhJAg7YWN7Iqk7Yq4IOyCreygnFwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCLtlZwg7Y6Y7J207KeA7JeQIOuqqOuToCDsmpTshowg7ZGc7IucXCIsXG5cbiAgICB0YWJzOiB7XG4gICAgICBnZW5lcmFsOiBcIuydvOuwmFwiLFxuICAgICAgZmlsZU9wdGlvbnM6IFwi7Ji17IWYXCIsXG4gICAgICBodG1sOiBcIkh0bWwg7Y647KeR6riwXCIsXG4gICAgICBjb2x1bW5zOiBcIuyXtFwiLFxuICAgICAgcm93czogXCLtlolcIixcbiAgICAgIGNob2ljZXM6IFwi7ISg7YOdXCIsXG4gICAgICBpdGVtczogXCLtla3rqqlcIixcbiAgICAgIHZpc2libGVJZjogXCLsobDqsbQg7Lap7KGx7IucIOuztOq4sFwiLFxuICAgICAgZW5hYmxlSWY6IFwi7KGw6rG0IOy2qeyhseyLnCDtl4jsmqlcIixcbiAgICAgIHJhdGVWYWx1ZXM6IFwi6ri47J20IOqwklwiLFxuICAgICAgY2hvaWNlc0J5VXJsOiBcIuybueyXkOyEnCDshKDtg51cIixcbiAgICAgIG1hdHJpeENob2ljZXM6IFwi6riw67O4IOyEoO2DnVwiLFxuICAgICAgbXVsdGlwbGVUZXh0SXRlbXM6IFwi7YWN7Iqk7Yq4IOyeheugpVwiLFxuICAgICAgdmFsaWRhdG9yczogXCLsnKDtmqjshLEg6rKA7IKs6riwXCIsXG4gICAgICBuYXZpZ2F0aW9uOiBcIu2DkOyDiVwiLFxuICAgICAgcXVlc3Rpb246IFwi7KeI66y4XCIsXG4gICAgICBjb21wbGV0ZWRIdG1sOiBcIuyZhOujjOuQnCBIVE1MXCIsXG4gICAgICBsb2FkaW5nSHRtbDogXCJIVE1MIOuhnOuTnCDspJFcIixcbiAgICAgIHRpbWVyOiBcIu2DgOydtOuouCAvIO2AtOymiFwiLFxuICAgICAgdHJpZ2dlcnM6IFwi7Yq466as6rGwXCIsXG4gICAgICB0ZW1wbGF0ZVRpdGxlOiBcIu2FnO2UjOumvyDsoJzrqqlcIlxuICAgIH0sXG4gICAgZWRpdFByb3BlcnR5OiBcIu2OuOynkSDsho3shLEgJ3swfSdcIixcbiAgICBpdGVtczogXCJbIO2VreuqqTogezB9IF1cIixcblxuICAgIGVudGVyTmV3VmFsdWU6IFwi6rCS7J2EIOyeheugpe2VmOyLreyLnOyYpC5cIixcbiAgICBub3F1ZXN0aW9uczogXCLshKTrrLgg7KGw7IKs7JeQ64qUIOyWtOuWpCDsp4jrrLjrj4Qg7JeG7Iq164uI64ukLlwiLFxuICAgIGNyZWF0ZXRyaWdnZXI6IFwi7Yq466as6rGw66W8IOunjOuTnOyLreyLnOyYpFwiLFxuICAgIHRyaWdnZXJPbjogXCLtirjrpqzqsbAg7Lyc6riwXCIsXG4gICAgdHJpZ2dlck1ha2VQYWdlc1Zpc2libGU6IFwi7Y6Y7J207KeAIO2RnOyLnDpcIixcbiAgICB0cmlnZ2VyTWFrZVF1ZXN0aW9uc1Zpc2libGU6IFwi7JqU7IaMIO2RnOyLnDpcIixcbiAgICB0cmlnZ2VyQ29tcGxldGVUZXh0OiBcIuyhsOqxtCDstqnsobEg7IucIOyEpOusuCDsobDsgqzrpbwg7J6R7ISx7ZWY7Iut7Iuc7JikLlwiLFxuICAgIHRyaWdnZXJOb3RTZXQ6IFwi7Yq466as6rGw6rCAIOyEpOygleuQmOyngCDslYrslZjsirXri4jri6QuXCIsXG4gICAgdHJpZ2dlclJ1bklmOiBcIuuLpOydjCDsobDqsbQg7Lap7KGxIOyLnCDsi6TtlolcIixcbiAgICB0cmlnZ2VyU2V0VG9OYW1lOiBcIuuLpOydjCDqsJIg67OA6rK9OiBcIixcbiAgICB0cmlnZ2VyU2V0VmFsdWU6IFwi64uk7J2M7Jy866GcIOyImOyglTogXCIsXG4gICAgdHJpZ2dlcklzVmFyaWFibGU6IFwi67OA7IiY66W8IOyEpOusuCDqsrDqs7zsl5Ag64Sj7KeAIOuniOyLreyLnOyYpC5cIlxuICB9LFxuICAvL1Byb3BlcnR5IHZhbHVlc1xuICBwdjoge1xuICAgIHRydWU6IFwi7LC4XCIsXG4gICAgZmFsc2U6IFwi6rGw7KeTXCIsXG4gICAgaW5oZXJpdDogXCLsg4Hsho1cIixcbiAgICBzaG93OiBcIuuztOq4sFwiLFxuICAgIGhpZGU6IFwi7Iio6riw6riwXCIsXG4gICAgZGVmYXVsdDogXCLquLDrs7jqsJJcIixcbiAgICBpbml0aWFsOiBcIuy0iOq4sOqwklwiLFxuICAgIHJhbmRvbTogXCLrrLTsnpHsnIRcIixcbiAgICBjb2xsYXBzZWQ6IFwi7LaV7IaMXCIsXG4gICAgZXhwYW5kZWQ6IFwi7ZmV7J6lXCIsXG4gICAgbm9uZTogXCLsl4bsnYxcIixcbiAgICBhc2M6IFwi7Jik66aE7LCo7IicXCIsXG4gICAgZGVzYzogXCLrgrTrprzssKjsiJxcIixcbiAgICBpbmRldGVybWluYXRlOiBcIuu2iO2ZleyglVwiLFxuICAgIGRlY2ltYWw6IFwi7KeE7IiYXCIsXG4gICAgY3VycmVuY3k6IFwi7ZmU7Y+QXCIsXG4gICAgcGVyY2VudDogXCLtjbzshLztirhcIixcbiAgICBmaXJzdEV4cGFuZGVkOiBcIuyasOyEoCDtmZXsnqVcIixcbiAgICBvZmY6IFwi6rq87KeQXCIsXG4gICAgb25QYW5lbDogXCLtjKjrhJDsl5DshJxcIixcbiAgICBvblN1cnZleTogXCLshKTrrLjsl5DshJxcIixcbiAgICBsaXN0OiBcIuuqqeuhnVwiLFxuICAgIHByb2dyZXNzVG9wOiBcIuyDgeuLqCDsp4TtlonrpaBcIixcbiAgICBwcm9ncmVzc0JvdHRvbTogXCLtlZjri6gg7KeE7ZaJ66WgXCIsXG4gICAgcHJvZ3Jlc3NUb3BCb3R0b206IFwi7IOB7ZWY64uoIOynhO2WieuloFwiLFxuICAgIGhvcml6b250YWw6IFwi6rCA66GcXCIsXG4gICAgdmVydGljYWw6IFwi7IS466GcXCIsXG4gICAgdG9wOiBcIuychFwiLFxuICAgIGJvdHRvbTogXCLslYTrnphcIixcbiAgICB0b3BCb3R0b206IFwi7JyE7JWE656YXCIsXG4gICAgbGVmdDogXCLsmbzsqr1cIixcbiAgICBjb2xvcjogXCLsg4nsg4FcIixcbiAgICBkYXRlOiBcIuuCoOynnFwiLFxuICAgIGRhdGV0aW1lOiBcIuuCoOynnC/si5zqsIRcIixcbiAgICBcImRhdGV0aW1lLWxvY2FsXCI6IFwi7ZiE7KeAIOuCoOynnC/si5zqsIRcIixcbiAgICBlbWFpbDogXCLsnbTrqZTsnbxcIixcbiAgICBtb250aDogXCLsm5RcIixcbiAgICBudW1iZXI6IFwi7Iir7J6QXCIsXG4gICAgcGFzc3dvcmQ6IFwi7Yyo7Iqk7JuM65OcXCIsXG4gICAgcmFuZ2U6IFwi67KU7JyEXCIsXG4gICAgdGVsOiBcInRlbFwiLFxuICAgIHRleHQ6IFwi7YWN7Iqk7Yq4XCIsXG4gICAgdGltZTogXCLsi5zqsIRcIixcbiAgICB1cmw6IFwiVVJMXCIsXG4gICAgd2VlazogXCLso7xcIixcbiAgICBoaWRkZW46IFwi7Iio6rmAXCIsXG4gICAgb246IFwi7Lyc6riwXCIsXG4gICAgb25QYWdlOiBcIu2OmOydtOyngCDsvJzquLBcIixcbiAgICBlZGl0OiBcIu2OuOynkVwiLFxuICAgIGRpc3BsYXk6IFwi65SU7Iqk7ZSM66CI7J20XCIsXG4gICAgb25Db21wbGV0ZTogXCLsmYTro4xcIixcbiAgICBvbkhpZGRlbjogXCLsiKjquYBcIixcbiAgICBhbGw6IFwi66qo65GQXCIsXG4gICAgcGFnZTogXCLtjpjsnbTsp4BcIixcbiAgICBzdXJ2ZXk6IFwi7ISk66y47KeAXCIsXG4gICAgb25OZXh0UGFnZTogXCLri6TsnYwg7Y6Y7J207KeA66GcXCIsXG4gICAgb25WYWx1ZUNoYW5nZWQ6IFwi6rCSIOuzgOqyvVwiXG4gIH0sXG4gIC8vT3BlcmF0b3JzXG4gIG9wOiB7XG4gICAgZW1wdHk6IFwi67mE7Ja07J6I7Iq164uI64ukXCIsXG4gICAgbm90ZW1wdHk6IFwi67mE7Ja07J6I7KeAIOyViuyKteuLiOuLpFwiLFxuICAgIGVxdWFsOiBcIuqwmeyKteuLiOuLpFwiLFxuICAgIG5vdGVxdWFsOiBcIuqwmeyngCDslYrsirXri4jri6RcIixcbiAgICBjb250YWluczogXCLtj6ztlajtlanri4jri6RcIixcbiAgICBub3Rjb250YWluczogXCLtj6ztlajtlZjsp4Ag7JWK7Iq164uI64ukXCIsXG4gICAgZ3JlYXRlcjogXCLtgbBcIixcbiAgICBsZXNzOiBcIuyekeydgFwiLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBcIu2BrOqxsOuCmCDqsJnsnYxcIixcbiAgICBsZXNzb3JlcXVhbDogXCLsnpHqsbDrgpgg6rCZ7J2MXCJcbiAgfSxcbiAgLy9FbWJlZCB3aW5kb3dcbiAgZXc6IHtcbiAgICBhbmd1bGFyOiBcIkFuZ3VsYXIg67KE7KCEIOyCrOyaqVwiLFxuICAgIGpxdWVyeTogXCJqUXVlcnkg67KE7KCEIOyCrOyaqVwiLFxuICAgIGtub2Nrb3V0OiBcIktub2Nrb3V0IOuyhOyghCDsgqzsmqlcIixcbiAgICByZWFjdDogXCJSZWFjdCDrsoTsoIQg7IKs7JqpXCIsXG4gICAgdnVlOiBcIlZ1ZSDrsoTsoIQg7IKs7JqpXCIsXG4gICAgYm9vdHN0cmFwOiBcIuu2gO2KuCDsiqTtirjrnqkg7ZSE66CI7J6EXCIsXG4gICAgc3RhbmRhcmQ6IFwi67aA7Yq4IOyKpO2KuOueqSDsl4bsnYxcIixcbiAgICBzaG93T25QYWdlOiBcIu2OmOydtOyngOyXkOyEnCDshKTrrLjsobDsgqwg67O06riwXCIsXG4gICAgc2hvd0luV2luZG93OiBcIuyciOuPhOyasCDssL3sl5DshJwg7ISk66y47KGw7IKsIOuztOq4sFwiLFxuICAgIGxvYWRGcm9tU2VydmVyOiBcIuyEnOuyhOyXkOyEnCDshKTrrLjsobDsgqwgSlNPTiDsi6TtlolcIixcbiAgICB0aXRsZVNjcmlwdDogXCLsiqTtgazrpr3tirgg67CPIOyKpO2DgOydvFwiLFxuICAgIHRpdGxlSHRtbDogXCJIVE1MXCIsXG4gICAgdGl0bGVKYXZhU2NyaXB0OiBcIuyekOuwlOyKpO2BrOumve2KuFwiXG4gIH0sXG4gIC8vVGVzdCBTdXJ2ZXlcbiAgdHM6IHtcbiAgICBzZWxlY3RQYWdlOiBcIu2FjOyKpO2KuCDtlaAg7Y6Y7J207KeA66W8IOyEoO2Dne2VmOyLreyLnOyYpDpcIlxuICB9LFxuICB2YWxpZGF0b3JzOiB7XG4gICAgYW5zd2VyY291bnR2YWxpZGF0b3I6IFwi64u1IOqwnOyImFwiLFxuICAgIGVtYWlsdmFsaWRhdG9yOiBcIuydtOuplOydvFwiLFxuICAgIGV4cHJlc3Npb252YWxpZGF0b3I6IFwi7ZGc7ZiE7IudXCIsXG4gICAgbnVtZXJpY3ZhbGlkYXRvcjogXCLsiKvsnpBcIixcbiAgICByZWdleHZhbGlkYXRvcjogXCLsoJXqt5zsi51cIixcbiAgICB0ZXh0dmFsaWRhdG9yOiBcIu2FjeyKpO2KuFwiXG4gIH0sXG4gIHRyaWdnZXJzOiB7XG4gICAgY29tcGxldGV0cmlnZ2VyOiBcIuyEpOusuCDsmYTro4xcIixcbiAgICBzZXR2YWx1ZXRyaWdnZXI6IFwi6rCSIOyEpOyglVwiLFxuICAgIHZpc2libGV0cmlnZ2VyOiBcIuyEoOuqheuPhCDrs4Dqsr1cIlxuICB9LFxuICAvL1Byb3BlcnRpZXNcbiAgcDoge1xuICAgIG5hbWU6IFwi7J2066aEXCIsXG4gICAgdGl0bGU6IHtcbiAgICAgIG5hbWU6IFwi7KCc66qpXCIsXG4gICAgICB0aXRsZTogXCIn7J2066aEJ+qzvCDqsJnsnYAg6rK97JqwIOu5hOybjCDrkaHri4jri6QuXCJcbiAgICB9LFxuXG4gICAgbmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5OiBcIu2DkOyDiSDrsoTtirwg7ISg66qF64+EXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwi7KeI66y4IOyInOyEnFwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCLstZzrjIAg7JmE66OMIOyLnOqwhFwiLFxuXG4gICAgdmlzaWJsZTogXCLrs7TquLBcIixcbiAgICB2aXNpYmxlSWY6IFwi7KGw6rG0IOy2qeyhseyLnCDrs7TquLBcIixcbiAgICBxdWVzdGlvblRpdGxlTG9jYXRpb246IFwi7KeI66y4IOygnOuqqSDsnITsuZhcIixcbiAgICBkZXNjcmlwdGlvbjogXCLshKTrqoVcIixcbiAgICBzdGF0ZTogXCJzdGF0ZVwiLFxuICAgIGlzUmVxdWlyZWQ6IFwi7ZWE7IiYXCIsXG4gICAgaW5kZW50OiBcIuuTpOyXrOyTsOq4sFwiLFxuICAgIHJlcXVpcmVkRXJyb3JUZXh0OiBcIu2VhOyImCDsmKTrpZgg7YWN7Iqk7Yq4XCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCLsg4gg7KSE66GcIOyLnOyekVwiLFxuICAgIGlubmVySW5kZW50OiBcIuyViOycvOuhnCDrk6Tsl6zsk7DquLBcIixcbiAgICBwYWdlOiBcIu2OmOydtOyngFwiLFxuXG4gICAgd2lkdGg6IFwi64SI67mEXCIsXG5cbiAgICBjb21tZW50VGV4dDogXCLrqZTrqqgg7YWN7Iqk7Yq4XCIsXG4gICAgdmFsdWVOYW1lOiBcIuydtOumhOqwklwiLFxuICAgIGVuYWJsZUlmOiBcIuyhsOqxtCDstqnsobHsi5wg7ZeI6rCAXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIuq4sOuzuOqwklwiLFxuICAgIGNvcnJlY3RBbnN3ZXI6IFwi64u17JWIIOyImOyglVwiLFxuICAgIHJlYWRPbmx5OiBcIuydveq4sCDsoITsmqlcIixcbiAgICB2YWxpZGF0b3JzOiBcIuycoO2aqOyEsSDqsoDsgqzquLBcIixcbiAgICB0aXRsZUxvY2F0aW9uOiBcIuygnOuqqSDsnITsuZhcIixcblxuICAgIGhhc0NvbW1lbnQ6IFwi64u167OAXCIsXG4gICAgaGFzT3RoZXI6IFwi64uk66W4IOuLteuzgCDtl4jsmqlcIixcbiAgICBjaG9pY2VzOiBcIuyEoO2DnVwiLFxuICAgIGNob2ljZXNPcmRlcjogXCLquLDtg4Ag7ISg7YOdXCIsXG4gICAgY2hvaWNlc0J5VXJsOiBcIlVSTOydhCDthrXtlZwg7ISg7YOdXCIsXG4gICAgb3RoZXJUZXh0OiBcIuq4sO2DgCDthY3siqTtirhcIixcbiAgICBvdGhlckVycm9yVGV4dDogXCLquLDtg4Ag7Jik66WYIO2FjeyKpO2KuFwiLFxuICAgIHN0b3JlT3RoZXJzQXNDb21tZW50OiBcIuq4sO2DgCDri7Xrs4Ag7KCA7J6lXCIsXG5cbiAgICBsYWJlbDogXCLrnbzrsqhcIixcbiAgICBzaG93VGl0bGU6IFwi7KCc66qpIO2RnOyLnFwiLFxuICAgIHZhbHVlVHJ1ZTogXCLssLjqsJJcIixcbiAgICB2YWx1ZUZhbHNlOiBcIuqxsOynk+qwklwiLFxuXG4gICAgY29sczogXCLsl7RcIixcbiAgICByb3dzOiBcIu2WiVwiLFxuICAgIHBsYWNlSG9sZGVyOiBcIuyekOumrCDtkZzsi5zsnpBcIixcblxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIuyYteyFmCDsuqHshZhcIixcblxuICAgIGV4cHJlc3Npb246IFwi7ZGc7ZiE7IudXCIsXG4gICAgZm9ybWF0OiBcIu2PrOunt1wiLFxuICAgIGRpc3BsYXlTdHlsZTogXCLrlJTsiqTtlIzroIjsnbQg7Iqk7YOA7J28XCIsXG4gICAgY3VycmVuY3k6IFwi7ZmU7Y+QXCIsXG4gICAgdXNlR3JvdXBpbmc6IFwi6re466O5IOyCrOyaqVwiLFxuXG4gICAgc2hvd1ByZXZpZXc6IFwi66+466as67O06riwIOuztOq4sFwiLFxuICAgIGFsbG93TXVsdGlwbGU6IFwi64uk7IiYIO2XiOyaqVwiLFxuICAgIGltYWdlSGVpZ2h0OiBcIuydtOuvuOyngCDrhpLsnbRcIixcbiAgICBpbWFnZVdpZHRoOiBcIuydtOuvuOyngCDrhIjruYRcIixcbiAgICBzdG9yZURhdGFBc1RleHQ6IFwi7YWN7Iqk7Yq466GcIOuNsOydtO2EsCDsoIDsnqVcIixcbiAgICBtYXhTaXplOiBcIuy1nOuMgCDtgazquLBcIixcblxuICAgIGh0bWw6IFwiSFRNTFwiLFxuXG4gICAgY29sdW1uczogXCLsl7RcIixcbiAgICBjZWxsczogXCLshYBcIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcIuuqqOuRkCDtlYTsiJgg7ZaJ7J6F64uI6rmMXCIsXG5cbiAgICBob3Jpem9udGFsU2Nyb2xsOiBcIuqwgOuhnCDsiqTtgazroaTrsJRcIixcbiAgICBjZWxsVHlwZTogXCLshYAg7Jyg7ZiVXCIsXG4gICAgY29sdW1uc0xvY2F0aW9uOiBcIuyXtCDsnITsuZhcIixcbiAgICBjb2x1bW5Db2xDb3VudDogXCLsl7Qg6rCc7IiYXCIsXG4gICAgY29sdW1uTWluV2lkdGg6IFwi7Je0IOy1nOyGjCDrhIjruYRcIixcblxuICAgIHJvd0NvdW50OiBcIu2WiSDsiJhcIixcbiAgICBtaW5Sb3dDb3VudDogXCLstZzshowg7ZaJIOqwnOyImFwiLFxuICAgIG1heFJvd0NvdW50OiBcIuy1nOuMgCDtlokg6rCc7IiYXCIsXG4gICAga2V5TmFtZTogXCJrZXlOYW1lXCIsXG4gICAga2V5RHVwbGljYXRpb25FcnJvcjogXCLso7zsmpQg67O17KCcIOyXkOufrFwiLFxuICAgIGNvbmZpcm1EZWxldGU6IFwi7IKt7KCcIO2ZleyduFwiLFxuICAgIGNvbmZpcm1EZWxldGVUZXh0OiBcIu2FjeyKpO2KuCDsgq3soJwg7ZmV7J24XCIsXG4gICAgYWRkUm93TG9jYXRpb246IFwi7ZaJIOychOy5mCDstpTqsIBcIixcbiAgICBhZGRSb3dUZXh0OiBcIu2WiSDthY3siqTtirgg7LaU6rCAXCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCLtlokg7YWN7Iqk7Yq4IOygnOqxsFwiLFxuXG4gICAgaXRlbXM6IFwi7ZWt66qpXCIsXG4gICAgaXRlbVNpemU6IFwi7ZWt66qpIO2BrOq4sFwiLFxuICAgIGNvbENvdW50OiBcIuyXtCDqsJzsiJhcIixcblxuICAgIHRlbXBsYXRlVGl0bGU6IFwi7YWc7ZSM66a/IOydtOumhFwiLFxuICAgIHRlbXBsYXRlRGVzY3JpcHRpb246IFwi7YWc7ZSM66a/IOyEpOuqhVwiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwi7Yyo64SQIOy2lOqwgCDtl4jsmqlcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIu2MqOuEkCDsoJzqsbAg7ZeI7JqpXCIsXG4gICAgcGFuZWxDb3VudDogXCLtjKjrhJAg6rCc7IiYXCIsXG4gICAgbWluUGFuZWxDb3VudDogXCLstZzshowg7Yyo64SQIOqwnOyImFwiLFxuICAgIG1heFBhbmVsQ291bnQ6IFwi7LWc64yAIO2MqOuEkCDqsJzsiJhcIixcbiAgICBwYW5lbHNTdGF0ZTogXCJwYW5lbHNTdGF0ZVwiLFxuICAgIHBhbmVsQWRkVGV4dDogXCLtjKjrhJAg7YWN7Iqk7Yq4IOy2lOqwgFwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCLtjKjrhJAg7YWN7Iqk7Yq4IOygnOqxsFwiLFxuICAgIHBhbmVsUHJldlRleHQ6IFwi7J207KCEIO2MqOuEkCDthY3siqTtirhcIixcbiAgICBwYW5lbE5leHRUZXh0OiBcIuuLpOydjCDtjKjrhJAg7YWN7Iqk7Yq4XCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCLsp4jrrLgg6rCc7IiYIOuztOq4sFwiLFxuICAgIHNob3dSYW5nZUluUHJvZ3Jlc3M6IFwi7KeE7ZaJ7KSR7J24IOuylOychCDrs7TquLBcIixcbiAgICByZW5kZXJNb2RlOiBcInJlbmRlck1vZGVcIixcbiAgICB0ZW1wbGF0ZVRpdGxlTG9jYXRpb246IFwi7YWc7ZSM66a/IOydtOumhCDsnITsuZhcIixcblxuICAgIHJhdGVWYWx1ZXM6IFwi6ri47J206rCSXCIsXG4gICAgcmF0ZU1pbjogXCLstZzshowg6ri47J20XCIsXG4gICAgcmF0ZU1heDogXCLstZzrjIAg6ri47J20XCIsXG4gICAgcmF0ZVN0ZXA6IFwicmF0ZVN0ZXBcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwi7LWc7IaMIOyEpOuqhSDquLjsnbRcIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwi7LWc64yAIOyEpOuqhSDquLjsnbRcIixcblxuICAgIGlucHV0VHlwZTogXCLsnoXroKUg7Jyg7ZiVXCIsXG4gICAgc2l6ZTogXCLtgazquLBcIixcblxuICAgIGxvY2FsZTogXCLroZzsu6xcIixcbiAgICBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWM6IFwi7LKrIOyniOusuCDsnpDrj5kg7LSI7KCQXCIsXG4gICAgY29tcGxldGVkSHRtbDogXCLsmYTro4zrkJwgSFRNTFwiLFxuICAgIGNvbXBsZXRlZEJlZm9yZUh0bWw6IFwi7JmE66OM65CcIOydtOyghCBIVE1MXCIsXG4gICAgbG9hZGluZ0h0bWw6IFwiSFRNTCDroZzrk5xcIixcbiAgICB0cmlnZ2VyczogXCLtirjrpqzqsbBcIixcbiAgICBjb29raWVOYW1lOiBcIuy/oO2CpCDsnbTrpoRcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCLtmIQg7Y6Y7J207KeA66GcIOqysOqzvCDsoITshqFcIixcbiAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IFwi7YOQ7IOJIOuyhO2KvCDrs7TquLBcIixcbiAgICBzaG93UHJldkJ1dHRvbjogXCLrkqTroZzqsIDquLAg67KE7Yq8IOuztOq4sFwiLFxuICAgIHNob3dQYWdlVGl0bGVzOiBcIu2OmOydtOyngCDsoJzrqqkg67O06riwXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwi7JmE66OMIO2OmOydtOyngCDrs7TquLBcIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwi7Y6Y7J207KeAIOyImCDrs7TquLBcIixcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwi7KeI66y4IOyYpOulmCDsnITsuZhcIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwi7KeE7ZaJIOyDge2DnOuwlCDrs7TquLBcIixcbiAgICBtb2RlOiBcIuuqqOuTnFwiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6IFwi64uk7J2MIO2OmOydtOyngOuhnCDsnpDrj5nsnLzroZwg64SY7Ja06rCA6riwXCIsXG4gICAgY2hlY2tFcnJvcnNNb2RlOiBcIuyYpOulmCDrqqjrk5wg7ZmV7J24XCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwi67O07J207KeAIOyViuuKlCDrs4DsiJgg7KCc6rGwXCIsXG4gICAgc3RhcnRTdXJ2ZXlUZXh0OiBcIuyEpOusuCDthYzsiqTtirgg7Iuc7J6RXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIuydtOyghCDthY3siqTtirgg7Y6Y7J207KeAXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIuuLpOydjCDthY3siqTtirgg7Y6Y7J207KeAXCIsXG4gICAgY29tcGxldGVUZXh0OiBcIuyZhOujjCDthY3siqTtirhcIixcbiAgICByZXF1aXJlZFRleHQ6IFwi7ZWE7IiYIO2FjeyKpO2KuFwiLFxuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogXCLsp4jrrLgg7Iuc7J6RIOyDieyduFwiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTogXCLsp4jrrLgg7KCc66qpIO2FnO2UjOumv1wiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCLssqsg7Y6Y7J207KeA7JeQ7IScIOyLnOyekVwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCLri6jsnbwg7Y6Y7J207KeAXCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCLtjpjsnbTsp4Ag7KKF66OMIOy1nOuMgCDsi5zqsIRcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCLtg4DsnbTrqLgg7Yyo64SQIOuztOq4sFwiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCLtg4DsnbTrqLgg7Yyo64SQIOuqqOuTnCDrs7TquLBcIixcblxuICAgIHRleHQ6IFwi7YWN7Iqk7Yq4XCIsXG4gICAgbWluVmFsdWU6IFwi7LWc7IaM6rCSXCIsXG4gICAgbWF4VmFsdWU6IFwi7LWc64yA6rCSXCIsXG4gICAgbWluTGVuZ3RoOiBcIuy1nOyGjCDquLjsnbRcIixcbiAgICBtYXhMZW5ndGg6IFwi7LWc64yAIOq4uOydtFwiLFxuICAgIGFsbG93RGlnaXRzOiBcIuyIq+yekCDtl4jsmqlcIixcbiAgICBtaW5Db3VudDogXCLstZzshowg6rCc7IiYXCIsXG4gICAgbWF4Q291bnQ6IFwi7LWc64yAIOqwnOyImFwiLFxuICAgIHJlZ2V4OiBcIuygleq3nCDtkZztmITsi51cIlxuICB9XG59O1xuZWRpdG9yTG9jYWxpemF0aW9uLmxvY2FsZXNbXCJrb1wiXSA9IGtvcmVhblN0cmluZ3M7XG4iLCIvL1VuY29tbWVudCB0aGlzIGxpbmUgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlXG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24sIGRlZmF1bHRTdHJpbmdzIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuXG5leHBvcnQgdmFyIG5iU3RyaW5ncyA9IHtcbiAgLy9zdXJ2ZXkgdGVtcGxhdGVzXG4gIHN1cnZleToge1xuICAgIGVkaXQ6IFwiUmVkaWdlclwiLFxuICAgIGV4dGVybmFsSGVscExpbms6IFwiU2Ugb2cgbMOmciBodm9yZGFuIMOlIG9wcHJldHRlIG55ZSBza2plbWFcIixcbiAgICBleHRlcm5hbEhlbHBMaW5rVXJsOlxuICAgICAgXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDSDJydTlva0ljb29OWmZwSWJ5cTRxUT92aWV3X2FzPXN1YnNjcmliZXJcIixcbiAgICBkcm9wUXVlc3Rpb246IFwiRHJhIG9nIHNsaXBwIGV0IHNww7hyc23DpWwgaGVyIGZyYSBWZXJrdMO4eWxpc3RlbiB0aWwgdmVuc3RyZS5cIixcbiAgICBhZGRMb2dpY0l0ZW06IFwiT3BwcmV0dCBlbiByZWdlbCBmb3Igw6Ugc2tyZWRkZXJzeSBza2plbWFmbHl0ZW5cIixcbiAgICBjb3B5OiBcIktvcGllclwiLFxuICAgIGFkZFRvVG9vbGJveDogXCJMZWdnIHRpbCB2ZXJrdMO4eWxpc3RlblwiLFxuICAgIGRlbGV0ZVBhbmVsOiBcIlNsZXR0IHBhbmVsXCIsXG4gICAgZGVsZXRlUXVlc3Rpb246IFwiU2xldHQgc3DDuHJzbcOlbFwiLFxuICAgIGNvbnZlcnRUbzogXCJLb252ZXJ0ZXIgdGlsXCIsXG4gICAgZHJhZzogXCJEcmEgZWxlbWVudFwiLFxuICB9LFxuICAvL3F1ZXN0aW9uVHlwZXNcbiAgcXQ6IHtcbiAgICBkZWZhdWx0OiBcIlN0YW5kYXJkXCIsXG4gICAgY2hlY2tib3g6IFwiU2pla2tib2tzXCIsXG4gICAgY29tbWVudDogXCJLb21tZW50YXJcIixcbiAgICBpbWFnZXBpY2tlcjogXCJCaWxkZXZlbGdlclwiLFxuICAgIGltYWdlOiBcIkJpbGRlXCIsXG4gICAgZHJvcGRvd246IFwiTmVkdHJla2tzbGlzdGVcIixcbiAgICBmaWxlOiBcIkZpbFwiLFxuICAgIGh0bWw6IFwiSHRtbFwiLFxuICAgIG1hdHJpeDogXCJNYXRyaXNlIChlbmtlbHZhbGcpXCIsXG4gICAgbWF0cml4ZHJvcGRvd246IFwiTWF0cmlzZSAoZmxlcnZhbGcpXCIsXG4gICAgbWF0cml4ZHluYW1pYzogXCJNYXRyaXNlIChkeW5hbWlza2UgcmFkZXIpXCIsXG4gICAgbXVsdGlwbGV0ZXh0OiBcIkZsZXJsaW5qZXRla3N0XCIsXG4gICAgcGFuZWw6IFwiUGFuZWxcIixcbiAgICBwYW5lbGR5bmFtaWM6IFwiUGFuZWwgKGR5bmFtaXNrZSBwYW5lbGVyKVwiLFxuICAgIHJhZGlvZ3JvdXA6IFwiUmFkaW9ncnVwcGVcIixcbiAgICByYXRpbmc6IFwiUmFuZ2VyaW5nXCIsXG4gICAgdGV4dDogXCJFbmtlbCB0ZWtzdFwiLFxuICAgIGJvb2xlYW46IFwiQm9vbGVhblwiLFxuICAgIGV4cHJlc3Npb246IFwiRm9ybWVsXCIsXG4gICAgc2lnbmF0dXJlcGFkOiBcIlNpZ25hdHVyXCIsXG4gICAgZmxvd3BhbmVsOiBcIkZseXRwYW5lbFwiLFxuICB9LFxuICAvL1N0cmluZ3MgaW4gRWRpdG9yXG4gIGVkOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJTdGFuZGFyZCAoezB9KVwiLFxuICAgIHN1cnZleTogXCJTa2plbWFcIixcbiAgICBzZXR0aW5nczogXCJTa2plbWFpbm5zdGlsbGluZ2VyXCIsXG4gICAgc2V0dGluZ3NUb29sdGlwOiBcIsOFcG5lIHNramVtYWlubnN0aWxsaW5nZXJcIixcbiAgICAvL29wamVjdFByb3BlcnRpZXNIZWFkZXI6IFwiQWR2YW5jZWRcIixcbiAgICAvL3Nob3dPYmplY3RQcm9wZXJ0aWVzOiBcIlNob3cgT2JqZWN0IFByb3BlcnRpZXNcIixcbiAgICAvL2hpZGVPYmplY3RQcm9wZXJ0aWVzOiBcIkhpZGUgT2JqZWN0IFByb3BlcnRpZXNcIixcbiAgICBzaG93UGFuZWw6IFwiVmlzIHBhbmVsXCIsXG4gICAgaGlkZVBhbmVsOiBcIlNranVsIHBhbmVsXCIsXG4gICAgLy8gZWRpdFN1cnZleTogXCJSZWRpZ2VyIHNramVtYVwiLFxuICAgIGFkZE5ld1BhZ2U6IFwiTGVnZyB0aWwgbnkgc2lkZVwiLFxuICAgIG1vdmVSaWdodDogXCJCbGEgdGlsIGjDuHlyZVwiLFxuICAgIG1vdmVMZWZ0OiBcIkJsYSB0aWwgdmVuc3RyZVwiLFxuICAgIGRlbGV0ZVBhZ2U6IFwiU2xldHQgc2lkZVwiLFxuICAgIGVkaXRQYWdlOiBcIlJlZGlnZXIgc2lkZVwiLFxuICAgIGVkaXQ6IFwiUmVkaWdlclwiLFxuICAgIG5ld1BhZ2VOYW1lOiBcInNpZGVcIixcbiAgICBuZXdRdWVzdGlvbk5hbWU6IFwic3DDuHJzbcOlbFwiLFxuICAgIG5ld1BhbmVsTmFtZTogXCJwYW5lbFwiLFxuICAgIG5ld1RleHRJdGVtTmFtZTogXCJ0ZWtzdFwiLFxuICAgIHRlc3RTdXJ2ZXk6IFwiVGVzdCBza2plbWFcIixcbiAgICB0ZXN0U3VydmV5QWdhaW46IFwiVGVzdCBza2plbWEgaWdqZW5cIixcbiAgICB0ZXN0U3VydmV5V2lkdGg6IFwiU2tqZW1hYnJlZGRlOiBcIixcbiAgICBuYXZpZ2F0ZVRvTXNnOiBcIkR1IG3DpXR0ZSBuYXZpZ2VyZSB0aWw6XCIsXG4gICAgbG9naWM6IFwiU2tqZW1hbG9naWtrXCIsXG4gICAgZW1iZWRTdXJ2ZXk6IFwiSW50ZWdyZXIgc2tqZW1hXCIsXG4gICAgdHJhbnNsYXRpb246IFwiT3ZlcnNldHRlbHNlXCIsXG4gICAgc2F2ZVN1cnZleTogXCJMYWdyZSBza2plbWFcIixcbiAgICBzYXZlU3VydmV5VG9vbHRpcDogXCJMYWdyZSBza2plbWFcIixcbiAgICBkZXNpZ25lcjogXCJTa2plbWFkZXNpZ25lclwiLFxuICAgIGpzb25FZGl0b3I6IFwiSlNPTi1yZWRpZ2VyaW5nXCIsXG4gICAgdW5kbzogXCJBbmdyZVwiLFxuICAgIHJlZG86IFwiR2plbnRhXCIsXG4gICAgdW5kb1Rvb2x0aXA6IFwiQW5ncmUgc2lzdGUgZW5kcmluZ1wiLFxuICAgIHJlZG9Ub29sdGlwOiBcIkdqw7hyIG9tIHNpc3RlIGVuZHJpbmdcIixcbiAgICBjb3B5OiBcIktvcGllclwiLFxuICAgIGN1dDogXCJLdXR0XCIsXG4gICAgcGFzdGU6IFwiTGltIGlubm5cIixcbiAgICBjb3B5VG9vbHRpcDogXCJLb3BpZXIgdmFsZ3Qgc2Vrc2pvbiBpbm4gaSB1dGtsaXBwc3RhdmxhXCIsXG4gICAgY3V0VG9vbHRpcDogXCJLdXR0IHZhbGd0IHNla3Nqb24gaW5uIGkgdXRrbGlwcHN0YXZsYVwiLFxuICAgIHBhc3RlVG9vbHRpcDogXCJMaW0gaW5uIGZyYSB1dGtsaXBwc3RhdmxhXCIsXG4gICAgb3B0aW9uczogXCJBbHRlcm5hdGl2ZXJcIixcbiAgICBnZW5lcmF0ZVZhbGlkSlNPTjogXCJMYWcgZ3lsZGlnIEpTT05cIixcbiAgICBnZW5lcmF0ZVJlYWRhYmxlSlNPTjogXCJMYWcgbGVzYmFyIEpTT05cIixcbiAgICB0b29sYm94OiBcIlZlcmt0w7h5bGlzdGVcIixcbiAgICBcInByb3BlcnR5LWdyaWRcIjogXCJJbm5zdGlsbGluZ2VyXCIsXG4gICAgdG9vbGJveEdlbmVyYWxDYXRlZ29yeTogXCJHZW5lcmVsdFwiLFxuICAgIC8vIGRlbFNlbE9iamVjdDogXCJTbGV0dCB2YWxndGUgZWxlbWVudGVyXCIsXG4gICAgLy8gZWRpdFNlbE9iamVjdDogXCJSZWRpZ2VyIHZhbGd0ZSBlbGVtZW50ZXJcIixcbiAgICBjb3JyZWN0SlNPTjogXCJWZW5ubGlnc3Qga29ycmlnZXIgSlNPTi5cIixcbiAgICBzdXJ2ZXlSZXN1bHRzOiBcIlNramVtYXJlc3VsdGF0OiBcIixcbiAgICBzdXJ2ZXlSZXN1bHRzVGFibGU6IFwiU29tIHRhYmVsbFwiLFxuICAgIHN1cnZleVJlc3VsdHNKc29uOiBcIlNvbSBKU09OXCIsXG4gICAgcmVzdWx0c1RpdGxlOiBcIlNww7hyc23DpWxzdGl0dGVsXCIsXG4gICAgcmVzdWx0c05hbWU6IFwiU3DDuHJzbcOlbHNuYXZuXCIsXG4gICAgcmVzdWx0c1ZhbHVlOiBcIlN2YXJcIixcbiAgICByZXN1bHRzRGlzcGxheVZhbHVlOiBcIlZpc3QgdmVyZGlcIixcbiAgICBtb2RpZmllZDogXCJFbmRyZXRcIixcbiAgICBzYXZpbmc6IFwiTGFncmVyXCIsXG4gICAgc2F2ZWQ6IFwiTGFncmV0XCIsXG4gICAgcHJvcGVydHlFZGl0b3JFcnJvcjogXCJGZWlsOlwiLFxuICAgIHNhdmVFcnJvcjogXCJGZWlsISBTa2plbWEgaW5uaG9sZCBlciBpa2tlIGxhZ3JldC5cIixcbiAgICB0cmFuc2xhdGlvbkFkZExhbmd1YWdlOiBcIlZlbGcgc3Byw6VrIGZvciBvdmVyc2V0dGluZ1wiLFxuICAgIHRyYW5zbGF0aW9uU2hvd0FsbFN0cmluZ3M6IFwiVmlzIGFsbGUgc3RyZW5nZXJcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxQYWdlczogXCJWaXMgYWxsZSBzaWRlclwiLFxuICAgIHRyYW5zbGF0aW9uTm9TdHJpbmdzOlxuICAgICAgXCJJbmdlbiBzdHJlbmdlciDDpSBvdmVyc2V0dGUuIFZlbm5saWdzdCBlbmRyZSBmaWx0ZXJldC5cIixcbiAgICB0cmFuc2xhdGlvbkV4cG9ydFRvU0NWQnV0dG9uOiBcIkVrc3BvcnRlciB0aWwgQ1NWXCIsXG4gICAgdHJhbnNsYXRpb25JbXBvcnRGcm9tU0NWQnV0dG9uOiBcIkltcG9ydGVyIGZyYSBDU1ZcIixcbiAgICB0cmFuc2xhdGlvbk1lcmdlTG9jYWxlV2l0aERlZmF1bHQ6IFwiRmxldHQgezB9IG1lZCBzdGFuZGFyZCBzcHLDpWtcIixcbiAgICBib2xkOiBcIkZldFwiLFxuICAgIGl0YWxpYzogXCJLdXJzaXZcIixcbiAgICB1bmRlcmxpbmU6IFwiVW5kZXJsaW5qZXRcIixcbiAgICBmcEFkZFF1ZXN0aW9uOiBcIkxlZ2cgdGlsIHNww7hyc23DpWwuLi5cIixcbiAgICBzZWxlY3RQYWdlOiBcIlZlbGcgc2lkZS4uLlwiLFxuICAgIGNob29zZUVsZW1lbnQ6IFwiVmVsZyBlbGVtZW50Li4uXCIsXG4gICAgLy9jb21wbGV0ZWRIdG1sT25Db25kaXRpb25JdGVtVGV4dDogXCJTaG93IGlmOlwiLFxuICAgIGxnOiB7XG4gICAgICBhZGROZXdJdGVtOiBcIlwiLCAvL1ZlcmRpZW4gZXIgc29tIHN0YW5kYXJkIGhlbnRldCBmcmEgcGUuYWRkTmV3ICdBZGQgTmV3JywgZHUga2FuIGZvciBla3NlbXBlbCBzZXR0ZSBkZW4gdGlsICAnTGVnZyB0aWwgbnkgcmVnZWwnICAuXG4gICAgICAvL0xvZ2ljIHRhYiBzdHJpbmdzXG4gICAgICBwYWdlX3Zpc2liaWxpdHlOYW1lOiBcIlNpZGVzeW5saWdoZXRcIixcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlOYW1lOiBcIlBhbmVsc3lubGlnaGV0XCIsXG4gICAgICBwYW5lbF9lbmFibGVOYW1lOiBcIlBhbmVsIGFrdGl2ZXJlL2RlYWt0aXZlcmVcIixcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlOYW1lOiBcIlNww7hyc23DpWxzc3lubGdoZXRcIixcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZU5hbWU6IFwiU3DDuHJzbcOlbCBha3RpdmVyZS9kZWFrdGl2ZXJlXCIsXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlTmFtZTogXCJTcMO4cnNtw6VsIHZhbGdmcml0dC9ww6VrcmV2ZFwiLFxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZU5hbWU6IFwiRnVsbGbDuHIgc2tqZW1hXCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlTmFtZTogXCJBbmdpIHNww7hyc23DpWxzbmF2blwiLFxuICAgICAgdHJpZ2dlcl9jb3B5dmFsdWVOYW1lOiBcIktvcGllciBzcMO4cnNtw6Vsc3ZlcmRpXCIsXG4gICAgICB0cmlnZ2VyX3NraXBOYW1lOiBcIkhvcHAgdGlsIHNww7hyc23DpWxcIixcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvbk5hbWU6IFwiS2rDuHIgdGlscGFzc2V0IGZvcm1lbFwiLFxuICAgICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uTmFtZTogXCJUaWxwYXNzZXQgJ1Rha2stc2lkZScgdGVrc3RcIixcblxuICAgICAgcGFnZV92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiR2rDuHIgc2lkZW4gc3lubGlnIG7DpXIgZm9ybWVsZW4gZXZhbHVlcmVzIHRpbCAnc2FubicsIG9nIGhvbGRlciBkZW4gZWxsZXJzIHVzeW5saWcuXCIsXG4gICAgICBwYW5lbF92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiR2rDuHIgcGFuZWxldCBzeW5saWcgbsOlciBmb3JtZWxlbiBldmFsdWVyZXMgdGlsICdzYW5uJywgb2cgaG9sZGVyIGRlbiBlbGxlcnMgdXN5bmxpZy5cIixcbiAgICAgIHBhbmVsX2VuYWJsZURlc2NyaXB0aW9uOlxuICAgICAgICBcIkFrdGl2ZXJlciBwYW5lbGV0LCBvZyBhbGxlIGVsZW1lbnRlciBpbm5pLCBuw6VyIGZvcm1lbGVuIGV2YWx1ZXJlcyB0aWwgJ3Nhbm4nLiBJIGFuZHJlIHRpbGZlbGxlciBob2xkZXMgZGUgZGVha3RpdmVydC5cIixcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJHasO4ciBzcMO4cnNtw6VsZXQgc3lubGlnIG7DpXIgZm9ybWVsZW4gZXZhbHVlcmVzIHRpbCAnc2FubicsIG9nIGhvbGRlciBkZW4gZWxsZXJzIHVzeW5saWcuXCIsXG4gICAgICBxdWVzdGlvbl9lbmFibGVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJBa3RpdmVyZXIgc3DDuHJzbcOlbGV0IG7DpXIgZm9ybWVsZW4gZXZhbHVlcmVzIHRpbCAnc2FubicsIG9nIGhvbGRlciBkZW4gZWxsZXJzIGRlYWt0aXZlcnQuXCIsXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlRGVzY3JpcHRpb246XG4gICAgICAgIFwiU3DDuHJtc8OlbGV0IGJsaXIgcMOla3JldmQgbsOlciBmb3JtZWxlbiBldmFsdWVyZXMgdGlsICdzYW5uJy5cIixcbiAgICAgIHRyaWdnZXJfY29tcGxldGVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJOw6VyIGZvcm1lbGVuIGV2YWx1ZXJlcyB0aWwgJ3Nhbm4nIGZ1bGxmw7hyZXMgc2tqZW1hZXQgb2cgc2x1dHRicnVrZXJlbiBzZXIgJ1Rha2stc2lkZW4nLlwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIk7DpXIgc3DDuHJzbcOlbHN2ZXJkaWVyIHNvbSBlciBicnVrdCBpIGZvcm1lbGVuIGVuZHJlcywgb2cgZm9ybWVsZW4gZXZhbHVlcmVzIHNvbSAnc2FubicsIHZpbCB2ZXJkaWVuIHNldHRlcyBpIGRldCB2YWxndGUgc3DDuHJzbcOlbGV0LlwiLFxuICAgICAgdHJpZ2dlcl9jb3B5dmFsdWVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJOw6VyIHNww7hyc23DpWxzdmVyZGllciBzb20gZXIgYnJ1a3QgaSBmb3JtZWxlbiBlbmRyZXMsIG9nIGZvcm1lbGVuIGV2YWx1ZXJlcyBzb20gJ3Nhbm4nLCB2aWwgdmVyZGllbiBpIGV0IHZhbGd0IHNww7hyc23DpWwga29waWVyZXMgdGlsIGV0IGFubmV0IHZhbGd0IHNww7hyc23DpWwuXCIsXG4gICAgICB0cmlnZ2VyX3NraXBEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJOw6VyIGZvcm1lbGVuIGV2YWx1ZXJlcyB0aWwgJ3Nhbm4nIHZpbCBza2plbWFldCBob3BwZSB0aWwvZm9rdXNlcmUgcMOlIHZhbGd0IHNww7hyc23DpWwuXCIsXG4gICAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25EZXNjcmlwdGlvbjpcbiAgICAgICAgXCJOw6VyIGZvcm1lbGVuIGV2YXVsZXJlcyB0aWwgJ3Nhbm4nIHZpbCBkZW4gdGlscGFzc2VkZSBmb3JtZWxlbiB1dGbDuHJlcy4gRHUga2FuIHZhbGdmcml0dCBzZXR0ZSBmb3JtZWxlbnMgcmVzdWx0YXQgaW5uIGkgZGV0IHZhbGd0ZSBzcMO4cnNtw6VsZXQuXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25EZXNjcmlwdGlvbjpcbiAgICAgICAgXCJIdmlzIGZvcm1lbGVuIGV2YWx1ZXJlcyB0aWwgJ3Nhbm4nIHZpbCBzdGFuZGFyZHRla3N0ZW4gcMOlICdUYWtrIHNpZGVuJyBlbmRyZXMgdGlsIGRlbiBnaXR0ZSB0ZWtzdGVuLlwiLFxuXG4gICAgICBpdGVtRXhwcmVzc2lvblRleHQ6IFwiTsOlciBmb3JtZWxlbjogJ3swfScgZXZhbHVlcmVzIHRpbCAnc2Fubic6XCIsIC8vezB9IC0gdmlsIHV0dHJ5a2tldFxuICAgICAgcGFnZV92aXNpYmlsaXR5VGV4dDogXCJHasO4cmUgc2lkZSB7MH0gc3lubGlnXCIsIC8vezB9IHNpZGVuYXZuXG4gICAgICBwYW5lbF92aXNpYmlsaXR5VGV4dDogXCJHasO4ciBwYW5lbCB7MH0gc3lubGlnXCIsIC8vezB9IHBhbmVsbmF2blxuICAgICAgcGFuZWxfZW5hYmxlVGV4dDogXCJHasO4ciBwYW5lbCB7MH0gYWt0aXZlcnRcIiwgLy97MH0gcGFuZWxuYXZuXG4gICAgICBxdWVzdGlvbl92aXNpYmlsaXR5VGV4dDogXCJHasO4ciBzcMO4cnNtw6VsIHswfSBzeW5saWdcIiwgLy97MH0gc3DDuHJzbcOlbHNuYXZuXG4gICAgICBxdWVzdGlvbl9lbmFibGVUZXh0OiBcIkdqw7hyIHNww7hyc23DpWwgezB9IGFrdGl2ZXJ0XCIsIC8vezB9IHNww7hyc23DpWxzbmF2blxuICAgICAgcXVlc3Rpb25fcmVxdWlyZVRleHQ6IFwiR2rDuHIgc3DDuHJzbcOlbCB7MH0gcMOla3JldmRcIiwgLy97MH0gc3DDuHJzbcOlbHNuYXZuXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlVGV4dDogXCJTa2plbWFldCBibGlyIGZ1bGxmw7hydFwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZVRleHQ6IFwiU2V0dCBpbm46IHswfSB2ZXJkaSB7MX1cIiwgLy97MH0gc3DDuHJzbcOlbHNuYXZuLCB7MX0gc2V0dFZlcmRpXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZVRleHQ6IFwiS29waWVyIGlubjogezB9IHZlcmRpIGZyYSBzcMO4cnNtw6VsIHsxfVwiLCAvL3swfSBvZyB7MX0gc3DDuHJzbcOlbHNuYXZuXG4gICAgICB0cmlnZ2VyX3NraXBUZXh0OiBcIkhvcHAgdGlsIHNww7hyc23DpWwgezB9XCIsIC8vezB9IHNww7hyc23DpWxzbmF2blxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDE6IFwiS2rDuHIgZm9ybWVsOiAnezB9J1wiLCAvL3swfSB1dHRyeWtldFxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDI6IFwiIG9nIHNldHQgaW5uIHJlc3VsdGF0ZXQgaSBzcMO4cnNtw6VsOiB7MH1cIiwgLy97MH0gc3DDuHJzbcOlbHNuYXZuXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25UZXh0OiBcIlZpcyB0aWxwYXNzZXQgdGVrc3QgZm9yICdUYWtrLXNpZGVuJy5cIixcblxuICAgICAgY29uZGl0aW9uczogXCJWaWxrw6VyXCIsXG4gICAgICBhY3Rpb25zOiBcIkhhbmRsaW5nKGVyKVwiLFxuICAgICAgZXhwcmVzc2lvbkVkaXRvclRpdGxlOiBcIkRlZmluZXIgdmlsa8OlclwiLFxuICAgICAgYWN0aW9uc0VkaXRvclRpdGxlOiBcIkRlZmluZXIgaGFuZGxpbmcoZXIpXCIsXG5cbiAgICAgIGRlbGV0ZUFjdGlvbjogXCJTbGV0dCBoYW5kbGluZ1wiLFxuICAgICAgYWRkTmV3QWN0aW9uOiBcIkxlZ2cgdGlsIGhhbmRsaW5nXCIsXG4gICAgICBzZWxlY3RlZEFjdGlvbkNhcHRpb246IFwiVmVsZyBoYW5kbGluZyBzb20gc2thbCBsZWdnZXMgdGlsLi4uXCIsXG5cbiAgICAgIGV4cHJlc3Npb25JbnZhbGlkOlxuICAgICAgICBcIkZvcm1lbGVuIGVyIHRvbSBlbGxlciB1Z3lsZGlnLiBWZW5ubGlnc3Qga29ycmlnZXIgZGVuLlwiLFxuICAgICAgbm9BY3Rpb25FcnJvcjogXCJWZW5ubGlnc3QgbGVnZyB0aWwgbWluc3QgZW4gaGFuZGxpbmdcIixcbiAgICAgIGFjdGlvbkludmFsaWQ6IFwiVmVubmxpZ3N0IGtvcnJpZ2VyIHByb2JsZW1lciBtZWQgaGFuZGxpbmdlbi5cIixcbiAgICAgIGV4cHJlc3Npb25TZXR1cDogXCJcIixcbiAgICAgIGFjdGlvbnNTZXR1cDogXCJcIixcbiAgICB9LFxuICB9LFxuICAvL1Byb3BlcnR5IG5hbWVzIGluIHRhYmxlIGhlYWRlcnNcbiAgLy8gcGVsOiB7XG4gIC8vICAgaXNSZXF1aXJlZDogXCJOw7hkdmVuZGlnP1wiLFxuICAvLyB9LFxuICAvL1Byb3BlcnR5IEVkaXRvcnNcbiAgcGU6IHtcbiAgICBhcHBseTogXCJCcnVrXCIsXG4gICAgb2s6IFwiT0tcIixcbiAgICBzYXZlOiBcIkxhZ3JlXCIsXG4gICAgc2F2ZVRvb2x0aXA6IFwiTGFncmVcIixcbiAgICBjYW5jZWw6IFwiQXZicnl0XCIsXG4gICAgcmVzZXQ6IFwiVGlsYmFrZXN0aWxsXCIsXG4gICAgcmVmcmVzaDogXCJMYXN0IGlubiBww6Ugbnl0dFwiLFxuICAgIC8vIGNsb3NlOiBcIkx1a2tcIixcbiAgICBkZWxldGU6IFwiU2xldHRcIixcbiAgICBhZGQ6IFwiTGVnZyB0aWxcIixcbiAgICBhZGROZXc6IFwiTGVnZyB0aWwgbnlcIixcbiAgICBhZGRJdGVtOiBcIktsaWtrIGZvciDDpSBsZWdnZSB0aWwuLi5cIixcbiAgICBhZGRPdGhlcjogXCJBbm5ldFwiLFxuICAgIGFkZFNlbGVjdEFsbDogXCJWZWxnIGFsdFwiLFxuICAgIGFkZE5vbmU6IFwiSW5nZW5cIixcbiAgICByZW1vdmVBbGw6IFwiRmplcm4gYWx0XCIsXG4gICAgZWRpdDogXCJSZWRpZ2VyXCIsXG4gICAgYmFjazogXCJHw6UgdGlsYmFrZSB1dGVuIMOlIGxhZ3JlXCIsXG4gICAgYmFja1Rvb2x0aXA6IFwiR8OlIHRpbGJha2UgdXRlbiDDpSBsYWdyZVwiLFxuICAgIHNhdmVBbmRCYWNrOiBcIkxhZ3JlIG9nIGfDpSB0aWxiYWtlXCIsXG4gICAgc2F2ZUFuZEJhY2tUb29sdGlwOiBcIkxhZ3JlIG9nIGfDpSB0aWxiYWtlXCIsXG4gICAgLy8gaXRlbVZhbHVlRWRpdDogXCJTeW5saWcgaHZpc1wiLFxuICAgIGVkaXRDaG9pY2VzOiBcIlJlZGlnZXIgdmFsZ1wiLFxuICAgIHNob3dDaG9pY2VzOiBcIlZpcyB2YWxnXCIsXG4gICAgbW92ZTogXCJGbHl0dFwiLFxuICAgIGVtcHR5OiBcIjx0b20+XCIsXG4gICAgLy8gbm90RW1wdHk6IFwiPHJlZGlnZXIgdmVyZGk+XCIsXG4gICAgZmFzdEVudHJ5OiBcIlJhc2sgaW5uZnlsbGluZ1wiLFxuICAgIGZvcm1FbnRyeTogXCJJbm5meWxsaW5nIGkgc2tqZW1hXCIsXG4gICAgdGVzdFNlcnZpY2U6IFwiU2pla2sgdGplbmVzdGVuXCIsXG4gICAgaXRlbVNlbGVjdG9yRW1wdHk6IFwiVmVubmxpZ3N0IHZlbGcgZWxlbWVudGV0XCIsXG4gICAgY29uZGl0aW9uQWN0aW9uRW1wdHk6IFwiVmVsZyBoYW5kbGluZ2VuXCIsXG4gICAgY29uZGl0aW9uU2VsZWN0UXVlc3Rpb246IFwiVmVsZyBzcMO4cnNtw6VsLi4uXCIsXG4gICAgY29uZGl0aW9uU2VsZWN0UGFnZTogXCJWZWxnIHNpZGUuLi5cIixcbiAgICBjb25kaXRpb25TZWxlY3RQYW5lbDogXCJWZWxnIHBhbmVsLi4uXCIsXG4gICAgY29uZGl0aW9uVmFsdWVRdWVzdGlvblRpdGxlOiBcIlZlbm5saWdzdCBza3JpdiBpbm4vdmVsZyB2ZXJkaVwiLFxuICAgIC8vIGNvbmRpdGlvbkhlbHA6IFwiU2tyaXYgaW5uIGVuIGJvb2xzayBmb3JtZWwuIERldCBidXJkZSByZXR1cm5lcmUgU0FOTiBmb3Igw6UgZ2rDuHJlIHNww7hyc23DpWwvc2lkZSBzeW5saWcuIEZvciBla3NlbXBlbDoge3F1ZXN0aW9uMX0gPSAndmFsdWUxJyBvciAoe3F1ZXN0aW9uMn0gKiB7cXVlc3Rpb240fSAgPiAyMCBhbmQge3F1ZXN0aW9uM30gPCA1KVwiLFxuICAgIGV4cHJlc3Npb25IZWxwOlxuICAgICAgXCJWZW5ubGlnc3Qgc2tyaXYgaW5uIGVuIGZvcm1lbC4gRHUga2FuIGJydWtlIGtsYW1tZXBhcmVudGVzZXIgZm9yIMOlIGbDpSB0aWxnYW5nIHRpbCBzcMO4cnNtw6Vsc3ZlcmRpZW5lOiAne3F1ZXN0aW9uMX0gKyB7cXVlc3Rpb24yfScsICcoe3ByaWNlfSp7cXVhbnRpdHl9KSAqICgxMDAgLSB7ZGlzY291bnR9KSdcIixcbiAgICBhY2VFZGl0b3JIZWxwOiBcIlRyeWtrIGN0cmwrbWVsbG9tcm9tIGZvciDDpSBmw6UgaGludCB0aWwgw6UgZnVsbGbDuHJlIGZvcm1sZXJcIixcbiAgICBhY2VFZGl0b3JSb3dUaXRsZTogXCJHamVsZGVuZGUgcmFkXCIsXG4gICAgYWNlRWRpdG9yUGFuZWxUaXRsZTogXCJHamVsZGVuZGUgcGFuZWxcIixcbiAgICBzaG93TW9yZTogXCJGb3IgbWVyIGRldGFsamVyIC0gc2UgZG9rdW1lbnRhc2pvbmVuXCIsXG4gICAgLy8gY29uZGl0aW9uU2hvd01vcmVVcmw6IFwiaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnlQYXJhbWV0ZXI/aWQ9UXVlc3Rpb24mcGFyYW1ldGVyPXZpc2libGVJZlwiLFxuICAgIGFzc2lzdGFudFRpdGxlOiBcIlRpbGdqZW5nZWxpZ2Ugc3DDuHJzbcOlbDpcIixcbiAgICBjZWxsc0VtcHR5Um93c0NvbHVtbnM6IFwiRGV0IG3DpSB2w6ZyZSBtaW5zdCAxIGtvbG9ubmUgZWxsZXIgcmFkXCIsXG5cbiAgICBwcm9wZXJ0eUlzRW1wdHk6IFwiVmVubmxpZ3N0IGZ5bGwgaW5uIGVuIHZlcmRpXCIsXG4gICAgcHJvcGVydHlOYW1lSXNOb3RVbmlxdWU6IFwiVmVubmxpZ3N0IGZ5bGwgaW5uIGV0IHVuaWt0IG5hdm5cIixcbiAgICBsaXN0SXNFbXB0eTogXCJMZWdnIHRpbCBueXR0IGVsZW1lbnRcIixcbiAgICBleHByZXNzaW9uSXNFbXB0eTogXCJGb3JtZWxlbiBlciB0b21cIixcbiAgICB2YWx1ZTogXCJWZXJkaVwiLFxuICAgIHRleHQ6IFwiVGVrc3RcIixcbiAgICByb3dpZDogXCJSYWQtSURcIixcbiAgICBpbWFnZUxpbms6IFwiQmlsZGVsZW5rZVwiLFxuICAgIGNvbHVtbkVkaXQ6IFwiUmVkaWdlciBrb2xvbm5lOiB7MH1cIixcbiAgICBpdGVtRWRpdDogXCJSZWRpZ2VyIGVsZW1lbnQ6IHswfVwiLFxuXG4gICAgdXJsOiBcIlVSTFwiLFxuICAgIHBhdGg6IFwiU3RpXCIsXG4gICAgdmFsdWVOYW1lOiBcIlZlcmRpbmF2blwiLFxuICAgIHRpdGxlTmFtZTogXCJUaXR0ZWxuYXZuXCIsXG4gICAgdGl0bGVQbGFjZWhvbGRlcjogXCJTa3JpdiB0aXR0ZWwgaGVyXCIsXG4gICAgc3VydmV5VGl0bGVQbGFjZWhvbGRlcjogXCJTa3JpdiBza2plbWF0aXR0ZWwgaGVyXCIsXG4gICAgcGFnZVRpdGxlUGxhY2Vob2xkZXI6IFwiU2tyaXYgc2lkZXRpdHRlbCBoZXJcIixcbiAgICBkZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcIlNrcml2IGJlc2tyaXZlbHNlXCIsXG4gICAgc3VydmV5RGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCJTa3JpdiBza2plbWEtYmVza3JpdmVsc2VcIixcbiAgICBwYWdlRGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCJTa3JpdiBzaWRlLWJlc2tyaXZlbHNlXCIsXG5cbiAgICBoYXNPdGhlcjogXCJIYXIgYW5uZXQgZWxlbWVudFwiLFxuICAgIG90aGVyVGV4dDogXCJBbm5ldCBlbGVtZW50LXRla3N0XCIsXG4gICAgaGFzTm9uZTogXCJIYXIgdmVsZyBpbmdlblwiLFxuICAgIG5vbmVUZXh0OiBcIlZlbGcgaW5nZW4tdGVrc3RcIixcbiAgICBoYXNTZWxlY3RBbGw6IFwiSGFyIHZlbGcgYWx0LWVsZW1lbnRcIixcbiAgICBzZWxlY3RBbGxUZXh0OiBcIlZlbGcgYWx0IGVsZW1lbXQtdGVrc3RcIixcbiAgICBjaG9pY2VzTWluOiBcIk1pbnN0ZXZlcmRpIGZvciBhdXRvLWdlbmVyZXJ0ZSBlbGVtZW50ZXJcIixcbiAgICBjaG9pY2VzTWF4OiBcIk1ha3N2ZXJkaSBmb3IgYXV0by1nZW5lcmVydGUgZWxlbWVudGVyXCIsXG4gICAgY2hvaWNlc1N0ZXA6IFwiRm9yc2tqZWxsZW5lIG1lbGxvbSBhdXRvLWdlbmVyZXJ0ZSBlbGVtZW50ZXJcIixcbiAgICBuYW1lOiBcIk5hdm5cIixcbiAgICB0aXRsZTogXCJUaXR0ZWxcIixcbiAgICBjZWxsVHlwZTogXCJDZWxsZXR5cGVcIixcbiAgICBjb2xDb3VudDogXCJBbnRhbGwga29sb25uZXJcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwiVmVsZyByZWtrZWbDuGxnZSBww6UgdmFsZ1wiLFxuICAgIHZpc2libGU6IFwiRXIgc3lubGlnP1wiLFxuICAgIGlzUmVxdWlyZWQ6IFwiRXIgbsO4ZHZlbmRpZz9cIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcIk7DuGR2ZW5kaWcgc3ZhciBmb3IgYWxsZSByYWRlclwiLFxuICAgIHJlcXVpcmVkRXJyb3JUZXh0OiBcIk7DuGR2ZW5kaWcgZmVpbG1lbGRpbmdcIixcbiAgICBzdGFydFdpdGhOZXdMaW5lOiBcIk3DpSBzdGFydGUgbWVkIG55IGxpbmplP1wiLFxuICAgIHJvd3M6IFwiQW50YWxsIHJhZGVyXCIsXG4gICAgY29sczogXCJBbnRhbGwga29sb25uZXJcIixcbiAgICBwbGFjZUhvbGRlcjogXCJIamVscGV0ZWtzdFwiLFxuICAgIHNob3dQcmV2aWV3OiBcIkVyIGZvcmjDpW5kc3Zpc25pbmcgYXYgYmlsZGUgdmlzdD9cIixcbiAgICBzdG9yZURhdGFBc1RleHQ6IFwiTGFncmUgZmlsaW5uaG9sZCBpIEpTT04tcmVzdWx0YXQgc29tIHRla3N0XCIsXG4gICAgbWF4U2l6ZTogXCJNYWtzaW11bSBmaWxzdMO4cnJlbHNlIGkgYnl0ZXNcIixcbiAgICBpbWFnZUhlaWdodDogXCJCaWxkZWjDuHlkZVwiLFxuICAgIGltYWdlV2lkdGg6IFwiQmlsZGVicmVkZGVcIixcbiAgICByb3dDb3VudDogXCJBbnRhbGwgcmFkZXJcIixcbiAgICBjb2x1bW5MYXlvdXQ6IFwiQW50YWxsIGtvbG9ubmVyXCIsXG4gICAgYWRkUm93TG9jYXRpb246IFwiTGVnZyB0aWwgcmFkIGtuYXBwLXBsYXNzZXJpbmdcIixcbiAgICBhZGRSb3dUZXh0OiBcIkxlZ2cgdGlsIHJhZCBrbmFwcC10ZWtzdFwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwiRmplcm4gcmFkIGtuYXBwLXRla3N0XCIsXG4gICAgcmF0ZU1pbjogXCJNaW5pbXVtIHNhdHNcIixcbiAgICByYXRlTWF4OiBcIk1ha3NpbXVtIHNhdHNcIixcbiAgICByYXRlU3RlcDogXCJTYXRzIHN0ZWdcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwiQmVza3JpdmVsc2UgbWluaW11bXN2dWRlcmluZ1wiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCJCZXNrcml2ZWxzZSBtYWtzaW11bXN2dXJkZXJpbmdcIixcbiAgICBpbnB1dFR5cGU6IFwiSW5uZGF0YS10eXBlXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiVGVrc3QgZm9yIGFsdGVybmF0aXZlclwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJTdGFuZGFyZHZlcmRpXCIsXG4gICAgY2VsbHNEZWZhdWx0Um93OiBcIlN0YW5kYXJkIGNlbGxldGVrc3RlclwiLFxuXG4gICAgc3VydmV5RWRpdG9yVGl0bGU6IFwiUmVkaWdlciBza2plbWFpbm5zdGlsbGluZ2VyXCIsXG4gICAgcUVkaXRvclRpdGxlOiBcIlJlZGlnZXI6IHswfVwiLFxuXG4gICAgbWF4TGVuZ3RoOiBcIk1ha3NpbXVtIGxlbmdkZVwiLFxuXG4gICAgYnVpbGRFeHByZXNzaW9uOiBcIkJ5Z2dcIixcbiAgICBlZGl0RXhwcmVzc2lvbjogXCJSZWRpZ2VyXCIsXG4gICAgYW5kOiBcIk9nXCIsXG4gICAgb3I6IFwiRWxsZXJcIixcbiAgICByZW1vdmU6IFwiRmplcm5cIixcbiAgICBhZGRDb25kaXRpb246IFwiTGVnZyB0aWxcIixcblxuICAgIC8vc3VydmV5XG4gICAgc2hvd1RpdGxlOiBcIlZpcy9za2p1bCB0aXR0ZWxcIixcbiAgICBleHBhbmRDb2xsYXBzZVRpdGxlOiBcIlV0dmlkL2tyeW1wIHRpdHRlbFwiLFxuICAgIGxvY2FsZTogXCJTdGFuZGFyZCBzcHLDpWtcIixcbiAgICBzaW11bGF0b3I6IFwiVmVsZyBlbmhldFwiLFxuICAgIGxhbmRzY2FwZU9yaWVudGF0aW9uOiBcIkxpZ2dlbmRlXCIsXG4gICAgbW9kZTogXCJNb2R1cyAocmVkaWdlci9rdW4gbGVzYmFydClcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCJGamVybiB1c3lubGlnZSB2ZXJkaWVyXCIsXG4gICAgY29va2llTmFtZTpcbiAgICAgIFwiSW5mb3JtYXNqb25za2Fwc2VsIG5hdm4gKGZvciDDpSBoaW5kcmUgYnJ1ayBhdiBza2plbWEgdG8gZ2FuZ2VyIGxva2FsdClcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCJTZW5kIHNramVtYSByZXN1bHRhdCB2ZWQgbmVzdGUgc2lkZVwiLFxuICAgIHN0b3JlT3RoZXJzQXNDb21tZW50OiBcIkxhZ3JlICdhbmRyZScgdmVyZGllciBpIGV0IHNlcGFyYXQgZmVsdFwiLFxuICAgIHNob3dQYWdlVGl0bGVzOiBcIlZpcyBzaWRldGl0dGVsXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcIlZpcyBzaWRlbnVtbWVyXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIkZvcnJpZ2Ugc2lkZSBrbmFwcCB0ZWtzdFwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJOZXN0ZSBzaWRlIGtuYXBwIHRla3N0XCIsXG4gICAgY29tcGxldGVUZXh0OiBcIkZ1bGxmw7hyIGtuYXBwIHRla3N0XCIsXG4gICAgcHJldmlld1RleHQ6IFwiRm9yaMOlbmRzdmlzbmluZyBrbmFwcCB0ZWtzdFwiLFxuICAgIGVkaXRUZXh0OiBcIlJlZGlnZXIga25hcHAgdGVrc3RcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnQga25hcHAgdGVrc3RcIixcbiAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IFwiVmlzIG5hdmlnYXNqb25za25hcHBlciAoc3RhbmRhcmQgbmF2aWdlcmluZylcIixcbiAgICBzaG93UHJldkJ1dHRvbjogXCJWaXMgZm9ycmlnZSBrbmFwcCAoYnJ1a2VyIGthbiBnw6UgdGlsIGZvcnJpZ2Ugc2lkZSlcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwiRGVuIGbDuHJzdGUgc2lkZW4gaSBza2plbWEgZXIgc3RhcnRzaWRlLlwiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcIlZpcyBmZXJkaWdzaWRlbiBww6Ugc2x1dHRlbiAoY29tcGxldGVkSHRtbClcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOlxuICAgICAgXCJOw6VyIGVuIGhhciBzdmFydCBhbGxlIHNww7hyc23DpWwsIGfDpSB0aWwgbmVzdGUgc2lkZSBhdXRvbWF0aXNrXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIlZpcyBmcmVtZHJpZnRzbGluamVcIixcbiAgICBxdWVzdGlvblRpdGxlTG9jYXRpb246IFwiU3DDuHJzbcOlbCB0aXR0ZWwgcGxhc3NlcmluZ1wiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJTdmFyIG7DuGR2ZW5kaWcgc3ltYm9sKGVyKVwiLFxuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogXCJTcMO4cnNtw6VsIHN0YXJ0aW5kZWtzICgxLCAyIGVsbGVyICdBJywgJ2EnKVwiLFxuICAgIHNob3dRdWVzdGlvbk51bWJlcnM6IFwiVmlzIHNww7hyc23DpWxzbnVtbWVyXCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOlxuICAgICAgXCJTcMO4cnNtw6VsIHRpdHRlbCBtYWwsIHN0YW5kYXJkIGVyOiAne25vfS4ge3JlcXVpcmV9IHt0aXRsZX0nXCIsXG4gICAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBcIlNww7hyc23DpWwgZmVpbCBwbGFzc2VyaW5nXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOlxuICAgICAgXCJTZXR0IGZva3VzIHDDpSBmw7hyc3RlIHNww7hyc23DpWwgbsOlciBlbiBlbmRyZXIgc2lkZVwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcIlJla2tlZsO4bGdlIHDDpSBlbGVtZW50ZXIgcMOlIHNpZGVuXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIk1ha3MgdGlkIGZvciDDpSBnasO4cmUgZmVyZGlnIHNramVtYVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiTWFrcyB0aWQgdGlsIMOlIGdqw7hyZSBmZXJkaWcgZW4gc2lkZSBpIHNramVtYVwiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcIlZpcyB0aWR0YWtpbmdcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwiVmlzIHRpZHRha2luZy1tb2R1c1wiLFxuICAgIHJlbmRlck1vZGU6IFwiR2plbmdpdmVsc2UgbW9kdXNcIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIlRpbGxhdCDDpSBsZWdnZSB0aWwgcGFuZWxcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIlRpbGxhdCDDpSBmamVybmUgcGFuZWxcIixcbiAgICBwYW5lbEFkZFRleHQ6IFwiTGVnZyB0aWwgcGFuZWwgdGVrc3RcIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwiRmplcm4gcGFuZWwgdGVrc3RcIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwiVmlzIGFsbGUgZWxlbWVudGVyIHDDpSBlbiBzaWRlXCIsXG4gICAgaHRtbDogXCJIVE1MXCIsXG4gICAgZXhwcmVzc2lvbjogXCJGb3JtZWxcIixcblxuICAgIG1pblZhbHVlOiBcIk1pbmltdW1zdmVyZGlcIixcbiAgICBtYXhWYWx1ZTogXCJNYWtzaW1hbCB2ZXJkaVwiLFxuICAgIG1pbkxlbmd0aDogXCJNaW5pbXVtIGxlbmdkZVwiLFxuICAgIGFsbG93RGlnaXRzOiBcIlRpbGxhdCB0YWxsXCIsXG4gICAgbWluQ291bnQ6IFwiTWluaW11bSBjb3VudFwiLFxuICAgIG1heENvdW50OiBcIk1heGltdW0gY291bnRcIixcbiAgICByZWdleDogXCJSZWd1bGFyIGV4cHJlc3Npb25cIixcblxuICAgIHRvdGFsVGV4dDogXCJUb3RhbCB0ZWtzdFwiLFxuICAgIHRvdGFsVHlwZTogXCJUb3RhbCB0eXBlXCIsXG4gICAgdG90YWxFeHByZXNzaW9uOiBcIlRvdGFsIGZvcm1lbFwiLFxuICAgIHRvdGFsRGlzcGxheVN0eWxlOiBcIlRvdGFsIHZpc25pbmdzc3RpbFwiLFxuICAgIHRvdGFsQ3VycmVuY3k6IFwiVG90YWwgdmFsdXRhXCIsXG4gICAgdG90YWxGb3JtYXQ6IFwiVG90YWwgZm9ybWF0XCIsXG5cbiAgICAvLyBIZWFkZXIgIGFkb3JuZXJcbiAgICBsb2dvUG9zaXRpb246IFwiTG9nby1wb3Npc2pvblwiLFxuICAgIGFkZExvZ286IFwiTGVnZyB0aWwgbG9nby4uLlwiLFxuICAgIGNoYW5nZUxvZ286IFwiQnl0dCBsb2dvLi4uXCIsXG4gICAgbG9nb1Bvc2l0aW9uczoge1xuICAgICAgbm9uZTogXCJGamVybiBsb2dvXCIsXG4gICAgICBsZWZ0OiBcIlZlbnN0cmVcIixcbiAgICAgIHJpZ2h0OiBcIkjDuHlyZVwiLFxuICAgICAgdG9wOiBcIlRvcHBcIixcbiAgICAgIGJvdHRvbTogXCJCdW5uXCIsXG4gICAgfSxcblxuICAgIHRhYnM6IHtcbiAgICAgIGdlbmVyYWw6IFwiR2VuZXJlbHRcIixcbiAgICAgIGZpbGVPcHRpb25zOiBcIlZhbGdcIixcbiAgICAgIGh0bWw6IFwiSFRNTC1lZGl0b3JcIixcbiAgICAgIGNvbHVtbnM6IFwiS29sb25uZXJcIixcbiAgICAgIHJvd3M6IFwiUmFkZXJcIixcbiAgICAgIGNob2ljZXM6IFwiVmFsZ1wiLFxuICAgICAgaXRlbXM6IFwiRWxlbWVudGVyXCIsXG4gICAgICB2aXNpYmxlSWY6IFwiU3lubGlnIGh2aXNcIixcbiAgICAgIGVuYWJsZUlmOiBcIlRpbGdqZW5nZWxpZyBodmlzXCIsXG4gICAgICByZXF1aXJlZElmOiBcIk7DuGR2ZW5kaWcgaHZpc1wiLFxuICAgICAgcmF0ZVZhbHVlczogXCJSYW5nZXJpbmcgdmVyZGllclwiLFxuICAgICAgY2hvaWNlc0J5VXJsOiBcIlZhbGcgZnJhIHdlYlwiLFxuICAgICAgbWF0cml4Q2hvaWNlczogXCJTdGFuZGFyZHZhbGdcIixcbiAgICAgIG11bHRpcGxlVGV4dEl0ZW1zOiBcIlRla3N0IGlubmRhdGFcIixcbiAgICAgIG51bWJlcmluZzogXCJOdW1tZXJlcmluZ1wiLFxuICAgICAgdmFsaWRhdG9yczogXCJWYWxpZGVyaW5nZXJcIixcbiAgICAgIG5hdmlnYXRpb246IFwiTmF2aWdlcmluZ1wiLFxuICAgICAgcXVlc3Rpb246IFwiU3DDuHJzbcOlbFwiLFxuICAgICAgcGFnZXM6IFwiU2lkZXJcIixcbiAgICAgIGNvbXBsZXRlZEh0bWw6IFwiRnVsbGbDuHJ0IEhUTUxcIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbjogXCJGdWxsZsO4cnQgSFRNTCBww6UgYmV0aW5nZWxzZVwiLFxuICAgICAgbG9hZGluZ0h0bWw6IFwiTGFzdGVyIEhUTUxcIixcbiAgICAgIHRpbWVyOiBcIlRpZHRha2VyL1F1aXpcIixcbiAgICAgIGNhbGN1bGF0ZWRWYWx1ZXM6IFwiQmVyZWduZWRlIHZlcmRpZXJcIixcbiAgICAgIHRyaWdnZXJzOiBcIlRyaWdnZXJlXCIsXG4gICAgICB0ZW1wbGF0ZVRpdGxlOiBcIk1hbC10aXR0ZWxcIixcbiAgICAgIHRvdGFsczogXCJUb3RhbGVyXCIsXG4gICAgICBsb2dpYzogXCJMb2dpa2tcIixcbiAgICAgIGxheW91dDogXCJPcHBzZXR0XCIsXG4gICAgICBkYXRhOiBcIkRhdGFcIixcbiAgICAgIHZhbGlkYXRpb246IFwiVmFsaWRlcmluZ1wiLFxuICAgICAgY2VsbHM6IFwiQ2VsbGVyXCIsXG4gICAgICBzaG93T25Db21wbGV0ZWQ6IFwiVmlzIG7DpXIgZmVyZGlnXCIsXG4gICAgICBsb2dvOiBcIkxvZ28gaSBza2plbWF0aXR0ZWxcIixcbiAgICAgIHNsaWRlcjogXCJTbGlkZXJcIixcbiAgICAgIG90aGVyczogXCJBbmRyZVwiLFxuICAgIH0sXG4gICAgZWRpdFByb3BlcnR5OiBcIlJlZGlnZXIgdmVyZGkgJ3swfSdcIixcbiAgICBpdGVtczogXCJbIEVsZW1lbnRlcjogezB9IF1cIixcblxuICAgIGVudGVyTmV3VmFsdWU6IFwiVmVubmxpZ3N0IGZ5bGwgaW5uIHZlcmRpZW4uXCIsXG4gICAgbm9xdWVzdGlvbnM6IFwiRGV0IGVyIGluZ2VuIHNww7hyc23DpWwgaSBza2plbWFldC5cIixcbiAgICBjcmVhdGV0cmlnZ2VyOiBcIlZlbm5saWdzdCBsYWcgZW4gdHJpZ2dlclwiLFxuICAgIHRpdGxlS2V5Ym9hcmRBZG9ybmVyVGlwOiBcIlRyeWtrIGVudGVyLXRhc3RlbiBmb3Igw6UgcmVkaWdlcmVcIixcbiAgICBrZXlib2FyZEFkb3JuZXJUaXA6XG4gICAgICBcIlRyeWtrIGVudGVyLXRhc3RlbiBmb3Igw6UgcmVkaWdlcmUgZWxlbWVudGV0LCB0cnlrayBzbGV0dGUtdGFzdGVuIGZvciDDpSBzbGV0dGUgZWxlbWVudGV0LCB0cnlrayBBbHQgKyBwaWwgb3BwL25lZCBmb3Igw6UgZmx5dHRlIGVsZW1lbnRldFwiLFxuICAgIHRyaWdnZXJPbjogXCJQw6UgXCIsXG4gICAgdHJpZ2dlck1ha2VQYWdlc1Zpc2libGU6IFwiR2rDuHIgc2lkZXIgc3lubGlnZTpcIixcbiAgICB0cmlnZ2VyTWFrZVF1ZXN0aW9uc1Zpc2libGU6IFwiR2rDuHIgZWxlbWVudGVyIHN5bmxpZ2U6XCIsXG4gICAgdHJpZ2dlckNvbXBsZXRlVGV4dDogXCJGdWxsZsO4ciBza2plbWEgZGVyc29tIHZlbGx5a2tldC5cIixcbiAgICB0cmlnZ2VyTm90U2V0OiBcIlRyaWdnZXIgZXIgaWtrZSBzYXR0XCIsXG4gICAgdHJpZ2dlclJ1bklmOiBcIktqw7hyIGRlcnNvbVwiLFxuICAgIHRyaWdnZXJTZXRUb05hbWU6IFwiRW5kcmUgdmVyZGllbiBhdjogXCIsXG4gICAgdHJpZ2dlckZyb21OYW1lOiBcIktvcGllciB2ZXJkaSBmcmE6IFwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uOiBcIktqw7hyIGRlbm5lIGZvcm1lbGVuOlwiLFxuICAgIHRyaWdnZXJTZXRWYWx1ZTogXCJ0aWw6IFwiLFxuICAgIHRyaWdnZXJHb3RvTmFtZTogXCJHw6UgdGlsIHNww7hyc23DpWw6XCIsXG4gICAgdHJpZ2dlcklzVmFyaWFibGU6IFwiSWtrZSBsZWdnIHZhcmlhYmVsZW4gaSByZXN1bHRhdGV0LlwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uRW1wdHk6IFwiVmVubmxpZ3N0IGZ5bGwgaW5uIGVuIGd5bGRpZyBmb3JtZWxcIixcblxuICAgIG5vRmlsZTogXCJJbmdlbiBmaWwgdmFsZ3RcIixcbiAgfSxcbiAgLy9Qcm9wZXJ0eSB2YWx1ZXNcbiAgcHY6IHtcbiAgICB0cnVlOiBcInRydWVcIixcbiAgICBmYWxzZTogXCJmYWxzZVwiLFxuICAgIGluaGVyaXQ6IFwiaW5oZXJpdFwiLFxuICAgIHNob3c6IFwic2hvd1wiLFxuICAgIGhpZGU6IFwiaGlkZVwiLFxuICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgIGluaXRpYWw6IFwiaW5pdGlhbFwiLFxuICAgIHJhbmRvbTogXCJyYW5kb21cIixcbiAgICBjb2xsYXBzZWQ6IFwiY29sbGFwc2VkXCIsXG4gICAgZXhwYW5kZWQ6IFwiZXhwYW5kZWRcIixcbiAgICBub25lOiBcIm5vbmVcIixcbiAgICBhc2M6IFwiYXNjZW5kaW5nXCIsXG4gICAgZGVzYzogXCJkZXNjZW5kaW5nXCIsXG4gICAgaW5kZXRlcm1pbmF0ZTogXCJpbmRldGVybWluYXRlXCIsXG4gICAgZGVjaW1hbDogXCJkZWNpbWFsXCIsXG4gICAgY3VycmVuY3k6IFwiY3VycmVuY3lcIixcbiAgICBwZXJjZW50OiBcInBlcmNlbnRcIixcbiAgICBmaXJzdEV4cGFuZGVkOiBcImZpcnN0RXhwYW5kZWRcIixcbiAgICBvZmY6IFwib2ZmXCIsXG4gICAgb25QYW5lbDogXCJvblBhbmVsXCIsXG4gICAgb25TdXJ2ZXk6IFwib25TdXJ2ZXlcIixcbiAgICBsaXN0OiBcImxpc3RcIixcbiAgICBwcm9ncmVzc1RvcDogXCJwcm9ncmVzc1RvcFwiLFxuICAgIHByb2dyZXNzQm90dG9tOiBcInByb2dyZXNzQm90dG9tXCIsXG4gICAgcHJvZ3Jlc3NUb3BCb3R0b206IFwicHJvZ3Jlc3NUb3BCb3R0b21cIixcbiAgICBob3Jpem9udGFsOiBcImhvcml6b250YWxcIixcbiAgICB2ZXJ0aWNhbDogXCJ2ZXJ0aWNhbFwiLFxuICAgIHRvcDogXCJ0b3BcIixcbiAgICBib3R0b206IFwiYm90dG9tXCIsXG4gICAgdG9wQm90dG9tOiBcInRvcCBhbmQgYm90dG9tXCIsXG4gICAgYm90aDogXCJib3RoXCIsXG4gICAgbGVmdDogXCJsZWZ0XCIsXG4gICAgY29sb3I6IFwiY29sb3JcIixcbiAgICBkYXRlOiBcImRhdGVcIixcbiAgICBkYXRldGltZTogXCJkYXRldGltZVwiLFxuICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjogXCJkYXRldGltZS1sb2NhbFwiLFxuICAgIGVtYWlsOiBcImVtYWlsXCIsXG4gICAgbW9udGg6IFwibW9udGhcIixcbiAgICBudW1iZXI6IFwibnVtYmVyXCIsXG4gICAgcGFzc3dvcmQ6IFwicGFzc3dvcmRcIixcbiAgICByYW5nZTogXCJyYW5nZVwiLFxuICAgIHRlbDogXCJ0ZWxcIixcbiAgICB0ZXh0OiBcInRleHRcIixcbiAgICB0aW1lOiBcInRpbWVcIixcbiAgICB1cmw6IFwidXJsXCIsXG4gICAgd2VlazogXCJ3ZWVrXCIsXG4gICAgaGlkZGVuOiBcImhpZGRlblwiLFxuICAgIG9uOiBcIm9uXCIsXG4gICAgb25QYWdlOiBcIm9uUGFnZVwiLFxuICAgIGVkaXQ6IFwiZWRpdFwiLFxuICAgIGRpc3BsYXk6IFwiZGlzcGxheVwiLFxuICAgIG9uQ29tcGxldGU6IFwib25Db21wbGV0ZVwiLFxuICAgIG9uSGlkZGVuOiBcIm9uSGlkZGVuXCIsXG4gICAgYWxsOiBcImFsbFwiLFxuICAgIHBhZ2U6IFwicGFnZVwiLFxuICAgIHN1cnZleTogXCJzdXJ2ZXlcIixcbiAgICBvbk5leHRQYWdlOiBcIm9uTmV4dFBhZ2VcIixcbiAgICBvblZhbHVlQ2hhbmdlZDogXCJvblZhbHVlQ2hhbmdlZFwiLFxuICAgIHNpbmdsZVBhZ2U6IFwic2luZ2xlIHBhZ2VcIixcbiAgICBzdGFuZGFyZDogXCJzdGFuZGFyZFwiLFxuICAgIHF1ZXN0aW9uUGVyUGFnZTogXCJxdWVzdGlvbiBwZXIgcGFnZVwiLFxuICAgIG5vUHJldmlldzogXCJubyBwcmV2aWV3XCIsXG4gICAgc2hvd0FsbFF1ZXN0aW9uczogXCJzaG93IHByZXZpZXcgd2l0aCBhbGwgcXVlc3Rpb25zXCIsXG4gICAgc2hvd0Fuc3dlcmVkUXVlc3Rpb25zOiBcInNob3cgcHJldmlldyB3aXRoIGFuc3dlcmVkIHF1ZXN0aW9uc1wiLFxuICB9LFxuICAvL09wZXJhdG9yc1xuICBvcDoge1xuICAgIGVtcHR5OiBcImVyIHRvbVwiLFxuICAgIG5vdGVtcHR5OiBcImVyIGlra2UgdG9tXCIsXG4gICAgZXF1YWw6IFwiZXIgbGlrXCIsXG4gICAgbm90ZXF1YWw6IFwiZXIgaWtrZSBsaWtcIixcbiAgICBjb250YWluczogXCJpbm5laG9sZGVyXCIsXG4gICAgbm90Y29udGFpbnM6IFwiaW5uZWhvbGRlciBpa2tlXCIsXG4gICAgYW55b2Y6IFwibm9lbiBhdlwiLFxuICAgIGFsbG9mOiBcImFsbGUgYXZcIixcbiAgICBncmVhdGVyOiBcInN0w7hycmUgZW5uXCIsXG4gICAgbGVzczogXCJtaW5kcmUgZW5uXCIsXG4gICAgZ3JlYXRlcm9yZXF1YWw6IFwic3TDuHJyZSBlbGxlciBsaWtcIixcbiAgICBsZXNzb3JlcXVhbDogXCJtaW5kcmUgZWxsZXIgbGlrXCIsXG4gICAgYW5kOiBcIm9nXCIsXG4gICAgb3I6IFwiZWxsZXJcIixcbiAgfSxcbiAgLy9FbWJlZCB3aW5kb3dcbiAgZXc6IHtcbiAgICBhbmd1bGFyOiBcIkJydWsgQW5ndWxhci12ZXJzam9uXCIsXG4gICAganF1ZXJ5OiBcIkJydWsgalF1ZXJ5LXZlcnNqb25cIixcbiAgICBrbm9ja291dDogXCJCcnVrIEtub2Nrb3V0LXZlcnNqb25cIixcbiAgICByZWFjdDogXCJCcnVrIFJlYWN0LXZlcnNqb25cIixcbiAgICB2dWU6IFwiQnJ1ayBWdWUtdmVyc2pvblwiLFxuICAgIGJvb3RzdHJhcDogXCJGb3IgQm9vdHN0cmFwLXJhbW1ldmVya1wiLFxuICAgIHN0YW5kYXJkOiBcIklra2UgQm9vdHN0cmFwXCIsXG4gICAgc2hvd09uUGFnZTogXCJWaXMgc2tqZW1hIHDDpSBlbiBzaWRlXCIsXG4gICAgc2hvd0luV2luZG93OiBcIlZpcyBza2plbWEgaSBldCB2aW5kdVwiLFxuICAgIGxvYWRGcm9tU2VydmVyOiBcIkxhc3Qgc2tqZW1hZGVmaW5pc2pvbiBzb20gSlNPTiBmcmEgc2VydmVyXCIsXG4gICAgdGl0bGVTY3JpcHQ6IFwiU2tyaXB0IG9nIHN0aWxlclwiLFxuICAgIHRpdGxlSHRtbDogXCJIVE1MXCIsXG4gICAgdGl0bGVKYXZhU2NyaXB0OiBcIkphdmFTY3JpcHRcIixcbiAgfSxcbiAgLy9UZXN0IFN1cnZleVxuICB0czoge1xuICAgIHNlbGVjdFBhZ2U6IFwiVmVsZyBzaWRlOlwiLFxuICAgIHNob3dJbnZpc2libGVFbGVtZW50czogXCJWaXMgdXN5bmxpZ2UgZWxlbWVudGVyXCIsXG4gIH0sXG4gIHZhbGlkYXRvcnM6IHtcbiAgICBhbnN3ZXJjb3VudHZhbGlkYXRvcjogXCJhbnRhbGwgc3ZhclwiLFxuICAgIGVtYWlsdmFsaWRhdG9yOiBcImUtcG9zdFwiLFxuICAgIGV4cHJlc3Npb252YWxpZGF0b3I6IFwiZm9ybWVsXCIsXG4gICAgbnVtZXJpY3ZhbGlkYXRvcjogXCJudW1lcmlza1wiLFxuICAgIHJlZ2V4dmFsaWRhdG9yOiBcInJlZ2V4XCIsXG4gICAgdGV4dHZhbGlkYXRvcjogXCJ0ZWtzdFwiLFxuICB9LFxuICB0cmlnZ2Vyczoge1xuICAgIGNvbXBsZXRldHJpZ2dlcjogXCJjb21wbGV0ZSBza2plbWFcIixcbiAgICBzZXR2YWx1ZXRyaWdnZXI6IFwic2V0IHZhbHVlXCIsXG4gICAgY29weXZhbHVldHJpZ2dlcjogXCJjb3B5IHZhbHVlXCIsXG4gICAgc2tpcHRyaWdnZXI6IFwiaG9wcCB0aWwgc3DDuHJzbcOlbFwiLFxuICAgIHJ1bmV4cHJlc3Npb250cmlnZ2VyOiBcImtqw7hyIGZvcm1lbFwiLFxuICAgIHZpc2libGV0cmlnZ2VyOiBcImVuZHJlIHN5bmxpZ2hldCAoZGVwcmVjYXRlZClcIixcbiAgfSxcbiAgLy9Qcm9wZXJ0aWVzXG4gIHA6IHtcbiAgICBuYW1lOiBcIm5hbWVcIixcbiAgICB0aXRsZToge1xuICAgICAgbmFtZTogXCJ0aXRsZVwiLFxuICAgICAgdGl0bGU6IFwiTGEgZGVuIHbDpnJlIHRvbSwgZGVyc29tIGRlbiBza2FsIHbDpnJlIHNhbW1lIHNvbSBuYXZuZXRcIixcbiAgICB9LFxuXG4gICAgbmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5OiBcIm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eVwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcInF1ZXN0aW9uc09yZGVyXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIm1heFRpbWVUb0ZpbmlzaFwiLFxuXG4gICAgdmlzaWJsZTogXCJ2aXNpYmxlXCIsXG4gICAgdmlzaWJsZUlmOiBcInZpc2libGVJZlwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjogXCJkZXNjcmlwdGlvblwiLFxuICAgIHN0YXRlOiBcInN0YXRlXCIsXG4gICAgaXNSZXF1aXJlZDogXCJpc1JlcXVpcmVkXCIsXG4gICAgcmVxdWlyZWRJZjogXCJyZXF1aXJlZElmXCIsXG4gICAgaW5kZW50OiBcImluZGVudFwiLFxuICAgIHJlcXVpcmVkRXJyb3JUZXh0OiBcInJlcXVpcmVkRXJyb3JUZXh0XCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCJzdGFydFdpdGhOZXdMaW5lXCIsXG4gICAgaW5uZXJJbmRlbnQ6IFwiaW5uZXJJbmRlbnRcIixcbiAgICBwYWdlOiBcInBhZ2VcIixcblxuICAgIHdpZHRoOiBcIndpZHRoXCIsXG5cbiAgICBjb21tZW50VGV4dDogXCJjb21tZW50VGV4dFwiLFxuICAgIHZhbHVlTmFtZTogXCJ2YWx1ZU5hbWVcIixcbiAgICBlbmFibGVJZjogXCJlbmFibGVJZlwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJkZWZhdWx0VmFsdWVcIixcbiAgICBjb3JyZWN0QW5zd2VyOiBcImNvcnJlY3RBbnN3ZXJcIixcbiAgICByZWFkT25seTogXCJyZWFkT25seVwiLFxuICAgIHZhbGlkYXRvcnM6IFwidmFsaWRhdG9yc1wiLFxuICAgIHRpdGxlTG9jYXRpb246IFwidGl0bGVMb2NhdGlvblwiLFxuXG4gICAgaGFzQ29tbWVudDogXCJoYXNDb21tZW50XCIsXG4gICAgaGFzT3RoZXI6IFwiaGFzT3RoZXJcIixcbiAgICBjaG9pY2VzOiBcImNob2ljZXNcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwiY2hvaWNlc09yZGVyXCIsXG4gICAgY2hvaWNlc0J5VXJsOiBcImNob2ljZXNCeVVybFwiLFxuICAgIG90aGVyVGV4dDogXCJvdGhlclRleHRcIixcbiAgICBvdGhlckVycm9yVGV4dDogXCJvdGhlckVycm9yVGV4dFwiLFxuICAgIHN0b3JlT3RoZXJzQXNDb21tZW50OiBcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsXG5cbiAgICBsYWJlbDogXCJsYWJlbFwiLFxuICAgIHNob3dUaXRsZTogXCJzaG93VGl0bGVcIixcbiAgICB2YWx1ZVRydWU6IFwidmFsdWVUcnVlXCIsXG4gICAgdmFsdWVGYWxzZTogXCJ2YWx1ZUZhbHNlXCIsXG5cbiAgICBjb2xzOiBcImNvbHNcIixcbiAgICByb3dzOiBcInJvd3NcIixcbiAgICBwbGFjZUhvbGRlcjogXCJwbGFjZUhvbGRlclwiLFxuXG4gICAgb3B0aW9uc0NhcHRpb246IFwib3B0aW9uc0NhcHRpb25cIixcblxuICAgIGV4cHJlc3Npb246IFwiZXhwcmVzc2lvblwiLFxuICAgIGZvcm1hdDogXCJmb3JtYXRcIixcbiAgICBkaXNwbGF5U3R5bGU6IFwiZGlzcGxheVN0eWxlXCIsXG4gICAgY3VycmVuY3k6IFwiY3VycmVuY3lcIixcbiAgICB1c2VHcm91cGluZzogXCJ1c2VHcm91cGluZ1wiLFxuXG4gICAgc2hvd1ByZXZpZXc6IFwic2hvd1ByZXZpZXdcIixcbiAgICBhbGxvd011bHRpcGxlOiBcImFsbG93TXVsdGlwbGVcIixcbiAgICBpbWFnZUhlaWdodDogXCJpbWFnZUhlaWdodFwiLFxuICAgIGltYWdlV2lkdGg6IFwiaW1hZ2VXaWR0aFwiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCJzdG9yZURhdGFBc1RleHRcIixcbiAgICBtYXhTaXplOiBcIm1heFNpemVcIixcblxuICAgIGh0bWw6IFwiaHRtbFwiLFxuXG4gICAgY29sdW1uczogXCJjb2x1bW5zXCIsXG4gICAgY2VsbHM6IFwiY2VsbHNcIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcImlzQWxsUm93UmVxdWlyZWRcIixcblxuICAgIGhvcml6b250YWxTY3JvbGw6IFwiaG9yaXpvbnRhbFNjcm9sbFwiLFxuICAgIGNlbGxUeXBlOiBcImNlbGxUeXBlXCIsXG4gICAgY29sdW1uc0xheW91dDogXCJjb2x1bW5zTGF5b3V0XCIsXG4gICAgY29sdW1uQ29sQ291bnQ6IFwiY29sdW1uQ29sQ291bnRcIixcbiAgICBjb2x1bW5NaW5XaWR0aDogXCJjb2x1bW5NaW5XaWR0aFwiLFxuXG4gICAgcm93Q291bnQ6IFwicm93Q291bnRcIixcbiAgICBtaW5Sb3dDb3VudDogXCJtaW5Sb3dDb3VudFwiLFxuICAgIG1heFJvd0NvdW50OiBcIm1heFJvd0NvdW50XCIsXG4gICAga2V5TmFtZTogXCJrZXlOYW1lXCIsXG4gICAga2V5RHVwbGljYXRpb25FcnJvcjogXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgY29uZmlybURlbGV0ZTogXCJjb25maXJtRGVsZXRlXCIsXG4gICAgY29uZmlybURlbGV0ZVRleHQ6IFwiY29uZmlybURlbGV0ZVRleHRcIixcbiAgICBhZGRSb3dMb2NhdGlvbjogXCJhZGRSb3dMb2NhdGlvblwiLFxuICAgIGFkZFJvd1RleHQ6IFwiYWRkUm93VGV4dFwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwicmVtb3ZlUm93VGV4dFwiLFxuXG4gICAgaXRlbXM6IFwiaXRlbXNcIixcbiAgICBpdGVtU2l6ZTogXCJpdGVtU2l6ZVwiLFxuICAgIGNvbENvdW50OiBcImNvbENvdW50XCIsXG5cbiAgICB0ZW1wbGF0ZVRpdGxlOiBcInRlbXBsYXRlVGl0bGVcIixcbiAgICB0ZW1wbGF0ZURlc2NyaXB0aW9uOiBcInRlbXBsYXRlRGVzY3JpcHRpb25cIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcImFsbG93QWRkUGFuZWxcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcImFsbG93UmVtb3ZlUGFuZWxcIixcbiAgICBwYW5lbENvdW50OiBcInBhbmVsQ291bnRcIixcbiAgICBtaW5QYW5lbENvdW50OiBcIm1pblBhbmVsQ291bnRcIixcbiAgICBtYXhQYW5lbENvdW50OiBcIm1heFBhbmVsQ291bnRcIixcbiAgICBwYW5lbHNTdGF0ZTogXCJwYW5lbHNTdGF0ZVwiLFxuICAgIHBhbmVsQWRkVGV4dDogXCJwYW5lbEFkZFRleHRcIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwicGFuZWxSZW1vdmVUZXh0XCIsXG4gICAgcGFuZWxQcmV2VGV4dDogXCJwYW5lbFByZXZUZXh0XCIsXG4gICAgcGFuZWxOZXh0VGV4dDogXCJwYW5lbE5leHRUZXh0XCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsXG4gICAgc2hvd1JhbmdlSW5Qcm9ncmVzczogXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsXG4gICAgcmVuZGVyTW9kZTogXCJyZW5kZXJNb2RlXCIsXG4gICAgdGVtcGxhdGVUaXRsZUxvY2F0aW9uOiBcInRlbXBsYXRlVGl0bGVMb2NhdGlvblwiLFxuXG4gICAgcmF0ZVZhbHVlczogXCJyYXRlVmFsdWVzXCIsXG4gICAgcmF0ZU1pbjogXCJyYXRlTWluXCIsXG4gICAgcmF0ZU1heDogXCJyYXRlTWF4XCIsXG4gICAgcmF0ZVN0ZXA6IFwicmF0ZVN0ZXBcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwibWluUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcIm1heFJhdGVEZXNjcmlwdGlvblwiLFxuXG4gICAgaW5wdXRUeXBlOiBcImlucHV0VHlwZVwiLFxuICAgIHNpemU6IFwic2l6ZVwiLFxuXG4gICAgbG9jYWxlOiBcImxvY2FsZVwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzogXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWNcIixcbiAgICBjb21wbGV0ZWRIdG1sOiBcImNvbXBsZXRlZEh0bWxcIixcbiAgICBjb21wbGV0ZWRCZWZvcmVIdG1sOiBcImNvbXBsZXRlZEJlZm9yZUh0bWxcIixcbiAgICBsb2FkaW5nSHRtbDogXCJsb2FkaW5nSHRtbFwiLFxuICAgIHRyaWdnZXJzOiBcInRyaWdnZXJzXCIsXG4gICAgY29va2llTmFtZTogXCJjb29raWVOYW1lXCIsXG4gICAgc2VuZFJlc3VsdE9uUGFnZU5leHQ6IFwic2VuZFJlc3VsdE9uUGFnZU5leHRcIixcbiAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IFwic2hvd05hdmlnYXRpb25CdXR0b25zXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwic2hvd1ByZXZCdXR0b25cIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJzaG93UGFnZVRpdGxlc1wiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcInNob3dDb21wbGV0ZWRQYWdlXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcInNob3dQYWdlTnVtYmVyc1wiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwic2hvd1Byb2dyZXNzQmFyXCIsXG4gICAgbW9kZTogXCJtb2RlXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzogXCJnb05leHRQYWdlQXV0b21hdGljXCIsXG4gICAgY2hlY2tFcnJvcnNNb2RlOiBcImNoZWNrRXJyb3JzTW9kZVwiLFxuICAgIGNsZWFySW52aXNpYmxlVmFsdWVzOiBcImNsZWFySW52aXNpYmxlVmFsdWVzXCIsXG4gICAgc3RhcnRTdXJ2ZXlUZXh0OiBcInN0YXJ0U3VydmV5VGV4dFwiLFxuICAgIHBhZ2VQcmV2VGV4dDogXCJwYWdlUHJldlRleHRcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwicGFnZU5leHRUZXh0XCIsXG4gICAgY29tcGxldGVUZXh0OiBcImNvbXBsZXRlVGV4dFwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJyZXF1aXJlZFRleHRcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwicXVlc3Rpb25TdGFydEluZGV4XCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOiBcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCJmaXJzdFBhZ2VJc1N0YXJ0ZWRcIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwiaXNTaW5nbGVQYWdlXCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCJtYXhUaW1lVG9GaW5pc2hQYWdlXCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwic2hvd1RpbWVyUGFuZWxcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwic2hvd1RpbWVyUGFuZWxNb2RlXCIsXG5cbiAgICBkZWZhdWx0UGFuZWxWYWx1ZTogXCJkZWZhdWx0UGFuZWxWYWx1ZVwiLFxuICAgIGRlZmF1bHRSb3dWYWx1ZTogXCJkZWZhdWx0Um93VmFsdWVcIixcbiAgICBoYXNOb25lOiBcImhhc05vbmVcIixcbiAgICBub25lVGV4dDogXCJub25lVGV4dFwiLFxuXG4gICAgdGV4dDogXCJ0ZXh0XCIsXG4gIH0sXG59O1xuLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5lZGl0b3JMb2NhbGl6YXRpb24ubG9jYWxlc1tcIm5iXCJdID0gbmJTdHJpbmdzO1xuIiwiaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuXG52YXIgcGVyc2lhblN0cmluZ3MgPSB7XG4gIFwic3VydmV5XCI6IHtcbiAgICBcImVkaXRcIjogXCLZiNuM2LHYp9uM2LRcIixcbiAgICBcImV4dGVybmFsSGVscExpbmtcIjogXCLZhtqv2KfZhyDaqdmG24zYryDZiCDYs9in2K7YqtmGINmG2LjYsdiz2YbYrNuMINix2Kcg2KLZhdmI2LLYtCDYqNio24zZhtuM2K9cIixcbiAgICBcImV4dGVybmFsSGVscExpbmtVcmxcIjogXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDSDJydTlva0ljb29OWmZwSWJ5cTRxUT92aWV3X2FzPXN1YnNjcmliZXJcIixcbiAgICBcImRyb3BRdWVzdGlvblwiOiBcItmE2LfZgdinINin2LIg2KzYudio2Ycg2KfYqNiy2KfYsSDYs9mI2KfZhNuMINiv2LEg2KfbjNmG2KzYpyDZgtix2KfYsSDYr9mH24zYr1wiLFxuICAgIFwiYWRkTG9naWNJdGVtXCI6IFwi2KjYsdin24wg2LTYrti124wg2LPYp9iy24wg2YbYuNix2LPZhtis24wg2K7ZiNiv2Iwg2YLYp9mG2YjZhtuMINix2Kcg2KfbjNis2KfYryDaqdmG24zYr1wiLFxuICAgIFwiY29weVwiOiBcItqp2b7bjFwiLFxuICAgIFwiZHVwbGljYXRlXCI6IFwi2qnZvtuMINqp2LHYr9mGXCIsXG4gICAgXCJhZGRUb1Rvb2xib3hcIjogXCLYp9mB2LLZiNiv2YYg2KjZhyDYrNi52KjZhyDYp9io2LLYp9ixXCIsXG4gICAgXCJkZWxldGVQYW5lbFwiOiBcItit2LDZgSDZvtmG2YRcIixcbiAgICBcImRlbGV0ZVF1ZXN0aW9uXCI6IFwi2K3YsNmBINiz2YjYp9mEXCIsXG4gICAgXCJjb252ZXJ0VG9cIjogXCLYqtio2K/bjNmEINio2YdcIixcbiAgICBcImRyYWdcIjogXCLYp9mE2YXYp9mGINix2Kcg2Kjaqdi024zYr1wiXG4gIH0sXG4gIFwicXRcIjoge1xuICAgIFwiZGVmYXVsdFwiOiBcItm+24zYtCDZgdix2LZcIixcbiAgICBcImNoZWNrYm94XCI6IFwi2obZhtivINin2YbYqtiu2KfYqNuMXCIsXG4gICAgXCJjb21tZW50XCI6IFwi2YbYuNixXCIsXG4gICAgXCJpbWFnZXBpY2tlclwiOiBcItin2YbYqtiu2KfYqCDYudqp2LNcIixcbiAgICBcInJhbmtpbmdcIjogXCLYsdiq2KjZhyDYqNmG2K/bjCjYsdmG2qkpXCIsXG4gICAgXCJpbWFnZVwiOiBcIti52qnYs1wiLFxuICAgIFwiZHJvcGRvd25cIjogXCLZhNuM2LPYqiDYp9mG2KrYrtin2KjbjFwiLFxuICAgIFwiZmlsZVwiOiBcItmB2KfbjNmEXCIsXG4gICAgXCJodG1sXCI6IFwiSHRtbFwiLFxuICAgIFwibWF0cml4XCI6IFwi2YXYp9iq2LHbjNizICjYqtqpINin2YbYqtiu2KfYqNuMKVwiLFxuICAgIFwibWF0cml4ZHJvcGRvd25cIjogXCLZhdin2KrYsduM2LMgKNqG2YbYryDYp9mG2KrYrtin2KjbjClcIixcbiAgICBcIm1hdHJpeGR5bmFtaWNcIjogXCLZhdin2KrYsduM2LMgKNiz2LfYsdmH2KfbjCDYr9in24zZhtin2YXbjNqpKVwiLFxuICAgIFwibXVsdGlwbGV0ZXh0XCI6IFwi2YXYqtmGINqG2YbYryDYrti324xcIixcbiAgICBcInBhbmVsXCI6IFwi2b7ZhtmEXCIsXG4gICAgXCJwYW5lbGR5bmFtaWNcIjogXCLZvtmG2YQgKNm+2YbZhCDZh9in24wg2K/Yp9uM2YbYp9mF24zaqSlcIixcbiAgICBcInJhZGlvZ3JvdXBcIjogXCLYqtqpINin2YbYqtiu2KfYqNuMXCIsXG4gICAgXCJyYXRpbmdcIjogXCLYsdiq2KjZhyDYqNmG2K/bjFwiLFxuICAgIFwidGV4dFwiOiBcItmF2KrZhiDYqtqpINiu2LfbjFwiLFxuICAgIFwiYm9vbGVhblwiOiBcIti12K3bjNitINmIINi62YTYt1wiLFxuICAgIFwiZXhwcmVzc2lvblwiOiBcItiq2YjYtduM2YHbjFwiLFxuICAgIFwic2lnbmF0dXJlcGFkXCI6IFwi2YLYs9mF2Kog2KfZhdi22KdcIixcbiAgICBcImZsb3dwYW5lbFwiOiBcItm+2YbZhCDYrNix24zYp9mGXCJcbiAgfSxcbiAgXCJlZFwiOiB7XG4gICAgXCJkZWZhdWx0TG9jYWxlXCI6IFwi2b7bjNi0INmB2LHYtiAoezB9KVwiLFxuICAgIFwic3VydmV5XCI6IFwi2YbYuNix2LPZhtis24xcIixcbiAgICBcInNldHRpbmdzXCI6IFwi2KrZhti424zZhdin2Kog2YbYuNix2LPZhtis24xcIixcbiAgICBcInNldHRpbmdzVG9vbHRpcFwiOiBcItio2KfYsiDaqdix2K/ZhiDYqtmG2LjbjNmF2KfYqiDZhti42LHYs9mG2KzbjFwiLFxuICAgIFwic2hvd1BhbmVsXCI6IFwi2YbZhdin24zYtCDZvtmG2YRcIixcbiAgICBcImhpZGVQYW5lbFwiOiBcItm+2YbZh9in2YYg2LPYp9iy24wg2b7ZhtmEXCIsXG4gICAgXCJhZGROZXdQYWdlXCI6IFwi2K/YsdisINi12YHYrdmHINis2K/bjNivXCIsXG4gICAgXCJtb3ZlUmlnaHRcIjogXCLYp9iz2qnYsdmI2YQg2KjZhyDYsdin2LPYqlwiLFxuICAgIFwibW92ZUxlZnRcIjogXCLYp9iz2qnYsdmI2YQg2KjZhyDahtm+XCIsXG4gICAgXCJkZWxldGVQYWdlXCI6IFwi2K3YsNmBINi12YHYrdmHXCIsXG4gICAgXCJlZGl0UGFnZVwiOiBcItmI24zYsdin24zYtCDYtdmB2K3Zh1wiLFxuICAgIFwiZWRpdFwiOiBcItmI24zYsdin24zYtFwiLFxuICAgIFwibmV3UGFnZU5hbWVcIjogXCLYtdmB2K3Zh1wiLFxuICAgIFwibmV3UXVlc3Rpb25OYW1lXCI6IFwi2LPZiNin2YRcIixcbiAgICBcIm5ld1BhbmVsTmFtZVwiOiBcItm+2YbZhFwiLFxuICAgIFwibmV3VGV4dEl0ZW1OYW1lXCI6IFwi2YXYqtmGXCIsXG4gICAgXCJ0ZXN0U3VydmV5XCI6IFwi2KLYstmF2KfbjNi0INmG2LjYsdiz2YbYrNuMXCIsXG4gICAgXCJ0ZXN0U3VydmV5QWdhaW5cIjogXCLYotiy2YXYp9uM2LQg2K/ZiNio2KfYsdmHINmG2LjYsdiz2YbYrNuMXCIsXG4gICAgXCJ0ZXN0U3VydmV5V2lkdGhcIjogXCLYudix2LYg2YbYuNix2LPZhtis24w6IFwiLFxuICAgIFwibmF2aWdhdGVUb01zZ1wiOiBcIti02YXYpyDYqNin24zYryDYqNmHINmF2YjYp9ix2K8g2LLbjNixINio2LHZiNuM2K86XCIsXG4gICAgXCJsb2dpY1wiOiBcItmF2YbYt9mCINmG2LjYsdiz2YbYrNuMXCIsXG4gICAgXCJlbWJlZFN1cnZleVwiOiBcItmG2LjYsdiz2YbYrNuMINiq2Yjaqdin2LFcIixcbiAgICBcInRyYW5zbGF0aW9uXCI6IFwi2KrYsdis2YXZh1wiLFxuICAgIFwic2F2ZVN1cnZleVwiOiBcItiw2K7bjNix2Ycg2YbYuNix2LPZhtis24xcIixcbiAgICBcInNhdmVTdXJ2ZXlUb29sdGlwXCI6IFwi2LDYrtuM2LHZhyDZhti42LHYs9mG2KzbjFwiLFxuICAgIFwiZGVzaWduZXJcIjogXCLYt9ix2KfYrSDZhti42LHYs9mG2KzbjFwiLFxuICAgIFwianNvbkVkaXRvclwiOiBcItmI24zYsdin24zYtNqv2LEgSlNPTlwiLFxuICAgIFwidW5kb1wiOiBcItio2KfYstqv2LHYr9in2YbbjFwiLFxuICAgIFwicmVkb1wiOiBcItio2KfYstin2YbYrNin2YVcIixcbiAgICBcInVuZG9Ub29sdGlwXCI6IFwi2KjYp9iy2q/Ysdiv2KfZhtiv2YYg2KLYrtix24zZhiDYqti624zbjNixXCIsXG4gICAgXCJyZWRvVG9vbHRpcFwiOiBcItin2YbYrNin2YUg2K/Yp9iv2YYg2KrYutuM24zYsVwiLFxuICAgIFwiY29weVwiOiBcItqp2b7bjFwiLFxuICAgIFwiY3V0XCI6IFwi2KjYsdiv2KfYtNiq2YZcIixcbiAgICBcInBhc3RlXCI6IFwi2obYs9io2KfZhtiv2YZcIixcbiAgICBcImNvcHlUb29sdGlwXCI6IFwi2qnZvtuMINmF2KrZhiDYp9mG2KrYrtin2Kgg2LTYr9mHINiv2LEg2qnZhNuM2b4g2KjZiNix2K9cIixcbiAgICBcImN1dFRvb2x0aXBcIjogXCLZhdiq2YYg2KfZhtiq2K7Yp9io24wg2LHYpyDYp9iyINqp2YTbjNm+INio2YjYsdivINio2LHYtCDYr9mH24zYr1wiLFxuICAgIFwicGFzdGVUb29sdGlwXCI6IFwi2KfZhNi12KfZgiDYp9iyINqp2YTbjNm+INio2YjYsdivXCIsXG4gICAgXCJvcHRpb25zXCI6IFwi2KfZhtiq2K7Yp9ioINmH2KdcIixcbiAgICBcImdlbmVyYXRlVmFsaWRKU09OXCI6IFwi2KrZiNmE24zYryDaqdivINmF2LnYqtio2LEgSlNPTlwiLFxuICAgIFwiZ2VuZXJhdGVSZWFkYWJsZUpTT05cIjogXCLYqtmI2YTbjNivINqp2K8g2K7ZiNin2YbYpyBKU09OXCIsXG4gICAgXCJ0b29sYm94XCI6IFwi2KzYudio2Ycg2KfYqNiy2KfYsVwiLFxuICAgIFwicHJvcGVydHktZ3JpZFwiOiBcItmI24zamNqv24wg2YfYp1wiLFxuICAgIFwidG9vbGJveEdlbmVyYWxDYXRlZ29yeVwiOiBcIti52YXZiNmF24xcIixcbiAgICBcImNvcnJlY3RKU09OXCI6IFwi2YTYt9mB2KcgSlNPTiDYsdinINiq2LXYrduM2K0g2qnZhtuM2K8uXCIsXG4gICAgXCJzdXJ2ZXlSZXN1bHRzXCI6IFwi2YbYqtin24zYrCDZhti42LHYs9mG2KzbjDogXCIsXG4gICAgXCJzdXJ2ZXlSZXN1bHRzVGFibGVcIjogXCLYqNmHINi12YjYsdiqINis2K/ZiNmEXCIsXG4gICAgXCJzdXJ2ZXlSZXN1bHRzSnNvblwiOiBcItio2Ycg2LXZiNix2KogSlNPTlwiLFxuICAgIFwicmVzdWx0c1RpdGxlXCI6IFwi2LnZhtmI2KfZhiDYs9mI2KfZhFwiLFxuICAgIFwicmVzdWx0c05hbWVcIjogXCLZhtin2YUg2LPZiNin2YRcIixcbiAgICBcInJlc3VsdHNWYWx1ZVwiOiBcItmF2K3YqtmI2KfbjCDZvtin2LPYrlwiLFxuICAgIFwicmVzdWx0c0Rpc3BsYXlWYWx1ZVwiOiBcItmF2K3YqtmI2KfbjCDZhtmF2KfbjNi024xcIixcbiAgICBcIm1vZGlmaWVkXCI6IFwi2KrYutuM24zYsSDYr9in2K/ZhyDYtNiv2YdcIixcbiAgICBcInNhdmluZ1wiOiBcItiv2LEg2K3Yp9mEINiw2K7bjNix2YdcIixcbiAgICBcInNhdmVkXCI6IFwi2LDYrtuM2LHZhyDYtNivXCIsXG4gICAgXCJwcm9wZXJ0eUVkaXRvckVycm9yXCI6IFwi2K7Yt9inOlwiLFxuICAgIFwic2F2ZUVycm9yXCI6IFwi2K7Yt9inISDZhdit2KrZiNin24wg2YjbjNix2KfbjNi02q/YsSDYsNiu24zYsdmHINmG2LTYr9mHINin2LPYqi5cIixcbiAgICBcInRyYW5zbGF0aW9uQWRkTGFuZ3VhZ2VcIjogXCLYstio2KfZhtuMINix2Kcg2KjYsdin24wg2KrYsdis2YXZhyDYp9mG2KrYrtin2Kgg2qnZhtuM2K9cIixcbiAgICBcInRyYW5zbGF0aW9uU2hvd0FsbFN0cmluZ3NcIjogXCLZhtmF2KfbjNi0INiq2YXYp9mFINi52KjYp9ix2KfYqlwiLFxuICAgIFwidHJhbnNsYXRpb25TaG93QWxsUGFnZXNcIjogXCLZhtmF2KfbjNi0INiq2YXYp9mFINi12YHYrdin2KpcIixcbiAgICBcInRyYW5zbGF0aW9uTm9TdHJpbmdzXCI6IFwi2YfbjNqGINi52KjYp9ix2KrbjCDYqNix2KfbjCDYqtix2KzZhdmHINmG24zYs9iq2Iwg2YTYt9mB2Kcg2YHbjNmE2KrYsSDYsdinINi52YjYtiDaqdmG24zYry5cIixcbiAgICBcInRyYW5zbGF0aW9uRXhwb3J0VG9TQ1ZCdXR0b25cIjogXCLYqNix2YjZhiDYqNix24wg2KjZhyBDU1ZcIixcbiAgICBcInRyYW5zbGF0aW9uSW1wb3J0RnJvbVNDVkJ1dHRvblwiOiBcItio2LHZiNmGINix24zYstuMINin2LIgQ1NWXCIsXG4gICAgXCJ0cmFuc2xhdGlvbk1lcmdlTG9jYWxlV2l0aERlZmF1bHRcIjogXCLYp9iv2LrYp9mFIHswfSDYqNinINiy2KjYp9mGINm+24zYtCDZgdix2LZcIixcbiAgICBcImJvbGRcIjogXCLZvtix2LHZhtqvXCIsXG4gICAgXCJpdGFsaWNcIjogXCLZhdmI2LHYqFwiLFxuICAgIFwidW5kZXJsaW5lXCI6IFwi2b7Yp9uM24zZhiDYrti3XCIsXG4gICAgXCJmcEFkZFF1ZXN0aW9uXCI6IFwi2KfYttin2YHZhyDaqdix2K/ZhiDYs9mI2KfZhCAuLi5cIixcbiAgICBcInNlbGVjdFBhZ2VcIjogXCLYp9mG2KrYrtin2Kgg2LXZgdit2YcgLi4uXCIsXG4gICAgXCJjaG9vc2VFbGVtZW50XCI6IFwi2KfZhtiq2K7Yp9ioINio2K7YtCAuLi5cIixcbiAgICBcImxnXCI6IHtcbiAgICAgIFwiYWRkTmV3SXRlbVwiOiBcItin2LbYp9mB2Ycg2qnYsdiv2YYg2KLbjNiq2YUg2KzYr9uM2K9cIixcbiAgICAgIFwicGFnZV92aXNpYmlsaXR5TmFtZVwiOiBcItmC2KfYqNmE24zYqiDYsdmI24zYqiDYtdmB2K3ZhyBcIixcbiAgICAgIFwicGFuZWxfdmlzaWJpbGl0eU5hbWVcIjogXCLZgtin2KjZhNuM2Kog2LHZiNuM2Kog2b7ZhtmEXCIsXG4gICAgICBcInBhbmVsX2VuYWJsZU5hbWVcIjogXCLZgdi52KfZhC/YutuM2LHZgdi52KfZhCDaqdix2K/ZhiDZvtmG2YQgXCIsXG4gICAgICBcInF1ZXN0aW9uX3Zpc2liaWxpdHlOYW1lXCI6IFwiINmC2KfYqNmE24zYqiDYsdmI24zYqiDYs9mI2KfZhFwiLFxuICAgICAgXCJxdWVzdGlvbl9lbmFibGVOYW1lXCI6IFwi2YHYudin2YQv2LrbjNix2YHYudin2YQg2qnYsdiv2YYg2LPZiNin2YQgXCIsXG4gICAgICBcInF1ZXN0aW9uX3JlcXVpcmVOYW1lXCI6IFwi2LPZiNin2YQg2KfYrtiq24zYp9ix24wg2YXZiNix2K/ZhtuM2KfYslwiLFxuICAgICAgXCJ0cmlnZ2VyX2NvbXBsZXRlTmFtZVwiOiBcItiq2qnZhduM2YQg2YbYuNix2LPZhtis24xcIixcbiAgICAgIFwidHJpZ2dlcl9zZXR2YWx1ZU5hbWVcIjogXCLYqtmG2LjbjNmFINi52YbZiNin2YYg2LPZiNin2YRcIixcbiAgICAgIFwidHJpZ2dlcl9jb3B5dmFsdWVOYW1lXCI6IFwi2qnZvtuMINmF2YLYr9in2LEg2LPZiNin2YRcIixcbiAgICAgIFwidHJpZ2dlcl9za2lwTmFtZVwiOiBcItix2K8g2qnYsdiv2YYg2LPZiNin2YQgXCIsXG4gICAgICBcInRyaWdnZXJfcnVuRXhwcmVzc2lvbk5hbWVcIjogXCLYp9is2LHYp9uMINmF2KrZhiDYtNmB2KfYsdi024wg2YXZiNix2K8g2YbYuNixXCIsXG4gICAgICBcImNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbk5hbWVcIjogXCLZhdiq2YYg2LPZgdin2LHYtNuMINi12YHYrdmHICfYqti02qnYsScgXCIsXG4gICAgICBcInBhZ2VfdmlzaWJpbGl0eURlc2NyaXB0aW9uXCI6IFwi2LLZhdin2YbbjCDaqdmHINi52KjYp9ix2Kog2YXZhti32YLbjCDZhdmC2K/Yp9ixINi12K3bjNitINio2LHZhduMINqv2LHYr9in2YbYryDYtdmB2K3ZhyDYsdinINmC2KfYqNmEINmF2LTYp9mH2K/ZhyDaqdmG24zYr9iMINiv2LEg2LrbjNix2KfbjNmG2LXZiNix2Kog2KLZhiDYsdinINi624zYsdmC2KfYqNmEINmF2LTYp9mH2K/ZhyDZhtqv2Ycg2K/Yp9ix24zYry5cIixcbiAgICAgIFwicGFuZWxfdmlzaWJpbGl0eURlc2NyaXB0aW9uXCI6IFwi2Kfar9ixINi52KjYp9ix2Kog2YXZhti32YLbjCDZhdmC2K/Yp9ixINi12K3bjNitINio2LEg2YXbjNqv2LHYr9in2YbYr9iMINm+2YbZhCDYsdinINmB2LnYp9mEINqp2YbbjNiv2Iwg2K/YsSDYutuM2LEg2KfbjNmG2LXZiNix2Kog2KLZhiDYsdinINi624zYsdmC2KfYqNmEINmF2LTYp9mH2K/ZhyDZhtqv2Ycg2K/Yp9ix24zYry5cIixcbiAgICAgIFwicGFuZWxfZW5hYmxlRGVzY3JpcHRpb25cIjogXCLbjNqpINm+2YbZhCDYp9uM2KzYp9ivINqp2YbbjNivINmIINmH2YXZhyDYp9mE2YXYp9mGINmH2KfbjCDYr9in2K7ZhCDYotmGINix2Kcg2K/YsSDYtdmI2LHYqtuMINqp2Ycg2LnYqNin2LHYqiDZhdmG2LfZgtuMINmF2YLYr9in2LEg2LXYrduM2K0g2KjYsSDZhduMINqv2LHYr9in2YbYryDYsdinINmB2LnYp9mEINqp2YbbjNiv2Iwg2K/YsSDYutuM2LEg2KfbjNmG2LXZiNix2Kog2KLZhiDZh9inINix2Kcg2LrbjNix2YHYudin2YQg2Ybar9mHINiv2KfYsduM2K8uXCIsXG4gICAgICBcInF1ZXN0aW9uX3Zpc2liaWxpdHlEZXNjcmlwdGlvblwiOiBcItiy2YXYp9mG24wg2qnZhyDYudio2KfYsdiqINmF2YbYt9mC24wg2YXZgtiv2KfYsSDYtdit24zYrSDYsdinINio2LHZhduMINqv2LHYr9in2YbYr9iMINiz2YjYp9mEINix2Kcg2YLYp9io2YQg2YXYtNin2YfYr9mHINqp2YbbjNiv2Iwg2K/YsSDYutuM2LEg2KfbjNmG2LXZiNix2Kog2KLZhiDYsdinINi624zYsdmF2LTYp9mH2K/ZhyDZhtqv2Ycg2K/Yp9ix24zYry5cIixcbiAgICAgIFwicXVlc3Rpb25fZW5hYmxlRGVzY3JpcHRpb25cIjogXCLYstmF2KfZhtuMINqp2Ycg2LnYqNin2LHYqiDZhdmG2LfZgtuMINmF2YLYr9in2LEg2LXYrduM2K0g2KjYsdmF24wg2q/Ysdiv2KfZhtiv2Iwg2LPZiNin2YQg2LHYpyDZgdi52KfZhCDaqdmG24zYr9iMINiv2LEg2LrbjNixINin24zZhti12YjYsdiqINii2YYg2LHYpyDYutuM2LHZgdi52KfZhCDZhtqv2Ycg2K/Yp9ix24zYry5cIixcbiAgICAgIFwicXVlc3Rpb25fcmVxdWlyZURlc2NyaXB0aW9uXCI6IFwi2LLZhdin2YbbjCDaqdmHINi52KjYp9ix2Kog2YXZhti32YLbjCDZhdmC2K/Yp9ixINi12K3bjNitINix2Kcg2KjYsSDZhduMINqv2LHYr9in2YbYr9iMINiz2YjYp9mEINin2KzYqNin2LEg24wg2YXbjCDYtNmI2K8uXCIsXG4gICAgICBcInRyaWdnZXJfY29tcGxldGVEZXNjcmlwdGlvblwiOiBcItiy2YXYp9mG24wg2qnZhyDYudio2KfYsdiqINmF2YbYt9mC24wg2YXZgtiv2KfYsSDYtdit24zYrSDYsdinINio2LEg2YXbjCDar9ix2K/Yp9mG2K/YjCDZiCDYqNix2LHYs9uMINiq2qnZhduM2YQg2YXbjCDYtNmI2K/YjNqp2KfYsdio2LEg2YbZh9in24zbjCDYtdmB2K3ZhyAn2KrYtNqp2LEnINix2Kcg2YXYtNin2YfYr9mHINmF24wg2qnZhtivLlwiLFxuICAgICAgXCJ0cmlnZ2VyX3NldHZhbHVlRGVzY3JpcHRpb25cIjogXCLYstmF2KfZhtuMINqp2Ycg2YXZgtiv2KfYsSDYs9mI2KfZhNuMINqp2Ycg2K/YsSDYudio2KfYsdiqINmF2YbYt9mC24wg2KfYs9iq2YHYp9iv2Ycg2LTYr9mHINin2LPYqiDYqti624zbjNixINmF24wg24zYp9io2K8g2Ygg2LnYqNin2LHYqiDZhdmG2LfZgtuMINmF2YLYr9in2LEg2LXYrduM2K0g2LHYpyDYqNixINmF24wg2q/Ysdiv2KfZhtiv2Iwg2KLZhtqv2KfZhyDZhdmC2K/Yp9ixINio2LHYp9uMINiz2YjYp9mEINin2YbYqtiu2KfYqCDYtNiv2Ycg2KrZhti424zZhSDZhduMINi02YjYry5cIixcbiAgICAgIFwidHJpZ2dlcl9jb3B5dmFsdWVEZXNjcmlwdGlvblwiOiBcItiy2YXYp9mG24wg2qnZhyDZhdmC2K/Yp9ix2YfYp9uMINiz2YjYp9mEINqp2Ycg2K/YsSDYudio2KfYsdiqINmF2YbYt9mC24wg2KfYs9iq2YHYp9iv2Ycg2LTYr9mHINin2YbYr9iMINiq2LrbjNuM2LEg2YXbjCDbjNin2KjYryDZiCDYudio2KfYsdiqINmF2YbYt9mC24wg2YXZgtiv2KfYsSDYtdit24zYrSDYsdinINio2LEg2YXbjCDar9ix2K/Yp9mG2K/YjCDYs9m+2LMg2YXZgtiv2KfYsSDbjNqp24wg2KfYsiDYs9mI2KfZhCDZh9in24wg2KfZhtiq2K7Yp9ioINi02K/ZhyDYr9ixINiz2YjYp9mEINiv24zar9ixINin2YbYqtiu2KfYqCDYtNiv2Ycg2qnZvtuMINmF24wg2LTZiNivLlwiLFxuICAgICAgXCJ0cmlnZ2VyX3NraXBEZXNjcmlwdGlvblwiOiBcItiy2YXYp9mG24wg2qnZhyDYudio2KfYsdiqINmF2YbYt9mC24wg2LXYrduM2K0g2KjYsdmF24wg2q/Ysdiv2KfZhtiv2Iwg2LPZvtizINmG2LjYsdiz2YbYrNuMINio2Ycg2LPZiNin2YQg2KfZhtiq2K7Yp9io24wg2YXbjCDYsdmI2K8uXCIsXG4gICAgICBcInRyaWdnZXJfcnVuRXhwcmVzc2lvbkRlc2NyaXB0aW9uXCI6IFwi2Kfar9ixINi52KjYp9ix2Kog2YXZhti32YLbjCDZhdmC2K/Yp9ixINi12K3bjNitINio2LHar9ix2K/Yp9mG2K/YjCDYotmG2q/Yp9mHINi52KjYp9ix2Kog2LPZgdin2LHYtNuMINin2KzYsdinINmF24wg2LTZiNivLiDYtNmF2Kcg2YXZhdqp2YYg2KfYs9iqINio2Ycg2LfZiNixINin2K7YqtuM2KfYsduMINin24zZhiDZhtiq24zYrNmHINix2Kcg2KjZhyDYs9mI2KfZhCDYp9mG2KrYrtin2Kgg2LTYr9mHINiq2KjYr9uM2YQg2qnZhtuM2K8uXCIsXG4gICAgICBcImNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbkRlc2NyaXB0aW9uXCI6IFwiINin2q/YsSDYudio2KfYsdiqINmF2YbYt9mC24wg2YXZgtiv2KfYsSDYtdit24zYrSDYqNix2q/Ysdiv2KfZhtivINmF2KrZhiDYtdmB2K3ZhyAn2KrYtNqp2LEnINio2Ycg2YXYqtmGINiv2KfYr9mHINi02K/ZhyDYqti624zbjNixINmF24wg24zYp9io2K8uXCIsXG4gICAgICBcIml0ZW1FeHByZXNzaW9uVGV4dFwiOiBcItiy2YXYp9mG24wg2qnZhyDYudio2KfYsdiqIHswfSDZhdmC2K/Yp9ixINi12K3bjNitINio2LEg2YXbjCDar9ix2K/Yp9mG2K9cIixcbiAgICAgIFwicGFnZV92aXNpYmlsaXR5VGV4dFwiOiBcIti12YHYrdmHIHswfSDYsdinINmC2KfYqNmEINmF2LTYp9mH2K/ZhyDaqdmG24zYry5cIixcbiAgICAgIFwicGFuZWxfdmlzaWJpbGl0eVRleHRcIjogXCLZvtmG2YQgezB9INix2Kcg2YLYp9io2YQg2YXYtNin2YfYr9mHINqp2YbbjNivLlwiLFxuICAgICAgXCJwYW5lbF9lbmFibGVUZXh0XCI6IFwi2YHYudin2YQg2qnYsdiv2YYg2b7ZhtmEIHswfVwiLFxuICAgICAgXCJxdWVzdGlvbl92aXNpYmlsaXR5VGV4dFwiOiBcItiz2YjYp9mEIHswfSDYsdinINmC2KfYqNmEINmF2LTYp9mH2K/ZhyDaqdmG24zYry5cIixcbiAgICAgIFwicXVlc3Rpb25fZW5hYmxlVGV4dFwiOiBcItmB2LnYp9mEINqp2LHYr9mGINiz2YjYp9mEIHswfVwiLFxuICAgICAgXCJxdWVzdGlvbl9yZXF1aXJlVGV4dFwiOiBcItin24zYrNin2K8g2LPZiNin2YQgezB9INin2KzYqNin2LHbjFwiLFxuICAgICAgXCJ0cmlnZ2VyX2NvbXBsZXRlVGV4dFwiOiBcItio2LHYsdiz24wg2YbYuNix2LPZhtis24wg2KrZhdin2YUg2LTYr1wiLFxuICAgICAgXCJ0cmlnZ2VyX3NldHZhbHVlVGV4dFwiOiBcItiv2LEg2LPZiNin2YQgezB9INmF2YLYr9in2LEgezF9INix2Kcg2YLYsdin2LEg2K/Zh9uM2K9cIixcbiAgICAgIFwidHJpZ2dlcl9jb3B5dmFsdWVUZXh0XCI6IFwi2YXZgtiv2KfYsSDYs9mI2KfZhCB7MH0g2LHYpyDYp9iyINiz2YjYp9mEIHsxfSDaqdm+24wg2qnZhtuM2K8uXCIsXG4gICAgICBcInRyaWdnZXJfc2tpcFRleHRcIjogXCLYsdivINqp2LHYr9mGINmG2LjYsdiz2YbYrNuMINio2LHYp9uMINiz2YjYp9mEIHswfVwiLFxuICAgICAgXCJ0cmlnZ2VyX3J1bkV4cHJlc3Npb25UZXh0MVwiOiBcItin2KzYsdin24wg2LnYqNin2LHYqiAnezB9JyBcIixcbiAgICAgIFwidHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDJcIjogXCLZiCDZhtiq24zYrNmHINii2YYg2LHYpyDYr9in2K7ZhCDYs9mI2KfZhCB7MH0g2LDYrtuM2LHZhyDaqdmG24zYr1wiLFxuICAgICAgXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25UZXh0XCI6IFwi2YbZhdin24zYtCDZhdiq2YYg2LPZgdin2LHYtNuMINio2LHYp9uMINi12YHYrdmHICfYqti02qnYsSdcIixcbiAgICAgIFwiY29uZGl0aW9uc1wiOiBcIti02LHYtyjZh9inKVwiLFxuICAgICAgXCJhY3Rpb25zXCI6IFwi2LnZhdmE2qnYsdivKNmH2KcpXCIsXG4gICAgICBcImV4cHJlc3Npb25FZGl0b3JUaXRsZVwiOiBcIti52KjYp9ix2Kog2YXZhti32YLbjCDYsdinINiq2YbYuNuM2YUg2qnZhtuM2K9cIixcbiAgICAgIFwiYWN0aW9uc0VkaXRvclRpdGxlXCI6IFwi2KrYudix24zZgSDaqdix2K/ZhiDYudmF2YTaqdix2K8o2YfYpylcIixcbiAgICAgIFwiZGVsZXRlQWN0aW9uXCI6IFwi2K3YsNmBINi52YXZhNqp2LHYr1wiLFxuICAgICAgXCJhZGROZXdBY3Rpb25cIjogXCLYp9i22KfZgdmHINqp2LHYr9mGINiz2YjYp9mEICjZh9in24wpINis2K/bjNivXCIsXG4gICAgICBcInNlbGVjdGVkQWN0aW9uQ2FwdGlvblwiOiBcItuM2qkg2LnZhdmE2qnYsdivINix2Kcg2KjYsdin24wg2KfYttin2YHZhyDaqdix2K/ZhtiMINin2YbYqtiu2KfYqCDaqdmG24zYr1wiLFxuICAgICAgXCJleHByZXNzaW9uSW52YWxpZFwiOiBcIti52KjYp9ix2Kog2YXZhti32YLbjCDYrtin2YTbjCDbjNinINmG2KfYr9ix2LPYqiDYp9iz2KouINmE2LfZgdinINii2YYg2LHYpyDYqti22K3bjNitINqp2YbbjNivXCIsXG4gICAgICBcIm5vQWN0aW9uRXJyb3JcIjogXCLZhNi32YHYpyDYrdiv2KfZgtmEINuM2qkg2LnZhdmE2qnYsdivINix2Kcg2KfYttin2YHZhyDZhtmF2KfbjNuM2K9cIixcbiAgICAgIFwiYWN0aW9uSW52YWxpZFwiOiBcItmE2LfZgdinINmF2LTaqdmE2KfYqiDZhdix2KjZiNi3INio2Ycg2LnZhdmE2qnYsdivKNmH2KfbjCkg2K7ZiNivINix2Kcg2KjYsdi32LHZgSDZhtmF2KfbjNuM2K8uXCIsXG4gICAgICBcImV4cHJlc3Npb25TZXR1cFwiOiBcItiq2YbYuNuM2YXYp9iqINi52KjYp9ix2Kog2YfYp1wiLFxuICAgICAgXCJhY3Rpb25zU2V0dXBcIjogXCLYqtmG2LjbjNmF2KfYqiDYudmF2YTaqdix2K/Zh9inXCJcbiAgICB9LFxuICAgIFwib3BqZWN0UHJvcGVydGllc0hlYWRlclwiOiBcItm+24zYtNix2YHYqtmHXCIsXG4gICAgXCJzaG93T2JqZWN0UHJvcGVydGllc1wiOiBcItmG2YXYp9uM2LQg2YXYtNiu2LXYp9iqINio2K7YtCDZhdmI2LHYryDZhti42LFcIixcbiAgICBcImhpZGVPYmplY3RQcm9wZXJ0aWVzXCI6IFwi2b7ZhtmH2KfZhiDYs9in2LLbjCDZhdi02K7Ytdin2Kog2KjYrti0INmF2YjYsdivINmG2LjYsVwiLFxuICAgIFwiZWRpdFN1cnZleVwiOiBcItmI24zYsdin24zYtCDZhti42LHYs9mG2KzbjFwiLFxuICAgIFwiZGVsU2VsT2JqZWN0XCI6IFwi2K3YsNmBINmF2YjYsdivINin2YbYqtiu2KfYqNuMXCIsXG4gICAgXCJlZGl0U2VsT2JqZWN0XCI6IFwi2YjbjNix2KfbjNi0INmF2YjYsdivINin2YbYqtiu2KfYqNuMXCIsXG4gICAgXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25JdGVtVGV4dFwiOiBcItmG2YXYp9uM2LQg2YXbjCDYr9mH2K8g2Kfar9ixOlwiXG4gIH0sXG4gIFwicGVcIjoge1xuICAgIFwiYXBwbHlcIjogXCLYp9i52YXYp9mEXCIsXG4gICAgXCJva1wiOiBcItiq2KfbjNuM2K9cIixcbiAgICBcInNhdmVcIjogXCLYsNiu24zYsdmHXCIsXG4gICAgXCJzYXZlVG9vbHRpcFwiOiBcItiw2K7bjNix2YdcIixcbiAgICBcImNhbmNlbFwiOiBcItmE2LrZiFwiLFxuICAgIFwicmVzZXRcIjogXCLYqNin2LLZhti02KfZhtuMXCIsXG4gICAgXCJyZWZyZXNoXCI6IFwi2KrYp9iy2Ycg2LPYp9iy24xcIixcbiAgICBcImRlbGV0ZVwiOiBcItit2LDZgVwiLFxuICAgIFwiYWRkXCI6IFwi2KfZgdiy2YjYr9mGXCIsXG4gICAgXCJhZGROZXdcIjogXCLYp9mB2LLZiNiv2YZcIixcbiAgICBcImFkZEl0ZW1cIjogXCLYqNix2KfbjCDYp9i22KfZgdmHINqp2LHYr9mGINuM2qkg2KLbjNiq2YUg2qnZhNuM2qkg2qnZhtuM2K8uLi5cIixcbiAgICBcImFkZE90aGVyXCI6IFwi2LPYp9uM2LFcIixcbiAgICBcImFkZFNlbGVjdEFsbFwiOiBcItin2YbYqtiu2KfYqCDZh9mF2YdcIixcbiAgICBcImFkZE5vbmVcIjogXCLZh9uM2obaqdiv2KfZhVwiLFxuICAgIFwicmVtb3ZlQWxsXCI6IFwi2K3YsNmBINmH2YXZh1wiLFxuICAgIFwiZWRpdFwiOiBcItmI24zYsdin24zYtFwiLFxuICAgIFwiYmFja1wiOiBcItio2KfYstqv2LTYqlwiLFxuICAgIFwiYmFja1Rvb2x0aXBcIjogXCLYqNin2LLar9i02Kog2KjYr9mI2YYg2LDYrtuM2LHZh1wiLFxuICAgIFwic2F2ZUFuZEJhY2tcIjogXCLYsNiu24zYsdmHINmIINio2KfYstqv2LTYqlwiLFxuICAgIFwic2F2ZUFuZEJhY2tUb29sdGlwXCI6IFwi2LDYrtuM2LHZhyDZiCDYqNin2LLar9i02KpcIixcbiAgICBcImVkaXRDaG9pY2VzXCI6IFwi2YjbjNix2KfbjNi0INin2YbYqtiu2KfYqCDZh9inXCIsXG4gICAgXCJzaG93Q2hvaWNlc1wiOiBcItmG2YXYp9uM2LQg2KfZhtiq2K7Yp9ioINmH2KdcIixcbiAgICBcIm1vdmVcIjogXCLYrNin2KjYrNin24zbjFwiLFxuICAgIFwiZW1wdHlcIjogXCI82K7Yp9mE24w+XCIsXG4gICAgXCJmYXN0RW50cnlcIjogXCLYqtqp2YXbjNmEINiz2LHbjNi5XCIsXG4gICAgXCJmb3JtRW50cnlcIjogXCLYqtqp2YXbjNmEINmB2LHZhVwiLFxuICAgIFwidGVzdFNlcnZpY2VcIjogXCLYqNix2LHYs9uMINiz2LHZiNuM2LNcIixcbiAgICBcIml0ZW1TZWxlY3RvckVtcHR5XCI6IFwi2YTYt9mB2Kcg24zaqSDYp9mE2YXYp9mGINix2Kcg2KfZhtiq2K7Yp9ioINqp2YbbjNivIFwiLFxuICAgIFwiY29uZGl0aW9uQWN0aW9uRW1wdHlcIjogXCLZhNi32YHYpyDYudmF2YTaqdix2K8g2LHYpyDYp9mG2KrYrtin2Kgg2qnZhtuM2K9cIixcbiAgICBcImNvbmRpdGlvblNlbGVjdFF1ZXN0aW9uXCI6IFwi2KfZhtiq2K7Yp9ioINiz2YjYp9mELi4uXCIsXG4gICAgXCJjb25kaXRpb25TZWxlY3RQYWdlXCI6IFwi2KfZhtiq2K7Yp9ioINi12YHYrdmHLi4uXCIsXG4gICAgXCJjb25kaXRpb25TZWxlY3RQYW5lbFwiOiBcItin2YbYqtiu2KfYqCDZvtmG2YQuLi5cIixcbiAgICBcImNvbmRpdGlvblZhbHVlUXVlc3Rpb25UaXRsZVwiOiBcItmE2LfZgdinINmF2YLYr9in2LEg2LHYpyDYp9mG2KrYrtin2KggLyDZiNin2LHYryDaqdmG24zYr1wiLFxuICAgIFwiZXhwcmVzc2lvbkhlbHBcIjogXCLZhNi32YHYpyDbjNqpINi52KjYp9ix2Kog2KrZiNi124zZgduMINix2Kcg2YjYp9ix2K8g2qnZhtuM2K8uINi02YXYpyDZhdmF2qnZhiDYp9iz2Kog2KfYsiDaqdix2YjYtNmHINio2LHYp9uMINiv2LPYqtix2LPbjCDYqNmHINmF2YLYr9in2LEg2LPZiNin2YTYp9iqINin2LPYqtmB2KfYr9mHINqp2YbbjNivLiDYqNix2KfbjCDZhdir2KfZhDoge3F1ZXN0aW9uMX0gPSAndmFsdWUxJyBvciAoe3F1ZXN0aW9uMn0gPSAzIGFuZCB7cXVlc3Rpb24zfSA8IDUpXCIsXG4gICAgXCJhY2VFZGl0b3JIZWxwXCI6IFwi2KjYsdin24wg2YXYtNin2YfYr9mHINmG2qnYp9iqINiq2qnZhduM2YTbjCBjdHJsK3NwYWNlINix2Kcg2KjZgdi02KfYsduM2K9cIixcbiAgICBcImFjZUVkaXRvclJvd1RpdGxlXCI6IFwi2LPYt9ixINmB2LnZhNuMXCIsXG4gICAgXCJhY2VFZGl0b3JQYW5lbFRpdGxlXCI6IFwi2b7ZhtmEINmB2LnZhNuMXCIsXG4gICAgXCJzaG93TW9yZVwiOiBcItio2LHYp9uMINin2LfZhNin2LnYp9iqINio24zYtNiq2LEg2YTYt9mB2Kcg2LPZhtivINix2KfZh9mG2YXYpyDYsdinINmF2LfYp9mE2LnZhyDaqdmG24zYr1wiLFxuICAgIFwiYXNzaXN0YW50VGl0bGVcIjogXCLYs9mI2KfZhNin2Kog2YXZiNis2YjYrzpcIixcbiAgICBcImNlbGxzRW1wdHlSb3dzQ29sdW1uc1wiOiBcItit2K/Yp9mC2YQg2KjYp9uM2K8g24zaqSDYs9i32LEg24zYpyDYs9iq2YjZhiDZiNis2YjYryDYr9in2LTYqtmHINio2KfYtNivLlwiLFxuICAgIFwicHJvcGVydHlJc0VtcHR5XCI6IFwi2YTYt9mB2Kcg24zaqSDZhdmC2K/Yp9ixINmI2KfYsdivINqp2YbbjNivXCIsXG4gICAgXCJwcm9wZXJ0eUlzTm9VbmlxdWVcIjogXCLZhNi32YHYp9mLINuM2qkg2YXZgtiv2KfYsSDZhdmG2K3YtdixINio2Ycg2YHYsdivINmI2KfYsdivINqp2YbbjNivXCIsXG4gICAgXCJwcm9wZXJ0eU5hbWVJc05vdFVuaXF1ZVwiOiBcItmE2LfZgdin2Ysg24zaqSDZhtin2YUg2YXZhtit2LXYsSDYqNmHINmB2LHYryDZiNin2LHYryDaqdmG24zYr1wiLFxuICAgIFwibGlzdElzRW1wdHlcIjogXCLbjNqpINii24zYqtmFINis2K/bjNivINin2LbYp9mB2Ycg2qnZhtuM2K9cIixcbiAgICBcImV4cHJlc3Npb25Jc0VtcHR5XCI6IFwi2LnYqNin2LHYqiDYrtin2YTbjCDYp9iz2KpcIixcbiAgICBcInZhbHVlXCI6IFwi2YXZgtiv2KfYsVwiLFxuICAgIFwidGV4dFwiOiBcItmF2KrZhlwiLFxuICAgIFwicm93aWRcIjogXCLYtNmG2KfYs9mHINuMINiz2LfYsVwiLFxuICAgIFwiaW1hZ2VMaW5rXCI6IFwi2YTbjNmG2qkg2KrYtdmI24zYsVwiLFxuICAgIFwiY29sdW1uRWRpdFwiOiBcItmI24zYsdin24zYtCDYs9iq2YjZhjogezB9XCIsXG4gICAgXCJpdGVtRWRpdFwiOiBcItmI24zYsdin24zYtCDYotuM2KrZhTogezB9XCIsXG4gICAgXCJ1cmxcIjogXCLYotiv2LHYsyDZiNioINiz2KfbjNiqKHVybClcIixcbiAgICBcInBhdGhcIjogXCLYotiv2LHYs1wiLFxuICAgIFwidmFsdWVOYW1lXCI6IFwi2YbYp9mFINmF2YLYr9in2LFcIixcbiAgICBcInRpdGxlTmFtZVwiOiBcItmG2KfZhSDYudmG2YjYp9mGXCIsXG4gICAgXCJ0aXRsZVBsYWNlaG9sZGVyXCI6IFwi2LnZhtmI2KfZhiDYsdinINin24zZhtis2Kcg2YjYp9ix2K8g2qnZhtuM2K9cIixcbiAgICBcInN1cnZleVRpdGxlUGxhY2Vob2xkZXJcIjogXCLYudmG2YjYp9mGINmG2LjYsdiz2YbYrNuMINix2Kcg2KfbjNmG2KzYpyDZiNin2LHYryDaqdmG24zYr1wiLFxuICAgIFwicGFnZVRpdGxlUGxhY2Vob2xkZXJcIjogXCLYudmG2YjYp9mGINi12YHYrdmHINix2Kcg2KfbjNmG2KzYpyDZiNin2LHYryDaqdmG24zYr1wiLFxuICAgIFwiZGVzY3JpcHRpb25QbGFjZWhvbGRlclwiOiBcItiq2YjYttuM2K3Yp9iqINix2Kcg2YjYp9ix2K8g2qnZhtuM2K9cIixcbiAgICBcInN1cnZleURlc2NyaXB0aW9uUGxhY2Vob2xkZXJcIjogXCLYqtmI2LbbjNit2KfYqiDZhti42LHYs9mG2KzbjCDYsdinINmI2KfYsdivINqp2YbbjNivXCIsXG4gICAgXCJwYWdlRGVzY3JpcHRpb25QbGFjZWhvbGRlclwiOiBcItiq2YjYttuM2K3Yp9iqINi12YHYrdmHINix2Kcg2YjYp9ix2K8g2qnZhtuM2K9cIixcbiAgICBcImhhc090aGVyXCI6IFwi2K/Yp9ix2KfbjCDYotuM2KrZhSDYr9uM2q/YsVwiLFxuICAgIFwib3RoZXJUZXh0XCI6IFwi2LPYp9uM2LEg2KLbjNiq2YUg2YfYp9uMINmF2KrZhlwiLFxuICAgIFwiaGFzTm9uZVwiOiBcItmH24zahiDYotuM2KrZhduMINmG2K/Yp9ix2K9cIixcbiAgICBcIm5vbmVUZXh0XCI6IFwi2YfbjNqGINii24zYqtmFINmF2KrZhtuMINmI2KzZiNivINmG2K/Yp9ix2K9cIixcbiAgICBcImhhc1NlbGVjdEFsbFwiOiBcItmH2YXZhyDZhdmI2KfYsdivINin2YbYqtiu2KfYqCDYtNiv2Ycg2KfYs9iqXCIsXG4gICAgXCJzZWxlY3RBbGxUZXh0XCI6IFwi2KfZhtiq2K7Yp9ioINmH2YXZhyDYotuM2KrZhSDZh9in24wg2YXYqtmGXCIsXG4gICAgXCJjaG9pY2VzTWluXCI6IFwi2K3Yr9in2YLZhCDZhdmC2K/Yp9ixINio2LHYp9uMINin24zYrNin2K8g2K7ZiNiv2qnYp9ixINii24zYqtmFINmH2KdcIixcbiAgICBcImNob2ljZXNNYXhcIjogXCLYrdiv2Kfaqdir2LEg2YXZgtiv2KfYsSDYqNix2KfbjCDYp9uM2KzYp9ivINiu2YjYryDYotuM2KrZhSDZh9inXCIsXG4gICAgXCJjaG9pY2VzU3RlcFwiOiBcItiq2YHYp9mI2Kog2KjbjNmGINmF2YjYp9ix2K8g2KrZiNmE24zYryDYtNiv2Ycg2K7ZiNiv2qnYp9ixXCIsXG4gICAgXCJuYW1lXCI6IFwi2YbYp9mFXCIsXG4gICAgXCJ0aXRsZVwiOiBcIti52YbZiNin2YZcIixcbiAgICBcImNlbGxUeXBlXCI6IFwi2YbZiNi5INiz2YTZiNmEXCIsXG4gICAgXCJjb2xDb3VudFwiOiBcItiq2LnYr9in2K8g2LPYqtmI2YZcIixcbiAgICBcImNob2ljZXNPcmRlclwiOiBcItiq2LHYqtuM2Kgg2q/YstuM2YbZhyDYsdinINin2YbYqtiu2KfYqCDaqdmG24zYr1wiLFxuICAgIFwidmlzaWJsZVwiOiBcItmG2YXYp9uM2LQg2K/Yp9iv2Ycg2LTZiNiv2J9cIixcbiAgICBcImlzUmVxdWlyZWRcIjogXCLYttix2YjYsduMINin2LPYqtifXCIsXG4gICAgXCJpc0FsbFJvd1JlcXVpcmVkXCI6IFwi2YbbjNin2LIg2KjZhyDZvtin2LPYriDYqNix2KfbjCDZh9mF2Ycg2LPYt9ix2YfYp1wiLFxuICAgIFwicmVxdWlyZWRFcnJvclRleHRcIjogXCLZhdiq2YYg2K7Yt9in24wg2YXZiNix2K/ZhtuM2KfYslwiLFxuICAgIFwic3RhcnRXaXRoTmV3TGluZVwiOiBcItio2Kcg2LPYt9ixINis2K/bjNivINi02LHZiNi5INi02YjYr9ifXCIsXG4gICAgXCJyb3dzXCI6IFwi2KrYudiv2KfYryDYs9i32LFcIixcbiAgICBcImNvbHNcIjogXCLYqti52K/Yp9ivINiz2KrZiNmGXCIsXG4gICAgXCJwbGFjZUhvbGRlclwiOiBcItmG2q/Zh9iv2KfYsdmG2K/ZhyDZhdiq2YZcIixcbiAgICBcInNob3dQcmV2aWV3XCI6IFwi2b7bjNi0INmG2YXYp9uM2LQg2KrYtdmI24zYsSDZhti02KfZhiDYr9in2K/ZhyDYtNmI2K/Yn1wiLFxuICAgIFwic3RvcmVEYXRhQXNUZXh0XCI6IFwi2LDYrtuM2LHZhyDaqdix2K/ZhiDZhdit2KrZiNin24wg2YHYp9uM2YQg2K/YsSBKU09OINio2Ycg2LnZhtmI2KfZhiDZhdiq2YZcIixcbiAgICBcIm1heFNpemVcIjogXCLYrdiv2Kfaqdir2LEg2LPYp9uM2LIg2KjZhyDYqNin24zYqlwiLFxuICAgIFwiaW1hZ2VIZWlnaHRcIjogXCLYp9ix2KrZgdin2Lkg2KrYtdmI24zYsVwiLFxuICAgIFwiaW1hZ2VXaWR0aFwiOiBcIti52LHYtiDYqti12YjbjNixXCIsXG4gICAgXCJyb3dDb3VudFwiOiBcItiq2LnYr9in2K8g2LPYt9ixXCIsXG4gICAgXCJjb2x1bW5MYXlvdXRcIjogXCLZgtin2YTYqCDYs9iq2YjZhiDZh9inXCIsXG4gICAgXCJhZGRSb3dMb2NhdGlvblwiOiBcItin2LbYp9mB2Ycg2qnYsdiv2YYg2YXZiNmC2LnbjNiqINiv2qnZhdmHINiz2LfYsduMXCIsXG4gICAgXCJhZGRSb3dUZXh0XCI6IFwi2YXYqtmGINiv2qnZhdmHINiv2LHYrCDYs9i32LFcIixcbiAgICBcInJlbW92ZVJvd1RleHRcIjogXCLZhdiq2YYg2K/aqdmF2Ycg2K3YsNmBINiz2LfYsVwiLFxuICAgIFwicmF0ZU1pblwiOiBcItit2K/Yp9mC2YQg2YXbjNiy2KfZhlwiLFxuICAgIFwicmF0ZU1heFwiOiBcItit2K/Yp9qp2KvYsSDZhduM2LLYp9mGXCIsXG4gICAgXCJyYXRlU3RlcFwiOiBcItmF24zYstin2YYg2YXYsdin2K3ZhFwiLFxuICAgIFwibWluUmF0ZURlc2NyaXB0aW9uXCI6IFwi2KrZiNi224zYrSDYrdiv2KfZgtmEINin2YXYqtuM2KfYslwiLFxuICAgIFwibWF4UmF0ZURlc2NyaXB0aW9uXCI6IFwi2KrZiNi224zYrSDYrdiv2Kfaqdir2LEg2KfZhdiq24zYp9iyXCIsXG4gICAgXCJpbnB1dFR5cGVcIjogXCLZhtmI2Lkg2YjYsdmI2K/bjFwiLFxuICAgIFwib3B0aW9uc0NhcHRpb25cIjogXCLZhtmI2LTYqtmHINin2YbYqtiu2KfYqCDZh9inXCIsXG4gICAgXCJkZWZhdWx0VmFsdWVcIjogXCLZhdmC2K/Yp9ixINm+24zYtCDZgdix2LZcIixcbiAgICBcImNlbGxzRGVmYXVsdFJvd1wiOiBcItmF2KrZhiDZvtuM2LQg2YHYsdi2INiz2YTZiNmEINmH2KdcIixcbiAgICBcInN1cnZleUVkaXRvclRpdGxlXCI6IFwi2YjbjNix2KfbjNi0INmG2LjYsdiz2YbYrNuMXCIsXG4gICAgXCJxRWRpdG9yVGl0bGVcIjogXCLZiNuM2LHYp9uM2LQg2LPZiNin2YQ6IHswfVwiLFxuICAgIFwibWF4TGVuZ3RoXCI6IFwi2YXYp9qp2LLbjNmF2YUg2LfZiNmEXCIsXG4gICAgXCJidWlsZEV4cHJlc3Npb25cIjogXCLYs9in2K7YqtmGXCIsXG4gICAgXCJlZGl0RXhwcmVzc2lvblwiOiBcItmI24zYsdin24zYtFwiLFxuICAgIFwiYW5kXCI6IFwi2YhcIixcbiAgICBcIm9yXCI6IFwi24zYp1wiLFxuICAgIFwicmVtb3ZlXCI6IFwi2K3YsNmBXCIsXG4gICAgXCJhZGRDb25kaXRpb25cIjogXCLYp9i22KfZgdmHINqp2LHYr9mGINi02LHYt1wiLFxuICAgIFwic2hvd1RpdGxlXCI6IFwi2YbZhdin24zYtC/ZvtmG2YfYp9mGINqp2LHYr9mGINi52YbZiNin2YZcIixcbiAgICBcImV4cGFuZENvbGxhcHNlVGl0bGVcIjogXCLZhtmF2KfbjNi0L9m+2YbZh9in2YYg2qnYsdiv2YYg2LnZhtmI2KfZhlwiLFxuICAgIFwibG9jYWxlXCI6IFwi2LLYqNin2YYg2b7bjNi0INmB2LHYtlwiLFxuICAgIFwic2ltdWxhdG9yXCI6IFwi2KfZhtiq2K7Yp9ioINiv2LPYqtqv2KfZh1wiLFxuICAgIFwibGFuZHNjYXBlT3JpZW50YXRpb25cIjogXCLYp9mB2YLbjFwiLFxuICAgIFwibW9kZVwiOiBcItit2KfZhNiqICjZiNuM2LHYp9uM2LQv2K7ZiNin2YbYr9mGKVwiLFxuICAgIFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIjogXCLZvtin2qnYs9in2LLbjCDZhdmC2KfYr9uM2LEg2b7ZhtmH2KfZhlwiLFxuICAgIFwiY29va2llTmFtZVwiOiBcItmG2KfZhSDaqdmI2qnbjCAo2KjZhyDZhdmG2LjZiNixINis2YTZiNqv24zYsduMINin2LIg2KfYrNix2KfbjCDYr9mI2KjYp9ix2Ycg2YbYuNix2LPZhtis24wpXCIsXG4gICAgXCJzZW5kUmVzdWx0T25QYWdlTmV4dFwiOiBcItin2LHYs9in2YQg2YbYqtin24zYrCDZhti42LHYs9mG2KzbjCDYr9ixINi12YHYrdmHINio2LnYr9uMXCIsXG4gICAgXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiOiBcItiw2K7bjNix2Ycg2YXZgtiv2KfYsSAn2LPYp9uM2LEnINiv2LEg2YHbjNmE2K8g2KzYr9in2q/Yp9mG2YdcIixcbiAgICBcInNob3dQYWdlVGl0bGVzXCI6IFwi2YbZhdin24zYtCDYudmG2YjYp9mGINi12YHYrdin2KpcIixcbiAgICBcInNob3dQYWdlTnVtYmVyc1wiOiBcItmG2YXYp9uM2LQg2LTZhdin2LHZhyDYtdmB2K3Yp9iqXCIsXG4gICAgXCJwYWdlUHJldlRleHRcIjogXCLZhdiq2YYg2K/aqdmF2Ycg2LXZgdit2Ycg2YLYqNmE24xcIixcbiAgICBcInBhZ2VOZXh0VGV4dFwiOiBcItmF2KrZhiDYr9qp2YXZhyDYtdmB2K3ZhyDYqNi52K/bjFwiLFxuICAgIFwiY29tcGxldGVUZXh0XCI6IFwi2YXYqtmGINiv2qnZhdmHINiq2qnZhduM2YQg2YbYuNix2LPZhtis24xcIixcbiAgICBcInByZXZpZXdUZXh0XCI6IFwi2b7bjNi0INmG2YXYp9uM2LQg2YXYqtmGINiv2qnZhdmHXCIsXG4gICAgXCJlZGl0VGV4dFwiOiBcItmI24zYsdin24zYtCDZhdiq2YYg2K/aqdmF2YdcIixcbiAgICBcInN0YXJ0U3VydmV5VGV4dFwiOiBcItmF2KrZhiDYr9qp2YXZhyDYtNix2YjYuSDZhti42LHYs9mG2KzbjFwiLFxuICAgIFwic2hvd05hdmlnYXRpb25CdXR0b25zXCI6IFwi2YbZhdin24zYtCDYr9qp2YXZhyDZh9in24wg2YbYp9mI2KjYsduMICjZhtin2YjYqNix24wg2b7bjNi0INmB2LHYtilcIixcbiAgICBcInNob3dQcmV2QnV0dG9uXCI6IFwi2YbZhdin24zYtCDYr9qp2YXZhyDZgtio2YTbjCAo2qnYp9ix2KjYsSDZhdmF2qnZhiDYp9iz2Kog2KjZhyDYtdmB2K3ZhyDZgtio2YQg2KjYsdqv2LHYr9ivKVwiLFxuICAgIFwiZmlyc3RQYWdlSXNTdGFydGVkXCI6IFwi2LXZgdit2Ycg2KfZiNmEINiv2LEg2YbYuNix2LPZhtis24wg2YbZgti32Ycg2KLYutin2LLbjNmGINii2YYg2KfYs9iqLlwiLFxuICAgIFwic2hvd0NvbXBsZXRlZFBhZ2VcIjogXCLZhtmF2KfbjNi0INi12YHYrdmHINin2KrZhdin2YUg2YbYuNix2LPZhtis24wg2K/YsSDZvtin24zYp9mGIChjb21wbGV0ZWRIdG1sKVwiLFxuICAgIFwiZ29OZXh0UGFnZUF1dG9tYXRpY1wiOiBcItio2Kcg2b7Yp9iz2K7ar9mI24zbjCDYqNmHINiq2YXYp9mFINiz2YjYp9mE2KfYqtiMINio2Ycg2LXZiNix2Kog2KfYqtmI2YXYp9iq24zaqSDYqNmHINi12YHYrdmHINio2LnYryDYqNix2YjYr1wiLFxuICAgIFwic2hvd1Byb2dyZXNzQmFyXCI6IFwi2YbZhdin24zYtCDZhti02KfZhtqv2LEg2b7bjNi02LHZgdiqXCIsXG4gICAgXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIjogXCLZhdit2YQg2LnZhtmI2KfZhiDYs9mI2KfZhFwiLFxuICAgIFwicmVxdWlyZWRUZXh0XCI6IFwi2LPZiNin2YTYp9iqINmG2LTYp9mGINiv2KfYsSDYp9is2KjYp9ix24wg2YfYs9iq2YbYr1wiLFxuICAgIFwicXVlc3Rpb25TdGFydEluZGV4XCI6IFwi2YbZhdin24zZhyDYtNix2YjYuSDYs9mI2KfZhNin2KogKNux2IzbsiDbjNinIGEg2YggYilcIixcbiAgICBcInNob3dRdWVzdGlvbk51bWJlcnNcIjogXCLZhtmF2KfbjNi0INi02YXYp9ix2Ycg2YfYp9uMINiz2YjYp9mE2KfYqlwiLFxuICAgIFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCI6IFwi2YLYp9mE2Kgg2LnZhtmI2KfZhiDYs9mI2KfZhNiMINio2Ycg2LXZiNix2Kog2b7bjNi0INmB2LHYtjogJ3tub30uIHtyZXF1aXJlfSB7dGl0bGV9J1wiLFxuICAgIFwicXVlc3Rpb25FcnJvckxvY2F0aW9uXCI6IFwi2YXYrdmEINiu2LfYp9uMINiz2YjYp9mEXCIsXG4gICAgXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWNcIjogXCLYqtmF2LHaqdiyINio2LEg2LHZiNuMINin2YjZhNuM2YYg2LPZiNin2YQg2KjYpyDYqti624zbjNixINi12YHYrdmHXCIsXG4gICAgXCJxdWVzdGlvbnNPcmRlclwiOiBcItiq2LHYqtuM2Kgg2KfZhNmF2KfZhiDZh9inINiv2LEg2LXZgdit2YdcIixcbiAgICBcIm1heFRpbWVUb0ZpbmlzaFwiOiBcItmG2YfYp9uM2Kog2LLZhdin2YYg2KjYsdin24wg2KfYqtmF2KfZhSDZhti42LHYs9mG2KzbjFwiLFxuICAgIFwibWF4VGltZVRvRmluaXNoUGFnZVwiOiBcItmG2YfYp9uM2Kog2LLZhdin2YYg2KjYsdin24wg2KfYqtmF2KfZhSDYp9uM2YYg2LXZgdit2Ycg2YbYuNix2LPZhtis24xcIixcbiAgICBcInNob3dUaW1lclBhbmVsXCI6IFwi2YbZhdin24zYtCDZvtmG2YQg2LLZhdin2YYg2LPZhtisXCIsXG4gICAgXCJzaG93VGltZXJQYW5lbE1vZGVcIjogXCLZhtmF2KfbjNi0INit2KfZhNiqINm+2YbZhCDYstmF2KfZhiDYs9mG2KxcIixcbiAgICBcInJlbmRlck1vZGVcIjogXCLYrdin2YTYqiDYsdmG2K/YsVwiLFxuICAgIFwiYWxsb3dBZGRQYW5lbFwiOiBcItin2KzYp9iy2Ycg2KfZgdiy2YjYr9mGINm+2YbZhFwiLFxuICAgIFwiYWxsb3dSZW1vdmVQYW5lbFwiOiBcItin2KzYp9iy2Ycg2K3YsNmBINm+2YbZhFwiLFxuICAgIFwicGFuZWxBZGRUZXh0XCI6IFwi2YXYqtmGINin2YHYstmI2K/ZhiDZvtmG2YRcIixcbiAgICBcInBhbmVsUmVtb3ZlVGV4dFwiOiBcItmF2KrZhiDYrdiw2YEg2b7ZhtmEXCIsXG4gICAgXCJpc1NpbmdsZVBhZ2VcIjogXCLZhtmF2KfbjNi0INiq2YXYp9mFINin2YTZhdin2YYg2YfYpyDYr9ixINuM2qkg2LXZgdit2YdcIixcbiAgICBcImh0bWxcIjogXCJIdG1sXCIsXG4gICAgXCJleHByZXNzaW9uXCI6IFwi2LnYqNin2LHYqlwiLFxuICAgIFwibWluVmFsdWVcIjogXCLYrdiv2KfZgtmEINmF2YLYr9in2LFcIixcbiAgICBcIm1heFZhbHVlXCI6IFwi2K3Yr9in2qnYq9ixINmF2YLYr9in2LFcIixcbiAgICBcIm1pbkxlbmd0aFwiOiBcItit2K/Yp9mC2YQg2LfZiNmEXCIsXG4gICAgXCJhbGxvd0RpZ2l0c1wiOiBcItin2YXaqdin2YYg2YjYsdmI2K8g2KfYudiv2KfYr1wiLFxuICAgIFwibWluQ291bnRcIjogXCLYrdiv2KfZgtmEINiq2LnYr9in2K8gXCIsXG4gICAgXCJtYXhDb3VudFwiOiBcItit2K/Yp9qp2KvYsSDZhdmC2K/Yp9ixXCIsXG4gICAgXCJyZWdleFwiOiBcItmB2LHZhdiqINi12K3bjNitINi52KjYp9ix2KogXCIsXG4gICAgXCJ0b3RhbFRleHRcIjogXCLZhdiq2YYg2qnYp9mF2YRcIixcbiAgICBcInRvdGFsVHlwZVwiOiBcItmG2YjYuSDaqdin2YXZhFwiLFxuICAgIFwidG90YWxFeHByZXNzaW9uXCI6IFwi2LnYqNin2LHYqiDaqdin2YXZhFwiLFxuICAgIFwidG90YWxEaXNwbGF5U3R5bGVcIjogXCLYs9io2qkg2YbZhdin24zYtCDaqdmEXCIsXG4gICAgXCJ0b3RhbEN1cnJlbmN5XCI6IFwi2YXYrNmF2YjYuSDYp9ix2LJcIixcbiAgICBcInRvdGFsRm9ybWF0XCI6IFwi2YXYrNmF2YjYuSDZgdix2YXYqlwiLFxuICAgIFwibG9nb1Bvc2l0aW9uXCI6IFwi2YXYrdmEINmC2LHYp9ix2q/bjNix24wg2YTZiNqv2YhcIixcbiAgICBcImFkZExvZ29cIjogXCLYp9i22KfZgdmHINqp2LHYr9mGINmE2Yjar9mILi4uXCIsXG4gICAgXCJjaGFuZ2VMb2dvXCI6IFwi2KrYutuM24zYsSDZhNmI2q/ZiC4uLlwiLFxuICAgIFwibG9nb1Bvc2l0aW9uc1wiOiB7XG4gICAgICBcIm5vbmVcIjogXCLYrdiw2YEg2YTZiNqv2YhcIixcbiAgICAgIFwibGVmdFwiOiBcItqG2b5cIixcbiAgICAgIFwicmlnaHRcIjogXCLYsdin2LPYqlwiLFxuICAgICAgXCJ0b3BcIjogXCLYqNiu2LQg2KjYp9mE2KdcIixcbiAgICAgIFwiYm90dG9tXCI6IFwi2KjYrti0INm+2KfbjNuM2YZcIlxuICAgIH0sXG4gICAgXCJ0YWJzXCI6IHtcbiAgICAgIFwiZ2VuZXJhbFwiOiBcIti52YXZiNmF24xcIixcbiAgICAgIFwiZmlsZU9wdGlvbnNcIjogXCLYp9mG2KrYrtin2Kgg2YfYp1wiLFxuICAgICAgXCJodG1sXCI6IFwi2YjbjNix2KfbjNi02q/YsSBIVE1MXCIsXG4gICAgICBcImNvbHVtbnNcIjogXCLYs9iq2YjZhiDZh9inXCIsXG4gICAgICBcInJvd3NcIjogXCLYs9i32LHZh9inXCIsXG4gICAgICBcImNob2ljZXNcIjogXCLYp9mG2KrYrtin2Kgg2YfYp1wiLFxuICAgICAgXCJpdGVtc1wiOiBcItii24zYqtmFINmH2KdcIixcbiAgICAgIFwidmlzaWJsZUlmXCI6IFwi2YbZhdin24zYtCDYr9ixINi12YjYsdiqXCIsXG4gICAgICBcImVuYWJsZUlmXCI6IFwi2YHYudin2YQg2Kfar9ixXCIsXG4gICAgICBcInJlcXVpcmVkSWZcIjogXCLZhdmI2LHYryDZhtuM2KfYsiDYp9in2q/YsVwiLFxuICAgICAgXCJyYXRlVmFsdWVzXCI6IFwi2YXZgtin2K/bjNixINix2KrYqNmHINio2YbYr9uMXCIsXG4gICAgICBcImNob2ljZXNCeVVybFwiOiBcItin2YbYqtiu2KfYqCDZh9inINin2LIg2YjYqFwiLFxuICAgICAgXCJtYXRyaXhDaG9pY2VzXCI6IFwi2KfZhtiq2K7Yp9ioINmH2KfbjCDZvtuM2LTZgdix2LZcIixcbiAgICAgIFwibXVsdGlwbGVUZXh0SXRlbXNcIjogXCLZgduM2YTYr9mH2KfbjCDZhdiq2YbbjFwiLFxuICAgICAgXCJudW1iZXJpbmdcIjogXCLYtNmF2KfYsdmHINqv2LDYp9ix24xcIixcbiAgICAgIFwidmFsaWRhdG9yc1wiOiBcItin2LnYqtio2KfYsdiz2YbYrNuMINmH2KdcIixcbiAgICAgIFwibmF2aWdhdGlvblwiOiBcItmG2KfZiNio2LHbjFwiLFxuICAgICAgXCJxdWVzdGlvblwiOiBcItiz2YjYp9mEXCIsXG4gICAgICBcInBhZ2VzXCI6IFwi2LXZgdit2KfYqlwiLFxuICAgICAgXCJjb21wbGV0ZWRIdG1sXCI6IFwiSFRNTCDYtdmB2K3ZhyDYqtqp2YXbjNmEINmG2LjYsdiz2YbYrNuMXCIsXG4gICAgICBcImNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvblwiOiBcIkh0bWwg2K/YsSDYtNix2Lcg2qnYp9mF2YQg2LTYr1wiLFxuICAgICAgXCJsb2FkaW5nSHRtbFwiOiBcIkhUTUwg2KjYp9ix2q/Ystin2LHbjFwiLFxuICAgICAgXCJ0aW1lclwiOiBcItiy2YXYp9mGINiz2YbYrC/aqdmI2KbbjNiyXCIsXG4gICAgICBcImNhbGN1bGF0ZWRWYWx1ZXNcIjogXCLZhdmC2KfYr9uM2LEg2YXYrdin2LPYqNmHINi02K9cIixcbiAgICAgIFwidHJpZ2dlcnNcIjogXCLYp9is2LHYpyDaqdmG2YbYr9mHXCIsXG4gICAgICBcInRlbXBsYXRlVGl0bGVcIjogXCLYudmG2YjYp9mGINmC2KfZhNioXCIsXG4gICAgICBcInRvdGFsc1wiOiBcItis2YXYuSDaqdmEXCIsXG4gICAgICBcImxvZ2ljXCI6IFwi2YXZhti32YJcIixcbiAgICAgIFwibGF5b3V0XCI6IFwi2obbjNiv2YXYp9mGXCIsXG4gICAgICBcImRhdGFcIjogXCLYp9i32YTYp9i52KfYqlwiLFxuICAgICAgXCJ2YWxpZGF0aW9uXCI6IFwi2KfYudiq2KjYp9ix2LPZhtis24xcIixcbiAgICAgIFwiY2VsbHNcIjogXCLYs9mE2YjZhCDZh9inXCIsXG4gICAgICBcInNob3dPbkNvbXBsZXRlZFwiOiBcItmG2YXYp9uM2LQg2KjYr9mH24zYryDYqtqp2YXbjNmEINi02K/Zh1wiLFxuICAgICAgXCJsb2dvXCI6IFwi2YTZiNqv2Ygg2K/YsSDYudmG2YjYp9mGINmG2LjYsdiz2YbYrNuMXCIsXG4gICAgICBcInNsaWRlclwiOiBcItin2LPZhNin24zYr9ixXCIsXG4gICAgICBcIm90aGVyc1wiOiBcItio2KfZgtuMINmF2YjYp9ix2K9cIlxuICAgIH0sXG4gICAgXCJlZGl0UHJvcGVydHlcIjogXCLZiNuM2LHYp9uM2LQg2K7YtdmI2LXbjNiqICd7MH0nXCIsXG4gICAgXCJpdGVtc1wiOiBcIlsg2KLbjNiq2YUg2YfYpzogezB9IF1cIixcbiAgICBcImVudGVyTmV3VmFsdWVcIjogXCLZhNi32YHYpyDbjNqpINmF2YLYr9in2LEg2YjYp9ix2K8g2qnZhtuM2K9cIixcbiAgICBcIm5vcXVlc3Rpb25zXCI6IFwi2LPZiNin2YTbjCDYr9ixINm+2LHYs9i02YbYp9mF2Ycg2K/YsdisINmG2LTYr9mHXCIsXG4gICAgXCJjcmVhdGV0cmlnZ2VyXCI6IFwi2KfYrNix2Kcg2qnZhtmG2K/ZhyDYp9uMINio2LPYp9iy24zYr1wiLFxuICAgIFwidGl0bGVLZXlib2FyZEFkb3JuZXJUaXBcIjogXCLYqNix2KfbjCDZiNuM2LHYp9uM2LQg2K/aqdmF2Ycg24wgZW50ZXIg2LHYpyDZgdi02KfYsSDYr9mH24zYry5cIixcbiAgICBcImtleWJvYXJkQWRvcm5lclRpcFwiOiBcItio2LHYp9uMINmI24zYsdin24zYtCDYr9qp2YXZhyDbjCBlbnRlciDYsdinINmB2LTYp9ixINiv2YfbjNivLCDYqNix2KfbjCDYrdiw2YEg2K/aqdmF2Ycg24wgZGVsZXRlINix2Kcg2YHYtNin2LEg2K/Zh9uM2K8sINio2LHYp9uMINit2LHaqdiqINiv2KfYr9mGINuM2qkg2KLbjNiq2YXYjCDYr9qp2YXZhyDbjCAgYWx0ICsgYXJyb3cgZG93biAvICBhbHQgKyBhcnJvdyB1cCDZgdi02KfYsSDYr9mH24zYr1wiLFxuICAgIFwia2V5Ym9hcmRNb3ZlSXRlbXNUaXBcIjogXCLYqNix2KfbjCDYrdix2qnYqiDYr9in2K/ZhiDbjNqpINii24zYqtmF2Iwg2K/aqdmF2Ycg24wgIGFsdCArIGFycm93IGRvd24gLyAgYWx0ICsgYXJyb3cgdXAg2YHYtNin2LEg2K/Zh9uM2K9cIixcbiAgICBcInRyaWdnZXJPblwiOiBcItiv2LEgXCIsXG4gICAgXCJ0cmlnZ2VyTWFrZVBhZ2VzVmlzaWJsZVwiOiBcIti12YHYrdin2Kog2LHYpyDZgtin2KjZhCDZhtmF2KfbjNi0INqp2YY6XCIsXG4gICAgXCJ0cmlnZ2VyTWFrZVF1ZXN0aW9uc1Zpc2libGVcIjogXCLYs9mI2KfZhNin2Kog2LHYpyDZgtin2KjZhCDZhtmF2KfbjNi0INqp2YY6XCIsXG4gICAgXCJ0cmlnZ2VyQ29tcGxldGVUZXh0XCI6IFwi2b7Ysdiz2LTZhtin2YXZhyDYsdinINiq2qnZhduM2YQg2qnZhiDYp9qv2LEg2YXZiNmB2YIg2KjZiNivLlwiLFxuICAgIFwidHJpZ2dlck5vdFNldFwiOiBcItin2KzYsdinINqp2YbZhtiv2Ycg2KrZhti424zZhSDZhti02K/Zhy5cIixcbiAgICBcInRyaWdnZXJSdW5JZlwiOiBcItin2KzYsdinINiv2LEg2LXZiNix2KpcIixcbiAgICBcInRyaWdnZXJTZXRUb05hbWVcIjogXCLYqti524zbjNixINmF2YLYr9in2LEg2KfYsjogXCIsXG4gICAgXCJ0cmlnZ2VyRnJvbU5hbWVcIjogXCLaqdm+24wg2YXZgtiv2KfYsSDYp9iyOiBcIixcbiAgICBcInRyaWdnZXJSdW5FeHByZXNzaW9uXCI6IFwi2KfYrNix2KfbjCDYp9uM2YYg2LnYqNin2LHYqlwiLFxuICAgIFwidHJpZ2dlclNldFZhbHVlXCI6IFwi2KjZhzogXCIsXG4gICAgXCJ0cmlnZ2VyR290b05hbWVcIjogXCLYqNmHINiz2YjYp9mEINio2LHZiNuM2K86XCIsXG4gICAgXCJ0cmlnZ2VySXNWYXJpYWJsZVwiOiBcIti52K/ZhSDYr9ix2Kwg2YXYqti624zbjNixINiv2LEg2YbYqtin24zYrCDZvtix2LPYtNmG2KfZhdmHXCIsXG4gICAgXCJ0cmlnZ2VyUnVuRXhwcmVzc2lvbkVtcHR5XCI6IFwi2YTYt9mB2Kcg2LnYqNin2LHYqiDZhdi52KrYqNix24wg2YjYp9ix2K8g2YbZhdin24zbjNivXCIsXG4gICAgXCJub0ZpbGVcIjogXCLZh9uM2oYg2YHYp9uM2YTbjCDYp9mG2KrYrtin2Kgg2YbYtNiv2Ycg2KfYs9iqXCIsXG4gICAgXCJjbG9zZVwiOiBcItio2LPYqtmGXCIsXG4gICAgXCJpdGVtVmFsdWVFZGl0XCI6IFwi2YLYp9io2YQg2YXYtNin2YfYr9mHINin2q/YsVwiLFxuICAgIFwibm90RW1wdHlcIjogXCI82YjbjNix2KfbjNi0INmF2YLYr9in2LE+XCIsXG4gICAgXCJjb25kaXRpb25CdXR0b25BZGRcIjogXCLYp9i22KfZgdmHXCIsXG4gICAgXCJjb25kaXRpb25CdXR0b25SZXBsYWNlXCI6IFwi2KzYp9uM2q/YstuM2YZcIixcbiAgICBcImNvbmRpdGlvbkhlbHBcIjogXCLZhNi32YHYpyDbjNqpINmF2YLYr9in2LEg2KjZiNmE24zZhiDYqtmI2LXbjNmB24wg2YjYp9ix2K8g2qnZhtuM2K8g2qnZhyDYtdit24zYrSDbjNinINi62YTYtyDYsdinINio2LHar9ix2K/Yp9mG2K8g2KrYpyDYtdmB2K3ZhyDYs9mI2KfZhNin2Kog2YbZhdin24zYtCDYr9in2K/ZhyDYtNmI2K8uINio2LHYp9uMINmF2KvYp9mEOiB7cXVlc3Rpb24xfSA9ICd2YWx1ZTEnIG9yICh7cXVlc3Rpb24yfSAqIHtxdWVzdGlvbjR9ICA+IDIwIGFuZCB7cXVlc3Rpb24zfSA8IDUpXCIsXG4gICAgXCJjb25kaXRpb25TaG93TW9yZVVybFwiOiBcImh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5UGFyYW1ldGVyP2lkPVF1ZXN0aW9uJnBhcmFtZXRlcj12aXNpYmxlSWZcIlxuICB9LFxuICBcInB2XCI6IHtcbiAgICBcInRydWVcIjogXCLYtdit24zYrVwiLFxuICAgIFwiZmFsc2VcIjogXCLYutmE2LdcIixcbiAgICBcImluaGVyaXRcIjogXCLYp9ix2Ksg2KjYsduMXCIsXG4gICAgXCJzaG93XCI6IFwi2KLYtNqp2KfYsVwiLFxuICAgIFwiaGlkZVwiOiBcItm+2YbZh9in2YZcIixcbiAgICBcImRlZmF1bHRcIjogXCLZvtuM2LQg2YHYsdi2XCIsXG4gICAgXCJpbml0aWFsXCI6IFwi2KfZiNmE24zZh1wiLFxuICAgIFwicmFuZG9tXCI6IFwi2KrYtdin2K/ZgduMXCIsXG4gICAgXCJjb2xsYXBzZWRcIjogXCLYrNmF2Lkg2LTYr9mHXCIsXG4gICAgXCJleHBhbmRlZFwiOiBcItio2KfYsiDYtNiv2YdcIixcbiAgICBcIm5vbmVcIjogXCLZh9uM2oYg2qnYr9in2YVcIixcbiAgICBcImFzY1wiOiBcIti12LnZiNiv24xcIixcbiAgICBcImRlc2NcIjogXCLZhtiy2YjZhNuMXCIsXG4gICAgXCJpbmRldGVybWluYXRlXCI6IFwi2YbYp9mF2LTYrti1XCIsXG4gICAgXCJkZWNpbWFsXCI6IFwi2KfYudi02KfYsduMXCIsXG4gICAgXCJjdXJyZW5jeVwiOiBcItin2LHYslwiLFxuICAgIFwicGVyY2VudFwiOiBcItiv2LHYtdivXCIsXG4gICAgXCJmaXJzdEV4cGFuZGVkXCI6IFwi2q/Ys9iq2LHYtCDbjNin2YHYqtmHXCIsXG4gICAgXCJvZmZcIjogXCLYrtin2YXZiNi0XCIsXG4gICAgXCJvblBhbmVsXCI6IFwi2LHZiNuMINm+2YbZhFwiLFxuICAgIFwib25TdXJ2ZXlcIjogXCLYsdmI24wg2YbYuNix2LPZhtis24xcIixcbiAgICBcImxpc3RcIjogXCLZhNuM2LPYqlwiLFxuICAgIFwicHJvZ3Jlc3NUb3BcIjogXCLZhtmI2KfYsSDZvtuM2LTYsdmB2KogINio2KfZhNinXCIsXG4gICAgXCJwcm9ncmVzc0JvdHRvbVwiOiBcItmG2YjYp9ixINm+24zYtNix2YHYqiDZvtin24zbjNmGXCIsXG4gICAgXCJwcm9ncmVzc1RvcEJvdHRvbVwiOiBcItmG2YjYp9ixINm+24zYtNix2YHYqiDYr9ixINio2KfZhNinINmIINm+2KfbjNuM2YZcIixcbiAgICBcImhvcml6b250YWxcIjogXCLYp9mB2YLbjFwiLFxuICAgIFwidmVydGljYWxcIjogXCLYudmF2YjYr9uMXCIsXG4gICAgXCJ0b3BcIjogXCLYqNin2YTYp1wiLFxuICAgIFwiYm90dG9tXCI6IFwi2b7Yp9uM24zZhlwiLFxuICAgIFwidG9wQm90dG9tXCI6IFwi2KjYp9mE2Kcg2Ygg2b7Yp9uM24zZhlwiLFxuICAgIFwiYm90aFwiOiBcItmH2LEg2K/ZiFwiLFxuICAgIFwibGVmdFwiOiBcItqG2b5cIixcbiAgICBcImNvbG9yXCI6IFwi2LHZhtqvXCIsXG4gICAgXCJkYXRlXCI6IFwi2KrYp9ix24zYrlwiLFxuICAgIFwiZGF0ZXRpbWVcIjogXCLYqtin2LHbjNiuINmIINiz2KfYudiqXCIsXG4gICAgXCJkYXRldGltZS1sb2NhbFwiOiBcItiq2KfYsduM2K4g2Ygg2LPZiNin2YQg2b7bjNi0INmB2LHYtlwiLFxuICAgIFwiZW1haWxcIjogXCLYp9uM2YXbjNmEXCIsXG4gICAgXCJtb250aFwiOiBcItmF2KfZh1wiLFxuICAgIFwibnVtYmVyXCI6IFwi2LnYr9ivXCIsXG4gICAgXCJwYXNzd29yZFwiOiBcItix2YXYsti52KjZiNixXCIsXG4gICAgXCJyYW5nZVwiOiBcItiv2KfZhdmG2YdcIixcbiAgICBcInRlbFwiOiBcItiq2YTZgdmGXCIsXG4gICAgXCJ0ZXh0XCI6IFwi2YXYqtmGXCIsXG4gICAgXCJ0aW1lXCI6IFwi2LLZhdin2YZcIixcbiAgICBcInVybFwiOiBcItii2K/YsdizXCIsXG4gICAgXCJ3ZWVrXCI6IFwi2YfZgdiq2YdcIixcbiAgICBcImhpZGRlblwiOiBcItmF2K7ZgduMXCIsXG4gICAgXCJvblwiOiBcItix2YjYtNmGXCIsXG4gICAgXCJvblBhZ2VcIjogXCLYsdmI24wg2LXZgdit2YdcIixcbiAgICBcImVkaXRcIjogXCLZiNuM2LHYp9uM2LRcIixcbiAgICBcImRpc3BsYXlcIjogXCLZhtmF2KfbjNi0XCIsXG4gICAgXCJvbkNvbXBsZXRlXCI6IFwi2KjZhyDZhdit2LYg2KrZhdin2YUg2LTYr9mGXCIsXG4gICAgXCJvbkhpZGRlblwiOiBcItio2Ycg2YXYrdi2INmF2K7ZgduMINi02K/ZhlwiLFxuICAgIFwiYWxsXCI6IFwi2KrZhdin2YVcIixcbiAgICBcInBhZ2VcIjogXCLYtdmB2K3Zh1wiLFxuICAgIFwic3VydmV5XCI6IFwi2YbYuNix2LPZhtis24xcIixcbiAgICBcIm9uTmV4dFBhZ2VcIjogXCLYqNmHINmF2K3YtiDYtdmB2K3ZhyDYqNi52K/bjFwiLFxuICAgIFwib25WYWx1ZUNoYW5nZWRcIjogXCLYqNmHINmF2K3YtiDYqti624zbjNixINmF2YLYr9in2LFcIixcbiAgICBcInNpbmdsZVBhZ2VcIjogXCLYqtqpINi12YHYrdmHINin24xcIixcbiAgICBcInN0YW5kYXJkXCI6IFwi2KfYs9iq2KfZhtiv2KfYsdivXCIsXG4gICAgXCJxdWVzdGlvblBlclBhZ2VcIjogXCLYs9mI2KfZhCDYr9ixINmH2LEg2LXZgdit2Ycg24wg2YXYrNiy2KdcIixcbiAgICBcIm5vUHJldmlld1wiOiBcItm+24zYtCDZhtmF2KfbjNi0INmG2K/Yp9ix2K9cIixcbiAgICBcInNob3dBbGxRdWVzdGlvbnNcIjogXCLZgdi52KfZhCDYs9in2LLbjCDZvtuM2LQg2YbZhdin24zYtCDYqNinINiq2YXYp9mFINiz2YjYp9mE2KfYqlwiLFxuICAgIFwic2hvd0Fuc3dlcmVkUXVlc3Rpb25zXCI6IFwi2YHYudin2YQg2LPYp9iy24wg2b7bjNi0INmG2YXYp9uM2LQg2KjZhyDYs9mI2KfZhNin2Kog2b7Yp9iz2K4g2K/Yp9iv2Ycg2LTYr9mHXCJcbiAgfSxcbiAgXCJvcFwiOiB7XG4gICAgXCJlbXB0eVwiOiBcItiu2KfZhNuMINio2KfYtNivXCIsXG4gICAgXCJub3RlbXB0eVwiOiBcItiu2KfZhNuMINmG2KjYp9i02K9cIixcbiAgICBcImVxdWFsXCI6IFwi2YXYs9in2YjbjCDYqNin2LTYr1wiLFxuICAgIFwibm90ZXF1YWxcIjogXCLZhdiz2KfZiNuMINmG2KjYp9i02K9cIixcbiAgICBcImNvbnRhaW5zXCI6IFwi2LTYp9mF2YRcIixcbiAgICBcIm5vdGNvbnRhaW5zXCI6IFwi2LTYp9mF2YQg2YbYqNin2LTYr1wiLFxuICAgIFwiYW55b2ZcIjogXCLZh9ix2qnYr9in2YVcIixcbiAgICBcImFsbG9mXCI6IFwi2YfZhdmHXCIsXG4gICAgXCJncmVhdGVyXCI6IFwi2KjYstix2q/YqtixXCIsXG4gICAgXCJsZXNzXCI6IFwi2qnZiNqG2qnYqtixXCIsXG4gICAgXCJncmVhdGVyb3JlcXVhbFwiOiBcItio2LLYsdqv2KrYsSDbjNinINmF2LPYp9mI24xcIixcbiAgICBcImxlc3NvcmVxdWFsXCI6IFwi2qnZiNqG2qnYqtixINuM2Kcg2YXYs9in2YjbjFwiLFxuICAgIFwiYW5kXCI6IFwi2YhcIixcbiAgICBcIm9yXCI6IFwi24zYp1wiXG4gIH0sXG4gIFwiZXdcIjoge1xuICAgIFwiYW5ndWxhclwiOiBcItin2LPYqtmB2KfYr9mHINin2LIg2YbYs9iu2YcgQW5ndWxhclwiLFxuICAgIFwianF1ZXJ5XCI6IFwi2KfYs9iq2YHYp9iv2Ycg2KfYsiDZhtiz2K7ZhyBqUXVlcnlcIixcbiAgICBcImtub2Nrb3V0XCI6IFwi2KfYs9iq2YHYp9iv2Ycg2KfYsiDZhtiz2K7ZhyDZhtin2qkg2KfZiNiqXCIsXG4gICAgXCJyZWFjdFwiOiBcItin2LPYqtmB2KfYr9mHINin2LIg2YbYs9iu2YcgUmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcItin2LPYqtmB2KfYr9mHINin2LIg2YbYs9iu2YcgVnVlXCIsXG4gICAgXCJib290c3RyYXBcIjogXCLYqNix2KfbjCDZgdix24zZhSDZiNix2qkg2KjZiNiq2LPYqtix2b5cIixcbiAgICBcIm1vZGVyblwiOiBcItiq2YUg2YXYr9ix2YZcIixcbiAgICBcImRlZmF1bHRcIjogXCLYqtmFINm+24zYtCDZgdix2LZcIixcbiAgICBcIm9yYW5nZVwiOiBcItiq2YUg2YbYp9ix2YbYrNuMXCIsXG4gICAgXCJkYXJrYmx1ZVwiOiBcItiq2YUg2KLYqNuMINiq24zYsdmHXCIsXG4gICAgXCJkYXJrcm9zZVwiOiBcItiq2YUg2LXZiNix2KrbjFwiLFxuICAgIFwic3RvbmVcIjogXCLYqtmFINiz2Ybar9uMXCIsXG4gICAgXCJ3aW50ZXJcIjogXCLYqtmFINiy2YXYs9iq2KfZhtuMXCIsXG4gICAgXCJ3aW50ZXJzdG9uZVwiOiBcItiq2YUg2LLZhdiz2KrYp9mG24wg2Ygg2LPZhtqv24xcIixcbiAgICBcInNob3dPblBhZ2VcIjogXCLZhtmF2KfbjNi0INmG2LjYsdiz2YbYrNuMINiv2LEg24zaqSDYtdmB2K3Zh1wiLFxuICAgIFwic2hvd0luV2luZG93XCI6IFwi2YbZhdin24zYtCDZhti42LHYs9mG2KzbjCDYr9ixINuM2qkg2b7Zhtis2LHZh1wiLFxuICAgIFwibG9hZEZyb21TZXJ2ZXJcIjogXCLYqNin2LHar9iy2KfYsduMIEpTT04g2KfYsiDYs9ix2YjYsVwiLFxuICAgIFwidGl0bGVTY3JpcHRcIjogXCLYp9iz2qnYsduM2b7YqiDZiCDYtNuM2YjZhyDZhtmF2KfbjNi0XCIsXG4gICAgXCJ0aXRsZUh0bWxcIjogXCJIVE1MXCIsXG4gICAgXCJ0aXRsZUphdmFTY3JpcHRcIjogXCLYrNin2YjYp9in2LPaqdix24zZvtiqXCIsXG4gICAgXCJzdGFuZGFyZFwiOiBcItio2K/ZiNmGINio2YjYqtiz2KrYsdm+XCJcbiAgfSxcbiAgXCJ0c1wiOiB7XG4gICAgXCJzZWxlY3RQYWdlXCI6IFwi2LXZgdit2Ycg2KfbjCDYsdinINio2LHYp9uMINii2LLZhdin24zYtCDYp9mG2KrYrtin2Kgg2qnZhtuM2K86XCIsXG4gICAgXCJzaG93SW52aXNpYmxlRWxlbWVudHNcIjogXCLZhtmF2KfbjNi0INin2YTZhdin2YYg2YfYp9uMINmF2K7ZgduMXCJcbiAgfSxcbiAgXCJ2YWxpZGF0b3JzXCI6IHtcbiAgICBcImFuc3dlcmNvdW50dmFsaWRhdG9yXCI6IFwi2KrYudiv2KfYryDZvtin2LPYrlwiLFxuICAgIFwiZW1haWx2YWxpZGF0b3JcIjogXCLYp9uM2YXbjNmEXCIsXG4gICAgXCJleHByZXNzaW9udmFsaWRhdG9yXCI6IFwi2LnYqNin2LHYqlwiLFxuICAgIFwibnVtZXJpY3ZhbGlkYXRvclwiOiBcIti52K/Yr1wiLFxuICAgIFwicmVnZXh2YWxpZGF0b3JcIjogXCJyZWdleFwiLFxuICAgIFwidGV4dHZhbGlkYXRvclwiOiBcItmF2KrZhlwiXG4gIH0sXG4gIFwidHJpZ2dlcnNcIjoge1xuICAgIFwiY29tcGxldGV0cmlnZ2VyXCI6IFwi2KraqdmF24zZhCDZhti42LHYs9mG2KzbjFwiLFxuICAgIFwic2V0dmFsdWV0cmlnZ2VyXCI6IFwi2KrZhti424zZhSDZhdmC2K/Yp9ixXCIsXG4gICAgXCJjb3B5dmFsdWV0cmlnZ2VyXCI6IFwi2qnZvtuMINmF2YLYr9in2LFcIixcbiAgICBcInNraXB0cmlnZ2VyXCI6IFwi2LHYryDaqdix2K/ZhiDYs9mI2KfZhCBcIixcbiAgICBcInJ1bmV4cHJlc3Npb250cmlnZ2VyXCI6IFwi2KfYrNix2KfbjCDYudio2KfYsdiqXCIsXG4gICAgXCJ2aXNpYmxldHJpZ2dlclwiOiBcItiq2LrbjNuM2LEg2YjYtti524zYqiDYr9uM2K/ZhyDYtNiv2YZcIlxuICB9LFxuICBcInBlaGVscFwiOiB7fSxcbiAgXCJwXCI6IHtcbiAgICBcIm5hbWVcIjogXCLZhtin2YVcIixcbiAgICBcInRpdGxlXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcIti52YbZiNin2YZcIixcbiAgICAgIFwidGl0bGVcIjogXCLYp9qv2LEg2K7Yp9mE24wg2KjYp9i02K8g2YXYp9mG2YbYryDZhtin2YUg2K/YsdisINmF24wg2LTZiNivXCJcbiAgICB9LFxuICAgIFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCI6IFwi2b7Yr9uM2K/Yp9ix24wg2K/aqdmF2Ycg2YfYp9uMINmG2KfZiNio2LHbjFwiLFxuICAgIFwicXVlc3Rpb25zT3JkZXJcIjogXCLYqtix2KrbjNioINiz2YjYp9mE2KfYqlwiLFxuICAgIFwibWF4VGltZVRvRmluaXNoXCI6IFwi2K3Yr9in2qnYq9ixINiy2YXYp9mGINio2LHYp9uMINiq2qnZhduM2YRcIixcbiAgICBcInZpc2libGVcIjogXCLYoti02qnYp9ixXCIsXG4gICAgXCJ2aXNpYmxlSWZcIjogXCLYoti02qnYp9ixINin2q/YsVwiLFxuICAgIFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCI6IFwi2YXZiNmC2LnbjNiqINi52YbZiNin2YYg2LPZiNin2YRcIixcbiAgICBcImRlc2NyaXB0aW9uXCI6IFwi2KrZiNi224zYrdin2KpcIixcbiAgICBcInN0YXRlXCI6IFwi2YjYtti524zYqlwiLFxuICAgIFwiaXNSZXF1aXJlZFwiOiBcItin2KzYqNin2LHbjNifXCIsXG4gICAgXCJyZXF1aXJlZElmXCI6IFwi2KfYrNio2KfYsSDYp9qv2LHYn1wiLFxuICAgIFwiaW5kZW50XCI6IFwiaW5kZW50XCIsXG4gICAgXCJyZXF1aXJlZEVycm9yVGV4dFwiOiBcItmF2KrZhiDYrti32KfbjCDYp9is2KjYp9ix24xcIixcbiAgICBcInN0YXJ0V2l0aE5ld0xpbmVcIjogXCLYtNix2YjYuSDYqNinINiu2Lcg2KzYr9uM2K8gXCIsXG4gICAgXCJpbm5lckluZGVudFwiOiBcItiq2Ygg2LHZgdiq2q/bjCDYr9in2K7ZhNuMXCIsXG4gICAgXCJwYWdlXCI6IFwi2LXZgdit2YdcIixcbiAgICBcIndpZHRoXCI6IFwi2LnYsdi2XCIsXG4gICAgXCJjb21tZW50VGV4dFwiOiBcItmF2KrZhiDZhti42LFcIixcbiAgICBcInZhbHVlTmFtZVwiOiBcItmG2KfZhSDZhdmC2K/Yp9ixXCIsXG4gICAgXCJlbmFibGVJZlwiOiBcItmB2LnYp9mEINin2q/YsVwiLFxuICAgIFwiZGVmYXVsdFZhbHVlXCI6IFwi2YXZgtiv2KfYsSDZvtuM2LQg2YHYsdi2XCIsXG4gICAgXCJjb3JyZWN0QW5zd2VyXCI6IFwi2b7Yp9iz2K4g2LXYrduM2K1cIixcbiAgICBcInJlYWRPbmx5XCI6IFwi2YHZgti3INiu2YjYp9mG2LRcIixcbiAgICBcInZhbGlkYXRvcnNcIjogXCLYp9i52KrYqNin2LHYs9mG2Kwg2YfYp1wiLFxuICAgIFwidGl0bGVMb2NhdGlvblwiOiBcItmF2K3ZhCDZgtix2KfYsdqv24zYsduMINi52YbZiNin2YZcIixcbiAgICBcImhhc0NvbW1lbnRcIjogXCLZhti42LEg2K/Yp9ix2K/Yn1wiLFxuICAgIFwiaGFzT3RoZXJcIjogXCLYs9in24zYsSDYr9in2LHYr9ifXCIsXG4gICAgXCJjaG9pY2VzXCI6IFwi2q/YstuM2YbZhyDZh9inXCIsXG4gICAgXCJjaG9pY2VzT3JkZXJcIjogXCLYqtix2KrbjNioINqv2LLbjNmG2Ycg2YfYp1wiLFxuICAgIFwiY2hvaWNlc0J5VXJsXCI6IFwi2q/YstuM2YbZhyDZh9inINio2Kcg2YTbjNmG2qlcIixcbiAgICBcIm90aGVyVGV4dFwiOiBcItmF2KrZhiDYs9in24zYsVwiLFxuICAgIFwib3RoZXJFcnJvclRleHRcIjogXCLZhdiq2YYg2K7Yt9in24wg2LPYp9uM2LFcIixcbiAgICBcInN0b3JlT3RoZXJzQXNDb21tZW50XCI6IFwi2LDYrtuM2LHZhyDYs9in24zYsSDYqNmHINi12YjYsdiqINmG2LjYsVwiLFxuICAgIFwibGFiZWxcIjogXCLYqNix2obYs9ioXCIsXG4gICAgXCJzaG93VGl0bGVcIjogXCLZhtin2YXbjNi0INi52YbZiNin2YZcIixcbiAgICBcInZhbHVlVHJ1ZVwiOiBcItmF2YLYp9iv24zYsSDYtdit24zYrVwiLFxuICAgIFwidmFsdWVGYWxzZVwiOiBcItmF2YLYp9iv24zYsSDYutmE2LdcIixcbiAgICBcImNvbHNcIjogXCLYs9iq2YjZhiDZh9inXCIsXG4gICAgXCJyb3dzXCI6IFwi2LPYt9ixINmH2KdcIixcbiAgICBcInBsYWNlSG9sZGVyXCI6IFwi2YXYrdmEINmG2q/Zh9iv2KfYsdmG2K/Zh1wiLFxuICAgIFwib3B0aW9uc0NhcHRpb25cIjogXCLYstuM2LHZhtmI24zYsyDar9iy24zZhtmHINmH2KdcIixcbiAgICBcImV4cHJlc3Npb25cIjogXCLYudio2KfYsdiqXCIsXG4gICAgXCJmb3JtYXRcIjogXCLZgdix2YXYqlwiLFxuICAgIFwiZGlzcGxheVN0eWxlXCI6IFwi2LPYqNqpINmG2YXYp9uM2LRcIixcbiAgICBcImN1cnJlbmN5XCI6IFwi2KfYsdiyXCIsXG4gICAgXCJ1c2VHcm91cGluZ1wiOiBcItin2LPYqtmB2KfYr9mHINin2LIg2q/YsdmI2Ycg2KjZhtiv24xcIixcbiAgICBcInNob3dQcmV2aWV3XCI6IFwi2b7bjNi0INmG2YXYp9uM2LRcIixcbiAgICBcImFsbG93TXVsdGlwbGVcIjogXCLYp9is2KfYstmHINqG2YbYryDYp9mG2KrYrtin2KjbjFwiLFxuICAgIFwiaW1hZ2VIZWlnaHRcIjogXCLYt9mI2YQg2LnaqdizXCIsXG4gICAgXCJpbWFnZVdpZHRoXCI6IFwi2LnYsdi2INi52qnYs1wiLFxuICAgIFwic3RvcmVEYXRhQXNUZXh0XCI6IFwi2LDYrtuM2LHZhyDYr9in2K/ZhyDYqNmHINi12YjYsdiqINmF2KrZhtuMXCIsXG4gICAgXCJtYXhTaXplXCI6IFwi2YbZh9in24zYqiDYrdis2YVcIixcbiAgICBcImh0bWxcIjogXCJodG1sXCIsXG4gICAgXCJjb2x1bW5zXCI6IFwi2LPYqtmI2YYg2YfYp1wiLFxuICAgIFwiY2VsbHNcIjogXCLYs9mE2YjZhCDZh9inXCIsXG4gICAgXCJpc0FsbFJvd1JlcXVpcmVkXCI6IFwi2KLbjNinINiq2YXYp9mFINiz2LfYsdmH2Kcg2KfYrNio2KfYsduMINin2YbYr9ifXCIsXG4gICAgXCJob3Jpem9udGFsU2Nyb2xsXCI6IFwi2KfYs9qp2LHZiNmEINin2YHZgtuMXCIsXG4gICAgXCJjZWxsVHlwZVwiOiBcItmG2YjYuSDYs9mE2YjZhFwiLFxuICAgIFwiY29sdW1uc0xheW91dFwiOiBcIti32LHYrSDYqNmG2K/bjCDYs9iq2YjZhiDZh9inXCIsXG4gICAgXCJjb2x1bW5Db2xDb3VudFwiOiBcItiq2LnYr9in2K8g2LPYqtmI2YYg2YfYp1wiLFxuICAgIFwiY29sdW1uTWluV2lkdGhcIjogXCLYrdiv2KfZgtmEINi52LHYtiDYs9iq2YjZhlwiLFxuICAgIFwicm93Q291bnRcIjogXCLYqti52K/Yp9ivINiz2LfYsVwiLFxuICAgIFwibWluUm93Q291bnRcIjogXCLYrdiv2KfZgtmEINiq2LnYr9in2K8g2LPYt9ixXCIsXG4gICAgXCJtYXhSb3dDb3VudFwiOiBcItit2K/Yp9qp2KvYsSDYqti52K/Yp9ivINiz2LfYsVwiLFxuICAgIFwia2V5TmFtZVwiOiBcItqp2YTbjNivINmG2KfZhVwiLFxuICAgIFwia2V5RHVwbGljYXRpb25FcnJvclwiOiBcItqp2YTbjNivINin2LHZiNixINqp2b7bjCBcIixcbiAgICBcImNvbmZpcm1EZWxldGVcIjogXCLYqtin24zbjNiv24zZhyDYrdiw2YFcIixcbiAgICBcImNvbmZpcm1EZWxldGVUZXh0XCI6IFwi2YXYqtmGINiq2KfbjNuM2K/bjNmHINit2LDZgVwiLFxuICAgIFwiYWRkUm93TG9jYXRpb25cIjogXCLYp9i22KfZgdmHINqp2LHYr9mGINmF2YjZgti524zYqiDYs9i32LFcIixcbiAgICBcImFkZFJvd1RleHRcIjogXCLYp9mB2LLZiNiv2YYg2YXYqtmGINiz2LfYsVwiLFxuICAgIFwicmVtb3ZlUm93VGV4dFwiOiBcItit2LDZgSDZhdiq2YYg2LPYt9ixXCIsXG4gICAgXCJpdGVtc1wiOiBcItmF2YjYp9ix2K9cIixcbiAgICBcIml0ZW1TaXplXCI6IFwi2KfYqNi52KfYryDZhdmI2LHYr1wiLFxuICAgIFwiY29sQ291bnRcIjogXCLYqti52K/Yp9ivINiz2KrZiNmGXCIsXG4gICAgXCJ0ZW1wbGF0ZVRpdGxlXCI6IFwi2LnZhtmI2KfZhiDYp9mE2q/ZiFwiLFxuICAgIFwidGVtcGxhdGVEZXNjcmlwdGlvblwiOiBcIti02LHYrSDYp9mE2q/ZiFwiLFxuICAgIFwiYWxsb3dBZGRQYW5lbFwiOiBcItin2LbYp9mB2Ycg2qnYsdiv2YYg2b7ZhtmEINmF2KzYp9iyINin2LPYqlwiLFxuICAgIFwiYWxsb3dSZW1vdmVQYW5lbFwiOiBcItit2LDZgSDaqdix2K/ZhiDZvtmG2YQg2YXYrNin2LIg2KfYs9iqXCIsXG4gICAgXCJwYW5lbENvdW50XCI6IFwi2KrYudiv2KfYryDZvtmG2YRcIixcbiAgICBcIm1pblBhbmVsQ291bnRcIjogXCLYrdiv2KfZgtmEINiq2LnYr9in2K8g2b7ZhtmEXCIsXG4gICAgXCJtYXhQYW5lbENvdW50XCI6IFwi2K3Yr9in2qnYq9ixINiq2LnYr9in2K8g2b7ZhtmEXCIsXG4gICAgXCJwYW5lbHNTdGF0ZVwiOiBcIti02LHYrSDYr9in2K/ZhiDZvtmG2YQg2YfYp1wiLFxuICAgIFwicGFuZWxBZGRUZXh0XCI6IFwi2KfYttin2YHZhyDaqdix2K/ZhiDZhdiq2YYg2KjZhyDZvtmG2YQg2YfYp1wiLFxuICAgIFwicGFuZWxSZW1vdmVUZXh0XCI6IFwi2K3YsNmBINqp2LHYr9mGINmF2KrZhiDZvtmG2YQg2YfYp1wiLFxuICAgIFwicGFuZWxQcmV2VGV4dFwiOiBcItmF2KrZhiDZgtio2YTbjCDZvtmG2YRcIixcbiAgICBcInBhbmVsTmV4dFRleHRcIjogXCLZhdiq2YYg2KjYudiv24wg2b7ZhtmEXCIsXG4gICAgXCJzaG93UXVlc3Rpb25OdW1iZXJzXCI6IFwi2YbZhdin24zYtCDYqti52K/Yp9ivINiz2YjYp9mE2KfYqlwiLFxuICAgIFwic2hvd1JhbmdlSW5Qcm9ncmVzc1wiOiBcItiv2KfZhdmG2Ycg2YXZiNix2K8g2YbYuNixINiv2LEg2K3Yp9mEINin2YbYrNin2YUg2KfYs9iqLlwiLFxuICAgIFwicmVuZGVyTW9kZVwiOiBcItit2KfZhNiqINix2YbYr9ixXCIsXG4gICAgXCJ0ZW1wbGF0ZVRpdGxlTG9jYXRpb25cIjogXCLYudmG2YjYp9mGINmF2qnYp9mGXCIsXG4gICAgXCJyYXRlVmFsdWVzXCI6IFwi2LHYqtio2Ycg2KjZhtiv24wg2YXZgtin2K/bjNixXCIsXG4gICAgXCJyYXRlTWluXCI6IFwi2K3Yr9in2YLZhCDYsdiq2KjZh1wiLFxuICAgIFwicmF0ZU1heFwiOiBcItit2K/Yp9qp2KvYsSDYsdiq2KjZh1wiLFxuICAgIFwicmF0ZVN0ZXBcIjogXCLZhdix2KfYrdmEINix2KrYqNmHINio2YbYr9uMXCIsXG4gICAgXCJtaW5SYXRlRGVzY3JpcHRpb25cIjogXCLZhdi02K7Ytdin2Kog2K3Yr9in2YLZhCDYsdiq2KjZhyDYqNmG2K/bjFwiLFxuICAgIFwibWF4UmF0ZURlc2NyaXB0aW9uXCI6IFwi2YXYtNiu2LXYp9iqINit2K/Yp9qp2KvYsSDYsdiq2KjZhyDYqNmG2K/bjFwiLFxuICAgIFwiaW5wdXRUeXBlXCI6IFwi2YbZiNi5INmI2LHZiNiv24xcIixcbiAgICBcInNpemVcIjogXCLYrdis2YVcIixcbiAgICBcImxvY2FsZVwiOiBcItiy2KjYp9mGXCIsXG4gICAgXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWNcIjogXCLZvtuM2LQg2YHYsdi2INiz2YjYp9mEINin2YjZhCDYp9mG2KrYrtin2Kgg2LTYr9mHINio2KfYtNivLlwiLFxuICAgIFwiY29tcGxldGVkSHRtbFwiOiBcImh0bWwg2qnYp9mF2YQg2LTYr9mHXCIsXG4gICAgXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCI6IFwi2YLYqNmEINin2LIgaHRtbCAg2qnYp9mF2YQg2LTYr9mHXCIsXG4gICAgXCJsb2FkaW5nSHRtbFwiOiBcItio2KfYsdqv2LDYp9ix24wgSHRtbFwiLFxuICAgIFwidHJpZ2dlcnNcIjogXCLZgdi52KfZhCDYs9in2LLbjFwiLFxuICAgIFwiY29va2llTmFtZVwiOiBcItmG2KfZhSDaqdmI2qnbjFwiLFxuICAgIFwic2VuZFJlc3VsdE9uUGFnZU5leHRcIjogXCLYp9ix2LPYp9mEINmG2KrbjNis2Ycg2K/YsSDYtdmB2K3ZhyDYqNi52K/bjFwiLFxuICAgIFwic2hvd05hdmlnYXRpb25CdXR0b25zXCI6IFwi2YbZhdin24zYtCDYr9qp2YXZhyDZh9in24wg2KzZh9iqINuM2KfYqNuMXCIsXG4gICAgXCJzaG93UHJldkJ1dHRvblwiOiBcItmG2YXYp9uM2LQg2K/aqdmF2Ycg24wg2YLYqNmE24xcIixcbiAgICBcInNob3dQYWdlVGl0bGVzXCI6IFwi2YbZhdin24zYtCDYudmG2YjYp9mGINi12YHYrdmHXCIsXG4gICAgXCJzaG93Q29tcGxldGVkUGFnZVwiOiBcItmG2YXYp9uM2LQg2LXZgdit2Ycg24wg2qnYp9mF2YRcIixcbiAgICBcInNob3dQYWdlTnVtYmVyc1wiOiBcItmG2YXYp9uM2LQg2LTZhdin2LHZhyDbjCDYtdmB2K3Yp9iqXCIsXG4gICAgXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIjogXCLZhdmI2YLYuduM2Kog2YLYsdin2LHar9uM2LHbjCDYrti32KfbjCDYs9mI2KfZhNin2KpcIixcbiAgICBcInNob3dQcm9ncmVzc0JhclwiOiBcItmG2YXYp9uM2LQg2YbZiNin2LEg2b7bjNi02LHZgdiqXCIsXG4gICAgXCJtb2RlXCI6IFwi2K3Yp9mE2KpcIixcbiAgICBcImdvTmV4dFBhZ2VBdXRvbWF0aWNcIjogXCLYp9iq2YjZhdin2KrbjNqpINio2Ycg2LXZgdit2Ycg24wg2KjYudiv24wg2KjYsdmI2K9cIixcbiAgICBcImNoZWNrRXJyb3JzTW9kZVwiOiBcItit2KfZhNiqINiu2LfYp9mH2Kcg2LHYpyDYqNix2LHYs9uMINqp2YbbjNivXCIsXG4gICAgXCJjbGVhckludmlzaWJsZVZhbHVlc1wiOiBcItmF2YLYp9iv24zYsSDZhtin2YXYudmE2YjZhSDYsdinINm+2KfaqSDaqdmG24zYr1wiLFxuICAgIFwic3RhcnRTdXJ2ZXlUZXh0XCI6IFwi2LTYsdmI2Lkg2YXYqtmGINmG2LjYsdiz2YbYrNuMXCIsXG4gICAgXCJwYWdlUHJldlRleHRcIjogXCLZhdiq2YYg2LXZgdit2Ycg24wg2YLYqNmE24xcIixcbiAgICBcInBhZ2VOZXh0VGV4dFwiOiBcItmF2KrZhiDYtdmB2K3ZhyDbjCDYqNi52K/bjFwiLFxuICAgIFwiY29tcGxldGVUZXh0XCI6IFwi2YXYqtmGINqp2KfZhdmEXCIsXG4gICAgXCJyZXF1aXJlZFRleHRcIjogXCLZhdiq2YYg2KfYrNio2KfYsduMXCIsXG4gICAgXCJxdWVzdGlvblN0YXJ0SW5kZXhcIjogXCLZgdmH2LHYs9iqINi02LHZiNi5INiz2YjYp9mE2KfYqlwiLFxuICAgIFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCI6IFwi2KfZhNqv2YjbjCDZhdmI2LbZiNi52KfYqiDYs9mI2KfZhNin2KpcIixcbiAgICBcImZpcnN0UGFnZUlzU3RhcnRlZFwiOiBcIti12YHYrdmHINin2YjZhCDYtNix2YjYuSDZhduMINi02YjYr1wiLFxuICAgIFwiaXNTaW5nbGVQYWdlXCI6IFwi2KLbjNinINiq2qkg2LXZgdit2Ycg2KfbjCDYp9iz2KrYn1wiLFxuICAgIFwibWF4VGltZVRvRmluaXNoUGFnZVwiOiBcItit2K/Yp9qp2KvYsSDYstmF2KfZhiDYqNix2KfbjCDYqNmHINm+2KfbjNin2YYg2LHYs9in2YbYr9mGICDYtdmB2K3Zh1wiLFxuICAgIFwic2hvd1RpbWVyUGFuZWxcIjogXCLZhtmF2KfbjNi0INm+2YbZhCDYstmF2KfZhiDYqNmG2K/bjFwiLFxuICAgIFwic2hvd1RpbWVyUGFuZWxNb2RlXCI6IFwi2YbZhdin24zYtCDYrdin2YTYqiDZvtmG2YQg2LLZhdin2YYg2KjZhtiv24xcIixcbiAgICBcImRlZmF1bHRQYW5lbFZhbHVlXCI6IFwi2YXZgtiv2KfYsSDZvtuM2LQg2YHYsdi2ICDZvtmG2YRcIixcbiAgICBcImRlZmF1bHRSb3dWYWx1ZVwiOiBcItmF2YLYr9in2LEg2b7bjNi0INmB2LHYtiDYs9i32LFcIixcbiAgICBcImhhc05vbmVcIjogXCLZhdmI2LHYr9uMINmG2K/Yp9ix2K9cIixcbiAgICBcIm5vbmVUZXh0XCI6IFwi2YXYqtmG24wg2YbYr9in2LHYr1wiLFxuICAgIFwidGV4dFwiOiBcItmF2KrZhlwiLFxuICAgIFwic3VydmV5X3RpdGxlXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcIti52YbZiNin2YZcIixcbiAgICAgIFwidGl0bGVcIjogXCLYr9ixINiq2YXYp9mFINi12YHYrdin2Kog2K/bjNiv2Ycg2YXbjCDYtNmI2K9cIlxuICAgIH0sXG4gICAgXCJwYWdlX3RpdGxlXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcIti52YbZiNin2YZcIixcbiAgICAgIFwidGl0bGVcIjogXCLYudmG2YjYp9mGINi12YHYrdmHXCJcbiAgICB9LFxuICAgIFwibWluVmFsdWVcIjogXCLYrdiv2KfZgtmEINmF2YLYr9in2LFcIixcbiAgICBcIm1heFZhbHVlXCI6IFwi2K3Yr9in2qnYq9ixINmF2YLYr9in2LFcIixcbiAgICBcIm1pbkxlbmd0aFwiOiBcItit2K/Yp9mC2YQg2LfZiNmEXCIsXG4gICAgXCJtYXhMZW5ndGhcIjogXCLYrdiv2Kfaqdir2LEg2LfZiNmEXCIsXG4gICAgXCJhbGxvd0RpZ2l0c1wiOiBcItin2KzYp9iy2Ycg2LnYr9ivXCIsXG4gICAgXCJtaW5Db3VudFwiOiBcItit2K/Yp9mC2YQg2KrYudiv2KfYr1wiLFxuICAgIFwibWF4Q291bnRcIjogXCLYrdiv2Kfaqdir2LEg2KrYudiv2KfYr1wiLFxuICAgIFwicmVnZXhcIjogXCLYudio2KfYsdiqINio2Kcg2YLYp9i52K/Zh1wiXG4gIH0sXG4gIFwicGVsXCI6IHtcbiAgICBcImlzUmVxdWlyZWRcIjogXCLYp9is2KjYp9ix24zYn1wiXG4gIH1cbn07XG5cbmVkaXRvckxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZmFcIl0gPSBwZXJzaWFuU3RyaW5ncztcbiIsImltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcblxudmFyIHBvbGlzaFN0cmluZ3MgPSB7XG4gIC8vc3VydmV5IHRlbXBsYXRlc1xuICBzdXJ2ZXk6IHtcbiAgICBlZGl0OiBcIkVkeXR1alwiLFxuICAgIGRyb3BRdWVzdGlvbjogXCJQcnplY2nEhWduaWogcHl0YW5pZS5cIixcbiAgICBjb3B5OiBcIktvcGl1alwiLFxuICAgIGFkZFRvVG9vbGJveDogXCJEb2RhaiBkbyBwYWxldHlcIixcbiAgICBkZWxldGVQYW5lbDogXCJVc3XFhCBwYW5lbFwiLFxuICAgIGRlbGV0ZVF1ZXN0aW9uOiBcIlVzdcWEIHB5dGFuaWVcIixcbiAgICBjb252ZXJ0VG86IFwiS29ud2VydHVqIG5hXCIsXG4gIH0sXG4gIC8vcXVlc3Rpb25UeXBlc1xuICBxdDoge1xuICAgIGNoZWNrYm94OiBcIldpZWxva3JvdG55IHd5YsOzclwiLFxuICAgIGNvbW1lbnQ6IFwiS29tZW50YXJ6XCIsXG4gICAgZHJvcGRvd246IFwiTGlzdGEgd3lib3J1XCIsXG4gICAgZmlsZTogXCJQbGlrXCIsXG4gICAgaHRtbDogXCJIdG1sXCIsXG4gICAgbWF0cml4OiBcIk1hY2llcnogKGplZG5va3JvdG55IHd5YsOzcilcIixcbiAgICBtYXRyaXhkcm9wZG93bjogXCJNYXRyaXggKHdpZWxva3JvdG55IHd5YsOzcilcIixcbiAgICBtYXRyaXhkeW5hbWljOiBcIk1hdHJpeCAoZHluYW1pY3puZSB3aWVyc3plKVwiLFxuICAgIG11bHRpcGxldGV4dDogXCJXaWVsZSBsaW5paSB0ZWtzdHVcIixcbiAgICBwYW5lbDogXCJQYW5lbFwiLFxuICAgIHBhbmVsZHluYW1pYzogXCJQYW5lbCAoZHluYW1pY3puZSBwYW5lbGUpXCIsXG4gICAgcmFkaW9ncm91cDogXCJKZWRub2tyb3RueSB3eWLDs3JcIixcbiAgICByYXRpbmc6IFwiT2NlbmFcIixcbiAgICB0ZXh0OiBcIlBvamVkeW5jemEgb2Rwb3dpZWTFulwiLFxuICAgIGJvb2xlYW46IFwiUHJhd2RhL0ZhxYJzelwiLFxuICAgIGV4cHJlc3Npb246IFwiV3lyYcW8ZW5pZVwiLFxuICB9LFxuICAvL1N0cmluZ3MgaW4gRWRpdG9yXG4gIGVkOiB7XG4gICAgc3VydmV5OiBcIkFua2lldGFcIixcbiAgICBTdXJ2ZXk6IFwiQW5raWV0YVwiLFxuICAgIGVkaXRTdXJ2ZXk6IFwiRWR5dHVqIGFua2lldMSZXCIsXG4gICAgYWRkTmV3UGFnZTogXCJEb2RhaiBub3fEhSBzZWtjasSZXCIsXG4gICAgZGVsZXRlUGFnZTogXCJVc3XFhCBzZWtjasSZXCIsXG4gICAgZWRpdFBhZ2U6IFwiRWR5dHVqIHNla2NqxJlcIixcbiAgICBuZXdQYWdlTmFtZTogXCJzZWtjamFcIixcbiAgICBuZXdRdWVzdGlvbk5hbWU6IFwicHl0YW5pZVwiLFxuICAgIG5ld1BhbmVsTmFtZTogXCJwYW5lbFwiLFxuICAgIHRlc3RTdXJ2ZXk6IFwiVGVzdHVqIGFua2lldMSZXCIsXG4gICAgdGVzdFN1cnZleUFnYWluOiBcIlRlc3R1aiBwb25vd25pZVwiLFxuICAgIHRlc3RTdXJ2ZXlXaWR0aDogXCJTemVyb2tvxZvEhyBhbmtpZXR5OiBcIixcbiAgICBlbWJlZFN1cnZleTogXCJFbWJlZCBTdXJ2ZXlcIixcbiAgICBzYXZlU3VydmV5OiBcIlphcGlzeiBhbmtpZXTEmVwiLFxuICAgIGRlc2lnbmVyOiBcIlByb2pla3RhbnQgYW5raWV0eVwiLFxuICAgIGpzb25FZGl0b3I6IFwiSlNPTiBFZGl0b3JcIixcbiAgICB1bmRvOiBcIkNvZm5palwiLFxuICAgIHJlZG86IFwiUG9uw7N3XCIsXG4gICAgb3B0aW9uczogXCJPcGNqZVwiLFxuICAgIGdlbmVyYXRlVmFsaWRKU09OOiBcIkdlbmVyYXRlIFZhbGlkIEpTT05cIixcbiAgICBnZW5lcmF0ZVJlYWRhYmxlSlNPTjogXCJHZW5lcmF0ZSBSZWFkYWJsZSBKU09OXCIsXG4gICAgdG9vbGJveDogXCJQYWxldGFcIixcbiAgICBkZWxTZWxPYmplY3Q6IFwiVXN1xYQgd3licmFueSBlbGVtZW50XCIsXG4gICAgY29ycmVjdEpTT046IFwiUGxlYXNlIGNvcnJlY3QgSlNPTi5cIixcbiAgICBzdXJ2ZXlSZXN1bHRzOiBcIld5bmlrIGFua2lldHk6IFwiLFxuICAgIG1vZGlmaWVkOiBcIlptb2R5Zmlrb3dhbmFcIixcbiAgICBzYXZpbmc6IFwiVHJ3YSB6YXBpc1wiLFxuICAgIHNhdmVkOiBcIlphcGlzYW5vXCIsXG4gIH0sXG4gIC8vUHJvcGVydHkgbmFtZXMgaW4gdGFibGUgaGVhZGVyc1xuICBwZWw6IHtcbiAgICBpc1JlcXVpcmVkOiBcIld5bWFnYW5lP1wiLFxuICB9LFxuICAvL1Byb3BlcnR5IEVkaXRvcnNcbiAgcGU6IHtcbiAgICBhcHBseTogXCJaYXN0b3N1alwiLFxuICAgIG9rOiBcIk9LXCIsXG4gICAgY2FuY2VsOiBcIkFudWx1alwiLFxuICAgIHJlc2V0OiBcIlJlc2V0dWpcIixcbiAgICBjbG9zZTogXCJaYW1rbmlqXCIsXG4gICAgZGVsZXRlOiBcIlVzdcWEXCIsXG4gICAgYWRkTmV3OiBcIkRvZGFqIG5vd8SFXCIsXG4gICAgcmVtb3ZlQWxsOiBcIlVzdcWEIHdzenlzdGtpZVwiLFxuICAgIGVkaXQ6IFwiRWR5dHVqXCIsXG4gICAgZW1wdHk6IFwiPHB1c3R5PlwiLFxuICAgIGZhc3RFbnRyeTogXCJTenlia2llIHdwcm93YWR6YW5pZVwiLFxuICAgIGZvcm1FbnRyeTogXCJGb3JtdWxhcnpcIixcbiAgICB0ZXN0U2VydmljZTogXCJUZXN0dWogdXPFgnVnxJlcIixcbiAgICBjb25kaXRpb25IZWxwOlxuICAgICAgXCJQb2RhaiB3eXJhxbxlbmllLCBrdMOzcmUgendyw7NjaSB3YXJ0b8WbxIcgcHJhd2RhL2ZhxYJzei4gSmXFm2xpIGNoY2VzeiwgYWJ5IHNla2NqYSBsdWIgcHl0YW5pZSBwb3pvc3RhxYJ5IHdpZG9jem5lIC0gcG93aW5ubyB6d3LDs2NpxIcgcHJhd2TEmS4gUHJ6eWvFgmFkOiB7cHl0YW5pZTF9ID0gJ3dhcnRvxZvEhzEnIG9yICh7cHl0YW5pZTJ9ICoge3B5dGFuaWU0fSAgPiAyMCBhbmQge3B5dGFuaWUzfSA8IDUpXCIsXG4gICAgYWNlRWRpdG9ySGVscDogXCJQcmVzcyBjdHJsK3NwYWNlIHRvIGdldCBleHByZXNzaW9uIGNvbXBsZXRpb24gaGludFwiLFxuICAgIGFjZUVkaXRvclJvd1RpdGxlOiBcIkN1cnJlbnQgcm93XCIsXG4gICAgYWNlRWRpdG9yUGFuZWxUaXRsZTogXCJDdXJyZW50IHBhbmVsXCIsXG4gICAgc2hvd01vcmU6IFwiRm9yIG1vcmUgZGV0YWlscyBwbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb25cIixcbiAgICBhc3Npc3RhbnRUaXRsZTogXCJBdmFpbGFibGUgcXVlc3Rpb25zOlwiLFxuXG4gICAgcHJvcGVydHlJc0VtcHR5OiBcIlBvZGFqIHdhcnRvxZvEh1wiLFxuICAgIHZhbHVlOiBcIldhcnRvxZvEh1wiLFxuICAgIHRleHQ6IFwiRXR5a2lldGFcIixcbiAgICBjb2x1bW5FZGl0OiBcIkVkaXQgY29sdW1uOiB7MH1cIixcbiAgICBpdGVtRWRpdDogXCJFZGl0IGl0ZW06IHswfVwiLFxuXG4gICAgdXJsOiBcIlVSTFwiLFxuICAgIHBhdGg6IFwiUGF0aFwiLFxuICAgIHZhbHVlTmFtZTogXCJWYWx1ZSBuYW1lXCIsXG4gICAgdGl0bGVOYW1lOiBcIlRpdGxlIG5hbWVcIixcblxuICAgIGhhc090aGVyOiBcIkN6eSBtb8W8bGl3YSB3xYJhc25hIG9kcG93aWVkxbpcIixcbiAgICBvdGhlclRleHQ6IFwiT3RoZXIgaXRlbSB0ZXh0XCIsXG4gICAgbmFtZTogXCJOYXp3YVwiLFxuICAgIHRpdGxlOiBcIkV0eWtpZXRhXCIsXG4gICAgY2VsbFR5cGU6IFwiVHlwIGtvbcOzcmtpXCIsXG4gICAgY29sQ291bnQ6IFwiTGljemJhIGtvbHVtblwiLFxuICAgIGNob2ljZXNPcmRlcjogXCJLb2xlam5vxZvEhyBvZHBvd2llZHppXCIsXG4gICAgdmlzaWJsZTogXCJDenkgd2lkb2N6bmU/XCIsXG4gICAgaXNSZXF1aXJlZDogXCJDenkgd3ltYWdhbG5lP1wiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwiQ3p5IHJvenBvY3p5bmEgc2nEmSBub3fEhSBsaW5pxIU/XCIsXG4gICAgcm93czogXCJMaWN6YmEgd2llcnN6eVwiLFxuICAgIHBsYWNlSG9sZGVyOiBcIklucHV0IHBsYWNlIGhvbGRlclwiLFxuICAgIHNob3dQcmV2aWV3OiBcIlNob3cgcHJldmlldyBhcmVhXCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIlN0b3JlIGZpbGUgY29udGVudCBpbiBKU09OIHJlc3VsdCBhcyB0ZXh0XCIsXG4gICAgbWF4U2l6ZTogXCJNYXhpbXVtIGZpbGUgc2l6ZSBpbiBieXRlc1wiLFxuICAgIGltYWdlSGVpZ2h0OiBcIkltYWdlIGhlaWdodFwiLFxuICAgIGltYWdlV2lkdGg6IFwiSW1hZ2Ugd2lkdGhcIixcbiAgICByb3dDb3VudDogXCJSb3cgY291bnRcIixcbiAgICBhZGRSb3dUZXh0OiBcIkFkZCByb3cgYnV0dG9uIHRleHRcIixcbiAgICByZW1vdmVSb3dUZXh0OiBcIlJlbW92ZSByb3cgYnV0dG9uIHRleHRcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwiT3BpcyBuYWpuacW8c3plaiBvY2VueVwiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCJPcGlzIG5hand5xbxzemVqIG9jZW55XCIsXG4gICAgaW5wdXRUeXBlOiBcIklucHV0IHR5cGVcIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJPcHRpb25zIGNhcHRpb25cIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiRGVmYXVsdCB2YWx1ZVwiLFxuXG4gICAgc3VydmV5RWRpdG9yVGl0bGU6IFwiRWR5dHVqIGFua2lldMSZXCIsXG4gICAgcUVkaXRvclRpdGxlOiBcIkVkeXR1ajogezB9XCIsXG5cbiAgICAvL3N1cnZleVxuICAgIHNob3dUaXRsZTogXCJQb2thxbwvdWtyeWogdHl0dcWCXCIsXG4gICAgbG9jYWxlOiBcIkRvbXnFm2xueSBqxJl6eWtcIixcbiAgICBtb2RlOiBcIlRyeWIgKGVkeWNqYS9wb2RnbMSFZClcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCJVc3XFhCBuaWV3aWRvY3puZSBvZHBvd2llZHppXCIsXG4gICAgY29va2llTmFtZTogXCJDb29raWUgbmFtZSAodG8gZGlzYWJsZSBydW4gc3VydmV5IHR3byB0aW1lcyBsb2NhbGx5KVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcIlNlbmQgc3VydmV5IHJlc3VsdHMgb24gcGFnZSBuZXh0XCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiU3RvcmUgJ290aGVycycgdmFsdWUgaW4gc2VwYXJhdGUgZmllbGRcIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJTaG93IHBhZ2UgdGl0bGVzXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcIlNob3cgcGFnZSBudW1iZXJzXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIlBhZ2UgcHJldmlvdXMgYnV0dG9uIHRleHRcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiUGFnZSBuZXh0IGJ1dHRvbiB0ZXh0XCIsXG4gICAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRlIGJ1dHRvbiB0ZXh0XCIsXG4gICAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlN0YXJ0IGJ1dHRvbiB0ZXh0XCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIlNob3cgbmF2aWdhdGlvbiBidXR0b25zIChkZWZhdWx0IG5hdmlnYXRpb24pXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwiU2hvdyBwcmV2aW91cyBidXR0b24gKHVzZXIgbWF5IHJldHVybiBvbiBwcmV2aW91cyBwYWdlKVwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCJUaGUgZmlyc3QgcGFnZSBpbiB0aGUgc3VydmV5IGlzIGEgc3RhcnRlZCBwYWdlLlwiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcIlNob3cgdGhlIGNvbXBsZXRlZCBwYWdlIGF0IHRoZSBlbmQgKGNvbXBsZXRlZEh0bWwpXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzpcbiAgICAgIFwiT24gYW5zd2VyaW5nIGFsbCBxdWVzdGlvbnMsIGdvIHRvIHRoZSBuZXh0IHBhZ2UgYXV0b21hdGljYWxseVwiLFxuICAgIHNob3dQcm9ncmVzc0JhcjogXCJTaG93IHByb2dyZXNzIGJhclwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJRdWVzdGlvbiB0aXRsZSBsb2NhdGlvblwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJUaGUgcXVlc3Rpb24gcmVxdWlyZWQgc3ltYm9sKHMpXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcIlF1ZXN0aW9uIHN0YXJ0IGluZGV4ICgxLCAyIG9yICdBJywgJ2EnKVwiLFxuICAgIHNob3dRdWVzdGlvbk51bWJlcnM6IFwiU2hvdyBxdWVzdGlvbiBudW1iZXJzXCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOlxuICAgICAgXCJRdWVzdGlvbiB0aXRsZSB0ZW1wbGF0ZSwgZGVmYXVsdCBpczogJ3tub30uIHtyZXF1aXJlfSB7dGl0bGV9J1wiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJRdWVzdGlvbiBlcnJvciBsb2NhdGlvblwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzogXCJGb2N1cyBmaXJzdCBxdWVzdGlvbiBvbiBjaGFuZ2luZyB0aGUgcGFnZVwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcIkVsZW1lbnRzIG9yZGVyIG9uIHRoZSBwYWdlXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIk1heGltdW0gdGltZSB0byBmaW5pc2ggdGhlIHN1cnZleVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiTWF4aW11bSB0aW1lIHRvIGZpbmlzaCBhIHBhZ2UgaW4gdGhlIHN1cnZleVwiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcIlNob3cgdGltZXIgcGFuZWxcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwiU2hvdyB0aW1lciBwYW5lbCBtb2RlXCIsXG4gICAgcmVuZGVyTW9kZTogXCJSZW5kZXIgbW9kZVwiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwiQWxsb3cgYWRkaW5nIGEgcGFuZWxcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIkFsbG93IHJlbW92aW5nIHRoZSBwYW5lbFwiLFxuICAgIHBhbmVsQWRkVGV4dDogXCJBZGRpbmcgcGFuZWwgdGV4dFwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCJSZW1vdmluZyBwYW5lbCB0ZXh0XCIsXG4gICAgaXNTaW5nbGVQYWdlOiBcIlNob3cgYWxsIGVsZW1lbnRzIG9uIG9uZSBwYWdlXCIsXG5cbiAgICB0YWJzOiB7XG4gICAgICBnZW5lcmFsOiBcIk9nw7NsbmVcIixcbiAgICAgIGZpbGVPcHRpb25zOiBcIk9wdGlvbnNcIixcbiAgICAgIGh0bWw6IFwiSHRtbCBFZGl0b3JcIixcbiAgICAgIGNvbHVtbnM6IFwiS29sdW1ueVwiLFxuICAgICAgcm93czogXCJXaWVyc3plXCIsXG4gICAgICBjaG9pY2VzOiBcIk9kcG93aWVkemlcIixcbiAgICAgIHZpc2libGVJZjogXCJXaWRvY3puZSBqZcWbbGlcIixcbiAgICAgIGVuYWJsZUlmOiBcIkVuYWJsZSBJZlwiLFxuICAgICAgcmF0ZVZhbHVlczogXCJXYXJ0b8WbxIcgb2NlbnlcIixcbiAgICAgIGNob2ljZXNCeVVybDogXCJPZHBvd2llZHppIHogd2Vic2Vyd2lzdVwiLFxuICAgICAgbWF0cml4Q2hvaWNlczogXCJEZWZhdWx0IENob2ljZXNcIixcbiAgICAgIG11bHRpcGxlVGV4dEl0ZW1zOiBcIlRleHQgSW5wdXRzXCIsXG4gICAgICB2YWxpZGF0b3JzOiBcIlZhbGlkYXRvcnNcIixcbiAgICAgIG5hdmlnYXRpb246IFwiTmF2aWdhdGlvblwiLFxuICAgICAgcXVlc3Rpb246IFwiUXVlc3Rpb25cIixcbiAgICAgIGNvbXBsZXRlZEh0bWw6IFwiQ29tcGxldGVkIEh0bWxcIixcbiAgICAgIGxvYWRpbmdIdG1sOiBcIkxvYWRpbmcgSHRtbFwiLFxuICAgICAgdGltZXI6IFwiVGltZXIvUXVpelwiLFxuICAgICAgdHJpZ2dlcnM6IFwiVHJpZ2dlcnNcIixcbiAgICAgIHRlbXBsYXRlVGl0bGU6IFwiVGVtcGxhdGUgdGl0bGVcIixcbiAgICB9LFxuICAgIGVkaXRQcm9wZXJ0eTogXCJFZGl0IHByb3BlcnR5ICd7MH0nXCIsXG4gICAgaXRlbXM6IFwiWyBJdGVtczogezB9IF1cIixcblxuICAgIGVudGVyTmV3VmFsdWU6IFwiUGxlYXNlLCBlbnRlciB0aGUgdmFsdWUuXCIsXG4gICAgbm9xdWVzdGlvbnM6IFwiVGhlcmUgaXMgbm8gYW55IHF1ZXN0aW9uIGluIHRoZSBzdXJ2ZXkuXCIsXG4gICAgY3JlYXRldHJpZ2dlcjogXCJQbGVhc2UgY3JlYXRlIGEgdHJpZ2dlclwiLFxuICAgIHRyaWdnZXJPbjogXCJPbiBcIixcbiAgICB0cmlnZ2VyTWFrZVBhZ2VzVmlzaWJsZTogXCJNYWtlIHBhZ2VzIHZpc2libGU6XCIsXG4gICAgdHJpZ2dlck1ha2VRdWVzdGlvbnNWaXNpYmxlOiBcIk1ha2UgZWxlbWVudHMgdmlzaWJsZTpcIixcbiAgICB0cmlnZ2VyQ29tcGxldGVUZXh0OiBcIkNvbXBsZXRlIHRoZSBzdXJ2ZXkgaWYgc3VjY2VlZC5cIixcbiAgICB0cmlnZ2VyTm90U2V0OiBcIlRoZSB0cmlnZ2VyIGlzIG5vdCBzZXRcIixcbiAgICB0cmlnZ2VyUnVuSWY6IFwiUnVuIGlmXCIsXG4gICAgdHJpZ2dlclNldFRvTmFtZTogXCJDaGFuZ2UgdmFsdWUgb2Y6IFwiLFxuICAgIHRyaWdnZXJTZXRWYWx1ZTogXCJ0bzogXCIsXG4gICAgdHJpZ2dlcklzVmFyaWFibGU6IFwiRG8gbm90IHB1dCB0aGUgdmFyaWFibGUgaW50byB0aGUgc3VydmV5IHJlc3VsdC5cIixcbiAgfSxcbiAgLy9Qcm9wZXJ0eSB2YWx1ZXNcbiAgcHY6IHtcbiAgICB0cnVlOiBcInByYXdkYVwiLFxuICAgIGZhbHNlOiBcImZhxYJzelwiLFxuICB9LFxuICAvL09wZXJhdG9yc1xuICBvcDoge1xuICAgIGVtcHR5OiBcImlzIGVtcHR5XCIsXG4gICAgbm90ZW1wdHk6IFwiaXMgbm90IGVtcHR5XCIsXG4gICAgZXF1YWw6IFwiZXF1YWxzXCIsXG4gICAgbm90ZXF1YWw6IFwibm90IGVxdWFsc1wiLFxuICAgIGNvbnRhaW5zOiBcImNvbnRhaW5zXCIsXG4gICAgbm90Y29udGFpbnM6IFwibm90IGNvbnRhaW5zXCIsXG4gICAgZ3JlYXRlcjogXCJncmVhdGVyXCIsXG4gICAgbGVzczogXCJsZXNzXCIsXG4gICAgZ3JlYXRlcm9yZXF1YWw6IFwiZ3JlYXRlciBvciBlcXVhbHNcIixcbiAgICBsZXNzb3JlcXVhbDogXCJMZXNzIG9yIEVxdWFsc1wiLFxuICB9LFxuICAvL0VtYmVkIHdpbmRvd1xuICBldzoge1xuICAgIGFuZ3VsYXI6IFwiVXNlIEFuZ3VsYXIgdmVyc2lvblwiLFxuICAgIGpxdWVyeTogXCJVc2UgalF1ZXJ5IHZlcnNpb25cIixcbiAgICBrbm9ja291dDogXCJVc2UgS25vY2tvdXQgdmVyc2lvblwiLFxuICAgIHJlYWN0OiBcIlVzZSBSZWFjdCB2ZXJzaW9uXCIsXG4gICAgdnVlOiBcIlVzZSBWdWUgdmVyc2lvblwiLFxuICAgIGJvb3RzdHJhcDogXCJGb3IgYm9vdHN0cmFwIGZyYW1ld29ya1wiLFxuICAgIHN0YW5kYXJkOiBcIk5vIGJvb3RzdHJhcFwiLFxuICAgIHNob3dPblBhZ2U6IFwiU2hvdyBzdXJ2ZXkgb24gYSBwYWdlXCIsXG4gICAgc2hvd0luV2luZG93OiBcIlNob3cgc3VydmV5IGluIGEgd2luZG93XCIsXG4gICAgbG9hZEZyb21TZXJ2ZXI6IFwiTG9hZCBTdXJ2ZXkgSlNPTiBmcm9tIHNlcnZlclwiLFxuICAgIHRpdGxlU2NyaXB0OiBcIlNjcmlwdHMgYW5kIHN0eWxlc1wiLFxuICAgIHRpdGxlSHRtbDogXCJIVE1MXCIsXG4gICAgdGl0bGVKYXZhU2NyaXB0OiBcIkphdmFTY3JpcHRcIixcbiAgfSxcbiAgLy9UZXN0IFN1cnZleVxuICB0czoge1xuICAgIHNlbGVjdFBhZ2U6IFwiV3liaWVyeiBzdHJvbsSZLCBhYnkgasSFIHByemV0ZXN0b3dhxIc6XCIsXG4gIH0sXG4gIHZhbGlkYXRvcnM6IHtcbiAgICBhbnN3ZXJjb3VudHZhbGlkYXRvcjogXCJhbnN3ZXIgY291bnRcIixcbiAgICBlbWFpbHZhbGlkYXRvcjogXCJlLW1haWxcIixcbiAgICBudW1lcmljdmFsaWRhdG9yOiBcIm51bWVyaWNcIixcbiAgICByZWdleHZhbGlkYXRvcjogXCJyZWdleFwiLFxuICAgIHRleHR2YWxpZGF0b3I6IFwidGV4dFwiLFxuICB9LFxuICB0cmlnZ2Vyczoge1xuICAgIGNvbXBsZXRldHJpZ2dlcjogXCJjb21wbGV0ZSBzdXJ2ZXlcIixcbiAgICBzZXR2YWx1ZXRyaWdnZXI6IFwic2V0IHZhbHVlXCIsXG4gICAgdmlzaWJsZXRyaWdnZXI6IFwiY2hhbmdlIHZpc2liaWxpdHlcIixcbiAgfSxcbiAgLy9Qcm9wZXJ0aWVzXG4gIHA6IHtcbiAgICBuYW1lOiBcIm5hendhXCIsXG4gICAgdGl0bGU6IHtcbiAgICAgIG5hbWU6IFwidHl0dcWCXCIsXG4gICAgICB0aXRsZTogXCJQb3pvc3RhdyBwdXN0eSwgamXFm2xpIG1hIGJ5xIcgdGFraSBzYW0sIGphayAnTmF6d2EnXCIsXG4gICAgfSxcbiAgICBwYWdlX3RpdGxlOiB7IG5hbWU6IFwidHl0dcWCXCIsIHRpdGxlOiBcIlR5dHXFgiBzZWtjamlcIiB9LFxuICB9LFxufTtcblxuZWRpdG9yTG9jYWxpemF0aW9uLmxvY2FsZXNbXCJwbFwiXSA9IHBvbGlzaFN0cmluZ3M7XG4iLCJpbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5cblxudmFyIHBvcnR1Z3Vlc2VUcmFuc2xhdGlvbiA9IHtcbiAgLy9zdXJ2ZXkgdGVtcGxhdGVzXG4gIHN1cnZleToge1xuICAgIGVkaXQ6IFwiRWRpdGFyXCIsXG4gICAgZXh0ZXJuYWxIZWxwTGluazogXCJBc3Npc3RhIG8gdsOtZGVvIGUgYXByZW5kYSBhIGNyaWFyIHF1ZXN0aW9uw6FyaW9zXCIsXG4gICAgZXh0ZXJuYWxIZWxwTGlua1VybDpcbiAgICAgIFwiaHR0cHM6Ly93d3cueW91dHViZS5jb20vY2hhbm5lbC9VQ0gycnU5b2tJY29vTlpmcElieXE0cVE/dmlld19hcz1zdWJzY3JpYmVyXCIsXG4gICAgZHJvcFF1ZXN0aW9uOiBcIlBvciBmYXZvciBhcnJhc3RlIHVtYSBwZXJndW50YSBwYXJhIGFxdWkuXCIsXG4gICAgYWRkTG9naWNJdGVtOiBcIkNyaWUgdW1hIHJlZ3JhIHBhcmEgcGVyc29uYWxpemFyIG8gZmx1eG8gZG8gcXVlc3Rpb27DoXJpby5cIixcbiAgICBjb3B5OiBcIkNvcGlhclwiLFxuICAgIGR1cGxpY2F0ZTogXCJEdXBsaWNhclwiLFxuICAgIGFkZFRvVG9vbGJveDogXCJBZGljaW9uYXIgw6AgYmFycmEgZGUgZmVycmFtZW50YXNcIixcbiAgICBkZWxldGVQYW5lbDogXCJSZW1vdmVyIFBhaW5lbFwiLFxuICAgIGRlbGV0ZVF1ZXN0aW9uOiBcIlJlbW92ZXIgUGVyZ3VudGFcIixcbiAgICBjb252ZXJ0VG86IFwiQ29udmVydGVyIHBhcmFcIixcbiAgICBkcmFnOiBcIkFycmFzdGFyIGVsZW1lbnRvXCJcbiAgfSxcbiAgLy9xdWVzdGlvblR5cGVzXG4gIHF0OiB7XG4gICAgZGVmYXVsdDogXCJEZWZhdWx0XCIsXG4gICAgY2hlY2tib3g6IFwiQ2hlY2tib3hcIixcbiAgICBjb21tZW50OiBcIkNvbWVudMOhcmlvXCIsXG4gICAgaW1hZ2VwaWNrZXI6IFwiU2VsZXRvciBkZSBpbWFnZW1cIixcbiAgICByYW5raW5nOiBcIlJhbmtpbmdcIixcbiAgICBpbWFnZTogXCJJbWFnZW1cIixcbiAgICBkcm9wZG93bjogXCJEcm9wZG93blwiLFxuICAgIGZpbGU6IFwiQXJxdWl2b1wiLFxuICAgIGh0bWw6IFwiSHRtbFwiLFxuICAgIG1hdHJpeDogXCJNYXRyaXogKG9ww6fDo28gw7puaWNhKVwiLFxuICAgIG1hdHJpeGRyb3Bkb3duOiBcIk1hdHJpeiAobcO6bHRpcGxhcyBvcMOnw7VlcylcIixcbiAgICBtYXRyaXhkeW5hbWljOiBcIk1hdHJpeiAobGluaGFzIGRpbsOibWljYXMpXCIsXG4gICAgbXVsdGlwbGV0ZXh0OiBcIlRleHRvIG3Dumx0aXBsb1wiLFxuICAgIHBhbmVsOiBcIlBhaW5lbFwiLFxuICAgIHBhbmVsZHluYW1pYzogXCJQYWluZWwgKHBhaW7DqWlzIGRpbsOibWljb3MpXCIsXG4gICAgcmFkaW9ncm91cDogXCJSYWRpb2dyb3VwXCIsXG4gICAgcmF0aW5nOiBcIlJhdGluZ1wiLFxuICAgIHRleHQ6IFwiVGV4dG8gw7puaWNvXCIsXG4gICAgYm9vbGVhbjogXCJCb29sZWFub1wiLFxuICAgIGV4cHJlc3Npb246IFwiRXhwcmVzc8OjbyAoc29tZW50ZSBsZWl0dXJhKVwiLFxuICAgIHNpZ25hdHVyZXBhZDogXCJDYW1wbyBkZSBhc3NpbmF0dXJhXCIsXG4gICAgZmxvd3BhbmVsOiBcIlBhaW5lbCBkZSBGbHV4b1wiLFxuICB9LFxuICAvL1N0cmluZ3MgaW4gRWRpdG9yXG4gIGVkOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJEZWZhdWx0ICh7MH0pXCIsXG4gICAgc3VydmV5OiBcIlF1ZXN0aW9uw6FyaW9cIixcbiAgICBzZXR0aW5nczogXCJDb25maWd1cmHDp8O1ZXMgZG8gcXVlc3Rpb27DoXJpb1wiLFxuICAgIHNldHRpbmdzVG9vbHRpcDogXCJNb3N0cmFyIGNvbmZpZ3VyYcOnw7VlcyBkbyBxdWVzdGlvbsOhcmlvXCIsXG4gICAgLy9vcGplY3RQcm9wZXJ0aWVzSGVhZGVyOiBcIkF2YW7Dp2Fkb1wiLFxuICAgIC8vc2hvd09iamVjdFByb3BlcnRpZXM6IFwiTW9zdHJhciBQcm9wcmllZGFkZXMgZG8gT2JqZXRvXCIsXG4gICAgLy9oaWRlT2JqZWN0UHJvcGVydGllczogXCJPY3VsdGFyIFByb3ByaWVkYWRlcyBkbyBPYmpldG9cIixcbiAgICBzaG93UGFuZWw6IFwiTW9zdHJhciBQYWluZWxcIixcbiAgICBoaWRlUGFuZWw6IFwiT2N1bHRhciBQYWluZWxcIixcbiAgICAvL2VkaXRTdXJ2ZXk6IFwiRWRpdGFyIFF1ZXN0aW9uw6FyaW9cIixcbiAgICBhZGROZXdQYWdlOiBcIkFkaWNpb25hciBOb3ZhIFDDoWdpbmFcIixcbiAgICBtb3ZlUmlnaHQ6IFwiTW92ZXIgcGFyYSBkaXJlaXRhXCIsXG4gICAgbW92ZUxlZnQ6IFwiTW92ZXIgcGFyYSBlc3F1ZXJkYVwiLFxuICAgIGRlbGV0ZVBhZ2U6IFwiQXBhZ2FyIFDDoWdpbmFcIixcbiAgICBlZGl0UGFnZTogXCJFZGl0YXIgUMOhZ2luYVwiLFxuICAgIGVkaXQ6IFwiRWRpdGFyXCIsXG4gICAgbmV3UGFnZU5hbWU6IFwicMOhZ2luYVwiLFxuICAgIG5ld1F1ZXN0aW9uTmFtZTogXCJwZXJndW50YVwiLFxuICAgIG5ld1BhbmVsTmFtZTogXCJwYWluZWxcIixcbiAgICBuZXdUZXh0SXRlbU5hbWU6IFwidGV4dG9cIixcbiAgICB0ZXN0U3VydmV5OiBcIlRlc3RhciBxdWVzdGlvbsOhcmlvXCIsXG4gICAgdGVzdFN1cnZleUFnYWluOiBcIlRlc3RhciBxdWVzdGlvbsOhcmlvIG5vdmFtZW50ZVwiLFxuICAgIHRlc3RTdXJ2ZXlXaWR0aDogXCJUYW1hbmhvIGRvIHF1ZXN0aW9uw6FyaW86IFwiLFxuICAgIG5hdmlnYXRlVG9Nc2c6IFwiVm9jw6ogdGV2ZSBxdWUgbmF2ZWdhciBwYXJhOlwiLFxuICAgIGxvZ2ljOiBcIkzDs2dpY2EgZG8gUXVlc3Rpb27DoXJpb1wiLFxuICAgIGVtYmVkU3VydmV5OiBcIkluY29ycG9yYXIgUXVlc3Rpb27DoXJpb1wiLFxuICAgIHRyYW5zbGF0aW9uOiBcIlRyYWR1w6fDo29cIixcbiAgICBzYXZlU3VydmV5OiBcIkd1YXJkYXIgUXVlc3Rpb27DoXJpb1wiLFxuICAgIHNhdmVTdXJ2ZXlUb29sdGlwOiBcIkd1YXJkYXIgUXVlc3Rpb27DoXJpb1wiLFxuICAgIGRlc2lnbmVyOiBcIkRlc2lnbmVyIGRlIFF1ZXN0aW9uw6FyaW9cIixcbiAgICBqc29uRWRpdG9yOiBcIkVkaXRvciBkZSBKU09OXCIsXG4gICAgdW5kbzogXCJEZXNmYXplclwiLFxuICAgIHJlZG86IFwiUmVmYXplclwiLFxuICAgIHVuZG9Ub29sdGlwOiBcIkRlc2ZhemVyIMO6bHRpbWEgbW9kaWZpY2HDp8Ojb1wiLFxuICAgIHJlZG9Ub29sdGlwOiBcIlJlZmF6ZXIgbW9kaWZpY2HDp8Ojb1wiLFxuICAgIGNvcHk6IFwiQ29waWFyXCIsXG4gICAgY3V0OiBcIlJlY29ydGFyXCIsXG4gICAgcGFzdGU6IFwiQ29sYXJcIixcbiAgICBjb3B5VG9vbHRpcDogXCJDb3BpYXIgc2VsZcOnw6NvIHBhcmEgYSDDoXJlYSBkZSB0cmFuc2ZlcsOqbmNpYVwiLFxuICAgIGN1dFRvb2x0aXA6IFwiUmVjb3J0YXIgc2VsZcOnw6NvIHBhcmEgYSDDoXJlYSBkZSB0cmFuc2ZlcsOqbmNpYVwiLFxuICAgIHBhc3RlVG9vbHRpcDogXCJDb2xhciBkYSDDoXJlYSBkZSB0cmFuc2ZlcsOqbmNpYVwiLFxuICAgIG9wdGlvbnM6IFwiT3DDp8O1ZXNcIixcbiAgICBnZW5lcmF0ZVZhbGlkSlNPTjogXCJHZXJhciBKU09OIHbDoWxpZG9cIixcbiAgICBnZW5lcmF0ZVJlYWRhYmxlSlNPTjogXCJHZXJhciBKU09OIGxlZ8OtdmVsXCIsXG4gICAgdG9vbGJveDogXCJGZXJyYW1lbnRhc1wiLFxuICAgIFwicHJvcGVydHktZ3JpZFwiOiBcIlByb3ByaWVkYWRlc1wiLFxuICAgIHRvb2xib3hHZW5lcmFsQ2F0ZWdvcnk6IFwiR2VyYWxcIixcbiAgICAvL2RlbFNlbE9iamVjdDogXCJBcGFnYXIgb2JqZXRvIHNlbGVjaW9uYWRvXCIsXG4gICAgLy9lZGl0U2VsT2JqZWN0OiBcIkVkaXRhciBvYmpldG8gc2VsZWNpb25hZG9cIixcbiAgICBjb3JyZWN0SlNPTjogXCJQb3IgZmF2b3IgY29ycmlqYSBvIEpTT04uXCIsXG4gICAgc3VydmV5UmVzdWx0czogXCJSZXN1bHRhZG8gZG8gcXVlc3Rpb27DoXJpbzogXCIsXG4gICAgc3VydmV5UmVzdWx0c1RhYmxlOiBcIkNvbW8gVGFiZWxhXCIsXG4gICAgc3VydmV5UmVzdWx0c0pzb246IFwiQ29tbyBKU09OXCIsXG4gICAgcmVzdWx0c1RpdGxlOiBcIlTDrXR1bG8gZGEgUGVyZ3VudGFcIixcbiAgICByZXN1bHRzTmFtZTogXCJOb21lIGRhIFBlcmd1bnRhXCIsXG4gICAgcmVzdWx0c1ZhbHVlOiBcIlZhbG9yIGRhIFJlc3Bvc3RhXCIsXG4gICAgcmVzdWx0c0Rpc3BsYXlWYWx1ZTogXCJNb3N0cmFyIFZhbG9yXCIsXG4gICAgbW9kaWZpZWQ6IFwiTW9kaWZpY2Fkb1wiLFxuICAgIHNhdmluZzogXCJBIGd1YXJkYXJcIixcbiAgICBzYXZlZDogXCJHdWFyZGFkb1wiLFxuICAgIHByb3BlcnR5RWRpdG9yRXJyb3I6IFwiRXJybzpcIixcbiAgICBzYXZlRXJyb3I6IFwiRXJybyEgQ29udGXDumRvIGRvIGVkaXRvciBuw6NvIGZvaSBndWFyZGFkby5cIixcbiAgICB0cmFuc2xhdGlvbkFkZExhbmd1YWdlOiBcIlNlbGVjaW9uZSBvIGlkaW9tYSBwYXJhIHRyYWR1emlyXCIsXG4gICAgdHJhbnNsYXRpb25TaG93QWxsU3RyaW5nczogXCJNb3N0cmFyIHRvZGFzIHN0cmluZ3NcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxQYWdlczogXCJNb3N0cmFyIHRvZGFzIHDDoWdpbmFzXCIsXG4gICAgdHJhbnNsYXRpb25Ob1N0cmluZ3M6IFwiTmVuaHVtYSBzdHJpbmcgcGFyYSB0cmFkdXppci4gUG9yIGZhdm9yLCBhbHRlcmUgbyBmaWx0cm8uXCIsXG4gICAgdHJhbnNsYXRpb25FeHBvcnRUb1NDVkJ1dHRvbjogXCJFeHBvcnRhciBwYXJhIENTVlwiLFxuICAgIHRyYW5zbGF0aW9uSW1wb3J0RnJvbVNDVkJ1dHRvbjogXCJJbXBvcnRhciBkZSBDU1ZcIixcbiAgICB0cmFuc2xhdGlvbk1lcmdlTG9jYWxlV2l0aERlZmF1bHQ6IFwiQ29tYmluYXIgezB9IGNvbSBvIGlkaW9tYSBkZWZhdWx0XCIsXG4gICAgYm9sZDogXCJOZWdyaXRvXCIsXG4gICAgaXRhbGljOiBcIkl0w6FsaWNvXCIsXG4gICAgdW5kZXJsaW5lOiBcIlN1YmxpbmhhZG9cIixcbiAgICBmcEFkZFF1ZXN0aW9uOiBcIkFkaWNpb25hciBwZXJndW50YS4uLlwiLFxuICAgIHNlbGVjdFBhZ2U6IFwiU2VsZWNpb25hciBww6FnaW5hLi4uXCIsXG4gICAgY2hvb3NlRWxlbWVudDogXCJFc2NvbGhhIHVtIGVsZW1lbnRvLi4uXCIsXG4gICAgLy9jb21wbGV0ZWRIdG1sT25Db25kaXRpb25JdGVtVGV4dDogXCJFeGliaXIgc2U6XCIsXG4gICAgbGc6IHtcbiAgICAgIGFkZE5ld0l0ZW06IFwiXCIsIC8vQnkgZGVmYXVsdCB0aGUgdmFsdWUgaXMgdGFrZW4gZnJvbSBwZS5hZGROZXcgJ0FkZCBOZXcnLCB5b3UgY2FuIHNldCBpdCB0byAnQWRkIE5ldyBSdWxlJyBmb3IgZXhhbXBsZS5cbiAgICAgIC8vTG9naWMgdGFiIHN0cmluZ3NcbiAgICAgIHBhZ2VfdmlzaWJpbGl0eU5hbWU6IFwiVmlzaWJpbGlkYWRlIGRhIFDDoWdpbmFcIixcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlOYW1lOiBcIlZpc2liaWxpZGFkZSBkbyBQYWluZWxcIixcbiAgICAgIHBhbmVsX2VuYWJsZU5hbWU6IFwiQXRpdmFyL2Rlc2F0aXZhciBwYWluZWxcIixcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlOYW1lOiBcIlZpc2liaWxpZGFkZSBkYSBwZXJndW50YVwiLFxuICAgICAgcXVlc3Rpb25fZW5hYmxlTmFtZTogXCJIYWJpbGl0YXIvZGVzYWJpbGl0YXIgcGVyZ3VudGFcIixcbiAgICAgIHF1ZXN0aW9uX3JlcXVpcmVOYW1lOiBcIlF1ZXN0w6NvIG9wY2lvbmFsIG9icmlnYXTDs3JpYVwiLFxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZU5hbWU6IFwiQ29tcGxldGFyIFF1ZXN0aW9uw6FyaW9cIixcbiAgICAgIHRyaWdnZXJfc2V0dmFsdWVOYW1lOiBcIkRlZmluYSBvIHZhbG9yIGRhIHBlcmd1bnRhXCIsXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZU5hbWU6IFwiQ29waWFyIG8gdmFsb3IgZGEgcGVyZ3VudGFcIixcbiAgICAgIHRyaWdnZXJfc2tpcE5hbWU6IFwiU2FsdGFyIHBhcmEgYSBwZXJndW50YVwiLFxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uTmFtZTogXCJFeGVjdXRhciBleHByZXNzw6NvIHBlcnNvbmFsaXphZGFcIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbk5hbWU6IFwiTm9tZSBkYSBww6FnaW5hIGRlIGNvbmNsdXPDo28gcGVyc29uYWxpemFkYVwiLFxuICAgICAgXG5wYWdlX3Zpc2liaWxpdHlEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJUb3JuZSBhIHDDoWdpbmEgdmlzw612ZWwgcXVhbmRvIGEgZXhwcmVzc8OjbyBsw7NnaWNhIHJldG9ybmFyIHZlcmRhZGVpcm8uIENhc28gY29udHLDoXJpbywgbWFudGVuaGEtYSBpbnZpc8OtdmVsLlwiLFxuICAgICAgcGFuZWxfdmlzaWJpbGl0eURlc2NyaXB0aW9uOlxuICAgICAgICBcIlRvcm5lIG8gcGFpbmVsIHZpc8OtdmVsIHF1YW5kbyBhIGV4cHJlc3PDo28gbMOzZ2ljYSByZXRvcm5hciB2ZXJkYWRlaXJvLiBDYXNvIGNvbnRyw6FyaW8sIG1hbnRlbmhhLW8gaW52aXPDrXZlbC5cIixcbiAgICAgIHBhbmVsX2VuYWJsZURlc2NyaXB0aW9uOlxuICAgICAgICBcIkZhw6dhIGNvbSBxdWUgbyBwYWluZWwsIGUgdG9kb3Mgb3MgZWxlbWVudG9zIGRlbnRybyBkZWxlLCBzZWphbSBoYWJpbGl0YWRvcyBxdWFuZG8gYSBleHByZXNzw6NvIGzDs2dpY2EgcmV0b3JuYXIgdmVyZGFkZWlyby4gQ2FzbyBjb250csOhcmlvLCBtYW50ZW5oYS1vcyBkZXNhYmlsaXRhZG9zLlwiLFxuICAgICAgcXVlc3Rpb25fdmlzaWJpbGl0eURlc2NyaXB0aW9uOlxuICAgICAgICBcIlRvcm5lIGEgcGVyZ3VudGEgdmlzw612ZWwgcXVhbmRvIGEgZXhwcmVzc8OjbyBsw7NnaWNhIHJldG9ybmFyIHZlcmRhZGVpcm8uIENhc28gY29udHLDoXJpbywgbWFudGVuaGEtYSBpbnZpc8OtdmVsLlwiLFxuICAgICAgcXVlc3Rpb25fZW5hYmxlRGVzY3JpcHRpb246XG4gICAgICAgIFwiQXRpdmUgYSBwZXJndW50YSBxdWFuZG8gYSBleHByZXNzw6NvIGzDs2dpY2EgcmV0b3JuYXIgdmVyZGFkZWlyby4gQ2FzbyBjb250csOhcmlvLCBtYW50ZW5oYS1hIGRlc2F0aXZhZGEuXCIsXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlRGVzY3JpcHRpb246XG4gICAgICAgIFwiQSBwZXJndW50YSB0b3JuYS1zZSBuZWNlc3PDoXJpYSBxdWFuZG8gYSBleHByZXNzw6NvIGzDs2dpY2EgcmV0b3JuYSB2ZXJkYWRlaXJvLlwiLFxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIlF1YW5kbyBhIGV4cHJlc3PDo28gbMOzZ2ljYSByZXRvcm5hIHZlcmRhZGVpcm8sIG8gcXVlc3Rpb27DoXJpbyDDqSBjb25jbHXDrWRvIGUgbyB1dGlsaXphZG9yIHbDqiBhICdww6FnaW5hIGRlIGFncmFkZWNpbWVudG8nLlwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIlF1YW5kbyBvcyB2YWxvcmVzIGRhIHBlcmd1bnRhLCBxdWUgc8OjbyB1c2Fkb3Mg4oCL4oCLbmEgZXhwcmVzc8OjbyBsw7NnaWNhLCBzw6NvIGFsdGVyYWRvcyBlIGEgZXhwcmVzc8OjbyBsw7NnaWNhIHJldG9ybmEgdmVyZGFkZWlybywgbyB2YWxvciDDqSBkZWZpbmlkbyBwYXJhIGEgcGVyZ3VudGEgc2VsZWNpb25hZGEuXCIsXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIlF1YW5kbyBvcyB2YWxvcmVzIGRhIHBlcmd1bnRhLCBxdWUgc8OjbyB1c2Fkb3Mg4oCL4oCLbmEgZXhwcmVzc8OjbyBsw7NnaWNhLCBzw6NvIGFsdGVyYWRvcyBlIGEgZXhwcmVzc8OjbyBsw7NnaWNhIHJldG9ybmEgdmVyZGFkZWlybywgbyB2YWxvciBkZSB1bWEgcGVyZ3VudGEgc2VsZWNpb25hZGEgw6kgY29waWFkbyBwYXJhIG91dHJhIHBlcmd1bnRhIHNlbGVjaW9uYWRhLlwiLFxuICAgICAgdHJpZ2dlcl9za2lwRGVzY3JpcHRpb246XG4gICAgICAgIFwiUXVhbmRvIGEgZXhwcmVzc8OjbyBsw7NnaWNhIHJldG9ybmEgdmVyZGFkZWlybywgbyBxdWVzdGlvbsOhcmlvIHNhbHRhIHBhcmEgLyBmb2NhIGEgcXVlc3TDo28gc2VsZWNpb25hZGEuXCIsXG4gICAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25EZXNjcmlwdGlvbjpcbiAgICAgICAgXCJRdWFuZG8gYSBleHByZXNzw6NvIGzDs2dpY2EgcmV0b3JuYSB2ZXJkYWRlaXJvLCBhIGV4cHJlc3PDo28gcGVyc29uYWxpemFkYSDDqSBleGVjdXRhZGEuIFZvY8OqIHBvZGUsIG9wY2lvbmFsbWVudGUsIGRlZmluaXIgbyByZXN1bHRhZG8gZGVzdGEgZXhwcmVzc8OjbyBuYSBwZXJndW50YSBzZWxlY2lvbmFkYVwiLFxuICAgICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uRGVzY3JpcHRpb246XG4gICAgICAgIFwiU2UgYSBleHByZXNzw6NvIGzDs2dpY2EgcmV0b3JuYXIgdmVyZGFkZWlybywgbyB0ZXh0byBwYWRyw6NvIGRhICdww6FnaW5hIGRlIGFncmFkZWNpbWVudG8nIHNlcsOhIGFsdGVyYWRvIHBhcmEgbyBmb3JuZWNpZG8uXCIsXG4gICAgICBcbiAgICAgIGl0ZW1FeHByZXNzaW9uVGV4dDogXCJRdWFuZG8gYSBleHByZXNzw6NvOiAnezB9JyByZXRvcm5hIHZlcmRhZGVpcm86XCIsIC8vIHswfSAtIGEgZXhwcmVzc8Ojb1xuICAgICAgcGFnZV92aXNpYmlsaXR5VGV4dDogXCJUb3JuYXIgYSBww6FnaW5hIHswfSB2aXPDrXZlbFwiLCAvLyB7MH0gbm9tZSBkYSBww6FnaW5hXG4gICAgICBwYW5lbF92aXNpYmlsaXR5VGV4dDogXCJUb3JuYXIgbyBwYWluZWwgezB9IHZpc8OtdmVsXCIsIC8vIHswfSBub21lIGRvIHBhaW5lbFxuICAgICAgcGFuZWxfZW5hYmxlVGV4dDogXCJUb3JuYXIgcGFpbmVsIHswfSBoYWJpbGl0YXJcIiwgLy8gezB9IG5vbWUgZG8gcGFpbmVsXG4gICAgICBxdWVzdGlvbl92aXNpYmlsaXR5VGV4dDogXCJUb3JuYXIgYSBwZXJndW50YSB7MH0gdmlzw612ZWxcIiwgLy8gezB9IG5vbWUgZGEgcGVyZ3VudGFcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZVRleHQ6IFwiRmHDp2EgYSBwZXJndW50YSB7MH0gYXRpdmFkYVwiLCAvLyB7MH0gbm9tZSBkYSBwZXJndW50YVxuICAgICAgcXVlc3Rpb25fcmVxdWlyZVRleHQ6IFwiVG9ybmFyIGEgcGVyZ3VudGEgezB9IG9icmlnYXTDs3JpYVwiLCAvLyB7MH0gbm9tZSBkYSBwZXJndW50YVxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZVRleHQ6IFwiTyBxdWVzdGlvbsOhcmlvIGZvaSBjb25jbHXDrWRvXCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlVGV4dDogXCJDb2xvY2FyIGVtIHF1ZXN0w6NvOiB7MH0gdmFsb3IgezF9XCIsIC8vIHswfSBub21lIGRhIHF1ZXN0w6NvLCB7MX0gc2V0VmFsdWVcbiAgICAgIHRyaWdnZXJfY29weXZhbHVlVGV4dDogXCJDb3BpYXIgcGFyYSBhIHF1ZXN0w6NvOiB7MH0gdmFsb3IgZGEgcXVlc3TDo28gezF9XCIsIC8vIHswfSBlIHsxfSBub21lcyBkYXMgcXVlc3TDtWVzXG4gICAgICB0cmlnZ2VyX3NraXBUZXh0OiBcIlF1ZXN0aW9uw6FyaW8gc2FsdGEgcGFyYSBhIHF1ZXN0w6NvIHswfVwiLCAvLyB7MH0gbm9tZSBkYSBxdWVzdMOjb1xuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDE6IFwiRXhlY3V0YXIgZXhwcmVzc8OjbzogJ3swfSdcIiwgLy8gezB9IGEgZXhwcmVzc8Ojb1xuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDI6IFwiZSBjb2xvcXVlIG8gc2V1IHJlc3VsdGFkbyBlbSBxdWVzdMOjbzogezB9XCIsIC8vIHswfSBub21lIGRhIHF1ZXN0w6NvXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25UZXh0OlxuICAgICAgICBcIk1vc3RyYXIgdGV4dG8gcGVyc29uYWxpemFkbyBwYXJhIGEgJ3DDoWdpbmEgZGUgYWdyYWRlY2ltZW50bycuXCIsXG4gICAgICAgIFxuICAgICAgY29uZGl0aW9uczogXCJDb25kacOnw6NvKMO1ZXMpXCIsXG4gICAgICBhY3Rpb25zOiBcIkHDp8OjbyjDtWVzKVwiLFxuICAgICAgZXhwcmVzc2lvbkVkaXRvclRpdGxlOiBcIkRlZmluaXIgY29uZGnDp8OjbyjDtWVzKVwiLFxuICAgICAgYWN0aW9uc0VkaXRvclRpdGxlOiBcIkRlZmluaXIgYcOnw6NvKMO1ZXMpXCIsXG4gICAgICBcbiAgICAgIGRlbGV0ZUFjdGlvbjogXCJFeGNsdWlyIGHDp8Ojb1wiLFxuICAgICAgYWRkTmV3QWN0aW9uOiBcIkFkaWNpb25hciBub3ZhIGHDp8Ojb1wiLFxuICAgICAgc2VsZWN0ZWRBY3Rpb25DYXB0aW9uOiBcIlNlbGVjaW9uZSB1bWEgYcOnw6NvIHBhcmEgYWRpY2lvbmFyIC4uLlwiLFxuICAgICAgXG4gICAgICBleHByZXNzaW9uSW52YWxpZDpcbiAgICAgICAgXCJBIGV4cHJlc3PDo28gbMOzZ2ljYSBlc3TDoSB2YXppYSBvdSDDqSBpbnbDoWxpZGEuIENvcnJpamEtYS5cIixcbiAgICAgIG5vQWN0aW9uRXJyb3I6IFwiUG9yIGZhdm9yLCBhZGljaW9uZSBwZWxvIG1lbm9zIHVtYSBhw6fDo28uXCIsXG4gICAgICBhY3Rpb25JbnZhbGlkOiBcIlBvciBmYXZvciwgY29ycmlqYSBwcm9ibGVtYXMgZW0gc3VhcyBhw6fDtWVzLlwiLFxuICAgICAgZXhwcmVzc2lvblNldHVwOiBcIlwiLFxuICAgICAgYWN0aW9uc1NldHVwOiBcIlwiLFxuICAgIH0sXG4gIH0sXG4gIC8vUHJvcGVydHkgbmFtZXMgaW4gdGFibGUgaGVhZGVyc1xuICAvLyBwZWw6IHtcbiAgLy8gIGlzUmVxdWlyZWQ6IFwiT2JyaWdhdMOzcmlvP1wiXG4gIC8vIH0sXG4gIC8vUHJvcGVydHkgRWRpdG9yc1xuICBwZToge1xuICAgIGFwcGx5OiBcIkFwbGljYXJcIixcbiAgICBvazogXCJPS1wiLFxuICAgIHNhdmU6IFwiR3VhcmRhclwiLFxuICAgIHNhdmVUb29sdGlwOiBcIkd1YXJkYXJcIixcbiAgICBjYW5jZWw6IFwiQ2FuY2VsYXJcIixcbiAgICByZXNldDogXCJMaW1wYXJcIixcbiAgICByZWZyZXNoOiBcIkF0dWFsaXphclwiLFxuICAgIC8vIGNsb3NlOiBcIkZlY2hhclwiLFxuICAgIGRlbGV0ZTogXCJBcGFnYXJcIixcbiAgICBhZGQ6IFwiQWRpY2lvbmFyXCIsXG4gICAgYWRkTmV3OiBcIkFkaWNpb25hciBOb3ZvXCIsXG4gICAgYWRkSXRlbTogXCJDbGlxdWUgcGFyYSBhZGljaW9uYXIgdW0gaXRlbS4uLlwiLFxuICAgIGFkZE90aGVyOiBcIk91dHJvXCIsXG4gICAgYWRkU2VsZWN0QWxsOiBcIlNlbGVjaW9uYXIgVHVkb1wiLFxuICAgIGFkZE5vbmU6IFwiTmVuaHVtXCIsXG4gICAgcmVtb3ZlQWxsOiBcIlJlbW92ZXIgVG9kb3NcIixcbiAgICBlZGl0OiBcIkVkaXRhclwiLFxuICAgIGJhY2s6IFwiVm9sdGFyIHNlbSBndWFyZGFyXCIsXG4gICAgYmFja1Rvb2x0aXA6IFwiVm9sdGFyIHNlbSBndWFyZGFyXCIsXG4gICAgc2F2ZUFuZEJhY2s6IFwiR3VhcmRhciBlIHZvbHRhclwiLFxuICAgIHNhdmVBbmRCYWNrVG9vbHRpcDogXCJHdWFyZGFyIGUgdm9sdGFyXCIsXG4gICAgLy8gaXRlbVZhbHVlRWRpdDogXCJWaXPDrXZlbCBTZVwiLFxuICAgIGVkaXRDaG9pY2VzOiBcIkVkaXRhciBPcMOnw7Vlc1wiLFxuICAgIHNob3dDaG9pY2VzOiBcIk1vc3RyYXIgT3DDp8O1ZXNcIixcbiAgICBtb3ZlOiBcIk1vdmVyXCIsXG4gICAgZW1wdHk6IFwiPHZhemlvPlwiLFxuICAgIC8vIG5vdEVtcHR5OiBcIjxlZGl0YXIgdmFsb3I+XCIsXG4gICAgZmFzdEVudHJ5OiBcIkVudHJhZGEgUsOhcGlkYVwiLFxuICAgIGZvcm1FbnRyeTogXCJFbnRyYWRhIGNvbSBmb3JtdWzDoXJpb1wiLFxuICAgIHRlc3RTZXJ2aWNlOiBcIlRlc3RhciBvIHNlcnZpw6dvXCIsXG4gICAgaXRlbVNlbGVjdG9yRW1wdHk6IFwiUG9yIGZhdm9yIHNlbGVjaW9uZSBvIGVsZW1lbnRvXCIsXG4gICAgY29uZGl0aW9uQWN0aW9uRW1wdHk6IFwiUG9yIGZhdm9yIHNlbGVjaW9uZSBhIGHDp8Ojb1wiLFxuICAgIGNvbmRpdGlvblNlbGVjdFF1ZXN0aW9uOiBcIlNlbGVjaW9uYXIgcGVyZ3VudGEuLi5cIixcbiAgICBjb25kaXRpb25TZWxlY3RQYWdlOiBcIlNlbGVjaW9uYXIgcMOhZ2luYSAuLi5cIixcbiAgICAgY29uZGl0aW9uU2VsZWN0UGFuZWw6IFwiU2VsZWNpb25hciBwYWluZWwgLi4uXCIsXG4gICAgIGNvbmRpdGlvblZhbHVlUXVlc3Rpb25UaXRsZTogXCJQb3IgZmF2b3IsIGluc2lyYS9zZWxlY2lvbmUgbyB2YWxvclwiLFxuICAgIC8vIGNvbmRpdGlvbkhlbHA6XG4gICAgLy8gIFwiUG9yIGZhdm9yLCBlbnRyZSBjb20gdW1hIGV4cHJlc3PDo28gYm9sZWFuYS4gRGV2ZSByZXRvcm5hciB2ZXJkYWRlaXJvIHBhcmEgbWFudGVyIGEgcGVyZ3VudGEvcMOhZ2luYSB2aXPDrXZlbC4gUG9yIGV4ZW1wbG86IHvCtHBlcmd1bnRhMX0gPSAndmFsb3IxJyBvdSAoe3Blcmd1bnRhMn0gKiB7cGVyZ3VudGE0fSA+IDIwIGUge3Blcmd1bnRhM30gPCA1KVwiLFxuICAgIGV4cHJlc3Npb25IZWxwOlxuICAgICAgXCJQb3IgZmF2b3IgaW5zaXJhIHVtYSBleHByZXNzw6NvIGJvb2xlYW5hLiBFbGEgZGV2ZSByZXRvcm5hciB2ZXJkYWRlaXJvIHBhcmEgbWFudGVyIGEgcGVyZ3VudGEvcMOhZ2luYSB2aXPDrXZlbC4gUG9yIGV4ZW1wbG86IHvCtHBlcmd1bnRhMX0gPSAndmFsb3IxJyBvciAoe3Blcmd1bnRhMn0gPSAzIGFuZCB7cGVyZ3VudGEzfSA8IDUpXCIsXG4gICAgYWNlRWRpdG9ySGVscDogXCJQcmVzc2lvbmUgY3RybCtlc3Bhw6dvIHBhcmEgYXV0b2NvbXBsZXRhclwiLFxuICAgIGFjZUVkaXRvclJvd1RpdGxlOiBcIkxpbmhhIGF0dWFsXCIsXG4gICAgYWNlRWRpdG9yUGFuZWxUaXRsZTogXCJQYWluZWwgYXR1YWxcIixcbiAgICBzaG93TW9yZTogXCJQYXJhIG1haXMgZGV0YWxoZXMsIHBvciBmYXZvciB2aXNpdGUgYSBkb2N1bWVudGHDp8Ojb1wiLFxuICAgIC8vIGNvbmRpdGlvblNob3dNb3JlVXJsOlxuICAgIC8vICBcImh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5UGFyYW1ldGVyP2lkPVF1ZXN0aW9uJnBhcmFtZXRlcj12aXNpYmxlSWZcIixcbiAgICBhc3Npc3RhbnRUaXRsZTogXCJQZXJndW50YXMgZGlzcG9uw612ZWlzOlwiLFxuICAgIGNlbGxzRW1wdHlSb3dzQ29sdW1uczogXCJEZXZlIGV4aXN0aXIgcGVsbyBtZW5vcyB1bWEgY29sdW5hIG91IGxpbmhhXCIsXG5cbiAgICBwcm9wZXJ0eUlzRW1wdHk6IFwiUG9yIGZhdm9yIGluc2lyYSB1bSB2YWxvciBuYSBwcm9wcmllZGFkZVwiLFxuICAgIHByb3BlcnR5SXNOb1VuaXF1ZTogXCJQb3IgZmF2b3IgaW5zaXJhIHVtIHZhbG9yIMO6bmljb1wiLFxuICAgIHByb3BlcnR5TmFtZUlzTm90VW5pcXVlOiBcIlBvciBmYXZvciBpbnNpcmEgdW0gbm9tZSDDum5pY29cIixcbiAgICBsaXN0SXNFbXB0eTogXCJBZGljaW9uYXIgdW0gbm92byBpdGVtXCIsXG4gICAgZXhwcmVzc2lvbklzRW1wdHk6IFwiQSBFeHByZXNzw6NvIGVzdMOhIHZhemlhXCIsXG4gICAgdmFsdWU6IFwiVmFsb3JcIixcbiAgICB0ZXh0OiBcIlRleHRvXCIsXG4gICAgcm93aWQ6IFwiSUQgZGEgTGluaGFcIixcbiAgICBpbWFnZUxpbms6IFwiTGluayBkYSBJbWFnZW1cIixcbiAgICBjb2x1bW5FZGl0OiBcIkVkaXRhciBjb2x1bmE6IHswfVwiLFxuICAgIGl0ZW1FZGl0OiBcIkVkaXRhciBpdGVtOiB7MH1cIixcblxuICAgIHVybDogXCJVUkxcIixcbiAgICBwYXRoOiBcIkNhbWluaG9cIixcbiAgICB2YWx1ZU5hbWU6IFwiTm9tZSBkbyB2YWxvclwiLFxuICAgIHRpdGxlTmFtZTogXCJOb21lIGRvIHTDrXR1bG9cIixcbiAgICB0aXRsZVBsYWNlaG9sZGVyOiBcIkluc2lyYSBvIHTDrXR1bG8gYXF1aVwiLFxuICAgIHN1cnZleVRpdGxlUGxhY2Vob2xkZXI6IFwiSW5zaXJhIG8gdMOtdHVsbyBkbyBxdWVzdGlvbsOhcmlvIGFxdWlcIixcbiAgICBwYWdlVGl0bGVQbGFjZWhvbGRlcjogXCJJbnNpcmEgbyB0w610dWxvIGRhIHDDoWdpbmEgYXF1aVwiLFxuICAgIGRlc2NyaXB0aW9uUGxhY2Vob2xkZXI6IFwiSW5zaXJhIGEgZGVzY3Jpw6fDo29cIixcbiAgICBzdXJ2ZXlEZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcIkluc2lyYSBhIGRlc2NyacOnw6NvIGRvIHF1ZXN0aW9uw6FyaW9cIixcbiAgICBwYWdlRGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCJJbnNpcmEgYSBkZXNjcmnDp8OjbyBkYSBww6FnaW5hXCIsXG4gICAgXG4gICAgaGFzT3RoZXI6IFwiVGVtIGl0ZW0gJ291dHJvcydcIixcbiAgICBvdGhlclRleHQ6IFwiVGV4dG8gZG8gaXRlbSAnb3V0cm9zJ1wiLFxuICAgIGhhc05vbmU6IFwiVGVtIGl0ZW0gJ25lbmh1bSdcIixcbiAgICBub25lVGV4dDogXCJUZXh0byBkbyBpdGVtICduZW5odW0nXCIsXG4gICAgaGFzU2VsZWN0QWxsOiBcIlRlbSBpdGVtICdzZWxlY2lvbmFyIHRvZG9zJ1wiLFxuICAgIHNlbGVjdEFsbFRleHQ6IFwiVGV4dG8gZG8gaXRlbSAnc2VsZWNpb25hciB0b2RvcydcIixcbiAgICBjaG9pY2VzTWluOiBcIlZhbG9yIG3DrW5pbW8gcGFyYSBpdGVucyBnZXJhZG9zIGF1dG9tYXRpY2FtZW50ZVwiLFxuICAgIGNob2ljZXNNYXg6IFwiVmFsb3IgbcOheGltbyBwYXJhIGl0ZW5zIGdlcmFkb3MgYXV0b21hdGljYW1lbnRlXCIsXG4gICAgY2hvaWNlc1N0ZXA6IFwiQSBkaWZlcmVuw6dhIGVudHJlIGl0ZW5zIGdlcmFkb3MgYXV0b21hdGljYW1lbnRlXCIsXG4gICAgbmFtZTogXCJOb21lXCIsXG4gICAgdGl0bGU6IFwiVMOtdHVsb1wiLFxuICAgIGNlbGxUeXBlOiBcIlRpcG8gZGUgY8OpbHVsYVwiLFxuICAgIGNvbENvdW50OiBcIkNvbnRhZ2VtIGRlIGPDqWx1bGFzXCIsXG4gICAgY2hvaWNlc09yZGVyOiBcIlNlbGVjaW9uZSBhIG9yZGVtIGRhcyBhbHRlcm5hdGl2YXNcIixcbiAgICB2aXNpYmxlOiBcIsOJIHZpc8OtdmVsP1wiLFxuICAgIGlzUmVxdWlyZWQ6IFwiw4kgb2JyaWdhdMOzcmlvP1wiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwiT2JyaWdhdMOzcmlvIHJlc3Bvc3RhIHBhcmEgdG9kYXMgYXMgbGluaGFzXCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwiVGV4dG8gZG8gZXJybyBkZSBvYnJpZ2F0b3JpZWRhZGVcIixcbiAgICBzdGFydFdpdGhOZXdMaW5lOiBcIkNvbWXDp2EgY29tIHVtYSBub3ZhIGxpbmhhP1wiLFxuICAgIHJvd3M6IFwiQ29udGFnZW0gZGUgbGluaGFzXCIsXG4gICAgY29sczogXCJDb250YWdlbSBkZSBjb2x1bmFzXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwiUGxhY2Vob2xkZXJcIixcbiAgICBzaG93UHJldmlldzogXCJNb3N0cmEgcHLDqS12aXN1YWxpemHDp8OjbyBkZSBpbWFnZW0/XCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIkdyYXZhciBjb250ZcO6ZG8gZGUgYXJxdWl2byBubyByZXN1bHRhZG8gSlNPTiBjb21vIHRleHRvXCIsXG4gICAgbWF4U2l6ZTogXCJUYW1hbmhvIG3DoXhpbW8gZGUgYXJxdWl2byBlbSBieXRlc1wiLFxuICAgIGltYWdlSGVpZ2h0OiBcIkFsdHVyYSBkYSBpbWFnZW1cIixcbiAgICBpbWFnZVdpZHRoOiBcIkxhcmd1cmEgZGEgaW1hZ2VtXCIsXG4gICAgcm93Q291bnQ6IFwiQ29udGFnZW0gZGUgbGluaGFzXCIsXG4gICAgY29sdW1uTGF5b3V0OiBcIkxheW91dCBkYXMgY29sdW5hc1wiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcIkxvY2FsaXphw6fDo28gZG8gYm90w6NvIGRlIGFkaWNpb25hciBsaW5oYVwiLFxuICAgIGFkZFJvd1RleHQ6IFwiVGV4dG8gZG8gYm90w6NvIHBhcmEgYWRpY2lvbmFyIGxpbmhhc1wiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwiVGV4dG8gZG8gYm90w6NvIHBhcmEgcmVtb3ZlciBsaW5oYXNcIixcbiAgICByYXRlTWluOiBcIkF2YWxpYcOnw6NvIG3DrW5pbWFcIixcbiAgICByYXRlTWF4OiBcIkF2YWxpYcOnw6NvIG3DoXhpbWFcIixcbiAgICByYXRlU3RlcDogXCJJbmNyZW1lbnRvIGRhIGF2YWxpYcOnw6NvXCIsXG4gICAgbWluUmF0ZURlc2NyaXB0aW9uOiBcIkRlc2NyacOnw6NvIGRlIGF2YWxpYcOnw6NvIG3DrW5pbWFcIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwiRGVzY3Jpw6fDo28gZGUgYXZhbGlhw6fDo28gbcOheGltYVwiLFxuICAgIGlucHV0VHlwZTogXCJUaXBvIGRlIGNhbXBvXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiVMOtdHVsbyBkYXMgb3DDp8O1ZXNcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiVmFsb3IgZGVmYXVsdFwiLFxuICAgIGNlbGxzRGVmYXVsdFJvdzogXCJUZXh0byBkZWZhdWx0IGRhcyBjw6lsdWxhc1wiLFxuXG4gICAgc3VydmV5RWRpdG9yVGl0bGU6IFwiRWRpdGFyIGNvbmZpZ3VyYcOnw7VlcyBkbyBxdWVzdGlvbsOhcmlvXCIsXG4gICAgcUVkaXRvclRpdGxlOiBcIkVkaXRhciBwZXJndW50YTogezB9XCIsXG5cbiAgICBtYXhMZW5ndGg6IFwiVGFtYW5obyBtw6F4aW1vXCIsXG4gICAgXG4gICAgYnVpbGRFeHByZXNzaW9uOiBcIkNvbnN0cnVpclwiLFxuICAgIGVkaXRFeHByZXNzaW9uOiBcIkVkaXRhclwiLFxuICAgIGFuZDogXCJFXCIsXG4gICAgb3I6IFwiT3VcIixcbiAgICByZW1vdmU6IFwiUmVtb3ZlclwiLFxuICAgIGFkZENvbmRpdGlvbjogXCJBZGljaW9uYXIgY29uZGnDp8Ojb1wiLFxuXG4gICAgLy9zdXJ2ZXlcbiAgICBzaG93VGl0bGU6IFwiTW9zdHJhci9vY3VsdGFyIHTDrXR1bG9cIixcbiAgICBleHBhbmRDb2xsYXBzZVRpdGxlOiBcIkV4cGFuZGlyL2NvbGFwc2FyIHTDrXR1bG9cIixcbiAgICBsb2NhbGU6IFwiSWRpb21hIHBhZHLDo29cIixcbiAgICBzaW11bGF0b3I6IFwiRXNjb2xoYSBvIGRpc3Bvc2l0aXZvXCIsXG4gICAgbGFuZHNjYXBlT3JpZW50YXRpb246IFwiUGFpc2FnZW1cIixcbiAgICBtb2RlOiBcIk1vZG8gKGVkaXTDoXZlbC9zb21lbnRlIGxlaXR1cmEpXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiTGltcGFyIHZhbG9yZXMgaW52aXPDrXZlaXNcIixcbiAgICBjb29raWVOYW1lOiBcIk5vbWUgZG8gY29va2llIChwYXJhIGRlc2F0aXZhciBjb3JyYSBvIHF1ZXN0aW9uw6FyaW8gZHVhcyB2ZXplcyBsb2NhbG1lbnRlKVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcIkVudmlhciByZXN1bHRhZG8gZG8gcXVlc3Rpb27DoXJpbyBuYSBww6FnaW5hIHNlZ3VpbnRlXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiQXJtYXplbmFyICdvdXRyb3MnIHZhbG9yZXMgZW0gdW0gY2FtcG8gc2VwYXJhZG9cIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJNb3N0cmFyIHTDrXR1bG8gZGEgcMOhZ2luYVwiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCJNb3N0cmFyIG7Dum1lcm8gZGEgcMOhZ2luYVwiLFxuICAgIHBhZ2VQcmV2VGV4dDogXCJUZXh0byBwYXJhIGJvdMOjbyBkZSBww6FnaW5hIGFudGVyaW9yXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIlRleHRvIHBhcmEgYm90w6NvIGRlIHDDoWdpbmEgc2VndWludGVcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiVGV4dG8gcGFyYSBib3TDo28gZGUgY29tcGxldGFyXCIsXG4gICAgcHJldmlld1RleHQ6IFwiVGV4dG8gZG8gYm90w6NvIGRlIFByw6ktdmlzdWFsaXphw6fDo28nXCIsXG4gICAgZWRpdFRleHQ6IFwiVGV4dG8gZG8gYm90w6NvICdFZGl0YXInXCIsXG4gICAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlRleHRvIHBhcmEgYm90w6NvIGRlIGNvbWXDp2FyXCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIk1vc3RyYXIgYm90w7VlcyBkZSBuYXZlZ2HDp8OjbyAobmF2ZWdhw6fDo28gcGFkcsOjbylcIixcbiAgICBzaG93UHJldkJ1dHRvbjogXCJNb3N0cmFyIGJvdMOjbyBkZSB2b2x0YXIgKHV0aWxpemFkb3IgcG9kZSB2b2x0YXIgcGFyYSBhIHDDoWdpbmEgYW50ZXJpb3IpXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcIlByaW1laXJhIHDDoWdpbmEgZG8gcXVlc3Rpb27DoXJpbyDDqSBhIHDDoWdpbmEgZGUgaW7DrWNpby5cIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCJNb3N0cmFyIGEgcMOhZ2luYSBkZSBjb25jbHVzw6NvIG5vIGZpbmFsIChjb21wbGV0ZWRIdG1sKVwiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6XG4gICAgICBcIkFvIHJlc3BvbmRlciBhIHRvZGFzIGFzIHBlcmd1bnRhcywgaXIgYXV0b21hdGljYW1lbnRlIHBhcmEgYSBwcsOzeGltYSBww6FnaW5hXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIk1vc3RyYXIgYmFycmEgZGUgcHJvZ3Jlc3NvXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcIkxvY2FsaXphw6fDo28gZG8gdMOtdHVsbyBkYSBwZXJndW50YVwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJTw61tYm9sbyhzKSBwYXJhIHBlcmd1bnRhcyBvYnJpZ2F0w7NyaWFzXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcIkluZGV4IGRhcyBwZXJndW50YXMgKDEsIDIgb3IgJ0EnLCAnYScpXCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCJNb3N0cmFyIG7Dum1lcm8gZGFzIHBlcmd1bnRhc1wiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTpcbiAgICAgIFwiVGVtcGxhdGUgZG8gdMOtdHVsbyBkYSBwZXJndW50YSwgbyBwYWRyw6NvIMOpOiAne25vfS4ge29icmlnYXTDs3Jpb30ge3TDrXR1bG99J1wiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJMb2NhbGl6YcOnw6NvIGRvIGVycm8gZGEgcGVyZ3VudGFcIixcbiAgICBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWM6IFwiRm9jYXIgYXV0b21hdGljYW1lbnRlIG5hIHByaW1laXJhIHBlcmd1bnRhIGFvIHRyb2NhciBkZSBww6FnaW5hXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwiT3JkZW5hciBlbGVtZW50b3MgbmEgcMOhZ2luYVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJUZW1wbyBtw6F4aW1vIHBhcmEgZmluYWxpemFyIG8gcXVlc3Rpb27DoXJpb1wiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiVGVtcG8gbcOheGltbyBwYXJhIGZpbmFsaXphciBww6FnaW5hIGRvIHF1ZXN0aW9uw6FyaW9cIixcbiAgICBzaG93VGltZXJQYW5lbDogXCJNb3N0cmFyIG8gcGFpbmVsIGRlIGNyb27Ds21ldHJvXCIsXG4gICAgc2hvd1RpbWVyUGFuZWxNb2RlOiBcIk1vc3RyYXIgcGFpbmVsIGRlIG1vZG8gZGUgY3JvbsOzbWV0cm9cIixcbiAgICByZW5kZXJNb2RlOiBcIk1vZG8gZGUgcmVuZGVyaXphw6fDo29cIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIlBlcm1pdGlyIGFkaWNpb25hciBwYWluZWxcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIlBlcm1pdGlyIHJlbW92ZXIgcGFpbmVsXCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcIlRleHRvIGRlIGFkaWNpb25hciBwYWluZWxcIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwiVGV4dG8gZGUgcmVtb3ZlciBwYWluZWxcIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwiTW9zdHJhciB0b2RvcyBlbGVtZW50b3MgZW0gdW1hIHDDoWdpbmFcIixcbiAgICBodG1sOiBcIkh0bWxcIixcbiAgICBleHByZXNzaW9uOiBcIkV4cHJlc3PDo29cIixcbiAgICBcbiAgICBtaW5WYWx1ZTogXCJWYWxvciBtw61uaW1vXCIsXG4gICAgbWF4VmFsdWU6IFwiVmFsb3IgbcOheGltb1wiLFxuICAgIG1pbkxlbmd0aDogXCJUYW1hbmhvIG3DrW5pbW9cIixcbiAgICBhbGxvd0RpZ2l0czogXCJQZXJtaXRpciBkw61naXRvc1wiLFxuICAgIG1pbkNvdW50OiBcIkNvbnRhZ2VtIG3DrW5pbWFcIixcbiAgICBtYXhDb3VudDogXCJDb250YWdlbSBtw6F4aW1hXCIsXG4gICAgcmVnZXg6IFwiRXhwcmVzc8OjbyByZWd1bGFyXCIsXG4gICAgXG4gICAgdG90YWxUZXh0OiBcIlRleHRvIGRvIHRvdGFsXCIsXG4gICAgdG90YWxUeXBlOiBcIlRpcG8gZG8gdG90YWxcIixcbiAgICB0b3RhbEV4cHJlc3Npb246IFwiRXhwcmVzc8OjbyBkbyB0b3RhbFwiLFxuICAgIHRvdGFsRGlzcGxheVN0eWxlOiBcIkVzdGlsbyBkZSBleGliacOnw6NvIGRvIHRvdGFsXCIsXG4gICAgdG90YWxDdXJyZW5jeTogXCJNb2VkYSBkbyB0b3RhbFwiLFxuICAgIHRvdGFsRm9ybWF0OiBcIkZvcm1hdG8gZG8gdG90YWxcIixcbiAgICBcbiAgICAvLyBIZWFkZXIgIGFkb3JuZXJcbiAgICBsb2dvUG9zaXRpb246IFwiUG9zacOnw6NvIGRvIGxvZ290aXBvXCIsXG4gICAgYWRkTG9nbzogXCJBZGljaW9uYXIgbG9nb3RpcG8uLi5cIixcbiAgICBjaGFuZ2VMb2dvOiBcIkFsdGVyYXIgbG9nb3RpcG8uLi5cIixcbiAgICBsb2dvUG9zaXRpb25zOiB7XG4gICAgICBub25lOiBcIlJlbW92ZXIgbG9nb3RpcG9cIixcbiAgICAgIGxlZnQ6IFwiRXNxdWVyZGFcIixcbiAgICAgIHJpZ2h0OiBcIkRpcmVpdGFcIixcbiAgICAgIHRvcDogXCJObyB0b3BvXCIsXG4gICAgICBib3R0b206IFwiTm8gcm9kYXDDqVwiLFxuICAgIH0sXG5cbiAgICB0YWJzOiB7XG4gICAgICBnZW5lcmFsOiBcIkdlcmFsXCIsXG4gICAgICBmaWxlT3B0aW9uczogXCJPcMOnw7Vlc1wiLFxuICAgICAgaHRtbDogXCJFZGl0b3IgSHRtbFwiLFxuICAgICAgY29sdW1uczogXCJDb2x1bmFzXCIsXG4gICAgICByb3dzOiBcIkxpbmhhc1wiLFxuICAgICAgY2hvaWNlczogXCJPcMOnw7Vlc1wiLFxuICAgICAgaXRlbXM6IFwiSXRlbnNcIixcbiAgICAgIHZpc2libGVJZjogXCJWaXPDrXZlbCBzZVwiLFxuICAgICAgZW5hYmxlSWY6IFwiSGFiaWxpdGFyIHNlXCIsXG4gICAgICByZXF1aXJlZElmOiBcIk9icmlnYXTDs3JpbyBzZVwiLFxuICAgICAgcmF0ZVZhbHVlczogXCJWYWxvcmVzIGRlIEF2YWxpYcOnw6NvXCIsXG4gICAgICBjaG9pY2VzQnlVcmw6IFwiT3DDp8O1ZXMgY29tIG9yaWdlbSBuYSBXZWJcIixcbiAgICAgIG1hdHJpeENob2ljZXM6IFwiT3DDp8O1ZXMgcGFkcsOjb1wiLFxuICAgICAgbXVsdGlwbGVUZXh0SXRlbXM6IFwiRW50cmFkYXMgZGUgdGV4dG9cIixcbiAgICAgIG51bWJlcmluZzogXCJOdW1lcmHDp8Ojb1wiLFxuICAgICAgdmFsaWRhdG9yczogXCJWYWxpZGFkb3Jlc1wiLFxuICAgICAgbmF2aWdhdGlvbjogXCJOYXZlZ2HDp8Ojb1wiLFxuICAgICAgcXVlc3Rpb246IFwiUGVyZ3VudGFcIixcbiAgICAgIHBhZ2VzOiBcIlDDoWdpbmFzXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sOiBcIkh0bWwgZGUgY29uY2x1c8OjbyBkbyBxdWVzdGlvbsOhcmlvXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb246IFwiSHRtbCBjb25kaWNpb25hbCBkZSBjb25jbHVzw6NvIGRvIHF1ZXN0aW9uw6FyaW9cIixcbiAgICAgIGxvYWRpbmdIdG1sOiBcIkh0bWwgZGUgY2FycmVnYW1lbnRvIGRvIHF1ZXN0aW9uw6FyaW9cIixcbiAgICAgIHRpbWVyOiBcIkNyb27Ds21ldHJvL1F1aXpcIixcbiAgICAgIGNhbGN1bGF0ZWRWYWx1ZXM6IFwiVmFsb3JlcyBDYWxjdWxhZG9zXCIsXG4gICAgICB0cmlnZ2VyczogXCJHYXRpbGhvc1wiLFxuICAgICAgdGVtcGxhdGVUaXRsZTogXCJUw610dWxvIGRvIHRlbXBsYXRlXCIsXG4gICAgICB0b3RhbHM6IFwiVG90YWlzXCIsXG4gICAgICBsb2dpYzogXCJMw7NnaWNhXCIsXG4gICAgICBsYXlvdXQ6IFwiTGF5b3V0XCIsXG4gICAgICBkYXRhOiBcIkRhZG9zXCIsXG4gICAgICB2YWxpZGF0aW9uOiBcIlZhbGlkYcOnw6NvXCIsXG4gICAgICBjZWxsczogXCJDw6lsdWxhc1wiLFxuICAgICAgc2hvd09uQ29tcGxldGVkOiBcIk1vc3RyYXIgbmEgY29uY2x1c8Ojb1wiLFxuICAgICAgbG9nbzogXCJMb2dvIG5vIFTDrXR1bG8gZG8gUXVlc3Rpb27DoXJpb1wiLFxuICAgICAgc2xpZGVyOiBcIlNsaWRlclwiLFxuICAgICAgb3RoZXJzOiBcIk91dHJvc1wiLFxuICAgIH0sXG4gICAgZWRpdFByb3BlcnR5OiBcIkVkaXRhciBwcm9wcmllZGFkZSAnezB9J1wiLFxuICAgIGl0ZW1zOiBcIlsgSXRlbnM6IHswfSBdXCIsXG5cbiAgICBlbnRlck5ld1ZhbHVlOiBcIlBvciBmYXZvciwgaW5zaXJhIG8gdmFsb3IuXCIsXG4gICAgbm9xdWVzdGlvbnM6IFwiTsOjbyBow6EgbmVuaHVtYSBwZXJndW50YSBubyBxdWVzdGlvbsOhcmlvLlwiLFxuICAgIGNyZWF0ZXRyaWdnZXI6IFwiUG9yIGZhdm9yLCBjcmllIHVtIGdhdGlsaG9cIixcbiAgICB0aXRsZUtleWJvYXJkQWRvcm5lclRpcDogXCJQcmVzc2lvbmUgRW50ZXIgcGFyYSBlZGl0YXJcIixcbiAgICBrZXlib2FyZEFkb3JuZXJUaXA6XG4gICAgICBcIlByZXNzaW9uZSBvIGJvdMOjbyBFbnRlciBwYXJhIGVkaXRhciBvIGl0ZW0sIHByZXNzaW9uZSBvIGJvdMOjbyBFeGNsdWlyIHBhcmEgZXhjbHVpciBvIGl0ZW0sIHByZXNzaW9uZSBBbHQgbWFpcyBhIHNldGEgcGFyYSBjaW1hIG91IGEgc2V0YSBwYXJhIGJhaXhvIHBhcmEgbW92ZXIgbyBpdGVtXCIsXG4gICAgdHJpZ2dlck9uOiBcIkxpZ2FkbyBcIixcbiAgICB0cmlnZ2VyTWFrZVBhZ2VzVmlzaWJsZTogXCJUb3JuYXIgcMOhZ2luYXMgdmlzw612ZWlzOlwiLFxuICAgIHRyaWdnZXJNYWtlUXVlc3Rpb25zVmlzaWJsZTogXCJUb3JuYXIgcGVyZ3VudGFzIHZpc8OtdmVpczpcIixcbiAgICB0cmlnZ2VyQ29tcGxldGVUZXh0OiBcIkNvbXBsZXRhciBvIHF1ZXN0aW9uw6FyaW8gc2Ugb2J0aXZlciDDqnhpdG8uXCIsXG4gICAgdHJpZ2dlck5vdFNldDogXCJPIGdhdGlsaG8gbsOjbyBlc3TDoSBkZWZpbmlkb1wiLFxuICAgIHRyaWdnZXJSdW5JZjogXCJFeGVjdXRhciBzZVwiLFxuICAgIHRyaWdnZXJTZXRUb05hbWU6IFwiTXVkYXIgbyB2YWxvciBkZTogXCIsXG4gICAgdHJpZ2dlckZyb21OYW1lOiBcIkNvcGlhciB2YWxvciBkZTogXCIsXG4gICAgdHJpZ2dlclJ1bkV4cHJlc3Npb246IFwiRXhlY3V0YXIgZXN0YSBleHByZXNzw6NvOlwiLFxuICAgIHRyaWdnZXJTZXRWYWx1ZTogXCJwYXJhOiBcIixcbiAgICB0cmlnZ2VyR290b05hbWU6IFwiSXIgcGFyYSBhIHF1ZXN0w6NvOlwiLFxuICAgIHRyaWdnZXJJc1ZhcmlhYmxlOiBcIk7Do28gY29sb3F1ZSBhIHZhcmnDoXZlbCBubyByZXN1bHRhZG8gZG8gcXVlc3Rpb27DoXJpby5cIixcbiAgICB0cmlnZ2VyUnVuRXhwcmVzc2lvbkVtcHR5OiBcIlBvciBmYXZvciBpbnNpcmEgdW1hIGV4cHJlc3PDo28gdsOhbGlkYVwiLFxuICAgIFxuICAgIG5vRmlsZTogXCJOZW5odW0gYXJxdWl2byBzZWxlY2lvbmFkb1wiLFxuICB9LFxuICAvL1Byb3BlcnR5IHZhbHVlc1xuICBwdjoge1xuICAgIHRydWU6IFwidmVyZGFkZWlyb1wiLFxuICAgIGZhbHNlOiBcImZhbHNvXCIsXG4gICAgaW5oZXJpdDogXCJoZXJkYXJcIixcbiAgICBzaG93OiBcIm1vc3RyYXJcIixcbiAgICBoaWRlOiBcIm9jdWx0YXJcIixcbiAgICBkZWZhdWx0OiBcInBhZHLDo29cIixcbiAgICBpbml0aWFsOiBcImluaWNpYWxcIixcbiAgICByYW5kb206IFwiYWxlYXTDs3Jpb1wiLFxuICAgIGNvbGxhcHNlZDogXCJjb2xhcHNhZG9cIixcbiAgICBleHBhbmRlZDogXCJleHBhbmRpZG9cIixcbiAgICBub25lOiBcIm5lbmh1bVwiLFxuICAgIGFzYzogXCJhc2NlbmRlbnRlXCIsXG4gICAgZGVzYzogXCJkZXNjZW5kZW50ZVwiLFxuICAgIGluZGV0ZXJtaW5hdGU6IFwiaW5kZXRlcm1pbmFkb1wiLFxuICAgIGRlY2ltYWw6IFwiZGVjaW1hbFwiLFxuICAgIGN1cnJlbmN5OiBcIm1vZWRhXCIsXG4gICAgcGVyY2VudDogXCJwZXJjZW50YWdlbVwiLFxuICAgIGZpcnN0RXhwYW5kZWQ6IFwicHJpbWVpcm8gZXhwYW5kaWRvXCIsXG4gICAgb2ZmOiBcImRlc2xpZ2Fkb1wiLFxuICAgIG9uUGFuZWw6IFwibm8gcGFpbmVsXCIsXG4gICAgb25TdXJ2ZXk6IFwibm8gcXVlc3Rpb27DoXJpb1wiLFxuICAgIGxpc3Q6IFwibGlzdGFcIixcbiAgICBwcm9ncmVzc1RvcDogXCJwcm9ncmVzc28gc3VwZXJpb3JcIixcbiAgICBwcm9ncmVzc0JvdHRvbTogXCJwcm9ncmVzc28gaW5mZXJpb3JcIixcbiAgICBwcm9ncmVzc1RvcEJvdHRvbTogXCJwcm9ncmVzc28gc3VwZXJpb3IgaW5mZXJpb3JcIixcbiAgICBob3Jpem9udGFsOiBcImhvcml6b250YWxcIixcbiAgICB2ZXJ0aWNhbDogXCJ2ZXJ0aWNhbFwiLFxuICAgIHRvcDogXCJzdXBlcmlvclwiLFxuICAgIGJvdHRvbTogXCJpbmZlcmlvclwiLFxuICAgIHRvcEJvdHRvbTogXCJzdXBlcmlvciBlIGluZmVyaW9yXCIsXG4gICAgYm90aDogXCJhbWJvc1wiLFxuICAgIGxlZnQ6IFwiZXNxdWVyZGFcIixcbiAgICBjb2xvcjogXCJjb3JcIixcbiAgICBkYXRlOiBcImRhdGFcIixcbiAgICBkYXRldGltZTogXCJkYXRhIGUgaG9yYVwiLFxuICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjogXCJkYXRhIGUgaG9yYSAtIGxvY2FsXCIsXG4gICAgZW1haWw6IFwiZW1haWxcIixcbiAgICBtb250aDogXCJtw6pzXCIsXG4gICAgbnVtYmVyOiBcIm7Dum1lcm9cIixcbiAgICBwYXNzd29yZDogXCJzZW5oYVwiLFxuICAgIHJhbmdlOiBcImludGVydmFsb1wiLFxuICAgIHRlbDogXCJ0ZWxcIixcbiAgICB0ZXh0OiBcInRleHRvXCIsXG4gICAgdGltZTogXCJob3JhXCIsXG4gICAgdXJsOiBcInVybFwiLFxuICAgIHdlZWs6IFwic2VtYW5hXCIsXG4gICAgaGlkZGVuOiBcIm9jdWx0b1wiLFxuICAgIG9uOiBcImxpZ2Fkb1wiLFxuICAgIG9uUGFnZTogXCJuYSBww6FnaW5hXCIsXG4gICAgZWRpdDogXCJlZGl0YXJcIixcbiAgICBkaXNwbGF5OiBcIm1vc3RyYXJcIixcbiAgICBvbkNvbXBsZXRlOiBcImFvIGNvbXBsZXRhclwiLFxuICAgIG9uSGlkZGVuOiBcImFvIG9jdWx0YXJcIixcbiAgICBhbGw6IFwidG9kb3NcIixcbiAgICBwYWdlOiBcInDDoWdpbmFcIixcbiAgICBzdXJ2ZXk6IFwicXVlc3Rpb27DoXJpb1wiLFxuICAgIG9uTmV4dFBhZ2U6IFwibmEgcMOhZ2luYSBzZWd1aW50ZVwiLFxuICAgIG9uVmFsdWVDaGFuZ2VkOiBcImFvIG11ZGFyIHZhbG9yXCIsXG4gICAgc2luZ2xlUGFnZTogXCJww6FnaW5hIMO6bmljYVwiLFxuICAgIHN0YW5kYXJkOiBcInBhZHLDo29cIixcbiAgICBxdWVzdGlvblBlclBhZ2U6IFwicXVlc3TDtWVzIHBvciBww6FnaW5hXCIsXG4gICAgbm9QcmV2aWV3OiBcInNlbSBwcsOpLXZpc3VhbGl6YcOnw6NvXCIsXG4gICAgc2hvd0FsbFF1ZXN0aW9uczogXCJtb3N0cmFyIHByw6ktdmlzdWFsaXphw6fDo28gY29tIHRvZGFzIGFzIHF1ZXN0w7Vlc1wiLFxuICAgIHNob3dBbnN3ZXJlZFF1ZXN0aW9uczogXCJtb3N0cmFyIHByw6ktdmlzdWFsaXphw6fDo28gY29tIGFzIHF1ZXN0w7VlcyByZXNwb25kaWRhc1wiLFxuICB9LFxuICAvL09wZXJhdG9yc1xuICBvcDoge1xuICAgIGVtcHR5OiBcImVzdMOhIHZhemlvXCIsXG4gICAgbm90ZW1wdHk6IFwibsOjbyBlc3TDoSB2YXppb1wiLFxuICAgIGVxdWFsOiBcIsOpIGlndWFsXCIsXG4gICAgbm90ZXF1YWw6IFwibsOjbyDDqSBpZ3VhbFwiLFxuICAgIGNvbnRhaW5zOiBcImNvbnTDqW1cIixcbiAgICBub3Rjb250YWluczogXCJuw6NvIGNvbnTDqW1cIixcbiAgICBhbnlvZjogXCJxdWFscXVlciB1bSBkZVwiLFxuICAgIGFsbG9mOiBcInRvZG9zIGRlXCIsXG4gICAgZ3JlYXRlcjogXCJtYWlvclwiLFxuICAgIGxlc3M6IFwibWVub3JcIixcbiAgICBncmVhdGVyb3JlcXVhbDogXCJtYWlvciBvdSBpZ3VhbFwiLFxuICAgIGxlc3NvcmVxdWFsOiBcIm1lbm9yIG91IGlndWFsXCIsXG4gICAgYW5kOiBcImVcIixcbiAgICBvcjogXCJvdVwiLFxuICB9LFxuICAvL0VtYmVkIHdpbmRvd1xuICBldzoge1xuICAgIGFuZ3VsYXI6IFwiVXNhciB2ZXJzw6NvIEFuZ3VsYXJcIixcbiAgICBqcXVlcnk6IFwiVXNhciB2ZXJzw6NvIGpRdWVyeVwiLFxuICAgIGtub2Nrb3V0OiBcIlVzYXIgdmVyc8OjbyBLbm9ja291dFwiLFxuICAgIHJlYWN0OiBcIlVzYXIgdmVyc8OjbyBSZWFjdFwiLFxuICAgIHZ1ZTogXCJVc2FyIHZlcnPDo28gVnVlXCIsXG4gICAgYm9vdHN0cmFwOiBcIlBhcmEgZnJhbWV3b3JrIGJvb3RzdHJhcFwiLFxuICAgIG1vZGVybjogXCJUZW1hIE1vZGVyblwiLFxuICAgIGRlZmF1bHQ6IFwiVGVtYSBQYWRyw6NvXCIsXG4gICAgb3JhbmdlOiBcIlRlbWEgT3JhbmdlXCIsXG4gICAgZGFya2JsdWU6IFwiVGVtYSBEYXJrYmx1ZVwiLFxuICAgIGRhcmtyb3NlOiBcIlRlbWEgRGFya3Jvc2VcIixcbiAgICBzdG9uZTogXCJUZW1hIFN0b25lXCIsXG4gICAgd2ludGVyOiBcIlRlbWEgV2ludGVyXCIsXG4gICAgd2ludGVyc3RvbmU6IFwiVGVtYSBXaW50ZXJzdG9uZVwiLFxuICAgIHNob3dPblBhZ2U6IFwiTW9zdHJhciBxdWVzdGlvbsOhcmlvIG51bWEgcMOhZ2luYVwiLFxuICAgIHNob3dJbldpbmRvdzogXCJNb3N0cmFyIHF1ZXN0aW9uw6FyaW8gbnVtYSBqYW5lbGFcIixcbiAgICBsb2FkRnJvbVNlcnZlcjogXCJDYXJyZWdhciBKU09OIGRvIHF1ZXN0aW9uw6FyaW8gZGUgdW0gc2Vydmlkb3JcIixcbiAgICB0aXRsZVNjcmlwdDogXCJTY3JpcHRzIGUgZXN0aWxvc1wiLFxuICAgIHRpdGxlSHRtbDogXCJIVE1MXCIsXG4gICAgdGl0bGVKYXZhU2NyaXB0OiBcIkphdmFTY3JpcHRcIlxuICB9LFxuICAvL1Rlc3QgU3VydmV5XG4gIHRzOiB7XG4gICAgc2VsZWN0UGFnZTogXCJTZWxlY2lvbmUgYSBww6FnaW5hIHBhcmEgdGVzdGFyOlwiLFxuICAgIHNob3dJbnZpc2libGVFbGVtZW50czogXCJNb3N0cmFyIGVsZW1lbnRvcyBpbnZpc8OtdmVpc1wiXG4gIH0sXG4gIHZhbGlkYXRvcnM6IHtcbiAgICBhbnN3ZXJjb3VudHZhbGlkYXRvcjogXCJjb250YWRvciBkZSByZXNwb3N0YXNcIixcbiAgICBlbWFpbHZhbGlkYXRvcjogXCJlLW1haWxcIixcbiAgICBleHByZXNzaW9udmFsaWRhdG9yOiBcImV4cHJlc3PDo29cIixcbiAgICBudW1lcmljdmFsaWRhdG9yOiBcIm51bcOpcmljb1wiLFxuICAgIHJlZ2V4dmFsaWRhdG9yOiBcInJlZ2V4XCIsXG4gICAgdGV4dHZhbGlkYXRvcjogXCJ0ZXh0b1wiXG4gIH0sXG4gIHRyaWdnZXJzOiB7XG4gICAgY29tcGxldGV0cmlnZ2VyOiBcImNvbXBsZXRhciBxdWVzdGlvbsOhcmlvXCIsXG4gICAgc2V0dmFsdWV0cmlnZ2VyOiBcImRlZmluaXIgdmFsb3JcIixcbiAgICBjb3B5dmFsdWV0cmlnZ2VyOiBcImNvcGlhciB2YWxvclwiLFxuICAgIHNraXB0cmlnZ2VyOiBcInB1bGFyIHBhcmEgcXVlc3TDo29cIixcbiAgICBydW5leHByZXNzaW9udHJpZ2dlcjogXCJyb2RhciBleHByZXNzw6NvXCIsXG4gICAgdmlzaWJsZXRyaWdnZXI6IFwiYWx0ZXJhciB2aXNpYmlsaWRhZGVcIlxuICB9LFxuICBwZWhlbHA6IHtcbiAgICAvL2V4cHJlc3Npb246XG4gIH0sXG4gIC8vUHJvcGVydGllc1xuICBwOiB7XG4gICAgbmFtZTogXCJub21lXCIsXG4gICAgdGl0bGU6IHtcbiAgICAgIG5hbWU6IFwidMOtdHVsb1wiLFxuICAgICAgdGl0bGU6IFwiRGVpeGFyIHZhemlvIHNlIGZvciBvIG1lc21vIHF1ZSAnTm9tZSdcIlxuICAgIH0sXG5cbiAgICBuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHk6IFwiVmlzaWJpbGlkYWRlIGRvcyBib3TDtWVzIGRlIG5hdmVnYcOnw6NvXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwiT3JkZW5hciBlbGVtZW50b3MgbmEgcMOhZ2luYVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJUZW1wbyBtw6F4aW1vIHBhcmEgZmluYWxpemFyIHF1ZXN0aW9uw6FyaW9cIixcblxuICAgIHZpc2libGU6IFwiVmlzw612ZWw/XCIsXG4gICAgdmlzaWJsZUlmOiBcIlZpc8OtdmVsIHNlXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcIkxvY2FsaXphw6fDo28gZG8gdMOtdHVsbyBkYSBwZXJndW50YVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkRlc2NyacOnw6NvXCIsXG4gICAgc3RhdGU6IFwiRXN0YWRvXCIsXG4gICAgaXNSZXF1aXJlZDogXCJPYnJpZ2F0w7NyaW8/XCIsXG4gICAgcmVxdWlyZWRJZjogXCJPYnJpZ2F0w7NyaW8gc2VcIixcbiAgICBpbmRlbnQ6IFwiSW5kZW50YcOnw6NvXCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwiVGV4dG8gZGUgZXJybyBwYXJhIG9icmlnYXTDs3Jpb1wiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwiQ29tZcOnYXIgY29tIHVtYSBub3ZhIGxpbmhhXCIsXG4gICAgaW5uZXJJbmRlbnQ6IFwiSW5kZW50YcOnw6NvIGludGVybmFcIixcbiAgICBwYWdlOiBcIlDDoWdpbmFcIixcblxuICAgIHdpZHRoOiBcIkxhcmd1cmFcIixcblxuICAgIGNvbW1lbnRUZXh0OiBcIlRleHRvIGRvIGNvbWVudMOhcmlvXCIsXG4gICAgdmFsdWVOYW1lOiBcIk5vbWUgZG8gdmFsb3JcIixcbiAgICBlbmFibGVJZjogXCJIYWJpbGl0YXIgc2VcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiVmFsb3IgZGVmYXVsdFwiLFxuICAgIGNvcnJlY3RBbnN3ZXI6IFwiUmVzcG9zdGEgY29ycmV0YVwiLFxuICAgIHJlYWRPbmx5OiBcIlNvbWVudGUgbGVpdHVyYVwiLFxuICAgIHZhbGlkYXRvcnM6IFwiVmFsaWRhZG9yZXNcIixcbiAgICB0aXRsZUxvY2F0aW9uOiBcIkxvY2FsaXphw6fDo28gZG8gdMOtdHVsb1wiLFxuXG4gICAgaGFzQ29tbWVudDogXCJUZW0gY29tZW50w6FyaW9cIixcbiAgICBoYXNPdGhlcjogXCJUZW0gaXRlbSAnb3V0cm9zJ1wiLFxuICAgIGNob2ljZXM6IFwiT3DDp8O1ZXNcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwiU2VsZWNpb25lIGEgb3JkZW0gZGFzIG9ww6fDtWVzXCIsXG4gICAgY2hvaWNlc0J5VXJsOiBcIk9ww6fDtWVzIGNvbSBvcmlnZW0gbmEgV2ViXCIsXG4gICAgb3RoZXJUZXh0OiBcIlRleHRvIGRvIGl0ZW0gJ291dHJvcydcIixcbiAgICBvdGhlckVycm9yVGV4dDogXCJUZXh0byBkZSBlcnJvIGRhIG9ww6fDo28gJ291dHJvcydcIixcbiAgICBzdG9yZU90aGVyc0FzQ29tbWVudDogXCJBcm1hemVuYXIgJ291dHJvcycgdmFsb3JlcyBlbSB1bSBjYW1wbyBzZXBhcmFkb1wiLFxuXG4gICAgbGFiZWw6IFwiTGFiZWxcIixcbiAgICBzaG93VGl0bGU6IFwiTW9zdHJhciB0w610dWxvXCIsXG4gICAgdmFsdWVUcnVlOiBcIlZhbG9yIHZlcmRhZGVpcm9cIixcbiAgICB2YWx1ZUZhbHNlOiBcIlZhbG9yIGZhbHNvXCIsXG5cbiAgICBjb2xzOiBcIkNvbHVuYXNcIixcbiAgICByb3dzOiBcIkxpbmhhc1wiLFxuICAgIHBsYWNlSG9sZGVyOiBcInBsYWNlaG9sZGVyXCIsXG5cbiAgICBvcHRpb25zQ2FwdGlvbjogXCJUw610dWxvIGRhcyBvcMOnw7Vlc1wiLFxuXG4gICAgZXhwcmVzc2lvbjogXCJFeHByZXNzw6NvXCIsXG4gICAgZm9ybWF0OiBcIkZvcm1hdG9cIixcbiAgICBkaXNwbGF5U3R5bGU6IFwiTW9zdHJhciBlc3RpbG9cIixcbiAgICBjdXJyZW5jeTogXCJNb2VkYVwiLFxuICAgIHVzZUdyb3VwaW5nOiBcIlVzYXIgYWdydXBhbWVudG9cIixcblxuICAgIHNob3dQcmV2aWV3OiBcIk1vc3RyYXIgcHLDqS12aXN1YWxpemHDp8Ojb1wiLFxuICAgIGFsbG93TXVsdGlwbGU6IFwiUGVybWl0aXIgbcO6bHRpcGxvc1wiLFxuICAgIGltYWdlSGVpZ2h0OiBcIkFsdHVyYSBkYSBpbWFnZW1cIixcbiAgICBpbWFnZVdpZHRoOiBcIkxhcmd1cmEgZGEgaW1hZ2VtXCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIkFybWF6ZW5hciBkYWRvcyBjb21vIHRleHRvXCIsXG4gICAgbWF4U2l6ZTogXCJUYW1hbmhvIG3DoXhpbW9cIixcblxuICAgIGh0bWw6IFwiaHRtbFwiLFxuXG4gICAgY29sdW1uczogXCJDb2x1bmFzXCIsXG4gICAgY2VsbHM6IFwiQ8OpbHVsYXNcIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcIlRvZGFzIGFzIGxpbmhhcyBzw6NvIG9icmlnYXTDs3JpYXNcIixcblxuICAgIGhvcml6b250YWxTY3JvbGw6IFwiU2Nyb2xsIGhvcml6b250YWxcIixcbiAgICBjZWxsVHlwZTogXCJUaXBvIGRlIGPDqWx1bGFcIixcbiAgICBjb2x1bW5zTGF5b3V0OiBcIkxheW91dCBkZSBjb2x1bmFzXCIsXG4gICAgY29sdW1uQ29sQ291bnQ6IFwiQ29udGFkb3IgZGUgY8OpbHVsYXMgZGUgY29sdW5hXCIsXG4gICAgY29sdW1uTWluV2lkdGg6IFwiTGFyZ3VyYSBtw61uaW1hIGRhIGNvbHVuYVwiLFxuXG4gICAgcm93Q291bnQ6IFwiQ29udGFnZW0gZGUgbGluaGFzXCIsXG4gICAgbWluUm93Q291bnQ6IFwiQ29udGFnZW0gZGUgbGluaGFzIG3DrW5pbWFcIixcbiAgICBtYXhSb3dDb3VudDogXCJDb250YWdlbSBkZSBsaW5oYXMgbcOheGltYVwiLFxuICAgIGtleU5hbWU6IFwiTm9tZSBkYSBjaGF2ZVwiLFxuICAgIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRXJybyBkZSBjaGF2ZSBkdXBsaWNhZGFcIixcbiAgICBjb25maXJtRGVsZXRlOiBcIkNvbmZpcm1hciBhcGFnYXJcIixcbiAgICBjb25maXJtRGVsZXRlVGV4dDogXCJUZXh0byBkZSBjb25maXJtYXIgYXBhZ2FyXCIsXG4gICAgYWRkUm93TG9jYXRpb246IFwiTG9jYWxpemHDp8OjbyBkbyBib3TDo28gZGUgYWRpY2lvbmFyIGxpbmhhXCIsXG4gICAgYWRkUm93VGV4dDogXCJUZXh0byBkbyBib3TDo28gcGFyYSBhZGljaW9uYXIgbGluaGFzXCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCJUZXh0byBkbyBib3TDo28gcGFyYSByZW1vdmVyIGxpbmhhc1wiLFxuXG4gICAgaXRlbXM6IFwiSXRlbnNcIixcbiAgICBpdGVtU2l6ZTogXCJUYW1hbmhvIGRvIGl0ZW1cIixcbiAgICBjb2xDb3VudDogXCJDb250YWdlbSBkZSBjw6lsdWxhc1wiLFxuXG4gICAgdGVtcGxhdGVUaXRsZTogXCJUw610dWxvIGRvIHRlbXBsYXRlXCIsXG4gICAgdGVtcGxhdGVEZXNjcmlwdGlvbjogXCJEZXNjcmnDp8OjbyBkbyB0ZW1wbGF0ZVwiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwiUGVybWl0aXIgYWRpY2lvbmFyIHBhaW5lbFwiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwiUGVybWl0aXIgcmVtb3ZlciBwYWluZWxcIixcbiAgICBwYW5lbENvdW50OiBcIkNvbnRhZG9yIGRvIHBhaW5lbFwiLFxuICAgIG1pblBhbmVsQ291bnQ6IFwiQ29udGFkb3IgZG8gcGFpbmVsIG3DrW5pbW9cIixcbiAgICBtYXhQYW5lbENvdW50OiBcIkNvbnRhZG9yIGRvIHBhaW5lbCBtw6F4aW1vXCIsXG4gICAgcGFuZWxzU3RhdGU6IFwiRXN0YWRvIGRvcyBwYWluw6lpc1wiLFxuICAgIHBhbmVsQWRkVGV4dDogXCJUZXh0byBkZSBhZGljaW9uYXIgcGFpbmVsXCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcIlRleHRvIGRlIHJlbW92ZXIgcGFpbmVsXCIsXG4gICAgcGFuZWxQcmV2VGV4dDogXCJUZXh0byBkbyBwYWluZWwgYW50ZXJpb3JcIixcbiAgICBwYW5lbE5leHRUZXh0OiBcIlRleHRvIGRvIHByw7N4aW1vIHBhaW5lbFwiLFxuICAgIHNob3dRdWVzdGlvbk51bWJlcnM6IFwiTW9zdHJhciBuw7ptZXJvIGRhcyBwZXJndW50YXNcIixcbiAgICBzaG93UmFuZ2VJblByb2dyZXNzOiBcInNob3dSYW5nZUluUHJvZ3Jlc3NcIixcbiAgICByZW5kZXJNb2RlOiBcIk1vZG8gZGUgcmVuZGVyaXphw6fDo29cIixcbiAgICB0ZW1wbGF0ZVRpdGxlTG9jYXRpb246IFwiTG9jYWxpemHDp8OjbyBkbyB0w610dWxvIGRvIHRlbXBsYXRlXCIsXG5cbiAgICByYXRlVmFsdWVzOiBcIlZhbG9yZXMgZGUgYXZhbGlhw6fDo29cIixcbiAgICByYXRlTWluOiBcIkF2YWxpYcOnw6NvIG3DrW5pbWFcIixcbiAgICByYXRlTWF4OiBcIkF2YWxpYcOnw6NvIG3DoXhpbWFcIixcbiAgICByYXRlU3RlcDogXCJJbmNyZW1lbnRvIGRhIGF2YWxpYcOnw6NvXCIsXG4gICAgbWluUmF0ZURlc2NyaXB0aW9uOiBcIkRlc2NyacOnw6NvIGRlIGF2YWxpYcOnw6NvIG3DrW5pbWFcIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwiRGVzY3Jpw6fDo28gZGUgYXZhbGlhw6fDo28gbcOheGltYVwiLFxuXG4gICAgaW5wdXRUeXBlOiBcIlRpcG8gZGUgY2FtcG9cIixcbiAgICBzaXplOiBcIlRhbWFuaG9cIixcblxuICAgIGxvY2FsZTogXCJMb2NhbGlkYWRlXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcIkZvY2FyIGF1dG9tYXRpY2FtZW50ZSBuYSBwcmltZWlyYSBwZXJndW50YVwiLFxuICAgIGNvbXBsZXRlZEh0bWw6IFwiSHRtbCBhbyBjb21wbGV0YXJcIixcbiAgICBjb21wbGV0ZWRCZWZvcmVIdG1sOiBcIkh0bWwgYW50ZXMgZGUgY29tcGxldGFyXCIsXG4gICAgbG9hZGluZ0h0bWw6IFwiSHRtbCAnYSBjYXJyZWdhcidcIixcbiAgICB0cmlnZ2VyczogXCJUcmlnZ2Vyc1wiLFxuICAgIGNvb2tpZU5hbWU6IFwiTm9tZSBkbyBjb29raWVcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCJFbnZpYXIgcmVzdWx0YWRvIGRvIHF1ZXN0aW9uw6FyaW8gbmEgcMOhZ2luYSBzZWd1aW50ZVwiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczogXCJNb3N0cmFyIGJvdMO1ZXMgZGUgbmF2ZWdhw6fDo28gKG5hdmVnYcOnw6NvIGRlZmF1bHQpXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwiTW9zdHJhciBib3TDo28gZGUgdm9sdGFyICh1dGlsaXphZG9yIHBvZGUgdm9sdGFyIMOgIHDDoWdpbmEgYW50ZXJpb3IpXCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwiTW9zdHJhciB0w610dWxvIGRhIHDDoWdpbmFcIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCJNb3N0cmFyIGEgcMOhZ2luYSBkZSBjb25jbHVzw6NvIG5vIGZpbmFsIChjb21wbGV0ZWRIdG1sKVwiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCJNb3N0cmFyIG7Dum1lcm8gZGEgcMOhZ2luYVwiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJMb2NhbGl6YcOnw6NvIGRvIGVycm8gZGEgcGVyZ3VudGFcIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwiTW9zdHJhciBiYXJyYSBkZSBwcm9ncmVzc29cIixcbiAgICBtb2RlOiBcIk1vZG9cIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOiBcIkFvIHJlc3BvbmRlciB0b2RhcyBhcyBwZXJndW50YXMsIGlyIGF1dG9tYXRpY2FtZW50ZSBwYXJhIGEgcHLDs3hpbWEgcMOhZ2luYVwiLFxuICAgIGNoZWNrRXJyb3JzTW9kZTogXCJNb2RvIGRlIHZlcmlmaWNhw6fDo28gZGUgZXJyb3NcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCJMaW1wYXIgdmFsb3JlcyBpbnZpc8OtdmVpc1wiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJUZXh0byBwYXJhIGJvdMOjbyBkZSBjb21lw6dhclwiLFxuICAgIHBhZ2VQcmV2VGV4dDogXCJUZXh0byBwYXJhIGJvdMOjbyBkZSBww6FnaW5hIGFudGVyaW9yXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIlRleHRvIHBhcmEgYm90w6NvIGRlIHDDoWdpbmEgc2VndWludGVcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiVGV4dG8gcGFyYSBib3TDo28gZGUgY29tcGxldGFyXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcIlPDrW1ib2xvKHMpIHBhcmEgcGVyZ3VudGFzIG9icmlnYXTDs3JpYXNcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwiSW5kZXggZGFzIHBlcmd1bnRhcyAoMSwgMiBvciAnQScsICdhJylcIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6IFwiVGVtcGxhdGUgZG8gdMOtdHVsbyBkYSBwZXJndW50YSwgZGVmYXVsdCDDqTogJ3tub30uIHtvYnJpZ2F0w7NyaW99IHt0w610dWxvfSdcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwiUHJpbWVpcmEgcMOhZ2luYSBkbyBxdWVzdGlvbsOhcmlvIMOpIGEgcMOhZ2luYSBkZSBpbsOtY2lvLlwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJNb3N0cmFyIHRvZG9zIGVsZW1lbnRvcyBlbSB1bWEgcMOhZ2luYVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiVGVtcG8gbcOheGltbyBwYXJhIGZpbmFsaXphciBww6FnaW5hIGRvIHF1ZXN0aW9uw6FyaW9cIixcbiAgICBzaG93VGltZXJQYW5lbDogXCJNb3N0cmFyIG8gcGFpbmVsIGRlIGNyb27Ds21ldHJvXCIsXG4gICAgc2hvd1RpbWVyUGFuZWxNb2RlOiBcIk1vc3RyYXIgcGFpbmVsIGRlIG1vZG8gZGUgY3JvbsOzbWV0cm9cIixcblxuICAgIGRlZmF1bHRQYW5lbFZhbHVlOiBcInZhbG9yIHBvciBkZWZlaXRvIGRvIHBhaW5lbFwiLFxuICAgIGRlZmF1bHRSb3dWYWx1ZTogXCJ2YWxvciBwb3IgZGVmZWl0byBkYSBsaW5oYVwiLFxuICAgIGhhc05vbmU6IFwibsOjbyB0ZW0gbmVuaHVtXCIsXG4gICAgbm9uZVRleHQ6IFwibmVuaHVtIHRleHRvXCIsXG5cbiAgICB0ZXh0OiBcInRleHRvXCIsXG4gIH1cbn07XG5cbmVkaXRvckxvY2FsaXphdGlvbi5sb2NhbGVzW1wicHRcIl0gPSBwb3J0dWd1ZXNlVHJhbnNsYXRpb247XG4iLCIvL1VuY29tbWVudCB0aGlzIGxpbmUgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlXG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24sIGRlZmF1bHRTdHJpbmdzIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuXG5leHBvcnQgdmFyIHJ1U3RyaW5ncyA9IHtcbiAgLy8gc3RyaW5ncyBmb3Igc3VydmV5IHRlbXBsYXRlc1xuICBzdXJ2ZXk6IHtcbiAgICBlZGl0OiBcItCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMXCIsXG4gICAgZXh0ZXJuYWxIZWxwTGluazogXCLQndCw0YPRh9C40YLRjNGB0Y8g0YHQvtC30LTQsNCy0LDRgtGMINC+0L/RgNC+0YHRi1wiLFxuICAgIGV4dGVybmFsSGVscExpbmtVcmw6XG4gICAgICBcIkh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2NoYW5uZWwvVUNIMnJ1OW9rSWNvb05aZnBJYnlxNHFRP3ZpZXdfYXM9c3Vic2NyaWJlclwiLFxuICAgIGRyb3BRdWVzdGlvbjogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0L/QtdGA0LXRgtGP0L3QuNGC0LUg0L3QtdC+0LHRhdC+0LTQuNC80YvQuSDRjdC70LXQvNC10L3RgiDQuNC3INC/0LDQvdC10LvQuCDRgdC70LXQstCwXCIsXG4gICAgY29weTogXCLQmtC+0L/QuNGA0L7QstCw0YLRjFwiLFxuICAgIGFkZFRvVG9vbGJveDogXCLQlNC+0LHQsNCy0LjRgtGMINC6INC40L3RgdGC0YDRg9C80LXQvdGC0LDQvFwiLFxuICAgIGRlbGV0ZVBhbmVsOiBcItCj0LTQsNC70LjRgtGMINC/0LDQvdC10LvRjFwiLFxuICAgIGRlbGV0ZVF1ZXN0aW9uOiBcItCj0LTQsNC70LjRgtGMINCy0L7Qv9GA0L7RgVwiLFxuICAgIGNvbnZlcnRUbzogXCLQn9GA0LXQvtCx0YDQsNC30L7QstCw0YLRjCDQslwiLFxuICAgIGRyYWc6IFwi0J/QtdGA0LXRgtGP0L3Rg9GC0Ywg0Y3Qu9C10LzQtdC90YJcIlxuICB9LFxuICAvLyBxdWVzdGlvblR5cGVzXG4gIHF0OiB7XG4gICAgZGVmYXVsdDogXCLQn9C+INGD0LzQvtC70YfQsNC90LjRjlwiLFxuICAgIGNoZWNrYm94OiBcItCc0L3QvtC20LXRgdGC0LLQtdC90L3Ri9C5INCy0YvQsdC+0YBcIixcbiAgICBjb21tZW50OiBcItCa0L7QvNC80LXQvdGC0LDRgNC40LlcIixcbiAgICBpbWFnZXBpY2tlcjogXCLQktGL0LHQvtGAINC40LfQvtCx0YDQsNC20LXQvdC40Y9cIixcbiAgICBkcm9wZG93bjogXCLQktGL0L/QsNC00LDRjtGJ0LjQuSDRgdC/0LjRgdC+0LpcIixcbiAgICBmaWxlOiBcItCX0LDQs9GA0YPQt9C60LAg0YTQsNC50LvQvtCyXCIsXG4gICAgSFRNTDogXCJIVE1MXCIsXG4gICAgbWF0cml4OiBcItCc0LDRgtGA0LjRhtCwICjQtdC00LjQvdC40YfQvdGL0Lkg0LLRi9Cx0L7RgClcIixcbiAgICBtYXRyaXhkcm9wZG93bjogXCLQnNCw0YLRgNC40YbQsCAo0LzQvdC+0LbQtdGB0YLQstC10L3QvdGL0Lkg0LLRi9Cx0L7RgClcIixcbiAgICBtYXRyaXhkeW5hbWljOiBcItCc0LDRgtGA0LjRhtCwICjQtNC40L3QsNC80LjRh9C10YHQutC40LUg0YDRj9C00YspXCIsXG4gICAgbXVsdGlwbGV0ZXh0OiBcIk11bHRpcGxlIFRleHRcIixcbiAgICBwYW5lbDogXCLQn9Cw0L3QtdC70YwgKNC00LvRjyDQs9GA0YPQv9C/0Ysg0LLQvtC/0YDQvtGB0L7QsilcIixcbiAgICBwYW5lbGR5bmFtaWM6IFwi0J/QsNC90LXQu9GMICjQtNC40L3QsNC80LjRh9C10YHQutC40LUg0L/QsNC90LXQu9C4KVwiLFxuICAgIHJhZGlvZ3JvdXA6IFwi0JXQtNC40L3QuNGH0L3Ri9C5INCy0YvQsdC+0YBcIixcbiAgICByYXRpbmc6IFwi0KDQtdC50YLQuNC90LMgKNGI0LrQsNC70LApXCIsXG4gICAgdGV4dDogXCLQotC10LrRgdGC0L7QstGL0Lkg0LLQstC+0LRcIixcbiAgICBib29sZWFuOiBcItCR0YPQu9C40LXQstC+0LUg0LfQvdCw0YfQtdC90LjQtVwiLFxuICAgIGV4cHJlc3Npb246IFwi0JLRi9GA0LDQttC10L3QuNC1ICjRgtC+0LvRjNC60L4g0LTQu9GPINGH0YLQtdC90LjRjylcIixcbiAgICBmbG93UGFuZWw6IFwi0J/QsNC90LXQu9GMINC/0L7RgtC+0LrQsFwiXG4gIH0sXG4gIC8vIFN0cmluZ3MgaW4gRWRpdG9yXG4gIGVkOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCLQn9C+INGD0LzQvtC70YfQsNC90LjRjiAoezB9KVwiLFxuICAgIHN1cnZleTogXCLQntC/0YDQvtGB0L3QuNC6XCIsXG4gICAgc2V0dGluZ3M6IFwi0J3QsNGB0YLRgNC+0LnQutC4INC+0L/RgNC+0YHQvdC40LrQsFwiLFxuICAgIG9wamVjdFByb3BlcnRpZXNIZWFkZXI6IFwi0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtVwiLFxuICAgIHNob3dPYmplY3RQcm9wZXJ0aWVzOiBcItCf0L7QutCw0LfQsNGC0Ywg0YHQstC+0LnRgdGC0LLQsCDQvtCx0YrQtdC60YLQsFwiLFxuICAgIGhpZGVPYmplY3RQcm9wZXJ0aWVzOiBcItCh0LrRgNGL0YLRjCDRgdCy0L7QudGB0YLQstCwINC+0LHRitC10LrRgtCwXCIsXG4gICAgZWRpdFN1cnZleTogXCLQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQvtC/0YDQvtGB0L3QuNC6XCIsXG4gICAgYWRkTmV3UGFnZTogXCLQlNC+0LHQsNCy0LjRgtGMINC90L7QstGD0Y4g0YHRgtGA0LDQvdC40YbRg1wiLFxuICAgIG1vdmVSaWdodDogXCLQn9GA0L7QutGA0YPRgtC40YLRjCDQstC/0YDQsNCy0L5cIixcbiAgICBtb3ZlTGVmdDogXCLQn9GA0L7QutGA0YPRgtC40YLRjCDQstC70LXQstC+XCIsXG4gICAgZGVsZXRlUGFnZTogXCLQo9C00LDQu9C40YLRjCDRgdGC0YDQsNC90LjRhtGDXCIsXG4gICAgZWRpdFBhZ2U6IFwi0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0YHRgtGA0LDQvdC40YbRg1wiLFxuICAgIGVkaXQ6IFwi0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0YxcIixcbiAgICBuZXdQYWdlTmFtZTogXCLRgdGC0YDQsNC90LjRhtCwXCIsXG4gICAgbmV3UXVlc3Rpb25OYW1lOiBcItCy0L7Qv9GA0L7RgVwiLFxuICAgIG5ld1BhbmVsTmFtZTogXCLQv9Cw0L3QtdC70YxcIixcbiAgICBuZXdUZXh0SXRlbU5hbWU6IFwi0YLQtdC60YHRglwiLFxuICAgIHRlc3RTdXJ2ZXk6IFwi0KLQtdGB0YLQuNGA0L7QstCw0YLRjCDQvtC/0YDQvtGB0L3QuNC6XCIsXG4gICAgdGVzdFN1cnZleUFnYWluOiBcItCi0LXRgdGC0LjRgNC+0LLQsNGC0Ywg0LXRidC1INGA0LDQt1wiLFxuICAgIHRlc3RTdXJ2ZXlXaWR0aDogXCLQqNC40YDQuNC90LAg0L7Qv9GA0L7RgdC90LjQutCwOlwiLFxuICAgIGxvZ2ljOiBcItCb0L7Qs9C40LrQsCDQvtC/0YDQvtGB0L3QuNC60LBcIixcbiAgICBlbWJlZFN1cnZleTogXCLQktGB0YLQsNCy0LjRgtGMINC+0L/RgNC+0YHQvdC40LpcIixcbiAgICB0cmFuc2xhdGlvbjogXCLQn9C10YDQtdCy0L7QtFwiLFxuICAgIFwicHJvcGVydHktZ3JpZFwiOiBcItCh0LLQvtC50YHRgtCy0LBcIixcbiAgICBzYXZlU3VydmV5OiBcItCh0L7RhdGA0LDQvdC40YLRjCDQvtC/0YDQvtGB0L3QuNC6XCIsXG4gICAgZGVzaWduZXI6IFwi0J7QsdC30L7RgCDQutC+0L3RgdGC0YDRg9C60YLQvtGA0LBcIixcbiAgICBqc29uRWRpdG9yOiBcIkpTT04g0YDQtdC00LDQutGC0L7RgFwiLFxuICAgIHVuZG86IFwi0J7RgtC80LXQvdC40YLRjFwiLFxuICAgIHJlZG86IFwi0J/QvtCy0YLQvtGAXCIsXG4gICAgb3B0aW9uczogXCLQn9Cw0YDQsNC80LXRgtGA0YtcIixcbiAgICBnZW5lcmF0ZVZhbGlkSlNPTjogXCLQodGE0L7RgNC80LjRgNC+0LLQsNGC0Ywg0LLQsNC70LjQtNC90YvQuSBKU09OXCIsXG4gICAgZ2VuZXJhdGVSZWFkYWJsZUpTT046IFwi0KHRhNC+0YDQvNC40YDQvtCy0LDRgtGMINGH0LjRgtCw0LXQvNGL0LkgSlNPTlwiLFxuICAgIHRvb2xib3g6IFwi0J/QsNC90LXQu9GMINC40L3RgdGC0YDRg9C80LXQvdGC0L7QslwiLFxuICAgIHRvb2xib3hHZW5lcmFsQ2F0ZWdvcnk6IFwi0J7QsdGJ0LjQtVwiLFxuICAgIGRlbFNlbE9iamVjdDogXCLQo9C00LDQu9C40YLRjCDQstGL0LHRgNCw0L3QvdGL0Lkg0L7QsdGK0LXQutGCXCIsXG4gICAgZWRpdFNlbE9iamVjdDogXCLQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQstGL0LHRgNCw0L3QvdGL0Lkg0L7QsdGK0LXQutGCXCIsXG4gICAgY29ycmVjdEpTT046IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINC40YHQv9GA0LDQstGM0YLQtSBKU09OLlwiLFxuICAgIHN1cnZleVJlc3VsdHM6IFwi0KDQtdC30YPQu9GM0YLQsNGC0Ysg0L7QsdGB0LvQtdC00L7QstCw0L3QuNGPOlwiLFxuICAgIHN1cnZleVJlc3VsdHNUYWJsZTogXCLQmtCw0Log0YLQsNCx0LvQuNGG0LBcIixcbiAgICBzdXJ2ZXlSZXN1bHRzSnNvbjogXCLQmtCw0LogSlNPTlwiLFxuICAgIHJlc3VsdHNUaXRsZTogXCLQl9Cw0LPQvtC70L7QstC+0Log0LLQvtC/0YDQvtGB0LBcIixcbiAgICByZXN1bHRzTmFtZTogXCLQndCw0LfQstCw0L3QuNC1INCy0L7Qv9GA0L7RgdCwXCIsXG4gICAgcmVzdWx0c1ZhbHVlOiBcItCX0L3QsNGH0LXQvdC40LUg0L7RgtCy0LXRgtCwXCIsXG4gICAgcmVzdWx0c0Rpc3BsYXlWYWx1ZTogXCLQntGC0L7QsdGA0LDQttCw0LXQvNC+0LUg0LfQvdCw0YfQtdC90LjQtVwiLFxuICAgIG1vZGlmaWVkOiBcItCc0L7QtNC40YTQuNGG0LjRgNC+0LLQsNC9XCIsXG4gICAgc2F2aW5nOiBcItCh0L7RhdGA0LDQvdC10L3QuNC1XCIsXG4gICAgc2F2ZWQ6IFwi0KHQvtGF0YDQsNC90LXQvdC90YvQuVwiLFxuICAgIHNhdmVFcnJvcjogXCLQntGI0LjQsdC60LAhINCh0L7QtNC10YDQttCw0L3QuNC1INGA0LXQtNCw0LrRgtC+0YDQsCDQvdC1INGB0L7RhdGA0LDQvdC10L3Qvi5cIixcbiAgICB0cmFuc2xhdGlvbkFkZExhbmd1YWdlOiBcItCS0YvQsdC10YDQuNGC0LUg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQuSDRj9C30YvQuiDQvtC/0YDQvtGB0L3QuNC60LBcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxTdHJpbmdzOiBcItCf0L7QutCw0LfRi9Cy0LDRgtGMINCy0YHQtSDRgdGC0YDQvtC60LhcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxQYWdlczogXCLQn9C+0LrQsNC30YvQstCw0YLRjCDQstGB0LUg0YHRgtGA0LDQvdC40YbRi1wiLFxuICAgIHRyYW5zbGF0aW9uTm9TdHJpbmdzOiBcItCd0LXRgiDRgdGC0YDQvtC6INC00LvRjyDQv9C10YDQtdCy0L7QtNCwLiDQn9C+0LbQsNC70YPQudGB0YLQsCwg0LjQt9C80LXQvdC40YLQtSDRhNC40LvRjNGC0YAuXCIsXG4gICAgdHJhbnNsYXRpb25FeHBvcnRUb1NDVkJ1dHRvbjogXCLQrdC60YHQv9C+0YDRgiDQsiBDU1ZcIixcbiAgICB0cmFuc2xhdGlvbkltcG9ydEZyb21TQ1ZCdXR0b246IFwi0JjQvNC/0L7RgNGCINC40LcgQ1NWXCIsXG4gICAgdHJhbnNsYXRpb25NZXJnZUxvY2FsZVdpdGhEZWZhdWx0OiBcItCe0LHRitC10LTQuNC90LjRgtGMIHswfSDRgSDQu9C+0LrQsNC70YzRjiDQv9C+INGD0LzQvtC70YfQsNC90LjRjlwiLFxuICAgIGJvbGQ6IFwi0JbQuNGA0L3Ri9C5XCIsXG4gICAgaXRhbGljOiBcItCa0YPRgNGB0LjQslwiLFxuICAgIHVuZGVybGluZTogXCLQn9C+0LTRh9C10YDQutC40LLQsNC90LjQtVwiLFxuICAgIGZwQWRkUXVlc3Rpb246IFwi0JTQvtCx0LDQstC40YLRjCDQstC+0L/RgNC+0YEuLi5cIixcbiAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25JdGVtVGV4dDogXCLQn9C+0LrQsNC30YvQstCw0YLRjCwg0LXRgdC70Lg6XCIsXG4gICAgbGc6IHtcbiAgICAgIC8vTG9naWMgdGFiIHN0cmluZ3NcbiAgICAgIHBhZ2VfdmlzaWJpbGl0eU5hbWU6IFwi0JLQuNC00LjQvNC+0YHRgtGMINGB0YLRgNCw0L3QuNGG0YtcIixcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlOYW1lOiBcItCS0LjQtNC40LzQvtGB0YLRjCDQv9Cw0L3QtdC70LhcIixcbiAgICAgIHBhbmVsX2VuYWJsZU5hbWU6IFwi0J/QsNC90LXQu9GMINCy0LrQu9GO0YfQtdC90LAv0LLRi9C60LvRjtGH0LXQvdCwXCIsXG4gICAgICBxdWVzdGlvbl92aXNpYmlsaXR5TmFtZTogXCLQktC40LTQuNC80L7RgdGC0Ywg0LLQvtC/0YDQvtGB0LBcIixcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZU5hbWU6IFwi0JLQvtC/0YDQvtGBINCy0LrQu9GO0YfQtdC9L9Cy0YvQutC70Y7Rh9C10L1cIixcbiAgICAgIHF1ZXN0aW9uX3JlcXVpcmVOYW1lOiBcItCS0L7Qv9GA0L7RgSDQvdC10L7QsdGP0LfQsNGC0LXQu9GM0L3Ri9C5XCIsXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlTmFtZTogXCLQntC/0YDQvtGBINC30LDQstC10YDRiNC10L1cIixcbiAgICAgIHRyaWdnZXJfc2V0dmFsdWVOYW1lOiBcItCj0YHRgtCw0L3QvtCy0LjRgtGMINC30L3QsNGH0LXQvdC40LUg0LLQvtC/0YDQvtGB0LBcIixcbiAgICAgIHRyaWdnZXJfY29weXZhbHVlTmFtZTogXCLQmtC+0L/QuNGA0L7QstCw0YLRjCDQt9C90LDRh9C10L3QuNC1INCy0L7Qv9GA0L7RgdCwXCIsXG4gICAgICB0cmlnZ2VyX3NraXBOYW1lOiBcItCf0LXRgNC10LnRgtC4INC6INCy0L7Qv9GA0L7RgdGDXCIsXG4gICAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25OYW1lOiBcItCX0LDQv9GD0YHRgtC40YLRjCDQv9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60L7QtSDQstGL0YDQsNC20LXQvdC40LVcIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbk5hbWU6IFwi0J/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40Lkg0YLQtdC60YHRgiAn0KHRgtGA0LDQvdC40YbRiyDQsdC70LDQs9C+0LTQsNGA0L3QvtGB0YLQuCdcIixcblxuICAgICAgcGFnZV92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwi0KHQtNC10LvQsNGC0Ywg0YHRgtGA0LDQvdC40YbRgyDQstC40LTQuNC80L7QuSwg0LrQvtCz0LTQsCDQu9C+0LPQuNGH0LXRgdC60L7QtSDQstGL0YDQsNC20LXQvdC40LUg0LLQtdGA0L3QtdGCICd0cnVlJy4g0JIg0L/RgNC+0YLQuNCy0L3QvtC8INGB0LvRg9GH0LDQtSDRgdC00LXQu9Cw0YLRjCDQtdC1INC90LXQstC40LTQuNC80L7QuS5cIixcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlEZXNjcmlwdGlvbjpcbiAgICAgICAgXCLQodC00LXQu9Cw0YLRjCDQv9Cw0L3QtdC70Ywg0LLQuNC00LjQvNC+0LksINC60L7Qs9C00LAg0LvQvtCz0LjRh9C10YHQutC+0LUg0LLRi9GA0LDQttC10L3QuNC1INCy0LXRgNC90LXRgiAndHJ1ZScuINCSINC/0YDQvtGC0LjQstC90L7QvCDRgdC70YPRh9Cw0LUg0YHQtNC10LvQsNGC0Ywg0LXQtSDQvdC10LLQuNC00LjQvNC+0LkuXCIsXG4gICAgICBwYW5lbF9lbmFibGVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCLQodC00LXQu9Cw0YLRjCDQv9Cw0L3QtdC70Ywg0Lgg0LLRgdC1INGN0LvQtdC80LXQvdGC0Ysg0LLQvdGD0YLRgNC4INC90LXQtSDQstC60LvRjtGH0LXQvdC90L7QuSwg0LrQvtCz0LTQsCDQu9C+0LPQuNGH0LXRgdC60L7QtSDQstGL0YDQsNC20LXQvdC40LUg0LLQtdGA0L3QtdGCICd0cnVlJy4g0JIg0L/RgNC+0YLQuNCy0L3QvtC8INGB0LvRg9GH0LDQtSDQvtGB0YLQsNCy0LjRgtGMINC40YUg0L7RgtC60LvRjtGH0LXQvdC90YvQvNC4LlwiLFxuICAgICAgcXVlc3Rpb25fdmlzaWJpbGl0eURlc2NyaXB0aW9uOlxuICAgICAgICBcItCh0LTQtdC70LDRgtGMINCy0L7Qv9GA0L7RgSDQstC40LTQuNC80L7QuSwg0LrQvtCz0LTQsCDQu9C+0LPQuNGH0LXRgdC60L7QtSDQstGL0YDQsNC20LXQvdC40LUg0LLQtdGA0L3QtdGCICd0cnVlJy4g0JIg0L/RgNC+0YLQuNCy0L3QvtC8INGB0LvRg9GH0LDQtSDRgdC00LXQu9Cw0YLRjCDQtdC1INC90LXQstC40LTQuNC80L7QuS5cIixcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZURlc2NyaXB0aW9uOlxuICAgICAgICBcItCh0LTQtdC70LDRgtGMINCy0L7Qv9GA0L7RgSDQstC60LvRjtGH0LXQvdC90YvQvCwg0LrQvtCz0LTQsCDQu9C+0LPQuNGH0LXRgdC60L7QtSDQstGL0YDQsNC20LXQvdC40LUg0LLQtdGA0L3QtdGCICd0cnVlJy4g0JIg0L/RgNC+0YLQuNCy0L3QvtC8INGB0LvRg9GH0LDQtSDQvtGB0YLQsNCy0LjRgtGMINC10LPQviDQvtGC0LrQu9GO0YfQtdC90L3Ri9C80LguXCIsXG5cdCAgcXVlc3Rpb25fcmVxdWlyZURlc2NyaXB0aW9uOlxuICAgICAgICBcItCS0L7Qv9GA0L7RgSDRgdGC0LDQvdC+0LLQuNGC0YHRjyDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdGL0LwsINC60L7Qs9C00LAg0LvQvtCz0LjRh9C10YHQutC+0LUg0LLRi9GA0LDQttC10L3QuNC1INCy0LXRgNC90LXRgiAndHJ1ZScuXCIsXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlRGVzY3JpcHRpb246XG4gICAgICAgIFwi0JrQvtCz0LTQsCDQu9C+0LPQuNGH0LXRgdC60L7QtSDQstGL0YDQsNC20LXQvdC40LUg0LLQtdGA0L3QtdGCICd0cnVlJywg0YLQviDQvtC/0YDQvtGBINGB0YLQsNC90L7QstC40YLRgdGPINC30LDQstC10YDRiNC10L3QvdGL0Lwg0Lgg0LrQvtC90LXRh9C90YvQuSDQv9C+0LvRjNC30L7QstCw0YLQtdC70Ywg0LLQuNC00LjRgiAn0KHRgtGA0LDQvdC40YbRgyDQsdC70LDQs9C+0LTQsNGA0L3QvtGB0YLQuCcuXCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlRGVzY3JpcHRpb246XG4gICAgICAgIFwi0JrQvtCz0LTQsCDQt9C90LDRh9C10L3QuNGPINCy0L7Qv9GA0L7RgdC+0LIsINC60L7RgtC+0YDRi9C1INC40YHQv9C+0LvRjNC30YPRjtGC0YHRjyDQsiDQu9C+0LPQuNGH0LXRgdC60L7QvCDQstGL0YDQsNC20LXQvdC40LgsINC40LfQvNC10L3Rj9GO0YLRgdGPINC4INC70L7Qs9C40YfQtdGB0LrQvtC1INCy0YvRgNCw0LbQtdC90LjQtSDQstC+0LfQstGA0LDRidCw0LXRgiDQt9C90LDRh9C10L3QuNC1ICd0cnVlJywg0YLQvtCz0LTQsCDQvdCwINCy0YvQsdGA0LDQvdC90YvQuSDQstC+0L/RgNC+0YEg0YPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YLRgdGPINC30L3QsNGH0LXQvdC40LUuXCIsXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcItCa0L7Qs9C00LAg0LfQvdCw0YfQtdC90LjRjyDQstC+0L/RgNC+0YHQvtCyLCDQutC+0YLQvtGA0YvQtSDQuNGB0L/QvtC70YzQt9GD0Y7RgtGB0Y8g0LIg0LvQvtCz0LjRh9C10YHQutC+0Lwg0LLRi9GA0LDQttC10L3QuNC4LCDQuNC30LzQtdC90Y/RjtGC0YHRjyDQuCDQu9C+0LPQuNGH0LXRgdC60L7QtSDQstGL0YDQsNC20LXQvdC40LUg0LLQvtC30LLRgNCw0YnQsNC10YIg0LfQvdCw0YfQtdC90LjQtSAndHJ1ZScsINGC0L7Qs9C00LAg0LfQvdCw0YfQtdC90LjQtSDQvtC00L3QvtCz0L4g0LLRi9Cx0YDQsNC90L3QvtCz0L4g0LLQvtC/0YDQvtGB0LAg0LrQvtC/0LjRgNGD0LXRgtGB0Y8g0LIg0LTRgNGD0LPQvtC5INCy0YvQsdGA0LDQvdC90YvQuSDQstC+0L/RgNC+0YEuXCIsXG4gICAgICB0cmlnZ2VyX3NraXBEZXNjcmlwdGlvbjpcbiAgICAgICAgXCLQmtC+0LPQtNCwINC70L7Qs9C40YfQtdGB0LrQvtC1INCy0YvRgNCw0LbQtdC90LjQtSDQstC10YDQvdC10YIgJ3RydWUnLCDRgtC+0LPQtNCwINC+0L/RgNC+0YEg0L/QtdGA0LXRhdC+0LTQuNGCINC6L9GE0L7QutGD0YHQuNGA0YPQtdGC0YHRjyDQvdCwINCy0YvQsdGA0LDQvdC90L7QvCDQstC+0L/RgNC+0YHQtS5cIixcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvbkRlc2NyaXB0aW9uOlxuICAgICAgICBcItCa0L7Qs9C00LAg0LvQvtCz0LjRh9C10YHQutC+0LUg0LLRi9GA0LDQttC10L3QuNC1INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCICd0cnVlJyzRgtC+0LPQtNCwINCy0YvQv9C+0LvQvdGP0LXRgtGB0Y8g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC+0LUg0LLRi9GA0LDQttC10L3QuNC1LiDQktGLINC80L7QttC10YLQtSDQv9GA0Lgg0LbQtdC70LDQvdC40Lgg0YPRgdGC0LDQvdC+0LLQuNGC0Ywg0Y3RgtC+0YIg0YDQtdC30YPQu9GM0YLQsNGCINCy0YvRgNCw0LbQtdC90LjRjyDQsiDQstGL0LHRgNCw0L3QvdGL0Lkg0LLQvtC/0YDQvtGBLlwiLFxuICAgICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uRGVzY3JpcHRpb246XG4gICAgICAgIFwi0JXRgdC70Lgg0LvQvtCz0LjRh9C10YHQutC+0LUg0LLRi9GA0LDQttC10L3QuNC1INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCICd0cnVlJywg0YLQviDRgtC10LrRgdGCINC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC00LvRjyAn0KHRgtGA0LDQvdC40YbRiyDQsdC70LDQs9C+0LTQsNGA0L3QvtGB0YLQuCcg0LjQt9C80LXQvdGP0LXRgtGB0Y8g0L3QsCDQt9Cw0LTQsNC90L3Ri9C5LlwiLFxuXG4gICAgICBpdGVtRXhwcmVzc2lvblRleHQ6IFwi0JrQvtCz0LTQsCDQstGL0YDQsNC20LXQvdC40LU6ICd7MH0nINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCICd0cnVlJzpcIiwgLy97MH0gLSB0aGUgZXhwcmVzc2lvblxuICAgICAgcGFnZV92aXNpYmlsaXR5VGV4dDogXCLQodC00LXQu9Cw0YLRjCDRgdGC0YDQsNC90LjRhtGDIHswfSDQstC40LTQuNC80L7QuVwiLCAvL3swfSBwYWdlIG5hbWVcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlUZXh0OiBcItCh0LTQtdC70LDRgtGMINC/0LDQvdC10LvRjCB7MH0g0LLQuNC00LjQvNC+0LlcIiwgLy97MH0gcGFuZWwgbmFtZVxuICAgICAgcGFuZWxfZW5hYmxlVGV4dDogXCLQodC00LXQu9Cw0YLRjCDQv9Cw0L3QtdC70YwgezB9INCy0LrQu9GO0YfQtdC90L3QvtC5XCIsIC8vezB9IHBhbmVsIG5hbWVcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlUZXh0OiBcItCh0LTQtdC70LDRgtGMINCy0L7Qv9GA0L7RgSB7MH0g0LLQuNC00LjQvNGL0LxcIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgcXVlc3Rpb25fZW5hYmxlVGV4dDogXCLQodC00LXQu9Cw0YLRjCDQstC+0L/RgNC+0YEgezB9INCy0LrQu9GO0YfQtdC90L3Ri9C8XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWVcbiAgICAgIHF1ZXN0aW9uX3JlcXVpcmVUZXh0OiBcItCh0LTQtdC70LDRgtGMINCy0L7Qv9GA0L7RgSB7MH0g0L7QsdGP0LfQsNGC0LXQu9GM0L3Ri9C8XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWVcbiAgICAgIHRyaWdnZXJfY29tcGxldGVUZXh0OiBcItCe0L/RgNC+0YEg0YHRgtCw0L3QvtCy0LjRgtGB0Y8g0LfQsNCy0LXRgNGI0LXQvdC90YvQvFwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZVRleHQ6IFwi0KPRgdGC0LDQvdC+0LLQuNGC0Ywg0LIg0LLQvtC/0YDQvtGBOiB7MH0g0LfQvdCw0YfQtdC90LjQtSB7MX1cIiwgLy97MH0gcXVlc3Rpb24gbmFtZSwgezF9IHNldFZhbHVlXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZVRleHQ6IFwi0JrQvtC/0LjRgNC+0LLQsNGC0Ywg0LIg0LLQvtC/0YDQvtGBOiB7MH0g0LfQvdCw0YfQtdC90LjQtSDQuNC3INCy0L7Qv9GA0L7RgdCwIHsxfVwiLCAvL3swfSBhbmQgezF9IHF1ZXN0aW9uIG5hbWVzXG4gICAgICB0cmlnZ2VyX3NraXBUZXh0OiBcItCe0L/RgNC+0YEg0L/QtdGA0LXRhdC+0LTQuNGCINC6INCy0L7Qv9GA0L7RgdGDIHswfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25UZXh0MTogXCLQktGL0L/QvtC70L3QuNGC0Ywg0LLRi9GA0LDQttC10L3QuNC1OiAnezB9J1wiLCAvL3swfSB0aGUgZXhwcmVzc2lvblxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDI6IFwi0Lgg0YPRgdGC0LDQvdC+0LLQuNGC0Ywg0LXQs9C+INGA0LXQt9GD0LvRjNGC0LDRgiDQsiDQstC+0L/RgNC+0YE6IHswfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25UZXh0OlxuICAgICAgICBcItCf0L7QutCw0LfRi9Cy0LDRgtGMINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQuNC5INGC0LXQutGB0YIg0LTQu9GPICfQodGC0YDQsNC90LjRhtGLINCx0LvQsNCz0L7QtNCw0YDQvdC+0YHRgtC4Jy5cIixcblxuICAgICAgZXhwcmVzc2lvbkVkaXRvclRpdGxlOiBcItCd0LDRgdGC0YDQvtC50LrQsCDQu9C+0LPQuNC60Lgg0LLRi9GA0LDQttC10L3QuNGPXCIsXG5cbiAgICAgIGRlbGV0ZU9wZXJhdGlvbjogXCLQo9C00LDQu9C40YLRjCDQvtC/0LXRgNCw0YbQuNGOXCIsXG4gICAgICBhZGROZXdPcGVyYXRpb246IFwi0JTQvtCx0LDQstC40YLRjCDQvdC+0LLRg9GOINC+0L/QtdGA0LDRhtC40Y4o0LgpXCIsXG5cbiAgICAgIGV4cHJlc3Npb25JbnZhbGlkOlxuICAgICAgICBcItCb0L7Qs9C40YfQtdGB0LrQvtC1INCy0YvRgNCw0LbQtdC90LjQtSDQv9GD0YHRgtC+0LUg0LjQu9C4INC90LXQtNC10LnRgdGC0LLQuNGC0LXQu9GM0L3QvtC1LiDQn9C+0LbQsNC70YPQudGB0YLQsCwg0LjRgdC/0YDQsNCy0YzRgtC1INC10LPQvi5cIixcbiAgICAgIG5vT3BlcmF0aW9uRXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINC00L7QsdCw0LLRjNGC0LUg0YXQvtGC0Ywg0L7QtNC90YMg0L7Qv9C10YDQsNGG0LjRji5cIixcbiAgICAgIG9wZXJhdGlvbkludmFsaWQ6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINC40YHQv9GA0LDQstGM0YLQtSDQv9GA0L7QsdC70LXQvNGLINCyINCy0LDRiNC10Lkg0L7Qv9C10YDQsNGG0LjQuCjRj9GFKS5cIlxuICAgIH1cbiAgfSxcbiAgLy8gUHJvcGVydHkgbmFtZXMgaW4gdGFibGUgaGVhZGVyc1xuICBwZWw6IHtcbiAgICBpc1JlcXVpcmVkOiBcItCe0LHRj9C30LDRgtC10LvRjNC90L7QtT9cIlxuICB9LFxuICAvLyBQcm9wZXJ0eSBFZGl0b3JzXG4gIHBlOiB7XG4gICAgYXBwbHk6IFwi0J/RgNC40LzQtdC90LjRgtGMXCIsXG4gICAgb2s6IFwiT0tcIixcbiAgICBzYXZlOiBcItCh0L7RhdGA0LDQvdC40YLRjFwiLFxuICAgIGNhbmNlbDogXCLQntGC0LzQtdC90LjRgtGMXCIsXG4gICAgcmVzZXQ6IFwi0KHQsdGA0L7RgVwiLFxuICAgIGNsb3NlOiBcItCX0LDQutGA0YvRgtGMXCIsXG4gICAgZGVsZXRlOiBcItCj0LTQsNC70LjRgtGMXCIsXG4gICAgYWRkOiBcItCU0L7QsdCw0LLQuNGC0YxcIixcbiAgICBhZGROZXc6IFwi0JTQvtCx0LDQstC40YLRjCDQvdC+0LLRi9C5XCIsXG4gICAgYWRkSXRlbTogXCLQndCw0LbQvNC40YLQtSwg0YfRgtC+0LHRiyDQtNC+0LHQsNCy0LjRgtGMINGN0LvQtdC80LXQvdGCLi4uXCIsXG4gICAgYWRkT3RoZXI6IFwi0JTRgNGD0LPQvtC1XCIsXG4gICAgYWRkU2VsZWN0QWxsOiBcItCS0YvQsdGA0LDRgtGMINCy0YHQtSDQv9GD0L3QutGC0YtcIixcbiAgICBhZGROb25lOiBcItCd0LjRh9C10LPQvlwiLFxuICAgIHJlbW92ZUFsbDogXCLQo9C00LDQu9C40YLRjCDQstGB0LVcIixcbiAgICBlZGl0OiBcItCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMXCIsXG4gICAgYmFjazogXCLQktC10YDQvdGD0YLRjNGB0Y8g0LHQtdC3INGB0L7RhdGA0LDQvdC10L3QuNGPXCIsXG4gICAgc2F2ZUFuZEJhY2s6IFwi0KHQvtGF0YDQsNC90LjRgtGMINC4INCy0LXRgNC90YPRgtGM0YHRj1wiLFxuICAgIGl0ZW1WYWx1ZUVkaXQ6IFwi0J7RgtC+0LHRgNCw0LbQsNGC0YwsINC10YHQu9C4XCIsXG4gICAgZWRpdENob2ljZXM6IFwi0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0Ywg0LLRi9Cx0L7RgFwiLFxuICAgIG1vdmU6IFwi0J/QtdGA0LXQvNC10YHRgtC40YLRjFwiLFxuICAgIGVtcHR5OiBcIjzQv9GD0YHRgtC+PlwiLFxuICAgIG5vdEVtcHR5OiBcIjzRgNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQt9C90LDRh9C10L3QuNC1PlwiLFxuICAgIGZhc3RFbnRyeTogXCLQkdGL0YHRgtGA0YvQuSDQstGF0L7QtFwiLFxuICAgIGZvcm1FbnRyeTogXCLQpNC+0YDQvNCwINCy0YXQvtC00LBcIixcbiAgICB0ZXN0U2VydmljZTogXCLQotC10YHRgiDRg9GB0LvRg9Cz0LhcIixcbiAgICBpdGVtU2VsZWN0b3JFbXB0eTogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLRi9Cx0LXRgNC40YLQtSDRjdC70LXQvNC10L3RglwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFF1ZXN0aW9uOiBcItCS0YvQsdC10YDQuNGC0LUg0LLQvtC/0YDQvtGBIC4uLlwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFBhZ2U6IFwi0JLRi9Cx0YDQsNGC0Ywg0YHRgtGA0LDQvdC40YbRgyAuLi5cIixcbiAgICBjb25kaXRpb25TZWxlY3RQYW5lbDogXCLQktGL0LHQtdGA0LjRgtC1INC/0LDQvdC10LvRjCAuLi5cIixcbiAgICBjb25kaXRpb25WYWx1ZVF1ZXN0aW9uVGl0bGU6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1L9Cy0YvQsdC10YDQuNGC0LUg0LfQvdCw0YfQtdC90LjQtVwiLFxuICAgIGNvbmRpdGlvbkJ1dHRvbkFkZDogXCLQlNC+0LHQsNCy0LjRgtGMXCIsXG4gICAgY29uZGl0aW9uQnV0dG9uUmVwbGFjZTogXCLQl9Cw0LzQtdC90LjRgtGMXCIsXG4gICAgY29uZGl0aW9uSGVscDpcbiAgICAgIFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC70L7Qs9C40YfQtdGB0LrQvtC1INCy0YvRgNCw0LbQtdC90LjQtS4g0JTQvtC70LbQvdC+INCy0L7Qt9Cy0YDQsNGJ0LDRgtGM0YHRjyDQt9C90LDRh9C10L3QuNC1ICd0cnVlJywg0YfRgtC+0LHRiyDQstC+0L/RgNC+0YEv0YHRgtGA0LDQvdC40YbQsCDQvtGB0YLQsNCy0LDQu9C40YHRjCDQstC40LTQuNC80YvQvNC4LCDQvdCw0L/RgNC40LzQtdGAOi4uIHvQktC+0L/RgNC+0YExfSA9ICfQt9C90LDRh9C10L3QuNC1MScg0LjQu9C4ICh70JLQvtC/0YDQvtGBMn0gKiB70JLQvtC/0YDQvtGBNH0+IDIwINC4IHvQktC+0L/RgNC+0YEzfSA8NSlcIixcbiAgICBleHByZXNzaW9uSGVscDpcbiAgICAgIFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INCy0YvRgNCw0LbQtdC90LjQtS4g0JLRiyDQvNC+0LbQtdGC0LUg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINGE0LjQs9GD0YDQvdGL0LUg0YHQutC+0LHQutC4LCDRh9GC0L7QsdGLINC/0L7Qu9GD0YfQuNGC0Ywg0LTQvtGB0YLRg9C/INC6INC30L3QsNGH0LXQvdC40Y/QvCDQstC+0L/RgNC+0YHQsC46ICd70JLQvtC/0YDQvtGBMX0gKyB70JLQvtC/0YDQvtGBMn0nLCAnKHvRhtC10L3QsH0qe9C60L7Qu9C40YfQtdGB0YLQstC+fSkgKiAoMTAwIC0ge9GB0LrQuNC00LrQsH0pLlwiLFxuICAgIGFjZUVkaXRvckhlbHA6IFwi0J3QsNC20LzQuNGC0LUgQ3RybCvQn9GA0L7QsdC10LssINGH0YLQvtCx0Ysg0L/QvtC70YPRh9C40YLRjCDQv9C+0LTRgdC60LDQt9C60LhcIixcbiAgICBhY2VFZGl0b3JSb3dUaXRsZTogXCLQotC10LrRg9GJ0LDRjyDRgdGC0YDQvtC60LBcIixcbiAgICBhY2VFZGl0b3JQYW5lbFRpdGxlOiBcItCi0LXQutGD0YnQsNGPINC/0LDQvdC10LvRjFwiLFxuICAgIHNob3dNb3JlOiBcItCU0LvRjyDQv9C+0LvRg9GH0LXQvdC40Y8g0LHQvtC70LXQtSDQv9C+0LTRgNC+0LHQvdC+0Lkg0LjQvdGE0L7RgNC80LDRhtC40LgsINC/0L7QttCw0LvRg9C50YHRgtCwLCDQv9C10YDQtdC50LTQuNGC0LUg0Log0LTQvtC60YPQvNC10L3RgtCw0YbQuNC4XCIsXG4gICAgY29uZGl0aW9uU2hvd01vcmVVcmw6XG4gICAgICBcIkh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5UGFyYW1ldGVyP2lkPVF1ZXN0aW9uwrZtZXRlcj12aXNpYmxlSWZcIixcbiAgICBhc3Npc3RhbnRUaXRsZTogXCLQlNC+0YHRgtGD0L/QvdGL0LUg0LLQvtC/0YDQvtGB0Ys6XCIsXG4gICAgY2VsbHNFbXB0eVJvd3NDb2x1bW5zOiBcItCU0L7Qu9C20LXQvSDQsdGL0YLRjCDRhdC+0YLRjyDQsdGLINC+0LTQuNC9INGB0YLQvtC70LHQtdGGINC40LvQuCDRgdGC0YDQvtC60LBcIixcblxuICAgIHByb3BlcnR5SXNFbXB0eTogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLQstC10LTQuNGC0LUg0LfQvdCw0YfQtdC90LjQtVwiLFxuXHQgIHByb3BlcnR5TmFtZUlzTm90VW5pcXVlOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstCy0LXQtNC40YLQtSDRg9C90LjQutCw0LvRjNC90L7QtSDQuNC80Y9cIixcbiAgICBsaXN0SXNFbXB0eTogXCLQlNC+0LHQsNCy0YzRgtC1INC90L7QstC+0LUg0YPRgdC70L7QstC40LVcIixcblx0ICBleHByZXNzaW9uSXNFbXB0eTogXCLQktGL0YDQsNC20LXQvdC40LUgLSDQv9GD0YHRgtC+0LVcIixcblx0ICB2YWx1ZTogXCLQl9C90LDRh9C10L3QuNC1XCIsXG4gICAgdGV4dDogXCLQotC10LrRgdGCXCIsXG4gICAgcm93aWQ6IFwiSUQg0YHRgtGA0L7QutC4XCIsXG4gICAgaW1hZ2VMaW5rOiBcItCh0YHRi9C70LrQsCDQvdCwINC40LfQvtCx0YDQsNC20LXQvdC40LVcIixcbiAgICBjb2x1bW5FZGl0OiBcItCY0LfQvNC10L3QuNGC0Ywg0YHRgtC+0LvQsdC10YY6IHswfVwiLFxuICAgIGl0ZW1FZGl0OiBcItCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINGN0LvQtdC80LXQvdGCOiB7MH1cIixcblxuICAgIHVybDogXCJVUkxcIixcbiAgICBwYXRoOiBcItCf0YPRgtGMXCIsXG4gICAgdmFsdWVOYW1lOiBcItCd0LDQt9Cy0LDQvdC40LUg0L/Rg9C90LrRgtCwXCIsXG4gICAgdGl0bGVOYW1lOiBcItCX0LDQs9C+0LvQvtCy0L7QuiDQv9GD0L3QutGC0LBcIixcblx0ICB0aXRsZVBsYWNlaG9sZGVyOiBcItCS0LLQtdC00LjRgtC1INC30LDQs9C+0LvQvtCy0L7QulwiLFxuICAgIHN1cnZleVRpdGxlUGxhY2Vob2xkZXI6IFwi0JLQstC10LTQuNGC0LUg0LfQsNCz0L7Qu9C+0LLQvtC6INC+0L/RgNC+0YHQsFwiLFxuICAgIHBhZ2VUaXRsZVBsYWNlaG9sZGVyOiBcItCS0LLQtdC00LjRgtC1INC30LDQs9C+0LvQvtCy0L7QuiDRgdGC0YDQsNC90LjRhtGLXCIsXG4gICAgZGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCLQktCy0LXQtNC40YLQtSDQvtC/0LjRgdCw0L3QuNC1XCIsXG4gICAgc3VydmV5RGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCLQktCy0LXQtNC40YLQtSDQvtC/0LjRgdCw0L3QuNC1INC+0L/RgNC+0YHQsFwiLFxuICAgIHBhZ2VEZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcItCS0LLQtdC00LjRgtC1INC+0L/QuNGB0LDQvdC40LUg0YHRgtGA0LDQvdC40YbRi1wiLFxuICBcbiAgICBoYXNPdGhlcjogXCLQldGB0YLRjCDQv9GD0L3QutGCICfQlNGA0YPQs9C+0LUnXCIsXG4gICAgb3RoZXJUZXh0OiBcItCi0LXQutGB0YIg0L/Rg9C90LrRgtCwICfQlNGA0YPQs9C+0LUnXCIsXG4gICAgaGFzTm9uZTogXCLQndC10YIg0L3QuCDQvtC00L3QvtCz0L4g0L/Rg9C90LrRgtCwXCIsXG4gICAgbm9uZVRleHQ6IFwi0KLQtdC60YHRgiDQv9GD0L3QutGC0LAgJ9Cd0LjRh9C10LPQvidcIixcbiAgICBoYXNTZWxlY3RBbGw6IFwi0JLRi9Cx0YDQsNGC0Ywg0LLRgdC1INC/0YPQvdC60YLRi1wiLFxuICAgIHNlbGVjdEFsbFRleHQ6IFwi0KLQtdC60YHRgiDQv9GD0L3QutGC0LAgJ9CS0YvQsdGA0LDRgtGMINCy0YHQtSDQv9GD0L3QutGC0YsnXCIsXG4gICAgY2hvaWNlc01pbjogXCLQnNC40L3QuNC80LDQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40LUg0LTQu9GPINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC4INGB0LPQtdC90LXRgNC40YDQvtCy0LDQvdC90YvRhSDRjdC70LXQvNC10L3RgtC+0LJcIixcbiAgICBjaG9pY2VzTWF4OiBcItCc0LDQutGB0LjQvNCw0LvRjNC90L7QtSDQt9C90LDRh9C10L3QuNC1INC00LvRjyDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQuCDRgdCz0LXQvdC10YDQuNGA0L7QstCw0L3QvdGL0YUg0Y3Qu9C10LzQtdC90YLQvtCyXCIsXG4gICAgY2hvaWNlc1N0ZXA6IFwi0KDQsNC30L3QuNGG0LAg0LzQtdC20LTRgyDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQuCDRgdCz0LXQvdC10YDQuNGA0L7QstCw0L3Ri9C80Lgg0Y3Qu9C10LzQtdC90YLQsNC80LhcIixcbiAgICBuYW1lOiBcItCd0LDQt9Cy0LDQvdC40LVcIixcbiAgICB0aXRsZTogXCLQl9Cw0LPQvtC70L7QstC+0LpcIixcbiAgICBjZWxsVHlwZTogXCLQotC40L8g0Y/Rh9C10LnQutC4XCIsXG4gICAgQ29sQ291bnQ6IFwi0JrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtC+0LvQsdGG0L7QslwiLFxuICAgIGNob2ljZXNPcmRlcjogXCLQktGL0LHRgNCw0YLRjCDQv9C+0YDRj9C00L7QuiDQvtGC0LHQvtGA0LBcIixcbiAgICB2aXNpYmxlOiBcItCe0YLQvtCx0YDQsNC20LDRgtGMP1wiLFxuICAgIGlzUmVxdWlyZWQ6IFwi0J7QsdGP0LfQsNGC0LXQu9GM0L3Ri9C5P1wiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwi0JLRgdC1INGB0YLRgNC+0LrQuCDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdGLINC00LvRjyDQt9Cw0L/QvtC70L3QtdC90LjRj1wiLFxuICAgIHJlcXVpcmVkRXJyb3JUZXh0OiBcItCt0YLQviDQv9C+0LvQtSDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdC+0LUg0LTQu9GPINC30LDQv9C+0LvQvdC10L3QuNGPXCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCLQndCw0YfQuNC90LDRgtGMINGBINC90L7QstC+0Lkg0YHRgtGA0L7QutC4P1wiLFxuICAgIHJvd3M6IFwi0JrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0L7QulwiLFxuICAgIFBsYWNlSG9sZGVyOiBcItCf0LvQtdC50YHRhdC+0LvQtNC10YBcIixcbiAgICBzaG93UHJldmlldzogXCLQn9C+0LrQsNC30LDRgtGMINC/0YDQtdC00L/RgNC+0YHQvNC+0YLRgD9cIixcbiAgICBzdG9yZURhdGFBc1RleHQ6IFwi0KXRgNCw0L3QuNGC0Ywg0YHQvtC00LXRgNC20LjQvNC+0LUg0YTQsNC50LvQsCDQsiDRhNC+0YDQvNCw0YLQtSBKU09OINC60LDQuiDRgtC10LrRgdGCXCIsXG4gICAgTWF4U2l6ZTogXCLQnNCw0LrRgdC40LzQsNC70YzQvdGL0Lkg0YDQsNC30LzQtdGAINGE0LDQudC70LAg0LIg0LHQsNC50YLQsNGFXCIsXG4gICAgSW1hZ2VIZWlnaHQ6IFwi0JLRi9GB0L7RgtCwINC40LfQvtCx0YDQsNC20LXQvdC40Y9cIixcbiAgICBJbWFnZVdpZHRoOiBcItCo0LjRgNC40L3QsCDQuNC30L7QsdGA0LDQttC10L3QuNGPXCIsXG4gICAgcm93Q291bnQ6IFwi0JrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0L7QulwiLFxuICAgIGNvbHVtbkxheW91dDogXCLQnNCw0LrQtdGCINGB0YLQvtC70LHRhtC+0LJcIixcbiAgICBhZGRSb3dMb2NhdGlvbjogXCLQlNC+0LHQsNCy0LjRgtGMINGA0LDRgdC/0L7Qu9C+0LbQtdC90LjQtSDQutC90L7Qv9C60Lgg0YHRgtGA0L7QutC4XCIsXG4gICAgYWRkUm93VGV4dDogXCLQlNC+0LHQsNCy0LjRgtGMINGC0LXQutGB0YIg0LrQvdC+0L/QutC4INGB0YLRgNC+0LrQuFwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwi0KPQtNCw0LvQuNGC0Ywg0LrQvdC+0L/QutGDINGB0YLRgNC+0LrQuCDRgtC10LrRgdGC0LBcIixcbiAgICByYXRlTWluOiBcItCc0LjQvdC40LzQsNC70YzQvdGL0Lkg0YDQtdC50YLQuNC90LNcIixcbiAgICByYXRlTWF4OiBcItCc0LDQutGB0LjQvNCw0LvRjNC90YvQuSDRgNC10LnRgtC40L3Qs1wiLFxuICAgIHJhdGVTdGVwOiBcItCo0LDQsyDRgNC10LnRgtC40L3Qs9CwXCIsXG4gICAgbWluUmF0ZURlc2NyaXB0aW9uOiBcItCe0L/QuNGB0LDQvdC40LUg0LTQu9GPINC80LjQvdC40LzQsNC70YzQvdC+0LPQviDRgNC10LnRgtC40L3Qs9CwXCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcItCe0L/QuNGB0LDQvdC40LUg0LTQu9GPINC80LDQutGB0LjQvNCw0LvRjNC90L7Qs9C+INGA0LXQudGC0LjQvdCz0LBcIixcbiAgICBpbnB1dFR5cGU6IFwi0KLQuNC/INCy0LLQvtC00LBcIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCLQn9Cw0YDQsNC80LXRgtGA0Ysg0L/QvtC00L/QuNGB0LhcIixcbiAgICBEZWZhdWx0VmFsdWU6IFwi0JfQvdCw0YfQtdC90LjQtSDQv9C+INGD0LzQvtC70YfQsNC90LjRjlwiLFxuICAgIGNlbGxzRGVmYXVsdFJvdzogXCLQotC10LrRgdGCINGP0YfQtdC10Log0L/QviDRg9C80L7Qu9GH0LDQvdC40Y5cIixcbiAgXG4gICAgc3VydmV5RWRpdG9yVGl0bGU6IFwi0J3QsNGB0YLRgNC+0LnQutC4INC+0L/RgNC+0YHQvdC40LrQsFwiLFxuICAgIHFFZGl0b3JUaXRsZTogXCLQmNC30LzQtdC90LjRgtGMOiB7MH1cIixcbiAgXG4gICAgbWF4TGVuZ3RoOiBcItCc0LDQutGB0LjQvNCw0LvRjNC90LDRjyDQtNC70LjQvdCwXCIsXG5cdCAgYnVpbGRFeHByZXNzaW9uOiBcItCh0L7QsdGA0LDRgtGMXCIsXG4gICAgZWRpdEV4cHJlc3Npb246IFwi0KDQtdC00LDQutGC0LjRgNC+0LLQsNGC0YxcIixcbiAgICBhbmQ6IFwi0JhcIixcbiAgICBvcjogXCLQmNCb0JhcIixcbiAgICByZW1vdmU6IFwi0J/QtdGA0LXQvNC10YHRgtC40YLRjFwiLFxuICAgIGFkZENvbmRpdGlvbjogXCLQtNC+0LHQsNCy0LjRgtGMINGD0YHQu9C+0LLQuNC1XCIsXG5cbiAgICAvL3N1cnZleVxuICAgIHNob3dUaXRsZTogXCLQn9C+0LrQsNC30LDRgtGML9GB0LrRgNGL0YLRjCDQt9Cw0LPQvtC70L7QstC+0LpcIixcbiAgICBsb2NhbGU6IFwi0K/Qt9GL0Log0L/QviDRg9C80L7Qu9GH0LDQvdC40Y5cIixcbiAgICBzaW11bGF0b3I6IFwi0JLRi9Cx0LXRgNC40YLQtSDRg9GB0YLRgNC+0LnRgdGC0LLQvlwiLFxuICAgIGxhbmRzY2FwZU9yaWVudGF0aW9uOiBcItCQ0LvRjNCx0L7QvNC90LDRj1wiLFxuICAgIG1vZGU6IFwi0KDQtdC20LjQvCAo0YDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjQtS/Qv9GA0L7RgdC80L7RgtGAKVwiLFxuICAgIGNsZWFySW52aXNpYmxlVmFsdWVzOiBcItCe0YfQuNGB0YLQuNGC0Ywg0L3QtdCy0LjQtNC40LzRi9C1INC30L3QsNGH0LXQvdC40Y9cIixcbiAgICBjb29raWVOYW1lOiBcItCY0LzRjyBDb29raWUgKNC+0YLQutC70Y7Rh9C40YLRjCDQv9C+0LLRgtC+0YDQvdC+0LUg0L/RgNC+0YXQvtC20LTQtdC90LjQtSDQvtC/0YDQvtGB0LAg0LvQvtC60LDQu9GM0L3QvilcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCLQn9C+0LrQsNC30LDRgtGMINGA0LXQt9GD0LvRjNGC0LDRgtGLINC+0L/RgNC+0YHQsCDQvdCwINGB0YLRgNCw0L3QuNGG0LUg0YDRj9C00L7QvFwiLFxuICAgIHN0b3JlT3RoZXJzQXNDb21tZW50OiBcItCl0YDQsNC90LjRgtGMINC30LDQvdGH0LXQvdC40LUgJ9CU0YDRg9Cz0L7QtScg0LIg0L7RgtC00LXQu9GM0L3QvtC8INC/0L7Qu9C1XCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwi0J/QvtC60LDQt9GL0LLQsNGC0Ywg0LfQsNCz0L7Qu9C+0LLQutC4INGB0YLRgNCw0L3QuNGGXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcItCf0L7QutCw0LfRi9Cy0LDRgtGMINC90L7QvNC10YDQsCDRgdGC0YDQsNC90LjRhlwiLFxuICAgIHBhZ2VQcmV2VGV4dDogXCLQotC10LrRgdGCINCyINC60L3QvtC/0LrQtSAn0J/RgNC10LTRi9C00YPRidCw0Y8g0YHRgtGA0LDQvdC40YbQsCdcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwi0KLQtdC60YHRgiDQsiDQutC90L7Qv9C60LUgJ9Ch0LvQtdC00YPRjtGJ0LDRjyDRgdGC0YDQsNC90LjRhtCwJ1wiLFxuICAgIGNvbXBsZXRlVGV4dDogXCLQotC10LrRgdGCINCyINC60L3QvtC/0LrQtSAn0JfQsNCy0LXRgNGI0LjRgtGMJ1wiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCLQotC10LrRgdGCINCyINC60L3QvtC/0LrQtSAn0J3QsNGH0LDRgtGMJ1wiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczogXCLQn9C+0LrQsNC30YvQstCw0YLRjCDQutC90L7Qv9C60Lgg0L3QsNCy0LjQs9Cw0YbQuNC4ICjQvdCw0LLQuNCz0LDRhtC40Y8g0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4pXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwi0J/QvtC60LDQt9GL0LLQsNGC0Ywg0LrQvdC+0L/QutC4ICfQn9GA0LXQtNGL0LTRg9GJ0LDRjyDRgdGC0YDQsNC90LjRhtCwJyAo0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GMINC80L7QttC10YIg0LLQtdGA0L3Rg9GC0YzRgdGPINC90LAg0L/RgNC10LTRi9C00YPRidGD0Y4g0YHRgtGA0LDQvdC40YbRgylcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwi0J/QtdGA0LLQsNGPINGB0YLRgNCw0L3QuNGG0LAg0L7Qv9GA0L7RgdC90LjQutCwINGP0LLQu9GP0LXRgtGB0Y8g0YHRgtCw0YDRgtC+0LLQvtC5INGB0YLRgNCw0L3QuNGG0LXQuS5cIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCLQn9C+0LrQsNC30YvQstCw0YLRjCDRgdGC0YDQsNC90LjRhtGDINGBINGC0LXQutGB0YLQvtC8INC/0L4g0LfQsNCy0LXRgNGI0LXQvdC40Y4g0LfQsNC/0L7Qu9C90LXQvdC40Y8gKEhUTUwg0YTQuNC90LDQu9GM0L3QvtC5INGB0YLRgNCw0L3QuNGG0YspXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzogXCLQn9C10YDQtdGF0L7QtNC40YLRjCDQvdCwINGB0LvQtdC00YPRjtGJ0YPRjiDRgdGC0YDQsNC90LjRhtGDINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC4INC/0YDQuCDQt9Cw0L/QvtC70L3QtdC90LjQuCDQstGB0LXRhSDQstC+0L/RgNC+0YHQvtCyXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcItCf0L7QutCw0LfRi9Cy0LDRgtGMINC/0YDQvtCz0YDQtdGB0YEg0LfQsNC/0L7Qu9C90LXQvdC40Y9cIixcbiAgICBxdWVzdGlvblRpdGxlTG9jYXRpb246IFwi0KDQsNGB0L/QvtC70L7QttC10L3QuNC1INC30LDQs9C+0LvQvtCy0LrQsCDQstC+0L/RgNC+0YHQsFwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCLQodC40LzQstC+0Lsg0LTQu9GPINC+0LHRj9C30LDRgtC10LvRjNC90L7Qs9C+INCy0L7Qv9GA0L7RgdCwXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcItCd0LDRh9Cw0LvRjNC90YvQuSDQuNC90LTQtdC60YEg0LLQvtC/0YDQvtGB0LAgKDEsIDIg0LjQu9C4ICdBJywgJ9CwJylcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcItCf0L7QutCw0LfRi9Cy0LDRgtGMINC90L7QvNC10YDQsCDQstC+0L/RgNC+0YHQvtCyXCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOiBcItCo0LDQsdC70L7QvSDQvdCw0LfQstCw0L3QuNGPINC+0L/RgNC+0YHQsCwg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y46IHvQvdC1fSB70YLRgNC10LHRg9C10YJ9IHvRgtC10LrRgdGC0LB9LlwiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCLQoNCw0LfQvNC10YnQtdC90LjQtSDQvtGI0LjQsdC60Lgg0L7Qv9GA0L7RgdCwXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcItCk0L7QutGD0YHQuNGA0L7QstCw0L3QuNC1INC90LAg0L/QtdGA0LLQvtC8INCy0L7Qv9GA0L7RgdC1INC/0YDQuCDQuNC30LzQtdC90LXQvdC40Lgg0YHRgtGA0LDQvdC40YbRi1wiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcItCh0L7RgNGC0LjRgNC+0LLQutCwINGN0LvQtdC80LXQvdGC0L7QsiDQvdCwINGB0YLRgNCw0L3QuNGG0LVcIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwi0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INCy0YDQtdC80Y8g0LIg0YHQtdC60YPQvdC00LDRhSwg0YfRgtC+0LHRiyDQt9Cw0L/QvtC70L3QuNGC0Ywg0L7Qv9GA0L7RgdC90LjQulwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwi0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INCy0YDQtdC80Y8g0LIg0YHQtdC60YPQvdC00LDRhSwg0YfRgtC+0LHRiyDQt9Cw0L/QvtC70L3QuNGC0Ywg0YHRgtGA0LDQvdC40YbRgyDQvtC/0YDQvtGB0L3QuNC60LBcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCLQn9C+0LrQsNC30YvQstCw0YLRjCDQv9Cw0L3QtdC70Ywg0YLQsNC50LzQtdGA0LBcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwi0J/QvtC60LDQt9GL0LLQsNGC0Ywg0YDQtdC20LjQvCDQv9Cw0L3QtdC70Lgg0YLQsNC50LzQtdGA0LBcIixcbiAgICBSZW5kZXJNb2RlOiBcItCg0LXQttC40Lwg0LLQuNC30YPQsNC70LjQt9Cw0YbQuNC4XCIsXG4gICAgYWxsb3dBZGRQYW5lbDogXCLQoNCw0LfRgNC10YjQuNGC0Ywg0LTQvtCx0LDQstC70LXQvdC40LUg0L/QsNC90LXQu9C4XCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCLQoNCw0LfRgNC10YjQuNGC0Ywg0YPQtNCw0LvQtdC90LjQtSDQv9Cw0L3QtdC70LhcIixcbiAgICBwYW5lbEFkZFRleHQ6IFwi0JTQvtCx0LDQstC70LXQvdC40LUg0YLQtdC60YHRgtCwINC90LAg0L/QsNC90LXQu9C4XCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcItCj0LTQsNC70LXQvdC40LUg0YLQtdC60YHRgtCwINC90LAg0L/QsNC90LXQu9C4XCIsXG4gICAgaXNTaW5nbGVQYWdlOiBcItCf0L7QutCw0LfRi9Cy0LDRgtGMINCy0YHQtSDRjdC70LXQvNC10L3RgtGLINC90LAg0L7QtNC90L7QuSDRgdGC0YDQsNC90LjRhtC1XCIsXG4gICAgSFRNTDogXCJIVE1MXCIsXG4gICAgZXhwcmVzc2lvbjogXCLQktGL0YDQsNC20LXQvdC40LVcIixcbiAgXG4gICAgbWluVmFsdWU6IFwi0JzQuNC90LjQvNCw0LvRjNC90L7QtSDQt9C90LDRh9C10L3QuNC1XCIsXG4gICAgbWF4VmFsdWU6IFwi0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40LVcIixcbiAgICBtSU5MRU5HVEg6IFwi0JzQuNC90LjQvNCw0LvRjNC90LDRjyDQtNC70LjQvdCwXCIsXG4gICAgYWxsb3dEaWdpdHM6IFwi0KDQsNC30YDQtdGI0LjRgtGMINGG0LjRhNGA0YtcIixcbiAgICBtaW5Db3VudDogXCLQnNC40L3QuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+XCIsXG4gICAgbWF4Q291bnQ6IFwi0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+XCIsXG4gICAgcmVnZXg6IFwi0KDQtdCz0YPQu9GP0YDQvdC+0LUg0LLRi9GA0LDQttC10L3QuNC1XCIsXG4gIFxuICAgIHRvdGFsVGV4dDogXCLQntCx0YnQuNC5INGC0LXQutGB0YJcIixcbiAgICB0b3RhbFR5cGU6IFwi0J7QsdGJ0LjQuSDRgtC40L9cIixcbiAgICB0b3RhbEV4cHJlc3Npb246IFwi0J7QsdGJ0LXQtSDQstGL0YDQsNC20LXQvdC40LVcIixcbiAgICB0b3RhbERpc3BsYXlTdHlsZTogXCLQntCx0YnQuNC5INGB0YLQuNC70Ywg0L7RgtC+0LHRgNCw0LbQtdC90LjRj1wiLFxuICAgIHRvdGFsQ3VycmVuY3k6IFwi0J7QsdGJ0LDRjyDQstCw0LvRjtGC0LBcIixcbiAgICB0b3RhbEZvcm1hdDogXCLQntCx0YnQuNC5INGE0L7RgNC80LDRglwiLFxuXHQgIC8vIEhlYWRlciAgYWRvcm5lclxuICAgIGxvZ29Qb3NpdGlvbjogXCLQnNC10YHRgtC+0L/QvtC70L7QttC10L3QuNC1INC70L7Qs9C+0YLQuNC/0LBcIixcbiAgICBhZGRMb2dvOiBcItCU0L7QsdCw0LLQuNGC0Ywg0LvQvtCz0L7RgtC40L8uLi5cIixcbiAgICBjaGFuZ2VMb2dvOiBcItCY0LfQvNC10L3QuNGC0Ywg0LvQvtCz0L7RgtC40L8uLi5cIixcbiAgICBsb2dvUG9zaXRpb25zOiB7XG4gICAgICBub25lOiBcItCg0LDQt9C80LXRgdGC0LjRgtGMINC70L7Qs9C+0YLQuNC/XCIsXG4gICAgICBsZWZ0OiBcItCh0LvQtdCy0LBcIixcbiAgICAgIHJpZ2h0OiBcItCh0L/RgNCw0LLQsFwiLFxuICAgICAgdG9wOiBcItCh0LLQtdGA0YXRg1wiLFxuICAgICAgYm90dG9tOiBcItCh0L3QuNC30YNcIixcbiAgICB9LFxuXG4gICAgdGFiczoge1xuICAgICAgZ2VuZXJhbDogXCLQntCx0YnQuNC1XCIsXG4gICAgICBmaWxlT3B0aW9uczogXCLQn9Cw0YDQsNC80LXRgtGA0YtcIixcbiAgICAgIEhUTUw6IFwi0KDQtdC00LDQutGC0L7RgCBIVE1MXCIsXG4gICAgICBjb2x1bW5zOiBcItCh0YLQvtC70LHRhtGLXCIsXG4gICAgICByb3dzOiBcItCh0YLRgNC+0LrQuFwiLFxuICAgICAgY2hvaWNlczogXCLQktGL0LHQvtGAXCIsXG4gICAgICBpdGVtczogXCLQrdC70LXQvNC10L3RgtGLXCIsXG4gICAgICB2aXNpYmxlSWY6IFwi0J7RgtC+0LHRgNCw0LbQsNGC0YwsINC10YHQu9C4XCIsXG4gICAgICBlbmFibGVJZjogXCLQlNC+0YHRgtGD0L/QtdC9LCDQtdGB0LvQuFwiLFxuICAgICAgcmVxdWlyZWRJZjogXCLQntCx0Y/Qt9Cw0YLQtdC70LXQvSDQtNC70Y8g0LfQsNC/0L7Qu9C90LXQvdC40Y8sINC10YHQu9C4XCIsXG4gICAgICByYXRlVmFsdWVzOiBcItCe0YbQtdC90LjRgtGMINCy0LDQttC90L7RgdGC0Ywo0LLQtdGBKSDQstC+0L/RgNC+0YHQsFwiLFxuICAgICAgY2hvaWNlc0J5VXJsOiBcItCS0YvQsdC+0YAg0LjQtyDQmNC90YLQtdGA0L3QtdGC0LBcIixcbiAgICAgIG1hdHJpeENob2ljZXM6IFwi0JLRi9Cx0L7RgCDQv9C+INGD0LzQvtC70YfQsNC90LjRjlwiLFxuICAgICAgbXVsdGlwbGVUZXh0SXRlbXM6IFwi0JLQstC+0LQg0L3QtdGB0LrQvtC70YzQutC40YUg0YLQtdC60YHRgtC+0LLRi9GFINC/0L7Qu9C10LlcIixcbiAgICAgIHZhbGlkYXRvcnM6IFwi0JLQsNC70LjQtNCw0YLQvtGA0YtcIixcbiAgICAgIG5hdmlnYXRpb246IFwi0J3QsNCy0LjQs9Cw0YbQuNGPXCIsXG4gICAgICBxdWVzdGlvbjogXCLQktC+0L/RgNC+0YFcIixcbiAgICAgIGNvbXBsZXRlZEh0bWw6IFwiSFRNTCDRhNC40L3QsNC70YzQvdC+0Lkg0YHRgtGA0LDQvdC40YbRi1wiLFxuICAgICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uOiBcIkhUTUwg0YTQuNC90LDQu9GM0L3QvtC5INGB0YLRgNCw0L3QuNGG0Ysg0L/RgNC4INGD0YHQu9C+0LLQuNC4XCIsXG4gICAgICBsb2FkaW5nSHRtbDogXCLQl9Cw0LPRgNGD0LfQutCwIEhUTUxcIixcbiAgICAgIHRpbWVyOiBcItCi0LDQudC80LXRgC/QktC40LrRgtC+0YDQuNC90LBcIixcbiAgICAgIGNhbGN1bGF0ZWRWYWx1ZXM6IFwi0KDQsNGB0YfQtdGC0L3Ri9C1INC30L3QsNGH0LXQvdC40Y9cIixcbiAgICAgIHRyaWdnZXJzOiBcItCi0YDQuNCz0LPQtdGA0YtcIixcbiAgICAgIHRlbXBsYXRlVGl0bGU6IFwi0J3QsNC30LLQsNC90LjQtSDRiNCw0LHQu9C+0L3QsFwiLFxuICAgICAgdG90YWxzOiBcItCY0YLQvtCz0LhcIixcblx0ICAgIGxvZ2ljOiBcItCb0L7Qs9C40LrQsFwiLFxuICAgICAgbGF5b3V0OiBcItCf0LvQsNC90LjRgNC+0LLQutCwXCIsXG4gICAgICBkYXRhOiBcItCU0LDQvdC90YvQtVwiLFxuICAgICAgdmFsaWRhdGlvbjogXCLQn9GA0L7QstC10YDQutCwXCIsXG4gICAgICBjZWxsczogXCLQr9GH0LXQudC60LhcIixcbiAgICAgIHNob3dPbkNvbXBsZXRlZDogXCLQn9C+0LrQsNC30LDRgtGMINC/0L4g0LfQsNCy0LXRgNGI0LXQvdC40Y5cIixcbiAgICAgIGxvZ286IFwi0JvQvtCz0L7RgtC40L8g0LIg0LfQsNCz0L7Qu9C+0LLQutC1INC+0L/RgNC+0YHQvdC40LrQsFwiLFxuICAgICAgb3RoZXJzOiBcItCU0YDRg9Cz0LjQtVwiLFxuICAgIH0sXG4gICAgZWRpdFByb3BlcnR5OiBcItCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINGB0LLQvtC50YHRgtCy0L4gJ3swfSdcIixcbiAgICBpdGVtczogXCJb0K3Qu9C10LzQtdC90YLRizogezB9XVwiLFxuICBcbiAgICBlbnRlck5ld1ZhbHVlOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstCy0LXQtNC40YLQtSDQt9C90LDRh9C10L3QuNC1LlwiLFxuICAgIG5vcXVlc3Rpb25zOiBcItCSINC+0L/RgNC+0YHQvdC40LrQtSDQvdC10YIg0L3QuCDQvtC00L3QvtCz0L4g0LLQvtC/0YDQvtGB0LBcIixcbiAgICBjcmVhdGV0cmlnZ2VyOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDRgdC+0LfQtNCw0LnRgtC1INGC0YDQuNCz0LPQtdGAXCIsXG4gICAgdHJpZ2dlck9uOiBcItCeXCIsXG4gICAgdHJpZ2dlck1ha2VQYWdlc1Zpc2libGU6IFwi0KHQtNC10LvQsNGC0Ywg0YHRgtGA0LDQvdC40YbRiyDQstC40LTQuNC80YvQvNC4OlwiLFxuICAgIHRyaWdnZXJNYWtlUXVlc3Rpb25zVmlzaWJsZTogXCLQodC00LXQu9Cw0YLRjCDRjdC70LXQvNC10L3RgtGLINCy0LjQtNC40LzRi9C80Lg6XCIsXG4gICAgdHJpZ2dlckNvbXBsZXRlVGV4dDogXCLQl9Cw0LLQtdGA0YjQuNGC0Ywg0L7Qv9GA0L7RgSwg0LXRgdC70Lgg0LLRgdC1INC/0L7Qu9GD0YfQuNGB0Y8uXCIsXG4gICAgdHJpZ2dlck5vdFNldDogXCLQotGA0LjQs9C10YAg0L3QtSDRg9GB0YLQsNC90L7QstC70LXQvVwiLFxuICAgIHRyaWdnZXJSdW5JZjogXCLQndCw0YfQsNGC0YwsINC10YHQu9C4XCIsXG4gICAgdHJpZ2dlclNldFRvTmFtZTogXCLQmNC30LzQtdC90LjRgtGMINC30L3QsNGH0LXQvdC40LU6XCIsXG4gICAgdHJpZ2dlckZyb21OYW1lOiBcItCh0LrQvtC/0LjRgNC+0LLQsNGC0Ywg0LfQvdCw0YfQtdC90LjQtSDQuNC3OlwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uOiBcItCS0YvQv9C+0LvQvdC40YLRjCDRjdGC0L4g0LLRi9GA0LDQttC10L3QuNC1OlwiLFxuICAgIHRyaWdnZXJTZXRWYWx1ZTogXCLQsjpcIixcbiAgICB0cmlnZ2VyR290b05hbWU6IFwi0J/QtdGA0LXQudGC0Lgg0Log0LLQvtC/0YDQvtGB0YM6XCIsXG4gICAgdHJpZ2dlcklzVmFyaWFibGU6IFwi0J3QtSDQv9C+0LzQtdGJ0LDRgtGMINC/0LXRgNC10LzQtdC90L3Rg9GOINCyINGA0LXQt9GD0LvRjNGC0LDRgiDQvtC/0YDQvtGB0L3QuNC60LAuXCIsXG4gICAgdHJpZ2dlclJ1bkV4cHJlc3Npb25FbXB0eTogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLQstC10LTQuNGC0LUg0LrQvtGA0YDQtdC60YLQvdC+0LUg0LLRi9GA0LDQttC10L3QuNC1XCJcbiAgfSxcbiAgLy8gUHJvcGVydHkgdmFsdWVzXG4gIHB2OiB7XG4gICAgdHJ1ZTogXCJ0cnVlXCIsXG4gICAgZmFsc2U6IFwiZmFsc2VcIixcbiAgICBpbmhlcml0OiBcItCd0LDRgdC70LXQtNC+0LLQsNGC0YxcIixcbiAgICBzaG93OiBcItCf0L7QutCw0LfQsNGC0YxcIixcbiAgICBoaWRlOiBcItCh0LrRgNGL0YLRjFwiLFxuICAgIGRlZmF1bHQ6IFwi0J/QviDRg9C80L7Qu9GH0LDQvdC40Y5cIixcbiAgICBpbml0aWFsOiBcItCY0LfQvdCw0YfQsNC70YzQvdGL0Lkg0L/QvtGA0Y/QtNC+0LpcIixcbiAgICByYW5kb206IFwi0KHQu9GD0YfQsNC50L3Ri9C5INC/0L7RgNGP0LTQvtC6XCIsXG4gICAgY29sbGFwc2VkOiBcItCf0YDQtdGA0LLQsNC9XCIsXG4gICAgZXhwYW5kZWQ6IFwi0KDQsNGB0YjQuNGA0LXQvVwiLFxuICAgIG5vbmU6IFwi0J3QtdGCXCIsXG4gICAgYXNjOiBcItCf0L4g0LLQvtC30YDQsNGB0YLQsNC90LjRjlwiLFxuICAgIGRlc2M6IFwi0J/QviDRg9Cx0YvQstCw0L3QuNGOXCIsXG4gICAgaW5kZXRlcm1pbmF0ZTogXCLQndC10L7Qv9GA0LXQtNC10LvQtdC90L3Ri9C5XCIsXG4gICAgZGVjaW1hbDogXCLQlNC10YHRj9GC0LjRh9C90YvQuVwiLFxuICAgIGN1cnJlbmN5OiBcItCS0LDQu9GO0YLQsFwiLFxuICAgIHBlcmNlbnQ6IFwi0J/RgNC+0YbQtdC90YLRi1wiLFxuICAgIGZpcnN0RXhwYW5kZWQ6IFwi0KDQsNGB0YjQuNGA0LXQvSDQv9C10YDQstGL0LlcIixcbiAgICBvZmY6IFwi0JLRi9C60LvRjtGH0LjRgtGMXCIsXG4gICAgb25QYW5lbDogXCLQndCwINC/0LDQvdC10LvQuFwiLFxuICAgIG9uU3VydmV5OiBcItCSINC+0L/RgNC+0YHQvdC40LrQtVwiLFxuICAgIGxpc3Q6IFwi0KHQv9C40YHQvtC6XCIsXG4gICAgcHJvZ3Jlc3NUb3A6IFwicHJvZ3Jlc3NUb3BcIixcbiAgICBwcm9ncmVzc0JvdHRvbTogXCJwcm9ncmVzc0JvdHRvbVwiLFxuICAgIHByb2dyZXNzVG9wQm90dG9tOiBcInByb2dyZXNzVG9wQm90dG9tXCIsXG4gICAgaG9yaXpvbnRhbDogXCLQk9C+0YDQuNC30L7QvdGC0LDQu9GM0L3QvlwiLFxuICAgIHZlcnRpY2FsOiBcItCS0LXRgNGC0LjQutCw0LvRjNC90L5cIixcbiAgICB0b3A6IFwi0KHQstC10YDRhdGDXCIsXG4gICAgYm90dG9tOiBcItCh0L3QuNC30YNcIixcbiAgICB0b3BCb3R0b206IFwi0KHQstC10YDRhdGDINC4INGB0L3QuNC30YNcIixcbiAgICBsZWZ0Olwi0KHQu9C10LLQsFwiLFxuICAgIGNvbG9yOiBcItCm0LLQtdGCXCIsXG4gICAgZGF0ZTogXCLQlNCw0YLQsFwiLFxuICAgIGRhdGV0aW1lOiBcItCU0LDRgtCwINC4INCy0YDQtdC80Y9cIixcbiAgICBcImRhdGV0aW1lLWxvY2FsXCI6IFwi0JzQtdGB0YLQvdGL0LUg0LTQsNGC0LAg0Lgg0LLRgNC10LzRj1wiLFxuICAgIGVtYWlsOiBcIkVtYWlsXCIsXG4gICAgbW9udGg6IFwi0JzQtdGB0Y/RhlwiLFxuICAgIG51bWJlcjogXCLQndC+0LzQtdGAXCIsXG4gICAgcGFzc3dvcmQ6IFwi0J/QsNGA0L7Qu9GMXCIsXG4gICAgcmFuZ2U6IFwi0JTQuNCw0L/QsNC30L7QvVwiLFxuICAgIHRlbDogXCLQotC10LvQtdGE0L7QvVwiLFxuICAgIHRleHQ6IFwi0KLQtdC60YHRglwiLFxuICAgIHRpbWU6IFwi0JLRgNC10LzRj1wiLFxuICAgIHVybDogXCJVUkxcIixcbiAgICB3ZWVrOiBcItCd0LXQtNC10LvRj1wiLFxuICAgIGhpZGRlbjogXCLQodC60YDRi9GCXCIsXG4gICAgb246IFwi0JLQutC70Y7Rh9C40YLRjFwiLFxuICAgIG9uUGFnZTogXCLQndCwINGB0YLRgNCw0L3QuNGG0LVcIixcbiAgICBlZGl0OiBcItCg0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40LVcIixcbiAgICBkaXNwbGF5OiBcItCf0YDQvtGB0LzQvtGC0YBcIixcbiAgICBvbkNvbXBsZXRlOiBcItCf0L4g0LfQsNCy0LXRgNGI0LXQvdC40Y5cIixcbiAgICBvbkhpZGRlbjogXCLQn9C+INGB0LrRgNGL0YLQuNGOXCIsXG4gICAgYWxsOiBcItCS0YHQtVwiLFxuICAgIHBhZ2U6IFwi0KHRgtGA0LDQvdC40YbQsFwiLFxuICAgIHN1cnZleTogXCLQntC/0YDQvtGBXCIsXG4gICAgb25OZXh0UGFnZTogXCLQn9GA0Lgg0L/QtdGA0LXRhdC+0LTQtSDQvdCwINGB0LvQtdC00YPRjtGJ0YPRjiDRgdGC0YDQsNC90LjRhtGDXCIsXG4gICAgb25WYWx1ZUNoYW5nZWQ6IFwi0J/RgNC4INC40LfQvNC10L3QtdC90LjQuCDQt9C90LDRh9C10L3QuNGPXCJcbiAgfSxcbiAgLy8gT3BlcmF0b3JzXG4gIG9wOiB7XG4gICAgZW1wdHk6IFwi0L3QtSDQt9Cw0L/QvtC70L3QtdC90L5cIixcbiAgICBub3RlbXB0eTogXCLQt9Cw0L/QvtC70L3QtdC90L5cIixcbiAgICBlcXVhbDogXCLRgNCw0LLQvdC+XCIsXG4gICAgbm90ZXF1YWw6IFwi0L3QtSDRgNCw0LLQvdC+XCIsXG4gICAgY29udGFpbnM6IFwi0YHQvtC00LXRgNC20LjRglwiLFxuICAgIG5vdGNvbnRhaW5zOiBcItC90LUg0YHQvtC00LXRgNC20LjRglwiLFxuICAgIGFueW9mOiBcItC70Y7QsdC+0Lkg0LjQt1wiLFxuICAgIGFsbG9mOiBcItCy0YHQtSDQuNC3XCIsXG4gICAgZ3JlYXRlcjogXCLQsdC+0LvRjNGI0LVcIixcbiAgICBsZXNzOiBcItC80LXQvdGM0YjQtVwiLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBcItCx0L7Qu9GM0YjQtSDQuNC70Lgg0YDQsNCy0L3QvlwiLFxuICAgIGxlc3NvcmVxdWFsOiBcItC80LXQvdGM0YjQtSDQuNC70Lgg0YDQsNCy0L3QvlwiXG4gIH0sXG4gIC8vIEVtYmVkIHdpbmRvd1xuICBldzoge1xuICAgIGFuZ3VsYXI6IFwi0JjRgdC/0L7Qu9GM0LfRg9C50YLQtSDQstC10YDRgdC40Y4gQW5ndWxhclwiLFxuICAgIGpxdWVyeTogXCLQmNGB0L/QvtC70YzQt9GD0LnRgtC1INCy0LXRgNGB0LjRjiBqUXVlcnlcIixcbiAgICBrbm9ja291dDogXCLQmNGB0L/QvtC70YzQt9GD0LnRgtC1INCy0LXRgNGB0LjRjiBLbm9ja291dFwiLFxuICAgIHJlYWN0OiBcItCY0YHQv9C+0LvRjNC30YPQudGC0LUg0LLQtdGA0YHQuNGOIFJlYWN0XCIsXG4gICAgdnVlOiBcItCY0YHQv9C+0LvRjNC30YPQudGC0LUg0LLQtdGA0YHQuNGOIFZ1ZVwiLFxuICAgIGJvb3RzdHJhcDogXCLQlNC70Y8g0LHQuNCx0LvQuNC+0YLQtdC60LggYm9vdHN0cmFwXCIsXG4gICAgc3RhbmRhcmQ6IFwi0JHQtdC3INCx0LjQsdC70LjQvtGC0LXQutC4IGJvb3RzdHJhcFwiLFxuICAgIHNob3dPblBhZ2U6IFwi0J/QvtC60LDQt9GL0LLQsNGC0Ywg0L7Qv9GA0L7RgdC90LjQuiDQvdCwINGB0YLRgNCw0L3QuNGG0LVcIixcbiAgICBzaG93SW5XaW5kb3c6IFwi0J/QvtC60LDQt9GL0LLQsNGC0Ywg0L7Qv9GA0L7RgdC90LjQuiDQsiDQvNC+0LTQsNC70YzQvdC+0Lwg0L7QutC90LVcIixcbiAgICBsb2FkRnJvbVNlcnZlcjogXCLQl9Cw0LPRgNGD0LfQuNGC0YwgSnNvbiDQvtC/0YDQvtGB0L3QuNC60LAg0YEg0YHQtdGA0LLQtdGA0LBcIixcbiAgICB0aXRsZVNjcmlwdDogXCLQodC60YDQuNC/0YLRiyDQuCDRgdGC0LjQu9C4XCIsXG4gICAgdGl0bGVIdG1sOiBcIkhUTUxcIixcbiAgICB0aXRsZUphdmFTY3JpcHQ6IFwiSmF2YVNjcmlwdFwiXG4gIH0sXG4gIC8vINCe0L/RgNC+0YEg0KLQtdGB0YJcbiAgdHM6IHtcbiAgICBzZWxlY3RQYWdlOiBcItCS0YvQsdC10YDQuNGC0LUg0YHRgtGA0LDQvdC40YbRgywg0YfRgtC+0LHRiyDQv9GA0L7QstC10YDQuNGC0Ywg0Y3RgtC+OlwiLFxuICAgIHNob3dJbnZpc2libGVFbGVtZW50czogXCLQn9C+0LrQsNC30YvQstCw0YLRjCDRgdC60YDRi9GC0YvQtSDRjdC70LXQvNC10L3RgtGLXCJcbiAgfSxcbiAgdmFsaWRhdG9yczoge1xuICAgIGFuc3dlcmNvdW50dmFsaWRhdG9yOiBcItCa0L7Qu9C40YfQtdGB0YLQstC+INC+0YLQstC10YLQvtCyXCIsXG4gICAgRW1haWxWYWxpZGF0b3I6IFwiRW1haWxcIixcbiAgICBleHByZXNzaW9udmFsaWRhdG9yOiBcItCS0YvRgNCw0LbQtdC90LjQtVwiLFxuICAgIG51bWVyaWN2YWxpZGF0b3I6IFwi0KfQuNGB0LvQvlwiLFxuICAgIHJlZ2V4dmFsaWRhdG9yOiBcItCg0LXQs9GD0LvRj9GA0L3QvtC1INCy0YvRgNCw0LbQtdC90LjQtVwiLFxuICAgIHRleHR2YWxpZGF0b3I6IFwi0KLQtdC60YHRglwiXG4gIH0sXG4gICAgdHJpZ2dlcnM6IHtcbiAgICBjb21wbGV0ZXRyaWdnZXI6IFwi0JfQsNCy0LXRgNGI0LjRgtGMINC+0L/RgNC+0YFcIixcbiAgICBzZXR2YWx1ZXRyaWdnZXI6IFwi0KPRgdGC0LDQvdC+0LLQuNGC0Ywg0LfQvdCw0YfQtdC90LjQtVwiLFxuICAgIGNvcHl2YWx1ZXRyaWdnZXI6IFwi0KHQutC+0L/QuNGA0L7QstCw0YLRjCDQt9C90LDRh9C10L3QuNC1XCIsXG4gICAgc2tpcHRyaWdnZXI6IFwi0J/QtdGA0LXQudGC0Lgg0Log0LLQvtC/0YDQvtGB0YNcIixcbiAgICBydW5leHByZXNzaW9udHJpZ2dlcjogXCLQl9Cw0L/Rg9GB0YLQuNGC0Ywg0LLRi9GA0LDQttC10L3QuNC1XCIsXG4gICAgdmlzaWJsZXRyaWdnZXI6IFwi0JjQt9C80LXQvdC40YLRjCDQstC40LTQuNC80L7RgdGC0YwgKNC90LUg0YDQtdC60L7QvNC10L3QtNGD0LXRgtGB0Y8pXCJcbiAgfSxcbiAgLy8gUHJvcGVydGllc1xuICBwOiB7XG4gICAgbmFtZTogXCLQndCw0LfQstCw0L3QuNC1XCIsXG4gICAgdGl0bGU6IHtcbiAgICAgIG5hbWU6IFwi0J3QsNC30LLQsNC90LjQtVwiLFxuICAgICAgdGl0bGU6IFwi0J7RgdGC0LDQstGM0YLQtSDQtdCz0L4g0L/Rg9GB0YLRi9C8LCDQtdGB0LvQuCDQvtC90L4g0YLQsNC60L7QtSDQttC1LCDQutCw0LogJ9Cd0LDQt9Cy0LDQvdC40LUnXCJcbiAgICB9LFxuICAgIG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eTogXCLQntGC0L7QsdGA0LDQttC10L3QuNC1INC90LDQstC40LPQsNGG0LjQvtC90L3Ri9GFINC60L3QvtC/0L7QulwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcItCh0L7RgNGC0LjRgNC+0LLQutCwINGN0LvQtdC80LXQvdGC0L7QsiDQvdCwINGB0YLRgNCw0L3QuNGG0LVcIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwi0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INCy0YDQtdC80Y8g0LTQu9GPINC30LDQstC10YDRiNC10L3QuNGPXCIsXG5cbiAgICB2aXNpYmxlOiBcItCS0LjQtNC40LzRi9C5XCIsXG4gICAgdmlzaWJsZUlmOiBcItCe0YLQvtCx0YDQsNC20LDRgtGMLCDQtdGB0LvQuFwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCLQoNCw0YHQv9C+0LvQvtC20LXQvdC40LUg0LfQsNCz0L7Qu9C+0LLQutCwINCy0L7Qv9GA0L7RgdCwXCIsXG4gICAgZGVzY3JpcHRpb246IFwi0J7Qv9C40YHQsNC90LjQtVwiLFxuICAgIHN0YXRlOiBcItCh0L7RgdGC0L7Rj9C90LjQtVwiLFxuICAgIGlzUmVxdWlyZWQ6IFwi0J7QsdGP0LfQsNGC0LXQu9C10L1cIixcbiAgICByZXF1aXJlZElmOiBcItCe0LHRj9C30LDRgtC10LvQtdC9INC10YHQu9C4XCIsXG4gICAgaW5kZW50OiBcItCe0YLRgdGC0YPQv1wiLFxuICAgIHJlcXVpcmVkRXJyb3JUZXh0OiBcItCt0YLQviDQv9C+0LvQtSDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdC+0LUg0LTQu9GPINC30LDQv9C+0LvQvdC10L3QuNGPXCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCLQndCw0YfQuNC90LDRgtGMINGBINC90L7QstC+0Lkg0YHRgtGA0L7QutC4XCIsXG4gICAgaW5uZXJJbmRlbnQ6IFwi0JLQvdGD0YLRgNC10L3QvdC40Lkg0L7RgtGB0YLRg9C/XCIsXG4gICAgcGFnZTogXCLQodGC0YDQsNC90LjRhtCwXCIsXG5cbiAgICB3aWR0aDogXCLQqNC40YDQuNC90LBcIixcblxuICAgIGNvbW1lbnRUZXh0OiBcItCa0L7QvNC80LXQvdGC0LDRgNC40LlcIixcbiAgICB2YWx1ZU5hbWU6IFwi0J3QsNC30LLQsNC90LjQtSDQt9C90LDRh9C10L3QuNGPXCIsXG4gICAgZW5hYmxlSWY6IFwi0JTQvtGB0YLRg9C/0LXQvSDQv9GA0Lgg0YPRgdC70L7QstC40LhcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwi0JfQvdCw0YfQtdC90LjQtSDQv9C+INGD0LzQvtC70YfQsNC90LjRjlwiLFxuICAgIGNvcnJlY3RBbnN3ZXI6IFwi0J/RgNCw0LLQuNC70YzQvdGL0Lkg0L7RgtCy0LXRglwiLFxuICAgIHJlYWRPbmx5OiBcItCi0L7Qu9GM0LrQviDQtNC70Y8g0YfRgtC10L3QuNGPXCIsXG4gICAgdmFsaWRhdG9yczogXCLQktCw0LvQuNC00LDRgtC+0YDRi1wiLFxuICAgIHRpdGxlTG9jYXRpb246IFwi0KDQsNGB0L/QvtC70L7QttC10L3QuNC1INC30LDQs9C+0LvQvtCy0LrQsFwiLFxuXG4gICAgaGFzQ29tbWVudDogXCLQldGB0YLRjCDQutC+0LzQvNC10L3RgtCw0YDQuNC5XCIsXG4gICAgaGFzT3RoZXI6IFwi0JXRgdGC0Ywg0LfQvdCw0YfQtdC90LjQtSAn0JTRgNGD0LPQvtC1J1wiLFxuICAgIGNob2ljZXM6IFwi0JLRi9Cx0L7RgFwiLFxuICAgIGNob2ljZXNPcmRlcjogXCLQktGL0LHRgNCw0YLRjCDQv9C+0YDRj9C00L7QuiDQstGL0LHQvtGA0LBcIixcbiAgICBjaG9pY2VzQnlVcmw6IFwi0JLRi9Cx0YDQsNGC0Ywg0LjQtyDQuNC90YLQtdGA0L3QtdGC0LBcIixcbiAgICBvdGhlclRleHQ6IFwi0JTRgNGD0LPQvtC5INGC0LXQutGB0YLQvtCy0YvQuSDRjdC70LXQvNC10L3RglwiLFxuICAgIG90aGVyRXJyb3JUZXh0OiBcItCi0LXQutGB0YIg0L7RiNC40LHQutC4INC/0L7Qu9GPICfQlNGA0YPQs9C+0LUnXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwi0KXRgNCw0L3QuNGC0Ywg0LfQvdCw0YfQtdC90LjQtSDQv9C+0LvRjyAn0JTRgNGD0LPQvtC1Jywg0LrQsNC6INC60L7QvNC80LXQvdGC0LDRgNC40LlcIixcblxuICAgIGxhYmVsOiBcItCv0YDQu9GL0LpcIixcbiAgICBzaG93VGl0bGU6IFwi0J/QvtC60LDQt9GL0LLQsNGC0Ywg0L3QsNC30LLQsNC90LjQtVwiLFxuICAgIHZhbHVlVHJ1ZTogXCLQn9GA0LDQstC40LvRjNC90L5cIixcbiAgICB2YWx1ZUZhbHNlOiBcItCd0LXQv9GA0LDQstC40LvRjNC90L5cIixcblxuICAgIGNvbHM6IFwi0KHRgtC+0LvQsdGG0YtcIixcbiAgICByb3dzOiBcItCh0YLRgNC+0LrQuFwiLFxuICAgIHBsYWNlSG9sZGVyOiBcItCf0LvQtdC50YHRhdC+0LvQtNC10YBcIixcblxuICAgIG9wdGlvbnNDYXB0aW9uOiBcItCf0L7QtNC/0LjRgdGMINC/0LDRgNCw0LzQtdGC0YDQvtCyXCIsXG5cbiAgICBleHByZXNzaW9uOiBcItCS0YvRgNCw0LbQtdC90LjQtVwiLFxuICAgIGZvcm1hdDogXCLQpNC+0YDQvNCw0YJcIixcbiAgICBkaXNwbGF5U3R5bGU6IFwi0KHRgtC40LvRjCDQvtGC0L7QsdGA0LDQttC10L3QuNGPXCIsXG4gICAgY3VycmVuY3k6IFwi0JLQsNC70Y7RgtCwXCIsXG4gICAgdXNlR3JvdXBpbmc6IFwi0JjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGMINCz0YDRg9C/0L/QuNGA0L7QstC60YNcIixcblxuICAgIHNob3dQcmV2aWV3OiBcItCf0L7QutCw0LfRi9Cy0LDRgtGMINC/0YDQtdCy0YzRjlwiLFxuICAgIGFsbG93TXVsdGlwbGU6IFwi0JLRi9Cx0YDQsNGC0Ywg0L3QtdGB0LrQvtC70YzQutC+XCIsXG4gICAgaW1hZ2VIZWlnaHQ6IFwi0JLRi9GB0L7RgtCwINC40LfQvtCx0YDQsNC20LXQvdC40Y9cIixcbiAgICBpbWFnZVdpZHRoOiBcItCo0LjRgNC40L3QsCDQuNC30L7QsdGA0LDQttC10L3QuNGPXCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcItCl0YDQsNC90LjRgtGMINC00LDQvdC90YvQtSDQsiDQstC40LTQtSDRgtC10LrRgdGC0LBcIixcbiAgICBtYXhTaXplOiBcItCc0LDQutGB0LjQvNCw0LvRjNC90YvQuSDRgNCw0LfQvNC10YBcIixcblxuICAgIGh0bWw6IFwiSFRNTFwiLFxuXG4gICAgY29sdW1uczogXCLQodGC0L7Qu9Cx0YbRi1wiLFxuICAgIGNlbGxzOiBcItCv0YfQtdC50LrQuFwiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwi0JLRgdC1INGB0YLRgNC+0LrQuCDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdGLINC00LvRjyDQt9Cw0L/QvtC70L3QtdC90LjRj1wiLFxuXG4gICAgaG9yaXpvbnRhbFNjcm9sbDogXCLQk9C+0YDQuNC30L7QvdGC0LDQu9GM0L3Ri9C5INGB0LrRgNC+0LvQu1wiLFxuICAgIGNlbGxUeXBlOiBcItCi0LjQvyDRj9GH0LXQudC60LhcIixcbiAgICBjb2x1bW5zTGF5b3V0OiBcItCc0LDQutC10YIg0YHRgtC+0LvQsdGG0L7QslwiLFxuICAgIGNvbHVtbkNvbENvdW50OiBcItCa0L7Qu9C40YfQtdGB0YLQstC+INGB0YLQvtC70LHRhtC+0LJcIixcbiAgICBjb2x1bW5NaW5XaWR0aDogXCLQnNC40L3QuNC80LDQu9GM0L3QsNGPINGI0LjRgNC40L3QsCDRgdGC0L7Qu9Cx0YbQsFwiLFxuXG4gICAgcm93Q291bnQ6IFwi0JrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0L7QulwiLFxuICAgIG1pblJvd0NvdW50OiBcItCc0LjQvdC40LzQsNC70YzQvdC+0LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0L7QulwiLFxuICAgIG1heFJvd0NvdW50OiBcItCc0LDQutGB0LjQvNCw0LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDRgdGC0YDQvtC6XCIsXG4gICAga2V5TmFtZTogXCLQndCw0LfQstCw0L3QuNC1INC60LvRjtGH0LBcIixcbiAgICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItCe0YjQuNCx0LrQsCEg0KLQsNC60L7QuSDQutC70Y7RhyDRg9C20LUg0YHRg9GJ0LXRgdGC0LLRg9C10YIsINGD0LrQsNC20LjRgtC1INC00YDRg9Cz0L7QtSDQvdCw0LfQstCw0L3QuNC1LlwiLFxuICAgIGNvbmZpcm1EZWxldGU6IFwi0J/QvtC00YLQstC10YDQtNC40YLRjCDRg9C00LDQu9C10L3QuNC1XCIsXG4gICAgY29uZmlybURlbGV0ZVRleHQ6IFwi0KLQtdC60YHRgiDRgdC+0L7QsdGJ0LXQvdC40Y8g0L/RgNC4INC/0L7QtNGC0LLQtdGA0LbQtNC10L3QuNC4INGD0LTQsNC70LXQvdC40Y9cIixcbiAgICBhZGRSb3dMb2NhdGlvbjogXCLQlNC+0LHQsNCy0LjRgtGMINGA0LDRgdC/0L7Qu9C+0LbQtdC90LjQtSDRgdGC0YDQvtC6XCIsXG4gICAgYWRkUm93VGV4dDogXCLQlNC+0LHQsNCy0LjRgtGMINC60L3QvtC/0LrRgyDRgdGC0YDQvtC60Lgg0YLQtdC60YHRgtCwXCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCLQo9C00LDQu9C40YLRjCDQutC90L7Qv9C60YMg0YHRgtGA0L7QutC4INGC0LXQutGB0YLQsFwiLFxuXG4gICAgaXRlbXM6IFwi0K3Qu9C10LzQtdC90YLRi1wiLFxuICAgIGl0ZW1TaXplOiBcItCg0LDQt9C80LXRgCDRjdC70LXQvNC10L3RgtC+0LJcIixcbiAgICBjb2xDb3VudDogXCLQmtC+0LvQuNGH0LXRgdGC0LLQviDRgdGC0L7Qu9Cx0YbQvtCyXCIsXG5cbiAgICB0ZW1wbGF0ZVRpdGxlOiBcItCX0LDQs9C+0LvQvtCy0L7QuiDRiNCw0LHQu9C+0L3QsFwiLFxuICAgIHRlbXBsYXRlRGVzY3JpcHRpb246IFwi0J7Qv9C40YHQsNC90LjQtSDRiNCw0LHQu9C+0L3QsFwiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwi0KDQsNC30YDQtdGI0LjRgtGMINC00L7QsdCw0LLQu9C10L3QuNC1INC/0LDQvdC10LvQuFwiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwi0KDQsNC30YDQtdGI0LjRgtGMINGD0LTQsNC70LXQvdC40LUg0L/QsNC90LXQu9C4XCIsXG4gICAgcGFuZWxDb3VudDogXCLQmtC+0LvQuNGH0LXRgdGC0LLQviDQv9Cw0L3QtdC70LXQuVwiLFxuICAgIG1pblBhbmVsQ291bnQ6IFwi0JzQuNC90LjQvNCw0LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDQv9Cw0L3QtdC70LXQuVwiLFxuICAgIG1heFBhbmVsQ291bnQ6IFwi0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INC/0LDQvdC10LvQtdC5XCIsXG4gICAgcGFuZWxzU3RhdGU6IFwi0KHQvtGB0YLQvtGP0L3QuNC1INC/0LDQvdC10LvQtdC5XCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcItCi0LXQutGB0YIg0YHQvtC+0LHRidC10L3QuNGPINC/0YDQuCDQtNC+0LHQsNCy0LvQtdC90LjQuCDQv9Cw0L3QtdC70LhcIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwi0KLQtdC60YHRgiDRgdC+0L7QsdGJ0LXQvdC40Y8g0L/RgNC4INGD0LTQsNC70LXQvdC40Lgg0L/QsNC90LXQu9C4XCIsXG4gICAgcGFuZWxQcmV2VGV4dDogXCLQotC10LrRgdGCINGB0L7QvtCx0YnQtdC90LjRjyDQv9GA0LXQtNGL0LTRg9GJ0LXQuSDQv9Cw0L3QtdC70LhcIixcbiAgICBwYW5lbE5leHRUZXh0OiBcItCi0LXQutGB0YIg0YHQvtC+0LHRidC10L3QuNGPINGB0LvQtdC00YPRjtGJ0LXQuSDQv9Cw0L3QtdC70LhcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcItCf0L7QutCw0LfRi9Cy0LDRgtGMINC90L7QvNC10YDQsCDQstC+0L/RgNC+0YHQvtCyXCIsXG4gICAgc2hvd1JhbmdlSW5Qcm9ncmVzczogXCLQn9C+0LrQsNC30YvQstCw0YLRjCDQv9GA0L7Qs9GA0LXRgdGB0LAg0LfQsNC/0L7Qu9C90LXQvdC40Y9cIixcbiAgICByZW5kZXJNb2RlOiBcItCg0LXQttC40Lwg0L7RgtC+0LHRgNCw0LbQtdC90LjRj1wiLFxuICAgIHRlbXBsYXRlVGl0bGVMb2NhdGlvbjogXCLQoNCw0YHQv9C+0LvQvtC20LXQvdC40LUg0LfQsNCz0L7Qu9C+0LLQutCwINGI0LDQsdC70L7QvdCwXCIsXG5cbiAgICByYXRlVmFsdWVzOiBcItCe0YbQtdC90LjRgtGMINCy0LDQttC90L7RgdGC0Ywo0LLQtdGBKSDQvtC/0YDQvtGB0LBcIixcbiAgICByYXRlTWluOiBcItCc0LjQvdC40LzQsNC70YzQvdGL0Lkg0YDQtdC50YLQuNC90LNcIixcbiAgICByYXRlTWF4OiBcItCc0LDQutGB0LjQvNCw0LvRjNC90YvQuSDRgNC10LnRgtC40L3Qs1wiLFxuICAgIHJhdGVTdGVwOiBcItCo0LDQsyDRgNC10LnRgtC40L3Qs9CwXCIsXG4gICAgbWluUmF0ZURlc2NyaXB0aW9uOiBcItCe0L/QuNGB0LDQvdC40LUg0LTQu9GPINC80LjQvdC40LzQsNC70YzQvdC+0LPQviDRgNC10LnRgtC40L3Qs9CwXCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcItCe0L/QuNGB0LDQvdC40LUg0LTQu9GPINC80LDQutGB0LjQvNCw0LvRjNC90L7Qs9C+INGA0LXQudGC0LjQvdCz0LBcIixcblxuICAgIGlucHV0VHlwZTogXCLQotC40L8g0LLQstC+0LTQsFwiLFxuICAgIHNpemU6IFwi0KDQsNC30LzQtdGAXCIsXG5cbiAgICBsb2NhbGU6IFwi0JvQvtC60LDQu9GMXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcItCk0L7QutGD0YHQuNGA0L7QstCw0L3QuNC1INC90LAg0L/QtdGA0LLQvtC8INCy0L7Qv9GA0L7RgdC1INC/0YDQuCDQuNC30LzQtdC90LXQvdC40Lgg0YHRgtGA0LDQvdC40YbRi1wiLFxuICAgIGNvbXBsZXRlZEh0bWw6IFwiSFRNTCDRhNC40L3QsNC70YzQvdC+0Lkg0YHRgtGA0LDQvdC40YbRi1wiLFxuICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbjogXCJIVE1MINGE0LjQvdCw0LvRjNC90L7QuSDRgdGC0YDQsNC90LjRhtGLINC/0YDQuCDRg9GB0LvQvtCy0LjQuFwiLFxuICAgIGxvYWRpbmdIdG1sOiBcItCX0LDQs9GA0YPQt9C60LAgSFRNTFwiLFxuICAgIHRyaWdnZXJzOiBcItGC0YDQuNCz0LPQtdGA0YtcIixcbiAgICBjb29raWVOYW1lOiBcItC40LzRjyBDb29raWVcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCLQn9C+0LrQsNC30LDRgtGMINGA0LXQt9GD0LvRjNGC0LDRgtGLINC+0L/RgNC+0YHQsCDQvdCwINGB0YLRgNCw0L3QuNGG0LUg0YDRj9C00L7QvFwiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczogXCLQn9C+0LrQsNC30YvQstCw0YLRjCDQutC90L7Qv9C60Lgg0L3QsNCy0LjQs9Cw0YbQuNC4ICjQvdCw0LLQuNCz0LDRhtC40Y8g0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4pXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwi0J/QvtC60LDQt9GL0LLQsNGC0Ywg0LrQvdC+0L/QutC4ICfQn9GA0LXQtNGL0LTRg9GJ0LDRjyDRgdGC0YDQsNC90LjRhtCwJyAo0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GMINC80L7QttC10YIg0LLQtdGA0L3Rg9GC0YzRgdGPINC90LAg0L/RgNC10LTRi9C00YPRidGD0Y4g0YHRgtGA0LDQvdC40YbRgylcIixcbiAgICBzaG93UGFnZVRpdGxlczogXCLQn9C+0LrQsNC30YvQstCw0YLRjCDQvdCw0LfQstCw0L3QuNC1INGB0YLRgNCw0L3QuNGG0YtcIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCLQn9C+0LrQsNC30YvQstCw0YLRjCDRgdGC0YDQsNC90LjRhtGDINGBINGC0LXQutGB0YLQvtC8INC/0L4g0LfQsNCy0LXRgNGI0LXQvdC40Y4g0LfQsNC/0L7Qu9C90LXQvdC40Y8gKEhUTUwg0YTQuNC90LDQu9GM0L3QvtC5INGB0YLRgNCw0L3QuNGG0YspXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcItCf0L7QutCw0LfRi9Cy0LDRgtGMINC90L7QvNC10YDQsCDRgdGC0YDQsNC90LjRhlwiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCLQoNCw0LfQvNC10YnQtdC90LjQtSDQvtGI0LjQsdC60Lgg0L7Qv9GA0L7RgdCwXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcItCf0L7QutCw0LfRi9Cy0LDRgtGMINC/0YDQvtCz0YDQtdGB0YEg0LfQsNC/0L7Qu9C90LXQvdC40Y9cIixcbiAgICBtb2RlOiBcItCg0LXQttC40LxcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOiBcItCf0LXRgNC10YXQvtC00LjRgtGMINC90LAg0YHQu9C10LTRg9GO0YnRg9GOINGB0YLRgNCw0L3QuNGG0YMg0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60Lgg0L/RgNC4INC+0YLQstC10YLQtSDQvdCwINCy0YHQtSDQstC+0L/RgNC+0YHRi1wiLFxuICAgIGNoZWNrRXJyb3JzTW9kZTogXCLQoNC10LbQuNC8INC/0YDQvtCy0LXRgNC60Lgg0L7RiNC40LHQvtC6XCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwi0J7Rh9C40YHRgtC40YLRjCDQvdC10LLQuNC00LjQvNGL0LUg0LfQvdCw0YfQtdC90LjRj1wiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCLQotC10LrRgdGCINCyINC60L3QvtC/0LrQtSAn0J3QsNGH0LDRgtGMJ1wiLFxuICAgIHBhZ2VQcmV2VGV4dDogXCLQotC10LrRgdGCINCyINC60L3QvtC/0LrQtSAn0J/RgNC10LTRi9C00YPRidCw0Y8g0YHRgtGA0LDQvdC40YbQsCdcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwi0KLQtdC60YHRgiDQsiDQutC90L7Qv9C60LUgJ9Ch0LvQtdC00YPRjtGJ0LDRjyDRgdGC0YDQsNC90LjRhtCwJ1wiLFxuICAgIGNvbXBsZXRlVGV4dDogXCLQotC10LrRgdGCINCyINC60L3QvtC/0LrQtSAn0JfQsNCy0LXRgNGI0LjRgtGMJ1wiLFxuICAgIHJlcXVpcmVkVGV4dDogXCLQodC40LzQstC+0Lsg0LTQu9GPINC+0LHRj9C30LDRgtC10LvRjNC90L7Qs9C+INCy0L7Qv9GA0L7RgdCwXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcItCd0LDRh9Cw0LvRjNC90YvQuSDQuNC90LTQtdC60YEg0LIg0L7Qv9GA0L7RgdC1ICgxLCAyINC40LvQuCAnQScsICfQsCcpXCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOiBcItCo0LDQsdC70L7QvSDQvdCw0LfQstCw0L3QuNGPINC+0L/RgNC+0YHQsCwg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y46IHvQvdC1fSB70YLRgNC10LHRg9C10YJ9IHvRgtC10LrRgdGC0LB9LlwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCLQn9C10YDQstCw0Y8g0YHRgtGA0LDQvdC40YbQsCDQvtC/0YDQvtGB0L3QuNC60LAg0Y/QstC70Y/QtdGC0YHRjyDRgdGC0LDRgNGC0L7QstC+0Lkg0YHRgtGA0LDQvdC40YbQtdC5LlwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCLQn9C+0LrQsNC30YvQstCw0YLRjCDQstGB0LUg0Y3Qu9C10LzQtdC90YLRiyDQvdCwINC+0LTQvdC+0Lkg0YHRgtGA0LDQvdC40YbQtVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwi0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INCy0YDQtdC80Y8gKNGB0LXQutGD0L3QtNGLKSwg0YfRgtC+0LHRiyDQt9Cw0L/QvtC70L3QuNGC0Ywg0YHRgtGA0LDQvdC40YbRgyDQvtC/0YDQvtGB0L3QuNC60LBcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCLQn9C+0LrQsNC30YvQstCw0YLRjCDQv9Cw0L3QtdC70Ywg0YLQsNC50LzQtdGA0LBcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwi0J/QvtC60LDQt9GL0LLQsNGC0Ywg0YDQtdC20LjQvCDQv9Cw0L3QtdC70Lgg0YLQsNC50LzQtdGA0LBcIixcblxuICAgIGRlZmF1bHRQYW5lbFZhbHVlOiBcItCX0L3QsNGH0LXQvdC40LUg0L/QsNC90LXQu9C4INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOXCIsXG4gICAgZGVmYXVsdFJvd1ZhbHVlOiBcItCX0L3QsNGH0LXQvdC40LUg0YHRgtGA0L7QutC4INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOXCIsXG4gICAgaGFzTm9uZTogXCLQndC10YIg0L3QuCDQvtC00L3QvtCz0L4g0L/Rg9C90LrRgtCwXCIsXG4gICAgbm9uZVRleHQ6IFwi0KLQtdC60YHRgiDQv9GD0L3QutGC0LAgJ9Cd0LjRh9C10LPQvidcIixcblxuICAgIHRleHQ6IFwi0KLQtdC60YHRglwiXG4gIH1cbn07XG4vL1VuY29tbWVudCB0aGlzIGxpbmUgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlLiBZb3Ugc2hvdWxkIHJlcGxhY2UgXCJlblwiIGFuZCBlblN0cmluZ3Mgd2l0aCB5b3VyIGxvY2FsZSAoXCJmclwiLCBcImRlXCIgYW5kIHNvIG9uKSBhbmQgeW91ciB2YXJpYWJsZS5cbmVkaXRvckxvY2FsaXphdGlvbi5sb2NhbGVzW1wicnVcIl0gPSBydVN0cmluZ3M7XG4iLCJpbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5cbnZhciBzaW1wbGlmaWVkQ2hpbmVzZVRyYW5zbGF0aW9uID0ge1xuICAvLyBzdHJpbmdzIGZvciBzdXJ2ZXkgdGVtcGxhdGVzXG4gIHN1cnZleToge1xuICAgIGVkaXQ6IFwi57yW6L6RXCIsXG4gICAgZXh0ZXJuYWxIZWxwTGluazogXCLmlZnlrablsI/niYdcIixcbiAgICBleHRlcm5hbEhlbHBMaW5rVXJsOiBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2NoYW5uZWwvVUNIMnJ1OW9rSWNvb05aZnBJYnlxNHFRP3ZpZXdfYXM9c3Vic2NyaWJlclwiLFxuICAgIGRyb3BRdWVzdGlvbjogXCLku47lt6bkvqflt6XlhbfnrrHmi5bkuKrpl67pophcIixcbiAgICBjb3B5OiBcIuWkjeWItlwiLFxuICAgIGFkZFRvVG9vbGJveDogXCLmt7vliqDliLDlt6XlhbfnrrFcIixcbiAgICBkZWxldGVQYW5lbDogXCLliKDpmaTpnaLmnb9cIixcbiAgICBkZWxldGVRdWVzdGlvbjogXCLliKDpmaTpopjnm65cIixcbiAgICBjb252ZXJ0VG86IFwi6L2s5Y+Y5Li6XCIsXG4gICAgZHJhZzogXCLmi5bmlL7lhYPku7ZcIlxuICB9LFxuICAvLyBzdHJpbmdzIGZvciBxdWVzdGlvbiB0eXBlc1xuICBxdDoge1xuICBkZWZhdWx0OlxuICAgIFwi6buY6K6kXCIsXG4gICAgY2hlY2tib3g6IFwi5aSa6aG56YCJ5oupXCIsXG4gICAgY29tbWVudDogXCLlpJrooYzmlofmnKxcIixcbiAgICBpbWFnZXBpY2tlcjogXCLpgInlm77niYdcIixcbiAgICBkcm9wZG93bjogXCLkuIvmi4nmoYZcIixcbiAgICBmaWxlOiBcIuaWh+S7tuS4iuS8oFwiLFxuICAgIGh0bWw6IFwiSHRtbCDku6PnoIFcIixcbiAgICBtYXRyaXg6IFwi55+p6Zi1ICjljZXpgInpopgpXCIsXG4gICAgbWF0cml4ZHJvcGRvd246IFwi55+p6Zi1ICjkuIvmi4nmoYYpXCIsXG4gICAgbWF0cml4ZHluYW1pYzogXCLnn6npmLUgKOWKqOaAgemXrumimClcIixcbiAgICBtdWx0aXBsZXRleHQ6IFwi5paH5pys5qGG57uEXCIsXG4gICAgcGFuZWw6IFwi6Z2i5p2/XCIsXG4gICAgcGFuZWxkeW5hbWljOiBcIumdouadvyjliqjmgIEpXCIsXG4gICAgcmFkaW9ncm91cDogXCLljZXpobnpgInmi6lcIixcbiAgICByYXRpbmc6IFwi6K+E5YiGXCIsXG4gICAgdGV4dDogXCLljZXooYzmlofmnKxcIixcbiAgICBib29sZWFuOiBcIumAu+i+kemhuVwiLFxuICAgIGV4cHJlc3Npb246IFwi6KGo6L6+5byPKOWPquivuylcIixcbiAgICBmbG93cGFuZWw6IFwi5rWB6Z2i5p2/XCJcbiAgfSxcbiAgLy8gc3RyaW5ncyBmb3IgZWRpdG9yXG4gIGVkOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCLpu5jorqTor63oqIAgKHswfSlcIixcbiAgICBzdXJ2ZXk6IFwi6LCD5p+l6Zeu5Y23XCIsXG4gICAgc2V0dGluZ3M6IFwi6Zeu5Y236K6+572uXCIsXG4gICAgb3BqZWN0UHJvcGVydGllc0hlYWRlcjogXCLpq5jnuqdcIixcbiAgICBzaG93T2JqZWN0UHJvcGVydGllczogXCLmmL7npLrlsZ7mgKdcIixcbiAgICBoaWRlT2JqZWN0UHJvcGVydGllczogXCLpmpDol4/lsZ7mgKdcIixcbiAgICBlZGl0U3VydmV5OiBcIuS/ruaUuVwiLFxuICAgIGFkZE5ld1BhZ2U6IFwi5re75Yqg5paw6aG16Z2iXCIsXG4gICAgbW92ZVJpZ2h0OiBcIua7muWKqOWIsOWPs+S+p1wiLFxuICAgIG1vdmVMZWZ0OiBcIua7muWKqOWIsOW3puS+p1wiLFxuICAgIGRlbGV0ZVBhZ2U6IFwi5Yig6Zmk6aG16Z2iXCIsXG4gICAgZWRpdFBhZ2U6IFwi57yW6L6R6aG16Z2iXCIsXG4gICAgZWRpdDogXCLnvJbovpFcIixcbiAgICBuZXdQYWdlTmFtZTogXCLpobXpnaJcIixcbiAgICBuZXdRdWVzdGlvbk5hbWU6IFwi6Zeu6aKYXCIsXG4gICAgbmV3UGFuZWxOYW1lOiBcIumdouadv1wiLFxuICAgIG5ld1RleHRJdGVtTmFtZTogXCLmlofmnKxcIixcbiAgICB0ZXN0U3VydmV5OiBcIua1i+ivlemXruWNt1wiLFxuICAgIHRlc3RTdXJ2ZXlBZ2FpbjogXCLlho3mrKHmtYvor5Xpl67ljbdcIixcbiAgICB0ZXN0U3VydmV5V2lkdGg6IFwi6Zeu5Y235a695bqmOiBcIixcbiAgICBlbWJlZFN1cnZleTogXCLlsIbpl67ljbfltYzlhaXnvZHpobVcIixcbiAgICB0cmFuc2xhdGlvbjogXCLovazmjaJcIixcbiAgICBzYXZlU3VydmV5OiBcIuS/neWtmOmXruWNt1wiLFxuICAgIGRlc2lnbmVyOiBcIumXruWNt+iuvuiuoeWZqFwiLFxuICAgIGpzb25FZGl0b3I6IFwiSlNPTiDnvJbovpHlmahcIixcbiAgICB1bmRvOiBcIuaSpOmUgFwiLFxuICAgIHJlZG86IFwi5oGi5aSNXCIsXG4gICAgb3B0aW9uczogXCLpgInpoblcIixcbiAgICBnZW5lcmF0ZVZhbGlkSlNPTjogXCLnlJ/miJAgSlNPTiDmlbDmja5cIixcbiAgICBnZW5lcmF0ZVJlYWRhYmxlSlNPTjogXCLnlJ/miJDmmJPor7vnmoQgSlNPTiDmlbDmja5cIixcbiAgICB0b29sYm94OiBcIuW3peWFt+eusVwiLFxuICAgIHRvb2xib3hHZW5lcmFsQ2F0ZWdvcnk6IFwi5LiA6IisXCIsXG4gICAgZGVsU2VsT2JqZWN0OiBcIuWIoOmZpOaJgOmAieWvueixoVwiLFxuICAgIGVkaXRTZWxPYmplY3Q6IFwi57yW6L6R5omA6YCJ5a+56LGhXCIsXG4gICAgY29ycmVjdEpTT046IFwi6K+35L+u5q2jIEpTT04g5pWw5o2uXCIsXG4gICAgc3VydmV5UmVzdWx0czogXCLpl67ljbfnu5Pmnpw6IFwiLFxuICAgIHN1cnZleVJlc3VsdHNUYWJsZTogXCLooajmoLzlvaLlvI9cIixcbiAgICBzdXJ2ZXlSZXN1bHRzSnNvbjogXCJKU09O5b2i5byPXCIsXG4gICAgcmVzdWx0c1RpdGxlOiBcIumXrumimOagh+mimFwiLFxuICAgIHJlc3VsdHNOYW1lOiBcIumXrumimOWQjeensFwiLFxuICAgIHJlc3VsdHNWYWx1ZTogXCLnrZTmoYjlkI3np7BcIixcbiAgICByZXN1bHRzRGlzcGxheVZhbHVlOiBcIuaYvuekuuetlOahiFwiLFxuICAgIG1vZGlmaWVkOiBcIuW3suS/ruaUuVwiLFxuICAgIHNhdmluZzogXCLkv53lrZjkuK0uLi5cIixcbiAgICBzYXZlZDogXCLlt7Lkv53lrZhcIixcbiAgICBzYXZlRXJyb3I6IFwi6ZSZ6K+v77yM5pyq5L+d5a2YXCIsXG4gICAgdHJhbnNsYXRpb25BZGRMYW5ndWFnZTogXCLor63oqIDpgInmi6lcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxTdHJpbmdzOiBcIuWFqOmDqOWQjeivjVwiLFxuICAgIHRyYW5zbGF0aW9uU2hvd0FsbFBhZ2VzOiBcIuWFqOmDqOmhtemdolwiLFxuICAgIHRyYW5zbGF0aW9uTm9TdHJpbmdzOiBcIuacque/u+ivke+8jOmHjeaWsOmAiVwiLFxuICAgIHRyYW5zbGF0aW9uRXhwb3J0VG9TQ1ZCdXR0b246IFwi5a+85Ye6Q1NWXCIsXG4gICAgdHJhbnNsYXRpb25JbXBvcnRGcm9tU0NWQnV0dG9uOiBcIuWvvOWFpUNTVlwiLFxuICAgIHRyYW5zbGF0aW9uTWVyZ2VMb2NhbGVXaXRoRGVmYXVsdDogXCLlkIzpu5jorqTlkIjlubYgezB9IFwiLFxuICAgIGJvbGQ6IFwi5Yqg57KXXCIsXG4gICAgaXRhbGljOiBcIuaWnOS9k1wiLFxuICAgIHVuZGVybGluZTogXCLkuIvliJLnur9cIixcbiAgICBmcEFkZFF1ZXN0aW9uOiBcIua3u+WKoOmXrumimFwiLFxuICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbkl0ZW1UZXh0OiBcIuaYvuekuiBpZjpcIlxuICB9LFxuICAvL1Byb3BlcnR5IG5hbWVzIGluIHRhYmxlIGhlYWRlcnNcbiAgcGVsOiB7XG4gICAgaXNSZXF1aXJlZDogXCLmmK/lkKbkuLrlv4Xloavpobk/XCJcbiAgfSxcbiAgLy8gc3RyaW5ncyBmb3IgcHJvcGVydHkgZWRpdG9yc1xuICBwZToge1xuICAgIGFwcGx5OiBcIuW6lOeUqFwiLFxuICAgIG9rOiBcIuehruWumlwiLFxuICAgIGNhbmNlbDogXCLlj5bmtohcIixcbiAgICByZXNldDogXCLph43nva5cIixcbiAgICBjbG9zZTogXCLlhbPpl61cIixcbiAgICBkZWxldGU6IFwi5Yig6ZmkXCIsXG4gICAgYWRkTmV3OiBcIuaWsOW7ulwiLFxuICAgIGFkZEl0ZW06IFwi5re75Yqg6aG5Li4uXCIsXG4gICAgYWRkT3RoZXI6IFwi5YW25LuWXCIsXG4gICAgYWRkU2VsZWN0QWxsOiBcIuWFqOmAiVwiLFxuICAgIGFkZE5vbmU6IFwi5pegXCIsXG4gICAgcmVtb3ZlQWxsOiBcIuWFqOmDqOWIoOmZpFwiLFxuICAgIGVkaXQ6IFwi57yW6L6R5ZmoXCIsXG4gICAgaXRlbVZhbHVlRWRpdDogXCJWaXNpYmxlIElmXCIsXG4gICAgZWRpdENob2ljZXM6IFwi57yW6L6R6YCJ6aG5XCIsXG4gICAgbW92ZTogXCLnp7vliqhcIixcbiAgICBlbXB0eTogXCI856m6PlwiLFxuICAgIG5vdEVtcHR5OiBcIjznvJbovpHlgLw+XCIsXG4gICAgZmFzdEVudHJ5OiBcIuW/q+mAn+i+k+WFpVwiLFxuICAgIGZvcm1FbnRyeTogXCLooajljZXovpPlhaVcIixcbiAgICB0ZXN0U2VydmljZTogXCLmtYvor5XmnI3liqFcIixcbiAgICBjb25kaXRpb25TZWxlY3RRdWVzdGlvbjogXCLpgInmi6npl67popguLi5cIixcbiAgICBjb25kaXRpb25WYWx1ZVF1ZXN0aW9uVGl0bGU6IFwi6YCJ5oup5YC8XCIsXG4gICAgY29uZGl0aW9uQnV0dG9uQWRkOiBcIua3u+WKoFwiLFxuICAgIGNvbmRpdGlvbkJ1dHRvblJlcGxhY2U6IFwi5pu/5o2iXCIsXG4gICAgY29uZGl0aW9uSGVscDogXCLor7fovpPlhaXkuIDkuKrluIPlsJTooajovr7lvI/jgILlvZPluIPlsJTlgLzkuLrnnJ/vvIzpl67popgv6aG16Z2i5Y+v6KeB44CC5L6L5aaC77yae3F1ZXN0aW9uMX0gPSAndmFsdWUxJyBvciAoe3F1ZXN0aW9uMn0gKiB7cXVlc3Rpb240fSAgPiAyMCBhbmQge3F1ZXN0aW9uM30gPCA1KVwiLFxuICAgIGV4cHJlc3Npb25IZWxwOiBcIuivt+i+k+WFpeS4gOmhueadoeS7tuWIpOaWreOAguW9k+adoeS7tuWIpOaWreS4uuecn+aXtumXrumimC/pobXpnaLlsIblj6/op4HjgILkvovlpoI6IHtxdWVzdGlvbjF9ID0gJ3ZhbHVlMScgb3IgKHtxdWVzdGlvbjJ9ID0gMyBhbmQge3F1ZXN0aW9uM30gPCA1KVwiLFxuICAgIGFjZUVkaXRvckhlbHA6IFwidHJsK3NwYWNl5YWs5byP6KGl5a6M5o+Q56S6XCIsXG4gICAgYWNlRWRpdG9yUm93VGl0bGU6IFwi5b2T5YmN6KGMXCIsXG4gICAgYWNlRWRpdG9yUGFuZWxUaXRsZTogXCLlvZPliY3pnaLmnb9cIixcbiAgICBzaG93TW9yZTogXCLmm7TlpJrnu4boioLor7fmn6XnnIvmlofmoaNcIixcbiAgICBjb25kaXRpb25TaG93TW9yZVVybDogXCJodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeVBhcmFtZXRlcj9pZD1RdWVzdGlvbsK2bWV0ZXI9dmlzaWJsZUlmXCIsXG4gICAgYXNzaXN0YW50VGl0bGU6IFwiQXZhaWxhYmxlIHF1ZXN0aW9uczpcIixcbiAgICBjZWxsc0VtcHR5Um93c0NvbHVtbnM6IFwi6Iez5bCR5pyJMeihjFwiLFxuICAgIHByb3BlcnR5SXNFbXB0eTogXCLor7fkuLror6XlsZ7mgKforr7lrprkuIDkuKrlgLxcIixcbiAgICB2YWx1ZTogXCLlgLxcIixcbiAgICB0ZXh0OiBcIuaYvuekuuaWh+acrFwiLFxuICAgIHJvd2lkOiBcIuihjOWPt1wiLFxuICAgIGltYWdlTGluazogXCLlm77niYfpk77mjqVcIixcbiAgICBjb2x1bW5FZGl0OiBcIue8lui+keWIlzogezB9XCIsXG4gICAgaXRlbUVkaXQ6IFwi57yW6L6R6YCJ6aG5OiB7MH1cIixcbiAgICB1cmw6IFwiVVJMXCIsXG4gICAgcGF0aDogXCLot6/lvoRcIixcbiAgICB2YWx1ZU5hbWU6IFwi5YC85ZCNXCIsXG4gICAgdGl0bGVOYW1lOiBcIuagh+mimOWQjVwiLFxuICAgIGhhc090aGVyOiBcIuWPr+a3u+WKoOWFtuS7luetlOahiD9cIixcbiAgICBvdGhlclRleHQ6IFwi5YW25LuW562U5qGI5paH5pysXCIsXG4gICAgaGFzTm9uZTogXCLml6BcIixcbiAgICBub25lVGV4dDogXCLml6DmlofmnKxcIixcbiAgICBoYXNTZWxlY3RBbGw6IFwi5pyJ5YWo6YCJ6aG5XCIsXG4gICAgc2VsZWN0QWxsVGV4dDogXCLpgInmi6nlhajpg6jmlofmnKxcIixcbiAgICBjaG9pY2VzTWluOiBcIumAiemhueacgOWwj+WAvFwiLFxuICAgIGNob2ljZXNNYXg6IFwi6YCJ6aG55pyA5aSn5YC8XCIsXG4gICAgY2hvaWNlc1N0ZXA6IFwi6YCJ6aG56Ze06ZqUXCIsXG4gICAgbmFtZTogXCLpopjnm67lkI1cIixcbiAgICB0aXRsZTogXCLpopjnm67mlofmnKxcIixcbiAgICBjZWxsVHlwZTogXCLljZXlhYPmoLznsbvlnotcIixcbiAgICBjb2xDb3VudDogXCLliJfmlbBcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwi6K6+572u6YCJ6aG56aG65bqPXCIsXG4gICAgdmlzaWJsZTogXCLmmK/lkKblj6/op4E/XCIsXG4gICAgaXNSZXF1aXJlZDogXCLmmK/lkKbkuLrlv4Xloavpobk/XCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwi6ZSZ6K+v5paH5a2XXCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCLpl67popjmmK/lkKbmlrDotbfkuIDooYw/XCIsXG4gICAgcm93czogXCLmlofmnKzmoYbooYzmlbBcIixcbiAgICBwbGFjZUhvbGRlcjogXCLljaDkvY3mlofmnKxcIixcbiAgICBzaG93UHJldmlldzogXCLmmK/lkKbmmL7npLrlm77lg4/pooTop4g/XCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIuS7pSBKU09OIOaWh+acrOaWueW8j+WtmOWCqOaWh+S7tlwiLFxuICAgIG1heFNpemU6IFwi5paH5Lu25pyA5aSn5bC65a+4IChCeXRlcylcIixcbiAgICBpbWFnZUhlaWdodDogXCLlm77niYfpq5jluqZcIixcbiAgICBpbWFnZVdpZHRoOiBcIuWbvueJh+WuveW6plwiLFxuICAgIHJvd0NvdW50OiBcIum7mOiupOihjOaVsFwiLFxuICAgIGNvbHVtbkxheW91dDogXCLliJfluIPlsYBcIixcbiAgICBhZGRSb3dMb2NhdGlvbjogXCLmt7vliqDooYzmjInpkq7kvY3nva5cIixcbiAgICBhZGRSb3dUZXh0OiBcIua3u+WKoOadoeebruaMiemSruaWh+acrFwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwi5Yig6Zmk5p2h55uu5oyJ6ZKu5paH5pysXCIsXG4gICAgcmF0ZU1pbjogXCLmnIDlsI/or4TliIZcIixcbiAgICByYXRlTWF4OiBcIuacgOWkp+ivhOWIhlwiLFxuICAgIHJhdGVTdGVwOiBcIuivhOWIhumXtOmalFwiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCLmnIDlsI/lgLzmj5DnpLpcIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwi5pyA5aSn5YC85o+Q56S6XCIsXG4gICAgaW5wdXRUeXBlOiBcIuaWh+acrOahhuexu+Wei1wiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIuS4i+aLieahhuaPkOekuuivrVwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCLpu5jorqTlgLxcIixcbiAgICBjZWxsc0RlZmF1bHRSb3c6IFwiRGVmYXVsdCBjZWxscyB0ZXh0c1wiLFxuICAgIHN1cnZleUVkaXRvclRpdGxlOiBcIumXruWNt+iuvue9rlwiLFxuICAgIHFFZGl0b3JUaXRsZTogXCLnvJbovpHpl67popg6IHswfVwiLFxuICAgIG1heExlbmd0aDogXCLmnIDlpKfplb/luqZcIixcbiAgICBzaG93VGl0bGU6IFwi5pi+56S6L+makOiXjyDmoIfpophcIixcbiAgICBsb2NhbGU6IFwi6buY6K6k6K+t6KiAXCIsXG4gICAgbW9kZTogXCLmqKHlvI8gKOe8lui+kS/lj6ror7spXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwi5riF6Zmk6ZqQ6JeP5YC8XCIsXG4gICAgY29va2llTmFtZTogXCJDb29raWXlkI3vvIzpgb/lhY3lpJrmrKHov5DooYwpXCIsXG4gICAgc2VuZFJlc3VsdE9uUGFnZU5leHQ6IFwi5YiH5o2i6aG15pe25L+d5a2Y57uT5p6cXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwi5YW25LuW5YC85Y2V54us5YKo5a2YXCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwi5pi+56S66aG16Z2i5qCH6aKYXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcIuaYvuekuumhteaVsFwiLFxuICAgIHBhZ2VQcmV2VGV4dDogXCLliY3kuIDpobXmjInpkq7mlofmnKxcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwi5ZCO5LiA6aG15oyJ6ZKu5paH5pysXCIsXG4gICAgY29tcGxldGVUZXh0OiBcIuWujOaIkOaMiemSruaWh+acrFwiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCLlvIDlp4vmjInpkq7mlofmnKxcIixcbiAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IFwi5pi+56S65a+86Iiq5oyJ6ZKuICjpu5jorqTlr7zoiKopXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwi5pi+56S65YmN5LiA6aG15oyJ6ZKuICjnlKjmiLflj6/ov5Tlm57oh7PliY3kuIDpobXpnaIpXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcIuiwg+afpeeahOesrOS4gOmhtemdouS4uui1t+Wni+mhtS5cIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCLnu5PlsL7lsZXnpLrlrozmiJDlkI7nmoTpobXpnaIgKGNvbXBsZXRlZEh0bWwpXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzogXCLlm57nrZTmnKzpobXmiYDmnInpl67popjlkI7vvIzoh6rliqjot7PovazliLDkuIvkuIDpobVcIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwi5pi+56S66L+b5bqm5p2hXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcIumXrumimOeahOagh+mimOS9jee9rlwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCLpl67popjlv4XloavmoIflv5dcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwi6Zeu6aKY6LW35aeL5qCH5b+XICgxLCAyIG9yICdBJywgJ2EnKVwiLFxuICAgIHNob3dRdWVzdGlvbk51bWJlcnM6IFwi5pi+56S66Zeu6aKY57yW5Y+3XCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOiBcIumXrumimOagh+mimOaooeadvywg6buY6K6k5Li6OiAne25vfS4ge3JlcXVpcmV9IHt0aXRsZX0nXCIsXG4gICAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBcIumXrumimOmUmeivr+WumuS9jVwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzogXCLmlLnlj5jpobXpnaLml7bogZrnhKblnKjnrKzkuIDkuKrpl67pophcIixcbiAgICBxdWVzdGlvbnNPcmRlcjogXCLpobXlhoXpl67popjpobrluo9cIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwi5a6M5oiQ6LCD5p+l55qE5pyA6ZW/5pe26Ze0XCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCLlrozmiJDosIPmn6XkuK3pobXpnaLnmoTmnIDplb/ml7bpl7RcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCLmmL7npLrorqHml7blmajpnaLmnb9cIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwi5pi+56S66K6h5pe25Zmo6Z2i5p2/5qih5byPXCIsXG4gICAgcmVuZGVyTW9kZTogXCLmuLLmn5PmqKHlvI9cIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIuWFgeiuuOa3u+WKoOmdouadv1wiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwi5YWB6K645Yig6Zmk6Z2i5p2/XCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcIua3u+WKoOmdouadv+aWh+acrFwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCLliKDpmaTpnaLmnb/mlofmnKxcIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwi5Zyo5LiA5Liq6aG16Z2i5LiK5bGV56S65omA5pyJ5YWD57SgXCIsXG4gICAgaHRtbDogXCJIdG1sXCIsXG4gICAgZXhwcmVzc2lvbjogXCLlhazlvI9cIixcbiAgICBtaW5WYWx1ZTogXCLmnIDlsI/lgLxcIixcbiAgICBtYXhWYWx1ZTogXCLmnIDlpKflgLxcIixcbiAgICBtaW5MZW5ndGg6IFwi5pyA5bCP6ZW/5bqmXCIsXG4gICAgYWxsb3dEaWdpdHM6IFwi5YWB6K6455qE5L2N5pWwXCIsXG4gICAgbWluQ291bnQ6IFwi5pyA5bCP5pWw6YePXCIsXG4gICAgbWF4Q291bnQ6IFwi5pyA5aSn5pWw6YePXCIsXG4gICAgcmVnZXg6IFwi5q2j5YiZ6KGo6L6+5byPXCIsXG4gICAgdG90YWxUZXh0OiBcIuaAu+aWh+acrFwiLFxuICAgIHRvdGFsVHlwZTogXCLmgLvnsbvlnotcIixcbiAgICB0b3RhbEV4cHJlc3Npb246IFwi5oC75YWs5byPXCIsXG4gICAgdG90YWxEaXNwbGF5U3R5bGU6IFwi5oC75pi+56S66aOO5qC8XCIsXG4gICAgdG90YWxDdXJyZW5jeTogXCLmgLtjdXJyZW5jeVwiLFxuICAgIHRvdGFsRm9ybWF0OiBcIuaAu+agvOW8j1wiLFxuICAgIHRhYnM6IHtcbiAgICAgIGdlbmVyYWw6IFwi5LiA6IisXCIsXG4gICAgICBuYXZpZ2F0aW9uOiBcIuWvvOiIqlwiLFxuICAgICAgcXVlc3Rpb246IFwi6Zeu6aKYXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sOiBcIuWujOaIkOWQjueahEh0bWxcIixcbiAgICAgIGxvYWRpbmdIdG1sOiBcIuWKoOi9veS4reeahEh0bWxcIixcbiAgICAgIHRpbWVyOiBcIumXruWNt+iuoeaXtuWZqFwiLFxuICAgICAgdHJpZ2dlcjogXCLop6blj5HlmahcIixcbiAgICAgIGZpbGVPcHRpb25zOiBcIumAiemhuVwiLFxuICAgICAgaHRtbDogXCJIVE1MIOe8lui+keWZqFwiLFxuICAgICAgY29sdW1uczogXCLorr7nva7liJdcIixcbiAgICAgIHJvd3M6IFwi6K6+572u6KGMXCIsXG4gICAgICBjaG9pY2VzOiBcIuiuvue9rumAiemhuVwiLFxuICAgICAgdmlzaWJsZUlmOiBcIuiuvue9ruWPr+ingeadoeS7tlwiLFxuICAgICAgZW5hYmxlSWY6IFwi6K6+572u5pyJ5pWI5p2h5Lu2XCIsXG4gICAgICByYXRlVmFsdWVzOiBcIuiuvue9ruivhOWIhuWAvFwiLFxuICAgICAgY2hvaWNlc0J5VXJsOiBcIumAmui/hyBVUkwg5a+85YWl6YCJ6aG5XCIsXG4gICAgICBtYXRyaXhDaG9pY2VzOiBcIum7mOiupOmAiemhuVwiLFxuICAgICAgbXVsdGlwbGVUZXh0SXRlbXM6IFwi5paH5pys6L6T5YWlXCIsXG4gICAgICB2YWxpZGF0b3JzOiBcIuagoemqjOinhOWImVwiXG4gICAgfSxcbiAgICBlZGl0UHJvcGVydHk6IFwi57yW6L6R5bGe5oCnOiAnezB9J1wiLFxuICAgIGl0ZW1zOiBcIlsg6aG555uu5pWw6YePOiB7MH0gXVwiLFxuICAgIGVudGVyTmV3VmFsdWU6IFwi6K+36K6+5a6a5YC8XCIsXG4gICAgbm9xdWVzdGlvbnM6IFwi6Zeu5Y235Lit6L+Y5rKh5pyJ5Yib5bu65Lu75L2V6Zeu6aKYXCIsXG4gICAgY3JlYXRldHJpZ2dlcjogXCLor7fliJvlu7rop6blj5HlmahcIixcbiAgICB0cmlnZ2VyT246IFwi5b2TIFwiLFxuICAgIHRyaWdnZXJNYWtlUGFnZXNWaXNpYmxlOiBcIuS9v+mhtemdouWPr+ingTpcIixcbiAgICB0cmlnZ2VyTWFrZVF1ZXN0aW9uc1Zpc2libGU6IFwi5L2/6Zeu6aKY5Y+v6KeBOlwiLFxuICAgIHRyaWdnZXJDb21wbGV0ZVRleHQ6IFwi5aaC5p6c5ruh6Laz5p2h5Lu277yM5YiZ5a6M5oiQ6Zeu5Y23XCIsXG4gICAgdHJpZ2dlck5vdFNldDogXCLop6blj5HlmajlsJrmnKrorr7nva5cIixcbiAgICB0cmlnZ2VyUnVuSWY6IFwi5ruh6Laz5LiL5YiX5p2h5Lu25pe25omn6KGMXCIsXG4gICAgdHJpZ2dlclNldFRvTmFtZTogXCLkv67mlLnkuIvliJfpl67popjlgLw6IFwiLFxuICAgIHRyaWdnZXJGcm9tTmFtZTogXCLlpI3liLblgLw6IFwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uOiBcIui/kOihjOWFrOW8jzpcIixcbiAgICB0cmlnZ2VyU2V0VmFsdWU6IFwi5L+u5pS55Li6OiBcIixcbiAgICB0cmlnZ2VySXNWYXJpYWJsZTogXCLlnKjpl67ljbfmj5DkuqTnu5PmnpzkuK3kuI3opoHljIXlkKvor6Xlj5jph49cIlxuICB9LFxuICBwdjoge1xuICAgIHRydWU6IFwi55yfXCIsXG4gICAgZmFsc2U6IFwi5YGHXCIsXG4gICAgaW5oZXJpdDogXCLnu6fmib9cIixcbiAgICBzaG93OiBcIuaYvuekulwiLFxuICAgIGhpZGU6IFwi6ZqQ6JePXCIsXG4gIGRlZmF1bHQ6XG4gICAgXCLpu5jorqRcIixcbiAgICBpbml0aWFsOiBcIuWIneWni+WMllwiLFxuICAgIHJhbmRvbTogXCLpmo/mnLpcIixcbiAgICBjb2xsYXBzZWQ6IFwi5oqY5Y+gXCIsXG4gICAgZXhwYW5kZWQ6IFwi5omp5bGVXCIsXG4gICAgbm9uZTogXCLml6BcIixcbiAgICBhc2M6IFwi5Y2H5bqPXCIsXG4gICAgZGVzYzogXCLpmY3luo9cIixcbiAgICBpbmRldGVybWluYXRlOiBcImluZGV0ZXJtaW5hdGVcIixcbiAgICBkZWNpbWFsOiBcIuaVsOWtl1wiLFxuICAgIGN1cnJlbmN5OiBcIui0p+W4gVwiLFxuICAgIHBlcmNlbnQ6IFwi55m+5YiG5pWwXCIsXG4gICAgZmlyc3RFeHBhbmRlZDogXCJmaXJzdEV4cGFuZGVkXCIsXG4gICAgb2ZmOiBcIuWFs+mXrVwiLFxuICAgIG9uUGFuZWw6IFwi6Z2i5p2/5LiKXCIsXG4gICAgb25TdXJ2ZXk6IFwi6Zeu5Y235LiKXCIsXG4gICAgbGlzdDogXCLliJfooahcIixcbiAgICBwcm9ncmVzc1RvcDogXCJwcm9ncmVzc1RvcFwiLFxuICAgIHByb2dyZXNzQm90dG9tOiBcInByb2dyZXNzQm90dG9tXCIsXG4gICAgcHJvZ3Jlc3NUb3BCb3R0b206IFwicHJvZ3Jlc3NUb3BCb3R0b21cIixcbiAgICBob3Jpem9udGFsOiBcIuawtOW5s1wiLFxuICAgIHZlcnRpY2FsOiBcIuWeguebtFwiLFxuICAgIHRvcDogXCLpobZcIixcbiAgICBib3R0b206IFwi5bqVXCIsXG4gICAgdG9wQm90dG9tOiBcIumhtuWSjOW6lVwiLFxuICAgIGxlZnQ6IFwi5bemXCIsXG4gICAgY29sb3I6IFwi6aKc6ImyXCIsXG4gICAgZGF0ZTogXCLml6XmnJ9cIixcbiAgICBkYXRldGltZTogXCLml7bpl7RcIixcbiAgICBcImRhdGV0aW1lLWxvY2FsXCI6IFwi5pe26Ze05qC85byPXCIsXG4gICAgZW1haWw6IFwiZW1haWxcIixcbiAgICBtb250aDogXCLmnIhcIixcbiAgICBudW1iZXI6IFwi5pWw5a2XXCIsXG4gICAgcGFzc3dvcmQ6IFwi5a+G56CBXCIsXG4gICAgcmFuZ2U6IFwi6IyD5Zu0XCIsXG4gICAgdGVsOiBcIueUteivnVwiLFxuICAgIHRleHQ6IFwidGV4dFwiLFxuICAgIHRpbWU6IFwi5pe26Ze0XCIsXG4gICAgdXJsOiBcInVybFwiLFxuICAgIHdlZWs6IFwi5ZGoXCIsXG4gICAgaGlkZGVuOiBcIumakOiXj1wiLFxuICAgIG9uOiBcIuW8gFwiLFxuICAgIG9uUGFnZTogXCLpobXpnaLkuIpcIixcbiAgICBlZGl0OiBcIue8lui+kVwiLFxuICAgIGRpc3BsYXk6IFwi5LuF5pi+56S6XCIsXG4gICAgb25Db21wbGV0ZTogXCLlrozmiJDml7ZcIixcbiAgICBvbkhpZGRlbjogXCLpmpDol4/kuK1cIixcbiAgICBhbGw6IFwi5YWo6YOoXCIsXG4gICAgcGFnZTogXCLpobVcIixcbiAgICBzdXJ2ZXk6IFwi6Zeu5Y23XCIsXG4gICAgb25OZXh0UGFnZTogXCLkuIvkuIDpobXml7ZcIixcbiAgICBvblZhbHVlQ2hhbmdlZDogXCLlgLzlj5jliqjml7ZcIlxuICB9LFxuICAvLyBzdHJpbmdzIGZvciBvcGVyYXRvcnNcbiAgb3A6IHtcbiAgICBlbXB0eTogXCLkuLrnqbpcIixcbiAgICBub3RlbXB0eTogXCLkuI3kuLrnqbpcIixcbiAgICBlcXVhbDogXCLnrYnkuo5cIixcbiAgICBub3RlcXVhbDogXCLkuI3nrYnkuo5cIixcbiAgICBjb250YWluczogXCLljIXlkKtcIixcbiAgICBub3Rjb250YWluczogXCLkuI3ljIXlkKtcIixcbiAgICBhbnlvZjogXCLku7vmhI9cIixcbiAgICBhbGxvZjogXCLlhajpg6hcIixcbiAgICBncmVhdGVyOiBcIuWkp+S6jlwiLFxuICAgIGxlc3M6IFwi5bCP5LqOXCIsXG4gICAgZ3JlYXRlcm9yZXF1YWw6IFwi5aSn5LqO562J5LqOXCIsXG4gICAgbGVzc29yZXF1YWw6IFwi5bCP5LqO562J5LqOXCJcbiAgfSxcbiAgLy8gc3RyaW5ncyBmb3IgZW1iZWQgd2luZG93XG4gIGV3OiB7XG4gICAgYW5ndWxhcjogXCLkvb/nlKggQW5ndWxhciDml7ZcIixcbiAgICBqcXVlcnk6IFwi5L2/55SoIEpRdWVyeSDml7ZcIixcbiAgICBrbm9ja291dDogXCLkvb/nlKggS25vY2tvdXQg5pe2XCIsXG4gICAgcmVhY3Q6IFwi5L2/55SoIFJlYWN0IOaXtlwiLFxuICAgIHZ1ZTogXCLkvb/nlKggVnVlIOaXtlwiLFxuICAgIGJvb3RzdHJhcDogXCLkvb/nlKggQm9vdHN0cmFwIOaXtlwiLFxuICAgIHN0YW5kYXJkOiBcIuS4jeS9v+eUqCBCb290c3RyYXAg5pe2XCIsXG4gICAgc2hvd09uUGFnZTogXCLltYzlhaXpobXpnaLmmL7npLpcIixcbiAgICBzaG93SW5XaW5kb3c6IFwi5L2/55So5Y2V54us55qE6Zeu5Y2356qX5Y+jXCIsXG4gICAgbG9hZEZyb21TZXJ2ZXI6IFwi5LuO5pyN5Yqh5Zmo5Yqg6L296Zeu5Y23IEpTT04g5pWw5o2uXCIsXG4gICAgdGl0bGVTY3JpcHQ6IFwi6ISa5pys5ZKM5qC35byPXCIsXG4gICAgdGl0bGVIdG1sOiBcIkhUTUxcIixcbiAgICB0aXRsZUphdmFTY3JpcHQ6IFwiSmF2YVNjcmlwdFwiXG4gIH0sXG4gIHRzOiB7XG4gICAgc2VsZWN0UGFnZTogXCLpgInmi6nmtYvor5XpobVcIixcbiAgICBzaG93SW52aXNpYmxlRWxlbWVudHM6IFwi5pi+56S66ZqQ6JeP5YWD5Lu2XCJcbiAgfSxcbiAgdmFsaWRhdG9yczoge1xuICAgIGFuc3dlcmNvdW50dmFsaWRhdG9yOiBcIuaVsOmHj+ajgOafpVwiLFxuICAgIGVtYWlsdmFsaWRhdG9yOiBcIkVtYWlsXCIsXG4gICAgZXhwcmVzc2lvbnZhbGlkYXRvcjogXCLlhazlvI9cIixcbiAgICBudW1lcmljdmFsaWRhdG9yOiBcIuaVsOWtl1wiLFxuICAgIHJlZ2V4dmFsaWRhdG9yOiBcIuato+WImeihqOi+vuW8j1wiLFxuICAgIHRleHR2YWxpZGF0b3I6IFwi5paH5pysXCJcbiAgfSxcbiAgdHJpZ2dlcnM6IHtcbiAgICBjb21wbGV0ZXRyaWdnZXI6IFwi5a6M5oiQ6Zeu5Y23XCIsXG4gICAgc2V0dmFsdWV0cmlnZ2VyOiBcIuiuvue9rumXrumimOWAvFwiLFxuICAgIGNvcHl2YWx1ZXRyaWdnZXI6IFwi5aSN5Yi25YC8XCIsXG4gICAgcnVuZXhwcmVzc2lvbnRyaWdnZXI6IFwi6L+Q6KGM5YWs5byPXCIsXG4gICAgdmlzaWJsZXRyaWdnZXI6IFwi5L+u5pS55Y+v6KeB5oCnXCJcbiAgfSxcbiAgLy8gc3RyaW5ncyBvZiBwcm9wZXJ0aWVzXG4gIHA6IHtcbiAgICBuYW1lOiBcIuWQjeWtl1wiLFxuICAgIHRpdGxlOiB7XG4gICAgICBuYW1lOiBcIuagh+mimFwiLFxuICAgICAgdGl0bGU6IFwi5aaC5p6c5LiO5ZCN5a2X55u45ZCM77yM6K+36K6+572u5Li656m65YC8XCJcbiAgICB9LFxuICAgIG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eTogXCLlr7zoiKrmjInpkq7lj6/op4FcIixcbiAgICBxdWVzdGlvbnNPcmRlcjogXCLpobXpnaLkuK3lhYPntKDnmoTpobrluo9cIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwi5a6M5oiQ6LCD5p+l55qE5pyA6ZW/5pe26Ze0XCIsXG4gICAgdmlzaWJsZTogXCLlj6/op4FcIixcbiAgICB2aXNpYmxlSWY6IFwi5p2h5Lu25Y+v6KeBXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcIumXrumimOeahOagh+mimOS9jee9rlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIuivtOaYjlwiLFxuICAgIHN0YXRlOiBcIueKtuaAgVwiLFxuICAgIGlzUmVxdWlyZWQ6IFwi5b+F6YCJXCIsXG4gICAgcmVxdWlyZWRJZjogXCLmmK/lkKblv4XpgIlcIixcbiAgICBpbmRlbnQ6IFwi57yp6L+bXCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwi5b+F5aGr6ZSZ6K+vXCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCLlhYHorrjpl67popjlnKjmlrDooYxcIixcbiAgICBpbm5lckluZGVudDogXCLnvKnov5tcIixcbiAgICBwYWdlOiBcIuaJgOWcqOmhtemdolwiLFxuICAgIHdpZHRoOiBcIuWuveW6plwiLFxuICAgIGNvbW1lbnRUZXh0OiBcIuWkh+azqOaWh+acrFwiLFxuICAgIHZhbHVlTmFtZTogXCLlgLzlkI1cIixcbiAgICBlbmFibGVJZjogXCLorr7nva7mnInmlYjmnaHku7ZcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwi6buY6K6k5YC8XCIsXG4gICAgY29ycmVjdEFuc3dlcjogXCLmraPnoa7nrZTmoYhcIixcbiAgICByZWFkT25seTogXCLlj6ror7tcIixcbiAgICB2YWxpZGF0b3JzOiBcIuacieaViOaAp1wiLFxuICAgIHRpdGxlTG9jYXRpb246IFwi5qCH6aKY5L2N572uXCIsXG4gICAgaGFzQ29tbWVudDogXCLmnInlpIfms6hcIixcbiAgICBoYXNPdGhlcjogXCLlhYHorrjlhbbku5bnrZTmoYhcIixcbiAgICBjaG9pY2VzOiBcIumAiemhuVwiLFxuICAgIGNob2ljZXNPcmRlcjogXCLpgInpobnmjpLluo9cIixcbiAgICBjaG9pY2VzQnlVcmw6IFwiVXJs6YCJ6aG5XCIsXG4gICAgb3RoZXJUZXh0OiBcIuWFtuS7luetlOahiOaWh+acrFwiLFxuICAgIG90aGVyRXJyb3JUZXh0OiBcIuWFtuS7lumUmeivr1wiLFxuICAgIHN0b3JlT3RoZXJzQXNDb21tZW50OiBcIuWFtuS7luWAvOWNleeLrOWCqOWtmFwiLFxuICAgIGxhYmVsOiBcIuagh+etvlwiLFxuICAgIHNob3dUaXRsZTogXCLmmL7npLov6ZqQ6JePIOagh+mimFwiLFxuICAgIHZhbHVlVHJ1ZTogXCLpgInmmK/nmoTlgLxcIixcbiAgICB2YWx1ZUZhbHNlOiBcIuS4jemAieeahOWAvFwiLFxuICAgIGNvbHM6IFwi5YiXXCIsXG4gICAgcm93czogXCLooYxcIixcbiAgICBwbGFjZUhvbGRlcjogXCLljaDkvY1cIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJvcHRpb25zQ2FwdGlvblwiLFxuICAgIGV4cHJlc3Npb246IFwi5YWs5byPXCIsXG4gICAgZm9ybWF0OiBcIuagvOW8j1wiLFxuICAgIGRpc3BsYXlTdHlsZTogXCLmmL7npLrpo47moLxcIixcbiAgICBjdXJyZW5jeTogXCLotKfluIFcIixcbiAgICB1c2VHcm91cGluZzogXCJ1c2VHcm91cGluZ1wiLFxuICAgIHNob3dQcmV2aWV3OiBcIumihOiniFwiLFxuICAgIGFsbG93TXVsdGlwbGU6IFwi5YWB6K645aSa6YCJXCIsXG4gICAgaW1hZ2VIZWlnaHQ6IFwi5Zu+6auYXCIsXG4gICAgaW1hZ2VXaWR0aDogXCLlm77lrr1cIixcbiAgICBzdG9yZURhdGFBc1RleHQ6IFwi5paH5pys5pa55byP5a2Y5YKo5paH5Lu2XCIsXG4gICAgbWF4U2l6ZTogXCLmnIDlpKflj7dcIixcbiAgICBodG1sOiBcImh0bWxcIixcbiAgICBjb2x1bW5zOiBcImNvbHVtbnNcIixcbiAgICBjZWxsczogXCLljZXlhYNcIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcIuaJgOacieihjOW/heWhq1wiLFxuICAgIGhvcml6b250YWxTY3JvbGw6IFwi5rua5YqoXCIsXG4gICAgY2VsbFR5cGU6IFwi5Y2V5YWD5qC857G75Z6LXCIsXG4gICAgY29sdW1uc0xheW91dDogXCLliJfluIPlsYBcIixcbiAgICBjb2x1bW5Db2xDb3VudDogXCLliJfmlbBcIixcbiAgICBjb2x1bW5NaW5XaWR0aDogXCLliJfmnIDlsI/lrr3luqZcIixcbiAgICByb3dDb3VudDogXCLooYzmlbBcIixcbiAgICBtaW5Sb3dDb3VudDogXCLmnIDlsI/ooYzmlbBcIixcbiAgICBtYXhSb3dDb3VudDogXCLmnIDlpKfooYzmlbBcIixcbiAgICBrZXlOYW1lOiBcIumUruWAvOWQjVwiLFxuICAgIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi6ZSu5YC86YeN5aSNXCIsXG4gICAgY29uZmlybURlbGV0ZTogXCLnoa7orqTliKDpmaRcIixcbiAgICBjb25maXJtRGVsZXRlVGV4dDogXCLnoa7orqTliKDpmaTmlofmnKxcIixcbiAgICBhZGRSb3dMb2NhdGlvbjogXCLmt7vliqDooYzkvY3nva5cIixcbiAgICBhZGRSb3dUZXh0OiBcIua3u+WKoOihjOaWh+acrFwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwi5Yig6Zmk5paH5pysXCIsXG4gICAgaXRlbXM6IFwiaXRlbXNcIixcbiAgICBpdGVtU2l6ZTogXCJpdGVtU2l6ZVwiLFxuICAgIGNvbENvdW50OiBcIuWIl+aVsFwiLFxuICAgIHRlbXBsYXRlVGl0bGU6IFwi5qih5p2/5qCH6aKYXCIsXG4gICAgdGVtcGxhdGVEZXNjcmlwdGlvbjogXCLmqKHmnb/mj4/ov7BcIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIuWFgeiuuOa3u+WKoOmdouadv1wiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwi5YWB6K645Yig6Zmk6Z2i5p2/XCIsXG4gICAgcGFuZWxDb3VudDogXCLpnaLmnb/mlbBcIixcbiAgICBtaW5QYW5lbENvdW50OiBcIuacgOWwj+mdouadv+aVsFwiLFxuICAgIG1heFBhbmVsQ291bnQ6IFwi5pyA5aSn6Z2i5p2/5pWwXCIsXG4gICAgcGFuZWxzU3RhdGU6IFwicGFuZWxzU3RhdGVcIixcbiAgICBwYW5lbEFkZFRleHQ6IFwi5re75Yqg6Z2i5p2/5paH5pysXCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcIuWIoOmZpOmdouadv+aWh+acrFwiLFxuICAgIHBhbmVsUHJldlRleHQ6IFwi5YmN5LiA6aG55paH5a2XXCIsXG4gICAgcGFuZWxOZXh0VGV4dDogXCLkuIvkuIDpobnmloflrZdcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIuaYvuekuumXrumimOe8luWPt1wiLFxuICAgIHNob3dSYW5nZUluUHJvZ3Jlc3M6IFwic2hvd1JhbmdlSW5Qcm9ncmVzc1wiLFxuICAgIHJlbmRlck1vZGU6IFwi5riy5p+T5qih5byPXCIsXG4gICAgdGVtcGxhdGVUaXRsZUxvY2F0aW9uOiBcIuaooeadv+agh+mimOS9jee9rlwiLFxuICAgIHJhdGVWYWx1ZXM6IFwi5omT5YiG5YC8XCIsXG4gICAgcmF0ZU1pbjogXCLmnIDlsI/liIZcIixcbiAgICByYXRlTWF4OiBcIuacgOWkp+WIhlwiLFxuICAgIHJhdGVTdGVwOiBcIuWIhuWAvOmXtOi3nVwiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCLmnIDlsI/liIbmj4/ov7BcIixcbiAgICBtYXhSYXRlRGVzY3JpcHRpb246IFwi5pyA5aSn5YiG5o+P6L+wXCIsXG4gICAgaW5wdXRUeXBlOiBcImlucHV0VHlwZVwiLFxuICAgIHNpemU6IFwic2l6ZVwiLFxuICAgIGxvY2FsZTogXCLpu5jorqTor63oqIBcIixcbiAgICBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWM6IFwi5pS55Y+Y6aG16Z2i5pe26IGa54Sm5Zyo56ys5LiA5Liq6Zeu6aKYXCIsXG4gICAgY29tcGxldGVkSHRtbDogXCLlrozmiJDlkI7nmoRIdG1sXCIsXG4gICAgY29tcGxldGVkQmVmb3JlSHRtbDogXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsXG4gICAgbG9hZGluZ0h0bWw6IFwi5Yqg6L296aG16Z2iXCIsXG4gICAgdHJpZ2dlcnM6IFwi6Kem5Y+R5ZmoXCIsXG4gICAgY29va2llTmFtZTogXCJDb29raWXlkI3vvIzpgb/lhY3lpJrmrKHov5DooYwpXCIsXG4gICAgc2VuZFJlc3VsdE9uUGFnZU5leHQ6IFwi5YiH5o2i6aG15pe25L+d5a2Y57uT5p6cXCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIuaYvuekuuWvvOiIquaMiemSriAo6buY6K6k5a+86IiqKVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcIuaYvuekuuWJjeS4gOmhteaMiemSriAo55So5oi35Y+v6L+U5Zue6Iez5YmN5LiA6aG16Z2iKVwiLFxuICAgIHNob3dQYWdlVGl0bGVzOiBcIuaYvuekuumhtemdouagh+mimFwiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcIue7k+WwvuWxleekuuWujOaIkOWQjueahOmhtemdoiAoY29tcGxldGVkSHRtbClcIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwi5pi+56S66aG15pWwXCIsXG4gICAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBcIumXrumimOmUmeivr+WumuS9jVwiLFxuICAgIHNob3dQcm9ncmVzc0JhcjogXCLmmL7npLrov5vluqbmnaFcIixcbiAgICBtb2RlOiBcIuaooeW8jyAo57yW6L6RL+WPquivuylcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOiBcIuWbnuetlOacrOmhteaJgOaciemXrumimOWQju+8jOiHquWKqOi3s+i9rOWIsOS4i+S4gOmhtVwiLFxuICAgIGNoZWNrRXJyb3JzTW9kZTogXCLmn6XplJnmqKHlvI9cIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCLmuIXpmaTpmpDol4/lgLxcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwi5byA5aeL5oyJ6ZKu5paH5pysXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIuWJjeS4gOmhteaMiemSruaWh+acrFwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCLlkI7kuIDpobXmjInpkq7mlofmnKxcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwi5a6M5oiQ5oyJ6ZKu5paH5pysXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcIumXrumimOW/heWhq+agh+W/l1wiLFxuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogXCLpl67popjotbflp4vmoIflv5cgKDEsIDIgb3IgJ0EnLCAnYScpXCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOiBcIumXrumimOagh+mimOaooeadvywg6buY6K6k5Li6OiAne25vfS4ge3JlcXVpcmV9IHt0aXRsZX0nXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcIuiwg+afpeeahOesrOS4gOmhtemdouS4uui1t+Wni+mhtS5cIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwi5Zyo5LiA5Liq6aG16Z2i5LiK5bGV56S65omA5pyJ5YWD57SgXCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCLlrozmiJDosIPmn6XkuK3pobXpnaLnmoTmnIDplb/ml7bpl7RcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCLmmL7npLrorqHml7blmajpnaLmnb9cIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwi5pi+56S66K6h5pe25Zmo6Z2i5p2/5qih5byPXCIsXG4gICAgZGVmYXVsdFBhbmVsVmFsdWU6IFwi6buY6K6k6Z2i5p2/5YC8XCIsXG4gICAgZGVmYXVsdFJvd1ZhbHVlOiBcIum7mOiupOihjOWAvFwiLFxuICAgIGhhc05vbmU6IFwi6YO95LiN6YCJ6aG5XCIsXG4gICAgbm9uZVRleHQ6IFwi5peg5paH5pysXCIsXG4gICAgdGV4dDogXCLmlofmnKxcIixcbiAgICBkZWZhdWx0VmF1bGU6IFwi6buY6K6k6YCJ6aG5XCIsXG4gICAgXCJzdXJ2ZXlfdGl0bGVcIjoge1xuICAgICAgbmFtZTogXCLmoIfpophcIixcbiAgICAgIHRpdGxlOiBcIumXruWNt+agh+mimOWcqOavj+mhteS4iumDveS8muaYvuekulwiXG4gICAgfSxcbiAgICBcInBhZ2VfdGl0bGVcIjoge1xuICAgICAgbmFtZTogXCLmoIfpophcIixcbiAgICAgIHRpdGxlOiBcIumhtemdouagh+mimFwiXG4gICAgfVxuICB9XG59O1xuXG5cbmVkaXRvckxvY2FsaXphdGlvbi5sb2NhbGVzW1wiemgtY25cIl0gPSBzaW1wbGlmaWVkQ2hpbmVzZVRyYW5zbGF0aW9uO1xuIiwiaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuXG52YXIgc3BhbmlzaFRyYW5zbGF0aW9uID0ge1xuICBzdXJ2ZXk6IHtcbiAgICBlZGl0OiBcIkVkaXRhclwiLFxuICAgIGV4dGVybmFsSGVscExpbms6IFwiTWlyYSB5IGFwcmVuZGUgYSBjcmVhciBlbmN1ZXN0YXNcIixcbiAgICBleHRlcm5hbEhlbHBMaW5rVXJsOlxuICAgICAgXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDSDJydTlva0ljb29OWmZwSWJ5cTRxUT92aWV3X2FzPXN1YnNjcmliZXJcIixcbiAgICBkcm9wUXVlc3Rpb246XG4gICAgICBcIsKhQXJyYXN0cmEgdW4gdGlwbyBkZSBwcmVndW50YSBwYXJhIGVtcGV6YXIgYSBkaXNlw7FhciB0dSBlbmN1ZXN0YSFcIixcbiAgICBhZGRMb2dpY0l0ZW06IFwiQ3JlZSB1bmEgcmVnbGEgcGFyYSBwZXJzb25hbGl6YXIgZWwgZmx1am8gZGUgbGEgZW5jdWVzdGFcIixcbiAgICBjb3B5OiBcIkNvcGlhclwiLFxuICAgIGR1cGxpY2F0ZTogXCJEdXBsaWNhclwiLFxuICAgIGFkZFRvVG9vbGJveDogXCJBw7FhZGlyIGEgbGEgY2FqYSBkZSBoZXJyYW1pZW50YXNcIixcbiAgICBkZWxldGVQYW5lbDogXCJFbGltaW5hciBwYW5lbFwiLFxuICAgIGRlbGV0ZVF1ZXN0aW9uOiBcIkVsaW1pbmFyIHByZWd1bnRhXCIsXG4gICAgY29udmVydFRvOiBcIkNvbnZlcnRpciBhXCIsXG4gICAgZHJhZzogXCJFbGVtZW50byBkZSBhcnJhc3RyZVwiLFxuICB9LFxuICBxdDoge1xuICAgIGRlZmF1bHQ6IFwiRGVmZWN0b1wiLFxuICAgIGNoZWNrYm94OiBcIkNhamFcIixcbiAgICBjb21tZW50OiBcIkNvbWVudGFyaW9cIixcbiAgICBpbWFnZXBpY2tlcjogXCJTZWxlY3RvciBkZSBpbcOhZ2VuZXNcIixcbiAgICByYW5raW5nOiBcIlJhbmtpbmdcIixcbiAgICBpbWFnZTogXCJJbWFnZW5cIixcbiAgICBkcm9wZG93bjogXCJEZXNwbGVnYWJsZVwiLFxuICAgIGZpbGU6IFwiQXJjaGl2b1wiLFxuICAgIGh0bWw6IFwiSHRtbFwiLFxuICAgIG1hdHJpeDogXCJNYXRyaXogKHNlbGVjY2nDs24gw7puaWNhKVwiLFxuICAgIG1hdHJpeGRyb3Bkb3duOiBcIk1hdHJpeiAob3BjacOzbiBtw7psdGlwbGUpXCIsXG4gICAgbWF0cml4ZHluYW1pYzogXCJNYXRyaXogKGZpbGFzIGRpbsOhbWljYXMpXCIsXG4gICAgbXVsdGlwbGV0ZXh0OiBcIk3Dumx0aXBsZXMgdGV4dG9zXCIsXG4gICAgcGFuZWw6IFwiUGFuZWxcIixcbiAgICBwYW5lbGR5bmFtaWM6IFwiUGFuZWwgKHBhbmVsZXMgZGluw6FtaWNvcylcIixcbiAgICByYWRpb2dyb3VwOiBcIkdydXBvIGRlIHJhZGlvXCIsXG4gICAgcmF0aW5nOiBcIkNsYXNpZmljYWNpw7NuXCIsXG4gICAgdGV4dDogXCJFbnRyYWRhIMO6bmljYVwiLFxuICAgIGJvb2xlYW46IFwiQm9vbGVhbm9cIixcbiAgICBleHByZXNzaW9uOiBcIkV4cHJlc2nDs24gKHNvbG8gbGVjdHVyYSlcIixcbiAgICBzaWduYXR1cmVwYWQ6IFwiQWxtb2hhZGlsbGEgZGUgZmlybWFcIixcbiAgICBmbG93cGFuZWw6IFwiUGFuZWwgZGUgZmx1am9cIixcbiAgfSxcbiAgZWQ6IHtcbiAgICBkZWZhdWx0TG9jYWxlOiBcIlByZWRldGVybWluYWRvICh7MH0pXCIsXG4gICAgc3VydmV5OiBcIkVuY3Vlc3RhXCIsXG4gICAgc2V0dGluZ3M6IFwiQ29uZmlndXJhY2nDs24gZGUgbGEgZW5jdWVzdGFcIixcbiAgICBzZXR0aW5nc1Rvb2x0aXA6IFwiQ29uZmlndXJhY2nDs24gZGUgZW5jdWVzdGEgYWJpZXJ0YVwiLFxuICAgIG9wamVjdFByb3BlcnRpZXNIZWFkZXI6IFwiQXZhbnphZGFcIixcbiAgICBzaG93T2JqZWN0UHJvcGVydGllczogXCJNb3N0cmFyIHByb3BpZWRhZGVzIGRlbCBvYmpldG9cIixcbiAgICBoaWRlT2JqZWN0UHJvcGVydGllczogXCJPY3VsdGFyIHByb3BpZWRhZGVzIGRlIG9iamV0b3NcIixcbiAgICBzaG93UGFuZWw6IFwiTW9zdHJhciBwYW5lbFwiLFxuICAgIGhpZGVQYW5lbDogXCJPY3VsdGFyIHBhbmVsXCIsXG4gICAgZWRpdFN1cnZleTogXCJFZGl0YXIgZW5jdWVzdGFcIixcbiAgICBhZGROZXdQYWdlOiBcIkHDsWFkaXIgbnVldmEgcMOhZ2luYVwiLFxuICAgIG1vdmVSaWdodDogXCJEZXNwbMOhY2VzZSBhIGxhIGRlcmVjaGFcIixcbiAgICBtb3ZlTGVmdDogXCJEZXNwbMOhY2VzZSBhIGxhIGl6cXVpZXJkYVwiLFxuICAgIGRlbGV0ZVBhZ2U6IFwiRWxpbWluYXIgcMOhZ2luYVwiLFxuICAgIGVkaXRQYWdlOiBcIkVkaXRhciBww6FnaW5hXCIsXG4gICAgZWRpdDogXCJFZGl0YXJcIixcbiAgICBuZXdQYWdlTmFtZTogXCJQw6FnaW5hXCIsXG4gICAgbmV3UXVlc3Rpb25OYW1lOiBcIlByZWd1bnRhXCIsXG4gICAgbmV3UGFuZWxOYW1lOiBcIlBhbmVsXCIsXG4gICAgbmV3VGV4dEl0ZW1OYW1lOiBcIlRleHRvXCIsXG4gICAgdGVzdFN1cnZleTogXCJFbmN1ZXN0YSBkZSBwcnVlYmFcIixcbiAgICB0ZXN0U3VydmV5QWdhaW46IFwiRW5jdWVzdGEgZGUgcHJ1ZWJhIGRlIG51ZXZvXCIsXG4gICAgdGVzdFN1cnZleVdpZHRoOiBcIkFuY2hvIGRlIGxhIGVuY3Vlc3RhOlwiLFxuICAgIG5hdmlnYXRlVG9Nc2c6IFwiVHV2aXN0ZSBxdWUgbmF2ZWdhciBhOlwiLFxuICAgIGxvZ2ljOiBcIkzDs2dpY2EgZGUgbGEgZW5jdWVzdGFcIixcbiAgICBlbWJlZFN1cnZleTogXCJJbmNydXN0YXIgbGEgZW5jdWVzdGFcIixcbiAgICB0cmFuc2xhdGlvbjogXCJUcmFkdWNjacOzblwiLFxuICAgIHNhdmVTdXJ2ZXk6IFwiR3VhcmRhciBsYSBlbmN1ZXN0YVwiLFxuICAgIHNhdmVTdXJ2ZXlUb29sdGlwOiBcIkd1YXJkYXIgbGEgZW5jdWVzdGFcIixcbiAgICBkZXNpZ25lcjogXCJEaXNlw7FhZG9yIGRlIGxhIGVuY3Vlc3RhXCIsXG4gICAganNvbkVkaXRvcjogXCJFZGl0b3IgZGUgSlNPTlwiLFxuICAgIHVuZG86IFwiRGVzaGFjZXJcIixcbiAgICByZWRvOiBcIlJlaGFjZXJcIixcbiAgICB1bmRvVG9vbHRpcDogXCJEZXNoYWNlciBlbCDDumx0aW1vIGNhbWJpb1wiLFxuICAgIHJlZG9Ub29sdGlwOiBcIlJlaGFjZXIgZWwgY2FtYmlvXCIsXG4gICAgY29weTogXCJDb3BpYXJcIixcbiAgICBjdXQ6IFwiQ29ydGFyXCIsXG4gICAgcGFzdGU6IFwiUGVnYXJcIixcbiAgICBjb3B5VG9vbHRpcDogXCJDb3BpYSBzZWxlY2Npw7NuIGFsIHBvcnRhcGFwZWxlc1wiLFxuICAgIGN1dFRvb2x0aXA6IFwiQ29ydGEgbGEgc2VsZWNjacOzbiBhbCBwb3J0YXBhcGVsZXNcIixcbiAgICBwYXN0ZVRvb2x0aXA6IFwiUGVnYSBkZSBwb3J0YXBhcGVsZXNcIixcbiAgICBvcHRpb25zOiBcIk9wY2lvbmVzXCIsXG4gICAgZ2VuZXJhdGVWYWxpZEpTT046IFwiR2VuZXJhciB1biBKU09OIHbDoWxpZG9cIixcbiAgICBnZW5lcmF0ZVJlYWRhYmxlSlNPTjogXCJHZW5lcmFyIEpTT04gbGVnaWJsZVwiLFxuICAgIHRvb2xib3g6IFwiQ2FqYSBkZSBoZXJyYW1pZW50YXNcIixcbiAgICBcInByb3BlcnR5LWdyaWRcIjogXCJQcm9waWVkYWRlc1wiLFxuICAgIHRvb2xib3hHZW5lcmFsQ2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgIGRlbFNlbE9iamVjdDogXCJFbGltaW5hciBvYmpldG8gc2VsZWNjaW9uYWRvXCIsXG4gICAgZWRpdFNlbE9iamVjdDogXCJFZGl0YXIgb2JqZXRvIHNlbGVjY2lvbmFkb1wiLFxuICAgIGNvcnJlY3RKU09OOiBcIlBvciBmYXZvciwgY29ycmlqYSBKU09OXCIsXG4gICAgc3VydmV5UmVzdWx0czogXCJSZXN1bHRhZG8gZGUgbGEgZW5jdWVzdGE6XCIsXG4gICAgc3VydmV5UmVzdWx0c1RhYmxlOiBcIkNvbW8gbWVzYVwiLFxuICAgIHN1cnZleVJlc3VsdHNKc29uOiBcIkNvbW8gSlNPTlwiLFxuICAgIHJlc3VsdHNUaXRsZTogXCJUw610dWxvIGRlIGxhIHByZWd1bnRhXCIsXG4gICAgcmVzdWx0c05hbWU6IFwiTm9tYnJlIGRlIGxhIHByZWd1bnRhXCIsXG4gICAgcmVzdWx0c1ZhbHVlOiBcIlZhbG9yIGRlIHJlc3B1ZXN0YVwiLFxuICAgIHJlc3VsdHNEaXNwbGF5VmFsdWU6IFwiVmFsb3IgZGUgdmlzdWFsaXphY2nDs25cIixcbiAgICBtb2RpZmllZDogXCJNb2RpZmljYWRhXCIsXG4gICAgc2F2aW5nOiBcIkFob3Jyb1wiLFxuICAgIHNhdmVkOiBcIlNhbHZhZG9cIixcbiAgICBwcm9wZXJ0eUVkaXRvckVycm9yOiBcImVycm9yOlwiLFxuICAgIHNhdmVFcnJvcjogXCLCoUVycm9yIUVsIGNvbnRlbmlkbyBkZWwgZWRpdG9yIG5vIHNlIGhhIGd1YXJkYWRvXCIsXG4gICAgdHJhbnNsYXRpb25BZGRMYW5ndWFnZTogXCJTZWxlY2Npb25lIGVsIGlkaW9tYSBwYXJhIHRyYWR1Y2lyXCIsXG4gICAgdHJhbnNsYXRpb25TaG93QWxsU3RyaW5nczogXCJNb3N0cmFyIHRvZG9zIGxvcyB0ZXh0b3NcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxQYWdlczogXCJNb3N0cmFyIHRvZGFzIGxhcyBww6FnaW5hc1wiLFxuICAgIHRyYW5zbGF0aW9uTm9TdHJpbmdzOlxuICAgICAgXCJTaW4gY3VlcmRhcyBwYXJhIHRyYWR1Y2lyLiBQb3IgZmF2b3IsIGNhbWJpZSBlbCBmaWx0cm9cIixcbiAgICB0cmFuc2xhdGlvbkV4cG9ydFRvU0NWQnV0dG9uOiBcIkV4cG9ydGFyIGEgQ1NWXCIsXG4gICAgdHJhbnNsYXRpb25JbXBvcnRGcm9tU0NWQnV0dG9uOiBcIkltcG9ydGFjacOzbiBkZSBDU1ZcIixcbiAgICB0cmFuc2xhdGlvbk1lcmdlTG9jYWxlV2l0aERlZmF1bHQ6IFwiTWVyZ2UgezB9IGNvbiBsdWdhciBwcmVkZXRlcm1pbmFkb1wiLFxuICAgIGJvbGQ6IFwiTmVncml0YVwiLFxuICAgIGl0YWxpYzogXCJJdMOhbGljYVwiLFxuICAgIHVuZGVybGluZTogXCJTdWJyYXlhclwiLFxuICAgIGZwQWRkUXVlc3Rpb246IFwiQcOxYWRpciBwcmVndW50YSAuLi5cIixcbiAgICBzZWxlY3RQYWdlOiBcIlNlbGVjY2lvbmFyIHDDoWdpbmEgLi4uXCIsXG4gICAgY2hvb3NlRWxlbWVudDogXCJFbGlnZSBlbCBlbGVtZW50byAuLi5cIixcbiAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25JdGVtVGV4dDogXCJNb3N0cmFyIHNpOlwiLFxuICAgIGxnOiB7XG4gICAgICBhZGROZXdJdGVtOiBcIlwiLFxuICAgICAgcGFnZV92aXNpYmlsaXR5TmFtZTogXCJWaXNpYmlsaWRhZCBkZSBsYSBwYWdpbmFcIixcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlOYW1lOiBcIlZpc2liaWxpZGFkIGRlbCBwYW5lbFwiLFxuICAgICAgcGFuZWxfZW5hYmxlTmFtZTogXCJQYW5lbCBoYWJpbGl0YXIgLyBkZXNoYWJpbGl0YXJcIixcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlOYW1lOiBcIlByZWd1bnRhIHZpc2liaWxpZGFkXCIsXG4gICAgICBxdWVzdGlvbl9lbmFibGVOYW1lOiBcIlByZWd1bnRhIGhhYmlsaXRhciAvIGRlc2hhYmlsaXRhclwiLFxuICAgICAgcXVlc3Rpb25fcmVxdWlyZU5hbWU6IFwiUHJlZ3VudGEgb3BjaW9uYWwgcmVxdWVyaWRhXCIsXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlTmFtZTogXCJFbmN1ZXN0YSBjb21wbGV0YVwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZU5hbWU6IFwiRXN0YWJsZWNlciB2YWxvciBkZSBsYSBwcmVndW50YVwiLFxuICAgICAgdHJpZ2dlcl9jb3B5dmFsdWVOYW1lOiBcIkNvcGlhciB2YWxvciBkZSBsYSBwcmVndW50YVwiLFxuICAgICAgdHJpZ2dlcl9za2lwTmFtZTogXCJTYWx0YXIgYSBsYSBwcmVndW50YVwiLFxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uTmFtZTogXCJFamVjdXRhciBsYSBleHByZXNpw7NuIHBlcnNvbmFsaXphZGFcIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbk5hbWU6IFwiUGVyc29uYWxpemFkbyAnZ3JhY2lhcyBww6FnaW5hJyB0ZXh0b1wiLFxuICAgICAgcGFnZV92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiSGFnYSBxdWUgbGEgcMOhZ2luYSBzZWEgdmlzaWJsZSBjdWFuZG8gbGEgZXhwcmVzacOzbiBsw7NnaWNhIHZ1ZWx2YSB2ZXJkYWRlcmEuIERlIGxvIGNvbnRyYXJpbywgbWFudMOpbmdhbG8gaW52aXNpYmxlXCIsXG4gICAgICBwYW5lbF92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwiSGFnYSBxdWUgZWwgcGFuZWwgc2VhIHZpc2libGUgY3VhbmRvIGxhIGV4cHJlc2nDs24gbMOzZ2ljYSB2dWVsdmEgdmVyZGFkZXJhLiBEZSBsbyBjb250cmFyaW8sIG1hbnTDqW5nYWxvIGludmlzaWJsZVwiLFxuICAgICAgcGFuZWxfZW5hYmxlRGVzY3JpcHRpb246XG4gICAgICAgIFwiSGFnYSBlbCBwYW5lbCwgeSB0b2RvcyBsb3MgZWxlbWVudG9zIGRlbnRybyBkZSDDqWwsIGhhYmlsaXRlbiBjdWFuZG8gbGEgZXhwcmVzacOzbiBsw7NnaWNhIGRldnVlbHZlIHZlcmRhZGVyYS5EZSBsbyBjb250cmFyaW8sIG1hbnTDqW5nYWxvcyBkaXNjYXBhY2l0YWRvc1wiLFxuICAgICAgcXVlc3Rpb25fdmlzaWJpbGl0eURlc2NyaXB0aW9uOlxuICAgICAgICBcIkhheiBxdWUgbGEgcHJlZ3VudGEgc2VhIHZpc2libGUgY3VhbmRvIGxhIGV4cHJlc2nDs24gbMOzZ2ljYSBzZSBkZXZ1ZWx2ZSBWRVJEQURFUkEuRGUgbG8gY29udHJhcmlvLCBtYW50w6luZ2FsbyBpbnZpc2libGVcIixcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZURlc2NyaXB0aW9uOlxuICAgICAgICBcIkhheiBxdWUgbGEgcHJlZ3VudGEgcGVybWl0aWVyYSBoYWJpbGl0YXIgY3VhbmRvIGxhIGV4cHJlc2nDs24gbMOzZ2ljYSBkZXZ1ZWx2ZSB2ZXJkYWRlcmEuRGUgbG8gY29udHJhcmlvLCBtYW50w6luZ2FsbyBkZXNoYWJpbGl0YWRvXCIsXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlRGVzY3JpcHRpb246XG4gICAgICAgIFwiTGEgcHJlZ3VudGEgc2UgcmVxdWllcmUgY3VhbmRvIGxhIGV4cHJlc2nDs24gbMOzZ2ljYSBzZSBkZXZ1ZWx2ZSBWRVJEQURFUkFcIixcbiAgICAgIHRyaWdnZXJfY29tcGxldGVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJDdWFuZG8gbGEgZXhwcmVzacOzbiBsw7NnaWNhIGRldnVlbHZlIHZlcmRhZGVyYSwgZW50b25jZXMgbGEgZW5jdWVzdGEgc2UgY29tcGxldGEgeSB1biB1c3VhcmlvIGZpbmFsIHZlYSBsYSAnUMOhZ2luYSBkZSBncmFjaWFzJ1wiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIkN1YW5kbyBzZSBjYW1iaWFuIGxvcyB2YWxvcmVzIGRlIHByZWd1bnRhcywgcXVlIHNlIHVzYW4gZW4gbGEgZXhwcmVzacOzbiBsw7NnaWNhLCBzZSBjYW1iaWFuIHkgbGEgZXhwcmVzacOzbiBsw7NnaWNhIGRldnVlbHZlIFZFUkRBREVSTywgZW50b25jZXMgZWwgdmFsb3Igc2UgZXN0YWJsZWNlIGVuIGxhIHByZWd1bnRhIHNlbGVjY2lvbmFkYVwiLFxuICAgICAgdHJpZ2dlcl9jb3B5dmFsdWVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJDdWFuZG8gc2UgY2FtYmlhbiBsb3MgdmFsb3JlcyBkZSBsYXMgcHJlZ3VudGFzLCBxdWUgc2UgdXNhbiBlbiBsYSBleHByZXNpw7NuIGzDs2dpY2EsIHNlIGNhbWJpYW4geSBsYSBleHByZXNpw7NuIGzDs2dpY2EgZGV2dWVsdmUgdmVyZGFkZXJhLCBlbnRvbmNlcyBlbCB2YWxvciBkZSB1bmEgcHJlZ3VudGEgc2VsZWNjaW9uYWRhIHNlIGNvcGlhIGEgb3RyYSBwcmVndW50YSBzZWxlY2Npb25hZGFcIixcbiAgICAgIHRyaWdnZXJfc2tpcERlc2NyaXB0aW9uOlxuICAgICAgICBcIkN1YW5kbyBsYSBleHByZXNpw7NuIGzDs2dpY2EgZGV2dWVsdmUgdmVyZGFkZXJhLCBsYSBlbmN1ZXN0YSBzZSBzYWx0ZSBhIC8gZW5mb2NhIGxhIHByZWd1bnRhIHNlbGVjY2lvbmFkYVwiLFxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uRGVzY3JpcHRpb246XG4gICAgICAgIFwiQ3VhbmRvIGxhIGV4cHJlc2nDs24gbMOzZ2ljYSBkZXZ1ZWx2ZSB2ZXJkYWRlcmEsIGVudG9uY2VzIHNlIHJlYWxpemEgbGEgZXhwcmVzacOzbiBwZXJzb25hbGl6YWRhLkVzIHBvc2libGUgcXVlIG9wY2lvbmFsbWVudGUgZXN0YWJsZXpjYSBlc3RlIHJlc3VsdGFkbyBkZSBleHByZXNpw7NuIGVuIGxhIHByZWd1bnRhIHNlbGVjY2lvbmFkYVwiLFxuICAgICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uRGVzY3JpcHRpb246XG4gICAgICAgIFwiU2kgbGEgZXhwcmVzacOzbiBsw7NnaWNhIGRldnVlbHZlIHZlcmRhZGVyYSwgZW50b25jZXMgZWwgdGV4dG8gcHJlZGV0ZXJtaW5hZG8gcGFyYSBsYSAncMOhZ2luYSBkZSBhZ3JhZGVjaW1pZW50bycgc2UgY2FtYmlhIGFsIHVubyBkYWRvXCIsXG4gICAgICBpdGVtRXhwcmVzc2lvblRleHQ6IFwiQ3VhbmRvIGxhIGV4cHJlc2nDs246ICd7MH0nIGRldnVlbHZlIFZFUkRBREVSTzpcIixcbiAgICAgIHBhZ2VfdmlzaWJpbGl0eVRleHQ6IFwiSGFjZXIgbGEgcMOhZ2luYSB7MH0gVmlzaWJsZVwiLFxuICAgICAgcGFuZWxfdmlzaWJpbGl0eVRleHQ6IFwiSGFjZXIgcGFuZWwgezB9IHZpc2libGVcIixcbiAgICAgIHBhbmVsX2VuYWJsZVRleHQ6IFwiSGFjZXIgcGFuZWwgezB9IGhhYmlsaXRhclwiLFxuICAgICAgcXVlc3Rpb25fdmlzaWJpbGl0eVRleHQ6IFwiSGFjZXIgUHJlZ3VudGEgezB9IFZpc2libGVcIixcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZVRleHQ6IFwiSGFjZXIgUHJlZ3VudGEgezB9IEhhYmlsaXRhclwiLFxuICAgICAgcXVlc3Rpb25fcmVxdWlyZVRleHQ6IFwiSGFjZXIgbGEgcHJlZ3VudGEgezB9IHJlcXVlcmlkYVwiLFxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZVRleHQ6IFwiTGEgZW5jdWVzdGEgc2UgY29tcGxldGFcIixcbiAgICAgIHRyaWdnZXJfc2V0dmFsdWVUZXh0OiBcIkVuIGN1ZXN0acOzbjogezB9IHZhbG9yIHsxfVwiLFxuICAgICAgdHJpZ2dlcl9jb3B5dmFsdWVUZXh0OiBcIkNvcGlhciBlbiBjdWVzdGnDs246IHswfSB2YWxvciBkZSBsYSBwcmVndW50YSB7MX1cIixcbiAgICAgIHRyaWdnZXJfc2tpcFRleHQ6IFwiRW5jdWVzdGEgc2FsdGEgYSBsYSBwcmVndW50YSB7MH1cIixcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvblRleHQxOiBcIkV4cHJlc2nDs24gZGUgZWplY3VjacOzbjogJ3swfSdcIixcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvblRleHQyOiBcInkgZXN0YWJsZWNlciBzdSByZXN1bHRhZG8gZW4gY3Vlc3Rpw7NuOiB7MH1cIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvblRleHQ6XG4gICAgICAgIFwiTW9zdHJhciB0ZXh0byBwZXJzb25hbGl6YWRvIHBhcmEgbGEgJ2dyYWNpYXMgcMOhZ2luYSdcIixcbiAgICAgIGNvbmRpdGlvbnM6IFwiQ29uZGljacOzbiAocylcIixcbiAgICAgIGFjdGlvbnM6IFwiQ29tcG9ydGFtaWVudG8pXCIsXG4gICAgICBleHByZXNzaW9uRWRpdG9yVGl0bGU6IFwiRGVmaW5pciBsYSAocykgY29uZGljacOzbiAocylcIixcbiAgICAgIGFjdGlvbnNFZGl0b3JUaXRsZTogXCJEZWZpbmlyIGxhIChzKSBhY2Npw7NuIChzKVwiLFxuICAgICAgZGVsZXRlQWN0aW9uOiBcIkVsaW1pbmFyIGFjY2nDs25cIixcbiAgICAgIGFkZE5ld0FjdGlvbjogXCJBw7FhZGlyIG51ZXZhIGFjY2nDs25cIixcbiAgICAgIHNlbGVjdGVkQWN0aW9uQ2FwdGlvbjogXCJTZWxlY2Npb25lIHVuYSBhY2Npw7NuIHBhcmEgYWdyZWdhciAuLi5cIixcbiAgICAgIGV4cHJlc3Npb25JbnZhbGlkOlxuICAgICAgICBcIkxhIGV4cHJlc2nDs24gbMOzZ2ljYSBlc3TDoSB2YWPDrWEgbyBpbnbDoWxpZGEuUG9yIGZhdm9yIGNvcnLDrWphbG9cIixcbiAgICAgIG5vQWN0aW9uRXJyb3I6IFwiUG9yIGZhdm9yLCBhZ3JlZ3VlIGFsIG1lbm9zIHVuYSBhY2Npw7NuXCIsXG4gICAgICBhY3Rpb25JbnZhbGlkOiBcIlBvciBmYXZvciwgc29sdWNpb25lIHByb2JsZW1hcyBlbiBzdSAocykgYWNjacOzbiAocylcIixcbiAgICAgIGV4cHJlc3Npb25TZXR1cDogXCJcIixcbiAgICAgIGFjdGlvbnNTZXR1cDogXCIgXCIsXG4gICAgfSxcbiAgfSxcbiAgcGVsOiB7XG4gICAgaXNSZXF1aXJlZDogXCLCv1JlcXVlcmlkYT9cIixcbiAgfSxcbiAgcGU6IHtcbiAgICBhcHBseTogXCJTb2xpY2l0YXJcIixcbiAgICBvazogXCJva1wiLFxuICAgIHNhdmU6IFwiQWhvcnJhclwiLFxuICAgIHNhdmVUb29sdGlwOiBcIkFob3JyYXJcIixcbiAgICBjYW5jZWw6IFwiQ2FuY2VsYXJcIixcbiAgICByZXNldDogXCJSZWluaWNpYXJcIixcbiAgICByZWZyZXNoOiBcIkFjdHVhbGl6YXJcIixcbiAgICBjbG9zZTogXCJDZXJjYVwiLFxuICAgIGRlbGV0ZTogXCJCb3JyYXJcIixcbiAgICBhZGQ6IFwiQWdyZWdhclwiLFxuICAgIGFkZE5ldzogXCJBw7FhZGlyIG51ZXZvXCIsXG4gICAgYWRkSXRlbTogXCJIYWdhIGNsaWMgcGFyYSBhZ3JlZ2FyIHVuIGFydMOtY3VsbyAuLi5cIixcbiAgICBhZGRPdGhlcjogXCJPdHJhXCIsXG4gICAgYWRkU2VsZWN0QWxsOiBcIlNlbGVjY2lvbmFyIHRvZG9cIixcbiAgICBhZGROb25lOiBcIk5pbmd1bmFcIixcbiAgICByZW1vdmVBbGw6IFwiRWxpbWluYXIgdG9kb1wiLFxuICAgIGVkaXQ6IFwiRWRpdGFyXCIsXG4gICAgYmFjazogXCJWb2x2ZXIgc2luIGd1YXJkYXJcIixcbiAgICBiYWNrVG9vbHRpcDogXCJWb2x2ZXIgc2luIGd1YXJkYXJcIixcbiAgICBzYXZlQW5kQmFjazogXCJHdWFyZGFyIHkgdm9sdmVyXCIsXG4gICAgc2F2ZUFuZEJhY2tUb29sdGlwOiBcIkd1YXJkYXIgeSB2b2x2ZXJcIixcbiAgICBpdGVtVmFsdWVFZGl0OiBcIlZpc2libGUgc2lcIixcbiAgICBlZGl0Q2hvaWNlczogXCJFZGl0YXIgb3BjaW9uZXNcIixcbiAgICBzaG93Q2hvaWNlczogXCJNb3N0cmFyIG9wY2lvbmVzXCIsXG4gICAgbW92ZTogXCJNb3ZlcnNlXCIsXG4gICAgZW1wdHk6IFwiPHZhY2lhcj5cIixcbiAgICBub3RFbXB0eTogXCI8RWRpdGFyIHZhbG9yPlwiLFxuICAgIGZhc3RFbnRyeTogXCJFbnRyYWRhIHLDoXBpZGFcIixcbiAgICBmb3JtRW50cnk6IFwiRW50cmFkYSBkZSBmb3JtYVwiLFxuICAgIHRlc3RTZXJ2aWNlOiBcIlByb2JhciBlbCBzZXJ2aWNpb1wiLFxuICAgIGl0ZW1TZWxlY3RvckVtcHR5OiBcIlBvciBmYXZvciBzZWxlY2Npb25lIGVsIGVsZW1lbnRvXCIsXG4gICAgY29uZGl0aW9uQWN0aW9uRW1wdHk6IFwiUG9yIGZhdm9yIHNlbGVjY2lvbmUgbGEgYWNjacOzblwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFF1ZXN0aW9uOiBcIlNlbGVjY2lvbmFyIHByZWd1bnRhIC4uLlwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFBhZ2U6IFwiU2VsZWNjaW9uYXIgcMOhZ2luYSAuLi5cIixcbiAgICBjb25kaXRpb25TZWxlY3RQYW5lbDogXCJTZWxlY2Npb25hciBwYW5lbCAuLi5cIixcbiAgICBjb25kaXRpb25WYWx1ZVF1ZXN0aW9uVGl0bGU6IFwiUG9yIGZhdm9yIGluZ3Jlc2UgLyBzZWxlY2Npb25lIGVsIHZhbG9yXCIsXG4gICAgY29uZGl0aW9uSGVscDpcbiAgICAgIFwiUG9yIGZhdm9yIGluZ3Jlc2UgdW5hIGV4cHJlc2nDs24gYm9vbGVhbmEuRGViZSBkZXZvbHZlcnNlIHZlcmRhZGVybyBwYXJhIG1hbnRlbmVyIHZpc2libGUgbGEgcHJlZ3VudGEgLyBww6FnaW5hLlBvciBlamVtcGxvOiB7cHJlZ3VudGExfSA9ICd2YWx1ZTEnIG8gKHtwcmVndW50YTJ9ICoge3ByZWd1bnRhNH0+IDIwIHkge3ByZWd1bnRhM30gPDUpXCIsXG4gICAgZXhwcmVzc2lvbkhlbHA6XG4gICAgICBcIlB1ZWRlIHVzYXIgc29wb3J0ZXMgcml6YWRvcyBwYXJhIG9idGVuZXIgYWNjZXNvIGEgbG9zIHZhbG9yZXMgZGUgbGEgcHJlZ3VudGE6IHtwcmVndW50YTF9ICsge3ByZWd1bnRhMn0sICh7cHJlY2lvfSAqIHtjYW50aWRhZH0pICogKDEwMCAtIHtkZXNjdWVudG99KS5QdWVkZSB1c2FyIGZ1bmNpb25lcyBjb21vOiBJSUYgKCksIGhveSAoKSwgZWRhZCAoKSwgbWluICgpLCBtYXggKCksIGN1ZW50YSAoKSwgQVZHICgpIHkgb3Ryb3NcIixcbiAgICBhY2VFZGl0b3JIZWxwOlxuICAgICAgXCJQcmVzaW9uZSBDVFJMICsgRVNQQUNJTyBwYXJhIG9idGVuZXIgc3VnZXJlbmNpYSBkZSBjb21wbGV0YXIgbGEgZXhwcmVzacOzblwiLFxuICAgIGFjZUVkaXRvclJvd1RpdGxlOiBcIkZpbGEgYWN0dWFsXCIsXG4gICAgYWNlRWRpdG9yUGFuZWxUaXRsZTogXCJQYW5lbCBhY3R1YWxcIixcbiAgICBzaG93TW9yZTogXCJQYXJhIG3DoXMgZGV0YWxsZXMsIHBvciBmYXZvciByZXZpc2UgbGEgZG9jdW1lbnRhY2nDs25cIixcbiAgICBjb25kaXRpb25TaG93TW9yZVVybDpcbiAgICAgIFwiaHR0cHM6Ly9zdXJ2ZXlqc0lvL2RvY3VtZW50YXRpb24vbGlicmFyeVBhcmFtZXRybz9JZCA9UHJlZ3VudGFZUGFyw6FtZXRybyA9VmlzaWJsZVNpXCIsXG4gICAgYXNzaXN0YW50VGl0bGU6IFwiUHJlZ3VudGFzIGRpc3BvbmlibGVzOlwiLFxuICAgIGNlbGxzRW1wdHlSb3dzQ29sdW1uczogXCJEZWJlIGhhYmVyIGFsIG1lbm9zIHVuYSBjb2x1bW5hIG8gZmlsYVwiLFxuICAgIHByb3BlcnR5SXNFbXB0eTogXCJQb3JmYXZvciBpbnRyb2R1emNhIHVuIHZhbG9yXCIsXG4gICAgcHJvcGVydHlJc05vVW5pcXVlOiBcIlBvciBmYXZvciBpbmdyZXNlIHVuIHZhbG9yIMO6bmljb1wiLFxuICAgIHByb3BlcnR5TmFtZUlzTm90VW5pcXVlOiBcIlBvciBmYXZvciBpbmdyZXNlIHVuIG5vbWJyZSDDum5pY29cIixcbiAgICBsaXN0SXNFbXB0eTogXCJBw7FhZGlyIHVuIG51ZXZvIGFydMOtY3Vsb1wiLFxuICAgIGV4cHJlc3Npb25Jc0VtcHR5OiBcIkxhIGV4cHJlc2nDs24gZXN0w6EgdmFjw61hXCIsXG4gICAgdmFsdWU6IFwiVmFsb3JcIixcbiAgICB0ZXh0OiBcIlRleHRvXCIsXG4gICAgcm93aWQ6IFwiSUQgZGUgZmlsYVwiLFxuICAgIGltYWdlTGluazogXCJFbmxhY2UgZGUgaW3DoWdlblwiLFxuICAgIGNvbHVtbkVkaXQ6IFwiRWRpdGFyIGNvbHVtbmE6IHswfVwiLFxuICAgIGl0ZW1FZGl0OiBcIkVkaXRhciBhcnTDrWN1bG86IHswfVwiLFxuICAgIHVybDogXCJVUkxcIixcbiAgICBwYXRoOiBcIkNhbWlub1wiLFxuICAgIHZhbHVlTmFtZTogXCJOb21icmUgZGUgdmFsb3JcIixcbiAgICB0aXRsZU5hbWU6IFwiTm9tYnJlIGRlbCB0w610dWxvXCIsXG4gICAgdGl0bGVQbGFjZWhvbGRlcjogXCJUw610dWxvIGRlIGVudHJhZGEgYXF1w61cIixcbiAgICBzdXJ2ZXlUaXRsZVBsYWNlaG9sZGVyOiBcIlTDrXR1bG8gZGUgbGEgZW5jdWVzdGEgZGUgZW50cmFkYSBhcXXDrVwiLFxuICAgIHBhZ2VUaXRsZVBsYWNlaG9sZGVyOiBcIlTDrXR1bG8gZGUgbGEgcMOhZ2luYSBkZSBlbnRyYWRhIGFxdcOtXCIsXG4gICAgZGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCJJbmdyZXNlIHVuYSBkZXNjcmlwY2nDs25cIixcbiAgICBzdXJ2ZXlEZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcIkluZ3Jlc2UgdW5hIGRlc2NyaXBjacOzbiBkZSBsYSBlbmN1ZXN0YVwiLFxuICAgIHBhZ2VEZXNjcmlwdGlvblBsYWNlaG9sZGVyOiBcIkluZ3Jlc2UgdW5hIGRlc2NyaXBjacOzbiBkZSBsYSBww6FnaW5hXCIsXG4gICAgaGFzT3RoZXI6IFwiVGllbmUgb3RybyBhcnTDrWN1bG9cIixcbiAgICBvdGhlclRleHQ6IFwiT3RybyB0ZXh0byBkZSBhcnTDrWN1bG9cIixcbiAgICBoYXNOb25lOiBcIk5vIHRpZW5lIHVuIGFydMOtY3Vsb1wiLFxuICAgIG5vbmVUZXh0OiBcIk5pbmd1bm8gYXJ0w61jdWxvIGRlIHRleHRvXCIsXG4gICAgaGFzU2VsZWN0QWxsOiBcIkhhIHNlbGVjY2lvbmFkbyB0b2RvIGVsIGFydMOtY3Vsb1wiLFxuICAgIHNlbGVjdEFsbFRleHQ6IFwiU2VsZWNjaW9uZSB0b2RvIGVsIHRleHRvIGRlbCBhcnTDrWN1bG9cIixcbiAgICBjaG9pY2VzTWluOiBcIlZhbG9yIG3DrW5pbW8gcGFyYSBhcnTDrWN1bG9zIGdlbmVyYWRvcyBhdXRvbcOhdGljb3NcIixcbiAgICBjaG9pY2VzTWF4OiBcIlZhbG9yIG3DoXhpbW8gcGFyYSBhcnTDrWN1bG9zIGdlbmVyYWRvcyBhdXRvbcOhdGljb3NcIixcbiAgICBjaG9pY2VzU3RlcDogXCJMYSBkaWZlcmVuY2lhIGVudHJlIGxvcyBhcnTDrWN1bG9zIGdlbmVyYWRvcyBhdXRvbcOhdGljb3NcIixcbiAgICBuYW1lOiBcIk5vbWJyZVwiLFxuICAgIHRpdGxlOiBcIlTDrXR1bG9cIixcbiAgICBjZWxsVHlwZTogXCJUaXBvIGRlIGPDqWx1bGFcIixcbiAgICBjb2xDb3VudDogXCJSZWN1ZW50byBkZSBjb2x1bW5hc1wiLFxuICAgIGNob2ljZXNPcmRlcjogXCJTZWxlY2Npb25lIGVsIG9yZGVuIGRlIGxhcyBvcGNpb25lc1wiLFxuICAgIHZpc2libGU6IFwiwr9FcyB2aXNpYmxlP1wiLFxuICAgIGlzUmVxdWlyZWQ6IFwiwr9TZSByZXF1aWVyZT9cIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcIlJlcXVlcmlyIHJlc3B1ZXN0YSBwYXJhIHRvZGFzIGxhcyBmaWxhc1wiLFxuICAgIHJlcXVpcmVkRXJyb3JUZXh0OiBcIlRleHRvIGRlIGVycm9yIHJlcXVlcmlkb1wiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwiwr9FbXBpZXphIGNvbiBsYSBudWV2YSBsw61uZWE/XCIsXG4gICAgcm93czogXCJOw7ptZXJvIGRlIGZpbGFzXCIsXG4gICAgY29sczogXCJSZWN1ZW50byBkZSBjb2x1bW5hc1wiLFxuICAgIHBsYWNlSG9sZGVyOiBcIlBsYWNlaG9sZGVyIGRlIGVudHJhZGFcIixcbiAgICBzaG93UHJldmlldzogXCJNb3N0cmFyIMOhcmVhIGRlIHZpc3RhIHByZXZpYVwiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDpcbiAgICAgIFwiVGllbmRhIGVsIGNvbnRlbmlkbyBkZWwgYXJjaGl2byBlbiBlbCByZXN1bHRhZG8gZGUgSlNPTiBjb21vIHRleHRvXCIsXG4gICAgbWF4U2l6ZTogXCJUYW1hw7FvIG3DoXhpbW8gZGUgYXJjaGl2byBlbiBieXRlc1wiLFxuICAgIGltYWdlSGVpZ2h0OiBcIkFsdHVyYSBkZSBpbWFnZW5cIixcbiAgICBpbWFnZVdpZHRoOiBcIkFuY2hvIGRlIGxhIGltYWdlblwiLFxuICAgIHJvd0NvdW50OiBcIk7Dum1lcm8gZGUgZmlsYXNcIixcbiAgICBjb2x1bW5MYXlvdXQ6IFwiRGlzZcOxbyBkZSBjb2x1bW5hc1wiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcIkHDsWFkaXIgbGEgdWJpY2FjacOzbiBkZWwgYm90w7NuIGRlIGxhIGZpbGFcIixcbiAgICBhZGRSb3dUZXh0OiBcIkHDsWFkaXIgdGV4dG8gZGUgYm90w7NuIGRlIGZpbGFcIixcbiAgICByZW1vdmVSb3dUZXh0OiBcIkVsaW1pbmFyIGVsIHRleHRvIGRlbCBib3TDs24gZGUgZmlsYVwiLFxuICAgIHJhdGVNaW46IFwiVGFzYSBtw61uaW1hXCIsXG4gICAgcmF0ZU1heDogXCJUYXNhIG3DoXhpbWFcIixcbiAgICByYXRlU3RlcDogXCJQYXNvIGRlIHRhcmlmYVwiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCJUYXNhIG3DrW5pbWEgRGVzY3JpcGNpw7NuXCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcIkRlc2NyaXBjacOzbiBkZSBsYSB0YXNhIG3DoXhpbWFcIixcbiAgICBpbnB1dFR5cGU6IFwiVGlwbyBkZSBlbnRyYWRhXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiQ2FwdGFjacOzbiBkZSBvcGNpb25lc1wiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJWYWxvciBwb3IgZGVmZWN0b1wiLFxuICAgIGNlbGxzRGVmYXVsdFJvdzogXCJUZXh0b3MgZGUgY2VsZGFzIHByZWRldGVybWluYWRvc1wiLFxuICAgIHN1cnZleUVkaXRvclRpdGxlOiBcIkVkaXRhciBjb25maWd1cmFjacOzbiBkZSBlbmN1ZXN0YVwiLFxuICAgIHFFZGl0b3JUaXRsZTogXCJFZGl0YXI6IHswfVwiLFxuICAgIG1heExlbmd0aDogXCJMb25naXR1ZCBtw6F4aW1hXCIsXG4gICAgYnVpbGRFeHByZXNzaW9uOiBcIkNvbnN0cnVpclwiLFxuICAgIGVkaXRFeHByZXNzaW9uOiBcIkVkaXRhclwiLFxuICAgIGFuZDogXCJZXCIsXG4gICAgb3I6IFwiT1wiLFxuICAgIHJlbW92ZTogXCJFbGltaW5hclwiLFxuICAgIGFkZENvbmRpdGlvbjogXCJBw7FhZGlyIGNvbmRpY2nDs25cIixcbiAgICBzaG93VGl0bGU6IFwiTW9zdHJhciAvIE9jdWx0YXIgVMOtdHVsb1wiLFxuICAgIGV4cGFuZENvbGxhcHNlVGl0bGU6IFwiRXhwYW5kaXIgLyBDb250cmFlciB0w610dWxvXCIsXG4gICAgbG9jYWxlOiBcIklkaW9tYSBwcmVkZXRlcm1pbmFkb1wiLFxuICAgIHNpbXVsYXRvcjogXCJFbGlnZSBkaXNwb3NpdGl2b1wiLFxuICAgIGxhbmRzY2FwZU9yaWVudGF0aW9uOiBcIkFwYWlzYWRvXCIsXG4gICAgbW9kZTogXCJNb2RvIChlZGl0YXIgLyBsZWVyIHNvbGFtZW50ZSlcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCJDbGFyb3MgdmFsb3JlcyBpbnZpc2libGVzXCIsXG4gICAgY29va2llTmFtZTpcbiAgICAgIFwiTm9tYnJlIGRlIGxhIGNvb2tpZSAocGFyYSBkZXNoYWJpbGl0YXIgbGEgZW5jdWVzdGEgZGUgZWplY3VjacOzbiBkb3MgdmVjZXMgbG9jYWxtZW50ZSlcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDpcbiAgICAgIFwiRW52aWFyIHJlc3VsdGFkb3MgZGUgZW5jdWVzdGFzIGVuIGxhIHDDoWdpbmEgU2lndWllbnRlXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiQWxtYWNlbmFyICdPdHJvcycgdmFsb3IgZW4gY2FtcG8gc2VwYXJhZG9cIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJNb3N0cmFyIHTDrXR1bG9zIGRlIHDDoWdpbmFcIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwiTW9zdHJhciBuw7ptZXJvcyBkZSBww6FnaW5hXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIlDDoWdpbmEgZGUgdGV4dG8gZGVsIGJvdMOzbiBhbnRlcmlvclwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJQw6FnaW5hIFNpZ3VpZW50ZSBib3TDs24gZGUgdGV4dG9cIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiVGV4dG8gY29tcGxldG8gZGVsIGJvdMOzblwiLFxuICAgIHByZXZpZXdUZXh0OiBcIlZpc3RhIHByZXZpYSBkZWwgYm90w7NuIGRlbCBib3TDs25cIixcbiAgICBlZGl0VGV4dDogXCJFZGl0YXIgYm90w7NuIGRlIHRleHRvXCIsXG4gICAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlRleHRvIGRlIGluaWNpbyBkZSBsYSBlbmN1ZXN0YVwiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczpcbiAgICAgIFwiTW9zdHJhciBib3RvbmVzIGRlIG5hdmVnYWNpw7NuIChuYXZlZ2FjacOzbiBwcmVkZXRlcm1pbmFkYSlcIixcbiAgICBzaG93UHJldkJ1dHRvbjpcbiAgICAgIFwiTW9zdHJhciBib3TDs24gYW50ZXJpb3IgKGVsIHVzdWFyaW8gcHVlZGUgdm9sdmVyIGEgbGEgcMOhZ2luYSBhbnRlcmlvcilcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6XG4gICAgICBcIkxhIHByaW1lcmEgcMOhZ2luYSBlbiBsYSBlbmN1ZXN0YSBlcyB1bmEgcMOhZ2luYSBpbmljaWFkYVwiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcIk1vc3RyYXIgbGEgcMOhZ2luYSBjb21wbGV0YSBhbCBmaW5hbCAoSFRNTCBmaW5hbGl6YWRvKVwiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6XG4gICAgICBcIkFsIHJlc3BvbmRlciB0b2RhcyBsYXMgcHJlZ3VudGFzLCB2YXlhIGEgbGEgcMOhZ2luYSBzaWd1aWVudGUgYXV0b23DoXRpY2FtZW50ZVwiLFxuICAgIHNob3dQcm9ncmVzc0JhcjogXCJNb3N0cmFyIGJhcnJhIGRlIHByb2dyZXNvXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcIlViaWNhY2nDs24gZGVsIHTDrXR1bG8gZGUgbGEgcHJlZ3VudGFcIixcbiAgICByZXF1aXJlZFRleHQ6IFwiTGEgcHJlZ3VudGEgcmVxdWVyaWRhIChzKSBzw61tYm9sbyAocylcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwiw41uZGljZSBkZSBpbmljaW8gZGUgbGEgcHJlZ3VudGEgKDEsIDIgbyAnQScsICdBJylcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIk1vc3RyYXIgbsO6bWVyb3MgZGUgcHJlZ3VudGFcIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6XG4gICAgICBcIlBsYW50aWxsYSBkZSB0w610dWxvIGRlIGxhIHByZWd1bnRhLCBlbCB2YWxvciBwcmVkZXRlcm1pbmFkbyBlczogJ3tub30ue3JlcXVpZXJlfSB7dMOtdHVsb30gJ1wiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJVYmljYWNpw7NuIGRlIGVycm9yIGRlIGxhIHByZWd1bnRhXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOlxuICAgICAgXCJFbmZvY2EgbGEgcHJpbWVyYSBwcmVndW50YSBhbCBjYW1iaWFyIGxhIHDDoWdpbmFcIixcbiAgICBxdWVzdGlvbnNPcmRlcjogXCJPcmRlbiBkZSBlbGVtZW50b3MgZW4gbGEgcMOhZ2luYVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJUaWVtcG8gbcOheGltbyBwYXJhIHRlcm1pbmFyIGxhIGVuY3Vlc3RhXCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTpcbiAgICAgIFwiVGllbXBvIG3DoXhpbW8gcGFyYSB0ZXJtaW5hciB1bmEgcMOhZ2luYSBlbiBsYSBlbmN1ZXN0YVwiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcIk1vc3RyYXIgcGFuZWwgZGUgdGVtcG9yaXphZG9yXCIsXG4gICAgc2hvd1RpbWVyUGFuZWxNb2RlOiBcIk1vc3RyYXIgbW9kbyBkZSBwYW5lbCBkZWwgdGVtcG9yaXphZG9yXCIsXG4gICAgcmVuZGVyTW9kZTogXCJNb2RvIGRlIHJlbmRlcml6YWRvXCIsXG4gICAgYWxsb3dBZGRQYW5lbDogXCJQZXJtaXRpciBhZ3JlZ2FyIHVuIHBhbmVsXCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCJQZXJtaXRpciBlbGltaW5hciBlbCBwYW5lbFwiLFxuICAgIHBhbmVsQWRkVGV4dDogXCJBw7FhZGllbmRvIHRleHRvIGRlbCBwYW5lbFwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCJFbGltaW5hciB0ZXh0byBkZWwgcGFuZWxcIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwiTW9zdHJhciB0b2RvcyBsb3MgZWxlbWVudG9zIGVuIHVuYSBww6FnaW5hXCIsXG4gICAgaHRtbDogXCJIdG1sXCIsXG4gICAgZXhwcmVzc2lvbjogXCJFeHByZXNpw7NuXCIsXG4gICAgbWluVmFsdWU6IFwiVmFsb3IgbcOtbmltb1wiLFxuICAgIG1heFZhbHVlOiBcIlZhbG9yIG3DoXhpbW9cIixcbiAgICBtaW5MZW5ndGg6IFwiTG9uZ2l0dWQgbcOtbmltYVwiLFxuICAgIGFsbG93RGlnaXRzOiBcIlBlcm1pdGlyIGTDrWdpdG9zXCIsXG4gICAgbWluQ291bnQ6IFwiQ3VlbnRhIG3DrW5pbWFcIixcbiAgICBtYXhDb3VudDogXCJSZWN1ZW50byBtw6F4aW1vXCIsXG4gICAgcmVnZXg6IFwiRXhwcmVzacOzbiByZWd1bGFyXCIsXG4gICAgdG90YWxUZXh0OiBcIlRleHRvIHRvdGFsXCIsXG4gICAgdG90YWxUeXBlOiBcIlRpcG8gdG90YWxcIixcbiAgICB0b3RhbEV4cHJlc3Npb246IFwiRXhwcmVzacOzbiB0b3RhbFwiLFxuICAgIHRvdGFsRGlzcGxheVN0eWxlOiBcIkVzdGlsbyBkZSB2aXN1YWxpemFjacOzbiB0b3RhbFwiLFxuICAgIHRvdGFsQ3VycmVuY3k6IFwiTW9uZWRhIHRvdGFsXCIsXG4gICAgdG90YWxGb3JtYXQ6IFwiRm9ybWF0byB0b3RhbFwiLFxuICAgIGxvZ29Qb3NpdGlvbjogXCJQb3NpY2nDs24gZGVsIGxvZ290aXBvXCIsXG4gICAgYWRkTG9nbzogXCJBw7FhZGlyIGxvZ28gLi4uXCIsXG4gICAgY2hhbmdlTG9nbzogXCJDYW1iaWFyIGxvZ28gLi4uXCIsXG4gICAgbG9nb1Bvc2l0aW9uczoge1xuICAgICAgbm9uZTogXCJFbGltaW5hciBsb2dvXCIsXG4gICAgICBsZWZ0OiBcIkl6cXVpZXJkYVwiLFxuICAgICAgcmlnaHQ6IFwiRGVyZWNoYVwiLFxuICAgICAgdG9wOiBcIkVuIGxhIHBhcnRlIHN1cGVyaW9yXCIsXG4gICAgICBib3R0b206IFwiRW4gbGEgcGFydGUgaW5mZXJpb3JcIixcbiAgICB9LFxuICAgIHRhYnM6IHtcbiAgICAgIGdlbmVyYWw6IFwiR2VuZXJhbFwiLFxuICAgICAgZmlsZU9wdGlvbnM6IFwiT3BjaW9uZXNcIixcbiAgICAgIGh0bWw6IFwiRWRpdG9yIEhUTUxcIixcbiAgICAgIGNvbHVtbnM6IFwiQ29sdW1uYXNcIixcbiAgICAgIHJvd3M6IFwiRmlsYXNcIixcbiAgICAgIGNob2ljZXM6IFwiT3BjaW9uZXNcIixcbiAgICAgIGl0ZW1zOiBcIkFydMOtY3Vsb3NcIixcbiAgICAgIHZpc2libGVJZjogXCJWaXNpYmxlIHNpXCIsXG4gICAgICBlbmFibGVJZjogXCJIYWJpbGl0YXIgc2lcIixcbiAgICAgIHJlcXVpcmVkSWY6IFwiUmVxdWVyaWRvIHNpXCIsXG4gICAgICByYXRlVmFsdWVzOiBcIlZhbG9yZXMgZGUgbGEgdGFzYVwiLFxuICAgICAgY2hvaWNlc0J5VXJsOiBcIk9wY2lvbmVzIGRlIGxhIHdlYlwiLFxuICAgICAgbWF0cml4Q2hvaWNlczogXCJPcGNpb25lcyBwcmVkZXRlcm1pbmFkYXNcIixcbiAgICAgIG11bHRpcGxlVGV4dEl0ZW1zOiBcIkVudHJhZGFzIGRlIHRleHRvXCIsXG4gICAgICBudW1iZXJpbmc6IFwiTnVtZXJhY2nDs25cIixcbiAgICAgIHZhbGlkYXRvcnM6IFwiVmFsaWRhZG9yZXNcIixcbiAgICAgIG5hdmlnYXRpb246IFwiTmF2ZWdhY2nDs25cIixcbiAgICAgIHF1ZXN0aW9uOiBcIlByZWd1bnRhXCIsXG4gICAgICBwYWdlczogXCJQw6FnaW5hc1wiLFxuICAgICAgY29tcGxldGVkSHRtbDogXCJIVE1MIGNvbXBsZXRhZG9cIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbjogXCJIVE1MIGNvbXBsZXRhZG8gZW4gbGEgY29uZGljacOzblwiLFxuICAgICAgbG9hZGluZ0h0bWw6IFwiQ2FyZ2FuZG8gSFRNTFwiLFxuICAgICAgdGltZXI6IFwiSG9yYXMgLyBjdWVzdGlvbmFyaW9cIixcbiAgICAgIGNhbGN1bGF0ZWRWYWx1ZXM6IFwiVmFsb3JlcyBjYWxjdWxhZG9zXCIsXG4gICAgICB0cmlnZ2VyczogXCJEaXNwYXJhZG9yZXNcIixcbiAgICAgIHRlbXBsYXRlVGl0bGU6IFwiVMOtdHVsbyBkZSBsYSBwbGFudGlsbGFcIixcbiAgICAgIHRvdGFsczogXCJUb3RhbGVzXCIsXG4gICAgICBsb2dpYzogXCJMw7NnaWNhXCIsXG4gICAgICBsYXlvdXQ6IFwiRGlzZcOxb1wiLFxuICAgICAgZGF0YTogXCJEYXRvc1wiLFxuICAgICAgdmFsaWRhdGlvbjogXCJWYWxpZGFjacOzblwiLFxuICAgICAgY2VsbHM6IFwiQ8OpbHVsYXNcIixcbiAgICAgIHNob3dPbkNvbXBsZXRlZDogXCJNb3N0cmFyIGVuIGNvbXBsZXRhZG9cIixcbiAgICAgIGxvZ286IFwiTG9nbyBlbiBlbCB0w610dWxvIGRlIGxhIGVuY3Vlc3RhXCIsXG4gICAgICBzbGlkZXI6IFwiU2xpZGVyXCIsXG4gICAgICBvdGhlcnM6IFwiT3RyYXNcIixcbiAgICB9LFxuICAgIGVkaXRQcm9wZXJ0eTogXCJFZGl0YXIgcHJvcGllZGFkICd7MH0nXCIsXG4gICAgaXRlbXM6IFwiW0FydMOtY3Vsb3M6IHswfV1cIixcbiAgICBlbnRlck5ld1ZhbHVlOiBcIlBvciBmYXZvciwgaW5ncmVzZSBlbCB2YWxvclwiLFxuICAgIG5vcXVlc3Rpb25zOiBcIk5vIGhheSBuaW5ndW5hIHByZWd1bnRhIGVuIGxhIGVuY3Vlc3RhXCIsXG4gICAgY3JlYXRldHJpZ2dlcjogXCJQb3IgZmF2b3IgY3JlYSB1biBnYXRpbGxvXCIsXG4gICAgdGl0bGVLZXlib2FyZEFkb3JuZXJUaXA6IFwiUHJlc2lvbmUgZWwgYm90w7NuIEVudHJhciBwYXJhIGVkaXRhclwiLFxuICAgIGtleWJvYXJkQWRvcm5lclRpcDpcbiAgICAgIFwiUHJlc2lvbmUgZWwgYm90w7NuIEVudHJhciBwYXJhIGVkaXRhciBlbCBlbGVtZW50bywgcHJlc2lvbmUgZWwgYm90w7NuIEVsaW1pbmFyIHBhcmEgZWxpbWluYXIgZWwgZWxlbWVudG8sIHByZXNpb25lIEFMVCBQbHVzIEZsZWNoYSBoYWNpYSBhcnJpYmEgbyBoYWNpYSBhYmFqbyBwYXJhIG1vdmVyIGVsIGVsZW1lbnRvXCIsXG4gICAga2V5Ym9hcmRNb3ZlSXRlbXNUaXA6XG4gICAgICBcIlByZXNpb25lIEFMVCBQbHVzIGZsZWNoYSBoYWNpYSBhcnJpYmEgbyBmbGVjaGEgaGFjaWEgYWJham8gcGFyYSBtb3ZlciBlbCBhcnTDrWN1bG9cIixcbiAgICB0cmlnZ2VyT246IFwiRW5cIixcbiAgICB0cmlnZ2VyTWFrZVBhZ2VzVmlzaWJsZTogXCJIYWNlciB2aXNpYmxlcyBsYXMgcMOhZ2luYXM6XCIsXG4gICAgdHJpZ2dlck1ha2VRdWVzdGlvbnNWaXNpYmxlOiBcIkhhY2VyIGVsZW1lbnRvcyB2aXNpYmxlczpcIixcbiAgICB0cmlnZ2VyQ29tcGxldGVUZXh0OiBcIkNvbXBsZXRhIGxhIGVuY3Vlc3RhIHNpIHRpZW5lIMOpeGl0b1wiLFxuICAgIHRyaWdnZXJOb3RTZXQ6IFwiRWwgZ2F0aWxsbyBubyBzZSBlc3RhYmxlY2VcIixcbiAgICB0cmlnZ2VyUnVuSWY6IFwiQ29ycmVyIHNpXCIsXG4gICAgdHJpZ2dlclNldFRvTmFtZTogXCJDYW1iaW8gZGUgdmFsb3IgZGU6XCIsXG4gICAgdHJpZ2dlckZyb21OYW1lOiBcIkNvcGllIGVsIHZhbG9yIGRlOlwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uOiBcIkVqZWN1dGUgZXN0YSBleHByZXNpw7NuOlwiLFxuICAgIHRyaWdnZXJTZXRWYWx1ZTogXCJhOlwiLFxuICAgIHRyaWdnZXJHb3RvTmFtZTogXCJJciBhIGxhIHByZWd1bnRhOlwiLFxuICAgIHRyaWdnZXJJc1ZhcmlhYmxlOiBcIk5vIGNvbG9xdWUgbGEgdmFyaWFibGUgZW4gZWwgcmVzdWx0YWRvIGRlIGxhIGVuY3Vlc3RhXCIsXG4gICAgdHJpZ2dlclJ1bkV4cHJlc3Npb25FbXB0eTogXCJQb3IgZmF2b3IgaW5ncmVzZSB1bmEgZXhwcmVzacOzbiB2w6FsaWRhXCIsXG4gICAgbm9GaWxlOiBcIk5pbmfDum4gYXJjaGl2byBlbGVnaWRvXCIsXG4gIH0sXG4gIHB2OiB7XG4gICAgdHJ1ZTogXCJjaWVydG9cIixcbiAgICBmYWxzZTogXCJmYWxzYVwiLFxuICAgIGluaGVyaXQ6IFwiaGVyZWRhclwiLFxuICAgIHNob3c6IFwibW9zdHJhclwiLFxuICAgIGhpZGU6IFwiZXNjb25kZXJcIixcbiAgICBkZWZhdWx0OiBcImRlZmVjdG9cIixcbiAgICBpbml0aWFsOiBcImluaWNpYWxcIixcbiAgICByYW5kb206IFwiYWxlYXRvcmlhXCIsXG4gICAgY29sbGFwc2VkOiBcImNvbGFwc2FkYVwiLFxuICAgIGV4cGFuZGVkOiBcImV4cGFuZGlkYVwiLFxuICAgIG5vbmU6IFwibmluZ3VuYVwiLFxuICAgIGFzYzogXCJhc2NlbmRlbnRlXCIsXG4gICAgZGVzYzogXCJkZXNjZW5kaWVuZG9cIixcbiAgICBpbmRldGVybWluYXRlOiBcImluZGV0ZXJtaW5hZGFcIixcbiAgICBkZWNpbWFsOiBcImRlY2ltYWxcIixcbiAgICBjdXJyZW5jeTogXCJkaXZpc2FcIixcbiAgICBwZXJjZW50OiBcInBvciBjaWVudG9cIixcbiAgICBmaXJzdEV4cGFuZGVkOiBcIlByaW1lciBFeHBhbmRpZG9cIixcbiAgICBvZmY6IFwiYXBhZ2FkYVwiLFxuICAgIG9uUGFuZWw6IFwiZW4gUGFuZWxcIixcbiAgICBvblN1cnZleTogXCJlbiBFbmN1ZXN0YVwiLFxuICAgIGxpc3Q6IFwibGlzdGFcIixcbiAgICBwcm9ncmVzc1RvcDogXCJQcm9ncmVzbyBzdXBlcmlvclwiLFxuICAgIHByb2dyZXNzQm90dG9tOiBcIlByb2dyZXNvIGluZmVyaW9yXCIsXG4gICAgcHJvZ3Jlc3NUb3BCb3R0b206IFwiUHJvZ3Jlc28gaW5mZXJpb3Ivc3VwZXJpb3JcIixcbiAgICBob3Jpem9udGFsOiBcImhvcml6b250YWxcIixcbiAgICB2ZXJ0aWNhbDogXCJ2ZXJ0aWNhbFwiLFxuICAgIHRvcDogXCJjaW1hXCIsXG4gICAgYm90dG9tOiBcImZvbmRvXCIsXG4gICAgdG9wQm90dG9tOiBcImFycmliYSB5IGFiYWpvXCIsXG4gICAgYm90aDogXCJhbWJhc1wiLFxuICAgIGxlZnQ6IFwiaXpxdWllcmRhXCIsXG4gICAgY29sb3I6IFwiY29sb3JcIixcbiAgICBkYXRlOiBcImZlY2hhXCIsXG4gICAgZGF0ZXRpbWU6IFwiZmVjaGEgeSBob3JhXCIsXG4gICAgXCJkYXRldGltZS1sb2NhbFwiOiBcImZlY2hhIHkgaG9yYSBsb2NhbFwiLFxuICAgIGVtYWlsOiBcIkVtYWlsXCIsXG4gICAgbW9udGg6IFwibWVzXCIsXG4gICAgbnVtYmVyOiBcIm7Dum1lcm9cIixcbiAgICBwYXNzd29yZDogXCJjb250cmFzZcOxYVwiLFxuICAgIHJhbmdlOiBcImRpc3RhbmNpYVwiLFxuICAgIHRlbDogXCJ0ZWxcIixcbiAgICB0ZXh0OiBcInRleHRvXCIsXG4gICAgdGltZTogXCJob3JhXCIsXG4gICAgdXJsOiBcIlVSTFwiLFxuICAgIHdlZWs6IFwic2VtYW5hXCIsXG4gICAgaGlkZGVuOiBcIm9jdWx0YVwiLFxuICAgIG9uOiBcImVuXCIsXG4gICAgb25QYWdlOiBcImVuIGxhIHDDoWdpbmFcIixcbiAgICBlZGl0OiBcImVkaXRhclwiLFxuICAgIGRpc3BsYXk6IFwibW9zdHJhclwiLFxuICAgIG9uQ29tcGxldGU6IFwiQWwgY29tcGxldGFyc2VcIixcbiAgICBvbkhpZGRlbjogXCJBbCBvY3VsdGFyc2VcIixcbiAgICBhbGw6IFwidG9kYXNcIixcbiAgICBwYWdlOiBcInDDoWdpbmFcIixcbiAgICBzdXJ2ZXk6IFwiZW5jdWVzdGFcIixcbiAgICBvbk5leHRQYWdlOiBcIkFsIGNhbWJpYXIgcMOhZ2luYVwiLFxuICAgIG9uVmFsdWVDaGFuZ2VkOiBcIkFsIGNhbWJpYXIgdmFsb3JcIixcbiAgICBzaW5nbGVQYWdlOiBcIsO6bmljYSBww6FnaW5hXCIsXG4gICAgc3RhbmRhcmQ6IFwiZXN0w6FuZGFyXCIsXG4gICAgcXVlc3Rpb25QZXJQYWdlOiBcIlByZWd1bnRhIHBvciBww6FnaW5hXCIsXG4gICAgbm9QcmV2aWV3OiBcInNpbiB2aXN0YSBwcmV2aWFcIixcbiAgICBzaG93QWxsUXVlc3Rpb25zOiBcIk1vc3RyYXIgdmlzdGEgcHJldmlhIGNvbiB0b2RhcyBsYXMgcHJlZ3VudGFzXCIsXG4gICAgc2hvd0Fuc3dlcmVkUXVlc3Rpb25zOiBcIk1vc3RyYXIgdmlzdGEgcHJldmlhIGNvbiBwcmVndW50YXMgY29udGVzdGFkYXNcIixcbiAgfSxcbiAgb3A6IHtcbiAgICBlbXB0eTogXCJlc3RhIHZhY2lvXCIsXG4gICAgbm90ZW1wdHk6IFwibm8gZXN0w6EgdmFjw61vXCIsXG4gICAgZXF1YWw6IFwiZXMgaWd1YWwgYVwiLFxuICAgIG5vdGVxdWFsOiBcIm5vIGVzIGlndWFsIGFcIixcbiAgICBjb250YWluczogXCJjb250aWVuZVwiLFxuICAgIG5vdGNvbnRhaW5zOiBcIm5vIGNvbnRpZW5lXCIsXG4gICAgYW55b2Y6IFwiY3VhbHF1aWVyYSBkZVwiLFxuICAgIGFsbG9mOiBcInRvZG9cIixcbiAgICBncmVhdGVyOiBcIm1heW9yIHF1ZVwiLFxuICAgIGxlc3M6IFwibWVub3NcIixcbiAgICBncmVhdGVyb3JlcXVhbDogXCJNYXlvciBvIGlndWFsXCIsXG4gICAgbGVzc29yZXF1YWw6IFwiTWVub3MgbyBpZ3VhbGVzXCIsXG4gICAgYW5kOiBcInlcIixcbiAgICBvcjogXCJvXCIsXG4gIH0sXG4gIGV3OiB7XG4gICAgYW5ndWxhcjogXCJVc2FyIGxhIHZlcnNpw7NuIGFuZ3VsYXJcIixcbiAgICBqcXVlcnk6IFwiVXNhIGxhIHZlcnNpw7NuIGpRdWVyeVwiLFxuICAgIGtub2Nrb3V0OiBcIlVzYSBsYSB2ZXJzacOzbiBLbm9ja291dFwiLFxuICAgIHJlYWN0OiBcIlVzZSBsYSB2ZXJzacOzbiBkZSByZWFjY2nDs25cIixcbiAgICB2dWU6IFwiVXNhIGxhIHZlcnNpw7NuIFZVRVwiLFxuICAgIGJvb3RzdHJhcDogXCJQYXJhIG1hcmNvIGRlIGJvb3RzdHJhcFwiLFxuICAgIG1vZGVybjogXCJUZW1hIG1vZGVybm9cIixcbiAgICBkZWZhdWx0OiBcIlRlbWEgcHJlZGV0ZXJtaW5hZG9cIixcbiAgICBvcmFuZ2U6IFwiVGVtYSBuYXJhbmphXCIsXG4gICAgZGFya2JsdWU6IFwiVGVtYSBEYXJrQmx1ZVwiLFxuICAgIGRhcmtyb3NlOiBcIlRlbWEgZGUgRGFya3Jvc2VcIixcbiAgICBzdG9uZTogXCJUZW1hIGRlIHBpZWRyYVwiLFxuICAgIHdpbnRlcjogXCJUZW1hIGRlIGludmllcm5vXCIsXG4gICAgd2ludGVyc3RvbmU6IFwiVGVtYSBkZSBwaWVkcmEgZGUgaW52aWVybm9cIixcbiAgICBzaG93T25QYWdlOiBcIk1vc3RyYXIgZW5jdWVzdGEgZW4gdW5hIHDDoWdpbmFcIixcbiAgICBzaG93SW5XaW5kb3c6IFwiTW9zdHJhciBlbmN1ZXN0YSBlbiB1bmEgdmVudGFuYVwiLFxuICAgIGxvYWRGcm9tU2VydmVyOiBcIkVuY3Vlc3RhIGRlIGNhcmdhIEpTT04gZGVsIHNlcnZpZG9yXCIsXG4gICAgdGl0bGVTY3JpcHQ6IFwiU2NyaXB0cyB5IGVzdGlsb3NcIixcbiAgICB0aXRsZUh0bWw6IFwiSHRtbFwiLFxuICAgIHRpdGxlSmF2YVNjcmlwdDogXCJKYXZhc2NyaXB0XCIsXG4gIH0sXG4gIHRzOiB7XG4gICAgc2VsZWN0UGFnZTogXCJTZWxlY2Npb25lIGxhIHDDoWdpbmEgcGFyYSBwcm9iYXJsbzpcIixcbiAgICBzaG93SW52aXNpYmxlRWxlbWVudHM6IFwiTW9zdHJhciBlbGVtZW50b3MgaW52aXNpYmxlc1wiLFxuICB9LFxuICB2YWxpZGF0b3JzOiB7XG4gICAgYW5zd2VyY291bnR2YWxpZGF0b3I6IFwiY29udGFyIGNvbnRlc3RvXCIsXG4gICAgZW1haWx2YWxpZGF0b3I6IFwiRW1haWxcIixcbiAgICBleHByZXNzaW9udmFsaWRhdG9yOiBcImV4cHJlc2nDs25cIixcbiAgICBudW1lcmljdmFsaWRhdG9yOiBcIm51bcOpcmljYVwiLFxuICAgIHJlZ2V4dmFsaWRhdG9yOiBcInJlZ2V4XCIsXG4gICAgdGV4dHZhbGlkYXRvcjogXCJ0ZXh0b1wiLFxuICB9LFxuICB0cmlnZ2Vyczoge1xuICAgIGNvbXBsZXRldHJpZ2dlcjogXCJlbmN1ZXN0YSBjb21wbGV0YVwiLFxuICAgIHNldHZhbHVldHJpZ2dlcjogXCJ2YWxvciBhanVzdGFkb1wiLFxuICAgIGNvcHl2YWx1ZXRyaWdnZXI6IFwiVmFsb3IgZGUgY29waWFcIixcbiAgICBza2lwdHJpZ2dlcjogXCJTYWx0YXIgYSBsYSBwcmVndW50YVwiLFxuICAgIHJ1bmV4cHJlc3Npb250cmlnZ2VyOiBcImV4cHJlc2nDs24gZGUgZWplY3VjacOzblwiLFxuICAgIHZpc2libGV0cmlnZ2VyOiBcIkNhbWJpYXIgdmlzaWJpbGlkYWRcIixcbiAgfSxcbiAgcDoge1xuICAgIG5hbWU6IFwibm9tYnJlXCIsXG4gICAgdGl0bGU6IHtcbiAgICAgIG5hbWU6IFwidMOtdHVsb1wiLFxuICAgICAgdGl0bGU6IFwiRGVqYXJsbyB2YWPDrW8sIHNpIGVzIGxvIG1pc21vIHF1ZSAnTmFtZSdcIixcbiAgICB9LFxuICAgIG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eTogXCJOYXZlZ2FjacOzbiBib3RvbmVzIHZpc2liaWxpZGFkXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwiT3JkZW5cIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwiVGllbXBvIGRlIGZpbmFsaXphY2nDs25cIixcbiAgICB2aXNpYmxlOiBcInZpc2libGVcIixcbiAgICB2aXNpYmxlSWY6IFwidmlzaWJsZSBzaVwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJMb2NhbGl6YWNpw7NuIGRlbCB0w610dWxvXCIsXG4gICAgZGVzY3JpcHRpb246IFwiZGVzY3JpcGNpw7NuXCIsXG4gICAgc3RhdGU6IFwiRXhwcmVzYXJcIixcbiAgICBpc1JlcXVpcmVkOiBcInNlIHJlcXVpZXJlXCIsXG4gICAgcmVxdWlyZWRJZjogXCJSZXF1ZXJpZG8gc2lcIixcbiAgICBpbmRlbnQ6IFwic2FuZ3JhclwiLFxuICAgIHJlcXVpcmVkRXJyb3JUZXh0OiBcIlJlcXVlcmlkb1wiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwiQ29tZW56YXIgY29uIG51ZXZhIGzDrW5lYVwiLFxuICAgIGlubmVySW5kZW50OiBcIlNhbmdyw61hIGludGVyaW9yXCIsXG4gICAgcGFnZTogXCJww6FnaW5hXCIsXG4gICAgd2lkdGg6IFwiYW5jaG9cIixcbiAgICBjb21tZW50VGV4dDogXCJjb21lbnRhcmlvXCIsXG4gICAgdmFsdWVOYW1lOiBcIk5vbWJyZSBkZWwgdmFsb3JcIixcbiAgICBlbmFibGVJZjogXCJIYWJpbGl0YXIgc2lcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwidmFsb3IgcG9yIGRlZmVjdG9cIixcbiAgICBjb3JyZWN0QW5zd2VyOiBcInJlc3B1ZXN0YSBjb3JyZWN0YVwiLFxuICAgIHJlYWRPbmx5OiBcInNvbG8gbGVjdHVyYVwiLFxuICAgIHZhbGlkYXRvcnM6IFwidmFsaWRhZG9yZXNcIixcbiAgICB0aXRsZUxvY2F0aW9uOiBcIkxvY2FsaXphY2nDs24gZGVsIHTDrXR1bG9cIixcbiAgICBoYXNDb21tZW50OiBcInRpZW5lIGNvbWVudGFyaW9cIixcbiAgICBoYXNPdGhlcjogXCJvdHJvXCIsXG4gICAgY2hvaWNlczogXCJvcGNpb25lc1wiLFxuICAgIGNob2ljZXNPcmRlcjogXCJvcmRlbiBkZSBvcGNpb25lc1wiLFxuICAgIGNob2ljZXNCeVVybDogXCJvcGNpb25lcyBwb3IgVVJMXCIsXG4gICAgb3RoZXJUZXh0OiBcIm90cm8gdGV4dG9cIixcbiAgICBvdGhlckVycm9yVGV4dDogXCJvdHJvIHRleHRvIGRlIEVycm9yXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiR3VhcmRhciBvdHJhcyBjb21vIGNvbWVudGFyaW9cIixcbiAgICBsYWJlbDogXCJldGlxdWV0YVwiLFxuICAgIHNob3dUaXRsZTogXCJtb3N0cmFyIHTDrXR1bG9cIixcbiAgICB2YWx1ZVRydWU6IFwiVmVyZGFkZXJvXCIsXG4gICAgdmFsdWVGYWxzZTogXCJGYWxzb1wiLFxuICAgIGNvbHM6IFwiY29sdW1uYXNcIixcbiAgICByb3dzOiBcImZpbGFzXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwibWFyY2Fkb3IgZGUgcG9zaWNpw7NuXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwiVGV4dG8gb3BjaW9uZXNcIixcbiAgICBleHByZXNzaW9uOiBcImV4cHJlc2nDs25cIixcbiAgICBmb3JtYXQ6IFwiZm9ybWF0b1wiLFxuICAgIGRpc3BsYXlTdHlsZTogXCJFc3RpbG8gdmlzdWFsaXphY2nDs25cIixcbiAgICBjdXJyZW5jeTogXCJkaXZpc2FcIixcbiAgICB1c2VHcm91cGluZzogXCJHcnVwbyBkZSB1c29cIixcbiAgICBzaG93UHJldmlldzogXCJNb3N0cmFyIHZpc3RhIHByZXZpYVwiLFxuICAgIGFsbG93TXVsdGlwbGU6IFwiUGVybWl0aXIgbcO6bHRpcGxlc1wiLFxuICAgIGltYWdlSGVpZ2h0OiBcIkFsdHVyYSBkZSBpbWFnZW5cIixcbiAgICBpbWFnZVdpZHRoOiBcImFuY2hvIGRlIGxhIGltYWdlblwiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCJHdWFyZGFyIGRhdG9zIGNvbW8gdGV4dG9cIixcbiAgICBtYXhTaXplOiBcInRhbWHDsW8gbcOheGltb1wiLFxuICAgIGh0bWw6IFwiaHRtbFwiLFxuICAgIGNvbHVtbnM6IFwiY29sdW1uYXNcIixcbiAgICBjZWxsczogXCJjw6lsdWxhc1wiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwiVG9kYXMgbGFzIGZpbGFzIHNvbiBvYmxpZ2F0b3JpYXNcIixcbiAgICBob3Jpem9udGFsU2Nyb2xsOiBcIlNjcm9sbCBIb3Jpem9udGFsXCIsXG4gICAgY2VsbFR5cGU6IFwiVGlwbyBkZSBjw6lsdWxhXCIsXG4gICAgY29sdW1uc0xheW91dDogXCJFc3RpbG8gY29sdW1uYVwiLFxuICAgIGNvbHVtbkNvbENvdW50OiBcIkNvbnRhZG9yIGNvbHVtbmFcIixcbiAgICBjb2x1bW5NaW5XaWR0aDogXCJBbmNobyBjb2x1bW5hXCIsXG4gICAgcm93Q291bnQ6IFwibsO6bWVybyBkZSBmaWxhc1wiLFxuICAgIG1pblJvd0NvdW50OiBcIkNhbnRpZGFkIG3DrW4gZGUgZmlsYXNcIixcbiAgICBtYXhSb3dDb3VudDogXCJDYW50aWRhZCBtYXggZGUgZmlsYXNcIixcbiAgICBrZXlOYW1lOiBcIk5vbWJyZSBjbGF2ZVwiLFxuICAgIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiS2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgIGNvbmZpcm1EZWxldGU6IFwiY29uZmlybWFyIGJvcnJhZG9cIixcbiAgICBjb25maXJtRGVsZXRlVGV4dDogXCJ0ZXh0byBkZSBjb25maXJtYWNpw7NuIGRlIGJvcnJhZG9cIixcbiAgICBhZGRSb3dMb2NhdGlvbjogXCJMb2NhbGl6YWNpw7NuIGHDsWFkaXIgZmlsYVwiLFxuICAgIGFkZFJvd1RleHQ6IFwiQcOxYWRpciB0ZXh0byBmaWxhXCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCJFbGltaW5hciB0ZXh0byBmaWxhXCIsXG4gICAgaXRlbXM6IFwiYXJ0w61jdWxvc1wiLFxuICAgIGl0ZW1TaXplOiBcImFydMOtY3Vsb3NcIixcbiAgICBjb2xDb3VudDogXCJDb250YWRvciBjb2x1bW5hXCIsXG4gICAgdGVtcGxhdGVUaXRsZTogXCJUw610dWxvIHRlbXBsYXRlXCIsXG4gICAgdGVtcGxhdGVEZXNjcmlwdGlvbjogXCJEZXNjcmlwY2nDs24gdGVtcGxhdGVcIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIlBlcm1pdGlyIGHDsWFkaXIgcGFuZWxcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIlBlcm1pdGlyIGVsaW1pbmFyIHBhbmVsXCIsXG4gICAgcGFuZWxDb3VudDogXCJDb250YWRvciBwYW5lbFwiLFxuICAgIG1pblBhbmVsQ291bnQ6IFwiTcOtbiBDb250YWRvciBQYW5lbFwiLFxuICAgIG1heFBhbmVsQ291bnQ6IFwiTWF4IENvbnRhZG9yIFBhbmVsXCIsXG4gICAgcGFuZWxzU3RhdGU6IFwiRXN0YWRvIHBhbmVsXCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcIlBhbmVsIGHDsWFkaXIgdGV4dG9cIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwiUGFuZWwgZWxpbWluYXIgdGV4dG9cIixcbiAgICBwYW5lbFByZXZUZXh0OiBcInBhbmVsIHByZXZpb1wiLFxuICAgIHBhbmVsTmV4dFRleHQ6IFwicGFuZWwgc2lndWllbnRlXCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCJNb3N0cmFyIG7Dum1lcm8gcHJlZ3VudGFzXCIsXG4gICAgc2hvd1JhbmdlSW5Qcm9ncmVzczogXCJNb3N0cmFyIHJhbmdvIGVuIHByb2dyZXNzb1wiLFxuICAgIHJlbmRlck1vZGU6IFwiTW9kbyByZW5kZXJpemFjacOzblwiLFxuICAgIHRlbXBsYXRlVGl0bGVMb2NhdGlvbjogXCJMb2NhbGl6YWNpw7NuIHTDrXR1bG8gZW4gdGVtcGxhdGVcIixcbiAgICByYXRlVmFsdWVzOiBcIkNhbGlmaWNhIHZhbG9yZXNcIixcbiAgICByYXRlTWluOiBcIkNhbGlmaWNhY2nDs24gbcOtbmltYVwiLFxuICAgIHJhdGVNYXg6IFwiQ2FsaWZpY2FjacOzbiBtw6F4aW1hXCIsXG4gICAgcmF0ZVN0ZXA6IFwiUGFzb1wiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCJNaW5SYXRlIERlc2NyaXBjacOzblwiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCJNYXhSYXRlIERlc2NyaXBjacOzblwiLFxuICAgIGlucHV0VHlwZTogXCJ0aXBvIGRlIGVudHJhZGFcIixcbiAgICBzaXplOiBcIlRhbGxhXCIsXG4gICAgbG9jYWxlOiBcImx1Z2FyXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOlxuICAgICAgXCJDb2xvY2Fyc2UgYXV0b23DoXRpY2FtZW50ZSBlbiBsYSBwcmltZXJhIHByZWd1bnRhXCIsXG4gICAgY29tcGxldGVkSHRtbDogXCJIVE1MIGNvbXBsZXRhZG9cIixcbiAgICBjb21wbGV0ZWRCZWZvcmVIdG1sOiBcIkhUTUwgY29tcGxldGFkbyBhbnRlc1wiLFxuICAgIGxvYWRpbmdIdG1sOiBcIkNhcmdhbmRvIEhUTUxcIixcbiAgICB0cmlnZ2VyczogXCJkaXNwYXJhZG9yZXNcIixcbiAgICBjb29raWVOYW1lOiBcIk5vbWJyZSBDb29raWVcIixcbiAgICBzZW5kUmVzdWx0T25QYWdlTmV4dDogXCJFbnZpYXIgcmVzdWx0YWRvcyBlbiBsYSBzaWd1aWVudGUgcMOhZ2luYVwiLFxuICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczogXCJNb3N0cmFyIGJvdG9uZXMgZGUgbmF2ZWdhY2nDs25cIixcbiAgICBzaG93UHJldkJ1dHRvbjogXCJNb3N0cmFyIGJvdMOzbiBwcmV2aW9cIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJNb3N0cmFyIHTDrXR1bG8gcMOhZ2luYXNcIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCJNb3N0cmFyIHDDoWdpbmEgZGUgQ29tcGxldGFkb1wiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCJNb3N0cmFyIE7Dum1lcm9zIGRlIFDDoWdpbmFcIixcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwiTG9jYWxpemFjacOzbiBkZWwgZXJyb3IgZGUgbGEgcHJlZ3VudGFcIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwiTW9zdHJhciBwcm9ncmFtYVwiLFxuICAgIG1vZGU6IFwibW9kb1wiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6IFwiSXIgYSBsYSBzaWd1aWVudGUgcMOhZ2luYSBhdXRvbcOhdGljYW1lbnRlXCIsXG4gICAgY2hlY2tFcnJvcnNNb2RlOiBcIk1vZG8gdmFsaWRhciBlcnJvcmVzXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiQm9ycmFyIHZhbG9yZXMgaW52aXNpYmxlc1wiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJUZXh0byBkZSBpbmljaW8gZGUgbGEgZW5jdWVzdGFcIixcbiAgICBwYWdlUHJldlRleHQ6IFwiVGV4dG8gcMOhZ2luYSBwcmV2aWFcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiVGV4dG8gcMOhZ2luYSBzaWd1aWVudGVcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiVGV4dG8gY29tcGxldGFkb1wiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJUZXh0byByZXF1ZXJpZG9cIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwiw41uZGljZSBpbmljaWFsIGRlIGxhIHByZWd1bnRhXCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOiBcIlTDrXR1bG8gZGVsIHRlbXBsYXRlIGRlIGxhIHByZWd1bnRhXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcIlByaW1lcmEgcMOhZ2luYSBpbmljaWFkYVwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJQw6FnaW5hIMO6bmljYVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiVGllbXBvIG3DoXhpbW8gcGFyYSBmaW5hbGl6YXJcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCJNb3N0cmFyIHRlbXBvcml6YWRvclwiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCJNb3N0cmFyIHRlbXBvcml6YWRvciBNb2RvXCIsXG4gICAgZGVmYXVsdFBhbmVsVmFsdWU6IFwiVmFsb3IgcG9yIGRlZmVjdG8gUGFuZWxcIixcbiAgICBkZWZhdWx0Um93VmFsdWU6IFwiVmFsb3IgcG9yIGRlZmVjdG8gRmlsYVwiLFxuICAgIGhhc05vbmU6IFwiTm8gdGllbmVcIixcbiAgICBub25lVGV4dDogXCJUZXh0byBuaW5ndW5vXCIsXG4gICAgdGV4dDogXCJ0ZXh0b1wiLFxuICB9LFxufTtcblxuZWRpdG9yTG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlc1wiXSA9IHNwYW5pc2hUcmFuc2xhdGlvbjtcbiIsIi8vVHJhbnNsYXRlZCBieSBUaG9tYXMgQm9yZ3N0csO2bVxuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuXG5leHBvcnQgbGV0IHN2U3RyaW5ncyA9IHtcbiAgLy9zdXJ2ZXkgdGVtcGxhdGVzXG4gIGxvY2FsZTogXCJzdlwiLFxuICBzdXJ2ZXk6IHtcbiAgICBlZGl0OiBcIlJlZGlnZXJhXCIsXG4gICAgZHJvcFF1ZXN0aW9uOiBcIkRyYSBvY2ggc2zDpHBwIGVuIGZyw6VnYSBmcsOlbiBWZXJrdHlnc2xpc3RhbiB0aWxsIHbDpG5zdGVyLlwiLFxuICAgIGNvcHk6IFwiS29waWVyYVwiLFxuICAgIGFkZFRvVG9vbGJveDogXCJMw6RnZyB0aWxsIFZlcmt0eWdzbGlzdGFuXCIsXG4gICAgZGVsZXRlUGFuZWw6IFwiUmFkZXJhIFBhbmVsXCIsXG4gICAgZGVsZXRlUXVlc3Rpb246IFwiUmFkZXJhIEZyw6VnYVwiLFxuICAgIGNvbnZlcnRUbzogXCJLb252ZXJ0ZXJhIHRpbGxcIixcbiAgICBkcmFnOiBcIkRyYSBlbGVtZW50XCIsXG4gIH0sXG4gIC8vcXVlc3Rpb25UeXBlc1xuICBxdDoge1xuICAgIGRlZmF1bHQ6IFwiU3RhbmRhcmRcIixcbiAgICBjaGVja2JveDogXCJDaGVja2JveFwiLFxuICAgIGNvbW1lbnQ6IFwiS29tbWVudGFyXCIsXG4gICAgaW1hZ2VwaWNrZXI6IFwiQmlsZC12w6RsamFyZVwiLFxuICAgIGRyb3Bkb3duOiBcIlJ1bGxnYXJkaW5zbWVueVwiLFxuICAgIGZpbGU6IFwiRmlsXCIsXG4gICAgaHRtbDogXCJIdG1sXCIsXG4gICAgbWF0cml4OiBcIk1hdHJpcyAoZW5rZWwgdmFsKVwiLFxuICAgIG1hdHJpeGRyb3Bkb3duOiBcIk1hdHJpcyhmbGVyYSB2YWwpXCIsXG4gICAgbWF0cml4ZHluYW1pYzogXCJNYXRyaXMgKGR5bmFtaXNrYSByYWRlcilcIixcbiAgICBtdWx0aXBsZXRleHQ6IFwiRmxlcmEgdGV4dGVyXCIsXG4gICAgcGFuZWw6IFwiUGFuZWxcIixcbiAgICBwYW5lbGR5bmFtaWM6IFwiUGFuZWwgKGR5bmFtaXNrIHBhbmVsKVwiLFxuICAgIHJhZGlvZ3JvdXA6IFwiUmFkaW9ncnVwcGVyXCIsXG4gICAgcmF0aW5nOiBcIlJhbmtuaW5nXCIsXG4gICAgdGV4dDogXCJFbmtlbCB0ZXh0XCIsXG4gICAgYm9vbGVhbjogXCJCb29sZWFuXCIsXG4gICAgZXhwcmVzc2lvbjogXCJGb3JtZWxcIixcbiAgfSxcbiAgLy9TdHJpbmdzIGluIEVkaXRvclxuICBlZDoge1xuICAgIGRlZmF1bHRMb2NhbGU6IFwiU3RhbmRhcmQgKHswfSlcIixcbiAgICBzdXJ2ZXk6IFwiRW5rw6R0XCIsXG4gICAgc2V0dGluZ3M6IFwiRW5rw6R0IGluc3TDpGxsbmluZ2FyXCIsXG4gICAgZWRpdFN1cnZleTogXCJSZWRpZ2VyYSBFbmvDpHRcIixcbiAgICBhZGROZXdQYWdlOiBcIkzDpGdnIHRpbGwgZW4gbnkgc2lkYVwiLFxuICAgIG1vdmVSaWdodDogXCJTY3JvbGxhIHRpbGwgaMO2Z2VyXCIsXG4gICAgbW92ZUxlZnQ6IFwiU2Nyb2xsYSB0aWxsIHbDpG5zdGVyXCIsXG4gICAgZGVsZXRlUGFnZTogXCJSYWRlcmEgc2lkYVwiLFxuICAgIGVkaXRQYWdlOiBcIlJlZGlnZXJhIHNpZGFcIixcbiAgICBlZGl0OiBcIlJlZGlnZXJhXCIsXG4gICAgbmV3UGFnZU5hbWU6IFwic2lkYVwiLFxuICAgIG5ld1F1ZXN0aW9uTmFtZTogXCJmcsOlZ2FcIixcbiAgICBuZXdQYW5lbE5hbWU6IFwicGFuZWxcIixcbiAgICB0ZXN0U3VydmV5OiBcIlRlc3QgZW5rw6R0XCIsXG4gICAgdGVzdFN1cnZleUFnYWluOiBcIlRlc3RhIGVua8OkdCBpZ2VuXCIsXG4gICAgdGVzdFN1cnZleVdpZHRoOiBcIkVua8OkdCBicmVkZDogXCIsXG4gICAgZW1iZWRTdXJ2ZXk6IFwiSW50ZWdyZXJhZCBFbmvDpHRcIixcbiAgICB0cmFuc2xhdGlvbjogXCLDlnZlcnPDpHR0bmluZ1wiLFxuICAgIHNhdmVTdXJ2ZXk6IFwiU3BhcmEgRW5rw6R0XCIsXG4gICAgZGVzaWduZXI6IFwiRW5rw6R0IERlc2lnbmVyXCIsXG4gICAganNvbkVkaXRvcjogXCJKU09OIFJlZGlnZXJpbmdcIixcbiAgICB1bmRvOiBcIsOFbmdyYVwiLFxuICAgIHJlZG86IFwiR8O2cmEgb21cIixcbiAgICBvcHRpb25zOiBcIkFsdGVybmF0aXZcIixcbiAgICBnZW5lcmF0ZVZhbGlkSlNPTjogXCJHZW5lcmVyYSBnaWx0aWcgSlNPTlwiLFxuICAgIGdlbmVyYXRlUmVhZGFibGVKU09OOiBcIkdlbmVyZXJhIGzDpHNiYXIgSlNPTlwiLFxuICAgIHRvb2xib3g6IFwiVmVya3R5Z3NsaXN0YVwiLFxuICAgIHRvb2xib3hHZW5lcmFsQ2F0ZWdvcnk6IFwiR2VuZXJlbGx0XCIsXG4gICAgZGVsU2VsT2JqZWN0OiBcIlJhZGVyYSB2YWx0IGVsZW1lbnRcIixcbiAgICBlZGl0U2VsT2JqZWN0OiBcIlJlZGlnZXJhIHZhbHQgZWxlbWVudFwiLFxuICAgIGNvcnJlY3RKU09OOiBcIlZhciB2w6RubGlnZW4ga29ycmlnZXJhIEpTT04uXCIsXG4gICAgc3VydmV5UmVzdWx0czogXCJFbmvDpHQgcmVzdWx0YXQ6IFwiLFxuICAgIHN1cnZleVJlc3VsdHNUYWJsZTogXCJTb20gdGFiZWxsXCIsXG4gICAgc3VydmV5UmVzdWx0c0pzb246IFwiU29tIEpTT05cIixcbiAgICByZXN1bHRzVGl0bGU6IFwiRnLDpWdldGl0ZWxcIixcbiAgICByZXN1bHRzTmFtZTogXCJGcsOlZ2VuYW1uXCIsXG4gICAgcmVzdWx0c1ZhbHVlOiBcIlJlc3VsdGF0IHbDpHJkZVwiLFxuICAgIHJlc3VsdHNEaXNwbGF5VmFsdWU6IFwiVmlzbmluZ3MgdsOkcmRlXCIsXG4gICAgbW9kaWZpZWQ6IFwiw4RuZHJhdFwiLFxuICAgIHNhdmluZzogXCJTcGFyYXJcIixcbiAgICBzYXZlZDogXCJTcGFyYXRcIixcbiAgICBzYXZlRXJyb3I6IFwiRmVsISBJbm5laMOlbGxldCBpIGVua8OkdGVuIMOkciBpbnRlIHNwYXJhdC5cIixcbiAgICB0cmFuc2xhdGlvbkFkZExhbmd1YWdlOiBcIlbDpGxqIHNwcsOlayBmw7ZyIG92ZXJzw6R0dG5pbmdcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxTdHJpbmdzOiBcIlZpc2EgYWxsYSBzdHLDpG5nYXJcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxQYWdlczogXCJWaXNhIGFsbGEgc2lkb3JcIixcbiAgICB0cmFuc2xhdGlvbk5vU3RyaW5nczogXCJJbmdhIHN0csOkbmdhciDDpHIgw7Z2ZXJzYXR0YS4gVsOkbmxpZ2VuIMOkbmRyYSBmaWx0cmV0LlwiLFxuICAgIHRyYW5zbGF0aW9uRXhwb3J0VG9TQ1ZCdXR0b246IFwiRXhwb3J0ZXJhIHRpbGwgQ1NWXCIsXG4gICAgdHJhbnNsYXRpb25JbXBvcnRGcm9tU0NWQnV0dG9uOiBcIkltcG9ydGVyYSBmcsOlbiBDU1ZcIixcbiAgICB0cmFuc2xhdGlvbk1lcmdlTG9jYWxlV2l0aERlZmF1bHQ6IFwiTWVyZ2VhIHswfSBtZWQgc3RhbmRhcmQgc3Byw6VrXCIsXG4gIH0sXG4gIC8vUHJvcGVydHkgbmFtZXMgaW4gdGFibGUgaGVhZGVyc1xuICBwZWw6IHtcbiAgICBpc1JlcXVpcmVkOiBcIk7DtmR2w6RuZGlnP1wiLFxuICB9LFxuICAvL1Byb3BlcnR5IEVkaXRvcnNcbiAgcGU6IHtcbiAgICBhcHBseTogXCJGYXN0w6RsbFwiLFxuICAgIG9rOiBcIk9LXCIsXG4gICAgY2FuY2VsOiBcIkF2YnJ5dFwiLFxuICAgIHJlc2V0OiBcIsOFdGVyc3TDpGxsXCIsXG4gICAgY2xvc2U6IFwiU3TDpG5nXCIsXG4gICAgZGVsZXRlOiBcIlJhZGVyYVwiLFxuICAgIGFkZE5ldzogXCJMw6RnZyB0aWxsIG55XCIsXG4gICAgYWRkSXRlbTogXCJLbGlja2EgZsO2ciBhdHQgbMOkZ2dhIHRpbGwuLi5cIixcbiAgICByZW1vdmVBbGw6IFwiVGEgYm9ydCBhbGx0XCIsXG4gICAgZWRpdDogXCJSZWRpZ2VyYVwiLFxuICAgIGl0ZW1WYWx1ZUVkaXQ6IFwiU3lubGlnIGbDtnJcIixcbiAgICBlZGl0Q2hvaWNlczogXCJSZWRpZ2VyYSB2YWxcIixcbiAgICBtb3ZlOiBcIkZseXR0YVwiLFxuICAgIGVtcHR5OiBcIjx0b20+XCIsXG4gICAgbm90RW1wdHk6IFwiPHJlZGlnZXJhIHbDpHJkZXQ+XCIsXG4gICAgZmFzdEVudHJ5OiBcIlNuYWJiIGlmeWxsbmluZ1wiLFxuICAgIGZvcm1FbnRyeTogXCJJZnlsbG5pbmcgaSBlbmvDpHRlblwiLFxuICAgIHRlc3RTZXJ2aWNlOiBcIlRlc3RhIHRqw6Ruc3RlblwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFF1ZXN0aW9uOiBcIlbDpGxqIGZyw6VnYS4uLlwiLFxuICAgIGNvbmRpdGlvblZhbHVlUXVlc3Rpb25UaXRsZTogXCJWw6RubGlnZW4gc2tyaXYgaW4vdsOkbGogdsOkcmRldFwiLFxuICAgIGNvbmRpdGlvbkJ1dHRvbkFkZDogXCJMw6RnZyB0aWxsXCIsXG4gICAgY29uZGl0aW9uQnV0dG9uUmVwbGFjZTogXCJFcnPDpHR0XCIsXG4gICAgY29uZGl0aW9uSGVscDpcbiAgICAgIFwiU2tyaXYgaW4gZXR0IGJvb2xzayB1dHRyeWNrLiBEZXQgYsO2ciByZXR1cm5lcmEgU0FOVCBmw7ZyIGF0dCBnw7ZyYSBmcsOlZ2FuL3NpZGFuIHN5bmxpZy4gVGlsbCBleGVtcGVsOiB7cXVlc3Rpb24xfSA9ICd2YWx1ZTEnIG9yICh7cXVlc3Rpb24yfSAqIHtxdWVzdGlvbjR9ICA+IDIwIGFuZCB7cXVlc3Rpb24zfSA8IDUpXCIsXG4gICAgZXhwcmVzc2lvbkhlbHA6XG4gICAgICBcIlZhciB2w6RubGlnZW4gc2tyaXYgaW4gZXR0IHV0dHJ5Y2suICBEdSBrYW4gYW52w6RuZGEgbcOlc3ZpbmdhciBmw7ZyIGF0dCBmw6UgdGlsbGfDpW5nIHRpbGwgZGV0IHNwYXJhZGUgdsOkcmRldDogJ3txdWVzdGlvbjF9ICsge3F1ZXN0aW9uMn0nLCAnKHtwcmljZX0qe3F1YW50aXR5fSkgKiAoMTAwIC0ge2Rpc2NvdW50fSknXCIsXG4gICAgYWNlRWRpdG9ySGVscDogXCJUcnljayBjdHJsK21lbGxhbnNsYWcgZsO2ciBhdHQgZsOlIGVuIGxlZHRyw6VkXCIsXG4gICAgYWNlRWRpdG9yUm93VGl0bGU6IFwiTnV2YXJhbmRlIHJhZFwiLFxuICAgIGFjZUVkaXRvclBhbmVsVGl0bGU6IFwiTnV2YXJhbmRlIHBhbmVsXCIsXG4gICAgc2hvd01vcmU6IFwiRsO2ciBtZXIgZGV0YWxqZXIgLSBzZSBkb2t1bWVudGF0aW9uZW5cIixcbiAgICBjb25kaXRpb25TaG93TW9yZVVybDpcbiAgICAgIFwiaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnlQYXJhbWV0ZXI/aWQ9UXVlc3Rpb24mcGFyYW1ldGVyPXZpc2libGVJZlwiLFxuICAgIGFzc2lzdGFudFRpdGxlOiBcIlRpbGxnw6RuZ2xpZ2EgZnLDpWdvcjpcIixcbiAgICBjZWxsc0VtcHR5Um93c0NvbHVtbnM6IFwiRGV0IGLDtnIgdmFyYSBtaW5zdCAxIGtvbHVtbiBlbGxlciByYWRcIixcblxuICAgIHByb3BlcnR5SXNFbXB0eTogXCJWw6RubGlnZW4gZnlsbCBpIGV0dCB2w6RyZGVcIixcbiAgICB2YWx1ZTogXCJWw6RyZGVcIixcbiAgICB0ZXh0OiBcIlRleHRcIixcbiAgICByb3dpZDogXCJSYWQgSURcIixcbiAgICBpbWFnZUxpbms6IFwiQmlsZCBsw6Rua1wiLFxuICAgIGNvbHVtbkVkaXQ6IFwiUmVkaWdlcmEga29sdW1uOiB7MH1cIixcbiAgICBpdGVtRWRpdDogXCJSZWRpZ2VyYSBlbGVtZW50OiB7MH1cIixcblxuICAgIHVybDogXCJVUkxcIixcbiAgICBwYXRoOiBcIlPDtmt2w6RnXCIsXG4gICAgdmFsdWVOYW1lOiBcIlbDpHJkZSBuYW1uXCIsXG4gICAgdGl0bGVOYW1lOiBcIlRpdGVsIG5hbW5cIixcblxuICAgIGhhc090aGVyOiBcIkhhciBhbm5hdCBlbGVtZW50XCIsXG4gICAgb3RoZXJUZXh0OiBcIkFubmF0XCIsXG4gICAgbmFtZTogXCJOYW1uXCIsXG4gICAgdGl0bGU6IFwiVGl0ZWxcIixcbiAgICBjZWxsVHlwZTogXCJDZWxsIHR5cFwiLFxuICAgIGNvbENvdW50OiBcIkFudGFsIGtvbHVtbmVyXCIsXG4gICAgY2hvaWNlc09yZGVyOiBcIlbDpGxqIG9yZG5pbmcgcMOlIHZhbGV0XCIsXG4gICAgdmlzaWJsZTogXCJTeW5saWc/XCIsXG4gICAgaXNSZXF1aXJlZDogXCJOw7ZkdsOkbmRpZz9cIixcbiAgICBzdGFydFdpdGhOZXdMaW5lOiBcIlN0YXJ0YSBww6UgZW4gbnkgcmFkP1wiLFxuICAgIHJvd3M6IFwiQW50YWwgcmFkZXJcIixcbiAgICBwbGFjZUhvbGRlcjogXCJNYXRhIGluIGkgZsOkbHRldFwiLFxuICAgIHNob3dQcmV2aWV3OiBcIkbDtnJoYW5kc3ZpbnNuaW5nIGF2IGJpbGQ/XCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIkxhZ3JhIGZpbGlubmVow6VsbGV0IGkgSlNPTiBzb20gdGV4dFwiLFxuICAgIG1heFNpemU6IFwiTWF4IGZpbHN0b3JsZWsgaSBieXRlc1wiLFxuICAgIGltYWdlSGVpZ2h0OiBcIkJpbGQgaMO2amRcIixcbiAgICBpbWFnZVdpZHRoOiBcIkJpbGQgYnJlZGRcIixcbiAgICByb3dDb3VudDogXCJBbnRhbCByYWRlclwiLFxuICAgIGNvbHVtbkxheW91dDogXCJTdGlsIHDDpSBrb2x1bW5cIixcbiAgICBhZGRSb3dMb2NhdGlvbjogXCJMw6RnZyB0aWxsIHJhZGtuYXBwIHBsYXRzXCIsXG4gICAgYWRkUm93VGV4dDogXCJMw6RnZyB0aWxsIGtuYXBwIHRleHRcIixcbiAgICByZW1vdmVSb3dUZXh0OiBcIlRhIGJvcnQgcmFkIGtuYXBwIHRleHRcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwiTWluc3RhIGJldHlnIGJlc2tyaXZuaW5nXCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcIk1heGltYWxhIGJldHlnIGJlc2tyaXZuaW5nXCIsXG4gICAgaW5wdXRUeXBlOiBcIkluZGF0YSB0eXBcIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJUZXh0IGbDtnIgYWx0ZXJuYXRpdlwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJTdGFuZGFyZCB2w6RyZGVcIixcbiAgICBjZWxsc0RlZmF1bHRSb3c6IFwiU3RhbmRhcmQgY2VsbCB0ZXh0ZXJcIixcblxuICAgIHN1cnZleUVkaXRvclRpdGxlOiBcIlJlZGlnZXJhIHNjaGVtYSBpbnN0w6RsbG5pbmdhclwiLFxuICAgIHFFZGl0b3JUaXRsZTogXCJSZWRpZ2VyYTogezB9XCIsXG5cbiAgICBtYXhMZW5ndGg6IFwiTWF4IGzDpG5nZFwiLFxuICAgIC8vc3VydmV5XG4gICAgc2hvd1RpdGxlOiBcIlZpc2EvZMO2bGogdGl0ZWxcIixcbiAgICBsb2NhbGU6IFwiU3RhbmRhcmQgc3Byw6VrXCIsXG4gICAgbW9kZTogXCJMw6RnZSAocmVkaWdlcmEvbMOkc2EgZW5iYXJ0KVwiLFxuICAgIGNsZWFySW52aXNpYmxlVmFsdWVzOiBcIlJlbnNhIG9zeW5saWdhIHbDpHJkZW5cIixcbiAgICBjb29raWVOYW1lOiBcIktha25hbW4gKGbDtnIgYXR0IGluYWt0aXZlcmEga8O2ciBlbmvDpHRlbiB0dsOlIGfDpW5nZXIgbG9rYWx0KVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcIlNraWNrYSBlbmvDpHQgcmVzdWx0YXRldCB0aWxsIG7DpHN0YSBzaWRhXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiTGFncmEgJ2FuZHJhJyB2w6RyZGVuIGkgZXR0IHNlcGFyYXQgZsOkbHRcIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJWaXNhIHNpZHRpdGVsXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcIlZpc2Egc2lkbnVtbWVyXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIkbDtnJlZ8OlZW5kZVwiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCJOw6RzdGFcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiRsOkcmRpZ1wiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydCBrbmFwcCB0ZXh0XCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIlZpc2EgbmF2aWdhdGlvbnNrbmFwcGFyIChzdGFuZGFyZCBuYXZpZ2VyaW5nKVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOlxuICAgICAgXCJWaXNhIGbDtnJlZ8OlZW5kZSBrbmFwcCAoYW52w6RuZGFyZW4ga2FuIGfDpSDDpXRlcmfDpSB0aWxsIGbDtnJlZ8OlZW5kZSBzaWRhKVwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCJEZW4gZsO2cnN0YSBzaWRhbiBpIGVua8OkdGVuIMOkciBzdGFydHNpZGFuLlwiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcIlZpc2EgZGVuIHNsdXRmw7ZyZGEgc2lkYW4gcMOlIHNsdXRldCAoY29tcGxldGVkSHRtbClcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOlxuICAgICAgXCJWaWQgYmVzdmFyYW5kZSBhdiBhbGxhIGZyw6Vnb3IsIGfDpSB0aWxsIG7DpHN0YSBzaWRhIGF1dG9tYXRpc2t0XCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIlZpc2EgaMOkbmRlbHNmw7ZybG9wcFwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJGcsOlZ2EgdGl0ZWwgcGxhY2VyaW5nXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcIlZhciB2w6RubGlnIHNrcml2IGVuIHRleHRcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwiRnLDpWdhIHN0YXJ0IGluZGV4ICgxLCAyIGVsbGVyICdBJywgJ2EnKVwiLFxuICAgIHNob3dRdWVzdGlvbk51bWJlcnM6IFwiVmlzYSBmcsOlZ2VudW1tZXJcIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6XG4gICAgICBcIkZyw6VnYSB0aXRlbCBtYWxsLCBzdGFuZGFyZCDDpHI6ICd7bm99LiB7cmVxdWlyZX0ge3RpdGxlfSdcIixcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwiRnLDpWdhIGZlbCBwbGFjZXJhZFwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzpcbiAgICAgIFwiRm9rdXNlcmEgcMOlIGbDtnJzdGEgZnLDpWdhbiB2aWQgw6RuZHJpbmcgYXYgc2lkYW5cIixcbiAgICBxdWVzdGlvbnNPcmRlcjogXCJFbGVtZW50IG9yZG5pbmcgcMOlIHNpZGFuXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIk1heCB0aWQgZsO2ciBhdHQgc2x1dGbDtnJhIGVua8OkdGVuXCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCJNYXggdGlkIGbDtnIgYXR0IGfDtnJhIGbDpHJkaWd0IGVuIHNpZGEgaSBlbmvDpHRlblwiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcIlZpc2EgdGlkdGFnbmluZ1wiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCJWaXNhIHRpZHRhZ25pbmcgbMOkZ2VcIixcbiAgICByZW5kZXJNb2RlOiBcIlJlbmRlcmluZyBsw6RnZVwiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwiVGlsbMOldCBhdHQgbMOkZ2dhIHRpbGwgcGFuZWxcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIlRpbGzDpXQgYXR0IHRhIGJvcnQgcGFuZWxcIixcbiAgICBwYW5lbEFkZFRleHQ6IFwiTMOkZ2cgdGlsbCBwYW5lbCB0ZXh0XCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcIlRhIGJvcnQgcGFuZWwgdGV4dFwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJWaXNhIGFsbGEgZWxlbWVudCBww6UgZW4gc2lkYVwiLFxuXG4gICAgdGFiczoge1xuICAgICAgZ2VuZXJhbDogXCJHZW5lcmVsbHRcIixcbiAgICAgIGZpbGVPcHRpb25zOiBcIkFsdGVybmF0aXZcIixcbiAgICAgIGh0bWw6IFwiSHRtbC1lZGl0b3JcIixcbiAgICAgIGNvbHVtbnM6IFwiS29sdW1uZXJcIixcbiAgICAgIHJvd3M6IFwiUmFkZXJcIixcbiAgICAgIGNob2ljZXM6IFwiVsOkbGpcIixcbiAgICAgIGl0ZW1zOiBcIkVsZW1lbnRcIixcbiAgICAgIHZpc2libGVJZjogXCJTeW5saWdcIixcbiAgICAgIGVuYWJsZUlmOiBcIlRpbGxnw6RubGlnXCIsXG4gICAgICByYXRlVmFsdWVzOiBcIk9yZG5hIHbDpHJkZW5cIixcbiAgICAgIGNob2ljZXNCeVVybDogXCJWw6RsaiBmcsOlbiB3ZWJiZW5cIixcbiAgICAgIG1hdHJpeENob2ljZXM6IFwiU3RhbmRhcmQgdmFsXCIsXG4gICAgICBtdWx0aXBsZVRleHRJdGVtczogXCJUZXh0IGluZGF0YVwiLFxuICAgICAgdmFsaWRhdG9yczogXCJWYWxpZGVyaW5nYXJcIixcbiAgICAgIG5hdmlnYXRpb246IFwiTmF2aWdlcmluZ1wiLFxuICAgICAgcXVlc3Rpb246IFwiRnLDpWdhXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sOiBcIkZ1bGxmw7ZyZCBIdG1sXCIsXG4gICAgICBsb2FkaW5nSHRtbDogXCJMYWRkYXIgSHRtbFwiLFxuICAgICAgdGltZXI6IFwiVGlkdGFnYXJlL1F1aXpcIixcbiAgICAgIHRyaWdnZXJzOiBcIlRyaWdnYXJlXCIsXG4gICAgICB0ZW1wbGF0ZVRpdGxlOiBcIk1hbGwgdGl0ZWxcIixcbiAgICB9LFxuICAgIGVkaXRQcm9wZXJ0eTogXCJSZWRpZ2VyYSBlZ2Vuc2thcCAnezB9J1wiLFxuICAgIGl0ZW1zOiBcIlsgRWxlbWVudDogezB9IF1cIixcblxuICAgIGVudGVyTmV3VmFsdWU6IFwiVsOkbmxpZ2VuIHNrcml2IGluIGV0dCB2w6RyZGUuXCIsXG4gICAgbm9xdWVzdGlvbnM6IFwiRGV0IGZpbm5zIGluZ2VuIGZyw6VnYSBpIGVua8OkdGVuLlwiLFxuICAgIGNyZWF0ZXRyaWdnZXI6IFwiVsOkbmxpZ2VuIHNrYXBhIGVuIHRyaWdnZXJcIixcbiAgICB0cmlnZ2VyT246IFwiUMOlIFwiLFxuICAgIHRyaWdnZXJNYWtlUGFnZXNWaXNpYmxlOiBcIlN5bmxpZ8O2ciBzaWRvcjpcIixcbiAgICB0cmlnZ2VyTWFrZVF1ZXN0aW9uc1Zpc2libGU6IFwiU3lubGlnw7ZyIGVsZW1lbnQ6XCIsXG4gICAgdHJpZ2dlckNvbXBsZXRlVGV4dDogXCJBdnNsdXRhIGVua8OkdCB2aWQgdmVya3N0w6RsbC5cIixcbiAgICB0cmlnZ2VyTm90U2V0OiBcIlRyaWdnZXIgw6RyIGludGUgc2F0dFwiLFxuICAgIHRyaWdnZXJSdW5JZjogXCJLw7ZyIFwiLFxuICAgIHRyaWdnZXJTZXRUb05hbWU6IFwiw4RuZHJhIHbDpHJkZW4gYXY6IFwiLFxuICAgIHRyaWdnZXJGcm9tTmFtZTogXCJLb3BpZXJhIHbDpHJkZW4gZnLDpW46IFwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uOiBcIkvDtnIgZGV0dGEgdXR0cnljazpcIixcbiAgICB0cmlnZ2VyU2V0VmFsdWU6IFwidGlsbDogXCIsXG4gICAgdHJpZ2dlcklzVmFyaWFibGU6IFwiVmFyIHbDpG5saWdlbiBza3JpdiBldHQgZ2lsdGlndCB1dHRyeWNrLlwiLFxuICB9LFxuICAvL1Byb3BlcnR5IHZhbHVlc1xuICBwdjoge1xuICAgIHRydWU6IFwidHJ1ZVwiLFxuICAgIGZhbHNlOiBcImZhbHNlXCIsXG4gICAgaW5oZXJpdDogXCJpbmhlcml0XCIsXG4gICAgc2hvdzogXCJzaG93XCIsXG4gICAgaGlkZTogXCJoaWRlXCIsXG4gICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgaW5pdGlhbDogXCJpbml0aWFsXCIsXG4gICAgcmFuZG9tOiBcInJhbmRvbVwiLFxuICAgIGNvbGxhcHNlZDogXCJjb2xsYXBzZWRcIixcbiAgICBleHBhbmRlZDogXCJleHBhbmRlZFwiLFxuICAgIG5vbmU6IFwibm9uZVwiLFxuICAgIGFzYzogXCJhc2NlbmRpbmdcIixcbiAgICBkZXNjOiBcImRlc2NlbmRpbmdcIixcbiAgICBpbmRldGVybWluYXRlOiBcImluZGV0ZXJtaW5hdGVcIixcbiAgICBkZWNpbWFsOiBcImRlY2ltYWxcIixcbiAgICBjdXJyZW5jeTogXCJjdXJyZW5jeVwiLFxuICAgIHBlcmNlbnQ6IFwicGVyY2VudFwiLFxuICAgIGZpcnN0RXhwYW5kZWQ6IFwiZmlyc3RFeHBhbmRlZFwiLFxuICAgIG9mZjogXCJvZmZcIixcbiAgICBvblBhbmVsOiBcIm9uUGFuZWxcIixcbiAgICBvblN1cnZleTogXCJvblN1cnZleVwiLFxuICAgIGxpc3Q6IFwibGlzdFwiLFxuICAgIHByb2dyZXNzVG9wOiBcInByb2dyZXNzVG9wXCIsXG4gICAgcHJvZ3Jlc3NCb3R0b206IFwicHJvZ3Jlc3NCb3R0b21cIixcbiAgICBwcm9ncmVzc1RvcEJvdHRvbTogXCJwcm9ncmVzc1RvcEJvdHRvbVwiLFxuICAgIGhvcml6b250YWw6IFwiaG9yaXpvbnRhbFwiLFxuICAgIHZlcnRpY2FsOiBcInZlcnRpY2FsXCIsXG4gICAgdG9wOiBcInRvcFwiLFxuICAgIGJvdHRvbTogXCJib3R0b21cIixcbiAgICB0b3BCb3R0b206IFwidG9wIGFuZCBib3R0b21cIixcbiAgICBsZWZ0OiBcImxlZnRcIixcbiAgICBjb2xvcjogXCJjb2xvclwiLFxuICAgIGRhdGU6IFwiZGF0ZVwiLFxuICAgIGRhdGV0aW1lOiBcImRhdGV0aW1lXCIsXG4gICAgXCJkYXRldGltZS1sb2NhbFwiOiBcImRhdGV0aW1lLWxvY2FsXCIsXG4gICAgZW1haWw6IFwiZW1haWxcIixcbiAgICBtb250aDogXCJtb250aFwiLFxuICAgIG51bWJlcjogXCJudW1iZXJcIixcbiAgICBwYXNzd29yZDogXCJwYXNzd29yZFwiLFxuICAgIHJhbmdlOiBcInJhbmdlXCIsXG4gICAgdGVsOiBcInRlbFwiLFxuICAgIHRleHQ6IFwidGV4dFwiLFxuICAgIHRpbWU6IFwidGltZVwiLFxuICAgIHVybDogXCJ1cmxcIixcbiAgICB3ZWVrOiBcIndlZWtcIixcbiAgICBoaWRkZW46IFwiaGlkZGVuXCIsXG4gICAgb246IFwib25cIixcbiAgICBvblBhZ2U6IFwib25QYWdlXCIsXG4gICAgZWRpdDogXCJlZGl0XCIsXG4gICAgZGlzcGxheTogXCJkaXNwbGF5XCIsXG4gICAgb25Db21wbGV0ZTogXCJvbkNvbXBsZXRlXCIsXG4gICAgb25IaWRkZW46IFwib25IaWRkZW5cIixcbiAgICBhbGw6IFwiYWxsXCIsXG4gICAgcGFnZTogXCJwYWdlXCIsXG4gICAgc3VydmV5OiBcInN1cnZleVwiLFxuICAgIG9uTmV4dFBhZ2U6IFwib25OZXh0UGFnZVwiLFxuICAgIG9uVmFsdWVDaGFuZ2VkOiBcIm9uVmFsdWVDaGFuZ2VkXCIsXG4gIH0sXG4gIC8vT3BlcmF0b3JzXG4gIG9wOiB7XG4gICAgZW1wdHk6IFwiaXMgZW1wdHlcIixcbiAgICBub3RlbXB0eTogXCJpcyBub3QgZW1wdHlcIixcbiAgICBlcXVhbDogXCJlcXVhbHNcIixcbiAgICBub3RlcXVhbDogXCJub3QgZXF1YWxzXCIsXG4gICAgY29udGFpbnM6IFwiY29udGFpbnNcIixcbiAgICBub3Rjb250YWluczogXCJub3QgY29udGFpbnNcIixcbiAgICBncmVhdGVyOiBcImdyZWF0ZXJcIixcbiAgICBsZXNzOiBcImxlc3NcIixcbiAgICBncmVhdGVyb3JlcXVhbDogXCJncmVhdGVyIG9yIGVxdWFsc1wiLFxuICAgIGxlc3NvcmVxdWFsOiBcImxlc3Mgb3IgZXF1YWxzXCIsXG4gIH0sXG4gIC8vRW1iZWQgd2luZG93XG4gIGV3OiB7XG4gICAgYW5ndWxhcjogXCJBbnbDpG5kIEFuZ3VsYXIgdmVyc2lvblwiLFxuICAgIGpxdWVyeTogXCJBbnbDpG5kIGpRdWVyeSB2ZXJzaW9uXCIsXG4gICAga25vY2tvdXQ6IFwiQW52w6RuZCBLbm9ja291dCB2ZXJzaW9uXCIsXG4gICAgcmVhY3Q6IFwiQW52w6RuZCBSZWFjdCB2ZXJzaW9uXCIsXG4gICAgdnVlOiBcIkFudsOkbmQgVnVlIHZlcnNpb25cIixcbiAgICBib290c3RyYXA6IFwiRsO2ciBib290c3RyYXAgZnJhbWV3b3JrXCIsXG4gICAgc3RhbmRhcmQ6IFwiSW5nZW4gYm9vdHN0cmFwXCIsXG4gICAgc2hvd09uUGFnZTogXCJWaXNhIGVua8OkdCBww6UgZW4gc2lkYVwiLFxuICAgIHNob3dJbldpbmRvdzogXCJWaXNhIGVua8OkdGVuIGkgZXR0IG55dHQgZsO2bnN0ZXJcIixcbiAgICBsb2FkRnJvbVNlcnZlcjogXCJIw6RtdGEgZW5rw6R0ZW4gc29tIEpTT04gZnLDpW4gc2VydmVyblwiLFxuICAgIHRpdGxlU2NyaXB0OiBcIlNjcmlwdHMgb2NoIHN0eWxlc1wiLFxuICAgIHRpdGxlSHRtbDogXCJIVE1MXCIsXG4gICAgdGl0bGVKYXZhU2NyaXB0OiBcIkphdmFTY3JpcHRcIixcbiAgfSxcbiAgLy9UZXN0IFN1cnZleVxuICB0czoge1xuICAgIHNlbGVjdFBhZ2U6IFwiVsOkbGogc2lkYSBmw7ZyIGF0dCB0ZXN0YSBkZW46XCIsXG4gICAgc2hvd0ludmlzaWJsZUVsZW1lbnRzOiBcIlZpc2Egb3N5bmxpZ2EgZWxlbWVudFwiLFxuICB9LFxuICB2YWxpZGF0b3JzOiB7XG4gICAgYW5zd2VyY291bnR2YWxpZGF0b3I6IFwiYW5zd2VyIGNvdW50XCIsXG4gICAgZW1haWx2YWxpZGF0b3I6IFwiZS1tYWlsXCIsXG4gICAgZXhwcmVzc2lvbnZhbGlkYXRvcjogXCJleHByZXNzaW9uXCIsXG4gICAgbnVtZXJpY3ZhbGlkYXRvcjogXCJudW1lcmljXCIsXG4gICAgcmVnZXh2YWxpZGF0b3I6IFwicmVnZXhcIixcbiAgICB0ZXh0dmFsaWRhdG9yOiBcInRleHRcIixcbiAgfSxcbiAgdHJpZ2dlcnM6IHtcbiAgICBjb21wbGV0ZXRyaWdnZXI6IFwiRW5rw6R0IHNsdXRmw7ZyZFwiLFxuICAgIHNldHZhbHVldHJpZ2dlcjogXCJTw6R0dCB2w6RyZGVcIixcbiAgICBjb3B5dmFsdWV0cmlnZ2VyOiBcIktvcGllcmEgdsOkcmRlXCIsXG4gICAgcnVuZXhwcmVzc2lvbnRyaWdnZXI6IFwiS8O2ciB1dHRyeWNrXCIsXG4gICAgdmlzaWJsZXRyaWdnZXI6IFwiw4RuZHJhIHN5bmxpZ2hldFwiLFxuICB9LFxuICAvL1Byb3BlcnRpZXNcbiAgcDoge1xuICAgIG5hbWU6IFwibmFtZVwiLFxuICAgIHRpdGxlOiB7XG4gICAgICBuYW1lOiBcInRpdGxlXCIsXG4gICAgICB0aXRsZTogXCJMw6RtbmEgZGVuIHRvbSwgaWZhbGwgZGV0IMOkciBzYW1tYSBzb20gJ05hbWUnXCIsXG4gICAgfSxcblxuICAgIG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eTogXCJuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHlcIixcbiAgICBxdWVzdGlvbnNPcmRlcjogXCJxdWVzdGlvbnNPcmRlclwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCJtYXhUaW1lVG9GaW5pc2hcIixcblxuICAgIHZpc2libGU6IFwidmlzaWJsZVwiLFxuICAgIHZpc2libGVJZjogXCJ2aXNpYmxlSWZcIixcbiAgICBxdWVzdGlvblRpdGxlTG9jYXRpb246IFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsXG4gICAgZGVzY3JpcHRpb246IFwiZGVzY3JpcHRpb25cIixcbiAgICBzdGF0ZTogXCJzdGF0ZVwiLFxuICAgIGlzUmVxdWlyZWQ6IFwiaXNSZXF1aXJlZFwiLFxuICAgIGluZGVudDogXCJpbmRlbnRcIixcbiAgICByZXF1aXJlZEVycm9yVGV4dDogXCJyZXF1aXJlZEVycm9yVGV4dFwiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwic3RhcnRXaXRoTmV3TGluZVwiLFxuICAgIGlubmVySW5kZW50OiBcImlubmVySW5kZW50XCIsXG4gICAgcGFnZTogXCJwYWdlXCIsXG5cbiAgICB3aWR0aDogXCJ3aWR0aFwiLFxuXG4gICAgY29tbWVudFRleHQ6IFwiY29tbWVudFRleHRcIixcbiAgICB2YWx1ZU5hbWU6IFwidmFsdWVOYW1lXCIsXG4gICAgZW5hYmxlSWY6IFwiZW5hYmxlSWZcIixcbiAgICBkZWZhdWx0VmFsdWU6IFwiZGVmYXVsdFZhbHVlXCIsXG4gICAgY29ycmVjdEFuc3dlcjogXCJjb3JyZWN0QW5zd2VyXCIsXG4gICAgcmVhZE9ubHk6IFwicmVhZE9ubHlcIixcbiAgICB2YWxpZGF0b3JzOiBcInZhbGlkYXRvcnNcIixcbiAgICB0aXRsZUxvY2F0aW9uOiBcInRpdGxlTG9jYXRpb25cIixcblxuICAgIGhhc0NvbW1lbnQ6IFwiaGFzQ29tbWVudFwiLFxuICAgIGhhc090aGVyOiBcImhhc090aGVyXCIsXG4gICAgY2hvaWNlczogXCJjaG9pY2VzXCIsXG4gICAgY2hvaWNlc09yZGVyOiBcImNob2ljZXNPcmRlclwiLFxuICAgIGNob2ljZXNCeVVybDogXCJjaG9pY2VzQnlVcmxcIixcbiAgICBvdGhlclRleHQ6IFwib3RoZXJUZXh0XCIsXG4gICAgb3RoZXJFcnJvclRleHQ6IFwib3RoZXJFcnJvclRleHRcIixcbiAgICBzdG9yZU90aGVyc0FzQ29tbWVudDogXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLFxuXG4gICAgbGFiZWw6IFwibGFiZWxcIixcbiAgICBzaG93VGl0bGU6IFwic2hvd1RpdGxlXCIsXG4gICAgdmFsdWVUcnVlOiBcInZhbHVlVHJ1ZVwiLFxuICAgIHZhbHVlRmFsc2U6IFwidmFsdWVGYWxzZVwiLFxuXG4gICAgY29sczogXCJjb2xzXCIsXG4gICAgcm93czogXCJyb3dzXCIsXG4gICAgcGxhY2VIb2xkZXI6IFwicGxhY2VIb2xkZXJcIixcblxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIm9wdGlvbnNDYXB0aW9uXCIsXG5cbiAgICBleHByZXNzaW9uOiBcImV4cHJlc3Npb25cIixcbiAgICBmb3JtYXQ6IFwiZm9ybWF0XCIsXG4gICAgZGlzcGxheVN0eWxlOiBcImRpc3BsYXlTdHlsZVwiLFxuICAgIGN1cnJlbmN5OiBcImN1cnJlbmN5XCIsXG4gICAgdXNlR3JvdXBpbmc6IFwidXNlR3JvdXBpbmdcIixcblxuICAgIHNob3dQcmV2aWV3OiBcInNob3dQcmV2aWV3XCIsXG4gICAgYWxsb3dNdWx0aXBsZTogXCJhbGxvd011bHRpcGxlXCIsXG4gICAgaW1hZ2VIZWlnaHQ6IFwiaW1hZ2VIZWlnaHRcIixcbiAgICBpbWFnZVdpZHRoOiBcImltYWdlV2lkdGhcIixcbiAgICBzdG9yZURhdGFBc1RleHQ6IFwic3RvcmVEYXRhQXNUZXh0XCIsXG4gICAgbWF4U2l6ZTogXCJtYXhTaXplXCIsXG5cbiAgICBodG1sOiBcImh0bWxcIixcblxuICAgIGNvbHVtbnM6IFwiY29sdW1uc1wiLFxuICAgIGNlbGxzOiBcImNlbGxzXCIsXG4gICAgaXNBbGxSb3dSZXF1aXJlZDogXCJpc0FsbFJvd1JlcXVpcmVkXCIsXG5cbiAgICBob3Jpem9udGFsU2Nyb2xsOiBcImhvcml6b250YWxTY3JvbGxcIixcbiAgICBjZWxsVHlwZTogXCJjZWxsVHlwZVwiLFxuICAgIGNvbHVtbnNMYXlvdXQ6IFwiY29sdW1uc0xheW91dFwiLFxuICAgIGNvbHVtbkNvbENvdW50OiBcImNvbHVtbkNvbENvdW50XCIsXG4gICAgY29sdW1uTWluV2lkdGg6IFwiY29sdW1uTWluV2lkdGhcIixcblxuICAgIHJvd0NvdW50OiBcInJvd0NvdW50XCIsXG4gICAgbWluUm93Q291bnQ6IFwibWluUm93Q291bnRcIixcbiAgICBtYXhSb3dDb3VudDogXCJtYXhSb3dDb3VudFwiLFxuICAgIGtleU5hbWU6IFwia2V5TmFtZVwiLFxuICAgIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgIGNvbmZpcm1EZWxldGU6IFwiY29uZmlybURlbGV0ZVwiLFxuICAgIGNvbmZpcm1EZWxldGVUZXh0OiBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgYWRkUm93TG9jYXRpb246IFwiYWRkUm93TG9jYXRpb25cIixcbiAgICBhZGRSb3dUZXh0OiBcImFkZFJvd1RleHRcIixcbiAgICByZW1vdmVSb3dUZXh0OiBcInJlbW92ZVJvd1RleHRcIixcblxuICAgIGl0ZW1zOiBcIml0ZW1zXCIsXG4gICAgaXRlbVNpemU6IFwiaXRlbVNpemVcIixcbiAgICBjb2xDb3VudDogXCJjb2xDb3VudFwiLFxuXG4gICAgdGVtcGxhdGVUaXRsZTogXCJ0ZW1wbGF0ZVRpdGxlXCIsXG4gICAgdGVtcGxhdGVEZXNjcmlwdGlvbjogXCJ0ZW1wbGF0ZURlc2NyaXB0aW9uXCIsXG4gICAgYWxsb3dBZGRQYW5lbDogXCJhbGxvd0FkZFBhbmVsXCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCJhbGxvd1JlbW92ZVBhbmVsXCIsXG4gICAgcGFuZWxDb3VudDogXCJwYW5lbENvdW50XCIsXG4gICAgbWluUGFuZWxDb3VudDogXCJtaW5QYW5lbENvdW50XCIsXG4gICAgbWF4UGFuZWxDb3VudDogXCJtYXhQYW5lbENvdW50XCIsXG4gICAgcGFuZWxzU3RhdGU6IFwicGFuZWxzU3RhdGVcIixcbiAgICBwYW5lbEFkZFRleHQ6IFwicGFuZWxBZGRUZXh0XCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcInBhbmVsUmVtb3ZlVGV4dFwiLFxuICAgIHBhbmVsUHJldlRleHQ6IFwicGFuZWxQcmV2VGV4dFwiLFxuICAgIHBhbmVsTmV4dFRleHQ6IFwicGFuZWxOZXh0VGV4dFwiLFxuICAgIHNob3dRdWVzdGlvbk51bWJlcnM6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLFxuICAgIHNob3dSYW5nZUluUHJvZ3Jlc3M6IFwic2hvd1JhbmdlSW5Qcm9ncmVzc1wiLFxuICAgIHJlbmRlck1vZGU6IFwicmVuZGVyTW9kZVwiLFxuICAgIHRlbXBsYXRlVGl0bGVMb2NhdGlvbjogXCJ0ZW1wbGF0ZVRpdGxlTG9jYXRpb25cIixcblxuICAgIHJhdGVWYWx1ZXM6IFwicmF0ZVZhbHVlc1wiLFxuICAgIHJhdGVNaW46IFwicmF0ZU1pblwiLFxuICAgIHJhdGVNYXg6IFwicmF0ZU1heFwiLFxuICAgIHJhdGVTdGVwOiBcInJhdGVTdGVwXCIsXG4gICAgbWluUmF0ZURlc2NyaXB0aW9uOiBcIm1pblJhdGVEZXNjcmlwdGlvblwiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCJtYXhSYXRlRGVzY3JpcHRpb25cIixcblxuICAgIGlucHV0VHlwZTogXCJpbnB1dFR5cGVcIixcbiAgICBzaXplOiBcInNpemVcIixcblxuICAgIGxvY2FsZTogXCJsb2NhbGVcIixcbiAgICBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWM6IFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljXCIsXG4gICAgY29tcGxldGVkSHRtbDogXCJjb21wbGV0ZWRIdG1sXCIsXG4gICAgY29tcGxldGVkQmVmb3JlSHRtbDogXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsXG4gICAgbG9hZGluZ0h0bWw6IFwibG9hZGluZ0h0bWxcIixcbiAgICB0cmlnZ2VyczogXCJ0cmlnZ2Vyc1wiLFxuICAgIGNvb2tpZU5hbWU6IFwiY29va2llTmFtZVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcInNlbmRSZXN1bHRPblBhZ2VOZXh0XCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcInNob3dOYXZpZ2F0aW9uQnV0dG9uc1wiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcInNob3dQcmV2QnV0dG9uXCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwic2hvd1BhZ2VUaXRsZXNcIixcbiAgICBzaG93Q29tcGxldGVkUGFnZTogXCJzaG93Q29tcGxldGVkUGFnZVwiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCJzaG93UGFnZU51bWJlcnNcIixcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwicXVlc3Rpb25FcnJvckxvY2F0aW9uXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcInNob3dQcm9ncmVzc0JhclwiLFxuICAgIG1vZGU6IFwibW9kZVwiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6IFwiZ29OZXh0UGFnZUF1dG9tYXRpY1wiLFxuICAgIGNoZWNrRXJyb3JzTW9kZTogXCJjaGVja0Vycm9yc01vZGVcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCJjbGVhckludmlzaWJsZVZhbHVlc1wiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJzdGFydFN1cnZleVRleHRcIixcbiAgICBwYWdlUHJldlRleHQ6IFwicGFnZVByZXZUZXh0XCIsXG4gICAgcGFnZU5leHRUZXh0OiBcInBhZ2VOZXh0VGV4dFwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCJjb21wbGV0ZVRleHRcIixcbiAgICByZXF1aXJlZFRleHQ6IFwicmVxdWlyZWRUZXh0XCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcInF1ZXN0aW9uU3RhcnRJbmRleFwiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTogXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwiZmlyc3RQYWdlSXNTdGFydGVkXCIsXG4gICAgaXNTaW5nbGVQYWdlOiBcImlzU2luZ2xlUGFnZVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwibWF4VGltZVRvRmluaXNoUGFnZVwiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcInNob3dUaW1lclBhbmVsXCIsXG4gICAgc2hvd1RpbWVyUGFuZWxNb2RlOiBcInNob3dUaW1lclBhbmVsTW9kZVwiLFxuXG4gICAgZGVmYXVsdFBhbmVsVmFsdWU6IFwiZGVmYXVsdFBhbmVsVmFsdWVcIixcbiAgICBkZWZhdWx0Um93VmFsdWU6IFwiZGVmYXVsdFJvd1ZhbHVlXCIsXG4gICAgaGFzTm9uZTogXCJoYXNOb25lXCIsXG4gICAgbm9uZVRleHQ6IFwibm9uZVRleHRcIixcblxuICAgIHRleHQ6IFwidGV4dFwiLFxuICAgIG1pblZhbHVlOiBcIm1pbmltdW0gdmFsdWVcIixcbiAgICBtYXhWYWx1ZTogXCJtYXhpbXVtIHZhbHVlXCIsXG4gICAgbWluTGVuZ3RoOiBcIm1pbnVtdW0gbGVuZ3RoXCIsXG4gICAgbWF4TGVuZ3RoOiBcIm1heGltdW0gbGVuZ3RoXCIsXG4gICAgYWxsb3dEaWdpdHM6IFwiYWxsb3cgZGlnaXRzXCIsXG4gICAgbWluQ291bnQ6IFwibWludW11bSBjb3VudFwiLFxuICAgIG1heENvdW50OiBcIm1heGltdW0gY291bnRcIixcbiAgICByZWdleDogXCJyZWd1bGFyIGV4cHJlc3Npb25cIixcbiAgfSxcbn07XG5lZGl0b3JMb2NhbGl6YXRpb24ubG9jYWxlc1tcInN2XCJdID0gc3ZTdHJpbmdzO1xuIiwiLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uLCBkZWZhdWx0U3RyaW5ncyB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcblxuZXhwb3J0IHZhciB0Z1N0cmluZ3MgPSB7XG4gIC8vIHN0cmluZ3MgZm9yIHN1cnZleSB0ZW1wbGF0ZXNcbiAgc3VydmV5OiB7XG4gICAgZWRpdDogXCLQotCw0pPQudC40YAg0LTQvtC00LDQvVwiLFxuICAgIGV4dGVybmFsSGVscExpbms6IFwi0IHQtCDQs9C40YDQuNGE0YLQsNC90Lgg0YLQsNGI0LrQuNC7INC60LDRgNC00LDQvdC4INGB0LDQstC+0LvQvdC+0LzQsNKz0L5cIixcbiAgICBleHRlcm5hbEhlbHBMaW5rVXJsOlxuICAgICAgXCJIdHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDSDJydTlva0ljb29OWmZwSWJ5cTRxUT92aWV3X2FzPXN1YnNjcmliZXJcIixcbiAgICBkcm9wUXVlc3Rpb246IFwi0JjQu9GC0LjQvNC+0YEsINGN0LvQtdC80LXQvdGC0Lgg0LTQsNGA0LrQvtGA0LjRgNC+INCw0Lcg0LHQsNGB0YLQsNC4INGH0LDQvyDQutCw0YjQuNC00LAg0LHQuNGR0YDQtdC0LlwiLFxuICAgIGNvcHk6IFwi0J3Rg9GB0YXQsNCx0LDRgNC00L7RgNOjINC60LDRgNC00LDQvVwiLFxuICAgIGFkZFRvVG9vbGJveDogXCLQmNC70L7QstCwINC60LDRgNC00LDQvSDQsdCwINCw0YHQsdC+0LHSs9C+XCIsXG4gICAgZGVsZXRlUGFuZWw6IFwi0J3QtdGB0YIg0LrQsNGA0LTQsNC90Lgg0LHQsNGB0YLQsFwiLFxuICAgIGRlbGV0ZVF1ZXN0aW9uOiBcItCd0LXRgdGCINC60LDRgNC00LDQvdC4INGB0LDQstC+0LtcIixcbiAgICBjb252ZXJ0VG86IFwi0KLQsNKT0LnQuNGAINC00L7QtNCw0L3QuCDRiNCw0LrQuyDQsdCwXCIsXG4gICAgZHJhZzogXCLQmtCw0YjQuNC00LDQvdC4INGN0LvQtdC80LXQvdGCXCJcbiAgfSxcbiAgLy8gcXVlc3Rpb25UeXBlc1xuICBxdDoge1xuICAgIGRlZmF1bHQ6IFwi0JHQviDQvdC+0LHQsNGR0L3To1wiLFxuICAgIGNoZWNrYm94OiBcItCY0L3RgtC40YXQvtCx0Lgg0LHQuNGB0ZHRgFwiLFxuICAgIGNvbW1lbnQ6IFwi0KjQsNGA0rNcIixcbiAgICBpbWFnZXBpY2tlcjogXCLQmNC90YLQuNGF0L7QsdC4INGB0YPRgNCw0YJcIixcbiAgICBkcm9wZG93bjogXCLQoNOv0LnRhdCw0YLQuCDRgtCw0YDQutC40YjTo1wiLFxuICAgIGZpbGU6IFwi0JHQvtGA0LrRg9C90LjQuCDRhNCw0LnQu9Kz0L5cIixcbiAgICBIVE1MOiBcIkhUTUxcIixcbiAgICBtYXRyaXg6IFwi0JzQsNGC0YDQuNGB0LAgKNC40L3RgtC40YXQvtCx0Lgg0YLQsNC90rPQvilcIixcbiAgICBtYXRyaXhkcm9wZG93bjogXCLQnNCw0YLRgNC40YHQsCAo0LjQvdGC0LjRhdC+0LHQuCDQsdC40YHRkdGAKVwiLFxuICAgIG1hdHJpeGR5bmFtaWM6IFwi0JzQsNGC0YDQuNGB0LAgKNGB0LDRgtGA0rPQvtC4INC00LjQvdCw0LzQuNC606MpXCIsXG4gICAgbXVsdGlwbGV0ZXh0OiBcItCc0LDRgtC90rPQvtC4INCx0LjRgdGR0YBcIixcbiAgICBwYW5lbDogXCLQkdCw0YHRgtCwICjQsdCw0YDQvtC4INCz0YPRgNOv0rPQuCDRgdCw0LLQvtC70rPQvilcIixcbiAgICBwYW5lbGR5bmFtaWM6IFwi0JHQsNGB0YLQsCAo0LHQsNGB0YLQsNKz0L7QuCDQtNC40L3QsNC80LjQutOjKVwiLFxuICAgIHJhZGlvZ3JvdXA6IFwi0JjQvdGC0LjRhdC+0LHQuCDRgtCw0L3Ss9C+XCIsXG4gICAgcmF0aW5nOiBcItCg0LXQudGC0LjQvdCzICjQvNC40pvRkdGBKVwiLFxuICAgIHRleHQ6IFwi0JLQvtGA0LjQtNC60YPQvdC40Lgg0LzQsNGC0L3To1wiLFxuICAgIGJvb2xlYW46IFwi0prQuNC80LzQsNGC0Lgg0LHRg9C706NcIixcbiAgICBleHByZXNzaW9uOiBcItCY0YTQvtC00LAgKNGC0LDQvdKz0L4g0LHQsNGA0L7QuCDRhdC+0L3QtNCw0L0pXCIsXG4gICAgZmxvd1BhbmVsOiBcItCR0LDRgdGC0LDQuCDRgdC10LvQvtCx0LBcIlxuICB9LFxuICAvLyBTdHJpbmdzIGluIEVkaXRvclxuICBlZDoge1xuICAgIGRlZmF1bHRMb2NhbGU6IFwi0JHQviDQvdC+0LHQsNGR0L3ToyAoezB9KVwiLFxuICAgIHN1cnZleTogXCLQodCw0LLQvtC70L3QvtC80LBcIixcbiAgICBzZXR0aW5nczogXCLQotCw0L3Qt9C40LzQvtGC0Lgg0YHQsNCy0L7Qu9C90L7QvNCwXCIsXG4gICAgb3BqZWN0UHJvcGVydGllc0hlYWRlcjogXCLQmNC70L7QstCw0LPTo1wiLFxuICAgIHNob3dPYmplY3RQcm9wZXJ0aWVzOiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INGF0YPRgdGD0YHQuNGP0YLSs9C+0Lgg0L7QsdGK0LXQutGCXCIsXG4gICAgaGlkZU9iamVjdFByb3BlcnRpZXM6IFwi0J/QuNC90rPQvtC9INC00L7QtNCw0L3QuCDRhdGD0YHRg9GB0LjRj9GC0rPQvtC4INC+0LHRitC10LrRglwiLFxuICAgIGVkaXRTdXJ2ZXk6IFwi0JjQstCw0Lcg0L3QsNC80YPQtNCw0L3QuCDRgdCw0LLQvtC70L3QvtC80LBcIixcbiAgICBhZGROZXdQYWdlOiBcItCh0L7RhdGC0LDQvdC4INGB0LDSs9C40YTQsNC4INC90LDQslwiLFxuICAgIG1vdmVSaWdodDogXCLQkdCwINGA0L7RgdGCINGC0L7QsSDQtNC+0LTQsNC9XCIsXG4gICAgbW92ZUxlZnQ6IFwi0JHQsCDRh9Cw0L8g0YLQvtCxINC00L7QtNCw0L1cIixcbiAgICBkZWxldGVQYWdlOiBcItCd0LXRgdGCINC60LDRgNC00LDQvdC4INGB0LDSs9C40YTQsFwiLFxuICAgIGVkaXRQYWdlOiBcItCi0LDSk9C50LjRgCDQtNC+0LTQsNC90Lgg0YHQsNKz0LjRhNCwXCIsXG4gICAgZWRpdDogXCLQotCw0pPQudC40YAg0LTQvtC00LDQvVwiLFxuICAgIG5ld1BhZ2VOYW1lOiBcItGB0LDSs9C40YTQsFwiLFxuICAgIG5ld1F1ZXN0aW9uTmFtZTogXCLRgdCw0LLQvtC7XCIsXG4gICAgbmV3UGFuZWxOYW1lOiBcItCx0LDRgdGC0LBcIixcbiAgICBuZXdUZXh0SXRlbU5hbWU6IFwi0LzQsNGC0L1cIixcbiAgICB0ZXN0U3VydmV5OiBcItCh0LDQvdK30LjRiNC4INGB0LDQstC+0LvQvdC+0LzQsFwiLFxuICAgIHRlc3RTdXJ2ZXlBZ2FpbjogXCLQkdC+0Lcg0Y/QuiDQsdC+0YAg0YHQsNC90rfQuNGIINCz0YPQt9Cw0YDQvtC90LjQtNCw0L1cIixcbiAgICB0ZXN0U3VydmV5V2lkdGg6IFwi0JTQsNGA0L7Qt9C40Lgg0YHQsNCy0L7Qu9C90L7QvNCwOlwiLFxuICAgIGxvZ2ljOiBcItCc0LDQvdGC0LjSm9C4INGB0LDQstC+0LvQvdC+0LzQsFwiLFxuICAgIGVtYmVkU3VydmV5OiBcItCh0LDQsdGC0Lgg0YHQsNCy0L7Qu9C90L7QvNCwXCIsXG4gICAgdHJhbnNsYXRpb246IFwi0KLQsNGA0rfRg9C80LBcIixcbiAgICBzYXZlU3VydmV5OiBcItCh0LDQsdGC0Lgg0YHQsNCy0L7Qu9C90L7QvNCwXCIsXG4gICAgZGVzaWduZXI6IFwi0JTQuNC00LAg0LHQsNGA0L7QvNCw0LTQsNC90Lgg0LrQvtC90YHRgtGA0YPQutGC0L7RgFwiLFxuICAgIGpzb25FZGl0b3I6IFwi0KLQsNKT0LnQuNGA0LrRg9C90LDQutC4IEpTT05cIixcbiAgICB1bmRvOiBcItCR0LXQutC+0YAg0LrQsNGA0LTQsNC9XCIsXG4gICAgcmVkbzogXCLQotCw0LrRgNC+0YBcIixcbiAgICBvcHRpb25zOiBcItCi0LDQvdC30LjQvNC+0YLSs9C+XCIsXG4gICAgZ2VuZXJhdGVWYWxpZEpTT046IFwi0KHQvtGF0YLQsNC90LggSlNPTi3QuCDQtNGD0YDRg9GB0YJcIixcbiAgICBnZW5lcmF0ZVJlYWRhYmxlSlNPTjogXCLQodC+0YXRgtCw0L3QuCBKU09OLdC4INC80LXRhdC+0L3QtNCw0LPTo1wiLFxuICAgIHRvb2xib3g6IFwi0JHQsNGB0YLQsNC4INCw0YHQsdC+0LHSs9C+XCIsXG4gICAgdG9vbGJveEdlbmVyYWxDYXRlZ29yeTogXCLQo9C80YPQvNOjXCIsXG4gICAgZGVsU2VsT2JqZWN0OiBcItCd0LXRgdGCINC60LDRgNC00LDQvdC4INC+0LHRitC10LrRgtC4INC40L3RgtC40YXQvtCx0YjRg9C00LBcIixcbiAgICBlZGl0U2VsT2JqZWN0OiBcItCi0LDSk9C50LjRgCDQtNC+0LTQsNC90Lgg0L7QsdGK0LXQutGC0Lgg0LjQvdGC0LjRhdC+0LHRiNGD0LTQsFwiLFxuICAgIGNvcnJlY3RKU09OOiBcItCY0LvRgtC40LzQvtGBLCBKU09OLdGA0L4g0LTRg9GA0YPRgdGCINC60YPQvdC10LQuXCIsXG4gICAgc3VydmV5UmVzdWx0czogXCLQndCw0YLQuNK30LDQuCDRgtCw0YjRhdC40YE6XCIsXG4gICAgc3VydmV5UmVzdWx0c1RhYmxlOiBcItKy0LDQvNGH0YPQvSDSt9Cw0LTQstCw0LtcIixcbiAgICBzdXJ2ZXlSZXN1bHRzSnNvbjogXCLSstCw0LzRh9GD0L0gSlNPTlwiLFxuICAgIHJlc3VsdHNUaXRsZTogXCLQodCw0YDQu9Cw0LLSs9Cw0Lgg0YHQsNCy0L7Qu1wiLFxuICAgIHJlc3VsdHNOYW1lOiBcItCc0LDSm9GB0LDQtNC4INGB0LDQstC+0LtcIixcbiAgICByZXN1bHRzVmFsdWU6IFwi0prQuNC80LzQsNGC0Lgg0rfQsNCy0L7QsVwiLFxuICAgIHJlc3VsdHNEaXNwbGF5VmFsdWU6IFwi0prQuNC80LzQsNGC0Lgg0L3QuNGI0L7QvdC00L7QtNCwXCIsXG4gICAgbW9kaWZpZWQ6IFwi0KLQsNKT0LnQuNGA0LTQvtC00LDRiNGD0LTQsFwiLFxuICAgIHNhdmluZzogXCLQodCw0LHRglwiLFxuICAgIHNhdmVkOiBcItCh0LDQsdGC0YjRg9C00LBcIixcbiAgICBzYXZlRXJyb3I6IFwi0KXQsNGC0L7Qs9OjISDSmtC40LzQvNCw0YLQuCDRgtCw0pPQudC40YDQutGD0L3QsNC6INGB0LDQsdGCINC90LDRiNGD0LTQsNCw0YHRgi5cIixcbiAgICB0cmFuc2xhdGlvbkFkZExhbmd1YWdlOiBcItCY0L3RgtC40YXQvtCx0Lgg0LfQsNCx0L7QvSDQsdCw0YDQvtC4INGC0LDRgNK30YPQvNCwXCIsXG4gICAgdHJhbnNsYXRpb25TaG93QWxsU3RyaW5nczogXCLQndC40YjQvtC9INC00L7QtNCw0L3QuCDSs9Cw0LzQsNC4INGB0LDRgtGA0rPQvlwiLFxuICAgIHRyYW5zbGF0aW9uU2hvd0FsbFBhZ2VzOiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INKz0LDQvNCw0Lgg0YHQsNKz0LjRhNCw0rPQvlwiLFxuICAgIHRyYW5zbGF0aW9uTm9TdHJpbmdzOiBcItCh0LDRgtGA0rPQviDQsdCw0YDQvtC4INGC0LDRgNK30YPQvNCwINCy0YPSt9GD0LQg0L3QsNC00L7RgNCw0L3QtC4g0JjQu9GC0LjQvNC+0YEsINGE0LjQu9GC0YDRgNC+INGC0LDSk9C50LjRgCDQtNC40rPQtdC0LlwiLFxuICAgIHRyYW5zbGF0aW9uRXhwb3J0VG9TQ1ZCdXR0b246IFwi0K3QutGB0L/QvtGA0YIg0LHQsCBDU1ZcIixcbiAgICB0cmFuc2xhdGlvbkltcG9ydEZyb21TQ1ZCdXR0b246IFwi0JjQvNC/0L7RgNGCINCw0LcgQ1NWXCIsXG4gICAgdHJhbnNsYXRpb25NZXJnZUxvY2FsZVdpdGhEZWZhdWx0OiBcItCv0LrSt9C+0Y8g0LrQsNGA0LTQsNC90LggezB9INCx0L4g0LvQvtC60LDQu9C4INC90L7QsdCw0ZHQvdOjXCIsXG4gICAgYm9sZDogXCLSktCw0LLRgVwiLFxuICAgIGl0YWxpYzogXCLSmtCw0rdcIixcbiAgICB1bmRlcmxpbmU6IFwi0JfQtdGA0YXQsNGCXCIsXG4gICAgZnBBZGRRdWVzdGlvbjogXCLQmNC70L7QstCw0Lgg0YHQsNCy0L7Quy4uLlwiLFxuICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbkl0ZW1UZXh0OiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvSwg0LDQs9Cw0YA6XCIsXG4gICAgbGc6IHtcbiAgICAgIC8vTG9naWMgdGFiIHN0cmluZ3NcbiAgICAgIHBhZ2VfdmlzaWJpbGl0eU5hbWU6IFwi0J3QsNC80L7QuNGI0Lgg0YHQsNKz0LjRhNCwXCIsXG4gICAgICBwYW5lbF92aXNpYmlsaXR5TmFtZTogXCLQndCw0LzQvtC40YjQuCDQsdCw0YHRgtCwXCIsXG4gICAgICBwYW5lbF9lbmFibGVOYW1lOiBcItCR0LDRgdGC0LAg0LPQuNGA0L7QvS/QutGD0YjRgtCw0LPTo1wiLFxuICAgICAgcXVlc3Rpb25fdmlzaWJpbGl0eU5hbWU6IFwi0J3QsNC80L7QuNGI0Lgg0YHQsNCy0L7Qu1wiLFxuICAgICAgcXVlc3Rpb25fZW5hYmxlTmFtZTogXCLQodCw0LLQvtC7INCz0LjRgNC+0L0v0LrRg9GI0YLQsNCz06NcIixcbiAgICAgIHF1ZXN0aW9uX3JlcXVpcmVOYW1lOiBcItCh0LDQstC+0Lsg0LjRhdGC0LjRkdGA06Mg0LDRgdGCXCIsXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlTmFtZTogXCLQndCw0LfQsNGA0YHQsNC90rfToyDRgtCw0LzQvtC8INGI0YPQtFwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZU5hbWU6IFwi0KHQsNCx0YLQuCDSm9C40LzQvNCw0YLQuCDRgdCw0LLQvtC7XCIsXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZU5hbWU6IFwi0J3Rg9GB0YXQsNCx0LDRgNC00L7RgNOjINC60LDRgNC00LDQvdC4INKb0LjQvNC80LDRgtC4INGB0LDQstC+0LtcIixcbiAgICAgIHRyaWdnZXJfc2tpcE5hbWU6IFwi0JPRg9C30LDRiNGC0LDQvSDQsdCwINGB0LDQstC+0LtcIixcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvbk5hbWU6IFwi0JjSt9GA0L4g0LrQsNGA0LTQsNC90Lgg0LjRhNC+0LTQsNC4INC40YHRgtC40YTQvtC00LDQsdCw0YDQsNC90LTQsFwiLFxuICAgICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uTmFtZTogXCLQnNCw0YLQvdC4INC40YHRgtC40YTQvtC00LDQsdCw0YDQsNC90LTQsCAn0KHQsNKz0LjRhNCw0Lgg0YLQsNGI0LDQutC60YPRgNOjJ1wiLFxuXG4gICAgICBwYWdlX3Zpc2liaWxpdHlEZXNjcmlwdGlvbjpcbiAgICAgICAgXCLQodCw0rPQuNGE0LDRgNC+INC90LDQvNC+0ZHQvSDQutCw0YDQtNCw0L0sINCw0LPQsNGAINC40YTQvtC00LDQuCDQvNCw0L3RgtC40pvToyAndHJ1ZScg0LHQsNGA0LPQsNGA0LTQvtC90LDQtC4g0JLQsNCz0LDRgNC90LAg0L7QvdGA0L4g0L3QvtC90LDQvNC+0ZHQvSDQutCw0YDQtNCw0L0uXCIsXG4gICAgICBwYW5lbF92aXNpYmlsaXR5RGVzY3JpcHRpb246XG4gICAgICAgIFwi0JHQsNGB0YLQsNGA0L4g0L3QsNC80L7RkdC9INC60LDRgNC00LDQvSwg0LDQs9Cw0YAg0LjRhNC+0LTQsNC4INC80LDQvdGC0LjSm9OjICd0cnVlJyDQsdCw0YDQs9Cw0YDQtNC+0L3QsNC0LiDQktCw0LPQsNGA0L3QsCDQvtC90YDQviDQvdC+0L3QsNC80L7RkdC9INC60LDRgNC00LDQvS5cIixcbiAgICAgIHBhbmVsX2VuYWJsZURlc2NyaXB0aW9uOlxuICAgICAgICBcItCR0LDRgdGC0LDRgNC+INCy0LAg0rPQsNC80LDQuCDRjdC70LXQvNC10L3RgtKz0L7QuCDQtNC+0YXQuNC70LjQuCDQvtC90YDQviDQvdCw0LzQvtGR0L0g0LrQsNGA0LTQsNC9LCDQsNCz0LDRgCDQuNGE0L7QtNCw0Lgg0LzQsNC90YLQuNKb06MgJ3RydWUnINCx0LDRgNCz0LDRgNC00L7QvdCw0LQuINCS0LDQs9Cw0YDQvdCwINC+0L3RgNC+INC90L7QvdCw0LzQvtGR0L0g0LrQsNGA0LTQsNC9LlwiLFxuICAgICAgcXVlc3Rpb25fdmlzaWJpbGl0eURlc2NyaXB0aW9uOlxuICAgICAgICBcItCh0LDQstC+0LvRgNC+INC90LDQvNC+0ZHQvSDQutCw0YDQtNCw0L0sINCw0LPQsNGAINC40YTQvtC00LDQuCDQvNCw0L3RgtC40pvToyAndHJ1ZScg0LHQsNGA0LPQsNGA0LTQvtC90LDQtC4g0JLQsNCz0LDRgNC90LAg0L7QvdGA0L4g0L3QvtC90LDQvNC+0ZHQvSDQutCw0YDQtNCw0L0uXCIsXG4gICAgICBxdWVzdGlvbl9lbmFibGVEZXNjcmlwdGlvbjpcbiAgICAgICAgXCLQodCw0LLQvtC70YDQviDQs9C40YDQvtC9INC60LDRgNC00LDQvSwg0LDQs9Cw0YAg0LjRhNC+0LTQsNC4INC80LDQvdGC0LjSm9OjICd0cnVlJyDQsdCw0YDQs9Cw0YDQtNC+0L3QsNC0LiDQktCw0LPQsNGA0L3QsCDQvtC90YDQviDQvdC+0L3QsNC80L7RkdC9INC60LDRgNC00LDQvS5cIixcblx0ICBxdWVzdGlvbl9yZXF1aXJlRGVzY3JpcHRpb246XG4gICAgICAgIFwi0KHQsNCy0L7QuyDSs9Cw0YLQvNOjINC80LXRiNCw0LLQsNC0LCDQstCw0pvRgtC1INC60Lgg0LjRhNC+0LTQsNC4INC80LDQvdGC0LjSm9OjICd0cnVlJyDQsdCw0YDQs9Cw0YDQtNC+0L3QsNC0LlwiLFxuICAgICAgdHJpZ2dlcl9jb21wbGV0ZURlc2NyaXB0aW9uOlxuICAgICAgICBcItCS0LDSm9GC0LUsINC60Lgg0LjRhNC+0LTQsNC4INC80LDQvdGC0LjSm9OjICd0cnVlJyDQsdCw0YDQs9Cw0YDQtNC+0L3QsNC0LCDQvtC9INCy0LDSm9GCINOvINKz0LDQvNGH0YPQvSDRgtCw0LzQvtC8INGI0YPQtNCwINKz0LjRgdC+0LHQuNC00LAg0LzQtdGI0LDQstCw0LQg0LLQsCDQuNGB0YLQuNGE0L7QtNCw0LHQsNGAINGB0LDSs9C40YTQsNC4ICfQodCw0rPQuNGE0LDQuCDRgtCw0YjQsNC60LrRg9GA06MnLdGA0L4g0LzQtdCx0LjQvdCw0LQuXCIsXG4gICAgICB0cmlnZ2VyX3NldHZhbHVlRGVzY3JpcHRpb246XG4gICAgICAgIFwi0JLQsNKb0YLQtSwg0LrQuCDSm9C40LzQvNCw0YLQuCDRgdCw0LLQvtC70rPQviwg0LrQuCDQtNCw0YAg0LjRhNC+0LTQsNC4INC80LDQvdGC0LjSm9OjINC40YHRgtC40YTQvtC00LAg0LzQtdGI0LDQstCw0LQsINGC0LDSk9C50LjRgCDQvNC10YjQsNCy0LDQvdC0INCy0LAg0LjRhNC+0LTQsNC4INC80LDQvdGC0LjSm9OjICd0cnVlJyDQsdCw0YDQvNC10LPQsNGA0LTQvtC90LDQtCwg0L7QvSDQs9C+0rMg0LHQsCDRgdCw0LLQvtC70Lgg0LjQvdGC0LjRhdC+0LHRiNGD0LTQsCDSm9C40LzQvNCw0YIg0YHQsNCx0YIg0LzQtdGI0LDQstCw0LQuXCIsXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcItCS0LDSm9GC0LUsINC60Lgg0pvQuNC80LzQsNGC0rPQvtC4INGB0LDQstC+0LvSs9C+LCDQutC4INC00LDRgCDQuNGE0L7QtNCw0Lgg0LzQsNC90YLQuNKb06Mg0LjRgdGC0LjRhNC+0LTQsCDQvNC10YjQsNCy0LDQvdC0LCDRgtCw0pPQudC40YAg0LzQtdGR0LHQsNC90LQg0LLQsCDQuNGE0L7QtNCwINKb0LjQvNC80LDRgtC4ICd0cnVlJyDQsdCw0YDQvNC10LPQsNGA0LTQvtC90LDQtCwg0L7QvSDQs9C+0rMg0Y/QuiDSm9C40LzQvNCw0YLQuCDRgdCw0LLQvtC70Lgg0LjQvdGC0LjRhdC+0LHRiNGD0LTQsCDQsdCwINC00LjQs9Cw0YAg0YHQsNCy0L7QuyDQvdGD0YHRhdCw0LHQsNGA0LTQvtGA06Mg0LrQsNGA0LTQsCDQvNC10YjQsNCy0LDQtC5cIixcbiAgICAgIHRyaWdnZXJfc2tpcERlc2NyaXB0aW9uOlxuICAgICAgICBcItCS0LDSm9GC0LUsINC60Lgg0LjRhNC+0LTQsNC4INC80LDQvdGC0LjSm9OjICd0cnVlJyDQsdCw0YDQvNC10LPQsNGA0LTQvtC90LDQtCwg0L7QvSDQs9C+0rMg0YHQsNCy0L7Qu9C90L7QvNCwINCx0LAg0YHQsNCy0L7Qu9C4INC40L3RgtC40YXQvtCx0YjRg9C00LAg0YDQsNCy0L7QvdCwINC80LXRiNCw0LLQsNC0LlwiLFxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uRGVzY3JpcHRpb246XG4gICAgICAgIFwi0JLQsNKb0YLQtSwg0LrQuCDQuNGE0L7QtNCw0Lgg0LzQsNC90YLQuNKb06MgJ3RydWUnINCx0LDRgNC80LXQs9Cw0YDQtNC+0L3QsNC0LCDQvtC9INCz0L7SsyDQuNGE0L7QtNCw0Lgg0LjRgdGC0LjRhNC+0LTQsNCx0LDRgCDQuNK30YDQviDQvNC10YjQsNCy0LDQtC4g0KjRg9C80L4sINCx0L4g0YXQvtKz0LjRiCwg0LzQtdGC0LDQstC+0L3QtdC0INC90LDRgtC40rfQsNC4INC40L0g0LjRhNC+0LTQsNGA0L4g0LHQsCDRgdCw0LLQvtC70Lgg0LjQvdGC0LjRhdC+0LHRiNGD0LTQsCDQsdCw0YXRiNC10LQuXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25EZXNjcmlwdGlvbjpcbiAgICAgICAgXCLQkNCz0LDRgCDQuNGE0L7QtNCw0Lgg0LzQsNC90YLQuNKb06MgJ3RydWUnINCx0LDRgNCz0LDRgNC00L7QvdCw0LQsINC+0L0g0LPQvtKzINC80LDRgtC9INCx0L4g0L3QvtCx0LDRkdC906Mg0LHQsNGA0L7QuCAn0YHQsNKz0LjRhNCw0Lgg0YLQsNGI0LDQutC60YPRgNOjJyDRgtCw0pPQudC40YAg0LzQtdGI0LDQstCw0LQg0LHQsCDQuNGI0L7RgNCw0YjRg9C00LAuXCIsXG5cbiAgICAgIGl0ZW1FeHByZXNzaW9uVGV4dDogXCLQktCw0pvRgtC1LCDQutC4INC40YTQvtC00LA6ICd7MH0nINCx0LDRgNC80LXQs9Cw0YDQtNC+0L3QsNC0ICd0cnVlJzpcIiwgLy97MH0gLSB0aGUgZXhwcmVzc2lvblxuICAgICAgcGFnZV92aXNpYmlsaXR5VGV4dDogXCLQodCw0rPQuNGE0LDQuCB7MH0t0YDQviDQvdCw0LzQvtGR0L0g0LrQsNGA0LTQsNC9IFwiLCAvL3swfSBwYWdlIG5hbWVcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlUZXh0OiBcItCR0LDRgdGC0LDQuCB7MH0t0YDQviDQvdCw0LzQvtGR0L0g0LrQsNGA0LTQsNC9XCIsIC8vezB9IHBhbmVsIG5hbWVcbiAgICAgIHBhbmVsX2VuYWJsZVRleHQ6IFwi0JHQsNGB0YLQsNC4IHswfS3RgNC+INCz0LjRgNC+0L0g0LrQsNGA0LTQsNC9XCIsIC8vezB9IHBhbmVsIG5hbWVcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlUZXh0OiBcItCh0LDQstC+0LvQuCB7MH0t0YDQviDQvdCw0LzQvtGR0L0g0LrQsNGA0LTQsNC9XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWVcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZVRleHQ6IFwi0KHQsNCy0L7Qu9C4IHswfS3RgNC+INC90LDQvNC+0ZHQvSDQutCw0YDQtNCw0L1cIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgcXVlc3Rpb25fcmVxdWlyZVRleHQ6IFwi0KHQsNCy0L7Qu9C4IHswfS3RgNC+INKz0LDRgtC806Mg0LrQsNGA0LTQsNC9XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWVcbiAgICAgIHRyaWdnZXJfY29tcGxldGVUZXh0OiBcItCh0LDQstC+0LvQvdC+0LzQsCDSs9Cw0LzRh9GD0L0g0LDQvdK30L7QvNGI0YPQtNCwINGC0LDSk9C50LjRgCDQvNC10ZHQsdCw0LRcIixcbiAgICAgIHRyaWdnZXJfc2V0dmFsdWVUZXh0OiBcItCR0LAg0YHQsNCy0L7Qu9C4IHswfSDSm9C40LzQvNCw0YLQuCB7MX0t0YDQviDRgdCw0LHRgiDQutCw0YDQtNCw0L1cIiwgLy97MH0gcXVlc3Rpb24gbmFtZSwgezF9IHNldFZhbHVlXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZVRleHQ6IFwi0J3Rg9GB0YXQsNCx0LDRgNC00L7RgNOjINC60LDRgNC00LDQvSDQsdCwINGB0LDQstC+0LvQuCB7MH0g0pvQuNC80LzQsNGCINCw0Lcg0YHQsNCy0L7Qu9C4IHsxfVwiLCAvL3swfSBhbmQgezF9IHF1ZXN0aW9uIG5hbWVzXG4gICAgICB0cmlnZ2VyX3NraXBUZXh0OiBcItCh0LDQstC+0LvQvdC+0LzQsCDQvNC10LPRg9C30LDRgNCw0LQg0LHQsCDRgdCw0LLQvtC70LggezB9XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWVcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvblRleHQxOiBcItCY0rfRgNC+INC60LDRgNC00LDQvdC4INC40YTQvtC00LDQuDogJ3swfSdcIiwgLy97MH0gdGhlIGV4cHJlc3Npb25cbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvblRleHQyOiBcItCy0LAg0L3QsNGC0LjSt9Cw0Lgg0L7QvdGA0L4g0LHQsCDRgdCw0LLQvtC70LggezB9INCz0YPQt9C+0YjRgtCw0L1cIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uVGV4dDpcbiAgICAgICAgXCLQndC40YjQvtC9INC00L7QtNCw0L3QuCDQvNCw0YLQvdC4INC40YHRgtC40YTQvtC00LDQsdCw0YAg0LTQsNGAICfQodCw0rPQuNGE0LDQuCDRgtCw0YjQsNC60LrRg9GA06MnXCIsXG5cbiAgICAgIGV4cHJlc3Npb25FZGl0b3JUaXRsZTogXCLQotCw0L3Qt9C40LzQvtGC0Lgg0LzQsNC90YLQuNKb0Lgg0LjRhNC+0LTQsFwiLFxuXG4gICAgICBkZWxldGVPcGVyYXRpb246IFwi0J3QtdGB0YIg0LrQsNGA0LTQsNC90Lgg0LDQvNCw0LvQuNGR0YJcIixcbiAgICAgIGFkZE5ld09wZXJhdGlvbjogXCLQmNC70L7QstCwINC60LDRgNC00LDQvdC4INCw0LzQsNC70LjRkdGC0Lgo0rPQvtC4KSDQvdCw0LJcIixcblxuICAgICAgZXhwcmVzc2lvbkludmFsaWQ6XG4gICAgICAgIFwi0JjRhNC+0LTQsNC4INC80LDQvdGC0LjSm9OjINGF0L7Qu9OjINGRINCx0LXRjdGK0YLQuNCx0L7RgCDQvNC10LHQvtGI0LDQtC4g0JjQu9GC0LjQvNC+0YEsINC40YHQu9C+0rMg0LrRg9C90LXQtC5cIixcbiAgICAgIG5vT3BlcmF0aW9uRXJyb3I6IFwi0JjQu9GC0LjQvNC+0YEsINCw0pvQsNC70LDQvSDRj9C6INCw0LzQsNC70LjRkdGC0YDQviDQuNC70L7QstCwINC60YPQvdC10LQuXCIsXG4gICAgICBvcGVyYXRpb25JbnZhbGlkOiBcItCY0LvRgtC40LzQvtGBLCDRhdCw0YLQvtCz0LjSs9C+0YDQviDQtNCw0YAg0LDQvNCw0LvQuNGR0YIo0rPQvikt0Lgg0YXRg9C0INC40YHQu9C+0rMg0LrRg9C90LXQtC5cIlxuICAgIH1cbiAgfSxcbiAgLy8gUHJvcGVydHkgbmFtZXMgaW4gdGFibGUgaGVhZGVyc1xuICBwZWw6IHtcbiAgICBpc1JlcXVpcmVkOiBcItKy0LDRgtC806M/XCJcbiAgfSxcbiAgLy8gUHJvcGVydHkgRWRpdG9yc1xuICBwZToge1xuICAgIGFwcGx5OiBcItCh0LDQsdGCXCIsXG4gICAgb2s6IFwiT0tcIixcbiAgICBzYXZlOiBcItCh0LDQsdGCINC60LDRgNC00LDQvVwiLFxuICAgIGNhbmNlbDogXCLQkdC10LrQvtGAINC60LDRgNC00LDQvVwiLFxuICAgIHJlc2V0OiBcItCf0LDRgNGC0L7RhNGC0LDQvVwiLFxuICAgIGNsb3NlOiBcItCc0LDRhdC60LDQvCDQutCw0YDQtNCw0L1cIixcbiAgICBkZWxldGU6IFwi0J3QtdGB0YIg0LrQsNGA0LTQsNC9XCIsXG4gICAgYWRkOiBcItCY0LvQvtCy0LAg0LrQsNGA0LTQsNC9XCIsXG4gICAgQWRkbmV3OiBcItCY0LvQvtCy0LAg0LrQsNGA0LTQsNC90Lgg0L3QsNCyXCIsXG4gICAgYWRkSXRlbTogXCLQn9Cw0YXRiCDQutGD0L3QtdC0LCDQsdCw0YDQvtC4INC40LvQvtCy0LAg0LrQsNGA0LTQsNC90Lgg0Y3Qu9C10LzQtdC90YIuLi5cIixcbiAgICBhZGRPdGhlcjogXCLQlNC40LPQsNGAXCIsXG4gICAgYWRkU2VsZWN0QWxsOiBcItCY0L3RgtC40YXQvtCxINC60LDRgNC00LDQvdC4INKz0LDQvNCw0Lgg0L3Rg9Kb0YLQsNKz0L5cIixcbiAgICBhZGROb25lOiBcItKy0LjRh9OjXCIsXG4gICAgcmVtb3ZlQWxsOiBcItKy0LDQvNCw0YDQviDQvdC10YHRgiDQutCw0YDQtNCw0L1cIixcbiAgICBlZGl0OiBcItCi0LDSk9C50LjRgCDQtNC+0LTQsNC9XCIsXG4gICAgYmFjazogXCLQkdC+0LfQs9Cw0YjRgiDQsdC1INGB0LDQsdGCXCIsXG4gICAgc2F2ZUFuZEJhY2s6IFwi0KHQsNCx0YIg0LrQsNGA0LTQsNC9INCy0LAg0LHQvtC30LPQsNGI0YLQsNC9XCIsXG4gICAgaXRlbVZhbHVlRWRpdDogXCLQndC40YjQvtC9INC00L7QtNCw0L0sINCw0LPQsNGAXCIsXG4gICAgZWRpdENob2ljZXM6IFwi0KLQsNKT0LnQuNGAINC00L7QtNCw0L3QuCDQuNC90YLQuNGF0L7QsVwiLFxuICAgIG1vdmU6IFwi0rbQvtC50LjQstCw0LfQutGD0L3To1wiLFxuICAgIGVtcHR5OiBcIjzRhdC+0LvToz5cIixcbiAgICBub3RFbXB0eTogXCI80YLQsNKT0LnQuNGAINC00L7QtNCw0L3QuCDSm9C40LzQvNCw0YI+XCIsXG4gICAgZmFzdEVudHJ5OiBcItCU0LDRgNC+0LzQsNC00Lgg0YLQtdC3XCIsXG4gICAgZm9ybUVudHJ5OiBcItCk0L7RgNC80LDQuCDQtNCw0YDQvtC80LDQtFwiLFxuICAgIHRlc3RTZXJ2aWNlOiBcItCi0LXRgdGC0Lgg0YXQuNC30LzQsNGC0YDQsNGB0L7QvdOjXCIsXG4gICAgaXRlbVNlbGVjdG9yRW1wdHk6IFwi0JjQu9GC0LjQvNC+0YEsINGN0LvQtdC80LXQvdGC0YDQviDQuNC90YLQuNGF0L7QsSDQutGD0L3QtdC0XCIsXG4gICAgY29uZGl0aW9uU2VsZWN0UXVlc3Rpb246IFwi0KHQsNCy0L7Qu9GA0L4g0LjQvdGC0LjRhdC+0LEg0LrRg9C90LXQtCAuLi5cIixcbiAgICBjb25kaXRpb25TZWxlY3RQYWdlOiBcItCh0LDSs9C40YTQsNGA0L4g0LjQvdGC0LjRhdC+0LEg0LrRg9C90LXQtCAuLi5cIixcbiAgICBjb25kaXRpb25TZWxlY3RQYW5lbDogXCLQkdCw0YHRgtCw0YDQviDQuNC90YLQuNGF0L7QsSDQutGD0L3QtdC0IC4uLlwiLFxuICAgIGNvbmRpdGlvblZhbHVlUXVlc3Rpb25UaXRsZTogXCLQmNC70YLQuNC80L7RgSwg0pvQuNC80LzQsNGC0YDQviDQstC+0YDQuNC0L9C40L3RgtC40YXQvtCxINC60YPQvdC10LRcIixcbiAgICBjb25kaXRpb25CdXR0b25BZGQ6IFwi0JjQu9C+0LLQsCDQutCw0YDQtNCw0L1cIixcbiAgICBjb25kaXRpb25CdXR0b25SZXBsYWNlOiBcItCY0LLQsNC3INC60LDRgNC00LDQvVwiLFxuICAgIGNvbmRpdGlvbkhlbHA6XG4gICAgICBcItCY0LvRgtC40LzQvtGBLCDQuNGE0L7QtNCw0Lgg0LzQsNC90YLQuNKb0LjRgNC+INCy0L7RgNC40LQg0LrRg9C90LXQtC4g0JHQvtGP0LQg0pvQuNC80LzQsNGC0LggJ3RydWUnINCx0LDRgNCz0LDRgNC00L7QvdCw0LQsINCx0LDRgNC+0Lgg0YHQsNCy0L7Quy/RgdCw0rPQuNGE0LAg0L3QvtCx0LDRkdC9INCx0L7RiNCw0LQsINC80LjRgdC+0Ls6Li4ge9Ch0LDQstC+0LsxfSA9ICfSm9C40LzQvNCw0YIxJyDRkSAoe9Ch0LDQstC+0LsyfSAqIHvQodCw0LLQvtC7NH0+IDIwINCy0LAge9Ch0LDQstC+0LszfSA8NSlcIixcbiAgICBleHByZXNzaW9uSGVscDpcbiAgICAgIFwi0JjQu9GC0LjQvNC+0YEsINC40YTQvtC00LDRgNC+INCy0L7RgNC40LQg0LrRg9C90LXQtC4g0KjRg9C80L4g0LzQtdGC0LDQstC+0L3QtdC0INKb0LDQstC30rPQvtC4INK30LjQvdCz0LjQu9Cw0YDQviDQuNGB0YLQuNGE0L7QtNCwINC60YPQvdC10LQsINCx0LDRgNC+0Lgg0LTQsNGB0YLRgNCw0YHToyDQs9C40YDQuNGE0YLQsNC9INCx0LAg0pvQuNC80LzQsNGC0rPQvtC4INGB0LDQstC+0Ls6ICd70KHQsNCy0L7QuzF9ICsge9Ch0LDQstC+0LsyfScsICcoe9C90LDRgNGFfSp70YjRg9C80L7RgNCwfSkgKiAoMTAwIC0ge9GC0LDRhdGE0LjRhH0pLlwiLFxuICAgIGFjZUVkaXRvckhlbHA6IFwi0KLRg9Cz0LzQsNKz0L7QuCBDdHJsK9Cf0YDQvtCx0LXQuyDQv9Cw0YXRiCDQutGD0L3QtdC0LCDQsdCw0YDQvtC4INCz0LjRgNC40YTRgtCw0L3QuCDQuNGI0L7RgNCw0rPQvtC4INC606/QvNCw0LrTo1wiLFxuICAgIGFjZUVkaXRvclJvd1RpdGxlOiBcItCh0LDRgtGA0rPQvtC4INK30L7RgNOjXCIsXG4gICAgYWNlRWRpdG9yUGFuZWxUaXRsZTogXCLQkdCw0YHRgtCw0Lgg0rfQvtGA06NcIixcbiAgICBzaG93TW9yZTogXCLQkdCw0YDQvtC4INCz0LjRgNC40YTRgtCw0L3QuCDQvNCw0YrQu9GD0LzQvtGC0Lgg0LzRg9GI0LDRhdGF0LDRgdGC0LDRgCwg0LjQu9GC0LjQvNC+0YEsINCx0LAg0LTQsNGB0YLRg9GA0LDQvNCw0Lsg0LPRg9C30LDRgNC10LRcIixcbiAgICBjb25kaXRpb25TaG93TW9yZVVybDpcbiAgICAgIFwiSHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnlQYXJhbWV0ZXI/aWQ9UXVlc3Rpb27Ctm1ldGVyPXZpc2libGVJZlwiLFxuICAgIGFzc2lzdGFudFRpdGxlOiBcItCh0LDQstC+0LvSs9C+0Lgg0LTQsNGB0YLRgNCw0YE6XCIsXG4gICAgY2VsbHNFbXB0eVJvd3NDb2x1bW5zOiBcItCR0L7Rj9C0INCw0pvQsNC70LDQvSDRj9C6INGB0LDRgtGAINGRINGB0YPRgtGD0L0g0LHQvtGI0LDQtFwiLFxuXG4gICAgcHJvcGVydHlJc0VtcHR5OiBcItCY0LvRgtC40LzQvtGBLCDSm9C40LzQvNCw0YLRgNC+INCy0L7RgNC40LQg0LrRg9C90LXQtFwiLFxuXHQgIHByb3BlcnR5TmFtZUlzTm90VW5pcXVlOiBcItCb0YPRgtGE0LDQvSDRj9C6INC90L7QvNC4INCx0LXSs9Cw0LzRgtC+INCy0L7RgNC40LQg0LrRg9C90LXQtFwiLFxuICAgIGxpc3RJc0VtcHR5OiBcItKy0L7Qu9Cw0YLQuCDQvdCw0LIg0LjQu9C+0LLQsCDQutGD0L3QtdC0XCIsXG5cdCAgZXhwcmVzc2lvbklzRW1wdHk6IFwi0JjQsdC+0YDQsNC4INGF0L7Qu9OjINCw0YHRglwiLFxuICAgIHZhbHVlOiBcItKa0LjQvNC80LDRglwiLFxuICAgIHRleHQ6IFwi0JzQsNGC0L1cIixcbiAgICByb3dpZDogXCJJRC3QuCDRgdCw0YLRgFwiLFxuICAgIGltYWdlTGluazogXCLQmNGB0YLQuNC90L7QtCDQsdCwINGB0YPRgNCw0YJcIixcbiAgICBjb2x1bW5FZGl0OiBcItCY0LLQsNC3INC00L7QtNCw0L3QuCDRgdGD0YLRg9C9OiB7MH1cIixcbiAgICBpdGVtRWRpdDogXCLQotCw0pPQudC40YAg0LTQvtC00LDQvdC4INGN0LvQtdC80LXQvdGCOiB7MH1cIixcblxuICAgIHVybDogXCJVUkxcIixcbiAgICBwYXRoOiBcItCg0L7Ss1wiLFxuICAgIHZhbHVlTmFtZTogXCLQndC+0LzQuCDQvdGD0pvRgtCwXCIsXG4gICAgdGl0bGVOYW1lOiBcItCh0LDRgNC70LDQstKz0LDQuCDQvdGD0pvRgtCwXCIsXG5cdCAgdGl0bGVQbGFjZWhvbGRlcjogXCLQodCw0YDQu9Cw0LLSs9CwINCy0L7RgNC40LQg0LrRg9C90LXQtFwiLFxuICAgIHN1cnZleVRpdGxlUGxhY2Vob2xkZXI6IFwi0KHQsNGA0LvQsNCy0rPQsNC4INC/0YPRgNGB0LjRiNGA0L4g0LLQvtGA0LjQtCDQutGD0L3QtdC0XCIsXG4gICAgcGFnZVRpdGxlUGxhY2Vob2xkZXI6IFwi0KHQsNGA0LvQsNCy0rPQsNC4INGB0LDSs9C40YTQsNGA0L4g0LLQvtGA0LjQtCDQutGD0L3QtdC0XCIsXG4gICAgZGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCLQotCw0LLRgdC40YTRgNC+INCy0L7RgNC40LQg0LrRg9C90LXQtFwiLFxuICAgIHN1cnZleURlc2NyaXB0aW9uUGxhY2Vob2xkZXI6IFwi0KLQsNCy0YHQuNGE0Lgg0L/Rg9GA0YHQuNGI0YDQviDQstC+0YDQuNC0INC60YPQvdC10LRcIixcbiAgICBwYWdlRGVzY3JpcHRpb25QbGFjZWhvbGRlcjogXCLQotCw0LLRgdC40YTQuCDRgdCw0rPQuNGE0LDRgNC+INCy0L7RgNC40LQg0LrRg9C90LXQtFwiLFxuICBcbiAgICBoYXNPdGhlcjogXCLQndGD0pvRgtCw0LggJ9CU0LjQs9Cw0YAnINCy0YPSt9GD0LQg0LDRgdGCXCIsXG4gICAgb3RoZXJUZXh0OiBcItCc0LDQvdGC0Lgg0L3Rg9Kb0YLQsNC4ICfQlNC40LPQsNGAJ1wiLFxuICAgIGhhc05vbmU6IFwi0K/Qs9C+0L0g0L3Rg9Kb0YLQsCDQstGD0rfRg9C0INC90LDQtNC+0YDQsNC0XCIsXG4gICAgbm9uZVRleHQ6IFwi0JzQsNGC0L3QuCDQvdGD0pvRgtCw0LggJ9Ky0LjSt9OjJ1wiLFxuICAgIGhhc1NlbGVjdEFsbDogXCLSstCw0LzQsNC4INC90YPSm9GC0LDSs9C+0YDQviDQuNC90YLQuNGF0L7QsSDQutCw0YDQtNCw0L1cIixcbiAgICBzZWxlY3RBbGxUZXh0OiBcItCc0LDRgtC90Lgg0L3Rg9Kb0YLQsCAn0rLQsNC80LDQuCDQvdGD0pvRgtCw0rPQvtGA0L4g0LjQvdGC0LjRhdC+0LEg0LrQsNGA0LTQsNC9J1wiLFxuICAgIGNob2ljZXNNaW46IFwi0prQuNC80LzQsNGC0Lgg0LzQuNC90LjQvNCw0LvToyDQsdCw0YDQvtC4INGN0LvQtdC80LXQvdGC0rPQvtC4INGB0L7RhdGC0LDRiNGD0LTQsCDQsdC+INGA0L7Ss9C4INCw0LLRgtC+0LzQsNGC06NcIixcbiAgICBjaG9pY2VzTWF4OiBcItKa0LjQvNC80LDRgtC4INC80LDQutGB0LjQvNCw0LvToyDQsdCw0YDQvtC4INGN0LvQtdC80LXQvdGC0rPQvtC4INGB0L7RhdGC0LDRiNGD0LTQsCDQsdC+INGA0L7Ss9C4INCw0LLRgtC+0LzQsNGC06NcIixcbiAgICBjaG9pY2VzU3RlcDogXCLQpNCw0YDSm9C40Y/RgiDQsdCw0LnQvdC4INGN0LvQtdC80LXQvdGC0rPQvtC4INGB0L7RhdGC0LDRiNGD0LTQsCDQsdC+INGA0L7Ss9C4INCw0LLRgtC+0LzQsNGC06NcIixcbiAgICBuYW1lOiBcItCd0L7QvFwiLFxuICAgIHRpdGxlOiBcItCh0LDRgNC70LDQstKz0LBcIixcbiAgICBjZWxsVHlwZTogXCLQndCw0LzQtNGD0Lgg0LrQsNGC0LDQutGH0LBcIixcbiAgICBDb2xDb3VudDogXCLQqNGD0LzQvtGA0LDQuCDRgdGD0YLRg9C90rPQvlwiLFxuICAgIGNob2ljZXNPcmRlcjogXCLQmNC90YLQuNGF0L7QsSDQutCw0YDQtNCw0L3QuCDRhNCw0YDQvNC+0LjRiNC4INC40L3RgtC40YXQvtCxXCIsXG4gICAgdmlzaWJsZTogXCLQndC40YjQvtC9INC00L7QtNCw0L0/XCIsXG4gICAgaXNSZXF1aXJlZDogXCLSstCw0YLQvNOjP1wiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwi0rLQsNC80LDQuCDRgdCw0YLRgNKz0L4g0LHQsNGA0L7QuCDQv9GD0YDQutGD0L3ToyDSs9Cw0YLQvNOjINC80LXQsdC+0YjQsNC0XCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwi0JjQvSDQvNCw0LnQtNC+0L0g0LHQsNGA0L4g0L/Rg9GA0LrRg9C906Mg0rPQsNGC0LzQuNGB0YJcIixcbiAgICBzdGFydFdpdGhOZXdMaW5lOiBcItCQ0Lcg0YHQsNGC0YDQuCDQvdCw0LIg0YHQsNGAINC60LDRgNC00LDQvT9cIixcbiAgICByb3dzOiBcItCo0YPQvNC+0YDQsNC4INGB0LDRgtGA0rPQvlwiLFxuICAgIFBsYWNlSG9sZGVyOiBcItK20L7QudC00L7RgFwiLFxuICAgIHNob3dQcmV2aWV3OiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INC/0LXRiNC90LDQvNC+0LjRiD9cIixcbiAgICBzdG9yZURhdGFBc1RleHQ6IFwi0J3QuNCz0L7SsyDQtNC+0YjRgtCw0L3QuCDQtNC+0YXQuNC70Lgg0YTQsNC50Lsg0LTQsNGAINGE0L7RgNC80LDRgtC4IEpTT04g0rPQsNC80YfRg9C9INC80LDRgtC9XCIsXG4gICAgTWF4U2l6ZTogXCLQkNC90LTQvtC30LDQuCDQvNCw0LrRgdC40LzQsNC70LjQuCDRhNCw0LnQuyDQtNCw0YAg0LHQsNC50YJcIixcbiAgICBJbWFnZUhlaWdodDogXCLQkdCw0LvQsNC90LTQuNC4INGB0YPRgNCw0YJcIixcbiAgICBJbWFnZVdpZHRoOiBcItCU0LDRgNC+0LfQuNC4INGB0YPRgNCw0YJcIixcbiAgICByb3dDb3VudDogXCLQqNGD0LzQvtGA0LDQuCDRgdCw0YLRgNKz0L5cIixcbiAgICBjb2x1bW5MYXlvdXQ6IFwi0JzQsNC60LXRgtC4INGB0YPRgtGD0L3Ss9C+XCIsXG4gICAgYWRkUm93TG9jYXRpb246IFwi0JjQu9C+0LLQsCDQutCw0YDQtNCw0L3QuCDSt9C+0LnQuCDRgtGD0LPQvNCw0Lgg0YHQsNGC0YBcIixcbiAgICBhZGRSb3dUZXh0OiBcItCY0LvQvtCy0LAg0LrQsNGA0LTQsNC90Lgg0LzQsNGC0L3QuCDRgtGD0LPQvNCw0Lgg0YHQsNGC0YBcIixcbiAgICByZW1vdmVSb3dUZXh0OiBcItCd0LXRgdGCINC60LDRgNC00LDQvdC4INGC0YPQs9C80LDQuCDQvNCw0YLQvVwiLFxuICAgIHJhdGVNaW46IFwi0KDQtdC50YLQuNC90LPQuCDQvNC40L3QuNC80LDQu9OjXCIsXG4gICAgcmF0ZU1heDogXCLQoNC10LnRgtC40L3Qs9C4INC80LDQutGB0LjQvNCw0LvTo1wiLFxuICAgIHJhdGVTdGVwOiBcItKa0LDQtNCw0LzQuCDRgNC10LnRgtC40L3Qs1wiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCLQnNCw0YrQu9GD0LzQvtGCINCx0LDRgNC+0Lgg0YDQtdC50YLQuNC90LPQuCDQvNC40L3QuNC80LDQu9OjXCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcItCc0LDRitC70YPQvNC+0YIg0LHQsNGA0L7QuCDRgNC10LnRgtC40L3Qs9C4INC80LDQutGB0LjQvNCw0LvTo1wiLFxuICAgIGlucHV0VHlwZTogXCLQndCw0LzRg9C00Lgg0LTQvtGF0LjQu9C60YPQvdOjXCIsXG4gICAgb3B0aW9uc0NhcHRpb246IFwi0KLQsNC90LfQuNC80L7RgtKz0L7QuCDQuNC80LfQvlwiLFxuICAgIERlZmF1bHRWYWx1ZTogXCLSmtC40LzQvNCw0YLQuCDQvdC+0LHQsNGR0L1cIixcbiAgICBjZWxsc0RlZmF1bHRSb3c6IFwi0JzQsNGC0L3QuCDQvdC+0LHQsNGR0L3QuCDQutCw0YLQsNC6XCIsXG4gIFxuICAgIHN1cnZleUVkaXRvclRpdGxlOiBcItCi0LDQvdC30LjQvNC+0YLQuCDRgdCw0LLQvtC70L3QvtC80LBcIixcbiAgICBxRWRpdG9yVGl0bGU6IFwi0KLQsNKT0LnQuNGAINC00L7QtNCw0L3QuDogezB9XCIsXG4gIFxuICAgIG1heExlbmd0aDogXCLQqNGD0LzQvtGA0LDQuCDQvNCw0LrRgdC40LzQsNC706NcIixcblx0ICBidWlsZEV4cHJlc3Npb246IFwi0KHQvtGF0YLQsNC9XCIsXG4gICAgZWRpdEV4cHJlc3Npb246IFwi0KLQsNKz0YDQuNGAINC60YPQvdC10LRcIixcbiAgICBhbmQ6IFwi0JLQkFwiLFxuICAgIG9yOiBcItCBXCIsXG4gICAgcmVtb3ZlOiBcItK20L7QudC40LLQsNC30LrRg9C906NcIixcbiAgICBhZGRDb25kaXRpb246IFwi0YjQsNGA0YIg0LjQu9C+0LLQsCDQutGD0L3QtdC0XCIsXG4gIFxuICAgIC8vc3VydmV5XG4gICAgc2hvd1RpdGxlOiBcItCd0LjRiNC+0L0v0L/QuNC90rPQvtC9INC60LDRgNC00LDQvdC4INGB0LDRgNC70LDQstKz0LBcIixcbiAgICBsb2NhbGU6IFwi0JfQsNCx0L7QvSDQsdCwINC90L7QsdCw0ZHQvVwiLFxuICAgIHNpbXVsYXRvcjogXCLQotCw0rfSs9C40LfQvtGC0YDQviDQuNC90YLQuNGF0L7QsSDQutGD0L3QtdC0XCIsXG4gICAgbGFuZHNjYXBlT3JpZW50YXRpb246IFwi0JzQsNC90LfQsNGA0LDQstOjXCIsXG4gICAgbW9kZTogXCLQndCw0LzRg9C0ICjRgtCw0pPQudC40YDQvtGCL9C90LDQvNC+0LjRiClcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCLQotC+0LfQsCDQutCw0YDQtNCw0L3QuCDSm9C40LzQvNCw0YLSs9C+0Lgg0L3QvtGR0LDQvVwiLFxuICAgIGNvb2tpZU5hbWU6IFwi0J3QvtC80LggQ29va2llICjQutGD0YjRgtCw0L3QuCDRgtCw0LrRgNC+0YDQsNC9INC70L7QutCw0LvToyDQs9GD0LfQsNGI0YLQsNC90Lgg0YHQsNCy0L7Qu9C90L7QvNCwKVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INC90LDRgtC40rfQsNC4INGB0LDQstC+0LvQvdC+0LzQsCDQtNCw0YAg0YHQsNKz0LjRhNCw0Lgg0L3QsNC30LTQuNC6XCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwi0J3QuNCz0L7SsyDQtNC+0YjRgtCw0L3QuCDSm9C40LzQvNCw0YLQuCAn0JTQuNCz0LDRgCcg0LTQsNGAINC80LDQudC00L7QvdC4INCw0LvQvtKz0LjQtNCwXCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC90Lgg0YHQsNGA0LvQsNCy0rPQsNC4INGB0LDSs9C40YTQsFwiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCLQndC40YjQvtC9INC00L7QtNCw0L3QuCDRgNCw0pvQsNC80Lgg0YHQsNKz0LjRhNCwXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcItCc0LDRgtC9INC00LDRgCDRgtGD0LPQvNCw0LggJ9Ch0LDSs9C40YTQsNC4INC/0LXRiNGC0LDRgNCwJ1wiLFxuICAgIHBhZ2VOZXh0VGV4dDogXCLQnNCw0YLQvSDQtNCw0YAg0YLRg9Cz0LzQsNC4ICfQodCw0rPQuNGE0LDQuCDQvtGP0L3QtNCwJ1wiLFxuICAgIGNvbXBsZXRlVGV4dDogXCLQnNCw0YLQvSDQtNCw0YAg0YLRg9Cz0LzQsNC4ICfQkNC90rfQvtC8INC00L7QtNCw0L0nXCIsXG4gICAgc3RhcnRTdXJ2ZXlUZXh0OiBcItCc0LDRgtC9INC00LDRgCDRgtGD0LPQvNCw0LggJ9Ch0LDRgCDQutCw0YDQtNCw0L0nXCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INGC0YPQs9C80LDSs9C+0Lgg0L3QvtCy0LHQsNGA06MgKNC90L7QstCx0LDRgNC40Lgg0L3QvtCx0LDRkdC9KVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INGC0YPQs9C80LDQuCAn0KHQsNKz0LjRhNCw0Lgg0L/QtdGI0YLQsNGA0LAnICjQuNGB0YLQuNGE0L7QtNCw0LHQsNGAINC80LXRgtCw0LLQvtC90LDQtCDQsdCwINGB0LDSs9C40YTQsNC4INC/0LXRiNGC0LDRgNCwINCx0LDRgNCz0LDRgNC00LDQtClcIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwi0KHQsNKz0LjRhNCw0Lgg0Y/QutGD0LzQuCDRgdCw0LLQvtC70L3QvtC80LAg0YHQsNKz0LjRhNCw0Lgg0YHQsNGA0YjQsNCy0LDQvdC00LAg0LzQtdCx0L7RiNCw0LQuXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC90Lgg0YHQsNKz0LjRhNCwINCx0L4g0LzQsNGC0L0g0LTQsNGAINCw0L3St9C+0LzQuCDQv9GD0YDQutGD0L3ToyAoSFRNTC3QuCDRgdCw0rPQuNGE0LDQuCDQsNC90rfQvtC8KVwiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6IFwi0JPRg9C30LDRgNC40Ygg0LHQsCDRgdCw0rPQuNGE0LDQuCDQvtGP0L3QtNCwINCx0LAg0YDQvtKz0Lgg0LDQstGC0L7QvNCw0YLToyDQtNCw0YAg0rPQvtC70LDRgtC4INC/0YPRgNC60YPQvdC40Lgg0rPQsNC80LDQuCDRgdCw0LLQvtC70rPQvlwiLFxuICAgIHNob3dQcm9ncmVzc0JhcjogXCLQndC40YjQvtC9INC00L7QtNCw0L3QuCDQv9C10YjRgNCw0LLQuNC4INC/0YPRgNC60YPQvdOjXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcItK20L7QudCz0LjRgNGI0LDQstC40Lgg0YHQsNGA0LvQsNCy0rPQsNC4INGB0LDQstC+0LtcIixcbiAgICByZXF1aXJlZFRleHQ6IFwi0JDQu9C+0LzQsNGCINCx0LDRgNC+0Lgg0YHQsNCy0L7Qu9C4INKz0LDRgtC806NcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwi0JjQvdC00LXQutGB0Lgg0YHQsNGA0YjQsNCy0LjQuCDRgdCw0LLQvtC7ICgxLCAyINGRICdBJywgJ9CwJylcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INC90L7QvNC10YDQuCDRgdCw0LLQvtC7XCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOiBcItCd0LDQvNGD0L3QsNC4INC90L7QvNC4INGB0LDQstC+0LvQvdC+0LzQsCwg0rPQsNC80YfRg9C9INC90L7QsdCw0ZHQvToge9C80LDRgtC90YDQvn0ge9GC0LDQu9Cw0LF9IHvQvdCw0LzQtdC60YPQvdCw0LR9LlwiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCLSttC+0LnQs9C40YDQutGD0L3QuNC4INGF0LDRgtC+0LPQuNC4INGB0LDQstC+0LvQvdC+0LzQsFwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzogXCLQk9GD0LfQsNGA0LjRiCDQsdCwINGB0LDQstC+0LvQuCDRj9C60YPQvCDQtNCw0YAg0LjQstCw0LfQutGD0L3QuNC4INGB0LDSs9C40YTQsFwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcItCc0YPRgNCw0YLRgtCw0LHRgdC+0LfQuNC4INGN0LvQtdC80LXQvdGC0rPQviDQtNCw0YAg0YHQsNKz0LjRhNCwXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcItCS0LDSm9GC0Lgg0LzQsNC60YHQuNC80LDQu9OjINC00LDRgCDRgdC+0L3QuNGP0rPQviwg0LHQsNGA0L7QuCDQv9GD0YAg0LrQsNGA0LTQsNC90Lgg0YHQsNCy0L7Qu9C90L7QvNCwXCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCLQktCw0pvRgtC4INC80LDQutGB0LjQvNCw0LvToyDQtNCw0YAg0YHQvtC90LjRj9Kz0L4sINCx0LDRgNC+0Lgg0L/Rg9GAINC60LDRgNC00LDQvdC4INGB0LDSs9C40YTQsNC4INGB0LDQstC+0LvQvdC+0LzQsFwiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INCx0LDRgdGC0LDQuCDQstCw0pvRgtGB0LDQvdK3XCIsXG4gICAgc2hvd1RpbWVyUGFuZWxNb2RlOiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INKz0L7Qu9Cw0YLQuCDQsdCw0YHRgtCw0Lgg0YLQsNC50LzQtdGAXCIsXG4gICAgUmVuZGVyTW9kZTogXCLSstC+0LvQsNGC0Lgg0LLQuNC30YPQsNC70LjQt9Cw0YLRgdC40Y9cIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcItCY0rfQvtC30LDRgiDQtNC+0LTQsNC9INCx0LAg0LjQu9C+0LLQsCDQutCw0YDQtNCw0L3QuCDQsdCw0YHRgtCw0rPQvlwiLFxuICAgIGFsbG93UmVtb3ZlUGFuZWw6IFwi0JjSt9C+0LfQsNGCINC00L7QtNCw0L0g0LHQsCDQvdC10YHRgiDQutCw0YDQtNCw0L3QuCDQsdCw0YHRgtCw0rPQvlwiLFxuICAgIHBhbmVsQWRkVGV4dDogXCLQmNC70L7QstCw0Lgg0LzQsNGC0L0g0LHQsCDQsdCw0YHRgtCwXCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcItCd0LXRgdGCINC60LDRgNC00LDQvdC4INC80LDRgtC9INCx0LAg0LHQsNGB0YLQsFwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCLQndC40YjQvtC9INC00L7QtNCw0L3QuCDSs9Cw0LzQsNC4INGN0LvQtdC80LXQvdGC0rPQviDQtNCw0YAg0Y/QuiDRgdCw0rPQuNGE0LBcIixcbiAgICBIVE1MOiBcIkhUTUxcIixcbiAgICBleHByZXNzaW9uOiBcItCY0YTQvtC00LBcIixcbiAgXG4gICAgbWluVmFsdWU6IFwi0prQuNC80LzQsNGC0Lgg0LzQuNC90LjQvNCw0LvTo1wiLFxuICAgIG1heFZhbHVlOiBcItKa0LjQvNC80LDRgtC4INC80LDQutGB0LjQvNCw0LvTo1wiLFxuICAgIG1JTkxFTkdUSDogXCLQlNCw0YDQvtC30LjQuCDQvNC40L3QuNC80LDQu9OjXCIsXG4gICAgYWxsb3dEaWdpdHM6IFwi0JjSt9C+0LfQsNGCINC00L7QtNCw0L3QuCDRgNCw0pvQsNC80rPQvlwiLFxuICAgIG1pbkNvdW50OiBcItCo0YPQvNC+0YDQsNC4INC80LjQvdC40LzQsNC706NcIixcbiAgICBtYXhDb3VudDogXCLQqNGD0LzQvtGA0LDQuCDQvNCw0LrRgdC40LzQsNC706NcIixcbiAgICByZWdleDogXCLQmNGE0L7QtNCw0Lgg0YDQtdCz0YPQu9GP0YDTo1wiLFxuICBcbiAgICB0b3RhbFRleHQ6IFwi0KLQtdC60YHRgtC4INGD0LzRg9C806NcIixcbiAgICB0b3RhbFR5cGU6IFwi0J3QsNC80YPQtNC4INGD0LzRg9C806NcIixcbiAgICB0b3RhbEV4cHJlc3Npb246IFwi0JjRhNC+0LTQsNC4INGD0LzRg9C806NcIixcbiAgICB0b3RhbERpc3BsYXlTdHlsZTogXCLQo9GB0LvRg9Cx0Lgg0L3QsNC80L7QuNGI0Lgg0YPQvNGD0LzTo1wiLFxuICAgIHRvdGFsQ3VycmVuY3k6IFwi0JDRgdGK0L7RgNC4INGD0LzRg9C806NcIixcbiAgICB0b3RhbEZvcm1hdDogXCLQndCw0LzRg9C00Lgg0YPQvNGD0LzTo1wiLFxuXHQvLyBIZWFkZXIgIGFkb3JuZXJcbiAgICBsb2dvUG9zaXRpb246IFwi0rbQvtC50LPQuNGA0YjQsNCy0LjQuCDQu9C+0LPQvtGC0LjQv1wiLFxuICAgIGFkZExvZ286IFwi0JjQu9C+0LLQsNC4INC70L7Qs9C+0YLQuNC/Li4uXCIsXG4gICAgY2hhbmdlTG9nbzogXCLQotCw0pPQudC40YAg0LTQvtC00LDQvdC4INC70L7Qs9C+0YLQuNC/Li4uXCIsXG4gICAgbG9nb1Bvc2l0aW9uczoge1xuICAgICAgbm9uZTogXCLQoNCw0LfQvNC10YHRgtC40YLRjCDQu9C+0LPQvtGC0LjQv1wiLFxuICAgICAgbGVmdDogXCLQkNC3INGH0LDQv1wiLFxuICAgICAgcmlnaHQ6IFwi0JTQsNGAINGC0LDRgNCw0YTQuCDRgNC+0YHRglwiLFxuICAgICAgdG9wOiBcItCQ0Lcg0LHQvtC70L5cIixcbiAgICAgIGJvdHRvbTogXCLQkNC3INC/0L7RkdC9XCJcbiAgICB9LFxuXG4gICAgdGFiczoge1xuICAgICAgZ2VuZXJhbDogXCLQo9C80YPQvNOjXCIsXG4gICAgICBmaWxlT3B0aW9uczogXCLQotCw0L3Qt9C40LzQvtGC0rPQvlwiLFxuICAgICAgSFRNTDogXCLQmNCy0LDQt9C60YPQvdCw0LrQuCBIVE1MXCIsXG4gICAgICBjb2x1bW5zOiBcItCh0YPRgtGD0L3Ss9C+XCIsXG4gICAgICByb3dzOiBcItCh0LDRgtGA0rPQvlwiLFxuICAgICAgY2hvaWNlczogXCLQmNC90YLQuNGF0L7QsVwiLFxuICAgICAgaXRlbXM6IFwi0K3Qu9C10LzQtdC90YLSs9C+XCIsXG4gICAgICB2aXNpYmxlSWY6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC9LCDQsNCz0LDRgFwiLFxuICAgICAgZW5hYmxlSWY6IFwi0JTQsNGB0YLRgNCw0YEg0LDRgdGCLCDQsNCz0LDRgFwiLFxuICAgICAgcmVxdWlyZWRJZjogXCLSstCw0YLQvNOjINCx0LDRgNC+0Lgg0L/Rg9GA0LrRg9C906MsINCw0LPQsNGAXCIsXG4gICAgICByYXRlVmFsdWVzOiBcItCR0LDSs9C+0LTQuNKz0LjQuCDSm9C40LzQvNCw0YLQsdCw0rPQvtC4INGB0LDQstC+0LtcIixcbiAgICAgIGNob2ljZXNCeVVybDogXCLQmNC90YLQuNGF0L7QsSDQsNC3INC40L3RgtC10YDQvdC10YJcIixcbiAgICAgIG1hdHJpeENob2ljZXM6IFwi0JjQvdGC0LjRhdC+0LHQuCDQvdC+0LHQsNGR0L1cIixcbiAgICAgIG11bHRpcGxlVGV4dEl0ZW1zOiBcItCU0L7RhdC40LvQutGD0L3QuNC4INGP0LrRh9Cw0L3QtCDQvNCw0LnQtNC+0L3Rh9Cw0rPQvtC4INC80LDRgtC906NcIixcbiAgICAgIHZhbGlkYXRvcnM6IFwi0JLQsNC70LjQtNCw0YLQvtGA0rPQvlwiLFxuICAgICAgbmF2aWdhdGlvbjogXCLQndC+0LLQsdCw0YDTo1wiLFxuICAgICAgcXVlc3Rpb246IFwi0KHQsNCy0L7Qu1wiLFxuICAgICAgY29tcGxldGVkSHRtbDogXCJIVE1MLdC4INGB0LDSs9C40YTQsNC4INC90LDRgtC40rfQsNCy06NcIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbjogXCJIVE1MLdC4INGB0LDSs9C40YTQsNC4INC90LDRgtC40rfQsNCy06Mg0LTQsNGAINGI0LDRgNGC0LhcIixcbiAgICAgIGxvYWRpbmdIdG1sOiBcItCR0L7RgNC60YPQvdC40LggSFRNTFwiLFxuICAgICAgdGltZXI6IFwi0JLQsNKb0YLRgdCw0L3Sty/QktC40LrRgtC+0YDQuNC90LBcIixcbiAgICAgIGNhbGN1bGF0ZWRWYWx1ZXM6IFwi0prQuNC80LzQsNGC0rPQvtC4INKz0LjRgdC+0LHQutGD0L3To1wiLFxuICAgICAgdHJpZ2dlcnM6IFwi0KLRgNC40LPQs9C10YDSs9C+XCIsXG4gICAgICB0ZW1wbGF0ZVRpdGxlOiBcItCd0L7QvNC4INC90LDQvNGD0L3QsFwiLFxuICAgICAgdG90YWxzOiBcItCd0LDRgtC40rfQsNKz0L5cIixcblx0ICAgIGxvZ2ljOiBcItCc0LDQvdGC0LjSm1wiLFxuICAgICAgbGF5b3V0OiBcItCi0LDRgNKzXCIsXG4gICAgICBkYXRhOiBcItCc0LDRitC70YPQvNC+0YJcIixcbiAgICAgIHZhbGlkYXRpb246IFwi0KHQsNC90rfQtdC0XCIsXG4gICAgICBjZWxsczogXCLSstGD0rfQsNC50YDQsNKz0L5cIixcbiAgICAgIHNob3dPbkNvbXBsZXRlZDogXCLQlNCw0YAg0L7RhdC40YAg0L3QuNGI0L7QvSDQtNC40rPQtdC0XCIsXG4gICAgICBsb2dvOiBcItCb0L7Qs9C40YLQuNC/INC00LDRgCDRgdCw0YDQu9Cw0LLSs9Cw0Lgg0YHQsNCy0L7Qu9C90L7QvNCwXCIsXG4gICAgICBvdGhlcnM6IFwi0JTQuNCz0LDRgFwiXG4gICAgfSxcbiAgICBlZGl0UHJvcGVydHk6IFwi0KLQsNKT0LnQuNGA0Lgg0YXQvtGB0LjRj9GC0LggJ3swfSdcIixcbiAgICBpdGVtczogXCJb0K3Qu9C10LzQtdC90YLSs9C+OiB7MH1dXCIsXG4gIFxuICAgIGVudGVyTmV3VmFsdWU6IFwi0JjQu9GC0LjQvNC+0YEsINKb0LjQvNC80LDRgtGA0L4g0LLQvtGA0LjQtCDQutGD0L3QtdC0LlwiLFxuICAgIG5vcXVlc3Rpb25zOiBcItCU0LDRgCDRgdCw0LLQvtC70L3QvtC80LAg0Y/Qs9C+0L0g0YHQsNCy0L7QuyDQvdC10YHRglwiLFxuICAgIGNyZWF0ZXRyaWdnZXI6IFwi0JjQu9GC0LjQvNC+0YEsINGC0YDQuNCz0LPQtdGA0YDQviDRgdC+0LfQtdC0XCIsXG4gICAgdHJpZ2dlck9uOiBcItCeXCIsXG4gICAgdHJpZ2dlck1ha2VQYWdlc1Zpc2libGU6IFwi0KHQsNKz0LjRhNCw0rPQvtGA0L4g0L3QsNC80L7RkdC9INC60LDRgNC00LDQvTpcIixcbiAgICB0cmlnZ2VyTWFrZVF1ZXN0aW9uc1Zpc2libGU6IFwi0K3Qu9C10LzQtdC90YLSs9C+0YDQviDQvdC+0LzQsNGR0L0g0LrQsNGA0LTQsNC9OlwiLFxuICAgIHRyaWdnZXJDb21wbGV0ZVRleHQ6IFwi0KLQsNC80L7QvCDQutCw0YDQtNCw0L3QuCDRgdCw0LLQvtC70L3QvtC80LAsINCw0LPQsNGAINKz0LDQvNCwINC40rfRgNC+INGI0LDQstCw0LQuXCIsXG4gICAgdHJpZ2dlck5vdFNldDogXCLQotGA0LjQs9Cz0LXRgCDRgdCw0LHRgiDQvdCw0YjRg9C00LDQsNGB0YIuXCIsXG4gICAgdHJpZ2dlclJ1bklmOiBcItCh0LDRgCDQutCw0YDQtNCw0L0sINCw0LPQsNGAXCIsXG4gICAgdHJpZ2dlclNldFRvTmFtZTogXCLQotCw0pPQudC40YDQuCDSm9C40LzQvNCw0YI6XCIsXG4gICAgdHJpZ2dlckZyb21OYW1lOiBcItCd0YPRgdGF0LDQsdCw0YDQtNC+0YDToyDQutCw0YDQtNCw0L3QuCDSm9C40LzQvNCw0YIg0LDQtzpcIixcbiAgICB0cmlnZ2VyUnVuRXhwcmVzc2lvbjogXCLQmNK30YDQviDQutCw0YDQtNCw0L3QuCDQuNC9INC40YTQvtC00LA6XCIsXG4gICAgdHJpZ2dlclNldFZhbHVlOiBcItCx0LA6XCIsXG4gICAgdHJpZ2dlckdvdG9OYW1lOiBcItCT0YPQt9Cw0YDQuNGIINCx0LAg0YHQsNCy0L7QuzpcIixcbiAgICB0cmlnZ2VySXNWYXJpYWJsZTogXCLQotCw0pPQudC40YDRkdCx0LDQvdC00LDRgNC+INCx0LAg0L3QsNGC0LjSt9Cw0Lgg0YHQsNCy0L7Qu9C90L7QvNCwINC90LDQs9GD0LfQvtGI0YLQsNC9LlwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uRW1wdHk6IFwi0JjQu9GC0LjQvNC+0YEsINKb0LjQvNC80LDRgtC4INC00YPRgNGD0YHRgtGA0L4g0LLQvtGA0LjQtCDQutGD0L3QtdC0LlwiXG4gIH0sXG4gIC8vIFByb3BlcnR5IHZhbHVlc1xuICBwdjoge1xuICAgIHRydWU6IFwidHJ1ZVwiLFxuICAgIGZhbHNlOiBcImZhbHNlXCIsXG4gICAgaW5oZXJpdDogXCLQnNC10YDQvtGB0LPQuNGA06Mg0LrQsNGA0LTQsNC9XCIsXG4gICAgc2hvdzogXCLQndC40YjQvtC9INC00L7QtNCw0L1cIixcbiAgICBoaWRlOiBcItCf0LjQvdKz0L7QvSDQutCw0YDQtNCw0L1cIixcbiAgICBkZWZhdWx0OiBcItCd0L7QsdCw0ZHQvdOjXCIsXG4gICAgaW5pdGlhbDogXCLQotCw0YDRgtC40LHQvtGC0Lgg0LDQstCy0LDQu9CwXCIsXG4gICAgcmFuZG9tOiBcItCi0LDRgNGC0LjQsdC+0YLQuCDRgtCw0YHQvtC00YPRhNOjXCIsXG4gICAgY29sbGFwc2VkOiBcItKa0LDRgtGKINGI0YPQtFwiLFxuICAgIGV4cGFuZGVkOiBcItCX0LjRkdC0INGI0YPQtFwiLFxuICAgIG5vbmU6IFwi0J3QtVwiLFxuICAgIGFzYzogXCLQkdCwINC60LDQu9C+0L3RiNCw0LLTo1wiLFxuICAgIGRlc2M6IFwi0JHQsCDQutCw0LzRiNCw0LLTo1wiLFxuICAgIGluZGV0ZXJtaW5hdGU6IFwi0J3QvtC80YPQsNC50Y/QvVwiLFxuICAgIGRlY2ltYWw6IFwi0JTQsNKz06NcIixcbiAgICBjdXJyZW5jeTogXCLQkNGB0YrQvtGAXCIsXG4gICAgcGVyY2VudDogXCLQpNC+0LjQt9Kz0L5cIixcbiAgICBmaXJzdEV4cGFuZGVkOiBcItCv0LrRg9C8INC30LjRkdC0INGI0YPQtNCw0LDRgdGCXCIsXG4gICAgb2ZmOiBcItCa0YPRiNGC0LDQvVwiLFxuICAgIG9uUGFuZWw6IFwi0JTQsNGAINCx0LDRgdGC0LBcIixcbiAgICBvblN1cnZleTogXCLQlNCw0YAg0YHQsNCy0L7Qu9C90L7QvNCwXCIsXG4gICAgbGlzdDogXCLQoNOv0LnRhdCw0YJcIixcbiAgICBwcm9ncmVzc1RvcDogXCJwcm9ncmVzc1RvcFwiLFxuICAgIHByb2dyZXNzQm90dG9tOiBcInByb2dyZXNzQm90dG9tXCIsXG4gICAgcHJvZ3Jlc3NUb3BCb3R0b206IFwicHJvZ3Jlc3NUb3BCb3R0b21cIixcbiAgICBob3Jpem9udGFsOiBcItCj0YTRg9Kb06NcIixcbiAgICB2ZXJ0aWNhbDogXCLQkNC80YPQtNOjXCIsXG4gICAgdG9wOiBcItCQ0Lcg0LHQvtC70L5cIixcbiAgICBib3R0b206IFwi0JDQtyDQv9C+0ZHQvVwiLFxuICAgIHRvcEJvdHRvbTogXCLQkNC3INCx0L7Qu9C+INCy0LAg0L/QvtGR0L1cIixcbiAgICBsZWZ0Olwi0KfQsNC/XCIsXG4gICAgY29sb3I6IFwi0KDQsNC90LNcIixcbiAgICBkYXRlOiBcItCh0LDQvdCwXCIsXG4gICAgZGF0ZXRpbWU6IFwi0KHQsNC90LAg0LLQsCDQstCw0pvRglwiLFxuICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjogXCLQodCw0L3QsCDQstCwINCy0LDSm9GC0Lgg0LzQsNKz0LDQu9C706NcIixcbiAgICBlbWFpbDogXCJFbWFpbFwiLFxuICAgIG1vbnRoOiBcItCc0L7Ss1wiLFxuICAgIG51bWJlcjogXCLQoNCw0pvQsNC8XCIsXG4gICAgcGFzc3dvcmQ6IFwi0KDQsNC80LdcIixcbiAgICByYW5nZTogXCLQlNC40LDQv9Cw0LfQvtC9XCIsXG4gICAgdGVsOiBcItCi0LXQu9C10YTQvtC9XCIsXG4gICAgdGV4dDogXCLQnNCw0YLQvVwiLFxuICAgIHRpbWU6IFwi0JLQsNKb0YJcIixcbiAgICB1cmw6IFwiVVJMXCIsXG4gICAgd2VlazogXCLSstCw0YTRgtCwXCIsXG4gICAgaGlkZGVuOiBcItCf0LjQvdKz0L7QvVwiLFxuICAgIG9uOiBcItCT0LjRgNC+0L3QtNCw0L1cIixcbiAgICBvblBhZ2U6IFwi0JTQsNGAINGB0LDSs9C40YTQsFwiLFxuICAgIGVkaXQ6IFwi0KLQsNKT0LnQuNGAINC00L7QtNCw0L1cIixcbiAgICBkaXNwbGF5OiBcItCd0LDQvNC+0LjRiFwiLFxuICAgIG9uQ29tcGxldGU6IFwi0J/QsNGBINCw0Lcg0LDQvdK30L7QvFwiLFxuICAgIG9uSGlkZGVuOiBcItCf0LDRgSDQsNC3INC/0LjQvdKz0L7QvVwiLFxuICAgIGFsbDogXCLSstCw0LzQsFwiLFxuICAgIHBhZ2U6IFwi0KHQsNKz0LjRhNCwXCIsXG4gICAgc3VydmV5OiBcItCh0LDQstC+0LvQvdC+0LzQsFwiLFxuICAgIG9uTmV4dFBhZ2U6IFwi0JTQsNGAINCz0YPQt9Cw0YDQuNGIINCx0LAg0YHQsNKz0LjRhNCw0Lgg0L7Rj9C90LTQsFwiLFxuICAgIG9uVmFsdWVDaGFuZ2VkOiBcItCU0LDRgCDRgtCw0pPQudC40YDQuCDSm9C40LzQvNCw0YJcIlxuICB9LFxuICAvLyBPcGVyYXRvcnNcbiAgb3A6IHtcbiAgICBlbXB0eTogXCLQv9GD0YAg0L3QsNC60LDRgNC00LBcIixcbiAgICBub3RlbXB0eTogXCLQv9GD0YAg0LrQsNGA0LTQsFwiLFxuICAgIGVxdWFsOiBcItCx0LDRgNC+0LHQsNGAXCIsXG4gICAgbm90ZXF1YWw6IFwi0L3QvtCx0LDRgNC+0LHQsNGAXCIsXG4gICAgY29udGFpbnM6IFwi0LTQsNGAINCx0LDRgCDQtNC+0YDQsNC0XCIsXG4gICAgbm90Y29udGFpbnM6IFwi0LTQsNGAINCx0LDRgCDQvdCw0LTQvtGA0LDQtFwiLFxuICAgIGFueW9mOiBcItKz0LDRgCDRj9C6INCw0LdcIixcbiAgICBhbGxvZjogXCLSs9Cw0LzQsCDQsNC3XCIsXG4gICAgZ3JlYXRlcjogXCLQt9C40ZHQtNGC0LDRgFwiLFxuICAgIGxlc3M6IFwi0LrQsNC80YLQsNGAXCIsXG4gICAgZ3JlYXRlcm9yZXF1YWw6IFwi0LrQsNC70L7QvSDRkSDQsdCw0YDQvtCx0LDRgFwiLFxuICAgIGxlc3NvcmVxdWFsOiBcItC60LDQvCDRkSDQsdCw0YDQvtCx0LDRgFwiXG4gIH0sXG4gIC8vIEVtYmVkIHdpbmRvd1xuICBldzoge1xuICAgIGFuZ3VsYXI6IFwi0JjRgdGC0LjRhNC+0LTQsCDQsdCw0YDQtdC0INCy0LXRgNGB0LjRj9C4IEFuZ3VsYXJcIixcbiAgICBqcXVlcnk6IFwi0JjRgdGC0LjRhNC+0LTQsCDQsdCw0YDQtdC0INCy0LXRgNGB0LjRj9C4IGpRdWVyeVwiLFxuICAgIGtub2Nrb3V0OiBcItCY0YHRgtC40YTQvtC00LAg0LHQsNGA0LXQtCDQstC10YDRgdC40Y/QuCBLbm9ja291dFwiLFxuICAgIHJlYWN0OiBcItCY0YHRgtC40YTQvtC00LAg0LHQsNGA0LXQtCDQstC10YDRgdC40Y/QuCBSZWFjdFwiLFxuICAgIHZ1ZTogXCLQmNGB0YLQuNGE0L7QtNCwINCx0LDRgNC10LQg0LLQtdGA0YHQuNGP0LggVnVlXCIsXG4gICAgYm9vdHN0cmFwOiBcItCR0LDRgNC+0Lgg0LrQuNGC0L7QsdGF0L7QvdCw0LggYm9vdHN0cmFwXCIsXG4gICAgc3RhbmRhcmQ6IFwi0JHQtSDQutC40YLQvtCx0YXQvtC90LDQuCBib290c3RyYXBcIixcbiAgICBzaG93T25QYWdlOiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INGB0LDQstC+0LvQvdC+0LzQsCDQtNCw0YAg0YHQsNKz0LjRhNCwXCIsXG4gICAgc2hvd0luV2luZG93OiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INGB0LDQstC+0LvQvdC+0LzQsCDQtNCw0YAg0YDQsNCy0LfQsNC90LDQuCDQvNC+0LTQsNC706NcIixcbiAgICBsb2FkRnJvbVNlcnZlcjogXCLQkdC+0YAg0LrQsNGA0LTQsNC90LggSnNvbiDRgdCw0LLQvtC70L3QvtC80LAg0LDQtyDRgdC10YDQstC10YBcIixcbiAgICB0aXRsZVNjcmlwdDogXCLQodC60YDQuNC/0YLSs9C+INC4INGD0YHQu9GD0LHSs9C+XCIsXG4gICAgdGl0bGVIdG1sOiBcIkhUTUxcIixcbiAgICB0aXRsZUphdmFTY3JpcHQ6IFwiSmF2YVNjcmlwdFwiXG4gIH0sXG4gIC8vINCe0L/RgNC+0YEg0KLQtdGB0YJcbiAgdHM6IHtcbiAgICBzZWxlY3RQYWdlOiBcItCh0LDSs9C40YTQsNGA0L4g0LjQvdGC0LjRhdC+0LEg0LrRg9C90LXQtCwg0LHQsNGA0L7QuCDRgdCw0L3St9C40LTQsNC90Lgg0LjQvTpcIixcbiAgICBzaG93SW52aXNpYmxlRWxlbWVudHM6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC90Lgg0Y3Qu9C10LzQtdC90YLSs9C+0Lgg0L/QuNC90rPQvtC9XCJcbiAgfSxcbiAgdmFsaWRhdG9yczoge1xuICAgIGFuc3dlcmNvdW50dmFsaWRhdG9yOiBcItCo0YPQvNC+0YDQsNC4INK30LDQstC+0LHSs9C+XCIsXG4gICAgRW1haWxWYWxpZGF0b3I6IFwiRW1haWxcIixcbiAgICBleHByZXNzaW9udmFsaWRhdG9yOiBcItCY0YjQvtGA0LBcIixcbiAgICBudW1lcmljdmFsaWRhdG9yOiBcItCg0LDSm9Cw0LxcIixcbiAgICByZWdleHZhbGlkYXRvcjogXCLQmNGI0L7RgNCw0Lgg0YDQtdCz0YPQu9GP0YDTo1wiLFxuICAgIHRleHR2YWxpZGF0b3I6IFwi0JzQsNGC0L1cIlxuICB9LFxuICAgIHRyaWdnZXJzOiB7XG4gICAgY29tcGxldGV0cmlnZ2VyOiBcItCQ0L3St9C+0Lwg0LTQvtC00LDQvdC4INGB0LDQstC+0LvQvdC+0LzQsFwiLFxuICAgIHNldHZhbHVldHJpZ2dlcjogXCLQk9GD0LfQvtGI0YLQsNC90Lgg0pvQuNC80LzQsNGCXCIsXG4gICAgY29weXZhbHVldHJpZ2dlcjogXCLQndGD0YHRhdCw0LHQsNGA0LTQvtGA06Mg0LrQsNGA0LTQsNC90Lgg0pvQuNC80LzQsNGCXCIsXG4gICAgc2tpcHRyaWdnZXI6IFwi0JPRg9C30LDRgNC40Ygg0LHQsCDRgdCw0LLQvtC70LhcIixcbiAgICBydW5leHByZXNzaW9udHJpZ2dlcjogXCLQmNK30YDQviDQutCw0YDQtNCw0L3QuCDQuNGI0L7RgNCwXCIsXG4gICAgdmlzaWJsZXRyaWdnZXI6IFwi0KLQsNKT0LnQuNGAINC60LDRgNC00LDQvdC4INC90LDQvNC+0LjRiCAo0YLQsNCy0YHQuNGPINC00L7QtNCwINC90LDQvNC10YjQsNCy0LDQtClcIlxuICB9LFxuICAvLyBQcm9wZXJ0aWVzXG4gIHA6IHtcbiAgICBuYW1lOiBcItCd0L7QvFwiLFxuICAgIHRpdGxlOiB7XG4gICAgICBuYW1lOiBcItCd0L7QvFwiLFxuICAgICAgdGl0bGU6IFwi0KXQvtC706Mg0LPRg9C30L7RgNC10LQsINCw0LPQsNGAINC90L7QvNC4INOvINKz0LDQvNGH0YPQvSAn0J3QvtC8JyDQsdC+0YjQsNC0XCJcbiAgICB9LFxuICAgIG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eTogXCLQndC40YjQvtC9INC00L7QtNCw0L3QuCDRgtGD0LPQvNCw0rPQvtC4INC90L7QstCx0LDRgNOjXCIsXG4gICAgcXVlc3Rpb25zT3JkZXI6IFwi0JzRg9GA0LDRgtGC0LDQsdGB0L7Qt9C40Lgg0Y3Qu9C10LzQtdC90YLSs9C+INC00LDRgCDRgdCw0rPQuNGE0LBcIixcbiAgICBtYXhUaW1lVG9GaW5pc2g6IFwi0JLQsNKb0YLQuCDQvNCw0LrRgdC40LzQsNC706Mg0LHQsNGA0L7QuCDQsNC90rfQvtC8INC00L7QtNCw0L1cIixcblxuICAgIHZpc2libGU6IFwi0JDRkdC9INCw0YHRglwiLFxuICAgIHZpc2libGVJZjogXCLQndC40YjQvtC9INC00L7QtNCw0L0sINCw0LPQsNGAXCIsXG4gICAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBcItK20L7QudCz0LjRgNGI0LDQstC40Lgg0YHQsNGA0LvQsNCy0rPQsNC4INGB0LDQstC+0LtcIixcbiAgICBkZXNjcmlwdGlvbjogXCLQqNCw0YDSs1wiLFxuICAgIHN0YXRlOiBcItKy0L7Qu9Cw0YJcIixcbiAgICBpc1JlcXVpcmVkOiBcItKy0LDRgtC806NcIixcbiAgICByZXF1aXJlZElmOiBcItKy0LDRgtC80LjRgdGCLCDQsNCz0LDRgFwiLFxuICAgIGluZGVudDogXCLQndC40YjQvtC9XCIsXG4gICAgcmVxdWlyZWRFcnJvclRleHQ6IFwi0JjQvSDQvNCw0LnQtNC+0L0g0LHQsNGA0L7QuCDQv9GD0YDQutGD0L3ToyDSs9Cw0YLQvNC40YHRglwiLFxuICAgIHN0YXJ0V2l0aE5ld0xpbmU6IFwi0JDQtyDRgdCw0YLRgNC4INC90LDQsiDRgdCw0YAg0LrQsNGA0LTQsNC9XCIsXG4gICAgaW5uZXJJbmRlbnQ6IFwi0J3QuNGI0L7QvdC4INC00LDRgNGD0L3To1wiLFxuICAgIHBhZ2U6IFwi0KHQsNKz0LjRhNCwXCIsXG5cbiAgICB3aWR0aDogXCLQlNCw0YDQvtC306NcIixcblxuICAgIGNvbW1lbnRUZXh0OiBcItCo0LDRgNKzXCIsXG4gICAgdmFsdWVOYW1lOiBcItCd0L7QvNC4INKb0LjQvNC80LDRglwiLFxuICAgIGVuYWJsZUlmOiBcItCU0LDRgdGC0YDQsNGBINCw0YHRgiDQtNCw0YAg0YjQsNGA0YLQuFwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCLSmtC40LzQvNCw0YIg0LHQviDQvdC+0LHQsNGR0L1cIixcbiAgICBjb3JyZWN0QW5zd2VyOiBcItK20LDQstC+0LHQuCDQtNGD0YDRg9GB0YJcIixcbiAgICByZWFkT25seTogXCLQotCw0L3Ss9C+INCx0LDRgNC+0Lgg0YXQvtC90LjRiFwiLFxuICAgIHZhbGlkYXRvcnM6IFwi0JLQsNC70LjQtNCw0YLQvtGA0rPQvlwiLFxuICAgIHRpdGxlTG9jYXRpb246IFwi0rbQvtC50LPQuNGA0YjQsNCy0LjQuCDRgdCw0YDQu9Cw0LLSs9CwXCIsXG5cbiAgICBoYXNDb21tZW50OiBcItCo0LDRgNKzINCy0YPSt9GD0LQg0LDRgdGCXCIsXG4gICAgaGFzT3RoZXI6IFwi0prQuNC80LzQsNGC0LggJ9CU0LjQs9Cw0YAnINCy0YPSt9GD0LQg0LDRgdGCXCIsXG4gICAgY2hvaWNlczogXCLQmNC90YLQuNGF0L7QsVwiLFxuICAgIGNob2ljZXNPcmRlcjogXCLQmNC90YLQuNGF0L7QsdC4INGE0LDRgNC80L7QuNGI0Lgg0LjQvdGC0LjRhdC+0LFcIixcbiAgICBjaG9pY2VzQnlVcmw6IFwi0JjQvdGC0LjRhdC+0LEg0LDQtyDQuNC90YLQtdGA0L3QtdGCXCIsXG4gICAgb3RoZXJUZXh0OiBcItCt0LvQtdC80LXQvdGC0Lgg0LzQsNGC0L3QuNC4INC00LjQs9Cw0YBcIixcbiAgICBvdGhlckVycm9yVGV4dDogXCLQnNCw0YLQvdC4INGF0LDRgtC+0LPQuNC4INC80LDQudC00L7QvdC4ICfQlNC40LPQsNGAJ1wiLFxuICAgIHN0b3JlT3RoZXJzQXNDb21tZW50OiBcItCd0LjQs9C+0rMg0LTQvtGI0YLQsNC90Lgg0LzQsNC50LTQvtC90LggJ9CU0LjQs9Cw0YAnLCDSs9Cw0LzRh9GD0L0g0YjQsNGA0rNcIixcblxuICAgIGxhYmVsOiBcItCc0LjRkdC90LDQsdGD0YBcIixcbiAgICBzaG93VGl0bGU6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC90Lgg0L3QvtC8XCIsXG4gICAgdmFsdWVUcnVlOiBcItCU0YPRgNGD0YHRglwiLFxuICAgIHZhbHVlRmFsc2U6IFwi0J3QvtC00YPRgNGD0YHRglwiLFxuXG4gICAgY29sczogXCLQodGD0YLRg9C90rPQvlwiLFxuICAgIHJvd3M6IFwi0KHQsNGC0YDSs9C+XCIsXG4gICAgcGxhY2VIb2xkZXI6IFwi0rbQvtC50LTQvtGAXCIsXG5cbiAgICBvcHRpb25zQ2FwdGlvbjogXCLQotCw0L3Qt9C40LzQvtGC0rPQvtC4INC40LzQt9C+XCIsXG5cbiAgICBleHByZXNzaW9uOiBcItCY0YjQvtGA0LBcIixcbiAgICBmb3JtYXQ6IFwi0J3QsNC80YPQtFwiLFxuICAgIGRpc3BsYXlTdHlsZTogXCLQo9GB0LvRg9Cx0Lgg0L3QsNC80L7QuNGIXCIsXG4gICAgY3VycmVuY3k6IFwi0JDRgdGK0L7RgFwiLFxuICAgIHVzZUdyb3VwaW5nOiBcItCY0YHRgtC40YTQvtC00LDQuCDQs9GD0YDRg9Kz0LHQsNC90LTTo1wiLFxuXG4gICAgc2hvd1ByZXZpZXc6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC90Lgg0L/QtdGI0L3QsNC80L7QuNGIXCIsXG4gICAgYWxsb3dNdWx0aXBsZTogXCLQmNC90YLQuNGF0L7QsdC4INGP0LrRh9Cw0L3QtFwiLFxuICAgIGltYWdlSGVpZ2h0OiBcItCR0LDQu9Cw0L3QtNC40Lgg0YHRg9GA0LDRglwiLFxuICAgIGltYWdlV2lkdGg6IFwi0JTQsNGA0L7Qt9C40Lgg0YHRg9GA0LDRglwiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCLQndC40LPQvtKzINC00L7RiNGC0LDQvdC4INKb0LjQvNC80LDRgiDSs9Cw0LzRh9GD0L0g0LzQsNGC0L1cIixcbiAgICBtYXhTaXplOiBcItCQ0L3QtNC+0LfQsNC4INC80LDQutGB0LjQvNCw0LvTo1wiLFxuXG4gICAgaHRtbDogXCJIVE1MXCIsXG5cbiAgICBjb2x1bW5zOiBcItCh0YPRgtGD0L3Ss9C+XCIsXG4gICAgY2VsbHM6IFwi0JzQsNC50LTQvtC90rPQvlwiLFxuICAgIGlzQWxsUm93UmVxdWlyZWQ6IFwi0rLQsNC80LDQuCDRgdCw0YLRgNKz0L4g0rPQsNGC0LzQuNGB0YIg0LHQsNGA0L7QuCDQv9GD0YDQutGD0L3To1wiLFxuXG4gICAgaG9yaXpvbnRhbFNjcm9sbDogXCLQodC60YDQvtC70LvQuCDRg9GE0YPSm9OjXCIsXG4gICAgY2VsbFR5cGU6IFwi0J3QsNC80YPQtNC4INC80LDQudC00L7QvdGH0LBcIixcbiAgICBjb2x1bW5zTGF5b3V0OiBcItCc0LDQutC10YLQuCDRgdGD0YLRg9C90rPQvlwiLFxuICAgIGNvbHVtbkNvbENvdW50OiBcItCo0YPQvNC+0YDQsNC4INGB0YPRgtGD0L3Ss9C+XCIsXG4gICAgY29sdW1uTWluV2lkdGg6IFwi0JTQsNGA0L7Qt9C40Lgg0LzQuNC90LjQvNCw0LvQuNC4INGB0YPRgtGD0L1cIixcblxuICAgIHJvd0NvdW50OiBcItCo0YPQvNC+0YDQsNC4INGB0LDRgtGA0rPQvlwiLFxuICAgIG1pblJvd0NvdW50OiBcItCo0YPQvNC+0YDQsNC4INC80LjQvdC40LzQsNC70LjQuCDRgdCw0YLRgNKz0L5cIixcbiAgICBtYXhSb3dDb3VudDogXCLQqNGD0LzQvtGA0LDQuCDQvNCw0LrRgdC40LzQsNC70LjQuCDRgdCw0YLRgNKz0L5cIixcbiAgICBrZXlOYW1lOiBcItCd0L7QvNC4INC60LDQu9C40LRcIixcbiAgICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItCl0LDRgtC+0LPToyEg0JjQvSDQutCw0LvQuNC0INCw0LvQu9Cw0LrQsNC5INCy0YPSt9GD0LQg0LTQvtGA0LDQtCwg0L3QvtC80Lgg0LTQuNCz0LDRgNGA0L4g0LjRiNC+0YDQsCDQutGD0L3QtdC0LlwiLFxuICAgIGNvbmZpcm1EZWxldGU6IFwi0J3QtdGB0YLQutGD0L3QuNGA0L4g0YLQsNGB0LTQuNKbINC60YPQvdC10LRcIixcbiAgICBjb25maXJtRGVsZXRlVGV4dDogXCLQnNCw0YLQvdC4INGF0LDRgiDQsdCw0YDQvtC4INGC0LDRgdC00LjSm9C4INC90LXRgdGC0LrRg9C906NcIixcbiAgICBhZGRSb3dMb2NhdGlvbjogXCLQmNC70L7QstCwINC60LDRgNC00LDQvdC4INK30L7QudCz0LjRgNGI0LDQstC40Lgg0YHRg9GC0YPQvdKz0L5cIixcbiAgICBhZGRSb3dUZXh0OiBcItCY0LvQvtCy0LAg0LrQsNGA0LTQsNC90Lgg0YLRg9Cz0LzQsNC4INGB0LDRgtGA0Lgg0LzQsNGC0L1cIixcbiAgICByZW1vdmVSb3dUZXh0OiBcItCd0LXRgdGCINC60LDRgNC00LDQvdC4INGC0YPQs9C80LDQuCDRgdCw0YLRgNC4INC80LDRgtC9XCIsXG5cbiAgICBpdGVtczogXCLQrdC70LXQvNC10L3RgtKz0L5cIixcbiAgICBpdGVtU2l6ZTogXCLQkNC90LTQvtC30LDQuCDRjdC70LXQvNC10L3RgtKz0L5cIixcbiAgICBjb2xDb3VudDogXCLQqNGD0LzQvtGA0LDQuCDRgdGD0YLRg9C90rPQvlwiLFxuXG4gICAgdGVtcGxhdGVUaXRsZTogXCLQodCw0YDQu9Cw0LLSs9Cw0Lgg0L3QsNC80YPQvdCwXCIsXG4gICAgdGVtcGxhdGVEZXNjcmlwdGlvbjogXCLQqNCw0YDSs9C4INC90LDQvNGD0L3QsFwiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwi0JjSt9C+0LfQsNGCINC00L7QtNCw0L3QuCDQuNC70L7QstCwINC60LDRgNC00LDQvdC4INCx0LDRgdGC0LBcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcItCY0rfQvtC30LDRgiDQtNC+0LTQsNC90Lgg0L3QtdGB0YIg0LrQsNGA0LTQsNC90Lgg0LHQsNGB0YLQsFwiLFxuICAgIHBhbmVsQ291bnQ6IFwi0KjRg9C80L7RgNCw0Lgg0LHQsNGB0YLQsNKz0L5cIixcbiAgICBtaW5QYW5lbENvdW50OiBcItCo0YPQvNC+0YDQsNC4INC80LjQvdC40LzQsNC70LjQuCDQsdCw0YHRgtCw0rPQvlwiLFxuICAgIG1heFBhbmVsQ291bnQ6IFwi0KjRg9C80L7RgNCw0Lgg0LzQsNC60YHQuNC80LDQu9C40Lgg0LHQsNGB0YLQsNKz0L5cIixcbiAgICBwYW5lbHNTdGF0ZTogXCLSstC+0LvQsNGC0Lgg0LHQsNGB0YLQsNKz0L5cIixcbiAgICBwYW5lbEFkZFRleHQ6IFwi0JzQsNGC0L3QuCDRhdCw0YIg0LTQsNGAINC40LvQvtCy0LDQutGD0L3QuNC4INCx0LDRgdGC0LBcIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwi0JzQsNGC0L3QuCDRhdCw0YIg0LTQsNGAINC90LXRgdGC0LrRg9C90LjQuCDQsdCw0YHRgtCwXCIsXG4gICAgcGFuZWxQcmV2VGV4dDogXCLQnNCw0YLQvdC4INGF0LDRgtC4INCx0LDRgdGC0LDQuCDQv9C10YjRgtCw0YDQsFwiLFxuICAgIHBhbmVsTmV4dFRleHQ6IFwi0JzQsNGC0L3QuCDRhdCw0YLQuCDQsdCw0YHRgtCw0Lgg0L7Rj9C90LTQsFwiLFxuICAgIHNob3dRdWVzdGlvbk51bWJlcnM6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC90Lgg0YDQsNKb0LDQvNC4INGB0LDQstC+0LvSs9C+XCIsXG4gICAgc2hvd1JhbmdlSW5Qcm9ncmVzczogXCLQndC40YjQvtC9INC00L7QtNCw0L3QuCDQv9C10YjRgNCw0LLQuNC4INC/0YPRgNC60YPQvdOjXCIsXG4gICAgcmVuZGVyTW9kZTogXCLQndCw0LzRg9C00Lgg0LDRkdC9XCIsXG4gICAgdGVtcGxhdGVUaXRsZUxvY2F0aW9uOiBcItK20L7QudCz0LjRgNGI0LDQstC40Lgg0YHQsNGA0LvQsNCy0rPQsNC4INC90LDQvNGD0L3QsFwiLFxuXG4gICAgcmF0ZVZhbHVlczogXCLQkdCw0rPQvtC00LjSs9C40Lgg0pvQuNC80LzQsNGC0LHQsNKz0L7QuNC4INGB0LDQstC+0LvQvdC+0LzQsFwiLFxuICAgIHJhdGVNaW46IFwi0KDQtdC50YLQuNC90LPQuCDQvNC40L3QuNC80LDQu9OjXCIsXG4gICAgcmF0ZU1heDogXCLQoNC10LnRgtC40L3Qs9C4INC80LDQutGB0LjQvNCw0LvTo1wiLFxuICAgIHJhdGVTdGVwOiBcItKa0LDQtNCw0LzQuCDRgNC10LnRgtC40L3Qs1wiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCLQqNCw0YDSsyDQsdCw0YDQvtC4INGA0LXQudGC0LjQvdCz0Lgg0LzQuNC90LjQvNCw0LvTo1wiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCLQqNCw0YDSsyDQsdCw0YDQvtC4INGA0LXQudGC0LjQvdCz0Lgg0LzQsNC60YHQuNC80LDQu9OjXCIsXG5cbiAgICBpbnB1dFR5cGU6IFwi0J3QsNC80YPQtNC4INC00L7RhdC40LvQutGD0L3To1wiLFxuICAgIHNpemU6IFwi0JDQvdC00L7Qt9CwXCIsXG5cbiAgICBsb2NhbGU6IFwi0KDQsNCy0LjRj1wiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzogXCLQk9GD0LfQsNGA0LjRiCDQsdCwINGB0LDQstC+0LvQuCDRj9C60YPQvCDQv9Cw0YEg0LDQtyDRgtCw0pPQudC40YAg0LTQvtC00LDQvdC4INGB0LDSs9C40YTQsFwiLFxuICAgIGNvbXBsZXRlZEh0bWw6IFwiSFRNTC3QuCDRgdCw0rPQuNGE0LDQuCDQvtGF0LjRgNC+0L1cIixcbiAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb246IFwiSFRNTC3QuCDRgdCw0rPQuNGE0LDQuCDQvtGF0LjRgNC+0L0g0LTQsNGAINGI0LDRgNGC0LhcIixcbiAgICBsb2FkaW5nSHRtbDogXCLQkdC+0YDQutGD0L3QuNC4IEhUTUxcIixcbiAgICB0cmlnZ2VyczogXCLRgtGA0LjQs9Cz0LXRgNKz0L5cIixcbiAgICBjb29raWVOYW1lOiBcItC90L7QvNC4IENvb2tpZVwiLFxuICAgIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INC90LDRgtC40rfQsNC4INGB0LDQstC+0LvQvdC+0LzQsCDQtNCw0YAg0YHQsNKz0LjRhNCw0Lgg0L3QsNC30LTQuNC6XCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INGC0YPQs9C80LDSs9C+0Lgg0L3QvtCy0LHQsNGA06MgKNC90L7QstCx0LDRgNC40Lgg0L3QvtCx0LDRkdC9KVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INGC0YPQs9C80LDQuCAn0KHQsNKz0LjRhNCw0Lgg0L/QtdGI0YLQsNGA0LAnICjQuNGB0YLQuNGE0L7QtNCw0LHQsNGAINC80LXRgtCw0LLQvtC90LDQtCDQs9GD0LfQsNGI0YLQsNC9INCx0LAg0YHQsNKz0LjRhNCw0Lgg0L/QtdGI0YLQsNGA0LApXCIsXG4gICAgc2hvd1BhZ2VUaXRsZXM6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC90Lgg0L3QvtC80Lgg0YHQsNKz0LjRhNCwXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC90Lgg0YHQsNKz0LjRhNCwINCx0L4g0LzQsNGC0L0g0LTQsNGAINCw0L3St9C+0LwgKEhUTUwt0Lgg0YHQsNKz0LjRhNCw0Lgg0L3QsNGC0LjSt9Cw0LLToylcIixcbiAgICBzaG93UGFnZU51bWJlcnM6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC90Lgg0YDQsNKb0LDQvNKz0L7QuCDRgdCw0rPQuNGE0LBcIixcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwi0JPRg9C30L7RgNC40YjQuCDRhdCw0YLQvtCz0LjSs9C+0Lgg0YHQsNCy0L7Qu9C90L7QvNCwXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcItCd0LjRiNC+0L0g0LTQvtC00LDQvdC4INC/0LXRiNGA0LDQstC40Lgg0L/Rg9GA0LrRg9C906NcIixcbiAgICBtb2RlOiBcItCd0LDQvNGD0LRcIixcbiAgICBnb05leHRQYWdlQXV0b21hdGljOiBcItCT0YPQt9Cw0YDQuNGIINCx0L4g0YDQvtKz0Lgg0LDQstGC0L7QvNCw0YLToyDQsdCwINGB0LDSs9Cw0LjRhNCw0Lgg0L7Rj9C90LTQsCDQtNCw0YAg0rPQvtC70LDRgtC4INK30LDQstC+0LEg0LTQvtC00LDQvSDQsdCwINKz0LDQvNCw0Lgg0YHQsNCy0L7Qu9Kz0L5cIixcbiAgICBjaGVja0Vycm9yc01vZGU6IFwi0J3QsNC80YPQtNC4INGB0LDQvdK30LjRiNC4INGF0LDRgtC+0LPQuNKz0L5cIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCLQotC+0LfQsCDQutCw0YDQtNCw0L3QuCDSm9C40LzQvNCw0YLSs9C+0Lgg0L3QvtCw0ZHQvVwiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCLQnNCw0YLQvSDQtNCw0YAg0YLRg9Cz0LzQsNC4ICfQodCw0YAg0LrQsNGA0LTQsNC9J1wiLFxuICAgIHBhZ2VQcmV2VGV4dDogXCLQnNCw0YLQvSDQtNCw0YAg0YLRg9Cz0LzQsNC4ICfQodCw0rPQuNGE0LDQuCDQv9C10YjRgtCw0YDQsCdcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwi0JzQsNGC0L0g0LTQsNGAINGC0YPQs9C80LDQuCAn0KHQsNKz0LjRhNCw0Lgg0L7Rj9C90LTQsCdcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwi0JzQsNGC0L0g0LTQsNGAINGC0YPQs9C80LDQuCAn0KLQsNC80L7QvCDQutCw0YDQtNCw0L0nXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcItCQ0LvQvtC80LDRgiDQsdCw0YDQvtC4INGB0LDQstC+0LvQuCDSs9Cw0YLQvNOjXCIsXG4gICAgcXVlc3Rpb25TdGFydEluZGV4OiBcItCY0L3QtNC10LrRgdC4INGB0LDRgNGI0LDQstCw0L3QtNCwINC00LDRgCDRgdCw0LLQvtC70L3QvtC80LAgKDEsIDIg0ZEgJ0EnLCAn0LAnKVwiLFxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTogXCLQndCw0LzRg9C90LDQuCDQvdC+0LzQuCDRgdCw0LLQvtC70L3QvtC80LAsINKz0LDQvNGH0YPQvSDQvdC+0LHQsNGR0L06IHvQvNCw0YLQvdGA0L59IHvRgtCw0LvQsNCxfSB70L3QsNC80LXQutGD0L3QsNC0fS5cIixcbiAgICBmaXJzdFBhZ2VJc1N0YXJ0ZWQ6IFwi0K/QutGD0Lwg0YHQsNKz0LjRhNCw0Lgg0YHQsNCy0L7Qu9C90L7QvNCwINGB0LDSs9C40YTQsNC4INGB0LDRgNGI0LDQstCw0L3QtNCwINC80LXQsdC+0YjQsNC0LlwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCLQndC40YjQvtC9INC00L7QtNCw0L3QuCDSs9Cw0LzQsNC4INGN0LvQtdC80LXQvdGC0rPQviDQtNCw0YAg0Y/QuiDRgdCw0rPQuNGE0LBcIixcbiAgICBtYXhUaW1lVG9GaW5pc2hQYWdlOiBcItCS0LDSm9GC0Lgg0LzQsNC60YHQuNC80LDQu9OjINC00LDRgCDRgdC+0L3QuNGP0rPQviwg0LHQsNGA0L7QuCDQv9GD0YAg0LrQsNGA0LTQsNC90Lgg0YHQsNKz0LjRhNCw0Lgg0YHQsNCy0L7Qu9C90L7QvNCwXCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC90Lgg0LHQsNGB0YLQsNC4INCy0LDSm9GC0YHQsNC90rdcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwi0J3QuNGI0L7QvSDQtNC+0LTQsNC90Lgg0L3QsNC80YPQtNC4INCx0LDRgdGC0LDQuCDQstCw0pvRgtGB0LDQvdK3XCIsXG5cbiAgICBkZWZhdWx0UGFuZWxWYWx1ZTogXCLSmtC40LzQvNCw0YLSs9C+0Lgg0LHQsNGB0YLQsNC4INC90L7QsdCw0ZHQvVwiLFxuICAgIGRlZmF1bHRSb3dWYWx1ZTogXCLSmtC40LzQvNCw0YLSs9C+0Lgg0YHQsNGC0YDQuCDQvdC+0LHQsNGR0L1cIixcbiAgICBoYXNOb25lOiBcItCv0LPQvtC9INC90YPSm9GC0LAg0L3QtdGB0YJcIixcbiAgICBub25lVGV4dDogXCLQnNCw0YLQvdC4INC90YPSm9GC0LDQuCAn0rLQtdK3INGH0LjQtydcIixcblxuICAgIHRleHQ6IFwi0JzQsNGC0L1cIlxuICB9XG59O1xuXG5lZGl0b3JMb2NhbGl6YXRpb24ubG9jYWxlc1tcInRnXCJdID0gdGdTdHJpbmdzOyIsImltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcblxudmFyIHRyYWRpdGlvbmFsQ2hpbmVzZVRyYW5zbGF0aW9uID0ge1xuICAvLyBzdHJpbmdzIGZvciBzdXJ2ZXkgdGVtcGxhdGVzXG4gIHN1cnZleToge1xuICAgIGVkaXQ6IFwi57eo6LyvXCIsXG4gICAgZHJvcFF1ZXN0aW9uOiBcIuiri+Wwh+WVj+mhjOaUvue9ruaWvOatpFwiLFxuICAgIGNvcHk6IFwi6KSH6KO9XCIsXG4gICAgYWRkVG9Ub29sYm94OiBcIua3u+WKoOWIsOW3peWFt+eusVwiLFxuICAgIGRlbGV0ZVBhbmVsOiBcIuWIqumZpOmdouadv1wiLFxuICAgIGRlbGV0ZVF1ZXN0aW9uOiBcIuWIqumZpOmhjOebrlwiLFxuICAgIGNvbnZlcnRUbzogXCLovYnororngrpcIlxuICB9LFxuICAvLyBzdHJpbmdzIGZvciBxdWVzdGlvbiB0eXBlc1xuICBxdDoge1xuICAgIGNoZWNrYm94OiBcIuWkmumghemBuOaTh1wiLFxuICAgIGNvbW1lbnQ6IFwi5aSa6KGM5paH5pys5qGGXCIsXG4gICAgZHJvcGRvd246IFwi5LiL5ouJ5qGGXCIsXG4gICAgZmlsZTogXCLmlofku7bkuIrlgrNcIixcbiAgICBodG1sOiBcIkh0bWwg5Luj56K8XCIsXG4gICAgbWF0cml4OiBcIuefqemZoyAo5Zau6YG46aGMKVwiLFxuICAgIG1hdHJpeGRyb3Bkb3duOiBcIuefqemZoyAo5LiL5ouJ5qGGKVwiLFxuICAgIG1hdHJpeGR5bmFtaWM6IFwi55+p6ZmjICjli5XmhYvllY/poYwpXCIsXG4gICAgbXVsdGlwbGV0ZXh0OiBcIuaWh+acrOahhue1hFwiLFxuICAgIHBhbmVsOiBcIumdouadv1wiLFxuICAgIHBhbmVsZHluYW1pYzogXCLpnaLmnb8o5YuV5oWLKVwiLFxuICAgIHJhZGlvZ3JvdXA6IFwi5Zau6aCF6YG45pOHXCIsXG4gICAgcmF0aW5nOiBcIuipleWIhlwiLFxuICAgIHRleHQ6IFwi5paH5pys5qGGXCIsXG4gICAgYm9vbGVhbjogXCLluIPmnpfpgbjpoIVcIixcbiAgICBleHByZXNzaW9uOiBcIuihqOmBlOW8j1wiXG4gIH0sXG4gIC8vIHN0cmluZ3MgZm9yIGVkaXRvclxuICBlZDoge1xuICAgIHN1cnZleTogXCLoqr/mn6XllY/ljbdcIixcbiAgICBlZGl0U3VydmV5OiBcIuS/ruaUuVwiLFxuICAgIGFkZE5ld1BhZ2U6IFwi5re75Yqg5paw6aCB6Z2iXCIsXG4gICAgZGVsZXRlUGFnZTogXCLliKrpmaTpoIHpnaJcIixcbiAgICBlZGl0UGFnZTogXCLnt6jovK/poIHpnaJcIixcbiAgICBuZXdQYWdlTmFtZTogXCLpoIHpnaJcIixcbiAgICBuZXdRdWVzdGlvbk5hbWU6IFwi5ZWP6aGMXCIsXG4gICAgbmV3UGFuZWxOYW1lOiBcIumdouadv1wiLFxuICAgIHRlc3RTdXJ2ZXk6IFwi5ris6Kmm5ZWP5Y23XCIsXG4gICAgdGVzdFN1cnZleUFnYWluOiBcIuWGjeasoea4rOippuWVj+WNt1wiLFxuICAgIHRlc3RTdXJ2ZXlXaWR0aDogXCLllY/ljbflr6zluqY6IFwiLFxuICAgIGVtYmVkU3VydmV5OiBcIuWwh+WVj+WNt+W1jOWFpee2sumggVwiLFxuICAgIHNhdmVTdXJ2ZXk6IFwi5L+d5a2Y5ZWP5Y23XCIsXG4gICAgZGVzaWduZXI6IFwi5ZWP5Y236Kit6KiI5ZmoXCIsXG4gICAganNvbkVkaXRvcjogXCJKU09OIOe3qOi8r+WZqFwiLFxuICAgIHVuZG86IFwi6YKE5Y6fXCIsXG4gICAgcmVkbzogXCLph43lgZpcIixcbiAgICBvcHRpb25zOiBcIumBuOmghVwiLFxuICAgIGdlbmVyYXRlVmFsaWRKU09OOiBcIueUn+aIkCBKU09OXCIsXG4gICAgZ2VuZXJhdGVSZWFkYWJsZUpTT046IFwi55Sf5oiQ5piT6K6A55qEIEpTT05cIixcbiAgICB0b29sYm94OiBcIuW3peWFt+eusVwiLFxuICAgIGRlbFNlbE9iamVjdDogXCLliKrpmaTmiYDpgbjlsI3osaFcIixcbiAgICBlZGl0U2VsT2JqZWN0OiBcIue3qOi8r+aJgOmBuOWwjeixoVwiLFxuICAgIGNvcnJlY3RKU09OOiBcIuS/ruatoyBKU09OXCIsXG4gICAgc3VydmV5UmVzdWx0czogXCLllY/ljbfntZDmnpw6IFwiLFxuICAgIG1vZGlmaWVkOiBcIuW3suS/ruaUuVwiLFxuICAgIHNhdmluZzogXCLkv53lrZjkuK0uLi5cIixcbiAgICBzYXZlZDogXCLlt7Lkv53lrZhcIlxuICB9LFxuICAvL1Byb3BlcnR5IG5hbWVzIGluIHRhYmxlIGhlYWRlcnNcbiAgcGVsOiB7XG4gICAgaXNSZXF1aXJlZDogXCLmmK/lkKbngrrlv4XloavpoIU/XCJcbiAgfSxcbiAgLy8gc3RyaW5ncyBmb3IgcHJvcGVydHkgZWRpdG9yc1xuICBwZToge1xuICAgIGFwcGx5OiBcIuaHieeUqFwiLFxuICAgIG9rOiBcIueiuuWumlwiLFxuICAgIGNhbmNlbDogXCLlj5bmtohcIixcbiAgICByZXNldDogXCLph43nva5cIixcbiAgICBjbG9zZTogXCLpl5zplolcIixcbiAgICBkZWxldGU6IFwi5Yiq6ZmkXCIsXG4gICAgYWRkTmV3OiBcIuaWsOW7ulwiLFxuICAgIHJlbW92ZUFsbDogXCLlhajpg6jliKrpmaRcIixcbiAgICBlZGl0OiBcIue3qOi8r+WZqFwiLFxuICAgIGVtcHR5OiBcIjznqbo+XCIsXG4gICAgZmFzdEVudHJ5OiBcIuW/q+mAn+i8uOWFpVwiLFxuICAgIGZvcm1FbnRyeTogXCLooajllq7ovLjlhaVcIixcbiAgICB0ZXN0U2VydmljZTogXCLmuKzoqabmnI3li5lcIixcbiAgICBzaG93TW9yZTogXCLmm7TlpJrntLDnr4AuLi5cIixcbiAgICBjb25kaXRpb25IZWxwOlxuICAgICAgXCLoq4vovLjlhaXkuIDlgIvluIPmnpfooajpgZTlvI/jgILnlbbluIPmnpflgLzngrrnnJ/vvIzllY/poYwv6aCB6Z2i5Y+v6KaL44CC5L6L5aaC77yae3F1ZXN0aW9uMX0gPSAndmFsdWUxJyBvciAoe3F1ZXN0aW9uMn0gKiB7cXVlc3Rpb240fSAgPiAyMCBhbmQge3F1ZXN0aW9uM30gPCA1KVwiLFxuICAgIGV4cHJlc3Npb25IZWxwOlxuICAgICAgXCLoq4vovLjlhaXkuIDpoIXmop3ku7bliKTmlrfjgILnlbbmop3ku7bliKTmlrfngrrnnJ/mmYLllY/poYwv6aCB6Z2i5bCH5Y+v6KaL44CC5L6L5aaCOiB7cXVlc3Rpb24xfSA9ICd2YWx1ZTEnIG9yICh7cXVlc3Rpb24yfSA9IDMgYW5kIHtxdWVzdGlvbjN9IDwgNSlcIixcbiAgICBwcm9wZXJ0eUlzRW1wdHk6IFwi6KuL54K66Kmy5bGs5oCn6Kit5a6a5LiA5YCL5YC8XCIsXG4gICAgdmFsdWU6IFwi5YC8XCIsXG4gICAgdGV4dDogXCLpoa/npLrmlofmnKxcIixcbiAgICBjb2x1bW5FZGl0OiBcIue3qOi8r+WIlzogezB9XCIsXG4gICAgaXRlbUVkaXQ6IFwi57eo6Lyv6YG46aCFOiB7MH1cIixcbiAgICBoYXNPdGhlcjogXCLlj6/mt7vliqDlhbbku5bnrZTmoYg/XCIsXG4gICAgb3RoZXJUZXh0OiBcIuWFtuS7luetlOahiOaWh+acrFwiLFxuICAgIHVybDogXCJVUkxcIixcbiAgICBwYXRoOiBcIlBhdGhcIixcbiAgICB2YWx1ZU5hbWU6IFwiVmFsdWUgbmFtZVwiLFxuICAgIHRpdGxlTmFtZTogXCJUaXRsZSBuYW1lXCIsXG4gICAgbmFtZTogXCLpoYznm67lkI1cIixcbiAgICB0aXRsZTogXCLpoYznm67mlofmnKxcIixcbiAgICBjZWxsVHlwZTogXCLllq7lhYPmoLzpoZ7lnotcIixcbiAgICBjb2xDb3VudDogXCLliJfmlbhcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwi6Kit572u6YG46aCF6aCG5bqPXCIsXG4gICAgdmlzaWJsZTogXCLmmK/lkKblj6/opos/XCIsXG4gICAgaXNSZXF1aXJlZDogXCLmmK/lkKbngrrlv4XloavpoIU/XCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCLllY/poYzmmK/lkKbmlrDotbfkuIDooYw/XCIsXG4gICAgcm93czogXCLmlofmnKzmoYbooYzmlbhcIixcbiAgICBwbGFjZUhvbGRlcjogXCLljaDkvY3mlofmnKxcIixcbiAgICBzaG93UHJldmlldzogXCLmmK/lkKbpoa/npLrlnJblg4/poJDopr0/XCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIuS7pSBKU09OIOaWh+acrOaWueW8j+WtmOWEsuaWh+S7tlwiLFxuICAgIG1heFNpemU6IFwi5paH5Lu25pyA5aSn5bC65a+4IChCeXRlcylcIixcbiAgICBpbWFnZUhlaWdodDogXCLlnJbniYfpq5jluqZcIixcbiAgICBpbWFnZVdpZHRoOiBcIuWclueJh+WvrOW6plwiLFxuICAgIHJvd0NvdW50OiBcIum7mOiqjeihjOaVuFwiLFxuICAgIGFkZFJvd1RleHQ6IFwi5re75Yqg5qKd55uu5oyJ6YiV5paH5pysXCIsXG4gICAgcmVtb3ZlUm93VGV4dDogXCLliKrpmaTmop3nm67mjInpiJXmlofmnKxcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwi5pyA5bCP5YC85o+Q56S6XCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcIuacgOWkp+WAvOaPkOekulwiLFxuICAgIGlucHV0VHlwZTogXCLmlofmnKzmoYbpoZ7lnotcIixcbiAgICBvcHRpb25zQ2FwdGlvbjogXCLkuIvmi4nmoYbmj5DnpLroqp5cIixcbiAgICBxRWRpdG9yVGl0bGU6IFwi57eo6Lyv5ZWP6aGMOiB7MH1cIixcbiAgICAvL3N1cnZleVxuICAgIHNob3dUaXRsZTogXCLpoa/npLov6Zqx6JePIOaomemhjFwiLFxuICAgIGxvY2FsZTogXCLpu5joqo3oqp7oqIBcIixcbiAgICBtb2RlOiBcIuaooeW8jyAo57eo6LyvL+WPquiugClcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCLmuIXpmaTpmrHol4/lgLxcIixcbiAgICBjb29raWVOYW1lOiBcIkNvb2tpZSBuYW1lICh0byBkaXNhYmxlIHJ1biBzdXJ2ZXkgdHdvIHRpbWVzIGxvY2FsbHkpXCIsXG4gICAgc2VuZFJlc3VsdE9uUGFnZU5leHQ6IFwiU2VuZCBzdXJ2ZXkgcmVzdWx0cyBvbiBwYWdlIG5leHRcIixcbiAgICBzdG9yZU90aGVyc0FzQ29tbWVudDogXCJTdG9yZSAnb3RoZXJzJyB2YWx1ZSBpbiBzZXBhcmF0ZSBmaWVsZFwiLFxuICAgIHNob3dQYWdlVGl0bGVzOiBcIumhr+ekuumggemdouaomemhjFwiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCLpoa/npLrpoIHmlbhcIixcbiAgICBwYWdlUHJldlRleHQ6IFwi5YmN5LiA6aCB5oyJ6YiV5paH5pysXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIuW+jOS4gOmggeaMiemIleaWh+acrFwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCLlrozmiJDmjInpiJXmlofmnKxcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwi6ZaL5aeL5oyJ6YiV5paH5pysXCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIumhr+ekuuWwjuiIquaMiemIlSAo6buY6KqN5bCO6IiqKVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcIumhr+ekuuWJjeS4gOmggeaMiemIlSAo55So5oi25Y+v6L+U5Zue6Iez5YmN5LiA6aCB6Z2iKVwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCLoqr/mn6XnmoTnrKzkuIDpoIHpnaLngrrotbflp4vpoIEuXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwi57WQ5bC+5bGV56S65a6M5oiQ5b6M55qE6aCB6Z2iIChjb21wbGV0ZWRIdG1sKVwiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6IFwi5Zue562U5pys6aCB5omA5pyJ5ZWP6aGM5b6M77yM6Ieq5YuV6Lez6L2J5Yiw5LiL5LiA6aCBXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIumhr+ekuumAsuW6puainVwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCLllY/poYznmoTmqJnpoYzkvY3nva5cIixcbiAgICByZXF1aXJlZFRleHQ6IFwiVGhlIHF1ZXN0aW9uIHJlcXVpcmVkIHN5bWJvbChzKVwiLFxuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogXCLllY/poYzotbflp4vmqJnoqowgKDEsIDIgb3IgJ0EnLCAnYScpXCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCLpoa/npLrllY/poYznt6jomZ9cIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6IFwi5ZWP6aGM5qiZ6aGM5qih5p2/LCDpu5joqo3ngro6ICd7bm99LiB7cmVxdWlyZX0ge3RpdGxlfSdcIixcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwi5ZWP6aGM6Yyv6Kqk5a6a5L2NXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcIuaUueiuiumggemdouaZguiBmueEpuWcqOesrOS4gOWAi+WVj+mhjFwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcIkVsZW1lbnRzIG9yZGVyIG9uIHRoZSBwYWdlXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIuWujOaIkOiqv+afpeeahOacgOmVt+aZgumWk1wiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwi5a6M5oiQ6Kq/5p+l5Lit6aCB6Z2i55qE5pyA6ZW35pmC6ZaTXCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwi6aGv56S66KiI5pmC5Zmo6Z2i5p2/XCIsXG4gICAgc2hvd1RpbWVyUGFuZWxNb2RlOiBcIumhr+ekuuioiOaZguWZqOmdouadv+aooeW8j1wiLFxuICAgIHJlbmRlck1vZGU6IFwi5riy5p+T5qih5byPXCIsXG4gICAgYWxsb3dBZGRQYW5lbDogXCLlhYHoqLHmt7vliqDpnaLmnb9cIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcIuWFgeioseWIqumZpOmdouadv1wiLFxuICAgIHBhbmVsQWRkVGV4dDogXCLmt7vliqDpnaLmnb/mlofmnKxcIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwi5Yiq6Zmk6Z2i5p2/5paH5pysXCIsXG4gICAgaXNTaW5nbGVQYWdlOiBcIuWcqOS4gOWAi+mggemdouS4iuWxleekuuaJgOacieWFg+e0oFwiLFxuICAgIHRhYnM6IHtcbiAgICAgIGdlbmVyYWw6IFwi6YCa55So6aCFXCIsXG4gICAgICBuYXZpZ2F0aW9uOiBcIuWwjuiIqlwiLFxuICAgICAgcXVlc3Rpb246IFwi5ZWP6aGMXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sOiBcIuWujOaIkOW+jOeahEh0bWxcIixcbiAgICAgIGxvYWRpbmdIdG1sOiBcIuWKoOi8ieS4reeahEh0bWxcIixcbiAgICAgIHRpbWVyOiBcIuWVj+WNt+ioiOaZguWZqFwiLFxuICAgICAgdHJpZ2dlcjogXCLop7jnmbzlmahcIixcbiAgICAgIGZpbGVPcHRpb25zOiBcIumBuOmghVwiLFxuICAgICAgaHRtbDogXCJIVE1MIOe3qOi8r+WZqFwiLFxuICAgICAgY29sdW1uczogXCLoqK3nva7liJdcIixcbiAgICAgIHJvd3M6IFwi6Kit572u6KGMXCIsXG4gICAgICBjaG9pY2VzOiBcIuioree9rumBuOmghVwiLFxuICAgICAgdmlzaWJsZUlmOiBcIuioree9ruWPr+imi+aineS7tlwiLFxuICAgICAgZW5hYmxlSWY6IFwiRW5hYmxlIElmXCIsXG4gICAgICByYXRlVmFsdWVzOiBcIuioree9ruipleWIhuWAvFwiLFxuICAgICAgY2hvaWNlc0J5VXJsOiBcIumAmumBjiBVUkwg5bCO5YWl6YG46aCFXCIsXG4gICAgICBtYXRyaXhDaG9pY2VzOiBcIum7mOiqjemBuOmghVwiLFxuICAgICAgbXVsdGlwbGVUZXh0SXRlbXM6IFwi5paH5pys6Ly45YWlXCIsXG4gICAgICB2YWxpZGF0b3JzOiBcIuagoempl+imj+WJh1wiXG4gICAgfSxcbiAgICBlZGl0UHJvcGVydHk6IFwi57eo6Lyv5bGs5oCnOiAnezB9J1wiLFxuICAgIGl0ZW1zOiBcIlsg6aCF55uu5pW46YePOiB7MH0gXVwiLFxuICAgIGVudGVyTmV3VmFsdWU6IFwi6KuL6Kit5a6a5YC8XCIsXG4gICAgbm9xdWVzdGlvbnM6IFwi5ZWP5Y235Lit6YKE5rKS5pyJ5Ym15bu65Lu75L2V5ZWP6aGMXCIsXG4gICAgY3JlYXRldHJpZ2dlcjogXCLoq4vlibXlu7rop7jnmbzlmahcIixcbiAgICB0cmlnZ2VyT246IFwi55W2IFwiLFxuICAgIHRyaWdnZXJNYWtlUGFnZXNWaXNpYmxlOiBcIuS9v+mggemdouWPr+imizpcIixcbiAgICB0cmlnZ2VyTWFrZVF1ZXN0aW9uc1Zpc2libGU6IFwi5L2/5ZWP6aGM5Y+v6KaLOlwiLFxuICAgIHRyaWdnZXJDb21wbGV0ZVRleHQ6IFwi5aaC5p6c5ru/6Laz5qKd5Lu277yM5YmH5a6M5oiQ5ZWP5Y23XCIsXG4gICAgdHJpZ2dlck5vdFNldDogXCLop7jnmbzlmajlsJrmnKroqK3nva5cIixcbiAgICB0cmlnZ2VyUnVuSWY6IFwi5ru/6Laz5LiL5YiX5qKd5Lu25pmC5Z+36KGMXCIsXG4gICAgdHJpZ2dlclNldFRvTmFtZTogXCLkv67mlLnkuIvliJfllY/poYzlgLw6IFwiLFxuICAgIHRyaWdnZXJTZXRWYWx1ZTogXCLkv67mlLnngro6IFwiLFxuICAgIHRyaWdnZXJJc1ZhcmlhYmxlOiBcIuWcqOWVj+WNt+aPkOS6pOe1kOaenOS4reS4jeimgeWMheWQq+ipsuiuiumHj1wiXG4gIH0sXG4gIC8vIHN0cmluZ3MgZm9yIG9wZXJhdG9yc1xuICBvcDoge1xuICAgIGVtcHR5OiBcIueCuuepulwiLFxuICAgIG5vdGVtcHR5OiBcIuS4jeeCuuepulwiLFxuICAgIGVxdWFsOiBcIuetieaWvFwiLFxuICAgIG5vdGVxdWFsOiBcIuS4jeetieaWvFwiLFxuICAgIGNvbnRhaW5zOiBcIuWMheWQq1wiLFxuICAgIG5vdGNvbnRhaW5zOiBcIuS4jeWMheWQq1wiLFxuICAgIGdyZWF0ZXI6IFwi5aSn5pa8XCIsXG4gICAgbGVzczogXCLlsI/mlrxcIixcbiAgICBncmVhdGVyb3JlcXVhbDogXCLlpKfmlrznrYnmlrxcIixcbiAgICBsZXNzb3JlcXVhbDogXCLlsI/mlrznrYnmlrxcIlxuICB9LFxuICAvLyBzdHJpbmdzIGZvciBlbWJlZCB3aW5kb3dcbiAgZXc6IHtcbiAgICBhbmd1bGFyOiBcIuS9v+eUqCBBbmd1bGFyIOaZglwiLFxuICAgIGpxdWVyeTogXCLkvb/nlKggSlF1ZXJ5IOaZglwiLFxuICAgIGtub2Nrb3V0OiBcIuS9v+eUqCBLbm9ja291dCDmmYJcIixcbiAgICByZWFjdDogXCLkvb/nlKggUmVhY3Qg5pmCXCIsXG4gICAgdnVlOiBcIuS9v+eUqCBWdWUg5pmCXCIsXG4gICAgYm9vdHN0cmFwOiBcIuS9v+eUqCBCb290c3RyYXAg5pmCXCIsXG4gICAgc3RhbmRhcmQ6IFwi5LiN5L2/55SoIEJvb3RzdHJhcCDmmYJcIixcbiAgICBzaG93T25QYWdlOiBcIuW1jOWFpemggemdoumhr+ekulwiLFxuICAgIHNob3dJbldpbmRvdzogXCLkvb/nlKjllq7njajnmoTllY/ljbfoppbnqpdcIixcbiAgICBsb2FkRnJvbVNlcnZlcjogXCLlvp7mnI3li5nlmajliqDovInllY/ljbcgSlNPTiDmlbjmk5pcIixcbiAgICB0aXRsZVNjcmlwdDogXCLohbPmnKzlkozmqKPlvI9cIixcbiAgICB0aXRsZUh0bWw6IFwiSFRNTFwiLFxuICAgIHRpdGxlSmF2YVNjcmlwdDogXCJKYXZhU2NyaXB0XCJcbiAgfSxcbiAgdmFsaWRhdG9yczoge1xuICAgIGFuc3dlcmNvdW50dmFsaWRhdG9yOiBcIuaVuOmHj+aqouafpVwiLFxuICAgIGVtYWlsdmFsaWRhdG9yOiBcIkVtYWlsXCIsXG4gICAgbnVtZXJpY3ZhbGlkYXRvcjogXCLmlbjlrZdcIixcbiAgICByZWdleHZhbGlkYXRvcjogXCLmraPliYfooajpgZTlvI9cIixcbiAgICB0ZXh0dmFsaWRhdG9yOiBcIuaWh+acrFwiXG4gIH0sXG4gIHRyaWdnZXJzOiB7XG4gICAgY29tcGxldGV0cmlnZ2VyOiBcIuWujOaIkOWVj+WNt1wiLFxuICAgIHNldHZhbHVldHJpZ2dlcjogXCLoqK3nva7llY/poYzlgLxcIixcbiAgICB2aXNpYmxldHJpZ2dlcjogXCLkv67mlLnlj6/opovmgKdcIlxuICB9LFxuICAvLyBzdHJpbmdzIG9mIHByb3BlcnRpZXNcbiAgcDoge1xuICAgIGNvbW1lbnRUZXh0OiBcIuWCmeiou+aWh+acrFwiLFxuICAgIGNob2ljZXM6IFwi6YG46aCFXCIsXG4gICAgY2hvaWNlc0J5VXJsOiBcIlVybOmBuOmghVwiLFxuICAgIGNob2ljZXNPcmRlcjogXCLpgbjpoIXmjpLluo9cIixcbiAgICBjb2xDb3VudDogXCLliJfmlbhcIixcbiAgICBjb3JyZWN0QW5zd2VyOiBcIuato+eiuuetlOahiFwiLFxuICAgIGRlZmF1bHRWYXVsZTogXCLpoJDoqK3pgbjpoIVcIixcbiAgICBkZXNjcmlwdGlvbjogXCLoqqrmmI5cIixcbiAgICBlbmFibGVJZjogXCLlhYHoqLHliKTmlrdcIixcbiAgICBoYXNDb21tZW50OiBcImhhc0NvbW1lbnRcIixcbiAgICBoYXNPdGhlcjogXCLlhYHoqLHlhbbku5bnrZTmoYhcIixcbiAgICBvdGhlclRleHQ6IFwi5YW25LuW562U5qGI5paH5pysXCIsXG4gICAgcGFnZTogXCLmiYDlnKjpoIHpnaJcIixcbiAgICByZWFkT25seTogXCLlj6roroBcIixcbiAgICBpbmRlbnQ6IFwi57iu5o6SXCIsXG4gICAgaXNSZXF1aXJlZDogXCLlv4XloatcIixcbiAgICByZXF1aXJlZEVycm9yVGV4dDogXCJyZXF1aXJlZEVycm9yVGV4dFwiLFxuICAgIG90aGVyRXJyb3JUZXh0OiBcInJlcXVpcmVkRXJyb3JUZXh0XCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCLlhYHoqLHllY/poYzlnKjmlrDooYxcIixcbiAgICAvL3N1cnZleVxuICAgIHNob3dUaXRsZTogXCLpoa/npLov6Zqx6JePIOaomemhjFwiLFxuICAgIGxvY2FsZTogXCLpu5joqo3oqp7oqIBcIixcbiAgICBtb2RlOiBcIuaooeW8jyAo57eo6LyvL+WPquiugClcIixcbiAgICBjbGVhckludmlzaWJsZVZhbHVlczogXCLmuIXpmaTpmrHol4/lgLxcIixcbiAgICBjb29raWVOYW1lOiBcIkNvb2tpZSBuYW1lICh0byBkaXNhYmxlIHJ1biBzdXJ2ZXkgdHdvIHRpbWVzIGxvY2FsbHkpXCIsXG4gICAgc2VuZFJlc3VsdE9uUGFnZU5leHQ6IFwiU2VuZCBzdXJ2ZXkgcmVzdWx0cyBvbiBwYWdlIG5leHRcIixcbiAgICBzdG9yZU90aGVyc0FzQ29tbWVudDogXCJTdG9yZSAnb3RoZXJzJyB2YWx1ZSBpbiBzZXBhcmF0ZSBmaWVsZFwiLFxuICAgIHNob3dQYWdlVGl0bGVzOiBcIumhr+ekuumggemdouaomemhjFwiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCLpoa/npLrpoIHmlbhcIixcbiAgICBwYWdlUHJldlRleHQ6IFwi5YmN5LiA6aCB5oyJ6YiV5paH5pysXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIuW+jOS4gOmggeaMiemIleaWh+acrFwiLFxuICAgIGNvbXBsZXRlVGV4dDogXCLlrozmiJDmjInpiJXmlofmnKxcIixcbiAgICBzdGFydFN1cnZleVRleHQ6IFwi6ZaL5aeL5oyJ6YiV5paH5pysXCIsXG4gICAgc2hvd05hdmlnYXRpb25CdXR0b25zOiBcIumhr+ekuuWwjuiIquaMiemIlSAo6buY6KqN5bCO6IiqKVwiLFxuICAgIHNob3dQcmV2QnV0dG9uOiBcIumhr+ekuuWJjeS4gOmggeaMiemIlSAo55So5oi25Y+v6L+U5Zue6Iez5YmN5LiA6aCB6Z2iKVwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCLoqr/mn6XnmoTnrKzkuIDpoIHpnaLngrrotbflp4vpoIEuXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwi57WQ5bC+5bGV56S65a6M5oiQ5b6M55qE6aCB6Z2iIChjb21wbGV0ZWRIdG1sKVwiLFxuICAgIGdvTmV4dFBhZ2VBdXRvbWF0aWM6IFwi5Zue562U5pys6aCB5omA5pyJ5ZWP6aGM5b6M77yM6Ieq5YuV6Lez6L2J5Yiw5LiL5LiA6aCBXCIsXG4gICAgc2hvd1Byb2dyZXNzQmFyOiBcIumhr+ekuumAsuW6puainVwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCLllY/poYznmoTmqJnpoYzkvY3nva5cIixcbiAgICByZXF1aXJlZFRleHQ6IFwiVGhlIHF1ZXN0aW9uIHJlcXVpcmVkIHN5bWJvbChzKVwiLFxuICAgIHF1ZXN0aW9uU3RhcnRJbmRleDogXCLllY/poYzotbflp4vmqJnlv5cgKDEsIDIgb3IgJ0EnLCAnYScpXCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCLpoa/npLrllY/poYznt6jomZ9cIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6IFwi5ZWP6aGM5qiZ6aGM5qih5p2/LCDpu5joqo3ngro6ICd7bm99LiB7cmVxdWlyZX0ge3RpdGxlfSdcIixcbiAgICBxdWVzdGlvbkVycm9yTG9jYXRpb246IFwi5ZWP6aGM6Yyv6Kqk5a6a5L2NXCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcIuaUueiuiumggemdouaZguiBmueEpuWcqOesrOS4gOWAi+WVj+mhjFwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcIumggemdouS4reWFg+e0oOeahOmghuW6j1wiLFxuICAgIG1heFRpbWVUb0ZpbmlzaDogXCLlrozmiJDoqr/mn6XnmoTmnIDplbfmmYLplpNcIixcbiAgICBtYXhUaW1lVG9GaW5pc2hQYWdlOiBcIuWujOaIkOiqv+afpeS4remggemdoueahOacgOmVt+aZgumWk1wiLFxuICAgIHNob3dUaW1lclBhbmVsOiBcIumhr+ekuuioiOaZguWZqOmdouadv1wiLFxuICAgIHNob3dUaW1lclBhbmVsTW9kZTogXCLpoa/npLroqIjmmYLlmajpnaLmnb/mqKHlvI9cIixcbiAgICByZW5kZXJNb2RlOiBcIua4suafk+aooeW8j1wiLFxuICAgIGFsbG93QWRkUGFuZWw6IFwi5YWB6Kix5re75Yqg6Z2i5p2/XCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCLlhYHoqLHliKrpmaTpnaLmnb9cIixcbiAgICBwYW5lbEFkZFRleHQ6IFwi5re75Yqg6Z2i5p2/5paH5pysXCIsXG4gICAgcGFuZWxSZW1vdmVUZXh0OiBcIuWIqumZpOmdouadv+aWh+acrFwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCLlnKjkuIDlgIvpoIHpnaLkuIrlsZXnpLrmiYDmnInlhYPntKBcIixcbiAgICBuYW1lOiBcIuWQjeWtl1wiLFxuICAgIHRpdGxlOiB7XG4gICAgICBuYW1lOiBcIuaomemhjFwiLFxuICAgICAgdGl0bGU6IFwi5aaC5p6c6IiH5ZCN5a2X55u45ZCM77yM6KuL6Kit572u54K656m65YC8XCJcbiAgICB9LFxuICAgIHN1cnZleV90aXRsZToge1xuICAgICAgbmFtZTogXCLmqJnpoYxcIixcbiAgICAgIHRpdGxlOiBcIuWVj+WNt+aomemhjOWcqOavj+mggeS4iumDveacg+mhr+ekulwiXG4gICAgfSxcbiAgICBwYWdlX3RpdGxlOiB7XG4gICAgICBuYW1lOiBcIuaomemhjFwiLFxuICAgICAgdGl0bGU6IFwi6aCB6Z2i5qiZ6aGMXCJcbiAgICB9XG4gIH1cbn07XG5cbmVkaXRvckxvY2FsaXphdGlvbi5sb2NhbGVzW1wiemgtdHdcIl0gPSB0cmFkaXRpb25hbENoaW5lc2VUcmFuc2xhdGlvbjtcbiIsImltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcblxuZXhwb3J0IHZhciB0dXJraXNoU3RyaW5ncyA9IHtcbiAgLy9zdXJ2ZXkgdGVtcGxhdGVzXG4gIHN1cnZleToge1xuICAgIGVkaXQ6IFwiRMO8emVubGVcIixcbiAgICBleHRlcm5hbEhlbHBMaW5rOiBcIk5hc8SxbCBhbmtldCBvbHXFn3R1cnVsdXIgaXpsZVwiLFxuICAgIGV4dGVybmFsSGVscExpbmtVcmw6XG4gICAgICBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2NoYW5uZWwvVUNIMnJ1OW9rSWNvb05aZnBJYnlxNHFRP3ZpZXdfYXM9c3Vic2NyaWJlclwiLFxuICAgIGRyb3BRdWVzdGlvbjogXCJMw7x0ZmVuIGFyYcOnIGt1dHVzdW5kYW4gYmlyIHNvcnUgc8O8csO8a2xleWluLlwiLFxuICAgIGFkZExvZ2ljSXRlbTogXCJBbmtldCBha8SxxZ/EsW7EsSDDtnplbGxlxZ90aXJtZWsgacOnaW4gYmlyIGt1cmFsIG9sdcWfdHVydW4uXCIsXG4gICAgY29weTogXCJLb3B5YWxhXCIsXG4gICAgYWRkVG9Ub29sYm94OiBcIkFyYcOnIGt1dHVzdW5hIGVrbGVcIixcbiAgICBkZWxldGVQYW5lbDogXCJQYW5lbGkgU2lsXCIsXG4gICAgZGVsZXRlUXVlc3Rpb246IFwiU29ydXl1IFNpbFwiLFxuICAgIGNvbnZlcnRUbzogXCLDh2V2aXJcIixcbiAgICBkcmFnOiBcIk5lc25lIHPDvHLDvGtsZXlpblwiLFxuICB9LFxuICAvL3F1ZXN0aW9uVHlwZXNcbiAgcXQ6IHtcbiAgICBkZWZhdWx0OiBcIlZhcnNhecSxbGFuXCIsXG4gICAgY2hlY2tib3g6IFwiT25heSBLdXR1c3VcIixcbiAgICBjb21tZW50OiBcIllvcnVtXCIsXG4gICAgaW1hZ2VwaWNrZXI6IFwiUmVzaW0gc2XDp2ljaVwiLFxuICAgIGltYWdlOiBcIlJlc2ltXCIsXG4gICAgZHJvcGRvd246IFwiU2XDp2ltIEvEsXV0dXN1XCIsXG4gICAgZmlsZTogXCJEb3N5YVwiLFxuICAgIGh0bWw6IFwiSHRtbFwiLFxuICAgIG1hdHJpeDogXCJNYXRyaXggKHRlayBzZcOnaW0pXCIsXG4gICAgbWF0cml4ZHJvcGRvd246IFwiTWF0cml4ICjDp29rbHUgc2XDp2ltKVwiLFxuICAgIG1hdHJpeGR5bmFtaWM6IFwiTWF0cml4IChkaW5hbWlrIHNhdMSxcilcIixcbiAgICBtdWx0aXBsZXRleHQ6IFwiw4dva2x1IFlhesSxXCIsXG4gICAgcGFuZWw6IFwiUGFuZWxcIixcbiAgICBwYW5lbGR5bmFtaWM6IFwiUGFuZWwgKGRpbmFtaWsgcGFuZWwpXCIsXG4gICAgcmFkaW9ncm91cDogXCJTZcOnaW0gR3J1YnVcIixcbiAgICByYXRpbmc6IFwiRGXEn2VybGVuZGlybWVcIixcbiAgICB0ZXh0OiBcIlRlayBHaXJkaVwiLFxuICAgIGJvb2xlYW46IFwiTWFudMSxa3NhbCDEsGZhZGVcIixcbiAgICBleHByZXNzaW9uOiBcIsSwZmFkZSAoZMO8emVubGVuZW1leilcIixcbiAgICBzaWduYXR1cmVwYWQ6IFwixLBtemEgRGVmdGVyaVwiLFxuICAgIGZsb3dwYW5lbDogXCJBa8SxxZ8gUGFuZWxpXCIsXG4gIH0sXG4gIC8vU3RyaW5ncyBpbiBFZGl0b3JcbiAgZWQ6IHtcbiAgICBkZWZhdWx0TG9jYWxlOiBcIlZhcnlhecSxbGFuICh7MH0pXCIsXG4gICAgc3VydmV5OiBcIkFua2V0XCIsXG4gICAgc2V0dGluZ3M6IFwiQW5rZXQgQXlhcmxhcsSxXCIsXG4gICAgc2V0dGluZ3NUb29sdGlwOiBcIkFua2V0IGF5YXJsYXLEsW7EsSBhw6dcIixcbiAgICAvL29wamVjdFByb3BlcnRpZXNIZWFkZXI6IFwiR2VsacWfbWnFn1wiLFxuICAgIC8vc2hvd09iamVjdFByb3BlcnRpZXM6IFwiTmVzbmUgw5Z6ZWxsaWtsZXJpbmkgR8O2c3RlclwiLFxuICAgIC8vaGlkZU9iamVjdFByb3BlcnRpZXM6IFwiTmVzbmUgw5Z6ZWxsaWtsZXJpbmkgR2l6bGVcIixcbiAgICBzaG93UGFuZWw6IFwiUGFuZWxpIEfDtnN0ZXJcIixcbiAgICBoaWRlUGFuZWw6IFwiUGFuZWxpIEdpemxlXCIsXG4gICAgLy9lZGl0U3VydmV5OiBcIkFua2V0aSBEw7x6ZW5sZVwiLFxuICAgIGFkZE5ld1BhZ2U6IFwiWWVuaSBTYXlmYSBFa2xlXCIsXG4gICAgbW92ZVJpZ2h0OiBcIlNhxJ9hIHPDvHLDvGtsZVwiLFxuICAgIG1vdmVMZWZ0OiBcIlNvbGEgc8O8csO8a2xlXCIsXG4gICAgZGVsZXRlUGFnZTogXCJTYXlmYXnEsSBTaWxcIixcbiAgICBlZGl0UGFnZTogXCJTYXlmYXnEsSBEw7x6ZW5sZVwiLFxuICAgIGVkaXQ6IFwiRMO8emVubGVcIixcbiAgICBuZXdQYWdlTmFtZTogXCJTYXlmYVwiLFxuICAgIG5ld1F1ZXN0aW9uTmFtZTogXCJTb3J1XCIsXG4gICAgbmV3UGFuZWxOYW1lOiBcIlBhbmVsXCIsXG4gICAgbmV3VGV4dEl0ZW1OYW1lOiBcIllhesSxXCIsXG4gICAgdGVzdFN1cnZleTogXCJBbmtldGkgVGVzdCBFdFwiLFxuICAgIHRlc3RTdXJ2ZXlBZ2FpbjogXCJBbmtldGkgVGVrcmFyIFRlc3QgRXRcIixcbiAgICB0ZXN0U3VydmV5V2lkdGg6IFwiQW5rZXQgZ2VuacWfbGnEn2k6IFwiLFxuICAgIG5hdmlnYXRlVG9Nc2c6IFwixZ51cmF5YSBnaXQ6XCIsXG4gICAgbG9naWM6IFwiTWFudMSxa3NhbCBBbmtldFwiLFxuICAgIGVtYmVkU3VydmV5OiBcIkfDtsO8bMO8IEFua2V0XCIsXG4gICAgdHJhbnNsYXRpb246IFwiw4dldmlyaVwiLFxuICAgIHNhdmVTdXJ2ZXk6IFwiQW5rZXRpIEtheWRldFwiLFxuICAgIHNhdmVTdXJ2ZXlUb29sdGlwOiBcIkFua2V0aSBLYXlkZXRcIixcbiAgICBkZXNpZ25lcjogXCJBbmtldCBUYXNhcsSxbcSxXCIsXG4gICAganNvbkVkaXRvcjogXCJKU09OIEVkaXRvclwiLFxuICAgIHVuZG86IFwiR2VyaVwiLFxuICAgIHJlZG86IFwixLBsZXJpXCIsXG4gICAgdW5kb1Rvb2x0aXA6IFwiU29uIGRlxJ9pxZ9pa2xpxJ9pIGdlcmkgYWxcIixcbiAgICByZWRvVG9vbHRpcDogXCJTb24gZGXEn2nFn2lrbGnEn2kgaWxlcmkgYWxcIixcbiAgICBvcHRpb25zOiBcIlNlw6dlbmVrbGVyXCIsXG4gICAgZ2VuZXJhdGVWYWxpZEpTT046IFwiSlNPTiBPbHXFn3R1clwiLFxuICAgIGdlbmVyYXRlUmVhZGFibGVKU09OOiBcIk9rdW5hYmlsaXIgSlNPTiBvbHXFn3R1clwiLFxuICAgIHRvb2xib3g6IFwiQXJhw6cgS3V0dXN1XCIsXG4gICAgXCJwcm9wZXJ0eS1ncmlkXCI6IFwiw5Z6ZWxsaWtsZXJcIixcbiAgICB0b29sYm94R2VuZXJhbENhdGVnb3J5OiBcIkdlbmVsXCIsXG4gICAgLy9kZWxTZWxPYmplY3Q6IFwiU2XDp2lsaSBuZXNuZXlpIHNpbFwiLFxuICAgIC8vZWRpdFNlbE9iamVjdDogXCJTZcOnaWxpIG5lc25leWkgZMO8emVubGVcIixcbiAgICBjb3JyZWN0SlNPTjogXCJKU09OIG5lc25lc2luaSBkb8SfcnVsYXIuXCIsXG4gICAgc3VydmV5UmVzdWx0czogXCJBbmtldCBTb251Y3U6IFwiLFxuICAgIHN1cnZleVJlc3VsdHNUYWJsZTogXCJUYWJsbyBvbGFyYWtcIixcbiAgICBzdXJ2ZXlSZXN1bHRzSnNvbjogXCJKU09OIG9sYXJha1wiLFxuICAgIHJlc3VsdHNUaXRsZTogXCJTb3J1IGJhxZ9sxLHEn8SxXCIsXG4gICAgcmVzdWx0c05hbWU6IFwiU29ydSBhZMSxXCIsXG4gICAgcmVzdWx0c1ZhbHVlOiBcIkNldmFwIGRlxJ9lcmlcIixcbiAgICByZXN1bHRzRGlzcGxheVZhbHVlOiBcIkfDtnLDvG5lbiBkZcSfZXJcIixcbiAgICBtb2RpZmllZDogXCJEw7x6ZW5sZW5kaVwiLFxuICAgIHNhdmluZzogXCJLYXlkZWRpbGl5b3JcIixcbiAgICBzYXZlZDogXCJLYXlkZWRpbGRpXCIsXG4gICAgc2F2ZUVycm9yOiBcIkhhdGEhIEVkaXRvciBpw6dlcmlzaSBrYXlkZWRpbG1lZGkuXCIsXG4gICAgdHJhbnNsYXRpb25BZGRMYW5ndWFnZTogXCLDh2V2aXJpIGnDp2luIGRpbCBzZcOnaW5pelwiLFxuICAgIHRyYW5zbGF0aW9uU2hvd0FsbFN0cmluZ3M6IFwiVMO8bSB5YXrEsWxhcsSxIGfDtnN0ZXJcIixcbiAgICB0cmFuc2xhdGlvblNob3dBbGxQYWdlczogXCJUw7xtIHNheWZhbGFyxLEgZ8O2c3RlclwiLFxuICAgIHRyYW5zbGF0aW9uTm9TdHJpbmdzOiBcIsOHZXZyaWxlY2VrIHlhesSxIHlvay4gTMO8dGZlbiwgZmlsdHJleWkgZGXEn2nFn3RpcmluLlwiLFxuICAgIHRyYW5zbGF0aW9uRXhwb3J0VG9TQ1ZCdXR0b246IFwiQ1NWIGTEscWfYSDDp8Sxa2FydFwiLFxuICAgIHRyYW5zbGF0aW9uSW1wb3J0RnJvbVNDVkJ1dHRvbjogXCJDU1YgacOnZSBha3RhclwiLFxuICAgIHRyYW5zbGF0aW9uTWVyZ2VMb2NhbGVXaXRoRGVmYXVsdDogXCJ7MH0gdmFyc2F5xLFsYW4gw6dldmlyaSBpbGUgc8Sxa8SxxZ90xLFyXCIsXG4gICAgYm9sZDogXCJLYWzEsW5cIixcbiAgICBpdGFsaWM6IFwiSXRhbGlrXCIsXG4gICAgdW5kZXJsaW5lOiBcIkFsdCDDh2l6Z2lcIixcbiAgICBmcEFkZFF1ZXN0aW9uOiBcIlNvcnUgRWtsZS4uLlwiLFxuICAgIC8vY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uSXRlbVRleHQ6IFwiR8O2c3RlciBFxJ9lcjpcIixcbiAgICBsZzoge1xuICAgICAgLy9Mb2dpYyB0YWIgc3RyaW5nc1xuICAgICAgcGFnZV92aXNpYmlsaXR5TmFtZTogXCJTYXlmYSBnw7Zyw7xuw7xyc2VcIixcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlOYW1lOiBcIlBhbmVsIGfDtnLDvG7DvHJzZVwiLFxuICAgICAgcGFuZWxfZW5hYmxlTmFtZTogXCJQYW5lbCBha3RpZi9wYXNpZiBpc2VcIixcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlOYW1lOiBcIlNvcnUgZ8O2csO8w7xyc2VcIixcbiAgICAgIHF1ZXN0aW9uX2VuYWJsZU5hbWU6IFwiU29ydSBha3RpZi9wYXNpZnNlXCIsXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlTmFtZTogXCJTb3J1IGlzdGXEn2UgYmHEn2zEsSB6b3J1bmx1eXNhXCIsXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlTmFtZTogXCJBbmtldGkgdGFtYW1sYVwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZU5hbWU6IFwiU29ydSBkZcSfZXJpbmkgZ8O8bmNlbGxlXCIsXG4gICAgICB0cmlnZ2VyX2NvcHl2YWx1ZU5hbWU6IFwiU29ydSBkZcSfZXJpbmkga29weWFsYVwiLFxuICAgICAgdHJpZ2dlcl9za2lwTmFtZTogXCJTb3J1eXUgYXRsYVwiLFxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uTmFtZTogXCJWYXJzYXnEsWxhbiBpZmFkZXlpIMOnYWzEscWfdMSxclwiLFxuICAgICAgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uTmFtZTogXCJWYXJ5YWzEsW4gJ1RlxZ9la2vDvHIgc2F5ZmFzxLEnIHlhesSxc8SxXCIsXG5cbiAgICAgIHBhZ2VfdmlzaWJpbGl0eURlc2NyaXB0aW9uOlxuICAgICAgICBcIk1hbnTEsWtzYWwgc29yZ3UgZ2XDp2VybGkgb2xkdcSfdSB6YW1hbiBzYXlmYXnEsSBnw7Zyw7xuw7xyIHlhcC4gQWtzaSB0YWtkaXJkZSBnaXpsZS5cIixcbiAgICAgIHBhbmVsX3Zpc2liaWxpdHlEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJNYW50xLFrc2FsIHNvcmd1IGdlw6dlcmxpIG9sZHXEn3UgemFtYW4gcGFuZWxpIGfDtnLDvG7DvHIgeWFwLiBBa3NpIHRha2RpcmRlIGdpemxlLlwiLFxuICAgICAgcGFuZWxfZW5hYmxlRGVzY3JpcHRpb246XG4gICAgICAgIFwiUGFuZWwgb2x1xZ90dXIgdmUgdMO8bSBuZXNuZWxlcmkgcGFuZWxpbiBpw6dpbmUgYWwuIE1hbnTEsWtzYWwgc29yZ3UgZ2XDp2VybGkgb2xkdcSfdW5kYSBwYW5lbGkgYWt0aWYgZXQuIEFrc2kgdGFrZGlyZGUgdMO8bcO8bsO8IHBhc2lmbGXFn3Rpci5cIixcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlEZXNjcmlwdGlvbjpcbiAgICAgICAgXCJNYW50xLFrc2FsIHNvcmd1IGdlw6dlcmxpIG9sZHXEn3VuZGEgc29ydXl1IGfDtnLDvG7DvHIgeWFwLiBBa3NpIHRha2RpcmRlIGdpemxlLlwiLFxuICAgICAgcXVlc3Rpb25fZW5hYmxlRGVzY3JpcHRpb246XG4gICAgICAgIFwiTWFudMSxa3NhbCBzb3JndSBnZcOnZXJsaSBvbGR1xJ91bmRhIHNvcnV5dSBha3RpZiB5YXAuIEFrc2kgdGFrZGlyZGUgcGFzaWZsZcWfdGlyLlwiLFxuICAgICAgcXVlc3Rpb25fcmVxdWlyZURlc2NyaXB0aW9uOlxuICAgICAgICBcIk1hbnTEsWtzYWwgc29yZ3UgZ2XDp2VybGkgb2xkdcSfdW5kYSBzb3J1eXUgem9ydW5sdSBvbGFyYWsgZMO8emVubGUuXCIsXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlRGVzY3JpcHRpb246XG4gICAgICAgIFwiTWFudMSxa3NhbCBzb3JndSBnZcOnZXJsaSBvbGR1xJ91bmRhIGFua2V0aSB0YW1hbWxhIHZlIHNvbiBrdWxsYW7EsXlhICdUZcWfZWtrw7xyIHNheWZhc8SxJ27EsSBnw7ZzdGVyLlwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZURlc2NyaXB0aW9uOlxuICAgICAgICBcIk1hbnTEsWsgaWZhZGVzaW5kZSBrdWxsYW7EsWxhbiBzb3J1IGRlxJ9lcmxlcmkgZGXEn2nFn3RpcmlsZGnEn2luZGUgdmUgbWFudMSxayBpZmFkZXNpIHRydWUgZGXEn2VyaW5pIGTDtm5kw7xyZMO8xJ/DvG5kZSwgZGXEn2VyIHNlw6dpbGVuIHNvcnV5YSBheWFybGFuc8Sxbi5cIixcbiAgICAgIHRyaWdnZXJfY29weXZhbHVlRGVzY3JpcHRpb246XG4gICAgICAgIFwiTWFudMSxayBpZmFkZXNpbmRlIGt1bGxhbsSxbGFuIHNvcnUgZGXEn2VybGVyaSBkZcSfacWfdGlyaWxkacSfaW5kZSB2ZSBtYW50xLFrIGlmYWRlc2kgdHJ1ZSBkZcSfZXJpbmkgZMO2bmTDvHJkw7zEn8O8bmRlLCBzZcOnaWxlbiBiaXIgc29ydW51biBkZcSfZXJpIHNlw6dpbGVuIGJhxZ9rYSBiaXIgc29ydXlhIGtvcHlhbGFuc8Sxbi5cIixcbiAgICAgIHRyaWdnZXJfc2tpcERlc2NyaXB0aW9uOlxuICAgICAgICBcIk1hbnTEsWtzYWwgaWZhZGUgZ2XDp2VybGkgb2xkdcSfdW5kYSBhbmtldCBzZcOnaWxlbiBzb3J1eWEgYXRsYXPEsW4gLyBvZGFrbGFuc8Sxbi5cIixcbiAgICAgIHRyaWdnZXJfcnVuRXhwcmVzc2lvbkRlc2NyaXB0aW9uOlxuICAgICAgICBcIk1hbnRrc2FsIGlmYWRlIGdlw6dlcmxpIG9sZHXEn3VuZGEgdmUgw7Z6ZWwgaWZhZGUgZ2VyZcOnbGkgb2x1ci4gxLBzdGXEn2UgYmHEn2zEsSBvbGFyYWsgYnUgaWZhZGUgc29udWN1bnUgc2XDp2lsZW4gc29ydXlhIGF5YXJsYXlhYmlsaXJzaW5pei5cIixcbiAgICAgIGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbkRlc2NyaXB0aW9uOlxuICAgICAgICBcIkXEn2VyIG1hbnTEsWtzYSBpZmFkZSBnZcOnZXJsaSBvbHVyc2EsIHZhcnNhecSxbGFuICcnVGXFn2Vra8O8cmxlciBzYXlmYXPEsScgeWF6xLFzxLEgZ2lyaWxlbiBpbGUgZMSfZWnFn3Rpcmlsc2luLlwiLFxuXG4gICAgICBpdGVtRXhwcmVzc2lvblRleHQ6IFwiTWFudMSxa3NhbCBpZmFkZTogJ3swfScgZ2XDp2VybGkgb2xzdW46XCIsIC8vezB9IC0gdGhlIGV4cHJlc3Npb25cbiAgICAgIHBhZ2VfdmlzaWJpbGl0eVRleHQ6IFwiezB9IHNheWZhecSxIGfDtnLDvG7DvHIgeWFwXCIsIC8vezB9IHBhZ2UgbmFtZVxuICAgICAgcGFuZWxfdmlzaWJpbGl0eVRleHQ6IFwiezB9IHBhbmVsaSBnw7Zyw7xuw7xyIHlhcFwiLCAvL3swfSBwYW5lbCBuYW1lXG4gICAgICBwYW5lbF9lbmFibGVUZXh0OiBcInswfSBwYW5lbCBha3RpZiBvbHVyXCIsIC8vezB9IHBhbmVsIG5hbWVcbiAgICAgIHF1ZXN0aW9uX3Zpc2liaWxpdHlUZXh0OiBcInswfSBzb3J1eXUgZ8O2csO8bsO8ciB5YXBcIiwgLy97MH0gcXVlc3Rpb24gbmFtZVxuICAgICAgcXVlc3Rpb25fZW5hYmxlVGV4dDogXCJ7MH0gc29ydXl1IGFrdGlmIHlhcFwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICBxdWVzdGlvbl9yZXF1aXJlVGV4dDogXCJ7MH0gY2V2YWLEsSB6b3J1bmx1IHlhcFwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICB0cmlnZ2VyX2NvbXBsZXRlVGV4dDogXCJBbmtldCB0YW1hbWxhbmTEsVwiLFxuICAgICAgdHJpZ2dlcl9zZXR2YWx1ZVRleHQ6IFwiU29ydW51biBpw6dpbmU6IHswfSBkZcSfZXIgezF9XCIsIC8vezB9IHF1ZXN0aW9uIG5hbWUsIHsxfSBzZXRWYWx1ZVxuICAgICAgdHJpZ2dlcl9jb3B5dmFsdWVUZXh0OiBcIlNvcnVzdW5kYW4gezF9LCB7MH0gZGXEn2VyaW5pLCBzb3J1eWEga29weWFsYVwiLCAvL3swfSBhbmQgezF9IHF1ZXN0aW9uIG5hbWVzXG4gICAgICB0cmlnZ2VyX3NraXBUZXh0OiBcIlNvcnV5YSBnZcOnIHswfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICB0cmlnZ2VyX3J1bkV4cHJlc3Npb25UZXh0MTogXCJNYW50xLFrc2FsIGlmYWRleWkgw6dhbMSxxZ90xLFyOiAnezB9J1wiLCAvL3swfSB0aGUgZXhwcmVzc2lvblxuICAgICAgdHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDI6IFwiIHZlIHNvbnXDpyBkZcSfZXJpbmkgc29ydXlhIGVrbGU6IHswfVwiLCAvL3swfSBxdWVzdGlvbiBuYW1lXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb25UZXh0OiBcIsOWemVsICdUZcWfZWtrw7xybGVyIHNheWZhc8SxbsSxJyBnw7ZzdGVyLlwiLFxuXG4gICAgICBjb25kaXRpb25zOiBcIktvxZ91bChsYXIpXCIsXG4gICAgICBhY3Rpb25zOiBcIk9sYXkobGFyKVwiLFxuICAgICAgZXhwcmVzc2lvbkVkaXRvclRpdGxlOiBcIktvxZ91bChsYXLEsSkgdGFuxLFtbGFcIixcbiAgICAgIGFjdGlvbnNFZGl0b3JUaXRsZTogXCJPbGF5KGxhcsSxKSB0YW7EsW1sYVwiLFxuXG4gICAgICBkZWxldGVBY3Rpb246IFwiT2xhecSxIFNpbFwiLFxuICAgICAgYWRkTmV3QWN0aW9uOiBcIlllbmkgb2xheSBla2xlXCIsXG4gICAgICBzZWxlY3RlZEFjdGlvbkNhcHRpb246IFwiRWtsZW1layBpw6dpbiBiaXIgb2xheSBzZcOnaW4uLi5cIixcblxuICAgICAgZXhwcmVzc2lvbkludmFsaWQ6XG4gICAgICAgIFwiTWFudMSxa3NhbCBpZmFkZSBib8WfIHZleWEgZ2XDp2Vyc2l6LiBMw7x0ZmVuIGTDvHplbmxleWluLlwiLFxuICAgICAgbm9BY3Rpb25FcnJvcjogXCJMw7x0ZmVuLCBFbiBheiBiaXIgb2xheSBzZcOnaW5pei5cIixcbiAgICAgIGFjdGlvbkludmFsaWQ6IFwiTMO8dGZlbiwgT2xheShsYXIpZGFraSBzb3J1bmxhcsSxIGdpZGVyaW5pei5cIixcbiAgICAgIGV4cHJlc3Npb25TZXR1cDogXCJcIixcbiAgICAgIGFjdGlvbnNTZXR1cDogXCJcIixcbiAgICB9LFxuICB9LFxuICAvL1Byb3BlcnR5IG5hbWVzIGluIHRhYmxlIGhlYWRlcnNcbiAgLy8gcGVsOiB7XG4gIC8vICAgaXNSZXF1aXJlZDogXCJSZXF1aXJlZD9cIlxuICAvLyB9LFxuICAvL1Byb3BlcnR5IEVkaXRvcnNcbiAgcGU6IHtcbiAgICBhcHBseTogXCJVeWd1bGFcIixcbiAgICBvazogXCJUQU1BTVwiLFxuICAgIHNhdmU6IFwiS2F5ZGV0XCIsXG4gICAgY2FuY2VsOiBcIsSwcHRhbFwiLFxuICAgIHJlc2V0OiBcIlPEsWbEsXJsYVwiLFxuICAgIHJlZnJlc2g6IFwiWWVuaWxlXCIsXG4gICAgLy8gY2xvc2U6IFwiQ2xvc2VcIixcbiAgICBkZWxldGU6IFwiU2lsXCIsXG4gICAgYWRkOiBcIkVrbGVcIixcbiAgICBhZGROZXc6IFwiWWVuaSBFa2xlXCIsXG4gICAgYWRkSXRlbTogXCJZZW5pIG5lc25lIGVrbGVtZSBpw6dpbiB0xLFrbGF5xLFuxLF6Li4uXCIsXG4gICAgYWRkT3RoZXI6IFwiRGnEn2VyXCIsXG4gICAgYWRkU2VsZWN0QWxsOiBcIlTDvG3DvG7DvCBTZcOnXCIsXG4gICAgYWRkTm9uZTogXCJIacOnYmlyaVwiLFxuICAgIHJlbW92ZUFsbDogXCJUw7xtw7xuw7wgU2lsXCIsXG4gICAgZWRpdDogXCJEw7x6ZW5sZVwiLFxuICAgIGJhY2s6IFwiS2F5ZGV0bWVkZW4gw6fEsWtcIixcbiAgICBzYXZlQW5kQmFjazogXCJLYXlkZXQgdmUgw6fEsWtcIixcbiAgICAvLyBpdGVtVmFsdWVFZGl0OiBcIlZpc2libGUgSWZcIixcbiAgICBlZGl0Q2hvaWNlczogXCJTZcOnZW5la2xlcmkgZMO8emVubGVcIixcbiAgICBzaG93Q2hvaWNlczogXCJTZcOnZW5la2xlcmkgZ8O2c3RlclwiLFxuICAgIG1vdmU6IFwiSGFyZWtldFwiLFxuICAgIGVtcHR5OiBcIjxib8WfPlwiLFxuICAgIC8vIG5vdEVtcHR5OiBcIjxlZGl0IHZhbHVlPlwiLFxuICAgIGZhc3RFbnRyeTogXCJIxLF6bMSxIEdpcmnFn1wiLFxuICAgIGZvcm1FbnRyeTogXCJGb3JtIEdpcmnFn2lcIixcbiAgICB0ZXN0U2VydmljZTogXCJTZXJ2aXNpIHRlc3QgZXRcIixcbiAgICBpdGVtU2VsZWN0b3JFbXB0eTogXCJMw7x0ZmVuIG5lc25leWkgc2XDp2luaXpcIixcbiAgICBjb25kaXRpb25BY3Rpb25FbXB0eTogXCJMw7x0ZmVuIG9sYXnEsSBzZcOnaW5pelwiLFxuICAgIGNvbmRpdGlvblNlbGVjdFF1ZXN0aW9uOiBcIlNvcnV5dSBzZcOnLi4uXCIsXG4gICAgY29uZGl0aW9uU2VsZWN0UGFnZTogXCJTYXlmYXnEsSBzZcOnLi4uXCIsXG4gICAgY29uZGl0aW9uU2VsZWN0UGFuZWw6IFwiUGFuZWxpIHNlw6cuLi5cIixcbiAgICBjb25kaXRpb25WYWx1ZVF1ZXN0aW9uVGl0bGU6IFwiTMO8dGZlbiBkZcSfZXIvc2XDp2VuZWsgZ2lyaW5pelwiLFxuICAgIC8vIGNvbmRpdGlvbkhlbHA6XG4gICAgLy8gICBcIlBsZWFzZSBlbnRlciBhIGJvb2xlYW4gZXhwcmVzc2lvbi4gSXQgc2hvdWxkIHJldHVybiB0cnVlIHRvIGtlZXAgdGhlIHF1ZXN0aW9uL3BhZ2UgdmlzaWJsZS4gRm9yIGV4YW1wbGU6IHtxdWVzdGlvbjF9ID0gJ3ZhbHVlMScgb3IgKHtxdWVzdGlvbjJ9ICoge3F1ZXN0aW9uNH0gID4gMjAgYW5kIHtxdWVzdGlvbjN9IDwgNSlcIixcbiAgICBleHByZXNzaW9uSGVscDpcbiAgICAgIFwiTMO8dGZlbiBtYW50xLFrc2FsIGlmYWRlIGdpcmluaXouIFNvcnUgZGXEn2VybGVyaW5lIGVyacWfbWVrIGnDp2luIHPDvHNsw7wgcGFyYW50ZXoga3VsbGFuYWJpbGlyc2luaXo6ICd7cXVlc3Rpb24xfSArIHtxdWVzdGlvbjJ9JywgJyh7cHJpY2V9KntxdWFudGl0eX0pICogKDEwMCAtIHtkaXNjb3VudH0pJ1wiLFxuICAgIGFjZUVkaXRvckhlbHA6IFwiTWFudMSxa3NhbCBpZmFkZSBrb3B5YXPEsSBpw6dpbiBjdHJsK3NwYWNlIHR1xZ9sYXLEsW5hIGJhc8SxbsSxelwiLFxuICAgIGFjZUVkaXRvclJvd1RpdGxlOiBcIkdlw6dlcmxpIHNhdMSxclwiLFxuICAgIGFjZUVkaXRvclBhbmVsVGl0bGU6IFwiR2XDp2VybGkgcGFuZWxcIixcbiAgICBzaG93TW9yZTogXCJEYWhhIGZhemxhIGJpbGdpIGnDp2luIGRva8O8bWFudGFzeW9udSBpbmNlbGV5aW5pelwiLFxuICAgIC8vIGNvbmRpdGlvblNob3dNb3JlVXJsOlxuICAgIC8vICAgXCJodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeVBhcmFtZXRlcj9pZD1RdWVzdGlvbiZwYXJhbWV0ZXI9dmlzaWJsZUlmXCIsXG4gICAgYXNzaXN0YW50VGl0bGU6IFwiRXJpxZ9pbGViaWxpciBzb3J1bGFyOlwiLFxuICAgIGNlbGxzRW1wdHlSb3dzQ29sdW1uczogXCJFbiBheiBiaXIga29sb24gdmV5YSBzYXTEsXIgb2xtYWzEsVwiLFxuXG4gICAgcHJvcGVydHlJc0VtcHR5OiBcIkzDvHRmZW4gZGXEn2VyIGdpcmluaXpcIixcbiAgICBwcm9wZXJ0eU5hbWVJc05vdFVuaXF1ZTogXCJMw7x0ZmVuIGJlbnplcnNpeiBiaXIgaXNpbSBnaXJpbml6XCIsXG4gICAgbGlzdElzRW1wdHk6IFwiWWVuaSBlbGVtYW4gZWtsZVwiLFxuICAgIGV4cHJlc3Npb25Jc0VtcHR5OiBcIk1hbnTEsWtzYWwgaWZhZGUgYm/Fn1wiLFxuICAgIHZhbHVlOiBcIkRlxJ9lclwiLFxuICAgIHRleHQ6IFwiWWF6xLFcIixcbiAgICByb3dpZDogXCJTYXTEsXIgSURcIixcbiAgICBpbWFnZUxpbms6IFwiUmVzaW0gbGlua2lcIixcbiAgICBjb2x1bW5FZGl0OiBcIktvbG9udSBkw7x6ZW5sZTogezB9XCIsXG4gICAgaXRlbUVkaXQ6IFwiRWxlbWFuIGTDvHplbmxlOiB7MH1cIixcblxuICAgIHVybDogXCJVUkxcIixcbiAgICBwYXRoOiBcIllvbFwiLFxuICAgIHZhbHVlTmFtZTogXCJEZcSfZXIgYWTEsVwiLFxuICAgIHRpdGxlTmFtZTogXCJCYcWfbMSxayBhZMSxXCIsXG4gICAgdGl0bGVQbGFjZWhvbGRlcjogXCJCYcWfbMSxa1wiLFxuICAgIHN1cnZleVRpdGxlUGxhY2Vob2xkZXI6IFwiQW5rZXQgYmHFn2zEscSfxLFcIixcbiAgICBwYWdlVGl0bGVQbGFjZWhvbGRlcjogXCJTYXlmYSBiYcWfbMSxxJ/EsVwiLFxuICAgIGRlc2NyaXB0aW9uUGxhY2Vob2xkZXI6IFwiQmlyIGHDp8Sxa2xhbWEgZ2lyaW5pelwiLFxuICAgIHN1cnZleURlc2NyaXB0aW9uUGxhY2Vob2xkZXI6IFwiQW5rZXQgYcOnxLFrbGFtYXPEsSBnaXJpbml6XCIsXG4gICAgcGFnZURlc2NyaXB0aW9uUGxhY2Vob2xkZXI6IFwiU2F5ZmEgYcOnxLFrbGFtYXPEsSBnaXJpbml6XCIsXG5cbiAgICBoYXNPdGhlcjogXCJCYcWfa2EgYmlyIMO2xJ9leWUgc2FoaXBcIixcbiAgICBvdGhlclRleHQ6IFwiRGnEn2VyIGVsZW1hbiBtZXRuaVwiLFxuICAgIGhhc05vbmU6IFwiSGnDp2JpciBlbGVtYW5hIHNhaGlwIGRlxJ9pbFwiLFxuICAgIG5vbmVUZXh0OiBcIkhpw6diaXIgZWxlbWFuIG1ldG5pXCIsXG4gICAgaGFzU2VsZWN0QWxsOiBcIlTDvG0gZWxlbWFubGFyIHNlw6dpbGRpXCIsXG4gICAgc2VsZWN0QWxsVGV4dDogXCJUw7xtIGVsZW1hbmxhcsSxbiB5YXrEsXPEsW7EsSBzZcOnXCIsXG4gICAgY2hvaWNlc01pbjogXCJPdG9tYXRpayBvbHXFn3R1cnVsYW4gw7bEn2VsZXIgacOnaW4gbWluaW11bSBkZcSfZXJcIixcbiAgICBjaG9pY2VzTWF4OiBcIk90b21hdGlrIG9sdcWfdHVydWxhbiDDtsSfZWxlciBpw6dpbiBtYWtzaW11bSBkZcSfZXJcIixcbiAgICBjaG9pY2VzU3RlcDogXCJPdG9tYXRpayBvbHXFn3R1cnVsYW4gw7bEn2VsZXIgYXJhc8SxbmRha2kgZmFya1wiLFxuICAgIG5hbWU6IFwiaXNpbVwiLFxuICAgIHRpdGxlOiBcIkJhxZ9sxLFrXCIsXG4gICAgY2VsbFR5cGU6IFwiSMO8Y3JlIHRpcGlcIixcbiAgICBjb2xDb3VudDogXCJLb2xvbiBzYXnEsXPEsVwiLFxuICAgIGNob2ljZXNPcmRlcjogXCJTZcOnZW5layBzxLFyYXPEsW7EsSBzZcOnXCIsXG4gICAgdmlzaWJsZTogXCJHw7Zyw7xuw7xyP1wiLFxuICAgIGlzUmVxdWlyZWQ6IFwiWm9ydW5sdT9cIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcIlTDvG0gc2F0xLFybGFyIHpvcnVubHVcIixcbiAgICByZXF1aXJlZEVycm9yVGV4dDogXCJab3J1bmx1IGhhdGEgeWF6xLFzxLFcIixcbiAgICBzdGFydFdpdGhOZXdMaW5lOiBcIlllbmkgc2F0xLFybGEgYmHFn2xhP1wiLFxuICAgIHJvd3M6IFwiU2F0xLFyIHNhecSxc8SxXCIsXG4gICAgY29sczogXCJLb2xvbiBzYXnEsXPEsVwiLFxuICAgIHBsYWNlSG9sZGVyOiBcIkdpcmnFnyB2YXJzYXnEsWxhbiBpw6dlcmnEn2lcIixcbiAgICBzaG93UHJldmlldzogXCJSZXNpbSDDtm5pemxlbWUgZ8O2c3RlcmlsaXlvciBtdT8/XCIsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBcIkRvc3lhIGnDp2VyacSfaW5pIEpTT04gc29udWN1bmRhIG1ldGluIG9sYXJhayBkZXBvbGFcIixcbiAgICBtYXhTaXplOiBcIkJheXQgY2luc2luZGVuIG1ha3NpbXVtIGRvc3lhIGJveXV0dVwiLFxuICAgIGltYWdlSGVpZ2h0OiBcIlJlc2ltIHnDvGtzZWtsacSfaVwiLFxuICAgIGltYWdlV2lkdGg6IFwiUmVzaW0gZ2VuacWfbGnEn2lcIixcbiAgICByb3dDb3VudDogXCJTYXTEsXIgc2F5xLFzxLFcIixcbiAgICBjb2x1bW5MYXlvdXQ6IFwiS29sb24geWVybGXFn2ltaVwiLFxuICAgIGFkZFJvd0xvY2F0aW9uOiBcIlNhdMSxciBidXRvbnUga29udW11IGVrbGVcIixcbiAgICBhZGRSb3dUZXh0OiBcIlNhdMSxciBidXRvbnUgeWF6xLFzxLEgZWtsZVwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwiU2F0xLFyIGJ1dG9udSB5YXrEsXPEsW7EsSBrYWxkxLFyXCIsXG4gICAgcmF0ZU1pbjogXCJNaW5pbXVtIG9yYW5cIixcbiAgICByYXRlTWF4OiBcIk1ha3NpbXVtIG9yYW5cIixcbiAgICByYXRlU3RlcDogXCJPeWxhbWEgYWTEsW3EsVwiLFxuICAgIG1pblJhdGVEZXNjcmlwdGlvbjogXCJNaW5pbXVtIG9yYW4gYcOnxLFrbGFtYXPEsVwiLFxuICAgIG1heFJhdGVEZXNjcmlwdGlvbjogXCJNYWtzaW11bSBvcmFuIGHDp8Sxa2xhbWFzxLFcIixcbiAgICBpbnB1dFR5cGU6IFwiR2lyZGkgdGlwaVwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIlNlw6dlbmVrbGVyIGJhxZ9sxLHEn8SxXCIsXG4gICAgZGVmYXVsdFZhbHVlOiBcIlZhcnNhecSxbGFuIGRlxJ9lclwiLFxuICAgIGNlbGxzRGVmYXVsdFJvdzogXCJWYXJzYXnEsWxhbiBow7xjcmUgeWF6xLFzxLFcIixcblxuICAgIHN1cnZleUVkaXRvclRpdGxlOiBcIkFua2V0IGF5YXJsYXLEsW7EsSBkw7x6ZW5sZVwiLFxuICAgIHFFZGl0b3JUaXRsZTogXCJEw7x6ZW5sZTogezB9XCIsXG5cbiAgICBtYXhMZW5ndGg6IFwiTWFrc2ltdW0gdXp1bmx1a1wiLFxuXG4gICAgYnVpbGRFeHByZXNzaW9uOiBcIkt1clwiLFxuICAgIGVkaXRFeHByZXNzaW9uOiBcIkTDvHplbmxlXCIsXG4gICAgYW5kOiBcIlZlXCIsXG4gICAgb3I6IFwiVmV5YVwiLFxuICAgIHJlbW92ZTogXCJLYWxkxLFyXCIsXG4gICAgYWRkQ29uZGl0aW9uOiBcIktvxZ91bCBla2xlXCIsXG5cbiAgICAvL3N1cnZleVxuICAgIHNob3dUaXRsZTogXCJCYcWfbMSxxJ/EsSBnw7ZzdGVyL2dpemxlXCIsXG4gICAgbG9jYWxlOiBcIlZhcnNhecSxbGFuIGRpbFwiLFxuICAgIHNpbXVsYXRvcjogXCJDaWhheiBzZcOnaW5cIixcbiAgICBsYW5kc2NhcGVPcmllbnRhdGlvbjogXCJZYXRheVwiLFxuICAgIG1vZGU6IFwiTW9kIChkw7x6ZW5sZWJpbGlyL2TDvHplbmxlbmVtZXopXCIsXG4gICAgY2xlYXJJbnZpc2libGVWYWx1ZXM6IFwiR8O2csO8bm1leiBkZcSfZXJsZXJpIHNpbFwiLFxuICAgIGNvb2tpZU5hbWU6XG4gICAgICBcIsOHZXJleiBhZMSxIChhbmtldGkgeWVyZWwgb2xhcmFrIGlraSBrZXogZGV2cmUgZMSxxZ/EsSBixLFyYWttYWsgacOnaW4pXCIsXG4gICAgc2VuZFJlc3VsdE9uUGFnZU5leHQ6IFwiQmlyIHNvbnJha2kgc2F5ZmFkYSBhbmtldCBzb251w6dsYXLEsW7EsSBnw7ZuZGVyXCIsXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IFwiJ0RpxJ9lcmxlcmknIGRlxJ9lcmluaSBheXLEsSBhbGFuZGEgZGVwb2xhecSxblwiLFxuICAgIHNob3dQYWdlVGl0bGVzOiBcIlNheWZhIGJhxZ9sxLFrbGFyxLFuxLEgZ8O2c3RlclwiLFxuICAgIHNob3dQYWdlTnVtYmVyczogXCJTYXlmYSBudW1hcmFsYXLEsW7EsSBnw7ZzdGVyXCIsXG4gICAgcGFnZVByZXZUZXh0OiBcIsOWbmNla2kgc2F5ZmEgYnV0b251IG1ldG5pXCIsXG4gICAgcGFnZU5leHRUZXh0OiBcIlllbmkgc2F5ZmEgYnV0b251IG1ldG5pXCIsXG4gICAgY29tcGxldGVUZXh0OiBcIlRhbWFtbGEgYnV0b251IG1ldG5pXCIsXG4gICAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkJhxZ9sYSBidXRvbnUgeWF6xLFzxLFcIixcbiAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IFwiR2V6aW5tZSBidXRvbmxhcsSxbsSxIGfDtnN0ZXIgKHZhcnNhecSxbGFuIGdlemlubWUpXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwiw5ZuY2VraSBidXRvbnUgZ8O2c3RlciAoa3VsbGFuxLFjxLEgw7ZuY2VraSBzYXlmYXlhIGTDtm5lYmlsaXIpXCIsXG4gICAgZmlyc3RQYWdlSXNTdGFydGVkOiBcIkFua2V0dGVraSBpbGsgc2F5ZmEgYmlyIGJhxZ9sYW5nxLHDpyBzYXlmYXPEsWTEsXIuXCIsXG4gICAgc2hvd0NvbXBsZXRlZFBhZ2U6IFwiVGFtYW1sYW5hbiBzYXlmYXnEsSBlbiBzb251bmRhIGfDtnN0ZXIgKEhUTUwpXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzpcbiAgICAgIFwiVMO8bSBzb3J1bGFyxLEgY2V2YXBsYXJrZW4gb3RvbWF0aWsgb2xhcmFrIHNvbnJha2kgc2F5ZmF5YSBnaXRcIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwixLBsZXJsZW1lIMOndWJ1xJ91bnUgZ8O2c3RlclwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJTb3J1IGJhxZ9sxLHEn8SxIGtvbnVtdVwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJab3J1bmx1IHNvcnUgc2VtYm9sw7xcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwiU29ydSBpbmRla3NpICgxLCAyIHZleWEgJ0EnLCAnYScgZ2liaSlcIixcbiAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIlNvcnUgbnVtYXJhc8SxbsSxIGfDtnN0ZXJcIixcbiAgICBxdWVzdGlvblRpdGxlVGVtcGxhdGU6XG4gICAgICBcIlNvcnUgYmHFn2zEscSfxLEgxZ9hYmxvbnUsIHZhcnNhecSxbGFuIGRlxJ9lcjogJ3tub30uIHtyZXF1aXJlfSB7dGl0bGV9J1wiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJTb3J1IGhhdGFzxLEga29udW11XCIsXG4gICAgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOiBcIsSwbGsgc29ydXl1IHNheWZhecSxIGRlxJ9pxZ90aXJtZXllIG9kYWtsYVwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcIlNheWZhZGFraSDDtsSfZWxlcmluIHPEsXJhc8SxXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIkFua2V0aSBiaXRpcm1layBpw6dpbiBtYWtzaW11bSBzw7xyZVwiLFxuICAgIG1heFRpbWVUb0ZpbmlzaFBhZ2U6IFwiQW5rZXR0ZSBiaXIgc2F5ZmF5xLEgYml0aXJtZWsgacOnaW4gbWFrc2ltdW0gc8O8cmVcIixcbiAgICBzaG93VGltZXJQYW5lbDogXCJaYW1hbmxhecSxY8SxIHBhbmVsaW5pIGfDtnN0ZXJcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwiWmFtYW5sYXnEsWPEsSBwYW5lbGkgbW9kdW51IGfDtnN0ZXJcIixcbiAgICByZW5kZXJNb2RlOiBcIsSwxZ9sZW1lIG1vZHVcIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcIlBhbmVsIGVrbGVtZXllIGl6aW4gdmVyXCIsXG4gICAgYWxsb3dSZW1vdmVQYW5lbDogXCJQYW5lbCBzaWxtZXllIGl6aW4gdmVyXCIsXG4gICAgcGFuZWxBZGRUZXh0OiBcIlBhbmVsIGVrbGVtZSBtZXRuaVwiLFxuICAgIHBhbmVsUmVtb3ZlVGV4dDogXCJQYW5lbCBzaWxtZSBtZXRuaVwiLFxuICAgIGlzU2luZ2xlUGFnZTogXCJUw7xtIMO2xJ9lbGVyaSB0ZWsgYmlyIHNheWZhZGEgZ8O2c3RlclwiLFxuICAgIGh0bWw6IFwiSHRtbFwiLFxuICAgIGV4cHJlc3Npb246IFwiTWFudMSxa3NhbCDEsGZhZGVcIixcblxuICAgIG1pblZhbHVlOiBcIk1pbmltdW0gZGXEn2VyXCIsXG4gICAgbWF4VmFsdWU6IFwiTWFrc2ltdW0gZGXEn2VyXCIsXG4gICAgbWluTGVuZ3RoOiBcIk1pbmltdW0gdXp1bmx1a1wiLFxuICAgIGFsbG93RGlnaXRzOiBcIlJha2FtbGFyYSBpemluIHZlclwiLFxuICAgIG1pbkNvdW50OiBcIk1pbmltdW0gbWlrdGFyXCIsXG4gICAgbWF4Q291bnQ6IFwiTWFrc2ltdW0gbWlrdGFyXCIsXG4gICAgcmVnZXg6IFwiRMO8emVubGkgaWZhZGVcIixcblxuICAgIHRvdGFsVGV4dDogXCJUb3BsYW0gbWV0bmlcIixcbiAgICB0b3RhbFR5cGU6IFwiVG9wbGFtIHRpcGlcIixcbiAgICB0b3RhbEV4cHJlc3Npb246IFwiVG9wbGFtIG1hbnTEsWtzYWwgaWZhZGVcIixcbiAgICB0b3RhbERpc3BsYXlTdHlsZTogXCJUb3BsYW0gZ8O2csO8bsO8bVwiLFxuICAgIHRvdGFsQ3VycmVuY3k6IFwiVG9wbGFtIHBhcmEgYmlyaW1pXCIsXG4gICAgdG90YWxGb3JtYXQ6IFwiVG9wbGFtIGZvcm1hdFwiLFxuXG4gICAgLy8gSGVhZGVyICBhZG9ybmVyXG4gICAgbG9nb1Bvc2l0aW9uOiBcIkxvZ28gcG9zaXp5b251XCIsXG4gICAgYWRkTG9nbzogXCJMb2dvIGVrbGUuLi5cIixcbiAgICBjaGFuZ2VMb2dvOiBcIkxvZ295dSBkZcSfacWfdGlyLi4uXCIsXG4gICAgbG9nb1Bvc2l0aW9uczoge1xuICAgICAgbm9uZTogXCJMb2dveXUga2FsZMSxclwiLFxuICAgICAgbGVmdDogXCJTb2xcIixcbiAgICAgIHJpZ2h0OiBcIlNhxJ9cIixcbiAgICAgIHRvcDogXCLDnHN0dGVcIixcbiAgICAgIGJvdHRvbTogXCJBbHR0YVwiLFxuICAgIH0sXG5cbiAgICB0YWJzOiB7XG4gICAgICBnZW5lcmFsOiBcIkdlbmVsXCIsXG4gICAgICBmaWxlT3B0aW9uczogXCJTZcOnZW5la2xlclwiLFxuICAgICAgaHRtbDogXCJIdG1sIEVkaXRvclwiLFxuICAgICAgY29sdW1uczogXCJLb2xvbmxhclwiLFxuICAgICAgcm93czogXCJTYXTEsXJsYXJcIixcbiAgICAgIGNob2ljZXM6IFwiU2XDp2VuZWtsZXJcIixcbiAgICAgIGl0ZW1zOiBcIkVsZW1hbmxhclwiLFxuICAgICAgdmlzaWJsZUlmOiBcIkfDtnN0ZXIgZcSfZXJcIixcbiAgICAgIGVuYWJsZUlmOiBcIlBhc2lmbGXFn3RpciBFxJ9lclwiLFxuICAgICAgcmVxdWlyZWRJZjogXCJab3J1bmx1IEXEn2VyXCIsXG4gICAgICByYXRlVmFsdWVzOiBcIk9yYW4gZGXEn2VybGVyaVwiLFxuICAgICAgY2hvaWNlc0J5VXJsOiBcIldlYnRlbiBzZcOnZW5la2xlclwiLFxuICAgICAgbWF0cml4Q2hvaWNlczogXCJWYXJzYXnEsWxhbiBzZcOnZW5la2xlclwiLFxuICAgICAgbXVsdGlwbGVUZXh0SXRlbXM6IFwiWWF6xLEgZ2lyZGlsZXJpXCIsXG4gICAgICBudW1iZXJpbmc6IFwiUmFrYW1sYW1hXCIsXG4gICAgICB2YWxpZGF0b3JzOiBcIkRvxJ9ydWxhecSxY8SxbGFyXCIsXG4gICAgICBuYXZpZ2F0aW9uOiBcIkdlemlubWVcIixcbiAgICAgIHF1ZXN0aW9uOiBcIlNvcnVcIixcbiAgICAgIGNvbXBsZXRlZEh0bWw6IFwiVGFtYW1sYW5txLHFnyBIVE1MXCIsXG4gICAgICBjb21wbGV0ZWRIdG1sT25Db25kaXRpb246IFwiS2/Fn3VsZGEgSFRNTCB0YW1hbWxhbmTEsVwiLFxuICAgICAgbG9hZGluZ0h0bWw6IFwiQmVrbGVtZSBIVE1MaVwiLFxuICAgICAgdGltZXI6IFwiWmFtYW5sYXnEsWPEsSAvIFPEsW5hdlwiLFxuICAgICAgY2FsY3VsYXRlZFZhbHVlczogXCJIZXNhcGxhbmFuIERlxJ9lcmxlclwiLFxuICAgICAgdHJpZ2dlcnM6IFwiVGV0aWtsZXlpY2lsZXJcIixcbiAgICAgIHRlbXBsYXRlVGl0bGU6IFwixZ5hYmxvbiBiYcWfbMSxxJ/EsVwiLFxuICAgICAgdG90YWxzOiBcIlRvcGxhbWxhclwiLFxuICAgICAgbG9naWM6IFwiTWFudMSxa1wiLFxuICAgICAgbGF5b3V0OiBcIsWeYWJsb25cIixcbiAgICAgIGRhdGE6IFwiVmVyaVwiLFxuICAgICAgdmFsaWRhdGlvbjogXCJEb8SfcnVsYXnEsWPEsVwiLFxuICAgICAgY2VsbHM6IFwiSMO8Y3JlbGVyXCIsXG4gICAgICBzaG93T25Db21wbGV0ZWQ6IFwiVGFtYW1sYW5kxLEgR8O2c3RlclwiLFxuICAgICAgbG9nbzogXCJBbmtldCBCYcWfbMSxxJ/EsW5kYSBMb2dvXCIsXG4gICAgICBvdGhlcnM6IFwiRGnEn2VyXCIsXG4gICAgfSxcbiAgICBlZGl0UHJvcGVydHk6IFwiw5Z6ZWxsacSfaSBkw7x6ZW5sZSAnezB9J1wiLFxuICAgIGl0ZW1zOiBcIlsgRWxlbWFubGFyOiB7MH0gXVwiLFxuXG4gICAgZW50ZXJOZXdWYWx1ZTogXCJMw7x0ZmVuLCBkZcSfZXIgZ2lyaW4uXCIsXG4gICAgbm9xdWVzdGlvbnM6IFwiQW5rZXR0ZSBoZXJoYW5naSBiaXIgc29ydSB5b2suXCIsXG4gICAgY3JlYXRldHJpZ2dlcjogXCJMw7x0ZmVuIGJpciB0ZXRpa2xleWljaSBvbHXFn3R1cnVuXCIsXG4gICAga2V5Ym9hcmRBZG9ybmVyVGlwOlxuICAgICAgXCLDlsSfZXlpIGTDvHplbmxlbWVrIGnDp2luIGVudGVyIGJ1dG9udW5hIGJhc8Sxbiwgw7bEn2V5aSBzaWxtZWsgacOnaW4gc2lsIGJ1dG9udW5hIGJhc8Sxbiwgw7bEn2V5aSB0YcWfxLFtYWsgacOnaW4ga29udHJvbCBhcnTEsSBvayB5dWthcsSxIHZleWEgb2sgdHXFn3VuYSBiYXPEsW5cIixcbiAgICB0cmlnZ2VyT246IFwiQcOnxLFrIFwiLFxuICAgIHRyaWdnZXJNYWtlUGFnZXNWaXNpYmxlOiBcIlNheWZhbGFyxLEgZ8O2csO8bsO8ciB5YXA6XCIsXG4gICAgdHJpZ2dlck1ha2VRdWVzdGlvbnNWaXNpYmxlOiBcIkVsZW1hbmxhcsSxIGfDtnLDvG7DvHIgeWFwOlwiLFxuICAgIHRyaWdnZXJDb21wbGV0ZVRleHQ6IFwiQmHFn2FyxLFsxLEgb2x1cnNhIGFua2V0aSB0YW1hbWxhecSxbi5cIixcbiAgICB0cmlnZ2VyTm90U2V0OiBcIlRldGlrbGV5aWNpIGF5YXJsYW5tYWTEsVwiLFxuICAgIHRyaWdnZXJSdW5JZjogXCLDh2FsxLHFn3TEsXIgZcSfZXJcIixcbiAgICB0cmlnZ2VyU2V0VG9OYW1lOiBcIkRlxJ9lcmluaSDFn3VyYWRhbiBkZcSfacWfdGlyOiBcIixcbiAgICB0cmlnZ2VyRnJvbU5hbWU6IFwiRGXEn2VyaW5pIMWfdXJhZGFuIGtvcHlhbGE6IFwiLFxuICAgIHRyaWdnZXJSdW5FeHByZXNzaW9uOiBcIk1hbnTEsWtzYWwgaWZhZGV5aSDDp2FsxLHFn3TEsXI6XCIsXG4gICAgdHJpZ2dlclNldFZhbHVlOiBcIsWfdXJheWE6IFwiLFxuICAgIHRyaWdnZXJHb3RvTmFtZTogXCJTb3J1eWEgZ2l0OlwiLFxuICAgIHRyaWdnZXJJc1ZhcmlhYmxlOiBcIkRlxJ9pxZ9rZW5pIGFua2V0IHNvbnVjdW5hIGtveW1hecSxbi5cIixcbiAgICB0cmlnZ2VyUnVuRXhwcmVzc2lvbkVtcHR5OiBcIkzDvHRmZW4gZ2XDp2VybGkgYmlyIGlmYWRlIGdpcmluXCIsXG4gIH0sXG4gIC8vUHJvcGVydHkgdmFsdWVzXG4gIHB2OiB7XG4gICAgdHJ1ZTogXCJ0cnVlXCIsXG4gICAgZmFsc2U6IFwiZmFsc2VcIixcbiAgICBpbmhlcml0OiBcImluaGVyaXRcIixcbiAgICBzaG93OiBcInNob3dcIixcbiAgICBoaWRlOiBcImhpZGVcIixcbiAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICBpbml0aWFsOiBcImluaXRpYWxcIixcbiAgICByYW5kb206IFwicmFuZG9tXCIsXG4gICAgY29sbGFwc2VkOiBcImNvbGxhcHNlZFwiLFxuICAgIGV4cGFuZGVkOiBcImV4cGFuZGVkXCIsXG4gICAgbm9uZTogXCJub25lXCIsXG4gICAgYXNjOiBcImFzY2VuZGluZ1wiLFxuICAgIGRlc2M6IFwiZGVzY2VuZGluZ1wiLFxuICAgIGluZGV0ZXJtaW5hdGU6IFwiaW5kZXRlcm1pbmF0ZVwiLFxuICAgIGRlY2ltYWw6IFwiZGVjaW1hbFwiLFxuICAgIGN1cnJlbmN5OiBcImN1cnJlbmN5XCIsXG4gICAgcGVyY2VudDogXCJwZXJjZW50XCIsXG4gICAgZmlyc3RFeHBhbmRlZDogXCJmaXJzdEV4cGFuZGVkXCIsXG4gICAgb2ZmOiBcIm9mZlwiLFxuICAgIG9uUGFuZWw6IFwib25QYW5lbFwiLFxuICAgIG9uU3VydmV5OiBcIm9uU3VydmV5XCIsXG4gICAgbGlzdDogXCJsaXN0XCIsXG4gICAgcHJvZ3Jlc3NUb3A6IFwicHJvZ3Jlc3NUb3BcIixcbiAgICBwcm9ncmVzc0JvdHRvbTogXCJwcm9ncmVzc0JvdHRvbVwiLFxuICAgIHByb2dyZXNzVG9wQm90dG9tOiBcInByb2dyZXNzVG9wQm90dG9tXCIsXG4gICAgaG9yaXpvbnRhbDogXCJob3Jpem9udGFsXCIsXG4gICAgdmVydGljYWw6IFwidmVydGljYWxcIixcbiAgICB0b3A6IFwidG9wXCIsXG4gICAgYm90dG9tOiBcImJvdHRvbVwiLFxuICAgIHRvcEJvdHRvbTogXCJ0b3AgYW5kIGJvdHRvbVwiLFxuICAgIGJvdGg6IFwiYm90aFwiLFxuICAgIGxlZnQ6IFwibGVmdFwiLFxuICAgIGNvbG9yOiBcImNvbG9yXCIsXG4gICAgZGF0ZTogXCJkYXRlXCIsXG4gICAgZGF0ZXRpbWU6IFwiZGF0ZXRpbWVcIixcbiAgICBcImRhdGV0aW1lLWxvY2FsXCI6IFwiZGF0ZXRpbWUtbG9jYWxcIixcbiAgICBlbWFpbDogXCJlbWFpbFwiLFxuICAgIG1vbnRoOiBcIm1vbnRoXCIsXG4gICAgbnVtYmVyOiBcIm51bWJlclwiLFxuICAgIHBhc3N3b3JkOiBcInBhc3N3b3JkXCIsXG4gICAgcmFuZ2U6IFwicmFuZ2VcIixcbiAgICB0ZWw6IFwidGVsXCIsXG4gICAgdGV4dDogXCJ0ZXh0XCIsXG4gICAgdGltZTogXCJ0aW1lXCIsXG4gICAgdXJsOiBcInVybFwiLFxuICAgIHdlZWs6IFwid2Vla1wiLFxuICAgIGhpZGRlbjogXCJoaWRkZW5cIixcbiAgICBvbjogXCJvblwiLFxuICAgIG9uUGFnZTogXCJvblBhZ2VcIixcbiAgICBlZGl0OiBcImVkaXRcIixcbiAgICBkaXNwbGF5OiBcImRpc3BsYXlcIixcbiAgICBvbkNvbXBsZXRlOiBcIm9uQ29tcGxldGVcIixcbiAgICBvbkhpZGRlbjogXCJvbkhpZGRlblwiLFxuICAgIGFsbDogXCJhbGxcIixcbiAgICBwYWdlOiBcInBhZ2VcIixcbiAgICBzdXJ2ZXk6IFwic3VydmV5XCIsXG4gICAgb25OZXh0UGFnZTogXCJvbk5leHRQYWdlXCIsXG4gICAgb25WYWx1ZUNoYW5nZWQ6IFwib25WYWx1ZUNoYW5nZWRcIixcbiAgfSxcbiAgLy9PcGVyYXRvcnNcbiAgb3A6IHtcbiAgICBlbXB0eTogXCJib8WfXCIsXG4gICAgbm90ZW1wdHk6IFwiYm/FnyBkZcSfaWxcIixcbiAgICBlcXVhbDogXCJlxZ9pdHRpclwiLFxuICAgIG5vdGVxdWFsOiBcImXFn2l0IGRlxJ9pbGRpclwiLFxuICAgIGNvbnRhaW5zOiBcImnDp2VyaXJcIixcbiAgICBub3Rjb250YWluczogXCJpw6dlcm1lelwiLFxuICAgIGFueW9mOiBcImhlcmhhbmdpIGJpcmlcIixcbiAgICBhbGxvZjogXCJ0w7xtw7xcIixcbiAgICBncmVhdGVyOiBcImLDvHnDvGt0w7xyXCIsXG4gICAgbGVzczogXCJrw7zDp8O8a3TDvHJcIixcbiAgICBncmVhdGVyb3JlcXVhbDogXCJiw7x5w7xrIGXFn2l0dGlyXCIsXG4gICAgbGVzc29yZXF1YWw6IFwia8O8w6fDvGsgZcWfaXR0aXJcIixcbiAgfSxcbiAgLy9FbWJlZCB3aW5kb3dcbiAgZXc6IHtcbiAgICBhbmd1bGFyOiBcIkFuZ3VsYXIgdmVyc2l5b251IGt1bGxhblwiLFxuICAgIGpxdWVyeTogXCJKcXVlcnkgdmVyc2l5b251IGt1bGxhblwiLFxuICAgIGtub2Nrb3V0OiBcIktub2Nrb3V0IHZlcnNpeW9udSBrdWxsYW5cIixcbiAgICByZWFjdDogXCJSZWFjdCB2ZXJzaXlvbnUga3VsbGFuXCIsXG4gICAgdnVlOiBcIlZ1ZSB2ZXJzaXlvbnUga3VsbGFuXCIsXG4gICAgYm9vdHN0cmFwOiBcIkJvb3RzdHJhcFwiLFxuICAgIHN0YW5kYXJkOiBcIkJvb3RzdHJhcHPEsXpcIixcbiAgICBzaG93T25QYWdlOiBcIkJpciBzYXlmYWRhIGFua2V0IGfDtnN0ZXJcIixcbiAgICBzaG93SW5XaW5kb3c6IFwiQW5rZXRpIGJpciBwZW5jZXJlZGUgZ8O2c3RlclwiLFxuICAgIGxvYWRGcm9tU2VydmVyOiBcIkFua2V0IEpTT04ndSBzdW51Y3VkYW4gecO8a2xlXCIsXG4gICAgdGl0bGVTY3JpcHQ6IFwiU2NyaXB0bGVyIHZlIHN0aWxsZXJcIixcbiAgICB0aXRsZUh0bWw6IFwiSFRNTFwiLFxuICAgIHRpdGxlSmF2YVNjcmlwdDogXCJKYXZhU2NyaXB0XCIsXG4gIH0sXG4gIC8vVGVzdCBTdXJ2ZXlcbiAgdHM6IHtcbiAgICBzZWxlY3RQYWdlOiBcIlRlc3QgZWRpbGVjZWsgc2F5ZmF5xLEgc2XDp2luOlwiLFxuICAgIHNob3dJbnZpc2libGVFbGVtZW50czogXCJHw7Zyw7xubWV6IMO2xJ9lbGVyaSBnw7ZzdGVyXCIsXG4gIH0sXG4gIHZhbGlkYXRvcnM6IHtcbiAgICBhbnN3ZXJjb3VudHZhbGlkYXRvcjogXCJjZXZhcCBzYXnEsXPEsVwiLFxuICAgIGVtYWlsdmFsaWRhdG9yOiBcImUtbWFpbFwiLFxuICAgIGV4cHJlc3Npb252YWxpZGF0b3I6IFwiZXhwcmVzc2lvblwiLFxuICAgIG51bWVyaWN2YWxpZGF0b3I6IFwibnVtZXJpY1wiLFxuICAgIHJlZ2V4dmFsaWRhdG9yOiBcInJlZ2V4XCIsXG4gICAgdGV4dHZhbGlkYXRvcjogXCJ0ZXh0XCIsXG4gIH0sXG4gIHRyaWdnZXJzOiB7XG4gICAgY29tcGxldGV0cmlnZ2VyOiBcImFua2V0aSB0YW1hbWxhXCIsXG4gICAgc2V0dmFsdWV0cmlnZ2VyOiBcImRlxJ9lcmkgYXlhcmxhXCIsXG4gICAgY29weXZhbHVldHJpZ2dlcjogXCJkZcSfZXJpIGtvcHlhbGFcIixcbiAgICBza2lwdHJpZ2dlcjogXCJzb3J1eXUgYXRsYVwiLFxuICAgIHJ1bmV4cHJlc3Npb250cmlnZ2VyOiBcIm1hbnTEsWtzYWwgaWZhZGV5aSDDp2FsxLHFn3TEsXJcIixcbiAgICB2aXNpYmxldHJpZ2dlcjogXCJnw7Zyw7xuw7xybMO8xJ/DvCBkZcSfacWfdGlyIChrdWxsYW7EsW1kYW4ga2FsZMSxcsSxbGTEsSlcIixcbiAgfSxcbiAgLy9Qcm9wZXJ0aWVzXG4gIHA6IHtcbiAgICBuYW1lOiBcImFkxLFcIixcbiAgICB0aXRsZToge1xuICAgICAgbmFtZTogXCJiYcWfbMSxa1wiLFxuICAgICAgdGl0bGU6IFwiJ0FkJyBpbGUgYXluxLF5c2EgYm/FnyBixLFyYWvEsW5cIixcbiAgICB9LFxuXG4gICAgbmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5OiBcIm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eVwiLFxuICAgIHF1ZXN0aW9uc09yZGVyOiBcInF1ZXN0aW9uc09yZGVyXCIsXG4gICAgbWF4VGltZVRvRmluaXNoOiBcIm1heFRpbWVUb0ZpbmlzaFwiLFxuXG4gICAgdmlzaWJsZTogXCJ2aXNpYmxlXCIsXG4gICAgdmlzaWJsZUlmOiBcInZpc2libGVJZlwiLFxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjogXCJkZXNjcmlwdGlvblwiLFxuICAgIHN0YXRlOiBcInN0YXRlXCIsXG4gICAgaXNSZXF1aXJlZDogXCJpc1JlcXVpcmVkXCIsXG4gICAgcmVxdWlyZWRJZjogXCJyZXF1aXJlZElmXCIsXG4gICAgaW5kZW50OiBcImluZGVudFwiLFxuICAgIHJlcXVpcmVkRXJyb3JUZXh0OiBcInJlcXVpcmVkRXJyb3JUZXh0XCIsXG4gICAgc3RhcnRXaXRoTmV3TGluZTogXCJzdGFydFdpdGhOZXdMaW5lXCIsXG4gICAgaW5uZXJJbmRlbnQ6IFwiaW5uZXJJbmRlbnRcIixcbiAgICBwYWdlOiBcInBhZ2VcIixcblxuICAgIHdpZHRoOiBcIndpZHRoXCIsXG5cbiAgICBjb21tZW50VGV4dDogXCJjb21tZW50VGV4dFwiLFxuICAgIHZhbHVlTmFtZTogXCJ2YWx1ZU5hbWVcIixcbiAgICBlbmFibGVJZjogXCJlbmFibGVJZlwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCJkZWZhdWx0VmFsdWVcIixcbiAgICBjb3JyZWN0QW5zd2VyOiBcImNvcnJlY3RBbnN3ZXJcIixcbiAgICByZWFkT25seTogXCJyZWFkT25seVwiLFxuICAgIHZhbGlkYXRvcnM6IFwidmFsaWRhdG9yc1wiLFxuICAgIHRpdGxlTG9jYXRpb246IFwidGl0bGVMb2NhdGlvblwiLFxuXG4gICAgaGFzQ29tbWVudDogXCJoYXNDb21tZW50XCIsXG4gICAgaGFzT3RoZXI6IFwiaGFzT3RoZXJcIixcbiAgICBjaG9pY2VzOiBcImNob2ljZXNcIixcbiAgICBjaG9pY2VzT3JkZXI6IFwiY2hvaWNlc09yZGVyXCIsXG4gICAgY2hvaWNlc0J5VXJsOiBcImNob2ljZXNCeVVybFwiLFxuICAgIG90aGVyVGV4dDogXCJvdGhlclRleHRcIixcbiAgICBvdGhlckVycm9yVGV4dDogXCJvdGhlckVycm9yVGV4dFwiLFxuICAgIHN0b3JlT3RoZXJzQXNDb21tZW50OiBcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsXG5cbiAgICBsYWJlbDogXCJsYWJlbFwiLFxuICAgIHNob3dUaXRsZTogXCJzaG93VGl0bGVcIixcbiAgICB2YWx1ZVRydWU6IFwidmFsdWVUcnVlXCIsXG4gICAgdmFsdWVGYWxzZTogXCJ2YWx1ZUZhbHNlXCIsXG5cbiAgICBjb2xzOiBcImNvbHNcIixcbiAgICByb3dzOiBcInJvd3NcIixcbiAgICBwbGFjZUhvbGRlcjogXCJwbGFjZUhvbGRlclwiLFxuXG4gICAgb3B0aW9uc0NhcHRpb246IFwib3B0aW9uc0NhcHRpb25cIixcblxuICAgIGV4cHJlc3Npb246IFwiZXhwcmVzc2lvblwiLFxuICAgIGZvcm1hdDogXCJmb3JtYXRcIixcbiAgICBkaXNwbGF5U3R5bGU6IFwiZGlzcGxheVN0eWxlXCIsXG4gICAgY3VycmVuY3k6IFwiY3VycmVuY3lcIixcbiAgICB1c2VHcm91cGluZzogXCJ1c2VHcm91cGluZ1wiLFxuXG4gICAgc2hvd1ByZXZpZXc6IFwic2hvd1ByZXZpZXdcIixcbiAgICBhbGxvd011bHRpcGxlOiBcImFsbG93TXVsdGlwbGVcIixcbiAgICBpbWFnZUhlaWdodDogXCJpbWFnZUhlaWdodFwiLFxuICAgIGltYWdlV2lkdGg6IFwiaW1hZ2VXaWR0aFwiLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogXCJzdG9yZURhdGFBc1RleHRcIixcbiAgICBtYXhTaXplOiBcIm1heFNpemVcIixcblxuICAgIGh0bWw6IFwiaHRtbFwiLFxuXG4gICAgY29sdW1uczogXCJjb2x1bW5zXCIsXG4gICAgY2VsbHM6IFwiY2VsbHNcIixcbiAgICBpc0FsbFJvd1JlcXVpcmVkOiBcImlzQWxsUm93UmVxdWlyZWRcIixcblxuICAgIGhvcml6b250YWxTY3JvbGw6IFwiaG9yaXpvbnRhbFNjcm9sbFwiLFxuICAgIGNlbGxUeXBlOiBcImNlbGxUeXBlXCIsXG4gICAgY29sdW1uc0xheW91dDogXCJjb2x1bW5zTGF5b3V0XCIsXG4gICAgY29sdW1uQ29sQ291bnQ6IFwiY29sdW1uQ29sQ291bnRcIixcbiAgICBjb2x1bW5NaW5XaWR0aDogXCJjb2x1bW5NaW5XaWR0aFwiLFxuXG4gICAgcm93Q291bnQ6IFwicm93Q291bnRcIixcbiAgICBtaW5Sb3dDb3VudDogXCJtaW5Sb3dDb3VudFwiLFxuICAgIG1heFJvd0NvdW50OiBcIm1heFJvd0NvdW50XCIsXG4gICAga2V5TmFtZTogXCJrZXlOYW1lXCIsXG4gICAga2V5RHVwbGljYXRpb25FcnJvcjogXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgY29uZmlybURlbGV0ZTogXCJjb25maXJtRGVsZXRlXCIsXG4gICAgY29uZmlybURlbGV0ZVRleHQ6IFwiY29uZmlybURlbGV0ZVRleHRcIixcbiAgICBhZGRSb3dMb2NhdGlvbjogXCJhZGRSb3dMb2NhdGlvblwiLFxuICAgIGFkZFJvd1RleHQ6IFwiYWRkUm93VGV4dFwiLFxuICAgIHJlbW92ZVJvd1RleHQ6IFwicmVtb3ZlUm93VGV4dFwiLFxuXG4gICAgaXRlbXM6IFwiaXRlbXNcIixcbiAgICBpdGVtU2l6ZTogXCJpdGVtU2l6ZVwiLFxuICAgIGNvbENvdW50OiBcImNvbENvdW50XCIsXG5cbiAgICB0ZW1wbGF0ZVRpdGxlOiBcInRlbXBsYXRlVGl0bGVcIixcbiAgICB0ZW1wbGF0ZURlc2NyaXB0aW9uOiBcInRlbXBsYXRlRGVzY3JpcHRpb25cIixcbiAgICBhbGxvd0FkZFBhbmVsOiBcImFsbG93QWRkUGFuZWxcIixcbiAgICBhbGxvd1JlbW92ZVBhbmVsOiBcImFsbG93UmVtb3ZlUGFuZWxcIixcbiAgICBwYW5lbENvdW50OiBcInBhbmVsQ291bnRcIixcbiAgICBtaW5QYW5lbENvdW50OiBcIm1pblBhbmVsQ291bnRcIixcbiAgICBtYXhQYW5lbENvdW50OiBcIm1heFBhbmVsQ291bnRcIixcbiAgICBwYW5lbHNTdGF0ZTogXCJwYW5lbHNTdGF0ZVwiLFxuICAgIHBhbmVsQWRkVGV4dDogXCJwYW5lbEFkZFRleHRcIixcbiAgICBwYW5lbFJlbW92ZVRleHQ6IFwicGFuZWxSZW1vdmVUZXh0XCIsXG4gICAgcGFuZWxQcmV2VGV4dDogXCJwYW5lbFByZXZUZXh0XCIsXG4gICAgcGFuZWxOZXh0VGV4dDogXCJwYW5lbE5leHRUZXh0XCIsXG4gICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsXG4gICAgc2hvd1JhbmdlSW5Qcm9ncmVzczogXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsXG4gICAgcmVuZGVyTW9kZTogXCJyZW5kZXJNb2RlXCIsXG4gICAgdGVtcGxhdGVUaXRsZUxvY2F0aW9uOiBcInRlbXBsYXRlVGl0bGVMb2NhdGlvblwiLFxuXG4gICAgcmF0ZVZhbHVlczogXCJyYXRlVmFsdWVzXCIsXG4gICAgcmF0ZU1pbjogXCJyYXRlTWluXCIsXG4gICAgcmF0ZU1heDogXCJyYXRlTWF4XCIsXG4gICAgcmF0ZVN0ZXA6IFwicmF0ZVN0ZXBcIixcbiAgICBtaW5SYXRlRGVzY3JpcHRpb246IFwibWluUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgbWF4UmF0ZURlc2NyaXB0aW9uOiBcIm1heFJhdGVEZXNjcmlwdGlvblwiLFxuXG4gICAgaW5wdXRUeXBlOiBcImlucHV0VHlwZVwiLFxuICAgIHNpemU6IFwic2l6ZVwiLFxuXG4gICAgbG9jYWxlOiBcImxvY2FsZVwiLFxuICAgIGZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzogXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWNcIixcbiAgICBjb21wbGV0ZWRIdG1sOiBcImNvbXBsZXRlZEh0bWxcIixcbiAgICBjb21wbGV0ZWRCZWZvcmVIdG1sOiBcImNvbXBsZXRlZEJlZm9yZUh0bWxcIixcbiAgICBsb2FkaW5nSHRtbDogXCJsb2FkaW5nSHRtbFwiLFxuICAgIHRyaWdnZXJzOiBcInRyaWdnZXJzXCIsXG4gICAgY29va2llTmFtZTogXCJjb29raWVOYW1lXCIsXG4gICAgc2VuZFJlc3VsdE9uUGFnZU5leHQ6IFwic2VuZFJlc3VsdE9uUGFnZU5leHRcIixcbiAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IFwic2hvd05hdmlnYXRpb25CdXR0b25zXCIsXG4gICAgc2hvd1ByZXZCdXR0b246IFwic2hvd1ByZXZCdXR0b25cIixcbiAgICBzaG93UGFnZVRpdGxlczogXCJzaG93UGFnZVRpdGxlc1wiLFxuICAgIHNob3dDb21wbGV0ZWRQYWdlOiBcInNob3dDb21wbGV0ZWRQYWdlXCIsXG4gICAgc2hvd1BhZ2VOdW1iZXJzOiBcInNob3dQYWdlTnVtYmVyc1wiLFxuICAgIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbjogXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIixcbiAgICBzaG93UHJvZ3Jlc3NCYXI6IFwic2hvd1Byb2dyZXNzQmFyXCIsXG4gICAgbW9kZTogXCJtb2RlXCIsXG4gICAgZ29OZXh0UGFnZUF1dG9tYXRpYzogXCJnb05leHRQYWdlQXV0b21hdGljXCIsXG4gICAgY2hlY2tFcnJvcnNNb2RlOiBcImNoZWNrRXJyb3JzTW9kZVwiLFxuICAgIGNsZWFySW52aXNpYmxlVmFsdWVzOiBcImNsZWFySW52aXNpYmxlVmFsdWVzXCIsXG4gICAgc3RhcnRTdXJ2ZXlUZXh0OiBcInN0YXJ0U3VydmV5VGV4dFwiLFxuICAgIHBhZ2VQcmV2VGV4dDogXCJwYWdlUHJldlRleHRcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwicGFnZU5leHRUZXh0XCIsXG4gICAgY29tcGxldGVUZXh0OiBcImNvbXBsZXRlVGV4dFwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJyZXF1aXJlZFRleHRcIixcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IFwicXVlc3Rpb25TdGFydEluZGV4XCIsXG4gICAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOiBcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLFxuICAgIGZpcnN0UGFnZUlzU3RhcnRlZDogXCJmaXJzdFBhZ2VJc1N0YXJ0ZWRcIixcbiAgICBpc1NpbmdsZVBhZ2U6IFwiaXNTaW5nbGVQYWdlXCIsXG4gICAgbWF4VGltZVRvRmluaXNoUGFnZTogXCJtYXhUaW1lVG9GaW5pc2hQYWdlXCIsXG4gICAgc2hvd1RpbWVyUGFuZWw6IFwic2hvd1RpbWVyUGFuZWxcIixcbiAgICBzaG93VGltZXJQYW5lbE1vZGU6IFwic2hvd1RpbWVyUGFuZWxNb2RlXCIsXG5cbiAgICBkZWZhdWx0UGFuZWxWYWx1ZTogXCJkZWZhdWx0UGFuZWxWYWx1ZVwiLFxuICAgIGRlZmF1bHRSb3dWYWx1ZTogXCJkZWZhdWx0Um93VmFsdWVcIixcbiAgICBoYXNOb25lOiBcImhhc05vbmVcIixcbiAgICBub25lVGV4dDogXCJub25lVGV4dFwiLFxuXG4gICAgdGV4dDogXCJ0ZXh0XCIsXG4gIH0sXG59O1xuXG5lZGl0b3JMb2NhbGl6YXRpb24ubG9jYWxlc1tcInRyXCJdID0gdHVya2lzaFN0cmluZ3M7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5cbmltcG9ydCB7XG4gIFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSxcbiAgSVN1cnZleU9iamVjdEVkaXRvck9wdGlvbnMsXG59IGZyb20gXCIuL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUVkaXRvckJhc2VcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeSB9IGZyb20gXCIuL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUVkaXRvckZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleU9iamVjdFByb3BlcnR5IHtcbiAgcHJpdmF0ZSBvYmplY3RWYWx1ZTogYW55O1xuICBwdWJsaWMgb25Db3JyZWN0VmFsdWVCZWZvcmVTZXQ6IChcbiAgICBwcm9wRWRpdG9yOiBTdXJ2ZXlPYmplY3RQcm9wZXJ0eSxcbiAgICBuZXdWYWx1ZTogYW55XG4gICkgPT4gYm9vbGVhbjtcbiAgcHVibGljIG9uQ2hhbmdlZDogKHByb3BFZGl0b3I6IFN1cnZleU9iamVjdFByb3BlcnR5LCBvbGRWYWx1ZTogYW55KSA9PiB2b2lkO1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHB1YmxpYyBlZGl0b3I6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZTtcbiAgcHVibGljIGVkaXRvclR5cGU6IHN0cmluZztcbiAgcHVibGljIGVkaXRvclR5cGVUZW1wbGF0ZTogc3RyaW5nO1xuICBwdWJsaWMgYmFzZUVkaXRvclR5cGU6IHN0cmluZztcbiAgcHVibGljIGdldE9iamVjdFByb3BlcnR5QnlOYW1lOiAobmFtZTogc3RyaW5nKSA9PiBTdXJ2ZXlPYmplY3RQcm9wZXJ0eSA9IG51bGw7XG4gIHByaXZhdGUgaXNIaWRkZW5WYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBrb1Zpc2libGU6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgcHJpdmF0ZSBwcm9wZXJ0eUVkaXRvck9wdGlvbnM6IElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zID0gbnVsbCxcbiAgICBpc0NlbGxFZGl0b3I6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLnByb3BlcnR5Lm5hbWU7XG4gICAgdGhpcy5kaXNhYmxlZCA9IHByb3BlcnR5LnJlYWRPbmx5O1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgb25JdGVtQ2hhbmdlZCA9IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgc2VsZi5vbkVkaXRvclZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvciA9IFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5jcmVhdGVFZGl0b3IoXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIGlzQ2VsbEVkaXRvclxuICAgICk7XG4gICAgdGhpcy5lZGl0b3Iub25DaGFuZ2VkID0gb25JdGVtQ2hhbmdlZDtcbiAgICB0aGlzLmVkaXRvci5vbkdldExvY2FsZSA9IHRoaXMuZG9PbkdldExvY2FsZTtcbiAgICB0aGlzLmVkaXRvci5vcHRpb25zID0gcHJvcGVydHlFZGl0b3JPcHRpb25zO1xuICAgIHRoaXMuZWRpdG9yVHlwZSA9IHRoaXMuZWRpdG9yLmVkaXRvclR5cGU7XG4gICAgdGhpcy5lZGl0b3JUeXBlVGVtcGxhdGUgPSB0aGlzLmVkaXRvci5lZGl0b3JUeXBlVGVtcGxhdGU7XG4gICAgdGhpcy5rb1Zpc2libGUgPSBrby5vYnNlcnZhYmxlKHRoaXMuaXNWaXNpYmxlKCkpO1xuICB9XG4gIHB1YmxpYyBnZXQgZGlzcGxheU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuZGlzcGxheU5hbWU7XG4gIH1cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci50aXRsZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGtvVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3Iua29WYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGtvVGV4dCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5rb1RleHQ7XG4gIH1cbiAgcHVibGljIGdldCBrb0lzRGVmYXVsdCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5rb0lzRGVmYXVsdDtcbiAgfVxuICBwcml2YXRlIGRvT25HZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vYmplY3QgJiYgdGhpcy5vYmplY3RbXCJnZXRMb2NhbGVcIl0pIHJldHVybiB0aGlzLm9iamVjdC5nZXRMb2NhbGUoKTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IG9iamVjdCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm9iamVjdFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgb2JqZWN0KHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLm9iamVjdFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5lZGl0b3Iub2JqZWN0ID0gdmFsdWU7XG4gICAgdGhpcy5lZGl0b3Iuc2V0dXAoKTtcbiAgICB0aGlzLnVwZGF0ZURlcGVuZGVkUHJvcGVydGllcygpO1xuICAgIHRoaXMudXBkYXRlRHluYW1pY1Byb3BlcnRpZXMoKTtcbiAgfVxuICBwdWJsaWMgYmVmb3JlU2hvdygpIHtcbiAgICB0aGlzLmVkaXRvci5iZWZvcmVTaG93KCk7XG4gICAgdGhpcy51cGRhdGVEeW5hbWljUHJvcGVydGllcygpO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuaGFzRXJyb3IoKTtcbiAgfVxuICBwdWJsaWMgYXBwbHlUb09iaihvYmo6IFN1cnZleS5CYXNlKSB7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLm9iamVjdCAmJlxuICAgICAgU3VydmV5LkhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhcbiAgICAgICAgb2JqW3RoaXMucHJvcGVydHkubmFtZV0sXG4gICAgICAgIHRoaXMub2JqZWN0W3RoaXMucHJvcGVydHkubmFtZV1cbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgb2JqW3RoaXMucHJvcGVydHkubmFtZV0gPSB0aGlzLm9iamVjdFt0aGlzLnByb3BlcnR5Lm5hbWVdO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNJblByb3BlcnR5R3JpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuaXNJblByb3BlcnR5R3JpZDtcbiAgfVxuICBwdWJsaWMgc2V0IGlzSW5Qcm9wZXJ0eUdyaWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5lZGl0b3IuaXNJblByb3BlcnR5R3JpZCA9IHZhbDtcbiAgfVxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgaWYgKCF0aGlzLm9iamVjdCkgcmV0dXJuO1xuICAgIHRoaXMuZWRpdG9yLmtvVmFsdWUodGhpcy5wcm9wZXJ0eS5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMub2JqZWN0KSk7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUR5bmFtaWNQcm9wZXJ0aWVzKCkge1xuICAgIHRoaXMua29WaXNpYmxlKHRoaXMuaXNWaXNpYmxlKCkpO1xuICAgIHRoaXMuZWRpdG9yLnVwZGF0ZUR5bmFtaWNQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5lZGl0b3IudXBkYXRlVmFsdWUoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSGlkZGVuVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBpc0hpZGRlbih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzSGlkZGVuVmFsdWUgPSB2YWw7XG4gICAgdGhpcy5rb1Zpc2libGUodGhpcy5pc1Zpc2libGUoKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMub2JqZWN0KSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5pc0hpZGRlbikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBsYXlvdXQgPSAhIXRoaXMub2JqZWN0LmdldExheW91dFR5cGUgPyB0aGlzLm9iamVjdC5nZXRMYXlvdXRUeXBlKCkgOiBcIlwiO1xuICAgIGlmIChcbiAgICAgICEhdGhpcy5wcm9wZXJ0eS5pc1Zpc2libGUgJiZcbiAgICAgICEoPGFueT50aGlzLnByb3BlcnR5W1wiaXNWaXNpYmxlXCJdKShsYXlvdXQsIHRoaXMub2JqZWN0KVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25FZGl0b3JWYWx1ZUNoYW5nZWQobmV3VmFsdWUpIHtcbiAgICB0aGlzLnByb3BlcnR5RWRpdG9yT3B0aW9ucyAmJlxuICAgICAgdGhpcy5wcm9wZXJ0eUVkaXRvck9wdGlvbnMuc3RhcnRVbmRvUmVkb1RyYW5zYWN0aW9uKCk7XG4gICAgaWYgKHRoaXMub2JqZWN0KSB7XG4gICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLm9iamVjdFt0aGlzLnByb3BlcnR5Lm5hbWVdO1xuICAgICAgaWYgKCEhdGhpcy5vbkNvcnJlY3RWYWx1ZUJlZm9yZVNldCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHRoaXMub25Db3JyZWN0VmFsdWVCZWZvcmVTZXQodGhpcywgbmV3VmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5lZGl0b3IudXBkYXRlUHJvcGVydHlWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICBpZiAodGhpcy5vbkNoYW5nZWQpIHRoaXMub25DaGFuZ2VkKHRoaXMsIG9sZFZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVEZXBlbmRlZFByb3BlcnRpZXMoKTtcbiAgICB0aGlzLnByb3BlcnR5RWRpdG9yT3B0aW9ucyAmJlxuICAgICAgdGhpcy5wcm9wZXJ0eUVkaXRvck9wdGlvbnMuc3RvcFVuZG9SZWRvVHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGVwZW5kZWRQcm9wZXJ0aWVzKCkge1xuICAgIGlmICghdGhpcy5vYmplY3QgfHwgIXRoaXMuZ2V0T2JqZWN0UHJvcGVydHlCeU5hbWUpIHJldHVybjtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BlcnR5LmdldERlcGVuZGVkUHJvcGVydGllcygpO1xuICAgIGlmICghcHJvcHMpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHRoaXMuZ2V0T2JqZWN0UHJvcGVydHlCeU5hbWUocHJvcHNbaV0pO1xuICAgICAgaWYgKCEhcHJvcCkge1xuICAgICAgICBwcm9wLnVwZGF0ZUR5bmFtaWNQcm9wZXJ0aWVzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcblxuaW1wb3J0IHsgU3VydmV5SGVscGVyLCBPYmpUeXBlIH0gZnJvbSBcIi4vc3VydmV5SGVscGVyXCI7XG5pbXBvcnQgeyBTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4vZWRpdG9yXCI7XG5pbXBvcnQgeyBnZXRMb2NTdHJpbmcgfSBmcm9tIFwiLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcblxuZXhwb3J0IGNsYXNzIFBhZ2VzRWRpdG9yIHtcbiAgcHJpdmF0ZSBwcmV2UGFnZXNGb3JTZWxlY3RvcjogYW55W10gPSBbXTtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRQYWdlID0ga28ub2JzZXJ2YWJsZTxTdXJ2ZXkuUGFnZU1vZGVsPigpO1xuICBwcml2YXRlIHNlbGVjdGlvblN1YnNjcmlwdGlvbjoga28uU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF9yZWFkT25seSA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICBwcml2YXRlIGtvU3VydmV5OiBrby5PYnNlcnZhYmxlPFN1cnZleS5TdXJ2ZXk+O1xuICBwcml2YXRlIGlzU2VsZWN0aW5nUGFnZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjcmVhdG9yOiBTdXJ2ZXlDcmVhdG9yKSB7XG4gICAgdGhpcy5oYXNEcm9wZG93blNlbGVjdG9yKGNyZWF0b3Iuc2hvd0Ryb3Bkb3duUGFnZVNlbGVjdG9yKTtcbiAgICB0aGlzLmtvU3VydmV5ID0ga28ub2JzZXJ2YWJsZTxTdXJ2ZXkuU3VydmV5PihjcmVhdG9yLnN1cnZleSk7XG4gICAgY3JlYXRvci5vbkRlc2lnbmVyU3VydmV5Q3JlYXRlZC5hZGQoKHNlbmRlciwgb3B0aW9ucykgPT4ge1xuICAgICAgdGhpcy5rb1N1cnZleShvcHRpb25zLnN1cnZleSk7XG4gICAgfSk7XG4gICAgdGhpcy5wYWdlc0ZvclNlbGVjdGlvbiA9IGtvLmNvbXB1dGVkPGFueT4oKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmJsb2NrUGFnZXNSZWJ1aWx0KCkpIHtcbiAgICAgICAgdGhpcy5wcmV2UGFnZXNGb3JTZWxlY3RvciA9IHRoaXMucGFnZXMubWFwKChwKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHAsIHRleHQ6IHRoaXMuZ2V0RGlzcGxheVRleHQocCkgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5yZWFkT25seSkge1xuICAgICAgICAgIHRoaXMucHJldlBhZ2VzRm9yU2VsZWN0b3IgPSB0aGlzLnByZXZQYWdlc0ZvclNlbGVjdG9yLmNvbmNhdChbXG4gICAgICAgICAgICA8YW55PnsgdmFsdWU6IG51bGwsIHRleHQ6IGdldExvY1N0cmluZyhcImVkLmFkZE5ld1BhZ2VcIikgfSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0ZWRQYWdlLm5vdGlmeVN1YnNjcmliZXJzKCksIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucHJldlBhZ2VzRm9yU2VsZWN0b3I7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMucGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRQYWdlKHRoaXMucGFnZXNbMF0pO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuY3JlYXRvci5rb1NlbGVjdGVkT2JqZWN0LnN1YnNjcmliZShcbiAgICAgIChuZXdWYWwpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhIWNyZWF0b3Iuc3VydmV5LmN1cnJlbnRQYWdlICYmXG4gICAgICAgICAgICBjcmVhdG9yLnN1cnZleS5jdXJyZW50UGFnZSAhPSB0aGlzLl9zZWxlY3RlZFBhZ2UoKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRQYWdlKGNyZWF0b3Iuc3VydmV5LmN1cnJlbnRQYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUGFnZShuZXdWYWwudmFsdWUpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRQYWdlU2VsZWN0b3JJbnRvVG9vbGJhcigpO1xuICB9XG4gIHB1YmxpYyBnZXQgcGFnZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMua29TdXJ2ZXkoKS5wYWdlcztcbiAgfVxuICBnZXREaXNwbGF5VGV4dCA9IChwYWdlOiBTdXJ2ZXkuUGFnZU1vZGVsKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRvci5nZXRPYmplY3REaXNwbGF5TmFtZShwYWdlLCBcInBhZ2UtdGFic1wiKTtcbiAgfTtcblxuICBwdWJsaWMgYmxvY2tQYWdlc1JlYnVpbHQgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcblxuICBwdWJsaWMgcGFnZXNGb3JTZWxlY3Rpb246IGtvLkNvbXB1dGVkPGFueVtdPjtcblxuICBhZGRQYWdlU2VsZWN0b3JJbnRvVG9vbGJhcigpIHtcbiAgICBjb25zdCBpdGVtID0ge1xuICAgICAgaWQ6IFwic3ZkLXRvb2xiYXItcGFnZS1zZWxlY3RvclwiLFxuICAgICAgY29tcG9uZW50OiBcInN2ZC1kcm9wZG93blwiLFxuICAgICAgdmlzaWJsZTogdGhpcy5jcmVhdG9yLnNob3dQYWdlU2VsZWN0b3JJblRvb2xiYXIsXG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgdGl0bGU6IFwiXCIsXG4gICAgICBpdGVtczogdGhpcy5wYWdlc0ZvclNlbGVjdGlvbixcbiAgICAgIGFjdGlvbjogdGhpcy5zZWxlY3RlZFBhZ2UsXG4gICAgfTtcbiAgICB0aGlzLmNyZWF0b3IudG9vbGJhckl0ZW1zLnVuc2hpZnQoPGFueT5pdGVtKTtcbiAgfVxuXG4gIGlzQWxsb3dlZEZvclNlbGVjdGVkUGFnZSh3aGF0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aGlzLmNyZWF0b3Iuc3VydmV5LnVwZGF0ZUVsZW1lbnRBbGxvd2luZ09wdGlvbnModGhpcy5fc2VsZWN0ZWRQYWdlKCkpO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX3NlbGVjdGVkUGFnZSgpW1wiYWxsb3dpbmdPcHRpb25zXCJdO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc1t3aGF0XTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBnZXQgY2FuQWRkUGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0FsbG93ZWRGb3JTZWxlY3RlZFBhZ2UoXCJhbGxvd0FkZFwiKTtcbiAgfVxuXG4gIGFkZFBhZ2UgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRvci5hZGRQYWdlKCk7XG4gIH07XG5cbiAgZ2V0IGNhbkNvcHlQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWxsb3dlZEZvclNlbGVjdGVkUGFnZShcImFsbG93Q29weVwiKTtcbiAgfVxuXG4gIGNvcHlQYWdlID0gKHBhZ2U6IFN1cnZleS5QYWdlTW9kZWwpID0+IHtcbiAgICB0aGlzLmNyZWF0b3IuY29weVBhZ2UocGFnZSk7XG4gIH07XG5cbiAgZ2V0IGNhbkRlbGV0ZVBhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzTGFzdFBhZ2UoKSAmJiB0aGlzLmlzQWxsb3dlZEZvclNlbGVjdGVkUGFnZShcImFsbG93RGVsZXRlXCIpO1xuICB9XG5cbiAgZGVsZXRlUGFnZSA9ICgpID0+IHtcbiAgICB0aGlzLmNyZWF0b3IuZGVsZXRlUGFnZSgpO1xuICB9O1xuXG4gIC8vIGdldCBjYW5Nb3ZlUGFnZSgpOiBib29sZWFuIHtcbiAgLy8gICByZXR1cm4gdGhpcy5pc0FsbG93ZWRGb3JTZWxlY3RlZFBhZ2UoXCJhbGxvd0RyYWdnaW5nXCIpO1xuICAvLyB9XG4gIG1vdmVQYWdlID0gKHBhZ2U6IFN1cnZleS5QYWdlTW9kZWwsIGluZGV4RnJvbTogbnVtYmVyKSA9PiB7XG4gICAgdGhpcy5zZWxlY3RlZFBhZ2UocGFnZSk7XG4gICAgdGhpcy5jcmVhdG9yLm1vdmVQYWdlKHBhZ2UsIGluZGV4RnJvbSk7XG4gIH07XG5cbiAgZ2V0IGNhbkVkaXRQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQWxsb3dlZEZvclNlbGVjdGVkUGFnZShcImFsbG93RWRpdFwiKTtcbiAgfVxuICBzaG93UGFnZVNldHRpbmdzKHBhZ2U6IFN1cnZleS5QYWdlTW9kZWwpIHtcbiAgICB0aGlzLmNyZWF0b3Iuc2hvd1F1ZXN0aW9uRWRpdG9yKHBhZ2UpO1xuICB9XG5cbiAgc2VsZWN0ZWRQYWdlID0ga28uY29tcHV0ZWQoe1xuICAgIHJlYWQ6ICgpID0+IHRoaXMuX3NlbGVjdGVkUGFnZSgpLFxuICAgIHdyaXRlOiAobmV3UGFnZTogU3VydmV5LlBhZ2VNb2RlbCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RpbmdQYWdlIHx8ICFTdXJ2ZXlIZWxwZXIuY2FuU2VsZWN0T2JqKG5ld1BhZ2UpKSByZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmlzU2VsZWN0aW5nUGFnZSA9IHRydWU7XG4gICAgICAgIGlmIChuZXdQYWdlID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3UGFnZSA9IHRoaXMuYWRkUGFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUGFnZShuZXdQYWdlKTtcbiAgICAgICAgdGhpcy5jcmVhdG9yLnN1cnZleS5jdXJyZW50UGFnZSA9IG5ld1BhZ2U7XG4gICAgICAgIHRoaXMuY3JlYXRvci5zZWxlY3RlZEVsZW1lbnQgPSBuZXdQYWdlO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGluZ1BhZ2UgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICBzaG93QWN0aW9ucyA9IChwYWdlKSA9PiB7XG4gICAgcmV0dXJuIHBhZ2UgPT09IHRoaXMuc2VsZWN0ZWRQYWdlKCkgJiYgdGhpcy5pc0FjdGl2ZSgpO1xuICB9O1xuICBpc0xhc3RQYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzLmxlbmd0aCA9PT0gMTtcbiAgfVxuICBpc0FjdGl2ZSgpIHtcbiAgICB2YXIgc2VsZWN0ZWRPYmplY3QgPSB0aGlzLmNyZWF0b3Iua29TZWxlY3RlZE9iamVjdCgpO1xuICAgIGlmICghc2VsZWN0ZWRPYmplY3QpIHJldHVybjtcbiAgICByZXR1cm4gU3VydmV5SGVscGVyLmdldE9iamVjdFR5cGUoc2VsZWN0ZWRPYmplY3QudmFsdWUpID09PSBPYmpUeXBlLlBhZ2U7XG4gIH1cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBwcm9wZXJ0eSwgZmFsc2UgYnkgZGVmYXVsdC4gU2V0IGl0IHRvIHRydWUgdG8gZGVueSBwYWdlcyBlZGl0aW5nLlxuICAgKi9cbiAgcHVibGljIGdldCByZWFkT25seSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jcmVhdG9yLnJlYWRPbmx5IHx8XG4gICAgICAhdGhpcy5jcmVhdG9yLmFsbG93TW9kaWZ5UGFnZXMgfHxcbiAgICAgIHRoaXMuX3JlYWRPbmx5KClcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVhZE9ubHkobmV3VmFsKSB7XG4gICAgdGhpcy5fcmVhZE9ubHkobmV3VmFsKTtcbiAgfVxuICBwdWJsaWMgaGFzRHJvcGRvd25TZWxlY3RvciA9IGtvLm9ic2VydmFibGUodHJ1ZSk7XG5cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLnNlbGVjdGlvblN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG4gICAgdGhpcy5zZWxlY3Rpb25TdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wYWdlc0ZvclNlbGVjdGlvbi5kaXNwb3NlKCk7XG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2PlxcbiAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IGl0ZW1zLCBhczogJ2l0ZW0nfSAgLS0+XFxuICA8ZGl2PlxcbiAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6aXRlbS5kaXNwbGF5TmFtZVxcXCI+PC9zcGFuPlxcbiAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBcXFwic3ZkLWVsZW1lbnQtc2VsZWN0b3JcXFwiLCBwYXJhbXM6IHsgbW9kZWw6aXRlbS5lbGVtZW50U2VsZWN0b3IgfSB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuICA8IS0tIC9rbyAtLT5cXG48L2Rpdj5cXG5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9iaW5kaW5ncy5zY3NzXCI7XG5pbXBvcnQge1xuICBTdXJ2ZXlQcm9wZXJ0eUJpbmRpbmdzRWRpdG9yLFxuICBTdXJ2ZXlQcm9wZXJ0eUJpbmRpbmdzSXRlbSxcbn0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUJpbmRpbmdzRWRpdG9yXCI7XG5jb25zdCB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi9iaW5kaW5ncy5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JCaW5kaW5nc1ZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpdGVtczogQXJyYXk8U3VydmV5UHJvcGVydHlCaW5kaW5nc0l0ZW0+LFxuICAgIHB1YmxpYyBhZnRlclJlbmRlcjogYW55XG4gICkge1xuICAgIGFmdGVyUmVuZGVyKCk7XG4gIH1cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1wcm9wZXJ0eS1lZGl0b3ItYmluZGluZ3NcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBTdXJ2ZXlQcm9wZXJ0eUJpbmRpbmdzRWRpdG9yID0gcGFyYW1zLm1vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvckJpbmRpbmdzVmlld01vZGVsKG1vZGVsLml0ZW1zLCAoKSA9PiB7XG4gICAgICAgIHR5cGVvZiBwYXJhbXMuYWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgIHBhcmFtcy5hZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcblxuICAgICAgICB0eXBlb2YgbW9kZWwua29BZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgbW9kZWwua29BZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJzanMtY2Itd3JhcHBlclxcXCI+XFxuICA8bGFiZWw+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNqcy1jYi1jb250YWluZXJcXFwiPlxcbiAgICAgIDxpbnB1dFxcbiAgICAgICAgY2xhc3M9XFxcInN2ZF9lZGl0b3JfY29udHJvbCBzdmQtZm9jdXNhYmxlXFxcIlxcbiAgICAgICAgdHlwZT1cXFwiY2hlY2tib3hcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNoZWNrZWQ6IGtvVmFsdWUsIGRpc2FibGU6ICRkYXRhLnJlYWRPbmx5XFxcIlxcbiAgICAgIC8+XFxuICAgICAgPHNwYW5cXG4gICAgICAgIGNsYXNzPVxcXCJjaGVja21hcmtcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogeyAnc3ZkLW1haW4tYmFja2dyb3VuZC1jb2xvcic6IGtvVmFsdWUsICdzdmQtbGlnaHQtYmFja2dyb3VuZC1jb2xvcic6ICFrb1ZhbHVlKCkgfVxcXCJcXG4gICAgICA+PC9zcGFuPlxcbiAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmlzRGlwbGF5TmFtZVZpc2libGUgLS0+XFxuICAgICAgPHNwYW4gY2xhc3M9XFxcInNqcy1jYi1sYWJlbFxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5kaXNwbGF5TmFtZVxcXCI+PC9zcGFuPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG4gIDwvbGFiZWw+XFxuPC9kaXY+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vYm9vbGVhbi5zY3NzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlCb29sZWFuUHJvcGVydHlFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuY29uc3QgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vYm9vbGVhbi5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JCb29sZWFuVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtvVmFsdWU6IGFueSxcbiAgICBwdWJsaWMgcmVhZE9ubHk6IGJvb2xlYW4sXG4gICAgcHVibGljIGlzRGlwbGF5TmFtZVZpc2libGU6IGJvb2xlYW4sXG4gICAgcHVibGljIGRpc3BsYXlOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIGFmdGVyUmVuZGVyOiBhbnlcbiAgKSB7XG4gICAgYWZ0ZXJSZW5kZXIoKTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXByb3BlcnR5LWVkaXRvci1ib29sZWFuXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogU3VydmV5Qm9vbGVhblByb3BlcnR5RWRpdG9yID0gcGFyYW1zLm1vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvckJvb2xlYW5WaWV3TW9kZWwoXG4gICAgICAgIG1vZGVsLmtvVmFsdWUsXG4gICAgICAgIG1vZGVsLnJlYWRPbmx5LFxuICAgICAgICBtb2RlbC5pc0RpcGxheU5hbWVWaXNpYmxlLFxuICAgICAgICBtb2RlbC5kaXNwbGF5TmFtZSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBwYXJhbXMuYWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgcGFyYW1zLmFmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuXG4gICAgICAgICAgdHlwZW9mIG1vZGVsLmtvQWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgbW9kZWwua29BZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwicGFuZWwgY2FyZFxcXCI+XFxuICA8ZGl2XFxuICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZToha29DYW5FZGl0KCksIHRleHQ6ICRkYXRhLmdldExvY1N0cmluZygncGUuY2VsbHNFbXB0eVJvd3NDb2x1bW5zJylcXFwiXFxuICA+PC9kaXY+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZToga29DYW5FZGl0XFxcIiBzdHlsZT1cXFwib3ZlcmZsb3c6YXV0b1xcXCI+XFxuICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGVcXFwiPlxcbiAgICAgIDx0aGVhZD5cXG4gICAgICAgIDx0cj5cXG4gICAgICAgICAgPHRoPjwvdGg+XFxuICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDoga29Db2x1bW5zIC0tPlxcbiAgICAgICAgICA8dGg+XFxuICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiRkYXRhXFxcIj48L3NwYW4+XFxuICAgICAgICAgIDwvdGg+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC90cj5cXG4gICAgICA8L3RoZWFkPlxcbiAgICAgIDx0Ym9keT5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDoga29Sb3dzICAtLT5cXG4gICAgICAgIDx0cj5cXG4gICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDpyb3dUZXh0XFxcIj48L3NwYW4+XFxuICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDoga29DZWxscyAtLT5cXG4gICAgICAgICAgPHRkIHN0eWxlPVxcXCJtaW4td2lkdGg6MTIwcHhcXFwiIGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICA8dGV4dGFyZWFcXG4gICAgICAgICAgICAgIHJvd3M9XFxcIjJcXFwiXFxuICAgICAgICAgICAgICBjb2xzPVxcXCIyNVxcXCJcXG4gICAgICAgICAgICAgIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgc3ZkLWZvY3VzYWJsZVxcXCJcXG4gICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwidGV4dElucHV0OnRleHRcXFwiXFxuICAgICAgICAgICAgPjwvdGV4dGFyZWE+XFxuICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC90cj5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvdGJvZHk+XFxuICAgIDwvdGFibGU+XFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9jZWxscy5zY3NzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUNlbGxzRWRpdG9yIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUNlbGxzRWRpdG9yXCI7XG5jb25zdCB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi9jZWxscy5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JDZWxsc1ZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrb0NhbkVkaXQ6IGFueSxcbiAgICBwdWJsaWMgZ2V0TG9jU3RyaW5nOiAobmFtZTogc3RyaW5nKSA9PiBhbnksXG4gICAgcHVibGljIGtvQ29sdW1uczogYW55LFxuICAgIHB1YmxpYyBrb1Jvd3M6IGFueSxcbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXI6IGFueVxuICApIHtcbiAgICBhZnRlclJlbmRlcigpO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtcHJvcGVydHktZWRpdG9yLWNlbGxzXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogU3VydmV5UHJvcGVydHlDZWxsc0VkaXRvciA9IHBhcmFtcy5tb2RlbDtcbiAgICAgIHJldHVybiBuZXcgUHJvcGVydHlFZGl0b3JDZWxsc1ZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwua29DYW5FZGl0LFxuICAgICAgICBtb2RlbC5nZXRMb2NTdHJpbmcsXG4gICAgICAgIG1vZGVsLmtvQ29sdW1ucyxcbiAgICAgICAgbW9kZWwua29Sb3dzLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHlwZW9mIHBhcmFtcy5hZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBwYXJhbXMuYWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG5cbiAgICAgICAgICB0eXBlb2YgbW9kZWwua29BZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBtb2RlbC5rb0FmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8aW5wdXQgY2xhc3M9XFxcImZvcm0tY29udHJvbCBzdmRfZWRpdG9yX2NvbnRyb2wgc3ZkLWZvY3VzYWJsZVxcXCIgdHlwZT1cXFwiY29sb3JcXFwiIGRhdGEtYmluZD1cXFwidmFsdWU6IGtvVmFsdWUsIGRpc2FibGU6IHJlYWRPbmx5XFxcIlxcbiAgICBzdHlsZT1cXFwid2lkdGg6MTAwJVxcXCIgLz5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9jb2xvci5zY3NzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlDb2xvclByb3BlcnR5RWRpdG9yIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUVkaXRvckZhY3RvcnlcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL2NvbG9yLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVkaXRvckNvbG9yVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtvVmFsdWU6IGFueSxcbiAgICBwdWJsaWMgcmVhZE9ubHk6IGJvb2xlYW4sXG4gICAgcHVibGljIGtvTWF4VmFsdWU6IGFueSxcbiAgICBwdWJsaWMga29NaW5WYWx1ZTogYW55LFxuICAgIHB1YmxpYyBhZnRlclJlbmRlcjogYW55XG4gICkge1xuICAgIGFmdGVyUmVuZGVyKCk7XG4gIH1cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1wcm9wZXJ0eS1lZGl0b3ItY29sb3JcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBTdXJ2ZXlDb2xvclByb3BlcnR5RWRpdG9yID0gcGFyYW1zLm1vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvckNvbG9yVmlld01vZGVsKFxuICAgICAgICBtb2RlbC5rb1ZhbHVlLFxuICAgICAgICBtb2RlbC5yZWFkT25seSxcbiAgICAgICAgbW9kZWwua29NYXhWYWx1ZSxcbiAgICAgICAgbW9kZWwua29NaW5WYWx1ZSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBwYXJhbXMuYWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgcGFyYW1zLmFmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuXG4gICAgICAgICAgdHlwZW9mIG1vZGVsLmtvQWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgbW9kZWwua29BZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3ZkLXByb3BlcnR5ZWRpdG9yLWNvbmRpdGlvblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2ZC1leHByZXNzaW9uLWhlYWRlclxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBrb1Nob3dFeHByZXNzaW9uSGVhZGVyLCBjbGljazogb25TaG93SGlkZUVkaXRvclxcXCI+XFxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IGtvQ29uZGl0aW9uRGlzcGxheVRleHRcXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwhLS0ga28gaWY6ICFrb0lzRWRpdG9yU2hvd2luZygpICYmICFrb0lzRWRpdG9ySGlkaW5nRGlzYWJsZWQoKSAtLT5cXG4gICAgICAgIDxzdmctaWNvbiBjbGFzcz1cXFwiaWNvbi1leHByZXNzaW9uLWFycm93IHN2ZC1wcmltYXJ5LWljb25cXFwiIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWFycm93X2Rvd25fMTB4MTAnLCBzaXplOiAxMFxcXCI+XFxuICAgICAgICA8L3N2Zy1pY29uPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIGtvIGlmOiBrb0lzRWRpdG9yU2hvd2luZygpICYmICFrb0lzRWRpdG9ySGlkaW5nRGlzYWJsZWQoKSAtLT5cXG4gICAgICAgIDxzdmctaWNvbiBjbGFzcz1cXFwiaWNvbi1leHByZXNzaW9uLWFycm93IHN2ZC1wcmltYXJ5LWljb25cXFwiIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWFycm93X3VwXzEweDEwJywgc2l6ZTogMTBcXFwiPlxcbiAgICAgICAgPC9zdmctaWNvbj5cXG4gICAgICAgIDwvc3Bhbj5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3ZkLWV4cHJlc3Npb24tY29udGVudFxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBrb0lzRWRpdG9yU2hvd2luZygpIHx8ICFrb1Nob3dFeHByZXNzaW9uSGVhZGVyKClcXFwiPlxcbiAgICAgICAgPGRpdiBzdHlsZT1cXFwibWFyZ2luLWJvdHRvbTozcHhcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29TaG93VGFicygpIHx8ICFrb0NhblBhcnNlRXhwcmVzc2lvbigpXFxcIj5cXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJidG4gc3YtYnRuIGJ0bi1zbSBidG4teHNcXFwiXFxuICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiZW5hYmxlOiBrb0NhblBhcnNlRXhwcmVzc2lvbigpLCBjc3M6IHsnYnRuLXByaW1hcnknOiBrb0FjdGl2ZVZpZXcoKSA9PT0gJ2Zvcm0nLCAnYnRuLWxpbmsnOiBrb0FjdGl2ZVZpZXcoKSAhPT0gJ2Zvcm0nfSwgY2xpY2s6IG9uQ2hhbmdlVmlld0NsaWNrLmJpbmQoJGRhdGEsICdmb3JtJyksIHRleHQ6ICRkYXRhLmdldExvY1N0cmluZygncGUuYnVpbGRFeHByZXNzaW9uJylcXFwiPjwvYnV0dG9uPlxcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcImJ0biBzdi1idG4gYnRuLXNtIGJ0bi14c1xcXCJcXG4gICAgICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6IHsnYnRuLXByaW1hcnknOiBrb0FjdGl2ZVZpZXcoKSAhPT0gJ2Zvcm0nLCAnYnRuLWxpbmsnOiBrb0FjdGl2ZVZpZXcoKSA9PT0gJ2Zvcm0nfSwgY2xpY2s6b25DaGFuZ2VWaWV3Q2xpY2suYmluZCgkZGF0YSwgJ3RleHQnKSwgdGV4dDogJGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5lZGl0RXhwcmVzc2lvbicpXFxcIj48L2J1dHRvbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvQWN0aXZlVmlldygpID09ICdmb3JtJ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLWV4cHJlc3Npb24tc2V0dXBcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTokZGF0YS5rb1NldHVwVGV4dCgpLCB0ZXh0OiAkZGF0YS5rb1NldHVwVGV4dFxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogIWtvSXNXaWRlTW9kZSgpIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDoga29FZGl0b3JJdGVtcyAtLT5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmRfd3JhcF9lbGVtZW50c1xcXCI+XFxuICAgICAgICAgICAgICAgIDxzdXJ2ZXktd2lkZ2V0IHBhcmFtcz1cXFwic3VydmV5OiAkZGF0YS5zdXJ2ZXlcXFwiPjwvc3VydmV5LXdpZGdldD5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWlubGluZSBmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBidG4gc3YtYnRuIGJ0bi1kYW5nZXJcXFwiXFxuICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6ISRwYXJlbnQucmVhZE9ubHkoKSwgY2xpY2s6ICRwYXJlbnQub25SZW1vdmVDb25kaXRpb25DbGljaywgdmFsdWU6ICRwYXJlbnQucmVtb3ZlQ29uZGl0aW9uVGV4dFxcXCIgLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8aHI+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjoga29Jc1dpZGVNb2RlKCkgLS0+XFxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVxcXCJzdmQtcHJvcGVydHllZGl0b3ItY29uZGl0aW9uLXdpZGUtdGFibGVcXFwiPlxcbiAgICAgICAgICAgICAgICA8dGJvZHkgZGF0YS1iaW5kPVxcXCJmb3JlYWNoOiBrb0VkaXRvckl0ZW1zXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZF93cmFwX2VsZW1lbnRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdXJ2ZXktd2lkZ2V0IHBhcmFtcz1cXFwic3VydmV5OiAkZGF0YS5zdXJ2ZXlcXFwiPjwvc3VydmV5LXdpZGdldD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJzdmQtcHJvcGVydHllZGl0b3ItY29uZGl0aW9uLWl0ZW0tZGVsZXRlLWljb25cXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImtleTJjbGljaywgY2xpY2tOb0ZvY3VzOiAkcGFyZW50Lm9uUmVtb3ZlQ29uZGl0aW9uQ2xpY2ssIGF0dHI6IHsgdGl0bGU6ICRwYXJlbnQucmVtb3ZlQ29uZGl0aW9uVGV4dCwgdGFiaW5kZXg6IDAsIHJvbGU6ICdidXR0b24nIH1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Zy1pY29uIGNsYXNzPVxcXCJzdmQtZGFuZ2VyLWljb24gaWNvbi1hY3Rpb25kZWxldGVcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24tYWN0aW9uZGVsZXRlJ1xcXCI+PC9zdmctaWNvbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxcbiAgICAgICAgICAgIDwvdGFibGU+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1pbmxpbmUgZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGJ0biBzdi1idG4gYnRuLXByaW1hcnkgc3ZkLWxvZ2ljLWJ1dHRvbiBzdmQtbG9naWMtYWRkLWNvbmRpdGlvbi1idXR0b24gc3ZkLWZvY3VzYWJsZVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZTprb0NhbkFkZEl0ZW0sIGNsaWNrOiAkZGF0YS5hZGRDb25kaXRpb24sIHZhbHVlOiBhZGRDb25kaXRpb25UZXh0XFxcIiAvPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTprb0FjdGl2ZVZpZXcoKSAhPSAnZm9ybSdcXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IGhhc0FjZUVkaXRvciAtLT5cXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6JGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5hY2VFZGl0b3JIZWxwJylcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICA8ZGl2IGlkPVxcXCJleHByZXNzaW9uLWFjZS1lZGl0b3JcXFwiXFxuICAgICAgICAgICAgICAgIHN0eWxlPVxcXCJvdmVyZmxvdy15OiBhdXRvOyBvdmVyZmxvdy14OmhpZGRlbjsgbWF4LWhlaWdodDoyNTBweDsgbWluLWhlaWdodDoxNTBweDsgd2lkdGg6IDEwMCU7XFxcIlxcbiAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHRJbnB1dDprb1RleHRWYWx1ZSwgYWNlRWRpdG9yOntxdWVzdGlvbnM6IGF2YWlsYWJsZVF1ZXN0aW9ucywgcXVlc3Rpb246ICRkYXRhLmVkaXRpbmdPYmplY3QsIGVkaXRvcjogbW9kZWx9XFxcIj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiAhaGFzQWNlRWRpdG9yIC0tPlxcbiAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cXFwic3ZkLWRhcmstYm9yZGVyLWNvbG9yXFxcIiBkYXRhLWJpbmQ9XFxcInRleHRJbnB1dDprb1RleHRWYWx1ZSwgZGlzYWJsZTogcmVhZE9ubHlcXFwiXFxuICAgICAgICAgICAgICAgIHN0eWxlPVxcXCJvdmVyZmxvdy15OiBhdXRvOyBvdmVyZmxvdy14OmhpZGRlbjsgbWF4LWhlaWdodDoyNTBweDsgbWluLWhlaWdodDoxNTBweDsgd2lkdGg6IDEwMCU7XFxcIlxcbiAgICAgICAgICAgICAgICBhdXRvZm9jdXM9XFxcImF1dG9mb2N1c1xcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9jb25kaXRpb24uc2Nzc1wiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlDb25kaXRpb25FZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5Q29uZGl0aW9uRWRpdG9yXCI7XG5jb25zdCB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi9jb25kaXRpb24uaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yQ29uZGl0aW9uVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtvU2hvd0V4cHJlc3Npb25IZWFkZXI6IGFueSxcbiAgICBwdWJsaWMgb25TaG93SGlkZUVkaXRvcjogYW55LFxuICAgIHB1YmxpYyBrb0NvbmRpdGlvbkRpc3BsYXlUZXh0OiBhbnksXG4gICAgcHVibGljIGtvSXNFZGl0b3JTaG93aW5nOiBhbnksXG4gICAgcHVibGljIGtvSXNFZGl0b3JIaWRpbmdEaXNhYmxlZDogYW55LFxuICAgIHB1YmxpYyBrb1Nob3dUYWJzOiBhbnksXG4gICAgcHVibGljIGtvQ2FuUGFyc2VFeHByZXNzaW9uOiBhbnksXG4gICAgcHVibGljIGtvQWN0aXZlVmlldzogYW55LFxuICAgIHB1YmxpYyBvbkNoYW5nZVZpZXdDbGljazogYW55LFxuICAgIHB1YmxpYyBnZXRMb2NTdHJpbmc6IGFueSxcbiAgICBwdWJsaWMga29TZXR1cFRleHQ6IGFueSxcbiAgICBwdWJsaWMga29Jc1dpZGVNb2RlOiBhbnksXG4gICAgcHVibGljIGtvRWRpdG9ySXRlbXM6IGFueSxcbiAgICBwdWJsaWMgcmVhZE9ubHk6IGFueSxcbiAgICBwdWJsaWMga29DYW5BZGRJdGVtOiBhbnksXG4gICAgcHVibGljIG9uUmVtb3ZlQ29uZGl0aW9uQ2xpY2s6IGFueSxcbiAgICBwdWJsaWMgcmVtb3ZlQ29uZGl0aW9uVGV4dDogYW55LFxuICAgIHB1YmxpYyBhZGRDb25kaXRpb246IGFueSxcbiAgICBwdWJsaWMgYWRkQ29uZGl0aW9uVGV4dDogc3RyaW5nLFxuICAgIHB1YmxpYyBoYXNBY2VFZGl0b3I6IGJvb2xlYW4sXG4gICAgcHVibGljIGtvVGV4dFZhbHVlOiBhbnksXG4gICAgcHVibGljIGF2YWlsYWJsZVF1ZXN0aW9uczogYW55W10sXG4gICAgcHVibGljIGVkaXRpbmdPYmplY3Q6IGFueSxcbiAgICBwdWJsaWMgbW9kZWw6IFN1cnZleVByb3BlcnR5Q29uZGl0aW9uRWRpdG9yLFxuICAgIHB1YmxpYyBhZnRlclJlbmRlcjogYW55XG4gICkge1xuICAgIGFmdGVyUmVuZGVyKCk7XG4gIH1cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1wcm9wZXJ0eS1lZGl0b3ItY29uZGl0aW9uXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogU3VydmV5UHJvcGVydHlDb25kaXRpb25FZGl0b3IgPSBwYXJhbXMubW9kZWw7XG4gICAgICByZXR1cm4gbmV3IFByb3BlcnR5RWRpdG9yQ29uZGl0aW9uVmlld01vZGVsKFxuICAgICAgICBtb2RlbC5rb1Nob3dFeHByZXNzaW9uSGVhZGVyLFxuICAgICAgICBtb2RlbC5vblNob3dIaWRlRWRpdG9yLFxuICAgICAgICBtb2RlbC5rb0NvbmRpdGlvbkRpc3BsYXlUZXh0LFxuICAgICAgICBtb2RlbC5rb0lzRWRpdG9yU2hvd2luZyxcbiAgICAgICAgbW9kZWwua29Jc0VkaXRvckhpZGluZ0Rpc2FibGVkLFxuICAgICAgICBtb2RlbC5rb1Nob3dUYWJzLFxuICAgICAgICBtb2RlbC5rb0NhblBhcnNlRXhwcmVzc2lvbixcbiAgICAgICAgbW9kZWwua29BY3RpdmVWaWV3LFxuICAgICAgICBtb2RlbC5vbkNoYW5nZVZpZXdDbGljayxcbiAgICAgICAgbW9kZWwuZ2V0TG9jU3RyaW5nLFxuICAgICAgICBtb2RlbC5rb1NldHVwVGV4dCxcbiAgICAgICAgbW9kZWwua29Jc1dpZGVNb2RlLFxuICAgICAgICBtb2RlbC5rb0VkaXRvckl0ZW1zLFxuICAgICAgICBtb2RlbC5yZWFkT25seSxcbiAgICAgICAgbW9kZWwua29DYW5BZGRJdGVtLFxuICAgICAgICBtb2RlbC5vblJlbW92ZUNvbmRpdGlvbkNsaWNrLFxuICAgICAgICBtb2RlbC5yZW1vdmVDb25kaXRpb25UZXh0LFxuICAgICAgICBtb2RlbC5hZGRDb25kaXRpb24sXG4gICAgICAgIG1vZGVsLmFkZENvbmRpdGlvblRleHQsXG4gICAgICAgIG1vZGVsLmhhc0FjZUVkaXRvcixcbiAgICAgICAgbW9kZWwua29UZXh0VmFsdWUsXG4gICAgICAgIG1vZGVsLmF2YWlsYWJsZVF1ZXN0aW9ucyxcbiAgICAgICAgbW9kZWwuZWRpdGluZ09iamVjdCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eXBlb2YgcGFyYW1zLmFmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHBhcmFtcy5hZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcblxuICAgICAgICAgIHR5cGVvZiBtb2RlbC5rb0FmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIG1vZGVsLmtvQWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXY+PC9kaXY+XCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vY3VzdG9tLnNjc3NcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5Q3VzdG9tRWRpdG9yIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUN1c3RvbUVkaXRvclwiO1xuY29uc3QgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vY3VzdG9tLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVkaXRvckN1c3RvbVZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtb2RlbDogU3VydmV5UHJvcGVydHlDdXN0b21FZGl0b3IsIGFmdGVyUmVuZGVyOiBhbnkpIHtcbiAgICBhZnRlclJlbmRlcigpO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtcHJvcGVydHktZWRpdG9yLWN1c3RvbVwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgY29uc3QgbW9kZWw6IFN1cnZleVByb3BlcnR5Q3VzdG9tRWRpdG9yID0gcGFyYW1zLm1vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvckN1c3RvbVZpZXdNb2RlbChtb2RlbCwgKCkgPT4ge1xuICAgICAgICB0eXBlb2YgcGFyYW1zLmFmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICBwYXJhbXMuYWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG5cbiAgICAgICAgdHlwZW9mIG1vZGVsLmtvQWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgIG1vZGVsLmtvQWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGZvcm0+XFxuICA8ZGl2IGNsYXNzPVxcXCJzdmRfd3JhcF9lbGVtZW50c1xcXCI+XFxuICAgIDxzdXJ2ZXktd2lkZ2V0IHBhcmFtcz1cXFwic3VydmV5OiBrb1N1cnZleVxcXCI+PC9zdXJ2ZXktd2lkZ2V0PlxcbiAgPC9kaXY+XFxuPC9mb3JtPlxcbjxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIHN2LWJ0biBidG4tc20gYnRuLWRhbmdlclxcXCJcXG4gIGRhdGEtYmluZD1cXFwiY2xpY2s6IGZ1bmN0aW9uKCl7cmVzZXRWYWx1ZShtb2RlbCl9LCB0ZXh0OiByZXNldFRleHQoKVxcXCI+PC9idXR0b24+XFxuPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gc3YtYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXFxcIlxcbiAgZGF0YS1iaW5kPVxcXCJjbGljazogZnVuY3Rpb24oKXtyZWZyZXNoU3VydmV5KG1vZGVsKX0sIHRleHQ6IHJlZnJlc2hUZXh0KClcXFwiPjwvYnV0dG9uPlwiOyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuXG5pbXBvcnQgXCIuL2RlZmF1bHQtdmFsdWUuc2Nzc1wiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5RGVmYXVsdFZhbHVlRWRpdG9yXCI7XG5jb25zdCB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi9kZWZhdWx0LXZhbHVlLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVkaXRvclZhbHVlVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtvU3VydmV5OiBhbnksXG4gICAgcHVibGljIHJlc2V0VmFsdWU6IChtb2RlbDogU3VydmV5UHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3IpID0+IHZvaWQsXG4gICAgcHVibGljIHJlc2V0VGV4dDogKCkgPT4gc3RyaW5nLFxuICAgIHB1YmxpYyByZWZyZXNoU3VydmV5OiAobW9kZWw6IFN1cnZleVByb3BlcnR5RGVmYXVsdFZhbHVlRWRpdG9yKSA9PiB2b2lkLFxuICAgIHB1YmxpYyByZWZyZXNoVGV4dDogKCkgPT4gc3RyaW5nLFxuICAgIHB1YmxpYyBtb2RlbDogU3VydmV5UHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3IsXG4gICAgcHVibGljIGNvbXBvbmVudEluZm86IGFueSxcbiAgICBwdWJsaWMga29BZnRlclJlbmRlcjogYW55LFxuICAgIHB1YmxpYyBhZnRlclJlbmRlcjogYW55XG4gICkge1xuICAgIGFmdGVyUmVuZGVyKCk7XG4gIH1cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1wcm9wZXJ0eS1lZGl0b3ItZGVmYXVsdC12YWx1ZVwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgY29uc3QgbW9kZWw6IFN1cnZleVByb3BlcnR5RGVmYXVsdFZhbHVlRWRpdG9yID0gcGFyYW1zLm1vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvclZhbHVlVmlld01vZGVsKFxuICAgICAgICBtb2RlbC5rb1N1cnZleSxcbiAgICAgICAgbW9kZWwucmVzZXRWYWx1ZSxcbiAgICAgICAgbW9kZWwucmVzZXRUZXh0LFxuICAgICAgICBtb2RlbC5yZWZyZXNoU3VydmV5LFxuICAgICAgICBtb2RlbC5yZWZyZXNoVGV4dCxcbiAgICAgICAgbW9kZWwsIC8vVE9ETyBicmVhayBvbiBwcm9wc1xuICAgICAgICBjb21wb25lbnRJbmZvLFxuICAgICAgICBtb2RlbC5rb0FmdGVyUmVuZGVyLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHlwZW9mIHBhcmFtcy5hZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBwYXJhbXMuYWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG5cbiAgICAgICAgICB0eXBlb2YgbW9kZWwua29BZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBtb2RlbC5rb0FmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8c3ZkLWRyb3Bkb3duXFxuICBjbGFzcz1cXFwic3ZkX3Byb3BlcnR5X2VkaXRvcl9kcm9wZG93blxcXCJcXG4gIHBhcmFtcz1cXFwiaXRlbTogeyBpdGVtczprb0Nob2ljZXMsIGFjdGlvbjoga29WYWx1ZSwgZGlzYWJsZTogcmVhZE9ubHksIG9wdGlvbnNDYXB0aW9uOiBvcHRpb25zQ2FwdGlvbiwgdmFsdWVBbGxvd1Vuc2V0OiB0cnVlLCBoYXNGb2N1czoga29IYXNGb2N1cywgYXJpYUxhYmVsOiBkaXNwbGF5TmFtZX1cXFwiXFxuPjwvc3ZkLWRyb3Bkb3duPlxcblwiOyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuXG5pbXBvcnQgXCIuL2Ryb3Bkb3duLnNjc3NcIjtcbmltcG9ydCB7IFN1cnZleURyb3Bkb3duUHJvcGVydHlFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuY29uc3QgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vZHJvcGRvd24uaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yRHJvcGRvd25WaWV3TW9kZWwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga29WYWx1ZTogYW55LFxuICAgIHB1YmxpYyByZWFkT25seTogYm9vbGVhbixcbiAgICBwdWJsaWMgb3B0aW9uc0NhcHRpb246IHN0cmluZyxcbiAgICBwdWJsaWMga29DaG9pY2VzOiBhbnksXG4gICAgcHVibGljIGtvSGFzRm9jdXM6IGtvLk9ic2VydmFibGU8Ym9vbGVhbj4sXG4gICAgcHVibGljIGRpc3BsYXlOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIGFmdGVyUmVuZGVyOiBhbnlcbiAgKSB7XG4gICAgYWZ0ZXJSZW5kZXIoKTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXByb3BlcnR5LWVkaXRvci1kcm9wZG93blwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgY29uc3QgbW9kZWw6IFN1cnZleURyb3Bkb3duUHJvcGVydHlFZGl0b3IgPSBwYXJhbXMubW9kZWw7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcGVydHlFZGl0b3JEcm9wZG93blZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwua29WYWx1ZSxcbiAgICAgICAgbW9kZWwucmVhZE9ubHksXG4gICAgICAgIG1vZGVsLm9wdGlvbnNDYXB0aW9uLFxuICAgICAgICBtb2RlbC5rb0Nob2ljZXMsXG4gICAgICAgIG1vZGVsLmtvSGFzRm9jdXMsXG4gICAgICAgIG1vZGVsLmRpc3BsYXlOYW1lLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHlwZW9mIHBhcmFtcy5hZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBwYXJhbXMuYWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG5cbiAgICAgICAgICB0eXBlb2YgbW9kZWwua29BZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBtb2RlbC5rb0FmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1kYW5nZXJcXFwiIHJvbGU9XFxcImFsZXJ0XFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOmtvRGlzcGxheUVycm9yXFxcIj5cXG4gICAgPHNwYW4gY2xhc3M9XFxcImdseXBoaWNvbiBnbHlwaGljb24tZXhjbGFtYXRpb24tc2lnblxcXCI+PC9zcGFuPlxcbiAgICA8c3BhbiBjbGFzcz1cXFwic3Itb25seVxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBnZXRMb2NTdHJpbmcoJ2VkLnByb3BlcnR5RWRpdG9yRXJyb3InKVxcXCI+PC9zcGFuPlxcbiAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IGtvRXJyb3JUZXh0XFxcIj48L3NwYW4+XFxuPC9kaXY+XCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vZXJyb3Iuc2Nzc1wiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUVkaXRvckJhc2VcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL2Vycm9yLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVkaXRvckVycm9yVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtvRGlzcGxheUVycm9yOiBhbnksXG4gICAgcHVibGljIGdldExvY1N0cmluZzogYW55LFxuICAgIHB1YmxpYyBrb0Vycm9yVGV4dDogYW55XG4gICkge31cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1wcm9wZXJ0eS1lZGl0b3ItZXJyb3JcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UgPSBwYXJhbXMubW9kZWw7XG4gICAgICByZXR1cm4gbmV3IFByb3BlcnR5RWRpdG9yRXJyb3JWaWV3TW9kZWwoXG4gICAgICAgIG1vZGVsLmtvRGlzcGxheUVycm9yLFxuICAgICAgICBtb2RlbC5nZXRMb2NTdHJpbmcsXG4gICAgICAgIG1vZGVsLmtvRXJyb3JUZXh0XG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJwcm9wZXJ0eWVkaXRvci1leHByZXNzaW9uXFxcIj5cXG4gIDwhLS0ga28gaWY6IGhhc0FjZUVkaXRvciAtLT5cXG4gIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDokZGF0YS5nZXRMb2NTdHJpbmcoJ3BlLmFjZUVkaXRvckhlbHAnKVxcXCI+PC9zcGFuPlxcbiAgPGRpdlxcbiAgICBpZD1cXFwiZXhwcmVzc2lvbi1hY2UtZWRpdG9yXFxcIlxcbiAgICBzdHlsZT1cXFwiaGVpZ2h0OiA0MHB4OyB3aWR0aDogMTAwJVxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJ2YWx1ZTprb1ZhbHVlLCBhY2VFZGl0b3I6IHtxdWVzdGlvbnM6IGF2YWlsYWJsZVF1ZXN0aW9ucywgcXVlc3Rpb246ICRkYXRhLmVkaXRpbmdPYmplY3QsIGVkaXRvcjogbW9kZWx9XFxcIlxcbiAgPjwvZGl2PlxcbiAgPCEtLSAva28gLS0+XFxuICA8IS0tIGtvIGlmOiAhaGFzQWNlRWRpdG9yIC0tPlxcbiAgPHRleHRhcmVhXFxuICAgIGNsYXNzPVxcXCJzdmQtZGFyay1ib3JkZXItY29sb3JcXFwiXFxuICAgIGRhdGEtYmluZD1cXFwidmFsdWU6a29UZXh0VmFsdWVcXFwiXFxuICAgIHJvd3M9XFxcIjJcXFwiXFxuICAgIGF1dG9mb2N1cz1cXFwiYXV0b2ZvY3VzXFxcIlxcbiAgPjwvdGV4dGFyZWE+XFxuICA8IS0tIC9rbyAtLT5cXG48L2Rpdj5cXG5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9leHByZXNzaW9uLnNjc3NcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5Q29uZGl0aW9uRWRpdG9yIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUNvbmRpdGlvbkVkaXRvclwiO1xuY29uc3QgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vZXhwcmVzc2lvbi5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JFeHByZXNzaW9uVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGhhc0FjZUVkaXRvcjogYm9vbGVhbixcbiAgICBwdWJsaWMgZ2V0TG9jU3RyaW5nOiAobmFtZTogc3RyaW5nKSA9PiBhbnksXG4gICAgcHVibGljIGtvVmFsdWU6IGtvLk9ic2VydmFibGU8YW55PixcbiAgICBwdWJsaWMgYXZhaWxhYmxlUXVlc3Rpb25zOiBhbnlbXSxcbiAgICBwdWJsaWMgZWRpdGluZ09iamVjdDogYW55LFxuICAgIHB1YmxpYyBtb2RlbDogU3VydmV5UHJvcGVydHlDb25kaXRpb25FZGl0b3IsXG4gICAgcHVibGljIGtvVGV4dFZhbHVlOiBhbnksXG4gICAgcHVibGljIHNob3dIZWxwVGV4dDogYW55LFxuICAgIHB1YmxpYyBhZnRlclJlbmRlcjogYW55XG4gICkge1xuICAgIGFmdGVyUmVuZGVyKCk7XG4gIH1cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1wcm9wZXJ0eS1lZGl0b3ItZXhwcmVzc2lvblwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgY29uc3QgbW9kZWw6IFN1cnZleVByb3BlcnR5Q29uZGl0aW9uRWRpdG9yID0gcGFyYW1zLm1vZGVsO1xuXG4gICAgICByZXR1cm4gbmV3IFByb3BlcnR5RWRpdG9yRXhwcmVzc2lvblZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwuaGFzQWNlRWRpdG9yLFxuICAgICAgICBtb2RlbC5nZXRMb2NTdHJpbmcsXG4gICAgICAgIG1vZGVsLmtvVmFsdWUsXG4gICAgICAgIG1vZGVsLmF2YWlsYWJsZVF1ZXN0aW9ucyxcbiAgICAgICAgbW9kZWwuZWRpdGluZ09iamVjdCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIG1vZGVsLmtvVGV4dFZhbHVlLFxuICAgICAgICBtb2RlbC5zaG93SGVscFRleHQsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eXBlb2YgcGFyYW1zLmFmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHBhcmFtcy5hZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcblxuICAgICAgICAgIHR5cGVvZiBtb2RlbC5rb0FmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIG1vZGVsLmtvQWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcImZvcm0tY29udHJvbCBzdmQtY29udHJvbCBzdmQtZm9jdXNhYmxlIHN2ZC1wcm9wZXJ0eS1lZGl0b3ItZmlsZVxcXCI+XFxuICA8IS0tIGtvIGlmbm90OiByZWFkT25seSAtLT5cXG4gIDxpbnB1dCB0eXBlPVxcXCJmaWxlXFxcIiBjbGFzcz1cXFwic3ZkLWNob29zZS1maWxlLWNvbnRyb2xcXFwiIC8+XFxuICA8c3BhblxcbiAgICBjbGFzcz1cXFwiZWRpdC1pbWFnZS1pdGVtXFxcIlxcbiAgICByb2xlPVxcXCJidXR0b25cXFwiXFxuICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6IGNob29zZUZpbGUsIGNsaWNrQnViYmxlOiBmYWxzZSwgYXR0cjogeyB0aXRsZTogZ2V0TG9jU3RyaW5nKCdwZS5lZGl0JyksICdhcmlhLWxhYmVsJzogZ2V0TG9jU3RyaW5nKCdwZS5lZGl0JykgfVxcXCJcXG4gID5cXG4gICAgPHN2Zy1pY29uXFxuICAgICAgY2xhc3M9XFxcInN2ZC1wcmltYXJ5LWljb25cXFwiXFxuICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24taW5wbGFjZWVkaXQnLCBzaXplOiAxMlxcXCJcXG4gICAgPjwvc3ZnLWljb24+XFxuICA8L3NwYW4+XFxuICA8c3BhblxcbiAgICBjbGFzcz1cXFwic3ZkYS1kZWxldGUtaXRlbVxcXCJcXG4gICAgcm9sZT1cXFwiYnV0dG9uXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBkZWxldGVGaWxlLCBhdHRyOiB7IHRpdGxlOiBnZXRMb2NTdHJpbmcoJ3BlLmRlbGV0ZScpLCAnYXJpYS1sYWJlbCc6IGdldExvY1N0cmluZygncGUuZGVsZXRlJykgfSwgdmlzaWJsZToga29WYWx1ZVxcXCJcXG4gID5cXG4gICAgPHN2Zy1pY29uXFxuICAgICAgY2xhc3M9XFxcInN2ZC1wcmltYXJ5LWljb25cXFwiXFxuICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24taW5wbGFjZWRlbGV0ZScsIHNpemU6IDEyXFxcIlxcbiAgICA+PC9zdmctaWNvbj5cXG4gIDwvc3Bhbj5cXG4gIDwhLS0gL2tvIC0tPlxcbiAgPHNwYW4gY2xhc3M9XFxcInN2ZC1wcm9wZXJ0eS1lZGl0b3ItZmlsZS1jb250ZW50XFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6IGZpbGVDb250ZW50XFxcIj5cXG4gIDwvc3Bhbj5cXG48L2Rpdj5cXG5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IEpzb25PYmplY3RQcm9wZXJ0eSB9IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5cbmltcG9ydCBcIi4vZmlsZS5zY3NzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuY29uc3QgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vZmlsZS5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5RmlsZVByb3BlcnR5RWRpdG9yIGV4dGVuZHMgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmaWxlXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yRmlsZVZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm9vdEVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50LFxuICAgIHByaXZhdGUgZWRpdG9yOiBhbnksXG4gICAgcHVibGljIGtvVmFsdWU6IGFueSxcbiAgICBwdWJsaWMgcmVhZE9ubHk6IGJvb2xlYW4sXG4gICAgcHVibGljIGlzRGlwbGF5TmFtZVZpc2libGU6IGJvb2xlYW4sXG4gICAgcHVibGljIGRpc3BsYXlOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIGFmdGVyUmVuZGVyOiBhbnlcbiAgKSB7XG4gICAgYWZ0ZXJSZW5kZXIoKTtcbiAgfVxuXG4gIGdldCBmaWxlQ29udGVudCgpIHtcbiAgICBpZiAodGhpcy5rb1ZhbHVlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmtvVmFsdWUoKS5zdWJzdHJpbmcoMCwgNDUpICsgXCIuLi5cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicGUubm9GaWxlXCIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2NTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhzdHIpO1xuICB9XG5cbiAgY2hvb3NlRmlsZSA9IChtb2RlbDogUHJvcGVydHlFZGl0b3JGaWxlVmlld01vZGVsLCBldmVudDogRXZlbnQpID0+IHtcbiAgICBpZiAoISFrby51bndyYXAodGhpcy5yZWFkT25seSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGZpbGVJbnB1dCA9IHRoaXMucm9vdEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICBcInN2ZC1jaG9vc2UtZmlsZS1jb250cm9sXCJcbiAgICApWzBdO1xuICAgIHRoaXMuZWRpdG9yLmNob29zZUZpbGVzKGZpbGVJbnB1dCwgKGZpbGVzOiBGaWxlW10pID0+IHtcbiAgICAgIHRoaXMuZWRpdG9yLnVwbG9hZEZpbGVzKGZpbGVzLCAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgIHRoaXMua29WYWx1ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIGRlbGV0ZUZpbGUgPSAobW9kZWw6IFByb3BlcnR5RWRpdG9yRmlsZVZpZXdNb2RlbCwgZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgaWYgKCEha28udW53cmFwKHRoaXMucmVhZE9ubHkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZWRpdG9yLmNsZWFyRmlsZXModGhpcy5rb1ZhbHVlKCksIChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICB0aGlzLmtvVmFsdWUodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1wcm9wZXJ0eS1lZGl0b3ItZmlsZVwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgY29uc3QgbW9kZWw6IFN1cnZleUZpbGVQcm9wZXJ0eUVkaXRvciA9IHBhcmFtcy5tb2RlbDtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvckZpbGVWaWV3TW9kZWwoXG4gICAgICAgIGNvbXBvbmVudEluZm8uZWxlbWVudCxcbiAgICAgICAgbW9kZWwub3B0aW9ucyxcbiAgICAgICAgbW9kZWwua29WYWx1ZSxcbiAgICAgICAgbW9kZWwucmVhZE9ubHksXG4gICAgICAgIG1vZGVsLmlzRGlwbGF5TmFtZVZpc2libGUsXG4gICAgICAgIG1vZGVsLmRpc3BsYXlOYW1lLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHlwZW9mIHBhcmFtcy5hZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBwYXJhbXMuYWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG5cbiAgICAgICAgICB0eXBlb2YgbW9kZWwua29BZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBtb2RlbC5rb0FmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcblxuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyRWRpdG9yKFxuICBcImZpbGVcIixcbiAgKHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHkpID0+IG5ldyBTdXJ2ZXlGaWxlUHJvcGVydHlFZGl0b3IocHJvcGVydHkpXG4pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjx0ZXh0YXJlYSBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBkYXRhLWJpbmQ9XFxcInRleHRJbnB1dDprb1ZhbHVlLCBkaXNhYmxlOiByZWFkT25seVxcXCIgc3R5bGU9XFxcIndpZHRoOjEwMCU7aGVpZ2h0OmF1dG9cXFwiIHJvd3M9XFxcIjEwXFxcIiBhdXRvZm9jdXM9XFxcImF1dG9mb2N1c1xcXCI+PC90ZXh0YXJlYT5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9odG1sLXBlLnNjc3NcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5SHRtbEVkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlNb2RhbEVkaXRvclwiO1xuY29uc3QgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vaHRtbC1wZS5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JIVE1MVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtvVmFsdWU6IGtvLk9ic2VydmFibGU8YW55PixcbiAgICBwdWJsaWMgcmVhZE9ubHk6IGJvb2xlYW4sXG4gICAgcHVibGljIGFmdGVyUmVuZGVyOiBhbnlcbiAgKSB7XG4gICAgYWZ0ZXJSZW5kZXIoKTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXByb3BlcnR5LWVkaXRvci1odG1sXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogU3VydmV5UHJvcGVydHlIdG1sRWRpdG9yID0gcGFyYW1zLm1vZGVsO1xuXG4gICAgICByZXR1cm4gbmV3IFByb3BlcnR5RWRpdG9ySFRNTFZpZXdNb2RlbChtb2RlbC5rb1ZhbHVlLCBtb2RlbC5yZWFkT25seSwgKCkgPT4ge1xuICAgICAgICB0eXBlb2YgcGFyYW1zLmFmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICBwYXJhbXMuYWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG5cbiAgICAgICAgdHlwZW9mIG1vZGVsLmtvQWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgIG1vZGVsLmtvQWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBzdHlsZT1cXFwibWFyZ2luLWJvdHRvbTozcHhcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Jc0xpc3QoKSAmJiBrb1Nob3dUZXh0VmlldygpXFxcIj5cXG4gICAgPGJ1dHRvbiBjbGFzcz1cXFwiYnRuIHN2LWJ0biBidG4tc20gYnRuLXhzXFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6IHsnYnRuLXByaW1hcnknOiBrb0FjdGl2ZVZpZXcoKSA9PT0gJ2Zvcm0nLCAnYnRuLWxpbmsnOiBrb0FjdGl2ZVZpZXcoKSAhPT0gJ2Zvcm0nfSwgY2xpY2s6Y2hhbmdlVG9Gb3JtVmlld0NsaWNrLCB0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ3BlLmZvcm1FbnRyeScpLCBhdHRyOiB7ICdhcmlhLWxhYmVsJzogJGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5mb3JtRW50cnknKSB9XFxcIj48L2J1dHRvbj5cXG4gICAgPGJ1dHRvbiBjbGFzcz1cXFwiYnRuIHN2LWJ0biBidG4tc20gYnRuLXhzXFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6IHsnYnRuLXByaW1hcnknOiBrb0FjdGl2ZVZpZXcoKSAhPT0gJ2Zvcm0nLCAnYnRuLWxpbmsnOiBrb0FjdGl2ZVZpZXcoKSA9PT0gJ2Zvcm0nfSwgY2xpY2s6Y2hhbmdlVG9UZXh0Vmlld0NsaWNrLCB0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ3BlLmZhc3RFbnRyeScpLCBhdHRyOiB7ICdhcmlhLWxhYmVsJzogJGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5mYXN0RW50cnknKSB9XFxcIj48L2J1dHRvbj5cXG48L2Rpdj5cXG48ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZToga29BY3RpdmVWaWV3KCkgPT0gJ2Zvcm0nXFxcIj5cXG4gICAgPHN2ZC1wcm9wZXJ0eS1lZGl0b3ItbmVzdGVkLWl0ZW1zIHBhcmFtcz1cXFwibW9kZWw6IG1vZGVsXFxcIj48L3N2ZC1wcm9wZXJ0eS1lZGl0b3ItbmVzdGVkLWl0ZW1zPlxcbjwvZGl2PlxcbjxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOmtvSXNMaXN0KCkgJiYga29BY3RpdmVWaWV3KCkgIT0gJ2Zvcm0nXFxcIj5cXG4gICAgPHRleHRhcmVhIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIGRhdGEtYmluZD1cXFwidGV4dElucHV0OiBrb0l0ZW1zVGV4dCwgZGlzYWJsZTogJGRhdGEucmVhZE9ubHlcXFwiXFxuICAgICAgICBzdHlsZT1cXFwib3ZlcmZsb3cteTogYXV0bzsgb3ZlcmZsb3cteDpoaWRkZW47IG1heC1oZWlnaHQ6NDAwcHg7IG1pbi1oZWlnaHQ6MjUwcHg7IHdpZHRoOjEwMCVcXFwiPjwvdGV4dGFyZWE+XFxuPC9kaXY+XCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vaXRlbS12YWx1ZXMuc2Nzc1wiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlJdGVtVmFsdWVzRWRpdG9yIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUl0ZW1WYWx1ZXNFZGl0b3JcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL2l0ZW0tdmFsdWVzLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVkaXRvckl0ZW1WYWx1ZXNWaWV3TW9kZWwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga29Jc0xpc3Q6IGFueSxcbiAgICBwdWJsaWMga29TaG93VGV4dFZpZXc6IGFueSxcbiAgICBwdWJsaWMga29BY3RpdmVWaWV3OiBhbnksXG4gICAgcHVibGljIGNoYW5nZVRvRm9ybVZpZXdDbGljazogYW55LFxuICAgIHB1YmxpYyBjaGFuZ2VUb1RleHRWaWV3Q2xpY2s6IGFueSxcbiAgICBwdWJsaWMgZ2V0TG9jU3RyaW5nOiBhbnksXG4gICAgcHVibGljIGtvSXRlbXNUZXh0OiBhbnksXG4gICAgcHVibGljIHJlYWRPbmx5OiBhbnksXG4gICAgcHVibGljIG1vZGVsOiBTdXJ2ZXlQcm9wZXJ0eUl0ZW1WYWx1ZXNFZGl0b3IsXG4gICAgcHVibGljIGFmdGVyUmVuZGVyOiBhbnlcbiAgKSB7XG4gICAgYWZ0ZXJSZW5kZXIoKTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXByb3BlcnR5LWVkaXRvci1pdGVtLXZhbHVlc1wiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgY29uc3QgbW9kZWw6IFN1cnZleVByb3BlcnR5SXRlbVZhbHVlc0VkaXRvciA9IHBhcmFtcy5tb2RlbDtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvckl0ZW1WYWx1ZXNWaWV3TW9kZWwoXG4gICAgICAgIG1vZGVsLmtvSXNMaXN0LFxuICAgICAgICBtb2RlbC5rb1Nob3dUZXh0VmlldyxcbiAgICAgICAgbW9kZWwua29BY3RpdmVWaWV3LFxuICAgICAgICBtb2RlbC5jaGFuZ2VUb0Zvcm1WaWV3Q2xpY2ssXG4gICAgICAgIG1vZGVsLmNoYW5nZVRvVGV4dFZpZXdDbGljayxcbiAgICAgICAgbW9kZWwuZ2V0TG9jU3RyaW5nLFxuICAgICAgICBtb2RlbC5rb0l0ZW1zVGV4dCxcbiAgICAgICAgbW9kZWwucmVhZE9ubHksXG4gICAgICAgIG1vZGVsLCAvL1RPRE8gYnJlYWsgb24gcHJvcHNcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBwYXJhbXMuYWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgcGFyYW1zLmFmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuXG4gICAgICAgICAgdHlwZW9mIG1vZGVsLmtvQWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgbW9kZWwua29BZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBkYXRhLWJpbmQ9XFxcImh0bWw6ICRkYXRhLmtvSHRtbFRvcFxcXCI+PC9kaXY+XFxuPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogXFxcInN2ZC1wcm9wZXJ0eS1lZGl0b3ItXFxcIiArIGVkaXRvclR5cGVUZW1wbGF0ZSwgcGFyYW1zOiB7IG1vZGVsOiBtb2RlbCwgYWZ0ZXJSZW5kZXI6IGFmdGVyUmVuZGVyIH0gfSAtLT48IS0tIC9rbyAtLT5cXG48ZGl2IGRhdGEtYmluZD1cXFwiaHRtbDogJGRhdGEua29IdG1sQm90dG9tXFxcIj48L2Rpdj5cXG5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9tb2RhbC1jb250ZW50LnNjc3NcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5TW9kYWxFZGl0b3JcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL21vZGFsLWNvbnRlbnQuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yTW9kYWxDb250ZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtvSHRtbFRvcDogYW55LFxuICAgIHB1YmxpYyBrb0h0bWxCb3R0b206IGFueSxcbiAgICBwdWJsaWMgZWRpdG9yVHlwZVRlbXBsYXRlOiBzdHJpbmcsXG4gICAgcHVibGljIG1vZGVsOiBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yLFxuICAgIHB1YmxpYyBhZnRlclJlbmRlcjogYW55XG4gICkge1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtcHJvcGVydHktZWRpdG9yLW1vZGFsLWNvbnRlbnRcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yID0gcGFyYW1zLm1vZGVsO1xuICAgICAgY29uc3QgYWZ0ZXJSZW5kZXIgPSBwYXJhbXMuYWZ0ZXJSZW5kZXI7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcGVydHlFZGl0b3JNb2RhbENvbnRlbnQoXG4gICAgICAgIG1vZGVsLmtvSHRtbFRvcCxcbiAgICAgICAgbW9kZWwua29IdG1sQm90dG9tLFxuICAgICAgICBtb2RlbC5lZGl0b3JUeXBlVGVtcGxhdGUsXG4gICAgICAgIG1vZGVsLCAvL1RPRE8gYnJlYWsgb24gcHJvcHMsXG4gICAgICAgIGFmdGVyUmVuZGVyXG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJpbnB1dC1ncm91cCBmb3JtLWdyb3VwXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6ISRkYXRhLmlzRWRpdGFibGVcXFwiPlxcbiAgPGFcXG4gICAgdGFiaW5kZXg9XFxcIjBcXFwiXFxuICAgIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiXFxuICAgIGRhdGEtYmluZD1cXFwia2V5MmNsaWNrLCBjbGljazogJGRhdGEub25TaG93TW9kYWwsIGF0dHI6IHsnZGF0YS10YXJnZXQnIDogbW9kYWxOYW1lVGFyZ2V0fVxcXCJcXG4gID5cXG4gICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiBrb1RleHRcXFwiPjwvc3Bhbj5cXG4gIDwvYT5cXG4gIDxkaXYgY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uXFxcIj5cXG4gICAgPHNwYW5cXG4gICAgICBjbGFzcz1cXFwiZ2x5cGhpY29uIGdseXBoaWNvbi1lZGl0XFxcIlxcbiAgICAgIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6ICRkYXRhLm9uU2hvd01vZGFsLCBhdHRyOiB7J2RhdGEtdGFyZ2V0JyA6IG1vZGFsTmFtZVRhcmdldH0sIHRleHQ6ICRkYXRhLmdldExvY1N0cmluZygncGUuZWRpdCcpXFxcIlxcbiAgICA+PC9zcGFuPlxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAgZm9ybS1ncm91cFxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiRkYXRhLmlzRWRpdGFibGVcXFwiPlxcbiAgPGlucHV0XFxuICAgIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgc3ZkX2VkaXRvcl9jb250cm9sXFxcIlxcbiAgICB0eXBlPVxcXCJ0ZXh0XFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcInZhbHVlOiBrb1ZhbHVlLCBkaXNhYmxlOiByZWFkT25seVxcXCJcXG4gIC8+XFxuICA8ZGl2IGNsYXNzPVxcXCJpbnB1dC1ncm91cC1hZGRvblxcXCI+XFxuICAgIDxzcGFuXFxuICAgICAgY2xhc3M9XFxcImdseXBoaWNvbiBnbHlwaGljb24tZWRpdFxcXCJcXG4gICAgICBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCJcXG4gICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiAkZGF0YS5vblNob3dNb2RhbCwgYXR0cjogeydkYXRhLXRhcmdldCcgOiBtb2RhbE5hbWVUYXJnZXR9LCB0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ3BlLmVkaXQnKVxcXCJcXG4gICAgPjwvc3Bhbj5cXG4gIDwvZGl2PlxcbjwvZGl2PlxcblxcbjxkaXYgZGF0YS1iaW5kPVxcXCJhdHRyOiB7aWQgOiBtb2RhbE5hbWV9XFxcIiBjbGFzcz1cXFwibW9kYWxcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICA8IS0ta28gaWY6IGtvSXNTaG93aW5nTW9kYWwgLS0+XFxuICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1kaWFsb2dcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1jb250ZW50XFxcIj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1iaW5kPVxcXCJjbGljazogb25SZXNldENsaWNrXFxcIj5cXG4gICAgICAgICAgJnRpbWVzO1xcbiAgICAgICAgPC9idXR0b24+XFxuICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6JGRhdGEua29UaXRsZUNhcHRpb25cXFwiPjwvaDQ+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPGRpdlxcbiAgICAgICAgY2xhc3M9XFxcIm1vZGFsLWJvZHkgc3ZkX25vdG9wYm90dG9tcGFkZGluZ3NcXFwiXFxuICAgICAgICBzdHlsZT1cXFwibWluLWhlaWdodDogMjAwcHg7XFxcIlxcbiAgICAgID5cXG4gICAgICAgIDxzdmQtcHJvcGVydHktZWRpdG9yLWVycm9yXFxuICAgICAgICAgIHBhcmFtcz1cXFwibW9kZWw6JGRhdGEubW9kZWxcXFwiXFxuICAgICAgICA+PC9zdmQtcHJvcGVydHktZWRpdG9yLWVycm9yPlxcbiAgICAgICAgPHN2ZC1wcm9wZXJ0eS1lZGl0b3ItbW9kYWwtY29udGVudFxcbiAgICAgICAgICBwYXJhbXM9XFxcIm1vZGVsOiAkZGF0YS5tb2RlbFxcXCJcXG4gICAgICAgID48L3N2ZC1wcm9wZXJ0eS1lZGl0b3ItbW9kYWwtY29udGVudD5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgPGlucHV0XFxuICAgICAgICAgIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICAgICAgY2xhc3M9XFxcImJ0biBzdi1idG4gYnRuLXByaW1hcnlcXFwiXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZTogJGRhdGEua29TaG93QXBwbHlCdXR0b24sIGRpc2FibGU6IHJlYWRPbmx5LCBjbGljazogJGRhdGEub25BcHBseUNsaWNrLCB2YWx1ZTogJGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5hcHBseScpXFxcIlxcbiAgICAgICAgICBzdHlsZT1cXFwid2lkdGg6IDEwMHB4O1xcXCJcXG4gICAgICAgIC8+XFxuICAgICAgICA8aW5wdXRcXG4gICAgICAgICAgdHlwZT1cXFwiYnV0dG9uXFxcIlxcbiAgICAgICAgICBjbGFzcz1cXFwiYnRuIHN2LWJ0biBidG4tZGVmYXVsdCBidG4tc2Vjb25kYXJ5XFxcIlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiAkZGF0YS5vbk9rQ2xpY2ssIGRpc2FibGU6IHJlYWRPbmx5LCB2YWx1ZTogJGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5vaycpXFxcIlxcbiAgICAgICAgICBzdHlsZT1cXFwid2lkdGg6IDEwMHB4O1xcXCJcXG4gICAgICAgIC8+XFxuICAgICAgICA8aW5wdXRcXG4gICAgICAgICAgdHlwZT1cXFwiYnV0dG9uXFxcIlxcbiAgICAgICAgICBjbGFzcz1cXFwiYnRuIHN2LWJ0biBidG4tcHJpbWFyeVxcXCJcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogJGRhdGEub25SZXNldENsaWNrLCB2YWx1ZTogJGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5jYW5jZWwnKVxcXCJcXG4gICAgICAgICAgc3R5bGU9XFxcIndpZHRoOiAxMDBweDtcXFwiXFxuICAgICAgICAvPlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gIDwvZGl2PlxcbiAgPCEtLSAva28gLS0+XFxuPC9kaXY+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vbW9kYWwuc2Nzc1wiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlNb2RhbEVkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlNb2RhbEVkaXRvclwiO1xuY29uc3QgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vbW9kYWwuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yTW9kYWxWaWV3TW9kZWwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaXNFZGl0YWJsZTogYm9vbGVhbixcbiAgICBwdWJsaWMgb25TaG93TW9kYWw6IGFueSxcbiAgICBwdWJsaWMgbW9kYWxOYW1lVGFyZ2V0OiBzdHJpbmcsXG4gICAgcHVibGljIGtvVGV4dDogYW55LFxuICAgIHB1YmxpYyBnZXRMb2NTdHJpbmc6IGFueSxcbiAgICBwdWJsaWMga29WYWx1ZToga28uT2JzZXJ2YWJsZTxhbnk+LFxuICAgIHB1YmxpYyByZWFkT25seTogYW55LFxuICAgIHB1YmxpYyBtb2RhbE5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMga29Jc1Nob3dpbmdNb2RhbDogYW55LFxuICAgIHB1YmxpYyBvblJlc2V0Q2xpY2s6IGFueSxcbiAgICBwdWJsaWMga29UaXRsZUNhcHRpb246IGFueSxcbiAgICBwdWJsaWMga29TaG93QXBwbHlCdXR0b246IGFueSxcbiAgICBwdWJsaWMgb25BcHBseUNsaWNrOiBhbnksXG4gICAgcHVibGljIG9uT2tDbGljazogYW55LFxuICAgIHB1YmxpYyBtb2RlbDogU3VydmV5UHJvcGVydHlNb2RhbEVkaXRvcixcbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXI6IGFueVxuICApIHtcbiAgICBhZnRlclJlbmRlcigpO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtcHJvcGVydHktZWRpdG9yLW1vZGFsXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogU3VydmV5UHJvcGVydHlNb2RhbEVkaXRvciA9IHBhcmFtcy5tb2RlbDtcbiAgICAgXG4gICAgICByZXR1cm4gbmV3IFByb3BlcnR5RWRpdG9yTW9kYWxWaWV3TW9kZWwoXG4gICAgICAgIG1vZGVsLmlzRWRpdGFibGUsXG4gICAgICAgIG1vZGVsLm9uU2hvd01vZGFsLFxuICAgICAgICBtb2RlbC5tb2RhbE5hbWVUYXJnZXQsXG4gICAgICAgIG1vZGVsLmtvVGV4dCxcbiAgICAgICAgbW9kZWwuZ2V0TG9jU3RyaW5nLFxuICAgICAgICBtb2RlbC5rb1ZhbHVlLFxuICAgICAgICBtb2RlbC5yZWFkT25seSxcbiAgICAgICAgbW9kZWwubW9kYWxOYW1lLFxuICAgICAgICBtb2RlbC5rb0lzU2hvd2luZ01vZGFsLFxuICAgICAgICBtb2RlbC5vblJlc2V0Q2xpY2ssXG4gICAgICAgIG1vZGVsLmtvVGl0bGVDYXB0aW9uLFxuICAgICAgICBtb2RlbC5rb1Nob3dBcHBseUJ1dHRvbixcbiAgICAgICAgbW9kZWwub25BcHBseUNsaWNrLFxuICAgICAgICBtb2RlbC5vbk9rQ2xpY2ssXG4gICAgICAgIG1vZGVsLCAvL1RPRE8gbmVlZCB0byBicmVhayBvbiBwcm9wcyxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBwYXJhbXMuYWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgIHBhcmFtcy5hZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcblxuICAgICAgICB0eXBlb2YgbW9kZWwua29BZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgbW9kZWwua29BZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBzdHlsZT1cXFwid2hpdGUtc3BhY2U6IG5vcm1hbFxcXCI+XFxuICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YToga29DYXRlZ29yaWVzLCBhczogJ2NhdCd9ICAtLT5cXG4gIDxkaXYgY2xhc3M9XFxcInN2ZC1sb2dpYy1pdGVtLWhlYWRlclxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBjYXQua29UaXRsZVZpc2libGVcXFwiPlxcbiAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IGNhdC5rb0NhdGVnb3J5KClcXFwiPjwvc3Bhbj5cXG4gIDwvZGl2PlxcbiAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IGNhdC5rb0l0ZW1zLCBhczogJ2l0ZW0nfSAgLS0+XFxuICA8ZGl2IGNsYXNzPVxcXCJzanMtY2Itd3JhcHBlclxcXCIgc3R5bGU9XFxcImRpc3BsYXk6IGlubGluZS1ibG9jaztcXFwiPlxcbiAgICA8bGFiZWw+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwic2pzLWNiLWNvbnRhaW5lclxcXCI+XFxuICAgICAgICA8aW5wdXRcXG4gICAgICAgICAgdHlwZT1cXFwiY2hlY2tib3hcXFwiXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwiYXR0cjoge3ZhbHVlOiBpdGVtLnZhbHVlfSwgY2hlY2tlZDogY2F0LmVkaXRvci5rb0VkaXRpbmdWYWx1ZVxcXCJcXG4gICAgICAgIC8+XFxuICAgICAgICA8c3BhblxcbiAgICAgICAgICBjbGFzcz1cXFwiY2hlY2ttYXJrXFxcIlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogY2F0LmVkaXRvci5nZXRCYWNrZ3JvdW5kQ2xzKGl0ZW0udmFsdWUpXFxcIlxcbiAgICAgICAgPlxcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2hlY2tcXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwvc3Bhbj5cXG4gICAgICAgIDxzcGFuXFxuICAgICAgICAgIGNsYXNzPVxcXCJzanMtY2ItbGFiZWxcXFwiXFxuICAgICAgICAgIHN0eWxlPVxcXCJwb3NpdGlvbjogc3RhdGljO1xcXCJcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBpdGVtLnRleHRcXFwiXFxuICAgICAgICA+PC9zcGFuPlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2xhYmVsPlxcbiAgPC9kaXY+XFxuICA8IS0tIC9rbyAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvZGl2PlxcblwiOyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuXG5pbXBvcnQgXCIuL211bHRpcGxlLXZhbHVlcy5zY3NzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eU11bHRpcGxlVmFsdWVzRWRpdG9yIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eU11bHRpcGxlVmFsdWVzRWRpdG9yXCI7XG5jb25zdCB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi9tdWx0aXBsZS12YWx1ZXMuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yTXVsdGlwbGVWYWx1ZXNWaWV3TW9kZWwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga29DYXRlZ29yaWVzOiBhbnksXG4gICAgcHVibGljIGNvbXBvbmVudEluZm86IGFueSxcbiAgICBwdWJsaWMga29BZnRlclJlbmRlcjogYW55LFxuICAgIHB1YmxpYyBhZnRlclJlbmRlcjogYW55XG4gICkge1xuICAgIGFmdGVyUmVuZGVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRldmlld01vZGVsKHBhcmFtcywgY29tcG9uZW50SW5mbykge1xuICBjb25zdCBtb2RlbDogU3VydmV5UHJvcGVydHlNdWx0aXBsZVZhbHVlc0VkaXRvciA9IHBhcmFtcy5tb2RlbDtcblxuICByZXR1cm4gbmV3IFByb3BlcnR5RWRpdG9yTXVsdGlwbGVWYWx1ZXNWaWV3TW9kZWwoXG4gICAgbW9kZWwua29DYXRlZ29yaWVzLFxuICAgIGNvbXBvbmVudEluZm8sXG4gICAgbW9kZWwua29BZnRlclJlbmRlcixcbiAgICAoKSA9PiB7XG4gICAgICB0eXBlb2YgcGFyYW1zLmFmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgcGFyYW1zLmFmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuXG4gICAgICB0eXBlb2YgbW9kZWwua29BZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgIG1vZGVsLmtvQWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG4gICAgfVxuICApO1xufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXByb3BlcnR5LWVkaXRvci1tdWx0aXBsZS12YWx1ZXNcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIHJldHVybiBjcmVhdGV2aWV3TW9kZWwocGFyYW1zLCBjb21wb25lbnRJbmZvKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtcHJvcGVydHktZWRpdG9yLW11bHRpcGxldmFsdWVzXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICByZXR1cm4gY3JlYXRldmlld01vZGVsKHBhcmFtcywgY29tcG9uZW50SW5mbyk7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjx0cj5cXG4gIDx0ZCBjbGFzcz1cXFwic3ZkLWl0ZW12YWx1ZS1hY3Rpb25zLWNvbnRhaW5lclxcXCI+XFxuICAgIDxkaXZcXG4gICAgICBjbGFzcz1cXFwic3ZkLWRyYWctaGFuZGxlIHN2ZC1pdGVtdmFsdWUtYWN0aW9uXFxcIlxcbiAgICAgIHRhYmluZGV4PVxcXCIwXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZTogISRkYXRhLmVkaXRvci5yZWFkT25seSgpLCBhdHRyOiB7ICdhcmlhLWxhYmVsJzogZWRpdG9yLmdldExvY1N0cmluZygncGUua2V5Ym9hcmRNb3ZlSXRlbXNUaXAnKSB9XFxcIlxcbiAgICA+XFxuICAgICAgPHNwYW4+XFxuICAgICAgICA8c3ZnLWljb25cXG4gICAgICAgICAgY2xhc3M9XFxcInN2ZC1wcmltYXJ5LWljb25cXFwiXFxuICAgICAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6IGRyYWdJY29uLCBzaXplOiAyMFxcXCJcXG4gICAgICAgID48L3N2Zy1pY29uPlxcbiAgICAgIDwvc3Bhbj5cXG4gICAgPC9kaXY+XFxuICAgIDxidXR0b25cXG4gICAgICB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgY2xhc3M9XFxcImJ0biBzdi1idG4gYnRuLWRlZmF1bHQgYnRuLXNlY29uZGFyeSBzdmQtdGV4dGl0ZW1zLWVkaXQgc3ZkLWl0ZW12YWx1ZS1hY3Rpb25cXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAkZGF0YS5rb0hhc0RldGFpbHMsIGNsaWNrOiBvbkVkaXRJdGVtQ2xpY2tcXFwiXFxuICAgID5cXG4gICAgICA8c3BhblxcbiAgICAgICAgY2xhc3M9XFxcImdseXBoaWNvbiBnbHlwaGljb24tZWRpdFxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwidGV4dDogZWRpdG9yLmdldExvY1N0cmluZygncGUuZWRpdCcpXFxcIlxcbiAgICAgID48L3NwYW4+XFxuICAgIDwvYnV0dG9uPlxcbiAgPC90ZD5cXG4gIDwhLS0ga28gZm9yZWFjaDogY2VsbHMgLS0+XFxuICA8dGQgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICA8c3ZkLXByb3BlcnR5LWVkaXRvclxcbiAgICAgIHBhcmFtcz1cXFwibW9kZWw6IG9iamVjdFByb3BlcnR5LmVkaXRvclxcXCJcXG4gICAgPjwvc3ZkLXByb3BlcnR5LWVkaXRvcj5cXG4gIDwvdGQ+XFxuICA8IS0tIC9rbyAtLT5cXG4gIDx0ZCBjbGFzcz1cXFwic3ZkLXRleHRpdGVtcy1jb2x1bW5cXFwiPlxcbiAgICA8ZGl2XFxuICAgICAgY2xhc3M9XFxcInN2ZC1pdGVtdmFsdWUtYWN0aW9uXFxcIlxcbiAgICAgIHRhYmluZGV4PVxcXCIwXFxcIlxcbiAgICAgIHJvbGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICBkYXRhLWJpbmQ9XFxcImtleTJjbGljaywgdmlzaWJsZTogZWRpdG9yLmtvQWxsb3dBZGRSZW1vdmVJdGVtcygpICYmIGtvQ2FuRGVsZXRlSXRlbSgpICYmICFlZGl0b3IucmVhZE9ubHkoKSwgY2xpY2s6IGVkaXRvci5vbkRlbGV0ZUNsaWNrLCBhdHRyOiB7J2FyaWEtbGFiZWwnOiBlZGl0b3IuZ2V0TG9jU3RyaW5nKCdwZS5kZWxldGUnKX1cXFwiXFxuICAgID5cXG4gICAgICA8c3Bhbj5cXG4gICAgICAgIDxzdmctaWNvblxcbiAgICAgICAgICBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCJcXG4gICAgICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogZGVsZXRlSWNvbiwgc2l6ZTogMjBcXFwiXFxuICAgICAgICA+PC9zdmctaWNvbj5cXG4gICAgICA8L3NwYW4+XFxuICAgIDwvZGl2PlxcbiAgPC90ZD5cXG48L3RyPlxcblwiOyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuXG5pbXBvcnQgXCIuL25lc3RlZC1pdGVtLnNjc3NcIjtcbmltcG9ydCB7IFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9ySXRlbSxcbiAgICBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvckVkaXRvckNlbGwgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5TmVzdGVkUHJvcGVydHlFZGl0b3JcIjtcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gXCIuLi9zdXJ2ZXlIZWxwZXJcIjtcblxuY29uc3QgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vbmVzdGVkLWl0ZW0uaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yTmVzdGVkSXRlbVZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlZGl0b3I6IGFueSxcbiAgICBwdWJsaWMgbW9kZWw6IFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9ySXRlbSxcbiAgICBwdWJsaWMga29DYW5EZWxldGVJdGVtOiBrby5PYnNlcnZhYmxlPGJvb2xlYW4+LFxuICAgIHB1YmxpYyBkcmFnSWNvbjogc3RyaW5nLFxuICAgIHB1YmxpYyBkZWxldGVJY29uOiBzdHJpbmcsXG4gICAgcHVibGljIG9iajogYW55LFxuICAgIHB1YmxpYyBrb0hhc0RldGFpbHM6IGFueSxcbiAgICByb290RWxlbWVudFxuICApIHtcbiAgICByb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMzggJiYgZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgU3VydmV5SGVscGVyLm1vdmVJdGVtSW5BcnJheShlZGl0b3Iub3JpZ2luYWxWYWx1ZSwgb2JqLFxuICAgICAgICAgICAgKGVkaXRvci5vcmlnaW5hbFZhbHVlLmluZGV4T2Yob2JqKSAtIDEgK1xuICAgICAgICAgICAgICBlZGl0b3Iub3JpZ2luYWxWYWx1ZS5sZW5ndGgpICUgZWRpdG9yLm9yaWdpbmFsVmFsdWUubGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gNDAgJiYgZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgU3VydmV5SGVscGVyLm1vdmVJdGVtSW5BcnJheShlZGl0b3Iub3JpZ2luYWxWYWx1ZSwgb2JqLFxuICAgICAgICAgICAgKGVkaXRvci5vcmlnaW5hbFZhbHVlLmluZGV4T2Yob2JqKSArIDEpICUgZWRpdG9yLm9yaWdpbmFsVmFsdWUubGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBjZWxscygpOiBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvckVkaXRvckNlbGxbXSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuY2VsbHM7XG4gIH1cblxuICBwdWJsaWMgb25FZGl0SXRlbUNsaWNrKCkge1xuICAgIHRoaXMuZWRpdG9yLm9uRWRpdEl0ZW1DbGljayh0aGlzLm1vZGVsKTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXByb3BlcnR5LWVkaXRvci1uZXN0ZWQtaXRlbVwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgY29uc3QgZWRpdG9yID0gcGFyYW1zLmVkaXRvcjtcbiAgICAgIGxldCBtb2RlbDogU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3JJdGVtO1xuXG4gICAgICBpZiAoZWRpdG9yLmNvbHVtbnMubGVuZ3RoID09PSAwKSBlZGl0b3IuY3JlYXRlQ29sdW1ucygpOyAvL1RPRE8gaG90IGZpeFxuXG4gICAgICBtb2RlbCA9IGVkaXRvci5jcmVhdGVJdGVtVmlld01vZGVsKHBhcmFtcy5pdGVtKTtcbiAgICAgIG1vZGVsW1wiZWRpdG9yXCJdID0gZWRpdG9yO1xuXG4gICAgICByZXR1cm4gbmV3IFByb3BlcnR5RWRpdG9yTmVzdGVkSXRlbVZpZXdNb2RlbChcbiAgICAgICAgZWRpdG9yLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgbW9kZWwua29DYW5EZWxldGVJdGVtLFxuICAgICAgICBtb2RlbC5kcmFnSWNvbixcbiAgICAgICAgbW9kZWwuZGVsZXRlSWNvbixcbiAgICAgICAgbW9kZWwub2JqLFxuICAgICAgICBtb2RlbC5rb0hhc0RldGFpbHMsXG4gICAgICAgIGNvbXBvbmVudEluZm8uZWxlbWVudC5uZXh0U2libGluZ1xuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Jc0xpc3RcXFwiPlxcbiAgPCEtLWtvIGlmOiBvcmlnaW5hbFZhbHVlLmxlbmd0aCA9PSAwIC0tPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmdldExvY1N0cmluZygncGUubGlzdElzRW1wdHknKVxcXCI+PC9kaXY+XFxuICA8IS0tIC9rbyAtLT5cXG4gIDxkaXZcXG4gICAgc3R5bGU9XFxcIm92ZXJmbG93LXk6IGF1dG87IG92ZXJmbG93LXg6IGhpZGRlbjsgbWF4LWhlaWdodDogNDAwcHg7XFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6b3JpZ2luYWxWYWx1ZS5sZW5ndGggPiAwXFxcIlxcbiAgPlxcbiAgICA8dGFibGUgY2xhc3M9XFxcInN2ZF9pdGVtc190YWJsZVxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICA8dGhlYWQgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBrb1Nob3dIZWFkZXJcXFwiPlxcbiAgICAgICAgPHRyPlxcbiAgICAgICAgICA8dGg+PC90aD5cXG4gICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBjb2x1bW5zIC0tPlxcbiAgICAgICAgICA8dGggZGF0YS1iaW5kPVxcXCJ0ZXh0OiB0ZXh0XFxcIj48L3RoPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPHRoPjwvdGg+XFxuICAgICAgICA8L3RyPlxcbiAgICAgIDwvdGhlYWQ+XFxuICAgICAgPHRib2R5IGRhdGEtYmluZD1cXFwic29ydGFibGU6IHsgZm9yZWFjaDogb3JpZ2luYWxWYWx1ZSwgb3B0aW9uczogc29ydGFibGVPcHRpb25zIH1cXFwiPlxcbiAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTpcXFwic3ZkLXByb3BlcnR5LWVkaXRvci1uZXN0ZWQtaXRlbVxcXCIsIHBhcmFtczogeyBpdGVtOiAkZGF0YSwgZWRpdG9yOiAkcGFyZW50Lm1vZGVsIH0gfSAtLT5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvdGJvZHk+XFxuICAgIDwvdGFibGU+XFxuICA8L2Rpdj5cXG4gIDxkaXZcXG4gICAgY2xhc3M9XFxcInN2ZC1pdGVtcy1jb250cm9sLWZvb3RlclxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBrb0FsbG93QWRkUmVtb3ZlSXRlbXMoKSAmJiAhJGRhdGEucmVhZE9ubHkoKVxcXCJcXG4gID5cXG4gICAgPGlucHV0XFxuICAgICAgdHlwZT1cXFwiYnV0dG9uXFxcIlxcbiAgICAgIGNsYXNzPVxcXCJidG4gc3YtYnRuIGJ0bi1wcmltYXJ5XFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29DYW5BZGRJdGVtLCBjbGljazogb25BZGRDbGljaywgdmFsdWU6ICRkYXRhLmFkZEl0ZW1UZXh0XFxcIlxcbiAgICAvPlxcbiAgICA8aW5wdXRcXG4gICAgICB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgY2xhc3M9XFxcImJ0biBzdi1idG4gYnRuLWRhbmdlclxcXCJcXG4gICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBvbkNsZWFyQ2xpY2ssIHZpc2libGU6IG9yaWdpbmFsVmFsdWUubGVuZ3RoID4gMCAmJiBrb0FsbG93UmVtb3ZlQWxsSXRlbXMoKSwgdmFsdWU6ICRkYXRhLmdldExvY1N0cmluZygncGUucmVtb3ZlQWxsJylcXFwiXFxuICAgIC8+XFxuICA8L2Rpdj5cXG48L2Rpdj5cXG48IS0tIGtvIGlmOiAha29Jc0xpc3QoKSAtLT5cXG48c3ZkLXByb3BlcnR5LWVkaXRvci1uZXN0ZWQgcGFyYW1zPVxcXCJtb2RlbDptb2RlbFxcXCI+PC9zdmQtcHJvcGVydHktZWRpdG9yLW5lc3RlZD5cXG48IS0tIC9rbyAtLT5cXG5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9uZXN0ZWQtaXRlbXMuc2Nzc1wiO1xuaW1wb3J0IHtcbiAgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3IsXG4gIFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9yQ29sdW1uLFxufSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5TmVzdGVkUHJvcGVydHlFZGl0b3JcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL25lc3RlZC1pdGVtcy5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JOZXN0ZWRJdGVtc1ZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrb0lzTGlzdDogYW55LFxuICAgIHB1YmxpYyBnZXRMb2NTdHJpbmc6IGFueSxcbiAgICBwdWJsaWMga29TaG93SGVhZGVyOiBhbnksXG4gICAgcHVibGljIGNvbHVtbnM6IFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9yQ29sdW1uW10sXG4gICAgcHVibGljIHNvcnRhYmxlT3B0aW9uczogYW55LFxuICAgIHB1YmxpYyBtb2RlbDogU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3IsXG4gICAgcHVibGljIGtvQWxsb3dBZGRSZW1vdmVJdGVtczoga28uT2JzZXJ2YWJsZTxib29sZWFuPixcbiAgICBwdWJsaWMgcmVhZE9ubHk6IGFueSxcbiAgICBwdWJsaWMgb25BZGRDbGljazogYW55LFxuICAgIHB1YmxpYyBvbkNsZWFyQ2xpY2s6IGFueSxcbiAgICBwdWJsaWMga29BbGxvd1JlbW92ZUFsbEl0ZW1zOiBrby5PYnNlcnZhYmxlPGJvb2xlYW4+LFxuICAgIHB1YmxpYyBrb0NhbkFkZEl0ZW06IGtvLk9ic2VydmFibGU8Ym9vbGVhbj4sXG4gICAgcHVibGljIGFkZEl0ZW1UZXh0OiBhbnksXG4gICAgcHVibGljIGFmdGVyUmVuZGVyOiBhbnlcbiAgKSB7XG4gICAgYWZ0ZXJSZW5kZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG9yaWdpbmFsVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwub3JpZ2luYWxWYWx1ZTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXByb3BlcnR5LWVkaXRvci1uZXN0ZWQtaXRlbXNcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvciA9IHBhcmFtcy5tb2RlbDtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvck5lc3RlZEl0ZW1zVmlld01vZGVsKFxuICAgICAgICBtb2RlbC5rb0lzTGlzdCxcbiAgICAgICAgbW9kZWwuZ2V0TG9jU3RyaW5nLFxuICAgICAgICBtb2RlbC5rb1Nob3dIZWFkZXIsXG4gICAgICAgIG1vZGVsLmNvbHVtbnMsXG4gICAgICAgIG1vZGVsLnNvcnRhYmxlT3B0aW9ucyxcbiAgICAgICAgbW9kZWwsIC8vVE9ETyBicmVhayBvbiBwcm9wcyxcbiAgICAgICAgbW9kZWwua29BbGxvd0FkZFJlbW92ZUl0ZW1zLFxuICAgICAgICBtb2RlbC5yZWFkT25seSxcbiAgICAgICAgbW9kZWwub25BZGRDbGljayxcbiAgICAgICAgbW9kZWwub25DbGVhckNsaWNrLFxuICAgICAgICBtb2RlbC5rb0FsbG93UmVtb3ZlQWxsSXRlbXMsXG4gICAgICAgIG1vZGVsLmtvQ2FuQWRkSXRlbSxcbiAgICAgICAgbW9kZWwuYWRkSXRlbVRleHQsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eXBlb2YgcGFyYW1zLmFmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHBhcmFtcy5hZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcblxuICAgICAgICAgIHR5cGVvZiBtb2RlbC5rb0FmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIG1vZGVsLmtvQWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgc3R5bGU9XFxcInBhZGRpbmctbGVmdDogMTBweDtcXFwiPlxcbiAgPGJ1dHRvblxcbiAgICB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgIGNsYXNzPVxcXCJidG4gc3YtYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBvblJldHVyblRvTGlzdENsaWNrXFxcIlxcbiAgPlxcbiAgICA8c3BhbiBjbGFzcz1cXFwiZ2x5cGhpY29uIGdseXBoaWNvbi1saXN0LWFsdFxcXCI+PC9zcGFuPlxcbiAgPC9idXR0b24+XFxuICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IGtvRWRpdG9yTmFtZVxcXCI+PC9zcGFuPlxcbiAgPHN2ZC1vYmplY3QtZWRpdG9yLWNvbnRlbnRcXG4gICAgcGFyYW1zPVxcXCJlbGVtZW50RWRpdG9yQ29udGVudDoga29FZGl0SXRlbSgpLml0ZW1FZGl0b3JcXFwiXFxuICA+PC9zdmQtb2JqZWN0LWVkaXRvci1jb250ZW50PlxcbjwvZGl2PlxcblwiOyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuXG5pbXBvcnQgXCIuL25lc3RlZC5zY3NzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlOZXN0ZWRQcm9wZXJ0eUVkaXRvclwiO1xuXG5jb25zdCB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi9uZXN0ZWQuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yTmVzdGVkVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIF9vblJldHVyblRvTGlzdENsaWNrOiBhbnksXG4gICAgcHVibGljIGtvRWRpdG9yTmFtZTogYW55LFxuICAgIHB1YmxpYyBrb0VkaXRJdGVtOiBhbnksXG4gICAgcHVibGljIG1vZGVsOiBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvcixcbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXI6IGFueVxuICApIHtcbiAgICBhZnRlclJlbmRlcigpO1xuICB9XG5cbiAgcHVibGljIG9uUmV0dXJuVG9MaXN0Q2xpY2soKSB7XG4gICAgdGhpcy5fb25SZXR1cm5Ub0xpc3RDbGljayh0aGlzLm1vZGVsKTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXByb3BlcnR5LWVkaXRvci1uZXN0ZWRcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvciA9IHBhcmFtcy5tb2RlbDtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvck5lc3RlZFZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwub25SZXR1cm5Ub0xpc3RDbGljayxcbiAgICAgICAgbW9kZWwua29FZGl0b3JOYW1lLFxuICAgICAgICBtb2RlbC5rb0VkaXRJdGVtLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBwYXJhbXMuYWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgcGFyYW1zLmFmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuXG4gICAgICAgICAgdHlwZW9mIG1vZGVsLmtvQWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgbW9kZWwua29BZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGlucHV0XFxuICBjbGFzcz1cXFwiZm9ybS1jb250cm9sIHN2ZC1jb250cm9sIHN2ZF9lZGl0b3JfY29udHJvbCBzdmQtZm9jdXNhYmxlXFxcIlxcbiAgdHlwZT1cXFwibnVtYmVyXFxcIlxcbiAgc3RlcD1cXFwiYW55XFxcIlxcbiAgZGF0YS1iaW5kPVxcXCJ2YWx1ZToga29WYWx1ZSwgZGlzYWJsZTogcmVhZE9ubHksIGF0dHI6IHttYXg6IGtvTWF4VmFsdWUsIG1pbjoga29NaW5WYWx1ZX1cXFwiXFxuICBzdHlsZT1cXFwid2lkdGg6IDEwMCVcXFwiXFxuLz5cXG5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9udW1iZXIuc2Nzc1wiO1xuaW1wb3J0IHsgU3VydmV5TnVtYmVyUHJvcGVydHlFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuY29uc3QgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vbnVtYmVyLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVkaXRvck51bWJlclZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrb1ZhbHVlOiBhbnksXG4gICAgcHVibGljIHJlYWRPbmx5OiBib29sZWFuLFxuICAgIHB1YmxpYyBrb01heFZhbHVlOiBhbnksXG4gICAgcHVibGljIGtvTWluVmFsdWU6IGFueSxcbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXI6IGFueVxuICApIHtcbiAgICBhZnRlclJlbmRlcigpO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtcHJvcGVydHktZWRpdG9yLW51bWJlclwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgY29uc3QgbW9kZWw6IFN1cnZleU51bWJlclByb3BlcnR5RWRpdG9yID0gcGFyYW1zLm1vZGVsO1xuXG4gICAgICByZXR1cm4gbmV3IFByb3BlcnR5RWRpdG9yTnVtYmVyVmlld01vZGVsKFxuICAgICAgICBtb2RlbC5rb1ZhbHVlLFxuICAgICAgICBtb2RlbC5yZWFkT25seSxcbiAgICAgICAgbW9kZWwua29NYXhWYWx1ZSxcbiAgICAgICAgbW9kZWwua29NaW5WYWx1ZSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBwYXJhbXMuYWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgcGFyYW1zLmFmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuXG4gICAgICAgICAgdHlwZW9mIG1vZGVsLmtvQWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgbW9kZWwua29BZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwicHJvcGVydHllZGl0b3ItdmFsaWRhdG9yc1xcXCI+XFxuICA8ZGl2IGNsYXNzPVxcXCJpbnB1dC1ncm91cCBmb3JtLWdyb3VwXFxcIj5cXG4gICAgPCEtLSBrbyBpZjoga29BdmFpbGFibGVDbGFzc2VzKCkubGVuZ3RoID09IDAgLS0+XFxuICAgIDxzcGFuXFxuICAgICAgY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uIGZpcnN0LWFkZG9uXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29BbGxvd0FkZFJlbW92ZUl0ZW1zKCkgJiYgIXJlYWRPbmx5KCksIGNsaWNrOiBvbkFkZENsaWNrXFxcIlxcbiAgICA+XFxuICAgICAgPHNwYW5cXG4gICAgICAgIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLXBsdXNcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiB0b2dnbGVDbGFzc2VzQ29udGFpbmVyXFxcIlxcbiAgICAgID48L3NwYW4+XFxuICAgIDwvc3Bhbj5cXG4gICAgPCEtLSAva28gIC0tPlxcbiAgICA8IS0tIGtvIGlmOiBrb0F2YWlsYWJsZUNsYXNzZXMoKS5sZW5ndGggPiAwIC0tPlxcbiAgICA8ZGl2XFxuICAgICAgY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uIGZpcnN0LWFkZG9uXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29BbGxvd0FkZFJlbW92ZUl0ZW1zKCkgJiYgIXJlYWRPbmx5KClcXFwiXFxuICAgID5cXG4gICAgICA8c3BhblxcbiAgICAgICAgY2xhc3M9XFxcImdseXBoaWNvbiBnbHlwaGljb24tcGx1cyBzdmQtbWFpbi1jb2xvclxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6IHRvZ2dsZUNsYXNzZXNDb250YWluZXJcXFwiXFxuICAgICAgPjwvc3Bhbj5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0gL2tvICAtLT5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6IFxcXCI+PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tY29udHJvbCBzdmRfY3VzdG9tX3NlbGVjdFxcXCI+XFxuICAgICAgPHNlbGVjdFxcbiAgICAgICAgb25tb3VzZXdoZWVsPVxcXCJyZXR1cm4gZmFsc2U7XFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJ2YWx1ZToga29TZWxlY3RlZCwgb3B0aW9uc0NhcHRpb246ICRkYXRhLmdldExvY1N0cmluZygncGUubGlzdElzRW1wdHknKVxcXCJcXG4gICAgICA+XFxuICAgICAgICA8IS0ta28gaWY6IG9yaWdpbmFsVmFsdWUubGVuZ3RoID09IDAgLS0+XFxuICAgICAgICA8b3B0aW9uXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwidmFsdWU6ICcnLCB0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ3BlLmxpc3RJc0VtcHR5JylcXFwiXFxuICAgICAgICA+PC9vcHRpb24+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogb3JpZ2luYWxWYWx1ZSAtLT5cXG4gICAgICAgIDxvcHRpb25cXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJ2YWx1ZTogJGRhdGEsIHRleHQ6ICRwYXJlbnQuZ2V0SXRlbVRleHQoJGRhdGEsICRwYXJlbnQua29DaGFuZ2VDb3VudGVyKCkpXFxcIlxcbiAgICAgICAgPjwvb3B0aW9uPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPC9zZWxlY3Q+XFxuICAgIDwvZGl2PlxcbiAgICA8c3BhblxcbiAgICAgIGNsYXNzPVxcXCJpbnB1dC1ncm91cC1hZGRvbiBidG4tZGFuZ2VyXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29BbGxvd0FkZFJlbW92ZUl0ZW1zLCBlbmFibGU6IGtvU2VsZWN0ZWQoKSAhPSBudWxsLCBjbGljazogb25EZWxldGVDbGlja1xcXCJcXG4gICAgPlxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZVxcXCI+PC9zcGFuPlxcbiAgICA8L3NwYW4+XFxuICA8L2Rpdj5cXG5cXG4gIDx1bCBjbGFzcz1cXFwic3ZkLWF2YWlsYWJsZS1jbGFzc2VzLWNvbnRhaW5lciBzdmQtbGlnaHQtYmctY29sb3JcXFwiIHRhYmluZGV4PVxcXCIwXFxcIj5cXG4gICAgPCEtLSBrbyBmb3JlYWNoOiBrb0F2YWlsYWJsZUNsYXNzZXMgLS0+XFxuICAgIDxsaT5cXG4gICAgICA8YVxcbiAgICAgICAgaHJlZj1cXFwiI1xcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6IGZ1bmN0aW9uKCkgeyRwYXJlbnQub25BZGRDbGljaygkZGF0YSk7ICRwYXJlbnQudG9nZ2xlQ2xhc3Nlc0NvbnRhaW5lcigpO31cXFwiXFxuICAgICAgPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiRkYXRhLnRleHRcXFwiPjwvc3Bhbj5cXG4gICAgICA8L2E+XFxuICAgIDwvbGk+XFxuICAgIDwhLS0gL2tvICAtLT5cXG4gIDwvdWw+XFxuXFxuICA8IS0tIGtvIGlmOiBzZWxlY3RlZE9iamVjdEVkaXRvcigpICE9IG51bGwgLS0+XFxuICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBcXFwic3ZkLW9iamVjdC1lZGl0b3ItY29udGVudFxcXCIsIHBhcmFtczogeyBlbGVtZW50RWRpdG9yQ29udGVudDogc2VsZWN0ZWRPYmplY3RFZGl0b3IoKSB9IH0gLS0+PCEtLSAva28gLS0+XFxuICA8IS0tIC9rbyAgLS0+XFxuPC9kaXY+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vb25lLXNlbGVjdGVkLnNjc3NcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5T25lU2VsZWN0ZWRFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5T25lU2VsZWN0ZWRFZGl0b3JcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnRFZGl0b3JDb250ZW50TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25FZGl0b3JzL3F1ZXN0aW9uRWRpdG9yXCI7XG5jb25zdCB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi9vbmUtc2VsZWN0ZWQuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yT25lU2VsZWN0ZWRWaWV3TW9kZWwge1xuICBwdWJsaWMgYXZhaWxhYmxlQ2xhc3Nlc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtvQXZhaWxhYmxlQ2xhc3NlczogYW55LFxuICAgIHB1YmxpYyBrb0FsbG93QWRkUmVtb3ZlSXRlbXM6IGtvLk9ic2VydmFibGU8Ym9vbGVhbj4sXG4gICAgcHVibGljIHJlYWRPbmx5OiBhbnksXG4gICAgcHVibGljIG9uQWRkQ2xpY2s6IGFueSxcbiAgICBwdWJsaWMga29TZWxlY3RlZDoga28uT2JzZXJ2YWJsZTxhbnk+LFxuICAgIHB1YmxpYyBnZXRMb2NTdHJpbmc6IGFueSxcbiAgICBwdWJsaWMgZ2V0SXRlbVRleHQ6IChpdGVtOiBhbnksIGNvdW50ZXI/OiBhbnkpID0+IGFueSxcbiAgICBwdWJsaWMga29DaGFuZ2VDb3VudGVyOiBrby5PYnNlcnZhYmxlPG51bWJlcj4sXG4gICAgcHVibGljIG1vZGVsOiBTdXJ2ZXlQcm9wZXJ0eU9uZVNlbGVjdGVkRWRpdG9yLFxuICAgIHB1YmxpYyBvbkRlbGV0ZUNsaWNrOiBhbnksXG4gICAgcHVibGljIGNvbXBvbmVudEluZm86IGFueSxcbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXI6IGFueVxuICApIHtcbiAgICBhZnRlclJlbmRlcigpO1xuICAgIHRoaXMuc2V0dXBBdmFpbGFibGVDbGFzc2VzQ29udGFpbmVyKGNvbXBvbmVudEluZm8uZWxlbWVudC5uZXh0U2libGluZyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9yaWdpbmFsVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5vcmlnaW5hbFZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZE9iamVjdEVkaXRvcigpOiBrby5PYnNlcnZhYmxlPFxuICAgIFN1cnZleUVsZW1lbnRFZGl0b3JDb250ZW50TW9kZWxcbiAgPiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuc2VsZWN0ZWRPYmplY3RFZGl0b3I7XG4gIH1cblxuICBwdWJsaWMgc2V0dXBBdmFpbGFibGVDbGFzc2VzQ29udGFpbmVyID0gKHJvb3RFbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGNsYXNzTmFtZTogc3RyaW5nID0gXCJzdmQtYXZhaWxhYmxlLWNsYXNzZXMtY29udGFpbmVyXCI7XG4gICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSByb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLlwiICsgY2xhc3NOYW1lKTtcblxuICAgIHRoaXMuYXZhaWxhYmxlQ2xhc3Nlc0NvbnRhaW5lciA9IGVsZW1lbnQ7XG4gICAgZWxlbWVudC5vbmZvY3VzID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5hdmFpbGFibGVDbGFzc2VzQ29udGFpbmVyLmNsYXNzTmFtZS5pbmRleE9mKFwiLS1hY3RpdmVcIikgIT09IC0xKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLnRvZ2dsZUNsYXNzZXNDb250YWluZXIoKTtcbiAgICB9O1xuICAgIGVsZW1lbnQub25ibHVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjAwOTQ3OTQvNjYyMzU1MVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmF2YWlsYWJsZUNsYXNzZXNDb250YWluZXIuY2xhc3NOYW1lLmluZGV4T2YoXCItLWFjdGl2ZVwiKSAhPT0gLTEgJiZcbiAgICAgICAgZXZlbnQucmVsYXRlZFRhcmdldCAmJlxuICAgICAgICAhZXZlbnQuY3VycmVudFRhcmdldFtcImNvbnRhaW5zXCJdKGV2ZW50LnJlbGF0ZWRUYXJnZXQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy50b2dnbGVDbGFzc2VzQ29udGFpbmVyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBldmVudC5yZWxhdGVkVGFyZ2V0ICYmIGV2ZW50LnJlbGF0ZWRUYXJnZXRbXCJmb2N1c1wiXSgpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgcHVibGljIHRvZ2dsZUNsYXNzZXNDb250YWluZXIoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuYXZhaWxhYmxlQ2xhc3Nlc0NvbnRhaW5lcjtcbiAgICBjb25zdCBjbGFzc05hbWU6IHN0cmluZyA9IFwic3ZkLWF2YWlsYWJsZS1jbGFzc2VzLWNvbnRhaW5lclwiO1xuICAgIGNvbnN0IGFjdGl2ZUNsYXNzTmFtZSA9IGNsYXNzTmFtZSArIFwiLS1hY3RpdmVcIjtcbiAgICBpZiAoZWxlbWVudC5jbGFzc05hbWUuaW5kZXhPZihhY3RpdmVDbGFzc05hbWUpICE9PSAtMSkge1xuICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICB0aGlzLmF2YWlsYWJsZUNsYXNzZXNDb250YWluZXIuYmx1cigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTmFtZSArIFwiIFwiICsgYWN0aXZlQ2xhc3NOYW1lO1xuICAgICAgdGhpcy5hdmFpbGFibGVDbGFzc2VzQ29udGFpbmVyLmZvY3VzKCk7XG4gICAgfVxuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtcHJvcGVydHktZWRpdG9yLW9uZS1zZWxlY3RlZFwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgY29uc3QgbW9kZWw6IFN1cnZleVByb3BlcnR5T25lU2VsZWN0ZWRFZGl0b3IgPSBwYXJhbXMubW9kZWw7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcGVydHlFZGl0b3JPbmVTZWxlY3RlZFZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwua29BdmFpbGFibGVDbGFzc2VzLFxuICAgICAgICBtb2RlbC5rb0FsbG93QWRkUmVtb3ZlSXRlbXMsXG4gICAgICAgIG1vZGVsLnJlYWRPbmx5LFxuICAgICAgICBtb2RlbC5vbkFkZENsaWNrLFxuICAgICAgICBtb2RlbC5rb1NlbGVjdGVkLFxuICAgICAgICBtb2RlbC5nZXRMb2NTdHJpbmcsXG4gICAgICAgIG1vZGVsLmdldEl0ZW1UZXh0LFxuICAgICAgICBtb2RlbC5rb0NoYW5nZUNvdW50ZXIsXG4gICAgICAgIG1vZGVsLCAvL1RPRE8gYnJlYWsgb24gcHJvcHNcbiAgICAgICAgbW9kZWwub25EZWxldGVDbGljayxcbiAgICAgICAgY29tcG9uZW50SW5mbyxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBwYXJhbXMuYWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgcGFyYW1zLmFmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuXG4gICAgICAgICAgdHlwZW9mIG1vZGVsLmtvQWZ0ZXJSZW5kZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgbW9kZWwua29BZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLSBrbyBpZjogc2hvd0Rpc3BsYXlOYW1lT25Ub3AgLS0+XFxuPGxhYmVsIGNsYXNzPVxcXCJzdmQtY29udHJvbC1sYWJlbFxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OmRpc3BsYXlOYW1lXFxcIj48L2xhYmVsPlxcbjwhLS0ga28gaWY6IGhlbHBUZXh0IC0tPlxcbjxhIGNsYXNzPVxcXCJzdmQtY29udHJvbC1sYWJlbFxcXCIgZGF0YS1iaW5kPVxcXCJjbGljazp0b2dnbGVTaG93SGVscFRleHRcXFwiXFxuICA+PGxhYmVsIGNsYXNzPVxcXCJwcm9wZXJ0eWVkaXRvci1oZWxwXFxcIiBzdHlsZT1cXFwiY3Vyc29yOiBoZWxwXFxcIj4oPyk8L2xhYmVsPjwvYVxcbj5cXG48ZGl2XFxuICBzdHlsZT1cXFwiZm9udC1zaXplOiBzbWFsbGVyOyBtYXJnaW46IDAgNnB4IDZweCAwXFxcIlxcbiAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOnNob3dIZWxwVGV4dCwgdGV4dDpoZWxwVGV4dFxcXCJcXG4+PC9kaXY+XFxuPCEtLSAva28gLS0+XFxuPCEtLSAva28gLS0+XFxuXFxuPHN2ZC1wcm9wZXJ0eS1lZGl0b3ItZXJyb3IgcGFyYW1zPVxcXCJtb2RlbDptb2RlbFxcXCI+PC9zdmQtcHJvcGVydHktZWRpdG9yLWVycm9yPlxcbjwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6IGNvbnRlbnRUZW1wbGF0ZU5hbWUsIHBhcmFtczogeyBtb2RlbDogbW9kZWwsIGFmdGVyUmVuZGVyOmFmdGVyUmVuZGVyIH0gfSAtLT48IS0tIC9rbyAtLT5cXG5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9wcm9wZXJ0eS1lZGl0b3Iuc2Nzc1wiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIH0gZnJvbSBcIi4uL3Byb3BlcnR5RWRpdG9ycy9wcm9wZXJ0eUVkaXRvckJhc2VcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL3Byb3BlcnR5LWVkaXRvci5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JWaWV3TW9kZWwge1xuICBwdWJsaWMgc2hvd0hlbHBUZXh0ID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gIHB1YmxpYyB0b2dnbGVTaG93SGVscFRleHQgPSAoKSA9PiB7XG4gICAgdGhpcy5zaG93SGVscFRleHQoIXRoaXMuc2hvd0hlbHBUZXh0KCkpO1xuICB9O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc2hvd0Rpc3BsYXlOYW1lT25Ub3A6IGJvb2xlYW4sXG4gICAgcHVibGljIGRpc3BsYXlOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIGNvbnRlbnRUZW1wbGF0ZU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgaGVscFRleHQ6IHN0cmluZyxcbiAgICBwdWJsaWMgbW9kZWw6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSxcbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXI6IGFueVxuICApIHt9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtcHJvcGVydHktZWRpdG9yXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlID0gcGFyYW1zLm1vZGVsO1xuICAgICAgY29uc3QgYWZ0ZXJSZW5kZXIgPSBwYXJhbXMuYWZ0ZXJSZW5kZXIgfHwgbW9kZWwua29BZnRlclJlbmRlcjtcbiAgICAgIHJldHVybiBuZXcgUHJvcGVydHlFZGl0b3JWaWV3TW9kZWwoXG4gICAgICAgIG1vZGVsLnNob3dEaXNwbGF5TmFtZU9uVG9wLFxuICAgICAgICBtb2RlbC5kaXNwbGF5TmFtZSxcbiAgICAgICAgbW9kZWwuY29udGVudFRlbXBsYXRlTmFtZSxcbiAgICAgICAgbW9kZWwucHJvcGVydHlIZWxwVGV4dCxcbiAgICAgICAgbW9kZWwsIC8vVE9ETyBzaG91bGQgdHJhbnNmb3JtIHRvIHNlcGFyYXRlIHBhcmFtc1xuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbywge1xuICAgICAgICAgICAgcHJvcGVydHk6IG1vZGVsLnByb3BlcnR5LFxuICAgICAgICAgICAgZWRpdG9yOiBtb2RlbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGZvcm0+XFxuICA8IS0tIGtvIGlmOiBrb0NvbnRlbnRFZGl0b3IoKSAhPSBudWxsIC0tPlxcbiAgPHN2ZC1vYmplY3QtZWRpdG9yLWNvbnRlbnRcXG4gICAgcGFyYW1zPVxcXCJlbGVtZW50RWRpdG9yQ29udGVudDoga29Db250ZW50RWRpdG9yKClcXFwiXFxuICA+PC9zdmQtb2JqZWN0LWVkaXRvci1jb250ZW50PlxcbiAgPCEtLSAva28gLS0+XFxuICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgPGxhYmVsIGZvcj1cXFwidGl0bGVOYW1lXFxcIj5cXG4gICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6JGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS50ZXN0U2VydmljZScpXFxcIj48L3NwYW4+XFxuICAgIDwvbGFiZWw+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tY29udHJvbCBzdmRfY3VzdG9tX3NlbGVjdFxcXCIgc3R5bGU9XFxcImRpc3BsYXk6IGJsb2NrO1xcXCI+XFxuICAgICAgPHNlbGVjdCBjbGFzcz1cXFwiIHN2ZC1mb2N1c2FibGVcXFwiXFxuICAgICAgICBvbm1vdXNld2hlZWw9XFxcInJldHVybiBmYWxzZTtcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcIm9wdGlvbnM6IHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLCBvcHRpb25zVGV4dDogJ3RleHQnLCBvcHRpb25zVmFsdWU6ICd2YWx1ZScsIG9wdGlvbnNDYXB0aW9uOiBxdWVzdGlvbi5vcHRpb25zQ2FwdGlvblxcXCJcXG4gICAgICA+PC9zZWxlY3Q+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuPC9mb3JtPlxcblwiOyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuXG5pbXBvcnQgXCIuL3Jlc3RmdWxsLnNjc3NcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5UmVzdWx0ZnVsbEVkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlSZXN0ZnVsbEVkaXRvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Ecm9wZG93biB9IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL3Jlc3RmdWxsLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVkaXRvclJlc3RmdWxsVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtvQ29udGVudEVkaXRvcjogYW55LFxuICAgIHB1YmxpYyBnZXRMb2NTdHJpbmc6IGFueSxcbiAgICBwdWJsaWMgcXVlc3Rpb246IFF1ZXN0aW9uRHJvcGRvd24sXG4gICAgcHVibGljIGNvbXBvbmVudEluZm86IGFueSxcbiAgICBwdWJsaWMga29BZnRlclJlbmRlcjogYW55LFxuICAgIHB1YmxpYyBhZnRlclJlbmRlcjogYW55XG4gICkge1xuICAgIGFmdGVyUmVuZGVyKCk7XG4gIH1cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1wcm9wZXJ0eS1lZGl0b3ItcmVzdGZ1bGxcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBTdXJ2ZXlQcm9wZXJ0eVJlc3VsdGZ1bGxFZGl0b3IgPSBwYXJhbXMubW9kZWw7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcGVydHlFZGl0b3JSZXN0ZnVsbFZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwua29Db250ZW50RWRpdG9yLFxuICAgICAgICBtb2RlbC5nZXRMb2NTdHJpbmcsXG4gICAgICAgIG1vZGVsLnF1ZXN0aW9uLFxuICAgICAgICBjb21wb25lbnRJbmZvLFxuICAgICAgICBtb2RlbC5rb0FmdGVyUmVuZGVyLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHlwZW9mIHBhcmFtcy5hZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBwYXJhbXMuYWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG5cbiAgICAgICAgICB0eXBlb2YgbW9kZWwua29BZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBtb2RlbC5rb0FmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8aW5wdXRcXG4gIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgc3ZkLWNvbnRyb2wgc3ZkX2VkaXRvcl9jb250cm9sIHN2ZC1mb2N1c2FibGVcXFwiXFxuICB0eXBlPVxcXCJ0ZXh0XFxcIlxcbiAgZGF0YS1iaW5kPVxcXCJ2YWx1ZToga29WYWx1ZSwgZGlzYWJsZTogcmVhZE9ubHksIGF0dHI6IHsgdHlwZToga29JbnB1dFR5cGUsIHBsYWNlaG9sZGVyOiBkZWZhdWx0VmFsdWUsIG1heExlbmd0aDoga29NYXhMZW5ndGgsICdhcmlhLWxhYmVsJzogKGtvRGlzcGxheUVycm9yKCkgPyBnZXRMb2NTdHJpbmcoJ2VkLnByb3BlcnR5RWRpdG9yRXJyb3InKSArICcgJyArIGtvRXJyb3JUZXh0KCkgOiAnJykgKyBkaXNwbGF5TmFtZSwgbGlzdDogbGlzdE5hbWUgfSwgZXZlbnQ6IHsga2V5ZG93bjpvbktleWRvd24gfVxcXCJcXG4gIHN0eWxlPVxcXCJ3aWR0aDogMTAwJVxcXCJcXG4gIGF1dG9mb2N1cz1cXFwiYXV0b2ZvY3VzXFxcIlxcbi8+XFxuPCEtLSBrbyBpZjogbGlzdE5hbWUgLS0+XFxuPGRhdGFsaXN0IGRhdGEtYmluZD1cXFwiYXR0cjogeyBpZDogbGlzdE5hbWV9XFxcIj5cXG4gIDwhLS0ga28gZm9yZWFjaDogZGF0YUxpc3QgLS0+XFxuICA8b3B0aW9uIGRhdGEtYmluZD1cXFwidmFsdWU6JGRhdGFcXFwiPjwvb3B0aW9uPlxcbiAgPCEtLSAva28gLS0+XFxuPC9kYXRhbGlzdD5cXG48IS0tIC9rbyAtLT5cXG5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9zdHJpbmcuc2Nzc1wiO1xuaW1wb3J0IHsgU3VydmV5U3RyaW5nUHJvcGVydHlFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuY29uc3QgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vc3RyaW5nLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVkaXRvclN0cmluZ1ZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrb1ZhbHVlOiBhbnksXG4gICAgcHVibGljIHJlYWRPbmx5OiBib29sZWFuLFxuICAgIHB1YmxpYyBrb0lucHV0VHlwZTogYW55LFxuICAgIHB1YmxpYyBkZWZhdWx0VmFsdWU6IGFueSxcbiAgICBwdWJsaWMga29NYXhMZW5ndGg6IGFueSxcbiAgICBwdWJsaWMgZGlzcGxheU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgbGlzdE5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgZGF0YUxpc3Q6IEFycmF5PHN0cmluZz4sXG4gICAgcHVibGljIGtvRGlzcGxheUVycm9yOiBhbnksXG4gICAgcHVibGljIGdldExvY1N0cmluZzogYW55LFxuICAgIHB1YmxpYyBrb0Vycm9yVGV4dDogYW55LFxuICAgIHB1YmxpYyBvbktleWRvd246IGFueSxcbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXI6ICgpID0+IHZvaWRcbiAgKSB7XG4gICAgYWZ0ZXJSZW5kZXIoKTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXByb3BlcnR5LWVkaXRvci1zdHJpbmdcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBTdXJ2ZXlTdHJpbmdQcm9wZXJ0eUVkaXRvciA9IHBhcmFtcy5tb2RlbDtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvclN0cmluZ1ZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwua29WYWx1ZSxcbiAgICAgICAgbW9kZWwucmVhZE9ubHksXG4gICAgICAgIG1vZGVsLmtvSW5wdXRUeXBlLFxuICAgICAgICBtb2RlbC5kZWZhdWx0VmFsdWUsXG4gICAgICAgIG1vZGVsLmtvTWF4TGVuZ3RoLFxuICAgICAgICBtb2RlbC5kaXNwbGF5TmFtZSxcbiAgICAgICAgbW9kZWwubGlzdE5hbWUsXG4gICAgICAgIG1vZGVsLnByb3BlcnR5LmRhdGFMaXN0LFxuICAgICAgICBtb2RlbC5rb0Rpc3BsYXlFcnJvcixcbiAgICAgICAgbW9kZWwuZ2V0TG9jU3RyaW5nLFxuICAgICAgICBtb2RlbC5rb0Vycm9yVGV4dCxcbiAgICAgICAgbW9kZWwub25JbnB1dEtleWRvd24sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eXBlb2YgcGFyYW1zLmFmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHBhcmFtcy5hZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcblxuICAgICAgICAgIHR5cGVvZiBtb2RlbC5rb0FmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIG1vZGVsLmtvQWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjx0ZXh0YXJlYVxcbiAgY2xhc3M9XFxcImZvcm0tY29udHJvbCBzdmQtY29udHJvbCBzdmRfZWRpdG9yX2NvbnRyb2wgc3ZkLWZvY3VzYWJsZVxcXCJcXG4gIGRhdGEtYmluZD1cXFwidmFsdWU6IGtvVGV4dFZhbHVlLCBkaXNhYmxlOiByZWFkT25seSwgYXR0cjogeyAnYXJpYS1sYWJlbCc6IChrb0Rpc3BsYXlFcnJvcigpID8gZ2V0TG9jU3RyaW5nKCdlZC5wcm9wZXJ0eUVkaXRvckVycm9yJykgKyAnICcgKyBrb0Vycm9yVGV4dCgpIDogJycpICsgZGlzcGxheU5hbWUgfSwgZXZlbnQ6IHsga2V5ZG93bjpvbktleWRvd24gfVxcXCJcXG4gIHN0eWxlPVxcXCJ3aWR0aDogMTAwJVxcXCJcXG4gIGF1dG9mb2N1cz1cXFwiYXV0b2ZvY3VzXFxcIlxcbiAgcm93czogN1xcbi8+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vc3RyaW5ncy5zY3NzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eVN0cmluZ3NFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5TW9kYWxFZGl0b3JcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL3N0cmluZ3MuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yU3RyaW5nc1ZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrb1RleHRWYWx1ZTogYW55LFxuICAgIHB1YmxpYyByZWFkT25seTogYm9vbGVhbixcbiAgICBwdWJsaWMgZGlzcGxheU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMga29EaXNwbGF5RXJyb3I6IGFueSxcbiAgICBwdWJsaWMga29FcnJvclRleHQ6IGFueSxcbiAgICBwdWJsaWMgb25LZXlkb3duOiBhbnksXG4gICAgcHVibGljIGFmdGVyUmVuZGVyOiAoKSA9PiB2b2lkXG4gICkge1xuICAgIGFmdGVyUmVuZGVyKCk7XG4gIH1cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1wcm9wZXJ0eS1lZGl0b3Itc3RyaW5nc1wiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgY29uc3QgbW9kZWw6IFN1cnZleVByb3BlcnR5U3RyaW5nc0VkaXRvciA9IHBhcmFtcy5tb2RlbDtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvclN0cmluZ3NWaWV3TW9kZWwoXG4gICAgICAgIG1vZGVsLmtvVGV4dFZhbHVlLFxuICAgICAgICBtb2RlbC5yZWFkT25seSxcbiAgICAgICAgbW9kZWwuZGlzcGxheU5hbWUsXG4gICAgICAgIG1vZGVsLmtvRGlzcGxheUVycm9yLFxuICAgICAgICBtb2RlbC5rb0Vycm9yVGV4dCxcbiAgICAgICAgbW9kZWwub25JbnB1dEtleWRvd24sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eXBlb2YgcGFyYW1zLmFmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHBhcmFtcy5hZnRlclJlbmRlci5jYWxsKG1vZGVsLCBjb21wb25lbnRJbmZvKTtcblxuICAgICAgICAgIHR5cGVvZiBtb2RlbC5rb0FmdGVyUmVuZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIG1vZGVsLmtvQWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcInNqcy1jYi13cmFwcGVyXFxcIj5cXG4gIDxsYWJlbCBjbGFzcz1cXFwic2pzLWNiLXN3aXRjaFxcXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwic2pzLWNiLXN3aXRjaF9fY29udGFpbmVyXFxcIj5cXG4gICAgICAgIDxpbnB1dCBjbGFzcz1cXFwiIHN2ZC1mb2N1c2FibGVcXFwiIHR5cGU9XFxcImNoZWNrYm94XFxcIiBkYXRhLWJpbmQ9XFxcImNoZWNrZWQ6IGtvVmFsdWUsIGRpc2FibGU6ICRkYXRhLnJlYWRPbmx5XFxcIi8+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzanMtY2Itc3dpdGNoX2NvbnRyb2xcXFwiPlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzanMtY2Itc3dpdGNoX19idXR0b25cXFwiPjwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPHNwYW4gY2xhc3M9XFxcInNqcy1jYi1zd2l0Y2hfX2xhYmVsXFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmRpc3BsYXlOYW1lXFxcIj48L3NwYW4+XFxuICA8L2xhYmVsPlxcbjwvZGl2PlwiOyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuXG5pbXBvcnQgXCIuL3N3aXRjaC5zY3NzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlTd2l0Y2hQcm9wZXJ0eUVkaXRvciB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlFZGl0b3JGYWN0b3J5XCI7XG5jb25zdCB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi9zd2l0Y2guaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yU3dpdGNoVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtvVmFsdWU6IGFueSxcbiAgICBwdWJsaWMgcmVhZE9ubHk6IGJvb2xlYW4sXG4gICAgcHVibGljIGRpc3BsYXlOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIGFmdGVyUmVuZGVyOiBhbnlcbiAgKSB7XG4gICAgYWZ0ZXJSZW5kZXIoKTtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXByb3BlcnR5LWVkaXRvci1zd2l0Y2hcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBTdXJ2ZXlTd2l0Y2hQcm9wZXJ0eUVkaXRvciA9IHBhcmFtcy5tb2RlbDtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUVkaXRvclN3aXRjaFZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwua29WYWx1ZSxcbiAgICAgICAgbW9kZWwucmVhZE9ubHksXG4gICAgICAgIG1vZGVsLmRpc3BsYXlOYW1lLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHlwZW9mIHBhcmFtcy5hZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBwYXJhbXMuYWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG5cbiAgICAgICAgICB0eXBlb2YgbW9kZWwua29BZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBtb2RlbC5rb0FmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8dGV4dGFyZWFcXG4gIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgc3ZkLWNvbnRyb2wgc3ZkLWZvY3VzYWJsZVxcXCJcXG4gIGRhdGEtYmluZD1cXFwidGV4dElucHV0OmtvVmFsdWUsIGRpc2FibGU6IHJlYWRPbmx5LCBhdHRyOiB7IHJvd3M6IGlzRGlwbGF5TmFtZVZpc2libGUgPyAnMicgOiAnNScsIG1heExlbmd0aDoga29NYXhMZW5ndGgsICdhcmlhLWxhYmVsJzogZGlzcGxheU5hbWUgfSwgZXZlbnQ6IHsgYmx1cjogb25CbHVyLCBmb2N1czogb25Gb2N1cywga2V5ZG93bjogb25LZXlkb3duIH1cXFwiXFxuICBzdHlsZT1cXFwid2lkdGg6IDEwMCU7IGhlaWdodDogYXV0bztcXFwiXFxuPjwvdGV4dGFyZWE+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vdGV4dC5zY3NzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eVRleHRFZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5TW9kYWxFZGl0b3JcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL3RleHQuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yVGV4dFZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrb1ZhbHVlOiBhbnksXG4gICAgcHVibGljIHJlYWRPbmx5OiBib29sZWFuLFxuICAgIHB1YmxpYyBpc0RpcGxheU5hbWVWaXNpYmxlOiBib29sZWFuLFxuICAgIHB1YmxpYyBrb01heExlbmd0aDogYW55LFxuICAgIHB1YmxpYyBkaXNwbGF5TmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyBvbkJsdXI6IGFueSxcbiAgICBwdWJsaWMgb25Gb2N1czogYW55LFxuICAgIHB1YmxpYyBvbktleWRvd246IGFueSxcbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXI6IGFueVxuICApIHtcbiAgICBhZnRlclJlbmRlcigpO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtcHJvcGVydHktZWRpdG9yLXRleHRcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBTdXJ2ZXlQcm9wZXJ0eVRleHRFZGl0b3IgPSBwYXJhbXMubW9kZWw7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvcGVydHlFZGl0b3JUZXh0Vmlld01vZGVsKFxuICAgICAgICBtb2RlbC5rb1ZhbHVlLFxuICAgICAgICBtb2RlbC5yZWFkT25seSxcbiAgICAgICAgbW9kZWwuaXNEaXBsYXlOYW1lVmlzaWJsZSxcbiAgICAgICAgbW9kZWwua29NYXhMZW5ndGgsXG4gICAgICAgIG1vZGVsLmRpc3BsYXlOYW1lLFxuICAgICAgICBtb2RlbC5vbkJsdXIsXG4gICAgICAgIG1vZGVsLm9uRm9jdXMsXG4gICAgICAgIG1vZGVsLm9uSW5wdXRLZXlkb3duLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHlwZW9mIHBhcmFtcy5hZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBwYXJhbXMuYWZ0ZXJSZW5kZXIuY2FsbChtb2RlbCwgY29tcG9uZW50SW5mbyk7XG5cbiAgICAgICAgICB0eXBlb2YgbW9kZWwua29BZnRlclJlbmRlciA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICBtb2RlbC5rb0FmdGVyUmVuZGVyLmNhbGwobW9kZWwsIGNvbXBvbmVudEluZm8pO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tIGtvIGlmOiB1c2VUYWJzSW5FbGVtZW50RWRpdG9yIC0tPlxcbjx1bCBjbGFzcz1cXFwibmF2IG5hdi10YWJzIG1vZGFsLXRhYnNcXFwiIGRhdGEtYmluZD1cXFwiZm9yZWFjaDoga29UYWJzXFxcIj5cXG4gIDxsaVxcbiAgICBjbGFzcz1cXFwibmF2LWl0ZW1cXFwiXFxuICAgIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJjc3M6IHthY3RpdmU6ICRwYXJlbnQuYWN0aXZlVGFiID09IG5hbWV9LCBjbGljazogJHBhcmVudC5vblRhYkNsaWNrXFxcIlxcbiAgPlxcbiAgICA8YSBjbGFzcz1cXFwibmF2LWxpbmtcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiB7YWN0aXZlOiAkcGFyZW50LmFjdGl2ZVRhYiA9PSBuYW1lfVxcXCI+XFxuICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OnRpdGxlXFxcIj48L3NwYW4+XFxuICAgIDwvYT5cXG4gIDwvbGk+XFxuPC91bD5cXG48IS0tIGtvIGZvcmVhY2g6IGtvVGFicyAtLT5cXG48ZGl2IGRhdGEtYmluZD1cXFwiaWY6ICRwYXJlbnQuYWN0aXZlVGFiID09PSBuYW1lXFxcIiBzdHlsZT1cXFwibWFyZ2luLXRvcDogNXB4O1xcXCI+XFxuICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBodG1sVGVtcGxhdGUsIHBhcmFtczogeyBtb2RlbDogdGVtcGxhdGVPYmplY3QsIGFmdGVyUmVuZGVyOiAkZGF0YS5rb0FmdGVyUmVuZGVyfSB9IC0tPjwhLS0gL2tvIC0tPlxcbjwvZGl2PlxcbjwhLS0gL2tvICAtLT5cXG48IS0tIC9rbyAgLS0+XFxuXFxuPCEtLSBrbyBpZm5vdDogdXNlVGFic0luRWxlbWVudEVkaXRvciAtLT5cXG48c3ZkLWFjY29yZGlvbiByb2xlPVxcXCJ0YWJsaXN0XFxcIiBwYXJhbXM9XFxcInRhYnM6IGtvVGFic1xcXCI+PC9zdmQtYWNjb3JkaW9uPlxcbjwhLS0gL2tvICAtLT5cXG5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9vYmplY3QtZWRpdG9yLWNvbnRlbnQuc2Nzc1wiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudEVkaXRvckNvbnRlbnRNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbkVkaXRvcnMvcXVlc3Rpb25FZGl0b3JcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL29iamVjdC1lZGl0b3ItY29udGVudC5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgT2JqZWN0RWRpdG9yQ29udGVudFZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB1c2VUYWJzSW5FbGVtZW50RWRpdG9yOiBhbnksXG4gICAgcHVibGljIGtvVGFiczogYW55LFxuICAgIHB1YmxpYyBrb0FjdGl2ZVRhYjogYW55LFxuICAgIHB1YmxpYyBvblRhYkNsaWNrOiBhbnlcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlVGFiKCkge1xuICAgIGNvbnN0IHRhYiA9IHRoaXMua29BY3RpdmVUYWIoKTtcbiAgICBpZiAodHlwZW9mIHRhYiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHRoaXMua29UYWJzKClbMF0ubmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHRhYjtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLW9iamVjdC1lZGl0b3ItY29udGVudFwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgbGV0IG1vZGVsOiBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsID0gcGFyYW1zLm1vZGVsO1xuXG4gICAgICBpZiAoIW1vZGVsICYmIHR5cGVvZiBwYXJhbXMuZWxlbWVudEVkaXRvckNvbnRlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBtb2RlbCA9IHBhcmFtcy5lbGVtZW50RWRpdG9yQ29udGVudCgpO1xuICAgICAgfSBlbHNlIGlmICghbW9kZWwpIHtcbiAgICAgICAgbW9kZWwgPSBwYXJhbXMuZWxlbWVudEVkaXRvckNvbnRlbnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgT2JqZWN0RWRpdG9yQ29udGVudFZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwudXNlVGFic0luRWxlbWVudEVkaXRvcixcbiAgICAgICAgbW9kZWwua29UYWJzLFxuICAgICAgICBtb2RlbC5rb0FjdGl2ZVRhYixcbiAgICAgICAgbW9kZWxbXCJvblRhYkNsaWNrXCJdIC8vVE9ETyB0aGUgcHJvcGVydHkgZG9lc24ndCBleGlzdCBpbiBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsIGJ1dCBleGlzdHMgaW4gU3VydmV5UXVlc3Rpb25FZGl0b3JcbiAgICAgICk7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjx0YWJsZSBjbGFzcz1cXFwidGFibGUgc3ZkX3RhYmxlLW5vd3JhcCBzdmRfcHJvcGVydGllc19ncmlkXFxcIj5cXG4gIDx0Ym9keSBkYXRhLWJpbmQ9XFxcImZvcmVhY2g6IGtvUHJvcGVydGllc1xcXCI+XFxuICAgIDx0ciBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvVmlzaWJsZSwgYXR0cjogeyAnZGF0YS1wcm9wZXJ0eSc6IG5hbWUgfVxcXCI+XFxuICAgICAgPHRkIHdpZHRoPVxcXCI1MCVcXFwiPlxcbiAgICAgICAgPHNwYW5cXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBkaXNwbGF5TmFtZSwgYXR0cjoge3RpdGxlOiB0aXRsZSB8fCBkaXNwbGF5TmFtZX1cXFwiXFxuICAgICAgICA+PC9zcGFuPlxcbiAgICAgIDwvdGQ+XFxuICAgICAgPHRkIGNsYXNzPVxcXCJzdmQtbGlnaHQtdGV4dC1jb2xvciBmb3JtLWdyb3VwXFxcIiB3aWR0aD1cXFwiNTAlXFxcIj5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJldmVudDogeyBrZXlkb3duOiAkZGF0YS5lZGl0b3Iua2V5RG93bkhhbmRsZXIgfVxcXCI+XFxuICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmVkaXRvci5pc01vZGFsIC0tPlxcbiAgICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBcXFwic3ZkLXByb3BlcnR5LWVkaXRvci1tb2RhbFxcXCIsIHBhcmFtczogeyBtb2RlbDogJGRhdGEuZWRpdG9yLCBhZnRlclJlbmRlcjogJHBhcmVudC5rb1RhYigpLmtvQWZ0ZXJSZW5kZXIgfSB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG5cXG4gICAgICAgICAgPCEtLSBrbyBpZm5vdDogJGRhdGEuZWRpdG9yLmlzTW9kYWwgLS0+XFxuICAgICAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6IFxcXCJzdmQtcHJvcGVydHktZWRpdG9yLVxcXCIgKyBlZGl0b3JUeXBlVGVtcGxhdGUsIHBhcmFtczogeyBtb2RlbDogJGRhdGEuZWRpdG9yLCBhZnRlclJlbmRlcjogJHBhcmVudC5rb1RhYigpLmtvQWZ0ZXJSZW5kZXIgfSB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvdGQ+XFxuICAgIDwvdHI+XFxuICA8L3Rib2R5PlxcbjwvdGFibGU+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vb2JqZWN0LWVkaXRvci1vbGQtdGFibGUtY29udGVudC5zY3NzXCI7XG5pbXBvcnQge1xuICBTdXJ2ZXlFbGVtZW50RWRpdG9yT2xkVGFibGVDb250ZW50TW9kZWwsXG4gIFN1cnZleUVsZW1lbnRFZGl0b3JUYWJNb2RlbCxcbn0gZnJvbSBcIi4uL3F1ZXN0aW9uRWRpdG9ycy9xdWVzdGlvbkVkaXRvclwiO1xuaW1wb3J0IHsgU3VydmV5T2JqZWN0UHJvcGVydHkgfSBmcm9tIFwiLi4vb2JqZWN0UHJvcGVydHlcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL29iamVjdC1lZGl0b3Itb2xkLXRhYmxlLWNvbnRlbnQuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIE9iamVjdEVkaXRvck9sZFRhYmxlQ29udGVudFZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrb1Byb3BlcnRpZXM6IGtvLk9ic2VydmFibGVBcnJheTxTdXJ2ZXlPYmplY3RQcm9wZXJ0eT4sXG4gICAgcHVibGljIGtvVGFiOiBrby5PYnNlcnZhYmxlPFN1cnZleUVsZW1lbnRFZGl0b3JUYWJNb2RlbD4sXG4gICAgY29tcG9uZW50SW5mbzogYW55XG4gICkge31cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1vYmplY3QtZWRpdG9yLW9sZC10YWJsZS1jb250ZW50XCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogU3VydmV5RWxlbWVudEVkaXRvck9sZFRhYmxlQ29udGVudE1vZGVsID0gcGFyYW1zLmVsZW1lbnRFZGl0b3JDb250ZW50KCk7XG4gICAgICByZXR1cm4gbmV3IE9iamVjdEVkaXRvck9sZFRhYmxlQ29udGVudFZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwua29Qcm9wZXJ0aWVzLFxuICAgICAgICBtb2RlbC5rb1RhYixcbiAgICAgICAgY29tcG9uZW50SW5mb1xuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdlxcbiAgY2xhc3M9XFxcInJvd1xcXCJcXG4gIGRhdGEtYmluZD1cXFwiY3NzOiAnc3ZkLXBvcHVwLWVkaXRvci10YWItJyArIG5hbWUsIGF0dHI6IHtpZDogJ2VkaXRvcl90YWJfaWRfJyArIG5hbWV9XFxcIlxcbj5cXG4gIDxkaXYgY2xhc3M9XFxcImNvbC1zbS0xMlxcXCI+XFxuICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBlZGl0b3JQcm9wZXJ0aWVzIH0gLS0+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgIDxkaXZcXG4gICAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29WaXNpYmxlLCBldmVudDogeyBrZXlkb3duOiBlZGl0b3Iua2V5RG93bkhhbmRsZXIgfSwgYXR0cjogeyAnZGF0YS1wcm9wZXJ0eSc6IHByb3BlcnR5Lm5hbWUgfVxcXCJcXG4gICAgICA+XFxuICAgICAgICA8c3ZkLXByb3BlcnR5LWVkaXRvclxcbiAgICAgICAgICBwYXJhbXM9XFxcInttb2RlbDogZWRpdG9yLCBhZnRlclJlbmRlcjogJHBhcmVudC5rb0FmdGVyUmVuZGVyUHJvcGVydHl9XFxcIlxcbiAgICAgICAgPjwvc3ZkLXByb3BlcnR5LWVkaXRvcj5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0gL2tvICAtLT5cXG4gIDwvZGl2PlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImFmdGVyUmVuZGVyUGFyZW50OiAkZGF0YS5hZnRlclJlbmRlclxcXCI+PC9kaXY+XFxuPC9kaXY+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vb2JqZWN0LWVkaXRvci10YWIuc2Nzc1wiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudEVkaXRvclRhYk1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uRWRpdG9ycy9xdWVzdGlvbkVkaXRvclwiO1xuaW1wb3J0IHsgU3VydmV5T2JqZWN0UHJvcGVydHkgfSBmcm9tIFwiLi4vb2JqZWN0UHJvcGVydHlcIjtcbmNvbnN0IHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL29iamVjdC1lZGl0b3ItdGFiLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RFZGl0b3JUYWJWaWV3TW9kZWwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyBlZGl0b3JQcm9wZXJ0aWVzOiBBcnJheTxTdXJ2ZXlPYmplY3RQcm9wZXJ0eT4sXG4gICAgcHVibGljIGtvQWZ0ZXJSZW5kZXJQcm9wZXJ0eTogYW55LFxuICAgIHB1YmxpYyBhZnRlclJlbmRlclxuICApIHt9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtb2JqZWN0LWVkaXRvci10YWJcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBTdXJ2ZXlFbGVtZW50RWRpdG9yVGFiTW9kZWwgPSBwYXJhbXMubW9kZWw7XG4gICAgICByZXR1cm4gbmV3IE9iamVjdEVkaXRvclRhYlZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwubmFtZSxcbiAgICAgICAgbW9kZWwuZWRpdG9yUHJvcGVydGllcyxcbiAgICAgICAgbW9kZWwua29BZnRlclJlbmRlclByb3BlcnR5LFxuICAgICAgICBtb2RlbC5rb0FmdGVyUmVuZGVyXG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZUh0bWwsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJzdmRfb2JqZWN0X2VkaXRvclxcXCI+XFxuICA8IS0tIGtvIGlmOiBrb0hhc09iamVjdCAtLT5cXG4gIDxkaXYgcm9sZT1cXFwidGFibGlzdFxcXCI+XFxuICAgIDwhLS0ga28gaWZub3Q6IGtvSXNPbGRUYWJsZUFwcGVhcmFuY2UoKSAtLT5cXG4gICAgPHN2ZC1vYmplY3QtZWRpdG9yLWNvbnRlbnRcXG4gICAgICBwYXJhbXM9XFxcImVsZW1lbnRFZGl0b3JDb250ZW50OiBrb0VsZW1lbnRFZGl0b3IoKVxcXCJcXG4gICAgPjwvc3ZkLW9iamVjdC1lZGl0b3ItY29udGVudD5cXG4gICAgPCEtLSAva28gLS0+XFxuXFxuICAgIDwhLS0ga28gaWY6IGtvSXNPbGRUYWJsZUFwcGVhcmFuY2UoKSAtLT5cXG4gICAgPHN2ZC1vYmplY3QtZWRpdG9yLW9sZC10YWJsZS1jb250ZW50XFxuICAgICAgcGFyYW1zPVxcXCJlbGVtZW50RWRpdG9yQ29udGVudDoga29FbGVtZW50RWRpdG9yKClcXFwiXFxuICAgID48L3N2ZC1vYmplY3QtZWRpdG9yLW9sZC10YWJsZS1jb250ZW50PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZGl2PlxcbiAgPCEtLSAva28gLS0+XFxuPC9kaXY+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vb2JqZWN0LWVkaXRvci5zY3NzXCI7XG5jb25zdCB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi9vYmplY3QtZWRpdG9yLmh0bWxcIik7XG5cbmltcG9ydCB7XG4gIFByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsLFxuICBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsLFxufSBmcm9tIFwiLi4vcXVlc3Rpb25FZGl0b3JzL3F1ZXN0aW9uRWRpdG9yXCI7XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RFZGl0b3JWaWV3TW9kZWwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga29Jc09sZFRhYmxlQXBwZWFyYW5jZToga28uT2JzZXJ2YWJsZTxib29sZWFuPixcbiAgICBwdWJsaWMga29FbGVtZW50RWRpdG9yOiBrby5PYnNlcnZhYmxlPFxuICAgICAgU3VydmV5RWxlbWVudEVkaXRvckNvbnRlbnRNb2RlbFxuICAgID4sXG4gICAgcHVibGljIGtvSGFzT2JqZWN0OiBrby5PYnNlcnZhYmxlPGJvb2xlYW4+XG4gICkge31cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1vYmplY3QtZWRpdG9yXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogUHJvcGVydHlHcmlkT2JqZWN0RWRpdG9yTW9kZWwgPSBwYXJhbXMubW9kZWw7XG4gICAgICByZXR1cm4gbmV3IE9iamVjdEVkaXRvclZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwua29Jc09sZFRhYmxlQXBwZWFyYW5jZSxcbiAgICAgICAgbW9kZWwua29FbGVtZW50RWRpdG9yLFxuICAgICAgICBtb2RlbC5rb0hhc09iamVjdFxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3ZkX3Byb3BlcnRpZXMgc3ZkLWxpZ2h0LWJvcmRlci1jb2xvciBzdmQtZGFyay1iZy1jb2xvclxcXCI+XFxuICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyXFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19yb3dcXFwiIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbFxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICAgIDxzdmQtZHJvcGRvd25cXG4gICAgICAgICAgY2xhc3M9XFxcInN2ZF9vYmplY3Rfc2VsZWN0b3Igc3ZkLWxpZ2h0LWJvcmRlci1jb2xvclxcXCJcXG4gICAgICAgICAgcGFyYW1zPVxcXCJpdGVtOiB7IGl0ZW1zOiBrb09iamVjdHMsIGFjdGlvbjoga29TZWxlY3RlZE9iamVjdCwgdGl0bGU6ICcnLCBvcHRpb25zVmFsdWU6IG51bGwsIGFyaWFMYWJlbDogZ2V0TG9jU3RyaW5nKCdlZC5jaG9vc2VFbGVtZW50JykgfSwgc2VsZWN0Mzoga29TZWxlY3RlZE9iamVjdFxcXCJcXG4gICAgICAgID48L3N2ZC1kcm9wZG93bj5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX3Jvd1xcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19jZWxsXFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbC1jb250ZW50LWhvbGRlclxcXCI+XFxuICAgICAgICAgIDxkaXZcXG4gICAgICAgICAgICBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbC1jb250ZW50IHN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX2NlbGwtY29udGVudC0tc2Nyb2xsYWJsZVxcXCJcXG4gICAgICAgICAgPlxcbiAgICAgICAgICAgIDxzdmQtb2JqZWN0LWVkaXRvclxcbiAgICAgICAgICAgICAgcGFyYW1zPVxcXCJtb2RlbDogcHJvcGVydHlHcmlkT2JqZWN0RWRpdG9yTW9kZWxcXFwiXFxuICAgICAgICAgICAgPjwvc3ZkLW9iamVjdC1lZGl0b3I+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vcHJvcGVydHktZ3JpZC5zY3NzXCI7XG5jb25zdCB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi9wcm9wZXJ0eS1ncmlkLmh0bWxcIik7XG5cbmltcG9ydCB7IFByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uRWRpdG9ycy9xdWVzdGlvbkVkaXRvclwiO1xuaW1wb3J0IHsgU3VydmV5Q3JlYXRvciB9IGZyb20gXCIuLi9lZGl0b3JcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gJy4uL2VkaXRvckxvY2FsaXphdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUdyaWRWaWV3TW9kZWwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga29PYmplY3RzOiBhbnksXG4gICAgcHVibGljIGtvU2VsZWN0ZWRPYmplY3Q6IGFueSxcbiAgICBwdWJsaWMgcHJvcGVydHlHcmlkT2JqZWN0RWRpdG9yTW9kZWw6IFByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsXG4gICkge31cbiAgcHVibGljIGdldExvY1N0cmluZyhzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKHN0cik7XG4gIH1cbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1wcm9wZXJ0eS1ncmlkXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBjb25zdCBjcmVhdG9yOiBTdXJ2ZXlDcmVhdG9yID0gcGFyYW1zLmNyZWF0b3I7XG4gICAgICByZXR1cm4gbmV3IFByb3BlcnR5R3JpZFZpZXdNb2RlbChcbiAgICAgICAgY3JlYXRvci5rb09iamVjdHMsXG4gICAgICAgIGNyZWF0b3Iua29TZWxlY3RlZE9iamVjdCxcbiAgICAgICAgY3JlYXRvci5wcm9wZXJ0eUdyaWRPYmplY3RFZGl0b3JNb2RlbFxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJpbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuXG5leHBvcnQgY2xhc3MgRWRpdGFibGVPYmplY3Qge1xuICBwdWJsaWMgc3RhdGljIGlzQ29weU9iamVjdChvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIW9iaiAmJiBvYmpbXCJpc0NvcHlcIl07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRTdXJ2ZXkob2JqZWN0OiBhbnkpOiBTdXJ2ZXkuU3VydmV5TW9kZWwge1xuICAgIGlmIChcbiAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFN1cnZleS5TdXJ2ZXlNb2RlbCB8fFxuICAgICAgKCEhb2JqZWN0ICYmICEhb2JqZWN0LmdldFR5cGUgJiYgb2JqZWN0LmdldFR5cGUoKSA9PSBcInN1cnZleVwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIEVkaXRhYmxlT2JqZWN0LmdldE9yaWdpbmFsU3VydmV5KG9iamVjdCk7XG4gICAgfVxuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdXJ2ZXkuTWF0cml4RHJvcGRvd25Db2x1bW4gJiYgISFvYmplY3QuY29sT3duZXIpXG4gICAgICByZXR1cm4gb2JqZWN0LmNvbE93bmVyW1wic3VydmV5XCJdO1xuICAgIGlmICghIW9iamVjdCkge1xuICAgICAgaWYgKCEhb2JqZWN0LnN1cnZleSlcbiAgICAgICAgcmV0dXJuIEVkaXRhYmxlT2JqZWN0LmdldE9yaWdpbmFsU3VydmV5KG9iamVjdC5zdXJ2ZXkpO1xuICAgICAgaWYgKCEhb2JqZWN0Lm93bmVyKSByZXR1cm4gRWRpdGFibGVPYmplY3QuZ2V0U3VydmV5KG9iamVjdC5vd25lcik7XG4gICAgICBpZiAoISFvYmplY3QuZXJyb3JPd25lcilcbiAgICAgICAgcmV0dXJuIEVkaXRhYmxlT2JqZWN0LmdldFN1cnZleShvYmplY3QuZXJyb3JPd25lcik7XG4gICAgICBpZiAoISFvYmplY3QubG9jT3duZXIpIHJldHVybiBFZGl0YWJsZU9iamVjdC5nZXRTdXJ2ZXkob2JqZWN0LmxvY093bmVyKTtcbiAgICB9XG4gICAgdmFyIG9yaWdpbmFsID0gRWRpdGFibGVPYmplY3QuZ2V0T3JpZ2luYWxPYmplY3Qob2JqZWN0KTtcbiAgICBpZiAoISFvcmlnaW5hbCAmJiBvcmlnaW5hbCAhPT0gb2JqZWN0KVxuICAgICAgcmV0dXJuIEVkaXRhYmxlT2JqZWN0LmdldFN1cnZleShvcmlnaW5hbCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRPcmlnaW5hbE9iamVjdChvYmplY3Q6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuICEhb2JqZWN0ICYmICEhb2JqZWN0W1wib3JpZ2luYWxPYmpcIl0gPyBvYmplY3RbXCJvcmlnaW5hbE9ialwiXSA6IG9iamVjdDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldE9yaWdpbmFsU3VydmV5KFxuICAgIHN1cnZleTogU3VydmV5LlN1cnZleU1vZGVsXG4gICk6IFN1cnZleS5TdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIEVkaXRhYmxlT2JqZWN0LmdldE9yaWdpbmFsT2JqZWN0KHN1cnZleSk7XG4gIH1cblxuICBwcml2YXRlIG9ialZhbHVlOiBTdXJ2ZXkuQmFzZTtcbiAgcHJpdmF0ZSBlZGl0YWJsZU9ialZhbHVlOiBTdXJ2ZXkuQmFzZTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKG9iajogU3VydmV5LkJhc2UpIHtcbiAgICB0aGlzLm9ialZhbHVlID0gb2JqO1xuICAgIHRoaXMuZWRpdGFibGVPYmpWYWx1ZSA9IHRoaXMuY3JlYXRlRWRpdGFibGVPYmooKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG9iaigpIHtcbiAgICByZXR1cm4gdGhpcy5vYmpWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRhYmxlT2JqKCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRhYmxlT2JqVmFsdWU7XG4gIH1cbiAgcHVibGljIGlzUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHByb3BlcnR5TmFtZSA9PSBcInBhZ2VzXCIpIHJldHVybiBmYWxzZTsgLy9XZSB1cGRhdGUgcGFnZXMgaW4gb3VyIG93biB3YXlcbiAgICByZXR1cm4gIVN1cnZleS5IZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoXG4gICAgICB0aGlzLm9ialtwcm9wZXJ0eU5hbWVdLFxuICAgICAgdGhpcy5lZGl0YWJsZU9ialtwcm9wZXJ0eU5hbWVdXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgYXBwbHkocHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAocHJvcGVydHlOYW1lID09IFwicGFnZXNcIikge1xuICAgICAgdGhpcy5hcHBseVBhZ2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1Byb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpKSByZXR1cm47XG4gICAgaWYgKFxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLm9ialtwcm9wZXJ0eU5hbWVdKSAmJlxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmVkaXRhYmxlT2JqW3Byb3BlcnR5TmFtZV0pXG4gICAgKSB7XG4gICAgICB2YXIgZGVzdCA9IHRoaXMub2JqW3Byb3BlcnR5TmFtZV07XG4gICAgICB2YXIgc3JjID0gdGhpcy5lZGl0YWJsZU9ialtwcm9wZXJ0eU5hbWVdO1xuICAgICAgZGVzdC5zcGxpY2UoMCwgZGVzdC5sZW5ndGgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGVzdC5wdXNoKHNyY1tpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub2JqW3Byb3BlcnR5TmFtZV0gPSB0aGlzLmVkaXRhYmxlT2JqW3Byb3BlcnR5TmFtZV07XG4gICAgfVxuICB9XG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLmFzc2lnblByb3BlcnRpZXModGhpcy5lZGl0YWJsZU9iaik7XG4gIH1cbiAgcHVibGljIGFwcGx5QWxsKGV4Y2x1ZGVkUHJvcHM6IEFycmF5PHN0cmluZz4gPSBbXSkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhleGNsdWRlZFByb3BzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFwcGx5KHByb3BzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0aWVzKGV4Y2x1ZGVkUHJvcHM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICB2YXIgbmV3SlNPTiA9IHRoaXMuZ2V0T2JqSnNvbih0aGlzLmVkaXRhYmxlT2JqKTtcbiAgICB2YXIgb2xkSlNPTiA9IHRoaXMuZ2V0T2JqSnNvbih0aGlzLm9iaik7XG4gICAgZm9yICh2YXIga2V5IGluIG5ld0pTT04pIHtcbiAgICAgIGlmIChleGNsdWRlZFByb3BzLmluZGV4T2Yoa2V5KSA+IC0xKSBjb250aW51ZTtcbiAgICAgIHByb3BzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgZm9yICh2YXIga2V5IGluIG9sZEpTT04pIHtcbiAgICAgIGlmIChleGNsdWRlZFByb3BzLmluZGV4T2Yoa2V5KSA+IC0xIHx8IHByb3BzLmluZGV4T2Yoa2V5KSA+IC0xKSBjb250aW51ZTtcbiAgICAgIHByb3BzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVFZGl0YWJsZU9iaigpOiBTdXJ2ZXkuQmFzZSB7XG4gICAgdmFyIHR5cGUgPSB0aGlzLm9iai5nZXRUeXBlKCk7XG4gICAgdmFyIHJlcyA9IDxTdXJ2ZXkuQmFzZT5TdXJ2ZXkuU2VyaWFsaXplci5jcmVhdGVDbGFzcyh0eXBlKTtcbiAgICBpZiAocmVzID09IG51bGwgJiYgdHlwZSA9PSBcInN1cnZleVwiKSB7XG4gICAgICByZXMgPSBuZXcgU3VydmV5LlN1cnZleSgpO1xuICAgIH1cbiAgICB0aGlzLmFzc2lnblByb3BlcnRpZXMocmVzKTtcbiAgICBpZiAodHlwZSA9PSBcIm1hdHJpeGRyb3Bkb3duY29sdW1uXCIpIHtcbiAgICAgIHJlc1tcImNvbE93bmVyXCJdID0gdGhpcy5vYmpbXCJjb2xPd25lclwiXTtcbiAgICB9XG4gICAgaWYgKHR5cGUgIT0gXCJzdXJ2ZXlcIikge1xuICAgICAgaWYgKCEhcmVzW1wic2V0U3VydmV5SW1wbFwiXSkge1xuICAgICAgICByZXNbXCJzZXRTdXJ2ZXlJbXBsXCJdKHRoaXMub2JqW1wic3VydmV5XCJdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghIXRoaXMub2JqW1wic3VydmV5XCJdICYmICFyZXNbXCJzdXJ2ZXlcIl0pIHtcbiAgICAgICAgICByZXNbXCJzdXJ2ZXlcIl0gPSB0aGlzLm9ialtcInN1cnZleVwiXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISF0aGlzLm9ialtcInBhcmVudFwiXSkge1xuICAgICAgcmVzW1wicGFyZW50XCJdID0gdGhpcy5vYmpbXCJwYXJlbnRcIl07XG4gICAgfVxuICAgIHJlc1tcImlzQ29weVwiXSA9IHRydWU7XG4gICAgcmVzW1wib3JpZ2luYWxPYmpcIl0gPSB0aGlzLm9iajtcbiAgICBpZiAocmVzLmdldFR5cGUoKSA9PSBcInN1cnZleVwiKSB7XG4gICAgICB2YXIgcGFnZXMgPSAoPGFueT5yZXMpLnBhZ2VzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYWdlc1tpXVtcIm9yaWdpbmFsT2JqXCJdID0gKDxhbnk+dGhpcy5vYmopLnBhZ2VzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgYXNzaWduUHJvcGVydGllcyhvYmo6IGFueSkge1xuICAgIG5ldyBTdXJ2ZXkuSnNvbk9iamVjdCgpLnRvT2JqZWN0KHRoaXMuZ2V0T2JqSnNvbigpLCBvYmopO1xuICB9XG4gIHByaXZhdGUgZ2V0T2JqSnNvbihvYmo6IGFueSA9IG51bGwpOiBhbnkge1xuICAgIGlmICghb2JqKSBvYmogPSB0aGlzLm9iajtcbiAgICB2YXIganNvbk9iaiA9IG5ldyBTdXJ2ZXkuSnNvbk9iamVjdCgpO1xuICAgIGpzb25PYmoubGlnaHRTZXJpYWxpemluZyA9IHRydWU7XG4gICAgcmV0dXJuIGpzb25PYmoudG9Kc29uT2JqZWN0KG9iaik7XG4gIH1cbiAgcHJpdmF0ZSBhcHBseVBhZ2VzKCkge1xuICAgIHZhciBlZGl0YWJsZVBhZ2VzID0gKDxhbnk+dGhpcy5lZGl0YWJsZU9iaikucGFnZXM7XG4gICAgdmFyIHBhZ2VzID0gKDxhbnk+dGhpcy5vYmopLnBhZ2VzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRpdGFibGVQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkaXRhYmxlUGFnZSA9IGVkaXRhYmxlUGFnZXNbaV07XG4gICAgICB2YXIgcGFnZSA9IGVkaXRhYmxlUGFnZXNbaV0ub3JpZ2luYWxPYmo7XG4gICAgICBpZiAoISFwYWdlKSB7XG4gICAgICAgIHBhZ2UubmFtZSA9IGVkaXRhYmxlUGFnZS5uYW1lO1xuICAgICAgICBwYWdlLnRpdGxlID0gZWRpdGFibGVQYWdlLnRpdGxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRpdGFibGVQYWdlLm9yaWdpbmFsT2JqID0gZWRpdGFibGVQYWdlO1xuICAgICAgICBwYWdlcy5zcGxpY2UoaSwgMCwgZWRpdGFibGVQYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzUGFnZU9yZGVyQ2hhZ25lZCgpKSByZXR1cm47XG4gICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHBhZ2VzKS5zcGxpY2UuY2FsbChwYWdlcywgMCwgcGFnZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkaXRhYmxlUGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpIDwgZWRpdGFibGVQYWdlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihwYWdlcykucHVzaC5jYWxsKFxuICAgICAgICAgIHBhZ2VzLFxuICAgICAgICAgIGVkaXRhYmxlUGFnZXNbaV0ub3JpZ2luYWxPYmpcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vc2VuZCBub3RpZmljYXRpb24gYWJvdXQgY2hhbmdlc1xuICAgICAgICBwYWdlcy5wdXNoKGVkaXRhYmxlUGFnZXNbaV0ub3JpZ2luYWxPYmopO1xuICAgICAgfVxuICAgIH1cbiAgICAoPGFueT50aGlzLm9iaikuY3VycmVudFBhZ2VObyA9IDA7XG4gIH1cbiAgcHJpdmF0ZSBpc1BhZ2VPcmRlckNoYWduZWQoKSB7XG4gICAgdmFyIGVkaXRhYmxlUGFnZXMgPSAoPGFueT50aGlzLmVkaXRhYmxlT2JqKS5wYWdlcztcbiAgICB2YXIgcGFnZXMgPSAoPGFueT50aGlzLm9iaikucGFnZXM7XG4gICAgaWYgKGVkaXRhYmxlUGFnZXMubGVuZ3RoICE9PSBwYWdlcy5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRpdGFibGVQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGVkaXRhYmxlUGFnZXNbaV0ub3JpZ2luYWxPYmogIT09IHBhZ2VzW2ldKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tIFwiLi4vZW50cmllc1wiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckZhY3RvcnlcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3IgfSBmcm9tIFwiLi9wcm9wZXJ0eU1vZGFsRWRpdG9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50U2VsZWN0b3IgfSBmcm9tIFwiLi9zdXJ2ZXlFbGVtZW50U2VsZWN0b3JcIjtcbmltcG9ydCB7IEVkaXRhYmxlT2JqZWN0IH0gZnJvbSBcIi4vZWRpdGFibGVPYmplY3RcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVByb3BlcnR5QmluZGluZ3NJdGVtIHtcbiAgcHJpdmF0ZSBlbGVtZW50U2VsZWN0b3JWYWx1ZTogU3VydmV5RWxlbWVudFNlbGVjdG9yO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgcHVibGljIGRpc3BsYXlOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBvYmo6IFN1cnZleS5CYXNlXG4gICkge31cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMuZWxlbWVudFNlbGVjdG9yID8gdGhpcy5lbGVtZW50U2VsZWN0b3Iua29WYWx1ZSgpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbDogc3RyaW5nKSB7XG4gICAgaWYgKCEhdGhpcy5lbGVtZW50U2VsZWN0b3IpIHtcbiAgICAgIHRoaXMuZWxlbWVudFNlbGVjdG9yLmtvVmFsdWUodmFsKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldEVsZW1lbnRTZWxlY3RvcihzdXJ2ZXk6IFN1cnZleS5TdXJ2ZXlNb2RlbCwgc2hvd1RpdGxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5lbGVtZW50U2VsZWN0b3JWYWx1ZSA9IG5ldyBTdXJ2ZXlFbGVtZW50U2VsZWN0b3IoXG4gICAgICBzdXJ2ZXksXG4gICAgICBcInF1ZXN0aW9uXCIsXG4gICAgICBzaG93VGl0bGVcbiAgICApO1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLm9ialtcImJpbmRpbmdzXCJdLmdldFZhbHVlTmFtZUJ5UHJvcGVydHlOYW1lKFxuICAgICAgdGhpcy5wcm9wZXJ0eS5uYW1lXG4gICAgKTtcbiAgICB0aGlzLmVsZW1lbnRTZWxlY3RvclZhbHVlLm9uVmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSAodmFsKSA9PiB7XG4gICAgICB0aGlzLm9ialtcImJpbmRpbmdzXCJdLnNldEJpbmRpbmcodGhpcy5wcm9wZXJ0eS5uYW1lLCB2YWwpO1xuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBlbGVtZW50U2VsZWN0b3IoKTogU3VydmV5RWxlbWVudFNlbGVjdG9yIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50U2VsZWN0b3JWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlCaW5kaW5nc0VkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3Ige1xuICBwdWJsaWMgaXRlbXM6IEFycmF5PFN1cnZleVByb3BlcnR5QmluZGluZ3NJdGVtPiA9IFtdO1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJiaW5kaW5nc1wiO1xuICB9XG4gIHB1YmxpYyBiZWZvcmVTaG93Q29yZSgpIHtcbiAgICBzdXBlci5iZWZvcmVTaG93Q29yZSgpO1xuICAgIGlmICghIXRoaXMub2JqZWN0KSB7XG4gICAgICB0aGlzLmZpbGxCaW5kaW5nSXRlbXMoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaWxsQmluZGluZ0l0ZW1zKCkge1xuICAgIGlmICghdGhpcy5vYmplY3QpIHJldHVybjtcbiAgICB2YXIgc3VydmV5ID0gRWRpdGFibGVPYmplY3QuZ2V0U3VydmV5KHRoaXMub2JqZWN0KTtcbiAgICBpZiAoIXN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBzaG93VGl0bGUgPSAhIXRoaXMub3B0aW9uc1xuICAgICAgPyB0aGlzLm9wdGlvbnMuc2hvd1RpdGxlc0luRXhwcmVzc2lvbnNcbiAgICAgIDogZmFsc2U7XG4gICAgdmFyIHByb3BzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSBuZXcgU3VydmV5UHJvcGVydHlCaW5kaW5nc0l0ZW0oXG4gICAgICAgIHByb3BzW2ldLFxuICAgICAgICB0aGlzLmdldFByb3BlcnR5RGlzcGxheU5hbWUocHJvcHNbaV0pLFxuICAgICAgICB0aGlzLm9iamVjdFxuICAgICAgKTtcbiAgICAgIGl0ZW0uc2V0RWxlbWVudFNlbGVjdG9yKHN1cnZleSwgc2hvd1RpdGxlKTtcbiAgICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgLy8vVE9ETyByZWZhY3RvciB1c2Ugb25seSB0aGlzLm9iamVjdC5iaW5kaW5ncy5nZXRQcm9wZXJ0aWVzKClcbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0aWVzKCk6IEFycmF5PFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgaWYgKCEhdGhpcy5vYmplY3QuYmluZGluZ3MuZ2V0UHJvcGVydGllcylcbiAgICAgIHJldHVybiB0aGlzLm9iamVjdC5iaW5kaW5ncy5nZXRQcm9wZXJ0aWVzKCk7XG4gICAgdmFyIG5hbWVzID0gdGhpcy5vYmplY3QuYmluZGluZ3MuZ2V0TmFtZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IFN1cnZleS5TZXJpYWxpemVyLmZpbmRQcm9wZXJ0eShcbiAgICAgICAgdGhpcy5vYmplY3QuZ2V0VHlwZSgpLFxuICAgICAgICBuYW1lc1tpXVxuICAgICAgKTtcbiAgICAgIGlmICghIXByb3ApIHJlcy5wdXNoKHByb3ApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcImJpbmRpbmdzXCIsIGZ1bmN0aW9uIChcbiAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHlcbik6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gIHJldHVybiBuZXcgU3VydmV5UHJvcGVydHlCaW5kaW5nc0VkaXRvcihwcm9wZXJ0eSk7XG59KTtcbiIsImltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvciB9IGZyb20gXCIuL3Byb3BlcnR5TmVzdGVkUHJvcGVydHlFZGl0b3JcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB9IGZyb20gXCIuL3Byb3BlcnR5RWRpdG9yQmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5IH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JGYWN0b3J5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tIFwiLi4vc3VydmV5SGVscGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eUNhbGN1bGF0ZWRWYWx1ZUVkaXRvciBleHRlbmRzIFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9yIHtcbiAgcHVibGljIHN0YXRpYyBWYWx1ZUJhc2VOYW1lID0gXCJ2YXJcIjtcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY2FsY3VsYXRlZC12YWx1ZXNcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm5lc3RlZC1pdGVtc1wiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFZGl0b3JOYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmtvRWRpdEl0ZW0oKSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHRoaXMua29FZGl0SXRlbSgpLm5hbWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld0l0ZW0oKTogYW55IHtcbiAgICByZXR1cm4gbmV3IFN1cnZleS5DYWxjdWxhdGVkVmFsdWUodGhpcy5nZXROZXdOYW1lKCkpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb2x1bW5zUHJvcGVydGllcygpOiBBcnJheTxTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIG5hbWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzTmFtZXMoXCJjYWxjdWxhdGVkdmFsdWVAaXRlbXNcIiwgW10pO1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnRpZXNCeU5hbWVzKFwiY2FsY3VsYXRlZHZhbHVlXCIsIG5hbWVzKTtcbiAgfVxuICBwcml2YXRlIGdldE5ld05hbWUoKTogc3RyaW5nIHtcbiAgICB2YXIgb2JqcyA9IFtdO1xuICAgIHZhciBpdGVtcyA9IHRoaXMub3JpZ2luYWxWYWx1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgaWYgKCEhaXRlbSkge1xuICAgICAgICBvYmpzLnB1c2goeyBuYW1lOiBpdGVtLm5hbWUgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuZ2V0TmV3TmFtZShcbiAgICAgIG9ianMsXG4gICAgICBTdXJ2ZXlQcm9wZXJ0eUNhbGN1bGF0ZWRWYWx1ZUVkaXRvci5WYWx1ZUJhc2VOYW1lXG4gICAgKTtcbiAgfVxufVxuXG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJFZGl0b3IoXCJjYWxjdWxhdGVkdmFsdWVzXCIsIGZ1bmN0aW9uKFxuICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuKTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgcmV0dXJuIG5ldyBTdXJ2ZXlQcm9wZXJ0eUNhbGN1bGF0ZWRWYWx1ZUVkaXRvcihwcm9wZXJ0eSk7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3IgfSBmcm9tIFwiLi9wcm9wZXJ0eU1vZGFsRWRpdG9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckJhc2VcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeSB9IGZyb20gXCIuL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlDZWxsc0VkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3Ige1xuICBrb1Jvd3M6IGFueTtcbiAga29Db2x1bW5zOiBhbnk7XG4gIGtvQ2FuRWRpdDogYW55O1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgICB0aGlzLmtvUm93cyA9IGtvLm9ic2VydmFibGVBcnJheSgpO1xuICAgIHRoaXMua29Db2x1bW5zID0ga28ub2JzZXJ2YWJsZUFycmF5KCk7XG4gICAgdGhpcy5rb0NhbkVkaXQgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWVUZXh0KHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciBzdHJOYW1lID0gIXZhbHVlID8gXCJlbXB0eVwiIDogXCJub3RFbXB0eVwiO1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0UHJvcGVydHlOYW1lSW5FZGl0b3Ioc3RyTmFtZSk7XG4gIH1cbiAgcHVibGljIGJlZm9yZVNob3dDb3JlKCkge1xuICAgIHN1cGVyLmJlZm9yZVNob3dDb3JlKCk7XG4gICAgdGhpcy5zZXR1cENlbGxzKCk7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY2VsbHNcIjtcbiAgfVxuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNCZWZvcmVTaG93Q2FsbGVkKSB7XG4gICAgICB0aGlzLnNldHVwQ2VsbHMoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBjYW5FZGl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoID4gMCAmJiB0aGlzLmNvbHVtbnMubGVuZ3RoID4gMDtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0ICYmIHRoaXMub2JqZWN0LnJvd3MgPyB0aGlzLm9iamVjdC5yb3dzIDogW107XG4gIH1cbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLm9iamVjdCAmJiB0aGlzLm9iamVjdC5jb2x1bW5zID8gdGhpcy5vYmplY3QuY29sdW1ucyA6IFtdO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDZWxsVGV4dChyb3dJbmRleDogbnVtYmVyLCBjb2x1bW5JbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAocm93SW5kZXggPCAwKSByZXR1cm4gdGhpcy5vYmplY3QuZ2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbkluZGV4KTtcbiAgICByZXR1cm4gdGhpcy5vYmplY3QuZ2V0Q2VsbFRleHQocm93SW5kZXgsIGNvbHVtbkluZGV4KTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0dXBDZWxscygpIHtcbiAgICB0aGlzLmtvUm93cyhbXSk7XG4gICAgdGhpcy5rb0NvbHVtbnMoW10pO1xuICAgIHRoaXMua29DYW5FZGl0KHRoaXMuY2FuRWRpdCk7XG4gICAgaWYgKCF0aGlzLmNhbkVkaXQpIHJldHVybjtcbiAgICB2YXIgY29scyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb2xzLnB1c2godGhpcy5jb2x1bW5zW2ldLnRleHQpO1xuICAgIH1cbiAgICB2YXIgcm93cyA9IFtdO1xuICAgIHJvd3MucHVzaChcbiAgICAgIHRoaXMuY3JlYXRlUm93KC0xLCBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGUuY2VsbHNEZWZhdWx0Um93XCIpKVxuICAgICk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJvd3MucHVzaCh0aGlzLmNyZWF0ZVJvdyhpLCB0aGlzLnJvd3NbaV0udGV4dCkpO1xuICAgIH1cbiAgICB0aGlzLmtvQ29sdW1ucyhjb2xzKTtcbiAgICB0aGlzLmtvUm93cyhyb3dzKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUm93KHJvd0luZGV4OiBudW1iZXIsIHJvd1RleHQ6IHN0cmluZyk6IGFueSB7XG4gICAgdmFyIHJvdyA9IHtcbiAgICAgIHJvd0luZGV4OiByb3dJbmRleCxcbiAgICAgIHJvd1RleHQ6IHJvd1RleHQsXG4gICAgICBrb0NlbGxzOiBrby5vYnNlcnZhYmxlQXJyYXkoKSxcbiAgICB9O1xuICAgIHZhciBjZWxscyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjZWxscy5wdXNoKHsgdGV4dDogdGhpcy5jcmVhdGVDZWxsVGV4dChyb3dJbmRleCwgaSkgfSk7XG4gICAgfVxuICAgIHJvdy5rb0NlbGxzKGNlbGxzKTtcbiAgICByZXR1cm4gcm93O1xuICB9XG4gIHByaXZhdGUgY3JlYXRlQ2VsbFRleHQocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB0ZXh0ID0ga28ub2JzZXJ2YWJsZSh0aGlzLmdldENlbGxUZXh0KHJvd0luZGV4LCBjb2xJbmRleCkpO1xuICAgIHZhciBjb2xWYWx1ZSA9IHRoaXMuY29sdW1uc1tjb2xJbmRleF0udmFsdWU7XG4gICAgdGV4dC5zdWJzY3JpYmUoZnVuY3Rpb24odmFsKSB7XG4gICAgICBpZiAocm93SW5kZXggPCAwKSBzZWxmLm9yaWdpbmFsVmFsdWUuc2V0RGVmYXVsdENlbGxUZXh0KGNvbFZhbHVlLCB2YWwpO1xuICAgICAgZWxzZSBzZWxmLm9yaWdpbmFsVmFsdWUuc2V0Q2VsbFRleHQocm93SW5kZXgsIGNvbFZhbHVlLCB2YWwpO1xuICAgIH0pO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59XG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJFZGl0b3IoXCJjZWxsc1wiLCBmdW5jdGlvbihcbiAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHlcbik6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gIHJldHVybiBuZXcgU3VydmV5UHJvcGVydHlDZWxsc0VkaXRvcihwcm9wZXJ0eSk7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5VGV4dEVkaXRvciB9IGZyb20gXCIuL3Byb3BlcnR5TW9kYWxFZGl0b3JcIjtcbmltcG9ydCB7XG4gIFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSxcbiAgSVN1cnZleU9iamVjdEVkaXRvck9wdGlvbnMsXG59IGZyb20gXCIuL3Byb3BlcnR5RWRpdG9yQmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5IH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JGYWN0b3J5XCI7XG5pbXBvcnQgeyBFZGl0YWJsZU9iamVjdCB9IGZyb20gXCIuL2VkaXRhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBFeHByZXNzaW9uVG9EaXNwbGF5VGV4dCB9IGZyb20gXCIuLi9leHByZXNzaW9uVG9EaXNwbGF5VGV4dFwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3IgfSBmcm9tIFwiLi9wcm9wZXJ0eURlZmF1bHRWYWx1ZUVkaXRvclwiO1xuaW1wb3J0ICogYXMgZWRpdG9yTG9jYWxpemF0aW9uIGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gXCIuLi9zdXJ2ZXlIZWxwZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQ29uZGl0aW9uRWRpdG9ySXRlbU93bmVyIHtcbiAgYWxsQ29uZGl0aW9uUXVlc3Rpb25zOiBhbnlbXTtcbiAgZ2V0UXVlc3Rpb25WYWx1ZUpTT04ocXVlc3Rpb25OYW1lOiBzdHJpbmcsIG9wZXJhdG9yOiBzdHJpbmcpOiBhbnk7XG4gIGdldFF1ZXN0aW9uQnlOYW1lKHF1ZXN0aW9uTmFtZSk6IFN1cnZleS5RdWVzdGlvbjtcbiAgb25Db25kaXRpb25JdGVtQ2hhbmdlZCgpO1xuICBpc0NsYXNzQ29udGFpbnMoXG4gICAgcVR5cGU6IHN0cmluZyxcbiAgICBjb250YWluczogQXJyYXk8c3RyaW5nPixcbiAgICBub3RDb250YWluczogQXJyYXk8c3RyaW5nPlxuICApOiBib29sZWFuO1xuICBpc1dpZGVNb2RlOiBib29sZWFuO1xuICBvcHRpb25zOiBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbkVkaXRvckl0ZW0ge1xuICBzdXJ2ZXk6IFN1cnZleS5TdXJ2ZXk7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb3duZXI6IElDb25kaXRpb25FZGl0b3JJdGVtT3duZXIpIHtcbiAgICB2YXIganNvbiA9IHtcbiAgICAgIHNob3dOYXZpZ2F0aW9uQnV0dG9uczogZmFsc2UsXG4gICAgICBzaG93UGFnZVRpdGxlczogZmFsc2UsXG4gICAgICBzaG93UXVlc3Rpb25OdW1iZXJzOiBcIm9mZlwiLFxuICAgICAgdGV4dFVwZGF0ZU1vZGU6IFwib25UeXBpbmdcIixcbiAgICAgIHJlcXVpcmVkVGV4dDogXCJcIixcbiAgICAgIHF1ZXN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJjb25qdW5jdGlvblwiLFxuICAgICAgICAgIHR5cGU6IFwiZHJvcGRvd25cIixcbiAgICAgICAgICB0aXRsZUxvY2F0aW9uOiBcImhpZGRlblwiLFxuICAgICAgICAgIHNob3dPcHRpb25zQ2FwdGlvbjogZmFsc2UsXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgY2hvaWNlczogW1wiYW5kXCIsIFwib3JcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInF1ZXN0aW9uTmFtZVwiLFxuICAgICAgICAgIHR5cGU6IFwiZHJvcGRvd25cIixcbiAgICAgICAgICB0aXRsZUxvY2F0aW9uOiBcImhpZGRlblwiLFxuICAgICAgICAgIHN0YXJ0V2l0aE5ld0xpbmU6IGZhbHNlLFxuICAgICAgICAgIGlzUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIm9wZXJhdG9yXCIsXG4gICAgICAgICAgdHlwZTogXCJkcm9wZG93blwiLFxuICAgICAgICAgIHRpdGxlTG9jYXRpb246IFwiaGlkZGVuXCIsXG4gICAgICAgICAgc3RhcnRXaXRoTmV3TGluZTogZmFsc2UsXG4gICAgICAgICAgc2hvd09wdGlvbnNDYXB0aW9uOiBmYWxzZSxcbiAgICAgICAgICBpc1JlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGVuYWJsZUlmOiBcIntxdWVzdGlvbk5hbWV9IG5vdGVtcHR5XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gICAgdGhpcy5zdXJ2ZXkgPSAhIW93bmVyLm9wdGlvbnNcbiAgICAgID8gb3duZXIub3B0aW9ucy5jcmVhdGVTdXJ2ZXkoanNvbiwgXCJjb25kaXRpb25FZGl0b3JcIilcbiAgICAgIDogbmV3IFN1cnZleS5TdXJ2ZXkoanNvbik7XG4gICAgdGhpcy5zdXJ2ZXkub25WYWx1ZUNoYW5nZWQuYWRkKChzZW5kZXIsIG9wdGlvbnMpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLm5hbWUgPT0gXCJxdWVzdGlvbk5hbWVcIikge1xuICAgICAgICB0aGlzLnJlYnVpbGRRdWVzdGlvblZhbHVlKCk7XG4gICAgICAgIHRoaXMuc2V0T3BlcmF0b3IoKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLm5hbWUgPT0gXCJvcGVyYXRvclwiKSB7XG4gICAgICAgIHRoaXMucmVidWlsZFF1ZXN0aW9uVmFsdWVPbk9wZXJhbmRDaGFuZ2luZygpO1xuICAgICAgfVxuICAgICAgdGhpcy5vd25lci5vbkNvbmRpdGlvbkl0ZW1DaGFuZ2VkKCk7XG4gICAgICB0aGlzLnVwZGF0ZU9wZXJhdG9yRW5hYmxlcygpO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0dXBTdXJ2ZXkoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvbmp1bmN0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3VydmV5VmFsdWUoXCJjb25qdW5jdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbmp1bmN0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRTdXJ2ZXlWYWx1ZShcImNvbmp1bmN0aW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBxdWVzdGlvbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdXJ2ZXlWYWx1ZShcInF1ZXN0aW9uTmFtZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0U3VydmV5VmFsdWUoXCJxdWVzdGlvbk5hbWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3VydmV5VmFsdWUoXCJvcGVyYXRvclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wZXJhdG9yKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRTdXJ2ZXlWYWx1ZShcIm9wZXJhdG9yXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdXJ2ZXlWYWx1ZShcInF1ZXN0aW9uVmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0U3VydmV5VmFsdWUoXCJxdWVzdGlvblZhbHVlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc0ZpcnN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5jb25qdW5jdGlvblF1ZXN0aW9uLmlzVmlzaWJsZTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzRmlyc3QodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5jb25qdW5jdGlvblF1ZXN0aW9uLnZpc2libGUgPSAhdmFsO1xuICAgIHRoaXMudXBkYXRlUXVlc3Rpb25zV2lkdGgoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5xdWVzdGlvbk5hbWUgJiZcbiAgICAgICghdGhpcy5pc1ZhbHVlUmVxdWlyZWQgfHwgIXRoaXMuc3VydmV5LmlzVmFsdWVFbXB0eSh0aGlzLnZhbHVlKSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY29uanVuY3Rpb25RdWVzdGlvbigpOiBTdXJ2ZXkuUXVlc3Rpb25Ecm9wZG93biB7XG4gICAgcmV0dXJuIDxTdXJ2ZXkuUXVlc3Rpb25Ecm9wZG93bj4oXG4gICAgICB0aGlzLnN1cnZleS5nZXRRdWVzdGlvbkJ5TmFtZShcImNvbmp1bmN0aW9uXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG5hbWVRdWVzdGlvbigpOiBTdXJ2ZXkuUXVlc3Rpb25Ecm9wZG93biB7XG4gICAgcmV0dXJuIDxTdXJ2ZXkuUXVlc3Rpb25Ecm9wZG93bj4oXG4gICAgICB0aGlzLnN1cnZleS5nZXRRdWVzdGlvbkJ5TmFtZShcInF1ZXN0aW9uTmFtZVwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBvcGVyYXRvclF1ZXN0aW9uKCk6IFN1cnZleS5RdWVzdGlvbkRyb3Bkb3duIHtcbiAgICByZXR1cm4gPFN1cnZleS5RdWVzdGlvbkRyb3Bkb3duPnRoaXMuc3VydmV5LmdldFF1ZXN0aW9uQnlOYW1lKFwib3BlcmF0b3JcIik7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZVF1ZXN0aW9uKCk6IFN1cnZleS5RdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LmdldFF1ZXN0aW9uQnlOYW1lKFwicXVlc3Rpb25WYWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaXNSZWFkeSkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHRleHQgPVxuICAgICAgXCJ7XCIgK1xuICAgICAgdGhpcy5nZXRRdWVzdGlvblZhbHVlQnlOYW1lKHRoaXMucXVlc3Rpb25OYW1lKSArXG4gICAgICBcIn0gXCIgK1xuICAgICAgdGhpcy5nZXRPcGVyYXRvclRleHQoKTtcbiAgICBpZiAodGhpcy5pc1ZhbHVlUmVxdWlyZWQpIHtcbiAgICAgIHRleHQgKz0gXCIgXCIgKyB0aGlzLmdldFZhbHVlVGV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuICBwcml2YXRlIGdldCBpc1ZhbHVlUmVxdWlyZWQoKSB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy52YWx1ZVF1ZXN0aW9uO1xuICAgIHJldHVybiAhIXF1ZXN0aW9uICYmICFxdWVzdGlvbi5pc1JlYWRPbmx5O1xuICB9XG4gIHByaXZhdGUgZ2V0TG9jU3RyaW5nKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5lZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKG5hbWUpO1xuICB9XG4gIHByaXZhdGUgc2V0dXBTdXJ2ZXkoKSB7XG4gICAgdmFyIHF1ZXN0aW9uQ29uanVuY3Rpb24gPSB0aGlzLmNvbmp1bmN0aW9uUXVlc3Rpb247XG4gICAgcXVlc3Rpb25Db25qdW5jdGlvbi5jaG9pY2VzWzBdLnRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInBlLmFuZFwiKTtcbiAgICBxdWVzdGlvbkNvbmp1bmN0aW9uLmNob2ljZXNbMV0udGV4dCA9IHRoaXMuZ2V0TG9jU3RyaW5nKFwicGUub3JcIik7XG4gICAgdmFyIHF1ZXN0aW9uTmFtZSA9IHRoaXMubmFtZVF1ZXN0aW9uO1xuICAgIHF1ZXN0aW9uTmFtZS5jaG9pY2VzID0gdGhpcy5nZXRDaG9pY2VzKHRoaXMub3duZXIuYWxsQ29uZGl0aW9uUXVlc3Rpb25zKTtcbiAgICBxdWVzdGlvbk5hbWUub3B0aW9uc0NhcHRpb24gPSB0aGlzLmdldExvY1N0cmluZyhcbiAgICAgIFwicGUuY29uZGl0aW9uU2VsZWN0UXVlc3Rpb25cIlxuICAgICk7XG4gICAgdGhpcy5vcGVyYXRvclF1ZXN0aW9uLmNob2ljZXMgPSB0aGlzLmdldENob2ljZXMoXG4gICAgICBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkuZ2V0T3BlcmF0b3JzKClcbiAgICApO1xuICAgIFN1cnZleVByb3BlcnR5RGVmYXVsdFZhbHVlRWRpdG9yLnVwZGF0ZVN1cnZleVN0eWxlKHRoaXMuc3VydmV5KTtcbiAgICB0aGlzLnJlYnVpbGRRdWVzdGlvblZhbHVlKCk7XG4gICAgdGhpcy5zdXJ2ZXkuZGF0YSA9IHsgb3BlcmF0b3I6IFwiZXF1YWxcIiwgY29uanVuY3Rpb246IFwiYW5kXCIgfTtcbiAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uc1dpZHRoKCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRTdXJ2ZXlWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5nZXRWYWx1ZShuYW1lKTtcbiAgfVxuICBwcml2YXRlIHNldFN1cnZleVZhbHVlKG5hbWU6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICB0aGlzLnN1cnZleS5zZXRWYWx1ZShuYW1lLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgcmVidWlsZFF1ZXN0aW9uVmFsdWUoKSB7XG4gICAgdGhpcy5zdXJ2ZXkuY2xlYXJWYWx1ZShcInF1ZXN0aW9uVmFsdWVcIik7XG4gICAgdmFyIGpzb24gPSB0aGlzLm93bmVyLmdldFF1ZXN0aW9uVmFsdWVKU09OKFxuICAgICAgdGhpcy5xdWVzdGlvbk5hbWUsXG4gICAgICB0aGlzLm9wZXJhdG9yXG4gICAgKTtcbiAgICBpZiAoIWpzb24pIHtcbiAgICAgIGpzb24gPSB7XG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgfTtcbiAgICB9XG4gICAganNvbi5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICBTdXJ2ZXlIZWxwZXIudXBkYXRlUXVlc3Rpb25Kc29uKGpzb24pO1xuICAgIGpzb24uZW5hYmxlSWYgPVxuICAgICAgXCJ7cXVlc3Rpb25OYW1lfSBub3RlbXB0eSBhbmQge29wZXJhdG9yfSAhPSAnZW1wdHknIGFuZCB7b3BlcmF0b3J9ICE9ICdub3RlbXB0eSdcIjtcbiAgICB2YXIgbmV3UXVlc3Rpb24gPSBTdXJ2ZXkuU2VyaWFsaXplci5jcmVhdGVDbGFzcyhqc29uLnR5cGUpO1xuICAgIGRlbGV0ZSBqc29uLnR5cGU7XG4gICAgbmV3IFN1cnZleS5Kc29uT2JqZWN0KCkudG9PYmplY3QoanNvbiwgbmV3UXVlc3Rpb24pO1xuICAgIGlmICghbmV3UXVlc3Rpb24pIHtcbiAgICAgIG5ld1F1ZXN0aW9uID0gU3VydmV5LlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoXCJ0ZXh0XCIsIGpzb24pO1xuICAgIH1cbiAgICB2YXIgb2xkUXVlc3Rpb24gPSB0aGlzLnZhbHVlUXVlc3Rpb247XG4gICAgaWYgKCEhb2xkUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuc3VydmV5LnBhZ2VzWzBdLnJlbW92ZUVsZW1lbnQob2xkUXVlc3Rpb24pO1xuICAgIH1cbiAgICBpZiAodGhpcy5jYW5TaG93UXVlc3Rpb25WYWx1ZSgpKSB7XG4gICAgICBuZXdRdWVzdGlvbi5uYW1lID0gXCJxdWVzdGlvblZhbHVlXCI7XG4gICAgICBuZXdRdWVzdGlvbi50aXRsZSA9IHRoaXMuZ2V0TG9jU3RyaW5nKFwicGUuY29uZGl0aW9uVmFsdWVRdWVzdGlvblRpdGxlXCIpO1xuICAgICAgbmV3UXVlc3Rpb24uZGVzY3JpcHRpb24gPSBcIlwiO1xuICAgICAgbmV3UXVlc3Rpb24udGl0bGVMb2NhdGlvbiA9IFwiZGVmYXVsdFwiO1xuICAgICAgbmV3UXVlc3Rpb24uaGFzQ29tbWVudCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuaXNLZWVwUXVlc3RvblZhbHVlT25TYW1lTGluZShuZXdRdWVzdGlvbi5nZXRUeXBlKCkpKSB7XG4gICAgICAgIG5ld1F1ZXN0aW9uLnRpdGxlTG9jYXRpb24gPSBcImhpZGRlblwiO1xuICAgICAgICBuZXdRdWVzdGlvbi5zdGFydFdpdGhOZXdMaW5lID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLnN1cnZleS5wYWdlc1swXS5hZGRFbGVtZW50KG5ld1F1ZXN0aW9uKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVRdWVzdGlvbnNXaWR0aCgpO1xuICB9XG4gIHByaXZhdGUgaXNLZWVwUXVlc3RvblZhbHVlT25TYW1lTGluZShxdWVzdGlvblR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5vd25lci5pc1dpZGVNb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMub3duZXIuaXNDbGFzc0NvbnRhaW5zKFxuICAgICAgcXVlc3Rpb25UeXBlLFxuICAgICAgW1widGV4dFwiLCBcImRyb3Bkb3duXCIsIFwicmF0aW5nXCIsIFwiYm9vbGVhblwiXSxcbiAgICAgIFtdXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlYnVpbGRRdWVzdGlvblZhbHVlT25PcGVyYW5kQ2hhbmdpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uTmFtZSkgcmV0dXJuO1xuICAgIHZhciBqc29uID0gdGhpcy5vd25lci5nZXRRdWVzdGlvblZhbHVlSlNPTihcbiAgICAgIHRoaXMucXVlc3Rpb25OYW1lLFxuICAgICAgdGhpcy5vcGVyYXRvclxuICAgICk7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy52YWx1ZVF1ZXN0aW9uO1xuICAgIGlmICghIXF1ZXN0aW9uICYmIHF1ZXN0aW9uLmlzUmVhZE9ubHkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXF1ZXN0aW9uIHx8ICghIWpzb24gJiYganNvbi50eXBlID09IHF1ZXN0aW9uLmdldFR5cGUoKSkpIHJldHVybjtcbiAgICB0aGlzLnJlYnVpbGRRdWVzdGlvblZhbHVlKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVRdWVzdGlvbnNXaWR0aCgpIHtcbiAgICB2YXIgaXNXaWRlID0gdGhpcy5vd25lci5pc1dpZGVNb2RlO1xuICAgIHZhciBwYWRkaW5nUmlnaHQgPSBpc1dpZGUgPyBcIjIwcHhcIiA6IFwiNXB4XCI7XG4gICAgdmFyIGlzVmFsdWVTYW1lTGluZSA9XG4gICAgICAhIXRoaXMudmFsdWVRdWVzdGlvbiAmJiAhdGhpcy52YWx1ZVF1ZXN0aW9uLnN0YXJ0V2l0aE5ld0xpbmU7XG5cbiAgICBpZiAoISF0aGlzLmNvbmp1bmN0aW9uUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuY29uanVuY3Rpb25RdWVzdGlvbi5taW5XaWR0aCA9IFwiNTBweFwiO1xuICAgICAgdGhpcy5jb25qdW5jdGlvblF1ZXN0aW9uLndpZHRoID0gdGhpcy5pc0ZpcnN0ID8gXCJcIiA6IFwiMTAwcHhcIjtcbiAgICAgIHRoaXMuY29uanVuY3Rpb25RdWVzdGlvbi5wYWRkaW5nUmlnaHQgPSBwYWRkaW5nUmlnaHQ7XG4gICAgfVxuXG4gICAgdGhpcy5uYW1lUXVlc3Rpb24ubWluV2lkdGggPSBcIjUwcHhcIjtcbiAgICB0aGlzLm5hbWVRdWVzdGlvbi53aWR0aCA9IGlzV2lkZVxuICAgICAgPyB0aGlzLmlzRmlyc3RcbiAgICAgICAgPyBcIjQwJVwiXG4gICAgICAgIDogXCIyNSVcIlxuICAgICAgOiB0aGlzLmlzRmlyc3RcbiAgICAgID8gXCI3MCVcIlxuICAgICAgOiBcIjQ1JVwiO1xuICAgIHRoaXMubmFtZVF1ZXN0aW9uLnBhZGRpbmdSaWdodCA9IHBhZGRpbmdSaWdodDtcblxuICAgIHRoaXMub3BlcmF0b3JRdWVzdGlvbi5taW5XaWR0aCA9IFwiNTBweFwiO1xuICAgIHRoaXMub3BlcmF0b3JRdWVzdGlvbi53aWR0aCA9IGlzV2lkZVxuICAgICAgPyBpc1ZhbHVlU2FtZUxpbmVcbiAgICAgICAgPyBcIjI1JVwiXG4gICAgICAgIDogXCI2MCVcIlxuICAgICAgOiBcIjMwJVwiO1xuICAgIHRoaXMub3BlcmF0b3JRdWVzdGlvbi5wYWRkaW5nUmlnaHQgPSBwYWRkaW5nUmlnaHQ7XG5cbiAgICBpZiAoISF0aGlzLnZhbHVlUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMudmFsdWVRdWVzdGlvbi5taW5XaWR0aCA9IFwiNTBweFwiO1xuICAgICAgdGhpcy52YWx1ZVF1ZXN0aW9uLndpZHRoID0gaXNWYWx1ZVNhbWVMaW5lID8gXCIzNSVcIiA6IFwiXCI7XG4gICAgICB0aGlzLnZhbHVlUXVlc3Rpb24ucGFkZGluZ1JpZ2h0ID0gcGFkZGluZ1JpZ2h0O1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNldE9wZXJhdG9yKCkge1xuICAgIHRoaXMub3BlcmF0b3IgPSBcImVxdWFsXCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDaG9pY2VzKGFycjogYW55W10pOiBBcnJheTxTdXJ2ZXkuSXRlbVZhbHVlPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChuZXcgU3VydmV5Lkl0ZW1WYWx1ZShhcnJbaV0ubmFtZSwgYXJyW2ldLnRleHQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGdldFF1ZXN0aW9uVmFsdWVCeU5hbWUocXVlc3Rpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMub3duZXIuZ2V0UXVlc3Rpb25CeU5hbWUocXVlc3Rpb25OYW1lKTtcbiAgICBpZiAoXG4gICAgICBxdWVzdGlvbiAmJlxuICAgICAgcXVlc3Rpb24ubmFtZSAhPSBxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKSAmJlxuICAgICAgcXVlc3Rpb25OYW1lICE9IHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gcXVlc3Rpb25OYW1lLnJlcGxhY2UocXVlc3Rpb24ubmFtZSwgcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkpO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25OYW1lO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVUZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHJldHVybiB2YWw7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiB0aGlzLnZhbFRvVGV4dCh2YWwpO1xuICAgIHZhciByZXMgPSBcIltcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzICs9IHRoaXMudmFsVG9UZXh0KHZhbFtpXSk7XG4gICAgICBpZiAoaSA8IHZhbC5sZW5ndGggLSAxKSByZXMgKz0gXCIsIFwiO1xuICAgIH1cbiAgICByZXMgKz0gXCJdXCI7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHZhbFRvVGV4dCh2YWw6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCA9PSBcInRydWVcIiB8fCB2YWwgPT0gXCJmYWxzZVwiKSByZXR1cm4gdmFsO1xuICAgIGlmICh0aGlzLmlzTnVtZXJpYyh2YWwpKSByZXR1cm4gdmFsO1xuICAgIGlmICh2YWxbMF0gPT0gXCJbXCIpIHJldHVybiB2YWwucmVwbGFjZSgvKD8hXikoWyddKSg/ISQpL2csIFwiXFxcXCQxXCIpO1xuICAgIGlmICghdGhpcy5pc1F1b3RlKHZhbFswXSkpIHZhbCA9IFwiJ1wiICsgdmFsO1xuICAgIGlmICghdGhpcy5pc1F1b3RlKHZhbFt2YWwubGVuZ3RoIC0gMV0pKSB2YWwgPSB2YWwgKyBcIidcIjtcbiAgICByZXR1cm4gdmFsLnJlcGxhY2UoLyg/IV4pKFsnXCJdKSg/ISQpL2csIFwiXFxcXCQxXCIpO1xuICB9XG4gIHByaXZhdGUgaXNOdW1lcmljKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgdmFsLmxlbmd0aCA+IDEgJiZcbiAgICAgIHZhbFswXSA9PT0gXCIwXCIgJiZcbiAgICAgIHZhbFsxXSAhPT0gXCJ4XCJcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICFpc05hTih2YWwpO1xuICB9XG4gIHByaXZhdGUgaXNRdW90ZShjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNoID09IFwiJ1wiIHx8IGNoID09ICdcIic7XG4gIH1cbiAgcHJpdmF0ZSBnZXRPcGVyYXRvclRleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgb3AgPSB0aGlzLm9wZXJhdG9yO1xuICAgIGlmIChvcCA9PSBcImVxdWFsXCIpIHJldHVybiBcIj1cIjtcbiAgICBpZiAob3AgPT0gXCJub3RlcXVhbFwiKSByZXR1cm4gXCI8PlwiO1xuICAgIGlmIChvcCA9PSBcImdyZWF0ZXJcIikgcmV0dXJuIFwiPlwiO1xuICAgIGlmIChvcCA9PSBcImxlc3NcIikgcmV0dXJuIFwiPFwiO1xuICAgIGlmIChvcCA9PSBcImdyZWF0ZXJvcmVxdWFsXCIpIHJldHVybiBcIj49XCI7XG4gICAgaWYgKG9wID09IFwibGVzc29yZXF1YWxcIikgcmV0dXJuIFwiPD1cIjtcbiAgICByZXR1cm4gb3A7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVPcGVyYXRvckVuYWJsZXMoKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uTmFtZSkgcmV0dXJuO1xuICAgIHZhciBqc29uID0gdGhpcy5vd25lci5nZXRRdWVzdGlvblZhbHVlSlNPTih0aGlzLnF1ZXN0aW9uTmFtZSwgXCJlcXVhbFwiKTtcbiAgICB2YXIgcVR5cGUgPSAhIWpzb24gPyBqc29uLnR5cGUgOiBudWxsO1xuICAgIHZhciBxdWVzdGlvbk9wZXJhdG9yID0gdGhpcy5vcGVyYXRvclF1ZXN0aW9uO1xuICAgIGlmICghcXVlc3Rpb25PcGVyYXRvcikgcmV0dXJuO1xuICAgIHZhciBjaG9pY2VzID0gcXVlc3Rpb25PcGVyYXRvci5jaG9pY2VzO1xuICAgIHZhciBpc0N1cnJlbnRPcGVyYXRvckVuYWJsZWQgPSB0cnVlO1xuICAgIHZhciBvcCA9IHRoaXMub3BlcmF0b3I7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaG9pY2VzW2ldLnNldElzRW5hYmxlZChcbiAgICAgICAgdGhpcy5pc09wZXJhdG9yRW5hYmxlZChxVHlwZSwgdGhpcy5nZXRPcGVyYXRvclR5cGUoY2hvaWNlc1tpXS52YWx1ZSkpXG4gICAgICApO1xuICAgICAgaWYgKGNob2ljZXNbaV0udmFsdWUgPT0gb3ApIHtcbiAgICAgICAgaXNDdXJyZW50T3BlcmF0b3JFbmFibGVkID0gY2hvaWNlc1tpXS5pc0VuYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNDdXJyZW50T3BlcmF0b3JFbmFibGVkKSB7XG4gICAgICB0aGlzLm9wZXJhdG9yID0gdGhpcy5nZXRGaXJzdEVuYWJsZWRPcGVyYXRvcihjaG9pY2VzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRGaXJzdEVuYWJsZWRPcGVyYXRvcihjaG9pY2VzOiBBcnJheTxTdXJ2ZXkuSXRlbVZhbHVlPik6IHN0cmluZyB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY2hvaWNlc1tpXS5pc0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIGNob2ljZXNbaV0udmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBcImVxdWFsXCI7XG4gIH1cbiAgcHJpdmF0ZSBjYW5TaG93UXVlc3Rpb25WYWx1ZSgpOiBib29sZWFuIHtcbiAgICB2YXIgcXVlc3Rpb25PcGVyYXRvciA9IHRoaXMub3BlcmF0b3JRdWVzdGlvbjtcbiAgICBpZiAoIXF1ZXN0aW9uT3BlcmF0b3IpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZU9wZXJhdG9yRW5hYmxlcygpO1xuICAgIHZhciBjaG9pY2VzID0gcXVlc3Rpb25PcGVyYXRvci5jaG9pY2VzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFjaG9pY2VzW2ldLmlzRW5hYmxlZCkgY29udGludWU7XG4gICAgICB2YXIgdmFsID0gY2hvaWNlc1tpXS52YWx1ZTtcbiAgICAgIGlmICh2YWwgIT09IFwiZW1wdHlcIiAmJiB2YWwgIT0gXCJub3RlbXB0eVwiKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgZ2V0T3BlcmF0b3JUeXBlKG9wZXJhdG9yOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgb3BlcmF0b3JzID0gU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LmdldE9wZXJhdG9ycygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3BlcmF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAob3BlcmF0b3JzW2ldLm5hbWUgPT0gb3BlcmF0b3IpIHJldHVybiBvcGVyYXRvcnNbaV0udHlwZXM7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPcGVyYXRvckVuYWJsZWQoXG4gICAgcVR5cGU6IHN0cmluZyxcbiAgICBvcGVyYXRvclR5cGVzOiBBcnJheTxzdHJpbmc+XG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghcVR5cGUpIHJldHVybiB0cnVlO1xuICAgIGlmICghb3BlcmF0b3JUeXBlcyB8fCBvcGVyYXRvclR5cGVzLmxlbmd0aCA9PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgY29udGFpbnMgPSBbXTtcbiAgICB2YXIgbm90Q29udGFpbnMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wZXJhdG9yVHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBuYW1lID0gb3BlcmF0b3JUeXBlc1tpXTtcbiAgICAgIGlmIChuYW1lWzBdID09IFwiIVwiKSB7XG4gICAgICAgIG5vdENvbnRhaW5zLnB1c2gobmFtZS5zdWJzdHIoMSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGFpbnMucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3duZXIuaXNDbGFzc0NvbnRhaW5zKHFUeXBlLCBjb250YWlucywgbm90Q29udGFpbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eUNvbmRpdGlvbkVkaXRvclxuICBleHRlbmRzIFN1cnZleVByb3BlcnR5VGV4dEVkaXRvclxuICBpbXBsZW1lbnRzIElDb25kaXRpb25FZGl0b3JJdGVtT3duZXIge1xuICBwdWJsaWMga29UZXh0VmFsdWU6IGFueTtcbiAgcHVibGljIG9uUmVtb3ZlQ29uZGl0aW9uQ2xpY2s6IGFueTtcbiAgcHVibGljIG9uQ2hhbmdlVmlld0NsaWNrOiBhbnk7XG4gIHB1YmxpYyBvblNob3dIaWRlRWRpdG9yOiBhbnk7XG4gIHB1YmxpYyBrb1Nob3dFeHByZXNzaW9uSGVhZGVyOiBhbnk7XG4gIHB1YmxpYyBrb1NldHVwVGV4dDogYW55O1xuICBwdWJsaWMga29TaG93VGFiczogYW55O1xuICBwdWJsaWMga29BY3RpdmVWaWV3OiBhbnk7XG4gIGtvRWRpdG9ySXRlbXM6IGtvLk9ic2VydmFibGVBcnJheTxDb25kaXRpb25FZGl0b3JJdGVtPjtcbiAga29DYW5BZGRJdGVtOiBhbnk7XG4gIGtvQ2FuUGFyc2VFeHByZXNzaW9uOiBhbnk7XG4gIGtvQ29uZGl0aW9uRGlzcGxheVRleHQ6IGFueTtcbiAga29Jc1RleHRDb25kaXRpb25WYWxpZDogYW55O1xuICBrb0lzRWRpdG9yU2hvd2luZzogYW55O1xuICBrb0lzV2lkZU1vZGU6IGFueTtcbiAga29Jc0VkaXRvckhpZGluZ0Rpc2FibGVkOiBhbnk7XG4gIHByaXZhdGUgYWRkQ29uZGl0aW9uUXVlc3Rpb25zSGFzaCA9IHt9O1xuICBwcml2YXRlIGFkZENvbmRpdGlvbkNhbGN1bGF0ZWRWYWx1ZXNIYXNoID0ge307XG4gIHByaXZhdGUgbWF4TG9naWNJdGVtc0luQ29uZGl0aW9uOiBudW1iZXIgPSAxMDA7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIHByaXZhdGUgX3R5cGU6IHN0cmluZyA9IFwiY29uZGl0aW9uXCIsXG4gICAgcHVibGljIHN5bnRheENoZWNrTWV0aG9kTmFtZTogc3RyaW5nID0gXCJjcmVhdGVDb25kaXRpb25cIlxuICApIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gICAgdGhpcy5rb1Nob3dUYWJzID0ga28ub2JzZXJ2YWJsZSh0cnVlKTtcbiAgICB0aGlzLmtvU2hvd0V4cHJlc3Npb25IZWFkZXIgPSBrby5vYnNlcnZhYmxlKHRydWUpO1xuICAgIHRoaXMua29TZXR1cFRleHQgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHRoaXMua29BY3RpdmVWaWV3ID0ga28ub2JzZXJ2YWJsZShcImZvcm1cIik7XG4gICAgdGhpcy5rb1RleHRWYWx1ZSA9IGtvLm9ic2VydmFibGUoKTtcbiAgICB0aGlzLmtvRWRpdG9ySXRlbXMgPSBrby5vYnNlcnZhYmxlQXJyYXk8Q29uZGl0aW9uRWRpdG9ySXRlbT4oW10pO1xuICAgIHRoaXMua29DYW5QYXJzZUV4cHJlc3Npb24gPSBrby5vYnNlcnZhYmxlKHRydWUpO1xuICAgIHRoaXMua29Db25kaXRpb25EaXNwbGF5VGV4dCA9IGtvLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghIXRoaXMua29WYWx1ZSgpKSByZXR1cm4gdGhpcy5nZXRDb25kaXRpb25EaXNwbGF5VGV4dCgpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicGUuZXhwcmVzc2lvbklzRW1wdHlcIik7XG4gICAgfSwgdGhpcyk7XG4gICAgdGhpcy5rb0lzV2lkZU1vZGUgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgICB0aGlzLmtvSXNFZGl0b3JTaG93aW5nID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gICAgdGhpcy5rb0lzRWRpdG9ySGlkaW5nRGlzYWJsZWQgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgICB0aGlzLm9uU2hvd0hpZGVFZGl0b3IgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5rb0lzRWRpdG9ySGlkaW5nRGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgdGhpcy5rb0lzRWRpdG9yU2hvd2luZyghdGhpcy5rb0lzRWRpdG9yU2hvd2luZygpKTtcbiAgICB9O1xuICAgIHRoaXMua29Jc1RleHRDb25kaXRpb25WYWxpZCA9IGtvLm9ic2VydmFibGUodHJ1ZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29DYW5QYXJzZUV4cHJlc3Npb24uc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgaWYgKG5ld1ZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICBzZWxmLmtvQWN0aXZlVmlldyhcInRleHRcIik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5rb0lzRWRpdG9yU2hvd2luZy5zdWJzY3JpYmUoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICBpZiAobmV3VmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgc2VsZi5idWlsZEVkaXRvcnNJdGVtc09uU2hvd2luZygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNlbGYub25SZW1vdmVDb25kaXRpb25DbGljayA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBzZWxmLnJlbW92ZUNvbmRpdGlvbihpdGVtKTtcbiAgICB9O1xuICAgIHNlbGYub25DaGFuZ2VWaWV3Q2xpY2sgPSBmdW5jdGlvbiAobmV3Vmlldykge1xuICAgICAgc2VsZi5rb0FjdGl2ZVZpZXcobmV3Vmlldyk7XG4gICAgfTtcbiAgICB0aGlzLmtvVGV4dFZhbHVlLnN1YnNjcmliZShmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgIHNlbGYub25rb1RleHRWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIH0pO1xuICAgIHRoaXMua29DYW5BZGRJdGVtID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgIXRoaXMucmVhZE9ubHkoKSAmJlxuICAgICAgICB0aGlzLmtvRWRpdG9ySXRlbXMoKS5sZW5ndGggPCB0aGlzLm1heExvZ2ljSXRlbXNJbkNvbmRpdGlvblxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvcGVydHlIZWxwTG9jTmFtZSgpOiBzdHJpbmcge1xuICAgIHZhciBsb2NOYW1lID0gc3VwZXIuZ2V0UHJvcGVydHlIZWxwTG9jTmFtZSgpO1xuICAgIGlmICghbG9jTmFtZSAmJiB0aGlzLmVkaXRvclR5cGUgPT0gXCJleHByZXNzaW9uXCIpIHtcbiAgICAgIGxvY05hbWUgPSBcInBlLmV4cHJlc3Npb25IZWxwXCI7XG4gICAgfVxuICAgIHJldHVybiBsb2NOYW1lO1xuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb24gPSAoKSA9PiB7XG4gICAgdmFyIGNvbmRpdGlvbkVkaXRvckl0ZW0gPSBuZXcgQ29uZGl0aW9uRWRpdG9ySXRlbSh0aGlzKTtcbiAgICB0aGlzLmtvRWRpdG9ySXRlbXMucHVzaChjb25kaXRpb25FZGl0b3JJdGVtKTtcbiAgICB0aGlzLnVwZGF0ZUVkaXRvckl0ZW1zVmlzaWJpbGl0aWVzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBrby50YXNrcy5ydW5FYXJseSgpO1xuICAgICAgY29uZGl0aW9uRWRpdG9ySXRlbS5jb25qdW5jdGlvblF1ZXN0aW9uLmZvY3VzKCk7XG4gICAgfSwgMSk7XG4gIH07XG4gIHB1YmxpYyByZW1vdmVDb25kaXRpb24gPSAoaXRlbTogQ29uZGl0aW9uRWRpdG9ySXRlbSkgPT4ge1xuICAgIHRoaXMua29FZGl0b3JJdGVtcy5yZW1vdmUoaXRlbSk7XG4gICAgaWYgKHRoaXMua29FZGl0b3JJdGVtcygpLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUVkaXRvckl0ZW1zVmlzaWJpbGl0aWVzKCk7XG4gICAgdGhpcy5vbkNvbmRpdGlvbkl0ZW1DaGFuZ2VkKCk7XG4gIH07XG4gIHB1YmxpYyBnZXQgYWRkQ29uZGl0aW9uVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInBlLmFkZENvbmRpdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlbW92ZUNvbmRpdGlvblRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJwZS5yZW1vdmVcIik7XG4gIH1cbiAgcHVibGljIGJlZm9yZVNob3dDb3JlID0gKCkgPT4ge1xuICAgIHN1cGVyLmJlZm9yZVNob3dDb3JlKCk7XG4gICAgdGhpcy5yZXNldEFsbENvbmRpdGlvblF1ZXN0aW9ucygpO1xuICAgIHRoaXMub25rb1RleHRWYWx1ZUNoYW5nZWQodGhpcy5rb1ZhbHVlKCkpO1xuICAgIGlmICghIXRoaXMub3B0aW9ucykge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXhMb2dpY0l0ZW1zSW5Db25kaXRpb24gPiAwKSB7XG4gICAgICAgIHRoaXMubWF4TG9naWNJdGVtc0luQ29uZGl0aW9uID0gdGhpcy5vcHRpb25zLm1heExvZ2ljSXRlbXNJbkNvbmRpdGlvbjtcbiAgICAgIH1cbiAgICAgIHRoaXMua29TaG93VGFicyh0aGlzLm9wdGlvbnMuYWxsb3dFZGl0RXhwcmVzc2lvbnNJblRleHRFZGl0b3IpO1xuICAgIH1cbiAgfTtcbiAgcHJvdGVjdGVkIGJlZm9yZVNob3dNb2RhbCA9ICgpID0+IHtcbiAgICBzdXBlci5iZWZvcmVTaG93TW9kYWwoKTtcbiAgICB0aGlzLmlzRWRpdG9yU2hvd2luZyA9IHRydWU7XG4gICAgdGhpcy5pc0VkaXRvckhpZGluZ0Rpc2FibGVkID0gdHJ1ZTtcbiAgfTtcbiAgcHVibGljIGdldCBpc0VkaXRvclNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMua29Jc0VkaXRvclNob3dpbmcoKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzRWRpdG9yU2hvd2luZyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmtvSXNFZGl0b3JTaG93aW5nKHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc0VkaXRvckhpZGluZ0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmtvSXNFZGl0b3JIaWRpbmdEaXNhYmxlZCgpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNFZGl0b3JIaWRpbmdEaXNhYmxlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmtvSXNFZGl0b3JIaWRpbmdEaXNhYmxlZCh2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNXaWRlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5rb0lzV2lkZU1vZGUoKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzV2lkZU1vZGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5rb0lzV2lkZU1vZGUodmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGF2YWlsYWJsZVF1ZXN0aW9ucygpOiBhbnlbXSB7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMuZ2V0U3VydmV5KCk7XG4gICAgdmFyIHJlc3VsdCA9ICEhc3VydmV5ID8gc3VydmV5LmdldEFsbFF1ZXN0aW9ucygpIDogW107XG4gICAgISF0aGlzLm9wdGlvbnMgJiZcbiAgICAgIHRoaXMub3B0aW9ucy5vbkNvbmRpdGlvblF1ZXN0aW9uc0dldExpc3RDYWxsYmFjayhcbiAgICAgICAgdGhpcy5lZGl0YWJsZVByb3BlcnR5TmFtZSxcbiAgICAgICAgdGhpcy5vYmplY3QsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHJlc3VsdFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBnZXRTdXJ2ZXkgPSAoKTogU3VydmV5LlN1cnZleU1vZGVsID0+IHtcbiAgICByZXR1cm4gRWRpdGFibGVPYmplY3QuZ2V0U3VydmV5KHRoaXMub2JqZWN0KTtcbiAgfTtcbiAgcHJpdmF0ZSBhbGxDb25kaXRpb25RdWVzdGlvbnNWYWx1ZTogYW55W107XG4gIHByaXZhdGUgcmVzZXRBbGxDb25kaXRpb25RdWVzdGlvbnMgPSAoKSA9PiB7XG4gICAgdGhpcy5hZGRDb25kaXRpb25RdWVzdGlvbnNIYXNoID0ge307XG4gICAgdGhpcy5hZGRDb25kaXRpb25DYWxjdWxhdGVkVmFsdWVzSGFzaCA9IHt9O1xuICAgIHRoaXMuYWxsQ29uZGl0aW9uUXVlc3Rpb25zVmFsdWUgPSB0aGlzLmdldENvbmRpdGlvblF1ZXN0aW9ucygpO1xuICAgIHRoaXMuYWxsQ29uZGl0aW9uUXVlc3Rpb25zVmFsdWUuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEudGV4dC5sb2NhbGVDb21wYXJlKGIudGV4dCk7XG4gICAgfSk7XG4gIH07XG4gIHB1YmxpYyBnZXQgYWxsQ29uZGl0aW9uUXVlc3Rpb25zKCk6IGFueVtdIHtcbiAgICBpZiAoISF0aGlzLmFsbENvbmRpdGlvblF1ZXN0aW9uc1ZhbHVlKVxuICAgICAgcmV0dXJuIHRoaXMuYWxsQ29uZGl0aW9uUXVlc3Rpb25zVmFsdWU7XG4gICAgdGhpcy5yZXNldEFsbENvbmRpdGlvblF1ZXN0aW9ucygpO1xuICAgIHJldHVybiB0aGlzLmFsbENvbmRpdGlvblF1ZXN0aW9uc1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFeHByZXNzaW9uVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMua29Jc1RleHRDb25kaXRpb25WYWxpZCgpICYmICEhdGhpcy5rb1RleHRWYWx1ZSgpO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLmtvVGV4dFZhbHVlKHRoaXMua29WYWx1ZSgpKTtcbiAgfVxuICBwcml2YXRlIGdldENvbmRpdGlvblF1ZXN0aW9ucygpOiBhbnlbXSB7XG4gICAgaWYgKCF0aGlzLm9iamVjdCkgcmV0dXJuIFtdO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5hdmFpbGFibGVRdWVzdGlvbnM7XG4gICAgaWYgKHF1ZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5vYmplY3QgPT0gcXVlc3Rpb25zW2ldKSBjb250aW51ZTtcbiAgICAgICAgcXVlc3Rpb25zW2ldLmFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQocmVzLCB0aGlzLm9iamVjdCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZENvbmRpdGlvblF1ZXN0aW9uc0hhc2ggPSB7fTtcbiAgICAgIHRoaXMuYWRkQ29uZGl0aW9uQ2FsY3VsYXRlZFZhbHVlc0hhc2ggPSB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zIHx8ICF0aGlzLm9wdGlvbnMuc2hvd1RpdGxlc0luRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICB2YXIgbmFtZSA9IHJlc1tpXS5uYW1lO1xuICAgICAgICAgIHZhciB2YWx1ZU5hbWUgPSByZXNbaV0ucXVlc3Rpb24udmFsdWVOYW1lO1xuICAgICAgICAgIGlmICghIXZhbHVlTmFtZSAmJiBuYW1lLmluZGV4T2YodmFsdWVOYW1lKSA9PSAwKSB7XG4gICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKHZhbHVlTmFtZSwgcmVzW2ldLnF1ZXN0aW9uLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNbaV0udGV4dCA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRDb25kaXRpb25RdWVzdGlvbnNIYXNoW3Jlc1tpXS5uYW1lXSA9IHJlc1tpXS5xdWVzdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhdGhpcy5vcHRpb25zKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0udGV4dCA9IHRoaXMub3B0aW9ucy5nZXRPYmplY3REaXNwbGF5TmFtZShcbiAgICAgICAgICByZXNbaV0ucXVlc3Rpb24sXG4gICAgICAgICAgXCJjb25kaXRpb25cIixcbiAgICAgICAgICByZXNbaV0udGV4dFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZENhbGN1bGF0ZWRWYWx1ZXMocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBpc0NsYXNzQ29udGFpbnMoXG4gICAgcVR5cGU6IHN0cmluZyxcbiAgICBjb250YWluczogQXJyYXk8c3RyaW5nPixcbiAgICBub3RDb250YWluczogQXJyYXk8c3RyaW5nPlxuICApOiBib29sZWFuIHtcbiAgICB2YXIgY2xhc3NJbmZvID0gU3VydmV5LlNlcmlhbGl6ZXIuZmluZENsYXNzKHFUeXBlKTtcbiAgICB3aGlsZSAoISFjbGFzc0luZm8pIHtcbiAgICAgIGlmIChjb250YWlucy5pbmRleE9mKGNsYXNzSW5mby5uYW1lKSA+IC0xKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChub3RDb250YWlucy5pbmRleE9mKGNsYXNzSW5mby5uYW1lKSA+IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICBjbGFzc0luZm8gPSAhIWNsYXNzSW5mby5wYXJlbnROYW1lXG4gICAgICAgID8gU3VydmV5LlNlcmlhbGl6ZXIuZmluZENsYXNzKGNsYXNzSW5mby5wYXJlbnROYW1lKVxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjb250YWlucy5sZW5ndGggPT0gMDtcbiAgfVxuICBwcml2YXRlIGFkZENhbGN1bGF0ZWRWYWx1ZXMocmVzOiBBcnJheTxhbnk+KSB7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMuZ2V0U3VydmV5KCk7XG4gICAgaWYgKCFzdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgdmFsdWVzID0gc3VydmV5LmNhbGN1bGF0ZWRWYWx1ZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWVzW2ldLm5hbWU7XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbkNhbGN1bGF0ZWRWYWx1ZXNIYXNoW25hbWVdID0gdmFsdWVzW2ldO1xuICAgICAgcmVzLnB1c2goeyBuYW1lOiBuYW1lLCB0ZXh0OiBuYW1lLCBxdWVzdGlvbjogbnVsbCB9KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlOYW1lKHF1ZXN0aW9uTmFtZTogc3RyaW5nKTogU3VydmV5LlF1ZXN0aW9uIHtcbiAgICBpZiAoIXRoaXMuZ2V0U3VydmV5KCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmFkZENvbmRpdGlvblF1ZXN0aW9uc0hhc2hbcXVlc3Rpb25OYW1lXTtcbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25WYWx1ZUpTT04ocXVlc3Rpb25OYW1lOiBzdHJpbmcsIG9wZXJhdG9yOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXN0aW9uQ29uZGl0aW9uSnNvbihxdWVzdGlvbk5hbWUsIG9wZXJhdG9yLCB0cnVlKTtcbiAgfVxuICBwcml2YXRlIGdldFF1ZXN0aW9uQ29uZGl0aW9uSnNvbihcbiAgICBxdWVzdGlvbk5hbWU6IHN0cmluZyxcbiAgICBvcGVyYXRvcjogc3RyaW5nLFxuICAgIGNvbnZlcnRPbkFueU9mOiBib29sZWFuID0gZmFsc2VcbiAgKTogYW55IHtcbiAgICB2YXIgcGF0aCA9IFwiXCI7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShxdWVzdGlvbk5hbWUpO1xuICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIGlmIChxdWVzdGlvbk5hbWUuaW5kZXhPZihxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKSkgPT0gMCkge1xuICAgICAgcGF0aCA9IHF1ZXN0aW9uTmFtZS5zdWJzdHIocXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkubGVuZ3RoKTtcbiAgICB9XG4gICAgaWYgKHF1ZXN0aW9uTmFtZS5pbmRleE9mKFwicm93LlwiKSA9PSAwKSB7XG4gICAgICBwYXRoID0gcXVlc3Rpb25OYW1lLnN1YnN0cihcInJvdy5cIi5sZW5ndGgpO1xuICAgIH1cbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHBhdGggPSBxdWVzdGlvbk5hbWU7XG4gICAgfVxuICAgIGlmICghIXBhdGggJiYgcGF0aFswXSA9PSBcIi5cIikge1xuICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKDEpO1xuICAgIH1cbiAgICB2YXIganNvbiA9XG4gICAgICBxdWVzdGlvbiAmJiBxdWVzdGlvbi5nZXRDb25kaXRpb25Kc29uXG4gICAgICAgID8gcXVlc3Rpb24uZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvciwgcGF0aClcbiAgICAgICAgOiBudWxsO1xuICAgIGlmICghIWpzb24gJiYganNvbi50eXBlID09IFwicmFkaW9ncm91cFwiKSB7XG4gICAgICBqc29uLnR5cGUgPSBcImRyb3Bkb3duXCI7XG4gICAgfVxuICAgIGlmICghIWpzb24gJiYganNvbi50eXBlID09IFwiZXhwcmVzc2lvblwiKSB7XG4gICAgICBqc29uLnR5cGUgPSBcInRleHRcIjtcbiAgICB9XG4gICAgaWYgKCEhanNvbiAmJiBvcGVyYXRvciA9PSBcImFueW9mXCIgJiYgY29udmVydE9uQW55T2YpIHtcbiAgICAgIGlmICghdGhpcy5pc0NsYXNzQ29udGFpbnMoanNvbi50eXBlLCBbXCJjaGVja2JveFwiXSwgW10pKSB7XG4gICAgICAgIGpzb24udHlwZSA9IFwiY2hlY2tib3hcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICEhanNvbiA/IGpzb24gOiBudWxsO1xuICB9XG4gIHByaXZhdGUgY2FuU2hvd1ZhbHVlQnlPcGVyYXRvcihvcGVyYXRvcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG9wZXJhdG9yICE9IFwiZW1wdHlcIiAmJiBvcGVyYXRvciAhPSBcIm5vdGVtcHR5XCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNBY2VFZGl0b3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiBhY2UgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgIHR5cGVvZiBhY2UucmVxdWlyZShcImFjZS9leHQvbGFuZ3VhZ2VfdG9vbHNcIikgIT09IFwidW5kZWZpbmVkXCJcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBvbmtvVGV4dFZhbHVlQ2hhbmdlZChuZXdWYWx1ZSkge1xuICAgIGlmICghdGhpcy5pc0JlZm9yZVNob3dDYWxsZWQgfHwgdGhpcy5pc0NvbmRpdGlvbkl0ZW1zQnVpbGRpbmcpIHJldHVybjtcbiAgICB2YXIgaXNWYWxpZCA9IHRydWU7XG4gICAgdmFyIG9wZXJhbmQgPSBudWxsO1xuICAgIGlmICghIW5ld1ZhbHVlKSB7XG4gICAgICB2YXIgY29uZGl0aW9uUGFyc2VyID0gbmV3IFN1cnZleS5Db25kaXRpb25zUGFyc2VyKCk7XG4gICAgICBvcGVyYW5kID0gY29uZGl0aW9uUGFyc2VyLnBhcnNlRXhwcmVzc2lvbihuZXdWYWx1ZSk7XG4gICAgICBpc1ZhbGlkID0gISFvcGVyYW5kO1xuICAgIH1cbiAgICB0aGlzLmtvSXNUZXh0Q29uZGl0aW9uVmFsaWQoaXNWYWxpZCk7XG4gICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgIHRoaXMua29WYWx1ZShuZXdWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMucmVidWlsZEVkaXRvckl0ZW1zKG9wZXJhbmQsIGlzVmFsaWQpO1xuICB9XG4gIHByaXZhdGUgYnVpbGRFZGl0b3JzSXRlbXNPblNob3dpbmcoKSB7XG4gICAgdmFyIG9wZXJhbmQgPSBudWxsO1xuICAgIHZhciBjb25kaXRpb25UZXh0ID0gdGhpcy5rb1ZhbHVlKCk7XG4gICAgaWYgKCEhY29uZGl0aW9uVGV4dCkge1xuICAgICAgdmFyIGNvbmRpdGlvblBhcnNlciA9IG5ldyBTdXJ2ZXkuQ29uZGl0aW9uc1BhcnNlcigpO1xuICAgICAgb3BlcmFuZCA9IGNvbmRpdGlvblBhcnNlci5wYXJzZUV4cHJlc3Npb24oY29uZGl0aW9uVGV4dCk7XG4gICAgfVxuICAgIHRoaXMucmVidWlsZEVkaXRvckl0ZW1zKG9wZXJhbmQsIHRydWUpO1xuICB9XG4gIHByaXZhdGUgaXNDb25kaXRpb25JdGVtc0J1aWxkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBvbkNvbmRpdGlvbkl0ZW1DaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzQ29uZGl0aW9uSXRlbXNCdWlsZGluZykgcmV0dXJuO1xuICAgIHZhciB0ZXh0ID0gXCJcIjtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLmtvRWRpdG9ySXRlbXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbVRleHQgPSBpdGVtc1tpXS50b1N0cmluZygpO1xuICAgICAgaWYgKCFpdGVtVGV4dCkgY29udGludWU7XG4gICAgICBpZiAoISF0ZXh0KSB7XG4gICAgICAgIHRleHQgKz0gXCIgXCIgKyBpdGVtc1tpXS5jb25qdW5jdGlvbiArIFwiIFwiO1xuICAgICAgfVxuICAgICAgdGV4dCArPSBpdGVtVGV4dDtcbiAgICB9XG4gICAgdGhpcy5pc0NvbmRpdGlvbkl0ZW1zQnVpbGRpbmcgPSB0cnVlO1xuICAgIHRoaXMua29WYWx1ZSh0ZXh0KTtcbiAgICB0aGlzLmlzQ29uZGl0aW9uSXRlbXNCdWlsZGluZyA9IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgcmVidWlsZEVkaXRvckl0ZW1zKG9wZXJhbmQ6IFN1cnZleS5PcGVyYW5kLCBpc1ZhbGlkOiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLmlzRWRpdG9yU2hvd2luZykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzQ29uZGl0aW9uSXRlbXNCdWlsZGluZykgcmV0dXJuO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhpcy5rb0VkaXRvckl0ZW1zKFtdKTtcbiAgICAgIHRoaXMua29DYW5QYXJzZUV4cHJlc3Npb24oZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIW9wZXJhbmQpIHtcbiAgICAgIHRoaXMua29FZGl0b3JJdGVtcyhbXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNDb25kaXRpb25JdGVtc0J1aWxkaW5nID0gdHJ1ZTtcbiAgICAgIHZhciBpdGVtcyA9IHRoaXMuYnVpbGRFZGl0b3JJdGVtcyhvcGVyYW5kKTtcbiAgICAgIHRoaXMuaXNDb25kaXRpb25JdGVtc0J1aWxkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmtvRWRpdG9ySXRlbXMoaXRlbXMpO1xuICAgIH1cbiAgICB0aGlzLmtvQ2FuUGFyc2VFeHByZXNzaW9uKHRoaXMua29FZGl0b3JJdGVtcygpLmxlbmd0aCA+IDAgfHwgIW9wZXJhbmQpO1xuICAgIGlmICh0aGlzLmtvRWRpdG9ySXRlbXMoKS5sZW5ndGggPT0gMCAmJiAhb3BlcmFuZCkge1xuICAgICAgdGhpcy5rb0VkaXRvckl0ZW1zKFtuZXcgQ29uZGl0aW9uRWRpdG9ySXRlbSh0aGlzKV0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUVkaXRvckl0ZW1zVmlzaWJpbGl0aWVzKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVFZGl0b3JJdGVtc1Zpc2liaWxpdGllcygpIHtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLmtvRWRpdG9ySXRlbXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtc1tpXS5pc0ZpcnN0ID0gaSA9PSAwO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGJ1aWxkRWRpdG9ySXRlbXMoXG4gICAgb3BlcmFuZDogU3VydmV5Lk9wZXJhbmRcbiAgKTogQXJyYXk8Q29uZGl0aW9uRWRpdG9ySXRlbT4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBpZiAoIXRoaXMuYnVpbGRFZGl0b3JJdGVtc0NvcmUob3BlcmFuZCwgcmVzLCBcIlwiKSkge1xuICAgICAgcmVzID0gW107XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEVkaXRvckl0ZW1zQ29yZShcbiAgICBvcGVyYW5kOiBTdXJ2ZXkuT3BlcmFuZCxcbiAgICByZXM6IEFycmF5PENvbmRpdGlvbkVkaXRvckl0ZW0+LFxuICAgIHBhcmVudENvbmp1bmN0aW9uOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKG9wZXJhbmQuZ2V0VHlwZSgpID09IFwidW5hcnlcIilcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkRWRpdG9ySXRlbXNBZGRVbmFyeU9wZXJhbmQoXG4gICAgICAgIDxTdXJ2ZXkuVW5hcnlPcGVyYW5kPm9wZXJhbmQsXG4gICAgICAgIHJlc1xuICAgICAgKTtcbiAgICBpZiAob3BlcmFuZC5nZXRUeXBlKCkgIT09IFwiYmluYXJ5XCIpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgb3AgPSA8U3VydmV5LkJpbmFyeU9wZXJhbmQ+b3BlcmFuZDtcbiAgICBpZiAob3AuaXNBcml0aG1ldGljICYmICFvcC5pc0Nvbmp1bmN0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG9wLmlzQ29uanVuY3Rpb24pXG4gICAgICByZXR1cm4gdGhpcy5idWlsZEVkaXRvckl0ZW1zQWRkQ29uanVuY3Rpb24ob3AsIHJlcywgcGFyZW50Q29uanVuY3Rpb24pO1xuICAgIHJldHVybiB0aGlzLmJ1aWxkRWRpdG9ySXRlbXNBZGRCaW5hcnlPcGVyYW5kKG9wLCByZXMpO1xuICB9XG4gIHByaXZhdGUgYnVpbGRFZGl0b3JJdGVtc0FkZENvbmp1bmN0aW9uKFxuICAgIG9wOiBTdXJ2ZXkuQmluYXJ5T3BlcmFuZCxcbiAgICByZXM6IEFycmF5PENvbmRpdGlvbkVkaXRvckl0ZW0+LFxuICAgIHBhcmVudENvbmp1bmN0aW9uOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIGNvbmp1bmN0aW9uID0gb3AuY29uanVuY3Rpb247XG4gICAgaWYgKFxuICAgICAgY29uanVuY3Rpb24gPT0gXCJvclwiICYmXG4gICAgICAhIXBhcmVudENvbmp1bmN0aW9uICYmXG4gICAgICBwYXJlbnRDb25qdW5jdGlvbiAhPSBjb25qdW5jdGlvblxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRoaXMuYnVpbGRFZGl0b3JJdGVtc0NvcmUob3AubGVmdE9wZXJhbmQsIHJlcywgY29uanVuY3Rpb24pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjb25qdW5jdGlvbkluZGV4ID0gcmVzLmxlbmd0aDtcbiAgICBpZiAoIXRoaXMuYnVpbGRFZGl0b3JJdGVtc0NvcmUob3AucmlnaHRPcGVyYW5kLCByZXMsIGNvbmp1bmN0aW9uKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXNbY29uanVuY3Rpb25JbmRleF0uY29uanVuY3Rpb24gPSBvcC5jb25qdW5jdGlvbjtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGJ1aWxkRWRpdG9ySXRlbXNBZGRCaW5hcnlPcGVyYW5kKFxuICAgIG9wOiBTdXJ2ZXkuQmluYXJ5T3BlcmFuZCxcbiAgICByZXM6IEFycmF5PENvbmRpdGlvbkVkaXRvckl0ZW0+XG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciB2YXJpYWJsZU9wZXJhbmQgPSA8U3VydmV5LlZhcmlhYmxlPihcbiAgICAgIHRoaXMuZ2V0T3BlcmFuZEJ5VHlwZShvcCwgXCJ2YXJpYWJsZVwiKVxuICAgICk7XG4gICAgdmFyIGFycmF5VmFsdWUgPSB0aGlzLmdldEFycmF5VmFsdWVGcm9tT3BlcmFuZChvcCk7XG4gICAgdmFyIGNvbnN0T3BlcmFuZCA9ICFhcnJheVZhbHVlXG4gICAgICA/IDxTdXJ2ZXkuQ29uc3Q+dGhpcy5nZXRPcGVyYW5kQnlUeXBlKG9wLCBcImNvbnN0XCIpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKFxuICAgICAgIXZhcmlhYmxlT3BlcmFuZCB8fFxuICAgICAgKCFjb25zdE9wZXJhbmQgJiYgIWFycmF5VmFsdWUgJiYgdGhpcy5jYW5TaG93VmFsdWVCeU9wZXJhdG9yKG9wLm9wZXJhdG9yKSlcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmlzVmFyaWFibGVJblN1cnZleSh2YXJpYWJsZU9wZXJhbmQudmFyaWFibGUpKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGl0ZW0gPSBuZXcgQ29uZGl0aW9uRWRpdG9ySXRlbSh0aGlzKTtcbiAgICBpdGVtLnF1ZXN0aW9uTmFtZSA9IHZhcmlhYmxlT3BlcmFuZC52YXJpYWJsZTtcbiAgICBpdGVtLm9wZXJhdG9yID1cbiAgICAgIG9wLmxlZnRPcGVyYW5kICE9PSB2YXJpYWJsZU9wZXJhbmRcbiAgICAgICAgPyB0aGlzLmdldE9wcG9zaXRlT3BlcmF0b3Iob3Aub3BlcmF0b3IpXG4gICAgICAgIDogb3Aub3BlcmF0b3I7XG4gICAgaWYgKCEhYXJyYXlWYWx1ZSkge1xuICAgICAgaXRlbS52YWx1ZSA9IGFycmF5VmFsdWU7XG4gICAgfVxuICAgIGlmICghIWNvbnN0T3BlcmFuZCkge1xuICAgICAgaXRlbS52YWx1ZSA9IGNvbnN0T3BlcmFuZC5jb3JyZWN0VmFsdWU7XG4gICAgfVxuICAgIHJlcy5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgaXNWYXJpYWJsZUluU3VydmV5KHZhcmlhYmxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZ2V0U3VydmV5KCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5nZXRRdWVzdGlvbkJ5TmFtZSh2YXJpYWJsZSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiAhIXRoaXMuYWRkQ29uZGl0aW9uQ2FsY3VsYXRlZFZhbHVlc0hhc2hbdmFyaWFibGVdO1xuICB9XG4gIHByaXZhdGUgZ2V0QXJyYXlWYWx1ZUZyb21PcGVyYW5kKG9wOiBTdXJ2ZXkuQmluYXJ5T3BlcmFuZCk6IEFycmF5PGFueT4ge1xuICAgIHZhciBhcnJheU9wZXJhbmQgPSA8U3VydmV5LkFycmF5T3BlcmFuZD50aGlzLmdldE9wZXJhbmRCeVR5cGUob3AsIFwiYXJyYXlcIik7XG4gICAgaWYgKCFhcnJheU9wZXJhbmQgfHwgIWFycmF5T3BlcmFuZC52YWx1ZXMpIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZXNPcGVyYW5kID0gYXJyYXlPcGVyYW5kLnZhbHVlcztcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzT3BlcmFuZCkgfHwgdmFsdWVzT3BlcmFuZC5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzT3BlcmFuZC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG9wQ29uc3QgPSB2YWx1ZXNPcGVyYW5kW2ldO1xuICAgICAgaWYgKCFvcENvbnN0KSBjb250aW51ZTtcbiAgICAgIGlmIChvcENvbnN0LmdldFR5cGUoKSAhPSBcImNvbnN0XCIpIHJldHVybiBudWxsO1xuICAgICAgcmVzLnB1c2goKDxTdXJ2ZXkuQ29uc3Q+b3BDb25zdCkuY29ycmVjdFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHJlcy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGJ1aWxkRWRpdG9ySXRlbXNBZGRVbmFyeU9wZXJhbmQoXG4gICAgb3A6IFN1cnZleS5VbmFyeU9wZXJhbmQsXG4gICAgcmVzOiBBcnJheTxDb25kaXRpb25FZGl0b3JJdGVtPlxuICApOiBib29sZWFuIHtcbiAgICB2YXIgb3BlcmF0b3IgPSBvcC5vcGVyYXRvcjtcbiAgICBpZiAob3BlcmF0b3IgIT09IFwiZW1wdHlcIiAmJiBvcGVyYXRvciAhPSBcIm5vdGVtcHR5XCIpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgb3BlcmFuZCA9IG9wLmV4cHJlc3Npb247XG4gICAgaWYgKG9wZXJhbmQgPT0gbnVsbCB8fCBvcGVyYW5kLmdldFR5cGUoKSAhPSBcInZhcmlhYmxlXCIpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcXVlc3Rpb25OYW1lID0gKDxTdXJ2ZXkuVmFyaWFibGU+b3BlcmFuZCkudmFyaWFibGU7XG4gICAgaWYgKCF0aGlzLmlzVmFyaWFibGVJblN1cnZleShxdWVzdGlvbk5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGl0ZW0gPSBuZXcgQ29uZGl0aW9uRWRpdG9ySXRlbSh0aGlzKTtcbiAgICBpdGVtLnF1ZXN0aW9uTmFtZSA9IHF1ZXN0aW9uTmFtZTtcbiAgICBpdGVtLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgcmVzLnB1c2goaXRlbSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBnZXRPcHBvc2l0ZU9wZXJhdG9yKG9wZXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChvcGVyYXRvciA9PSBcImxlc3NcIikgcmV0dXJuIFwiZ3JlYXRlclwiO1xuICAgIGlmIChvcGVyYXRvciA9PSBcImdyZWF0ZXJcIikgcmV0dXJuIFwibGVzc1wiO1xuICAgIGlmIChvcGVyYXRvciA9PSBcImxlc3NvcmVxdWFsXCIpIHJldHVybiBcImdyZWF0ZXJvcmVxdWFsXCI7XG4gICAgaWYgKG9wZXJhdG9yID09IFwiZ3JlYXRlcm9yZXF1YWxcIikgcmV0dXJuIFwibGVzc29yZXF1YWxcIjtcbiAgICByZXR1cm4gb3BlcmF0b3I7XG4gIH1cbiAgcHJpdmF0ZSBnZXRPcGVyYW5kQnlUeXBlKFxuICAgIG9wOiBTdXJ2ZXkuQmluYXJ5T3BlcmFuZCxcbiAgICBvcFR5cGU6IHN0cmluZ1xuICApOiBTdXJ2ZXkuT3BlcmFuZCB7XG4gICAgaWYgKCFvcC5yaWdodE9wZXJhbmQpIHJldHVybiBudWxsO1xuICAgIGlmIChcbiAgICAgIG9wLmxlZnRPcGVyYW5kLmdldFR5cGUoKSAhPT0gb3BUeXBlICYmXG4gICAgICBvcC5yaWdodE9wZXJhbmQuZ2V0VHlwZSgpICE9PSBvcFR5cGVcbiAgICApXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAoXG4gICAgICBvcC5sZWZ0T3BlcmFuZC5nZXRUeXBlKCkgPT0gb3BUeXBlICYmXG4gICAgICBvcC5yaWdodE9wZXJhbmQuZ2V0VHlwZSgpID09IG9wVHlwZVxuICAgIClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiBvcC5sZWZ0T3BlcmFuZC5nZXRUeXBlKCkgPT0gb3BUeXBlXG4gICAgICA/IG9wLmxlZnRPcGVyYW5kXG4gICAgICA6IG9wLnJpZ2h0T3BlcmFuZDtcbiAgfVxuICBwcml2YXRlIGdldENvbmRpdGlvbkRpc3BsYXlUZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5rb0lzVGV4dENvbmRpdGlvblZhbGlkKClcbiAgICAgID8gdGhpcy5rb1RleHRWYWx1ZSgpXG4gICAgICA6IHRoaXMua29WYWx1ZSgpO1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblRvRGlzcGxheVRleHQoXG4gICAgICB0aGlzLmdldFN1cnZleSgpLFxuICAgICAgdGhpcy5vcHRpb25zXG4gICAgKS50b0Rpc3BsYXlUZXh0KHZhbHVlKTtcbiAgfVxufVxuXG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJFZGl0b3IoXG4gIFwiY29uZGl0aW9uXCIsXG4gIGZ1bmN0aW9uIChwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSk6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlQcm9wZXJ0eUNvbmRpdGlvbkVkaXRvcihcbiAgICAgIHByb3BlcnR5LFxuICAgICAgXCJjb25kaXRpb25cIixcbiAgICAgIFwiY3JlYXRlQ29uZGl0aW9uXCJcbiAgICApO1xuICB9XG4pO1xuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyRWRpdG9yKFxuICBcImV4cHJlc3Npb25cIixcbiAgZnVuY3Rpb24gKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVByb3BlcnR5Q29uZGl0aW9uRWRpdG9yKFxuICAgICAgcHJvcGVydHksXG4gICAgICBcImV4cHJlc3Npb25cIixcbiAgICAgIFwicGFyc2VFeHByZXNzaW9uXCJcbiAgICApO1xuICB9XG4pO1xuXG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJUeXBlRm9yQ2VsbEVkaXRpbmcoXCJleHByZXNzaW9uXCIsIFwic3RyaW5nXCIpO1xuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyVHlwZUZvckNlbGxFZGl0aW5nKFwiY29uZGl0aW9uXCIsIFwic3RyaW5nXCIpO1xuXG52YXIgb3BlcmF0aW9ucyA9IFtcbiAge1xuICAgIHZhbHVlOiBcImFuZFwiLFxuICAgIHRpdGxlOiBcImxvZ2ljYWwgJ2FuZCcgb3BlcmF0b3JcIixcbiAgfSxcbiAge1xuICAgIHZhbHVlOiBcIiYmXCIsXG4gICAgdGl0bGU6IFwibG9naWNhbCAnYW5kJyBvcGVyYXRvclwiLFxuICB9LFxuICB7XG4gICAgdmFsdWU6IFwib3JcIixcbiAgICB0aXRsZTogXCJsb2dpY2FsICdvcicgb3BlcmF0b3JcIixcbiAgfSxcbiAge1xuICAgIHZhbHVlOiBcInx8XCIsXG4gICAgdGl0bGU6IFwibG9naWNhbCAnb3InIG9wZXJhdG9yXCIsXG4gIH0sXG4gIHtcbiAgICB2YWx1ZTogXCJlbXB0eVwiLFxuICAgIHRpdGxlOiBcInJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdCBvcGVyYW5kIGlzIGVtcHR5XHR7cXVlc3Rpb25OYW1lfSBlbXB0eVwiLFxuICB9LFxuICB7XG4gICAgdmFsdWU6IFwibm90ZW1wdHlcIixcbiAgICB0aXRsZTpcbiAgICAgIFwicmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0IG9wZXJhbmQgaXMgbm90IGVtcHR5XHR7cXVlc3Rpb25OYW1lfSBub3RlbXB0eVwiLFxuICB9LFxuICB7XG4gICAgdmFsdWU6IFwiPVwiLFxuICAgIHRpdGxlOlxuICAgICAgXCJyZXR1cm5zIHRydWUgaWYgdHdvIHZhbHVlcyBhcmUgZXF1YWxcdHtxdWVzdGlvbk5hbWV9ID0gNSwge3F1ZXN0aW9uTmFtZX0gPT0gJ2FiYycsIHtxdWVzdGlvbk5hbWV9IGVxdWFsIDEyNFwiLFxuICB9LFxuICB7XG4gICAgdmFsdWU6IFwiPT1cIixcbiAgICB0aXRsZTpcbiAgICAgIFwicmV0dXJucyB0cnVlIGlmIHR3byB2YWx1ZXMgYXJlIGVxdWFsXHR7cXVlc3Rpb25OYW1lfSA9IDUsIHtxdWVzdGlvbk5hbWV9ID09ICdhYmMnLCB7cXVlc3Rpb25OYW1lfSBlcXVhbCAxMjRcIixcbiAgfSxcbiAge1xuICAgIHZhbHVlOiBcImVxdWFsXCIsXG4gICAgdGl0bGU6XG4gICAgICBcInJldHVybnMgdHJ1ZSBpZiB0d28gdmFsdWVzIGFyZSBlcXVhbFx0e3F1ZXN0aW9uTmFtZX0gPSA1LCB7cXVlc3Rpb25OYW1lfSA9PSAnYWJjJywge3F1ZXN0aW9uTmFtZX0gZXF1YWwgMTI0XCIsXG4gIH0sXG4gIHtcbiAgICB2YWx1ZTogXCI8PlwiLFxuICAgIHRpdGxlOlxuICAgICAgXCJyZXR1cm5zIHRydWUgaWYgdHdvIHZhbHVlcyBhcmUgbm90IGVxdWFsXHR7cXVlc3Rpb25OYW1lfSA8PiA1LCB7cXVlc3Rpb25OYW1lfSAhPSAnYWJjJywge3F1ZXN0aW9uTmFtZX0gbm90ZXF1YWwgMTI0XCIsXG4gIH0sXG4gIHtcbiAgICB2YWx1ZTogXCIhPVwiLFxuICAgIHRpdGxlOlxuICAgICAgXCJyZXR1cm5zIHRydWUgaWYgdHdvIHZhbHVlcyBhcmUgbm90IGVxdWFsXHR7cXVlc3Rpb25OYW1lfSA8PiA1LCB7cXVlc3Rpb25OYW1lfSAhPSAnYWJjJywge3F1ZXN0aW9uTmFtZX0gbm90ZXF1YWwgMTI0XCIsXG4gIH0sXG4gIHtcbiAgICB2YWx1ZTogXCJub3RlcXVhbFwiLFxuICAgIHRpdGxlOlxuICAgICAgXCJyZXR1cm5zIHRydWUgaWYgdHdvIHZhbHVlcyBhcmUgbm90IGVxdWFsXHR7cXVlc3Rpb25OYW1lfSA8PiA1LCB7cXVlc3Rpb25OYW1lfSAhPSAnYWJjJywge3F1ZXN0aW9uTmFtZX0gbm90ZXF1YWwgMTI0XCIsXG4gIH0sXG4gIHtcbiAgICB2YWx1ZTogXCI+XCIsXG4gICAgdGl0bGU6XG4gICAgICBcInJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdCBvcGVyYW5kIGdyZWF0ZXIgdGhlbiB0aGUgc2Vjb25kIG9wZXJhbmRcdHtxdWVzdGlvbk5hbWV9ID4gMiwge3F1ZXN0aW9uTmFtZX0gZ3JlYXRlciAnYSdcIixcbiAgfSxcbiAge1xuICAgIHZhbHVlOiBcImdyZWF0ZXJcIixcbiAgICB0aXRsZTpcbiAgICAgIFwicmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0IG9wZXJhbmQgZ3JlYXRlciB0aGVuIHRoZSBzZWNvbmQgb3BlcmFuZFx0e3F1ZXN0aW9uTmFtZX0gPiAyLCB7cXVlc3Rpb25OYW1lfSBncmVhdGVyICdhJ1wiLFxuICB9LFxuICB7XG4gICAgdmFsdWU6IFwiPFwiLFxuICAgIHRpdGxlOlxuICAgICAgXCJyZXR1cm5zIHRydWUgaWYgdGhlIGxlZnQgb3BlcmFuZCBsZXNzIHRoYW4gdGhlIHNlY29uZCBvcGVyYW5kXHR7cXVlc3Rpb25OYW1lfSA8IDIsIHtxdWVzdGlvbk5hbWV9IGxlc3MgJ2EnXCIsXG4gIH0sXG4gIHtcbiAgICB2YWx1ZTogXCJsZXNzXCIsXG4gICAgdGl0bGU6XG4gICAgICBcInJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdCBvcGVyYW5kIGxlc3MgdGhhbiB0aGUgc2Vjb25kIG9wZXJhbmRcdHtxdWVzdGlvbk5hbWV9IDwgMiwge3F1ZXN0aW9uTmFtZX0gbGVzcyAnYSdcIixcbiAgfSxcbiAge1xuICAgIHZhbHVlOiBcIj49XCIsXG4gICAgdGl0bGU6XG4gICAgICBcInJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdCBvcGVyYW5kIGVxdWFsIG9yIGdyZWF0ZXIgdGhlbiB0aGUgc2Vjb25kIG9wZXJhbmRcdHtxdWVzdGlvbk5hbWV9ID49IDIsIHtxdWVzdGlvbk5hbWV9IGdyZWF0ZXJvcmVxdWFsICdhJ1wiLFxuICB9LFxuICB7XG4gICAgdmFsdWU6IFwiZ3JlYXRlcm9yZXF1YWxcIixcbiAgICB0aXRsZTpcbiAgICAgIFwicmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0IG9wZXJhbmQgZXF1YWwgb3IgZ3JlYXRlciB0aGVuIHRoZSBzZWNvbmQgb3BlcmFuZFx0e3F1ZXN0aW9uTmFtZX0gPj0gMiwge3F1ZXN0aW9uTmFtZX0gZ3JlYXRlcm9yZXF1YWwgJ2EnXCIsXG4gIH0sXG4gIHtcbiAgICB2YWx1ZTogXCI8PVwiLFxuICAgIHRpdGxlOlxuICAgICAgXCJyZXR1cm5zIHRydWUgaWYgdGhlIGxlZnQgb3BlcmFuZCBlcXVhbCBvciBsZXNzIHRoYW4gdGhlIHNlY29uZCBvcGVyYW5kXHR7cXVlc3Rpb25OYW1lfSA8PSAyLCB7cXVlc3Rpb25OYW1lfSBsZXNzb3JlcXVhbCAnYSdcIixcbiAgfSxcbiAge1xuICAgIHZhbHVlOiBcImxlc3NvcmVxdWFsXCIsXG4gICAgdGl0bGU6XG4gICAgICBcInJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdCBvcGVyYW5kIGVxdWFsIG9yIGxlc3MgdGhhbiB0aGUgc2Vjb25kIG9wZXJhbmRcdHtxdWVzdGlvbk5hbWV9IDw9IDIsIHtxdWVzdGlvbk5hbWV9IGxlc3NvcmVxdWFsICdhJ1wiLFxuICB9LFxuICB7XG4gICAgdmFsdWU6IFwiY29udGFpbnNcIixcbiAgICB0aXRsZTpcbiAgICAgIFwicmV0dXJuIHRydWUgaWYgdGhlIGxlZnQgb3BlcmFuZCBpcyBhbiBhcnJheSBhbmQgaXQgY29udGFpbnMgYSB2YWx1ZSBvZiB0aGUgc2Vjb25kIG9wZXJhbmRcdHtxdWVzdGlvbk5hbWV9IGNvbnRhaW5zICdhJ1wiLFxuICB9LFxuICB7XG4gICAgdmFsdWU6IFwibm90Y29udGFpbnNcIixcbiAgICB0aXRsZTpcbiAgICAgIFwicmV0dXJuIHRydWUgaWYgdGhlIGxlZnQgb3BlcmFuZCBpcyBhbiBhcnJheSBhbmQgaXQgZG9lcyBub3QgY29udGFpbiBhIHZhbHVlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZFwiLFxuICB9LFxuICB7XG4gICAgdmFsdWU6IFwiYW55b2ZcIixcbiAgICB0aXRsZTpcbiAgICAgIFwicmV0dXJuIHRydWUgaWYgdGhlIGxlZnQgb3BlcmFuZCBpcyBhbiBhcnJheSBhbmQgaXQgY29udGFpbnMgYW55IHZhbHVlIG9mIHRoZSBzZWNvbmQgYXJyYXkgb3BlcmFuZFwiLFxuICB9LFxuICB7XG4gICAgdmFsdWU6IFwiYWxsb2ZcIixcbiAgICB0aXRsZTpcbiAgICAgIFwicmV0dXJuIHRydWUgaWYgdGhlIGxlZnQgb3BlcmFuZCBpcyBhbiBhcnJheSBhbmQgaXQgY29udGFpbnMgYWxsIHZhbHVlcyBvZiB0aGUgc2Vjb25kIGFycmF5IG9wZXJhbmRcIixcbiAgfSxcbl07XG5cbmNvbnN0IGNyZWF0ZUFubm90YXRpb25zID0gKFxuICBjb25kaXRpb246IHN0cmluZyxcbiAgc3ludGF4Q2hlY2tNZXRob2ROYW1lOiBzdHJpbmdcbik6IEFjZUFqYXguQW5ub3RhdGlvbltdID0+IHtcbiAgY29uZGl0aW9uID0gY29uZGl0aW9uIHx8IFwiXCI7XG4gIHZhciBhbm5vdGF0aW9ucyA9IG5ldyBBcnJheTxBY2VBamF4LkFubm90YXRpb24+KCk7XG4gIHZhciBjb25kaXRpb25QYXJzZXI6IGFueSA9IG5ldyBTdXJ2ZXkuQ29uZGl0aW9uc1BhcnNlcigpO1xuICBjb25kaXRpb25QYXJzZXJbc3ludGF4Q2hlY2tNZXRob2ROYW1lXShjb25kaXRpb24pO1xuICBpZiAoISFjb25kaXRpb24gJiYgY29uZGl0aW9uUGFyc2VyLmVycm9yKSB7XG4gICAgdmFyIHRvRXJyb3JTdWJzdHJpbmcgPSBjb25kaXRpb24uc3Vic3RyaW5nKDAsIGNvbmRpdGlvblBhcnNlci5lcnJvci5hdCk7XG4gICAgdmFyIGNvbHVtbiA9IHRvRXJyb3JTdWJzdHJpbmcubGVuZ3RoIC0gdG9FcnJvclN1YnN0cmluZy5sYXN0SW5kZXhPZihcIlxcblwiKTtcbiAgICB2YXIgYW5ub3RhdGlvbjogQWNlQWpheC5Bbm5vdGF0aW9uID0ge1xuICAgICAgcm93OiBjb25kaXRpb24ubWF0Y2goL1xcbi9nKSA/IGNvbmRpdGlvbi5tYXRjaCgvXFxuL2cpLmxlbmd0aCA6IDAsXG4gICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgIHRleHQ6IGNvbmRpdGlvblBhcnNlci5lcnJvci5jb2RlICsgXCIgKFwiICsgY29sdW1uICsgXCIpXCIsXG4gICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgfTtcbiAgICBhbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb24pO1xuICB9XG4gIHJldHVybiBhbm5vdGF0aW9ucztcbn07XG5cbnZhciBJRF9SRUdFWFAgPSAvW2EtekEtWl8wLTl7XFwqXFwvXFw8XFw+XFw9XFwhXFwkXFwuXFwtXFx1MDBBMi1cXHVGRkZGXS87XG5cbmV4cG9ydCBmdW5jdGlvbiBkb0dldENvbXBsZXRpb25zKFxuICBwcmV2SWRlbnRpZmllcjogc3RyaW5nLFxuICBwcmVmaXg6IHN0cmluZyxcbiAgY29uZmlnOiB7IHF1ZXN0aW9uOiBTdXJ2ZXkuUXVlc3Rpb247IHF1ZXN0aW9uczogU3VydmV5LlF1ZXN0aW9uW10gfSxcbiAgY29tcGxldGVyID0gbnVsbFxuKSB7XG4gIHZhciBjb21wbGV0aW9ucyA9IFtdO1xuICB2YXIgY3VycmVudFF1ZXN0aW9uOiBTdXJ2ZXkuUXVlc3Rpb24gPSBjb25maWcucXVlc3Rpb247XG4gIHZhciB1c2FibGVRdWVzdGlvbnMgPSAoY29uZmlnLnF1ZXN0aW9ucyB8fCBbXSkuZmlsdGVyKFxuICAgIChxKSA9PiBxICE9PSBjdXJyZW50UXVlc3Rpb25cbiAgKTtcbiAgaWYgKFxuICAgICEhdXNhYmxlUXVlc3Rpb25zIHx8XG4gICAgY3VycmVudFF1ZXN0aW9uIGluc3RhbmNlb2YgU3VydmV5Lk1hdHJpeERyb3Bkb3duQ29sdW1uIHx8XG4gICAgY3VycmVudFF1ZXN0aW9uLmRhdGEgaW5zdGFuY2VvZiBTdXJ2ZXkuUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtXG4gICkge1xuICAgIGlmIChcbiAgICAgIHByZXZJZGVudGlmaWVyID09PSBcInJvd1wiICYmXG4gICAgICBjdXJyZW50UXVlc3Rpb24gaW5zdGFuY2VvZiBTdXJ2ZXkuTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgICApIHtcbiAgICAgIGNvbXBsZXRpb25zID0gY3VycmVudFF1ZXN0aW9uLmNvbE93bmVyW1wiY29sdW1uc1wiXVxuICAgICAgICAuZmlsdGVyKChlKSA9PiBlLm5hbWUgIT09IGN1cnJlbnRRdWVzdGlvbi5uYW1lKVxuICAgICAgICAubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgICAgIHZhbHVlOiBcIntyb3cuXCIgKyBjb2x1bW4ubmFtZSArIFwifVwiLFxuICAgICAgICAgICAgc29tZTogXCJcIixcbiAgICAgICAgICAgIG1ldGE6IGNvbHVtbi50aXRsZSxcbiAgICAgICAgICAgIGlkZW50aWZpZXJSZWdleDogSURfUkVHRVhQLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBwcmV2SWRlbnRpZmllciA9PT0gXCJwYW5lbFwiICYmXG4gICAgICBjdXJyZW50UXVlc3Rpb24uZGF0YSBpbnN0YW5jZW9mIFN1cnZleS5RdWVzdGlvblBhbmVsRHluYW1pY0l0ZW1cbiAgICApIHtcbiAgICAgIHZhciBwYW5lbDogU3VydmV5LlBhbmVsTW9kZWwgPSBjdXJyZW50UXVlc3Rpb24uZGF0YS5wYW5lbDtcbiAgICAgIGNvbXBsZXRpb25zID0gcGFuZWwuZWxlbWVudHNcbiAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5uYW1lICE9PSBjdXJyZW50UXVlc3Rpb24ubmFtZSlcbiAgICAgICAgLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgICAgICAgdmFsdWU6IFwie3BhbmVsLlwiICsgZWxlbWVudC5uYW1lICsgXCJ9XCIsXG4gICAgICAgICAgICBzb21lOiBcIlwiLFxuICAgICAgICAgICAgbWV0YTogZWxlbWVudC5uYW1lLFxuICAgICAgICAgICAgaWRlbnRpZmllclJlZ2V4OiBJRF9SRUdFWFAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvcGVyYXRpb25zRmlsdGVyZWQgPSBvcGVyYXRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wKSA9PiAhcHJlZml4IHx8IG9wLnZhbHVlLmluZGV4T2YocHJlZml4KSAhPT0gLTFcbiAgICAgICk7XG4gICAgICB2YXIgcXVlc3Rpb25zRmlsdGVyZWQgPSB1c2FibGVRdWVzdGlvbnMuZmlsdGVyKFxuICAgICAgICAob3ApID0+ICFwcmVmaXggfHwgb3AubmFtZS5pbmRleE9mKHByZWZpeCkgIT09IC0xXG4gICAgICApO1xuICAgICAgaWYgKGN1cnJlbnRRdWVzdGlvbiBpbnN0YW5jZW9mIFN1cnZleS5NYXRyaXhEcm9wZG93bkNvbHVtbikge1xuICAgICAgICBjb21wbGV0aW9ucy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgICAgIHZhbHVlOiBcIntyb3cuXCIsXG4gICAgICAgICAgc29tZTogXCJcIixcbiAgICAgICAgICBtZXRhOiBlZGl0b3JMb2NhbGl6YXRpb24uZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcbiAgICAgICAgICAgIGVkaXRvckxvY2FsaXphdGlvbi5kZWZhdWx0U3RyaW5ncy5wZS5hY2VFZGl0b3JSb3dUaXRsZVxuICAgICAgICAgICksXG4gICAgICAgICAgaWRlbnRpZmllclJlZ2V4OiBJRF9SRUdFWFAsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgISFjdXJyZW50UXVlc3Rpb24gJiZcbiAgICAgICAgY3VycmVudFF1ZXN0aW9uLmRhdGEgaW5zdGFuY2VvZiBTdXJ2ZXkuUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtXG4gICAgICApIHtcbiAgICAgICAgY29tcGxldGlvbnMucHVzaCh7XG4gICAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgICB2YWx1ZTogXCJ7cGFuZWwuXCIsXG4gICAgICAgICAgc29tZTogXCJcIixcbiAgICAgICAgICBtZXRhOiBlZGl0b3JMb2NhbGl6YXRpb24uZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcbiAgICAgICAgICAgIGVkaXRvckxvY2FsaXphdGlvbi5kZWZhdWx0U3RyaW5ncy5wZS5hY2VFZGl0b3JQYW5lbFRpdGxlXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpZGVudGlmaWVyUmVnZXg6IElEX1JFR0VYUCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb21wbGV0aW9ucyA9IGNvbXBsZXRpb25zXG4gICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgcXVlc3Rpb25zRmlsdGVyZWQubWFwKChxKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb21wbGV0ZXI6IGNvbXBsZXRlcixcbiAgICAgICAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgICAgICAgdmFsdWU6IFwie1wiICsgcS5nZXRWYWx1ZU5hbWUoKSArIFwifVwiLFxuICAgICAgICAgICAgICBzb21lOiBcIlwiLFxuICAgICAgICAgICAgICBtZXRhOiBxLnRpdGxlLFxuICAgICAgICAgICAgICBpZGVudGlmaWVyUmVnZXg6IElEX1JFR0VYUCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuY29uY2F0KFxuICAgICAgICAgIG9wZXJhdGlvbnNGaWx0ZXJlZC5tYXAoKG9wKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBuYW1lOiBcIlwiLFxuICAgICAgICAgICAgICB2YWx1ZTogb3AudmFsdWUsXG4gICAgICAgICAgICAgIHNvbWU6IFwiXCIsXG4gICAgICAgICAgICAgIG1ldGE6IG9wLnRpdGxlLFxuICAgICAgICAgICAgICBpZGVudGlmaWVyUmVnZXg6IElEX1JFR0VYUCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbXBsZXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0TWF0Y2goZWRpdG9yLCBkYXRhKSB7XG4gIGlmIChlZGl0b3IuY29tcGxldGVyLmNvbXBsZXRpb25zLmZpbHRlclRleHQpIHtcbiAgICB2YXIgYWxsUmFuZ2VzID0gZWRpdG9yLnNlbGVjdGlvbi5nZXRBbGxSYW5nZXMoKTtcbiAgICBmb3IgKFxuICAgICAgdmFyIHJhbmdlSW5kZXggPSAwLCByYW5nZTtcbiAgICAgIChyYW5nZSA9IGFsbFJhbmdlc1tyYW5nZUluZGV4XSk7XG4gICAgICByYW5nZUluZGV4KytcbiAgICApIHtcbiAgICAgIHJhbmdlLnN0YXJ0LmNvbHVtbiAtPSBlZGl0b3IuY29tcGxldGVyLmNvbXBsZXRpb25zLmZpbHRlclRleHQubGVuZ3RoO1xuICAgICAgdmFyIHJhbmdlVGV4dCA9IGVkaXRvci5zZXNzaW9uLmdldFRleHRSYW5nZShyYW5nZSk7XG4gICAgICBpZiAocmFuZ2VUZXh0LmluZGV4T2YoXCJ7XCIpICE9PSAwKSB7XG4gICAgICAgIHZhciBleHRSYW5nZSA9IHJhbmdlLmNsb25lKCk7XG4gICAgICAgIGV4dFJhbmdlLnN0YXJ0LmNvbHVtbi0tO1xuICAgICAgICBpZiAoZWRpdG9yLnNlc3Npb24uZ2V0VGV4dFJhbmdlKGV4dFJhbmdlKS5pbmRleE9mKFwie1wiKSA9PT0gMCkge1xuICAgICAgICAgIHJhbmdlID0gZXh0UmFuZ2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVkaXRvci5zZXNzaW9uLnJlbW92ZShyYW5nZSk7XG4gICAgfVxuICB9XG4gIGVkaXRvci5leGVjQ29tbWFuZChcImluc2VydHN0cmluZ1wiLCBkYXRhLnZhbHVlIHx8IGRhdGEpO1xufVxuXG5rby5iaW5kaW5nSGFuZGxlcnMuYWNlRWRpdG9yID0ge1xuICBpbml0OiBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHZhciBjb25maWdzID0gb3B0aW9ucygpO1xuICAgIHZhciBsYW5nVG9vbHMgPSBhY2UucmVxdWlyZShcImFjZS9leHQvbGFuZ3VhZ2VfdG9vbHNcIik7XG4gICAgdmFyIGxhbmdVdGlscyA9IGFjZS5yZXF1aXJlKFwiYWNlL2F1dG9jb21wbGV0ZS91dGlsXCIpO1xuICAgIHZhciBlZGl0b3IgPSBhY2UuZWRpdChlbGVtZW50KTtcbiAgICB2YXIgb2JqZWN0RWRpdG9yOiBTdXJ2ZXlQcm9wZXJ0eUNvbmRpdGlvbkVkaXRvciA9IGNvbmZpZ3MuZWRpdG9yO1xuICAgIHZhciBpc1VwZGF0aW5nID0gZmFsc2U7XG5cbiAgICBlZGl0b3Iuc2V0T3B0aW9uKFwidXNlV29ya2VyXCIsIGZhbHNlKTtcbiAgICBlZGl0b3IucmVuZGVyZXIuc2V0U2hvd0d1dHRlcihmYWxzZSk7XG4gICAgZWRpdG9yLnNldEhpZ2hsaWdodEFjdGl2ZUxpbmUoZmFsc2UpO1xuXG4gICAgZWRpdG9yLmdldFNlc3Npb24oKS5vbihcImNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXJyb3JzID0gY3JlYXRlQW5ub3RhdGlvbnMoXG4gICAgICAgIGVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICBvYmplY3RFZGl0b3Iuc3ludGF4Q2hlY2tNZXRob2ROYW1lXG4gICAgICApO1xuICAgICAgaWYgKCFpc1VwZGF0aW5nKSB7XG4gICAgICAgIGlzVXBkYXRpbmcgPSB0cnVlO1xuICAgICAgICBvYmplY3RFZGl0b3Iua29UZXh0VmFsdWUoZWRpdG9yLmdldFZhbHVlKCkpO1xuICAgICAgICBpc1VwZGF0aW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyAgIG9iamVjdEVkaXRvci5rb0hhc0Vycm9yKGVycm9ycy5sZW5ndGggPiAwKTtcbiAgICAgIC8vICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyAgICAgb2JqZWN0RWRpdG9yLmtvRXJyb3JUZXh0KGVycm9yc1swXS50ZXh0KTtcbiAgICAgIC8vICAgfVxuICAgICAgZWRpdG9yLmdldFNlc3Npb24oKS5zZXRBbm5vdGF0aW9ucyhlcnJvcnMpO1xuICAgIH0pO1xuICAgIGVkaXRvci5vbihcImZvY3VzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGVkaXRvci5zZXRSZWFkT25seShvYmplY3RFZGl0b3IucmVhZE9ubHkoKSk7XG4gICAgfSk7XG4gICAgdmFyIHVwZGF0ZUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc1VwZGF0aW5nKSB7XG4gICAgICAgIGlzVXBkYXRpbmcgPSB0cnVlO1xuICAgICAgICBlZGl0b3Iuc2V0VmFsdWUob2JqZWN0RWRpdG9yLmtvVGV4dFZhbHVlKCkgfHwgXCJcIik7XG4gICAgICAgIGlzVXBkYXRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciB2YWx1ZVN1YnNjcmlwdGlvbiA9IG9iamVjdEVkaXRvci5rb1RleHRWYWx1ZS5zdWJzY3JpYmUodXBkYXRlQ2FsbGJhY2spO1xuICAgIHVwZGF0ZUNhbGxiYWNrKCk7XG4gICAgdmFyIHZpc2liaWxpdHlTdWJzY3JpcHRpb24gPSBvYmplY3RFZGl0b3Iua29BY3RpdmVWaWV3LnN1YnNjcmliZShcbiAgICAgIChuZXdWaWV3KSA9PiB7XG4gICAgICAgIGlmIChuZXdWaWV3ICE9PSBcImZvcm1cIikge1xuICAgICAgICAgIGVkaXRvci5yZXNpemUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICB2YXIgY29tcGxldGVyID0ge1xuICAgICAgaWRlbnRpZmllclJlZ2V4cHM6IFtJRF9SRUdFWFBdLFxuICAgICAgaW5zZXJ0TWF0Y2g6IGluc2VydE1hdGNoLFxuICAgICAgZ2V0Q29tcGxldGlvbnM6IChlZGl0b3IsIHNlc3Npb24sIHBvcywgcHJlZml4LCBjYWxsYmFjaykgPT4ge1xuICAgICAgICB2YXIgcHJldklkZW50aWZpZXIgPSBsYW5nVXRpbHMucmV0cmlldmVQcmVjZWRpbmdJZGVudGlmaWVyKFxuICAgICAgICAgIHNlc3Npb24uZ2V0TGluZShwb3Mucm93KSxcbiAgICAgICAgICBwb3MuY29sdW1uIC0gMVxuICAgICAgICApO1xuICAgICAgICB2YXIgY29tcGxldGlvbnMgPSBkb0dldENvbXBsZXRpb25zKFxuICAgICAgICAgIHByZXZJZGVudGlmaWVyLFxuICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICBjb25maWdzLFxuICAgICAgICAgIGNvbXBsZXRlclxuICAgICAgICApO1xuICAgICAgICBjYWxsYmFjayhudWxsLCBjb21wbGV0aW9ucyk7XG4gICAgICB9LFxuICAgICAgZ2V0RG9jVG9vbHRpcDogZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgaXRlbS5kb2NIVE1MID1cbiAgICAgICAgICBcIjxkaXYgc3R5bGU9J21heC13aWR0aDogMzAwcHg7IHdoaXRlLXNwYWNlOiBub3JtYWw7Jz5cIiArXG4gICAgICAgICAgaXRlbS5tZXRhICtcbiAgICAgICAgICBcIjwvZGl2PlwiO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGxhbmdUb29scy5zZXRDb21wbGV0ZXJzKFtjb21wbGV0ZXJdKTtcbiAgICBlZGl0b3Iuc2V0T3B0aW9ucyh7XG4gICAgICBlbmFibGVCYXNpY0F1dG9jb21wbGV0aW9uOiB0cnVlLFxuICAgICAgZW5hYmxlTGl2ZUF1dG9jb21wbGV0aW9uOiB0cnVlLFxuICAgIH0pO1xuXG4gICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhlbGVtZW50LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YWx1ZVN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG4gICAgICB2aXNpYmlsaXR5U3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTtcbiAgICAgIGVkaXRvci5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eUN1c3RvbUVkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gIHByaXZhdGUgd2lkZ2V0SlNPTlZhbHVlOiBhbnk7XG4gIHB1YmxpYyBvblZhbHVlQ2hhbmdlZENhbGxiYWNrOiAobmV3VmFsdWU6IGFueSkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksIHdpZGdldEpTT046IGFueSA9IG51bGwpIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gICAgdGhpcy53aWRnZXRKU09OVmFsdWUgPSB3aWRnZXRKU09OO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzW1wia29BZnRlclJlbmRlclwiXSA9IGZ1bmN0aW9uIChjb21wb25lbnRJbmZvKSB7XG4gICAgICBjb25zdCBlbCA9IGNvbXBvbmVudEluZm8uZWxlbWVudC5uZXh0U2libGluZztcbiAgICAgIHNlbGYuZG9BZnRlclJlbmRlcihlbCk7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjdXN0b21cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IHdpZGdldEpTT04oKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKU09OVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlQ2hhbmdpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzVmFsdWVDaGFuZ2luZykgcmV0dXJuO1xuICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nID0gdHJ1ZTtcbiAgICBzdXBlci5vblZhbHVlQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2VkQ2FsbGJhY2spXG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkQ2FsbGJhY2sodGhpcy5rb1ZhbHVlKCkpO1xuICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nID0gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGNoZWNrRm9yRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5jaGVja0ZvckVycm9ycygpO1xuICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICB2YXIgZXJyb3JUZXh0ID0gdGhpcy53aWRnZXRWYWxpZGF0ZSgpO1xuICAgIGlmICghIWVycm9yVGV4dCkge1xuICAgICAgdGhpcy5rb0Vycm9yVGV4dChlcnJvclRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gISFlcnJvclRleHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB3aWRnZXRSZW5kZXIoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKU09OID8gdGhpcy53aWRnZXRKU09OLnJlbmRlciA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIHdpZGdldFZhbGlkYXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SlNPTiAmJiB0aGlzLndpZGdldEpTT04udmFsaWRhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLndpZGdldEpTT04udmFsaWRhdGUodGhpcywgdGhpcy5rb1ZhbHVlKCkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZG9BZnRlclJlbmRlcihlbCkge1xuICAgIGlmICghIWVsICYmIHRoaXMud2lkZ2V0UmVuZGVyKSB0aGlzLndpZGdldFJlbmRlcih0aGlzLCBlbCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3IgfSBmcm9tIFwiLi9wcm9wZXJ0eU1vZGFsRWRpdG9yXCI7XG5pbXBvcnQge1xuICBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UsXG4gIElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zLFxufSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckJhc2VcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeSB9IGZyb20gXCIuL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuaW1wb3J0IHsgRWRpdGFibGVPYmplY3QgfSBmcm9tIFwiLi9lZGl0YWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSBcIi4uL3N1cnZleUhlbHBlclwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3IgZXh0ZW5kcyBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yIHtcbiAgcHJpdmF0ZSBzdGF0aWMgc2tpcFByb3BlcnR5TmFtZXMgPSBbXCJ3aWR0aFwiLCBcIm1pbldpZHRoXCIsIFwibWF4V2lkdGhcIl07XG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFF1ZXN0aW9uTmFtZSA9IFwicXVlc3Rpb25cIjtcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVKc29uRnJvbVF1ZXN0aW9uKG9iajogYW55LCByZWFkT25seTogYm9vbGVhbik6IGFueSB7XG4gICAgdmFyIHFqc29uID0gbmV3IFN1cnZleS5Kc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KG9iaik7XG4gICAgcWpzb24ubmFtZSA9IFN1cnZleVByb3BlcnR5RGVmYXVsdFZhbHVlRWRpdG9yLmRlZmF1bHRRdWVzdGlvbk5hbWU7XG4gICAgcWpzb24udHlwZSA9IG9iai5nZXRUeXBlKCk7XG4gICAgaWYgKHFqc29uLnR5cGUgPT0gXCJleHByZXNzaW9uXCIpIHtcbiAgICAgIHFqc29uLnR5cGUgPSBcInRleHRcIjtcbiAgICB9XG5cbiAgICBpZiAoISFxanNvbi5jZWxsVHlwZSAmJiBxanNvbi50eXBlID09IFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIikge1xuICAgICAgcWpzb24udHlwZSA9IHFqc29uLmNlbGxUeXBlO1xuICAgICAgZGVsZXRlIHFqc29uW1wiY2VsbFR5cGVcIl07XG4gICAgfVxuXG4gICAgU3VydmV5UHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3IuZmlsdGVySnNvblByb3BlcnRpZXMocWpzb24pO1xuXG4gICAgcWpzb24udGl0bGVMb2NhdGlvbiA9IFwiaGlkZGVuXCI7XG4gICAgLy9xanNvbi5zaG93Q2xlYXJCdXR0b24gPSB0cnVlO1xuICAgIHFqc29uLnJlYWRPbmx5ID0gcmVhZE9ubHk7XG4gICAgcmV0dXJuIHFqc29uO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIGZpbHRlckpzb25Qcm9wZXJ0aWVzKHFqc29uOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0pIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IFN1cnZleVByb3BlcnR5RGVmYXVsdFZhbHVlRWRpdG9yLnNraXBQcm9wZXJ0eU5hbWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gcHJvcGVydGllc1tpXTtcbiAgICAgIGlmICghIXFqc29uW25hbWVdKSB7XG4gICAgICAgIGRlbGV0ZSBxanNvbltuYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVTdXJ2ZXlGcm9tSnNvblF1ZXN0aW9uKFxuICAgIHF1ZXN0aW9uSnNvbjogYW55LFxuICAgIG9wdGlvbnM6IElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zLFxuICAgIHN1cnZleU5hbWU6IHN0cmluZ1xuICApOiBTdXJ2ZXkuU3VydmV5IHtcbiAgICB2YXIganNvbiA9IHtcbiAgICAgIHF1ZXN0aW9uczogW10sXG4gICAgICBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IGZhbHNlLFxuICAgICAgc2hvd1F1ZXN0aW9uTnVtYmVyczogXCJvZmZcIixcbiAgICAgIHRleHRVcGRhdGVNb2RlOiBcIm9uVHlwaW5nXCIsXG4gICAgfTtcbiAgICBTdXJ2ZXlIZWxwZXIudXBkYXRlUXVlc3Rpb25Kc29uKHF1ZXN0aW9uSnNvbik7XG4gICAganNvbi5xdWVzdGlvbnMucHVzaChxdWVzdGlvbkpzb24pO1xuICAgIHZhciBzdXJ2ZXkgPSAhIW9wdGlvbnNcbiAgICAgID8gb3B0aW9ucy5jcmVhdGVTdXJ2ZXkoanNvbiwgc3VydmV5TmFtZSlcbiAgICAgIDogbmV3IFN1cnZleS5TdXJ2ZXkoanNvbik7XG4gICAgU3VydmV5UHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3IudXBkYXRlU3VydmV5U3R5bGUoc3VydmV5KTtcbiAgICByZXR1cm4gc3VydmV5O1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlU3VydmV5U3R5bGUoc3VydmV5OiBTdXJ2ZXkuU3VydmV5KSB7XG4gICAgc3VydmV5LmNzcy5ib2R5ICs9IFwiIHN2ZC1wcm9wZXJ0eS1lZGl0b3Itc3VydmV5XCI7XG4gICAgc3VydmV5LmNzcy5wYWdlLnJvb3QgKz0gXCIgc3ZkLXByb3BlcnR5LWVkaXRvci1zdXJ2ZXktcGFnZVwiO1xuICAgIGlmICghIXN1cnZleS5jc3MucXVlc3Rpb24pIHtcbiAgICAgIHN1cnZleS5jc3MucXVlc3Rpb24ubWFpblJvb3QgKz0gXCIgc3ZkLXN1cnZleS1ub3BhZGRpbmdcIjtcbiAgICB9XG4gIH1cbiAgcHVibGljIHN1cnZleTogU3VydmV5LlN1cnZleTtcbiAga29TdXJ2ZXk6IGFueTtcbiAgcHJvdGVjdGVkIGN1cnJlbnRPYmplY3Q6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgICB0aGlzLmtvU3VydmV5ID0ga28ub2JzZXJ2YWJsZShcbiAgICAgICEhdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5jcmVhdGVTdXJ2ZXkoe30sIFwiZGVmYXVsdFZhbHVlRWRpdG9yXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZS5yZXNldFwiKTtcbiAgfVxuICBwdWJsaWMgcmVmcmVzaFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBlLnJlZnJlc2hcIik7XG4gIH1cbiAgcHVibGljIHJlc2V0VmFsdWUobW9kZWw6IFN1cnZleVByb3BlcnR5RGVmYXVsdFZhbHVlRWRpdG9yKSB7XG4gICAgbW9kZWxcbiAgICAgIC5rb1N1cnZleSgpXG4gICAgICAuY2xlYXJWYWx1ZShTdXJ2ZXlQcm9wZXJ0eURlZmF1bHRWYWx1ZUVkaXRvci5kZWZhdWx0UXVlc3Rpb25OYW1lKTtcbiAgfVxuICBwdWJsaWMgcmVmcmVzaFN1cnZleShtb2RlbDogU3VydmV5UHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3IpIHtcbiAgICBtb2RlbC5jcmVhdGVTdXJ2ZXkoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWVUZXh0KHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGUuZW1wdHlcIik7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgYmVmb3JlU2hvd0NvcmUoKSB7XG4gICAgc3VwZXIuYmVmb3JlU2hvd0NvcmUoKTtcbiAgICB0aGlzLmNyZWF0ZVN1cnZleSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImRlZmF1bHQtdmFsdWVcIjtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlU3VydmV5KCkge1xuICAgIHZhciBqc29uID0gdGhpcy5idWlsZFF1ZXN0aW9uSnNvbigpO1xuICAgIGlmICghIWpzb24pIHtcbiAgICAgIHRoaXMuc3VydmV5ID0gU3VydmV5UHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3IuY3JlYXRlU3VydmV5RnJvbUpzb25RdWVzdGlvbihcbiAgICAgICAganNvbixcbiAgICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgICBcImRlZmF1bHRWYWx1ZUVkaXRvclwiXG4gICAgICApO1xuXG4gICAgICB0aGlzLnN1cnZleS5zZXRWYWx1ZShcbiAgICAgICAgU3VydmV5UHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3IuZGVmYXVsdFF1ZXN0aW9uTmFtZSxcbiAgICAgICAgdGhpcy5nZXRTdXJ2ZXlJbml0aWFsVmFsdWUoKVxuICAgICAgKTtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHRoaXMuc3VydmV5Lm9uVmFsdWVDaGFuZ2VkLmFkZChmdW5jdGlvbiAoc2VuZGVyOiBhbnksIG9wdGlvbnM6IGFueSkge1xuICAgICAgICBzZWxmLmtvVmFsdWUoc2VsZi5nZXRTdXJ2ZXlSZXN1bHQoKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdXJ2ZXkgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmtvU3VydmV5KHRoaXMuc3VydmV5KTtcbiAgfVxuICBwcm90ZWN0ZWQgYnVpbGRRdWVzdGlvbkpzb24oKTogYW55IHtcbiAgICB0aGlzLmN1cnJlbnRPYmplY3QgPSB0aGlzLmdldE9iamVjdCgpO1xuICAgIGlmICghdGhpcy5jdXJyZW50T2JqZWN0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gU3VydmV5UHJvcGVydHlEZWZhdWx0VmFsdWVFZGl0b3IuY3JlYXRlSnNvbkZyb21RdWVzdGlvbihcbiAgICAgIHRoaXMuY3VycmVudE9iamVjdCxcbiAgICAgIHRoaXMucmVhZE9ubHkoKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldE9iamVjdCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm9iamVjdDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3VydmV5SW5pdGlhbFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMua29WYWx1ZSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRTdXJ2ZXlSZXN1bHQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkuZ2V0VmFsdWUoXG4gICAgICBTdXJ2ZXlQcm9wZXJ0eURlZmF1bHRWYWx1ZUVkaXRvci5kZWZhdWx0UXVlc3Rpb25OYW1lXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlUcmlnZ2VyVmFsdWVFZGl0b3IgZXh0ZW5kcyBTdXJ2ZXlQcm9wZXJ0eURlZmF1bHRWYWx1ZUVkaXRvciB7XG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZVRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZGVmYXVsdC12YWx1ZVwiO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVEeW5hbWljUHJvcGVydGllcygpIHtcbiAgICBzdXBlci51cGRhdGVEeW5hbWljUHJvcGVydGllcygpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRPYmplY3QgIT0gdGhpcy5nZXRPYmplY3QoKSkge1xuICAgICAgdGhpcy5jcmVhdGVTdXJ2ZXkoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldE9iamVjdCgpOiBhbnkge1xuICAgIHZhciBzdXJ2ZXkgPSBFZGl0YWJsZU9iamVjdC5nZXRTdXJ2ZXkodGhpcy5vYmplY3QpO1xuICAgIGlmICghc3VydmV5IHx8ICF0aGlzLnByb3BlcnR5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcHJvcE5hbWUgPSB0aGlzLmdldERlcGVuZE9uUHJvcE5hbWUoKTtcbiAgICBpZiAoIXByb3BOYW1lKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcXVlc3Rpb25OYW1lID0gdGhpcy5vYmplY3RbcHJvcE5hbWVdO1xuICAgIHJldHVybiAhIXF1ZXN0aW9uTmFtZSA/IHN1cnZleS5nZXRRdWVzdGlvbkJ5TmFtZShxdWVzdGlvbk5hbWUpIDogbnVsbDtcbiAgfVxuICBwcml2YXRlIGdldERlcGVuZE9uUHJvcE5hbWUoKTogc3RyaW5nIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IFN1cnZleS5TZXJpYWxpemVyLmdldFByb3BlcnRpZXNCeU9iaih0aGlzLm9iamVjdCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZHBzID0gcHJvcGVydGllc1tpXS5nZXREZXBlbmRlZFByb3BlcnRpZXMoKTtcbiAgICAgIGlmICghIWRwcyAmJiBkcHMuaW5kZXhPZih0aGlzLnByb3BlcnR5Lm5hbWUpID4gLTEpXG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzW2ldLm5hbWU7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eURlZmF1bHRSb3dWYWx1ZUVkaXRvckJhc2UgZXh0ZW5kcyBTdXJ2ZXlQcm9wZXJ0eURlZmF1bHRWYWx1ZUVkaXRvciB7XG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZVRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZGVmYXVsdC12YWx1ZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInRyaWdnZXJ2YWx1ZVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRTdXJ2ZXlJbml0aWFsVmFsdWUoKTogYW55IHtcbiAgICB2YXIgcmVzID0gdGhpcy5rb1ZhbHVlKCk7XG4gICAgaWYgKCFyZXMpIHJldHVybiByZXM7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgIHJlcyA9IFtyZXNdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRTdXJ2ZXlSZXN1bHQoKTogYW55IHtcbiAgICB2YXIgcmVzID0gc3VwZXIuZ2V0U3VydmV5UmVzdWx0KCk7XG4gICAgaWYgKHJlcyAmJiBBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgIGlmIChyZXMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHJlc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlEZWZhdWx0Um93VmFsdWVFZGl0b3IgZXh0ZW5kcyBTdXJ2ZXlQcm9wZXJ0eURlZmF1bHRSb3dWYWx1ZUVkaXRvckJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgfVxuICBwcm90ZWN0ZWQgYnVpbGRRdWVzdGlvbkpzb24oKTogYW55IHtcbiAgICB2YXIgcWpzb24gPSBzdXBlci5idWlsZFF1ZXN0aW9uSnNvbigpO1xuICAgIHFqc29uLnJvd0NvdW50ID0gMTtcbiAgICBxanNvbi5taW5Sb3dDb3VudCA9IDE7XG4gICAgcWpzb24ubWF4Um93Q291bnQgPSAxO1xuICAgIHFqc29uLmNvbHVtbnNMb2NhdGlvbiA9IFwidmVydGljYWxcIjtcbiAgICByZXR1cm4gcWpzb247XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicm93dmFsdWVcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlEZWZhdWx0UGFuZWxWYWx1ZUVkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5RGVmYXVsdFJvd1ZhbHVlRWRpdG9yQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICB9XG4gIHByb3RlY3RlZCBidWlsZFF1ZXN0aW9uSnNvbigpOiBhbnkge1xuICAgIHZhciBxanNvbiA9IHN1cGVyLmJ1aWxkUXVlc3Rpb25Kc29uKCk7XG4gICAgcWpzb24ucGFuZWxDb3VudCA9IDE7XG4gICAgcWpzb24ubWluUGFuZWxDb3VudCA9IDE7XG4gICAgcWpzb24ubWF4UGFuZWxDb3VudCA9IDE7XG4gICAgcmV0dXJuIHFqc29uO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhbmVsdmFsdWVcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlTZXRFZGl0b3IgZXh0ZW5kcyBTdXJ2ZXlQcm9wZXJ0eURlZmF1bHRWYWx1ZUVkaXRvciB7XG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNldFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZVRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZGVmYXVsdC12YWx1ZVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRTdXJ2ZXlJbml0aWFsVmFsdWUoKTogYW55IHtcbiAgICB2YXIgcmVzID0gdGhpcy5rb1ZhbHVlKCk7XG4gICAgaWYgKCFyZXMpIHJldHVybiByZXM7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgIHJlcyA9IFtyZXNdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBidWlsZFF1ZXN0aW9uSnNvbigpOiBhbnkge1xuICAgIHZhciBxdWVzdGlvbiA9IG5ldyBTdXJ2ZXkuUXVlc3Rpb25DaGVja2JveChcInExXCIpO1xuICAgIHZhciBoYXNUYWdib3ggPSAhIVN1cnZleS5TZXJpYWxpemVyLmZpbmRDbGFzcyhcInRhZ2JveFwiKTtcbiAgICBxdWVzdGlvbi5oYXNTZWxlY3RBbGwgPSAhaGFzVGFnYm94O1xuICAgIGlmICghIXRoaXMucHJvcGVydHkpIHtcbiAgICAgIHF1ZXN0aW9uLmNob2ljZXMgPSB0aGlzLmdldFByb3BlcnR5Q2hvaWNlcygpO1xuICAgIH1cbiAgICB2YXIganNvbiA9IFN1cnZleVByb3BlcnR5RGVmYXVsdFZhbHVlRWRpdG9yLmNyZWF0ZUpzb25Gcm9tUXVlc3Rpb24oXG4gICAgICBxdWVzdGlvbixcbiAgICAgIHRoaXMucmVhZE9ubHkoKVxuICAgICk7XG4gICAgaWYgKGhhc1RhZ2JveCkge1xuICAgICAganNvbi50eXBlID0gXCJ0YWdib3hcIjtcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgcHJpdmF0ZSBzZXRDaG9pY2VzKGNob2ljZXM6IEFycmF5PGFueT4pIHtcbiAgICB2YXIgc3VydmV5ID0gdGhpcy5rb1N1cnZleSgpO1xuICAgIGlmICghc3VydmV5IHx8IHN1cnZleS5nZXRBbGxRdWVzdGlvbnMoKS5sZW5ndGggPiAxKSByZXR1cm47XG4gICAgc3VydmV5LmdldEFsbFF1ZXN0aW9ucygpWzBdLmNob2ljZXMgPSBjaG9pY2VzO1xuICB9XG4gIHByaXZhdGUgZ2V0UHJvcGVydHlDaG9pY2VzKCk6IEFycmF5PGFueT4ge1xuICAgIGlmICghdGhpcy5wcm9wZXJ0eSkgcmV0dXJuIFtdO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eS5nZXRDaG9pY2VzKHRoaXMub2JqZWN0LCBmdW5jdGlvbiAoY2hvaWNlczogYW55KSB7XG4gICAgICBzZWxmLnNldENob2ljZXMoY2hvaWNlcyk7XG4gICAgfSk7XG4gIH1cbn1cblxuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyRWRpdG9yKFxuICBcInZhbHVlXCIsXG4gIGZ1bmN0aW9uIChwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSk6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlQcm9wZXJ0eURlZmF1bHRWYWx1ZUVkaXRvcihwcm9wZXJ0eSk7XG4gIH1cbik7XG5cblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcbiAgXCJ0cmlnZ2VydmFsdWVcIixcbiAgZnVuY3Rpb24gKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVByb3BlcnR5VHJpZ2dlclZhbHVlRWRpdG9yKHByb3BlcnR5KTtcbiAgfVxuKTtcblxuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyRWRpdG9yKFxuICBcInJvd3ZhbHVlXCIsXG4gIGZ1bmN0aW9uIChwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSk6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlQcm9wZXJ0eURlZmF1bHRSb3dWYWx1ZUVkaXRvcihwcm9wZXJ0eSk7XG4gIH1cbik7XG5cblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcbiAgXCJwYW5lbHZhbHVlXCIsXG4gIGZ1bmN0aW9uIChwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSk6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlQcm9wZXJ0eURlZmF1bHRQYW5lbFZhbHVlRWRpdG9yKHByb3BlcnR5KTtcbiAgfVxuKTtcblxuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyRWRpdG9yKFxuICBcInNldFwiLFxuICBmdW5jdGlvbiAocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgU3VydmV5UHJvcGVydHlTZXRFZGl0b3IocHJvcGVydHkpO1xuICB9XG4pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0IHsgRWRpdGFibGVPYmplY3QgfSBmcm9tIFwiLi9lZGl0YWJsZU9iamVjdFwiO1xuaW1wb3J0IHsgSVN1cnZleUNyZWF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzXCI7XG5pbXBvcnQge1xuICBnZXRGaXJzdE5vblRleHRFbGVtZW50LFxuICBnZXROb2Rlc0Zyb21Lb0NvbXBvbmVudEluZm8sXG59IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zIGV4dGVuZHMgSVN1cnZleUNyZWF0b3JPcHRpb25zIHtcbiAgc2hvd0FwcGx5QnV0dG9uSW5FZGl0b3JzOiBib29sZWFuO1xuICB1c2VUYWJzSW5FbGVtZW50RWRpdG9yOiBib29sZWFuO1xuICBvbklzRWRpdG9yUmVhZE9ubHlDYWxsYmFjayhcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIGVkaXRvcjogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlLFxuICAgIHJlYWRPbmx5OiBib29sZWFuXG4gICk6IGJvb2xlYW47XG4gIG9uUHJvcGVydHlFZGl0b3JPYmplY3RTZXRDYWxsYmFjayhcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIGVkaXRvcjogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlXG4gICk7XG4gIG9uUHJvcGVydHlFZGl0b3JLZXlEb3duQ2FsbGJhY2soXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgb2JqOiBTdXJ2ZXkuQmFzZSxcbiAgICBlZGl0b3I6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSxcbiAgICBldmVudDogS2V5Ym9hcmRFdmVudFxuICApO1xuICBvblByb3BlcnR5RWRpdG9yTW9kYWxTaG93RGVzY3JpcHRpb25DYWxsYmFjayhcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBvYmo6IFN1cnZleS5CYXNlXG4gICk6IGFueTtcbiAgb25Db25kaXRpb25WYWx1ZVN1cnZleUNyZWF0ZWRDYWxsQmFjayhcbiAgICB2YWx1ZVF1ZXN0aW9uTmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgZWRpdG9yOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UsXG4gICAgc3VydmV5OiBTdXJ2ZXkuU3VydmV5XG4gICk7XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UgaW1wbGVtZW50cyBTdXJ2ZXkuSUxvY2FsaXphYmxlT3duZXIge1xuICBwcml2YXRlIG9iamVjdFZhbHVlOiBhbnk7XG4gIHByaXZhdGUgcGFyZW50TGlzdFZhbHVlOiBBcnJheTxTdXJ2ZXkuQmFzZT47XG4gIHByaXZhdGUgcGFyZW50UmVhZE9ubHlWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHZhbHVlVXBkYXRpbmdDb3VudGVyOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIG9wdGlvbnNWYWx1ZTogSVN1cnZleU9iamVjdEVkaXRvck9wdGlvbnMgPSBudWxsO1xuICBwcml2YXRlIHByb3BlcnR5XzogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eTtcbiAgcHJpdmF0ZSBpc1JlcXVpcmVkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB0aXRsZVZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgc2hvd0Rpc3BsYXlOYW1lVmFsdWU6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9kaXNwbGF5TmFtZVZhbHVlID0ga28ub2JzZXJ2YWJsZTxzdHJpbmc+KCk7XG4gIHByaXZhdGUgZ2V0IGRpc3BsYXlOYW1lVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlOYW1lVmFsdWUoKTtcbiAgfVxuICBwcml2YXRlIHNldCBkaXNwbGF5TmFtZVZhbHVlKHZhbCkge1xuICAgIHRoaXMuX2Rpc3BsYXlOYW1lVmFsdWUodmFsKTtcbiAgfVxuICBwdWJsaWMgc2hvd0hlbHBUZXh0OiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIHBhcmVudE9iajogU3VydmV5LkJhc2U7XG4gIHB1YmxpYyBwYXJlbnRQcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eTtcbiAgcHVibGljIGtvVmFsdWUgPSBrby5vYnNlcnZhYmxlPGFueT4oKTtcbiAgcHVibGljIGtvVGV4dDogYW55O1xuICBwdWJsaWMga29Jc0RlZmF1bHQ6IGFueTtcbiAgcHVibGljIGtvSGFzRXJyb3I6IGFueTtcbiAgcHVibGljIGtvRXJyb3JUZXh0OiBhbnk7XG4gIHB1YmxpYyBrb0Rpc3BsYXlFcnJvcjogYW55O1xuICBwdWJsaWMgaXNJbnBsYWNlUHJvcGVydHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHJlYWRPbmx5OiBhbnk7XG4gIHB1YmxpYyBrb01heExlbmd0aDogYW55O1xuICBwdWJsaWMga29NYXhWYWx1ZTogYW55O1xuICBwdWJsaWMga29NaW5WYWx1ZTogYW55O1xuICBwdWJsaWMgb25DaGFuZ2VkOiAobmV3VmFsdWU6IGFueSkgPT4gYW55O1xuICBwdWJsaWMgb25HZXRMb2NhbGU6ICgpID0+IHN0cmluZztcbiAgcHVibGljIG9uVmFsdWVVcGRhdGVkOiAobmV3VmFsdWU6IGFueSkgPT4gYW55O1xuICBwdWJsaWMgc2V0dXAoKSB7fVxuICBwdWJsaWMgYmVmb3JlU2hvdygpIHt9XG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgdGhpcy5wcm9wZXJ0eV8gPSBwcm9wZXJ0eTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb1ZhbHVlLnN1YnNjcmliZShmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgIHNlbGYub25rb1ZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5rb1RleHQgPSBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gc2VsZi5nZXRWYWx1ZVRleHQoc2VsZi5rb1ZhbHVlKCkpO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc0RlZmF1bHQgPSBrby5jb21wdXRlZChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc2VsZi5wcm9wZXJ0eVxuICAgICAgICA/IHNlbGYucHJvcGVydHkuaXNEZWZhdWx0VmFsdWUoc2VsZi5rb1ZhbHVlKCkpXG4gICAgICAgIDogZmFsc2U7XG4gICAgfSk7XG4gICAgdGhpcy5rb0hhc0Vycm9yID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gICAgdGhpcy5rb0Vycm9yVGV4dCA9IGtvLm9ic2VydmFibGUoXCJcIik7XG4gICAgdGhpcy5rb0Rpc3BsYXlFcnJvciA9IGtvLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzZWxmLmtvSGFzRXJyb3IoKSAmJiAhIXNlbGYua29FcnJvclRleHQoKTtcbiAgICB9KTtcbiAgICB0aGlzLmtvTWF4TGVuZ3RoID0ga28uY29tcHV0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhc2VsZi5wcm9wZXJ0eSAmJlxuICAgICAgICAhIXNlbGYucHJvcGVydHlbXCJtYXhMZW5ndGhcIl0gJiZcbiAgICAgICAgc2VsZi5wcm9wZXJ0eVtcIm1heExlbmd0aFwiXSA+IDBcbiAgICAgICAgPyBzZWxmLnByb3BlcnR5W1wibWF4TGVuZ3RoXCJdXG4gICAgICAgIDogNTI0Mjg4O1xuICAgIH0pO1xuICAgIHRoaXMua29NYXhWYWx1ZSA9IGtvLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIXNlbGYucHJvcGVydHkgJiYgIXNlbGYuaXNWYWx1ZUVtcHR5KHNlbGYucHJvcGVydHkubWF4VmFsdWUpXG4gICAgICAgID8gc2VsZi5wcm9wZXJ0eS5tYXhWYWx1ZVxuICAgICAgICA6IFwiXCI7XG4gICAgfSk7XG4gICAgdGhpcy5rb01pblZhbHVlID0ga28uY29tcHV0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhc2VsZi5wcm9wZXJ0eSAmJiAhc2VsZi5pc1ZhbHVlRW1wdHkoc2VsZi5wcm9wZXJ0eS5taW5WYWx1ZSlcbiAgICAgICAgPyBzZWxmLnByb3BlcnR5Lm1pblZhbHVlXG4gICAgICAgIDogXCJcIjtcbiAgICB9KTtcbiAgICB0aGlzLnNldElzUmVxdWlyZWQoKTtcbiAgICB0aGlzLnNldFRpdGxlQW5kRGlzcGxheU5hbWUoKTtcbiAgICB0aGlzLnJlYWRPbmx5ID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0aW5nVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMua29WYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgZWRpdGluZ1ZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgdGhpcy5rb1ZhbHVlKG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICB0aHJvdyBcImVkaXRvclR5cGUgaXMgbm90IGRlZmluZWRcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvclR5cGU7XG4gIH1cbiAgcHVibGljIGdldCBwcm9wZXJ0eSgpOiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eV87XG4gIH1cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eS5kZWZhdWx0VmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0YWJsZVByb3BlcnR5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5ID8gdGhpcy5wcm9wZXJ0eS5uYW1lIDogXCJcIjtcbiAgfVxuICBwcml2YXRlIGdldFJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnBhcmVudFJlYWRPbmx5KSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgcmVzID0gdGhpcy5wcm9wZXJ0eSA/IHRoaXMucHJvcGVydHkucmVhZE9ubHkgOiBmYWxzZTtcbiAgICBpZiAoISF0aGlzLm9wdGlvbnMgJiYgISF0aGlzLnByb3BlcnR5ICYmICEhdGhpcy5vYmplY3QpIHtcbiAgICAgIHJlcyA9IHRoaXMub3B0aW9ucy5vbklzRWRpdG9yUmVhZE9ubHlDYWxsYmFjayh0aGlzLm9iamVjdCwgdGhpcywgcmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGl0bGVWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGlzSW5Qcm9wZXJ0eUdyaWRWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZ2V0IGlzSW5Qcm9wZXJ0eUdyaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNJblByb3BlcnR5R3JpZFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNJblByb3BlcnR5R3JpZCh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsID09PSB0aGlzLmlzSW5Qcm9wZXJ0eUdyaWRWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuaXNJblByb3BlcnR5R3JpZFZhbHVlID0gdmFsO1xuICAgIHRoaXMuc2V0VGl0bGVBbmREaXNwbGF5TmFtZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNEaXBsYXlOYW1lVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zaG93RGlzcGxheU5hbWUgJiZcbiAgICAgICF0aGlzLmlzSW5Qcm9wZXJ0eUdyaWQgJiZcbiAgICAgICF0aGlzLmlzU2hvd2luZ01vZGFsKCkgJiZcbiAgICAgICF0aGlzLmlzSW5wbGFjZVByb3BlcnR5ICYmXG4gICAgICB0aGlzLmRpc3BsYXlOYW1lICE9PSBcIi5cIiAmJlxuICAgICAgISF0aGlzLmRpc3BsYXlOYW1lXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNTaG93aW5nTW9kYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgZGlzcGxheU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5TmFtZVZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0Rpc3BsYXlOYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dEaXNwbGF5TmFtZVZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0Rpc3BsYXlOYW1lKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvd0Rpc3BsYXlOYW1lVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBzaG93RGlzcGxheU5hbWVPblRvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0RpcGxheU5hbWVWaXNpYmxlICYmIHRoaXMuY2FuU2hvd0Rpc3BsYXlOYW1lT25Ub3A7XG4gIH1cbiAgcHVibGljIGdldCBjYW5TaG93RGlzcGxheU5hbWVPblRvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvcGVydHlIZWxwTG9jTmFtZSgpOiBzdHJpbmcge1xuICAgIHZhciBjbGFzc05hbWVzID0gdGhpcy5nZXRIZWxwUHJvcGVydHlDbGFzc05hbWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbG9jTmFtZSA9IFwicGVoZWxwLlwiICsgY2xhc3NOYW1lc1tpXSArIFwiX1wiICsgdGhpcy5wcm9wZXJ0eS5uYW1lO1xuICAgICAgaWYgKHRoaXMuaGFzTG9jU3RyaW5nKGxvY05hbWUpKSByZXR1cm4gbG9jTmFtZTtcbiAgICB9XG4gICAgbGV0IGxvY05hbWUgPSBcInBlaGVscC5cIiArIHRoaXMucHJvcGVydHkubmFtZTtcbiAgICByZXR1cm4gdGhpcy5oYXNMb2NTdHJpbmcobG9jTmFtZSkgPyBsb2NOYW1lIDogXCJcIjtcbiAgfVxuICBwcml2YXRlIGdldEhlbHBQcm9wZXJ0eUNsYXNzTmFtZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLm9iamVjdCkgcmV0dXJuIFtdO1xuICAgIHZhciB0eXBlID0gdGhpcy5vYmplY3QuZ2V0VHlwZSgpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgdHlwZUluZm8gPSBTdXJ2ZXkuU2VyaWFsaXplci5maW5kQ2xhc3ModHlwZSk7XG4gICAgd2hpbGUgKCEhdHlwZUluZm8pIHtcbiAgICAgIHJlcy5wdXNoKHR5cGVJbmZvLm5hbWUpO1xuICAgICAgaWYgKHR5cGVJbmZvLmZpbmQodGhpcy5wcm9wZXJ0eS5uYW1lKSkgcmV0dXJuIHJlcztcbiAgICAgIHR5cGVJbmZvID0gISF0eXBlSW5mby5wYXJlbnROYW1lXG4gICAgICAgID8gU3VydmV5LlNlcmlhbGl6ZXIuZmluZENsYXNzKHR5cGVJbmZvLnBhcmVudE5hbWUpXG4gICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IHByb3BlcnR5SGVscFRleHQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2hvd0hlbHBUZXh0KSByZXR1cm4gXCJcIjtcbiAgICB2YXIgbG9jTmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlIZWxwTG9jTmFtZSgpO1xuICAgIHJldHVybiB0aGlzLmhhc0xvY1N0cmluZyhsb2NOYW1lKSA/IHRoaXMuZ2V0TG9jU3RyaW5nKGxvY05hbWUpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvbnRlbnRUZW1wbGF0ZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBlZGl0b3JUeXBlID0gdGhpcy5pc01vZGFsID8gXCJtb2RhbC1jb250ZW50XCIgOiB0aGlzLmVkaXRvclR5cGVUZW1wbGF0ZTtcbiAgICByZXR1cm4gXCJzdmQtcHJvcGVydHktZWRpdG9yLVwiICsgZWRpdG9yVHlwZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGlzTW9kYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgb3JpZ2luYWxPYmplY3QoKTogYW55IHtcbiAgICByZXR1cm4gRWRpdGFibGVPYmplY3QuZ2V0T3JpZ2luYWxPYmplY3QodGhpcy5vYmplY3QpO1xuICB9XG4gIHB1YmxpYyBnZXQgb2JqZWN0KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0VmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBvYmplY3QodmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2V0T2JqZWN0Q29yZSh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBwYXJlbnRMaXN0KCk6IEFycmF5PFN1cnZleS5CYXNlPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50TGlzdFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFyZW50TGlzdCh2YWw6IEFycmF5PFN1cnZleS5CYXNlPikge1xuICAgIHRoaXMucGFyZW50TGlzdFZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgcGFyZW50UmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50UmVhZE9ubHlWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhcmVudFJlYWRPbmx5KHZhbDogYm9vbGVhbikge1xuICAgIGlmICh2YWwgPT0gdGhpcy5wYXJlbnRSZWFkT25seSkgcmV0dXJuO1xuICAgIHRoaXMucGFyZW50UmVhZE9ubHlWYWx1ZSA9IHZhbDtcbiAgICB0aGlzLnJlYWRPbmx5KHRoaXMuZ2V0UmVhZE9ubHkoKSk7XG4gIH1cbiAgcHVibGljIGdldCBvcmlnaW5hbFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JpZ2luYWxWYWx1ZSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRPcmlnaW5hbFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5vYmplY3RWYWx1ZSA/IHRoaXMub2JqZWN0VmFsdWVbdGhpcy5wcm9wZXJ0eS5uYW1lXSA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE9iamVjdENvcmUodmFsdWU6IGFueSkge1xuICAgIHRoaXMub2JqZWN0VmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHZhbHVlLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgICAgICB0aGlzLnByb3BlcnR5Lm5hbWUsXG4gICAgICAgICgpID0+IHRoaXMudXBkYXRlVmFsdWUoKSxcbiAgICAgICAgdGhpcy5wcm9wZXJ0eS5uYW1lXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnNldElzUmVxdWlyZWQoKTtcbiAgICB0aGlzLnNldFRpdGxlQW5kRGlzcGxheU5hbWUoKTtcbiAgICB0aGlzLnNldE9iamVjdCh0aGlzLm9iamVjdCk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZSgpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5wcm9wZXJ0eSkge1xuICAgICAgdGhpcy5vcHRpb25zLm9uUHJvcGVydHlFZGl0b3JPYmplY3RTZXRDYWxsYmFjayhcbiAgICAgICAgdGhpcy5wcm9wZXJ0eS5uYW1lLFxuICAgICAgICB0aGlzLm9iamVjdCxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5yZWFkT25seSh0aGlzLmdldFJlYWRPbmx5KCkpO1xuICB9XG5cbiAgcHVibGljIGdldFZhbHVlVGV4dCh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcHVibGljIGhhc0Vycm9yKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMua29IYXNFcnJvcih0aGlzLmNoZWNrRm9yRXJyb3JzKCkpO1xuICAgIHJldHVybiB0aGlzLmtvSGFzRXJyb3IoKTtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jU3RyaW5nKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBoYXNMb2NTdHJpbmcobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5oYXNTdHJpbmcobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBpc0N1cnJlbnRWYWx1ZUVtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmtvVmFsdWUoKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNoZWNrRm9yRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciBlcnJvclRleHQgPSBcIlwiO1xuICAgIGlmICh0aGlzLmlzUmVxdWlyZWQgfHwgdGhpcy5jaGVja0Zvckl0ZW1WYWx1ZSgpKSB7XG4gICAgICB2YXIgZXIgPSB0aGlzLmlzQ3VycmVudFZhbHVlRW1wdHk7XG4gICAgICBpZiAoZXIpIHtcbiAgICAgICAgZXJyb3JUZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJwZS5wcm9wZXJ0eUlzRW1wdHlcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmNoZWNrRXJyb3JPblVuaXF1ZSgpKSB7XG4gICAgICBlcnJvclRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInBlLnByb3BlcnR5SXNOb1VuaXF1ZVwiKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIWVycm9yVGV4dCAmJlxuICAgICAgdGhpcy5wcm9wZXJ0eSAmJlxuICAgICAgdGhpcy5vcHRpb25zICYmXG4gICAgICB0aGlzLm9wdGlvbnMub25HZXRFcnJvclRleHRPblZhbGlkYXRpb25DYWxsYmFja1xuICAgICkge1xuICAgICAgZXJyb3JUZXh0ID0gdGhpcy5vcHRpb25zLm9uR2V0RXJyb3JUZXh0T25WYWxpZGF0aW9uQ2FsbGJhY2soXG4gICAgICAgIHRoaXMucHJvcGVydHkubmFtZSxcbiAgICAgICAgdGhpcy5vcmlnaW5hbE9iamVjdCxcbiAgICAgICAgdGhpcy5rb1ZhbHVlKClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMua29FcnJvclRleHQoZXJyb3JUZXh0KTtcbiAgICByZXR1cm4gZXJyb3JUZXh0ICE9PSBcIlwiO1xuICB9XG4gIHByaXZhdGUgY2hlY2tFcnJvck9uVW5pcXVlKCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnByb3BlcnR5IHx8XG4gICAgICAhdGhpcy5wcm9wZXJ0eS5pc1VuaXF1ZSB8fFxuICAgICAgIUFycmF5LmlzQXJyYXkodGhpcy5wYXJlbnRMaXN0KVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFyZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucGFyZW50TGlzdFtpXSA9PT0gdGhpcy5vYmplY3QpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMucGFyZW50TGlzdFtpXVt0aGlzLnByb3BlcnR5Lm5hbWVdID09IHRoaXMua29WYWx1ZSgpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgY2hlY2tGb3JJdGVtVmFsdWUoKSB7XG4gICAgLy9UT0RPIFByb2JsZW0gaXMgaW4gODgyY2EzYWMgY29tbWl0LiBJdGVtVmFsdWUgd2l0aG91dCB2YWx1ZSBzaG91bGQgYmUgaW52YWxpZC4gTmVlZCB0byBiZXR0ZXIgZml4IGZvciB0aGUgcHJvYmxlbS5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcm9wZXJ0eSAmJlxuICAgICAgdGhpcy5wcm9wZXJ0eS5uYW1lID09PSBcInZhbHVlXCIgJiZcbiAgICAgIHRoaXMub2JqZWN0VmFsdWUgJiZcbiAgICAgIHR5cGVvZiB0aGlzLm9iamVjdFZhbHVlLmdldFR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgdGhpcy5vYmplY3RWYWx1ZS5nZXRUeXBlKCkgPT09IFwiaXRlbXZhbHVlXCJcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHNldElzUmVxdWlyZWQoKSB7XG4gICAgdGhpcy5pc1JlcXVpcmVkVmFsdWUgPSAhIXRoaXMucHJvcGVydHkgPyB0aGlzLnByb3BlcnR5LmlzUmVxdWlyZWQgOiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0VGl0bGVBbmREaXNwbGF5TmFtZSgpIHtcbiAgICB0aGlzLmRpc3BsYXlOYW1lVmFsdWUgPSB0aGlzLnByb3BlcnR5ID8gdGhpcy5wcm9wZXJ0eS5uYW1lIDogXCJcIjtcbiAgICB0aGlzLnRpdGxlVmFsdWUgPSBcIlwiO1xuICAgIGlmICghdGhpcy5wcm9wZXJ0eSkgcmV0dXJuO1xuICAgIHZhciBsb2NOYW1lID0gdGhpcy5wcm9wZXJ0eS5uYW1lO1xuICAgIHRoaXMuZGlzcGxheU5hbWVWYWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHlEaXNwbGF5TmFtZSh0aGlzLnByb3BlcnR5KTtcbiAgICB2YXIgdGl0bGUgPSBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0UHJvcGVydHlUaXRsZShsb2NOYW1lKTtcbiAgICB0aGlzLnRpdGxlVmFsdWUgPSB0aXRsZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvcGVydHlEaXNwbGF5TmFtZShwcm9wOiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KTogc3RyaW5nIHtcbiAgICBpZiAoISFwcm9wLmRpc3BsYXlOYW1lKSByZXR1cm4gcHJvcC5kaXNwbGF5TmFtZTtcbiAgICB2YXIgbG9jTmFtZSA9IHByb3AubmFtZTtcbiAgICByZXR1cm4gdGhpcy5pc0luUHJvcGVydHlHcmlkVmFsdWVcbiAgICAgID8gZWRpdG9yTG9jYWxpemF0aW9uLmdldFByb3BlcnR5TmFtZShsb2NOYW1lKVxuICAgICAgOiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0UHJvcGVydHlOYW1lSW5FZGl0b3IobG9jTmFtZSk7XG4gIH1cbiAgcHVibGljIGFwcGx5KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc0Vycm9yKCkpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnBlcmZvcm1BcHBseSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBwZXJmb3JtQXBwbHkoKSB7fVxuICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9uR2V0TG9jYWxlKSByZXR1cm4gdGhpcy5vbkdldExvY2FsZSgpO1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICB9XG4gIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXRSZW5kZXJlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcHVibGljIGdldCBvcHRpb25zKCk6IElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBvcHRpb25zKHZhbHVlOiBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9uc1ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vbk9wdGlvbnNDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uT3B0aW9uc0NoYW5nZWQoKSB7fVxuICBwdWJsaWMgc2V0T2JqZWN0KHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICB2YXIgZWRpdG9yT3B0aW9ucyA9IHRoaXMuY3JlYXRlRWRpdG9yT3B0aW9ucygpO1xuICAgICAgdGhpcy5vcHRpb25zLm9uU2V0UHJvcGVydHlFZGl0b3JPcHRpb25zQ2FsbGJhY2soXG4gICAgICAgIHRoaXMuZWRpdGFibGVQcm9wZXJ0eU5hbWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBlZGl0b3JPcHRpb25zXG4gICAgICApO1xuICAgICAgdGhpcy5vblNldEVkaXRvck9wdGlvbnMoZWRpdG9yT3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVFZGl0b3JPcHRpb25zKCk6IGFueSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHByb3RlY3RlZCBvblNldEVkaXRvck9wdGlvbnMoZWRpdG9yT3B0aW9uczogYW55KSB7fVxuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7fVxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdGVkVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCF0aGlzLnByb3BlcnR5KSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLnByb3BlcnR5Lm1pblZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlIDwgdGhpcy5wcm9wZXJ0eS5taW5WYWx1ZSkgcmV0dXJuIHRoaXMucHJvcGVydHkubWluVmFsdWU7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5wcm9wZXJ0eS5tYXhWYWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZSA+IHRoaXMucHJvcGVydHkubWF4VmFsdWUpIHJldHVybiB0aGlzLnByb3BlcnR5Lm1heFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGJlZ2luVmFsdWVVcGRhdGluZygpIHtcbiAgICB0aGlzLnZhbHVlVXBkYXRpbmdDb3VudGVyKys7XG4gIH1cbiAgcHJvdGVjdGVkIGVuZFZhbHVlVXBkYXRpbmcoKSB7XG4gICAgaWYgKHRoaXMudmFsdWVVcGRhdGluZ0NvdW50ZXIgPiAwKSB7XG4gICAgICB0aGlzLnZhbHVlVXBkYXRpbmdDb3VudGVyLS07XG4gICAgfVxuICB9XG4gIHB1YmxpYyB1cGRhdGVWYWx1ZSgpIHtcbiAgICB0aGlzLmJlZ2luVmFsdWVVcGRhdGluZygpO1xuICAgIHRoaXMua29WYWx1ZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgIHRoaXMua29FcnJvclRleHQoXCJcIik7XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLm9uVmFsdWVVcGRhdGVkKSB0aGlzLm9uVmFsdWVVcGRhdGVkKHRoaXMua29WYWx1ZSgpKTtcbiAgICB0aGlzLmVuZFZhbHVlVXBkYXRpbmcoKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlUHJvcGVydHlWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5vYmplY3RbdGhpcy5wcm9wZXJ0eS5uYW1lXSA9IG5ld1ZhbHVlO1xuICAgIGlmIChuZXdWYWx1ZSAhPSB0aGlzLm9iamVjdFt0aGlzLnByb3BlcnR5Lm5hbWVdKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5ICYmIHRoaXMub2JqZWN0XG4gICAgICA/IHRoaXMucHJvcGVydHkuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLm9iamVjdClcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwcml2YXRlIGlza29WYWx1ZUNoYW5naW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgb25rb1ZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMudmFsdWVVcGRhdGluZ0NvdW50ZXIgPiAwIHx8IHRoaXMuaXNrb1ZhbHVlQ2hhbmdpbmcpIHJldHVybjtcbiAgICB0aGlzLmlza29WYWx1ZUNoYW5naW5nID0gdHJ1ZTtcbiAgICB2YXIgY29waWVkVmFsdWUgPSBTdXJ2ZXkuSGVscGVycy5nZXRVbmJpbmRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgbmV3VmFsdWUgPSB0aGlzLmdldENvcnJlY3RlZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMucHJvcGVydHkgJiYgdGhpcy5vYmplY3QpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHRoaXMucHJvcGVydHkubmFtZSxcbiAgICAgICAgb2JqOiB0aGlzLm9iamVjdCxcbiAgICAgICAgdmFsdWU6IHRoaXMuZ2V0VmFsdWUoKSxcbiAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgICBkb1ZhbGlkYXRpb246IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIHRoaXMub3B0aW9ucy5vblZhbHVlQ2hhbmdpbmdDYWxsYmFjayhvcHRpb25zKTtcbiAgICAgIG5ld1ZhbHVlID0gb3B0aW9ucy5uZXdWYWx1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbmV3VmFsdWUgIT09IG51bGwgJiZcbiAgICAgIG5ld1ZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICFTdXJ2ZXkuSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKG5ld1ZhbHVlLCBjb3BpZWRWYWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMua29WYWx1ZShuZXdWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMub25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLmlza29WYWx1ZUNoYW5naW5nID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoKSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMucHJvcGVydHkgJiYgdGhpcy5vYmplY3QgJiYgdGhpcy5nZXRWYWx1ZSgpID09IG5ld1ZhbHVlKSByZXR1cm47XG4gICAgaWYgKHRoaXMub25DaGFuZ2VkICE9IG51bGwpIHRoaXMub25DaGFuZ2VkKG5ld1ZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNWYWx1ZUVtcHR5KHZhbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBTdXJ2ZXkuSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlRHluYW1pY1Byb3BlcnRpZXMoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMucHJvcGVydHkgfHxcbiAgICAgICF0aGlzLm9iamVjdCB8fFxuICAgICAgIXRoaXMucHJvcGVydHlbXCJvblByb3BlcnR5RWRpdG9yVXBkYXRlXCJdXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMucHJvcGVydHlbXCJvblByb3BlcnR5RWRpdG9yVXBkYXRlXCJdKHRoaXMub2JqZWN0LCB0aGlzKTtcbiAgfVxuICBwdWJsaWMga2V5RG93bkhhbmRsZXIocHJvcGVydHksIGV2ZW50KSB7XG4gICAgdmFyIHN1cnZleUVkaXRvcjogSVN1cnZleU9iamVjdEVkaXRvck9wdGlvbnMgPSBwcm9wZXJ0eS5lZGl0b3Iub3B0aW9ucztcbiAgICBpZiAoISFzdXJ2ZXlFZGl0b3IpIHtcbiAgICAgIHN1cnZleUVkaXRvci5vblByb3BlcnR5RWRpdG9yS2V5RG93bkNhbGxiYWNrKFxuICAgICAgICBwcm9wZXJ0eS5wcm9wZXJ0eS5uYW1lLFxuICAgICAgICBwcm9wZXJ0eS5vYmosXG4gICAgICAgIHByb3BlcnR5LmVkaXRvcixcbiAgICAgICAgZXZlbnRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgZWxlbWVudCA9IHVuZGVmaW5lZDtcbiAga29BZnRlclJlbmRlciA9IChjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldE5vZGVzRnJvbUtvQ29tcG9uZW50SW5mbyhjb21wb25lbnRJbmZvKTtcbiAgICB0aGlzLmVsZW1lbnQgPSBnZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICBpZiAoISF0aGlzLmVsZW1lbnQpIHtcbiAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2sodGhpcy5lbGVtZW50LCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZm9jdXMoKSB7XG4gICAgaWYgKHRoaXMuZWxlbWVudCAmJiB0eXBlb2YgdGhpcy5lbGVtZW50LmZvY3VzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8vIHZhciBmb2N1c2FibGUgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uLCBbaHJlZl0sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSknKTtcbiAgICAgIHRoaXMuZWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgb25JbnB1dEtleWRvd24obW9kZWwsIGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgKGV2ZW50LmtleUNvZGUgPT0gOTAgfHwgZXZlbnQua2V5Q29kZSA9PSA4OSkpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUN1c3RvbUVkaXRvciB9IGZyb20gXCIuL3Byb3BlcnR5Q3VzdG9tRWRpdG9yXCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyBFZGl0YWJsZU9iamVjdCB9IGZyb20gXCIuL2VkaXRhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5nc1wiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0RWRpdG9yOiBzdHJpbmcgPSBcInN0cmluZ1wiO1xuICBwdWJsaWMgc3RhdGljIGdldCBvcGVyYXRvcnMoKTogYW55IHtcbiAgICByZXR1cm4gc2V0dGluZ3Mub3BlcmF0b3JzO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0IG9wZXJhdG9ycyh2YWx1ZTogYW55KSB7XG4gICAgc2V0dGluZ3Mub3BlcmF0b3JzID0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRvckxpc3QgPSB7fTtcbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRvckJ5Q2xhc3NMaXN0ID0ge307XG4gIHByaXZhdGUgc3RhdGljIHdpZGdldFJlZ2lzdGVyTGlzdCA9IHt9O1xuICBwcml2YXRlIHN0YXRpYyBjZWxsVHlwZXMgPSB7fTtcbiAgcHVibGljIHN0YXRpYyBnZXRPcGVyYXRvcnMoKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBvcHMgPSBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3Rvcnkub3BlcmF0b3JzO1xuICAgIGZvciAodmFyIG5hbWUgaW4gb3BzKSB7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHRleHQ6IGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvcC5cIiArIG5hbWUpLFxuICAgICAgICB0eXBlczogb3BzW25hbWVdLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIHN0YXRpYyByZWdpc3RlclR5cGVGb3JDZWxsRWRpdGluZyhcbiAgICB0eXBlTmFtZTogc3RyaW5nLFxuICAgIGNlbGxUeXBlTmFtZTogc3RyaW5nXG4gICkge1xuICAgIFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5jZWxsVHlwZXNbdHlwZU5hbWVdID0gY2VsbFR5cGVOYW1lO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgcmVnaXN0ZXJFZGl0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWF0b3I6IChwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkgPT4gU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlLFxuICAgIGVkaXRhYmxlQ2xhc3NOYW1lOiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5jcmVhdG9yTGlzdFtuYW1lXSA9IGNyZWF0b3I7XG4gICAgdmFyIGNsYXNzTmFtZSA9IGVkaXRhYmxlQ2xhc3NOYW1lID8gZWRpdGFibGVDbGFzc05hbWUgOiBuYW1lO1xuICAgIFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5jcmVhdG9yQnlDbGFzc0xpc3RbY2xhc3NOYW1lXSA9IGNyZWF0b3I7XG4gIH1cbiAgcHVibGljIHN0YXRpYyByZWdpc3RlckN1c3RvbUVkaXRvcihuYW1lOiBzdHJpbmcsIHdpZGdldEpTT046IGFueSkge1xuICAgIFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS53aWRnZXRSZWdpc3Rlckxpc3RbbmFtZV0gPSB3aWRnZXRKU09OO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgdW5yZWdpc3RlckN1c3RvbUVkaXRvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBkZWxldGUgU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LndpZGdldFJlZ2lzdGVyTGlzdFtuYW1lXTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUVkaXRvcihcbiAgICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBpc0NlbGxFZGl0b3I6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICAgIHZhciBlZGl0b3JUeXBlID0gcHJvcGVydHkudHlwZTtcbiAgICBpZiAoaXNDZWxsRWRpdG9yICYmICEhU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LmNlbGxUeXBlc1tlZGl0b3JUeXBlXSkge1xuICAgICAgZWRpdG9yVHlwZSA9IFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5jZWxsVHlwZXNbZWRpdG9yVHlwZV07XG4gICAgfVxuICAgIGlmIChcbiAgICAgIFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5pc0Ryb3Bkb3duRWRpdG9yKHByb3BlcnR5KSAmJlxuICAgICAgKCFlZGl0b3JUeXBlIHx8IGVkaXRvclR5cGUgPT0gU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LmRlZmF1bHRFZGl0b3IpXG4gICAgKSB7XG4gICAgICBlZGl0b3JUeXBlID0gXCJkcm9wZG93blwiO1xuICAgIH1cbiAgICB2YXIgcHJvcGVydHlFZGl0b3IgPSBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkuY3JlYXRlQ3VzdG9tRWRpdG9yKFxuICAgICAgZWRpdG9yVHlwZSxcbiAgICAgIHByb3BlcnR5XG4gICAgKTtcbiAgICBpZiAoIXByb3BlcnR5RWRpdG9yKSB7XG4gICAgICB2YXIgY3JlYXRvciA9IFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5jcmVhdG9yTGlzdFtlZGl0b3JUeXBlXTtcbiAgICAgIGlmIChjcmVhdG9yKSBwcm9wZXJ0eUVkaXRvciA9IGNyZWF0b3IocHJvcGVydHkpO1xuICAgIH1cbiAgICBpZiAoIXByb3BlcnR5RWRpdG9yKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb3BlcnR5LmlzQXJyYXkgJiZcbiAgICAgICAgU3VydmV5LlNlcmlhbGl6ZXIuaXNEZXNjZW5kYW50T2YocHJvcGVydHkuY2xhc3NOYW1lLCBcIml0ZW12YWx1ZVwiKVxuICAgICAgKSB7XG4gICAgICAgIHZhciBjcmVhdG9yID0gU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LmNyZWF0b3JMaXN0W1wiaXRlbXZhbHVlW11cIl07XG4gICAgICAgIGlmIChjcmVhdG9yKSBwcm9wZXJ0eUVkaXRvciA9IGNyZWF0b3IocHJvcGVydHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXByb3BlcnR5RWRpdG9yKSB7XG4gICAgICBjcmVhdG9yID0gU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LmZpbmRQYXJlbnRDcmVhdG9yKGVkaXRvclR5cGUpO1xuICAgICAgcHJvcGVydHlFZGl0b3IgPSBjcmVhdG9yKHByb3BlcnR5KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnR5RWRpdG9yO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIGlzRHJvcGRvd25FZGl0b3IoXG4gICAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHlcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHByb3BlcnR5W1wiaGFzQ2hvaWNlc1wiXSAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHByb3BlcnR5W1wiaGFzQ2hvaWNlc1wiXSA9PT0gdHJ1ZTtcbiAgICByZXR1cm4gcHJvcGVydHkuY2hvaWNlcyAhPSBudWxsO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUN1c3RvbUVkaXRvcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgdmFyIHdpZGdldEpTT04gPSBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3Rvcnkud2lkZ2V0UmVnaXN0ZXJMaXN0W25hbWVdO1xuICAgIGlmICghd2lkZ2V0SlNPTikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlQcm9wZXJ0eUN1c3RvbUVkaXRvcihwcm9wZXJ0eSwgd2lkZ2V0SlNPTik7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgZmluZFBhcmVudENyZWF0b3IoXG4gICAgbmFtZTogc3RyaW5nXG4gICk6IChwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkgPT4gU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgICB2YXIganNvbkNsYXNzID0gU3VydmV5LlNlcmlhbGl6ZXIuZmluZENsYXNzKG5hbWUpO1xuICAgIHdoaWxlIChqc29uQ2xhc3MgJiYganNvbkNsYXNzLnBhcmVudE5hbWUpIHtcbiAgICAgIHZhciBjcmVhdG9yID1cbiAgICAgICAgU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LmNyZWF0b3JCeUNsYXNzTGlzdFtqc29uQ2xhc3MucGFyZW50TmFtZV07XG4gICAgICBpZiAoY3JlYXRvcikgcmV0dXJuIGNyZWF0b3I7XG4gICAgICBqc29uQ2xhc3MgPSBTdXJ2ZXkuU2VyaWFsaXplci5maW5kQ2xhc3MoanNvbkNsYXNzLnBhcmVudE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LmNyZWF0b3JMaXN0W1xuICAgICAgU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LmRlZmF1bHRFZGl0b3JcbiAgICBdO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlTdHJpbmdQcm9wZXJ0eUVkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gIHB1YmxpYyBrb0lucHV0VHlwZTogYW55ID0ga28ub2JzZXJ2YWJsZShcInRleHRcIik7XG4gIHByaXZhdGUgbGlzdE5hbWVWYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIHN0YXRpYyBkYXRhTGlzdE51bWJlciA9IDA7XG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICAgIHRoaXMubGlzdE5hbWVWYWx1ZSA9IHRoaXMuZ2V0TGlzdE5hbWUoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtvSW5wdXRUeXBlKCk7XG4gIH1cbiAgcHVibGljIHNldCBpbnB1dFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmtvSW5wdXRUeXBlKHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cbiAgcHVibGljIGdldCBsaXN0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxpc3ROYW1lVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBnZXRMaXN0TmFtZSgpOiBzdHJpbmcge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnByb3BlcnR5IHx8XG4gICAgICAhQXJyYXkuaXNBcnJheSh0aGlzLnByb3BlcnR5LmRhdGFMaXN0KSB8fFxuICAgICAgdGhpcy5wcm9wZXJ0eS5kYXRhTGlzdC5sZW5ndGggPT0gMFxuICAgIClcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIHJldHVybiAoXG4gICAgICBcInByb3BlcnR5RWRpdG9yRGF0YUxpc3RcIiArXG4gICAgICAoU3VydmV5U3RyaW5nUHJvcGVydHlFZGl0b3IuZGF0YUxpc3ROdW1iZXIrKykudG9TdHJpbmcoKVxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlEcm9wZG93blByb3BlcnR5RWRpdG9yIGV4dGVuZHMgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgcHVibGljIGtvQ2hvaWNlczogYW55O1xuICBwdWJsaWMga29IYXNGb2N1czogYW55O1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgICB0aGlzLmtvQ2hvaWNlcyA9IGtvLm9ic2VydmFibGVBcnJheShbXSk7XG4gICAgdGhpcy5rb0hhc0ZvY3VzID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29IYXNGb2N1cy5zdWJzY3JpYmUoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAvL1RPRE8gaXNEeW5hbWljQ2hvaWNlcyBvYnNvbGV0ZSwgdXNlIGRlcGVuZHNPbiBhdHRyaWJ1dGVcbiAgICAgIGlmIChuZXdWYWx1ZSAmJiBzZWxmLnByb3BlcnR5W1wiaXNEeW5hbWljQ2hvaWNlc1wiXSkge1xuICAgICAgICBzZWxmLnVwZGF0ZUNob2ljZXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJkcm9wZG93blwiO1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZVRleHQodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucHJvcGVydHkubmFtZSA9PT0gXCJsb2NhbGVcIikge1xuICAgICAgbGV0IHRleHQgPSBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0TG9jYWxlTmFtZSh2YWx1ZSk7XG4gICAgICBpZiAodGV4dCkgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BlcnR5Lm5hbWUgPT09IFwiY2VsbFR5cGVcIikge1xuICAgICAgbGV0IHRleHQgPSBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicXQuXCIgKyB2YWx1ZSk7XG4gICAgICBpZiAodGV4dCkgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc2V0T2JqZWN0KHZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5zZXRPYmplY3QodmFsdWUpO1xuICAgIHRoaXMuYmVnaW5WYWx1ZVVwZGF0aW5nKCk7XG4gICAgaWYgKHRoaXMua29DaG9pY2VzKCkubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMudXBkYXRlQ2hvaWNlcygpO1xuICAgIH1cbiAgICB0aGlzLmVuZFZhbHVlVXBkYXRpbmcoKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlRHluYW1pY1Byb3BlcnRpZXMoKSB7XG4gICAgc3VwZXIudXBkYXRlRHluYW1pY1Byb3BlcnRpZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUNob2ljZXMoKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ2hvaWNlcygpIHtcbiAgICB2YXIgY2hvaWNlcyA9IHRoaXMuZ2V0UHJvcGVydHlDaG9pY2VzKCk7XG4gICAgdGhpcy5zZXRDaG9pY2VzKGNob2ljZXMpO1xuICB9XG4gIHB1YmxpYyBnZXQgb3B0aW9uc0NhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHByaXZhdGUgc2V0Q2hvaWNlcyhjaG9pY2VzOiBBcnJheTxTdXJ2ZXkuSXRlbVZhbHVlPikge1xuICAgIGNob2ljZXMgPSB0aGlzLm1ha2VDaG9pY2VzTG9jYWxpemFibGUoY2hvaWNlcyk7XG4gICAgaWYgKCEhY2hvaWNlcyAmJiBBcnJheS5pc0FycmF5KGNob2ljZXMpKSB7XG4gICAgICB0aGlzLmtvQ2hvaWNlcyhjaG9pY2VzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBtYWtlQ2hvaWNlc0xvY2FsaXphYmxlKGNob2ljZXM6IEFycmF5PFN1cnZleS5JdGVtVmFsdWU+KSB7XG4gICAgaWYgKCFjaG9pY2VzKSByZXR1cm4gY2hvaWNlcztcbiAgICB2YXIgcmVzID0gbmV3IEFycmF5PFN1cnZleS5JdGVtVmFsdWU+KCk7XG4gICAgU3VydmV5Lkl0ZW1WYWx1ZS5zZXREYXRhKHJlcywgY2hvaWNlcyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghIXJlc1tpXS50ZXh0ICYmIHJlc1tpXS50ZXh0ICE9PSByZXNbaV0udmFsdWUpIGNvbnRpbnVlO1xuICAgICAgdmFyIHZhbHVlID0gcmVzW2ldLnZhbHVlO1xuICAgICAgdmFyIHRleHQgPSB0aGlzLmdldFZhbHVlVGV4dCh2YWx1ZSk7XG4gICAgICBpZiAodGV4dCAhPSB2YWx1ZSkge1xuICAgICAgICByZXNbaV0udGV4dCA9IHRleHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb3BlcnR5Q2hvaWNlcygpOiBBcnJheTxhbnk+IHtcbiAgICBpZiAoIXRoaXMucHJvcGVydHkpIHJldHVybiBbXTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHkuZ2V0Q2hvaWNlcyh0aGlzLm9iamVjdCwgZnVuY3Rpb24gKGNob2ljZXM6IGFueSkge1xuICAgICAgc2VsZi5zZXRDaG9pY2VzKGNob2ljZXMpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvblByb3BlcnR5RWRpdG9yIGV4dGVuZHMgU3VydmV5RHJvcGRvd25Qcm9wZXJ0eUVkaXRvciB7XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInF1ZXN0aW9uXCI7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3JUeXBlVGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJkcm9wZG93blwiO1xuICB9XG4gIHB1YmxpYyBnZXQgb3B0aW9uc0NhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJwZS5jb25kaXRpb25TZWxlY3RRdWVzdGlvblwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvcGVydHlDaG9pY2VzKCk6IEFycmF5PGFueT4ge1xuICAgIHZhciBvcHQgPSBuZXcgU3VydmV5Lkl0ZW1WYWx1ZShcIlwiLCB0aGlzLm9wdGlvbnNDYXB0aW9uKTtcbiAgICB2YXIgc3VydmV5ID0gRWRpdGFibGVPYmplY3QuZ2V0U3VydmV5KHRoaXMub2JqZWN0KTtcbiAgICBpZiAoIXN1cnZleSkgcmV0dXJuIFtvcHRdO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9ucyhzdXJ2ZXkpO1xuICAgIGlmICghcXVlc3Rpb25zKSBxdWVzdGlvbnMgPSBbXTtcbiAgICB2YXIgc2hvd1RpdGxlcyA9ICEhdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zaG93VGl0bGVzSW5FeHByZXNzaW9ucztcbiAgICB2YXIgcUl0ZW1zID0gcXVlc3Rpb25zLm1hcCgocSkgPT4ge1xuICAgICAgbGV0IHRleHQgPSBzaG93VGl0bGVzID8gKDxhbnk+cSkubG9jVGl0bGUucmVuZGVyZWRIdG1sIDogcS5uYW1lO1xuICAgICAgcmV0dXJuIG5ldyBTdXJ2ZXkuSXRlbVZhbHVlKHRoaXMuZ2V0SXRlbVZhbHVlKHEpLCB0ZXh0KTtcbiAgICB9KTtcbiAgICBxSXRlbXMuc29ydCgoZWwxLCBlbDIpID0+IHtcbiAgICAgIHJldHVybiBlbDEudGV4dC5sb2NhbGVDb21wYXJlKGVsMi50ZXh0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBxSXRlbXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1WYWx1ZShxdWVzdGlvbjogU3VydmV5LklRdWVzdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHF1ZXN0aW9uLm5hbWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFF1ZXN0aW9ucyhzdXJ2ZXk6IFN1cnZleS5TdXJ2ZXlNb2RlbCk6IEFycmF5PFN1cnZleS5RdWVzdGlvbj4ge1xuICAgIHJldHVybiBzdXJ2ZXkuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uU2VsZWN0QmFzZVByb3BlcnR5RWRpdG9yIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25Qcm9wZXJ0eUVkaXRvciB7XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInF1ZXN0aW9uX3NlbGVjdGJhc2VcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb25zKHN1cnZleTogU3VydmV5LlN1cnZleU1vZGVsKTogQXJyYXk8U3VydmV5LlF1ZXN0aW9uPiB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHN1cnZleS5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0gPT09IHRoaXMub2JqZWN0KSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0QmFzZVF1ZXN0aW9uKHF1ZXN0aW9uc1tpXSkpIHtcbiAgICAgICAgcmVzLnB1c2gocXVlc3Rpb25zW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGlzU2VsZWN0QmFzZVF1ZXN0aW9uKHF1ZXN0aW9uOiBTdXJ2ZXkuUXVlc3Rpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gU3VydmV5LlNlcmlhbGl6ZXIuaXNEZXNjZW5kYW50T2YocXVlc3Rpb24uZ2V0VHlwZSgpLCBcInNlbGVjdGJhc2VcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uVmFsdWVQcm9wZXJ0eUVkaXRvciBleHRlbmRzIFN1cnZleVF1ZXN0aW9uUHJvcGVydHlFZGl0b3Ige1xuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJxdWVzdGlvbnZhbHVlXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1WYWx1ZShxdWVzdGlvbjogU3VydmV5LklRdWVzdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuICg8U3VydmV5LlF1ZXN0aW9uPnF1ZXN0aW9uKS5nZXRWYWx1ZU5hbWUoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5Qm9vbGVhblByb3BlcnR5RWRpdG9yIGV4dGVuZHMgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9XG4gIHB1YmxpYyBnZXQgY2FuU2hvd0Rpc3BsYXlOYW1lT25Ub3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZVRleHQodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKHZhbHVlKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFN1cnZleVN3aXRjaFByb3BlcnR5RWRpdG9yIGV4dGVuZHMgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3dpdGNoXCI7XG4gIH1cbiAgcHVibGljIGdldCBjYW5TaG93RGlzcGxheU5hbWVPblRvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlVGV4dCh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uLmdldFByb3BlcnR5VmFsdWUodmFsdWUpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgU3VydmV5TnVtYmVyUHJvcGVydHlFZGl0b3IgZXh0ZW5kcyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdGVkVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICghdmFsdWUpIHZhbHVlID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmdldENvcnJlY3RlZFZhbHVlKHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5Q29sb3JQcm9wZXJ0eUVkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNvbG9yXCI7XG4gIH1cbn1cblxuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyRWRpdG9yKFxuICBcInN0cmluZ1wiLFxuICBmdW5jdGlvbiAocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgU3VydmV5U3RyaW5nUHJvcGVydHlFZGl0b3IocHJvcGVydHkpO1xuICB9XG4pO1xuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyRWRpdG9yKFxuICBcImRyb3Bkb3duXCIsXG4gIGZ1bmN0aW9uIChwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSk6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlEcm9wZG93blByb3BlcnR5RWRpdG9yKHByb3BlcnR5KTtcbiAgfVxuKTtcblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcbiAgXCJxdWVzdGlvblwiLFxuICBmdW5jdGlvbiAocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgU3VydmV5UXVlc3Rpb25Qcm9wZXJ0eUVkaXRvcihwcm9wZXJ0eSk7XG4gIH1cbik7XG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJFZGl0b3IoXG4gIFwicXVlc3Rpb25fc2VsZWN0YmFzZVwiLFxuICBmdW5jdGlvbiAocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgU3VydmV5UXVlc3Rpb25TZWxlY3RCYXNlUHJvcGVydHlFZGl0b3IocHJvcGVydHkpO1xuICB9XG4pO1xuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyRWRpdG9yKFxuICBcInF1ZXN0aW9udmFsdWVcIixcbiAgZnVuY3Rpb24gKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVF1ZXN0aW9uVmFsdWVQcm9wZXJ0eUVkaXRvcihwcm9wZXJ0eSk7XG4gIH1cbik7XG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJFZGl0b3IoXG4gIFwiYm9vbGVhblwiLFxuICBmdW5jdGlvbiAocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgU3VydmV5Qm9vbGVhblByb3BlcnR5RWRpdG9yKHByb3BlcnR5KTtcbiAgfVxuKTtcblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcbiAgXCJzd2l0Y2hcIixcbiAgZnVuY3Rpb24gKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVN3aXRjaFByb3BlcnR5RWRpdG9yKHByb3BlcnR5KTtcbiAgfVxuKTtcblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcbiAgXCJudW1iZXJcIixcbiAgZnVuY3Rpb24gKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleU51bWJlclByb3BlcnR5RWRpdG9yKHByb3BlcnR5KTtcbiAgfVxuKTtcblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcbiAgXCJjb2xvclwiLFxuICBmdW5jdGlvbiAocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgU3VydmV5Q29sb3JQcm9wZXJ0eUVkaXRvcihwcm9wZXJ0eSk7XG4gIH1cbik7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvciB9IGZyb20gXCIuL3Byb3BlcnR5TmVzdGVkUHJvcGVydHlFZGl0b3JcIjtcblxuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVByb3BlcnR5SHRtbENvbmRpdGlvbkVkaXRvciBleHRlbmRzIFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9yIHtcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiaHRtbGNvbmRpdGlvbnNcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm5lc3RlZC1pdGVtc1wiO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdJdGVtKCk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXkuSHRtbENvbmRpdGlvbkl0ZW0oKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29sdW1uc1Byb3BlcnRpZXMoKTogQXJyYXk8U3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnRpZXNCeU5hbWVzKFwiaHRtbGNvbmRpdGlvbml0ZW1cIiwgW1xuICAgICAgXCJleHByZXNzaW9uXCIsXG4gICAgICBcImh0bWxcIlxuICAgIF0pO1xuICB9XG59XG5cblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcImh0bWxjb25kaXRpb25zXCIsIGZ1bmN0aW9uKFxuICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuKTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgcmV0dXJuIG5ldyBTdXJ2ZXlQcm9wZXJ0eUh0bWxDb25kaXRpb25FZGl0b3IocHJvcGVydHkpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckJhc2VcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeSB9IGZyb20gXCIuL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuaW1wb3J0IHsgZ2V0TmV4dFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkVkaXRvckRlZmluaXRpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25FZGl0b3JzL3F1ZXN0aW9uRWRpdG9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3IgfSBmcm9tIFwiLi9wcm9wZXJ0eU5lc3RlZFByb3BlcnR5RWRpdG9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yLCBTdXJ2ZXlIZWxwZXIgfSBmcm9tIFwiLi4vZW50cmllc1wiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlJdGVtVmFsdWVzRWRpdG9yIGV4dGVuZHMgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3Ige1xuICBwcml2YXRlIGRldGFpbERlZmluaXRpb246IGFueTtcbiAgcHJpdmF0ZSBvcHRpb25zU2hvd1RleHRWaWV3OiBib29sZWFuID0gdHJ1ZTtcbiAga29JdGVtc1RleHQ6IGFueTtcbiAga29TaG93VGV4dFZpZXc6IGFueTtcbiAgY2hhbmdlVG9UZXh0Vmlld0NsaWNrOiBhbnk7XG4gIGNoYW5nZVRvRm9ybVZpZXdDbGljazogYW55O1xuICBwcml2YXRlIGtvSXRlbXNUZXh0RGVsYXllZDogYW55O1xuICBwcml2YXRlIGlzVXBkYXRpbmdJdGVtVGV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgICB0aGlzLmtvU2hvd1RleHRWaWV3ID0ga28ub2JzZXJ2YWJsZSh0cnVlKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICB0aGlzLmRldGFpbERlZmluaXRpb24gPVxuICAgICAgICBTdXJ2ZXlRdWVzdGlvbkVkaXRvckRlZmluaXRpb24uZGVmaW5pdGlvblt0aGlzLmdldEl0ZW1WYWx1ZUNsYXNzTmFtZSgpXTtcbiAgICB9XG4gICAgdGhpcy5rb0l0ZW1zVGV4dCA9IGtvLm9ic2VydmFibGUoXCJcIik7XG4gICAgdGhpcy5rb0l0ZW1zVGV4dERlbGF5ZWQgPSBrb1xuICAgICAgLnB1cmVDb21wdXRlZCh0aGlzLmtvSXRlbXNUZXh0KVxuICAgICAgLmV4dGVuZCh7IHJhdGVMaW1pdDogeyBtZXRob2Q6IFwibm90aWZ5V2hlbkNoYW5nZXNTdG9wXCIsIHRpbWVvdXQ6IDQwMCB9IH0pO1xuICAgIHRoaXMua29JdGVtc1RleHREZWxheWVkLnN1YnNjcmliZShmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgIHNlbGYudXBkYXRlSXRlbXNUZXh0T25UeXBpbmcobmV3VmFsdWUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5rb0FjdGl2ZVZpZXcuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgaWYgKG5ld1ZhbHVlID09IFwiZm9ybVwiKSBzZWxmLnVwZGF0ZUl0ZW1zKHNlbGYua29JdGVtc1RleHQoKSk7XG4gICAgICBlbHNlIHNlbGYudXBkYXRlSXRlbXNUZXh0KCk7XG4gICAgfSk7XG4gICAgdGhpcy5jaGFuZ2VUb1RleHRWaWV3Q2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmtvQWN0aXZlVmlldyhcInRleHRcIik7XG4gICAgfTtcbiAgICB0aGlzLmNoYW5nZVRvRm9ybVZpZXdDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYua29BY3RpdmVWaWV3KFwiZm9ybVwiKTtcbiAgICB9O1xuXG4gICAgdGhpcy5tb2RhbE5hbWUgPVxuICAgICAgXCJtb2RlbEVkaXRvclwiICsgXCJpdGVtdmFsdWVzXCIgKyBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yLmlkQ291bnRlcjtcbiAgICBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yLmlkQ291bnRlcisrO1xuICAgIHRoaXMubW9kYWxOYW1lVGFyZ2V0ID0gXCIjXCIgKyB0aGlzLm1vZGFsTmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJpdGVtdmFsdWVbXVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZVRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiaXRlbS12YWx1ZXNcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0RldGFpbEJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmRldGFpbERlZmluaXRpb247XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1WYWx1ZUNsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eSA/IHRoaXMuZWRpdG9yVHlwZSArIFwiQFwiICsgdGhpcy5wcm9wZXJ0eS5uYW1lIDogXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RWRpdG9yTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5rb0VkaXRJdGVtKCkgfHwgIXRoaXMua29FZGl0SXRlbSgpLm9iaikgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcInBlLml0ZW1FZGl0XCIpXG4gICAgICBbXCJmb3JtYXRcIl0odGhpcy5rb0VkaXRJdGVtKCkub2JqLnZhbHVlKTtcbiAgfVxuICBwdWJsaWMgYmVmb3JlU2hvd0NvcmUoKSB7XG4gICAgc3VwZXIuYmVmb3JlU2hvd0NvcmUoKTtcbiAgICB0aGlzLnVwZGF0ZVNob3dUZXh0Vmlld1Zpc2liaWxpdHkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29sdW1uc1Byb3BlcnRpZXMoKTogQXJyYXk8U3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciBwcm9wcyA9IHRoaXMuZ2V0RGVmaW5lZFByb3BlcnRpZXMoKTtcbiAgICBpZiAoISFwcm9wcyAmJiBwcm9wcy5sZW5ndGggPiAwKSByZXR1cm4gcHJvcHM7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdExpc3RQcm9wZXJ0aWVzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmluZWRQcm9wZXJ0aWVzKCk6IEFycmF5PGFueT4ge1xuICAgIGlmICghdGhpcy5wcm9wZXJ0eSB8fCAhdGhpcy5vYmplY3QgfHwgIXRoaXMub2JqZWN0LmdldFR5cGUpIHJldHVybiBbXTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RGVmaW5lZExpc3RQcm9wZXJ0aWVzKFxuICAgICAgdGhpcy5vYmplY3QuZ2V0VHlwZSgpICsgXCJAXCIgKyB0aGlzLnByb3BlcnR5Lm5hbWVcbiAgICApO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKHByb3BlcnRpZXNbaV0ucHJvcGVydHkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVFZGl0b3JPcHRpb25zKCk6IGFueSB7XG4gICAgdmFyIG9wdGlvbnMgPSBzdXBlci5jcmVhdGVFZGl0b3JPcHRpb25zKCk7XG4gICAgb3B0aW9ucy5zaG93VGV4dFZpZXcgPSB0cnVlO1xuICAgIG9wdGlvbnMuaXRlbXNFbnRyeVR5cGUgPVxuICAgICAgKHRoaXMub3B0aW9uc1tcIm9wdGlvbnNcIl0gJiZcbiAgICAgICAgdGhpcy5vcHRpb25zW1wib3B0aW9uc1wiXS5pdGVtVmFsdWVzRWRpdG9yRW50cnlUeXBlKSB8fFxuICAgICAgXCJmb3JtXCI7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU2V0RWRpdG9yT3B0aW9ucyhlZGl0b3JPcHRpb25zOiBhbnkpIHtcbiAgICBzdXBlci5vblNldEVkaXRvck9wdGlvbnMoZWRpdG9yT3B0aW9ucyk7XG4gICAgdGhpcy5vcHRpb25zU2hvd1RleHRWaWV3ID0gZWRpdG9yT3B0aW9ucy5zaG93VGV4dFZpZXc7XG4gICAgdGhpcy51cGRhdGVTaG93VGV4dFZpZXdWaXNpYmlsaXR5KCk7XG4gICAgdGhpcy5rb0FjdGl2ZVZpZXcoZWRpdG9yT3B0aW9ucy5pdGVtc0VudHJ5VHlwZSB8fCBcImZvcm1cIik7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld0l0ZW0oKTogYW55IHtcbiAgICB2YXIgbmV4dFZhbHVlID0gbnVsbDtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5vcmlnaW5hbFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgdmFsdWVzID0gaXRlbXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBpdGVtVGV4dCA9IHRoaXMucHJvcGVydHkuZ2V0QmFzZVZhbHVlKCk7XG4gICAgaWYgKCFpdGVtVGV4dCkge1xuICAgICAgaXRlbVRleHQgPSBTdXJ2ZXkuc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob2ljZXNfSXRlbVwiKTtcbiAgICB9XG4gICAgbmV4dFZhbHVlID0gZ2V0TmV4dFZhbHVlKGl0ZW1UZXh0LCB2YWx1ZXMpO1xuXG4gICAgdmFyIGl0ZW1WYWx1ZSA9IHRoaXMuY3JlYXRlRWRpdG9ySXRlbVZhbHVlQ29yZShuZXh0VmFsdWUpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5vbkl0ZW1WYWx1ZUFkZGVkQ2FsbGJhY2soXG4gICAgICAgIHRoaXMub2JqZWN0LFxuICAgICAgICB0aGlzLmVkaXRhYmxlUHJvcGVydHlOYW1lLFxuICAgICAgICBpdGVtVmFsdWUsXG4gICAgICAgIHZhbHVlc1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1WYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXRlbUNsYXNzTmFtZShpdGVtOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLmdldEl0ZW1WYWx1ZUNsYXNzTmFtZSgpO1xuICAgIHJldHVybiAhIWNsYXNzTmFtZSA/IGNsYXNzTmFtZSA6IGl0ZW0uZ2V0VHlwZSgpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRWRpdG9ySXRlbVZhbHVlQ29yZShpdGVtOiBhbnkpIHtcbiAgICB2YXIgaXRlbVZhbHVlID0gU3VydmV5LlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3ModGhpcy5wcm9wZXJ0eS5jbGFzc05hbWUpO1xuICAgIGl0ZW1WYWx1ZS5zZXREYXRhKGl0ZW0pO1xuICAgIHJldHVybiBpdGVtVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc1RleHRMb2NhbGl6ZWQoaXRlbSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhpdGVtLmxvY1RleHQudmFsdWVzKS5sZW5ndGggPiAxO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5vblZhbHVlQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLmlzQmVmb3JlU2hvd0NhbGxlZCkge1xuICAgICAgaWYgKHRoaXMua29BY3RpdmVWaWV3KCkgIT09IFwiZm9ybVwiKSB7XG4gICAgICAgIHRoaXMudXBkYXRlSXRlbXNUZXh0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlU2hvd1RleHRWaWV3VmlzaWJpbGl0eSgpO1xuICB9XG4gIHByaXZhdGUgaXNVcGRhdGluZ09uVHlwaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgdXBkYXRlSXRlbXNUZXh0T25UeXBpbmcobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmlzVXBkYXRpbmdJdGVtVGV4dCkgcmV0dXJuO1xuICAgIHRoaXMuaXNVcGRhdGluZ09uVHlwaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnVwZGF0ZUl0ZW1zKG5ld1ZhbHVlKTtcbiAgICB0aGlzLmlzVXBkYXRpbmdPblR5cGluZyA9IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlSXRlbXNUZXh0KCkge1xuICAgIGlmICh0aGlzLmlzVXBkYXRpbmdPblR5cGluZykgcmV0dXJuO1xuICAgIHRoaXMuaXNVcGRhdGluZ0l0ZW1UZXh0ID0gdHJ1ZTtcbiAgICB0aGlzLmtvSXRlbXNUZXh0KHRoaXMuZ2V0SXRlbXNUZXh0KCkpO1xuICAgIHRoaXMuaXNVcGRhdGluZ0l0ZW1UZXh0ID0gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTGlzdERldGFpbFZpZXdDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uTGlzdERldGFpbFZpZXdDaGFuZ2VkKCk7XG4gICAgdGhpcy51cGRhdGVTaG93VGV4dFZpZXdWaXNpYmlsaXR5KCk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUl0ZW1zKHRleHQ6IHN0cmluZykge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRDb2x1bW5zUHJvcGVydGllcygpO1xuICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLnByb3BlcnR5LmNsYXNzTmFtZTtcbiAgICB2YXIgaXRlbXM6IFN1cnZleS5JdGVtVmFsdWVbXSA9IFN1cnZleUhlbHBlci5jb252ZXJ0VGV4dFRvSXRlbVZhbHVlcyhcbiAgICAgIHRleHQsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZUFycmF5VmFsdWUoaXRlbXMpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQXJyYXlWYWx1ZShpdGVtczogYW55KSB7XG4gICAgaWYgKCF0aGlzLm9yaWdpbmFsVmFsdWUpIHJldHVybjtcbiAgICBpZiAoIWl0ZW1zKSBpdGVtcyA9IFtdO1xuICAgIC8vVE9ETyBtYWdpYyB2YWx1ZSAyMFxuICAgIGlmIChNYXRoLmFicyh0aGlzLm9yaWdpbmFsVmFsdWUubGVuZ3RoIC0gaXRlbXMubGVuZ3RoKSA+IDIwKSB7XG4gICAgICB0aGlzLm9iamVjdFt0aGlzLnByb3BlcnR5Lm5hbWVdID0gaXRlbXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIFN1cnZleUhlbHBlci5hcHBseUl0ZW1WYWx1ZUFycmF5KHRoaXMub3JpZ2luYWxWYWx1ZSwgaXRlbXMpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXRlbXNUZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9yaWdpbmFsVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW1zLnB1c2godGhpcy5jcmVhdGVJdGVtVmlld01vZGVsKHRoaXMub3JpZ2luYWxWYWx1ZVtpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gU3VydmV5SGVscGVyLmNvbnZlcnRNYXRyaXhSb3dzVG9UZXh0KGl0ZW1zKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVNob3dUZXh0Vmlld1Zpc2liaWxpdHkoKSB7XG4gICAgaWYgKCF0aGlzLmtvU2hvd1RleHRWaWV3KSByZXR1cm47XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNTaG93VGV4dFZpZXcgfHwgdGhpcy5jb2x1bW5zLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmtvU2hvd1RleHRWaWV3KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmtvU2hvd1RleHRWaWV3KFxuICAgICAgdGhpcy5pc1ZhbHVlUHJvcGVydHlWaXNpYmxlKCkgJiZcbiAgICAgICAgIXRoaXMuaGFzVmlzaWJsZUlmT3JFbmFibGVJZigpICYmXG4gICAgICAgICF0aGlzLmhhc011bHRpcGxlTGFuZ3VhZ2UoKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBoYXNNdWx0aXBsZUxhbmd1YWdlKCk6IGJvb2xlYW4ge1xuICAgIHZhciBpdGVtcyA9IHRoaXMub3JpZ2luYWxWYWx1ZTtcbiAgICBpZiAoIWl0ZW1zIHx8ICFBcnJheS5pc0FycmF5KGl0ZW1zKSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpdGVtc1tpXS5sb2NUZXh0Lmhhc05vbkRlZmF1bHRUZXh0KCkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlUHJvcGVydHlWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHZhciB2YWx1ZVByb3AgPSBTdXJ2ZXkuU2VyaWFsaXplci5maW5kUHJvcGVydHkoXCJpdGVtdmFsdWVcIiwgXCJ2YWx1ZVwiKTtcbiAgICByZXR1cm4gISF2YWx1ZVByb3AgJiYgdmFsdWVQcm9wLnZpc2libGUgJiYgIXZhbHVlUHJvcC5yZWFkT25seTtcbiAgfVxuICBwcml2YXRlIGhhc1Zpc2libGVJZk9yRW5hYmxlSWYoKTogYm9vbGVhbiB7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5vcmlnaW5hbFZhbHVlO1xuICAgIGlmICghaXRlbXMgfHwgIUFycmF5LmlzQXJyYXkoaXRlbXMpKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCEhaXRlbXNbaV0udmlzaWJsZUlmIHx8IGl0ZW1zW2ldLmVuYWJsZUlmKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBoYXNEZXRhaWxzUHJvcGVydGllcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJFZGl0b3IoXG4gIFwiaXRlbXZhbHVlW11cIixcbiAgZnVuY3Rpb24gKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVByb3BlcnR5SXRlbVZhbHVlc0VkaXRvcihwcm9wZXJ0eSk7XG4gIH0sXG4gIFwiaXRlbXZhbHVlXCJcbik7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yIH0gZnJvbSBcIi4vcHJvcGVydHlNb2RhbEVkaXRvclwiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSBcIi4uL3N1cnZleUhlbHBlclwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlJdGVtc0VkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3Ige1xuICBwdWJsaWMgb25EZWxldGVDbGljazogYW55O1xuICBwdWJsaWMgb25BZGRDbGljazogYW55O1xuICBwdWJsaWMgb25DbGVhckNsaWNrOiBhbnk7XG4gIGtvQWxsb3dBZGRSZW1vdmVJdGVtcyA9IGtvLm9ic2VydmFibGUodHJ1ZSk7XG4gIGtvQWxsb3dSZW1vdmVBbGxJdGVtcyA9IGtvLm9ic2VydmFibGUodHJ1ZSk7XG4gIGtvQ2FuQWRkSXRlbSA9IGtvLm9ic2VydmFibGUodHJ1ZSk7XG4gIHByaXZhdGUgdmlld0l0ZW1zOiBBcnJheTxhbnk+ID0gW107XG5cbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYub25EZWxldGVDbGljayA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBpZiAoIXNlbGYub25EZWxldGluZ0l0ZW0oaXRlbS5vYmopKSByZXR1cm47XG4gICAgICBzZWxmLmRlbGV0ZUl0ZW0oaXRlbS5vYmopO1xuICAgIH07XG4gICAgc2VsZi5vbkNsZWFyQ2xpY2sgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgc2VsZi5vcmlnaW5hbFZhbHVlLnNwbGljZSgwLCBzZWxmLm9yaWdpbmFsVmFsdWUubGVuZ3RoKTtcbiAgICB9O1xuICAgIHNlbGYub25BZGRDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuYWRkSXRlbSgpO1xuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBfbm90aWZ5UHJvcGVydHlWYWx1ZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5vcHRpb25zICYmXG4gICAgICB0aGlzLm9wdGlvbnMub25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSxcbiAgICAgICAgdGhpcy5vYmplY3QsXG4gICAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZVxuICAgICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWVUZXh0KHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciBsZW4gPSB2YWx1ZSA/IHZhbHVlLmxlbmd0aCA6IDA7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZS5pdGVtc1wiKVtcImZvcm1hdFwiXShsZW4pO1xuICB9XG4gIHB1YmxpYyBnZXQgYWRkSXRlbVRleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgY3VzdG9tTG9jU3RyTmFtZSA9IFwicGUuYWRkTmV3QFwiICsgdGhpcy5wcm9wZXJ0eS5uYW1lO1xuICAgIGlmIChlZGl0b3JMb2NhbGl6YXRpb24uaGFzU3RyaW5nKGN1c3RvbUxvY1N0ck5hbWUpKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKGN1c3RvbUxvY1N0ck5hbWUpO1xuICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInBlLmFkZE5ld1wiKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdGVkVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB2YWx1ZSA9IFtdO1xuICAgIHJldHVybiBzdXBlci5nZXRDb3JyZWN0ZWRWYWx1ZSh2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUVkaXRvck9wdGlvbnMoKTogYW55IHtcbiAgICByZXR1cm4geyBhbGxvd0FkZFJlbW92ZUl0ZW1zOiB0cnVlLCBhbGxvd1JlbW92ZUFsbEl0ZW1zOiB0cnVlIH07XG4gIH1cbiAgcHJvdGVjdGVkIG9uU2V0RWRpdG9yT3B0aW9ucyhlZGl0b3JPcHRpb25zOiBhbnkpIHtcbiAgICB0aGlzLmtvQWxsb3dBZGRSZW1vdmVJdGVtcyhlZGl0b3JPcHRpb25zLmFsbG93QWRkUmVtb3ZlSXRlbXMpO1xuICAgIHRoaXMua29BbGxvd1JlbW92ZUFsbEl0ZW1zKGVkaXRvck9wdGlvbnMuYWxsb3dSZW1vdmVBbGxJdGVtcyk7XG4gIH1cbiAgcHJvdGVjdGVkIHN0YXJ0RHJhZ0l0ZW0oKSB7fVxuICBwcm90ZWN0ZWQgZW5kRHJhZ0l0ZW0oKSB7fVxuICBwdWJsaWMgc29ydGFibGVPcHRpb25zID0ge1xuICAgIGhhbmRsZTogXCIuc3ZkLWRyYWctaGFuZGxlXCIsXG4gICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgb25TdGFydDogKCkgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zW1widW5kb1JlZG9NYW5hZ2VyXCJdLnN0YXJ0VHJhbnNhY3Rpb24oXG4gICAgICAgIFwicHJvcGVydHkgaXRlbXMgZWRpdG9yIGRyYWcgZHJvcCB0cmFuc2FjdGlvblwiXG4gICAgICApO1xuICAgICAgdGhpcy5zdGFydERyYWdJdGVtKCk7XG4gICAgfSxcbiAgICBvbkVuZDogKCkgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zW1widW5kb1JlZG9NYW5hZ2VyXCJdLnN0b3BUcmFuc2FjdGlvbigpO1xuICAgICAgdGhpcy5lbmREcmFnSXRlbSgpO1xuICAgIH0sXG4gICAgb25VcGRhdGU6IChldnQsIGl0ZW1WKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIFN1cnZleUhlbHBlci5tb3ZlSXRlbUluQXJyYXkoXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlLFxuICAgICAgICAgIGl0ZW1WLm9iaixcbiAgICAgICAgICBldnQubmV3SW5kZXhcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlbW92ZSBzb3J0YWJsZXMgXCJ1bmJvdW5kXCIgZWxlbWVudFxuICAgICAgICBldnQuaXRlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGV2dC5pdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH07XG4gIHByb3RlY3RlZCBhZGRJdGVtKCkge1xuICAgIHRoaXMuY3JlYXRlRWRpdG9ySXRlbUNvcmUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25EZWxldGluZ0l0ZW0ob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucykgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5vbkNvbGxlY3Rpb25JdGVtRGVsZXRpbmdDYWxsYmFjayhcbiAgICAgIHRoaXMub2JqZWN0LFxuICAgICAgdGhpcy5wcm9wZXJ0eSxcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZSxcbiAgICAgIG9ialxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGRlbGV0ZUl0ZW0ob2JqOiBhbnkpIHtcbiAgICBpZiAodGhpcy5yZWFkT25seSgpKSByZXR1cm47XG4gICAgdmFyIGluZGV4ID0gdGhpcy5vcmlnaW5hbFZhbHVlLmluZGV4T2Yob2JqKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB0aGlzLm9uSXRlbURlbGV0ZWQob2JqLCBpbmRleCk7XG4gICAgfVxuICAgIHRoaXMuZGVsZXRlVmlld0l0ZW1JbmRleChvYmopO1xuICAgIHRoaXMuX25vdGlmeVByb3BlcnR5VmFsdWVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXRlbURlbGV0ZWQob2JqOiBhbnksIGluZGV4OiBudW1iZXIpIHt9XG4gIHB1YmxpYyBoYXNFcnJvcigpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmlld0l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMudmlld0l0ZW1zW2ldO1xuICAgICAgaWYgKCEhaXRlbS5oYXNFcnJvciAmJiAhIWl0ZW0uaGFzRXJyb3IoKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5oYXNFcnJvcigpO1xuICB9XG4gIHB1YmxpYyBzZXR1cCgpIHtcbiAgICBzdXBlci5zZXR1cCgpO1xuICAgIHRoaXMudXBkYXRlVmFsdWUoKTtcbiAgICB0aGlzLnZpZXdJdGVtcyA9IFtdO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVJdGVtVmlld01vZGVsKG9iajogYW55KTogYW55IHtcbiAgICB0aGlzLmRlbGV0ZVZpZXdJdGVtSW5kZXgob2JqKTtcbiAgICB2YXIgcmVzID0gdGhpcy5jcmVhdGVFZGl0b3JJdGVtKG9iaik7XG4gICAgdGhpcy52aWV3SXRlbXMucHVzaChyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBkZWxldGVWaWV3SXRlbUluZGV4KG9iajogYW55KSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZpZXdJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMudmlld0l0ZW1zW2ldLm9iaiA9PSBvYmopIHtcbiAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy52aWV3SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIGlmICh0aGlzLnZpZXdJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy52aWV3SXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdJdGVtc1tpXSAmJlxuICAgICAgICAgIHRoaXMudmlld0l0ZW1zW2ldLmZvY3VzICYmXG4gICAgICAgICAgdGhpcy52aWV3SXRlbXNbaV0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBpc0N1cnJlbnRWYWx1ZUVtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsVmFsdWUubGVuZ3RoID09IDA7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUVkaXRvckl0ZW1Db3JlKGl0ZW06IGFueSA9IG51bGwpIHtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIGl0ZW0gPSB0aGlzLmNyZWF0ZU5ld0l0ZW0oKTtcbiAgICAgIFN1cnZleUhlbHBlci5kaXNhYmxlU2VsZWN0aW5nT2JqKGl0ZW0pO1xuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlLnB1c2goaXRlbSk7XG4gICAgICBTdXJ2ZXlIZWxwZXIuZW5hYmxlU2VsZWN0aW5nT2JqKGl0ZW0pO1xuICAgIH1cbiAgICB2YXIgZWRpdG9ySXRlbSA9IHRoaXMuY3JlYXRlRWRpdG9ySXRlbShpdGVtKTtcbiAgICBpZiAoISFlZGl0b3JJdGVtLm9uQ3JlYXRlZCkge1xuICAgICAgZWRpdG9ySXRlbS5vbkNyZWF0ZWQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGVkaXRvckl0ZW07XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld0l0ZW0oKTogYW55IHtcbiAgICB0aHJvdyBcIk92ZXJyaWRlICdjcmVhdGVOZXdJdGVtJyBtZXRob2RcIjtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlRWRpdG9ySXRlbShpdGVtOiBhbnkpIHtcbiAgICByZXR1cm4gaXRlbTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHtcbiAgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlLFxuICBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9ucyxcbn0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkVkaXRvciB9IGZyb20gXCIuLi9xdWVzdGlvbkVkaXRvcnMvcXVlc3Rpb25FZGl0b3JcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9yIH0gZnJvbSBcIi4vcHJvcGVydHlOZXN0ZWRQcm9wZXJ0eUVkaXRvclwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5IH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JGYWN0b3J5XCI7XG5pbXBvcnQgeyBnZXROZXh0VmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVByb3BlcnR5RHJvcGRvd25Db2x1bW5zRWRpdG9yIGV4dGVuZHMgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhkcm9wZG93bmNvbHVtbnNcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm5lc3RlZC1pdGVtc1wiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFZGl0b3JOYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmtvRWRpdEl0ZW0oKSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcInBlLmNvbHVtbkVkaXRcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLmtvRWRpdEl0ZW0oKS5vYmoubmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1DbGFzc05hbWUoaXRlbTogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgYmFzZTogc3RyaW5nID0gXCJtYXRyaXhkcm9wZG93bmNvbHVtbkBcIjtcbiAgICBpZiAoIWl0ZW1bXCJvYmplY3RcIl0gfHwgaXRlbS5jZWxsVHlwZSAhPT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgIHJldHVybiBiYXNlICsgaXRlbS5jZWxsVHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJhc2UgKyBpdGVtW1wib2JqZWN0XCJdLmNlbGxUeXBlO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3SXRlbSgpOiBhbnkge1xuICAgIHZhciBuZXdOYW1lID0gZ2V0TmV4dFZhbHVlKFwiY29sdW1uXCIsIHRoaXMuZ2V0Q29sdW1uTmFtZXMoKSkudG9TdHJpbmcoKTtcbiAgICB2YXIgbmV3Q29sdW1uID0gbmV3IFN1cnZleS5NYXRyaXhEcm9wZG93bkNvbHVtbihuZXdOYW1lKTtcbiAgICB2YXIgY29sdW1ucyA9IFtdO1xuICAgIHZhciBvcmdDb2x1bW5zID0gdGhpcy5vcmlnaW5hbFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9yZ0NvbHVtbnMpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZ0NvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKG9yZ0NvbHVtbnNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb2x1bW5zLnB1c2gobmV3Q29sdW1uKTtcbiAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICB0aGlzLm9wdGlvbnMub25NYXRyaXhEcm9wZG93bkNvbHVtbkFkZGVkQ2FsbGJhY2soXG4gICAgICAgIHRoaXMub2JqZWN0LFxuICAgICAgICBuZXdDb2x1bW4sXG4gICAgICAgIGNvbHVtbnNcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXdDb2x1bW47XG4gIH1cbiAgcHJvdGVjdGVkIGFkZEl0ZW0oKSB7XG4gICAgc3VwZXIuYWRkSXRlbSgpO1xuICAgIHRoaXMudXBkYXRlQ2FuQWRkQ29sdW1uKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGRlbGV0ZUl0ZW0ob2JqOiBhbnkpIHtcbiAgICBzdXBlci5kZWxldGVJdGVtKG9iaik7XG4gICAgdGhpcy51cGRhdGVDYW5BZGRDb2x1bW4oKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlVmFsdWUoKSB7XG4gICAgc3VwZXIudXBkYXRlVmFsdWUoKTtcbiAgICB0aGlzLnVwZGF0ZUNhbkFkZENvbHVtbigpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb2x1bW5zUHJvcGVydGllcygpOiBBcnJheTxTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIG5hbWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzTmFtZXMoXCJtYXRyaXhkcm9wZG93bmNvbHVtblwiLCBbXG4gICAgICBcImlzUmVxdWlyZWRcIixcbiAgICAgIFwiY2VsbFR5cGVcIixcbiAgICAgIFwibmFtZVwiLFxuICAgICAgXCJ0aXRsZVwiLFxuICAgIF0pO1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnRpZXNCeU5hbWVzKFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIiwgbmFtZXMpO1xuICB9XG4gIHByaXZhdGUgZ2V0Q29sdW1uTmFtZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBpdGVtcyA9IHRoaXMub3JpZ2luYWxWYWx1ZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbXMpKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBpdGVtc1tpXS5uYW1lO1xuICAgICAgaWYgKCEhbmFtZSkge1xuICAgICAgICByZXMucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUNhbkFkZENvbHVtbigpIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5vcHRpb25zIHx8XG4gICAgICB0aGlzLm9wdGlvbnMubWF4aW11bUNvbHVtbnNDb3VudCA8IDEgfHxcbiAgICAgICFBcnJheS5pc0FycmF5KHRoaXMub3JpZ2luYWxWYWx1ZSlcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdGhpcyxcbiAgICAgIHRoaXMua29DYW5BZGRJdGVtKFxuICAgICAgICB0aGlzLm9yaWdpbmFsVmFsdWUubGVuZ3RoIDwgdGhpcy5vcHRpb25zLm1heGltdW1Db2x1bW5zQ291bnRcbiAgICAgICk7XG4gIH1cbn1cblxuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyRWRpdG9yKFxuICBcIm1hdHJpeGRyb3Bkb3duY29sdW1uc1wiLFxuICBmdW5jdGlvbiAocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgU3VydmV5UHJvcGVydHlEcm9wZG93bkNvbHVtbnNFZGl0b3IocHJvcGVydHkpO1xuICB9XG4pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckZhY3RvcnlcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7XG4gIGZvY3VzRmlyc3RDb250cm9sLFxuICBnZXRGaXJzdE5vblRleHRFbGVtZW50LFxuICBnZXROb2Rlc0Zyb21Lb0NvbXBvbmVudEluZm8sXG59IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IFJNb2RhbCBmcm9tIFwicm1vZGFsXCI7XG5pbXBvcnQgeyBFZGl0YWJsZU9iamVjdCB9IGZyb20gXCIuL2VkaXRhYmxlT2JqZWN0XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yQ3VzdG9tV2lkZ2V0IHtcbiAgcHJpdmF0ZSBzdGF0aWMgY3VzdG9tV2lkZ2V0SWQgPSAxO1xuICBwcml2YXRlIHN0YXRpYyBjdXN0b21XaWRnZXROYW1lID0gXCJtb2RhbEVkaXRvckN1c3RvbVdpZGdldFwiO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMganNvbjogYW55KSB7fVxuICBwdWJsaWMgYWZ0ZXJSZW5kZXIoZWRpdG9yOiBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yLCBlbDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5qc29uICYmIHRoaXMuanNvbi5hZnRlclJlbmRlcikge1xuICAgICAgaWYgKCFlbC5pZCkge1xuICAgICAgICBlbC5pZCA9XG4gICAgICAgICAgU3VydmV5UHJvcGVydHlNb2RhbEVkaXRvckN1c3RvbVdpZGdldC5jdXN0b21XaWRnZXROYW1lICtcbiAgICAgICAgICBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yQ3VzdG9tV2lkZ2V0LmN1c3RvbVdpZGdldElkO1xuICAgICAgICBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yQ3VzdG9tV2lkZ2V0LmN1c3RvbVdpZGdldElkKys7XG4gICAgICB9XG4gICAgICB0aGlzLmpzb24uYWZ0ZXJSZW5kZXIoZWRpdG9yLCBlbCk7XG4gICAgICBpZiAodGhpcy5qc29uLmRlc3Ryb3kpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2VsZi5kZXN0cm95KGVkaXRvciwgZWwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGRlc3Ryb3koZWRpdG9yOiBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yLCBlbDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5qc29uICYmIHRoaXMuanNvbi5kZXN0cm95KSB7XG4gICAgICB0aGlzLmpzb24uZGVzdHJveShlZGl0b3IsIGVsKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3IgZXh0ZW5kcyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBjdXN0b21XaWRnZXRzO1xuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyQ3VzdG9tV2lkZ2V0KGVkaXRvclR5cGU6IHN0cmluZywganNvbjogYW55KSB7XG4gICAgaWYgKCFTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yLmN1c3RvbVdpZGdldHMpXG4gICAgICBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yLmN1c3RvbVdpZGdldHMgPSB7fTtcbiAgICBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yLmN1c3RvbVdpZGdldHNbXG4gICAgICBlZGl0b3JUeXBlXG4gICAgXSA9IG5ldyBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yQ3VzdG9tV2lkZ2V0KGpzb24pO1xuICB9XG4gIHByb3RlY3RlZCBzdGF0aWMgaWRDb3VudGVyID0gMTtcbiAgcHVibGljIHN0YXRpYyBnZXRDdXN0b21XaWRnZXQoXG4gICAgZWRpdG9yVHlwZTogc3RyaW5nXG4gICk6IFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3JDdXN0b21XaWRnZXQge1xuICAgIGlmICghU3VydmV5UHJvcGVydHlNb2RhbEVkaXRvci5jdXN0b21XaWRnZXRzKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gU3VydmV5UHJvcGVydHlNb2RhbEVkaXRvci5jdXN0b21XaWRnZXRzW2VkaXRvclR5cGVdO1xuICB9XG4gIHByaXZhdGUgaXNCZWZvcmVTaG93Q2FsbGVkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBlbGVtZW50czogSFRNTEVsZW1lbnRbXTtcbiAgcHJpdmF0ZSBtb2RhbEVkaXRhYmxlT2JqZWN0OiBFZGl0YWJsZU9iamVjdDtcbiAgcHVibGljIGVkaXRpbmdPYmplY3Q6IGFueTtcbiAgcHVibGljIG9uQXBwbHlDbGljazogYW55O1xuICBwdWJsaWMgb25Pa0NsaWNrOiBhbnk7XG4gIHB1YmxpYyBvblJlc2V0Q2xpY2s6IGFueTtcbiAgcHVibGljIG9uU2hvd01vZGFsOiBhbnk7XG4gIHB1YmxpYyBvbkhpZGVNb2RhbDogYW55O1xuICBwdWJsaWMgbW9kYWxOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBtb2RhbE5hbWVUYXJnZXQ6IHN0cmluZztcbiAga29TaG93QXBwbHlCdXR0b246IGFueTtcbiAga29UaXRsZUNhcHRpb246IGFueTtcbiAga29BZnRlclJlbmRlcjogYW55O1xuICBrb0h0bWxUb3A6IGFueTtcbiAga29IdG1sQm90dG9tOiBhbnk7XG4gIGtvSXNTaG93aW5nTW9kYWw6IGFueTtcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gICAgdGhpcy5rb1RpdGxlQ2FwdGlvbiA9IGtvLm9ic2VydmFibGUoXCJcIik7XG4gICAgdGhpcy5rb0h0bWxUb3AgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHRoaXMua29IdG1sQm90dG9tID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcbiAgICBpZiAodGhpcy5wcm9wZXJ0eSkge1xuICAgICAgdGhpcy5rb1RpdGxlQ2FwdGlvbihcbiAgICAgICAgZWRpdG9yTG9jYWxpemF0aW9uXG4gICAgICAgICAgLmdldFN0cmluZyhcInBlLmVkaXRQcm9wZXJ0eVwiKVxuICAgICAgICAgIFtcImZvcm1hdFwiXShcbiAgICAgICAgICAgIGVkaXRvckxvY2FsaXphdGlvbi5nZXRQcm9wZXJ0eU5hbWUoXG4gICAgICAgICAgICAgIHRoaXMucHJvcGVydHkubmFtZSxcbiAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eS5kaXNwbGF5TmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubW9kYWxOYW1lID1cbiAgICAgIFwibW9kZWxFZGl0b3JcIiArIHRoaXMuZWRpdG9yVHlwZSArIFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3IuaWRDb3VudGVyO1xuICAgIFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3IuaWRDb3VudGVyKys7XG4gICAgdGhpcy5tb2RhbE5hbWVUYXJnZXQgPSBcIiNcIiArIHRoaXMubW9kYWxOYW1lO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvU2hvd0FwcGx5QnV0dG9uID0ga28ub2JzZXJ2YWJsZSh0cnVlKTtcbiAgICB0aGlzLmtvSXNTaG93aW5nTW9kYWwgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcblxuICAgIHNlbGYub25IaWRlTW9kYWwgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBzZWxmLm9uQXBwbHlDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuYXBwbHkoKTtcbiAgICB9O1xuICAgIHNlbGYub25Pa0NsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlcyA9IHNlbGYuYXBwbHkoKTtcbiAgICAgIGlmIChyZXMpIHNlbGYub25IaWRlTW9kYWwoKTtcbiAgICB9O1xuICAgIHNlbGYub25SZXNldENsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi51cGRhdGVWYWx1ZSgpO1xuICAgICAgc2VsZi5vbkhpZGVNb2RhbCgpO1xuICAgIH07XG4gICAgc2VsZi5vblNob3dNb2RhbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuYmVmb3JlU2hvd01vZGFsKCk7XG4gICAgICBzZWxmLmJlZm9yZVNob3coKTtcbiAgICAgIHZhciBtb2RhbCA9IG5ldyBSTW9kYWwoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxmLm1vZGFsTmFtZVRhcmdldCksIHtcbiAgICAgICAgYm9keUNsYXNzOiBcIlwiLFxuICAgICAgICBjbG9zZVRpbWVvdXQ6IDEwMCxcbiAgICAgICAgZGlhbG9nT3BlbkNsYXNzOiBcImFuaW1hdGVkIGZhZGVJbkRvd25cIixcbiAgICAgICAgZm9jdXM6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBtb2RhbC5vcGVuKCk7XG5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFwia2V5ZG93blwiLFxuICAgICAgICBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICBtb2RhbC5rZXlkb3duKGV2KTtcbiAgICAgICAgfSxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG5cbiAgICAgIHNlbGYub25IaWRlTW9kYWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuYmVmb3JlQ2xvc2VNb2RhbCgpO1xuICAgICAgICBtb2RhbC5jbG9zZSgpO1xuICAgICAgfTtcbiAgICAgIGlmICghIXRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgZm9jdXNGaXJzdENvbnRyb2wodGhpcy5lbGVtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBzZWxmLmtvQWZ0ZXJSZW5kZXIgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiBzZWxmLmFmdGVyUmVuZGVyKGVsLCBzZWxmKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaXNNb2RhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQmVmb3JlU2hvd0NhbGxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0JlZm9yZVNob3dDYWxsZWRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgYmVmb3JlU2hvdygpIHtcbiAgICBpZiAodGhpcy5pc0JlZm9yZVNob3dDYWxsZWRWYWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuO1xuICAgIHRoaXMuaXNCZWZvcmVTaG93Q2FsbGVkVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMuYmVmb3JlU2hvd0NvcmUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgYmVmb3JlU2hvd0NvcmUoKSB7XG4gICAgdGhpcy51cGRhdGVWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVQcm9wZXJ0eVZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB2YXIgb2JqID0gdGhpcy5vYmplY3Q7XG4gICAgaWYgKCEhdGhpcy5tb2RhbEVkaXRhYmxlT2JqZWN0KSB7XG4gICAgICBvYmogPSB0aGlzLm1vZGFsRWRpdGFibGVPYmplY3QuZWRpdGFibGVPYmo7XG4gICAgfVxuICAgIG9ialt0aGlzLnByb3BlcnR5Lm5hbWVdID0gbmV3VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldE9yaWdpbmFsVmFsdWUoKTogYW55IHtcbiAgICBpZiAoISF0aGlzLm1vZGFsRWRpdGFibGVPYmplY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGFsRWRpdGFibGVPYmplY3QuZWRpdGFibGVPYmpbdGhpcy5wcm9wZXJ0eS5uYW1lXTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmdldE9yaWdpbmFsVmFsdWUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgcGVyZm9ybUFwcGx5KCkge1xuICAgIGlmICghIXRoaXMubW9kYWxFZGl0YWJsZU9iamVjdCkge1xuICAgICAgdGhpcy5tb2RhbEVkaXRhYmxlT2JqZWN0LmFwcGx5KHRoaXMucHJvcGVydHkubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLnBlcmZvcm1BcHBseSgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgYmVmb3JlU2hvd01vZGFsKCkge1xuICAgIHRoaXMubW9kYWxFZGl0YWJsZU9iamVjdCA9IG5ldyBFZGl0YWJsZU9iamVjdCh0aGlzLm9iamVjdCk7XG4gICAgdGhpcy5rb0lzU2hvd2luZ01vZGFsKHRydWUpO1xuICB9XG4gIHByb3RlY3RlZCBpc1Nob3dpbmdNb2RhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5rb0lzU2hvd2luZ01vZGFsKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGJlZm9yZUNsb3NlTW9kYWwoKSB7XG4gICAgdGhpcy5pc0JlZm9yZVNob3dDYWxsZWRWYWx1ZSA9IGZhbHNlO1xuICAgIHRoaXMua29Jc1Nob3dpbmdNb2RhbChmYWxzZSk7XG4gICAgaWYgKCEhdGhpcy5tb2RhbEVkaXRhYmxlT2JqZWN0KSB7XG4gICAgICB0aGlzLm1vZGFsRWRpdGFibGVPYmplY3QucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5tb2RhbEVkaXRhYmxlT2JqZWN0ID0gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25PcHRpb25zQ2hhbmdlZCgpIHtcbiAgICB0aGlzLmtvU2hvd0FwcGx5QnV0dG9uID0ga28ub2JzZXJ2YWJsZShcbiAgICAgICF0aGlzLm9wdGlvbnMgfHwgdGhpcy5vcHRpb25zLnNob3dBcHBseUJ1dHRvbkluRWRpdG9yc1xuICAgICk7XG4gIH1cbiAgcHVibGljIHNldE9iamVjdCh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc0JlZm9yZVNob3dDYWxsZWRWYWx1ZSA9IGZhbHNlO1xuICAgIHRoaXMuZWRpdGluZ09iamVjdCA9IHZhbHVlO1xuICAgIHN1cGVyLnNldE9iamVjdCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLnByb3BlcnR5KSB7XG4gICAgICB2YXIgaHRtbCA9IHRoaXMub3B0aW9ucy5vblByb3BlcnR5RWRpdG9yTW9kYWxTaG93RGVzY3JpcHRpb25DYWxsYmFjayhcbiAgICAgICAgdGhpcy5wcm9wZXJ0eS5uYW1lLFxuICAgICAgICB2YWx1ZVxuICAgICAgKTtcbiAgICAgIGlmIChodG1sKSB7XG4gICAgICAgIGlmIChodG1sLnRvcCkgdGhpcy5rb0h0bWxUb3AoaHRtbC50b3ApO1xuICAgICAgICBpZiAoaHRtbC5ib3R0b20pIHRoaXMua29IdG1sQm90dG9tKGh0bWwuYm90dG9tKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBpc0VkaXRhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgYWZ0ZXJSZW5kZXIoXG4gICAgY29tcG9uZW50SW5mbzogYW55LFxuICAgIG1vZGFsRWRpdG9yOiBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yXG4gICkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0Tm9kZXNGcm9tS29Db21wb25lbnRJbmZvKGNvbXBvbmVudEluZm8pO1xuICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50cztcbiAgICB2YXIgY3VzdG9tV2lkZ2V0ID0gU3VydmV5UHJvcGVydHlNb2RhbEVkaXRvci5nZXRDdXN0b21XaWRnZXQoXG4gICAgICB0aGlzLmVkaXRvclR5cGVcbiAgICApO1xuICAgIGlmICghIWN1c3RvbVdpZGdldCkge1xuICAgICAgdmFyIGVsID0gZ2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgICB2YXIgdEVsID0gZWxlbWVudHNbMF07XG4gICAgICBpZiAodEVsLm5vZGVOYW1lID09IFwiI3RleHRcIikgdEVsLmRhdGEgPSBcIlwiO1xuICAgICAgdEVsID0gZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAodEVsLm5vZGVOYW1lID09IFwiI3RleHRcIikgdEVsLmRhdGEgPSBcIlwiO1xuICAgICAgY3VzdG9tV2lkZ2V0LmFmdGVyUmVuZGVyKHRoaXMsIGVsKTtcbiAgICB9XG4gICAgaWYgKG1vZGFsRWRpdG9yLmlzU2hvd2luZ01vZGFsKCkpIHtcbiAgICAgIGZvY3VzRmlyc3RDb250cm9sKGVsZW1lbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVByb3BlcnR5VGV4dEVkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0VkaXRhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZVRleHQodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHN0ciA9IHZhbHVlO1xuICAgIGlmIChzdHIubGVuZ3RoID4gMjApIHtcbiAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgMjApICsgXCIuLi5cIjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBwdWJsaWMgb25Gb2N1cyA9ICgpID0+IHtcbiAgICB0aGlzLm9wdGlvbnNbXCJ1bmRvUmVkb01hbmFnZXJcIl0uc3RhcnRUcmFuc2FjdGlvbihcbiAgICAgIFwidGV4dGFyZWEgcHJvcGVydHkgZWRpdG9yIHRyYW5zYWN0aW9uXCJcbiAgICApO1xuICB9O1xuICBwdWJsaWMgb25CbHVyID0gKCkgPT4ge1xuICAgIHRoaXMub3B0aW9uc1tcInVuZG9SZWRvTWFuYWdlclwiXS5zdG9wVHJhbnNhY3Rpb24oKTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVByb3BlcnR5SHRtbEVkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5VGV4dEVkaXRvciB7XG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImh0bWxcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlTdHJpbmdzRWRpdG9yIGV4dGVuZHMgU3VydmV5UHJvcGVydHlNb2RhbEVkaXRvciB7XG4gIHB1YmxpYyBrb1RleHRWYWx1ZTogYW55O1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgICB0aGlzLmtvVGV4dFZhbHVlID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcbiAgICB0aGlzLmtvVGV4dFZhbHVlLnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHtcbiAgICAgIHRoaXMub25UZXh0VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzdHJpbmdbXVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZVRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3RyaW5nc1wiO1xuICB9XG4gIHByaXZhdGUgaXNTZXR0aW5nSW5pdGlhbFZhbHVlID0gZmFsc2U7XG4gIHB1YmxpYyBiZWZvcmVTaG93Q29yZSgpIHtcbiAgICBzdXBlci5iZWZvcmVTaG93Q29yZSgpO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMua29WYWx1ZSgpO1xuICAgIHRoaXMuaXNTZXR0aW5nSW5pdGlhbFZhbHVlID0gdHJ1ZTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLmtvVGV4dFZhbHVlKFwiXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5qb2luKFwiXFxuXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5rb1RleHRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuaXNTZXR0aW5nSW5pdGlhbFZhbHVlID0gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBvblRleHRWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzU2V0dGluZ0luaXRpYWxWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMua29WYWx1ZSghIW5ld1ZhbHVlID8gbmV3VmFsdWUuc3BsaXQoXCJcXG5cIikgOiBbXSk7XG4gIH1cbn1cblxuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyRWRpdG9yKFxuICBcInRleHRcIixcbiAgZnVuY3Rpb24gKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVByb3BlcnR5VGV4dEVkaXRvcihwcm9wZXJ0eSk7XG4gIH1cbik7XG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJFZGl0b3IoXG4gIFwiaHRtbFwiLFxuICBmdW5jdGlvbiAocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgU3VydmV5UHJvcGVydHlIdG1sRWRpdG9yKHByb3BlcnR5KTtcbiAgfVxuKTtcblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcbiAgXCJzdHJpbmdbXVwiLFxuICBmdW5jdGlvbiAocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICAgIHJldHVybiBuZXcgU3VydmV5UHJvcGVydHlTdHJpbmdzRWRpdG9yKHByb3BlcnR5KTtcbiAgfVxuKTtcblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlclR5cGVGb3JDZWxsRWRpdGluZyhcInRleHRcIiwgXCJzdHJpbmdcIik7XG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJUeXBlRm9yQ2VsbEVkaXRpbmcoXCJodG1sXCIsIFwic3RyaW5nXCIpO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlNb2RhbEVkaXRvciB9IGZyb20gXCIuL3Byb3BlcnR5TW9kYWxFZGl0b3JcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB9IGZyb20gXCIuL3Byb3BlcnR5RWRpdG9yQmFzZVwiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5IH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JGYWN0b3J5XCI7XG5cbmludGVyZmFjZSBJTXVsdGlwbGVWYWx1ZXNDYXRlZ29yeSB7XG4gIGtvQ2F0ZWdvcnk6IGFueTtcbiAga29UaXRsZVZpc2libGU6IGFueTtcbiAga29JdGVtczogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlNdWx0aXBsZVZhbHVlc0VkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5TW9kYWxFZGl0b3Ige1xuICBwdWJsaWMgaXRlbXM6IEFycmF5PFN1cnZleS5JdGVtVmFsdWU+ID0gW107XG4gIGtvQ2F0ZWdvcmllczogYW55O1xuICBrb0VkaXRpbmdWYWx1ZTogYW55O1xuICBwcml2YXRlIGlzRWRpdGluZ1ZhbHVlU2V0dGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgICB0aGlzLmtvRWRpdGluZ1ZhbHVlID0ga28ub2JzZXJ2YWJsZUFycmF5KCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29FZGl0aW5nVmFsdWUuc3Vic2NyaWJlKGZ1bmN0aW9uKG5ld1ZhbHVlKSB7XG4gICAgICBpZiAoc2VsZi5pc0VkaXRpbmdWYWx1ZVNldHRpbmcpIHJldHVybjtcbiAgICAgIHNlbGYua29WYWx1ZShbXS5jb25jYXQoc2VsZi5rb0VkaXRpbmdWYWx1ZSgpKSk7XG4gICAgfSk7XG4gICAgdGhpcy5rb0NhdGVnb3JpZXMgPSBrby5vYnNlcnZhYmxlQXJyYXkoKTtcbiAgICB0aGlzLmtvQ2F0ZWdvcmllcyA9IGtvLm9ic2VydmFibGVBcnJheSgpO1xuICAgIHRoaXMudXBkYXRlQ2hvaWNlcygpO1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZVRleHQodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZS5lbXB0eVwiKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB2YWx1ZSA9IFt2YWx1ZV07XG4gICAgdmFyIHN0ciA9IFwiW1wiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkgc3RyICs9IFwiLCBcIjtcbiAgICAgIHN0ciArPSB0aGlzLmdldFRleHRCeUl0ZW1WYWx1ZSh2YWx1ZVtpXSk7XG4gICAgfVxuICAgIHN0ciArPSBcIl1cIjtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHB1YmxpYyBzZXRPYmplY3QodmFsdWU6IGFueSkge1xuICAgIHN1cGVyLnNldE9iamVjdCh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVDaG9pY2VzKCk7XG4gICAgdGhpcy5zZXRFZGl0aW5nVmFsdWUoKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlVmFsdWUoKSB7XG4gICAgc3VwZXIudXBkYXRlVmFsdWUoKTtcbiAgICB0aGlzLnNldEVkaXRpbmdWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm11bHRpcGxldmFsdWVzXCI7XG4gIH1cbiAgcHVibGljIGdldEJhY2tncm91bmRDbHModmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5rb0VkaXRpbmdWYWx1ZSgpLmluZGV4T2YoXCJcIiArIHZhbHVlKSA9PT0gLTFcbiAgICAgID8gXCJzdmQtbGlnaHQtYmFja2dyb3VuZC1jb2xvclwiXG4gICAgICA6IFwic3ZkLW1haW4tYmFja2dyb3VuZC1jb2xvclwiO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVEeW5hbWljUHJvcGVydGllcygpIHtcbiAgICBzdXBlci51cGRhdGVEeW5hbWljUHJvcGVydGllcygpO1xuICAgIHRoaXMudXBkYXRlQ2hvaWNlcygpO1xuICB9XG4gIHByaXZhdGUgc2V0Q2hvaWNlcyhjaG9pY2VzOiBBcnJheTxTdXJ2ZXkuSXRlbVZhbHVlPikge1xuICAgIGlmICghY2hvaWNlcyB8fCAhQXJyYXkuaXNBcnJheShjaG9pY2VzKSB8fCAhY2hvaWNlcy5sZW5ndGgpIHJldHVybjtcbiAgICBTdXJ2ZXkuSXRlbVZhbHVlLnNldERhdGEodGhpcy5pdGVtcywgY2hvaWNlcyk7XG4gICAgdGhpcy5zZXRDYXRlZ29yaWVzKGNob2ljZXMpO1xuICAgIHRoaXMuaXRlbXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICB2YXIgY2EgPSAhIWEuY2F0ZWdvcnkgPyBhLmNhdGVnb3J5IDogXCJcIjtcbiAgICAgIHZhciBjYiA9ICEhYi5jYXRlZ29yeSA/IGIuY2F0ZWdvcnkgOiBcIlwiO1xuICAgICAgaWYgKGNhICE9IGNiKSByZXR1cm4gY2EgPCBjYiA/IC0xIDogMTtcbiAgICAgIGNhID0gISFhLnRleHQgPyBhLnRleHQgOiBcIlwiO1xuICAgICAgY2IgPSAhIWIudGV4dCA/IGIudGV4dCA6IFwiXCI7XG4gICAgICBpZiAoY2EgIT0gY2IpIHJldHVybiBjYSA8IGNiID8gLTEgOiAxO1xuICAgICAgaWYgKGNhLnZhbHVlIDwgY2IudmFsdWUpIHJldHVybiAtMTtcbiAgICAgIGlmIChjYS52YWx1ZSA+IGNiLnZhbHVlKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICAgIHRoaXMua29DYXRlZ29yaWVzKHRoaXMuYnVpbGRDYXRlZ29yaWVzKCkpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQ2hvaWNlcygpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNob2ljZXMgPSAoPGFueT50aGlzLnByb3BlcnR5W1wiZ2V0Q2hvaWNlc1wiXSkodGhpcy5vYmplY3QsIGZ1bmN0aW9uKFxuICAgICAgY2hvaWNlczogYW55XG4gICAgKSB7XG4gICAgICBzZWxmLnNldENob2ljZXMoY2hvaWNlcyk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRDaG9pY2VzKGNob2ljZXMpO1xuICB9XG4gIHByaXZhdGUgZ2V0VGV4dEJ5SXRlbVZhbHVlKHZhbDogYW55KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpXS52YWx1ZSA9PSB2YWwpIHJldHVybiB0aGlzLml0ZW1zW2ldLnRleHQ7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJpdmF0ZSBzZXRFZGl0aW5nVmFsdWUoKSB7XG4gICAgdGhpcy5pc0VkaXRpbmdWYWx1ZVNldHRpbmcgPSB0cnVlO1xuICAgIHZhciB2YWwgPSB0aGlzLmtvVmFsdWUoKTtcbiAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09IHVuZGVmaW5lZCkgdmFsID0gW107XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHZhbCA9IFt2YWxdO1xuICAgIHRoaXMua29FZGl0aW5nVmFsdWUodmFsKTtcbiAgICB0aGlzLmlzRWRpdGluZ1ZhbHVlU2V0dGluZyA9IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgc2V0Q2F0ZWdvcmllcyhjaG9pY2VzOiBBcnJheTxTdXJ2ZXkuSXRlbVZhbHVlPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCEhY2hvaWNlc1tpXS5jYXRlZ29yeSkge1xuICAgICAgICB0aGlzLml0ZW1zW2ldLmNhdGVnb3J5ID0gY2hvaWNlc1tpXS5jYXRlZ29yeTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBidWlsZENhdGVnb3JpZXMoKTogQXJyYXk8SU11bHRpcGxlVmFsdWVzQ2F0ZWdvcnk+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGN1ckNhdGVnb3J5ID0gXCJcIjtcbiAgICB2YXIgY2F0ZWdvcnkgPSBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgICAgdmFyIGl0ZW1DYXRlZ29yeSA9ICEhaXRlbS5jYXRlZ29yeSA/IGl0ZW0uY2F0ZWdvcnkgOiBcIlwiO1xuICAgICAgaWYgKGNhdGVnb3J5ID09IG51bGwgfHwgY3VyQ2F0ZWdvcnkgIT0gaXRlbUNhdGVnb3J5KSB7XG4gICAgICAgIGN1ckNhdGVnb3J5ID0gaXRlbUNhdGVnb3J5O1xuICAgICAgICBjYXRlZ29yeSA9IHtcbiAgICAgICAgICBrb1RpdGxlVmlzaWJsZToga28ub2JzZXJ2YWJsZShjdXJDYXRlZ29yeSAhPSBcIlwiKSxcbiAgICAgICAgICBrb0NhdGVnb3J5OiBrby5vYnNlcnZhYmxlKGN1ckNhdGVnb3J5KSxcbiAgICAgICAgICBrb0l0ZW1zOiBrby5vYnNlcnZhYmxlQXJyYXkoKSxcbiAgICAgICAgICBlZGl0b3I6IHRoaXNcbiAgICAgICAgfTtcbiAgICAgICAgcmVzLnB1c2goY2F0ZWdvcnkpO1xuICAgICAgfVxuICAgICAgY2F0ZWdvcnkua29JdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJFZGl0b3IoXCJtdWx0aXBsZXZhbHVlc1wiLCBmdW5jdGlvbihcbiAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHlcbik6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gIHJldHVybiBuZXcgU3VydmV5UHJvcGVydHlNdWx0aXBsZVZhbHVlc0VkaXRvcihwcm9wZXJ0eSk7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5SXRlbXNFZGl0b3IgfSBmcm9tIFwiLi9wcm9wZXJ0eUl0ZW1zRWRpdG9yXCI7XG5pbXBvcnQge1xuICBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UsXG4gIElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zLFxufSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckJhc2VcIjtcbmltcG9ydCB7XG4gIFN1cnZleVF1ZXN0aW9uRWRpdG9yLFxuICBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsLFxuICBTdXJ2ZXlRdWVzdGlvblByb3BlcnRpZXMsXG59IGZyb20gXCIuLi9xdWVzdGlvbkVkaXRvcnMvcXVlc3Rpb25FZGl0b3JcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IFN1cnZleU9iamVjdFByb3BlcnR5IH0gZnJvbSBcIi4uL29iamVjdFByb3BlcnR5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5SXRlbXNFZGl0b3Ige1xuICBrb0VkaXRJdGVtOiBhbnk7XG4gIGtvSXNMaXN0OiBhbnk7XG4gIGtvQWN0aXZlVmlldzogYW55O1xuICBvbkVkaXRJdGVtQ2xpY2s6IGFueTtcbiAgb25SZXR1cm5Ub0xpc3RDbGljazogYW55O1xuICBrb0VkaXRvck5hbWU6IGFueTtcbiAga29TaG93SGVhZGVyOiBhbnk7XG4gIHByaXZhdGUga29Db2x1bW5zVmFsdWUgPSBrby5vYnNlcnZhYmxlPFxuICAgIEFycmF5PFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9yQ29sdW1uPlxuICA+KFtdKTtcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29TaG93SGVhZGVyID0ga28ub2JzZXJ2YWJsZSh0cnVlKTtcbiAgICB0aGlzLmtvRWRpdEl0ZW0gPSBrby5vYnNlcnZhYmxlKG51bGwpO1xuICAgIHRoaXMua29Jc0xpc3QgPSBrby5vYnNlcnZhYmxlKHRydWUpO1xuICAgIHRoaXMua29BY3RpdmVWaWV3ID0ga28ub2JzZXJ2YWJsZShcImZvcm1cIik7XG4gICAgdGhpcy5rb0VkaXRJdGVtLnN1YnNjcmliZShmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgIHNlbGYua29Jc0xpc3Qoc2VsZi5rb0VkaXRJdGVtKCkgPT0gbnVsbCk7XG4gICAgICBzZWxmLm9uTGlzdERldGFpbFZpZXdDaGFuZ2VkKCk7XG4gICAgfSk7XG4gICAgdGhpcy5vbkVkaXRJdGVtQ2xpY2sgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgc2VsZi5rb0VkaXRJdGVtKGl0ZW0pO1xuICAgIH07XG4gICAgdGhpcy5vblJldHVyblRvTGlzdENsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGVkaXRJdGVtID0gc2VsZi5rb0VkaXRJdGVtKCk7XG4gICAgICBpZiAoZWRpdEl0ZW0uaXRlbUVkaXRvciAmJiBlZGl0SXRlbS5pdGVtRWRpdG9yLmhhc0Vycm9yKCkpIHJldHVybjtcbiAgICAgIGVkaXRJdGVtLmhpZGVJdGVtRWRpdG9yKCk7XG4gICAgICBzZWxmLmtvRWRpdEl0ZW0obnVsbCk7XG4gICAgfTtcbiAgICB0aGlzLmtvRWRpdG9yTmFtZSA9IGtvLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzZWxmLmdldEVkaXRvck5hbWUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvckNvbHVtbj4ge1xuICAgIHJldHVybiB0aGlzLmtvQ29sdW1uc1ZhbHVlKCk7XG4gIH1cbiAgcHVibGljIGJlZm9yZVNob3dDb3JlKCkge1xuICAgIHN1cGVyLmJlZm9yZVNob3dDb3JlKCk7XG4gICAgdGhpcy5jcmVhdGVDb2x1bW5zKCk7XG4gICAgdGhpcy5rb1Nob3dIZWFkZXIodGhpcy5jYW5TaG93SGVhZGVyKCkpO1xuICAgIHRoaXMua29FZGl0SXRlbShudWxsKTtcbiAgfVxuICBwdWJsaWMgY3JlYXRlQ29sdW1ucygpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldENvbHVtbnNQcm9wZXJ0aWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaChuZXcgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3JDb2x1bW4ocHJvcGVydGllc1tpXSkpO1xuICAgIH1cbiAgICB0aGlzLmtvQ29sdW1uc1ZhbHVlKHJlc3VsdCk7XG4gIH1cbiAgcHJpdmF0ZSBjYW5TaG93SGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmtvQ29sdW1uc1ZhbHVlKCkubGVuZ3RoID4gMTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29sdW1uc1Byb3BlcnRpZXMoKTogQXJyYXk8U3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvcGVydGllc05hbWVzKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIGRlZmF1bHROYW1lczogQXJyYXk8c3RyaW5nPlxuICApOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldERlZmluZWRMaXN0UHJvcGVydGllcyhjbGFzc05hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgaWYgKHJlcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmVzID0gZGVmYXVsdE5hbWVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZpbmVkTGlzdFByb3BlcnRpZXMoY2xhc3NOYW1lOiBzdHJpbmcgPSBudWxsKTogQXJyYXk8YW55PiB7XG4gICAgaWYgKCF0aGlzLnByb3BlcnR5KSByZXR1cm4gW107XG4gICAgdmFyIG9iaiA9IFN1cnZleS5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKHRoaXMucHJvcGVydHkuY2xhc3NOYW1lKTtcbiAgICBpZiAoIW9iaikgcmV0dXJuIFtdO1xuICAgIHZhciBwcm9wcyA9IG5ldyBTdXJ2ZXlRdWVzdGlvblByb3BlcnRpZXMoXG4gICAgICBvYmosXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBcImxpc3RcIixcbiAgICAgIHRoaXMub2JqZWN0LFxuICAgICAgdGhpcy5wcm9wZXJ0eVxuICAgICk7XG4gICAgaWYgKHByb3BzLmdldFRhYnMoKS5sZW5ndGggPT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBwcm9wcy5nZXRUYWJzKClbMF0ucHJvcGVydGllcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdExpc3RQcm9wZXJ0aWVzKCk6IEFycmF5PFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgcHJvcGVydGllcyA9IFN1cnZleS5TZXJpYWxpemVyLmdldFByb3BlcnRpZXModGhpcy5wcm9wZXJ0eS5jbGFzc05hbWUpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5pc1Byb3BlcnR5U2hvd25Jbkxpc3QocHJvcGVydGllc1tpXSkpIGNvbnRpbnVlO1xuICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGlzUHJvcGVydHlTaG93bkluTGlzdChcbiAgICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gcHJvcGVydHkudmlzaWJsZSAmJiBwcm9wZXJ0eS5zaG93TW9kZSAhPT0gXCJmb3JtXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb3BlcnRpZXNCeU5hbWVzKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIG5hbWVzOiBBcnJheTxhbnk+XG4gICk6IEFycmF5PFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgIG5hbWUubmFtZSA/IG5hbWUubmFtZSA6IG5hbWU7XG4gICAgICB2YXIgcHJvcCA9IFN1cnZleS5TZXJpYWxpemVyLmZpbmRQcm9wZXJ0eShjbGFzc05hbWUsIG5hbWUpO1xuICAgICAgaWYgKHByb3AgJiYgcHJvcC52aXNpYmxlKSB7XG4gICAgICAgIHJlcy5wdXNoKHByb3ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFZGl0b3JOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1DbGFzc05hbWUoaXRlbTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuRGVsZXRlSXRlbShpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMub3B0aW9ucyB8fFxuICAgICAgdGhpcy5vcHRpb25zLm9uQ2FuRGVsZXRlSXRlbUNhbGxiYWNrKHRoaXMub2JqZWN0LCBpdGVtLCB0cnVlKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUVkaXRvckl0ZW0oaXRlbTogYW55KTogU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3JJdGVtIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9ySXRlbShcbiAgICAgIGl0ZW0sXG4gICAgICAoKSA9PiB0aGlzLmNvbHVtbnMsXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICAoaXRlbSkgPT4gdGhpcy5nZXRJdGVtQ2xhc3NOYW1lKGl0ZW0pLFxuICAgICAgdGhpcy5jYW5EZWxldGVJdGVtKGl0ZW0pLFxuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlLFxuICAgICAgdGhpcy5yZWFkT25seSgpLFxuICAgICAgdGhpcy5vYmplY3QsXG4gICAgICB0aGlzLnByb3BlcnR5XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25MaXN0RGV0YWlsVmlld0NoYW5nZWQoKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3JJdGVtIHtcbiAgcHVibGljIHN0YXRpYyBkcmFnSWNvbk5hbWUgPSBcImljb24tZHJhZy1pdGVtXCI7XG4gIHB1YmxpYyBzdGF0aWMgZGVsZXRlSWNvbk5hbWUgPSBcImljb24tZGVsZXRlLWNyb3NzXCI7XG4gIGdldCBkcmFnSWNvbigpIHtcbiAgICByZXR1cm4gU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3JJdGVtLmRyYWdJY29uTmFtZTtcbiAgfVxuICBnZXQgZGVsZXRlSWNvbigpIHtcbiAgICByZXR1cm4gU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3JJdGVtLmRlbGV0ZUljb25OYW1lO1xuICB9XG4gIHB1YmxpYyBrb0hhc0RldGFpbHM6IGFueTtcbiAga29DYW5EZWxldGVJdGVtOiBhbnk7XG4gIHByb3RlY3RlZCBvcHRpb25zOiBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9ucztcbiAgcHJpdmF0ZSBrb0NlbGxzVmFsdWUgPSBrby5vYnNlcnZhYmxlQXJyYXk8U3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3JFZGl0b3JDZWxsPigpO1xuICBwcml2YXRlIGl0ZW1FZGl0b3JWYWx1ZTogU3VydmV5RWxlbWVudEVkaXRvckNvbnRlbnRNb2RlbDtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG9iajogYW55LFxuICAgIHByaXZhdGUgZ2V0Q29sdW1uczogKCkgPT4gQXJyYXk8U3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3JDb2x1bW4+LFxuICAgIG9wdGlvbnM6IElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zLFxuICAgIHByaXZhdGUgZ2V0SXRlbUNsYXNzTmFtZTogKGl0ZW06IGFueSkgPT4gc3RyaW5nID0gbnVsbCxcbiAgICBjYW5EZWxldGVJdGVtOiBib29sZWFuID0gdHJ1ZSxcbiAgICBwcml2YXRlIHBhcmVudExpc3Q6IEFycmF5PFN1cnZleS5CYXNlPiA9IG51bGwsXG4gICAgcHJpdmF0ZSBpc1JlYWRPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgcHJpdmF0ZSBwYXJlbnRPYmo6IFN1cnZleS5CYXNlID0gdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcGFyZW50UHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkgPSB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5rb0NhbkRlbGV0ZUl0ZW0gPSBrby5vYnNlcnZhYmxlKGNhbkRlbGV0ZUl0ZW0pO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5rb0hhc0RldGFpbHMgPSBrby5vYnNlcnZhYmxlKHRoaXMuaGFzRGV0YWlsc1Byb3BlcnRpZXMoKSk7XG4gICAga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgdmFyIGNvbHVtbnMgPSB0aGlzLmdldENvbHVtbnMoKTtcbiAgICAgIHRoaXMua29DZWxsc1ZhbHVlKFtdKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmtvQ2VsbHNWYWx1ZS5wdXNoKFxuICAgICAgICAgIG5ldyBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvckVkaXRvckNlbGwoXG4gICAgICAgICAgICBvYmosXG4gICAgICAgICAgICBjb2x1bW5zW2ldLnByb3BlcnR5LFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgdGhpcy5wYXJlbnRMaXN0LFxuICAgICAgICAgICAgdGhpcy5pc1JlYWRPbmx5LFxuICAgICAgICAgICAgdGhpcy5wYXJlbnRPYmosXG4gICAgICAgICAgICB0aGlzLnBhcmVudFByb3BlcnR5XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZ2V0SXRlbUNsYXNzTmFtZSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXRlbUNsYXNzTmFtZSh0aGlzLm9iaik7XG4gIH1cbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9yQ29sdW1uPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29sdW1ucygpO1xuICB9XG4gIHByb3RlY3RlZCBoYXNEZXRhaWxzUHJvcGVydGllcygpOiBib29sZWFuIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG5ldyBTdXJ2ZXlRdWVzdGlvblByb3BlcnRpZXMoXG4gICAgICB0aGlzLm9iaixcbiAgICAgIHRoaXMub3B0aW9ucyxcbiAgICAgIHRoaXMuZ2V0Q2xhc3NOYW1lKClcbiAgICApO1xuICAgIHJldHVybiAhcHJvcGVydGllcy5pc0VtcHR5O1xuICB9XG4gIHB1YmxpYyBoaWRlSXRlbUVkaXRvcigpIHtcbiAgICB0aGlzLml0ZW1FZGl0b3JWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy51cGRhdGVWYWx1ZXMoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGl0ZW1FZGl0b3IoKTogU3VydmV5RWxlbWVudEVkaXRvckNvbnRlbnRNb2RlbCB7XG4gICAgaWYgKCF0aGlzLml0ZW1FZGl0b3JWYWx1ZSlcbiAgICAgIHRoaXMuaXRlbUVkaXRvclZhbHVlID0gdGhpcy5jcmVhdGVTdXJ2ZXlRdWVzdGlvbkVkaXRvcigpO1xuICAgIHJldHVybiB0aGlzLml0ZW1FZGl0b3JWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNlbGxzKCk6IEFycmF5PFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9yRWRpdG9yQ2VsbD4ge1xuICAgIHJldHVybiB0aGlzLmtvQ2VsbHNWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pdGVtRWRpdG9yVmFsdWUgJiYgdGhpcy5pdGVtRWRpdG9yVmFsdWUuaGFzRXJyb3IoKSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzID0gdGhpcy5jZWxsc1tpXS5oYXNFcnJvciB8fCByZXM7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2VsbHNbaV0udXBkYXRlVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleVF1ZXN0aW9uRWRpdG9yKCkge1xuICAgIHZhciByZXMgPSBuZXcgU3VydmV5RWxlbWVudEVkaXRvckNvbnRlbnRNb2RlbChcbiAgICAgIHRoaXMub2JqLFxuICAgICAgdGhpcy5nZXRDbGFzc05hbWUoKSxcbiAgICAgIHRoaXMub3B0aW9ucyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIHJlcy5zZXRQYXJlbnRMaXN0KHRoaXMucGFyZW50TGlzdCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBmb2N1cygpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHZhciBmaXJzdENlbGwgPSB0aGlzLmNlbGxzWzBdO1xuICAgICAgZmlyc3RDZWxsICYmIGZpcnN0Q2VsbC5lZGl0b3IuZm9jdXMoKTtcbiAgICB9LCAxMCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9yQ29sdW1uIHtcbiAgY29uc3RydWN0b3IocHVibGljIHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7fVxuICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgdGV4dCA9IGVkaXRvckxvY2FsaXphdGlvbi5oYXNTdHJpbmcoXCJwZWwuXCIgKyB0aGlzLnByb3BlcnR5Lm5hbWUpXG4gICAgICA/IGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZWwuXCIgKyB0aGlzLnByb3BlcnR5Lm5hbWUpXG4gICAgICA6IGVkaXRvckxvY2FsaXphdGlvbi5nZXRQcm9wZXJ0eU5hbWVJbkVkaXRvcihcbiAgICAgICAgICB0aGlzLnByb3BlcnR5Lm5hbWUsXG4gICAgICAgICAgdGhpcy5wcm9wZXJ0eS5kaXNwbGF5TmFtZVxuICAgICAgICApO1xuICAgIHJldHVybiB0ZXh0ID8gdGV4dCA6IHRoaXMucHJvcGVydHkubmFtZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3JFZGl0b3JDZWxsIHtcbiAgcHJpdmF0ZSBvYmplY3RQcm9wZXJ0eVZhbHVlOiBTdXJ2ZXlPYmplY3RQcm9wZXJ0eTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9ucztcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG9iajogYW55LFxuICAgIHB1YmxpYyBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBvcHRpb25zOiBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9ucyA9IG51bGwsXG4gICAgbGlzdE9iajogQXJyYXk8U3VydmV5LkJhc2U+ID0gbnVsbCxcbiAgICBwYXJlbnRSZWFkT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIHByaXZhdGUgcGFyZW50T2JqOiBTdXJ2ZXkuQmFzZSA9IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHBhcmVudFByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5ID0gdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5vYmplY3RQcm9wZXJ0eVZhbHVlID0gbmV3IFN1cnZleU9iamVjdFByb3BlcnR5KFxuICAgICAgdGhpcy5wcm9wZXJ0eSxcbiAgICAgIHRoaXMub3B0aW9ucyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGxldCBlZGl0b3IgPSB0aGlzLm9iamVjdFByb3BlcnR5VmFsdWUuZWRpdG9yO1xuICAgIGVkaXRvci5pc0lucGxhY2VQcm9wZXJ0eSA9IHRydWU7XG4gICAgZWRpdG9yLnBhcmVudExpc3QgPSBsaXN0T2JqO1xuICAgIGVkaXRvci5wYXJlbnRSZWFkT25seSA9IHBhcmVudFJlYWRPbmx5O1xuICAgIGVkaXRvci5wYXJlbnRPYmogPSB0aGlzLnBhcmVudE9iajtcbiAgICBlZGl0b3IucGFyZW50UHJvcGVydHkgPSB0aGlzLnBhcmVudFByb3BlcnR5O1xuICAgIHRoaXMub2JqZWN0UHJvcGVydHkub2JqZWN0ID0gb2JqO1xuICB9XG4gIHB1YmxpYyBnZXQgb2JqZWN0UHJvcGVydHkoKTogU3VydmV5T2JqZWN0UHJvcGVydHkge1xuICAgIHJldHVybiB0aGlzLm9iamVjdFByb3BlcnR5VmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3IoKTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3RQcm9wZXJ0eS5lZGl0b3I7XG4gIH1cbiAgcHVibGljIGdldCBrb1ZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0UHJvcGVydHkuZWRpdG9yLmtvVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5rb1ZhbHVlKCk7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMua29WYWx1ZSh2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmhhc0Vycm9yKCk7XG4gIH1cbiAgcHVibGljIHVwZGF0ZVZhbHVlKCkge1xuICAgIHRoaXMuZWRpdG9yLnVwZGF0ZVZhbHVlKCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5SXRlbXNFZGl0b3IgfSBmcm9tIFwiLi9wcm9wZXJ0eUl0ZW1zRWRpdG9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uRWRpdG9ycy9xdWVzdGlvbkVkaXRvclwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlPbmVTZWxlY3RlZEVkaXRvciBleHRlbmRzIFN1cnZleVByb3BlcnR5SXRlbXNFZGl0b3Ige1xuICBwdWJsaWMgc2VsZWN0ZWRPYmplY3RFZGl0b3IgPSBrby5vYnNlcnZhYmxlPFN1cnZleUVsZW1lbnRFZGl0b3JDb250ZW50TW9kZWw+KFxuICAgIG51bGxcbiAgKTtcbiAgcHVibGljIGtvU2VsZWN0ZWQgPSBrby5vYnNlcnZhYmxlKG51bGwpO1xuICBwdWJsaWMga29DaGFuZ2VDb3VudGVyID0ga28ub2JzZXJ2YWJsZSgwKTtcbiAgcHVibGljIGtvQXZhaWxhYmxlQ2xhc3NlczogYW55O1xuICBwcml2YXRlIGN1cnJlbnRPYmpDbGFzc05hbWU6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29BdmFpbGFibGVDbGFzc2VzID0ga28ub2JzZXJ2YWJsZUFycmF5KHRoaXMuZ2V0QXZhaWxhYmxlQ2xhc3NlcygpKTtcbiAgICB0aGlzLmtvU2VsZWN0ZWQuc3Vic2NyaWJlKGZ1bmN0aW9uKG5ld1ZhbHVlKSB7XG4gICAgICBpZiAoIW5ld1ZhbHVlKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KHNlbGYub3JpZ2luYWxWYWx1ZSkgJiZcbiAgICAgICAgICBzZWxmLm9yaWdpbmFsVmFsdWUuaW5kZXhPZihuZXdWYWx1ZSkgPCAwXG4gICAgICAgICkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBuZXdWYWx1ZSA9PSBudWxsICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2VsZi5vcmlnaW5hbFZhbHVlKSAmJlxuICAgICAgICBzZWxmLm9yaWdpbmFsVmFsdWUubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIHNlbGYua29TZWxlY3RlZChzZWxmLm9yaWdpbmFsVmFsdWVbMF0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWxmLnNlbGVjdGVkT2JqZWN0RWRpdG9yKHNlbGYuY3JlYXRlU2VsZWN0ZWRPYmpFZGl0b3IobmV3VmFsdWUpKTtcbiAgICB9KTtcbiAgICB0aGlzLm9uRGVsZXRlQ2xpY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZGVsZXRlSXRlbShzZWxmLmtvU2VsZWN0ZWQoKSk7XG4gICAgfTtcbiAgICB0aGlzLm9uQWRkQ2xpY2sgPSBmdW5jdGlvbihpdGVtOiBhbnkpIHtcbiAgICAgIHNlbGYuYWRkTmV3SXRlbSghIWl0ZW0gPyBpdGVtLnZhbHVlIDogbnVsbCk7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm9uZS1zZWxlY3RlZFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm9uZXNlbGVjdGVkXCI7XG4gIH1cbiAgcHVibGljIGdldEl0ZW1UZXh0KGl0ZW06IGFueSwgY291bnRlcjogYW55ID0gbnVsbCk6IGFueSB7XG4gICAgcmV0dXJuIGl0ZW0uZ2V0VHlwZSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRPYmpDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudE9iakNsYXNzTmFtZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0QXZhaWxhYmxlQ2xhc3NlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHJvdGVjdGVkIGFkZE5ld0l0ZW0oY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnRPYmpDbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgdGhpcy5hZGRJdGVtKCk7XG4gICAgdGhpcy5zZWxlY3ROZXdJdGVtKHRydWUpO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5vblZhbHVlQ2hhbmdlZCgpO1xuICAgIHRoaXMua29BdmFpbGFibGVDbGFzc2VzKHRoaXMuZ2V0QXZhaWxhYmxlQ2xhc3NlcygpKTtcbiAgICB0aGlzLnNlbGVjdE5ld0l0ZW0oZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlU2VsZWN0ZWRPYmpFZGl0b3IoaXRlbTogYW55KTogU3VydmV5RWxlbWVudEVkaXRvckNvbnRlbnRNb2RlbCB7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgZWRpdG9yID0gbmV3IFN1cnZleUVsZW1lbnRFZGl0b3JDb250ZW50TW9kZWwoaXRlbSwgbnVsbCwgdGhpcy5vcHRpb25zKTtcbiAgICBlZGl0b3Iub25Qcm9wZXJ0eUNoYW5nZWQgPSAocHJvcDogYW55KSA9PiB7XG4gICAgICB0aGlzLmtvQ2hhbmdlQ291bnRlcih0aGlzLmtvQ2hhbmdlQ291bnRlcigpICsgMSk7XG4gICAgfTtcbiAgICB0aGlzLm9uQ3JlYXRlRWRpdG9yKGVkaXRvcik7XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICBwcm90ZWN0ZWQgb25DcmVhdGVFZGl0b3IoZWRpdG9yOiBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsKSB7fVxuICBwcm90ZWN0ZWQgb25JdGVtRGVsZXRlZChvYmo6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChpbmRleCA+PSB0aGlzLm9yaWdpbmFsVmFsdWUubGVuZ3RoKSB7XG4gICAgICBpbmRleCA9IHRoaXMub3JpZ2luYWxWYWx1ZS5sZW5ndGggLSAxO1xuICAgIH1cbiAgICB0aGlzLmtvU2VsZWN0ZWQoaW5kZXggPiAtMSA/IHRoaXMub3JpZ2luYWxWYWx1ZVtpbmRleF0gOiBudWxsKTtcbiAgfVxuICBwcml2YXRlIHNlbGVjdE5ld0l0ZW0oaXNOZXc6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMua29TZWxlY3RlZCB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLm9yaWdpbmFsVmFsdWUpKSByZXR1cm47XG4gICAgdmFyIGluZGV4ID0gdGhpcy5vcmlnaW5hbFZhbHVlLmxlbmd0aCAtIDE7XG4gICAgaWYgKCFpc05ldykge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5vcmlnaW5hbFZhbHVlLmluZGV4T2YodGhpcy5rb1NlbGVjdGVkKCkpO1xuICAgICAgaWYgKGluZGV4IDwgMCAmJiB0aGlzLm9yaWdpbmFsVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICBpbmRleCA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciB2YWwgPSBpbmRleCA+IC0xID8gdGhpcy5vcmlnaW5hbFZhbHVlW2luZGV4XSA6IG51bGw7XG4gICAgaWYgKHZhbCAhPSB0aGlzLmtvU2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5rb1NlbGVjdGVkKHZhbCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdJdGVtKCk6IGFueSB7XG4gICAgcmV0dXJuIFN1cnZleS5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKHRoaXMuZ2V0T2JqQ2xhc3NOYW1lKCkpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQge1xuICBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UsXG4gIElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zLFxufSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckJhc2VcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uRWRpdG9yIH0gZnJvbSBcIi4uL3F1ZXN0aW9uRWRpdG9ycy9xdWVzdGlvbkVkaXRvclwiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0IHtcbiAgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3IsXG4gIFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9ySXRlbSxcbn0gZnJvbSBcIi4vcHJvcGVydHlOZXN0ZWRQcm9wZXJ0eUVkaXRvclwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5IH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JGYWN0b3J5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tIFwiLi4vc3VydmV5SGVscGVyXCI7XG5pbXBvcnQgeyBFZGl0YWJsZU9iamVjdCB9IGZyb20gXCIuL2VkaXRhYmxlT2JqZWN0XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eVBhZ2VzRWRpdG9yIGV4dGVuZHMgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzdXJ2ZXlwYWdlc1wiO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZVRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibmVzdGVkLWl0ZW1zXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEVkaXRvck5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMua29FZGl0SXRlbSgpKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uXG4gICAgICAuZ2V0U3RyaW5nKFwicGUuY29sdW1uRWRpdFwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMua29FZGl0SXRlbSgpLm9iai5uYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXRlbUNsYXNzTmFtZShpdGVtOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhZ2VcIjtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3SXRlbSgpOiBhbnkge1xuICAgIHZhciBuZXdOYW1lID0gU3VydmV5SGVscGVyLmdldE5ld1BhZ2VOYW1lKHRoaXMub3JpZ2luYWxWYWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXkuUGFnZShuZXdOYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29sdW1uc1Byb3BlcnRpZXMoKTogQXJyYXk8U3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciBwcm9wZXJ0eU5hbWVzID0gW1wibmFtZVwiLCBcInRpdGxlXCJdO1xuICAgIGlmICghIXRoaXMub2JqZWN0KSB7XG4gICAgICBwcm9wZXJ0eU5hbWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzTmFtZXMoXCJwYWdlQFwiICsgdGhpcy5vYmplY3QuZ2V0VHlwZSgpLCBbXG4gICAgICAgIFwibmFtZVwiLFxuICAgICAgICBcInRpdGxlXCIsXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydGllc0J5TmFtZXMoXCJwYWdlXCIsIHByb3BlcnR5TmFtZXMpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVFZGl0b3JJdGVtKGl0ZW06IGFueSk6IFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9ySXRlbSB7XG4gICAgdmFyIHJlcyA9IHN1cGVyLmNyZWF0ZUVkaXRvckl0ZW0oaXRlbSk7XG4gICAgcmVzLmtvSGFzRGV0YWlscyhmYWxzZSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgY2FuRGVsZXRlSXRlbShpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICB2YXIgc3VydmV5ID0gRWRpdGFibGVPYmplY3QuZ2V0U3VydmV5KHRoaXMub2JqZWN0KTtcbiAgICBpZiAoIXN1cnZleSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLm9wdGlvbnMgfHxcbiAgICAgIHRoaXMub3B0aW9ucy5vbkNhbkRlbGV0ZUl0ZW1DYWxsYmFjayhcbiAgICAgICAgdGhpcy5vYmplY3QsXG4gICAgICAgIGl0ZW0sXG4gICAgICAgIHN1cnZleS5jdXJyZW50UGFnZSAhPT0gaXRlbVxuICAgICAgKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUVkaXRvck9wdGlvbnMoKTogYW55IHtcbiAgICByZXR1cm4geyBhbGxvd0FkZFJlbW92ZUl0ZW1zOiB0cnVlLCBhbGxvd1JlbW92ZUFsbEl0ZW1zOiBmYWxzZSB9O1xuICB9XG4gIHByb3RlY3RlZCBzdGFydERyYWdJdGVtKCkge1xuICAgIHZhciBzdXJ2ZXkgPSBFZGl0YWJsZU9iamVjdC5nZXRTdXJ2ZXkodGhpcy5vYmplY3QpO1xuICAgIGlmICghIXN1cnZleSkge1xuICAgICAgc3VydmV5Lm9uQ29udGFpbnNQYWdlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGVuZERyYWdJdGVtKCkge1xuICAgIHZhciBzdXJ2ZXkgPSBFZGl0YWJsZU9iamVjdC5nZXRTdXJ2ZXkodGhpcy5vYmplY3QpO1xuICAgIGlmICghIXN1cnZleSkge1xuICAgICAgc3VydmV5Lm9uQ29udGFpbnNQYWdlQ2FsbGJhY2sgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJFZGl0b3IoXCJzdXJ2ZXlwYWdlc1wiLCBmdW5jdGlvbiAoXG4gIHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5XG4pOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICByZXR1cm4gbmV3IFN1cnZleVByb3BlcnR5UGFnZXNFZGl0b3IocHJvcGVydHkpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yIH0gZnJvbSBcIi4vcHJvcGVydHlNb2RhbEVkaXRvclwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckZhY3RvcnlcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnRFZGl0b3JDb250ZW50TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25FZGl0b3JzL3F1ZXN0aW9uRWRpdG9yXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eVJlc3VsdGZ1bGxFZGl0b3IgZXh0ZW5kcyBTdXJ2ZXlQcm9wZXJ0eU1vZGFsRWRpdG9yIHtcbiAga29Db250ZW50RWRpdG9yOiBhbnk7XG4gIHB1YmxpYyBzdXJ2ZXk6IFN1cnZleS5TdXJ2ZXk7XG4gIHB1YmxpYyBxdWVzdGlvbjogU3VydmV5LlF1ZXN0aW9uRHJvcGRvd247XG5cbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gICAgdGhpcy5rb0NvbnRlbnRFZGl0b3IgPSBrby5vYnNlcnZhYmxlKG51bGwpO1xuICAgIHRoaXMuY3JlYXRlU3VydmV5KCk7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmVzdGZ1bGxcIjtcbiAgfVxuICBwdWJsaWMgYmVmb3JlU2hvd0NvcmUoKSB7XG4gICAgc3VwZXIuYmVmb3JlU2hvd0NvcmUoKTtcbiAgICB0aGlzLnNldFRlc3RRdWVzdGlvblByb3BlcnRpZXMoKTtcbiAgICB2YXIgY29udGVudEVkaXRvciA9IG5ldyBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsKFxuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlLFxuICAgICAgXCJcIixcbiAgICAgIHRoaXMub3B0aW9uc1xuICAgICk7XG4gICAgY29udGVudEVkaXRvci5vblByb3BlcnR5Q2hhbmdlZCA9IChwcm9wOiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSA9PiB7XG4gICAgICB0aGlzLmNoYW5nZUNob2ljZXNCeVVybFByb3AocHJvcC5uYW1lKTtcbiAgICAgIHRoaXMub3B0aW9ucy5vblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgICAgICB0aGlzLnByb3BlcnR5LFxuICAgICAgICB0aGlzLm9iamVjdCxcbiAgICAgICAgdGhpcy5vYmplY3RbcHJvcC5uYW1lXVxuICAgICAgKTtcbiAgICB9O1xuICAgIHRoaXMua29Db250ZW50RWRpdG9yKGNvbnRlbnRFZGl0b3IpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29udGVudEVkaXRvcigpOiBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5rb0NvbnRlbnRFZGl0b3IoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWVUZXh0KHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghdmFsdWUgfHwgIXZhbHVlLnVybCkgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZS5lbXB0eVwiKTtcbiAgICB2YXIgc3RyID0gdmFsdWUudXJsO1xuICAgIGlmIChzdHIubGVuZ3RoID4gMjApIHtcbiAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgMjApICsgXCIuLi5cIjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBwcml2YXRlIGNoYW5nZUNob2ljZXNCeVVybFByb3AocHJvcE5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbiB8fCAhdGhpcy5vcmlnaW5hbFZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5xdWVzdGlvbi5jaG9pY2VzQnlVcmxbcHJvcE5hbWVdID0gdGhpcy5vcmlnaW5hbFZhbHVlW3Byb3BOYW1lXTtcbiAgICB0aGlzLnF1ZXN0aW9uLmNob2ljZXNCeVVybC5ydW4oKTtcbiAgfVxuICBwcml2YXRlIHNldFRlc3RRdWVzdGlvblByb3BlcnRpZXMoKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uIHx8ICF0aGlzLm9yaWdpbmFsVmFsdWUpIHJldHVybjtcbiAgICB2YXIganNvbiA9IHRoaXMub3JpZ2luYWxWYWx1ZS50b0pTT04oKTtcbiAgICBuZXcgU3VydmV5Lkpzb25PYmplY3QoKS50b09iamVjdChqc29uLCB0aGlzLnF1ZXN0aW9uLmNob2ljZXNCeVVybCk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVTdXJ2ZXkoKSB7XG4gICAgdGhpcy5zdXJ2ZXkgPSAhIXRoaXMub3B0aW9uc1xuICAgICAgPyB0aGlzLm9wdGlvbnMuY3JlYXRlU3VydmV5KHt9LCBcInJlc3RmdWxFZGl0b3JcIilcbiAgICAgIDogbmV3IFN1cnZleS5TdXJ2ZXkoKTtcbiAgICB0aGlzLnN1cnZleS5zaG93TmF2aWdhdGlvbkJ1dHRvbnMgPSBmYWxzZTtcbiAgICB0aGlzLnN1cnZleS5zaG93UXVlc3Rpb25OdW1iZXJzID0gXCJvZmZcIjtcbiAgICB2YXIgcGFnZSA9IHRoaXMuc3VydmV5LmFkZE5ld1BhZ2UoXCJwYWdlMVwiKTtcbiAgICB0aGlzLnF1ZXN0aW9uID0gPFN1cnZleS5RdWVzdGlvbkRyb3Bkb3duPihcbiAgICAgIHBhZ2UuYWRkTmV3UXVlc3Rpb24oXCJkcm9wZG93blwiLCBcInExXCIpXG4gICAgKTtcbiAgICB0aGlzLnF1ZXN0aW9uLnRpdGxlID0gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBlLnRlc3RTZXJ2aWNlXCIpO1xuICAgIHRoaXMucXVlc3Rpb24uY2hvaWNlcyA9IFtdO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eVJlc3VsdGZ1bGxFZGl0b3JJdGVtIHtcbiAgcHVibGljIGtvVmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBpc1NldHR0aW5nVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICB2YWw6IHN0cmluZyxcbiAgICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQ6IChpdGVtOiBTdXJ2ZXlQcm9wZXJ0eVJlc3VsdGZ1bGxFZGl0b3JJdGVtKSA9PiBhbnlcbiAgKSB7XG4gICAgdGhpcy5rb1ZhbHVlID0ga28ub2JzZXJ2YWJsZSh2YWwgPyB2YWwgOiBcIlwiKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb1ZhbHVlLnN1YnNjcmliZShmdW5jdGlvbihuZXdWYWx1ZSkge1xuICAgICAgaWYgKCFzZWxmLmlzU2V0dHRpbmdWYWx1ZSkge1xuICAgICAgICBzZWxmLm9uVmFsdWVDaGFuZ2VkKHNlbGYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuaXNTZXR0dGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLmtvVmFsdWUodmFsKTtcbiAgICB0aGlzLmlzU2V0dHRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG59XG5cblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcInJlc3RmdWxsXCIsIGZ1bmN0aW9uKFxuICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuKTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgcmV0dXJuIG5ldyBTdXJ2ZXlQcm9wZXJ0eVJlc3VsdGZ1bGxFZGl0b3IocHJvcGVydHkpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQge1xuICBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UsXG4gIElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zXG59IGZyb20gXCIuL3Byb3BlcnR5RWRpdG9yQmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSBcIi4uL3N1cnZleUhlbHBlclwiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0IHsgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3IgfSBmcm9tIFwiLi9wcm9wZXJ0eU5lc3RlZFByb3BlcnR5RWRpdG9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVByb3BlcnR5VGV4dEl0ZW1zRWRpdG9yIGV4dGVuZHMgU3VydmV5TmVzdGVkUHJvcGVydHlFZGl0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHN1cGVyKHByb3BlcnR5KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ0ZXh0aXRlbXNcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm5lc3RlZC1pdGVtc1wiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFZGl0b3JOYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmtvRWRpdEl0ZW0oKSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHRoaXMua29FZGl0SXRlbSgpLnRleHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld0l0ZW0oKTogYW55IHtcbiAgICByZXR1cm4gbmV3IFN1cnZleS5NdWx0aXBsZVRleHRJdGVtKHRoaXMuZ2V0TmV3TmFtZSgpKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXRlbUNsYXNzTmFtZShpdGVtOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm11bHRpcGxldGV4dGl0ZW1cIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29sdW1uc1Byb3BlcnRpZXMoKTogQXJyYXk8U3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciBuYW1lcyA9IHRoaXMuZ2V0UHJvcGVydGllc05hbWVzKFwibXVsdGlwbGV0ZXh0QGl0ZW1zXCIsIFtdKTtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0aWVzQnlOYW1lcyhcIm11bHRpcGxldGV4dGl0ZW1cIiwgbmFtZXMpO1xuICB9XG4gIHByaXZhdGUgZ2V0TmV3TmFtZSgpOiBzdHJpbmcge1xuICAgIHZhciBvYmpzID0gW107XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5vcmlnaW5hbFZhbHVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XG4gICAgICBpZiAoISFpdGVtKSB7XG4gICAgICAgIG9ianMucHVzaCh7IG5hbWU6IGl0ZW0ubmFtZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFN1cnZleUhlbHBlci5nZXROZXdOYW1lKFxuICAgICAgb2JqcyxcbiAgICAgIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJlZC5uZXdUZXh0SXRlbU5hbWVcIilcbiAgICApO1xuICB9XG59XG5cblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcInRleHRpdGVtc1wiLCBmdW5jdGlvbihcbiAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHlcbik6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gIHJldHVybiBuZXcgU3VydmV5UHJvcGVydHlUZXh0SXRlbXNFZGl0b3IocHJvcGVydHkpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eU9uZVNlbGVjdGVkRWRpdG9yIH0gZnJvbSBcIi4vcHJvcGVydHlPbmVTZWxlY3RlZEVkaXRvclwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckZhY3RvcnlcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25Ub0Rpc3BsYXlUZXh0IH0gZnJvbSBcIi4uL2V4cHJlc3Npb25Ub0Rpc3BsYXlUZXh0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uRWRpdG9ycy9xdWVzdGlvbkVkaXRvclwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudFNlbGVjdG9yIH0gZnJvbSBcIi4vc3VydmV5RWxlbWVudFNlbGVjdG9yXCI7XG5pbXBvcnQgeyBFZGl0YWJsZU9iamVjdCB9IGZyb20gXCIuL2VkaXRhYmxlT2JqZWN0XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eVRyaWdnZXJzRWRpdG9yIGV4dGVuZHMgU3VydmV5UHJvcGVydHlPbmVTZWxlY3RlZEVkaXRvciB7XG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInRyaWdnZXJzXCI7XG4gIH1cbiAgcHVibGljIGdldEl0ZW1UZXh0KGl0ZW06IGFueSwgY291bnRlcjogYW55ID0gbnVsbCk6IGFueSB7XG4gICAgaWYgKCFpdGVtLmV4cHJlc3Npb24pXG4gICAgICByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBlLnRyaWdnZXJOb3RTZXRcIik7XG4gICAgdmFyIHN1cnZleSA9ICEhdGhpcy5nZXRTdXJ2ZXkgPyB0aGlzLmdldFN1cnZleSgpIDogbnVsbDtcbiAgICB2YXIgcmVzID0gaXRlbS5leHByZXNzaW9uO1xuICAgIGlmICghIXN1cnZleSkge1xuICAgICAgcmVzID0gbmV3IEV4cHJlc3Npb25Ub0Rpc3BsYXlUZXh0KHN1cnZleSwgdGhpcy5vcHRpb25zKS50b0Rpc3BsYXlUZXh0KFxuICAgICAgICBpdGVtLmV4cHJlc3Npb25cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGUudHJpZ2dlclJ1bklmXCIpICsgXCI6IFwiICsgcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRBdmFpbGFibGVDbGFzc2VzKCk6IEFycmF5PGFueT4ge1xuICAgIHZhciBjbGFzc2VzID0gU3VydmV5LlNlcmlhbGl6ZXIuZ2V0Q2hpbGRyZW5DbGFzc2VzKFwic3VydmV5dHJpZ2dlclwiLCB0cnVlKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGNsYXNzZXNbaV0ubmFtZTtcbiAgICAgIGlmIChuYW1lID09IFwidmlzaWJsZXRyaWdnZXJcIikgY29udGludWU7XG4gICAgICByZXMucHVzaCh7XG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0ZXh0OiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0VHJpZ2dlck5hbWUobmFtZSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgb25DcmVhdGVFZGl0b3IoZWRpdG9yOiBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsKSB7XG4gICAgdmFyIGV4cHJlc3Npb25FZGl0b3IgPSBlZGl0b3IuZ2V0UHJvcGVydHlFZGl0b3JCeU5hbWUoXCJleHByZXNzaW9uXCIpO1xuICAgIGlmICghIWV4cHJlc3Npb25FZGl0b3IgJiYgZXhwcmVzc2lvbkVkaXRvci5lZGl0b3IpIHtcbiAgICAgIGV4cHJlc3Npb25FZGl0b3IuZWRpdG9yW1wiaXNFZGl0b3JTaG93aW5nXCJdID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRTdXJ2ZXkoKTogU3VydmV5LlN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gISF0aGlzLm9iamVjdCA/IHRoaXMub2JqZWN0IDogdGhpcy5lZGl0aW5nT2JqZWN0O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eVNlbGVjdEl0ZW1zRWRpdG9yIGV4dGVuZHMgU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgcHJpdmF0ZSBpdGVtU2VsZWN0b3JWYWx1ZTogU3VydmV5RWxlbWVudFNlbGVjdG9yO1xuICBwdWJsaWMga29JdGVtU2VsZWN0b3I6IGFueTtcbiAgcHVibGljIGtvU2VsZWN0ZWRGb3JEZWxldGU6IGFueTtcbiAgcHVibGljIGtvRHVtbXk6IGFueTtcbiAgcHVibGljIGtvSXRlbXM6IGFueTtcbiAgY29uc3RydWN0b3IocHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBzdXBlcihwcm9wZXJ0eSk7XG4gICAgdGhpcy5rb0l0ZW1TZWxlY3RvciA9IGtvLm9ic2VydmFibGUobnVsbCk7XG4gICAgdGhpcy5rb1NlbGVjdGVkRm9yRGVsZXRlID0ga28ub2JzZXJ2YWJsZUFycmF5KCk7XG4gICAgdGhpcy5rb0R1bW15ID0ga28ub2JzZXJ2YWJsZSgwKTtcbiAgICB0aGlzLmtvSXRlbXMgPSBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICB0aGlzLmtvRHVtbXkoKTtcbiAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsVmFsdWU7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0b3JUeXBlVGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ0cmlnZ2Vyc2l0ZW1zXCI7XG4gIH1cbiAgcHVibGljIGRlbGV0ZUl0ZW1zKCkge1xuICAgIHZhciBpdGVtcyA9IHRoaXMua29TZWxlY3RlZEZvckRlbGV0ZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZGVsZXRlSXRlbShpdGVtc1tpXSk7XG4gICAgfVxuICAgIHRoaXMucmVzZXRJdGVtcygpO1xuICB9XG4gIHB1YmxpYyBhZGRJdGVtKCkge1xuICAgIGlmICh0aGlzLm9yaWdpbmFsVmFsdWUuaW5kZXhPZih0aGlzLml0ZW1TZWxlY3RvclZhbHVlLnZhbHVlKSA+IC0xKSByZXR1cm47XG4gICAgdGhpcy5vcmlnaW5hbFZhbHVlLnB1c2godGhpcy5pdGVtU2VsZWN0b3JWYWx1ZS52YWx1ZSk7XG4gICAgdGhpcy5pdGVtU2VsZWN0b3JWYWx1ZS52YWx1ZSA9IFwiXCI7XG4gICAgdGhpcy5yZXNldEl0ZW1zKCk7XG4gIH1cbiAgcHVibGljIGJlZm9yZVNob3coKSB7XG4gICAgc3VwZXIuYmVmb3JlU2hvdygpO1xuICAgIHZhciBzdXJ2ZXkgPSBFZGl0YWJsZU9iamVjdC5nZXRTdXJ2ZXkodGhpcy5vYmplY3QpO1xuICAgIHRoaXMuaXRlbVNlbGVjdG9yVmFsdWUgPSBuZXcgU3VydmV5RWxlbWVudFNlbGVjdG9yKFxuICAgICAgc3VydmV5LFxuICAgICAgdGhpcy5nZXRFbGVtZW50VHlwZSgpLFxuICAgICAgISF0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnNob3dUaXRsZXNJbkV4cHJlc3Npb25zXG4gICAgKTtcbiAgICB0aGlzLmtvSXRlbVNlbGVjdG9yKHRoaXMuaXRlbVNlbGVjdG9yVmFsdWUpO1xuICAgIHRoaXMucmVzZXRJdGVtcygpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFbGVtZW50VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInF1ZXN0aW9uXCI7XG4gIH1cbiAgcHJpdmF0ZSBkZWxldGVJdGVtKGl0ZW06IHN0cmluZykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLm9yaWdpbmFsVmFsdWUpKSByZXR1cm47XG4gICAgdmFyIGluZGV4ID0gdGhpcy5vcmlnaW5hbFZhbHVlLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHJlc2V0SXRlbXMoKSB7XG4gICAgdGhpcy5rb0R1bW15KHRoaXMua29EdW1teSgpICsgMSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVByb3BlcnR5U2VsZWN0UGFnZXNFZGl0b3IgZXh0ZW5kcyBTdXJ2ZXlQcm9wZXJ0eVNlbGVjdEl0ZW1zRWRpdG9yIHtcbiAgcHVibGljIGdldCBlZGl0b3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicGFnZXNcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RWxlbWVudFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJwYWdlXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVByb3BlcnR5U2VsZWN0UXVlc3Rpb25zRWRpdG9yIGV4dGVuZHMgU3VydmV5UHJvcGVydHlTZWxlY3RJdGVtc0VkaXRvciB7XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInF1ZXN0aW9uc1wiO1xuICB9XG59XG5cblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcInRyaWdnZXJzXCIsIGZ1bmN0aW9uIChcbiAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHlcbik6IFN1cnZleVByb3BlcnR5RWRpdG9yQmFzZSB7XG4gIHJldHVybiBuZXcgU3VydmV5UHJvcGVydHlUcmlnZ2Vyc0VkaXRvcihwcm9wZXJ0eSk7XG59KTtcblxuU3VydmV5UHJvcGVydHlFZGl0b3JGYWN0b3J5LnJlZ2lzdGVyRWRpdG9yKFwicGFnZXNcIiwgZnVuY3Rpb24gKFxuICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuKTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgcmV0dXJuIG5ldyBTdXJ2ZXlQcm9wZXJ0eVNlbGVjdFBhZ2VzRWRpdG9yKHByb3BlcnR5KTtcbn0pO1xuXG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJFZGl0b3IoXCJxdWVzdGlvbnNcIiwgZnVuY3Rpb24gKFxuICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuKTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgcmV0dXJuIG5ldyBTdXJ2ZXlQcm9wZXJ0eVNlbGVjdFF1ZXN0aW9uc0VkaXRvcihwcm9wZXJ0eSk7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleU5lc3RlZFByb3BlcnR5RWRpdG9yIH0gZnJvbSBcIi4vcHJvcGVydHlOZXN0ZWRQcm9wZXJ0eUVkaXRvclwiO1xuXG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckJhc2VcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeSB9IGZyb20gXCIuL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlVcmxDb25kaXRpb25FZGl0b3IgZXh0ZW5kcyBTdXJ2ZXlOZXN0ZWRQcm9wZXJ0eUVkaXRvciB7XG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInVybGNvbmRpdGlvbnNcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvclR5cGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm5lc3RlZC1pdGVtc1wiO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdJdGVtKCk6IGFueSB7XG4gICAgcmV0dXJuIFN1cnZleS5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKFwidXJsY29uZGl0aW9uaXRlbVwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29sdW1uc1Byb3BlcnRpZXMoKTogQXJyYXk8U3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnRpZXNCeU5hbWVzKFwidXJsY29uZGl0aW9uaXRlbVwiLCBbXCJleHByZXNzaW9uXCIsIFwidXJsXCJdKTtcbiAgfVxufVxuXG5TdXJ2ZXlQcm9wZXJ0eUVkaXRvckZhY3RvcnkucmVnaXN0ZXJFZGl0b3IoXCJ1cmxjb25kaXRpb25zXCIsIGZ1bmN0aW9uKFxuICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuKTogU3VydmV5UHJvcGVydHlFZGl0b3JCYXNlIHtcbiAgcmV0dXJuIG5ldyBTdXJ2ZXlQcm9wZXJ0eVVybENvbmRpdGlvbkVkaXRvcihwcm9wZXJ0eSk7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5T25lU2VsZWN0ZWRFZGl0b3IgfSBmcm9tIFwiLi9wcm9wZXJ0eU9uZVNlbGVjdGVkRWRpdG9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2UgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvckJhc2VcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IFN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeSB9IGZyb20gXCIuL3Byb3BlcnR5RWRpdG9yRmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvcGVydHlWYWxpZGF0b3JzRWRpdG9yIGV4dGVuZHMgU3VydmV5UHJvcGVydHlPbmVTZWxlY3RlZEVkaXRvciB7XG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgc3VwZXIocHJvcGVydHkpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInZhbGlkYXRvcnNcIjtcbiAgfVxuICBwdWJsaWMgZ2V0SXRlbVRleHQoaXRlbTogYW55LCBjb3VudGVyOiBhbnkgPSBudWxsKTogYW55IHtcbiAgICByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uLmdldFZhbGlkYXRvck5hbWUoaXRlbS5nZXRUeXBlKCkpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRBdmFpbGFibGVDbGFzc2VzKCk6IEFycmF5PGFueT4ge1xuICAgIHZhciBuYW1lcyA9IHRoaXMuZ2V0VmFsaWRhdG9yVHlwZXMoKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goe1xuICAgICAgICB2YWx1ZTogbmFtZXNbaV0sXG4gICAgICAgIHRleHQ6IGVkaXRvckxvY2FsaXphdGlvbi5nZXRWYWxpZGF0b3JOYW1lKG5hbWVzW2ldKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWxpZGF0b3JUeXBlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgaWYgKCEhdGhpcy5vYmplY3QgJiYgISF0aGlzLm9iamVjdC5nZXRTdXBwb3J0ZWRWYWxpZGF0b3JzKSB7XG4gICAgICByZXMgPSB0aGlzLm9iamVjdC5nZXRTdXBwb3J0ZWRWYWxpZGF0b3JzKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSByZXNbaV0gKyBcInZhbGlkYXRvclwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgdmFyIGNsYXNzZXMgPSBTdXJ2ZXkuU2VyaWFsaXplci5nZXRDaGlsZHJlbkNsYXNzZXMoXCJzdXJ2ZXl2YWxpZGF0b3JcIiwgdHJ1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChjbGFzc2VzW2ldLm5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cblN1cnZleVByb3BlcnR5RWRpdG9yRmFjdG9yeS5yZWdpc3RlckVkaXRvcihcInZhbGlkYXRvcnNcIiwgZnVuY3Rpb24oXG4gIHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5XG4pOiBTdXJ2ZXlQcm9wZXJ0eUVkaXRvckJhc2Uge1xuICByZXR1cm4gbmV3IFN1cnZleVByb3BlcnR5VmFsaWRhdG9yc0VkaXRvcihwcm9wZXJ0eSk7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IEVkaXRhYmxlT2JqZWN0IH0gZnJvbSBcIi4vZWRpdGFibGVPYmplY3RcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTdXJ2ZXlFbGVtZW50U2VsZWN0b3JJdGVtIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGVsZW1lbnQ6IFN1cnZleS5CYXNlO1xuICBrb0Rpc2FibGVkOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFbGVtZW50U2VsZWN0b3Ige1xuICBwcml2YXRlIHNob3dUaXRsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBvcHRpb25zQ2FwdGlvblZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgZGlzYWJsZUNhbGxiYWNrOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgc2VsZWN0ZWRWYWx1ZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgcHVibGljIGtvRWxlbWVudHM6IGFueTtcbiAgcHVibGljIGtvVmFsdWU6IGFueTtcbiAgcHVibGljIGtvSGFzRm9jdXM6IGFueTtcbiAgcHVibGljIGtvRXJyb3JUZXh0OiBhbnk7XG4gIHB1YmxpYyBrb0Rpc3BsYXlFcnJvcjogYW55O1xuICBwdWJsaWMgb25WYWx1ZUNoYW5nZWRDYWxsYmFjazogKHZhbDogc3RyaW5nKSA9PiB2b2lkO1xuICBwdWJsaWMgZGlzYWJsZWRQcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAga29BZnRlclJlbmRlcjogYW55O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3VydmV5OiBTdXJ2ZXkuU3VydmV5TW9kZWwsXG4gICAgZWxlbWVudFR5cGU6IHN0cmluZyA9IFwicXVlc3Rpb25cIixcbiAgICBzaG93VGl0bGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBvcHRpb25zQ2FwdGlvbk5hbWU6IHN0cmluZyA9IFwiXCJcbiAgKSB7XG4gICAgdGhpcy5zdXJ2ZXkgPSBFZGl0YWJsZU9iamVjdC5nZXRPcmlnaW5hbFN1cnZleSh0aGlzLnN1cnZleSk7XG4gICAgdGhpcy5zaG93VGl0bGUgPSBzaG93VGl0bGU7XG4gICAgdGhpcy5vcHRpb25zQ2FwdGlvblZhbHVlID0gdGhpcy5nZXRPcHRpb25zVGV4dChcbiAgICAgIG9wdGlvbnNDYXB0aW9uTmFtZSxcbiAgICAgIGVsZW1lbnRUeXBlXG4gICAgKTtcbiAgICB0aGlzLmtvVmFsdWUgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvVmFsdWUuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgaWYgKHNlbGYuZGlzYWJsZUNhbGxiYWNrIHx8ICFzZWxmLm9uVmFsdWVDaGFuZ2VkQ2FsbGJhY2spIHJldHVybjtcbiAgICAgIHNlbGYub25WYWx1ZUNoYW5nZWRDYWxsYmFjayhuZXdWYWx1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5rb0VsZW1lbnRzID0ga28ub2JzZXJ2YWJsZUFycmF5KHRoaXMuYnVpbGRFbGVtZW50cyhlbGVtZW50VHlwZSkpO1xuICAgIHRoaXMua29IYXNGb2N1cyA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICAgIHRoaXMua29IYXNGb2N1cy5zdWJzY3JpYmUoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgICAgc2VsZi51cGRhdGVJdGVtcygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMua29FcnJvclRleHQgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHRoaXMua29EaXNwbGF5RXJyb3IgPSBrby5jb21wdXRlZChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gISFzZWxmLmtvRXJyb3JUZXh0KCk7XG4gICAgfSk7XG4gICAgdGhpcy5rb0FmdGVyUmVuZGVyID0gZnVuY3Rpb24gKCkge307XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtvVmFsdWUoKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5kaXNhYmxlQ2FsbGJhY2sgPSB0cnVlO1xuICAgIHRoaXMua29WYWx1ZSh2YWwpO1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMucHVzaCh2YWwpO1xuICAgIHRoaXMuZGlzYWJsZUNhbGxiYWNrID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBlbGVtZW50KCk6IFN1cnZleS5CYXNlIHtcbiAgICB2YXIgZWwgPSB0aGlzLmZpbmRJdGVtQnlOYW1lKHRoaXMudmFsdWUpO1xuICAgIHJldHVybiAhIWVsID8gZWwuZWxlbWVudCA6IG51bGw7XG4gIH1cbiAgcHVibGljIHNldCBlbGVtZW50KHZhbDogU3VydmV5LkJhc2UpIHtcbiAgICB2YXIgZWwgPSB0aGlzLmZpbmRJdGVtQnlFbGVtZW50KHZhbCk7XG4gICAgaWYgKCEhZWwpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBlbC5uYW1lO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGZpbmRJdGVtQnlOYW1lKG5hbWU6IHN0cmluZyk6IFN1cnZleUVsZW1lbnRTZWxlY3Rvckl0ZW0ge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5rb0VsZW1lbnRzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGl0ZW1zW2ldLm5hbWUgPT0gbmFtZSkgcmV0dXJuIGl0ZW1zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcml2YXRlIGZpbmRJdGVtQnlFbGVtZW50KGVsOiBTdXJ2ZXkuQmFzZSk6IFN1cnZleUVsZW1lbnRTZWxlY3Rvckl0ZW0ge1xuICAgIGlmICghZWwpIHJldHVybiBudWxsO1xuICAgIHZhciBpdGVtcyA9IHRoaXMua29FbGVtZW50cygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpdGVtc1tpXS5lbGVtZW50ID09PSBlbCkgcmV0dXJuIGl0ZW1zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0IG9wdGlvbnNDYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNDYXB0aW9uVmFsdWU7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUl0ZW1zKCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZFByb3BlcnR5TmFtZSkgcmV0dXJuO1xuICAgIHZhciBpdGVtcyA9IHRoaXMua29FbGVtZW50cygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XG4gICAgICB2YXIgZGlzYWJsZWQgPVxuICAgICAgICAhIWl0ZW0uZWxlbWVudFt0aGlzLmRpc2FibGVkUHJvcGVydHlOYW1lXSAmJlxuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YoaXRlbS5uYW1lKSA8IDA7XG4gICAgICBpdGVtLmtvRGlzYWJsZWQoZGlzYWJsZWQpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaGFzRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgdmFyIHRleHQgPSAhdGhpcy5lbGVtZW50ID8gdGhpcy5nZXRMb2NTdHJpbmcoXCJwZS5pdGVtU2VsZWN0b3JFbXB0eVwiKSA6IFwiXCI7XG4gICAgdGhpcy5rb0Vycm9yVGV4dCh0ZXh0KTtcbiAgICByZXR1cm4gISF0ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXRMb2NTdHJpbmcobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcobmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEVsZW1lbnRzKGVsZW1lbnRUeXBlOiBzdHJpbmcpOiBBcnJheTxTdXJ2ZXlFbGVtZW50U2VsZWN0b3JJdGVtPiB7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgaWYgKGVsZW1lbnRUeXBlID09IFwicXVlc3Rpb25cIikge1xuICAgICAgZWxlbWVudHMgPSB0aGlzLnN1cnZleS5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRUeXBlID09IFwicGFnZVwiKSB7XG4gICAgICBlbGVtZW50cyA9IHRoaXMuc3VydmV5LnBhZ2VzO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudFR5cGUgPT0gXCJwYW5lbFwiKSB7XG4gICAgICBlbGVtZW50cyA9IHRoaXMuc3VydmV5LmdldEFsbFBhbmVscygpO1xuICAgIH1cbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICB2YXIgdGV4dCA9IFwiXCI7XG4gICAgICBpZiAodGhpcy5zaG93VGl0bGUpIHtcbiAgICAgICAgdGV4dCA9IGVsLmxvY1RpdGxlLnJlbmRlcmVkSHRtbDtcbiAgICAgIH1cbiAgICAgIGlmICghdGV4dCkgdGV4dCA9IGVsLm5hbWU7XG4gICAgICByZXMucHVzaCh7XG4gICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgIGVsZW1lbnQ6IGVsLFxuICAgICAgICBrb0Rpc2FibGVkOiBrby5vYnNlcnZhYmxlKGZhbHNlKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEudGV4dC5sb2NhbGVDb21wYXJlKGIudGV4dCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGdldE9wdGlvbnNUZXh0KFxuICAgIG9wdGlvbnNDYXB0aW9uTmFtZTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoIW9wdGlvbnNDYXB0aW9uTmFtZSkge1xuICAgICAgb3B0aW9uc0NhcHRpb25OYW1lID1cbiAgICAgICAgZWxlbWVudFR5cGUgPT0gXCJwYWdlXCJcbiAgICAgICAgICA/IFwicGUuY29uZGl0aW9uU2VsZWN0UGFnZVwiXG4gICAgICAgICAgOiBlbGVtZW50VHlwZSA9PSBcInBhbmVsXCJcbiAgICAgICAgICA/IFwicGUuY29uZGl0aW9uU2VsZWN0UGFuZWxcIlxuICAgICAgICAgIDogXCJwZS5jb25kaXRpb25TZWxlY3RRdWVzdGlvblwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcob3B0aW9uc0NhcHRpb25OYW1lKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7XG4gIFN1cnZleVF1ZXN0aW9uRWRpdG9yRGVmaW5pdGlvbixcbiAgSVN1cnZleVF1ZXN0aW9uRWRpdG9yRGVmaW5pdGlvbixcbn0gZnJvbSBcIi4vcXVlc3Rpb25FZGl0b3JEZWZpbml0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlDcmVhdG9yUHJvcGVydGllcyB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlVmFsdWUgPSBuZXcgU3VydmV5Q3JlYXRvclByb3BlcnRpZXMoKTtcbiAgcHVibGljIHN0YXRpYyBnZXQgaW5zdGFuY2UoKSB7XG4gICAgcmV0dXJuIFN1cnZleUNyZWF0b3JQcm9wZXJ0aWVzLmluc3RhbmNlVmFsdWU7XG4gIH1cbiAgcHVibGljIGhpZGVDYXRlZ29yeShjYXRlZ29yeU5hbWU6IHN0cmluZykge1xuICAgIHZhciBkZWYgPSBTdXJ2ZXlRdWVzdGlvbkVkaXRvckRlZmluaXRpb24uZGVmaW5pdGlvbjtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGVmKSB7XG4gICAgICB2YXIgdGFiID0gdGhpcy5nZXRUYWJGcm9tRWxlbWVudERlZihkZWZba2V5XSwgY2F0ZWdvcnlOYW1lKTtcbiAgICAgIGlmICghIXRhYikge1xuICAgICAgICB0YWIudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgaGlkZVByb3BlcnR5KHByb3BlcnR5TmFtZTogc3RyaW5nLCBvYmpUeXBlOiBzdHJpbmcgPSB1bmRlZmluZWQpIHtcbiAgICAvL1N1cnZleS5TZXJpYWxpemVyLmZpblxuICB9XG4gIHB1YmxpYyBzaG93UHJvcGVydHkoXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgb2JqVHlwZTogc3RyaW5nID0gdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IGFueSA9IHVuZGVmaW5lZFxuICApIHt9XG4gIHB1YmxpYyBtb3ZlUHJvcGVydHkocHJvcGVydHlOYW1lOiBzdHJpbmcsIG9ialR5cGU6IHN0cmluZywgb3B0aW9uczogYW55KSB7fVxuICBwcml2YXRlIGNoYW5nZVByb3BlcnR5KHByb3BlcnR5TmFtZTogc3RyaW5nLCBvYmpUeXBlOiBzdHJpbmcsIG9wdGlvbnM6IGFueSkge31cbiAgcHJpdmF0ZSBnZXRUYWJGcm9tRWxlbWVudERlZihlbERlZjogYW55LCB0YWJOYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghZWxEZWYudGFicykgcmV0dXJuIG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbERlZi50YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZWxEZWYudGFic1tpXS5uYW1lID09IHRhYk5hbWUpIHJldHVybiBlbERlZi50YWJzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuZXhwb3J0IHZhciBjcmVhdG9yUHJvcGVydGllcyA9IFN1cnZleUNyZWF0b3JQcm9wZXJ0aWVzLmluc3RhbmNlO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9ucyB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQge1xuICBTdXJ2ZXlRdWVzdGlvbkVkaXRvckRlZmluaXRpb24sXG4gIElTdXJ2ZXlRdWVzdGlvbkVkaXRvckRlZmluaXRpb24sXG59IGZyb20gXCIuL3F1ZXN0aW9uRWRpdG9yRGVmaW5pdGlvblwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCBSTW9kYWwgZnJvbSBcInJtb2RhbFwiO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSBcIi4uL3N1cnZleUhlbHBlclwiO1xuaW1wb3J0IHtcbiAgZm9jdXNGaXJzdENvbnRyb2wsXG4gIGdldE5vZGVzRnJvbUtvQ29tcG9uZW50SW5mbyxcbiAgZ2V0Rmlyc3ROb25UZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBFZGl0YWJsZU9iamVjdCB9IGZyb20gXCIuLi9wcm9wZXJ0eUVkaXRvcnMvZWRpdGFibGVPYmplY3RcIjtcbmltcG9ydCB7IFN1cnZleU9iamVjdFByb3BlcnR5IH0gZnJvbSBcIi4uL29iamVjdFByb3BlcnR5XCI7XG5pbXBvcnQgeyBJU3VydmV5Q3JlYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3NcIjtcblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5R3JpZE9iamVjdEVkaXRvck1vZGVsIHtcbiAgcHJpdmF0ZSBzZWxlY3RlZE9iamVjdFZhbHVlOiBhbnkgPSBudWxsO1xuICBwdWJsaWMga29FbGVtZW50RWRpdG9yID0ga28ub2JzZXJ2YWJsZTxTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsPihudWxsKTtcbiAgcHVibGljIGtvSGFzT2JqZWN0ID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyQ2FsbGJhY2s6IChcbiAgICBvYmplY3Q6IGFueSxcbiAgICBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgcHJvcGVydHk6IFN1cnZleU9iamVjdFByb3BlcnR5XG4gICkgPT4gYW55O1xuICBwdWJsaWMgb25Tb3J0UHJvcGVydHlDYWxsYmFjazogKFxuICAgIG9iamVjdDogYW55LFxuICAgIHByb3BlcnR5MTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBwcm9wZXJ0eTI6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHlcbiAgKSA9PiBudW1iZXI7XG4gIHB1YmxpYyBvblByb3BlcnR5Q2hhbmdlZDogKFxuICAgIG9iajogYW55LFxuICAgIHByb3A6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgb2xkVmFsdWU6IGFueVxuICApID0+IHZvaWQ7XG4gIHB1YmxpYyBvbkNvcnJlY3RWYWx1ZUJlZm9yZVNldDogKFxuICAgIG9iajogYW55LFxuICAgIHByb3A6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgbmV3VmFsdWU6IGFueVxuICApID0+IGFueTtcblxuICAvLyBPbGQgLSB0YWJsZShvbGQgcHJvcGVydHkgZ3JpZCkgY3JlYXRvci5vcHRpb25zLnNob3dFbGVtZW50RWRpdG9yQXNQcm9wZXJ0eUdyaWQ6IGZhbHNlO1xuICAvLyBOZXcgLSBhY2NvcmRpdGlvbiBvciBvbGRlc3QgdGFic1xuICBwdWJsaWMga29Jc09sZFRhYmxlQXBwZWFyYW5jZSA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBwcm9wZXJ0eUVkaXRvck9wdGlvbnM6IElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zID0gbnVsbFxuICApIHt9XG5cbiAgcHVibGljIG9iamVjdENoYW5nZWQoKSB7fVxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkT2JqZWN0KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPYmplY3RWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHNlbGVjdGVkT2JqZWN0KHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9iamVjdFZhbHVlID09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5zZWxlY3RlZE9iamVjdFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5rb0hhc09iamVjdChmYWxzZSk7XG4gICAgaWYgKCEhdmFsdWUpIHtcbiAgICAgIHZhciBlbGVtZW50RWRpdG9yID0gdGhpcy5jcmVhdGVTdXJ2ZXlFbGVtZW50RWRpdG9yKHZhbHVlKTtcbiAgICAgIGVsZW1lbnRFZGl0b3Iub25BZnRlclJlbmRlckNhbGxiYWNrID0gdGhpcy5vbkFmdGVyUmVuZGVyQ2FsbGJhY2s7XG4gICAgICBlbGVtZW50RWRpdG9yLm9uUHJvcGVydHlDaGFuZ2VkID0gKFxuICAgICAgICBwcm9wOiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5LFxuICAgICAgICBvbGRWYWx1ZTogYW55XG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQpXG4gICAgICAgICAgdGhpcy5vblByb3BlcnR5Q2hhbmdlZCh0aGlzLnNlbGVjdGVkT2JqZWN0VmFsdWUsIHByb3AsIG9sZFZhbHVlKTtcbiAgICAgIH07XG4gICAgICBlbGVtZW50RWRpdG9yLm9uQ29ycmVjdFZhbHVlQmVmb3JlU2V0ID0gKFxuICAgICAgICBwcm9wOiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5LFxuICAgICAgICBuZXdWYWx1ZTogYW55XG4gICAgICApOiBhbnkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMub25Db3JyZWN0VmFsdWVCZWZvcmVTZXQpIHJldHVybiBuZXdWYWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMub25Db3JyZWN0VmFsdWVCZWZvcmVTZXQoXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdFZhbHVlLFxuICAgICAgICAgIHByb3AsXG4gICAgICAgICAgbmV3VmFsdWVcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmtvRWxlbWVudEVkaXRvcihlbGVtZW50RWRpdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rb0VsZW1lbnRFZGl0b3IobnVsbCk7XG4gICAgfVxuICAgIHRoaXMua29IYXNPYmplY3QoISF2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldFByb3BlcnR5RWRpdG9yQnlOYW1lKHByb3BlcnR5TmFtZTogc3RyaW5nKTogU3VydmV5T2JqZWN0UHJvcGVydHkge1xuICAgIGlmICghdGhpcy5rb0VsZW1lbnRFZGl0b3IoKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMua29FbGVtZW50RWRpdG9yKCkuZ2V0UHJvcGVydHlFZGl0b3JCeU5hbWUocHJvcGVydHlOYW1lKTtcbiAgfVxuICBwdWJsaWMgZm9jdXNFZGl0b3IoKSB7XG4gICAgaWYgKCEhdGhpcy5rb0VsZW1lbnRFZGl0b3IoKSkge1xuICAgICAgdGhpcy5rb0VsZW1lbnRFZGl0b3IoKS5mb2N1c0VkaXRvcigpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaGFzRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5rb0VsZW1lbnRFZGl0b3IoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmtvRWxlbWVudEVkaXRvcigpLmhhc0Vycm9yKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleUVsZW1lbnRFZGl0b3IoXG4gICAgdmFsdWU6IGFueVxuICApOiBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsIHtcbiAgICBsZXQgZWxlbWVudEVkaXRvcjtcbiAgICBpZiAodGhpcy5rb0lzT2xkVGFibGVBcHBlYXJhbmNlKCkpIHtcbiAgICAgIGVsZW1lbnRFZGl0b3IgPSBuZXcgU3VydmV5RWxlbWVudEVkaXRvck9sZFRhYmxlQ29udGVudE1vZGVsKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgXCJcIixcbiAgICAgICAgdGhpcy5wcm9wZXJ0eUVkaXRvck9wdGlvbnMsXG4gICAgICAgIHRoaXMub25Tb3J0UHJvcGVydHlDYWxsYmFja1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudEVkaXRvciA9IG5ldyBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgXCJcIixcbiAgICAgICAgdGhpcy5wcm9wZXJ0eUVkaXRvck9wdGlvbnMsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50RWRpdG9yO1xuICB9XG59XG5leHBvcnQgY2xhc3MgU3VydmV5RWxlbWVudEVkaXRvckNvbnRlbnRNb2RlbCB7XG4gIHB1YmxpYyBvbkNvcnJlY3RWYWx1ZUJlZm9yZVNldDogKFxuICAgIHByb3A6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgbmV3VmFsdWU6IGFueVxuICApID0+IGFueTtcbiAgcHVibGljIG9uUHJvcGVydHlDaGFuZ2VkOiAoXG4gICAgcHJvcDogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBvbGRWYWx1ZTogYW55XG4gICkgPT4gdm9pZDtcbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXJDYWxsYmFjazogKFxuICAgIG9iamVjdDogYW55LFxuICAgIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBwcm9wZXJ0eTogU3VydmV5T2JqZWN0UHJvcGVydHlcbiAgKSA9PiBhbnk7XG4gIGtvVGFiczogYW55O1xuICBrb0FjdGl2ZVRhYiA9IGtvLm9ic2VydmFibGU8c3RyaW5nPigpO1xuICBwcm90ZWN0ZWQgcHJvcGVydGllczogU3VydmV5UXVlc3Rpb25Qcm9wZXJ0aWVzO1xuICBwcml2YXRlIG9yaWdpbmFsT2JqVmFsdWU6IGFueTtcbiAgY29uc3RydWN0b3IoXG4gICAgb2JqOiBhbnksXG4gICAgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nID0gbnVsbCxcbiAgICBwdWJsaWMgb3B0aW9uczogSVN1cnZleU9iamVjdEVkaXRvck9wdGlvbnMgPSBudWxsLFxuICAgIHByb3RlY3RlZCB1c2VBc1Byb3BlcnR5R3JpZDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuc2V0T3JpZ2luYWxPYmpWYWx1ZShvYmopO1xuICAgIGlmICghdGhpcy5jbGFzc05hbWUgJiYgdGhpcy5vcmlnaW5hbE9iai5nZXRUeXBlKSB7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9IHRoaXMub3JpZ2luYWxPYmouZ2V0VHlwZSgpO1xuICAgIH1cbiAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgU3VydmV5UXVlc3Rpb25Qcm9wZXJ0aWVzKFxuICAgICAgdGhpcy5lZGl0YWJsZU9iaixcbiAgICAgIHRoaXMub3B0aW9ucyxcbiAgICAgIHRoaXMuY2xhc3NOYW1lXG4gICAgKTtcbiAgICB2YXIgdGFicyA9IHRoaXMuYnVpbGRUYWJzKCk7XG4gICAgdGhpcy5rb1RhYnMgPSBrby5vYnNlcnZhYmxlQXJyYXk8U3VydmV5RWxlbWVudEVkaXRvclRhYk1vZGVsPih0YWJzKTtcbiAgICB0aGlzLmFzc2lnblByb3BlcnRpZXNUb0VkaXRvcnMoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0FjdGl2ZVRhYi5zdWJzY3JpYmUoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgaWYgKCF2YWwpIHJldHVybjtcbiAgICAgIHZhciB0YWIgPSBzZWxmLmdldFRhYkJ5TmFtZSh2YWwpO1xuICAgICAgaWYgKCEhdGFiKSB7XG4gICAgICAgIHRhYi5leHBhbmQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGFicy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmtvQWN0aXZlVGFiKHRhYnNbMF0ubmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRMb2NTdHJpbmcobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcobmFtZSk7XG4gIH1cbiAgcHVibGljIHNldFBhcmVudExpc3QocGFyZW50TGlzdDogQXJyYXk8U3VydmV5LkJhc2U+KSB7XG4gICAgdmFyIGVkUHJvcGVydGllcyA9IHRoaXMuZ2V0QWxsRWRpdG9yUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlZFByb3BlcnRpZXNbaV0uZWRpdG9yLnBhcmVudExpc3QgPSBwYXJlbnRMaXN0O1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc2V0T3JpZ2luYWxPYmpWYWx1ZShvYmo6IGFueSkge1xuICAgIHRoaXMub3JpZ2luYWxPYmpWYWx1ZSA9IG9iajtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IG9yaWdpbmFsT2JqKCkge1xuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsT2JqVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBvYmooKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbE9ialZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdGFibGVPYmooKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbE9ialZhbHVlO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcigpOiBib29sZWFuIHtcbiAgICB2YXIgdGFicyA9IHRoaXMua29UYWJzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGFic1tpXS5oYXNFcnJvcigpKSB7XG4gICAgICAgIHRoaXMua29BY3RpdmVUYWIodGFic1tpXS5uYW1lKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydHlFZGl0b3JCeU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBTdXJ2ZXlPYmplY3RQcm9wZXJ0eSB7XG4gICAgdmFyIHByb3BzID0gdGhpcy5nZXRBbGxFZGl0b3JQcm9wZXJ0aWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHByb3BzW2ldLnByb3BlcnR5Lm5hbWUgPT0gcHJvcGVydHlOYW1lKSByZXR1cm4gcHJvcHNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRUYWJCeU5hbWUodGFiTmFtZTogc3RyaW5nKTogU3VydmV5RWxlbWVudEVkaXRvclRhYk1vZGVsIHtcbiAgICB2YXIgdGFicyA9IHRoaXMua29UYWJzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGFic1tpXS5uYW1lID09IHRhYk5hbWUpIHJldHVybiB0YWJzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZm9jdXNFZGl0b3IoKSB7XG4gICAgaWYgKCEhdGhpcy5rb1RhYnMoKSAmJiB0aGlzLmtvVGFicygpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMua29UYWJzKClbMF0uZm9jdXNFZGl0b3IoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRBbGxFZGl0b3JQcm9wZXJ0aWVzKCk6IEFycmF5PFN1cnZleU9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGlmICghdGhpcy5rb1RhYnMpIHJldHVybiByZXM7XG4gICAgdmFyIHRhYnMgPSB0aGlzLmtvVGFicygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRhYiA9IDxTdXJ2ZXlFbGVtZW50RWRpdG9yVGFiTW9kZWw+dGFic1tpXTtcbiAgICAgIHZhciBwcm9wcyA9IHRhYi5lZGl0b3JQcm9wZXJ0aWVzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwcm9wcy5sZW5ndGg7IGorKykge1xuICAgICAgICByZXMucHVzaChwcm9wc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFRhYnMoKTogQXJyYXk8U3VydmV5RWxlbWVudEVkaXRvclRhYk1vZGVsPiB7XG4gICAgdmFyIHRhYnMgPSBbXTtcbiAgICB0aGlzLmFkZFByb3BlcnRpZXNUYWJzKHRhYnMpO1xuICAgIHJldHVybiB0YWJzO1xuICB9XG4gIHByaXZhdGUgYXNzaWduUHJvcGVydGllc1RvRWRpdG9ycygpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLmdldEFsbEVkaXRvclByb3BlcnRpZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFzc2lnblByb3BlcnRpZXNUb0VkaXRvcihwcm9wc1tpXSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBhc3NpZ25Qcm9wZXJ0aWVzVG9FZGl0b3IocHJvcEVkaXRvcjogU3VydmV5T2JqZWN0UHJvcGVydHkpIHtcbiAgICBwcm9wRWRpdG9yLm9uQ29ycmVjdFZhbHVlQmVmb3JlU2V0ID0gKFxuICAgICAgcHJvcEVkaXRvcjogU3VydmV5T2JqZWN0UHJvcGVydHksXG4gICAgICBuZXdWYWx1ZTogYW55XG4gICAgKTogYW55ID0+IHtcbiAgICAgIGlmICghdGhpcy5vbkNvcnJlY3RWYWx1ZUJlZm9yZVNldCkgcmV0dXJuIG5ld1ZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXMub25Db3JyZWN0VmFsdWVCZWZvcmVTZXQocHJvcEVkaXRvci5wcm9wZXJ0eSwgbmV3VmFsdWUpO1xuICAgIH07XG4gICAgcHJvcEVkaXRvci5vbkNoYW5nZWQgPSAoXG4gICAgICBwcm9wRWRpdG9yOiBTdXJ2ZXlPYmplY3RQcm9wZXJ0eSxcbiAgICAgIG9sZFZhbHVlOiBhbnlcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGlmICghIXRoaXMub25Qcm9wZXJ0eUNoYW5nZWQpXG4gICAgICAgIHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQocHJvcEVkaXRvci5wcm9wZXJ0eSwgb2xkVmFsdWUpO1xuICAgIH07XG4gICAgcHJvcEVkaXRvci5nZXRPYmplY3RQcm9wZXJ0eUJ5TmFtZSA9IChcbiAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nXG4gICAgKTogU3VydmV5T2JqZWN0UHJvcGVydHkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlFZGl0b3JCeU5hbWUocHJvcGVydHlOYW1lKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBhZGRQcm9wZXJ0aWVzVGFicyh0YWJzOiBBcnJheTxTdXJ2ZXlFbGVtZW50RWRpdG9yVGFiTW9kZWw+KSB7XG4gICAgdmFyIHRhYkl0ZW1zID0gdGhpcy5wcm9wZXJ0aWVzLmdldFRhYnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYkl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdGFiSXRlbSA9IHRhYkl0ZW1zW2ldO1xuICAgICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXMuZ2V0UHJvcGVydGllcyh0YWJJdGVtKTtcbiAgICAgIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGFicy5wdXNoKHRoaXMuY3JlYXRlTmV3VGFiKHRhYkl0ZW0sIHByb3BlcnRpZXMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1RhYihcbiAgICB0YWJJdGVtOiBTdXJ2ZXlRdWVzdGlvbkVkaXRvclRhYkRlZmluaXRpb24sXG4gICAgcHJvcGVydGllczogQXJyYXk8U3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eT5cbiAgKTogU3VydmV5RWxlbWVudEVkaXRvclRhYk1vZGVsIHtcbiAgICB2YXIgcHJvcGVydHlUYWIgPSBuZXcgU3VydmV5RWxlbWVudEVkaXRvclRhYk1vZGVsKFxuICAgICAgdGhpcy5lZGl0YWJsZU9iaixcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICB0YWJJdGVtLm5hbWUsXG4gICAgICB0aGlzLm9wdGlvbnNcbiAgICApO1xuICAgIHByb3BlcnR5VGFiLnRpdGxlID0gdGFiSXRlbS50aXRsZTtcbiAgICB2YXIgZmlyc3RQcm9wZXJ0eSA9XG4gICAgICB0YWJJdGVtLnByb3BlcnRpZXMubGVuZ3RoID4gMCA/IHRhYkl0ZW0ucHJvcGVydGllc1swXSA6IG51bGw7XG4gICAgaWYgKCEhZmlyc3RQcm9wZXJ0eSAmJiBmaXJzdFByb3BlcnR5LmNyZWF0ZWRGcm9tVGFiTmFtZSkge1xuICAgICAgdmFyIGZpcnN0RWRpdG9yID0gcHJvcGVydHlUYWIuZ2V0UHJvcGVydHlFZGl0b3JCeU5hbWUodGFiSXRlbS5uYW1lKTtcbiAgICAgIGlmICghIWZpcnN0RWRpdG9yKSB7XG4gICAgICAgIGZpcnN0RWRpdG9yLmVkaXRvci5zaG93RGlzcGxheU5hbWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvcGVydHlUYWIub25BZnRlclJlbmRlckNhbGxiYWNrID0gKGh0bWxFbGVtZW50LCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm9uQWZ0ZXJSZW5kZXJDYWxsYmFjaykgcmV0dXJuO1xuICAgICAgdGhpcy5vbkFmdGVyUmVuZGVyQ2FsbGJhY2sodGhpcy5vcmlnaW5hbE9iaiwgaHRtbEVsZW1lbnQsIHByb3BlcnR5KTtcbiAgICB9O1xuICAgIHJldHVybiBwcm9wZXJ0eVRhYjtcbiAgfVxuICAvL3RoaXMub3B0aW9ucyA9IGNyZWF0b3JcbiAgZ2V0IHVzZVRhYnNJbkVsZW1lbnRFZGl0b3IoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLnVzZUFzUHJvcGVydHlHcmlkICYmXG4gICAgICAhIXRoaXMub3B0aW9ucyAmJlxuICAgICAgdGhpcy5vcHRpb25zLnVzZVRhYnNJbkVsZW1lbnRFZGl0b3IgJiZcbiAgICAgIHRoaXMua29UYWJzKCkubGVuZ3RoID4gMVxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFbGVtZW50RWRpdG9yT2xkVGFibGVDb250ZW50TW9kZWwgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsIHtcbiAgcHVibGljIGtvUHJvcGVydGllcyA9IGtvLm9ic2VydmFibGVBcnJheTxTdXJ2ZXlPYmplY3RQcm9wZXJ0eT4oKTtcbiAgcHVibGljIGtvVGFiOiBhbnk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG9iajogYW55LFxuICAgIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgcHVibGljIG9wdGlvbnM6IElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zID0gbnVsbCxcbiAgICBwcml2YXRlIG9uU29ydFByb3BlcnR5Q2FsbGJhY2s6IChcbiAgICAgIG9iamVjdDogYW55LFxuICAgICAgcHJvcGVydHkxOiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5LFxuICAgICAgcHJvcGVydHkyOiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5XG4gICAgKSA9PiBudW1iZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKG9iaiwgY2xhc3NOYW1lLCBvcHRpb25zLCB0cnVlKTtcbiAgICB0aGlzLmtvVGFiID0ga28ub2JzZXJ2YWJsZSh0aGlzLmtvVGFicygpWzBdKTtcbiAgICB0aGlzLmtvUHJvcGVydGllcyh0aGlzLmdldE9iamVjdFByb3BlcnRpZXMoKSk7XG4gICAgdGhpcy5rb1RhYigpLmV4cGFuZCgpO1xuICB9XG4gIHByb3RlY3RlZCBhZGRQcm9wZXJ0aWVzVGFicyh0YWJzOiBBcnJheTxTdXJ2ZXlFbGVtZW50RWRpdG9yVGFiTW9kZWw+KSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXMoKTtcbiAgICB2YXIgdGFiSXRlbSA9IG5ldyBTdXJ2ZXlRdWVzdGlvbkVkaXRvclRhYkRlZmluaXRpb24oKTtcbiAgICB0YWJzLnB1c2godGhpcy5jcmVhdGVOZXdUYWIodGFiSXRlbSwgcHJvcGVydGllcykpO1xuICB9XG4gIHByb3RlY3RlZCBhc3NpZ25Qcm9wZXJ0aWVzVG9FZGl0b3IocHJvcEVkaXRvcjogU3VydmV5T2JqZWN0UHJvcGVydHkpIHtcbiAgICBzdXBlci5hc3NpZ25Qcm9wZXJ0aWVzVG9FZGl0b3IocHJvcEVkaXRvcik7XG4gICAgcHJvcEVkaXRvci5pc0luUHJvcGVydHlHcmlkID0gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGdldE9iamVjdFByb3BlcnRpZXMoKTogQXJyYXk8U3VydmV5T2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIHByb3BzID0gdGhpcy5rb1RhYigpLmVkaXRvclByb3BlcnRpZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2gocHJvcHNbaV0pO1xuICAgIH1cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHNvcnRFdmVudCA9IGZ1bmN0aW9uIChcbiAgICAgIGE6IFN1cnZleU9iamVjdFByb3BlcnR5LFxuICAgICAgYjogU3VydmV5T2JqZWN0UHJvcGVydHlcbiAgICApOiBudW1iZXIge1xuICAgICAgdmFyIHJlcyA9IDA7XG4gICAgICBpZiAoc2VsZi5vblNvcnRQcm9wZXJ0eUNhbGxiYWNrKSB7XG4gICAgICAgIHJlcyA9IHNlbGYub25Tb3J0UHJvcGVydHlDYWxsYmFjayhcbiAgICAgICAgICBzZWxmLm9yaWdpbmFsT2JqLFxuICAgICAgICAgIGEucHJvcGVydHksXG4gICAgICAgICAgYi5wcm9wZXJ0eVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICAgIGlmIChhLmRpc3BsYXlOYW1lID09IGIuZGlzcGxheU5hbWUpIHJldHVybiAwO1xuICAgICAgaWYgKGEuZGlzcGxheU5hbWUgPiBiLmRpc3BsYXlOYW1lKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9O1xuICAgIHJlcyA9IHJlcy5zb3J0KHNvcnRFdmVudCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGdldFByb3BlcnRpZXMoKTogQXJyYXk8U3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgdGFiSXRlbXMgPSB0aGlzLnByb3BlcnRpZXMuZ2V0VGFicygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFiSXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0YWJQcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzLmdldFByb3BlcnRpZXModGFiSXRlbXNbaV0pO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0YWJQcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHJlcy5wdXNoKHRhYlByb3BlcnRpZXNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFbGVtZW50RWRpdG9yVGFiTW9kZWwge1xuICBwcml2YXRlIGVkaXRvclByb3BlcnRpZXNWYWx1ZTogQXJyYXk8U3VydmV5T2JqZWN0UHJvcGVydHk+ID0gW107XG4gIHByaXZhdGUgdGl0bGVWYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIGh0bWxFbGVtZW50cyA9IG51bGw7XG4gIHB1YmxpYyBvbkV4cGFuZDogKCkgPT4gdm9pZDtcbiAgcHVibGljIG9uQ29sbGFwc2U6ICgpID0+IHZvaWQ7XG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyQ2FsbGJhY2s6IChcbiAgICBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgcHJvcGVydHk6IFN1cnZleU9iamVjdFByb3BlcnR5XG4gICkgPT4gYW55O1xuICBrb0FmdGVyUmVuZGVyUHJvcGVydHk6IGFueTtcbiAga29BZnRlclJlbmRlcjogYW55O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgb2JqOiBhbnksXG4gICAgcHJpdmF0ZSBwcm9wZXJ0aWVzOiBBcnJheTxTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5PixcbiAgICBwcml2YXRlIF9uYW1lLFxuICAgIHB1YmxpYyBvcHRpb25zOiBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9uc1xuICApIHtcbiAgICB0aGlzLmJ1aWxkRWRpdG9yUHJvcGVydGllcygpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvQWZ0ZXJSZW5kZXJQcm9wZXJ0eSA9IGZ1bmN0aW9uIChjb21wb25lbnRJbmZvOiBhbnksIGNvbikge1xuICAgICAgc2VsZi5hZnRlclJlbmRlclByb3BlcnR5KGNvbXBvbmVudEluZm8sIGNvbik7XG4gICAgfTtcbiAgICB0aGlzLmtvQWZ0ZXJSZW5kZXIgPSBmdW5jdGlvbiAoY29tcG9uZW50SW5mbzogYW55LCBjb24pIHtcbiAgICAgIHNlbGYuYWZ0ZXJSZW5kZXIoY29tcG9uZW50SW5mbywgY29uKTtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBleHBhbmQoKSB7XG4gICAgaWYgKCEhdGhpcy5vbkV4cGFuZCkgdGhpcy5vbkV4cGFuZCgpO1xuICAgIHRoaXMuZG9PbkV4cGFuZGVkKCk7XG4gIH1cbiAgcHVibGljIGNvbGxhcHNlKCkge1xuICAgIGlmICghIXRoaXMub25Db2xsYXBzZSkgdGhpcy5vbkNvbGxhcHNlKCk7XG4gIH1cbiAgcHVibGljIGRvT25FeHBhbmRlZCgpIHtcbiAgICB0aGlzLmJlZm9yZVNob3coKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGtvLnRhc2tzLnJ1bkVhcmx5KCk7XG4gICAgICB0aGlzLmZvY3VzRWRpdG9yKCk7XG4gICAgfSwgMSk7XG4gIH1cbiAgcHJpdmF0ZSBhZnRlclJlbmRlcihlbGVtZW50czogSFRNTEVsZW1lbnRbXSwgY29udGV4dCkge1xuICAgIHRoaXMuaHRtbEVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgdGhpcy5mb2N1c0VkaXRvcigpO1xuICB9XG4gIHB1YmxpYyBmb2N1c0VkaXRvcigpIHtcbiAgICBpZiAoISF0aGlzLmh0bWxFbGVtZW50cykge1xuICAgICAgZm9jdXNGaXJzdENvbnRyb2wodGhpcy5odG1sRWxlbWVudHMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRpdGxlKCkge1xuICAgIGlmICh0aGlzLnRpdGxlVmFsdWUpIHJldHVybiB0aGlzLnRpdGxlVmFsdWU7XG4gICAgdmFyIHN0ciA9IGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZS50YWJzLlwiICsgdGhpcy5uYW1lKTtcbiAgICByZXR1cm4gc3RyID8gc3RyIDogdGhpcy5uYW1lO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudGl0bGVWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yUHJvcGVydGllcygpOiBBcnJheTxTdXJ2ZXlPYmplY3RQcm9wZXJ0eT4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRvclByb3BlcnRpZXNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGh0bWxUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInN2ZC1vYmplY3QtZWRpdG9yLXRhYlwiO1xuICB9XG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVPYmplY3QoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBwdWJsaWMgaGFzRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgdmFyIGlzRXJyb3IgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWRpdG9yUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXNFcnJvciA9IHRoaXMuZWRpdG9yUHJvcGVydGllc1tpXS5oYXNFcnJvcigpIHx8IGlzRXJyb3I7XG4gICAgfVxuICAgIHJldHVybiBpc0Vycm9yO1xuICB9XG4gIHB1YmxpYyBiZWZvcmVTaG93KCkge1xuICAgIHRoaXMucGVyZm9ybUZvckFsbFByb3BlcnRpZXMoKHApID0+IHAuYmVmb3JlU2hvdygpKTtcbiAgfVxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5wZXJmb3JtRm9yQWxsUHJvcGVydGllcygocCkgPT4gcC5yZXNldCgpKTtcbiAgfVxuICBwdWJsaWMgYXBwbHlUb09iaihvYmo6IFN1cnZleS5CYXNlKSB7XG4gICAgdGhpcy5wZXJmb3JtRm9yQWxsUHJvcGVydGllcygocCkgPT4gcC5hcHBseVRvT2JqKG9iaikpO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9wZXJ0eUVkaXRvckJ5TmFtZShwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IFN1cnZleU9iamVjdFByb3BlcnR5IHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLmVkaXRvclByb3BlcnRpZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHByb3BzW2ldLnByb3BlcnR5Lm5hbWUgPT0gcHJvcGVydHlOYW1lKSByZXR1cm4gcHJvcHNbaV07XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZShwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSk6IGFueSB7XG4gICAgcmV0dXJuIHByb3BlcnR5LmdldFByb3BlcnR5VmFsdWUodGhpcy5vYmopO1xuICB9XG4gIHByaXZhdGUgYWZ0ZXJSZW5kZXJQcm9wZXJ0eShjb21wb25lbnRJbmZvOiBhbnksIHByb3ApIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldE5vZGVzRnJvbUtvQ29tcG9uZW50SW5mbyhjb21wb25lbnRJbmZvKTtcbiAgICBpZiAoIXRoaXMub25BZnRlclJlbmRlckNhbGxiYWNrKSByZXR1cm47XG4gICAgdmFyIGVsID0gZ2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgdmFyIHRFbCA9IGVsZW1lbnRzWzBdO1xuICAgIGlmICh0RWwubm9kZU5hbWUgPT09IFwiI3RleHRcIikgdEVsLmRhdGEgPSBcIlwiO1xuICAgIHRFbCA9IGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmICh0RWwubm9kZU5hbWUgPT09IFwiI3RleHRcIikgdEVsLmRhdGEgPSBcIlwiO1xuICAgIHRoaXMub25BZnRlclJlbmRlckNhbGxiYWNrKGVsLnBhcmVudEVsZW1lbnQsIHByb3ApO1xuICB9XG4gIHByaXZhdGUgYnVpbGRFZGl0b3JQcm9wZXJ0aWVzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHRoaXMucHJvcGVydGllc1tpXTtcbiAgICAgIHRoaXMuY3JlYXRlRWRpdG9yKHByb3ApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNyZWF0ZUVkaXRvcihwcm9wZXJ0eTogYW55KSB7XG4gICAgdmFyIG9iamVjdFByb3BlcnR5ID0gbmV3IFN1cnZleU9iamVjdFByb3BlcnR5KHByb3BlcnR5LCB0aGlzLm9wdGlvbnMpO1xuICAgIG9iamVjdFByb3BlcnR5Lm9iamVjdCA9IHRoaXMub2JqO1xuICAgIHRoaXMuZWRpdG9yUHJvcGVydGllc1ZhbHVlLnB1c2gob2JqZWN0UHJvcGVydHkpO1xuICB9XG4gIHByaXZhdGUgcGVyZm9ybUZvckFsbFByb3BlcnRpZXMoZnVuYzogKHA6IFN1cnZleU9iamVjdFByb3BlcnR5KSA9PiB2b2lkKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVkaXRvclByb3BlcnRpZXNWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgZnVuYyh0aGlzLmVkaXRvclByb3BlcnRpZXNWYWx1ZVtpXSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9wZXJ0eUVkaXRvclNob3dXaW5kb3cge1xuICBrb1Zpc2libGU6IGFueTtcbiAga29FZGl0b3I6IGFueTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5rb1Zpc2libGUgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgICB0aGlzLmtvRWRpdG9yID0ga28ub2JzZXJ2YWJsZShudWxsKTtcbiAgfVxuICBwdWJsaWMgc2hvdyhcbiAgICBxdWVzdGlvbjogU3VydmV5LkJhc2UsXG4gICAgZWxXaW5kb3c6IEhUTUxFbGVtZW50LFxuICAgIG9uQ2hhbmdlZDogKHF1ZXN0aW9uOiBTdXJ2ZXkuUXVlc3Rpb24pID0+IGFueSxcbiAgICBvcHRpb25zOiBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9ucyA9IG51bGwsXG4gICAgb25DbG9zZWQ6ICgpID0+IGFueSA9IG51bGwsXG4gICAgb25FZGl0b3JBZnRlclJlbmRlckNhbGxiYWNrOiAoXG4gICAgICBvYmo6IGFueSxcbiAgICAgIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgIHByb3A6IFN1cnZleU9iamVjdFByb3BlcnR5XG4gICAgKSA9PiB2b2lkID0gdW5kZWZpbmVkXG4gICkge1xuICAgIHZhciBlZGl0b3IgPSBuZXcgU3VydmV5UXVlc3Rpb25FZGl0b3IocXVlc3Rpb24sIG51bGwsIG9wdGlvbnMpO1xuICAgIGVkaXRvci5vbkFmdGVyUmVuZGVyQ2FsbGJhY2sgPSBvbkVkaXRvckFmdGVyUmVuZGVyQ2FsbGJhY2s7XG4gICAgZWRpdG9yLm9uQ2hhbmdlZCA9IG9uQ2hhbmdlZDtcblxuICAgIHRoaXMua29FZGl0b3IoZWRpdG9yKTtcbiAgICB0aGlzLmtvVmlzaWJsZSh0cnVlKTtcblxuICAgIHZhciBtb2RhbCA9IG5ldyBSTW9kYWwoZWxXaW5kb3csIHtcbiAgICAgIGJvZHlDbGFzczogXCJcIixcbiAgICAgIGNsb3NlVGltZW91dDogMTAwLFxuICAgICAgZGlhbG9nT3BlbkNsYXNzOiBcImFuaW1hdGVkIGZhZGVJblwiLFxuICAgICAgZm9jdXM6IGZhbHNlLFxuICAgICAgYWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAob25DbG9zZWQpIG9uQ2xvc2VkKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIG1vZGFsLm9wZW4oKTtcblxuICAgIGlmICgoPGFueT5vcHRpb25zKS5jbG9zZU1vZGFsT3V0c2lkZSAhPT0gXCJvZmZcIikge1xuICAgICAgdmFyIGZhZGVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdXJ2ZXlxdWVzdGlvbmVkaXRvcndpbmRvd1wiKTtcbiAgICAgIHZhciBvdXRPZk1vZGFsQ2xpY2tIYW5kbGVyID0gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICBpZiAoKDxhbnk+ZXZ0LnRhcmdldCkuY2xhc3NOYW1lID09PSBcIm1vZGFsXCIpIHtcbiAgICAgICAgICBpZiAoKDxhbnk+b3B0aW9ucykuY2xvc2VNb2RhbE91dHNpZGUgPT09IFwiYXBwbHlcIikge1xuICAgICAgICAgICAgZWRpdG9yLm9uT2tDbGljaygpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZGl0b3Iub25SZXNldENsaWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZmFkZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBvdXRPZk1vZGFsQ2xpY2tIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJrZXlkb3duXCIsXG4gICAgICBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgbW9kYWwua2V5ZG93bihldik7XG4gICAgICB9LFxuICAgICAgZmFsc2VcbiAgICApO1xuXG4gICAgZWRpdG9yLm9uSGlkZVdpbmRvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICgoPGFueT5vcHRpb25zKS5jbG9zZU1vZGFsT3V0c2lkZSAhPT0gXCJvZmZcIikge1xuICAgICAgICBmYWRlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIG91dE9mTW9kYWxDbGlja0hhbmRsZXIpO1xuICAgICAgfVxuICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkVkaXRvclByb3BlcnR5RGVmaW5pdGlvbiB7XG4gIHB1YmxpYyBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eTtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBjYXRlZ29yeTogc3RyaW5nO1xuICBwdWJsaWMgY3JlYXRlZEZyb21UYWJOYW1lOiBib29sZWFuO1xuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLnByb3BlcnR5ID8gdGhpcy5wcm9wZXJ0eS5uYW1lIDogXCJcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25FZGl0b3JUYWJEZWZpbml0aW9uIHtcbiAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyB2aXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGluZGV4OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgcHJvcGVydGllczogQXJyYXk8U3VydmV5UXVlc3Rpb25FZGl0b3JQcm9wZXJ0eURlZmluaXRpb24+ID0gW107XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvblByb3BlcnRpZXMge1xuICBwcml2YXRlIHNob3dNb2RlVmFsdWU6IHN0cmluZztcbiAgcHJpdmF0ZSBwcm9wZXJ0aWVzOiBBcnJheTxTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5PjtcbiAgcHJpdmF0ZSBwcm9wZXJ0aWVzSGFzaDogYW55O1xuICBwcml2YXRlIHRhYnM6IEFycmF5PFN1cnZleVF1ZXN0aW9uRWRpdG9yVGFiRGVmaW5pdGlvbj4gPSBbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG9iajogYW55LFxuICAgIHB1YmxpYyBvcHRpb25zOiBJU3VydmV5Q3JlYXRvck9wdGlvbnMgPSBudWxsLFxuICAgIGNsYXNzTmFtZTogc3RyaW5nID0gbnVsbCxcbiAgICBzaG93TW9kZTogc3RyaW5nID0gbnVsbCxcbiAgICBwcml2YXRlIHBhcmVudE9iajogYW55ID0gbnVsbCxcbiAgICBwcml2YXRlIHBhcmVudFByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5ID0gbnVsbFxuICApIHtcbiAgICB0aGlzLnNob3dNb2RlVmFsdWUgPSBzaG93TW9kZTtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSBTdXJ2ZXkuU2VyaWFsaXplci5nZXRQcm9wZXJ0aWVzQnlPYmoodGhpcy5vYmopO1xuICAgIHRoaXMuZmlsbFByb3BlcnRpZXNIYXNoKCk7XG4gICAgdGhpcy5idWlsZFRhYnMoY2xhc3NOYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICB2YXIgcmVzID0gdGhpcy5wcm9wZXJ0aWVzSGFzaFtwcm9wZXJ0eU5hbWVdO1xuICAgIHJldHVybiAhIXJlcyAmJiByZXMudmlzaWJsZSA/IHJlcy5wcm9wZXJ0eSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldCBzaG93TW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMuc2hvd01vZGVWYWx1ZSA/IHRoaXMuc2hvd01vZGVWYWx1ZSA6IFwiZm9ybVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGFicy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMudGFic1tpXS52aXNpYmxlICYmIHRoaXMudGFic1tpXS5wcm9wZXJ0aWVzLmxlbmd0aCA+IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBmaWxsUHJvcGVydGllc0hhc2goKSB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzSGFzaCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHRoaXMucHJvcGVydGllc1tpXTtcbiAgICAgIHRoaXMucHJvcGVydGllc0hhc2hbcHJvcC5uYW1lXSA9IHtcbiAgICAgICAgcHJvcGVydHk6IHByb3AsXG4gICAgICAgIHZpc2libGU6IFN1cnZleUhlbHBlci5pc1Byb3BlcnR5VmlzaWJsZShcbiAgICAgICAgICB0aGlzLm9iaixcbiAgICAgICAgICBwcm9wLFxuICAgICAgICAgIHRoaXMub3B0aW9ucyxcbiAgICAgICAgICB0aGlzLnNob3dNb2RlLFxuICAgICAgICAgIHRoaXMucGFyZW50T2JqLFxuICAgICAgICAgIHRoaXMucGFyZW50UHJvcGVydHlcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNKU09OUHJvcGVydHlWaXNpYmxlKHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IHRoaXMucHJvcGVydGllc0hhc2hbcHJvcGVydHkubmFtZV07XG4gICAgcmV0dXJuICEhcmVzICYmIHJlcy52aXNpYmxlO1xuICB9XG4gIHB1YmxpYyBnZXRUYWJCeU5hbWUodGFiTmFtZTogc3RyaW5nKTogU3VydmV5UXVlc3Rpb25FZGl0b3JUYWJEZWZpbml0aW9uIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGFicy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMudGFic1tpXS5uYW1lID09IHRhYk5hbWUpIHJldHVybiB0aGlzLnRhYnNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRUYWJzKCk6IEFycmF5PFN1cnZleVF1ZXN0aW9uRWRpdG9yVGFiRGVmaW5pdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnRhYnM7XG4gIH1cbiAgcHVibGljIGdldFByb3BlcnRpZXMoXG4gICAgdGFiOiBTdXJ2ZXlRdWVzdGlvbkVkaXRvclRhYkRlZmluaXRpb25cbiAgKTogQXJyYXk8U3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYi5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaCh0YWIucHJvcGVydGllc1tpXS5wcm9wZXJ0eSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFRhYnMoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lID0gdGhpcy5vYmouZ2V0VHlwZSgpO1xuICAgIH1cbiAgICB2YXIgZGVmaW5pdGlvbnMgPSB0aGlzLmdldEFsbERlZmluaXRpb25zQnlDbGFzcyhjbGFzc05hbWUpO1xuICAgIHZhciBhZGRlZFByb3BlcnRpZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gZGVmaW5pdGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBkZWZJdGVtID0gZGVmaW5pdGlvbnNbaV07XG4gICAgICBmb3IgKHZhciBqID0gISFkZWZJdGVtLnRhYnMgPyBkZWZJdGVtLnRhYnMubGVuZ3RoIC0gMSA6IC0xOyBqID49IDA7IGotLSkge1xuICAgICAgICBpZiAoYWRkZWRQcm9wZXJ0aWVzLmluZGV4T2YoZGVmSXRlbS50YWJzW2pdLm5hbWUpID4gLTEpIGNvbnRpbnVlO1xuICAgICAgICBpZiAodGhpcy5hZGRQcm9wZXJ0eUludG9UYWIoZGVmSXRlbS50YWJzW2pdLCB0cnVlKSkge1xuICAgICAgICAgIGFkZGVkUHJvcGVydGllcy5wdXNoKGRlZkl0ZW0udGFic1tqXS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChcbiAgICAgICAgdmFyIGogPSAhIWRlZkl0ZW0ucHJvcGVydGllcyA/IGRlZkl0ZW0ucHJvcGVydGllcy5sZW5ndGggLSAxIDogLTE7XG4gICAgICAgIGogPj0gMDtcbiAgICAgICAgai0tXG4gICAgICApIHtcbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9XG4gICAgICAgICAgZGVmSXRlbS5wcm9wZXJ0aWVzW2pdW1wibmFtZVwiXSB8fCBkZWZJdGVtLnByb3BlcnRpZXNbal07XG4gICAgICAgIGlmIChhZGRlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSAtMSkge1xuICAgICAgICAgIGFkZGVkUHJvcGVydGllcy5wdXNoKHByb3BlcnR5TmFtZSk7XG4gICAgICAgICAgdGhpcy5hZGRQcm9wZXJ0eUludG9UYWIoZGVmSXRlbS5wcm9wZXJ0aWVzW2pdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gdGhpcy50YWJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0aGlzLm1vdmVQcm9wZXJ0aWVzVG9OZXh0UHJvcGVydGllcyh0aGlzLnRhYnNbaV0ucHJvcGVydGllcyk7XG4gICAgICBpZiAoIXRoaXMudGFic1tpXS52aXNpYmxlKSB7XG4gICAgICAgIHRoaXMudGFicy5zcGxpY2UoaSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnRQcm9wZXJ0aWVzKHRoaXMudGFic1tpXS5wcm9wZXJ0aWVzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy50YWJzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLmluZGV4IDwgYi5pbmRleCA/IC0xIDogYS5pbmRleCA+IGIuaW5kZXggPyAxIDogMDtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGFkZFByb3BlcnR5SW50b1RhYihcbiAgICBkZWZQcm9wZXJ0eTogYW55LFxuICAgIGlzVGFiOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzVGFiKSB7XG4gICAgICBsZXQgdGFiID0gdGhpcy5nZXRUYWJPckNyZWF0ZShkZWZQcm9wZXJ0eS5uYW1lKTtcbiAgICAgIGlmIChkZWZQcm9wZXJ0eS5pbmRleCA+IDApIHtcbiAgICAgICAgdGFiLmluZGV4ID0gZGVmUHJvcGVydHkuaW5kZXg7XG4gICAgICB9XG4gICAgICBpZiAoZGVmUHJvcGVydHkudmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGFiLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghIWRlZlByb3BlcnR5LnRpdGxlKSB7XG4gICAgICAgIHRhYi50aXRsZSA9IGRlZlByb3BlcnR5LnRpdGxlO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgaXNTdHJpbmcgPSB0eXBlb2YgZGVmUHJvcGVydHkgPT0gXCJzdHJpbmdcIjtcbiAgICB2YXIgbmFtZSA9ICFpc1N0cmluZyA/IGRlZlByb3BlcnR5Lm5hbWUgOiBkZWZQcm9wZXJ0eTtcbiAgICB2YXIgcHJvcFJlcyA9IHRoaXMucHJvcGVydGllc0hhc2hbbmFtZV07XG4gICAgaWYgKCFwcm9wUmVzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFpc1N0cmluZyAmJiBkZWZQcm9wZXJ0eS52aXNpYmxlID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChcbiAgICAgICFwcm9wUmVzLnZpc2libGUgJiZcbiAgICAgIChpc1N0cmluZyB8fCAoIWlzU3RyaW5nICYmIGRlZlByb3BlcnR5LnZpc2libGUgIT09IHRydWUpKVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdGFiTmFtZSA9IGlzVGFiID8gZGVmUHJvcGVydHkubmFtZSA6IFwiZ2VuZXJhbFwiO1xuICAgIGlmICghaXNUYWIgJiYgIWlzU3RyaW5nICYmICEhZGVmUHJvcGVydHkudGFiKSB7XG4gICAgICB0YWJOYW1lID0gZGVmUHJvcGVydHkudGFiO1xuICAgIH1cbiAgICB2YXIgcHJvcGVydHlEZWZpbml0aW9uID0gbmV3IFN1cnZleVF1ZXN0aW9uRWRpdG9yUHJvcGVydHlEZWZpbml0aW9uKCk7XG4gICAgcHJvcGVydHlEZWZpbml0aW9uLnByb3BlcnR5ID0gcHJvcFJlcy5wcm9wZXJ0eTtcbiAgICBwcm9wZXJ0eURlZmluaXRpb24uY2F0ZWdvcnkgPVxuICAgICAgIWlzU3RyaW5nICYmICEhZGVmUHJvcGVydHkuY2F0ZWdvcnkgPyBkZWZQcm9wZXJ0eS5jYXRlZ29yeSA6IFwiXCI7XG4gICAgcHJvcGVydHlEZWZpbml0aW9uLnRpdGxlID1cbiAgICAgICFpc1N0cmluZyAmJiAhIWRlZlByb3BlcnR5LnRpdGxlID8gZGVmUHJvcGVydHkudGl0bGUgOiBcIlwiO1xuICAgIHByb3BlcnR5RGVmaW5pdGlvbi5jcmVhdGVkRnJvbVRhYk5hbWUgPSBpc1RhYjtcbiAgICBsZXQgdGFiID0gdGhpcy5nZXRUYWJPckNyZWF0ZSh0YWJOYW1lKTtcbiAgICB0YWIucHJvcGVydGllcy51bnNoaWZ0KHByb3BlcnR5RGVmaW5pdGlvbik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBtb3ZlUHJvcGVydGllc1RvTmV4dFByb3BlcnRpZXMoXG4gICAgcHJvcGVydGllczogQXJyYXk8U3VydmV5UXVlc3Rpb25FZGl0b3JQcm9wZXJ0eURlZmluaXRpb24+XG4gICkge1xuICAgIHZhciBwcm9wcyA9IFtdLmNvbmNhdChwcm9wZXJ0aWVzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmV3VGFiID0gdGhpcy5nZXRUYWJCeVByb3BlcnR5TmFtZShwcm9wc1tpXS5wcm9wZXJ0eS5uZXh0VG9Qcm9wZXJ0eSk7XG4gICAgICBpZiAoISFuZXdUYWIpIHtcbiAgICAgICAgdmFyIHByb3AgPSB0aGlzLmdldFByb3BlcnR5QnlOYW1lSW5UYWIoXG4gICAgICAgICAgbmV3VGFiLFxuICAgICAgICAgIHByb3BzW2ldLnByb3BlcnR5Lm5leHRUb1Byb3BlcnR5XG4gICAgICAgICk7XG4gICAgICAgIHZhciBpbmRleCA9IG5ld1RhYi5wcm9wZXJ0aWVzLmluZGV4T2YocHJvcCk7XG4gICAgICAgIG5ld1RhYi5wcm9wZXJ0aWVzLnNwbGljZShpbmRleCArIDEsIDAsIHByb3BzW2ldKTtcbiAgICAgICAgcHJvcGVydGllcy5zcGxpY2UocHJvcGVydGllcy5pbmRleE9mKHByb3BzW2ldKSwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0VGFiQnlQcm9wZXJ0eU5hbWUoXG4gICAgcHJvcE5hbWU6IHN0cmluZ1xuICApOiBTdXJ2ZXlRdWVzdGlvbkVkaXRvclRhYkRlZmluaXRpb24ge1xuICAgIGlmICghcHJvcE5hbWUpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoISF0aGlzLmdldFByb3BlcnR5QnlOYW1lSW5UYWIodGhpcy50YWJzW2ldLCBwcm9wTmFtZSkpXG4gICAgICAgIHJldHVybiB0aGlzLnRhYnNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByaXZhdGUgZ2V0UHJvcGVydHlCeU5hbWVJblRhYihcbiAgICB0YWI6IFN1cnZleVF1ZXN0aW9uRWRpdG9yVGFiRGVmaW5pdGlvbixcbiAgICBwcm9wTmFtZTogc3RyaW5nXG4gICk6IFN1cnZleVF1ZXN0aW9uRWRpdG9yUHJvcGVydHlEZWZpbml0aW9uIHtcbiAgICB2YXIgcHJvcHMgPSB0YWIucHJvcGVydGllcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJvcHNbaV0ubmFtZSA9PSBwcm9wTmFtZSkgcmV0dXJuIHByb3BzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcml2YXRlIGdldFRhYk9yQ3JlYXRlKHRhYk5hbWU6IHN0cmluZyk6IFN1cnZleVF1ZXN0aW9uRWRpdG9yVGFiRGVmaW5pdGlvbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRhYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnRhYnNbaV0ubmFtZSA9PSB0YWJOYW1lKSByZXR1cm4gdGhpcy50YWJzW2ldO1xuICAgIH1cbiAgICB2YXIgcmVzID0gbmV3IFN1cnZleVF1ZXN0aW9uRWRpdG9yVGFiRGVmaW5pdGlvbigpO1xuICAgIHJlcy5uYW1lID0gdGFiTmFtZTtcbiAgICAvL1RPRE8gbWFrZSBcImdlbmVyYWxcIiBjb25zdGFudFxuICAgIGlmICh0YWJOYW1lID09IFwiZ2VuZXJhbFwiKSB7XG4gICAgICByZXMuaW5kZXggPSAtMTtcbiAgICB9XG4gICAgdGhpcy50YWJzLnVuc2hpZnQocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgZ2V0QWxsRGVmaW5pdGlvbnNCeUNsYXNzKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nXG4gICk6IEFycmF5PElTdXJ2ZXlRdWVzdGlvbkVkaXRvckRlZmluaXRpb24+IHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgaWYgKFxuICAgICAgY2xhc3NOYW1lLmluZGV4T2YoXCJAXCIpID4gLTEgJiZcbiAgICAgIFN1cnZleVF1ZXN0aW9uRWRpdG9yRGVmaW5pdGlvbi5kZWZpbml0aW9uW2NsYXNzTmFtZV1cbiAgICApIHtcbiAgICAgIHZhciBkZWZhdWx0TmFtZSA9XG4gICAgICAgIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmluZGV4T2YoXCJAXCIpICsgMSkgKyBcImRlZmF1bHRcIjtcbiAgICAgIGlmIChcbiAgICAgICAgZGVmYXVsdE5hbWUgIT0gY2xhc3NOYW1lICYmXG4gICAgICAgICEhU3VydmV5UXVlc3Rpb25FZGl0b3JEZWZpbml0aW9uLmRlZmluaXRpb25bZGVmYXVsdE5hbWVdXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0LnB1c2goU3VydmV5UXVlc3Rpb25FZGl0b3JEZWZpbml0aW9uLmRlZmluaXRpb25bZGVmYXVsdE5hbWVdKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKFN1cnZleVF1ZXN0aW9uRWRpdG9yRGVmaW5pdGlvbi5kZWZpbml0aW9uW2NsYXNzTmFtZV0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdmFyIGN1ckNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICB2YXIgdXNlZFByb3BlcnRpZXMgPSB7fTtcbiAgICB2YXIgaGFzTm9uVGFiUHJvcGVydGllcyA9IGZhbHNlO1xuICAgIHdoaWxlIChjdXJDbGFzc05hbWUpIHtcbiAgICAgIGxldCBtZXRhQ2xhc3MgPSA8U3VydmV5Lkpzb25NZXRhZGF0YUNsYXNzPihcbiAgICAgICAgU3VydmV5LlNlcmlhbGl6ZXIuZmluZENsYXNzKGN1ckNsYXNzTmFtZSlcbiAgICAgICk7XG4gICAgICBpZiAoIW1ldGFDbGFzcykgYnJlYWs7XG4gICAgICBsZXQgY2xhc3NSZXMgPSBTdXJ2ZXlRdWVzdGlvbkVkaXRvckRlZmluaXRpb24uZGVmaW5pdGlvblttZXRhQ2xhc3MubmFtZV07XG4gICAgICBpZiAoY2xhc3NSZXMpIHtcbiAgICAgICAgaWYgKGNsYXNzUmVzLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgd2hpbGUgKGkgPCBjbGFzc1Jlcy5wcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHByb3AgPSBjbGFzc1Jlcy5wcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgdmFyIHByb3BOYW1lID0gdHlwZW9mIHByb3AgPT0gXCJzdHJpbmdcIiA/IHByb3AgOiBwcm9wLm5hbWU7XG4gICAgICAgICAgICB2YXIgdGFiTmFtZSA9IFwiZ2VuZXJhbFwiO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSBcInN0cmluZ1wiICYmICEhcHJvcC50YWIpIHtcbiAgICAgICAgICAgICAgdGFiTmFtZSA9IHByb3AudGFiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGpzb25Qcm9wID0gISF0aGlzLnByb3BlcnRpZXNIYXNoW3Byb3BOYW1lXVxuICAgICAgICAgICAgICA/IHRoaXMucHJvcGVydGllc0hhc2hbcHJvcE5hbWVdLnByb3BlcnR5XG4gICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIHZhciBqc29uUHJvcGVydHlDYXRlZ29yeSA9IHRoaXMuZ2V0SnNvblByb3BlcnR5Q2F0ZWdvcnkoanNvblByb3ApO1xuICAgICAgICAgICAgaWYgKCEhanNvblByb3BlcnR5Q2F0ZWdvcnkgJiYganNvblByb3BlcnR5Q2F0ZWdvcnkgIT09IHRhYk5hbWUpIHtcbiAgICAgICAgICAgICAgY2xhc3NSZXMucHJvcGVydGllcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1c2VkUHJvcGVydGllc1twcm9wTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjbGFzc1Jlcy50YWJzKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc1Jlcy50YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBoYXNOb25UYWJQcm9wZXJ0aWVzID1cbiAgICAgICAgICAgICAgaGFzTm9uVGFiUHJvcGVydGllcyB8fCBjbGFzc1Jlcy50YWJzW2ldLm5hbWUgPT0gXCJvdGhlcnNcIjtcbiAgICAgICAgICAgIHVzZWRQcm9wZXJ0aWVzW2NsYXNzUmVzLnRhYnNbaV0ubmFtZV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHQudW5zaGlmdChjbGFzc1Jlcyk7XG4gICAgICB9XG4gICAgICBjdXJDbGFzc05hbWUgPSBtZXRhQ2xhc3MucGFyZW50TmFtZTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc05vblRhYlByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuYWRkTm9uVGFiUHJvcGVydGllcyhyZXN1bHQsIHVzZWRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGdldEpzb25Qcm9wZXJ0eUNhdGVnb3J5KFxuICAgIGpzb25Qcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuICApOiBzdHJpbmcge1xuICAgIGlmICghanNvblByb3BlcnR5KSByZXR1cm4gbnVsbDtcbiAgICBpZiAoISFqc29uUHJvcGVydHkuY2F0ZWdvcnkpIHJldHVybiBqc29uUHJvcGVydHkuY2F0ZWdvcnk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBhZGROb25UYWJQcm9wZXJ0aWVzKFxuICAgIHRhYnM6IEFycmF5PElTdXJ2ZXlRdWVzdGlvbkVkaXRvckRlZmluaXRpb24+LFxuICAgIHVzZWRQcm9wZXJ0aWVzOiBhbnlcbiAgKSB7XG4gICAgbGV0IGNsYXNzUmVzOiBhbnkgPSB7IHByb3BlcnRpZXM6IFtdLCB0YWJzOiBbXSB9O1xuICAgIGxldCB0YWJOYW1lcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgcHJvcCA9IHRoaXMucHJvcGVydGllc1tpXTtcbiAgICAgIGlmICghdGhpcy5pc0pTT05Qcm9wZXJ0eVZpc2libGUocHJvcCkgfHwgISF1c2VkUHJvcGVydGllc1twcm9wLm5hbWVdKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGxldCBwcm9wQ2F0ZWdvcnkgPSB0aGlzLmdldEpzb25Qcm9wZXJ0eUNhdGVnb3J5KHByb3ApO1xuICAgICAgbGV0IHRhYk5hbWUgPSAhIXByb3BDYXRlZ29yeVxuICAgICAgICA/IHByb3BDYXRlZ29yeVxuICAgICAgICA6IHRhYnMubGVuZ3RoID09IDBcbiAgICAgICAgPyBcImdlbmVyYWxcIlxuICAgICAgICA6IFwib3RoZXJzXCI7XG4gICAgICBpZiAodGFiTmFtZXMuaW5kZXhPZih0YWJOYW1lKSA8IDAgJiYgdGFiTmFtZSAhPSBcImdlbmVyYWxcIikge1xuICAgICAgICB0YWJOYW1lcy5wdXNoKHRhYk5hbWUpO1xuICAgICAgICBjbGFzc1Jlcy50YWJzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IHRhYk5hbWUsXG4gICAgICAgICAgaW5kZXg6IHRhYk5hbWUgPT0gXCJvdGhlcnNcIiA/IDEwMDAgOiB0YWJOYW1lcy5sZW5ndGggKiAxMCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcC5jYXRlZ29yeUluZGV4ID4gLTEgJiYgdGFiTmFtZXMuaW5kZXhPZih0YWJOYW1lKSA+IC0xKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2xhc3NSZXMudGFicy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmIChjbGFzc1Jlcy50YWJzW2pdLm5hbWUgPT0gdGFiTmFtZSkge1xuICAgICAgICAgICAgY2xhc3NSZXMudGFic1tqXS5pbmRleCA9IHByb3AuY2F0ZWdvcnlJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzUmVzLnByb3BlcnRpZXMucHVzaCh7XG4gICAgICAgIG5hbWU6IHRoaXMucHJvcGVydGllc1tpXS5uYW1lLFxuICAgICAgICB0YWI6IHRhYk5hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNsYXNzUmVzLnByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGFicy5wdXNoKGNsYXNzUmVzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzb3J0UHJvcGVydGllcyhcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxTdXJ2ZXlRdWVzdGlvbkVkaXRvclByb3BlcnR5RGVmaW5pdGlvbj5cbiAgKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BlcnRpZXMpKSByZXR1cm47XG4gICAgdmFyIHByb3BzOiBBcnJheTxTdXJ2ZXlRdWVzdGlvbkVkaXRvclByb3BlcnR5RGVmaW5pdGlvbj4gPSBbXS5jb25jYXQoXG4gICAgICBwcm9wZXJ0aWVzXG4gICAgKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5kZXggPSBwcm9wc1tpXS5wcm9wZXJ0eS52aXNpYmxlSW5kZXg7XG4gICAgICBpZiAocHJvcHNbaV0uY3JlYXRlZEZyb21UYWJOYW1lKSB7XG4gICAgICAgIGluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCA8IDApIGNvbnRpbnVlO1xuICAgICAgdmFyIGN1ckluZGV4ID0gcHJvcGVydGllcy5pbmRleE9mKHByb3BzW2ldKTtcbiAgICAgIGlmIChjdXJJbmRleCA+IC0xKSB7XG4gICAgICAgIHByb3BlcnRpZXMuc3BsaWNlKGN1ckluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCA8IHByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgIHByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAwLCBwcm9wc1tpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocHJvcHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25FZGl0b3IgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsIHtcbiAgcHVibGljIG9uQ2hhbmdlZDogKG9iajogU3VydmV5LkJhc2UpID0+IGFueTtcbiAgcHVibGljIG9uSGlkZVdpbmRvdzogKCkgPT4gYW55O1xuICBwdWJsaWMgb25Pa0NsaWNrOiBhbnk7XG4gIHB1YmxpYyBvbkFwcGx5Q2xpY2s6IGFueTtcbiAgcHVibGljIG9uUmVzZXRDbGljazogYW55O1xuICBrb1RhYnM6IGtvLk9ic2VydmFibGVBcnJheTxTdXJ2ZXlFbGVtZW50RWRpdG9yVGFiTW9kZWw+O1xuICBrb0FjdGl2ZVRhYiA9IGtvLm9ic2VydmFibGU8c3RyaW5nPigpO1xuICBrb1RpdGxlID0ga28ub2JzZXJ2YWJsZTxzdHJpbmc+KCk7XG4gIGtvU2hvd0FwcGx5QnV0dG9uOiBhbnk7XG4gIG9uVGFiQ2xpY2s6IGFueTtcbiAgcHJpdmF0ZSBlZGl0YWJsZU9iamVjdDogRWRpdGFibGVPYmplY3Q7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb2JqOiBhbnksXG4gICAgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nID0gbnVsbCxcbiAgICBwdWJsaWMgb3B0aW9uczogSVN1cnZleU9iamVjdEVkaXRvck9wdGlvbnMgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKG9iaiwgY2xhc3NOYW1lLCBvcHRpb25zLCBmYWxzZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYub25BcHBseUNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5hcHBseSgpO1xuICAgIH07XG4gICAgc2VsZi5vbk9rQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmRvQ2xvc2VXaW5kb3coZmFsc2UpO1xuICAgIH07XG4gICAgc2VsZi5vblJlc2V0Q2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmRvQ2xvc2VXaW5kb3codHJ1ZSk7XG4gICAgfTtcbiAgICB0aGlzLm9uVGFiQ2xpY2sgPSBmdW5jdGlvbiAodGFiKSB7XG4gICAgICBzZWxmLmtvQWN0aXZlVGFiKHRhYi5uYW1lKTtcbiAgICB9O1xuICAgIHRoaXMua29TaG93QXBwbHlCdXR0b24gPSBrby5vYnNlcnZhYmxlKFxuICAgICAgIXRoaXMub3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMuc2hvd0FwcGx5QnV0dG9uSW5FZGl0b3JzXG4gICAgKTtcbiAgICB0aGlzLmtvVGl0bGUodGhpcy5nZXRUaXRsZSgpKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0T3JpZ2luYWxPYmpWYWx1ZShvYmo6IGFueSkge1xuICAgIHN1cGVyLnNldE9yaWdpbmFsT2JqVmFsdWUob2JqKTtcbiAgICB0aGlzLmVkaXRhYmxlT2JqZWN0ID0gbmV3IEVkaXRhYmxlT2JqZWN0KG9iaik7XG4gIH1cbiAgcHVibGljIGdldCBvYmooKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0YWJsZU9iamVjdC5vYmo7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0YWJsZU9iaigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmVkaXRhYmxlT2JqZWN0LmVkaXRhYmxlT2JqO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5yZWFkT25seTtcbiAgfVxuICBwcml2YXRlIGdldFRpdGxlKCk6IHN0cmluZyB7XG4gICAgdmFyIHJlcztcbiAgICBpZiAodGhpcy5lZGl0YWJsZU9ialtcIm5hbWVcIl0pIHtcbiAgICAgIHJlcyA9IGVkaXRvckxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwicGUucUVkaXRvclRpdGxlXCIpXG4gICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLmVkaXRhYmxlT2JqW1wibmFtZVwiXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZS5zdXJ2ZXlFZGl0b3JUaXRsZVwiKTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5vbkdldEVsZW1lbnRFZGl0b3JUaXRsZUNhbGxiYWNrKSB7XG4gICAgICByZXMgPSB0aGlzLm9wdGlvbnMub25HZXRFbGVtZW50RWRpdG9yVGl0bGVDYWxsYmFjayh0aGlzLmVkaXRhYmxlT2JqLCByZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBkb0Nsb3NlV2luZG93KGlzQ2FuY2VsOiBib29sZWFuKSB7XG4gICAgdmFyIGFwcGxpZWRTdWNjZXNmdWxsID0gZmFsc2U7XG4gICAgaWYgKCFpc0NhbmNlbCkge1xuICAgICAgYXBwbGllZFN1Y2Nlc2Z1bGwgPSB0aGlzLmFwcGx5KCk7XG4gICAgfVxuICAgIGlmIChpc0NhbmNlbCB8fCBhcHBsaWVkU3VjY2VzZnVsbCkge1xuICAgICAgaWYgKHRoaXMub25IaWRlV2luZG93KSB0aGlzLm9uSGlkZVdpbmRvdygpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5lZGl0YWJsZU9iamVjdC5yZXNldCgpO1xuICAgIHZhciB0YWJzID0gdGhpcy5rb1RhYnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRhYnNbaV0ucmVzZXQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFwcGx5KCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSB0cnVlO1xuICAgIHZhciBpc0ZpcnN0RXJyb3IgPSBmYWxzZTtcbiAgICB2YXIgdGFicyA9IHRoaXMua29UYWJzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdGFiUmVzID0gdGFic1tpXS5oYXNFcnJvcigpO1xuICAgICAgaWYgKHRhYlJlcykge1xuICAgICAgICB0YWJzW2ldLmV4cGFuZCgpO1xuICAgICAgICBpZiAoIWlzRmlyc3RFcnJvcikge1xuICAgICAgICAgIHRoaXMua29BY3RpdmVUYWIodGFic1tpXS5uYW1lKTtcbiAgICAgICAgICBpc0ZpcnN0RXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXMgPSAhdGFiUmVzICYmIHJlcztcbiAgICB9XG5cbiAgICBpZiAocmVzKSB7XG4gICAgICBpZiAoISF0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnN0YXJ0VW5kb1JlZG9UcmFuc2FjdGlvbigpO1xuICAgICAgfVxuICAgICAgdGhpcy5lZGl0YWJsZU9iamVjdC5hcHBseUFsbCgpO1xuICAgICAgaWYgKHRoaXMub25DaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VkKHRoaXMub2JqKTtcbiAgICAgIH1cbiAgICAgIGlmICghIXRoaXMub3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc3RvcFVuZG9SZWRvVHJhbnNhY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5UXVlc3Rpb25FZGl0b3JEZWZpbml0aW9uIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIHByb3BlcnRpZXM/OiBBcnJheTxzdHJpbmcgfCB7IG5hbWU6IHN0cmluZzsgdGl0bGU/OiBzdHJpbmc7IHRhYj86IHN0cmluZyB9PjtcbiAgdGFicz86IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5kZXg/OiBudW1iZXI7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgdmlzaWJsZT86IGJvb2xlYW47XG4gIH0+O1xufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25FZGl0b3JEZWZpbml0aW9uIHtcbiAgcHVibGljIHN0YXRpYyBkZWZpbml0aW9uOiB7XG4gICAgW2tleTogc3RyaW5nXTogSVN1cnZleVF1ZXN0aW9uRWRpdG9yRGVmaW5pdGlvbjtcbiAgfSA9IHtcbiAgICBxdWVzdGlvbjoge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICBcIm5hbWVcIixcbiAgICAgICAgXCJ0aXRsZVwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCIsXG4gICAgICAgIHsgbmFtZTogXCJ2aXNpYmxlXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImlzUmVxdWlyZWRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwicmVhZE9ubHlcIiB9LFxuICAgICAgICB7IG5hbWU6IFwidmlzaWJsZUlmXCIsIHRhYjogXCJsb2dpY1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJlbmFibGVJZlwiLCB0YWI6IFwibG9naWNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwicmVxdWlyZWRJZlwiLCB0YWI6IFwibG9naWNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiYmluZGluZ3NcIiwgdGFiOiBcImxvZ2ljXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImRlZmF1bHRWYWx1ZUV4cHJlc3Npb25cIiwgdGFiOiBcImxvZ2ljXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInBhZ2VcIiwgdGFiOiBcImxheW91dFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzdGFydFdpdGhOZXdMaW5lXCIsIHRhYjogXCJsYXlvdXRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiaGlkZU51bWJlclwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInN0YXRlXCIsIHRhYjogXCJsYXlvdXRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwidGl0bGVMb2NhdGlvblwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImRlc2NyaXB0aW9uTG9jYXRpb25cIiwgdGFiOiBcImxheW91dFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJpbmRlbnRcIiwgdGFiOiBcImxheW91dFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJ3aWR0aFwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm1pbldpZHRoXCIsIHRhYjogXCJsYXlvdXRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibWF4V2lkdGhcIiwgdGFiOiBcImxheW91dFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJ2YWx1ZU5hbWVcIiwgdGFiOiBcImRhdGFcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZGVmYXVsdFZhbHVlXCIsIHRhYjogXCJkYXRhXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImNvcnJlY3RBbnN3ZXJcIiwgdGFiOiBcImRhdGFcIiB9LFxuICAgICAgICB7IG5hbWU6IFwidXNlRGlzcGxheVZhbHVlc0luVGl0bGVcIiwgdGFiOiBcImRhdGFcIiB9LFxuICAgICAgICB7IG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHRcIiwgdGFiOiBcInZhbGlkYXRpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwidmFsaWRhdG9yc1wiLCB0YWI6IFwidmFsaWRhdGlvblwiIH0sXG4gICAgICBdLFxuICAgICAgdGFiczogW1xuICAgICAgICB7IG5hbWU6IFwibG9naWNcIiwgaW5kZXg6IDEwMCB9LFxuICAgICAgICB7IG5hbWU6IFwibGF5b3V0XCIsIGluZGV4OiAyMDAgfSxcbiAgICAgICAgeyBuYW1lOiBcImRhdGFcIiwgaW5kZXg6IDMwMCB9LFxuICAgICAgICB7IG5hbWU6IFwidmFsaWRhdGlvblwiLCBpbmRleDogNDAwIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgY29tbWVudDoge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICB7IG5hbWU6IFwicm93c1wiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImNvbHNcIiwgdGFiOiBcImxheW91dFwiIH0sXG4gICAgICAgIFwicGxhY2VIb2xkZXJcIixcbiAgICAgICAgeyBuYW1lOiBcIm1heExlbmd0aFwiLCB0YWI6IFwidmFsaWRhdGlvblwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJ0ZXh0VXBkYXRlTW9kZVwiLCB0YWI6IFwiZGF0YVwiIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgZmlsZToge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICBcImhhc0NvbW1lbnRcIixcbiAgICAgICAgXCJjb21tZW50VGV4dFwiLFxuICAgICAgICBcImFsbG93TXVsdGlwbGVcIixcbiAgICAgICAgXCJhbGxvd0ltYWdlc1ByZXZpZXdcIixcbiAgICAgICAgXCJhY2NlcHRlZFR5cGVzXCIsXG4gICAgICAgIHsgbmFtZTogXCJzaG93UHJldmlld1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzdG9yZURhdGFBc1RleHRcIiB9LFxuICAgICAgICBcIm1heFNpemVcIixcbiAgICAgICAgXCJpbWFnZUhlaWdodFwiLFxuICAgICAgICBcImltYWdlV2lkdGhcIixcbiAgICAgICAgXCJ3YWl0Rm9yVXBsb2FkXCIsXG4gICAgICBdLFxuICAgIH0sXG4gICAgaHRtbDoge1xuICAgICAgcHJvcGVydGllczogW1wiaHRtbFwiXSxcbiAgICB9LFxuICAgIG1hdHJpeGRyb3Bkb3duYmFzZToge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICBcImNlbGxUeXBlXCIsXG4gICAgICAgIFwib3B0aW9uc0NhcHRpb25cIixcbiAgICAgICAgXCJkZXRhaWxQYW5lbE1vZGVcIixcbiAgICAgICAgXCJkZXRhaWxQYW5lbFNob3dPbkFkZGluZ1wiLFxuICAgICAgICB7IG5hbWU6IFwic2hvd0hlYWRlclwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImNvbHVtbnNWaXNpYmxlSWZcIiwgdGFiOiBcImxvZ2ljXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImNvbHVtbkxheW91dFwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImhvcml6b250YWxTY3JvbGxcIiwgdGFiOiBcImxheW91dFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjb2x1bW5Db2xDb3VudFwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImNvbHVtbk1pbldpZHRoXCIsIHRhYjogXCJsYXlvdXRcIiB9LFxuICAgICAgXSxcbiAgICAgIHRhYnM6IFtcbiAgICAgICAgeyBuYW1lOiBcImNvbHVtbnNcIiwgaW5kZXg6IDEwIH0sXG4gICAgICAgIHsgbmFtZTogXCJyb3dzXCIsIGluZGV4OiAxMSB9LFxuICAgICAgICB7IG5hbWU6IFwiY2hvaWNlc1wiLCBpbmRleDogMTIgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBtYXRyaXhkeW5hbWljOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIFwiYWxsb3dBZGRSb3dzXCIsXG4gICAgICAgIFwiYWxsb3dSZW1vdmVSb3dzXCIsXG4gICAgICAgIFwicm93Q291bnRcIixcbiAgICAgICAgXCJtaW5Sb3dDb3VudFwiLFxuICAgICAgICBcIm1heFJvd0NvdW50XCIsXG4gICAgICAgIFwiYWRkUm93TG9jYXRpb25cIixcbiAgICAgICAgXCJhZGRSb3dUZXh0XCIsXG4gICAgICAgIFwicmVtb3ZlUm93VGV4dFwiLFxuICAgICAgICBcImNvbmZpcm1EZWxldGVcIixcbiAgICAgICAgXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgICAgICB7IG5hbWU6IFwiaGlkZUNvbHVtbnNJZkVtcHR5XCIsIHRhYjogXCJjb2x1bW5zXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImVtcHR5Um93c1RleHRcIiwgdGFiOiBcImNvbHVtbnNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZGVmYXVsdFJvd1ZhbHVlXCIsIHRhYjogXCJkYXRhXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImRlZmF1bHRWYWx1ZUZyb21MYXN0Um93XCIsIHRhYjogXCJkYXRhXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImtleU5hbWVcIiwgdGFiOiBcInZhbGlkYXRpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwia2V5RHVwbGljYXRpb25FcnJvclwiLCB0YWI6IFwidmFsaWRhdGlvblwiIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgbWF0cml4ZHJvcGRvd246IHtcbiAgICAgIHByb3BlcnRpZXM6IFtcbiAgICAgICAgXCJ0b3RhbFRleHRcIixcbiAgICAgICAgeyBuYW1lOiBcInJvd3NWaXNpYmxlSWZcIiwgdGFiOiBcImxvZ2ljXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInJvd1RpdGxlV2lkdGhcIiwgdGFiOiBcImxheW91dFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHRhYjogXCJ2YWxpZGF0aW9uXCIgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBtYXRyaXg6IHtcbiAgICAgIHByb3BlcnRpZXM6IFtcbiAgICAgICAgeyBuYW1lOiBcImlzQWxsUm93UmVxdWlyZWRcIiwgdGFiOiBcInZhbGlkYXRpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwic2hvd0hlYWRlclwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInJvd3NPcmRlclwiLCB0YWI6IFwicm93c1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjb2x1bW5zVmlzaWJsZUlmXCIsIHRhYjogXCJsb2dpY1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJyb3dzVmlzaWJsZUlmXCIsIHRhYjogXCJsb2dpY1wiIH0sXG4gICAgICBdLFxuICAgICAgdGFiczogW1xuICAgICAgICB7IG5hbWU6IFwiY29sdW1uc1wiLCBpbmRleDogMTAgfSxcbiAgICAgICAgeyBuYW1lOiBcInJvd3NcIiwgaW5kZXg6IDExIH0sXG4gICAgICAgIHsgbmFtZTogXCJjZWxsc1wiLCBpbmRleDogNTAwIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgbXVsdGlwbGV0ZXh0OiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIHsgbmFtZTogXCJjb2xDb3VudFwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIml0ZW1TaXplXCIsIHRhYjogXCJsYXlvdXRcIiB9LFxuICAgICAgXSxcbiAgICAgIHRhYnM6IFt7IG5hbWU6IFwiaXRlbXNcIiwgaW5kZXg6IDEwIH1dLFxuICAgIH0sXG4gICAgcmF0aW5nOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIFwiaGFzQ29tbWVudFwiLFxuICAgICAgICBcImNvbW1lbnRUZXh0XCIsXG4gICAgICAgIHsgbmFtZTogXCJyYXRlTWluXCIsIHRhYjogXCJyYXRlVmFsdWVzXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInJhdGVNYXhcIiwgdGFiOiBcInJhdGVWYWx1ZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwicmF0ZVN0ZXBcIiwgdGFiOiBcInJhdGVWYWx1ZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibWluUmF0ZURlc2NyaXB0aW9uXCIsIHRhYjogXCJyYXRlVmFsdWVzXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm1heFJhdGVEZXNjcmlwdGlvblwiLCB0YWI6IFwicmF0ZVZhbHVlc1wiIH0sXG4gICAgICBdLFxuICAgICAgdGFiczogW3sgbmFtZTogXCJyYXRlVmFsdWVzXCIsIGluZGV4OiAxMCB9XSxcbiAgICB9LFxuICAgIHNlbGVjdGJhc2U6IHtcbiAgICAgIHByb3BlcnRpZXM6IFtcbiAgICAgICAgXCJoYXNDb21tZW50XCIsXG4gICAgICAgIFwiY29tbWVudFRleHRcIixcbiAgICAgICAgeyBuYW1lOiBcImNob2ljZXNGcm9tUXVlc3Rpb25cIiwgdGFiOiBcImNob2ljZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGVcIiwgdGFiOiBcImNob2ljZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiY2hvaWNlc09yZGVyXCIsIHRhYjogXCJjaG9pY2VzXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImNvbENvdW50XCIsIHRhYjogXCJsYXlvdXRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiaGFzT3RoZXJcIiwgdGFiOiBcImNob2ljZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwib3RoZXJUZXh0XCIsIHRhYjogXCJjaG9pY2VzXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm90aGVyUGxhY2VIb2xkZXJcIiwgdGFiOiBcImNob2ljZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiaGFzTm9uZVwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJub25lVGV4dFwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJoaWRlSWZDaG9pY2VzRW1wdHlcIiwgdGFiOiBcImxvZ2ljXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImNob2ljZXNWaXNpYmxlSWZcIiwgdGFiOiBcImxvZ2ljXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImNob2ljZXNFbmFibGVJZlwiLCB0YWI6IFwibG9naWNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwib3RoZXJFcnJvclRleHRcIiwgdGFiOiBcInZhbGlkYXRpb25cIiB9LFxuICAgICAgXSxcbiAgICAgIHRhYnM6IFtcbiAgICAgICAgeyBuYW1lOiBcImNob2ljZXNcIiwgaW5kZXg6IDEwIH0sXG4gICAgICAgIHsgbmFtZTogXCJjaG9pY2VzQnlVcmxcIiwgaW5kZXg6IDExIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgY2hlY2tib3g6IHtcbiAgICAgIHByb3BlcnRpZXM6IFtcbiAgICAgICAgeyBuYW1lOiBcImhhc1NlbGVjdEFsbFwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzZWxlY3RBbGxUZXh0XCIsIHRhYjogXCJjaG9pY2VzXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm1heFNlbGVjdGVkQ2hvaWNlc1wiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgcmFkaW9ncm91cDoge1xuICAgICAgcHJvcGVydGllczogW3sgbmFtZTogXCJzaG93Q2xlYXJCdXR0b25cIiwgdGFiOiBcImNob2ljZXNcIiB9XSxcbiAgICB9LFxuICAgIGRyb3Bkb3duOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIFwib3B0aW9uc0NhcHRpb25cIixcbiAgICAgICAgeyBuYW1lOiBcImNob2ljZXNNaW5cIiwgdGFiOiBcImNob2ljZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiY2hvaWNlc01heFwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjaG9pY2VzU3RlcFwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzaG93T3B0aW9uc0NhcHRpb25cIiwgdGFiOiBcImNob2ljZXNcIiB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIGltYWdlcGlja2VyOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIFwibXVsdGlTZWxlY3RcIixcbiAgICAgICAgXCJzaG93TGFiZWxcIixcbiAgICAgICAgXCJjb250ZW50TW9kZVwiLFxuICAgICAgICBcImltYWdlRml0XCIsXG4gICAgICAgIFwiaW1hZ2VIZWlnaHRcIixcbiAgICAgICAgXCJpbWFnZVdpZHRoXCIsXG4gICAgICBdLFxuICAgIH0sXG4gICAgaW1hZ2U6IHtcbiAgICAgIHByb3BlcnRpZXM6IFtcbiAgICAgICAgXCJpbWFnZUxpbmtcIixcbiAgICAgICAgXCJjb250ZW50TW9kZVwiLFxuICAgICAgICBcImltYWdlRml0XCIsXG4gICAgICAgIFwiaW1hZ2VIZWlnaHRcIixcbiAgICAgICAgXCJpbWFnZVdpZHRoXCIsXG4gICAgICBdLFxuICAgIH0sXG4gICAgXCJpdGVtdmFsdWVbXUBjaG9pY2VzXCI6IHtcbiAgICAgIHByb3BlcnRpZXM6IFt7IG5hbWU6IFwidmlzaWJsZUlmXCIgfSwgeyBuYW1lOiBcImVuYWJsZUlmXCIgfV0sXG4gICAgICB0YWJzOiBbeyBuYW1lOiBcImdlbmVyYWxcIiB9XSxcbiAgICB9LFxuICAgIFwiaXRlbXZhbHVlW11Acm93c1wiOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbeyBuYW1lOiBcInZpc2libGVJZlwiIH1dLFxuICAgICAgdGFiczogW3sgbmFtZTogXCJnZW5lcmFsXCIgfV0sXG4gICAgfSxcbiAgICBcIml0ZW12YWx1ZVtdQGNvbHVtbnNcIjoge1xuICAgICAgcHJvcGVydGllczogW3sgbmFtZTogXCJ2aXNpYmxlSWZcIiB9XSxcbiAgICAgIHRhYnM6IFt7IG5hbWU6IFwiZ2VuZXJhbFwiIH1dLFxuICAgIH0sXG4gICAgdGV4dDoge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICBcImlucHV0VHlwZVwiLFxuICAgICAgICBcIm1pblwiLFxuICAgICAgICBcIm1heFwiLFxuICAgICAgICBcInN0ZXBcIixcbiAgICAgICAgXCJwbGFjZUhvbGRlclwiLFxuICAgICAgICBcImF1dG9Db21wbGV0ZVwiLFxuICAgICAgICBcImRhdGFMaXN0XCIsXG4gICAgICAgIHsgbmFtZTogXCJtaW5WYWx1ZUV4cHJlc3Npb25cIiwgdGFiOiBcImxvZ2ljXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm1heFZhbHVlRXhwcmVzc2lvblwiLCB0YWI6IFwibG9naWNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwic2l6ZVwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm1heExlbmd0aFwiLCB0YWI6IFwidmFsaWRhdGlvblwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJtaW5FcnJvclRleHRcIiwgdGFiOiBcInZhbGlkYXRpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwibWF4RXJyb3JUZXh0XCIsIHRhYjogXCJ2YWxpZGF0aW9uXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInRleHRVcGRhdGVNb2RlXCIsIHRhYjogXCJkYXRhXCIgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBib29sZWFuOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIFwibGFiZWxcIixcbiAgICAgICAgXCJsYWJlbFRydWVcIixcbiAgICAgICAgXCJsYWJlbEZhbHNlXCIsXG4gICAgICAgIFwic2hvd1RpdGxlXCIsXG4gICAgICAgIHsgbmFtZTogXCJ2YWx1ZVRydWVcIiwgdGFiOiBcImRhdGFcIiB9LFxuICAgICAgICB7IG5hbWU6IFwidmFsdWVGYWxzZVwiLCB0YWI6IFwiZGF0YVwiIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgZXhwcmVzc2lvbjoge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICBcImV4cHJlc3Npb25cIixcbiAgICAgICAgXCJjdXJyZW5jeVwiLFxuICAgICAgICBcImRpc3BsYXlTdHlsZVwiLFxuICAgICAgICBcImZvcm1hdFwiLFxuICAgICAgICBcIm1heGltdW1GcmFjdGlvbkRpZ2l0c1wiLFxuICAgICAgICBcIm1pbmltdW1GcmFjdGlvbkRpZ2l0c1wiLFxuICAgICAgICBcInVzZUdyb3VwaW5nXCIsXG4gICAgICBdLFxuICAgIH0sXG4gICAgbWF0cml4ZHJvcGRvd25jb2x1bW46IHtcbiAgICAgIHByb3BlcnRpZXM6IFtcImlzUmVxdWlyZWRcIiwgXCJjZWxsVHlwZVwiLCBcIm5hbWVcIiwgXCJ0aXRsZVwiXSxcbiAgICB9LFxuICAgIFwibWF0cml4ZHJvcGRvd25jb2x1bW5AZGVmYXVsdFwiOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIFwibmFtZVwiLFxuICAgICAgICBcInRpdGxlXCIsXG4gICAgICAgIFwiaXNSZXF1aXJlZFwiLFxuICAgICAgICBcImlzVW5pcXVlXCIsXG4gICAgICAgIFwicmVhZE9ubHlcIixcbiAgICAgICAgXCJzaG93SW5NdWx0aXBsZUNvbHVtbnNcIixcbiAgICAgICAgXCJ3aWR0aFwiLFxuICAgICAgICB7IG5hbWU6IFwidmlzaWJsZUlmXCIsIHRhYjogXCJsb2dpY1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJlbmFibGVJZlwiLCB0YWI6IFwibG9naWNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwicmVxdWlyZWRJZlwiLCB0YWI6IFwibG9naWNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwidG90YWxUeXBlXCIsIHRhYjogXCJ0b3RhbHNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwidG90YWxEaXNwbGF5U3R5bGVcIiwgdGFiOiBcInRvdGFsc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJ0b3RhbEN1cnJlbmN5XCIsIHRhYjogXCJ0b3RhbHNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwidG90YWxGb3JtYXRcIiwgdGFiOiBcInRvdGFsc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJ0b3RhbEV4cHJlc3Npb25cIiwgdGFiOiBcInRvdGFsc1wiIH0sXG4gICAgICBdLFxuICAgICAgdGFiczogW1xuICAgICAgICB7IG5hbWU6IFwiZ2VuZXJhbFwiLCBpbmRleDogNSB9LFxuICAgICAgICB7IG5hbWU6IFwibG9naWNcIiwgaW5kZXg6IDIwIH0sXG4gICAgICAgIHsgbmFtZTogXCJ0b3RhbHNcIiwgaW5kZXg6IDQwIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgXCJtYXRyaXhkcm9wZG93bmNvbHVtbkBjaGVja2JveFwiOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIHsgbmFtZTogXCJoYXNPdGhlclwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJvdGhlclRleHRcIiwgdGFiOiBcImNob2ljZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiY2hvaWNlc09yZGVyXCIsIHRhYjogXCJjaG9pY2VzXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImNvbENvdW50XCIsIHRhYjogXCJjaG9pY2VzXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImhhc1NlbGVjdEFsbFwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJoYXNOb25lXCIsIHRhYjogXCJjaG9pY2VzXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm5vbmVUZXh0XCIsIHRhYjogXCJjaG9pY2VzXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm1heFNlbGVjdGVkQ2hvaWNlc1wiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICBdLFxuICAgICAgdGFiczogW1xuICAgICAgICB7IG5hbWU6IFwiY2hvaWNlc1wiLCBpbmRleDogMTAgfSxcbiAgICAgICAgeyBuYW1lOiBcImNob2ljZXNCeVVybFwiLCBpbmRleDogMTEgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBcIm1hdHJpeGRyb3Bkb3duY29sdW1uQHJhZGlvZ3JvdXBcIjoge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICB7IG5hbWU6IFwiaGFzT3RoZXJcIiwgdGFiOiBcImNob2ljZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwib3RoZXJUZXh0XCIsIHRhYjogXCJjaG9pY2VzXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImNob2ljZXNPcmRlclwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjb2xDb3VudFwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJoYXNTZWxlY3RBbGxcIiwgdGFiOiBcImNob2ljZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiaGFzTm9uZVwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJub25lVGV4dFwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICBdLFxuICAgICAgdGFiczogW1xuICAgICAgICB7IG5hbWU6IFwiY2hvaWNlc1wiLCBpbmRleDogMTAgfSxcbiAgICAgICAgeyBuYW1lOiBcImNob2ljZXNCeVVybFwiLCBpbmRleDogMTEgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBcIm1hdHJpeGRyb3Bkb3duY29sdW1uQGRyb3Bkb3duXCI6IHtcbiAgICAgIHByb3BlcnRpZXM6IFtcbiAgICAgICAgeyBuYW1lOiBcImhhc090aGVyXCIsIHRhYjogXCJjaG9pY2VzXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm90aGVyVGV4dFwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjaG9pY2VzT3JkZXJcIiwgdGFiOiBcImNob2ljZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgdGFiOiBcImNob2ljZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiaGFzTm9uZVwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJub25lVGV4dFwiLCB0YWI6IFwiY2hvaWNlc1wiIH0sXG4gICAgICBdLFxuICAgICAgdGFiczogW1xuICAgICAgICB7IG5hbWU6IFwiY2hvaWNlc1wiLCBpbmRleDogMTAgfSxcbiAgICAgICAgeyBuYW1lOiBcImNob2ljZXNCeVVybFwiLCBpbmRleDogMTEgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBcIm1hdHJpeGRyb3Bkb3duY29sdW1uQHRleHRcIjoge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICBcImlucHV0VHlwZVwiLFxuICAgICAgICBcIm1pblwiLFxuICAgICAgICBcIm1heFwiLFxuICAgICAgICBcInN0ZXBcIixcbiAgICAgICAgXCJwbGFjZUhvbGRlclwiLFxuICAgICAgICBcIm1heExlbmd0aFwiLFxuICAgICAgXSxcbiAgICAgIHRhYnM6IFt7IG5hbWU6IFwidmFsaWRhdG9yc1wiLCBpbmRleDogMTAgfV0sXG4gICAgfSxcbiAgICBcIm1hdHJpeGRyb3Bkb3duY29sdW1uQGNvbW1lbnRcIjoge1xuICAgICAgcHJvcGVydGllczogW1wicm93c1wiLCBcInBsYWNlSG9sZGVyXCIsIFwibWF4TGVuZ3RoXCJdLFxuICAgICAgdGFiczogW3sgbmFtZTogXCJ2YWxpZGF0b3JzXCIsIGluZGV4OiAxMCB9XSxcbiAgICB9LFxuICAgIFwibWF0cml4ZHJvcGRvd25jb2x1bW5AYm9vbGVhblwiOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIFwiZGVmYXVsdFZhbHVlXCIsXG4gICAgICAgIFwibGFiZWxUcnVlXCIsXG4gICAgICAgIFwibGFiZWxGYWxzZVwiLFxuICAgICAgICBcInZhbHVlVHJ1ZVwiLFxuICAgICAgICBcInZhbHVlRmFsc2VcIixcbiAgICAgIF0sXG4gICAgfSxcbiAgICBcIm1hdHJpeGRyb3Bkb3duY29sdW1uQGV4cHJlc3Npb25cIjoge1xuICAgICAgcHJvcGVydGllczogW1wiZGlzcGxheVN0eWxlXCIsIFwiY3VycmVuY3lcIl0sXG4gICAgICB0YWJzOiBbeyBuYW1lOiBcImV4cHJlc3Npb25cIiwgaW5kZXg6IDEwIH1dLFxuICAgIH0sXG4gICAgXCJtYXRyaXhkcm9wZG93bmNvbHVtbkByYXRpbmdcIjoge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICBcInJhdGVWYWx1ZXNcIixcbiAgICAgICAgeyBuYW1lOiBcInJhdGVNaW5cIiwgdGFiOiBcInJhdGVWYWx1ZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwicmF0ZU1heFwiLCB0YWI6IFwicmF0ZVZhbHVlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJyYXRlU3RlcFwiLCB0YWI6IFwicmF0ZVZhbHVlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJtaW5SYXRlRGVzY3JpcHRpb25cIiwgdGFiOiBcInJhdGVWYWx1ZXNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsIHRhYjogXCJyYXRlVmFsdWVzXCIgfSxcbiAgICAgIF0sXG4gICAgICB0YWJzOiBbeyBuYW1lOiBcInJhdGVWYWx1ZXNcIiwgaW5kZXg6IDUgfV0sXG4gICAgfSxcbiAgICBtdWx0aXBsZXRleHRpdGVtOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIFwiaW5wdXRUeXBlXCIsXG4gICAgICAgIFwibmFtZVwiLFxuICAgICAgICBcInRpdGxlXCIsXG4gICAgICAgIFwiaXNSZXF1aXJlZFwiLFxuICAgICAgICBcIm1heExlbmd0aFwiLFxuICAgICAgICBcInNpemVcIixcbiAgICAgICAgXCJwbGFjZUhvbGRlclwiLFxuICAgICAgICBcInJlcXVpcmVkRXJyb3JUZXh0XCIsXG4gICAgICAgIFwidmFsaWRhdG9yc1wiLFxuICAgICAgXSxcbiAgICB9LFxuICAgIFwibXVsdGlwbGV0ZXh0QGl0ZW1zXCI6IHtcbiAgICAgIHByb3BlcnRpZXM6IFtcImlzUmVxdWlyZWRcIiwgXCJuYW1lXCIsIFwidGl0bGVcIl0sXG4gICAgfSxcbiAgICBjYWxjdWxhdGVkdmFsdWU6IHtcbiAgICAgIHByb3BlcnRpZXM6IFtcIm5hbWVcIiwgXCJleHByZXNzaW9uXCIsIFwiaW5jbHVkZUludG9SZXN1bHRcIl0sXG4gICAgfSxcbiAgICBcImNhbGN1bGF0ZWR2YWx1ZUBpdGVtc1wiOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXCJuYW1lXCIsIFwiZXhwcmVzc2lvblwiXSxcbiAgICB9LFxuICAgIHBhbmVsZHluYW1pYzoge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICBcInJlbmRlck1vZGVcIixcbiAgICAgICAgXCJwYW5lbENvdW50XCIsXG4gICAgICAgIFwibWluUGFuZWxDb3VudFwiLFxuICAgICAgICBcIm1heFBhbmVsQ291bnRcIixcbiAgICAgICAgXCJwYW5lbHNTdGF0ZVwiLFxuICAgICAgICB7IG5hbWU6IFwiYWxsb3dBZGRQYW5lbFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJhbGxvd1JlbW92ZVBhbmVsXCIgfSxcbiAgICAgICAgXCJwYW5lbEFkZFRleHRcIixcbiAgICAgICAgXCJwYW5lbFJlbW92ZVRleHRcIixcbiAgICAgICAgXCJ0ZW1wbGF0ZVRpdGxlXCIsXG4gICAgICAgIFwidGVtcGxhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgICBcImNvbmZpcm1EZWxldGVcIixcbiAgICAgICAgXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgICAgICBcInBhbmVsUHJldlRleHRcIixcbiAgICAgICAgXCJwYW5lbE5leHRUZXh0XCIsXG4gICAgICAgIFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLFxuICAgICAgICBcInNob3dSYW5nZUluUHJvZ3Jlc3NcIixcbiAgICAgICAgeyBuYW1lOiBcImRlZmF1bHRQYW5lbFZhbHVlXCIsIHRhYjogXCJkYXRhXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWxcIiwgdGFiOiBcImRhdGFcIiB9LFxuICAgICAgICB7IG5hbWU6IFwidGVtcGxhdGVUaXRsZUxvY2F0aW9uXCIsIHRhYjogXCJsYXlvdXRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwicGFuZWxSZW1vdmVCdXR0b25Mb2NhdGlvblwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImtleU5hbWVcIiwgdGFiOiBcInZhbGlkYXRpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwia2V5RHVwbGljYXRpb25FcnJvclwiLCB0YWI6IFwidmFsaWRhdGlvblwiIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgcGFuZWxiYXNlOiB7XG4gICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgIFwibmFtZVwiLFxuICAgICAgICBcInRpdGxlXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIixcbiAgICAgICAgXCJ2aXNpYmxlXCIsXG4gICAgICAgIFwicmVhZE9ubHlcIixcbiAgICAgICAgeyBuYW1lOiBcInZpc2libGVJZlwiLCB0YWI6IFwibG9naWNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZW5hYmxlSWZcIiwgdGFiOiBcImxvZ2ljXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInJlcXVpcmVkSWZcIiwgdGFiOiBcImxvZ2ljXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgIF0sXG4gICAgICB0YWJzOiBbXG4gICAgICAgIHsgbmFtZTogXCJsb2dpY1wiLCBpbmRleDogMTAwIH0sXG4gICAgICAgIHsgbmFtZTogXCJsYXlvdXRcIiwgaW5kZXg6IDIwMCB9LFxuICAgICAgICB7IG5hbWU6IFwiZGF0YVwiLCBpbmRleDogMzAwIH0sXG4gICAgICAgIHsgbmFtZTogXCJ2YWxpZGF0aW9uXCIsIGluZGV4OiA0MDAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBwYW5lbDoge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICBcImlzUmVxdWlyZWRcIixcbiAgICAgICAgeyBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHRhYjogXCJ2YWxpZGF0aW9uXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInBhZ2VcIiwgdGFiOiBcImxheW91dFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzdGFydFdpdGhOZXdMaW5lXCIsIHRhYjogXCJsYXlvdXRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwic3RhdGVcIiwgdGFiOiBcImxheW91dFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJpbmRlbnRcIiwgdGFiOiBcImxheW91dFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJpbm5lckluZGVudFwiLCB0YWI6IFwibGF5b3V0XCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIndpZHRoXCIsIHRhYjogXCJsYXlvdXRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwic2hvd051bWJlclwiLCB0YWI6IFwibnVtYmVyaW5nXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInNob3dRdWVzdGlvbk51bWJlcnNcIiwgdGFiOiBcIm51bWJlcmluZ1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJxdWVzdGlvblN0YXJ0SW5kZXhcIiwgdGFiOiBcIm51bWJlcmluZ1wiIH0sXG4gICAgICBdLFxuICAgICAgdGFiczogW3sgbmFtZTogXCJudW1iZXJpbmdcIiwgaW5kZXg6IDM1MCB9XSxcbiAgICB9LFxuICAgIHBhZ2U6IHtcbiAgICAgIHByb3BlcnRpZXM6IFtcbiAgICAgICAgXCJuYXZpZ2F0aW9uVGl0bGVcIixcbiAgICAgICAgXCJuYXZpZ2F0aW9uRGVzY3JpcHRpb25cIixcbiAgICAgICAgXCJtYXhUaW1lVG9GaW5pc2hcIixcbiAgICAgICAgeyBuYW1lOiBcInF1ZXN0aW9uc09yZGVyXCIsIHRhYjogXCJsYXlvdXRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIsIHRhYjogXCJsYXlvdXRcIiB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHN1cnZleToge1xuICAgICAgcHJvcGVydGllczogW1xuICAgICAgICBcInRpdGxlXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIixcbiAgICAgICAgXCJzaG93VGl0bGVcIixcbiAgICAgICAgXCJsb2NhbGVcIixcbiAgICAgICAgXCJtb2RlXCIsXG4gICAgICAgIFwiY29va2llTmFtZVwiLFxuXG4gICAgICAgIHsgbmFtZTogXCJzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXCIsIHRhYjogXCJuYXZpZ2F0aW9uXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInBhZ2VQcmV2VGV4dFwiLCB0YWI6IFwibmF2aWdhdGlvblwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJwYWdlTmV4dFRleHRcIiwgdGFiOiBcIm5hdmlnYXRpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwiY29tcGxldGVUZXh0XCIsIHRhYjogXCJuYXZpZ2F0aW9uXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInByZXZpZXdUZXh0XCIsIHRhYjogXCJuYXZpZ2F0aW9uXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImVkaXRUZXh0XCIsIHRhYjogXCJuYXZpZ2F0aW9uXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInN0YXJ0U3VydmV5VGV4dFwiLCB0YWI6IFwibmF2aWdhdGlvblwiIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInNob3dOYXZpZ2F0aW9uQnV0dG9uc1wiLFxuICAgICAgICAgIHRhYjogXCJuYXZpZ2F0aW9uXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHsgbmFtZTogXCJzaG93UHJldkJ1dHRvblwiLCB0YWI6IFwibmF2aWdhdGlvblwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJmaXJzdFBhZ2VJc1N0YXJ0ZWRcIiwgdGFiOiBcIm5hdmlnYXRpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwiZ29OZXh0UGFnZUF1dG9tYXRpY1wiLCB0YWI6IFwibmF2aWdhdGlvblwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzaG93UHJvZ3Jlc3NCYXJcIiwgdGFiOiBcIm5hdmlnYXRpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwicHJvZ3Jlc3NCYXJUeXBlXCIsIHRhYjogXCJuYXZpZ2F0aW9uXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInF1ZXN0aW9uc09uUGFnZU1vZGVcIiwgdGFiOiBcIm5hdmlnYXRpb25cIiB9LFxuXG4gICAgICAgIHsgbmFtZTogXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIiwgdGFiOiBcInF1ZXN0aW9uXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvblwiLCB0YWI6IFwicXVlc3Rpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCB0YWI6IFwicXVlc3Rpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwicXVlc3Rpb25UaXRsZVBhdHRlcm5cIiwgdGFiOiBcInF1ZXN0aW9uXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInJlcXVpcmVkVGV4dFwiLCB0YWI6IFwicXVlc3Rpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwicXVlc3Rpb25TdGFydEluZGV4XCIsIHRhYjogXCJxdWVzdGlvblwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIiwgdGFiOiBcInF1ZXN0aW9uXCIgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljXCIsXG4gICAgICAgICAgdGFiOiBcInF1ZXN0aW9uXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHsgbmFtZTogXCJxdWVzdGlvbnNPcmRlclwiLCB0YWI6IFwicXVlc3Rpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwibWF4VGV4dExlbmd0aFwiLCB0YWI6IFwicXVlc3Rpb25cIiB9LFxuICAgICAgICB7IG5hbWU6IFwibWF4T3RoZXJzTGVuZ3RoXCIsIHRhYjogXCJxdWVzdGlvblwiIH0sXG5cbiAgICAgICAgeyBuYW1lOiBcInNob3dQYWdlVGl0bGVzXCIsIHRhYjogXCJwYWdlc1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzaG93UGFnZU51bWJlcnNcIiwgdGFiOiBcInBhZ2VzXCIgfSxcblxuICAgICAgICB7IG5hbWU6IFwiY2FsY3VsYXRlZFZhbHVlc1wiLCB0YWI6IFwibG9naWNcIiB9LFxuICAgICAgICB7IG5hbWU6IFwidHJpZ2dlcnNcIiwgdGFiOiBcImxvZ2ljXCIgfSxcblxuICAgICAgICB7IG5hbWU6IFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIiwgdGFiOiBcImRhdGFcIiB9LFxuICAgICAgICB7IG5hbWU6IFwidGV4dFVwZGF0ZU1vZGVcIiwgdGFiOiBcImRhdGFcIiB9LFxuICAgICAgICB7IG5hbWU6IFwic2VuZFJlc3VsdE9uUGFnZU5leHRcIiwgdGFiOiBcImRhdGFcIiB9LFxuICAgICAgICB7IG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgdGFiOiBcImRhdGFcIiB9LFxuXG4gICAgICAgIHsgbmFtZTogXCJmb2N1c09uRmlyc3RFcnJvclwiLCB0YWI6IFwidmFsaWRhdGlvblwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjaGVja0Vycm9yc01vZGVcIiwgdGFiOiBcInZhbGlkYXRpb25cIiB9LFxuXG4gICAgICAgIHsgbmFtZTogXCJuYXZpZ2F0ZVRvVXJsXCIsIHRhYjogXCJzaG93T25Db21wbGV0ZWRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwic2hvd0NvbXBsZXRlZFBhZ2VcIiwgdGFiOiBcInNob3dPbkNvbXBsZXRlZFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjb21wbGV0ZWRIdG1sXCIsIHRhYjogXCJzaG93T25Db21wbGV0ZWRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uXCIsIHRhYjogXCJzaG93T25Db21wbGV0ZWRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwiY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uXCIsIHRhYjogXCJzaG93T25Db21wbGV0ZWRcIiB9LFxuICAgICAgICB7IG5hbWU6IFwibG9hZGluZ0h0bWxcIiwgdGFiOiBcInNob3dPbkNvbXBsZXRlZFwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsIHRhYjogXCJzaG93T25Db21wbGV0ZWRcIiB9LFxuXG4gICAgICAgIHsgbmFtZTogXCJtYXhUaW1lVG9GaW5pc2hcIiwgdGFiOiBcInRpbWVyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcIm1heFRpbWVUb0ZpbmlzaFBhZ2VcIiwgdGFiOiBcInRpbWVyXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcInNob3dUaW1lclBhbmVsXCIsIHRhYjogXCJ0aW1lclwiIH0sXG4gICAgICAgIHsgbmFtZTogXCJzaG93VGltZXJQYW5lbE1vZGVcIiwgdGFiOiBcInRpbWVyXCIgfSxcblxuICAgICAgICB7IG5hbWU6IFwibG9nb1wiLCB0YWI6IFwibG9nb1wiIH0sXG4gICAgICAgIHsgbmFtZTogXCJsb2dvUG9zaXRpb25cIiwgdGFiOiBcImxvZ29cIiB9LFxuICAgICAgICB7IG5hbWU6IFwibG9nb1dpZHRoXCIsIHRhYjogXCJsb2dvXCIgfSxcbiAgICAgICAgeyBuYW1lOiBcImxvZ29IZWlnaHRcIiwgdGFiOiBcImxvZ29cIiB9LFxuICAgICAgICB7IG5hbWU6IFwibG9nb0ZpdFwiLCB0YWI6IFwibG9nb1wiIH0sXG4gICAgICBdLFxuICAgICAgdGFiczogW1xuICAgICAgICB7IG5hbWU6IFwibmF2aWdhdGlvblwiLCBpbmRleDogMTAwIH0sXG4gICAgICAgIHsgbmFtZTogXCJxdWVzdGlvblwiLCBpbmRleDogMjAwIH0sXG4gICAgICAgIHsgbmFtZTogXCJwYWdlc1wiLCBpbmRleDogMjUwIH0sXG4gICAgICAgIHsgbmFtZTogXCJsb2dpY1wiLCBpbmRleDogMzAwIH0sXG4gICAgICAgIHsgbmFtZTogXCJkYXRhXCIsIGluZGV4OiA0MDAgfSxcbiAgICAgICAgeyBuYW1lOiBcInZhbGlkYXRpb25cIiwgaW5kZXg6IDUwMCB9LFxuICAgICAgICB7IG5hbWU6IFwic2hvd09uQ29tcGxldGVkXCIsIGluZGV4OiA2MDAgfSxcbiAgICAgICAgeyBuYW1lOiBcInRpbWVyXCIsIGluZGV4OiA3MDAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBcInBhZ2VAc3VydmV5XCI6IHtcbiAgICAgIHByb3BlcnRpZXM6IFtcIm5hbWVcIiwgXCJ0aXRsZVwiXSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IFN1cnZleUhlbHBlciwgT2JqVHlwZSB9IGZyb20gXCIuL3N1cnZleUhlbHBlclwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ29udmVydGVyIHtcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0SW5mbyA9IHt9O1xuICBwdWJsaWMgc3RhdGljIGFkZENvbnZlcnRJbmZvKGNsYXNzTmFtZTogc3RyaW5nLCBjb252ZXJ0VG9DbGFzc05hbWU6IHN0cmluZykge1xuICAgIGlmICghUXVlc3Rpb25Db252ZXJ0ZXIuY29udmVydEluZm9bY2xhc3NOYW1lXSkge1xuICAgICAgUXVlc3Rpb25Db252ZXJ0ZXIuY29udmVydEluZm9bY2xhc3NOYW1lXSA9IFtdO1xuICAgIH1cbiAgICBRdWVzdGlvbkNvbnZlcnRlci5jb252ZXJ0SW5mb1tjbGFzc05hbWVdLnB1c2goY29udmVydFRvQ2xhc3NOYW1lKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldENvbnZlcnRUb0NsYXNzZXMoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgYXZhaWxhYmxlVHlwZXM6IEFycmF5PHN0cmluZz4gPSBudWxsXG4gICk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBRdWVzdGlvbkNvbnZlcnRlci5jb252ZXJ0SW5mb1tjbGFzc05hbWVdO1xuICAgIGlmICghcmVzKSByZXR1cm4gW107XG4gICAgaWYgKFxuICAgICAgISFhdmFpbGFibGVUeXBlcyAmJlxuICAgICAgQXJyYXkuaXNBcnJheShhdmFpbGFibGVUeXBlcykgJiZcbiAgICAgIGF2YWlsYWJsZVR5cGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGZvciAodmFyIGkgPSByZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGF2YWlsYWJsZVR5cGVzLmluZGV4T2YocmVzW2ldKSA8IDApIHtcbiAgICAgICAgICByZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhIXJlcyA/IHJlcyA6IFtdO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydE9iamVjdChcbiAgICBvYmo6IFN1cnZleS5RdWVzdGlvbixcbiAgICBjb252ZXJ0VG9DbGFzczogc3RyaW5nXG4gICk6IFN1cnZleS5RdWVzdGlvbiB7XG4gICAgaWYgKCFvYmogfHwgIW9iai5wYXJlbnQgfHwgY29udmVydFRvQ2xhc3MgPT0gb2JqLmdldFR5cGUoKSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG5ld1F1ZXN0aW9uID0gU3VydmV5LlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoY29udmVydFRvQ2xhc3MpO1xuICAgIG5ld1F1ZXN0aW9uLm5hbWUgPSBvYmoubmFtZTtcbiAgICBuZXdRdWVzdGlvbi5mcm9tSlNPTihvYmoudG9KU09OKCkpO1xuICAgIHZhciBwYW5lbCA9IDxTdXJ2ZXkuUGFuZWxNb2RlbEJhc2U+b2JqLnBhcmVudDtcbiAgICB2YXIgaW5kZXggPSBwYW5lbC5lbGVtZW50cy5pbmRleE9mKG9iaik7XG4gICAgcGFuZWwucmVtb3ZlRWxlbWVudChvYmopO1xuICAgIHBhbmVsLmFkZEVsZW1lbnQobmV3UXVlc3Rpb24sIGluZGV4KTtcbiAgICBuZXdRdWVzdGlvbi5vblN1cnZleUxvYWQoKTtcbiAgICByZXR1cm4gPFN1cnZleS5RdWVzdGlvbj5uZXdRdWVzdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVEZWZhdWx0UXVlc3Rpb25Db252ZXJ0ZXJJdGVtcygpIHtcbiAgdmFyIGNsYXNzZXMgPSBTdXJ2ZXkuU2VyaWFsaXplci5nZXRDaGlsZHJlbkNsYXNzZXMoXCJzZWxlY3RiYXNlXCIsIHRydWUpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNsYXNzZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChpID09IGopIGNvbnRpbnVlO1xuICAgICAgUXVlc3Rpb25Db252ZXJ0ZXIuYWRkQ29udmVydEluZm8oY2xhc3Nlc1tpXS5uYW1lLCBjbGFzc2VzW2pdLm5hbWUpO1xuICAgIH1cbiAgfVxuICBRdWVzdGlvbkNvbnZlcnRlci5hZGRDb252ZXJ0SW5mbyhcInRleHRcIiwgXCJjb21tZW50XCIpO1xuICBRdWVzdGlvbkNvbnZlcnRlci5hZGRDb252ZXJ0SW5mbyhcImNvbW1lbnRcIiwgXCJ0ZXh0XCIpO1xufVxuXG5jcmVhdGVEZWZhdWx0UXVlc3Rpb25Db252ZXJ0ZXJJdGVtcygpO1xuIiwiaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcblxuZXhwb3J0IHZhciBzZXR0aW5ncyA9IHtcbiAgdHJhc2xhdGlvbjoge1xuICAgIHNvcnRCeU5hbWU6IHRydWUsXG4gIH0sXG4gIG9wZXJhdG9yczoge1xuICAgIGVtcHR5OiBbXSxcbiAgICBub3RlbXB0eTogW10sXG4gICAgZXF1YWw6IFtcIiFmaWxlXCJdLFxuICAgIG5vdGVxdWFsOiBbXCIhZmlsZVwiXSxcbiAgICBjb250YWluczogW1wiY2hlY2tib3hcIiwgXCJ0ZXh0XCIsIFwiY29tbWVudFwiXSxcbiAgICBub3Rjb250YWluczogW1wiY2hlY2tib3hcIiwgXCJ0ZXh0XCIsIFwiY29tbWVudFwiXSxcbiAgICBhbnlvZjogW1wic2VsZWN0YmFzZVwiXSxcbiAgICBhbGxvZjogW1wiY2hlY2tib3hcIl0sXG4gICAgZ3JlYXRlcjogW1wiIWNoZWNrYm94XCIsIFwiIWltYWdlcGlja2VyXCIsIFwiIWJvb2xlYW5cIiwgXCIhZmlsZVwiXSxcbiAgICBsZXNzOiBbXCIhY2hlY2tib3hcIiwgXCIhaW1hZ2VwaWNrZXJcIiwgXCIhYm9vbGVhblwiLCBcIiFmaWxlXCJdLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBbXCIhY2hlY2tib3hcIiwgXCIhaW1hZ2VwaWNrZXJcIiwgXCIhYm9vbGVhblwiLCBcIiFmaWxlXCJdLFxuICAgIGxlc3NvcmVxdWFsOiBbXCIhY2hlY2tib3hcIiwgXCIhaW1hZ2VwaWNrZXJcIiwgXCIhYm9vbGVhblwiLCBcIiFmaWxlXCJdLFxuICB9LFxuICAvL1RPRE8gYWRkIG1heGltdW1Db2x1bW5Db3VudFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5Q3JlYXRvck9wdGlvbnMge1xuICBhbHdheVNhdmVUZXh0SW5Qcm9wZXJ0eUVkaXRvcnM6IGJvb2xlYW47XG4gIHJlYWRPbmx5OiBib29sZWFuO1xuICBtYXhMb2dpY0l0ZW1zSW5Db25kaXRpb246IG51bWJlcjtcbiAgc2hvd1RpdGxlc0luRXhwcmVzc2lvbnM6IGJvb2xlYW47XG4gIGFsbG93RWRpdEV4cHJlc3Npb25zSW5UZXh0RWRpdG9yOiBib29sZWFuO1xuICBtYXhpbXVtQ29sdW1uc0NvdW50OiBudW1iZXI7XG4gIGdldE9iamVjdERpc3BsYXlOYW1lKFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAgZGlzcGxheU5hbWU6IHN0cmluZ1xuICApOiBzdHJpbmc7XG4gIG9uQ2FuU2hvd1Byb3BlcnR5Q2FsbGJhY2soXG4gICAgb2JqZWN0OiBhbnksXG4gICAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgc2hvd01vZGU6IHN0cmluZyxcbiAgICBwYXJlbnRPYmo6IGFueSxcbiAgICBwYXJlbnRQcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuICApOiBib29sZWFuO1xuICBvbkNhbkRlbGV0ZUl0ZW1DYWxsYmFjayhcbiAgICBvYmplY3Q6IGFueSxcbiAgICBpdGVtOiBTdXJ2ZXkuQmFzZSxcbiAgICBhbGxvd0RlbGV0ZTogYm9vbGVhblxuICApOiBib29sZWFuO1xuICBvbkNvbGxlY3Rpb25JdGVtRGVsZXRpbmdDYWxsYmFjayhcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIGNvbGxlY3Rpb246IEFycmF5PFN1cnZleS5CYXNlPixcbiAgICBpdGVtOiBTdXJ2ZXkuQmFzZVxuICApOiBib29sZWFuO1xuICBvbkl0ZW1WYWx1ZUFkZGVkQ2FsbGJhY2soXG4gICAgb2JqOiBTdXJ2ZXkuQmFzZSxcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBpdGVtVmFsdWU6IFN1cnZleS5JdGVtVmFsdWUsXG4gICAgaXRlbVZhbHVlczogQXJyYXk8U3VydmV5Lkl0ZW1WYWx1ZT5cbiAgKTtcbiAgb25NYXRyaXhEcm9wZG93bkNvbHVtbkFkZGVkQ2FsbGJhY2soXG4gICAgbWF0cml4OiBTdXJ2ZXkuUXVlc3Rpb24sXG4gICAgY29sdW1uOiBTdXJ2ZXkuTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgY29sdW1uczogQXJyYXk8U3VydmV5Lk1hdHJpeERyb3Bkb3duQ29sdW1uPlxuICApO1xuICBvblNldFByb3BlcnR5RWRpdG9yT3B0aW9uc0NhbGxiYWNrKFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgZWRpdG9yT3B0aW9uczogYW55XG4gICk7XG4gIG9uR2V0RXJyb3JUZXh0T25WYWxpZGF0aW9uQ2FsbGJhY2soXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgb2JqOiBTdXJ2ZXkuQmFzZSxcbiAgICB2YWx1ZTogYW55XG4gICk6IHN0cmluZztcbiAgb25WYWx1ZUNoYW5naW5nQ2FsbGJhY2sob3B0aW9uczogYW55KTtcbiAgb25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBvYmo6IGFueSxcbiAgICBuZXdWYWx1ZTogYW55XG4gICk7XG4gIG9uR2V0RWxlbWVudEVkaXRvclRpdGxlQ2FsbGJhY2sob2JqOiBTdXJ2ZXkuQmFzZSwgdGl0bGU6IHN0cmluZyk6IHN0cmluZztcbiAgc3RhcnRVbmRvUmVkb1RyYW5zYWN0aW9uKCk7XG4gIHN0b3BVbmRvUmVkb1RyYW5zYWN0aW9uKCk7XG4gIGNyZWF0ZVN1cnZleShcbiAgICBqc29uOiBhbnksXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAgc3VydmV5VHlwZT86IG5ldyAoanNvbjogYW55KSA9PiBTdXJ2ZXkuU3VydmV5XG4gICk7XG4gIG9uQ29uZGl0aW9uUXVlc3Rpb25zR2V0TGlzdENhbGxiYWNrKFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgZWRpdG9yOiBhbnksXG4gICAgbGlzdDogYW55W11cbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIEVtcHR5U3VydmV5Q3JlYXRvck9wdGlvbnMgaW1wbGVtZW50cyBJU3VydmV5Q3JlYXRvck9wdGlvbnMge1xuICBhbHdheVNhdmVUZXh0SW5Qcm9wZXJ0eUVkaXRvcnM6IGJvb2xlYW47XG4gIHJlYWRPbmx5OiBib29sZWFuO1xuICBtYXhMb2dpY0l0ZW1zSW5Db25kaXRpb246IG51bWJlcjtcbiAgc2hvd1RpdGxlc0luRXhwcmVzc2lvbnM6IGJvb2xlYW47XG4gIGFsbG93RWRpdEV4cHJlc3Npb25zSW5UZXh0RWRpdG9yOiBib29sZWFuO1xuICBtYXhpbXVtQ29sdW1uc0NvdW50OiBudW1iZXI7XG4gIGdldE9iamVjdERpc3BsYXlOYW1lKFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAgZGlzcGxheU5hbWU6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuICBvbkNhblNob3dQcm9wZXJ0eUNhbGxiYWNrKFxuICAgIG9iamVjdDogYW55LFxuICAgIHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIHNob3dNb2RlOiBzdHJpbmcsXG4gICAgcGFyZW50T2JqOiBhbnksXG4gICAgcGFyZW50UHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHlcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgb25DYW5EZWxldGVJdGVtQ2FsbGJhY2soXG4gICAgb2JqZWN0OiBhbnksXG4gICAgaXRlbTogU3VydmV5LkJhc2UsXG4gICAgYWxsb3dEZWxldGU6IGJvb2xlYW5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFsbG93RGVsZXRlO1xuICB9XG4gIG9uQ29sbGVjdGlvbkl0ZW1EZWxldGluZ0NhbGxiYWNrKFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgY29sbGVjdGlvbjogQXJyYXk8U3VydmV5LkJhc2U+LFxuICAgIGl0ZW06IFN1cnZleS5CYXNlXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIG9uSXRlbVZhbHVlQWRkZWRDYWxsYmFjayhcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIGl0ZW1WYWx1ZTogU3VydmV5Lkl0ZW1WYWx1ZSxcbiAgICBpdGVtVmFsdWVzOiBBcnJheTxTdXJ2ZXkuSXRlbVZhbHVlPlxuICApIHt9XG4gIG9uTWF0cml4RHJvcGRvd25Db2x1bW5BZGRlZENhbGxiYWNrKFxuICAgIG1hdHJpeDogU3VydmV5LlF1ZXN0aW9uLFxuICAgIGNvbHVtbjogU3VydmV5Lk1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIGNvbHVtbnM6IEFycmF5PFN1cnZleS5NYXRyaXhEcm9wZG93bkNvbHVtbj5cbiAgKSB7fVxuICBvblNldFByb3BlcnR5RWRpdG9yT3B0aW9uc0NhbGxiYWNrKFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgZWRpdG9yT3B0aW9uczogYW55XG4gICkge31cbiAgb25HZXRFcnJvclRleHRPblZhbGlkYXRpb25DYWxsYmFjayhcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBvblZhbHVlQ2hhbmdpbmdDYWxsYmFjayhvcHRpb25zOiBhbnkpIHt9XG4gIG9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHksXG4gICAgb2JqOiBhbnksXG4gICAgbmV3VmFsdWU6IGFueVxuICApIHt9XG4gIG9uR2V0RWxlbWVudEVkaXRvclRpdGxlQ2FsbGJhY2sob2JqOiBTdXJ2ZXkuQmFzZSwgdGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRpdGxlO1xuICB9XG4gIHN0YXJ0VW5kb1JlZG9UcmFuc2FjdGlvbigpIHt9XG4gIHN0b3BVbmRvUmVkb1RyYW5zYWN0aW9uKCkge31cbiAgY3JlYXRlU3VydmV5KFxuICAgIGpzb246IGFueSxcbiAgICByZWFzb246IHN0cmluZyxcbiAgICBzdXJ2ZXlUeXBlPzogbmV3IChqc29uOiBhbnkpID0+IFN1cnZleS5TdXJ2ZXlNb2RlbFxuICApIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleS5TdXJ2ZXlNb2RlbChqc29uKTtcbiAgfVxuICBvbkNvbmRpdGlvblF1ZXN0aW9uc0dldExpc3RDYWxsYmFjayhcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgIGVkaXRvcjogYW55LFxuICAgIGxpc3Q6IGFueVtdXG4gICkge31cbn1cbiIsImltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuZXhwb3J0IGNsYXNzIFN0eWxlc01hbmFnZXIge1xuICBwdWJsaWMgc3RhdGljIFRoZW1lVmFyaWFibGVzTWFwID0ge1xuICAgIFwiJHByaW1hcnktY29sb3JcIjogXCItLXByaW1hcnktY29sb3JcIixcbiAgICBcIiRzZWNvbmRhcnktY29sb3JcIjogXCItLXNlY29uZGFyeS1jb2xvclwiLFxuICAgIFwiJHByaW1hcnktdGV4dC1jb2xvclwiOiBcIi0tcHJpbWFyeS10ZXh0LWNvbG9yXCIsXG4gICAgXCIkc2Vjb25kYXJ5LXRleHQtY29sb3JcIjogXCItLXNlY29uZGFyeS10ZXh0LWNvbG9yXCIsXG4gICAgXCIkaW52ZXJ0ZWQtdGV4dC1jb2xvclwiOiBcIi0taW52ZXJ0ZWQtdGV4dC1jb2xvclwiLFxuICAgIFwiJHByaW1hcnktaG92ZXItY29sb3JcIjogXCItLXByaW1hcnktaG92ZXItY29sb3JcIixcbiAgICBcIiRzZWxlY3Rpb24tYm9yZGVyLWNvbG9yXCI6IFwiLS1zZWxlY3Rpb24tYm9yZGVyLWNvbG9yXCIsXG4gICAgXCIkcHJpbWFyeS1pY29uLWNvbG9yXCI6IFwiLS1wcmltYXJ5LWljb24tY29sb3JcIixcbiAgICBcIiRwcmltYXJ5LWJnLWNvbG9yXCI6IFwiLS1wcmltYXJ5LWJnLWNvbG9yXCIsXG4gICAgXCIkc2Vjb25kYXJ5LWJnLWNvbG9yXCI6IFwiLS1zZWNvbmRhcnktYmctY29sb3JcIixcbiAgICBcIiRwcmltYXJ5LWJvcmRlci1jb2xvclwiOiBcIi0tcHJpbWFyeS1ib3JkZXItY29sb3JcIixcbiAgICBcIiRzZWNvbmRhcnktYm9yZGVyLWNvbG9yXCI6IFwiLS1zZWNvbmRhcnktYm9yZGVyLWNvbG9yXCIsXG4gICAgXCIkZXJyb3ItY29sb3JcIjogXCItLWVycm9yLWNvbG9yXCJcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgVGhlbWVDb2xvcnM6IHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB9ID0ge1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIFwiJHByaW1hcnktY29sb3JcIjogXCIjMWFiMzk0XCIsXG4gICAgICBcIiRzZWNvbmRhcnktY29sb3JcIjogXCIjMWFiMzk0XCIsXG4gICAgICBcIiRwcmltYXJ5LXRleHQtY29sb3JcIjogXCIjNjc2YTZjXCIsXG4gICAgICBcIiRzZWNvbmRhcnktdGV4dC1jb2xvclwiOiBcIiNhN2E3YTdcIixcbiAgICAgIFwiJGludmVydGVkLXRleHQtY29sb3JcIjogXCIjZmZmZmZmXCIsXG4gICAgICBcIiRwcmltYXJ5LWhvdmVyLWNvbG9yXCI6IFwiIzE4YTY4OVwiLFxuICAgICAgXCIkc2VsZWN0aW9uLWJvcmRlci1jb2xvclwiOiBcIiMxYWIzOTRcIixcbiAgICAgIFwiJHByaW1hcnktaWNvbi1jb2xvclwiOiBcIiMzZDRkNWRcIixcbiAgICAgIFwiJHByaW1hcnktYmctY29sb3JcIjogXCIjZmZmXCIsXG4gICAgICBcIiRzZWNvbmRhcnktYmctY29sb3JcIjogXCIjZjRmNGY0XCIsXG4gICAgICBcIiRwcmltYXJ5LWJvcmRlci1jb2xvclwiOiBcIiNlN2VhZWNcIixcbiAgICAgIFwiJHNlY29uZGFyeS1ib3JkZXItY29sb3JcIjogXCIjZGRkXCIsXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIlxuICAgIH0sXG4gICAgb3JhbmdlOiB7XG4gICAgICBcIiRwcmltYXJ5LWNvbG9yXCI6IFwiI2Y3ODExOVwiLFxuICAgICAgXCIkc2Vjb25kYXJ5LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkcHJpbWFyeS10ZXh0LWNvbG9yXCI6IFwiIzY3NmE2Y1wiLFxuICAgICAgXCIkc2Vjb25kYXJ5LXRleHQtY29sb3JcIjogXCIjYTdhN2E3XCIsXG4gICAgICBcIiRpbnZlcnRlZC10ZXh0LWNvbG9yXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgXCIkcHJpbWFyeS1ob3Zlci1jb2xvclwiOiBcIiNlNzcxMDlcIixcbiAgICAgIFwiJHNlbGVjdGlvbi1ib3JkZXItY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiRwcmltYXJ5LWljb24tY29sb3JcIjogXCIjM2Q0ZDVkXCIsXG4gICAgICBcIiRwcmltYXJ5LWJnLWNvbG9yXCI6IFwiI2ZmZlwiLFxuICAgICAgXCIkc2Vjb25kYXJ5LWJnLWNvbG9yXCI6IFwiI2Y0ZjRmNFwiLFxuICAgICAgXCIkcHJpbWFyeS1ib3JkZXItY29sb3JcIjogXCIjZTdlYWVjXCIsXG4gICAgICBcIiRzZWNvbmRhcnktYm9yZGVyLWNvbG9yXCI6IFwiI2RkZFwiLFxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCJcbiAgICB9LFxuICAgIGRhcmtibHVlOiB7XG4gICAgICBcIiRwcmltYXJ5LWNvbG9yXCI6IFwiIzNjNGY2ZFwiLFxuICAgICAgXCIkc2Vjb25kYXJ5LWNvbG9yXCI6IFwiIzNjNGY2ZFwiLFxuICAgICAgXCIkcHJpbWFyeS10ZXh0LWNvbG9yXCI6IFwiIzY3NmE2Y1wiLFxuICAgICAgXCIkc2Vjb25kYXJ5LXRleHQtY29sb3JcIjogXCIjYTdhN2E3XCIsXG4gICAgICBcIiRpbnZlcnRlZC10ZXh0LWNvbG9yXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgXCIkcHJpbWFyeS1ob3Zlci1jb2xvclwiOiBcIiMyYzNmNWRcIixcbiAgICAgIFwiJHNlbGVjdGlvbi1ib3JkZXItY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiRwcmltYXJ5LWljb24tY29sb3JcIjogXCIjM2Q0ZDVkXCIsXG4gICAgICBcIiRwcmltYXJ5LWJnLWNvbG9yXCI6IFwiI2ZmZlwiLFxuICAgICAgXCIkc2Vjb25kYXJ5LWJnLWNvbG9yXCI6IFwiI2Y0ZjRmNFwiLFxuICAgICAgXCIkcHJpbWFyeS1ib3JkZXItY29sb3JcIjogXCIjZTdlYWVjXCIsXG4gICAgICBcIiRzZWNvbmRhcnktYm9yZGVyLWNvbG9yXCI6IFwiI2RkZFwiLFxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCJcbiAgICB9LFxuICAgIGRhcmtyb3NlOiB7XG4gICAgICBcIiRwcmltYXJ5LWNvbG9yXCI6IFwiIzY4NjU2ZVwiLFxuICAgICAgXCIkc2Vjb25kYXJ5LWNvbG9yXCI6IFwiIzY4NjU2ZVwiLFxuICAgICAgXCIkcHJpbWFyeS10ZXh0LWNvbG9yXCI6IFwiIzY3NmE2Y1wiLFxuICAgICAgXCIkc2Vjb25kYXJ5LXRleHQtY29sb3JcIjogXCIjYTdhN2E3XCIsXG4gICAgICBcIiRpbnZlcnRlZC10ZXh0LWNvbG9yXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgXCIkcHJpbWFyeS1ob3Zlci1jb2xvclwiOiBcIiM1NzU0NWVcIixcbiAgICAgIFwiJHNlbGVjdGlvbi1ib3JkZXItY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiRwcmltYXJ5LWljb24tY29sb3JcIjogXCIjM2Q0ZDVkXCIsXG4gICAgICBcIiRwcmltYXJ5LWJnLWNvbG9yXCI6IFwiI2ZmZlwiLFxuICAgICAgXCIkc2Vjb25kYXJ5LWJnLWNvbG9yXCI6IFwiI2Y0ZjRmNFwiLFxuICAgICAgXCIkcHJpbWFyeS1ib3JkZXItY29sb3JcIjogXCIjZTdlYWVjXCIsXG4gICAgICBcIiRzZWNvbmRhcnktYm9yZGVyLWNvbG9yXCI6IFwiI2RkZFwiLFxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCJcbiAgICB9LFxuICAgIHN0b25lOiB7XG4gICAgICBcIiRwcmltYXJ5LWNvbG9yXCI6IFwiIzBmMGYzM1wiLFxuICAgICAgXCIkc2Vjb25kYXJ5LWNvbG9yXCI6IFwiIzBmMGYzM1wiLFxuICAgICAgXCIkcHJpbWFyeS10ZXh0LWNvbG9yXCI6IFwiIzY3NmE2Y1wiLFxuICAgICAgXCIkc2Vjb25kYXJ5LXRleHQtY29sb3JcIjogXCIjYTdhN2E3XCIsXG4gICAgICBcIiRpbnZlcnRlZC10ZXh0LWNvbG9yXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgXCIkcHJpbWFyeS1ob3Zlci1jb2xvclwiOiBcIiMwMDAwMjNcIixcbiAgICAgIFwiJHNlbGVjdGlvbi1ib3JkZXItY29sb3JcIjogXCIjY2RjY2QyXCIsXG4gICAgICBcIiRwcmltYXJ5LWljb24tY29sb3JcIjogXCIjM2Q0ZDVkXCIsXG4gICAgICBcIiRwcmltYXJ5LWJnLWNvbG9yXCI6IFwiI2ZmZlwiLFxuICAgICAgXCIkc2Vjb25kYXJ5LWJnLWNvbG9yXCI6IFwiI2Y0ZjRmNFwiLFxuICAgICAgXCIkcHJpbWFyeS1ib3JkZXItY29sb3JcIjogXCIjZTdlYWVjXCIsXG4gICAgICBcIiRzZWNvbmRhcnktYm9yZGVyLWNvbG9yXCI6IFwiI2RkZFwiLFxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCJcbiAgICB9LFxuICAgIHdpbnRlcjoge1xuICAgICAgXCIkcHJpbWFyeS1jb2xvclwiOiBcIiM1YWM4ZmFcIixcbiAgICAgIFwiJHNlY29uZGFyeS1jb2xvclwiOiBcIiM1YWM4ZmFcIixcbiAgICAgIFwiJHByaW1hcnktdGV4dC1jb2xvclwiOiBcIiM2NzZhNmNcIixcbiAgICAgIFwiJHNlY29uZGFyeS10ZXh0LWNvbG9yXCI6IFwiI2E3YTdhN1wiLFxuICAgICAgXCIkaW52ZXJ0ZWQtdGV4dC1jb2xvclwiOiBcIiNmZmZmZmZcIixcbiAgICAgIFwiJHByaW1hcnktaG92ZXItY29sb3JcIjogXCIjNGFkOGVhXCIsXG4gICAgICBcIiRzZWxlY3Rpb24tYm9yZGVyLWNvbG9yXCI6IFwiIzgyYjhkYVwiLFxuICAgICAgXCIkcHJpbWFyeS1pY29uLWNvbG9yXCI6IFwiIzNkNGQ1ZFwiLFxuICAgICAgXCIkcHJpbWFyeS1iZy1jb2xvclwiOiBcIiNmZmZcIixcbiAgICAgIFwiJHNlY29uZGFyeS1iZy1jb2xvclwiOiBcIiNmNGY0ZjRcIixcbiAgICAgIFwiJHByaW1hcnktYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZWFlY1wiLFxuICAgICAgXCIkc2Vjb25kYXJ5LWJvcmRlci1jb2xvclwiOiBcIiNkZGRcIixcbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiXG4gICAgfSxcbiAgICB3aW50ZXJzdG9uZToge1xuICAgICAgXCIkcHJpbWFyeS1jb2xvclwiOiBcIiMzYzNiNDBcIixcbiAgICAgIFwiJHNlY29uZGFyeS1jb2xvclwiOiBcIiMzYzNiNDBcIixcbiAgICAgIFwiJHByaW1hcnktdGV4dC1jb2xvclwiOiBcIiM2NzZhNmNcIixcbiAgICAgIFwiJHNlY29uZGFyeS10ZXh0LWNvbG9yXCI6IFwiI2E3YTdhN1wiLFxuICAgICAgXCIkaW52ZXJ0ZWQtdGV4dC1jb2xvclwiOiBcIiNmZmZmZmZcIixcbiAgICAgIFwiJHByaW1hcnktaG92ZXItY29sb3JcIjogXCIjMWMxYjIwXCIsXG4gICAgICBcIiRzZWxlY3Rpb24tYm9yZGVyLWNvbG9yXCI6IFwiI2I4YjhiOFwiLFxuICAgICAgXCIkcHJpbWFyeS1pY29uLWNvbG9yXCI6IFwiIzNkNGQ1ZFwiLFxuICAgICAgXCIkcHJpbWFyeS1iZy1jb2xvclwiOiBcIiNmZmZcIixcbiAgICAgIFwiJHNlY29uZGFyeS1iZy1jb2xvclwiOiBcIiNmNGY0ZjRcIixcbiAgICAgIFwiJHByaW1hcnktYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZWFlY1wiLFxuICAgICAgXCIkc2Vjb25kYXJ5LWJvcmRlci1jb2xvclwiOiBcIiNkZGRcIixcbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiXG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgY3VycmVudFRoZW1lID0ga28ub2JzZXJ2YWJsZShcImJvb3RzdHJhcFwiKTtcblxuICBwdWJsaWMgc3RhdGljIGFwcGx5VGhlbWUoXG4gICAgdGhlbWVOYW1lOiBzdHJpbmcgPSBcImRlZmF1bHRcIlxuICApIHtcbiAgICBTdHlsZXNNYW5hZ2VyLmN1cnJlbnRUaGVtZSh0aGVtZU5hbWUpO1xuICAgIFN1cnZleS5TdHlsZXNNYW5hZ2VyLmFwcGx5VGhlbWUodGhlbWVOYW1lKTtcblxuICAgIGlmKCFkb2N1bWVudCB8fCAhZG9jdW1lbnQuYm9keSB8fCAhZG9jdW1lbnQuYm9keS5zdHlsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB0aGVtZSA9XG4gICAgICBTdHlsZXNNYW5hZ2VyLlRoZW1lQ29sb3JzW3RoZW1lTmFtZV0gfHxcbiAgICAgIFN0eWxlc01hbmFnZXIuVGhlbWVDb2xvcnNbXCJkZWZhdWx0XCJdO1xuXG4gICAgT2JqZWN0LmtleXModGhlbWUpLmZvckVhY2goY29sb3JWYXJpYWJsZU5hbWUgPT4ge1xuICAgICAgbGV0IGNzc1ZhcmlhYmxlTmFtZSA9IFN0eWxlc01hbmFnZXIuVGhlbWVWYXJpYWJsZXNNYXBbY29sb3JWYXJpYWJsZU5hbWVdO1xuICAgICAgaWYoISFjc3NWYXJpYWJsZU5hbWUgJiYgdGhlbWVbY29sb3JWYXJpYWJsZU5hbWVdKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoY3NzVmFyaWFibGVOYW1lLCB0aGVtZVtjb2xvclZhcmlhYmxlTmFtZV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSUUgMTEgcG9seWZpbGxcbiAgICAvLyBpZighd2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0ICYmICFkb2N1bWVudFtcImRvY3VtZW50TW9kZVwiXSkge1xuICAgIC8vICAgZG9jdW1lbnQud3JpdGUoJzxzY3JpcHQgc3JjPVwieW91ckpzUGF0aC9pZTExQ3VzdG9tUHJvcGVydGllcy5qc1wiPjxcXHgyZnNjcmlwdD4nKTtcbiAgICAvLyB9XG4gIH1cblxufVxuIiwiaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgSVN1cnZleU9iamVjdEVkaXRvck9wdGlvbnMgfSBmcm9tIFwiLi9wcm9wZXJ0eUVkaXRvcnMvcHJvcGVydHlFZGl0b3JCYXNlXCI7XG5pbXBvcnQgeyBJU3VydmV5Q3JlYXRvck9wdGlvbnMgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG5leHBvcnQgZW51bSBPYmpUeXBlIHtcbiAgVW5rbm93bixcbiAgU3VydmV5LFxuICBQYWdlLFxuICBQYW5lbCxcbiAgUXVlc3Rpb24sXG59XG5leHBvcnQgY2xhc3MgU3VydmV5SGVscGVyIHtcbiAgcHVibGljIHN0YXRpYyBnZXROZXdQYWdlTmFtZShvYmpzOiBBcnJheTxhbnk+KSB7XG4gICAgcmV0dXJuIFN1cnZleUhlbHBlci5nZXROZXdOYW1lKFxuICAgICAgb2JqcyxcbiAgICAgIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJlZC5uZXdQYWdlTmFtZVwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXROZXdRdWVzdGlvbk5hbWUob2JqczogQXJyYXk8YW55Pikge1xuICAgIHJldHVybiBTdXJ2ZXlIZWxwZXIuZ2V0TmV3TmFtZShcbiAgICAgIG9ianMsXG4gICAgICBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZWQubmV3UXVlc3Rpb25OYW1lXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldE5ld1BhbmVsTmFtZShvYmpzOiBBcnJheTxhbnk+KSB7XG4gICAgcmV0dXJuIFN1cnZleUhlbHBlci5nZXROZXdOYW1lKFxuICAgICAgb2JqcyxcbiAgICAgIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJlZC5uZXdQYW5lbE5hbWVcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVOZXdOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHBvcyA9IG5hbWUubGVuZ3RoO1xuICAgIHdoaWxlIChwb3MgPiAwICYmIG5hbWVbcG9zIC0gMV0gPj0gXCIwXCIgJiYgbmFtZVtwb3MgLSAxXSA8PSBcIjlcIikge1xuICAgICAgcG9zLS07XG4gICAgfVxuICAgIHZhciBiYXNlID0gbmFtZS5zdWJzdHIoMCwgcG9zKTtcbiAgICB2YXIgbnVtID0gMDtcbiAgICBpZiAocG9zIDwgbmFtZS5sZW5ndGgpIHtcbiAgICAgIG51bSA9IHBhcnNlSW50KG5hbWUuc3Vic3RyKHBvcykpO1xuICAgIH1cbiAgICBudW0rKztcbiAgICByZXR1cm4gYmFzZSArIG51bTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldE5ld05hbWUob2JqczogQXJyYXk8YW55PiwgYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIGhhc2ggPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhhc2hbb2Jqc1tpXS5uYW1lXSA9IHRydWU7XG4gICAgfVxuICAgIHZhciBudW0gPSAxO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoIWhhc2hbYmFzZU5hbWUgKyBudW0udG9TdHJpbmcoKV0pIGJyZWFrO1xuICAgICAgbnVtKys7XG4gICAgfVxuICAgIHJldHVybiBiYXNlTmFtZSArIG51bS50b1N0cmluZygpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0T2JqZWN0VHlwZShvYmo6IGFueSk6IE9ialR5cGUge1xuICAgIGlmICghb2JqIHx8ICFvYmpbXCJnZXRUeXBlXCJdKSByZXR1cm4gT2JqVHlwZS5Vbmtub3duO1xuICAgIGlmIChvYmouZ2V0VHlwZSgpID09IFwicGFnZVwiKSByZXR1cm4gT2JqVHlwZS5QYWdlO1xuICAgIGlmIChvYmouZ2V0VHlwZSgpID09IFwicGFuZWxcIikgcmV0dXJuIE9ialR5cGUuUGFuZWw7XG4gICAgaWYgKG9iai5nZXRUeXBlKCkgPT0gXCJzdXJ2ZXlcIikgcmV0dXJuIE9ialR5cGUuU3VydmV5O1xuICAgIGlmIChvYmpbXCJuYW1lXCJdKSByZXR1cm4gT2JqVHlwZS5RdWVzdGlvbjtcbiAgICByZXR1cm4gT2JqVHlwZS5Vbmtub3duO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0T2JqZWN0VHlwZVN0cihvYmo6IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIG9ialR5cGUgPSBTdXJ2ZXlIZWxwZXIuZ2V0T2JqZWN0VHlwZShvYmopO1xuICAgIGlmIChvYmpUeXBlID09PSBPYmpUeXBlLlN1cnZleSkgcmV0dXJuIFwic3VydmV5XCI7XG4gICAgaWYgKG9ialR5cGUgPT09IE9ialR5cGUuUGFnZSkgcmV0dXJuIFwicGFnZVwiO1xuICAgIGlmIChvYmpUeXBlID09PSBPYmpUeXBlLlBhbmVsKSByZXR1cm4gXCJwYW5lbFwiO1xuICAgIGlmIChvYmpUeXBlID09PSBPYmpUeXBlLlF1ZXN0aW9uKSByZXR1cm4gXCJxdWVzdGlvblwiO1xuICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldE9iamVjdE5hbWUob2JqOiBhbnksIHNob3dPYmplY3RUaXRsZSA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBpZiAoc2hvd09iamVjdFRpdGxlICYmIG9ialtcInRpdGxlXCJdKSByZXR1cm4gb2JqW1widGl0bGVcIl07XG4gICAgaWYgKHNob3dPYmplY3RUaXRsZSAmJiBvYmpbXCJ0ZXh0XCJdKSByZXR1cm4gb2JqW1widGV4dFwiXTtcbiAgICBpZiAob2JqW1wibmFtZVwiXSkgcmV0dXJuIG9ialtcIm5hbWVcIl07XG4gICAgdmFyIG9ialR5cGUgPSBTdXJ2ZXlIZWxwZXIuZ2V0T2JqZWN0VHlwZShvYmopO1xuICAgIGlmIChvYmpUeXBlICE9IE9ialR5cGUuUGFnZSkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIGRhdGEgPSA8U3VydmV5LlN1cnZleT4oPFN1cnZleS5QYWdlPm9iailbXCJkYXRhXCJdO1xuICAgIGlmICghZGF0YSkgZGF0YSA9IDxTdXJ2ZXkuU3VydmV5Pig8U3VydmV5LlBhZ2U+b2JqKVtcInN1cnZleVwiXTsgLy9UT0RPXG4gICAgdmFyIGluZGV4ID0gZGF0YS5wYWdlcy5pbmRleE9mKDxTdXJ2ZXkuUGFnZT5vYmopO1xuICAgIHJldHVybiBcIltQYWdlIFwiICsgKGluZGV4ICsgMSkgKyBcIl1cIjtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRzKFxuICAgIGVsZW1lbnQ6IGFueSxcbiAgICBpbmNsdWRlSGlkZGVuOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8YW55PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gW107XG4gICAgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudHNJbkRlc2lnbilcbiAgICAgIHJldHVybiBlbGVtZW50LmdldEVsZW1lbnRzSW5EZXNpZ24oaW5jbHVkZUhpZGRlbik7XG4gICAgaWYgKGVsZW1lbnQuZWxlbWVudHMpIHJldHVybiBlbGVtZW50LmVsZW1lbnRzO1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzUHJvcGVydHlWaXNpYmxlKFxuICAgIG9iajogYW55LFxuICAgIHByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIG9wdGlvbnM6IElTdXJ2ZXlDcmVhdG9yT3B0aW9ucyA9IG51bGwsXG4gICAgc2hvd01vZGU6IHN0cmluZyA9IG51bGwsXG4gICAgcGFyZW50T2JqOiBhbnkgPSBudWxsLFxuICAgIHBhcmVudFByb3BlcnR5OiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5ID0gbnVsbFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXByb3BlcnR5IHx8ICFwcm9wZXJ0eS52aXNpYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCEhc2hvd01vZGUgJiYgISFwcm9wZXJ0eS5zaG93TW9kZSAmJiBzaG93TW9kZSAhPT0gcHJvcGVydHkuc2hvd01vZGUpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgISFwcm9wZXJ0eS5pc1Zpc2libGUgJiZcbiAgICAgICEhb2JqLmdldExheW91dFR5cGUgJiZcbiAgICAgICEoPGFueT5wcm9wZXJ0eVtcImlzVmlzaWJsZVwiXSkob2JqLmdldExheW91dFR5cGUoKSwgbnVsbClcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGNhblNob3cgPSAhIW9wdGlvbnNcbiAgICAgID8gKG9iamVjdDogYW55LCBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLm9uQ2FuU2hvd1Byb3BlcnR5Q2FsbGJhY2soXG4gICAgICAgICAgICBvYmplY3QsXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHNob3dNb2RlLFxuICAgICAgICAgICAgcGFyZW50T2JqLFxuICAgICAgICAgICAgcGFyZW50UHJvcGVydHlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICA6IG51bGw7XG4gICAgaWYgKCEhY2FuU2hvdyAmJiAhY2FuU2hvdyhvYmosIHByb3BlcnR5KSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZChlbDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoIWVsIHx8ICFlbC5zY3JvbGxJbnRvVmlldykgcmV0dXJuO1xuICAgIHZhciByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdmFyIHNjcm9sbGFibGVEaXYgPSBTdXJ2ZXlIZWxwZXIuZ2V0U2Nyb2xsYWJsZURpdihlbCk7XG4gICAgaWYgKCFzY3JvbGxhYmxlRGl2KSByZXR1cm47XG4gICAgdmFyIGhlaWdodCA9IHNjcm9sbGFibGVEaXYuY2xpZW50SGVpZ2h0O1xuICAgIGlmIChyZWN0LnRvcCA8IHNjcm9sbGFibGVEaXYub2Zmc2V0VG9wKSB7XG4gICAgICBlbC5zY3JvbGxJbnRvVmlldygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgb2Zmc2V0VG9wID0gaGVpZ2h0ICsgc2Nyb2xsYWJsZURpdi5vZmZzZXRUb3A7XG4gICAgICBpZiAocmVjdC5ib3R0b20gPiBvZmZzZXRUb3AgJiYgcmVjdC5oZWlnaHQgPCBoZWlnaHQpIHtcbiAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldFNjcm9sbGFibGVEaXYoZWw6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xuICAgIHdoaWxlICghIWVsKSB7XG4gICAgICBpZiAoISFlbC5pZCAmJiBlbC5pZC5pbmRleE9mKFwic2Nyb2xsYWJsZURpdlwiKSA+IC0xKSByZXR1cm4gZWw7XG4gICAgICBpZiAoIWVsLm9mZnNldFBhcmVudCkgcmV0dXJuIG51bGw7XG4gICAgICBlbCA9IDxIVE1MRWxlbWVudD5lbC5vZmZzZXRQYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgbW92ZUl0ZW1JbkFycmF5KFxuICAgIGxpc3Q6IEFycmF5PGFueT4sXG4gICAgb2JqOiBhbnksXG4gICAgbmV3SW5kZXg6IG51bWJlclxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWxpc3QgfHwgbGlzdC5sZW5ndGggPCAyKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG5ld0luZGV4IDwgMCB8fCBuZXdJbmRleCA+PSBsaXN0Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBvbGRJbmRleCA9IGxpc3QuaW5kZXhPZihvYmopO1xuICAgIGlmIChvbGRJbmRleCA8IDAgfHwgb2xkSW5kZXggPT0gbmV3SW5kZXgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIFN1cnZleUhlbHBlci5kaXNhYmxlU2VsZWN0aW5nT2JqKGxpc3RbaV0pO1xuICAgIH1cbiAgICBsaXN0LnNwbGljZShvbGRJbmRleCwgMSk7XG4gICAgbGlzdC5zcGxpY2UobmV3SW5kZXgsIDAsIG9iaik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBTdXJ2ZXlIZWxwZXIuZW5hYmxlU2VsZWN0aW5nT2JqKGxpc3RbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGFwcGx5SXRlbVZhbHVlQXJyYXkoXG4gICAgZGVzdDogQXJyYXk8U3VydmV5Lkl0ZW1WYWx1ZT4sXG4gICAgc3JjOiBBcnJheTxTdXJ2ZXkuSXRlbVZhbHVlPlxuICApIHtcbiAgICBpZiAoIXNyYyB8fCBzcmMubGVuZ3RoID09IDApIHtcbiAgICAgIGRlc3Quc3BsaWNlKDAsIGRlc3QubGVuZ3RoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRlc3QubGVuZ3RoID4gc3JjLmxlbmd0aCkge1xuICAgICAgZGVzdC5zcGxpY2Uoc3JjLmxlbmd0aCwgZGVzdC5sZW5ndGggLSBzcmMubGVuZ3RoKTtcbiAgICB9XG4gICAgaWYgKGRlc3QubGVuZ3RoIDwgc3JjLmxlbmd0aCkge1xuICAgICAgdmFyIGluc2VydGVkQXJyYXkgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSBkZXN0Lmxlbmd0aDsgaSA8IHNyYy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpbnNlcnRlZEFycmF5LnB1c2goc3JjW2ldKTtcbiAgICAgIH1cbiAgICAgIGRlc3Quc3BsaWNlLmFwcGx5KGRlc3QsIFtkZXN0Lmxlbmd0aCwgMF0uY29uY2F0KGluc2VydGVkQXJyYXkpKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZGVzdFtpXS52YWx1ZSAhPSBzcmNbaV0udmFsdWUpIHtcbiAgICAgICAgZGVzdFtpXS52YWx1ZSA9IHNyY1tpXS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGRlc3RbaV0udGV4dCA9IHNyY1tpXS5oYXNUZXh0ID8gc3JjW2ldLnRleHQgOiBcIlwiO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIGRpc2FibGVTZWxlY3RpbmdPYmoob2JqOiBTdXJ2ZXkuQmFzZSkge1xuICAgIG9ialtcImRpc2FibGVTZWxlY3RpbmdcIl0gPSB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZW5hYmxlU2VsZWN0aW5nT2JqKG9iajogU3VydmV5LkJhc2UpIHtcbiAgICBkZWxldGUgb2JqW1wiZGlzYWJsZVNlbGVjdGluZ1wiXTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNhblNlbGVjdE9iaihvYmo6IFN1cnZleS5CYXNlKSB7XG4gICAgcmV0dXJuICFvYmogfHwgb2JqW1wiZGlzYWJsZVNlbGVjdGluZ1wiXSAhPT0gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHN0YXRpYyBkZWxldGVDb25kaXRpb25Qcm9wZXJ0aWVzKGpzb246IGFueSkge1xuICAgIGRlbGV0ZSBqc29uW1widmlzaWJsZVwiXTtcbiAgICBkZWxldGUganNvbltcInZpc2libGVJZlwiXTtcbiAgICBkZWxldGUganNvbltcImVuYWJsZVwiXTtcbiAgICBkZWxldGUganNvbltcImVuYWJsZUlmXCJdO1xuICAgIGRlbGV0ZSBqc29uW1widmFsdWVOYW1lXCJdO1xuICAgIGRlbGV0ZSBqc29uW1wiY2hvaWNlc1Zpc2libGVJZlwiXTtcbiAgICBkZWxldGUganNvbltcImNob2ljZXNFbmFibGVJZlwiXTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVF1ZXN0aW9uSnNvbihxdWVzdGlvbkpzb246IGFueSkge1xuICAgIHF1ZXN0aW9uSnNvbi5zdG9yZU90aGVyc0FzQ29tbWVudCA9IGZhbHNlO1xuICAgIFN1cnZleUhlbHBlci5kZWxldGVDb25kaXRpb25Qcm9wZXJ0aWVzKHF1ZXN0aW9uSnNvbik7XG4gICAgaWYgKCEhcXVlc3Rpb25Kc29uLmNob2ljZXMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25Kc29uLmNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgU3VydmV5SGVscGVyLmRlbGV0ZUNvbmRpdGlvblByb3BlcnRpZXMocXVlc3Rpb25Kc29uLmNob2ljZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRNYXRyaXhSb3dzVG9UZXh0KHJvd3M6IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIHJlc3VsdCA9IHJvd3NcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gIXJvdy5jZWxsc1swXS5oYXNFcnJvcilcbiAgICAgIC5tYXAoKHJvdykgPT5cbiAgICAgICAgcm93LmNlbGxzXG4gICAgICAgICAgLm1hcCgoY2VsbCkgPT4gY2VsbC52YWx1ZSB8fCBcIlwiKVxuICAgICAgICAgIC5qb2luKFN1cnZleS5JdGVtVmFsdWUuU2VwYXJhdG9yKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXHwkLywgXCJcIilcbiAgICAgIClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY29udmVydEl0ZW1WYWx1ZXNUb1RleHQoaXRlbXM6IFN1cnZleS5JdGVtVmFsdWVbXSk6IHN0cmluZyB7XG4gICAgdmFyIHRleHQgPSBcIlwiO1xuXG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKHRleHQpIHRleHQgKz0gXCJcXG5cIjtcbiAgICAgIHRleHQgKz0gaXRlbS52YWx1ZTtcbiAgICAgIGlmIChpdGVtLnB1cmVUZXh0KSB0ZXh0ICs9IFwifFwiICsgaXRlbS5wdXJlVGV4dDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VGV4dFRvSXRlbVZhbHVlcyhcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcHJvcGVydGllczogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVtdLFxuICAgIGNsYXNzTmFtZTogc3RyaW5nXG4gICk6IFN1cnZleS5JdGVtVmFsdWVbXSB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gaXRlbXM7XG5cbiAgICB2YXIgdGV4dHMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGV4dHNbaV0pIGNvbnRpbnVlO1xuICAgICAgdmFyIGVsZW1lbnRzID0gdGV4dHNbaV0uc3BsaXQoU3VydmV5Lkl0ZW1WYWx1ZS5TZXBhcmF0b3IpO1xuICAgICAgdmFyIHZhbHVlSXRlbSA9IFN1cnZleS5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKGNsYXNzTmFtZSk7XG4gICAgICBwcm9wZXJ0aWVzLmZvckVhY2goKHAsIGkpID0+IHtcbiAgICAgICAgdmFsdWVJdGVtW3AubmFtZV0gPSBlbGVtZW50c1tpXTtcbiAgICAgIH0pO1xuICAgICAgaXRlbXMucHVzaCh2YWx1ZUl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIsIE9ialR5cGUgfSBmcm9tIFwiLi9zdXJ2ZXlIZWxwZXJcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleU9iamVjdEl0ZW0ge1xuICBwdWJsaWMgdmFsdWU6IFN1cnZleS5CYXNlO1xuICBwdWJsaWMgdGV4dDogYW55O1xuICBwdWJsaWMgbGV2ZWw6IG51bWJlciA9IDA7XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlPYmplY3RzIHtcbiAgcHVibGljIHN0YXRpYyBpbnRlbmQ6IHN0cmluZyA9IFwiLlwiO1xuICBzdXJ2ZXlWYWx1ZTogU3VydmV5LlN1cnZleTtcbiAgcHVibGljIGdldEl0ZW1UZXh0Q2FsbGJhY2s6IChvYmo6IFN1cnZleS5CYXNlLCB0ZXh0OiBzdHJpbmcpID0+IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga29PYmplY3RzOiBhbnksXG4gICAgcHVibGljIGtvU2VsZWN0ZWQ6IGFueSxcbiAgICBwcml2YXRlIGdldE9iamVjdERpc3BsYXlOYW1lOiAoXG4gICAgICBvYmo6IFN1cnZleS5CYXNlLFxuICAgICAgcmVhc29uOiBzdHJpbmdcbiAgICApID0+IHN0cmluZyA9IG51bGxcbiAgKSB7fVxuICBwdWJsaWMgZ2V0IHN1cnZleSgpOiBTdXJ2ZXkuU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1cnZleSh2YWx1ZTogU3VydmV5LlN1cnZleSkge1xuICAgIGlmICh0aGlzLnN1cnZleSA9PSB2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnJlYnVpbGQoKTtcbiAgfVxuICBwdWJsaWMgaGFzT2JqZWN0KG9iajogU3VydmV5LkJhc2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtSW5kZXgob2JqKSA+IC0xO1xuICB9XG4gIHB1YmxpYyBhZGRQYWdlKHBhZ2U6IFN1cnZleS5QYWdlTW9kZWwpIHtcbiAgICB0aGlzLmFkZEVsZW1lbnQocGFnZSwgbnVsbCk7XG4gIH1cbiAgcHVibGljIGFkZEVsZW1lbnQoZWxlbWVudDogYW55LCBwYXJlbnQ6IGFueSkge1xuICAgIHZhciBwYXJlbnRJbmRleCA9IHBhcmVudCAhPSBudWxsID8gdGhpcy5nZXRJdGVtSW5kZXgocGFyZW50KSA6IDA7XG4gICAgaWYgKHBhcmVudEluZGV4IDwgMCkgcmV0dXJuO1xuICAgIHZhciBlbGVtZW50cyA9XG4gICAgICBwYXJlbnQgIT0gbnVsbCA/IHRoaXMuZ2V0RWxlbWVudHMocGFyZW50KSA6IHRoaXMuc3VydmV5LnBhZ2VzO1xuICAgIHZhciBlbGVtZW50SW5kZXggPSBlbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICAgIHZhciBuZXdJbmRleCA9IGVsZW1lbnRJbmRleCArIDEgKyBwYXJlbnRJbmRleDtcbiAgICBpZiAoZWxlbWVudEluZGV4ID4gMCkge1xuICAgICAgdmFyIHByZXZFbGVtZW50ID0gZWxlbWVudHNbZWxlbWVudEluZGV4IC0gMV07XG4gICAgICBuZXdJbmRleCA9XG4gICAgICAgIHRoaXMuZ2V0SXRlbUluZGV4KHByZXZFbGVtZW50KSArXG4gICAgICAgIHRoaXMuZ2V0QWxsRWxlbWVudENvdW50KHByZXZFbGVtZW50KSArXG4gICAgICAgIDE7XG4gICAgfVxuICAgIHZhciBpdGVtID0gdGhpcy5jcmVhdGVJdGVtKGVsZW1lbnQsIHRoaXMua29PYmplY3RzKClbcGFyZW50SW5kZXhdKTtcbiAgICB0aGlzLmFkZEl0ZW0oaXRlbSwgbmV3SW5kZXgpO1xuICAgIHZhciBvYmpzID0gW107XG4gICAgdGhpcy5idWlsZEVsZW1lbnRzKG9ianMsIHRoaXMuZ2V0RWxlbWVudHMoZWxlbWVudCksIGl0ZW0pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5rb09iamVjdHMuc3BsaWNlKG5ld0luZGV4ICsgMSArIGksIDAsIG9ianNbaV0pO1xuICAgIH1cbiAgICBpZiAoU3VydmV5SGVscGVyLmNhblNlbGVjdE9iaihlbGVtZW50KSkge1xuICAgICAgdGhpcy5rb1NlbGVjdGVkKGl0ZW0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2VsZWN0T2JqZWN0KG9iajogU3VydmV5LkJhc2UpIHtcbiAgICBpZiAoISFvYmogJiYgIVN1cnZleUhlbHBlci5jYW5TZWxlY3RPYmoob2JqKSkgcmV0dXJuO1xuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgIHRoaXMua29TZWxlY3RlZChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9ianMgPSB0aGlzLmtvT2JqZWN0cygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG9ianNbaV0udmFsdWUgPT0gb2JqKSB7XG4gICAgICAgIHRoaXMua29TZWxlY3RlZChvYmpzW2ldKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRPYmplY3RQYWdlKG9iajogU3VydmV5LkJhc2UgPSBudWxsKTogU3VydmV5LlBhZ2Uge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybiBudWxsO1xuICAgIGlmICghb2JqKSB7XG4gICAgICBpZiAoIXRoaXMua29TZWxlY3RlZCgpKSByZXR1cm47XG4gICAgICBvYmogPSB0aGlzLmtvU2VsZWN0ZWQoKS52YWx1ZTtcbiAgICB9XG4gICAgdmFyIG9ianMgPSB0aGlzLmtvT2JqZWN0cygpO1xuICAgIHZhciBpbmRleCA9IHRoaXMuZ2V0SXRlbUluZGV4KG9iaik7XG4gICAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgICAgdmFyIGl0ZW0gPSBvYmpzW2luZGV4XTtcbiAgICAgIGlmIChpdGVtLmxldmVsID09IDEpIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgaW5kZXgtLTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIHJlbW92ZU9iamVjdChvYmo6IFN1cnZleS5CYXNlKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5nZXRJdGVtSW5kZXgob2JqKTtcbiAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG4gICAgdmFyIGNvdW50VG9SZW1vdmUgPSAxICsgdGhpcy5nZXRBbGxFbGVtZW50Q291bnQob2JqKTtcbiAgICB0aGlzLmtvT2JqZWN0cy5zcGxpY2UoaW5kZXgsIGNvdW50VG9SZW1vdmUpO1xuICB9XG4gIHB1YmxpYyBuYW1lQ2hhbmdlZChvYmo6IFN1cnZleS5CYXNlKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5nZXRJdGVtSW5kZXgob2JqKTtcbiAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmtvT2JqZWN0cygpW2luZGV4XTtcbiAgICBpdGVtLnRleHQodGhpcy5nZXRUZXh0KGl0ZW0pKTtcbiAgfVxuICBwdWJsaWMgc2VsZWN0TmV4dFF1ZXN0aW9uKGlzVXA6IGJvb2xlYW4pIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFNlbGVjdGVkUXVlc3Rpb24oKTtcbiAgICB2YXIgaXRlbUluZGV4ID0gdGhpcy5nZXRJdGVtSW5kZXgocXVlc3Rpb24pO1xuICAgIGlmIChpdGVtSW5kZXggPCAwKSByZXR1cm4gcXVlc3Rpb247XG4gICAgdmFyIG9ianMgPSB0aGlzLmtvT2JqZWN0cygpO1xuICAgIHZhciBuZXdJdGVtSW5kZXggPSBpdGVtSW5kZXggKyAoaXNVcCA/IC0xIDogMSk7XG4gICAgaWYgKFxuICAgICAgbmV3SXRlbUluZGV4IDwgb2Jqcy5sZW5ndGggJiZcbiAgICAgIFN1cnZleUhlbHBlci5nZXRPYmplY3RUeXBlKG9ianNbbmV3SXRlbUluZGV4XS52YWx1ZSkgPT0gT2JqVHlwZS5RdWVzdGlvblxuICAgICkge1xuICAgICAgaXRlbUluZGV4ID0gbmV3SXRlbUluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdJdGVtSW5kZXggPSBpdGVtSW5kZXg7XG4gICAgICB3aGlsZSAoXG4gICAgICAgIG5ld0l0ZW1JbmRleCA8IG9ianMubGVuZ3RoICYmXG4gICAgICAgIFN1cnZleUhlbHBlci5nZXRPYmplY3RUeXBlKG9ianNbbmV3SXRlbUluZGV4XS52YWx1ZSkgPT0gT2JqVHlwZS5RdWVzdGlvblxuICAgICAgKSB7XG4gICAgICAgIGl0ZW1JbmRleCA9IG5ld0l0ZW1JbmRleDtcbiAgICAgICAgbmV3SXRlbUluZGV4ICs9IGlzVXAgPyAxIDogLTE7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMua29TZWxlY3RlZChvYmpzW2l0ZW1JbmRleF0pO1xuICB9XG4gIHByaXZhdGUgZ2V0QWxsRWxlbWVudENvdW50KGVsZW1lbnQ6IGFueSkge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHMoZWxlbWVudCk7XG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzICs9IDEgKyB0aGlzLmdldEFsbEVsZW1lbnRDb3VudChlbGVtZW50c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZFF1ZXN0aW9uKCk6IFN1cnZleS5RdWVzdGlvbiB7XG4gICAgaWYgKCF0aGlzLmtvU2VsZWN0ZWQoKSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG9iaiA9IHRoaXMua29TZWxlY3RlZCgpLnZhbHVlO1xuICAgIGlmICghb2JqKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gU3VydmV5SGVscGVyLmdldE9iamVjdFR5cGUob2JqKSA9PSBPYmpUeXBlLlF1ZXN0aW9uXG4gICAgICA/IDxTdXJ2ZXkuUXVlc3Rpb24+b2JqXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBhZGRJdGVtKGl0ZW06IFN1cnZleU9iamVjdEl0ZW0sIGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoaW5kZXggPiB0aGlzLmtvT2JqZWN0cygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5rb09iamVjdHMucHVzaChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rb09iamVjdHMuc3BsaWNlKGluZGV4LCAwLCBpdGVtKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSByZWJ1aWxkKCkge1xuICAgIHZhciBvYmpzID0gW107XG4gICAgaWYgKHRoaXMuc3VydmV5ID09IG51bGwpIHtcbiAgICAgIHRoaXMua29PYmplY3RzKG9ianMpO1xuICAgICAgdGhpcy5zZWxlY3RPYmplY3QobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByb290ID0gdGhpcy5jcmVhdGVJdGVtKHRoaXMuc3VydmV5LCBudWxsKTtcbiAgICBvYmpzLnB1c2gocm9vdCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1cnZleS5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhZ2UgPSA8U3VydmV5LlBhZ2U+dGhpcy5zdXJ2ZXkucGFnZXNbaV07XG4gICAgICB2YXIgcGFnZUl0ZW0gPSB0aGlzLmNyZWF0ZUl0ZW0ocGFnZSwgcm9vdCk7XG4gICAgICBvYmpzLnB1c2gocGFnZUl0ZW0pO1xuICAgICAgdGhpcy5idWlsZEVsZW1lbnRzKG9ianMsIHRoaXMuZ2V0RWxlbWVudHMocGFnZSksIHBhZ2VJdGVtKTtcbiAgICB9XG4gICAgdGhpcy5rb09iamVjdHMob2Jqcyk7XG4gICAgdGhpcy5zZWxlY3RPYmplY3QodGhpcy5zdXJ2ZXkpO1xuICB9XG4gIHByaXZhdGUgZ2V0RWxlbWVudHMoZWxlbWVudDogYW55KTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIFN1cnZleUhlbHBlci5nZXRFbGVtZW50cyhlbGVtZW50KTtcbiAgfVxuICBwcml2YXRlIGJ1aWxkRWxlbWVudHMoXG4gICAgb2JqczogQXJyYXk8YW55PixcbiAgICBlbGVtZW50czogQXJyYXk8YW55PixcbiAgICBwYXJlbnRJdGVtOiBTdXJ2ZXlPYmplY3RJdGVtXG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IGVsZW1lbnRzW2ldO1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNyZWF0ZUl0ZW0oPFN1cnZleS5CYXNlPmVsLCBwYXJlbnRJdGVtKTtcbiAgICAgIG9ianMucHVzaChpdGVtKTtcbiAgICAgIHRoaXMuYnVpbGRFbGVtZW50cyhvYmpzLCB0aGlzLmdldEVsZW1lbnRzKGVsKSwgaXRlbSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY3JlYXRlSXRlbSh2YWx1ZTogU3VydmV5LkJhc2UsIHBhcmVudDogU3VydmV5T2JqZWN0SXRlbSkge1xuICAgIHZhciBpdGVtID0gbmV3IFN1cnZleU9iamVjdEl0ZW0oKTtcbiAgICBpdGVtLnZhbHVlID0gdmFsdWU7XG4gICAgaXRlbS5sZXZlbCA9IHBhcmVudCAhPSBudWxsID8gcGFyZW50LmxldmVsICsgMSA6IDA7XG4gICAgaXRlbS50ZXh0ID0ga28ub2JzZXJ2YWJsZSh0aGlzLmdldFRleHQoaXRlbSkpO1xuICAgIHJldHVybiBpdGVtO1xuICB9XG4gIHByaXZhdGUgZ2V0SXRlbUluZGV4KHZhbHVlOiBTdXJ2ZXkuQmFzZSk6IG51bWJlciB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIC0xO1xuICAgIGlmICh2YWx1ZVtcInNlbGVjdGVkRWxlbWVudEluRGVzaWduXCJdKVxuICAgICAgdmFsdWUgPSB2YWx1ZVtcInNlbGVjdGVkRWxlbWVudEluRGVzaWduXCJdO1xuICAgIHZhciBvYmpzID0gdGhpcy5rb09iamVjdHMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChvYmpzW2ldLnZhbHVlID09IHZhbHVlKSByZXR1cm4gaTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHByaXZhdGUgZ2V0VGV4dChpdGVtOiBTdXJ2ZXlPYmplY3RJdGVtKTogc3RyaW5nIHtcbiAgICBpZiAoaXRlbS5sZXZlbCA9PSAwKSByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcImVkLnN1cnZleVwiKTtcbiAgICB2YXIgaW50ZW5kID0gU3VydmV5T2JqZWN0cy5pbnRlbmQ7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBpdGVtLmxldmVsOyBpKyspIHtcbiAgICAgIGludGVuZCArPSBTdXJ2ZXlPYmplY3RzLmludGVuZDtcbiAgICB9XG4gICAgdmFyIHRleHQgPSAhIXRoaXMuZ2V0T2JqZWN0RGlzcGxheU5hbWVcbiAgICAgID8gdGhpcy5nZXRPYmplY3REaXNwbGF5TmFtZShpdGVtLnZhbHVlLCBcInByb3BlcnR5LWdyaWRcIilcbiAgICAgIDogU3VydmV5SGVscGVyLmdldE9iamVjdE5hbWUoaXRlbS52YWx1ZSwgZmFsc2UpO1xuICAgIGlmICh0aGlzLmdldEl0ZW1UZXh0Q2FsbGJhY2spIHtcbiAgICAgIHRleHQgPSB0aGlzLmdldEl0ZW1UZXh0Q2FsbGJhY2soaXRlbS52YWx1ZSwgdGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBpbnRlbmQgKyB0ZXh0O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCB7IGZpbmRQYXJlbnROb2RlIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFN0eWxlc01hbmFnZXIgfSBmcm9tIFwiLi9zdHlsZXNtYW5hZ2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleU9iamVjdE1lbnVJdGVtIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKTtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIHZpc2libGU/OiBib29sZWFuIHwgKCgpID0+IGJvb2xlYW4pO1xuICBvbkNsaWNrOiAob2JqOiBTdXJ2ZXkuQmFzZSkgPT4gYW55O1xuICBpY29uPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZyk7XG4gIGhhc1RpdGxlPzogYm9vbGVhbjtcbiAgdGVtcGxhdGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlGb3JEZXNpZ25lciBleHRlbmRzIFN1cnZleS5TdXJ2ZXkge1xuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudFZhbHVlOiBhbnk7XG4gIGVkaXRRdWVzdGlvbkNsaWNrOiBhbnk7XG4gIHB1YmxpYyBvblNlbGVjdGVkRWxlbWVudENoYW5nZWQ6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXkuU3VydmV5LCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5LlN1cnZleSwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgcHVibGljIG9uRWRpdEJ1dHRvbkNsaWNrOiBTdXJ2ZXkuRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5LlN1cnZleSwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleS5TdXJ2ZXksIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIHB1YmxpYyBvbkdldE1lbnVJdGVtczogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleS5TdXJ2ZXksIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IFN1cnZleS5FdmVudDwoc2VuZGVyOiBTdXJ2ZXkuU3VydmV5LCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICBwdWJsaWMgb25FbGVtZW50RG91YmxlQ2xpY2s6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXkuU3VydmV5LCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5LlN1cnZleSwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgcHVibGljIG9uVXBkYXRlRWxlbWVudEFsbG93aW5nT3B0aW9uczogKG9wdGlvbnM6IGFueSkgPT4gYW55O1xuICBjb25zdHJ1Y3RvcihcbiAgICBqc29uT2JqOiBhbnkgPSBudWxsLFxuICAgIHJlbmRlcmVkRWxlbWVudDogYW55ID0gbnVsbCxcbiAgICBjc3M6IGFueSA9IG51bGxcbiAgKSB7XG4gICAgc3VwZXIoanNvbk9iaiwgcmVuZGVyZWRFbGVtZW50LCBjc3MpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnNldERlc2lnbk1vZGUodHJ1ZSk7XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyUGFnZS5hZGQoKHNlbmRlcjogU3VydmV5LlN1cnZleSwgb3B0aW9ucykgPT4ge1xuICAgICAgb3B0aW9ucy5wYWdlW1wib25BZnRlclJlbmRlclBhZ2VcIl0ob3B0aW9ucy5odG1sRWxlbWVudCk7XG4gICAgfSk7XG4gICAgdGhpcy5lZGl0UXVlc3Rpb25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYub25FZGl0QnV0dG9uQ2xpY2suZmlyZShzZWxmLCBudWxsKTtcbiAgICB9O1xuICAgIHRoaXMub25VcGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMuYWRkKG9uVXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzKTtcbiAgICB0aGlzLm9uVXBkYXRlUGFuZWxDc3NDbGFzc2VzLmFkZChvblVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3Nlcyk7XG4gICAgdGhpcy5vblVwZGF0ZVBhZ2VDc3NDbGFzc2VzLmFkZChvblVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3Nlcyk7XG4gICAgdmFyIHN1cnZleUNzcyA9IHRoaXMuY3NzO1xuICAgIGFkZEFkb3JuZXJNYXJrZXJDbGFzc2VzKHN1cnZleUNzcywgdGhpcyk7XG4gICAgdGhpcy5jc3MgPSBzdXJ2ZXlDc3M7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUVsZW1lbnRBbGxvd2luZ09wdGlvbnMob2JqOiBTdXJ2ZXkuQmFzZSkge1xuICAgIGlmICh0aGlzLm9uVXBkYXRlRWxlbWVudEFsbG93aW5nT3B0aW9ucyAmJiBvYmpbXCJhbGxvd2luZ09wdGlvbnNcIl0pIHtcbiAgICAgIG9ialtcImFsbG93aW5nT3B0aW9uc1wiXS5vYmogPSBvYmo7XG4gICAgICB0aGlzLm9uVXBkYXRlRWxlbWVudEFsbG93aW5nT3B0aW9ucyhvYmpbXCJhbGxvd2luZ09wdGlvbnNcIl0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0TWVudUl0ZW1zKG9iajogU3VydmV5LkJhc2UpOiBBcnJheTxJU3VydmV5T2JqZWN0TWVudUl0ZW0+IHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgb2JqOiBvYmosIGl0ZW1zOiBpdGVtcyB9O1xuICAgIHRoaXMub25HZXRNZW51SXRlbXMuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5pdGVtcztcbiAgfVxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkRWxlbWVudCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRWxlbWVudFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRFbGVtZW50KHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUuc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24pXG4gICAgICB2YWx1ZSA9IHZhbHVlLnNlbGVjdGVkRWxlbWVudEluRGVzaWduO1xuICAgIGlmICh2YWx1ZSA9PSB0aGlzLnNlbGVjdGVkRWxlbWVudFZhbHVlKSByZXR1cm47XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRWYWx1ZTtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudFZhbHVlID0gdmFsdWU7XG4gICAgaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgb2xkVmFsdWVbXCJvblNlbGVjdGVkRWxlbWVudENoYW5nZWRcIl0pIHtcbiAgICAgIG9sZFZhbHVlW1wib25TZWxlY3RlZEVsZW1lbnRDaGFuZ2VkXCJdKCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50VmFsdWUgIT0gbnVsbCAmJlxuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRWYWx1ZVtcIm9uU2VsZWN0ZWRFbGVtZW50Q2hhbmdlZFwiXVxuICAgICkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRWYWx1ZVtcIm9uU2VsZWN0ZWRFbGVtZW50Q2hhbmdlZFwiXSgpO1xuICAgIH1cbiAgICB0aGlzLm9uU2VsZWN0ZWRFbGVtZW50Q2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgIG9sZEVsZW1lbnQ6IG9sZFZhbHVlLFxuICAgICAgbmV3RWxlbWVudDogdmFsdWUsXG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGRvRWxlbWVudERvdWJsZUNsaWNrKG9iajogU3VydmV5LkJhc2UpIHtcbiAgICB0aGlzLm9uRWxlbWVudERvdWJsZUNsaWNrLmZpcmUodGhpcywgeyBlbGVtZW50OiBvYmogfSk7XG4gIH1cbiAgcHVibGljIGdldEVkaXRvckxvY1N0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgX2hhc0xvZ28oKSB7XG4gICAgcmV0dXJuICEhdGhpcy5pc0xvZ29JbWFnZUNob29zZW4gJiYgdGhpcy5sb2dvUG9zaXRpb24gIT09IFwibm9uZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgX2lzTG9nb0JlZm9yZSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5faGFzTG9nbyAmJlxuICAgICAgKHRoaXMubG9nb1Bvc2l0aW9uID09PSBcImxlZnRcIiB8fCB0aGlzLmxvZ29Qb3NpdGlvbiA9PT0gXCJ0b3BcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgX2lzTG9nb0FmdGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9oYXNMb2dvICYmXG4gICAgICAodGhpcy5sb2dvUG9zaXRpb24gPT09IFwicmlnaHRcIiB8fCB0aGlzLmxvZ29Qb3NpdGlvbiA9PT0gXCJib3R0b21cIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNUaXRsZUxvZ29FZGl0YWJsZSA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGhhc0xvZ28oKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChTdXJ2ZXlGb3JEZXNpZ25lci5pc1RpdGxlTG9nb0VkaXRhYmxlKCkgJiZcbiAgICAgICAgKCh0aGlzLmlzUmVhZE9ubHkoKSAmJiB0aGlzLl9oYXNMb2dvKSB8fCAhdGhpcy5pc1JlYWRPbmx5KCkpKSB8fFxuICAgICAgKCFTdXJ2ZXlGb3JEZXNpZ25lci5pc1RpdGxlTG9nb0VkaXRhYmxlKCkgJiYgdGhpcy5faGFzTG9nbylcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNMb2dvQmVmb3JlKCkge1xuICAgIHJldHVybiAoXG4gICAgICAoU3VydmV5Rm9yRGVzaWduZXIuaXNUaXRsZUxvZ29FZGl0YWJsZSgpICYmXG4gICAgICAgICgodGhpcy5pc1JlYWRPbmx5KCkgJiYgdGhpcy5faXNMb2dvQmVmb3JlKSB8fCAhdGhpcy5pc1JlYWRPbmx5KCkpKSB8fFxuICAgICAgKCFTdXJ2ZXlGb3JEZXNpZ25lci5pc1RpdGxlTG9nb0VkaXRhYmxlKCkgJiYgdGhpcy5faXNMb2dvQmVmb3JlKVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBpc0xvZ29BZnRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKFN1cnZleUZvckRlc2lnbmVyLmlzVGl0bGVMb2dvRWRpdGFibGUoKSAmJlxuICAgICAgICAoKHRoaXMuaXNSZWFkT25seSgpICYmIHRoaXMuX2lzTG9nb0FmdGVyKSB8fCAhdGhpcy5pc1JlYWRPbmx5KCkpKSB8fFxuICAgICAgKCFTdXJ2ZXlGb3JEZXNpZ25lci5pc1RpdGxlTG9nb0VkaXRhYmxlKCkgJiYgdGhpcy5faXNMb2dvQWZ0ZXIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzTG9nb0ltYWdlQ2hvb3NlbigpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NMb2dvW1wia29SZW5kZXJlZEh0bWxcIl0oKTtcbiAgfVxuICBwdWJsaWMga29TaG93SGVhZGVyID0ga28ub2JzZXJ2YWJsZSh0cnVlKTtcbiAgcHVibGljIGlzUmVhZE9ubHkgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3VydmV5KGVsOiBhbnkpOiBhbnkge1xuICBpZiAoIWVsKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBlbC5nZXRUeXBlID09PSBcImZ1bmN0aW9uXCIgJiYgZWwuZ2V0VHlwZSgpID09PSBcInN1cnZleVwiKSB7XG4gICAgcmV0dXJuIGVsO1xuICB9XG4gIHZhciByZXMgPSBlbFtcInN1cnZleVwiXTtcbiAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgcmV0dXJuIGVsW1wiZGF0YVwiXTtcbn1cblxuZnVuY3Rpb24gcGFuZWxCYXNlT25DcmVhdGluZyhzZWxmOiBhbnkpIHtcbiAgaWYgKHNlbGYuZGlzYWJsZURlc2lnbkFjdGlvbnMgPT09IHRydWUpIHJldHVybjtcbiAgc2VsZi5kcmFnRW50ZXJDb3VudGVyID0gMDtcbiAgc2VsZi5lbXB0eUVsZW1lbnQgPSBudWxsO1xuICBzZWxmLnJvd0NvdW50ID0ga28uY29tcHV0ZWQoZnVuY3Rpb24gKCkge1xuICAgIHZhciByb3dzID0gISFzZWxmW1wia29Sb3dcIl0gPyBzZWxmW1wia29Sb3dzXCJdKCkgOiBzZWxmLnJvd3M7XG4gICAgcmV0dXJuIHJvd3MubGVuZ3RoO1xuICB9LCBzZWxmKTtcbiAgc2VsZi5yb3dDb3VudC5zdWJzY3JpYmUoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHNlbGYuZW1wdHlFbGVtZW50KSB7XG4gICAgICBzZWxmLmVtcHR5RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPiAwID8gXCJub25lXCIgOiBcIlwiO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhZ2VPbkNyZWF0aW5nKHBhZ2U6IFBhZ2VNb2RlbCkge1xuICBpZiAocGFnZS5kaXNhYmxlRGVzaWduQWN0aW9ucyA9PT0gdHJ1ZSkgcmV0dXJuO1xuICBwYWdlW1wiYWxsb3dpbmdPcHRpb25zXCJdID0ge1xuICAgIGFsbG93QWRkOiB0cnVlLFxuICAgIGFsbG93RGVsZXRlOiB0cnVlLFxuICAgIGFsbG93RWRpdDogdHJ1ZSxcbiAgICBhbGxvd0NvcHk6IHRydWUsXG4gICAgLy9hbGxvd0FkZFRvVG9vbGJveDogdHJ1ZSxcbiAgICAvL2FsbG93RHJhZ2dpbmc6IHRydWUsXG4gICAgLy9hbGxvd0NoYW5nZVR5cGU6IHRydWUsXG4gICAgLy9hbGxvd1Nob3dIaWRlVGl0bGU6IHRydWUsXG4gICAgLy9hbGxvd0NoYW5nZVJlcXVpcmVkOiB0cnVlLFxuICB9O1xufVxuZnVuY3Rpb24gZWxlbWVudE9uQ3JlYXRpbmcoc3VydmV5RWxlbWVudDogYW55KSB7XG4gIGlmIChzdXJ2ZXlFbGVtZW50LmRpc2FibGVEZXNpZ25BY3Rpb25zID09PSB0cnVlKSByZXR1cm47XG4gIHN1cnZleUVsZW1lbnQuYWxsb3dpbmdPcHRpb25zID0ge1xuICAgIGFsbG93RGVsZXRlOiB0cnVlLFxuICAgIGFsbG93RWRpdDogdHJ1ZSxcbiAgICBhbGxvd1Nob3dFZGl0b3I6IHRydWUsXG4gICAgYWxsb3dDb3B5OiB0cnVlLFxuICAgIGFsbG93QWRkVG9Ub29sYm94OiB0cnVlLFxuICAgIGFsbG93RHJhZ2dpbmc6IHRydWUsXG4gICAgYWxsb3dDaGFuZ2VUeXBlOiB0cnVlLFxuICAgIGFsbG93U2hvd0hpZGVUaXRsZTogdHJ1ZSxcbiAgICBhbGxvd0NoYW5nZVJlcXVpcmVkOiB0cnVlLFxuICB9O1xuICBzdXJ2ZXlFbGVtZW50LmRyYWdEcm9wSGVscGVyVmFsdWUgPSBudWxsO1xuICBzdXJ2ZXlFbGVtZW50LmRyYWdEcm9wSGVscGVyID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzdXJ2ZXlFbGVtZW50LmRyYWdEcm9wSGVscGVyVmFsdWUgPT0gbnVsbCkge1xuICAgICAgc3VydmV5RWxlbWVudC5kcmFnRHJvcEhlbHBlclZhbHVlID0gZ2V0U3VydmV5KHN1cnZleUVsZW1lbnQpW1xuICAgICAgICBcImRyYWdEcm9wSGVscGVyXCJcbiAgICAgIF07XG4gICAgfVxuICAgIHJldHVybiBzdXJ2ZXlFbGVtZW50LmRyYWdEcm9wSGVscGVyVmFsdWU7XG4gIH07XG4gIHN1cnZleUVsZW1lbnQucmVuZGVyZWRFbGVtZW50ID0gbnVsbDtcbiAgc3VydmV5RWxlbWVudC5rb0lzRHJhZ2dpbmcgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgc3VydmV5RWxlbWVudC5rb0lzU2VsZWN0ZWQgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgc3VydmV5RWxlbWVudC5rb0lzRHJhZ2dpbmcuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgIGlmIChzdXJ2ZXlFbGVtZW50LnJlbmRlcmVkRWxlbWVudCkge1xuICAgICAgc3VydmV5RWxlbWVudC5yZW5kZXJlZEVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IG5ld1ZhbHVlID8gMC40IDogMTtcbiAgICB9XG4gIH0pO1xuICBzdXJ2ZXlFbGVtZW50LmtvSXNTZWxlY3RlZC5zdWJzY3JpYmUoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgaWYgKHN1cnZleUVsZW1lbnQucmVuZGVyZWRFbGVtZW50KSB7XG4gICAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgICAgc3VydmV5RWxlbWVudC5yZW5kZXJlZEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcbiAgICAgICAgICBcInN2ZF9xX3NlbGVjdGVkXCIsXG4gICAgICAgICAgXCJzdmQtbWFpbi1ib3JkZXItY29sb3JcIlxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VydmV5RWxlbWVudC5yZW5kZXJlZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcbiAgICAgICAgICBcInN2ZF9xX3NlbGVjdGVkXCIsXG4gICAgICAgICAgXCJzdmQtbWFpbi1ib3JkZXItY29sb3JcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBZnRlclJlbmRlckhhbmRsZXIoXG4gIGNyZWF0b3I6IGFueSxcbiAgc3VydmV5OiBTdXJ2ZXlGb3JEZXNpZ25lclxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBlbGVtZW50T25BZnRlclJlbmRlcmluZyhcbiAgICBkb21FbGVtZW50OiBhbnksXG4gICAgc3VydmV5RWxlbWVudDogYW55LFxuICAgIGlzUGFuZWw6IGJvb2xlYW4sXG4gICAgZGlzYWJsZTogYm9vbGVhblxuICApIHtcbiAgICBpZiAoc3VydmV5RWxlbWVudC5kaXNhYmxlRGVzaWduQWN0aW9ucyA9PT0gdHJ1ZSkgcmV0dXJuO1xuICAgIHN1cnZleUVsZW1lbnQucmVuZGVyZWRFbGVtZW50ID0gZG9tRWxlbWVudDtcbiAgICBzdXJ2ZXlFbGVtZW50LnJlbmRlcmVkRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwic3ZkX3F1ZXN0aW9uXCIpO1xuICAgIGlmIChTdHlsZXNNYW5hZ2VyLmN1cnJlbnRUaGVtZSgpID09PSBcImJvb3RzdHJhcFwiKSB7XG4gICAgICBzdXJ2ZXlFbGVtZW50LnJlbmRlcmVkRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwic3ZkLWRhcmstYmctY29sb3JcIik7XG4gICAgfVxuICAgIHN1cnZleUVsZW1lbnQucmVuZGVyZWRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJzdmRfcV9kZXNpZ25fYm9yZGVyXCIpO1xuXG4gICAgdmFyIGlzUm93TGF5b3V0ID1cbiAgICAgICFzdXJ2ZXlFbGVtZW50LmdldExheW91dFR5cGUgfHwgc3VydmV5RWxlbWVudC5nZXRMYXlvdXRUeXBlKCkgPT0gXCJyb3dcIjtcbiAgICB2YXIgb3B0ID0gc3VydmV5RWxlbWVudC5hbGxvd2luZ09wdGlvbnM7XG4gICAgb3B0LmFsbG93Q29weSA9IG9wdC5hbGxvd0NvcHkgJiYgaXNSb3dMYXlvdXQ7XG4gICAgb3B0LmFsbG93QWRkVG9Ub29sYm94ID0gb3B0LmFsbG93QWRkVG9Ub29sYm94ICYmIGlzUm93TGF5b3V0O1xuICAgIG9wdC5hbGxvd0NoYW5nZVR5cGUgPSBvcHQuYWxsb3dDaGFuZ2VUeXBlICYmIGlzUm93TGF5b3V0O1xuICAgIG9wdC5hbGxvd1Nob3dIaWRlVGl0bGUgPSBvcHQuYWxsb3dTaG93SGlkZVRpdGxlICYmIGlzUm93TGF5b3V0O1xuICAgIG9wdC5hbGxvd0NoYW5nZVJlcXVpcmVkID0gb3B0LmFsbG93Q2hhbmdlUmVxdWlyZWQgJiYgaXNSb3dMYXlvdXQ7XG5cbiAgICBnZXRTdXJ2ZXkoc3VydmV5RWxlbWVudCkudXBkYXRlRWxlbWVudEFsbG93aW5nT3B0aW9ucyhzdXJ2ZXlFbGVtZW50KTtcbiAgICBpZiAoc3VydmV5RWxlbWVudC5rb0lzU2VsZWN0ZWQoKSkge1xuICAgICAgc3VydmV5RWxlbWVudC5yZW5kZXJlZEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcbiAgICAgICAgXCJzdmRfcV9zZWxlY3RlZFwiLFxuICAgICAgICBcInN2ZC1tYWluLWJvcmRlci1jb2xvclwiXG4gICAgICApO1xuICAgIH1cbiAgICBkb21FbGVtZW50LnNldEF0dHJpYnV0ZShcbiAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgc3VydmV5RWxlbWVudC50aXRsZSArIFwiIFwiICsgc3VydmV5RWxlbWVudC5nZXRUeXBlKClcbiAgICApO1xuICAgIGRvbUVsZW1lbnQudGFiSW5kZXggPSBcIjBcIjtcbiAgICBkb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgIHZhciBjaGFyID0gZXYud2hpY2ggfHwgZXYua2V5Q29kZTtcbiAgICAgIGlmIChjaGFyID09PSAxMyB8fCBjaGFyID09PSAyNykge1xuICAgICAgICBkb21FbGVtZW50LmNsaWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZG9tRWxlbWVudC5vbmNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghZVtcIm1hcmtFdmVudFwiXSkge1xuICAgICAgICBlW1wibWFya0V2ZW50XCJdID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN1cnZleUVsZW1lbnQucGFyZW50KSB7XG4gICAgICAgICAgc3VydmV5RWxlbWVudC5zZWxlY3RlZE9uQ2xpY2sgPSB0cnVlO1xuICAgICAgICAgIGdldFN1cnZleShzdXJ2ZXlFbGVtZW50KVtcInNlbGVjdGVkRWxlbWVudFwiXSA9IHN1cnZleUVsZW1lbnQ7XG4gICAgICAgICAgc3VydmV5RWxlbWVudC5zZWxlY3RlZE9uQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKCFpc1BhbmVsKSB7XG4gICAgICB2YXIgY2hpbGRzID0gZG9tRWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCEhY2hpbGRzW2ldLnN0eWxlKSB7XG4gICAgICAgICAgY2hpbGRzW2ldLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3JlYXRvci5yZWFkT25seSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGtvLnRhc2tzLnJ1bkVhcmx5KCk7XG4gICAgICAgIGFkZEFkb3JuZXIoZG9tRWxlbWVudCwgc3VydmV5RWxlbWVudCk7XG4gICAgICB9LCAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXJ2ZXlFbGVtZW50LmRyYWdEcm9wSGVscGVyKCkuYXR0YWNoVG9FbGVtZW50KGRvbUVsZW1lbnQsIHN1cnZleUVsZW1lbnQpO1xuICAgIGRvbUVsZW1lbnQudGFiaW5kZXggPSBcIjBcIjtcbiAgICBkb21FbGVtZW50Lm9ua2V5dXAgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSAhIWRvY3VtZW50ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoXG4gICAgICAgICEhYWN0aXZlRWxlbWVudCAmJlxuICAgICAgICAhIWFjdGl2ZUVsZW1lbnRbXCJkYXRhc2V0XCJdICYmXG4gICAgICAgIGFjdGl2ZUVsZW1lbnRbXCJkYXRhc2V0XCJdLnN2ZEluZm8gPT09IFwiYWRvcm5lclwiXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGNoYXIgPSBlLndoaWNoIHx8IGUua2V5Q29kZTtcbiAgICAgIGlmIChjaGFyID09PSAweDEzIHx8IGNoYXIgPT09IDB4MjApIHtcbiAgICAgICAgZG9tRWxlbWVudC5jbGljaygpO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8gZWwub25rZXlkb3duID0gZnVuY3Rpb24oZSkge1xuICAgIC8vICAgaWYgKGUud2l0Y2ggPT0gNDYpIGdldFN1cnZleShzdXJ2ZXlFbGVtZW50KS5kZWxldGVDdXJyZW50T2JqZWN0Q2xpY2soKTtcbiAgICAvLyAgIHJldHVybiB0cnVlO1xuICAgIC8vIH07XG4gICAgZG9tRWxlbWVudC5vbmRibGNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGdldFN1cnZleShzdXJ2ZXlFbGVtZW50KS5kb0VsZW1lbnREb3VibGVDbGljayhzdXJ2ZXlFbGVtZW50KTtcbiAgICB9O1xuICAgIHZhciBzZXRUYWJJbmRleCA9IChlbGVtZW50KSA9PiB7XG4gICAgICBlbGVtZW50LnRhYkluZGV4ID0gLTE7XG4gICAgfTtcbiAgICBbXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCJdLmZvckVhY2goKHNlbCkgPT4ge1xuICAgICAgdmFyIGVsZW1lbnRzID0gZG9tRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNldFRhYkluZGV4KGVsZW1lbnRzW2ldKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGtvLnRhc2tzLnJ1bkVhcmx5KCk7XG4gICAgICBhZGRBZG9ybmVyKGRvbUVsZW1lbnQsIHN1cnZleUVsZW1lbnQpO1xuICAgIH0sIDEpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWZ0ZXJSZW5kZXJQYWdlSGFuZGxlcihcbiAgY3JlYXRvcjogYW55LFxuICBzdXJ2ZXk6IFN1cnZleUZvckRlc2lnbmVyXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGVsZW1lbnRPbkFmdGVyUmVuZGVyaW5nKGRvbUVsZW1lbnQ6IGFueSwgcGFnZTogYW55KSB7XG4gICAgcGFnZS5yZW5kZXJlZEVsZW1lbnQgPSBkb21FbGVtZW50O1xuICAgIGRvbUVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInN2ZF9wYWdlXCIpO1xuICAgIGRvbUVsZW1lbnQub25jbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWVbXCJtYXJrRXZlbnRcIl0pIHtcbiAgICAgICAgZVtcIm1hcmtFdmVudFwiXSA9IHRydWU7XG4gICAgICAgIGdldFN1cnZleShwYWdlKVtcInNlbGVjdGVkRWxlbWVudFwiXSA9IHBhZ2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRvbUVsZW1lbnQub25kYmxjbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBnZXRTdXJ2ZXkocGFnZSkuZG9FbGVtZW50RG91YmxlQ2xpY2socGFnZSk7XG4gICAgfTtcblxuICAgIGFkZEFkb3JuZXIoZG9tRWxlbWVudCwgcGFnZSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBZnRlclJlbmRlckhlYWRlckhhbmRsZXIoXG4gIGNyZWF0b3I6IGFueSxcbiAgc3VydmV5OiBTdXJ2ZXlGb3JEZXNpZ25lclxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBlbGVtZW50T25BZnRlclJlbmRlcmluZyhkb21FbGVtZW50OiBhbnksIHN1cnZleTogYW55KSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBrby50YXNrcy5ydW5FYXJseSgpO1xuICAgICAgZG9tRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwic3ZkX3N1cnZleV9oZWFkZXJcIik7XG4gICAgICBhZGRBZG9ybmVyKGRvbUVsZW1lbnQsIHN1cnZleSk7XG4gICAgfSwgMSk7XG4gIH07XG59XG5cbnZhciBhZG9ybmVyc0NvbmZpZzogeyBbaW5kZXg6IHN0cmluZ106IGFueVtdIH0gPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQWRvcm5lcihuYW1lLCBhZG9ybmVyKSB7XG4gIGlmICghYWRvcm5lcnNDb25maWdbbmFtZV0pIHtcbiAgICBhZG9ybmVyc0NvbmZpZ1tuYW1lXSA9IFtdO1xuICB9XG4gIGFkb3JuZXJzQ29uZmlnW25hbWVdLnB1c2goYWRvcm5lcik7XG4gIGlmICh0eXBlb2YgYWRvcm5lci5vblJlZ2lzdGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBhZG9ybmVyLm9uUmVnaXN0ZXIoKTtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFkb3JuZXJzKG5hbWVzOiBzdHJpbmdbXSA9IHVuZGVmaW5lZCkge1xuICBpZiAobmFtZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIG5hbWVzID0gT2JqZWN0LmtleXMoYWRvcm5lcnNDb25maWcpO1xuICB9XG4gIChuYW1lcyB8fCBbXSkuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgIHZhciBhZG9ybmVyczogYW55ID0gYWRvcm5lcnNDb25maWdbbmFtZV07XG4gICAgKGFkb3JuZXJzIHx8IFtdKS5mb3JFYWNoKChhZG9ybmVyKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGFkb3JuZXIub25VbnJlZ2lzdGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYWRvcm5lci5vblVucmVnaXN0ZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkZWxldGUgYWRvcm5lcnNDb25maWdbbmFtZV07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3NlcyhzdXJ2ZXksIG9wdGlvbnMpIHtcbiAgdmFyIGNsYXNzZXMgPSBvcHRpb25zLnBhbmVsID8gb3B0aW9ucy5jc3NDbGFzc2VzLnBhbmVsIDogb3B0aW9ucy5jc3NDbGFzc2VzO1xuICBjbGFzc2VzID0gb3B0aW9ucy5wYWdlID8gb3B0aW9ucy5jc3NDbGFzc2VzLnBhZ2UgOiBjbGFzc2VzO1xuICB2YXIgc3VydmV5RWxlbWVudCA9IG9wdGlvbnMucXVlc3Rpb24gfHwgb3B0aW9ucy5wYW5lbCB8fCBvcHRpb25zLnBhZ2U7XG4gIGFkZEFkb3JuZXJNYXJrZXJDbGFzc2VzKGNsYXNzZXMsIHN1cnZleUVsZW1lbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkQWRvcm5lck1hcmtlckNsYXNzZXMoY2xhc3NlczogYW55LCBzdXJ2ZXlFbGVtZW50OiBhbnkpIHtcbiAgT2JqZWN0LmtleXMoYWRvcm5lcnNDb25maWcpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBhZG9ybmVyc0NvbmZpZ1tlbGVtZW50XS5mb3JFYWNoKChhZG9ybmVyKSA9PiB7XG4gICAgICB2YXIgY2xhc3Nlc0VsZW1lbnROYW1lID0gYWRvcm5lci5nZXRFbGVtZW50TmFtZShzdXJ2ZXlFbGVtZW50KTtcbiAgICAgIHZhciBhZG9ybmVyTWFya2VyQ2xhc3MgPSBhZG9ybmVyLmdldE1hcmtlckNsYXNzKHN1cnZleUVsZW1lbnQpO1xuICAgICAgY2xhc3Nlc1tjbGFzc2VzRWxlbWVudE5hbWVdID0gYXBwbHlBZG9ybmVyQ2xhc3MoXG4gICAgICAgIGNsYXNzZXNbY2xhc3Nlc0VsZW1lbnROYW1lXSxcbiAgICAgICAgYWRvcm5lck1hcmtlckNsYXNzXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QWRvcm5lckNsYXNzKGNsYXNzZXMsIGFkb3JuZXJDbGFzcykge1xuICB2YXIgcmVzdWx0ID0gY2xhc3NlcztcblxuICBpZiAoISFhZG9ybmVyQ2xhc3MpIHtcbiAgICByZXN1bHQgPSAhIXJlc3VsdCA/IHJlc3VsdCArIFwiIFwiICsgYWRvcm5lckNsYXNzIDogYWRvcm5lckNsYXNzO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZmlsdGVyTmVzdGVkUXVlc3Rpb25zKHJvb3RRdWVzdGlvbk5vZGUsIGVsZW1lbnRzKSB7XG4gIHZhciB0YXJnZXRFbGVtZW50cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHF1ZXN0aW9uRWxlbWVudCA9IGZpbmRQYXJlbnROb2RlKFwic3ZkX3F1ZXN0aW9uXCIsIGVsZW1lbnRzW2ldKTtcbiAgICBpZiAocXVlc3Rpb25FbGVtZW50ID09PSByb290UXVlc3Rpb25Ob2RlKSB7XG4gICAgICB0YXJnZXRFbGVtZW50cy5wdXNoKGVsZW1lbnRzW2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldEVsZW1lbnRzO1xufVxuZnVuY3Rpb24gZmlsdGVyUGFnZUVsZW1lbnRzKGVsZW1lbnRzKSB7XG4gIHZhciB0YXJnZXRFbGVtZW50cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHF1ZXN0aW9uRWxlbWVudCA9IGZpbmRQYXJlbnROb2RlKFwic3ZkX3F1ZXN0aW9uXCIsIGVsZW1lbnRzW2ldKTtcbiAgICBpZiAocXVlc3Rpb25FbGVtZW50ID09PSBudWxsKSB7XG4gICAgICB0YXJnZXRFbGVtZW50cy5wdXNoKGVsZW1lbnRzW2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldEVsZW1lbnRzO1xufVxuXG5mdW5jdGlvbiBhZGRBZG9ybmVyKG5vZGUsIG1vZGVsKSB7XG4gIGNvbnN0IGFsbG93RWRpdCA9XG4gICAgISFtb2RlbCAmJlxuICAgICgoISFtb2RlbC5hbGxvd2luZ09wdGlvbnMgJiYgISFtb2RlbC5hbGxvd2luZ09wdGlvbnMuYWxsb3dFZGl0KSB8fFxuICAgICAgbW9kZWwuYWxsb3dpbmdPcHRpb25zID09PSB1bmRlZmluZWQpO1xuICBjb25zdCBzdXJ2ZXkgPSBnZXRTdXJ2ZXkobW9kZWwpO1xuICBjb25zdCBlZGl0b3IgPSAhIXN1cnZleSAmJiBzdXJ2ZXkuZ2V0RWRpdG9yICYmIHN1cnZleS5nZXRFZGl0b3IoKTtcbiAgY29uc3QgaXNSZWFkT25seSA9ICFhbGxvd0VkaXQgfHwgKCEhZWRpdG9yICYmIGVkaXRvci5yZWFkT25seSk7XG4gIE9iamVjdC5rZXlzKGFkb3JuZXJzQ29uZmlnKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgYWRvcm5lcnNDb25maWdbZWxlbWVudF0uZm9yRWFjaCgoYWRvcm5lcikgPT4ge1xuICAgICAgdmFyIGVsZW1lbnRDbGFzcyA9IGFkb3JuZXIuZ2V0TWFya2VyQ2xhc3MobW9kZWwpO1xuICAgICAgaWYgKCEhZWxlbWVudENsYXNzKSB7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IG5vZGUucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICBcIi5cIiArIGVsZW1lbnRDbGFzcy5yZXBsYWNlKC9cXHMvZywgXCIuXCIpXG4gICAgICAgICk7XG4gICAgICAgIHZhciB0ZW1wID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0ZW1wLnB1c2goZWxlbWVudHNbaV0pO1xuICAgICAgICAgIGlmIChpc1JlYWRPbmx5ICYmICFhZG9ybmVyLnJlbmRlclJlYWRPbmx5ICYmIGVsZW1lbnRzW2ldLmNsYXNzTGlzdCkge1xuICAgICAgICAgICAgZWxlbWVudHNbaV0uY2xhc3NMaXN0LnJlbW92ZShlbGVtZW50Q2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSZWFkT25seSAmJiAhYWRvcm5lci5yZW5kZXJSZWFkT25seSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50cyA9IHRlbXA7XG4gICAgICAgIGlmIChub2RlLmNsYXNzTmFtZS5zcGxpdChcIiBcIikuaW5kZXhPZihlbGVtZW50Q2xhc3MpICE9PSAtMSkge1xuICAgICAgICAgIGVsZW1lbnRzLnVuc2hpZnQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGVsLmdldFR5cGUoKSAhPT0gXCJwYWdlXCIgJiYgbW9kZWwuZ2V0VHlwZSgpICE9PSBcInN1cnZleVwiKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBmaWx0ZXJOZXN0ZWRRdWVzdGlvbnMobm9kZSwgZWxlbWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RlbC5nZXRUeXBlKCkgPT09IFwicGFnZVwiKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBmaWx0ZXJQYWdlRWxlbWVudHMoZWxlbWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlbGVtZW50cy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICBub2RlLmNsYXNzTmFtZS5pbmRleE9mKGVsZW1lbnRDbGFzcykgIT09IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIGVsZW1lbnRzID0gW25vZGVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKGlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgIGFkb3JuZXIucmVuZGVyUmVhZE9ubHkgJiZcbiAgICAgICAgICAgICAgYWRvcm5lci5yZW5kZXJSZWFkT25seShlbGVtZW50cywgbW9kZWwsIGVkaXRvcik7XG4gICAgICAgICAgfSBlbHNlIGFkb3JuZXIuYWZ0ZXJSZW5kZXIoZWxlbWVudHMsIG1vZGVsLCBlZGl0b3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5TdXJ2ZXkuUGFnZS5wcm90b3R5cGVbXCJvbkNyZWF0aW5nXCJdID0gZnVuY3Rpb24gKCkge1xuICBwYW5lbEJhc2VPbkNyZWF0aW5nKHRoaXMpO1xufTtcblxuU3VydmV5LlBhZ2UucHJvdG90eXBlW1wib25BZnRlclJlbmRlclBhZ2VcIl0gPSBmdW5jdGlvbiAoZWwpIHtcbiAgaWYgKCFnZXRTdXJ2ZXkodGhpcykuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGRyYWdEcm9wSGVscGVyID0gZ2V0U3VydmV5KHRoaXMpW1wiZHJhZ0Ryb3BIZWxwZXJcIl07XG4gIHRoaXMuZHJhZ0VudGVyQ291bnRlciA9IDA7XG4gIGVsLm9uZHJhZ2VudGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgc2VsZi5kcmFnRW50ZXJDb3VudGVyKys7XG4gIH07XG4gIGVsLm9uZHJhZ2xlYXZlID0gZnVuY3Rpb24gKGUpIHtcbiAgICBzZWxmLmRyYWdFbnRlckNvdW50ZXItLTtcbiAgICBpZiAoc2VsZi5kcmFnRW50ZXJDb3VudGVyID09PSAwKSBkcmFnRHJvcEhlbHBlci5kb0xlYXZlUGFnZShlKTtcbiAgfTtcbiAgZWwub25kcmFnb3ZlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBlbC5vbmRyb3AgPSBmdW5jdGlvbiAoZSkge1xuICAgIGRyYWdEcm9wSGVscGVyLmRvRHJvcChlKTtcbiAgfTtcbn07XG5cblN1cnZleS5QYW5lbC5wcm90b3R5cGVbXCJvbkNyZWF0aW5nXCJdID0gZnVuY3Rpb24gKCkge1xuICBwYW5lbEJhc2VPbkNyZWF0aW5nKHRoaXMpO1xuICBlbGVtZW50T25DcmVhdGluZyh0aGlzKTtcbn07XG5cblN1cnZleS5QYW5lbC5wcm90b3R5cGVbXCJvblNlbGVjdGVkRWxlbWVudENoYW5nZWRcIl0gPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChnZXRTdXJ2ZXkodGhpcykgPT0gbnVsbCkgcmV0dXJuO1xuICB0aGlzLmtvSXNTZWxlY3RlZChnZXRTdXJ2ZXkodGhpcylbXCJzZWxlY3RlZEVsZW1lbnRWYWx1ZVwiXSA9PSB0aGlzKTtcbn07XG5cbmlmICghIVN1cnZleVtcIkZsb3dQYW5lbFwiXSkge1xuICBTdXJ2ZXlbXCJGbG93UGFuZWxcIl0ucHJvdG90eXBlW1wib25DcmVhdGluZ1wiXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvL1RPRE9cbiAgICB0aGlzLnBsYWNlSG9sZGVyID0gXCJFbnRlciBoZXJlIHRleHQgb3IgZHJvcCBhIHF1ZXN0aW9uXCI7XG4gICAgZWxlbWVudE9uQ3JlYXRpbmcodGhpcyk7XG4gIH07XG4gIFN1cnZleVtcIkZsb3dQYW5lbFwiXS5wcm90b3R5cGVbXCJvblNlbGVjdGVkRWxlbWVudENoYW5nZWRcIl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGdldFN1cnZleSh0aGlzKSA9PSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5rb0lzU2VsZWN0ZWQoZ2V0U3VydmV5KHRoaXMpW1wic2VsZWN0ZWRFbGVtZW50VmFsdWVcIl0gPT0gdGhpcyk7XG4gIH07XG59XG5cbnZhciBxdWVzdGlvblByb3RvdHlwZSA9ICEhU3VydmV5W1wiUXVlc3Rpb25CYXNlXCJdXG4gID8gU3VydmV5W1wiUXVlc3Rpb25CYXNlXCJdLnByb3RvdHlwZVxuICA6IFN1cnZleS5RdWVzdGlvbi5wcm90b3R5cGU7XG5cbnF1ZXN0aW9uUHJvdG90eXBlW1wib25DcmVhdGluZ1wiXSA9IGZ1bmN0aW9uICgpIHtcbiAgZWxlbWVudE9uQ3JlYXRpbmcodGhpcyk7XG59O1xuXG52YXIgcGFnZVByb3RvdHlwZSA9IFN1cnZleS5QYWdlLnByb3RvdHlwZTtcblxucGFnZVByb3RvdHlwZVtcIm9uQ3JlYXRpbmdcIl0gPSBmdW5jdGlvbiAoKSB7XG4gIHBhZ2VPbkNyZWF0aW5nKHRoaXMpO1xufTtcblxucXVlc3Rpb25Qcm90b3R5cGVbXCJvblNlbGVjdGVkRWxlbWVudENoYW5nZWRcIl0gPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChnZXRTdXJ2ZXkodGhpcykgPT0gbnVsbCkgcmV0dXJuO1xuICB0aGlzLmtvSXNTZWxlY3RlZChnZXRTdXJ2ZXkodGhpcylbXCJzZWxlY3RlZEVsZW1lbnRWYWx1ZVwiXSA9PSB0aGlzKTtcbn07XG5cblN1cnZleS5RdWVzdGlvblNlbGVjdEJhc2VJbXBsZW1lbnRvci5wcm90b3R5cGVbXCJvbkNyZWF0ZWRcIl0gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBxOiBhbnkgPSB0aGlzLnF1ZXN0aW9uO1xuICB2YXIgdXBkYXRlVHJpZ2dlckZ1bmN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4gcVtcImtvRWxlbWVudFR5cGVcIl0ubm90aWZ5U3Vic2NyaWJlcnMoKSwgMCk7XG4gIH07XG4gIFtcbiAgICBcImNob2ljZXNcIixcbiAgICBcImhhc090aGVyXCIsXG4gICAgXCJoYXNDb21tZW50XCIsXG4gICAgXCJoYXNOb25lXCIsXG4gICAgXCJoYXNTZWxlY3RBbGxcIixcbiAgICBcImNvbENvdW50XCIsXG4gICAgXCJ0aXRsZUxvY2F0aW9uXCIsXG4gICAgXCJyYXRlVmFsdWVzXCIsXG4gICAgXCJjaG9pY2VzRnJvbVF1ZXN0aW9uXCIsXG4gICAgXCJjb250ZW50TW9kZVwiLFxuICBdLmZvckVhY2goKHByb3BlcnR5TmFtZSkgPT5cbiAgICB0aGlzLnF1ZXN0aW9uLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgdXBkYXRlVHJpZ2dlckZ1bmN0aW9uLFxuICAgICAgXCJrb0VsZW1lbnRUeXBlX1RyaWdnZXJcIlxuICAgIClcbiAgKTtcbn07XG5cblN1cnZleS5RdWVzdGlvblJhdGluZ0ltcGxlbWVudG9yLnByb3RvdHlwZVtcIm9uQ3JlYXRlZFwiXSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHE6IGFueSA9IHRoaXMucXVlc3Rpb247XG4gIHZhciB1cGRhdGVUcmlnZ2VyRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiBxW1wia29FbGVtZW50VHlwZVwiXS5ub3RpZnlTdWJzY3JpYmVycygpLCAwKTtcbiAgICBxLmxvY1N0cnNDaGFuZ2VkKCk7XG4gIH07XG4gIFtcbiAgICBcInJhdGVWYWx1ZXNcIixcbiAgXS5mb3JFYWNoKChwcm9wZXJ0eU5hbWUpID0+XG4gICAgdGhpcy5xdWVzdGlvbi5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIHVwZGF0ZVRyaWdnZXJGdW5jdGlvbixcbiAgICAgIFwia29FbGVtZW50VHlwZV9UcmlnZ2VyXCJcbiAgICApXG4gICk7XG59O1xuXG5TdXJ2ZXkuTG9jYWxpemFibGVTdHJpbmdbXCJlZGl0YWJsZVJlbmRlcmVyXCJdID1cbiAgU3VydmV5LkxvY2FsaXphYmxlU3RyaW5nW1wiZGVmYXVsdFJlbmRlcmVyXCJdO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzdmcgc3R5bGU9XFxcImRpc3BsYXk6bm9uZTtcXFwiPjxkZWZzPjxyZWN0IGlkPVxcXCJkZXZpY2UtbC1iXFxcIiB3aWR0aD1cXFwiMzMwXFxcIiBoZWlnaHQ9XFxcIjY1MVxcXCIgeD1cXFwiNzE5LjVcXFwiIHk9XFxcIjI5OC41XFxcIiByeD1cXFwiMjBcXFwiPiA8L3JlY3Q+PGZpbHRlciBpZD1cXFwiZGV2aWNlLWwtYVxcXCIgd2lkdGg9XFxcIjE0NS41JVxcXCIgaGVpZ2h0PVxcXCIxMjMlXFxcIiB4PVxcXCItMjIuNyVcXFwiIHk9XFxcIi0xMS41JVxcXCIgZmlsdGVyVW5pdHM9XFxcIm9iamVjdEJvdW5kaW5nQm94XFxcIj4gPGZlT2Zmc2V0IGluPVxcXCJTb3VyY2VBbHBoYVxcXCIgcmVzdWx0PVxcXCJzaGFkb3dPZmZzZXRPdXRlcjFcXFwiPjwvZmVPZmZzZXQ+PGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj1cXFwiMjVcXFwiIGluPVxcXCJzaGFkb3dPZmZzZXRPdXRlcjFcXFwiIHJlc3VsdD1cXFwic2hhZG93Qmx1ck91dGVyMVxcXCI+PC9mZUdhdXNzaWFuQmx1cj48ZmVDb2xvck1hdHJpeCB2YWx1ZXM9XFxcIjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMSAwXFxcIiBpbj1cXFwic2hhZG93Qmx1ck91dGVyMVxcXCI+PC9mZUNvbG9yTWF0cml4PjwvZmlsdGVyPjxyZWN0IGlkPVxcXCJkZXZpY2UtcC1iXFxcIiB3aWR0aD1cXFwiMzMwXFxcIiBoZWlnaHQ9XFxcIjY1MVxcXCIgeD1cXFwiMTIwXFxcIiB5PVxcXCI0NThcXFwiIHJ4PVxcXCIyMFxcXCI+IDwvcmVjdD48ZmlsdGVyIGlkPVxcXCJkZXZpY2UtcC1hXFxcIiB3aWR0aD1cXFwiMTQ1LjUlXFxcIiBoZWlnaHQ9XFxcIjEyMyVcXFwiIHg9XFxcIi0yMi43JVxcXCIgeT1cXFwiLTExLjUlXFxcIiBmaWx0ZXJVbml0cz1cXFwib2JqZWN0Qm91bmRpbmdCb3hcXFwiPiA8ZmVPZmZzZXQgaW49XFxcIlNvdXJjZUFscGhhXFxcIiByZXN1bHQ9XFxcInNoYWRvd09mZnNldE91dGVyMVxcXCI+PC9mZU9mZnNldD48ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPVxcXCIyNVxcXCIgaW49XFxcInNoYWRvd09mZnNldE91dGVyMVxcXCIgcmVzdWx0PVxcXCJzaGFkb3dCbHVyT3V0ZXIxXFxcIj48L2ZlR2F1c3NpYW5CbHVyPjxmZUNvbG9yTWF0cml4IHZhbHVlcz1cXFwiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4xIDBcXFwiIGluPVxcXCJzaGFkb3dCbHVyT3V0ZXIxXFxcIj48L2ZlQ29sb3JNYXRyaXg+PC9maWx0ZXI+PC9kZWZzPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1hY3Rpb25hZGR0b3Rvb2xib3hcXFwiPjxwYXRoIGQ9XFxcIk03LjMgOEgxdjJoNS4yYy4yLS43LjYtMS40IDEuMS0yek0xMCA2LjJWNUgxdjJoNy4zYy41LS4zIDEuMS0uNiAxLjctLjh6TTEgMmg5djJIMXpNMTEuNSA3QzkgNyA3IDkgNyAxMS41UzkgMTYgMTEuNSAxNnM0LjUtMiA0LjUtNC41UzE0IDcgMTEuNSA3em0yLjUgNWgtMnYyaC0xdi0ySDl2LTFoMlY5aDF2MmgydjF6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWFjdGlvbmJvbGRcXFwiPjxwYXRoIGQ9XFxcIk0xIDF2NWgyVjRoM3Y4SDR2Mmg3di0ySDlWNGgzdjJoMlYxelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1hY3Rpb25jb252ZXJ0dG9cXFwiPjxwYXRoIGQ9XFxcIk0zIDEwTDAgN2g2ek0xMyA3bDMgM2gtNnpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNOCA0YzEuNSAwIDIuOC44IDMuNCAyaDIuMmMtLjgtMi4zLTMtNC01LjctNEM0LjcgMiAyIDQuNyAyIDhoMmMwLTIuMiAxLjgtNCA0LTR6TTExLjkgOWMtLjQgMS43LTIgMy0zLjkgMy0xIDAtMS45LS40LTIuNi0xSDIuOGMxIDEuOCAzIDMgNS4yIDMgMyAwIDUuNC0yLjIgNS45LTVoLTJ6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWFjdGlvbmNvcHlcXFwiPjxwYXRoIGQ9XFxcIk0yIDZoOXY5SDJ6XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTUgM3YyaDd2N2gyVjN6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWFjdGlvbmN1dFxcXCI+PHBhdGggZD1cXFwiTTIuNiAyLjljMC0uOC4xLTEuMy40LTEuNy4yLS4zLjQtLjMuNiAwIDEuNiAyLjQgMy4zIDQuOSA0LjkgNy4zLjIuMy40LjcuNSAxIC4zLjYuNS44IDEuMi43LjYtLjEgMS4yLS4xIDEuNyAwIDEuMi4zIDIuMSAxLjUgMiAyLjggMCAxLjItMSAyLjMtMi4yIDIuNS0xLjEuMi0yLS4yLTIuNi0xLS41LS42LS43LTEuNC0uNy0yLjIgMC0uNi0uMi0xLjItLjUtMS43LS4zLS40LS42LS44LTEuMS0xLjEtLjYtLjItMS4xLS43LTEuNS0xLjJDNC41IDcuMiAzLjcgNiAzLjIgNC44Yy0uMy0uNy0uNS0xLjQtLjYtMS45em03LjEgMTBjMCAuOS43IDEuNiAxLjYgMS42LjkgMCAxLjYtLjcgMS42LTEuNiAwLS45LS43LTEuNi0xLjYtMS42LS45IDAtMS42LjctMS42IDEuNnpNNy41IDkuMWMuMyAwIC41LS4yLjUtLjVzLS4yLS41LS41LS41LS41LjItLjUuNS4yLjUuNS41elxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk01LjkgOS42bDEuMi45cy4xLjEgMCAuMmMtLjQuNi0uNSAxLjMtLjUgMi0uMS45LS40IDEuNy0xLjEgMi4zLS44LjctMS43LjktMi43LjUtMS0uNC0xLjYtMS4xLTEuNy0yLjItLjItMS42IDEtMy4xIDIuNi0zLjEuNCAwIC44IDAgMS4xLjEuNiAwIC44LS4xIDEuMS0uN3ptLS42IDMuM2MwLS45LS43LTEuNi0xLjYtMS42LS45IDAtMS43LjctMS43IDEuNiAwIC45LjcgMS42IDEuNiAxLjYgMSAuMSAxLjctLjcgMS43LTEuNnpNOS4zIDguN2MtLjUtLjctLjktMS40LTEuNC0yLjF2LS4yYzEuMi0xLjcgMi4zLTMuNSAzLjUtNS4yLjEtLjIuMy0uMi41IDAgLjMuMy40LjguNSAxLjIuMS44LS4yIDEuNi0uNSAyLjQtLjYgMS4xLTEuMyAyLjItMi4xIDMuMy0uMi4yLS4zLjQtLjUuNnpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tYWN0aW9uZGVsZXRlXFxcIj48cGF0aCBkPVxcXCJNOCAyQzQuNyAyIDIgNC43IDIgOHMyLjcgNiA2IDYgNi0yLjcgNi02LTIuNy02LTYtNnptMyA4bC0xIDEtMi0yLTIgMi0xLTEgMi0yLTItMiAxLTEgMiAyIDItMiAxIDEtMiAyIDIgMnpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAzMiAzMlxcXCIgaWQ9XFxcImljb24tYWN0aW9uZHJhZ2VsZW1lbnRcXFwiPjxwYXRoIGQ9XFxcIk00IDEwaDI0YTIgMiAwIDAgMCAwLTRINGEyIDIgMCAwIDAgMCA0em0yNCA0SDRhMiAyIDAgMCAwIDAgNGgyNGEyIDIgMCAwIDAgMC00em0wIDhINGEyIDIgMCAwIDAgMCA0aDI0YTIgMiAwIDAgMCAwLTR6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWFjdGlvbmVkaXRlbGVtZW50XFxcIj48cGF0aCBkPVxcXCJNMSAxNWg0bC00LTR6TTcgNWwtNSA1IDQgNCA1LTV6TTE0IDZsLTQtNC0yIDIgNCA0ek05IDE0aDV2MUg5elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1hY3Rpb25mb250bGFyZ2VyXFxcIj48cGF0aCBkPVxcXCJNNyA2SDVsLTMgOEgxdjFoNHYtMUg0bC42Ny0yaDIuNjdMOCAxNEg3djFoNHYtMWgtMUw3IDZ6bS0yIDVsMS0zIDEgM0g1ek0xNSAzaC0yVjFoLTJ2Mkg5djJoMnYyaDJWNWgyelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1hY3Rpb25mb250c21hbGxlclxcXCI+PHBhdGggZD1cXFwiTTcgNUg1bC0zIDhIMXYxaDR2LTFINGwuNjctMmgyLjY3TDggMTNIN3YxaDR2LTFoLTFMNyA1em0tMiA1bDEtMyAxIDNINXpNOSAyaDZ2Mkg5elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1hY3Rpb25oaWRldGl0bGVcXFwiPjxwYXRoIGQ9XFxcIk0xNS43IDcuN2MtLjEtLjEtMS41LTEuNy0zLjQtM0wxNSAybC0xLTEtMi45IDIuOUMxMC4xIDMuNCA5IDMgOCAzIDQuMyAzIC40IDcuNS4zIDcuN0wwIDhsLjMuM2MuMS4xIDEuNSAxLjcgMy40IDNMMSAxNGwxIDEgMi45LTIuOWMxIC41IDIuMS45IDMuMS45IDMuNyAwIDcuNi00LjUgNy43LTQuN0wxNiA4bC0uMy0uM3pNMiA4Yy44LS44IDMuNC0zIDYtMyAuNiAwIC42IDAgMCAwLTEuNyAwLTMgMS4zLTMgMyAwIC42LjIgMS4xLjQgMS42bC0uNi42QzMuNSA5LjQgMi41IDguNSAyIDh6bTYgM2MtLjYgMC0uNiAwIDAgMCAxLjcgMCAzLTEuMyAzLTMgMC0uNi0uMi0xLjEtLjQtMS42bC42LS42YzEuMy44IDIuMyAxLjcgMi44IDIuMi0uOC44LTMuNCAzLTYgM3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tYWN0aW9uaXNyZXF1aXJlZFxcXCI+PGNpcmNsZSBjeD1cXFwiNy41XFxcIiBjeT1cXFwiMTMuNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48cGF0aCBkPVxcXCJNOCAxMGwxLTlINmwxIDl6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWFjdGlvbml0YWxpY1xcXCI+PHBhdGggZD1cXFwiTTE0IDFIMkwxIDRoMWwuMzMtMUg3TDUgMTNIM3YxaDZ2LTFIN0w5IDNoNC4zM0wxMyA0aDFsMS0zelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1hY3Rpb25ub3RyZXF1aXJlZFxcXCI+PHBhdGggZD1cXFwiTTE0IDFMOC40IDYuNiA5IDFINmwuOCA3LjJMMSAxNGwxIDFMMTUgMnpcXFwiPjwvcGF0aD48Y2lyY2xlIGN4PVxcXCI3LjVcXFwiIGN5PVxcXCIxMy41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1hY3Rpb25wYXN0ZVxcXCI+PHBhdGggZD1cXFwiTTEwIDFIMXYxMWgzVjRoNlYxek03IDNINFYyaDN2MXpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNMTAgNUg1djEwaDhWOGwtMy0zem0yIDlINlY2aDR2MmgydjZ6XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTcgMTBoNHYxSDd6TTcgMTJoNHYxSDd6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWFjdGlvbnJlZG9cXFwiPjxwYXRoIGQ9XFxcIk0yIDhjMCAzLjMgMi43IDYgNiA2IDIuNCAwIDQuNC0xLjQgNS40LTMuNGwtMS43LTEuMWMtLjYgMS40LTIgMi41LTMuNyAyLjUtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNGMxLjEgMCAyLjEuNSAyLjggMS4yTDkgN2g1VjJsLTEuOCAxLjhDMTEuMSAyLjcgOS43IDIgOCAyIDQuNyAyIDIgNC43IDIgOHpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tYWN0aW9uc2V0dGluZ3NcXFwiPjxwYXRoIGQ9XFxcIk0xNSA5VjdoLTIuMWMtLjEtLjYtLjQtMS4yLS43LTEuOGwxLjUtMS41LTEuNC0xLjQtMS41IDEuNWMtLjYtLjMtMS4yLS42LTEuOC0uN1YxSDd2Mi4xYy0uNi4xLTEuMi40LTEuOC43TDMuOCAyLjMgMi4zIDMuOGwxLjUgMS41Yy0uMy41LS42IDEuMS0uNyAxLjdIMXYyaDIuMWMuMS42LjQgMS4yLjcgMS44bC0xLjUgMS41IDEuNCAxLjQgMS41LTEuNWMuNS4zIDEuMS42IDEuOC43VjE1aDJ2LTIuMWMuNi0uMSAxLjItLjQgMS44LS43bDEuNSAxLjUgMS40LTEuNC0xLjUtMS41Yy4zLS41LjYtMS4xLjctMS44SDE1em0tNyAyYy0xLjcgMC0zLTEuMy0zLTNzMS4zLTMgMy0zIDMgMS4zIDMgMy0xLjMgMy0zIDN6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWFjdGlvbnNob3d0aXRsZVxcXCI+PHBhdGggZD1cXFwiTTE1LjcgNy43QzE1LjYgNy41IDExLjcgMyA4IDNTLjQgNy41LjMgNy43TDAgOGwuMy4zYy4xLjIgNCA0LjcgNy43IDQuN3M3LjYtNC41IDcuNy00LjdMMTYgOGwtLjMtLjN6TTggMTFjLTIuNiAwLTUuMi0yLjItNi0zIC44LS44IDMuNC0zIDYtM3M1LjIgMi4yIDYgM2MtLjguOC0zLjQgMy02IDN6XFxcIj48L3BhdGg+PGNpcmNsZSBjeD1cXFwiOFxcXCIgY3k9XFxcIjhcXFwiIHI9XFxcIjNcXFwiPjwvY2lyY2xlPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1hY3Rpb251bmRlcmxpbmVcXFwiPjxwYXRoIGQ9XFxcIk0yIDEzaDEydjFIMnpNMTMgMUgydjNoMVYzaDR2OEg1djFoNnYtMUg5VjNoNHYxaDFWMXpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tYWN0aW9udW5kb1xcXCI+PHBhdGggZD1cXFwiTTggMmMtMS43IDAtMy4xLjctNC4yIDEuOEwyIDJ2NWg1TDUuMiA1LjJDNS45IDQuNSA2LjkgNCA4IDRjMi4yIDAgNCAxLjggNCA0cy0xLjggNC00IDRjLTEuNyAwLTMuMS0xLjEtMy43LTIuNWwtMS43IDEuMWMxIDIgMyAzLjQgNS40IDMuNCAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNnpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tYWRkXFxcIj48cGF0aCBkPVxcXCJNMTQgN2gtNFYzSDd2NEgzdjNoNHY0aDN2LTRoNHpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxMCAxMFxcXCIgaWQ9XFxcImljb24tYXJyb3dfZG93bl8xMHgxMFxcXCI+PHBhdGggZD1cXFwiTTIgMkwwIDRsNSA1IDUtNS0yLTItMyAzelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDEwIDEwXFxcIiBpZD1cXFwiaWNvbi1hcnJvd191cF8xMHgxMFxcXCI+PHBhdGggZD1cXFwiTTggOWwyLTItNS01LTUgNSAyIDIgMy0zelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDM0IDM0XFxcIiBpZD1cXFwiaWNvbi1hcnJvd2Rvd25fMzR4MzRcXFwiPjxzdHlsZT48IVtDREFUQVsuc3Qwe2ZpbGw6I2ZmZn1dXT48L3N0eWxlPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0xMiAxNmwyLTIgMyAzIDMtMyAyIDItNSA1elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIiBpZD1cXFwiaWNvbi1jbG91ZF8yNHgyNFxcXCI+PHN0eWxlPjwhW0NEQVRBWy5zdDB7ZmlsbDojMWFiMzk0fV1dPjwvc3R5bGU+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTc1IDYuNUM3NSA0LjYgNzMuNCAzIDcxLjUgM1M2OCA0LjYgNjggNi41YzAgMS40LjggMi42IDIgMy4yLS4yIDEtLjcgMS44LTEuNyAyLjMtLjQuMi0uOS40LTEuMy42LS44LjMtMS43LjYtMi41LjktLjIuMS0uMy4xLS41LjJ2LTZjMS4yLS42IDItMS44IDItMy4yQzY2IDIuNiA2NC40IDEgNjIuNSAxUzU5IDIuNiA1OSA0LjVjMCAxLjQuOCAyLjYgMiAzLjJ2OS43Yy0xLjIuNi0yIDEuOC0yIDMuMiAwIDEuOCAxLjYgMy40IDMuNSAzLjRzMy41LTEuNiAzLjUtMy41YzAtMS40LS44LTIuNi0yLTMuMi4xLS41LjQtMSAuOS0xLjIuMy0uMS42LS4zIDEtLjQgMS4xLS40IDIuMS0uNyAzLjItMS4yIDEuNC0uNiAyLjUtMS41IDMuMS0yLjkuMi0uNC4zLTEuMS40LTEuOEM3NCA5LjMgNzUgOC4xIDc1IDYuNXpNNjIuNSAzYy44IDAgMS41LjcgMS41IDEuNVM2My4zIDYgNjIuNSA2IDYxIDUuMyA2MSA0LjUgNjEuNyAzIDYyLjUgM3ptMCAxOWMtLjggMC0xLjUtLjctMS41LTEuNXMuNy0xLjUgMS41LTEuNSAxLjUuNyAxLjUgMS41LS43IDEuNS0xLjUgMS41ek03MCA2LjVjMC0uOC43LTEuNSAxLjUtMS41czEuNS43IDEuNSAxLjVTNzIuMyA4IDcxLjUgOCA3MCA3LjMgNzAgNi41ek05IDE4bDEgMSAyLTJ2Nmgydi02bDIgMiAxLTEtNC00elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0yMC45IDcuOWMuMS0uMy4xLS42LjEtLjkgMC0yLjgtMi4yLTUtNS01LTIuNiAwLTQuNyAxLjktNC45IDQuNEMxMC4zIDUuNiA5LjIgNSA4IDUgNS44IDUgNCA2LjggNCA5di4yYy0xLjcuNC0zIDEuMy0zIDMuOCAwIDIuMyAyLjQgMyA0IDNoM2w1LTUgNSA1YzIuOCAwIDUtMS4yIDUtNCAwLTEuNy0uOC0zLjEtMi4xLTQuMXpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tYXV0b2NvbXBsZXRlXFxcIj48cGF0aCBkPVxcXCJNMTUgNkg3djEwaDl2LTFIOHYtMmg3djJoMVY2aC0xem0wIDZIOHYtMmg3djJ6bTAtM0g4VjdoN3Yyek0zIDEwSDFWNGgyVjNIMHY4aDN6TTE0IDVoMVYzSDZ2MWg4ek01IDFoMVYwSDN2MWgxdjExSDN2MWgzdi0xSDV6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWJhcnJhdGluZ1xcXCI+PHBhdGggZD1cXFwiTTEyLjEgMTVsLTQuNi0yLjRMMi45IDE1bC45LTUuMUwwIDYuM2w1LjItLjdMNy41IDFsMi4zIDQuNiA1LjIuNy0zLjggMy42LjkgNS4xelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1kYXRlcGlja2VyXFxcIj48cGF0aCBkPVxcXCJNMyA3aDJ2Mkgzek03IDExaDJ2Mkg3ek0zIDExaDJ2Mkgzek0xMSAxMWgydjJoLTJ6TTExIDdoMnYyaC0yek0xMCA2SDZ2NGg0VjZ6TTkgOUg3VjdoMnYyek00IDBoMXYzSDR6TTExIDBoMXYzaC0xelxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk0xMyAydjJoLTNWMkg2djJIM1YySDB2MTRoMTZWMmgtM3ptMiAxM0gxVjVoMTR2MTB6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWVkaXRvclxcXCI+PHBhdGggZD1cXFwiTTEgM2gydjVIMnYxaDRWOEg1VjNoMnYxaDFWMUgwdjNoMXpNMTAgNWg2djFoLTZ6TTEwIDhoNnYxaC02ek0wIDExaDE2djFIMHpNMCAxNGgxNnYxSDB6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLW1pY3JvcGhvbmVcXFwiPjxwYXRoIGQ9XFxcIk0xMSAzLjRDMTEgMi4xIDkuOSAxIDguNiAxaC0uMkM3LjEgMSA2IDIuMSA2IDMuNFY1aDVWMy40ek04LjQgMTBoLjNDOS45IDEwIDExIDguOSAxMSA3LjZWNkg2djEuNkM2IDguOSA3LjEgMTAgOC40IDEwelxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk0xMiA2di45YzAgMi4yLTEuNiA0LjEtMy41IDQuMVM1IDkuMSA1IDYuOVY2SDR2MWMwIDIuNSAxLjggNC42IDQgNC45VjE0SDZ2MWg1di0xSDl2LTIuMWMyLjItLjMgNC0yLjQgNC00LjlWNmgtMXpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tbm91aXNsaWRlclxcXCI+PHBhdGggZD1cXFwiTTAgMTBoMTZ2Mkgwek0yIDR2M2wyIDIgMi0yVjR6TTEwIDR2M2wyIDIgMi0yVjR6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLXNpZ25hdHVyZXBhZFxcXCI+PHBhdGggZD1cXFwiTTAgMHYxNWgxNlYwSDB6bTE1IDE0SDFWMWgxNHYxM3pcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNMi42IDEwLjJjLjEuMS4xLjIuMi4zLS4yLjMtLjQuNi0uNy44bC43LjdjLjItLjMuNS0uNi43LS45aC4xYy4yLjEuOS4xIDEuMS4xIDEuNS0uMSAyLjMtLjUgMi44LS44aC4xbC42LjNoLjZjLjctLjEgMS45LS44IDIuNS0xLjIuMi0uMS41LS4zLjUtLjN2LjJjMCAuMiAwIC4zLjEuNS4xLjMuMy40LjYuNS4yIDAgLjQgMCAuNS0uMS4xLS4zLjgtMSAxLTEuM1Y4Yy0uMS4xLS4zLjItLjQuNC0uMi4yLS41LjQtLjguNmwtLjEuMXYtLjNjMC0uMiAwLS40LS4xLS41LS4xLS40LS41LS42LS45LS40LS4xLjEtLjQuMi0uNi40LS45LjYtMiAxLjItMi4yIDEuMy0uMSAwLS4yLjEtLjQuMWwuMS0uMWMuMy0uMy43LS42LjktMSAuMi0uMy4zLS42LjMtLjkgMC0uNCAwLS43LS4yLTEuMS0uMS0uMy0uNC0uNi0uOC0uNy0uMi0uMS0uNC0uMS0uNyAwLS4yLjEtLjUuMi0uNy40LS4zLjMtLjUuNi0uNiAxLS4xLjItLjEuNS0uMS43IDAgLjQgMCAuNy4xIDEuMSAwIC4yLjEuMy4yLjUtLjYuMy0xLjUuNy0yLjguNnYtLjFjMC0uMS4xLS4zLjItLjQuNC0uNy43LTEuNC45LTIuMS4yLS42LjMtMS4zLjMtMS45VjQuM2MwLS4zLS4xLS42LS4zLS44LS4yLS40LS42LS42LTEtLjUtLjMuMS0uNS4yLS43LjQtLjMuMi0uNi41LS44LjktLjIuNS0uNCAxLS42IDEuNi0uMS41LS4yIDEtLjIgMS41czAgMSAuMSAxLjRjLjEuNi4zIDEgLjUgMS40em01LTIuNWMuMS0uMi4yLS41LjQtLjYuMi0uMi40LS4yLjctLjIuMSAwIC4yLjEuMi4yLjEuMy4xLjYtLjEuOC0uMi4zLS40LjYtLjYuOC0uMi4yLS4zLjMtLjUuNC0uMS0uMS0uMS0uMi0uMS0uNHYtMXpNMyA2LjdjLjEtLjYuMy0xLjMuNi0xLjguMS0uMy4zLS41LjUtLjguMSAwIC4yLS4xLjItLjEuMS0uMS4yIDAgLjMuMS4xLjEuMS4zLjEuNCAwIC40LjEuOSAwIDEuMyAwIC44LS4yIDEuNi0uNSAyLjMtLjMuNS0uNSAxLS44IDEuNS0uMSAwLS4yLS4xLS4yLS4yLS4yLS42LS4zLTEuMi0uMy0xLjggMC0uMy4xLS42LjEtLjl6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLXNvcnRhYmxlanNcXFwiPjxwYXRoIGQ9XFxcIk03IDFoOXYySDd6TTkgNmg3djJIOXpNMTEgMTFoNXYyaC01ek01IDEwbDEgMWMtMi4yIDAtNC0xLjgtNC00IDAtMS45IDEuMy0zLjQgMy0zLjl2LTJDMi4yIDEuNSAwIDQgMCA3YzAgMy4zIDIuNyA2IDUuOSA2SDZsLTEgMSAxIDEgMy0zLTMtMy0xIDF6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLXRhZ2JveFxcXCI+PHBhdGggZD1cXFwiTTE1IDExSDBWNWgxNXY2ek0xIDEwaDEzVjZIMXY0elxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk0yIDdoNHYySDJ6TTcgN2g0djJIN3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCIgaWQ9XFxcImljb24tZGVsZXRlXzI0eDI0XFxcIj48cGF0aCBmaWxsLXJ1bGU9XFxcImV2ZW5vZGRcXFwiIGNsaXAtcnVsZT1cXFwiZXZlbm9kZFxcXCIgZmlsbD1cXFwiIzFBQjM5NFxcXCIgZD1cXFwiTTYgOGwyLTIgNCA0IDQtNCAyIDItNCA0IDQgNC0yIDItNC00LTQgNC0yLTIgNC00LTQtNHpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tZGVsZXRlLWNyb3NzXFxcIj48cGF0aCBkPVxcXCJNMTUgNGwtMy0zLTQgNC00LTQtMyAzIDQgNC00IDQgMyAzIDQtNCA0IDQgMy0zLTQtNHpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNCAxNFxcXCIgaWQ9XFxcImljb24tZG90c1xcXCI+PGNpcmNsZSBjeD1cXFwiMS41XFxcIiBjeT1cXFwiNi41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjYuNVxcXCIgY3k9XFxcIjYuNVxcXCIgcj1cXFwiMS41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCIxMS41XFxcIiBjeT1cXFwiNi41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE0IDE0XFxcIiBpZD1cXFwiaWNvbi1kb3RzYWN0aXZlXFxcIj48Y2lyY2xlIGN4PVxcXCIxLjVcXFwiIGN5PVxcXCI2LjVcXFwiIHI9XFxcIjEuNVxcXCI+PC9jaXJjbGU+PGNpcmNsZSBjeD1cXFwiNi41XFxcIiBjeT1cXFwiNi41XFxcIiByPVxcXCIxLjVcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjExLjVcXFwiIGN5PVxcXCI2LjVcXFwiIHI9XFxcIjEuNVxcXCI+PC9jaXJjbGU+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWRyYWctaXRlbVxcXCI+PGNpcmNsZSBjeD1cXFwiNVxcXCIgY3k9XFxcIjJcXFwiIHI9XFxcIjJcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjVcXFwiIGN5PVxcXCI4XFxcIiByPVxcXCIyXFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCI1XFxcIiBjeT1cXFwiMTRcXFwiIHI9XFxcIjJcXFwiPjwvY2lyY2xlPjxjaXJjbGUgY3g9XFxcIjExXFxcIiBjeT1cXFwiMlxcXCIgcj1cXFwiMlxcXCI+PC9jaXJjbGU+PGNpcmNsZSBjeD1cXFwiMTFcXFwiIGN5PVxcXCI4XFxcIiByPVxcXCIyXFxcIj48L2NpcmNsZT48Y2lyY2xlIGN4PVxcXCIxMVxcXCIgY3k9XFxcIjE0XFxcIiByPVxcXCIyXFxcIj48L2NpcmNsZT48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCIgaWQ9XFxcImljb24tZWRpdFxcXCI+PGcgZmlsbC1ydWxlPVxcXCJldmVub2RkXFxcIiBjbGlwLXJ1bGU9XFxcImV2ZW5vZGRcXFwiPjxwYXRoIGQ9XFxcIk0xOSA0bC05IDkgNCA0IDktOS00LTR6TTggMTV2NGg0bC00LTR6TTEgMTd2Mmg0di0ySDF6XFxcIj48L3BhdGg+PC9nPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1ib29sZWFuXFxcIj48cGF0aCBkPVxcXCJNMCAxNmgxMFY2SDB2MTB6bTItNmwyIDIgNC00IDEgMS01IDUtMy0zIDEtMXpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNNSAxdjRoMVYyaDh2OGgtM3YxaDRWMXpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tY2hlY2tib3hcXFwiPjxwYXRoIGQ9XFxcIk0xIDF2MTRoMTRWMUgxem02IDEwTDQgOGwxLTEgMiAyIDQtNCAxIDEtNSA1elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1jb21tZW50XFxcIj48cGF0aCBkPVxcXCJNOCAyQzQuMSAyIDEgNC4yIDEgN2MwIDEuOSAxLjUgMy42IDMuOCA0LjRDNC42IDEzLjEgMyAxNCAzIDE0czEuNS0uMiAyLjctLjljLjQtLjIuOS0uOCAxLjMtMS4yLjMuMS42LjEgMSAuMSAzLjkgMCA3LTIuMiA3LTVzLTMuMS01LTctNXpNNCA4Yy0uNiAwLTEtLjQtMS0xcy40LTEgMS0xIDEgLjQgMSAxLS40IDEtMSAxem00IDBjLS42IDAtMS0uNC0xLTFzLjQtMSAxLTEgMSAuNCAxIDEtLjQgMS0xIDF6bTQgMGMtLjYgMC0xLS40LTEtMXMuNC0xIDEtMSAxIC40IDEgMS0uNCAxLTEgMXpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tZGVmYXVsdFxcXCI+PHBhdGggZD1cXFwiTTAgNGg0VjBIMHY0em02IDBoNFYwSDZ2NHptNi00djRoNFYwaC00ek0wIDEwaDRWNkgwdjR6bTYgMGg0VjZINnY0em02IDBoNFY2aC00djR6TTAgMTZoNHYtNEgwdjR6bTYgMGg0di00SDZ2NHptNiAwaDR2LTRoLTR2NHpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tZHJvcGRvd25cXFwiPjxwYXRoIGQ9XFxcIk0xIDF2NmgxNFYxSDF6bTEwIDVMOCAzbDEtMSAyIDIgMi0yIDEgMS0zIDN6bS04IDVoMTJWOUgzdjJ6bTAgNGgxMnYtMkgzdjJ6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWV4cHJlc3Npb25cXFwiPjxwYXRoIGQ9XFxcIk0xNSA5bC00IDQtMi0yLTEgMSAzIDMgNS01ek00IDR2MWgydjFIM3YzaDRWNEg0em0yIDRINFY3aDJ2MXpNOCA4aDF2MUg4elxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk0xIDFoMTN2N2wxLTFWMEgwdjEyaDZsMS0xSDF6XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTEwIDRoMXYxaC0xek05IDVoMXYxSDl6TTExIDVoMXYxaC0xek0xMSAzaDF2MWgtMXpNOSAzaDF2MUg5elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1maWxlXFxcIj48cGF0aCBkPVxcXCJNOSAwdjVoNXpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNOCAwSDJ2MTZoMTJWNkg4elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1mbG93cGFuZWxcXFwiPjxwYXRoIGQ9XFxcIk0xNCA0aDJ2MWgtMnpNMCA0aDJ2MUgwek0xNCA2aDJ2MWgtMnpNMCA2aDJ2MUgwek0xNCA4aDJ2MWgtMnpNMCA4aDJ2MUgwek0xNCAxMGgydjFoLTJ6TTAgMTBoMnYxSDB6TTAgMmgxNnYxSDB6TTAgMGgxNnYxSDB6TTAgMTJoMTZ2MUgwek0wIDE0aDE2djFIMHpNMTEgNEw3IDggNSA2IDQgN2wzIDMgNS01elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1odG1sXFxcIj48cGF0aCBkPVxcXCJNNCA0TDAgOGw0IDQgMS0xLTMtMyAzLTN6TTExIDRsLTEgMSAzIDMtMyAzIDEgMSA0LTR6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWltYWdlXFxcIj48cGF0aCBkPVxcXCJNMiAzdjloMTFWM0gyem00IDFjLjYgMCAxIC40IDEgMXMtLjQgMS0xIDEtMS0uNC0xLTEgLjQtMSAxLTF6bS0zIDdsMi0zIDEgMSAyLTMgNCA1SDN6XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTEgMTN2LTJIMHYzaDN2LTF6TTEgNFYyaDJWMUgwdjN6TTEyIDF2MWgydjJoMVYxek0xNCAxM2gtMnYxaDN2LTNoLTF6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLWltYWdlcGlja2VyXFxcIj48cGF0aCBkPVxcXCJNMTUgMTRIMFYxaDE1djEzek0xIDEzaDEzVjJIMXYxMXpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNMiAzdjloMTFWM0gyem00IDFjLjYgMCAxIC40IDEgMXMtLjQgMS0xIDEtMS0uNC0xLTEgLjQtMSAxLTF6bS0zIDdsMi0zIDEgMSAyLTMgNCA1SDN6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLW1hdHJpeFxcXCI+PHBhdGggZD1cXFwiTTQgMUMyLjMgMSAxIDIuMyAxIDRzMS4zIDMgMyAzIDMtMS4zIDMtMy0xLjMtMy0zLTN6bTAgNWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6XFxcIj48L3BhdGg+PGNpcmNsZSBjeD1cXFwiNFxcXCIgY3k9XFxcIjRcXFwiIHI9XFxcIjFcXFwiPjwvY2lyY2xlPjxwYXRoIGQ9XFxcIk0xMiA3YzEuNyAwIDMtMS4zIDMtM3MtMS4zLTMtMy0zLTMgMS4zLTMgMyAxLjMgMyAzIDN6bTAtNWMxLjEgMCAyIC45IDIgMnMtLjkgMi0yIDItMi0uOS0yLTIgLjktMiAyLTJ6TTQgOWMtMS43IDAtMyAxLjMtMyAzczEuMyAzIDMgMyAzLTEuMyAzLTMtMS4zLTMtMy0zem0wIDVjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyek0xMiA5Yy0xLjcgMC0zIDEuMy0zIDNzMS4zIDMgMyAzIDMtMS4zIDMtMy0xLjMtMy0zLTN6bTAgNWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLW1hdHJpeGRyb3Bkb3duXFxcIj48cGF0aCBkPVxcXCJNNCAxQzIuMyAxIDEgMi4zIDEgNHMxLjMgMyAzIDMgMy0xLjMgMy0zLTEuMy0zLTMtM3ptMCA1Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpcXFwiPjwvcGF0aD48Y2lyY2xlIGN4PVxcXCI0XFxcIiBjeT1cXFwiNFxcXCIgcj1cXFwiMVxcXCI+PC9jaXJjbGU+PHBhdGggZD1cXFwiTTEyIDdjMS43IDAgMy0xLjMgMy0zcy0xLjMtMy0zLTMtMyAxLjMtMyAzIDEuMyAzIDMgM3ptMC01YzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnpNNCA5Yy0xLjcgMC0zIDEuMy0zIDNzMS4zIDMgMyAzIDMtMS4zIDMtMy0xLjMtMy0zLTN6bTAgNWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6XFxcIj48L3BhdGg+PGNpcmNsZSBjeD1cXFwiNFxcXCIgY3k9XFxcIjEyXFxcIiByPVxcXCIxXFxcIj48L2NpcmNsZT48cGF0aCBkPVxcXCJNMTIgOWMtMS43IDAtMyAxLjMtMyAzczEuMyAzIDMgMyAzLTEuMyAzLTMtMS4zLTMtMy0zem0wIDVjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1tYXRyaXhkeW5hbWljXFxcIj48cGF0aCBkPVxcXCJNMyAxQzEuMyAxIDAgMi4zIDAgNHMxLjMgMyAzIDMgMy0xLjMgMy0zLTEuMy0zLTMtM3ptMCA1Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpcXFwiPjwvcGF0aD48Y2lyY2xlIGN4PVxcXCIzXFxcIiBjeT1cXFwiNFxcXCIgcj1cXFwiMVxcXCI+PC9jaXJjbGU+PHBhdGggZD1cXFwiTTExIDdjMS43IDAgMy0xLjMgMy0zcy0xLjMtMy0zLTMtMyAxLjMtMyAzIDEuMyAzIDMgM3ptMC01YzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnpNMyA5Yy0xLjcgMC0zIDEuMy0zIDNzMS4zIDMgMyAzIDMtMS4zIDMtMy0xLjMtMy0zLTN6bTAgNWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6TTggMTVoMmwtMi0yek05LjAzIDExLjk5bDQuMDMtNC4wMyAxLjk4IDEuOTgtNC4wMyA0LjAzelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1tdWx0aXBsZXRleHRcXFwiPjxwYXRoIGQ9XFxcIk0wIDJ2MTJoMTZWMkgwem01IDlIMlY5aDN2MnptMC00SDJWNWgzdjJ6bTkgNEg3VjloN3Yyem0wLTRIN1Y1aDd2MnpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tcGFuZWxfZHluYW1pY1xcXCI+PHBhdGggZD1cXFwiTTIgOGgxMHYxSDJ6TTIgMTFoOGwxLTFIMnpNOSAxNmgybC0yLTJ6TTE0IDlsLTQgNCAyIDIgNC00ek0zIDN2MkgybDIgMiAyLTJINVYzek0xMSA1VjNIOXYySDhsMiAyIDItMnpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNMSAxaDEydjdsMS0xVjBIMHYxNGg3bDEtMUgxelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1wYW5lbFxcXCI+PHBhdGggZD1cXFwiTTAgMHYxNmgxNlYwSDB6bTE1IDE1SDFWMWgxNHYxNHpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNMiAxMmgxMnYySDJ6TTIgOWgxMnYySDJ6TTExIDhMOCA1aDJWMmgydjNoMnpNNSA4TDIgNWgyVjJoMnYzaDJ6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLXBhbmVsZHluYW1pY1xcXCI+PHBhdGggZD1cXFwiTTIgOGgxMHYxSDJ6TTIgMTFoOGwxLTFIMnpNOSAxNmgybC0yLTJ6TTE0IDlsLTQgNCAyIDIgNC00ek0zIDN2MkgybDIgMiAyLTJINVYzek0xMSA1VjNIOXYySDhsMiAyIDItMnpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNMSAxaDEydjdsMS0xVjBIMHYxNGg3bDEtMUgxelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1yYWRpb2dyb3VwXFxcIj48cGF0aCBkPVxcXCJNMyAxQzEuMyAxIDAgMi4zIDAgNHMxLjMgMyAzIDMgMy0xLjMgMy0zLTEuMy0zLTMtM3ptMCA0Yy0uNiAwLTEtLjQtMS0xcy40LTEgMS0xIDEgLjQgMSAxLS40IDEtMSAxem0wIDRjLTEuNyAwLTMgMS4zLTMgM3MxLjMgMyAzIDMgMy0xLjMgMy0zLTEuMy0zLTMtM3ptMCA0Yy0uNiAwLTEtLjQtMS0xcy40LTEgMS0xIDEgLjQgMSAxLS40IDEtMSAxek04IDN2Mmg4VjNIOHptMCAxMGg4di0ySDh2MnpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tcmFua2luZ1xcXCI+PHBhdGggZD1cXFwiTTE2IDB2M0gwVjBoMTZ6TTAgMTFoMTBWOEgwdjN6bTAtNGgxM1Y0SDB2M3ptMCA4aDd2LTNIMHYzelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1yYXRpbmdcXFwiPjxwYXRoIGQ9XFxcIk0wIDdoMWwxLTF2NWgxVjVIMkwwIDd6bTUgNWg1VjRINXY4em0xLTVoMlY2SDZWNWgzdjNIN3YyaDJ2MUg2Vjd6bTYtMnYxaDJ2MWgtMnYxaDJ2MmgtMnYxaDNWNWgtM3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tdGV4dFxcXCI+PHBhdGggZD1cXFwiTTIgMXYzaDFWM2g0djEwSDV2MWg2di0xSDlWM2g0djFoMVYxSDJ6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMjQgMjRcXFwiIGlkPVxcXCJpY29uLWZvcmtfMjR4MjRcXFwiPjxwYXRoIG9wYWNpdHk9XFxcIi45XFxcIiBkPVxcXCJNLTQwLTIwYy0xLjIgMC0yLS45LTItMnYtMmMwLTEuMS45LTIgMi0yaC4xYzEuMSAwIDIgLjkgMiAydjIuMWMtLjEgMS0xIDEuOS0yLjEgMS45elxcXCI+PC9wYXRoPjxwYXRoIG9wYWNpdHk9XFxcIi41XFxcIiBkPVxcXCJNLTQwLTJjLTEuMiAwLTItLjktMi0ydi0yYzAtMS4xLjktMiAyLTJoLjFjMS4xIDAgMiAuOSAyIDJ2MmMtLjEgMS4xLTEgMi0yLjEgMnpcXFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVxcXCIuMlxcXCIgZD1cXFwiTS01Mi0xNGMwLTEuMi45LTIgMi0yaDIuMWMxLjEgMCAyIC45IDIgMnYuMWMwIDEuMS0uOSAyLTIgMkgtNTBjLTEuMS0uMS0yLTEtMi0yLjF6XFxcIj48L3BhdGg+PHBhdGggb3BhY2l0eT1cXFwiLjdcXFwiIGQ9XFxcIk0tMzQtMTRjMC0xLjIuOS0yIDItMmgyLjFjMS4xIDAgMiAuOSAyIDJ2LjFjMCAxLjEtLjkgMi0yIDJILTMyYy0xLjEtLjEtMi0xLTItMi4xelxcXCI+PC9wYXRoPjxwYXRoIG9wYWNpdHk9XFxcIi4xXFxcIiBkPVxcXCJNLTQ0LjUtMTguNmMtLjguOC0yLjEuOC0yLjguMWwtMS4yLTEuMmMtLjgtLjgtLjgtMiAwLTIuOGwuMS0uMWMuOC0uOCAyLS44IDIuOCAwbDEuMiAxLjJjLjcuOC43IDIuMS0uMSAyLjh6XFxcIj48L3BhdGg+PHBhdGggb3BhY2l0eT1cXFwiLjZcXFwiIGQ9XFxcIk0tMzEuNS01LjVjLS44LjgtMi4xLjgtMi44LjFsLTEuMi0xLjJjLS44LS44LS44LTIgMC0yLjhsLjEtLjFjLjgtLjggMi0uOCAyLjggMGwxLjIgMS4yYy43LjguNyAyLS4xIDIuOHpcXFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVxcXCIuM1xcXCIgZD1cXFwiTS00OC41LTUuNWMtLjgtLjgtLjgtMi4xLS4xLTIuOGwxLjItMS4yYy44LS44IDItLjggMi44IDBsLjEuMWMuOC44LjggMiAwIDIuOGwtMS4yIDEuMmMtLjcuNy0yIC43LTIuOC0uMXpcXFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVxcXCIuOFxcXCIgZD1cXFwiTS0zNS40LTE4LjVjLS44LS44LS44LTIuMS0uMS0yLjhsMS4yLTEuMmMuOC0uOCAyLS44IDIuOCAwbC4xLjFjLjguOC44IDIgMCAyLjhsLTEuMiAxLjJjLS44LjctMi4xLjctMi44LS4xelxcXCI+PC9wYXRoPjxwYXRoIG9wYWNpdHk9XFxcIi45XFxcIiBmaWxsPVxcXCIjOUQ5RkExXFxcIiBkPVxcXCJNLTIyLTEzbDItMiA0IDQgOS05IDIgMi0xMSAxMXpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNNDEtMTloLTEuMmMtLjItLjctLjQtMS4zLS44LTEuOWwuOC0uOGMuNC0uNC40LTEgMC0xLjRsLS43LS43Yy0uNC0uNC0xLS40LTEuNCAwbC0uOC44Yy0uNi0uNC0xLjItLjYtMS45LS44Vi0yNWMwLS41LS41LTEtMS0xaC0xYy0uNSAwLTEgLjUtMSAxdjEuMmMtLjcuMi0xLjMuNC0xLjkuOGwtLjgtLjhjLS40LS40LTEtLjQtMS40IDBsLS43LjdjLS40LjQtLjQgMSAwIDEuNGwuOC44Yy0uNC42LS42IDEuMi0uOCAxLjlIMjZjLS41IDAtMSAuNS0xIDF2MWMwIC41LjUgMSAxIDFoMS4yYy4yLjcuNCAxLjMuOCAxLjlsLS44LjhjLS40LjQtLjQgMSAwIDEuNGwuNy43Yy40LjQgMSAuNCAxLjQgMGwuOC0uOGMuNi40IDEuMi42IDEuOS44djEuMmMwIC41LjUgMSAxIDFoMWMuNSAwIDEtLjUgMS0xdi0xLjJjLjctLjIgMS4zLS40IDEuOS0uOGwuOC44Yy40LjQgMSAuNCAxLjQgMGwuNy0uN2MuNC0uNC40LTEgMC0xLjRsLS44LS44Yy40LS42LjYtMS4yLjgtMS45SDQxYy41IDAgMS0uNSAxLTF2LTFjMC0uNS0uNS0xLTEtMXptLTcuNSA1LjVjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNHpcXFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVxcXCIuOVxcXCIgZmlsbD1cXFwiIzlEOUZBMVxcXCIgZD1cXFwiTTEzLTE1di0zaC0xLjJjLS4xLS40LS4zLS44LS41LTEuMmwuOS0uOS0yLjItMi0uOS45Yy0uNC0uMi0uOC0uNC0xLjItLjVWLTIzSDV2MS4yYy0uNC4xLS44LjMtMS4yLjVsLS44LS44TC44LTIwbC45LjljLS4yLjQtLjQuOC0uNSAxLjJIMHYzaDEuMmMuMS40LjMuOC41IDEuMmwtLjkuN0wzLTEwLjhsLjktLjljLjQuMi44LjQgMS4yLjV2MS4yaDN2LTEuMmMuNC0uMS44LS4zIDEuMi0uNWwuOS45IDIuMS0yLjEtLjktLjljLjItLjQuNC0uOC41LTEuMkgxM3ptLTYuNSAxLjVjLTEuNyAwLTMtMS4zLTMtM3MxLjMtMyAzLTMgMyAxLjMgMyAzLTEuMyAzLTMgM3pcXFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVxcXCIuNlxcXCIgZmlsbD1cXFwiIzlEOUZBMVxcXCIgZD1cXFwiTTIzLTl2LTJoLTEuMWMtLjEtLjQtLjItLjctLjQtMWwuOC0uOC0xLjQtMS40LS45LjhjLS4zLS4yLS43LS4zLTEtLjRWLTE1aC0ydjEuMWMtLjQuMS0uNy4yLTEgLjRsLS44LS44LTEuNCAxLjQuOC44Yy0uMi4zLS4zLjctLjQgMUgxM3YyaDEuMWMuMS40LjIuNy40IDFsLS44LjggMS40IDEuNC45LS43Yy4zLjIuNy4zIDEgLjRWLTVoMnYtMS4xYy40LS4xLjctLjIgMS0uNGwuOC44IDEuNC0xLjQtLjgtLjljLjItLjMuMy0uNy40LTFIMjN6bS01IDFjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyelxcXCI+PC9wYXRoPjxwYXRoIG9wYWNpdHk9XFxcIi41XFxcIiBmaWxsPVxcXCIjOUQ5RkExXFxcIiBkPVxcXCJNLTY5LTdoM3Y1aC0zelxcXCI+PC9wYXRoPjxwYXRoIG9wYWNpdHk9XFxcIi45XFxcIiBmaWxsPVxcXCIjOUQ5RkExXFxcIiBkPVxcXCJNLTY5LTIzaDN2NWgtM3pcXFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVxcXCIuMlxcXCIgZmlsbD1cXFwiIzlEOUZBMVxcXCIgZD1cXFwiTS03Mi45OTMtMTMuOTkzdjNoLTV2LTN6XFxcIj48L3BhdGg+PHBhdGggb3BhY2l0eT1cXFwiLjdcXFwiIGZpbGw9XFxcIiM5RDlGQTFcXFwiIGQ9XFxcIk0tNTYuOTkzLTEzLjk5M3YzaC01di0zelxcXCI+PC9wYXRoPjxwYXRoIG9wYWNpdHk9XFxcIi42XFxcIiBmaWxsPVxcXCIjOUQ5RkExXFxcIiBkPVxcXCJNLTY0LjYxNS03LjU0OWwyLjEyMS0yLjEyIDMuNTM2IDMuNTM1LTIuMTIyIDIuMTIxelxcXCI+PC9wYXRoPjxwYXRoIG9wYWNpdHk9XFxcIi4xXFxcIiBmaWxsPVxcXCIjOUQ5RkExXFxcIiBkPVxcXCJNLTc1Ljk4LTE4Ljc5MWwyLjEyMS0yLjEyMiAzLjUzNiAzLjUzNi0yLjEyMiAyLjEyMXpcXFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVxcXCIuM1xcXCIgZmlsbD1cXFwiIzlEOUZBMVxcXCIgZD1cXFwiTS03Mi41MDUtOS42NjlsMi4xMjEgMi4xMjEtMy41MzUgMy41MzYtMi4xMjItMi4xMjF6XFxcIj48L3BhdGg+PHBhdGggb3BhY2l0eT1cXFwiLjhcXFwiIGZpbGw9XFxcIiM5RDlGQTFcXFwiIGQ9XFxcIk0tNjEuMTQtMjAuOTEybDIuMTIxIDIuMTIxLTMuNTM1IDMuNTM2LTIuMTIyLTIuMTIxelxcXCI+PC9wYXRoPjxwYXRoIGZpbGw9XFxcIiMxQUIzOTRcXFwiIGQ9XFxcIk0yMSA2LjVDMjEgNC42IDE5LjQgMyAxNy41IDNTMTQgNC42IDE0IDYuNWMwIDEuNC44IDIuNiAyIDMuMi0uMiAxLS43IDEuOC0xLjcgMi4zLS40LjItLjkuNC0xLjMuNi0uOC4zLTEuNy42LTIuNS45LS4yLjEtLjMuMS0uNS4ydi02YzEuMi0uNiAyLTEuOCAyLTMuMkMxMiAyLjYgMTAuNCAxIDguNSAxUzUgMi42IDUgNC41YzAgMS40LjggMi42IDIgMy4ydjkuN2MtMS4yLjYtMiAxLjgtMiAzLjJDNSAyMi40IDYuNiAyNCA4LjUgMjRzMy41LTEuNiAzLjUtMy41YzAtMS40LS44LTIuNi0yLTMuMi4xLS41LjQtMSAuOS0xLjIuMy0uMS42LS4zIDEtLjQgMS4xLS40IDIuMS0uNyAzLjItMS4yIDEuNC0uNiAyLjUtMS41IDMuMS0yLjkuMi0uNC4zLTEuMS40LTEuOEMyMCA5LjMgMjEgOC4xIDIxIDYuNXpNOC41IDNjLjggMCAxLjUuNyAxLjUgMS41UzkuMyA2IDguNSA2IDcgNS4zIDcgNC41IDcuNyAzIDguNSAzem0wIDE5Yy0uOCAwLTEuNS0uNy0xLjUtMS41UzcuNyAxOSA4LjUgMTlzMS41LjcgMS41IDEuNVM5LjMgMjIgOC41IDIyek0xNiA2LjVjMC0uOC43LTEuNSAxLjUtMS41czEuNS43IDEuNSAxLjVTMTguMyA4IDE3LjUgOCAxNiA3LjMgMTYgNi41elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDEyIDEyXFxcIiBpZD1cXFwiaWNvbi1nZWFyXFxcIj48cGF0aCBkPVxcXCJNMTIgN1Y1SDkuOWMtLjEtLjQtLjMtLjctLjUtMWwxLjUtMS41LTEuNC0xLjRMOCAyLjZjLS4zLS4yLS42LS40LTEtLjVWMEg1djIuMWMtLjQuMS0uNy4zLTEgLjVMMi41IDEuMSAxLjEgMi41IDIuNiA0Yy0uMi4zLS40LjYtLjUgMUgwdjJoMi4xYy4xLjQuMi43LjQgMUwxLjEgOS41bDEuNCAxLjRMNCA5LjRjLjMuMi43LjMgMSAuNFYxMmgyVjkuOWMuNC0uMS43LS4yIDEtLjRMOS41IDExbDEuNC0xLjRMOS40IDhjLjItLjMuMy0uNy40LTFIMTJ6TTYgOGMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTIgMTJcXFwiIGlkPVxcXCJpY29uLWdlYXJhY3RpdmVcXFwiPjxwYXRoIGQ9XFxcIk0xMiA3VjVIOS45Yy0uMS0uNC0uMy0uNy0uNS0xbDEuNS0xLjUtMS40LTEuNEw4IDIuNmMtLjMtLjItLjYtLjQtMS0uNVYwSDV2Mi4xYy0uNC4xLS43LjMtMSAuNUwyLjUgMS4xIDEuMSAyLjUgMi42IDRjLS4yLjMtLjQuNi0uNSAxSDB2MmgyLjFjLjEuNC4yLjcuNCAxTDEuMSA5LjVsMS40IDEuNEw0IDkuNGMuMy4yLjcuMyAxIC40VjEyaDJWOS45Yy40LS4xLjctLjIgMS0uNEw5LjUgMTFsMS40LTEuNEw5LjQgOGMuMi0uMy4zLS43LjQtMUgxMnpNNiA4Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxMiAxMlxcXCIgaWQ9XFxcImljb24taW5wbGFjZWNoZWNrXFxcIj48cGF0aCBkPVxcXCJNMiA3bDEtMSAyIDIgNS01IDEgMS02IDZ6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTIgMTJcXFwiIGlkPVxcXCJpY29uLWlucGxhY2VkZWxldGVcXFwiPjxwYXRoIGQ9XFxcIk0zIDJMMiAzbDMgMy0zIDMgMSAxIDMtMyAzIDMgMS0xLTMtMyAzLTMtMS0xLTMgM3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxMiAxMlxcXCIgaWQ9XFxcImljb24taW5wbGFjZWRyYWdnYWJsZVxcXCI+PHBhdGggZD1cXFwiTTAgNGg3djdIMHpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNMiAzaDZ2NmgxVjJIMnpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNNCAxaDZ2NmgxVjBINHpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxMiAxMlxcXCIgaWQ9XFxcImljb24taW5wbGFjZWVkaXRcXFwiPjxwYXRoIGQ9XFxcIk0xIDExaDNMMSA4ek02IDNMMiA3bDMgMyA0LTR6TTExIDRMOCAxIDcgMmwzIDN6TTcgMTBoNXYxSDd6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTIgMTJcXFwiIGlkPVxcXCJpY29uLWlucGxhY2VwbHVzXFxcIj48cGF0aCBkPVxcXCJNMTEgNUg3VjFINXY0SDF2Mmg0djRoMlY3aDR6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTQgMjRcXFwiIGlkPVxcXCJpY29uLWxlZnQtY2xvc2VcXFwiPjxzdHlsZT48IVtDREFUQVsuc3Qxe2ZpbGw6I2ZmZn1dXT48L3N0eWxlPjxwYXRoIGQ9XFxcIk0yIDI0aDEyVjBIMkMuOSAwIDAgLjkgMCAydjIwYzAgMS4xLjkgMiAyIDJ6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MVxcXCIgZD1cXFwiTTguOTYgNS45N0wxMSA4LjAyIDcuMDIgMTIgMTEgMTUuOTlsLTEuOTggMS45OC02LTUuOTd6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTQgMjRcXFwiIGlkPVxcXCJpY29uLWxlZnQtb3BlblxcXCI+PHN0eWxlPjwhW0NEQVRBWy5zdDF7ZmlsbDojZmZmfV1dPjwvc3R5bGU+PHBhdGggZD1cXFwiTTIgMjRoMTJWMEgyQy45IDAgMCAuOSAwIDJ2MjBjMCAxLjEuOSAyIDIgMnpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QxXFxcIiBkPVxcXCJNNS4wNiA1Ljk3TDMuMDIgOC4wMiA3IDEybC0zLjk4IDMuOTlMNSAxNy45NyAxMSAxMnpcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tbGVmdFxcXCI+PHBhdGggZD1cXFwiTTExIDEybC0yIDItNi02IDYtNiAyIDItNCA0elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIiBpZD1cXFwiaWNvbi1uZXdfMjR4MjRcXFwiPjxwYXRoIGZpbGw9XFxcIiMxQUIzOTRcXFwiIGQ9XFxcIk0xOCAxMWgtNVY2aC0zdjVINXYzaDV2NWgzdi01aDV6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTYgMTZcXFwiIGlkPVxcXCJpY29uLW5vbmNvbW1lcmNpYWxcXFwiPjxwYXRoIGQ9XFxcIk04IDBMMCAxNWgxNkw4IDB6bTEgMTNIN3YtMmgydjJ6bS0yLTNWNWgydjVIN3pcXFwiPjwvcGF0aD48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNCAyNFxcXCIgaWQ9XFxcImljb24tcmlnaHQtY2xvc2VcXFwiPjxzdHlsZT48IVtDREFUQVsuc3Qxe2ZpbGw6I2ZmZn1dXT48L3N0eWxlPjxwYXRoIGQ9XFxcIk0xMiAyNEgwVjBoMTJjMS4xIDAgMiAuOSAyIDJ2MjBjMCAxLjEtLjkgMi0yIDJ6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MVxcXCIgZD1cXFwiTTUuMDQgNS45N0wzIDguMDIgNi45OCAxMiAzIDE1Ljk5bDEuOTggMS45OCA2LTUuOTd6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTQgMjRcXFwiIGlkPVxcXCJpY29uLXJpZ2h0LW9wZW5cXFwiPjxzdHlsZT48IVtDREFUQVsuc3Qxe2ZpbGw6I2ZmZn1dXT48L3N0eWxlPjxwYXRoIGQ9XFxcIk0xMiAyNEgwVjBoMTJjMS4xIDAgMiAuOSAyIDJ2MjBjMCAxLjEtLjkgMi0yIDJ6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MVxcXCIgZD1cXFwiTTguOTQgNS45N2wyLjA0IDIuMDVMNyAxMmwzLjk4IDMuOTlMOSAxNy45NyAzIDEyelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE2IDE2XFxcIiBpZD1cXFwiaWNvbi1yaWdodFxcXCI+PHBhdGggZD1cXFwiTTUgNGwyLTIgNiA2LTYgNi0yLTIgNC00elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDg1MCAxNjMwXFxcIiBpZD1cXFwiaWNvbi1hbmRyb2lkcGhvbmVcXFwiPjxzdHlsZT48IVtDREFUQVsuc3Qwe2ZpbGw6IzQwNDA0MH0uc3Qxe2ZpbGw6dHJhbnNwYXJlbnR9LnN0MntmaWxsOm5vbmU7c3Ryb2tlOiM0MDQwNDA7c3Ryb2tlLXdpZHRoOjQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9XV0+PC9zdHlsZT48ZyBpZD1cXFwiYW5kcm9pZHBob25lLUxheWVyXzFcXFwiPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk03NzEuMSAzOGMyMi42IDAgNDEgMTguNCA0MSA0MXYxNDkyYzAgMjIuNi0xOC40IDQxLTQxIDQxaC02OTVjLTIyLjYgMC00MS0xOC40LTQxLTQxVjc5YzAtMjIuNiAxOC40LTQxIDQxLTQxaDY5NW0wLTRoLTY5NWMtMjQuOCAwLTQ1IDIwLjMtNDUgNDV2MTQ5MmMwIDI0LjggMjAuMyA0NSA0NSA0NWg2OTVjMjQuOCAwIDQ1LTIwLjMgNDUtNDVWNzljMC0yNC43LTIwLjItNDUtNDUtNDV6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MVxcXCIgZD1cXFwiTTY0LjEgMTc1LjVoNzE5djEyNzloLTcxOXpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNNzgyLjYgMTc2djEyNzhoLTcxOFYxNzZoNzE4bTEtMWgtNzIwdjEyODBoNzIwVjE3NXpNNDY2IDEwMS44YzMuNiAwIDYuNSAyLjkgNi41IDYuNXMtMi45IDYuNS02LjUgNi41aC04NGMtMy42IDAtNi41LTIuOS02LjUtNi41czIuOS02LjUgNi41LTYuNWg4NG0wLTRoLTg0Yy01LjggMC0xMC41IDQuNy0xMC41IDEwLjVzNC43IDEwLjUgMTAuNSAxMC41aDg0YzUuOCAwIDEwLjUtNC43IDEwLjUtMTAuNSAwLTUuNy00LjctMTAuNS0xMC41LTEwLjV6TTMzNyAxMDEuOGMzLjYgMCA2LjUgMi45IDYuNSA2LjVzLTIuOSA2LjUtNi41IDYuNWgtMzFjLTMuNiAwLTYuNS0yLjktNi41LTYuNXMyLjktNi41IDYuNS02LjVoMzFtMC00aC0zMWMtNS44IDAtMTAuNSA0LjctMTAuNSAxMC41czQuNyAxMC41IDEwLjUgMTAuNWgzMWM1LjggMCAxMC41LTQuNyAxMC41LTEwLjUgMC01LjctNC43LTEwLjUtMTAuNS0xMC41ek01NDcuNSA5NS4zYzcuMiAwIDEzIDUuOCAxMyAxM3MtNS44IDEzLTEzIDEzLTEzLTUuOC0xMy0xMyA1LjgtMTMgMTMtMTNtMC00Yy05LjQgMC0xNyA3LjYtMTcgMTdzNy42IDE3IDE3IDE3IDE3LTcuNiAxNy0xNy03LjYtMTctMTctMTd6XFxcIj48L3BhdGg+PGc+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTgyNS41IDMwMHYyNDRoLTlWMzAwaDltNC00aC0xN3YyNTJoMTdWMjk2elxcXCI+PC9wYXRoPjwvZz48Zz48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNODI1LjUgNjI3djkxaC05di05MWg5bTQtNGgtMTd2OTloMTd2LTk5elxcXCI+PC9wYXRoPjwvZz48Zz48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMTc1LjggMTUxNmgzMnY0aC0zMnpNMTc1LjggMTUyOWgzMnY0aC0zMnpNMTc1LjggMTU0MmgzMnY0aC0zMnpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QyXFxcIiBkPVxcXCJNNDM2LjggMTU0NWgtMThjLTIuOCAwLTUtMi4zLTUtNXYtMThjMC0yLjggMi4zLTUgNS01aDE4YzIuOCAwIDUgMi4zIDUgNXYxOGMwIDIuOC0yLjMgNS01IDV6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTY3MS40IDE1MTcuN2wtMi44LTIuOS0xNi42IDE2LjYuMi4xLS4yLjIgMTYuNiAxNi41IDIuOC0yLjgtMTMuOS0xMy45elxcXCI+PC9wYXRoPjwvZz48L2c+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTA3MCAxNDgwXFxcIiBpZD1cXFwiaWNvbi1hbmRyb2lkdGFibGV0XFxcIj48c3R5bGU+PCFbQ0RBVEFbLnN0MHtmaWxsOnRyYW5zcGFyZW50fS5zdDF7ZmlsbDojNDA0MDQwfS5zdDIsLnN0M3tmaWxsOm5vbmU7c3Ryb2tlOiM0MDQwNDA7c3Ryb2tlLXdpZHRoOjY7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LnN0M3tzdHJva2Utd2lkdGg6NH1dXT48L3N0eWxlPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0xMzUgMTAxLjFoNzk5djEyNzlIMTM1elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDFcXFwiIGQ9XFxcIk05MzMuNSAxMDEuNnYxMjc4aC03OTh2LTEyNzhoNzk4bTEtMWgtODAwdjEyODBoODAwdi0xMjgwelxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDJcXFwiIGQ9XFxcIk05NzMuNSAxNDU2LjFoLTg4MmMtMjggMC01MS0yMi45LTUxLTUxVjc2YzAtMjggMjIuOS01MSA1MS01MWg4ODIuMWMyOCAwIDUxIDIyLjkgNTEgNTF2MTMyOS4xYy0uMSAyOC0yMyA1MS01MS4xIDUxelxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDNcXFwiIGQ9XFxcIk05NzEuNCAxNDQ3LjhIOTMuNmMtMjQuOCAwLTQ1LTIwLjMtNDUtNDVWNzguM2MwLTI0LjggMjAuMy00NSA0NS00NWg4NzcuOGMyNC44IDAgNDUgMjAuMyA0NSA0NXYxMzI0LjVjMCAyNC44LTIwLjIgNDUtNDUgNDV6XFxcIj48L3BhdGg+PGNpcmNsZSBjbGFzcz1cXFwic3QzXFxcIiBjeD1cXFwiNzkuNVxcXCIgY3k9XFxcIjc0MC42XFxcIiByPVxcXCIxMlxcXCI+PC9jaXJjbGU+PC9zeW1ib2w+PHN5bWJvbCBpZD1cXFwiaWNvbi1kZXZpY2UtbFxcXCI+PGcgZmlsbD1cXFwibm9uZVxcXCIgZmlsbC1ydWxlPVxcXCJldmVub2RkXFxcIiB0cmFuc2Zvcm09XFxcInRyYW5zbGF0ZSgtNTA5IC00MDkpXFxcIj48ZyB0cmFuc2Zvcm09XFxcInJvdGF0ZSgtOTAgODg0LjUgNjI0KVxcXCI+PHVzZSBmaWxsPVxcXCIjMDAwXFxcIiBmaWx0ZXI9XFxcInVybCgjZGV2aWNlLWwtYSlcXFwiIHhsaW5rOmhyZWY9XFxcIiNkZXZpY2UtbC1iXFxcIj48L3VzZT48dXNlIGZpbGw9XFxcIiNGRkZcXFwiIHhsaW5rOmhyZWY9XFxcIiNkZXZpY2UtbC1iXFxcIj48L3VzZT48L2c+PHJlY3Qgd2lkdGg9XFxcIjcwXFxcIiBoZWlnaHQ9XFxcIjhcXFwiIHg9XFxcIjU0MFxcXCIgeT1cXFwiNjI4XFxcIiBmaWxsPVxcXCIjRjRGNEY0XFxcIiBmaWxsLXJ1bGU9XFxcIm5vbnplcm9cXFwiIHRyYW5zZm9ybT1cXFwicm90YXRlKC05MCA1NzUgNjMyKVxcXCIgcng9XFxcIjRcXFwiPjwvcmVjdD48Y2lyY2xlIGN4PVxcXCI1NzVcXFwiIGN5PVxcXCI1ODVcXFwiIHI9XFxcIjRcXFwiIGZpbGw9XFxcIiNGNEY0RjRcXFwiIGZpbGwtcnVsZT1cXFwibm9uemVyb1xcXCIgdHJhbnNmb3JtPVxcXCJyb3RhdGUoLTkwIDU3NSA1ODUpXFxcIj48L2NpcmNsZT48cGF0aCBmaWxsPVxcXCIjRjRGNEY0XFxcIiBmaWxsLXJ1bGU9XFxcIm5vbnplcm9cXFwiIGQ9XFxcIk01OTIgNzg0VjQ2NGg1Njh2MzIwelxcXCI+PC9wYXRoPjxwYXRoIGZpbGw9XFxcIiNFN0U3RTdcXFwiIGZpbGwtcnVsZT1cXFwibm9uemVyb1xcXCIgZD1cXFwiTTU5MiA0NjR2MzIwaDU2OFY0NjRINTkyem01NjktMXYzMjJINTkxVjQ2M2g1NzB6XFxcIj48L3BhdGg+PGNpcmNsZSBjeD1cXFwiMTE4NlxcXCIgY3k9XFxcIjYyNFxcXCIgcj1cXFwiMTVcXFwiIGZpbGw9XFxcIiNGNEY0RjRcXFwiPjwvY2lyY2xlPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVxcXCJpY29uLWRldmljZS1wXFxcIj48ZyBmaWxsPVxcXCJub25lXFxcIiBmaWxsLXJ1bGU9XFxcImV2ZW5vZGRcXFwiIHRyYW5zZm9ybT1cXFwidHJhbnNsYXRlKC03MCAtNDA4KVxcXCI+PHVzZSBmaWxsPVxcXCIjMDAwXFxcIiBmaWx0ZXI9XFxcInVybCgjZGV2aWNlLXAtYSlcXFwiIHhsaW5rOmhyZWY9XFxcIiNkZXZpY2UtcC1iXFxcIj48L3VzZT48dXNlIGZpbGw9XFxcIiNGRkZcXFwiIHhsaW5rOmhyZWY9XFxcIiNkZXZpY2UtcC1iXFxcIj48L3VzZT48cmVjdCB3aWR0aD1cXFwiNzBcXFwiIGhlaWdodD1cXFwiOFxcXCIgeD1cXFwiMjQyXFxcIiB5PVxcXCI0NzBcXFwiIGZpbGw9XFxcIiNGNEY0RjRcXFwiIGZpbGwtcnVsZT1cXFwibm9uemVyb1xcXCIgcng9XFxcIjRcXFwiPjwvcmVjdD48Y2lyY2xlIGN4PVxcXCIzMjRcXFwiIGN5PVxcXCI0NzRcXFwiIHI9XFxcIjRcXFwiIGZpbGw9XFxcIiNGNEY0RjRcXFwiIGZpbGwtcnVsZT1cXFwibm9uemVyb1xcXCI+PC9jaXJjbGU+PHBhdGggZmlsbD1cXFwiI0U3RTdFN1xcXCIgZmlsbC1ydWxlPVxcXCJub256ZXJvXFxcIiBkPVxcXCJNMTI0IDQ5MGgzMjJ2NTcwSDEyNFY0OTB6bTEgMXY1NjhoMzIwVjQ5MUgxMjV6XFxcIj48L3BhdGg+PHBhdGggZmlsbD1cXFwiI0Y0RjRGNFxcXCIgZmlsbC1ydWxlPVxcXCJub256ZXJvXFxcIiBkPVxcXCJNMTI1IDQ5MWgzMjB2NTY4SDEyNXpcXFwiPjwvcGF0aD48Y2lyY2xlIGN4PVxcXCIyODVcXFwiIGN5PVxcXCIxMDg0XFxcIiByPVxcXCIxNVxcXCIgZmlsbD1cXFwiI0Y0RjRGNFxcXCI+PC9jaXJjbGU+PC9nPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDE4MzcgMjU2M1xcXCIgaWQ9XFxcImljb24taXBhZFxcXCI+PHN0eWxlPjwhW0NEQVRBWy5zdDB7ZmlsbDp0cmFuc3BhcmVudH0uc3Qxe2ZpbGw6IzQwNDA0MH0uc3QyLC5zdDN7ZmlsbDpub25lO3N0cm9rZTojNDA0MDQwO3N0cm9rZS13aWR0aDo2O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5zdDN7c3Ryb2tlLXdpZHRoOjR9XV0+PC9zdHlsZT48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMTU0LjIgMjU1LjVoMTUzNXYyMDQ3aC0xNTM1elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDFcXFwiIGQ9XFxcIk0xNjg4LjcgMjU2djIwNDZoLTE1MzRWMjU2aDE1MzRtMS0xaC0xNTM2djIwNDhoMTUzNlYyNTV6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MlxcXCIgZD1cXFwiTTE2OTcuMiAyNTMwLjVoLTE1NTFjLTYwLjUgMC0xMTAtNDkuNS0xMTAtMTEwdi0yMjgwYzAtNjAuNSA0OS41LTExMCAxMTAtMTEwaDE1NTFjNjAuNSAwIDExMCA0OS41IDExMCAxMTB2MjI4MGMwIDYwLjUtNDkuNSAxMTAtMTEwIDExMHpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QzXFxcIiBkPVxcXCJNMTY4OC40IDI1MTRIMTU1Yy01Ny44IDAtMTA1LTQ3LjMtMTA1LTEwNVYxNDlDNTAgOTEuMyA5Ny4yIDQ0IDE1NSA0NGgxNTMzLjVjNTcuOCAwIDEwNSA0Ny4zIDEwNSAxMDV2MjI2MGMtLjEgNTcuOC00Ny4zIDEwNS0xMDUuMSAxMDV6XFxcIj48L3BhdGg+PGNpcmNsZSBjbGFzcz1cXFwic3QzXFxcIiBjeD1cXFwiOTIxLjdcXFwiIGN5PVxcXCIxNDkuNVxcXCIgcj1cXFwiMTYuNVxcXCI+PC9jaXJjbGU+PGNpcmNsZSBjbGFzcz1cXFwic3QyXFxcIiBjeD1cXFwiOTIxLjVcXFwiIGN5PVxcXCIyNDExLjVcXFwiIHI9XFxcIjUzLjVcXFwiPjwvY2lyY2xlPjxwYXRoIGNsYXNzPVxcXCJzdDNcXFwiIGQ9XFxcIk05MzcuMiAyNDMxLjVoLTMxYy0yLjggMC01LTIuMy01LTV2LTMxYzAtMi44IDIuMy01IDUtNWgzMWMyLjggMCA1IDIuMyA1IDV2MzFjMCAyLjgtMi4yIDUtNSA1elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDk0NSAxMzAwXFxcIiBpZD1cXFwiaWNvbi1pcGFkbWluaVxcXCI+PHN0eWxlPjwhW0NEQVRBWy5zdDAsLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiM0MDQwNDA7c3Ryb2tlLXdpZHRoOjY7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LnN0MXtzdHJva2Utd2lkdGg6NH0uc3Qye2ZpbGw6dHJhbnNwYXJlbnR9LnN0M3tmaWxsOiM0MDQwNDB9XV0+PC9zdHlsZT48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNODM2LjQgMTI3NS41SDExMS44Yy00NCAwLTgwLTM2LTgwLTgwVjEwNi44YzAtNDQgMzYtODAgODAtODBoNzI0LjZjNDQgMCA4MCAzNiA4MCA4MHYxMDg4LjdjMCA0NC0zNiA4MC04MCA4MHpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QxXFxcIiBkPVxcXCJNODMzLjQgMTI2My4zSDExNC44Yy0zOC41IDAtNzAtMzEuNS03MC03MFYxMDguOWMwLTM4LjUgMzEuNS03MCA3MC03MGg3MTguNmMzOC41IDAgNzAgMzEuNSA3MCA3MHYxMDg0LjRjMCAzOC41LTMxLjUgNzAtNzAgNzB6XFxcIj48L3BhdGg+PGNpcmNsZSBjbGFzcz1cXFwic3QxXFxcIiBjeD1cXFwiNDc0XFxcIiBjeT1cXFwiODYuNlxcXCIgcj1cXFwiOC4yXFxcIj48L2NpcmNsZT48Y2lyY2xlIGNsYXNzPVxcXCJzdDBcXFwiIGN4PVxcXCI0NzQuMVxcXCIgY3k9XFxcIjEyMTYuNFxcXCIgcj1cXFwiMjYuN1xcXCI+PC9jaXJjbGU+PHBhdGggY2xhc3M9XFxcInN0MVxcXCIgZD1cXFwiTTQ3OS4zIDEyMjYuNGgtMTAuNWMtMi44IDAtNS0yLjMtNS01di0xMC41YzAtMi44IDIuMy01IDUtNWgxMC41YzIuOCAwIDUgMi4zIDUgNXYxMC41YzAgMi44LTIuMiA1LTUgNXpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QyXFxcIiBkPVxcXCJNOTAuNiAxMzkuNWg3Njd2MTAyM2gtNzY3elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDNcXFwiIGQ9XFxcIk04NTcuMSAxNDB2MTAyMmgtNzY2VjE0MGg3NjZtMS0xaC03Njh2MTAyNGg3NjhWMTM5elxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDIwMDggMjk4MFxcXCIgaWQ9XFxcImljb24taXBhZHByb1xcXCI+PHN0eWxlPjwhW0NEQVRBWy5zdDAsLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiM0MDQwNDA7c3Ryb2tlLXdpZHRoOjY7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LnN0MXtzdHJva2Utd2lkdGg6NH0uc3Qye2ZpbGw6dHJhbnNwYXJlbnR9LnN0M3tmaWxsOiM0MDQwNDB9XV0+PC9zdHlsZT48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMTg1NC4xIDI5MDkuNWgtMTY5OWMtNjAuNSAwLTExMC00OS41LTExMC0xMTB2LTI2MTljMC02MC41IDQ5LjUtMTEwIDExMC0xMTBoMTY5OWM2MC41IDAgMTEwIDQ5LjUgMTEwIDExMHYyNjE5YzAgNjAuNS00OS41IDExMC0xMTAgMTEwelxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDFcXFwiIGQ9XFxcIk0xODQ1LjMgMjg5M0gxNjMuOGMtNTcuOCAwLTEwNS00Ny4zLTEwNS0xMDVWMTg5YzAtNTcuOCA0Ny4zLTEwNSAxMDUtMTA1aDE2ODEuNWM1Ny44IDAgMTA1IDQ3LjMgMTA1IDEwNXYyNTk5YzAgNTcuOC00Ny4zIDEwNS0xMDUgMTA1elxcXCI+PC9wYXRoPjxjaXJjbGUgY2xhc3M9XFxcInN0MVxcXCIgY3g9XFxcIjEwMDQuNlxcXCIgY3k9XFxcIjE4OS41XFxcIiByPVxcXCIxNi41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGNsYXNzPVxcXCJzdDBcXFwiIGN4PVxcXCIxMDA0LjZcXFwiIGN5PVxcXCIyNzkwLjNcXFwiIHI9XFxcIjUzLjVcXFwiPjwvY2lyY2xlPjxwYXRoIGNsYXNzPVxcXCJzdDFcXFwiIGQ9XFxcIk0xMDIwLjEgMjgxMC44aC0zMWMtMi44IDAtNS0yLjMtNS01di0zMWMwLTIuOCAyLjMtNSA1LTVoMzFjMi44IDAgNSAyLjMgNSA1djMxYzAgMi44LTIuMyA1LTUgNXpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QyXFxcIiBkPVxcXCJNMTYxLjEgMjk1LjVoMTY4N3YyMzg3aC0xNjg3elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDNcXFwiIGQ9XFxcIk0xODQ3LjYgMjk2djIzODZoLTE2ODZWMjk2aDE2ODZtMS0xaC0xNjg4djIzODhoMTY4OFYyOTV6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMjM2MCAzMzAwXFxcIiBpZD1cXFwiaWNvbi1pcGFkcHJvMTNcXFwiPjxzdHlsZT48IVtDREFUQVsuc3QwLC5zdDF7ZmlsbDpub25lO3N0cm9rZTojNDA0MDQwO3N0cm9rZS13aWR0aDo2O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5zdDF7c3Ryb2tlLXdpZHRoOjR9LnN0MntmaWxsOnRyYW5zcGFyZW50fS5zdDN7ZmlsbDojNDA0MDQwfV1dPjwvc3R5bGU+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTIyMTkuMiAzMjY5LjJIMTM5LjVjLTYwLjUgMC0xMTAtNDkuNS0xMTAtMTEwdi0zMDI0YzAtNjAuNSA0OS41LTExMCAxMTAtMTEwaDIwNzkuOGM2MC41IDAgMTEwIDQ5LjUgMTEwIDExMHYzMDI0Yy0uMSA2MC41LTQ5LjYgMTEwLTExMC4xIDExMHpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QxXFxcIiBkPVxcXCJNMjIwOC41IDMyNTAuNEgxNTAuMmMtNTcuOCAwLTEwNS00Ny4zLTEwNS0xMDVWMTQ1LjdjMC01Ny43IDQ3LjMtMTA1IDEwNS0xMDVoMjA1OC4zYzU3LjggMCAxMDUgNDcuMyAxMDUgMTA1djI5OTkuN2MwIDU3LjctNDcuMyAxMDUtMTA1IDEwNXpcXFwiPjwvcGF0aD48Y2lyY2xlIGNsYXNzPVxcXCJzdDFcXFwiIGN4PVxcXCIxMTc5LjNcXFwiIGN5PVxcXCIxNjMuN1xcXCIgcj1cXFwiMTYuNVxcXCI+PC9jaXJjbGU+PGNpcmNsZSBjbGFzcz1cXFwic3QwXFxcIiBjeD1cXFwiMTE3OS4zXFxcIiBjeT1cXFwiMzEzMy40XFxcIiByPVxcXCI1My41XFxcIj48L2NpcmNsZT48cGF0aCBjbGFzcz1cXFwic3QxXFxcIiBkPVxcXCJNMTE5NC44IDMxNTMuOWgtMzFjLTIuOCAwLTUtMi4zLTUtNXYtMzFjMC0yLjggMi4zLTUgNS01aDMxYzIuOCAwIDUgMi4zIDUgNXYzMWMwIDIuOS0yLjIgNS01IDV6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MlxcXCIgZD1cXFwiTTE1NS44IDI4NS43aDIwNDd2MjczMWgtMjA0N3pcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QzXFxcIiBkPVxcXCJNMjIwMi4zIDI4Ni4ydjI3MzBoLTIwNDZ2LTI3MzBoMjA0Nm0xLTFoLTIwNDh2MjczMmgyMDQ4di0yNzMyelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDczMCAxMzQwXFxcIiBpZD1cXFwiaWNvbi1pcGhvbmU0XFxcIj48c3R5bGU+PCFbQ0RBVEFbLnN0MHtmaWxsOiM0MDQwNDB9LnN0MXtmaWxsOnRyYW5zcGFyZW50fV1dPjwvc3R5bGU+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTYzNS45IDEzMDAuNUgxMDAuN2MtNDUuNyAwLTgyLjgtMzcuMS04Mi44LTgyLjh2LTExMDhjMC00NS43IDM3LjEtODIuOCA4Mi44LTgyLjhINjM2YzQ1LjcgMCA4Mi44IDM3LjEgODIuOCA4Mi44djExMDhjLS4xIDQ1LjYtMzcuMiA4Mi44LTgyLjkgODIuOHpNMTAwLjcgMjkuMWMtNDQuNCAwLTgwLjYgMzYuMS04MC42IDgwLjZ2MTEwOGMwIDQ0LjQgMzYuMSA4MC42IDgwLjYgODAuNkg2MzZjNDQuNCAwIDgwLjYtMzYuMSA4MC42LTgwLjZ2LTExMDhjMC00NC40LTM2LjEtODAuNi04MC42LTgwLjZIMTAwLjd6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTM2Ni45IDcxLjFjLTUgMC05LjEtNC4xLTkuMS05LjFzNC4xLTkuMSA5LjEtOS4xUzM3NiA1NyAzNzYgNjJjMCA1LjEtNC4xIDkuMS05LjEgOS4xem0wLTE1LjljLTMuOCAwLTYuOCAzLjEtNi44IDYuOCAwIDMuNyAzLjEgNi44IDYuOCA2LjggMy44IDAgNi44LTMuMSA2LjgtNi44IDAtMy43LTMtNi44LTYuOC02Ljh6TTI2OS4zIDExNi41Yy02LjkgMC0xMi41LTUuNi0xMi41LTEyLjVzNS42LTEyLjUgMTIuNS0xMi41IDEyLjUgNS42IDEyLjUgMTIuNS01LjYgMTIuNS0xMi41IDEyLjV6bTAtMjIuN2MtNS42IDAtMTAuMiA0LjYtMTAuMiAxMC4yczQuNiAxMC4yIDEwLjIgMTAuMiAxMC4yLTQuNiAxMC4yLTEwLjJjLjEtNS42LTQuNS0xMC4yLTEwLjItMTAuMnpNNDA4LjYgMTA5LjdoLTg0LjVjLTMuNiAwLTYuNS0yLjktNi41LTYuNXMyLjktNi41IDYuNS02LjVoODQuNWMzLjYgMCA2LjUgMi45IDYuNSA2LjVzLTIuOSA2LjUtNi41IDYuNXptLTg0LjUtMTAuOGMtMi40IDAtNC4zIDEuOS00LjMgNC4zczEuOSA0LjMgNC4zIDQuM2g4NC41YzIuNCAwIDQuMy0xLjkgNC4zLTQuM3MtMS45LTQuMy00LjMtNC4zaC04NC41ek0zNjguMyAxMjY3LjhjLTIzLjUgMC00Mi41LTE5LjEtNDIuNS00Mi41IDAtMjMuNSAxOS4xLTQyLjUgNDIuNS00Mi41IDIzLjUgMCA0Mi41IDE5LjEgNDIuNSA0Mi41IDAgMjMuNS0xOS4xIDQyLjUtNDIuNSA0Mi41em0wLTgyLjhjLTIyLjIgMC00MC4zIDE4LjEtNDAuMyA0MC4zIDAgMjIuMiAxOC4xIDQwLjMgNDAuMyA0MC4zIDIyLjIgMCA0MC4zLTE4LjEgNDAuMy00MC4zIDAtMjIuMi0xOC4xLTQwLjMtNDAuMy00MC4zelxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0zNjguMyAxMjc2LjJjLTI4LjEgMC01MC45LTIyLjgtNTAuOS01MC45czIyLjgtNTAuOSA1MC45LTUwLjkgNTAuOSAyMi44IDUwLjkgNTAuOWMwIDI4LjEtMjIuOSA1MC45LTUwLjkgNTAuOXptMC05OS42Yy0yNi44IDAtNDguNyAyMS44LTQ4LjcgNDguNyAwIDI2LjggMjEuOCA0OC43IDQ4LjcgNDguNyAyNi44IDAgNDguNy0yMS44IDQ4LjctNDguNy0uMS0yNi44LTIxLjktNDguNy00OC43LTQ4Ljd6TTguNSAyNDUuNEgtLjJ2LTYwaDguN3Y2MHpNMiAyNDMuMmg0LjJ2LTU1LjZIMnY1NS42ek04LjUgMzMwLjRILS4ydi02MGg4Ljd2NjB6TTIgMzI4LjJoNC4ydi01NS42SDJ2NTUuNnpcXFwiPjwvcGF0aD48Zz48cGF0aCBjbGFzcz1cXFwic3QxXFxcIiBkPVxcXCJNNDguNSAxODMuMmg2Mzl2OTU5aC02Mzl6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTY4NyAxODMuN3Y5NThINDl2LTk1OGg2MzhtMS0xSDQ4djk2MGg2NDB2LTk2MHpcXFwiPjwvcGF0aD48L2c+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTguNyAzNDQuN1YzMjdIMi4xdi01My4zaDYuNnYtMTRINC4ydjkuNWgtNi42djYyLjNoNi42djEzLjJ6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTY0NS41IDEzLjdoLTYuOGwtOS41LS41VjYuN2gtNjIuM3Y2LjZsLTEzLjIuNUg5MS4xYy00Ny45IDAtODYuOCAzOS04Ni44IDg2Ljh2ODMuN2gtNi42djYyLjNoNi42djI1LjFoNC41VjI0MkgyLjF2LTUzLjNoNi42di04OC4yYzAtNDUuNCAzNi45LTgyLjQgODIuNC04Mi40aDU1NC41QzY5MSAxOC4xIDcyOCA1NSA3MjggMTAwLjV2MTEyNy4zYzAgNDUuNC0zNi45IDgyLjQtODIuNCA4Mi40SDkxLjFjLTQ1LjQgMC04Mi40LTM2LjktODIuNC04Mi40VjMyNy43SDQuMnY5MDAuMWMwIDQ3LjkgMzkgODYuOSA4Ni44IDg2LjloNTU0LjVjNDcuOSAwIDg2LjgtMzkgODYuOC04Ni45VjEwMC41Yy4xLTQ3LjgtMzguOS04Ni44LTg2LjgtODYuOHptLTc0LjItMi41aDUzLjN2Mi41aC01My4zdi0yLjV6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgNzUwIDE1MDBcXFwiIGlkPVxcXCJpY29uLWlwaG9uZTVcXFwiPjxzdHlsZT48IVtDREFUQVsuc3Qwe2ZpbGw6IzQwNDA0MH0uc3Qxe2ZpbGw6dHJhbnNwYXJlbnR9XV0+PC9zdHlsZT48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNNjQyLjkgMTQ3My44SDEwNy43Yy00NS43IDAtODIuOC0zNy4xLTgyLjgtODIuOFYxMDZjMC00NS43IDM3LjEtODIuOCA4Mi44LTgyLjhINjQzYzQ1LjcgMCA4Mi44IDM3LjEgODIuOCA4Mi44djEyODVjLS4xIDQ1LjYtMzcuMiA4Mi44LTgyLjkgODIuOHpNMTA3LjcgMjUuNGMtNDQuNCAwLTgwLjYgMzYuMS04MC42IDgwLjZ2MTI4NWMwIDQ0LjQgMzYuMSA4MC42IDgwLjYgODAuNkg2NDNjNDQuNCAwIDgwLjYtMzYuMSA4MC42LTgwLjZWMTA2YzAtNDQuNC0zNi4xLTgwLjYtODAuNi04MC42SDEwNy43elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0zNzMuOSA2Ny40Yy01IDAtOS4xLTQuMS05LjEtOS4xczQuMS05LjEgOS4xLTkuMSA5LjEgNC4xIDkuMSA5LjFjMCA1LjEtNC4xIDkuMS05LjEgOS4xem0wLTE1LjljLTMuOCAwLTYuOCAzLjEtNi44IDYuOHMzLjEgNi44IDYuOCA2LjhjMy44IDAgNi44LTMuMSA2LjgtNi44cy0zLTYuOC02LjgtNi44ek0yNzYuMyAxMTIuOGMtNi45IDAtMTIuNS01LjYtMTIuNS0xMi41czUuNi0xMi41IDEyLjUtMTIuNSAxMi41IDUuNiAxMi41IDEyLjUtNS42IDEyLjUtMTIuNSAxMi41em0wLTIyLjdjLTUuNiAwLTEwLjIgNC42LTEwLjIgMTAuMnM0LjYgMTAuMiAxMC4yIDEwLjIgMTAuMi00LjYgMTAuMi0xMC4yYy4xLTUuNi00LjUtMTAuMi0xMC4yLTEwLjJ6TTQxNS42IDEwNmgtODQuNWMtMy42IDAtNi41LTIuOS02LjUtNi41czIuOS02LjUgNi41LTYuNWg4NC41YzMuNiAwIDYuNSAyLjkgNi41IDYuNXMtMi45IDYuNS02LjUgNi41em0tODQuNS0xMC44Yy0yLjQgMC00LjMgMS45LTQuMyA0LjNzMS45IDQuMyA0LjMgNC4zaDg0LjVjMi40IDAgNC4zLTEuOSA0LjMtNC4zcy0xLjktNC4zLTQuMy00LjNoLTg0LjV6TTM3NS4zIDE0NDEuMWMtMjMuNSAwLTQyLjUtMTkuMS00Mi41LTQyLjUgMC0yMy41IDE5LjEtNDIuNSA0Mi41LTQyLjUgMjMuNSAwIDQyLjUgMTkuMSA0Mi41IDQyLjUgMCAyMy41LTE5LjEgNDIuNS00Mi41IDQyLjV6bTAtODIuOGMtMjIuMiAwLTQwLjMgMTguMS00MC4zIDQwLjMgMCAyMi4yIDE4LjEgNDAuMyA0MC4zIDQwLjMgMjIuMiAwIDQwLjMtMTguMSA0MC4zLTQwLjMgMC0yMi4yLTE4LjEtNDAuMy00MC4zLTQwLjN6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTM3NS4zIDE0NDkuNWMtMjguMSAwLTUwLjktMjIuOC01MC45LTUwLjlzMjIuOC01MC45IDUwLjktNTAuOSA1MC45IDIyLjggNTAuOSA1MC45YzAgMjguMS0yMi45IDUwLjktNTAuOSA1MC45em0wLTk5LjZjLTI2LjggMC00OC43IDIxLjgtNDguNyA0OC43IDAgMjYuOCAyMS44IDQ4LjcgNDguNyA0OC43IDI2LjggMCA0OC43LTIxLjggNDguNy00OC43LS4xLTI2LjgtMjEuOS00OC43LTQ4LjctNDguN3pcXFwiPjwvcGF0aD48Zz48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMTQuNSAyNDEuN0g1Ljh2LTYwaDguN3Y2MHpNOCAyMzkuNWg0LjJ2LTU1LjZIOHY1NS42ek0xNC41IDM4OUg1Ljh2LTk0LjVoOC43VjM4OXpNOCAzODYuOGg0LjJ2LTkwSDh2OTB6TTE0LjUgNTAxLjlINS44di05NC41aDguN3Y5NC41ek04IDQ5OS42aDQuMnYtOTBIOHY5MHpcXFwiPjwvcGF0aD48L2c+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTY1Mi41IDE0ODhIOTguMWMtNDcuOSAwLTg2LjgtMzktODYuOC04Ni45VjUwM0g0LjZ2LTk2LjhoNi42di0xNi4xSDQuNnYtOTYuOGg2LjZ2LTUwLjZINC42di02Mi4zaDYuNlY5Ni44QzExLjIgNDkgNTAuMiAxMCA5OC4xIDEwaDU1NC41YzQ3LjkgMCA4Ni44IDM5IDg2LjggODYuOHYxMzA0LjNjMCA0Ny45LTM5IDg2LjktODYuOSA4Ni45ek05LjEgNDk4LjVoNi42djkwMi42YzAgNDUuNCAzNi45IDgyLjQgODIuNCA4Mi40aDU1NC41YzQ1LjQgMCA4Mi40LTM2LjkgODIuNC04Mi40Vjk2LjhjMC00NS40LTM2LjktODIuNC04Mi40LTgyLjRIOTguMWMtNDUuNCAwLTgyLjQgMzYuOS04Mi40IDgyLjRWMTg1SDkuMXY1My4zaDYuNnY1OS41SDkuMXY4Ny44aDYuNnYyNS4xSDkuMXY4Ny44elxcXCI+PC9wYXRoPjxnPjxwYXRoIGNsYXNzPVxcXCJzdDFcXFwiIGQ9XFxcIk01NiAxODJoNjM5djExMzVINTZ6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTY5NCAxODJ2MTEzNEg1NlYxODJoNjM4bTEtMUg1NXYxMTM2aDY0MFYxODF6XFxcIj48L3BhdGg+PC9nPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDk2MCAxNzUwXFxcIiBpZD1cXFwiaWNvbi1pcGhvbmU2XFxcIj48c3R5bGU+PCFbQ0RBVEFbLnN0MHtmaWxsOiM0MDQwNDB9LnN0MXtmaWxsOnRyYW5zcGFyZW50fV1dPjwvc3R5bGU+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTQ3OS44IDEwMy40Yy01IDAtOS4xLTQuMS05LjEtOS4xczQuMS05LjEgOS4xLTkuMSA5LjEgNC4xIDkuMSA5LjFjMCA1LjEtNC4xIDkuMS05LjEgOS4xem0wLTE1LjljLTMuOCAwLTYuOCAzLjEtNi44IDYuOCAwIDMuOCAzLjEgNi44IDYuOCA2LjggMy44IDAgNi44LTMuMSA2LjgtNi44IDAtMy43LTMtNi44LTYuOC02Ljh6TTM4Mi4yIDE0OC44Yy02LjkgMC0xMi41LTUuNi0xMi41LTEyLjVzNS42LTEyLjUgMTIuNS0xMi41IDEyLjUgNS42IDEyLjUgMTIuNS01LjYgMTIuNS0xMi41IDEyLjV6bTAtMjIuN2MtNS42IDAtMTAuMiA0LjYtMTAuMiAxMC4yczQuNiAxMC4yIDEwLjIgMTAuMiAxMC4yLTQuNiAxMC4yLTEwLjJjLjEtNS42LTQuNS0xMC4yLTEwLjItMTAuMnpNNTIxLjUgMTQySDQzN2MtMy42IDAtNi41LTIuOS02LjUtNi41czIuOS02LjUgNi41LTYuNWg4NC41YzMuNiAwIDYuNSAyLjkgNi41IDYuNXMtMi45IDYuNS02LjUgNi41ek00MzcgMTMxLjJjLTIuNCAwLTQuMyAxLjktNC4zIDQuM3MxLjkgNC4zIDQuMyA0LjNoODQuNWMyLjQgMCA0LjMtMS45IDQuMy00LjNzLTEuOS00LjMtNC4zLTQuM0g0Mzd6TTQ3NiAxNjc1LjFjLTIzLjUgMC00Mi41LTE5LjEtNDIuNS00Mi41IDAtMjMuNSAxOS4xLTQyLjUgNDIuNS00Mi41IDIzLjUgMCA0Mi41IDE5LjEgNDIuNSA0Mi41IDAgMjMuNS0xOSA0Mi41LTQyLjUgNDIuNXptMC04Mi44Yy0yMi4yIDAtNDAuMyAxOC4xLTQwLjMgNDAuMyAwIDIyLjIgMTguMSA0MC4zIDQwLjMgNDAuMyAyMi4yIDAgNDAuMy0xOC4xIDQwLjMtNDAuM3MtMTguMS00MC4zLTQwLjMtNDAuM3pcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNNDc2IDE2ODMuNWMtMjguMSAwLTUwLjktMjIuOC01MC45LTUwLjlzMjIuOC01MC45IDUwLjktNTAuOSA1MC45IDIyLjggNTAuOSA1MC45LTIyLjggNTAuOS01MC45IDUwLjl6bTAtOTkuNmMtMjYuOCAwLTQ4LjcgMjEuOC00OC43IDQ4LjcgMCAyNi44IDIxLjggNDguNyA0OC43IDQ4LjcgMjYuOCAwIDQ4LjctMjEuOCA0OC43LTQ4LjcgMC0yNi44LTIxLjktNDguNy00OC43LTQ4Ljd6XFxcIj48L3BhdGg+PGc+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTgwMS45IDE3MDcuOEgxNTYuN2MtNDUuNyAwLTgyLjgtMzcuMS04Mi44LTgyLjhWMTQyYzAtNDUuNyAzNy4xLTgyLjggODIuOC04Mi44SDgwMmM0NS43IDAgODIuOCAzNy4xIDgyLjggODIuOHYxNDgzYy0uMSA0NS42LTM3LjIgODIuOC04Mi45IDgyLjh6TTE1Ni43IDYxLjRjLTQ0LjQgMC04MC42IDM2LjEtODAuNiA4MC42djE0ODNjMCA0NC40IDM2LjEgODAuNiA4MC42IDgwLjZIODAyYzQ0LjQgMCA4MC42LTM2LjEgODAuNi04MC42VjE0MmMwLTQ0LjQtMzYuMS04MC42LTgwLjYtODAuNkgxNTYuN3pcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNODExLjUgMTcyMkgxNDcuMWMtNDcuOSAwLTg2LjgtMzktODYuOC04Ni45VjUzOWgtNi42di05Ni44aDYuNnYtMTYuMWgtNi42di05Ni44aDYuNnYtNTAuNmgtNi42di02Mi4zaDYuNnYtODMuN2MwLTQ3LjkgMzktODYuOCA4Ni44LTg2LjhoNjY0LjVjNDcuOSAwIDg2LjggMzkgODYuOCA4Ni44VjE2MzVjMCA0OC0zOSA4Ny04Ni45IDg3ek01OC4xIDUzNC41aDYuNnYxMTAwLjZjMCA0NS40IDM2LjkgODIuNCA4Mi40IDgyLjRoNjY0LjVjNDUuNCAwIDgyLjQtMzYuOSA4Mi40LTgyLjRWMTMyLjhjMC00NS40LTM2LjktODIuNC04Mi40LTgyLjRIMTQ3LjFjLTQ1LjQgMC04Mi40IDM2LjktODIuNCA4Mi40VjIyMWgtNi42djUzLjNoNi42djU5LjVoLTYuNnY4Ny44aDYuNnYyNS4xaC02LjZ2ODcuOHpcXFwiPjwvcGF0aD48L2c+PGc+PHBhdGggY2xhc3M9XFxcInN0MVxcXCIgZD1cXFwiTTEwNC41IDIwOC41aDc0OXYxMzMzaC03NDl6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTg1MyAyMDl2MTMzMkgxMDVWMjA5aDc0OG0xLTFIMTA0djEzMzRoNzUwVjIwOHpcXFwiPjwvcGF0aD48L2c+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTMzMCAyNTUwXFxcIiBpZD1cXFwiaWNvbi1pcGhvbmU2cGx1c1xcXCI+PHN0eWxlPjwhW0NEQVRBWy5zdDB7ZmlsbDojNDA0MDQwfS5zdDF7ZmlsbDp0cmFuc3BhcmVudH1dXT48L3N0eWxlPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk02NjUuMSAxMzMuMmMtOC4zIDAtMTUuMS02LjgtMTUuMS0xNS4xczYuOC0xNS4xIDE1LjEtMTUuMSAxNS4xIDYuOCAxNS4xIDE1LjEtNi44IDE1LjEtMTUuMSAxNS4xem0wLTI2LjVjLTYuMyAwLTExLjQgNS4xLTExLjQgMTEuNHM1LjEgMTEuNCAxMS40IDExLjRjNi4zIDAgMTEuNC01LjEgMTEuNC0xMS40LS4xLTYuMy01LjEtMTEuNC0xMS40LTExLjR6TTUwMi41IDIwOC44Yy0xMS41IDAtMjAuOC05LjMtMjAuOC0yMC44czkuMy0yMC44IDIwLjgtMjAuOCAyMC44IDkuMyAyMC44IDIwLjgtOS4zIDIwLjgtMjAuOCAyMC44em0wLTM3LjhjLTkuNCAwLTE3IDcuNi0xNyAxN3M3LjYgMTcgMTcgMTcgMTctNy42IDE3LTE3Yy4xLTkuNC03LjYtMTctMTctMTd6TTczNC41IDE5Ny41SDU5My43Yy02IDAtMTAuOC00LjktMTAuOC0xMC44czQuOS0xMC44IDEwLjgtMTAuOGgxNDAuOGM2IDAgMTAuOCA0LjkgMTAuOCAxMC44cy00LjggMTAuOC0xMC44IDEwLjh6bS0xNDAuOC0xOGMtMy45IDAtNy4xIDMuMi03LjEgNy4xIDAgMy45IDMuMiA3LjEgNy4xIDcuMWgxNDAuOGMzLjkgMCA3LjEtMy4yIDcuMS03LjEgMC0zLjktMy4yLTcuMS03LjEtNy4xSDU5My43ek02NjUgMjQyNi4xYy0zOCAwLTY4LjktMzAuOS02OC45LTY4LjlzMzAuOS02OC45IDY4LjktNjguOSA2OC45IDMwLjkgNjguOSA2OC45LTMwLjkgNjguOS02OC45IDY4Ljl6bTAtMTM0LjJjLTM2IDAtNjUuMyAyOS4zLTY1LjMgNjUuM3MyOS4zIDY1LjMgNjUuMyA2NS4zIDY1LjMtMjkuMyA2NS4zLTY1LjMtMjkuMy02NS4zLTY1LjMtNjUuM3pcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNNjY1IDI0MzkuNmMtNDUuNSAwLTgyLjUtMzctODIuNS04Mi41czM3LTgyLjUgODIuNS04Mi41IDgyLjUgMzcgODIuNSA4Mi41LTM3IDgyLjUtODIuNSA4Mi41em0wLTE2MS4zYy00My41IDAtNzguOCAzNS40LTc4LjggNzguOCAwIDQzLjUgMzUuNCA3OC44IDc4LjggNzguOCA0My41IDAgNzguOC0zNS40IDc4LjgtNzguOHMtMzUuMy03OC44LTc4LjgtNzguOHpcXFwiPjwvcGF0aD48Zz48cGF0aCBjbGFzcz1cXFwic3QxXFxcIiBkPVxcXCJNMTI1LjUgMzE1LjVoMTA3OXYxOTE5aC0xMDc5elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0xMjA0IDMxNnYxOTE4SDEyNlYzMTZoMTA3OG0xLTFIMTI1djE5MjBoMTA4MFYzMTV6XFxcIj48L3BhdGg+PC9nPjxnPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0xMTE5LjUgNDJjMzguMyAwIDc0LjQgMTUgMTAxLjcgNDIuMyAyNy4zIDI3LjMgNDIuMyA2My40IDQyLjMgMTAxLjd2MjE3MmMwIDM4LjMtMTUgNzQuNC00Mi4zIDEwMS43cy02My40IDQyLjMtMTAxLjcgNDIuM2gtOTA5Yy0zOC4zIDAtNzQuNC0xNS0xMDEuNy00Mi4zcy00Mi4zLTYzLjQtNDIuMy0xMDEuN1YxODZjMC0zOC4zIDE1LTc0LjQgNDIuMy0xMDEuN1MxNzIuMiA0MiAyMTAuNSA0Mmg5MDltMC02aC05MDljLTgyLjUgMC0xNTAgNjcuNS0xNTAgMTUwdjIxNzJjMCA4Mi41IDY3LjUgMTUwIDE1MCAxNTBoOTA5YzgyLjUgMCAxNTAtNjcuNSAxNTAtMTUwVjE4NmMwLTgyLjUtNjcuNS0xNTAtMTUwLTE1MHpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMTEyMS41IDU4LjdjMzMuNSAwIDY1LjEgMTMuMSA4OSAzN3MzNyA1NS41IDM3IDg5djIxNzQuNmMwIDMzLjUtMTMuMSA2NS4xLTM3IDg5cy01NS41IDM3LTg5IDM3aC05MTJjLTMzLjUgMC02NS4xLTEzLjEtODktMzdzLTM3LTU1LjUtMzctODlWMTg0LjdjMC0zMy41IDEzLjEtNjUuMSAzNy04OXM1NS41LTM3IDg5LTM3aDkxMm0wLTRoLTkxMmMtNzEuNSAwLTEzMCA1OC41LTEzMCAxMzB2MjE3NC42YzAgNzEuNSA1OC41IDEzMCAxMzAgMTMwaDkxMmM3MS41IDAgMTMwLTU4LjUgMTMwLTEzMFYxODQuN2MwLTcxLjUtNTguNS0xMzAtMTMwLTEzMHpcXFwiPjwvcGF0aD48L2c+PGc+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTQ5IDcwMnYxNDJjMCA2LjMgNC45IDExLjQgMTEgMTEuOXYtNGMtMy45LS41LTctMy45LTctNy45VjcwMmMwLTQuMSAzLjEtNy40IDctNy45di00Yy02LjEuNS0xMSA1LjYtMTEgMTEuOXpNNDkgNTA1djE0MmMwIDYuMyA0LjkgMTEuNCAxMSAxMS45di00Yy0zLjktLjUtNy0zLjktNy03LjlWNTA1YzAtNC4xIDMuMS03LjQgNy03Ljl2LTRjLTYuMS41LTExIDUuNi0xMSAxMS45ek02MCAzMTcuMXYtNGMtNi4xLjUtMTEgNS43LTExIDExLjl2NjZjMCA2LjMgNC45IDExLjQgMTEgMTEuOXYtNGMtMy45LS41LTctMy45LTctNy45di02NmMwLTQuMSAzLjEtNy40IDctNy45elxcXCI+PC9wYXRoPjwvZz48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCA5OTAgMTg2MFxcXCIgaWQ9XFxcImljb24taXBob25lOFxcXCI+PHN0eWxlPjwhW0NEQVRBWy5zdDB7ZmlsbDojNDA0MDQwfS5zdDF7ZmlsbDpub25lO3N0cm9rZTojNDA0MDQwO3N0cm9rZS13aWR0aDo0O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5zdDJ7ZmlsbDp0cmFuc3BhcmVudH1dXT48L3N0eWxlPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk01NjAuNyAxODkuNEg0MzcuOWMtNiAwLTEwLjgtNC45LTEwLjgtMTAuOHM0LjktMTAuOCAxMC44LTEwLjhoMTIyLjhjNiAwIDEwLjggNC45IDEwLjggMTAuOHMtNC44IDEwLjgtMTAuOCAxMC44em0tMTIyLjgtMThjLTMuOSAwLTcuMSAzLjItNy4xIDcuMSAwIDMuOSAzLjIgNy4xIDcuMSA3LjFoMTIyLjhjMy45IDAgNy4xLTMuMiA3LjEtNy4xIDAtMy45LTMuMi03LjEtNy4xLTcuMUg0MzcuOXpcXFwiPjwvcGF0aD48Y2lyY2xlIGNsYXNzPVxcXCJzdDFcXFwiIGN4PVxcXCIzNTkuNVxcXCIgY3k9XFxcIjE3OC42XFxcIiByPVxcXCIxNS41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGNsYXNzPVxcXCJzdDFcXFwiIGN4PVxcXCI0OTkuM1xcXCIgY3k9XFxcIjEyNi41XFxcIiByPVxcXCI5LjVcXFwiPjwvY2lyY2xlPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk03ODEuNSA2MGMzOC4zIDAgNzQuNCAxNSAxMDEuNyA0Mi4zczQyLjMgNjMuNCA0Mi4zIDEwMS43djE0NjVjMCAzOC4zLTE1IDc0LjQtNDIuMyAxMDEuNy0yNy4zIDI3LjMtNjMuNCA0Mi4zLTEwMS43IDQyLjNoLTU2NWMtMzguMyAwLTc0LjQtMTUtMTAxLjctNDIuM3MtNDIuMy02My40LTQyLjMtMTAxLjdWMjA0YzAtMzguMyAxNS03NC40IDQyLjMtMTAxLjdTMTc4LjIgNjAgMjE2LjUgNjBoNTY1bTAtNmgtNTY1Yy04Mi41IDAtMTUwIDY3LjUtMTUwIDE1MHYxNDY1YzAgODIuNSA2Ny41IDE1MCAxNTAgMTUwaDU2NWM4Mi41IDAgMTUwLTY3LjUgMTUwLTE1MFYyMDRjMC04Mi41LTY3LjUtMTUwLTE1MC0xNTB6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTc4Mi41IDc3LjdjMzMuNSAwIDY1LjEgMTMuMSA4OSAzN3MzNyA1NS41IDM3IDg5djE0NjQuNmMwIDMzLjUtMTMuMSA2NS4xLTM3IDg5cy01NS41IDM3LTg5IDM3aC01NjdjLTMzLjUgMC02NS4xLTEzLjEtODktMzdzLTM3LTU1LjUtMzctODlWMjAzLjdjMC0zMy41IDEzLjEtNjUuMSAzNy04OXM1NS41LTM3IDg5LTM3aDU2N20wLTRoLTU2N2MtNzEuNSAwLTEzMCA1OC41LTEzMCAxMzB2MTQ2NC42YzAgNzEuNSA1OC41IDEzMCAxMzAgMTMwaDU2N2M3MS41IDAgMTMwLTU4LjUgMTMwLTEzMFYyMDMuN2MwLTcxLjUtNTguNS0xMzAtMTMwLTEzMHpcXFwiPjwvcGF0aD48Zz48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNNTUgNjQ2djE0MmMwIDYuMyA0LjkgMTEuNCAxMSAxMS45di00Yy0zLjktLjUtNy0zLjktNy03LjlWNjQ2YzAtNC4xIDMuMS03LjQgNy03Ljl2LTRjLTYuMS41LTExIDUuNi0xMSAxMS45ek01NSA0NDl2MTQyYzAgNi4zIDQuOSAxMS40IDExIDExLjl2LTRjLTMuOS0uNS03LTMuOS03LTcuOVY0NDljMC00LjEgMy4xLTcuNCA3LTcuOXYtNGMtNi4xLjUtMTEgNS42LTExIDExLjl6TTkzMiA1MjcuOXY0YzYuMS0uNSAxMS01LjcgMTEtMTEuOVYzOTljMC02LjMtNC45LTExLjQtMTEtMTEuOXY0YzMuOS41IDcgMy45IDcgNy45djEyMWMwIDQuMS0zLjEgNy40LTcgNy45elxcXCI+PC9wYXRoPjwvZz48Zz48Y2lyY2xlIGNsYXNzPVxcXCJzdDFcXFwiIGN4PVxcXCI0OTNcXFwiIGN5PVxcXCIxNjg5XFxcIiByPVxcXCI2Ni41XFxcIj48L2NpcmNsZT48Y2lyY2xlIGNsYXNzPVxcXCJzdDFcXFwiIGN4PVxcXCI0OTNcXFwiIGN5PVxcXCIxNjg5XFxcIiByPVxcXCI1NVxcXCI+PC9jaXJjbGU+PC9nPjxnPjxwYXRoIGNsYXNzPVxcXCJzdDJcXFwiIGQ9XFxcIk0xMjEuNSAyNjMuNWg3NDl2MTMzM2gtNzQ5elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk04NzAgMjY0djEzMzJIMTIyVjI2NGg3NDhtMS0xSDEyMXYxMzM0aDc1MFYyNjN6XFxcIj48L3BhdGg+PC9nPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDEzMzAgMjU1MFxcXCIgaWQ9XFxcImljb24taXBob25lOHBsdXNcXFwiPjxzdHlsZT48IVtDREFUQVsuc3Qwe2ZpbGw6IzQwNDA0MH0uc3Qxe2ZpbGw6dHJhbnNwYXJlbnR9XV0+PC9zdHlsZT48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNNjY4LjEgMTMzLjJjLTguMyAwLTE1LjEtNi44LTE1LjEtMTUuMXM2LjgtMTUuMSAxNS4xLTE1LjEgMTUuMSA2LjggMTUuMSAxNS4xLTYuOCAxNS4xLTE1LjEgMTUuMXptMC0yNi41Yy02LjMgMC0xMS40IDUuMS0xMS40IDExLjRzNS4xIDExLjQgMTEuNCAxMS40YzYuMyAwIDExLjQtNS4xIDExLjQtMTEuNC0uMS02LjMtNS4xLTExLjQtMTEuNC0xMS40ek01MDUuNSAyMDguOGMtMTEuNSAwLTIwLjgtOS4zLTIwLjgtMjAuOHM5LjMtMjAuOCAyMC44LTIwLjggMjAuOCA5LjMgMjAuOCAyMC44LTkuMyAyMC44LTIwLjggMjAuOHptMC0zNy44Yy05LjQgMC0xNyA3LjYtMTcgMTdzNy42IDE3IDE3IDE3IDE3LTcuNiAxNy0xN2MuMS05LjQtNy42LTE3LTE3LTE3ek03MzcuNSAxOTcuNUg1OTYuN2MtNiAwLTEwLjgtNC45LTEwLjgtMTAuOHM0LjktMTAuOCAxMC44LTEwLjhoMTQwLjhjNiAwIDEwLjggNC45IDEwLjggMTAuOHMtNC44IDEwLjgtMTAuOCAxMC44em0tMTQwLjgtMThjLTMuOSAwLTcuMSAzLjItNy4xIDcuMSAwIDMuOSAzLjIgNy4xIDcuMSA3LjFoMTQwLjhjMy45IDAgNy4xLTMuMiA3LjEtNy4xIDAtMy45LTMuMi03LjEtNy4xLTcuMUg1OTYuN3pcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNNjY4IDI0MjYuMWMtMzggMC02OC45LTMwLjktNjguOS02OC45czMwLjktNjguOSA2OC45LTY4LjkgNjguOSAzMC45IDY4LjkgNjguOS0zMC45IDY4LjktNjguOSA2OC45em0wLTEzNC4yYy0zNiAwLTY1LjMgMjkuMy02NS4zIDY1LjNzMjkuMyA2NS4zIDY1LjMgNjUuMyA2NS4zLTI5LjMgNjUuMy02NS4zLTI5LjMtNjUuMy02NS4zLTY1LjN6XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTY2OCAyNDM5LjZjLTQ1LjUgMC04Mi41LTM3LTgyLjUtODIuNXMzNy04Mi41IDgyLjUtODIuNSA4Mi41IDM3IDgyLjUgODIuNS0zNyA4Mi41LTgyLjUgODIuNXptMC0xNjEuM2MtNDMuNSAwLTc4LjggMzUuNC03OC44IDc4LjggMCA0My41IDM1LjQgNzguOCA3OC44IDc4LjggNDMuNSAwIDc4LjgtMzUuNCA3OC44LTc4LjhzLTM1LjMtNzguOC03OC44LTc4Ljh6XFxcIj48L3BhdGg+PGc+PHBhdGggY2xhc3M9XFxcInN0MVxcXCIgZD1cXFwiTTEyOC41IDMxNS41aDEwNzl2MTkxOWgtMTA3OXpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMTIwNyAzMTZ2MTkxOEgxMjlWMzE2aDEwNzhtMS0xSDEyOHYxOTIwaDEwODBWMzE1elxcXCI+PC9wYXRoPjwvZz48Zz48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMTEyMi41IDQyYzM4LjMgMCA3NC40IDE1IDEwMS43IDQyLjMgMjcuMyAyNy4zIDQyLjMgNjMuNCA0Mi4zIDEwMS43djIxNzJjMCAzOC4zLTE1IDc0LjQtNDIuMyAxMDEuN3MtNjMuNCA0Mi4zLTEwMS43IDQyLjNoLTkwOWMtMzguMyAwLTc0LjQtMTUtMTAxLjctNDIuM3MtNDIuMy02My40LTQyLjMtMTAxLjdWMTg2YzAtMzguMyAxNS03NC40IDQyLjMtMTAxLjdTMTc1LjIgNDIgMjEzLjUgNDJoOTA5bTAtNmgtOTA5Yy04Mi41IDAtMTUwIDY3LjUtMTUwIDE1MHYyMTcyYzAgODIuNSA2Ny41IDE1MCAxNTAgMTUwaDkwOWM4Mi41IDAgMTUwLTY3LjUgMTUwLTE1MFYxODZjMC04Mi41LTY3LjUtMTUwLTE1MC0xNTB6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTExMjQuNSA1OC43YzMzLjUgMCA2NS4xIDEzLjEgODkgMzdzMzcgNTUuNSAzNyA4OXYyMTc0LjZjMCAzMy41LTEzLjEgNjUuMS0zNyA4OXMtNTUuNSAzNy04OSAzN2gtOTEyYy0zMy41IDAtNjUuMS0xMy4xLTg5LTM3cy0zNy01NS41LTM3LTg5VjE4NC43YzAtMzMuNSAxMy4xLTY1LjEgMzctODlzNTUuNS0zNyA4OS0zN2g5MTJtMC00aC05MTJjLTcxLjUgMC0xMzAgNTguNS0xMzAgMTMwdjIxNzQuNmMwIDcxLjUgNTguNSAxMzAgMTMwIDEzMGg5MTJjNzEuNSAwIDEzMC01OC41IDEzMC0xMzBWMTg0LjdjMC03MS41LTU4LjUtMTMwLTEzMC0xMzB6XFxcIj48L3BhdGg+PC9nPjxnPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk01MiA3MDJ2MTQyYzAgNi4zIDQuOSAxMS40IDExIDExLjl2LTRjLTMuOS0uNS03LTMuOS03LTcuOVY3MDJjMC00LjEgMy4xLTcuNCA3LTcuOXYtNGMtNi4xLjUtMTEgNS42LTExIDExLjl6TTUyIDUwNXYxNDJjMCA2LjMgNC45IDExLjQgMTEgMTEuOXYtNGMtMy45LS41LTctMy45LTctNy45VjUwNWMwLTQuMSAzLjEtNy40IDctNy45di00Yy02LjEuNS0xMSA1LjYtMTEgMTEuOXpNNjMgMzE3LjF2LTRjLTYuMS41LTExIDUuNy0xMSAxMS45djY2YzAgNi4zIDQuOSAxMS40IDExIDExLjl2LTRjLTMuOS0uNS03LTMuOS03LTcuOXYtNjZjMC00LjEgMy4xLTcuNCA3LTcuOXpcXFwiPjwvcGF0aD48L2c+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTMzMCAyNjgwXFxcIiBpZD1cXFwiaWNvbi1pcGhvbmV4XFxcIj48c3R5bGU+PCFbQ0RBVEFbLnN0MHtmaWxsOiM0MDQwNDB9LnN0MXtmaWxsOnRyYW5zcGFyZW50fV1dPjwvc3R5bGU+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTExNDQgNTQuNWM0MC4yIDAgNzggMTUuOCAxMDYuNiA0NC40czQ0LjQgNjYuNSA0NC40IDEwNi42djIyNjhjMCA0MC4yLTE1LjggNzgtNDQuNCAxMDYuNnMtNjYuNSA0NC40LTEwNi42IDQ0LjRIMTkwLjFjLTQwLjIgMC03OC0xNS44LTEwNi42LTQ0LjQtMjguNi0yOC42LTQ0LjQtNjYuNS00NC40LTEwNi42di0yMjY4YzAtNDAuMiAxNS44LTc4IDQ0LjQtMTA2LjZTMTUwIDU0LjUgMTkwLjEgNTQuNUgxMTQ0bTAtNkgxOTAuMWMtODYuNCAwLTE1NyA3MC43LTE1NyAxNTd2MjI2OGMwIDg2LjQgNzAuNiAxNTcgMTU3IDE1N0gxMTQ0Yzg2LjQgMCAxNTctNzAuNiAxNTctMTU3di0yMjY4YzAtODYuMy03MC43LTE1Ny0xNTctMTU3elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0xMTUxLjEgODIuNWMzMS45IDAgNjIgMTIuNSA4NC43IDM1LjMgMjIuNyAyMi43IDM1LjMgNTIuOCAzNS4zIDg0Ljd2MjI3NGMwIDMxLjktMTIuNSA2Mi0zNS4zIDg0LjctMjIuNyAyMi43LTUyLjggMzUuMy04NC43IDM1LjNoLTk2OGMtMzEuOSAwLTYyLTEyLjUtODQuNy0zNS4zLTIyLjctMjIuNy0zNS4zLTUyLjgtMzUuMy04NC43di0yMjc0YzAtMzEuOSAxMi41LTYyIDM1LjMtODQuNyAyMi43LTIyLjcgNTIuOC0zNS4zIDg0LjctMzUuM2g5NjhtMC00aC05NjhjLTY4LjIgMC0xMjQgNTUuOC0xMjQgMTI0djIyNzRjMCA2OC4yIDU1LjggMTI0IDEyNCAxMjRoOTY4YzY4LjIgMCAxMjQtNTUuOCAxMjQtMTI0di0yMjc0YzAtNjguMi01NS44LTEyNC0xMjQtMTI0elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk04MTAuOCAxNDYuNWMwLTExLjUgOS4zLTIwLjggMjAuOC0yMC44czIwLjggOS4zIDIwLjggMjAuOC05LjMgMjAuOC0yMC44IDIwLjgtMjAuOC05LjMtMjAuOC0yMC44em0zLjggMGMwIDkuNCA3LjYgMTcgMTcgMTdzMTctNy42IDE3LTE3LTcuNi0xNy0xNy0xNy0xNyA3LjYtMTcgMTd6TTU4OC44IDE0NS4xYzAtNiA0LjktMTAuOCAxMC44LTEwLjhoMTQwLjhjNiAwIDEwLjggNC45IDEwLjggMTAuOHMtNC45IDEwLjgtMTAuOCAxMC44SDU5OS42Yy02IC4xLTEwLjgtNC44LTEwLjgtMTAuOHptMTAuOC03LjFjLTMuOSAwLTcuMSAzLjItNy4xIDcuMSAwIDMuOSAzLjIgNy4xIDcuMSA3LjFoMTQwLjhjMy45IDAgNy4xLTMuMiA3LjEtNy4xIDAtMy45LTMuMi03LjEtNy4xLTcuMUg1OTkuNnpcXFwiPjwvcGF0aD48Zz48cGF0aCBjbGFzcz1cXFwic3QxXFxcIiBkPVxcXCJNMjE5LjMgMjU1N2MtNjMgMC0xMTQuMy01MS4zLTExNC4zLTExNC4zVjIzNi4zYzAtNjMgNTEuMy0xMTQuMyAxMTQuMy0xMTQuM2gxMzQuNmMuNyAwIDEuMy4zIDEuOC43LjUuNS43IDEuMS43IDEuOHYyNi45YzAgMjcuOSAyMi43IDUwLjYgNTAuNiA1MC42aDUxOS44YzI3LjkgMCA1MC42LTIyLjcgNTAuNi01MC42di0yNi45YzAtLjcuMy0xLjMuNy0xLjhzMS4xLS43IDEuNy0uN2gxMzQuOGM2MyAwIDExNC4zIDUxLjMgMTE0LjMgMTE0LjN2MjIwNi40YzAgNjMtNTEuMyAxMTQuMy0xMTQuMyAxMTQuM0gyMTkuM3pcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMTExNC42IDEyMi41YzMwLjQgMCA1OSAxMS44IDgwLjUgMzMuM3MzMy4zIDUwLjEgMzMuMyA4MC41djIyMDYuNGMwIDMwLjQtMTEuOCA1OS0zMy4zIDgwLjVzLTUwLjEgMzMuMy04MC41IDMzLjNIMjE5LjNjLTMwLjQgMC01OS0xMS44LTgwLjUtMzMuM3MtMzMuMy01MC4xLTMzLjMtODAuNVYyMzYuM2MwLTMwLjQgMTEuOC01OSAzMy4zLTgwLjVzNTAuMS0zMy4zIDgwLjUtMzMuM2gxMzQuNmMuNSAwIDEgLjIgMS40LjYuNC40LjYuOS42IDEuNHYyNi45YzAgMjguMiAyMi45IDUxLjEgNTEuMSA1MS4xaDUxOS44YzI4LjIgMCA1MS4xLTIyLjkgNTEuMS01MS4xdi0yNi45YzAtLjUuMi0xIC42LTEuNHMuOC0uNiAxLjQtLjZoMTM0LjdtMC0xSDk3OS44Yy0xLjYgMC0yLjkgMS4zLTIuOSAzdjI2LjljMCAyNy41LTIyLjUgNTAuMS01MC4xIDUwLjFINDA3Yy0yNy41IDAtNTAuMS0yMi41LTUwLjEtNTAuMXYtMjYuOWMwLTEuNy0xLjMtMy0zLTNIMjE5LjNjLTYzLjQgMC0xMTQuOCA1MS40LTExNC44IDExNC44djIyMDYuNGMwIDYzLjQgNTEuNCAxMTQuOCAxMTQuOCAxMTQuOGg4OTUuNGM2My40IDAgMTE0LjgtNTEuNCAxMTQuOC0xMTQuOFYyMzYuM2MwLTYzLjQtNTEuNS0xMTQuOC0xMTQuOS0xMTQuOHpcXFwiPjwvcGF0aD48L2c+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMTQxMCAyOTgwXFxcIiBpZD1cXFwiaWNvbi1pcGhvbmV4bWF4XFxcIj48c3R5bGU+PCFbQ0RBVEFbLnN0MHtmaWxsOiM0MDQwNDB9LnN0MXtmaWxsOnRyYW5zcGFyZW50fV1dPjwvc3R5bGU+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTEyMjIuMSA5Ny44YzM5LjQgMCA3Ni41IDE1LjQgMTA0LjUgNDMuNXM0My41IDY1LjIgNDMuNSAxMDQuNXYyNDg5YzAgMzkuNC0xNS40IDc2LjUtNDMuNSAxMDQuNXMtNjUuMiA0My41LTEwNC41IDQzLjVIMTg4LjJjLTM5LjQgMC03Ni41LTE1LjQtMTA0LjUtNDMuNXMtNDMuNS02NS4yLTQzLjUtMTA0LjV2LTI0ODljMC0zOS40IDE1LjQtNzYuNSA0My41LTEwNC41czY1LjEtNDMuNSAxMDQuNS00My41aDEwMzMuOW0wLTZIMTg4LjJjLTg0LjcgMC0xNTQgNjkuMy0xNTQgMTU0djI0ODljMCA4NC43IDY5LjMgMTU0IDE1NCAxNTRoMTAzMy45Yzg0LjcgMCAxNTQtNjkuMyAxNTQtMTU0di0yNDg5YzAtODQuNy02OS4zLTE1NC0xNTQtMTU0elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0xMjI2LjIgMTI1LjhjMzEuOSAwIDYyIDEyLjUgODQuNyAzNS4zIDIyLjcgMjIuNyAzNS4zIDUyLjggMzUuMyA4NC43djI0ODljMCAzMS45LTEyLjUgNjItMzUuMyA4NC43LTIyLjcgMjIuNy01Mi44IDM1LjMtODQuNyAzNS4zaC0xMDQyYy0zMS45IDAtNjItMTIuNS04NC43LTM1LjMtMjIuNy0yMi43LTM1LjMtNTIuOC0zNS4zLTg0Ljd2LTI0ODljMC0zMS45IDEyLjUtNjIgMzUuMy04NC43IDIyLjctMjIuNyA1Mi44LTM1LjMgODQuNy0zNS4zaDEwNDJtMC00aC0xMDQyYy02OC4yIDAtMTI0IDU1LjgtMTI0IDEyNHYyNDg5YzAgNjguMiA1NS44IDEyNCAxMjQgMTI0aDEwNDJjNjguMiAwIDEyNC01NS44IDEyNC0xMjR2LTI0ODljMC02OC4yLTU1LjgtMTI0LTEyNC0xMjR6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTg0NC4zIDE3MWMwLTExLjUgOS4zLTIwLjggMjAuOC0yMC44czIwLjggOS4zIDIwLjggMjAuOC05LjMgMjAuOC0yMC44IDIwLjgtMjAuOC05LjMtMjAuOC0yMC44em0zLjggMGMwIDkuNCA3LjYgMTcgMTcgMTdzMTctNy42IDE3LTE3LTcuNi0xNy0xNy0xNy0xNyA3LjYtMTcgMTd6TTYyMi4zIDE2OS42YzAtNiA0LjktMTAuOCAxMC44LTEwLjhoMTQwLjhjNiAwIDEwLjggNC45IDEwLjggMTAuOHMtNC45IDEwLjgtMTAuOCAxMC44SDYzMy4xYy02IC4xLTEwLjgtNC44LTEwLjgtMTAuOHptMTAuOC03LjFjLTMuOSAwLTcuMSAzLjItNy4xIDcuMSAwIDMuOSAzLjIgNy4xIDcuMSA3LjFoMTQwLjhjMy45IDAgNy4xLTMuMiA3LjEtNy4xIDAtMy45LTMuMi03LjEtNy4xLTcuMUg2MzMuMXpcXFwiPjwvcGF0aD48Zz48cGF0aCBjbGFzcz1cXFwic3QxXFxcIiBkPVxcXCJNMTk5IDI4MzMuOGMtNjMgMC0xMTQuMy01MS4zLTExNC4zLTExNC4zVjI2MS4xYzAtNjMgNTEuMy0xMTQuMyAxMTQuMy0xMTQuM2gxOTMuN2MuNyAwIDEuMy4zIDEuOC43cy43IDEuMS43IDEuOHYyNi45YzAgMjcuOSAyMi43IDUwLjYgNTAuNiA1MC42aDUxOS44YzI3LjkgMCA1MC42LTIyLjcgNTAuNi01MC42di0yNi45YzAtLjcuMi0xLjMuNy0xLjhzMS4xLS43IDEuNy0uN2gxOTIuOGM2MyAwIDExNC4zIDUxLjMgMTE0LjMgMTE0LjN2MjQ1OC40YzAgNjMtNTEuMyAxMTQuMy0xMTQuMyAxMTQuM0gxOTl6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTEyMTEuNCAxNDcuM2MzMC40IDAgNTkgMTEuOCA4MC41IDMzLjNzMzMuMyA1MC4xIDMzLjMgODAuNXYyNDU4LjRjMCAzMC40LTExLjggNTktMzMuMyA4MC41cy01MC4xIDMzLjMtODAuNSAzMy4zSDE5OWMtMzAuNCAwLTU5LTExLjgtODAuNS0zMy4zcy0zMy4zLTUwLjEtMzMuMy04MC41VjI2MS4xYzAtMzAuNCAxMS44LTU5IDMzLjMtODAuNXM1MC4xLTMzLjMgODAuNS0zMy4zaDE5My43Yy41IDAgMSAuMiAxLjQuNi40LjQuNi45LjYgMS40djI2LjljMCAyOC4yIDIyLjkgNTEuMSA1MS4xIDUxLjFoNTE5LjhjMjguMiAwIDUxLjEtMjIuOSA1MS4xLTUxLjF2LTI2LjljMC0uNS4yLTEgLjYtMS40LjQtLjQuOC0uNiAxLjQtLjZoMTkyLjdtMC0xaC0xOTIuOGMtMS42IDAtMi45IDEuMy0yLjkgM3YyNi45YzAgMjcuNS0yMi41IDUwLjEtNTAuMSA1MC4xSDQ0NS44Yy0yNy41IDAtNTAuMS0yMi41LTUwLjEtNTAuMXYtMjYuOWMwLTEuNy0xLjMtMy0zLTNIMTk5Yy02My40IDAtMTE0LjggNTEuNC0xMTQuOCAxMTQuOHYyNDU4LjRjMCA2My40IDUxLjQgMTE0LjggMTE0LjggMTE0LjhoMTAxMi40YzYzLjQgMCAxMTQuOC01MS40IDExNC44LTExNC44VjI2MS4xYzAtNjMuNC01MS40LTExNC44LTExNC44LTExNC44elxcXCI+PC9wYXRoPjwvZz48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxMDQwIDE2MjBcXFwiIGlkPVxcXCJpY29uLW1zc3VyZmFjZVxcXCI+PHN0eWxlPjwhW0NEQVRBWy5zdDB7ZmlsbDp0cmFuc3BhcmVudH0uc3Qxe2ZpbGw6IzQwNDA0MH1dXT48L3N0eWxlPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0xMzYuNSAxMjcuNWg3Njd2MTM2NWgtNzY3elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDFcXFwiIGQ9XFxcIk05MDMgMTI4djEzNjRIMTM3VjEyOGg3NjZtMS0xSDEzNnYxMzY2aDc2OFYxMjd6TTk1My4zIDgxNC41djE2aDEzLjRsMi0xNnpNOTUzLjMgODEwLjloMTUuOWwyLjgtMjEuNGgtMTguN3pcXFwiPjwvcGF0aD48Zz48cGF0aCBjbGFzcz1cXFwic3QxXFxcIiBkPVxcXCJNOTMzLjggODEwLjloMTUuOXYtMjEuNEg5MzF6TTkzNC4zIDgxNC41bDIgMTZoMTMuNHYtMTZ6XFxcIj48L3BhdGg+PC9nPjxnPjxwYXRoIGNsYXNzPVxcXCJzdDFcXFwiIGQ9XFxcIk05ODMgMzJjMTEgMCAyMCA5IDIwIDIwdjE1MTZjMCAxMS05IDIwLTIwIDIwSDU5Yy0xMSAwLTIwLTktMjAtMjBWNTJjMC0xMSA5LTIwIDIwLTIwaDkyNG0wLTRINTljLTEzLjMgMC0yNCAxMC43LTI0IDI0djE1MTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRoOTI0YzEzLjMgMCAyNC0xMC43IDI0LTI0VjUyYzAtMTMuMy0xMC43LTI0LTI0LTI0elxcXCI+PC9wYXRoPjwvZz48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCA0ODAgODQ1LjJcXFwiIGlkPVxcXCJpY29uLXdpbjEwcGhvbmVcXFwiPjxzdHlsZT48IVtDREFUQVsuc3Qwe29wYWNpdHk6LjV9LnN0MXtmaWxsOnRyYW5zcGFyZW50fS5zdDJ7ZmlsbDojNDA0MDQwfS5zdDN7ZmlsbDpub25lO3N0cm9rZTojNDA0MDQwO3N0cm9rZS13aWR0aDozO3N0cm9rZS1taXRlcmxpbWl0OjEwfV1dPjwvc3R5bGU+PGcgY2xhc3M9XFxcInN0MFxcXCI+PHBhdGggY2xhc3M9XFxcInN0MVxcXCIgZD1cXFwiTTc2LjUgMTM4LjFoMzI5djU2N2gtMzI5elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDJcXFwiIGQ9XFxcIk00MDUgMTM4LjZ2NTY2SDc3di01NjZoMzI4bTEtMUg3NnY1NjhoMzMwdi01Njh6XFxcIj48L3BhdGg+PC9nPjxwYXRoIGNsYXNzPVxcXCJzdDJcXFwiIGQ9XFxcIk00NDggNTcuNmMuNSAwIDEgLjUgMSAxdjc3NGMwIC41LS41IDEtMSAxSDMyYy0uNSAwLTEtLjUtMS0xdi03NzRjMC0uNS41LTEgMS0xaDQxNm0wLTRIMzJjLTIuOCAwLTUgMi4zLTUgNXY3NzRjMCAyLjggMi4zIDUgNSA1aDQxNmMyLjggMCA1LTIuMyA1LTV2LTc3NGMwLTIuNy0yLjItNS01LTV6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MlxcXCIgZD1cXFwiTTQxNS41IDcwLjZjMTMuNSAwIDI0LjUgMTEgMjQuNSAyNC41djcwMGMwIDEzLjUtMTEgMjQuNS0yNC41IDI0LjVoLTM1MWMtMTMuNSAwLTI0LjUtMTEtMjQuNS0yNC41di03MDBjMC0xMy41IDExLTI0LjUgMjQuNS0yNC41aDM1MW0wLTJoLTM1MUM0OS45IDY4LjYgMzggODAuNSAzOCA5NS4xdjcwMGMwIDE0LjYgMTEuOSAyNi41IDI2LjUgMjYuNWgzNTFjMTQuNiAwIDI2LjUtMTEuOSAyNi41LTI2LjV2LTcwMGMwLTE0LjYtMTEuOS0yNi41LTI2LjUtMjYuNXpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QyXFxcIiBkPVxcXCJNMjY2IDkwLjZjLjUgMCAxIC41IDEgMXMtLjUgMS0xIDFoLTU1Yy0uNSAwLTEtLjUtMS0xcy41LTEgMS0xaDU1bTAtMmgtNTVjLTEuNiAwLTMgMS40LTMgM3MxLjQgMyAzIDNoNTVjMS42IDAgMy0xLjQgMy0zcy0xLjQtMy0zLTN6TTQ1MiAyMDEuNmg1djEyMWgtNXpNNDUyIDM3OS42aDV2NjFoLTV6TTEwOCA3NDEuNkg5Ny42bDUuOS01LjktNC4zLjEtNSA1LTIuMSAyLjEgMi4xIDIuMSA1IDUgNC4zLjEtNS41LTUuNWgxMHpNMjM4IDc0My42aC05djcuNWw5IDEuMnpNMjQwIDc0My42djguOWwxMiAxLjZ2LTEwLjV6XFxcIj48L3BhdGg+PGc+PHBhdGggY2xhc3M9XFxcInN0MlxcXCIgZD1cXFwiTTI0MCA3MzIuN3Y4LjloMTJ2LTEwLjV6TTIzOCA3MzIuOWwtOSAxLjJ2Ny41aDl6XFxcIj48L3BhdGg+PC9nPjxnPjxjaXJjbGUgY2xhc3M9XFxcInN0M1xcXCIgY3g9XFxcIjM4Mi41XFxcIiBjeT1cXFwiNzQ0LjFcXFwiIHI9XFxcIjZcXFwiPjwvY2lyY2xlPjxwYXRoIGNsYXNzPVxcXCJzdDJcXFwiIGQ9XFxcIk0zNzMuMyA3NTMuOGMtLjYtLjYtLjYtMS41IDAtMi4xbDQuNC00LjQgMi4xIDIuMS00LjQgNC40Yy0uNi42LTEuNi42LTIuMSAwelxcXCI+PC9wYXRoPjwvZz48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCIgaWQ9XFxcImljb24tc3BsaXRfMTZ4MTZcXFwiPjxwYXRoIGQ9XFxcIk03IDBoMnYxNkg3ek00IDRMLjAxIDguMDEgNCAxMmwxLTEtMy0zIDMtM3pNMTIuMDEgNGwtMSAxIDMgMy0zIDMgMSAxTDE2IDcuOTl6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMzAwIDMwMFxcXCIgaWQ9XFxcImljb24tc3RhcnQtZGVzaWduaW5nLWZvcm1cXFwiPjxzdHlsZT48IVtDREFUQVsuc3Qwe2ZpbGw6IzFjYjM5NH0uc3Qxe29wYWNpdHk6LjN9LnN0MntmaWxsOiMwMTAxMDF9LnN0M3tmaWxsOiNmZmZ9LnN0NHtmaWxsOiNkNmQ1ZDV9LnN0NXtvcGFjaXR5Oi4zO2ZpbGw6IzAxMDEwMX0uc3Q2e2ZpbGw6I2Y4OTgxZn1dXT48L3N0eWxlPjxjaXJjbGUgY2xhc3M9XFxcInN0MFxcXCIgY3g9XFxcIjE1MC45NFxcXCIgY3k9XFxcIjE0OS4zNVxcXCIgcj1cXFwiMTM0LjMzXFxcIj48L2NpcmNsZT48ZyBjbGFzcz1cXFwic3QxXFxcIj48cGF0aCBjbGFzcz1cXFwic3QyXFxcIiBkPVxcXCJNMTI2LjggNzNIODguNDR2MTM1aDEwNlY3M3pcXFwiPjwvcGF0aD48L2c+PHBhdGggY2xhc3M9XFxcInN0M1xcXCIgZD1cXFwiTTkzLjQ0IDY4aDEwNnYxMzVoLTEwNnpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3Q0XFxcIiBkPVxcXCJNMTM1LjQ0IDE0MmgxN3Y0aC0xN3pcXFwiPjwvcGF0aD48Y2lyY2xlIGNsYXNzPVxcXCJzdDNcXFwiIGN4PVxcXCIxMjQuOTZcXFwiIGN5PVxcXCIxNDMuNjRcXFwiIHI9XFxcIjQuNjRcXFwiPjwvY2lyY2xlPjxwYXRoIGNsYXNzPVxcXCJzdDJcXFwiIGQ9XFxcIk0xMjQuODIgMTQ5LjM1YTUuNTIgNS41MiAwIDAgMS01LjUxLTUuNTEgNS41MiA1LjUyIDAgMCAxIDUuNTEtNS41MSA1LjUyIDUuNTIgMCAwIDEgNS41MSA1LjUxYzAgMy4wNC0yLjQ3IDUuNTEtNS41MSA1LjUxem0wLTkuMzdjLTIuMTMgMC0zLjg2IDEuNzMtMy44NiAzLjg2czEuNzMgMy44NiAzLjg2IDMuODYgMy44Ni0xLjczIDMuODYtMy44Ni0xLjczLTMuODYtMy44Ni0zLjg2elxcXCI+PC9wYXRoPjxjaXJjbGUgY2xhc3M9XFxcInN0M1xcXCIgY3g9XFxcIjEyNC44MlxcXCIgY3k9XFxcIjE0My44NFxcXCIgcj1cXFwiLjgzXFxcIj48L2NpcmNsZT48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMTI0LjgyIDE0Mi4xOGMtLjkyIDAtMS42NS43NC0xLjY1IDEuNjUgMCAuOTIuNzQgMS42NSAxLjY1IDEuNjUuOTIgMCAxLjY1LS43NCAxLjY1LTEuNjUgMC0uOTEtLjc0LTEuNjUtMS42NS0xLjY1elxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDRcXFwiIGQ9XFxcIk0xNzQuNDQgMTQyaDE3djRoLTE3elxcXCI+PC9wYXRoPjxjaXJjbGUgY2xhc3M9XFxcInN0M1xcXCIgY3g9XFxcIjE2NC4zMlxcXCIgY3k9XFxcIjE0My42NFxcXCIgcj1cXFwiNC42NFxcXCI+PC9jaXJjbGU+PHBhdGggY2xhc3M9XFxcInN0MlxcXCIgZD1cXFwiTTE2NC4yNSAxNDkuMzVhNS41MiA1LjUyIDAgMCAxLTUuNTEtNS41MSA1LjUyIDUuNTIgMCAwIDEgNS41MS01LjUxIDUuNTIgNS41MiAwIDAgMSA1LjUxIDUuNTFjLjAxIDMuMDQtMi40NiA1LjUxLTUuNTEgNS41MXptMC05LjM3Yy0yLjEzIDAtMy44NiAxLjczLTMuODYgMy44NnMxLjczIDMuODYgMy44NiAzLjg2IDMuODYtMS43MyAzLjg2LTMuODZhMy44NSAzLjg1IDAgMCAwLTMuODYtMy44NnpcXFwiPjwvcGF0aD48Zz48Y2lyY2xlIGNsYXNzPVxcXCJzdDNcXFwiIGN4PVxcXCIxNjQuMjVcXFwiIGN5PVxcXCIxNDMuODRcXFwiIHI9XFxcIi44M1xcXCI+PC9jaXJjbGU+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTE2NC4yNSAxNDIuMThjLS45MiAwLTEuNjUuNzQtMS42NSAxLjY1IDAgLjkyLjc0IDEuNjUgMS42NSAxLjY1LjkyIDAgMS42NS0uNzQgMS42NS0xLjY1LjAxLS45MS0uNzMtMS42NS0xLjY1LTEuNjV6XFxcIj48L3BhdGg+PC9nPjxnPjxwYXRoIGNsYXNzPVxcXCJzdDRcXFwiIGQ9XFxcIk0xNzQuNDQgMTU3aDE3djRoLTE3elxcXCI+PC9wYXRoPjxjaXJjbGUgY2xhc3M9XFxcInN0M1xcXCIgY3g9XFxcIjE2NC4zMlxcXCIgY3k9XFxcIjE1OS4xMVxcXCIgcj1cXFwiNC42NFxcXCI+PC9jaXJjbGU+PHBhdGggY2xhc3M9XFxcInN0MlxcXCIgZD1cXFwiTTE2NC4yNSAxNjQuOGE1LjUyIDUuNTIgMCAwIDEtNS41MS01LjUxIDUuNTIgNS41MiAwIDAgMSA1LjUxLTUuNTFjMy4wNCAwIDUuNTEgMi40OCA1LjUxIDUuNTFzLTIuNDYgNS41MS01LjUxIDUuNTF6bTAtOS4zOGMtMi4xMyAwLTMuODYgMS43My0zLjg2IDMuODZzMS43MyAzLjg2IDMuODYgMy44NiAzLjg2LTEuNzMgMy44Ni0zLjg2YTMuODUgMy44NSAwIDAgMC0zLjg2LTMuODZ6XFxcIj48L3BhdGg+PGc+PGNpcmNsZSBjbGFzcz1cXFwic3QzXFxcIiBjeD1cXFwiMTY0LjI1XFxcIiBjeT1cXFwiMTU5LjI4XFxcIiByPVxcXCIuODNcXFwiPjwvY2lyY2xlPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0xNjQuMjUgMTU3LjYyYy0uOTIgMC0xLjY1Ljc0LTEuNjUgMS42NSAwIC45Mi43NCAxLjY1IDEuNjUgMS42NS45MiAwIDEuNjUtLjc0IDEuNjUtMS42NS4wMS0uOS0uNzMtMS42NS0xLjY1LTEuNjV6XFxcIj48L3BhdGg+PC9nPjwvZz48Zz48cGF0aCBjbGFzcz1cXFwic3Q0XFxcIiBkPVxcXCJNMTM1LjQ0IDE1N2gxN3Y0aC0xN3pcXFwiPjwvcGF0aD48Y2lyY2xlIGNsYXNzPVxcXCJzdDNcXFwiIGN4PVxcXCIxMjQuOTZcXFwiIGN5PVxcXCIxNTkuMTFcXFwiIHI9XFxcIjQuNjRcXFwiPjwvY2lyY2xlPjxwYXRoIGNsYXNzPVxcXCJzdDJcXFwiIGQ9XFxcIk0xMjQuODIgMTY0LjhhNS41MiA1LjUyIDAgMCAxLTUuNTEtNS41MSA1LjUyIDUuNTIgMCAwIDEgNS41MS01LjUxIDUuNTIgNS41MiAwIDAgMSA1LjUxIDUuNTEgNS41MiA1LjUyIDAgMCAxLTUuNTEgNS41MXptMC05LjM4Yy0yLjEzIDAtMy44NiAxLjczLTMuODYgMy44NnMxLjczIDMuODYgMy44NiAzLjg2IDMuODYtMS43MyAzLjg2LTMuODYtMS43My0zLjg2LTMuODYtMy44NnpcXFwiPjwvcGF0aD48Zz48Y2lyY2xlIGNsYXNzPVxcXCJzdDNcXFwiIGN4PVxcXCIxMjQuODJcXFwiIGN5PVxcXCIxNTkuMjhcXFwiIHI9XFxcIi44M1xcXCI+PC9jaXJjbGU+PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTEyNC44MiAxNTcuNjJjLS45MiAwLTEuNjUuNzQtMS42NSAxLjY1IDAgLjkyLjc0IDEuNjUgMS42NSAxLjY1LjkyIDAgMS42NS0uNzQgMS42NS0xLjY1cy0uNzQtMS42NS0xLjY1LTEuNjV6XFxcIj48L3BhdGg+PC9nPjwvZz48Zz48cGF0aCBjbGFzcz1cXFwic3QzXFxcIiBkPVxcXCJNMTIwLjQ0IDgzaDl2OWgtOXpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QyXFxcIiBkPVxcXCJNMTI5LjQ0IDg0djhoLTh2LThoOG0yLTJoLTEydjEyaDEyVjgyelxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDRcXFwiIGQ9XFxcIk0xMzcuNDQgODJoNTR2NGgtNTR6TTEzNy40NCA5MGg1NHY0aC01NHpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMTMyLjExIDg0Ljc1bC0uOTgtLjk3LTQuOTYgNC45Ni0yLjMxLTIuMzItLjk4Ljk3IDMuMjkgMy4zelxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDNcXFwiIGQ9XFxcIk0xMjAuNDQgMTAwaDl2OWgtOXpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QyXFxcIiBkPVxcXCJNMTI5LjQ0IDEwMXY4aC04di04aDhtMi0yaC0xMnYxMmgxMlY5OXpcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMTMyLjExIDEwMS43NWwtLjk4LS45Ny00Ljk2IDQuOTYtMi4zMS0yLjMyLS45OC45NyAzLjI5IDMuM3pcXFwiPjwvcGF0aD48cGF0aCBjbGFzcz1cXFwic3QzXFxcIiBkPVxcXCJNMTIwLjQ0IDExN2g5djloLTl6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0MlxcXCIgZD1cXFwiTTEyOS40NCAxMTh2OGgtOHYtOGg4bTItMmgtMTJ2MTJoMTJ2LTEyelxcXCI+PC9wYXRoPjxwYXRoIGNsYXNzPVxcXCJzdDBcXFwiIGQ9XFxcIk0xMzIuMTEgMTE4Ljc1bC0uOTgtLjk3LTQuOTYgNC45Ni0yLjMxLTIuMzItLjk4Ljk3IDMuMjkgMy4zelxcXCI+PC9wYXRoPjxnPjxwYXRoIGNsYXNzPVxcXCJzdDRcXFwiIGQ9XFxcIk0xMzcuNDQgMTAzaDU0djRoLTU0elxcXCI+PC9wYXRoPjwvZz48Zz48cGF0aCBjbGFzcz1cXFwic3Q0XFxcIiBkPVxcXCJNMTM3LjQ0IDExNmg1NHY0aC01NHpNMTM3LjQ0IDEyNGgyN3Y0aC0yN3pcXFwiPjwvcGF0aD48L2c+PC9nPjxnPjxwYXRoIGNsYXNzPVxcXCJzdDRcXFwiIGQ9XFxcIk0xMDQuNDQgOTNoLTJ2LTguMWE4LjIzIDguMjMgMCAwIDEtMyAxLjYzdi0xLjc1Yy41Ny0uMTggMS4xOS0uNTIgMS44Ni0xLjAyLjY3LS41IDEuMTMtMS4wOCAxLjM3LTEuNzVoMS43N1Y5M3pNMTA4LjQ0IDkzdi0yaDJ2MmgtMnpcXFwiPjwvcGF0aD48L2c+PGc+PHBhdGggY2xhc3M9XFxcInN0NFxcXCIgZD1cXFwiTTEwNi40NCAxNDd2Mkg5OC45Yy4wOC0uNzYuMzMtMS40Ny43NC0yLjE1LjQxLS42OCAxLjIyLTEuNTcgMi40Mi0yLjY5Ljk3LS45IDEuNTctMS41MiAxLjc5LTEuODQuMy0uNDQuNDQtLjg4LjQ0LTEuMzIgMC0uNDgtLjEzLS44NS0uMzktMS4xMS0uMjYtLjI2LS42MS0uMzktMS4wNy0uMzktLjQ1IDAtLjgxLjE0LTEuMDcuNDEtLjI3LjI3LS40Mi43Mi0uNDYgMS4zNWwtMi4xNS0uMjFjLjEzLTEuMTkuNTMtMi4wNCAxLjItMi41NS42Ny0uNTIgMS41Mi0uNzcgMi41My0uNzcgMS4xMSAwIDEuOTguMyAyLjYxLjkuNjMuNi45NSAxLjM0Ljk1IDIuMjMgMCAuNTEtLjA5Ljk5LS4yNyAxLjQ0LS4xOC40Ni0uNDcuOTQtLjg2IDEuNDQtLjI2LjMzLS43My44MS0xLjQxIDEuNDMtLjY4LjYyLTEuMTEgMS4wNC0xLjI5IDEuMjQtLjE4LjItLjMzLjQtLjQ0LjZoNC4yN3pNMTA4LjQ0IDE0OXYtMmgydjJoLTJ6XFxcIj48L3BhdGg+PC9nPjxnPjxwYXRoIGNsYXNzPVxcXCJzdDRcXFwiIGQ9XFxcIk05OC44MyAxODUuMjFsMi4wOC0uMjVjLjA3LjUzLjI0Ljk0LjU0IDEuMjIuMjkuMjguNjQuNDIgMS4wNi40Mi40NCAwIC44Mi0uMTcgMS4xMi0uNS4zLS4zNC40Ni0uNzkuNDYtMS4zNiAwLS41NC0uMTUtLjk3LS40NC0xLjI5LS4yOS0uMzItLjY1LS40Ny0xLjA2LS40Ny0uMjggMC0uNi4wNS0uOTkuMTZsLjI0LTEuNzVjLjU4LjAyIDEuMDMtLjExIDEuMzMtLjM4LjMxLS4yNy40Ni0uNjIuNDYtMS4wNyAwLS4zOC0uMTEtLjY4LS4zNC0uOS0uMjItLjIyLS41Mi0uMzQtLjktLjM0LS4zNyAwLS42OC4xMy0uOTQuMzgtLjI2LjI2LS40Mi42My0uNDcgMS4xMmwtMS45OC0uMzRjLjE0LS42OC4zNS0xLjIyLjYyLTEuNjMuMjgtLjQxLjY3LS43MiAxLjE2LS45Ni41LS4yMyAxLjA1LS4zNSAxLjY3LS4zNSAxLjA2IDAgMS45LjM0IDIuNTQgMS4wMS41My41NS43OSAxLjE3Ljc5IDEuODcgMCAuOTgtLjU0IDEuNzctMS42MSAyLjM2LjY0LjE0IDEuMTYuNDUgMS41NC45My4zOS40OC41OCAxLjA2LjU4IDEuNzQgMCAuOTgtLjM2IDEuODItMS4wOCAyLjUyLS43Mi42OS0xLjYxIDEuMDQtMi42OSAxLjA0LTEuMDIgMC0xLjg2LS4yOS0yLjUzLS44OHMtMS4wNS0xLjM1LTEuMTYtMi4zek0xMDguNDQgMTg4di0yaDJ2MmgtMnpcXFwiPjwvcGF0aD48L2c+PHBhdGggY2xhc3M9XFxcInN0NFxcXCIgZD1cXFwiTTExOS40NCAxNzdoNzJ2MTFoLTcyelxcXCI+PC9wYXRoPjxjaXJjbGUgY2xhc3M9XFxcInN0NVxcXCIgY3g9XFxcIjE5OC42XFxcIiBjeT1cXFwiMjA2LjI0XFxcIiByPVxcXCIzNS4xNVxcXCI+PC9jaXJjbGU+PGc+PGNpcmNsZSBjbGFzcz1cXFwic3Q2XFxcIiBjeD1cXFwiMjAzLjQ0XFxcIiBjeT1cXFwiMjAzXFxcIiByPVxcXCIzNVxcXCI+PC9jaXJjbGU+PHBhdGggY2xhc3M9XFxcInN0M1xcXCIgZD1cXFwiTTIwMy40NCAyMjZjLTIuMiAwLTQtMS44LTQtNHYtMzhjMC0yLjIgMS44LTQgNC00czQgMS44IDQgNHYzOGMwIDIuMi0xLjggNC00IDR6XFxcIj48L3BhdGg+PHBhdGggY2xhc3M9XFxcInN0M1xcXCIgZD1cXFwiTTE4MC40NCAyMDNjMC0yLjIgMS44LTQgNC00aDM4YzIuMiAwIDQgMS44IDQgNHMtMS44IDQtNCA0aC0zOGMtMi4yIDAtNC0xLjgtNC00elxcXCI+PC9wYXRoPjwvZz48L3N5bWJvbD48c3ltYm9sIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCIgaWQ9XFxcImljb24tbW9kaWZpZWRcXFwiPjxwYXRoIG9wYWNpdHk9XFxcIi45XFxcIiBkPVxcXCJNMTQgMTFWOGgtMS4yYy0uMS0uNC0uMy0uOC0uNS0xLjJsLjktLjhMMTEgMy44bC0uOS45Yy0uMy0uMi0uNy0uNC0xLjEtLjVWM0g2djEuMmMtLjQuMS0uOC4zLTEuMi41TDQgMy44IDEuOCA2bC45LjljLS4yLjMtLjQuNy0uNSAxLjFIMXYzaDEuMmMuMS40LjMuOC41IDEuMmwtLjkuOEw0IDE1LjJsLjktLjljLjQuMi44LjQgMS4yLjVWMTZoM3YtMS4yYy40LS4xLjgtLjMgMS4yLS41bC45LjkgMi4xLTIuMS0uOS0uOWMuMi0uNC40LS44LjUtMS4ySDE0em0tNi41IDEuNWMtMS43IDAtMy0xLjMtMy0zczEuMy0zIDMtMyAzIDEuMyAzIDMtMS4zIDMtMyAzelxcXCI+PC9wYXRoPjxwYXRoIG9wYWNpdHk9XFxcIi42XFxcIiBkPVxcXCJNMjQgMTd2LTJoLTEuMWMtLjEtLjQtLjItLjctLjQtMWwuOC0uOC0xLjQtMS40LS45LjhjLS4zLS4yLS43LS4zLTEtLjRWMTFoLTJ2MS4xYy0uNC4xLS43LjItMSAuNGwtLjgtLjgtMS40IDEuNC44LjhjLS4yLjMtLjMuNy0uNCAxSDE0djJoMS4xYy4xLjQuMi43LjQgMWwtLjguOCAxLjQgMS40LjgtLjhjLjMuMi43LjMgMSAuNFYyMWgydi0xLjFjLjQtLjEuNy0uMiAxLS40bC44LjggMS40LTEuNC0uNy0uOWMuMi0uMy4zLS43LjQtMUgyNHptLTUgMWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6XFxcIj48L3BhdGg+PC9zeW1ib2w+PHN5bWJvbCB2aWV3Qm94PVxcXCIwIDAgMjQgMjRcXFwiIGlkPVxcXCJpY29uLXNhdmVkXFxcIj48cGF0aCBvcGFjaXR5PVxcXCIuOVxcXCIgZD1cXFwiTTQgMTNsMi0yIDQgNCA5LTkgMiAyLTExIDExelxcXCI+PC9wYXRoPjwvc3ltYm9sPjxzeW1ib2wgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIiBpZD1cXFwiaWNvbi1zYXZpbmdcXFwiPjxwYXRoIG9wYWNpdHk9XFxcIi41XFxcIiBkPVxcXCJNMTAgMTdoM3Y1aC0zelxcXCI+PC9wYXRoPjxwYXRoIG9wYWNpdHk9XFxcIi45XFxcIiBkPVxcXCJNMTAgMWgzdjVoLTN6XFxcIj48L3BhdGg+PHBhdGggb3BhY2l0eT1cXFwiLjJcXFwiIGQ9XFxcIk02IDEwdjNIMXYtM3pcXFwiPjwvcGF0aD48cGF0aCBvcGFjaXR5PVxcXCIuN1xcXCIgZD1cXFwiTTIyIDEwdjNoLTV2LTN6XFxcIj48L3BhdGg+PHBhdGggb3BhY2l0eT1cXFwiLjZcXFwiIGQ9XFxcIk0xNC4zOSAxNi40NWwyLjEyLTIuMTIxIDMuNTM2IDMuNTM1LTIuMTIxIDIuMTIxelxcXCI+PC9wYXRoPjxwYXRoIG9wYWNpdHk9XFxcIi4xXFxcIiBkPVxcXCJNMi45NTQgNS4xMzZsMi4xMjEtMi4xMjFMOC42MSA2LjU1IDYuNDkgOC42NzJ6XFxcIj48L3BhdGg+PHBhdGggb3BhY2l0eT1cXFwiLjNcXFwiIGQ9XFxcIk02LjQ5IDE0LjMyOGwyLjEyIDIuMTIyLTMuNTM1IDMuNTM1LTIuMTIxLTIuMTIxelxcXCI+PC9wYXRoPjxwYXRoIG9wYWNpdHk9XFxcIi44XFxcIiBkPVxcXCJNMTcuOTI1IDMuMDE1bDIuMTIxIDIuMTItMy41MzUgMy41MzYtMi4xMjItMi4xMnpcXFwiPjwvcGF0aD48L3N5bWJvbD48L3N2Zz5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3ZkLWVtYmVkLXN1cnZleS10YWJcXFwiPlxcbiAgPGRpdiBjbGFzcz1cXFwicm93XFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIHN2ZF9jdXN0b21fc2VsZWN0IHN2ZF9lbWJlZF90YWJcXFwiPlxcbiAgICAgIDxzZWxlY3RcXG4gICAgICAgIG9ubW91c2V3aGVlbD1cXFwicmV0dXJuIGZhbHNlO1xcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiaWY6IHRydWUsIHZhbHVlOmtvTGlicmFyeVZlcnNpb25cXFwiXFxuICAgICAgPlxcbiAgICAgICAgPG9wdGlvblxcbiAgICAgICAgICB2YWx1ZT1cXFwiYW5ndWxhclxcXCJcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ2V3LmFuZ3VsYXInKVxcXCJcXG4gICAgICAgID48L29wdGlvbj5cXG4gICAgICAgIDxvcHRpb25cXG4gICAgICAgICAgdmFsdWU9XFxcImpxdWVyeVxcXCJcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ2V3LmpxdWVyeScpXFxcIlxcbiAgICAgICAgPjwvb3B0aW9uPlxcbiAgICAgICAgPG9wdGlvblxcbiAgICAgICAgICB2YWx1ZT1cXFwia25vY2tvdXRcXFwiXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEuZ2V0TG9jU3RyaW5nKCdldy5rbm9ja291dCcpXFxcIlxcbiAgICAgICAgPjwvb3B0aW9uPlxcbiAgICAgICAgPG9wdGlvblxcbiAgICAgICAgICB2YWx1ZT1cXFwicmVhY3RcXFwiXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEuZ2V0TG9jU3RyaW5nKCdldy5yZWFjdCcpXFxcIlxcbiAgICAgICAgPjwvb3B0aW9uPlxcbiAgICAgICAgPG9wdGlvblxcbiAgICAgICAgICB2YWx1ZT1cXFwidnVlXFxcIlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmdldExvY1N0cmluZygnZXcudnVlJylcXFwiXFxuICAgICAgICA+PC9vcHRpb24+XFxuICAgICAgPC9zZWxlY3Q+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgc3ZkX2N1c3RvbV9zZWxlY3Qgc3ZkX2VtYmVkX3RhYlxcXCI+XFxuICAgICAgPHNlbGVjdFxcbiAgICAgICAgb25tb3VzZXdoZWVsPVxcXCJyZXR1cm4gZmFsc2U7XFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJpZjogdHJ1ZSwgdmFsdWU6a29UaGVtZU5hbWVcXFwiXFxuICAgICAgPlxcbiAgICAgICAgPG9wdGlvblxcbiAgICAgICAgICB2YWx1ZT1cXFwibW9kZXJuXFxcIlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmdldExvY1N0cmluZygnZXcubW9kZXJuJylcXFwiXFxuICAgICAgICA+PC9vcHRpb24+XFxuICAgICAgICA8b3B0aW9uXFxuICAgICAgICAgIHZhbHVlPVxcXCJkZWZhdWx0XFxcIlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmdldExvY1N0cmluZygnZXcuZGVmYXVsdCcpXFxcIlxcbiAgICAgICAgPjwvb3B0aW9uPlxcbiAgICAgICAgPG9wdGlvblxcbiAgICAgICAgICB2YWx1ZT1cXFwib3JhbmdlXFxcIlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmdldExvY1N0cmluZygnZXcub3JhbmdlJylcXFwiXFxuICAgICAgICA+PC9vcHRpb24+XFxuICAgICAgICA8b3B0aW9uXFxuICAgICAgICAgIHZhbHVlPVxcXCJkYXJrYmx1ZVxcXCJcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ2V3LmRhcmtibHVlJylcXFwiXFxuICAgICAgICA+PC9vcHRpb24+XFxuICAgICAgICA8b3B0aW9uXFxuICAgICAgICAgIHZhbHVlPVxcXCJkYXJrcm9zZVxcXCJcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ2V3LmRhcmtyb3NlJylcXFwiXFxuICAgICAgICA+PC9vcHRpb24+XFxuICAgICAgICA8b3B0aW9uXFxuICAgICAgICAgIHZhbHVlPVxcXCJzdG9uZVxcXCJcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ2V3LnN0b25lJylcXFwiXFxuICAgICAgICA+PC9vcHRpb24+XFxuICAgICAgICA8b3B0aW9uXFxuICAgICAgICAgIHZhbHVlPVxcXCJ3aW50ZXJcXFwiXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEuZ2V0TG9jU3RyaW5nKCdldy53aW50ZXInKVxcXCJcXG4gICAgICAgID48L29wdGlvbj5cXG4gICAgICAgIDxvcHRpb25cXG4gICAgICAgICAgdmFsdWU9XFxcIndpbnRlcnN0b25lXFxcIlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmdldExvY1N0cmluZygnZXcud2ludGVyc3RvbmUnKVxcXCJcXG4gICAgICAgID48L29wdGlvbj5cXG4gICAgICAgIDxvcHRpb25cXG4gICAgICAgICAgdmFsdWU9XFxcImJvb3RzdHJhcFxcXCJcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ2V3LmJvb3RzdHJhcCcpXFxcIlxcbiAgICAgICAgPjwvb3B0aW9uPlxcbiAgICAgIDwvc2VsZWN0PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIHN2ZF9jdXN0b21fc2VsZWN0IHN2ZF9lbWJlZF90YWJcXFwiPlxcbiAgICAgIDxzZWxlY3RcXG4gICAgICAgIG9ubW91c2V3aGVlbD1cXFwicmV0dXJuIGZhbHNlO1xcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiaWY6IHRydWUsIHZhbHVlOmtvU2hvd0FzV2luZG93XFxcIlxcbiAgICAgID5cXG4gICAgICAgIDxvcHRpb25cXG4gICAgICAgICAgdmFsdWU9XFxcInBhZ2VcXFwiXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEuZ2V0TG9jU3RyaW5nKCdldy5zaG93T25QYWdlJylcXFwiXFxuICAgICAgICA+PC9vcHRpb24+XFxuICAgICAgICA8b3B0aW9uXFxuICAgICAgICAgIHZhbHVlPVxcXCJ3aW5kb3dcXFwiXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEuZ2V0TG9jU3RyaW5nKCdldy5zaG93SW5XaW5kb3cnKVxcXCJcXG4gICAgICAgID48L29wdGlvbj5cXG4gICAgICA8L3NlbGVjdD5cXG4gICAgPC9kaXY+XFxuICAgIDxsYWJlbFxcbiAgICAgIGNsYXNzPVxcXCJjaGVja2JveC1pbmxpbmUgZm9ybS1jaGVjay1sYWJlbFxcXCJcXG4gICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6a29IYXNJZHNcXFwiXFxuICAgID5cXG4gICAgICA8aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiIGRhdGEtYmluZD1cXFwiY2hlY2tlZDprb0xvYWRTdXJ2ZXlcXFwiIC8+XFxuICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ2V3LmxvYWRGcm9tU2VydmVyJylcXFwiPjwvc3Bhbj5cXG4gICAgPC9sYWJlbD5cXG4gIDwvZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwicGFuZWwgY2FyZFxcXCI+XFxuICAgIDxkaXZcXG4gICAgICBjbGFzcz1cXFwicGFuZWwtaGVhZGluZyBjYXJkLWhlYWRlclxcXCJcXG4gICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmdldExvY1N0cmluZygnZXcudGl0bGVTY3JpcHQnKVxcXCJcXG4gICAgPjwvZGl2PlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTpoYXNBY2VFZGl0b3JcXFwiPlxcbiAgICAgIDxkaXYgaWQ9XFxcInN1cnZleUVtYmVkaW5nSGVhZFxcXCIgc3R5bGU9XFxcImhlaWdodDogNzBweDsgd2lkdGg6IDEwMCVcXFwiPjwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPHRleHRhcmVhXFxuICAgICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiFoYXNBY2VFZGl0b3IsIHRleHQ6IGtvSGVhZFRleHRcXFwiXFxuICAgICAgc3R5bGU9XFxcImhlaWdodDogNzBweDsgd2lkdGg6IDEwMCVcXFwiXFxuICAgID48L3RleHRhcmVhPlxcbiAgPC9kaXY+XFxuICA8ZGl2IGNsYXNzPVxcXCJwYW5lbCBjYXJkXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvVmlzaWJsZUh0bWxcXFwiPlxcbiAgICA8ZGl2XFxuICAgICAgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmcgY2FyZC1oZWFkZXJcXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ2V3LnRpdGxlSHRtbCcpXFxcIlxcbiAgICA+PC9kaXY+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOmhhc0FjZUVkaXRvclxcXCI+XFxuICAgICAgPGRpdiBpZD1cXFwic3VydmV5RW1iZWRpbmdCb2R5XFxcIiBzdHlsZT1cXFwiaGVpZ2h0OiAzMHB4OyB3aWR0aDogMTAwJVxcXCI+PC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8dGV4dGFyZWFcXG4gICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6IWhhc0FjZUVkaXRvciwgdGV4dDoga29Cb2R5VGV4dFxcXCJcXG4gICAgICBzdHlsZT1cXFwiaGVpZ2h0OiAzMHB4OyB3aWR0aDogMTAwJVxcXCJcXG4gICAgPjwvdGV4dGFyZWE+XFxuICA8L2Rpdj5cXG4gIDxkaXYgY2xhc3M9XFxcInBhbmVsIGNhcmRcXFwiPlxcbiAgICA8ZGl2XFxuICAgICAgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmcgY2FyZC1oZWFkZXJcXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ2V3LnRpdGxlSmF2YVNjcmlwdCcpXFxcIlxcbiAgICA+PC9kaXY+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOmhhc0FjZUVkaXRvclxcXCI+XFxuICAgICAgPGRpdiBpZD1cXFwic3VydmV5RW1iZWRpbmdKYXZhXFxcIiBzdHlsZT1cXFwiaGVpZ2h0OiAzMDBweDsgd2lkdGg6IDEwMCVcXFwiPjwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPHRleHRhcmVhXFxuICAgICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiFoYXNBY2VFZGl0b3IsIHRleHQ6IGtvSmF2YVRleHRcXFwiXFxuICAgICAgc3R5bGU9XFxcImhlaWdodDogMzAwcHg7IHdpZHRoOiAxMDAlXFxcIlxcbiAgICA+PC90ZXh0YXJlYT5cXG4gIDwvZGl2PlxcbjwvZGl2PlxcblwiOyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleUpTT041IH0gZnJvbSBcIi4uL2pzb241XCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyBTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4uL2VkaXRvclwiO1xuXG5pbXBvcnQgXCIuL2VtYmVkLnNjc3NcIjtcbnZhciB0ZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi9lbWJlZC5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5RW1iZWRpbmdXaW5kb3cge1xuICBwcml2YXRlIGpzb25WYWx1ZTogYW55O1xuICBwcml2YXRlIHN1cnZleUVtYmVkaW5nSGVhZDogQWNlQWpheC5FZGl0b3I7XG4gIHByaXZhdGUgc3VydmV5RW1iZWRpbmdKYXZhOiBBY2VBamF4LkVkaXRvcjtcbiAgcHJpdmF0ZSBzdXJ2ZXlFbWJlZGluZ0JvZHk6IEFjZUFqYXguRWRpdG9yO1xuICBrb0hlYWRUZXh0OiBhbnk7XG4gIGtvQm9keVRleHQ6IGFueTtcbiAga29KYXZhVGV4dDogYW55O1xuICBwdWJsaWMgc3VydmV5SWQ6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBzdXJ2ZXlQb3N0SWQ6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBnZW5lcmF0ZVZhbGlkSlNPTjogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgc3VydmV5SlNWZXJzaW9uOiBzdHJpbmcgPSBTdXJ2ZXkuVmVyc2lvbjtcbiAgcHVibGljIHN1cnZleUNETlBhdGg6IHN0cmluZyA9IFwiaHR0cHM6Ly91bnBrZy5jb21cIjtcbiAga29TaG93QXNXaW5kb3c6IGFueTtcbiAga29UaGVtZU5hbWU6IGFueTtcbiAga29IYXNJZHM6IGFueTtcbiAga29Mb2FkU3VydmV5OiBhbnk7XG4gIGtvTGlicmFyeVZlcnNpb246IGFueTtcbiAga29WaXNpYmxlSHRtbDogYW55O1xuICBwcml2YXRlIHBsYXRmb3JtQ29tcGxldGVDb2RlID0ge1xuICAgIGFuZ3VsYXI6IFwiICAgICAgICBzdXJ2ZXkub25Db21wbGV0ZS5hZGQoc2VuZERhdGFUb1NlcnZlcik7XFxuXCIsXG4gICAganF1ZXJ5OiBcIlxcbiAgICBvbkNvbXBsZXRlOiBzZW5kRGF0YVRvU2VydmVyXCIsXG4gICAga25vY2tvdXQ6IFwiXFxuc3VydmV5Lm9uQ29tcGxldGUuYWRkKHNlbmREYXRhVG9TZXJ2ZXIpO1wiLFxuICAgIHJlYWN0OiBcIiBvbkNvbXBsZXRlPXsgc2VuZERhdGFUb1NlcnZlciB9XCIsXG4gICAgdnVlOiBcIlxcbnN1cnZleS5vbkNvbXBsZXRlLmFkZChzZW5kRGF0YVRvU2VydmVyKTtcIixcbiAgfTtcbiAgcHJpdmF0ZSBwbGF0Zm9ybUpTb25QYWdlID0ge1xuICAgIGFuZ3VsYXI6XG4gICAgICBcIkBDb21wb25lbnQoe1xcbiAgc2VsZWN0b3I6ICduZy1hcHAnLFxcbiAgICAgICAgdGVtcGxhdGU6IFxcbiAgICAgICAgPGRpdiBpZD0nc3VydmV5RWxlbWVudCc+PC9kaXY+XFxcIixcXG59KVxcbmV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xcbiAgICBuZ09uSW5pdCgpIHtcXG4gICAgICAgIHZhciBzdXJ2ZXkgPSBuZXcgU3VydmV5Lk1vZGVsKHN1cnZleUpTT04pO1xcbiNjb21wbGV0ZSMgICAgICAgU3VydmV5LlN1cnZleU5HLnJlbmRlcihcXFwic3VydmV5RWxlbWVudFxcXCIsIHsgbW9kZWw6IHN1cnZleSB9KTtcXG4gICAgfVxcbn1cIixcbiAgICBqcXVlcnk6XG4gICAgICAndmFyIHN1cnZleSA9IG5ldyBTdXJ2ZXkuTW9kZWwoc3VydmV5SlNPTik7XFxuJChcIiNzdXJ2ZXlDb250YWluZXJcIikuU3VydmV5KHtcXG4gICAgbW9kZWw6IHN1cnZleSwjY29tcGxldGUjXFxufSk7JyxcbiAgICBrbm9ja291dDpcbiAgICAgICd2YXIgc3VydmV5ID0gbmV3IFN1cnZleS5Nb2RlbChzdXJ2ZXlKU09OLCBcInN1cnZleUNvbnRhaW5lclwiKTsjY29tcGxldGUjJyxcbiAgICByZWFjdDpcbiAgICAgICdSZWFjdERPTS5yZW5kZXIoXFxuICAgIDxTdXJ2ZXkuU3VydmV5IGpzb249eyBzdXJ2ZXlKU09OIH0jY29tcGxldGUjIC8+LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN1cnZleUNvbnRhaW5lclwiKSk7JyxcbiAgICB2dWU6XG4gICAgICBcInZhciBzdXJ2ZXkgPSBuZXcgU3VydmV5Lk1vZGVsKHN1cnZleUpTT04pOyNjb21wbGV0ZSNcXG5uZXcgVnVlKHsgZWw6ICcjc3VydmV5Q29udGFpbmVyJywgZGF0YTogeyBzdXJ2ZXk6IHN1cnZleSB9IH0pO1wiLFxuICB9O1xuICBwcml2YXRlIHBsYXRmb3JtSlNvbldpbmRvdyA9IHtcbiAgICBhbmd1bGFyOlxuICAgICAgXCJAQ29tcG9uZW50KHtcXG4gIHNlbGVjdG9yOiAnbmctYXBwJyxcXG4gICAgICAgIHRlbXBsYXRlOiBcXG4gICAgICAgIDxkaXYgaWQ9J3N1cnZleUVsZW1lbnQnPjwvZGl2PlxcXCIsXFxufSlcXG5leHBvcnQgY2xhc3MgQXBwQ29tcG9uZW50IHtcXG4gICAgbmdPbkluaXQoKSB7XFxuICAgICAgICB2YXIgc3VydmV5ID0gbmV3IFN1cnZleS5Nb2RlbChzdXJ2ZXlKU09OKTsjY29tcGxldGUjXFxuICAgICAgIFN1cnZleS5TdXJ2ZXlXaW5kb3dORy5yZW5kZXIoXFxcInN1cnZleUVsZW1lbnRcXFwiLCB7IG1vZGVsOiBzdXJ2ZXkgfSk7XFxuICAgIH1cXG59XCIsXG4gICAganF1ZXJ5OlxuICAgICAgJ3ZhciBzdXJ2ZXkgPSBuZXcgU3VydmV5Lk1vZGVsKHN1cnZleUpTT04pO1xcbiQoXCIjc3VydmV5Q29udGFpbmVyXCIpLlN1cnZleVdpbmRvdyh7XFxuICAgIG1vZGVsOiBzdXJ2ZXksI2NvbXBsZXRlI1xcbn0pOycsXG4gICAga25vY2tvdXQ6XG4gICAgICBcInZhciBzdXJ2ZXkgPSBuZXcgU3VydmV5Lk1vZGVsKHN1cnZleUpTT04pO1xcbnN1cnZleVdpbmRvdy5zaG93KCk7I2NvbXBsZXRlI1wiLFxuICAgIHJlYWN0OlxuICAgICAgJ1JlYWN0RE9NLnJlbmRlcihcXG4gICAgPFN1cnZleS5TdXJ2ZXlXaW5kb3cganNvbj17IHN1cnZleUpTT04gfSAjY29tcGxldGUjIC8+LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN1cnZleUNvbnRhaW5lclwiKSk7JyxcbiAgICB2dWU6IFwiXCIsXG4gIH07XG4gIHByaXZhdGUgcGxhdGZvcm1IdG1sb25QYWdlID0ge1xuICAgIGFuZ3VsYXI6IFwiPG5nLWFwcD48L25nLWFwcD5cIixcbiAgICBqcXVlcnk6ICc8ZGl2IGlkPVwic3VydmV5Q29udGFpbmVyXCI+PC9kaXY+JyxcbiAgICBrbm9ja291dDogJzxkaXYgaWQ9XCJzdXJ2ZXlDb250YWluZXJcIj48L2Rpdj4nLFxuICAgIHJlYWN0OiAnPGRpdiBpZD1cInN1cnZleUNvbnRhaW5lclwiPjwvZGl2PicsXG4gICAgdnVlOiAnPGRpdiBpZD1cInN1cnZleUNvbnRhaW5lclwiPjxzdXJ2ZXkgOnN1cnZleT1cInN1cnZleVwiPjwvc3VydmV5PjwvZGl2PicsXG4gIH07XG4gIHByaXZhdGUgcGxhdGZvcm1IdG1sb25XaW5kb3cgPSB7XG4gICAgYW5ndWxhcjogXCI8bmctYXBwPjwvbmctYXBwPlwiLFxuICAgIGpxdWVyeTogJzxkaXYgaWQ9XCJzdXJ2ZXlDb250YWluZXJcIj48L2Rpdj4nLFxuICAgIGtub2Nrb3V0OiBcIlwiLFxuICAgIHJlYWN0OiAnPGRpdiBpZD1cInN1cnZleUNvbnRhaW5lclwiPjwvZGl2PicsXG4gICAgdnVlOlxuICAgICAgXCI8ZGl2IGlkPSdzdXJ2ZXlDb250YWluZXInPjxzdXJ2ZXktd2luZG93IDpzdXJ2ZXk9J3N1cnZleSc+PC9zdXJ2ZXktd2luZG93PjwvZGl2PlwiLFxuICB9O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0xpYnJhcnlWZXJzaW9uID0ga28ub2JzZXJ2YWJsZShcImpxdWVyeVwiKTtcbiAgICB0aGlzLmtvU2hvd0FzV2luZG93ID0ga28ub2JzZXJ2YWJsZShcInBhZ2VcIik7XG4gICAgdGhpcy5rb1RoZW1lTmFtZSA9IGtvLm9ic2VydmFibGUoXCJtb2Rlcm5cIik7XG4gICAgdGhpcy5rb0hhc0lkcyA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICAgIHRoaXMua29Mb2FkU3VydmV5ID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG5cbiAgICB0aGlzLmtvSGVhZFRleHQgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHRoaXMua29KYXZhVGV4dCA9IGtvLm9ic2VydmFibGUoXCJcIik7XG4gICAgdGhpcy5rb0JvZHlUZXh0ID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcblxuICAgIHRoaXMua29WaXNpYmxlSHRtbCA9IGtvLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNlbGYua29TaG93QXNXaW5kb3coKSA9PSBcInBhZ2VcIiB8fFxuICAgICAgICBzZWxmLnBsYXRmb3JtSHRtbG9uV2luZG93W3NlbGYua29MaWJyYXJ5VmVyc2lvbigpXSAhPSBcIlwiXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMua29MaWJyYXJ5VmVyc2lvbi5zdWJzY3JpYmUoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICBzZWxmLnNldEhlYWRUZXh0KCk7XG4gICAgICBzZWxmLnNldEphdmFUZXN0KCk7XG4gICAgICBzZWxmLnNldEJvZHlUZXh0KCk7XG4gICAgfSk7XG4gICAgdGhpcy5rb1Nob3dBc1dpbmRvdy5zdWJzY3JpYmUoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICBzZWxmLnNldEphdmFUZXN0KCk7XG4gICAgICBzZWxmLnNldEJvZHlUZXh0KCk7XG4gICAgfSk7XG4gICAgdGhpcy5rb1RoZW1lTmFtZS5zdWJzY3JpYmUoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICBzZWxmLnNldEhlYWRUZXh0KCk7XG4gICAgICBzZWxmLnNldEphdmFUZXN0KCk7XG4gICAgfSk7XG4gICAgdGhpcy5rb0xvYWRTdXJ2ZXkuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgc2VsZi5zZXRKYXZhVGVzdCgpO1xuICAgIH0pO1xuICAgIHRoaXMuc3VydmV5RW1iZWRpbmdIZWFkID0gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jU3RyaW5nKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXQganNvbigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmpzb25WYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGpzb24odmFsdWU6IGFueSkge1xuICAgIHRoaXMuanNvblZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBoYXNBY2VFZGl0b3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBhY2UgIT09IFwidW5kZWZpbmVkXCI7XG4gIH1cbiAgcHVibGljIHNob3coKSB7XG4gICAgaWYgKHRoaXMuaGFzQWNlRWRpdG9yICYmIHRoaXMuc3VydmV5RW1iZWRpbmdIZWFkID09IG51bGwpIHtcbiAgICAgIHRoaXMuc3VydmV5RW1iZWRpbmdIZWFkID0gdGhpcy5jcmVhdGVFZGl0b3IoXCJzdXJ2ZXlFbWJlZGluZ0hlYWRcIik7XG4gICAgICB0aGlzLnN1cnZleUVtYmVkaW5nQm9keSA9IHRoaXMuY3JlYXRlRWRpdG9yKFwic3VydmV5RW1iZWRpbmdCb2R5XCIpO1xuICAgICAgdGhpcy5zdXJ2ZXlFbWJlZGluZ0phdmEgPSB0aGlzLmNyZWF0ZUVkaXRvcihcInN1cnZleUVtYmVkaW5nSmF2YVwiKTtcbiAgICB9XG4gICAgdGhpcy5rb0hhc0lkcyh0aGlzLnN1cnZleUlkICYmIHRoaXMuc3VydmV5UG9zdElkKTtcbiAgICB0aGlzLnNldEJvZHlUZXh0KCk7XG4gICAgdGhpcy5zZXRIZWFkVGV4dCgpO1xuICAgIHRoaXMuc2V0SmF2YVRlc3QoKTtcbiAgfVxuICBwcml2YXRlIHNldEJvZHlUZXh0KCkge1xuICAgIHRoaXMuc2V0VGV4dFRvRWRpdG9yKFxuICAgICAgdGhpcy5zdXJ2ZXlFbWJlZGluZ0JvZHksXG4gICAgICB0aGlzLmtvQm9keVRleHQsXG4gICAgICB0aGlzLnBsYXRmb3JtSHRtbG9uUGFnZVt0aGlzLmtvTGlicmFyeVZlcnNpb24oKV1cbiAgICApO1xuICB9XG4gIHByaXZhdGUgc2V0SGVhZFRleHQoKSB7XG4gICAgdmFyIHBsYXRmb3JtID0gdGhpcy5rb0xpYnJhcnlWZXJzaW9uKCk7XG4gICAgdmFyIHBsYXRmb3JtRmlsZU5hbWU7XG4gICAgdmFyIGNzc0ZpbGVOYW1lID0gdGhpcy5rb1RoZW1lTmFtZSgpID09IFwibW9kZXJuXCIgPyBcIm1vZGVyblwiIDogXCJzdXJ2ZXlcIjtcbiAgICB2YXIgc3VydmV5SlNWZXJzaW9uID0gdGhpcy5zdXJ2ZXlKU1ZlcnNpb247XG4gICAgdmFyIGNkblBhdGggPSBgJHt0aGlzLnN1cnZleUNETlBhdGh9L3N1cnZleS0ke3BsYXRmb3JtfUAke3N1cnZleUpTVmVyc2lvbn1gO1xuXG4gICAgdmFyIGhlYWRUZXh0ID1cbiAgICAgIFwiPCEtLSBZb3VyIHBsYXRmb3JtIChcIiArIHRoaXMua29MaWJyYXJ5VmVyc2lvbigpICsgXCIpIHNjcmlwdHMuIC0tPlxcblwiO1xuICAgIGlmICh0aGlzLmtvVGhlbWVOYW1lKCkgIT0gXCJib290c3RyYXBcIikge1xuICAgICAgaGVhZFRleHQgKz0gYFxcbjxsaW5rIGhyZWY9XCIke2NkblBhdGh9LyR7Y3NzRmlsZU5hbWV9LmNzc1wiIHR5cGU9XCJ0ZXh0L2Nzc1wiIHJlbD1cInN0eWxlc2hlZXRcIiAvPmA7XG4gICAgfVxuXG4gICAgaWYgKHBsYXRmb3JtID09PSBcImtub2Nrb3V0XCIpIHtcbiAgICAgIHBsYXRmb3JtRmlsZU5hbWUgPSBcImtvXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBsYXRmb3JtRmlsZU5hbWUgPSBwbGF0Zm9ybTtcbiAgICB9XG5cbiAgICBoZWFkVGV4dCArPSBgXFxuPHNjcmlwdCBzcmM9XCIke2NkblBhdGh9L3N1cnZleS4ke3BsYXRmb3JtRmlsZU5hbWV9Lm1pbi5qc1wiPjwvc2NyaXB0PmA7XG4gICAgdGhpcy5zZXRUZXh0VG9FZGl0b3IodGhpcy5zdXJ2ZXlFbWJlZGluZ0hlYWQsIHRoaXMua29IZWFkVGV4dCwgaGVhZFRleHQpO1xuICB9XG4gIHByaXZhdGUgc2V0SmF2YVRlc3QoKSB7XG4gICAgdGhpcy5zZXRUZXh0VG9FZGl0b3IoXG4gICAgICB0aGlzLnN1cnZleUVtYmVkaW5nSmF2YSxcbiAgICAgIHRoaXMua29KYXZhVGV4dCxcbiAgICAgIHRoaXMuZ2V0SmF2YVRleHQoKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVFZGl0b3IoZWxlbWVudE5hbWU6IHN0cmluZyk6IEFjZUFqYXguRWRpdG9yIHtcbiAgICB2YXIgZWRpdG9yID0gYWNlLmVkaXQoZWxlbWVudE5hbWUpO1xuICAgIGVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9tb25va2FpXCIpO1xuICAgIGVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9qc29uXCIpO1xuICAgIGVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xuICAgIGVkaXRvci5yZW5kZXJlci5zZXRTaG93R3V0dGVyKGZhbHNlKTtcbiAgICBlZGl0b3Iuc2V0UmVhZE9ubHkodHJ1ZSk7XG4gICAgcmV0dXJuIGVkaXRvcjtcbiAgfVxuICBwcml2YXRlIGdldEphdmFUZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIGlzT25QYWdlID0gdGhpcy5rb1Nob3dBc1dpbmRvdygpID09IFwicGFnZVwiO1xuICAgIHZhciBzdHIgPSAhdGhpcy5rb0xvYWRTdXJ2ZXkoKSA/IHRoaXMuZ2V0U2F2ZUZ1bmMoKSArIFwiXFxuXFxuXCIgOiBcIlwiO1xuICAgIHZhciBzdHJDb2RlID0gaXNPblBhZ2VcbiAgICAgID8gdGhpcy5wbGF0Zm9ybUpTb25QYWdlW3RoaXMua29MaWJyYXJ5VmVyc2lvbigpXVxuICAgICAgOiB0aGlzLnBsYXRmb3JtSlNvbldpbmRvd1t0aGlzLmtvTGlicmFyeVZlcnNpb24oKV07XG4gICAgdmFyIHJlcGxhY2VkQ29tcGxldGVDb2RlID0gIXRoaXMua29Mb2FkU3VydmV5KClcbiAgICAgID8gdGhpcy5wbGF0Zm9ybUNvbXBsZXRlQ29kZVt0aGlzLmtvTGlicmFyeVZlcnNpb24oKV1cbiAgICAgIDogXCJcIjtcbiAgICBzdHJDb2RlID0gc3RyQ29kZS5yZXBsYWNlKFwiI2NvbXBsZXRlI1wiLCByZXBsYWNlZENvbXBsZXRlQ29kZSk7XG4gICAgc3RyICs9IHN0ckNvZGU7XG4gICAgdmFyIGpzb25UZXh0ID0gXCJ2YXIgc3VydmV5SlNPTiA9IFwiICsgdGhpcy5nZXRKc29uVGV4dCgpICsgXCJcXG5cXG5cIjtcbiAgICByZXR1cm4gdGhpcy5nZXRTZXRDc3MoKSArIFwiXFxuXCIgKyBqc29uVGV4dCArIHN0cjtcbiAgfVxuICBwcml2YXRlIGdldFNldENzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiAnU3VydmV5LlN0eWxlc01hbmFnZXIuYXBwbHlUaGVtZShcIicgKyB0aGlzLmtvVGhlbWVOYW1lKCkgKyAnXCIpO1xcbic7XG4gIH1cbiAgcHJpdmF0ZSBnZXRTYXZlRnVuYygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgXCJmdW5jdGlvbiBzZW5kRGF0YVRvU2VydmVyKHN1cnZleSkge1xcblwiICsgdGhpcy5nZXRTYXZlRnVuY0NvZGUoKSArIFwiXFxufVwiXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldFNhdmVGdW5jQ29kZSgpIHtcbiAgICBpZiAodGhpcy5rb0hhc0lkcygpKVxuICAgICAgcmV0dXJuIFwiICAgIHN1cnZleS5zZW5kUmVzdWx0KCdcIiArIHRoaXMuc3VydmV5UG9zdElkICsgXCInKTtcIjtcbiAgICByZXR1cm4gJyAgICAvL3NlbmQgQWpheCByZXF1ZXN0IHRvIHlvdXIgd2ViIHNlcnZlci5cXG4gICAgYWxlcnQoXCJUaGUgcmVzdWx0cyBhcmU6XCIgKyBKU09OLnN0cmluZ2lmeShzdXJ2ZXkuZGF0YSkpOyc7XG4gIH1cbiAgcHJpdmF0ZSBnZXRKc29uVGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmtvTG9hZFN1cnZleSgpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBcInsgc3VydmV5SWQ6ICdcIiArXG4gICAgICAgIHRoaXMuc3VydmV5SWQgK1xuICAgICAgICBcIicsIHN1cnZleVBvc3RJZDogJ1wiICtcbiAgICAgICAgdGhpcy5zdXJ2ZXlQb3N0SWQgK1xuICAgICAgICBcIid9XCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdlbmVyYXRlVmFsaWRKU09OKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5qc29uKTtcbiAgICByZXR1cm4gbmV3IFN1cnZleUpTT041KCkuc3RyaW5naWZ5KHRoaXMuanNvbik7XG4gIH1cbiAgcHJpdmF0ZSBzZXRUZXh0VG9FZGl0b3IoZWRpdG9yOiBBY2VBamF4LkVkaXRvciwga29UZXh0OiBhbnksIHRleHQ6IHN0cmluZykge1xuICAgIGlmIChlZGl0b3IpIGVkaXRvci5zZXRWYWx1ZSh0ZXh0KTtcbiAgICBpZiAoa29UZXh0KSBrb1RleHQodGV4dCk7XG4gIH1cbiAgZGlzcG9zZSgpIHt9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdXJ2ZXktZW1iZWRcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIHZhciBjcmVhdG9yOiBTdXJ2ZXlDcmVhdG9yID0gcGFyYW1zLmNyZWF0b3I7XG4gICAgICB2YXIgbW9kZWwgPSBuZXcgU3VydmV5RW1iZWRpbmdXaW5kb3coKTtcblxuICAgICAgdmFyIHN1YnNjclZpZXdUeXBlID0gY3JlYXRvci5rb1ZpZXdUeXBlLnN1YnNjcmliZSgodmlld1R5cGUpID0+IHtcbiAgICAgICAgaWYgKHZpZXdUeXBlID09PSBcImVtYmVkXCIpIHtcbiAgICAgICAgICB2YXIganNvbiA9IGNyZWF0b3IuZ2V0U3VydmV5SlNPTigpO1xuICAgICAgICAgIG1vZGVsLmpzb24gPSBqc29uO1xuICAgICAgICAgIG1vZGVsLnN1cnZleUlkID0gY3JlYXRvci5zdXJ2ZXlJZDtcbiAgICAgICAgICBtb2RlbC5zdXJ2ZXlQb3N0SWQgPSBjcmVhdG9yLnN1cnZleVBvc3RJZDtcbiAgICAgICAgICBtb2RlbC5nZW5lcmF0ZVZhbGlkSlNPTiA9IGNyZWF0b3IuZ2V0T3B0aW9ucygpLmdlbmVyYXRlVmFsaWRKU09OO1xuICAgICAgICAgIG1vZGVsLnNob3coKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2soY29tcG9uZW50SW5mby5lbGVtZW50LCAoKSA9PiB7XG4gICAgICAgIHN1YnNjclZpZXdUeXBlLmRpc3Bvc2UoKTtcbiAgICAgICAgbW9kZWwuZGlzcG9zZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lciByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fcm93XFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbFxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICAgICAgICA8c3ZkLXRvb2xiYXIgcGFyYW1zPVxcXCJpdGVtczogdG9vbGJhckl0ZW1zXFxcIj48L3N2ZC10b29sYmFyPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19yb3dcXFwiIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19jZWxsXFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX2NlbGwtY29udGVudC1ob2xkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19jZWxsLWNvbnRlbnQgc3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbC1jb250ZW50LS1zY3JvbGxhYmxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC1qc29uLWVkaXRvclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogIWhhc0FjZUVkaXRvciAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVxcXCJzdmQtanNvbi1lZGl0b3ItYXJlYVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwidGV4dElucHV0OmtvVGV4dCwgZGlzYWJsZTogcmVhZE9ubHksIGF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnSlNPTiBFZGl0b3InIH1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRhcmVhPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IGtvRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RXJyb3I6IDwvc3Bhbj48c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IHRleHRcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvICAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5VGV4dFdvcmtlciB9IGZyb20gXCIuLi90ZXh0V29ya2VyXCI7XG5pbXBvcnQgeyBnZXRMb2NTdHJpbmcgfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyBTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4uL2VkaXRvclwiO1xuXG5pbXBvcnQgXCIuL2pzb24tZWRpdG9yLnNjc3NcIjtcbmltcG9ydCB7IElBY3Rpb24gfSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG52YXIgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vanNvbi1lZGl0b3IuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleUpTT05FZGl0b3Ige1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVRleHRUaW1lb3V0OiBudW1iZXIgPSAxMDAwO1xuICBwdWJsaWMgc3RhdGljIHNob3dUb29sYmFyID0gdHJ1ZTtcbiAgcHVibGljIHN0YXRpYyBhY2VCYXNlUGF0aCA9IFwiXCI7XG5cbiAgcHJpdmF0ZSBpc1Byb2Nlc3NpbmdJbW1lZGlhdGVseTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGFjZUVkaXRvcjogQWNlQWpheC5FZGl0b3I7XG4gIHByaXZhdGUgdGV4dFdvcmtlcjogU3VydmV5VGV4dFdvcmtlcjtcbiAgcHJpdmF0ZSBhY2VDYW5VbmRvID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gIHByaXZhdGUgYWNlQ2FuUmVkbyA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICBwdWJsaWMgaXNKU09OQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNJbml0aWFsSlNPTjogYm9vbGVhbiA9IGZhbHNlO1xuICBrb1RleHQ6IGFueTtcbiAga29FcnJvcnM6IGFueTtcblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgdG9vbGJhciBpdGVtcy4gWW91IG1heSBhZGQvcmVtb3ZlL3JlcGxhY2UgdGhlbS5cbiAgICogQHNlZSBJQWN0aW9uXG4gICAqL1xuICBwdWJsaWMgdG9vbGJhckl0ZW1zID0ga28ub2JzZXJ2YWJsZUFycmF5PElBY3Rpb24+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5rb1RleHQgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHRoaXMua29FcnJvcnMgPSBrby5vYnNlcnZhYmxlQXJyYXkoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb1RleHQuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgc2VsZi5vbkpzb25FZGl0b3JDaGFuZ2VkKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkVG9vbGJhckl0ZW1zKCkge1xuICAgIGlmICghdGhpcy5oYXNBY2VFZGl0b3IpIHJldHVybjtcbiAgICBpZiAoIVN1cnZleUpTT05FZGl0b3Iuc2hvd1Rvb2xiYXIpIHJldHVybjtcbiAgICBjb25zdCBmb2N1c0VkaXRvciA9ICgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hY2VFZGl0b3IuZm9jdXMoKSwgMSk7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PElBY3Rpb24+ID0gW107XG4gICAgaXRlbXMucHVzaCh7XG4gICAgICBpZDogXCJzdmQtanNvbi1lZGl0b3ItdW5kb1wiLFxuICAgICAgaWNvbk5hbWU6IFwiaWNvbi1hY3Rpb251bmRvXCIsXG4gICAgICB0aXRsZTogZ2V0TG9jU3RyaW5nKFwiZWQudW5kb1wiKSxcbiAgICAgIGVuYWJsZWQ6IDxhbnk+dGhpcy5hY2VDYW5VbmRvLFxuICAgICAgdG9vbHRpcDogZ2V0TG9jU3RyaW5nKFwiZWQudW5kb1Rvb2x0aXBcIiksXG4gICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgdGhpcy5hY2VFZGl0b3IuZXhlY0NvbW1hbmQoXCJ1bmRvXCIpO1xuICAgICAgICB0aGlzLnVwZGF0ZVVuZG9SZWRvU3RhdGUoKTtcbiAgICAgICAgZm9jdXNFZGl0b3IoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaXRlbXMucHVzaCh7XG4gICAgICBpZDogXCJzdmQtanNvbi1lZGl0b3ItcmVkb1wiLFxuICAgICAgaWNvbk5hbWU6IFwiaWNvbi1hY3Rpb25yZWRvXCIsXG4gICAgICBlbmFibGVkOiA8YW55PnRoaXMuYWNlQ2FuUmVkbyxcbiAgICAgIHRpdGxlOiBnZXRMb2NTdHJpbmcoXCJlZC5yZWRvXCIpLFxuICAgICAgdG9vbHRpcDogZ2V0TG9jU3RyaW5nKFwiZWQucmVkb1Rvb2x0aXBcIiksXG4gICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgdGhpcy5hY2VFZGl0b3IuZXhlY0NvbW1hbmQoXCJyZWRvXCIpO1xuICAgICAgICB0aGlzLnVwZGF0ZVVuZG9SZWRvU3RhdGUoKTtcbiAgICAgICAgZm9jdXNFZGl0b3IoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKHdpbmRvd1tcIm5hdmlnYXRvclwiXSkge1xuICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgIGlkOiBcInN2ZC1jb3B5XCIsXG4gICAgICAgIGljb25OYW1lOiBcImljb24tYWN0aW9uY29weVwiLFxuICAgICAgICB0aXRsZTogZ2V0TG9jU3RyaW5nKFwiZWQuY29weVwiKSxcbiAgICAgICAgc2hvd1RpdGxlOiBmYWxzZSxcbiAgICAgICAgdG9vbHRpcDogZ2V0TG9jU3RyaW5nKFwiZWQuY29weVRvb2x0aXBcIiksXG4gICAgICAgIGFjdGlvbjogKCkgPT4ge1xuICAgICAgICAgIHZhciB0ZXh0ID0gdGhpcy5hY2VFZGl0b3IuZ2V0Q29weVRleHQoKTtcbiAgICAgICAgICB0aGlzLmFjZUVkaXRvci5leGVjQ29tbWFuZChcImNvcHlcIik7XG4gICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCk7XG4gICAgICAgICAgZm9jdXNFZGl0b3IoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgIGlkOiBcInN2ZC1jdXRcIixcbiAgICAgICAgaWNvbk5hbWU6IFwiaWNvbi1hY3Rpb25jdXRcIixcbiAgICAgICAgdGl0bGU6IGdldExvY1N0cmluZyhcImVkLmN1dFwiKSxcbiAgICAgICAgc2hvd1RpdGxlOiBmYWxzZSxcbiAgICAgICAgdG9vbHRpcDogZ2V0TG9jU3RyaW5nKFwiZWQuY3V0VG9vbHRpcFwiKSxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgdmFyIHRleHQgPSB0aGlzLmFjZUVkaXRvci5nZXRDb3B5VGV4dCgpO1xuICAgICAgICAgIHRoaXMuYWNlRWRpdG9yLmV4ZWNDb21tYW5kKFwiY3V0XCIpO1xuICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpO1xuICAgICAgICAgIHRoaXMudXBkYXRlVW5kb1JlZG9TdGF0ZSgpO1xuICAgICAgICAgIGZvY3VzRWRpdG9yKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBpZDogXCJzdmQtcGFzdGVcIixcbiAgICAgICAgaWNvbk5hbWU6IFwiaWNvbi1hY3Rpb25wYXN0ZVwiLFxuICAgICAgICB0aXRsZTogZ2V0TG9jU3RyaW5nKFwiZWQucGFzdGVcIiksXG4gICAgICAgIHNob3dUaXRsZTogZmFsc2UsXG4gICAgICAgIHRvb2x0aXA6IGdldExvY1N0cmluZyhcImVkLnBhc3RlVG9vbHRpcFwiKSxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpLnRoZW4oKHRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY2VFZGl0b3IuZXhlY0NvbW1hbmQoXCJwYXN0ZVwiLCB0ZXh0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVVuZG9SZWRvU3RhdGUoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnRvb2xiYXJJdGVtcyhpdGVtcyk7XG4gIH1cblxuICBwdWJsaWMgaW5pdChlZGl0b3JFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5oYXNBY2VFZGl0b3IpIHJldHVybjtcbiAgICB0aGlzLmFjZUVkaXRvciA9IGFjZS5lZGl0KGVkaXRvckVsZW1lbnQpO1xuICAgIHRoaXMuYWNlRWRpdG9yLnNldFJlYWRPbmx5KHRoaXMucmVhZE9ubHkpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoU3VydmV5SlNPTkVkaXRvci5hY2VCYXNlUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNlW1wiY29uZmlnXCJdLnNldChcImJhc2VQYXRoXCIsIFN1cnZleUpTT05FZGl0b3IuYWNlQmFzZVBhdGgpO1xuICAgICAgICAvLyBUT0RPIGFkZCBldmVudCB0byBjaGFuZ2UgYWNlIHRoZW1lIGFuZCBtb2RlXG4gICAgICAgIC8vIHRoaXMuYWNlRWRpdG9yLnNldFRoZW1lKFwiYWNlL3RoZW1lL21vbm9rYWlcIik7XG4gICAgICAgIC8vIHRoaXMuYWNlRWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2pzb25cIik7XG4gICAgICAgIHRoaXMuYWNlRWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2pzb25cIik7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICAgIHNlbGYuYWNlRWRpdG9yLnNldFNob3dQcmludE1hcmdpbihmYWxzZSk7XG4gICAgc2VsZi5hY2VFZGl0b3IuZ2V0U2Vzc2lvbigpLm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYub25Kc29uRWRpdG9yQ2hhbmdlZCgpO1xuICAgIH0pO1xuICAgIHNlbGYuYWNlRWRpdG9yLm9uKFwiaW5wdXRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYuaXNJbml0aWFsSlNPTikge1xuICAgICAgICBzZWxmLmlzSW5pdGlhbEpTT04gPSBmYWxzZTtcbiAgICAgICAgc2VsZi5hY2VFZGl0b3IuZ2V0U2Vzc2lvbigpLmdldFVuZG9NYW5hZ2VyKCkubWFya0NsZWFuKCk7XG4gICAgICAgIHNlbGYudXBkYXRlVW5kb1JlZG9TdGF0ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoc2VsZi5hY2VFZGl0b3IuZ2V0U2Vzc2lvbigpLmdldFVuZG9NYW5hZ2VyKCkuaXNDbGVhbigpKSB7XG4gICAgICAgIHNlbGYuaXNKU09OQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWxmLmlzSlNPTkNoYW5nZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuYWNlRWRpdG9yLmdldFNlc3Npb24oKS5zZXRVc2VXb3JrZXIodHJ1ZSk7XG4gICAgU3VydmV5VGV4dFdvcmtlci5uZXdMaW5lQ2hhciA9XG4gICAgICB0aGlzLmFjZUVkaXRvci5zZXNzaW9uLmRvYy5nZXROZXdMaW5lQ2hhcmFjdGVyKCk7XG4gICAgdGhpcy5hZGRUb29sYmFySXRlbXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzQWNlRWRpdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgYWNlICE9PSBcInVuZGVmaW5lZFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5oYXNBY2VFZGl0b3IpIHJldHVybiB0aGlzLmtvVGV4dCgpO1xuICAgIHJldHVybiB0aGlzLmFjZUVkaXRvci5nZXRWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5pc1Byb2Nlc3NpbmdJbW1lZGlhdGVseSA9IHRydWU7XG4gICAgdGhpcy5rb1RleHQodmFsdWUpO1xuICAgIGlmICh0aGlzLmFjZUVkaXRvcikge1xuICAgICAgdGhpcy5hY2VFZGl0b3Iuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5hY2VFZGl0b3IucmVuZGVyZXIudXBkYXRlRnVsbCh0cnVlKTtcbiAgICAgIHRoaXMuYWNlRWRpdG9yLmdldFNlc3Npb24oKS5nZXRVbmRvTWFuYWdlcigpLnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMucHJvY2Vzc0pzb24odmFsdWUpO1xuICAgIHRoaXMuaXNQcm9jZXNzaW5nSW1tZWRpYXRlbHkgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc2hvdyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy50ZXh0ID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuYWNlRWRpdG9yKSB7XG4gICAgICB0aGlzLmFjZUVkaXRvci5mb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLmlzSlNPTkNoYW5nZWQgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzSnNvbkNvcnJlY3QoKTogYm9vbGVhbiB7XG4gICAgdGhpcy50ZXh0V29ya2VyID0gbmV3IFN1cnZleVRleHRXb3JrZXIodGhpcy50ZXh0KTtcbiAgICByZXR1cm4gdGhpcy50ZXh0V29ya2VyLmlzSnNvbkNvcnJlY3Q7XG4gIH1cbiAgcHVibGljIGdldCBzdXJ2ZXkoKTogU3VydmV5LlN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFdvcmtlci5zdXJ2ZXk7XG4gIH1cbiAgcHJpdmF0ZSB0aW1lb3V0SWQ6IG51bWJlciA9IC0xO1xuICBwcml2YXRlIHVwZGF0ZVVuZG9SZWRvU3RhdGUoKSB7XG4gICAgaWYgKHRoaXMuaGFzQWNlRWRpdG9yKSB7XG4gICAgICBsZXQgdW5kb01hbmFnZXIgPSB0aGlzLmFjZUVkaXRvci5nZXRTZXNzaW9uKCkuZ2V0VW5kb01hbmFnZXIoKTtcbiAgICAgIHRoaXMuYWNlQ2FuVW5kbyh1bmRvTWFuYWdlci5oYXNVbmRvKCkpO1xuICAgICAgdGhpcy5hY2VDYW5SZWRvKHVuZG9NYW5hZ2VyLmhhc1JlZG8oKSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgb25Kc29uRWRpdG9yQ2hhbmdlZCgpOiBhbnkge1xuICAgIGlmICghdGhpcy5oYXNBY2VFZGl0b3IpIHtcbiAgICAgIHRoaXMuaXNKU09OQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVW5kb1JlZG9TdGF0ZSgpO1xuICAgIGlmICh0aGlzLnRpbWVvdXRJZCA+IC0xKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1Byb2Nlc3NpbmdJbW1lZGlhdGVseSkge1xuICAgICAgdGhpcy50aW1lb3V0SWQgPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdGhpcy50aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYudGltZW91dElkID0gLTE7XG4gICAgICAgIHNlbGYucHJvY2Vzc0pzb24oc2VsZi50ZXh0KTtcbiAgICAgIH0sIFN1cnZleUpTT05FZGl0b3IudXBkYXRlVGV4dFRpbWVvdXQpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHByb2Nlc3NKc29uKHRleHQ6IHN0cmluZyk6IGFueSB7XG4gICAgdGhpcy50ZXh0V29ya2VyID0gbmV3IFN1cnZleVRleHRXb3JrZXIodGV4dCk7XG4gICAgaWYgKHRoaXMuYWNlRWRpdG9yKSB7XG4gICAgICB0aGlzLmFjZUVkaXRvclxuICAgICAgICAuZ2V0U2Vzc2lvbigpXG4gICAgICAgIC5zZXRBbm5vdGF0aW9ucyh0aGlzLmNyZWF0ZUFubm90YXRpb25zKHRleHQsIHRoaXMudGV4dFdvcmtlci5lcnJvcnMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rb0Vycm9ycyh0aGlzLnRleHRXb3JrZXIuZXJyb3JzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVBbm5vdGF0aW9ucyh0ZXh0OiBzdHJpbmcsIGVycm9yczogYW55W10pOiBBY2VBamF4LkFubm90YXRpb25bXSB7XG4gICAgdmFyIGFubm90YXRpb25zID0gbmV3IEFycmF5PEFjZUFqYXguQW5ub3RhdGlvbj4oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVycm9yID0gZXJyb3JzW2ldO1xuICAgICAgdmFyIGFubm90YXRpb246IEFjZUFqYXguQW5ub3RhdGlvbiA9IHtcbiAgICAgICAgcm93OiBlcnJvci5wb3NpdGlvbi5zdGFydC5yb3csXG4gICAgICAgIGNvbHVtbjogZXJyb3IucG9zaXRpb24uc3RhcnQuY29sdW1uLFxuICAgICAgICB0ZXh0OiBlcnJvci50ZXh0LFxuICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICB9O1xuICAgICAgYW5ub3RhdGlvbnMucHVzaChhbm5vdGF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGFubm90YXRpb25zO1xuICB9XG4gIHByaXZhdGUgX3JlYWRPbmx5ID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gcHJvcGVydHksIGZhbHNlIGJ5IGRlZmF1bHQuIFNldCBpdCB0byB0cnVlIHRvIGRlbnkgZWRpdGluZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRPbmx5KCk7XG4gIH1cbiAgcHVibGljIHNldCByZWFkT25seShuZXdWYWwpIHtcbiAgICB0aGlzLl9yZWFkT25seShuZXdWYWwpO1xuICB9XG4gIGRpc3Bvc2UoKSB7fVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3VydmV5LWpzb24tZWRpdG9yXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICB2YXIgY3JlYXRvcjogU3VydmV5Q3JlYXRvciA9IHBhcmFtcy5jcmVhdG9yO1xuICAgICAgdmFyIG1vZGVsID0gbmV3IFN1cnZleUpTT05FZGl0b3IoKTtcblxuICAgICAgY3JlYXRvci5zZXRTdXJ2ZXlKU09OVGV4dENhbGxiYWNrID0gKHRleHQpID0+IHtcbiAgICAgICAgbW9kZWwuaXNJbml0aWFsSlNPTiA9IHRydWU7XG4gICAgICAgIG1vZGVsLnRleHQgPSB0ZXh0O1xuICAgICAgfTtcblxuICAgICAgdmFyIHN1YnNjclZpZXdUeXBlID0gY3JlYXRvci5rb1ZpZXdUeXBlLnN1YnNjcmliZSgodmlld1R5cGUpID0+IHtcbiAgICAgICAgaWYgKHZpZXdUeXBlID09PSBcImVkaXRvclwiKSB7XG4gICAgICAgICAgbW9kZWwuaXNJbml0aWFsSlNPTiA9IHRydWU7XG4gICAgICAgICAgbW9kZWwuc2hvdyhjcmVhdG9yLnRleHQpO1xuICAgICAgICAgIGNyZWF0b3IuZ2V0U3VydmV5SlNPTlRleHRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHRleHQ6IG1vZGVsLnRleHQsIGlzTW9kaWZpZWQ6IG1vZGVsLmlzSlNPTkNoYW5nZWQgfTtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNyZWF0b3IuZ2V0U3VydmV5SlNPTlRleHRDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHZhciBzdWJzY3JSZWFkT25seSA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgbW9kZWwucmVhZE9ubHkgPSBjcmVhdG9yLnJlYWRPbmx5O1xuICAgICAgfSk7XG5cbiAgICAgIG1vZGVsLmluaXQoXG4gICAgICAgIDxIVE1MRWxlbWVudD5jb21wb25lbnRJbmZvLmVsZW1lbnQucXVlcnlTZWxlY3RvcihcIi5zdmQtanNvbi1lZGl0b3JcIilcbiAgICAgICk7XG5cbiAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2soY29tcG9uZW50SW5mby5lbGVtZW50LCAoKSA9PiB7XG4gICAgICAgIGNyZWF0b3Iuc2V0U3VydmV5SlNPTlRleHRDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgY3JlYXRvci5nZXRTdXJ2ZXlKU09OVGV4dENhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICBzdWJzY3JSZWFkT25seS5kaXNwb3NlKCk7XG4gICAgICAgIHN1YnNjclZpZXdUeXBlLmRpc3Bvc2UoKTtcbiAgICAgICAgbW9kZWwuZGlzcG9zZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwic3ZkLWxvZ2ljLXRhYlxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Nb2RlKCkgPT0gJ3ZpZXcnXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICRkYXRhLmtvSXRlbXMoKS5sZW5ndGggPiAwXFxcIj5cXG4gICAgICA8cD5cXG4gICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gc3YtYnRuIGJ0bi1wcmltYXJ5XFxcIlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICFrb1JlYWRPbmx5KCksIGNsaWNrOiAkZGF0YS5rb0FkZE5ldywgdmFsdWU6ICRkYXRhLmFkZE5ld1RleHQsIGF0dHI6IHt0aXRsZTogJGRhdGEuYWRkTmV3VGV4dCB9XFxcIiAvPlxcbiAgICAgIDwvcD5cXG4gICAgICA8dGFibGUgY2xhc3M9XFxcInN2ZC1sb2dpYy10YWJfX3J1bGVzLWxpc3RcXFwiPlxcbiAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICA8dHIgY2xhc3M9XFxcInN2ZC1sb2dpYy10YWJfX3J1bGVzLWxpc3RfX2hlYWRlciBzdmQtbG9naWMtdGFiX19ydWxlcy1saXN0X19yb3dcXFwiPlxcbiAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcInZpc2libGU6ISRkYXRhLmtvUmVhZE9ubHkoKVxcXCIgd2lkdGg9XFxcIjEwMHB4XFxcIj48L3RkPlxcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cXFwic3ZkLWRhcmstYm9yZGVyLWNvbG9yXFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmdldExvY1N0cmluZygnZWQubGcuY29uZGl0aW9ucycpXFxcIj48L3RoPlxcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cXFwic3ZkLWRhcmstYm9yZGVyLWNvbG9yXFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmdldExvY1N0cmluZygnZWQubGcuYWN0aW9ucycpXFxcIj48L3RoPlxcbiAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcInZpc2libGU6ISRkYXRhLmtvUmVhZE9ubHkoKVxcXCIgd2lkdGg9XFxcIjEwMHB4XFxcIj48L3RkPlxcbiAgICAgICAgICA8L3RyPlxcbiAgICAgICAgPC90aGVhZD5cXG4gICAgICAgIDx0Ym9keSBkYXRhLWJpbmQ9XFxcImZvcmVhY2g6ICRkYXRhLmtvSXRlbXNcXFwiPlxcbiAgICAgICAgICA8dHIgY2xhc3M9XFxcInN2ZC1sb2dpYy10YWJfX3J1bGVzLWxpc3RfX3Jvd1xcXCI+XFxuICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwidmlzaWJsZTohJHBhcmVudC5rb1JlYWRPbmx5KClcXFwiIGNsYXNzPVxcXCJzdmQtbG9naWMtdGFiX19ydWxlcy1saXN0X19hY3Rpb24tY2VsbFxcXCI+XFxuICAgICAgICAgICAgICA8c3BhbiByb2xlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwiY2xpY2s6ICRkYXRhLmVkaXQsIGF0dHI6IHsgdGl0bGU6ICRkYXRhLmVkaXRUZXh0LCB0YWJpbmRleDogMCB9LCBrZXkyY2xpY2tcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3ZnLWljb24gY2xhc3M9XFxcInN2ZC1wcmltYXJ5LWljb24gaWNvbi1hY3Rpb25lZGl0ZWxlbWVudFxcXCIgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24tYWN0aW9uZWRpdGVsZW1lbnQnXFxcIj5cXG4gICAgICAgICAgICAgICAgPC9zdmctaWNvbj5cXG4gICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgIDx0ZD5cXG4gICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEudGl0bGUsIGF0dHI6IHt0aXRsZTogJGRhdGEudGl0bGUgfVxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImZvcmVhY2g6ICRkYXRhLmtvQWN0aW9uc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEudGV4dCwgYXR0cjoge3RpdGxlOiAkZGF0YS50ZXh0IH1cXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwidmlzaWJsZTohJHBhcmVudC5rb1JlYWRPbmx5KClcXFwiIGNsYXNzPVxcXCJzdmQtbG9naWMtdGFiX19ydWxlcy1saXN0X19hY3Rpb24tY2VsbFxcXCI+XFxuICAgICAgICAgICAgICA8c3BhbiByb2xlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwiY2xpY2s6ICRkYXRhLnJlbW92ZSwgYXR0cjogeyB0aXRsZTogJGRhdGEuZGVsZXRlVGV4dCwgdGFiaW5kZXg6IDAgfSwga2V5MmNsaWNrXFxcIj5cXG4gICAgICAgICAgICAgICAgPHN2Zy1pY29uIGNsYXNzPVxcXCJzdmQtZGFuZ2VyLWljb24gaWNvbi1hY3Rpb25kZWxldGVcXFwiIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWFjdGlvbmRlbGV0ZSdcXFwiPjwvc3ZnLWljb24+XFxuICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgPC90cj5cXG4gICAgICAgIDwvdGJvZHk+XFxuICAgICAgPC90YWJsZT5cXG4gICAgPC9kaXY+XFxuXFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAkZGF0YS5rb0l0ZW1zKCkubGVuZ3RoID09PSAwXFxcIiBjbGFzcz1cXFwic3ZkLXN1cnZleS1wbGFjZWhvbGRlci1yb290XFxcIj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtc3VydmV5LXBsYWNlaG9sZGVyXFxcIj5cXG4gICAgICAgIDwhLS0ga28gaWY6IHBsYWNlaG9sZGVySHRtbCAtLT5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJodG1sOiBwbGFjZWhvbGRlckh0bWxcXFwiPjwvZGl2PlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIGtvIGlmbm90OiBwbGFjZWhvbGRlckh0bWwgLS0+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtZW1wdHktbWVzc2FnZS1jb250YWluZXJcXFwiPlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtZW1wdHktbWVzc2FnZVxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBnZXRMb2NTdHJpbmcoJ3N1cnZleS5hZGRMb2dpY0l0ZW0nKVxcXCI+PC9kaXY+XFxuICAgICAgICAgIDxpbWcgY2xhc3M9XFxcInN2ZC1lbXB0eS1pbWFnZVxcXCIgc3JjPVxcXCJcIiArIHJlcXVpcmUoXCIuLi9pbWFnZXMvc3RhcnQtZGVzaWduaW5nLWZvcm0uc3ZnXCIpICsgXCJcXFwiXFxuICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IGFsdDogZ2V0TG9jU3RyaW5nKCdzdXJ2ZXkuYWRkTG9naWNJdGVtJykgfVxcXCIgLz5cXG4gICAgICAgICAgPGlucHV0IGNsYXNzPVxcXCJzdmQtZW1wdHktYWN0aW9uIGJ0biBzdi1idG4gYnRuLXByaW1hcnlcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICFrb1JlYWRPbmx5KCksIGNsaWNrOiAkZGF0YS5rb0FkZE5ldywgdmFsdWU6ICRkYXRhLmdldExvY1N0cmluZygncGUuYWRkTmV3JylcXFwiIC8+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG5cXG4gIDwvZGl2PlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvTW9kZSgpID09ICduZXcnIHx8IGtvTW9kZSgpID09ICdlZGl0J1xcXCI+XFxuICAgIDxoNCBjbGFzcz1cXFwic3ZkLWxvZ2ljLXRhYl9fcnVsZS1lZGl0b3JfX3RpdGxlXFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmdldExvY1N0cmluZygnZWQubGcuZXhwcmVzc2lvbkVkaXRvclRpdGxlJylcXFwiPlxcbiAgICA8L2g0PlxcbiAgICA8c3ZkLXByb3BlcnR5LWVkaXRvciBwYXJhbXM9XFxcIm1vZGVsOiAkZGF0YS5leHByZXNzaW9uRWRpdG9yXFxcIj48L3N2ZC1wcm9wZXJ0eS1lZGl0b3I+XFxuICAgIDwhLS1rbyBpZjogJGRhdGEua29FZGl0YWJsZUl0ZW0oKSAhPSBudWxsIC0tPlxcbiAgICA8aDQgY2xhc3M9XFxcInN2ZC1sb2dpYy10YWJfX3J1bGUtZWRpdG9yX190aXRsZVxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS5nZXRMb2NTdHJpbmcoJ2VkLmxnLmFjdGlvbnNFZGl0b3JUaXRsZScpXFxcIj48L2g0PlxcbiAgICA8IS0tIGtvIGZvcmVhY2g6IHtkYXRhOiAkZGF0YS5rb0VkaXRhYmxlSXRlbSgpLmtvQWN0aW9ucywgYXM6ICdhY3Rpb24nIH0gLS0+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2ZC1sb2dpYy10YWJfX2l0ZW1cXFwiPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0taW5saW5lIGZvcm0tZ3JvdXBcXFwiIHN0eWxlPVxcXCJwYWRkaW5nLWJvdHRvbToxMHB4XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC1sb2dpYy10YWJfX2FjdGlvbnMtc2V0dXBcXFwiXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZTokaW5kZXgoKSA9PSAwICYmICRwYXJlbnQuYWN0aW9uc1NldHVwVGV4dCwgdGV4dDogJHBhcmVudC5hY3Rpb25zU2V0dXBUZXh0XFxcIj48L2Rpdj5cXG5cXG4gICAgICAgIDxzdmQtcHJvcGVydHktZWRpdG9yLWVycm9yIHBhcmFtcz1cXFwibW9kZWw6JGRhdGFcXFwiPjwvc3ZkLXByb3BlcnR5LWVkaXRvci1lcnJvcj5cXG5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tY29udHJvbCBzdmRfY3VzdG9tX3NlbGVjdFxcXCIgc3R5bGU9XFxcIndpZHRoOiA1MCU7bWF4LXdpZHRoOjMwMHB4XFxcIj5cXG4gICAgICAgICAgPHNlbGVjdCBvbm1vdXNld2hlZWw9XFxcInJldHVybiBmYWxzZTtcXFwiXFxuICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJpZjogdHJ1ZSwgdmFsdWU6YWN0aW9uLmtvTG9naWNUeXBlLCBhdHRyOiB7ICdhcmlhLWxhYmVsJzogJHBhcmVudC5zZWxlY3RlZEFjdGlvbkNhcHRpb24gfVxcXCI+XFxuICAgICAgICAgICAgPG9wdGlvbiBkYXRhLWJpbmQ9XFxcInRleHQ6JHBhcmVudC5zZWxlY3RlZEFjdGlvbkNhcHRpb24sIHZhbHVlOiBudWxsXFxcIj48L29wdGlvbj5cXG4gICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHtkYXRhOiAkZGF0YS5rb0xvZ2ljVHlwZXMsIGFzOiAnaXRlbScgfSAtLT5cXG4gICAgICAgICAgICA8b3B0aW9uIGRhdGEtYmluZD1cXFwidmlzaWJsZTogaXRlbS5rb1Zpc2libGUsIHZhbHVlOiBpdGVtLmxvZ2ljVHlwZSwgdGV4dDogaXRlbS5sb2dpY1R5cGUuZGlzcGxheU5hbWVcXFwiPlxcbiAgICAgICAgICAgIDwvb3B0aW9uPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L3NlbGVjdD5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBzdHlsZT1cXFwiZGlzcGxheTppbmxpbmUtYmxvY2tcXFwiPlxcbiAgICAgICAgICA8IS0ta28gaWY6IGFjdGlvbi5rb0xvZ2ljVHlwZSgpICE9IG51bGwgLS0+XFxuICAgICAgICAgIDxzcGFuIHN0eWxlPVxcXCJwYWRkaW5nLWxlZnQ6MjBweFxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OmFjdGlvbi5rb0xvZ2ljVHlwZSgpLmRlc2NyaXB0aW9uXFxcIj48L3NwYW4+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwic3ZkLWxvZ2ljLXRhYl9faXRlbS1oZWFkZXItaWNvblxcXCIgc3R5bGU9XFxcInBhZGRpbmctbGVmdDogMjBweFxcXCJcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImtleTJjbGljaywgY2xpY2tOb0ZvY3VzOiAkcGFyZW50LmtvUmVtb3ZlQWN0aW9uLCBhdHRyOiB7IHRpdGxlOiAkZGF0YS5kZWxldGVBY3Rpb25UZXh0LCB0YWJpbmRleDogMCwgcm9sZTogJ2J1dHRvbicgfVxcXCI+XFxuICAgICAgICAgICAgPHN2Zy1pY29uIGNsYXNzPVxcXCJzdmQtZGFuZ2VyLWljb24gaWNvbi1hY3Rpb25kZWxldGVcXFwiIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICdpY29uLWFjdGlvbmRlbGV0ZSdcXFwiPjwvc3ZnLWljb24+XFxuICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDxkaXYgc3R5bGU9XFxcIm1heC13aWR0aDo4MDBweFxcXCI+XFxuICAgICAgICA8IS0ta28gaWY6IGFjdGlvbi5rb1RlbXBsYXRlT2JqZWN0KCkgIT0gbnVsbCAmJiAhIWFjdGlvbi5rb1RlbXBsYXRlKCkgLS0+XFxuICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBhY3Rpb24udGVtcGxhdGUsIHBhcmFtczogeyBtb2RlbDphY3Rpb24ua29UZW1wbGF0ZU9iamVjdCgpLCBhZnRlclJlbmRlcjogYWN0aW9uLmtvVGVtcGxhdGVBZnRlclJlbmRlciB9IH0gLS0+PCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8cD5cXG4gICAgPGRpdiBzdHlsZT1cXFwid2lkdGg6MjAwcHg7cGFkZGluZy1ib3R0b206MjBweFxcXCI+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBzdi1idG4gYnRuIGJ0bi1wcmltYXJ5IHN2ZC1sb2dpYy1idXR0b24gc3ZkLWxvZ2ljLWFkZC1uZXctYWN0aW9uLWJ1dHRvblxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6a29BZGROZXdBY3Rpb24sIHZhbHVlOiBhZGROZXdBY3Rpb25UZXh0XFxcIiAvPlxcbiAgICA8L2Rpdj5cXG4gICAgPC9wPlxcbiAgICA8cD5cXG4gICAgPGRpdj5cXG4gICAgICA8c3ZkLXByb3BlcnR5LWVkaXRvci1lcnJvciBwYXJhbXM9XFxcIm1vZGVsOiRkYXRhXFxcIj48L3N2ZC1wcm9wZXJ0eS1lZGl0b3ItZXJyb3I+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWlubGluZSBmb3JtLWdyb3VwXFxcIj5cXG4gICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGJ0biBzdi1idG4gYnRuLXByaW1hcnkgc3ZkLWxvZ2ljLWJ1dHRvbiBzdmQtbG9naWMtc2F2ZS1hbmQtYmFjay1idXR0b25cXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiRkYXRhLmtvU2F2ZUFuZFNob3dWaWV3LCB2YWx1ZTogJGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5zYXZlQW5kQmFjaycpLCBhdHRyOiB7IHRpdGxlIDogJGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5zYXZlQW5kQmFja1Rvb2x0aXAnKSB9XFxcIiAvPlxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgYnRuIHN2LWJ0biBidG4tcHJpbWFyeSBzdmQtbG9naWMtYnV0dG9uIHN2ZC1sb2dpYy1zYXZlLWJ1dHRvblxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6ICRkYXRhLmtvU2F2ZUVkaXRhYmxlSXRlbSwgdmFsdWU6ICRkYXRhLmdldExvY1N0cmluZygncGUuc2F2ZScpLCBhdHRyOiB7IHRpdGxlIDogJGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5zYXZlVG9vbHRpcCcpIH1cXFwiIC8+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBidG4gc3YtYnRuIGJ0bi1wcmltYXJ5IHN2ZC1sb2dpYy1idXR0b24gc3ZkLWxvZ2ljLWJhY2stYnV0dG9uXFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogJGRhdGEua29TaG93VmlldywgdmFsdWU6ICRkYXRhLmdldExvY1N0cmluZygncGUuYmFjaycpLCBhdHRyOiB7IHRpdGxlIDogJGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5iYWNrVG9vbHRpcCcpIH1cXFwiIC8+XFxuICAgIDwvZGl2PlxcbiAgICA8L3A+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuPC9kaXY+XCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5UHJvcGVydHlDb25kaXRpb25FZGl0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5Q29uZGl0aW9uRWRpdG9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50U2VsZWN0b3IgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3N1cnZleUVsZW1lbnRTZWxlY3RvclwiO1xuaW1wb3J0IHsgSVN1cnZleU9iamVjdEVkaXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vcHJvcGVydHlFZGl0b3JzL3Byb3BlcnR5RWRpdG9yQmFzZVwiO1xuaW1wb3J0IHsgZWRpdG9yTG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0IHtcbiAgRXhwcmVzc2lvblRvRGlzcGxheVRleHQsXG4gIEV4cHJlc3Npb25SZW1vdmVWYXJpYWJsZSxcbn0gZnJvbSBcIi4uL2V4cHJlc3Npb25Ub0Rpc3BsYXlUZXh0XCI7XG5pbXBvcnQge1xuICBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsLFxuICBTdXJ2ZXlRdWVzdGlvbkVkaXRvcixcbn0gZnJvbSBcIi4uL3F1ZXN0aW9uRWRpdG9ycy9xdWVzdGlvbkVkaXRvclwiO1xuaW1wb3J0IHsgU3VydmV5Q3JlYXRvciB9IGZyb20gXCIuLi9lZGl0b3JcIjtcblxuaW1wb3J0IFwiLi9sb2dpYy5zY3NzXCI7XG52YXIgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vbG9naWMuaHRtbFwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5TG9naWNUeXBlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBiYXNlQ2xhc3M6IHN0cmluZztcbiAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XG4gIHRlbXBsYXRlTmFtZT86IHN0cmluZztcbiAgc2hvd0luVUk/OiBib29sZWFuO1xuICBzaG93SWY/OiAoc3VydmV5OiBTdXJ2ZXkuU3VydmV5TW9kZWwpID0+IGJvb2xlYW47XG4gIGNyZWF0ZU5ld0VsZW1lbnQ/OiAoc3VydmV5OiBTdXJ2ZXkuU3VydmV5TW9kZWwpID0+IFN1cnZleS5CYXNlO1xuICBzYXZlRWxlbWVudD86IChzdXJ2ZXk6IFN1cnZleS5TdXJ2ZXlNb2RlbCwgYWN0aW9uOiBTdXJ2ZXlMb2dpY0FjdGlvbikgPT4gdm9pZDtcbiAgY3JlYXRlVGVtcGxhdGVPYmplY3Q/OiAoZWxlbWVudDogU3VydmV5LkJhc2UpID0+IGFueTtcbiAgaXNVbmlxdWVJdGVtPzogYm9vbGVhbjtcbiAgcXVlc3Rpb25OYW1lcz86IEFycmF5PHN0cmluZz47XG4gIGdldERpc3BsYXlUZXh0PzogKFxuICAgIGVsZW1lbnQ6IFN1cnZleS5CYXNlLFxuICAgIGZvcm1hdFN0cjogc3RyaW5nLFxuICAgIGx0OiBTdXJ2ZXlMb2dpY1R5cGVcbiAgKSA9PiBzdHJpbmc7XG4gIGdldERpc3BsYXlUZXh0TmFtZT86IChlbGVtZW50OiBTdXJ2ZXkuQmFzZSkgPT4gc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBnZXRMb2dpY1N0cmluZyhuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJlZC5sZy5cIiArIG5hbWUpO1xufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5TG9naWNUeXBlIHtcbiAgcHVibGljIHN0YXRpYyBleHByZXNzaW9uVG9EaXNwbGF5VGV4dChcbiAgICBzdXJ2ZXk6IFN1cnZleS5TdXJ2ZXlNb2RlbCxcbiAgICBvcHRpb25zOiBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9ucyxcbiAgICBleHByZXNzaW9uOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25Ub0Rpc3BsYXlUZXh0KHN1cnZleSwgb3B0aW9ucykudG9EaXNwbGF5VGV4dChcbiAgICAgIGV4cHJlc3Npb25cbiAgICApO1xuICB9XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbG9naWNUeXBlOiBJU3VydmV5TG9naWNUeXBlLFxuICAgIHB1YmxpYyBzdXJ2ZXk6IFN1cnZleS5TdXJ2ZXlNb2RlbCxcbiAgICBwdWJsaWMgb3B0aW9uczogSVN1cnZleU9iamVjdEVkaXRvck9wdGlvbnMgPSBudWxsXG4gICkge31cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9naWNUeXBlLm5hbWU7XG4gIH1cbiAgcHVibGljIGdldCBiYXNlQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2dpY1R5cGUuYmFzZUNsYXNzO1xuICB9XG4gIHB1YmxpYyBnZXQgcHJvcGVydHlOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9naWNUeXBlLnByb3BlcnR5TmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRlbXBsYXRlTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzVHJpZ2dlcikgcmV0dXJuIFwic3ZkLW9iamVjdC1lZGl0b3ItY29udGVudFwiO1xuICAgIHJldHVybiAhIXRoaXMubG9naWNUeXBlLnRlbXBsYXRlTmFtZVxuICAgICAgPyB0aGlzLmxvZ2ljVHlwZS50ZW1wbGF0ZU5hbWVcbiAgICAgIDogXCJzdmQtZWxlbWVudC1zZWxlY3RvclwiO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2hvd0luVUkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoISF0aGlzLmxvZ2ljVHlwZS5zaG93SWYpIHJldHVybiB0aGlzLmxvZ2ljVHlwZS5zaG93SWYodGhpcy5zdXJ2ZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd1RpdGxlc0luRXhwcmVzc2lvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnNob3dUaXRsZXNJbkV4cHJlc3Npb25zO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzSXRlbVNlbGVjdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuYmFzZUNsYXNzICYmIHRoaXMuc2hvd0luVUkgJiYgIXRoaXMuY2FuQ3JlYXRlTmV3RWxlbWVudCgpO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVJdGVtU2VsZWN0b3IoKTogU3VydmV5RWxlbWVudFNlbGVjdG9yIHtcbiAgICBpZiAoIXRoaXMuaGFzSXRlbVNlbGVjdG9yKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcmVzID0gbmV3IFN1cnZleUVsZW1lbnRTZWxlY3RvcihcbiAgICAgIHRoaXMuc3VydmV5LFxuICAgICAgdGhpcy5iYXNlQ2xhc3MsXG4gICAgICB0aGlzLnNob3dUaXRsZXNJbkV4cHJlc3Npb25cbiAgICApO1xuICAgIHJlcy5kaXNhYmxlZFByb3BlcnR5TmFtZSA9IHRoaXMucHJvcGVydHlOYW1lO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBzaG93SW5VSSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2dpY1R5cGUuc2hvd0luVUkgIT09IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgY2FuQ3JlYXRlTmV3RWxlbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmxvZ2ljVHlwZS5jcmVhdGVOZXdFbGVtZW50IHx8IHRoaXMuaXNUcmlnZ2VyO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzVHJpZ2dlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmJhc2VDbGFzcyAmJiB0aGlzLmJhc2VDbGFzcy5pbmRleE9mKFwidHJpZ2dlclwiKSA+IC0xO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVOZXdFbGVtZW50KHN1cnZleTogU3VydmV5LlN1cnZleU1vZGVsKTogU3VydmV5LkJhc2Uge1xuICAgIGlmICghIXRoaXMubG9naWNUeXBlLmNyZWF0ZU5ld0VsZW1lbnQpXG4gICAgICByZXR1cm4gdGhpcy5sb2dpY1R5cGUuY3JlYXRlTmV3RWxlbWVudChzdXJ2ZXkpO1xuICAgIGlmICh0aGlzLmlzVHJpZ2dlcikgcmV0dXJuIHRoaXMuY3JlYXRlVHJpZ2dlckVsZW1lbnQoc3VydmV5KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgc2F2ZUVsZW1lbnQoYWN0aW9uOiBTdXJ2ZXlMb2dpY0FjdGlvbik6IHZvaWQge1xuICAgIGlmICghIXRoaXMubG9naWNUeXBlLnNhdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLmxvZ2ljVHlwZS5zYXZlRWxlbWVudCh0aGlzLnN1cnZleSwgYWN0aW9uKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNUcmlnZ2VyKSB7XG4gICAgICB0aGlzLnNhdmVUcmlnZ2VyRWxlbWVudChhY3Rpb24pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY3JlYXRlVGVtcGxhdGVPYmplY3QoZWxlbWVudDogU3VydmV5LkJhc2UpOiBhbnkge1xuICAgIGlmICghIXRoaXMubG9naWNUeXBlLmNyZWF0ZVRlbXBsYXRlT2JqZWN0KVxuICAgICAgcmV0dXJuIHRoaXMubG9naWNUeXBlLmNyZWF0ZVRlbXBsYXRlT2JqZWN0KGVsZW1lbnQpO1xuICAgIGlmICh0aGlzLmlzVHJpZ2dlcikgcmV0dXJuIHRoaXMuY3JlYXRlVHJpZ2dlclRlbXBsYXRlT2JqZWN0KGVsZW1lbnQpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNVbmlxdWVJdGVtKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvZ2ljVHlwZS5pc1VuaXF1ZUl0ZW0gPT09IHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBxdWVzdGlvbk5hbWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmxvZ2ljVHlwZS5xdWVzdGlvbk5hbWVzO1xuICB9XG4gIHB1YmxpYyBnZXQgZGlzcGxheU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0TG9naWNTdHJpbmcodGhpcy5uYW1lICsgXCJOYW1lXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0TG9naWNTdHJpbmcodGhpcy5uYW1lICsgXCJEZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGlzcGxheVRleHQoZWxlbWVudDogU3VydmV5LkJhc2UpOiBzdHJpbmcge1xuICAgIHZhciBzdHIgPSBnZXRMb2dpY1N0cmluZyh0aGlzLm5hbWUgKyBcIlRleHRcIik7XG4gICAgaWYgKCEhdGhpcy5sb2dpY1R5cGUuZ2V0RGlzcGxheVRleHQpXG4gICAgICByZXR1cm4gdGhpcy5sb2dpY1R5cGUuZ2V0RGlzcGxheVRleHQoZWxlbWVudCwgc3RyLCB0aGlzKTtcbiAgICB2YXIgbmFtZSA9IFwiXCI7XG4gICAgaWYgKCEhdGhpcy5sb2dpY1R5cGUuZ2V0RGlzcGxheVRleHROYW1lKSB7XG4gICAgICBuYW1lID0gdGhpcy5sb2dpY1R5cGUuZ2V0RGlzcGxheVRleHROYW1lKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISFlbGVtZW50ICYmICEhZWxlbWVudFtcIm5hbWVcIl0pIHtcbiAgICAgICAgbmFtZSA9IGVsZW1lbnRbXCJuYW1lXCJdO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISFuYW1lKSB7XG4gICAgICByZXR1cm4gc3RyW1wiZm9ybWF0XCJdKHRoaXMuZm9ybWF0RWxOYW1lKG5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBwdWJsaWMgZm9ybWF0RWxOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc2hvd1RpdGxlc0luRXhwcmVzc2lvbiAmJiAhIXRoaXMuc3VydmV5KSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLnN1cnZleS5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICAgIGlmICghIXF1ZXN0aW9uICYmICEhcXVlc3Rpb24udGl0bGUpIHtcbiAgICAgICAgbmFtZSA9IHF1ZXN0aW9uLnRpdGxlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJ7XCIgKyBuYW1lICsgXCJ9XCI7XG4gIH1cbiAgcHVibGljIGZvcm1hdEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3VydmV5TG9naWNUeXBlLmV4cHJlc3Npb25Ub0Rpc3BsYXlUZXh0KFxuICAgICAgdGhpcy5zdXJ2ZXksXG4gICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICBleHByZXNzaW9uXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGhhc1RoaXNBY3Rpb24oYWN0aW9uczogQXJyYXk8U3VydmV5TG9naWNBY3Rpb24+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFhY3Rpb25zKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYWN0aW9uc1tpXS5sb2dpY1R5cGUgPT0gdGhpcykgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVRyaWdnZXJFbGVtZW50KHN1cnZleTogU3VydmV5LlN1cnZleU1vZGVsKTogU3VydmV5LkJhc2Uge1xuICAgIHZhciByZXMgPSA8U3VydmV5LlN1cnZleVRyaWdnZXI+KFxuICAgICAgU3VydmV5LlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3ModGhpcy5iYXNlQ2xhc3MpXG4gICAgKTtcbiAgICByZXNbXCJzdXJ2ZXlcIl0gPSBzdXJ2ZXk7XG4gICAgcmVzLnNldE93bmVyKHN1cnZleSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHNhdmVUcmlnZ2VyRWxlbWVudChhY3Rpb246IFN1cnZleUxvZ2ljQWN0aW9uKSB7XG4gICAgaWYgKCEhYWN0aW9uLnRlbXBsYXRlT2JqZWN0LmVkaXRhYmxlT2JqZWN0KSB7XG4gICAgICB2YXIgZWRPYmogPSBhY3Rpb24udGVtcGxhdGVPYmplY3QuZWRpdGFibGVPYmplY3Q7XG4gICAgICBlZE9iai5hcHBseUFsbChbXCJleHByZXNzaW9uXCJdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRyaWdnZXIgPSA8U3VydmV5LlN1cnZleVRyaWdnZXI+YWN0aW9uLmVsZW1lbnQ7XG4gICAgICB2YXIgc3VydmV5ID0gdGhpcy5zdXJ2ZXk7XG4gICAgICBpZiAodGhpcy5pc05ld1RyaWdnZXIodHJpZ2dlcikgJiYgISF0cmlnZ2VyLmV4cHJlc3Npb24pIHtcbiAgICAgICAgc3VydmV5LnRyaWdnZXJzLnB1c2godHJpZ2dlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY3JlYXRlVHJpZ2dlclRlbXBsYXRlT2JqZWN0KGVsZW1lbnQ6IFN1cnZleS5CYXNlKSB7XG4gICAgdmFyIHJlczogU3VydmV5RWxlbWVudEVkaXRvckNvbnRlbnRNb2RlbCA9IG51bGw7XG4gICAgaWYgKHRoaXMuaXNOZXdUcmlnZ2VyKGVsZW1lbnQpKSB7XG4gICAgICByZXMgPSBuZXcgU3VydmV5RWxlbWVudEVkaXRvckNvbnRlbnRNb2RlbChlbGVtZW50LCBcIlwiLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSBuZXcgU3VydmV5UXVlc3Rpb25FZGl0b3IoZWxlbWVudCwgXCJcIiwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG4gICAgdmFyIGV4cHJlc3Npb25FZGl0b3IgPSByZXMuZ2V0UHJvcGVydHlFZGl0b3JCeU5hbWUoXCJleHByZXNzaW9uXCIpO1xuICAgIGlmICghIWV4cHJlc3Npb25FZGl0b3IpIHtcbiAgICAgIGV4cHJlc3Npb25FZGl0b3IuaXNIaWRkZW4gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgaXNOZXdUcmlnZ2VyKGVsZW1lbnQ6IFN1cnZleS5CYXNlKTogYm9vbGVhbiB7XG4gICAgdmFyIHRyaWdnZXIgPSA8U3VydmV5LlN1cnZleVRyaWdnZXI+ZWxlbWVudDtcbiAgICB2YXIgc3VydmV5ID0gdGhpcy5zdXJ2ZXk7XG4gICAgcmV0dXJuICEhc3VydmV5ICYmIHN1cnZleS50cmlnZ2Vycy5pbmRleE9mKHRyaWdnZXIpIDwgMDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5TG9naWNBY3Rpb24ge1xuICBwdWJsaWMga29FbGVtZW50OiBhbnk7XG4gIHB1YmxpYyBrb0xvZ2ljVHlwZTogYW55O1xuICBwdWJsaWMga29EaXNwbGF5RXJyb3I6IGFueTtcbiAgcHVibGljIGtvRXJyb3JUZXh0OiBhbnk7XG4gIHB1YmxpYyBrb1RlbXBsYXRlT2JqZWN0OiBhbnk7XG4gIHB1YmxpYyBrb1RlbXBsYXRlOiBhbnk7XG4gIHB1YmxpYyBrb0xvZ2ljVHlwZXM6IGFueTtcbiAgcHVibGljIG9uTG9naWNUeXBlQ2hhbmdlZDogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBpdGVtU2VsZWN0b3JWYWx1ZTogU3VydmV5RWxlbWVudFNlbGVjdG9yID0gbnVsbDtcbiAga29BZnRlclJlbmRlcjogYW55O1xuICBjb25zdHJ1Y3RvcihcbiAgICBsb2dpY1R5cGU6IFN1cnZleUxvZ2ljVHlwZSxcbiAgICBlbGVtZW50OiBTdXJ2ZXkuQmFzZSxcbiAgICBwcml2YXRlIHN1cnZleTogU3VydmV5LlN1cnZleU1vZGVsXG4gICkge1xuICAgIHRoaXMua29Mb2dpY1R5cGUgPSBrby5vYnNlcnZhYmxlKGxvZ2ljVHlwZSk7XG4gICAgdGhpcy5rb1RlbXBsYXRlID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcbiAgICB0aGlzLmtvRWxlbWVudCA9IGtvLm9ic2VydmFibGUoZWxlbWVudCk7XG4gICAgdGhpcy5rb0Vycm9yVGV4dCA9IGtvLm9ic2VydmFibGUoXCJcIik7XG4gICAgdGhpcy5rb1RlbXBsYXRlT2JqZWN0ID0ga28ub2JzZXJ2YWJsZShudWxsKTtcbiAgICB0aGlzLmtvTG9naWNUeXBlcyA9IGtvLm9ic2VydmFibGVBcnJheSgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvRGlzcGxheUVycm9yID0ga28uY29tcHV0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhc2VsZi5rb0Vycm9yVGV4dCgpO1xuICAgIH0pO1xuICAgIHRoaXMua29Mb2dpY1R5cGUuc3Vic2NyaWJlKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgc2VsZi5lbGVtZW50ID0gISFzZWxmLmxvZ2ljVHlwZVxuICAgICAgICA/IHNlbGYubG9naWNUeXBlLmNyZWF0ZU5ld0VsZW1lbnQoc2VsZi5zdXJ2ZXkpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGlmICghIXNlbGYub25Mb2dpY1R5cGVDaGFuZ2VkKSBzZWxmLm9uTG9naWNUeXBlQ2hhbmdlZCgpO1xuICAgICAgc2VsZi5kb0xvZ2ljVHlwZUNoYW5nZWQoKTtcbiAgICB9KTtcbiAgICB0aGlzLmRvTG9naWNUeXBlQ2hhbmdlZCgpO1xuICAgIHRoaXMua29BZnRlclJlbmRlciA9IGZ1bmN0aW9uICgpIHt9O1xuICB9XG4gIHB1YmxpYyBnZXQgbG9naWNUeXBlKCk6IFN1cnZleUxvZ2ljVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMua29Mb2dpY1R5cGUoKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvZ2ljVHlwZSh2YWw6IFN1cnZleUxvZ2ljVHlwZSkge1xuICAgIGlmICh0aGlzLmtvTG9naWNUeXBlKCkgPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5rb0xvZ2ljVHlwZSh2YWwpO1xuICAgIHRoaXMuZG9Mb2dpY1R5cGVDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtvVGVtcGxhdGUoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRlbXBsYXRlT2JqZWN0KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMua29UZW1wbGF0ZU9iamVjdCgpO1xuICB9XG4gIHB1YmxpYyBnZXQga29UZW1wbGF0ZUFmdGVyUmVuZGVyKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlT2JqZWN0IHx8ICF0aGlzLnRlbXBsYXRlT2JqZWN0LmVkaXRvcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZU9iamVjdC5lZGl0b3Iua29BZnRlclJlbmRlcjtcbiAgfVxuICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogU3VydmV5LkJhc2Uge1xuICAgIHJldHVybiB0aGlzLmtvRWxlbWVudCgpO1xuICB9XG4gIHB1YmxpYyBzZXQgZWxlbWVudCh2YWw6IFN1cnZleS5CYXNlKSB7XG4gICAgdGhpcy5rb0VsZW1lbnQodmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGl0ZW1TZWxlY3RvcigpOiBTdXJ2ZXlFbGVtZW50U2VsZWN0b3Ige1xuICAgIHJldHVybiB0aGlzLml0ZW1TZWxlY3RvclZhbHVlO1xuICB9XG4gIHB1YmxpYyBhcHBseShleHByZXNzaW9uOiBzdHJpbmcsIGlzUmVuYW1pbmc6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICghIXRoaXMuZWxlbWVudCAmJiAhIXRoaXMubG9naWNUeXBlKSB7XG4gICAgICB0aGlzLmVsZW1lbnRbdGhpcy5sb2dpY1R5cGUucHJvcGVydHlOYW1lXSA9IGV4cHJlc3Npb247XG4gICAgICBpZiAoIWlzUmVuYW1pbmcpIHtcbiAgICAgICAgdGhpcy5sb2dpY1R5cGUuc2F2ZUVsZW1lbnQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyByZW5hbWVRdWVzdGlvbihvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5lbGVtZW50KSByZXR1cm47XG4gICAgdmFyIG5hbWVzID0gdGhpcy5xdWVzdGlvbk5hbWVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdHIgPSB0aGlzLmVsZW1lbnRbbmFtZXNbaV1dO1xuICAgICAgaWYgKCEhc3RyICYmIHN0ci50b0xvd2VyQ2FzZSgpID09IG9sZE5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICB0aGlzLmVsZW1lbnRbbmFtZXNbaV1dID0gbmV3TmFtZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGVxdWFscyhhY3Rpb246IFN1cnZleUxvZ2ljQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubG9naWNUeXBlID09PSBhY3Rpb24ubG9naWNUeXBlICYmIHRoaXMuZWxlbWVudCA9PT0gYWN0aW9uLmVsZW1lbnRcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9naWNUeXBlID8gdGhpcy5sb2dpY1R5cGUuZGlzcGxheU5hbWUgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9naWNUeXBlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9naWNUeXBlID8gdGhpcy5sb2dpY1R5cGUubmFtZSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5sb2dpY1R5cGUgPyB0aGlzLmxvZ2ljVHlwZS5nZXREaXNwbGF5VGV4dCh0aGlzLmVsZW1lbnQpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGRlbGV0ZUFjdGlvblRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0TG9naWNTdHJpbmcoXCJkZWxldGVBY3Rpb25cIik7XG4gIH1cbiAgcHVibGljIGhhc0Vycm9yKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5sb2dpY1R5cGUpIHtcbiAgICAgIHRoaXMuZXJyb3JUZXh0ID0gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBlLmNvbmRpdGlvbkFjdGlvbkVtcHR5XCIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRoaXMuZXJyb3JUZXh0ID0gXCJcIjtcbiAgICBpZiAoISF0aGlzLml0ZW1TZWxlY3RvcikgcmV0dXJuIHRoaXMuaXRlbVNlbGVjdG9yLmhhc0Vycm9yKCk7XG4gICAgaWYgKCEhdGhpcy50ZW1wbGF0ZU9iamVjdCAmJiAhIXRoaXMudGVtcGxhdGVPYmplY3QuaGFzRXJyb3IpXG4gICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZU9iamVjdC5oYXNFcnJvcigpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtvRXJyb3JUZXh0KCk7XG4gIH1cbiAgcHVibGljIHNldCBlcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmtvRXJyb3JUZXh0KHZhbCk7XG4gIH1cbiAgcHVibGljIGdldExvY1N0cmluZyhuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhuYW1lKTtcbiAgfVxuICBwcml2YXRlIGdldCBxdWVzdGlvbk5hbWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGlmICghdGhpcy5sb2dpY1R5cGUgfHwgIXRoaXMubG9naWNUeXBlLnF1ZXN0aW9uTmFtZXMpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5sb2dpY1R5cGUucXVlc3Rpb25OYW1lcztcbiAgfVxuICBwcml2YXRlIGRvTG9naWNUeXBlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLmtvRXJyb3JUZXh0KFwiXCIpO1xuICAgIHRoaXMuaXRlbVNlbGVjdG9yVmFsdWUgPSAhIXRoaXMubG9naWNUeXBlXG4gICAgICA/IHRoaXMubG9naWNUeXBlLmNyZWF0ZUl0ZW1TZWxlY3RvcigpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKHRoaXMuaXRlbVNlbGVjdG9yKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB0aGlzLml0ZW1TZWxlY3Rvci5lbGVtZW50ID0gdGhpcy5lbGVtZW50O1xuICAgICAgdGhpcy5pdGVtU2VsZWN0b3Iub25WYWx1ZUNoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uIChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHNlbGYuZWxlbWVudCA9IHNlbGYuaXRlbVNlbGVjdG9yLmVsZW1lbnQ7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgb2JqID0gISF0aGlzLmxvZ2ljVHlwZVxuICAgICAgPyB0aGlzLmxvZ2ljVHlwZS5jcmVhdGVUZW1wbGF0ZU9iamVjdCh0aGlzLmVsZW1lbnQpXG4gICAgICA6IG51bGw7XG4gICAgb2JqID0gb2JqIHx8IHRoaXMuaXRlbVNlbGVjdG9yO1xuICAgIHRoaXMua29UZW1wbGF0ZShcIlwiKTtcbiAgICB0aGlzLmtvVGVtcGxhdGVPYmplY3Qob2JqKTtcbiAgICB0aGlzLmtvVGVtcGxhdGUoISF0aGlzLmxvZ2ljVHlwZSA/IHRoaXMubG9naWNUeXBlLnRlbXBsYXRlTmFtZSA6IFwiXCIpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleUxvZ2ljSXRlbU93bmVyIHtcbiAgcmVhZE9ubHk6IGJvb2xlYW47XG4gIGVkaXRJdGVtKGl0ZW06IFN1cnZleUxvZ2ljSXRlbSk7XG4gIHJlbW92ZUl0ZW0oaXRlbTogU3VydmV5TG9naWNJdGVtKTtcbiAgZ2V0RXhwcmVzc2lvbkFzRGlzcGxheVRleHQoZXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5TG9naWNJdGVtIHtcbiAgcHVibGljIGtvQWN0aW9uczogYW55O1xuICBwcml2YXRlIHN0YXRpYyBjb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBpZCA9ICsrU3VydmV5TG9naWNJdGVtLmNvdW50ZXI7XG4gIHByaXZhdGUgcmVtb3ZlZEFjdGlvbnM6IEFycmF5PFN1cnZleUxvZ2ljQWN0aW9uPjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBvd25lcjogSVN1cnZleUxvZ2ljSXRlbU93bmVyLFxuICAgIHB1YmxpYyBleHByZXNzaW9uOiBzdHJpbmcgPSBcIlwiXG4gICkge1xuICAgIHRoaXMucmVtb3ZlZEFjdGlvbnMgPSBbXTtcbiAgICB0aGlzLmtvQWN0aW9ucyA9IGtvLm9ic2VydmFibGVBcnJheSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gXCJsb2dpY0l0ZW1cIiArIHRoaXMuaWQ7XG4gIH1cbiAgcHVibGljIGdldCB0aXRsZSgpIHtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRFeHByZXNzaW9uQXNEaXNwbGF5VGV4dCgpO1xuICAgIGlmICghIXJlcyAmJiByZXMubGVuZ3RoID4gNTApIHtcbiAgICAgIHJlcyA9IHJlcy5zdWJzdHIoMSwgNTApICsgXCIuLi5cIjtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZWRpdCgpIHtcbiAgICBpZiAoISF0aGlzLm93bmVyKSB7XG4gICAgICB0aGlzLm93bmVyLmVkaXRJdGVtKHRoaXMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcmVtb3ZlKCkge1xuICAgIGlmICghIXRoaXMub3duZXIpIHtcbiAgICAgIHRoaXMub3duZXIucmVtb3ZlSXRlbSh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCkge1xuICAgIHJldHVybiAhIXRoaXMub3duZXIgJiYgdGhpcy5vd25lci5yZWFkT25seTtcbiAgfVxuICBwdWJsaWMgZ2V0IGFjdGlvbnMoKTogQXJyYXk8U3VydmV5TG9naWNBY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5rb0FjdGlvbnMoKTtcbiAgfVxuICBwdWJsaWMgYWRkTmV3QWN0aW9uKGFjdGlvbjogU3VydmV5TG9naWNBY3Rpb24pIHtcbiAgICB0aGlzLmtvQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gIH1cbiAgcHVibGljIHJlbW92ZUFjdGlvbihhY3Rpb246IFN1cnZleUxvZ2ljQWN0aW9uKSB7XG4gICAgdGhpcy5yZW1vdmVkQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5rb0FjdGlvbnMoKS5pbmRleE9mKGFjdGlvbik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMua29BY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBpZiAoISFhY3Rpb24ubG9naWNUeXBlICYmICEhYWN0aW9uLm9uTG9naWNUeXBlQ2hhbmdlZCkge1xuICAgICAgICBhY3Rpb24ub25Mb2dpY1R5cGVDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhcHBseShleHByZXNzaW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlbW92ZVNhbWVBY3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlbW92ZWRBY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnJlbW92ZWRBY3Rpb25zW2ldLmFwcGx5KFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZWRBY3Rpb25zID0gW107XG4gICAgdGhpcy5hcHBseUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyByZW5hbWVRdWVzdGlvbihvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZykge1xuICAgIGlmICghb2xkTmFtZSB8fCAhbmV3TmFtZSkgcmV0dXJuO1xuICAgIHRoaXMucmVuYW1lUXVlc3Rpb25JbkV4cHJlc3Npb24ob2xkTmFtZSwgbmV3TmFtZSk7XG4gICAgdmFyIG9wcyA9IHRoaXMuYWN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgb3BzW2ldLnJlbmFtZVF1ZXN0aW9uKG9sZE5hbWUsIG5ld05hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcmVtb3ZlUXVlc3Rpb24obmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5yZW1vdmVRdWVzdGlvbkluRXhwcmVzc2lvbihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb25UZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcImVkLmxnLml0ZW1FeHByZXNzaW9uVGV4dFwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMuZ2V0RXhwcmVzc2lvbkFzRGlzcGxheVRleHQoKSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRFeHByZXNzaW9uQXNEaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMub3duZXJcbiAgICAgID8gdGhpcy5vd25lci5nZXRFeHByZXNzaW9uQXNEaXNwbGF5VGV4dCh0aGlzLmV4cHJlc3Npb24pXG4gICAgICA6IHRoaXMuZXhwcmVzc2lvbjtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwZS5lZGl0XCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgZGVsZXRlVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicGUuZGVsZXRlXCIpO1xuICB9XG4gIHByaXZhdGUgcmVuYW1lUXVlc3Rpb25JbkV4cHJlc3Npb24ob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbikgcmV0dXJuO1xuICAgIHZhciBuZXdFeHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uO1xuICAgIHZhciBleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgb2xkTmFtZSA9IFwie1wiICsgb2xkTmFtZS50b0xvd2VyQ2FzZSgpICsgXCJ9XCI7XG4gICAgbmV3TmFtZSA9IFwie1wiICsgbmV3TmFtZSArIFwifVwiO1xuICAgIHZhciBpbmRleCA9IGV4cHJlc3Npb24ubGFzdEluZGV4T2Yob2xkTmFtZSwgZXhwcmVzc2lvbi5sZW5ndGgpO1xuICAgIHdoaWxlIChpbmRleCA+IC0xKSB7XG4gICAgICBuZXdFeHByZXNzaW9uID1cbiAgICAgICAgbmV3RXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgpICtcbiAgICAgICAgbmV3TmFtZSArXG4gICAgICAgIG5ld0V4cHJlc3Npb24uc3Vic3RyKGluZGV4ICsgb2xkTmFtZS5sZW5ndGgsICtuZXdFeHByZXNzaW9uLmxlbmd0aCk7XG4gICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5zdWJzdHJpbmcoMCwgaW5kZXgpO1xuICAgICAgaW5kZXggPSBleHByZXNzaW9uLmxhc3RJbmRleE9mKG9sZE5hbWUsIGV4cHJlc3Npb24ubGVuZ3RoKTtcbiAgICB9XG4gICAgaWYgKG5ld0V4cHJlc3Npb24gIT0gdGhpcy5leHByZXNzaW9uKSB7XG4gICAgICB0aGlzLmFwcGx5RXhwcmVzc2lvbihuZXdFeHByZXNzaW9uLCB0cnVlKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmVRdWVzdGlvbkluRXhwcmVzc2lvbihuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbikgcmV0dXJuO1xuICAgIHZhciBleHBSID0gbmV3IEV4cHJlc3Npb25SZW1vdmVWYXJpYWJsZSgpO1xuICAgIHZhciBuZXdFeHByZXNzaW9uID0gZXhwUi5yZW1vdmUodGhpcy5leHByZXNzaW9uLCBuYW1lKTtcbiAgICBpZiAobmV3RXhwcmVzc2lvbiAhPSB0aGlzLmV4cHJlc3Npb24pIHtcbiAgICAgIHRoaXMuYXBwbHlFeHByZXNzaW9uKG5ld0V4cHJlc3Npb24sIHRydWUpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFwcGx5RXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcsIGlzUmVuYW1pbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIHZhciBvcHMgPSB0aGlzLmFjdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9wc1tpXS5hcHBseShleHByZXNzaW9uLCBpc1JlbmFtaW5nKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmVTYW1lQWN0aW9ucygpIHtcbiAgICB2YXIgb3BzID0gdGhpcy5hY3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSBvcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGZvciAodmFyIGogPSBpIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgaWYgKG9wc1tpXS5lcXVhbHMob3BzW2pdKSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQWN0aW9uKG9wc1tpXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleUxvZ2ljIGltcGxlbWVudHMgSVN1cnZleUxvZ2ljSXRlbU93bmVyIHtcbiAgcHVibGljIHN0YXRpYyB2aXNpYmxlQWN0aW9ucyA9IFtdO1xuICBwdWJsaWMgc3RhdGljIHR5cGVzOiBBcnJheTxhbnk+ID0gW1xuICAgIHtcbiAgICAgIG5hbWU6IFwicGFnZV92aXNpYmlsaXR5XCIsXG4gICAgICBiYXNlQ2xhc3M6IFwicGFnZVwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcInZpc2libGVJZlwiLFxuICAgICAgc2hvd0lmOiBmdW5jdGlvbiAoc3VydmV5OiBTdXJ2ZXkuU3VydmV5TW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHN1cnZleS5wYWdlcy5sZW5ndGggPiAxO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGFuZWxfdmlzaWJpbGl0eVwiLFxuICAgICAgYmFzZUNsYXNzOiBcInBhbmVsXCIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IFwidmlzaWJsZUlmXCIsXG4gICAgICBzaG93SWY6IGZ1bmN0aW9uIChzdXJ2ZXk6IFN1cnZleS5TdXJ2ZXlNb2RlbCkge1xuICAgICAgICByZXR1cm4gc3VydmV5LmdldEFsbFBhbmVscygpLmxlbmd0aCA+IDA7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJwYW5lbF9lbmFibGVcIixcbiAgICAgIGJhc2VDbGFzczogXCJwYW5lbFwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcImVuYWJsZUlmXCIsXG4gICAgICBzaG93SWY6IGZ1bmN0aW9uIChzdXJ2ZXk6IFN1cnZleS5TdXJ2ZXlNb2RlbCkge1xuICAgICAgICByZXR1cm4gc3VydmV5LmdldEFsbFBhbmVscygpLmxlbmd0aCA+IDA7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJxdWVzdGlvbl92aXNpYmlsaXR5XCIsXG4gICAgICBiYXNlQ2xhc3M6IFwicXVlc3Rpb25cIixcbiAgICAgIHByb3BlcnR5TmFtZTogXCJ2aXNpYmxlSWZcIixcbiAgICAgIHNob3dJZjogZnVuY3Rpb24gKHN1cnZleTogU3VydmV5LlN1cnZleU1vZGVsKSB7XG4gICAgICAgIHJldHVybiBzdXJ2ZXkuZ2V0QWxsUXVlc3Rpb25zKCkubGVuZ3RoID4gMDtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInF1ZXN0aW9uX2VuYWJsZVwiLFxuICAgICAgYmFzZUNsYXNzOiBcInF1ZXN0aW9uXCIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IFwiZW5hYmxlSWZcIixcbiAgICAgIHNob3dJZjogZnVuY3Rpb24gKHN1cnZleTogU3VydmV5LlN1cnZleU1vZGVsKSB7XG4gICAgICAgIHJldHVybiBzdXJ2ZXkuZ2V0QWxsUXVlc3Rpb25zKCkubGVuZ3RoID4gMDtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInF1ZXN0aW9uX3JlcXVpcmVcIixcbiAgICAgIGJhc2VDbGFzczogXCJxdWVzdGlvblwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcInJlcXVpcmVkSWZcIixcbiAgICAgIHNob3dJZjogZnVuY3Rpb24gKHN1cnZleTogU3VydmV5LlN1cnZleU1vZGVsKSB7XG4gICAgICAgIHJldHVybiBzdXJ2ZXkuZ2V0QWxsUXVlc3Rpb25zKCkubGVuZ3RoID4gMDtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImV4cHJlc3Npb25fZXhwcmVzc2lvblwiLFxuICAgICAgYmFzZUNsYXNzOiBcImV4cHJlc3Npb25cIixcbiAgICAgIHByb3BlcnR5TmFtZTogXCJleHByZXNzaW9uXCIsXG4gICAgICBzaG93SW5VSTogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1hdHJpeGRyb3Bkb3duY29sdW1uX3Zpc2libGVJZlwiLFxuICAgICAgYmFzZUNsYXNzOiBcIm1hdHJpeGRyb3Bkb3duY29sdW1uXCIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IFwidmlzaWJsZUlmXCIsXG4gICAgICBzaG93SW5VSTogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1hdHJpeGRyb3Bkb3duY29sdW1uX2VuYWJsZUlmXCIsXG4gICAgICBiYXNlQ2xhc3M6IFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIixcbiAgICAgIHByb3BlcnR5TmFtZTogXCJlbmFibGVJZlwiLFxuICAgICAgc2hvd0luVUk6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXRyaXhkcm9wZG93bmNvbHVtbl9yZXF1aXJlZElmXCIsXG4gICAgICBiYXNlQ2xhc3M6IFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIixcbiAgICAgIHByb3BlcnR5TmFtZTogXCJyZXF1aXJlZElmXCIsXG4gICAgICBzaG93SW5VSTogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1hdHJpeGRyb3Bkb3duY29sdW1uX3RvdGFsRXhwcmVzc2lvblwiLFxuICAgICAgYmFzZUNsYXNzOiBcIm1hdHJpeGRyb3Bkb3duY29sdW1uXCIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IFwidG90YWxFeHByZXNzaW9uXCIsXG4gICAgICBzaG93SW5VSTogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRyaWdnZXJfY29tcGxldGVcIixcbiAgICAgIGJhc2VDbGFzczogXCJjb21wbGV0ZXRyaWdnZXJcIixcbiAgICAgIHByb3BlcnR5TmFtZTogXCJleHByZXNzaW9uXCIsXG4gICAgICBpc1VuaXF1ZUl0ZW06IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRyaWdnZXJfc2V0dmFsdWVcIixcbiAgICAgIGJhc2VDbGFzczogXCJzZXR2YWx1ZXRyaWdnZXJcIixcbiAgICAgIHByb3BlcnR5TmFtZTogXCJleHByZXNzaW9uXCIsXG4gICAgICBxdWVzdGlvbk5hbWVzOiBbXCJzZXRUb05hbWVcIl0sXG4gICAgICBnZXREaXNwbGF5VGV4dDogZnVuY3Rpb24gKFxuICAgICAgICBlbGVtZW50OiBTdXJ2ZXkuQmFzZSxcbiAgICAgICAgZm9ybWF0U3RyOiBzdHJpbmcsXG4gICAgICAgIGx0OiBTdXJ2ZXlMb2dpY1R5cGVcbiAgICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBmb3JtYXRTdHJbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgbHQuZm9ybWF0RWxOYW1lKGVsZW1lbnRbXCJzZXRUb05hbWVcIl0pLFxuICAgICAgICAgIGVsZW1lbnRbXCJzZXRWYWx1ZVwiXVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidHJpZ2dlcl9jb3B5dmFsdWVcIixcbiAgICAgIGJhc2VDbGFzczogXCJjb3B5dmFsdWV0cmlnZ2VyXCIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IFwiZXhwcmVzc2lvblwiLFxuICAgICAgcXVlc3Rpb25OYW1lczogW1wic2V0VG9OYW1lXCIsIFwiZnJvbU5hbWVcIl0sXG4gICAgICBnZXREaXNwbGF5VGV4dDogZnVuY3Rpb24gKFxuICAgICAgICBlbGVtZW50OiBTdXJ2ZXkuQmFzZSxcbiAgICAgICAgZm9ybWF0U3RyOiBzdHJpbmcsXG4gICAgICAgIGx0OiBTdXJ2ZXlMb2dpY1R5cGVcbiAgICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBmb3JtYXRTdHJbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgbHQuZm9ybWF0RWxOYW1lKGVsZW1lbnRbXCJzZXRUb05hbWVcIl0pLFxuICAgICAgICAgIGx0LmZvcm1hdEVsTmFtZShlbGVtZW50W1wiZnJvbU5hbWVcIl0pXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ0cmlnZ2VyX3NraXBcIixcbiAgICAgIGJhc2VDbGFzczogXCJza2lwdHJpZ2dlclwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcImV4cHJlc3Npb25cIixcbiAgICAgIHF1ZXN0aW9uTmFtZXM6IFtcImdvdG9OYW1lXCJdLFxuICAgICAgaXNVbmlxdWVJdGVtOiB0cnVlLFxuICAgICAgZ2V0RGlzcGxheVRleHROYW1lOiBmdW5jdGlvbiAoZWxlbWVudDogU3VydmV5LkJhc2UpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZWxlbWVudFtcImdvdG9OYW1lXCJdO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidHJpZ2dlcl9ydW5FeHByZXNzaW9uXCIsXG4gICAgICBiYXNlQ2xhc3M6IFwicnVuZXhwcmVzc2lvbnRyaWdnZXJcIixcbiAgICAgIHByb3BlcnR5TmFtZTogXCJleHByZXNzaW9uXCIsXG4gICAgICBxdWVzdGlvbk5hbWVzOiBbXCJzZXRUb05hbWVcIl0sXG4gICAgICBnZXREaXNwbGF5VGV4dDogZnVuY3Rpb24gKFxuICAgICAgICBlbGVtZW50OiBTdXJ2ZXkuQmFzZSxcbiAgICAgICAgZm9ybWF0U3RyOiBzdHJpbmcsXG4gICAgICAgIGx0OiBTdXJ2ZXlMb2dpY1R5cGVcbiAgICAgICk6IHN0cmluZyB7XG4gICAgICAgIHZhciByZXMgPSBnZXRMb2dpY1N0cmluZyhcInRyaWdnZXJfcnVuRXhwcmVzc2lvblRleHQxXCIpO1xuICAgICAgICByZXMgPSByZXNbXCJmb3JtYXRcIl0obHQuZm9ybWF0RXhwcmVzc2lvbihlbGVtZW50W1wicnVuRXhwcmVzc2lvblwiXSkpO1xuICAgICAgICB2YXIgc2V0VG9OYW1lID0gZWxlbWVudFtcInNldFRvTmFtZVwiXTtcbiAgICAgICAgaWYgKCEhc2V0VG9OYW1lKSB7XG4gICAgICAgICAgdmFyIHN0ciA9IGdldExvZ2ljU3RyaW5nKFwidHJpZ2dlcl9ydW5FeHByZXNzaW9uVGV4dDJcIik7XG4gICAgICAgICAgcmVzICs9IHN0cltcImZvcm1hdFwiXShsdC5mb3JtYXRFbE5hbWUoZWxlbWVudFtcInNldFRvTmFtZVwiXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIixcbiAgICAgIGJhc2VDbGFzczogXCJodG1sY29uZGl0aW9uaXRlbVwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcImV4cHJlc3Npb25cIixcbiAgICAgIGlzVW5pcXVlSXRlbTogdHJ1ZSxcbiAgICAgIHRlbXBsYXRlTmFtZTogXCJzdmQtcHJvcGVydHktZWRpdG9yLWh0bWxcIixcbiAgICAgIGNyZWF0ZU5ld0VsZW1lbnQ6IGZ1bmN0aW9uIChzdXJ2ZXk6IFN1cnZleS5TdXJ2ZXlNb2RlbCkge1xuICAgICAgICByZXR1cm4gbmV3IFN1cnZleS5IdG1sQ29uZGl0aW9uSXRlbSgpO1xuICAgICAgfSxcbiAgICAgIGNyZWF0ZVRlbXBsYXRlT2JqZWN0OiBmdW5jdGlvbiAoZWxlbWVudDogU3VydmV5LkJhc2UpIHtcbiAgICAgICAgLy92YXIgaXRlbSA9IDxTdXJ2ZXkuSHRtbENvbmRpdGlvbkl0ZW0+ZWxlbWVudDtcbiAgICAgICAgdmFyIHJlcyA9IG5ldyBTdXJ2ZXlFbGVtZW50RWRpdG9yQ29udGVudE1vZGVsKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlcy5nZXRQcm9wZXJ0eUVkaXRvckJ5TmFtZShcImh0bWxcIik7XG4gICAgICAgIC8qXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga29WYWx1ZToga28ub2JzZXJ2YWJsZShpdGVtLmh0bWwpLFxuICAgICAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgICAgICBrb0FmdGVyUmVuZGVyOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgfTsqL1xuICAgICAgfSxcbiAgICAgIHNhdmVFbGVtZW50OiBmdW5jdGlvbiAoXG4gICAgICAgIHN1cnZleTogU3VydmV5LlN1cnZleU1vZGVsLFxuICAgICAgICBhY3Rpb246IFN1cnZleUxvZ2ljQWN0aW9uXG4gICAgICApIHtcbiAgICAgICAgdmFyIGl0ZW0gPSA8U3VydmV5Lkh0bWxDb25kaXRpb25JdGVtPmFjdGlvbi5lbGVtZW50O1xuICAgICAgICBpdGVtLmh0bWwgPSBhY3Rpb24udGVtcGxhdGVPYmplY3Qua29WYWx1ZSgpO1xuICAgICAgICBpZiAoc3VydmV5LmNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbi5pbmRleE9mKGl0ZW0pIDwgMCkge1xuICAgICAgICAgIHN1cnZleS5jb21wbGV0ZWRIdG1sT25Db25kaXRpb24ucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidHJpZ2dlcl9ydW5FeHByZXNzaW9uX0V4cHJlc3Npb25cIixcbiAgICAgIGJhc2VDbGFzczogXCJydW5leHByZXNzaW9udHJpZ2dlclwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcInJ1bkV4cHJlc3Npb25cIixcbiAgICAgIHNob3dJblVJOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicXVlc3Rpb25fZXhwcmVzc2lvblZhbGlkYXRvclwiLFxuICAgICAgYmFzZUNsYXNzOiBcImV4cHJlc3Npb252YWxpZGF0b3JcIixcbiAgICAgIHByb3BlcnR5TmFtZTogXCJleHByZXNzaW9uXCIsXG4gICAgICBzaG93SW5VSTogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1hdHJpeF9yb3dzVmlzaWJsZUlmXCIsXG4gICAgICBiYXNlQ2xhc3M6IFwibWF0cml4XCIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IFwicm93c1Zpc2libGVJZlwiLFxuICAgICAgc2hvd0luVUk6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXRyaXhfY29sdW1uc1Zpc2libGVJZlwiLFxuICAgICAgYmFzZUNsYXNzOiBcIm1hdHJpeFwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcImNvbHVtbnNWaXNpYmxlSWZcIixcbiAgICAgIHNob3dJblVJOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF0cml4ZHJvcGRvd25fcm93c1Zpc2libGVJZlwiLFxuICAgICAgYmFzZUNsYXNzOiBcIm1hdHJpeGRyb3Bkb3duXCIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IFwicm93c1Zpc2libGVJZlwiLFxuICAgICAgc2hvd0luVUk6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJzZWxlY3RfY2hvaWNlc1Zpc2libGVJZlwiLFxuICAgICAgYmFzZUNsYXNzOiBcInNlbGVjdGJhc2VcIixcbiAgICAgIHByb3BlcnR5TmFtZTogXCJjaG9pY2VzVmlzaWJsZUlmXCIsXG4gICAgICBzaG93SW5VSTogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInNlbGVjdF9jaG9pY2VzRW5hYmxlSWZcIixcbiAgICAgIGJhc2VDbGFzczogXCJzZWxlY3RiYXNlXCIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IFwiY2hvaWNlc0VuYWJsZUlmXCIsXG4gICAgICBzaG93SW5VSTogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIml0ZW12YWx1ZV92aXNpYmxlSWZcIixcbiAgICAgIGJhc2VDbGFzczogXCJpdGVtdmFsdWVcIixcbiAgICAgIHByb3BlcnR5TmFtZTogXCJ2aXNpYmxlSWZcIixcbiAgICAgIHNob3dJblVJOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiaXRlbXZhbHVlX2VuYWJsZUlmXCIsXG4gICAgICBiYXNlQ2xhc3M6IFwiaXRlbXZhbHVlXCIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IFwiZW5hYmxlSWZcIixcbiAgICAgIHNob3dJblVJOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2FsY3VsYXRlZFZhbHVlXCIsXG4gICAgICBiYXNlQ2xhc3M6IFwiY2FsY3VsYXRlZHZhbHVlXCIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IFwiZXhwcmVzc2lvblwiLFxuICAgICAgc2hvd0luVUk6IGZhbHNlLFxuICAgIH0sXG4gIF07XG4gIHB1YmxpYyBrb0l0ZW1zOiBhbnk7XG4gIHB1YmxpYyBpbnZpc2libGVJdGVtczogQXJyYXk8U3VydmV5TG9naWNJdGVtPiA9IFtdO1xuICBwdWJsaWMga29Mb2dpY1R5cGVzOiBhbnk7XG4gIHB1YmxpYyBrb01vZGU6IGFueTtcbiAgcHVibGljIGtvQWRkTmV3OiBhbnk7XG4gIHB1YmxpYyBrb0VkaXRJdGVtOiBhbnk7XG4gIHB1YmxpYyBrb1JlbW92ZUl0ZW06IGFueTtcbiAgcHVibGljIGtvU2hvd1ZpZXc6IGFueTtcbiAgcHVibGljIGtvU2F2ZUFuZFNob3dWaWV3OiBhbnk7XG4gIHB1YmxpYyBrb1NhdmVFZGl0YWJsZUl0ZW06IGFueTtcbiAgcHVibGljIGtvQWRkTmV3QWN0aW9uOiBhbnk7XG4gIHB1YmxpYyBrb1JlbW92ZUFjdGlvbjogYW55O1xuICBwdWJsaWMga29FZGl0YWJsZUl0ZW06IGFueTtcbiAgcHVibGljIGV4cHJlc3Npb25FZGl0b3I6IFN1cnZleVByb3BlcnR5Q29uZGl0aW9uRWRpdG9yO1xuICBwdWJsaWMga29SZWFkT25seTogYW55O1xuICBwdWJsaWMga29FcnJvclRleHQ6IGFueTtcbiAgcHVibGljIGtvRGlzcGxheUVycm9yOiBhbnk7XG4gIHB1YmxpYyBvbkNoYW5nZWRDYWxsYmFjazogKGl0ZW06IFN1cnZleUxvZ2ljSXRlbSwgY2hhbmdlVHlwZTogc3RyaW5nKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgY2FsbGVkIHdoZW4gbG9naWMgaXRlbSBpcyBzYXZlZC5cbiAgICogPGJyLz4gb3B0aW9ucy5pdGVtIGlzIHRoZSBzYXZlZCBsb2dpYyBpdGVtLlxuICAgKi9cbiAgcHVibGljIG9uTG9naWNJdGVtU2F2ZWQ6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlMb2dpYywgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUxvZ2ljLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCBiZWZvcmUgbG9naWMgaXRlbSBpcyBzYXZlZC4gWW91IGNhbiBzZXQgb3B0aW9ucy5lcnJvciB0byBub24gZW1wdHkgc3RyaW5nIHRvIHNob3cgZXJyb3IgaW5zdGVhZCBvZiBzYXZpbmcgdGhlIGl0ZW0uXG4gICAqIFlvdSBjYW4gdXNlIG9wdGlvbnMuaXRlbS5hY3Rpb25zIHRvIGFjY2VzcyBhY3Rpb25zIGFuZCBvcHRpb25hbGx5IHNldCBlcnJvclRleHQgdG8gYSBwYXJ0aWN1bGFyIGFjdGlvbi5cbiAgICogPGJyLz4gb3B0aW9ucy5pdGVtIGlzIHRoZSBzYXZlZCBsb2dpYyBpdGVtLlxuICAgKiA8YnIvPiB1c2VkTmFtZXNJbkV4cHJlc3Npb24gLSB0aGUgc3RyaW5nIGxpc3Qgb2YgYWxsIHZhcmlhYmxlcyAocXVlc3Rpb25zLCBjYWxjdWxhdGVkVmFsdWVzLCBhbmQgc28gb24pIHRoYXQgYXJlIHVzZWQgaW4gZXhwcmVzc2lvblxuICAgKiA8YnIvPiBlcnJvciAtIHRoZSBlcnJvciBzdHJpbmcuIEl0IGlzIGVtcHR5IGJ5IGRlZmF1bHQuIFlvdSBoYXZlIHRvIHNldCBpdCB0byBub24tZW1wdHkgc3RyaW5nIHRvIHNob3cgdGhlIGVycm9yIG9uIHNhdmluZy5cbiAgICovXG4gIHB1YmxpYyBvbkxvZ2ljSXRlbVZhbGlkYXRpb246IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlMb2dpYywgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUxvZ2ljLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGNhbGxlZCBiZWZvcmUgbG9naWMgaXRlbSBpcyBiZWluZyByZW1vdmVkLlxuICAgKiA8YnIvPiBvcHRpb25zLmFsbG93UmVtb3ZlIGlzIHRoZSBvcHRpb24geW91IGNhbiBzZXQgdG8gZmFsc2UgYW5kIHByZXZlbnQgcmVtb3ZpbmcuXG4gICAqIDxici8+IG9wdGlvbnMuaXRlbSBpcyB0aGUgbG9naWMgaXRlbSB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgb25Mb2dpY0l0ZW1SZW1vdmluZzogU3VydmV5LkV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleUxvZ2ljLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBTdXJ2ZXkuRXZlbnQ8KHNlbmRlcjogU3VydmV5TG9naWMsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgY2FsbGVkIHdoZW4gbG9naWMgaXRlbSBpcyByZW1vdmVkLlxuICAgKiA8YnIvPiBvcHRpb25zLml0ZW0gaXMgdGhlIHJlbW92ZWQgbG9naWMgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBvbkxvZ2ljSXRlbVJlbW92ZWQ6IFN1cnZleS5FdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlMb2dpYywgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgU3VydmV5LkV2ZW50PChzZW5kZXI6IFN1cnZleUxvZ2ljLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuXG4gIGtvQWZ0ZXJSZW5kZXI6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3VydmV5OiBTdXJ2ZXkuU3VydmV5TW9kZWwsXG4gICAgcHVibGljIG9wdGlvbnM6IElTdXJ2ZXlPYmplY3RFZGl0b3JPcHRpb25zID0gbnVsbFxuICApIHtcbiAgICB0aGlzLmNyZWF0ZUV4cHJlc3Npb25Qcm9wZXJ0eUVkaXRvcigpO1xuICAgIHRoaXMuaGlkZUV4cHJlc3Npb25IZWFkZXIgPSBvcHRpb25zICYmIG9wdGlvbnNbXCJoaWRlRXhwcmVzc2lvbkhlYWRlclwiXTtcbiAgICB0aGlzLmtvSXRlbXMgPSBrby5vYnNlcnZhYmxlQXJyYXkoKTtcbiAgICB0aGlzLmtvTG9naWNUeXBlcyA9IGtvLm9ic2VydmFibGVBcnJheSgpO1xuICAgIHRoaXMua29Nb2RlID0ga28ub2JzZXJ2YWJsZShcInZpZXdcIik7XG4gICAgdGhpcy5rb1JlYWRPbmx5ID0ga28ub2JzZXJ2YWJsZSh0aGlzLnJlYWRPbmx5KTtcbiAgICB0aGlzLmtvRXJyb3JUZXh0ID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0Rpc3BsYXlFcnJvciA9IGtvLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIXNlbGYua29FcnJvclRleHQoKTtcbiAgICB9KTtcbiAgICB0aGlzLmtvQWRkTmV3ID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5hZGROZXcoKTtcbiAgICB9O1xuICAgIHRoaXMua29FZGl0SXRlbSA9IGZ1bmN0aW9uIChpdGVtOiBTdXJ2ZXlMb2dpY0l0ZW0pIHtcbiAgICAgIHNlbGYuZWRpdEl0ZW0oaXRlbSk7XG4gICAgfTtcbiAgICB0aGlzLmtvUmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChpdGVtOiBTdXJ2ZXlMb2dpY0l0ZW0pIHtcbiAgICAgIHNlbGYucmVtb3ZlSXRlbShpdGVtKTtcbiAgICB9O1xuICAgIHRoaXMua29TaG93VmlldyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYubW9kZSA9IFwidmlld1wiO1xuICAgIH07XG4gICAgdGhpcy5rb1NhdmVBbmRTaG93VmlldyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLnNhdmVFZGl0YWJsZUl0ZW0oKSkge1xuICAgICAgICBzZWxmLm1vZGUgPSBcInZpZXdcIjtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMua29TYXZlRWRpdGFibGVJdGVtID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5zYXZlRWRpdGFibGVJdGVtKCk7XG4gICAgfTtcbiAgICB0aGlzLmtvQWRkTmV3QWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5hZGROZXdBY3Rpb24oKTtcbiAgICB9O1xuICAgIHRoaXMua29SZW1vdmVBY3Rpb24gPSBmdW5jdGlvbiAoYWN0aW9uOiBTdXJ2ZXlMb2dpY0FjdGlvbikge1xuICAgICAgc2VsZi5yZW1vdmVBY3Rpb24oYWN0aW9uKTtcbiAgICB9O1xuICAgIHRoaXMua29FZGl0YWJsZUl0ZW0gPSBrby5vYnNlcnZhYmxlKG51bGwpO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gICAgdGhpcy5rb0FmdGVyUmVuZGVyID0gZnVuY3Rpb24gKCkge307XG4gIH1cblxuICBwcml2YXRlIF9wbGFjZWhvbGRlckh0bWwgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICBnZXQgcGxhY2Vob2xkZXJIdG1sKCkge1xuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlckh0bWwoKTtcbiAgfVxuICBzZXQgcGxhY2Vob2xkZXJIdG1sKHZhbHVlKSB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXJIdG1sKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jU3RyaW5nKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlQnlOYW1lKG5hbWU6IHN0cmluZyk6IFN1cnZleUxvZ2ljVHlwZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxvZ2ljVHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmxvZ2ljVHlwZXNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy5sb2dpY1R5cGVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgdXBkYXRlKFxuICAgIHN1cnZleTogU3VydmV5LlN1cnZleU1vZGVsID0gbnVsbCxcbiAgICBvcHRpb25zOiBJU3VydmV5T2JqZWN0RWRpdG9yT3B0aW9ucyA9IG51bGxcbiAgKSB7XG4gICAgaWYgKCEhc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleSA9IHN1cnZleTtcbiAgICB9XG4gICAgaWYgKCEhb3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgdGhpcy5rb0xvZ2ljVHlwZXModGhpcy5jcmVhdGVMb2dpY1R5cGVzKCkpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUl0ZW1zKCk7XG4gICAgdGhpcy5pbnZpc2libGVJdGVtcyA9IHRoaXMuYnVpbGRJdGVtcyhmYWxzZSk7XG4gICAgdGhpcy5rb1JlYWRPbmx5KHRoaXMucmVhZE9ubHkpO1xuICAgIHRoaXMubW9kZSA9IFwidmlld1wiO1xuICAgIHRoaXMuZXhwcmVzc2lvbkVkaXRvci5vYmplY3QgPSB0aGlzLnN1cnZleTtcbiAgICB0aGlzLmV4cHJlc3Npb25FZGl0b3Iub3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLmV4cHJlc3Npb25FZGl0b3Iuc2hvd0Rpc3BsYXlOYW1lID0gZmFsc2U7XG4gICAgdGhpcy5leHByZXNzaW9uRWRpdG9yLnNob3dIZWxwVGV4dCA9IGZhbHNlO1xuICAgIHRoaXMuZXhwcmVzc2lvbkVkaXRvci5iZWZvcmVTaG93KCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlSXRlbXMoKSB7XG4gICAgdGhpcy5rb0l0ZW1zKHRoaXMuYnVpbGRJdGVtcyh0cnVlKSk7XG4gICAgdGhpcy5rb0VkaXRhYmxlSXRlbShudWxsKTtcbiAgICB0aGlzLmtvRXJyb3JUZXh0KFwiXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5yZWFkT25seTtcbiAgfVxuICBwdWJsaWMgc2F2ZUVkaXRhYmxlSXRlbSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZWRpdGFibGVJdGVtIHx8IHRoaXMuaGFzRXJyb3IoKSkgcmV0dXJuIGZhbHNlO1xuICAgICEhdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zdGFydFVuZG9SZWRvVHJhbnNhY3Rpb24oKTtcbiAgICB0aGlzLmV4cHJlc3Npb25FZGl0b3IuYXBwbHkoKTtcbiAgICB0aGlzLmVkaXRhYmxlSXRlbS5hcHBseSh0aGlzLmV4cHJlc3Npb25FZGl0b3Iua29WYWx1ZSgpKTtcbiAgICB2YXIgaXNOZXcgPSB0aGlzLmtvSXRlbXMuaW5kZXhPZih0aGlzLmVkaXRhYmxlSXRlbSkgPCAwO1xuICAgIGlmIChpc05ldykge1xuICAgICAgdGhpcy5rb0l0ZW1zLnB1c2godGhpcy5lZGl0YWJsZUl0ZW0pO1xuICAgIH1cbiAgICB0aGlzLm9uSXRlbUNoYW5nZWQodGhpcy5lZGl0YWJsZUl0ZW0sIGlzTmV3ID8gXCJuZXdcIiA6IFwibW9kaWZ5XCIpO1xuICAgICEhdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zdG9wVW5kb1JlZG9UcmFuc2FjdGlvbigpO1xuICAgIHRoaXMub25Mb2dpY0l0ZW1TYXZlZC5maXJlKHRoaXMsIHsgaXRlbTogdGhpcy5lZGl0YWJsZUl0ZW0gfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXRlbUNoYW5nZWQoaXRlbTogU3VydmV5TG9naWNJdGVtLCBjaGFuZ2VUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoISF0aGlzLm9uQ2hhbmdlZENhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlZENhbGxiYWNrKGl0ZW0sIGNoYW5nZVR5cGUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IEFycmF5PFN1cnZleUxvZ2ljSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLmtvSXRlbXMoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvZ2ljVHlwZXMoKTogQXJyYXk8U3VydmV5TG9naWNUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMua29Mb2dpY1R5cGVzKCk7XG4gIH1cbiAgcHVibGljIGdldCBlZGl0YWJsZUl0ZW0oKTogU3VydmV5TG9naWNJdGVtIHtcbiAgICByZXR1cm4gdGhpcy5rb0VkaXRhYmxlSXRlbSgpO1xuICB9XG4gIHB1YmxpYyByZW5hbWVRdWVzdGlvbihvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZykge1xuICAgIHRoaXMucmVuYW1lUXVlc3Rpb25Db3JlKG9sZE5hbWUsIG5ld05hbWUsIHRoaXMuaXRlbXMpO1xuICAgIHRoaXMucmVuYW1lUXVlc3Rpb25Db3JlKG9sZE5hbWUsIG5ld05hbWUsIHRoaXMuaW52aXNpYmxlSXRlbXMpO1xuICB9XG4gIHB1YmxpYyByZW1vdmVRdWVzdGlvbihuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlbW92ZVF1ZXN0aW9uQ29yZShuYW1lLCB0aGlzLml0ZW1zKTtcbiAgICB0aGlzLnJlbW92ZVF1ZXN0aW9uQ29yZShuYW1lLCB0aGlzLmludmlzaWJsZUl0ZW1zKTtcbiAgfVxuICBwdWJsaWMgaGFzRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmVkaXRhYmxlSXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB0ZXh0ID0gXCJcIjtcbiAgICBpZiAoIXRoaXMuaXNFeHByZXNzaW9uVmFsaWQpIHtcbiAgICAgIHRleHQgPSBnZXRMb2dpY1N0cmluZyhcImV4cHJlc3Npb25JbnZhbGlkXCIpO1xuICAgIH1cbiAgICB2YXIgb3BzID0gdGhpcy5lZGl0YWJsZUl0ZW0uYWN0aW9ucztcbiAgICBpZiAoIXRleHQgJiYgb3BzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0ZXh0ID0gZ2V0TG9naWNTdHJpbmcoXCJub0FjdGlvbkVycm9yXCIpO1xuICAgIH1cbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChvcHNbaV0uaGFzRXJyb3IoKSkge1xuICAgICAgICAgIHRleHQgPSBnZXRMb2dpY1N0cmluZyhcImFjdGlvbkludmFsaWRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGV4cCA9IG5ldyBTdXJ2ZXkuRXhwcmVzc2lvblJ1bm5lcih0aGlzLmV4cHJlc3Npb25FZGl0b3Iua29WYWx1ZSgpKTtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGl0ZW06IHRoaXMuZWRpdGFibGVJdGVtLFxuICAgICAgZXJyb3I6IHRleHQsXG4gICAgICB1c2VkTmFtZXNJbkV4cHJlc3Npb246IGV4cC5nZXRWYXJpYWJsZXMoKSxcbiAgICB9O1xuICAgIHRoaXMub25Mb2dpY0l0ZW1WYWxpZGF0aW9uLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgdGV4dCA9IG9wdGlvbnMuZXJyb3I7XG5cbiAgICB0aGlzLmtvRXJyb3JUZXh0KHRleHQpO1xuICAgIHJldHVybiAhIXRleHQ7XG4gIH1cbiAgcHVibGljIGdldCBhZGROZXdBY3Rpb25UZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldExvZ2ljU3RyaW5nKFwiYWRkTmV3QWN0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRBY3Rpb25DYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldExvZ2ljU3RyaW5nKFwic2VsZWN0ZWRBY3Rpb25DYXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvblNldHVwVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRMb2dpY1N0cmluZyhcImV4cHJlc3Npb25TZXR1cFwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGFjdGlvbnNTZXR1cFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0TG9naWNTdHJpbmcoXCJhY3Rpb25zU2V0dXBcIik7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNFeHByZXNzaW9uVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbkVkaXRvci5pc0V4cHJlc3Npb25WYWxpZDtcbiAgfVxuICBwcml2YXRlIHJlbmFtZVF1ZXN0aW9uQ29yZShcbiAgICBvbGROYW1lOiBzdHJpbmcsXG4gICAgbmV3TmFtZTogc3RyaW5nLFxuICAgIGl0ZW1zOiBBcnJheTxTdXJ2ZXlMb2dpY0l0ZW0+XG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW1zW2ldLnJlbmFtZVF1ZXN0aW9uKG9sZE5hbWUsIG5ld05hbWUpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHJlbW92ZVF1ZXN0aW9uQ29yZShuYW1lOiBzdHJpbmcsIGl0ZW1zOiBBcnJheTxTdXJ2ZXlMb2dpY0l0ZW0+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbXNbaV0ucmVtb3ZlUXVlc3Rpb24obmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZXJlIGFyZSAzIG1vZGVzOiB2aWV3LCBuZXcsIGVkaXRcbiAgICovXG4gIHB1YmxpYyBnZXQgbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5rb01vZGUoKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsICE9PSBcInZpZXdcIiAmJiB2YWwgIT09IFwibmV3XCIgJiYgdmFsICE9PSBcImVkaXRcIikgcmV0dXJuO1xuICAgIGlmICh0aGlzLm1vZGUgPT0gdmFsKSByZXR1cm47XG4gICAgdmFyIG9sZE1vZGUgPSB0aGlzLm1vZGU7XG4gICAgaWYgKChvbGRNb2RlID09IFwibmV3XCIgfHwgb2xkTW9kZSA9PSBcImVkaXRcIikgJiYgdmFsID09IFwidmlld1wiKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVJdGVtcygpO1xuICAgIH1cbiAgICB0aGlzLmtvTW9kZSh2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgYWRkTmV3VGV4dCgpOiBzdHJpbmcge1xuICAgIHZhciBsZ0FkZE5ld0l0ZW0gPSB0aGlzLmdldExvY1N0cmluZyhcImVkLmxnLmFkZE5ld0l0ZW1cIik7XG4gICAgcmV0dXJuICEhbGdBZGROZXdJdGVtID8gbGdBZGROZXdJdGVtIDogdGhpcy5nZXRMb2NTdHJpbmcoXCJwZS5hZGROZXdcIik7XG4gIH1cbiAgcHVibGljIGFkZE5ldygpIHtcbiAgICAhIXRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc3RhcnRVbmRvUmVkb1RyYW5zYWN0aW9uKCk7XG4gICAgdmFyIGxvZ2ljSXRlbSA9IG5ldyBTdXJ2ZXlMb2dpY0l0ZW0odGhpcyk7XG4gICAgdGhpcy5rb0VkaXRhYmxlSXRlbShsb2dpY0l0ZW0pO1xuICAgIGxvZ2ljSXRlbS5hZGROZXdBY3Rpb24odGhpcy5jcmVhdGVOZXdBY3Rpb24obnVsbCwgbnVsbCkpO1xuICAgIHRoaXMuZXhwcmVzc2lvbkVkaXRvci5rb1ZhbHVlKFwiXCIpO1xuICAgIHRoaXMubW9kZSA9IFwibmV3XCI7XG4gICAgISF0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnN0b3BVbmRvUmVkb1RyYW5zYWN0aW9uKCk7XG4gIH1cbiAgcHVibGljIGVkaXRJdGVtKGl0ZW06IFN1cnZleUxvZ2ljSXRlbSkge1xuICAgICEhdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zdGFydFVuZG9SZWRvVHJhbnNhY3Rpb24oKTtcbiAgICB0aGlzLmtvRWRpdGFibGVJdGVtKGl0ZW0pO1xuICAgIHRoaXMuZXhwcmVzc2lvbkVkaXRvci5rb1ZhbHVlKGl0ZW0uZXhwcmVzc2lvbik7XG4gICAgdGhpcy5tb2RlID0gXCJlZGl0XCI7XG4gICAgISF0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnN0b3BVbmRvUmVkb1RyYW5zYWN0aW9uKCk7XG4gIH1cbiAgcHVibGljIHJlbW92ZUl0ZW0oaXRlbTogU3VydmV5TG9naWNJdGVtKSB7XG4gICAgdmFyIGV2ZW50T3B0aW9ucyA9IHsgaXRlbTogaXRlbSwgYWxsb3dSZW1vdmU6IHRydWUgfTtcbiAgICB0aGlzLm9uTG9naWNJdGVtUmVtb3ZpbmcuZmlyZSh0aGlzLCBldmVudE9wdGlvbnMpO1xuICAgIGlmICghZXZlbnRPcHRpb25zLmFsbG93UmVtb3ZlKSByZXR1cm47XG5cbiAgICAhIXRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc3RhcnRVbmRvUmVkb1RyYW5zYWN0aW9uKCk7XG4gICAgaXRlbS5hcHBseShcIlwiKTtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmtvSXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5rb0l0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIHRoaXMub25JdGVtQ2hhbmdlZChpdGVtLCBcImRlbGV0ZVwiKTtcbiAgICAhIXRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc3RvcFVuZG9SZWRvVHJhbnNhY3Rpb24oKTtcbiAgICB0aGlzLm9uTG9naWNJdGVtUmVtb3ZlZC5maXJlKHRoaXMsIHsgaXRlbTogaXRlbSB9KTtcbiAgfVxuICBwdWJsaWMgYWRkQWN0aW9uKFxuICAgIGx0OiBTdXJ2ZXlMb2dpY1R5cGUsXG4gICAgZWxlbWVudDogU3VydmV5LkJhc2UgPSBudWxsXG4gICk6IFN1cnZleUxvZ2ljQWN0aW9uIHtcbiAgICB2YXIgYWN0aW9uID0gdGhpcy5jcmVhdGVOZXdBY3Rpb24obHQsIGVsZW1lbnQpO1xuICAgIHRoaXMuZWRpdGFibGVJdGVtLmFkZE5ld0FjdGlvbihhY3Rpb24pO1xuICAgIGlmICghIWFjdGlvbi5sb2dpY1R5cGUpIHtcbiAgICAgIHRoaXMudXBkYXRlTG9naWNUeXBlc0luQWN0aW9ucygpO1xuICAgIH1cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG4gIHB1YmxpYyBhZGROZXdBY3Rpb24oKTogU3VydmV5TG9naWNBY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbihudWxsLCBudWxsKTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5ld0FjdGlvbihcbiAgICBsdDogU3VydmV5TG9naWNUeXBlLFxuICAgIGVsZW1lbnQ6IFN1cnZleS5CYXNlXG4gICk6IFN1cnZleUxvZ2ljQWN0aW9uIHtcbiAgICB2YXIgYWN0aW9uID0gbmV3IFN1cnZleUxvZ2ljQWN0aW9uKGx0LCBlbGVtZW50LCB0aGlzLnN1cnZleSk7XG4gICAgYWN0aW9uLmtvTG9naWNUeXBlcyh0aGlzLmNyZWF0ZUxvZ2ljVHlwZXNJbkFjdGlvbnMoYWN0aW9uKSk7XG4gICAgYWN0aW9uLm9uTG9naWNUeXBlQ2hhbmdlZCA9ICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlTG9naWNUeXBlc0luQWN0aW9ucygpO1xuICAgIH07XG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZUxvZ2ljVHlwZXNJbkFjdGlvbnMoYWN0aW9uOiBTdXJ2ZXlMb2dpY0FjdGlvbik6IEFycmF5PGFueT4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgbG9naWNUeXBlcyA9IHRoaXMubG9naWNUeXBlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZ2ljVHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsb2dpY1R5cGVzW2ldLnZpc2libGUpIHtcbiAgICAgICAgcmVzLnB1c2goe1xuICAgICAgICAgIGxvZ2ljVHlwZTogbG9naWNUeXBlc1tpXSxcbiAgICAgICAgICBrb1Zpc2libGU6IGtvLm9ic2VydmFibGUoXG4gICAgICAgICAgICB0aGlzLmlzTG9naWNUeXBlVmlzaWJsZUluQWN0aW9uKGxvZ2ljVHlwZXNbaV0sIGFjdGlvbilcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGlzTG9naWNUeXBlVmlzaWJsZUluQWN0aW9uKFxuICAgIGx0OiBTdXJ2ZXlMb2dpY1R5cGUsXG4gICAgYWN0aW9uOiBTdXJ2ZXlMb2dpY0FjdGlvblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWx0LmlzVW5pcXVlSXRlbSB8fCBsdCA9PSBhY3Rpb24ubG9naWNUeXBlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuZWRpdGFibGVJdGVtKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWRpdGFibGVJdGVtLmFjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjdXJBY3Rpb24gPSB0aGlzLmVkaXRhYmxlSXRlbS5hY3Rpb25zW2ldO1xuICAgICAgaWYgKGN1ckFjdGlvbiAhPSBhY3Rpb24gJiYgY3VyQWN0aW9uLmxvZ2ljVHlwZSA9PSBsdCkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUxvZ2ljVHlwZXNJbkFjdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLmVkaXRhYmxlSXRlbSkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lZGl0YWJsZUl0ZW0uYWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy51cGRhdGVMb2dpY1R5cGVzSW5BY3Rpb24odGhpcy5lZGl0YWJsZUl0ZW0uYWN0aW9uc1tpXSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgdXBkYXRlTG9naWNUeXBlc0luQWN0aW9uKGFjdGlvbjogU3VydmV5TG9naWNBY3Rpb24pIHtcbiAgICB2YXIgbG9naWNUeXBlcyA9IGFjdGlvbi5rb0xvZ2ljVHlwZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvZ2ljVHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsdCA9IGxvZ2ljVHlwZXNbaV07XG4gICAgICBsdC5rb1Zpc2libGUodGhpcy5pc0xvZ2ljVHlwZVZpc2libGVJbkFjdGlvbihsdC5sb2dpY1R5cGUsIGFjdGlvbikpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcmVtb3ZlQWN0aW9uKGFjdGlvbjogU3VydmV5TG9naWNBY3Rpb24pIHtcbiAgICBpZiAoIXRoaXMuZWRpdGFibGVJdGVtKSByZXR1cm47XG4gICAgdGhpcy5lZGl0YWJsZUl0ZW0ucmVtb3ZlQWN0aW9uKGFjdGlvbik7XG4gICAgaWYgKHRoaXMuZWRpdGFibGVJdGVtLmFjdGlvbnMubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMuYWRkTmV3QWN0aW9uKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRFeHByZXNzaW9uQXNEaXNwbGF5VGV4dChleHByZXNzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdXJ2ZXlMb2dpY1R5cGUuZXhwcmVzc2lvblRvRGlzcGxheVRleHQoXG4gICAgICB0aGlzLnN1cnZleSxcbiAgICAgIHRoaXMub3B0aW9ucyxcbiAgICAgIGV4cHJlc3Npb25cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBidWlsZEl0ZW1zKHNob3dJblVJOiBib29sZWFuKTogQXJyYXk8U3VydmV5TG9naWNJdGVtPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBoYXNoID0ge307XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5nZXRBbGxFbGVtZW50cygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYnVpbGRJdGVtc0J5RWxlbWVudChlbGVtZW50c1tpXSwgcmVzLCBoYXNoLCBzaG93SW5VSSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEFsbEVsZW1lbnRzKCk6IEFycmF5PFN1cnZleS5CYXNlPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHRoaXMuQWRkRWxlbWVudHModGhpcy5zdXJ2ZXkucGFnZXMsIHJlcyk7XG4gICAgdGhpcy5BZGRFbGVtZW50cyh0aGlzLnN1cnZleS5nZXRBbGxRdWVzdGlvbnMoKSwgcmVzKTtcbiAgICB0aGlzLkFkZEVsZW1lbnRzKHRoaXMuc3VydmV5LmdldEFsbFBhbmVscygpLCByZXMpO1xuICAgIHRoaXMuQWRkRWxlbWVudHModGhpcy5zdXJ2ZXkudHJpZ2dlcnMsIHJlcyk7XG4gICAgdGhpcy5BZGRFbGVtZW50cyh0aGlzLnN1cnZleS5jb21wbGV0ZWRIdG1sT25Db25kaXRpb24sIHJlcyk7XG4gICAgdGhpcy5BZGRFbGVtZW50cyh0aGlzLnN1cnZleS5jYWxjdWxhdGVkVmFsdWVzLCByZXMpO1xuICAgIHRoaXMuQWRkRWxlbWVudHModGhpcy5nZXRNYXRyaXhDb2x1bW5zKCksIHJlcyk7XG4gICAgdGhpcy5BZGRFbGVtZW50cyh0aGlzLmdldFZhbGlkYXRvcnMoKSwgcmVzKTtcbiAgICB0aGlzLkFkZEVsZW1lbnRzKHRoaXMuZ2V0SXRlbVZhbHVlcygpLCByZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRNYXRyaXhDb2x1bW5zKCk6IEFycmF5PFN1cnZleS5CYXNlPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnN1cnZleS5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICB2YXIgY29sdW1ucyA9IHFbXCJjb2x1bW5zXCJdO1xuICAgICAgaWYgKCFjb2x1bW5zKSBjb250aW51ZTtcbiAgICAgIHZhciBwcm9wID0gU3VydmV5LlNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KHEuZ2V0VHlwZSgpLCBcImNvbHVtbnNcIik7XG4gICAgICBpZiAoIXByb3AgfHwgcHJvcC5jbGFzc05hbWUgIT09IFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIikgY29udGludWU7XG4gICAgICB0aGlzLkFkZEVsZW1lbnRzKGNvbHVtbnMsIHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleS5CYXNlPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnN1cnZleS5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5BZGRFbGVtZW50cygoPFN1cnZleS5RdWVzdGlvbj5xdWVzdGlvbnNbaV0pLnZhbGlkYXRvcnMsIHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJdGVtVmFsdWVzKCk6IEFycmF5PFN1cnZleS5CYXNlPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnN1cnZleS5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICB2YXIgY2hvaWNlcyA9IHFbXCJjaG9pY2VzXCJdO1xuICAgICAgaWYgKCFjaG9pY2VzKSBjb250aW51ZTtcbiAgICAgIHZhciBwcm9wID0gU3VydmV5LlNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KHEuZ2V0VHlwZSgpLCBcImNob2ljZXNcIik7XG4gICAgICBpZiAoIXByb3AgfHwgcHJvcC50eXBlICE9PSBcIml0ZW12YWx1ZVtdXCIpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5BZGRFbGVtZW50cyhjaG9pY2VzLCByZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgQWRkRWxlbWVudHMoc3JjOiBBcnJheTxhbnk+LCBkZXN0OiBBcnJheTxhbnk+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlc3QucHVzaChzcmNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGJ1aWxkSXRlbXNCeUVsZW1lbnQoXG4gICAgZWxlbWVudDogU3VydmV5LkJhc2UsXG4gICAgZGVzdDogQXJyYXk8U3VydmV5TG9naWNJdGVtPixcbiAgICBoYXNoOiBTdXJ2ZXkuSGFzaFRhYmxlPFN1cnZleUxvZ2ljSXRlbT4sXG4gICAgc2hvd0luVUk6IGJvb2xlYW5cbiAgKSB7XG4gICAgdmFyIHR5cGVzID0gdGhpcy5nZXRFbGVtZW50QWxsVHlwZXMoZWxlbWVudCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxvZ2ljVHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBsdCA9IHRoaXMubG9naWNUeXBlc1tpXTtcbiAgICAgIGlmIChsdC5zaG93SW5VSSAhPT0gc2hvd0luVUkpIGNvbnRpbnVlO1xuICAgICAgdmFyIGV4cHJlc3Npb24gPSBlbGVtZW50W2x0LnByb3BlcnR5TmFtZV07XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVzLmluZGV4T2YobHQuYmFzZUNsYXNzKSA+IC0xICYmXG4gICAgICAgICFTdXJ2ZXkuSGVscGVycy5pc1ZhbHVlRW1wdHkoZXhwcmVzc2lvbilcbiAgICAgICkge1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5nZXRFeHByZXNzaW9uSGFzaEtleShleHByZXNzaW9uKTtcbiAgICAgICAgdmFyIGl0ZW0gPSBoYXNoW2tleV07XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgIGl0ZW0gPSBuZXcgU3VydmV5TG9naWNJdGVtKHRoaXMsIGV4cHJlc3Npb24pO1xuICAgICAgICAgIGhhc2hba2V5XSA9IGl0ZW07XG4gICAgICAgICAgZGVzdC5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhY3Rpb24gPSB0aGlzLmNyZWF0ZU5ld0FjdGlvbihsdCwgZWxlbWVudCk7XG4gICAgICAgIGl0ZW0uYWRkTmV3QWN0aW9uKGFjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0RXhwcmVzc2lvbkhhc2hLZXkoZXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZXhwcmVzc2lvbi5yZXBsYWNlKFwiIFwiLCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHByaXZhdGUgZ2V0RWxlbWVudEFsbFR5cGVzKGVsZW1lbnQ6IFN1cnZleS5CYXNlKSB7XG4gICAgdmFyIHR5cGVzID0gW107XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LmdldFR5cGUoKTtcbiAgICB0eXBlcy5wdXNoKHR5cGUpO1xuICAgIHdoaWxlICghIXR5cGUgJiYgdHlwZSAhPSBcImJhc2VcIikge1xuICAgICAgdmFyIGNsID0gU3VydmV5LlNlcmlhbGl6ZXIuZmluZENsYXNzKHR5cGUpO1xuICAgICAgaWYgKCFjbCkgYnJlYWs7XG4gICAgICB0eXBlID0gY2wucGFyZW50TmFtZTtcbiAgICAgIGlmICghIXR5cGUpIHtcbiAgICAgICAgdHlwZXMucHVzaCh0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHR5cGVzO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVMb2dpY1R5cGVzKCk6IEFycmF5PFN1cnZleUxvZ2ljVHlwZT4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgdmlzQWN0aW9ucyA9IFN1cnZleUxvZ2ljLnZpc2libGVBY3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgU3VydmV5TG9naWMudHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgdmlzQWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgIHZpc0FjdGlvbnMuaW5kZXhPZihTdXJ2ZXlMb2dpYy50eXBlc1tpXS5uYW1lKSA8IDBcbiAgICAgIClcbiAgICAgICAgY29udGludWU7XG4gICAgICByZXMucHVzaChcbiAgICAgICAgbmV3IFN1cnZleUxvZ2ljVHlwZShTdXJ2ZXlMb2dpYy50eXBlc1tpXSwgdGhpcy5zdXJ2ZXksIHRoaXMub3B0aW9ucylcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRFeHByZXNzaW9uUHJvcGVydHkoKTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgdmFyIHByb3BlcnR5ID0gU3VydmV5LlNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KFwic3VydmV5XCIsIFwiaGlkZGVuTG9naWNcIik7XG4gICAgaWYgKCEhcHJvcGVydHkpIHJldHVybiBwcm9wZXJ0eTtcbiAgICBTdXJ2ZXkuU2VyaWFsaXplci5hZGRQcm9wZXJ0eShcInN1cnZleVwiLCB7XG4gICAgICBuYW1lOiBcImhpZGRlbkxvZ2ljOmNvbmRpdGlvblwiLFxuICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICBpc1NlcmlhbGl6YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIFN1cnZleS5TZXJpYWxpemVyLmZpbmRQcm9wZXJ0eShcInN1cnZleVwiLCBcImhpZGRlbkxvZ2ljXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGlkZUV4cHJlc3Npb25IZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5leHByZXNzaW9uRWRpdG9yICYmIHRoaXMuZXhwcmVzc2lvbkVkaXRvci5rb1Nob3dFeHByZXNzaW9uSGVhZGVyKClcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgaGlkZUV4cHJlc3Npb25IZWFkZXIodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKCEhdGhpcy5leHByZXNzaW9uRWRpdG9yKSB7XG4gICAgICB0aGlzLmV4cHJlc3Npb25FZGl0b3Iua29TaG93RXhwcmVzc2lvbkhlYWRlcih2YWwpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNyZWF0ZUV4cHJlc3Npb25Qcm9wZXJ0eUVkaXRvcigpIHtcbiAgICB0aGlzLmV4cHJlc3Npb25FZGl0b3IgPSBuZXcgU3VydmV5UHJvcGVydHlDb25kaXRpb25FZGl0b3IoXG4gICAgICB0aGlzLmdldEV4cHJlc3Npb25Qcm9wZXJ0eSgpXG4gICAgKTtcbiAgICB0aGlzLmV4cHJlc3Npb25FZGl0b3IuaXNFZGl0b3JTaG93aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmV4cHJlc3Npb25FZGl0b3IuaXNXaWRlTW9kZSA9IHRydWU7XG4gICAgdGhpcy5leHByZXNzaW9uRWRpdG9yLm9iamVjdCA9IHRoaXMuc3VydmV5O1xuICAgIHRoaXMuZXhwcmVzc2lvbkVkaXRvci5vcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMuZXhwcmVzc2lvbkVkaXRvci5rb1NldHVwVGV4dCh0aGlzLmV4cHJlc3Npb25TZXR1cFRleHQpO1xuICB9XG4gIGRpc3Bvc2UoKSB7fVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3VydmV5LWxvZ2ljXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICB2YXIgY3JlYXRvcjogU3VydmV5Q3JlYXRvciA9IHBhcmFtcy5jcmVhdG9yO1xuICAgICAgLy8gdmFyIG1vZGVsID0gbmV3IFN1cnZleUxvZ2ljKGNyZWF0b3Iuc3VydmV5LCBjcmVhdG9yKTtcbiAgICAgIC8vIG1vZGVsLnVwZGF0ZShjcmVhdG9yLnN1cnZleSwgY3JlYXRvcik7XG4gICAgICB2YXIgbW9kZWwgPSBjcmVhdG9yLmxvZ2ljO1xuXG4gICAgICB2YXIgc3Vic2NyaWJlVmlld1R5cGUgPSBjcmVhdG9yLmtvVmlld1R5cGUuc3Vic2NyaWJlKCh2aWV3VHlwZSkgPT4ge1xuICAgICAgICBpZiAodmlld1R5cGUgPT09IFwibG9naWNcIikge1xuICAgICAgICAgIG1vZGVsLnVwZGF0ZShjcmVhdG9yLnN1cnZleSwgY3JlYXRvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc3VydmV5Q3JlYXRlZEhhbmRsZXIgPSAoY3JlYXRvciwgb3B0aW9ucykgPT4ge1xuICAgICAgICBtb2RlbC51cGRhdGUob3B0aW9ucy5zdXJ2ZXksIGNyZWF0b3IpO1xuICAgICAgfTtcbiAgICAgIGNyZWF0b3Iub25EZXNpZ25lclN1cnZleUNyZWF0ZWQuYWRkKHN1cnZleUNyZWF0ZWRIYW5kbGVyKTtcblxuICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhjb21wb25lbnRJbmZvLmVsZW1lbnQsICgpID0+IHtcbiAgICAgICAgc3Vic2NyaWJlVmlld1R5cGUuZGlzcG9zZSgpO1xuICAgICAgICBjcmVhdG9yLm9uRGVzaWduZXJTdXJ2ZXlDcmVhdGVkLnJlbW92ZShzdXJ2ZXlDcmVhdGVkSGFuZGxlcik7XG4gICAgICAgIC8vIG1vZGVsLmRpc3Bvc2UoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjwhLS0gPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lclxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fcm93XFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbFxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fcm93XFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbFxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj4gLS0+XFxuXFxuPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lclxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fcm93XFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Jc1J1bm5pbmcoKVxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19jZWxsXFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgICAgICAgIDxzdmQtdG9vbGJhciBwYXJhbXM9XFxcIml0ZW1zOiB0b29sYmFySXRlbXNcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Jc1J1bm5pbmcoKVxcXCI+PC9zdmQtdG9vbGJhcj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fcm93XFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbFxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19jZWxsLWNvbnRlbnQtaG9sZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbC1jb250ZW50IHN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX2NlbGwtY29udGVudC0tc2Nyb2xsYWJsZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8c3VydmV5LXNpbXVsYXRvciBwYXJhbXM9XFxcIm1vZGVsOiAkZGF0YVxcXCI+PC9zdXJ2ZXktc2ltdWxhdG9yPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDoga29Jc1J1bm5pbmcgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmRfdGVzdF9yZXN1bHRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVxcXCJidG4gc3YtYnRuIGJ0bi1wcmltYXJ5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBzZWxlY3RUZXN0Q2xpY2ssIHRleHQ6IHRlc3RTdXJ2ZXlBZ2FpblRleHRcXFwiPjwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8c3VydmV5LXJlc3VsdHMgcGFyYW1zPVxcXCJzdXJ2ZXk6IHN1cnZleVxcXCI+PC9zdXJ2ZXktcmVzdWx0cz5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiwgZ2V0TG9jU3RyaW5nIH0gZnJvbSBcIi4uL2VkaXRvckxvY2FsaXphdGlvblwiO1xuaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleUNyZWF0b3IgfSBmcm9tIFwiLi4vZWRpdG9yXCI7XG5cbmltcG9ydCBcIi4vdGVzdC5zY3NzXCI7XG5pbXBvcnQgeyBJQWN0aW9uIH0gZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuXG52YXIgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vdGVzdC5odG1sXCIpO1xuXG5leHBvcnQgeyBTdXJ2ZXlTaW11bGF0b3JDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9zaW11bGF0b3JcIjtcbmV4cG9ydCB7IFN1cnZleVJlc3VsdHNNb2RlbCB9IGZyb20gXCIuLi9jb21wb25lbnRzL3Jlc3VsdHNcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleUxpdmVUZXN0ZXIge1xuICBwcml2YXRlIGpzb246IGFueTtcbiAgcHJpdmF0ZSB1cGRhdGluZ0xhbmd1YWdlczogYm9vbGVhbjtcbiAga29Jc1J1bm5pbmcgPSBrby5vYnNlcnZhYmxlKHRydWUpO1xuICBzZWxlY3RUZXN0Q2xpY2s6IGFueTtcbiAgc2VsZWN0UGFnZUNsaWNrOiBhbnk7XG4gIHN1cnZleTogU3VydmV5LlN1cnZleTtcbiAga29TdXJ2ZXk6IGFueTtcbiAga29QYWdlcyA9IGtvLm9ic2VydmFibGVBcnJheShbXSk7XG4gIGtvQWN0aXZlUGFnZSA9IGtvLm9ic2VydmFibGUobnVsbCk7XG4gIHNldFBhZ2VEaXNhYmxlOiBhbnk7XG4gIGtvTGFuZ3VhZ2VzOiBhbnk7XG4gIGtvQWN0aXZlTGFuZ3VhZ2U6IGFueTtcbiAga29TaG93SW52aXNpYmxlRWxlbWVudHMgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgcHVibGljIG9uR2V0T2JqZWN0RGlzcGxheU5hbWU6IChvYmo6IFN1cnZleS5CYXNlKSA9PiBzdHJpbmcgPSBudWxsO1xuICBrb1Nob3dQYWdlc0luVGVzdFN1cnZleVRhYiA9IGtvLm9ic2VydmFibGUodHJ1ZSk7XG4gIHNob3dTaW11bGF0b3IgPSBrby5vYnNlcnZhYmxlKHRydWUpO1xuICBrb1Nob3dEZWZhdWx0TGFuZ3VhZ2VJblRlc3RTdXJ2ZXlUYWIgPSBrby5vYnNlcnZhYmxlKHRydWUpO1xuICBrb1Nob3dJbnZpc2libGVFbGVtZW50c0luVGVzdFN1cnZleVRhYiA9IGtvLm9ic2VydmFibGUodHJ1ZSk7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHRvb2xiYXIgaXRlbXMuIFlvdSBtYXkgYWRkL3JlbW92ZS9yZXBsYWNlIHRoZW0uXG4gICAqIEBzZWUgSUFjdGlvblxuICAgKi9cbiAgcHVibGljIHRvb2xiYXJJdGVtcyA9IGtvLm9ic2VydmFibGVBcnJheTxJQWN0aW9uPigpO1xuXG4gIG9uU3VydmV5Q3JlYXRlZENhbGxiYWNrOiAoc3VydmV5OiBTdXJ2ZXkuU3VydmV5KSA9PiBhbnk7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3VydmV5UHJvdmlkZXI6IGFueSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnN1cnZleSA9IHRoaXMuc3VydmV5UHJvdmlkZXIuY3JlYXRlU3VydmV5KHt9LCBcInRlc3RcIik7XG4gICAgdGhpcy5zZWxlY3RUZXN0Q2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLnRlc3RBZ2FpbigpO1xuICAgIH07XG4gICAgdGhpcy5zZWxlY3RQYWdlQ2xpY2sgPSBmdW5jdGlvbiAocGFnZUl0ZW0pIHtcbiAgICAgIGlmIChzZWxmLnN1cnZleSkge1xuICAgICAgICBpZiAoc2VsZi5zdXJ2ZXkuc3RhdGUgPT0gXCJzdGFydGluZ1wiKSB7XG4gICAgICAgICAgc2VsZi5zdXJ2ZXkuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLnN1cnZleS5jdXJyZW50UGFnZSA9IHBhZ2VJdGVtLnBhZ2U7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmtvQWN0aXZlUGFnZS5zdWJzY3JpYmUoZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICBpZiAoISFuZXdWYWx1ZSkge1xuICAgICAgICBzZWxmLnN1cnZleS5jdXJyZW50UGFnZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMua29TaG93SW52aXNpYmxlRWxlbWVudHMuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgc2VsZi5zdXJ2ZXkuc2hvd0ludmlzaWJsZUVsZW1lbnRzID0gbmV3VmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRQYWdlRGlzYWJsZSA9IGZ1bmN0aW9uIChvcHRpb24sIGl0ZW0pIHtcbiAgICAgIGtvLmFwcGx5QmluZGluZ3NUb05vZGUob3B0aW9uLCB7IGRpc2FibGU6IGl0ZW0ua29EaXNhYmxlZCB9LCBpdGVtKTtcbiAgICB9O1xuICAgIHRoaXMua29MYW5ndWFnZXMgPSBrby5vYnNlcnZhYmxlKHRoaXMuZ2V0TGFuZ3VhZ2VzKCkpO1xuICAgIHRoaXMua29BY3RpdmVMYW5ndWFnZSA9IGtvLm9ic2VydmFibGUoXCJcIik7XG4gICAgdGhpcy5rb0FjdGl2ZUxhbmd1YWdlLnN1YnNjcmliZShmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgIGlmIChzZWxmLnVwZGF0aW5nTGFuZ3VhZ2VzIHx8IHNlbGYuc3VydmV5LmxvY2FsZSA9PSBuZXdWYWx1ZSkgcmV0dXJuO1xuICAgICAgc2VsZi5zdXJ2ZXkubG9jYWxlID0gbmV3VmFsdWU7XG4gICAgICBzZWxmLmtvU3VydmV5KHNlbGYuc3VydmV5KTtcbiAgICB9KTtcbiAgICB0aGlzLmtvU3VydmV5ID0ga28ub2JzZXJ2YWJsZSh0aGlzLnN1cnZleSk7XG5cbiAgICB0aGlzLnRvb2xiYXJJdGVtcy5wdXNoKDxhbnk+e1xuICAgICAgaWQ6IFwic3ZkLXRlc3QtcGFnZS1zZWxlY3RvclwiLFxuICAgICAgdGl0bGU6IGdldExvY1N0cmluZyhcInRzLnNlbGVjdFBhZ2VcIiksXG4gICAgICB2aXNpYmxlOiBrby5jb21wdXRlZChcbiAgICAgICAgKCkgPT4gdGhpcy5rb1BhZ2VzKCkubGVuZ3RoID4gMSAmJiB0aGlzLmtvU2hvd1BhZ2VzSW5UZXN0U3VydmV5VGFiKClcbiAgICAgICksXG4gICAgICB0b29sdGlwOiBnZXRMb2NTdHJpbmcoXCJ0cy5zZWxlY3RQYWdlXCIpLFxuICAgICAgY29tcG9uZW50OiBcInN2ZC1kcm9wZG93blwiLFxuICAgICAgYWN0aW9uOiBrby5jb21wdXRlZCh7XG4gICAgICAgIHJlYWQ6ICgpID0+IHRoaXMua29BY3RpdmVQYWdlKCksXG4gICAgICAgIHdyaXRlOiAodmFsOiBhbnkpID0+IHRoaXMua29BY3RpdmVQYWdlKHZhbCksXG4gICAgICB9KSxcbiAgICAgIGFmdGVyUmVuZGVyOiB0aGlzLnNldFBhZ2VEaXNhYmxlLFxuICAgICAgaXRlbXM6IDxhbnk+a28uY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5rb1BhZ2VzKCkubWFwKChwYWdlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgdGV4dDogcGFnZS50aXRsZSwgdmFsdWU6IHBhZ2UucGFnZSB9O1xuICAgICAgICB9KVxuICAgICAgKSxcbiAgICB9KTtcbiAgICB0aGlzLnRvb2xiYXJJdGVtcy5wdXNoKHtcbiAgICAgIGlkOiBcInN2ZC10ZXN0LWxvY2FsZS1zZWxlY3RvclwiLFxuICAgICAgdGl0bGU6IHRoaXMubG9jYWxlVGV4dCxcbiAgICAgIHZpc2libGU6IDxhbnk+dGhpcy5rb1Nob3dEZWZhdWx0TGFuZ3VhZ2VJblRlc3RTdXJ2ZXlUYWIsXG4gICAgICB0b29sdGlwOiB0aGlzLmxvY2FsZVRleHQsXG4gICAgICBjb21wb25lbnQ6IFwic3ZkLWRyb3Bkb3duXCIsXG4gICAgICBhY3Rpb246IGtvLmNvbXB1dGVkKHtcbiAgICAgICAgcmVhZDogKCkgPT4gdGhpcy5rb0FjdGl2ZUxhbmd1YWdlKCksXG4gICAgICAgIHdyaXRlOiAodmFsOiBhbnkpID0+IHRoaXMua29BY3RpdmVMYW5ndWFnZSh2YWwpLFxuICAgICAgfSksXG4gICAgICBpdGVtczogPGFueT50aGlzLmtvTGFuZ3VhZ2VzLFxuICAgIH0pO1xuICAgIHRoaXMudG9vbGJhckl0ZW1zLnB1c2goe1xuICAgICAgaWQ6IFwic3ZkLXRlc3Qtc2hvdy1pbnZpc2libGVcIixcbiAgICAgIHRpdGxlOiBnZXRMb2NTdHJpbmcoXCJ0cy5zaG93SW52aXNpYmxlRWxlbWVudHNcIiksXG4gICAgICB2aXNpYmxlOiA8YW55PnRoaXMua29TaG93SW52aXNpYmxlRWxlbWVudHNJblRlc3RTdXJ2ZXlUYWIsXG4gICAgICB0b29sdGlwOiBnZXRMb2NTdHJpbmcoXCJ0cy5zaG93SW52aXNpYmxlRWxlbWVudHNcIiksXG4gICAgICBjb21wb25lbnQ6IFwic3ZkLWJvb2xlYW5cIixcbiAgICAgIGFjdGlvbjoga28uY29tcHV0ZWQoe1xuICAgICAgICByZWFkOiAoKSA9PiB0aGlzLmtvU2hvd0ludmlzaWJsZUVsZW1lbnRzKCksXG4gICAgICAgIHdyaXRlOiAodmFsOiBhbnkpID0+IHRoaXMua29TaG93SW52aXNpYmxlRWxlbWVudHModmFsKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEpTT04oanNvbjogYW55KSB7XG4gICAgdGhpcy5qc29uID0ganNvbjtcbiAgICBpZiAoanNvbiAhPSBudWxsKSB7XG4gICAgICBpZiAoanNvbi5jb29raWVOYW1lKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uLmNvb2tpZU5hbWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3VydmV5ID0ganNvblxuICAgICAgPyB0aGlzLnN1cnZleVByb3ZpZGVyLmNyZWF0ZVN1cnZleShqc29uLCBcInRlc3RcIilcbiAgICAgIDogdGhpcy5zdXJ2ZXlQcm92aWRlci5jcmVhdGVTdXJ2ZXkoe30sIFwidGVzdFwiKTtcbiAgICBpZiAodGhpcy5vblN1cnZleUNyZWF0ZWRDYWxsYmFjaykgdGhpcy5vblN1cnZleUNyZWF0ZWRDYWxsYmFjayh0aGlzLnN1cnZleSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuc3VydmV5Lm9uQ29tcGxldGUuYWRkKChzZW5kZXI6IFN1cnZleS5TdXJ2ZXkpID0+IHtcbiAgICAgIHNlbGYua29Jc1J1bm5pbmcoZmFsc2UpO1xuICAgIH0pO1xuICAgIGlmICghIXRoaXMuc3VydmV5W1wib25OYXZpZ2F0ZVRvVXJsXCJdKSB7XG4gICAgICB0aGlzLnN1cnZleVtcIm9uTmF2aWdhdGVUb1VybFwiXS5hZGQoZnVuY3Rpb24gKHNlbmRlciwgb3B0aW9ucykge1xuICAgICAgICB2YXIgdXJsID0gb3B0aW9ucy51cmw7XG4gICAgICAgIG9wdGlvbnMudXJsID0gXCJcIjtcbiAgICAgICAgaWYgKCEhdXJsKSB7XG4gICAgICAgICAgdmFyIG1lc3NhZ2UgPVxuICAgICAgICAgICAgc2VsZi5nZXRMb2NTdHJpbmcoXCJlZC5uYXZpZ2F0ZVRvTXNnXCIpICsgXCIgJ1wiICsgdXJsICsgXCInLlwiO1xuICAgICAgICAgIGlmICghIXRoaXMuc3VydmV5UHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3VydmV5UHJvdmlkZXIubm90aWZ5KG1lc3NhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGVydChtZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN1cnZleS5vblN0YXJ0ZWQuYWRkKChzZW5kZXI6IFN1cnZleS5TdXJ2ZXkpID0+IHtcbiAgICAgIHNlbGYuc2V0QWN0aXZlUGFnZUl0ZW0oPFN1cnZleS5QYWdlPnNlbGYuc3VydmV5LmN1cnJlbnRQYWdlLCB0cnVlKTtcbiAgICB9KTtcbiAgICB0aGlzLnN1cnZleS5vbkN1cnJlbnRQYWdlQ2hhbmdlZC5hZGQoKHNlbmRlcjogU3VydmV5LlN1cnZleSwgb3B0aW9ucykgPT4ge1xuICAgICAgc2VsZi5rb0FjdGl2ZVBhZ2Uob3B0aW9ucy5uZXdDdXJyZW50UGFnZSk7XG4gICAgICBzZWxmLnNldEFjdGl2ZVBhZ2VJdGVtKG9wdGlvbnMub2xkQ3VycmVudFBhZ2UsIGZhbHNlKTtcbiAgICAgIHNlbGYuc2V0QWN0aXZlUGFnZUl0ZW0ob3B0aW9ucy5uZXdDdXJyZW50UGFnZSwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5zdXJ2ZXkub25QYWdlVmlzaWJsZUNoYW5nZWQuYWRkKChzZW5kZXI6IFN1cnZleS5TdXJ2ZXksIG9wdGlvbnMpID0+IHtcbiAgICAgIHNlbGYudXBkYXRlUGFnZUl0ZW0ob3B0aW9ucy5wYWdlKTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVBhZ2VJdGVtKHBhZ2U6IFN1cnZleS5QYWdlKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmdldFBhZ2VJdGVtQnlQYWdlKHBhZ2UpO1xuICAgIGlmIChpdGVtKSB7XG4gICAgICBpdGVtLmtvVmlzaWJsZShwYWdlLmlzVmlzaWJsZSk7XG4gICAgICBpdGVtLmtvRGlzYWJsZWQoIXBhZ2UuaXNWaXNpYmxlKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNob3cob3B0aW9uczogYW55ID0gbnVsbCkge1xuICAgIHZhciBwYWdlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdXJ2ZXkucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5zdXJ2ZXkucGFnZXNbaV07XG4gICAgICBwYWdlcy5wdXNoKHtcbiAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgdGl0bGU6IHRoaXMub25HZXRPYmplY3REaXNwbGF5TmFtZVxuICAgICAgICAgID8gdGhpcy5vbkdldE9iamVjdERpc3BsYXlOYW1lKHBhZ2UpXG4gICAgICAgICAgOiBwYWdlLm5hbWUsXG4gICAgICAgIGtvVmlzaWJsZToga28ub2JzZXJ2YWJsZShwYWdlLmlzVmlzaWJsZSksXG4gICAgICAgIGtvRGlzYWJsZWQ6IGtvLm9ic2VydmFibGUoIXBhZ2UuaXNWaXNpYmxlKSxcbiAgICAgICAga29BY3RpdmU6IGtvLm9ic2VydmFibGUoXG4gICAgICAgICAgdGhpcy5zdXJ2ZXkuc3RhdGUgPT0gXCJydW5uaW5nXCIgJiYgcGFnZSA9PT0gdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2VcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoISFvcHRpb25zICYmIG9wdGlvbnMuc2hvd1NpbXVsYXRvckluVGVzdFN1cnZleVRhYiAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2hvd1NpbXVsYXRvcihvcHRpb25zLnNob3dTaW11bGF0b3JJblRlc3RTdXJ2ZXlUYWIpO1xuICAgIH1cbiAgICBpZiAoISFvcHRpb25zICYmIG9wdGlvbnMuc2hvd1BhZ2VzSW5UZXN0U3VydmV5VGFiICE9IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5rb1Nob3dQYWdlc0luVGVzdFN1cnZleVRhYihvcHRpb25zLnNob3dQYWdlc0luVGVzdFN1cnZleVRhYik7XG4gICAgfVxuICAgIGlmICghIW9wdGlvbnMgJiYgb3B0aW9ucy5zaG93RGVmYXVsdExhbmd1YWdlSW5UZXN0U3VydmV5VGFiICE9IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXREZWZhdWx0TGFuZ3VhZ2VPcHRpb24ob3B0aW9ucy5zaG93RGVmYXVsdExhbmd1YWdlSW5UZXN0U3VydmV5VGFiKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgISFvcHRpb25zICYmXG4gICAgICBvcHRpb25zLnNob3dJbnZpc2libGVFbGVtZW50c0luVGVzdFN1cnZleVRhYiAhPSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMua29TaG93SW52aXNpYmxlRWxlbWVudHNJblRlc3RTdXJ2ZXlUYWIoXG4gICAgICAgIG9wdGlvbnMuc2hvd0ludmlzaWJsZUVsZW1lbnRzSW5UZXN0U3VydmV5VGFiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmtvU2hvd0ludmlzaWJsZUVsZW1lbnRzKGZhbHNlKTtcbiAgICB0aGlzLmtvUGFnZXMocGFnZXMpO1xuICAgIHRoaXMua29TdXJ2ZXkodGhpcy5zdXJ2ZXkpO1xuICAgIHRoaXMua29BY3RpdmVQYWdlKHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlKTtcbiAgICB0aGlzLmtvQWN0aXZlTGFuZ3VhZ2UoXG4gICAgICB0aGlzLnN1cnZleS5sb2NhbGUgfHwgU3VydmV5LnN1cnZleUxvY2FsaXphdGlvbi5kZWZhdWx0TG9jYWxlXG4gICAgKTtcbiAgICB0aGlzLmtvSXNSdW5uaW5nKHRydWUpO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NTdHJpbmcobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcobmFtZSk7XG4gIH1cbiAgcHVibGljIGdldCB0ZXN0U3VydmV5QWdhaW5UZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcImVkLnRlc3RTdXJ2ZXlBZ2FpblwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY2FsZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicGUubG9jYWxlXCIpO1xuICB9XG4gIHByaXZhdGUgdGVzdEFnYWluKCkge1xuICAgIHRoaXMuc2V0SlNPTih0aGlzLmpzb24pO1xuICAgIHRoaXMuc2hvdygpO1xuICB9XG4gIHByaXZhdGUgc2V0RGVmYXVsdExhbmd1YWdlT3B0aW9uKG9wdDogYm9vbGVhbiB8IHN0cmluZykge1xuICAgIHZhciB2aXMgPVxuICAgICAgb3B0ID09PSB0cnVlIHx8XG4gICAgICBvcHQgPT09IFwiYWxsXCIgfHxcbiAgICAgIChvcHQgPT09IFwiYXV0b1wiICYmIHRoaXMuc3VydmV5LmdldFVzZWRMb2NhbGVzKCkubGVuZ3RoID4gMSk7XG4gICAgdGhpcy5rb1Nob3dEZWZhdWx0TGFuZ3VhZ2VJblRlc3RTdXJ2ZXlUYWIodmlzKTtcbiAgICBpZiAodmlzKSB7XG4gICAgICB0aGlzLnVwZGF0aW5nTGFuZ3VhZ2VzID0gdHJ1ZTtcbiAgICAgIHRoaXMua29MYW5ndWFnZXMoXG4gICAgICAgIHRoaXMuZ2V0TGFuZ3VhZ2VzKG9wdCAhPT0gXCJhbGxcIiA/IHRoaXMuc3VydmV5LmdldFVzZWRMb2NhbGVzKCkgOiBudWxsKVxuICAgICAgKTtcbiAgICAgIHRoaXMudXBkYXRpbmdMYW5ndWFnZXMgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZXRBY3RpdmVQYWdlSXRlbShwYWdlOiBTdXJ2ZXkuUGFnZSwgdmFsOiBib29sZWFuKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmdldFBhZ2VJdGVtQnlQYWdlKHBhZ2UpO1xuICAgIGlmIChpdGVtKSB7XG4gICAgICBpdGVtLmtvQWN0aXZlKHZhbCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0UGFnZUl0ZW1CeVBhZ2UocGFnZTogU3VydmV5LlBhZ2UpOiBhbnkge1xuICAgIHZhciBpdGVtcyA9IHRoaXMua29QYWdlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpdGVtc1tpXS5wYWdlID09PSBwYWdlKSByZXR1cm4gaXRlbXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByaXZhdGUgZ2V0TGFuZ3VhZ2VzKHVzZWRMYW5ndWFnZXM6IEFycmF5PHN0cmluZz4gPSBudWxsKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBsb2NhbGVzID1cbiAgICAgICEhdXNlZExhbmd1YWdlcyAmJiB1c2VkTGFuZ3VhZ2VzLmxlbmd0aCA+IDFcbiAgICAgICAgPyB1c2VkTGFuZ3VhZ2VzXG4gICAgICAgIDogU3VydmV5LnN1cnZleUxvY2FsaXphdGlvbi5nZXRMb2NhbGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NhbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbG9jID0gbG9jYWxlc1tpXTtcbiAgICAgIHJlcy5wdXNoKHsgdmFsdWU6IGxvYywgdGV4dDogZWRpdG9yTG9jYWxpemF0aW9uLmdldExvY2FsZU5hbWUobG9jKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMga29FdmVudEFmdGVyUmVuZGVyKGVsZW1lbnQ6IGFueSwgc3VydmV5OiBhbnkpIHtcbiAgICBzdXJ2ZXlbXCJhZnRlclJlbmRlclN1cnZleVwiXShlbGVtZW50KTtcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7fVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3VydmV5LXRlc3RlclwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgdmFyIGNyZWF0b3I6IFN1cnZleUNyZWF0b3IgPSBwYXJhbXMuY3JlYXRvcjtcbiAgICAgIHZhciBtb2RlbCA9IGNyZWF0b3Iuc3VydmV5TGl2ZVRlc3RlciB8fCBuZXcgU3VydmV5TGl2ZVRlc3RlcihjcmVhdG9yKTtcblxuICAgICAgbW9kZWwub25TdXJ2ZXlDcmVhdGVkQ2FsbGJhY2sgPSAoc3VydmV5KSA9PiB7XG4gICAgICAgIGNyZWF0b3Iub25UZXN0U3VydmV5Q3JlYXRlZCAmJlxuICAgICAgICAgIGNyZWF0b3Iub25UZXN0U3VydmV5Q3JlYXRlZC5maXJlKHNlbGYsIHsgc3VydmV5OiBzdXJ2ZXkgfSk7XG4gICAgICB9O1xuICAgICAgbW9kZWwub25HZXRPYmplY3REaXNwbGF5TmFtZSA9IChvYmopID0+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0b3IuZ2V0T2JqZWN0RGlzcGxheU5hbWUob2JqLCBcInN1cnZleS10ZXN0ZXJcIik7XG4gICAgICB9O1xuXG4gICAgICAvLyBUZXN0IHRhYiB1cGRhdGVyIGltcGxpY2l0bHkgZGVwZW5kaW5nIG9uIG9ic2VydmFibGUgc3VydmV5IGFuZCB2aWV3IHR5cGVcbiAgICAgIHZhciB1cGRhdGVUZXN0VGFiID0gKGpzb246IGFueSkgPT4ge1xuICAgICAgICBpZiAoY3JlYXRvci5rb1ZpZXdUeXBlKCkgIT09IFwidGVzdFwiKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgIHNob3dQYWdlc0luVGVzdFN1cnZleVRhYjogY3JlYXRvci5zaG93UGFnZXNJblRlc3RTdXJ2ZXlUYWIsXG4gICAgICAgICAgc2hvd0RlZmF1bHRMYW5ndWFnZUluVGVzdFN1cnZleVRhYjpcbiAgICAgICAgICAgIGNyZWF0b3Iuc2hvd0RlZmF1bHRMYW5ndWFnZUluVGVzdFN1cnZleVRhYixcbiAgICAgICAgICBzaG93SW52aXNpYmxlRWxlbWVudHNJblRlc3RTdXJ2ZXlUYWI6XG4gICAgICAgICAgICBjcmVhdG9yLnNob3dJbnZpc2libGVFbGVtZW50c0luVGVzdFN1cnZleVRhYixcbiAgICAgICAgICBzaG93U2ltdWxhdG9ySW5UZXN0U3VydmV5VGFiOiBjcmVhdG9yLnNob3dTaW11bGF0b3JJblRlc3RTdXJ2ZXlUYWIsXG4gICAgICAgIH07XG4gICAgICAgIG1vZGVsLnNldEpTT04oanNvbik7XG4gICAgICAgIG1vZGVsLnNob3cob3B0aW9ucyk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgc3Vic2NyID0gY3JlYXRvci5rb1ZpZXdUeXBlLnN1YnNjcmliZSgodmlld1R5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodmlld1R5cGUgPT09IFwidGVzdFwiKSB7XG4gICAgICAgICAgdXBkYXRlVGVzdFRhYihjcmVhdG9yLkpTT04pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdmFyIGhhbmRsZXIgPSAoc2VuZGVyLCBvcHRpb25zKSA9PiB1cGRhdGVUZXN0VGFiKG9wdGlvbnMuc3VydmV5LnRvSlNPTigpKTtcbiAgICAgIGNyZWF0b3Iub25EZXNpZ25lclN1cnZleUNyZWF0ZWQuYWRkKGhhbmRsZXIpO1xuXG4gICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGNvbXBvbmVudEluZm8uZWxlbWVudCwgKCkgPT4ge1xuICAgICAgICBjcmVhdG9yLm9uRGVzaWduZXJTdXJ2ZXlDcmVhdGVkLnJlbW92ZShoYW5kbGVyKTtcbiAgICAgICAgc3Vic2NyLmRpc3Bvc2UoKTtcbiAgICAgICAgbW9kZWwuZGlzcG9zZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdmQtdHJhbnNsYXRpb24taXRlbVxcXCI+XFxuICA8dGV4dGFyZWFcXG4gICAgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgc3R5bGU9XFxcIndpZHRoOiAxMDAlO1xcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAkZGF0YS5rb1Zpc2libGUsIGRpc2FibGU6IGl0ZW0ua29SZWFkT25seSwgdmFsdWU6aXRlbS5rb1ZhbHVlKCRkYXRhLmxvY2FsZSksIGF0dHI6IHtwbGFjZWhvbGRlcjogISRkYXRhLmxvY2FsZT8gaXRlbS5kZWZhdWx0VmFsdWUgOiAnJ31cXFwiXFxuICA+PC90ZXh0YXJlYT5cXG48L3NjcmlwdD5cXG48ZGl2XFxuICBjbGFzcz1cXFwic3ZkLWxpZ2h0LWJvcmRlci1jb2xvciBzdmQtbGlnaHQtYmctY29sb3JcXFwiXFxuICBkYXRhLWJpbmQ9XFxcImNzczp7J3N2ZC10cmFuc2xhdGlvbi1zdHJpbmdzJzogJGRhdGEua29TaG93SGVhZGVyKCl9XFxcIlxcbj5cXG4gIDx0YWJsZSBjbGFzcz1cXFwic3ZkX2l0ZW1zX3RhYmxlXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICRkYXRhLmxvY0l0ZW1zLmxlbmd0aCA+IDBcXFwiPlxcbiAgICA8dGhlYWQ+XFxuICAgICAgPHRyPlxcbiAgICAgICAgPHRoPjwvdGg+XFxuICAgICAgICA8IS0tIGtvIGZvcmVhY2g6ICRkYXRhLmtvTG9jYWxlcyAtLT5cXG4gICAgICAgIDx0aFxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICRkYXRhLmtvVmlzaWJsZSwgdGV4dDogJHBhcmVudC5nZXRMb2NhbGVOYW1lKCRkYXRhLmxvY2FsZSksIHN0eWxlOiB7d2lkdGg6ICRwYXJlbnQubG9jV2lkdGh9XFxcIlxcbiAgICAgICAgPjwvdGg+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8L3RyPlxcbiAgICA8L3RoZWFkPlxcbiAgICA8dGJvZHkgZGF0YS1iaW5kPVxcXCJmb3JlYWNoOiB7ZGF0YTogJGRhdGEubG9jSXRlbXMsIGFzOiAnaXRlbScgfVxcXCI+XFxuICAgICAgPHRyPlxcbiAgICAgICAgPHRkIHN0eWxlPVxcXCJtYXgtd2lkdGg6IDIwMHB4OyBtaW4td2lkdGg6IDEwMHB4XFxcIj5cXG4gICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0Oml0ZW0udGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgPC90ZD5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogJHBhcmVudC5rb0xvY2FsZXMgLS0+XFxuICAgICAgICA8dGRcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAkZGF0YS5rb1Zpc2libGUsIHN0eWxlOiB7d2lkdGg6ICRkYXRhLmtvVmlzaWJsZSA/ICRwYXJlbnQubG9jV2lkdGggOiAnMHB4J30gXFxcIlxcbiAgICAgICAgPlxcbiAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdmQtdHJhbnNsYXRpb24taXRlbScsIGRhdGE6ICRkYXRhLCBhZnRlclJlbmRlcjogJHBhcmVudC5hZnRlclJlbmRlcn0gLS0+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC90ZD5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwvdHI+XFxuICAgIDwvdGJvZHk+XFxuICA8L3RhYmxlPlxcblxcbiAgPGRpdlxcbiAgICByb2xlID0gXFxcInRhYmxpc3RcXFwiXFxuICAgIGNsYXNzPVxcXCJzdmQtdHJhbnNsYXRpb24tcGFuZWwtc3RyaW5nc1xcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJmb3JlYWNoOiB7ZGF0YTogJGRhdGEuZ3JvdXBzLCBhczogJ2dyb3VwJyB9XFxcIlxcbiAgPlxcbiAgICA8ZGl2XFxuICAgICAgY2xhc3M9XFxcInN2ZC10b29sYm94LWNhdGVnb3J5LWhlYWRlclxcXCJcXG4gICAgICByb2xlPVxcXCJ0YWJcXFwiIHRhYmluZGV4PVxcXCIwXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29TaG93SGVhZGVyLCBjbGljazogZnVuY3Rpb24oKXsgZ3JvdXAua29FeHBhbmRlZCghZ3JvdXAua29FeHBhbmRlZCgpKX0sIGtleTJjbGlja1xcXCJcXG4gICAgPlxcbiAgICAgIDxzcGFuXFxuICAgICAgICBjbGFzcz1cXFwic3ZkLXRyYW5zbGF0aW9uLXBhbmVsLXN0cmluZ3MtdGl0bGVcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogeyAnc3ZkLW1haW4tY29sb3InOiBncm91cC5rb0V4cGFuZGVkKCkgfSwgdGV4dDogZ3JvdXAudGV4dFxcXCJcXG4gICAgICA+PC9zcGFuPlxcbiAgICAgIDwhLS0ga28gaWZub3Q6IGtvRXhwYW5kZWQgLS0+XFxuICAgICAgPHN2Zy1pY29uXFxuICAgICAgICBjbGFzcz1cXFwiaWNvbi10b29sYm94LWFycm93XFxcIlxcbiAgICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24tYXJyb3dfZG93bl8xMHgxMCcsIHNpemU6IDEwXFxcIlxcbiAgICAgID48L3N2Zy1pY29uPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0ga28gaWY6IGtvRXhwYW5kZWQgLS0+XFxuICAgICAgPHN2Zy1pY29uXFxuICAgICAgICBjbGFzcz1cXFwiaWNvbi10b29sYm94LWFycm93IHN2ZC1wcmltYXJ5LWljb25cXFwiXFxuICAgICAgICBwYXJhbXM9XFxcImljb25OYW1lOiAnaWNvbi1hcnJvd191cF8xMHgxMCcsIHNpemU6IDEwXFxcIlxcbiAgICAgID5cXG4gICAgICA8L3N2Zy1pY29uPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvRXhwYW5kZWRcXFwiPlxcbiAgICAgIDxzdmQtdHJhbnNsYXRpb24tZ3JvdXAgcGFyYW1zPVxcXCJtb2RlbDogZ3JvdXBcXFwiPjwvc3ZkLXRyYW5zbGF0aW9uLWdyb3VwPlxcbiAgICA8L2Rpdj5cXG4gIDwvZGl2PlxcbjwvZGl2PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwIHN2ZC10cmFuc2xhdGlvbi10YWJcXFwiPlxcbiAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lclxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fcm93XFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX2NlbGxcXFwiIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCI+XFxuICAgICAgICA8c3ZkLXRvb2xiYXIgcGFyYW1zPVxcXCJpdGVtczogdG9vbGJhckl0ZW1zXFxcIj48L3N2ZC10b29sYmFyPlxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7ZGF0YTogJGRhdGEua29Mb2NhbGVzLCBhczogJ2l0ZW0nIH0gLS0+XFxuICAgICAgICAgIDxsYWJlbCBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICEhaXRlbS5sb2NhbGUgJiYgaXRlbS5rb0VuYWJsZWQoKVxcXCI+XFxuICAgICAgICAgICAgPHN2ZC1wcm9wZXJ0eS1lZGl0b3ItYm9vbGVhblxcbiAgICAgICAgICAgICAgcGFyYW1zPVxcXCJ7bW9kZWw6IHtrb1ZhbHVlOiBpdGVtLmtvVmlzaWJsZSwgZGlzcGxheU5hbWU6ICRwYXJlbnQuZ2V0TG9jYWxlTmFtZSgkZGF0YS5sb2NhbGUpLCBpc0RpcGxheU5hbWVWaXNpYmxlOiB0cnVlLCBrb0FmdGVyUmVuZGVyOiBmdW5jdGlvbigpe319fVxcXCJcXG4gICAgICAgICAgICA+PC9zdmQtcHJvcGVydHktZWRpdG9yLWJvb2xlYW4+XFxuICAgICAgICAgIDwvbGFiZWw+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgPGJ1dHRvblxcbiAgICAgICAgICAgIGNsYXNzPVxcXCJidG4gc3YtYnRuIGJ0bi1wcmltYXJ5XFxcIlxcbiAgICAgICAgICAgIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6JGRhdGEua29DYW5NZXJnZUxvY2FsZVdpdGhEZWZhdWx0KCkgJiYgIWtvUmVhZE9ubHkoKSwgdGV4dDokZGF0YS5rb01lcmdlTG9jYWxlV2l0aERlZmF1bHRUZXh0LCBjbGljazokZGF0YS5rb01lcmdlTG9jYWxlV2l0aERlZmF1bHRcXFwiXFxuICAgICAgICAgID48L2J1dHRvbj5cXG4gICAgICAgICAgPGJ1dHRvblxcbiAgICAgICAgICAgIGNsYXNzPVxcXCJidG4gc3YtYnRuIGJ0bi1wcmltYXJ5XFxcIlxcbiAgICAgICAgICAgIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6JGRhdGEuZXhwb3J0VG9DU1ZUZXh0LCBjbGljazokZGF0YS5rb0V4cG9ydFRvQ1NWRmlsZVxcXCJcXG4gICAgICAgICAgPjwvYnV0dG9uPlxcbiAgICAgICAgICA8YnV0dG9uIGRhdGEtYmluZD1cXFwidmlzaWJsZTogIWtvUmVhZE9ubHkoKVxcXCJcXG4gICAgICAgICAgICBjbGFzcz1cXFwiYnRuIHN2LWJ0biBidG4tcHJpbWFyeVxcXCJcXG4gICAgICAgICAgICB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgICAgICAgb25jbGljaz1cXFwidGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXS5jbGljaygpO1xcXCJcXG4gICAgICAgICAgPlxcbiAgICAgICAgICAgIDxpbnB1dFxcbiAgICAgICAgICAgICAgdHlwZT1cXFwiZmlsZVxcXCJcXG4gICAgICAgICAgICAgIHN0eWxlPVxcXCJkaXNwbGF5OiBub25lO1xcXCJcXG4gICAgICAgICAgICAgIGFjY2VwdD1cXFwiLmNzdlxcXCJcXG4gICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiZXZlbnQ6IHsgY2hhbmdlOiBmdW5jdGlvbigpIHsgJGRhdGEua29JbXBvcnRGcm9tQ1NWRmlsZSgkZWxlbWVudCkgfSB9XFxcIlxcbiAgICAgICAgICAgIC8+XFxuICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiRkYXRhLmltcG9ydEZyb21DU1ZUZXh0XFxcIj48L3NwYW4+XFxuICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19yb3dcXFwiIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbFxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX2NlbGwtY29udGVudC1ob2xkZXJcXFwiPlxcbiAgICAgICAgICA8ZGl2XFxuICAgICAgICAgICAgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX2NlbGwtY29udGVudCBzdmQtdmVydGljYWwtY29udGFpbmVyX19jZWxsLWNvbnRlbnQtLXNjcm9sbGFibGVcXFwiXFxuICAgICAgICAgID5cXG4gICAgICAgICAgICA8ZGl2XFxuICAgICAgICAgICAgICBjbGFzcz1cXFwic3ZkLXRyYW5zbGF0aW9uLW5vLXN0cmluZ3Mgc3ZkLWxpZ2h0LXRleHQtY29sb3JcXFwiXFxuICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6JGRhdGEua29Jc0VtcHR5XFxcIlxcbiAgICAgICAgICAgID5cXG4gICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDokZGF0YS5ub1N0cmluZ3NUZXh0XFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogJGRhdGEua29Jc0VtcHR5IC0tPlxcbiAgICAgICAgICAgIDxzdmQtdHJhbnNsYXRpb24tZ3JvdXBcXG4gICAgICAgICAgICAgIHBhcmFtcz1cXFwibW9kZWw6IGtvUm9vdFxcXCJcXG4gICAgICAgICAgICA+PC9zdmQtdHJhbnNsYXRpb24tZ3JvdXA+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgdW5wYXJzZSwgcGFyc2UgfSBmcm9tIFwicGFwYXBhcnNlXCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vZWRpdG9yTG9jYWxpemF0aW9uXCI7XG5pbXBvcnQgeyBTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4uL2VkaXRvclwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3NcIjtcblxuaW1wb3J0IFwiLi90cmFuc2xhdGlvbi5zY3NzXCI7XG5pbXBvcnQgeyBJQWN0aW9uIH0gZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSBcIi4uL3N1cnZleUhlbHBlclwiO1xudmFyIHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL3RyYW5zbGF0aW9uLmh0bWxcIik7XG52YXIgZ3JvdXBUZW1wbGF0ZUh0bWwgPSByZXF1aXJlKFwiLi90cmFuc2xhdGlvbi1ncm91cC5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRpb25JdGVtQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHt9XG4gIHB1YmxpYyBnZXQgaXNHcm91cCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGZpbGxMb2NhbGVzKGxvY2FsZXM6IEFycmF5PHN0cmluZz4pIHt9XG4gIHB1YmxpYyBtZXJnZUxvY2FsZVdpdGhEZWZhdWx0KGxvYzogc3RyaW5nKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRpb25JdGVtIGV4dGVuZHMgVHJhbnNsYXRpb25JdGVtQmFzZSB7XG4gIHByaXZhdGUgdmFsdWVzOiBTdXJ2ZXkuSGFzaFRhYmxlPGtvLk9ic2VydmFibGU8c3RyaW5nPj47XG4gIHB1YmxpYyBjdXN0b21UZXh0OiBzdHJpbmc7XG4gIHB1YmxpYyBhZnRlclJlbmRlcjogYW55O1xuICBwdWJsaWMga29SZWFkT25seTogYW55ID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIGxvY1N0cmluZzogU3VydmV5LkxvY2FsaXphYmxlU3RyaW5nLFxuICAgIHB1YmxpYyBkZWZhdWx0VmFsdWU6IHN0cmluZyA9IFwiXCIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvbjogSVRyYW5zbGF0aW9uTG9jYWxlcyxcbiAgICBwcml2YXRlIGNvbnRleHQ6IGFueVxuICApIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBpZiAoISF0aGlzLnRyYW5zbGF0aW9uKSB7XG4gICAgICB0aGlzLmtvUmVhZE9ubHkgPSB0aGlzLnRyYW5zbGF0aW9uLmtvUmVhZE9ubHk7XG4gICAgfVxuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuYWZ0ZXJSZW5kZXIgPSBmdW5jdGlvbiAoZWw6IGFueSwgZGF0YTogYW55KSB7XG4gICAgICBpZiAoISFzZWxmLnRyYW5zbGF0aW9uKSB7XG4gICAgICAgIHNlbGYudHJhbnNsYXRpb24udHJhbnNsYXRlSXRlbUFmdGVyUmVuZGVyKHNlbGYsIGVsLCBkYXRhLmxvY2FsZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5jdXN0b21UZXh0ID8gdGhpcy5jdXN0b21UZXh0IDogdGhpcy5sb2NhbGl6YWJsZU5hbWU7XG4gIH1cbiAgcHVibGljIGdldCBsb2NhbGl6YWJsZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZWRpdG9yTG9jYWxpemF0aW9uLmdldFByb3BlcnR5TmFtZSh0aGlzLm5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NUZXh0KGxvYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NTdHJpbmcuZ2V0TG9jYWxlVGV4dChsb2MpO1xuICB9XG4gIHB1YmxpYyBzZXRMb2NUZXh0KGxvYzogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2NTdHJpbmcuc2V0TG9jYWxlVGV4dChsb2MsIG5ld1ZhbHVlKTtcbiAgICAhIXRoaXMudHJhbnNsYXRpb24udHJhbmxhdGlvbkNoYW5nZWRDYWxsYmFjayAmJlxuICAgICAgdGhpcy50cmFuc2xhdGlvbi50cmFubGF0aW9uQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgICBsb2MsXG4gICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgIHRoaXMuY29udGV4dFxuICAgICAgKTtcbiAgfVxuICBwdWJsaWMga29WYWx1ZShsb2M6IHN0cmluZyk6IGtvLk9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLnZhbHVlc1tsb2NdKSB7XG4gICAgICB2YXIgdmFsID0ga28ub2JzZXJ2YWJsZSh0aGlzLmdldExvY1RleHQobG9jKSk7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YWwuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICBzZWxmLnNldExvY1RleHQobG9jLCBuZXdWYWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudmFsdWVzW2xvY10gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZhbHVlc1tsb2NdO1xuICB9XG5cbiAgcHVibGljIGZpbGxMb2NhbGVzKGxvY2FsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0S2V5cygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoXG4gICAgICAgICEha2V5ICYmXG4gICAgICAgIGxvY2FsZXMuaW5kZXhPZihrZXkpIDwgMCAmJlxuICAgICAgICBrZXkgIT09IFN1cnZleS5Mb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0TG9jYWxlXG4gICAgICApIHtcbiAgICAgICAgbG9jYWxlcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0S2V5cygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5sb2NTdHJpbmdbXCJnZXRMb2NhbGVzXCJdKSByZXR1cm4gdGhpcy5sb2NTdHJpbmdbXCJnZXRMb2NhbGVzXCJdKCk7XG4gICAgdmFyIGpzb24gPSB0aGlzLmxvY1N0cmluZy5nZXRKc29uKCk7XG4gICAgaWYgKCFqc29uIHx8IHR5cGVvZiBqc29uID09PSBcInN0cmluZ1wiKSByZXR1cm4gW107XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBqc29uKSB7XG4gICAgICByZXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBtZXJnZUxvY2FsZVdpdGhEZWZhdWx0KGxvYzogc3RyaW5nKSB7XG4gICAgdmFyIGxvY1RleHQgPSB0aGlzLmxvY1N0cmluZy5nZXRMb2NhbGVUZXh0KGxvYyk7XG4gICAgaWYgKCFsb2NUZXh0KSByZXR1cm47XG4gICAgdGhpcy5sb2NTdHJpbmcuc2V0TG9jYWxlVGV4dChcIlwiLCBsb2NUZXh0KTtcbiAgICB0aGlzLmxvY1N0cmluZy5zZXRMb2NhbGVUZXh0KGxvYywgbnVsbCk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVHJhbnNsYXRpb25Mb2NhbGVzIHtcbiAga29Mb2NhbGVzOiBhbnk7XG4gIHNob3dBbGxTdHJpbmdzOiBib29sZWFuO1xuICBrb1JlYWRPbmx5OiBhbnk7XG4gIGdldExvY2FsZU5hbWUobG9jOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGF2YWlsYWJsZVRyYW5sYXRpb25zQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICB0cmFubGF0aW9uQ2hhbmdlZENhbGxiYWNrOiAoXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgY29udGV4dDogYW55XG4gICkgPT4gdm9pZDtcbiAgdHJhbnNsYXRlSXRlbUFmdGVyUmVuZGVyKGl0ZW06IFRyYW5zbGF0aW9uSXRlbSwgZWw6IGFueSwgbG9jYWxlOiBzdHJpbmcpO1xuICBjYW5TaG93UHJvcGVydHkob2JqOiBTdXJ2ZXkuQmFzZSwgcHJvcDogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGlvbkdyb3VwIGV4dGVuZHMgVHJhbnNsYXRpb25JdGVtQmFzZSB7XG4gIHByaXZhdGUgaXNSb290VmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAga29FeHBhbmRlZDogYW55O1xuICBrb1Nob3dIZWFkZXI6IGFueTtcbiAgcHJpdmF0ZSBpdGVtVmFsdWVzOiBBcnJheTxUcmFuc2xhdGlvbkl0ZW1CYXNlPjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5hbWUsXG4gICAgcHVibGljIG9iajogYW55LFxuICAgIHB1YmxpYyB0cmFuc2xhdGlvbjogSVRyYW5zbGF0aW9uTG9jYWxlcyA9IG51bGwsXG4gICAgcHVibGljIHRleHQ6IHN0cmluZyA9IFwiXCJcbiAgKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgaWYgKCF0aGlzLnRleHQpIHtcbiAgICAgIHRoaXMudGV4dCA9IG5hbWU7XG4gICAgfVxuICAgIHRoaXMua29FeHBhbmRlZCA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICAgIHRoaXMua29TaG93SGVhZGVyID0ga28ub2JzZXJ2YWJsZSh0cnVlKTtcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cbiAgcHVibGljIGdldCBpdGVtcygpOiBBcnJheTxUcmFuc2xhdGlvbkl0ZW1CYXNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbVZhbHVlcztcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY0l0ZW1zKCk6IEFycmF5PFRyYW5zbGF0aW9uSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1WYWx1ZXMuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0gaW5zdGFuY2VvZiBUcmFuc2xhdGlvbkl0ZW1cbiAgICApIGFzIEFycmF5PFRyYW5zbGF0aW9uSXRlbT47XG4gIH1cbiAgcHVibGljIGdldCBpc1Jvb3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNSb290VmFsdWU7XG4gIH1cbiAgc2V0QXNSb290KCkge1xuICAgIHRoaXMuaXNSb290VmFsdWUgPSB0cnVlO1xuICAgIHRoaXMua29FeHBhbmRlZCh0cnVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0SXRlbUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBUcmFuc2xhdGlvbkl0ZW1CYXNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaXRlbVZhbHVlc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLml0ZW1WYWx1ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgZ3JvdXBzKCk6IEFycmF5PFRyYW5zbGF0aW9uR3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVtVmFsdWVzLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiBpdGVtIGluc3RhbmNlb2YgVHJhbnNsYXRpb25Hcm91cFxuICAgICkgYXMgQXJyYXk8VHJhbnNsYXRpb25Hcm91cD47XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR3JvdXAoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBrb0xvY2FsZXMoKSB7XG4gICAgcmV0dXJuICEhdGhpcy50cmFuc2xhdGlvbiA/IHRoaXMudHJhbnNsYXRpb24ua29Mb2NhbGVzIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY2FsZUNvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmtvTG9jYWxlcygpKSByZXR1cm4gMDtcbiAgICB2YXIgbG9jYWxlcyA9IHRoaXMua29Mb2NhbGVzKCk7XG4gICAgdmFyIHJlcyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NhbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobG9jYWxlc1tpXS5rb1Zpc2libGUoKSkgcmVzKys7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBsb2NXaWR0aCgpOiBzdHJpbmcge1xuICAgIHZhciBjb3VudCA9IHRoaXMubG9jYWxlQ291bnQ7XG4gICAgaWYgKGNvdW50IDwgMikgcmV0dXJuIFwiMTAwJVwiO1xuICAgIHJldHVybiBNYXRoLmZsb29yKDEwMCAvIGNvdW50KS50b1N0cmluZygpICsgXCIlXCI7XG4gIH1cbiAgcHVibGljIGdldExvY2FsZU5hbWUobG9jOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvblxuICAgICAgPyB0aGlzLnRyYW5zbGF0aW9uLmdldExvY2FsZU5hbWUobG9jKVxuICAgICAgOiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0TG9jYWxlTmFtZShsb2MpO1xuICB9XG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLml0ZW1WYWx1ZXMgPSBbXTtcbiAgICB0aGlzLmZpbGxJdGVtcygpO1xuICB9XG4gIHB1YmxpYyBmaWxsTG9jYWxlcyhsb2NhbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLml0ZW1zW2ldLmZpbGxMb2NhbGVzKGxvY2FsZXMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHNob3dBbGxTdHJpbmdzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMudHJhbnNsYXRpb24gPyB0aGlzLnRyYW5zbGF0aW9uLnNob3dBbGxTdHJpbmdzIDogdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0l0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmxvY0l0ZW1zLmxlbmd0aCA+IDApIHJldHVybiB0cnVlO1xuICAgIHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGdyb3Vwc1tpXS5oYXNJdGVtcykgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgbWVyZ2VMb2NhbGVXaXRoRGVmYXVsdChsb2M6IHN0cmluZykge1xuICAgIHRoaXMuaXRlbVZhbHVlcy5mb3JFYWNoKChpdGVtKSA9PiBpdGVtLm1lcmdlTG9jYWxlV2l0aERlZmF1bHQobG9jKSk7XG4gIH1cbiAgcHJpdmF0ZSBmaWxsSXRlbXMoKSB7XG4gICAgaWYgKHRoaXMuaXNJdGVtVmFsdWVBcnJheSh0aGlzLm9iaikpIHtcbiAgICAgIHRoaXMuY3JlYXRlSXRlbVZhbHVlcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMub2JqIHx8ICF0aGlzLm9iai5nZXRUeXBlKSByZXR1cm47XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldExvY2FsaXplZFByb3BlcnRpZXModGhpcy5vYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5jcmVhdGVUcmFuc2xhdGlvbkl0ZW0odGhpcy5vYmosIHByb3BlcnRpZXNbaV0pO1xuICAgICAgaWYgKCEhaXRlbSkge1xuICAgICAgICB0aGlzLml0ZW1WYWx1ZXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvcGVydGllcyA9IHRoaXMuZ2V0QXJyYXlQcm9wZXJ0aWVzKHRoaXMub2JqKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLm9ialtwcm9wZXJ0eS5uYW1lXTtcbiAgICAgIC8vSWYgSXRlbVZhbHVlIGFycmF5P1xuICAgICAgaWYgKHRoaXMuaXNJdGVtVmFsdWVBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIGdyb3VwID0gbmV3IFRyYW5zbGF0aW9uR3JvdXAoXG4gICAgICAgICAgcHJvcGVydHkubmFtZSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uLFxuICAgICAgICAgIGVkaXRvckxvY2FsaXphdGlvbi5nZXRQcm9wZXJ0eU5hbWUocHJvcGVydHkubmFtZSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGdyb3VwLmhhc0l0ZW1zKSB7XG4gICAgICAgICAgdGhpcy5pdGVtVmFsdWVzLnB1c2goZ3JvdXApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNyZWF0ZUdyb3Vwcyh2YWx1ZSwgcHJvcGVydHkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNvcnRJdGVtcygpO1xuICAgIHRoaXMua2VlcE9uR3JvdXBFeHBhbmRlZCgpO1xuICB9XG4gIHByaXZhdGUga2VlcE9uR3JvdXBFeHBhbmRlZCgpIHtcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggPT0gMSAmJiB0aGlzLmdyb3Vwcy5sZW5ndGggPT0gMSkge1xuICAgICAgdmFyIGdyID0gdGhpcy5ncm91cHNbMF07XG4gICAgICBnci5rb0V4cGFuZGVkKHRydWUpO1xuICAgICAgaWYgKGdyLm9iai5nZXRUeXBlKCkgPT0gXCJwYWdlXCIpIHtcbiAgICAgICAgZ3Iua29TaG93SGVhZGVyKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGV4cGFuZEFsbCgpIHtcbiAgICB0aGlzLmV4cGFuZENvbGxhcHNlQWxsKHRydWUpO1xuICB9XG4gIHB1YmxpYyBjb2xsYXBzZUFsbCgpIHtcbiAgICB0aGlzLmV4cGFuZENvbGxhcHNlQWxsKGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIGV4cGFuZENvbGxhcHNlQWxsKGlzRXhwYW5kOiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLmlzUm9vdCkge1xuICAgICAgdGhpcy5rb0V4cGFuZGVkKGlzRXhwYW5kKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlzRXhwYW5kKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBzW2ldLmV4cGFuZEFsbCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ncm91cHNbaV0uY29sbGFwc2VBbGwoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5rZWVwT25Hcm91cEV4cGFuZGVkKCk7XG4gIH1cbiAgcHJpdmF0ZSBzb3J0SXRlbXMoKSB7XG4gICAgaWYgKCFzZXR0aW5ncy50cmFzbGF0aW9uLnNvcnRCeU5hbWUpIHJldHVybjtcbiAgICB0aGlzLml0ZW1WYWx1ZXMuc29ydChmdW5jdGlvbiAoXG4gICAgICBhOiBUcmFuc2xhdGlvbkl0ZW1CYXNlLFxuICAgICAgYjogVHJhbnNsYXRpb25JdGVtQmFzZVxuICAgICkge1xuICAgICAgaWYgKCFhLm5hbWUpIHJldHVybiAtMTtcbiAgICAgIGlmICghYi5uYW1lKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgZ2V0TG9jYWxpemVkUHJvcGVydGllcyhvYmo6IGFueSk6IEFycmF5PFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIHByb3BlcnRpZXMgPSBTdXJ2ZXkuU2VyaWFsaXplci5nZXRQcm9wZXJ0aWVzQnlPYmoob2JqKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07XG4gICAgICBpZiAoIXByb3BlcnR5LmlzU2VyaWFsaXphYmxlIHx8ICFwcm9wZXJ0eS5pc0xvY2FsaXphYmxlKSBjb250aW51ZTtcbiAgICAgIGlmIChwcm9wZXJ0eS5yZWFkT25seSB8fCAhcHJvcGVydHkudmlzaWJsZSkgY29udGludWU7XG4gICAgICByZXMucHVzaChwcm9wZXJ0eSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRBcnJheVByb3BlcnRpZXMob2JqOiBhbnkpOiBBcnJheTxTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gU3VydmV5LlNlcmlhbGl6ZXIuZ2V0UHJvcGVydGllc0J5T2JqKG9iaik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgaWYgKHByb3BlcnR5LmlzU2VyaWFsaXphYmxlID09PSBmYWxzZSkgY29udGludWU7XG4gICAgICB2YXIgdmFsdWUgPSBvYmpbcHJvcGVydHkubmFtZV07XG4gICAgICBpZiAoISF2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcy5wdXNoKHByb3BlcnR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVRyYW5zbGF0aW9uSXRlbShcbiAgICBvYmo6IGFueSxcbiAgICBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuICApOiBUcmFuc2xhdGlvbkl0ZW0ge1xuICAgIHZhciBkZWZhdWx0VmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZShvYmosIHByb3BlcnR5KTtcbiAgICB2YXIgbG9jU3RyID0gPFN1cnZleS5Mb2NhbGl6YWJsZVN0cmluZz5vYmpbcHJvcGVydHkuc2VyaWFsaXphdGlvblByb3BlcnR5XTtcbiAgICBpZiAoIWxvY1N0cikgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLnNob3dBbGxTdHJpbmdzICYmICFkZWZhdWx0VmFsdWUgJiYgbG9jU3RyLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIGlmIChcbiAgICAgIGxvY1N0ci5pc0VtcHR5ICYmXG4gICAgICAhIXRoaXMudHJhbnNsYXRpb24gJiZcbiAgICAgICEhdGhpcy50cmFuc2xhdGlvbi5jYW5TaG93UHJvcGVydHkgJiZcbiAgICAgICF0aGlzLnRyYW5zbGF0aW9uLmNhblNob3dQcm9wZXJ0eSh0aGlzLm9iaiwgcHJvcGVydHkpXG4gICAgKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2xhdGlvbkl0ZW0oXG4gICAgICBwcm9wZXJ0eS5uYW1lLFxuICAgICAgbG9jU3RyLFxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgdGhpcy50cmFuc2xhdGlvbixcbiAgICAgIG9ialxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXREZWZhdWx0VmFsdWUoXG4gICAgb2JqOiBhbnksXG4gICAgcHJvcGVydHk6IFN1cnZleS5Kc29uT2JqZWN0UHJvcGVydHlcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoXG4gICAgICBwcm9wZXJ0eS5uYW1lID09IFwidGl0bGVcIiAmJlxuICAgICAgcHJvcGVydHkuaXNMb2NhbGl6YWJsZSAmJlxuICAgICAgISFwcm9wZXJ0eS5zZXJpYWxpemF0aW9uUHJvcGVydHlcbiAgICApIHtcbiAgICAgIHZhciBsb2NTdHIgPSA8U3VydmV5LkxvY2FsaXphYmxlU3RyaW5nPihcbiAgICAgICAgb2JqW3Byb3BlcnR5LnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV1cbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgICEhbG9jU3RyICYmXG4gICAgICAgIG9iai5nZXRUeXBlKCkgIT0gXCJwYWdlXCIgJiZcbiAgICAgICAgKCEhbG9jU3RyLm9uR2V0VGV4dENhbGxiYWNrIHx8IGxvY1N0cltcIm9uUmVuZGVyZWRIdG1sQ2FsbGJhY2tcIl0pXG4gICAgICApXG4gICAgICAgIHJldHVybiBvYmpbXCJuYW1lXCJdO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcml2YXRlIGlzSXRlbVZhbHVlQXJyYXkodmFsOiBhbnkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF2YWwgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsKSAmJlxuICAgICAgdmFsLmxlbmd0aCA+IDAgJiZcbiAgICAgICEhdmFsWzBdICYmXG4gICAgICAhIXZhbFswXVtcImdldFR5cGVcIl0gJiZcbiAgICAgICEhdmFsWzBdW1wic2V0RGF0YVwiXSAmJlxuICAgICAgISF2YWxbMF1bXCJzZXRMb2NUZXh0XCJdXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZUdyb3Vwcyh2YWx1ZTogYW55LCBwcm9wZXJ0eTogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvYmogPSB2YWx1ZVtpXTtcbiAgICAgIGlmICghIW9iaiAmJiBvYmouZ2V0VHlwZSkge1xuICAgICAgICB2YXIgbmFtZSA9IG9ialtcIm5hbWVcIl07XG4gICAgICAgIHZhciB0ZXh0ID0gZWRpdG9yTG9jYWxpemF0aW9uLmdldFByb3BlcnR5TmFtZShuYW1lKTtcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gXCJbXCIgKyBpLnRvU3RyaW5nKCkgKyBcIl1cIjtcbiAgICAgICAgICBuYW1lID0gcHJvcGVydHkubmFtZSArIGluZGV4O1xuICAgICAgICAgIHRleHQgPSBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0UHJvcGVydHlOYW1lKHByb3BlcnR5Lm5hbWUpICsgaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdyb3VwID0gbmV3IFRyYW5zbGF0aW9uR3JvdXAobmFtZSwgb2JqLCB0aGlzLnRyYW5zbGF0aW9uLCB0ZXh0KTtcbiAgICAgICAgaWYgKGdyb3VwLmhhc0l0ZW1zKSB7XG4gICAgICAgICAgdGhpcy5pdGVtVmFsdWVzLnB1c2goZ3JvdXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY3JlYXRlSXRlbVZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsID0gdGhpcy5vYmpbaV07XG4gICAgICB2YXIgY2FuQWRkID1cbiAgICAgICAgdGhpcy5zaG93QWxsU3RyaW5ncyB8fCAhdmFsLmxvY1RleHQuaXNFbXB0eSB8fCBpc05hTih2YWwudmFsdWUpO1xuICAgICAgaWYgKCFjYW5BZGQpIGNvbnRpbnVlO1xuICAgICAgdmFyIGl0ZW0gPSBuZXcgVHJhbnNsYXRpb25JdGVtKFxuICAgICAgICB2YWwudmFsdWUsXG4gICAgICAgIHZhbC5sb2NUZXh0LFxuICAgICAgICB2YWwudmFsdWUsXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb24sXG4gICAgICAgIHZhbFxuICAgICAgKTtcbiAgICAgIHRoaXMuaXRlbVZhbHVlcy5wdXNoKGl0ZW0pO1xuICAgICAgdGhpcy5hZGRDdXN0b21Qcm9wZXJ0aWVzRm9ySXRlbVZhbHVlKHRoaXMub2JqW2ldLCBpdGVtKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRDdXN0b21Qcm9wZXJ0aWVzRm9ySXRlbVZhbHVlKFxuICAgIGl0ZW1WYWx1ZTogYW55LFxuICAgIHRleHRJdGVtOiBUcmFuc2xhdGlvbkl0ZW1cbiAgKSB7XG4gICAgdmFyIGxvY1Byb3BlcnRpZXMgPSB0aGlzLmdldExvY2FsaXplZFByb3BlcnRpZXMoaXRlbVZhbHVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvY1Byb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsb2NQcm9wZXJ0aWVzW2ldLm5hbWUgPT0gXCJ0ZXh0XCIpIGNvbnRpbnVlO1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNyZWF0ZVRyYW5zbGF0aW9uSXRlbShpdGVtVmFsdWUsIGxvY1Byb3BlcnRpZXNbaV0pO1xuICAgICAgaWYgKCEhaXRlbSkge1xuICAgICAgICBpdGVtLmN1c3RvbVRleHQgPSB0ZXh0SXRlbS50ZXh0ICsgXCIgKFwiICsgaXRlbS5sb2NhbGl6YWJsZU5hbWUgKyBcIilcIjtcbiAgICAgICAgaXRlbS5uYW1lID0gaXRlbVZhbHVlLnZhbHVlICsgXCIuXCIgKyBpdGVtLm5hbWU7XG4gICAgICAgIHRoaXMuaXRlbVZhbHVlcy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRpb24gaW1wbGVtZW50cyBJVHJhbnNsYXRpb25Mb2NhbGVzIHtcbiAgcHVibGljIHN0YXRpYyBjc3ZEZWxpbWl0ZXIgPSBcIixcIjtcbiAgcHVibGljIHN0YXRpYyBuZXdMaW5lRGVsaW1pdGVyID0gXCJcXG5cIjtcbiAgcHVibGljIGtvTG9jYWxlczogYW55O1xuICBwdWJsaWMga29Sb290OiBhbnk7XG4gIHB1YmxpYyBrb0F2YWlsYWJsZUxhbmd1YWdlczogYW55O1xuICBwdWJsaWMga29TZWxlY3RlZExhbmd1YWdlVG9BZGQ6IGFueTtcbiAgcHVibGljIGtvU2hvd0FsbFN0cmluZ3M6IGFueTtcbiAgcHVibGljIGtvRmlsdGVyZWRQYWdlOiBhbnk7XG4gIHB1YmxpYyBrb0ZpbHRlcmVkUGFnZXM6IGFueTtcbiAgcHVibGljIGtvSXNFbXB0eTogYW55O1xuICBwdWJsaWMga29FeHBvcnRUb0NTVkZpbGU6IGFueTtcbiAgcHVibGljIGtvSW1wb3J0RnJvbUNTVkZpbGU6IGFueTtcbiAgcHVibGljIGtvQ2FuTWVyZ2VMb2NhbGVXaXRoRGVmYXVsdDogYW55O1xuICBwdWJsaWMga29NZXJnZUxvY2FsZVdpdGhEZWZhdWx0OiBhbnk7XG4gIHB1YmxpYyBrb01lcmdlTG9jYWxlV2l0aERlZmF1bHRUZXh0OiBhbnk7XG4gIHB1YmxpYyBpbXBvcnRGaW5pc2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgdHJhbnNsYXRlSXRlbUFmdGVyUmVuZGVyQ2FsbGJhY2s6IChcbiAgICBpdGVtOiBUcmFuc2xhdGlvbkl0ZW0sXG4gICAgZWw6IGFueSxcbiAgICBsb2NhbGU6IHN0cmluZ1xuICApID0+IHZvaWQ7XG4gIHB1YmxpYyBhdmFpbGFibGVUcmFubGF0aW9uc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgcHVibGljIHRyYW5sYXRpb25DaGFuZ2VkQ2FsbGJhY2s6IChcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBjb250ZXh0OiBhbnlcbiAgKSA9PiB2b2lkO1xuICBwcml2YXRlIHJvb3RWYWx1ZTogVHJhbnNsYXRpb25Hcm91cDtcbiAgcHJpdmF0ZSBzdXJ2ZXlWYWx1ZTogU3VydmV5LlN1cnZleTtcblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgdG9vbGJhciBpdGVtcy4gWW91IG1heSBhZGQvcmVtb3ZlL3JlcGxhY2UgdGhlbS5cbiAgICogQHNlZSBJQWN0aW9uXG4gICAqL1xuICBwdWJsaWMgdG9vbGJhckl0ZW1zID0ga28ub2JzZXJ2YWJsZUFycmF5PElBY3Rpb24+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3VydmV5OiBTdXJ2ZXkuU3VydmV5LFxuICAgIHNob3dBbGxTdHJpbmdzOiBib29sZWFuID0gZmFsc2UsXG4gICAgcHVibGljIGtvUmVhZE9ubHkgPSBrby5jb21wdXRlZCgoKSA9PiBmYWxzZSksXG4gICAgcHJpdmF0ZSBvbkNhblNob3dQcm9wZXJ0eT86IChcbiAgICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgICBwcm9wOiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5XG4gICAgKSA9PiBib29sZWFuXG4gICkge1xuICAgIHRoaXMua29Mb2NhbGVzID0ga28ub2JzZXJ2YWJsZUFycmF5KFtcbiAgICAgIHtcbiAgICAgICAgbG9jYWxlOiBcIlwiLFxuICAgICAgICBrb1Zpc2libGU6IGtvLm9ic2VydmFibGUodHJ1ZSksXG4gICAgICAgIGtvRW5hYmxlZDoga28ub2JzZXJ2YWJsZSh0cnVlKSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgdGhpcy5rb1Jvb3QgPSBrby5vYnNlcnZhYmxlKG51bGwpO1xuICAgIHRoaXMua29TaG93QWxsU3RyaW5ncyA9IGtvLm9ic2VydmFibGUoc2hvd0FsbFN0cmluZ3MpO1xuICAgIHRoaXMua29Jc0VtcHR5ID0ga28ub2JzZXJ2YWJsZSh0cnVlKTtcbiAgICB0aGlzLmtvQXZhaWxhYmxlTGFuZ3VhZ2VzID0ga28ub2JzZXJ2YWJsZUFycmF5KCk7XG4gICAgdGhpcy5rb1NlbGVjdGVkTGFuZ3VhZ2VUb0FkZCA9IGtvLm9ic2VydmFibGUobnVsbCk7XG4gICAgdGhpcy5rb0ZpbHRlcmVkUGFnZSA9IGtvLm9ic2VydmFibGUoKTtcbiAgICB0aGlzLmtvQ2FuTWVyZ2VMb2NhbGVXaXRoRGVmYXVsdCA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICAgIHRoaXMua29NZXJnZUxvY2FsZVdpdGhEZWZhdWx0VGV4dCA9IGtvLmNvbXB1dGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghdGhpcy5rb0Nhbk1lcmdlTG9jYWxlV2l0aERlZmF1bHQoKSkgcmV0dXJuIFwiXCI7XG4gICAgICB2YXIgbG9jVGV4dCA9IHRoaXMuZ2V0TG9jYWxlTmFtZSh0aGlzLmRlZmF1bHRMb2NhbGUpO1xuICAgICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwiZWQudHJhbnNsYXRpb25NZXJnZUxvY2FsZVdpdGhEZWZhdWx0XCIpXG4gICAgICAgIFtcImZvcm1hdFwiXShsb2NUZXh0KTtcbiAgICB9LCB0aGlzKTtcbiAgICB0aGlzLmtvRmlsdGVyZWRQYWdlcyA9IGtvLm9ic2VydmFibGVBcnJheShbXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICB0ZXh0OiB0aGlzLnNob3dBbGxQYWdlc1RleHQsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvU2VsZWN0ZWRMYW5ndWFnZVRvQWRkLnN1YnNjcmliZShmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgIGlmICghIW5ld1ZhbHVlKSB7XG4gICAgICAgIHNlbGYuYWRkTG9jYWxlKG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmtvU2hvd0FsbFN0cmluZ3Muc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgc2VsZi5yZXNldCgpO1xuICAgIH0pO1xuICAgIHRoaXMua29GaWx0ZXJlZFBhZ2Uuc3Vic2NyaWJlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgc2VsZi5yZXNldCgpO1xuICAgIH0pO1xuICAgIHRoaXMua29FeHBvcnRUb0NTVkZpbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmV4cG9ydFRvU0NWRmlsZShcInN1cnZleV90cmFuc2xhdGlvbi5jc3ZcIik7XG4gICAgfTtcbiAgICB0aGlzLmtvSW1wb3J0RnJvbUNTVkZpbGUgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGlmIChlbC5maWxlcy5sZW5ndGggPCAxKSByZXR1cm47XG4gICAgICBzZWxmLmltcG9ydEZyb21DU1ZGaWxlKGVsLmZpbGVzWzBdKTtcbiAgICAgIGVsLnZhbHVlID0gXCJcIjtcbiAgICB9O1xuICAgIHRoaXMua29NZXJnZUxvY2FsZVdpdGhEZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5tZXJnZUxvY2FsZVdpdGhEZWZhdWx0KCk7XG4gICAgfTtcbiAgICB0aGlzLnN1cnZleSA9IHN1cnZleTtcblxuICAgIGNvbnN0IGl0ZW1zOiBBcnJheTxJQWN0aW9uPiA9IFtdO1xuICAgIGl0ZW1zLnB1c2goPElBY3Rpb24+e1xuICAgICAgaWQ6IFwic3ZkLXRyYW5zbGF0aW9uLWxhbmd1YWdlLXNlbGVjdG9yXCIsXG4gICAgICB0aXRsZTogXCJcIixcbiAgICAgIHRvb2x0aXA6IHRoaXMuc2VsZWN0TGFuZ3VhZ2VPcHRpb25zQ2FwdGlvbixcbiAgICAgIGFyaWFMYWJlbDogdGhpcy5zZWxlY3RMYW5ndWFnZU9wdGlvbnNDYXB0aW9uLFxuICAgICAgY29tcG9uZW50OiBcInN2ZC1kcm9wZG93blwiLFxuICAgICAgYWN0aW9uOiBrby5jb21wdXRlZCh7XG4gICAgICAgIHJlYWQ6ICgpID0+IHRoaXMua29TZWxlY3RlZExhbmd1YWdlVG9BZGQoKSxcbiAgICAgICAgd3JpdGU6ICh2YWw6IGFueSkgPT4gdGhpcy5rb1NlbGVjdGVkTGFuZ3VhZ2VUb0FkZCh2YWwpLFxuICAgICAgfSksXG4gICAgICBpdGVtczogPGFueT50aGlzLmtvQXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgIH0pO1xuICAgIGl0ZW1zLnB1c2goe1xuICAgICAgaWQ6IFwic3ZkLXRyYW5zbGF0aW9uLXNob3ctYWxsLXN0cmluZ3NcIixcbiAgICAgIHRpdGxlOiB0aGlzLnNob3dBbGxTdHJpbmdzVGV4dCxcbiAgICAgIHRvb2x0aXA6IHRoaXMuc2hvd0FsbFN0cmluZ3NUZXh0LFxuICAgICAgY29tcG9uZW50OiBcInN2ZC1ib29sZWFuXCIsXG4gICAgICBhY3Rpb246IGtvLmNvbXB1dGVkKHtcbiAgICAgICAgcmVhZDogKCkgPT4gdGhpcy5rb1Nob3dBbGxTdHJpbmdzKCksXG4gICAgICAgIHdyaXRlOiAodmFsOiBhbnkpID0+IHRoaXMua29TaG93QWxsU3RyaW5ncyh2YWwpLFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgaXRlbXMucHVzaCg8SUFjdGlvbj57XG4gICAgICBpZDogXCJzdmQtdHJhbnNsYXRpb24tcGFnZXMtc2VsZWN0b3JcIixcbiAgICAgIHRpdGxlOiBcIlwiLFxuICAgICAgdG9vbHRpcDogXCJcIixcbiAgICAgIGFyaWFMYWJlbDogdGhpcy5zaG93QWxsUGFnZXNUZXh0LFxuICAgICAgY29tcG9uZW50OiBcInN2ZC1kcm9wZG93blwiLFxuICAgICAgYWN0aW9uOiBrby5jb21wdXRlZCh7XG4gICAgICAgIHJlYWQ6ICgpID0+IHRoaXMua29GaWx0ZXJlZFBhZ2UoKSxcbiAgICAgICAgd3JpdGU6ICh2YWw6IGFueSkgPT4gdGhpcy5rb0ZpbHRlcmVkUGFnZSh2YWwpLFxuICAgICAgfSksXG4gICAgICBpdGVtczogdGhpcy5rb0ZpbHRlcmVkUGFnZXMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnRvb2xiYXJJdGVtcyhpdGVtcyk7XG4gIH1cbiAgcHVibGljIGdldCBzdXJ2ZXkoKTogU3VydmV5LlN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5VmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBzdXJ2ZXkodmFsOiBTdXJ2ZXkuU3VydmV5KSB7XG4gICAgdGhpcy5zdXJ2ZXlWYWx1ZSA9IHZhbDtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkUGFnZXMoKTtcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cbiAgcHVibGljIGdldCByb290KCk6IFRyYW5zbGF0aW9uR3JvdXAge1xuICAgIHJldHVybiB0aGlzLnJvb3RWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGZpbHRlcmVkUGFnZSgpOiBTdXJ2ZXkuUGFnZSB7XG4gICAgcmV0dXJuIHRoaXMua29GaWx0ZXJlZFBhZ2UoKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZpbHRlcmVkUGFnZSh2YWw6IFN1cnZleS5QYWdlKSB7XG4gICAgdGhpcy5rb0ZpbHRlcmVkUGFnZSh2YWwpO1xuICB9XG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB2YXIgcm9vdE9iaiA9ICEhdGhpcy5maWx0ZXJlZFBhZ2UgPyB0aGlzLmZpbHRlcmVkUGFnZSA6IHRoaXMuc3VydmV5O1xuICAgIHZhciByb290TmFtZSA9ICEhdGhpcy5maWx0ZXJlZFBhZ2UgPyByb290T2JqW1wibmFtZVwiXSA6IFwic3VydmV5XCI7XG4gICAgdGhpcy5yb290VmFsdWUgPSBuZXcgVHJhbnNsYXRpb25Hcm91cChyb290TmFtZSwgcm9vdE9iaiwgdGhpcyk7XG4gICAgdGhpcy5yb290LnNldEFzUm9vdCgpO1xuICAgIHRoaXMucm9vdC5yZXNldCgpO1xuICAgIHRoaXMucmVzZXRMb2NhbGVzKCk7XG4gICAgdGhpcy5rb0lzRW1wdHkoIXRoaXMucm9vdC5oYXNJdGVtcyk7XG4gICAgdGhpcy5rb1Jvb3QodGhpcy5yb290KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY2FsZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBsb2NhbGVzID0gdGhpcy5rb0xvY2FsZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvY2FsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKGxvY2FsZXNbaV0ubG9jYWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IGRlZmF1bHRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3VydmV5LnN1cnZleUxvY2FsaXphdGlvbi5kZWZhdWx0TG9jYWxlO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGVOYW1lKGxvYzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRMb2NhbGVOYW1lKGxvYywgdGhpcy5kZWZhdWx0TG9jYWxlKTtcbiAgfVxuICBwdWJsaWMgaGFzTG9jYWxlKGxvY2FsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdmFyIGxvY2FsZXMgPSB0aGlzLmtvTG9jYWxlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxvY2FsZXNbaV0ubG9jYWxlID09IGxvY2FsZSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgYWRkTG9jYWxlKGxvY2FsZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmhhc0xvY2FsZShsb2NhbGUpKSB7XG4gICAgICB2YXIgbG9jcyA9IHRoaXMubG9jYWxlcztcbiAgICAgIGxvY3MucHVzaChsb2NhbGUpO1xuICAgICAgdGhpcy5zZXRMb2NhbGVzKGxvY3MpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcmVzZXRMb2NhbGVzKCkge1xuICAgIHZhciBsb2NhbGVzID0gW1wiXCJdO1xuICAgIHRoaXMucm9vdC5maWxsTG9jYWxlcyhsb2NhbGVzKTtcbiAgICB0aGlzLnNldExvY2FsZXMobG9jYWxlcyk7XG4gIH1cbiAgcHVibGljIGdldFNlbGVjdGVkTG9jYWxlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGxvY3MgPSB0aGlzLmtvTG9jYWxlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxvY3NbaV0ua29WaXNpYmxlKCkpIHJlcy5wdXNoKGxvY3NbaV0ubG9jYWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc2V0U2VsZWN0ZWRMb2NhbGVzKHNlbGVjdGVkTG9jYWxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIHNlbGVjdGVkTG9jYWxlcyA9IHNlbGVjdGVkTG9jYWxlcyB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGVkTG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLmhhc0xvY2FsZShzZWxlY3RlZExvY2FsZXNbaV0pKSB7XG4gICAgICAgIHRoaXMuYWRkTG9jYWxlKHNlbGVjdGVkTG9jYWxlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgbG9jcyA9IHRoaXMua29Mb2NhbGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZW5hYmxlZCA9IHRoaXMuaXNMb2NhbGVFbmFibGVkKGxvY3NbaV0ubG9jYWxlKTtcbiAgICAgIGxvY3NbaV0ua29WaXNpYmxlKFxuICAgICAgICBlbmFibGVkICYmIHNlbGVjdGVkTG9jYWxlcy5pbmRleE9mKGxvY3NbaV0ubG9jYWxlKSA+IC0xXG4gICAgICApO1xuICAgICAgbG9jc1tpXS5rb0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RMYW5ndWFnZU9wdGlvbnNDYXB0aW9uKCkge1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZWQudHJhbnNsYXRpb25BZGRMYW5ndWFnZVwiKTtcbiAgfVxuICBwdWJsaWMgY2FuU2hvd1Byb3BlcnR5KFxuICAgIG9iajogU3VydmV5LkJhc2UsXG4gICAgcHJvcDogU3VydmV5Lkpzb25PYmplY3RQcm9wZXJ0eVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLm9uQ2FuU2hvd1Byb3BlcnR5ID8gdGhpcy5vbkNhblNob3dQcm9wZXJ0eShvYmosIHByb3ApIDogdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHNob3dBbGxTdHJpbmdzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmtvU2hvd0FsbFN0cmluZ3MoKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dBbGxTdHJpbmdzKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMua29TaG93QWxsU3RyaW5ncyh2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0FsbFN0cmluZ3NUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJlZC50cmFuc2xhdGlvblNob3dBbGxTdHJpbmdzXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0FsbFBhZ2VzVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZWQudHJhbnNsYXRpb25TaG93QWxsUGFnZXNcIik7XG4gIH1cbiAgcHVibGljIGdldCBub1N0cmluZ3NUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJlZC50cmFuc2xhdGlvbk5vU3RyaW5nc1wiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGV4cG9ydFRvQ1NWVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZWQudHJhbnNsYXRpb25FeHBvcnRUb1NDVkJ1dHRvblwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGltcG9ydEZyb21DU1ZUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJlZC50cmFuc2xhdGlvbkltcG9ydEZyb21TQ1ZCdXR0b25cIik7XG4gIH1cbiAgcHVibGljIGV4cG9ydFRvQ1NWKCk6IHN0cmluZyB7XG4gICAgbGV0IHJlcyA9IFtdO1xuICAgIGxldCBoZWFkZXJSb3cgPSBbXTtcbiAgICBsZXQgdmlzaWJsZUxvY2FsZXMgPSB0aGlzLmdldFZpc2libGVMb2NhbGVzKCk7XG4gICAgaGVhZGVyUm93LnB1c2goXCJkZXNjcmlwdGlvbiDihpMgLSBsYW5ndWFnZSDihpJcIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aXNpYmxlTG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaGVhZGVyUm93LnB1c2goISF2aXNpYmxlTG9jYWxlc1tpXSA/IHZpc2libGVMb2NhbGVzW2ldIDogXCJkZWZhdWx0XCIpO1xuICAgIH1cbiAgICByZXMucHVzaChoZWFkZXJSb3cpO1xuICAgIGxldCBpdGVtc0hhc2ggPSA8U3VydmV5Lkhhc2hUYWJsZTxUcmFuc2xhdGlvbkl0ZW0+Pnt9O1xuICAgIHRoaXMuZmlsbEl0ZW1zSGFzaChcIlwiLCB0aGlzLnJvb3QsIGl0ZW1zSGFzaCk7XG4gICAgZm9yIChsZXQga2V5IGluIGl0ZW1zSGFzaCkge1xuICAgICAgbGV0IHJvdyA9IFtrZXldO1xuICAgICAgbGV0IGl0ZW0gPSBpdGVtc0hhc2hba2V5XTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlzaWJsZUxvY2FsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHZhbCA9IGl0ZW0ubG9jU3RyaW5nLmdldExvY2FsZVRleHQodmlzaWJsZUxvY2FsZXNbaV0pO1xuICAgICAgICByb3cucHVzaCghdmFsICYmIGkgPT0gMCA/IGl0ZW0uZGVmYXVsdFZhbHVlIDogdmFsKTtcbiAgICAgIH1cbiAgICAgIHJlcy5wdXNoKHJvdyk7XG4gICAgfVxuICAgIHJldHVybiB1bnBhcnNlKHJlcywge1xuICAgICAgcXVvdGVDaGFyOiAnXCInLFxuICAgICAgZXNjYXBlQ2hhcjogJ1wiJyxcbiAgICAgIGRlbGltaXRlcjogVHJhbnNsYXRpb24uY3N2RGVsaW1pdGVyLFxuICAgICAgaGVhZGVyOiB0cnVlLFxuICAgICAgbmV3bGluZTogVHJhbnNsYXRpb24ubmV3TGluZURlbGltaXRlcixcbiAgICAgIHNraXBFbXB0eUxpbmVzOiBmYWxzZSwgLy9vciAnZ3JlZWR5JyxcbiAgICAgIGNvbHVtbnM6IG51bGwsIC8vb3IgYXJyYXkgb2Ygc3RyaW5nc1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGltcG9ydEZyb21OZXN0ZWRBcnJheShyb3dzOiBzdHJpbmdbXVtdKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGxldCBsb2NhbGVzID0gcm93cy5zaGlmdCgpLnNsaWNlKDEpO1xuICAgIGlmIChsb2NhbGVzWzBdID09PSBcImRlZmF1bHRcIikge1xuICAgICAgbG9jYWxlc1swXSA9IFwiXCI7XG4gICAgfVxuICAgIGxldCB0cmFuc2xhdGlvbiA9IG5ldyBUcmFuc2xhdGlvbih0aGlzLnN1cnZleSwgdHJ1ZSk7XG4gICAgbGV0IGl0ZW1zSGFzaCA9IDxTdXJ2ZXkuSGFzaFRhYmxlPFRyYW5zbGF0aW9uSXRlbT4+e307XG4gICAgdGhpcy5maWxsSXRlbXNIYXNoKFwiXCIsIHRyYW5zbGF0aW9uLnJvb3QsIGl0ZW1zSGFzaCk7XG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGxldCBuYW1lID0gcm93LnNoaWZ0KCkudHJpbSgpO1xuICAgICAgaWYgKCFuYW1lKSByZXR1cm47XG4gICAgICBsZXQgaXRlbSA9IGl0ZW1zSGFzaFtuYW1lXTtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgICAgc2VsZi51cGRhdGVJdGVtV2l0aFN0cmluZ3MoaXRlbSwgcm93LCBsb2NhbGVzKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgaWYgKHRoaXMuaW1wb3J0RmluaXNoZWRDYWxsYmFjaykgdGhpcy5pbXBvcnRGaW5pc2hlZENhbGxiYWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0VG9TQ1ZGaWxlKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMuZXhwb3J0VG9DU1YoKTtcbiAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlOiBcInRleHQvY3N2XCIgfSk7XG4gICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikge1xuICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGVsZW0gPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICBlbGVtLmhyZWYgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIGVsZW0uZG93bmxvYWQgPSBmaWxlTmFtZTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbSk7XG4gICAgICBlbGVtLmNsaWNrKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZW0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaW1wb3J0RnJvbUNTVkZpbGUoZmlsZTogRmlsZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBwYXJzZShmaWxlLCB7XG4gICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKHJlc3VsdHMsIGZpbGUpIHtcbiAgICAgICAgc2VsZi5pbXBvcnRGcm9tTmVzdGVkQXJyYXkoPHN0cmluZ1tdW10+cmVzdWx0cy5kYXRhKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgcHVibGljIG1lcmdlTG9jYWxlV2l0aERlZmF1bHQoKSB7XG4gICAgaWYgKCF0aGlzLmhhc0xvY2FsZSh0aGlzLmRlZmF1bHRMb2NhbGUpKSByZXR1cm47XG4gICAgdGhpcy5yb290Lm1lcmdlTG9jYWxlV2l0aERlZmF1bHQodGhpcy5kZWZhdWx0TG9jYWxlKTtcbiAgICB0aGlzLmtvTG9jYWxlcyhbXG4gICAgICB7XG4gICAgICAgIGxvY2FsZTogXCJcIixcbiAgICAgICAga29WaXNpYmxlOiBrby5vYnNlcnZhYmxlKHRydWUpLFxuICAgICAgICBrb0VuYWJsZWQ6IGtvLm9ic2VydmFibGUodHJ1ZSksXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHRoaXMucmVzZXQoKTtcbiAgfVxuICBwdWJsaWMgZXhwYW5kQWxsKCkge1xuICAgIGlmICghdGhpcy5yb290KSByZXR1cm47XG4gICAgdGhpcy5yb290LmV4cGFuZEFsbCgpO1xuICB9XG4gIHB1YmxpYyBjb2xsYXBzZUFsbCgpIHtcbiAgICBpZiAoIXRoaXMucm9vdCkgcmV0dXJuO1xuICAgIHRoaXMucm9vdC5jb2xsYXBzZUFsbCgpO1xuICB9XG4gIHRyYW5zbGF0ZUl0ZW1BZnRlclJlbmRlcihpdGVtOiBUcmFuc2xhdGlvbkl0ZW0sIGVsOiBhbnksIGxvY2FsZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnRyYW5zbGF0ZUl0ZW1BZnRlclJlbmRlckNhbGxiYWNrKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZWwpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChlbFtpXS50YWdOYW1lID09IFwiVEVYVEFSRUFcIikge1xuICAgICAgICAgIGVsID0gZWxbaV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy50cmFuc2xhdGVJdGVtQWZ0ZXJSZW5kZXJDYWxsYmFjayhpdGVtLCBlbCwgbG9jYWxlKTtcbiAgfVxuICAvKipcbiAgICogVXBkYXRlIGEgdHJhbnNsYXRpb24gaXRlbSB3aXRoIGdpdmVuIHZhbHVlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVJdGVtV2l0aFN0cmluZ3MoXG4gICAgaXRlbTogVHJhbnNsYXRpb25JdGVtLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICBsb2NhbGVzOiBBcnJheTxzdHJpbmc+XG4gICkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aCAmJiBpIDwgbG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHZhbCA9IHZhbHVlc1tpXS50cmltKCk7XG4gICAgICBpZiAoIXZhbCkgY29udGludWU7XG4gICAgICBpdGVtLmtvVmFsdWUobG9jYWxlc1tpXSkodmFsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFZpc2libGVMb2NhbGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmtvTG9jYWxlcygpXG4gICAgICAuZmlsdGVyKChsb2NhbGUpID0+IGxvY2FsZS5rb1Zpc2libGUoKSlcbiAgICAgIC5tYXAoKGxvY2FsZSkgPT4gbG9jYWxlLmxvY2FsZSk7XG4gIH1cblxuICBwcml2YXRlIGZpbGxJdGVtc0hhc2goXG4gICAgcGFyZW50TmFtZTogc3RyaW5nLFxuICAgIGdyb3VwOiBUcmFuc2xhdGlvbkdyb3VwLFxuICAgIGl0ZW1zSGFzaDogU3VydmV5Lkhhc2hUYWJsZTxUcmFuc2xhdGlvbkl0ZW0+XG4gICkge1xuICAgIGxldCBuYW1lID0gcGFyZW50TmFtZSA/IHBhcmVudE5hbWUgKyBcIi5cIiArIGdyb3VwLm5hbWUgOiBncm91cC5uYW1lO1xuICAgIGdyb3VwLmxvY0l0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGl0ZW1zSGFzaFtuYW1lICsgXCIuXCIgKyBpdGVtLm5hbWVdID0gaXRlbTtcbiAgICB9KTtcbiAgICBncm91cC5ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHRoaXMuZmlsbEl0ZW1zSGFzaChuYW1lLCBncm91cCwgaXRlbXNIYXNoKSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRMb2NhbGVzKGxvY3M6IEFycmF5PHN0cmluZz4pIHtcbiAgICB2YXIgbG9jYWxlcyA9IHRoaXMua29Mb2NhbGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbG9jID0gbG9jc1tpXTtcbiAgICAgIGlmICh0aGlzLmhhc0xvY2FsZShsb2MpKSBjb250aW51ZTtcbiAgICAgIHZhciBlbmFibGVkID0gdGhpcy5pc0xvY2FsZUVuYWJsZWQobG9jKTtcbiAgICAgIGxvY2FsZXMucHVzaCh7XG4gICAgICAgIGxvY2FsZTogbG9jLFxuICAgICAgICBrb1Zpc2libGU6IGtvLm9ic2VydmFibGUoZW5hYmxlZCksXG4gICAgICAgIGtvRW5hYmxlZDoga28ub2JzZXJ2YWJsZShlbmFibGVkKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmtvTG9jYWxlcyhsb2NhbGVzKTtcbiAgICB0aGlzLmtvQ2FuTWVyZ2VMb2NhbGVXaXRoRGVmYXVsdCh0aGlzLmhhc0xvY2FsZSh0aGlzLmRlZmF1bHRMb2NhbGUpKTtcbiAgICB0aGlzLnVwZGF0ZUF2YWlsYWJsZVRyYW5sYXRpb25zKCk7XG4gIH1cbiAgcHJpdmF0ZSBpc0xvY2FsZUVuYWJsZWQobG9jYWxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWxvY2FsZSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIHN1cHBvcnRlZCA9IFN1cnZleS5zdXJ2ZXlMb2NhbGl6YXRpb24uc3VwcG9ydGVkTG9jYWxlcztcbiAgICBpZiAoIXN1cHBvcnRlZCB8fCBzdXBwb3J0ZWQubGVuZ3RoIDw9IDApIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBzdXBwb3J0ZWQuaW5kZXhPZihsb2NhbGUpID4gLTE7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVBdmFpbGFibGVUcmFubGF0aW9ucygpIHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGxvY2FsZXMgPSAoPGFueT5TdXJ2ZXkuc3VydmV5TG9jYWxpemF0aW9uKS5nZXRMb2NhbGVzKHRydWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jYWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxvYyA9IGxvY2FsZXNbaV07XG4gICAgICBpZiAoIWxvYykgY29udGludWU7XG4gICAgICBpZiAodGhpcy5oYXNMb2NhbGUobG9jKSkgY29udGludWU7XG4gICAgICBpZiAobG9jID09IHRoaXMuZGVmYXVsdExvY2FsZSkgY29udGludWU7XG4gICAgICByZXMucHVzaCh7IHZhbHVlOiBsb2MsIHRleHQ6IGVkaXRvckxvY2FsaXphdGlvbi5nZXRMb2NhbGVOYW1lKGxvYykgfSk7XG4gICAgfVxuICAgIHRoaXMua29TZWxlY3RlZExhbmd1YWdlVG9BZGQobnVsbCk7XG4gICAgcmVzLnVuc2hpZnQoeyB2YWx1ZTogbnVsbCwgdGV4dDogdGhpcy5zZWxlY3RMYW5ndWFnZU9wdGlvbnNDYXB0aW9uIH0pO1xuICAgIHRoaXMua29BdmFpbGFibGVMYW5ndWFnZXMocmVzKTtcbiAgICAhIXRoaXMuYXZhaWxhYmxlVHJhbmxhdGlvbnNDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMuYXZhaWxhYmxlVHJhbmxhdGlvbnNDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUZpbHRlcmVkUGFnZXMoKSB7XG4gICAgdmFyIHJlcyA9IFt7IHZhbHVlOiBudWxsLCB0ZXh0OiB0aGlzLnNob3dBbGxQYWdlc1RleHQgfV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1cnZleS5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLnN1cnZleS5wYWdlc1tpXTtcbiAgICAgIHJlcy5wdXNoKHsgdmFsdWU6IHBhZ2UsIHRleHQ6IHBhZ2UubmFtZSB9KTtcbiAgICB9XG4gICAgdGhpcy5rb0ZpbHRlcmVkUGFnZXMocmVzKTtcbiAgfVxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuaW1wb3J0RmluaXNoZWRDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmF2YWlsYWJsZVRyYW5sYXRpb25zQ2hhbmdlZENhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudHJhbmxhdGlvbkNoYW5nZWRDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3VydmV5LXRyYW5zbGF0aW9uXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICBsZXQgY3JlYXRvcjogU3VydmV5Q3JlYXRvciA9IHBhcmFtcy5jcmVhdG9yO1xuXG4gICAgICBsZXQgbW9kZWwgPSBuZXcgVHJhbnNsYXRpb24oXG4gICAgICAgIGNyZWF0b3IuY3JlYXRlU3VydmV5KHt9LCBcInRyYW5zbGF0aW9uXCIpLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAga28uY29tcHV0ZWQoKCkgPT4gY3JlYXRvci5yZWFkT25seSksXG4gICAgICAgIChvYmo6IFN1cnZleS5CYXNlLCBwcm9wOiBTdXJ2ZXkuSnNvbk9iamVjdFByb3BlcnR5KTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5pc1Byb3BlcnR5VmlzaWJsZShvYmosIHByb3AsIGNyZWF0b3IpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgbW9kZWwuaW1wb3J0RmluaXNoZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3JlYXRvci5vblRyYW5zbGF0aW9uSW1wb3J0ZWQuZmlyZShzZWxmLCB7fSk7XG4gICAgICB9O1xuICAgICAgbW9kZWwudHJhbnNsYXRlSXRlbUFmdGVyUmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbiAoXG4gICAgICAgIGl0ZW06IFRyYW5zbGF0aW9uSXRlbSxcbiAgICAgICAgZWw6IGFueSxcbiAgICAgICAgbG9jYWxlOiBzdHJpbmdcbiAgICAgICkge1xuICAgICAgICBpZiAoY3JlYXRvci5vblRyYW5zbGF0ZUl0ZW1BZnRlclJlbmRlci5pc0VtcHR5KSByZXR1cm47XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgaHRtbEVsZW1lbnQ6IGVsLFxuICAgICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICAgIG9uRGVzdHJveUNhbGxiYWNrOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2soZWwsICgpID0+IHtcbiAgICAgICAgICBpZiAoISFvcHRpb25zLm9uRGVzdHJveUNhbGxiYWNrKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uRGVzdHJveUNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY3JlYXRvci5vblRyYW5zbGF0ZUl0ZW1BZnRlclJlbmRlci5maXJlKGNyZWF0b3IsIG9wdGlvbnMpO1xuICAgICAgfTtcbiAgICAgIG1vZGVsLmF2YWlsYWJsZVRyYW5sYXRpb25zQ2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICBjcmVhdG9yLnNldE1vZGlmaWVkKHsgdHlwZTogXCJUUkFOU0xBVElPTlNfQ0hBTkdFRFwiIH0pO1xuICAgICAgfTtcbiAgICAgIG1vZGVsLnRyYW5sYXRpb25DaGFuZ2VkQ2FsbGJhY2sgPSAoXG4gICAgICAgIGxvY2FsZTogc3RyaW5nLFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIGNvbnRleHQ6IGFueVxuICAgICAgKSA9PiB7XG4gICAgICAgIGNyZWF0b3Iuc2V0TW9kaWZpZWQoe1xuICAgICAgICAgIHR5cGU6IFwiVFJBTlNMQVRJT05TX0NIQU5HRURcIixcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBzdWJzY3JWaWV3VHlwZSA9IGNyZWF0b3Iua29WaWV3VHlwZS5zdWJzY3JpYmUoKHZpZXdUeXBlKSA9PiB7XG4gICAgICAgIGlmICh2aWV3VHlwZSA9PT0gXCJ0cmFuc2xhdGlvblwiKSB7XG4gICAgICAgICAgbW9kZWwuc3VydmV5ID0gY3JlYXRvci5zdXJ2ZXk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGNvbXBvbmVudEluZm8uZWxlbWVudCwgKCkgPT4ge1xuICAgICAgICBzdWJzY3JWaWV3VHlwZS5kaXNwb3NlKCk7XG4gICAgICAgIGNyZWF0b3IudHJhbnNsYXRpb24uZGlzcG9zZSgpO1xuICAgICAgICBjcmVhdG9yLnRyYW5zbGF0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG5cbiAgICAgIGNyZWF0b3IudHJhbnNsYXRpb24gPSBtb2RlbDtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtdHJhbnNsYXRpb24tZ3JvdXBcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIHZhciBtb2RlbCA9IHBhcmFtcy5tb2RlbDtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogZ3JvdXBUZW1wbGF0ZUh0bWwsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcImNvbnZlcnQtYWN0aW9uXFxcIj5cXG4gIDxzcGFuIGNsYXNzPVxcXCJzdmRhX3F1ZXN0aW9uX2FjdGlvblxcXCI+XFxuICAgIDwhLS0ga28gaWY6IGFsbG93Q2hhbmdlVHlwZSAtLT5cXG4gICAgPHNlbGVjdFxcbiAgICAgIG9ubW91c2V3aGVlbD1cXFwicmV0dXJuIGZhbHNlO1xcXCJcXG4gICAgICBjbGFzcz1cXFwic3ZkYV9jdXJyZW50X3R5cGUgc3ZkLW1haW4tY29sb3Igc3ZkLWxpZ2h0LWJnLWNvbG9yXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwiZm9yZWFjaDogYXZhaWxhYmxlVHlwZXMsIGV2ZW50OiB7IGNoYW5nZTogb25Db252ZXJ0VHlwZSB9LCBhdHRyOiB7dGl0bGU6IHRpdGxlfVxcXCJcXG4gICAgPlxcbiAgICAgIDxvcHRpb25cXG4gICAgICAgIGNsYXNzPVxcXCJzdmQtbGlnaHQtYmctY29sb3JcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLm5hbWUsIHZhbHVlOiAkZGF0YS52YWx1ZSwgYXR0cjp7c2VsZWN0ZWQ6ICRkYXRhLnZhbHVlID09PSAkcGFyZW50LnR5cGUgPyAnc2VsZWN0ZWQnOiBudWxsfVxcXCJcXG4gICAgICA+PC9vcHRpb24+XFxuICAgIDwvc2VsZWN0PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSBrbyBpZm5vdDogYWxsb3dDaGFuZ2VUeXBlIC0tPlxcbiAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IHRleHRcXFwiIGNsYXNzPVxcXCJzdmRhX2N1cnJlbnRfdHlwZSBzdmQtbWFpbi1jb2xvclxcXCI+XFxuICAgIDwvc3Bhbj5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L3NwYW4+XFxuPC9zY3JpcHQ+XFxuXFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJjaG9pY2UtYWN0aW9uXFxcIj5cXG4gIDwhLS0ga28gaWY6IGtvLnVud3JhcCgkZGF0YS52aXNpYmxlKSA9PT0gdW5kZWZpbmVkIHx8ICEha28udW53cmFwKCRkYXRhLnZpc2libGUpIC0tPlxcbiAgPHNwYW4gY2xhc3M9XFxcInN2ZGFfcXVlc3Rpb25fYWN0aW9uXFxcIj5cXG4gICAgPHNlbGVjdFxcbiAgICAgIG9ubW91c2V3aGVlbD1cXFwicmV0dXJuIGZhbHNlO1xcXCJcXG4gICAgICBjbGFzcz1cXFwic3ZkYV9jdXJyZW50X3R5cGUgc3ZkLW1haW4tY29sb3Igc3ZkLWxpZ2h0LWJnLWNvbG9yXFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwiZm9yZWFjaDogY2hvaWNlcywgZXZlbnQ6IHsgY2hhbmdlOiBvbkNsaWNrIH0sIGF0dHI6IHt0aXRsZTogdGV4dCwgdmFsdWU6IHZhbHVlfVxcXCJcXG4gICAgPlxcbiAgICAgIDxvcHRpb25cXG4gICAgICAgIGNsYXNzPVxcXCJzdmQtbGlnaHQtYmctY29sb3JcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLnRleHQgfHwgJGRhdGEudmFsdWUgfHwgJGRhdGEsIHZhbHVlOiAkZGF0YS52YWx1ZSwgYXR0cjp7c2VsZWN0ZWQ6ICRkYXRhLnZhbHVlID09PSBrby51bndyYXAoJHBhcmVudC52YWx1ZSkgPyAnc2VsZWN0ZWQnOiBudWxsfVxcXCJcXG4gICAgICA+PC9vcHRpb24+XFxuICAgIDwvc2VsZWN0PlxcbiAgPC9zcGFuPlxcbiAgPCEtLSAva28gLS0+XFxuPC9zY3JpcHQ+XFxuXFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJhY3Rpb24tc2VwYXJhdG9yXFxcIj5cXG4gIDxzcGFuXFxuICAgIGNsYXNzPVxcXCJzdmRhX2FjdGlvbl9zZXBhcmF0b3Igc3ZkLWRhcmstYm9yZGVyLWNvbG9yXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvLnVud3JhcCgkZGF0YS52aXNpYmxlKSA9PT0gdW5kZWZpbmVkIHx8ICEha28udW53cmFwKCRkYXRhLnZpc2libGUpXFxcIlxcbiAgPlxcbiAgPC9zcGFuPlxcbjwvc2NyaXB0PlxcblxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwiZnAtYWRkLXF1ZXN0aW9uXFxcIj5cXG4gIDxzcGFuIGNsYXNzPVxcXCJzdmRhX3F1ZXN0aW9uX2FjdGlvblxcXCI+XFxuICAgIDxzZWxlY3RcXG4gICAgICBvbm1vdXNld2hlZWw9XFxcInJldHVybiBmYWxzZTtcXFwiXFxuICAgICAgY2xhc3M9XFxcInN2ZGFfY3VycmVudF90eXBlIHN2ZC1tYWluLWNvbG9yIHN2ZC1saWdodC1iZy1jb2xvclxcXCJcXG4gICAgICBkYXRhLWJpbmQ9XFxcImV2ZW50OiB7IGNoYW5nZTogb25BZGRRdWVzdGlvbiB9LCBhdHRyOiB7dGl0bGU6IHRpdGxlfVxcXCJcXG4gICAgPlxcbiAgICAgIDxvcHRpb25cXG4gICAgICAgIGNsYXNzPVxcXCJzdmQtbGlnaHQtYmctY29sb3JcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6IHRpdGxlLCB2YWx1ZTogdW5kZWZpbmVkXFxcIlxcbiAgICAgID48L29wdGlvbj5cXG4gICAgICA8IS0tIGtvIGZvcmVhY2g6IGF2YWlsYWJsZVR5cGVzIC0tPlxcbiAgICAgIDxvcHRpb25cXG4gICAgICAgIGNsYXNzPVxcXCJzdmQtbGlnaHQtYmctY29sb3JcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLm5hbWUgfHwgJGRhdGEsIHZhbHVlOiAkZGF0YS52YWx1ZSB8fCAkZGF0YVxcXCJcXG4gICAgICA+PC9vcHRpb24+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgIDwvc2VsZWN0PlxcbiAgPC9zcGFuPlxcbjwvc2NyaXB0PlxcblxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic2NhLXNob3ctcHJvcGVydHktZ3JpZFxcXCI+XFxuICA8c3BhblxcbiAgICBjbGFzcz1cXFwic3ZkYV9xdWVzdGlvbl9hY3Rpb24gc3ZkYV9xdWVzdGlvbl9hY3Rpb24tLXNlcGFyYXRlZCBzdmQtbWFpbi1jb2xvclxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJrZXkyY2xpY2ssIGNsaWNrTm9Gb2N1czogZnVuY3Rpb24oKSB7IG9uQ2xpY2soJHBhcmVudC5xdWVzdGlvbik7IH0sIGF0dHI6IHt0aXRsZTogdGV4dCwgdGFiaW5kZXg6ICRkYXRhLm5lZWRGb2N1cyA9PT0gdW5kZWZpbmVkIHx8ICEhJGRhdGEubmVlZEZvY3VzID8gMCA6IHVuZGVmaW5lZCwgcm9sZTogJ2J1dHRvbicgfVxcXCJcXG4gID5cXG4gICAgPHNwYW4+XFxuICAgICAgPHN2Zy1pY29uXFxuICAgICAgICBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiAkcGFyZW50LmdldFN0eWxlKCRkYXRhKVxcXCJcXG4gICAgICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6ICRwYXJlbnQuZ2V0U3R5bGUoJGRhdGEpXFxcIlxcbiAgICAgID48L3N2Zy1pY29uPlxcbiAgICA8L3NwYW4+XFxuICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEuaGFzVGl0bGUgPyB0ZXh0OiAnJ1xcXCI+PC9zcGFuPlxcbiAgICA8c3Bhbj5cXG4gICAgICA8c3ZnLWljb25cXG4gICAgICAgIGNsYXNzPVxcXCJzdmQtcHJpbWFyeS1pY29uXFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6ICRwYXJlbnQuZ2V0U3R5bGUoJGRhdGEpXFxcIlxcbiAgICAgICAgcGFyYW1zPVxcXCJpY29uTmFtZTogJ2ljb24tcmlnaHQnXFxcIlxcbiAgICAgID48L3N2Zy1pY29uPlxcbiAgICA8L3NwYW4+XFxuICA8L3NwYW4+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic2UtY29tcG9uZW50LXRvb2xib3hcXFwiPlxcbiAgPGRpdiBjbGFzcz1cXFwic3ZkLXRvb2xib3gtaG9sZGVyXFxcIj5cXG4gICAgPHN2ZC10b29sYm94IHBhcmFtcz1cXFwiaXRlbXNQcm92aWRlcjogJGRhdGFcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogc2hvd1Rvb2xib3hcXFwiPjwvc3ZkLXRvb2xib3g+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cXG48c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInNlLWNvbXBvbmVudC1wcm9wZXJ0eS1ncmlkXFxcIj5cXG4gIDxzdmQtcHJvcGVydHktZ3JpZCBwYXJhbXM9XFxcImNyZWF0b3I6JGRhdGFcXFwiPjwvc3ZkLXByb3BlcnR5LWdyaWQ+XFxuPC9zY3JpcHQ+XFxuXFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzZS1jb21wb25lbnQtdG9vbGJhclxcXCI+XFxuICA8c3ZkLXRvb2xiYXIgcGFyYW1zPVxcXCJpdGVtczogdG9vbGJhckl0ZW1zXFxcIj48L3N2ZC10b29sYmFyPlxcbjwvc2NyaXB0PlxcblxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic2UtY29tcG9uZW50LXBhZ2VzLWVkaXRvclxcXCI+XFxuICA8c3ZkLXBhZ2VzLWVkaXRvciBwYXJhbXM9XFxcImVkaXRvcjokZGF0YVxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBrb1Nob3dQYWdlc1Rvb2xib3hcXFwiPlxcbiAgPC9zdmQtcGFnZXMtZWRpdG9yPlxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2XFxuICB0YWJpbmRleD1cXFwiLTFcXFwiXFxuICBjbGFzcz1cXFwic3ZkX2NvbnRhaW5lciBzdmQtbGlnaHQtYmctY29sb3JcXFwiXFxuICBkYXRhLWJpbmQ9XFxcImNzczogdGhlbWVDc3MoKSArIChyZWFkT25seSA/ICcgc3ZkX2NvbnRhaW5lcl9kaXNhYmxlZCcgOiAnJyksIHN0eWxlOiB7IGhlaWdodDoga29EZXNpZ25lckhlaWdodCB9XFxcIlxcbj5cXG4gIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJcXFwiIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX3Jvd1xcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19jZWxsXFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgPCEtLSBrbyBpZm5vdDogaGF2ZUNvbW1lcmNpYWxMaWNlbnNlIC0tPlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmRfY29tbWVyY2lhbF9jb250YWluZXJcXFwiPlxcbiAgICAgICAgICAgIDxhXFxuICAgICAgICAgICAgICBjbGFzcz1cXFwic3ZkX2NvbW1lcmNpYWxfdGV4dFxcXCJcXG4gICAgICAgICAgICAgIGhyZWY9XFxcImh0dHBzOi8vd3d3LnN1cnZleWpzLmlvL0J1eVxcXCJcXG4gICAgICAgICAgICAgIHRhcmdldD1cXFwiX2JsYW5rXFxcIlxcbiAgICAgICAgICAgID5cXG4gICAgICAgICAgICAgIDxzcGFuPlxcbiAgICAgICAgICAgICAgICA8c3ZnLWljb25cXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cXFwic3ZkLXByaW1hcnktaWNvblxcXCJcXG4gICAgICAgICAgICAgICAgICBwYXJhbXM9XFxcImljb25OYW1lOiAnaWNvbi1ub25jb21tZXJjaWFsJywgc2l6ZTogMjBcXFwiXFxuICAgICAgICAgICAgICAgID48L3N2Zy1pY29uPlxcbiAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInN2ZF9jb21tZXJjaWFsX3Byb2R1Y3Qgc3ZkLW1haW4tY29sb3JcXFwiXFxuICAgICAgICAgICAgICAgID5QbGVhc2UgcHVyY2hhc2UgYSBTdXJ2ZXlKUyBDcmVhdG9yIGRldmVsb3BlciBsaWNlbnNlIHRvIHVzZSBpdFxcbiAgICAgICAgICAgICAgICBpbiB5b3VyIGFwcC48L3NwYW5cXG4gICAgICAgICAgICAgID5cXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJzdmRfbm9uY29tbWVyY2lhbF91c2Ugc3ZkLWxpZ2h0LXRleHQtY29sb3JcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICA8L2E+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICA8IS0tIC9rbyAgLS0+XFxuICAgICAgICAgIDwhLS0ga28gaWY6IHRhYnMoKS5sZW5ndGggPiAxIC0tPlxcbiAgICAgICAgICA8dWxcXG4gICAgICAgICAgICBjbGFzcz1cXFwibmF2YmFyLWRlZmF1bHQgY29udGFpbmVyLWZsdWlkIG5hdiBuYXYtdGFicyBlZGl0b3ItdGFicyBzdmQtdGFicyBzdmQtbGlnaHQtYmctY29sb3JcXFwiXFxuICAgICAgICAgICAgcm9sZT1cXFwidGFibGlzdFxcXCJcXG4gICAgICAgICAgPlxcbiAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdGFicyAtLT5cXG4gICAgICAgICAgICA8bGlcXG4gICAgICAgICAgICAgIGNsYXNzPVxcXCJuYXYtaXRlbSBzdmQtdGFiXFxcIlxcbiAgICAgICAgICAgICAgcm9sZT1cXFwidGFiXFxcIlxcbiAgICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogYWN0aW9uLCBjc3M6IHsgYWN0aXZlOiAkcGFyZW50LmtvVmlld1R5cGUoKSA9PSBuYW1lIH0sIGF0dHI6IHsgJ2FyaWEtc2VsZWN0ZWQnOiAkcGFyZW50LmtvVmlld1R5cGUoKSA9PSBuYW1lID8gJ3RydWUnIDogJ2ZhbHNlJyB9XFxcIlxcbiAgICAgICAgICAgID5cXG4gICAgICAgICAgICAgIDxzcGFuXFxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVxcXCIwXFxcIlxcbiAgICAgICAgICAgICAgICBjbGFzcz1cXFwibmF2LWxpbmsgc3ZkLXRhYi10ZXh0XFxcIlxcbiAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6IHRpdGxlXFxcIlxcbiAgICAgICAgICAgICAgPjwvc3Bhbj5cXG4gICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8L3VsPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fcm93XFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX2NlbGxcXFwiIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19jZWxsLWNvbnRlbnQtaG9sZGVyXFxcIj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbC1jb250ZW50XFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbCBjYXJkIHN2ZF9jb250ZW50IHN2ZC1kYXJrLWJnLWNvbG9yXFxcIj5cXG4gICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdGFicyAtLT5cXG4gICAgICAgICAgICAgIDxkaXZcXG4gICAgICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAkcGFyZW50LmtvVmlld1R5cGUoKSA9PSBuYW1lXFxcIlxcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cXFwiMFxcXCJcXG4gICAgICAgICAgICAgICAgcm9sZT1cXFwidGFicGFuZWxcXFwiXFxuICAgICAgICAgICAgICAgIGNsYXNzPVxcXCJzdmQtbm8tb3V0bGluZVxcXCJcXG4gICAgICAgICAgICAgID5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiB0ZW1wbGF0ZSwgZGF0YTogZGF0YSwgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIG1vZGVsKSB7ICRwYXJlbnQub25FZGl0b3JUYWJSZW5kZXJlZENhbGxiYWNrKG5hbWUsIGVsZW1lbnQsIG1vZGVsLCAkZGF0YSk7IH0gfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXZcXG4gICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwidGVtcGxhdGU6IHsgbmFtZTogJ3F1ZXN0aW9uZWRpdG9yJywgZGF0YTogcXVlc3Rpb25FZGl0b3JXaW5kb3cgfVxcXCJcXG4gICAgICAgICAgICA+PC9kaXY+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwicHJvcGVydHllZGl0b3ItdHJpZ2dlcnNpdGVtc1xcXCI+XFxuICA8ZGl2PlxcbiAgICA8IS0ta28gaWY6IGtvSXRlbVNlbGVjdG9yKCkgIT0gbnVsbCAtLT5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiB0aXRsZVxcXCI+PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXAgaW5wdXQtZ3JvdXBcXFwiPlxcbiAgICAgIDxzZWxlY3RcXG4gICAgICAgIG9ubW91c2V3aGVlbD1cXFwicmV0dXJuIGZhbHNlO1xcXCJcXG4gICAgICAgIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiXFxuICAgICAgICBtdWx0aXBsZT1cXFwibXVsdGlwbGVcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcIm9wdGlvbnM6a29JdGVtcywgc2VsZWN0ZWRPcHRpb25zOiBrb1NlbGVjdGVkRm9yRGVsZXRlXFxcIlxcbiAgICAgID48L3NlbGVjdD5cXG4gICAgICA8c3BhblxcbiAgICAgICAgY2xhc3M9XFxcImlucHV0LWdyb3VwLWFkZG9uIHN2LWJ0biBidG4tZGFuZ2VyXFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogZGVsZXRlSXRlbXNcXFwiXFxuICAgICAgPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9XFxcImdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlXFxcIj48L3NwYW4+XFxuICAgICAgPC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cCBpbnB1dC1ncm91cFxcXCI+XFxuICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBcXFwiZWxlbWVudHNlbGVjdG9yXFxcIiwgZGF0YToga29JdGVtU2VsZWN0b3IoKSB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgIDxzcGFuXFxuICAgICAgICBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb24gc3YtYnRuIGJ0bi1kZWZhdWx0XFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogYWRkSXRlbVxcXCJcXG4gICAgICA+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZ2x5cGhpY29uIGdseXBoaWNvbi1wbHVzIHN2ZC1tYWluLWNvbG9yXFxcIj48L3NwYW4+XFxuICAgICAgPC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLS9rbyAtLT5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInF1ZXN0aW9uZWRpdG9yXFxcIj5cXG4gIDxkaXYgaWQ9XFxcInN1cnZleXF1ZXN0aW9uZWRpdG9yd2luZG93XFxcIiBjbGFzcz1cXFwibW9kYWxcXFwiIGRhdGEtYmluZD1cXFwid2l0aDprb0VkaXRvclxcXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIGRhdGEtYmluZD1cXFwiY2xpY2s6IG9uUmVzZXRDbGlja1xcXCI+JnRpbWVzOzwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiIGRhdGEtYmluZD1cXFwidGV4dDprb1RpdGxlXFxcIj48L2g0PlxcbiAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5IHN2ZF9ub3RvcGJvdHRvbXBhZGRpbmdzXFxcIj5cXG4gICAgICAgICAgICAgICAgICA8c3ZkLW9iamVjdC1lZGl0b3ItY29udGVudCBwYXJhbXM9XFxcImVsZW1lbnRFZGl0b3JDb250ZW50OiAkZGF0YVxcXCI+PC9zdmQtb2JqZWN0LWVkaXRvci1jb250ZW50PlxcbiAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gc3YtYnRuIGJ0bi1wcmltYXJ5XFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvU2hvd0FwcGx5QnV0dG9uLCBkaXNhYmxlOiByZWFkT25seSwgY2xpY2s6IG9uQXBwbHlDbGljaywgdmFsdWU6ICRkYXRhLmdldExvY1N0cmluZygncGUuYXBwbHknKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XFxcIndpZHRoOjEwMHB4XFxcIiAvPlxcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gc3YtYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zZWNvbmRhcnlcXFwiIGRhdGEtYmluZD1cXFwiY2xpY2s6IG9uT2tDbGljaywgZGlzYWJsZTogcmVhZE9ubHksIHZhbHVlOiAkZGF0YS5nZXRMb2NTdHJpbmcoJ3BlLm9rJylcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVxcXCJ3aWR0aDoxMDBweFxcXCIgLz5cXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIHN2LWJ0biBidG4tcHJpbWFyeVxcXCIgZGF0YS1iaW5kPVxcXCJjbGljazogb25SZXNldENsaWNrLCB2YWx1ZTogJGRhdGEuZ2V0TG9jU3RyaW5nKCdwZS5jYW5jZWwnKVxcXCIgc3R5bGU9XFxcIndpZHRoOjEwMHB4XFxcIlxcbiAgICAgICAgICAgICAgICAgIC8+XFxuICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzZS10YWItZGVzaWduZXJcXFwiPlxcbiAgPGRpdiBjbGFzcz1cXFwicm93IHN2ZF9zdXJ2ZXlfZGVzaWduZXJcXFwiPlxcbiAgICA8IS0tIGtvIGlmOiBsZWZ0Q29udGFpbmVyLmxlbmd0aCA+IDAgLS0+XFxuICAgIDxzdmQtZGVzaWduZXItY29udGFpbmVyIHBhcmFtcz1cXFwidGFiczogbGVmdENvbnRhaW5lciwgYWN0aXZlVGFiOiBsZWZ0Q29udGFpbmVyQWN0aXZlSXRlbSwgdmlzaWJsZTogbGVmdENvbnRhaW5lclZpc2libGUsIGNoYW5nZWQ6IGxheW91dENoYW5nZWRJbmRpY2F0b3IsIGNvbnRleHQ6ICRkYXRhLCBjbGFzc05hbWU6ICdzdmQtZGVzaWduZXItY29udGFpbmVyLS1sZWZ0LXNpZGUnXFxcIj48L3N2ZC1kZXNpZ25lci1jb250YWluZXI+XFxuICAgIDxzdmQtc3BsaXR0ZXIgcGFyYW1zPVxcXCJtaW5MZWZ0OiAwLCBtaW5SaWdodDogNjAwLCBvbkNoYW5nZTogbGF5b3V0Q2hhbmdlZEluZGljYXRvclxcXCI+PC9zdmQtc3BsaXR0ZXI+XFxuICAgIDwhLS0gL2tvICAtLT5cXG4gICAgPGRpdiBjbGFzcz1cXFwic3ZkX2VkaXRvcnNcXFwiPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJcXFwiIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdmVydGljYWwtY29udGFpbmVyX19yb3dcXFwiIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiB0b3BDb250YWluZXIubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbFxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6IHRvcENvbnRhaW5lci5sZW5ndGggPiAwIC0tPlxcbiAgICAgICAgICAgICAgPHN2ZC1kZXNpZ25lci1oLWNvbnRhaW5lciBwYXJhbXM9XFxcIml0ZW1zOiB0b3BDb250YWluZXIsIGNvbnRleHQ6ICRkYXRhLCBjbGFzc05hbWU6ICdzdmQtZGVzaWduZXItY29udGFpbmVyLS10b3AnXFxcIj48L3N2ZC1kZXNpZ25lci1oLWNvbnRhaW5lcj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvICAtLT5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fcm93XFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX2NlbGxcXFwiIHJvbGU9XFxcInByZXNlbnRhdGlvblxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX2NlbGwtY29udGVudC1ob2xkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkLXZlcnRpY2FsLWNvbnRhaW5lcl9fY2VsbC1jb250ZW50IHN2ZC12ZXJ0aWNhbC1jb250YWluZXJfX2NlbGwtY29udGVudC0tc2Nyb2xsYWJsZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcInN2ZF9xdWVzdGlvbnNfZWRpdG9yIHN2ZC1saWdodC1iZy1jb2xvclxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XFxcInNjcm9sbGFibGVEaXZcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiZXZlbnQ6IHsgZHJhZ292ZXI6IGRyYWdPdmVyUXVlc3Rpb25zRWRpdG9yLCBkcm9wOiBkcm9wT25RdWVzdGlvbnNFZGl0b3IgfVxcXCJcXG4gICAgICAgICAgICAgICAgICAgID5cXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZkX3N1cnZleWpzX2Rlc2lnbmVyX2NvbnRhaW5lclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHN1cnZleS13aWRnZXQgcGFyYW1zPVxcXCJzdXJ2ZXk6IHN1cnZleVxcXCI+PC9zdXJ2ZXktd2lkZ2V0PlxcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLSBrbyBpZjogcmlnaHRDb250YWluZXIubGVuZ3RoID4gMCAtLT5cXG4gICAgPHN2ZC1zcGxpdHRlciBwYXJhbXM9XFxcIm1pbkxlZnQ6IDYwMCwgbWluUmlnaHQ6IDAsIG9uQ2hhbmdlOiBsYXlvdXRDaGFuZ2VkSW5kaWNhdG9yXFxcIj48L3N2ZC1zcGxpdHRlcj5cXG4gICAgPHN2ZC1kZXNpZ25lci1jb250YWluZXIgcGFyYW1zPVxcXCJ0YWJzOiByaWdodENvbnRhaW5lciwgYWN0aXZlVGFiOiByaWdodENvbnRhaW5lckFjdGl2ZUl0ZW0sIHZpc2libGU6IHJpZ2h0Q29udGFpbmVyVmlzaWJsZSwgY2hhbmdlZDogbGF5b3V0Q2hhbmdlZEluZGljYXRvciwgY29udGV4dDogJGRhdGEsIGNsYXNzTmFtZTogJ3N2ZC1kZXNpZ25lci1jb250YWluZXItLXJpZ2h0LXNpZGUnXFxcIj48L3N2ZC1kZXNpZ25lci1jb250YWluZXI+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzZS10YWItdGVzdFxcXCI+XFxuICA8c3VydmV5LXRlc3RlciBpZD1cXFwic3VydmV5anNFeGFtcGxlXFxcIiBwYXJhbXM9XFxcImNyZWF0b3I6ICRkYXRhXFxcIiBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7d2lkdGg6IGtvVGVzdFN1cnZleVdpZHRofVxcXCI+PC9zdXJ2ZXktdGVzdGVyPlxcbjwvc2NyaXB0PlxcblxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic2UtdGFiLWpzb24tZWRpdG9yXFxcIj5cXG4gIDxzdXJ2ZXktanNvbi1lZGl0b3IgcGFyYW1zPVxcXCJjcmVhdG9yOiAkZGF0YVxcXCI+PC9zdXJ2ZXktanNvbi1lZGl0b3I+XFxuPC9zY3JpcHQ+XFxuXFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzZS10YWItdHJhbnNsYXRpb25cXFwiPlxcbiAgPHN1cnZleS10cmFuc2xhdGlvbiBwYXJhbXM9XFxcImNyZWF0b3I6ICRkYXRhXFxcIj48L3N1cnZleS10cmFuc2xhdGlvbj5cXG48L3NjcmlwdD5cXG5cXG48c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInNlLXRhYi1sb2dpY1xcXCI+XFxuICA8c3VydmV5LWxvZ2ljIHBhcmFtcz1cXFwiY3JlYXRvcjogJGRhdGFcXFwiPjwvc3VydmV5LWxvZ2ljPlxcbjwvc2NyaXB0PlxcblxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic2UtdGFiLWVtYmVkXFxcIj5cXG4gIDxzdXJ2ZXktZW1iZWQgcGFyYW1zPVxcXCJjcmVhdG9yOiAkZGF0YVxcXCI+PC9zdXJ2ZXktZW1iZWQ+XFxuPC9zY3JpcHQ+XFxuXFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzZS1lbXB0eS1wbGFjZWhvbGRlclxcXCI+XFxuICA8ZGl2IGNsYXNzPVxcXCJzdmQtc3VydmV5LXBsYWNlaG9sZGVyLXJvb3RcXFwiPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC1zdXJ2ZXktcGxhY2Vob2xkZXJcXFwiPlxcbiAgICAgIDwhLS0ga28gaWY6IHBsYWNlaG9sZGVySHRtbCAtLT5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJodG1sOiBwbGFjZWhvbGRlckh0bWxcXFwiPjwvZGl2PlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0ga28gaWZub3Q6IHBsYWNlaG9sZGVySHRtbCAtLT5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogc2hvd0V4dGVybmFsSGVscExpbmsgLS0+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInN2ZC1zdXJ2ZXktZ2FsbGVyeVxcXCI+XFxuICAgICAgICAgICAgPGEgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IGhyZWY6IGdldExvY1N0cmluZygnc3VydmV5LmV4dGVybmFsSGVscExpbmtVcmwnKSB9XFxcIj5cXG4gICAgICAgICAgICA8aW1nIHNyYz1cXFwiXCIgKyByZXF1aXJlKFwiLi4vaW1hZ2VzL1lvdVR1YmUucG5nXCIpICsgXCJcXFwiIGFsdD1cXFwiWW91VHViZSB0dXRvcmlhbHNcXFwiLz5cXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IGdldExvY1N0cmluZygnc3VydmV5LmV4dGVybmFsSGVscExpbmsnKVxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgIDwvYT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtZW1wdHktbWVzc2FnZS1jb250YWluZXJcXFwiPlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtZW1wdHktbWVzc2FnZVxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBnZXRMb2NTdHJpbmcoJ3N1cnZleS5kcm9wUXVlc3Rpb24nKVxcXCI+PC9kaXY+XFxuICAgICAgICAgIDxpbWcgc3JjPVxcXCJcIiArIHJlcXVpcmUoXCIuLi9pbWFnZXMvc3RhcnQtZGVzaWduaW5nLWZvcm0uc3ZnXCIpICsgXCJcXFwiIGFsdD1cXFwiRHJvcCBxdWVzdGlvbnMgaGVyZVxcXCIgc3R5bGU9XFxcIndpZHRoOiAzMDBweDsgaGVpZ2h0OiAzMDBweFxcXCIvPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8L2Rpdj5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN2ZC10b29sYmFyLW9wdGlvbnNcXFwiPlxcbiAgPGRpdiBjbGFzcz1cXFwiZGRtZW51LWNvbnRhaW5lciB0b29sYmFyLW9wdGlvbnMgYnRuLWdyb3VwIGlubGluZVxcXCI+XFxuICAgICAgPGRpdiBzdHlsZT1cXFwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsMClcXFwiIGRhdGEtYmluZD1cXFwidHJ1ZWNsaWNrXFxcIj48L2Rpdj5cXG5cXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJkZG1lbnVcXFwiPlxcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiYnRuIHN2LWJ0biBidG4tcHJpbWFyeVxcXCIgdGFiaW5kZXg9XFxcIjBcXFwiPlxcbiAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiB0aXRsZVxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNhcmV0XFxcIj48L3NwYW4+XFxuICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgPGRpdiB0YWJpbmRleD1cXFwiMFxcXCIgZGF0YS1iaW5kPVxcXCJ0cnVlY2xpY2tcXFwiPjwvZGl2PlxcbiAgICAgICAgICA8dWwgY2xhc3M9XFxcInN2ZC1saWdodC1iZy1jb2xvclxcXCI+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IGl0ZW1zIC0tPlxcbiAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cXFwiY3NzOiAkZGF0YS5jc3NcXFwiPlxcbiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XFxcIiNcXFwiIGRhdGEtYmluZD1cXFwiY2xpY2s6IGFjdGlvbiwgdGV4dDogdGl0bGVcXFwiPjwvYT5cXG4gICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC91bD5cXG4gICAgICA8L2Rpdj5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3ZkLXRvb2xiYXItc3RhdGVcXFwiPlxcbiAgPHNwYW4gY2xhc3M9XFxcImljb25cXFwiPlxcbiAgICAgIDxzdmctaWNvbiBjbGFzcz1cXFwiaWNvbi1zdGF0dXNcXFwiIHBhcmFtcz1cXFwiaWNvbk5hbWU6IGlubmVyQ3NzLCBzaXplOiAyNFxcXCI+PC9zdmctaWNvbj5cXG4gIDwvc3Bhbj5cXG4gIDxzcGFuIGNsYXNzPVxcXCJzdmQtbGlnaHQtdGV4dC1jb2xvclxcXCIgZGF0YS1iaW5kPVxcXCJ0ZXh0OiB0aXRsZVxcXCI+PC9zcGFuPlxcbjwvc2NyaXB0PlwiOyIsImltcG9ydCB7IFN1cnZleUpTT041IH0gZnJvbSBcIi4vanNvbjVcIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5cbmNsYXNzIFN1cnZleUZvclRleHRXb3JrZXIgZXh0ZW5kcyBTdXJ2ZXkuU3VydmV5IHtcbiAgY29uc3RydWN0b3IoanNvbk9iajogYW55KSB7XG4gICAgc3VwZXIoanNvbk9iaik7XG4gIH1cbiAgcHVibGljIGdldCBpc0Rlc2lnbk1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVRleHRXb3JrZXIge1xuICBwdWJsaWMgc3RhdGljIG5ld0xpbmVDaGFyOiBzdHJpbmc7XG4gIHB1YmxpYyBlcnJvcnM6IEFycmF5PGFueT47XG4gIHByaXZhdGUgc3VydmV5VmFsdWU6IFN1cnZleS5TdXJ2ZXk7XG4gIHByaXZhdGUganNvblZhbHVlOiBhbnk7XG4gIHByaXZhdGUgc3VydmV5T2JqZWN0czogQXJyYXk8YW55PjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnRleHQgfHwgdGhpcy50ZXh0LnRyaW0oKSA9PSBcIlwiKSB7XG4gICAgICB0aGlzLnRleHQgPSBcInt9XCI7XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgdGhpcy5wcm9jZXNzKCk7XG4gIH1cbiAgcHVibGljIGdldCBzdXJ2ZXkoKTogU3VydmV5LlN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5VmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBpc0pzb25Db3JyZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN1cnZleVZhbHVlICE9IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIHByb2Nlc3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuanNvblZhbHVlID0gbmV3IFN1cnZleUpTT041KDEpLnBhcnNlKHRoaXMudGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goe1xuICAgICAgICBwb3M6IHsgc3RhcnQ6IGVycm9yLmF0LCBlbmQ6IC0xIH0sXG4gICAgICAgIHRleHQ6IGVycm9yLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5qc29uVmFsdWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy51cGRhdGVKc29uUG9zaXRpb25zKHRoaXMuanNvblZhbHVlKTtcbiAgICAgIHZhciBwdXJlSnNvblZhbHVlID0gbmV3IFN1cnZleUpTT041KCkucGFyc2UodGhpcy50ZXh0KTtcbiAgICAgIHRoaXMuc3VydmV5VmFsdWUgPSBuZXcgU3VydmV5Rm9yVGV4dFdvcmtlcihwdXJlSnNvblZhbHVlKTtcbiAgICAgIGlmICh0aGlzLnN1cnZleVZhbHVlLmpzb25FcnJvcnMgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3VydmV5VmFsdWUuanNvbkVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBlcnJvciA9IHRoaXMuc3VydmV5VmFsdWUuanNvbkVycm9yc1tpXTtcbiAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIHBvczogeyBzdGFydDogZXJyb3IuYXQsIGVuZDogLTEgfSxcbiAgICAgICAgICAgIHRleHQ6IGVycm9yLmdldEZ1bGxEZXNjcmlwdGlvbigpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdXJ2ZXlPYmplY3RzID0gdGhpcy5jcmVhdGVTdXJ2ZXlPYmplY3RzKCk7XG4gICAgdGhpcy5zZXRFZGl0b3JQb3NpdGlvbkJ5Q2hhcnRBdCh0aGlzLnN1cnZleU9iamVjdHMpO1xuICAgIHRoaXMuc2V0RWRpdG9yUG9zaXRpb25CeUNoYXJ0QXQodGhpcy5lcnJvcnMpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlSnNvblBvc2l0aW9ucyhqc29uT2JqOiBhbnkpIHtcbiAgICBqc29uT2JqW1wicG9zXCJdW1wic2VsZlwiXSA9IGpzb25PYmo7XG4gICAgZm9yICh2YXIga2V5IGluIGpzb25PYmopIHtcbiAgICAgIHZhciBvYmogPSBqc29uT2JqW2tleV07XG4gICAgICBpZiAob2JqICYmIG9ialtcInBvc1wiXSkge1xuICAgICAgICBqc29uT2JqW1wicG9zXCJdW2tleV0gPSBvYmpbXCJwb3NcIl07XG4gICAgICAgIHRoaXMudXBkYXRlSnNvblBvc2l0aW9ucyhvYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGNyZWF0ZVN1cnZleU9iamVjdHMoKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGlmICh0aGlzLnN1cnZleVZhbHVlID09IG51bGwpIHJldHVybiByZXN1bHQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1cnZleVZhbHVlLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMuc3VydmV5VmFsdWUucGFnZXNbaV07XG4gICAgICBpZiAoaSA9PSAwICYmICFwYWdlW1wicG9zXCJdKSB7XG4gICAgICAgIHBhZ2VbXCJwb3NcIl0gPSB0aGlzLnN1cnZleVZhbHVlW1wicG9zXCJdO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2gocGFnZSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBhZ2UucXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHBhZ2UucXVlc3Rpb25zW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIHNldEVkaXRvclBvc2l0aW9uQnlDaGFydEF0KG9iamVjdHM6IGFueVtdKSB7XG4gICAgaWYgKG9iamVjdHMgPT0gbnVsbCB8fCBvYmplY3RzLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgdmFyIHBvc2l0aW9uID0geyByb3c6IDAsIGNvbHVtbjogMCB9O1xuICAgIHZhciBhdE9iamVjdHNBcnJheSA9IHRoaXMuZ2V0QXRBcnJheShvYmplY3RzKTtcbiAgICB2YXIgc3RhcnRBdDogbnVtYmVyID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0T2JqZWN0c0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYXQgPSBhdE9iamVjdHNBcnJheVtpXS5hdDtcbiAgICAgIHBvc2l0aW9uID0gdGhpcy5nZXRQb3N0aW9uQnlDaGFydEF0KHBvc2l0aW9uLCBzdGFydEF0LCBhdCk7XG4gICAgICB2YXIgb2JqID0gYXRPYmplY3RzQXJyYXlbaV0ub2JqO1xuICAgICAgaWYgKCFvYmoucG9zaXRpb24pIG9iai5wb3NpdGlvbiA9IHt9O1xuICAgICAgaWYgKGF0ID09IG9iai5wb3Muc3RhcnQpIHtcbiAgICAgICAgb2JqLnBvc2l0aW9uLnN0YXJ0ID0gcG9zaXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoYXQgPT0gb2JqLnBvcy5lbmQpIHtcbiAgICAgICAgICBvYmoucG9zaXRpb24uZW5kID0gcG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0YXJ0QXQgPSBhdDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRQb3N0aW9uQnlDaGFydEF0KFxuICAgIHN0YXJ0UG9zaXRpb246IGFueSxcbiAgICBzdGFydEF0OiBudW1iZXIsXG4gICAgYXQ6IG51bWJlclxuICApOiBhbnkge1xuICAgIHZhciByZXN1bHQgPSB7IHJvdzogc3RhcnRQb3NpdGlvbi5yb3csIGNvbHVtbjogc3RhcnRQb3NpdGlvbi5jb2x1bW4gfTtcbiAgICB2YXIgY3VyQ2hhciA9IHN0YXJ0QXQ7XG4gICAgd2hpbGUgKGN1ckNoYXIgPCBhdCkge1xuICAgICAgaWYgKHRoaXMudGV4dC5jaGFyQXQoY3VyQ2hhcikgPT0gU3VydmV5VGV4dFdvcmtlci5uZXdMaW5lQ2hhcikge1xuICAgICAgICByZXN1bHQucm93Kys7XG4gICAgICAgIHJlc3VsdC5jb2x1bW4gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmNvbHVtbisrO1xuICAgICAgfVxuICAgICAgY3VyQ2hhcisrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgZ2V0QXRBcnJheShvYmplY3RzOiBhbnlbXSk6IGFueVtdIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgb2JqID0gb2JqZWN0c1tpXTtcbiAgICAgIHZhciBwb3MgPSBvYmoucG9zO1xuICAgICAgaWYgKCFwb3MpIGNvbnRpbnVlO1xuICAgICAgcmVzdWx0LnB1c2goeyBhdDogcG9zLnN0YXJ0LCBvYmo6IG9iaiB9KTtcbiAgICAgIGlmIChwb3MuZW5kID4gMCkge1xuICAgICAgICByZXN1bHQucHVzaCh7IGF0OiBwb3MuZW5kLCBvYmo6IG9iaiB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KChlbDEsIGVsMikgPT4ge1xuICAgICAgaWYgKGVsMS5hdCA+IGVsMi5hdCkgcmV0dXJuIDE7XG4gICAgICBpZiAoZWwxLmF0IDwgZWwyLmF0KSByZXR1cm4gLTE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgKiBhcyBTdXJ2ZXkgZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuaW1wb3J0IHsgSUFjdGlvbiB9IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IENyZWF0b3JCYXNlIH0gZnJvbSBcIi4vY3JlYXRvci1iYXNlXCI7XG5pbXBvcnQgeyBlZGl0b3JMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcblxuLyoqXG4gKiBUaGUgVG9vbGJveCBpdGVtIGRlc2NyaXB0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElRdWVzdGlvblRvb2xib3hJdGVtIGV4dGVuZHMgSUFjdGlvbiB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBuYW1lXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJY29uIG5hbWVcbiAgICovXG4gIGljb25OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgSlNPTiB0aGF0IHVzZWQgdG8gY3JlYXRlIGEgbmV3IHF1ZXN0aW9uL3BhbmVsLiBUaGUgJ3R5cGUnIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIGpzb246IGFueTtcbiAgLyoqXG4gICAqIFRvb2xib3ggaXRlbSB0aXRsZVxuICAgKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRvb2xib3ggaXRlbSB0b29sdGlwLiBJdCBlcXVhbHMgdG8gdGl0bGUgaWYgaXQgaXMgZW1wdHlcbiAgICovXG4gIHRvb2x0aXA/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUcnVlLCBpZiBhbiBlbmQgdXNlciBhZGRlZCB0aGlzIGl0ZW0gaW50byBUb29sYm94IGZyb20gdGhlIHN1cnZleS5cbiAgICovXG4gIGlzQ29waWVkOiBib29sZWFuO1xuICAvKipcbiAgICogVG9vbGJveCBpdGVtIGNhdGVnb3J5LiBJZiBpdCBpcyBlbXB0eSwgaXQgZ29lcyB0byAnR2VuZXJhbCcgY2F0ZWdvcnkuXG4gICAqL1xuICBjYXRlZ29yeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0IG9mIFRvb2xib3ggaXRlbXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblRvb2xib3gge1xuICBwcml2YXRlIF9vcmRlcmVkUXVlc3Rpb25zID0gW1xuICAgIFwidGV4dFwiLFxuICAgIFwiY2hlY2tib3hcIixcbiAgICBcInJhZGlvZ3JvdXBcIixcbiAgICBcImRyb3Bkb3duXCIsXG4gICAgXCJjb21tZW50XCIsXG4gICAgXCJyYXRpbmdcIixcbiAgICBcInJhbmtpbmdcIixcbiAgICBcImltYWdlcGlja2VyXCIsXG4gICAgXCJib29sZWFuXCIsXG4gICAgXCJpbWFnZVwiLFxuICAgIFwiaHRtbFwiLFxuICAgIFwic2lnbmF0dXJlcGFkXCIsXG4gIF07XG5cbiAgcHJpdmF0ZSBfcXVlc3Rpb25EZWZhdWx0U2V0dGluZ3MgPSB7XG4gICAgaW1hZ2VwaWNrZXI6ICgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogXCJsaW9uXCIsXG4gICAgICAgICAgICBpbWFnZUxpbms6XG4gICAgICAgICAgICAgIFwiaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Db250ZW50L0ltYWdlcy9leGFtcGxlcy9pbWFnZS1waWNrZXIvbGlvbi5qcGdcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcImdpcmFmZmVcIixcbiAgICAgICAgICAgIGltYWdlTGluazpcbiAgICAgICAgICAgICAgXCJodHRwczovL3N1cnZleWpzLmlvL0NvbnRlbnQvSW1hZ2VzL2V4YW1wbGVzL2ltYWdlLXBpY2tlci9naXJhZmZlLmpwZ1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6IFwicGFuZGFcIixcbiAgICAgICAgICAgIGltYWdlTGluazpcbiAgICAgICAgICAgICAgXCJodHRwczovL3N1cnZleWpzLmlvL0NvbnRlbnQvSW1hZ2VzL2V4YW1wbGVzL2ltYWdlLXBpY2tlci9wYW5kYS5qcGdcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiBcImNhbWVsXCIsXG4gICAgICAgICAgICBpbWFnZUxpbms6XG4gICAgICAgICAgICAgIFwiaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Db250ZW50L0ltYWdlcy9leGFtcGxlcy9pbWFnZS1waWNrZXIvY2FtZWwuanBnXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBpbWFnZTogKCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW1hZ2VMaW5rOlxuICAgICAgICAgIFwiaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Db250ZW50L0ltYWdlcy9leGFtcGxlcy9pbWFnZS1waWNrZXIvbGlvbi5qcGdcIixcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcblxuICAvKipcbiAgICogTW9kaWZ5IHRoaXMgYXJyYXkgdG8gY2hhbmdlIHRoZSB0b29sYm94IGl0ZW1zIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBvcmRlcmVkUXVlc3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9vcmRlcmVkUXVlc3Rpb25zO1xuICB9XG4gIHB1YmxpYyBzZXQgb3JkZXJlZFF1ZXN0aW9ucyhxdWVzdGlvbnMpIHtcbiAgICB0aGlzLl9vcmRlcmVkUXVlc3Rpb25zID0gcXVlc3Rpb25zO1xuICAgIHRoaXMucmVvcmRlckl0ZW1zKCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb3BpZWQgdG9vbGJveCBpdGVtcy4gSWYgYW4gdXNlciBhZGRpbmcgY29waWVkSXRlbU1heENvdW50ICsgMSBpdGVtLCB0aGUgZmlyc3QgYWRkZWQgaXRlbSB3aWxsIGJlIHJlbW92ZWQuXG4gICAqL1xuICBwdWJsaWMgY29waWVkSXRlbU1heENvdW50OiBudW1iZXIgPSAzO1xuICBwcml2YXRlIGFsbG93RXhwYW5kTXVsdGlwbGVDYXRlZ29yaWVzVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBrZWVwQWxsQ2F0ZWdvcmllc0V4cGFuZGVkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpdGVtc1ZhbHVlOiBBcnJheTxJUXVlc3Rpb25Ub29sYm94SXRlbT4gPSBbXTtcblxuICBrb0l0ZW1zID0ga28ub2JzZXJ2YWJsZUFycmF5KCk7XG4gIGtvQ2F0ZWdvcmllcyA9IGtvLm9ic2VydmFibGVBcnJheSgpO1xuICBrb0FjdGl2ZUNhdGVnb3J5ID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcbiAga29IYXNDYXRlZ29yaWVzID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gIGtvQ2FuQ29sbGFwc2VDYXRlZ29yaWVzID0ga28ub2JzZXJ2YWJsZSh0cnVlKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdXBwb3J0ZWRRdWVzdGlvbnM6IEFycmF5PHN0cmluZz4gPSBudWxsLFxuICAgIHB1YmxpYyBjcmVhdG9yOiBDcmVhdG9yQmFzZTxTdXJ2ZXkuU3VydmV5PiA9IG51bGxcbiAgKSB7XG4gICAgdGhpcy5jcmVhdGVEZWZhdWx0SXRlbXMoc3VwcG9ydGVkUXVlc3Rpb25zKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0FjdGl2ZUNhdGVnb3J5LnN1YnNjcmliZShmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5rb0NhdGVnb3JpZXMoKS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2F0ZWdvcnkgPSBzZWxmLmtvQ2F0ZWdvcmllcygpW2ldO1xuICAgICAgICAoPGFueT5jYXRlZ29yeSkua29Db2xsYXBzZWQoKDxhbnk+Y2F0ZWdvcnkpLm5hbWUgIT09IG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogVGhlIEFycmF5IG9mIFRvb2xib3ggaXRlbXMgYXMgVGV4dCBKU09OLlxuICAgKi9cbiAgcHVibGljIGdldCBqc29uVGV4dCgpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5pdGVtc1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGpzb25UZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLml0ZW1zVmFsdWUgPSB2YWx1ZSA/IEpTT04ucGFyc2UodmFsdWUpIDogW107XG4gICAgdGhpcy5vbkl0ZW1zQ2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgQXJyYXkgb2YgY29waWVkIFRvb2xib3ggaXRlbXMgYXMgVGV4dCBKU09OLlxuICAgKi9cbiAgcHVibGljIGdldCBjb3BpZWRKc29uVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmNvcGllZEl0ZW1zKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvcGllZEpzb25UZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YXIgbmV3SXRlbXMgPSB2YWx1ZSA/IEpTT04ucGFyc2UodmFsdWUpIDogW107XG4gICAgdGhpcy5jbGVhckNvcGllZEl0ZW1zKCk7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG5ld0l0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuZXdJdGVtc1tpXS5pc0NvcGllZCA9IHRydWU7XG4gICAgICB0aGlzLmFkZEl0ZW0obmV3SXRlbXNbaV0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIEFycmF5IG9mIFRvb2xib3ggaXRlbXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IEFycmF5PElRdWVzdGlvblRvb2xib3hJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGl0ZW1OYW1lcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKHRoaXMuaXRlbXNbaV0ubmFtZSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBBcnJheSBvZiBjb3BpZWQgVG9vbGJveCBpdGVtc1xuICAgKi9cbiAgcHVibGljIGdldCBjb3BpZWRJdGVtcygpOiBBcnJheTxJUXVlc3Rpb25Ub29sYm94SXRlbT4ge1xuICAgIGNvbnN0IHJlc3VsdDogSVF1ZXN0aW9uVG9vbGJveEl0ZW1bXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLml0ZW1zVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLml0ZW1zVmFsdWVbaV0uaXNDb3BpZWQpIHJlc3VsdC5wdXNoKHRoaXMuaXRlbXNWYWx1ZVtpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCB0b29sYm94IGl0ZW1zIGludG8gdGhlIFRvb2xib3hcbiAgICogQHBhcmFtIGl0ZW1zIHRoZSBsaXN0IG9mIG5ldyBpdGVtc1xuICAgKiBAcGFyYW0gY2xlYXJBbGwgc2V0IGl0IHRvIHRydWUgdG8gY2xlYXIgYWxsIHByZXZpb3VzIGl0ZW1zLlxuICAgKi9cbiAgcHVibGljIGFkZEl0ZW1zKFxuICAgIGl0ZW1zOiBBcnJheTxJUXVlc3Rpb25Ub29sYm94SXRlbT4sXG4gICAgY2xlYXJBbGw6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICBpZiAoY2xlYXJBbGwpIHtcbiAgICAgIHRoaXMuY2xlYXJJdGVtcygpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNWYWx1ZS5wdXNoKGl0ZW1zW2ldKTtcbiAgICB9XG4gICAgdGhpcy5vbkl0ZW1zQ2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBjb3BpZWQgUXVlc3Rpb24gaW50byBUb29sYm94XG4gICAqIEBwYXJhbSBxdWVzdGlvbiBhIGNvcGllZCBTdXJ2ZXkuUXVlc3Rpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgYSBqc29uIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgcXVlc3Rpb24gcHJvcGVydGllcy4gQXR0cmlidXRlcyBhcmU6IG5hbWUsIHRpdGxlLCB0b29sdGlwLCBpc0NvcGllZCwgaWNvbk5hbWUsIGpzb24gYW5kIGNhdGVnb3J5LlxuICAgKi9cbiAgcHVibGljIGFkZENvcGllZEl0ZW0ocXVlc3Rpb246IFN1cnZleS5RdWVzdGlvbiwgb3B0aW9uczogYW55ID0gbnVsbCkge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9ICEhb3B0aW9ucy5uYW1lID8gb3B0aW9ucy5uYW1lIDogcXVlc3Rpb24ubmFtZTtcbiAgICBjb25zdCB0aXRsZTogc3RyaW5nID0gISFvcHRpb25zLnRpdGxlID8gb3B0aW9ucy50aXRsZSA6IG5hbWU7XG4gICAgY29uc3QgdG9vbHRpcDogc3RyaW5nID0gISFvcHRpb25zLnRvb2x0aXAgPyBvcHRpb25zLnRvb2x0aXAgOiB0aXRsZTtcbiAgICBjb25zdCBpdGVtOiBJUXVlc3Rpb25Ub29sYm94SXRlbSA9IHtcbiAgICAgIGlkOiBuYW1lLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHRvb2x0aXAsXG4gICAgICBpc0NvcGllZDogb3B0aW9ucy5pc0NvcGllZCAhPT0gZmFsc2UsXG4gICAgICBpY29uTmFtZTogISFvcHRpb25zLmljb25OYW1lID8gb3B0aW9ucy5pY29uTmFtZSA6IFwiaWNvbi1kZWZhdWx0XCIsXG4gICAgICBqc29uOiAhIW9wdGlvbnMuanNvbiA/IG9wdGlvbnMuanNvbiA6IHRoaXMuZ2V0UXVlc3Rpb25KU09OKHF1ZXN0aW9uKSxcbiAgICAgIGNhdGVnb3J5OiAhIW9wdGlvbnMuY2F0ZWdvcnkgPyBvcHRpb25zLmNhdGVnb3J5IDogXCJcIixcbiAgICB9O1xuICAgIGlmICh0aGlzLnJlcGxhY2VJdGVtKGl0ZW0pKSByZXR1cm47XG4gICAgY29uc3QgY29waWVkOiBJUXVlc3Rpb25Ub29sYm94SXRlbVtdID0gdGhpcy5jb3BpZWRJdGVtcztcbiAgICBpZiAodGhpcy5jb3BpZWRJdGVtTWF4Q291bnQgPiAwICYmIGNvcGllZC5sZW5ndGggPT0gdGhpcy5jb3BpZWRJdGVtTWF4Q291bnQpXG4gICAgICB0aGlzLnJlbW92ZUl0ZW0oY29waWVkW3RoaXMuY29waWVkSXRlbU1heENvdW50IC0gMV0ubmFtZSk7XG4gICAgdGhpcy5hZGRJdGVtKGl0ZW0pO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSB0b29sYm94IGl0ZW1cbiAgICogQHBhcmFtIGl0ZW0gdGhlIHRvb2xib3ggaXRlbSBkZXNjcmlwdGlvblxuICAgKiBAcGFyYW0gaW5kZXggdGhlIHRvb2xib3ggaW5kZXggdG8gcGxhY2UgdGhlIGl0ZW0sIHRoZSBpdGVtIGlzIGFkZGVkIHRvIHRoZSBlbmQgaWYgaW5kZXggbm90IHBhc3NlZFxuICAgKiBAc2VlIElRdWVzdGlvblRvb2xib3hJdGVtXG4gICAqL1xuICBwdWJsaWMgYWRkSXRlbShpdGVtOiBJUXVlc3Rpb25Ub29sYm94SXRlbSwgaW5kZXg/OiBudW1iZXIpIHtcbiAgICB0aGlzLmNvcnJlY3RJdGVtKGl0ZW0pO1xuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLml0ZW1zVmFsdWUucHVzaChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pdGVtc1ZhbHVlLnNwbGljZShpbmRleCwgMCwgaXRlbSk7XG4gICAgfVxuICAgIHRoaXMub25JdGVtc0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIGNvcnJlY3RJdGVtKGl0ZW06IElRdWVzdGlvblRvb2xib3hJdGVtKSB7XG4gICAgaWYgKCFpdGVtLnRpdGxlKSBpdGVtLnRpdGxlID0gaXRlbS5uYW1lO1xuICAgIGlmICghaXRlbS50b29sdGlwKSBpdGVtLnRvb2x0aXAgPSBpdGVtLnRpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgdG9vbGJveCBpdGVtLCBhZGQgZGVsZXRlIHRoZSBvbGQgaXRlbSB3aXRoIHRoZSBzYW1lIG5hbWVcbiAgICogQHBhcmFtIGl0ZW0gdGhlIHRvb2xib3ggaXRlbSBkZXNjcmlwdGlvblxuICAgKiBAc2VlIElRdWVzdGlvblRvb2xib3hJdGVtXG4gICAqL1xuICBwdWJsaWMgcmVwbGFjZUl0ZW0oaXRlbTogSVF1ZXN0aW9uVG9vbGJveEl0ZW0pOiBib29sZWFuIHtcbiAgICB0aGlzLmNvcnJlY3RJdGVtKGl0ZW0pO1xuICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSB0aGlzLmluZGV4T2YoaXRlbS5uYW1lKTtcbiAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG4gICAgdGhpcy5pdGVtc1ZhbHVlW2luZGV4XSA9IGl0ZW07XG4gICAgdGhpcy5vbkl0ZW1zQ2hhbmdlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgYSB0b29sYm94IGl0ZW0gYnkgaXRzIG5hbWVcbiAgICogQHBhcmFtIG5hbWUgdG9vbGJveCBpdGVtIG5hbWVcbiAgICogQHNlZSBJUXVlc3Rpb25Ub29sYm94SXRlbVxuICAgKi9cbiAgcHVibGljIHJlbW92ZUl0ZW0obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5kZXg6IG51bWJlciA9IHRoaXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5pdGVtc1ZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5vbkl0ZW1zQ2hhbmdlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIHRvb2xib3ggaXRlbXMuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJJdGVtcygpIHtcbiAgICB0aGlzLml0ZW1zVmFsdWUgPSBbXTtcbiAgICB0aGlzLm9uSXRlbXNDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgY29waWVkIHRvb2xib3ggaXRlbXMuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJDb3BpZWRJdGVtcygpIHtcbiAgICBjb25zdCByZW1vdmVkSXRlbXM6IElRdWVzdGlvblRvb2xib3hJdGVtW10gPSB0aGlzLmNvcGllZEl0ZW1zO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByZW1vdmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucmVtb3ZlSXRlbShyZW1vdmVkSXRlbXNbaV0ubmFtZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRvb2xib3ggaXRlbSBieSBpdHMgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHRvb2xib3ggaXRlbSB3aXRoIHRoaXMgbmFtZVxuICAgKiBAcGFyYW0gbmFtZVxuICAgKi9cbiAgcHVibGljIGdldEl0ZW1CeU5hbWUobmFtZTogc3RyaW5nKTogSVF1ZXN0aW9uVG9vbGJveEl0ZW0ge1xuICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSB0aGlzLmluZGV4T2YobmFtZSk7XG4gICAgcmV0dXJuIGluZGV4ID4gLTEgPyB0aGlzLml0ZW1zVmFsdWVbaW5kZXhdIDogbnVsbDtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIGFsbG93IGVuZC11c2VyIHRvIGV4cGFuZCBtb3JlIHRoYW4gb25lIGNhdGVnb3J5LiBUaGVyZSB3aWxsIG5vIGFjdGl2ZSBjYXRlZ29yeSBpbiB0aGlzIGNhc2VcbiAgICogQHNlZSBhY3RpdmVDYXRlZ29yeVxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0V4cGFuZE11bHRpcGxlQ2F0ZWdvcmllcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbGxvd0V4cGFuZE11bHRpcGxlQ2F0ZWdvcmllc1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dFeHBhbmRNdWx0aXBsZUNhdGVnb3JpZXModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5hbGxvd0V4cGFuZE11bHRpcGxlQ2F0ZWdvcmllc1ZhbHVlID0gdmFsO1xuICAgIHRoaXMudXBkYXRlQ2F0ZWdvcmllc1N0YXRlKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIHRvIGV4cGFuZCBhbGwgY2F0ZWdvcmllcyBhbmQgaGlkZSBleHBhbmQvY29sbGFwc2UgY2F0ZWdvcnkgYnV0dG9uc1xuICAgKi9cbiAgcHVibGljIGdldCBrZWVwQWxsQ2F0ZWdvcmllc0V4cGFuZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmtlZXBBbGxDYXRlZ29yaWVzRXhwYW5kZWRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGtlZXBBbGxDYXRlZ29yaWVzRXhwYW5kZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5rZWVwQWxsQ2F0ZWdvcmllc0V4cGFuZGVkVmFsdWUgPSB2YWw7XG4gICAgdGhpcy5rb0NhbkNvbGxhcHNlQ2F0ZWdvcmllcyghdGhpcy5rZWVwQWxsQ2F0ZWdvcmllc0V4cGFuZGVkKTtcbiAgICB0aGlzLnVwZGF0ZUNhdGVnb3JpZXNTdGF0ZSgpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQ2F0ZWdvcmllc1N0YXRlKCkge1xuICAgIHZhciBub0FjdGl2ZSA9XG4gICAgICB0aGlzLmFsbG93RXhwYW5kTXVsdGlwbGVDYXRlZ29yaWVzIHx8IHRoaXMua2VlcEFsbENhdGVnb3JpZXNFeHBhbmRlZDtcbiAgICBpZiAobm9BY3RpdmUpIHtcbiAgICAgIHRoaXMuYWN0aXZlQ2F0ZWdvcnkgPSBcIlwiO1xuICAgICAgaWYgKHRoaXMua2VlcEFsbENhdGVnb3JpZXNFeHBhbmRlZCkge1xuICAgICAgICB0aGlzLmV4cGFuZEFsbENhdGVnb3JpZXMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMua29DYXRlZ29yaWVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmFjdGl2ZUNhdGVnb3J5ID0gKDxhbnk+dGhpcy5rb0NhdGVnb3JpZXMoKVswXSkubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBjYXRlZ29yeSBvZiB0aGUgdG9vbGJveCBpdGVtXG4gICAqIEBwYXJhbSBuYW1lIHRoZSB0b29sYm94IGl0ZW0gbmFtZVxuICAgKiBAcGFyYW0gY2F0ZWdvcnkgbmV3IGNhdGVnb3J5IG5hbWVcbiAgICovXG4gIHB1YmxpYyBjaGFuZ2VDYXRlZ29yeShuYW1lOiBzdHJpbmcsIGNhdGVnb3J5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmNoYW5nZUNhdGVnb3JpZXMoW3sgbmFtZTogbmFtZSwgY2F0ZWdvcnk6IGNhdGVnb3J5IH1dKTtcbiAgfVxuICAvKipcbiAgICogQ2hhbmdlIGNhdGVnb3JpZXMgZm9yIHNldmVyYWwgdG9vbGJveCBpdGVtcy5cbiAgICogQHBhcmFtIGNoYW5nZWRJdGVtcyB0aGUgYXJyYXkgb2Ygb2JqZWN0cyB7bmFtZTogXCJ5b3VyIHRvb2xib3ggaXRlbSBuYW1lXCIsIGNhdGVnb3J5OiBcIm5ldyBjYXRlZ29yeSBuYW1lXCJ9XG4gICAqL1xuICBwdWJsaWMgY2hhbmdlQ2F0ZWdvcmllcyhjaGFuZ2VkSXRlbXM6IEFycmF5PGFueT4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZWRJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSBjaGFuZ2VkSXRlbXNbaV07XG4gICAgICB2YXIgdG9vbGJveEl0ZW0gPSB0aGlzLmdldEl0ZW1CeU5hbWUoaXRlbS5uYW1lKTtcbiAgICAgIGlmICh0b29sYm94SXRlbSkge1xuICAgICAgICB0b29sYm94SXRlbS5jYXRlZ29yeSA9IGl0ZW0uY2F0ZWdvcnk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25JdGVtc0NoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGFuZCBnZXQgYW5kIGFjdGl2ZSBjYXRlZ29yeS4gVGhpcyBwcm9wZXJ0eSBkb2Vzbid0IHdvcmsgaWYgYWxsb3dFeHBhbmRNdWx0aXBsZUNhdGVnb3JpZXMgaXMgdHJ1ZS4gSXRzIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIEBzZWUgYWxsb3dFeHBhbmRNdWx0aXBsZUNhdGVnb3JpZXNcbiAgICogQHNlZSBleHBhbmRDYXRlZ29yeVxuICAgKiBAc2VlIGNvbGxhcHNlQ2F0ZWdvcnlcbiAgICovXG4gIHB1YmxpYyBnZXQgYWN0aXZlQ2F0ZWdvcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rb0FjdGl2ZUNhdGVnb3J5KCk7XG4gIH1cbiAgcHVibGljIHNldCBhY3RpdmVDYXRlZ29yeSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMua29BY3RpdmVDYXRlZ29yeSh2YWwpO1xuICB9XG4gIHByaXZhdGUgZG9DYXRlZ29yeUNsaWNrKGNhdGVnb3J5TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMua2VlcEFsbENhdGVnb3JpZXNFeHBhbmRlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmFsbG93RXhwYW5kTXVsdGlwbGVDYXRlZ29yaWVzKSB7XG4gICAgICB2YXIgY2F0ZWdvcnkgPSB0aGlzLmdldENhdGVnb3J5QnlOYW1lKGNhdGVnb3J5TmFtZSk7XG4gICAgICBpZiAoY2F0ZWdvcnkpIHtcbiAgICAgICAgY2F0ZWdvcnkua29Db2xsYXBzZWQoIWNhdGVnb3J5LmtvQ29sbGFwc2VkKCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZUNhdGVnb3J5ID0gY2F0ZWdvcnlOYW1lO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRXhwYW5kIGEgY2F0ZWdvcnkgYnkgaXRzIG5hbWUuIElmIGFsbG93RXhwYW5kTXVsdGlwbGVDYXRlZ29yaWVzIGlzIGZhbHNlIChkZWZhdWx0IHZhbHVlKSwgYWxsIG90aGVyIGNhdGVnb3JpZXMgYmVjb21lIGNvbGxhcHNlZFxuICAgKiBAcGFyYW0gY2F0ZWdvcnlOYW1lIHRoZSBjYXRlZ29yeSBuYW1lXG4gICAqIEBzZWUgYWxsb3dFeHBhbmRNdWx0aXBsZUNhdGVnb3JpZXNcbiAgICogQHNlZSBjb2xsYXBzZUNhdGVnb3J5XG4gICAqL1xuICBwdWJsaWMgZXhwYW5kQ2F0ZWdvcnkoY2F0ZWdvcnlOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5hbGxvd0V4cGFuZE11bHRpcGxlQ2F0ZWdvcmllcykge1xuICAgICAgdmFyIGNhdGVnb3J5ID0gdGhpcy5nZXRDYXRlZ29yeUJ5TmFtZShjYXRlZ29yeU5hbWUpO1xuICAgICAgaWYgKGNhdGVnb3J5KSB7XG4gICAgICAgIGNhdGVnb3J5LmtvQ29sbGFwc2VkKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmVDYXRlZ29yeSA9IGNhdGVnb3J5TmFtZTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENvbGxhcHNlIGEgY2F0ZWdvcnkgYnkgaXRzIG5hbWUuIElmIGFsbG93RXhwYW5kTXVsdGlwbGVDYXRlZ29yaWVzIGlzIGZhbHNlIChkZWZhdWx0IHZhbHVlKSB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZ1xuICAgKiBAcGFyYW0gY2F0ZWdvcnlOYW1lIHRoZSBjYXRlZ29yeSBuYW1lXG4gICAqIEBzZWUgYWxsb3dFeHBhbmRNdWx0aXBsZUNhdGVnb3JpZXNcbiAgICovXG4gIHB1YmxpYyBjb2xsYXBzZUNhdGVnb3J5KGNhdGVnb3J5TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmFsbG93RXhwYW5kTXVsdGlwbGVDYXRlZ29yaWVzKSByZXR1cm47XG4gICAgdmFyIGNhdGVnb3J5ID0gdGhpcy5nZXRDYXRlZ29yeUJ5TmFtZShjYXRlZ29yeU5hbWUpO1xuICAgIGlmIChjYXRlZ29yeSkge1xuICAgICAgY2F0ZWdvcnkua29Db2xsYXBzZWQodHJ1ZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBFeHBhbmQgYWxsIGNhdGVnb3JpZXMuIElmIGFsbG93RXhwYW5kTXVsdGlwbGVDYXRlZ29yaWVzIGlzIGZhbHNlIChkZWZhdWx0IHZhbHVlKSB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZ1xuICAgKiBAc2VlIGFsbG93RXhwYW5kTXVsdGlwbGVDYXRlZ29yaWVzXG4gICAqL1xuICBwdWJsaWMgZXhwYW5kQWxsQ2F0ZWdvcmllcygpIHtcbiAgICB0aGlzLmV4cGFuZENvbGxhcHNlQWxsQ2F0ZWdvcmllcyhmYWxzZSk7XG4gIH1cbiAgLyoqXG4gICAqIENvbGxhcHNlIGFsbCBjYXRlZ29yaWVzLiBJZiBhbGxvd0V4cGFuZE11bHRpcGxlQ2F0ZWdvcmllcyBpcyBmYWxzZSAoZGVmYXVsdCB2YWx1ZSkgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmdcbiAgICogQHNlZSBhbGxvd0V4cGFuZE11bHRpcGxlQ2F0ZWdvcmllc1xuICAgKi9cbiAgcHVibGljIGNvbGxhcHNlQWxsQ2F0ZWdvcmllcygpIHtcbiAgICB0aGlzLmV4cGFuZENvbGxhcHNlQWxsQ2F0ZWdvcmllcyh0cnVlKTtcbiAgfVxuICBwcml2YXRlIGV4cGFuZENvbGxhcHNlQWxsQ2F0ZWdvcmllcyhpc0NvbGxhcHNlZDogYm9vbGVhbikge1xuICAgIHZhciBjYXRlZ29yaWVzID0gdGhpcy5rb0NhdGVnb3JpZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICg8YW55PmNhdGVnb3JpZXNbaV0pLmtvQ29sbGFwc2VkKGlzQ29sbGFwc2VkKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRDYXRlZ29yeUJ5TmFtZShjYXRlZ29yeU5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgdmFyIGNhdGVnb3JpZXMgPSB0aGlzLmtvQ2F0ZWdvcmllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2F0ZWdvcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNhdGVnb3J5ID0gPGFueT5jYXRlZ29yaWVzW2ldO1xuICAgICAgaWYgKGNhdGVnb3J5Lm5hbWUgPT09IGNhdGVnb3J5TmFtZSkgcmV0dXJuIGNhdGVnb3J5O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25JdGVtc0NoYW5nZWQoKSB7XG4gICAgdGhpcy5rb0l0ZW1zKFtdKTtcbiAgICB0aGlzLmtvSXRlbXModGhpcy5pdGVtc1ZhbHVlKTtcbiAgICB2YXIgY2F0ZWdvcmllcyA9IFtdO1xuICAgIHZhciBjYXRlZ29yaWVzSGFzaCA9IHt9O1xuICAgIHZhciBwcmV2QWN0aXZlQ2F0ZWdvcnkgPSB0aGlzLmtvQWN0aXZlQ2F0ZWdvcnkoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5pdGVtc1ZhbHVlW2ldO1xuICAgICAgdmFyIGNhdGVnb3J5TmFtZSA9IGl0ZW0uY2F0ZWdvcnlcbiAgICAgICAgPyBpdGVtLmNhdGVnb3J5XG4gICAgICAgIDogZWRpdG9yTG9jYWxpemF0aW9uLmdldFN0cmluZyhcImVkLnRvb2xib3hHZW5lcmFsQ2F0ZWdvcnlcIik7XG4gICAgICBpZiAoIWNhdGVnb3JpZXNIYXNoW2NhdGVnb3J5TmFtZV0pIHtcbiAgICAgICAgdmFyIGNhdGVnb3J5ID0ge1xuICAgICAgICAgIG5hbWU6IGNhdGVnb3J5TmFtZSxcbiAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgICAga29Db2xsYXBzZWQ6IGtvLm9ic2VydmFibGUoXG4gICAgICAgICAgICBjYXRlZ29yeU5hbWUgIT09IHByZXZBY3RpdmVDYXRlZ29yeSAmJlxuICAgICAgICAgICAgICAhdGhpcy5rZWVwQWxsQ2F0ZWdvcmllc0V4cGFuZGVkXG4gICAgICAgICAgKSxcbiAgICAgICAgICBleHBhbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYuZG9DYXRlZ29yeUNsaWNrKHRoaXMubmFtZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY2F0ZWdvcmllc0hhc2hbY2F0ZWdvcnlOYW1lXSA9IGNhdGVnb3J5O1xuICAgICAgICBjYXRlZ29yaWVzLnB1c2goY2F0ZWdvcnkpO1xuICAgICAgfVxuICAgICAgY2F0ZWdvcmllc0hhc2hbY2F0ZWdvcnlOYW1lXS5pdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgICB0aGlzLmtvQ2F0ZWdvcmllcyhjYXRlZ29yaWVzKTtcbiAgICBpZiAoIXRoaXMua2VlcEFsbENhdGVnb3JpZXNFeHBhbmRlZCkge1xuICAgICAgaWYgKCF0aGlzLmFsbG93RXhwYW5kTXVsdGlwbGVDYXRlZ29yaWVzKSB7XG4gICAgICAgIGlmIChwcmV2QWN0aXZlQ2F0ZWdvcnkgJiYgY2F0ZWdvcmllc0hhc2hbcHJldkFjdGl2ZUNhdGVnb3J5XSkge1xuICAgICAgICAgIHRoaXMua29BY3RpdmVDYXRlZ29yeShwcmV2QWN0aXZlQ2F0ZWdvcnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMua29BY3RpdmVDYXRlZ29yeShcbiAgICAgICAgICAgIGNhdGVnb3JpZXMubGVuZ3RoID4gMCA/IGNhdGVnb3JpZXNbMF0ubmFtZSA6IFwiXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY2F0ZWdvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY2F0ZWdvcmllc1swXS5rb0NvbGxhcHNlZChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5rb0hhc0NhdGVnb3JpZXMoY2F0ZWdvcmllcy5sZW5ndGggPiAxKTtcbiAgfVxuICBwcml2YXRlIGluZGV4T2YobmFtZTogc3RyaW5nKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLml0ZW1zVmFsdWVbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gaTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHByaXZhdGUgcmVvcmRlckl0ZW1zKCkge1xuICAgIHRoaXMuaXRlbXNWYWx1ZS5zb3J0KChpMSwgaTIpID0+IHtcbiAgICAgIHZhciBpbmRleDEgPSB0aGlzLl9vcmRlcmVkUXVlc3Rpb25zLmluZGV4T2YoaTEubmFtZSk7XG4gICAgICBpZiAoaW5kZXgxID09PSAtMSkgaW5kZXgxID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgIHZhciBpbmRleDIgPSB0aGlzLl9vcmRlcmVkUXVlc3Rpb25zLmluZGV4T2YoaTIubmFtZSk7XG4gICAgICBpZiAoaW5kZXgyID09PSAtMSkgaW5kZXgyID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgIHJldHVybiBpbmRleDEgLSBpbmRleDI7XG4gICAgfSk7XG4gICAgdGhpcy5vbkl0ZW1zQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRGVmYXVsdEl0ZW1zKHN1cHBvcnRlZFF1ZXN0aW9uczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuY2xlYXJJdGVtcygpO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9uVHlwZXMoc3VwcG9ydGVkUXVlc3Rpb25zKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5hbWUgPSBxdWVzdGlvbnNbaV07XG4gICAgICB2YXIgcXVlc3Rpb24gPSBTdXJ2ZXkuRWxlbWVudEZhY3RvcnkuSW5zdGFuY2UuY3JlYXRlRWxlbWVudChuYW1lLCBcInExXCIpO1xuICAgICAgaWYgKCFxdWVzdGlvbikge1xuICAgICAgICBxdWVzdGlvbiA9IFN1cnZleS5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKG5hbWUpO1xuICAgICAgfVxuICAgICAgdmFyIGpzb24gPSB0aGlzLmdldFF1ZXN0aW9uSlNPTihxdWVzdGlvbik7XG4gICAgICB2YXIgdGl0bGUgPSBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicXQuXCIgKyBuYW1lKTtcbiAgICAgIGNvbnN0IGl0ZW06IElRdWVzdGlvblRvb2xib3hJdGVtID0ge1xuICAgICAgICBpZDogbmFtZSxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgaWNvbk5hbWU6IFwiaWNvbi1cIiArIG5hbWUsXG4gICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgdG9vbHRpcDogdGl0bGUsXG4gICAgICAgIGpzb246IGpzb24sXG4gICAgICAgIGlzQ29waWVkOiBmYWxzZSxcbiAgICAgICAgY2F0ZWdvcnk6IFwiXCIsXG4gICAgICB9O1xuICAgICAgdGhpcy5pdGVtc1ZhbHVlLnB1c2goaXRlbSk7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0ZXJDdXN0b21XaWRnZXRzKCk7XG4gICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudFF1ZXN0aW9ucygpO1xuICAgIHRoaXMub25JdGVtc0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIHJlZ2lzdGVyQ3VzdG9tV2lkZ2V0cygpIHtcbiAgICB2YXIgaW5zdCA9IFN1cnZleS5DdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlO1xuICAgIGlmICghaW5zdC5nZXRBY3RpdmF0ZWRCeSkgcmV0dXJuO1xuICAgIHZhciB3aWRnZXRzID0gaW5zdC53aWRnZXRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd2lkZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGluc3QuZ2V0QWN0aXZhdGVkQnkod2lkZ2V0c1tpXS5uYW1lKSAhPSBcImN1c3RvbXR5cGVcIikgY29udGludWU7XG4gICAgICB2YXIgd2lkZ2V0SnNvbiA9IHdpZGdldHNbaV0ud2lkZ2V0SnNvbjtcbiAgICAgIGlmICghd2lkZ2V0SnNvbi53aWRnZXRJc0xvYWRlZCB8fCAhd2lkZ2V0SnNvbi53aWRnZXRJc0xvYWRlZCgpKSBjb250aW51ZTtcbiAgICAgIHRoaXMuYWRkSXRlbUZyb21KU09OKHdpZGdldEpzb24pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHJlZ2lzdGVyQ29tcG9uZW50UXVlc3Rpb25zKCkge1xuICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0Q29tcG9uZW50SXRlbXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFkZEl0ZW1Gcm9tSlNPTihpdGVtc1tpXS5qc29uKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRDb21wb25lbnRJdGVtcygpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgaW5zdGFuY2VPd25lciA9IFN1cnZleVtcIkN1c3RvbVF1ZXN0aW9uQ29sbGVjdGlvblwiXTtcbiAgICBpZiAoIWluc3RhbmNlT3duZXIpIHtcbiAgICAgIGluc3RhbmNlT3duZXIgPSBTdXJ2ZXlbXCJDb21wb25lbnRDb2xsZWN0aW9uXCJdO1xuICAgIH1cbiAgICBpZiAoIWluc3RhbmNlT3duZXIpIHJldHVybiBbXTtcbiAgICB2YXIgaXRlbXMgPSBpbnN0YW5jZU93bmVyLkluc3RhbmNlW1wiaXRlbXNcIl07XG4gICAgcmV0dXJuICEhaXRlbXMgPyBpdGVtcyA6IFtdO1xuICB9XG4gIHByaXZhdGUgYWRkSXRlbUZyb21KU09OKGpzb246IGFueSkge1xuICAgIGNvbnN0IGljb25OYW1lOiBzdHJpbmcgPSBqc29uLmljb25OYW1lID8ganNvbi5pY29uTmFtZSA6IFwiaWNvbi1kZWZhdWx0XCI7XG4gICAgbGV0IHRpdGxlOiBzdHJpbmcgPSBlZGl0b3JMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicXQuXCIgKyBqc29uLm5hbWUpO1xuICAgIGlmICghdGl0bGUgfHwgdGl0bGUgPT0ganNvbi5uYW1lKSB7XG4gICAgICB0aXRsZSA9IGpzb24udGl0bGU7XG4gICAgfVxuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHRpdGxlID0ganNvbi5uYW1lO1xuICAgIH1cbiAgICB2YXIgZWxlbWVudEpzb24gPSBqc29uLmRlZmF1bHRKU09OID8ganNvbi5kZWZhdWx0SlNPTiA6IHt9O1xuICAgIGlmICghZWxlbWVudEpzb24udHlwZSkge1xuICAgICAgZWxlbWVudEpzb24udHlwZSA9IGpzb24ubmFtZTtcbiAgICB9XG4gICAgdmFyIGNhdGVnb3J5ID0ganNvbi5jYXRlZ29yeSA/IGpzb24uY2F0ZWdvcnkgOiBcIlwiO1xuICAgIGNvbnN0IGl0ZW06IElRdWVzdGlvblRvb2xib3hJdGVtID0ge1xuICAgICAgaWQ6IGpzb24ubmFtZSxcbiAgICAgIG5hbWU6IGpzb24ubmFtZSxcbiAgICAgIGljb25OYW1lOiBpY29uTmFtZSxcbiAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHRpdGxlLFxuICAgICAganNvbjogZWxlbWVudEpzb24sXG4gICAgICBpc0NvcGllZDogZmFsc2UsXG4gICAgICBjYXRlZ29yeTogY2F0ZWdvcnksXG4gICAgfTtcbiAgICB0aGlzLml0ZW1zVmFsdWUucHVzaChpdGVtKTtcbiAgfVxuICBwcml2YXRlIGdldFF1ZXN0aW9uSlNPTihxdWVzdGlvbjogYW55KTogYW55IHtcbiAgICB2YXIganNvbiA9IG5ldyBTdXJ2ZXkuSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdChxdWVzdGlvbik7XG4gICAganNvbi50eXBlID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIGlmICghIXRoaXMuX3F1ZXN0aW9uRGVmYXVsdFNldHRpbmdzW2pzb24udHlwZV0pIHtcbiAgICAgIHZhciBkZWZhdWx0U2V0dGluZ3MgPSB0aGlzLl9xdWVzdGlvbkRlZmF1bHRTZXR0aW5nc1tqc29uLnR5cGVdKCk7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gZGVmYXVsdFNldHRpbmdzKSB7XG4gICAgICAgIGpzb25ba2V5XSA9IGRlZmF1bHRTZXR0aW5nc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBwcml2YXRlIGdldFF1ZXN0aW9uVHlwZXMoc3VwcG9ydGVkUXVlc3Rpb25zOiBBcnJheTxzdHJpbmc+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGFsbFR5cGVzOiBzdHJpbmdbXSA9IFN1cnZleS5FbGVtZW50RmFjdG9yeS5JbnN0YW5jZS5nZXRBbGxUeXBlcygpO1xuICAgIGlmICghc3VwcG9ydGVkUXVlc3Rpb25zIHx8IHN1cHBvcnRlZFF1ZXN0aW9ucy5sZW5ndGggPT0gMClcbiAgICAgIHN1cHBvcnRlZFF1ZXN0aW9ucyA9IGFsbFR5cGVzO1xuICAgIGNvbnN0IHF1ZXN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3JkZXJlZFF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gdGhpcy5vcmRlcmVkUXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKHN1cHBvcnRlZFF1ZXN0aW9ucy5pbmRleE9mKG5hbWUpID4gLTEgJiYgYWxsVHlwZXMuaW5kZXhPZihuYW1lKSA+IC0xKVxuICAgICAgICBxdWVzdGlvbnMucHVzaChuYW1lKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdXBwb3J0ZWRRdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IHN1cHBvcnRlZFF1ZXN0aW9uc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgcXVlc3Rpb25zLmluZGV4T2Yoc3VwcG9ydGVkUXVlc3Rpb25zW2ldKSA8IDAgJiZcbiAgICAgICAgYWxsVHlwZXMuaW5kZXhPZihuYW1lKSA+IC0xXG4gICAgICApXG4gICAgICAgIHF1ZXN0aW9ucy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25zO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKSB7fVxufVxuIiwiaW1wb3J0ICogYXMgU3VydmV5IGZyb20gXCJzdXJ2ZXkta25vY2tvdXRcIjtcbmltcG9ydCB7IEVkaXRhYmxlT2JqZWN0IH0gZnJvbSBcIi4vcHJvcGVydHlFZGl0b3JzL2VkaXRhYmxlT2JqZWN0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVuZG9SZWRvQ2hhbmdlIHtcbiAgb2JqZWN0OiBhbnk7XG4gIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICBvbGRWYWx1ZTogYW55O1xuICBuZXdWYWx1ZTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgVW5kb1JlZG9NYW5hZ2VyIHtcbiAgcHVibGljIG9uUXVlc3Rpb25OYW1lQ2hhbmdlZENhbGxiYWNrOiAoXG4gICAgb2JqOiBTdXJ2ZXkuQmFzZSxcbiAgICBvbGROYW1lOiBzdHJpbmdcbiAgKSA9PiBhbnk7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgcHVibGljIG9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9sZFZhbHVlOiBhbnksXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICBzZW5kZXI6IFN1cnZleS5CYXNlLFxuICAgIGFycmF5Q2hhbmdlczogU3VydmV5LkFycmF5Q2hhbmdlc1xuICApIHtcbiAgICBpZiAoIXRoaXMuaGFzUHJvcGVydHlJblNlcmlhbGl6ZXIoc2VuZGVyLCBuYW1lKSkgcmV0dXJuO1xuICAgIGlmIChFZGl0YWJsZU9iamVjdC5pc0NvcHlPYmplY3Qoc2VuZGVyKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLl9pZ25vcmVDaGFuZ2VzKSByZXR1cm47XG5cbiAgICBsZXQgdHJhbnNhY3Rpb24gPSB0aGlzLl9wcmVwYXJpbmdUcmFuc2FjdGlvbjtcbiAgICBsZXQgYWN0aW9uID0gYXJyYXlDaGFuZ2VzXG4gICAgICA/IG5ldyBBcnJheUFjdGlvbihuYW1lLCBzZW5kZXIsIGFycmF5Q2hhbmdlcylcbiAgICAgIDogbmV3IEFjdGlvbihuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHNlbmRlcik7XG5cbiAgICBpZiAoIXRyYW5zYWN0aW9uKSB7XG4gICAgICB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihuYW1lKTtcbiAgICAgIHRyYW5zYWN0aW9uLmFkZEFjdGlvbihhY3Rpb24pO1xuICAgICAgdGhpcy5fYWRkVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyYW5zYWN0aW9uLmFkZEFjdGlvbihhY3Rpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaWdub3JlQ2hhbmdlcyA9IGZhbHNlO1xuICBwcml2YXRlIF9wcmVwYXJpbmdUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gPSBudWxsO1xuICBwcml2YXRlIF90cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfY3VycmVudFRyYW5zYWN0aW9uSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIHByaXZhdGUgaGFzUHJvcGVydHlJblNlcmlhbGl6ZXIoc2VuZGVyOiBTdXJ2ZXkuQmFzZSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gISFTdXJ2ZXkuU2VyaWFsaXplci5maW5kUHJvcGVydHkoc2VuZGVyLmdldFR5cGUoKSwgcHJvcGVydHlOYW1lKTtcbiAgfVxuICBwdWJsaWMgaXNDb3B5T2JqZWN0KHNlbmRlcjogU3VydmV5LkJhc2UpIHt9XG4gIHByaXZhdGUgX2N1dE9mZlRhaWwoKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbkluZGV4ICsgMSAhPT0gdGhpcy5fdHJhbnNhY3Rpb25zLmxlbmd0aCkge1xuICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zLmxlbmd0aCA9IHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbkluZGV4ICsgMTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfYWRkVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKHRyYW5zYWN0aW9uLmlzRW1wdHkoKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fY3V0T2ZmVGFpbCgpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9ucy5wdXNoKHRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb25JbmRleCsrO1xuICAgIHRoaXMuY2FuVW5kb1JlZG9DYWxsYmFjaygpO1xuICB9XG4gIHByaXZhdGUgX2dldEN1cnJlbnRUcmFuc2FjdGlvbigpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbkluZGV4O1xuICAgIGNvbnN0IGN1cnJlbnRUcmFuc2FjdGlvbiA9IHRoaXMuX3RyYW5zYWN0aW9uc1tpbmRleF07XG4gICAgcmV0dXJuIGN1cnJlbnRUcmFuc2FjdGlvbjtcbiAgfVxuICBwcml2YXRlIF9nZXROZXh0VHJhbnNhY3Rpb24oKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb25JbmRleDtcbiAgICBjb25zdCBuZXh0VHJhbnNhY3Rpb24gPSB0aGlzLl90cmFuc2FjdGlvbnNbaW5kZXggKyAxXTtcbiAgICByZXR1cm4gbmV4dFRyYW5zYWN0aW9uO1xuICB9XG4gIHByaXZhdGUgbm90aWZ5Q2hhbmdlc0ZpbmlzaGVkKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIGlmICh0cmFuc2FjdGlvbi5hY3Rpb25zLmxlbmd0aCA+IDAgJiYgdHJhbnNhY3Rpb24uYWN0aW9uc1swXSkge1xuICAgICAgISF0aGlzLmNoYW5nZXNGaW5pc2hlZENhbGxiYWNrICYmXG4gICAgICAgIHRoaXMuY2hhbmdlc0ZpbmlzaGVkQ2FsbGJhY2sodHJhbnNhY3Rpb24uYWN0aW9uc1swXS5jaGFuZ2VzKTtcbiAgICB9XG4gIH1cbiAgY2FuVW5kb1JlZG9DYWxsYmFjaygpIHt9XG4gIHByaXZhdGUgdHJhbnNhY3Rpb25Db3VudGVyID0gMDtcbiAgc3RhcnRUcmFuc2FjdGlvbihuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uQ291bnRlcisrO1xuICAgIGlmICh0aGlzLl9wcmVwYXJpbmdUcmFuc2FjdGlvbikgcmV0dXJuO1xuICAgIHRoaXMuX3ByZXBhcmluZ1RyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKG5hbWUpO1xuICB9XG4gIHN0b3BUcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbkNvdW50ZXIgPiAwKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uQ291bnRlci0tO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3ByZXBhcmluZ1RyYW5zYWN0aW9uIHx8IHRoaXMudHJhbnNhY3Rpb25Db3VudGVyID4gMCkgcmV0dXJuO1xuICAgIHRoaXMuX2FkZFRyYW5zYWN0aW9uKHRoaXMuX3ByZXBhcmluZ1RyYW5zYWN0aW9uKTtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbkNvdW50ZXIgPT09IDApIHtcbiAgICAgIHRoaXMubm90aWZ5Q2hhbmdlc0ZpbmlzaGVkKHRoaXMuX3ByZXBhcmluZ1RyYW5zYWN0aW9uKTtcbiAgICB9XG4gICAgdGhpcy5fcHJlcGFyaW5nVHJhbnNhY3Rpb24gPSBudWxsO1xuICB9XG4gIGNhblVuZG8oKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCk7XG4gIH1cbiAgdW5kbygpIHtcbiAgICBjb25zdCBjdXJyZW50VHJhbnNhY3Rpb24gPSB0aGlzLl9nZXRDdXJyZW50VHJhbnNhY3Rpb24oKTtcbiAgICBpZiAoIXRoaXMuY2FuVW5kbygpKSByZXR1cm47XG5cbiAgICB0aGlzLl9pZ25vcmVDaGFuZ2VzID0gdHJ1ZTtcbiAgICBjdXJyZW50VHJhbnNhY3Rpb24ucm9sbGJhY2soKTtcbiAgICB0aGlzLl9pZ25vcmVDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb25JbmRleC0tO1xuICAgIHRoaXMuY2FuVW5kb1JlZG9DYWxsYmFjaygpO1xuICAgIHRoaXMubm90aWZ5Q2hhbmdlc0ZpbmlzaGVkKGN1cnJlbnRUcmFuc2FjdGlvbik7XG4gIH1cbiAgY2FuUmVkbygpIHtcbiAgICByZXR1cm4gISF0aGlzLl9nZXROZXh0VHJhbnNhY3Rpb24oKTtcbiAgfVxuICByZWRvKCkge1xuICAgIGNvbnN0IG5leHRUcmFuc2FjdGlvbiA9IHRoaXMuX2dldE5leHRUcmFuc2FjdGlvbigpO1xuICAgIGlmICghdGhpcy5jYW5SZWRvKCkpIHJldHVybjtcblxuICAgIHRoaXMuX2lnbm9yZUNoYW5nZXMgPSB0cnVlO1xuICAgIG5leHRUcmFuc2FjdGlvbi5hcHBseSgpO1xuICAgIHRoaXMuX2lnbm9yZUNoYW5nZXMgPSBmYWxzZTtcblxuICAgIHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbkluZGV4Kys7XG4gICAgdGhpcy5jYW5VbmRvUmVkb0NhbGxiYWNrKCk7XG4gICAgdGhpcy5ub3RpZnlDaGFuZ2VzRmluaXNoZWQobmV4dFRyYW5zYWN0aW9uKTtcbiAgfVxuICBwdWJsaWMgY2hhbmdlc0ZpbmlzaGVkQ2FsbGJhY2s6IChjaGFuZ2VzOiBJVW5kb1JlZG9DaGFuZ2UpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX25hbWU6IHN0cmluZykge31cblxuICBwcml2YXRlIF9hY3Rpb25zOiBVbmRvUmVkb0FjdGlvbltdID0gW107XG5cbiAgYXBwbHkoKSB7XG4gICAgY29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnM7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFjdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBhY3Rpb25zW2luZGV4XTtcbiAgICAgIGFjdGlvbi5hcHBseSgpO1xuICAgIH1cbiAgfVxuXG4gIHJvbGxiYWNrKCkge1xuICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zO1xuICAgIGZvciAobGV0IGluZGV4ID0gYWN0aW9ucy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBhY3Rpb25zW2luZGV4XTtcbiAgICAgIGFjdGlvbi5yb2xsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIGFkZEFjdGlvbihhY3Rpb246IGFueSkge1xuICAgIHRoaXMuX2FjdGlvbnMucHVzaChhY3Rpb24pO1xuICB9XG5cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9ucy5sZW5ndGggPT09IDA7XG4gIH1cblxuICBnZXQgYWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9ucztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5kb1JlZG9BY3Rpb24ge1xuICBhcHBseSgpIHt9XG4gIHJvbGxiYWNrKCkge31cbiAgZ2V0IGNoYW5nZXMoKTogSVVuZG9SZWRvQ2hhbmdlIHtcbiAgICByZXR1cm4gPGFueT57fTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfb2xkVmFsdWU6IGFueSxcbiAgICBwcml2YXRlIF9uZXdWYWx1ZTogYW55LFxuICAgIHByaXZhdGUgX3NlbmRlcjogU3VydmV5LkJhc2VcbiAgKSB7fVxuXG4gIGFwcGx5KCkge1xuICAgIHRoaXMuX3NlbmRlclt0aGlzLl9wcm9wZXJ0eU5hbWVdID0gdGhpcy5fbmV3VmFsdWU7XG4gIH1cblxuICByb2xsYmFjaygpIHtcbiAgICB0aGlzLl9zZW5kZXJbdGhpcy5fcHJvcGVydHlOYW1lXSA9IHRoaXMuX29sZFZhbHVlO1xuICB9XG5cbiAgZ2V0IGNoYW5nZXMoKTogSVVuZG9SZWRvQ2hhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgb2JqZWN0OiB0aGlzLl9zZW5kZXIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHRoaXMuX3Byb3BlcnR5TmFtZSxcbiAgICAgIG9sZFZhbHVlOiB0aGlzLl9vbGRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlOiB0aGlzLl9uZXdWYWx1ZVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFycmF5QWN0aW9uIHtcbiAgcHJpdmF0ZSBfaW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2l0ZW1zVG9BZGQ6IGFueVtdID0gW107XG4gIHByaXZhdGUgX2RlbGV0ZWRJdGVtczogYW55W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9wcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9zZW5kZXI6IFN1cnZleS5CYXNlLFxuICAgIGFycmF5Q2hhbmdlczogU3VydmV5LkFycmF5Q2hhbmdlc1xuICApIHtcbiAgICB0aGlzLl9pbmRleCA9IGFycmF5Q2hhbmdlcy5pbmRleDtcbiAgICB0aGlzLl9pdGVtc1RvQWRkID0gYXJyYXlDaGFuZ2VzLml0ZW1zVG9BZGQ7XG4gICAgdGhpcy5fZGVsZXRlZEl0ZW1zID0gYXJyYXlDaGFuZ2VzLmRlbGV0ZWRJdGVtcztcbiAgfVxuICBhcHBseSgpIHtcbiAgICB0aGlzLnJvbGxiYWNrKCk7XG4gIH1cbiAgcm9sbGJhY2soKSB7XG4gICAgY29uc3QgYXJyYXkgPSB0aGlzLl9zZW5kZXJbdGhpcy5fcHJvcGVydHlOYW1lXTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2luZGV4O1xuICAgIGNvbnN0IGRlbGV0ZUNvdW50ID0gdGhpcy5faXRlbXNUb0FkZC5sZW5ndGg7XG4gICAgY29uc3QgaXRlbXNUb0FkZCA9IFtdLmNvbmNhdCh0aGlzLl9kZWxldGVkSXRlbXMpO1xuXG4gICAgdGhpcy5fZGVsZXRlZEl0ZW1zID0gYXJyYXkuc3BsaWNlLmFwcGx5KFxuICAgICAgYXJyYXksXG4gICAgICBbaW5kZXgsIGRlbGV0ZUNvdW50XS5jb25jYXQoaXRlbXNUb0FkZClcbiAgICApO1xuICAgIHRoaXMuX2l0ZW1zVG9BZGQgPSBbXS5jb25jYXQoaXRlbXNUb0FkZCk7XG4gIH1cbiAgZ2V0IGNoYW5nZXMoKTogSVVuZG9SZWRvQ2hhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgb2JqZWN0OiB0aGlzLl9zZW5kZXIsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHRoaXMuX3Byb3BlcnR5TmFtZSxcbiAgICAgIG9sZFZhbHVlOiB0aGlzLl9kZWxldGVkSXRlbXMsXG4gICAgICBuZXdWYWx1ZTogdGhpcy5faXRlbXNUb0FkZFxuICAgIH07XG4gIH1cbn1cbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuXG5pbXBvcnQgXCIuL2FjY29yZGlvbi5zY3NzXCI7XG5pbXBvcnQgeyBpc1ZhciB9IGZyb20gXCJiYWJlbC10eXBlc1wiO1xudmFyIHRlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9hY2NvcmRpb24uaHRtbFwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBJQWNjb3JkaW9uSXRlbURhdGEge1xuICBuYW1lOiBzdHJpbmcgfCBhbnk7XG4gIHRpdGxlOiBzdHJpbmcgfCBhbnk7XG4gIG9uRXhwYW5kOiAoKSA9PiB2b2lkO1xuICBvbkNvbGxhcHNlOiAoKSA9PiB2b2lkO1xuICBkb09uRXhwYW5kZWQoKTogYW55O1xuICBodG1sVGVtcGxhdGU6IHN0cmluZztcbiAgdGVtcGxhdGVPYmplY3Q6IGFueTtcbiAga29BZnRlclJlbmRlcj86ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBBY2NvcmRpb25JdGVtTW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGF0YTogSUFjY29yZGlvbkl0ZW1EYXRhKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGRhdGEub25FeHBhbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmNvbGxhcHNlZChmYWxzZSk7XG4gICAgfTtcbiAgICBkYXRhLm9uQ29sbGFwc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmNvbGxhcHNlZCh0cnVlKTtcbiAgICB9O1xuICB9XG4gIGNvbGxhcHNlZCA9IGtvLm9ic2VydmFibGUodHJ1ZSk7XG4gIHRvZ2dsZSA9ICgpID0+IHtcbiAgICB0aGlzLmNvbGxhcHNlZCghdGhpcy5jb2xsYXBzZWQoKSk7XG4gICAgaWYgKCF0aGlzLmNvbGxhcHNlZCgpICYmICEhZG9jdW1lbnQpIHtcbiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZWRpdG9yX3RhYl9pZF9cIiArIHRoaXMuZGF0YS5uYW1lKTtcbiAgICAgIGlmICghIXRoaXMuZGF0YS5kb09uRXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5kYXRhLmRvT25FeHBhbmRlZCgpO1xuICAgICAgfVxuICAgICAgaWYgKCEhZWwpIHtcbiAgICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgZ2V0IHRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEudGl0bGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjY29yZGlvblZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIHRoaXMudGFicyA9IGtvLmNvbXB1dGVkPEFjY29yZGlvbkl0ZW1Nb2RlbD4oKCkgPT4ge1xuICAgICAgdmFyIHJlcyA9IGtvXG4gICAgICAgIC51bndyYXAocGFyYW1zLnRhYnMpXG4gICAgICAgIC5tYXAoKHRhYkRhdGEpID0+IG5ldyBBY2NvcmRpb25JdGVtTW9kZWwodGFiRGF0YSkpO1xuICAgICAgaWYgKHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc1swXS5jb2xsYXBzZWQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgICB0aGlzLnNob3dIZWFkZXIgPSBrby5jb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICByZXR1cm4gcGFyYW1zLnRhYnMoKS5sZW5ndGggPiAxO1xuICAgIH0pO1xuICB9XG4gIHRhYnM6IGFueTtcbiAgc2hvd0hlYWRlcjogYW55O1xufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLWFjY29yZGlvblwiLCB7XG4gIHZpZXdNb2RlbDogQWNjb3JkaW9uVmlld01vZGVsLFxuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8bGFiZWwgY2xhc3M9XFxcInN2ZC10b29sYmFyLWJvb2xlYW5cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzanMtY2ItY29udGFpbmVyIHN2ZC10b29sYmFyLWJvb2xlYW5fY2hlY2tcXFwiPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBkYXRhLWJpbmQ9XFxcImNoZWNrZWQ6IGFjdGlvblxcXCI+XFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2hlY2ttYXJrXFxcIlxcbiAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiB7ICdzdmQtbWFpbi1iYWNrZ3JvdW5kLWNvbG9yJzogYWN0aW9uKCksICdzdmQtbGlnaHQtYmFja2dyb3VuZC1jb2xvcic6ICFhY3Rpb24oKSB9XFxcIj48L3NwYW4+XFxuICAgIDwvZGl2PlxcbiAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6IHRpdGxlXFxcIj48L3NwYW4+XFxuPC9sYWJlbD5cIjsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbmltcG9ydCAqIGFzIFN1cnZleSBmcm9tIFwic3VydmV5LWtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlDcmVhdG9yIH0gZnJvbSAnLi4vZWRpdG9yJztcblxuaW1wb3J0IFwiLi9ib29sZWFuLnNjc3NcIjtcblxudmFyIHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL2Jvb2xlYW4uaHRtbFwiKTtcblxuZXhwb3J0IHZhciBCb29sZWFuVmlld01vZGVsO1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLWJvb2xlYW5cIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIHZhciBtb2RlbCA9IHBhcmFtcy5pdGVtO1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH1cbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgdGFiaW5kZXg9XFxcIjBcXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnkgc3YtYnRuIHN2ZC10b29sYmFyLWJ1dHRvblxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IGRpc2FibGVkOiBkaXNhYmxlZCwgJ2FyaWEtZGlzYWJsZWQnOiBkaXNhYmxlZCwgdGl0bGU6IGhpbnQgfSwgY3NzOiBpdGVtLmlubmVyQ3NzLCBrZXkyY2xpY2ssIGNsaWNrOiBhY3Rpb25cXFwiXFxuICAgIHJvbGU9XFxcImJ1dHRvblxcXCI+XFxuICAgIDwhLS0ga28gaWY6IGl0ZW0uaWNvbk5hbWUgLS0+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2ZC10b29sYmFyLWJ1dHRvbl9faW1hZ2VcXFwiPlxcbiAgICAgICAgPHN2Zy1pY29uIGNsYXNzPVxcXCJzdmQtc3ZnLWljb24gaWNvbi13aGl0ZVxcXCIgcGFyYW1zPVxcXCJpY29uTmFtZTogaXRlbS5pY29uTmFtZSwgc2l6ZTogMTZcXFwiPjwvc3ZnLWljb24+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSBrbyBpZjogc2hvd1RpdGxlIC0tPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzdmQtdG9vbGJhci1idXR0b25fX3RpdGxlXFxcIj5cXG4gICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogaXRlbS50aXRsZVxcXCI+PC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuPC9kaXY+XFxuXCI7IiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vYnV0dG9uLnNjc3NcIjtcblxudmFyIHRlbXBsYXRlSHRtbCA9IHJlcXVpcmUoXCIuL2J1dHRvbi5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgQnV0dG9uVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGl0ZW0pIHtcbiAgfVxuICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS5lbmFibGVkICE9PSB1bmRlZmluZWQgJiYgIWtvLnVud3JhcCh0aGlzLml0ZW0uZW5hYmxlZCk7XG4gIH1cbiAgZ2V0IGhpbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS50b29sdGlwIHx8IHRoaXMuaXRlbS50aXRsZTtcbiAgfVxuICBnZXQgc2hvd1RpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW0uc2hvd1RpdGxlID09PSB1bmRlZmluZWQgfHwgKCEhdGhpcy5pdGVtLmljb25OYW1lICYmICFrby51bndyYXAodGhpcy5pdGVtLnNob3dUaXRsZSkpO1xuICB9XG4gIGFjdGlvbihtb2RlbDogQnV0dG9uVmlld01vZGVsKSB7XG4gICAgaWYoIW1vZGVsLmRpc2FibGVkKSB7XG4gICAgICBtb2RlbC5pdGVtLmFjdGlvbigpO1xuICAgIH1cbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLWJ1dHRvblwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBCdXR0b25WaWV3TW9kZWwocGFyYW1zLml0ZW0pO1xuICAgIH1cbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlSHRtbCxcbn0pO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vZGVzaWduZXItY29udGFpbmVyLnNjc3NcIjtcbmltcG9ydCB7IGVkaXRvckxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9lZGl0b3JMb2NhbGl6YXRpb25cIjtcbnZhciB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vZGVzaWduZXItY29udGFpbmVyLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBEZXNpZ25lckNvbnRhaW5lclZpZXdNb2RlbCB7XG4gIHN0YXRpYyBpY29uUmlnaHRPcGVuTmFtZSA9IFwiaWNvbi1yaWdodC1vcGVuXCI7XG4gIHN0YXRpYyBpY29uUmlnaHRDbG9zZU5hbWUgPSBcImljb24tcmlnaHQtY2xvc2VcIjtcbiAgc3RhdGljIGljb25MZWZ0T3Blbk5hbWUgPSBcImljb24tbGVmdC1vcGVuXCI7XG4gIHN0YXRpYyBpY29uTGVmdENsb3NlTmFtZSA9IFwiaWNvbi1sZWZ0LWNsb3NlXCI7XG5cbiAgcHJpdmF0ZSBfY2hhbmdlZFN1YnNjcmlwdGlvbjoga28uU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIF9wcmV2V2lkdGg6IGFueTtcbiAgcHJpdmF0ZSBfcHJldlN1cmZhY2VXaWR0aDogYW55O1xuICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRGl2RWxlbWVudDtcbiAgY29uc3RydWN0b3IocGFyYW1zLCBjb21wb25lbnRJbmZvKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGNvbXBvbmVudEluZm8uZWxlbWVudDtcbiAgICB0aGlzLnRhYnMgPSBwYXJhbXMudGFicztcbiAgICB0aGlzLmNvbnRleHQgPSBwYXJhbXMuY29udGV4dDtcbiAgICB2YXIgY2hhbmdlZCA9IHBhcmFtcy5jaGFuZ2VkIHx8IGtvLm9ic2VydmFibGUoKTtcbiAgICBjb21wb25lbnRJbmZvLmVsZW1lbnQuY2xhc3NOYW1lICs9IFwiIFwiICsgcGFyYW1zLmNsYXNzTmFtZTtcbiAgICBpZiAoa28uaXNXcml0YWJsZU9ic2VydmFibGUocGFyYW1zLnZpc2libGUpKSB7XG4gICAgICB0aGlzLnZpc2libGUgPSBwYXJhbXMudmlzaWJsZTtcbiAgICB9XG4gICAgaWYgKGtvLmlzV3JpdGFibGVPYnNlcnZhYmxlKHBhcmFtcy5hY3RpdmVUYWIpKSB7XG4gICAgICB0aGlzLmFjdGl2ZVRhYiA9IHBhcmFtcy5hY3RpdmVUYWI7XG4gICAgfVxuICAgIGlmICghdGhpcy5hY3RpdmVUYWIoKSAmJiB0aGlzLnRhYnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hY3RpdmVUYWIodGhpcy50YWJzWzBdKTtcbiAgICB9XG4gICAgdGhpcy5zaXplID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgdmFyIGlzVmlzaWJsZSA9IHRoaXMudmlzaWJsZSgpO1xuICAgICAgdGhpcy5pc09wZW4oaXNWaXNpYmxlKTtcbiAgICAgIHJldHVybiBpc1Zpc2libGUgPyBcIlwiIDogMDtcbiAgICB9KTtcbiAgICBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMudmlzaWJsZSgpIHx8IGNvbXBvbmVudEluZm8uZWxlbWVudC5vZmZzZXRXaWR0aCA9PSAwKSB7XG4gICAgICAgIGNvbXBvbmVudEluZm8uZWxlbWVudC5zdHlsZS53aWR0aCA9IHRoaXMuc2l6ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX2NoYW5nZWRTdWJzY3JpcHRpb24gPSBjaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmlzT3Blbihjb21wb25lbnRJbmZvLmVsZW1lbnQub2Zmc2V0V2lkdGggPiAyNSk7XG4gICAgICB0aGlzLnZpc2libGUodGhpcy5pc09wZW4oKSk7XG4gICAgfSk7XG4gIH1cbiAgdG9nZ2xlID0gKCkgPT4ge1xuICAgIHZhciBzdXJmYWNlRWw6IEhUTUxEaXZFbGVtZW50ID0gPGFueT4oXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwic3ZkX2VkaXRvcnNcIilbMF1cbiAgICApO1xuICAgIGlmICh0aGlzLnZpc2libGUoKSkge1xuICAgICAgdGhpcy5fcHJldldpZHRoID0gdGhpcy5fZWxlbWVudC5zdHlsZS53aWR0aDtcbiAgICAgIHRoaXMuX3ByZXZTdXJmYWNlV2lkdGggPSBzdXJmYWNlRWwuc3R5bGUud2lkdGg7XG4gICAgICBzdXJmYWNlRWwuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICAgIHN1cmZhY2VFbC5zdHlsZS5tYXhXaWR0aCA9IFwibm9uZVwiO1xuICAgICAgc3VyZmFjZUVsLnN0eWxlLmZsZXhCYXNpcyA9IFwiYXV0b1wiO1xuICAgICAgLy8gc3VyZmFjZUVsLnN0eWxlLndpZHRoID0gc3VyZmFjZUVsLnN0eWxlLm1heFdpZHRoID0gc3VyZmFjZUVsLnN0eWxlLmZsZXhCYXNpcyA9IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLl9lbGVtZW50LnN0eWxlLm1heFdpZHRoID0gdGhpcy5fZWxlbWVudC5zdHlsZS5mbGV4QmFzaXMgPSB0aGlzLl9wcmV2V2lkdGg7XG4gICAgICAvLyBzdXJmYWNlRWwuc3R5bGUud2lkdGggPSBzdXJmYWNlRWwuc3R5bGUubWF4V2lkdGggPSBzdXJmYWNlRWwuc3R5bGUuZmxleEJhc2lzID0gdGhpcy5fcHJldlN1cmZhY2VXaWR0aDtcbiAgICB9XG4gICAgdGhpcy52aXNpYmxlKCF0aGlzLnZpc2libGUoKSk7XG4gIH07XG4gIGFjdGl2ZVRhYiA9IGtvLm9ic2VydmFibGU8c3RyaW5nPigpO1xuICB0YWJzOiBhbnk7XG4gIGNvbnRleHQ6IGFueTtcbiAgY2xhc3NOYW1lID0gXCJzdmQtZGVzaWduZXItY29udGFpbmVyXCI7XG4gIHZpc2libGUgPSBrby5vYnNlcnZhYmxlKHRydWUpO1xuICBpc09wZW4gPSBrby5vYnNlcnZhYmxlKHRydWUpO1xuICBwdWJsaWMgZ2V0TG9jU3RyaW5nKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVkaXRvckxvY2FsaXphdGlvbi5nZXRTdHJpbmcoc3RyKTtcbiAgfVxuICBzaXplOiBhbnk7XG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5fY2hhbmdlZFN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG4gIH1cbiAgZ2V0IGljb25SaWdodE9wZW4oKSB7XG4gICAgcmV0dXJuIERlc2lnbmVyQ29udGFpbmVyVmlld01vZGVsLmljb25SaWdodE9wZW5OYW1lO1xuICB9XG4gIGdldCBpY29uUmlnaHRDbG9zZSgpIHtcbiAgICByZXR1cm4gRGVzaWduZXJDb250YWluZXJWaWV3TW9kZWwuaWNvblJpZ2h0Q2xvc2VOYW1lO1xuICB9XG4gIGdldCBpY29uTGVmdE9wZW4oKSB7XG4gICAgcmV0dXJuIERlc2lnbmVyQ29udGFpbmVyVmlld01vZGVsLmljb25MZWZ0T3Blbk5hbWU7XG4gIH1cbiAgZ2V0IGljb25MZWZ0Q2xvc2UoKSB7XG4gICAgcmV0dXJuIERlc2lnbmVyQ29udGFpbmVyVmlld01vZGVsLmljb25MZWZ0Q2xvc2VOYW1lO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtZGVzaWduZXItY29udGFpbmVyXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERlc2lnbmVyQ29udGFpbmVyVmlld01vZGVsKHBhcmFtcywgY29tcG9uZW50SW5mbyk7XG4gICAgfVxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVcbn0pO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmltcG9ydCBcIi4vZGVzaWduZXItaC1jb250YWluZXIuc2Nzc1wiO1xudmFyIHRlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9kZXNpZ25lci1oLWNvbnRhaW5lci5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgRGVzaWduZXJIQ29udGFpbmVyVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IocGFyYW1zLCBjb21wb25lbnRJbmZvKSB7XG4gICAgdGhpcy5pdGVtcyA9IGtvLnVud3JhcChwYXJhbXMuaXRlbXMpO1xuICAgIHRoaXMuY29udGV4dCA9IHBhcmFtcy5jb250ZXh0O1xuICAgIGNvbXBvbmVudEluZm8uZWxlbWVudC5jbGFzc05hbWUgKz0gXCIgXCIgKyBwYXJhbXMuY2xhc3NOYW1lO1xuICB9XG4gIGl0ZW1zOiBhbnk7XG4gIGNvbnRleHQ6IGFueTtcbiAgY2xhc3NOYW1lID0gXCJzdmQtZGVzaWduZXItaC1jb250YWluZXJcIjtcbn1cblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2ZC1kZXNpZ25lci1oLWNvbnRhaW5lclwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtcywgY29tcG9uZW50SW5mbykgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBEZXNpZ25lckhDb250YWluZXJWaWV3TW9kZWwocGFyYW1zLCBjb21wb25lbnRJbmZvKTtcbiAgICB9XG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZVxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGxhYmVsIGNsYXNzPVxcXCJzdmQtdG9vbGJhci1kcm9wZG93blxcXCI+XFxuICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogdGl0bGUsIHZpc2libGU6IHRpdGxlXFxcIiBjbGFzcz1cXFwic3ZkLXRvb2xiYXItZHJvcGRvd25fX2xhYmVsXFxcIj48L3NwYW4+XFxuICAgIDxkaXYgY2xhc3M9XFxcInN2ZF9jdXN0b21fc2VsZWN0XFxcIj5cXG4gICAgICAgIDxzZWxlY3Qgb25tb3VzZXdoZWVsPVxcXCJyZXR1cm4gZmFsc2U7XFxcIiBjbGFzcz1cXFwic3ZkLXRvb2xiYXItZHJvcGRvd25fX3NlbGVjdFxcXCJcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcIm9wdGlvbnM6IGl0ZW1zLCBvcHRpb25zVGV4dDogJ3RleHQnLCBvcHRpb25zVmFsdWU6IG9wdGlvbnNWYWx1ZSwgdmFsdWU6IGFjdGlvbiwgb3B0aW9uc0FmdGVyUmVuZGVyOiBhZnRlclJlbmRlciwgb3B0aW9uc0NhcHRpb246IG9wdGlvbnNDYXB0aW9uLCAgZGlzYWJsZTogZGlzYWJsZSwgdmFsdWVBbGxvd1Vuc2V0OiB2YWx1ZUFsbG93VW5zZXQsIGhhc0ZvY3VzOiBoYXNGb2N1cywgYXR0cjogeyAnYXJpYS1sYWJlbCc6IGFyaWFMYWJlbCB9LCBzanNzZWxlY3QzOiBzZWxlY3QzXFxcIj5cXG4gICAgICAgIDwvc2VsZWN0PlxcbiAgICA8L2Rpdj5cXG48L2xhYmVsPlwiOyIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IFwiLi9kcm9wZG93bi5zY3NzXCI7XG52YXIgdGVtcGxhdGVIdG1sID0gcmVxdWlyZShcIi4vZHJvcGRvd24uaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIERyb3Bkb3duVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGl0ZW1zLFxuICAgIHB1YmxpYyBhY3Rpb24sXG4gICAgcHVibGljIG9wdGlvbnNWYWx1ZSA9IFwidmFsdWVcIixcbiAgICBwdWJsaWMgb3B0aW9uc1RleHQgPSBcInRleHRcIixcbiAgICBwdWJsaWMgYWZ0ZXJSZW5kZXIgPSBudWxsLFxuICAgIHB1YmxpYyB2YWx1ZUFsbG93VW5zZXQgPSBudWxsLFxuICAgIHB1YmxpYyBvcHRpb25zQ2FwdGlvbiA9IG51bGwsXG4gICAgcHVibGljIGFyaWFMYWJlbCA9IG51bGwsXG4gICAgcHVibGljIHRpdGxlID0gbnVsbCxcbiAgICBwdWJsaWMgZGlzYWJsZSA9IG51bGwsXG4gICAgcHVibGljIGhhc0ZvY3VzID0gbnVsbCxcbiAgICBwdWJsaWMgc2VsZWN0M1xuICApIHt9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdmQtZHJvcGRvd25cIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXMsIGNvbXBvbmVudEluZm8pID0+IHtcbiAgICAgIHZhciBtb2RlbCA9IHBhcmFtcy5pdGVtO1xuICAgICAgcmV0dXJuIG5ldyBEcm9wZG93blZpZXdNb2RlbChcbiAgICAgICAgbW9kZWwuaXRlbXMsXG4gICAgICAgIG1vZGVsLmFjdGlvbixcbiAgICAgICAgbW9kZWwub3B0aW9uc1ZhbHVlLFxuICAgICAgICBtb2RlbC5vcHRpb25zVGV4dCxcbiAgICAgICAgbW9kZWwuYWZ0ZXJSZW5kZXIsXG4gICAgICAgIG1vZGVsLnZhbHVlQWxsb3dVbnNldCxcbiAgICAgICAgbW9kZWwub3B0aW9uc0NhcHRpb24sXG4gICAgICAgIG1vZGVsLmFyaWFMYWJlbCxcbiAgICAgICAgbW9kZWwudGl0bGUsXG4gICAgICAgIG1vZGVsLmRpc2FibGUsXG4gICAgICAgIG1vZGVsLmhhc0ZvY3VzLFxuICAgICAgICBwYXJhbXMuc2VsZWN0M1xuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVIdG1sLFxufSk7XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1tcInNqc3NlbGVjdDNcIl0gPSB7XG4gIGluaXQ6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yKSB7XG4gICAgdmFyIHZhbHVlID0gdmFsdWVBY2Nlc3NvcigpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIgJiYgalF1ZXJ5KClbXCJzZWxlY3QyXCJdKSB7XG4gICAgICB2YXIgb3B0aW9uczogYW55ID0ge1xuICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICB9O1xuICAgICAgLy8gVE9ETzogcGFzcyBSVEwgc2V0dGluZ1xuICAgICAgLy8gaWYgKGVkaXRvci5pc1JUTFZhbHVlKSB7XG4gICAgICAvLyAgIG9wdGlvbnMuZGlyID0gXCJydGxcIjtcbiAgICAgIC8vIH1cbiAgICAgIHZhciAkb2JqZWN0U2VsZWN0b3IgPSBqUXVlcnkoZWxlbWVudCk7XG4gICAgICAkb2JqZWN0U2VsZWN0b3JbXCJzZWxlY3QyXCJdKG9wdGlvbnMpO1xuICAgICAgJG9iamVjdFNlbGVjdG9yLm9uKFwic2VsZWN0MjpzZWxlY3RcIiwgKHNlbF9ldnQ6IGFueSkgPT4ge1xuICAgICAgICBpZihrby5pc1dyaXRlYWJsZU9ic2VydmFibGUodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUoc2VsX2V2dC50YXJnZXQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHZhciBpdGVtID0ga28udW53cmFwKHZhbHVlKTtcbiAgICAgICAgdmFyIGVsID0gPEhUTUxFbGVtZW50PihcbiAgICAgICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuc2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVkXCIpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbCkge1xuICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0udGV4dCkge1xuICAgICAgICAgICAgZWwuaW5uZXJUZXh0ID0gaXRlbS50ZXh0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH0pO1xuICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhlbGVtZW50LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG4gICAgICAgICRvYmplY3RTZWxlY3Rvci5vZmYoXCJzZWxlY3QyOnNlbGVjdFwiKTtcbiAgICAgICAgJG9iamVjdFNlbGVjdG9yW1wic2VsZWN0MlwiXSgnZGVzdHJveScpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxufTsiLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuaW1wb3J0IFwiLi9zcGxpdHRlci5zY3NzXCI7XG5cbmV4cG9ydCBjbGFzcyBTcGxpdHRlckNvbXBvbmVudFZpZXdNb2RlbCB7XG4gIHByaXZhdGUgdXBkYXRlU3BsaXR0ZXI7XG5cbiAgcHJpdmF0ZSB1cGRhdGVXaWR0aChlbDogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgZWwuc3R5bGUud2lkdGggPSB2YWx1ZTtcbiAgICBlbC5zdHlsZS5tYXhXaWR0aCA9IHZhbHVlO1xuICAgIGVsLnN0eWxlLmZsZXhCYXNpcyA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyYW1zOiB7XG4gICAgICBtaW5MZWZ0OiBudW1iZXI7XG4gICAgICBtaW5SaWdodDogbnVtYmVyO1xuICAgICAgb25DaGFuZ2U/OiBhbnk7XG4gICAgfSxcbiAgICBjb21wb25lbnRJbmZvXG4gICkge1xuICAgIHZhciBzcGxpdHRlckVsZW1lbnQgPSBjb21wb25lbnRJbmZvLmVsZW1lbnQ7XG4gICAgdmFyIGNvbnRhaW5lciA9IGNvbXBvbmVudEluZm8uZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIHZhciBvbkNoYW5nZSA9IHBhcmFtcy5vbkNoYW5nZSB8fCBrby5vYnNlcnZhYmxlKDApO1xuICAgIHZhciBzaWJsaW5ncyA9IFtdO1xuICAgIHZhciBtaW5MZWZ0ID0gcGFyYW1zLm1pbkxlZnQgfHwgMTA7XG4gICAgdmFyIG1pblJpZ2h0ID0gcGFyYW1zLm1pblJpZ2h0IHx8IDEwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzaWJsaW5ncy5wdXNoKGNvbnRhaW5lci5jaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIHZhciBzcGxpdHRlckVsZW1lbnRJbmRleCA9IHNpYmxpbmdzLmluZGV4T2Yoc3BsaXR0ZXJFbGVtZW50KTtcbiAgICB2YXIgbGVmdEVsZW1lbnQgPSBzaWJsaW5nc1tzcGxpdHRlckVsZW1lbnRJbmRleCAtIDFdO1xuICAgIHZhciByaWdodEVsZW1lbnQgPSBzaWJsaW5nc1tzcGxpdHRlckVsZW1lbnRJbmRleCArIDFdO1xuXG4gICAgdmFyIHN0YXJ0WCA9IDA7XG4gICAgdmFyIGlzSW5DaGFuZ2VXaWR0aCA9IGZhbHNlO1xuICAgIHZhciB1cGRhdGUgPSAoZGVsdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGlzSW5DaGFuZ2VXaWR0aCkgcmV0dXJuO1xuICAgICAgaXNJbkNoYW5nZVdpZHRoID0gdHJ1ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBpc1J0bCA9IGZhbHNlO1xuICAgICAgICBpZih3aW5kb3cgJiYgdHlwZW9mIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjb25zdCBjb25wdXRlZFN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUobGVmdEVsZW1lbnQpO1xuICAgICAgICAgIGlzUnRsID0gY29ucHV0ZWRTdHlsZXMgJiYgY29ucHV0ZWRTdHlsZXMuZGlyZWN0aW9uID09PSBcInJ0bFwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9mZnNldERlbHRhID0gaXNSdGwgPyAtZGVsdGEgOiBkZWx0YTtcbiAgICAgICAgdmFyIHRvdGFsV2lkdGggPSBsZWZ0RWxlbWVudC5vZmZzZXRXaWR0aCArIHJpZ2h0RWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgdmFyIG5ld0xlZnQgPSBsZWZ0RWxlbWVudC5vZmZzZXRXaWR0aCArIG9mZnNldERlbHRhO1xuICAgICAgICB2YXIgbmV3UmlnaHQgPSB0b3RhbFdpZHRoIC0gbmV3TGVmdDtcbiAgICAgICAgaWYgKG5ld0xlZnQgPiBtaW5MZWZ0ICYmIG5ld1JpZ2h0ID4gbWluUmlnaHQpIHtcbiAgICAgICAgICBzdGFydFggKz0gZGVsdGE7XG4gICAgICAgICAgdmFyIGxlZnRXaWR0aCA9XG4gICAgICAgICAgICBNYXRoLmNlaWwoKChuZXdMZWZ0ICsgMSkgLyBjb250YWluZXIuY2xpZW50V2lkdGgpICogMTAwMDApIC8gMTAwICtcbiAgICAgICAgICAgIFwiJVwiO1xuICAgICAgICAgIHZhciByaWdodFdpZHRoID1cbiAgICAgICAgICAgIE1hdGguY2VpbCgoKG5ld1JpZ2h0ICsgMSkgLyBjb250YWluZXIuY2xpZW50V2lkdGgpICogMTAwMDApIC8gMTAwICtcbiAgICAgICAgICAgIFwiJVwiO1xuICAgICAgICAgIHRoaXMudXBkYXRlV2lkdGgobGVmdEVsZW1lbnQsIGxlZnRXaWR0aCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVXaWR0aChyaWdodEVsZW1lbnQsIHJpZ2h0V2lkdGgpO1xuICAgICAgICAgIG9uQ2hhbmdlKG9uQ2hhbmdlKCkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNJbkNoYW5nZVdpZHRoID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBvbm1vdXNlbW92ZSA9IGV2ZW50ID0+IHtcbiAgICAgIHVwZGF0ZShldmVudC5zY3JlZW5YIC0gc3RhcnRYKTtcbiAgICB9O1xuXG4gICAgdmFyIG9ubW91c2V1cCA9IGV2ZW50ID0+IHtcbiAgICAgIHN0YXJ0WCA9IDA7XG4gICAgICBzcGxpdHRlckVsZW1lbnQuY2xhc3NOYW1lID0gc3BsaXR0ZXJFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKFxuICAgICAgICAvXFxzc3ZkLWFjdGl2ZS1zcGxpdHRlci9nLFxuICAgICAgICBcIlwiXG4gICAgICApO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBvbm1vdXNlbW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCBvbm1vdXNldXApO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgb25tb3VzZXVwKTtcbiAgICB9O1xuXG4gICAgc3BsaXR0ZXJFbGVtZW50Lm9ubW91c2Vkb3duID0gZXZlbnQgPT4ge1xuICAgICAgc3RhcnRYID0gZXZlbnQuc2NyZWVuWDtcbiAgICAgIHNwbGl0dGVyRWxlbWVudC5jbGFzc05hbWUgKz0gXCIgc3ZkLWFjdGl2ZS1zcGxpdHRlclwiO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBvbm1vdXNlbW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCBvbm1vdXNldXApO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgb25tb3VzZXVwKTtcbiAgICB9O1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB1cGRhdGUoMCksIDEwKTtcbiAgfVxuICBkaXNwb3NlKCkge1xuICAgIGlmICghIXRoaXMudXBkYXRlU3BsaXR0ZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVTcGxpdHRlcik7XG4gICAgICB0aGlzLnVwZGF0ZVNwbGl0dGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3ZkLXNwbGl0dGVyXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFNwbGl0dGVyQ29tcG9uZW50Vmlld01vZGVsKHBhcmFtcywgY29tcG9uZW50SW5mbyk7XG4gICAgfVxuICB9LFxuICB0ZW1wbGF0ZTpcbiAgICAnPGRpdiBjbGFzcz1cInN2ZC1zcGxpdHRlclwiPjxkaXYgY2xhc3M9XCJpY29uIGljb24tc3BsaXRcIj48c3ZnIGNsYXNzPVwic3ZkLXN2Zy1pY29uXCI+PHVzZSB4bGluazpocmVmPVwiI2ljb24tc3BsaXRfMTZ4MTZcIj48L3VzZT48L3N2Zz48L2Rpdj48L2Rpdj4nXG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuXG5leHBvcnQgdmFyIFN1cnZleVdpZGdldEJpbmRpbmc7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdXJ2ZXktd2lkZ2V0XCIsIHtcbiAgICB2aWV3TW9kZWw6IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkgPSBwYXJhbXMuc3VydmV5O1xuICAgIH0sXG4gICAgdGVtcGxhdGU6XG4gICAgICAgIFwiPCEtLSBrbyBpZjogJGRhdGEuc3VydmV5IC0tPjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1jb250ZW50JywgZGF0YTogc3VydmV5LCBhZnRlclJlbmRlcjogJHBhcmVudC5rb0V2ZW50QWZ0ZXJSZW5kZXIgfSAtLT48IS0tIC9rbyAtLT48IS0tIC9rbyAtLT5cIixcbn0pO1xuICAiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuZXhwb3J0IHZhciBTVkdJY29uQmluZGluZztcblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2Zy1pY29uXCIsIHtcbiAgICB2aWV3TW9kZWw6IHtcbiAgICAgICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zLCBjb21wb25lbnRJbmZvKSA9PiB7XG4gICAgICAgIGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIHZhciBzaXplID0ga28udW53cmFwKHBhcmFtcy5zaXplKTtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IGtvLnVud3JhcChwYXJhbXMud2lkdGgpO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IGtvLnVud3JhcChwYXJhbXMuaGVpZ2h0KTtcbiAgICAgICAgICAgIHZhciBzdmdFbGVtOiBhbnkgPSBjb21wb25lbnRJbmZvLmVsZW1lbnQuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgICAgIHN2Z0VsZW0uc3R5bGUud2lkdGggPSAoc2l6ZSB8fCB3aWR0aCB8fCAxNikgKyBcInB4XCI7XG4gICAgICAgICAgICBzdmdFbGVtLnN0eWxlLmhlaWdodCA9IChzaXplIHx8IGhlaWdodCB8fCAxNikgKyBcInB4XCI7XG4gICAgICAgICAgICB2YXIgbm9kZTogYW55ID0gc3ZnRWxlbS5jaGlsZE5vZGVzWzBdO1xuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgICAgICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICAgICAgICAgICAgXCJ4bGluazpocmVmXCIsXG4gICAgICAgICAgICBcIiNcIiArIGtvLnVud3JhcChwYXJhbXMuaWNvbk5hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHRlbXBsYXRlOiBcIjxzdmcgY2xhc3M9J3N2ZC1zdmctaWNvbic+PHVzZT48L3VzZT48L3N2Zz5cIixcbn0pO1xuICBcbiAgIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1rbm9ja291dFwiO1xuXG5mdW5jdGlvbiBnZXROdW1lcmljRnJvbVN0cmluZyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghc3RyKSByZXR1cm4gXCJcIjtcbiAgdmFyIG51bSA9IFwiXCI7XG4gIGZvciAodmFyIGkgPSBzdHIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoc3RyW2ldID49IFwiMFwiICYmIHN0cltpXSA8PSBcIjlcIikge1xuICAgICAgbnVtID0gc3RyW2ldICsgbnVtO1xuICAgIH1cbiAgICBpZiAobnVtLmxlbmd0aCA9PSAxMCkgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIG51bTtcbn1cbmNvbnN0IG9wb3NpdGVWYWx1ZXMgPSB7XG4gIHRydWU6IFwiZmFsc2VcIixcbiAgVHJ1ZTogXCJGYWxzZVwiLFxuICBUUlVFOiBcIkZBTFNFXCIsXG4gIGZhbHNlOiBcInRydWVcIixcbiAgRmFsc2U6IFwiVHJ1ZVwiLFxuICBGQUxTRTogXCJUUlVFXCIsXG4gIHllczogXCJub1wiLFxuICBZZXM6IFwiTm9cIixcbiAgWUVTOiBcIk5PXCIsXG4gIG5vOiBcInllc1wiLFxuICBObzogXCJZZXNcIixcbiAgTk86IFwiWUVTXCIsXG59O1xuZnVuY3Rpb24gZ2V0T3Bvc2l0VmFsdWUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoISFvcG9zaXRlVmFsdWVzW3N0cl0pIHJldHVybiBvcG9zaXRlVmFsdWVzW3N0cl07XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gaGFzVmFsdWVJbkFycmF5KHZhbHVlczogYW55W10sIHNlYXJjaDogYW55KTogYm9vbGVhbiB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCF2YWx1ZXNbaV0pIGNvbnRpbnVlO1xuICAgIGlmICh2YWx1ZXNbaV0udG9TdHJpbmcoKSA9PT0gc2VhcmNoKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV4dFZhbHVlKHByZWZpeDogc3RyaW5nLCB2YWx1ZXM6IGFueVtdKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKVxuICAgIHZhciBvcG9zaXRlID0gZ2V0T3Bvc2l0VmFsdWUodmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXSk7XG4gIGlmIChvcG9zaXRlICYmIHZhbHVlcy5pbmRleE9mKG9wb3NpdGUpIDwgMCkgcmV0dXJuIG9wb3NpdGU7XG4gIHZhciBudW1TdHIgPSBcIlwiO1xuICB2YXIgYmFzZVN0ciA9IFwiXCI7XG4gIHZhciBudW1TdHJJbmRleCA9IC0xO1xuICBmb3IgKHZhciBpID0gdmFsdWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKCF2YWx1ZXNbaV0pIGNvbnRpbnVlO1xuICAgIHZhciBzdHIgPSB2YWx1ZXNbaV0udG9TdHJpbmcoKTtcbiAgICBudW1TdHIgPSBnZXROdW1lcmljRnJvbVN0cmluZyhzdHIpO1xuICAgIGlmICghIW51bVN0cikge1xuICAgICAgbnVtU3RySW5kZXggPSBzdHIubGFzdEluZGV4T2YobnVtU3RyKTtcbiAgICAgIGJhc2VTdHIgPSBzdHI7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKG51bVN0ckluZGV4ID4gLTEpIHtcbiAgICB2YXIgbnVtID0gcGFyc2VJbnQobnVtU3RyKTtcbiAgICB2YXIgbmV3VmFsdWU7XG4gICAgZG8ge1xuICAgICAgbmV3VmFsdWUgPVxuICAgICAgICBzdHIuc3Vic3RyKDAsIG51bVN0ckluZGV4KSArXG4gICAgICAgIChudW0rKykudG9TdHJpbmcoKSArXG4gICAgICAgIHN0ci5zdWJzdHIobnVtU3RySW5kZXggKyBudW1TdHIubGVuZ3RoKTtcbiAgICB9IHdoaWxlIChoYXNWYWx1ZUluQXJyYXkodmFsdWVzLCBuZXdWYWx1ZSkpO1xuICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgfVxuICByZXR1cm4gcHJlZml4ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQYXJlbnROb2RlKGNsYXNzTmFtZTogc3RyaW5nLCBzb3VyY2VOb2RlOiBIVE1MRWxlbWVudCkge1xuICB2YXIgcGFyZW50ID0gc291cmNlTm9kZTtcbiAgd2hpbGUgKCEhcGFyZW50ICYmICFwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxuICByZXR1cm4gcGFyZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9jdXNGaXJzdENvbnRyb2wocmVuZGVyZWRFbGVtZW50czogSFRNTEVsZW1lbnRbXSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbmRlcmVkRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodHlwZW9mIHJlbmRlcmVkRWxlbWVudHNbaV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB2YXIgZWxlbWVudHMgPSA8SFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD4+KFxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJzdmQtZm9jdXNhYmxlXCIpXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBlbGVtZW50cy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50c1tpXS5jbGFzc05hbWUuaW5kZXhPZihcInN2ZC1mb2N1c2FibGVcIikgIT09IC0xXG4gICAgICApIHtcbiAgICAgICAgZWxlbWVudHMgPSA8YW55PltyZW5kZXJlZEVsZW1lbnRzW2ldXTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNbMF07XG4gICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJhXCIpIHtcbiAgICAgICAgICBlbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50czogYW55KSB7XG4gIGlmICghZWxlbWVudHMgfHwgIWVsZW1lbnRzLmxlbmd0aCkgcmV0dXJuO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGVsZW1lbnRzW2ldLm5vZGVOYW1lICE9IFwiI3RleHRcIiAmJiBlbGVtZW50c1tpXS5ub2RlTmFtZSAhPSBcIiNjb21tZW50XCIpXG4gICAgICByZXR1cm4gZWxlbWVudHNbaV07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIGFib3V0IGNvbXBvZW50SW5mbzogaHR0cHM6Ly9rbm9ja291dGpzLmNvbS9kb2N1bWVudGF0aW9uL2NvbXBvbmVudC1yZWdpc3RyYXRpb24uaHRtbFxuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVzRnJvbUtvQ29tcG9uZW50SW5mbyhjb21wb25lbnRJbmZvKSB7XG4gIC8vIGVsZW0ubm9kZVR5cGUgPT09IDMgLy8gdGV4dCBub2RlXG4gIC8vIGVsZW0ubm9kZVR5cGUgPT09IDggLy8gY29tbWVudCBub2RlXG5cbiAgbGV0IGVsZW1lbnQgPSBjb21wb25lbnRJbmZvLmVsZW1lbnQ7XG4gIGNvbnN0IHNpYmxpbmdzID0gW107XG5cbiAgaWYgKGVsZW1lbnQubm9kZVR5cGUgIT09IDgpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jaGlsZE5vZGVzO1xuICB9XG5cbiAgd2hpbGUgKChlbGVtZW50ID0gZWxlbWVudC5uZXh0U2libGluZykpIHtcbiAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gMykgY29udGludWU7XG4gICAgc2libGluZ3MucHVzaChlbGVtZW50KTtcbiAgfVxuICByZXR1cm4gc2libGluZ3M7XG59XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1tcInRydWVjbGlja1wiXSA9IHtcbiAgaW5pdDogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IpIHtcbiAgICBlbGVtZW50Lm9uY2xpY2sgPSAoKSA9PiB0cnVlO1xuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUtleTJjbGljayhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICByZXR1cm4gKGV2OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgdmFyIGNoYXIgPSBldi53aGljaCB8fCBldi5rZXlDb2RlO1xuICAgIGlmIChjaGFyID09PSAxMyB8fCBjaGFyID09PSAzMikge1xuICAgICAgZWxlbWVudC5jbGljaygpO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gMjcpIHtcbiAgICAgIGVsZW1lbnQuYmx1cigpO1xuICAgIH1cbiAgfTtcbn1cblxua28uYmluZGluZ0hhbmRsZXJzW1wia2V5MmNsaWNrXCJdID0ge1xuICBpbml0OiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3NBY2Nlc3Nvcikge1xuICAgIGVsZW1lbnQub25rZXl1cCA9IGNyZWF0ZUtleTJjbGljayhlbGVtZW50KTtcbiAgfSxcbn07XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1tcImNsaWNrTm9Gb2N1c1wiXSA9IHtcbiAgaW5pdDogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IsIHZpZXdNb2RlbCkge1xuICAgIGVsZW1lbnQub25jbGljayA9IChldikgPT4ge1xuICAgICAgdmFsdWVBY2Nlc3NvcigpLmNhbGwodmlld01vZGVsLCB2aWV3TW9kZWwsIGV2KTtcbiAgICB9O1xuICB9LFxufTtcblxua28uYmluZGluZ0hhbmRsZXJzW1wiYWZ0ZXJSZW5kZXJQYXJlbnRcIl0gPSB7XG4gIGluaXQ6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5nc0FjY2Vzc29yLCB2aWV3TW9kZWwpIHtcbiAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB2YWx1ZUFjY2Vzc29yKCkgJiYgdmFsdWVBY2Nlc3NvcigpKFtlbGVtZW50LnBhcmVudEVsZW1lbnRdKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eUV4aXN0cyhvYmo6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgbGV0IHJlc3VsdCA9IHRydWU7XG4gIGlmICghIW9iaiAmJiB0eXBlb2Ygb2JqLmdldFR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IHByb3BlcnR5ID0gU2VyaWFsaXplci5maW5kUHJvcGVydHkob2JqLmdldFR5cGUoKSwgcHJvcGVydHlOYW1lKTtcbiAgICByZXN1bHQgPSAhIXByb3BlcnR5O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3BlcnR5VmlzaWJsZShvYmo6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgbGV0IHJlc3VsdCA9IHRydWU7XG4gIGlmICghIW9iaiAmJiB0eXBlb2Ygb2JqLmdldFR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IHByb3BlcnR5ID0gU2VyaWFsaXplci5maW5kUHJvcGVydHkob2JqLmdldFR5cGUoKSwgcHJvcGVydHlOYW1lKTtcbiAgICByZXN1bHQgPSAhcHJvcGVydHkgfHwgcHJvcGVydHkudmlzaWJsZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiLyogZm9yayBvZiB0aGUgaHR0cHM6Ly9naXRodWIuY29tL1NvcnRhYmxlSlMva25vY2tvdXQtc29ydGFibGVqcyBiZWNhdXNlIG9mIGVzIG1vZHVsZXMgYnVpbGQgZXJyb3IgXG4gICAgd2FpdGluZyBmb3IgYXBwcm92ZSBwdWxscmVxdWVzdHM6XG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL1NvcnRhYmxlSlMva25vY2tvdXQtc29ydGFibGVqcy9wdWxsLzkpXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL1NvcnRhYmxlSlMva25vY2tvdXQtc29ydGFibGVqcy9wdWxsLzEvZmlsZXNcbiAgQ2hhbmdlIGxpbmU6XG4gIGlmIChoYW5kbGVyKSBoYW5kbGVyKGUsIGl0ZW1WTSwgcGFyZW50Vk0sIGNvbGxlY3Rpb24sIGJpbmRpbmdzKTtcbiAgdG86XG4gIGlmIChoYW5kbGVyICYmIGhhbmRsZXIoZSwgaXRlbVZNLCBwYXJlbnRWTSwgY29sbGVjdGlvbiwgYmluZGluZ3MpKSByZXR1cm47XG4qL1xuXG4vKmdsb2JhbCBrbyovXG5cbihmdW5jdGlvbihmYWN0b3J5KSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICAvL2dldCBrbyByZWYgdmlhIGdsb2JhbCBvciByZXF1aXJlXG4gIHZhciBrb1JlZjtcbiAgaWYgKHR5cGVvZiBrbyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIC8vZ2xvYmFsIHJlZiBhbHJlYWR5IGRlZmluZWRcbiAgICBrb1JlZiA9IGtvO1xuICB9IGVsc2UgaWYgKFxuICAgIHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCJcbiAgKSB7XG4gICAgLy9jb21tb25qcyAvIG5vZGUuanNcbiAgICBrb1JlZiA9IHJlcXVpcmUoXCJrbm9ja291dFwiKTtcbiAgfVxuICAvL2dldCBzb3J0YWJsZSByZWYgdmlhIGdsb2JhbCBvciByZXF1aXJlXG4gIHZhciBzb3J0YWJsZVJlZjtcbiAgaWYgKHR5cGVvZiBTb3J0YWJsZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIC8vZ2xvYmFsIHJlZiBhbHJlYWR5IGRlZmluZWRcbiAgICBzb3J0YWJsZVJlZiA9IFNvcnRhYmxlO1xuICB9IGVsc2UgaWYgKFxuICAgIHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCJcbiAgKSB7XG4gICAgLy9jb21tb25qcyAvIG5vZGUuanNcbiAgICBzb3J0YWJsZVJlZiA9IHJlcXVpcmUoXCJzb3J0YWJsZWpzXCIpO1xuICB9XG4gIC8vdXNlIHJlZmVyZW5jZXMgaWYgd2UgZm91bmQgdGhlbVxuICBpZiAoa29SZWYgIT09IHVuZGVmaW5lZCAmJiBzb3J0YWJsZVJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZmFjdG9yeShrb1JlZiwgc29ydGFibGVSZWYpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy9pZiBib3RoIHJlZmVyZW5jZXMgYXJlbid0IGZvdW5kIHlldCwgZ2V0IHZpYSBBTUQgaWYgYXZhaWxhYmxlXG4gICAgLy93ZSBtYXkgaGF2ZSBhIHJlZmVyZW5jZSB0byBvbmx5IDEsIG9yIG5vbmVcbiAgICBpZiAoa29SZWYgIT09IHVuZGVmaW5lZCAmJiBzb3J0YWJsZVJlZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWZpbmUoW1wic29ydGFibGVqc1wiXSwgZnVuY3Rpb24oYW1kU29ydGFibGVSZWYpIHtcbiAgICAgICAgZmFjdG9yeShrb1JlZiwgYW1kU29ydGFibGVSZWYpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChrb1JlZiA9PT0gdW5kZWZpbmVkICYmIHNvcnRhYmxlUmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlZmluZShbXCJrbm9ja291dFwiXSwgZnVuY3Rpb24oYW1kS25vY2tvdXQpIHtcbiAgICAgICAgZmFjdG9yeShhbWRLbm9ja291dCwgc29ydGFibGVSZWYpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChrb1JlZiA9PT0gdW5kZWZpbmVkICYmIHNvcnRhYmxlUmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlZmluZShbXCJrbm9ja291dFwiLCBcInNvcnRhYmxlanNcIl0sIGZhY3RvcnkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvL25vIG1vcmUgcm91dGVzIHRvIGdldCByZWZlcmVuY2VzXG4gICAgLy9yZXBvcnQgc3BlY2lmaWMgZXJyb3JcbiAgICBpZiAoa29SZWYgIT09IHVuZGVmaW5lZCAmJiBzb3J0YWJsZVJlZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJrbm9ja291dC1zb3J0YWJsZSBjb3VsZCBub3QgZ2V0IHJlZmVyZW5jZSB0byBTb3J0YWJsZVwiKTtcbiAgICB9IGVsc2UgaWYgKGtvUmVmID09PSB1bmRlZmluZWQgJiYgc29ydGFibGVSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwia25vY2tvdXQtc29ydGFibGUgY291bGQgbm90IGdldCByZWZlcmVuY2UgdG8gS25vY2tvdXRcIik7XG4gICAgfSBlbHNlIGlmIChrb1JlZiA9PT0gdW5kZWZpbmVkICYmIHNvcnRhYmxlUmVmID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJrbm9ja291dC1zb3J0YWJsZSBjb3VsZCBub3QgZ2V0IHJlZmVyZW5jZSB0byBLbm9ja291dCBvciBTb3J0YWJsZVwiXG4gICAgICApO1xuICAgIH1cbiAgfVxufSkoZnVuY3Rpb24oa28sIFNvcnRhYmxlKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBpbml0ID0gZnVuY3Rpb24oXG4gICAgICBlbGVtZW50LFxuICAgICAgdmFsdWVBY2Nlc3NvcixcbiAgICAgIGFsbEJpbmRpbmdzLFxuICAgICAgdmlld01vZGVsLFxuICAgICAgYmluZGluZ0NvbnRleHQsXG4gICAgICBzb3J0YWJsZU9wdGlvbnNcbiAgICApIHtcbiAgICAgIHZhciBvcHRpb25zID0gYnVpbGRPcHRpb25zKHZhbHVlQWNjZXNzb3IsIHNvcnRhYmxlT3B0aW9ucyk7XG5cbiAgICAgIC8vIEl0cyBzZWVtcyB0aGF0IHdlIGNhbm5vdCB1cGRhdGUgdGhlIGV2ZW50aGFuZGxlcnMgYWZ0ZXIgd2UndmUgY3JlYXRlZFxuICAgICAgLy8gdGhlIHNvcnRhYmxlLCBzbyBkZWZpbmUgdGhlbSBpbiBpbml0IGluc3RlYWQgb2YgdXBkYXRlXG4gICAgICBbXG4gICAgICAgIFwib25TdGFydFwiLFxuICAgICAgICBcIm9uRW5kXCIsXG4gICAgICAgIFwib25SZW1vdmVcIixcbiAgICAgICAgXCJvbkFkZFwiLFxuICAgICAgICBcIm9uVXBkYXRlXCIsXG4gICAgICAgIFwib25Tb3J0XCIsXG4gICAgICAgIFwib25GaWx0ZXJcIixcbiAgICAgICAgXCJvbk1vdmVcIixcbiAgICAgICAgXCJvbkNsb25lXCJcbiAgICAgIF0uZm9yRWFjaChmdW5jdGlvbihlKSB7XG4gICAgICAgIGlmIChvcHRpb25zW2VdIHx8IGV2ZW50SGFuZGxlcnNbZV0pXG4gICAgICAgICAgb3B0aW9uc1tlXSA9IGZ1bmN0aW9uKFxuICAgICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgICAgcGFyZW50Vk0sXG4gICAgICAgICAgICBwYXJlbnRCaW5kaW5ncyxcbiAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgICBlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB2YXIgaXRlbVZNID0ga28uZGF0YUZvcihlLml0ZW0pLFxuICAgICAgICAgICAgICAvLyBBbGwgb2YgdGhlIGJpbmRpbmdzIG9uIHRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAgICAgICAgICBiaW5kaW5ncyA9IGtvLnV0aWxzLnBlZWtPYnNlcnZhYmxlKHBhcmVudEJpbmRpbmdzKCkpLFxuICAgICAgICAgICAgICAvLyBUaGUgYmluZGluZyBvcHRpb25zIGZvciB0aGUgZHJhZ2dhYmxlL3NvcnRhYmxlIGJpbmRpbmcgb2YgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICAgICAgICAgIGJpbmRpbmdIYW5kbGVyQmluZGluZyA9IGJpbmRpbmdzLnNvcnRhYmxlIHx8IGJpbmRpbmdzLmRyYWdnYWJsZSxcbiAgICAgICAgICAgICAgLy8gVGhlIGNvbGxlY3Rpb24gdGhhdCB3ZSBzaG91bGQgbW9kaWZ5XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb24gPVxuICAgICAgICAgICAgICAgIGJpbmRpbmdIYW5kbGVyQmluZGluZy5jb2xsZWN0aW9uIHx8XG4gICAgICAgICAgICAgICAgYmluZGluZ0hhbmRsZXJCaW5kaW5nLmZvcmVhY2g7XG4gICAgICAgICAgICBpZiAoaGFuZGxlciAmJiBoYW5kbGVyKGUsIGl0ZW1WTSwgcGFyZW50Vk0sIGNvbGxlY3Rpb24sIGJpbmRpbmdzKSlcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcnNbZXZlbnRUeXBlXSlcbiAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyc1tldmVudFR5cGVdKFxuICAgICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAgICAgaXRlbVZNLFxuICAgICAgICAgICAgICAgIHBhcmVudFZNLFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgYmluZGluZ3NcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LmJpbmQodW5kZWZpbmVkLCBlLCB2aWV3TW9kZWwsIGFsbEJpbmRpbmdzLCBvcHRpb25zW2VdKTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgc29ydGFibGVFbGVtZW50ID0gU29ydGFibGUuY3JlYXRlKGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAvLyBEZXN0cm95IHRoZSBzb3J0YWJsZSBpZiBrbm9ja291dCBkaXNwb3NlcyB0aGUgZWxlbWVudCBpdHMgY29ubmVjdGVkIHRvXG4gICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsZW1lbnQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzb3J0YWJsZUVsZW1lbnQuZGVzdHJveSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzLnRlbXBsYXRlLmluaXQoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcik7XG4gICAgfSxcbiAgICB1cGRhdGUgPSBmdW5jdGlvbihcbiAgICAgIGVsZW1lbnQsXG4gICAgICB2YWx1ZUFjY2Vzc29yLFxuICAgICAgYWxsQmluZGluZ3MsXG4gICAgICB2aWV3TW9kZWwsXG4gICAgICBiaW5kaW5nQ29udGV4dCxcbiAgICAgIHNvcnRhYmxlT3B0aW9uc1xuICAgICkge1xuICAgICAgLy8gVGhlcmUgc2VlbXMgdG8gYmUgc29tZSBwcm9ibGVtcyB3aXRoIHVwZGF0aW5nIHRoZSBvcHRpb25zIG9mIGEgc29ydGFibGVcbiAgICAgIC8vIFRlc3RlZCB0byBjaGFuZ2UgZXZlbnRoYW5kbGVycyBhbmQgdGhlIGdyb3VwIG9wdGlvbnMgd2l0aG91dCBhbnkgbHVja1xuXG4gICAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzLnRlbXBsYXRlLnVwZGF0ZShcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgdmFsdWVBY2Nlc3NvcixcbiAgICAgICAgYWxsQmluZGluZ3MsXG4gICAgICAgIHZpZXdNb2RlbCxcbiAgICAgICAgYmluZGluZ0NvbnRleHRcbiAgICAgICk7XG4gICAgfSxcbiAgICBldmVudEhhbmRsZXJzID0gKGZ1bmN0aW9uKGhhbmRsZXJzKSB7XG4gICAgICB2YXIgbW92ZU9wZXJhdGlvbnMgPSBbXSxcbiAgICAgICAgdHJ5TW92ZU9wZXJhdGlvbiA9IGZ1bmN0aW9uKFxuICAgICAgICAgIGUsXG4gICAgICAgICAgaXRlbVZNLFxuICAgICAgICAgIHBhcmVudFZNLFxuICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgcGFyZW50QmluZGluZ3NcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQSBtb3ZlIG9wZXJhdGlvbiBpcyB0aGUgY29tYmluYXRpb24gb2YgYSBhZGQgYW5kIHJlbW92ZSBldmVudCxcbiAgICAgICAgICAvLyB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYm90aCB0aGUgdGFyZ2V0IGFuZCBvcmlnaW4gY29sbGVjdGlvbnNcbiAgICAgICAgICB2YXIgY3VycmVudE9wZXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgZXZlbnQ6IGUsXG4gICAgICAgICAgICAgIGl0ZW1WTTogaXRlbVZNLFxuICAgICAgICAgICAgICBwYXJlbnRWTTogcGFyZW50Vk0sXG4gICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgIHBhcmVudEJpbmRpbmdzOiBwYXJlbnRCaW5kaW5nc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4aXN0aW5nT3BlcmF0aW9uID0gbW92ZU9wZXJhdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKG9wKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvcC5pdGVtVk0gPT09IGN1cnJlbnRPcGVyYXRpb24uaXRlbVZNO1xuICAgICAgICAgICAgfSlbMF07XG5cbiAgICAgICAgICBpZiAoIWV4aXN0aW5nT3BlcmF0aW9uKSB7XG4gICAgICAgICAgICBtb3ZlT3BlcmF0aW9ucy5wdXNoKGN1cnJlbnRPcGVyYXRpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBmaW5pc2hpbmcgdGhlIG9wZXJhdGlvbiBhbmQgYWxyZWFkeSBoYXZlIGEgaGFuZGxlIG9uXG4gICAgICAgICAgICAvLyB0aGUgb3BlcmF0aW9uIGl0ZW0gbWVhbmluZyB0aGF0IGl0cyBzYWZlIHRvIHJlbW92ZSBpdFxuICAgICAgICAgICAgbW92ZU9wZXJhdGlvbnMuc3BsaWNlKG1vdmVPcGVyYXRpb25zLmluZGV4T2YoZXhpc3RpbmdPcGVyYXRpb24pLCAxKTtcblxuICAgICAgICAgICAgdmFyIHJlbW92ZU9wZXJhdGlvbiA9XG4gICAgICAgICAgICAgICAgY3VycmVudE9wZXJhdGlvbi5ldmVudC50eXBlID09PSBcInJlbW92ZVwiXG4gICAgICAgICAgICAgICAgICA/IGN1cnJlbnRPcGVyYXRpb25cbiAgICAgICAgICAgICAgICAgIDogZXhpc3RpbmdPcGVyYXRpb24sXG4gICAgICAgICAgICAgIGFkZE9wZXJhdGlvbiA9XG4gICAgICAgICAgICAgICAgY3VycmVudE9wZXJhdGlvbi5ldmVudC50eXBlID09PSBcImFkZFwiXG4gICAgICAgICAgICAgICAgICA/IGN1cnJlbnRPcGVyYXRpb25cbiAgICAgICAgICAgICAgICAgIDogZXhpc3RpbmdPcGVyYXRpb247XG5cbiAgICAgICAgICAgIG1vdmVJdGVtKFxuICAgICAgICAgICAgICBpdGVtVk0sXG4gICAgICAgICAgICAgIHJlbW92ZU9wZXJhdGlvbi5jb2xsZWN0aW9uLFxuICAgICAgICAgICAgICBhZGRPcGVyYXRpb24uY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgYWRkT3BlcmF0aW9uLmV2ZW50LmNsb25lLFxuICAgICAgICAgICAgICBhZGRPcGVyYXRpb24uZXZlbnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyBNb3ZlcyBhbiBpdGVtIGZyb20gdGhlIFwiZnJvbVwiIGNvbGxlY3Rpb24gdG8gdGhlIFwidG9cIiBjb2xsZWN0aW9uLCB0aGVzZVxuICAgICAgICAvLyBjYW4gYmUgcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBjb2xsZWN0aW9uIHdoaWNoIG1lYW5zIGl0cyBhIHNvcnQuXG4gICAgICAgIC8vIGNsb25lIGluZGljYXRlcyBpZiB3ZSBzaG91bGQgbW92ZSBvciBjb3B5IHRoZSBpdGVtIGludG8gdGhlIG5ldyBjb2xsZWN0aW9uXG4gICAgICAgIG1vdmVJdGVtID0gZnVuY3Rpb24oaXRlbVZNLCBmcm9tLCB0bywgY2xvbmUsIGUpIHtcbiAgICAgICAgICAvLyBVbndyYXBwaW5nIHRoaXMgYWxsb3dzIHVzIHRvIG1hbmlwdWxhdGUgdGhlIGFjdHVhbCBhcnJheVxuICAgICAgICAgIHZhciBmcm9tQXJyYXkgPSBmcm9tKCksXG4gICAgICAgICAgICAvLyBJdHMgbm90IGNlcnRhaW4gdGhhdCB0aGUgaXRlbXMgYWN0dWFsIGluZGV4IGlzIHRoZSBzYW1lXG4gICAgICAgICAgICAvLyBhcyB0aGUgaW5kZXggcmVwb3J0ZWQgYnkgc29ydGFibGUgZHVlIHRvIGZpbHRlcmluZyBldGMuXG4gICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gZnJvbUFycmF5LmluZGV4T2YoaXRlbVZNKSxcbiAgICAgICAgICAgIG5ld0luZGV4ID0gZS5uZXdJbmRleDtcblxuICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZmluZCBvdXQgdGhlIGFjdHVhbCBkZXNpcmVkIGluZGV4IG9mIHRoZSB0byBhcnJheSxcbiAgICAgICAgICAvLyBhcyB0aGlzIG1pZ2h0IGJlIGEgY29tcHV0ZWQgYXJyYXkuIFdlIGNvdWxkIG90aGVyd2lzZSBwb3RlbnRpYWxseVxuICAgICAgICAgIC8vIGRyb3AgYW4gaXRlbSBhYm92ZSB0aGUgM3JkIHZpc2libGUgaXRlbSwgYnV0IHRoZSAybmQgdmlzaWJsZSBpdGVtXG4gICAgICAgICAgLy8gaGFzIGFuIGFjdHVhbCBpbmRleCBvZiA1LlxuICAgICAgICAgIGlmIChlLml0ZW0ucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgICAgICAgICAgbmV3SW5kZXggPSB0bygpLmluZGV4T2Yoa28uZGF0YUZvcihlLml0ZW0ucHJldmlvdXNFbGVtZW50U2libGluZykpO1xuICAgICAgICAgICAgbmV3SW5kZXggKz0gbmV3SW5kZXggPiBvcmlnaW5hbEluZGV4ID8gMCA6IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmVtb3ZlIHNvcnRhYmxlcyBcInVuYm91bmRcIiBlbGVtZW50XG4gICAgICAgICAgZS5pdGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZS5pdGVtKTtcblxuICAgICAgICAgIC8vIFRoaXMgc3BsaWNlIGlzIG5lY2Vzc2FyeSBmb3IgYm90aCBjbG9uZSBhbmQgbW92ZS9zb3J0XG4gICAgICAgICAgLy8gSW4gc29ydC9tb3ZlIHNpbmNlIGl0IHNob3VsZG4ndCBiZSBhdCB0aGlzIGluZGV4L2luIHRoaXMgYXJyYXkgYW55bW9yZVxuICAgICAgICAgIC8vIEluIGNsb25lIHNpbmNlIHdlIGhhdmUgdG8gd29yayBhcm91bmQga25vY2tvdXRzIHZhbHVIYXNNdXRhdGVkXG4gICAgICAgICAgLy8gd2hlbiBtYW5pcHVsYXRpbmcgYXJyYXlzIGFuZCBhdm9pZCBhIFwidW5ib3VuZFwiIGl0ZW0gYWRkZWQgYnkgc29ydGFibGVcbiAgICAgICAgICBmcm9tQXJyYXkuc3BsaWNlKG9yaWdpbmFsSW5kZXgsIDEpO1xuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgYXJyYXksIHRoaXMgd2lsbCBhbHNvIHJlbW92ZSBzb3J0YWJsZXMgXCJ1bmJvdW5kXCIgY2xvbmVcbiAgICAgICAgICBmcm9tLnZhbHVlSGFzTXV0YXRlZCgpO1xuICAgICAgICAgIGlmIChjbG9uZSAmJiBmcm9tICE9PSB0bykge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgaXRlbVxuICAgICAgICAgICAgZnJvbUFycmF5LnNwbGljZShvcmlnaW5hbEluZGV4LCAwLCBpdGVtVk0pO1xuICAgICAgICAgICAgLy8gRm9yY2Uga25vY2tvdXQgdG8gdXBkYXRlXG4gICAgICAgICAgICBmcm9tLnZhbHVlSGFzTXV0YXRlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGb3JjZSBkZWZlcnJlZCB0YXNrcyB0byBydW4gbm93LCByZWdpc3RlcmluZyB0aGUgcmVtb3ZhbFxuICAgICAgICAgICEha28udGFza3MgJiYga28udGFza3MucnVuRWFybHkoKTtcbiAgICAgICAgICAvLyBJbnNlcnQgdGhlIGl0ZW0gb24gaXRzIG5ldyBwb3NpdGlvblxuICAgICAgICAgIHRvKCkuc3BsaWNlKG5ld0luZGV4LCAwLCBpdGVtVk0pO1xuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0byB0ZWxsIGtub2Nrb3V0IHRoYXQgd2UndmUgbW9kaWZpZWQgdGhlIGFjdHVhbCBhcnJheS5cbiAgICAgICAgICB0by52YWx1ZUhhc011dGF0ZWQoKTtcbiAgICAgICAgfTtcblxuICAgICAgaGFuZGxlcnMub25SZW1vdmUgPSB0cnlNb3ZlT3BlcmF0aW9uO1xuICAgICAgaGFuZGxlcnMub25BZGQgPSB0cnlNb3ZlT3BlcmF0aW9uO1xuICAgICAgaGFuZGxlcnMub25VcGRhdGUgPSBmdW5jdGlvbihcbiAgICAgICAgZSxcbiAgICAgICAgaXRlbVZNLFxuICAgICAgICBwYXJlbnRWTSxcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgcGFyZW50QmluZGluZ3NcbiAgICAgICkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgYmUgcGVyZm9ybWVkIGFzIGEgc29ydCBzaW5jZSB0aGUgdG8vZnJvbSBjb2xsZWN0aW9uc1xuICAgICAgICAvLyByZWZlcmVuY2UgdGhlIHNhbWUgY29sbGVjdGlvbiBhbmQgY2xvbmUgaXMgc2V0IHRvIGZhbHNlXG4gICAgICAgIG1vdmVJdGVtKGl0ZW1WTSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbiwgZmFsc2UsIGUpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGhhbmRsZXJzO1xuICAgIH0pKHt9KSxcbiAgICAvLyBiaW5kaW5nT3B0aW9ucyBhcmUgdGhlIG9wdGlvbnMgc2V0IGluIHRoZSBcImRhdGEtYmluZFwiIGF0dHJpYnV0ZSBpbiB0aGUgdWkuXG4gICAgLy8gb3B0aW9ucyBhcmUgY3VzdG9tIG9wdGlvbnMsIGZvciBpbnN0YW5jZSBkcmFnZ2FibGUvc29ydGFibGUgc3BlY2lmaWMgb3B0aW9uc1xuICAgIGJ1aWxkT3B0aW9ucyA9IGZ1bmN0aW9uKGJpbmRpbmdPcHRpb25zLCBvcHRpb25zKSB7XG4gICAgICAvLyBkZWVwIGNsb25lL2NvcHkgb2YgcHJvcGVydGllcyBmcm9tIHRoZSBcImZyb21cIiBhcmd1bWVudCBvbnRvXG4gICAgICAvLyB0aGUgXCJpbnRvXCIgYXJndW1lbnQgYW5kIHJldHVybnMgdGhlIG1vZGlmaWVkIFwiaW50b1wiXG4gICAgICB2YXIgbWVyZ2UgPSBmdW5jdGlvbihpbnRvLCBmcm9tKSB7XG4gICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBmcm9tKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmcm9tW3Byb3BdKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW50b1twcm9wXSkgIT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaW50b1twcm9wXSA9IHt9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGludG9bcHJvcF0gPSBtZXJnZShpbnRvW3Byb3BdLCBmcm9tW3Byb3BdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpbnRvW3Byb3BdID0gZnJvbVtwcm9wXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gaW50bztcbiAgICAgICAgfSxcbiAgICAgICAgLy8gdW53cmFwIHRoZSBzdXBwbGllZCBvcHRpb25zXG4gICAgICAgIHVud3JhcHBlZE9wdGlvbnMgPVxuICAgICAgICAgIGtvLnV0aWxzLnBlZWtPYnNlcnZhYmxlKGJpbmRpbmdPcHRpb25zKCkpLm9wdGlvbnMgfHwge307XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IG1vZGlmeSB0aGUgcHJvdmlkZWQgc2V0dGluZ3Mgb2JqZWN0XG4gICAgICBvcHRpb25zID0gbWVyZ2Uoe30sIG9wdGlvbnMpO1xuXG4gICAgICAvLyBncm91cCBpcyBoYW5kbGVkIGRpZmZlcmVudGx5IHNpbmNlIHdlIHNob3VsZCBib3RoIGFsbG93IHRvIGNoYW5nZVxuICAgICAgLy8gYSBkcmFnZ2FibGUgdG8gYSBzb3J0YWJsZSAoYW5kIHZpY2UgdmVyc2EpLCBidXQgc3RpbGwgYmUgYWJsZSB0byBzZXRcbiAgICAgIC8vIGEgbmFtZSBvbiBhIGRyYWdnYWJsZSB3aXRob3V0IGl0IGJlY29taW5nIGEgZHJvcCB0YXJnZXQuXG4gICAgICBpZiAoXG4gICAgICAgIHVud3JhcHBlZE9wdGlvbnMuZ3JvdXAgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHVud3JhcHBlZE9wdGlvbnMuZ3JvdXApICE9PVxuICAgICAgICAgIFwiW29iamVjdCBPYmplY3RdXCJcbiAgICAgICkge1xuICAgICAgICAvLyBncm91cCBwcm9wZXJ0eSBpcyBhIG5hbWUgc3RyaW5nIGRlY2xhcmF0aW9uLCBjb252ZXJ0IHRvIG9iamVjdC5cbiAgICAgICAgdW53cmFwcGVkT3B0aW9ucy5ncm91cCA9IHsgbmFtZTogdW53cmFwcGVkT3B0aW9ucy5ncm91cCB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVyZ2Uob3B0aW9ucywgdW53cmFwcGVkT3B0aW9ucyk7XG4gICAgfTtcblxuICBrby5iaW5kaW5nSGFuZGxlcnMuZHJhZ2dhYmxlID0ge1xuICAgIHNvcnRhYmxlT3B0aW9uczoge1xuICAgICAgZ3JvdXA6IHsgcHVsbDogXCJjbG9uZVwiLCBwdXQ6IGZhbHNlIH0sXG4gICAgICBzb3J0OiBmYWxzZVxuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24oXG4gICAgICBlbGVtZW50LFxuICAgICAgdmFsdWVBY2Nlc3NvcixcbiAgICAgIGFsbEJpbmRpbmdzLFxuICAgICAgdmlld01vZGVsLFxuICAgICAgYmluZGluZ0NvbnRleHRcbiAgICApIHtcbiAgICAgIHJldHVybiBpbml0KFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICB2YWx1ZUFjY2Vzc29yLFxuICAgICAgICBhbGxCaW5kaW5ncyxcbiAgICAgICAgdmlld01vZGVsLFxuICAgICAgICBiaW5kaW5nQ29udGV4dCxcbiAgICAgICAga28uYmluZGluZ0hhbmRsZXJzLmRyYWdnYWJsZS5zb3J0YWJsZU9wdGlvbnNcbiAgICAgICk7XG4gICAgfSxcbiAgICB1cGRhdGU6IGZ1bmN0aW9uKFxuICAgICAgZWxlbWVudCxcbiAgICAgIHZhbHVlQWNjZXNzb3IsXG4gICAgICBhbGxCaW5kaW5ncyxcbiAgICAgIHZpZXdNb2RlbCxcbiAgICAgIGJpbmRpbmdDb250ZXh0XG4gICAgKSB7XG4gICAgICByZXR1cm4gdXBkYXRlKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICB2YWx1ZUFjY2Vzc29yLFxuICAgICAgICBhbGxCaW5kaW5ncyxcbiAgICAgICAgdmlld01vZGVsLFxuICAgICAgICBiaW5kaW5nQ29udGV4dCxcbiAgICAgICAga28uYmluZGluZ0hhbmRsZXJzLmRyYWdnYWJsZS5zb3J0YWJsZU9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGtvLmJpbmRpbmdIYW5kbGVycy5zb3J0YWJsZSA9IHtcbiAgICBzb3J0YWJsZU9wdGlvbnM6IHtcbiAgICAgIGdyb3VwOiB7IHB1bGw6IHRydWUsIHB1dDogdHJ1ZSB9XG4gICAgfSxcbiAgICBpbml0OiBmdW5jdGlvbihcbiAgICAgIGVsZW1lbnQsXG4gICAgICB2YWx1ZUFjY2Vzc29yLFxuICAgICAgYWxsQmluZGluZ3MsXG4gICAgICB2aWV3TW9kZWwsXG4gICAgICBiaW5kaW5nQ29udGV4dFxuICAgICkge1xuICAgICAgcmV0dXJuIGluaXQoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHZhbHVlQWNjZXNzb3IsXG4gICAgICAgIGFsbEJpbmRpbmdzLFxuICAgICAgICB2aWV3TW9kZWwsXG4gICAgICAgIGJpbmRpbmdDb250ZXh0LFxuICAgICAgICBrby5iaW5kaW5nSGFuZGxlcnMuc29ydGFibGUuc29ydGFibGVPcHRpb25zXG4gICAgICApO1xuICAgIH0sXG4gICAgdXBkYXRlOiBmdW5jdGlvbihcbiAgICAgIGVsZW1lbnQsXG4gICAgICB2YWx1ZUFjY2Vzc29yLFxuICAgICAgYWxsQmluZGluZ3MsXG4gICAgICB2aWV3TW9kZWwsXG4gICAgICBiaW5kaW5nQ29udGV4dFxuICAgICkge1xuICAgICAgcmV0dXJuIHVwZGF0ZShcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgdmFsdWVBY2Nlc3NvcixcbiAgICAgICAgYWxsQmluZGluZ3MsXG4gICAgICAgIHZpZXdNb2RlbCxcbiAgICAgICAgYmluZGluZ0NvbnRleHQsXG4gICAgICAgIGtvLmJpbmRpbmdIYW5kbGVycy5zb3J0YWJsZS5zb3J0YWJsZU9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICB9O1xufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfa25vY2tvdXRfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfc3VydmV5X2tub2Nrb3V0X187Il0sInNvdXJjZVJvb3QiOiIifQ==\n\n//# sourceURL=webpack:///./node_modules/survey-creator/survey-creator.js?"); + +/***/ }), + +/***/ "./node_modules/survey-knockout/survey.ko.js": +/*!***************************************************!*\ + !*** ./node_modules/survey-knockout/survey.ko.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("/*!\n * surveyjs - Survey JavaScript library v1.8.58\n * Copyright (c) 2015-2021 Devsoft Baltic OÜ - http://surveyjs.io/\n * License: MIT (http://www.opensource.org/licenses/mit-license.php)\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory(__webpack_require__(/*! knockout */ \"./node_modules/knockout/build/output/knockout-latest.js\"));\n\telse {}\n})(this, function(__WEBPACK_EXTERNAL_MODULE_knockout__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = \"./src/entries/knockout.ts\");\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/panel/panel.html\":\n/*!*******************************************************************************************************************!*\\\n !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/components/panel/panel.html ***!\n \\*******************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\";\n\n/***/ }),\n\n/***/ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/popup/popup.html\":\n/*!*******************************************************************************************************************!*\\\n !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/components/popup/popup.html ***!\n \\*******************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n \\n \\n \\n \\n
\\n
\\n
\\n\\n \\n
\\n \\n Cancel\\n \\n \\n Apply\\n \\n
\\n \\n \\n \\n\\n\";\n\n/***/ }),\n\n/***/ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/progress/buttons.html\":\n/*!************************************************************************************************************************!*\\\n !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/components/progress/buttons.html ***!\n \\************************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\n
\\n
\\n
\\n
    \\n
  • \\n
    \\n
    \\n
  • \\n
\\n
\\n
\\n
\\n
\";\n\n/***/ }),\n\n/***/ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/progress/progress.html\":\n/*!*************************************************************************************************************************!*\\\n !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/components/progress/progress.html ***!\n \\*************************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\n
\\n \\n
\\n \\n
\";\n\n/***/ }),\n\n/***/ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/templates/entry.html\":\n/*!************************************************************************************************************!*\\\n !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/templates/entry.html ***!\n \\************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = \"\" + __webpack_require__(/*! ./comment.html */ \"./src/knockout/templates/comment.html\") + \"\\n\" + __webpack_require__(/*! ./flowpanel.html */ \"./src/knockout/templates/flowpanel.html\") + \"\\n\" + __webpack_require__(/*! ./header.html */ \"./src/knockout/templates/header.html\") + \"\\n\" + __webpack_require__(/*! ./index.html */ \"./src/knockout/templates/index.html\") + \"\\n\" + __webpack_require__(/*! ./page.html */ \"./src/knockout/templates/page.html\") + \"\\n\" + __webpack_require__(/*! ./panel.html */ \"./src/knockout/templates/panel.html\") + \"\\n\" + __webpack_require__(/*! ./rows.html */ \"./src/knockout/templates/rows.html\") + \"\\n\" + __webpack_require__(/*! ./row.html */ \"./src/knockout/templates/row.html\") + \"\\n\" + __webpack_require__(/*! ./string.html */ \"./src/knockout/templates/string.html\") + \"\\n\" + __webpack_require__(/*! ./timerpanel.html */ \"./src/knockout/templates/timerpanel.html\") + \"\\n\" + __webpack_require__(/*! ./question.html */ \"./src/knockout/templates/question.html\") + \"\\n\" + __webpack_require__(/*! ./questiontitle.html */ \"./src/knockout/templates/questiontitle.html\") + \"\\n\" + __webpack_require__(/*! ./question-boolean.html */ \"./src/knockout/templates/question-boolean.html\") + \"\\n\" + __webpack_require__(/*! ./question-checkbox.html */ \"./src/knockout/templates/question-checkbox.html\") + \"\\n\" + __webpack_require__(/*! ./question-ranking.html */ \"./src/knockout/templates/question-ranking.html\") + \"\\n\" + __webpack_require__(/*! ./question-comment.html */ \"./src/knockout/templates/question-comment.html\") + \"\\n\" + __webpack_require__(/*! ./question-composite.html */ \"./src/knockout/templates/question-composite.html\") + \"\\n\" + __webpack_require__(/*! ./question-custom.html */ \"./src/knockout/templates/question-custom.html\") + \"\\n\" + __webpack_require__(/*! ./question-dropdown.html */ \"./src/knockout/templates/question-dropdown.html\") + \"\\n\" + __webpack_require__(/*! ./question-empty.html */ \"./src/knockout/templates/question-empty.html\") + \"\\n\" + __webpack_require__(/*! ./question-errors.html */ \"./src/knockout/templates/question-errors.html\") + \"\\n\" + __webpack_require__(/*! ./question-expression.html */ \"./src/knockout/templates/question-expression.html\") + \"\\n\" + __webpack_require__(/*! ./question-file.html */ \"./src/knockout/templates/question-file.html\") + \"\\n\" + __webpack_require__(/*! ./question-html.html */ \"./src/knockout/templates/question-html.html\") + \"\\n\" + __webpack_require__(/*! ./question-image.html */ \"./src/knockout/templates/question-image.html\") + \"\\n\" + __webpack_require__(/*! ./question-imagepicker.html */ \"./src/knockout/templates/question-imagepicker.html\") + \"\\n\" + __webpack_require__(/*! ./question-matrix.html */ \"./src/knockout/templates/question-matrix.html\") + \"\\n\" + __webpack_require__(/*! ./question-matrixdynamic.html */ \"./src/knockout/templates/question-matrixdynamic.html\") + \"\\n\" + __webpack_require__(/*! ./question-multipletext.html */ \"./src/knockout/templates/question-multipletext.html\") + \"\\n\" + __webpack_require__(/*! ./question-paneldynamic.html */ \"./src/knockout/templates/question-paneldynamic.html\") + \"\\n\" + __webpack_require__(/*! ./question-paneldynamic-navigator.html */ \"./src/knockout/templates/question-paneldynamic-navigator.html\") + \"\\n\" + __webpack_require__(/*! ./question-radiogroup.html */ \"./src/knockout/templates/question-radiogroup.html\") + \"\\n\" + __webpack_require__(/*! ./question-rating.html */ \"./src/knockout/templates/question-rating.html\") + \"\\n\" + __webpack_require__(/*! ./question-signaturepad.html */ \"./src/knockout/templates/question-signaturepad.html\") + \"\\n\" + __webpack_require__(/*! ./question-text.html */ \"./src/knockout/templates/question-text.html\") + \"\\n\" + __webpack_require__(/*! ./question-buttongroup.html */ \"./src/knockout/templates/question-buttongroup.html\") + \"\";\n\n/***/ }),\n\n/***/ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/templates/window/window.html\":\n/*!********************************************************************************************************************!*\\\n !*** ./node_modules/html-loader?interpolate!./node_modules/val-loader!./src/knockout/templates/window/window.html ***!\n \\********************************************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\n
\\n \\n \\n \\n \\n \\n X\\n \\n
\\n
\\n
\\n
\\n
\";\n\n/***/ }),\n\n/***/ \"./node_modules/signature_pad/dist/signature_pad.mjs\":\n/*!***********************************************************!*\\\n !*** ./node_modules/signature_pad/dist/signature_pad.mjs ***!\n \\***********************************************************/\n/*! exports provided: default */\n/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/*!\n * Signature Pad v2.3.2\n * https://github.com/szimek/signature_pad\n *\n * Copyright 2017 Szymon Nowak\n * Released under the MIT license\n *\n * The main idea and some parts of the code (e.g. drawing variable width Bézier curve) are taken from:\n * http://corner.squareup.com/2012/07/smoother-signatures.html\n *\n * Implementation of interpolation using cubic Bézier curves is taken from:\n * http://benknowscode.wordpress.com/2012/09/14/path-interpolation-using-cubic-bezier-and-control-point-estimation-in-javascript\n *\n * Algorithm for approximated length of a Bézier curve is taken from:\n * http://www.lemoda.net/maths/bezier-length/index.html\n *\n */\n\nfunction Point(x, y, time) {\n this.x = x;\n this.y = y;\n this.time = time || new Date().getTime();\n}\n\nPoint.prototype.velocityFrom = function (start) {\n return this.time !== start.time ? this.distanceTo(start) / (this.time - start.time) : 1;\n};\n\nPoint.prototype.distanceTo = function (start) {\n return Math.sqrt(Math.pow(this.x - start.x, 2) + Math.pow(this.y - start.y, 2));\n};\n\nPoint.prototype.equals = function (other) {\n return this.x === other.x && this.y === other.y && this.time === other.time;\n};\n\nfunction Bezier(startPoint, control1, control2, endPoint) {\n this.startPoint = startPoint;\n this.control1 = control1;\n this.control2 = control2;\n this.endPoint = endPoint;\n}\n\n// Returns approximated length.\nBezier.prototype.length = function () {\n var steps = 10;\n var length = 0;\n var px = void 0;\n var py = void 0;\n\n for (var i = 0; i <= steps; i += 1) {\n var t = i / steps;\n var cx = this._point(t, this.startPoint.x, this.control1.x, this.control2.x, this.endPoint.x);\n var cy = this._point(t, this.startPoint.y, this.control1.y, this.control2.y, this.endPoint.y);\n if (i > 0) {\n var xdiff = cx - px;\n var ydiff = cy - py;\n length += Math.sqrt(xdiff * xdiff + ydiff * ydiff);\n }\n px = cx;\n py = cy;\n }\n\n return length;\n};\n\n/* eslint-disable no-multi-spaces, space-in-parens */\nBezier.prototype._point = function (t, start, c1, c2, end) {\n return start * (1.0 - t) * (1.0 - t) * (1.0 - t) + 3.0 * c1 * (1.0 - t) * (1.0 - t) * t + 3.0 * c2 * (1.0 - t) * t * t + end * t * t * t;\n};\n\n/* eslint-disable */\n\n// http://stackoverflow.com/a/27078401/815507\nfunction throttle(func, wait, options) {\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function later() {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function () {\n var now = Date.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n}\n\nfunction SignaturePad(canvas, options) {\n var self = this;\n var opts = options || {};\n\n this.velocityFilterWeight = opts.velocityFilterWeight || 0.7;\n this.minWidth = opts.minWidth || 0.5;\n this.maxWidth = opts.maxWidth || 2.5;\n this.throttle = 'throttle' in opts ? opts.throttle : 16; // in miliseconds\n this.minDistance = 'minDistance' in opts ? opts.minDistance : 5;\n\n if (this.throttle) {\n this._strokeMoveUpdate = throttle(SignaturePad.prototype._strokeUpdate, this.throttle);\n } else {\n this._strokeMoveUpdate = SignaturePad.prototype._strokeUpdate;\n }\n\n this.dotSize = opts.dotSize || function () {\n return (this.minWidth + this.maxWidth) / 2;\n };\n this.penColor = opts.penColor || 'black';\n this.backgroundColor = opts.backgroundColor || 'rgba(0,0,0,0)';\n this.onBegin = opts.onBegin;\n this.onEnd = opts.onEnd;\n\n this._canvas = canvas;\n this._ctx = canvas.getContext('2d');\n this.clear();\n\n // We need add these inline so they are available to unbind while still having\n // access to 'self' we could use _.bind but it's not worth adding a dependency.\n this._handleMouseDown = function (event) {\n if (event.which === 1) {\n self._mouseButtonDown = true;\n self._strokeBegin(event);\n }\n };\n\n this._handleMouseMove = function (event) {\n if (self._mouseButtonDown) {\n self._strokeMoveUpdate(event);\n }\n };\n\n this._handleMouseUp = function (event) {\n if (event.which === 1 && self._mouseButtonDown) {\n self._mouseButtonDown = false;\n self._strokeEnd(event);\n }\n };\n\n this._handleTouchStart = function (event) {\n if (event.targetTouches.length === 1) {\n var touch = event.changedTouches[0];\n self._strokeBegin(touch);\n }\n };\n\n this._handleTouchMove = function (event) {\n // Prevent scrolling.\n event.preventDefault();\n\n var touch = event.targetTouches[0];\n self._strokeMoveUpdate(touch);\n };\n\n this._handleTouchEnd = function (event) {\n var wasCanvasTouched = event.target === self._canvas;\n if (wasCanvasTouched) {\n event.preventDefault();\n self._strokeEnd(event);\n }\n };\n\n // Enable mouse and touch event handlers\n this.on();\n}\n\n// Public methods\nSignaturePad.prototype.clear = function () {\n var ctx = this._ctx;\n var canvas = this._canvas;\n\n ctx.fillStyle = this.backgroundColor;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n this._data = [];\n this._reset();\n this._isEmpty = true;\n};\n\nSignaturePad.prototype.fromDataURL = function (dataUrl) {\n var _this = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var image = new Image();\n var ratio = options.ratio || window.devicePixelRatio || 1;\n var width = options.width || this._canvas.width / ratio;\n var height = options.height || this._canvas.height / ratio;\n\n this._reset();\n image.src = dataUrl;\n image.onload = function () {\n _this._ctx.drawImage(image, 0, 0, width, height);\n };\n this._isEmpty = false;\n};\n\nSignaturePad.prototype.toDataURL = function (type) {\n var _canvas;\n\n switch (type) {\n case 'image/svg+xml':\n return this._toSVG();\n default:\n for (var _len = arguments.length, options = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n options[_key - 1] = arguments[_key];\n }\n\n return (_canvas = this._canvas).toDataURL.apply(_canvas, [type].concat(options));\n }\n};\n\nSignaturePad.prototype.on = function () {\n this._handleMouseEvents();\n this._handleTouchEvents();\n};\n\nSignaturePad.prototype.off = function () {\n this._canvas.removeEventListener('mousedown', this._handleMouseDown);\n this._canvas.removeEventListener('mousemove', this._handleMouseMove);\n document.removeEventListener('mouseup', this._handleMouseUp);\n\n this._canvas.removeEventListener('touchstart', this._handleTouchStart);\n this._canvas.removeEventListener('touchmove', this._handleTouchMove);\n this._canvas.removeEventListener('touchend', this._handleTouchEnd);\n};\n\nSignaturePad.prototype.isEmpty = function () {\n return this._isEmpty;\n};\n\n// Private methods\nSignaturePad.prototype._strokeBegin = function (event) {\n this._data.push([]);\n this._reset();\n this._strokeUpdate(event);\n\n if (typeof this.onBegin === 'function') {\n this.onBegin(event);\n }\n};\n\nSignaturePad.prototype._strokeUpdate = function (event) {\n var x = event.clientX;\n var y = event.clientY;\n\n var point = this._createPoint(x, y);\n var lastPointGroup = this._data[this._data.length - 1];\n var lastPoint = lastPointGroup && lastPointGroup[lastPointGroup.length - 1];\n var isLastPointTooClose = lastPoint && point.distanceTo(lastPoint) < this.minDistance;\n\n // Skip this point if it's too close to the previous one\n if (!(lastPoint && isLastPointTooClose)) {\n var _addPoint = this._addPoint(point),\n curve = _addPoint.curve,\n widths = _addPoint.widths;\n\n if (curve && widths) {\n this._drawCurve(curve, widths.start, widths.end);\n }\n\n this._data[this._data.length - 1].push({\n x: point.x,\n y: point.y,\n time: point.time,\n color: this.penColor\n });\n }\n};\n\nSignaturePad.prototype._strokeEnd = function (event) {\n var canDrawCurve = this.points.length > 2;\n var point = this.points[0]; // Point instance\n\n if (!canDrawCurve && point) {\n this._drawDot(point);\n }\n\n if (point) {\n var lastPointGroup = this._data[this._data.length - 1];\n var lastPoint = lastPointGroup[lastPointGroup.length - 1]; // plain object\n\n // When drawing a dot, there's only one point in a group, so without this check\n // such group would end up with exactly the same 2 points.\n if (!point.equals(lastPoint)) {\n lastPointGroup.push({\n x: point.x,\n y: point.y,\n time: point.time,\n color: this.penColor\n });\n }\n }\n\n if (typeof this.onEnd === 'function') {\n this.onEnd(event);\n }\n};\n\nSignaturePad.prototype._handleMouseEvents = function () {\n this._mouseButtonDown = false;\n\n this._canvas.addEventListener('mousedown', this._handleMouseDown);\n this._canvas.addEventListener('mousemove', this._handleMouseMove);\n document.addEventListener('mouseup', this._handleMouseUp);\n};\n\nSignaturePad.prototype._handleTouchEvents = function () {\n // Pass touch events to canvas element on mobile IE11 and Edge.\n this._canvas.style.msTouchAction = 'none';\n this._canvas.style.touchAction = 'none';\n\n this._canvas.addEventListener('touchstart', this._handleTouchStart);\n this._canvas.addEventListener('touchmove', this._handleTouchMove);\n this._canvas.addEventListener('touchend', this._handleTouchEnd);\n};\n\nSignaturePad.prototype._reset = function () {\n this.points = [];\n this._lastVelocity = 0;\n this._lastWidth = (this.minWidth + this.maxWidth) / 2;\n this._ctx.fillStyle = this.penColor;\n};\n\nSignaturePad.prototype._createPoint = function (x, y, time) {\n var rect = this._canvas.getBoundingClientRect();\n\n return new Point(x - rect.left, y - rect.top, time || new Date().getTime());\n};\n\nSignaturePad.prototype._addPoint = function (point) {\n var points = this.points;\n var tmp = void 0;\n\n points.push(point);\n\n if (points.length > 2) {\n // To reduce the initial lag make it work with 3 points\n // by copying the first point to the beginning.\n if (points.length === 3) points.unshift(points[0]);\n\n tmp = this._calculateCurveControlPoints(points[0], points[1], points[2]);\n var c2 = tmp.c2;\n tmp = this._calculateCurveControlPoints(points[1], points[2], points[3]);\n var c3 = tmp.c1;\n var curve = new Bezier(points[1], c2, c3, points[2]);\n var widths = this._calculateCurveWidths(curve);\n\n // Remove the first element from the list,\n // so that we always have no more than 4 points in points array.\n points.shift();\n\n return { curve: curve, widths: widths };\n }\n\n return {};\n};\n\nSignaturePad.prototype._calculateCurveControlPoints = function (s1, s2, s3) {\n var dx1 = s1.x - s2.x;\n var dy1 = s1.y - s2.y;\n var dx2 = s2.x - s3.x;\n var dy2 = s2.y - s3.y;\n\n var m1 = { x: (s1.x + s2.x) / 2.0, y: (s1.y + s2.y) / 2.0 };\n var m2 = { x: (s2.x + s3.x) / 2.0, y: (s2.y + s3.y) / 2.0 };\n\n var l1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);\n var l2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);\n\n var dxm = m1.x - m2.x;\n var dym = m1.y - m2.y;\n\n var k = l2 / (l1 + l2);\n var cm = { x: m2.x + dxm * k, y: m2.y + dym * k };\n\n var tx = s2.x - cm.x;\n var ty = s2.y - cm.y;\n\n return {\n c1: new Point(m1.x + tx, m1.y + ty),\n c2: new Point(m2.x + tx, m2.y + ty)\n };\n};\n\nSignaturePad.prototype._calculateCurveWidths = function (curve) {\n var startPoint = curve.startPoint;\n var endPoint = curve.endPoint;\n var widths = { start: null, end: null };\n\n var velocity = this.velocityFilterWeight * endPoint.velocityFrom(startPoint) + (1 - this.velocityFilterWeight) * this._lastVelocity;\n\n var newWidth = this._strokeWidth(velocity);\n\n widths.start = this._lastWidth;\n widths.end = newWidth;\n\n this._lastVelocity = velocity;\n this._lastWidth = newWidth;\n\n return widths;\n};\n\nSignaturePad.prototype._strokeWidth = function (velocity) {\n return Math.max(this.maxWidth / (velocity + 1), this.minWidth);\n};\n\nSignaturePad.prototype._drawPoint = function (x, y, size) {\n var ctx = this._ctx;\n\n ctx.moveTo(x, y);\n ctx.arc(x, y, size, 0, 2 * Math.PI, false);\n this._isEmpty = false;\n};\n\nSignaturePad.prototype._drawCurve = function (curve, startWidth, endWidth) {\n var ctx = this._ctx;\n var widthDelta = endWidth - startWidth;\n var drawSteps = Math.floor(curve.length());\n\n ctx.beginPath();\n\n for (var i = 0; i < drawSteps; i += 1) {\n // Calculate the Bezier (x, y) coordinate for this step.\n var t = i / drawSteps;\n var tt = t * t;\n var ttt = tt * t;\n var u = 1 - t;\n var uu = u * u;\n var uuu = uu * u;\n\n var x = uuu * curve.startPoint.x;\n x += 3 * uu * t * curve.control1.x;\n x += 3 * u * tt * curve.control2.x;\n x += ttt * curve.endPoint.x;\n\n var y = uuu * curve.startPoint.y;\n y += 3 * uu * t * curve.control1.y;\n y += 3 * u * tt * curve.control2.y;\n y += ttt * curve.endPoint.y;\n\n var width = startWidth + ttt * widthDelta;\n this._drawPoint(x, y, width);\n }\n\n ctx.closePath();\n ctx.fill();\n};\n\nSignaturePad.prototype._drawDot = function (point) {\n var ctx = this._ctx;\n var width = typeof this.dotSize === 'function' ? this.dotSize() : this.dotSize;\n\n ctx.beginPath();\n this._drawPoint(point.x, point.y, width);\n ctx.closePath();\n ctx.fill();\n};\n\nSignaturePad.prototype._fromData = function (pointGroups, drawCurve, drawDot) {\n for (var i = 0; i < pointGroups.length; i += 1) {\n var group = pointGroups[i];\n\n if (group.length > 1) {\n for (var j = 0; j < group.length; j += 1) {\n var rawPoint = group[j];\n var point = new Point(rawPoint.x, rawPoint.y, rawPoint.time);\n var color = rawPoint.color;\n\n if (j === 0) {\n // First point in a group. Nothing to draw yet.\n\n // All points in the group have the same color, so it's enough to set\n // penColor just at the beginning.\n this.penColor = color;\n this._reset();\n\n this._addPoint(point);\n } else if (j !== group.length - 1) {\n // Middle point in a group.\n var _addPoint2 = this._addPoint(point),\n curve = _addPoint2.curve,\n widths = _addPoint2.widths;\n\n if (curve && widths) {\n drawCurve(curve, widths, color);\n }\n } else {\n // Last point in a group. Do nothing.\n }\n }\n } else {\n this._reset();\n var _rawPoint = group[0];\n drawDot(_rawPoint);\n }\n }\n};\n\nSignaturePad.prototype._toSVG = function () {\n var _this2 = this;\n\n var pointGroups = this._data;\n var canvas = this._canvas;\n var ratio = Math.max(window.devicePixelRatio || 1, 1);\n var minX = 0;\n var minY = 0;\n var maxX = canvas.width / ratio;\n var maxY = canvas.height / ratio;\n var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\n svg.setAttributeNS(null, 'width', canvas.width);\n svg.setAttributeNS(null, 'height', canvas.height);\n\n this._fromData(pointGroups, function (curve, widths, color) {\n var path = document.createElement('path');\n\n // Need to check curve for NaN values, these pop up when drawing\n // lines on the canvas that are not continuous. E.g. Sharp corners\n // or stopping mid-stroke and than continuing without lifting mouse.\n if (!isNaN(curve.control1.x) && !isNaN(curve.control1.y) && !isNaN(curve.control2.x) && !isNaN(curve.control2.y)) {\n var attr = 'M ' + curve.startPoint.x.toFixed(3) + ',' + curve.startPoint.y.toFixed(3) + ' ' + ('C ' + curve.control1.x.toFixed(3) + ',' + curve.control1.y.toFixed(3) + ' ') + (curve.control2.x.toFixed(3) + ',' + curve.control2.y.toFixed(3) + ' ') + (curve.endPoint.x.toFixed(3) + ',' + curve.endPoint.y.toFixed(3));\n\n path.setAttribute('d', attr);\n path.setAttribute('stroke-width', (widths.end * 2.25).toFixed(3));\n path.setAttribute('stroke', color);\n path.setAttribute('fill', 'none');\n path.setAttribute('stroke-linecap', 'round');\n\n svg.appendChild(path);\n }\n }, function (rawPoint) {\n var circle = document.createElement('circle');\n var dotSize = typeof _this2.dotSize === 'function' ? _this2.dotSize() : _this2.dotSize;\n circle.setAttribute('r', dotSize);\n circle.setAttribute('cx', rawPoint.x);\n circle.setAttribute('cy', rawPoint.y);\n circle.setAttribute('fill', rawPoint.color);\n\n svg.appendChild(circle);\n });\n\n var prefix = 'data:image/svg+xml;base64,';\n var header = '';\n var body = svg.innerHTML;\n\n // IE hack for missing innerHTML property on SVGElement\n if (body === undefined) {\n var dummy = document.createElement('dummy');\n var nodes = svg.childNodes;\n dummy.innerHTML = '';\n\n for (var i = 0; i < nodes.length; i += 1) {\n dummy.appendChild(nodes[i].cloneNode(true));\n }\n\n body = dummy.innerHTML;\n }\n\n var footer = '';\n var data = header + body + footer;\n\n return prefix + btoa(data);\n};\n\nSignaturePad.prototype.fromData = function (pointGroups) {\n var _this3 = this;\n\n this.clear();\n\n this._fromData(pointGroups, function (curve, widths) {\n return _this3._drawCurve(curve, widths.start, widths.end);\n }, function (rawPoint) {\n return _this3._drawDot(rawPoint);\n });\n\n this._data = pointGroups;\n};\n\nSignaturePad.prototype.toData = function () {\n return this._data;\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (SignaturePad);\n\n\n/***/ }),\n\n/***/ \"./node_modules/sortablejs/modular/sortable.esm.js\":\n/*!*********************************************************!*\\\n !*** ./node_modules/sortablejs/modular/sortable.esm.js ***!\n \\*********************************************************/\n/*! exports provided: default, MultiDrag, Sortable, Swap */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MultiDrag\", function() { return MultiDragPlugin; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Sortable\", function() { return Sortable; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Swap\", function() { return SwapPlugin; });\n/**!\n * Sortable 1.13.0\n * @author\tRubaXa \n * @author\towenm \n * @license MIT\n */\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n}\n\nfunction _iterableToArray(iter) {\n if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nvar version = \"1.13.0\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !!\n /*@__PURE__*/\n navigator.userAgent.match(pattern);\n }\n}\n\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\n\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\n\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\n\nfunction matches(\n/**HTMLElement*/\nel,\n/**String*/\nselector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n\n return false;\n}\n\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\n\nfunction closest(\n/**HTMLElement*/\nel,\n/**String*/\nselector,\n/**HTMLElement*/\nctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n\n return null;\n}\n\nvar R_SPACE = /\\s+/g;\n\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\n\nfunction css(el, prop, val) {\n var style = el && el.style;\n\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\n\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n\n } while (!selfOnly && (el = el.parentNode));\n }\n\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n\n return matrixFn && new matrixFn(appliedTransforms);\n}\n\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n\n return list;\n }\n\n return [];\n}\n\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n/**\n * Returns the \"bounding client rect\" of given element\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\n * @param {[HTMLElement]} container The parent the element will be placed in\n * @return {Object} The boundingClientRect of el, with specified adjustments\n */\n\n\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container\n\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n\n } while (container = container.parentNode);\n }\n }\n\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n/**\n * Checks if a side of an element is scrolled past a side of its parents\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\n */\n\n\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n /* jshint boss:true */\n\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n\n return false;\n}\n/**\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\n * and non-draggable elements\n * @param {HTMLElement} el The parent element\n * @param {Number} childNum The index of the child\n * @param {Object} options Parent Sortable's options\n * @return {HTMLElement} The child at index childNum, or null if not found\n */\n\n\nfunction getChild(el, childNum, options) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && children[i] !== Sortable.dragged && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n\n currentChild++;\n }\n\n i++;\n }\n\n return null;\n}\n/**\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\n * @param {HTMLElement} el Parent element\n * @param {selector} selector Any other elements that should be ignored\n * @return {HTMLElement} The last child, ignoring ghostEl\n */\n\n\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n\n return last || null;\n}\n/**\n * Returns the index of an element within its parent for a selected set of\n * elements\n * @param {HTMLElement} el\n * @param {selector} selector\n * @return {number}\n */\n\n\nfunction index(el, selector) {\n var index = 0;\n\n if (!el || !el.parentNode) {\n return -1;\n }\n /* jshint boss:true */\n\n\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n\n return index;\n}\n/**\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\n * The value is returned in real pixels.\n * @param {HTMLElement} el\n * @return {Array} Offsets in the format of [left, top]\n */\n\n\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n\n return [offsetLeft, offsetTop];\n}\n/**\n * Returns the index of the object within the given array\n * @param {Array} arr Array that may or may not hold the object\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\n * @return {Number} The index of the object in the array, or -1\n */\n\n\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n\n return -1;\n}\n\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n\n } while (elem = elem.parentNode);\n\n return getWindowScrollingElement();\n}\n\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n\n return dst;\n}\n\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\n\nvar _throttleTimeout;\n\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\n\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\n\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\n\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\n\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\n\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\n\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n\n var fromRect = _objectSpread({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation\n\n\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n\n target.toRect = toRect;\n\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n } // if fromRect != toRect: animate\n\n\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n\n if (!time) {\n time = _this.options.animation;\n }\n\n _this.animate(target, animatingRect, toRect, time);\n }\n\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\n\nfunction repaint(target) {\n return target.offsetWidth;\n}\n\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n\n this.eventCanceled = false;\n\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable\n\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread({\n sortable: sortable\n }, evt));\n } // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n\n\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized; // Add default options from plugin\n\n _extends(defaults, initialized.defaults);\n });\n\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n\n var allEventProperties = _objectSpread({}, extraEventProperties, PluginManager.getEventProperties(name, sortable));\n\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, [\"evt\"]);\n\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\n\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\n\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\nghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n_silent = false,\n savedInputChecked = [];\n/** @const */\n\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\nsupportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return; // false when <= IE11\n\n if (IE11OrLess) {\n return false;\n }\n\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n}(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n},\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n},\n\n/**\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\n * @param {Number} x X position\n * @param {Number} y Y position\n * @return {HTMLElement} Element of the first found nearest Sortable\n */\n_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n if (lastChild(sortable)) return;\n var rect = getRect(sortable),\n threshold = sortable[expando].options.emptyInsertThreshold,\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n\n if (threshold && insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n},\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n\n var group = {};\n var originalGroup = options.group;\n\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n},\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n},\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n}; // #1184 fix - Prevent click event on fallback if dragged but item not changed position\n\n\nif (documentExists) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\n\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n\n if (nearest) {\n // Create imitation event\n var event = {};\n\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n\n nearest[expando]._onDragOver(event);\n }\n }\n};\n\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n/**\n * @class Sortable\n * @param {HTMLElement} el\n * @param {Object} [options]\n */\n\n\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n\n this.el = el; // root element\n\n this.options = options = _extends({}, options); // Export instance\n\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults); // Set default options\n\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n\n _prepareGroup(options); // Bind all private methods\n\n\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n } // Setup drag mode\n\n\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n } // Bind events\n\n\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n\n sortables.push(this.el); // Restore sorting\n\n options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager\n\n _extends(this, AnimationStateManager());\n}\n\nSortable.prototype =\n/** @lends Sortable.prototype */\n{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart(\n /** Event|TouchEvent */\n evt) {\n if (!evt.cancelable) return;\n\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n\n _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n\n\n if (dragEl) {\n return;\n }\n\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n } // cancel dnd if original target is content editable\n\n\n if (originalTarget.isContentEditable) {\n return;\n } // Safari ignores further event handling after mousedown\n\n\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n\n target = closest(target, options.draggable, el, false);\n\n if (target && target.animated) {\n return;\n }\n\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n } // Get the index of the dragged element within its parent\n\n\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable); // Check filter\n\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n\n if (filter) {\n preventOnFilter && evt.cancelable && evt.preventDefault();\n return; // cancel dnd\n }\n }\n\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n } // Prepare `dragstart`\n\n\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart(\n /** Event */\n evt,\n /** Touch */\n touch,\n /** HTMLElement */\n target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n\n if (Sortable.eventCanceled) {\n _this._onDrop();\n\n return;\n } // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n\n\n _this._disableDelayedDragEvents();\n\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n } // Bind the events: dragstart/dragend\n\n\n _this._triggerDragStart(evt, touch); // Drag start event\n\n\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n }); // Chosen item\n\n\n toggleClass(dragEl, options.chosenClass, true);\n }; // Disable \"draggable\"\n\n\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox)\n\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n\n pluginEvent('delayStart', this, {\n evt: evt\n }); // Delay is impossible for native DnD in Edge or IE\n\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n } // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n\n\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(\n /** TouchEvent|PointerEvent **/\n e) {\n var touch = e.touches ? e.touches[0] : e;\n\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart(\n /** Event */\n evt,\n /** Touch */\n touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n\n try {\n if (document.selection) {\n // Timeout neccessary for IE9\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n\n awaitingDragStarted = false;\n\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n\n var options = this.options; // Apply effect\n\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost(); // Drag start event\n\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n\n _hideGhostForTarget();\n\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n\n target = parent; // store last element\n }\n /* jshint boss:true */\n while (parent = parent.parentNode);\n }\n\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove(\n /**TouchEvent*/\n evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging\n\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n\n this._onDragStart(evt, true);\n }\n\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options; // Position absolutely\n\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl); // Set transform-origin\n\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart(\n /**Event*/\n evt,\n /**boolean*/\n fallback) {\n var _this = this;\n\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n\n if (Sortable.eventCanceled) {\n this._onDrop();\n\n return;\n }\n\n pluginEvent('setupClone', this);\n\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n\n this._hideClone();\n\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n } // #1143: IFrame support workaround\n\n\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n\n _this._hideClone();\n\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events\n\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n\n on(document, 'drop', _this); // #1276 fix:\n\n css(dragEl, 'transform', 'translateZ(0)');\n }\n\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver(\n /**Event*/\n evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n\n if (_silent) return;\n\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n } // Capture animation state\n\n\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n\n _this.captureAnimationState();\n\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n } // Return invocation when dragEl is inserted (or completed)\n\n\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n } // Animation\n\n\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n } // Null lastTarget if it is not inside a previously swapped element\n\n\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n } // no bubbling and not fallback\n\n\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted\n\n\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n } // Call when dragEl has been inserted\n\n\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n\n ignoreNextClick = false;\n\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n\n if (revert) {\n parentEl = rootEl; // actualization\n\n capture();\n\n this._hideClone();\n\n dragOverEvent('revert');\n\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n\n return completed(true);\n }\n\n var elLastChild = lastChild(el, options.draggable);\n\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n } // assign target only if condition is true\n\n\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n\n if (target) {\n targetRect = getRect(target);\n }\n\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n el.appendChild(dragEl);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n } // If dragEl is already beside target: Do not insert\n\n\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n } // Undo chrome's scroll adjustment (has no effect on other browsers)\n\n\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n\n parentEl = dragEl.parentNode; // actualization\n // must be done before animation\n\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n\n changed();\n return completed(true);\n }\n }\n\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop(\n /**Event*/\n evt) {\n var el = this.el,\n options = this.options; // Get the index of the dragged element within its parent\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode; // Get again after plugin event\n\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n\n if (Sortable.eventCanceled) {\n this._nulling();\n\n return;\n }\n\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n\n _cancelNextTick(this.cloneId);\n\n _cancelNextTick(this._dragStartId); // Unbind events\n\n\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n\n this._offMoveEvents();\n\n this._offUpEvents();\n\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n\n css(dragEl, 'transform', '');\n\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n\n _disableDraggable(dragEl);\n\n dragEl.style['will-change'] = ''; // Remove classes\n // ghostClass is added in dragStarted\n\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n\n toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event\n\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n }); // Remove event\n\n\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n }); // drag from one list and drop into another\n\n\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n }); // Save sorting\n\n\n this.save();\n }\n }\n }\n\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n savedInputChecked.forEach(function (el) {\n el.checked = true;\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent(\n /**Event*/\n evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n\n break;\n\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n\n _globalDragOver(evt);\n }\n\n break;\n\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n\n /**\n * Serializes the item into an array of string.\n * @returns {String[]}\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n\n for (; i < n; i++) {\n el = children[i];\n\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n\n return order;\n },\n\n /**\n * Sorts the elements according to the array.\n * @param {String[]} order order of the items\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n\n /**\n * Save the current sorting\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n\n /**\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\n * @param {HTMLElement} el\n * @param {String} [selector] default: `options.draggable`\n * @returns {HTMLElement|null}\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n\n /**\n * Set/get option\n * @param {string} name\n * @param {*} [value]\n * @returns {*}\n */\n option: function option(name, value) {\n var options = this.options;\n\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n\n /**\n * Destroy\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n } // Remove draggable attributes\n\n\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n\n this._onDrop();\n\n this._disableDelayedDragEvents();\n\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n\n return;\n }\n\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return; // show clone at dragEl or original position\n\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\n\nfunction _globalDragOver(\n/**Event*/\nevt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n\n evt.cancelable && evt.preventDefault();\n}\n\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal; // Support for new CustomEvent feature\n\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n\n return retVal;\n}\n\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\n\nfunction _unsilent() {\n _silent = false;\n}\n\nfunction _ghostIsLast(evt, vertical, sortable) {\n var rect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var spacer = 10;\n return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer;\n}\n\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n\n invert = invert || invertSwap;\n\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n\n return 0;\n}\n/**\n * Gets the direction dragEl must be swapped relative to target in order to make it\n * seem that dragEl has been \"inserted\" into that element's position\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\n * @return {Number} Direction dragEl must be swapped\n */\n\n\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n/**\n * Generate id\n * @param {HTMLElement} el\n * @returns {String}\n * @private\n */\n\n\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n\n while (i--) {\n sum += str.charCodeAt(i);\n }\n\n return sum.toString(36);\n}\n\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\n\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\n\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n} // Fixed #973:\n\n\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n} // Export utils\n\n\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild\n};\n/**\n * Get the Sortable instance of an element\n * @param {HTMLElement} element The element\n * @return {Sortable|undefined} The instance of Sortable\n */\n\nSortable.get = function (element) {\n return element[expando];\n};\n/**\n * Mount a plugin to Sortable\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\n */\n\n\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n\n if (plugin.utils) Sortable.utils = _objectSpread({}, Sortable.utils, plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n/**\n * Create sortable instance\n * @param {HTMLElement} el\n * @param {Object} [options]\n */\n\n\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n}; // Export\n\n\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\n\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n }; // Bind all private methods\n\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt; // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n\n if (fallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change\n\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour\n\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\n\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\n\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\n\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn; // New scroll root, set scrollEl\n\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n\n var layersOut = 0;\n var currentParent = scrollEl;\n\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n\n }\n\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\n\nfunction Revert() {}\n\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n\n this.sortable.animateAll();\n\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\n\nfunction Remove() {}\n\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\n\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\n\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\nmultiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\nfolding = false,\n // Folding any other time\ndragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\n\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n\n dataTransfer.setData('Text', data);\n }\n };\n }\n\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n\n sortable._hideClone();\n\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n }); // Sort multi-drag elements\n\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n sortable.captureAnimationState();\n\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n } // Remove all auxiliary multidrag items from el, if sorting enabled\n\n\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n\n initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location\n\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n\n\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n\n activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden\n\n\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children; // Multi-drag selection\n\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvt: evt\n }); // Modifier activated, select from last to dragEl\n\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvt: evt\n });\n }\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvt: evt\n });\n }\n } // Multi-drag drop\n\n\n if (dragStarted && this.isMultiDrag) {\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect; // Prepare unfold animation\n\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n\n\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n\n multiDragIndex++;\n }); // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n\n if (update) {\n dispatchSortableEvent('update');\n }\n }\n } // Must be done after capturing individual rects (scroll bar)\n\n\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n\n multiDragSortable = toSortable;\n } // Remove clones if necessary\n\n\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return; // Only deselect if selection is in this sortable\n\n if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable\n\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click\n\n if (evt && evt.button !== 0) return;\n\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvt: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n\n multiDragSortable = sortable;\n }\n\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n }); // multiDragElements will already be sorted if folding\n\n var newIndex;\n\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n\n return key;\n }\n }\n });\n}\n\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\n\n\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\n\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Sortable);\n\n\n\n/***/ }),\n\n/***/ \"./src/actions/action.ts\":\n/*!*******************************!*\\\n !*** ./src/actions/action.ts ***!\n \\*******************************/\n/*! exports provided: Action */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Action\", function() { return Action; });\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../base */ \"./src/base.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../jsonobject */ \"./src/jsonobject.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n\n\nvar Action = /** @class */ (function (_super) {\n __extends(Action, _super);\n function Action(item) {\n var _this = _super.call(this) || this;\n Object.assign(_this, item);\n return _this;\n }\n Object.defineProperty(Action.prototype, \"disabled\", {\n get: function () {\n return this.enabled !== undefined && !this.enabled;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Action.prototype, \"hasTitle\", {\n get: function () {\n return (((this.mode != \"small\" &&\n (this.showTitle || this.showTitle === undefined)) ||\n !this.iconName) &&\n !!this.title);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Action.prototype, \"isVisible\", {\n get: function () {\n return this.mode !== \"popup\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Action.prototype, \"canShrink\", {\n get: function () {\n return !!this.iconName;\n },\n enumerable: false,\n configurable: true\n });\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"id\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"iconName\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"visible\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"title\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"tooltip\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"enabled\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"showTitle\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"action\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"css\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"innerCss\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"data\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"popupModel\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"needSeparator\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"active\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"template\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"component\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"items\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"visibleIndex\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: \"large\" })\n ], Action.prototype, \"mode\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Action.prototype, \"disableTabStop\", void 0);\n return Action;\n}(_base__WEBPACK_IMPORTED_MODULE_0__[\"Base\"]));\n\n\n\n/***/ }),\n\n/***/ \"./src/actions/adaptive-container.ts\":\n/*!*******************************************!*\\\n !*** ./src/actions/adaptive-container.ts ***!\n \\*******************************************/\n/*! exports provided: AdaptiveActionContainer */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AdaptiveActionContainer\", function() { return AdaptiveActionContainer; });\n/* harmony import */ var _list__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../list */ \"./src/list.ts\");\n/* harmony import */ var _popup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../popup */ \"./src/popup.ts\");\n/* harmony import */ var _action__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./action */ \"./src/actions/action.ts\");\n/* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./container */ \"./src/actions/container.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar AdaptiveActionContainer = /** @class */ (function (_super) {\n __extends(AdaptiveActionContainer, _super);\n function AdaptiveActionContainer() {\n var _this = _super.call(this) || this;\n _this.invisibleItemsListModel = new _list__WEBPACK_IMPORTED_MODULE_0__[\"ListModel\"]([], function (item) {\n _this.invisibleItemSelected(item);\n _this.dotsItemPopupModel.toggleVisibility();\n }, false);\n _this.dotsItemPopupModel = new _popup__WEBPACK_IMPORTED_MODULE_1__[\"PopupModel\"](\"sv-list\", {\n model: _this.invisibleItemsListModel\n });\n _this.dotsItem = new _action__WEBPACK_IMPORTED_MODULE_2__[\"Action\"]({\n id: \"dotsItem-id\",\n component: \"sv-action-bar-item-dropdown\",\n css: \"sv-dots\",\n innerCss: \"sv-dots__item\",\n iconName: \"icon-dots\",\n // showTitle: true,\n // title: \"...\",\n action: function (item) {\n _this.dotsItemPopupModel.toggleVisibility();\n },\n popupModel: _this.dotsItemPopupModel\n });\n return _this;\n }\n Object.defineProperty(AdaptiveActionContainer.prototype, \"visibleItems\", {\n get: function () {\n return this.actions.filter(function (item) { return item.mode !== \"popup\"; });\n },\n enumerable: false,\n configurable: true\n });\n AdaptiveActionContainer.prototype.setItems = function (items, sortByVisibleIndex) {\n if (sortByVisibleIndex === void 0) { sortByVisibleIndex = true; }\n var actions = items.map(function (item) { return (item instanceof _action__WEBPACK_IMPORTED_MODULE_2__[\"Action\"] ? item : new _action__WEBPACK_IMPORTED_MODULE_2__[\"Action\"](item)); });\n if (sortByVisibleIndex) {\n this.actions = this.sortItems(actions);\n }\n else {\n this.actions = actions;\n }\n };\n AdaptiveActionContainer.prototype.sortItems = function (items) {\n return []\n .concat(items.filter(function (item) { return item.visibleIndex >= 0 || item.visibleIndex === undefined; }))\n .sort(function (firstItem, secondItem) {\n return firstItem.visibleIndex - secondItem.visibleIndex;\n });\n };\n Object.defineProperty(AdaptiveActionContainer.prototype, \"hasItems\", {\n get: function () {\n return (this.actions || []).length > 0;\n },\n enumerable: false,\n configurable: true\n });\n AdaptiveActionContainer.prototype.invisibleItemSelected = function (item) {\n if (!!item && typeof item.action === \"function\") {\n item.action();\n }\n };\n AdaptiveActionContainer.prototype.showFirstN = function (visibleItemsCount) {\n var _this = this;\n var leftItemsToShow = visibleItemsCount;\n var invisibleItems = [];\n this.actions.forEach(function (item) {\n if (item === _this.dotsItem) {\n return;\n }\n if (leftItemsToShow <= 0) {\n item.mode = \"popup\";\n invisibleItems.push(item);\n }\n leftItemsToShow--;\n });\n this.invisibleItemsListModel.items = invisibleItems;\n this.addDotsButton(visibleItemsCount);\n };\n AdaptiveActionContainer.prototype.removeDotsButton = function () {\n var index = this.actions.indexOf(this.dotsItem);\n if (index !== -1) {\n this.actions.splice(index, 1);\n }\n };\n AdaptiveActionContainer.prototype.addDotsButton = function (newIndex) {\n if (newIndex < this.actions.length) {\n this.actions.splice(newIndex, 0, this.dotsItem);\n }\n };\n return AdaptiveActionContainer;\n}(_container__WEBPACK_IMPORTED_MODULE_3__[\"ActionContainer\"]));\n\n\n\n/***/ }),\n\n/***/ \"./src/actions/container.ts\":\n/*!**********************************!*\\\n !*** ./src/actions/container.ts ***!\n \\**********************************/\n/*! exports provided: ActionContainer */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ActionContainer\", function() { return ActionContainer; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../base */ \"./src/base.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n\n\nvar ActionContainer = /** @class */ (function (_super) {\n __extends(ActionContainer, _super);\n function ActionContainer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ActionContainer.prototype, \"hasItems\", {\n get: function () {\n return (this.actions || []).length > 0;\n },\n enumerable: false,\n configurable: true\n });\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"propertyArray\"])()\n ], ActionContainer.prototype, \"actions\", void 0);\n return ActionContainer;\n}(_base__WEBPACK_IMPORTED_MODULE_1__[\"Base\"]));\n\n\n\n/***/ }),\n\n/***/ \"./src/base.ts\":\n/*!*********************!*\\\n !*** ./src/base.ts ***!\n \\*********************/\n/*! exports provided: Bindings, Base, ArrayChanges, Event, EventBase */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Bindings\", function() { return Bindings; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Base\", function() { return Base; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ArrayChanges\", function() { return ArrayChanges; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Event\", function() { return Event; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"EventBase\", function() { return EventBase; });\n/* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localizablestring */ \"./src/localizablestring.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __spreadArray = (undefined && undefined.__spreadArray) || function (to, from) {\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n to[j] = from[i];\n return to;\n};\n\n\n\n\nvar Bindings = /** @class */ (function () {\n function Bindings(obj) {\n this.obj = obj;\n this.properties = null;\n this.values = null;\n }\n Bindings.prototype.getType = function () {\n return \"bindings\";\n };\n Bindings.prototype.getNames = function () {\n var res = [];\n this.fillProperties();\n for (var i = 0; i < this.properties.length; i++) {\n if (this.properties[i].isVisible(\"\", this.obj)) {\n res.push(this.properties[i].name);\n }\n }\n return res;\n };\n Bindings.prototype.getProperties = function () {\n var res = [];\n this.fillProperties();\n for (var i = 0; i < this.properties.length; i++) {\n res.push(this.properties[i]);\n }\n return res;\n };\n Bindings.prototype.setBinding = function (propertyName, valueName) {\n if (!this.values)\n this.values = {};\n if (!!valueName) {\n this.values[propertyName] = valueName;\n }\n else {\n delete this.values[propertyName];\n if (Object.keys(this.values).length == 0) {\n this.values = null;\n }\n }\n };\n Bindings.prototype.clearBinding = function (propertyName) {\n this.setBinding(propertyName, \"\");\n };\n Bindings.prototype.isEmpty = function () {\n return !this.values;\n };\n Bindings.prototype.getValueNameByPropertyName = function (propertyName) {\n if (!this.values)\n return undefined;\n return this.values[propertyName];\n };\n Bindings.prototype.getPropertiesByValueName = function (valueName) {\n if (!this.values)\n return [];\n var res = [];\n for (var key in this.values) {\n if (this.values[key] == valueName) {\n res.push(key);\n }\n }\n return res;\n };\n Bindings.prototype.getJson = function () {\n if (this.isEmpty())\n return null;\n var res = {};\n for (var key in this.values) {\n res[key] = this.values[key];\n }\n return res;\n };\n Bindings.prototype.setJson = function (value) {\n this.values = null;\n if (!value)\n return;\n this.values = {};\n for (var key in value) {\n this.values[key] = value[key];\n }\n };\n Bindings.prototype.fillProperties = function () {\n if (this.properties !== null)\n return;\n this.properties = [];\n var objProperties = _jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].getPropertiesByObj(this.obj);\n for (var i = 0; i < objProperties.length; i++) {\n if (objProperties[i].isBindable) {\n this.properties.push(objProperties[i]);\n }\n }\n };\n return Bindings;\n}());\n\n/**\n * The base class for SurveyJS objects.\n */\nvar Base = /** @class */ (function () {\n function Base() {\n this.propertyHash = {};\n this.eventList = [];\n this.isLoadingFromJsonValue = false;\n this.loadingOwner = null;\n /**\n * Event that raise on property change of the sender object\n * sender - the object that owns the property\n * options.name - the property name that has been changed\n * options.oldValue - old value. Please note, it equals to options.newValue if property is an array\n * options.newValue - new value.\n */\n this.onPropertyChanged = this.addEvent();\n /**\n * Event that raised on changing property of the ItemValue object.\n * sender - the object that owns the property\n * options.propertyName - the property name to which ItemValue array is belong. It can be \"choices\" for dropdown question\n * options.obj - the instance of ItemValue object which property has been changed\n * options.name - the property of ItemObject that has been changed\n * options.oldValue - old value\n * options.newValue - new value\n */\n this.onItemValuePropertyChanged = this.addEvent();\n this.isCreating = true;\n this.bindingsValue = new Bindings(this);\n _jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"CustomPropertiesCollection\"].createProperties(this);\n this.onBaseCreating();\n this.isCreating = false;\n }\n Object.defineProperty(Base, \"commentPrefix\", {\n get: function () {\n return _settings__WEBPACK_IMPORTED_MODULE_3__[\"settings\"].commentPrefix;\n },\n set: function (val) {\n _settings__WEBPACK_IMPORTED_MODULE_3__[\"settings\"].commentPrefix = val;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Returns true if a value undefined, null, empty string or empty array.\n *\n * @param value\n * @param trimString a boolean parameter, default value true. If true then it trims the string and functions returns true for a string that contains white spaces only.\n */\n Base.prototype.isValueEmpty = function (value, trimString) {\n if (trimString === void 0) { trimString = true; }\n if (trimString) {\n value = this.trimValue(value);\n }\n return _helpers__WEBPACK_IMPORTED_MODULE_1__[\"Helpers\"].isValueEmpty(value);\n };\n Base.prototype.trimValue = function (value) {\n if (!!value && (typeof value === \"string\" || value instanceof String))\n return value.trim();\n return value;\n };\n Base.prototype.IsPropertyEmpty = function (value) {\n return value !== \"\" && this.isValueEmpty(value);\n };\n Base.prototype.dispose = function () {\n for (var i = 0; i < this.eventList.length; i++) {\n this.eventList[i].clear();\n }\n this.isDisposedValue = true;\n };\n Object.defineProperty(Base.prototype, \"isDisposed\", {\n get: function () {\n return this.isDisposedValue === true;\n },\n enumerable: false,\n configurable: true\n });\n Base.prototype.addEvent = function () {\n var res = new EventBase();\n this.eventList.push(res);\n return res;\n };\n Base.prototype.onBaseCreating = function () { };\n /**\n * Returns the type of the object as a string as it represents in the json. It should be in lowcase.\n */\n Base.prototype.getType = function () {\n return \"base\";\n };\n Base.prototype.getSurvey = function (isLive) {\n if (isLive === void 0) { isLive = false; }\n return null;\n };\n Object.defineProperty(Base.prototype, \"inSurvey\", {\n /**\n * Returns true if the object is inluded into survey, otherwise returns false.\n */\n get: function () {\n return !!this.getSurvey(true);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Base.prototype, \"bindings\", {\n get: function () {\n return this.bindingsValue;\n },\n enumerable: false,\n configurable: true\n });\n Base.prototype.checkBindings = function (valueName, value) { };\n Base.prototype.updateBindings = function (propertyName, value) {\n var valueName = this.bindings.getValueNameByPropertyName(propertyName);\n if (!!valueName) {\n this.updateBindingValue(valueName, value);\n }\n };\n Base.prototype.updateBindingValue = function (valueName, value) { };\n /**\n * Returns the element template name without prefix. Typically it equals to getType().\n * @see getType\n */\n Base.prototype.getTemplate = function () {\n return this.getType();\n };\n Object.defineProperty(Base.prototype, \"isLoadingFromJson\", {\n /**\n * Returns true if the object is loading from Json at the current moment.\n */\n get: function () {\n return this.getIsLoadingFromJson();\n },\n enumerable: false,\n configurable: true\n });\n Base.prototype.getIsLoadingFromJson = function () {\n if (!!this.loadingOwner && this.loadingOwner.isLoadingFromJson)\n return true;\n return this.isLoadingFromJsonValue;\n };\n Base.prototype.startLoadingFromJson = function () {\n this.isLoadingFromJsonValue = true;\n };\n Base.prototype.endLoadingFromJson = function () {\n this.isLoadingFromJsonValue = false;\n };\n /**\n * Deserialized the current object into JSON\n * @see fromJSON\n */\n Base.prototype.toJSON = function () {\n return new _jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"JsonObject\"]().toJsonObject(this);\n };\n /**\n * Load object properties and elements. It doesn't reset properties that was changed before and they are not defined in the json parameter.\n * @param json the object JSON definition\n * @see toJSON\n */\n Base.prototype.fromJSON = function (json) {\n return new _jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"JsonObject\"]().toObject(json, this);\n };\n /**\n * Make a clone of the existing object. Create a new object of the same type and load all properties into it.\n */\n Base.prototype.clone = function () {\n var clonedObj = _jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].createClass(this.getType());\n clonedObj.fromJSON(this.toJSON());\n return clonedObj;\n };\n /**\n * Returns the serializable property that belongs to this instance by property name. It returns null if the property is not exists.\n * @param propName property name\n * @returns\n */\n Base.prototype.getPropertyByName = function (propName) {\n return _jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].findProperty(this.getType(), propName);\n };\n Base.prototype.isPropertyVisible = function (propName) {\n var prop = this.getPropertyByName(propName);\n return !!prop ? prop.isVisible(\"\", this) : false;\n };\n Base.createProgressInfo = function () {\n return {\n questionCount: 0,\n answeredQuestionCount: 0,\n requiredQuestionCount: 0,\n requiredAnsweredQuestionCount: 0,\n };\n };\n Base.prototype.getProgressInfo = function () {\n return Base.createProgressInfo();\n };\n Base.prototype.localeChanged = function () { };\n Base.prototype.locStrsChanged = function () {\n if (!!this.arraysInfo) {\n for (var key in this.arraysInfo) {\n var item = this.arraysInfo[key];\n if (item && item.isItemValues) {\n var arr = this.getPropertyValue(key);\n if (arr && !!Base.itemValueLocStrChanged)\n Base.itemValueLocStrChanged(arr);\n }\n }\n }\n if (!!this.localizableStrings) {\n for (var key in this.localizableStrings) {\n var item = this.getLocalizableString(key);\n if (item)\n item.strChanged();\n }\n }\n };\n /**\n * Returns the property value by name\n * @param name property name\n */\n Base.prototype.getPropertyValue = function (name, defaultValue) {\n if (defaultValue === void 0) { defaultValue = null; }\n var res = this.getPropertyValueCore(this.propertyHash, name);\n if (this.IsPropertyEmpty(res)) {\n if (defaultValue != null)\n return defaultValue;\n var prop = _jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].findProperty(this.getType(), name);\n if (!!prop && (!prop.isCustom || !this.isCreating)) {\n if (!this.IsPropertyEmpty(prop.defaultValue) &&\n !Array.isArray(prop.defaultValue))\n return prop.defaultValue;\n if (prop.type == \"boolean\" || prop.type == \"switch\")\n return false;\n if (prop.isCustom && !!prop.onGetValue)\n return prop.onGetValue(this);\n }\n }\n return res;\n };\n Base.prototype.getPropertyValueCore = function (propertiesHash, name) {\n if (this.getPropertyValueCoreHandler)\n return this.getPropertyValueCoreHandler(propertiesHash, name);\n else\n return propertiesHash[name];\n };\n Base.prototype.geValueFromHash = function () {\n return this.propertyHash[\"value\"];\n };\n Base.prototype.setPropertyValueCore = function (propertiesHash, name, val) {\n if (this.setPropertyValueCoreHandler && !this.isDisposedValue)\n this.setPropertyValueCoreHandler(propertiesHash, name, val);\n else\n propertiesHash[name] = val;\n };\n Object.defineProperty(Base.prototype, \"isEditingSurveyElement\", {\n get: function () {\n var survey = this.getSurvey();\n return !!survey && survey.isEditingSurveyElement;\n },\n enumerable: false,\n configurable: true\n });\n Base.prototype.iteratePropertiesHash = function (func) {\n var _this = this;\n var keys = [];\n for (var key in this.propertyHash) {\n if (key === \"value\" &&\n this.isEditingSurveyElement &&\n Array.isArray(this.value))\n continue;\n keys.push(key);\n }\n keys.forEach(function (key) { return func(_this.propertyHash, key); });\n };\n /**\n * set property value\n * @param name property name\n * @param val new property value\n */\n Base.prototype.setPropertyValue = function (name, val) {\n var oldValue = this.getPropertyValue(name);\n if (oldValue && Array.isArray(oldValue)) {\n if (this.isTwoValueEquals(oldValue, val))\n return;\n var arrayInfo = this.arraysInfo[name];\n this.setArray(name, oldValue, val, arrayInfo ? arrayInfo.isItemValues : false, arrayInfo ? arrayInfo.onPush : null);\n }\n else {\n this.setPropertyValueCore(this.propertyHash, name, val);\n if (!this.isDisposedValue && !this.isTwoValueEquals(oldValue, val)) {\n this.propertyValueChanged(name, oldValue, val);\n }\n }\n };\n Base.prototype.clearPropertyValue = function (name) {\n this.setPropertyValueCore(this.propertyHash, name, null);\n delete this.propertyHash[name];\n };\n Base.prototype.onPropertyValueChangedCallback = function (name, oldValue, newValue, sender, arrayChanges) { };\n Base.prototype.itemValuePropertyChanged = function (item, name, oldValue, newValue) {\n this.onItemValuePropertyChanged.fire(this, {\n obj: item,\n name: name,\n oldValue: oldValue,\n newValue: newValue,\n propertyName: item.ownerPropertyName,\n });\n };\n Base.prototype.onPropertyValueChanged = function (name, oldValue, newValue) { };\n Base.prototype.propertyValueChanged = function (name, oldValue, newValue, arrayChanges, target) {\n if (this.isLoadingFromJson)\n return;\n this.updateBindings(name, newValue);\n this.onPropertyValueChanged(name, oldValue, newValue);\n this.onPropertyChanged.fire(this, {\n name: name,\n oldValue: oldValue,\n newValue: newValue,\n });\n this.doPropertyValueChangedCallback(name, oldValue, newValue, arrayChanges, this);\n if (!this.onPropChangeFunctions)\n return;\n for (var i = 0; i < this.onPropChangeFunctions.length; i++) {\n if (this.onPropChangeFunctions[i].name == name)\n this.onPropChangeFunctions[i].func(newValue);\n }\n };\n Object.defineProperty(Base.prototype, \"isInternal\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Base.prototype.doPropertyValueChangedCallback = function (name, oldValue, newValue, arrayChanges, target) {\n if (this.isInternal)\n return;\n if (!target)\n target = this;\n var notifier = this.getSurvey();\n if (!notifier)\n notifier = this;\n if (!!notifier.doPropertyValueChangedCallback) {\n notifier.onPropertyValueChangedCallback(name, oldValue, newValue, target, arrayChanges);\n }\n };\n /**\n * Register a function that will be called on a property value changed.\n * @param name the property name\n * @param func the function with no parameters that will be called on property changed.\n * @param key an optional parameter. If there is already a registered function for this property with the same key, it will be overwritten.\n */\n Base.prototype.registerFunctionOnPropertyValueChanged = function (name, func, key) {\n if (key === void 0) { key = null; }\n if (!this.onPropChangeFunctions) {\n this.onPropChangeFunctions = [];\n }\n if (key) {\n for (var i = 0; i < this.onPropChangeFunctions.length; i++) {\n var item = this.onPropChangeFunctions[i];\n if (item.name == name && item.key == key) {\n item.func = func;\n return;\n }\n }\n }\n this.onPropChangeFunctions.push({ name: name, func: func, key: key });\n };\n /**\n * Register a function that will be called on a property value changed from the names list.\n * @param names the list of properties names\n * @param func the function with no parameters that will be called on property changed.\n * @param key an optional parameter. If there is already a registered function for this property with the same key, it will be overwritten.\n */\n Base.prototype.registerFunctionOnPropertiesValueChanged = function (names, func, key) {\n if (key === void 0) { key = null; }\n for (var i = 0; i < names.length; i++) {\n this.registerFunctionOnPropertyValueChanged(names[i], func, key);\n }\n };\n /**\n * Unregister notification on property value changed\n * @param name the property name\n * @param key the key with which you have registered the notification for this property. It can be null.\n */\n Base.prototype.unRegisterFunctionOnPropertyValueChanged = function (name, key) {\n if (key === void 0) { key = null; }\n if (!this.onPropChangeFunctions)\n return;\n for (var i = 0; i < this.onPropChangeFunctions.length; i++) {\n var item = this.onPropChangeFunctions[i];\n if (item.name == name && item.key == key) {\n this.onPropChangeFunctions.splice(i, 1);\n return;\n }\n }\n };\n /**\n * Unregister notification on property value changed for all properties in the names list.\n * @param names the list of properties names\n * @param key the key with which you have registered the notification for this property. It can be null.\n */\n Base.prototype.unRegisterFunctionOnPropertiesValueChanged = function (names, key) {\n if (key === void 0) { key = null; }\n for (var i = 0; i < names.length; i++) {\n this.unRegisterFunctionOnPropertyValueChanged(names[i], key);\n }\n };\n Base.prototype.createCustomLocalizableObj = function (name) {\n var locStr = this.getLocalizableString(name);\n if (locStr || !this.getLocale)\n return;\n this.createLocalizableString(name, this);\n };\n Base.prototype.createLocalizableString = function (name, owner, useMarkDown) {\n var _this = this;\n if (useMarkDown === void 0) { useMarkDown = false; }\n var locStr = new _localizablestring__WEBPACK_IMPORTED_MODULE_0__[\"LocalizableString\"](owner, useMarkDown, name);\n locStr.onStrChanged = function (oldValue, newValue) {\n _this.propertyValueChanged(name, oldValue, newValue);\n };\n if (!this.localizableStrings) {\n this.localizableStrings = {};\n }\n this.localizableStrings[name] = locStr;\n return locStr;\n };\n Base.prototype.getLocalizableString = function (name) {\n return !!this.localizableStrings ? this.localizableStrings[name] : null;\n };\n Base.prototype.getLocalizableStringText = function (name, defaultStr) {\n if (defaultStr === void 0) { defaultStr = \"\"; }\n var locStr = this.getLocalizableString(name);\n if (!locStr)\n return \"\";\n var res = locStr.text;\n return res ? res : defaultStr;\n };\n Base.prototype.setLocalizableStringText = function (name, value) {\n var locStr = this.getLocalizableString(name);\n if (!locStr)\n return;\n locStr.text = value;\n };\n Base.prototype.addUsedLocales = function (locales) {\n if (!!this.localizableStrings) {\n for (var key in this.localizableStrings) {\n var item = this.getLocalizableString(key);\n if (item)\n this.AddLocStringToUsedLocales(item, locales);\n }\n }\n if (!!this.arraysInfo) {\n for (var key in this.arraysInfo) {\n var items = this.getPropertyValue(key);\n if (!items || !items.length)\n continue;\n for (var i = 0; i < items.length; i++) {\n var item = items[i];\n if (item && item.addUsedLocales) {\n item.addUsedLocales(locales);\n }\n }\n }\n }\n };\n Base.prototype.searchText = function (text, founded) {\n var strs = [];\n this.getSearchableLocalizedStrings(strs);\n for (var i = 0; i < strs.length; i++) {\n if (strs[i].setFindText(text)) {\n founded.push({ element: this, str: strs[i] });\n }\n }\n };\n Base.prototype.getSearchableLocalizedStrings = function (arr) {\n if (!!this.localizableStrings) {\n var keys_1 = [];\n this.getSearchableLocKeys(keys_1);\n for (var i = 0; i < keys_1.length; i++) {\n var item = this.getLocalizableString(keys_1[i]);\n if (item)\n arr.push(item);\n }\n }\n if (!this.arraysInfo)\n return;\n var keys = [];\n this.getSearchableItemValueKeys(keys);\n for (var i = 0; i < keys.length; i++) {\n var items = this.getPropertyValue(keys[i]);\n if (!items)\n continue;\n for (var j = 0; j < items.length; j++) {\n arr.push(items[j].locText);\n }\n }\n };\n Base.prototype.getSearchableLocKeys = function (keys) { };\n Base.prototype.getSearchableItemValueKeys = function (keys) { };\n Base.prototype.AddLocStringToUsedLocales = function (locStr, locales) {\n var locs = locStr.getLocales();\n for (var i = 0; i < locs.length; i++) {\n if (locales.indexOf(locs[i]) < 0) {\n locales.push(locs[i]);\n }\n }\n };\n Base.prototype.createItemValues = function (name) {\n var self = this;\n var result = this.createNewArray(name, function (item) {\n item.locOwner = self;\n item.ownerPropertyName = name;\n });\n this.arraysInfo[name].isItemValues = true;\n return result;\n };\n Base.prototype.notifyArrayChanged = function (ar, arrayChanges) {\n !!ar.onArrayChanged && ar.onArrayChanged(arrayChanges);\n };\n Base.prototype.createNewArrayCore = function (name) {\n var res = null;\n if (!!this.createArrayCoreHandler) {\n res = this.createArrayCoreHandler(this.propertyHash, name);\n }\n if (!res) {\n res = new Array();\n this.setPropertyValueCore(this.propertyHash, name, res);\n }\n return res;\n };\n Base.prototype.ensureArray = function (name, onPush, onRemove) {\n if (onPush === void 0) { onPush = null; }\n if (onRemove === void 0) { onRemove = null; }\n if (this.arraysInfo && this.arraysInfo[name]) {\n return;\n }\n return this.createNewArray(name, onPush, onRemove);\n };\n Base.prototype.createNewArray = function (name, onPush, onRemove) {\n if (onPush === void 0) { onPush = null; }\n if (onRemove === void 0) { onRemove = null; }\n var newArray = this.createNewArrayCore(name);\n if (!this.arraysInfo) {\n this.arraysInfo = {};\n }\n this.arraysInfo[name] = { onPush: onPush, isItemValues: false };\n var self = this;\n newArray.push = function (value) {\n var result = Object.getPrototypeOf(newArray).push.call(newArray, value);\n if (!self.isDisposedValue) {\n if (onPush)\n onPush(value, newArray.length - 1);\n var arrayChanges = new ArrayChanges(newArray.length - 1, 0, [value], []);\n self.propertyValueChanged(name, newArray, newArray, arrayChanges);\n self.notifyArrayChanged(newArray, arrayChanges);\n }\n return result;\n };\n newArray.unshift = function (value) {\n var result = Object.getPrototypeOf(newArray).unshift.call(newArray, value);\n if (!self.isDisposedValue) {\n if (onPush)\n onPush(value, newArray.length - 1);\n var arrayChanges = new ArrayChanges(0, 0, [value], []);\n self.propertyValueChanged(name, newArray, newArray, arrayChanges);\n self.notifyArrayChanged(newArray, arrayChanges);\n }\n return result;\n };\n newArray.pop = function () {\n var result = Object.getPrototypeOf(newArray).pop.call(newArray);\n if (!self.isDisposedValue) {\n if (onRemove)\n onRemove(result);\n var arrayChanges = new ArrayChanges(newArray.length - 1, 1, [], []);\n self.propertyValueChanged(name, newArray, newArray, arrayChanges);\n self.notifyArrayChanged(newArray, arrayChanges);\n }\n return result;\n };\n newArray.splice = function (start, deleteCount) {\n var _a;\n var items = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n items[_i - 2] = arguments[_i];\n }\n if (!start)\n start = 0;\n if (!deleteCount)\n deleteCount = 0;\n var result = (_a = Object.getPrototypeOf(newArray).splice).call.apply(_a, __spreadArray([newArray,\n start,\n deleteCount], items));\n if (!items)\n items = [];\n if (!self.isDisposedValue) {\n if (onRemove && result) {\n for (var i = 0; i < result.length; i++) {\n onRemove(result[i]);\n }\n }\n if (onPush) {\n for (var i = 0; i < items.length; i++) {\n onPush(items[i], start + i);\n }\n }\n var arrayChanges = new ArrayChanges(start, deleteCount, items, result);\n self.propertyValueChanged(name, newArray, newArray, arrayChanges);\n self.notifyArrayChanged(newArray, arrayChanges);\n }\n return result;\n };\n return newArray;\n };\n Base.prototype.getItemValueType = function () {\n return undefined;\n };\n Base.prototype.setArray = function (name, src, dest, isItemValues, onPush) {\n var deletedItems = [].concat(src);\n Object.getPrototypeOf(src).splice.call(src, 0, src.length);\n if (!!dest) {\n for (var i = 0; i < dest.length; i++) {\n var item = dest[i];\n if (isItemValues) {\n if (!!Base.createItemValue) {\n item = Base.createItemValue(item, this.getItemValueType());\n }\n }\n Object.getPrototypeOf(src).push.call(src, item);\n if (onPush)\n onPush(src[i]);\n }\n }\n var arrayChanges = new ArrayChanges(0, deletedItems.length, src, deletedItems);\n this.propertyValueChanged(name, deletedItems, src, arrayChanges);\n this.notifyArrayChanged(src, arrayChanges);\n };\n Base.prototype.isTwoValueEquals = function (x, y, caseInSensitive, trimString) {\n if (caseInSensitive === void 0) { caseInSensitive = false; }\n if (trimString === void 0) { trimString = false; }\n if (caseInSensitive) {\n x = this.getValueInLowCase(x);\n y = this.getValueInLowCase(y);\n }\n if (trimString) {\n x = this.trimValue(x);\n y = this.trimValue(y);\n }\n return _helpers__WEBPACK_IMPORTED_MODULE_1__[\"Helpers\"].isTwoValueEquals(x, y);\n };\n Base.copyObject = function (dst, src) {\n for (var key in src) {\n var source = src[key];\n if (typeof source === \"object\") {\n source = {};\n this.copyObject(source, src[key]);\n }\n dst[key] = source;\n }\n };\n Base.prototype.copyCssClasses = function (dest, source) {\n if (!source)\n return;\n if (typeof source === \"string\" || source instanceof String) {\n dest[\"root\"] = source;\n }\n else {\n Base.copyObject(dest, source);\n }\n };\n Base.prototype.getValueInLowCase = function (val) {\n if (!!val && typeof val == \"string\")\n return val.toLowerCase();\n return val;\n };\n return Base;\n}());\n\nvar ArrayChanges = /** @class */ (function () {\n function ArrayChanges(index, deleteCount, itemsToAdd, deletedItems) {\n this.index = index;\n this.deleteCount = deleteCount;\n this.itemsToAdd = itemsToAdd;\n this.deletedItems = deletedItems;\n }\n return ArrayChanges;\n}());\n\nvar Event = /** @class */ (function () {\n function Event() {\n }\n Object.defineProperty(Event.prototype, \"isEmpty\", {\n get: function () {\n return !this.callbacks || this.callbacks.length == 0;\n },\n enumerable: false,\n configurable: true\n });\n Event.prototype.fire = function (sender, options) {\n if (!this.callbacks)\n return;\n for (var i = 0; i < this.callbacks.length; i++) {\n this.callbacks[i](sender, options);\n if (!this.callbacks)\n return;\n }\n };\n Event.prototype.clear = function () {\n this.callbacks = undefined;\n };\n Event.prototype.add = function (func) {\n if (this.hasFunc(func))\n return;\n if (!this.callbacks) {\n this.callbacks = new Array();\n }\n this.callbacks.push(func);\n this.fireCallbackChanged();\n };\n Event.prototype.remove = function (func) {\n if (this.hasFunc(func)) {\n var index = this.callbacks.indexOf(func, 0);\n this.callbacks.splice(index, 1);\n this.fireCallbackChanged();\n }\n };\n Event.prototype.hasFunc = function (func) {\n if (this.callbacks == null)\n return false;\n return this.callbacks.indexOf(func, 0) > -1;\n };\n Event.prototype.fireCallbackChanged = function () {\n if (!!this.onCallbacksChanged) {\n this.onCallbacksChanged();\n }\n };\n return Event;\n}());\n\nvar EventBase = /** @class */ (function (_super) {\n __extends(EventBase, _super);\n function EventBase() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n return EventBase;\n}(Event));\n\n\n\n/***/ }),\n\n/***/ \"./src/calculatedValue.ts\":\n/*!********************************!*\\\n !*** ./src/calculatedValue.ts ***!\n \\********************************/\n/*! exports provided: CalculatedValue */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CalculatedValue\", function() { return CalculatedValue; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./conditions */ \"./src/conditions.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n/**\n * The calculated value is a way to define the variable in Survey Creator.\n * It has two main properties: name and expression. Based on expression the value read-only property is automatically calculated.\n * The name property should be unique though all calculated values.\n * It uses survey.getVariable/seruvey.setVariable functions to get/set its value. The class do not store its value internally.\n * You may set includeIntoResult property to true to store this calculated value into survey result.\n */\nvar CalculatedValue = /** @class */ (function (_super) {\n __extends(CalculatedValue, _super);\n function CalculatedValue(name, expression) {\n if (name === void 0) { name = null; }\n if (expression === void 0) { expression = null; }\n var _this = _super.call(this) || this;\n _this.expressionIsRunning = false;\n _this.isCalculated = false;\n if (!!name) {\n _this.name = name;\n }\n if (!!expression) {\n _this.expression = expression;\n }\n return _this;\n }\n CalculatedValue.prototype.setOwner = function (data) {\n this.data = data;\n this.rerunExpression();\n };\n CalculatedValue.prototype.getType = function () {\n return \"calculatedvalue\";\n };\n CalculatedValue.prototype.getSurvey = function (live) {\n if (live === void 0) { live = false; }\n return !!this.data && !!this.data[\"getSurvey\"]\n ? this.data.getSurvey()\n : null;\n };\n Object.defineProperty(CalculatedValue.prototype, \"owner\", {\n get: function () {\n return this.data;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(CalculatedValue.prototype, \"name\", {\n /**\n * The calculated value name. It should be non empty and unique.\n */\n get: function () {\n return this.getPropertyValue(\"name\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"name\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(CalculatedValue.prototype, \"includeIntoResult\", {\n /**\n * Set this property to true to include the non-empty calculated value into survey result, survey.data property.\n */\n get: function () {\n return this.getPropertyValue(\"includeIntoResult\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"includeIntoResult\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(CalculatedValue.prototype, \"expression\", {\n /**\n * The Expression that used to calculate the value. You may use standard operators like +, -, * and /, squares (). Here is the example of accessing the question value {questionname}.\n *
Example: \"({quantity} * {price}) * (100 - {discount}) / 100\"\n */\n get: function () {\n return this.getPropertyValue(\"expression\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"expression\", val);\n this.rerunExpression();\n },\n enumerable: false,\n configurable: true\n });\n CalculatedValue.prototype.locCalculation = function () {\n this.expressionIsRunning = true;\n };\n CalculatedValue.prototype.unlocCalculation = function () {\n this.expressionIsRunning = false;\n };\n CalculatedValue.prototype.resetCalculation = function () {\n this.isCalculated = false;\n };\n CalculatedValue.prototype.doCalculation = function (calculatedValues, values, properties) {\n if (this.isCalculated)\n return;\n this.runExpressionCore(calculatedValues, values, properties);\n this.isCalculated = true;\n };\n CalculatedValue.prototype.runExpression = function (values, properties) {\n this.runExpressionCore(null, values, properties);\n };\n Object.defineProperty(CalculatedValue.prototype, \"value\", {\n get: function () {\n if (!this.data)\n return undefined;\n return this.data.getVariable(this.name);\n },\n enumerable: false,\n configurable: true\n });\n CalculatedValue.prototype.setValue = function (val) {\n if (!this.data)\n return;\n this.data.setVariable(this.name, val);\n };\n Object.defineProperty(CalculatedValue.prototype, \"canRunExpression\", {\n get: function () {\n return (!!this.data &&\n !this.isLoadingFromJson &&\n !!this.expression &&\n !this.expressionIsRunning &&\n !!this.name);\n },\n enumerable: false,\n configurable: true\n });\n CalculatedValue.prototype.rerunExpression = function () {\n if (!this.canRunExpression)\n return;\n this.runExpression(this.data.getFilteredValues(), this.data.getFilteredProperties());\n };\n CalculatedValue.prototype.runExpressionCore = function (calculatedValues, values, properties) {\n if (!this.canRunExpression)\n return;\n this.ensureExpression(values);\n this.locCalculation();\n if (!!calculatedValues) {\n this.runDependentExpressions(calculatedValues, values, properties);\n }\n this.expressionRunner.run(values, properties);\n };\n CalculatedValue.prototype.runDependentExpressions = function (calculatedValues, values, properties) {\n var variables = this.expressionRunner.getVariables();\n if (!variables)\n return;\n for (var i = 0; i < calculatedValues.length; i++) {\n var calcItem = calculatedValues[i];\n if (calcItem === this || variables.indexOf(calcItem.name) < 0)\n continue;\n calcItem.doCalculation(calculatedValues, values, properties);\n values[calcItem.name] = calcItem.value;\n }\n };\n CalculatedValue.prototype.ensureExpression = function (values) {\n var _this = this;\n if (!!this.expressionRunner)\n return;\n this.expressionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_2__[\"ExpressionRunner\"](this.expression);\n this.expressionRunner.onRunComplete = function (newValue) {\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isTwoValueEquals(newValue, _this.value)) {\n _this.setValue(newValue);\n }\n _this.unlocCalculation();\n };\n };\n return CalculatedValue;\n}(_base__WEBPACK_IMPORTED_MODULE_1__[\"Base\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_3__[\"Serializer\"].addClass(\"calculatedvalue\", [\n { name: \"!name\", isUnique: true },\n \"expression:expression\",\n \"includeIntoResult:boolean\",\n], function () {\n return new CalculatedValue();\n}, \"base\");\n\n\n/***/ }),\n\n/***/ \"./src/choicesRestful.ts\":\n/*!*******************************!*\\\n !*** ./src/choicesRestful.ts ***!\n \\*******************************/\n/*! exports provided: ChoicesRestful, ChoicesRestfull */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ChoicesRestful\", function() { return ChoicesRestful; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ChoicesRestfull\", function() { return ChoicesRestfull; });\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\nvar XmlParser = /** @class */ (function () {\n function XmlParser() {\n this.parser = new DOMParser();\n }\n XmlParser.prototype.assignValue = function (target, name, value) {\n if (Array.isArray(target[name])) {\n target[name].push(value);\n }\n else if (target[name] !== undefined) {\n target[name] = [target[name]].concat(value);\n }\n else if (typeof value === \"object\" &&\n Object.keys(value).length === 1 &&\n Object.keys(value)[0] === name) {\n target[name] = value[name];\n }\n else {\n target[name] = value;\n }\n };\n XmlParser.prototype.xml2Json = function (xmlNode, result) {\n if (xmlNode.children && xmlNode.children.length > 0) {\n for (var i = 0; i < xmlNode.children.length; i++) {\n var childNode = xmlNode.children[i];\n var childObject = {};\n this.xml2Json(childNode, childObject);\n this.assignValue(result, childNode.nodeName, childObject);\n }\n }\n else {\n this.assignValue(result, xmlNode.nodeName, xmlNode.textContent);\n }\n };\n XmlParser.prototype.parseXmlString = function (xmlString) {\n var xmlRoot = this.parser.parseFromString(xmlString, \"text/xml\");\n var json = {};\n this.xml2Json(xmlRoot, json);\n return json;\n };\n return XmlParser;\n}());\n/**\n * A definition for filling choices for checkbox, dropdown and radiogroup questions from resfull services.\n * The run method call a restful service and results can be get on getResultCallback.\n */\nvar ChoicesRestful = /** @class */ (function (_super) {\n __extends(ChoicesRestful, _super);\n function ChoicesRestful() {\n var _this = _super.call(this) || this;\n _this.lastObjHash = \"\";\n _this.isRunningValue = false;\n _this.processedUrl = \"\";\n _this.processedPath = \"\";\n _this.isUsingCacheFromUrl = undefined;\n _this.error = null;\n _this.createItemValue = function (value) {\n return new _itemvalue__WEBPACK_IMPORTED_MODULE_1__[\"ItemValue\"](value);\n };\n return _this;\n }\n Object.defineProperty(ChoicesRestful, \"EncodeParameters\", {\n get: function () {\n return _settings__WEBPACK_IMPORTED_MODULE_4__[\"settings\"].webserviceEncodeParameters;\n },\n set: function (val) {\n _settings__WEBPACK_IMPORTED_MODULE_4__[\"settings\"].webserviceEncodeParameters = val;\n },\n enumerable: false,\n configurable: true\n });\n ChoicesRestful.clearCache = function () {\n ChoicesRestful.itemsResult = {};\n ChoicesRestful.sendingSameRequests = {};\n };\n ChoicesRestful.addSameRequest = function (obj) {\n if (!obj.isUsingCache)\n return false;\n var hash = obj.objHash;\n var res = ChoicesRestful.sendingSameRequests[hash];\n if (!res) {\n ChoicesRestful.sendingSameRequests[obj.objHash] = [];\n return false;\n }\n res.push(obj);\n obj.isRunningValue = true;\n return true;\n };\n ChoicesRestful.unregisterSameRequests = function (obj, items) {\n if (!obj.isUsingCache)\n return;\n var res = ChoicesRestful.sendingSameRequests[obj.objHash];\n delete ChoicesRestful.sendingSameRequests[obj.objHash];\n if (!res)\n return;\n for (var i = 0; i < res.length; i++) {\n res[i].isRunningValue = false;\n if (!!res[i].getResultCallback) {\n res[i].getResultCallback(items);\n }\n }\n };\n ChoicesRestful.getCachedItemsResult = function (obj) {\n var hash = obj.objHash;\n var res = ChoicesRestful.itemsResult[hash];\n if (!res)\n return false;\n if (obj.getResultCallback) {\n obj.getResultCallback(res);\n }\n return true;\n };\n ChoicesRestful.prototype.getSurvey = function (live) {\n if (live === void 0) { live = false; }\n return !!this.owner ? this.owner.survey : null;\n };\n ChoicesRestful.prototype.run = function (textProcessor) {\n if (textProcessor === void 0) { textProcessor = null; }\n if (!this.url || !this.getResultCallback)\n return;\n this.processedText(textProcessor);\n if (!this.processedUrl) {\n this.doEmptyResultCallback({});\n this.lastObjHash = this.objHash;\n return;\n }\n if (this.lastObjHash === this.objHash)\n return;\n this.lastObjHash = this.objHash;\n this.error = null;\n if (this.useChangedItemsResults())\n return;\n if (ChoicesRestful.addSameRequest(this))\n return;\n this.sendRequest();\n };\n Object.defineProperty(ChoicesRestful.prototype, \"isUsingCache\", {\n get: function () {\n if (this.isUsingCacheFromUrl === true)\n return true;\n if (this.isUsingCacheFromUrl === false)\n return false;\n return _settings__WEBPACK_IMPORTED_MODULE_4__[\"settings\"].useCachingForChoicesRestful;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ChoicesRestful.prototype, \"isRunning\", {\n get: function () {\n return this.getIsRunning();\n },\n enumerable: false,\n configurable: true\n });\n ChoicesRestful.prototype.getIsRunning = function () {\n return this.isRunningValue;\n };\n Object.defineProperty(ChoicesRestful.prototype, \"isWaitingForParameters\", {\n get: function () {\n return this.url && !this.processedUrl;\n },\n enumerable: false,\n configurable: true\n });\n ChoicesRestful.prototype.useChangedItemsResults = function () {\n return ChoicesRestful.getCachedItemsResult(this);\n };\n ChoicesRestful.prototype.doEmptyResultCallback = function (serverResult) {\n var items = [];\n if (this.updateResultCallback) {\n items = this.updateResultCallback(items, serverResult);\n }\n this.getResultCallback(items);\n };\n ChoicesRestful.prototype.processedText = function (textProcessor) {\n var urlText = this.url;\n if (!!urlText) {\n urlText = urlText\n .replace(ChoicesRestful.cacheText, \"\")\n .replace(ChoicesRestful.noCacheText, \"\");\n }\n if (textProcessor) {\n var pUrl = textProcessor.processTextEx(urlText, false, _settings__WEBPACK_IMPORTED_MODULE_4__[\"settings\"].webserviceEncodeParameters);\n var pPath = textProcessor.processTextEx(this.path, false, _settings__WEBPACK_IMPORTED_MODULE_4__[\"settings\"].webserviceEncodeParameters);\n if (!pUrl.hasAllValuesOnLastRun || !pPath.hasAllValuesOnLastRun) {\n this.processedUrl = \"\";\n this.processedPath = \"\";\n }\n else {\n this.processedUrl = pUrl.text;\n this.processedPath = pPath.text;\n }\n }\n else {\n this.processedUrl = urlText;\n this.processedPath = this.path;\n }\n if (this.onProcessedUrlCallback) {\n this.onProcessedUrlCallback(this.processedUrl, this.processedPath);\n }\n };\n ChoicesRestful.prototype.parseResponse = function (response) {\n var parsedResponse;\n if (!!response &&\n typeof response.indexOf === \"function\" &&\n response.indexOf(\"<\") === 0) {\n var parser = new XmlParser();\n parsedResponse = parser.parseXmlString(response);\n }\n else {\n try {\n parsedResponse = JSON.parse(response);\n }\n catch (_a) {\n parsedResponse = (response || \"\")\n .split(\"\\n\")\n .map(function (s) { return s.trim(\" \"); })\n .filter(function (s) { return !!s; });\n }\n }\n return parsedResponse;\n };\n ChoicesRestful.prototype.sendRequest = function () {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", this.processedUrl);\n xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n var self = this;\n var loadingObjHash = this.objHash;\n xhr.onload = function () {\n self.beforeLoadRequest();\n if (xhr.status === 200) {\n self.onLoad(self.parseResponse(xhr.response), loadingObjHash);\n }\n else {\n self.onError(xhr.statusText, xhr.responseText);\n }\n };\n var options = { request: xhr };\n if (!!ChoicesRestful.onBeforeSendRequest) {\n ChoicesRestful.onBeforeSendRequest(this, options);\n }\n this.beforeSendRequest();\n options.request.send();\n };\n ChoicesRestful.prototype.getType = function () {\n return \"choicesByUrl\";\n };\n Object.defineProperty(ChoicesRestful.prototype, \"isEmpty\", {\n get: function () {\n return (!this.url &&\n !this.path &&\n !this.valueName &&\n !this.titleName &&\n !this.imageLinkName);\n },\n enumerable: false,\n configurable: true\n });\n ChoicesRestful.prototype.getCustomPropertiesNames = function () {\n var properties = this.getCustomProperties();\n var res = new Array();\n for (var i = 0; i < properties.length; i++) {\n res.push(this.getCustomPropertyName(properties[i].name));\n }\n return res;\n };\n ChoicesRestful.prototype.getCustomPropertyName = function (propertyName) {\n return propertyName + \"Name\";\n };\n ChoicesRestful.prototype.getCustomProperties = function () {\n var properties = _jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].getProperties(this.itemValueType);\n var res = [];\n for (var i = 0; i < properties.length; i++) {\n if (properties[i].name === \"value\" ||\n properties[i].name === \"text\" ||\n properties[i].name === \"visibleIf\" ||\n properties[i].name === \"enableIf\")\n continue;\n res.push(properties[i]);\n }\n return res;\n };\n ChoicesRestful.prototype.setData = function (json) {\n this.clear();\n if (json.url)\n this.url = json.url;\n if (json.path)\n this.path = json.path;\n if (json.valueName)\n this.valueName = json.valueName;\n if (json.titleName)\n this.titleName = json.titleName;\n if (json.imageLinkName)\n this.imageLinkName = json.imageLinkName;\n if (json.allowEmptyResponse !== undefined)\n this.allowEmptyResponse = json.allowEmptyResponse;\n if (json.attachOriginalItems !== undefined)\n this.attachOriginalItems = json.attachOriginalItems;\n var properties = this.getCustomPropertiesNames();\n for (var i = 0; i < properties.length; i++) {\n if (json[properties[i]])\n this[properties[i]] = json[properties[i]];\n }\n };\n ChoicesRestful.prototype.getData = function () {\n if (this.isEmpty)\n return null;\n var res = {};\n if (this.url)\n res[\"url\"] = this.url;\n if (this.path)\n res[\"path\"] = this.path;\n if (this.valueName)\n res[\"valueName\"] = this.valueName;\n if (this.titleName)\n res[\"titleName\"] = this.titleName;\n if (this.imageLinkName)\n res[\"imageLinkName\"] = this.imageLinkName;\n if (this.allowEmptyResponse)\n res[\"allowEmptyResponse\"] = this.allowEmptyResponse;\n if (this.attachOriginalItems)\n res[\"attachOriginalItems\"] = this.attachOriginalItems;\n var properties = this.getCustomPropertiesNames();\n for (var i = 0; i < properties.length; i++) {\n if (this[properties[i]])\n res[properties[i]] = this[properties[i]];\n }\n return res;\n };\n Object.defineProperty(ChoicesRestful.prototype, \"url\", {\n /**\n * Gets or sets a link to a web service. You can use text preprocessing here.\n * For example, the following url: _https://restcountries.eu/rest/v2/region/{region}_ is changed based on the _region_ question's value.\n * SurveyJS automatically gets data from the web service when the value of the _region_ question changes.\n * @see path\n * @see valueName\n * @see titleName\n * @see [Example: RESTful Dropdown](https://surveyjs.io/Examples/Library/?id=questiontype-dropdownrestfull)\n * @see [Docs: Fill Choices from a RESTful Service](https://surveyjs.io/Documentation/Library/?id=LibraryOverview#fill-the-choices-from-a-restful-service)\n */\n get: function () {\n return this.getPropertyValue(\"url\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"url\", val);\n this.isUsingCacheFromUrl = undefined;\n if (!val)\n return;\n if (val.indexOf(ChoicesRestful.cacheText) > -1) {\n this.isUsingCacheFromUrl = true;\n }\n else {\n if (val.indexOf(ChoicesRestful.noCacheText) > -1) {\n this.isUsingCacheFromUrl = false;\n }\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ChoicesRestful.prototype, \"path\", {\n /**\n * Use this property, if a web service returns a lot of information and you need only a part of it.\n * For example, a web service returns a list of countries and a list of capitals.\n * If you need a list of countries, set a correct path from which SurveyJS obtains the data, like: _DataList1\\DataList2_\n * @see url\n * @see valueName\n * @see titleName\n * @see [Example: RESTful Dropdown](https://surveyjs.io/Examples/Library/?id=questiontype-dropdownrestfull)\n * @see [Docs: Fill Choices from a RESTful Service](https://surveyjs.io/Documentation/Library/?id=LibraryOverview#fill-the-choices-from-a-restful-service)\n */\n get: function () {\n return this.getPropertyValue(\"path\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"path\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ChoicesRestful.prototype, \"valueName\", {\n /**\n * Gets or sets the name of a property (in the obtained data object) to which SurveyJS binds to provide values for choice items.\n * @see url\n * @see path\n * @see titleName\n * @see [Example: RESTful Dropdown](https://surveyjs.io/Examples/Library/?id=questiontype-dropdownrestfull)\n * @see [Docs: Fill Choices from a RESTful Service](https://surveyjs.io/Documentation/Library/?id=LibraryOverview#fill-the-choices-from-a-restful-service)\n */\n get: function () {\n return this.getPropertyValue(\"valueName\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"valueName\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ChoicesRestful.prototype, \"titleName\", {\n /**\n * Gets or sets the name of a property (in the obtained data object) to which SurveyJS binds to provide display texts for choice items.\n * @see url\n * @see path\n * @see valueeName\n * @see [Example: RESTful Dropdown](https://surveyjs.io/Examples/Library/?id=questiontype-dropdownrestfull)\n * @see [Docs: Fill Choices from a RESTful Service](https://surveyjs.io/Documentation/Library/?id=LibraryOverview#fill-the-choices-from-a-restful-service)\n */\n get: function () {\n return this.getPropertyValue(\"titleName\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"titleName\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ChoicesRestful.prototype, \"imageLinkName\", {\n get: function () {\n return this.getPropertyValue(\"imageLinkName\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"imageLinkName\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ChoicesRestful.prototype, \"allowEmptyResponse\", {\n get: function () {\n return this.getPropertyValue(\"allowEmptyResponse\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"allowEmptyResponse\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ChoicesRestful.prototype, \"attachOriginalItems\", {\n get: function () {\n return this.getPropertyValue(\"attachOriginalItems\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"attachOriginalItems\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ChoicesRestful.prototype, \"itemValueType\", {\n get: function () {\n if (!this.owner)\n return \"itemvalue\";\n var prop = _jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].findProperty(this.owner.getType(), \"choices\");\n if (!prop)\n return \"itemvalue\";\n if (prop.type == \"itemvalue[]\")\n return \"itemvalue\";\n return prop.type;\n },\n enumerable: false,\n configurable: true\n });\n ChoicesRestful.prototype.clear = function () {\n this.url = \"\";\n this.path = \"\";\n this.valueName = \"\";\n this.titleName = \"\";\n this.imageLinkName = \"\";\n var properties = this.getCustomPropertiesNames();\n for (var i = 0; i < properties.length; i++) {\n if (this[properties[i]])\n this[properties[i]] = \"\";\n }\n };\n ChoicesRestful.prototype.beforeSendRequest = function () {\n this.isRunningValue = true;\n if (!!this.beforeSendRequestCallback) {\n this.beforeSendRequestCallback();\n }\n };\n ChoicesRestful.prototype.beforeLoadRequest = function () {\n this.isRunningValue = false;\n };\n ChoicesRestful.prototype.onLoad = function (result, loadingObjHash) {\n if (loadingObjHash === void 0) { loadingObjHash = null; }\n if (!loadingObjHash) {\n loadingObjHash = this.objHash;\n }\n var items = new Array();\n var updatedResult = this.getResultAfterPath(result);\n if (updatedResult && updatedResult[\"length\"]) {\n for (var i = 0; i < updatedResult.length; i++) {\n var itemValue = updatedResult[i];\n if (!itemValue)\n continue;\n var value = !!this.getItemValueCallback\n ? this.getItemValueCallback(itemValue)\n : this.getValue(itemValue);\n var item = this.createItemValue(value);\n this.setTitle(item, itemValue);\n this.setCustomProperties(item, itemValue);\n if (this.attachOriginalItems) {\n item.originalItem = itemValue;\n }\n var imageLink = this.getImageLink(itemValue);\n if (!!imageLink) {\n item.imageLink = imageLink;\n }\n items.push(item);\n }\n }\n else {\n if (!this.allowEmptyResponse) {\n this.error = new _error__WEBPACK_IMPORTED_MODULE_3__[\"WebRequestEmptyError\"](null, this.owner);\n }\n }\n if (this.updateResultCallback) {\n items = this.updateResultCallback(items, result);\n }\n if (this.isUsingCache) {\n ChoicesRestful.itemsResult[loadingObjHash] = items;\n }\n this.callResultCallback(items, loadingObjHash);\n ChoicesRestful.unregisterSameRequests(this, items);\n };\n ChoicesRestful.prototype.callResultCallback = function (items, loadingObjHash) {\n if (loadingObjHash != this.objHash)\n return;\n this.getResultCallback(items);\n };\n ChoicesRestful.prototype.setCustomProperties = function (item, itemValue) {\n var properties = this.getCustomProperties();\n for (var i = 0; i < properties.length; i++) {\n var prop = properties[i];\n var val = this.getValueCore(itemValue, this.getPropertyBinding(prop.name));\n if (!this.isValueEmpty(val)) {\n item[prop.name] = val;\n }\n }\n };\n ChoicesRestful.prototype.getPropertyBinding = function (propertyName) {\n if (this[this.getCustomPropertyName(propertyName)])\n return this[this.getCustomPropertyName(propertyName)];\n if (this[propertyName])\n return this[propertyName];\n return propertyName;\n };\n ChoicesRestful.prototype.onError = function (status, response) {\n this.error = new _error__WEBPACK_IMPORTED_MODULE_3__[\"WebRequestError\"](status, response, this.owner);\n this.doEmptyResultCallback(response);\n ChoicesRestful.unregisterSameRequests(this, []);\n };\n ChoicesRestful.prototype.getResultAfterPath = function (result) {\n if (!result)\n return result;\n if (!this.processedPath)\n return result;\n var pathes = this.getPathes();\n for (var i = 0; i < pathes.length; i++) {\n result = result[pathes[i]];\n if (!result)\n return null;\n }\n return result;\n };\n ChoicesRestful.prototype.getPathes = function () {\n var pathes = [];\n if (this.processedPath.indexOf(\";\") > -1) {\n pathes = this.path.split(\";\");\n }\n else {\n pathes = this.processedPath.split(\",\");\n }\n if (pathes.length == 0)\n pathes.push(this.processedPath);\n return pathes;\n };\n ChoicesRestful.prototype.getValue = function (item) {\n if (!item)\n return null;\n if (this.valueName)\n return this.getValueCore(item, this.valueName);\n if (!(item instanceof Object))\n return item;\n var len = Object.keys(item).length;\n if (len < 1)\n return null;\n return item[Object.keys(item)[0]];\n };\n ChoicesRestful.prototype.setTitle = function (item, itemValue) {\n var title = this.titleName ? this.titleName : \"title\";\n var val = this.getValueCore(itemValue, title);\n if (!val)\n return;\n if (typeof val === \"string\") {\n item.text = val;\n }\n else {\n item.locText.setJson(val);\n }\n };\n ChoicesRestful.prototype.getImageLink = function (item) {\n var imageLink = this.imageLinkName ? this.imageLinkName : \"imageLink\";\n return this.getValueCore(item, imageLink);\n };\n ChoicesRestful.prototype.getValueCore = function (item, property) {\n if (!item)\n return null;\n if (property.indexOf(\".\") < 0)\n return item[property];\n var properties = property.split(\".\");\n for (var i = 0; i < properties.length; i++) {\n item = item[properties[i]];\n if (!item)\n return null;\n }\n return item;\n };\n Object.defineProperty(ChoicesRestful.prototype, \"objHash\", {\n get: function () {\n return (this.processedUrl +\n \";\" +\n this.processedPath +\n \";\" +\n this.valueName +\n \";\" +\n this.titleName +\n \";\" +\n this.imageLinkName);\n },\n enumerable: false,\n configurable: true\n });\n ChoicesRestful.cacheText = \"{CACHE}\";\n ChoicesRestful.noCacheText = \"{NOCACHE}\";\n ChoicesRestful.itemsResult = {};\n ChoicesRestful.sendingSameRequests = {};\n return ChoicesRestful;\n}(_base__WEBPACK_IMPORTED_MODULE_0__[\"Base\"]));\n\n/**\n * Obsolete, please use ChoicesRestful\n */\nvar ChoicesRestfull = /** @class */ (function (_super) {\n __extends(ChoicesRestfull, _super);\n function ChoicesRestfull() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(ChoicesRestfull, \"EncodeParameters\", {\n get: function () {\n return ChoicesRestful.EncodeParameters;\n },\n set: function (val) {\n ChoicesRestful.EncodeParameters = val;\n },\n enumerable: false,\n configurable: true\n });\n ChoicesRestfull.clearCache = function () {\n ChoicesRestful.clearCache();\n };\n Object.defineProperty(ChoicesRestfull, \"onBeforeSendRequest\", {\n get: function () {\n return ChoicesRestful.onBeforeSendRequest;\n },\n set: function (val) {\n ChoicesRestful.onBeforeSendRequest = val;\n },\n enumerable: false,\n configurable: true\n });\n return ChoicesRestfull;\n}(ChoicesRestful));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"choicesByUrl\", [\n \"url\",\n \"path\",\n \"valueName\",\n \"titleName\",\n {\n name: \"imageLinkName\",\n visibleIf: function (obj) {\n return !!obj && !!obj.owner && obj.owner.getType() == \"imagepicker\";\n },\n },\n { name: \"allowEmptyResponse:boolean\", default: false },\n { name: \"attachOriginalItems:boolean\", default: false, visible: false },\n], function () {\n return new ChoicesRestful();\n});\n\n\n/***/ }),\n\n/***/ \"./src/conditionProcessValue.ts\":\n/*!**************************************!*\\\n !*** ./src/conditionProcessValue.ts ***!\n \\**************************************/\n/*! exports provided: ProcessValue */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ProcessValue\", function() { return ProcessValue; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n\nvar ProcessValue = /** @class */ (function () {\n function ProcessValue() {\n this.values = null;\n this.properties = null;\n }\n ProcessValue.prototype.getFirstName = function (text, obj) {\n if (obj === void 0) { obj = null; }\n if (!text)\n return text;\n var res = \"\";\n if (!!obj) {\n res = this.getFirstPropertyName(text, obj);\n if (!!res)\n return res;\n }\n for (var i = 0; i < text.length; i++) {\n var ch = text[i];\n if (ch == \".\" || ch == \"[\")\n break;\n res += ch;\n }\n return res;\n };\n ProcessValue.prototype.hasValue = function (text, values) {\n if (values === void 0) { values = null; }\n if (!values)\n values = this.values;\n var res = this.getValueCore(text, values);\n return res.hasValue;\n };\n ProcessValue.prototype.getValue = function (text, values) {\n if (values === void 0) { values = null; }\n if (!values)\n values = this.values;\n var res = this.getValueCore(text, values);\n return res.value;\n };\n ProcessValue.prototype.setValue = function (obj, text, value) {\n if (!text)\n return;\n var nonNestedObj = this.getNonNestedObject(obj, text, true);\n if (!nonNestedObj)\n return;\n obj = nonNestedObj.value;\n text = nonNestedObj.text;\n if (!!obj && !!text) {\n obj[text] = value;\n }\n };\n ProcessValue.prototype.getValueInfo = function (valueInfo) {\n if (!!valueInfo.path) {\n valueInfo.value = this.getValueFromPath(valueInfo.path, this.values);\n valueInfo.hasValue =\n valueInfo.value !== null && !_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(valueInfo.value);\n if (!valueInfo.hasValue &&\n valueInfo.path.length > 1 &&\n valueInfo.path[valueInfo.path.length - 1] == \"length\") {\n valueInfo.hasValue = true;\n valueInfo.value = 0;\n }\n return;\n }\n var res = this.getValueCore(valueInfo.name, this.values);\n valueInfo.value = res.value;\n valueInfo.hasValue = res.hasValue;\n valueInfo.path = res.hasValue ? res.path : null;\n };\n ProcessValue.prototype.getValueFromPath = function (path, values) {\n var index = 0;\n while (!!values && index < path.length) {\n var ind_name = path[index];\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isNumber(ind_name) &&\n Array.isArray(values) &&\n ind_name >= values.length)\n return null;\n values = values[ind_name];\n index++;\n }\n return values;\n };\n ProcessValue.prototype.getValueCore = function (text, values) {\n var res = { hasValue: false, value: null, path: null };\n var curValue = values;\n if (!curValue && curValue !== 0 && curValue !== false)\n return res;\n if (text &&\n text.lastIndexOf(\".length\") > -1 &&\n text.lastIndexOf(\".length\") === text.length - \".length\".length) {\n res.value = 0;\n res.hasValue = true;\n }\n var nonNestedObj = this.getNonNestedObject(curValue, text, false);\n if (!nonNestedObj)\n return res;\n res.path = nonNestedObj.path;\n res.value = !!nonNestedObj.text\n ? this.getObjectValue(nonNestedObj.value, nonNestedObj.text)\n : nonNestedObj.value;\n res.hasValue = !_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(res.value);\n return res;\n };\n ProcessValue.prototype.getNonNestedObject = function (obj, text, createPath) {\n var curName = this.getFirstPropertyName(text, obj, createPath);\n var path = !!curName ? [curName] : null;\n while (text != curName && !!obj) {\n var isArray = text[0] == \"[\";\n if (!isArray) {\n if (!curName && text == this.getFirstName(text))\n return { value: obj, text: text, path: path };\n obj = this.getObjectValue(obj, curName);\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(obj) && !createPath)\n return null;\n text = text.substr(curName.length);\n }\n else {\n var objInArray = this.getObjInArray(obj, text);\n if (!objInArray)\n return null;\n obj = objInArray.value;\n text = objInArray.text;\n path.push(objInArray.index);\n }\n if (!!text && text[0] == \".\") {\n text = text.substr(1);\n }\n curName = this.getFirstPropertyName(text, obj, createPath);\n if (!!curName) {\n path.push(curName);\n }\n }\n return { value: obj, text: text, path: path };\n };\n ProcessValue.prototype.getObjInArray = function (curValue, text) {\n if (!Array.isArray(curValue))\n return null;\n var index = 1;\n var str = \"\";\n while (index < text.length && text[index] != \"]\") {\n str += text[index];\n index++;\n }\n text = index < text.length ? text.substr(index + 1) : \"\";\n index = this.getIntValue(str);\n if (index < 0 || index >= curValue.length)\n return null;\n return { value: curValue[index], text: text, index: index };\n };\n ProcessValue.prototype.getFirstPropertyName = function (name, obj, createProp) {\n if (createProp === void 0) { createProp = false; }\n if (!name)\n return name;\n if (!obj)\n obj = {};\n if (obj.hasOwnProperty(name))\n return name;\n var nameInLow = name.toLowerCase();\n var A = nameInLow[0];\n var a = A.toUpperCase();\n for (var key in obj) {\n var first = key[0];\n if (first === a || first === A) {\n var keyName = key.toLowerCase();\n if (keyName == nameInLow)\n return key;\n if (nameInLow.length <= keyName.length)\n continue;\n var ch = nameInLow[keyName.length];\n if (ch != \".\" && ch != \"[\")\n continue;\n if (keyName == nameInLow.substr(0, keyName.length))\n return key;\n }\n }\n if (createProp && name[0] !== \"[\") {\n var ind = name.indexOf(\".\");\n if (ind > -1) {\n name = name.substr(0, ind);\n obj[name] = {};\n }\n return name;\n }\n return \"\";\n };\n ProcessValue.prototype.getObjectValue = function (obj, name) {\n if (!name)\n return null;\n return obj[name];\n };\n ProcessValue.prototype.getIntValue = function (str) {\n if (str == \"0\" || ((str | 0) > 0 && str % 1 == 0))\n return Number(str);\n return -1;\n };\n return ProcessValue;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/conditions.ts\":\n/*!***************************!*\\\n !*** ./src/conditions.ts ***!\n \\***************************/\n/*! exports provided: ExpressionRunnerBase, ConditionRunner, ExpressionRunner */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ExpressionRunnerBase\", function() { return ExpressionRunnerBase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ConditionRunner\", function() { return ConditionRunner; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ExpressionRunner\", function() { return ExpressionRunner; });\n/* harmony import */ var _conditionProcessValue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./conditionProcessValue */ \"./src/conditionProcessValue.ts\");\n/* harmony import */ var _conditionsParser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./conditionsParser */ \"./src/conditionsParser.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar ExpressionRunnerBase = /** @class */ (function () {\n function ExpressionRunnerBase(expression) {\n this.processValue = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_0__[\"ProcessValue\"]();\n this.parser = new _conditionsParser__WEBPACK_IMPORTED_MODULE_1__[\"ConditionsParser\"]();\n this.isAsyncValue = false;\n this.hasFunctionValue = false;\n this.expression = expression;\n }\n Object.defineProperty(ExpressionRunnerBase.prototype, \"expression\", {\n get: function () {\n return this.expressionValue;\n },\n set: function (value) {\n if (this.expression === value)\n return;\n this.expressionValue = value;\n this.operand = this.parser.parseExpression(value);\n this.hasFunctionValue = this.canRun() ? this.operand.hasFunction() : false;\n this.isAsyncValue = this.hasFunction()\n ? this.operand.hasAsyncFunction()\n : false;\n },\n enumerable: false,\n configurable: true\n });\n ExpressionRunnerBase.prototype.getVariables = function () {\n if (!this.operand)\n return [];\n var variables = [];\n this.operand.setVariables(variables);\n return variables;\n };\n ExpressionRunnerBase.prototype.hasFunction = function () {\n return this.hasFunctionValue;\n };\n Object.defineProperty(ExpressionRunnerBase.prototype, \"isAsync\", {\n get: function () {\n return this.isAsyncValue;\n },\n enumerable: false,\n configurable: true\n });\n ExpressionRunnerBase.prototype.canRun = function () {\n return !!this.operand;\n };\n ExpressionRunnerBase.prototype.runCore = function (values, properties) {\n var _this = this;\n if (properties === void 0) { properties = null; }\n if (!this.operand)\n return null;\n this.processValue.values = values;\n this.processValue.properties = properties;\n if (!this.isAsync)\n return this.runValues();\n this.asyncFuncList = [];\n this.operand.addToAsyncList(this.asyncFuncList);\n for (var i = 0; i < this.asyncFuncList.length; i++) {\n this.asyncFuncList[i].onAsyncReady = function () {\n _this.doAsyncFunctionReady();\n };\n }\n for (var i = 0; i < this.asyncFuncList.length; i++) {\n this.asyncFuncList[i].evaluateAsync(this.processValue);\n }\n return false;\n };\n ExpressionRunnerBase.prototype.doAsyncFunctionReady = function () {\n for (var i = 0; i < this.asyncFuncList.length; i++) {\n if (!this.asyncFuncList[i].isReady)\n return;\n }\n this.runValues();\n };\n ExpressionRunnerBase.prototype.runValues = function () {\n var res = this.operand.evaluate(this.processValue);\n this.doOnComplete(res);\n return res;\n };\n ExpressionRunnerBase.prototype.doOnComplete = function (res) { };\n return ExpressionRunnerBase;\n}());\n\nvar ConditionRunner = /** @class */ (function (_super) {\n __extends(ConditionRunner, _super);\n function ConditionRunner() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ConditionRunner.prototype.run = function (values, properties) {\n if (properties === void 0) { properties = null; }\n return this.runCore(values, properties) == true;\n };\n ConditionRunner.prototype.doOnComplete = function (res) {\n if (!!this.onRunComplete)\n this.onRunComplete(res == true);\n };\n return ConditionRunner;\n}(ExpressionRunnerBase));\n\nvar ExpressionRunner = /** @class */ (function (_super) {\n __extends(ExpressionRunner, _super);\n function ExpressionRunner() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ExpressionRunner.prototype.run = function (values, properties) {\n if (properties === void 0) { properties = null; }\n return this.runCore(values, properties);\n };\n ExpressionRunner.prototype.doOnComplete = function (res) {\n if (!!this.onRunComplete)\n this.onRunComplete(res);\n };\n return ExpressionRunner;\n}(ExpressionRunnerBase));\n\n\n\n/***/ }),\n\n/***/ \"./src/conditionsParser.ts\":\n/*!*********************************!*\\\n !*** ./src/conditionsParser.ts ***!\n \\*********************************/\n/*! exports provided: ConditionsParserError, ConditionsParser */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ConditionsParserError\", function() { return ConditionsParserError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ConditionsParser\", function() { return ConditionsParser; });\n/* harmony import */ var _expressions_expressionParser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./expressions/expressionParser */ \"./src/expressions/expressionParser.ts\");\n\nvar ConditionsParserError = /** @class */ (function () {\n function ConditionsParserError(at, code) {\n this.at = at;\n this.code = code;\n }\n return ConditionsParserError;\n}());\n\nvar ConditionsParser = /** @class */ (function () {\n function ConditionsParser() {\n }\n ConditionsParser.prototype.patchExpression = function (text) {\n return text\n .replace(/=>/g, \">=\")\n .replace(/=/g, \"!=\")\n .replace(/==/g, \"= \")\n .replace(/equals/g, \"equal \")\n .replace(/notequals/g, \"notequal \");\n };\n ConditionsParser.prototype.createCondition = function (text) {\n return this.parseExpression(text);\n };\n ConditionsParser.prototype.parseExpression = function (text) {\n try {\n var result = ConditionsParser.parserCache[text];\n if (result === undefined) {\n result = Object(_expressions_expressionParser__WEBPACK_IMPORTED_MODULE_0__[\"parse\"])(this.patchExpression(text));\n if (!result.hasAsyncFunction()) {\n ConditionsParser.parserCache[text] = result;\n }\n }\n return result;\n }\n catch (e) {\n if (e instanceof _expressions_expressionParser__WEBPACK_IMPORTED_MODULE_0__[\"SyntaxError\"]) {\n this.conditionError = new ConditionsParserError(e.location.start.offset, e.message);\n }\n }\n };\n Object.defineProperty(ConditionsParser.prototype, \"error\", {\n get: function () {\n return this.conditionError;\n },\n enumerable: false,\n configurable: true\n });\n ConditionsParser.parserCache = {};\n return ConditionsParser;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/defaultCss/cssbootstrap.ts\":\n/*!****************************************!*\\\n !*** ./src/defaultCss/cssbootstrap.ts ***!\n \\****************************************/\n/*! exports provided: defaultBootstrapCss */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defaultBootstrapCss\", function() { return defaultBootstrapCss; });\n/* harmony import */ var _cssstandard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cssstandard */ \"./src/defaultCss/cssstandard.ts\");\n\nvar defaultBootstrapCss = {\n root: \"sv_main sv_bootstrap_css\",\n container: \"sv_container\",\n header: \"panel-heading card-header\",\n body: \"panel-body card-block mt-4\",\n bodyEmpty: \"panel-body card-block mt-4 sv_body_empty\",\n footer: \"panel-footer card-footer\",\n title: \"\",\n description: \"\",\n logo: \"sv_logo\",\n logoImage: \"sv_logo__image\",\n headerText: \"sv_header__text\",\n navigationButton: \"\",\n completedPage: \"\",\n navigation: {\n complete: \"btn sv_complete_btn\",\n prev: \"btn sv_prev_btn\",\n next: \"btn sv_next_btn\",\n start: \"btn sv_start_btn\",\n preview: \"btn sv_preview_btn\",\n edit: \"btn sv_edit_btn\",\n },\n progress: \"progress center-block mx-auto mb-4\",\n progressBar: \"progress-bar\",\n progressTextUnderBar: \"sv-hidden\",\n progressButtonsContainerCenter: \"sv_progress-buttons__container-center\",\n progressButtonsContainer: \"sv_progress-buttons__container\",\n progressButtonsImageButtonLeft: \"sv_progress-buttons__image-button-left\",\n progressButtonsImageButtonRight: \"sv_progress-buttons__image-button-right\",\n progressButtonsImageButtonHidden: \"sv_progress-buttons__image-button--hidden\",\n progressButtonsListContainer: \"sv_progress-buttons__list-container\",\n progressButtonsList: \"sv_progress-buttons__list\",\n progressButtonsListElementPassed: \"sv_progress-buttons__list-element--passed\",\n progressButtonsListElementCurrent: \"sv_progress-buttons__list-element--current\",\n progressButtonsListElementNonClickable: \"sv_progress-buttons__list-element--nonclickable\",\n progressButtonsPageTitle: \"sv_progress-buttons__page-title\",\n progressButtonsPageDescription: \"sv_progress-buttons__page-description\",\n page: {\n root: \"\",\n title: \"\",\n description: \"small\",\n },\n pageTitle: \"\",\n pageDescription: \"small\",\n row: \"sv_row\",\n question: {\n mainRoot: \"sv_qstn\",\n flowRoot: \"sv_q_flow sv_qstn\",\n header: \"\",\n headerLeft: \"title-left\",\n content: \"\",\n contentLeft: \"content-left\",\n titleLeftRoot: \"sv_qstn_left\",\n title: \"\",\n titleExpandable: \"sv_q_title_expandable\",\n number: \"sv_q_num\",\n description: \"small\",\n descriptionUnderInput: \"small\",\n requiredText: \"sv_q_required_text\",\n comment: \"form-control\",\n required: \"\",\n titleRequired: \"\",\n hasError: \"has-error\",\n indent: 20,\n formGroup: \"form-group\",\n },\n panel: {\n title: \"sv_p_title\",\n titleExpandable: \"sv_p_title_expandable\",\n titleOnError: \"\",\n icon: \"sv_panel_icon\",\n iconExpanded: \"sv_expanded\",\n description: \"small sv_p_description\",\n container: \"sv_p_container\",\n footer: \"sv_p_footer\",\n number: \"sv_q_num\",\n requiredText: \"sv_q_required_text\",\n },\n error: {\n root: \"alert alert-danger\",\n icon: \"glyphicon glyphicon-exclamation-sign\",\n item: \"\",\n locationTop: \"sv_qstn_error_top\",\n locationBottom: \"sv_qstn_error_bottom\",\n },\n boolean: {\n root: \"sv_qbln form-inline checkbox\",\n item: \"sv-boolean\",\n control: \"sv-visuallyhidden\",\n itemChecked: \"sv-boolean--checked checked\",\n itemIndeterminate: \"sv-boolean--indeterminate\",\n itemDisabled: \"sv-boolean--disabled\",\n switch: \"sv-boolean__switch\",\n slider: \"sv-boolean__slider\",\n sliderText: \"sv-hidden\",\n label: \"sv-boolean__label \",\n disabledLabel: \"sv-boolean__label--disabled\",\n materialDecorator: \"sv-item__decorator sv-boolean__decorator \",\n itemDecorator: \"sv-item__svg sv-boolean__svg\",\n checkedPath: \"sv-boolean__checked-path\",\n uncheckedPath: \"sv-boolean__unchecked-path\",\n indeterminatePath: \"sv-boolean__indeterminate-path\",\n },\n checkbox: {\n root: \"sv_qcbc sv_qcbx form-inline\",\n item: \"checkbox\",\n itemChecked: \"checked\",\n itemSelectAll: \"sv_q_checkbox_selectall\",\n itemNone: \"sv_q_checkbox_none\",\n itemInline: \"sv_q_checkbox_inline\",\n itemControl: \"\",\n itemDecorator: \"sv-hidden\",\n label: \"\",\n labelChecked: \"\",\n controlLabel: \"\",\n materialDecorator: \"checkbox-material\",\n other: \"sv_q_checkbox_other form-control\",\n column: \"sv_q_select_column\",\n },\n ranking: {\n root: \"sv-ranking\",\n rootMobileMod: \"sv-ranking--mobile\",\n rootDragMod: \"sv-ranking--drag\",\n item: \"sv-ranking-item\",\n itemContent: \"sv-ranking-item__content\",\n itemIndex: \"sv-ranking-item__index\",\n // itemText: \"sv-ranking-item__text\",\n controlLabel: \"sv-ranking-item__text\",\n itemGhostNode: \"sv-ranking-item__ghost\",\n itemIconContainer: \"sv-ranking-item__icon-container\",\n itemIcon: \"sv-ranking-item__icon\",\n itemIconHoverMod: \"sv-ranking-item__icon--hover\",\n itemIconFocusMod: \"sv-ranking-item__icon--focus\",\n itemGhostMod: \"sv-ranking-item--ghost\",\n itemDragMod: \"sv-ranking-item--drag\",\n },\n comment: \"form-control\",\n dropdown: {\n root: \"\",\n control: \"form-control\",\n other: \"sv_q_dd_other form-control\",\n },\n html: { root: \"\" },\n image: { root: \"sv_q_image\", image: \"sv_image_image\" },\n matrix: {\n root: \"table sv_q_matrix\",\n label: \"sv_q_m_label\",\n itemChecked: \"checked\",\n itemDecorator: \"sv-hidden\",\n cellText: \"sv_q_m_cell_text\",\n cellTextSelected: \"sv_q_m_cell_selected bg-primary\",\n cellLabel: \"sv_q_m_cell_label\",\n },\n matrixdropdown: {\n root: \"table\",\n cell: \"sv_matrix_cell\",\n headerCell: \"sv_matrix_cell_header\",\n row: \"sv_matrix_row\",\n detailRow: \"sv_matrix_detail_row\",\n detailRowText: \"sv_matrix_cell_detail_rowtext\",\n detailCell: \"sv_matrix_cell_detail\",\n detailButton: \"sv_matrix_cell_detail_button\",\n detailButtonExpanded: \"sv_matrix_cell_detail_button_expanded\",\n detailIcon: \"sv_detail_panel_icon\",\n detailIconExpanded: \"sv_detail_expanded\",\n detailPanelCell: \"sv_matrix_cell_detail_panel\",\n actionsCell: \"sv_matrix_cell sv_matrix_cell_actions\",\n },\n matrixdynamic: {\n root: \"table\",\n button: \"button\",\n buttonAdd: \"\",\n buttonRemove: \"\",\n iconAdd: \"\",\n iconRemove: \"\",\n iconDrag: \"sv-matrixdynamic__drag-icon\",\n headerCell: \"sv_matrix_cell_header\",\n row: \"sv_matrix_row\",\n detailRow: \"sv_matrix_detail_row\",\n detailCell: \"sv_matrix_cell_detail\",\n detailButton: \"sv_matrix_cell_detail_button\",\n detailButtonExpanded: \"sv_matrix_cell_detail_button_expanded\",\n detailIcon: \"sv_detail_panel_icon\",\n detailIconExpanded: \"sv_detail_expanded\",\n detailPanelCell: \"sv_matrix_cell_detail_panel\",\n actionsCell: \"sv_matrix_cell sv_matrix_cell_actions\",\n emptyRowsSection: \"sv_matrix_empty_rows_section\",\n emptyRowsText: \"sv_matrix_empty_rows_text\",\n emptyRowsButton: \"\",\n },\n paneldynamic: {\n root: \"\",\n navigation: \"sv-paneldynamic__navigation\",\n progressTop: \"sv-paneldynamic__progress sv-paneldynamic__progress--top\",\n progressBottom: \"sv-paneldynamic__progress sv-paneldynamic__progress--bottom\",\n title: \"sv-title sv-question__title\",\n button: \"button\",\n buttonAdd: \"button sv-paneldynamic__add-btn\",\n buttonRemove: \"sv_p_remove_btn\",\n buttonRemoveRight: \"button sv-paneldynamic__remove-btn--right\",\n buttonPrev: \"sv-paneldynamic__prev-btn\",\n buttonNext: \"sv-paneldynamic__next-btn\",\n progressContainer: \"sv-paneldynamic__progress-container\",\n progress: \"sv-progress\",\n progressBar: \"sv-progress__bar\",\n progressText: \"sv-paneldynamic__progress-text\",\n panelWrapper: \"sv_p_wrapper\",\n panelWrapperInRow: \"sv_p_wrapper_in_row\",\n },\n multipletext: {\n root: \"table\",\n itemTitle: \"\",\n itemValue: \"sv_q_mt_item_value form-control\",\n },\n radiogroup: {\n root: \"sv_qcbc form-inline\",\n item: \"radio\",\n itemChecked: \"checked\",\n itemInline: \"sv_q_radiogroup_inline\",\n label: \"\",\n labelChecked: \"\",\n itemControl: \"\",\n itemDecorator: \"sv-hidden\",\n controlLabel: \"\",\n materialDecorator: \"circle\",\n other: \"sv_q_radiogroup_other form-control\",\n clearButton: \"sv_q_radiogroup_clear button\",\n column: \"sv_q_select_column\",\n },\n buttongroup: {\n root: \"sv-button-group\",\n item: \"sv-button-group__item\",\n itemIcon: \"sv-button-group__item-icon\",\n itemDecorator: \"sv-button-group__item-decorator\",\n itemCaption: \"sv-button-group__item-caption\",\n itemHover: \"sv-button-group__item--hover\",\n itemSelected: \"sv-button-group__item--selected\",\n itemDisabled: \"sv-button-group__item--disabled\",\n itemControl: \"sv-visuallyhidden\",\n },\n imagepicker: {\n root: \"sv_imgsel\",\n item: \"sv_q_imgsel\",\n itemChecked: \"checked\",\n itemInline: \"sv_q_imagepicker_inline\",\n label: \"sv_q_imgsel_label\",\n itemControl: \"sv_q_imgsel_control_item\",\n image: \"sv_q_imgsel_image\",\n itemText: \"sv_q_imgsel_text\",\n clearButton: \"sv_q_radiogroup_clear\",\n },\n rating: {\n root: \"btn-group\",\n item: \"btn btn-default btn-secondary\",\n selected: \"active\",\n minText: \"sv_q_rating_min_text\",\n itemText: \"sv_q_rating_item_text\",\n maxText: \"sv_q_rating_max_text\",\n disabled: \"\",\n },\n text: \"form-control\",\n expression: \"form-control\",\n file: {\n root: \"sv_q_file\",\n placeholderInput: \"sv_q_file_placeholder\",\n preview: \"sv_q_file_preview\",\n removeButton: \"sv_q_file_remove_button\",\n fileInput: \"sv_q_file_input\",\n removeFile: \"sv_q_file_remove\",\n removeFileSvg: \"sv-hidden\",\n fileDecorator: \"sv-hidden\",\n fileSignBottom: \"sv-hidden\",\n removeButtonBottom: \"sv-hidden\",\n },\n signaturepad: {\n root: \"sv_q_signaturepad sjs_sp_container\",\n controls: \"sjs_sp_controls\",\n placeholder: \"sjs_sp_placeholder\",\n clearButton: \"sjs_sp_clear\",\n },\n saveData: {\n root: \"\",\n saving: \"alert alert-info\",\n error: \"alert alert-danger\",\n success: \"alert alert-success\",\n saveAgainButton: \"\",\n },\n window: {\n root: \"modal-content\",\n body: \"modal-body\",\n header: {\n root: \"modal-header panel-title\",\n title: \"pull-left\",\n button: \"glyphicon pull-right\",\n buttonExpanded: \"glyphicon pull-right glyphicon-chevron-up\",\n buttonCollapsed: \"glyphicon pull-right glyphicon-chevron-down\",\n },\n },\n};\n_cssstandard__WEBPACK_IMPORTED_MODULE_0__[\"surveyCss\"][\"bootstrap\"] = defaultBootstrapCss;\n\n\n/***/ }),\n\n/***/ \"./src/defaultCss/cssbootstrapmaterial.ts\":\n/*!************************************************!*\\\n !*** ./src/defaultCss/cssbootstrapmaterial.ts ***!\n \\************************************************/\n/*! exports provided: defaultBootstrapMaterialCss */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defaultBootstrapMaterialCss\", function() { return defaultBootstrapMaterialCss; });\n/* harmony import */ var _cssstandard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cssstandard */ \"./src/defaultCss/cssstandard.ts\");\n\nvar defaultBootstrapMaterialCss = {\n root: \"sv_main sv_bootstrapmaterial_css\",\n container: \"sv_container\",\n header: \"card-heading\",\n body: \"card-body\",\n bodyEmpty: \"card-body sv_body_empty\",\n footer: \"card-footer\",\n title: \"\",\n description: \"\",\n logo: \"sv_logo\",\n logoImage: \"sv_logo__image\",\n headerText: \"sv_header__text\",\n navigationButton: \"\",\n completedPage: \"\",\n navigation: {\n complete: \"btn sv_complete_btn btn-primary\",\n prev: \"btn sv_prev_btn btn-primary\",\n next: \"btn sv_next_btn btn-primary\",\n start: \"btn sv_start_btn btn-primary\",\n preview: \"btn sv_preview_btn btn-primary\",\n edit: \"btn sv_edit_btn btn-primary\",\n },\n progress: \"progress center-block mx-auto mb-4\",\n progressBar: \"progress-bar\",\n progressTextUnderBar: \"sv-hidden\",\n progressButtonsContainerCenter: \"sv_progress-buttons__container-center\",\n progressButtonsContainer: \"sv_progress-buttons__container\",\n progressButtonsImageButtonLeft: \"sv_progress-buttons__image-button-left\",\n progressButtonsImageButtonRight: \"sv_progress-buttons__image-button-right\",\n progressButtonsImageButtonHidden: \"sv_progress-buttons__image-button--hidden\",\n progressButtonsListContainer: \"sv_progress-buttons__list-container\",\n progressButtonsList: \"sv_progress-buttons__list\",\n progressButtonsListElementPassed: \"sv_progress-buttons__list-element--passed\",\n progressButtonsListElementCurrent: \"sv_progress-buttons__list-element--current\",\n progressButtonsListElementNonClickable: \"sv_progress-buttons__list-element--nonclickable\",\n progressButtonsPageTitle: \"sv_progress-buttons__page-title\",\n progressButtonsPageDescription: \"sv_progress-buttons__page-description\",\n page: {\n root: \"\",\n title: \"\",\n description: \"small\",\n },\n pageTitle: \"\",\n pageDescription: \"small\",\n row: \"sv_row\",\n question: {\n mainRoot: \"sv_qstn form-group bmd-form-group\",\n flowRoot: \"sv_q_flow form-group bmd-form-group\",\n header: \"\",\n headerLeft: \"title-left\",\n content: \"\",\n contentLeft: \"content-left\",\n titleLeftRoot: \"sv_qstn_left\",\n requiredText: \"sv_q_required_text\",\n title: \"\",\n titleExpandable: \"sv_q_title_expandable\",\n number: \"sv_q_num\",\n description: \"small\",\n descriptionUnderInput: \"small\",\n comment: \"form-control\",\n required: \"\",\n titleRequired: \"\",\n hasError: \"has-error\",\n indent: 20,\n formGroup: \"form-group bmd-form-group\",\n },\n panel: {\n title: \"sv_p_title\",\n titleExpandable: \"sv_p_title_expandable\",\n titleOnError: \"\",\n icon: \"sv_panel_icon\",\n iconExpanded: \"sv_expanded\",\n description: \"small sv_p_description\",\n container: \"sv_p_container\",\n footer: \"sv_p_footer\",\n number: \"sv_q_num\",\n requiredText: \"sv_q_required_text\",\n },\n error: {\n root: \"alert alert-danger\",\n icon: \"glyphicon glyphicon-exclamation-sign\",\n item: \"\",\n locationTop: \"sv_qstn_error_top\",\n locationBottom: \"sv_qstn_error_bottom\",\n },\n boolean: {\n root: \"sv_qbln checkbox\",\n item: \"sv-boolean\",\n control: \"sv-visuallyhidden\",\n itemChecked: \"sv-boolean--checked checked\",\n itemIndeterminate: \"sv-boolean--indeterminate\",\n itemDisabled: \"sv-boolean--disabled\",\n switch: \"sv-boolean__switch\",\n slider: \"sv-boolean__slider\",\n sliderText: \"sv-hidden\",\n label: \"sv-boolean__label \",\n disabledLabel: \"sv-boolean__label--disabled\",\n materialDecorator: \"sv-item__decorator sv-boolean__decorator \",\n itemDecorator: \"sv-item__svg sv-boolean__svg\",\n checkedPath: \"sv-boolean__checked-path\",\n uncheckedPath: \"sv-boolean__unchecked-path\",\n indeterminatePath: \"sv-boolean__indeterminate-path\",\n },\n checkbox: {\n root: \"sv_qcbx\",\n item: \"checkbox\",\n itemChecked: \"checked\",\n itemSelectAll: \"sv_q_checkbox_selectall\",\n itemNone: \"sv_q_checkbox_none\",\n itemInline: \"sv_q_checkbox_inline\",\n itemDecorator: \"sv-hidden\",\n itemControl: \"\",\n label: \"\",\n labelChecked: \"\",\n controlLabel: \"\",\n materialDecorator: \"checkbox-decorator\",\n other: \"sv_q_checkbox_other form-control\",\n column: \"sv_q_select_column\",\n },\n ranking: {\n root: \"sv-ranking\",\n rootMobileMod: \"sv-ranking--mobile\",\n rootDragMod: \"sv-ranking--drag\",\n item: \"sv-ranking-item\",\n itemContent: \"sv-ranking-item__content\",\n itemIndex: \"sv-ranking-item__index\",\n // itemText: \"sv-ranking-item__text\",\n controlLabel: \"sv-ranking-item__text\",\n itemGhostNode: \"sv-ranking-item__ghost\",\n itemIconContainer: \"sv-ranking-item__icon-container\",\n itemIcon: \"sv-ranking-item__icon\",\n itemIconHoverMod: \"sv-ranking-item__icon--hover\",\n itemIconFocusMod: \"sv-ranking-item__icon--focus\",\n itemGhostMod: \"sv-ranking-item--ghost\",\n itemDragMod: \"sv-ranking-item--drag\",\n },\n comment: \"form-control\",\n dropdown: {\n root: \"\",\n control: \"form-control\",\n other: \"sv_q_dd_other form-control\",\n },\n html: { root: \"\" },\n image: { root: \"sv_q_image\", image: \"sv_image_image\" },\n matrix: {\n root: \"table sv_q_matrix\",\n row: \"form-group bmd-form-group\",\n label: \"sv_q_m_label radio-inline\",\n cellText: \"sv_q_m_cell_text\",\n cellTextSelected: \"sv_q_m_cell_selected bg-primary\",\n cellLabel: \"sv_q_m_cell_label\",\n itemValue: \"form-control\",\n itemChecked: \"checked\",\n itemDecorator: \"sv-hidden\",\n materialDecorator: \"bmd-radio\",\n },\n matrixdropdown: {\n root: \"table\",\n itemValue: \"form-group bmd-form-group\",\n headerCell: \"sv_matrix_cell_header\",\n row: \"sv_matrix_row\",\n detailRow: \"sv_matrix_detail_row\",\n detailRowText: \"sv_matrix_cell_detail_rowtext\",\n detailCell: \"sv_matrix_cell_detail\",\n detailButton: \"sv_matrix_cell_detail_button\",\n detailButtonExpanded: \"sv_matrix_cell_detail_button_expanded\",\n detailIcon: \"sv_detail_panel_icon\",\n detailIconExpanded: \"sv_detail_expanded\",\n detailPanelCell: \"sv_matrix_cell_detail_panel\",\n actionsCell: \"sv_matrix_cell sv_matrix_cell_actions\",\n },\n matrixdynamic: {\n mainRoot: \"sv_qstn\",\n flowRoot: \"sv_q_flow\",\n root: \"table\",\n button: \"btn btn-primary\",\n itemValue: \"form-group bmd-form-group\",\n buttonAdd: \"\",\n buttonRemove: \"\",\n iconAdd: \"\",\n iconRemove: \"\",\n iconDrag: \"sv-matrixdynamic__drag-icon\",\n headerCell: \"sv_matrix_cell_header\",\n row: \"sv_matrix_row\",\n detailRow: \"sv_matrix_detail_row\",\n detailCell: \"sv_matrix_cell_detail\",\n detailButton: \"sv_matrix_cell_detail_button\",\n detailButtonExpanded: \"sv_matrix_cell_detail_button_expanded\",\n detailIcon: \"sv_detail_panel_icon\",\n detailIconExpanded: \"sv_detail_expanded\",\n detailPanelCell: \"sv_matrix_cell_detail_panel\",\n actionsCell: \"sv_matrix_cell sv_matrix_cell_actions\",\n emptyRowsSection: \"sv_matrix_empty_rows_section\",\n emptyRowsText: \"sv_matrix_empty_rows_text\",\n emptyRowsButton: \"\",\n },\n paneldynamic: {\n root: \"\",\n navigation: \"sv-paneldynamic__navigation\",\n progressTop: \"sv-paneldynamic__progress sv-paneldynamic__progress--top\",\n progressBottom: \"sv-paneldynamic__progress sv-paneldynamic__progress--bottom\",\n title: \"sv-title sv-question__title\",\n button: \"button\",\n buttonAdd: \"button sv-paneldynamic__add-btn btn btn-primary\",\n buttonRemove: \"button sv-paneldynamic__remove-btn btn btn-primary\",\n buttonRemoveRight: \"sv-paneldynamic__remove-btn--right\",\n buttonPrev: \"sv-paneldynamic__prev-btn\",\n buttonNext: \"sv-paneldynamic__next-btn\",\n progressContainer: \"sv-paneldynamic__progress-container\",\n progress: \"sv-progress\",\n progressBar: \"sv-progress__bar\",\n progressText: \"sv-paneldynamic__progress-text\",\n panelWrapper: \"sv_p_wrapper\",\n panelWrapperInRow: \"sv_p_wrapper_in_row\",\n },\n multipletext: {\n root: \"table\",\n itemTitle: \"\",\n row: \"form-group bmd-form-group\",\n itemValue: \"sv_q_mt_item_value form-control\",\n },\n radiogroup: {\n root: \"\",\n item: \"radio\",\n itemChecked: \"checked\",\n itemInline: \"sv_q_radiogroup_inline\",\n itemDecorator: \"sv-hidden\",\n label: \"\",\n labelChecked: \"\",\n itemControl: \"\",\n controlLabel: \"sv_q_radiogroup_control_label\",\n materialDecorator: \"bmd-radio\",\n other: \"sv_q_radiogroup_other form-control\",\n clearButton: \"sv_q_radiogroup_clear button btn btn-primary\",\n column: \"sv_q_select_column\",\n },\n buttongroup: {\n root: \"sv-button-group\",\n item: \"sv-button-group__item\",\n itemIcon: \"sv-button-group__item-icon\",\n itemDecorator: \"sv-button-group__item-decorator\",\n itemCaption: \"sv-button-group__item-caption\",\n itemSelected: \"sv-button-group__item--selected\",\n itemHover: \"sv-button-group__item--hover\",\n itemDisabled: \"sv-button-group__item--disabled\",\n itemControl: \"sv-visuallyhidden\",\n },\n imagepicker: {\n root: \"sv_imgsel\",\n item: \"sv_q_imgsel\",\n itemChecked: \"checked\",\n itemInline: \"sv_q_imagepicker_inline\",\n label: \"sv_q_imgsel_label\",\n itemControl: \"sv_q_imgsel_control_item\",\n image: \"sv_q_imgsel_image\",\n itemText: \"sv_q_imgsel_text\",\n clearButton: \"sv_q_radiogroup_clear\",\n },\n rating: {\n root: \"btn-group\",\n item: \"btn btn-default btn-secondary\",\n selected: \"active\",\n minText: \"sv_q_rating_min_text\",\n itemText: \"sv_q_rating_item_text\",\n maxText: \"sv_q_rating_max_text\",\n disabled: \"\",\n },\n text: \"form-control\",\n expression: \"form-control\",\n file: {\n root: \"form-group bmd-form-group is-fileinput sv_q_file\",\n placeholderInput: \"\",\n preview: \"sv_q_file_preview\",\n removeButton: \"sv_q_file_remove_button\",\n fileInput: \"sv_q_file_input\",\n removeFile: \"sv_q_file_remove\",\n removeFileSvg: \"sv-hidden\",\n fileDecorator: \"sv-hidden\",\n fileSignBottom: \"sv-hidden\",\n removeButtonBottom: \"sv-hidden\",\n },\n signaturepad: {\n root: \"sv_q_signaturepad sjs_sp_container\",\n controls: \"sjs_sp_controls\",\n placeholder: \"sjs_sp_placeholder\",\n clearButton: \"sjs_sp_clear\",\n },\n saveData: {\n root: \"\",\n saving: \"alert alert-info\",\n error: \"alert alert-danger\",\n success: \"alert alert-success\",\n saveAgainButton: \"\",\n },\n window: {\n root: \"modal-content\",\n body: \"modal-body\",\n header: {\n root: \"modal-header card-title\",\n title: \"pull-left\",\n button: \"glyphicon pull-right\",\n buttonExpanded: \"glyphicon pull-right glyphicon-chevron-up\",\n buttonCollapsed: \"glyphicon pull-right glyphicon-chevron-down\",\n },\n },\n};\n_cssstandard__WEBPACK_IMPORTED_MODULE_0__[\"surveyCss\"][\"bootstrapmaterial\"] = defaultBootstrapMaterialCss;\n\n\n/***/ }),\n\n/***/ \"./src/defaultCss/cssmodern.ts\":\n/*!*************************************!*\\\n !*** ./src/defaultCss/cssmodern.ts ***!\n \\*************************************/\n/*! exports provided: modernCss */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"modernCss\", function() { return modernCss; });\n/* harmony import */ var _cssstandard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cssstandard */ \"./src/defaultCss/cssstandard.ts\");\n\nvar modernCss = {\n root: \"sv-root-modern\",\n container: \"sv-container-modern\",\n header: \"sv-title sv-container-modern__title\",\n body: \"sv-body\",\n bodyEmpty: \"sv-body sv-body--empty\",\n footer: \"sv-footer sv-body__footer sv-clearfix\",\n title: \"\",\n description: \"\",\n logo: \"sv-logo\",\n logoImage: \"sv-logo__image\",\n headerText: \"sv-header__text\",\n navigationButton: \"\",\n completedPage: \"sv-completedpage\",\n navigation: {\n complete: \"sv-btn sv-footer__complete-btn\",\n prev: \"sv-btn sv-footer__prev-btn\",\n next: \"sv-btn sv-footer__next-btn\",\n start: \"sv-btn sv-footer__start-btn\",\n preview: \"sv-btn sv-footer__preview-btn\",\n edit: \"sv-btn sv-footer__edit-btn\",\n },\n panel: {\n title: \"sv-title sv-panel__title\",\n titleExpandable: \"sv-panel__title--expandable\",\n titleOnError: \"sv-panel__title--error\",\n description: \"sv-description sv-panel__description\",\n container: \"sv-panel sv-row__panel\",\n content: \"sv-panel__content\",\n icon: \"sv-panel__icon\",\n iconExpanded: \"sv-panel__icon--expanded\",\n footer: \"sv-panel__footer\",\n requiredText: \"sv-panel__required-text\",\n number: \"sv-question__num\",\n },\n paneldynamic: {\n root: \"sv-paneldynamic\",\n navigation: \"sv-paneldynamic__navigation\",\n title: \"sv-title sv-question__title\",\n button: \"sv-btn\",\n buttonRemove: \"sv-paneldynamic__remove-btn\",\n buttonRemoveRight: \"sv-paneldynamic__remove-btn--right\",\n buttonAdd: \"sv-paneldynamic__add-btn\",\n progressTop: \"sv-paneldynamic__progress sv-paneldynamic__progress--top\",\n progressBottom: \"sv-paneldynamic__progress sv-paneldynamic__progress--bottom\",\n buttonPrev: \"sv-paneldynamic__prev-btn\",\n buttonNext: \"sv-paneldynamic__next-btn\",\n progressContainer: \"sv-paneldynamic__progress-container\",\n progress: \"sv-progress\",\n progressBar: \"sv-progress__bar\",\n progressText: \"sv-paneldynamic__progress-text\",\n separator: \"sv-paneldynamic__separator\",\n panelWrapper: \"sv-paneldynamic__panel-wrapper\",\n panelWrapperInRow: \"sv-paneldynamic__panel-wrapper--in-row\",\n },\n progress: \"sv-progress sv-body__progress\",\n progressBar: \"sv-progress__bar\",\n progressText: \"sv-progress__text\",\n progressTextInBar: \"sv-hidden\",\n progressButtonsContainerCenter: \"sv_progress-buttons__container-center\",\n progressButtonsContainer: \"sv_progress-buttons__container\",\n progressButtonsImageButtonLeft: \"sv_progress-buttons__image-button-left\",\n progressButtonsImageButtonRight: \"sv_progress-buttons__image-button-right\",\n progressButtonsImageButtonHidden: \"sv_progress-buttons__image-button--hidden\",\n progressButtonsListContainer: \"sv_progress-buttons__list-container\",\n progressButtonsList: \"sv_progress-buttons__list\",\n progressButtonsListElementPassed: \"sv_progress-buttons__list-element--passed\",\n progressButtonsListElementCurrent: \"sv_progress-buttons__list-element--current\",\n progressButtonsListElementNonClickable: \"sv_progress-buttons__list-element--nonclickable\",\n progressButtonsPageTitle: \"sv_progress-buttons__page-title\",\n progressButtonsPageDescription: \"sv_progress-buttons__page-description\",\n page: {\n root: \"sv-page sv-body__page\",\n title: \"sv-title sv-page__title\",\n description: \"sv-description sv-page__description\",\n },\n pageTitle: \"sv-title sv-page__title\",\n pageDescription: \"sv-description sv-page__description\",\n row: \"sv-row sv-clearfix\",\n question: {\n mainRoot: \"sv-question sv-row__question\",\n flowRoot: \"sv-question sv-row__question sv-row__question--flow\",\n asCell: \"sv-table__cell\",\n header: \"sv-question__header\",\n headerLeft: \"sv-question__header--location--left\",\n headerTop: \"sv-question__header--location--top\",\n headerBottom: \"sv-question__header--location--bottom\",\n content: \"sv-question__content\",\n contentLeft: \"sv-question__content--left\",\n titleLeftRoot: \"\",\n titleOnAnswer: \"sv-question__title--answer\",\n titleOnError: \"sv-question__title--error\",\n title: \"sv-title sv-question__title\",\n titleExpandable: \"sv-question__title--expandable\",\n icon: \"sv-question__icon\",\n iconExpanded: \"sv-question__icon--expanded\",\n requiredText: \"sv-question__required-text\",\n number: \"sv-question__num\",\n description: \"sv-description sv-question__description\",\n descriptionUnderInput: \"sv-description sv-question__description\",\n comment: \"sv-comment\",\n required: \"sv-question--required\",\n titleRequired: \"sv-question__title--required\",\n indent: 20,\n footer: \"sv-question__footer\",\n formGroup: \"sv-question__form-group\",\n hasError: \"\",\n disabled: \"sv-question--disabled\",\n },\n image: { root: \"sv-image\", image: \"sv_image_image\" },\n error: {\n root: \"sv-question__erbox\",\n icon: \"\",\n item: \"\",\n locationTop: \"sv-question__erbox--location--top\",\n locationBottom: \"sv-question__erbox--location--bottom\",\n },\n checkbox: {\n root: \"sv-selectbase\",\n item: \"sv-item sv-checkbox sv-selectbase__item\",\n itemSelectAll: \"sv-checkbox--selectall\",\n itemNone: \"sv-checkbox--none\",\n itemDisabled: \"sv-item--disabled sv-checkbox--disabled\",\n itemChecked: \"sv-checkbox--checked\",\n itemHover: \"sv-checkbox--allowhover\",\n itemInline: \"sv-selectbase__item--inline\",\n label: \"sv-selectbase__label\",\n labelChecked: \"\",\n itemControl: \"sv-visuallyhidden sv-item__control\",\n itemDecorator: \"sv-item__svg sv-checkbox__svg\",\n controlLabel: \"sv-item__control-label\",\n materialDecorator: \"sv-item__decorator sv-checkbox__decorator\",\n other: \"sv-comment sv-question__other\",\n column: \"sv-selectbase__column\",\n },\n ranking: {\n root: \"sv-ranking\",\n rootMobileMod: \"sv-ranking--mobile\",\n rootDragMod: \"sv-ranking--drag\",\n item: \"sv-ranking-item\",\n itemContent: \"sv-ranking-item__content\",\n itemIndex: \"sv-ranking-item__index\",\n // itemText: \"sv-ranking-item__text\",\n controlLabel: \"sv-ranking-item__text\",\n itemGhostNode: \"sv-ranking-item__ghost\",\n itemIconContainer: \"sv-ranking-item__icon-container\",\n itemIcon: \"sv-ranking-item__icon\",\n itemIconHoverMod: \"sv-ranking-item__icon--hover\",\n itemIconFocusMod: \"sv-ranking-item__icon--focus\",\n itemGhostMod: \"sv-ranking-item--ghost\",\n itemDragMod: \"sv-ranking-item--drag\",\n },\n radiogroup: {\n root: \"sv-selectbase\",\n item: \"sv-item sv-radio sv-selectbase__item\",\n itemInline: \"sv-selectbase__item--inline\",\n label: \"sv-selectbase__label\",\n labelChecked: \"\",\n itemDisabled: \"sv-item--disabled sv-radio--disabled\",\n itemChecked: \"sv-radio--checked\",\n itemHover: \"sv-radio--allowhover\",\n itemControl: \"sv-visuallyhidden sv-item__control\",\n itemDecorator: \"sv-item__svg sv-radio__svg\",\n controlLabel: \"sv-item__control-label\",\n materialDecorator: \"sv-item__decorator sv-radio__decorator\",\n other: \"sv-comment sv-question__other\",\n clearButton: \"sv-btn sv-selectbase__clear-btn\",\n column: \"sv-selectbase__column\",\n },\n buttongroup: {\n root: \"sv-button-group\",\n item: \"sv-button-group__item\",\n itemIcon: \"sv-button-group__item-icon\",\n itemDecorator: \"sv-button-group__item-decorator\",\n itemCaption: \"sv-button-group__item-caption\",\n itemSelected: \"sv-button-group__item--selected\",\n itemHover: \"sv-button-group__item--hover\",\n itemDisabled: \"sv-button-group__item--disabled\",\n itemControl: \"sv-visuallyhidden\",\n },\n boolean: {\n root: \"sv_qbln\",\n small: \"sv-row__question--small\",\n item: \"sv-boolean sv-item\",\n control: \"sv-visuallyhidden\",\n itemChecked: \"sv-boolean--checked\",\n itemIndeterminate: \"sv-boolean--indeterminate\",\n itemDisabled: \"sv-item--disabled sv-boolean--disabled\",\n switch: \"sv-boolean__switch\",\n slider: \"sv-boolean__slider\",\n sliderText: \"sv-hidden\",\n label: \"sv-boolean__label \",\n disabledLabel: \"sv-boolean__label--disabled\",\n materialDecorator: \"sv-item__decorator sv-boolean__decorator \",\n itemDecorator: \"sv-item__svg sv-boolean__svg\",\n checkedPath: \"sv-boolean__checked-path\",\n uncheckedPath: \"sv-boolean__unchecked-path\",\n indeterminatePath: \"sv-boolean__indeterminate-path\",\n },\n text: {\n root: \"sv-text\",\n small: \"sv-row__question--small\",\n onError: \"sv-text--error\",\n },\n multipletext: {\n root: \"sv-multipletext\",\n item: \"sv-multipletext__item\",\n itemTitle: \"sv-multipletext__item-title\",\n row: \"sv-multipletext__row\",\n cell: \"sv-multipletext__cell\",\n },\n dropdown: {\n root: \"\",\n small: \"sv-row__question--small\",\n control: \"sv-dropdown\",\n selectWrapper: \"\",\n other: \"sv-comment sv-question__other\",\n onError: \"sv-dropdown--error\",\n },\n imagepicker: {\n root: \"sv-imagepicker\",\n item: \"sv-imagepicker__item\",\n itemInline: \"sv-imagepicker__item--inline\",\n itemChecked: \"sv-imagepicker__item--checked\",\n itemDisabled: \"sv-imagepicker__item--disabled\",\n itemHover: \"sv-imagepicker__item--allowhover\",\n label: \"sv-imagepicker__label\",\n itemControl: \"sv-imagepicker__control\",\n image: \"sv-imagepicker__image\",\n itemText: \"sv-imagepicker__text\",\n clearButton: \"sv-btn\",\n other: \"sv-comment sv-question__other\",\n },\n matrix: {\n tableWrapper: \"sv-matrix\",\n root: \"sv-table sv-matrix-root\",\n rowError: \"sv-matrix__row--error\",\n cell: \"sv-table__cell sv-matrix__cell\",\n headerCell: \"sv-table__cell sv-table__cell--header\",\n label: \"sv-item sv-radio sv-matrix__label\",\n itemValue: \"sv-visuallyhidden sv-item__control sv-radio__control\",\n itemChecked: \"sv-radio--checked\",\n itemDisabled: \"sv-item--disabled sv-radio--disabled\",\n itemHover: \"sv-radio--allowhover\",\n materialDecorator: \"sv-item__decorator sv-radio__decorator\",\n itemDecorator: \"sv-item__svg sv-radio__svg\",\n cellText: \"sv-matrix__text\",\n cellTextSelected: \"sv-matrix__text--checked\",\n cellTextDisabled: \"sv-matrix__text--disabled\",\n },\n matrixdropdown: {\n root: \"sv-table sv-matrixdropdown\",\n cell: \"sv-table__cell\",\n headerCell: \"sv-table__cell sv-table__cell--header\",\n row: \"sv-table__row\",\n detailRow: \"sv-table__row sv-table__row--detail\",\n detailRowText: \"sv-table__cell--detail-rowtext\",\n detailCell: \"sv-table__cell--detail\",\n choiceCell: \"sv-table__cell--choice\",\n detailButton: \"sv-table__cell--detail-button\",\n detailButtonExpanded: \"sv-table__cell--detail-button--expanded\",\n detailIcon: \"sv-detail-panel__icon\",\n detailIconExpanded: \"sv-detail-panel__icon--expanded\",\n detailPanelCell: \"sv-table__cell--detail-panel\",\n actionsCell: \"sv-table__cell sv-table__cell--actions\",\n },\n matrixdynamic: {\n root: \"sv-table sv-matrixdynamic\",\n cell: \"sv-table__cell\",\n headerCell: \"sv-table__cell sv-table__cell--header\",\n button: \"sv-btn\",\n buttonAdd: \"sv-matrixdynamic__add-btn\",\n buttonRemove: \"sv-matrixdynamic__remove-btn\",\n iconAdd: \"\",\n iconRemove: \"\",\n iconDrag: \"sv-matrixdynamic__drag-icon\",\n row: \"sv-table__row\",\n detailRow: \"sv-table__row sv-table__row--detail\",\n detailCell: \"sv-table__cell--detail\",\n choiceCell: \"sv-table__cell--choice\",\n detailButton: \"sv-table__cell--detail-button\",\n detailButtonExpanded: \"sv-table__cell--detail-button--expanded\",\n detailIcon: \"sv-detail-panel__icon\",\n detailIconExpanded: \"sv-detail-panel__icon--expanded\",\n detailPanelCell: \"sv-table__cell--detail-panel\",\n actionsCell: \"sv-table__cell sv-table__cell--actions\",\n emptyRowsSection: \"sv-table__empty--rows--section\",\n emptyRowsText: \"sv-table__empty--rows--text\",\n emptyRowsButton: \"\",\n },\n rating: {\n root: \"sv-rating\",\n item: \"sv-rating__item\",\n selected: \"sv-rating__item--selected\",\n minText: \"sv-rating__min-text\",\n itemText: \"sv-rating__item-text\",\n maxText: \"sv-rating__max-text\",\n itemDisabled: \"sv-rating--disabled\",\n },\n comment: {\n root: \"sv-comment\",\n small: \"sv-row__question--small\",\n },\n expression: \"\",\n file: {\n root: \"sv-file\",\n other: \"sv-comment sv-question__other\",\n placeholderInput: \"sv-visuallyhidden\",\n preview: \"sv-file__preview\",\n fileSign: \"sv-hidden\",\n fileSignBottom: \"sv-file__sign\",\n fileDecorator: \"sv-file__decorator\",\n fileInput: \"sv-visuallyhidden\",\n noFileChosen: \"sv-description sv-file__no-file-chosen\",\n chooseFile: \"sv-btn sv-file__choose-btn\",\n controlDisabled: \"sv-file__choose-btn--disabled\",\n removeButton: \"sv-hidden\",\n removeButtonBottom: \"sv-btn sv-file__clean-btn\",\n removeFile: \"sv-hidden\",\n removeFileSvg: \"sv-file__remove-svg\",\n wrapper: \"sv-file__wrapper\",\n },\n signaturepad: {\n root: \"sv-signaturepad sjs_sp_container\",\n small: \"sv-row__question--small\",\n controls: \"sjs_sp_controls\",\n placeholder: \"sjs_sp_placeholder\",\n clearButton: \"sjs_sp_clear\",\n },\n saveData: {\n root: \"\",\n saving: \"\",\n error: \"\",\n success: \"\",\n saveAgainButton: \"\",\n },\n window: {\n root: \"sv_window\",\n body: \"sv_window_content\",\n header: {\n root: \"sv_window_title\",\n title: \"\",\n button: \"\",\n buttonExpanded: \"\",\n buttonCollapsed: \"\",\n },\n },\n};\n_cssstandard__WEBPACK_IMPORTED_MODULE_0__[\"surveyCss\"][\"modern\"] = modernCss;\n\n\n/***/ }),\n\n/***/ \"./src/defaultCss/cssstandard.ts\":\n/*!***************************************!*\\\n !*** ./src/defaultCss/cssstandard.ts ***!\n \\***************************************/\n/*! exports provided: surveyCss, defaultStandardCss */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"surveyCss\", function() { return surveyCss; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"defaultStandardCss\", function() { return defaultStandardCss; });\nvar surveyCss = {\n currentType: \"\",\n getCss: function () {\n var loc = this.currentType ? this[this.currentType] : defaultStandardCss;\n if (!loc)\n loc = defaultStandardCss;\n return loc;\n },\n};\nvar defaultStandardCss = {\n root: \"sv_main sv_default_css\",\n container: \"sv_container\",\n header: \"sv_header\",\n body: \"sv_body\",\n bodyEmpty: \"sv_body sv_body_empty\",\n footer: \"sv_nav\",\n title: \"\",\n description: \"\",\n logo: \"sv_logo\",\n logoImage: \"sv_logo__image\",\n headerText: \"sv_header__text\",\n navigationButton: \"\",\n completedPage: \"sv_completed_page\",\n navigation: {\n complete: \"sv_complete_btn\",\n prev: \"sv_prev_btn\",\n next: \"sv_next_btn\",\n start: \"sv_start_btn\",\n preview: \"sv_preview_btn\",\n edit: \"sv_edit_btn\",\n },\n progress: \"sv_progress\",\n progressBar: \"sv_progress_bar\",\n progressTextInBar: \"sv-hidden\",\n progressButtonsContainerCenter: \"sv_progress-buttons__container-center\",\n progressButtonsContainer: \"sv_progress-buttons__container\",\n progressButtonsImageButtonLeft: \"sv_progress-buttons__image-button-left\",\n progressButtonsImageButtonRight: \"sv_progress-buttons__image-button-right\",\n progressButtonsImageButtonHidden: \"sv_progress-buttons__image-button--hidden\",\n progressButtonsListContainer: \"sv_progress-buttons__list-container\",\n progressButtonsList: \"sv_progress-buttons__list\",\n progressButtonsListElementPassed: \"sv_progress-buttons__list-element--passed\",\n progressButtonsListElementCurrent: \"sv_progress-buttons__list-element--current\",\n progressButtonsListElementNonClickable: \"sv_progress-buttons__list-element--nonclickable\",\n progressButtonsPageTitle: \"sv_progress-buttons__page-title\",\n progressButtonsPageDescription: \"sv_progress-buttons__page-description\",\n page: {\n root: \"sv_p_root\",\n title: \"sv_page_title\",\n description: \"\",\n },\n // TODO: move to the page object\n pageTitle: \"sv_page_title\",\n pageDescription: \"\",\n row: \"sv_row\",\n question: {\n mainRoot: \"sv_q sv_qstn\",\n flowRoot: \"sv_q_flow sv_qstn\",\n header: \"\",\n headerLeft: \"title-left\",\n content: \"\",\n contentLeft: \"content-left\",\n titleLeftRoot: \"sv_qstn_left\",\n requiredText: \"sv_q_required_text\",\n title: \"sv_q_title\",\n titleExpandable: \"sv_q_title_expandable\",\n number: \"sv_q_num\",\n description: \"sv_q_description\",\n comment: \"\",\n required: \"\",\n titleRequired: \"\",\n hasError: \"\",\n indent: 20,\n footer: \"sv_q_footer\",\n formGroup: \"form-group\",\n asCell: \"sv_matrix_cell\",\n icon: \"sv_question_icon\",\n iconExpanded: \"sv_expanded\",\n disabled: \"sv_q--disabled\",\n },\n panel: {\n title: \"sv_p_title\",\n titleExpandable: \"sv_p_title_expandable\",\n titleOnError: \"\",\n icon: \"sv_panel_icon\",\n iconExpanded: \"sv_expanded\",\n description: \"sv_p_description\",\n container: \"sv_p_container\",\n footer: \"sv_p_footer\",\n number: \"sv_q_num\",\n requiredText: \"sv_q_required_text\",\n },\n error: {\n root: \"sv_q_erbox\",\n icon: \"\",\n item: \"\",\n locationTop: \"sv_qstn_error_top\",\n locationBottom: \"sv_qstn_error_bottom\",\n },\n boolean: {\n root: \"sv_qcbc sv_qbln\",\n item: \"sv-boolean\",\n control: \"sv-visuallyhidden\",\n itemChecked: \"sv-boolean--checked checked\",\n itemIndeterminate: \"sv-boolean--indeterminate\",\n itemDisabled: \"sv-boolean--disabled\",\n switch: \"sv-boolean__switch\",\n slider: \"sv-boolean__slider\",\n sliderText: \"sv-hidden\",\n label: \"sv-boolean__label \",\n disabledLabel: \"sv-boolean__label--disabled\",\n materialDecorator: \"sv-item__decorator sv-boolean__decorator \",\n itemDecorator: \"sv-item__svg sv-boolean__svg\",\n checkedPath: \"sv-boolean__checked-path\",\n uncheckedPath: \"sv-boolean__unchecked-path\",\n indeterminatePath: \"sv-boolean__indeterminate-path\",\n },\n checkbox: {\n root: \"sv_qcbc sv_qcbx\",\n item: \"sv_q_checkbox\",\n itemSelectAll: \"sv_q_checkbox_selectall\",\n itemNone: \"sv_q_checkbox_none\",\n itemChecked: \"checked\",\n itemInline: \"sv_q_checkbox_inline\",\n label: \"sv_q_checkbox_label\",\n labelChecked: \"\",\n itemControl: \"sv_q_checkbox_control_item\",\n itemDecorator: \"sv-hidden\",\n controlLabel: \"sv_q_checkbox_control_label\",\n materialDecorator: \"checkbox-material\",\n other: \"sv_q_other sv_q_checkbox_other\",\n column: \"sv_q_select_column\",\n },\n ranking: {\n root: \"sv-ranking\",\n rootMobileMod: \"sv-ranking--mobile\",\n rootDragMod: \"sv-ranking--drag\",\n item: \"sv-ranking-item\",\n itemContent: \"sv-ranking-item__content\",\n itemIndex: \"sv-ranking-item__index\",\n // itemText: \"sv-ranking-item__text\",\n controlLabel: \"sv-ranking-item__text\",\n itemGhostNode: \"sv-ranking-item__ghost\",\n itemIconContainer: \"sv-ranking-item__icon-container\",\n itemIcon: \"sv-ranking-item__icon\",\n itemIconHoverMod: \"sv-ranking-item__icon--hover\",\n itemIconFocusMod: \"sv-ranking-item__icon--focus\",\n itemGhostMod: \"sv-ranking-item--ghost\",\n itemDragMod: \"sv-ranking-item--drag\",\n },\n comment: \"\",\n dropdown: {\n root: \"\",\n control: \"sv_q_dropdown_control\",\n selectWrapper: \"sv_select_wrapper\",\n other: \"sv_q_dd_other\",\n },\n html: { root: \"\" },\n image: { root: \"sv_q_image\", image: \"sv_image_image\" },\n matrix: {\n root: \"sv_q_matrix\",\n label: \"sv_q_m_label\",\n itemChecked: \"checked\",\n itemDecorator: \"sv-hidden\",\n cell: \"sv_q_m_cell\",\n cellText: \"sv_q_m_cell_text\",\n cellTextSelected: \"sv_q_m_cell_selected\",\n cellLabel: \"sv_q_m_cell_label\",\n },\n matrixdropdown: {\n root: \"sv_q_matrix_dropdown\",\n cell: \"sv_matrix_cell\",\n headerCell: \"sv_matrix_cell_header\",\n row: \"sv_matrix_row\",\n detailRow: \"sv_matrix_detail_row\",\n detailRowText: \"sv_matrix_cell_detail_rowtext\",\n detailCell: \"sv_matrix_cell_detail\",\n choiceCell: \"sv-table__cell--choice\",\n detailButton: \"sv_matrix_cell_detail_button\",\n detailButtonExpanded: \"sv_matrix_cell_detail_button_expanded\",\n detailIcon: \"sv_detail_panel_icon\",\n detailIconExpanded: \"sv_detail_expanded\",\n detailPanelCell: \"sv_matrix_cell_detail_panel\",\n actionsCell: \"sv_matrix_cell sv_matrix_cell_actions\",\n },\n matrixdynamic: {\n root: \"sv_q_matrix_dynamic\",\n button: \"sv_matrix_dynamic_button\",\n buttonAdd: \"\",\n buttonRemove: \"\",\n iconAdd: \"\",\n iconRemove: \"\",\n iconDrag: \"sv-matrixdynamic__drag-icon\",\n cell: \"sv_matrix_cell\",\n headerCell: \"sv_matrix_cell_header\",\n row: \"sv_matrix_row\",\n detailRow: \"sv_matrix_detail_row\",\n detailCell: \"sv_matrix_cell_detail\",\n choiceCell: \"sv-table__cell--choice\",\n detailButton: \"sv_matrix_cell_detail_button\",\n detailButtonExpanded: \"sv_matrix_cell_detail_button_expanded\",\n detailIcon: \"sv_detail_panel_icon\",\n detailIconExpanded: \"sv_detail_expanded\",\n detailPanelCell: \"sv_matrix_cell_detail_panel\",\n actionsCell: \"sv_matrix_cell sv_matrix_cell_actions\",\n emptyRowsSection: \"sv_matrix_empty_rows_section\",\n emptyRowsText: \"sv_matrix_empty_rows_text\",\n emptyRowsButton: \"\",\n },\n paneldynamic: {\n root: \"sv_panel_dynamic\",\n title: \"sv_p_title\",\n button: \"\",\n buttonAdd: \"sv-paneldynamic__add-btn\",\n buttonRemove: \"sv_p_remove_btn\",\n buttonRemoveRight: \"sv_p_remove_btn_right\",\n buttonPrev: \"sv-paneldynamic__prev-btn\",\n buttonNext: \"sv-paneldynamic__next-btn\",\n progressContainer: \"sv-paneldynamic__progress-container\",\n progress: \"sv-progress\",\n progressBar: \"sv-progress__bar\",\n progressText: \"sv-paneldynamic__progress-text\",\n panelWrapper: \"sv_p_wrapper\",\n panelWrapperInRow: \"sv_p_wrapper_in_row\",\n },\n multipletext: {\n root: \"sv_q_mt\",\n itemTitle: \"sv_q_mt_title\",\n row: \"sv_q_mt_row\",\n itemValue: \"sv_q_mt_item_value sv_q_text_root\",\n },\n radiogroup: {\n root: \"sv_qcbc\",\n item: \"sv_q_radiogroup\",\n itemChecked: \"checked\",\n itemInline: \"sv_q_radiogroup_inline\",\n itemDecorator: \"sv-hidden\",\n label: \"sv_q_radiogroup_label\",\n labelChecked: \"\",\n itemControl: \"sv_q_radiogroup_control_item\",\n controlLabel: \"\",\n materialDecorator: \"circle\",\n other: \"sv_q_other sv_q_radiogroup_other\",\n clearButton: \"sv_q_radiogroup_clear\",\n column: \"sv_q_select_column\",\n },\n buttongroup: {\n root: \"sv-button-group\",\n item: \"sv-button-group__item\",\n itemIcon: \"sv-button-group__item-icon\",\n itemDecorator: \"sv-button-group__item-decorator\",\n itemCaption: \"sv-button-group__item-caption\",\n itemHover: \"sv-button-group__item--hover\",\n itemSelected: \"sv-button-group__item--selected\",\n itemDisabled: \"sv-button-group__item--disabled\",\n itemControl: \"sv-visuallyhidden\",\n },\n imagepicker: {\n root: \"sv_imgsel\",\n item: \"sv_q_imgsel\",\n itemChecked: \"checked\",\n label: \"sv_q_imgsel_label\",\n itemControl: \"sv_q_imgsel_control_item\",\n image: \"sv_q_imgsel_image\",\n itemInline: \"sv_q_imagepicker_inline\",\n itemText: \"sv_q_imgsel_text\",\n clearButton: \"sv_q_radiogroup_clear\",\n },\n rating: {\n root: \"sv_q_rating\",\n item: \"sv_q_rating_item\",\n selected: \"active\",\n minText: \"sv_q_rating_min_text\",\n itemText: \"sv_q_rating_item_text\",\n maxText: \"sv_q_rating_max_text\",\n },\n text: \"sv_q_text_root\",\n expression: \"\",\n file: {\n root: \"sv_q_file\",\n placeholderInput: \"sv-visuallyhidden\",\n preview: \"sv_q_file_preview\",\n removeButton: \"sv_q_file_remove_button\",\n fileInput: \"sv-visuallyhidden\",\n removeFile: \"sv_q_file_remove\",\n removeFileSvg: \"sv-hidden\",\n fileDecorator: \"sv-file__decorator\",\n fileSignBottom: \"sv-hidden\",\n removeButtonBottom: \"sv-hidden\",\n chooseFile: \"sv_q_file_choose_button\",\n noFileChosen: \"sv_q_file_placeholder\",\n },\n signaturepad: {\n root: \"sv_q_signaturepad sjs_sp_container\",\n controls: \"sjs_sp_controls\",\n placeholder: \"sjs_sp_placeholder\",\n clearButton: \"sjs_sp_clear\",\n },\n saveData: {\n root: \"\",\n saving: \"\",\n error: \"\",\n success: \"\",\n saveAgainButton: \"\",\n },\n window: {\n root: \"sv_window\",\n body: \"sv_window_content\",\n header: {\n root: \"sv_window_title\",\n title: \"\",\n button: \"\",\n buttonExpanded: \"\",\n buttonCollapsed: \"\",\n },\n },\n};\nsurveyCss[\"standard\"] = defaultStandardCss;\n\n\n/***/ }),\n\n/***/ \"./src/dragdrophelper.ts\":\n/*!*******************************!*\\\n !*** ./src/dragdrophelper.ts ***!\n \\*******************************/\n/*! exports provided: DragDropHelper */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DragDropHelper\", function() { return DragDropHelper; });\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n\n\nvar DragDropHelper = /** @class */ (function (_super) {\n __extends(DragDropHelper, _super);\n function DragDropHelper(surveyValue, creator) {\n var _this = _super.call(this) || this;\n _this.surveyValue = surveyValue;\n _this.creator = creator;\n _this.onBeforeDrop = new _base__WEBPACK_IMPORTED_MODULE_0__[\"EventBase\"]();\n _this.onAfterDrop = new _base__WEBPACK_IMPORTED_MODULE_0__[\"EventBase\"]();\n _this.draggedSurveyElement = null;\n _this.dropTargetSurveyElement = null;\n _this.draggedElementShortcut = null;\n _this.scrollIntervalId = null;\n _this.ghostSurveyElement = null;\n _this.isBottom = null;\n _this.isEdge = null;\n _this.pageOrPanel = null;\n _this.itemValueParentQuestion = null;\n _this.moveDraggedElement = function (event) {\n _this.moveShortcutElement(event);\n if (_this.isItemValueBeingDragged()) {\n _this.handleItemValueDragOver(event);\n }\n else {\n _this.handleSurveyElementDragOver(event);\n }\n };\n _this.handleEscapeButton = function (event) {\n if (event.keyCode == 27) {\n _this.clear();\n }\n };\n _this.banDropHere = function () {\n _this.dropTargetSurveyElement = null;\n _this.isBottom = null;\n _this.isEdge = null;\n _this.draggedElementShortcut.style.cursor = \"not-allowed\";\n };\n _this.banDropSurveyElement = function () {\n _this.removeGhostElementFromSurvey();\n _this.banDropHere();\n };\n _this.drop = function () {\n if (_this.isItemValueBeingDragged()) {\n _this.doDropItemValue();\n }\n else {\n _this.doDropSurveyElement();\n }\n _this.clear();\n };\n _this.doDropItemValue = function () {\n var isTop = !_this.isBottom;\n var choices = _this.itemValueParentQuestion.choices;\n var oldIndex = choices.indexOf(_this.draggedSurveyElement);\n var newIndex = choices.indexOf(_this.dropTargetSurveyElement);\n if (oldIndex < newIndex && isTop) {\n newIndex--;\n }\n else if (oldIndex > newIndex && _this.isBottom) {\n newIndex++;\n }\n _this.onBeforeDrop.fire(_this, null);\n choices.splice(oldIndex, 1);\n choices.splice(newIndex, 0, _this.draggedSurveyElement);\n _this.onAfterDrop.fire(_this, {\n draggedElement: _this.itemValueParentQuestion,\n });\n };\n _this.clear = function () {\n clearInterval(_this.scrollIntervalId);\n document.removeEventListener(\"pointermove\", _this.moveDraggedElement);\n document.removeEventListener(\"keydown\", _this.handleEscapeButton);\n _this.draggedElementShortcut.removeEventListener(\"pointerup\", _this.drop);\n document.body.removeChild(_this.draggedElementShortcut);\n _this.removeGhostElementFromSurvey();\n var prevEvent = DragDropHelper.prevEvent;\n prevEvent.element = null;\n prevEvent.x = -1;\n prevEvent.y = -1;\n _this.dropTargetSurveyElement = null;\n _this.draggedElementShortcut = null;\n _this.ghostSurveyElement = null;\n _this.draggedSurveyElement = null;\n _this.pageOrPanel = null;\n _this.itemValueParentQuestion = null;\n _this.isBottom = null;\n _this.isEdge = null;\n _this.scrollIntervalId = null;\n };\n return _this;\n }\n DragDropHelper.prototype.isItemValueBeingDragged = function () {\n return _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].isDescendantOf(this.draggedSurveyElement.getType(), \"itemvalue\");\n };\n Object.defineProperty(DragDropHelper.prototype, \"dropTargetDataAttributeName\", {\n get: function () {\n if (this.isItemValueBeingDragged()) {\n return \"[data-svc-drop-target-item-value]\";\n }\n return \"[data-svc-drop-target-element-name]\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(DragDropHelper.prototype, \"survey\", {\n get: function () {\n return this.surveyValue || this.creator.survey;\n },\n enumerable: false,\n configurable: true\n });\n DragDropHelper.prototype.startDragToolboxItem = function (event, draggedElementJson) {\n var draggedElement = this.createElementFromJson(draggedElementJson);\n this.startDragSurveyElement(event, draggedElement);\n };\n DragDropHelper.prototype.startDragSurveyElement = function (event, draggedElement) {\n this.startDrag(event, draggedElement);\n };\n DragDropHelper.prototype.startDragItemValue = function (event, question, item) {\n var draggedElement = item;\n this.itemValueParentQuestion = question;\n this.startDrag(event, draggedElement);\n };\n DragDropHelper.prototype.startDrag = function (event, draggedElement) {\n this.draggedSurveyElement = draggedElement;\n this.ghostSurveyElement = this.createGhostSurveyElement();\n this.draggedElementShortcut = this.createDraggedElementShortcut();\n document.body.append(this.draggedElementShortcut);\n this.moveShortcutElement(event);\n document.addEventListener(\"pointermove\", this.moveDraggedElement);\n document.addEventListener(\"keydown\", this.handleEscapeButton);\n this.draggedElementShortcut.addEventListener(\"pointerup\", this.drop);\n };\n DragDropHelper.prototype.getItemValueGhostPosition = function (item) {\n if (this.dropTargetSurveyElement !== item)\n return null;\n if (this.isBottom)\n return \"bottom\";\n return \"top\";\n };\n DragDropHelper.prototype.createGhostSurveyElement = function () {\n var startWithNewLine = this.draggedSurveyElement.startWithNewLine;\n var className = \"svc-drag-drop-ghost\";\n var json = {\n type: \"html\",\n name: DragDropHelper.ghostSurveyElementName,\n html: \"
\",\n };\n var element = this.createElementFromJson(json);\n element.startWithNewLine = startWithNewLine;\n return element;\n };\n DragDropHelper.prototype.createDraggedElementShortcut = function () {\n var draggedElementShortcut = document.createElement(\"div\");\n var draggedElement = this.draggedSurveyElement;\n draggedElementShortcut.innerText =\n draggedElement[\"title\"] ||\n draggedElement[\"text\"] ||\n draggedElement[\"name\"];\n draggedElementShortcut.className = \"svc-drag-shortcut\";\n return draggedElementShortcut;\n };\n DragDropHelper.prototype.moveShortcutElement = function (event) {\n this.doScroll(event.clientY, event.clientX);\n var shortcutHeight = this.draggedElementShortcut.offsetHeight;\n var shortcutWidth = this.draggedElementShortcut.offsetWidth;\n var shortcutXCenter = shortcutWidth / 2;\n var shortcutYCenter = shortcutHeight / 2;\n var documentClientHeight = document.documentElement.clientHeight;\n var documentClientWidth = document.documentElement.clientWidth;\n if (event.clientX + shortcutXCenter >= documentClientWidth) {\n this.draggedElementShortcut.style.left =\n event.pageX -\n event.clientX +\n documentClientWidth -\n shortcutWidth +\n \"px\";\n this.draggedElementShortcut.style.top =\n event.pageY - shortcutYCenter + \"px\";\n return;\n }\n if (event.clientX - shortcutXCenter <= 0) {\n this.draggedElementShortcut.style.left =\n event.pageX - event.clientX + \"px\";\n this.draggedElementShortcut.style.top =\n event.pageY - shortcutYCenter + \"px\";\n return;\n }\n if (event.clientY + shortcutYCenter >= documentClientHeight) {\n this.draggedElementShortcut.style.left =\n event.pageX - shortcutXCenter + \"px\";\n this.draggedElementShortcut.style.top =\n event.pageY -\n event.clientY +\n documentClientHeight -\n shortcutHeight +\n \"px\";\n return;\n }\n if (event.clientY - shortcutYCenter <= 0) {\n this.draggedElementShortcut.style.left =\n event.pageX - shortcutXCenter + \"px\";\n this.draggedElementShortcut.style.top =\n event.pageY - event.clientY + \"px\";\n return;\n }\n this.draggedElementShortcut.style.left =\n event.pageX - shortcutXCenter + \"px\";\n this.draggedElementShortcut.style.top =\n event.pageY - shortcutYCenter + \"px\";\n };\n DragDropHelper.prototype.doScroll = function (clientY, clientX) {\n clearInterval(this.scrollIntervalId);\n var startScrollBoundary = 50;\n // need to import getScrollableParent method\n // let scrollableParentElement = getScrollableParent(dropZoneElement)\n // .parentNode;\n var scrollableParentElement = document.querySelector(\".svc-tab-designer.sd-root-modern\");\n var top = scrollableParentElement.getBoundingClientRect().top;\n var bottom = scrollableParentElement.getBoundingClientRect().bottom;\n var left = scrollableParentElement.getBoundingClientRect().left;\n var right = scrollableParentElement.getBoundingClientRect().right;\n if (clientY - top <= startScrollBoundary) {\n this.scrollIntervalId = setInterval(function () {\n scrollableParentElement.scrollTop -= 5;\n }, 10);\n }\n else if (bottom - clientY <= startScrollBoundary) {\n this.scrollIntervalId = setInterval(function () {\n scrollableParentElement.scrollTop += 5;\n }, 10);\n }\n else if (right - clientX <= startScrollBoundary) {\n this.scrollIntervalId = setInterval(function () {\n scrollableParentElement.scrollLeft += 5;\n }, 10);\n }\n else if (clientX - left <= startScrollBoundary) {\n this.scrollIntervalId = setInterval(function () {\n scrollableParentElement.scrollLeft -= 5;\n }, 10);\n }\n };\n DragDropHelper.prototype.handleItemValueDragOver = function (event) {\n this.draggedElementShortcut.style.cursor = \"grabbing\";\n var dragInfo = this.getDragInfo(event);\n var dropTargetSurveyElement = dragInfo.dropTargetSurveyElement;\n var isEdge = dragInfo.isEdge;\n var isBottom = dragInfo.isBottom;\n var choices = this.itemValueParentQuestion.choices;\n // shouldn't allow to drop on \"adorners\" (selectall, none, other)\n if (choices.indexOf(dropTargetSurveyElement) === -1) {\n this.banDropHere();\n return;\n }\n //drag over next item\n if (choices.indexOf(dropTargetSurveyElement) -\n choices.indexOf(this.draggedSurveyElement) ===\n 1) {\n isBottom = true;\n }\n //drag over prev item\n if (choices.indexOf(this.draggedSurveyElement) -\n choices.indexOf(dropTargetSurveyElement) ===\n 1) {\n isBottom = false;\n }\n if (dropTargetSurveyElement === this.draggedSurveyElement) {\n this.banDropHere();\n return true;\n }\n if (dropTargetSurveyElement === this.dropTargetSurveyElement &&\n isEdge === this.isEdge &&\n isBottom === this.isBottom)\n return;\n this.dropTargetSurveyElement = dropTargetSurveyElement;\n this.isEdge = isEdge;\n this.isBottom = isBottom;\n };\n DragDropHelper.prototype.handleSurveyElementDragOver = function (event) {\n this.draggedElementShortcut.style.cursor = \"grabbing\";\n var dragInfo = this.getDragInfo(event);\n var dropTargetSurveyElement = dragInfo.dropTargetSurveyElement;\n var isEdge = dragInfo.isEdge;\n var isBottom = dragInfo.isBottom;\n if (!dropTargetSurveyElement) {\n this.banDropSurveyElement();\n return;\n }\n if (DragDropHelper.restrictDragQuestionBetweenPages &&\n dropTargetSurveyElement[\"page\"] !==\n this.draggedSurveyElement[\"page\"]) {\n this.banDropSurveyElement();\n return;\n }\n if (dropTargetSurveyElement === this.ghostSurveyElement) {\n return;\n }\n if (dropTargetSurveyElement === this.dropTargetSurveyElement &&\n isEdge === this.isEdge &&\n isBottom === this.isBottom)\n return;\n this.isEdge = isEdge;\n this.isBottom = isBottom;\n this.dropTargetSurveyElement = dropTargetSurveyElement;\n this.insertGhostElementIntoSurvey();\n };\n DragDropHelper.prototype.getDragInfo = function (event) {\n var dropTargetHTMLElement = this.findDropTargetHTMLElementFromPoint(event.clientX, event.clientY);\n if (!dropTargetHTMLElement) {\n return { dropTargetSurveyElement: null, isEdge: true, isBottom: true };\n }\n var dropTargetSurveyElement = this.getDropTargetSurveyElementFromHTMLElement(dropTargetHTMLElement);\n var isEdge = true;\n if (!this.isItemValueBeingDragged()) {\n if (dropTargetSurveyElement.isPanel) {\n var panelDragInfo = this.getPanelDragInfo(dropTargetHTMLElement, dropTargetSurveyElement, event);\n dropTargetSurveyElement = panelDragInfo.dropTargetSurveyElement;\n isEdge = panelDragInfo.isEdge;\n }\n }\n if (dropTargetSurveyElement === this.draggedSurveyElement) {\n dropTargetSurveyElement = null;\n }\n var isBottom = this.calculateIsBottom(dropTargetHTMLElement, event.clientY);\n if (\n // TODO we can't drop on not empty page directly for now\n dropTargetSurveyElement &&\n dropTargetSurveyElement.getType() === \"page\" &&\n dropTargetSurveyElement.elements.length !== 0) {\n var elements = dropTargetSurveyElement.elements;\n dropTargetSurveyElement = isBottom\n ? elements[elements.length - 1]\n : elements[0];\n }\n return { dropTargetSurveyElement: dropTargetSurveyElement, isEdge: isEdge, isBottom: isBottom };\n };\n DragDropHelper.prototype.getPanelDragInfo = function (HTMLElement, surveyElement, event) {\n var isEdge = this.calculateIsEdge(HTMLElement, event.clientY);\n var dropTargetSurveyElement = surveyElement;\n if (!isEdge) {\n HTMLElement = this.findDeepestDropTargetChild(HTMLElement);\n dropTargetSurveyElement = this.getDropTargetSurveyElementFromHTMLElement(HTMLElement);\n }\n return { dropTargetSurveyElement: dropTargetSurveyElement, isEdge: isEdge };\n };\n DragDropHelper.prototype.getDropTargetSurveyElementName = function (element) {\n var dropTargetSurveyElementName = element.dataset.svcDropTargetElementName;\n if (!dropTargetSurveyElementName) {\n dropTargetSurveyElementName = element.dataset.svcDropTargetItemValue;\n }\n return dropTargetSurveyElementName;\n };\n DragDropHelper.prototype.getDropTargetSurveyElementFromHTMLElement = function (element) {\n var result = undefined;\n var dropTargetName = this.getDropTargetSurveyElementName(element);\n var isDragOverInnerPanel = false;\n if (!dropTargetName) {\n var nearestDropTargetElement = element.parentElement.closest(this.dropTargetDataAttributeName);\n dropTargetName = this.getDropTargetSurveyElementName(nearestDropTargetElement);\n isDragOverInnerPanel =\n nearestDropTargetElement !== element && !!dropTargetName;\n }\n if (!dropTargetName) {\n throw new Error(\"Can't find drop target survey element name\");\n }\n if (dropTargetName === DragDropHelper.ghostSurveyElementName) {\n return this.ghostSurveyElement;\n }\n // drop to page\n if (dropTargetName === \"newGhostPage\") {\n result = DragDropHelper.newGhostPage;\n }\n else {\n result = this.survey.getPageByName(dropTargetName);\n }\n // drop to element (question or panel)\n if (!result) {\n var element_1;\n this.survey.pages.forEach(function (page) {\n element_1 = page.getElementByName(dropTargetName);\n if (element_1)\n result = element_1;\n });\n if (!!result &&\n result.getType() === \"paneldynamic\" &&\n isDragOverInnerPanel) {\n var page = result.page;\n result = result.template;\n result.page = page;\n }\n }\n // drop to item-value\n if (!result) {\n result = this.itemValueParentQuestion.choices.filter(function (choice) { return choice.value === dropTargetName; })[0];\n }\n return result;\n };\n DragDropHelper.prototype.calculateMiddleOfHTMLElement = function (HTMLElement) {\n var rect = HTMLElement.getBoundingClientRect();\n return rect.y + rect.height / 2;\n };\n DragDropHelper.prototype.calculateIsBottom = function (HTMLElement, clientY) {\n var middle = this.calculateMiddleOfHTMLElement(HTMLElement);\n return clientY >= middle;\n };\n DragDropHelper.prototype.calculateIsEdge = function (HTMLElement, clientY) {\n var middle = this.calculateMiddleOfHTMLElement(HTMLElement);\n return Math.abs(clientY - middle) >= DragDropHelper.edgeHeight;\n };\n DragDropHelper.prototype.findDropTargetHTMLElement = function (draggedOverNode) {\n if (!draggedOverNode)\n return null;\n var selector = this.dropTargetDataAttributeName;\n var dropTargetHTMLElement = draggedOverNode.querySelector(selector) ||\n draggedOverNode.closest(selector);\n return dropTargetHTMLElement;\n };\n DragDropHelper.prototype.findDropTargetHTMLElementFromPoint = function (clientX, clientY) {\n this.draggedElementShortcut.hidden = true;\n var draggedOverNode = document.elementFromPoint(clientX, clientY);\n this.draggedElementShortcut.hidden = false;\n return this.findDropTargetHTMLElement(draggedOverNode);\n };\n DragDropHelper.prototype.findDeepestDropTargetChild = function (parent) {\n var selector = \"[data-svc-drop-target-element-name]\";\n var result = parent;\n while (!!parent) {\n result = parent;\n parent = parent.querySelector(selector);\n }\n return result;\n };\n DragDropHelper.prototype.insertGhostElementIntoSurvey = function () {\n this.removeGhostElementFromSurvey();\n this.ghostSurveyElement.name = DragDropHelper.ghostSurveyElementName; //TODO why do we need setup it manually see createGhostSurveyElement method\n this.pageOrPanel = this.dropTargetSurveyElement.isPage\n ? this.dropTargetSurveyElement\n : this.dropTargetSurveyElement[\"page\"];\n this.pageOrPanel.dragDropStart(this.draggedSurveyElement, this.ghostSurveyElement, DragDropHelper.nestedPanelDepth);\n return this.pageOrPanel.dragDropMoveTo(this.dropTargetSurveyElement, this.isBottom, this.isEdge);\n };\n DragDropHelper.prototype.insertRealElementIntoSurvey = function () {\n this.removeGhostElementFromSurvey();\n // ghost new page\n if (this.dropTargetSurveyElement.isPage &&\n this.dropTargetSurveyElement[\"_isGhost\"]) {\n this.dropTargetSurveyElement[\"_addGhostPageViewMobel\"]();\n }\n // EO ghost new page\n // fake target element (need only for \"startWithNewLine:false\" feature)\n //TODO need for dragDrop helper in library\n var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]().toJsonObject(this.draggedSurveyElement);\n json[\"type\"] = this.draggedSurveyElement.getType();\n var fakeTargetElement = this.createFakeTargetElement(this.draggedSurveyElement.name, json);\n // EO fake target element\n this.pageOrPanel.dragDropStart(this.draggedSurveyElement, fakeTargetElement, DragDropHelper.nestedPanelDepth);\n this.pageOrPanel.dragDropMoveTo(this.dropTargetSurveyElement, this.isBottom, this.isEdge);\n this.onBeforeDrop.fire(this, null);\n var newElement = this.pageOrPanel.dragDropFinish();\n this.onAfterDrop.fire(this, { draggedElement: newElement });\n };\n DragDropHelper.prototype.removeGhostElementFromSurvey = function () {\n if (!!this.pageOrPanel)\n this.pageOrPanel.dragDropFinish(true);\n };\n DragDropHelper.prototype.createElementFromJson = function (json) {\n var element = this.createNewElement(json);\n if (element[\"setSurveyImpl\"]) {\n element[\"setSurveyImpl\"](this.survey);\n }\n else {\n element[\"setData\"](this.survey);\n }\n element.renderWidth = \"100%\";\n return element;\n };\n DragDropHelper.prototype.createNewElement = function (json) {\n var newElement = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].createClass(json[\"type\"]);\n new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]().toObject(json, newElement);\n return newElement;\n };\n DragDropHelper.prototype.createFakeTargetElement = function (elementName, json) {\n if (!elementName || !json)\n return null;\n var targetElement = null;\n targetElement = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].createClass(json[\"type\"]);\n new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]().toObject(json, targetElement);\n targetElement.name = elementName;\n if (targetElement[\"setSurveyImpl\"]) {\n targetElement[\"setSurveyImpl\"](this.survey);\n }\n else {\n targetElement[\"setData\"](this.survey);\n }\n targetElement.renderWidth = \"100%\";\n return targetElement;\n };\n DragDropHelper.prototype.doDropSurveyElement = function () {\n if (this.dropTargetSurveyElement) {\n this.insertRealElementIntoSurvey();\n }\n };\n DragDropHelper.restrictDragQuestionBetweenPages = false;\n DragDropHelper.edgeHeight = 30;\n DragDropHelper.nestedPanelDepth = -1;\n DragDropHelper.prevEvent = {\n element: null,\n x: -1,\n y: -1,\n };\n DragDropHelper.newGhostPage = null;\n DragDropHelper.ghostSurveyElementName = \"svc-drag-drop-ghost-survey-element-name\"; // before renaming use globa search (we have also css selectors)\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], DragDropHelper.prototype, \"dropTargetSurveyElement\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], DragDropHelper.prototype, \"isBottom\", void 0);\n return DragDropHelper;\n}(_base__WEBPACK_IMPORTED_MODULE_0__[\"Base\"]));\n\n\n\n/***/ }),\n\n/***/ \"./src/dxSurveyService.ts\":\n/*!********************************!*\\\n !*** ./src/dxSurveyService.ts ***!\n \\********************************/\n/*! exports provided: dxSurveyService */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"dxSurveyService\", function() { return dxSurveyService; });\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\n\n/**\n * The class contains methods to work with api.surveyjs.io service.\n */\nvar dxSurveyService = /** @class */ (function () {\n function dxSurveyService() {\n }\n Object.defineProperty(dxSurveyService, \"serviceUrl\", {\n get: function () {\n return _settings__WEBPACK_IMPORTED_MODULE_0__[\"settings\"].surveyServiceUrl;\n },\n set: function (val) {\n _settings__WEBPACK_IMPORTED_MODULE_0__[\"settings\"].surveyServiceUrl = val;\n },\n enumerable: false,\n configurable: true\n });\n dxSurveyService.prototype.loadSurvey = function (surveyId, onLoad) {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", dxSurveyService.serviceUrl + \"/getSurvey?surveyId=\" + surveyId);\n xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n xhr.onload = function () {\n var result = JSON.parse(xhr.response);\n onLoad(xhr.status == 200, result, xhr.response);\n };\n xhr.send();\n };\n dxSurveyService.prototype.getSurveyJsonAndIsCompleted = function (surveyId, clientId, onLoad) {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", dxSurveyService.serviceUrl +\n \"/getSurveyAndIsCompleted?surveyId=\" +\n surveyId +\n \"&clientId=\" +\n clientId);\n xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n xhr.onload = function () {\n var result = JSON.parse(xhr.response);\n var surveyJson = result ? result.survey : null;\n var isCompleted = result ? result.isCompleted : null;\n onLoad(xhr.status == 200, surveyJson, isCompleted, xhr.response);\n };\n xhr.send();\n };\n dxSurveyService.prototype.sendResult = function (postId, result, onSendResult, clientId, isPartialCompleted) {\n if (clientId === void 0) { clientId = null; }\n if (isPartialCompleted === void 0) { isPartialCompleted = false; }\n var xhr = new XMLHttpRequest();\n xhr.open(\"POST\", dxSurveyService.serviceUrl + \"/post/\");\n xhr.setRequestHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n var data = { postId: postId, surveyResult: JSON.stringify(result) };\n if (clientId)\n data[\"clientId\"] = clientId;\n if (isPartialCompleted)\n data[\"isPartialCompleted\"] = true;\n var dataStringify = JSON.stringify(data);\n var self = this;\n xhr.onload = xhr.onerror = function () {\n if (!onSendResult)\n return;\n onSendResult(xhr.status === 200, xhr.response, xhr);\n };\n xhr.send(dataStringify);\n };\n dxSurveyService.prototype.sendFile = function (postId, file, onSendFile) {\n var xhr = new XMLHttpRequest();\n xhr.onload = xhr.onerror = function () {\n if (!onSendFile)\n return;\n onSendFile(xhr.status == 200, JSON.parse(xhr.response));\n };\n xhr.open(\"POST\", dxSurveyService.serviceUrl + \"/upload/\", true);\n var formData = new FormData();\n formData.append(\"file\", file);\n formData.append(\"postId\", postId);\n xhr.send(formData);\n };\n dxSurveyService.prototype.getResult = function (resultId, name, onGetResult) {\n var xhr = new XMLHttpRequest();\n var data = \"resultId=\" + resultId + \"&name=\" + name;\n xhr.open(\"GET\", dxSurveyService.serviceUrl + \"/getResult?\" + data);\n xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n var self = this;\n xhr.onload = function () {\n var result = null;\n var list = null;\n if (xhr.status == 200) {\n result = JSON.parse(xhr.response);\n list = [];\n for (var key in result.QuestionResult) {\n var el = { name: key, value: result.QuestionResult[key] };\n list.push(el);\n }\n }\n onGetResult(xhr.status == 200, result, list, xhr.response);\n };\n xhr.send();\n };\n dxSurveyService.prototype.isCompleted = function (resultId, clientId, onIsCompleted) {\n var xhr = new XMLHttpRequest();\n var data = \"resultId=\" + resultId + \"&clientId=\" + clientId;\n xhr.open(\"GET\", dxSurveyService.serviceUrl + \"/isCompleted?\" + data);\n xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n var self = this;\n xhr.onload = function () {\n var result = null;\n if (xhr.status == 200) {\n result = JSON.parse(xhr.response);\n }\n onIsCompleted(xhr.status == 200, result, xhr.response);\n };\n xhr.send();\n };\n return dxSurveyService;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/entries/chunks/localization.ts\":\n/*!********************************************!*\\\n !*** ./src/entries/chunks/localization.ts ***!\n \\********************************************/\n/*! no exports provided */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _localization_arabic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../localization/arabic */ \"./src/localization/arabic.ts\");\n/* harmony import */ var _localization_basque__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../localization/basque */ \"./src/localization/basque.ts\");\n/* harmony import */ var _localization_bulgarian__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../localization/bulgarian */ \"./src/localization/bulgarian.ts\");\n/* harmony import */ var _localization_catalan__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../localization/catalan */ \"./src/localization/catalan.ts\");\n/* harmony import */ var _localization_croatian__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../localization/croatian */ \"./src/localization/croatian.ts\");\n/* harmony import */ var _localization_czech__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../localization/czech */ \"./src/localization/czech.ts\");\n/* harmony import */ var _localization_danish__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../localization/danish */ \"./src/localization/danish.ts\");\n/* harmony import */ var _localization_dutch__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../localization/dutch */ \"./src/localization/dutch.ts\");\n/* harmony import */ var _localization_estonian__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../localization/estonian */ \"./src/localization/estonian.ts\");\n/* harmony import */ var _localization_finnish__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../localization/finnish */ \"./src/localization/finnish.ts\");\n/* harmony import */ var _localization_french__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../localization/french */ \"./src/localization/french.ts\");\n/* harmony import */ var _localization_georgian__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../localization/georgian */ \"./src/localization/georgian.ts\");\n/* harmony import */ var _localization_german__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../localization/german */ \"./src/localization/german.ts\");\n/* harmony import */ var _localization_greek__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../localization/greek */ \"./src/localization/greek.ts\");\n/* harmony import */ var _localization_hebrew__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../localization/hebrew */ \"./src/localization/hebrew.ts\");\n/* harmony import */ var _localization_hindi__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../localization/hindi */ \"./src/localization/hindi.ts\");\n/* harmony import */ var _localization_hungarian__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../localization/hungarian */ \"./src/localization/hungarian.ts\");\n/* harmony import */ var _localization_icelandic__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../localization/icelandic */ \"./src/localization/icelandic.ts\");\n/* harmony import */ var _localization_indonesian__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../localization/indonesian */ \"./src/localization/indonesian.ts\");\n/* harmony import */ var _localization_italian__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../localization/italian */ \"./src/localization/italian.ts\");\n/* harmony import */ var _localization_japanese__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../localization/japanese */ \"./src/localization/japanese.ts\");\n/* harmony import */ var _localization_kazakh__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../localization/kazakh */ \"./src/localization/kazakh.ts\");\n/* harmony import */ var _localization_korean__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../localization/korean */ \"./src/localization/korean.ts\");\n/* harmony import */ var _localization_latvian__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../localization/latvian */ \"./src/localization/latvian.ts\");\n/* harmony import */ var _localization_lithuanian__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../../localization/lithuanian */ \"./src/localization/lithuanian.ts\");\n/* harmony import */ var _localization_macedonian__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../localization/macedonian */ \"./src/localization/macedonian.ts\");\n/* harmony import */ var _localization_norwegian__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../localization/norwegian */ \"./src/localization/norwegian.ts\");\n/* harmony import */ var _localization_persian__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../localization/persian */ \"./src/localization/persian.ts\");\n/* harmony import */ var _localization_polish__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../../localization/polish */ \"./src/localization/polish.ts\");\n/* harmony import */ var _localization_portuguese__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../../localization/portuguese */ \"./src/localization/portuguese.ts\");\n/* harmony import */ var _localization_portuguese_br__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../../localization/portuguese-br */ \"./src/localization/portuguese-br.ts\");\n/* harmony import */ var _localization_romanian__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../../localization/romanian */ \"./src/localization/romanian.ts\");\n/* harmony import */ var _localization_russian__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../../localization/russian */ \"./src/localization/russian.ts\");\n/* harmony import */ var _localization_serbian__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../localization/serbian */ \"./src/localization/serbian.ts\");\n/* harmony import */ var _localization_simplified_chinese__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../../localization/simplified-chinese */ \"./src/localization/simplified-chinese.ts\");\n/* harmony import */ var _localization_spanish__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../../localization/spanish */ \"./src/localization/spanish.ts\");\n/* harmony import */ var _localization_swahili__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../../localization/swahili */ \"./src/localization/swahili.ts\");\n/* harmony import */ var _localization_swedish__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../../localization/swedish */ \"./src/localization/swedish.ts\");\n/* harmony import */ var _localization_tajik__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../../localization/tajik */ \"./src/localization/tajik.ts\");\n/* harmony import */ var _localization_thai__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../../localization/thai */ \"./src/localization/thai.ts\");\n/* harmony import */ var _localization_traditional_chinese__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../../localization/traditional-chinese */ \"./src/localization/traditional-chinese.ts\");\n/* harmony import */ var _localization_turkish__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../../localization/turkish */ \"./src/localization/turkish.ts\");\n/* harmony import */ var _localization_ukrainian__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../../localization/ukrainian */ \"./src/localization/ukrainian.ts\");\n/* harmony import */ var _localization_vietnamese__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../../localization/vietnamese */ \"./src/localization/vietnamese.ts\");\n/* harmony import */ var _localization_welsh__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../../localization/welsh */ \"./src/localization/welsh.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./src/entries/chunks/model.ts\":\n/*!*************************************!*\\\n !*** ./src/entries/chunks/model.ts ***!\n \\*************************************/\n/*! exports provided: Version, settings, Helpers, AnswerCountValidator, EmailValidator, NumericValidator, RegexValidator, SurveyValidator, TextValidator, ValidatorResult, ExpressionValidator, ValidatorRunner, ItemValue, Base, Event, ArrayChanges, SurveyError, SurveyElement, CalculatedValue, CustomError, AnswerRequiredError, OneAnswerRequiredError, RequreNumericError, ExceedSizeError, LocalizableString, LocalizableStrings, HtmlConditionItem, UrlConditionItem, ChoicesRestful, ChoicesRestfull, FunctionFactory, registerFunction, ConditionRunner, ExpressionRunner, Operand, Const, BinaryOperand, Variable, FunctionOperand, ArrayOperand, ConditionsParser, ProcessValue, JsonError, JsonIncorrectTypeError, JsonMetadata, JsonMetadataClass, JsonMissingTypeError, JsonMissingTypeErrorBase, JsonObject, JsonObjectProperty, JsonRequiredPropertyError, JsonUnknownPropertyError, Serializer, property, propertyArray, MatrixDropdownCell, MatrixDropdownColumn, matrixDropdownColumnTypes, MatrixDropdownRowModelBase, QuestionMatrixDropdownModelBase, QuestionMatrixDropdownRenderedCell, QuestionMatrixDropdownRenderedRow, QuestionMatrixDropdownRenderedTable, MatrixDropdownRowModel, QuestionMatrixDropdownModel, MatrixDynamicRowModel, QuestionMatrixDynamicModel, MatrixRowModel, MatrixCells, QuestionMatrixModel, MultipleTextItemModel, QuestionMultipleTextModel, PanelModel, PanelModelBase, QuestionRowModel, FlowPanelModel, PageModel, Question, QuestionNonValue, QuestionEmptyModel, QuestionCheckboxBase, QuestionSelectBase, QuestionCheckboxModel, QuestionRankingModel, QuestionCommentModel, QuestionDropdownModel, QuestionFactory, ElementFactory, QuestionFileModel, QuestionHtmlModel, QuestionRadiogroupModel, QuestionRatingModel, QuestionExpressionModel, QuestionTextModel, QuestionBooleanModel, QuestionImagePickerModel, ImageItemValue, QuestionImageModel, QuestionSignaturePadModel, QuestionPanelDynamicModel, QuestionPanelDynamicItem, SurveyTimer, SurveyProgressButtonsModel, SurveyModel, SurveyTrigger, SurveyTriggerComplete, SurveyTriggerSetValue, SurveyTriggerVisible, SurveyTriggerCopyValue, SurveyTriggerRunExpression, Trigger, SurveyWindowModel, TextPreProcessor, dxSurveyService, englishStrings, surveyLocalization, surveyStrings, QuestionCustomWidget, CustomWidgetCollection, QuestionCustomModel, QuestionCompositeModel, ComponentQuestionJSON, ComponentCollection, StylesManager, ListModel, PopupModel, PopupBaseViewModel, QuestionButtonGroupModel, ButtonGroupItemModel, ButtonGroupItemValue, IsMobile, confirmAction, detectIEOrEdge, doKey2Click, loadFileFromBase64, createSvg, surveyCss, DragDropHelper */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Version\", function() { return Version; });\n/* harmony import */ var _main_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../main.scss */ \"./src/main.scss\");\n/* harmony import */ var _main_scss__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_main_scss__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../settings */ \"./src/settings.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"settings\", function() { return _settings__WEBPACK_IMPORTED_MODULE_1__[\"settings\"]; });\n\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../helpers */ \"./src/helpers.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Helpers\", function() { return _helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"]; });\n\n/* harmony import */ var _validator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../validator */ \"./src/validator.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AnswerCountValidator\", function() { return _validator__WEBPACK_IMPORTED_MODULE_3__[\"AnswerCountValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"EmailValidator\", function() { return _validator__WEBPACK_IMPORTED_MODULE_3__[\"EmailValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"NumericValidator\", function() { return _validator__WEBPACK_IMPORTED_MODULE_3__[\"NumericValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RegexValidator\", function() { return _validator__WEBPACK_IMPORTED_MODULE_3__[\"RegexValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyValidator\", function() { return _validator__WEBPACK_IMPORTED_MODULE_3__[\"SurveyValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TextValidator\", function() { return _validator__WEBPACK_IMPORTED_MODULE_3__[\"TextValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ValidatorResult\", function() { return _validator__WEBPACK_IMPORTED_MODULE_3__[\"ValidatorResult\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ExpressionValidator\", function() { return _validator__WEBPACK_IMPORTED_MODULE_3__[\"ExpressionValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ValidatorRunner\", function() { return _validator__WEBPACK_IMPORTED_MODULE_3__[\"ValidatorRunner\"]; });\n\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../itemvalue */ \"./src/itemvalue.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ItemValue\", function() { return _itemvalue__WEBPACK_IMPORTED_MODULE_4__[\"ItemValue\"]; });\n\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../base */ \"./src/base.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Base\", function() { return _base__WEBPACK_IMPORTED_MODULE_5__[\"Base\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Event\", function() { return _base__WEBPACK_IMPORTED_MODULE_5__[\"Event\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ArrayChanges\", function() { return _base__WEBPACK_IMPORTED_MODULE_5__[\"ArrayChanges\"]; });\n\n/* harmony import */ var _survey_error__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../survey-error */ \"./src/survey-error.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyError\", function() { return _survey_error__WEBPACK_IMPORTED_MODULE_6__[\"SurveyError\"]; });\n\n/* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../survey-element */ \"./src/survey-element.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyElement\", function() { return _survey_element__WEBPACK_IMPORTED_MODULE_7__[\"SurveyElement\"]; });\n\n/* harmony import */ var _calculatedValue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../calculatedValue */ \"./src/calculatedValue.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CalculatedValue\", function() { return _calculatedValue__WEBPACK_IMPORTED_MODULE_8__[\"CalculatedValue\"]; });\n\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../error */ \"./src/error.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CustomError\", function() { return _error__WEBPACK_IMPORTED_MODULE_9__[\"CustomError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AnswerRequiredError\", function() { return _error__WEBPACK_IMPORTED_MODULE_9__[\"AnswerRequiredError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"OneAnswerRequiredError\", function() { return _error__WEBPACK_IMPORTED_MODULE_9__[\"OneAnswerRequiredError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RequreNumericError\", function() { return _error__WEBPACK_IMPORTED_MODULE_9__[\"RequreNumericError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ExceedSizeError\", function() { return _error__WEBPACK_IMPORTED_MODULE_9__[\"ExceedSizeError\"]; });\n\n/* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../localizablestring */ \"./src/localizablestring.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LocalizableString\", function() { return _localizablestring__WEBPACK_IMPORTED_MODULE_10__[\"LocalizableString\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LocalizableStrings\", function() { return _localizablestring__WEBPACK_IMPORTED_MODULE_10__[\"LocalizableStrings\"]; });\n\n/* harmony import */ var _expressionItems__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../expressionItems */ \"./src/expressionItems.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"HtmlConditionItem\", function() { return _expressionItems__WEBPACK_IMPORTED_MODULE_11__[\"HtmlConditionItem\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"UrlConditionItem\", function() { return _expressionItems__WEBPACK_IMPORTED_MODULE_11__[\"UrlConditionItem\"]; });\n\n/* harmony import */ var _choicesRestful__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../choicesRestful */ \"./src/choicesRestful.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ChoicesRestful\", function() { return _choicesRestful__WEBPACK_IMPORTED_MODULE_12__[\"ChoicesRestful\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ChoicesRestfull\", function() { return _choicesRestful__WEBPACK_IMPORTED_MODULE_12__[\"ChoicesRestfull\"]; });\n\n/* harmony import */ var _functionsfactory__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../functionsfactory */ \"./src/functionsfactory.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FunctionFactory\", function() { return _functionsfactory__WEBPACK_IMPORTED_MODULE_13__[\"FunctionFactory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"registerFunction\", function() { return _functionsfactory__WEBPACK_IMPORTED_MODULE_13__[\"registerFunction\"]; });\n\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../conditions */ \"./src/conditions.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConditionRunner\", function() { return _conditions__WEBPACK_IMPORTED_MODULE_14__[\"ConditionRunner\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ExpressionRunner\", function() { return _conditions__WEBPACK_IMPORTED_MODULE_14__[\"ExpressionRunner\"]; });\n\n/* harmony import */ var _expressions_expressions__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../expressions/expressions */ \"./src/expressions/expressions.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Operand\", function() { return _expressions_expressions__WEBPACK_IMPORTED_MODULE_15__[\"Operand\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Const\", function() { return _expressions_expressions__WEBPACK_IMPORTED_MODULE_15__[\"Const\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"BinaryOperand\", function() { return _expressions_expressions__WEBPACK_IMPORTED_MODULE_15__[\"BinaryOperand\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Variable\", function() { return _expressions_expressions__WEBPACK_IMPORTED_MODULE_15__[\"Variable\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FunctionOperand\", function() { return _expressions_expressions__WEBPACK_IMPORTED_MODULE_15__[\"FunctionOperand\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ArrayOperand\", function() { return _expressions_expressions__WEBPACK_IMPORTED_MODULE_15__[\"ArrayOperand\"]; });\n\n/* harmony import */ var _conditionsParser__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../conditionsParser */ \"./src/conditionsParser.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConditionsParser\", function() { return _conditionsParser__WEBPACK_IMPORTED_MODULE_16__[\"ConditionsParser\"]; });\n\n/* harmony import */ var _conditionProcessValue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../conditionProcessValue */ \"./src/conditionProcessValue.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ProcessValue\", function() { return _conditionProcessValue__WEBPACK_IMPORTED_MODULE_17__[\"ProcessValue\"]; });\n\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../jsonobject */ \"./src/jsonobject.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonError\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"JsonError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonIncorrectTypeError\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"JsonIncorrectTypeError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMetadata\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"JsonMetadata\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMetadataClass\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"JsonMetadataClass\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMissingTypeError\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"JsonMissingTypeError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMissingTypeErrorBase\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"JsonMissingTypeErrorBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonObject\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"JsonObject\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonObjectProperty\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"JsonObjectProperty\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonRequiredPropertyError\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"JsonRequiredPropertyError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonUnknownPropertyError\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"JsonUnknownPropertyError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Serializer\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"Serializer\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"property\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"property\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"propertyArray\", function() { return _jsonobject__WEBPACK_IMPORTED_MODULE_18__[\"propertyArray\"]; });\n\n/* harmony import */ var _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../question_matrixdropdownbase */ \"./src/question_matrixdropdownbase.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownCell\", function() { return _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_19__[\"MatrixDropdownCell\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownColumn\", function() { return _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_19__[\"MatrixDropdownColumn\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"matrixDropdownColumnTypes\", function() { return _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_19__[\"matrixDropdownColumnTypes\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownRowModelBase\", function() { return _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_19__[\"MatrixDropdownRowModelBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownModelBase\", function() { return _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_19__[\"QuestionMatrixDropdownModelBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedCell\", function() { return _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_19__[\"QuestionMatrixDropdownRenderedCell\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedRow\", function() { return _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_19__[\"QuestionMatrixDropdownRenderedRow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedTable\", function() { return _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_19__[\"QuestionMatrixDropdownRenderedTable\"]; });\n\n/* harmony import */ var _question_matrixdropdown__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../question_matrixdropdown */ \"./src/question_matrixdropdown.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownRowModel\", function() { return _question_matrixdropdown__WEBPACK_IMPORTED_MODULE_20__[\"MatrixDropdownRowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownModel\", function() { return _question_matrixdropdown__WEBPACK_IMPORTED_MODULE_20__[\"QuestionMatrixDropdownModel\"]; });\n\n/* harmony import */ var _question_matrixdynamic__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../question_matrixdynamic */ \"./src/question_matrixdynamic.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDynamicRowModel\", function() { return _question_matrixdynamic__WEBPACK_IMPORTED_MODULE_21__[\"MatrixDynamicRowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDynamicModel\", function() { return _question_matrixdynamic__WEBPACK_IMPORTED_MODULE_21__[\"QuestionMatrixDynamicModel\"]; });\n\n/* harmony import */ var _question_matrix__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../question_matrix */ \"./src/question_matrix.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixRowModel\", function() { return _question_matrix__WEBPACK_IMPORTED_MODULE_22__[\"MatrixRowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixCells\", function() { return _question_matrix__WEBPACK_IMPORTED_MODULE_22__[\"MatrixCells\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixModel\", function() { return _question_matrix__WEBPACK_IMPORTED_MODULE_22__[\"QuestionMatrixModel\"]; });\n\n/* harmony import */ var _question_multipletext__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../question_multipletext */ \"./src/question_multipletext.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MultipleTextItemModel\", function() { return _question_multipletext__WEBPACK_IMPORTED_MODULE_23__[\"MultipleTextItemModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMultipleTextModel\", function() { return _question_multipletext__WEBPACK_IMPORTED_MODULE_23__[\"QuestionMultipleTextModel\"]; });\n\n/* harmony import */ var _panel__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../../panel */ \"./src/panel.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PanelModel\", function() { return _panel__WEBPACK_IMPORTED_MODULE_24__[\"PanelModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PanelModelBase\", function() { return _panel__WEBPACK_IMPORTED_MODULE_24__[\"PanelModelBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRowModel\", function() { return _panel__WEBPACK_IMPORTED_MODULE_24__[\"QuestionRowModel\"]; });\n\n/* harmony import */ var _flowpanel__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../flowpanel */ \"./src/flowpanel.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FlowPanelModel\", function() { return _flowpanel__WEBPACK_IMPORTED_MODULE_25__[\"FlowPanelModel\"]; });\n\n/* harmony import */ var _page__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../page */ \"./src/page.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PageModel\", function() { return _page__WEBPACK_IMPORTED_MODULE_26__[\"PageModel\"]; });\n\n/* harmony import */ var _template_renderer__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../template-renderer */ \"./src/template-renderer.ts\");\n/* empty/unused harmony star reexport *//* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../../question */ \"./src/question.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Question\", function() { return _question__WEBPACK_IMPORTED_MODULE_28__[\"Question\"]; });\n\n/* harmony import */ var _questionnonvalue__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../../questionnonvalue */ \"./src/questionnonvalue.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionNonValue\", function() { return _questionnonvalue__WEBPACK_IMPORTED_MODULE_29__[\"QuestionNonValue\"]; });\n\n/* harmony import */ var _question_empty__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../../question_empty */ \"./src/question_empty.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionEmptyModel\", function() { return _question_empty__WEBPACK_IMPORTED_MODULE_30__[\"QuestionEmptyModel\"]; });\n\n/* harmony import */ var _question_baseselect__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../../question_baseselect */ \"./src/question_baseselect.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxBase\", function() { return _question_baseselect__WEBPACK_IMPORTED_MODULE_31__[\"QuestionCheckboxBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionSelectBase\", function() { return _question_baseselect__WEBPACK_IMPORTED_MODULE_31__[\"QuestionSelectBase\"]; });\n\n/* harmony import */ var _question_checkbox__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../../question_checkbox */ \"./src/question_checkbox.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxModel\", function() { return _question_checkbox__WEBPACK_IMPORTED_MODULE_32__[\"QuestionCheckboxModel\"]; });\n\n/* harmony import */ var _question_ranking__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../question_ranking */ \"./src/question_ranking.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRankingModel\", function() { return _question_ranking__WEBPACK_IMPORTED_MODULE_33__[\"QuestionRankingModel\"]; });\n\n/* harmony import */ var _question_comment__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../../question_comment */ \"./src/question_comment.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCommentModel\", function() { return _question_comment__WEBPACK_IMPORTED_MODULE_34__[\"QuestionCommentModel\"]; });\n\n/* harmony import */ var _question_dropdown__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../../question_dropdown */ \"./src/question_dropdown.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionDropdownModel\", function() { return _question_dropdown__WEBPACK_IMPORTED_MODULE_35__[\"QuestionDropdownModel\"]; });\n\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../../questionfactory */ \"./src/questionfactory.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionFactory\", function() { return _questionfactory__WEBPACK_IMPORTED_MODULE_36__[\"QuestionFactory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ElementFactory\", function() { return _questionfactory__WEBPACK_IMPORTED_MODULE_36__[\"ElementFactory\"]; });\n\n/* harmony import */ var _question_file__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../../question_file */ \"./src/question_file.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionFileModel\", function() { return _question_file__WEBPACK_IMPORTED_MODULE_37__[\"QuestionFileModel\"]; });\n\n/* harmony import */ var _question_html__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../../question_html */ \"./src/question_html.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionHtmlModel\", function() { return _question_html__WEBPACK_IMPORTED_MODULE_38__[\"QuestionHtmlModel\"]; });\n\n/* harmony import */ var _question_radiogroup__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../../question_radiogroup */ \"./src/question_radiogroup.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRadiogroupModel\", function() { return _question_radiogroup__WEBPACK_IMPORTED_MODULE_39__[\"QuestionRadiogroupModel\"]; });\n\n/* harmony import */ var _question_rating__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../../question_rating */ \"./src/question_rating.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRatingModel\", function() { return _question_rating__WEBPACK_IMPORTED_MODULE_40__[\"QuestionRatingModel\"]; });\n\n/* harmony import */ var _question_expression__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../../question_expression */ \"./src/question_expression.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionExpressionModel\", function() { return _question_expression__WEBPACK_IMPORTED_MODULE_41__[\"QuestionExpressionModel\"]; });\n\n/* harmony import */ var _question_text__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../../question_text */ \"./src/question_text.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionTextModel\", function() { return _question_text__WEBPACK_IMPORTED_MODULE_42__[\"QuestionTextModel\"]; });\n\n/* harmony import */ var _question_boolean__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../../question_boolean */ \"./src/question_boolean.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionBooleanModel\", function() { return _question_boolean__WEBPACK_IMPORTED_MODULE_43__[\"QuestionBooleanModel\"]; });\n\n/* harmony import */ var _question_imagepicker__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../../question_imagepicker */ \"./src/question_imagepicker.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImagePickerModel\", function() { return _question_imagepicker__WEBPACK_IMPORTED_MODULE_44__[\"QuestionImagePickerModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ImageItemValue\", function() { return _question_imagepicker__WEBPACK_IMPORTED_MODULE_44__[\"ImageItemValue\"]; });\n\n/* harmony import */ var _question_image__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../../question_image */ \"./src/question_image.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImageModel\", function() { return _question_image__WEBPACK_IMPORTED_MODULE_45__[\"QuestionImageModel\"]; });\n\n/* harmony import */ var _question_signaturepad__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../../question_signaturepad */ \"./src/question_signaturepad.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionSignaturePadModel\", function() { return _question_signaturepad__WEBPACK_IMPORTED_MODULE_46__[\"QuestionSignaturePadModel\"]; });\n\n/* harmony import */ var _question_paneldynamic__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../../question_paneldynamic */ \"./src/question_paneldynamic.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamicModel\", function() { return _question_paneldynamic__WEBPACK_IMPORTED_MODULE_47__[\"QuestionPanelDynamicModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamicItem\", function() { return _question_paneldynamic__WEBPACK_IMPORTED_MODULE_47__[\"QuestionPanelDynamicItem\"]; });\n\n/* harmony import */ var _surveytimer__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ../../surveytimer */ \"./src/surveytimer.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTimer\", function() { return _surveytimer__WEBPACK_IMPORTED_MODULE_48__[\"SurveyTimer\"]; });\n\n/* harmony import */ var _surveyProgressButtons__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ../../surveyProgressButtons */ \"./src/surveyProgressButtons.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyProgressButtonsModel\", function() { return _surveyProgressButtons__WEBPACK_IMPORTED_MODULE_49__[\"SurveyProgressButtonsModel\"]; });\n\n/* harmony import */ var _survey__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ../../survey */ \"./src/survey.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyModel\", function() { return _survey__WEBPACK_IMPORTED_MODULE_50__[\"SurveyModel\"]; });\n\n/* harmony import */ var _trigger__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ../../trigger */ \"./src/trigger.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTrigger\", function() { return _trigger__WEBPACK_IMPORTED_MODULE_51__[\"SurveyTrigger\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerComplete\", function() { return _trigger__WEBPACK_IMPORTED_MODULE_51__[\"SurveyTriggerComplete\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerSetValue\", function() { return _trigger__WEBPACK_IMPORTED_MODULE_51__[\"SurveyTriggerSetValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerVisible\", function() { return _trigger__WEBPACK_IMPORTED_MODULE_51__[\"SurveyTriggerVisible\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerCopyValue\", function() { return _trigger__WEBPACK_IMPORTED_MODULE_51__[\"SurveyTriggerCopyValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerRunExpression\", function() { return _trigger__WEBPACK_IMPORTED_MODULE_51__[\"SurveyTriggerRunExpression\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Trigger\", function() { return _trigger__WEBPACK_IMPORTED_MODULE_51__[\"Trigger\"]; });\n\n/* harmony import */ var _surveyWindow__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ../../surveyWindow */ \"./src/surveyWindow.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyWindowModel\", function() { return _surveyWindow__WEBPACK_IMPORTED_MODULE_52__[\"SurveyWindowModel\"]; });\n\n/* harmony import */ var _textPreProcessor__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ../../textPreProcessor */ \"./src/textPreProcessor.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TextPreProcessor\", function() { return _textPreProcessor__WEBPACK_IMPORTED_MODULE_53__[\"TextPreProcessor\"]; });\n\n/* harmony import */ var _dxSurveyService__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ../../dxSurveyService */ \"./src/dxSurveyService.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"dxSurveyService\", function() { return _dxSurveyService__WEBPACK_IMPORTED_MODULE_54__[\"dxSurveyService\"]; });\n\n/* harmony import */ var _localization_english__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ../../localization/english */ \"./src/localization/english.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"englishStrings\", function() { return _localization_english__WEBPACK_IMPORTED_MODULE_55__[\"englishStrings\"]; });\n\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ../../surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"surveyLocalization\", function() { return _surveyStrings__WEBPACK_IMPORTED_MODULE_56__[\"surveyLocalization\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"surveyStrings\", function() { return _surveyStrings__WEBPACK_IMPORTED_MODULE_56__[\"surveyStrings\"]; });\n\n/* harmony import */ var _questionCustomWidgets__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ../../questionCustomWidgets */ \"./src/questionCustomWidgets.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustomWidget\", function() { return _questionCustomWidgets__WEBPACK_IMPORTED_MODULE_57__[\"QuestionCustomWidget\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CustomWidgetCollection\", function() { return _questionCustomWidgets__WEBPACK_IMPORTED_MODULE_57__[\"CustomWidgetCollection\"]; });\n\n/* harmony import */ var _question_custom__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ../../question_custom */ \"./src/question_custom.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustomModel\", function() { return _question_custom__WEBPACK_IMPORTED_MODULE_58__[\"QuestionCustomModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCompositeModel\", function() { return _question_custom__WEBPACK_IMPORTED_MODULE_58__[\"QuestionCompositeModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ComponentQuestionJSON\", function() { return _question_custom__WEBPACK_IMPORTED_MODULE_58__[\"ComponentQuestionJSON\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ComponentCollection\", function() { return _question_custom__WEBPACK_IMPORTED_MODULE_58__[\"ComponentCollection\"]; });\n\n/* harmony import */ var _stylesmanager__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ../../stylesmanager */ \"./src/stylesmanager.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesManager\", function() { return _stylesmanager__WEBPACK_IMPORTED_MODULE_59__[\"StylesManager\"]; });\n\n/* harmony import */ var _list__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ../../list */ \"./src/list.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ListModel\", function() { return _list__WEBPACK_IMPORTED_MODULE_60__[\"ListModel\"]; });\n\n/* harmony import */ var _popup__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ../../popup */ \"./src/popup.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PopupModel\", function() { return _popup__WEBPACK_IMPORTED_MODULE_61__[\"PopupModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PopupBaseViewModel\", function() { return _popup__WEBPACK_IMPORTED_MODULE_61__[\"PopupBaseViewModel\"]; });\n\n/* harmony import */ var _question_buttongroup__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ../../question_buttongroup */ \"./src/question_buttongroup.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionButtonGroupModel\", function() { return _question_buttongroup__WEBPACK_IMPORTED_MODULE_62__[\"QuestionButtonGroupModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ButtonGroupItemModel\", function() { return _question_buttongroup__WEBPACK_IMPORTED_MODULE_62__[\"ButtonGroupItemModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ButtonGroupItemValue\", function() { return _question_buttongroup__WEBPACK_IMPORTED_MODULE_62__[\"ButtonGroupItemValue\"]; });\n\n/* harmony import */ var _utils_is_mobile__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ../../utils/is-mobile */ \"./src/utils/is-mobile.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"IsMobile\", function() { return _utils_is_mobile__WEBPACK_IMPORTED_MODULE_63__[\"IsMobile\"]; });\n\n/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ../../utils/utils */ \"./src/utils/utils.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"confirmAction\", function() { return _utils_utils__WEBPACK_IMPORTED_MODULE_64__[\"confirmAction\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"detectIEOrEdge\", function() { return _utils_utils__WEBPACK_IMPORTED_MODULE_64__[\"detectIEOrEdge\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"doKey2Click\", function() { return _utils_utils__WEBPACK_IMPORTED_MODULE_64__[\"doKey2Click\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"loadFileFromBase64\", function() { return _utils_utils__WEBPACK_IMPORTED_MODULE_64__[\"loadFileFromBase64\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createSvg\", function() { return _utils_utils__WEBPACK_IMPORTED_MODULE_64__[\"createSvg\"]; });\n\n/* harmony import */ var _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ../../defaultCss/cssstandard */ \"./src/defaultCss/cssstandard.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"surveyCss\", function() { return _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_65__[\"surveyCss\"]; });\n\n/* harmony import */ var _dragdrophelper__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ../../dragdrophelper */ \"./src/dragdrophelper.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"DragDropHelper\", function() { return _dragdrophelper__WEBPACK_IMPORTED_MODULE_66__[\"DragDropHelper\"]; });\n\n// styles\n\n//import \"../../modern.scss\";\nvar Version;\nVersion = \"\" + \"1.8.58\";\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// export { cultureInfo } from \"../../cultureInfo\";\n\n\n\n\n\n\n\n\n\n//Uncomment to include the \"date\" question type.\n//export {default as QuestionDateModel} from \"../../plugins/question_date\";\n\n\n\n/***/ }),\n\n/***/ \"./src/entries/core.ts\":\n/*!*****************************!*\\\n !*** ./src/entries/core.ts ***!\n \\*****************************/\n/*! exports provided: Version, settings, Helpers, AnswerCountValidator, EmailValidator, NumericValidator, RegexValidator, SurveyValidator, TextValidator, ValidatorResult, ExpressionValidator, ValidatorRunner, ItemValue, Base, Event, ArrayChanges, SurveyError, SurveyElement, CalculatedValue, CustomError, AnswerRequiredError, OneAnswerRequiredError, RequreNumericError, ExceedSizeError, LocalizableString, LocalizableStrings, HtmlConditionItem, UrlConditionItem, ChoicesRestful, ChoicesRestfull, FunctionFactory, registerFunction, ConditionRunner, ExpressionRunner, Operand, Const, BinaryOperand, Variable, FunctionOperand, ArrayOperand, ConditionsParser, ProcessValue, JsonError, JsonIncorrectTypeError, JsonMetadata, JsonMetadataClass, JsonMissingTypeError, JsonMissingTypeErrorBase, JsonObject, JsonObjectProperty, JsonRequiredPropertyError, JsonUnknownPropertyError, Serializer, property, propertyArray, MatrixDropdownCell, MatrixDropdownColumn, matrixDropdownColumnTypes, MatrixDropdownRowModelBase, QuestionMatrixDropdownModelBase, QuestionMatrixDropdownRenderedCell, QuestionMatrixDropdownRenderedRow, QuestionMatrixDropdownRenderedTable, MatrixDropdownRowModel, QuestionMatrixDropdownModel, MatrixDynamicRowModel, QuestionMatrixDynamicModel, MatrixRowModel, MatrixCells, QuestionMatrixModel, MultipleTextItemModel, QuestionMultipleTextModel, PanelModel, PanelModelBase, QuestionRowModel, FlowPanelModel, PageModel, Question, QuestionNonValue, QuestionEmptyModel, QuestionCheckboxBase, QuestionSelectBase, QuestionCheckboxModel, QuestionRankingModel, QuestionCommentModel, QuestionDropdownModel, QuestionFactory, ElementFactory, QuestionFileModel, QuestionHtmlModel, QuestionRadiogroupModel, QuestionRatingModel, QuestionExpressionModel, QuestionTextModel, QuestionBooleanModel, QuestionImagePickerModel, ImageItemValue, QuestionImageModel, QuestionSignaturePadModel, QuestionPanelDynamicModel, QuestionPanelDynamicItem, SurveyTimer, SurveyProgressButtonsModel, SurveyModel, SurveyTrigger, SurveyTriggerComplete, SurveyTriggerSetValue, SurveyTriggerVisible, SurveyTriggerCopyValue, SurveyTriggerRunExpression, Trigger, SurveyWindowModel, TextPreProcessor, dxSurveyService, englishStrings, surveyLocalization, surveyStrings, QuestionCustomWidget, CustomWidgetCollection, QuestionCustomModel, QuestionCompositeModel, ComponentQuestionJSON, ComponentCollection, StylesManager, ListModel, PopupModel, PopupBaseViewModel, QuestionButtonGroupModel, ButtonGroupItemModel, ButtonGroupItemValue, IsMobile, confirmAction, detectIEOrEdge, doKey2Click, loadFileFromBase64, createSvg, surveyCss, DragDropHelper, defaultStandardCss, defaultBootstrapCss, defaultBootstrapMaterialCss, modernCss, RendererFactory, ResponsivityManager, VerticalResponsivityManager, unwrap, Action, AdaptiveActionContainer, ActionContainer */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _chunks_model__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chunks/model */ \"./src/entries/chunks/model.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Version\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"Version\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"settings\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"settings\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Helpers\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AnswerCountValidator\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"AnswerCountValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"EmailValidator\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"EmailValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"NumericValidator\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"NumericValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RegexValidator\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"RegexValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyValidator\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TextValidator\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"TextValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ValidatorResult\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ValidatorResult\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ExpressionValidator\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ExpressionValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ValidatorRunner\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ValidatorRunner\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ItemValue\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ItemValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Base\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"Base\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Event\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"Event\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ArrayChanges\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ArrayChanges\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyError\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyElement\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyElement\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CalculatedValue\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"CalculatedValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CustomError\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"CustomError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AnswerRequiredError\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"AnswerRequiredError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"OneAnswerRequiredError\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"OneAnswerRequiredError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RequreNumericError\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"RequreNumericError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ExceedSizeError\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ExceedSizeError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LocalizableString\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"LocalizableString\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LocalizableStrings\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"LocalizableStrings\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"HtmlConditionItem\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"HtmlConditionItem\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"UrlConditionItem\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"UrlConditionItem\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ChoicesRestful\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ChoicesRestful\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ChoicesRestfull\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ChoicesRestfull\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FunctionFactory\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"FunctionFactory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"registerFunction\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"registerFunction\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConditionRunner\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ConditionRunner\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ExpressionRunner\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ExpressionRunner\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Operand\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"Operand\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Const\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"Const\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"BinaryOperand\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"BinaryOperand\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Variable\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"Variable\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FunctionOperand\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"FunctionOperand\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ArrayOperand\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ArrayOperand\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConditionsParser\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ConditionsParser\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ProcessValue\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ProcessValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonError\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"JsonError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonIncorrectTypeError\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"JsonIncorrectTypeError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMetadata\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"JsonMetadata\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMetadataClass\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"JsonMetadataClass\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMissingTypeError\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"JsonMissingTypeError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMissingTypeErrorBase\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"JsonMissingTypeErrorBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonObject\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"JsonObject\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonObjectProperty\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"JsonObjectProperty\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonRequiredPropertyError\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"JsonRequiredPropertyError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonUnknownPropertyError\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"JsonUnknownPropertyError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Serializer\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"property\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"property\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"propertyArray\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"propertyArray\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownCell\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDropdownCell\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownColumn\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDropdownColumn\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"matrixDropdownColumnTypes\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"matrixDropdownColumnTypes\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownRowModelBase\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDropdownRowModelBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownModelBase\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownModelBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedCell\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownRenderedCell\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedRow\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownRenderedRow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedTable\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownRenderedTable\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownRowModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDropdownRowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDynamicRowModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDynamicRowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDynamicModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDynamicModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixRowModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"MatrixRowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixCells\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"MatrixCells\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MultipleTextItemModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"MultipleTextItemModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMultipleTextModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMultipleTextModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PanelModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"PanelModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PanelModelBase\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"PanelModelBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRowModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionRowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FlowPanelModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"FlowPanelModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PageModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"PageModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Question\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"Question\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionNonValue\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionNonValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionEmptyModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionEmptyModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxBase\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCheckboxBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionSelectBase\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionSelectBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCheckboxModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRankingModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionRankingModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCommentModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCommentModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionDropdownModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionDropdownModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionFactory\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ElementFactory\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ElementFactory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionFileModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFileModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionHtmlModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionHtmlModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRadiogroupModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionRadiogroupModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRatingModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionRatingModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionExpressionModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionExpressionModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionTextModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionTextModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionBooleanModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionBooleanModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImagePickerModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionImagePickerModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ImageItemValue\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ImageItemValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImageModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionImageModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionSignaturePadModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionSignaturePadModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamicModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionPanelDynamicModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamicItem\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionPanelDynamicItem\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTimer\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTimer\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyProgressButtonsModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyProgressButtonsModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTrigger\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTrigger\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerComplete\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTriggerComplete\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerSetValue\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTriggerSetValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerVisible\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTriggerVisible\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerCopyValue\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTriggerCopyValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerRunExpression\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTriggerRunExpression\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Trigger\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"Trigger\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyWindowModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"SurveyWindowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TextPreProcessor\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"TextPreProcessor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"dxSurveyService\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"dxSurveyService\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"englishStrings\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"englishStrings\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"surveyLocalization\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"surveyStrings\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"surveyStrings\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustomWidget\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCustomWidget\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CustomWidgetCollection\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"CustomWidgetCollection\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustomModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCustomModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCompositeModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCompositeModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ComponentQuestionJSON\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ComponentQuestionJSON\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ComponentCollection\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ComponentCollection\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesManager\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"StylesManager\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ListModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ListModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PopupModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"PopupModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PopupBaseViewModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"PopupBaseViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionButtonGroupModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"QuestionButtonGroupModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ButtonGroupItemModel\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ButtonGroupItemModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ButtonGroupItemValue\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"ButtonGroupItemValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"IsMobile\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"IsMobile\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"confirmAction\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"confirmAction\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"detectIEOrEdge\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"detectIEOrEdge\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"doKey2Click\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"doKey2Click\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"loadFileFromBase64\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"loadFileFromBase64\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createSvg\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"createSvg\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"surveyCss\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"surveyCss\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"DragDropHelper\", function() { return _chunks_model__WEBPACK_IMPORTED_MODULE_0__[\"DragDropHelper\"]; });\n\n/* harmony import */ var _chunks_localization__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./chunks/localization */ \"./src/entries/chunks/localization.ts\");\n/* harmony import */ var _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../defaultCss/cssstandard */ \"./src/defaultCss/cssstandard.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaultStandardCss\", function() { return _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_2__[\"defaultStandardCss\"]; });\n\n/* harmony import */ var _defaultCss_cssbootstrap__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../defaultCss/cssbootstrap */ \"./src/defaultCss/cssbootstrap.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaultBootstrapCss\", function() { return _defaultCss_cssbootstrap__WEBPACK_IMPORTED_MODULE_3__[\"defaultBootstrapCss\"]; });\n\n/* harmony import */ var _defaultCss_cssbootstrapmaterial__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../defaultCss/cssbootstrapmaterial */ \"./src/defaultCss/cssbootstrapmaterial.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaultBootstrapMaterialCss\", function() { return _defaultCss_cssbootstrapmaterial__WEBPACK_IMPORTED_MODULE_4__[\"defaultBootstrapMaterialCss\"]; });\n\n/* harmony import */ var _defaultCss_cssmodern__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../defaultCss/cssmodern */ \"./src/defaultCss/cssmodern.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"modernCss\", function() { return _defaultCss_cssmodern__WEBPACK_IMPORTED_MODULE_5__[\"modernCss\"]; });\n\n/* harmony import */ var _rendererFactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../rendererFactory */ \"./src/rendererFactory.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RendererFactory\", function() { return _rendererFactory__WEBPACK_IMPORTED_MODULE_6__[\"RendererFactory\"]; });\n\n/* harmony import */ var _utils_responsivity_manager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/responsivity-manager */ \"./src/utils/responsivity-manager.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ResponsivityManager\", function() { return _utils_responsivity_manager__WEBPACK_IMPORTED_MODULE_7__[\"ResponsivityManager\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"VerticalResponsivityManager\", function() { return _utils_responsivity_manager__WEBPACK_IMPORTED_MODULE_7__[\"VerticalResponsivityManager\"]; });\n\n/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/utils */ \"./src/utils/utils.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"unwrap\", function() { return _utils_utils__WEBPACK_IMPORTED_MODULE_8__[\"unwrap\"]; });\n\n/* harmony import */ var _actions_action__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../actions/action */ \"./src/actions/action.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Action\", function() { return _actions_action__WEBPACK_IMPORTED_MODULE_9__[\"Action\"]; });\n\n/* harmony import */ var _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../actions/adaptive-container */ \"./src/actions/adaptive-container.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AdaptiveActionContainer\", function() { return _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_10__[\"AdaptiveActionContainer\"]; });\n\n/* harmony import */ var _actions_container__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../actions/container */ \"./src/actions/container.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionContainer\", function() { return _actions_container__WEBPACK_IMPORTED_MODULE_11__[\"ActionContainer\"]; });\n\n// model\n\n// localization\n\n// css standard classes\n\n// css bootstrap classes\n\n// css bootstrap + material classes\n\n// css modern classes\n\n// utils\n\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"./src/entries/knockout-ui.ts\":\n/*!************************************!*\\\n !*** ./src/entries/knockout-ui.ts ***!\n \\************************************/\n/*! exports provided: Survey, Model, ImplementorBase, QuestionRow, Page, Panel, FlowPanel, QuestionImplementor, QuestionSelectBaseImplementor, QuestionCheckboxBaseImplementor, QuestionCheckbox, QuestionRanking, QuestionComment, QuestionDropdown, QuestionFile, QuestionHtml, QuestionMatrix, QuestionMatrixDropdown, QuestionMatrixDynamicImplementor, QuestionMatrixDynamic, QuestionPanelDynamic, MultipleTextItem, QuestionMultipleText, QuestionRadiogroup, QuestionRating, QuestionRatingImplementor, QuestionText, QuestionBoolean, QuestionEmpty, QuestionExpression, QuestionImagePicker, SurveyWindow, SurveyTemplateText, QuestionImage, QuestionSignaturePad, QuestionCustom, QuestionButtonGroup, ActionBarItemViewModel, ActionBarItemDropdownViewModel, ActionBarSeparatorViewModel, ActionBarViewModel, AdaptiveElementImplementor, CheckboxViewModel, DefaultTitleViewModel, PanelViewModel, PopupViewModel, showModal, ProgressButtonsViewModel, progressProgressViewModel, TitleActionViewModel, StringEditorViewModel, StringViewerViewModel, LogoImageViewModel, ListViewComponent, SvgIconViewModel, SurveyQuestionMatrixDynamicRemoveButton, SurveyQuestionMatrixDetailButton, SurveyQuestionMatrixDynamicDragDropIcon, ButtonGroupItemViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _knockout_kosurvey__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../knockout/kosurvey */ \"./src/knockout/kosurvey.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Survey\", function() { return _knockout_kosurvey__WEBPACK_IMPORTED_MODULE_0__[\"Survey\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Model\", function() { return _knockout_kosurvey__WEBPACK_IMPORTED_MODULE_0__[\"Survey\"]; });\n\n/* harmony import */ var _knockout_kobase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../knockout/kobase */ \"./src/knockout/kobase.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ImplementorBase\", function() { return _knockout_kobase__WEBPACK_IMPORTED_MODULE_1__[\"ImplementorBase\"]; });\n\n/* harmony import */ var _knockout_kopage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../knockout/kopage */ \"./src/knockout/kopage.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRow\", function() { return _knockout_kopage__WEBPACK_IMPORTED_MODULE_2__[\"QuestionRow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Page\", function() { return _knockout_kopage__WEBPACK_IMPORTED_MODULE_2__[\"Page\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Panel\", function() { return _knockout_kopage__WEBPACK_IMPORTED_MODULE_2__[\"Panel\"]; });\n\n/* harmony import */ var _knockout_koflowpanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../knockout/koflowpanel */ \"./src/knockout/koflowpanel.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FlowPanel\", function() { return _knockout_koflowpanel__WEBPACK_IMPORTED_MODULE_3__[\"FlowPanel\"]; });\n\n/* harmony import */ var _knockout_koquestion__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../knockout/koquestion */ \"./src/knockout/koquestion.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImplementor\", function() { return _knockout_koquestion__WEBPACK_IMPORTED_MODULE_4__[\"QuestionImplementor\"]; });\n\n/* harmony import */ var _knockout_koquestion_baseselect__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../knockout/koquestion_baseselect */ \"./src/knockout/koquestion_baseselect.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionSelectBaseImplementor\", function() { return _knockout_koquestion_baseselect__WEBPACK_IMPORTED_MODULE_5__[\"QuestionSelectBaseImplementor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxBaseImplementor\", function() { return _knockout_koquestion_baseselect__WEBPACK_IMPORTED_MODULE_5__[\"QuestionCheckboxBaseImplementor\"]; });\n\n/* harmony import */ var _knockout_koquestion_checkbox__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../knockout/koquestion_checkbox */ \"./src/knockout/koquestion_checkbox.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckbox\", function() { return _knockout_koquestion_checkbox__WEBPACK_IMPORTED_MODULE_6__[\"QuestionCheckbox\"]; });\n\n/* harmony import */ var _knockout_koquestion_ranking__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../knockout/koquestion_ranking */ \"./src/knockout/koquestion_ranking.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRanking\", function() { return _knockout_koquestion_ranking__WEBPACK_IMPORTED_MODULE_7__[\"QuestionRanking\"]; });\n\n/* harmony import */ var _knockout_koquestion_comment__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../knockout/koquestion_comment */ \"./src/knockout/koquestion_comment.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionComment\", function() { return _knockout_koquestion_comment__WEBPACK_IMPORTED_MODULE_8__[\"QuestionComment\"]; });\n\n/* harmony import */ var _knockout_koquestion_dropdown__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../knockout/koquestion_dropdown */ \"./src/knockout/koquestion_dropdown.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionDropdown\", function() { return _knockout_koquestion_dropdown__WEBPACK_IMPORTED_MODULE_9__[\"QuestionDropdown\"]; });\n\n/* harmony import */ var _knockout_koquestion_file__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../knockout/koquestion_file */ \"./src/knockout/koquestion_file.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionFile\", function() { return _knockout_koquestion_file__WEBPACK_IMPORTED_MODULE_10__[\"QuestionFile\"]; });\n\n/* harmony import */ var _knockout_koquestion_html__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../knockout/koquestion_html */ \"./src/knockout/koquestion_html.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionHtml\", function() { return _knockout_koquestion_html__WEBPACK_IMPORTED_MODULE_11__[\"QuestionHtml\"]; });\n\n/* harmony import */ var _knockout_koquestion_matrix__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../knockout/koquestion_matrix */ \"./src/knockout/koquestion_matrix.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrix\", function() { return _knockout_koquestion_matrix__WEBPACK_IMPORTED_MODULE_12__[\"QuestionMatrix\"]; });\n\n/* harmony import */ var _knockout_koquestion_matrixdropdown__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../knockout/koquestion_matrixdropdown */ \"./src/knockout/koquestion_matrixdropdown.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdown\", function() { return _knockout_koquestion_matrixdropdown__WEBPACK_IMPORTED_MODULE_13__[\"QuestionMatrixDropdown\"]; });\n\n/* harmony import */ var _knockout_koquestion_matrixdynamic__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../knockout/koquestion_matrixdynamic */ \"./src/knockout/koquestion_matrixdynamic.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDynamicImplementor\", function() { return _knockout_koquestion_matrixdynamic__WEBPACK_IMPORTED_MODULE_14__[\"QuestionMatrixDynamicImplementor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDynamic\", function() { return _knockout_koquestion_matrixdynamic__WEBPACK_IMPORTED_MODULE_14__[\"QuestionMatrixDynamic\"]; });\n\n/* harmony import */ var _knockout_koquestion_paneldynamic__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../knockout/koquestion_paneldynamic */ \"./src/knockout/koquestion_paneldynamic.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamic\", function() { return _knockout_koquestion_paneldynamic__WEBPACK_IMPORTED_MODULE_15__[\"QuestionPanelDynamic\"]; });\n\n/* harmony import */ var _knockout_koquestion_multipletext__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../knockout/koquestion_multipletext */ \"./src/knockout/koquestion_multipletext.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MultipleTextItem\", function() { return _knockout_koquestion_multipletext__WEBPACK_IMPORTED_MODULE_16__[\"MultipleTextItem\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMultipleText\", function() { return _knockout_koquestion_multipletext__WEBPACK_IMPORTED_MODULE_16__[\"QuestionMultipleText\"]; });\n\n/* harmony import */ var _knockout_koquestion_radiogroup__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../knockout/koquestion_radiogroup */ \"./src/knockout/koquestion_radiogroup.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRadiogroup\", function() { return _knockout_koquestion_radiogroup__WEBPACK_IMPORTED_MODULE_17__[\"QuestionRadiogroup\"]; });\n\n/* harmony import */ var _knockout_koquestion_rating__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../knockout/koquestion_rating */ \"./src/knockout/koquestion_rating.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRating\", function() { return _knockout_koquestion_rating__WEBPACK_IMPORTED_MODULE_18__[\"QuestionRating\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRatingImplementor\", function() { return _knockout_koquestion_rating__WEBPACK_IMPORTED_MODULE_18__[\"QuestionRatingImplementor\"]; });\n\n/* harmony import */ var _knockout_koquestion_text__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../knockout/koquestion_text */ \"./src/knockout/koquestion_text.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionText\", function() { return _knockout_koquestion_text__WEBPACK_IMPORTED_MODULE_19__[\"QuestionText\"]; });\n\n/* harmony import */ var _knockout_koquestion_boolean__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../knockout/koquestion_boolean */ \"./src/knockout/koquestion_boolean.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionBoolean\", function() { return _knockout_koquestion_boolean__WEBPACK_IMPORTED_MODULE_20__[\"QuestionBoolean\"]; });\n\n/* harmony import */ var _knockout_koquestion_empty__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../knockout/koquestion_empty */ \"./src/knockout/koquestion_empty.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionEmpty\", function() { return _knockout_koquestion_empty__WEBPACK_IMPORTED_MODULE_21__[\"QuestionEmpty\"]; });\n\n/* harmony import */ var _knockout_koquestion_expression__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../knockout/koquestion_expression */ \"./src/knockout/koquestion_expression.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionExpression\", function() { return _knockout_koquestion_expression__WEBPACK_IMPORTED_MODULE_22__[\"QuestionExpression\"]; });\n\n/* harmony import */ var _knockout_koquestion_imagepicker__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../knockout/koquestion_imagepicker */ \"./src/knockout/koquestion_imagepicker.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImagePicker\", function() { return _knockout_koquestion_imagepicker__WEBPACK_IMPORTED_MODULE_23__[\"QuestionImagePicker\"]; });\n\n/* harmony import */ var _knockout_koSurveyWindow__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../knockout/koSurveyWindow */ \"./src/knockout/koSurveyWindow.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyWindow\", function() { return _knockout_koSurveyWindow__WEBPACK_IMPORTED_MODULE_24__[\"SurveyWindow\"]; });\n\n/* harmony import */ var _knockout_templateText__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../knockout/templateText */ \"./src/knockout/templateText.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTemplateText\", function() { return _knockout_templateText__WEBPACK_IMPORTED_MODULE_25__[\"SurveyTemplateText\"]; });\n\n/* harmony import */ var _knockout_koquestion_image__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../knockout/koquestion_image */ \"./src/knockout/koquestion_image.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImage\", function() { return _knockout_koquestion_image__WEBPACK_IMPORTED_MODULE_26__[\"QuestionImage\"]; });\n\n/* harmony import */ var _knockout_koquestion_signaturepad__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../knockout/koquestion_signaturepad */ \"./src/knockout/koquestion_signaturepad.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionSignaturePad\", function() { return _knockout_koquestion_signaturepad__WEBPACK_IMPORTED_MODULE_27__[\"QuestionSignaturePad\"]; });\n\n/* harmony import */ var _knockout_koquestion_custom__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../knockout/koquestion_custom */ \"./src/knockout/koquestion_custom.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustom\", function() { return _knockout_koquestion_custom__WEBPACK_IMPORTED_MODULE_28__[\"QuestionCustom\"]; });\n\n/* harmony import */ var _knockout_koquestion_buttongroup__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../knockout/koquestion_buttongroup */ \"./src/knockout/koquestion_buttongroup.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionButtonGroup\", function() { return _knockout_koquestion_buttongroup__WEBPACK_IMPORTED_MODULE_29__[\"QuestionButtonGroup\"]; });\n\n/* harmony import */ var _knockout_components_action_bar_action_bar__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../knockout/components/action-bar/action-bar */ \"./src/knockout/components/action-bar/action-bar.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionBarItemViewModel\", function() { return _knockout_components_action_bar_action_bar__WEBPACK_IMPORTED_MODULE_30__[\"ActionBarItemViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionBarItemDropdownViewModel\", function() { return _knockout_components_action_bar_action_bar__WEBPACK_IMPORTED_MODULE_30__[\"ActionBarItemDropdownViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionBarSeparatorViewModel\", function() { return _knockout_components_action_bar_action_bar__WEBPACK_IMPORTED_MODULE_30__[\"ActionBarSeparatorViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionBarViewModel\", function() { return _knockout_components_action_bar_action_bar__WEBPACK_IMPORTED_MODULE_30__[\"ActionBarViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AdaptiveElementImplementor\", function() { return _knockout_components_action_bar_action_bar__WEBPACK_IMPORTED_MODULE_30__[\"AdaptiveElementImplementor\"]; });\n\n/* harmony import */ var _knockout_components_boolean_checkbox_boolean_checkbox__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../knockout/components/boolean-checkbox/boolean-checkbox */ \"./src/knockout/components/boolean-checkbox/boolean-checkbox.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CheckboxViewModel\", function() { return _knockout_components_boolean_checkbox_boolean_checkbox__WEBPACK_IMPORTED_MODULE_31__[\"CheckboxViewModel\"]; });\n\n/* harmony import */ var _knockout_components_default_title_default_title__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../knockout/components/default-title/default-title */ \"./src/knockout/components/default-title/default-title.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"DefaultTitleViewModel\", function() { return _knockout_components_default_title_default_title__WEBPACK_IMPORTED_MODULE_32__[\"DefaultTitleViewModel\"]; });\n\n/* harmony import */ var _knockout_components_panel_panel__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../knockout/components/panel/panel */ \"./src/knockout/components/panel/panel.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PanelViewModel\", function() { return _knockout_components_panel_panel__WEBPACK_IMPORTED_MODULE_33__[\"PanelViewModel\"]; });\n\n/* harmony import */ var _knockout_components_popup_popup__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../knockout/components/popup/popup */ \"./src/knockout/components/popup/popup.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PopupViewModel\", function() { return _knockout_components_popup_popup__WEBPACK_IMPORTED_MODULE_34__[\"PopupViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"showModal\", function() { return _knockout_components_popup_popup__WEBPACK_IMPORTED_MODULE_34__[\"showModal\"]; });\n\n/* harmony import */ var _knockout_components_progress_buttons__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../knockout/components/progress/buttons */ \"./src/knockout/components/progress/buttons.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ProgressButtonsViewModel\", function() { return _knockout_components_progress_buttons__WEBPACK_IMPORTED_MODULE_35__[\"ProgressButtonsViewModel\"]; });\n\n/* harmony import */ var _knockout_components_progress_progress__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ../knockout/components/progress/progress */ \"./src/knockout/components/progress/progress.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"progressProgressViewModel\", function() { return _knockout_components_progress_progress__WEBPACK_IMPORTED_MODULE_36__[\"progressProgressViewModel\"]; });\n\n/* harmony import */ var _knockout_components_template_renderer_template_renderer__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ../knockout/components/template-renderer/template-renderer */ \"./src/knockout/components/template-renderer/template-renderer.ts\");\n/* empty/unused harmony star reexport *//* harmony import */ var _knockout_components_title_actions_title_actions__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ../knockout/components/title-actions/title-actions */ \"./src/knockout/components/title-actions/title-actions.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TitleActionViewModel\", function() { return _knockout_components_title_actions_title_actions__WEBPACK_IMPORTED_MODULE_38__[\"TitleActionViewModel\"]; });\n\n/* harmony import */ var _knockout_components_string_editor_string_editor__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ../knockout/components/string-editor/string-editor */ \"./src/knockout/components/string-editor/string-editor.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StringEditorViewModel\", function() { return _knockout_components_string_editor_string_editor__WEBPACK_IMPORTED_MODULE_39__[\"StringEditorViewModel\"]; });\n\n/* harmony import */ var _knockout_components_string_viewer_string_viewer__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../knockout/components/string-viewer/string-viewer */ \"./src/knockout/components/string-viewer/string-viewer.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StringViewerViewModel\", function() { return _knockout_components_string_viewer_string_viewer__WEBPACK_IMPORTED_MODULE_40__[\"StringViewerViewModel\"]; });\n\n/* harmony import */ var _knockout_components_logo_image_logo_image__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../knockout/components/logo-image/logo-image */ \"./src/knockout/components/logo-image/logo-image.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LogoImageViewModel\", function() { return _knockout_components_logo_image_logo_image__WEBPACK_IMPORTED_MODULE_41__[\"LogoImageViewModel\"]; });\n\n/* empty/unused harmony star reexport *//* harmony import */ var _knockout_components_list_list__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../knockout/components/list/list */ \"./src/knockout/components/list/list.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ListViewComponent\", function() { return _knockout_components_list_list__WEBPACK_IMPORTED_MODULE_42__[\"ListViewComponent\"]; });\n\n/* harmony import */ var _knockout_components_svg_icon_svg_icon__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ../knockout/components/svg-icon/svg-icon */ \"./src/knockout/components/svg-icon/svg-icon.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SvgIconViewModel\", function() { return _knockout_components_svg_icon_svg_icon__WEBPACK_IMPORTED_MODULE_43__[\"SvgIconViewModel\"]; });\n\n/* harmony import */ var _knockout_components_matrix_actions_remove_button_remove_button__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../knockout/components/matrix-actions/remove-button/remove-button */ \"./src/knockout/components/matrix-actions/remove-button/remove-button.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyQuestionMatrixDynamicRemoveButton\", function() { return _knockout_components_matrix_actions_remove_button_remove_button__WEBPACK_IMPORTED_MODULE_44__[\"SurveyQuestionMatrixDynamicRemoveButton\"]; });\n\n/* harmony import */ var _knockout_components_matrix_actions_detail_button_detail_button__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../knockout/components/matrix-actions/detail-button/detail-button */ \"./src/knockout/components/matrix-actions/detail-button/detail-button.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyQuestionMatrixDetailButton\", function() { return _knockout_components_matrix_actions_detail_button_detail_button__WEBPACK_IMPORTED_MODULE_45__[\"SurveyQuestionMatrixDetailButton\"]; });\n\n/* harmony import */ var _knockout_components_matrix_actions_drag_drop_icon_drag_drop_icon__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../knockout/components/matrix-actions/drag-drop-icon/drag-drop-icon */ \"./src/knockout/components/matrix-actions/drag-drop-icon/drag-drop-icon.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyQuestionMatrixDynamicDragDropIcon\", function() { return _knockout_components_matrix_actions_drag_drop_icon_drag_drop_icon__WEBPACK_IMPORTED_MODULE_46__[\"SurveyQuestionMatrixDynamicDragDropIcon\"]; });\n\n/* harmony import */ var _knockout_components_button_group_button_group_item__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../knockout/components/button-group/button-group-item */ \"./src/knockout/components/button-group/button-group-item.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ButtonGroupItemViewModel\", function() { return _knockout_components_button_group_button_group_item__WEBPACK_IMPORTED_MODULE_47__[\"ButtonGroupItemViewModel\"]; });\n\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_48___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_48__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/*\n// model\nexport * from \"./chunks/model\";\n\n// localization\nimport \"./chunks/localization\";\n\n// helpers\nexport * from \"./chunks/helpers\";\n\n// css standard\nexport { defaultStandardCss } from \"../defaultCss/cssstandard\";\n// css bootstrap\nexport { defaultBootstrapCss } from \"../defaultCss/cssbootstrap\";\n// css bootstrap + material\nexport { defaultBootstrapMaterialCss } from \"../defaultCss/cssbootstrapmaterial\";\nexport { modernCss } from \"../defaultCss/cssmodern\";\n*/\n// knockout\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//export * from \"../utils/resonsibilitymanager\";\n//export { unwrap } from \"../utils/utils\";\n//Uncomment to include the \"date\" question type.\n//export {QuestionDate} from \"../plugins/knockout/koquestion_date\";\n\n\n\nObject(_knockout_kosurvey__WEBPACK_IMPORTED_MODULE_0__[\"registerTemplateEngine\"])(knockout__WEBPACK_IMPORTED_MODULE_48__, survey_core__WEBPACK_IMPORTED_MODULE_49__[\"SurveyModel\"].platform);\n\n\n/***/ }),\n\n/***/ \"./src/entries/knockout.ts\":\n/*!*********************************!*\\\n !*** ./src/entries/knockout.ts ***!\n \\*********************************/\n/*! exports provided: Version, settings, Helpers, AnswerCountValidator, EmailValidator, NumericValidator, RegexValidator, SurveyValidator, TextValidator, ValidatorResult, ExpressionValidator, ValidatorRunner, ItemValue, Base, Event, ArrayChanges, SurveyError, SurveyElement, CalculatedValue, CustomError, AnswerRequiredError, OneAnswerRequiredError, RequreNumericError, ExceedSizeError, LocalizableString, LocalizableStrings, HtmlConditionItem, UrlConditionItem, ChoicesRestful, ChoicesRestfull, FunctionFactory, registerFunction, ConditionRunner, ExpressionRunner, Operand, Const, BinaryOperand, Variable, FunctionOperand, ArrayOperand, ConditionsParser, ProcessValue, JsonError, JsonIncorrectTypeError, JsonMetadata, JsonMetadataClass, JsonMissingTypeError, JsonMissingTypeErrorBase, JsonObject, JsonObjectProperty, JsonRequiredPropertyError, JsonUnknownPropertyError, Serializer, property, propertyArray, MatrixDropdownCell, MatrixDropdownColumn, matrixDropdownColumnTypes, MatrixDropdownRowModelBase, QuestionMatrixDropdownModelBase, QuestionMatrixDropdownRenderedCell, QuestionMatrixDropdownRenderedRow, QuestionMatrixDropdownRenderedTable, MatrixDropdownRowModel, QuestionMatrixDropdownModel, MatrixDynamicRowModel, QuestionMatrixDynamicModel, MatrixRowModel, MatrixCells, QuestionMatrixModel, MultipleTextItemModel, QuestionMultipleTextModel, PanelModel, PanelModelBase, QuestionRowModel, FlowPanelModel, PageModel, Question, QuestionNonValue, QuestionEmptyModel, QuestionCheckboxBase, QuestionSelectBase, QuestionCheckboxModel, QuestionRankingModel, QuestionCommentModel, QuestionDropdownModel, QuestionFactory, ElementFactory, QuestionFileModel, QuestionHtmlModel, QuestionRadiogroupModel, QuestionRatingModel, QuestionExpressionModel, QuestionTextModel, QuestionBooleanModel, QuestionImagePickerModel, ImageItemValue, QuestionImageModel, QuestionSignaturePadModel, QuestionPanelDynamicModel, QuestionPanelDynamicItem, SurveyTimer, SurveyProgressButtonsModel, SurveyModel, SurveyTrigger, SurveyTriggerComplete, SurveyTriggerSetValue, SurveyTriggerVisible, SurveyTriggerCopyValue, SurveyTriggerRunExpression, Trigger, SurveyWindowModel, TextPreProcessor, dxSurveyService, englishStrings, surveyLocalization, surveyStrings, QuestionCustomWidget, CustomWidgetCollection, QuestionCustomModel, QuestionCompositeModel, ComponentQuestionJSON, ComponentCollection, StylesManager, ListModel, PopupModel, PopupBaseViewModel, QuestionButtonGroupModel, ButtonGroupItemModel, ButtonGroupItemValue, IsMobile, confirmAction, detectIEOrEdge, doKey2Click, loadFileFromBase64, createSvg, surveyCss, DragDropHelper, defaultStandardCss, defaultBootstrapCss, defaultBootstrapMaterialCss, modernCss, RendererFactory, ResponsivityManager, VerticalResponsivityManager, unwrap, Action, AdaptiveActionContainer, ActionContainer, Survey, Model, ImplementorBase, QuestionRow, Page, Panel, FlowPanel, QuestionImplementor, QuestionSelectBaseImplementor, QuestionCheckboxBaseImplementor, QuestionCheckbox, QuestionRanking, QuestionComment, QuestionDropdown, QuestionFile, QuestionHtml, QuestionMatrix, QuestionMatrixDropdown, QuestionMatrixDynamicImplementor, QuestionMatrixDynamic, QuestionPanelDynamic, MultipleTextItem, QuestionMultipleText, QuestionRadiogroup, QuestionRating, QuestionRatingImplementor, QuestionText, QuestionBoolean, QuestionEmpty, QuestionExpression, QuestionImagePicker, SurveyWindow, SurveyTemplateText, QuestionImage, QuestionSignaturePad, QuestionCustom, QuestionButtonGroup, ActionBarItemViewModel, ActionBarItemDropdownViewModel, ActionBarSeparatorViewModel, ActionBarViewModel, AdaptiveElementImplementor, CheckboxViewModel, DefaultTitleViewModel, PanelViewModel, PopupViewModel, showModal, ProgressButtonsViewModel, progressProgressViewModel, TitleActionViewModel, StringEditorViewModel, StringViewerViewModel, LogoImageViewModel, ListViewComponent, SvgIconViewModel, SurveyQuestionMatrixDynamicRemoveButton, SurveyQuestionMatrixDetailButton, SurveyQuestionMatrixDynamicDragDropIcon, ButtonGroupItemViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./core */ \"./src/entries/core.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Version\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"Version\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"settings\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"settings\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Helpers\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AnswerCountValidator\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"AnswerCountValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"EmailValidator\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"EmailValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"NumericValidator\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"NumericValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RegexValidator\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"RegexValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyValidator\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TextValidator\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"TextValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ValidatorResult\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ValidatorResult\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ExpressionValidator\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ExpressionValidator\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ValidatorRunner\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ValidatorRunner\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ItemValue\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ItemValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Base\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"Base\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Event\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"Event\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ArrayChanges\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ArrayChanges\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyError\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyElement\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyElement\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CalculatedValue\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"CalculatedValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CustomError\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"CustomError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AnswerRequiredError\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"AnswerRequiredError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"OneAnswerRequiredError\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"OneAnswerRequiredError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RequreNumericError\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"RequreNumericError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ExceedSizeError\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ExceedSizeError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LocalizableString\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"LocalizableString\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LocalizableStrings\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"LocalizableStrings\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"HtmlConditionItem\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"HtmlConditionItem\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"UrlConditionItem\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"UrlConditionItem\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ChoicesRestful\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ChoicesRestful\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ChoicesRestfull\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ChoicesRestfull\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FunctionFactory\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"FunctionFactory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"registerFunction\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"registerFunction\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConditionRunner\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ConditionRunner\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ExpressionRunner\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ExpressionRunner\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Operand\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"Operand\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Const\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"Const\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"BinaryOperand\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"BinaryOperand\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Variable\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"Variable\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FunctionOperand\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"FunctionOperand\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ArrayOperand\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ArrayOperand\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ConditionsParser\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ConditionsParser\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ProcessValue\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ProcessValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonError\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"JsonError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonIncorrectTypeError\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"JsonIncorrectTypeError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMetadata\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"JsonMetadata\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMetadataClass\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"JsonMetadataClass\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMissingTypeError\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"JsonMissingTypeError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonMissingTypeErrorBase\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"JsonMissingTypeErrorBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonObject\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"JsonObject\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonObjectProperty\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"JsonObjectProperty\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonRequiredPropertyError\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"JsonRequiredPropertyError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"JsonUnknownPropertyError\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"JsonUnknownPropertyError\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Serializer\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"property\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"property\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"propertyArray\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"propertyArray\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownCell\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDropdownCell\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownColumn\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDropdownColumn\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"matrixDropdownColumnTypes\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"matrixDropdownColumnTypes\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownRowModelBase\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDropdownRowModelBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownModelBase\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownModelBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedCell\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownRenderedCell\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedRow\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownRenderedRow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedTable\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownRenderedTable\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownRowModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDropdownRowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixDynamicRowModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDynamicRowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDynamicModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDynamicModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixRowModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"MatrixRowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MatrixCells\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"MatrixCells\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MultipleTextItemModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"MultipleTextItemModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMultipleTextModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMultipleTextModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PanelModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"PanelModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PanelModelBase\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"PanelModelBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRowModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionRowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FlowPanelModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"FlowPanelModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PageModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"PageModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Question\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"Question\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionNonValue\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionNonValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionEmptyModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionEmptyModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxBase\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCheckboxBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionSelectBase\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionSelectBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCheckboxModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRankingModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionRankingModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCommentModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCommentModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionDropdownModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionDropdownModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionFactory\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ElementFactory\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ElementFactory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionFileModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFileModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionHtmlModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionHtmlModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRadiogroupModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionRadiogroupModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRatingModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionRatingModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionExpressionModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionExpressionModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionTextModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionTextModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionBooleanModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionBooleanModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImagePickerModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionImagePickerModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ImageItemValue\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ImageItemValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImageModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionImageModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionSignaturePadModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionSignaturePadModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamicModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionPanelDynamicModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamicItem\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionPanelDynamicItem\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTimer\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTimer\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyProgressButtonsModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyProgressButtonsModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTrigger\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTrigger\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerComplete\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTriggerComplete\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerSetValue\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTriggerSetValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerVisible\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTriggerVisible\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerCopyValue\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTriggerCopyValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerRunExpression\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyTriggerRunExpression\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Trigger\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"Trigger\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyWindowModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"SurveyWindowModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TextPreProcessor\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"TextPreProcessor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"dxSurveyService\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"dxSurveyService\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"englishStrings\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"englishStrings\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"surveyLocalization\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"surveyStrings\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"surveyStrings\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustomWidget\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCustomWidget\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CustomWidgetCollection\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"CustomWidgetCollection\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustomModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCustomModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCompositeModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCompositeModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ComponentQuestionJSON\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ComponentQuestionJSON\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ComponentCollection\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ComponentCollection\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StylesManager\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"StylesManager\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ListModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ListModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PopupModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"PopupModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PopupBaseViewModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"PopupBaseViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionButtonGroupModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionButtonGroupModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ButtonGroupItemModel\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ButtonGroupItemModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ButtonGroupItemValue\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ButtonGroupItemValue\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"IsMobile\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"IsMobile\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"confirmAction\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"confirmAction\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"detectIEOrEdge\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"detectIEOrEdge\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"doKey2Click\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"doKey2Click\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"loadFileFromBase64\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"loadFileFromBase64\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"createSvg\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"createSvg\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"surveyCss\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"surveyCss\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"DragDropHelper\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"DragDropHelper\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaultStandardCss\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"defaultStandardCss\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaultBootstrapCss\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"defaultBootstrapCss\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"defaultBootstrapMaterialCss\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"defaultBootstrapMaterialCss\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"modernCss\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"modernCss\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"RendererFactory\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"RendererFactory\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ResponsivityManager\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ResponsivityManager\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"VerticalResponsivityManager\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"VerticalResponsivityManager\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"unwrap\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Action\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"Action\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AdaptiveActionContainer\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"AdaptiveActionContainer\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionContainer\", function() { return _core__WEBPACK_IMPORTED_MODULE_0__[\"ActionContainer\"]; });\n\n/* harmony import */ var _knockout_ui__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./knockout-ui */ \"./src/entries/knockout-ui.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Survey\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"Survey\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Model\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"Model\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ImplementorBase\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"ImplementorBase\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRow\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionRow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Page\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"Page\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"Panel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"Panel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"FlowPanel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"FlowPanel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImplementor\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionSelectBaseImplementor\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionSelectBaseImplementor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxBaseImplementor\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionCheckboxBaseImplementor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckbox\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionCheckbox\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRanking\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionRanking\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionComment\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionComment\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionDropdown\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionDropdown\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionFile\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFile\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionHtml\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionHtml\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrix\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMatrix\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdown\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMatrixDropdown\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDynamicImplementor\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMatrixDynamicImplementor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDynamic\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMatrixDynamic\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamic\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionPanelDynamic\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"MultipleTextItem\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"MultipleTextItem\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionMultipleText\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMultipleText\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRadiogroup\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionRadiogroup\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRating\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionRating\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionRatingImplementor\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionRatingImplementor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionText\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionText\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionBoolean\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionBoolean\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionEmpty\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionEmpty\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionExpression\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionExpression\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImagePicker\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImagePicker\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyWindow\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"SurveyWindow\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyTemplateText\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"SurveyTemplateText\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionImage\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImage\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionSignaturePad\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionSignaturePad\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustom\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionCustom\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"QuestionButtonGroup\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"QuestionButtonGroup\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionBarItemViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"ActionBarItemViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionBarItemDropdownViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"ActionBarItemDropdownViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionBarSeparatorViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"ActionBarSeparatorViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionBarViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"ActionBarViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"AdaptiveElementImplementor\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"AdaptiveElementImplementor\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"CheckboxViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"CheckboxViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"DefaultTitleViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"DefaultTitleViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PanelViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"PanelViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"PopupViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"PopupViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"showModal\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"showModal\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ProgressButtonsViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"ProgressButtonsViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"progressProgressViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"progressProgressViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"TitleActionViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"TitleActionViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StringEditorViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"StringEditorViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"StringViewerViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"StringViewerViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"LogoImageViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"LogoImageViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ListViewComponent\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"ListViewComponent\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SvgIconViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"SvgIconViewModel\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyQuestionMatrixDynamicRemoveButton\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"SurveyQuestionMatrixDynamicRemoveButton\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyQuestionMatrixDetailButton\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"SurveyQuestionMatrixDetailButton\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"SurveyQuestionMatrixDynamicDragDropIcon\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"SurveyQuestionMatrixDynamicDragDropIcon\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ButtonGroupItemViewModel\", function() { return _knockout_ui__WEBPACK_IMPORTED_MODULE_1__[\"ButtonGroupItemViewModel\"]; });\n\n\n\n\n\n/***/ }),\n\n/***/ \"./src/error.ts\":\n/*!**********************!*\\\n !*** ./src/error.ts ***!\n \\**********************/\n/*! exports provided: AnswerRequiredError, OneAnswerRequiredError, RequreNumericError, ExceedSizeError, WebRequestError, WebRequestEmptyError, OtherEmptyError, UploadingFileError, RequiredInAllRowsError, MinRowCountError, KeyDuplicationError, CustomError */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AnswerRequiredError\", function() { return AnswerRequiredError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"OneAnswerRequiredError\", function() { return OneAnswerRequiredError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RequreNumericError\", function() { return RequreNumericError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ExceedSizeError\", function() { return ExceedSizeError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"WebRequestError\", function() { return WebRequestError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"WebRequestEmptyError\", function() { return WebRequestEmptyError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"OtherEmptyError\", function() { return OtherEmptyError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"UploadingFileError\", function() { return UploadingFileError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RequiredInAllRowsError\", function() { return RequiredInAllRowsError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MinRowCountError\", function() { return MinRowCountError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"KeyDuplicationError\", function() { return KeyDuplicationError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CustomError\", function() { return CustomError; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _survey_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./survey-error */ \"./src/survey-error.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar AnswerRequiredError = /** @class */ (function (_super) {\n __extends(AnswerRequiredError, _super);\n function AnswerRequiredError(text, errorOwner) {\n if (text === void 0) { text = null; }\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, text, errorOwner) || this;\n _this.text = text;\n return _this;\n }\n AnswerRequiredError.prototype.getErrorType = function () {\n return \"required\";\n };\n AnswerRequiredError.prototype.getDefaultText = function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"requiredError\");\n };\n return AnswerRequiredError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\nvar OneAnswerRequiredError = /** @class */ (function (_super) {\n __extends(OneAnswerRequiredError, _super);\n function OneAnswerRequiredError(text, errorOwner) {\n if (text === void 0) { text = null; }\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, text, errorOwner) || this;\n _this.text = text;\n return _this;\n }\n OneAnswerRequiredError.prototype.getErrorType = function () {\n return \"requireoneanswer\";\n };\n OneAnswerRequiredError.prototype.getDefaultText = function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"requiredErrorInPanel\");\n };\n return OneAnswerRequiredError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\nvar RequreNumericError = /** @class */ (function (_super) {\n __extends(RequreNumericError, _super);\n function RequreNumericError(text, errorOwner) {\n if (text === void 0) { text = null; }\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, text, errorOwner) || this;\n _this.text = text;\n return _this;\n }\n RequreNumericError.prototype.getErrorType = function () {\n return \"requirenumeric\";\n };\n RequreNumericError.prototype.getDefaultText = function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"numericError\");\n };\n return RequreNumericError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\nvar ExceedSizeError = /** @class */ (function (_super) {\n __extends(ExceedSizeError, _super);\n function ExceedSizeError(maxSize, errorOwner) {\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, null, errorOwner) || this;\n _this.maxSize = maxSize;\n _this.locText.text = _this.getText();\n return _this;\n }\n ExceedSizeError.prototype.getErrorType = function () {\n return \"exceedsize\";\n };\n ExceedSizeError.prototype.getDefaultText = function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"]\n .getString(\"exceedMaxSize\")[\"format\"](this.getTextSize());\n };\n ExceedSizeError.prototype.getTextSize = function () {\n var sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n var fixed = [0, 0, 2, 3, 3];\n if (this.maxSize === 0) {\n return \"0 Byte\";\n }\n var i = Math.floor(Math.log(this.maxSize) / Math.log(1024));\n var value = this.maxSize / Math.pow(1024, i);\n return value.toFixed(fixed[i]) + \" \" + sizes[i];\n };\n return ExceedSizeError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\nvar WebRequestError = /** @class */ (function (_super) {\n __extends(WebRequestError, _super);\n function WebRequestError(status, response, errorOwner) {\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, null, errorOwner) || this;\n _this.status = status;\n _this.response = response;\n return _this;\n }\n WebRequestError.prototype.getErrorType = function () {\n return \"webrequest\";\n };\n WebRequestError.prototype.getDefaultText = function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"]\n .getString(\"urlRequestError\")[\"format\"](this.status, this.response);\n };\n return WebRequestError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\nvar WebRequestEmptyError = /** @class */ (function (_super) {\n __extends(WebRequestEmptyError, _super);\n function WebRequestEmptyError(text, errorOwner) {\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, text, errorOwner) || this;\n _this.text = text;\n return _this;\n }\n WebRequestEmptyError.prototype.getErrorType = function () {\n return \"webrequestempty\";\n };\n WebRequestEmptyError.prototype.getDefaultText = function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"urlGetChoicesError\");\n };\n return WebRequestEmptyError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\nvar OtherEmptyError = /** @class */ (function (_super) {\n __extends(OtherEmptyError, _super);\n function OtherEmptyError(text, errorOwner) {\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, text, errorOwner) || this;\n _this.text = text;\n return _this;\n }\n OtherEmptyError.prototype.getErrorType = function () {\n return \"otherempty\";\n };\n OtherEmptyError.prototype.getDefaultText = function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"otherRequiredError\");\n };\n return OtherEmptyError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\nvar UploadingFileError = /** @class */ (function (_super) {\n __extends(UploadingFileError, _super);\n function UploadingFileError(text, errorOwner) {\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, text, errorOwner) || this;\n _this.text = text;\n return _this;\n }\n UploadingFileError.prototype.getErrorType = function () {\n return \"uploadingfile\";\n };\n UploadingFileError.prototype.getDefaultText = function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"uploadingFile\");\n };\n return UploadingFileError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\nvar RequiredInAllRowsError = /** @class */ (function (_super) {\n __extends(RequiredInAllRowsError, _super);\n function RequiredInAllRowsError(text, errorOwner) {\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, text, errorOwner) || this;\n _this.text = text;\n return _this;\n }\n RequiredInAllRowsError.prototype.getErrorType = function () {\n return \"requiredinallrowserror\";\n };\n RequiredInAllRowsError.prototype.getDefaultText = function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"requiredInAllRowsError\");\n };\n return RequiredInAllRowsError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\nvar MinRowCountError = /** @class */ (function (_super) {\n __extends(MinRowCountError, _super);\n function MinRowCountError(minRowCount, errorOwner) {\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, null, errorOwner) || this;\n _this.minRowCount = minRowCount;\n return _this;\n }\n MinRowCountError.prototype.getErrorType = function () {\n return \"minrowcounterror\";\n };\n MinRowCountError.prototype.getDefaultText = function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"]\n .getString(\"minRowCountError\")[\"format\"](this.minRowCount);\n };\n return MinRowCountError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\nvar KeyDuplicationError = /** @class */ (function (_super) {\n __extends(KeyDuplicationError, _super);\n function KeyDuplicationError(text, errorOwner) {\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, text, errorOwner) || this;\n _this.text = text;\n return _this;\n }\n KeyDuplicationError.prototype.getErrorType = function () {\n return \"keyduplicationerror\";\n };\n KeyDuplicationError.prototype.getDefaultText = function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"keyDuplicationError\");\n };\n return KeyDuplicationError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\nvar CustomError = /** @class */ (function (_super) {\n __extends(CustomError, _super);\n function CustomError(text, errorOwner) {\n if (errorOwner === void 0) { errorOwner = null; }\n var _this = _super.call(this, text, errorOwner) || this;\n _this.text = text;\n return _this;\n }\n CustomError.prototype.getErrorType = function () {\n return \"custom\";\n };\n return CustomError;\n}(_survey_error__WEBPACK_IMPORTED_MODULE_1__[\"SurveyError\"]));\n\n\n\n/***/ }),\n\n/***/ \"./src/expressionItems.ts\":\n/*!********************************!*\\\n !*** ./src/expressionItems.ts ***!\n \\********************************/\n/*! exports provided: ExpressionItem, HtmlConditionItem, UrlConditionItem */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ExpressionItem\", function() { return ExpressionItem; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"HtmlConditionItem\", function() { return HtmlConditionItem; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"UrlConditionItem\", function() { return UrlConditionItem; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./conditions */ \"./src/conditions.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar ExpressionItem = /** @class */ (function (_super) {\n __extends(ExpressionItem, _super);\n function ExpressionItem(expression) {\n if (expression === void 0) { expression = null; }\n var _this = _super.call(this) || this;\n _this.createLocalizableString(\"html\", _this);\n _this.expression = expression;\n return _this;\n }\n ExpressionItem.prototype.getType = function () {\n return \"expressionitem\";\n };\n ExpressionItem.prototype.runCondition = function (values, properties) {\n if (!this.expression)\n return false;\n return new _conditions__WEBPACK_IMPORTED_MODULE_2__[\"ConditionRunner\"](this.expression).run(values, properties);\n };\n Object.defineProperty(ExpressionItem.prototype, \"expression\", {\n /**\n * The expression property. If this expression returns true, then survey will use html property to show on complete page.\n */\n get: function () {\n return this.getPropertyValue(\"expression\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"expression\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ExpressionItem.prototype, \"locHtml\", {\n get: function () {\n return this.getLocalizableString(\"html\");\n },\n enumerable: false,\n configurable: true\n });\n ExpressionItem.prototype.getLocale = function () {\n return !!this.locOwner ? this.locOwner.getLocale() : \"\";\n };\n ExpressionItem.prototype.getMarkdownHtml = function (text, name) {\n return !!this.locOwner ? this.locOwner.getMarkdownHtml(text, name) : null;\n };\n ExpressionItem.prototype.getRenderer = function (name) {\n return !!this.locOwner ? this.locOwner.getRenderer(name) : null;\n };\n ExpressionItem.prototype.getProcessedText = function (text) {\n return this.locOwner ? this.locOwner.getProcessedText(text) : text;\n };\n return ExpressionItem;\n}(_base__WEBPACK_IMPORTED_MODULE_1__[\"Base\"]));\n\n/**\n * A class that contains expression and html propeties. It uses in survey.completedHtmlOnCondition array.\n * If the expression returns true then html of this item uses instead of survey.completedHtml property\n * @see SurveyModel.completedHtmlOnCondition\n * @see SurveyModel.completedHtml\n */\nvar HtmlConditionItem = /** @class */ (function (_super) {\n __extends(HtmlConditionItem, _super);\n function HtmlConditionItem(expression, html) {\n if (expression === void 0) { expression = null; }\n if (html === void 0) { html = null; }\n var _this = _super.call(this, expression) || this;\n _this.createLocalizableString(\"html\", _this);\n _this.html = html;\n return _this;\n }\n HtmlConditionItem.prototype.getType = function () {\n return \"htmlconditionitem\";\n };\n Object.defineProperty(HtmlConditionItem.prototype, \"html\", {\n /**\n * The html that shows on completed ('Thank you') page. The expression should return true\n * @see expression\n */\n get: function () {\n return this.getLocalizableStringText(\"html\");\n },\n set: function (value) {\n this.setLocalizableStringText(\"html\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(HtmlConditionItem.prototype, \"locHtml\", {\n get: function () {\n return this.getLocalizableString(\"html\");\n },\n enumerable: false,\n configurable: true\n });\n return HtmlConditionItem;\n}(ExpressionItem));\n\n/**\n * A class that contains expression and url propeties. It uses in survey.navigateToUrlOnCondition array.\n * If the expression returns true then url of this item uses instead of survey.navigateToUrl property\n * @see SurveyModel.navigateToUrl\n */\nvar UrlConditionItem = /** @class */ (function (_super) {\n __extends(UrlConditionItem, _super);\n function UrlConditionItem(expression, url) {\n if (expression === void 0) { expression = null; }\n if (url === void 0) { url = null; }\n var _this = _super.call(this, expression) || this;\n _this.createLocalizableString(\"url\", _this);\n _this.url = url;\n return _this;\n }\n UrlConditionItem.prototype.getType = function () {\n return \"urlconditionitem\";\n };\n Object.defineProperty(UrlConditionItem.prototype, \"url\", {\n /**\n * The url that survey navigates to on completing the survey. The expression should return true\n * @see expression\n */\n get: function () {\n return this.getLocalizableStringText(\"url\");\n },\n set: function (value) {\n this.setLocalizableStringText(\"url\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(UrlConditionItem.prototype, \"locUrl\", {\n get: function () {\n return this.getLocalizableString(\"url\");\n },\n enumerable: false,\n configurable: true\n });\n return UrlConditionItem;\n}(ExpressionItem));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"expressionitem\", [\"expression:condition\"], function () {\n return new ExpressionItem();\n}, \"base\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"htmlconditionitem\", [{ name: \"html:html\", serializationProperty: \"locHtml\" }], function () {\n return new HtmlConditionItem();\n}, \"expressionitem\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"urlconditionitem\", [{ name: \"url:string\", serializationProperty: \"locUrl\" }], function () {\n return new UrlConditionItem();\n}, \"expressionitem\");\n\n\n/***/ }),\n\n/***/ \"./src/expressions/expressionParser.ts\":\n/*!*********************************************!*\\\n !*** ./src/expressions/expressionParser.ts ***!\n \\*********************************************/\n/*! exports provided: SyntaxError, parse */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SyntaxError\", function() { return SyntaxError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"parse\", function() { return parse; });\n/* harmony import */ var _expressions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./expressions */ \"./src/expressions/expressions.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n// Generated by PEG.js v. 0.10.0 (ts-pegjs plugin v. 0.3.1 )\n//\n// https://pegjs.org/ https://github.com/metadevpro/ts-pegjs\n\"use strict\";\nvar SyntaxError = /** @class */ (function (_super) {\n __extends(SyntaxError, _super);\n function SyntaxError(message, expected, found, location) {\n var _this = _super.call(this) || this;\n _this.message = message;\n _this.expected = expected;\n _this.found = found;\n _this.location = location;\n _this.name = \"SyntaxError\";\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(_this, SyntaxError);\n }\n return _this;\n }\n SyntaxError.buildMessage = function (expected, found) {\n function hex(ch) {\n return ch.charCodeAt(0).toString(16).toUpperCase();\n }\n function literalEscape(s) {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, \"\\\\\\\"\")\n .replace(/\\0/g, \"\\\\0\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/[\\x00-\\x0F]/g, function (ch) { return \"\\\\x0\" + hex(ch); })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function (ch) { return \"\\\\x\" + hex(ch); });\n }\n function classEscape(s) {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\]/g, \"\\\\]\")\n .replace(/\\^/g, \"\\\\^\")\n .replace(/-/g, \"\\\\-\")\n .replace(/\\0/g, \"\\\\0\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/[\\x00-\\x0F]/g, function (ch) { return \"\\\\x0\" + hex(ch); })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function (ch) { return \"\\\\x\" + hex(ch); });\n }\n function describeExpectation(expectation) {\n switch (expectation.type) {\n case \"literal\":\n return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n case \"class\":\n var escapedParts = expectation.parts.map(function (part) {\n return Array.isArray(part)\n ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n : classEscape(part);\n });\n return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";\n case \"any\":\n return \"any character\";\n case \"end\":\n return \"end of input\";\n case \"other\":\n return expectation.description;\n }\n }\n function describeExpected(expected1) {\n var descriptions = expected1.map(describeExpectation);\n var i;\n var j;\n descriptions.sort();\n if (descriptions.length > 0) {\n for (i = 1, j = 1; i < descriptions.length; i++) {\n if (descriptions[i - 1] !== descriptions[i]) {\n descriptions[j] = descriptions[i];\n j++;\n }\n }\n descriptions.length = j;\n }\n switch (descriptions.length) {\n case 1:\n return descriptions[0];\n case 2:\n return descriptions[0] + \" or \" + descriptions[1];\n default:\n return descriptions.slice(0, -1).join(\", \")\n + \", or \"\n + descriptions[descriptions.length - 1];\n }\n }\n function describeFound(found1) {\n return found1 ? \"\\\"\" + literalEscape(found1) + \"\\\"\" : \"end of input\";\n }\n return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n };\n return SyntaxError;\n}(Error));\n\nfunction peg$parse(input, options) {\n options = options !== undefined ? options : {};\n var peg$FAILED = {};\n var peg$startRuleFunctions = { Expression: peg$parseExpression };\n var peg$startRuleFunction = peg$parseExpression;\n var peg$c0 = function (head, tail) {\n return buildBinaryOperand(head, tail, true);\n };\n var peg$c1 = \"||\";\n var peg$c2 = peg$literalExpectation(\"||\", false);\n var peg$c3 = \"or\";\n var peg$c4 = peg$literalExpectation(\"or\", true);\n var peg$c5 = function () { return \"or\"; };\n var peg$c6 = \"&&\";\n var peg$c7 = peg$literalExpectation(\"&&\", false);\n var peg$c8 = \"and\";\n var peg$c9 = peg$literalExpectation(\"and\", true);\n var peg$c10 = function () { return \"and\"; };\n var peg$c11 = function (head, tail) {\n return buildBinaryOperand(head, tail);\n };\n var peg$c12 = \"<=\";\n var peg$c13 = peg$literalExpectation(\"<=\", false);\n var peg$c14 = \"lessorequal\";\n var peg$c15 = peg$literalExpectation(\"lessorequal\", true);\n var peg$c16 = function () { return \"lessorequal\"; };\n var peg$c17 = \">=\";\n var peg$c18 = peg$literalExpectation(\">=\", false);\n var peg$c19 = \"greaterorequal\";\n var peg$c20 = peg$literalExpectation(\"greaterorequal\", true);\n var peg$c21 = function () { return \"greaterorequal\"; };\n var peg$c22 = \"=\";\n var peg$c23 = peg$literalExpectation(\"=\", false);\n var peg$c24 = \"equal\";\n var peg$c25 = peg$literalExpectation(\"equal\", true);\n var peg$c26 = function () { return \"equal\"; };\n var peg$c27 = \"!=\";\n var peg$c28 = peg$literalExpectation(\"!=\", false);\n var peg$c29 = \"notequal\";\n var peg$c30 = peg$literalExpectation(\"notequal\", true);\n var peg$c31 = function () { return \"notequal\"; };\n var peg$c32 = \"<\";\n var peg$c33 = peg$literalExpectation(\"<\", false);\n var peg$c34 = \"less\";\n var peg$c35 = peg$literalExpectation(\"less\", true);\n var peg$c36 = function () { return \"less\"; };\n var peg$c37 = \">\";\n var peg$c38 = peg$literalExpectation(\">\", false);\n var peg$c39 = \"greater\";\n var peg$c40 = peg$literalExpectation(\"greater\", true);\n var peg$c41 = function () { return \"greater\"; };\n var peg$c42 = \"+\";\n var peg$c43 = peg$literalExpectation(\"+\", false);\n var peg$c44 = function () { return \"plus\"; };\n var peg$c45 = \"-\";\n var peg$c46 = peg$literalExpectation(\"-\", false);\n var peg$c47 = function () { return \"minus\"; };\n var peg$c48 = \"*\";\n var peg$c49 = peg$literalExpectation(\"*\", false);\n var peg$c50 = function () { return \"mul\"; };\n var peg$c51 = \"/\";\n var peg$c52 = peg$literalExpectation(\"/\", false);\n var peg$c53 = function () { return \"div\"; };\n var peg$c54 = \"%\";\n var peg$c55 = peg$literalExpectation(\"%\", false);\n var peg$c56 = function () { return \"mod\"; };\n var peg$c57 = \"^\";\n var peg$c58 = peg$literalExpectation(\"^\", false);\n var peg$c59 = \"power\";\n var peg$c60 = peg$literalExpectation(\"power\", true);\n var peg$c61 = function () { return \"power\"; };\n var peg$c62 = \"*=\";\n var peg$c63 = peg$literalExpectation(\"*=\", false);\n var peg$c64 = \"contains\";\n var peg$c65 = peg$literalExpectation(\"contains\", true);\n var peg$c66 = \"contain\";\n var peg$c67 = peg$literalExpectation(\"contain\", true);\n var peg$c68 = function () { return \"contains\"; };\n var peg$c69 = \"notcontains\";\n var peg$c70 = peg$literalExpectation(\"notcontains\", true);\n var peg$c71 = \"notcontain\";\n var peg$c72 = peg$literalExpectation(\"notcontain\", true);\n var peg$c73 = function () { return \"notcontains\"; };\n var peg$c74 = \"anyof\";\n var peg$c75 = peg$literalExpectation(\"anyof\", true);\n var peg$c76 = function () { return \"anyof\"; };\n var peg$c77 = \"allof\";\n var peg$c78 = peg$literalExpectation(\"allof\", true);\n var peg$c79 = function () { return \"allof\"; };\n var peg$c80 = \"(\";\n var peg$c81 = peg$literalExpectation(\"(\", false);\n var peg$c82 = \")\";\n var peg$c83 = peg$literalExpectation(\")\", false);\n var peg$c84 = function (expr) { return expr; };\n var peg$c85 = function (name, params) { return new _expressions__WEBPACK_IMPORTED_MODULE_0__[\"FunctionOperand\"](name, params); };\n var peg$c86 = \"!\";\n var peg$c87 = peg$literalExpectation(\"!\", false);\n var peg$c88 = \"negate\";\n var peg$c89 = peg$literalExpectation(\"negate\", true);\n var peg$c90 = function (expr) { return new _expressions__WEBPACK_IMPORTED_MODULE_0__[\"UnaryOperand\"](expr, \"negate\"); };\n var peg$c91 = function (expr, op) { return new _expressions__WEBPACK_IMPORTED_MODULE_0__[\"UnaryOperand\"](expr, op); };\n var peg$c92 = \"empty\";\n var peg$c93 = peg$literalExpectation(\"empty\", true);\n var peg$c94 = function () { return \"empty\"; };\n var peg$c95 = \"notempty\";\n var peg$c96 = peg$literalExpectation(\"notempty\", true);\n var peg$c97 = function () { return \"notempty\"; };\n var peg$c98 = \"undefined\";\n var peg$c99 = peg$literalExpectation(\"undefined\", false);\n var peg$c100 = \"null\";\n var peg$c101 = peg$literalExpectation(\"null\", false);\n var peg$c102 = function () { return null; };\n var peg$c103 = function (value) { return new _expressions__WEBPACK_IMPORTED_MODULE_0__[\"Const\"](value); };\n var peg$c104 = \"{\";\n var peg$c105 = peg$literalExpectation(\"{\", false);\n var peg$c106 = \"}\";\n var peg$c107 = peg$literalExpectation(\"}\", false);\n var peg$c108 = function (value) { return new _expressions__WEBPACK_IMPORTED_MODULE_0__[\"Variable\"](value); };\n var peg$c109 = function (value) { return value; };\n var peg$c110 = \"''\";\n var peg$c111 = peg$literalExpectation(\"''\", false);\n var peg$c112 = function () { return \"\"; };\n var peg$c113 = \"\\\"\\\"\";\n var peg$c114 = peg$literalExpectation(\"\\\"\\\"\", false);\n var peg$c115 = \"'\";\n var peg$c116 = peg$literalExpectation(\"'\", false);\n var peg$c117 = function (value) { return \"'\" + value + \"'\"; };\n var peg$c118 = \"\\\"\";\n var peg$c119 = peg$literalExpectation(\"\\\"\", false);\n var peg$c120 = \"[\";\n var peg$c121 = peg$literalExpectation(\"[\", false);\n var peg$c122 = \"]\";\n var peg$c123 = peg$literalExpectation(\"]\", false);\n var peg$c124 = function (sequence) { return sequence; };\n var peg$c125 = \",\";\n var peg$c126 = peg$literalExpectation(\",\", false);\n var peg$c127 = function (expr, tail) {\n if (expr == null)\n return new _expressions__WEBPACK_IMPORTED_MODULE_0__[\"ArrayOperand\"]([]);\n var array = [expr];\n if (Array.isArray(tail)) {\n var flatten = flattenArray(tail);\n for (var i = 3; i < flatten.length; i += 4) {\n array.push(flatten[i]);\n }\n }\n return new _expressions__WEBPACK_IMPORTED_MODULE_0__[\"ArrayOperand\"](array);\n };\n var peg$c128 = \"true\";\n var peg$c129 = peg$literalExpectation(\"true\", true);\n var peg$c130 = function () { return true; };\n var peg$c131 = \"false\";\n var peg$c132 = peg$literalExpectation(\"false\", true);\n var peg$c133 = function () { return false; };\n var peg$c134 = \"0x\";\n var peg$c135 = peg$literalExpectation(\"0x\", false);\n var peg$c136 = function () { return parseInt(text(), 16); };\n var peg$c137 = /^[\\-]/;\n var peg$c138 = peg$classExpectation([\"-\"], false, false);\n var peg$c139 = function (sign, num) { return sign == null ? num : -num; };\n var peg$c140 = \".\";\n var peg$c141 = peg$literalExpectation(\".\", false);\n var peg$c142 = function () { return parseFloat(text()); };\n var peg$c143 = function () { return parseInt(text(), 10); };\n var peg$c144 = \"0\";\n var peg$c145 = peg$literalExpectation(\"0\", false);\n var peg$c146 = function () { return 0; };\n var peg$c147 = function (chars) { return chars.join(\"\"); };\n var peg$c148 = \"\\\\'\";\n var peg$c149 = peg$literalExpectation(\"\\\\'\", false);\n var peg$c150 = function () { return \"'\"; };\n var peg$c151 = \"\\\\\\\"\";\n var peg$c152 = peg$literalExpectation(\"\\\\\\\"\", false);\n var peg$c153 = function () { return \"\\\"\"; };\n var peg$c154 = /^[^\"']/;\n var peg$c155 = peg$classExpectation([\"\\\"\", \"'\"], true, false);\n var peg$c156 = function () { return text(); };\n var peg$c157 = /^[^{}]/;\n var peg$c158 = peg$classExpectation([\"{\", \"}\"], true, false);\n var peg$c159 = /^[0-9]/;\n var peg$c160 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n var peg$c161 = /^[1-9]/;\n var peg$c162 = peg$classExpectation([[\"1\", \"9\"]], false, false);\n var peg$c163 = /^[a-zA-Z]/;\n var peg$c164 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"]], false, false);\n var peg$c165 = peg$otherExpectation(\"whitespace\");\n var peg$c166 = /^[ \\t\\n\\r]/;\n var peg$c167 = peg$classExpectation([\" \", \"\\t\", \"\\n\", \"\\r\"], false, false);\n var peg$currPos = 0;\n var peg$savedPos = 0;\n var peg$posDetailsCache = [{ line: 1, column: 1 }];\n var peg$maxFailPos = 0;\n var peg$maxFailExpected = [];\n var peg$silentFails = 0;\n var peg$resultsCache = {};\n var peg$result;\n if (options.startRule !== undefined) {\n if (!(options.startRule in peg$startRuleFunctions)) {\n throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n }\n peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n }\n function text() {\n return input.substring(peg$savedPos, peg$currPos);\n }\n function location() {\n return peg$computeLocation(peg$savedPos, peg$currPos);\n }\n function expected(description, location1) {\n location1 = location1 !== undefined\n ? location1\n : peg$computeLocation(peg$savedPos, peg$currPos);\n throw peg$buildStructuredError([peg$otherExpectation(description)], input.substring(peg$savedPos, peg$currPos), location1);\n }\n function error(message, location1) {\n location1 = location1 !== undefined\n ? location1\n : peg$computeLocation(peg$savedPos, peg$currPos);\n throw peg$buildSimpleError(message, location1);\n }\n function peg$literalExpectation(text1, ignoreCase) {\n return { type: \"literal\", text: text1, ignoreCase: ignoreCase };\n }\n function peg$classExpectation(parts, inverted, ignoreCase) {\n return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n }\n function peg$anyExpectation() {\n return { type: \"any\" };\n }\n function peg$endExpectation() {\n return { type: \"end\" };\n }\n function peg$otherExpectation(description) {\n return { type: \"other\", description: description };\n }\n function peg$computePosDetails(pos) {\n var details = peg$posDetailsCache[pos];\n var p;\n if (details) {\n return details;\n }\n else {\n p = pos - 1;\n while (!peg$posDetailsCache[p]) {\n p--;\n }\n details = peg$posDetailsCache[p];\n details = {\n line: details.line,\n column: details.column\n };\n while (p < pos) {\n if (input.charCodeAt(p) === 10) {\n details.line++;\n details.column = 1;\n }\n else {\n details.column++;\n }\n p++;\n }\n peg$posDetailsCache[pos] = details;\n return details;\n }\n }\n function peg$computeLocation(startPos, endPos) {\n var startPosDetails = peg$computePosDetails(startPos);\n var endPosDetails = peg$computePosDetails(endPos);\n return {\n start: {\n offset: startPos,\n line: startPosDetails.line,\n column: startPosDetails.column\n },\n end: {\n offset: endPos,\n line: endPosDetails.line,\n column: endPosDetails.column\n }\n };\n }\n function peg$fail(expected1) {\n if (peg$currPos < peg$maxFailPos) {\n return;\n }\n if (peg$currPos > peg$maxFailPos) {\n peg$maxFailPos = peg$currPos;\n peg$maxFailExpected = [];\n }\n peg$maxFailExpected.push(expected1);\n }\n function peg$buildSimpleError(message, location1) {\n return new SyntaxError(message, [], \"\", location1);\n }\n function peg$buildStructuredError(expected1, found, location1) {\n return new SyntaxError(SyntaxError.buildMessage(expected1, found), expected1, found, location1);\n }\n function peg$parseExpression() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n var key = peg$currPos * 34 + 0;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n s2 = peg$parseLogicOr();\n if (s2 !== peg$FAILED) {\n s3 = [];\n s4 = peg$currPos;\n s5 = peg$parse_();\n if (s5 !== peg$FAILED) {\n s6 = peg$parseOrSign();\n if (s6 !== peg$FAILED) {\n s7 = peg$parse_();\n if (s7 !== peg$FAILED) {\n s8 = peg$parseLogicOr();\n if (s8 !== peg$FAILED) {\n s5 = [s5, s6, s7, s8];\n s4 = s5;\n }\n else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n s4 = peg$currPos;\n s5 = peg$parse_();\n if (s5 !== peg$FAILED) {\n s6 = peg$parseOrSign();\n if (s6 !== peg$FAILED) {\n s7 = peg$parse_();\n if (s7 !== peg$FAILED) {\n s8 = peg$parseLogicOr();\n if (s8 !== peg$FAILED) {\n s5 = [s5, s6, s7, s8];\n s4 = s5;\n }\n else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n }\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c0(s2, s3);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseOrSign() {\n var s0, s1;\n var key = peg$currPos * 34 + 1;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c1) {\n s1 = peg$c1;\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c2);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 2).toLowerCase() === peg$c3) {\n s1 = input.substr(peg$currPos, 2);\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c4);\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c5();\n }\n s0 = s1;\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseLogicOr() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n var key = peg$currPos * 34 + 2;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parseLogicAnd();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseAndSign();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseLogicAnd();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseAndSign();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseLogicAnd();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c0(s1, s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseAndSign() {\n var s0, s1;\n var key = peg$currPos * 34 + 3;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c6) {\n s1 = peg$c6;\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c7);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 3).toLowerCase() === peg$c8) {\n s1 = input.substr(peg$currPos, 3);\n peg$currPos += 3;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c9);\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c10();\n }\n s0 = s1;\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseLogicAnd() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n var key = peg$currPos * 34 + 4;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parseCompOps();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseComparableOperators();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseCompOps();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseComparableOperators();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseCompOps();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c11(s1, s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseComparableOperators() {\n var s0, s1;\n var key = peg$currPos * 34 + 5;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c12) {\n s1 = peg$c12;\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c13);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 11).toLowerCase() === peg$c14) {\n s1 = input.substr(peg$currPos, 11);\n peg$currPos += 11;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c15);\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c16();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c17) {\n s1 = peg$c17;\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c18);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 14).toLowerCase() === peg$c19) {\n s1 = input.substr(peg$currPos, 14);\n peg$currPos += 14;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c20);\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c21();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 61) {\n s1 = peg$c22;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c23);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 5).toLowerCase() === peg$c24) {\n s1 = input.substr(peg$currPos, 5);\n peg$currPos += 5;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c25);\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c26();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c27) {\n s1 = peg$c27;\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c28);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 8).toLowerCase() === peg$c29) {\n s1 = input.substr(peg$currPos, 8);\n peg$currPos += 8;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c30);\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c31();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 60) {\n s1 = peg$c32;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c33);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 4).toLowerCase() === peg$c34) {\n s1 = input.substr(peg$currPos, 4);\n peg$currPos += 4;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c35);\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c36();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 62) {\n s1 = peg$c37;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c38);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 7).toLowerCase() === peg$c39) {\n s1 = input.substr(peg$currPos, 7);\n peg$currPos += 7;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c40);\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c41();\n }\n s0 = s1;\n }\n }\n }\n }\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseCompOps() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n var key = peg$currPos * 34 + 6;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parsePlusMinusOps();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parsePlusMinusSigns();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parsePlusMinusOps();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parsePlusMinusSigns();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parsePlusMinusOps();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c0(s1, s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parsePlusMinusSigns() {\n var s0, s1;\n var key = peg$currPos * 34 + 7;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 43) {\n s1 = peg$c42;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c43);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c44();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 45) {\n s1 = peg$c45;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c46);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c47();\n }\n s0 = s1;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parsePlusMinusOps() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n var key = peg$currPos * 34 + 8;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parseMulDivOps();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseMulDivSigns();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseMulDivOps();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseMulDivSigns();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseMulDivOps();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c0(s1, s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseMulDivSigns() {\n var s0, s1;\n var key = peg$currPos * 34 + 9;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 42) {\n s1 = peg$c48;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c49);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c50();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 47) {\n s1 = peg$c51;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c52);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c53();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 37) {\n s1 = peg$c54;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c55);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c56();\n }\n s0 = s1;\n }\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseMulDivOps() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n var key = peg$currPos * 34 + 10;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parseBinaryFuncOp();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parsePowerSigns();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseBinaryFuncOp();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parsePowerSigns();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseBinaryFuncOp();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c0(s1, s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parsePowerSigns() {\n var s0, s1;\n var key = peg$currPos * 34 + 11;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 94) {\n s1 = peg$c57;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c58);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 5).toLowerCase() === peg$c59) {\n s1 = input.substr(peg$currPos, 5);\n peg$currPos += 5;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c60);\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c61();\n }\n s0 = s1;\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseBinaryFuncOp() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n var key = peg$currPos * 34 + 12;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parseFactor();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseBinFunctions();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseFactor();\n if (s7 === peg$FAILED) {\n s7 = null;\n }\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseBinFunctions();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseFactor();\n if (s7 === peg$FAILED) {\n s7 = null;\n }\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c11(s1, s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseBinFunctions() {\n var s0, s1;\n var key = peg$currPos * 34 + 13;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c62) {\n s1 = peg$c62;\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c63);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 8).toLowerCase() === peg$c64) {\n s1 = input.substr(peg$currPos, 8);\n peg$currPos += 8;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c65);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 7).toLowerCase() === peg$c66) {\n s1 = input.substr(peg$currPos, 7);\n peg$currPos += 7;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c67);\n }\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c68();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 11).toLowerCase() === peg$c69) {\n s1 = input.substr(peg$currPos, 11);\n peg$currPos += 11;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c70);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 10).toLowerCase() === peg$c71) {\n s1 = input.substr(peg$currPos, 10);\n peg$currPos += 10;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c72);\n }\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c73();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 5).toLowerCase() === peg$c74) {\n s1 = input.substr(peg$currPos, 5);\n peg$currPos += 5;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c75);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c76();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 5).toLowerCase() === peg$c77) {\n s1 = input.substr(peg$currPos, 5);\n peg$currPos += 5;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c78);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c79();\n }\n s0 = s1;\n }\n }\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseFactor() {\n var s0, s1, s2, s3, s4, s5;\n var key = peg$currPos * 34 + 14;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 40) {\n s1 = peg$c80;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c81);\n }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseExpression();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s5 = peg$c82;\n peg$currPos++;\n }\n else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c83);\n }\n }\n if (s5 === peg$FAILED) {\n s5 = null;\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c84(s3);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$parseFunctionOp();\n if (s0 === peg$FAILED) {\n s0 = peg$parseUnaryFunctionOp();\n if (s0 === peg$FAILED) {\n s0 = peg$parseAtom();\n if (s0 === peg$FAILED) {\n s0 = peg$parseArrayOp();\n }\n }\n }\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseFunctionOp() {\n var s0, s1, s2, s3, s4;\n var key = peg$currPos * 34 + 15;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parseLettersAndDigits();\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 40) {\n s2 = peg$c80;\n peg$currPos++;\n }\n else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c81);\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseSequence();\n if (s3 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s4 = peg$c82;\n peg$currPos++;\n }\n else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c83);\n }\n }\n if (s4 === peg$FAILED) {\n s4 = null;\n }\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c85(s1, s3);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseUnaryFunctionOp() {\n var s0, s1, s2, s3;\n var key = peg$currPos * 34 + 16;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 33) {\n s1 = peg$c86;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c87);\n }\n }\n if (s1 === peg$FAILED) {\n if (input.substr(peg$currPos, 6).toLowerCase() === peg$c88) {\n s1 = input.substr(peg$currPos, 6);\n peg$currPos += 6;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c89);\n }\n }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseExpression();\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c90(s3);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseAtom();\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseUnFunctions();\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c91(s1, s3);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseUnFunctions() {\n var s0, s1;\n var key = peg$currPos * 34 + 17;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 5).toLowerCase() === peg$c92) {\n s1 = input.substr(peg$currPos, 5);\n peg$currPos += 5;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c93);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c94();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 8).toLowerCase() === peg$c95) {\n s1 = input.substr(peg$currPos, 8);\n peg$currPos += 8;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c96);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c97();\n }\n s0 = s1;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseAtom() {\n var s0, s1, s2, s3, s4;\n var key = peg$currPos * 34 + 18;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n if (input.substr(peg$currPos, 9) === peg$c98) {\n s2 = peg$c98;\n peg$currPos += 9;\n }\n else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c99);\n }\n }\n if (s2 === peg$FAILED) {\n if (input.substr(peg$currPos, 4) === peg$c100) {\n s2 = peg$c100;\n peg$currPos += 4;\n }\n else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c101);\n }\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c102();\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n s2 = peg$parseConstValue();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c103(s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 123) {\n s2 = peg$c104;\n peg$currPos++;\n }\n else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c105);\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseValueInput();\n if (s3 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s4 = peg$c106;\n peg$currPos++;\n }\n else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c107);\n }\n }\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c108(s3);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseConstValue() {\n var s0, s1, s2, s3;\n var key = peg$currPos * 34 + 19;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parseLogicValue();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c109(s1);\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseArithmeticValue();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c109(s1);\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseLettersAndDigits();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c109(s1);\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c110) {\n s1 = peg$c110;\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c111);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c112();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c113) {\n s1 = peg$c113;\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c114);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c112();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 39) {\n s1 = peg$c115;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c116);\n }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseAnyInput();\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 39) {\n s3 = peg$c115;\n peg$currPos++;\n }\n else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c116);\n }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c117(s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 34) {\n s1 = peg$c118;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c119);\n }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseAnyInput();\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 34) {\n s3 = peg$c118;\n peg$currPos++;\n }\n else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c119);\n }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c117(s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n }\n }\n }\n }\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseArrayOp() {\n var s0, s1, s2, s3;\n var key = peg$currPos * 34 + 20;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 91) {\n s1 = peg$c120;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c121);\n }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseSequence();\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 93) {\n s3 = peg$c122;\n peg$currPos++;\n }\n else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c123);\n }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c124(s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseSequence() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n var key = peg$currPos * 34 + 21;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parseExpression();\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c125;\n peg$currPos++;\n }\n else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c126);\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c125;\n peg$currPos++;\n }\n else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c126);\n }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseExpression();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c127(s1, s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseLogicValue() {\n var s0, s1;\n var key = peg$currPos * 34 + 22;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 4).toLowerCase() === peg$c128) {\n s1 = input.substr(peg$currPos, 4);\n peg$currPos += 4;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c129);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c130();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 5).toLowerCase() === peg$c131) {\n s1 = input.substr(peg$currPos, 5);\n peg$currPos += 5;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c132);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c133();\n }\n s0 = s1;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseArithmeticValue() {\n var s0, s1, s2;\n var key = peg$currPos * 34 + 23;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c134) {\n s1 = peg$c134;\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c135);\n }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseDigits();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c136();\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (peg$c137.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c138);\n }\n }\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseNumber();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c139(s1, s2);\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseNumber() {\n var s0, s1, s2, s3;\n var key = peg$currPos * 34 + 24;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parseDigits();\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 46) {\n s2 = peg$c140;\n peg$currPos++;\n }\n else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c141);\n }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseDigits();\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c142();\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseNonZeroDigits();\n if (s1 !== peg$FAILED) {\n s2 = peg$parseDigits();\n if (s2 === peg$FAILED) {\n s2 = null;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c143();\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 48) {\n s1 = peg$c144;\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c145);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c146();\n }\n s0 = s1;\n }\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseValueInput() {\n var s0, s1, s2;\n var key = peg$currPos * 34 + 25;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parseValueCharacters();\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parseValueCharacters();\n }\n }\n else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c147(s1);\n }\n s0 = s1;\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseAnyInput() {\n var s0, s1, s2;\n var key = peg$currPos * 34 + 26;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parseAnyCharacters();\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parseAnyCharacters();\n }\n }\n else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c147(s1);\n }\n s0 = s1;\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseAnyCharacters() {\n var s0, s1;\n var key = peg$currPos * 34 + 27;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c148) {\n s1 = peg$c148;\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c149);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c150();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c151) {\n s1 = peg$c151;\n peg$currPos += 2;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c152);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c153();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (peg$c154.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c155);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c156();\n }\n s0 = s1;\n }\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseValueCharacters() {\n var s0, s1;\n var key = peg$currPos * 34 + 28;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n if (peg$c157.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c158);\n }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c156();\n }\n s0 = s1;\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseLettersAndDigits() {\n var s0, s1, s2, s3, s4, s5, s6;\n var key = peg$currPos * 34 + 29;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = peg$currPos;\n s1 = peg$parseLetters();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parseDigits();\n if (s4 !== peg$FAILED) {\n s5 = [];\n s6 = peg$parseLetters();\n while (s6 !== peg$FAILED) {\n s5.push(s6);\n s6 = peg$parseLetters();\n }\n if (s5 !== peg$FAILED) {\n s4 = [s4, s5];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parseDigits();\n if (s4 !== peg$FAILED) {\n s5 = [];\n s6 = peg$parseLetters();\n while (s6 !== peg$FAILED) {\n s5.push(s6);\n s6 = peg$parseLetters();\n }\n if (s5 !== peg$FAILED) {\n s4 = [s4, s5];\n s3 = s4;\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c156();\n s0 = s1;\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseDigits() {\n var s0, s1;\n var key = peg$currPos * 34 + 30;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = [];\n if (peg$c159.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c160);\n }\n }\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n if (peg$c159.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c160);\n }\n }\n }\n }\n else {\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseNonZeroDigits() {\n var s0, s1;\n var key = peg$currPos * 34 + 31;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = [];\n if (peg$c161.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c162);\n }\n }\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n if (peg$c161.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c162);\n }\n }\n }\n }\n else {\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parseLetters() {\n var s0, s1;\n var key = peg$currPos * 34 + 32;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n s0 = [];\n if (peg$c163.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c164);\n }\n }\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n if (peg$c163.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c164);\n }\n }\n }\n }\n else {\n s0 = peg$FAILED;\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function peg$parse_() {\n var s0, s1;\n var key = peg$currPos * 34 + 33;\n var cached = peg$resultsCache[key];\n if (cached) {\n peg$currPos = cached.nextPos;\n return cached.result;\n }\n peg$silentFails++;\n s0 = [];\n if (peg$c166.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c167);\n }\n }\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n if (peg$c166.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n }\n else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c167);\n }\n }\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) {\n peg$fail(peg$c165);\n }\n }\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n return s0;\n }\n function buildBinaryOperand(head, tail, isArithmeticOp) {\n if (isArithmeticOp === void 0) { isArithmeticOp = false; }\n return tail.reduce(function (result, elements) {\n return new _expressions__WEBPACK_IMPORTED_MODULE_0__[\"BinaryOperand\"](elements[1], result, elements[3], isArithmeticOp);\n }, head);\n }\n function flattenArray(array) {\n return [].concat.apply([], array);\n }\n peg$result = peg$startRuleFunction();\n if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n return peg$result;\n }\n else {\n if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n peg$fail(peg$endExpectation());\n }\n throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length\n ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n : peg$computeLocation(peg$maxFailPos, peg$maxFailPos));\n }\n}\nvar parse = peg$parse;\n\n\n/***/ }),\n\n/***/ \"./src/expressions/expressions.ts\":\n/*!****************************************!*\\\n !*** ./src/expressions/expressions.ts ***!\n \\****************************************/\n/*! exports provided: Operand, BinaryOperand, UnaryOperand, ArrayOperand, Const, Variable, FunctionOperand, OperandMaker */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Operand\", function() { return Operand; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"BinaryOperand\", function() { return BinaryOperand; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"UnaryOperand\", function() { return UnaryOperand; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ArrayOperand\", function() { return ArrayOperand; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Const\", function() { return Const; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Variable\", function() { return Variable; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"FunctionOperand\", function() { return FunctionOperand; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"OperandMaker\", function() { return OperandMaker; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _functionsfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../functionsfactory */ \"./src/functionsfactory.ts\");\n/* harmony import */ var _conditionProcessValue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../conditionProcessValue */ \"./src/conditionProcessValue.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar Operand = /** @class */ (function () {\n function Operand() {\n }\n Operand.prototype.toString = function (func) {\n if (func === void 0) { func = undefined; }\n return \"\";\n };\n Operand.prototype.hasFunction = function () {\n return false;\n };\n Operand.prototype.hasAsyncFunction = function () {\n return false;\n };\n Operand.prototype.addToAsyncList = function (list) { };\n return Operand;\n}());\n\nvar BinaryOperand = /** @class */ (function (_super) {\n __extends(BinaryOperand, _super);\n function BinaryOperand(operatorName, left, right, isArithmeticOp) {\n if (left === void 0) { left = null; }\n if (right === void 0) { right = null; }\n if (isArithmeticOp === void 0) { isArithmeticOp = false; }\n var _this = _super.call(this) || this;\n _this.operatorName = operatorName;\n _this.left = left;\n _this.right = right;\n _this.isArithmeticValue = isArithmeticOp;\n if (isArithmeticOp) {\n _this.consumer = OperandMaker.binaryFunctions[\"arithmeticOp\"](operatorName);\n }\n else {\n _this.consumer = OperandMaker.binaryFunctions[operatorName];\n }\n if (_this.consumer == null) {\n OperandMaker.throwInvalidOperatorError(operatorName);\n }\n return _this;\n }\n BinaryOperand.prototype.getType = function () {\n return \"binary\";\n };\n Object.defineProperty(BinaryOperand.prototype, \"isArithmetic\", {\n get: function () {\n return this.isArithmeticValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(BinaryOperand.prototype, \"isConjunction\", {\n get: function () {\n return this.operatorName == \"or\" || this.operatorName == \"and\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(BinaryOperand.prototype, \"conjunction\", {\n get: function () {\n return this.isConjunction ? this.operatorName : \"\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(BinaryOperand.prototype, \"operator\", {\n get: function () {\n return this.operatorName;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(BinaryOperand.prototype, \"leftOperand\", {\n get: function () {\n return this.left;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(BinaryOperand.prototype, \"rightOperand\", {\n get: function () {\n return this.right;\n },\n enumerable: false,\n configurable: true\n });\n BinaryOperand.prototype.evaluateParam = function (x, processValue) {\n return x == null ? null : x.evaluate(processValue);\n };\n BinaryOperand.prototype.evaluate = function (processValue) {\n return this.consumer.call(this, this.evaluateParam(this.left, processValue), this.evaluateParam(this.right, processValue));\n };\n BinaryOperand.prototype.toString = function (func) {\n if (func === void 0) { func = undefined; }\n if (!!func) {\n var res = func(this);\n if (!!res)\n return res;\n }\n return (\"(\" +\n OperandMaker.safeToString(this.left, func) +\n \" \" +\n OperandMaker.operatorToString(this.operatorName) +\n \" \" +\n OperandMaker.safeToString(this.right, func) +\n \")\");\n };\n BinaryOperand.prototype.setVariables = function (variables) {\n if (this.left != null)\n this.left.setVariables(variables);\n if (this.right != null)\n this.right.setVariables(variables);\n };\n BinaryOperand.prototype.hasFunction = function () {\n return ((!!this.left && this.left.hasFunction()) ||\n (!!this.right && this.right.hasFunction()));\n };\n BinaryOperand.prototype.hasAsyncFunction = function () {\n return ((!!this.left && this.left.hasAsyncFunction()) ||\n (!!this.right && this.right.hasAsyncFunction()));\n };\n BinaryOperand.prototype.addToAsyncList = function (list) {\n if (!!this.left)\n this.left.addToAsyncList(list);\n if (!!this.right)\n this.right.addToAsyncList(list);\n };\n return BinaryOperand;\n}(Operand));\n\nvar UnaryOperand = /** @class */ (function (_super) {\n __extends(UnaryOperand, _super);\n function UnaryOperand(expressionValue, operatorName) {\n var _this = _super.call(this) || this;\n _this.expressionValue = expressionValue;\n _this.operatorName = operatorName;\n _this.consumer = OperandMaker.unaryFunctions[operatorName];\n if (_this.consumer == null) {\n OperandMaker.throwInvalidOperatorError(operatorName);\n }\n return _this;\n }\n Object.defineProperty(UnaryOperand.prototype, \"operator\", {\n get: function () {\n return this.operatorName;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(UnaryOperand.prototype, \"expression\", {\n get: function () {\n return this.expressionValue;\n },\n enumerable: false,\n configurable: true\n });\n UnaryOperand.prototype.getType = function () {\n return \"unary\";\n };\n UnaryOperand.prototype.toString = function (func) {\n if (func === void 0) { func = undefined; }\n if (!!func) {\n var res = func(this);\n if (!!res)\n return res;\n }\n return (OperandMaker.operatorToString(this.operatorName) +\n \" \" +\n this.expression.toString(func));\n };\n UnaryOperand.prototype.evaluate = function (processValue) {\n var value = this.expression.evaluate(processValue);\n return this.consumer.call(this, value);\n };\n UnaryOperand.prototype.setVariables = function (variables) {\n this.expression.setVariables(variables);\n };\n return UnaryOperand;\n}(Operand));\n\nvar ArrayOperand = /** @class */ (function (_super) {\n __extends(ArrayOperand, _super);\n function ArrayOperand(values) {\n var _this = _super.call(this) || this;\n _this.values = values;\n return _this;\n }\n ArrayOperand.prototype.getType = function () {\n return \"array\";\n };\n ArrayOperand.prototype.toString = function (func) {\n if (func === void 0) { func = undefined; }\n if (!!func) {\n var res = func(this);\n if (!!res)\n return res;\n }\n return (\"[\" +\n this.values\n .map(function (el) {\n return el.toString(func);\n })\n .join(\", \") +\n \"]\");\n };\n ArrayOperand.prototype.evaluate = function (processValue) {\n return this.values.map(function (el) {\n return el.evaluate(processValue);\n });\n };\n ArrayOperand.prototype.setVariables = function (variables) {\n this.values.forEach(function (el) {\n el.setVariables(variables);\n });\n };\n ArrayOperand.prototype.hasFunction = function () {\n return this.values.some(function (operand) { return operand.hasFunction(); });\n };\n ArrayOperand.prototype.hasAsyncFunction = function () {\n return this.values.some(function (operand) { return operand.hasAsyncFunction(); });\n };\n ArrayOperand.prototype.addToAsyncList = function (list) {\n this.values.forEach(function (operand) { return operand.addToAsyncList(list); });\n };\n return ArrayOperand;\n}(Operand));\n\nvar Const = /** @class */ (function (_super) {\n __extends(Const, _super);\n function Const(value) {\n var _this = _super.call(this) || this;\n _this.value = value;\n return _this;\n }\n Const.prototype.getType = function () {\n return \"const\";\n };\n Const.prototype.toString = function (func) {\n if (func === void 0) { func = undefined; }\n if (!!func) {\n var res = func(this);\n if (!!res)\n return res;\n }\n return this.value.toString();\n };\n Object.defineProperty(Const.prototype, \"correctValue\", {\n get: function () {\n return this.getCorrectValue(this.value);\n },\n enumerable: false,\n configurable: true\n });\n Const.prototype.evaluate = function () {\n return this.getCorrectValue(this.value);\n };\n Const.prototype.setVariables = function (variables) { };\n Const.prototype.getCorrectValue = function (value) {\n if (!value || typeof value != \"string\")\n return value;\n if (this.isBooleanValue(value))\n return value.toLowerCase() === \"true\";\n if (value.length > 1 &&\n this.isQuote(value[0]) &&\n this.isQuote(value[value.length - 1]))\n return value.substr(1, value.length - 2);\n if (OperandMaker.isNumeric(value)) {\n if (value.indexOf(\"0x\") == 0)\n return parseInt(value);\n if (value.length > 1 && value[0] == \"0\")\n return value;\n return parseFloat(value);\n }\n return value;\n };\n Const.prototype.isQuote = function (ch) {\n return ch == \"'\" || ch == '\"';\n };\n Const.prototype.isBooleanValue = function (value) {\n return (value &&\n (value.toLowerCase() === \"true\" || value.toLowerCase() === \"false\"));\n };\n return Const;\n}(Operand));\n\nvar Variable = /** @class */ (function (_super) {\n __extends(Variable, _super);\n function Variable(variableName) {\n var _this = _super.call(this, variableName) || this;\n _this.variableName = variableName;\n _this.valueInfo = {};\n _this.useValueAsItIs = false;\n if (!!_this.variableName &&\n _this.variableName.length > 1 &&\n _this.variableName[0] === Variable.DisableConversionChar) {\n _this.variableName = _this.variableName.substr(1);\n _this.useValueAsItIs = true;\n }\n return _this;\n }\n Variable.prototype.getType = function () {\n return \"variable\";\n };\n Variable.prototype.toString = function (func) {\n if (func === void 0) { func = undefined; }\n if (!!func) {\n var res = func(this);\n if (!!res)\n return res;\n }\n var prefix = this.useValueAsItIs ? Variable.DisableConversionChar : \"\";\n return \"{\" + prefix + this.variableName + \"}\";\n };\n Object.defineProperty(Variable.prototype, \"variable\", {\n get: function () {\n return this.variableName;\n },\n enumerable: false,\n configurable: true\n });\n Variable.prototype.evaluate = function (processValue) {\n this.valueInfo.name = this.variableName;\n processValue.getValueInfo(this.valueInfo);\n return this.valueInfo.hasValue\n ? this.getCorrectValue(this.valueInfo.value)\n : null;\n };\n Variable.prototype.setVariables = function (variables) {\n variables.push(this.variableName);\n };\n Variable.prototype.getCorrectValue = function (value) {\n if (this.useValueAsItIs)\n return value;\n return _super.prototype.getCorrectValue.call(this, value);\n };\n Variable.DisableConversionChar = \"#\";\n return Variable;\n}(Const));\n\nvar FunctionOperand = /** @class */ (function (_super) {\n __extends(FunctionOperand, _super);\n function FunctionOperand(originalValue, parameters) {\n var _this = _super.call(this) || this;\n _this.originalValue = originalValue;\n _this.parameters = parameters;\n _this.isReadyValue = false;\n if (Array.isArray(parameters) && parameters.length === 0) {\n _this.parameters = new ArrayOperand([]);\n }\n return _this;\n }\n FunctionOperand.prototype.getType = function () {\n return \"function\";\n };\n FunctionOperand.prototype.evaluateAsync = function (processValue) {\n var _this = this;\n this.isReadyValue = false;\n var asyncProcessValue = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_2__[\"ProcessValue\"]();\n asyncProcessValue.values = _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].createCopy(processValue.values);\n asyncProcessValue.properties = _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].createCopy(processValue.properties);\n asyncProcessValue.properties.returnResult = function (result) {\n _this.asynResult = result;\n _this.isReadyValue = true;\n _this.onAsyncReady();\n };\n this.evaluateCore(asyncProcessValue);\n };\n FunctionOperand.prototype.evaluate = function (processValue) {\n if (this.isReady)\n return this.asynResult;\n return this.evaluateCore(processValue);\n };\n FunctionOperand.prototype.evaluateCore = function (processValue) {\n return _functionsfactory__WEBPACK_IMPORTED_MODULE_1__[\"FunctionFactory\"].Instance.run(this.originalValue, this.parameters.evaluate(processValue), processValue.properties);\n };\n FunctionOperand.prototype.toString = function (func) {\n if (func === void 0) { func = undefined; }\n if (!!func) {\n var res = func(this);\n if (!!res)\n return res;\n }\n return this.originalValue + \"(\" + this.parameters.toString(func) + \")\";\n };\n FunctionOperand.prototype.setVariables = function (variables) {\n this.parameters.setVariables(variables);\n };\n Object.defineProperty(FunctionOperand.prototype, \"isReady\", {\n get: function () {\n return this.isReadyValue;\n },\n enumerable: false,\n configurable: true\n });\n FunctionOperand.prototype.hasFunction = function () {\n return true;\n };\n FunctionOperand.prototype.hasAsyncFunction = function () {\n return _functionsfactory__WEBPACK_IMPORTED_MODULE_1__[\"FunctionFactory\"].Instance.isAsyncFunction(this.originalValue);\n };\n FunctionOperand.prototype.addToAsyncList = function (list) {\n if (this.hasAsyncFunction()) {\n list.push(this);\n }\n };\n return FunctionOperand;\n}(Operand));\n\nvar OperandMaker = /** @class */ (function () {\n function OperandMaker() {\n }\n OperandMaker.throwInvalidOperatorError = function (op) {\n throw new Error(\"Invalid operator: '\" + op + \"'\");\n };\n OperandMaker.safeToString = function (operand, func) {\n return operand == null ? \"\" : operand.toString(func);\n };\n OperandMaker.toOperandString = function (value) {\n if (!!value &&\n !OperandMaker.isNumeric(value) &&\n !OperandMaker.isBooleanValue(value))\n value = \"'\" + value + \"'\";\n return value;\n };\n OperandMaker.isSpaceString = function (str) {\n return !!str && !str.replace(\" \", \"\");\n };\n OperandMaker.isNumeric = function (value) {\n if (!!value &&\n (value.indexOf(\"-\") > -1 ||\n value.indexOf(\"+\") > 1 ||\n value.indexOf(\"*\") > -1 ||\n value.indexOf(\"^\") > -1 ||\n value.indexOf(\"/\") > -1 ||\n value.indexOf(\"%\") > -1))\n return false;\n if (OperandMaker.isSpaceString(value))\n return false;\n return _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isNumber(value);\n };\n OperandMaker.isBooleanValue = function (value) {\n return (!!value &&\n (value.toLowerCase() === \"true\" || value.toLowerCase() === \"false\"));\n };\n OperandMaker.isTwoValueEquals = function (x, y) {\n if (x === \"undefined\")\n x = undefined;\n if (y === \"undefined\")\n y = undefined;\n return _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isTwoValueEquals(x, y, true);\n };\n OperandMaker.operatorToString = function (operatorName) {\n var opStr = OperandMaker.signs[operatorName];\n return opStr == null ? operatorName : opStr;\n };\n OperandMaker.unaryFunctions = {\n empty: function (value) {\n return _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(value);\n },\n notempty: function (value) {\n return !OperandMaker.unaryFunctions.empty(value);\n },\n negate: function (value) {\n return !value;\n },\n };\n OperandMaker.binaryFunctions = {\n arithmeticOp: function (operatorName) {\n return function (a, b) {\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(a) && !OperandMaker.isSpaceString(a)) {\n a = typeof b === \"string\" ? \"\" : 0;\n }\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(b) && !OperandMaker.isSpaceString(b)) {\n b = typeof a === \"string\" ? \"\" : 0;\n }\n var consumer = OperandMaker.binaryFunctions[operatorName];\n return consumer == null ? null : consumer.call(this, a, b);\n };\n },\n and: function (a, b) {\n return a && b;\n },\n or: function (a, b) {\n return a || b;\n },\n plus: function (a, b) {\n return a + b;\n },\n minus: function (a, b) {\n return a - b;\n },\n mul: function (a, b) {\n return a * b;\n },\n div: function (a, b) {\n if (!b)\n return null;\n return a / b;\n },\n mod: function (a, b) {\n if (!b)\n return null;\n return a % b;\n },\n power: function (a, b) {\n return Math.pow(a, b);\n },\n greater: function (left, right) {\n if (left == null || right == null)\n return false;\n return left > right;\n },\n less: function (left, right) {\n if (left == null || right == null)\n return false;\n return left < right;\n },\n greaterorequal: function (left, right) {\n if (OperandMaker.binaryFunctions.equal(left, right))\n return true;\n return OperandMaker.binaryFunctions.greater(left, right);\n },\n lessorequal: function (left, right) {\n if (OperandMaker.binaryFunctions.equal(left, right))\n return true;\n return OperandMaker.binaryFunctions.less(left, right);\n },\n equal: function (left, right) {\n return OperandMaker.isTwoValueEquals(left, right);\n },\n notequal: function (left, right) {\n return !OperandMaker.binaryFunctions.equal(left, right);\n },\n contains: function (left, right) {\n return OperandMaker.binaryFunctions.containsCore(left, right, true);\n },\n notcontains: function (left, right) {\n if (!left && !_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(right))\n return true;\n return OperandMaker.binaryFunctions.containsCore(left, right, false);\n },\n anyof: function (left, right) {\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(left) && _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(right))\n return true;\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(left) ||\n (!Array.isArray(left) && left.length === 0))\n return false;\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(right))\n return true;\n if (!Array.isArray(left))\n return OperandMaker.binaryFunctions.contains(right, left);\n if (!Array.isArray(right))\n return OperandMaker.binaryFunctions.contains(left, right);\n for (var i = 0; i < right.length; i++) {\n if (OperandMaker.binaryFunctions.contains(left, right[i]))\n return true;\n }\n return false;\n },\n allof: function (left, right) {\n if (!left && !_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(right))\n return false;\n if (!Array.isArray(right))\n return OperandMaker.binaryFunctions.contains(left, right);\n for (var i = 0; i < right.length; i++) {\n if (!OperandMaker.binaryFunctions.contains(left, right[i]))\n return false;\n }\n return true;\n },\n containsCore: function (left, right, isContains) {\n if (!left && left !== 0 && left !== false)\n return false;\n if (!left.length) {\n left = left.toString();\n if (typeof right === \"string\" || right instanceof String) {\n left = left.toUpperCase();\n right = right.toUpperCase();\n }\n }\n if (typeof left === \"string\" || left instanceof String) {\n if (!right)\n return false;\n right = right.toString();\n var found = left.indexOf(right) > -1;\n return isContains ? found : !found;\n }\n var rightArray = Array.isArray(right) ? right : [right];\n for (var rIndex = 0; rIndex < rightArray.length; rIndex++) {\n var i = 0;\n right = rightArray[rIndex];\n for (; i < left.length; i++) {\n if (OperandMaker.isTwoValueEquals(left[i], right))\n break;\n }\n if (i == left.length)\n return !isContains;\n }\n return isContains;\n },\n };\n OperandMaker.signs = {\n less: \"<\",\n lessorequal: \"<=\",\n greater: \">\",\n greaterorequal: \">=\",\n equal: \"==\",\n notequal: \"!=\",\n plus: \"+\",\n minus: \"-\",\n mul: \"*\",\n div: \"/\",\n and: \"and\",\n or: \"or\",\n power: \"^\",\n mod: \"%\",\n negate: \"!\",\n };\n return OperandMaker;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/flowpanel.ts\":\n/*!**************************!*\\\n !*** ./src/flowpanel.ts ***!\n \\**************************/\n/*! exports provided: FlowPanelModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"FlowPanelModel\", function() { return FlowPanelModel; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _panel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./panel */ \"./src/panel.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n/**\n * The flow panel object. It is a container with flow layout where you can mix questions with markdown text.\n *\n */\nvar FlowPanelModel = /** @class */ (function (_super) {\n __extends(FlowPanelModel, _super);\n function FlowPanelModel(name) {\n if (name === void 0) { name = \"\"; }\n var _this = _super.call(this, name) || this;\n _this.createLocalizableString(\"content\", _this, true);\n var self = _this;\n _this.registerFunctionOnPropertyValueChanged(\"content\", function () {\n self.onContentChanged();\n });\n return _this;\n }\n FlowPanelModel.prototype.getType = function () {\n return \"flowpanel\";\n };\n FlowPanelModel.prototype.getChildrenLayoutType = function () {\n return \"flow\";\n };\n FlowPanelModel.prototype.onSurveyLoad = function () {\n _super.prototype.onSurveyLoad.call(this);\n this.onContentChanged();\n };\n Object.defineProperty(FlowPanelModel.prototype, \"content\", {\n get: function () {\n return this.getLocalizableStringText(\"content\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"content\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(FlowPanelModel.prototype, \"locContent\", {\n get: function () {\n return this.getLocalizableString(\"content\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(FlowPanelModel.prototype, \"html\", {\n get: function () {\n return this.getPropertyValue(\"html\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"html\", val);\n },\n enumerable: false,\n configurable: true\n });\n FlowPanelModel.prototype.onContentChanged = function () {\n var html = \"\";\n if (!!this.onCustomHtmlProducing) {\n html = this.onCustomHtmlProducing();\n }\n else {\n html = this.produceHtml();\n }\n this.html = html;\n if (!!this.contentChangedCallback)\n this.contentChangedCallback();\n };\n FlowPanelModel.prototype.produceHtml = function () {\n var html = [];\n //contentElementNamePrefix\n var regEx = /{(.*?(element:)[^$].*?)}/g;\n var str = this.content;\n var startIndex = 0;\n var res = null;\n while ((res = regEx.exec(str)) !== null) {\n if (res.index > startIndex) {\n html.push(str.substr(startIndex, res.index - startIndex));\n startIndex = res.index;\n }\n var question = this.getQuestionFromText(res[0]);\n if (!!question) {\n html.push(this.getHtmlForQuestion(question));\n }\n else {\n html.push(str.substr(startIndex, res.index + res[0].length - startIndex));\n }\n startIndex = res.index + res[0].length;\n }\n if (startIndex < str.length) {\n html.push(str.substr(startIndex, str.length - startIndex));\n }\n return html.join(\"\").replace(new RegExp(\"
\", \"g\"), \"
\");\n };\n FlowPanelModel.prototype.getQuestionFromText = function (str) {\n str = str.substr(1, str.length - 2);\n str = str.replace(FlowPanelModel.contentElementNamePrefix, \"\").trim();\n return this.getQuestionByName(str);\n };\n FlowPanelModel.prototype.getHtmlForQuestion = function (question) {\n if (!!this.onGetHtmlForQuestion)\n return this.onGetHtmlForQuestion(question);\n return \"\";\n };\n FlowPanelModel.prototype.getQuestionHtmlId = function (question) {\n return this.name + \"_\" + question.id;\n };\n FlowPanelModel.prototype.onAddElement = function (element, index) {\n _super.prototype.onAddElement.call(this, element, index);\n this.addElementToContent(element);\n element.renderWidth = \"\";\n };\n FlowPanelModel.prototype.onRemoveElement = function (element) {\n var searchStr = this.getElementContentText(element);\n this.content = this.content.replace(searchStr, \"\");\n _super.prototype.onRemoveElement.call(this, element);\n };\n FlowPanelModel.prototype.dragDropMoveElement = function (src, target, targetIndex) { };\n FlowPanelModel.prototype.addElementToContent = function (element) {\n if (this.isLoadingFromJson)\n return;\n var text = this.getElementContentText(element);\n if (!this.insertTextAtCursor(text)) {\n this.content = this.content + text;\n }\n };\n FlowPanelModel.prototype.insertTextAtCursor = function (text, prevName) {\n if (prevName === void 0) { prevName = null; }\n if (!this.isDesignMode ||\n typeof document === \"undefined\" ||\n !window.getSelection)\n return false;\n var sel = window.getSelection();\n if (sel.getRangeAt && sel.rangeCount) {\n var range = sel.getRangeAt(0);\n range.deleteContents();\n range.insertNode(document.createTextNode(text));\n var self = this;\n if (self.getContent) {\n var str = self.getContent(prevName);\n this.content = str;\n }\n return true;\n }\n return false;\n };\n FlowPanelModel.prototype.getElementContentText = function (element) {\n return \"{\" + FlowPanelModel.contentElementNamePrefix + element.name + \"}\";\n };\n FlowPanelModel.contentElementNamePrefix = \"element:\";\n return FlowPanelModel;\n}(_panel__WEBPACK_IMPORTED_MODULE_1__[\"PanelModel\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"flowpanel\", [{ name: \"content:html\", serializationProperty: \"locContent\" }], function () {\n return new FlowPanelModel();\n}, \"panel\");\n\n\n/***/ }),\n\n/***/ \"./src/functionsfactory.ts\":\n/*!*********************************!*\\\n !*** ./src/functionsfactory.ts ***!\n \\*********************************/\n/*! exports provided: FunctionFactory, registerFunction */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"FunctionFactory\", function() { return FunctionFactory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"registerFunction\", function() { return registerFunction; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n\nvar FunctionFactory = /** @class */ (function () {\n function FunctionFactory() {\n this.functionHash = {};\n this.isAsyncHash = {};\n }\n FunctionFactory.prototype.register = function (name, func, isAsync) {\n if (isAsync === void 0) { isAsync = false; }\n this.functionHash[name] = func;\n if (isAsync)\n this.isAsyncHash[name] = true;\n };\n FunctionFactory.prototype.unregister = function (name) {\n delete this.functionHash[name];\n delete this.isAsyncHash[name];\n };\n FunctionFactory.prototype.hasFunction = function (name) {\n return !!this.functionHash[name];\n };\n FunctionFactory.prototype.isAsyncFunction = function (name) {\n return !!this.isAsyncHash[name];\n };\n FunctionFactory.prototype.clear = function () {\n this.functionHash = {};\n };\n FunctionFactory.prototype.getAll = function () {\n var result = [];\n for (var key in this.functionHash) {\n result.push(key);\n }\n return result.sort();\n };\n FunctionFactory.prototype.run = function (name, params, properties) {\n if (properties === void 0) { properties = null; }\n var func = this.functionHash[name];\n if (!func)\n return null;\n var classRunner = {\n func: func,\n };\n if (properties) {\n for (var key in properties) {\n classRunner[key] = properties[key];\n }\n }\n return classRunner.func(params);\n };\n FunctionFactory.Instance = new FunctionFactory();\n return FunctionFactory;\n}());\n\nvar registerFunction = FunctionFactory.Instance.register;\nfunction getParamsAsArray(value, arr) {\n if (value === undefined || value === null)\n return;\n if (Array.isArray(value)) {\n for (var i = 0; i < value.length; i++) {\n getParamsAsArray(value[i], arr);\n }\n }\n else {\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isNumber(value)) {\n value = parseFloat(value);\n }\n arr.push(value);\n }\n}\nfunction sum(params) {\n var arr = [];\n getParamsAsArray(params, arr);\n var res = 0;\n for (var i = 0; i < arr.length; i++) {\n res += arr[i];\n }\n return res;\n}\nFunctionFactory.Instance.register(\"sum\", sum);\nfunction min_max(params, isMin) {\n var arr = [];\n getParamsAsArray(params, arr);\n var res = undefined;\n for (var i = 0; i < arr.length; i++) {\n if (res === undefined) {\n res = arr[i];\n }\n if (isMin) {\n if (res > arr[i])\n res = arr[i];\n }\n else {\n if (res < arr[i])\n res = arr[i];\n }\n }\n return res;\n}\nfunction min(params) {\n return min_max(params, true);\n}\nFunctionFactory.Instance.register(\"min\", min);\nfunction max(params) {\n return min_max(params, false);\n}\nFunctionFactory.Instance.register(\"max\", max);\nfunction count(params) {\n var arr = [];\n getParamsAsArray(params, arr);\n return arr.length;\n}\nFunctionFactory.Instance.register(\"count\", count);\nfunction avg(params) {\n var arr = [];\n getParamsAsArray(params, arr);\n var res = 0;\n for (var i = 0; i < arr.length; i++) {\n res += arr[i];\n }\n return arr.length > 0 ? res / arr.length : 0;\n}\nFunctionFactory.Instance.register(\"avg\", avg);\nfunction getInArrayParams(params) {\n if (params.length != 2)\n return null;\n var arr = params[0];\n if (!arr)\n return null;\n if (!Array.isArray(arr) && !Array.isArray(Object.keys(arr)))\n return null;\n var name = params[1];\n if (typeof name !== \"string\" && !(name instanceof String))\n return null;\n return { data: arr, name: name };\n}\nfunction calcInArray(params, func) {\n var v = getInArrayParams(params);\n if (!v)\n return undefined;\n var res = undefined;\n if (Array.isArray(v.data)) {\n for (var i = 0; i < v.data.length; i++) {\n var item = v.data[i];\n if (!!item && item[v.name]) {\n res = func(res, item[v.name]);\n }\n }\n }\n else {\n for (var key in v.data) {\n var item = v.data[key];\n if (!!item && item[v.name]) {\n res = func(res, item[v.name]);\n }\n }\n }\n return res;\n}\nfunction sumInArray(params) {\n var res = calcInArray(params, function (res, val) {\n if (res == undefined)\n res = 0;\n return +res + +val;\n });\n return res !== undefined ? res : 0;\n}\nFunctionFactory.Instance.register(\"sumInArray\", sumInArray);\nfunction minInArray(params) {\n return calcInArray(params, function (res, val) {\n if (res == undefined)\n return val;\n return res < val ? res : val;\n });\n}\nFunctionFactory.Instance.register(\"minInArray\", minInArray);\nfunction maxInArray(params) {\n return calcInArray(params, function (res, val) {\n if (res == undefined)\n return val;\n return res > val ? res : val;\n });\n}\nFunctionFactory.Instance.register(\"maxInArray\", maxInArray);\nfunction countInArray(params) {\n var res = calcInArray(params, function (res, val) {\n if (res == undefined)\n res = 0;\n return res + 1;\n });\n return res !== undefined ? res : 0;\n}\nFunctionFactory.Instance.register(\"countInArray\", countInArray);\nfunction avgInArray(params) {\n var count = countInArray(params);\n if (count == 0)\n return 0;\n return sumInArray(params) / count;\n}\nFunctionFactory.Instance.register(\"avgInArray\", avgInArray);\nfunction iif(params) {\n if (!params && params.length !== 3)\n return \"\";\n return params[0] ? params[1] : params[2];\n}\nFunctionFactory.Instance.register(\"iif\", iif);\nfunction getDate(params) {\n if (!params && params.length < 1)\n return null;\n if (!params[0])\n return null;\n return new Date(params[0]);\n}\nFunctionFactory.Instance.register(\"getDate\", getDate);\nfunction age(params) {\n if (!params && params.length < 1)\n return null;\n if (!params[0])\n return null;\n var birthDate = new Date(params[0]);\n var today = new Date();\n var age = today.getFullYear() - birthDate.getFullYear();\n var m = today.getMonth() - birthDate.getMonth();\n if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {\n age -= age > 0 ? 1 : 0;\n }\n return age;\n}\nFunctionFactory.Instance.register(\"age\", age);\nfunction isContainerReady(params) {\n if (!params && params.length < 1)\n return false;\n if (!params[0] || !this.survey)\n return false;\n var name = params[0];\n var container = this.survey.getPageByName(name);\n if (!container)\n container = this.survey.getPanelByName(name);\n if (!container)\n return false;\n var questions = container.questions;\n for (var i = 0; i < questions.length; i++) {\n if (questions[i].hasErrors(false))\n return false;\n }\n return true;\n}\nFunctionFactory.Instance.register(\"isContainerReady\", isContainerReady);\nfunction isDisplayMode() {\n return this.survey && this.survey.isDisplayMode;\n}\nFunctionFactory.Instance.register(\"isDisplayMode\", isDisplayMode);\nfunction currentDate() {\n return new Date();\n}\nFunctionFactory.Instance.register(\"currentDate\", currentDate);\nfunction today(params) {\n var res = new Date();\n if (Array.isArray(params) && params.length == 1) {\n res.setDate(res.getDate() + params[0]);\n }\n return res;\n}\nFunctionFactory.Instance.register(\"today\", today);\nfunction diffDays(params) {\n if (!Array.isArray(params) || params.length !== 2)\n return 0;\n if (!params[0] || !params[1])\n return 0;\n var date1 = new Date(params[0]);\n var date2 = new Date(params[1]);\n var diffTime = Math.abs(date2 - date1);\n return Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n}\nFunctionFactory.Instance.register(\"diffDays\", diffDays);\n\n\n/***/ }),\n\n/***/ \"./src/helpers.ts\":\n/*!************************!*\\\n !*** ./src/helpers.ts ***!\n \\************************/\n/*! exports provided: Helpers */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Helpers\", function() { return Helpers; });\nvar Helpers = /** @class */ (function () {\n function Helpers() {\n }\n /**\n * A static methods that returns true if a value undefined, null, empty string or empty array.\n * @param value\n */\n Helpers.isValueEmpty = function (value) {\n if (Array.isArray(value) && value.length === 0)\n return true;\n if (!!value && typeof value === \"object\" && value.constructor === Object) {\n for (var key in value) {\n if (!Helpers.isValueEmpty(value[key]))\n return false;\n }\n return true;\n }\n return !value && value !== 0 && value !== false;\n };\n Helpers.isArrayContainsEqual = function (x, y) {\n if (!Array.isArray(x) || !Array.isArray(y))\n return false;\n if (x.length !== y.length)\n return false;\n for (var i = 0; i < x.length; i++) {\n var j = 0;\n for (; j < y.length; j++) {\n if (Helpers.isTwoValueEquals(x[i], y[j]))\n break;\n }\n if (j === y.length)\n return false;\n }\n return true;\n };\n Helpers.isArraysEqual = function (x, y, ignoreOrder) {\n if (ignoreOrder === void 0) { ignoreOrder = false; }\n if (!Array.isArray(x) || !Array.isArray(y))\n return false;\n if (x.length !== y.length)\n return false;\n if (ignoreOrder) {\n var xSorted = [];\n var ySorted = [];\n for (var i = 0; i < x.length; i++) {\n xSorted.push(x[i]);\n ySorted.push(y[i]);\n }\n xSorted.sort();\n ySorted.sort();\n x = xSorted;\n y = ySorted;\n }\n for (var i = 0; i < x.length; i++) {\n if (!Helpers.isTwoValueEquals(x[i], y[i]))\n return false;\n }\n return true;\n };\n Helpers.isTwoValueEquals = function (x, y, ignoreOrder) {\n if (ignoreOrder === void 0) { ignoreOrder = false; }\n if (x === y)\n return true;\n if (Array.isArray(x) && x.length === 0 && typeof y === \"undefined\")\n return true;\n if (Array.isArray(y) && y.length === 0 && typeof x === \"undefined\")\n return true;\n if ((x === undefined || x === null) && y === \"\")\n return true;\n if ((y === undefined || y === null) && x === \"\")\n return true;\n if (typeof x === \"string\" && typeof y == \"string\")\n return x == y;\n if (Helpers.isConvertibleToNumber(x) && Helpers.isConvertibleToNumber(y)) {\n if (parseInt(x) === parseInt(y) && parseFloat(x) === parseFloat(y)) {\n return true;\n }\n }\n if ((!Helpers.isValueEmpty(x) && Helpers.isValueEmpty(y)) ||\n (Helpers.isValueEmpty(x) && !Helpers.isValueEmpty(y)))\n return false;\n if ((x === true || x === false) && typeof y == \"string\") {\n return x.toString() === y.toLocaleLowerCase();\n }\n if ((y === true || y === false) && typeof x == \"string\") {\n return y.toString() === x.toLocaleLowerCase();\n }\n if (!(x instanceof Object) && !(y instanceof Object))\n return x == y;\n if (!(x instanceof Object) || !(y instanceof Object))\n return false;\n if (x[\"equals\"])\n return x.equals(y);\n if (!!x.toJSON && !!y.toJSON && !!x.getType && !!y.getType) {\n if (x.isDiposed || y.isDiposed)\n return false;\n if (x.getType() !== y.getType())\n return false;\n if (!!x.name && x.name !== y.name)\n return false;\n return this.isTwoValueEquals(x.toJSON(), y.toJSON());\n }\n if (Array.isArray(x) && Array.isArray(y))\n return Helpers.isArraysEqual(x, y, ignoreOrder);\n for (var p in x) {\n if (!x.hasOwnProperty(p))\n continue;\n if (!y.hasOwnProperty(p))\n return false;\n if (x[p] === y[p])\n continue;\n if (typeof x[p] !== \"object\")\n return false;\n if (!this.isTwoValueEquals(x[p], y[p]))\n return false;\n }\n for (p in y) {\n if (y.hasOwnProperty(p) && !x.hasOwnProperty(p))\n return false;\n }\n return true;\n };\n Helpers.randomizeArray = function (array) {\n for (var i = array.length - 1; i > 0; i--) {\n var j = Math.floor(Math.random() * (i + 1));\n var temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n }\n return array;\n };\n Helpers.getUnbindValue = function (value) {\n if (!!value && value instanceof Object) {\n //do not return the same object instance!!!\n return JSON.parse(JSON.stringify(value));\n }\n return value;\n };\n Helpers.createCopy = function (obj) {\n var res = {};\n if (!obj)\n return res;\n for (var key in obj) {\n res[key] = obj[key];\n }\n return res;\n };\n Helpers.isConvertibleToNumber = function (value) {\n return (value !== undefined &&\n value !== null &&\n !Array.isArray(value) &&\n !isNaN(value));\n };\n Helpers.isNumber = function (value) {\n if (typeof value == \"string\" &&\n !!value &&\n value.indexOf(\"0x\") == 0 &&\n value.length > 32)\n return false;\n return !isNaN(parseFloat(value)) && isFinite(value);\n };\n Helpers.getMaxLength = function (maxLength, surveyLength) {\n if (maxLength < 0) {\n maxLength = surveyLength;\n }\n return maxLength > 0 ? maxLength : null;\n };\n Helpers.getNumberByIndex = function (index, startIndexStr) {\n if (index < 0)\n return \"\";\n var startIndex = 1;\n var prefix = \"\";\n var postfix = \".\";\n var isNumeric = true;\n var strIndex = \"A\";\n var str = \"\";\n if (!!startIndexStr) {\n str = startIndexStr;\n var ind = str.length - 1;\n var hasDigit = false;\n for (var i = 0; i < str.length; i++) {\n if (Helpers.isCharDigit(str[i])) {\n hasDigit = true;\n break;\n }\n }\n var checkLetter = function () {\n return ((hasDigit && !Helpers.isCharDigit(str[ind])) ||\n Helpers.isCharNotLetterAndDigit(str[ind]));\n };\n while (ind >= 0 && checkLetter())\n ind--;\n var newPostfix = \"\";\n if (ind < str.length - 1) {\n newPostfix = str.substr(ind + 1);\n str = str.substr(0, ind + 1);\n }\n ind = str.length - 1;\n while (ind >= 0) {\n if (checkLetter())\n break;\n ind--;\n if (!hasDigit)\n break;\n }\n strIndex = str.substr(ind + 1);\n prefix = str.substr(0, ind + 1);\n if (parseInt(strIndex))\n startIndex = parseInt(strIndex);\n else if (strIndex.length == 1)\n isNumeric = false;\n if (!!newPostfix || !!prefix) {\n postfix = newPostfix;\n }\n }\n if (isNumeric)\n return prefix + (index + startIndex).toString() + postfix;\n return (prefix + String.fromCharCode(strIndex.charCodeAt(0) + index) + postfix);\n };\n Helpers.isCharNotLetterAndDigit = function (ch) {\n return ch.toUpperCase() == ch.toLowerCase() && !Helpers.isCharDigit(ch);\n };\n Helpers.isCharDigit = function (ch) {\n return ch >= \"0\" && ch <= \"9\";\n };\n return Helpers;\n}());\n\nif (!String.prototype[\"format\"]) {\n String.prototype[\"format\"] = function () {\n var args = arguments;\n return this.replace(/{(\\d+)}/g, function (match, number) {\n return typeof args[number] != \"undefined\" ? args[number] : match;\n });\n };\n}\n\n\n/***/ }),\n\n/***/ \"./src/itemvalue.ts\":\n/*!**************************!*\\\n !*** ./src/itemvalue.ts ***!\n \\**************************/\n/*! exports provided: ItemValue */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ItemValue\", function() { return ItemValue; });\n/* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localizablestring */ \"./src/localizablestring.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./conditions */ \"./src/conditions.ts\");\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __spreadArray = (undefined && undefined.__spreadArray) || function (to, from) {\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n to[j] = from[i];\n return to;\n};\n\n\n\n\n\n\n/**\n * Array of ItemValue is used in checkox, dropdown and radiogroup choices, matrix columns and rows.\n * It has two main properties: value and text. If text is empty, value is used for displaying.\n * The text property is localizable and support markdown.\n */\nvar ItemValue = /** @class */ (function (_super) {\n __extends(ItemValue, _super);\n function ItemValue(value, text, typeName) {\n if (text === void 0) { text = null; }\n if (typeName === void 0) { typeName = \"itemvalue\"; }\n var _this = _super.call(this) || this;\n _this.typeName = typeName;\n _this.ownerPropertyName = \"\";\n _this.isVisibleValue = true;\n _this.locTextValue = new _localizablestring__WEBPACK_IMPORTED_MODULE_0__[\"LocalizableString\"](null, true);\n _this.locTextValue.onStrChanged = function (oldValue, newValue) {\n if (newValue == _this.value) {\n newValue = undefined;\n }\n _this.propertyValueChanged(\"text\", oldValue, newValue);\n };\n _this.locTextValue.onGetTextCallback = function (txt) {\n return txt\n ? txt\n : !_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isValueEmpty(_this.value)\n ? _this.value.toString()\n : null;\n };\n if (text)\n _this.locText.text = text;\n if (!!value && typeof value === \"object\") {\n _this.setData(value);\n }\n else {\n _this.value = value;\n }\n if (_this.getType() != \"itemvalue\") {\n _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"CustomPropertiesCollection\"].createProperties(_this);\n }\n _this.onCreating();\n return _this;\n }\n Object.defineProperty(ItemValue, \"Separator\", {\n get: function () {\n return _settings__WEBPACK_IMPORTED_MODULE_5__[\"settings\"].itemValueSeparator;\n },\n set: function (val) {\n _settings__WEBPACK_IMPORTED_MODULE_5__[\"settings\"].itemValueSeparator = val;\n },\n enumerable: false,\n configurable: true\n });\n ItemValue.createArray = function (locOwner) {\n var items = [];\n ItemValue.setupArray(items, locOwner);\n return items;\n };\n ItemValue.setupArray = function (items, locOwner) {\n items.push = function (value) {\n var result = Array.prototype.push.call(this, value);\n value.locOwner = locOwner;\n return result;\n };\n items.unshift = function (value) {\n var result = Array.prototype.unshift.call(this, value);\n value.locOwner = locOwner;\n return result;\n };\n items.splice = function (start, deleteCount) {\n var _a;\n var items = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n items[_i - 2] = arguments[_i];\n }\n var result = (_a = Array.prototype.splice).call.apply(_a, __spreadArray([this,\n start,\n deleteCount], items));\n if (!items)\n items = [];\n for (var i = 0; i < items.length; i++) {\n items[i].locOwner = locOwner;\n }\n return result;\n };\n };\n ItemValue.setData = function (items, values) {\n items.length = 0;\n for (var i = 0; i < values.length; i++) {\n var value = values[i];\n var item;\n if (typeof value.getType === \"function\") {\n item = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].createClass(value.getType());\n }\n else {\n item = new ItemValue(null);\n }\n item.setData(value);\n if (!!value.originalItem) {\n item.originalItem = value.originalItem;\n }\n items.push(item);\n }\n };\n ItemValue.getData = function (items) {\n var result = new Array();\n for (var i = 0; i < items.length; i++) {\n result.push(items[i].getData());\n }\n return result;\n };\n ItemValue.getItemByValue = function (items, val) {\n if (!Array.isArray(items))\n return null;\n var valIsEmpty = _helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isValueEmpty(val);\n for (var i = 0; i < items.length; i++) {\n if (valIsEmpty && _helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isValueEmpty(items[i].value))\n return items[i];\n if (_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isTwoValueEquals(items[i].value, val))\n return items[i];\n }\n return null;\n };\n ItemValue.getTextOrHtmlByValue = function (items, val) {\n var item = ItemValue.getItemByValue(items, val);\n return item !== null ? item.locText.textOrHtml : \"\";\n };\n ItemValue.locStrsChanged = function (items) {\n for (var i = 0; i < items.length; i++) {\n items[i].locText.strChanged();\n }\n };\n ItemValue.runConditionsForItems = function (items, filteredItems, runner, values, properties, useItemExpression) {\n if (useItemExpression === void 0) { useItemExpression = true; }\n return ItemValue.runConditionsForItemsCore(items, filteredItems, runner, values, properties, true, useItemExpression);\n };\n ItemValue.runEnabledConditionsForItems = function (items, runner, values, properties, onItemCallBack) {\n return ItemValue.runConditionsForItemsCore(items, null, runner, values, properties, false, true, onItemCallBack);\n };\n ItemValue.runConditionsForItemsCore = function (items, filteredItems, runner, values, properties, isVisible, useItemExpression, onItemCallBack) {\n if (useItemExpression === void 0) { useItemExpression = true; }\n if (!values) {\n values = {};\n }\n var itemValue = values[\"item\"];\n var choiceValue = values[\"choice\"];\n var hasChanded = false;\n for (var i = 0; i < items.length; i++) {\n var item = items[i];\n values[\"item\"] = item.value;\n values[\"choice\"] = item.value;\n var itemRunner = useItemExpression && !!item.getConditionRunner\n ? item.getConditionRunner(isVisible)\n : false;\n if (!itemRunner) {\n itemRunner = runner;\n }\n var newValue = true;\n if (itemRunner) {\n newValue = itemRunner.run(values, properties);\n }\n if (newValue && !!onItemCallBack) {\n newValue = onItemCallBack(item);\n }\n if (!!filteredItems && newValue) {\n filteredItems.push(item);\n }\n var oldValue = isVisible ? item.isVisible : item.isEnabled;\n if (newValue != oldValue) {\n hasChanded = true;\n if (isVisible) {\n if (!!item.setIsVisible)\n item.setIsVisible(newValue);\n }\n else {\n if (!!item.setIsEnabled)\n item.setIsEnabled(newValue);\n }\n }\n }\n if (itemValue) {\n values[\"item\"] = itemValue;\n }\n else {\n delete values[\"item\"];\n }\n if (choiceValue) {\n values[\"choice\"] = choiceValue;\n }\n else {\n delete values[\"choice\"];\n }\n return hasChanded;\n };\n ItemValue.prototype.onCreating = function () { };\n ItemValue.prototype.getType = function () {\n return !!this.typeName ? this.typeName : \"itemvalue\";\n };\n ItemValue.prototype.getSurvey = function (live) {\n if (live === void 0) { live = false; }\n return !!this.locOwner && !!this.locOwner[\"getSurvey\"]\n ? this.locOwner.getSurvey()\n : null;\n };\n ItemValue.prototype.getLocale = function () {\n return (this.locText && this.locText.locale) || \"\";\n };\n Object.defineProperty(ItemValue.prototype, \"locText\", {\n get: function () {\n return this.locTextValue;\n },\n enumerable: false,\n configurable: true\n });\n ItemValue.prototype.setLocText = function (locText) {\n this.locTextValue = locText;\n };\n Object.defineProperty(ItemValue.prototype, \"locOwner\", {\n get: function () {\n return this.locText.owner;\n },\n set: function (value) {\n this.locText.owner = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ItemValue.prototype, \"value\", {\n get: function () {\n return this.getPropertyValue(\"value\");\n },\n set: function (newValue) {\n var text = undefined;\n if (!_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isValueEmpty(newValue)) {\n var str = newValue.toString();\n var index = str.indexOf(_settings__WEBPACK_IMPORTED_MODULE_5__[\"settings\"].itemValueSeparator);\n if (index > -1) {\n newValue = str.slice(0, index);\n text = str.slice(index + 1);\n }\n }\n this.setPropertyValue(\"value\", newValue);\n if (!!text) {\n this.text = text;\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ItemValue.prototype, \"hasText\", {\n get: function () {\n return this.locText.pureText ? true : false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ItemValue.prototype, \"pureText\", {\n get: function () {\n return this.locText.pureText;\n },\n set: function (val) {\n this.text = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ItemValue.prototype, \"text\", {\n get: function () {\n return this.locText.calculatedText; //TODO: it will be correct to use this.locText.text, however it would require a lot of rewriting in Creator\n },\n set: function (newText) {\n this.locText.text = newText;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ItemValue.prototype, \"calculatedText\", {\n get: function () {\n return this.locText.calculatedText;\n },\n enumerable: false,\n configurable: true\n });\n ItemValue.prototype.getData = function () {\n var json = this.toJSON();\n if (!!json[\"value\"] && !!json[\"value\"][\"pos\"]) {\n delete json[\"value\"][\"pos\"];\n }\n if (Object.keys(json).length == 1 && !_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isValueEmpty(json[\"value\"]))\n return this.value;\n return json;\n };\n ItemValue.prototype.toJSON = function () {\n var res = {};\n var properties = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].getProperties(this.getType());\n if (!properties || properties.length == 0) {\n properties = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].getProperties(\"itemvalue\");\n }\n var jsoObj = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]();\n for (var i = 0; i < properties.length; i++) {\n jsoObj.valueToJson(this, res, properties[i]);\n }\n return res;\n };\n ItemValue.prototype.setData = function (value) {\n if (_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isValueEmpty(value))\n return;\n if (typeof value.value !== \"undefined\") {\n var json = value;\n if (typeof value.toJSON === \"function\") {\n json = value.toJSON();\n }\n new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]().toObject(json, this);\n }\n else {\n this.value = value;\n }\n this.locText.strChanged();\n };\n Object.defineProperty(ItemValue.prototype, \"visibleIf\", {\n get: function () {\n return this.getPropertyValue(\"visibleIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"visibleIf\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ItemValue.prototype, \"enableIf\", {\n get: function () {\n return this.getPropertyValue(\"enableIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"enableIf\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ItemValue.prototype, \"isVisible\", {\n get: function () {\n return this.isVisibleValue;\n },\n enumerable: false,\n configurable: true\n });\n ItemValue.prototype.setIsVisible = function (val) {\n this.isVisibleValue = val;\n };\n Object.defineProperty(ItemValue.prototype, \"isEnabled\", {\n get: function () {\n return this.getPropertyValue(\"isEnabled\", true);\n },\n enumerable: false,\n configurable: true\n });\n ItemValue.prototype.setIsEnabled = function (val) {\n this.setPropertyValue(\"isEnabled\", val);\n };\n ItemValue.prototype.addUsedLocales = function (locales) {\n this.AddLocStringToUsedLocales(this.locTextValue, locales);\n };\n ItemValue.prototype.onPropertyValueChanged = function (name, oldValue, newValue) {\n if (name === \"value\" && !this.hasText) {\n this.locText.onChanged();\n }\n var funcName = \"itemValuePropertyChanged\";\n if (!this.locOwner || !this.locOwner[funcName])\n return;\n this.locOwner[funcName](this, name, oldValue, newValue);\n };\n ItemValue.prototype.getConditionRunner = function (isVisible) {\n if (isVisible)\n return this.getVisibleConditionRunner();\n return this.getEnableConditionRunner();\n };\n ItemValue.prototype.getVisibleConditionRunner = function () {\n if (!this.visibleIf)\n return null;\n if (!this.visibleConditionRunner)\n this.visibleConditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_3__[\"ConditionRunner\"](this.visibleIf);\n this.visibleConditionRunner.expression = this.visibleIf;\n return this.visibleConditionRunner;\n };\n ItemValue.prototype.getEnableConditionRunner = function () {\n if (!this.enableIf)\n return null;\n if (!this.enableConditionRunner)\n this.enableConditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_3__[\"ConditionRunner\"](this.enableIf);\n this.enableConditionRunner.expression = this.enableIf;\n return this.enableConditionRunner;\n };\n return ItemValue;\n}(_base__WEBPACK_IMPORTED_MODULE_4__[\"Base\"]));\n\n_base__WEBPACK_IMPORTED_MODULE_4__[\"Base\"].createItemValue = function (source, type) {\n var item = null;\n if (!!type) {\n item = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"].metaData.createClass(type, {});\n }\n else if (typeof source.getType === \"function\") {\n item = new ItemValue(null, undefined, source.getType());\n }\n else {\n item = new ItemValue(null);\n }\n item.setData(source);\n return item;\n};\n_base__WEBPACK_IMPORTED_MODULE_4__[\"Base\"].itemValueLocStrChanged = function (arr) {\n ItemValue.locStrsChanged(arr);\n};\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObjectProperty\"].getItemValuesDefaultValue = function (val) {\n var res = new Array();\n ItemValue.setData(res, val || []);\n return res;\n};\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"itemvalue\", [\n \"!value\",\n {\n name: \"text\",\n serializationProperty: \"locText\",\n },\n { name: \"visibleIf:condition\", showMode: \"form\" },\n {\n name: \"enableIf:condition\",\n showMode: \"form\",\n visibleIf: function (obj) {\n return !obj || obj.ownerPropertyName !== \"rateValues\";\n },\n },\n], function (value) { return new ItemValue(value); });\n\n\n/***/ }),\n\n/***/ \"./src/jsonobject.ts\":\n/*!***************************!*\\\n !*** ./src/jsonobject.ts ***!\n \\***************************/\n/*! exports provided: property, propertyArray, JsonObjectProperty, CustomPropertiesCollection, JsonMetadataClass, JsonMetadata, JsonError, JsonUnknownPropertyError, JsonMissingTypeErrorBase, JsonMissingTypeError, JsonIncorrectTypeError, JsonRequiredPropertyError, JsonObject, Serializer */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"property\", function() { return property; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"propertyArray\", function() { return propertyArray; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JsonObjectProperty\", function() { return JsonObjectProperty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CustomPropertiesCollection\", function() { return CustomPropertiesCollection; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JsonMetadataClass\", function() { return JsonMetadataClass; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JsonMetadata\", function() { return JsonMetadata; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JsonError\", function() { return JsonError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JsonUnknownPropertyError\", function() { return JsonUnknownPropertyError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JsonMissingTypeErrorBase\", function() { return JsonMissingTypeErrorBase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JsonMissingTypeError\", function() { return JsonMissingTypeError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JsonIncorrectTypeError\", function() { return JsonIncorrectTypeError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JsonRequiredPropertyError\", function() { return JsonRequiredPropertyError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"JsonObject\", function() { return JsonObject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Serializer\", function() { return Serializer; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __spreadArray = (undefined && undefined.__spreadArray) || function (to, from) {\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n to[j] = from[i];\n return to;\n};\n\nfunction ensureLocString(target, options, key) {\n var locString = target.getLocalizableString(key);\n if (!locString) {\n locString = target.createLocalizableString(key, target, true);\n if (typeof options.localizable === \"object\" &&\n typeof options.localizable.onGetTextCallback === \"function\") {\n locString.onGetTextCallback = options.localizable.onGetTextCallback;\n }\n }\n}\nfunction property(options) {\n return function (target, key) {\n if (!options || !options.localizable) {\n Object.defineProperty(target, key, {\n get: function () {\n var value = this.getPropertyValue(key);\n if (value !== undefined) {\n return value;\n }\n if (!!options) {\n if (options.defaultValue !== undefined) {\n return options.defaultValue;\n }\n if (options.defaultSource !== undefined) {\n return this[options.defaultSource];\n }\n }\n return undefined;\n },\n set: function (val) {\n this.setPropertyValue(key, val);\n if (!!options && options.onSet) {\n options.onSet(val, this);\n }\n },\n });\n }\n else {\n Object.defineProperty(target, key, {\n get: function () {\n ensureLocString(this, options, key);\n return (this.getLocalizableStringText(key) ||\n options.defaultValue ||\n this[options.defaultSource]);\n },\n set: function (val) {\n ensureLocString(this, options, key);\n this.setLocalizableStringText(key, val);\n if (!!options && options.onSet) {\n options.onSet(val, this);\n }\n },\n });\n Object.defineProperty(target, options.localizable === true\n ? \"loc\" + key.charAt(0).toUpperCase() + key.slice(1)\n : options.localizable.name, {\n get: function () {\n ensureLocString(this, options, key);\n return this.getLocalizableString(key);\n },\n });\n }\n };\n}\nfunction ensureArray(target, options, key) {\n target.ensureArray(key, !!options ? options.onPush : null, !!options ? options.onRemove : null);\n}\nfunction propertyArray(options) {\n return function (target, key) {\n Object.defineProperty(target, key, {\n get: function () {\n ensureArray(this, options, key);\n return this.getPropertyValue(key);\n },\n set: function (val) {\n ensureArray(this, options, key);\n var arr = this.getPropertyValue(key);\n if (val === arr) {\n return;\n }\n if (arr) {\n arr.splice.apply(arr, __spreadArray([0, arr.length], (val || [])));\n }\n else {\n this.setPropertyValue(key, val);\n }\n if (!!options && options.onSet) {\n options.onSet(val, this);\n }\n },\n });\n };\n}\n/**\n * Contains information about a property of a survey element (page, panel, questions, and etc).\n * @see addProperty\n * @see removeProperty\n * @see [Add Properties](https://surveyjs.io/Documentation/Survey-Creator#addproperties)\n * @see [Remove Properties](https://surveyjs.io/Documentation/Survey-Creator#removeproperties)\n */\nvar JsonObjectProperty = /** @class */ (function () {\n function JsonObjectProperty(classInfo, name, isRequired) {\n if (isRequired === void 0) { isRequired = false; }\n this.name = name;\n this.typeValue = null;\n this.choicesValue = null;\n this.baseValue = null;\n this.isRequiredValue = false;\n this.isUniqueValue = false;\n this.readOnlyValue = null;\n this.visibleValue = null;\n this.isLocalizableValue = null;\n this.choicesfunc = null;\n this.dependedProperties = null;\n this.isSerializable = true;\n this.isLightSerializable = true;\n this.isCustom = false;\n this.isDynamicChoices = false; //TODO obsolete, use dependsOn attribute\n this.isBindable = false;\n this.className = null;\n this.alternativeName = null;\n this.classNamePart = null;\n this.baseClassName = null;\n this.defaultValueValue = null;\n this.serializationProperty = null;\n this.displayName = null;\n this.category = \"\";\n this.categoryIndex = -1;\n this.visibleIndex = -1;\n this.nextToProperty = null;\n this.showMode = null;\n this.maxLength = -1;\n this.layout = null;\n this.onGetValue = null;\n this.onSetValue = null;\n this.visibleIf = null;\n this.isArray = false;\n this.classInfoValue = classInfo;\n this.isRequiredValue = isRequired;\n this.idValue = JsonObjectProperty.Index++;\n }\n Object.defineProperty(JsonObjectProperty.prototype, \"id\", {\n get: function () {\n return this.idValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(JsonObjectProperty.prototype, \"classInfo\", {\n get: function () {\n return this.classInfoValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(JsonObjectProperty.prototype, \"type\", {\n get: function () {\n return this.typeValue ? this.typeValue : \"string\";\n },\n set: function (value) {\n if (value === \"itemvalues\")\n value = \"itemvalue[]\";\n this.typeValue = value;\n if (this.typeValue.indexOf(\"[]\") === this.typeValue.length - 2) {\n this.isArray = true;\n this.className = this.typeValue.substr(0, this.typeValue.length - 2);\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(JsonObjectProperty.prototype, \"isRequired\", {\n get: function () {\n return this.isRequiredValue;\n },\n set: function (val) {\n this.isRequiredValue = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(JsonObjectProperty.prototype, \"isUnique\", {\n get: function () {\n return this.isUniqueValue;\n },\n set: function (val) {\n this.isUniqueValue = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(JsonObjectProperty.prototype, \"hasToUseGetValue\", {\n get: function () {\n return this.onGetValue || this.serializationProperty;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(JsonObjectProperty.prototype, \"defaultValue\", {\n get: function () {\n var result = this.defaultValueValue;\n if (!!JsonObjectProperty.getItemValuesDefaultValue &&\n JsonObject.metaData.isDescendantOf(this.className, \"itemvalue\")) {\n result = JsonObjectProperty.getItemValuesDefaultValue(this.defaultValueValue || []);\n }\n return result;\n },\n set: function (newValue) {\n this.defaultValueValue = newValue;\n },\n enumerable: false,\n configurable: true\n });\n JsonObjectProperty.prototype.isDefaultValue = function (value) {\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(this.defaultValue))\n return this.defaultValue == value;\n return ((value === false && (this.type == \"boolean\" || this.type == \"switch\")) ||\n value === \"\" ||\n _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(value));\n };\n JsonObjectProperty.prototype.getValue = function (obj) {\n if (this.onGetValue)\n return this.onGetValue(obj);\n if (this.serializationProperty && !!obj[this.serializationProperty])\n return obj[this.serializationProperty].getJson();\n return obj[this.name];\n };\n JsonObjectProperty.prototype.getPropertyValue = function (obj) {\n if (this.isLocalizable) {\n return !!obj[this.serializationProperty]\n ? obj[this.serializationProperty].text\n : null;\n }\n return this.getValue(obj);\n };\n Object.defineProperty(JsonObjectProperty.prototype, \"hasToUseSetValue\", {\n get: function () {\n return this.onSetValue || this.serializationProperty;\n },\n enumerable: false,\n configurable: true\n });\n JsonObjectProperty.prototype.setValue = function (obj, value, jsonConv) {\n if (this.onSetValue) {\n this.onSetValue(obj, value, jsonConv);\n }\n else {\n if (this.serializationProperty && !!obj[this.serializationProperty])\n obj[this.serializationProperty].setJson(value);\n else {\n if (value && typeof value === \"string\") {\n if (this.type == \"number\") {\n value = parseInt(value);\n }\n if (this.type == \"boolean\" || this.type == \"switch\") {\n value = value.toLowerCase() === \"true\";\n }\n }\n obj[this.name] = value;\n }\n }\n };\n JsonObjectProperty.prototype.getObjType = function (objType) {\n if (!this.classNamePart)\n return objType;\n return objType.replace(this.classNamePart, \"\");\n };\n JsonObjectProperty.prototype.getClassName = function (className) {\n if (className)\n className = className.toLowerCase();\n return this.classNamePart && className.indexOf(this.classNamePart) < 0\n ? className + this.classNamePart\n : className;\n };\n Object.defineProperty(JsonObjectProperty.prototype, \"choices\", {\n /**\n * Depricated, please use getChoices\n */\n get: function () {\n return this.getChoices(null);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(JsonObjectProperty.prototype, \"hasChoices\", {\n get: function () {\n return !!this.choicesValue || !!this.choicesfunc;\n },\n enumerable: false,\n configurable: true\n });\n JsonObjectProperty.prototype.getChoices = function (obj, choicesCallback) {\n if (choicesCallback === void 0) { choicesCallback = null; }\n if (this.choicesValue != null)\n return this.choicesValue;\n if (this.choicesfunc != null)\n return this.choicesfunc(obj, choicesCallback);\n return null;\n };\n JsonObjectProperty.prototype.setChoices = function (value, valueFunc) {\n if (valueFunc === void 0) { valueFunc = null; }\n this.choicesValue = value;\n this.choicesfunc = valueFunc;\n };\n JsonObjectProperty.prototype.getBaseValue = function () {\n if (!this.baseValue)\n return \"\";\n if (typeof this.baseValue == \"function\")\n return this.baseValue();\n return this.baseValue;\n };\n JsonObjectProperty.prototype.setBaseValue = function (val) {\n this.baseValue = val;\n };\n Object.defineProperty(JsonObjectProperty.prototype, \"readOnly\", {\n get: function () {\n return this.readOnlyValue != null ? this.readOnlyValue : false;\n },\n set: function (val) {\n this.readOnlyValue = val;\n },\n enumerable: false,\n configurable: true\n });\n JsonObjectProperty.prototype.isVisible = function (layout, obj) {\n if (obj === void 0) { obj = null; }\n var isLayout = !this.layout || this.layout == layout;\n if (!this.visible || !isLayout)\n return false;\n if (!!this.visibleIf && !!obj)\n return this.visibleIf(obj);\n return true;\n };\n Object.defineProperty(JsonObjectProperty.prototype, \"visible\", {\n get: function () {\n return this.visibleValue != null ? this.visibleValue : true;\n },\n set: function (val) {\n this.visibleValue = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(JsonObjectProperty.prototype, \"isLocalizable\", {\n get: function () {\n return this.isLocalizableValue != null ? this.isLocalizableValue : false;\n },\n set: function (val) {\n this.isLocalizableValue = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(JsonObjectProperty.prototype, \"dataList\", {\n get: function () {\n return Array.isArray(this.dataListValue) ? this.dataListValue : [];\n },\n set: function (val) {\n this.dataListValue = val;\n },\n enumerable: false,\n configurable: true\n });\n JsonObjectProperty.prototype.mergeWith = function (prop) {\n var valuesNames = JsonObjectProperty.mergableValues;\n for (var i = 0; i < valuesNames.length; i++) {\n this.mergeValue(prop, valuesNames[i]);\n }\n };\n JsonObjectProperty.prototype.addDependedProperty = function (name) {\n if (!this.dependedProperties) {\n this.dependedProperties = [];\n }\n if (this.dependedProperties.indexOf(name) < 0) {\n this.dependedProperties.push(name);\n }\n };\n JsonObjectProperty.prototype.getDependedProperties = function () {\n return !!this.dependedProperties ? this.dependedProperties : [];\n };\n JsonObjectProperty.prototype.schemaType = function () {\n if (!!this.className)\n return \"array\";\n if (!!this.baseClassName)\n return \"array\";\n if (this.type == \"boolean\" || this.type == \"number\")\n return this.type;\n return \"string\";\n };\n JsonObjectProperty.prototype.mergeValue = function (prop, valueName) {\n if (this[valueName] == null && prop[valueName] != null) {\n this[valueName] = prop[valueName];\n }\n };\n JsonObjectProperty.Index = 1;\n JsonObjectProperty.mergableValues = [\n \"typeValue\",\n \"choicesValue\",\n \"baseValue\",\n \"readOnlyValue\",\n \"visibleValue\",\n \"isSerializable\",\n \"isLightSerializable\",\n \"isCustom\",\n \"isBindable\",\n \"isUnique\",\n \"isDynamicChoices\",\n \"isLocalizableValue\",\n \"className\",\n \"alternativeName\",\n \"layout\",\n \"classNamePart\",\n \"baseClassName\",\n \"defaultValue\",\n \"serializationProperty\",\n \"onGetValue\",\n \"onSetValue\",\n \"displayName\",\n \"category\",\n \"categoryIndex\",\n \"visibleIndex\",\n \"nextToProperty\",\n \"showMode\",\n \"dependedProperties\",\n \"visibleIf\",\n \"onPropertyEditorUpdate\",\n \"maxLength\",\n \"maxValue\",\n \"minValue\",\n \"dataListValue\",\n ];\n return JsonObjectProperty;\n}());\n\nvar CustomPropertiesCollection = /** @class */ (function () {\n function CustomPropertiesCollection() {\n }\n CustomPropertiesCollection.addProperty = function (className, property) {\n className = className.toLowerCase();\n var props = CustomPropertiesCollection.properties;\n if (!props[className]) {\n props[className] = [];\n }\n props[className].push(property);\n };\n CustomPropertiesCollection.removeProperty = function (className, propertyName) {\n className = className.toLowerCase();\n var props = CustomPropertiesCollection.properties;\n if (!props[className])\n return;\n var properties = props[className];\n for (var i = 0; i < properties.length; i++) {\n if (properties[i].name == propertyName) {\n props[className].splice(i, 1);\n break;\n }\n }\n };\n CustomPropertiesCollection.addClass = function (className, parentClassName) {\n className = className.toLowerCase();\n if (parentClassName) {\n parentClassName = parentClassName.toLowerCase();\n }\n CustomPropertiesCollection.parentClasses[className] = parentClassName;\n };\n CustomPropertiesCollection.getProperties = function (className) {\n className = className.toLowerCase();\n var res = [];\n var props = CustomPropertiesCollection.properties;\n while (className) {\n var properties = props[className];\n if (properties) {\n for (var i = 0; i < properties.length; i++) {\n res.push(properties[i]);\n }\n }\n className = CustomPropertiesCollection.parentClasses[className];\n }\n return res;\n };\n CustomPropertiesCollection.createProperties = function (obj) {\n if (!obj || !obj.getType)\n return;\n CustomPropertiesCollection.createPropertiesCore(obj, obj.getType());\n };\n CustomPropertiesCollection.createPropertiesCore = function (obj, className) {\n var props = CustomPropertiesCollection.properties;\n if (props[className]) {\n CustomPropertiesCollection.createPropertiesInObj(obj, props[className]);\n }\n var parentClass = CustomPropertiesCollection.parentClasses[className];\n if (parentClass) {\n CustomPropertiesCollection.createPropertiesCore(obj, parentClass);\n }\n };\n CustomPropertiesCollection.createPropertiesInObj = function (obj, properties) {\n for (var i = 0; i < properties.length; i++) {\n CustomPropertiesCollection.createPropertyInObj(obj, properties[i]);\n }\n };\n CustomPropertiesCollection.createPropertyInObj = function (obj, prop) {\n if (obj[prop.name] || obj.hasOwnProperty(prop.name))\n return;\n if (prop.isLocalizable &&\n prop.serializationProperty &&\n !obj[prop.serializationProperty] &&\n obj.createCustomLocalizableObj) {\n obj.createCustomLocalizableObj(prop.name);\n var locDesc = {\n get: function () {\n return obj.getLocalizableString(prop.name);\n },\n };\n Object.defineProperty(obj, prop.serializationProperty, locDesc);\n var desc = {\n get: function () {\n return obj.getLocalizableStringText(prop.name, prop.defaultValue);\n },\n set: function (v) {\n obj.setLocalizableStringText(prop.name, v);\n },\n };\n Object.defineProperty(obj, prop.name, desc);\n }\n else {\n var defaultValue = prop.defaultValue;\n var isArrayProp = false;\n if (typeof obj.createNewArray === \"function\") {\n if (JsonObject.metaData.isDescendantOf(prop.className, \"itemvalue\")) {\n obj.createNewArray(prop.name, function (item) {\n item.locOwner = obj;\n item.ownerPropertyName = prop.name;\n });\n isArrayProp = true;\n }\n //It is a simple array property\n if (prop.type === \"multiplevalues\") {\n obj.createNewArray(prop.name);\n isArrayProp = true;\n }\n if (isArrayProp) {\n if (Array.isArray(defaultValue)) {\n obj.setPropertyValue(prop.name, defaultValue);\n }\n defaultValue = null;\n }\n }\n if (!!obj.getPropertyValue && !!obj.setPropertyValue) {\n var desc = {\n get: function () {\n if (!!prop.onGetValue) {\n return prop.onGetValue(obj);\n }\n return obj.getPropertyValue(prop.name, defaultValue);\n },\n set: function (v) {\n if (!!prop.onSetValue) {\n prop.onSetValue(obj, v, null);\n }\n else {\n obj.setPropertyValue(prop.name, v);\n }\n },\n };\n Object.defineProperty(obj, prop.name, desc);\n }\n }\n };\n CustomPropertiesCollection.properties = {};\n CustomPropertiesCollection.parentClasses = {};\n return CustomPropertiesCollection;\n}());\n\nvar JsonMetadataClass = /** @class */ (function () {\n function JsonMetadataClass(name, properties, creator, parentName) {\n if (creator === void 0) { creator = null; }\n if (parentName === void 0) { parentName = null; }\n this.name = name;\n this.creator = creator;\n this.parentName = parentName;\n this.properties = null;\n name = name.toLowerCase();\n if (this.parentName) {\n this.parentName = this.parentName.toLowerCase();\n CustomPropertiesCollection.addClass(name, this.parentName);\n }\n this.properties = new Array();\n for (var i = 0; i < properties.length; i++) {\n var prop = this.createProperty(properties[i]);\n if (prop) {\n this.properties.push(prop);\n }\n }\n }\n JsonMetadataClass.prototype.find = function (name) {\n for (var i = 0; i < this.properties.length; i++) {\n if (this.properties[i].name == name)\n return this.properties[i];\n }\n return null;\n };\n JsonMetadataClass.prototype.createProperty = function (propInfo) {\n var propertyName = typeof propInfo === \"string\" ? propInfo : propInfo.name;\n if (!propertyName)\n return;\n var propertyType = null;\n var typeIndex = propertyName.indexOf(JsonMetadataClass.typeSymbol);\n if (typeIndex > -1) {\n propertyType = propertyName.substring(typeIndex + 1);\n propertyName = propertyName.substring(0, typeIndex);\n }\n var isRequired = this.getIsPropertyNameRequired(propertyName) || !!propInfo.isRequired;\n propertyName = this.getPropertyName(propertyName);\n var prop = new JsonObjectProperty(this, propertyName, isRequired);\n if (propertyType) {\n prop.type = propertyType;\n }\n if (typeof propInfo === \"object\") {\n if (propInfo.type) {\n prop.type = propInfo.type;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.default)) {\n prop.defaultValue = propInfo.default;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.isSerializable)) {\n prop.isSerializable = propInfo.isSerializable;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.isLightSerializable)) {\n prop.isLightSerializable = propInfo.isLightSerializable;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.maxLength)) {\n prop.maxLength = propInfo.maxLength;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.displayName)) {\n prop.displayName = propInfo.displayName;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.category)) {\n prop.category = propInfo.category;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.categoryIndex)) {\n prop.categoryIndex = propInfo.categoryIndex;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.nextToProperty)) {\n prop.nextToProperty = propInfo.nextToProperty;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.visibleIndex)) {\n prop.visibleIndex = propInfo.visibleIndex;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.showMode)) {\n prop.showMode = propInfo.showMode;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.maxValue)) {\n prop.maxValue = propInfo.maxValue;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.minValue)) {\n prop.minValue = propInfo.minValue;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.dataList)) {\n prop.dataList = propInfo.dataList;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.isDynamicChoices)) {\n prop.isDynamicChoices = propInfo.isDynamicChoices;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.isBindable)) {\n prop.isBindable = propInfo.isBindable;\n }\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(propInfo.isUnique)) {\n prop.isUnique = propInfo.isUnique;\n }\n if (propInfo.visible === true || propInfo.visible === false) {\n prop.visible = propInfo.visible;\n }\n if (!!propInfo.visibleIf) {\n prop.visibleIf = propInfo.visibleIf;\n }\n if (!!propInfo.onPropertyEditorUpdate) {\n prop.onPropertyEditorUpdate = propInfo.onPropertyEditorUpdate;\n }\n if (propInfo.readOnly === true) {\n prop.readOnly = true;\n }\n if (propInfo.choices) {\n var choicesFunc = typeof propInfo.choices === \"function\" ? propInfo.choices : null;\n var choicesValue = typeof propInfo.choices !== \"function\" ? propInfo.choices : null;\n prop.setChoices(choicesValue, choicesFunc);\n }\n if (!!propInfo.baseValue) {\n prop.setBaseValue(propInfo.baseValue);\n }\n if (propInfo.onGetValue) {\n prop.onGetValue = propInfo.onGetValue;\n }\n if (propInfo.onSetValue) {\n prop.onSetValue = propInfo.onSetValue;\n }\n if (propInfo.isLocalizable) {\n propInfo.serializationProperty = \"loc\" + prop.name;\n }\n if (propInfo.serializationProperty) {\n prop.serializationProperty = propInfo.serializationProperty;\n var s;\n if (prop.serializationProperty &&\n prop.serializationProperty.indexOf(\"loc\") == 0) {\n prop.isLocalizable = true;\n }\n }\n if (propInfo.isLocalizable) {\n prop.isLocalizable = propInfo.isLocalizable;\n }\n if (propInfo.className) {\n prop.className = propInfo.className;\n }\n if (propInfo.baseClassName) {\n prop.baseClassName = propInfo.baseClassName;\n }\n if (propInfo.classNamePart) {\n prop.classNamePart = propInfo.classNamePart;\n }\n if (propInfo.alternativeName) {\n prop.alternativeName = propInfo.alternativeName;\n }\n if (propInfo.layout) {\n prop.layout = propInfo.layout;\n }\n if (propInfo.dependsOn) {\n this.addDependsOnProperties(prop, propInfo.dependsOn);\n }\n }\n return prop;\n };\n JsonMetadataClass.prototype.addDependsOnProperties = function (prop, dependsOn) {\n if (Array.isArray(dependsOn)) {\n for (var i = 0; i < dependsOn.length; i++) {\n this.addDependsOnProperty(prop, dependsOn[i]);\n }\n }\n else {\n this.addDependsOnProperty(prop, dependsOn);\n }\n };\n JsonMetadataClass.prototype.addDependsOnProperty = function (prop, dependsOn) {\n var property = this.find(dependsOn);\n if (!property) {\n property = Serializer.findProperty(this.parentName, dependsOn);\n }\n if (!property)\n return;\n property.addDependedProperty(prop.name);\n };\n JsonMetadataClass.prototype.getIsPropertyNameRequired = function (propertyName) {\n return (propertyName.length > 0 &&\n propertyName[0] == JsonMetadataClass.requiredSymbol);\n };\n JsonMetadataClass.prototype.getPropertyName = function (propertyName) {\n if (!this.getIsPropertyNameRequired(propertyName))\n return propertyName;\n propertyName = propertyName.slice(1);\n return propertyName;\n };\n JsonMetadataClass.requiredSymbol = \"!\";\n JsonMetadataClass.typeSymbol = \":\";\n return JsonMetadataClass;\n}());\n\n/**\n * The metadata object. It contains object properties' runtime information and allows you to modify it.\n */\nvar JsonMetadata = /** @class */ (function () {\n function JsonMetadata() {\n this.classes = {};\n this.alternativeNames = {};\n this.childrenClasses = {};\n this.classProperties = {};\n this.classHashProperties = {};\n }\n JsonMetadata.prototype.getObjPropertyValue = function (obj, name) {\n if (this.isObjWrapper(obj)) {\n var orignalObj = obj.getOriginalObj();\n var prop = Serializer.findProperty(orignalObj.getType(), name);\n if (!!prop)\n return this.getObjPropertyValueCore(orignalObj, prop);\n }\n var prop = Serializer.findProperty(obj.getType(), name);\n if (!prop)\n return obj[name];\n return this.getObjPropertyValueCore(obj, prop);\n };\n JsonMetadata.prototype.setObjPropertyValue = function (obj, name, val) {\n if (obj[name] === val)\n return;\n if (!!obj[name] && !!obj[name].setJson) {\n obj[name].setJson(val);\n }\n else {\n obj[name] = val;\n }\n };\n JsonMetadata.prototype.getObjPropertyValueCore = function (obj, prop) {\n if (!prop.isSerializable)\n return obj[prop.name];\n if (prop.isLocalizable) {\n if (prop.isArray)\n return obj[prop.name];\n if (!!prop.serializationProperty)\n return obj[prop.serializationProperty].text;\n }\n return obj.getPropertyValue(prop.name);\n };\n JsonMetadata.prototype.isObjWrapper = function (obj) {\n return !!obj.getOriginalObj && !!obj.getOriginalObj();\n };\n JsonMetadata.prototype.addClass = function (name, properties, creator, parentName) {\n if (creator === void 0) { creator = null; }\n if (parentName === void 0) { parentName = null; }\n name = name.toLowerCase();\n var metaDataClass = new JsonMetadataClass(name, properties, creator, parentName);\n this.classes[name] = metaDataClass;\n if (parentName) {\n parentName = parentName.toLowerCase();\n var children = this.childrenClasses[parentName];\n if (!children) {\n this.childrenClasses[parentName] = [];\n }\n this.childrenClasses[parentName].push(metaDataClass);\n }\n return metaDataClass;\n };\n JsonMetadata.prototype.removeClass = function (name) {\n var metaClass = this.findClass(name);\n if (!metaClass)\n return;\n delete this.classes[metaClass.name];\n if (!!metaClass.parentName) {\n var index = this.childrenClasses[metaClass.parentName].indexOf(metaClass);\n if (index > -1) {\n this.childrenClasses[metaClass.parentName].splice(index, 1);\n }\n }\n };\n JsonMetadata.prototype.overrideClassCreatore = function (name, creator) {\n this.overrideClassCreator(name, creator);\n };\n JsonMetadata.prototype.overrideClassCreator = function (name, creator) {\n name = name.toLowerCase();\n var metaDataClass = this.findClass(name);\n if (metaDataClass) {\n metaDataClass.creator = creator;\n }\n };\n JsonMetadata.prototype.getProperties = function (className) {\n var metaClass = this.findClass(className);\n if (!metaClass)\n return [];\n var properties = this.classProperties[metaClass.name];\n if (!!properties)\n return properties;\n this.fillPropertiesForClass(metaClass.name);\n return this.classProperties[metaClass.name];\n };\n JsonMetadata.prototype.getHashProperties = function (className) {\n var metaClass = this.findClass(className);\n if (!metaClass)\n return {};\n var properties = this.classHashProperties[metaClass.name];\n if (!!properties)\n return properties;\n this.fillPropertiesForClass(metaClass.name);\n return this.classHashProperties[metaClass.name];\n };\n JsonMetadata.prototype.fillPropertiesForClass = function (className) {\n var properties = new Array();\n var hashProperties = {};\n this.fillProperties(className, properties, hashProperties);\n this.classProperties[className] = properties;\n this.classHashProperties[className] = hashProperties;\n };\n JsonMetadata.prototype.getPropertiesByObj = function (obj) {\n if (!obj || !obj.getType)\n return [];\n var res = {};\n var props = this.getProperties(obj.getType());\n for (var i = 0; i < props.length; i++) {\n res[props[i].name] = props[i];\n }\n var dynamicProps = !!obj.getDynamicType\n ? this.getProperties(obj.getDynamicType())\n : null;\n if (dynamicProps && dynamicProps.length > 0) {\n for (var i = 0; i < dynamicProps.length; i++) {\n var dProp = dynamicProps[i];\n if (!!res[dProp.name])\n continue;\n res[dProp.name] = dProp;\n }\n }\n return Object.keys(res).map(function (key) { return res[key]; });\n };\n JsonMetadata.prototype.getDynamicPropertiesByObj = function (obj, dynamicType) {\n if (dynamicType === void 0) { dynamicType = null; }\n if (!obj || !obj.getType || (!obj.getDynamicType && !dynamicType))\n return [];\n var dType = !!dynamicType ? dynamicType : obj.getDynamicType();\n if (!dType)\n return [];\n var dynamicProps = this.getProperties(dType);\n if (!dynamicProps || dynamicProps.length == 0)\n return [];\n var hash = {};\n var props = this.getProperties(obj.getType());\n for (var i = 0; i < props.length; i++) {\n hash[props[i].name] = props[i];\n }\n var res = [];\n for (var i = 0; i < dynamicProps.length; i++) {\n var dProp = dynamicProps[i];\n if (!hash[dProp.name]) {\n res.push(dProp);\n }\n }\n return res;\n };\n JsonMetadata.prototype.hasOriginalProperty = function (obj, propName) {\n return !!this.getOriginalProperty(obj, propName);\n };\n JsonMetadata.prototype.getOriginalProperty = function (obj, propName) {\n var res = this.findProperty(obj.getType(), propName);\n if (!!res)\n return res;\n if (this.isObjWrapper(obj))\n return this.findProperty(obj.getOriginalObj().getType(), propName);\n return null;\n };\n JsonMetadata.prototype.findProperty = function (className, propertyName) {\n var hash = this.getHashProperties(className);\n var res = hash[propertyName];\n return !!res ? res : null;\n };\n JsonMetadata.prototype.findProperties = function (className, propertyNames) {\n var result = [];\n var hash = this.getHashProperties(className);\n for (var i = 0; i < propertyNames.length; i++) {\n var prop = hash[propertyNames[i]];\n if (prop) {\n result.push(prop);\n }\n }\n return result;\n };\n JsonMetadata.prototype.getAllPropertiesByName = function (propertyName) {\n var res = new Array();\n var classes = this.getAllClasses();\n for (var i = 0; i < classes.length; i++) {\n var classInfo = this.findClass(classes[i]);\n for (var j = 0; j < classInfo.properties.length; j++) {\n if (classInfo.properties[j].name == propertyName) {\n res.push(classInfo.properties[j]);\n break;\n }\n }\n }\n return res;\n };\n JsonMetadata.prototype.getAllClasses = function () {\n var res = new Array();\n for (var name in this.classes) {\n res.push(name);\n }\n return res;\n };\n JsonMetadata.prototype.createClass = function (name, json) {\n if (json === void 0) { json = undefined; }\n name = name.toLowerCase();\n var metaDataClass = this.findClass(name);\n if (!metaDataClass)\n return null;\n if (metaDataClass.creator)\n return metaDataClass.creator(json);\n var parentName = metaDataClass.parentName;\n while (parentName) {\n metaDataClass = this.findClass(parentName);\n if (!metaDataClass)\n return null;\n parentName = metaDataClass.parentName;\n if (metaDataClass.creator)\n return this.createCustomType(name, metaDataClass.creator, json);\n }\n return null;\n };\n JsonMetadata.prototype.createCustomType = function (name, creator, json) {\n if (json === void 0) { json = undefined; }\n name = name.toLowerCase();\n var res = creator(json);\n var customTypeName = name;\n var customTemplateName = res.getTemplate\n ? res.getTemplate()\n : res.getType();\n res.getType = function () {\n return customTypeName;\n };\n res.getTemplate = function () {\n return customTemplateName;\n };\n CustomPropertiesCollection.createProperties(res);\n return res;\n };\n JsonMetadata.prototype.getChildrenClasses = function (name, canBeCreated) {\n if (canBeCreated === void 0) { canBeCreated = false; }\n name = name.toLowerCase();\n var result = [];\n this.fillChildrenClasses(name, canBeCreated, result);\n return result;\n };\n JsonMetadata.prototype.getRequiredProperties = function (name) {\n var properties = this.getProperties(name);\n var res = [];\n for (var i = 0; i < properties.length; i++) {\n if (properties[i].isRequired) {\n res.push(properties[i].name);\n }\n }\n return res;\n };\n JsonMetadata.prototype.addProperties = function (className, propertiesInfos) {\n className = className.toLowerCase();\n var metaDataClass = this.findClass(className);\n for (var i = 0; i < propertiesInfos.length; i++) {\n this.addCustomPropertyCore(metaDataClass, propertiesInfos[i]);\n }\n };\n JsonMetadata.prototype.addProperty = function (className, propertyInfo) {\n return this.addCustomPropertyCore(this.findClass(className), propertyInfo);\n };\n JsonMetadata.prototype.addCustomPropertyCore = function (metaDataClass, propertyInfo) {\n if (!metaDataClass)\n return null;\n var property = metaDataClass.createProperty(propertyInfo);\n if (property) {\n property.isCustom = true;\n this.addPropertyToClass(metaDataClass, property);\n this.emptyClassPropertiesHash(metaDataClass);\n CustomPropertiesCollection.addProperty(metaDataClass.name, property);\n }\n return property;\n };\n JsonMetadata.prototype.removeProperty = function (className, propertyName) {\n var metaDataClass = this.findClass(className);\n if (!metaDataClass)\n return false;\n var property = metaDataClass.find(propertyName);\n if (property) {\n this.removePropertyFromClass(metaDataClass, property);\n this.emptyClassPropertiesHash(metaDataClass);\n CustomPropertiesCollection.removeProperty(metaDataClass.name, propertyName);\n }\n };\n JsonMetadata.prototype.addPropertyToClass = function (metaDataClass, property) {\n if (metaDataClass.find(property.name) != null)\n return;\n metaDataClass.properties.push(property);\n };\n JsonMetadata.prototype.removePropertyFromClass = function (metaDataClass, property) {\n var index = metaDataClass.properties.indexOf(property);\n if (index < 0)\n return;\n metaDataClass.properties.splice(index, 1);\n };\n JsonMetadata.prototype.emptyClassPropertiesHash = function (metaDataClass) {\n this.classProperties[metaDataClass.name] = null;\n this.classHashProperties[metaDataClass.name] = null;\n var childClasses = this.getChildrenClasses(metaDataClass.name);\n for (var i = 0; i < childClasses.length; i++) {\n this.classProperties[childClasses[i].name] = null;\n this.classHashProperties[childClasses[i].name] = null;\n }\n };\n JsonMetadata.prototype.fillChildrenClasses = function (name, canBeCreated, result) {\n var children = this.childrenClasses[name];\n if (!children)\n return;\n for (var i = 0; i < children.length; i++) {\n if (!canBeCreated || children[i].creator) {\n result.push(children[i]);\n }\n this.fillChildrenClasses(children[i].name, canBeCreated, result);\n }\n };\n JsonMetadata.prototype.findClass = function (name) {\n name = name.toLowerCase();\n var res = this.classes[name];\n if (!res) {\n var newName = this.alternativeNames[name];\n if (!!newName && newName != name)\n return this.findClass(newName);\n }\n return res;\n };\n JsonMetadata.prototype.isDescendantOf = function (className, ancestorClassName) {\n if (!className || !ancestorClassName) {\n return false;\n }\n className = className.toLowerCase();\n ancestorClassName = ancestorClassName.toLowerCase();\n var class_ = this.findClass(className);\n if (!class_) {\n return false;\n }\n var parentClass = class_;\n do {\n if (parentClass.name === ancestorClassName) {\n return true;\n }\n parentClass = this.classes[parentClass.parentName];\n } while (!!parentClass);\n return false;\n };\n JsonMetadata.prototype.addAlterNativeClassName = function (name, alternativeName) {\n this.alternativeNames[alternativeName.toLowerCase()] = name.toLowerCase();\n };\n JsonMetadata.prototype.generateSchema = function (className) {\n if (className === void 0) { className = undefined; }\n if (!className)\n className = \"survey\";\n var classInfo = this.findClass(className);\n if (!classInfo)\n return null;\n var res = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n title: \"SurveyJS Library json schema\",\n type: \"object\",\n properties: {},\n definitions: {},\n };\n this.generateSchemaProperties(classInfo, res.properties, res.definitions);\n return res;\n };\n JsonMetadata.prototype.generateSchemaProperties = function (classInfo, schemaProperties, schemaDef) {\n if (!classInfo)\n return;\n for (var i = 0; i < classInfo.properties.length; i++) {\n var prop = classInfo.properties[i];\n schemaProperties[prop.name] = this.generateSchemaProperty(prop, schemaDef);\n }\n };\n JsonMetadata.prototype.generateSchemaProperty = function (prop, schemaDef) {\n var res = { type: prop.schemaType() };\n if (prop.hasChoices) {\n res.enum = prop.getChoices(null);\n }\n if (!!prop.className) {\n res.items = { $ref: \"#\" + prop.className };\n this.generateChemaClass(prop.className, schemaDef);\n }\n if (!!prop.baseClassName) {\n var usedClasses = this.getChildrenClasses(prop.baseClassName, true);\n if (prop.baseClassName == \"question\") {\n usedClasses.push(this.findClass(\"panel\"));\n }\n res.items = [];\n for (var i = 0; i < usedClasses.length; i++) {\n var className = usedClasses[i].name;\n res.items.push({ $ref: \"#\" + className });\n this.generateChemaClass(className, schemaDef);\n }\n }\n return res;\n };\n JsonMetadata.prototype.generateChemaClass = function (className, schemaDef) {\n if (!!schemaDef[className])\n return;\n var classInfo = this.findClass(className);\n if (!classInfo)\n return;\n var hasParent = !!classInfo.parentName && classInfo.parentName != \"base\";\n if (hasParent) {\n this.generateChemaClass(classInfo.parentName, schemaDef);\n }\n var res = { type: \"object\", $id: \"#\" + className };\n schemaDef[className] = res;\n var props = {};\n this.generateSchemaProperties(classInfo, props, schemaDef);\n if (hasParent) {\n res.allOff = [\n { $ref: \"#\" + classInfo.parentName },\n { properties: props },\n ];\n }\n else {\n res.properties = props;\n }\n };\n JsonMetadata.prototype.fillProperties = function (name, list, hash) {\n var metaDataClass = this.findClass(name);\n if (!metaDataClass)\n return;\n if (metaDataClass.parentName) {\n this.fillProperties(metaDataClass.parentName, list, hash);\n }\n for (var i = 0; i < metaDataClass.properties.length; i++) {\n var prop = metaDataClass.properties[i];\n this.addPropertyCore(prop, list, hash);\n hash[prop.name] = prop;\n }\n };\n JsonMetadata.prototype.addPropertyCore = function (property, list, hash) {\n if (!hash[property.name]) {\n list.push(property);\n return;\n }\n var index = -1;\n for (var i = 0; i < list.length; i++) {\n if (list[i].name == property.name) {\n index = i;\n break;\n }\n }\n property.mergeWith(list[index]);\n list[index] = property;\n };\n return JsonMetadata;\n}());\n\nvar JsonError = /** @class */ (function () {\n function JsonError(type, message) {\n this.type = type;\n this.message = message;\n this.description = \"\";\n this.at = -1;\n }\n JsonError.prototype.getFullDescription = function () {\n return this.message + (this.description ? \"\\n\" + this.description : \"\");\n };\n return JsonError;\n}());\n\nvar JsonUnknownPropertyError = /** @class */ (function (_super) {\n __extends(JsonUnknownPropertyError, _super);\n function JsonUnknownPropertyError(propertyName, className) {\n var _this = _super.call(this, \"unknownproperty\", \"The property '\" +\n propertyName +\n \"' in class '\" +\n className +\n \"' is unknown.\") || this;\n _this.propertyName = propertyName;\n _this.className = className;\n var properties = JsonObject.metaData.getProperties(className);\n if (properties) {\n _this.description = \"The list of available properties are: \";\n for (var i = 0; i < properties.length; i++) {\n if (i > 0)\n _this.description += \", \";\n _this.description += properties[i].name;\n }\n _this.description += \".\";\n }\n return _this;\n }\n return JsonUnknownPropertyError;\n}(JsonError));\n\nvar JsonMissingTypeErrorBase = /** @class */ (function (_super) {\n __extends(JsonMissingTypeErrorBase, _super);\n function JsonMissingTypeErrorBase(baseClassName, type, message) {\n var _this = _super.call(this, type, message) || this;\n _this.baseClassName = baseClassName;\n _this.type = type;\n _this.message = message;\n _this.description = \"The following types are available: \";\n var types = JsonObject.metaData.getChildrenClasses(baseClassName, true);\n for (var i = 0; i < types.length; i++) {\n if (i > 0)\n _this.description += \", \";\n _this.description += \"'\" + types[i].name + \"'\";\n }\n _this.description += \".\";\n return _this;\n }\n return JsonMissingTypeErrorBase;\n}(JsonError));\n\nvar JsonMissingTypeError = /** @class */ (function (_super) {\n __extends(JsonMissingTypeError, _super);\n function JsonMissingTypeError(propertyName, baseClassName) {\n var _this = _super.call(this, baseClassName, \"missingtypeproperty\", \"The property type is missing in the object. Please take a look at property: '\" +\n propertyName +\n \"'.\") || this;\n _this.propertyName = propertyName;\n _this.baseClassName = baseClassName;\n return _this;\n }\n return JsonMissingTypeError;\n}(JsonMissingTypeErrorBase));\n\nvar JsonIncorrectTypeError = /** @class */ (function (_super) {\n __extends(JsonIncorrectTypeError, _super);\n function JsonIncorrectTypeError(propertyName, baseClassName) {\n var _this = _super.call(this, baseClassName, \"incorrecttypeproperty\", \"The property type is incorrect in the object. Please take a look at property: '\" +\n propertyName +\n \"'.\") || this;\n _this.propertyName = propertyName;\n _this.baseClassName = baseClassName;\n return _this;\n }\n return JsonIncorrectTypeError;\n}(JsonMissingTypeErrorBase));\n\nvar JsonRequiredPropertyError = /** @class */ (function (_super) {\n __extends(JsonRequiredPropertyError, _super);\n function JsonRequiredPropertyError(propertyName, className) {\n var _this = _super.call(this, \"requiredproperty\", \"The property '\" +\n propertyName +\n \"' is required in class '\" +\n className +\n \"'.\") || this;\n _this.propertyName = propertyName;\n _this.className = className;\n return _this;\n }\n return JsonRequiredPropertyError;\n}(JsonError));\n\nvar JsonObject = /** @class */ (function () {\n function JsonObject() {\n this.errors = new Array();\n this.lightSerializing = false;\n }\n Object.defineProperty(JsonObject, \"metaData\", {\n get: function () {\n return JsonObject.metaDataValue;\n },\n enumerable: false,\n configurable: true\n });\n JsonObject.prototype.toJsonObject = function (obj, storeDefaults) {\n if (storeDefaults === void 0) { storeDefaults = false; }\n return this.toJsonObjectCore(obj, null, storeDefaults);\n };\n JsonObject.prototype.toObject = function (jsonObj, obj) {\n this.toObjectCore(jsonObj, obj);\n var error = this.getRequiredError(obj, jsonObj);\n if (!!error) {\n this.addNewError(error, jsonObj);\n }\n };\n JsonObject.prototype.toObjectCore = function (jsonObj, obj) {\n if (!jsonObj)\n return;\n var properties = null;\n var objType = undefined;\n var needAddErrors = true;\n if (obj.getType) {\n objType = obj.getType();\n properties = JsonObject.metaData.getProperties(objType);\n needAddErrors =\n !!objType && !JsonObject.metaData.isDescendantOf(objType, \"itemvalue\");\n }\n if (!properties)\n return;\n if (obj.startLoadingFromJson) {\n obj.startLoadingFromJson();\n }\n properties = this.addDynamicProperties(obj, jsonObj, properties);\n for (var key in jsonObj) {\n if (key === JsonObject.typePropertyName)\n continue;\n if (key === JsonObject.positionPropertyName) {\n obj[key] = jsonObj[key];\n continue;\n }\n var property = this.findProperty(properties, key);\n if (!property) {\n if (needAddErrors) {\n this.addNewError(new JsonUnknownPropertyError(key.toString(), objType), jsonObj);\n }\n continue;\n }\n this.valueToObj(jsonObj[key], obj, property);\n }\n if (obj.endLoadingFromJson) {\n obj.endLoadingFromJson();\n }\n };\n JsonObject.prototype.toJsonObjectCore = function (obj, property, storeDefaults) {\n if (storeDefaults === void 0) { storeDefaults = false; }\n if (!obj || !obj.getType)\n return obj;\n if (typeof obj.getData === \"function\")\n return obj.getData();\n var result = {};\n if (property != null && !property.className) {\n result[JsonObject.typePropertyName] = property.getObjType(obj.getType());\n }\n this.propertiesToJson(obj, JsonObject.metaData.getProperties(obj.getType()), result, storeDefaults);\n this.propertiesToJson(obj, this.getDynamicProperties(obj), result, storeDefaults);\n return result;\n };\n JsonObject.prototype.getDynamicProperties = function (obj) {\n return Serializer.getDynamicPropertiesByObj(obj);\n };\n JsonObject.prototype.addDynamicProperties = function (obj, jsonObj, properties) {\n if (!obj.getDynamicPropertyName)\n return properties;\n var dynamicPropName = obj.getDynamicPropertyName();\n if (!dynamicPropName)\n return properties;\n if (jsonObj[dynamicPropName]) {\n obj[dynamicPropName] = jsonObj[dynamicPropName];\n }\n var dynamicProperties = this.getDynamicProperties(obj);\n var res = [];\n for (var i = 0; i < properties.length; i++) {\n res.push(properties[i]);\n }\n for (var i = 0; i < dynamicProperties.length; i++) {\n res.push(dynamicProperties[i]);\n }\n return res;\n };\n JsonObject.prototype.propertiesToJson = function (obj, properties, json, storeDefaults) {\n if (storeDefaults === void 0) { storeDefaults = false; }\n for (var i = 0; i < properties.length; i++) {\n this.valueToJson(obj, json, properties[i], storeDefaults);\n }\n };\n JsonObject.prototype.valueToJson = function (obj, result, property, storeDefaults) {\n if (storeDefaults === void 0) { storeDefaults = false; }\n if (property.isSerializable === false ||\n (property.isLightSerializable === false && this.lightSerializing))\n return;\n var value = property.getValue(obj);\n if (!storeDefaults && property.isDefaultValue(value))\n return;\n if (this.isValueArray(value)) {\n var arrValue = [];\n for (var i = 0; i < value.length; i++) {\n arrValue.push(this.toJsonObjectCore(value[i], property, storeDefaults));\n }\n value = arrValue.length > 0 ? arrValue : null;\n }\n else {\n value = this.toJsonObjectCore(value, property, storeDefaults);\n }\n var hasValue = typeof obj[\"getPropertyValue\"] === \"function\" &&\n obj[\"getPropertyValue\"](property.name, null) !== null;\n if ((storeDefaults && hasValue) || !property.isDefaultValue(value)) {\n result[property.name] = value;\n }\n };\n JsonObject.prototype.valueToObj = function (value, obj, property) {\n if (value == null)\n return;\n this.removePos(property, value);\n if (property != null && property.hasToUseSetValue) {\n property.setValue(obj, value, this);\n return;\n }\n if (this.isValueArray(value)) {\n this.valueToArray(value, obj, property.name, property);\n return;\n }\n var newObj = this.createNewObj(value, property);\n if (newObj.newObj) {\n this.toObjectCore(value, newObj.newObj);\n value = newObj.newObj;\n }\n if (!newObj.error) {\n if (property != null) {\n property.setValue(obj, value, this);\n }\n else {\n obj[property.name] = value;\n }\n }\n };\n JsonObject.prototype.removePos = function (property, value) {\n if (!property || !property.type || property.type.indexOf(\"value\") < 0)\n return;\n this.removePosFromObj(value);\n };\n JsonObject.prototype.removePosFromObj = function (obj) {\n if (!obj)\n return;\n if (Array.isArray(obj)) {\n for (var i = 0; i < obj.length; i++) {\n this.removePosFromObj(obj[i]);\n }\n }\n if (!!obj[JsonObject.positionPropertyName]) {\n delete obj[JsonObject.positionPropertyName];\n }\n };\n JsonObject.prototype.isValueArray = function (value) {\n return value && Array.isArray(value);\n };\n JsonObject.prototype.createNewObj = function (value, property) {\n var result = { newObj: null, error: null };\n var className = value[JsonObject.typePropertyName];\n if (!className && property != null && property.className) {\n className = property.className;\n }\n className = property.getClassName(className);\n result.newObj = className\n ? JsonObject.metaData.createClass(className, value)\n : null;\n result.error = this.checkNewObjectOnErrors(result.newObj, value, property, className);\n return result;\n };\n JsonObject.prototype.checkNewObjectOnErrors = function (newObj, value, property, className) {\n var error = null;\n if (newObj) {\n error = this.getRequiredError(newObj, value);\n }\n else {\n if (property.baseClassName) {\n if (!className) {\n error = new JsonMissingTypeError(property.name, property.baseClassName);\n }\n else {\n error = new JsonIncorrectTypeError(property.name, property.baseClassName);\n }\n }\n }\n if (error) {\n this.addNewError(error, value);\n }\n return error;\n };\n JsonObject.prototype.getRequiredError = function (obj, jsonValue) {\n if (!obj.getType || typeof obj.getData === \"function\")\n return null;\n var className = obj.getType();\n var requiredProperties = JsonObject.metaData.getRequiredProperties(className);\n if (!requiredProperties)\n return null;\n for (var i = 0; i < requiredProperties.length; i++) {\n if (!jsonValue[requiredProperties[i]]) {\n return new JsonRequiredPropertyError(requiredProperties[i], className);\n }\n }\n return null;\n };\n JsonObject.prototype.addNewError = function (error, jsonObj) {\n if (jsonObj && jsonObj[JsonObject.positionPropertyName]) {\n error.at = jsonObj[JsonObject.positionPropertyName].start;\n }\n this.errors.push(error);\n };\n JsonObject.prototype.valueToArray = function (value, obj, key, property) {\n if (obj[key] && value.length > 0)\n obj[key].splice(0, obj[key].length);\n var valueRes = obj[key] ? obj[key] : [];\n this.addValuesIntoArray(value, valueRes, property);\n if (!obj[key])\n obj[key] = valueRes;\n };\n JsonObject.prototype.addValuesIntoArray = function (value, result, property) {\n for (var i = 0; i < value.length; i++) {\n var newValue = this.createNewObj(value[i], property);\n if (newValue.newObj) {\n if (!!value[i].name) {\n newValue.newObj.name = value[i].name;\n }\n result.push(newValue.newObj);\n this.toObjectCore(value[i], newValue.newObj);\n }\n else {\n if (!newValue.error) {\n result.push(value[i]);\n }\n }\n }\n };\n JsonObject.prototype.findProperty = function (properties, key) {\n if (!properties)\n return null;\n for (var i = 0; i < properties.length; i++) {\n var prop = properties[i];\n if (prop.name == key || prop.alternativeName == key)\n return prop;\n }\n return null;\n };\n JsonObject.typePropertyName = \"type\";\n JsonObject.positionPropertyName = \"pos\";\n JsonObject.metaDataValue = new JsonMetadata();\n return JsonObject;\n}());\n\n/**\n * An alias for the metadata object. It contains object properties' runtime information and allows you to modify it.\n * @see JsonMetadata\n */\nvar Serializer = JsonObject.metaData;\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/action-bar/action-bar-item-dropdown.html\":\n/*!**************************************************************************!*\\\n !*** ./src/knockout/components/action-bar/action-bar-item-dropdown.html ***!\n \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n \\n \\n \\n \\n \\n \\n \\n\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/action-bar/action-bar-item-dropdown.ts\":\n/*!************************************************************************!*\\\n !*** ./src/knockout/components/action-bar/action-bar-item-dropdown.ts ***!\n \\************************************************************************/\n/*! exports provided: ActionBarItemDropdownViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ActionBarItemDropdownViewModel\", function() { return ActionBarItemDropdownViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar template = __webpack_require__(/*! ./action-bar-item-dropdown.html */ \"./src/knockout/components/action-bar/action-bar-item-dropdown.html\");\nvar ActionBarItemDropdownViewModel;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-action-bar-item-dropdown\", {\n viewModel: {\n createViewModel: function (params, componentInfo) { return params.item; },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/action-bar/action-bar-item.html\":\n/*!*****************************************************************!*\\\n !*** ./src/knockout/components/action-bar/action-bar-item.html ***!\n \\*****************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n \\n \\n \\n\\n \\n \\n \\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/action-bar/action-bar-item.ts\":\n/*!***************************************************************!*\\\n !*** ./src/knockout/components/action-bar/action-bar-item.ts ***!\n \\***************************************************************/\n/*! exports provided: ActionBarItemViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ActionBarItemViewModel\", function() { return ActionBarItemViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar template = __webpack_require__(/*! ./action-bar-item.html */ \"./src/knockout/components/action-bar/action-bar-item.html\");\nvar ActionBarItemViewModel;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-action-bar-item\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return params.item;\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/action-bar/action-bar-separator.html\":\n/*!**********************************************************************!*\\\n !*** ./src/knockout/components/action-bar/action-bar-separator.html ***!\n \\**********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/action-bar/action-bar-separator.ts\":\n/*!********************************************************************!*\\\n !*** ./src/knockout/components/action-bar/action-bar-separator.ts ***!\n \\********************************************************************/\n/*! exports provided: ActionBarSeparatorViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ActionBarSeparatorViewModel\", function() { return ActionBarSeparatorViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar template = __webpack_require__(/*! ./action-bar-separator.html */ \"./src/knockout/components/action-bar/action-bar-separator.html\");\nvar ActionBarSeparatorViewModel;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-action-bar-separator\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var item = params.item;\n if (!!item) {\n return {\n css: item.innerCss,\n };\n }\n return {};\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/action-bar/action-bar.html\":\n/*!************************************************************!*\\\n !*** ./src/knockout/components/action-bar/action-bar.html ***!\n \\************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n \\n \\n \\n \\n\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/action-bar/action-bar.ts\":\n/*!**********************************************************!*\\\n !*** ./src/knockout/components/action-bar/action-bar.ts ***!\n \\**********************************************************/\n/*! exports provided: ActionBarItemViewModel, ActionBarItemDropdownViewModel, ActionBarSeparatorViewModel, ActionBarViewModel, AdaptiveElementImplementor */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ActionBarViewModel\", function() { return ActionBarViewModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AdaptiveElementImplementor\", function() { return AdaptiveElementImplementor; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _kobase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../kobase */ \"./src/knockout/kobase.ts\");\n/* harmony import */ var _action__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./action */ \"./src/knockout/components/action-bar/action.ts\");\n/* empty/unused harmony star reexport *//* harmony import */ var _action_bar_item__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./action-bar-item */ \"./src/knockout/components/action-bar/action-bar-item.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionBarItemViewModel\", function() { return _action_bar_item__WEBPACK_IMPORTED_MODULE_4__[\"ActionBarItemViewModel\"]; });\n\n/* harmony import */ var _action_bar_item_dropdown__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./action-bar-item-dropdown */ \"./src/knockout/components/action-bar/action-bar-item-dropdown.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionBarItemDropdownViewModel\", function() { return _action_bar_item_dropdown__WEBPACK_IMPORTED_MODULE_5__[\"ActionBarItemDropdownViewModel\"]; });\n\n/* harmony import */ var _action_bar_separator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./action-bar-separator */ \"./src/knockout/components/action-bar/action-bar-separator.ts\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"ActionBarSeparatorViewModel\", function() { return _action_bar_separator__WEBPACK_IMPORTED_MODULE_6__[\"ActionBarSeparatorViewModel\"]; });\n\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar template = __webpack_require__(/*! ./action-bar.html */ \"./src/knockout/components/action-bar/action-bar.html\");\n\n\n\n\nvar ActionBarViewModel = /** @class */ (function (_super) {\n __extends(ActionBarViewModel, _super);\n function ActionBarViewModel(_items, handleClick) {\n if (handleClick === void 0) { handleClick = true; }\n var _this = _super.call(this) || this;\n _this.handleClick = handleClick;\n _this.itemsSubscription = knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n _this.setItems(knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](_items));\n });\n return _this;\n }\n ActionBarViewModel.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n this.itemsSubscription.dispose();\n };\n return ActionBarViewModel;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"AdaptiveActionContainer\"]));\n\nvar AdaptiveElementImplementor = /** @class */ (function (_super) {\n __extends(AdaptiveElementImplementor, _super);\n function AdaptiveElementImplementor(model) {\n var _this = _super.call(this, model) || this;\n _this.itemsSubscription = knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n (model.items || model.actions).forEach(function (item) {\n if (!!item.stateItem) {\n new _kobase__WEBPACK_IMPORTED_MODULE_2__[\"ImplementorBase\"](item.stateItem);\n }\n else {\n new _kobase__WEBPACK_IMPORTED_MODULE_2__[\"ImplementorBase\"](item);\n }\n });\n });\n return _this;\n }\n AdaptiveElementImplementor.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n this.itemsSubscription.dispose();\n };\n return AdaptiveElementImplementor;\n}(_kobase__WEBPACK_IMPORTED_MODULE_2__[\"ImplementorBase\"]));\n\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-action-bar\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var handleClick = params.handleClick !== undefined ? params.handleClick : true;\n var model = { model: params.model, handleClick: handleClick };\n new _kobase__WEBPACK_IMPORTED_MODULE_2__[\"ImplementorBase\"](params.model);\n var container = componentInfo.element.nextElementSibling;\n var manager = new survey_core__WEBPACK_IMPORTED_MODULE_1__[\"ResponsivityManager\"](container, params.model, \"span.sv-action:not(.sv-dots)\");\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"utils\"].domNodeDisposal.addDisposeCallback(container, function () {\n return manager.dispose();\n });\n return model;\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/action-bar/action.html\":\n/*!********************************************************!*\\\n !*** ./src/knockout/components/action-bar/action.html ***!\n \\********************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/action-bar/action.ts\":\n/*!******************************************************!*\\\n !*** ./src/knockout/components/action-bar/action.ts ***!\n \\******************************************************/\n/*! no exports provided */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _kobase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../kobase */ \"./src/knockout/kobase.ts\");\n\n\nvar template = __webpack_require__(/*! ./action.html */ \"./src/knockout/components/action-bar/action.html\");\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-action\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var item = params.item;\n new _kobase__WEBPACK_IMPORTED_MODULE_1__[\"ImplementorBase\"](item);\n return item;\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/boolean-checkbox/boolean-checkbox.html\":\n/*!************************************************************************!*\\\n !*** ./src/knockout/components/boolean-checkbox/boolean-checkbox.html ***!\n \\************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\n \\n
\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/boolean-checkbox/boolean-checkbox.ts\":\n/*!**********************************************************************!*\\\n !*** ./src/knockout/components/boolean-checkbox/boolean-checkbox.ts ***!\n \\**********************************************************************/\n/*! exports provided: CheckboxViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CheckboxViewModel\", function() { return CheckboxViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n\n\nvar template = __webpack_require__(/*! ./boolean-checkbox.html */ \"./src/knockout/components/boolean-checkbox/boolean-checkbox.html\");\nvar CheckboxViewModel;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-boolean-checkbox\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return { question: params.question };\n },\n },\n template: template,\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"RendererFactory\"].Instance.registerRenderer(\"boolean\", \"checkbox\", \"sv-boolean-checkbox\");\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/button-group/button-group-item.html\":\n/*!*********************************************************************!*\\\n !*** ./src/knockout/components/button-group/button-group-item.html ***!\n \\*********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/button-group/button-group-item.ts\":\n/*!*******************************************************************!*\\\n !*** ./src/knockout/components/button-group/button-group-item.ts ***!\n \\*******************************************************************/\n/*! exports provided: ButtonGroupItemViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ButtonGroupItemViewModel\", function() { return ButtonGroupItemViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n\n\nvar template = __webpack_require__(/*! ./button-group-item.html */ \"./src/knockout/components/button-group/button-group-item.html\");\nvar ButtonGroupItemViewModel = /** @class */ (function () {\n function ButtonGroupItemViewModel(model) {\n this.model = model;\n }\n return ButtonGroupItemViewModel;\n}());\n\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-button-group-item\", {\n viewModel: {\n createViewModel: function (params) {\n var model = new survey_core__WEBPACK_IMPORTED_MODULE_1__[\"ButtonGroupItemModel\"](params.question, params.item, params.index());\n var viewModel = new ButtonGroupItemViewModel(model);\n return viewModel;\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/default-title/default-title.html\":\n/*!******************************************************************!*\\\n !*** ./src/knockout/components/default-title/default-title.html ***!\n \\******************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/default-title/default-title.ts\":\n/*!****************************************************************!*\\\n !*** ./src/knockout/components/default-title/default-title.ts ***!\n \\****************************************************************/\n/*! exports provided: DefaultTitleViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DefaultTitleViewModel\", function() { return DefaultTitleViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n\n\nvar template = __webpack_require__(/*! ./default-title.html */ \"./src/knockout/components/default-title/default-title.html\");\nvar DefaultTitleViewModel = /** @class */ (function () {\n function DefaultTitleViewModel(element) {\n this.element = element;\n }\n DefaultTitleViewModel.prototype.getIconClass = function () {\n var element = this.element;\n var cssClasses = element.isPanel\n ? element.cssClasses.panel\n : element.cssClasses;\n return (cssClasses.icon +\n (!element.isCollapsed ? \" \" + cssClasses.iconExpanded : \"\"));\n };\n return DefaultTitleViewModel;\n}());\n\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-default-title\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return new DefaultTitleViewModel(params.element);\n },\n },\n template: template,\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"RendererFactory\"].Instance.registerRenderer(\"element\", \"default-title\", \"sv-default-title\");\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/list/list.html\":\n/*!************************************************!*\\\n !*** ./src/knockout/components/list/list.html ***!\n \\************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"
    \\n \\n
  • \\n \\n \\n \\n \\n
  • \\n \\n
\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/list/list.ts\":\n/*!**********************************************!*\\\n !*** ./src/knockout/components/list/list.ts ***!\n \\**********************************************/\n/*! exports provided: ListViewComponent */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ListViewComponent\", function() { return ListViewComponent; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _kobase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../kobase */ \"./src/knockout/kobase.ts\");\n\n\nvar template = __webpack_require__(/*! ./list.html */ \"./src/knockout/components/list/list.html\");\nvar ListViewComponent;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-list\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var model = params.model;\n new _kobase__WEBPACK_IMPORTED_MODULE_1__[\"ImplementorBase\"](model);\n return model;\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/logo-image/logo-image.html\":\n/*!************************************************************!*\\\n !*** ./src/knockout/components/logo-image/logo-image.html ***!\n \\************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n
\\n \\n
\\n\\n
\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/logo-image/logo-image.ts\":\n/*!**********************************************************!*\\\n !*** ./src/knockout/components/logo-image/logo-image.ts ***!\n \\**********************************************************/\n/*! exports provided: LogoImageViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LogoImageViewModel\", function() { return LogoImageViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar template = __webpack_require__(/*! ./logo-image.html */ \"./src/knockout/components/logo-image/logo-image.html\");\nvar LogoImageViewModel;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-logo-image\", {\n viewModel: {\n createViewModel: function (params) {\n return { survey: params };\n },\n },\n template: template\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/matrix-actions/detail-button/detail-button.html\":\n/*!*********************************************************************************!*\\\n !*** ./src/knockout/components/matrix-actions/detail-button/detail-button.html ***!\n \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\\n\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/matrix-actions/detail-button/detail-button.ts\":\n/*!*******************************************************************************!*\\\n !*** ./src/knockout/components/matrix-actions/detail-button/detail-button.ts ***!\n \\*******************************************************************************/\n/*! exports provided: SurveyQuestionMatrixDetailButton */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyQuestionMatrixDetailButton\", function() { return SurveyQuestionMatrixDetailButton; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar template = __webpack_require__(/*! ./detail-button.html */ \"./src/knockout/components/matrix-actions/detail-button/detail-button.html\");\nvar SurveyQuestionMatrixDetailButton;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-matrix-detail-button\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return params.item.data;\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/matrix-actions/drag-drop-icon/drag-drop-icon.html\":\n/*!***********************************************************************************!*\\\n !*** ./src/knockout/components/matrix-actions/drag-drop-icon/drag-drop-icon.html ***!\n \\***********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/matrix-actions/drag-drop-icon/drag-drop-icon.ts\":\n/*!*********************************************************************************!*\\\n !*** ./src/knockout/components/matrix-actions/drag-drop-icon/drag-drop-icon.ts ***!\n \\*********************************************************************************/\n/*! exports provided: SurveyQuestionMatrixDynamicDragDropIcon */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyQuestionMatrixDynamicDragDropIcon\", function() { return SurveyQuestionMatrixDynamicDragDropIcon; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar template = __webpack_require__(/*! ./drag-drop-icon.html */ \"./src/knockout/components/matrix-actions/drag-drop-icon/drag-drop-icon.html\");\nvar SurveyQuestionMatrixDynamicDragDropIcon;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-matrix-drag-drop-icon\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return params.item.data;\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/matrix-actions/remove-button/remove-button.html\":\n/*!*********************************************************************************!*\\\n !*** ./src/knockout/components/matrix-actions/remove-button/remove-button.html ***!\n \\*********************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n \\n \\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/matrix-actions/remove-button/remove-button.ts\":\n/*!*******************************************************************************!*\\\n !*** ./src/knockout/components/matrix-actions/remove-button/remove-button.ts ***!\n \\*******************************************************************************/\n/*! exports provided: SurveyQuestionMatrixDynamicRemoveButton */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyQuestionMatrixDynamicRemoveButton\", function() { return SurveyQuestionMatrixDynamicRemoveButton; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar template = __webpack_require__(/*! ./remove-button.html */ \"./src/knockout/components/matrix-actions/remove-button/remove-button.html\");\nvar SurveyQuestionMatrixDynamicRemoveButton;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-matrix-remove-button\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return params.item.data;\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/panel/panel.ts\":\n/*!************************************************!*\\\n !*** ./src/knockout/components/panel/panel.ts ***!\n \\************************************************/\n/*! exports provided: PanelViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"PanelViewModel\", function() { return PanelViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar template = __webpack_require__(/*! html-loader?interpolate!val-loader!./panel.html */ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/panel/panel.html\");\nvar PanelViewModel = /** @class */ (function () {\n function PanelViewModel(question, targetElement) {\n this.question = question;\n this.targetElement = targetElement;\n }\n return PanelViewModel;\n}());\n\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-panel\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var viewModel = new PanelViewModel(params.question, componentInfo.element.parentElement);\n return viewModel;\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/popup/popup.ts\":\n/*!************************************************!*\\\n !*** ./src/knockout/components/popup/popup.ts ***!\n \\************************************************/\n/*! exports provided: PopupViewModel, showModal */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"PopupViewModel\", function() { return PopupViewModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"showModal\", function() { return showModal; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _kobase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../kobase */ \"./src/knockout/kobase.ts\");\n\n\n\n\nvar template = __webpack_require__(/*! html-loader?interpolate!val-loader!./popup.html */ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/popup/popup.html\");\nvar PopupViewModel = /** @class */ (function () {\n function PopupViewModel(popupViewModel) {\n this.popupViewModel = popupViewModel;\n popupViewModel.initializePopupContainer();\n new _kobase__WEBPACK_IMPORTED_MODULE_2__[\"ImplementorBase\"](popupViewModel.model);\n new _kobase__WEBPACK_IMPORTED_MODULE_2__[\"ImplementorBase\"](popupViewModel);\n popupViewModel.container.innerHTML = template;\n popupViewModel.model.onVisibilityChanged = function (isVisible) {\n if (isVisible) {\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"tasks\"].runEarly();\n popupViewModel.updateOnShowing();\n }\n };\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"applyBindings\"](popupViewModel, popupViewModel.container);\n }\n PopupViewModel.prototype.dispose = function () {\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"cleanNode\"](this.popupViewModel.container);\n this.popupViewModel.destroyPopupContainer();\n };\n return PopupViewModel;\n}());\n\nfunction showModal(componentName, data, onApply, onCancel) {\n var popupModel = new survey_core__WEBPACK_IMPORTED_MODULE_1__[\"PopupModel\"](componentName, data, \"top\", \"left\", false, true, onCancel, onApply);\n var popupViewModel = new survey_core__WEBPACK_IMPORTED_MODULE_1__[\"PopupBaseViewModel\"](popupModel, undefined);\n var viewModel = new PopupViewModel(popupViewModel);\n popupModel.onHide = function () {\n viewModel.dispose();\n };\n popupViewModel.model.isVisible = true;\n}\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"settings\"].showModal = showModal;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-popup\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var viewModel = new survey_core__WEBPACK_IMPORTED_MODULE_1__[\"PopupBaseViewModel\"](knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.model), componentInfo.element.parentElement);\n return new PopupViewModel(viewModel);\n },\n },\n template: \"
\",\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/progress/buttons.ts\":\n/*!*****************************************************!*\\\n !*** ./src/knockout/components/progress/buttons.ts ***!\n \\*****************************************************/\n/*! exports provided: ProgressButtonsViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ProgressButtonsViewModel\", function() { return ProgressButtonsViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n\n\nvar template = __webpack_require__(/*! html-loader?interpolate!val-loader!./buttons.html */ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/progress/buttons.html\");\nvar ProgressButtonsViewModel = /** @class */ (function () {\n function ProgressButtonsViewModel(model, element) {\n var _this = this;\n this.model = model;\n this.scrollButtonCssKo = undefined;\n this.hasScroller = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](false);\n this.updateScroller = undefined;\n this.progressButtonsModel = new survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyProgressButtonsModel\"](model);\n this.updateScroller = setInterval(function () {\n var listContainerElement = element.querySelector(\".\" + model.css.progressButtonsListContainer);\n if (!!listContainerElement) {\n _this.hasScroller(listContainerElement.scrollWidth > listContainerElement.offsetWidth);\n }\n }, 100);\n }\n ProgressButtonsViewModel.prototype.isListElementClickable = function (index) {\n return this.progressButtonsModel.isListElementClickable(index());\n };\n ProgressButtonsViewModel.prototype.getListElementCss = function (index) {\n return this.progressButtonsModel.getListElementCss(index());\n };\n ProgressButtonsViewModel.prototype.clickListElement = function (index) {\n this.progressButtonsModel.clickListElement(index());\n };\n ProgressButtonsViewModel.prototype.getScrollButtonCss = function (isLeftScroll) {\n var _this = this;\n this.scrollButtonCssKo = knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n var scrollCss = isLeftScroll\n ? _this.model.css.progressButtonsImageButtonLeft\n : _this.model.css.progressButtonsImageButtonRight;\n if (!_this.hasScroller())\n scrollCss += \" \" + _this.model.css.progressButtonsImageButtonHidden;\n return scrollCss;\n }, this);\n return this.scrollButtonCssKo;\n };\n ProgressButtonsViewModel.prototype.clickScrollButton = function (listContainerElement, isLeftScroll) {\n listContainerElement.scrollLeft += (isLeftScroll ? -1 : 1) * 70;\n };\n ProgressButtonsViewModel.prototype.dispose = function () {\n if (typeof this.updateScroller !== \"undefined\") {\n clearInterval(this.updateScroller);\n this.updateScroller = undefined;\n }\n if (typeof this.scrollButtonCssKo !== \"undefined\") {\n this.scrollButtonCssKo.dispose();\n this.scrollButtonCssKo = undefined;\n }\n };\n return ProgressButtonsViewModel;\n}());\n\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-progress-buttons\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return new ProgressButtonsViewModel(params.model, componentInfo.element.nextElementSibling);\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/progress/progress.ts\":\n/*!******************************************************!*\\\n !*** ./src/knockout/components/progress/progress.ts ***!\n \\******************************************************/\n/*! exports provided: progressProgressViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"progressProgressViewModel\", function() { return progressProgressViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar template = __webpack_require__(/*! html-loader?interpolate!val-loader!./progress.html */ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/components/progress/progress.html\");\nvar progressProgressViewModel = function (params) {\n return { model: params.model };\n};\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-progress-progress\", {\n viewModel: progressProgressViewModel,\n template: template,\n});\nvar templateBridge = \"\";\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-progress-pages\", {\n viewModel: progressProgressViewModel,\n template: templateBridge,\n});\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-progress-questions\", {\n viewModel: progressProgressViewModel,\n template: templateBridge,\n});\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-progress-correctQuestions\", {\n viewModel: progressProgressViewModel,\n template: templateBridge,\n});\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-progress-requiredQuestions\", {\n viewModel: progressProgressViewModel,\n template: templateBridge,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/string-editor/string-editor.html\":\n/*!******************************************************************!*\\\n !*** ./src/knockout/components/string-editor/string-editor.html ***!\n \\******************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\\n\\n\\n\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/string-editor/string-editor.ts\":\n/*!****************************************************************!*\\\n !*** ./src/knockout/components/string-editor/string-editor.ts ***!\n \\****************************************************************/\n/*! exports provided: StringEditorViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"StringEditorViewModel\", function() { return StringEditorViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n\n\nvar template = __webpack_require__(/*! ./string-editor.html */ \"./src/knockout/components/string-editor/string-editor.html\");\nvar StringEditorViewModel = /** @class */ (function () {\n function StringEditorViewModel(locString) {\n this.locString = locString;\n }\n Object.defineProperty(StringEditorViewModel.prototype, \"koHasHtml\", {\n get: function () {\n return this.locString.koHasHtml();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StringEditorViewModel.prototype, \"editValue\", {\n get: function () {\n return this.locString.koRenderedHtml();\n },\n set: function (value) {\n this.locString.searchElement = undefined;\n this.locString.text = value;\n },\n enumerable: false,\n configurable: true\n });\n StringEditorViewModel.prototype.onInput = function (sender, event) {\n sender.editValue = event.target.innerText;\n };\n StringEditorViewModel.prototype.onClick = function (sender, event) {\n event.stopPropagation();\n };\n StringEditorViewModel.prototype.dispose = function () {\n this.locString.onSearchChanged = undefined;\n };\n return StringEditorViewModel;\n}());\n\nfunction getSearchElement(element) {\n while (!!element && element.nodeName !== \"SPAN\") {\n var elements = element.parentElement.getElementsByClassName(\"sv-string-editor\");\n element = elements.length > 0 ? elements[0] : undefined;\n }\n if (!!element && element.childNodes.length > 0)\n return element;\n return null;\n}\nfunction resetLocalizationSpan(element, locStr) {\n while (element.childNodes.length > 1) {\n element.removeChild(element.childNodes[1]);\n }\n element.childNodes[0].textContent = locStr.renderedHtml;\n}\nfunction applyLocStrOnSearchChanged(element, locStr) {\n locStr.onSearchChanged = function () {\n if (locStr.searchElement == undefined) {\n locStr.searchElement = getSearchElement(element);\n }\n if (locStr.searchElement == null)\n return;\n var el = locStr.searchElement;\n if (!locStr.highlightDiv) {\n locStr.highlightDiv = document.createElement(\"span\");\n locStr.highlightDiv.style.backgroundColor = \"lightgray\";\n }\n if (locStr.searchIndex != undefined) {\n resetLocalizationSpan(el, locStr);\n var rng = document.createRange();\n rng.setStart(el.childNodes[0], locStr.searchIndex);\n rng.setEnd(el.childNodes[0], locStr.searchIndex + locStr.searchText.length);\n rng.surroundContents(locStr.highlightDiv);\n }\n else {\n resetLocalizationSpan(el, locStr);\n locStr.searchElement = undefined;\n }\n };\n}\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"LocalizableString\"].editableRenderer, {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var locStr = params.locString;\n applyLocStrOnSearchChanged(componentInfo.element, locStr);\n return new StringEditorViewModel(locStr);\n },\n },\n template: template\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/string-viewer/string-viewer.html\":\n/*!******************************************************************!*\\\n !*** ./src/knockout/components/string-viewer/string-viewer.html ***!\n \\******************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\\n\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/string-viewer/string-viewer.ts\":\n/*!****************************************************************!*\\\n !*** ./src/knockout/components/string-viewer/string-viewer.ts ***!\n \\****************************************************************/\n/*! exports provided: StringViewerViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"StringViewerViewModel\", function() { return StringViewerViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar template = __webpack_require__(/*! ./string-viewer.html */ \"./src/knockout/components/string-viewer/string-viewer.html\");\nvar StringViewerViewModel;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-string-viewer\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n return params.locString;\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/svg-icon/svg-icon.html\":\n/*!********************************************************!*\\\n !*** ./src/knockout/components/svg-icon/svg-icon.html ***!\n \\********************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/svg-icon/svg-icon.ts\":\n/*!******************************************************!*\\\n !*** ./src/knockout/components/svg-icon/svg-icon.ts ***!\n \\******************************************************/\n/*! exports provided: SvgIconViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SvgIconViewModel\", function() { return SvgIconViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n\n\nvar template = __webpack_require__(/*! ./svg-icon.html */ \"./src/knockout/components/svg-icon/svg-icon.html\");\nvar SvgIconViewModel;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-svg-icon\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n Object(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"createSvg\"])(knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.size), knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.width), knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.height), knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.iconName), componentInfo.element.childNodes[0]);\n });\n },\n },\n template: template,\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/template-renderer/template-renderer.html\":\n/*!**************************************************************************!*\\\n !*** ./src/knockout/components/template-renderer/template-renderer.html ***!\n \\**************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n \\n \\n\\n\\n \\n \\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/template-renderer/template-renderer.ts\":\n/*!************************************************************************!*\\\n !*** ./src/knockout/components/template-renderer/template-renderer.ts ***!\n \\************************************************************************/\n/*! no exports provided */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _survey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../survey */ \"./src/survey.ts\");\n\n\nvar template = __webpack_require__(/*! ./template-renderer.html */ \"./src/knockout/components/template-renderer/template-renderer.html\");\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(_survey__WEBPACK_IMPORTED_MODULE_1__[\"SurveyModel\"].TemplateRendererComponentName, {\n viewModel: {\n createViewModel: function (params) {\n return params;\n }\n },\n template: template\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/components/title-actions/title-actions.html\":\n/*!******************************************************************!*\\\n !*** ./src/knockout/components/title-actions/title-actions.html ***!\n \\******************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"
\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/components/title-actions/title-actions.ts\":\n/*!****************************************************************!*\\\n !*** ./src/knockout/components/title-actions/title-actions.ts ***!\n \\****************************************************************/\n/*! exports provided: TitleActionViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"TitleActionViewModel\", function() { return TitleActionViewModel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n\n\nvar template = __webpack_require__(/*! ./title-actions.html */ \"./src/knockout/components/title-actions/title-actions.html\");\nvar TitleActionViewModel;\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"sv-title-actions\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var element = params.element;\n return {\n element: element,\n toolbar: element.getTitleToolbar(),\n };\n },\n },\n template: template,\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"RendererFactory\"].Instance.registerRenderer(\"element\", \"title-actions\", \"sv-title-actions\");\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koSurveyWindow.ts\":\n/*!****************************************!*\\\n !*** ./src/knockout/koSurveyWindow.ts ***!\n \\****************************************/\n/*! exports provided: SurveyWindow */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyWindow\", function() { return SurveyWindow; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _kosurvey__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./kosurvey */ \"./src/knockout/kosurvey.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar koTemplate = __webpack_require__(/*! html-loader?interpolate!val-loader!./templates/window/window.html */ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/templates/window/window.html\");\nvar SurveyWindow = /** @class */ (function (_super) {\n __extends(SurveyWindow, _super);\n function SurveyWindow(jsonObj, initialModel) {\n if (jsonObj === void 0) { jsonObj = null; }\n if (initialModel === void 0) { initialModel = null; }\n var _this = _super.call(this, jsonObj, initialModel) || this;\n _this.koExpanded = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](false);\n _this.koExpandedCss = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](_this.getButtonCss());\n var self = _this;\n _this.expandedChangedCallback = function () {\n self.koExpanded(self.isExpanded);\n self.koExpandedCss(self.getButtonCss());\n };\n _this.showingChangedCallback = function () {\n self.doShowingChanged();\n };\n _this.doExpand = function () {\n self.changeExpanded();\n };\n return _this;\n }\n SurveyWindow.prototype.createSurvey = function (jsonObj) {\n return new _kosurvey__WEBPACK_IMPORTED_MODULE_2__[\"Survey\"](jsonObj);\n };\n SurveyWindow.prototype.closeWindowOnComplete = function () {\n this.hide();\n };\n Object.defineProperty(SurveyWindow.prototype, \"template\", {\n get: function () {\n return this.templateValue ? this.templateValue : this.getDefaultTemplate();\n },\n set: function (value) {\n this.templateValue = value;\n },\n enumerable: false,\n configurable: true\n });\n SurveyWindow.prototype.doShowingChanged = function () {\n if (this.isShowing) {\n this.windowElement.innerHTML = this.template;\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"cleanNode\"](this.windowElement);\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"applyBindings\"](this, this.windowElement);\n document.body.appendChild(this.windowElement);\n this.survey.render(SurveyWindow.surveyElementName);\n }\n else {\n document.body.removeChild(this.windowElement);\n this.windowElement.innerHTML = \"\";\n }\n };\n SurveyWindow.prototype.getDefaultTemplate = function () {\n return koTemplate;\n };\n Object.defineProperty(SurveyWindow.prototype, \"css\", {\n get: function () {\n return this.survey[\"css\"];\n },\n enumerable: false,\n configurable: true\n });\n SurveyWindow.prototype.changeExpanded = function () {\n this.expandcollapse(!this.isExpanded);\n };\n SurveyWindow.prototype.getButtonCss = function () {\n return this.koExpanded()\n ? this.css.window.header.buttonCollapsed\n : this.css.window.header.buttonExpanded;\n };\n return SurveyWindow;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyWindowModel\"]));\n\n\n\n/***/ }),\n\n/***/ \"./src/knockout/kobase.ts\":\n/*!********************************!*\\\n !*** ./src/knockout/kobase.ts ***!\n \\********************************/\n/*! exports provided: ImplementorBase */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ImplementorBase\", function() { return ImplementorBase; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n\nvar ImplementorBase = /** @class */ (function () {\n function ImplementorBase(element) {\n this.element = element;\n this.implementedMark = \"__surveyImplementedKo\";\n if (element[this.implementedMark]) {\n return;\n }\n element.iteratePropertiesHash(function (hash, key) {\n ImplementorBase.doIterateProperties(element, hash, key);\n });\n element.createArrayCoreHandler = function (hash, key) {\n var res = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observableArray\"]();\n res()[\"onArrayChanged\"] = function () {\n if (element.isLoadingFromJson || element.isDisposed)\n return;\n res.notifySubscribers();\n };\n hash[key] = res;\n return res();\n };\n element.getPropertyValueCoreHandler = function (hash, key) {\n if (hash[key] === undefined) {\n hash[key] = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"]();\n }\n return typeof hash[key] === \"function\" ? hash[key]() : hash[key];\n };\n element.setPropertyValueCoreHandler = function (hash, key, val) {\n return hash[key] !== undefined\n ? hash[key](val)\n : (hash[key] = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](val));\n };\n element[this.implementedMark] = true;\n }\n ImplementorBase.doIterateProperties = function (element, hash, key) {\n var val = hash[key];\n if (val === \"function\")\n return;\n if (Array.isArray(val)) {\n hash[key] = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observableArray\"](val);\n val[\"onArrayChanged\"] = function () {\n if (element.isLoadingFromJson || element.isDisposed)\n return;\n hash[key].notifySubscribers();\n };\n }\n else {\n hash[key] = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](val);\n }\n };\n ImplementorBase.prototype.dispose = function () {\n this.element.iteratePropertiesHash(function (hash, key) {\n delete hash[key];\n });\n this.element.createArrayCoreHandler = undefined;\n this.element.getPropertyValueCoreHandler = undefined;\n this.element.setPropertyValueCoreHandler = undefined;\n delete this.element[this.implementedMark];\n };\n return ImplementorBase;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koflowpanel.ts\":\n/*!*************************************!*\\\n !*** ./src/knockout/koflowpanel.ts ***!\n \\*************************************/\n/*! exports provided: FlowPanel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"FlowPanel\", function() { return FlowPanel; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _kobase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./kobase */ \"./src/knockout/kobase.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\nvar FlowPanel = /** @class */ (function (_super) {\n __extends(FlowPanel, _super);\n function FlowPanel(name) {\n if (name === void 0) { name = \"\"; }\n var _this = _super.call(this, name) || this;\n _this.koElementType = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](\"survey-flowpanel\");\n new _kobase__WEBPACK_IMPORTED_MODULE_2__[\"ImplementorBase\"](_this);\n _this.onCreating();\n var self = _this;\n _this.koElementAfterRender = function (el, con) {\n return self.elementAfterRender(el, con);\n };\n return _this;\n }\n FlowPanel.prototype.onCreating = function () { };\n FlowPanel.prototype.getHtmlForQuestion = function (question) {\n return ('');\n };\n FlowPanel.prototype.elementAfterRender = function (elements, con) {\n if (!this.survey)\n return;\n var el = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyElement\"].GetFirstNonTextElement(elements);\n if (!!el) {\n this.survey.afterRenderQuestion(con, el);\n }\n };\n return FlowPanel;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"FlowPanelModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].overrideClassCreator(\"flowpanel\", function () {\n return new FlowPanel();\n});\n/*\nElementFactory.Instance.registerElement(\"flowpanel\", name => {\n return new FlowPanel(name);\n});\n*/\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"f-panel\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var self = this;\n var question = knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.question);\n self.element = componentInfo.element;\n self.element.innerHTML = question.html;\n self.isOnFocus = false;\n self.wasChanged = false;\n self.isContentUpdating = false;\n question.contentChangedCallback = function () {\n if (self.isContentUpdating)\n return;\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"cleanNode\"](self.element);\n self.element.innerHTML = question.html;\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"applyBindings\"]({ question: question }, self.element);\n !!knockout__WEBPACK_IMPORTED_MODULE_0__[\"tasks\"] && knockout__WEBPACK_IMPORTED_MODULE_0__[\"tasks\"].runEarly();\n };\n self.element.onfocus = function () {\n self.isOnFocus = true;\n };\n self.element.onblur = function () {\n if (self.wasChanged)\n self.updateContent();\n self.isOnFocus = false;\n self.wasChanged = false;\n };\n self.element.ondragend = function (event) {\n var regEx = /{(.*?(element:)[^$].*?)}/g;\n var str = self.element.innerHTML;\n var res = regEx.exec(str);\n if (res !== null) {\n var q = question.getQuestionFromText(res[0]);\n if (!!q) {\n question.content = self.getContent(q.name);\n }\n }\n };\n self.updateContent = function () {\n self.isContentUpdating = true;\n question.content = self.getContent();\n self.isContentUpdating = false;\n };\n question.getContent = self.getContent = function (deletedName) {\n var content = document.createElement(\"DIV\");\n content.innerHTML = self.element.innerHTML;\n var cps = content.querySelectorAll('span[question=\"true\"]');\n for (var i = 0; i < cps.length; i++) {\n var name = cps[i].id.replace(\"flowpanel_\", \"\");\n var html = \"\";\n if (name !== deletedName) {\n var el = question.getQuestionByName(name);\n html = !!el ? question.getElementContentText(el) : \"\";\n }\n cps[i].outerHTML = html;\n }\n return content.innerHTML;\n };\n var config = {\n characterData: true,\n attributes: true,\n childList: true,\n subtree: true,\n };\n var callback = function (mutationsList, observer) {\n if (!self.isOnFocus)\n return;\n self.wasChanged = true;\n };\n var observer = new MutationObserver(callback);\n observer.observe(self.element, config);\n return { question: question };\n },\n },\n template: \"
\",\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/kopage.ts\":\n/*!********************************!*\\\n !*** ./src/knockout/kopage.ts ***!\n \\********************************/\n/*! exports provided: QuestionRow, PanelImplementorBase, Panel, Page */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionRow\", function() { return QuestionRow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"PanelImplementorBase\", function() { return PanelImplementorBase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Panel\", function() { return Panel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Page\", function() { return Page; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _kobase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./kobase */ \"./src/knockout/kobase.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\nvar QuestionRow = /** @class */ (function (_super) {\n __extends(QuestionRow, _super);\n function QuestionRow(panel) {\n var _this = _super.call(this, panel) || this;\n _this.panel = panel;\n new _kobase__WEBPACK_IMPORTED_MODULE_2__[\"ImplementorBase\"](_this);\n var self = _this;\n _this.koElementAfterRender = function (el, con) {\n return self.elementAfterRender(el, con);\n };\n return _this;\n }\n QuestionRow.prototype.getElementType = function (el) {\n return el.isPanel ? \"survey-panel\" : \"survey-question\";\n };\n QuestionRow.prototype.koAfterRender = function (el, con) {\n for (var i = 0; i < el.length; i++) {\n var tEl = el[i];\n var nName = tEl.nodeName;\n if (nName == \"#text\")\n tEl.data = \"\";\n }\n };\n QuestionRow.prototype.elementAfterRender = function (elements, con) {\n var _this = this;\n if (!this.panel || !this.panel.survey)\n return;\n setTimeout(function () {\n !!knockout__WEBPACK_IMPORTED_MODULE_0__[\"tasks\"] && knockout__WEBPACK_IMPORTED_MODULE_0__[\"tasks\"].runEarly();\n var el = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyElement\"].GetFirstNonTextElement(elements);\n if (!el)\n return;\n var element = con;\n if (element.isPanel) {\n _this.panel.survey.afterRenderPanel(con, el);\n }\n else {\n element.afterRender(el);\n }\n }, 0);\n };\n QuestionRow.prototype.rowAfterRender = function (elements, model) {\n if (!model.isNeedRender) {\n var rowContainerDiv = elements[0].parentElement;\n model.startLazyRendering(rowContainerDiv);\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"utils\"].domNodeDisposal.addDisposeCallback(rowContainerDiv, function () {\n model.stopLazyRendering();\n model.isNeedRender = !model.isLazyRendering;\n });\n }\n };\n QuestionRow.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n this.koElementAfterRender = undefined;\n };\n return QuestionRow;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionRowModel\"]));\n\nvar PanelImplementorBase = /** @class */ (function (_super) {\n __extends(PanelImplementorBase, _super);\n function PanelImplementorBase(panel) {\n var _this = _super.call(this, panel) || this;\n _this.panel = panel;\n return _this;\n }\n return PanelImplementorBase;\n}(_kobase__WEBPACK_IMPORTED_MODULE_2__[\"ImplementorBase\"]));\n\nvar Panel = /** @class */ (function (_super) {\n __extends(Panel, _super);\n function Panel(name) {\n if (name === void 0) { name = \"\"; }\n var _this = _super.call(this, name) || this;\n _this.onCreating();\n var self = _this;\n _this.koElementType = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](\"survey-panel\");\n _this.koCss = knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n return self.cssClasses;\n });\n _this.toggleStateByKeyUp = function (_, event) {\n Object(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"doKey2Click\"])(event);\n };\n _this.koErrorClass = knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n return self.cssError;\n });\n return _this;\n }\n Panel.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new PanelImplementorBase(this);\n };\n Panel.prototype.createRow = function () {\n return new QuestionRow(this);\n };\n Panel.prototype.onCreating = function () { };\n Panel.prototype.onNumChanged = function (value) {\n this.locTitle.onChanged();\n };\n Panel.prototype.dispose = function () {\n this.koCss.dispose();\n this.koErrorClass.dispose();\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return Panel;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"PanelModel\"]));\n\nvar Page = /** @class */ (function (_super) {\n __extends(Page, _super);\n function Page(name) {\n if (name === void 0) { name = \"\"; }\n var _this = _super.call(this, name) || this;\n _this.onCreating();\n return _this;\n }\n Page.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _kobase__WEBPACK_IMPORTED_MODULE_2__[\"ImplementorBase\"](this);\n };\n Page.prototype.createRow = function () {\n return new QuestionRow(this);\n };\n Page.prototype.onCreating = function () { };\n Page.prototype.onNumChanged = function (value) {\n this.locTitle.onChanged();\n };\n Page.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n this._implementor.dispose();\n this._implementor = undefined;\n };\n return Page;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"PageModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].overrideClassCreator(\"panel\", function () {\n return new Panel();\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].overrideClassCreator(\"page\", function () {\n return new Page();\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"ElementFactory\"].Instance.registerElement(\"panel\", function (name) {\n return new Panel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion.ts\":\n/*!************************************!*\\\n !*** ./src/knockout/koquestion.ts ***!\n \\************************************/\n/*! exports provided: QuestionImplementor */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionImplementor\", function() { return QuestionImplementor; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _kobase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./kobase */ \"./src/knockout/kobase.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar QuestionImplementor = /** @class */ (function (_super) {\n __extends(QuestionImplementor, _super);\n function QuestionImplementor(question) {\n var _this = _super.call(this, question) || this;\n _this.question = question;\n _this._koValue = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observableArray\"]();\n _this.disposedObjects = [];\n _this.callBackFunctions = [];\n var isSynchronizing = false;\n _this._koValue.subscribe(function (newValue) {\n if (!isSynchronizing) {\n _this.question.value = newValue;\n }\n });\n _this.toggleStateByClick = function () {\n return _this.question.toggleState();\n };\n _this.toggleStateByKeyUp = function (_, event) {\n Object(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"doKey2Click\"])(event);\n };\n Object.defineProperty(_this.question, \"koValue\", {\n get: function () {\n if (!survey_core__WEBPACK_IMPORTED_MODULE_1__[\"Helpers\"].isTwoValueEquals(_this._koValue(), _this.getKoValue())) {\n try {\n isSynchronizing = true;\n _this._koValue(_this.getKoValue());\n }\n finally {\n isSynchronizing = false;\n }\n }\n return _this._koValue;\n },\n enumerable: true,\n configurable: true,\n });\n question.surveyLoadCallback = function () {\n _this.onSurveyLoad();\n };\n _this.setObservaleObj(\"koTemplateName\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n return _this.getTemplateName();\n }));\n _this.setObservaleObj(\"koElementType\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](\"survey-question\"));\n _this.setCallbackFunc(\"updateQuestion\", function () {\n _this.updateQuestion();\n });\n _this.setObservaleObj(\"koCss\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n return _this.question.cssClasses;\n }));\n _this.setObservaleObj(\"koRootCss\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n var cssRoot = _this.question.cssRoot;\n if (_this.question.isReadOnly)\n cssRoot += \" \" + _this.question.cssClasses.disabled;\n return cssRoot;\n }));\n _this.setCallbackFunc(\"toggleStateByClick\", _this.toggleStateByClick);\n _this.setCallbackFunc(\"toggleStateByKeyUp\", _this.toggleStateByKeyUp);\n _this.setObservaleObj(\"koErrorClass\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n return _this.question.cssError;\n }));\n _this.koDummy = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](0);\n _this.setCallbackFunc(\"koQuestionAfterRender\", function (el, con) {\n _this.koQuestionAfterRender(el, con);\n });\n return _this;\n }\n QuestionImplementor.prototype.setObservaleObj = function (name, obj, addToQuestion) {\n if (addToQuestion === void 0) { addToQuestion = true; }\n this.disposedObjects.push(name);\n if (addToQuestion) {\n this.question[name] = obj;\n }\n return obj;\n };\n QuestionImplementor.prototype.setCallbackFunc = function (name, func) {\n this.callBackFunctions.push(name);\n this.question[name] = func;\n };\n QuestionImplementor.prototype.getKoValue = function () {\n return this.question.value;\n };\n QuestionImplementor.prototype.updateQuestion = function () {\n this.updateKoDummy();\n };\n QuestionImplementor.prototype.onSurveyLoad = function () { };\n QuestionImplementor.prototype.getQuestionTemplate = function () {\n return this.question.getTemplate();\n };\n QuestionImplementor.prototype.getTemplateName = function () {\n if (this.question.customWidget &&\n !this.question.customWidget.widgetJson.isDefaultRender)\n return \"survey-widget-\" + this.question.customWidget.name;\n return \"survey-question-\" + this.getQuestionTemplate();\n };\n QuestionImplementor.prototype.getNo = function () {\n return this.question.visibleIndex > -1\n ? this.question.visibleIndex + 1 + \". \"\n : \"\";\n };\n QuestionImplementor.prototype.updateKoDummy = function () {\n if (this.question.isDisposed)\n return;\n this.koDummy(this.koDummy() + 1);\n this.question.locTitle.onChanged();\n };\n QuestionImplementor.prototype.koQuestionAfterRender = function (elements, con) {\n var _this = this;\n setTimeout(function () {\n !!knockout__WEBPACK_IMPORTED_MODULE_0__[\"tasks\"] && knockout__WEBPACK_IMPORTED_MODULE_0__[\"tasks\"].runEarly();\n var el = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyElement\"].GetFirstNonTextElement(elements, true);\n if (!!el) {\n _this.question.afterRenderQuestionElement(el);\n if (!!_this.question.customWidget) {\n _this.question.customWidget.afterRender(_this.question, el);\n }\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"utils\"].domNodeDisposal.addDisposeCallback(el, function () {\n _this.question.beforeDestroyQuestionElement(el);\n if (!!_this.question.customWidget) {\n try {\n _this.question.customWidget.willUnmount(_this.question, el);\n }\n catch (_a) {\n console.warn(\"Custom widget will unmount failed\");\n }\n }\n });\n }\n }, 0);\n };\n QuestionImplementor.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n for (var i = 0; i < this.disposedObjects.length; i++) {\n var name = this.disposedObjects[i];\n var obj = this[name] || this.question[name];\n if (!obj)\n continue;\n if (this[name])\n this[name] = undefined;\n if (this.question[name])\n this.question[name] = undefined;\n if (obj[\"dispose\"])\n obj.dispose();\n }\n this.disposedObjects = [];\n for (var i = 0; i < this.callBackFunctions.length; i++) {\n this.question[this.callBackFunctions[i]] = undefined;\n }\n this.callBackFunctions = [];\n this.question.unRegisterFunctionOnPropertyValueChanged(\"visibleIndex\");\n };\n return QuestionImplementor;\n}(_kobase__WEBPACK_IMPORTED_MODULE_2__[\"ImplementorBase\"]));\n\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_baseselect.ts\":\n/*!***********************************************!*\\\n !*** ./src/knockout/koquestion_baseselect.ts ***!\n \\***********************************************/\n/*! exports provided: QuestionSelectBaseImplementor, QuestionCheckboxBaseImplementor */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionSelectBaseImplementor\", function() { return QuestionSelectBaseImplementor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxBaseImplementor\", function() { return QuestionCheckboxBaseImplementor; });\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\nvar QuestionSelectBaseImplementor = /** @class */ (function (_super) {\n __extends(QuestionSelectBaseImplementor, _super);\n function QuestionSelectBaseImplementor(question) {\n var _this = _super.call(this, question) || this;\n _this.onCreated();\n return _this;\n }\n QuestionSelectBaseImplementor.prototype.onCreated = function () { };\n Object.defineProperty(QuestionSelectBaseImplementor.prototype, \"isOtherSelected\", {\n get: function () {\n return this.question.isOtherSelected;\n },\n enumerable: false,\n configurable: true\n });\n return QuestionSelectBaseImplementor;\n}(_koquestion__WEBPACK_IMPORTED_MODULE_0__[\"QuestionImplementor\"]));\n\nvar QuestionCheckboxBaseImplementor = /** @class */ (function (_super) {\n __extends(QuestionCheckboxBaseImplementor, _super);\n function QuestionCheckboxBaseImplementor(question) {\n var _this = _super.call(this, question) || this;\n _this.setCallbackFunc(\"koAfterRender\", _this.koAfterRender);\n return _this;\n }\n QuestionCheckboxBaseImplementor.prototype.koAfterRender = function (el, con) {\n var tEl = el[0];\n if (tEl.nodeName == \"#text\")\n tEl.data = \"\";\n tEl = el[el.length - 1];\n if (tEl.nodeName == \"#text\")\n tEl.data = \"\";\n };\n return QuestionCheckboxBaseImplementor;\n}(QuestionSelectBaseImplementor));\n\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_boolean.ts\":\n/*!********************************************!*\\\n !*** ./src/knockout/koquestion_boolean.ts ***!\n \\********************************************/\n/*! exports provided: QuestionBoolean */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionBoolean\", function() { return QuestionBoolean; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar QuestionBoolean = /** @class */ (function (_super) {\n __extends(QuestionBoolean, _super);\n function QuestionBoolean(name) {\n return _super.call(this, name) || this;\n }\n QuestionBoolean.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"](this);\n };\n Object.defineProperty(QuestionBoolean.prototype, \"allowClick\", {\n get: function () {\n return this.isIndeterminate && !this.isInputReadOnly;\n },\n enumerable: false,\n configurable: true\n });\n QuestionBoolean.prototype.getItemCss = function (row, column) {\n var isChecked = this.checkedValue;\n var isDisabled = this.isReadOnly;\n var itemClass = this.cssClasses.item;\n if (isDisabled)\n itemClass += \" \" + this.cssClasses.itemDisabled;\n if (isChecked)\n itemClass += \" \" + this.cssClasses.itemChecked;\n else if (isChecked === null)\n itemClass += \" \" + this.cssClasses.itemIndeterminate;\n return itemClass;\n };\n QuestionBoolean.prototype.getCheckedLabelCss = function () {\n return this.getLabelClass(true);\n };\n QuestionBoolean.prototype.getUncheckedLabelCss = function () {\n return this.getLabelClass(false);\n };\n QuestionBoolean.prototype.getLabelClass = function (checked) {\n return (this.cssClasses.label +\n (this.checkedValue === !checked || this.isReadOnly\n ? \" \" + this.cssClasses.disabledLabel\n : \"\"));\n };\n QuestionBoolean.prototype.preventDefaults = function (event) {\n event.preventDefault();\n event.stopPropagation();\n };\n QuestionBoolean.prototype.onLabelClick = function (event, value) {\n if (this.allowClick) {\n this.preventDefaults(event);\n this.checkedValue = value;\n }\n return true;\n };\n QuestionBoolean.prototype.onSwitchClick = function (data, event) {\n if (this.allowClick) {\n this.preventDefaults(event);\n var isRightClick = event.offsetX / event.target.offsetWidth > 0.5;\n var isRtl = document.defaultView.getComputedStyle(event.target).direction == \"rtl\";\n this.checkedValue = isRtl ? !isRightClick : isRightClick;\n return;\n }\n return true;\n };\n QuestionBoolean.prototype.onTrueLabelClick = function (data, event) {\n return this.onLabelClick(event, true);\n };\n QuestionBoolean.prototype.onFalseLabelClick = function (data, event) {\n return this.onLabelClick(event, false);\n };\n QuestionBoolean.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionBoolean;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionBooleanModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"boolean\", function () {\n return new QuestionBoolean(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"boolean\", function (name) {\n return new QuestionBoolean(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_buttongroup.ts\":\n/*!************************************************!*\\\n !*** ./src/knockout/koquestion_buttongroup.ts ***!\n \\************************************************/\n/*! exports provided: QuestionButtonGroup */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionButtonGroup\", function() { return QuestionButtonGroup; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion_baseselect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion_baseselect */ \"./src/knockout/koquestion_baseselect.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar QuestionButtonGroup = /** @class */ (function (_super) {\n __extends(QuestionButtonGroup, _super);\n function QuestionButtonGroup(name) {\n return _super.call(this, name) || this;\n }\n QuestionButtonGroup.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion_baseselect__WEBPACK_IMPORTED_MODULE_1__[\"QuestionCheckboxBaseImplementor\"](this);\n };\n QuestionButtonGroup.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionButtonGroup;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionButtonGroupModel\"]));\n\n// Serializer.overrideClassCreator(\"buttongroup\", function() {\n// return new QuestionButtonGroup(\"\");\n// });\n// QuestionFactory.Instance.registerQuestion(\"buttongroup\", name => {\n// var q = new QuestionButtonGroup(name);\n// q.choices = QuestionFactory.DefaultChoices;\n// return q;\n// });\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_checkbox.ts\":\n/*!*********************************************!*\\\n !*** ./src/knockout/koquestion_checkbox.ts ***!\n \\*********************************************/\n/*! exports provided: QuestionCheckboxImplementor, QuestionCheckbox */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxImplementor\", function() { return QuestionCheckboxImplementor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckbox\", function() { return QuestionCheckbox; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _koquestion_baseselect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion_baseselect */ \"./src/knockout/koquestion_baseselect.ts\");\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\nvar QuestionCheckboxImplementor = /** @class */ (function (_super) {\n __extends(QuestionCheckboxImplementor, _super);\n function QuestionCheckboxImplementor(question) {\n return _super.call(this, question) || this;\n }\n QuestionCheckboxImplementor.prototype.getKoValue = function () {\n return this.question.renderedValue;\n };\n return QuestionCheckboxImplementor;\n}(_koquestion_baseselect__WEBPACK_IMPORTED_MODULE_1__[\"QuestionCheckboxBaseImplementor\"]));\n\nvar QuestionCheckbox = /** @class */ (function (_super) {\n __extends(QuestionCheckbox, _super);\n function QuestionCheckbox(name) {\n var _this = _super.call(this, name) || this;\n _this.isAllSelectedUpdating = false;\n _this.koAllSelected = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](_this.isAllSelected);\n _this.koAllSelected.subscribe(function (newValue) {\n if (_this.isAllSelectedUpdating)\n return;\n if (newValue)\n _this.selectAll();\n else\n _this.clearValue();\n });\n return _this;\n }\n QuestionCheckbox.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new QuestionCheckboxImplementor(this);\n };\n QuestionCheckbox.prototype.onSurveyValueChanged = function (newValue) {\n _super.prototype.onSurveyValueChanged.call(this, newValue);\n this.updateAllSelected();\n };\n QuestionCheckbox.prototype.onVisibleChoicesChanged = function () {\n _super.prototype.onVisibleChoicesChanged.call(this);\n this.updateAllSelected();\n };\n QuestionCheckbox.prototype.updateAllSelected = function () {\n this.isAllSelectedUpdating = true;\n this.koAllSelected(this.isAllSelected);\n this.isAllSelectedUpdating = false;\n };\n QuestionCheckbox.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n this.koAllSelected = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionCheckbox;\n}(survey_core__WEBPACK_IMPORTED_MODULE_2__[\"QuestionCheckboxModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].overrideClassCreator(\"checkbox\", function () {\n return new QuestionCheckbox(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_2__[\"QuestionFactory\"].Instance.registerQuestion(\"checkbox\", function (name) {\n var q = new QuestionCheckbox(name);\n q.choices = survey_core__WEBPACK_IMPORTED_MODULE_2__[\"QuestionFactory\"].DefaultChoices;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_comment.ts\":\n/*!********************************************!*\\\n !*** ./src/knockout/koquestion_comment.ts ***!\n \\********************************************/\n/*! exports provided: QuestionComment */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionComment\", function() { return QuestionComment; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar QuestionComment = /** @class */ (function (_super) {\n __extends(QuestionComment, _super);\n function QuestionComment(name) {\n return _super.call(this, name) || this;\n }\n QuestionComment.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"](this);\n };\n QuestionComment.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionComment;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCommentModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"comment\", function () {\n return new QuestionComment(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"comment\", function (name) {\n return new QuestionComment(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_custom.ts\":\n/*!*******************************************!*\\\n !*** ./src/knockout/koquestion_custom.ts ***!\n \\*******************************************/\n/*! exports provided: QuestionCustom, QuestionComposite */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustom\", function() { return QuestionCustom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionComposite\", function() { return QuestionComposite; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar QuestionCustom = /** @class */ (function (_super) {\n __extends(QuestionCustom, _super);\n function QuestionCustom(name, questionJSON) {\n return _super.call(this, name, questionJSON) || this;\n }\n QuestionCustom.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"](this);\n };\n QuestionCustom.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionCustom;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCustomModel\"]));\n\nvar QuestionComposite = /** @class */ (function (_super) {\n __extends(QuestionComposite, _super);\n function QuestionComposite(name, questionJSON) {\n return _super.call(this, name, questionJSON) || this;\n }\n QuestionComposite.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"](this);\n };\n QuestionComposite.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionComposite;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionCompositeModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"ComponentCollection\"].Instance.onCreateCustom = function (name, questionJSON) {\n return new QuestionCustom(name, questionJSON);\n};\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"ComponentCollection\"].Instance.onCreateComposite = function (name, questionJSON) {\n return new QuestionComposite(name, questionJSON);\n};\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_dropdown.ts\":\n/*!*********************************************!*\\\n !*** ./src/knockout/koquestion_dropdown.ts ***!\n \\*********************************************/\n/*! exports provided: QuestionDropdown */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionDropdown\", function() { return QuestionDropdown; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion_baseselect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion_baseselect */ \"./src/knockout/koquestion_baseselect.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar QuestionDropdownImplementor = /** @class */ (function (_super) {\n __extends(QuestionDropdownImplementor, _super);\n function QuestionDropdownImplementor(question) {\n return _super.call(this, question) || this;\n }\n return QuestionDropdownImplementor;\n}(_koquestion_baseselect__WEBPACK_IMPORTED_MODULE_1__[\"QuestionSelectBaseImplementor\"]));\nvar QuestionDropdown = /** @class */ (function (_super) {\n __extends(QuestionDropdown, _super);\n function QuestionDropdown(name) {\n return _super.call(this, name) || this;\n }\n QuestionDropdown.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new QuestionDropdownImplementor(this);\n };\n QuestionDropdown.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionDropdown;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionDropdownModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"dropdown\", function () {\n return new QuestionDropdown(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"dropdown\", function (name) {\n var q = new QuestionDropdown(name);\n q.choices = survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].DefaultChoices;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_empty.ts\":\n/*!******************************************!*\\\n !*** ./src/knockout/koquestion_empty.ts ***!\n \\******************************************/\n/*! exports provided: QuestionEmpty */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionEmpty\", function() { return QuestionEmpty; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar QuestionEmpty = /** @class */ (function (_super) {\n __extends(QuestionEmpty, _super);\n function QuestionEmpty(name) {\n return _super.call(this, name) || this;\n }\n QuestionEmpty.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"](this);\n };\n QuestionEmpty.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionEmpty;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionEmptyModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"empty\", function () {\n return new QuestionEmpty(\"\");\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_expression.ts\":\n/*!***********************************************!*\\\n !*** ./src/knockout/koquestion_expression.ts ***!\n \\***********************************************/\n/*! exports provided: QuestionExpression */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionExpression\", function() { return QuestionExpression; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar QuestionExpression = /** @class */ (function (_super) {\n __extends(QuestionExpression, _super);\n function QuestionExpression(name) {\n return _super.call(this, name) || this;\n }\n QuestionExpression.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"](this);\n };\n QuestionExpression.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionExpression;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionExpressionModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"expression\", function () {\n return new QuestionExpression(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"expression\", function (name) {\n return new QuestionExpression(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_file.ts\":\n/*!*****************************************!*\\\n !*** ./src/knockout/koquestion_file.ts ***!\n \\*****************************************/\n/*! exports provided: QuestionFile */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionFile\", function() { return QuestionFile; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\nvar QuestionFileImplementor = /** @class */ (function (_super) {\n __extends(QuestionFileImplementor, _super);\n function QuestionFileImplementor(question) {\n var _this = _super.call(this, question) || this;\n _this.setObservaleObj(\"koState\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](\"empty\"));\n _this.setObservaleObj(\"koHasValue\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () { return _this.question.koState() === \"loaded\"; }));\n _this.setObservaleObj(\"koData\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n if (_this.question.koHasValue()) {\n return _this.question.previewValue;\n }\n return [];\n }));\n _this.setObservaleObj(\"koInputTitle\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"]());\n _this.setObservaleObj(\"koChooseFileClass\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n return (_this.question.koCss().chooseFile +\n (_this.question.isReadOnly ? \" \" + _this.question.koCss().controlDisabled : \"\"));\n }));\n _this.setCallbackFunc(\"ondrop\", function (data, event) {\n if (_this.question.isReadOnly)\n return false;\n event.preventDefault();\n var src = event.originalEvent\n ? event.originalEvent.dataTransfer\n : event.dataTransfer;\n _this.onChange(src);\n });\n _this.setCallbackFunc(\"ondragover\", function (data, event) {\n if (_this.question.isReadOnly) {\n event.returnValue = false;\n return false;\n }\n var dataTransfer = event.originalEvent\n ? event.originalEvent.dataTransfer\n : event.dataTransfer;\n dataTransfer.dropEffect = \"copy\";\n event.preventDefault();\n });\n _this.setCallbackFunc(\"dochange\", function (data, event) {\n var src = event.target || event.srcElement;\n _this.onChange(src);\n });\n _this.setCallbackFunc(\"doclean\", function (data, event) {\n var src = event.target || event.srcElement;\n if (_this.question.needConfirmRemoveFile) {\n var isConfirmed = Object(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"confirmAction\"])(_this.question.confirmRemoveAllMessage);\n if (!isConfirmed)\n return;\n }\n var input = src.parentElement.querySelectorAll(\"input\")[0];\n _this.question.clear();\n input.value = \"\";\n });\n _this.setCallbackFunc(\"doremovefile\", function (data, event) {\n if (_this.question.needConfirmRemoveFile) {\n var isConfirmed = Object(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"confirmAction\"])(_this.question.getConfirmRemoveMessage(data.name));\n if (!isConfirmed)\n return;\n }\n _this.question.removeFile(data);\n });\n _this.setCallbackFunc(\"dodownload\", function (data, event) {\n if (Object(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"detectIEOrEdge\"])()) {\n Object(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"loadFileFromBase64\"])(data.content, data.name);\n }\n else {\n return true;\n }\n });\n return _this;\n }\n QuestionFileImplementor.prototype.onChange = function (src) {\n if (!window[\"FileReader\"])\n return;\n if (!src || !src.files || src.files.length < 1)\n return;\n var files = [];\n var allowCount = this.question.allowMultiple ? src.files.length : 1;\n for (var i = 0; i < allowCount; i++) {\n files.push(src.files[i]);\n }\n src.value = \"\";\n this.question.loadFiles(files);\n };\n return QuestionFileImplementor;\n}(_koquestion__WEBPACK_IMPORTED_MODULE_2__[\"QuestionImplementor\"]));\nvar QuestionFile = /** @class */ (function (_super) {\n __extends(QuestionFile, _super);\n function QuestionFile(name) {\n var _this = _super.call(this, name) || this;\n var updateState = function (state) {\n _this.koState(state);\n _this.koInputTitle(_this.inputTitle);\n };\n _this.onStateChanged.add(function (sender, options) {\n updateState(options.state);\n });\n return _this;\n }\n QuestionFile.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new QuestionFileImplementor(this);\n };\n QuestionFile.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionFile;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFileModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].overrideClassCreator(\"file\", function () {\n return new QuestionFile(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].Instance.registerQuestion(\"file\", function (name) {\n return new QuestionFile(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_html.ts\":\n/*!*****************************************!*\\\n !*** ./src/knockout/koquestion_html.ts ***!\n \\*****************************************/\n/*! exports provided: QuestionHtml */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionHtml\", function() { return QuestionHtml; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar QuestionHtml = /** @class */ (function (_super) {\n __extends(QuestionHtml, _super);\n function QuestionHtml(name) {\n return _super.call(this, name) || this;\n }\n QuestionHtml.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"](this);\n };\n QuestionHtml.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionHtml;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionHtmlModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"html\", function () {\n return new QuestionHtml(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"html\", function (name) {\n return new QuestionHtml(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_image.ts\":\n/*!******************************************!*\\\n !*** ./src/knockout/koquestion_image.ts ***!\n \\******************************************/\n/*! exports provided: QuestionImage */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionImage\", function() { return QuestionImage; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar QuestionImage = /** @class */ (function (_super) {\n __extends(QuestionImage, _super);\n function QuestionImage(name) {\n return _super.call(this, name) || this;\n }\n QuestionImage.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"](this);\n };\n QuestionImage.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionImage;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionImageModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"image\", function () {\n return new QuestionImage(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"image\", function (name) {\n return new QuestionImage(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_imagepicker.ts\":\n/*!************************************************!*\\\n !*** ./src/knockout/koquestion_imagepicker.ts ***!\n \\************************************************/\n/*! exports provided: QuestionImagePicker */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionImagePicker\", function() { return QuestionImagePicker; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion_baseselect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion_baseselect */ \"./src/knockout/koquestion_baseselect.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar QuestionImagePickerImplementor = /** @class */ (function (_super) {\n __extends(QuestionImagePickerImplementor, _super);\n function QuestionImagePickerImplementor(question) {\n return _super.call(this, question) || this;\n }\n QuestionImagePickerImplementor.prototype.getKoValue = function () {\n return this.question.renderedValue;\n };\n return QuestionImagePickerImplementor;\n}(_koquestion_baseselect__WEBPACK_IMPORTED_MODULE_1__[\"QuestionCheckboxBaseImplementor\"]));\nvar QuestionImagePicker = /** @class */ (function (_super) {\n __extends(QuestionImagePicker, _super);\n function QuestionImagePicker(name) {\n return _super.call(this, name) || this;\n }\n QuestionImagePicker.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new QuestionImagePickerImplementor(this);\n };\n QuestionImagePicker.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionImagePicker;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionImagePickerModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"imagepicker\", function () {\n return new QuestionImagePicker(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"imagepicker\", function (name) {\n var q = new QuestionImagePicker(name);\n //q.choices = QuestionFactory.DefaultChoices;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_matrix.ts\":\n/*!*******************************************!*\\\n !*** ./src/knockout/koquestion_matrix.ts ***!\n \\*******************************************/\n/*! exports provided: QuestionMatrix */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrix\", function() { return QuestionMatrix; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\n/* harmony import */ var _kobase__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./kobase */ \"./src/knockout/kobase.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\nvar QuestionMatrix = /** @class */ (function (_super) {\n __extends(QuestionMatrix, _super);\n function QuestionMatrix(name) {\n var _this = _super.call(this, name) || this;\n _this.koVisibleRows = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observableArray\"]();\n _this.koVisibleColumns = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observableArray\"]();\n _this.koVisibleRows(_this.visibleRows);\n _this.koVisibleColumns(_this.visibleColumns);\n return _this;\n }\n QuestionMatrix.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_2__[\"QuestionImplementor\"](this);\n };\n QuestionMatrix.prototype.onColumnsChanged = function () {\n _super.prototype.onColumnsChanged.call(this);\n this.koVisibleColumns(this.visibleColumns);\n };\n QuestionMatrix.prototype.onRowsChanged = function () {\n _super.prototype.onRowsChanged.call(this);\n this.koVisibleRows(this.visibleRows);\n };\n QuestionMatrix.prototype.onSurveyLoad = function () {\n _super.prototype.onSurveyLoad.call(this);\n this.onRowsChanged();\n };\n QuestionMatrix.prototype.onMatrixRowCreated = function (row) {\n new _kobase__WEBPACK_IMPORTED_MODULE_3__[\"ImplementorBase\"](row);\n };\n QuestionMatrix.prototype.getVisibleRows = function () {\n var rows = _super.prototype.getVisibleRows.call(this);\n this.koVisibleRows(rows);\n return rows;\n };\n QuestionMatrix.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n this.koVisibleRows = undefined;\n this.koVisibleColumns = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionMatrix;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMatrixModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].overrideClassCreator(\"matrix\", function () {\n return new QuestionMatrix(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].Instance.registerQuestion(\"matrix\", function (name) {\n var q = new QuestionMatrix(name);\n q.rows = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].DefaultRows;\n q.columns = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].DefaultColums;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_matrixdropdown.ts\":\n/*!***************************************************!*\\\n !*** ./src/knockout/koquestion_matrixdropdown.ts ***!\n \\***************************************************/\n/*! exports provided: QuestionMatrixBaseImplementor, QuestionMatrixDropdown */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixBaseImplementor\", function() { return QuestionMatrixBaseImplementor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdown\", function() { return QuestionMatrixDropdown; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\n/* harmony import */ var _kobase__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./kobase */ \"./src/knockout/kobase.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\n\nvar QuestionMatrixBaseImplementor = /** @class */ (function (_super) {\n __extends(QuestionMatrixBaseImplementor, _super);\n function QuestionMatrixBaseImplementor(question) {\n var _this = _super.call(this, question) || this;\n _this.koRecalc = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](0);\n (_this.question).onRenderedTableCreatedCallback = function (table) {\n if (!!_this._tableImplementor) {\n _this._tableImplementor.dispose();\n }\n _this._tableImplementor = new _kobase__WEBPACK_IMPORTED_MODULE_3__[\"ImplementorBase\"](table);\n };\n (_this.question).onRenderedTableResetCallback = function () {\n if (_this.question.isDisposed)\n return;\n _this.koRecalc(_this.koRecalc() + 1);\n };\n _this.setObservaleObj(\"koTable\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.renderedTable;\n }));\n _this.setCallbackFunc(\"koCellAfterRender\", function (el, con) {\n return _this.cellAfterRender(el, con);\n });\n _this.setCallbackFunc(\"koCellQuestionAfterRender\", function (el, con) {\n return _this.cellQuestionAfterRender(el, con);\n });\n _this.setCallbackFunc(\"koAddRowClick\", function () {\n _this.addRow();\n });\n _this.setCallbackFunc(\"koRemoveRowClick\", function (data) {\n _this.removeRow(data.row);\n });\n _this.setCallbackFunc(\"koPanelAfterRender\", function (el, con) {\n _this.panelAfterRender(el, con);\n });\n return _this;\n }\n QuestionMatrixBaseImplementor.prototype.getQuestionTemplate = function () {\n return \"matrixdynamic\";\n };\n QuestionMatrixBaseImplementor.prototype.cellAfterRender = function (elements, con) {\n var _this = this;\n if (!this.question.survey)\n return;\n setTimeout(function () {\n !!knockout__WEBPACK_IMPORTED_MODULE_0__[\"tasks\"] && knockout__WEBPACK_IMPORTED_MODULE_0__[\"tasks\"].runEarly();\n var el = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyElement\"].GetFirstNonTextElement(elements);\n if (!el)\n return;\n var cell = con;\n if (cell.question.customWidget) {\n cell.question.customWidget.afterRender(cell.question, el);\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"utils\"].domNodeDisposal.addDisposeCallback(el, function () {\n cell.question.customWidget.willUnmount(cell.question, el);\n });\n }\n var options = {\n cell: cell.cell,\n cellQuestion: cell.question,\n htmlElement: el,\n row: cell.row,\n column: !!cell.cell ? cell.cell.column : null,\n };\n _this.question.survey.matrixAfterCellRender(_this.question, options);\n }, 0);\n };\n QuestionMatrixBaseImplementor.prototype.cellQuestionAfterRender = function (elements, con) {\n if (!this.question.survey)\n return;\n var el = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyElement\"].GetFirstNonTextElement(elements);\n if (!el)\n return;\n var cell = con;\n cell.question.afterRenderQuestionElement(el);\n };\n QuestionMatrixBaseImplementor.prototype.isAddRowTop = function () {\n return false;\n };\n QuestionMatrixBaseImplementor.prototype.isAddRowBottom = function () {\n return false;\n };\n QuestionMatrixBaseImplementor.prototype.addRow = function () { };\n QuestionMatrixBaseImplementor.prototype.removeRow = function (row) { };\n QuestionMatrixBaseImplementor.prototype.panelAfterRender = function (elements, con) {\n if (!this.question || !this.question.survey)\n return;\n var el = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyElement\"].GetFirstNonTextElement(elements);\n this.question.survey.afterRenderPanel(con, el);\n };\n QuestionMatrixBaseImplementor.prototype.dispose = function () {\n if (!!this._tableImplementor) {\n this._tableImplementor.dispose();\n }\n (this.question).onRenderedTableCreatedCallback = undefined;\n (this.question).onRenderedTableResetCallback = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionMatrixBaseImplementor;\n}(_koquestion__WEBPACK_IMPORTED_MODULE_2__[\"QuestionImplementor\"]));\n\nvar QuestionMatrixDropdown = /** @class */ (function (_super) {\n __extends(QuestionMatrixDropdown, _super);\n function QuestionMatrixDropdown(name) {\n return _super.call(this, name) || this;\n }\n QuestionMatrixDropdown.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new QuestionMatrixBaseImplementor(this);\n };\n QuestionMatrixDropdown.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n this._implementor.dispose();\n this._implementor = undefined;\n };\n return QuestionMatrixDropdown;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMatrixDropdownModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].overrideClassCreator(\"matrixdropdown\", function () {\n return new QuestionMatrixDropdown(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].Instance.registerQuestion(\"matrixdropdown\", function (name) {\n var q = new QuestionMatrixDropdown(name);\n q.choices = [1, 2, 3, 4, 5];\n q.rows = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].DefaultRows;\n survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMatrixDropdownModelBase\"].addDefaultColumns(q);\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_matrixdynamic.ts\":\n/*!**************************************************!*\\\n !*** ./src/knockout/koquestion_matrixdynamic.ts ***!\n \\**************************************************/\n/*! exports provided: QuestionMatrixDynamicImplementor, QuestionMatrixDynamic */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDynamicImplementor\", function() { return QuestionMatrixDynamicImplementor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDynamic\", function() { return QuestionMatrixDynamic; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion_matrixdropdown__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./koquestion_matrixdropdown */ \"./src/knockout/koquestion_matrixdropdown.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\nvar QuestionMatrixDynamicImplementor = /** @class */ (function (_super) {\n __extends(QuestionMatrixDynamicImplementor, _super);\n function QuestionMatrixDynamicImplementor(question) {\n var _this = _super.call(this, question) || this;\n _this.question[\"getKoPopupIsVisible\"] = _this.getKoPopupIsVisible;\n return _this;\n }\n QuestionMatrixDynamicImplementor.prototype.addRow = function () {\n this.question.addRowUI();\n };\n QuestionMatrixDynamicImplementor.prototype.removeRow = function (row) {\n this.question.removeRowUI(row);\n };\n QuestionMatrixDynamicImplementor.prototype.getKoPopupIsVisible = function (row) {\n return knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](row.isDetailPanelShowing);\n };\n QuestionMatrixDynamicImplementor.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n this.question[\"getKoPopupIsVisible\"] = undefined;\n };\n return QuestionMatrixDynamicImplementor;\n}(_koquestion_matrixdropdown__WEBPACK_IMPORTED_MODULE_2__[\"QuestionMatrixBaseImplementor\"]));\n\nvar QuestionMatrixDynamic = /** @class */ (function (_super) {\n __extends(QuestionMatrixDynamic, _super);\n function QuestionMatrixDynamic(name) {\n return _super.call(this, name) || this;\n }\n QuestionMatrixDynamic.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new QuestionMatrixDynamicImplementor(this);\n };\n QuestionMatrixDynamic.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionMatrixDynamic;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMatrixDynamicModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].overrideClassCreator(\"matrixdynamic\", function () {\n return new QuestionMatrixDynamic(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].Instance.registerQuestion(\"matrixdynamic\", function (name) {\n var q = new QuestionMatrixDynamic(name);\n q.choices = [1, 2, 3, 4, 5];\n q.rowCount = 2;\n survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMatrixDropdownModelBase\"].addDefaultColumns(q);\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_multipletext.ts\":\n/*!*************************************************!*\\\n !*** ./src/knockout/koquestion_multipletext.ts ***!\n \\*************************************************/\n/*! exports provided: MultipleTextItem, QuestionMultipleText */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MultipleTextItem\", function() { return MultipleTextItem; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMultipleText\", function() { return QuestionMultipleText; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\n/* harmony import */ var _koquestion_text__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./koquestion_text */ \"./src/knockout/koquestion_text.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\nvar MultipleTextItem = /** @class */ (function (_super) {\n __extends(MultipleTextItem, _super);\n function MultipleTextItem(name, title) {\n if (name === void 0) { name = null; }\n if (title === void 0) { title = null; }\n return _super.call(this, name, title) || this;\n }\n MultipleTextItem.prototype.createEditor = function (name) {\n return new _koquestion_text__WEBPACK_IMPORTED_MODULE_3__[\"QuestionText\"](name);\n };\n return MultipleTextItem;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"MultipleTextItemModel\"]));\n\nvar QuestionMultipleText = /** @class */ (function (_super) {\n __extends(QuestionMultipleText, _super);\n function QuestionMultipleText(name) {\n var _this = _super.call(this, name) || this;\n _this.koRows = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observableArray\"](_this.getRows());\n _this.colCountChangedCallback = function () {\n _this.onColCountChanged();\n };\n _this.onColCountChanged();\n return _this;\n }\n QuestionMultipleText.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_2__[\"QuestionImplementor\"](this);\n };\n QuestionMultipleText.prototype.onColCountChanged = function () {\n this.koRows(this.getRows());\n };\n QuestionMultipleText.prototype.createTextItem = function (name, title) {\n return new MultipleTextItem(name, title);\n };\n QuestionMultipleText.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n this.koRows = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionMultipleText;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMultipleTextModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].overrideClassCreator(\"multipletextitem\", function () {\n return new MultipleTextItem(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].overrideClassCreator(\"multipletext\", function () {\n return new QuestionMultipleText(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].Instance.registerQuestion(\"multipletext\", function (name) {\n var q = new QuestionMultipleText(name);\n survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMultipleTextModel\"].addDefaultItems(q);\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_paneldynamic.ts\":\n/*!*************************************************!*\\\n !*** ./src/knockout/koquestion_paneldynamic.ts ***!\n \\*************************************************/\n/*! exports provided: QuestionPanelDynamicImplementor, QuestionPanelDynamic */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamicImplementor\", function() { return QuestionPanelDynamicImplementor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamic\", function() { return QuestionPanelDynamic; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\nvar QuestionPanelDynamicImplementor = /** @class */ (function (_super) {\n __extends(QuestionPanelDynamicImplementor, _super);\n function QuestionPanelDynamicImplementor(question) {\n var _this = _super.call(this, question) || this;\n _this.koRecalc = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](0);\n var self = _this;\n _this.setCallbackFunc(\"koAddPanelClick\", function () {\n _this.addPanel();\n });\n _this.setCallbackFunc(\"koRemovePanelClick\", function (data) {\n _this.removePanel(data);\n });\n _this.setCallbackFunc(\"koPrevPanelClick\", function () {\n _this.question.goToPrevPanel();\n });\n _this.setCallbackFunc(\"koNextPanelClick\", function () {\n _this.question.goToNextPanel();\n });\n _this.setObservaleObj(\"koCanAddPanel\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.canAddPanel;\n }));\n _this.setObservaleObj(\"koCanRemovePanel\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.canRemovePanel;\n }));\n _this.setObservaleObj(\"koIsPrevButton\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.isPrevButtonShowing;\n }));\n _this.setObservaleObj(\"koIsNextButton\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.isNextButtonShowing;\n }));\n _this.setObservaleObj(\"koIsRange\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.isRangeShowing;\n }));\n _this.setObservaleObj(\"koPanel\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.currentPanel;\n }));\n _this.setObservaleObj(\"koIsList\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.isRenderModeList;\n }));\n _this.setObservaleObj(\"koIsProgressTop\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.isProgressTopShowing;\n }));\n _this.setObservaleObj(\"koIsProgressBottom\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.isProgressBottomShowing;\n }));\n var koRangeValue = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](_this.question.currentIndex);\n koRangeValue.subscribe(function (newValue) {\n _this.question.currentIndex = newValue;\n });\n _this.setObservaleObj(\"koRangeValue\", koRangeValue);\n _this.setObservaleObj(\"koRangeMax\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.panelCount - 1;\n }));\n _this.setObservaleObj(\"koButtonAddCss\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.buttonAddCss;\n }));\n _this.setObservaleObj(\"koButtonNextCss\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.buttonNextCss;\n }));\n _this.setObservaleObj(\"koButtonPrevCss\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.buttonPrevCss;\n }));\n _this.setObservaleObj(\"koProgressText\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.question.progressText;\n }));\n _this.setObservaleObj(\"koProgress\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"pureComputed\"](function () {\n _this.koRecalc();\n return _this.progress;\n }));\n _this.setCallbackFunc(\"koPanelAfterRender\", function (el, con) {\n _this.panelAfterRender(el, con);\n });\n _this.question.panelCountChangedCallback = function () {\n _this.onPanelCountChanged();\n };\n _this.question.renderModeChangedCallback = function () {\n _this.onRenderModeChanged();\n };\n _this.question.currentIndexChangedCallback = function () {\n _this.onCurrentIndexChanged();\n };\n return _this;\n }\n QuestionPanelDynamicImplementor.prototype.onPanelCountChanged = function () {\n this.onCurrentIndexChanged();\n };\n QuestionPanelDynamicImplementor.prototype.onRenderModeChanged = function () {\n this.onCurrentIndexChanged();\n };\n QuestionPanelDynamicImplementor.prototype.onCurrentIndexChanged = function () {\n if (this.question.isDisposed)\n return;\n this.koRecalc(this.koRecalc() + 1);\n this.question.koRangeValue(this.question.currentIndex);\n };\n QuestionPanelDynamicImplementor.prototype.addPanel = function () {\n this.question.addPanelUI();\n };\n QuestionPanelDynamicImplementor.prototype.removePanel = function (val) {\n var q = this.question;\n if (!q.isRenderModeList) {\n val = q.currentPanel;\n }\n q.removePanelUI(val);\n };\n QuestionPanelDynamicImplementor.prototype.panelAfterRender = function (elements, con) {\n if (!this.question || !this.question.survey)\n return;\n var el = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyElement\"].GetFirstNonTextElement(elements);\n this.question.survey.afterRenderPanel(con, el);\n };\n Object.defineProperty(QuestionPanelDynamicImplementor.prototype, \"buttonAddCss\", {\n get: function () {\n var question = this.question;\n var btnClasses = question.cssClasses.button + \" \" + question.cssClasses.buttonAdd;\n if (this.question.renderMode === \"list\") {\n btnClasses += \" \" + question.cssClasses.buttonAdd + \"--list-mode\";\n }\n return btnClasses;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicImplementor.prototype, \"buttonPrevCss\", {\n get: function () {\n var question = this.question;\n var btnClasses = question.cssClasses.buttonPrev;\n if (!question.isPrevButtonShowing) {\n btnClasses += \" \" + question.cssClasses.buttonPrev + \"--disabled\";\n }\n return btnClasses;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicImplementor.prototype, \"buttonNextCss\", {\n get: function () {\n var question = this.question;\n var btnClasses = question.cssClasses.buttonNext;\n if (!question.isNextButtonShowing) {\n btnClasses += \" \" + question.cssClasses.buttonNext + \"--disabled\";\n }\n return btnClasses;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicImplementor.prototype, \"progress\", {\n get: function () {\n var rangeMax = this.question.panelCount - 1;\n return (this.question.currentIndex / rangeMax) * 100 + \"%\";\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicImplementor.prototype.dispose = function () {\n this.question.panelCountChangedCallback = undefined;\n this.question.renderModeChangedCallback = undefined;\n (this.question).currentIndexChangedCallback = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionPanelDynamicImplementor;\n}(_koquestion__WEBPACK_IMPORTED_MODULE_2__[\"QuestionImplementor\"]));\n\nvar QuestionPanelDynamic = /** @class */ (function (_super) {\n __extends(QuestionPanelDynamic, _super);\n function QuestionPanelDynamic(name) {\n return _super.call(this, name) || this;\n }\n QuestionPanelDynamic.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new QuestionPanelDynamicImplementor(this);\n };\n QuestionPanelDynamic.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionPanelDynamic;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionPanelDynamicModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].overrideClassCreator(\"paneldynamic\", function () {\n return new QuestionPanelDynamic(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].Instance.registerQuestion(\"paneldynamic\", function (name) {\n return new QuestionPanelDynamic(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_radiogroup.ts\":\n/*!***********************************************!*\\\n !*** ./src/knockout/koquestion_radiogroup.ts ***!\n \\***********************************************/\n/*! exports provided: QuestionRadiogroup */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionRadiogroup\", function() { return QuestionRadiogroup; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion_baseselect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion_baseselect */ \"./src/knockout/koquestion_baseselect.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar QuestionRadiogroup = /** @class */ (function (_super) {\n __extends(QuestionRadiogroup, _super);\n function QuestionRadiogroup(name) {\n return _super.call(this, name) || this;\n }\n QuestionRadiogroup.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion_baseselect__WEBPACK_IMPORTED_MODULE_1__[\"QuestionCheckboxBaseImplementor\"](this);\n };\n QuestionRadiogroup.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionRadiogroup;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionRadiogroupModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"radiogroup\", function () {\n return new QuestionRadiogroup(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"radiogroup\", function (name) {\n var q = new QuestionRadiogroup(name);\n q.choices = survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].DefaultChoices;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_ranking.ts\":\n/*!********************************************!*\\\n !*** ./src/knockout/koquestion_ranking.ts ***!\n \\********************************************/\n/*! exports provided: QuestionRanking */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionRanking\", function() { return QuestionRanking; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar QuestionRanking = /** @class */ (function (_super) {\n __extends(QuestionRanking, _super);\n function QuestionRanking() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n QuestionRanking.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"](this);\n };\n QuestionRanking.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionRanking;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionRankingModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"ranking\", function () {\n return new QuestionRanking(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"ranking\", function (name) {\n var q = new QuestionRanking(name);\n q.choices = survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].DefaultChoices;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_rating.ts\":\n/*!*******************************************!*\\\n !*** ./src/knockout/koquestion_rating.ts ***!\n \\*******************************************/\n/*! exports provided: QuestionRatingImplementor, QuestionRating */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionRatingImplementor\", function() { return QuestionRatingImplementor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionRating\", function() { return QuestionRating; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar QuestionRatingImplementor = /** @class */ (function (_super) {\n __extends(QuestionRatingImplementor, _super);\n function QuestionRatingImplementor(question) {\n var _this = _super.call(this, question) || this;\n _this.onCreated();\n _this.koVisibleRateValues = _this.setObservaleObj(\"koVisibleRateValues\", knockout__WEBPACK_IMPORTED_MODULE_0__[\"observableArray\"]());\n _this.question.rateValuesChangedCallback = function () {\n _this.onRateValuesChanged();\n };\n return _this;\n }\n QuestionRatingImplementor.prototype.onCreated = function () { };\n QuestionRatingImplementor.prototype.onRateValuesChanged = function () {\n this.koVisibleRateValues(this.getValues());\n };\n QuestionRatingImplementor.prototype.getValues = function () {\n return this.question.visibleRateValues;\n };\n QuestionRatingImplementor.prototype.dispose = function () {\n this.question.rateValuesChangedCallback = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionRatingImplementor;\n}(_koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"]));\n\nvar QuestionRating = /** @class */ (function (_super) {\n __extends(QuestionRating, _super);\n function QuestionRating(name) {\n return _super.call(this, name) || this;\n }\n QuestionRating.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new QuestionRatingImplementor(this);\n };\n QuestionRating.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionRating;\n}(survey_core__WEBPACK_IMPORTED_MODULE_2__[\"QuestionRatingModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].overrideClassCreator(\"rating\", function () {\n return new QuestionRating(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_2__[\"QuestionFactory\"].Instance.registerQuestion(\"rating\", function (name) {\n return new QuestionRating(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_signaturepad.ts\":\n/*!*************************************************!*\\\n !*** ./src/knockout/koquestion_signaturepad.ts ***!\n \\*************************************************/\n/*! exports provided: QuestionSignaturePad */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionSignaturePad\", function() { return QuestionSignaturePad; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\nvar QuestionSignaturePad = /** @class */ (function (_super) {\n __extends(QuestionSignaturePad, _super);\n function QuestionSignaturePad(name) {\n return _super.call(this, name) || this;\n }\n QuestionSignaturePad.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"](this);\n };\n QuestionSignaturePad.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionSignaturePad;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionSignaturePadModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"signaturepad\", function () {\n return new QuestionSignaturePad(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"signaturepad\", function (name) {\n return new QuestionSignaturePad(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/koquestion_text.ts\":\n/*!*****************************************!*\\\n !*** ./src/knockout/koquestion_text.ts ***!\n \\*****************************************/\n/*! exports provided: QuestionText */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionText\", function() { return QuestionText; });\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _koquestion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./koquestion */ \"./src/knockout/koquestion.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar QuestionText = /** @class */ (function (_super) {\n __extends(QuestionText, _super);\n function QuestionText(name) {\n return _super.call(this, name) || this;\n }\n QuestionText.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n this._implementor = new _koquestion__WEBPACK_IMPORTED_MODULE_1__[\"QuestionImplementor\"](this);\n };\n QuestionText.prototype.dispose = function () {\n this._implementor.dispose();\n this._implementor = undefined;\n _super.prototype.dispose.call(this);\n };\n return QuestionText;\n}(survey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionTextModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].overrideClassCreator(\"text\", function () {\n return new QuestionText(\"\");\n});\nsurvey_core__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"text\", function (name) {\n return new QuestionText(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/knockout/kosurvey.ts\":\n/*!**********************************!*\\\n !*** ./src/knockout/kosurvey.ts ***!\n \\**********************************/\n/*! exports provided: Survey, registerTemplateEngine */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Survey\", function() { return Survey; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"registerTemplateEngine\", function() { return registerTemplateEngine; });\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! knockout */ \"knockout\");\n/* harmony import */ var knockout__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(knockout__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var survey_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! survey-core */ \"./src/entries/core.ts\");\n/* harmony import */ var _kopage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./kopage */ \"./src/knockout/kopage.ts\");\n/* harmony import */ var _templateText__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./templateText */ \"./src/knockout/templateText.ts\");\n/* harmony import */ var _kobase__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./kobase */ \"./src/knockout/kobase.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\n\n\n\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"CustomWidgetCollection\"].Instance.onCustomWidgetAdded.add(function (customWidget) {\n if (customWidget.widgetJson.isDefaultRender)\n return;\n if (!customWidget.htmlTemplate)\n customWidget.htmlTemplate =\n \"
'htmlTemplate' attribute is missed.
\";\n new _templateText__WEBPACK_IMPORTED_MODULE_3__[\"SurveyTemplateText\"]().replaceText(customWidget.htmlTemplate, \"widget\", customWidget.name);\n});\nvar Survey = /** @class */ (function (_super) {\n __extends(Survey, _super);\n function Survey(jsonObj, renderedElement, css) {\n if (jsonObj === void 0) { jsonObj = null; }\n if (renderedElement === void 0) { renderedElement = null; }\n if (css === void 0) { css = null; }\n var _this = _super.call(this, jsonObj) || this;\n _this.isFirstRender = true;\n _this.mouseDownPage = null;\n _this.koTitleTemplate = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](\"survey-header\");\n if (typeof knockout__WEBPACK_IMPORTED_MODULE_0__ === \"undefined\")\n throw new Error(\"knockoutjs library is not loaded.\");\n if (css) {\n _this.css = css;\n }\n if (renderedElement) {\n _this.renderedElement = renderedElement;\n }\n _this.render(renderedElement);\n return _this;\n }\n Object.defineProperty(Survey, \"cssType\", {\n get: function () {\n return survey_core__WEBPACK_IMPORTED_MODULE_1__[\"surveyCss\"].currentType;\n },\n set: function (value) {\n survey_core__WEBPACK_IMPORTED_MODULE_1__[\"StylesManager\"].applyTheme(value);\n },\n enumerable: false,\n configurable: true\n });\n Survey.prototype.getDataValueCore = function (valuesHash, key) {\n if (!!this.editingObj)\n return _super.prototype.getDataValueCore.call(this, valuesHash, key);\n if (valuesHash[key] === undefined) {\n valuesHash[key] = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"]();\n }\n return knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](valuesHash[key]);\n };\n Survey.prototype.setDataValueCore = function (valuesHash, key, value) {\n if (!!this.editingObj) {\n _super.prototype.setDataValueCore.call(this, valuesHash, key, value);\n return;\n }\n if (knockout__WEBPACK_IMPORTED_MODULE_0__[\"isWriteableObservable\"](valuesHash[key])) {\n valuesHash[key](value);\n }\n else {\n valuesHash[key] = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](value);\n }\n };\n Survey.prototype.deleteDataValueCore = function (valuesHash, key) {\n if (!!this.editingObj) {\n _super.prototype.deleteDataValueCore.call(this, valuesHash, key);\n return;\n }\n if (knockout__WEBPACK_IMPORTED_MODULE_0__[\"isWriteableObservable\"](valuesHash[key])) {\n valuesHash[key](undefined);\n }\n else {\n delete valuesHash[key];\n }\n };\n Survey.prototype.onBaseCreating = function () {\n _super.prototype.onBaseCreating.call(this);\n new _kobase__WEBPACK_IMPORTED_MODULE_4__[\"ImplementorBase\"](this);\n };\n Survey.prototype.nextPageUIClick = function () {\n if (!!this.mouseDownPage && this.mouseDownPage !== this.currentPage)\n return;\n this.mouseDownPage = null;\n this.nextPage();\n };\n Survey.prototype.nextPageMouseDown = function () {\n this.mouseDownPage = this.currentPage;\n return this.navigationMouseDown();\n };\n Survey.prototype.render = function (element) {\n if (element === void 0) { element = null; }\n this.updateKoCurrentPage();\n this.updateCustomWidgets(this.currentPage);\n var self = this;\n if (element && typeof element == \"string\") {\n element = document.getElementById(element);\n }\n if (element) {\n this.renderedElement = element;\n }\n element = this.renderedElement;\n self.startTimerFromUI();\n if (!element)\n return;\n self.applyBinding();\n };\n Survey.prototype.clear = function (clearData, gotoFirstPage) {\n if (clearData === void 0) { clearData = true; }\n if (gotoFirstPage === void 0) { gotoFirstPage = true; }\n _super.prototype.clear.call(this, clearData, gotoFirstPage);\n this.render();\n };\n Survey.prototype.localeChanged = function () {\n _super.prototype.localeChanged.call(this);\n this.render();\n };\n Survey.prototype.koEventAfterRender = function (element, survey) {\n survey.afterRenderSurvey(element);\n };\n Survey.prototype.loadSurveyFromService = function (surveyId, clientId, renderedElement) {\n if (surveyId === void 0) { surveyId = null; }\n if (clientId === void 0) { clientId = null; }\n if (renderedElement === void 0) { renderedElement = null; }\n if (renderedElement) {\n this.renderedElement = renderedElement;\n }\n _super.prototype.loadSurveyFromService.call(this, surveyId, clientId);\n };\n Survey.prototype.setCompleted = function () {\n _super.prototype.setCompleted.call(this);\n this.updateKoCurrentPage();\n };\n Survey.prototype.start = function () {\n var res = _super.prototype.start.call(this);\n this.updateKoCurrentPage();\n return res;\n };\n Survey.prototype.createNewPage = function (name) {\n return new _kopage__WEBPACK_IMPORTED_MODULE_2__[\"Page\"](name);\n };\n Survey.prototype.getHtmlTemplate = function () {\n return _templateText__WEBPACK_IMPORTED_MODULE_3__[\"koTemplate\"];\n };\n Survey.prototype.onBeforeCreating = function () {\n var _this = this;\n this.dummyObservable = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](0);\n this.koCurrentPage = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](this.currentPage);\n this.isCurrentPageEmpty = knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n return !!_this.koCurrentPage() &&\n _this.getRows(_this.koCurrentPage()).length === 0;\n });\n this.koIsFirstPage = knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n _this.dummyObservable();\n return _this.isFirstPage;\n });\n this.koIsLastPage = knockout__WEBPACK_IMPORTED_MODULE_0__[\"computed\"](function () {\n _this.dummyObservable();\n return _this.isLastPage;\n });\n this.koState = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](this.state);\n this.koCompletedState = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](\"\");\n this.koCompletedStateText = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](\"\");\n this.koCompletedStateCss = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](\"\");\n this.koTimerInfoText = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](this.timerInfoText);\n this.koAfterRenderPage = function (elements, con) {\n var el = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyElement\"].GetFirstNonTextElement(elements);\n if (el)\n _this.afterRenderPage(el);\n };\n this.koAfterRenderHeader = function (elements, con) {\n var el = survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyElement\"].GetFirstNonTextElement(elements);\n if (el)\n _this.afterRenderHeader(el);\n };\n };\n Survey.prototype.currentPageChanged = function (newValue, oldValue) {\n this.updateKoCurrentPage();\n _super.prototype.currentPageChanged.call(this, newValue, oldValue);\n if (!this.isDesignMode)\n this.scrollToTopOnPageChange();\n };\n Survey.prototype.pageVisibilityChanged = function (page, newValue) {\n _super.prototype.pageVisibilityChanged.call(this, page, newValue);\n this.updateKoCurrentPage();\n };\n Survey.prototype.onLoadSurveyFromService = function () {\n this.render();\n };\n Survey.prototype.onLoadingSurveyFromService = function () {\n this.render();\n };\n Survey.prototype.setCompletedState = function (value, text) {\n _super.prototype.setCompletedState.call(this, value, text);\n this.koCompletedState(this.completedState);\n this.koCompletedStateText(this.completedStateText);\n this.koCompletedStateCss(this.completedState !== \"\" ? this.css.saveData[this.completedState] : \"\");\n };\n Survey.prototype.doTimer = function () {\n _super.prototype.doTimer.call(this);\n this.koTimerInfoText(this.timerInfoText);\n };\n Survey.prototype.applyBinding = function () {\n if (!this.renderedElement)\n return;\n this.updateKoCurrentPage();\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"cleanNode\"](this.renderedElement);\n if (!this.isFirstRender) {\n this.updateCurrentPageQuestions();\n }\n this.isFirstRender = false;\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"renderTemplate\"](\"survey-content\", this, { afterRender: this.koEventAfterRender }, this.renderedElement);\n };\n Survey.prototype.updateKoCurrentPage = function () {\n if (this.isLoadingFromJson || this.isDisposed)\n return;\n this.dummyObservable(this.dummyObservable() + 1);\n if (this.currentPage !== this.koCurrentPage()) {\n this.koCurrentPage(this.currentPage);\n }\n this.koState(this.state);\n };\n Survey.prototype.getRows = function (pnl) {\n return !!pnl[\"koRows\"] ? pnl[\"koRows\"]() : pnl.rows;\n };\n Survey.prototype.updateCurrentPageQuestions = function () {\n if (this.isDisposed)\n return;\n var questions = this.currentPage ? this.currentPage.questions : [];\n for (var i = 0; i < questions.length; i++) {\n var q = questions[i];\n if (q.visible)\n q[\"updateQuestion\"]();\n }\n };\n Survey.prototype.updateSurvey = function (newProps, oldProps) {\n var _loop_1 = function () {\n if (key == \"model\" || key == \"children\")\n return \"continue\";\n if (key == \"css\") {\n this_1.mergeValues(newProps.css, this_1.getCss());\n this_1.updateElementCss();\n return \"continue\";\n }\n if (key.indexOf(\"on\") == 0 && this_1[key] && this_1[key].add) {\n var funcBody_1 = newProps[key];\n var func = function (sender, options) {\n funcBody_1(sender, options);\n };\n this_1[key].add(func);\n }\n else {\n this_1[key] = newProps[key];\n }\n };\n var this_1 = this;\n for (var key in newProps) {\n _loop_1();\n }\n if (newProps && newProps.data)\n this.onValueChanged.add(function (sender, options) {\n newProps.data[options.name] = options.value;\n });\n };\n Survey.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n if (!!this.renderedElement) {\n knockout__WEBPACK_IMPORTED_MODULE_0__[\"cleanNode\"](this.renderedElement);\n this.renderedElement.innerHTML = \"\";\n }\n this.koAfterRenderPage = undefined;\n this.koAfterRenderHeader = undefined;\n this.isCurrentPageEmpty.dispose();\n this.koIsFirstPage.dispose();\n this.koIsLastPage.dispose();\n this.iteratePropertiesHash(function (hash, key) {\n delete hash[key];\n });\n this.koCurrentPage(undefined);\n };\n return Survey;\n}(survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyModel\"]));\n\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"LocalizableString\"].prototype[\"onCreating\"] = function () {\n // var self = this;\n // this.koReRender = ko.observable(0);\n this.koHasHtml = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](this.hasHtml);\n this.koRenderedHtml = knockout__WEBPACK_IMPORTED_MODULE_0__[\"observable\"](this.renderedHtml);\n // Object.defineProperty(self, \"koHasHtml\", {\n // get: () => {\n // self.koReRender();\n // return self.hasHtml;\n // },\n // });\n // this.koRenderedHtml = ko.pureComputed(function() {\n // self.koReRender();\n // return self.renderedHtml;\n // });\n};\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"ItemValue\"].prototype[\"onCreating\"] = function () {\n new _kobase__WEBPACK_IMPORTED_MODULE_4__[\"ImplementorBase\"](this);\n};\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"LocalizableString\"].prototype[\"onChanged\"] = function () {\n // this.koReRender(this.koReRender() + 1);\n var hasHtml = this.hasHtml;\n this.koHasHtml(hasHtml);\n this.koRenderedHtml(hasHtml ? this.getHtmlValue() : this.calculatedText);\n};\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"components\"].register(\"survey\", {\n viewModel: {\n createViewModel: function (params, componentInfo) {\n var survey = knockout__WEBPACK_IMPORTED_MODULE_0__[\"unwrap\"](params.survey);\n setTimeout(function () {\n var surveyRoot = document.createElement(\"div\");\n componentInfo.element.appendChild(surveyRoot);\n survey.render(surveyRoot);\n }, 1);\n // !!ko.tasks && ko.tasks.runEarly();\n return params.survey;\n },\n },\n template: _templateText__WEBPACK_IMPORTED_MODULE_3__[\"koTemplate\"],\n});\nknockout__WEBPACK_IMPORTED_MODULE_0__[\"bindingHandlers\"][\"surveyProp\"] = {\n update: function (element, valueAccessor, allBindingsAccessor) {\n var value = knockout__WEBPACK_IMPORTED_MODULE_0__[\"utils\"].unwrapObservable(valueAccessor()) || {};\n for (var propName in value) {\n if (typeof propName == \"string\") {\n var propValue = knockout__WEBPACK_IMPORTED_MODULE_0__[\"utils\"].unwrapObservable(value[propName]);\n element[propName] = propValue;\n }\n }\n },\n};\nsurvey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyModel\"].platform = \"knockout\";\nvar registerTemplateEngine = function (ko, platform) {\n ko.surveyTemplateEngine = function () { };\n ko.surveyTemplateEngine.prototype = new ko.nativeTemplateEngine();\n ko.surveyTemplateEngine.prototype.makeTemplateSource = function (template, templateDocument) {\n if (typeof template === \"string\") {\n templateDocument = templateDocument || document;\n var templateElementRoot = templateDocument.getElementById(\"survey-content-\" + platform);\n if (!templateElementRoot) {\n templateElementRoot = document.createElement(\"div\");\n templateElementRoot.id = \"survey-content-\" + survey_core__WEBPACK_IMPORTED_MODULE_1__[\"SurveyModel\"].platform;\n templateElementRoot.style.display = \"none\";\n templateElementRoot.innerHTML = _templateText__WEBPACK_IMPORTED_MODULE_3__[\"koTemplate\"];\n document.body.appendChild(templateElementRoot);\n }\n var elem;\n for (var i = 0; i < templateElementRoot.children.length; i++) {\n if (templateElementRoot.children[i].id === template) {\n elem = templateElementRoot.children[i];\n break;\n }\n }\n if (!elem) {\n elem = templateDocument.getElementById(template);\n }\n if (!elem) {\n return new ko.nativeTemplateEngine().makeTemplateSource(template, templateDocument);\n }\n return new ko.templateSources.domElement(elem);\n }\n else if (template.nodeType === 1 || template.nodeType === 8) {\n return new ko.templateSources.anonymousTemplate(template);\n }\n else {\n throw new Error(\"Unknown template type: \" + template);\n }\n };\n // (ko).surveyTemplateEngine.prototype.renderTemplateSource = function (templateSource: any, bindingContext: any, options: any, templateDocument: any) {\n // var useNodesIfAvailable = !((ko.utils).ieVersion < 9),\n // templateNodesFunc = useNodesIfAvailable ? templateSource[\"nodes\"] : null,\n // templateNodes = templateNodesFunc ? templateSource[\"nodes\"]() : null;\n // if (templateNodes) {\n // return (ko.utils).makeArray(templateNodes.cloneNode(true).childNodes);\n // } else {\n // var templateText = templateSource[\"text\"]();\n // return (ko.utils).parseHtmlFragment(templateText, templateDocument);\n // }\n // };\n var surveyTemplateEngineInstance = new ko.surveyTemplateEngine();\n ko.setTemplateEngine(surveyTemplateEngineInstance);\n};\n\n\n/***/ }),\n\n/***/ \"./src/knockout/templateText.ts\":\n/*!**************************************!*\\\n !*** ./src/knockout/templateText.ts ***!\n \\**************************************/\n/*! exports provided: koTemplate, SurveyTemplateText */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"koTemplate\", function() { return koTemplate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyTemplateText\", function() { return SurveyTemplateText; });\nvar koTemplate = __webpack_require__(/*! html-loader?interpolate!val-loader!./templates/entry.html */ \"./node_modules/html-loader/index.js?interpolate!./node_modules/val-loader/index.js!./src/knockout/templates/entry.html\");\nvar SurveyTemplateText = /** @class */ (function () {\n function SurveyTemplateText() {\n }\n SurveyTemplateText.prototype.addText = function (newText, id, name) {\n id = this.getId(id, name);\n this.text =\n this.text +\n '\";\n };\n SurveyTemplateText.prototype.replaceText = function (replaceText, id, questionType) {\n if (questionType === void 0) { questionType = null; }\n var posId = this.getId(id, questionType);\n var pos = this.text.indexOf(posId);\n if (pos < 0) {\n this.addText(replaceText, id, questionType);\n return;\n }\n pos = this.text.indexOf(\">\", pos);\n if (pos < 0)\n return;\n var startPos = pos + 1;\n var endString = \"\";\n pos = this.text.indexOf(endString, startPos);\n if (pos < 0)\n return;\n this.text =\n this.text.substr(0, startPos) + replaceText + this.text.substr(pos);\n };\n SurveyTemplateText.prototype.getId = function (id, questionType) {\n var result = 'id=\"survey-' + id;\n if (questionType) {\n result += \"-\" + questionType;\n }\n return result + '\"';\n };\n Object.defineProperty(SurveyTemplateText.prototype, \"text\", {\n get: function () {\n return koTemplate;\n },\n set: function (value) {\n koTemplate = value;\n },\n enumerable: false,\n configurable: true\n });\n return SurveyTemplateText;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/comment.html\":\n/*!*********************************************!*\\\n !*** ./src/knockout/templates/comment.html ***!\n \\*********************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/flowpanel.html\":\n/*!***********************************************!*\\\n !*** ./src/knockout/templates/flowpanel.html ***!\n \\***********************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/header.html\":\n/*!********************************************!*\\\n !*** ./src/knockout/templates/header.html ***!\n \\********************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/index.html\":\n/*!*******************************************!*\\\n !*** ./src/knockout/templates/index.html ***!\n \\*******************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/page.html\":\n/*!******************************************!*\\\n !*** ./src/knockout/templates/page.html ***!\n \\******************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/panel.html\":\n/*!*******************************************!*\\\n !*** ./src/knockout/templates/panel.html ***!\n \\*******************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-boolean.html\":\n/*!******************************************************!*\\\n !*** ./src/knockout/templates/question-boolean.html ***!\n \\******************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-buttongroup.html\":\n/*!**********************************************************!*\\\n !*** ./src/knockout/templates/question-buttongroup.html ***!\n \\**********************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-checkbox.html\":\n/*!*******************************************************!*\\\n !*** ./src/knockout/templates/question-checkbox.html ***!\n \\*******************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-comment.html\":\n/*!******************************************************!*\\\n !*** ./src/knockout/templates/question-comment.html ***!\n \\******************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-composite.html\":\n/*!********************************************************!*\\\n !*** ./src/knockout/templates/question-composite.html ***!\n \\********************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-custom.html\":\n/*!*****************************************************!*\\\n !*** ./src/knockout/templates/question-custom.html ***!\n \\*****************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-dropdown.html\":\n/*!*******************************************************!*\\\n !*** ./src/knockout/templates/question-dropdown.html ***!\n \\*******************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-empty.html\":\n/*!****************************************************!*\\\n !*** ./src/knockout/templates/question-empty.html ***!\n \\****************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-errors.html\":\n/*!*****************************************************!*\\\n !*** ./src/knockout/templates/question-errors.html ***!\n \\*****************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-expression.html\":\n/*!*********************************************************!*\\\n !*** ./src/knockout/templates/question-expression.html ***!\n \\*********************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-file.html\":\n/*!***************************************************!*\\\n !*** ./src/knockout/templates/question-file.html ***!\n \\***************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-html.html\":\n/*!***************************************************!*\\\n !*** ./src/knockout/templates/question-html.html ***!\n \\***************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-image.html\":\n/*!****************************************************!*\\\n !*** ./src/knockout/templates/question-image.html ***!\n \\****************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-imagepicker.html\":\n/*!**********************************************************!*\\\n !*** ./src/knockout/templates/question-imagepicker.html ***!\n \\**********************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-matrix.html\":\n/*!*****************************************************!*\\\n !*** ./src/knockout/templates/question-matrix.html ***!\n \\*****************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-matrixdynamic.html\":\n/*!************************************************************!*\\\n !*** ./src/knockout/templates/question-matrixdynamic.html ***!\n \\************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-multipletext.html\":\n/*!***********************************************************!*\\\n !*** ./src/knockout/templates/question-multipletext.html ***!\n \\***********************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-paneldynamic-navigator.html\":\n/*!*********************************************************************!*\\\n !*** ./src/knockout/templates/question-paneldynamic-navigator.html ***!\n \\*********************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-paneldynamic.html\":\n/*!***********************************************************!*\\\n !*** ./src/knockout/templates/question-paneldynamic.html ***!\n \\***********************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-radiogroup.html\":\n/*!*********************************************************!*\\\n !*** ./src/knockout/templates/question-radiogroup.html ***!\n \\*********************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-ranking.html\":\n/*!******************************************************!*\\\n !*** ./src/knockout/templates/question-ranking.html ***!\n \\******************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-rating.html\":\n/*!*****************************************************!*\\\n !*** ./src/knockout/templates/question-rating.html ***!\n \\*****************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-signaturepad.html\":\n/*!***********************************************************!*\\\n !*** ./src/knockout/templates/question-signaturepad.html ***!\n \\***********************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question-text.html\":\n/*!***************************************************!*\\\n !*** ./src/knockout/templates/question-text.html ***!\n \\***************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/question.html\":\n/*!**********************************************!*\\\n !*** ./src/knockout/templates/question.html ***!\n \\**********************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/questiontitle.html\":\n/*!***************************************************!*\\\n !*** ./src/knockout/templates/questiontitle.html ***!\n \\***************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/row.html\":\n/*!*****************************************!*\\\n !*** ./src/knockout/templates/row.html ***!\n \\*****************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/rows.html\":\n/*!******************************************!*\\\n !*** ./src/knockout/templates/rows.html ***!\n \\******************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/string.html\":\n/*!********************************************!*\\\n !*** ./src/knockout/templates/string.html ***!\n \\********************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/knockout/templates/timerpanel.html\":\n/*!************************************************!*\\\n !*** ./src/knockout/templates/timerpanel.html ***!\n \\************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n\";\n\n/***/ }),\n\n/***/ \"./src/list.ts\":\n/*!*********************!*\\\n !*** ./src/list.ts ***!\n \\*********************/\n/*! exports provided: ListModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ListModel\", function() { return ListModel; });\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __spreadArray = (undefined && undefined.__spreadArray) || function (to, from) {\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n to[j] = from[i];\n return to;\n};\n\n\nvar ListModel = /** @class */ (function (_super) {\n __extends(ListModel, _super);\n function ListModel(items, onItemSelect, allowSelection, selectedItem) {\n var _this = _super.call(this) || this;\n _this.onItemSelect = onItemSelect;\n _this.allowSelection = allowSelection;\n _this.selectItem = function (itemValue) {\n _this.isExpanded = false;\n if (_this.allowSelection) {\n _this.selectedItem = itemValue;\n }\n if (!!_this.onItemSelect) {\n _this.onItemSelect(itemValue);\n }\n };\n _this.isItemDisabled = function (itemValue) {\n return itemValue.enabled !== undefined && !itemValue.enabled;\n };\n _this.isItemSelected = function (itemValue) {\n return _this.allowSelection && _this.selectedItem == itemValue;\n };\n _this.getItemClass = function (itemValue) {\n var className = \"sv-list__item\";\n if (_this.isItemDisabled(itemValue)) {\n className += \" sv-list__item--disabled\";\n }\n if (_this.isItemSelected(itemValue)) {\n className += \" sv-list__item--selected\";\n }\n return className;\n };\n _this.getItemIndent = function (itemValue) {\n var level = itemValue.level || 0;\n return (level + 1) * ListModel.INDENT + \"px\";\n };\n _this.createNewArray(\"items\");\n _this.items = items;\n _this.selectedItem = selectedItem;\n return _this;\n }\n Object.defineProperty(ListModel.prototype, \"items\", {\n get: function () {\n return this.getPropertyValue(\"items\");\n },\n set: function (value) {\n var _a;\n (_a = this.items).splice.apply(_a, __spreadArray([0, this.items.length], (value || [])));\n },\n enumerable: false,\n configurable: true\n });\n ListModel.INDENT = 16;\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: false })\n ], ListModel.prototype, \"isExpanded\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], ListModel.prototype, \"selectedItem\", void 0);\n return ListModel;\n}(_base__WEBPACK_IMPORTED_MODULE_0__[\"Base\"]));\n\n\n\n/***/ }),\n\n/***/ \"./src/localizablestring.ts\":\n/*!**********************************!*\\\n !*** ./src/localizablestring.ts ***!\n \\**********************************/\n/*! exports provided: LocalizableString, LocalizableStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LocalizableString\", function() { return LocalizableString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"LocalizableStrings\", function() { return LocalizableStrings; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\n\n\n\n/**\n * The class represents the string that supports multi-languages and markdown.\n * It uses in all objects where support for multi-languages and markdown is required.\n */\nvar LocalizableString = /** @class */ (function () {\n function LocalizableString(owner, useMarkdown, name) {\n if (useMarkdown === void 0) { useMarkdown = false; }\n this.owner = owner;\n this.useMarkdown = useMarkdown;\n this.name = name;\n this.values = {};\n this.htmlValues = {};\n this.onCreating();\n }\n Object.defineProperty(LocalizableString, \"defaultLocale\", {\n get: function () {\n return _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName;\n },\n set: function (val) {\n _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(LocalizableString.prototype, \"locale\", {\n get: function () {\n return this.owner && this.owner.getLocale ? this.owner.getLocale() : \"\";\n },\n enumerable: false,\n configurable: true\n });\n LocalizableString.prototype.strChanged = function () {\n this.searchableText = undefined;\n if (this.renderedText === undefined)\n return;\n this.calculatedTextValue = this.calText();\n if (this.renderedText !== this.calculatedTextValue) {\n this.renderedText = undefined;\n this.calculatedTextValue = undefined;\n }\n this.onChanged();\n };\n Object.defineProperty(LocalizableString.prototype, \"text\", {\n get: function () {\n return this.pureText;\n },\n set: function (value) {\n this.setLocaleText(this.locale, value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(LocalizableString.prototype, \"calculatedText\", {\n get: function () {\n this.renderedText =\n this.calculatedTextValue !== undefined\n ? this.calculatedTextValue\n : this.calText();\n this.calculatedTextValue = undefined;\n return this.renderedText;\n },\n enumerable: false,\n configurable: true\n });\n LocalizableString.prototype.calText = function () {\n var res = this.pureText;\n if (res &&\n this.owner &&\n this.owner.getProcessedText &&\n res.indexOf(\"{\") > -1) {\n res = this.owner.getProcessedText(res);\n }\n if (this.onGetTextCallback)\n res = this.onGetTextCallback(res);\n return res;\n };\n Object.defineProperty(LocalizableString.prototype, \"pureText\", {\n get: function () {\n var loc = this.locale;\n if (!loc)\n loc = _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName;\n var res = this.getValue(loc);\n if (!res && loc == _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName) {\n res = this.getValue(_surveyStrings__WEBPACK_IMPORTED_MODULE_1__[\"surveyLocalization\"].defaultLocale);\n }\n if (!res && loc !== _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName) {\n res = this.getValue(_settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName);\n }\n if (!res)\n res = \"\";\n return res;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(LocalizableString.prototype, \"hasHtml\", {\n get: function () {\n return this.hasHtmlValue();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(LocalizableString.prototype, \"html\", {\n get: function () {\n if (!this.hasHtml)\n return \"\";\n return this.getHtmlValue();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(LocalizableString.prototype, \"isEmpty\", {\n get: function () {\n return this.getValuesKeys().length == 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(LocalizableString.prototype, \"textOrHtml\", {\n get: function () {\n return this.hasHtml ? this.getHtmlValue() : this.calculatedText;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(LocalizableString.prototype, \"renderedHtml\", {\n get: function () {\n return this.textOrHtml;\n },\n enumerable: false,\n configurable: true\n });\n LocalizableString.prototype.getLocaleText = function (loc) {\n if (!loc)\n loc = _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName;\n var res = this.getValue(loc);\n return res ? res : \"\";\n };\n LocalizableString.prototype.setLocaleText = function (loc, value) {\n if (value == this.getLocaleText(loc))\n return;\n if (value &&\n loc &&\n loc != _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName &&\n !this.getValue(loc) &&\n value == this.getLocaleText(_settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName))\n return;\n var curLoc = this.locale;\n if (!loc)\n loc = _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName;\n if (!curLoc)\n curLoc = _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName;\n var hasOnStrChanged = this.onStrChanged && loc === curLoc;\n var oldValue = hasOnStrChanged ? this.pureText : undefined;\n delete this.htmlValues[loc];\n if (!value) {\n if (this.getValue(loc))\n this.deleteValue(loc);\n }\n else {\n if (typeof value === \"string\") {\n if (loc != _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName &&\n value == this.getLocaleText(_settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName)) {\n this.setLocaleText(loc, null);\n }\n else {\n this.setValue(loc, value);\n if (loc == _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName) {\n this.deleteValuesEqualsToDefault(value);\n }\n }\n }\n }\n this.strChanged();\n if (hasOnStrChanged) {\n this.onStrChanged(oldValue, value);\n }\n };\n LocalizableString.prototype.hasNonDefaultText = function () {\n var keys = this.getValuesKeys();\n if (keys.length == 0)\n return false;\n return keys.length > 1 || keys[0] != _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName;\n };\n LocalizableString.prototype.getLocales = function () {\n var keys = this.getValuesKeys();\n if (keys.length == 0)\n return [];\n return keys;\n };\n LocalizableString.prototype.getJson = function () {\n if (!!this.sharedData)\n return this.sharedData.getJson();\n var keys = this.getValuesKeys();\n if (keys.length == 0)\n return null;\n if (keys.length == 1 &&\n keys[0] == _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName &&\n !_settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].serializeLocalizableStringAsObject)\n return this.values[keys[0]];\n return this.values;\n };\n LocalizableString.prototype.setJson = function (value) {\n if (!!this.sharedData) {\n this.sharedData.setJson(value);\n return;\n }\n this.values = {};\n this.htmlValues = {};\n if (!value)\n return;\n if (typeof value === \"string\") {\n this.setLocaleText(null, value);\n }\n else {\n for (var key in value) {\n this.setLocaleText(key, value[key]);\n }\n }\n this.strChanged();\n };\n Object.defineProperty(LocalizableString.prototype, \"renderAs\", {\n get: function () {\n if (!this.owner) {\n return LocalizableString.defaultRenderer;\n }\n if (typeof this.owner.getRenderer !== \"function\") {\n return LocalizableString.defaultRenderer;\n }\n return (this.owner.getRenderer(this.name) || LocalizableString.defaultRenderer);\n },\n enumerable: false,\n configurable: true\n });\n LocalizableString.prototype.equals = function (obj) {\n if (!!this.sharedData)\n return this.sharedData.equals(obj);\n if (!obj || !obj.values)\n return false;\n return _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isTwoValueEquals(this.values, obj.values);\n };\n LocalizableString.prototype.setFindText = function (text) {\n if (this.searchText == text)\n return;\n this.searchText = text;\n if (!this.searchableText) {\n var textOrHtml = this.textOrHtml;\n this.searchableText = !!textOrHtml ? textOrHtml.toLowerCase() : \"\";\n }\n var str = this.searchableText;\n var index = !!str && !!text ? str.indexOf(text) : undefined;\n if (index < 0)\n index = undefined;\n if (index != undefined || this.searchIndex != index) {\n this.searchIndex = index;\n if (!!this.onSearchChanged) {\n this.onSearchChanged();\n }\n }\n return this.searchIndex != undefined;\n };\n LocalizableString.prototype.onChanged = function () { };\n LocalizableString.prototype.onCreating = function () { };\n LocalizableString.prototype.hasHtmlValue = function () {\n if (!this.owner || !this.useMarkdown)\n return false;\n var renderedText = this.calculatedText;\n if (!renderedText)\n return false;\n var loc = this.locale;\n if (!loc)\n loc = _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName;\n this.htmlValues[loc] = this.owner.getMarkdownHtml(renderedText, this.name);\n return this.htmlValues[loc] ? true : false;\n };\n LocalizableString.prototype.getHtmlValue = function () {\n var loc = this.locale;\n if (!loc)\n loc = _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName;\n return this.htmlValues[loc];\n };\n LocalizableString.prototype.deleteValuesEqualsToDefault = function (defaultValue) {\n var keys = this.getValuesKeys();\n for (var i = 0; i < keys.length; i++) {\n if (keys[i] == _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName)\n continue;\n if (this.getValue(keys[i]) == defaultValue) {\n this.deleteValue(keys[i]);\n }\n }\n };\n LocalizableString.prototype.getValue = function (loc) {\n if (!!this.sharedData)\n return this.sharedData.getValue(loc);\n return this.values[loc];\n };\n LocalizableString.prototype.setValue = function (loc, value) {\n if (!!this.sharedData)\n this.sharedData.setValue(loc, value);\n else\n this.values[loc] = value;\n };\n LocalizableString.prototype.deleteValue = function (loc) {\n if (!!this.sharedData)\n this.sharedData.deleteValue(loc);\n else\n delete this.values[loc];\n };\n LocalizableString.prototype.getValuesKeys = function () {\n if (!!this.sharedData)\n return this.sharedData.getValuesKeys();\n return Object.keys(this.values);\n };\n LocalizableString.SerializeAsObject = false;\n LocalizableString.defaultRenderer = \"sv-string-viewer\";\n LocalizableString.editableRenderer = \"sv-string-editor\";\n return LocalizableString;\n}());\n\n/**\n * The class represents the list of strings that supports multi-languages.\n */\nvar LocalizableStrings = /** @class */ (function () {\n function LocalizableStrings(owner) {\n this.owner = owner;\n this.values = {};\n }\n Object.defineProperty(LocalizableStrings.prototype, \"locale\", {\n get: function () {\n return this.owner && this.owner.getLocale ? this.owner.getLocale() : \"\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(LocalizableStrings.prototype, \"value\", {\n get: function () {\n return this.getValue(\"\");\n },\n set: function (val) {\n this.setValue(\"\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(LocalizableStrings.prototype, \"text\", {\n get: function () {\n return Array.isArray(this.value) ? this.value.join(\"\\n\") : \"\";\n },\n set: function (val) {\n this.value = !!val ? val.split(\"\\n\") : [];\n },\n enumerable: false,\n configurable: true\n });\n LocalizableStrings.prototype.getLocaleText = function (loc) {\n var res = this.getValueCore(loc, !loc || loc === this.locale);\n if (!res || !Array.isArray(res) || res.length == 0)\n return \"\";\n return res.join(\"\\n\");\n };\n LocalizableStrings.prototype.setLocaleText = function (loc, newValue) {\n var val = !!newValue ? newValue.split(\"\\n\") : null;\n this.setValue(loc, val);\n };\n LocalizableStrings.prototype.getValue = function (loc) {\n return this.getValueCore(loc);\n };\n LocalizableStrings.prototype.getValueCore = function (loc, useDefault) {\n if (useDefault === void 0) { useDefault = true; }\n loc = this.getLocale(loc);\n if (this.values[loc])\n return this.values[loc];\n if (useDefault) {\n var defLoc = _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName;\n if (loc !== defLoc)\n return this.values[defLoc];\n }\n return [];\n };\n LocalizableStrings.prototype.setValue = function (loc, val) {\n loc = this.getLocale(loc);\n if (!val || val.length == 0) {\n delete this.values[loc];\n }\n else {\n this.values[loc] = val;\n }\n };\n Object.defineProperty(LocalizableStrings.prototype, \"isEmpty\", {\n get: function () {\n return this.getValuesKeys().length == 0;\n },\n enumerable: false,\n configurable: true\n });\n LocalizableStrings.prototype.getLocale = function (loc) {\n if (!!loc)\n return loc;\n loc = this.locale;\n return !!loc ? loc : _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName;\n };\n LocalizableStrings.prototype.getLocales = function () {\n var keys = this.getValuesKeys();\n if (keys.length == 0)\n return [];\n return keys;\n };\n LocalizableStrings.prototype.getJson = function () {\n var keys = this.getValuesKeys();\n if (keys.length == 0)\n return null;\n if (keys.length == 1 &&\n keys[0] == _settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].defaultLocaleName &&\n !_settings__WEBPACK_IMPORTED_MODULE_2__[\"settings\"].serializeLocalizableStringAsObject)\n return this.values[keys[0]];\n return this.values;\n };\n LocalizableStrings.prototype.setJson = function (value) {\n this.values = {};\n if (!value)\n return;\n if (Array.isArray(value)) {\n this.setValue(null, value);\n }\n else {\n for (var key in value) {\n this.setValue(key, value[key]);\n }\n }\n };\n LocalizableStrings.prototype.getValuesKeys = function () {\n return Object.keys(this.values);\n };\n return LocalizableStrings;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/localization/arabic.ts\":\n/*!************************************!*\\\n !*** ./src/localization/arabic.ts ***!\n \\************************************/\n/*! exports provided: arabicSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"arabicSurveyStrings\", function() { return arabicSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar arabicSurveyStrings = {\n pagePrevText: \"السابق\",\n pageNextText: \"التالي\",\n completeText: \"إرسال البيانات\",\n previewText: \"معاينة\",\n editText: \"تعديل\",\n startSurveyText: \"بداية\",\n otherItemText: \"نص آخر\",\n noneItemText: \"لا شيء\",\n selectAllItemText: \"اختر الكل\",\n progressText: \"{1} صفحة {0} من\",\n panelDynamicProgressText: \"سجل {0} من {1}\",\n questionsProgressText: \"تمت الإجابة على أسئلة {0} / {1}\",\n emptySurvey: \"لا توجد صفحة مرئية أو سؤال في النموذج\",\n completingSurvey: \"شكرا لكم لاستكمال النموذج!\",\n completingSurveyBefore: \"تظهر سجلاتنا أنك قد أكملت هذا الاستطلاع بالفعل.\",\n loadingSurvey: \"...يتم تحميل النموذج\",\n optionsCaption: \"...اختر\",\n value: \"القيمة\",\n requiredError: \".يرجى الإجابة على السؤال\",\n requiredErrorInPanel: \"الرجاء الإجابة على سؤال واحد على الأقل.\",\n requiredInAllRowsError: \"يرجى الإجابة على الأسئلة في جميع الصفوف\",\n numericError: \"يجب أن تكون القيمة رقمية.\",\n textMinLength: \"الرجاء إدخال ما لا يقل عن {0} حروف\",\n textMaxLength: \"الرجاء إدخال أقل من {0} حروف\",\n textMinMaxLength: \"يرجى إدخال أكثر من {0} وأقل من {1} حروف\",\n minRowCountError: \"يرجى ملء ما لا يقل عن {0} الصفوف\",\n minSelectError: \"يرجى تحديد ما لا يقل عن {0} المتغيرات\",\n maxSelectError: \"يرجى تحديد ما لا يزيد عن {0} المتغيرات\",\n numericMinMax: \"و'{0}' يجب أن تكون مساوية أو أكثر من {1} وتساوي أو أقل من {2}ا\",\n numericMin: \"و'{0}' يجب أن تكون مساوية أو أكثر من {1}ا\",\n numericMax: \"و'{0}' يجب أن تكون مساوية أو أقل من {1}ا\",\n invalidEmail: \"الرجاء إدخال بريد الكتروني صحيح\",\n invalidExpression: \"يجب أن يعرض التعبير: {0} 'صواب'.\",\n urlRequestError: \"طلب إرجاع خطأ '{0}'. {1}ا\",\n urlGetChoicesError: \"عاد طلب البيانات فارغ أو 'المسار' غير صحيح \",\n exceedMaxSize: \"ينبغي ألا يتجاوز حجم الملف {0}ا\",\n otherRequiredError: \"الرجاء إدخال قيمة أخرى\",\n uploadingFile: \"تحميل الملف الخاص بك. يرجى الانتظار عدة ثوان والمحاولة لاحقًا\",\n loadingFile: \"جار التحميل...\",\n chooseFile: \"اختر الملفات...\",\n noFileChosen: \"لم تقم باختيار ملف\",\n confirmDelete: \"هل تريد حذف السجل؟\",\n keyDuplicationError: \"يجب أن تكون هذه القيمة فريدة.\",\n addColumn: \"أضف العمود\",\n addRow: \"اضافة صف\",\n removeRow: \"إزالة صف\",\n addPanel: \"اضف جديد\",\n removePanel: \"إزالة\",\n choices_Item: \"بند\",\n matrix_column: \"عمود\",\n matrix_row: \"صف\",\n savingData: \"يتم حفظ النتائج على الخادم ...\",\n savingDataError: \"حدث خطأ ولم نتمكن من حفظ النتائج.\",\n savingDataSuccess: \"تم حفظ النتائج بنجاح!\",\n saveAgainButton: \"حاول مجددا\",\n timerMin: \"دقيقة\",\n timerSec: \"ثانية\",\n timerSpentAll: \"لقد أنفقت {0} على هذه الصفحة و {1} إجمالاً.\",\n timerSpentPage: \"لقد أنفقت {0} على هذه الصفحة.\",\n timerSpentSurvey: \"لقد أنفقت {0} إجمالاً.\",\n timerLimitAll: \"لقد أنفقت {0} من {1} في هذه الصفحة و {2} من إجمالي {3}.\",\n timerLimitPage: \"لقد أنفقت {0} من {1} في هذه الصفحة.\",\n timerLimitSurvey: \"لقد أنفقت {0} من إجمالي {1}.\",\n cleanCaption: \"نظيف\",\n clearCaption: \"واضح\",\n chooseFileCaption: \"اختر ملف\",\n removeFileCaption: \"قم بإزالة هذا الملف\",\n booleanCheckedLabel: \"نعم\",\n booleanUncheckedLabel: \"لا\",\n confirmRemoveFile: \"هل أنت متأكد أنك تريد إزالة هذا الملف: {0}؟\",\n confirmRemoveAllFiles: \"هل أنت متأكد أنك تريد إزالة كافة الملفات؟\",\n questionTitlePatternText: \"عنوان السؤال\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"ar\"] = arabicSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"ar\"] = \"العربية\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/basque.ts\":\n/*!************************************!*\\\n !*** ./src/localization/basque.ts ***!\n \\************************************/\n/*! exports provided: basqueSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"basqueSurveyStrings\", function() { return basqueSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar basqueSurveyStrings = {\n pagePrevText: \"Aurrekoa\",\n pageNextText: \"Hurrengoa\",\n completeText: \"Bukatu\",\n previewText: \"Aurrebista\",\n editText: \"Editatu\",\n startSurveyText: \"Hasi\",\n otherItemText: \"Beste bat (zehaztu)\",\n noneItemText: \"Bat ere ez\",\n selectAllItemText: \"Guztia hautatu\",\n progressText: \"{1}-(e)tik {0} orrialde\",\n panelDynamicProgressText: \"{0} errigistro {1}-(e)tik\",\n questionsProgressText: \"Erantzundako galderak {0}/{1}\",\n emptySurvey: \"Ez dago orrialde bistaragarririk edo ez dago galderarik.\",\n completingSurvey: \"Eskerrik asko galdetegia erantzuteagatik!\",\n completingSurveyBefore: \"Gure datuek diote dagoeneko galdetegia erantzun duzula.\",\n loadingSurvey: \"Galdetegia kargatzen...\",\n optionsCaption: \"Hautatu...\",\n value: \"balioa\",\n requiredError: \"Mesedez, galdera erantzun.\",\n requiredErrorInPanel: \"Mesedez, gutxienez galdera bat erantzun.\",\n requiredInAllRowsError: \"Mesedez, errenkadako galdera guztiak erantzun.\",\n numericError: \"Estimazioa zenbakizkoa izan behar du.\",\n minError: \"Balioa ez da {0} baino txikiagoa izan behar\",\n maxError: \"Balioa ez da {0} baino handiagoa izan behar\",\n textMinLength: \"Mesedez, gutxienez {0} karaktere erabili behar dira.\",\n textMaxLength: \"Mesedez, gehienez {0} karaktere erabili behar dira.\",\n textMinMaxLength: \"Mesedez, gehienez {0} eta gutxienez {1} karaktere erabili behar dira.\",\n minRowCountError: \"Mesedez, gutxienez {0} errenkada bete.\",\n minSelectError: \"Mesedez, gutxienez {0} aukera hautatu.\",\n maxSelectError: \"Mesedez, {0} aukera baino gehiago ez hautatu.\",\n numericMinMax: \"El '{0}' debe de ser igual o más de {1} y igual o menos de {2}\",\n numericMin: \"'{0}' {1} baino handiagoa edo berdin izan behar da\",\n numericMax: \"'{0}' {1} baino txikiago edo berdin izan behar da\",\n invalidEmail: \"Mesedez, baliozko emaila idatz ezazu.\",\n invalidExpression: \"{0} adierazpenak 'egiazkoa' itzuli beharko luke.\",\n urlRequestError: \"Eskaerak '{0}' errorea itzuli du. {1}\",\n urlGetChoicesError: \"La solicitud regresó vacío de data o la propiedad 'trayectoria' no es correcta\",\n exceedMaxSize: \"Fitxategiaren tamaina ez da {0} baino handiagoa izan behar.\",\n otherRequiredError: \"Mesedez, beste estimazioa gehitu.\",\n uploadingFile: \"Zure fitxategia igotzen ari da. Mesedez, segundo batzuk itxaron eta saiatu berriro.\",\n loadingFile: \"Kargatzen...\",\n chooseFile: \"Fitxategia(k) hautatu...\",\n noFileChosen: \"Ez da inolako fitxategirik hautatu\",\n confirmDelete: \"¿Erregistroa borratu nahi al duzu?\",\n keyDuplicationError: \"Balio hau bakarra izan behar du.\",\n addColumn: \"Zutabe bat gehitu\",\n addRow: \"Errenkada bat gehitu\",\n removeRow: \"Errenkada bat kendu\",\n emptyRowsText: \"Ez dago errenkadarik.\",\n addPanel: \"Berria gehitu\",\n removePanel: \"Kendu\",\n choices_Item: \"artikulua\",\n matrix_column: \"Zutabea\",\n matrix_row: \"Errenkada\",\n multipletext_itemname: \"testua\",\n savingData: \"Erantzunak zerbitzarian gordetzen ari dira...\",\n savingDataError: \"Erroreren bat gertatu eta erantzunak ez dira zerbitzarian gorde ahal izan.\",\n savingDataSuccess: \"Erantzunak egoki gorde dira!\",\n saveAgainButton: \"Berriro saiatu.\",\n timerMin: \"min\",\n timerSec: \"seg\",\n timerSpentAll: \"{0} erabili duzu orrialde honetan eta orotara {1}.\",\n timerSpentPage: \"Zuk {0} erabili duzu.\",\n timerSpentSurvey: \"Orotara gastatu duzu.\",\n timerLimitAll: \"{0} gastatu duzu {1}-(e)tik orrialde honetan eta orotara {2} {3}-(e)tik.\",\n timerLimitPage: \"{0} gastatu duzu orrialde honetan {1}-(e)tik.\",\n timerLimitSurvey: \"Zuk orotara {0} gastatu duzu {1}-(e)tik.\",\n cleanCaption: \"Garbitu\",\n clearCaption: \"Hustu\",\n signaturePlaceHolder: \"Sinatu hemen\",\n chooseFileCaption: \"Fitxategia hautatu\",\n removeFileCaption: \"Fitxategi hau ezabatu\",\n booleanCheckedLabel: \"Bai\",\n booleanUncheckedLabel: \"Ez\",\n confirmRemoveFile: \"Ziur zaude hurrengo fitxategia ezabatu nahi duzula: {0}?\",\n confirmRemoveAllFiles: \"Ziur al zaude fitxategi guztiak ezabatu nahi dituzula?\",\n questionTitlePatternText: \"Galderaren izenburua\",\n modalCancelButtonText: \"Ezeztatu\",\n modalApplyButtonText: \"Ezarri\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"eu\"] = basqueSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"eu\"] = \"Euskara\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/bulgarian.ts\":\n/*!***************************************!*\\\n !*** ./src/localization/bulgarian.ts ***!\n \\***************************************/\n/*! exports provided: bulgarianStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bulgarianStrings\", function() { return bulgarianStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar bulgarianStrings = {\n pagePrevText: \"Назад\",\n pageNextText: \"Напред\",\n completeText: \"Край\",\n previewText: \"Визуализация\",\n editText: \"редактиране\",\n startSurveyText: \"Начало\",\n otherItemText: \"Друго (опишете)\",\n noneItemText: \"Нито един\",\n selectAllItemText: \"Всички\",\n progressText: \"стр. {0}, общо стр. {1}\",\n panelDynamicProgressText: \"Запис {0} от {1}\",\n questionsProgressText: \"Отговорени на {0} / {1} въпроса\",\n emptySurvey: \"Анкетата не съдържа видими страници или въпроси.\",\n completingSurvey: \"Благодарим ви за участието в анкетата!\",\n completingSurveyBefore: \"Изглежда, че вие вече сте попълнили анкетата.\",\n loadingSurvey: \"Зареждане на анкетата...\",\n optionsCaption: \"Изберете...\",\n value: \"value\",\n requiredError: \"Моля, отговорете на следния въпрос.\",\n requiredErrorInPanel: \"Моля, отговорете поне на един от въпросите.\",\n requiredInAllRowsError: \"Моля, отговорете на въпросите на всички редове.\",\n numericError: \"Стойността следва да бъде число.\",\n textMinLength: \"Моля, използвайте поне {0} символа.\",\n textMaxLength: \"Моля, използвайте не повече от {0} символа.\",\n textMinMaxLength: \"Моля, използвайте повече от {0} и по-малко от {1} символа.\",\n minRowCountError: \"Моля, попълнете поне {0} реда.\",\n minSelectError: \"Моля, изберете поне {0} варианта.\",\n maxSelectError: \"Моля, изберете не повече от {0} варианта.\",\n numericMinMax: \"Стойността '{0}' следва да бъде равна или по-голяма от {1} и равна или по-малка от {2}\",\n numericMin: \"Стойността '{0}' следва да бъде равна или по-голяма от {1}\",\n numericMax: \"Стойността '{0}' следва да бъде равна или по-малка от {1}\",\n invalidEmail: \"Моля, въведете валиден адрес на електронна поща.\",\n invalidExpression: \"Изразът: {0} трябва да дава резултат 'true' (истина).\",\n urlRequestError: \"Заявката води до грешка '{0}'. {1}\",\n urlGetChoicesError: \"Заявката не връща данни или частта 'path' (път до търсения ресурс на сървъра) е неправилно зададена\",\n exceedMaxSize: \"Размерът на файла следва да не превишава {0}.\",\n otherRequiredError: \"Моля, въведете другата стойност.\",\n uploadingFile: \"Вашит файл се зарежда на сървъра. Моля, изчакайте няколко секунди и тогава опитвайте отново.\",\n loadingFile: \"Зареждане...\",\n chooseFile: \"Изберете файл(ове)...\",\n noFileChosen: \"Няма избран файл\",\n confirmDelete: \"Желаете ли да изтриете записа?\",\n keyDuplicationError: \"Стойността следва да бъде уникална.\",\n addColumn: \"Добавяне на колона\",\n addRow: \"Добавяне на ред\",\n removeRow: \"Премахване на ред\",\n addPanel: \"Добавяне на панел\",\n removePanel: \"Премахване на панел\",\n choices_Item: \"елемент\",\n matrix_column: \"Колона\",\n matrix_row: \"Ред\",\n savingData: \"Резултатите се запазват на сървъра...\",\n savingDataError: \"Поради възникнала грешка резултатите не можаха да бъдат запазени.\",\n savingDataSuccess: \"Резултатите бяха запазени успешно!\",\n saveAgainButton: \"Нов опит\",\n timerMin: \"мин\",\n timerSec: \"сек\",\n timerSpentAll: \"Вие използвахте {0} на тази страница и общо {1}.\",\n timerSpentPage: \"Вие използвахте {0} на тази страница.\",\n timerSpentSurvey: \"Вие използвахте общо {0}.\",\n timerLimitAll: \"Вие изпозвахте {0} от {1} на тази страница и общо {2} от {3}.\",\n timerLimitPage: \"Вие използвахте {0} от {1} на тази страница.\",\n timerLimitSurvey: \"Вие използвахте общо {0} от {1}.\",\n cleanCaption: \"Изчистване\",\n clearCaption: \"Начално състояние\",\n chooseFileCaption: \"Изберете файл\",\n removeFileCaption: \"Премахване на файла\",\n booleanCheckedLabel: \"Да\",\n booleanUncheckedLabel: \"Не\",\n confirmRemoveFile: \"Наистина ли искате да премахнете този файл: {0}?\",\n confirmRemoveAllFiles: \"Наистина ли искате да премахнете всички файлове?\",\n questionTitlePatternText: \"Заглавие на въпроса\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"bg\"] = bulgarianStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"bg\"] = \"български\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/catalan.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/catalan.ts ***!\n \\*************************************/\n/*! exports provided: catalanSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"catalanSurveyStrings\", function() { return catalanSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar catalanSurveyStrings = {\n pagePrevText: \"Anterior\",\n pageNextText: \"Següent\",\n completeText: \"Complet\",\n otherItemText: \"Un altre (descrigui)\",\n progressText: \"Pàgina {0} de {1}\",\n emptySurvey: \"No hi ha cap pàgina visible o pregunta a l'enquesta.\",\n completingSurvey: \"Gràcies per completar l'enquesta!\",\n loadingSurvey: \"L'enquesta s'està carregant ...\",\n optionsCaption: \"Selecciona ...\",\n requiredError: \"Si us plau contesti la pregunta.\",\n requiredInAllRowsError: \"Si us plau contesti les preguntes de cada filera.\",\n numericError: \"L'estimació ha de ser numèrica.\",\n textMinLength: \"Si us plau entre almenys {0} símbols.\",\n textMaxLength: \"Si us plau entre menys de {0} símbols.\",\n textMinMaxLength: \"Si us plau entre més de {0} i menys de {1} símbols.\",\n minRowCountError: \"Si us plau ompli almenys {0} fileres.\",\n minSelectError: \"Si us plau seleccioni almenys {0} variants.\",\n maxSelectError: \"Si us plau seleccioni no més de {0} variants.\",\n numericMinMax: \"El '{0}' deu ser igual o més de {1} i igual o menys de {2}\",\n numericMin: \"El '{0}' ha de ser igual o més de {1}\",\n numericMax: \"El '{0}' ha de ser igual o menys de {1}\",\n invalidEmail: \"Si us plau afegiu un correu electrònic vàlid.\",\n urlRequestError: \"La sol·licitud va tornar error '{0}'. {1}\",\n urlGetChoicesError: \"La sol·licitud va tornar buida de dates o la propietat 'trajectòria' no és correcta\",\n exceedMaxSize: \"La mida de l'arxiu no pot excedir {0}.\",\n otherRequiredError: \"Si us plau afegiu l'altra estimació.\",\n uploadingFile: \"El seu arxiu s'està pujant. Si us plau esperi uns segons i intenteu-ho de nou.\",\n addRow: \"Afegiu una filera\",\n removeRow: \"Eliminar una filera\",\n choices_firstItem: \"primer article\",\n choices_secondItem: \"segon article\",\n choices_thirdItem: \"tercer article\",\n matrix_column: \"Columna\",\n matrix_row: \"Filera\"\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"ca\"] = catalanSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"ca\"] = \"català\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/croatian.ts\":\n/*!**************************************!*\\\n !*** ./src/localization/croatian.ts ***!\n \\**************************************/\n/*! exports provided: croatianStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"croatianStrings\", function() { return croatianStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar croatianStrings = {\n pagePrevText: \"Prethodni\",\n pageNextText: \"Sljedeći\",\n completeText: \"Kompletan\",\n previewText: \"Pregled\",\n editText: \"Uređivanje\",\n startSurveyText: \"Početak\",\n otherItemText: \"Ostali (opis)\",\n noneItemText: \"Nitko\",\n selectAllItemText: \"Select All\",\n progressText: \"Stranica {0} od {1}\",\n panelDynamicProgressText: \"Zapisa {0} od {1}\",\n questionsProgressText: \"Odgovorio na {0}/{1} pitanja\",\n emptySurvey: \"U anketi nema vidljive stranice ili pitanja.\",\n completingSurvey: \"Hvala vam što ste završili anketu!\",\n completingSurveyBefore: \"Naši zapisi pokazuju da ste već završili ovu anketu.\",\n loadingSurvey: \"Anketa o učitavanje...\",\n optionsCaption: \"Odaberite...\",\n value: \"vrijednost\",\n requiredError: \"Molim vas odgovorite na pitanje.\",\n requiredErrorInPanel: \"Molim vas odgovorite na barem jedno pitanje.\",\n requiredInAllRowsError: \"Odgovorite na pitanja u svim redovima.\",\n numericError: \"Vrijednost bi trebala biti brojčana.\",\n textMinLength: \"Unesite najmanje {0} znak(ova).\",\n textMaxLength: \"Unesite manje od {0} znak(ova).\",\n textMinMaxLength: \"Unesite više od {0} i manje od {1} znakova.\",\n minRowCountError: \"Molimo ispunite najmanje {0} redaka.\",\n minSelectError: \"Odaberite barem {0} varijante.\",\n maxSelectError: \"Odaberite ne više od {0} varijanti.\",\n numericMinMax: \"'{0}'bi trebao biti jednak ili više od {1} i jednak ili manji od {2}.\",\n numericMin: \"'{0}' bi trebao biti jednak ili više od {1}.\",\n numericMax: \"'{0}' bi trebao biti jednak ili manji od {1}\",\n invalidEmail: \"Unesite valjanu e-mail adresu.\",\n invalidExpression: \"Izraz: {0} treba vratiti 'true'.\",\n urlRequestError: \"Zahtjev vratio pogrešku '{0}'. {1}\",\n urlGetChoicesError: \"Zahtjev je vratio prazne podatke ili je 'path' svojstvo netočna.\",\n exceedMaxSize: \"Veličina datoteke ne smije prelaziti {0}.\",\n otherRequiredError: \"Unesite drugu vrijednost.\",\n uploadingFile: \"Vaša datoteka se prenosi. Pričekajte nekoliko sekundi i pokušajte ponovno.\",\n loadingFile: \"Učitavanje...\",\n chooseFile: \"Odaberite datoteku...\",\n noFileChosen: \"Nije odabrana datoteka\",\n confirmDelete: \"Želite li izbrisati zapis?\",\n keyDuplicationError: \"Ta bi vrijednost trebala biti jedinstvena.\",\n addColumn: \"Dodavanje stupca\",\n addRow: \"Dodavanje redaka\",\n removeRow: \"Ukloniti\",\n addPanel: \"Dodavanje novih\",\n removePanel: \"Ukloniti\",\n choices_Item: \"stavku\",\n matrix_column: \"Stupca\",\n matrix_row: \"Redak\",\n savingData: \"Rezultati se spremaju na poslužitelju...\",\n savingDataError: \"Došlo je do pogreške i nismo mogli spremiti rezultate.\",\n savingDataSuccess: \"Rezultati su uspješno spremljeni!\",\n saveAgainButton: \"Pokušaj ponovo\",\n timerMin: \"min\",\n timerSec: \"sec\",\n timerSpentAll: \"Vi ste proveli {0} na ovoj stranici i {1} ukupno.\",\n timerSpentPage: \"Potrošili ste {0} na ovu stranicu.\",\n timerSpentSurvey: \"You have spent {0} in total. {0}.\",\n timerLimitAll: \"Vi ste proveli {0} od {1} na ovoj stranici i {2} od {3} ukupno.\",\n timerLimitPage: \"Potrošio si {0} od {1} na ovoj stranici.\",\n timerLimitSurvey: \"Ukupno ste potrošili {0} od {1}.\",\n cleanCaption: \"Očistiti\",\n clearCaption: \"Očistiti\",\n chooseFileCaption: \"Odaberite datoteku\",\n removeFileCaption: \"Uklonite ovu datoteku\",\n booleanCheckedLabel: \"Da\",\n booleanUncheckedLabel: \"Ne\",\n confirmRemoveFile: \"Jeste li sigurni da želite ukloniti ovu datoteku: {0}?\",\n confirmRemoveAllFiles: \"Jeste li sigurni da želite ukloniti sve datoteke?\",\n questionTitlePatternText: \"Naslov pitanja\",\n modalCancelButtonText: \"Otkazati\",\n modalApplyButtonText: \"Primijeniti\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"hr\"] = croatianStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"hr\"] = \"hrvatski\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/czech.ts\":\n/*!***********************************!*\\\n !*** ./src/localization/czech.ts ***!\n \\***********************************/\n/*! exports provided: czechSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"czechSurveyStrings\", function() { return czechSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar czechSurveyStrings = {\n pagePrevText: \"Předchozí\",\n pageNextText: \"Další\",\n completeText: \"Hotovo\",\n previewText: \"Náhled\",\n editText: \"Upravit\",\n startSurveyText: \"Start\",\n otherItemText: \"Jiná odpověď (napište)\",\n noneItemText: \"Žádný\",\n selectAllItemText: \"Vybrat vše\",\n progressText: \"Strana {0} z {1}\",\n panelDynamicProgressText: \"Záznam {0} z {1}\",\n questionsProgressText: \"Zodpovězené otázky: {0} / {1}\",\n emptySurvey: \"Průzkumu neobsahuje žádné otázky.\",\n completingSurvey: \"Děkujeme za vyplnění průzkumu!\",\n completingSurveyBefore: \"Naše záznamy ukazují, že jste tento průzkum již dokončili.\",\n loadingSurvey: \"Probíhá načítání průzkumu...\",\n optionsCaption: \"Vyber...\",\n value: \"hodnota\",\n requiredError: \"Odpovězte prosím na otázku.\",\n requiredErrorInPanel: \"Please answer at least one question.\",\n requiredInAllRowsError: \"Odpovězte prosím na všechny otázky.\",\n numericError: \"V tomto poli lze zadat pouze čísla.\",\n textMinLength: \"Zadejte prosím alespoň {0} znaků.\",\n textMaxLength: \"Zadejte prosím méně než {0} znaků.\",\n textMinMaxLength: \"Zadejte prosím více než {0} a méně než {1} znaků.\",\n minRowCountError: \"Vyplňte prosím alespoň {0} řádků.\",\n minSelectError: \"Vyberte prosím alespoň {0} varianty.\",\n maxSelectError: \"Nevybírejte prosím více než {0} variant.\",\n numericMinMax: \"Odpověď '{0}' by mělo být větší nebo rovno {1} a menší nebo rovno {2}\",\n numericMin: \"Odpověď '{0}' by mělo být větší nebo rovno {1}\",\n numericMax: \"Odpověď '{0}' by mělo být menší nebo rovno {1}\",\n invalidEmail: \"Zadejte prosím platnou e-mailovou adresu.\",\n invalidExpression: \"Výraz: {0} by měl vrátit hodnotu „true“.\",\n urlRequestError: \"Požadavek vrátil chybu '{0}'. {1}\",\n urlGetChoicesError: \"Požadavek nevrátil data nebo cesta je neplatná\",\n exceedMaxSize: \"Velikost souboru by neměla být větší než {0}.\",\n otherRequiredError: \"Zadejte prosím jinou hodnotu.\",\n uploadingFile: \"Váš soubor se nahrává. Zkuste to prosím za několik sekund.\",\n loadingFile: \"Načítání...\",\n chooseFile: \"Vyberte soubory ...\",\n noFileChosen: \"Není zvolený žádný soubor\",\n confirmDelete: \"Chcete smazat záznam?\",\n keyDuplicationError: \"Tato hodnota by měla být jedinečná.\",\n addColumn: \"Přidat sloupec\",\n addRow: \"Přidat řádek\",\n removeRow: \"Odstranit\",\n addPanel: \"Přidat nový\",\n removePanel: \"Odstranit\",\n choices_Item: \"položka\",\n matrix_column: \"Sloupec\",\n matrix_row: \"Řádek\",\n savingData: \"Výsledky se ukládají na server ...\",\n savingDataError: \"Došlo k chybě a výsledky jsme nemohli uložit.\",\n savingDataSuccess: \"Výsledky byly úspěšně uloženy!\",\n saveAgainButton: \"Zkus to znovu\",\n timerMin: \"min\",\n timerSec: \"sek\",\n timerSpentAll: \"Na této stránce jste utratili celkem {0} a celkem {1}.\",\n timerSpentPage: \"Na této stránce jste utratili {0}.\",\n timerSpentSurvey: \"Celkem jste utratili {0}.\",\n timerLimitAll: \"Na této stránce jste utratili {0} z {1} a celkem {2} z {3}.\",\n timerLimitPage: \"Na této stránce jste strávili {0} z {1}.\",\n timerLimitSurvey: \"Celkově jste utratili {0} z {1}.\",\n cleanCaption: \"Čistý\",\n clearCaption: \"Průhledná\",\n chooseFileCaption: \"Vyberte soubor\",\n removeFileCaption: \"Odeberte tento soubor\",\n booleanCheckedLabel: \"Ano\",\n booleanUncheckedLabel: \"Ne\",\n confirmRemoveFile: \"Opravdu chcete odebrat tento soubor: {0}?\",\n confirmRemoveAllFiles: \"Opravdu chcete odstranit všechny soubory?\",\n questionTitlePatternText: \"Název otázky\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"cs\"] = czechSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"cs\"] = \"čeština\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/danish.ts\":\n/*!************************************!*\\\n !*** ./src/localization/danish.ts ***!\n \\************************************/\n/*! exports provided: danishSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"danishSurveyStrings\", function() { return danishSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar danishSurveyStrings = {\n pagePrevText: \"Tilbage\",\n pageNextText: \"Videre\",\n completeText: \"Færdig\",\n previewText: \"Forpremiere\",\n editText: \"Redigér\",\n startSurveyText: \"Start\",\n otherItemText: \"Valgfrit svar...\",\n noneItemText: \"Ingen\",\n selectAllItemText: \"Vælg alle\",\n progressText: \"Side {0} af {1}\",\n panelDynamicProgressText: \"Optag {0} af {1}\",\n questionsProgressText: \"Besvarede {0} / {1} spørgsmål\",\n emptySurvey: \"Der er ingen synlige spørgsmål.\",\n completingSurvey: \"Mange tak for din besvarelse!\",\n completingSurveyBefore: \"Vores data viser at du allerede har gennemført dette spørgeskema.\",\n loadingSurvey: \"Spørgeskemaet hentes fra serveren...\",\n optionsCaption: \"Vælg...\",\n value: \"værdi\",\n requiredError: \"Besvar venligst spørgsmålet.\",\n requiredErrorInPanel: \"Besvar venligst mindst ét spørgsmål.\",\n requiredInAllRowsError: \"Besvar venligst spørgsmål i alle rækker.\",\n numericError: \"Angiv et tal.\",\n textMinLength: \"Angiv mindst {0} tegn.\",\n textMaxLength: \"Please enter less than {0} characters.\",\n textMinMaxLength: \"Angiv mere end {0} og mindre end {1} tegn.\",\n minRowCountError: \"Udfyld mindst {0} rækker.\",\n minSelectError: \"Vælg venligst mindst {0} svarmulighed(er).\",\n maxSelectError: \"Vælg venligst færre {0} svarmuligheder(er).\",\n numericMinMax: \"'{0}' skal være lig med eller større end {1} og lig med eller mindre end {2}\",\n numericMin: \"'{0}' skal være lig med eller større end {1}\",\n numericMax: \"'{0}' skal være lig med eller mindre end {1}\",\n invalidEmail: \"Angiv venligst en gyldig e-mail adresse.\",\n invalidExpression: \"Udtrykket: {0} skal returnere 'true'.\",\n urlRequestError: \"Forespørgslen returnerede fejlen '{0}'. {1}\",\n urlGetChoicesError: \"Forespørgslen returnerede ingen data eller 'path' parameteren er forkert\",\n exceedMaxSize: \"Filstørrelsen må ikke overstige {0}.\",\n otherRequiredError: \"Angiv en værdi for dit valgfrie svar.\",\n uploadingFile: \"Din fil bliver uploadet. Vent nogle sekunder og prøv eventuelt igen.\",\n loadingFile: \"Indlæser...\",\n chooseFile: \"Vælg fil(er)...\",\n noFileChosen: \"Ingen fil er valgt\",\n confirmDelete: \"Vil du fjerne den?\",\n keyDuplicationError: \"Denne værdi skal være unik.\",\n addColumn: \"Tilføj kolonne\",\n addRow: \"Tilføj række\",\n removeRow: \"Fjern\",\n addPanel: \"Tilføj ny\",\n removePanel: \"Fjern\",\n choices_Item: \"valg\",\n matrix_column: \"Kolonne\",\n matrix_row: \"Række\",\n savingData: \"Resultaterne bliver gemt på serveren...\",\n savingDataError: \"Der opstod en fejl og vi kunne ikke gemme resultatet.\",\n savingDataSuccess: \"Resultatet blev gemt!\",\n saveAgainButton: \"Prøv igen\",\n timerMin: \"min\",\n timerSec: \"sek\",\n timerSpentAll: \"Du har brugt {0} på denne side og {1} i alt.\",\n timerSpentPage: \"Du har brugt {0} på denne side.\",\n timerSpentSurvey: \"Du har brugt {0} i alt.\",\n timerLimitAll: \"Du har brugt {0} af {1} på denne side og {2} af {3} i alt.\",\n timerLimitPage: \"Du har brugt {0} af {1} på denne side.\",\n timerLimitSurvey: \"Du har brugt {0} af {1} i alt.\",\n cleanCaption: \"Rens\",\n clearCaption: \"Fjern\",\n chooseFileCaption: \"Vælg fil\",\n removeFileCaption: \"Fjern denne fil\",\n booleanCheckedLabel: \"Ja\",\n booleanUncheckedLabel: \"Ingen\",\n confirmRemoveFile: \"Er du sikker på, at du vil fjerne denne fil: {0}?\",\n confirmRemoveAllFiles: \"Er du sikker på, at du vil fjerne alle filer?\",\n questionTitlePatternText: \"Spørgsmåls titel\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"da\"] = danishSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"da\"] = \"dansk\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/dutch.ts\":\n/*!***********************************!*\\\n !*** ./src/localization/dutch.ts ***!\n \\***********************************/\n/*! exports provided: dutchSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"dutchSurveyStrings\", function() { return dutchSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n//Created on behalf https://github.com/Frank13\n//Modified on behalf Roeland Verbakel\n\nvar dutchSurveyStrings = {\n pagePrevText: \"Vorige\",\n pageNextText: \"Volgende\",\n completeText: \"Verzenden\",\n previewText: \"Voorbeeld\",\n editText: \"Bewerk\",\n startSurveyText: \"Begin met\",\n otherItemText: \"Anders, nl.\",\n noneItemText: \"Geen\",\n selectAllItemText: \"Selecteer Alles\",\n progressText: \"Pagina {0} van {1}\",\n panelDynamicProgressText: \"Record {0} of {1}\",\n questionsProgressText: \"Geantwoord {0}/{1} vragen\",\n emptySurvey: \"Er is geen zichtbare pagina of vraag in deze vragenlijst\",\n completingSurvey: \"Bedankt voor het invullen van de vragenlijst\",\n completingSurveyBefore: \"Onze gegevens tonen aan dat je deze vragenlijst reeds beantwoord hebt.\",\n loadingSurvey: \"De vragenlijst is aan het laden...\",\n optionsCaption: \"Kies...\",\n value: \"waarde\",\n requiredError: \"Dit is een vereiste vraag\",\n requiredErrorInPanel: \"Gelieve ten minste een vraag te beantwoorden.\",\n requiredInAllRowsError: \"Deze vraag vereist één antwoord per rij\",\n numericError: \"Het antwoord moet een getal zijn\",\n textMinLength: \"Vul minstens {0} karakters in\",\n textMaxLength: \"Gelieve minder dan {0} karakters in te vullen.\",\n textMinMaxLength: \"Gelieve meer dan {0} en minder dan {1} karakters in te vullen.\",\n minRowCountError: \"Gelieve ten minste {0} rijen in te vullen.\",\n minSelectError: \"Selecteer minimum {0} antwoorden\",\n maxSelectError: \"Selecteer niet meer dan {0} antwoorden\",\n numericMinMax: \"Uw antwoord '{0}' moet groter of gelijk zijn aan {1} en kleiner of gelijk aan {2}\",\n numericMin: \"Uw antwoord '{0}' moet groter of gelijk zijn aan {1}\",\n numericMax: \"Uw antwoord '{0}' moet groter of gelijk zijn aan {1}\",\n invalidEmail: \"Vul een geldig e-mailadres in\",\n invalidExpression: \"De uitdrukking: {0} moet 'waar' teruggeven.\",\n urlRequestError: \"De vraag keerde een fout terug '{0}'. {1}\",\n urlGetChoicesError: \"De vraag gaf een leeg antwoord terug of de 'pad' eigenschap is niet correct\",\n exceedMaxSize: \"De grootte van het bestand mag niet groter zijn dan {0}\",\n otherRequiredError: \"Vul het veld 'Anders, nl.' in\",\n uploadingFile: \"Uw bestand wordt opgeladen. Gelieve enkele seconden te wachten en opnieuw te proberen.\",\n loadingFile: \"Opladen...\",\n chooseFile: \"Kies uw bestand(en)...\",\n noFileChosen: \"Geen bestand gekozen\",\n confirmDelete: \"Wil je deze gegevens verwijderen?\",\n keyDuplicationError: \"Deze waarde moet uniek zijn.\",\n addColumn: \"Voeg kolom toe\",\n addRow: \"Voeg rij toe\",\n removeRow: \"Verwijder\",\n addPanel: \"Nieuwe toevoegen\",\n removePanel: \"Verwijder\",\n choices_Item: \"onderwerp\",\n matrix_column: \"Kolom\",\n matrix_row: \"Rij\",\n savingData: \"De resultaten worden bewaard op de server...\",\n savingDataError: \"Er was een probleem en we konden de resultaten niet bewaren.\",\n savingDataSuccess: \"De resultaten werden succesvol bewaard!\",\n saveAgainButton: \"Probeer opnieuw\",\n timerMin: \"minimum\",\n timerSec: \"sec\",\n timerSpentAll: \"U heeft {0} gespendeerd op deze pagina en {1} in totaal.\",\n timerSpentPage: \"U heeft {0} op deze pagina gespendeerd.\",\n timerSpentSurvey: \"U heeft in totaal {0} gespendeerd.\",\n timerLimitAll: \"U heeft {0} van {1} op deze pagina gespendeerd en {2} van {3} in totaal.\",\n timerLimitPage: \"U heeft {0} van {1} gespendeerd op deze pagina.\",\n timerLimitSurvey: \"U heeft {0} van {1} in het totaal.\",\n cleanCaption: \"Kuis op\",\n clearCaption: \"Kuis op\",\n chooseFileCaption: \"Gekozen bestand\",\n removeFileCaption: \"Verwijder deze file\",\n booleanCheckedLabel: \"Ja\",\n booleanUncheckedLabel: \"Neen\",\n confirmRemoveFile: \"Bent u zeker dat u deze file wilt verwijderen: {0}?\",\n confirmRemoveAllFiles: \"Bent u zeker dat u al deze files wilt verwijderen?\",\n questionTitlePatternText: \"Titel van de vraag\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"nl\"] = dutchSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"nl\"] = \"nederlands\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/english.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/english.ts ***!\n \\*************************************/\n/*! exports provided: englishStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"englishStrings\", function() { return englishStrings; });\n//Uncomment this line on creating a translation file\n//import { surveyLocalization } from \"../surveyStrings\";\nvar englishStrings = {\n pagePrevText: \"Previous\",\n pageNextText: \"Next\",\n completeText: \"Complete\",\n previewText: \"Preview\",\n editText: \"Edit\",\n startSurveyText: \"Start\",\n otherItemText: \"Other (describe)\",\n noneItemText: \"None\",\n selectAllItemText: \"Select All\",\n progressText: \"Page {0} of {1}\",\n panelDynamicProgressText: \"Record {0} of {1}\",\n questionsProgressText: \"Answered {0}/{1} questions\",\n emptySurvey: \"There is no visible page or question in the survey.\",\n completingSurvey: \"Thank you for completing the survey!\",\n completingSurveyBefore: \"Our records show that you have already completed this survey.\",\n loadingSurvey: \"Loading Survey...\",\n optionsCaption: \"Choose...\",\n value: \"value\",\n requiredError: \"Please answer the question.\",\n requiredErrorInPanel: \"Please answer at least one question.\",\n requiredInAllRowsError: \"Please answer questions in all rows.\",\n numericError: \"The value should be numeric.\",\n minError: \"The value should not be less than {0}\",\n maxError: \"The value should not be greater than {0}\",\n textMinLength: \"Please enter at least {0} character(s).\",\n textMaxLength: \"Please enter no more than {0} character(s).\",\n textMinMaxLength: \"Please enter at least {0} and no more than {1} characters.\",\n minRowCountError: \"Please fill in at least {0} row(s).\",\n minSelectError: \"Please select at least {0} variant(s).\",\n maxSelectError: \"Please select no more than {0} variant(s).\",\n numericMinMax: \"The '{0}' should be at least {1} and at most {2}\",\n numericMin: \"The '{0}' should be at least {1}\",\n numericMax: \"The '{0}' should be at most {1}\",\n invalidEmail: \"Please enter a valid e-mail address.\",\n invalidExpression: \"The expression: {0} should return 'true'.\",\n urlRequestError: \"The request returned error '{0}'. {1}\",\n urlGetChoicesError: \"The request returned empty data or the 'path' property is incorrect\",\n exceedMaxSize: \"The file size should not exceed {0}.\",\n otherRequiredError: \"Please enter the other value.\",\n uploadingFile: \"Your file is uploading. Please wait several seconds and try again.\",\n loadingFile: \"Loading...\",\n chooseFile: \"Choose file(s)...\",\n noFileChosen: \"No file chosen\",\n confirmDelete: \"Do you want to delete the record?\",\n keyDuplicationError: \"This value should be unique.\",\n addColumn: \"Add column\",\n addRow: \"Add row\",\n removeRow: \"Remove\",\n emptyRowsText: \"There are no rows.\",\n addPanel: \"Add new\",\n removePanel: \"Remove\",\n choices_Item: \"item\",\n matrix_column: \"Column\",\n matrix_row: \"Row\",\n multipletext_itemname: \"text\",\n savingData: \"The results are being saved on the server...\",\n savingDataError: \"An error occurred and we could not save the results.\",\n savingDataSuccess: \"The results were saved successfully!\",\n saveAgainButton: \"Try again\",\n timerMin: \"min\",\n timerSec: \"sec\",\n timerSpentAll: \"You have spent {0} on this page and {1} in total.\",\n timerSpentPage: \"You have spent {0} on this page.\",\n timerSpentSurvey: \"You have spent {0} in total.\",\n timerLimitAll: \"You have spent {0} of {1} on this page and {2} of {3} in total.\",\n timerLimitPage: \"You have spent {0} of {1} on this page.\",\n timerLimitSurvey: \"You have spent {0} of {1} in total.\",\n cleanCaption: \"Clean\",\n clearCaption: \"Clear\",\n signaturePlaceHolder: \"Sign here\",\n chooseFileCaption: \"Choose file\",\n removeFileCaption: \"Remove this file\",\n booleanCheckedLabel: \"Yes\",\n booleanUncheckedLabel: \"No\",\n confirmRemoveFile: \"Are you sure that you want to remove this file: {0}?\",\n confirmRemoveAllFiles: \"Are you sure that you want to remove all files?\",\n questionTitlePatternText: \"Question Title\",\n modalCancelButtonText: \"Cancel\",\n modalApplyButtonText: \"Apply\",\n};\n//Uncomment these two lines on creating a translation file. You should replace \"en\" and enStrings with your locale (\"fr\", \"de\" and so on) and your variable.\n//surveyLocalization.locales[\"en\"] = englishStrings;\n//surveyLocalization.localeNames[\"en\"] = \"English\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/estonian.ts\":\n/*!**************************************!*\\\n !*** ./src/localization/estonian.ts ***!\n \\**************************************/\n/*! exports provided: estonianSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"estonianSurveyStrings\", function() { return estonianSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar estonianSurveyStrings = {\n pagePrevText: \"Tagasi\",\n pageNextText: \"Edasi\",\n completeText: \"Lõpeta\",\n previewText: \"Eelvaade\",\n editText: \"Muuda\",\n startSurveyText: \"Alusta\",\n otherItemText: \"Muu (täpsusta)\",\n noneItemText: \"Mitte midagi\",\n selectAllItemText: \"Vali kõik\",\n progressText: \"Lehekülg {0}/{1}\",\n panelDynamicProgressText: \"Kirje {0}/{1}\",\n questionsProgressText: \"Vastatud {0} küsimust {1}-st\",\n emptySurvey: \"Selles uuringus ei ole ühtki nähtavat lehekülge või küsimust.\",\n completingSurvey: \"Aitäh, et vastasid ankeedile!\",\n completingSurveyBefore: \"Meie andmetel oled sa sellele ankeedile juba vastanud.\",\n loadingSurvey: \"Laen ankeeti...\",\n optionsCaption: \"Vali...\",\n value: \"väärtus\",\n requiredError: \"Palun vasta küsimusele.\",\n requiredErrorInPanel: \"Palun vasta vähemalt ühele küsimusele.\",\n requiredInAllRowsError: \"Palun anna vastus igal real.\",\n numericError: \"See peaks olema numbriline väärtus.\",\n textMinLength: \"Palun sisesta vähemalt {0} tähemärki.\",\n textMaxLength: \"Palun ära sisesta rohkem kui {0} tähemärki.\",\n textMinMaxLength: \"Sisesta palun {0} - {1} tähemärki.\",\n minRowCountError: \"Sisesta plaun vähemalt {0} rida.\",\n minSelectError: \"Palun vali vähemalt {0} varianti.\",\n maxSelectError: \"Palun vali kõige rohkem {0} varianti.\",\n numericMinMax: \"'{0}' peaks olema võrdne või suurem kui {1} ja võrdne või väiksem kui {2}\",\n numericMin: \"'{0}' peaks olema võrdne või suurem kui {1}\",\n numericMax: \"'{0}' peaks olema võrnde või väiksem kui {1}\",\n invalidEmail: \"Sisesta palun korrektne e-posti aadress.\",\n invalidExpression: \"Avaldis: {0} peaks tagastama tõese.\",\n urlRequestError: \"Taotlus tagastas vea „{0}”. {1}\",\n urlGetChoicesError: \"Taotlus tagastas tühjad andmed või atribuut 'path' on vale\",\n exceedMaxSize: \"Faili suurus ei tohi ületada {0}.\",\n otherRequiredError: \"Sisesta palun muu vastus.\",\n uploadingFile: \"Sinu fail laeb üles. Palun oota mõned sekundid ning proovi seejärel uuesti.\",\n loadingFile: \"Laen...\",\n chooseFile: \"Vali fail(id)...\",\n noFileChosen: \"Faili pole valitud\",\n confirmDelete: \"Kas tahad kirje kustutada?\",\n keyDuplicationError: \"See väärtus peab olema unikaalne.\",\n addColumn: \"Lisa veerg\",\n addRow: \"Lisa rida\",\n removeRow: \"Eemalda\",\n addPanel: \"Lisa uus\",\n removePanel: \"Eemalda\",\n choices_Item: \"üksus\",\n matrix_column: \"Veerg\",\n matrix_row: \"Rida\",\n savingData: \"Salvestan andmed serveris...\",\n savingDataError: \"Tekkis viga ning me ei saanud vastuseid salvestada.\",\n savingDataSuccess: \"Vastuste salvestamine õnnestus!\",\n saveAgainButton: \"Proovi uuesti\",\n timerMin: \"min\",\n timerSec: \"sek\",\n timerSpentAll: \"Oled veetnud {0} sellel lehel ning kokku {1}.\",\n timerSpentPage: \"Oled veetnud {0} sellel lehel.\",\n timerSpentSurvey: \"Oled veetnud {0} kokku.\",\n timerLimitAll: \"Oled kulutanud {0} võimalikust {1} sellel lehel ning {2} võimalikust {3} kokku.\",\n timerLimitPage: \"Oled kulutanud {0} võimalikust {1} sellel lehel.\",\n timerLimitSurvey: \"Oled kulutanud {0} võimalikust {1} koguajast.\",\n cleanCaption: \"Puhasta\",\n clearCaption: \"Puhasta\",\n chooseFileCaption: \"Vali fail\",\n removeFileCaption: \"Eemalda see fail\",\n booleanCheckedLabel: \"Jah\",\n booleanUncheckedLabel: \"Ei\",\n confirmRemoveFile: \"Oled sa kindel, et soovid selle faili eemaldada: {0}?\",\n confirmRemoveAllFiles: \"Oled sa kindel, et soovid eemaldada kõik failid?\",\n questionTitlePatternText: \"Küsimuse pealkiri\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"et\"] = estonianSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"et\"] = \"eesti keel\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/finnish.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/finnish.ts ***!\n \\*************************************/\n/*! exports provided: finnishSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"finnishSurveyStrings\", function() { return finnishSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar finnishSurveyStrings = {\n pagePrevText: \"Edellinen\",\n pageNextText: \"Seuraava\",\n completeText: \"Valmis\",\n previewText: \"Esikatselu\",\n editText: \"Muokkaa\",\n startSurveyText: \"Aloita\",\n otherItemText: \"Muu (tarkenna)\",\n noneItemText: \"Ei mitään\",\n selectAllItemText: \"Valitse kaikki\",\n progressText: \"Sivu {0} / {1}\",\n panelDynamicProgressText: \"Osio {0} / {1}\",\n questionsProgressText: \"Olet vastannut {0} / {1} kysymykseen.\",\n emptySurvey: \"Tässä kyselyssä ei ole yhtään näkyvillä olevaa sivua tai kysymystä.\",\n completingSurvey: \"Kiitos kyselyyn vastaamisesta!\",\n completingSurveyBefore: \"Tietojemme mukaan olet jo suorittanut tämän kyselyn.\",\n loadingSurvey: \"Kyselyä ladataan palvelimelta...\",\n optionsCaption: \"Valitse...\",\n value: \"arvo\",\n requiredError: \"Vastaa kysymykseen, kiitos.\",\n requiredErrorInPanel: \"Vastaa ainakin yhteen kysymykseen.\",\n requiredInAllRowsError: \"Vastaa kysymyksiin kaikilla riveillä.\",\n numericError: \"Arvon tulee olla numeerinen.\",\n textMinLength: \"Syötä vähintään {0} merkkiä.\",\n textMaxLength: \"Älä syötä yli {0} merkkiä.\",\n textMinMaxLength: \"Syötä vähintään {0} ja enintään {1} merkkiä.\",\n minRowCountError: \"Täytä vähintään {0} riviä.\",\n minSelectError: \"Valitse vähintään {0} vaihtoehtoa.\",\n maxSelectError: \"Valitse enintään {0} vaihtoehtoa.\",\n numericMinMax: \"Luvun '{0}' tulee olla vähintään {1} ja korkeintaan {2}.\",\n numericMin: \"Luvun '{0}' tulee olla vähintään {1}.\",\n numericMax: \"Luvun '{0}' tulee olla korkeintaan {1}.\",\n invalidEmail: \"Syötä validi sähköpostiosoite.\",\n invalidExpression: \"Lausekkeen: {0} pitäisi palauttaa 'true'.\",\n urlRequestError: \"Pyyntö palautti virheen {0}. {1}\",\n urlGetChoicesError: \"Pyyntö palautti tyhjän tiedoston tai 'path'-asetus on väärä\",\n exceedMaxSize: \"Tiedoston koko ei saa olla suurempi kuin {0}.\",\n otherRequiredError: \"Tarkenna vastaustasi tekstikenttään.\",\n uploadingFile: \"Tiedostoa lähetetään. Odota muutama sekunti ja yritä uudelleen.\",\n loadingFile: \"Ladataan...\",\n chooseFile: \"Valitse tiedosto(t)...\",\n noFileChosen: \"Ei tiedostoa valittuna\",\n confirmDelete: \"Haluatko poistaa osion?\",\n keyDuplicationError: \"Tämä arvo on jo käytössä. Syötä toinen arvo.\",\n addColumn: \"Lisää sarake\",\n addRow: \"Lisää rivi\",\n removeRow: \"Poista\",\n emptyRowsText: \"Ei rivejä\",\n addPanel: \"Lisää uusi\",\n removePanel: \"Poista\",\n choices_Item: \"kohde\",\n matrix_column: \"Sarake\",\n matrix_row: \"Rivi\",\n savingData: \"Tietoja tallennetaan palvelimelle...\",\n savingDataError: \"Tapahtui virhe, emmekä voineet tallentaa kyselyn tietoja.\",\n savingDataSuccess: \"Tiedot tallennettiin onnistuneesti!\",\n saveAgainButton: \"Yritä uudelleen\",\n timerMin: \"min\",\n timerSec: \"sek\",\n timerSpentAll: \"Olet käyttänyt {0} tällä sivulla ja yhteensä {1}.\",\n timerSpentPage: \"Olet käyttänyt {0} tällä sivulla.\",\n timerSpentSurvey: \"Olet käyttänyt yhteensä {0}.\",\n timerLimitAll: \"Olet käyttänyt tällä sivulla {0} / {1} ja yhteensä {2} / {3}.\",\n timerLimitPage: \"Olet käyttänyt {0} / {1} tällä sivulla.\",\n timerLimitSurvey: \"Olet käyttänyt yhteensä {0} / {1}.\",\n cleanCaption: \"Pyyhi\",\n clearCaption: \"Tyhjennä\",\n chooseFileCaption: \"Valitse tiedosto\",\n removeFileCaption: \"Poista tämä tiedosto\",\n booleanCheckedLabel: \"Kyllä\",\n booleanUncheckedLabel: \"Ei\",\n confirmRemoveFile: \"Haluatko varmasti poistaa tämän tiedoston: {0}?\",\n confirmRemoveAllFiles: \"Haluatko varmasti poistaa kaikki tiedostot?\",\n questionTitlePatternText: \"Kysymyksen otsikko\",\n modalCancelButtonText: \"Peruuta\",\n modalApplyButtonText: \"Käytä\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"fi\"] = finnishSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"fi\"] = \"suomi\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/french.ts\":\n/*!************************************!*\\\n !*** ./src/localization/french.ts ***!\n \\************************************/\n/*! exports provided: frenchSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"frenchSurveyStrings\", function() { return frenchSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar frenchSurveyStrings = {\n pagePrevText: \"Précédent\",\n pageNextText: \"Suivant\",\n completeText: \"Terminer\",\n previewText: \"Aperçu\",\n editText: \"Modifier\",\n startSurveyText: \"Commencer\",\n otherItemText: \"Autre (préciser)\",\n noneItemText: \"Aucun\",\n selectAllItemText: \"Tout sélectionner\",\n progressText: \"Page {0} sur {1}\",\n panelDynamicProgressText: \"Enregistrement {0} sur {1}\",\n questionsProgressText: \"{0}/{1} question(s) répondue(s)\",\n emptySurvey: \"Il n'y a ni page visible ni question visible dans ce questionnaire\",\n completingSurvey: \"Merci d'avoir répondu au questionnaire !\",\n completingSurveyBefore: \"Nos données indiquent que vous avez déjà rempli ce questionnaire.\",\n loadingSurvey: \"Le questionnaire est en cours de chargement...\",\n optionsCaption: \"Choisissez...\",\n value: \"valeur\",\n requiredError: \"La réponse à cette question est obligatoire.\",\n requiredErrorInPanel: \"Merci de répondre au moins à une question.\",\n requiredInAllRowsError: \"Toutes les lignes sont obligatoires\",\n numericError: \"La réponse doit être un nombre.\",\n textMinLength: \"Merci de saisir au moins {0} caractères.\",\n textMaxLength: \"Merci de saisir moins de {0} caractères.\",\n textMinMaxLength: \"Merci de saisir entre {0} et {1} caractères.\",\n minRowCountError: \"Merci de compléter au moins {0} lignes.\",\n minSelectError: \"Merci de sélectionner au minimum {0} réponses.\",\n maxSelectError: \"Merci de sélectionner au maximum {0} réponses.\",\n numericMinMax: \"Votre réponse '{0}' doit être supérieure ou égale à {1} et inférieure ou égale à {2}\",\n numericMin: \"Votre réponse '{0}' doit être supérieure ou égale à {1}\",\n numericMax: \"Votre réponse '{0}' doit être inférieure ou égale à {1}\",\n invalidEmail: \"Merci d'entrer une adresse mail valide.\",\n invalidExpression: \"L'expression: {0} doit retourner 'true'.\",\n urlRequestError: \"La requête a renvoyé une erreur '{0}'. {1}\",\n urlGetChoicesError: \"La requête a renvoyé des données vides ou la propriété 'path' est incorrecte\",\n exceedMaxSize: \"La taille du fichier ne doit pas excéder {0}.\",\n otherRequiredError: \"Merci de préciser le champ 'Autre'.\",\n uploadingFile: \"Votre fichier est en cours de chargement. Merci d'attendre quelques secondes et de réessayer.\",\n loadingFile: \"Chargement...\",\n chooseFile: \"Ajouter des fichiers...\",\n noFileChosen: \"Aucun fichier ajouté\",\n confirmDelete: \"Voulez-vous supprimer cet enregistrement ?\",\n keyDuplicationError: \"Cette valeur doit être unique.\",\n addColumn: \"Ajouter une colonne\",\n addRow: \"Ajouter une ligne\",\n removeRow: \"Supprimer\",\n addPanel: \"Ajouter\",\n removePanel: \"Supprimer\",\n choices_Item: \"item\",\n matrix_column: \"Colonne\",\n matrix_row: \"Ligne\",\n savingData: \"Les résultats sont en cours de sauvegarde sur le serveur...\",\n savingDataError: \"Une erreur est survenue et a empêché la sauvegarde des résultats.\",\n savingDataSuccess: \"Les résultats ont bien été enregistrés !\",\n saveAgainButton: \"Réessayer\",\n timerMin: \"min\",\n timerSec: \"sec\",\n timerSpentAll: \"Vous avez passé {0} sur cette page et {1} au total.\",\n timerSpentPage: \"Vous avez passé {0} sur cette page.\",\n timerSpentSurvey: \"Vous avez passé {0} au total.\",\n timerLimitAll: \"Vous avez passé {0} sur {1} sur cette page et {2} sur {3} au total.\",\n timerLimitPage: \"Vous avez passé {0} sur {1} sur cette page.\",\n timerLimitSurvey: \"Vous avez passé {0} sur {1} au total.\",\n cleanCaption: \"Nettoyer\",\n clearCaption: \"Vider\",\n chooseFileCaption: \"Ajouter un fichier\",\n removeFileCaption: \"Enlever ce fichier\",\n booleanCheckedLabel: \"Oui\",\n booleanUncheckedLabel: \"Non\",\n confirmRemoveFile: \"Êtes-vous certains de vouloir supprimer ce fichier : {0}?\",\n confirmRemoveAllFiles: \"Êtes-vous certains de vouloir supprimer tous les fichiers?\",\n questionTitlePatternText: \"Titre de la question\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"fr\"] = frenchSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"fr\"] = \"français\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/georgian.ts\":\n/*!**************************************!*\\\n !*** ./src/localization/georgian.ts ***!\n \\**************************************/\n/*! exports provided: georgianSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"georgianSurveyStrings\", function() { return georgianSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar georgianSurveyStrings = {\n pagePrevText: \"უკან\",\n pageNextText: \"შემდეგ\",\n completeText: \"დასრულება\",\n progressText: \"გვერდი {0} / {1}\",\n emptySurvey: \"არცერთი კითხვა არ არის.\",\n completingSurvey: \"გმადლობთ კითხვარის შევსებისთვის!\",\n loadingSurvey: \"ჩატვირთვა სერვერიდან...\",\n otherItemText: \"სხვა (გთხოვთ მიუთითეთ)\",\n optionsCaption: \"არჩევა...\",\n requiredError: \"გთხოვთ უპასუხეთ კითხვას.\",\n numericError: \"პასუხი უნდა იყოს რიცხვი.\",\n textMinLength: \"გთხოვთ შეიყვანეთ არანაკლებ {0} სიმბოლო.\",\n minSelectError: \"გთხოვთ აირჩიეთ არანაკლებ {0} ვარიანტი.\",\n maxSelectError: \"გთხოვთ აირჩიეთ არაუმეტეს {0} ვარიანტი.\",\n numericMinMax: \"'{0}' უნდა იყოს მეტი ან ტოლი, ვიდრე {1}, და ნაკლები ან ტოლი ვიდრე {2}\",\n numericMin: \"'{0}' უნდა იყოს მეტი ან ტოლი ვიდრე {1}\",\n numericMax: \"'{0}' უნდა იყოს ნაკლები ან ტოლი ვიდრე {1}\",\n invalidEmail: \"გთხოვთ შეიყვანოთ ელ. ფოსტის რეალური მისამართი.\",\n otherRequiredEror: \"გთხოვთ შეავსეთ ველი 'სხვა'\"\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"ka\"] = georgianSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"ka\"] = \"ქართული\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/german.ts\":\n/*!************************************!*\\\n !*** ./src/localization/german.ts ***!\n \\************************************/\n/*! exports provided: germanSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"germanSurveyStrings\", function() { return germanSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar germanSurveyStrings = {\n pagePrevText: \"Zurück\",\n pageNextText: \"Weiter\",\n completeText: \"Abschließen\",\n previewText: \"Vorschau\",\n editText: \"Bearbeiten\",\n startSurveyText: \"Start\",\n otherItemText: \"Sonstiges (Bitte angeben)\",\n noneItemText: \"Nichts trifft zu\",\n selectAllItemText: \"Alles auswählen\",\n progressText: \"Seite {0} von {1}\",\n panelDynamicProgressText: \"Eintrag {0} von {1}\",\n questionsProgressText: \"{0}/{1} Fragen beantwortet\",\n emptySurvey: \"Es sind keine Fragen vorhanden.\",\n completingSurvey: \"Vielen Dank, dass Sie die Umfrage abgeschlossen haben!\",\n completingSurveyBefore: \"Wir haben festgestellt, dass Sie diese Umfrage bereits abgeschlossen haben.\",\n loadingSurvey: \"Umfrage wird geladen...\",\n optionsCaption: \"Bitte auswählen...\",\n value: \"Wert\",\n requiredError: \"Bitte beantworten Sie diese Frage.\",\n requiredErrorInPanel: \"Bitte beantworten Sie mindestens eine Frage.\",\n requiredInAllRowsError: \"Bitte beantworten Sie alle Fragen.\",\n numericError: \"Der Wert muss eine Zahl sein.\",\n textMinLength: \"Bitte geben Sie mindestens {0} Zeichen ein.\",\n textMaxLength: \"Bitte geben Sie nicht mehr als {0} Zeichen ein.\",\n textMinMaxLength: \"Bitte geben Sie mindestens {0} und maximal {1} Zeichen ein.\",\n minRowCountError: \"Bitte machen Sie in mindestens {0} Zeilen eine Eingabe.\",\n minSelectError: \"Bitte wählen Sie mindestens {0} Antwort(en) aus.\",\n maxSelectError: \"Bitte wählen Sie nicht mehr als {0} Antwort(en) aus.\",\n numericMinMax: \"'{0}' muss größer oder gleich {1} und kleiner oder gleich {2} sein\",\n numericMin: \"'{0}' muss größer oder gleich {1} sein\",\n numericMax: \"'{0}' muss kleiner oder gleich {1} sein\",\n invalidEmail: \"Bitte geben Sie eine gültige E-Mail-Adresse ein.\",\n invalidExpression: \"Der Ausdruck: {0} muss den Wert 'wahr' zurückgeben.\",\n urlRequestError: \"Ein Netzwerkdienst hat folgenden Fehler zurückgegeben '{0}'. {1}\",\n urlGetChoicesError: \"Eine Netzwerkdienst hat ungültige Daten zurückgegeben\",\n exceedMaxSize: \"Die Datei darf nicht größer als {0} sein.\",\n otherRequiredError: \"Bitte geben Sie einen Wert an.\",\n uploadingFile: \"Bitte warten Sie bis der Upload Ihrer Dateien abgeschlossen ist.\",\n loadingFile: \"Wird hochgeladen...\",\n chooseFile: \"Datei(en) auswählen...\",\n noFileChosen: \"Keine Datei ausgewählt\",\n confirmDelete: \"Wollen Sie den Eintrag löschen?\",\n keyDuplicationError: \"Dieser Wert muss einmalig sein.\",\n addColumn: \"Spalte hinzufügen\",\n addRow: \"Zeile hinzufügen\",\n removeRow: \"Entfernen\",\n addPanel: \"Neu hinzufügen\",\n removePanel: \"Entfernen\",\n choices_Item: \"Element\",\n matrix_column: \"Spalte\",\n matrix_row: \"Zeile\",\n savingData: \"Die Ergebnisse werden auf dem Server gespeichert...\",\n savingDataError: \"Es ist ein Fehler aufgetreten. Die Ergebnisse konnten nicht gespeichert werden.\",\n savingDataSuccess: \"Die Ergebnisse wurden gespeichert!\",\n saveAgainButton: \"Erneut absenden\",\n timerMin: \"Min.\",\n timerSec: \"Sek.\",\n timerSpentAll: \"Sie waren {0} auf dieser Seite und brauchten insgesamt {1}.\",\n timerSpentPage: \"Sie waren {0} auf dieser Seite.\",\n timerSpentSurvey: \"Sie haben insgesamt {0} gebraucht.\",\n timerLimitAll: \"Sie waren {0} von {1} auf dieser Seite und brauchten insgesamt {2} von {3}.\",\n timerLimitPage: \"Sie waren {0} von {1} auf dieser Seite.\",\n timerLimitSurvey: \"Sie haben insgesamt {0} von {1} gebraucht.\",\n cleanCaption: \"Alles löschen\",\n clearCaption: \"Auswahl entfernen\",\n chooseFileCaption: \"Datei auswählen\",\n removeFileCaption: \"Datei löschen\",\n booleanCheckedLabel: \"Ja\",\n booleanUncheckedLabel: \"Nein\",\n confirmRemoveFile: \"Sind Sie sicher, dass Sie diese Datei löschen möchten: {0}?\",\n confirmRemoveAllFiles: \"Sind Sie sicher, dass Sie alle Dateien löschen möchten?\",\n questionTitlePatternText: \"Fragentitel\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"de\"] = germanSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"de\"] = \"deutsch\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/greek.ts\":\n/*!***********************************!*\\\n !*** ./src/localization/greek.ts ***!\n \\***********************************/\n/*! exports provided: greekSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"greekSurveyStrings\", function() { return greekSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n//Created by https://github.com/agelospanagiotakis\n\nvar greekSurveyStrings = {\n pagePrevText: \"Προηγούμενο\",\n pageNextText: \"Επόμενο\",\n completeText: \"Ολοκλήρωση\",\n previewText: \"Προεπισκόπηση\",\n editText: \"Επεξεργασία\",\n startSurveyText: \"Αρχή\",\n otherItemText: \"Άλλο (παρακαλώ διευκρινίστε)\",\n noneItemText: \"Κανένας\",\n selectAllItemText: \"Επιλογή όλων\",\n progressText: \"Σελίδα {0} από {1}\",\n panelDynamicProgressText: \"Εγγραφή {0} από {1}\",\n questionsProgressText: \"Απαντήθηκαν {0} / {1} ερωτήσεις\",\n emptySurvey: \"Δεν υπάρχει καμία ορατή σελίδα ή ορατή ερώτηση σε αυτό το ερωτηματολόγιο.\",\n completingSurvey: \"Ευχαριστούμε για την συμπλήρωση αυτού του ερωτηματολογίου!\",\n completingSurveyBefore: \"Τα αρχεία μας δείχνουν ότι έχετε ήδη ολοκληρώσει αυτήν την έρευνα.\",\n loadingSurvey: \"Το ερωτηματολόγιο φορτώνεται απο το διακομιστή...\",\n optionsCaption: \"Επιλέξτε...\",\n value: \"αξία\",\n requiredError: \"Παρακαλώ απαντήστε στην ερώτηση.\",\n requiredErrorInPanel: \"Απαντήστε σε τουλάχιστον μία ερώτηση.\",\n requiredInAllRowsError: \"Παρακαλώ απαντήστε στις ερωτήσεις σε όλες τις γραμμές.\",\n numericError: \"Η τιμή πρέπει να είναι αριθμητική.\",\n textMinLength: \"Παρακαλώ συμπληρώστε τουλάχιστον {0} σύμβολα.\",\n textMaxLength: \"Εισαγάγετε λιγότερους από {0} χαρακτήρες.\",\n textMinMaxLength: \"Εισαγάγετε περισσότερους από {0} και λιγότερους από {1} χαρακτήρες.\",\n minRowCountError: \"Παρακαλώ συμπληρώστε τουλάχιστον {0} γραμμές.\",\n minSelectError: \"Παρακαλώ επιλέξτε τουλάχιστον {0} παραλλαγές.\",\n maxSelectError: \"Παρακαλώ επιλέξτε όχι παραπάνω απο {0} παραλλαγές.\",\n numericMinMax: \"Το '{0}' θα πρέπει να είναι ίσο ή μεγαλύτερο απο το {1} και ίσο ή μικρότερο απο το {2}\",\n numericMin: \"Το '{0}' πρέπει να είναι μεγαλύτερο ή ισο με το {1}\",\n numericMax: \"Το '{0}' πρέπει να είναι μικρότερο ή ίσο απο το {1}\",\n invalidEmail: \"Παρακαλώ δώστε μια αποδεκτή διεύθυνση e-mail.\",\n invalidExpression: \"Η έκφραση: {0} θα πρέπει να επιστρέψει 'true'.\",\n urlRequestError: \"Η αίτηση επέστρεψε σφάλμα '{0}'. {1}\",\n urlGetChoicesError: \"Η αίτηση επέστρεψε κενά δεδομένα ή η ιδιότητα 'μονοπάτι/path' είναι εσφαλμένη\",\n exceedMaxSize: \"Το μέγεθος δεν μπορεί να υπερβαίνει τα {0}.\",\n otherRequiredError: \"Παρακαλώ συμπληρώστε την τιμή για το πεδίο 'άλλο'.\",\n uploadingFile: \"Το αρχείο σας ανεβαίνει. Παρακαλώ περιμένετε καποια δευτερόλεπτα και δοκιμάστε ξανά.\",\n loadingFile: \"Φόρτωση...\",\n chooseFile: \"Επιλογή αρχείων ...\",\n noFileChosen: \"Δεν έχει επιλεγεί αρχείο\",\n confirmDelete: \"Θέλετε να διαγράψετε την εγγραφή;\",\n keyDuplicationError: \"Αυτή η τιμή πρέπει να είναι μοναδική.\",\n addColumn: \"Προσθήκη στήλης\",\n addRow: \"Προσθήκη γραμμής\",\n removeRow: \"Αφαίρεση\",\n addPanel: \"Προσθεσε νεο\",\n removePanel: \"Αφαιρώ\",\n choices_Item: \"είδος\",\n matrix_column: \"Στήλη\",\n matrix_row: \"Σειρά\",\n savingData: \"Τα αποτελέσματα αποθηκεύονται στον διακομιστή ...\",\n savingDataError: \"Παρουσιάστηκε σφάλμα και δεν ήταν δυνατή η αποθήκευση των αποτελεσμάτων.\",\n savingDataSuccess: \"Τα αποτελέσματα αποθηκεύτηκαν με επιτυχία!\",\n saveAgainButton: \"Προσπάθησε ξανά\",\n timerMin: \"ελάχ\",\n timerSec: \"δευτ\",\n timerSpentAll: \"Έχετε δαπανήσει {0} σε αυτήν τη σελίδα και {1} συνολικά.\",\n timerSpentPage: \"Έχετε ξοδέψει {0} σε αυτήν τη σελίδα.\",\n timerSpentSurvey: \"Έχετε ξοδέψει συνολικά {0}.\",\n timerLimitAll: \"Έχετε δαπανήσει {0} από {1} σε αυτήν τη σελίδα και {2} από {3} συνολικά.\",\n timerLimitPage: \"Έχετε ξοδέψει {0} από {1} σε αυτήν τη σελίδα.\",\n timerLimitSurvey: \"Έχετε ξοδέψει {0} από {1} συνολικά.\",\n cleanCaption: \"ΚΑΘΑΡΗ\",\n clearCaption: \"Σαφή\",\n chooseFileCaption: \"Επιλέξτε το αρχείο\",\n removeFileCaption: \"Καταργήστε αυτό το αρχείο\",\n booleanCheckedLabel: \"Ναί\",\n booleanUncheckedLabel: \"Οχι\",\n confirmRemoveFile: \"Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτό το αρχείο: {0};\",\n confirmRemoveAllFiles: \"Είστε βέβαιοι ότι θέλετε να καταργήσετε όλα τα αρχεία;\",\n questionTitlePatternText: \"Τίτλος ερώτησης\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"gr\"] = greekSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"gr\"] = \"ελληνικά\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/hebrew.ts\":\n/*!************************************!*\\\n !*** ./src/localization/hebrew.ts ***!\n \\************************************/\n/*! exports provided: hebrewSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hebrewSurveyStrings\", function() { return hebrewSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar hebrewSurveyStrings = {\n pagePrevText: \"אחורה\",\n pageNextText: \"קדימה\",\n completeText: \"סיום\",\n previewText: \"תצוגה מקדימה\",\n editText: \"לַעֲרוֹך\",\n startSurveyText: \"הַתחָלָה\",\n otherItemText: \"אחר (נא לתאר)\",\n noneItemText: \"אף אחד\",\n selectAllItemText: \"בחר הכל\",\n progressText: \"דף {1} מתוך {0}\",\n panelDynamicProgressText: \"הקלטה {0} מתוך {1}\",\n questionsProgressText: \"ענה על שאלות\",\n emptySurvey: \"אין שאלות\",\n completingSurvey: \"תודה על מילוי השאלון!\",\n completingSurveyBefore: \"הרשומות שלנו מראות שכבר סיימת את הסקר הזה.\",\n loadingSurvey: \"טעינה מהשרת...\",\n optionsCaption: \"בחר...\",\n value: \"ערך\",\n requiredError: \"אנא השב על השאלה\",\n requiredErrorInPanel: \"אנא ענה לפחות על שאלה אחת.\",\n requiredInAllRowsError: \"אנא ענה על שאלות בכל השורות.\",\n numericError: \"התשובה צריכה להיות מספר.\",\n textMinLength: \"הזן לפחות {0} תווים.\",\n textMaxLength: \"הזן פחות מ- {0} תווים.\",\n textMinMaxLength: \"הזן יותר מ- {0} ופחות מ- {1} תווים.\",\n minRowCountError: \"אנא מלא לפחות {0} שורות.\",\n minSelectError: \"בחר לפחות {0} אפשרויות.\",\n maxSelectError: \"בחר עד {0} אפשרויות.\",\n numericMinMax: \"'{0}' חייב להיות שווה או גדול מ {1}, ושווה ל- {2} או פחות מ- {}}\",\n numericMin: \"'{0}' חייב להיות שווה או גדול מ {1}\",\n numericMax: \"'{0}' חייב להיות שווה או קטן מ {1}\",\n invalidEmail: 'הזן כתובת דוא\"ל חוקית.',\n invalidExpression: \"הביטוי: {0} צריך להחזיר 'אמת'.\",\n urlRequestError: \"הבקשה החזירה את השגיאה '{0}'. {1}\",\n urlGetChoicesError: \"הבקשה החזירה נתונים ריקים או שהמאפיין 'נתיב' שגוי\",\n exceedMaxSize: \"גודל הקובץ לא יעלה על {0}.\",\n otherRequiredError: 'נא להזין נתונים בשדה \"אחר\"',\n uploadingFile: \"הקובץ שלך נטען. המתן מספר שניות ונסה שוב.\",\n loadingFile: \"טוען...\",\n chooseFile: \"לבחור קבצים...\",\n noFileChosen: \"לא נבחר קובץ\",\n confirmDelete: \"האם אתה רוצה למחוק את הרשומה?\",\n keyDuplicationError: \"ערך זה צריך להיות ייחודי.\",\n addColumn: \"הוסף עמודה\",\n addRow: \"להוסיף שורה\",\n removeRow: \"לְהַסִיר\",\n addPanel: \"הוסף חדש\",\n removePanel: \"לְהַסִיר\",\n choices_Item: \"פריט\",\n matrix_column: \"טור\",\n matrix_row: \"שׁוּרָה\",\n savingData: \"התוצאות נשמרות בשרת ...\",\n savingDataError: \"אירעה שגיאה ולא הצלחנו לשמור את התוצאות.\",\n savingDataSuccess: \"התוצאות נשמרו בהצלחה!\",\n saveAgainButton: \"נסה שוב\",\n timerMin: \"דקה\",\n timerSec: \"שניות\",\n timerSpentAll: \"הוצאת {0} בדף זה ובסך הכל {1}.\",\n timerSpentPage: \"הוצאת {0} בדף זה.\",\n timerSpentSurvey: \"הוצאת סכום כולל של {0}.\",\n timerLimitAll: \"הוצאת {0} מתוך {1} בדף זה ו- {2} מתוך {3} בסך הכל.\",\n timerLimitPage: \"הוצאת {0} מתוך {1} בדף זה.\",\n timerLimitSurvey: \"הוצאת סכום כולל של {0} מתוך {1}.\",\n cleanCaption: \"לְנַקוֹת\",\n clearCaption: \"ברור\",\n chooseFileCaption: \"בחר קובץ\",\n removeFileCaption: \"הסר קובץ זה\",\n booleanCheckedLabel: \"כן\",\n booleanUncheckedLabel: \"לא\",\n confirmRemoveFile: \"האם אתה בטוח שברצונך להסיר קובץ זה: {0}?\",\n confirmRemoveAllFiles: \"האם אתה בטוח שברצונך להסיר את כל הקבצים?\",\n questionTitlePatternText: \"כותרת שאלה\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"he\"] = hebrewSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"he\"] = \"עברית\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/hindi.ts\":\n/*!***********************************!*\\\n !*** ./src/localization/hindi.ts ***!\n \\***********************************/\n/*! exports provided: hindiStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hindiStrings\", function() { return hindiStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar hindiStrings = {\n pagePrevText: \"पिछला\",\n pageNextText: \"अगला\",\n completeText: \"पूरा\",\n previewText: \"पूर्वसमीक्षा\",\n editText: \"संपादित\",\n startSurveyText: \"शुरू\",\n otherItemText: \"दूसरा (वर्णन करें)\",\n noneItemTex: \"कोई नहीं\",\n selectAllItemText: \"सभी का चयन करें\",\n progressText: \"पृष्ठ 1 में से 0\",\n panelDynamicProgressText: \" दस्तावेज {1} के {0}\",\n questionsProgressText: \"{1} सवालों में से {0} के जवाब दिए\",\n emptySurvey: \"सर्वेक्षण में कोई दृश्यमान पृष्ठ या प्रश्न नहीं है\",\n completingSurvey: \"सर्वेक्षण को पूरा करने के लिए धन्यवाद\",\n completingSurveyBefore: \" हमारे रिकॉर्ड बताते हैं कि आप पहले ही इस सर्वेक्षण को पूरा कर चुके हैं\",\n loadingSurvey: \"सर्वेक्षण खुल रहा है.…\",\n optionsCaption: \"चुनें\",\n value: \"मूल्य\",\n requiredError: \"कृपया प्रश्न का उत्तर दें\",\n requiredErrorInPanel: \"कृपया कम से कम एक प्रश्न का उत्तर दें\",\n requiredInAllRowsError: \"कृपया सभी पंक्तियों में सवालों के जवाब दें\",\n numericError: \"मूल्य संख्यात्मक होना चाहिए\",\n textMinLength: \"कृपया कम से कम {0} वर्ण दर्ज करें\",\n textMaxLength: \"कृपया {0} से कम वर्ण दर्ज करें\",\n textMinMaxLength: \"कृपया {0} से अधिक और {1} से कम पात्रों में प्रवेश करें\",\n minRowCountError: \"कृपया कम से कम {0} पंक्तियों को भरें\",\n minSelectError: \"कृपया कम से कम {0} विकल्प का चयन करें\",\n maxSelectError: \"कृपया {0} विकल्पों से अधिक नहीं चुनें\",\n numericMinMax: \"'{0}' {1} से बराबर या अधिक और {2} से बराबर या कम होना चाहिए\",\n numericMin: \"'{0}' {1} से बराबर या अधिक होना चाहिए\",\n numericMax: \"'{0}' {1} से बराबर या कम होना चाहिए\",\n invalidEmail: \"कृपया एक वैध ईमेल पता दर्ज करें\",\n invalidExpression: \"अभिव्यक्ति: {0} को ' सच ' लौटना चाहिए\",\n urlRequestError: \"अनुरोध लौटाया त्रुटि '{0}' . {1}\",\n urlGetChoicesError: \"अनुरोध ने खाली डेटा वापस कर दिया है \",\n exceedMaxSize: \"फ़ाइल का आकार {0} से अधिक नहीं होना चाहिए या फिर 'पाथ' प्रॉपर्टी गलत है\",\n otherRequiredError: \"कृपया दूसरा मूल्य दर्ज करें\",\n uploadingFile: \"आपकी फाइल अपलोड हो रही है। कृपया कई सेकंड इंतजार करें और फिर से प्रयास करें।\",\n loadingFile: \"लोडिंग\",\n chooseFile: \"फ़ाइल चुनें\",\n noFileChosen: \"कोई फाइल नहीं चुनी गई\",\n confirmDelete: \"क्या आप रिकॉर्ड हटाना चाहते हैं\",\n keyDuplicationError: \"यह मान अनोखा होना चाहिए\",\n addColumn: \"कॉलम जोड़ें\",\n addRow: \"पंक्ति जोड़ें\",\n removeRow: \"हटाए\",\n addPanel: \"नया जोड़ें\",\n removePanel: \"हटाए\",\n choices_Item: \"मद\",\n matrix_column: \"कॉलम\",\n matrix_row: \"पंक्ति\",\n savingData: \"परिणाम सर्वर पर सेव हो रहे हैं\",\n savingDataError: \"एक त्रुटि हुई और हम परिणामों को नहीं सेव कर सके\",\n savingDataSuccess: \"परिणाम सफलतापूर्वक सेव हो गए\",\n saveAgainButton: \"फिर कोशिश करो\",\n timerMin: \"मिनट\",\n timerSec: \"सेकंड\",\n timerSpentAll: \"आपने इस पृष्ठ पर {0} खर्च किए हैं और कुल {1}\",\n timerSpentPage: \"आपने इस पृष्ठ पर {0} खर्च किया है\",\n timerSpentSurvey: \"आपने कुल {0} खर्च किया है\",\n timerLimitAll: \"आपने इस पृष्ठ पर {1} की {0} और कुल {3} की {2} खर्च की है।\",\n timerLimitPage: \"आपने इस पृष्ठ पर {1} का {0} खर्च किया है\",\n timerLimitSurvey: \"आपने कुल {1} की {0} खर्च की है\",\n cleanCaption: \"साफ\",\n clearCaption: \"स्पष्ट\",\n chooseFileCaption: \"फ़ाइल चुनें\",\n removeFileCaption: \"इस फाइल को निकालें\",\n booleanCheckedLabel: \"हाँ\",\n booleanUncheckedLabel: \"नहीं\",\n confirmRemoveFile: \"क्या आप सुनिश्चित हैं कि आप इस फ़ाइल को हटाना चाहते हैं: {0}\",\n confirmRemoveAllFiles: \"क्या आप सुनिश्चित हैं कि आप सभी फ़ाइलों को हटाना चाहते हैं\",\n questionTitlePatternText: \"प्रश्न का शीर्षक\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"hi\"] = hindiStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"hi\"] = \"hindi\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/hungarian.ts\":\n/*!***************************************!*\\\n !*** ./src/localization/hungarian.ts ***!\n \\***************************************/\n/*! exports provided: hungarianSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"hungarianSurveyStrings\", function() { return hungarianSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar hungarianSurveyStrings = {\n pagePrevText: \"Vissza\",\n pageNextText: \"Tovább\",\n completeText: \"Kész\",\n previewText: \"Előnézet\",\n editText: \"Szerkesztés\",\n startSurveyText: \"Rajt\",\n otherItemText: \"Egyéb (adja meg)\",\n noneItemText: \"Egyik sem\",\n selectAllItemText: \"Mindet kiválaszt\",\n progressText: \"{0}./{1} oldal\",\n panelDynamicProgressText: \"{0} / {1} rekord\",\n questionsProgressText: \"Válaszolt kérdések: {0} / {1}\",\n emptySurvey: \"There is no visible page or question in the survey.\",\n completingSurvey: \"Köszönjük, hogy kitöltötte felmérésünket!\",\n completingSurveyBefore: \"Már kitöltötte a felmérést.\",\n loadingSurvey: \"Felmérés betöltése...\",\n optionsCaption: \"Válasszon...\",\n value: \"érték\",\n requiredError: \"Kérjük, válaszolja meg ezt a kérdést!\",\n requiredErrorInPanel: \"Kérjük, válaszoljon legalább egy kérdésre.\",\n requiredInAllRowsError: \"Kérjük adjon választ minden sorban!\",\n numericError: \"Az érték szám kell, hogy legyen!\",\n textMinLength: \"Adjon meg legalább {0} karaktert!\",\n textMaxLength: \"Legfeljebb {0} karaktert adjon meg!\",\n textMinMaxLength: \"Adjon meg legalább {0}, de legfeljebb {1} karaktert!\",\n minRowCountError: \"Töltsön ki minimum {0} sort!\",\n minSelectError: \"Válasszon ki legalább {0} lehetőséget!\",\n maxSelectError: \"Ne válasszon többet, mint {0} lehetőség!\",\n numericMinMax: \"'{0}' legyen nagyobb, vagy egyenlő, mint {1} és kisebb, vagy egyenlő, mint {2}!\",\n numericMin: \"'{0}' legyen legalább {1}!\",\n numericMax: \"The '{0}' ne legyen nagyobb, mint {1}!\",\n invalidEmail: \"Adjon meg egy valós email címet!\",\n invalidExpression: \"A következő kifejezés: {0} vissza kell adnia az „igaz” értéket.\",\n urlRequestError: \"A lekérdezés hibával tért vissza: '{0}'. {1}\",\n urlGetChoicesError: \"A lekérdezés üres adattal tért vissza, vagy a 'path' paraméter helytelen.\",\n exceedMaxSize: \"A méret nem lehet nagyobb, mint {0}.\",\n otherRequiredError: \"Adja meg az egyéb értéket!\",\n uploadingFile: \"Feltöltés folyamatban. Várjon pár másodpercet, majd próbálja újra.\",\n loadingFile: \"Betöltés...\",\n chooseFile: \"Fájlok kiválasztása ...\",\n noFileChosen: \"Nincs kiválasztva fájl\",\n confirmDelete: \"Törli ezt a rekordot?\",\n keyDuplicationError: \"Az értéknek egyedinek kell lennie.\",\n addColumn: \"Oszlop hozzáadása\",\n addRow: \"Sor hozzáadása\",\n removeRow: \"Eltávolítás\",\n addPanel: \"Új hozzáadása\",\n removePanel: \"Eltávolítás\",\n choices_Item: \"elem\",\n matrix_column: \"Oszlop\",\n matrix_row: \"Sor\",\n savingData: \"Eredmény mentése a szerverre...\",\n savingDataError: \"Egy hiba folytán nem tudtuk elmenteni az eredményt.\",\n savingDataSuccess: \"Eredmény sikeresen mentve!\",\n saveAgainButton: \"Próbálja újra\",\n timerMin: \"min\",\n timerSec: \"sec\",\n timerSpentAll: \"Ön {0} összeget költött ezen az oldalon, és összesen {1}.\",\n timerSpentPage: \"{0} összeget költött ezen az oldalon.\",\n timerSpentSurvey: \"Összesen {0} költött.\",\n timerLimitAll: \"Ön {0} / {1} összeget költött ezen az oldalon, és összesen {2} / {3}.\",\n timerLimitPage: \"Ön {0} / {1} összeget költött ezen az oldalon.\",\n timerLimitSurvey: \"Összesen {0} / {1} összeget költött el.\",\n cleanCaption: \"Tiszta\",\n clearCaption: \"Egyértelmű\",\n chooseFileCaption: \"Válassz fájlt\",\n removeFileCaption: \"Távolítsa el ezt a fájlt\",\n booleanCheckedLabel: \"Igen\",\n booleanUncheckedLabel: \"Nem\",\n confirmRemoveFile: \"Biztosan eltávolítja ezt a fájlt: {0}?\",\n confirmRemoveAllFiles: \"Biztosan el akarja távolítani az összes fájlt?\",\n questionTitlePatternText: \"Kérdés címe\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"hu\"] = hungarianSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"hu\"] = \"magyar\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/icelandic.ts\":\n/*!***************************************!*\\\n !*** ./src/localization/icelandic.ts ***!\n \\***************************************/\n/*! exports provided: icelandicSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"icelandicSurveyStrings\", function() { return icelandicSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar icelandicSurveyStrings = {\n pagePrevText: \"Tilbaka\",\n pageNextText: \"Áfram\",\n completeText: \"Lokið\",\n previewText: \"Forskoða\",\n editText: \"Breyta\",\n startSurveyText: \"Byrjaðu\",\n otherItemText: \"Hinn (skýring)\",\n noneItemText: \"Enginn\",\n selectAllItemText: \"Velja allt\",\n progressText: \"Síða {0} of {1}\",\n panelDynamicProgressText: \"Taka upp {0} af {1}\",\n questionsProgressText: \"Svarað {0} / {1} spurningum\",\n emptySurvey: \"Það er enginn síða eða spurningar í þessari könnun.\",\n completingSurvey: \"Takk fyrir að fyllja út þessa könnun!\",\n completingSurveyBefore: \"Skrár okkar sýna að þú hefur þegar lokið þessari könnun.\",\n loadingSurvey: \"Könnunin er að hlaða...\",\n optionsCaption: \"Veldu...\",\n value: \"gildi\",\n requiredError: \"Vinsamlegast svarið spurningunni.\",\n requiredErrorInPanel: \"Vinsamlegast svaraðu að minnsta kosti einni spurningu.\",\n requiredInAllRowsError: \"Vinsamlegast svarið spurningum í öllum röðum.\",\n numericError: \"Þetta gildi verður að vera tala.\",\n textMinLength: \"Það ætti að vera minnst {0} tákn.\",\n textMaxLength: \"Það ætti að vera mest {0} tákn.\",\n textMinMaxLength: \"Það ætti að vera fleiri en {0} og færri en {1} tákn.\",\n minRowCountError: \"Vinsamlegast fyllið úr að minnsta kosti {0} raðir.\",\n minSelectError: \"Vinsamlegast veljið að minnsta kosti {0} möguleika.\",\n maxSelectError: \"Vinsamlegast veljið ekki fleiri en {0} möguleika.\",\n numericMinMax: \"'{0}' ætti að vera meira en eða jafnt og {1} minna en eða jafnt og {2}\",\n numericMin: \"{0}' ætti að vera meira en eða jafnt og {1}\",\n numericMax: \"'{0}' ætti að vera minna en eða jafnt og {1}\",\n invalidEmail: \"Vinsamlegast sláið inn gilt netfang.\",\n invalidExpression: \"Tjáningin: {0} ætti að skila 'satt'.\",\n urlRequestError: \"Beiðninn skilaði eftirfaranadi villu '{0}'. {1}\",\n urlGetChoicesError: \"Beiðninng skilaði engum gögnum eða slóðinn var röng\",\n exceedMaxSize: \"Skráinn skal ekki vera stærri en {0}.\",\n otherRequiredError: \"Vinamlegast fyllið út hitt gildið.\",\n uploadingFile: \"Skráinn þín var send. Vinsamlegast bíðið í nokkrar sekúndur og reynið aftur.\",\n loadingFile: \"Hleður ...\",\n chooseFile: \"Veldu skrár ...\",\n noFileChosen: \"Engin skrá valin\",\n confirmDelete: \"Viltu eyða skránni?\",\n keyDuplicationError: \"Þetta gildi ætti að vera einstakt.\",\n addColumn: \"Bæta við dálki\",\n addRow: \"Bæta við röð\",\n removeRow: \"Fjarlægja\",\n addPanel: \"Bæta við nýju\",\n removePanel: \"Fjarlægðu\",\n choices_Item: \"hlutur\",\n matrix_column: \"Dálkur\",\n matrix_row: \"Röð\",\n savingData: \"Niðurstöðurnar eru að spara á netþjóninum ... \",\n savingDataError: \"Villa kom upp og við gátum ekki vistað niðurstöðurnar.\",\n savingDataSuccess: \"Árangurinn var vistaður með góðum árangri!\",\n saveAgainButton: \"Reyndu aftur\",\n timerMin: \"mín\",\n timerSec: \"sek\",\n timerSpentAll: \"Þú hefur eytt {0} á þessari síðu og {1} samtals.\",\n timerSpentPage: \"Þú hefur eytt {0} á þessari síðu.\",\n timerSpentSurvey: \"Þú hefur eytt {0} samtals.\",\n timerLimitAll: \"Þú hefur eytt {0} af {1} á þessari síðu og {2} af {3} samtals.\",\n timerLimitPage: \"Þú hefur eytt {0} af {1} á þessari síðu.\",\n timerLimitSurvey: \"Þú hefur eytt {0} af {1} samtals.\",\n cleanCaption: \"Hreint\",\n clearCaption: \"Hreinsa\",\n chooseFileCaption: \"Veldu skrá\",\n removeFileCaption: \"Fjarlægðu þessa skrá\",\n booleanCheckedLabel: \"Já\",\n booleanUncheckedLabel: \"Nei\",\n confirmRemoveFile: \"Ertu viss um að þú viljir fjarlægja þessa skrá: {0}?\",\n confirmRemoveAllFiles: \"Ertu viss um að þú viljir fjarlægja allar skrár?\",\n questionTitlePatternText: \"Spurningartitill\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"is\"] = icelandicSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"is\"] = \"íslenska\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/indonesian.ts\":\n/*!****************************************!*\\\n !*** ./src/localization/indonesian.ts ***!\n \\****************************************/\n/*! exports provided: indonesianStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"indonesianStrings\", function() { return indonesianStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar indonesianStrings = {\n pagePrevText: \"Sebelumnya\",\n pageNextText: \"Selanjutnya\",\n completeText: \"Selesai\",\n previewText: \"Pratinjau\",\n editText: \"Sunting\",\n startSurveyText: \"Mulai\",\n otherItemText: \"Lainnya (jelaskan)\",\n noneItemText: \"Tidak Ada\",\n selectAllItemText: \"Pilih Semua\",\n progressText: \"Halaman {0} dari {1}\",\n panelDynamicProgressText: \"Rekam {0} dari {1}\",\n questionsProgressText: \"Menjawab pertanyaan {0} / {1}\",\n emptySurvey: \"Tidak ada halaman atau pertanyaan dalam survei.\",\n completingSurvey: \"Terima kasih telah menyelesaikan survei!\",\n completingSurveyBefore: \"Catatan kami menunjukkan bahwa Anda telah menyelesaikan survei ini.\",\n loadingSurvey: \"Memuat survei...\",\n optionsCaption: \"Pilih...\",\n value: \"nilai\",\n requiredError: \"Silahkan jawab pertanyaan berikut.\",\n requiredErrorInPanel: \"Silahkan jawab setidaknya satu petanyaan.\",\n requiredInAllRowsError: \"Silahkan jawab pertanyaan pada semua baris.\",\n numericError: \"Nilai harus berupa angka.\",\n textMinLength: \"Silahkan masukkan setidaknya {0} karakter.\",\n textMaxLength: \"Silahkan masukkan kurang {0} karakter.\",\n textMinMaxLength: \"PSilahkan masukkan lebih dari {0} dan kurang dari {1} karakter.\",\n minRowCountError: \"Silahkan isi setidaknya {0} baris.\",\n minSelectError: \"Silahkan pilih setidaknya {0} varian.\",\n maxSelectError: \"Silahkan pilih tidak lebih dari {0} varian.\",\n numericMinMax: \"'{0}' harus sama dengan atau lebih dari {1} dan harus sama dengan atau kurang dari {2}\",\n numericMin: \"'{0}' harus sama dengan atau lebih dari {1}\",\n numericMax: \"'{0}' harus sama dengan atau kurang dari {1}\",\n invalidEmail: \"Silahkan masukkan e-mail yang benar.\",\n invalidExpression: \"Ekspresi: {0} harus mengembalikan 'benar'.\",\n urlRequestError: \"Permintaan mengembalikan kesalahan '{0}'. {1}\",\n urlGetChoicesError: \"Permintaan mengembalikan data kosong atau properti 'path' salah.\",\n exceedMaxSize: \"Ukuran berkas tidak boleh melebihi {0}.\",\n otherRequiredError: \"Silahkan masukkan nilai lainnnya.\",\n uploadingFile: \"Berkas Anda sedang diunggah. Silahkan tunggu beberapa saat atau coba lagi.\",\n loadingFile: \"Memuat...\",\n chooseFile: \"Pilih berkas...\",\n noFileChosen: \"Tidak ada file yang dipilih\",\n confirmDelete: \"Apakah Anda ingin menghapus catatan?\",\n keyDuplicationError: \"Nilai harus unik.\",\n addColumn: \"Tambah kolom\",\n addRow: \"Tambah baris\",\n removeRow: \"Hapus\",\n addPanel: \"Tambah baru\",\n removePanel: \"Hapus\",\n choices_Item: \"item\",\n matrix_column: \"Kolom\",\n matrix_row: \"Baris\",\n savingData: \"Hasil sedang disimpan pada server...\",\n savingDataError: \"Kesalahan terjadi dan kami tidak dapat menyimpan hasil.\",\n savingDataSuccess: \"Hasil telah sukses disimpan!\",\n saveAgainButton: \"Coba lagi\",\n timerMin: \"menit\",\n timerSec: \"detik\",\n timerSpentAll: \"Anda telah menghabiskan {0} pada halaman ini dan {1} secara keseluruhan.\",\n timerSpentPage: \"YAnda telah menghabiskan {0} pada halaman ini.\",\n timerSpentSurvey: \"Anda telah menghabiskan {0} secara keseluruhan.\",\n timerLimitAll: \"Anda telah menghabiskan {0} dari {1} pada halaman ini dan {2} dari {3} secara keseluruhan.\",\n timerLimitPage: \"Anda telah menghabiskan {0} dari {1} pada halaman ini.\",\n timerLimitSurvey: \"Anda telah menghabiskan {0} dari {1} secara keseluruhan.\",\n cleanCaption: \"Bersihkan\",\n clearCaption: \"Bersihkan\",\n chooseFileCaption: \"Pilih File\",\n removeFileCaption: \"Hapus berkas ini\",\n booleanCheckedLabel: \"Iya\",\n booleanUncheckedLabel: \"Tidak\",\n confirmRemoveFile: \"Anda yakin ingin menghapus file ini: {0}?\",\n confirmRemoveAllFiles: \"Anda yakin ingin menghapus semua file?\",\n questionTitlePatternText: \"Judul pertanyaan\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"id\"] = indonesianStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"id\"] = \"bahasa Indonesia\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/italian.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/italian.ts ***!\n \\*************************************/\n/*! exports provided: italianSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"italianSurveyStrings\", function() { return italianSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar italianSurveyStrings = {\n pagePrevText: \"Precedente\",\n pageNextText: \"Successivo\",\n completeText: \"Salva\",\n previewText: \"Anteprima\",\n editText: \"Modifica\",\n startSurveyText: \"Inizio\",\n otherItemText: \"Altro (descrivi)\",\n noneItemText: \"Nessuno\",\n selectAllItemText: \"Seleziona tutti\",\n progressText: \"Pagina {0} di {1}\",\n panelDynamicProgressText: \"Record di {0} di {1}\",\n questionsProgressText: \"Risposte a {0}/{1} domande\",\n emptySurvey: \"Non ci sono pagine o domande visibili nel questionario.\",\n completingSurvey: \"Grazie per aver completato il questionario!\",\n completingSurveyBefore: \"I nostri records mostrano che hai già completato questo questionario.\",\n loadingSurvey: \"Caricamento del questionario in corso...\",\n optionsCaption: \"Scegli...\",\n value: \"valore\",\n requiredError: \"Campo obbligatorio\",\n requiredErrorInPanel: \"Per Favore, rispondi ad almeno una domanda.\",\n requiredInAllRowsError: \"Completare tutte le righe\",\n numericError: \"Il valore deve essere numerico\",\n textMinLength: \"Inserire almeno {0} caratteri\",\n textMaxLength: \"Lunghezza massima consentita {0} caratteri\",\n textMinMaxLength: \"Inserire una stringa con minimo {0} e massimo {1} caratteri\",\n minRowCountError: \"Completare almeno {0} righe.\",\n minSelectError: \"Selezionare almeno {0} varianti.\",\n maxSelectError: \"Selezionare massimo {0} varianti.\",\n numericMinMax: \"'{0}' deve essere uguale o superiore a {1} e uguale o inferiore a {2}\",\n numericMin: \"'{0}' deve essere uguale o superiore a {1}\",\n numericMax: \"'{0}' deve essere uguale o inferiore a {1}\",\n invalidEmail: \"Inserire indirizzo mail valido\",\n invalidExpression: \"L'espressione: {0} dovrebbe tornare 'vero'.\",\n urlRequestError: \"La richiesta ha risposto con un errore '{0}'. {1}\",\n urlGetChoicesError: \"La richiesta ha risposto null oppure il percorso non è corretto\",\n exceedMaxSize: \"Il file non può eccedere {0}\",\n otherRequiredError: \"Inserire il valore 'altro'\",\n uploadingFile: \"File in caricamento. Attendi alcuni secondi e riprova\",\n loadingFile: \"Caricamento...\",\n chooseFile: \"Selezionare file(s)...\",\n noFileChosen: \"Nessun file selezionato\",\n confirmDelete: \"Sei sicuro di voler elminare il record?\",\n keyDuplicationError: \"Questo valore deve essere univoco.\",\n addColumn: \"Aggiungi colonna\",\n addRow: \"Aggiungi riga\",\n removeRow: \"Rimuovi riga\",\n addPanel: \"Aggiungi riga\",\n removePanel: \"Elimina\",\n choices_Item: \"Elemento\",\n matrix_column: \"Colonna\",\n matrix_row: \"Riga\",\n savingData: \"Salvataggio dati sul server...\",\n savingDataError: \"Si è verificato un errore e non è stato possibile salvare i risultati.\",\n savingDataSuccess: \"I risultati sono stati salvati con successo!\",\n saveAgainButton: \"Riprova\",\n timerMin: \"min\",\n timerSec: \"sec\",\n timerSpentAll: \"Hai impiegato {0} su questa pagina e {1} in totale.\",\n timerSpentPage: \"Hai impiegato {0} su questa pagina.\",\n timerSpentSurvey: \"Hai impiegato {0} in totale.\",\n timerLimitAll: \"Hai impiegato {0} di {1} su questa pagina e {2} di {3} in totale.\",\n timerLimitPage: \"Hai impiegato {0} di {1} su questa pagina.\",\n timerLimitSurvey: \"Hai impiegato {0} di {1} in totale.\",\n cleanCaption: \"Pulisci\",\n clearCaption: \"Cancella\",\n chooseFileCaption: \"Scegliere il file\",\n removeFileCaption: \"Rimuovere questo file\",\n booleanCheckedLabel: \"Sì\",\n booleanUncheckedLabel: \"No\",\n confirmRemoveFile: \"Sei sicuro di voler elminare questo file: {0}?\",\n confirmRemoveAllFiles: \"Sei sicuro di voler elminare tutti i files?\",\n questionTitlePatternText: \"Titolo della domanda\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"it\"] = italianSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"it\"] = \"italiano\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/japanese.ts\":\n/*!**************************************!*\\\n !*** ./src/localization/japanese.ts ***!\n \\**************************************/\n/*! exports provided: japaneseSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"japaneseSurveyStrings\", function() { return japaneseSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar japaneseSurveyStrings = {\n pagePrevText: \"前へ\",\n pageNextText: \"次へ\",\n completeText: \"完了\",\n previewText: \"プレビュー\",\n editText: \"編集\",\n startSurveyText: \"スタート\",\n otherItemText: \"その他(説明)\",\n noneItemText: \"なし\",\n selectAllItemText: \"すべて選択\",\n progressText: \"{0}/{1}頁\",\n panelDynamicProgressText: \"{1}の{0}を記録する\",\n questionsProgressText: \"{0}/{1}の質問に回答しました。\",\n emptySurvey: \"この調査に表示できるページや質問はありません\",\n completingSurvey: \"調査を完了してくれてありがとうございました\",\n completingSurveyBefore: \"当社の記録によると、この調査はすでに完了しています。\",\n loadingSurvey: \"調査をダウンロード中\",\n optionsCaption: \"選択\",\n value: \"値打ち\",\n requiredError: \"質問にお答え下さい\",\n requiredErrorInPanel: \"最低でも1つの質問に答えてください。\",\n requiredInAllRowsError: \"質問には全列で回答してください。\",\n numericError: \"数字でご記入下さい\",\n textMinLength: \"{0} 文字以上で入力して下さい\",\n textMaxLength: \"{0}文字以下で入力してください。\",\n textMinMaxLength: \"{0}以上{1}未満の文字を入力してください。\",\n minRowCountError: \"{0}行以上で入力して下さい\",\n minSelectError: \"{0}種類以上を選択して下さい\",\n maxSelectError: \"{0}以上のバリアントを選択しないでください。\",\n numericMinMax: \"{0}は{1}以上であり、{2}以下であることが望ましい。\",\n numericMin: \"'{0}' は同等か{1}より大きくなければなりません\",\n numericMax: \"'{0}' は同等か{1}より小さくなければなりません\",\n invalidEmail: \"有効なメールアドレスをご記入下さい\",\n invalidExpression: \"式は {0}は'true'を返すべきです。\",\n urlRequestError: \"リクエストはエラー '{0}' を返しました。{1}\",\n urlGetChoicesError: \"リクエストが空のデータを返したか、'path' プロパティが正しくありません。\",\n exceedMaxSize: \"ファイルのサイズは{0}を超えてはいけません\",\n otherRequiredError: \"その他の値を入力してください。\",\n uploadingFile: \"ファイルをアップロード中です。しばらくしてから再度お試し下さい\",\n loadingFile: \"読み込み中\",\n chooseFile: \"ファイルを選択\",\n noFileChosen: \"選択されたファイルはありません\",\n confirmDelete: \"レコードを削除しますか?\",\n keyDuplicationError: \"この値は一意でなければなりません。\",\n addColumn: \"列の追加\",\n addRow: \"追加行\",\n removeRow: \"除去\",\n addPanel: \"新規追加\",\n removePanel: \"除去\",\n choices_Item: \"品目\",\n matrix_column: \"コラム\",\n matrix_row: \"行\",\n savingData: \"結果はサーバーに保存されています...。\",\n savingDataError: \"エラーが発生し、結果を保存できませんでした。\",\n savingDataSuccess: \"結果は無事に保存されました\",\n saveAgainButton: \"もう一度試してみてください。\",\n timerMin: \"僅少\",\n timerSec: \"セック\",\n timerSpentAll: \"あなたはこのページに{0}を費やし、合計で{1}を費やしました。\",\n timerSpentPage: \"あなたはこのページに{0}を費やしました。\",\n timerSpentSurvey: \"合計で{0}を使ったことになります。\",\n timerLimitAll: \"このページに{1}のうち{0}を費やし、{3}のうち{2}を合計で費やしました。\",\n timerLimitPage: \"このページで{1}の{0}を使ったことがあります。\",\n timerLimitSurvey: \"合計で{1}の{0}を使ったことがあります。\",\n cleanCaption: \"削除\",\n clearCaption: \"空白\",\n chooseFileCaption: \"ファイルを選択\",\n removeFileCaption: \"このファイルを削除\",\n booleanCheckedLabel: \"噫\",\n booleanUncheckedLabel: \"否\",\n confirmRemoveFile: \"このファイルを削除してもよろしいですか?{0}?\",\n confirmRemoveAllFiles: \"すべてのファイルを削除してもよろしいですか?\",\n questionTitlePatternText: \"質問名\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"ja\"] = japaneseSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"ja\"] = \"日本語\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/kazakh.ts\":\n/*!************************************!*\\\n !*** ./src/localization/kazakh.ts ***!\n \\************************************/\n/*! exports provided: kazakhStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"kazakhStrings\", function() { return kazakhStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar kazakhStrings = {\n pagePrevText: \"Артқа\",\n pageNextText: \"Келесі\",\n completeText: \"Дайын\",\n previewText: \"Алдын ала қарау\",\n editText: \"Редакциялау\",\n startSurveyText: \"Бастау\",\n otherItemText: \"Басқа (өтінеміз, жазыңыз)\",\n noneItemText: \"Жоқ\",\n selectAllItemText: \"Барлығын таңдау\",\n progressText: \"{0} ден {1} бет \",\n panelDynamicProgressText: \"{0} ден {1} жазба\",\n questionsProgressText: \"{0}/{1} сұрақтарға жауап\",\n emptySurvey: \"Бір де бір сұрақ жоқ.\",\n completingSurvey: \"Сауалнаманы толтырғаныңыз үшін рахмет!\",\n completingSurveyBefore: \"Сіз бұл сауалнаманы өтіп қойдыңыз.\",\n loadingSurvey: \"Серверден жүктеу...\",\n optionsCaption: \"Таңдау...\",\n value: \"мәні\",\n requiredError: \"Өтінеміз, сұраққа жауап беріңіз.\",\n requiredErrorInPanel: \"Өтінеміз, кем дегенде бір сұраққа жауап беріңіз.\",\n requiredInAllRowsError: \"Өтінеміз, әрбір жолдың сұрағаны жауап беріңіз.\",\n numericError: \"Жауап сан түрінде болуы керек.\",\n textMinLength: \"Өтінеміз, {0} ден көп таңба енгізіңіз.\",\n textMaxLength: \"Өтінеміз, {0} ден аз таңба енгізіңіз.\",\n textMinMaxLength: \"Өтінеміз, {0} аз және {1} көп таңба енгізіңіз.\",\n minRowCountError: \"Өтінеміз, {0} ден кем емес жол толтырыңыз.\",\n minSelectError: \"Өтінеміз, тым болмаса {0} нұсқа таңдаңыз.\",\n maxSelectError: \"Өтінеміз, {0} нұсқадан көп таңдамаңыз.\",\n numericMinMax: \"'{0}' {1} ден кем емес және {2} ден көп емес болу керек\",\n numericMin: \"'{0}' {1} ден кем емес болу керек\",\n numericMax: \"'{0}' {1} ден көп емес болу керек\",\n invalidEmail: \"Өтінеміз, жарамды электрондық поштаңызды енгізіңіз.\",\n invalidExpression: \"{0} өрнегі 'true' қайтару керек.\",\n urlRequestError: \"Сұратым қателікті қайтарды'{0}'. {1}\",\n urlGetChoicesError: \"Сұратымға жауап бос келді немесе 'path' қасиеті қате көрсетілген \",\n exceedMaxSize: \"Файлдың мөлшері {0} аспау керек.\",\n otherRequiredError: \"Өтінеміз, “Басқа” жолына деректі енгізіңіз\",\n uploadingFile: \"Сіздің файлыңыз жүктеліп жатыр. Бірнеше секунд тосып, қайтадан байқап көріңіз.\",\n loadingFile: \"Жүктеу...\",\n chooseFile: \"Файлдарды таңдаңыз...\",\n noFileChosen: \"Файл таңдалынбады\",\n confirmDelete: \"Сіз жазбаны жоятыныңызға сенімдісіз бе?\",\n keyDuplicationError: \"Бұл мән бірегей болу керек.\",\n addColumn: \"Бағана қосу\",\n addRow: \"Жолды қосу\",\n removeRow: \"Өшіру\",\n addPanel: \"Жаңа қосу\",\n removePanel: \"Өшіру\",\n choices_Item: \"Нұсқа\",\n matrix_column: \"Бағана\",\n matrix_row: \"Жол\",\n savingData: \"Нәтижелер серверде сақталады...\",\n savingDataError: \"Қателік туындады, нәтиже сақталынбады.\",\n savingDataSuccess: \"Нәтиже ойдағыдай сақталды!\",\n saveAgainButton: \"Қайтадан байқап көру\",\n timerMin: \"мин\",\n timerSec: \"сек\",\n timerSpentAll: \"Сіз бұл бетте {0} кетірдіңіз және барлығы {1}.\",\n timerSpentPage: \"Сіз бұл бетте {0} кетірдіңіз.\",\n timerSpentSurvey: \"Сіз сауалнама кезінде {0} кетірдіңіз.\",\n timerLimitAll: \"Сіз бұл бетте {0} ден {1} кетірдіңіз және {2} ден {3} бүкіл сауалнама үшін.\",\n timerLimitPage: \"Сіз бұл бетте {0} ден {1} кетірдіңіз.\",\n timerLimitSurvey: \"Сіз бүкіл сауалнама үшін {0} ден {1} кетірдіңіз \",\n cleanCaption: \"Тазалау\",\n clearCaption: \"Тазалау\",\n chooseFileCaption: \"Файл таңдаңыз\",\n removeFileCaption: \"Файлды жойыңыз\",\n booleanCheckedLabel: \"Иә\",\n booleanUncheckedLabel: \"Жоқ\",\n confirmRemoveFile: \"Сіз бұл файлды жоятыныңызға сенімдісіз бе: {0}?\",\n confirmRemoveAllFiles: \"Сіз барлық файлдарды жоятыныңызға сенімдісіз бе?\",\n questionTitlePatternText: \"Сұрақтың атауы\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"kk\"] = kazakhStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"kk\"] = \"Kazakh\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/korean.ts\":\n/*!************************************!*\\\n !*** ./src/localization/korean.ts ***!\n \\************************************/\n/*! exports provided: koreanStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"koreanStrings\", function() { return koreanStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar koreanStrings = {\n pagePrevText: \"이전\",\n pageNextText: \"다음\",\n completeText: \"완료\",\n previewText: \"시사\",\n editText: \"편집하다\",\n startSurveyText: \"시작\",\n otherItemText: \"기타(설명)\",\n noneItemText: \"없음\",\n selectAllItemText: \"모두 선택\",\n progressText: \"페이지 {1} 중 {0}\",\n panelDynamicProgressText: \"{0} / {1} 기록\",\n questionsProgressText: \"{0} / {1} 개의 질문에 답변 함\",\n emptySurvey: \"설문지에 보여지는 페이지나 질문이 없습니다\",\n completingSurvey: \"설문 조사를 완료해 주셔서 감사합니다!\",\n completingSurveyBefore: \"기록에 따르면 이미 설문 조사를 마치셨습니다.\",\n loadingSurvey: \"설문조사가 로드중입니다...\",\n optionsCaption: \"선택하십시오...\",\n value: \"값\",\n requiredError: \"질문에 답하시오.\",\n requiredErrorInPanel: \"하나 이상의 질문에 답하십시오.\",\n requiredInAllRowsError: \"모든 행에 있는 질문에 답하십시오.\",\n numericError: \"값은 숫자여야 합니다.\",\n textMinLength: \"답변의 길이는 최소 {0}자여야 입니다.\",\n textMaxLength: \"답변의 길이는 {0}자를 초과 할 수 없습니다.\",\n textMinMaxLength: \"답변의 길이는 {0} - {1}자 사이여야 합니다.\",\n minRowCountError: \"최소 {0}개의 행을 채우십시오\",\n minSelectError: \"최소 {0}개의 변수를 선택하십시오.\",\n maxSelectError: \"최대 {0}개의 변수를 선택하십시오.\",\n numericMinMax: \"'{0}'은 {1}보다 크거나 같고 {2}보다 작거나 같아야합니다.\",\n numericMin: \"'{0}'은 {1}보다 크거나 같아야합니다.\",\n numericMax: \"'{0}'은 {1}보다 작거나 같아야합니다.\",\n invalidEmail: \"올바른 이메일 주소를 입력하십시오.\",\n invalidExpression: \"표현식: {0}은 '참'이어야 합니다.\",\n urlRequestError: \"'{0}'으로 잘못된 요청입니다. {1}\",\n urlGetChoicesError: \"비어있는 데이터를 요청했거나 잘못된 속성의 경로입니다.\",\n exceedMaxSize: \"파일 크기가 {0}을 초과 할 수 없습니다.\",\n otherRequiredError: \"다른 질문을 작성하십시오.\",\n uploadingFile: \"파일 업로드 중입니다. 잠시 후 다시 시도하십시오.\",\n loadingFile: \"로드 중...\",\n chooseFile: \"파일 선택...\",\n noFileChosen: \"선택된 파일이 없습니다\",\n confirmDelete: \"기록을 삭제하시겠습니까?\",\n keyDuplicationError: \" 이 값은 고유해야합니다.\",\n addColumn: \"열 추가\",\n addRow: \"행 추가\",\n removeRow: \"제거\",\n addPanel: \"새롭게 추가\",\n removePanel: \"제거\",\n choices_Item: \"항목\",\n matrix_column: \"열\",\n matrix_row: \"행\",\n savingData: \"결과가 서버에 저장 중입니다...\",\n savingDataError: \"오류가 발생하여 결과를 저장할 수 없습니다.\",\n savingDataSuccess: \"결과가 성공적으로 저장되었습니다!\",\n saveAgainButton: \"다시 시도하십시오\",\n timerMin: \"분\",\n timerSec: \"초\",\n timerSpentAll: \"현재 페이지에서 {0}을 소요해 총 {1}이 걸렸습니다.\",\n timerSpentPage: \"현재 페이지에서 {0]이 걸렸습니다\",\n timerSpentSurvey: \"총 {0}이 걸렸습니다.\",\n timerLimitAll: \"현재 페이지에서 {0}/{1}을 소요해 총 {2}/{3}이 걸렸습니다.\",\n timerLimitPage: \"현재 페이지에서 {0}/{1}이 걸렸습니다.\",\n timerLimitSurvey: \"총 {0}/{1}이 걸렸습니다.\",\n cleanCaption: \"닦기\",\n clearCaption: \"지우기\",\n chooseFileCaption: \"파일을 선택\",\n removeFileCaption: \"이 파일 제거\",\n booleanCheckedLabel: \"예\",\n booleanUncheckedLabel: \"아니\",\n confirmRemoveFile: \"{0} 파일을 제거 하시겠습니까?\",\n confirmRemoveAllFiles: \"모든 파일을 제거 하시겠습니까?\",\n questionTitlePatternText: \"질문 제목\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"ko\"] = koreanStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"ko\"] = \"한국어\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/latvian.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/latvian.ts ***!\n \\*************************************/\n/*! exports provided: latvianSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"latvianSurveyStrings\", function() { return latvianSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar latvianSurveyStrings = {\n pagePrevText: \"Atpakaļ\",\n pageNextText: \"Tālāk\",\n completeText: \"Pabeigt\",\n previewText: \"Priekšskatījums\",\n editText: \"Rediģēt\",\n startSurveyText: \"Sākt\",\n otherItemText: \"Cits (lūdzu, aprakstiet!)\",\n noneItemText: \"Nav\",\n selectAllItemText: \"Izvēlēties visus\",\n progressText: \"Lappuse {0} no {1}\",\n panelDynamicProgressText: \"Ierakstīt {0} no {1}\",\n questionsProgressText: \"Atbildēja uz jautājumiem {0} / {1}\",\n emptySurvey: \"Nav neviena jautājuma.\",\n completingSurvey: \"Pateicamies Jums par anketas aizpildīšanu!\",\n completingSurveyBefore: \"Mūsu ieraksti liecina, ka jūs jau esat aizpildījis šo aptauju.\",\n loadingSurvey: \"Ielāde no servera...\",\n optionsCaption: \"Izvēlēties...\",\n value: \"value\",\n requiredError: \"Lūdzu, atbildiet uz jautājumu!\",\n requiredErrorInPanel: \"Lūdzu, atbildiet uz vismaz vienu jautājumu.\",\n requiredInAllRowsError: \"Lūdzu, atbildiet uz jautājumiem visās rindās.\",\n numericError: \"Atbildei ir jābūt skaitlim.\",\n textMinLength: \"Lūdzu, ievadiet vismaz {0} simbolus.\",\n textMaxLength: \"Lūdzu, ievadiet mazāk nekā {0} rakstzīmes.\",\n textMinMaxLength: \"Lūdzu, ievadiet vairāk nekā {0} rakstzīmes un mazāk nekā {1} rakstzīmes.\",\n minRowCountError: \"Lūdzu, aizpildiet vismaz {0} rindas.\",\n minSelectError: \"Lūdzu, izvēlieties vismaz {0} variantu.\",\n maxSelectError: \"Lūdzu, izvēlieties ne vairak par {0} variantiem.\",\n numericMinMax: \"'{0}' jābūt vienādam vai lielākam nekā {1}, un vienādam vai mazākam, nekā {2}\",\n numericMin: \"'{0}' jābūt vienādam vai lielākam {1}\",\n numericMax: \"'{0}' jābūt vienādam vai lielākam {1}\",\n invalidEmail: \"Lūdzu, ievadiet patiesu e-pasta adresi!\",\n invalidExpression: \"Izteicienam: {0} jāatgriež “true”.\",\n urlRequestError: \"Pieprasījumā tika atgriezta kļūda “{0}”. {1}\",\n urlGetChoicesError: \"Pieprasījums atgrieza tukšus datus vai rekvizīts “path” ir nepareizs\",\n exceedMaxSize: \"Faila lielums nedrīkst pārsniegt {0}.\",\n otherRequiredError: \"Lūdzu, ievadiet datus laukā 'Cits'\",\n uploadingFile: \"Jūsu fails tiek augšupielādēts. Lūdzu, uzgaidiet vairākas sekundes un mēģiniet vēlreiz.\",\n loadingFile: \"Notiek ielāde ...\",\n chooseFile: \"Izvēlieties failus ...\",\n noFileChosen: \"Nav izvēlēts neviens fails\",\n confirmDelete: \"Vai vēlaties izdzēst ierakstu?\",\n keyDuplicationError: \"Šai vērtībai jābūt unikālai.\",\n addColumn: \"Pievienot kolonnu\",\n addRow: \"Pievienot rindu\",\n removeRow: \"Noņemt\",\n addPanel: \"Pievieno jaunu\",\n removePanel: \"Noņemt\",\n choices_Item: \"lieta\",\n matrix_column: \"Sleja\",\n matrix_row: \"Rinda\",\n savingData: \"Rezultāti tiek saglabāti serverī ...\",\n savingDataError: \"Radās kļūda, un mēs nevarējām saglabāt rezultātus.\",\n savingDataSuccess: \"Rezultāti tika veiksmīgi saglabāti!\",\n saveAgainButton: \"Mēģini vēlreiz\",\n timerMin: \"min\",\n timerSec: \"sek\",\n timerSpentAll: \"Šajā lapā esat iztērējis {0} un kopā {1}.\",\n timerSpentPage: \"Šajā lapā esat iztērējis {0}.\",\n timerSpentSurvey: \"Kopā esat iztērējis {0}.\",\n timerLimitAll: \"Šajā lapā esat iztērējis {0} no {1} un kopā {2} no {3}.\",\n timerLimitPage: \"Šajā lapā esat iztērējis {0} no {1}.\",\n timerLimitSurvey: \"Kopā esat iztērējis {0} no {1}.\",\n cleanCaption: \"Tīrs\",\n clearCaption: \"Skaidrs\",\n chooseFileCaption: \"Izvēlēties failu\",\n removeFileCaption: \"Noņemiet šo failu\",\n booleanCheckedLabel: \"Jā\",\n booleanUncheckedLabel: \"Nē\",\n confirmRemoveFile: \"Vai tiešām vēlaties noņemt šo failu: {0}?\",\n confirmRemoveAllFiles: \"Vai tiešām vēlaties noņemt visus failus?\",\n questionTitlePatternText: \"Jautājuma nosaukums\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"lv\"] = latvianSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"lv\"] = \"latviešu\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/lithuanian.ts\":\n/*!****************************************!*\\\n !*** ./src/localization/lithuanian.ts ***!\n \\****************************************/\n/*! exports provided: lithuaniaSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"lithuaniaSurveyStrings\", function() { return lithuaniaSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar lithuaniaSurveyStrings = {\n pagePrevText: \"Atgal\",\n pageNextText: \"Toliau\",\n completeText: \"Baigti\",\n previewText: \"Peržiūra\",\n editText: \"Redaguoti\",\n startSurveyText: \"Pradėti\",\n otherItemText: \"Kita (įvesti)\",\n noneItemText: \"Nėra\",\n selectAllItemText: \"Pasirinkti visus\",\n progressText: \"Puslapis {0} iš {1}\",\n panelDynamicProgressText: \"Įrašyti {0} iš {1}\",\n questionsProgressText: \"Atsakė į {0} / {1} klausimus\",\n emptySurvey: \"Apklausoje nėra matomo puslapio ar klausimo.\",\n completingSurvey: \"Dėkojame už dalyvavimą apklausoje!\",\n completingSurveyBefore: \"Mūsų įrašai rodo, kad jau atlikote šią apklausą.\",\n loadingSurvey: \"Prašome palaukti...\",\n optionsCaption: \"Pasirinkti...\",\n value: \"reikšmė\",\n requiredError: \"Būtina atsakyti į šį klausimą.\",\n requiredErrorInPanel: \"Būtina atsakyti bent į vieną klausimą.\",\n requiredInAllRowsError: \"Prašome atsakyti į klausimus visose eilutėse.\",\n numericError: \"Turi būti skaičiai.\",\n textMinLength: \"Prašome suvesti bent {0} simbolius.\",\n textMaxLength: \"Prašome suvesti mažiau nei {0} simbolių.\",\n textMinMaxLength: \"Prašome suvesti daugiau nei {0} ir mažiau nei {1} simbolių.\",\n minRowCountError: \"Prašome suvesti ne mažiau nei {0} eilučių.\",\n minSelectError: \"Prašome pasirinkti bent {0} variantų.\",\n maxSelectError: \"Pasirinkite ne daugiau kaip {0} variantus.\",\n numericMinMax: \"'{0}' turi būti lygus arba didesnis nei {1} ir lygus arba mažesnis nei {2}\",\n numericMin: \"'{0}' turėtų būti lygus arba didesnis nei {1}\",\n numericMax: \"'{0}' turėtų būti lygus ar mažesnis už {1}\",\n invalidEmail: \"Prašome įvesti galiojantį elektroninio pašto adresą.\",\n invalidExpression: \"Reikšmė: {0} turi grąžinti 'true'.\",\n urlRequestError: \"Užklausa grąžino klaidą'{0}'. {1}\",\n urlGetChoicesError: \"Užklausa grąžino tuščius duomenis arba 'path' savybė yra neteisinga\",\n exceedMaxSize: \"Failo dydis neturi viršyti {0}.\",\n otherRequiredError: \"Įveskite kitą reikšmę.\",\n uploadingFile: \"Jūsų failas yra keliamas. Palaukite keletą sekundžių ir bandykite dar kartą.\",\n loadingFile: \"Prašome palaukti...\",\n chooseFile: \"Pasirinkti failą(us)...\",\n noFileChosen: \"Nepasirinktas joks failas\",\n confirmDelete: \"Ar norite ištrinti įrašą?\",\n keyDuplicationError: \"Ši reikšmė turėtų būti unikali.\",\n addColumn: \"Pridėti stulpelį\",\n addRow: \"Pridėti eilutę\",\n removeRow: \"Ištrinti\",\n addPanel: \"Pridėti naują\",\n removePanel: \"Ištrinti\",\n choices_Item: \"elementas\",\n matrix_column: \"Stulpelis\",\n matrix_row: \"Eilutė\",\n savingData: \"Rezultatai saugomi serveryje...\",\n savingDataError: \"Įvyko klaida ir mes negalėjome išsaugoti rezultatų.\",\n savingDataSuccess: \"Rezultatai buvo išsaugoti sėkmingai!\",\n saveAgainButton: \"Bandyti dar kartą\",\n timerMin: \"min\",\n timerSec: \"sek\",\n timerSpentAll: \"Praleidote {0} šiame puslapyje ir {1} iš viso.\",\n timerSpentPage: \"Praleidote {0} šiame puslapyje.\",\n timerSpentSurvey: \"Praleidote {0} iš viso.\",\n timerLimitAll: \"Praleidote {0} iš {1} šiame puslapyje ir {2} iš {3} iš viso.\",\n timerLimitPage: \"Praleidote {0} iš {1} šiame puslapyje.\",\n timerLimitSurvey: \"Praleidote {0} iš {1} iš viso.\",\n cleanCaption: \"Išvalyti\",\n clearCaption: \"Valyti\",\n chooseFileCaption: \"Pasirinkti failą\",\n removeFileCaption: \"Ištrinti šį failą\",\n booleanCheckedLabel: \"Taip\",\n booleanUncheckedLabel: \"Ne\",\n confirmRemoveFile: \"Ar tikrai norite pašalinti šį failą: {0}?\",\n confirmRemoveAllFiles: \"Ar tikrai norite pašalinti visus failus?\",\n questionTitlePatternText: \"Klausimo pavadinimas\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"lt\"] = lithuaniaSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"lt\"] = \"lietuvių\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/macedonian.ts\":\n/*!****************************************!*\\\n !*** ./src/localization/macedonian.ts ***!\n \\****************************************/\n/*! exports provided: macedonianSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"macedonianSurveyStrings\", function() { return macedonianSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar macedonianSurveyStrings = {\n pagePrevText: \"Претходна\",\n pageNextText: \"Следно\",\n completeText: \"Заврши\",\n previewText: \"Преглед\",\n editText: \"Уредување\",\n startSurveyText: \"Започнете\",\n otherItemText: \"Друго (опиши)\",\n noneItemText: \"Ништо\",\n selectAllItemText: \"Селектирај се\",\n progressText: \"Страница {0} од {1}\",\n panelDynamicProgressText: \"Сними {0} од {1}\",\n questionsProgressText: \"Одговорени на {0} / {1} прашања\",\n emptySurvey: \"Нема видлива страница или прашање во истражувањето.\",\n completingSurvey: \"Ви благодариме што го завршивте истражувањето!\",\n completingSurveyBefore: \"Нашите записи покажуваат дека веќе сте го завршиле ова истражување.\",\n loadingSurvey: \"Анкетата се вчитува ...\",\n optionsCaption: \"Изберете ...\",\n value: \"вредност\",\n requiredError: \"Ве молам, одговорете на прашањето.\",\n requiredErrorInPanel: \"Ве молам, одговорете барем на едно прашање.\",\n requiredInAllRowsError: \"Ве молиме, одговорете на прашања во сите редови.\",\n numericError: \"Вредноста треба да биде нумеричка.\",\n minError: \"Вредноста не треба да биде помала од {0}\",\n maxError: \"Вредноста не треба да биде поголема од {0}\",\n textMinLength: \"Внесете најмалку {0} знак/ци.\",\n textMaxLength: \"Внесете не повеќе од {0} знак/ци.\",\n textMinMaxLength: \"Внесете најмалку {0} и не повеќе од {1} знаци.\",\n minRowCountError: \"Пополнете најмалку {0} ред(ови).\",\n minSelectError: \"Ве молиме изберете најмалку {0} варијанта(и).\",\n maxSelectError: \"Изберете не повеќе од {0} варијанта(и).\",\n numericMinMax: \"'{0}' треба да биде најмалку {1} и најмногу {2}\",\n numericMin: \"'{0}' треба да биде најмалку {1}\",\n numericMax: \"'{0}' треба да биде најмногу {1}\",\n invalidEmail: \"Ве молиме внесете валидна е-маил адреса.\",\n invalidExpression: \"Изразот: {0} треба да се врати 'true'.\",\n urlRequestError: \"Барањето врати грешка '{0}'. {1} \",\n urlGetChoicesError: \"Барањето врати празни податоци или својството 'path' е неточно\",\n exceedMaxSize: \"Големината на датотеката не треба да надминува {0}.\",\n otherRequiredError: \"Внесете ја другата вредност.\",\n uploadingFile: \"Вашата датотека се поставува. Ве молиме почекајте неколку секунди и обидете се повторно.\",\n loadingFile: \"Се вчитува ...\",\n chooseFile: \"Изберете датотека (и) ...\",\n noFileChosen: \"Не се избрани датотеки\",\n confirmDelete: \"Дали сакате да го избришете записот?\",\n keyDuplicationError: \"Оваа вредност треба да биде единствена.\",\n addColumn: \"Додај колона\",\n addRow: \"Додади ред\",\n removeRow: \"Отстрани\",\n emptyRowsText: \"Нема редови.\",\n addPanel: \"Додади ново\",\n removePanel: \"Отстрани\",\n choices_Item: \"ставка\",\n matrix_column: \"Колона\",\n matrix_row: \"Ред\",\n savingData: \"Резултатите се зачувуваат на серверот ...\",\n savingDataError: \"Настана грешка и не можевме да ги зачуваме резултатите.\",\n savingDataSuccess: \"Резултатите беа успешно зачувани!\",\n saveAgainButton: \"Обиди се повторно\",\n timerMin: \"мин\",\n timerSec: \"сек\",\n timerSpentAll: \"Поминавте {0} на оваа страница и вкупно {1}.\",\n timerSpentPage: \"Поминавте {0} на оваа страница.\",\n timerSpentSurvey: \"Вие потрошивте вкупно {0}.\",\n timerLimitAll: \"Поминавте {0} од {1} на оваа страница и {2} од {3} вкупно.\",\n timerLimitPage: \"Поминавте {0} од {1} на оваа страница.\",\n timerLimitSurvey: \"Вие потрошивте вкупно {0} од {1}.\",\n cleanCaption: \"Чисти\",\n clearCaption: \"Да расчисти\",\n chooseFileCaption: \"Изберете датотека\",\n removeFileCaption: \"Отстранете ја оваа датотека\",\n booleanCheckedLabel: \"Да\",\n booleanUncheckedLabel: \"Не\",\n confirmRemoveFile: \"Дали сте сигурни дека сакате да ја отстраните оваа датотека: {0}?\",\n confirmRemoveAllFiles: \"Дали сте сигурни дека сакате да ги отстраните сите датотеки?\",\n questionTitlePatternText: \"Наслов на прашањето\",\n modalCancelButtonText: \"Откажи\",\n modalApplyButtonText: \"Аплицирај\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"mk\"] = macedonianSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"mk\"] = \"Македонски\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/norwegian.ts\":\n/*!***************************************!*\\\n !*** ./src/localization/norwegian.ts ***!\n \\***************************************/\n/*! exports provided: norwegianSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"norwegianSurveyStrings\", function() { return norwegianSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar norwegianSurveyStrings = {\n pagePrevText: \"Forrige\",\n pageNextText: \"Neste\",\n completeText: \"Fullfør\",\n previewText: \"Forhåndsvisning\",\n editText: \"Redigere\",\n startSurveyText: \"Start\",\n otherItemText: \"Annet (beskriv)\",\n noneItemText: \"Ingen\",\n selectAllItemText: \"Velg alle\",\n progressText: \"Side {0} av {1}\",\n panelDynamicProgressText: \"Ta opp {0} av {1}\",\n questionsProgressText: \"Besvarte {0} / {1} spørsmål\",\n emptySurvey: \"Det er ingen synlig side eller spørsmål i undersøkelsen.\",\n completingSurvey: \"Takk for at du fullførte undersøkelsen!\",\n completingSurveyBefore: \"Våre data viser at du allerede har gjennomført denne undersøkelsen.\",\n loadingSurvey: \"Undersøkelsen laster...\",\n optionsCaption: \"Velg...\",\n value: \"verdi\",\n requiredError: \"Vennligst svar på spørsmålet.\",\n requiredErrorInPanel: \"Vennligst svar på minst ett spørsmål.\",\n requiredInAllRowsError: \"Vennligst svar på spørsmål i alle rader.\",\n numericError: \"Verdien skal være numerisk.\",\n textMinLength: \"Vennligst skriv inn minst {0} tegn.\",\n textMaxLength: \"Vennligst skriv inn mindre enn {0} tegn.\",\n textMinMaxLength: \"Vennligst skriv inn mer enn {0} og mindre enn {1} tegn.\",\n minRowCountError: \"Vennligst fyll inn minst {0} rader.\",\n minSelectError: \"Vennligst velg minst {0} varianter.\",\n maxSelectError: \"Vennligst ikke velg mer enn {0} varianter.\",\n numericMinMax: \"'{0}' bør være lik eller mer enn {1} og lik eller mindre enn {2}\",\n numericMin: \"'{0}' bør være lik eller mer enn {1}\",\n numericMax: \"'{0}' bør være lik eller mindre enn {1}\",\n invalidEmail: \"Vennligst skriv inn en gyldig e-post adresse.\",\n invalidExpression: \"Uttrykket: {0} skal returnere 'sant'.\",\n urlRequestError: \"Forespørselen returnerte feilen '{0}'. {1}\",\n urlGetChoicesError: \"Forespørselen returnerte tomme data, eller 'sti' -egenskapen er feil\",\n exceedMaxSize: \"Filstørrelsen bør ikke overstige {0}.\",\n otherRequiredError: \"Vennligst skriv inn den andre verdien.\",\n uploadingFile: \"Filen din lastes opp. Vennligst vent noen sekunder og prøv igjen.\",\n loadingFile: \"Laster inn ...\",\n chooseFile: \"Velg fil (er) ...\",\n noFileChosen: \"Ingen fil valgt\",\n confirmDelete: \"Ønsker du å slette posten?\",\n keyDuplicationError: \"Denne verdien skal være unik.\",\n addColumn: \"Legg til kolonne\",\n addRow: \"Legg til rad\",\n removeRow: \"Fjern\",\n addPanel: \"Legg til ny\",\n removePanel: \"Fjerne\",\n choices_Item: \"element\",\n matrix_column: \"Kolonne\",\n matrix_row: \"Rad\",\n savingData: \"Resultatene lagres på serveren ...\",\n savingDataError: \"Det oppsto en feil, og vi kunne ikke lagre resultatene.\",\n savingDataSuccess: \"Resultatene ble lagret!\",\n saveAgainButton: \"Prøv igjen\",\n timerMin: \"min\",\n timerSec: \"sek\",\n timerSpentAll: \"Du har tilbrakt {0} på denne siden og {1} totalt.\",\n timerSpentPage: \"Du har tilbrakt {0} på denne siden.\",\n timerSpentSurvey: \"Du har tilbrakt {0} totalt.\",\n timerLimitAll: \"Du har tilbrakt {0} av {1} på denne siden og totalt {2} av {3}.\",\n timerLimitPage: \"Du har tilbrakt {0} av {1} på denne siden.\",\n timerLimitSurvey: \"Du har tilbrakt {0} av {1} totalt.\",\n cleanCaption: \"Rens\",\n clearCaption: \"Klar\",\n chooseFileCaption: \"Velg Fil\",\n removeFileCaption: \"Fjern denne filen\",\n booleanCheckedLabel: \"Ja\",\n booleanUncheckedLabel: \"Nei\",\n confirmRemoveFile: \"Er du sikker på at du vil fjerne denne filen: {0}?\",\n confirmRemoveAllFiles: \"Er du sikker på at du vil fjerne alle filene?\",\n questionTitlePatternText: \"Spørsmålstittel\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"no\"] = norwegianSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"no\"] = \"norsk\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/persian.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/persian.ts ***!\n \\*************************************/\n/*! exports provided: persianSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"persianSurveyStrings\", function() { return persianSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar persianSurveyStrings = {\n pagePrevText: \"قبلی\",\n pageNextText: \"بعدی\",\n completeText: \"تکمیل\",\n previewText: \"پیش نمایش\",\n editText: \"ویرایش\",\n startSurveyText: \"شروع\",\n otherItemText: \"دیگر(توضیح)\",\n noneItemText: \"هیچ\",\n selectAllItemText: \"انتخاب همه\",\n progressText: \"صفحه {0} از {1}\",\n panelDynamicProgressText: \"مورد {0} از {1}\",\n questionsProgressText: \"تعداد پاسخ {0}/{1} سوال\",\n emptySurvey: \"صفحه ای یا گزینه ای برای این پرسشنامه موجود نیست.\",\n completingSurvey: \"از شما بابت تکمیل این پرسشنامه متشکریم\",\n completingSurveyBefore: \"به نظر می رسد هم هم اکنون پرسشنامه را تکمیل کرده اید.\",\n loadingSurvey: \"درحال ایجاد پرسشنامه\",\n optionsCaption: \"انتخاب کنید...\",\n value: \"مقدار\",\n requiredError: \"لطفا به سوال پاسخ دهید\",\n requiredErrorInPanel: \"لطفا حداقل به یک سوال پاسخ دهید.\",\n requiredInAllRowsError: \"لطفا سوالات تمام سطرها را پاسخ دهید.\",\n numericError: \"مقدار باید عددی باشد\",\n textMinLength: \"لطفا حداقل {0} حرف وارد کنید\",\n textMaxLength: \"لطفا کمتر از {0} حرف وارد کنید.\",\n textMinMaxLength: \"لطفا بیشتر از {0} حرف و کمتر از {1} حرف وارد کنید.\",\n minRowCountError: \"لطفا حداقل {0} سطر وارد کنید.\",\n minSelectError: \"حداقل {0} انتخاب کنید.\",\n maxSelectError: \"لطفا بیشتر از {0} انتخاب کنید.\",\n numericMinMax: \"'{0}' باید بین {1} و {2} باشد\",\n numericMin: \"'{0}' بزرگتر مساوی {1} باشد\",\n numericMax: \"'{0}' باید کوچکتر یا مساوی {1} باشد\",\n invalidEmail: \"لطفا ایمیل صحیح درج کنید\",\n invalidExpression: \"عبارت: {0} پاسخ باید 'true' باشد.\",\n urlRequestError: \"درخواست با خطا روبرو شد: '{0}'. {1}\",\n urlGetChoicesError: \"درخواست مسیری خالی بازگشت داده یا مسیر درست تنظیم نشده\",\n exceedMaxSize: \"بیشترین حجم مجاز فایل: {0}\",\n otherRequiredError: \"مقدار 'دیگر' را وارد کنید\",\n uploadingFile: \"فایل در حال آیلود است. لطفا صبر کنید.\",\n loadingFile: \"بارگیری...\",\n chooseFile: \"انتخاب فایل(ها)...\",\n noFileChosen: \"هیچ فایلی انتخاب نشده\",\n confirmDelete: \"آیا مایل به حذف این ردیف هستید؟\",\n keyDuplicationError: \"این مقدار باید غیر تکراری باشد\",\n addColumn: \"ستون جدید\",\n addRow: \"سطر جدید\",\n removeRow: \"حذف\",\n addPanel: \"جدید\",\n removePanel: \"حذف\",\n choices_Item: \"آیتم\",\n matrix_column: \"ستون\",\n matrix_row: \"سطر\",\n savingData: \"نتایج در حال ذخیره سازی در سرور است\",\n savingDataError: \"خطایی در ذخیره سازی نتایج رخ داده است\",\n savingDataSuccess: \"نتایج با موفقیت ذخیره شد\",\n saveAgainButton: \"مجدد تلاش کنید\",\n timerMin: \"دقیقه\",\n timerSec: \"ثانیه\",\n timerSpentAll: \"شما مدت {0} در این صفحه و مدت {1} را در مجموع سپری کرده اید.\",\n timerSpentPage: \"شما مدت {0} را در این صفحه سپری کرده اید.\",\n timerSpentSurvey: \"شما مدت {0} را در مجموع سپری کرده اید.\",\n timerLimitAll: \"شما مدت {0} از {1} در این صفحه و مدت {2} از {3} را در مجموع سپری کرده اید.\",\n timerLimitPage: \"شما مدت {0} از {1} را در این صفحه سپری کرده اید.\",\n timerLimitSurvey: \"شما مدت {0} از {1} را در مجموع سپری کرده اید.\",\n cleanCaption: \"پاکسازی\",\n clearCaption: \"خالی کردن\",\n chooseFileCaption: \"انتخاب فایل\",\n removeFileCaption: \"حذف این فایل\",\n booleanCheckedLabel: \"بله\",\n booleanUncheckedLabel: \"خیر\",\n confirmRemoveFile: \"آیا میخواهید این فایل را پاک کنید: {0}?\",\n confirmRemoveAllFiles: \"آیا میخواهید تمام فایل ها را پاک کنید?\",\n questionTitlePatternText: \"عنوان سوال\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"fa\"] = persianSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"fa\"] = \"فارْسِى\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/polish.ts\":\n/*!************************************!*\\\n !*** ./src/localization/polish.ts ***!\n \\************************************/\n/*! exports provided: polishSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"polishSurveyStrings\", function() { return polishSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar polishSurveyStrings = {\n pagePrevText: \"Wstecz\",\n pageNextText: \"Dalej\",\n completeText: \"Gotowe\",\n previewText: \"Premiera\",\n editText: \"Edycja\",\n startSurveyText: \"Start\",\n otherItemText: \"Inna odpowiedź (wpisz)\",\n noneItemText: \"Brak\",\n selectAllItemText: \"Wybierz wszystkie\",\n progressText: \"Strona {0} z {1}\",\n panelDynamicProgressText: \"Zapis {0} z {1}\",\n questionsProgressText: \"Odpowiedzi na {0}/{1} pytania\",\n emptySurvey: \"Nie ma widocznych pytań.\",\n completingSurvey: \"Dziękujemy za wypełnienie ankiety!\",\n completingSurveyBefore: \"Z naszych zapisów wynika, że wypełniłeś już tę ankietę.\",\n loadingSurvey: \"Trwa wczytywanie ankiety...\",\n optionsCaption: \"Wybierz...\",\n value: \"Wartość\",\n requiredError: \"Proszę odpowiedzieć na to pytanie.\",\n requiredErrorInPanel: \"Proszę odpowiedzieć na co najmniej jedno pytanie.\",\n requiredInAllRowsError: \"Proszę odpowiedzieć na wszystkie pytania.\",\n numericError: \"W tym polu można wpisać tylko liczby.\",\n textMinLength: \"Proszę wpisać co najmniej {0} znaków.\",\n textMaxLength: \"Proszę wpisać mniej niż {0} znaków.\",\n textMinMaxLength: \"Proszę wpisać więcej niż {0} i mniej niż {1} znaków.\",\n minRowCountError: \"Proszę uzupełnić przynajmniej {0} wierszy.\",\n minSelectError: \"Proszę wybrać co najmniej {0} pozycji.\",\n maxSelectError: \"Proszę wybrać nie więcej niż {0} pozycji.\",\n numericMinMax: \"Odpowiedź '{0}' powinna być większa lub równa {1} oraz mniejsza lub równa {2}\",\n numericMin: \"Odpowiedź '{0}' powinna być większa lub równa {1}\",\n numericMax: \"Odpowiedź '{0}' powinna być mniejsza lub równa {1}\",\n invalidEmail: \"Proszę podać prawidłowy adres email.\",\n invalidExpression: \"Wyrażenie: {0} powinno wracać 'prawdziwe'.\",\n urlRequestError: \"Żądanie zwróciło błąd '{0}'. {1}\",\n urlGetChoicesError: \"Żądanie nie zwróciło danych albo ścieżka jest nieprawidłowa\",\n exceedMaxSize: \"Rozmiar przesłanego pliku nie może przekraczać {0}.\",\n otherRequiredError: \"Proszę podać inną odpowiedź.\",\n uploadingFile: \"Trwa przenoszenie Twojego pliku, proszę spróbować ponownie za kilka sekund.\",\n loadingFile: \"Ładowanie...\",\n chooseFile: \"Wybierz plik(i)...\",\n noFileChosen: \"Nie wybrano żadnego pliku\",\n confirmDelete: \"Chcesz skasować nagranie?\",\n keyDuplicationError: \"Ta wartość powinna być wyjątkowa.\",\n addColumn: \"Dodaj kolumnę\",\n addRow: \"Dodaj wiersz\",\n removeRow: \"Usuń\",\n addPanel: \"Dodaj panel\",\n removePanel: \"Usuń\",\n choices_Item: \"element\",\n matrix_column: \"Kolumna\",\n matrix_row: \"Wiersz\",\n savingData: \"Zapisuję wyniki ankiety na serwerze...\",\n savingDataError: \"Wystąpił błąd i wyniki nie mogły zostać zapisane.\",\n savingDataSuccess: \"Wyniki zostały poprawnie zapisane!\",\n saveAgainButton: \"Spróbuj ponownie\",\n timerMin: \"min\",\n timerSec: \"sek\",\n timerSpentAll: \"Spędziłeś {0} na tej stronie a w sumie {1}.\",\n timerSpentPage: \"Spędziłeś {0} na tej stronie.\",\n timerSpentSurvey: \"Spędziłeś w sumie {0}.\",\n timerLimitAll: \"Spędziłeś {0} z {1} na tej stronie a w sumie {2} z {3}.\",\n timerLimitPage: \"Spędziłeś {0} z {1} na tej stronie\",\n timerLimitSurvey: \"Spędziłeś {0} z {1}.\",\n cleanCaption: \"Wyczyść\",\n clearCaption: \"Jasne\",\n chooseFileCaption: \"Wybierz plik\",\n removeFileCaption: \"Usuń ten plik\",\n booleanCheckedLabel: \"Tak\",\n booleanUncheckedLabel: \"Nie\",\n confirmRemoveFile: \"Jesteś pewien, że chcesz usunąć ten plik: {0}?\",\n confirmRemoveAllFiles: \"Jesteś pewien, że chcesz usunąć wszystkie pliki?\",\n questionTitlePatternText: \"Tytuł pytania\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"pl\"] = polishSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"pl\"] = \"polski\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/portuguese-br.ts\":\n/*!*******************************************!*\\\n !*** ./src/localization/portuguese-br.ts ***!\n \\*******************************************/\n/*! exports provided: portugueseBrSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"portugueseBrSurveyStrings\", function() { return portugueseBrSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar portugueseBrSurveyStrings = {\n pagePrevText: \"Anterior\",\n pageNextText: \"Próximo\",\n completeText: \"Finalizar\",\n previewText: \"Pré-visualização\",\n editText: \"Editar\",\n startSurveyText: \"Começar\",\n otherItemText: \"Outros (descrever)\",\n noneItemText: \"Nenhum\",\n selectAllItemText: \"Selecionar Todos\",\n progressText: \"Página {0} de {1}\",\n panelDynamicProgressText: \"Registro {0} de {1}\",\n questionsProgressText: \"Respostas {0}/{1} perguntas\",\n emptySurvey: \"Não há página visível ou pergunta na pesquisa.\",\n completingSurvey: \"Obrigado por finalizar a pesquisa!\",\n completingSurveyBefore: \"Nossos registros mostram que você já finalizou a pesquisa.\",\n loadingSurvey: \"A pesquisa está carregando...\",\n optionsCaption: \"Selecione...\",\n value: \"valor\",\n requiredError: \"Por favor, responda a pergunta.\",\n requiredErrorInPanel: \"Por favor, responda pelo menos uma pergunta.\",\n requiredInAllRowsError: \"Por favor, responda as perguntas em todas as linhas.\",\n numericError: \"O valor deve ser numérico.\",\n textMinLength: \"Por favor, insira pelo menos {0} caracteres.\",\n textMaxLength: \"Por favor, insira menos de {0} caracteres.\",\n textMinMaxLength: \"Por favor, insira mais de {0} e menos de {1} caracteres.\",\n minRowCountError: \"Preencha pelo menos {0} linhas.\",\n minSelectError: \"Selecione pelo menos {0} opções.\",\n maxSelectError: \"Por favor, selecione não mais do que {0} opções.\",\n numericMinMax: \"O '{0}' deve ser igual ou superior a {1} e igual ou menor que {2}\",\n numericMin: \"O '{0}' deve ser igual ou superior a {1}\",\n numericMax: \"O '{0}' deve ser igual ou inferior a {1}\",\n invalidEmail: \"Por favor, informe um e-mail válido.\",\n invalidExpression: \"A expressão: {0} deve retornar 'verdadeiro'.\",\n urlRequestError: \"A requisição retornou o erro '{0}'. {1}\",\n urlGetChoicesError: \"A requisição não retornou dados ou o 'caminho' da requisição não está correto\",\n exceedMaxSize: \"O tamanho do arquivo não deve exceder {0}.\",\n otherRequiredError: \"Por favor, informe o outro valor.\",\n uploadingFile: \"Seu arquivo está sendo carregado. Por favor, aguarde alguns segundos e tente novamente.\",\n loadingFile: \"Carregando...\",\n chooseFile: \"Selecione o(s) arquivo(s)...\",\n noFileChosen: \"Nenhum arquivo escolhido\",\n confirmDelete: \"Tem certeza que deseja deletar?\",\n keyDuplicationError: \"Esse valor deve ser único.\",\n addColumn: \"Adicionar coluna\",\n addRow: \"Adicionar linha\",\n removeRow: \"Remover linha\",\n addPanel: \"Adicionar novo\",\n removePanel: \"Remover\",\n choices_Item: \"item\",\n matrix_column: \"Coluna\",\n matrix_row: \"Linha\",\n savingData: \"Os resultados esto sendo salvos no servidor...\",\n savingDataError: \"Ocorreu um erro e não foi possível salvar os resultados.\",\n savingDataSuccess: \"Os resultados foram salvos com sucesso!\",\n saveAgainButton: \"Tente novamente\",\n timerMin: \"min\",\n timerSec: \"seg\",\n timerSpentAll: \"Você gastou {0} nesta página e {1} no total.\",\n timerSpentPage: \"Você gastou {0} nesta página.\",\n timerSpentSurvey: \"Você gastou {0} no total.\",\n timerLimitAll: \"Você gastou {0} de {1} nesta página e {2} de {3} no total.\",\n timerLimitPage: \"Você gastou {0} de {1} nesta página.\",\n timerLimitSurvey: \"Você gastou {0} de {1} no total.\",\n cleanCaption: \"Limpar\",\n clearCaption: \"Limpar\",\n chooseFileCaption: \"Escolher arquivo\",\n removeFileCaption: \"Remover este arquivo\",\n booleanCheckedLabel: \"Sim\",\n booleanUncheckedLabel: \"Não\",\n confirmRemoveFile: \"Tem certeza que deseja remover este arquivo: {0}?\",\n confirmRemoveAllFiles: \"Tem certeza que deseja remover todos os arquivos?\",\n questionTitlePatternText: \"Título da questão\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"pt-br\"] = portugueseBrSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"pt-br\"] = \"português brasileiro\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/portuguese.ts\":\n/*!****************************************!*\\\n !*** ./src/localization/portuguese.ts ***!\n \\****************************************/\n/*! exports provided: portugueseSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"portugueseSurveyStrings\", function() { return portugueseSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar portugueseSurveyStrings = {\n pagePrevText: \"Anterior\",\n pageNextText: \"Próximo\",\n completeText: \"Finalizar\",\n previewText: \"Pré-visualização\",\n editText: \"Editar\",\n startSurveyText: \"Começar\",\n otherItemText: \"Outros (descrever)\",\n noneItemText: \"Nenhum\",\n selectAllItemText: \"Selecionar Todos\",\n progressText: \"Página {0} de {1}\",\n panelDynamicProgressText: \"Registo {0} de {1}\",\n questionsProgressText: \"Respostas {0}/{1} perguntas\",\n emptySurvey: \"Não há página visível ou pergunta no questionário.\",\n completingSurvey: \"Obrigado por finalizar o questionário!\",\n completingSurveyBefore: \"Os nossos registos mostram que já finalizou o questionário.\",\n loadingSurvey: \"O questionário está a carregar...\",\n optionsCaption: \"Selecione...\",\n value: \"valor\",\n requiredError: \"Por favor, responda à pergunta.\",\n requiredErrorInPanel: \"Por favor, responda pelo menos a uma pergunta.\",\n requiredInAllRowsError: \"Por favor, responda às perguntas em todas as linhas.\",\n numericError: \"O valor deve ser numérico.\",\n textMinLength: \"Por favor, insira pelo menos {0} caracteres.\",\n textMaxLength: \"Por favor, insira menos de {0} caracteres.\",\n textMinMaxLength: \"Por favor, insira mais de {0} e menos de {1} caracteres.\",\n minRowCountError: \"Preencha pelo menos {0} linhas.\",\n minSelectError: \"Selecione pelo menos {0} opções.\",\n maxSelectError: \"Por favor, selecione no máximo {0} opções.\",\n numericMinMax: \"O '{0}' deve ser igual ou superior a {1} e igual ou menor que {2}\",\n numericMin: \"O '{0}' deve ser igual ou superior a {1}\",\n numericMax: \"O '{0}' deve ser igual ou inferior a {1}\",\n invalidEmail: \"Por favor, insira um e-mail válido.\",\n invalidExpression: \"A expressão: {0} deve retornar 'verdadeiro'.\",\n urlRequestError: \"O pedido retornou o erro '{0}'. {1}\",\n urlGetChoicesError: \"O pedido não retornou dados ou o 'caminho' do pedido não está correto\",\n exceedMaxSize: \"O tamanho do arquivo não deve exceder {0}.\",\n otherRequiredError: \"Por favor, insira o outro valor.\",\n uploadingFile: \"O seu ficheiro está a carregar. Por favor, aguarde alguns segundos e tente novamente.\",\n loadingFile: \"A carregar...\",\n chooseFile: \"Selecione o(s) arquivo(s)...\",\n noFileChosen: \"Nenhum ficheiro escolhido\",\n confirmDelete: \"Tem a certeza que deseja apagar?\",\n keyDuplicationError: \"Este valor deve ser único.\",\n addColumn: \"Adicionar coluna\",\n addRow: \"Adicionar linha\",\n removeRow: \"Remover linha\",\n addPanel: \"Adicionar novo\",\n removePanel: \"Remover\",\n choices_Item: \"item\",\n matrix_column: \"Coluna\",\n matrix_row: \"Linha\",\n savingData: \"Os resultados estão a ser guardados no servidor...\",\n savingDataError: \"Ocorreu um erro e não foi possível guardar os resultados.\",\n savingDataSuccess: \"Os resultados foram guardados com sucesso!\",\n saveAgainButton: \"Tente novamente\",\n timerMin: \"min\",\n timerSec: \"seg\",\n timerSpentAll: \"Você gastou {0} nesta página e {1} no total.\",\n timerSpentPage: \"Você gastou {0} nesta página.\",\n timerSpentSurvey: \"Você gastou {0} no total.\",\n timerLimitAll: \"Você gastou {0} de {1} nesta página e {2} de {3} no total.\",\n timerLimitPage: \"Você gastou {0} de {1} nesta página.\",\n timerLimitSurvey: \"Você gastou {0} de {1} no total.\",\n cleanCaption: \"Limpar\",\n clearCaption: \"Limpar\",\n chooseFileCaption: \"Escolher ficheiro\",\n removeFileCaption: \"Remover este ficheiro\",\n booleanCheckedLabel: \"Sim\",\n booleanUncheckedLabel: \"Não\",\n confirmRemoveFile: \"Tem a certeza que deseja remover este ficheiro: {0}?\",\n confirmRemoveAllFiles: \"Tem a certeza que deseja remover todos os ficheiros?\",\n questionTitlePatternText: \"Título da questão\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"pt\"] = portugueseSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"pt\"] = \"português\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/romanian.ts\":\n/*!**************************************!*\\\n !*** ./src/localization/romanian.ts ***!\n \\**************************************/\n/*! exports provided: romanianSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"romanianSurveyStrings\", function() { return romanianSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar romanianSurveyStrings = {\n pagePrevText: \"Precedent\",\n pageNextText: \"Următor\",\n completeText: \"Finalizare\",\n previewText: \"previzualizare\",\n editText: \"Editați\",\n startSurveyText: \"start\",\n otherItemText: \"Altul(precizaţi)\",\n noneItemText: \"Nici unul\",\n selectAllItemText: \"Selectează tot\",\n progressText: \"Pagina {0} din {1}\",\n panelDynamicProgressText: \"Înregistrare {0} din {1}\",\n questionsProgressText: \"Răspunsuri la {0} / {1} întrebări\",\n emptySurvey: \"Nu sunt întrebări pentru acest chestionar\",\n completingSurvey: \"Vă mulţumim pentru timpul acordat!\",\n completingSurveyBefore: \"Din înregistrările noastre reiese că ați completat deja acest chestionar.\",\n loadingSurvey: \"Chestionarul se încarcă...\",\n optionsCaption: \"Alegeţi...\",\n value: \"valoare\",\n requiredError: \"Răspunsul la această întrebare este obligatoriu.\",\n requiredErrorInPanel: \"Vă rugăm să răspundeți la cel puțin o întrebare.\",\n requiredInAllRowsError: \"Toate răspunsurile sunt obligatorii\",\n numericError: \"Răspunsul trebuie să fie numeric.\",\n textMinLength: \"Trebuie să introduceți minim {0} caractere.\",\n textMaxLength: \"Trebuie să introduceți maxim {0} caractere.\",\n textMinMaxLength: \"Trebuie să introduceți mai mult de {0} și mai puțin de {1} caractere.\",\n minRowCountError: \"Trebuie să completați minim {0} rânduri.\",\n minSelectError: \"Trebuie să selectați minim {0} opţiuni.\",\n maxSelectError: \"Trebuie să selectați maxim {0} opţiuni.\",\n numericMinMax: \"Răspunsul '{0}' trebuie să fie mai mare sau egal ca {1} şî mai mic sau egal cu {2}\",\n numericMin: \"Răspunsul '{0}' trebuie să fie mai mare sau egal ca {1}\",\n numericMax: \"Răspunsul '{0}' trebuie să fie mai mic sau egal ca {1}\",\n invalidEmail: \"Trebuie să introduceţi o adresa de email validă.\",\n invalidExpression: \"Expresia: {0} ar trebui să returneze „adevărat”.\",\n urlRequestError: \"Request-ul a returnat eroarea '{0}'. {1}\",\n urlGetChoicesError: \"Request-ul nu a returnat date sau proprietatea 'path' este incorectă\",\n exceedMaxSize: \"Dimensiunea fişierului nu trebuie să depăşească {0}.\",\n otherRequiredError: \"Trebuie să completați câmpul 'Altul'.\",\n uploadingFile: \"Fișierul dumneavoastră este în curs de încărcare. Vă rugăm așteptați câteva secunde și reveniți apoi.\",\n loadingFile: \"Se încarcă...\",\n chooseFile: \"Alege fisierele...\",\n noFileChosen: \"Niciun fișier ales\",\n confirmDelete: \"Sunteți sigur că doriți să ștergeți înregistrarea?\",\n keyDuplicationError: \"Valoarea trebuie să fie unică.\",\n addColumn: \"Adăugați coloană\",\n addRow: \"Adăugare rând\",\n removeRow: \"Ștergere\",\n addPanel: \"Adăugare\",\n removePanel: \"Ștergere\",\n choices_Item: \"opțiune\",\n matrix_column: \"Coloană\",\n matrix_row: \"Rând\",\n savingData: \"Rezultatele sunt în curs de salvare...\",\n savingDataError: \"A intervenit o eroare, rezultatele nu au putut fi salvate.\",\n savingDataSuccess: \"Rezultatele au fost salvate cu succes!\",\n saveAgainButton: \"Încercați din nou\",\n timerMin: \"min\",\n timerSec: \"sec\",\n timerSpentAll: \"Ați petrecut {0} pe această pagină și {1} în total.\",\n timerSpentPage: \"Ați petrecut {0} pe această pagină.\",\n timerSpentSurvey: \"Ați petrecut {0} în total.\",\n timerLimitAll: \"Ați petrecut {0} din {1} pe această pagină și {2} din {3} în total.\",\n timerLimitPage: \"Ați petrecut {0} din {1} pe această pagină.\",\n timerLimitSurvey: \"Ați petrecut {0} din {1} în total.\",\n cleanCaption: \"Curat\",\n clearCaption: \"clar\",\n chooseFileCaption: \"Alege fișierul\",\n removeFileCaption: \"Eliminați acest fișier\",\n booleanCheckedLabel: \"da\",\n booleanUncheckedLabel: \"Nu\",\n confirmRemoveFile: \"Sigur doriți să eliminați acest fișier: {0}?\",\n confirmRemoveAllFiles: \"Sigur doriți să eliminați toate fișierele?\",\n questionTitlePatternText: \"Titlul intrebarii\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"ro\"] = romanianSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"ro\"] = \"română\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/russian.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/russian.ts ***!\n \\*************************************/\n/*! exports provided: russianSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"russianSurveyStrings\", function() { return russianSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar russianSurveyStrings = {\n pagePrevText: \"Назад\",\n pageNextText: \"Далее\",\n completeText: \"Готово\",\n previewText: \"Предварительный просмотр\",\n editText: \"Редактирование\",\n startSurveyText: \"Начать\",\n otherItemText: \"Другое (пожалуйста, опишите)\",\n noneItemText: \"Нет\",\n selectAllItemText: \"Выбрать всё\",\n progressText: \"Страница {0} из {1}\",\n panelDynamicProgressText: \"Запись {0} из {1}\",\n questionsProgressText: \"Ответы на {0}/{1}вопросы\",\n emptySurvey: \"Нет ни одного вопроса.\",\n completingSurvey: \"Благодарим Вас за заполнение анкеты!\",\n completingSurveyBefore: \"Вы уже проходили этот опрос.\",\n loadingSurvey: \"Загрузка с сервера...\",\n optionsCaption: \"Выбрать...\",\n value: \"значение\",\n requiredError: \"Пожалуйста, ответьте на вопрос.\",\n requiredErrorInPanel: \"Пожалуйста, ответьте по крайней мере на один вопрос.\",\n requiredInAllRowsError: \"Пожалуйста, ответьте на вопросы в каждой строке.\",\n numericError: \"Ответ должен быть числом.\",\n textMinLength: \"Пожалуйста введите больше {0} символов.\",\n textMaxLength: \"Пожалуйста введите меньше {0} символов.\",\n textMinMaxLength: \"Пожалуйста введите больше {0} и меньше {1} символов.\",\n minRowCountError: \"Пожалуйста, заполните не меньше {0} строк.\",\n minSelectError: \"Пожалуйста, выберите хотя бы {0} вариантов.\",\n maxSelectError: \"Пожалуйста, выберите не более {0} вариантов.\",\n numericMinMax: \"'{0}' должно быть не меньше чем {1}, и не больше чем {2}\",\n numericMin: \"'{0}' должно быть не меньше чем {1}\",\n numericMax: \"'{0}' должно быть не больше чем {1}\",\n invalidEmail: \"Пожалуйста, введите действительный адрес электронной почты.\",\n invalidExpression: \"Выражение {0} должно возвращать 'true'.\",\n urlRequestError: \"Запрос вернул ошибку '{0}'. {1}\",\n urlGetChoicesError: \"Ответ на запрос пришел пустой или свойство 'path' указано неверно\",\n exceedMaxSize: \"Размер файла не должен превышать {0}.\",\n otherRequiredError: \"Пожалуйста, введите данные в поле 'Другое'\",\n uploadingFile: \"Ваш файл загружается. Подождите несколько секунд и попробуйте снова.\",\n loadingFile: \"Загрузка...\",\n chooseFile: \"Выберите файл(ы)...\",\n noFileChosen: \"Файл не выбран\",\n confirmDelete: \"Вы точно хотите удалить запись?\",\n keyDuplicationError: \"Это значение должно быть уникальным.\",\n addColumn: \"Добавить колонку\",\n addRow: \"Добавить строку\",\n removeRow: \"Удалить\",\n addPanel: \"Добавить новую\",\n removePanel: \"Удалить\",\n choices_Item: \"Вариант\",\n matrix_column: \"Колонка\",\n matrix_row: \"Строка\",\n savingData: \"Результаты сохраняются на сервер...\",\n savingDataError: \"Произошла ошибка, результат не был сохранён.\",\n savingDataSuccess: \"Результат успешно сохранён!\",\n saveAgainButton: \"Попробовать снова\",\n timerMin: \"мин\",\n timerSec: \"сек\",\n timerSpentAll: \"Вы потратили {0} на этой странице и {1} всего.\",\n timerSpentPage: \"Вы потратили {0} на этой странице.\",\n timerSpentSurvey: \"Вы потратили {0} в течение теста.\",\n timerLimitAll: \"Вы потратили {0} из {1} на этой странице и {2} из {3} для всего теста.\",\n timerLimitPage: \"Вы потратили {0} из {1} на этой странице.\",\n timerLimitSurvey: \"Вы потратили {0} из {1} для всего теста.\",\n cleanCaption: \"Очистить\",\n clearCaption: \"Очистить\",\n chooseFileCaption: \"Выберите файл\",\n removeFileCaption: \"Удалить файл\",\n booleanCheckedLabel: \"Да\",\n booleanUncheckedLabel: \"Нет\",\n confirmRemoveFile: \"Вы уверены, что хотите удалить этот файл: {0}?\",\n confirmRemoveAllFiles: \"Вы уверены, что хотите удалить все файлы?\",\n questionTitlePatternText: \"Название вопроса\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"ru\"] = russianSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"ru\"] = \"русский\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/serbian.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/serbian.ts ***!\n \\*************************************/\n/*! exports provided: serbianStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"serbianStrings\", function() { return serbianStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n//Uncomment this line on creating a translation file\n\nvar serbianStrings = {\n pagePrevText: \"Nazad\",\n pageNextText: \"Dalje\",\n completeText: \"Završi\",\n previewText: \"Pregledaj\",\n editText: \"Izmeni\",\n startSurveyText: \"Započni\",\n otherItemText: \"Drugo (upiši)\",\n noneItemText: \"Ništa\",\n selectAllItemText: \"Izaberi sve\",\n progressText: \"Stranica {0} od {1}\",\n panelDynamicProgressText: \"Upis {0} od {1}\",\n questionsProgressText: \"Odgovoreno na {0}/{1} pitanja\",\n emptySurvey: \"Nema vidljivih stranica ili pitanja u anketi.\",\n completingSurvey: \"Hvala na popunjavanju ankete!\",\n completingSurveyBefore: \"Prema našim podacima, već ste popunili ovu anketu.\",\n loadingSurvey: \"Učitavam anketu...\",\n optionsCaption: \"Izaberi...\",\n value: \"vrednost\",\n requiredError: \"Molimo odgovorite na ovo pitanje.\",\n requiredErrorInPanel: \"Molimo odgovorite na bar jedno pitanje.\",\n requiredInAllRowsError: \"Molimo odgovorite na pitanja u svim redovima.\",\n numericError: \"Vrednost bi trebalo da bude numerička.\",\n minError: \"Vrednost ne bi trebalo da bude manja od {0}\",\n maxError: \"Vrednost ne bi trebalo da bude veća od {0}\",\n textMinLength: \"Molimo unesite bar {0} znak(ov)a.\",\n textMaxLength: \"Molimo unesite najviše {0} znak(ov)a.\",\n textMinMaxLength: \"Molimo unesite najmanje {0} i ne više od {1} znak(ov)a.\",\n minRowCountError: \"Molimo popunite najmanje {0} red(ova).\",\n minSelectError: \"Molimo izaberite najmanje {0} opcija/e.\",\n maxSelectError: \"Molimo izaberite najviše {0} opcija/e.\",\n numericMinMax: \"'{0}' bi trebalo da bude najmanje {1} i najviše {2}\",\n numericMin: \"'{0}' bi trebalo da bude najmanje {1}\",\n numericMax: \"'{0}' bi trebalo da bude najviše {1}\",\n invalidEmail: \"Molimo unesite ispravnu e-mail adresu.\",\n // vratiti \"true\" ?\n invalidExpression: \"Izraz: {0} bi trebalo da bude tačan.\",\n urlRequestError: \"Zahtev je naišao na grešku '{0}'. {1}\",\n urlGetChoicesError: \"Zahtev nije pronašao podatke, ili je putanja netačna\",\n exceedMaxSize: \"Veličina fajla ne bi trebalo da prelazi {0}.\",\n otherRequiredError: \"Molimo unesite drugu vrednost.\",\n uploadingFile: \"Fajl se šalje. Molimo sačekajte neko vreme i pokušajte ponovo.\",\n loadingFile: \"Učitavanje...\",\n chooseFile: \"Izaberite fajlove...\",\n noFileChosen: \"Nije izabran nijedan fajl\",\n confirmDelete: \"Da li želite da izbrišete unos?\",\n keyDuplicationError: \"Ova vrednost treba da bude jedinstvena.\",\n addColumn: \"Dodaj kolonu\",\n addRow: \"Dodaj red\",\n removeRow: \"Ukloni\",\n emptyRowsText: \"Nema redova.\",\n addPanel: \"Dodaj novo\",\n removePanel: \"Ukloni\",\n choices_Item: \"stavka\",\n matrix_column: \"Kolona\",\n matrix_row: \"Red\",\n multipletext_itemname: \"tekst\",\n savingData: \"U toku je čuvanje podataka na serveru...\",\n savingDataError: \"Došlo je do greške i rezultati nisu sačuvani.\",\n savingDataSuccess: \"Rezultati su uspešno sačuvani!\",\n saveAgainButton: \"Pokušajte ponovo\",\n timerMin: \"min\",\n timerSec: \"sek\",\n timerSpentAll: \"Proveli ste {0} na ovoj stranici i {1} ukupno.\",\n timerSpentPage: \"Proveli ste {0} na ovoj stranici.\",\n timerSpentSurvey: \"Proveli ste {0} ukupno.\",\n timerLimitAll: \"Proveli ste {0} od {1} na ovoj stranici i {2} od {3} ukupno.\",\n timerLimitPage: \"Proveli ste {0} od {1} na ovoj stranici.\",\n timerLimitSurvey: \"Proveli ste {0} od {1} ukupno.\",\n cleanCaption: \"Očisti\",\n clearCaption: \"Poništi\",\n chooseFileCaption: \"Izaberi fajl\",\n removeFileCaption: \"Ukloni ovaj fajl\",\n booleanCheckedLabel: \"Da\",\n booleanUncheckedLabel: \"Ne\",\n confirmRemoveFile: \"Da li ste sigurni da želite da uklonite ovaj fajl: {0}?\",\n confirmRemoveAllFiles: \"Da li ste sigurni da želite da uklonite sve fajlove?\",\n questionTitlePatternText: \"Naslov pitanja\",\n modalCancelButtonText: \"Otkaži\",\n modalApplyButtonText: \"Primeni\",\n};\n//Uncomment these two lines on creating a translation file. You should replace \"en\" and enStrings with your locale (\"fr\", \"de\" and so on) and your variable.\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"rs\"] = serbianStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"rs\"] = \"Srpski\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/simplified-chinese.ts\":\n/*!************************************************!*\\\n !*** ./src/localization/simplified-chinese.ts ***!\n \\************************************************/\n/*! exports provided: simplifiedChineseSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"simplifiedChineseSurveyStrings\", function() { return simplifiedChineseSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar simplifiedChineseSurveyStrings = {\n pagePrevText: \"上一页\",\n pageNextText: \"下一页\",\n completeText: \"提交问卷\",\n previewText: \"预览\",\n editText: \"编辑\",\n startSurveyText: \"开始问卷\",\n otherItemText: \"填写其他答案\",\n noneItemText: \"无\",\n selectAllItemText: \"选择全部\",\n progressText: \"第 {0} 页, 共 {1} 页\",\n panelDynamicProgressText: \"{0} of {1}\",\n questionsProgressText: \"第 {0}/{1} 题\",\n emptySurvey: \"问卷中没有问题或页面\",\n completingSurvey: \"感谢您的参与!\",\n completingSurveyBefore: \"你已完成问卷.\",\n loadingSurvey: \"问卷正在加载中...\",\n optionsCaption: \"请选择...\",\n value: \"值\",\n requiredError: \"请填写此问题\",\n requiredErrorInPanel: \"至少回答一题.\",\n requiredInAllRowsError: \"请填写所有行中问题\",\n numericError: \"答案必须是个数字\",\n minError: \"该值不能小于 {0}\",\n maxError: \"该值不能大于 {0}\",\n textMinLength: \"答案长度至少 {0} 个字符\",\n textMaxLength: \"答案长度不能超过 {0} 个字符\",\n textMinMaxLength: \"答案长度必须在 {0} - {1} 个字符之间\",\n minRowCountError: \"最少需要填写 {0} 行答案\",\n minSelectError: \"最少需要选择 {0} 项答案\",\n maxSelectError: \"最多只能选择 {0} 项答案\",\n numericMinMax: \"答案 '{0}' 必须大于等于 {1} 且小于等于 {2}\",\n numericMin: \"答案 '{0}' 必须大于等于 {1}\",\n numericMax: \"答案 '{0}' 必须小于等于 {1}\",\n invalidEmail: \"请输入有效的 Email 地址\",\n invalidExpression: \"公式: {0} 无效.\",\n urlRequestError: \"载入选项时发生错误 '{0}': {1}\",\n urlGetChoicesError: \"未能载入有效的选项或请求参数路径有误\",\n exceedMaxSize: \"文件大小不能超过 {0}\",\n otherRequiredError: \"请完成其他问题\",\n uploadingFile: \"文件上传中... 请耐心等待几秒后重试\",\n loadingFile: \"加载...\",\n chooseFile: \"选择文件...\",\n noFileChosen: \"未选择文件\",\n confirmDelete: \"删除记录?\",\n keyDuplicationError: \"主键不能重复\",\n addColumn: \"添加列\",\n addRow: \"添加行\",\n removeRow: \"删除答案\",\n emptyRowsText: \"无内容\",\n addPanel: \"新添\",\n removePanel: \"删除\",\n choices_Item: \"选项\",\n matrix_column: \"列\",\n matrix_row: \"行\",\n multipletext_itemname: \"文本\",\n savingData: \"正在将结果保存到服务器...\",\n savingDataError: \"在保存结果过程中发生了错误,结果未能保存\",\n savingDataSuccess: \"结果保存成功!\",\n saveAgainButton: \"请重试\",\n timerMin: \"分\",\n timerSec: \"秒\",\n timerSpentAll: \"本页用时 {0} 总计用时{1} .\",\n timerSpentPage: \"本页用时{0} .\",\n timerSpentSurvey: \"总计用时 {0} .\",\n timerLimitAll: \"本页用时 {0} 共 {1}, 总计用时 {2} 共 {3} .\",\n timerLimitPage: \"本页用时 {0} 共 {1} .\",\n timerLimitSurvey: \"总计用时 {0} 共 {1}.\",\n cleanCaption: \"清理\",\n clearCaption: \"清除\",\n chooseFileCaption: \"选择文件\",\n removeFileCaption: \"移除文件\",\n booleanCheckedLabel: \"是\",\n booleanUncheckedLabel: \"否\",\n confirmRemoveFile: \"删除文件: {0}?\",\n confirmRemoveAllFiles: \"删除所有文件?\",\n questionTitlePatternText: \"标题\",\n modalCancelButtonText: \"取消\",\n modalApplyButtonText: \"确定\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"zh-cn\"] = simplifiedChineseSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"zh-cn\"] = \"简体中文\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/spanish.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/spanish.ts ***!\n \\*************************************/\n/*! exports provided: spanishSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"spanishSurveyStrings\", function() { return spanishSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar spanishSurveyStrings = {\n pagePrevText: \"Anterior\",\n pageNextText: \"Siguiente\",\n completeText: \"Completar\",\n previewText: \"Vista previa\",\n editText: \"Edita\",\n startSurveyText: \"Comienza\",\n otherItemText: \"Otro (describa)\",\n noneItemText: \"Ninguno\",\n selectAllItemText: \"Seleccionar todo\",\n progressText: \"Página {0} de {1}\",\n panelDynamicProgressText: \"Registro {0} de {1}\",\n questionsProgressText: \"Respondió a {0}/{1} preguntas\",\n emptySurvey: \"No hay página visible o pregunta en la encuesta.\",\n completingSurvey: \"Gracias por completar la encuesta!\",\n completingSurveyBefore: \"Nuestros registros muestran que ya ha completado esta encuesta.\",\n loadingSurvey: \"La encuesta está cargando...\",\n optionsCaption: \"Seleccione...\",\n value: \"valor\",\n requiredError: \"Por favor conteste la pregunta.\",\n requiredErrorInPanel: \"Por favor, responda al menos una pregunta.\",\n requiredInAllRowsError: \"Por favor conteste las preguntas en cada hilera.\",\n numericError: \"La estimación debe ser numérica.\",\n textMinLength: \"Por favor entre por lo menos {0} símbolos.\",\n textMaxLength: \"Por favor entre menos de {0} símbolos.\",\n textMinMaxLength: \"Por favor entre más de {0} y menos de {1} símbolos.\",\n minRowCountError: \"Por favor llene por lo menos {0} hileras.\",\n minSelectError: \"Por favor seleccione por lo menos {0} variantes.\",\n maxSelectError: \"Por favor seleccione no más de {0} variantes.\",\n numericMinMax: \"El '{0}' debe de ser igual o más de {1} y igual o menos de {2}\",\n numericMin: \"El '{0}' debe ser igual o más de {1}\",\n numericMax: \"El '{0}' debe ser igual o menos de {1}\",\n invalidEmail: \"Por favor agregue un correo electrónico válido.\",\n invalidExpression: \"La expresión: {0} debería devolver 'verdadero'.\",\n urlRequestError: \"La solicitud regresó error '{0}'. {1}\",\n urlGetChoicesError: \"La solicitud regresó vacío de data o la propiedad 'trayectoria' no es correcta\",\n exceedMaxSize: \"El tamaño del archivo no debe de exceder {0}.\",\n otherRequiredError: \"Por favor agregue la otra estimación.\",\n uploadingFile: \"Su archivo se está subiendo. Por favor espere unos segundos e intente de nuevo.\",\n loadingFile: \"Cargando...\",\n chooseFile: \"Elija archivo(s)...\",\n noFileChosen: \"No se ha elegido ningún archivo\",\n confirmDelete: \"¿Quieres borrar el registro?\",\n keyDuplicationError: \"Este valor debe ser único.\",\n addColumn: \"Añadir columna\",\n addRow: \"Agregue una hilera\",\n removeRow: \"Eliminar una hilera\",\n addPanel: \"Añadir nuevo\",\n removePanel: \"Retire\",\n choices_Item: \"artículo\",\n matrix_column: \"Columna\",\n matrix_row: \"Hilera\",\n savingData: \"Los resultados se están guardando en el servidor...\",\n savingDataError: \"Los resultados se están guardando en el servidor...\",\n savingDataSuccess: \"¡Los resultados se guardaron con éxito!\",\n saveAgainButton: \"Inténtalo de nuevo.\",\n timerMin: \"min\",\n timerSec: \"sec\",\n timerSpentAll: \"Has gastado {0} en esta página y {1} en total.\",\n timerSpentPage: \"Usted ha pasado {0} en esta página.\",\n timerSpentSurvey: \"Has gastado en total.\",\n timerLimitAll: \"Has gastado {0} de {1} en esta página y {2} de {3} en total.\",\n timerLimitPage: \"Has gastado {0} de {1} en esta página.\",\n timerLimitSurvey: \"Usted ha gastado {0} de {1} en total.\",\n cleanCaption: \"Limpia\",\n clearCaption: \"Despejen\",\n chooseFileCaption: \"Elija el archivo\",\n removeFileCaption: \"Elimina este archivo\",\n booleanCheckedLabel: \"Sí\",\n booleanUncheckedLabel: \"No\",\n confirmRemoveFile: \"¿Estás seguro de que quieres eliminar este archivo: {0}?\",\n confirmRemoveAllFiles: \"¿Estás seguro de que quieres eliminar todos los archivos?\",\n questionTitlePatternText: \"Título de la pregunta\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"es\"] = spanishSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"es\"] = \"español\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/swahili.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/swahili.ts ***!\n \\*************************************/\n/*! exports provided: swahiliStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"swahiliStrings\", function() { return swahiliStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar swahiliStrings = {\n pagePrevText: \"Iliyotangulia\",\n pageNextText: \"Ifuatayo\",\n completeText: \"Kamili\",\n previewText: \"Hakiki\",\n editText: \"Hariri\",\n startSurveyText: \"Anza\",\n otherItemText: \"Nyingine (eleza)\",\n noneItemText: \"Hakuna\",\n selectAllItemText: \"Chagua Zote\",\n progressText: \"Ukurasa {0} wa {1}\",\n panelDynamicProgressText: \"Rekodi {0} ya {1}\",\n questionsProgressText: \"Yaliyojibiwa {0}/{1} maswali\",\n emptySurvey: \"Hakuna ukurasa unaoonekana au swali katika utafiti.\",\n completingSurvey: \"Asanti kwa kukamilisha utafiti!\",\n completingSurveyBefore: \"Recodi zetu zinatuonyesha tayari umekamilisha utafiti.\",\n loadingSurvey: \"Tunaandaa utafiti...\",\n optionsCaption: \"Chagua...\",\n value: \"thamani\",\n requiredError: \"Tafadhali jibu hili swali.\",\n requiredErrorInPanel: \"Tafadhali jibu swali angalau moja.\",\n requiredInAllRowsError: \"Tafadhali jibu maswali katika safu zote.\",\n numericError: \"Thamani inapaswa kuwa ya nambari.\",\n textMinLength: \"Tafadhali ingiza angalau{0} husika.\",\n textMaxLength: \"Tafadhali ingiza isiozidi {0} husika.\",\n textMinMaxLength: \"Tafadhali ingiza kiwango zaidi ya {0} na kisichopungua {1} husika.\",\n minRowCountError: \"Tafadhali jaza isiopungua {0} safu.\",\n minSelectError: \"Tafadhali chagua angalau {0} lahaja.\",\n maxSelectError: \"Tafadhali changua isiozidi {0} lahaja.\",\n numericMinMax: \" '{0}' inapaswa kuwa sawa au zaidi ya {1} na sawa au chini ya {2}\",\n numericMin: \" '{0}'inapaswa kuwa sawa au zaidi ya {1}\",\n numericMax: \" '{0}'inapaswa kuwa sawa au chini ya {1}\",\n invalidEmail: \"Tafadhali ingiza anwani halali ya barua-pepe.\",\n invalidExpression: \"Usemi:{0} inapaswa kurudi 'kweli'.\",\n urlRequestError: \"Ombi lina kosa '{0}'. {1}\",\n urlGetChoicesError: \"Ombi lilirudisha data tupu au the 'path' mali ya njia sio sahihi\",\n exceedMaxSize: \"Saizi ya faili haipaswi kuzidi {0}.\",\n otherRequiredError: \"Tafadhali ingiza thamani nyingine.\",\n uploadingFile: \"Faili yako inapakia.Tafadhali subiri sekunde kadhaa na ujaribu tena.\",\n loadingFile: \"Inapakia...\",\n chooseFile: \"Chagua faili...\",\n noFileChosen: \"Hujachagua faili\",\n confirmDelete: \"Je! Unataka kufuta rekodi?\",\n keyDuplicationError: \"Thamani hii inapaswa kuwa ya kipekee.\",\n addColumn: \"Ongeza Kolamu\",\n addRow: \"Ongeza safu\",\n removeRow: \"Toa\",\n addPanel: \"Ongeza mpya\",\n removePanel: \"Toa\",\n choices_Item: \"kitu\",\n matrix_column: \"Kolamu\",\n matrix_row: \"Safu\",\n savingData: \"Matokeo yamehifadhiwa kwa seva...\",\n savingDataError: \"Kosa limetokea na hatukuweza kuhifadhi matokeo.\",\n savingDataSuccess: \"Matokeo yamehifadhiwa!\",\n saveAgainButton: \"Jaribu tena\",\n timerMin: \"dakika\",\n timerSec: \"sekunde\",\n timerSpentAll: \"Umetumia {0} kwenye ukurasa huu na {1} kwa jumla.\",\n timerSpentPage: \"Umetumia {0} kwenye ukurasa huu.\",\n timerSpentSurvey: \"Umetumia {0} kwa jumla.\",\n timerLimitAll: \"Umetumia {0} ya {1} kwenye ukurasa huu {2} wa {3} kwa jumla.\",\n timerLimitPage: \"Umetumia {0} ya {1} kwenye ukurasa huu.\",\n timerLimitSurvey: \"Umetumia {0} ya {1} kwa jumla.\",\n cleanCaption: \"Safisha\",\n clearCaption: \"Ondoa\",\n chooseFileCaption: \"Chagua faili\",\n removeFileCaption: \"Ondoa faili\",\n booleanCheckedLabel: \"Ndio\",\n booleanUncheckedLabel: \"Hapana\",\n confirmRemoveFile: \"Je! Una uhakika kuwa unataka kuondoa faili hii: {0}?\",\n confirmRemoveAllFiles: \"Je! Una uhakika kuwa unataka kuondoa faili zote?\",\n questionTitlePatternText: \"Kichwa cha Swali\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"sw\"] = swahiliStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"sw\"] = \"swahili\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/swedish.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/swedish.ts ***!\n \\*************************************/\n/*! exports provided: swedishSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"swedishSurveyStrings\", function() { return swedishSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n//Create by Mattias Asplund\n\nvar swedishSurveyStrings = {\n pagePrevText: \"Föregående\",\n pageNextText: \"Nästa\",\n completeText: \"Färdig\",\n previewText: \"Förhandsvisning\",\n editText: \"Redigera\",\n startSurveyText: \"Start\",\n otherItemText: \"Annat (beskriv)\",\n noneItemText: \"Ingen\",\n selectAllItemText: \"Välj alla\",\n progressText: \"Sida {0} av {1}\",\n panelDynamicProgressText: \"Spela in {0} av {1}\",\n questionsProgressText: \"Besvarade {0} / {1} frågor\",\n emptySurvey: \"Det finns ingen synlig sida eller fråga i enkäten.\",\n completingSurvey: \"Tack för att du genomfört enkäten!!\",\n completingSurveyBefore: \"Våra register visar att du redan har slutfört denna undersökning.\",\n loadingSurvey: \"Enkäten laddas...\",\n optionsCaption: \"Välj...\",\n value: \"värde\",\n requiredError: \"Var vänlig besvara frågan.\",\n requiredErrorInPanel: \"Vänligen svara på minst en fråga.\",\n requiredInAllRowsError: \"Var vänlig besvara frågorna på alla rader.\",\n numericError: \"Värdet ska vara numeriskt.\",\n textMinLength: \"Var vänlig ange minst {0} tecken.\",\n textMaxLength: \"Ange färre än {0} tecken.\",\n textMinMaxLength: \"Ange mer än {0} och färre än {1} tecken.\",\n minRowCountError: \"Var vänlig fyll i minst {0} rader.\",\n minSelectError: \"Var vänlig välj åtminstone {0} varianter.\",\n maxSelectError: \"Var vänlig välj inte fler än {0} varianter.\",\n numericMinMax: \"'{0}' ska vara lika med eller mer än {1} samt lika med eller mindre än {2}\",\n numericMin: \"'{0}' ska vara lika med eller mer än {1}\",\n numericMax: \"'{0}' ska vara lika med eller mindre än {1}\",\n invalidEmail: \"Var vänlig ange en korrekt e-postadress.\",\n invalidExpression: \"Uttrycket: {0} ska returnera 'true'.\",\n urlRequestError: \"Förfrågan returnerade felet '{0}'. {1}\",\n urlGetChoicesError: \"Antingen returnerade förfrågan ingen data eller så är egenskapen 'path' inte korrekt\",\n exceedMaxSize: \"Filstorleken får ej överstiga {0}.\",\n otherRequiredError: \"Var vänlig ange det andra värdet.\",\n uploadingFile: \"Din fil laddas upp. Var vänlig vänta några sekunder och försök sedan igen.\",\n loadingFile: \"Läser in...\",\n chooseFile: \"Välj fil (er) ...\",\n noFileChosen: \"Ingen fil vald\",\n confirmDelete: \"Vill du radera posten?\",\n keyDuplicationError: \"Detta värde ska vara unikt.\",\n addColumn: \"Lägg till kolumn\",\n addRow: \"Lägg till rad\",\n removeRow: \"Ta bort\",\n addPanel: \"Lägg till ny\",\n removePanel: \"Ta bort\",\n choices_Item: \"Artikel\",\n matrix_column: \"Kolumn\",\n matrix_row: \"Rad\",\n savingData: \"Resultaten sparas på servern ...\",\n savingDataError: \"Ett fel inträffade och vi kunde inte spara resultaten.\",\n savingDataSuccess: \"Resultaten sparades framgångsrikt!\",\n saveAgainButton: \"Försök igen\",\n timerMin: \"min\",\n timerSec: \"sek\",\n timerSpentAll: \"Du har spenderat {0} på den här sidan och {1} totalt.\",\n timerSpentPage: \"Du har spenderat {0} på den här sidan.\",\n timerSpentSurvey: \"Du har spenderat {0} totalt.\",\n timerLimitAll: \"Du har spenderat {0} av {1} på den här sidan och {2} av {3} totalt.\",\n timerLimitPage: \"Du har spenderat {0} av {1} på den här sidan.\",\n timerLimitSurvey: \"Du har spenderat {0} av {1} totalt.\",\n cleanCaption: \"Rena\",\n clearCaption: \"Klar\",\n chooseFileCaption: \"Välj FIL\",\n removeFileCaption: \"Ta bort den här filen\",\n booleanCheckedLabel: \"Ja\",\n booleanUncheckedLabel: \"Nej\",\n confirmRemoveFile: \"Är du säker på att du vill ta bort den här filen: {0}?\",\n confirmRemoveAllFiles: \"Är du säker på att du vill ta bort alla filer?\",\n questionTitlePatternText: \"Frågetitel\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"sv\"] = swedishSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"sv\"] = \"svenska\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/tajik.ts\":\n/*!***********************************!*\\\n !*** ./src/localization/tajik.ts ***!\n \\***********************************/\n/*! exports provided: tajikSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"tajikSurveyStrings\", function() { return tajikSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar tajikSurveyStrings = {\n pagePrevText: \"Бозгашт\",\n pageNextText: \"Оянда\",\n completeText: \"Иҷро шуд\",\n startSurveyText: \"Оғоз\",\n otherItemText: \"Дигар (лутфан тавсиф кунед)\",\n noneItemText: \"Не\",\n selectAllItemText: \"Ҳамаро интихоб кардан\",\n progressText: \"Саҳифаи {0} аз {1}\",\n emptySurvey: \"Ягон савол вуҷуд надорад.\",\n completingSurvey: \"Ташаккур барои пур кардани саволнома!\",\n completingSurveyBefore: \"Шумо аллакай ин пурсишро анҷом додаед.\",\n loadingSurvey: \"Боргирӣ аз сервер...\",\n optionsCaption: \"Интихоб кардан...\",\n value: \"қиммат\",\n requiredError: \"Илтимос, ба савол ҷавоб диҳед.\",\n requiredErrorInPanel: \"Илтимос, ақалан ба як савол ҷавоб диҳед.\",\n requiredInAllRowsError: \"Илтимос, ба ҳамаи саволҳо дар ҳамаи сатрҳо ҷавоб диҳед.\",\n numericError: \"Ҷавоб бояд рақам бошад.\",\n textMinLength: \"Илтимос, аз {0} зиёдтар рамз ворид кунед.\",\n textMaxLength: \"Илтимос, аз {0} камтар рамз ворид кунед.\",\n textMinMaxLength: \"Илтимос, аз {0} зиёдтар ва аз {1} камтар рамз ворид кунед.\",\n minRowCountError: \"Илтимос, на камтар аз {0} сатр пур кунед.\",\n minSelectError: \"Илтимос, ақалан {0} вариант интихоб кунед.\",\n maxSelectError: \"Илтимос, на зиёдтар аз {0} вариант интихоб кунед.\",\n numericMinMax: \"'{0}' бояд на кам аз {1} ва на бисёр аз {2} бошад\",\n numericMin: \"'{0}' бояд на кам аз {1} бошад\",\n numericMax: \"'{0}' бояд на зиёд аз {1} бошад\",\n invalidEmail: \"Илтимос, почтаи электронии воқеиро ворид кунед.\",\n invalidExpression: \"Ифодаи {0} бояд 'true' баргардонад.\",\n urlRequestError: \"Дархост хатогӣ бозгардонд '{0}'. {1}\",\n urlGetChoicesError: \"Ҷавоб ба дархост холӣ омад ё хосияти 'path' нодуруст муайян карда шудааст\",\n exceedMaxSize: \"Андозаи файл бояд на калон аз {0} бошад.\",\n otherRequiredError: \"Илтимос, ба майдони 'Дигар' додаҳоро ворид кунед\",\n uploadingFile: \"Файли шумо бор шуда истодааст. Якчанд сония интизор шавед ва бори дигар кӯшиш кунед.\",\n loadingFile: \"Боркунӣ...\",\n chooseFile: \"Файл(ҳо)-ро интихоб кунед...\",\n confirmDelete: \"Шумо мутмаин ҳастед, ки мехоҳед воридро тоза кунед?\",\n keyDuplicationError: \"Ин арзиш бояд беназир бошад.\",\n addColumn: \"Иловаи сутун\",\n addRow: \"Иловаи сатр\",\n removeRow: \"Нест кардан\",\n addPanel: \"Илова кардан\",\n removePanel: \"Нест кардан\",\n choices_Item: \"Вариант\",\n matrix_column: \"Сутун\",\n matrix_row: \"Сатр\",\n savingData: \"Натиҷа ба сервер сабт шуда истодаанд...\",\n savingDataError: \"Хатогӣ ба амал омад, натиҷа сабт нашуд.\",\n savingDataSuccess: \"Натиҷа бомуваффакият сабт шуд!\",\n saveAgainButton: \"Бори дигар кӯшиш карданд\",\n timerMin: \"дақ\",\n timerSec: \"сон\",\n timerSpentAll: \"Шумо {0} дар ин саҳифа ва {1} дар умум сарф кардед.\",\n timerSpentPage: \"Шумо {0} дар ин саҳифа сарф кардед.\",\n timerSpentSurvey: \"Шумо {0} дар ин тест сарф намудед.\",\n timerLimitAll: \"Шумо {0} аз {1} дар ин саҳифа ва {2} аз {3} дар умум сарф кардед дар дохили ин тест.\",\n timerLimitPage: \"Шумо {0} аз {1} дар ин саҳифа сарф кардед.\",\n timerLimitSurvey: \"Шумо {0} аз {1} дар ҳамаи тест сарф кардед.\",\n cleanCaption: \"Тоза кардан\",\n clearCaption: \"Тоза кардан\",\n removeFileCaption: \"Файлро нест кардан\"\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"tg\"] = tajikSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"tg\"] = \"тоҷикӣ\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/thai.ts\":\n/*!**********************************!*\\\n !*** ./src/localization/thai.ts ***!\n \\**********************************/\n/*! exports provided: thaiStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"thaiStrings\", function() { return thaiStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n//Created by Padet Taweekunkan\n\nvar thaiStrings = {\n pagePrevText: \"ก่อนหน้า\",\n pageNextText: \"ถัดไป\",\n completeText: \"สำเร็จ\",\n previewText: \"ดูตัวอย่าง\",\n editText: \"แก้ไข\",\n startSurveyText: \"เริ่ม\",\n otherItemText: \"อื่นๆ (โปรดระบุ)\",\n noneItemText: \"ไม่มี\",\n selectAllItemText: \"เลือกทั้งหมด\",\n progressText: \"หน้าที่ {0} จาก {1}\",\n panelDynamicProgressText: \"รายการที่ {0} จาก {1}\",\n questionsProgressText: \"คำตอบที่ {0}/{1} จำนวนคำถาม\",\n emptySurvey: \"ไม่มีหน้าเพจที่มองเห็น หรือ คำถามใน survey นี้\",\n completingSurvey: \"ขอบคุณที่ทำ survey จนเสร็จ\",\n completingSurveyBefore: \"รายการของเราแสดงว่าคุณได้ทำ survey เสร็จเรียบร้อยแล้ว\",\n loadingSurvey: \"กำลังโหลด Survey...\",\n optionsCaption: \"เลือก...\",\n value: \"ข้อมูล\",\n requiredError: \"กรุณาตอบคำถาม\",\n requiredErrorInPanel: \"กรุณาตอบขั้นต่ำหนึ่งคำถาม\",\n requiredInAllRowsError: \"กรุณาตอบคำถามในทุกๆแถว\",\n numericError: \"ข้อมูลที่ใส่ต้องเป็นตัวเลข\",\n textMinLength: \"กรุณาใส่ขั้นต่ำจำนวน {0} ตัวอักษร\",\n textMaxLength: \"กรุณาใส่ไม่เกินจำนวน {0} ตัวอักษร\",\n textMinMaxLength: \"กรุณาใส่ขั้นต่ำจำนวน {0} และไม่เกินจำนวน {1} ตัวอักษร\",\n minRowCountError: \"กรุณาใส่ขั้นต่ำจำนวน {0} แถว\",\n minSelectError: \"กรุณาเลือกอย่างน้อย {0} รายการ\",\n maxSelectError: \"กรุณาเลือกไม่เกิน {0} รายการ\",\n numericMinMax: \"'{0}' ต้องมากกว่าหรือเท่ากับ {1} และน้อยกว่าหรือเท่ากับ {2}\",\n numericMin: \"'{0}' ต้องมากกว่าหรือเท่ากับ {1}\",\n numericMax: \"'{0}' น้อยกว่าหรือเท่ากับ {1}\",\n invalidEmail: \"กรุณาใส่อีเมล์แอดเดรสที่ถูกต้อง\",\n invalidExpression: \"The expression: {0} ต้องรีเทิร์น 'true'.\",\n urlRequestError: \"รีเควสรีเทิร์น error '{0}'. {1}\",\n urlGetChoicesError: \"รีเควสรีเทิร์นข้อมูลว่างเปล่า หรือ 'path' property ไม่ถูกต้อง\",\n exceedMaxSize: \"ขนาดไฟล์ต้องไม่เกิน {0}.\",\n otherRequiredError: \"กรุณาใส่ค่าอื่น\",\n uploadingFile: \"ไฟล์ของคุณกำลังอัพโหลดอยู่. กรุณารอสักครู่แล้วทำการลองอีกครั้ง\",\n loadingFile: \"กำลังโหลด...\",\n chooseFile: \"เลือกไฟล์...\",\n noFileChosen: \"ไม่ไฟล์ที่เลือก\",\n confirmDelete: \"คุณต้องการลบรายการนี้จริงหรือไม่?\",\n keyDuplicationError: \"ข้อมูลนี้ต้องเป็น unique.\",\n addColumn: \"เพิ่มคอลัมน์\",\n addRow: \"เพิ่มแถว\",\n removeRow: \"ลบ\",\n addPanel: \"เพิ่ม\",\n removePanel: \"ลบ\",\n choices_Item: \"ชิ้น\",\n matrix_column: \"คอลัมน์\",\n matrix_row: \"แถว\",\n savingData: \"ผลลัพท์กำลังบันทึกลงที่เซิร์ฟเวอร์...\",\n savingDataError: \"มีความผิดพลาดเกิดขึ้นส่งผลให้ไม่สามารถบันทึกผลได้\",\n savingDataSuccess: \"บันทึกสำเร็จแล้ว\",\n saveAgainButton: \"รบกวนลองอีกครั้ง\",\n timerMin: \"นาที\",\n timerSec: \"วินาที\",\n timerSpentAll: \"คุณใช้เวลา {0} บนหน้านี้และ {1} รวมทั้งหมด\",\n timerSpentPage: \"คุณใช้เวลา {0} บนหน้านี้\",\n timerSpentSurvey: \"คุณใช้เวลา {0} รวมทั้งหมด\",\n timerLimitAll: \"คุณใช้เวลา {0} ของ {1} บนหน้านี้และ {2} ของ {3} รวมทั้งหมด\",\n timerLimitPage: \"คุณใช้เวลา {0} ของ {1} บนหน้านี้\",\n timerLimitSurvey: \"คุณใช้เวลา {0} ของ {1} รวมทั้งหมด\",\n cleanCaption: \"คลีน\",\n clearCaption: \"เคลียร์\",\n chooseFileCaption: \"เลือกไฟล์\",\n removeFileCaption: \"นำไฟล์นี้ออก\",\n booleanCheckedLabel: \"ใช่\",\n booleanUncheckedLabel: \"ไม่ใช่\",\n confirmRemoveFile: \"คุณแน่ใจที่จะนำไฟล์นี้ออกใช่หรือไม่: {0}?\",\n confirmRemoveAllFiles: \"คุณแน่ใจที่จะนำไฟล์ทั้งหมดออกใช่หรือไม่\",\n questionTitlePatternText: \"ชื่อคำถาม\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"th\"] = thaiStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"th\"] = \"ไทย\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/traditional-chinese.ts\":\n/*!*************************************************!*\\\n !*** ./src/localization/traditional-chinese.ts ***!\n \\*************************************************/\n/*! exports provided: traditionalChineseSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"traditionalChineseSurveyStrings\", function() { return traditionalChineseSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar traditionalChineseSurveyStrings = {\n pagePrevText: \"上一頁\",\n pageNextText: \"下一頁\",\n completeText: \"提交問卷\",\n otherItemText: \"填寫其他答案\",\n progressText: \"第 {0} 頁, 共 {1} 頁\",\n emptySurvey: \"問卷中沒有問題或頁面\",\n completingSurvey: \"感謝您的參與!\",\n loadingSurvey: \"問卷載入中...\",\n optionsCaption: \"請選擇...\",\n requiredError: \"請填寫此問題\",\n requiredInAllRowsError: \"請填寫所有行中問題\",\n numericError: \"答案必須是個數字\",\n textMinLength: \"答案長度至少 {0} 個字元\",\n textMaxLength: \"答案長度不能超過 {0} 個字元\",\n textMinMaxLength: \"答案長度必須在 {0} - {1} 個字元之間\",\n minRowCountError: \"最少需要填寫 {0} 行答案\",\n minSelectError: \"最少需要選擇 {0} 項答案\",\n maxSelectError: \"最多只能選擇 {0} 項答案\",\n numericMinMax: \"答案 '{0}' 必須大於等於 {1} 且小於等於 {2}\",\n numericMin: \"答案 '{0}' 必須大於等於 {1}\",\n numericMax: \"答案 '{0}' 必須小於等於 {1}\",\n invalidEmail: \"請輸入有效的 Email 地址\",\n urlRequestError: \"載入選項時發生錯誤 '{0}': {1}\",\n urlGetChoicesError: \"未能載入有效的選項或請求參數路徑有誤\",\n exceedMaxSize: \"文件大小不能超過 {0}\",\n otherRequiredError: \"請完成其他問題\",\n uploadingFile: \"文件上傳中... 請耐心等待幾秒後重試\",\n addRow: \"添加答案\",\n removeRow: \"刪除答案\",\n choices_Item: \"選項\",\n matrix_column: \"列\",\n matrix_row: \"行\",\n savingData: \"正在將結果保存到服務器...\",\n savingDataError: \"在保存結果過程中發生了錯誤,結果未能保存\",\n savingDataSuccess: \"結果保存成功!\",\n saveAgainButton: \"請重試\"\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"zh-tw\"] = traditionalChineseSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"zh-tw\"] = \"繁體中文\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/turkish.ts\":\n/*!*************************************!*\\\n !*** ./src/localization/turkish.ts ***!\n \\*************************************/\n/*! exports provided: turkishSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"turkishSurveyStrings\", function() { return turkishSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar turkishSurveyStrings = {\n pagePrevText: \"Geri\",\n pageNextText: \"İleri\",\n completeText: \"Anketi Tamamla\",\n previewText: \"Ön izleme\",\n editText: \"Düzenle\",\n startSurveyText: \"Başlat\",\n otherItemText: \"Diğer (açıklayınız)\",\n noneItemText: \"Yok\",\n selectAllItemText: \"Hepsini seç\",\n progressText: \"Sayfa {0} / {1}\",\n panelDynamicProgressText: \"Kayıt {0} / {1}\",\n questionsProgressText: \"Soruları cevapladı {0} / {1}\",\n emptySurvey: \"Ankette görüntülenecek sayfa ya da soru mevcut değil.\",\n completingSurvey: \"Anketimizi tamamladığınız için teşekkür ederiz.\",\n completingSurveyBefore: \"Kayıtlarımız, bu anketi zaten tamamladığınızı gösteriyor.\",\n loadingSurvey: \"Anket sunucudan yükleniyor ...\",\n optionsCaption: \"Seçiniz ...\",\n value: \"değer\",\n requiredError: \"Lütfen soruya cevap veriniz\",\n requiredErrorInPanel: \"Lütfen en az bir soruyu yanıtlayın.\",\n requiredInAllRowsError: \"Lütfen tüm satırlardaki soruları cevaplayınız.\",\n numericError: \"Girilen değer numerik olmalıdır\",\n textMinLength: \"En az {0} sembol giriniz.\",\n textMaxLength: \"Lütfen {0} karakterden az girin.\",\n textMinMaxLength: \"Lütfen {0} ’den fazla ve {1} ’den az karakter girin.\",\n minRowCountError: \"Lütfen en az {0} satırı doldurun.\",\n minSelectError: \"Lütfen en az {0} seçeneği seçiniz.\",\n maxSelectError: \"Lütfen {0} adetten fazla seçmeyiniz.\",\n numericMinMax: \"The '{0}' should be equal or more than {1} and equal or less than {2}\",\n numericMin: \"'{0}' değeri {1} değerine eşit veya büyük olmalıdır\",\n numericMax: \"'{0}' değeri {1} değerine eşit ya da küçük olmalıdır.\",\n invalidEmail: \"Lütfen geçerli bir eposta adresi giriniz.\",\n invalidExpression: \"İfade: {0} 'true' döndürmelidir.\",\n urlRequestError: \"Talebi şu hatayı döndü '{0}'. {1}\",\n urlGetChoicesError: \"Talep herhangi bir veri dönmedi ya da 'path' özelliği hatalı.\",\n exceedMaxSize: \"Dosya boyutu {0} değerini geçemez.\",\n otherRequiredError: \"Lütfen diğer değerleri giriniz.\",\n uploadingFile: \"Dosyanız yükleniyor. LÜtfen birkaç saniye bekleyin ve tekrar deneyin.\",\n loadingFile: \"Yükleniyor...\",\n chooseFile: \"Dosyaları seçin ...\",\n noFileChosen: \"Dosya seçili değil\",\n confirmDelete: \"Kaydı silmek istiyor musunuz?\",\n keyDuplicationError: \"Bu değer benzersiz olmalıdır.\",\n addColumn: \"Sütun ekleyin\",\n addRow: \"Satır Ekle\",\n removeRow: \"Kaldır\",\n addPanel: \"Yeni ekle\",\n removePanel: \"Kaldırmak\",\n choices_Item: \"eşya\",\n matrix_column: \"Sütun\",\n matrix_row: \"Kürek çekmek\",\n savingData: \"Sonuçlar sunucuya kaydediliyor ...\",\n savingDataError: \"Bir hata oluştu ve sonuçları kaydedemedik.\",\n savingDataSuccess: \"Sonuçlar başarıyla kaydedildi!\",\n saveAgainButton: \"Tekrar deneyin\",\n timerMin: \"min\",\n timerSec: \"saniye\",\n timerSpentAll: \"Bu sayfada {0} ve toplamda {1} harcadınız.\",\n timerSpentPage: \"Bu sayfaya {0} harcadınız.\",\n timerSpentSurvey: \"Toplamda {0} harcadınız.\",\n timerLimitAll: \"Bu sayfaya {0} / {1} ve toplamda {2} / {3} harcadınız.\",\n timerLimitPage: \"Bu sayfaya {0} / {1} harcadınız.\",\n timerLimitSurvey: \"Toplamda {0} / {1} harcadınız.\",\n cleanCaption: \"Temiz\",\n clearCaption: \"Açık\",\n chooseFileCaption: \"Dosya seçin\",\n removeFileCaption: \"Bu dosyayı kaldır\",\n booleanCheckedLabel: \"Evet\",\n booleanUncheckedLabel: \"Hayır\",\n confirmRemoveFile: \"Bu dosyayı kaldırmak istediğinizden emin misiniz: {0}?\",\n confirmRemoveAllFiles: \"Tüm dosyaları kaldırmak istediğinizden emin misiniz?\",\n questionTitlePatternText: \"Soru başlığı\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"tr\"] = turkishSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"tr\"] = \"türkçe\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/ukrainian.ts\":\n/*!***************************************!*\\\n !*** ./src/localization/ukrainian.ts ***!\n \\***************************************/\n/*! exports provided: ukrainianSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ukrainianSurveyStrings\", function() { return ukrainianSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar ukrainianSurveyStrings = {\n pagePrevText: \"Назад\",\n pageNextText: \"Далі\",\n completeText: \"Завершити\",\n previewText: \"Попередній перегляд\",\n editText: \"Редагувати\",\n startSurveyText: \"Почати\",\n otherItemText: \"Інше (будь ласка, опишіть)\",\n noneItemText: \"Жоден\",\n selectAllItemText: \"Вибрати все\",\n progressText: \"Сторінка {0} з {1}\",\n panelDynamicProgressText: \"Запис {0} із {1}\",\n questionsProgressText: \"Відповіли на {0}/{1} питань\",\n emptySurvey: \"Немає жодного питання.\",\n completingSurvey: \"Дякуємо Вам за заповнення анкети!\",\n completingSurveyBefore: \"Ви вже проходили це опитування.\",\n loadingSurvey: \"Завантаження опитування...\",\n optionsCaption: \"Вибрати...\",\n value: \"значення\",\n requiredError: \"Будь ласка, дайте відповідь.\",\n requiredErrorInPanel: \"Будь ласка, дайте відповідь хоча б на одне питання.\",\n requiredInAllRowsError: \"Будь ласка, дайте відповідь на питання в кожному рядку.\",\n numericError: \"Відповідь повинна бути числом.\",\n textMinLength: \"Будь ласка введіть більше {0} символів.\",\n textMaxLength: \"Будь ласка введіть менше {0} символів.\",\n textMinMaxLength: \"Будь ласка введіть більше {0} и менше {1} символів.\",\n minRowCountError: \"Будь ласка, заповніть не менше {0} рядків.\",\n minSelectError: \"Будь ласка, виберіть хоча б {0} варіантів.\",\n maxSelectError: \"Будь ласка, виберіть не більше {0} варіантів.\",\n numericMinMax: \"'{0}' повинно бути не менше ніж {1}, і не більше ніж {2}\",\n numericMin: \"'{0}' повинно бути не менше ніж {1}\",\n numericMax: \"'{0}' повинно бути не більше ніж {1}\",\n invalidEmail: \"Будь ласка, введіть дійсну адресу електронної пошти.\",\n invalidExpression: \"Вираз {0} повинен повертати 'true'.\",\n urlRequestError: \"Запит повернув помилку '{0}'. {1}\",\n urlGetChoicesError: \"Відповідь на запит повернулась порожньою або властивіть 'path' вказано невірно\",\n exceedMaxSize: \"Розмір файлу не повинен перевищувати {0}.\",\n otherRequiredError: \"Будь ласка, введіть дані в поле 'Інше'\",\n uploadingFile: \"Ваш файл завантажується. Зачекайте декілька секунд і спробуйте знову.\",\n loadingFile: \"Завантаження...\",\n chooseFile: \"Виберіть файл(и)...\",\n noFileChosen: \"Файл не вибрано\",\n confirmDelete: \"Ви хочете видалити запис?\",\n keyDuplicationError: \"Це значення повинно бути унікальним.\",\n addColumn: \"Додати колонку\",\n addRow: \"Додати рядок\",\n removeRow: \"Видалити\",\n addPanel: \"Додати нову\",\n removePanel: \"Видалити\",\n choices_Item: \"Варіант\",\n matrix_column: \"Колонка\",\n matrix_row: \"Рядок\",\n savingData: \"Результати зберігаються на сервер...\",\n savingDataError: \"Відбулася помилка, результат не був збережений.\",\n savingDataSuccess: \"Резвультат успішно збережений!\",\n saveAgainButton: \"Спробувати знову\",\n timerMin: \"хв\",\n timerSec: \"сек\",\n timerSpentAll: \"Ви витратили {0} на цій сторінці і {1} загалом.\",\n timerSpentPage: \"Ви витратили {0} на цій сторінці.\",\n timerSpentSurvey: \"Ви витратили {0} протягом тесту.\",\n timerLimitAll: \"Ви витратили {0} з {1} на цій сторінці і {2} з {3} для всього тесту.\",\n timerLimitPage: \"Ви витратили {0} з {1} на цій сторінці.\",\n timerLimitSurvey: \"Ви витратили {0} з {1} для всього тесту.\",\n cleanCaption: \"Очистити\",\n clearCaption: \"Очистити\",\n chooseFileCaption: \"Виберіть файл\",\n removeFileCaption: \"Видалити файл\",\n booleanCheckedLabel: \"Так\",\n booleanUncheckedLabel: \"Ні\",\n confirmRemoveFile: \"Ви впевнені, що хочете видалити цей файл: {0}?\",\n confirmRemoveAllFiles: \"Ви впевнені, що хочете видалити всі файли?\",\n questionTitlePatternText: \"Назва запитання\",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"ua\"] = ukrainianSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"ua\"] = \"українська\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/vietnamese.ts\":\n/*!****************************************!*\\\n !*** ./src/localization/vietnamese.ts ***!\n \\****************************************/\n/*! exports provided: vietnameseSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"vietnameseSurveyStrings\", function() { return vietnameseSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n//Uncomment this line on creating a translation file\n\nvar vietnameseSurveyStrings = {\n pagePrevText: \"Previous\",\n pageNextText: \"Next\",\n completeText: \"Complete\",\n previewText: \"Preview\",\n editText: \"Edit\",\n startSurveyText: \"Start\",\n otherItemText: \"Other (describe)\",\n noneItemText: \"None\",\n selectAllItemText: \"Select All\",\n progressText: \"Page {0} of {1}\",\n panelDynamicProgressText: \"Record {0} of {1}\",\n questionsProgressText: \"Answered {0}/{1} questions\",\n emptySurvey: \"There is no visible page or question in the survey.\",\n completingSurvey: \"Thank you for completing the survey!\",\n completingSurveyBefore: \"Our records show that you have already completed this survey.\",\n loadingSurvey: \"Loading Survey...\",\n optionsCaption: \"Chọn...\",\n value: \"value\",\n requiredError: \"Please answer the question.\",\n requiredErrorInPanel: \"Please answer at least one question.\",\n requiredInAllRowsError: \"Please answer questions in all rows.\",\n numericError: \"The value should be numeric.\",\n textMinLength: \"Please enter at least {0} characters.\",\n textMaxLength: \"Please enter less than {0} characters.\",\n textMinMaxLength: \"Please enter more than {0} and less than {1} characters.\",\n minRowCountError: \"Please fill in at least {0} rows.\",\n minSelectError: \"Please select at least {0} variants.\",\n maxSelectError: \"Please select no more than {0} variants.\",\n numericMinMax: \"The '{0}' should be equal or more than {1} and equal or less than {2}\",\n numericMin: \"The '{0}' should be equal or more than {1}\",\n numericMax: \"The '{0}' should be equal or less than {1}\",\n invalidEmail: \"Please enter a valid e-mail address.\",\n invalidExpression: \"The expression: {0} should return 'true'.\",\n urlRequestError: \"The request returned error '{0}'. {1}\",\n urlGetChoicesError: \"The request returned empty data or the 'path' property is incorrect\",\n exceedMaxSize: \"The file size should not exceed {0}.\",\n otherRequiredError: \"Please enter the other value.\",\n uploadingFile: \"Your file is uploading. Please wait several seconds and try again.\",\n loadingFile: \"Loading...\",\n chooseFile: \"Choose file(s)...\",\n noFileChosen: \"No file chosen\",\n confirmDelete: \"Do you want to delete the record?\",\n keyDuplicationError: \"This value should be unique.\",\n addColumn: \"Add column\",\n addRow: \"Add row\",\n removeRow: \"Remove\",\n addPanel: \"Add new\",\n removePanel: \"Remove\",\n choices_Item: \"item\",\n matrix_column: \"Column\",\n matrix_row: \"Row\",\n savingData: \"The results are saving on the server...\",\n savingDataError: \"An error occurred and we could not save the results.\",\n savingDataSuccess: \"The results were saved successfully!\",\n saveAgainButton: \"Try again\",\n timerMin: \"min\",\n timerSec: \"sec\",\n timerSpentAll: \"You have spent {0} on this page and {1} in total.\",\n timerSpentPage: \"You have spent {0} on this page.\",\n timerSpentSurvey: \"You have spent {0} in total.\",\n timerLimitAll: \"You have spent {0} of {1} on this page and {2} of {3} in total.\",\n timerLimitPage: \"You have spent {0} of {1} on this page.\",\n timerLimitSurvey: \"You have spent {0} of {1} in total.\",\n cleanCaption: \"Clean\",\n clearCaption: \"Clear\",\n chooseFileCaption: \"Choose file\",\n removeFileCaption: \"Remove this file\",\n booleanCheckedLabel: \"Yes\",\n booleanUncheckedLabel: \"No\",\n confirmRemoveFile: \"Are you sure that you want to remove this file: {0}?\",\n confirmRemoveAllFiles: \"Are you sure that you want to remove all files?\",\n questionTitlePatternText: \"Question Title\",\n};\n//Uncomment these two lines on creating a translation file. You should replace \"en\" and enStrings with your locale (\"fr\", \"de\" and so on) and your variable.\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"vi\"] = vietnameseSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"vi\"] = \"vietnamese\";\n\n\n/***/ }),\n\n/***/ \"./src/localization/welsh.ts\":\n/*!***********************************!*\\\n !*** ./src/localization/welsh.ts ***!\n \\***********************************/\n/*! exports provided: welshSurveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"welshSurveyStrings\", function() { return welshSurveyStrings; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../surveyStrings */ \"./src/surveyStrings.ts\");\n\nvar welshSurveyStrings = {\n pagePrevText: \"Blaenorol\",\n pageNextText: \"Nesaf\",\n completeText: \"Cwblhau\",\n previewText: \"Rhagolwg\",\n editText: \"Golygu\",\n startSurveyText: \"Dechrau\",\n otherItemText: \"Arall (disgrifiwch)\",\n noneItemText: \"Dim\",\n selectAllItemText: \"Dewis y Cyfan \",\n progressText: \"Tudalen {0} o {1}\",\n panelDynamicProgressText: \"Cofnod {0} o {1}\",\n questionsProgressText: \"Wedi ateb {0}/{1} cwestiwn\",\n emptySurvey: \"Does dim modd gweld tudalen na chwestiwn yn yr arolwg.\",\n completingSurvey: \"Diolch am lenwi’r holiadur!\",\n completingSurveyBefore: \"Rydych chi wedi llenwi’r arolwg hwn yn barod yn ôl ein cofnodion.\",\n loadingSurvey: \"Wrthi’n Llwytho’r Arolwg...\",\n optionsCaption: \"Dewiswch...\",\n value: \"gwerth\",\n requiredError: \"Atebwch y cwestiwn.\",\n requiredErrorInPanel: \"Atebwch o leiaf un cwestiwn.\",\n requiredInAllRowsError: \"Atebwch y cwestiynau ym mhob rhes.\",\n numericError: \"Dylai’r gwerth fod yn rhif.\",\n textMinLength: \"Rhowch o leiaf {0} nod.\",\n textMaxLength: \"Rhowch lai na {0} nod.\",\n textMinMaxLength: \"Rhowch o leiaf {0} nod ond dim mwy na {1}.\",\n minRowCountError: \"Llenwch o leiaf {0} rhes.\",\n minSelectError: \"Dewiswch o leiaf {0} amrywiolyn.\",\n maxSelectError: \"Peidiwch â dewis mwy na {0} amrywiolyn.\",\n numericMinMax: \"Dylai’r '{0}' fod yr un fath â {1} neu’n fwy, a’r fath â {2} neu’n llai\",\n numericMin: \"Dylai’r '{0}' fod yr un fath â {1} neu’n fwy\",\n numericMax: \"Dylai’r '{0}' fod yr un fath â {1} neu’n llai\",\n invalidEmail: \"Rhowch gyfeiriad e-bost dilys.\",\n invalidExpression: \"Dylai’r mynegiad {0} arwain at 'true'.\",\n urlRequestError: \"Roedd y cais wedi arwain at y gwall '{0}'. {1}\",\n urlGetChoicesError: \"Roedd y cais wedi arwain at ddata gwag neu mae priodwedd y ‘path’ yn anghywir \",\n exceedMaxSize: \"Ddylai’r ffeil ddim bod yn fwy na {0}.\",\n otherRequiredError: \"Rhowch y gwerth arall.\",\n uploadingFile: \"Mae eich ffeil wrthi’n llwytho i fyny. Arhoswch ychydig o eiliadau a rhoi cynnig arall arni.\",\n loadingFile: \"Wrthi’n llwytho...\",\n chooseFile: \"Dewiswch ffeil(iau)...\",\n noFileChosen: \"Heb ddewis ffeil \",\n confirmDelete: \"Ydych chi am ddileu’r cofnod?\",\n keyDuplicationError: \"Dylai’r gwerth hwn fod yn unigryw.\",\n addColumn: \"Ychwanegu colofn \",\n addRow: \"Ychwanegu rhes\",\n removeRow: \"Tynnu\",\n addPanel: \"Ychwanegu o’r newydd\",\n removePanel: \"Tynnu\",\n choices_Item: \"eitem\",\n matrix_column: \"Colofn\",\n matrix_row: \"Rhes\",\n savingData: \"Mae’r canlyniadau’n cael eu cadw ar y gweinydd...\",\n savingDataError: \"Roedd gwall a doedd dim modd cadw’r canlyniadau.\",\n savingDataSuccess: \"Wedi llwyddo i gadw’r canlyniadau!\",\n saveAgainButton: \"Rhowch gynnig arall arni\",\n timerMin: \"mun\",\n timerSec: \"eil\",\n timerSpentAll: \"Rydych chi wedi treulio {0} ar y dudalen hon a {1} gyda’i gilydd.\",\n timerSpentPage: \"Rydych chi wedi treulio {0} ar y dudalen hon.\",\n timerSpentSurvey: \"Rydych chi wedi treulio {0} gyda’i gilydd.\",\n timerLimitAll: \"Rydych chi wedi treulio {0} o {1} ar y dudalen hon a {2} o {3} gyda’i gilydd.\",\n timerLimitPage: \"Rydych chi wedi treulio {0} o {1} ar y dudalen hon.\",\n timerLimitSurvey: \"Rydych chi wedi treulio {0} o {1} gyda’i gilydd.\",\n cleanCaption: \"Glanhau\",\n clearCaption: \"Clirio\",\n chooseFileCaption: \"Dewiswch ffeil \",\n removeFileCaption: \"Tynnu’r ffeil hon \",\n booleanCheckedLabel: \"Iawn\",\n booleanUncheckedLabel: \"Na\",\n confirmRemoveFile: \"Ydych chi’n siŵr eich bod am dynnu’r ffeil hon: {0}?\",\n confirmRemoveAllFiles: \"Ydych chi’n siŵr eich bod am dynnu pob ffeil?\",\n questionTitlePatternText: \"Teitl y Cwestiwn \",\n};\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].locales[\"cy\"] = welshSurveyStrings;\n_surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].localeNames[\"cy\"] = \"cymraeg\";\n\n\n/***/ }),\n\n/***/ \"./src/main.scss\":\n/*!***********************!*\\\n !*** ./src/main.scss ***!\n \\***********************/\n/*! no static exports found */\n/***/ (function(module, exports, __webpack_require__) {\n\n// extracted by mini-css-extract-plugin\n\n/***/ }),\n\n/***/ \"./src/martixBase.ts\":\n/*!***************************!*\\\n !*** ./src/martixBase.ts ***!\n \\***************************/\n/*! exports provided: QuestionMatrixBaseModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixBaseModel\", function() { return QuestionMatrixBaseModel; });\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./conditions */ \"./src/conditions.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n/**\n * A Model for a matrix base question.\n */\nvar QuestionMatrixBaseModel = /** @class */ (function (_super) {\n __extends(QuestionMatrixBaseModel, _super);\n function QuestionMatrixBaseModel(name) {\n var _this = _super.call(this, name) || this;\n _this.generatedVisibleRows = null;\n _this.generatedTotalRow = null;\n _this.filteredRows = null;\n _this.filteredColumns = null;\n _this.columns = _this.createColumnValues();\n _this.rows = _this.createItemValues(\"rows\");\n return _this;\n }\n QuestionMatrixBaseModel.prototype.createColumnValues = function () {\n return this.createItemValues(\"columns\");\n };\n QuestionMatrixBaseModel.prototype.getType = function () {\n return \"matrixbase\";\n };\n Object.defineProperty(QuestionMatrixBaseModel.prototype, \"isCompositeQuestion\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixBaseModel.prototype, \"showHeader\", {\n /**\n * Set this property to false, to hide table header. The default value is true.\n */\n get: function () {\n return this.getPropertyValue(\"showHeader\");\n },\n set: function (val) {\n this.setPropertyValue(\"showHeader\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixBaseModel.prototype, \"columns\", {\n /**\n * The list of columns. A column has a value and an optional text\n */\n get: function () {\n return this.getPropertyValue(\"columns\");\n },\n set: function (newValue) {\n this.setPropertyValue(\"columns\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixBaseModel.prototype, \"visibleColumns\", {\n get: function () {\n return !!this.filteredColumns ? this.filteredColumns : this.columns;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixBaseModel.prototype, \"rows\", {\n /**\n * The list of rows. A row has a value and an optional text\n */\n get: function () {\n return this.getPropertyValue(\"rows\");\n },\n set: function (newValue) {\n var newRows = this.processRowsOnSet(newValue);\n this.setPropertyValue(\"rows\", newRows);\n this.filterItems();\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixBaseModel.prototype.processRowsOnSet = function (newRows) {\n return newRows;\n };\n QuestionMatrixBaseModel.prototype.getVisibleRows = function () {\n return [];\n };\n Object.defineProperty(QuestionMatrixBaseModel.prototype, \"visibleRows\", {\n /**\n * Returns the list of visible rows as model objects.\n * @see rowsVisibleIf\n */\n get: function () {\n return this.getVisibleRows();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixBaseModel.prototype, \"rowsVisibleIf\", {\n /**\n * An expression that returns true or false. It runs against each row item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression.\n * @see visibleIf\n */\n get: function () {\n return this.getPropertyValue(\"rowsVisibleIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"rowsVisibleIf\", val);\n this.filterItems();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixBaseModel.prototype, \"columnsVisibleIf\", {\n /**\n * An expression that returns true or false. It runs against each column item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression.\n * @see rowsVisibleIf\n */\n get: function () {\n return this.getPropertyValue(\"columnsVisibleIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"columnsVisibleIf\", val);\n this.filterItems();\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixBaseModel.prototype.runCondition = function (values, properties) {\n _super.prototype.runCondition.call(this, values, properties);\n this.runItemsCondition(values, properties);\n };\n QuestionMatrixBaseModel.prototype.filterItems = function () {\n if (this.areInvisibleElementsShowing) {\n this.onRowsChanged();\n return false;\n }\n if (this.isLoadingFromJson || !this.data)\n return false;\n return this.runItemsCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());\n };\n QuestionMatrixBaseModel.prototype.onColumnsChanged = function () { };\n QuestionMatrixBaseModel.prototype.onRowsChanged = function () {\n this.fireCallback(this.visibleRowsChangedCallback);\n };\n QuestionMatrixBaseModel.prototype.shouldRunColumnExpression = function () {\n return !this.survey || !this.survey.areInvisibleElementsShowing;\n };\n QuestionMatrixBaseModel.prototype.hasRowsAsItems = function () {\n return true;\n };\n QuestionMatrixBaseModel.prototype.runItemsCondition = function (values, properties) {\n var oldVisibleRows = null;\n if (!!this.filteredRows && !_helpers__WEBPACK_IMPORTED_MODULE_4__[\"Helpers\"].isValueEmpty(this.defaultValue)) {\n oldVisibleRows = [];\n for (var i = 0; i < this.filteredRows.length; i++) {\n oldVisibleRows.push(this.filteredRows[i]);\n }\n }\n var hasChanges = this.hasRowsAsItems() && this.runConditionsForRows(values, properties);\n var hasColumnsChanged = this.runConditionsForColumns(values, properties);\n hasChanges = hasColumnsChanged || hasChanges;\n if (hasChanges) {\n if (!!this.survey &&\n this.survey.isClearValueOnHidden &&\n (!!this.filteredColumns || !!this.filteredRows)) {\n this.clearIncorrectValues();\n }\n if (!!oldVisibleRows) {\n this.restoreNewVisibleRowsValues(oldVisibleRows);\n }\n this.clearGeneratedRows();\n if (hasColumnsChanged) {\n this.onColumnsChanged();\n }\n this.onRowsChanged();\n }\n return hasChanges;\n };\n QuestionMatrixBaseModel.prototype.clearGeneratedRows = function () {\n this.generatedVisibleRows = null;\n };\n QuestionMatrixBaseModel.prototype.runConditionsForRows = function (values, properties) {\n var showInvisibile = !!this.survey && this.survey.areInvisibleElementsShowing;\n var runner = !showInvisibile && !!this.rowsVisibleIf\n ? new _conditions__WEBPACK_IMPORTED_MODULE_3__[\"ConditionRunner\"](this.rowsVisibleIf)\n : null;\n this.filteredRows = [];\n var hasChanged = _itemvalue__WEBPACK_IMPORTED_MODULE_0__[\"ItemValue\"].runConditionsForItems(this.rows, this.filteredRows, runner, values, properties, !showInvisibile);\n if (this.filteredRows.length === this.rows.length) {\n this.filteredRows = null;\n }\n return hasChanged;\n };\n QuestionMatrixBaseModel.prototype.runConditionsForColumns = function (values, properties) {\n var useColumnsExpression = !!this.survey && !this.survey.areInvisibleElementsShowing;\n var runner = useColumnsExpression && !!this.columnsVisibleIf\n ? new _conditions__WEBPACK_IMPORTED_MODULE_3__[\"ConditionRunner\"](this.columnsVisibleIf)\n : null;\n this.filteredColumns = [];\n var hasChanged = _itemvalue__WEBPACK_IMPORTED_MODULE_0__[\"ItemValue\"].runConditionsForItems(this.columns, this.filteredColumns, runner, values, properties, this.shouldRunColumnExpression());\n if (this.filteredColumns.length === this.columns.length) {\n this.filteredColumns = null;\n }\n return hasChanged;\n };\n QuestionMatrixBaseModel.prototype.clearIncorrectValues = function () {\n var val = this.value;\n if (!val)\n return;\n var newVal = null;\n var isChanged = false;\n var rows = !!this.filteredRows ? this.filteredRows : this.rows;\n var columns = !!this.filteredColumns ? this.filteredColumns : this.columns;\n for (var key in val) {\n if (_itemvalue__WEBPACK_IMPORTED_MODULE_0__[\"ItemValue\"].getItemByValue(rows, key) &&\n _itemvalue__WEBPACK_IMPORTED_MODULE_0__[\"ItemValue\"].getItemByValue(columns, val[key])) {\n if (newVal == null)\n newVal = {};\n newVal[key] = val[key];\n }\n else {\n isChanged = true;\n }\n }\n if (isChanged) {\n this.value = newVal;\n }\n _super.prototype.clearIncorrectValues.call(this);\n };\n QuestionMatrixBaseModel.prototype.clearInvisibleValuesInRows = function () {\n if (this.isEmpty())\n return;\n var newData = this.getUnbindValue(this.value);\n var rows = this.rows;\n for (var i = 0; i < rows.length; i++) {\n var key = rows[i].value;\n if (!!newData[key] && !rows[i].isVisible) {\n delete newData[key];\n }\n }\n if (_helpers__WEBPACK_IMPORTED_MODULE_4__[\"Helpers\"].isTwoValueEquals(newData, this.value))\n return;\n this.value = newData;\n };\n QuestionMatrixBaseModel.prototype.restoreNewVisibleRowsValues = function (oldVisibleRows) {\n var rows = !!this.filteredRows ? this.filteredRows : this.rows;\n var val = this.defaultValue;\n var newValue = this.getUnbindValue(this.value);\n var isChanged = false;\n for (var key in val) {\n if (_itemvalue__WEBPACK_IMPORTED_MODULE_0__[\"ItemValue\"].getItemByValue(rows, key) &&\n !_itemvalue__WEBPACK_IMPORTED_MODULE_0__[\"ItemValue\"].getItemByValue(oldVisibleRows, key)) {\n if (newValue == null)\n newValue = {};\n newValue[key] = val[key];\n isChanged = true;\n }\n }\n if (isChanged) {\n this.value = newValue;\n }\n };\n return QuestionMatrixBaseModel;\n}(_question__WEBPACK_IMPORTED_MODULE_1__[\"Question\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"matrixbase\", [\n \"columnsVisibleIf:condition\",\n \"rowsVisibleIf:condition\",\n { name: \"showHeader:boolean\", default: true },\n], undefined, \"question\");\n\n\n/***/ }),\n\n/***/ \"./src/page.ts\":\n/*!*********************!*\\\n !*** ./src/page.ts ***!\n \\*********************/\n/*! exports provided: PageModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"PageModel\", function() { return PageModel; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _panel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./panel */ \"./src/panel.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n/**\n * The page object. It has elements collection, that contains questions and panels.\n */\nvar PageModel = /** @class */ (function (_super) {\n __extends(PageModel, _super);\n function PageModel(name) {\n if (name === void 0) { name = \"\"; }\n var _this = _super.call(this, name) || this;\n _this.hasShownValue = false;\n _this.isRandomizing = false;\n /**\n * Time in seconds end-user spent on this page\n */\n _this.timeSpent = 0;\n var self = _this;\n _this.locTitle.onGetTextCallback = function (text) {\n if (self.num > 0)\n return self.num + \". \" + text;\n return text;\n };\n _this.createLocalizableString(\"navigationTitle\", _this, true);\n _this.createLocalizableString(\"navigationDescription\", _this, true);\n return _this;\n }\n PageModel.prototype.getType = function () {\n return \"page\";\n };\n PageModel.prototype.toString = function () {\n return this.name;\n };\n Object.defineProperty(PageModel.prototype, \"isPage\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PageModel.prototype, \"navigationTitle\", {\n /**\n * Use this property to show title in navigation buttons. If the value is empty then page name is used.\n * @see survey.progressBarType\n */\n get: function () {\n return this.getLocalizableStringText(\"navigationTitle\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"navigationTitle\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PageModel.prototype, \"locNavigationTitle\", {\n get: function () {\n return this.getLocalizableString(\"navigationTitle\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PageModel.prototype, \"navigationDescription\", {\n get: function () {\n return this.getLocalizableStringText(\"navigationDescription\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"navigationDescription\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PageModel.prototype, \"locNavigationDescription\", {\n get: function () {\n return this.getLocalizableString(\"navigationDescription\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PageModel.prototype, \"passed\", {\n get: function () {\n return this.getPropertyValue(\"passed\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"passed\", val);\n },\n enumerable: false,\n configurable: true\n });\n PageModel.prototype.delete = function () {\n if (!!this.survey) {\n this.removeSelfFromList(this.survey.pages);\n }\n };\n PageModel.prototype.onFirstRendering = function () {\n if (this.wasShown)\n return;\n _super.prototype.onFirstRendering.call(this);\n };\n Object.defineProperty(PageModel.prototype, \"visibleIndex\", {\n /**\n * The visible index of the page. It has values from 0 to visible page count - 1.\n * @see SurveyModel.visiblePages\n * @see SurveyModel.pages\n */\n get: function () {\n return this.getPropertyValue(\"visibleIndex\", -1);\n },\n set: function (val) {\n this.setPropertyValue(\"visibleIndex\", val);\n },\n enumerable: false,\n configurable: true\n });\n PageModel.prototype.canRenderFirstRows = function () {\n return !this.isDesignMode || this.visibleIndex == 0;\n };\n Object.defineProperty(PageModel.prototype, \"isStarted\", {\n /**\n * Returns true, if the page is started page in the survey. It can be shown on the start only and the end-user could not comeback to it after it passed it.\n */\n get: function () {\n return this.survey && this.survey.isPageStarted(this);\n },\n enumerable: false,\n configurable: true\n });\n PageModel.prototype.calcCssClasses = function () {\n var css = this.css;\n var classes = { page: {}, pageTitle: \"\", pageDescription: \"\", row: \"\" };\n this.copyCssClasses(classes.page, css.page);\n if (!!css.pageTitle) {\n classes.pageTitle = css.pageTitle;\n }\n if (!!css.pageDescription) {\n classes.pageDescription = css.pageDescription;\n }\n if (!!css.row) {\n classes.row = css.row;\n }\n if (this.survey) {\n this.survey.updatePageCssClasses(this, classes);\n }\n return classes;\n };\n PageModel.prototype.getIsPageVisible = function (exceptionQuestion) {\n if (this.isStarted)\n return false;\n return _super.prototype.getIsPageVisible.call(this, exceptionQuestion);\n };\n Object.defineProperty(PageModel.prototype, \"num\", {\n get: function () {\n return this.getPropertyValue(\"num\", -1);\n },\n set: function (val) {\n if (this.num == val)\n return;\n this.setPropertyValue(\"num\", val);\n this.onNumChanged(val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PageModel.prototype, \"navigationButtonsVisibility\", {\n /**\n * Set this property to \"hide\" to make \"Prev\", \"Next\" and \"Complete\" buttons are invisible for this page. Set this property to \"show\" to make these buttons visible, even if survey showNavigationButtons property is false.\n * @see SurveyMode.showNavigationButtons\n */\n get: function () {\n return this.getPropertyValue(\"navigationButtonsVisibility\");\n },\n set: function (val) {\n this.setPropertyValue(\"navigationButtonsVisibility\", val.toLowerCase());\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PageModel.prototype, \"wasShown\", {\n /**\n * The property returns true, if the page has been shown to the end-user.\n */\n get: function () {\n return this.hasShownValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PageModel.prototype, \"hasShown\", {\n get: function () {\n return this.wasShown;\n },\n enumerable: false,\n configurable: true\n });\n PageModel.prototype.setWasShown = function (val) {\n if (val == this.hasShownValue)\n return;\n this.hasShownValue = val;\n if (this.isDesignMode)\n return;\n if (val == true && this.areQuestionsRandomized) {\n this.randomizeElements();\n }\n };\n PageModel.prototype.randomizeElements = function () {\n if (this.isRandomizing)\n return;\n this.isRandomizing = true;\n var oldElements = [];\n var elements = this.elements;\n for (var i = 0; i < elements.length; i++) {\n oldElements.push(elements[i]);\n }\n var newElements = _helpers__WEBPACK_IMPORTED_MODULE_1__[\"Helpers\"].randomizeArray(oldElements);\n this.elements.splice(0, this.elements.length);\n for (var i = 0; i < newElements.length; i++) {\n this.elements.push(newElements[i]);\n }\n this.isRandomizing = false;\n };\n Object.defineProperty(PageModel.prototype, \"areQuestionsRandomized\", {\n /**\n * The property returns true, if the elements are randomized on the page\n * @see hasShown\n * @see questionsOrder\n * @see SurveyModel.questionsOrder\n */\n get: function () {\n var order = this.questionsOrder == \"default\" && this.survey\n ? this.survey.questionsOrder\n : this.questionsOrder;\n return order == \"random\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PageModel.prototype, \"questionsOrder\", {\n /**\n * Use this property to randomize questions. Set it to 'random' to randomize questions, 'initial' to keep them in the same order or 'default' to use the Survey questionsOrder property\n * @see SurveyModel.questionsOrder\n * @see areQuestionsRandomized\n */\n get: function () {\n return this.getPropertyValue(\"questionsOrder\");\n },\n set: function (val) {\n this.setPropertyValue(\"questionsOrder\", val);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Call it to scroll to the page top.\n */\n PageModel.prototype.scrollToTop = function () {\n if (!!this.survey) {\n this.survey.scrollElementToTop(this, null, this, this.id);\n }\n };\n // public get timeSpent(): number {\n // return this.getPropertyValue(\"timeSpent\", 0);\n // }\n // public set timeSpent(val: number) {\n // this.setPropertyValue(\"timeSpent\", val);\n // }\n /**\n * Returns the list of all panels in the page\n */\n PageModel.prototype.getPanels = function (visibleOnly, includingDesignTime) {\n if (visibleOnly === void 0) { visibleOnly = false; }\n if (includingDesignTime === void 0) { includingDesignTime = false; }\n var result = new Array();\n this.addPanelsIntoList(result, visibleOnly, includingDesignTime);\n return result;\n };\n Object.defineProperty(PageModel.prototype, \"maxTimeToFinish\", {\n /**\n * The maximum time in seconds that end-user has to complete the page. If the value is 0 or less, the end-user has unlimited number of time to finish the page.\n * @see startTimer\n * @see SurveyModel.maxTimeToFinishPage\n */\n get: function () {\n return this.getPropertyValue(\"maxTimeToFinish\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"maxTimeToFinish\", val);\n },\n enumerable: false,\n configurable: true\n });\n PageModel.prototype.onNumChanged = function (value) { };\n PageModel.prototype.onVisibleChanged = function () {\n if (this.isRandomizing)\n return;\n _super.prototype.onVisibleChanged.call(this);\n if (this.survey != null) {\n this.survey.pageVisibilityChanged(this, this.isVisible);\n }\n };\n PageModel.prototype.dragDropStart = function (src, target, nestedPanelDepth) {\n if (nestedPanelDepth === void 0) { nestedPanelDepth = -1; }\n this.dragDropInfo = new _panel__WEBPACK_IMPORTED_MODULE_2__[\"DragDropInfo\"](src, target, nestedPanelDepth);\n };\n PageModel.prototype.dragDropMoveTo = function (destination, isBottom, isEdge) {\n if (isBottom === void 0) { isBottom = false; }\n if (isEdge === void 0) { isEdge = false; }\n if (!this.dragDropInfo)\n return false;\n this.dragDropInfo.destination = destination;\n this.dragDropInfo.isBottom = isBottom;\n this.dragDropInfo.isEdge = isEdge;\n this.correctDragDropInfo(this.dragDropInfo);\n if (!this.dragDropCanDropTagert())\n return false;\n if (!this.dragDropCanDropSource() || !this.dragDropAllowFromSurvey()) {\n if (!!this.dragDropInfo.source) {\n var row = this.dragDropFindRow(this.dragDropInfo.target);\n this.updateRowsRemoveElementFromRow(this.dragDropInfo.target, row);\n }\n return false;\n }\n this.dragDropAddTarget(this.dragDropInfo);\n return true;\n };\n PageModel.prototype.correctDragDropInfo = function (dragDropInfo) {\n if (!dragDropInfo.destination)\n return;\n var panel = dragDropInfo.destination.isPanel\n ? dragDropInfo.destination\n : null;\n if (!panel)\n return;\n if (!dragDropInfo.target.isLayoutTypeSupported(panel.getChildrenLayoutType())) {\n dragDropInfo.isEdge = true;\n }\n };\n PageModel.prototype.dragDropAllowFromSurvey = function () {\n var dest = this.dragDropInfo.destination;\n if (!dest || !this.survey)\n return true;\n var insertBefore = null;\n var insertAfter = null;\n var parent = dest.isPage || (!this.dragDropInfo.isEdge && dest.isPanel)\n ? dest\n : dest.parent;\n if (!dest.isPage) {\n var container = dest.parent;\n if (!!container) {\n var elements = container.elements;\n var index = elements.indexOf(dest);\n if (index > -1) {\n insertBefore = dest;\n insertAfter = dest;\n if (this.dragDropInfo.isBottom) {\n insertBefore =\n index < elements.length - 1 ? elements[index + 1] : null;\n }\n else {\n insertAfter = index > 0 ? elements[index - 1] : null;\n }\n }\n }\n }\n var options = {\n target: this.dragDropInfo.target,\n source: this.dragDropInfo.source,\n parent: parent,\n insertAfter: insertAfter,\n insertBefore: insertBefore,\n };\n return this.survey.dragAndDropAllow(options);\n };\n PageModel.prototype.dragDropFinish = function (isCancel) {\n if (isCancel === void 0) { isCancel = false; }\n if (!this.dragDropInfo)\n return;\n var target = this.dragDropInfo.target;\n var row = this.dragDropFindRow(target);\n var targetIndex = this.dragDropGetElementIndex(target, row);\n this.updateRowsRemoveElementFromRow(target, row);\n if (!isCancel && !!row) {\n var src = this.dragDropInfo.source;\n var isSamePanel = false;\n if (!!src && !!src.parent) {\n isSamePanel = row.panel == src.parent;\n if (isSamePanel) {\n row.panel.dragDropMoveElement(src, target, targetIndex);\n targetIndex = -1;\n }\n else {\n src.parent.removeElement(src);\n }\n }\n if (targetIndex > -1) {\n row.panel.addElement(target, targetIndex);\n }\n }\n this.dragDropInfo = null;\n return !isCancel ? target : null;\n };\n PageModel.prototype.dragDropGetElementIndex = function (target, row) {\n if (!row)\n return -1;\n var index = row.elements.indexOf(target);\n if (row.index == 0)\n return index;\n var prevRow = row.panel.rows[row.index - 1];\n var prevElement = prevRow.elements[prevRow.elements.length - 1];\n return index + row.panel.elements.indexOf(prevElement) + 1;\n };\n PageModel.prototype.dragDropCanDropTagert = function () {\n var destination = this.dragDropInfo.destination;\n if (!destination || destination.isPage)\n return true;\n return this.dragDropCanDropCore(this.dragDropInfo.target, destination);\n };\n PageModel.prototype.dragDropCanDropSource = function () {\n var source = this.dragDropInfo.source;\n if (!source)\n return true;\n var destination = this.dragDropInfo.destination;\n if (!this.dragDropCanDropCore(source, destination))\n return false;\n return this.dragDropCanDropNotNext(source, destination, this.dragDropInfo.isEdge, this.dragDropInfo.isBottom);\n };\n PageModel.prototype.dragDropCanDropCore = function (target, destination) {\n if (!destination)\n return true;\n if (this.dragDropIsSameElement(destination, target))\n return false;\n if (target.isPanel) {\n var pnl = target;\n if (pnl.containsElement(destination) ||\n !!pnl.getElementByName(destination.name))\n return false;\n }\n return true;\n };\n PageModel.prototype.dragDropCanDropNotNext = function (source, destination, isEdge, isBottom) {\n if (!destination || (destination.isPanel && !isEdge))\n return true;\n if (typeof source.parent === \"undefined\" || source.parent !== destination.parent)\n return true;\n var pnl = source.parent;\n var srcIndex = pnl.elements.indexOf(source);\n var destIndex = pnl.elements.indexOf(destination);\n if (destIndex < srcIndex && !isBottom)\n destIndex--;\n if (isBottom)\n destIndex++;\n return srcIndex < destIndex\n ? destIndex - srcIndex > 1\n : srcIndex - destIndex > 0;\n };\n PageModel.prototype.dragDropIsSameElement = function (el1, el2) {\n return el1 == el2 || el1.name == el2.name;\n };\n PageModel.prototype.ensureRowsVisibility = function () {\n _super.prototype.ensureRowsVisibility.call(this);\n this.getPanels().forEach(function (panel) { return panel.ensureRowsVisibility(); });\n };\n return PageModel;\n}(_panel__WEBPACK_IMPORTED_MODULE_2__[\"PanelModelBase\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"page\", [\n {\n name: \"navigationButtonsVisibility\",\n default: \"inherit\",\n choices: [\"inherit\", \"show\", \"hide\"],\n },\n {\n name: \"questionsOrder\",\n default: \"default\",\n choices: [\"default\", \"initial\", \"random\"],\n },\n { name: \"maxTimeToFinish:number\", default: 0, minValue: 0 },\n {\n name: \"navigationTitle\",\n visibleIf: function (obj) {\n return !!obj.survey && obj.survey.progressBarType === \"buttons\";\n },\n serializationProperty: \"locNavigationTitle\",\n },\n {\n name: \"navigationDescription\",\n visibleIf: function (obj) {\n return !!obj.survey && obj.survey.progressBarType === \"buttons\";\n },\n serializationProperty: \"locNavigationDescription\",\n },\n { name: \"title:text\", serializationProperty: \"locTitle\" },\n { name: \"description:text\", serializationProperty: \"locDescription\" },\n], function () {\n return new PageModel();\n}, \"panelbase\");\n\n\n/***/ }),\n\n/***/ \"./src/panel.ts\":\n/*!**********************!*\\\n !*** ./src/panel.ts ***!\n \\**********************/\n/*! exports provided: DragDropInfo, QuestionRowModel, PanelModelBase, PanelModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"DragDropInfo\", function() { return DragDropInfo; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionRowModel\", function() { return QuestionRowModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"PanelModelBase\", function() { return PanelModelBase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"PanelModel\", function() { return PanelModel; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./survey-element */ \"./src/survey-element.ts\");\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./conditions */ \"./src/conditions.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\n/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/utils */ \"./src/utils/utils.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\n\n\n\nvar DragDropInfo = /** @class */ (function () {\n function DragDropInfo(source, target, nestedPanelDepth) {\n if (nestedPanelDepth === void 0) { nestedPanelDepth = -1; }\n this.source = source;\n this.target = target;\n this.nestedPanelDepth = nestedPanelDepth;\n }\n return DragDropInfo;\n}());\n\nvar QuestionRowModel = /** @class */ (function (_super) {\n __extends(QuestionRowModel, _super);\n function QuestionRowModel(panel) {\n var _this = _super.call(this) || this;\n _this.panel = panel;\n _this._scrollableParent = undefined;\n _this._updateVisibility = undefined;\n _this.idValue = QuestionRowModel.getRowId();\n _this.visible = panel.areInvisibleElementsShowing;\n _this.createNewArray(\"elements\");\n _this.createNewArray(\"visibleElements\");\n return _this;\n }\n QuestionRowModel.getRowId = function () {\n return \"pr_\" + QuestionRowModel.rowCounter++;\n };\n QuestionRowModel.prototype.startLazyRendering = function (rowContainerDiv, findScrollableContainer) {\n var _this = this;\n if (findScrollableContainer === void 0) { findScrollableContainer = _utils_utils__WEBPACK_IMPORTED_MODULE_9__[\"findScrollableParent\"]; }\n this._scrollableParent = findScrollableContainer(rowContainerDiv);\n this.isNeedRender = !(this._scrollableParent.scrollHeight > this._scrollableParent.clientHeight);\n // if this._scrollableParent is html the scroll event isn't fired, so we should use window\n if (this._scrollableParent === document.documentElement) {\n this._scrollableParent = window;\n }\n if (!this.isNeedRender) {\n this._updateVisibility = function () {\n var isRowContainerDivVisible = Object(_utils_utils__WEBPACK_IMPORTED_MODULE_9__[\"isElementVisible\"])(rowContainerDiv, 50);\n if (!_this.isNeedRender && isRowContainerDivVisible) {\n _this.isNeedRender = true;\n _this.stopLazyRendering();\n }\n };\n setTimeout(function () {\n if (!!_this._scrollableParent &&\n !!_this._scrollableParent.addEventListener) {\n _this._scrollableParent.addEventListener(\"scroll\", _this._updateVisibility);\n }\n _this.ensureVisibility();\n }, 10);\n }\n };\n QuestionRowModel.prototype.ensureVisibility = function () {\n if (!!this._updateVisibility) {\n this._updateVisibility();\n }\n };\n QuestionRowModel.prototype.stopLazyRendering = function () {\n if (!!this._scrollableParent &&\n !!this._updateVisibility &&\n !!this._scrollableParent.removeEventListener) {\n this._scrollableParent.removeEventListener(\"scroll\", this._updateVisibility);\n }\n this._scrollableParent = undefined;\n this._updateVisibility = undefined;\n };\n QuestionRowModel.prototype.setIsLazyRendering = function (val) {\n this.isLazyRenderingValue = val;\n this.isNeedRender = !val;\n };\n QuestionRowModel.prototype.isLazyRendering = function () {\n return this.isLazyRenderingValue === true;\n };\n Object.defineProperty(QuestionRowModel.prototype, \"id\", {\n get: function () {\n return this.idValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRowModel.prototype, \"elements\", {\n get: function () {\n return this.getPropertyValue(\"elements\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRowModel.prototype, \"visibleElements\", {\n get: function () {\n return this.getPropertyValue(\"visibleElements\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRowModel.prototype, \"visible\", {\n get: function () {\n return this.getPropertyValue(\"visible\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"visible\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRowModel.prototype, \"isNeedRender\", {\n get: function () {\n return this.getPropertyValue(\"isneedrender\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"isneedrender\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionRowModel.prototype.updateVisible = function () {\n this.visible = this.calcVisible();\n this.setWidth();\n };\n QuestionRowModel.prototype.addElement = function (q) {\n this.elements.push(q);\n this.updateVisible();\n };\n Object.defineProperty(QuestionRowModel.prototype, \"index\", {\n get: function () {\n return this.panel.rows.indexOf(this);\n },\n enumerable: false,\n configurable: true\n });\n QuestionRowModel.prototype.setWidth = function () {\n var visCount = this.visibleElements.length;\n if (visCount == 0)\n return;\n var counter = 0;\n var preSetWidthElements = [];\n for (var i = 0; i < this.elements.length; i++) {\n var el = this.elements[i];\n this.setElementMaxMinWidth(el);\n if (el.isVisible) {\n var width = this.getElementWidth(el);\n if (!!width) {\n el.renderWidth = this.getRenderedWidthFromWidth(width);\n preSetWidthElements.push(el);\n }\n el.rightIndent = counter < visCount - 1 ? 1 : 0;\n counter++;\n }\n else {\n el.renderWidth = \"\";\n }\n }\n for (var i = 0; i < this.elements.length; i++) {\n var el = this.elements[i];\n if (!el.isVisible || preSetWidthElements.indexOf(el) > -1)\n continue;\n if (preSetWidthElements.length == 0) {\n el.renderWidth = (100 / visCount).toFixed(6) + \"%\";\n }\n else {\n el.renderWidth = this.getRenderedCalcWidth(el, preSetWidthElements, visCount);\n }\n }\n };\n QuestionRowModel.prototype.setElementMaxMinWidth = function (el) {\n if (el.width &&\n typeof el.width === \"string\" &&\n el.width.indexOf(\"%\") === -1) {\n el.minWidth = el.width;\n el.maxWidth = el.width;\n }\n };\n QuestionRowModel.prototype.getRenderedCalcWidth = function (el, preSetWidthElements, visCount) {\n var expression = \"100%\";\n for (var i = 0; i < preSetWidthElements.length; i++) {\n expression += \" - \" + preSetWidthElements[i].renderWidth;\n }\n var calcWidthEl = visCount - preSetWidthElements.length;\n if (calcWidthEl > 1) {\n expression = \"(\" + expression + \")/\" + calcWidthEl.toString();\n }\n return \"calc(\" + expression + \")\";\n };\n QuestionRowModel.prototype.getElementWidth = function (el) {\n var width = el.width;\n if (!width || typeof width !== \"string\")\n return \"\";\n return width.trim();\n };\n QuestionRowModel.prototype.getRenderedWidthFromWidth = function (width) {\n return _helpers__WEBPACK_IMPORTED_MODULE_1__[\"Helpers\"].isNumber(width) ? width + \"px\" : width;\n };\n QuestionRowModel.prototype.calcVisible = function () {\n var visElements = [];\n for (var i = 0; i < this.elements.length; i++) {\n if (this.elements[i].isVisible) {\n visElements.push(this.elements[i]);\n }\n }\n if (this.needToUpdateVisibleElements(visElements)) {\n this.setPropertyValue(\"visibleElements\", visElements);\n }\n return visElements.length > 0;\n };\n QuestionRowModel.prototype.needToUpdateVisibleElements = function (visElements) {\n if (visElements.length !== this.visibleElements.length)\n return true;\n for (var i = 0; i < visElements.length; i++) {\n if (visElements[i] !== this.visibleElements[i])\n return true;\n }\n return false;\n };\n QuestionRowModel.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n this.stopLazyRendering();\n };\n QuestionRowModel.rowCounter = 100;\n return QuestionRowModel;\n}(_base__WEBPACK_IMPORTED_MODULE_2__[\"Base\"]));\n\n/**\n * A base class for a Panel and Page objects.\n */\nvar PanelModelBase = /** @class */ (function (_super) {\n __extends(PanelModelBase, _super);\n function PanelModelBase(name) {\n if (name === void 0) { name = \"\"; }\n var _this = _super.call(this, name) || this;\n _this.isQuestionsReady = false;\n _this.questionsValue = new Array();\n _this.createNewArray(\"rows\");\n _this.elementsValue = _this.createNewArray(\"elements\", _this.onAddElement.bind(_this), _this.onRemoveElement.bind(_this));\n _this.id = PanelModelBase.getPanelId();\n _this.createLocalizableString(\"title\", _this, true);\n _this.createLocalizableString(\"description\", _this, true);\n _this.createLocalizableString(\"requiredErrorText\", _this);\n _this.registerFunctionOnPropertyValueChanged(\"questionTitleLocation\", function () {\n _this.onVisibleChanged.bind(_this);\n _this.updateElementCss(true);\n });\n _this.registerFunctionOnPropertiesValueChanged([\"questionStartIndex\", \"showQuestionNumbers\"], function () {\n _this.updateVisibleIndexes();\n });\n return _this;\n }\n PanelModelBase.getPanelId = function () {\n return \"sp_\" + PanelModelBase.panelCounter++;\n };\n PanelModelBase.prototype.getType = function () {\n return \"panelbase\";\n };\n PanelModelBase.prototype.setSurveyImpl = function (value) {\n _super.prototype.setSurveyImpl.call(this, value);\n if (this.isDesignMode)\n this.onVisibleChanged();\n for (var i = 0; i < this.elements.length; i++) {\n this.elements[i].setSurveyImpl(value);\n }\n };\n PanelModelBase.prototype.endLoadingFromJson = function () {\n _super.prototype.endLoadingFromJson.call(this);\n this.markQuestionListDirty();\n this.onRowsChanged();\n };\n Object.defineProperty(PanelModelBase.prototype, \"title\", {\n /**\n * PanelModel or PageModel title property.\n * @description\n */\n get: function () {\n return this.getLocalizableStringText(\"title\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"title\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"locTitle\", {\n get: function () {\n return this.getLocalizableString(\"title\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"_showTitle\", {\n get: function () {\n return ((this.survey.showPageTitles && this.title.length > 0) ||\n (this.isDesignMode && _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].allowShowEmptyTitleInDesignMode));\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"_showDescription\", {\n get: function () {\n return ((this.survey.showPageTitles && this.description.length > 0) ||\n (this.isDesignMode &&\n _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].allowShowEmptyTitleInDesignMode &&\n _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].allowShowEmptyDescriptionInDesignMode));\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"description\", {\n /**\n * PanelModel or PageModel description property. It renders under title by using smaller font. Unlike the title, description can be empty.\n * @see title\n */\n get: function () {\n return this.getLocalizableStringText(\"description\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"description\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"locDescription\", {\n get: function () {\n return this.getLocalizableString(\"description\");\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.localeChanged = function () {\n _super.prototype.localeChanged.call(this);\n for (var i = 0; i < this.elements.length; i++) {\n this.elements[i].localeChanged();\n }\n };\n PanelModelBase.prototype.locStrsChanged = function () {\n _super.prototype.locStrsChanged.call(this);\n for (var i = 0; i < this.elements.length; i++) {\n this.elements[i].locStrsChanged();\n }\n };\n Object.defineProperty(PanelModelBase.prototype, \"requiredText\", {\n /**\n * Returns the char/string for a required panel.\n * @see SurveyModel.requiredText\n */\n get: function () {\n return this.survey != null && this.isRequired\n ? this.survey.requiredText\n : \"\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"titlePattern\", {\n get: function () {\n return !!this.survey ? this.survey.questionTitlePattern : \"numTitleRequire\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"isRequireTextOnStart\", {\n get: function () {\n return this.isRequired && this.titlePattern == \"requireNumTitle\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"isRequireTextBeforeTitle\", {\n get: function () {\n return this.isRequired && this.titlePattern == \"numRequireTitle\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"isRequireTextAfterTitle\", {\n get: function () {\n return this.isRequired && this.titlePattern == \"numTitleRequire\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"requiredErrorText\", {\n /**\n * The custom text that will be shown on required error. Use this property, if you do not want to show the default text.\n */\n get: function () {\n return this.getLocalizableStringText(\"requiredErrorText\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"requiredErrorText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"locRequiredErrorText\", {\n get: function () {\n return this.getLocalizableString(\"requiredErrorText\");\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.getLocale = function () {\n return this.survey\n ? this.survey.getLocale()\n : \"\";\n };\n PanelModelBase.prototype.getMarkdownHtml = function (text, name) {\n return this.survey\n ? this.survey.getSurveyMarkdownHtml(this, text, name)\n : null;\n };\n PanelModelBase.prototype.getRenderer = function (name) {\n return this.survey ? this.survey.getRendererForString(this, name) : null;\n };\n PanelModelBase.prototype.getProcessedText = function (text) {\n return this.textProcessor\n ? this.textProcessor.processText(text, true)\n : text;\n };\n Object.defineProperty(PanelModelBase.prototype, \"parent\", {\n /**\n * A parent element. It is always null for the Page object and always not null for the Panel object. Panel object may contain Questions and other Panels.\n */\n get: function () {\n return this.getPropertyValue(\"parent\", null);\n },\n set: function (val) {\n this.setPropertyValue(\"parent\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"depth\", {\n get: function () {\n if (this.parent == null)\n return 0;\n return this.parent.depth + 1;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"visibleIf\", {\n /**\n * An expression that returns true or false. If it returns true the Panel becomes visible and if it returns false the Panel becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used.\n * @see visible\n */\n get: function () {\n return this.getPropertyValue(\"visibleIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"visibleIf\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"cssClasses\", {\n get: function () {\n if (!this.cssClassesValue) {\n this.cssClassesValue = this.calcCssClasses();\n }\n return this.cssClassesValue;\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.calcCssClasses = function () {\n var classes = { panel: {}, error: {}, row: \"\" };\n this.copyCssClasses(classes.panel, this.css.panel);\n this.copyCssClasses(classes.error, this.css.error);\n if (!!this.css.row) {\n classes.row = this.css.row;\n }\n if (this.survey) {\n this.survey.updatePanelCssClasses(this, classes);\n }\n return classes;\n };\n Object.defineProperty(PanelModelBase.prototype, \"css\", {\n get: function () {\n return !!this.survey ? this.survey.getCss() : {};\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"id\", {\n /**\n * A unique element identificator. It is generated automatically.\n */\n get: function () {\n return this.getPropertyValue(\"id\");\n },\n set: function (val) {\n this.setPropertyValue(\"id\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"isPanel\", {\n /**\n * Returns true if the current object is Panel. Returns false if the current object is Page (a root Panel).\n */\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.getPanel = function () {\n return this;\n };\n PanelModelBase.prototype.getLayoutType = function () {\n return \"row\";\n };\n PanelModelBase.prototype.isLayoutTypeSupported = function (layoutType) {\n return layoutType !== \"flow\";\n };\n Object.defineProperty(PanelModelBase.prototype, \"questions\", {\n /**\n * Returns the list of all questions located in the Panel/Page, including in the nested Panels.\n * @see Question\n * @see elements\n */\n get: function () {\n if (!this.isQuestionsReady) {\n this.questionsValue = [];\n for (var i = 0; i < this.elements.length; i++) {\n var el = this.elements[i];\n if (el.isPanel) {\n var qs = el.questions;\n for (var j = 0; j < qs.length; j++) {\n this.questionsValue.push(qs[j]);\n }\n }\n else {\n this.questionsValue.push(el);\n }\n }\n this.isQuestionsReady = true;\n }\n return this.questionsValue;\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.getValidName = function (name) {\n if (!!name)\n return name.trim();\n return name;\n };\n /**\n * Returns the question by its name\n * @param name the question name\n */\n PanelModelBase.prototype.getQuestionByName = function (name) {\n var questions = this.questions;\n for (var i = 0; i < questions.length; i++) {\n if (questions[i].name == name)\n return questions[i];\n }\n return null;\n };\n /**\n * Returns the element by its name. It works recursively.\n * @param name the element name\n */\n PanelModelBase.prototype.getElementByName = function (name) {\n var elements = this.elements;\n for (var i = 0; i < elements.length; i++) {\n var el = elements[i];\n if (el.name == name)\n return el;\n var pnl = el.getPanel();\n if (!!pnl) {\n var res = pnl.getElementByName(name);\n if (!!res)\n return res;\n }\n }\n return null;\n };\n PanelModelBase.prototype.getQuestionByValueName = function (valueName) {\n var questions = this.questions;\n for (var i = 0; i < questions.length; i++) {\n if (questions[i].getValueName() == valueName)\n return questions[i];\n }\n return null;\n };\n /**\n * Returns question values on the current page\n */\n PanelModelBase.prototype.getValue = function () {\n var data = {};\n var questions = this.questions;\n for (var i = 0; i < questions.length; i++) {\n var q = questions[i];\n if (q.isEmpty())\n continue;\n var valueName = q.getValueName();\n data[valueName] = q.value;\n if (!!this.data) {\n var comment = this.data.getComment(valueName);\n if (!!comment) {\n data[valueName + _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].commentPrefix] = comment;\n }\n }\n }\n return data;\n };\n /**\n * Return questions values as a JSON object with display text. For example, for dropdown, it would return the item text instead of item value.\n * @param keysAsText Set this value to true, to return key (in matrices questions) as display text as well.\n */\n PanelModelBase.prototype.getDisplayValue = function (keysAsText) {\n var data = {};\n var questions = this.questions;\n for (var i = 0; i < questions.length; i++) {\n var q = questions[i];\n if (q.isEmpty())\n continue;\n var valueName = keysAsText ? q.title : q.getValueName();\n data[valueName] = q.getDisplayValue(keysAsText);\n }\n return data;\n };\n /**\n * Returns question comments on the current page\n */\n PanelModelBase.prototype.getComments = function () {\n var comments = {};\n if (!this.data)\n return comments;\n var questions = this.questions;\n for (var i = 0; i < questions.length; i++) {\n var q = questions[i];\n var comment = this.data.getComment(q.getValueName());\n if (!!comment) {\n comments[q.getValueName()] = comment;\n }\n }\n return comments;\n };\n /**\n * Call this function to remove all question values from the current page/panel, that end-user will not be able to enter.\n * For example the value that doesn't exists in a radigroup/dropdown/checkbox choices or matrix rows/columns.\n * Please note, this function doesn't clear values for invisible questions or values that doesn't associated with questions.\n * @see Question.clearIncorrectValues\n */\n PanelModelBase.prototype.clearIncorrectValues = function () {\n for (var i = 0; i < this.elements.length; i++) {\n this.elements[i].clearIncorrectValues();\n }\n };\n /**\n * Call this function to clear all errors in the panel / page and all its child elements (panels and questions)\n */\n PanelModelBase.prototype.clearErrors = function () {\n for (var i = 0; i < this.elements.length; i++) {\n this.elements[i].clearErrors();\n }\n this.errors = [];\n };\n PanelModelBase.prototype.markQuestionListDirty = function () {\n this.isQuestionsReady = false;\n if (this.parent)\n this.parent.markQuestionListDirty();\n };\n Object.defineProperty(PanelModelBase.prototype, \"elements\", {\n /**\n * Returns the list of the elements in the object, Panel/Page. Elements can be questions or panels. The function doesn't return elements in the nested Panels.\n */\n get: function () {\n return this.elementsValue;\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.getElementsInDesign = function (includeHidden) {\n if (includeHidden === void 0) { includeHidden = false; }\n return this.elements;\n };\n /**\n * Returns true if the current element belongs to the Panel/Page. It looks in nested Panels as well.\n * @param element\n * @see PanelModel\n */\n PanelModelBase.prototype.containsElement = function (element) {\n for (var i = 0; i < this.elements.length; i++) {\n var el = this.elements[i];\n if (el == element)\n return true;\n var pnl = el.getPanel();\n if (!!pnl) {\n if (pnl.containsElement(element))\n return true;\n }\n }\n return false;\n };\n Object.defineProperty(PanelModelBase.prototype, \"isRequired\", {\n /**\n * Set this property to true, to require the answer at least in one question in the panel.\n */\n get: function () {\n return this.getPropertyValue(\"isRequired\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"isRequired\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModelBase.prototype, \"requiredIf\", {\n /**\n * An expression that returns true or false. If it returns true the Panel/Page becomes required.\n * The library runs the expression on survey start and on changing a question value. If the property is empty then isRequired property is used.\n * @see isRequired\n */\n get: function () {\n return this.getPropertyValue(\"requiredIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"requiredIf\", val);\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.searchText = function (text, founded) {\n _super.prototype.searchText.call(this, text, founded);\n for (var i = 0; i < this.elements.length; i++) {\n this.elements[i].searchText(text, founded);\n }\n };\n /**\n * Returns true, if there is an error on this Page or inside the current Panel\n * @param fireCallback set it to true, to show errors in UI\n * @param focusOnFirstError set it to true to focus on the first question that doesn't pass the validation\n */\n PanelModelBase.prototype.hasErrors = function (fireCallback, focusOnFirstError, rec) {\n if (fireCallback === void 0) { fireCallback = true; }\n if (focusOnFirstError === void 0) { focusOnFirstError = false; }\n if (rec === void 0) { rec = null; }\n rec = !!rec\n ? rec\n : {\n fireCallback: fireCallback,\n focuseOnFirstError: focusOnFirstError,\n firstErrorQuestion: null,\n result: false,\n };\n this.hasErrorsCore(rec);\n if (rec.firstErrorQuestion) {\n rec.firstErrorQuestion.focus(true);\n }\n return rec.result;\n };\n PanelModelBase.prototype.hasErrorsInPanels = function (rec) {\n var errors = [];\n this.hasRequiredError(rec, errors);\n if (this.survey) {\n var customError = this.survey.validatePanel(this);\n if (customError) {\n errors.push(customError);\n rec.result = true;\n }\n }\n if (!!rec.fireCallback) {\n if (!!this.survey) {\n this.survey.beforeSettingPanelErrors(this, errors);\n }\n this.errors = errors;\n }\n };\n //ISurveyErrorOwner\n PanelModelBase.prototype.getErrorCustomText = function (text, error) {\n if (!!this.survey)\n return this.survey.getErrorCustomText(text, error);\n return text;\n };\n PanelModelBase.prototype.hasRequiredError = function (rec, errors) {\n if (!this.isRequired)\n return;\n var visQuestions = [];\n this.addQuestionsToList(visQuestions, true);\n if (visQuestions.length == 0)\n return;\n for (var i = 0; i < visQuestions.length; i++) {\n if (!visQuestions[i].isEmpty())\n return;\n }\n rec.result = true;\n errors.push(new _error__WEBPACK_IMPORTED_MODULE_7__[\"OneAnswerRequiredError\"](this.requiredErrorText, this));\n if (rec.focuseOnFirstError && !rec.firstErrorQuestion) {\n rec.firstErrorQuestion = visQuestions[0];\n }\n };\n PanelModelBase.prototype.hasErrorsCore = function (rec) {\n var elements = this.elements;\n var element = null;\n for (var i = 0; i < elements.length; i++) {\n element = elements[i];\n if (!element.isVisible)\n continue;\n if (element.isPanel) {\n element.hasErrorsCore(rec);\n }\n else {\n var question = element;\n if (question.isReadOnly)\n continue;\n if (question.hasErrors(rec.fireCallback, rec)) {\n if (rec.focuseOnFirstError && rec.firstErrorQuestion == null) {\n rec.firstErrorQuestion = question;\n }\n rec.result = true;\n }\n }\n }\n this.hasErrorsInPanels(rec);\n this.updateContainsErrors();\n };\n PanelModelBase.prototype.getContainsErrors = function () {\n var res = _super.prototype.getContainsErrors.call(this);\n if (res)\n return res;\n var elements = this.elements;\n for (var i = 0; i < elements.length; i++) {\n if (elements[i].containsErrors)\n return true;\n }\n return false;\n };\n PanelModelBase.prototype.updateElementVisibility = function () {\n for (var i = 0; i < this.elements.length; i++) {\n var el = this.elements[i];\n el.setPropertyValue(\"isVisible\", el.isVisible);\n if (el.isPanel) {\n el.updateElementVisibility();\n }\n }\n };\n PanelModelBase.prototype.getFirstQuestionToFocus = function (withError) {\n if (withError === void 0) { withError = false; }\n var elements = this.elements;\n for (var i = 0; i < elements.length; i++) {\n var el = elements[i];\n if (!el.isVisible)\n continue;\n if (el.isPanel) {\n var res = el.getFirstQuestionToFocus(withError);\n if (!!res)\n return res;\n }\n else {\n var q = el;\n if (q.hasInput && (!withError || q.currentErrorCount > 0))\n return q;\n }\n }\n return null;\n };\n /**\n * Call it to focus the input on the first question\n */\n PanelModelBase.prototype.focusFirstQuestion = function () {\n var q = this.getFirstQuestionToFocus();\n if (!!q) {\n q.focus();\n }\n };\n /**\n * Call it to focus the input of the first question that has an error.\n */\n PanelModelBase.prototype.focusFirstErrorQuestion = function () {\n var q = this.getFirstQuestionToFocus(true);\n if (!!q) {\n q.focus();\n }\n };\n /**\n * Fill list array with the questions.\n * @param list\n * @param visibleOnly set it to true to get visible questions only\n */\n PanelModelBase.prototype.addQuestionsToList = function (list, visibleOnly, includingDesignTime) {\n if (visibleOnly === void 0) { visibleOnly = false; }\n if (includingDesignTime === void 0) { includingDesignTime = false; }\n this.addElementsToList(list, visibleOnly, includingDesignTime, false);\n };\n /**\n * Fill list array with the panels.\n * @param list\n */\n PanelModelBase.prototype.addPanelsIntoList = function (list, visibleOnly, includingDesignTime) {\n if (visibleOnly === void 0) { visibleOnly = false; }\n if (includingDesignTime === void 0) { includingDesignTime = false; }\n this.addElementsToList(list, visibleOnly, includingDesignTime, true);\n };\n PanelModelBase.prototype.addElementsToList = function (list, visibleOnly, includingDesignTime, isPanel) {\n if (visibleOnly && !this.visible)\n return;\n this.addElementsToListCore(list, this.elements, visibleOnly, includingDesignTime, isPanel);\n };\n PanelModelBase.prototype.addElementsToListCore = function (list, elements, visibleOnly, includingDesignTime, isPanel) {\n for (var i = 0; i < elements.length; i++) {\n var el = elements[i];\n if (visibleOnly && !el.visible)\n continue;\n if ((isPanel && el.isPanel) || (!isPanel && !el.isPanel)) {\n list.push(el);\n }\n if (el.isPanel) {\n el.addElementsToListCore(list, el.elements, visibleOnly, includingDesignTime, isPanel);\n }\n else {\n if (includingDesignTime) {\n this.addElementsToListCore(list, el.getElementsInDesign(false), visibleOnly, includingDesignTime, isPanel);\n }\n }\n }\n };\n Object.defineProperty(PanelModelBase.prototype, \"isActive\", {\n /**\n * Returns true if the current object is Page and it is the current page.\n */\n get: function () {\n return !this.survey || this.survey.currentPage == this.root;\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.updateCustomWidgets = function () {\n for (var i = 0; i < this.elements.length; i++) {\n this.elements[i].updateCustomWidgets();\n }\n };\n Object.defineProperty(PanelModelBase.prototype, \"questionTitleLocation\", {\n /**\n * Set this property different from \"default\" to set the specific question title location for this panel/page.\n * @see SurveyModel.questionTitleLocation\n */\n get: function () {\n return this.getPropertyValue(\"questionTitleLocation\");\n },\n set: function (value) {\n this.setPropertyValue(\"questionTitleLocation\", value.toLowerCase());\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.getQuestionTitleLocation = function () {\n if (this.onGetQuestionTitleLocation)\n return this.onGetQuestionTitleLocation();\n if (this.questionTitleLocation != \"default\")\n return this.questionTitleLocation;\n if (this.parent)\n return this.parent.getQuestionTitleLocation();\n return this.survey ? this.survey.questionTitleLocation : \"top\";\n };\n PanelModelBase.prototype.getStartIndex = function () {\n if (!!this.parent)\n return this.parent.getQuestionStartIndex();\n if (!!this.survey)\n return this.survey.questionStartIndex;\n return \"\";\n };\n PanelModelBase.prototype.getQuestionStartIndex = function () {\n return this.getStartIndex();\n };\n PanelModelBase.prototype.getChildrenLayoutType = function () {\n return \"row\";\n };\n PanelModelBase.prototype.getProgressInfo = function () {\n return _survey_element__WEBPACK_IMPORTED_MODULE_3__[\"SurveyElement\"].getProgressInfoByElements(this.elements, this.isRequired);\n };\n Object.defineProperty(PanelModelBase.prototype, \"root\", {\n get: function () {\n var res = this;\n while (res.parent)\n res = res.parent;\n return res;\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.childVisibilityChanged = function () {\n var newIsVisibleValue = this.getIsPageVisible(null);\n var oldIsVisibleValue = this.getPropertyValue(\"isVisible\", true);\n if (newIsVisibleValue !== oldIsVisibleValue) {\n this.onVisibleChanged();\n }\n };\n PanelModelBase.prototype.createRowAndSetLazy = function (index) {\n var row = this.createRow();\n row.setIsLazyRendering(this.isLazyRenderInRow(index));\n return row;\n };\n PanelModelBase.prototype.createRow = function () {\n return new QuestionRowModel(this);\n };\n PanelModelBase.prototype.onSurveyLoad = function () {\n for (var i = 0; i < this.elements.length; i++) {\n this.elements[i].onSurveyLoad();\n }\n this.onElementVisibilityChanged(this);\n };\n PanelModelBase.prototype.onFirstRendering = function () {\n for (var i = 0; i < this.elements.length; i++) {\n this.elements[i].onFirstRendering();\n }\n this.onRowsChanged();\n };\n Object.defineProperty(PanelModelBase.prototype, \"rows\", {\n get: function () {\n return this.getPropertyValue(\"rows\");\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.ensureRowsVisibility = function () {\n this.rows.forEach(function (row) {\n row.ensureVisibility();\n });\n };\n PanelModelBase.prototype.onRowsChanged = function () {\n if (this.isLoadingFromJson)\n return;\n this.setPropertyValue(\"rows\", this.buildRows());\n };\n PanelModelBase.prototype.onAddElement = function (element, index) {\n element.setSurveyImpl(this.surveyImpl);\n element.parent = this;\n this.markQuestionListDirty();\n this.updateRowsOnElementAdded(element, index);\n if (element.isPanel) {\n var p = element;\n if (this.survey) {\n this.survey.panelAdded(p, index, this, this.root);\n }\n }\n else {\n if (this.survey) {\n var q = element;\n this.survey.questionAdded(q, index, this, this.root);\n }\n }\n if (!!this.addElementCallback)\n this.addElementCallback(element);\n var self = this;\n element.registerFunctionOnPropertiesValueChanged([\"visible\", \"isVisible\"], function () {\n self.onElementVisibilityChanged(element);\n }, this.id);\n element.registerFunctionOnPropertyValueChanged(\"startWithNewLine\", function () {\n self.onElementStartWithNewLineChanged(element);\n }, this.id);\n this.onElementVisibilityChanged(this);\n };\n PanelModelBase.prototype.onRemoveElement = function (element) {\n element.parent = null;\n this.markQuestionListDirty();\n element.unRegisterFunctionOnPropertiesValueChanged([\"visible\", \"isVisible\", \"startWithNewLine\"], this.id);\n this.updateRowsOnElementRemoved(element);\n if (!element.isPanel) {\n if (this.survey)\n this.survey.questionRemoved(element);\n }\n else {\n if (this.survey)\n this.survey.panelRemoved(element);\n }\n if (!!this.removeElementCallback)\n this.removeElementCallback(element);\n this.onElementVisibilityChanged(this);\n };\n PanelModelBase.prototype.onElementVisibilityChanged = function (element) {\n if (this.isLoadingFromJson)\n return;\n this.updateRowsVisibility(element);\n this.childVisibilityChanged();\n if (!!this.parent) {\n this.parent.onElementVisibilityChanged(this);\n }\n };\n PanelModelBase.prototype.onElementStartWithNewLineChanged = function (element) {\n this.onRowsChanged();\n };\n PanelModelBase.prototype.updateRowsVisibility = function (element) {\n var rows = this.rows;\n for (var i = 0; i < rows.length; i++) {\n var row = rows[i];\n if (row.elements.indexOf(element) > -1) {\n row.updateVisible();\n break;\n }\n }\n };\n PanelModelBase.prototype.canBuildRows = function () {\n return !this.isLoadingFromJson && this.getChildrenLayoutType() == \"row\";\n };\n PanelModelBase.prototype.buildRows = function () {\n if (!this.canBuildRows())\n return [];\n var result = new Array();\n for (var i = 0; i < this.elements.length; i++) {\n var el = this.elements[i];\n var isNewRow = i == 0 || el.startWithNewLine;\n var row = isNewRow ? this.createRowAndSetLazy(result.length) : result[result.length - 1];\n if (isNewRow)\n result.push(row);\n row.addElement(el);\n }\n for (var i = 0; i < result.length; i++) {\n result[i].updateVisible();\n }\n return result;\n };\n PanelModelBase.prototype.isLazyRenderInRow = function (rowIndex) {\n if (!this.survey || !this.survey.isLazyRendering)\n return false;\n return (rowIndex >= _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].lazyRowsRenderingStartRow ||\n !this.canRenderFirstRows());\n };\n PanelModelBase.prototype.canRenderFirstRows = function () {\n return this.isPage;\n };\n PanelModelBase.prototype.updateRowsOnElementAdded = function (element, index) {\n if (!this.canBuildRows())\n return;\n var dragDropInfo = new DragDropInfo(null, element);\n dragDropInfo.target = element;\n dragDropInfo.isEdge = this.elements.length > 1;\n if (this.elements.length < 2) {\n dragDropInfo.destination = this;\n }\n else {\n dragDropInfo.isBottom = index > 0;\n if (index == 0) {\n dragDropInfo.destination = this.elements[1];\n }\n else {\n dragDropInfo.destination = this.elements[index - 1];\n }\n }\n this.dragDropAddTargetToRow(dragDropInfo, null);\n };\n PanelModelBase.prototype.updateRowsOnElementRemoved = function (element) {\n if (!this.canBuildRows())\n return;\n this.updateRowsRemoveElementFromRow(element, this.findRowByElement(element));\n };\n PanelModelBase.prototype.updateRowsRemoveElementFromRow = function (element, row) {\n if (!row || !row.panel)\n return;\n var elIndex = row.elements.indexOf(element);\n if (elIndex < 0)\n return;\n row.elements.splice(elIndex, 1);\n if (row.elements.length > 0) {\n row.updateVisible();\n }\n else {\n if (row.index >= 0) {\n row.panel.rows.splice(row.index, 1);\n }\n }\n };\n PanelModelBase.prototype.findRowByElement = function (el) {\n var rows = this.rows;\n for (var i = 0; i < rows.length; i++) {\n if (rows[i].elements.indexOf(el) > -1)\n return rows[i];\n }\n return null;\n };\n PanelModelBase.prototype.elementWidthChanged = function (el) {\n if (this.isLoadingFromJson)\n return;\n var row = this.findRowByElement(el);\n if (!!row) {\n row.updateVisible();\n }\n };\n Object.defineProperty(PanelModelBase.prototype, \"processedTitle\", {\n /**\n * Returns rendered title text or html.\n */\n get: function () {\n return this.getRenderedTitle(this.locTitle.textOrHtml);\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.getRenderedTitle = function (str) {\n return this.textProcessor != null\n ? this.textProcessor.processText(str, true)\n : str;\n };\n Object.defineProperty(PanelModelBase.prototype, \"visible\", {\n /**\n * Use it to get/set the object visibility.\n * @see visibleIf\n */\n get: function () {\n return this.getPropertyValue(\"visible\", true);\n },\n set: function (value) {\n if (value === this.visible)\n return;\n this.setPropertyValue(\"visible\", value);\n this.setPropertyValue(\"isVisible\", this.isVisible);\n if (!this.isLoadingFromJson)\n this.onVisibleChanged();\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.onVisibleChanged = function () {\n this.setPropertyValue(\"isVisible\", this.isVisible);\n if (!!this.survey &&\n this.survey.isClearValueOnHiddenContainer &&\n !this.isLoadingFromJson) {\n var questions = this.questions;\n for (var i = 0; i < questions.length; i++) {\n if (!this.isVisible) {\n questions[i].clearValue();\n }\n else {\n questions[i].updateValueWithDefaults();\n }\n }\n }\n };\n Object.defineProperty(PanelModelBase.prototype, \"isVisible\", {\n /**\n * Returns true if object is visible or survey is in design mode right now.\n */\n get: function () {\n return this.areInvisibleElementsShowing || this.getIsPageVisible(null);\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.getIsPageVisible = function (exceptionQuestion) {\n if (!this.visible)\n return false;\n for (var i = 0; i < this.elements.length; i++) {\n if (this.elements[i] == exceptionQuestion)\n continue;\n if (this.elements[i].isVisible)\n return true;\n }\n return false;\n };\n PanelModelBase.prototype.setVisibleIndex = function (index) {\n if (!this.isVisible || index < 0) {\n this.resetVisibleIndexes();\n return 0;\n }\n this.lastVisibleIndex = index;\n var startIndex = index;\n index += this.beforeSetVisibleIndex(index);\n var panelStartIndex = this.getPanelStartIndex(index);\n var panelIndex = panelStartIndex;\n for (var i = 0; i < this.elements.length; i++) {\n panelIndex += this.elements[i].setVisibleIndex(panelIndex);\n }\n if (this.isContinueNumbering()) {\n index += panelIndex - panelStartIndex;\n }\n return index - startIndex;\n };\n PanelModelBase.prototype.updateVisibleIndexes = function () {\n if (this.lastVisibleIndex === undefined)\n return;\n this.resetVisibleIndexes();\n this.setVisibleIndex(this.lastVisibleIndex);\n };\n PanelModelBase.prototype.resetVisibleIndexes = function () {\n for (var i = 0; i < this.elements.length; i++) {\n this.elements[i].setVisibleIndex(-1);\n }\n };\n PanelModelBase.prototype.beforeSetVisibleIndex = function (index) {\n return 0;\n };\n PanelModelBase.prototype.getPanelStartIndex = function (index) {\n return index;\n };\n PanelModelBase.prototype.isContinueNumbering = function () {\n return true;\n };\n Object.defineProperty(PanelModelBase.prototype, \"isReadOnly\", {\n /**\n * Returns true if readOnly property is true or survey is in display mode or parent panel/page is readOnly.\n * @see SurveyModel.model\n * @see readOnly\n */\n get: function () {\n var isParentReadOnly = !!this.parent && this.parent.isReadOnly;\n var isSurveyReadOnly = !!this.survey && this.survey.isDisplayMode;\n return this.readOnly || isParentReadOnly || isSurveyReadOnly;\n },\n enumerable: false,\n configurable: true\n });\n PanelModelBase.prototype.onReadOnlyChanged = function () {\n for (var i = 0; i < this.elements.length; i++) {\n var el = this.elements[i];\n el.setPropertyValue(\"isReadOnly\", el.isReadOnly);\n }\n _super.prototype.onReadOnlyChanged.call(this);\n };\n PanelModelBase.prototype.updateElementCss = function (reNew) {\n this.cssClassesValue = undefined;\n for (var i = 0; i < this.elements.length; i++) {\n var el = this.elements[i];\n el.updateElementCss(reNew);\n }\n _super.prototype.updateElementCss.call(this, reNew);\n };\n Object.defineProperty(PanelModelBase.prototype, \"enableIf\", {\n /**\n * An expression that returns true or false. If it returns false the Panel/Page becomes read only and an end-user will not able to answer on qustions inside it.\n * The library runs the expression on survey start and on changing a question value. If the property is empty then readOnly property is used.\n * @see readOnly\n * @see isReadOnly\n */\n get: function () {\n return this.getPropertyValue(\"enableIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"enableIf\", val);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Add an element into Panel or Page. Returns true if the element added successfully. Otherwise returns false.\n * @param element\n * @param index element index in the elements array\n */\n PanelModelBase.prototype.addElement = function (element, index) {\n if (index === void 0) { index = -1; }\n if (!this.canAddElement(element))\n return false;\n if (index < 0 || index >= this.elements.length) {\n this.elements.push(element);\n }\n else {\n this.elements.splice(index, 0, element);\n }\n return true;\n };\n PanelModelBase.prototype.insertElementAfter = function (element, after) {\n var index = this.elements.indexOf(after);\n if (index >= 0)\n this.addElement(element, index + 1);\n };\n PanelModelBase.prototype.insertElementBefore = function (element, before) {\n var index = this.elements.indexOf(before);\n if (index >= 0)\n this.addElement(element, index);\n };\n PanelModelBase.prototype.canAddElement = function (element) {\n return (!!element && element.isLayoutTypeSupported(this.getChildrenLayoutType()));\n };\n /**\n * Add a question into Panel or Page. Returns true if the question added successfully. Otherwise returns false.\n * @param question\n * @param index element index in the elements array\n */\n PanelModelBase.prototype.addQuestion = function (question, index) {\n if (index === void 0) { index = -1; }\n return this.addElement(question, index);\n };\n /**\n * Add a panel into Panel or Page. Returns true if the panel added successfully. Otherwise returns false.\n * @param panel\n * @param index element index in the elements array\n */\n PanelModelBase.prototype.addPanel = function (panel, index) {\n if (index === void 0) { index = -1; }\n return this.addElement(panel, index);\n };\n /**\n * Creates a new question and adds it at location of index, by default the end of the elements list. Returns null, if the question could not be created or could not be added into page or panel.\n * @param questionType the possible values are: \"text\", \"checkbox\", \"dropdown\", \"matrix\", \"html\", \"matrixdynamic\", \"matrixdropdown\" and so on.\n * @param name a question name\n * @param index element index in the elements array\n */\n PanelModelBase.prototype.addNewQuestion = function (questionType, name, index) {\n if (name === void 0) { name = null; }\n if (index === void 0) { index = -1; }\n var question = _questionfactory__WEBPACK_IMPORTED_MODULE_6__[\"QuestionFactory\"].Instance.createQuestion(questionType, name);\n if (!this.addQuestion(question, index))\n return null;\n return question;\n };\n /**\n * Creates a new panel and adds it into the end of the elements list. Returns null, if the panel could not be created or could not be added into page or panel.\n * @param name a panel name\n */\n PanelModelBase.prototype.addNewPanel = function (name) {\n if (name === void 0) { name = null; }\n var panel = this.createNewPanel(name);\n if (!this.addPanel(panel))\n return null;\n return panel;\n };\n /**\n * Returns the index of element parameter in the elements list.\n * @param element question or panel\n */\n PanelModelBase.prototype.indexOf = function (element) {\n return this.elements.indexOf(element);\n };\n PanelModelBase.prototype.createNewPanel = function (name) {\n var res = _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].createClass(\"panel\");\n res.name = name;\n return res;\n };\n /**\n * Remove an element (Panel or Question) from the elements list.\n * @param element\n * @see elements\n */\n PanelModelBase.prototype.removeElement = function (element) {\n var index = this.elements.indexOf(element);\n if (index < 0) {\n for (var i = 0; i < this.elements.length; i++) {\n if (this.elements[i].removeElement(element))\n return true;\n }\n return false;\n }\n this.elements.splice(index, 1);\n return true;\n };\n /**\n * Remove question from the elements list.\n * @param question\n * @see elements\n * @see removeElement\n */\n PanelModelBase.prototype.removeQuestion = function (question) {\n this.removeElement(question);\n };\n PanelModelBase.prototype.runCondition = function (values, properties) {\n if (this.isDesignMode || this.isLoadingFromJson)\n return;\n var elements = this.elements.slice();\n for (var i = 0; i < elements.length; i++) {\n elements[i].runCondition(values, properties);\n }\n if (!this.areInvisibleElementsShowing) {\n this.runVisibleCondition(values, properties);\n }\n this.runEnableCondition(values, properties);\n this.runRequiredCondition(values, properties);\n };\n PanelModelBase.prototype.runVisibleCondition = function (values, properties) {\n var _this = this;\n if (!this.visibleIf)\n return;\n var conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_5__[\"ConditionRunner\"](this.visibleIf);\n conditionRunner.onRunComplete = function (res) {\n _this.visible = res;\n };\n conditionRunner.run(values, properties);\n };\n PanelModelBase.prototype.runEnableCondition = function (values, properties) {\n var _this = this;\n if (!this.enableIf)\n return;\n var conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_5__[\"ConditionRunner\"](this.enableIf);\n conditionRunner.onRunComplete = function (res) {\n _this.readOnly = !res;\n };\n conditionRunner.run(values, properties);\n };\n PanelModelBase.prototype.runRequiredCondition = function (values, properties) {\n var _this = this;\n if (!this.requiredIf)\n return;\n var conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_5__[\"ConditionRunner\"](this.requiredIf);\n conditionRunner.onRunComplete = function (res) {\n _this.isRequired = res;\n };\n conditionRunner.run(values, properties);\n };\n PanelModelBase.prototype.onAnyValueChanged = function (name) {\n var els = this.elements;\n for (var i = 0; i < els.length; i++) {\n els[i].onAnyValueChanged(name);\n }\n };\n PanelModelBase.prototype.checkBindings = function (valueName, value) {\n var els = this.elements;\n for (var i = 0; i < els.length; i++) {\n els[i].checkBindings(valueName, value);\n }\n };\n PanelModelBase.prototype.dragDropAddTarget = function (dragDropInfo) {\n var prevRow = this.dragDropFindRow(dragDropInfo.target);\n if (this.dragDropAddTargetToRow(dragDropInfo, prevRow)) {\n this.updateRowsRemoveElementFromRow(dragDropInfo.target, prevRow);\n }\n };\n PanelModelBase.prototype.dragDropFindRow = function (findElement) {\n if (!findElement || findElement.isPage)\n return null;\n var element = findElement;\n var rows = this.rows;\n for (var i = 0; i < rows.length; i++) {\n if (rows[i].elements.indexOf(element) > -1)\n return rows[i];\n }\n for (var i = 0; i < this.elements.length; i++) {\n var pnl = this.elements[i].getPanel();\n if (!pnl)\n continue;\n var row = pnl.dragDropFindRow(element);\n if (!!row)\n return row;\n }\n return null;\n };\n PanelModelBase.prototype.dragDropAddTargetToRow = function (dragDropInfo, prevRow) {\n if (!dragDropInfo.destination)\n return true;\n if (this.dragDropAddTargetToEmptyPanel(dragDropInfo))\n return true;\n var dest = dragDropInfo.destination;\n var destRow = this.dragDropFindRow(dest);\n if (!destRow)\n return true;\n if (!dragDropInfo.target.startWithNewLine)\n return this.dragDropAddTargetToExistingRow(dragDropInfo, destRow, prevRow);\n return this.dragDropAddTargetToNewRow(dragDropInfo, destRow, prevRow);\n };\n PanelModelBase.prototype.dragDropAddTargetToEmptyPanel = function (dragDropInfo) {\n if (dragDropInfo.destination.isPage) {\n this.dragDropAddTargetToEmptyPanelCore(this.root, dragDropInfo.target, dragDropInfo.isBottom);\n return true;\n }\n var dest = dragDropInfo.destination;\n if (dest.isPanel && !dragDropInfo.isEdge) {\n var panel = dest;\n if (dragDropInfo.target[\"template\"] === dest) {\n return false;\n }\n if (dragDropInfo.nestedPanelDepth < 0 ||\n dragDropInfo.nestedPanelDepth >= panel.depth) {\n this.dragDropAddTargetToEmptyPanelCore(dest, dragDropInfo.target, dragDropInfo.isBottom);\n return true;\n }\n }\n return false;\n };\n PanelModelBase.prototype.dragDropAddTargetToExistingRow = function (dragDropInfo, destRow, prevRow) {\n var index = destRow.elements.indexOf(dragDropInfo.destination);\n if (index == 0 &&\n !dragDropInfo.isBottom &&\n destRow.elements[0].startWithNewLine) {\n if (destRow.index > 0) {\n dragDropInfo.isBottom = true;\n destRow = destRow.panel.rows[destRow.index - 1];\n dragDropInfo.destination =\n destRow.elements[destRow.elements.length - 1];\n return this.dragDropAddTargetToExistingRow(dragDropInfo, destRow, prevRow);\n }\n else {\n return this.dragDropAddTargetToNewRow(dragDropInfo, destRow, prevRow);\n }\n }\n var prevRowIndex = -1;\n if (prevRow == destRow) {\n prevRowIndex = destRow.elements.indexOf(dragDropInfo.target);\n }\n if (dragDropInfo.isBottom)\n index++;\n var srcRow = this.findRowByElement(dragDropInfo.source);\n if (srcRow == destRow &&\n srcRow.elements.indexOf(dragDropInfo.source) == index)\n return false;\n if (index == prevRowIndex)\n return false;\n if (prevRowIndex > -1) {\n destRow.elements.splice(prevRowIndex, 1);\n if (prevRowIndex < index)\n index--;\n }\n destRow.elements.splice(index, 0, dragDropInfo.target);\n destRow.updateVisible();\n return prevRowIndex < 0;\n };\n PanelModelBase.prototype.dragDropAddTargetToNewRow = function (dragDropInfo, destRow, prevRow) {\n var targetRow = destRow.panel.createRowAndSetLazy(destRow.panel.rows.length);\n targetRow.addElement(dragDropInfo.target);\n var index = destRow.index;\n if (dragDropInfo.isBottom) {\n index++;\n }\n //same row\n if (!!prevRow && prevRow.panel == targetRow.panel && prevRow.index == index)\n return false;\n var srcRow = this.findRowByElement(dragDropInfo.source);\n if (!!srcRow &&\n srcRow.panel == targetRow.panel &&\n srcRow.elements.length == 1 &&\n srcRow.index == index)\n return false;\n destRow.panel.rows.splice(index, 0, targetRow);\n return true;\n };\n PanelModelBase.prototype.dragDropAddTargetToEmptyPanelCore = function (panel, target, isBottom) {\n var targetRow = panel.createRow();\n targetRow.addElement(target);\n if (panel.elements.length == 0 || isBottom) {\n panel.rows.push(targetRow);\n }\n else {\n panel.rows.splice(0, 0, targetRow);\n }\n };\n PanelModelBase.prototype.dragDropMoveElement = function (src, target, targetIndex) {\n var srcIndex = src.parent.elements.indexOf(src);\n if (targetIndex > srcIndex) {\n targetIndex--;\n }\n this.removeElement(src);\n this.addElement(target, targetIndex);\n };\n PanelModelBase.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n if (this.rows) {\n for (var i = 0; i < this.rows.length; i++) {\n this.rows[i].dispose();\n }\n this.rows.splice(0, this.rows.length);\n }\n for (var i = 0; i < this.elements.length; i++) {\n this.elements[i].dispose();\n }\n this.elements.splice(0, this.elements.length);\n };\n PanelModelBase.panelCounter = 100;\n return PanelModelBase;\n}(_survey_element__WEBPACK_IMPORTED_MODULE_3__[\"SurveyElement\"]));\n\n/**\n * A container element, similar to the Page objects. However, unlike the Page, Panel can't be a root.\n * It may contain questions and other panels.\n */\nvar PanelModel = /** @class */ (function (_super) {\n __extends(PanelModel, _super);\n function PanelModel(name) {\n if (name === void 0) { name = \"\"; }\n var _this = _super.call(this, name) || this;\n var self = _this;\n _this.registerFunctionOnPropertyValueChanged(\"width\", function () {\n if (!!self.parent) {\n self.parent.elementWidthChanged(self);\n }\n });\n _this.registerFunctionOnPropertiesValueChanged([\"indent\", \"innerIndent\", \"rightIndent\"], function () {\n self.onIndentChanged();\n });\n return _this;\n }\n PanelModel.prototype.getType = function () {\n return \"panel\";\n };\n Object.defineProperty(PanelModel.prototype, \"contentId\", {\n get: function () {\n return this.id + \"_content\";\n },\n enumerable: false,\n configurable: true\n });\n PanelModel.prototype.getSurvey = function (live) {\n if (live === void 0) { live = false; }\n if (live) {\n return !!this.parent ? this.parent.getSurvey(live) : null;\n }\n return _super.prototype.getSurvey.call(this, live);\n };\n PanelModel.prototype.onSurveyLoad = function () {\n _super.prototype.onSurveyLoad.call(this);\n this.onIndentChanged();\n };\n PanelModel.prototype.onSetData = function () {\n _super.prototype.onSetData.call(this);\n this.onIndentChanged();\n };\n Object.defineProperty(PanelModel.prototype, \"isPanel\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"page\", {\n /**\n * Get/set the page where the panel is located.\n */\n get: function () {\n return this.getPage(this.parent);\n },\n set: function (val) {\n this.setPage(this.parent, val);\n },\n enumerable: false,\n configurable: true\n });\n PanelModel.prototype.delete = function () {\n if (!!this.parent) {\n this.removeSelfFromList(this.parent.elements);\n }\n };\n /**\n * Move panel to a new container Page/Panel. Add as a last element if insertBefore parameter is not used or inserted into the given index,\n * if insert parameter is number, or before the given element, if the insertBefore parameter is a question or panel\n * @param container Page or Panel to where a question is relocated.\n * @param insertBefore Use it if you want to set the panel to a specific position. You may use a number (use 0 to insert int the beginning) or element, if you want to insert before this element.\n */\n PanelModel.prototype.moveTo = function (container, insertBefore) {\n if (insertBefore === void 0) { insertBefore = null; }\n return this.moveToBase(this.parent, container, insertBefore);\n };\n Object.defineProperty(PanelModel.prototype, \"visibleIndex\", {\n /**\n * Returns the visible index of the panel in the survey. Commonly it is -1 and it doesn't show.\n * You have to set showNumber to true to show index/numbering for the Panel\n * @see showNumber\n */\n get: function () {\n return this.getPropertyValue(\"visibleIndex\", -1);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"showNumber\", {\n /**\n * Set showNumber to true to start showing the number for this panel.\n * @see visibleIndex\n */\n get: function () {\n return this.getPropertyValue(\"showNumber\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"showNumber\", val);\n this.notifySurveyOnVisibilityChanged();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"showQuestionNumbers\", {\n /**\n * Gets or sets a value that specifies how the elements numbers inside panel are displayed.\n *\n * The following options are available:\n *\n * - `default` - display questions numbers as defined in parent panel or survey\n * - `onpanel` - display questions numbers, start numbering from beginning of this page\n * - `off` - turn off the numbering for questions titles\n * @see showNumber\n */\n get: function () {\n return this.getPropertyValue(\"showQuestionNumbers\", \"default\");\n },\n set: function (value) {\n this.setPropertyValue(\"showQuestionNumbers\", value);\n this.notifySurveyOnVisibilityChanged();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"questionStartIndex\", {\n /**\n * Gets or sets the first question index for elements inside the panel. The first question index is '1.' by default and it is taken from survey.questionStartIndex property.\n * You may start it from '100' or from 'A', by setting '100' or 'A' to this property.\n * You can set the start index to \"(1)\" or \"# A)\" or \"a)\" to render question number as (1), # A) and a) accordingly.\n * @see survey.questionStartIndex\n */\n get: function () {\n return this.getPropertyValue(\"questionStartIndex\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"questionStartIndex\", val);\n },\n enumerable: false,\n configurable: true\n });\n PanelModel.prototype.getQuestionStartIndex = function () {\n if (!!this.questionStartIndex)\n return this.questionStartIndex;\n return _super.prototype.getQuestionStartIndex.call(this);\n };\n Object.defineProperty(PanelModel.prototype, \"no\", {\n /**\n * The property returns the question number. If question is invisible then it returns empty string.\n * If visibleIndex is 1, then no is 2, or 'B' if survey.questionStartIndex is 'A'.\n * @see SurveyModel.questionStartIndex\n */\n get: function () {\n return this.getPropertyValue(\"no\", \"\");\n },\n enumerable: false,\n configurable: true\n });\n PanelModel.prototype.setNo = function (visibleIndex) {\n this.setPropertyValue(\"no\", _helpers__WEBPACK_IMPORTED_MODULE_1__[\"Helpers\"].getNumberByIndex(this.visibleIndex, this.getStartIndex()));\n };\n PanelModel.prototype.beforeSetVisibleIndex = function (index) {\n var visibleIndex = -1;\n if (this.showNumber && (this.isDesignMode || !this.locTitle.isEmpty)) {\n visibleIndex = index;\n }\n this.setPropertyValue(\"visibleIndex\", visibleIndex);\n this.setNo(visibleIndex);\n return visibleIndex < 0 ? 0 : 1;\n };\n PanelModel.prototype.getPanelStartIndex = function (index) {\n if (this.showQuestionNumbers == \"off\")\n return -1;\n if (this.showQuestionNumbers == \"onpanel\")\n return 0;\n return index;\n };\n PanelModel.prototype.isContinueNumbering = function () {\n return (this.showQuestionNumbers != \"off\" && this.showQuestionNumbers != \"onpanel\");\n };\n PanelModel.prototype.notifySurveyOnVisibilityChanged = function () {\n if (this.survey != null && !this.isLoadingFromJson) {\n this.survey.panelVisibilityChanged(this, this.isVisible);\n }\n };\n PanelModel.prototype.hasErrorsCore = function (rec) {\n _super.prototype.hasErrorsCore.call(this, rec);\n if (this.isCollapsed && rec.result && rec.fireCallback) {\n this.expand();\n }\n };\n PanelModel.prototype.getRenderedTitle = function (str) {\n if (!str) {\n if (this.isCollapsed || this.isExpanded)\n return this.name;\n if (this.isDesignMode)\n return \"[\" + this.name + \"]\";\n }\n return _super.prototype.getRenderedTitle.call(this, str);\n };\n Object.defineProperty(PanelModel.prototype, \"width\", {\n /**\n * The Panel width.\n */\n get: function () {\n return this.getPropertyValue(\"width\");\n },\n set: function (val) {\n this.setPropertyValue(\"width\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"indent\", {\n /**\n * The left indent. Set this property to increase the panel left indent.\n */\n get: function () {\n return this.getPropertyValue(\"indent\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"indent\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"innerIndent\", {\n /**\n * The inner indent. Set this property to increase the panel content margin.\n */\n get: function () {\n return this.getPropertyValue(\"innerIndent\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"innerIndent\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"renderWidth\", {\n get: function () {\n return this.getPropertyValue(\"renderWidth\");\n },\n set: function (val) {\n this.setPropertyValue(\"renderWidth\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"startWithNewLine\", {\n /**\n * The Panel renders on the new line if the property is true. If the property is false, the panel tries to render on the same line/row with a previous question/panel.\n */\n get: function () {\n return this.getPropertyValue(\"startWithNewLine\", true);\n },\n set: function (value) {\n this.setPropertyValue(\"startWithNewLine\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"rightIndent\", {\n /**\n * The right indent of the Panel.\n */\n get: function () {\n return this.getPropertyValue(\"rightIndent\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"rightIndent\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"paddingLeft\", {\n get: function () {\n return this.getPropertyValue(\"paddingLeft\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"paddingLeft\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"innerPaddingLeft\", {\n get: function () {\n return this.getPropertyValue(\"innerPaddingLeft\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"innerPaddingLeft\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"paddingRight\", {\n get: function () {\n return this.getPropertyValue(\"paddingRight\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"paddingRight\", val);\n },\n enumerable: false,\n configurable: true\n });\n PanelModel.prototype.onIndentChanged = function () {\n if (!this.getSurvey())\n return;\n this.innerPaddingLeft = this.getIndentSize(this.innerIndent);\n this.paddingLeft = this.getIndentSize(this.indent);\n this.paddingRight = this.getIndentSize(this.rightIndent);\n };\n PanelModel.prototype.getIndentSize = function (indent) {\n if (indent < 1)\n return \"\";\n var css = this.survey[\"css\"];\n if (!css)\n return \"\";\n return indent * css.question.indent + \"px\";\n };\n PanelModel.prototype.clearOnDeletingContainer = function () {\n this.elements.forEach(function (element) {\n if (element instanceof _question__WEBPACK_IMPORTED_MODULE_4__[\"Question\"] || element instanceof PanelModel) {\n element.clearOnDeletingContainer();\n }\n });\n };\n Object.defineProperty(PanelModel.prototype, \"hasEditButton\", {\n get: function () {\n if (this.survey && this.survey.state == \"preview\")\n return this.depth == 1;\n return false;\n },\n enumerable: false,\n configurable: true\n });\n PanelModel.prototype.cancelPreview = function () {\n if (!this.hasEditButton)\n return;\n this.survey.cancelPreviewByPage(this);\n };\n Object.defineProperty(PanelModel.prototype, \"cssTitle\", {\n get: function () {\n var result = this.cssClasses.panel.title;\n if (this.state !== \"default\") {\n result += \" \" + this.cssClasses.panel.titleExpandable;\n }\n if (this.containsErrors) {\n result += \" \" + this.cssClasses.panel.titleOnError;\n }\n return result;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PanelModel.prototype, \"cssError\", {\n get: function () {\n var rootClass = this.cssClasses.error.root;\n return rootClass ? rootClass : \"panel-error-root\";\n },\n enumerable: false,\n configurable: true\n });\n PanelModel.prototype.onVisibleChanged = function () {\n _super.prototype.onVisibleChanged.call(this);\n this.notifySurveyOnVisibilityChanged();\n };\n return PanelModel;\n}(PanelModelBase));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"panelbase\", [\n \"name\",\n {\n name: \"elements\",\n alternativeName: \"questions\",\n baseClassName: \"question\",\n visible: false,\n isLightSerializable: false,\n },\n { name: \"visible:boolean\", default: true },\n \"visibleIf:condition\",\n \"enableIf:condition\",\n \"requiredIf:condition\",\n \"readOnly:boolean\",\n {\n name: \"questionTitleLocation\",\n default: \"default\",\n choices: [\"default\", \"top\", \"bottom\", \"left\", \"hidden\"],\n },\n { name: \"title:text\", serializationProperty: \"locTitle\" },\n { name: \"description:text\", serializationProperty: \"locDescription\" },\n], function () {\n return new PanelModelBase();\n});\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"panel\", [\n {\n name: \"state\",\n default: \"default\",\n choices: [\"default\", \"collapsed\", \"expanded\"],\n },\n \"isRequired:boolean\",\n {\n name: \"requiredErrorText:text\",\n serializationProperty: \"locRequiredErrorText\",\n },\n { name: \"startWithNewLine:boolean\", default: true },\n \"width\",\n { name: \"innerIndent:number\", default: 0, choices: [0, 1, 2, 3] },\n { name: \"indent:number\", default: 0, choices: [0, 1, 2, 3] },\n {\n name: \"page\",\n isSerializable: false,\n visibleIf: function (obj) {\n var survey = obj ? obj.survey : null;\n return !survey || survey.pages.length > 1;\n },\n choices: function (obj) {\n var survey = obj ? obj.survey : null;\n return survey\n ? survey.pages.map(function (p) {\n return { value: p.name, text: p.title };\n })\n : [];\n },\n },\n \"showNumber:boolean\",\n {\n name: \"showQuestionNumbers\",\n default: \"default\",\n choices: [\"default\", \"onpanel\", \"off\"],\n },\n \"questionStartIndex\",\n], function () {\n return new PanelModel();\n}, \"panelbase\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_6__[\"ElementFactory\"].Instance.registerElement(\"panel\", function (name) {\n return new PanelModel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/popup.ts\":\n/*!**********************!*\\\n !*** ./src/popup.ts ***!\n \\**********************/\n/*! exports provided: PopupModel, PopupBaseViewModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"PopupModel\", function() { return PopupModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"PopupBaseViewModel\", function() { return PopupBaseViewModel; });\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _utils_popup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/popup */ \"./src/utils/popup.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n\n\n\n\nvar PopupModel = /** @class */ (function (_super) {\n __extends(PopupModel, _super);\n function PopupModel(contentComponentName, contentComponentData, verticalPosition, horizontalPosition, showPointer, isModal, onCancel, onApply, onHide, onShow, cssClass) {\n if (verticalPosition === void 0) { verticalPosition = \"bottom\"; }\n if (horizontalPosition === void 0) { horizontalPosition = \"left\"; }\n if (showPointer === void 0) { showPointer = true; }\n if (isModal === void 0) { isModal = false; }\n if (onCancel === void 0) { onCancel = function () { }; }\n if (onApply === void 0) { onApply = function () { return true; }; }\n if (onHide === void 0) { onHide = function () { }; }\n if (onShow === void 0) { onShow = function () { }; }\n if (cssClass === void 0) { cssClass = \"\"; }\n var _this = _super.call(this) || this;\n _this.contentComponentName = contentComponentName;\n _this.contentComponentData = contentComponentData;\n _this.verticalPosition = verticalPosition;\n _this.horizontalPosition = horizontalPosition;\n _this.showPointer = showPointer;\n _this.isModal = isModal;\n _this.onCancel = onCancel;\n _this.onApply = onApply;\n _this.onHide = onHide;\n _this.onShow = onShow;\n _this.cssClass = cssClass;\n return _this;\n }\n Object.defineProperty(PopupModel.prototype, \"isVisible\", {\n get: function () {\n return this.getPropertyValue(\"isVisible\", false);\n },\n set: function (value) {\n if (this.isVisible === value) {\n return;\n }\n this.setPropertyValue(\"isVisible\", value);\n this.onVisibilityChanged && this.onVisibilityChanged(value);\n if (this.isVisible) {\n this.onShow();\n }\n else {\n this.onHide();\n }\n },\n enumerable: false,\n configurable: true\n });\n PopupModel.prototype.toggleVisibility = function () {\n this.isVisible = !this.isVisible;\n };\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], PopupModel.prototype, \"contentComponentName\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], PopupModel.prototype, \"contentComponentData\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: \"bottom\" })\n ], PopupModel.prototype, \"verticalPosition\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: \"left\" })\n ], PopupModel.prototype, \"horizontalPosition\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: false })\n ], PopupModel.prototype, \"showPointer\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: false })\n ], PopupModel.prototype, \"isModal\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: function () { } })\n ], PopupModel.prototype, \"onCancel\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: function () { return true; } })\n ], PopupModel.prototype, \"onApply\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: function () { } })\n ], PopupModel.prototype, \"onHide\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: function () { } })\n ], PopupModel.prototype, \"onShow\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: \"\" })\n ], PopupModel.prototype, \"cssClass\", void 0);\n return PopupModel;\n}(_base__WEBPACK_IMPORTED_MODULE_0__[\"Base\"]));\n\nvar FOCUS_INPUT_SELECTOR = \"input:not(:disabled):not([readonly]):not([type=hidden]),select:not(:disabled):not([readonly]),textarea:not(:disabled):not([readonly]), button:not(:disabled):not([readonly])\";\nvar PopupBaseViewModel = /** @class */ (function (_super) {\n __extends(PopupBaseViewModel, _super);\n function PopupBaseViewModel(model, targetElement) {\n var _this = _super.call(this) || this;\n _this.model = model;\n _this.targetElement = targetElement;\n _this.model.registerFunctionOnPropertyValueChanged(\"isVisible\", function () {\n _this.isVisible = _this.model.isVisible;\n });\n return _this;\n }\n Object.defineProperty(PopupBaseViewModel.prototype, \"contentComponentName\", {\n get: function () {\n return this.model.contentComponentName;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PopupBaseViewModel.prototype, \"contentComponentData\", {\n get: function () {\n return this.model.contentComponentData;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PopupBaseViewModel.prototype, \"showPointer\", {\n get: function () {\n return this.model.showPointer;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PopupBaseViewModel.prototype, \"isModal\", {\n get: function () {\n return this.model.isModal;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PopupBaseViewModel.prototype, \"styleClass\", {\n get: function () {\n var css = this.model.cssClass;\n if (this.isModal) {\n css += \" sv-popup--modal\";\n }\n else if (this.showPointer) {\n css += \" sv-popup--show-pointer\";\n css += \" sv-popup--\" + this.popupDirection;\n }\n return css;\n },\n enumerable: false,\n configurable: true\n });\n PopupBaseViewModel.prototype.onKeyDown = function (event) {\n if (event.key === \"Tab\" || event.keyCode === 9) {\n this.trapFocus(event);\n }\n else if (event.key === \"Escape\" || event.keyCode === 27) {\n if (this.isModal) {\n this.model.onCancel();\n }\n this.model.isVisible = false;\n }\n };\n PopupBaseViewModel.prototype.trapFocus = function (event) {\n var focusableElements = this.container.querySelectorAll(FOCUS_INPUT_SELECTOR);\n var firstFocusableElement = focusableElements[0];\n var lastFocusableElement = focusableElements[focusableElements.length - 1];\n if (event.shiftKey) {\n if (document.activeElement === firstFocusableElement) {\n lastFocusableElement.focus();\n event.preventDefault();\n }\n }\n else {\n if (document.activeElement === lastFocusableElement) {\n firstFocusableElement.focus();\n event.preventDefault();\n }\n }\n };\n PopupBaseViewModel.prototype.updateOnShowing = function () {\n if (!this.isModal) {\n this.updatePosition();\n }\n this.focusFirstInput();\n };\n PopupBaseViewModel.prototype.updatePosition = function () {\n var rect = this.targetElement.getBoundingClientRect();\n var background = this.container.children[0];\n var popupContainer = background.children[0];\n var scrollContent = background.children[0].children[1];\n var height = popupContainer.offsetHeight -\n scrollContent.offsetHeight +\n scrollContent.scrollHeight;\n var width = popupContainer.offsetWidth;\n this.height = \"auto\";\n var verticalPosition = this.model.verticalPosition;\n if (!!window) {\n verticalPosition = _utils_popup__WEBPACK_IMPORTED_MODULE_3__[\"PopupUtils\"].updateVerticalPosition(rect, height, this.model.verticalPosition, this.model.showPointer, window.innerHeight);\n }\n this.popupDirection = _utils_popup__WEBPACK_IMPORTED_MODULE_3__[\"PopupUtils\"].calculatePopupDirection(verticalPosition, this.model.horizontalPosition);\n var pos = _utils_popup__WEBPACK_IMPORTED_MODULE_3__[\"PopupUtils\"].calculatePosition(rect, height, width, verticalPosition, this.model.horizontalPosition, this.showPointer);\n if (!!window) {\n var newVerticalDimensions = _utils_popup__WEBPACK_IMPORTED_MODULE_3__[\"PopupUtils\"].updateVerticalDimensions(pos.top, height, window.innerHeight);\n if (!!newVerticalDimensions) {\n this.height = newVerticalDimensions.height + \"px\";\n pos.top = newVerticalDimensions.top;\n }\n }\n this.left = pos.left + \"px\";\n this.top = pos.top + \"px\";\n if (this.showPointer) {\n this.pointerTarget = _utils_popup__WEBPACK_IMPORTED_MODULE_3__[\"PopupUtils\"].calculatePointerTarget(rect, pos.top, pos.left, verticalPosition, this.model.horizontalPosition);\n }\n this.pointerTarget.top += \"px\";\n this.pointerTarget.left += \"px\";\n };\n PopupBaseViewModel.prototype.focusFirstInput = function () {\n var _this = this;\n setTimeout(function () {\n var el = _this.container.querySelector(FOCUS_INPUT_SELECTOR);\n if (!!el)\n el.focus();\n else\n _this.container.children[0].focus();\n }, 100);\n };\n PopupBaseViewModel.prototype.clickOutside = function () {\n if (this.isModal) {\n return;\n }\n this.model.isVisible = false;\n };\n PopupBaseViewModel.prototype.cancel = function () {\n this.model.onCancel();\n this.model.isVisible = false;\n };\n PopupBaseViewModel.prototype.apply = function () {\n if (!!this.model.onApply && !this.model.onApply())\n return;\n this.model.isVisible = false;\n };\n Object.defineProperty(PopupBaseViewModel.prototype, \"cancelButtonText\", {\n get: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"modalCancelButtonText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(PopupBaseViewModel.prototype, \"applyButtonText\", {\n get: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"modalApplyButtonText\");\n },\n enumerable: false,\n configurable: true\n });\n PopupBaseViewModel.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n this.model.onVisibilityChanged = undefined;\n };\n PopupBaseViewModel.prototype.createPopupContainer = function () {\n var container = document.createElement(\"div\");\n this.container = container;\n };\n PopupBaseViewModel.prototype.mountPopupContainer = function () {\n document.body.appendChild(this.container);\n };\n PopupBaseViewModel.prototype.initializePopupContainer = function () {\n this.createPopupContainer();\n this.mountPopupContainer();\n };\n PopupBaseViewModel.prototype.destroyPopupContainer = function () {\n this.container.remove();\n this.container = undefined;\n };\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: \"0px\" })\n ], PopupBaseViewModel.prototype, \"top\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: \"0px\" })\n ], PopupBaseViewModel.prototype, \"left\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: \"auto\" })\n ], PopupBaseViewModel.prototype, \"height\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: false })\n ], PopupBaseViewModel.prototype, \"isVisible\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: \"left\" })\n ], PopupBaseViewModel.prototype, \"popupDirection\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: { left: \"0px\", top: \"0px\" } })\n ], PopupBaseViewModel.prototype, \"pointerTarget\", void 0);\n return PopupBaseViewModel;\n}(_base__WEBPACK_IMPORTED_MODULE_0__[\"Base\"]));\n\n\n\n/***/ }),\n\n/***/ \"./src/question.ts\":\n/*!*************************!*\\\n !*** ./src/question.ts ***!\n \\*************************/\n/*! exports provided: Question */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Question\", function() { return Question; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./survey-element */ \"./src/survey-element.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _validator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./validator */ \"./src/validator.ts\");\n/* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./localizablestring */ \"./src/localizablestring.ts\");\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./conditions */ \"./src/conditions.ts\");\n/* harmony import */ var _questionCustomWidgets__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./questionCustomWidgets */ \"./src/questionCustomWidgets.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\n/* harmony import */ var _rendererFactory__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./rendererFactory */ \"./src/rendererFactory.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n\n\n\n\n\n\n\n\n\n\n\n/**\n * A base class for all questions.\n */\nvar Question = /** @class */ (function (_super) {\n __extends(Question, _super);\n function Question(name) {\n var _this = _super.call(this, name) || this;\n _this.conditionRunner = null;\n _this.customWidgetData = { isNeedRender: true };\n _this.isReadyValue = true;\n /**\n * The event is fired when isReady property of question is changed.\n *
options.question - the question\n *
options.isReady - current value of isReady\n *
options.oldIsReady - old value of isReady\n */\n _this.onReadyChanged = _this.addEvent();\n _this.parentQuestionValue = null;\n _this.isRunningValidatorsValue = false;\n _this.isValueChangedInSurvey = false;\n _this.allowNotifyValueChanged = true;\n //ILocalizableOwner\n _this.locOwner = null;\n _this.id = Question.getQuestionId();\n _this.onCreating();\n _this.createNewArray(\"validators\", function (validator) {\n validator.errorOwner = _this;\n });\n var locTitleValue = _this.createLocalizableString(\"title\", _this, true);\n locTitleValue.onGetTextCallback = function (text) {\n if (!text) {\n text = _this.name;\n }\n if (!_this.survey)\n return text;\n return _this.survey.getUpdatedQuestionTitle(_this, text);\n };\n _this.locProcessedTitle = new _localizablestring__WEBPACK_IMPORTED_MODULE_6__[\"LocalizableString\"](_this, true);\n _this.locProcessedTitle.sharedData = locTitleValue;\n var locCommentText = _this.createLocalizableString(\"commentText\", _this, true);\n locCommentText.onGetTextCallback = function (text) {\n return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(\"otherItemText\");\n };\n _this.createLocalizableString(\"requiredErrorText\", _this);\n _this.registerFunctionOnPropertyValueChanged(\"width\", function () {\n _this.updateQuestionCss();\n if (!!_this.parent) {\n _this.parent.elementWidthChanged(_this);\n }\n });\n _this.registerFunctionOnPropertyValueChanged(\"isRequired\", function () {\n _this.locTitle.onChanged();\n _this.cssClassesValue = undefined;\n });\n _this.registerFunctionOnPropertiesValueChanged([\"indent\", \"rightIndent\"], function () {\n _this.onIndentChanged();\n });\n _this.registerFunctionOnPropertiesValueChanged([\"hasComment\", \"hasOther\"], function () {\n _this.initCommentFromSurvey();\n });\n return _this;\n }\n Question.getQuestionId = function () {\n return \"sq_\" + Question.questionCounter++;\n };\n Question.prototype.isReadOnlyRenderDiv = function () {\n return this.isReadOnly && _settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].readOnlyCommentRenderMode === \"div\";\n };\n Question.prototype.getSurvey = function (live) {\n if (live === void 0) { live = false; }\n if (live) {\n return !!this.parent ? this.parent.getSurvey(live) : null;\n }\n if (!!this.onGetSurvey)\n return this.onGetSurvey();\n return _super.prototype.getSurvey.call(this);\n };\n Question.prototype.getValueName = function () {\n if (!!this.valueName)\n return this.valueName.toString();\n return this.name;\n };\n Object.defineProperty(Question.prototype, \"valueName\", {\n /**\n * Use this property if you want to store the question result in the name different from the question name.\n * Question name should be unique in the survey and valueName could be not unique. It allows to share data between several questions with the same valueName.\n * The library set the value automatically if the question.name property is not valid. For example, if it contains the period '.' symbol.\n * In this case if you set the question.name property to 'x.y' then the valueName becomes 'x y'.\n * Please note, this property is hidden for questions without input, for example html question.\n * @see name\n */\n get: function () {\n return this.getPropertyValue(\"valueName\", \"\");\n },\n set: function (val) {\n var oldValueName = this.getValueName();\n this.setPropertyValue(\"valueName\", val);\n this.onValueNameChanged(oldValueName);\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.onValueNameChanged = function (oldValue) {\n if (!this.survey)\n return;\n this.survey.questionRenamed(this, this.name, !!oldValue ? oldValue : this.name);\n this.initDataFromSurvey();\n };\n Question.prototype.onNameChanged = function (oldValue) {\n this.locTitle.onChanged();\n if (!this.survey)\n return;\n this.survey.questionRenamed(this, oldValue, this.valueName ? this.valueName : oldValue);\n };\n Object.defineProperty(Question.prototype, \"isReady\", {\n get: function () {\n return this.isReadyValue;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Get is question ready to use\n */\n Question.prototype.choicesLoaded = function () { };\n Object.defineProperty(Question.prototype, \"page\", {\n /**\n * Get/set the page where the question is located.\n */\n get: function () {\n return this.getPage(this.parent);\n },\n set: function (val) {\n this.setPage(this.parent, val);\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.getPanel = function () {\n return null;\n };\n Question.prototype.delete = function () {\n if (!!this.parent) {\n this.removeSelfFromList(this.parent.elements);\n }\n };\n Object.defineProperty(Question.prototype, \"isFlowLayout\", {\n get: function () {\n return this.getLayoutType() === \"flow\";\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.getLayoutType = function () {\n if (!!this.parent)\n return this.parent.getChildrenLayoutType();\n return \"row\";\n };\n Question.prototype.isLayoutTypeSupported = function (layoutType) {\n return layoutType !== \"flow\";\n };\n Object.defineProperty(Question.prototype, \"visible\", {\n /**\n * Use it to get/set the question visibility.\n * @see visibleIf\n */\n get: function () {\n return this.getPropertyValue(\"visible\", true);\n },\n set: function (val) {\n if (val == this.visible)\n return;\n this.setPropertyValue(\"visible\", val);\n this.onVisibleChanged();\n this.notifySurveyVisibilityChanged();\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.onVisibleChanged = function () {\n this.setPropertyValue(\"isVisible\", this.isVisible);\n if (this.isVisible && this.survey && this.survey.isClearValueOnHidden) {\n this.updateValueWithDefaults();\n }\n if (!this.isVisible && this.errors && this.errors.length > 0) {\n this.errors = [];\n }\n };\n Object.defineProperty(Question.prototype, \"useDisplayValuesInTitle\", {\n /**\n * Use it to choose how other question values will be rendered in title if referenced in {}.\n * Please note, this property is hidden for question without input, for example html question.\n */\n get: function () {\n return this.getPropertyValue(\"useDisplayValuesInTitle\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"useDisplayValuesInTitle\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"visibleIf\", {\n /**\n * An expression that returns true or false. If it returns true the Question becomes visible and if it returns false the Question becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used.\n * @see visible\n */\n get: function () {\n return this.getPropertyValue(\"visibleIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"visibleIf\", val);\n this.runConditions();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"isVisible\", {\n /**\n * Returns true if the question is visible or survey is in design mode right now.\n */\n get: function () {\n if (this.survey && this.survey.areEmptyElementsHidden && this.isEmpty())\n return false;\n return this.visible || this.areInvisibleElementsShowing;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"visibleIndex\", {\n /**\n * Returns the visible index of the question in the survey. It can be from 0 to all visible questions count - 1\n * The visibleIndex is -1 if the title is 'hidden' or hideNumber is true\n * @see titleLocation\n * @see hideNumber\n */\n get: function () {\n return this.getPropertyValue(\"visibleIndex\", -1);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"hideNumber\", {\n /**\n * Set hideNumber to true to stop showing the number for this question. The question will not be counter\n * @see visibleIndex\n * @see titleLocation\n */\n get: function () {\n return this.getPropertyValue(\"hideNumber\");\n },\n set: function (val) {\n this.setPropertyValue(\"hideNumber\", val);\n this.notifySurveyVisibilityChanged();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"isAllowTitleLeft\", {\n /**\n * Returns true if the question may have a title located on the left\n */\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Returns the type of the object as a string as it represents in the json.\n */\n Question.prototype.getType = function () {\n return \"question\";\n };\n Object.defineProperty(Question.prototype, \"isQuestion\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Move question to a new container Page/Panel. Add as a last element if insertBefore parameter is not used or inserted into the given index,\n * if insert parameter is number, or before the given element, if the insertBefore parameter is a question or panel\n * @param container Page or Panel to where a question is relocated.\n * @param insertBefore Use it if you want to set the question to a specific position. You may use a number (use 0 to insert int the beginning) or element, if you want to insert before this element.\n */\n Question.prototype.moveTo = function (container, insertBefore) {\n if (insertBefore === void 0) { insertBefore = null; }\n return this.moveToBase(this.parent, container, insertBefore);\n };\n Question.prototype.getProgressInfo = function () {\n if (!this.hasInput)\n return _super.prototype.getProgressInfo.call(this);\n return {\n questionCount: 1,\n answeredQuestionCount: !this.isEmpty() ? 1 : 0,\n requiredQuestionCount: this.isRequired ? 1 : 0,\n requiredAnsweredQuestionCount: !this.isEmpty() && this.isRequired ? 1 : 0,\n };\n };\n Question.prototype.runConditions = function () {\n if (this.data && !this.isLoadingFromJson) {\n if (!this.isDesignMode) {\n this.runCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());\n }\n this.locStrsChanged();\n }\n };\n Question.prototype.setSurveyImpl = function (value) {\n _super.prototype.setSurveyImpl.call(this, value);\n if (this.survey) {\n this.survey.questionCreated(this);\n }\n if (this.survey && this.survey.isDesignMode && !this.isDesignMode) {\n this.onVisibleChanged();\n }\n this.runConditions();\n };\n Question.prototype.getDataFilteredValues = function () {\n return !!this.data ? this.data.getFilteredValues() : null;\n };\n Question.prototype.getDataFilteredProperties = function () {\n var props = !!this.data ? this.data.getFilteredProperties() : {};\n props.question = this;\n return props;\n };\n Object.defineProperty(Question.prototype, \"parent\", {\n /**\n * A parent element. It can be panel or page.\n */\n get: function () {\n return this.getPropertyValue(\"parent\", null);\n },\n set: function (val) {\n if (this.parent === val)\n return;\n this.delete();\n this.setPropertyValue(\"parent\", val);\n this.updateQuestionCss();\n this.onParentChanged();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"parentQuestion\", {\n /**\n * A parent question. It can be a dynamic panel or dynamic/dropdown matrices. If the value is a matrix, it means that question is a cell question.\n * This property is null for a stand alone question.\n */\n get: function () {\n return this.parentQuestionValue;\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.setParentQuestion = function (val) {\n this.parentQuestionValue = val;\n this.onParentQuestionChanged();\n };\n Question.prototype.onParentQuestionChanged = function () { };\n Question.prototype.onParentChanged = function () { };\n Object.defineProperty(Question.prototype, \"hasTitle\", {\n /**\n * Returns false if the question doesn't have a title property, for example: QuestionHtmlModel, or titleLocation property equals to \"hidden\"\n * @see titleLocation\n */\n get: function () {\n return this.getTitleLocation() !== \"hidden\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"titleLocation\", {\n /**\n * Set this property different from \"default\" to set the specific question title location for this panel/page.\n * Please note, this property is hidden for questions without input, for example html question.\n * @see SurveyModel.questionTitleLocation\n */\n get: function () {\n return this.getPropertyValue(\"titleLocation\");\n },\n set: function (value) {\n var isVisibilityChanged = this.titleLocation == \"hidden\" || value == \"hidden\";\n this.setPropertyValue(\"titleLocation\", value.toLowerCase());\n this.updateQuestionCss();\n if (isVisibilityChanged) {\n this.notifySurveyVisibilityChanged();\n }\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.notifySurveyVisibilityChanged = function () {\n if (!this.survey || this.isLoadingFromJson)\n return;\n this.survey.questionVisibilityChanged(this, this.isVisible);\n if (this.survey.isClearValueOnHidden && !this.visible) {\n this.clearValue();\n }\n };\n /**\n * Return the title location based on question titleLocation property and QuestionTitleLocation of it's parents\n * @see titleLocation\n * @see PanelModelBase.QuestionTitleLocation\n * @see SurveyModel.QuestionTitleLocation\n */\n Question.prototype.getTitleLocation = function () {\n if (this.isFlowLayout)\n return \"hidden\";\n var location = this.getTitleLocationCore();\n if (location === \"left\" && !this.isAllowTitleLeft)\n location = \"top\";\n return location;\n };\n Question.prototype.getTitleLocationCore = function () {\n if (this.titleLocation !== \"default\")\n return this.titleLocation;\n if (!!this.parent)\n return this.parent.getQuestionTitleLocation();\n if (!!this.survey)\n return this.survey.questionTitleLocation;\n return \"top\";\n };\n Object.defineProperty(Question.prototype, \"hasTitleOnLeft\", {\n get: function () {\n return this.hasTitle && this.getTitleLocation() === \"left\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"hasTitleOnTop\", {\n get: function () {\n return this.hasTitle && this.getTitleLocation() === \"top\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"hasTitleOnBottom\", {\n get: function () {\n return this.hasTitle && this.getTitleLocation() === \"bottom\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"hasTitleOnLeftTop\", {\n get: function () {\n if (!this.hasTitle)\n return false;\n var location = this.getTitleLocation();\n return location === \"left\" || location === \"top\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"errorLocation\", {\n get: function () {\n return this.survey ? this.survey.questionErrorLocation : \"top\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"hasInput\", {\n /**\n * Returns false if the question doesn't have an input element, for example: QuestionHtmlModel\n * @see hasSingleInput\n */\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"hasSingleInput\", {\n /**\n * Returns false if the question doesn't have an input element or have multiple inputs: matrices or panel dynamic\n * @see hasInput\n */\n get: function () {\n return this.hasInput;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"inputId\", {\n get: function () {\n return this.id + \"i\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"title\", {\n /**\n * Question title. Use survey questionTitleTemplate property to change the title question is rendered. If it is empty, then question name property is used.\n * @see SurveyModel.questionTitleTemplate\n */\n get: function () {\n return this.getLocalizableStringText(\"title\", this.name);\n },\n set: function (val) {\n this.setLocalizableStringText(\"title\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"locTitle\", {\n get: function () {\n return this.getLocalizableString(\"title\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"descriptionLocation\", {\n /**\n * Question description location. By default, value is \"default\" and it depends on survey questionDescriptionLocation property\n * You may change it to \"underInput\" to render it under question input or \"underTitle\" to rendered it under title.\n * @see description\n * @see Survey.questionDescriptionLocation\n */\n get: function () {\n return this.getPropertyValue(\"descriptionLocation\");\n },\n set: function (val) {\n this.setPropertyValue(\"descriptionLocation\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"hasDescriptionUnderTitle\", {\n get: function () {\n return this.getDescriptionLocation() == \"underTitle\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"hasDescriptionUnderInput\", {\n get: function () {\n return this.getDescriptionLocation() == \"underInput\";\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.getDescriptionLocation = function () {\n if (this.descriptionLocation !== \"default\")\n return this.descriptionLocation;\n return !!this.survey\n ? this.survey.questionDescriptionLocation\n : \"underTitle\";\n };\n Object.defineProperty(Question.prototype, \"clickTitleFunction\", {\n get: function () {\n if (this.hasInput) {\n var self = this;\n return function () {\n if (self.isCollapsed)\n return;\n setTimeout(function () {\n self.focus();\n }, 1);\n return true;\n };\n }\n return undefined;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"requiredErrorText\", {\n /**\n * The custom text that will be shown on required error. Use this property, if you do not want to show the default text.\n * Please note, this property is hidden for question without input, for example html question.\n */\n get: function () {\n return this.getLocalizableStringText(\"requiredErrorText\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"requiredErrorText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"locRequiredErrorText\", {\n get: function () {\n return this.getLocalizableString(\"requiredErrorText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"commentText\", {\n /**\n * Use it to get or set the comment value.\n */\n get: function () {\n return this.getLocalizableStringText(\"commentText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(\"otherItemText\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"commentText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"locCommentText\", {\n get: function () {\n return this.getLocalizableString(\"commentText\");\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Returns a copy of question errors survey. For some questions like matrix and panel dynamic it includes the errors of nested questions.\n */\n Question.prototype.getAllErrors = function () {\n return this.errors.slice();\n };\n Question.prototype.getErrorByType = function (errorType) {\n for (var i = 0; i < this.errors.length; i++) {\n if (this.errors[i].getErrorType() === errorType)\n return this.errors[i];\n }\n return null;\n };\n Object.defineProperty(Question.prototype, \"customWidget\", {\n /**\n * The link to the custom widget.\n */\n get: function () {\n if (!this.isCustomWidgetRequested && !this.customWidgetValue) {\n this.isCustomWidgetRequested = true;\n this.updateCustomWidget();\n }\n return this.customWidgetValue;\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.updateCustomWidget = function () {\n this.customWidgetValue = _questionCustomWidgets__WEBPACK_IMPORTED_MODULE_8__[\"CustomWidgetCollection\"].Instance.getCustomWidget(this);\n };\n Object.defineProperty(Question.prototype, \"isCompositeQuestion\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.afterRenderQuestionElement = function (el) {\n if (!this.survey || !this.hasSingleInput)\n return;\n this.survey.afterRenderQuestionInput(this, el);\n };\n Question.prototype.afterRender = function (el) {\n if (!this.survey)\n return;\n this.survey.afterRenderQuestion(this, el);\n if (!!this.afterRenderQuestionCallback) {\n this.afterRenderQuestionCallback(this, el);\n }\n };\n Question.prototype.beforeDestroyQuestionElement = function (el) { };\n Object.defineProperty(Question.prototype, \"processedTitle\", {\n /**\n * Returns the rendred question title.\n */\n get: function () {\n var res = this.locProcessedTitle.textOrHtml;\n return res ? res : this.name;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"fullTitle\", {\n /**\n * Returns the title after processing the question template.\n * @see SurveyModel.questionTitleTemplate\n */\n get: function () {\n return this.locTitle.renderedHtml;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"titlePattern\", {\n get: function () {\n return !!this.survey ? this.survey.questionTitlePattern : \"numTitleRequire\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"isRequireTextOnStart\", {\n get: function () {\n return this.isRequired && this.titlePattern == \"requireNumTitle\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"isRequireTextBeforeTitle\", {\n get: function () {\n return this.isRequired && this.titlePattern == \"numRequireTitle\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"isRequireTextAfterTitle\", {\n get: function () {\n return this.isRequired && this.titlePattern == \"numTitleRequire\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"startWithNewLine\", {\n /**\n * The Question renders on the new line if the property is true. If the property is false, the question tries to render on the same line/row with a previous question/panel.\n */\n get: function () {\n return this.getPropertyValue(\"startWithNewLine\", true);\n },\n set: function (val) {\n if (this.startWithNewLine == val)\n return;\n this.setPropertyValue(\"startWithNewLine\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"cssClasses\", {\n /**\n * Returns all css classes that used for rendering the question. You may use survey.updateQuestionCssClasses event to override css classes for a question.\n * @see SurveyModel.updateQuestionCssClasses\n */\n get: function () {\n if (!this.survey)\n return this.calcCssClasses();\n if (!this.cssClassesValue) {\n this.cssClassesValue = this.calcCssClasses();\n this.updateElementCssCore(this.cssClassesValue);\n }\n return this.cssClassesValue;\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.calcCssClasses = function () {\n var css = this.css;\n var classes = { error: {} };\n this.copyCssClasses(classes, css.question);\n this.copyCssClasses(classes.error, css.error);\n this.updateCssClasses(classes, css);\n if (this.survey) {\n this.survey.updateQuestionCssClasses(this, classes);\n }\n return classes;\n };\n Object.defineProperty(Question.prototype, \"cssRoot\", {\n get: function () {\n this.ensureElementCss();\n return this.getPropertyValue(\"cssRoot\", \"\");\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.setCssRoot = function (val) {\n this.setPropertyValue(\"cssRoot\", val);\n };\n Question.prototype.getCssRoot = function (cssClasses) {\n var res = this.isFlowLayout && !this.isDesignMode\n ? cssClasses.flowRoot\n : cssClasses.mainRoot;\n if (!res)\n res = \"\";\n if (!this.isFlowLayout &&\n this.hasTitleOnLeft &&\n !!cssClasses.titleLeftRoot) {\n res += \" \" + cssClasses.titleLeftRoot;\n }\n if (this.errors.length > 0 && !!cssClasses.hasError) {\n res += \" \" + cssClasses.hasError;\n }\n if (cssClasses.small && !this.width) {\n res += \" \" + cssClasses.small;\n }\n return res;\n };\n Object.defineProperty(Question.prototype, \"cssHeader\", {\n get: function () {\n this.ensureElementCss();\n return this.getPropertyValue(\"cssHeader\", \"\");\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.setCssHeader = function (val) {\n this.setPropertyValue(\"cssHeader\", val);\n };\n Question.prototype.getCssHeader = function (cssClasses) {\n var res = cssClasses.header || \"\";\n if (this.hasTitleOnTop && !!cssClasses.headerTop) {\n res += \" \" + cssClasses.headerTop;\n }\n if (this.hasTitleOnLeft && !!cssClasses.headerLeft) {\n res += \" \" + cssClasses.headerLeft;\n }\n if (this.hasTitleOnBottom && !!cssClasses.headerBottom) {\n res += \" \" + cssClasses.headerBottom;\n }\n return res;\n };\n Object.defineProperty(Question.prototype, \"cssContent\", {\n get: function () {\n this.ensureElementCss();\n return this.getPropertyValue(\"cssContent\", \"\");\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.setCssContent = function (val) {\n this.setPropertyValue(\"cssContent\", val);\n };\n Question.prototype.getCssContent = function (cssClasses) {\n var res = cssClasses.content || \"\";\n if (this.hasTitleOnLeft && !!cssClasses.contentLeft) {\n res += \" \" + cssClasses.contentLeft;\n }\n return res;\n };\n Object.defineProperty(Question.prototype, \"cssTitle\", {\n get: function () {\n this.ensureElementCss();\n return this.getPropertyValue(\"cssTitle\", \"\");\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.setCssTitle = function (val) {\n this.setPropertyValue(\"cssTitle\", val);\n };\n Question.prototype.getCssTitle = function (cssClasses) {\n var result = cssClasses.title;\n if (this.isCollapsed || this.isExpanded) {\n result += \" \" + cssClasses.titleExpandable;\n }\n if (this.containsErrors) {\n if (!!cssClasses.titleOnError) {\n result += \" \" + cssClasses.titleOnError;\n }\n }\n else if (this.isAnswered && !!cssClasses.titleOnAnswer) {\n result += \" \" + cssClasses.titleOnAnswer;\n }\n return result;\n };\n Object.defineProperty(Question.prototype, \"cssError\", {\n get: function () {\n this.ensureElementCss();\n return this.getPropertyValue(\"cssError\", \"\");\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.setCssError = function (val) {\n this.setPropertyValue(\"cssError\", val);\n };\n //TODO was not removed from other places\n Question.prototype.getCssError = function (cssClasses) {\n var res = cssClasses.error.root || \"\";\n if (this.errorLocation == \"top\") {\n if (!!cssClasses.error.locationTop) {\n res += \" \" + cssClasses.error.locationTop;\n }\n }\n else if (this.errorLocation === \"bottom\" &&\n !!cssClasses.error.locationBottom) {\n res += \" \" + cssClasses.error.locationBottom;\n }\n return res;\n };\n Question.prototype.updateElementCss = function (reNew) {\n this.cssClassesValue = undefined;\n if (reNew) {\n this.updateQuestionCss(true);\n }\n };\n Question.prototype.updateQuestionCss = function (reNew) {\n if (this.isLoadingFromJson ||\n !this.survey ||\n (reNew !== true && !this.cssClassesValue))\n return;\n if (!this.cssClassesValue) {\n this.cssClassesValue = this.calcCssClasses();\n }\n this.updateElementCssCore(this.cssClasses);\n };\n Question.prototype.ensureElementCss = function () {\n if (!this.cssClassesValue) {\n this.updateQuestionCss(true);\n }\n };\n Question.prototype.updateElementCssCore = function (cssClasses) {\n this.setCssRoot(this.getCssRoot(cssClasses));\n this.setCssHeader(this.getCssHeader(cssClasses));\n this.setCssContent(this.getCssContent(cssClasses));\n this.setCssTitle(this.getCssTitle(cssClasses));\n this.setCssError(this.getCssError(cssClasses));\n };\n Question.prototype.updateCssClasses = function (res, css) {\n if (!css.question)\n return;\n if (this.isRequired) {\n if (!!css.question.required) {\n res.root = (res.root ? res.root + \" \" : \"\") + objCss;\n }\n if (css.question.titleRequired) {\n res.title += \" \" + css.question.titleRequired;\n }\n }\n var objCss = css[this.getCssType()];\n if (objCss === undefined || objCss === null)\n return;\n if (typeof objCss === \"string\" || objCss instanceof String) {\n res.root = (res.root ? res.root + \" \" : \"\") + objCss;\n }\n else {\n for (var key in objCss) {\n res[key] = objCss[key];\n }\n }\n };\n Question.prototype.getCssType = function () {\n return this.getType();\n };\n Object.defineProperty(Question.prototype, \"css\", {\n get: function () {\n return !!this.survey ? this.survey.getCss() : {};\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"width\", {\n /**\n * Use it to set the specific width to the question like css style (%, px, em etc).\n */\n get: function () {\n return this.getPropertyValue(\"width\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"width\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"minWidth\", {\n /**\n * Use it to set the specific minWidth constraint to the question like css style (%, px, em etc).\n */\n get: function () {\n return this.getPropertyValue(\"minWidth\", _settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].minWidth);\n },\n set: function (val) {\n this.setPropertyValue(\"minWidth\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"maxWidth\", {\n /**\n * Use it to set the specific maxWidth constraint to the question like css style (%, px, em etc).\n */\n get: function () {\n return this.getPropertyValue(\"maxWidth\", _settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].maxWidth);\n },\n set: function (val) {\n this.setPropertyValue(\"maxWidth\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"renderWidth\", {\n /**\n * The rendered width of the question.\n */\n get: function () {\n return this.getPropertyValue(\"renderWidth\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"renderWidth\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"indent\", {\n /**\n * Set it different from 0 to increase the left padding.\n */\n get: function () {\n return this.getPropertyValue(\"indent\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"indent\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"rightIndent\", {\n /**\n * Set it different from 0 to increase the right padding.\n */\n get: function () {\n return this.getPropertyValue(\"rightIndent\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"rightIndent\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"paddingLeft\", {\n get: function () {\n return this.getPropertyValue(\"paddintLeft\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"paddintLeft\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"paddingRight\", {\n get: function () {\n return this.getPropertyValue(\"paddingRight\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"paddingRight\", val);\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.onIndentChanged = function () {\n this.paddingLeft = this.getIndentSize(this.indent);\n this.paddingRight = this.getIndentSize(this.rightIndent);\n };\n Question.prototype.getIndentSize = function (indent) {\n if (indent < 1 || !this.getSurvey() || !this.cssClasses)\n return \"\";\n return indent * this.cssClasses.indent + \"px\";\n };\n /**\n * Move the focus to the input of this question.\n * @param onError set this parameter to true, to focus the input with the first error, other wise the first input will be focused.\n */\n Question.prototype.focus = function (onError) {\n if (onError === void 0) { onError = false; }\n if (this.isDesignMode)\n return;\n if (!!this.survey) {\n this.survey.scrollElementToTop(this, this, null, this.id);\n }\n var id = !onError\n ? this.getFirstInputElementId()\n : this.getFirstErrorInputElementId();\n if (_survey_element__WEBPACK_IMPORTED_MODULE_2__[\"SurveyElement\"].FocusElement(id)) {\n this.fireCallback(this.focusCallback);\n }\n };\n Question.prototype.fireCallback = function (callback) {\n if (callback)\n callback();\n };\n Question.prototype.getOthersMaxLength = function () {\n if (!this.survey)\n return null;\n return this.survey.maxOthersLength > 0 ? this.survey.maxOthersLength : null;\n };\n Question.prototype.onCreating = function () { };\n Question.prototype.getFirstInputElementId = function () {\n return this.inputId;\n };\n Question.prototype.getFirstErrorInputElementId = function () {\n return this.getFirstInputElementId();\n };\n Question.prototype.getProcessedTextValue = function (textValue) {\n var name = textValue.name.toLocaleLowerCase();\n textValue.isExists =\n Object.keys(Question.TextPreprocessorValuesMap).indexOf(name) !== -1 ||\n this[textValue.name] !== undefined;\n textValue.value = this[Question.TextPreprocessorValuesMap[name] || textValue.name];\n };\n Question.prototype.supportComment = function () {\n return false;\n };\n Question.prototype.supportOther = function () {\n return false;\n };\n Object.defineProperty(Question.prototype, \"isRequired\", {\n /**\n * Set this property to true, to make the question a required. If a user doesn't answer the question then a validation error will be generated.\n * Please note, this property is hidden for question without input, for example html question.\n */\n get: function () {\n return this.getPropertyValue(\"isRequired\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"isRequired\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"requiredIf\", {\n /**\n * An expression that returns true or false. If it returns true the Question becomes required and an end-user has to answer it.\n * If it returns false the Question then an end-user may not answer it the Question maybe empty.\n * The library runs the expression on survey start and on changing a question value. If the property is empty then isRequired property is used.\n * Please note, this property is hidden for question without input, for example html question.\n * @see isRequired\n */\n get: function () {\n return this.getPropertyValue(\"requiredIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"requiredIf\", val);\n this.runConditions();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"hasComment\", {\n /**\n * Set it to true, to add a comment for the question.\n */\n get: function () {\n return this.getPropertyValue(\"hasComment\", false);\n },\n set: function (val) {\n if (!this.supportComment())\n return;\n this.setPropertyValue(\"hasComment\", val);\n if (this.hasComment)\n this.hasOther = false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"id\", {\n /**\n * The unique identificator. It is generated automatically.\n */\n get: function () {\n return this.getPropertyValue(\"id\");\n },\n set: function (val) {\n this.setPropertyValue(\"id\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"ariaTitleId\", {\n get: function () {\n return this.id + \"_ariaTitle\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"ariaRole\", {\n get: function () {\n return null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"hasOther\", {\n get: function () {\n return this.getPropertyValue(\"hasOther\", false);\n },\n set: function (val) {\n if (!this.supportOther() || this.hasOther == val)\n return;\n this.setPropertyValue(\"hasOther\", val);\n if (this.hasOther)\n this.hasComment = false;\n this.hasOtherChanged();\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.hasOtherChanged = function () { };\n Object.defineProperty(Question.prototype, \"requireUpdateCommentValue\", {\n get: function () {\n return this.hasComment || this.hasOther;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"isReadOnly\", {\n /**\n * Returns true if readOnly property is true or survey is in display mode or parent panel/page is readOnly.\n * @see SurveyModel.model\n * @see readOnly\n */\n get: function () {\n var isParentReadOnly = !!this.parent && this.parent.isReadOnly;\n var isSurveyReadOnly = !!this.survey && this.survey.isDisplayMode;\n return this.readOnly || isParentReadOnly || isSurveyReadOnly;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"isInputReadOnly\", {\n get: function () {\n var isDesignModeV2 = _settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].supportCreatorV2 && this.isDesignMode;\n return this.isReadOnly || isDesignModeV2;\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.onReadOnlyChanged = function () {\n this.setPropertyValue(\"isInputReadOnly\", this.isInputReadOnly);\n _super.prototype.onReadOnlyChanged.call(this);\n };\n Object.defineProperty(Question.prototype, \"enableIf\", {\n /**\n * An expression that returns true or false. If it returns false the Question becomes read only and an end-user will not able to answer on the qustion. The library runs the expression on survey start and on changing a question value. If the property is empty then readOnly property is used.\n * Please note, this property is hidden for question without input, for example html question.\n * @see readOnly\n * @see isReadOnly\n */\n get: function () {\n return this.getPropertyValue(\"enableIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"enableIf\", val);\n this.runConditions();\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Run visibleIf and enableIf expressions. If visibleIf or/and enabledIf are not empty, then the results of performing the expression (true or false) set to the visible/readOnly properties.\n * @param values Typically survey results\n * @see visible\n * @see visibleIf\n * @see readOnly\n * @see enableIf\n */\n Question.prototype.runCondition = function (values, properties) {\n if (this.isDesignMode)\n return;\n if (!properties)\n properties = {};\n properties[\"question\"] = this;\n if (!this.areInvisibleElementsShowing) {\n this.runVisibleIfCondition(values, properties);\n }\n this.runEnableIfCondition(values, properties);\n this.runRequiredIfCondition(values, properties);\n };\n Question.prototype.runVisibleIfCondition = function (values, properties) {\n var _this = this;\n if (!this.visibleIf)\n return;\n if (!this.conditionRunner)\n this.conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_7__[\"ConditionRunner\"](this.visibleIf);\n this.conditionRunner.expression = this.visibleIf;\n this.conditionRunner.onRunComplete = function (res) {\n _this.visible = res;\n };\n this.conditionRunner.run(values, properties);\n };\n Question.prototype.runEnableIfCondition = function (values, properties) {\n var _this = this;\n if (!this.enableIf)\n return;\n if (!this.conditionEnabelRunner)\n this.conditionEnabelRunner = new _conditions__WEBPACK_IMPORTED_MODULE_7__[\"ConditionRunner\"](this.enableIf);\n this.conditionEnabelRunner.expression = this.enableIf;\n this.conditionEnabelRunner.onRunComplete = function (res) {\n _this.readOnly = !res;\n };\n this.conditionEnabelRunner.run(values, properties);\n };\n Question.prototype.runRequiredIfCondition = function (values, properties) {\n var _this = this;\n if (!this.requiredIf)\n return;\n if (!this.conditionRequiredRunner)\n this.conditionRequiredRunner = new _conditions__WEBPACK_IMPORTED_MODULE_7__[\"ConditionRunner\"](this.requiredIf);\n this.conditionRequiredRunner.expression = this.requiredIf;\n this.conditionRequiredRunner.onRunComplete = function (res) {\n _this.isRequired = res;\n };\n this.conditionRequiredRunner.run(values, properties);\n };\n Object.defineProperty(Question.prototype, \"no\", {\n /**\n * The property returns the question number. If question is invisible then it returns empty string.\n * If visibleIndex is 1, then no is 2, or 'B' if survey.questionStartIndex is 'A'.\n * @see SurveyModel.questionStartIndex\n */\n get: function () {\n return this.getPropertyValue(\"no\");\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.calcNo = function () {\n if (!this.hasTitle || this.hideNumber)\n return \"\";\n var no = _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].getNumberByIndex(this.visibleIndex, this.getStartIndex());\n if (!!this.survey) {\n no = this.survey.getUpdatedQuestionNo(this, no);\n }\n return no;\n };\n Question.prototype.getStartIndex = function () {\n if (!!this.parent)\n return this.parent.getQuestionStartIndex();\n if (!!this.survey)\n return this.survey.questionStartIndex;\n return \"\";\n };\n Question.prototype.onSurveyLoad = function () {\n this.fireCallback(this.surveyLoadCallback);\n this.updateValueWithDefaults();\n };\n Question.prototype.onSetData = function () {\n _super.prototype.onSetData.call(this);\n if (!this.survey)\n return;\n this.initDataFromSurvey();\n this.onSurveyValueChanged(this.value);\n this.updateValueWithDefaults();\n this.onIndentChanged();\n this.updateQuestionCss();\n };\n Question.prototype.initDataFromSurvey = function () {\n if (!!this.data) {\n this.updateValueFromSurvey(this.data.getValue(this.getValueName()));\n this.initCommentFromSurvey();\n }\n };\n Question.prototype.initCommentFromSurvey = function () {\n if (!!this.data && this.requireUpdateCommentValue) {\n this.updateCommentFromSurvey(this.data.getComment(this.getValueName()));\n }\n else {\n this.updateCommentFromSurvey(\"\");\n }\n };\n Question.prototype.runExpression = function (expression) {\n if (!this.survey || !expression)\n return undefined;\n return this.survey.runExpression(expression);\n };\n Object.defineProperty(Question.prototype, \"questionValue\", {\n get: function () {\n return this.getPropertyValue(\"value\");\n },\n set: function (val) {\n this.setPropertyValue(\"value\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"questionComment\", {\n get: function () {\n return this.getPropertyValue(\"comment\");\n },\n set: function (val) {\n this.setPropertyValue(\"comment\", val);\n this.fireCallback(this.commentChangedCallback);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"value\", {\n /**\n * Get/Set the question value.\n * @see SurveyMode.setValue\n * @see SurveyMode.getValue\n */\n get: function () {\n return this.getValueCore();\n },\n set: function (newValue) {\n this.setNewValue(newValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"valueForSurvey\", {\n get: function () {\n if (!!this.valueToDataCallback) {\n return this.valueToDataCallback(this.value);\n }\n return this.value;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Clear the question value. It clears the question comment as well.\n */\n Question.prototype.clearValue = function () {\n if (this.value !== undefined) {\n this.value = undefined;\n }\n this.comment = undefined;\n };\n Question.prototype.unbindValue = function () {\n this.clearValue();\n };\n Question.prototype.createValueCopy = function () {\n return this.getUnbindValue(this.value);\n };\n Question.prototype.getUnbindValue = function (value) {\n if (this.isValueSurveyElement(value))\n return value;\n return _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].getUnbindValue(value);\n };\n Question.prototype.isValueSurveyElement = function (val) {\n if (!val)\n return false;\n if (Array.isArray(val))\n return val.length > 0 ? this.isValueSurveyElement(val[0]) : false;\n return !!val.getType && !!val.onPropertyChanged;\n };\n Question.prototype.canClearValueAsInvisible = function () {\n if (this.isVisible && this.isParentVisible)\n return false;\n if (!!this.page && this.page.isStarted)\n return false;\n if (!this.survey || !this.valueName)\n return true;\n return !this.survey.hasVisibleQuestionByValueName(this.valueName);\n };\n Object.defineProperty(Question.prototype, \"isParentVisible\", {\n get: function () {\n var parent = this.parent;\n while (parent) {\n if (!parent.isVisible)\n return false;\n parent = parent.parent;\n }\n return true;\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.clearValueIfInvisible = function () {\n if (this.canClearValueAsInvisible()) {\n this.clearValue();\n }\n };\n Object.defineProperty(Question.prototype, \"displayValue\", {\n get: function () {\n if (this.isLoadingFromJson)\n return \"\";\n return this.getDisplayValue(true);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Return the question value as a display text. For example, for dropdown, it would return the item text instead of item value.\n * @param keysAsText Set this value to true, to return key (in matrices questions) as display text as well.\n * @param value use this parameter, if you want to get display value for this value and not question.value. It is undefined by default.\n */\n Question.prototype.getDisplayValue = function (keysAsText, value) {\n if (value === void 0) { value = undefined; }\n var res = this.calcDisplayValue(keysAsText, value);\n return !!this.displayValueCallback ? this.displayValueCallback(res) : res;\n };\n Question.prototype.calcDisplayValue = function (keysAsText, value) {\n if (value === void 0) { value = undefined; }\n if (this.customWidget) {\n var res = this.customWidget.getDisplayValue(this, value);\n if (res)\n return res;\n }\n value = value == undefined ? this.createValueCopy() : value;\n if (this.isValueEmpty(value))\n return this.getDisplayValueEmpty();\n return this.getDisplayValueCore(keysAsText, value);\n };\n Question.prototype.getDisplayValueCore = function (keyAsText, value) {\n return value;\n };\n Question.prototype.getDisplayValueEmpty = function () {\n return \"\";\n };\n Object.defineProperty(Question.prototype, \"defaultValue\", {\n /**\n * Set the default value to the question. It will be assign to the question on loading the survey from JSON or adding a question to the survey or on setting this property of the value is empty.\n * Please note, this property is hidden for question without input, for example html question.\n */\n get: function () {\n return this.getPropertyValue(\"defaultValue\");\n },\n set: function (val) {\n if (this.isValueExpression(val)) {\n this.defaultValueExpression = val.substr(1);\n return;\n }\n this.setPropertyValue(\"defaultValue\", this.convertDefaultValue(val));\n this.updateValueWithDefaults();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"defaultValueExpression\", {\n get: function () {\n return this.getPropertyValue(\"defaultValueExpression\");\n },\n set: function (val) {\n this.setPropertyValue(\"defaultValueExpression\", val);\n this.updateValueWithDefaults();\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Returns question answer data as a plain object: with question title, name, value and displayValue.\n * For complex questions (like matrix, etc.) isNode flag is set to true and data contains array of nested objects (rows)\n * set options.includeEmpty to false if you want to skip empty answers\n */\n Question.prototype.getPlainData = function (options) {\n var _this = this;\n if (options === void 0) { options = {\n includeEmpty: true,\n includeQuestionTypes: false,\n }; }\n if (options.includeEmpty || !this.isEmpty()) {\n var questionPlainData = {\n name: this.name,\n title: this.locTitle.renderedHtml,\n value: this.value,\n displayValue: this.displayValue,\n isNode: false,\n getString: function (val) {\n return typeof val === \"object\" ? JSON.stringify(val) : val;\n },\n };\n if (options.includeQuestionTypes === true) {\n questionPlainData.questionType = this.getType();\n }\n (options.calculations || []).forEach(function (calculation) {\n questionPlainData[calculation.propertyName] = _this[calculation.propertyName];\n });\n if (this.hasComment) {\n questionPlainData.isNode = true;\n questionPlainData.data = [\n {\n name: 0,\n isComment: true,\n title: \"Comment\",\n value: _settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].commentPrefix,\n displayValue: this.comment,\n getString: function (val) {\n return typeof val === \"object\" ? JSON.stringify(val) : val;\n },\n isNode: false,\n },\n ];\n }\n return questionPlainData;\n }\n return undefined;\n };\n Object.defineProperty(Question.prototype, \"correctAnswer\", {\n /**\n * The correct answer on the question. Set this value if you are doing a quiz.\n * Please note, this property is hidden for question without input, for example html question.\n * @see SurveyModel.correctAnswers\n * @see SurveyModel.inCorrectAnswers\n */\n get: function () {\n return this.getPropertyValue(\"correctAnswer\");\n },\n set: function (val) {\n this.setPropertyValue(\"correctAnswer\", this.convertDefaultValue(val));\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.convertDefaultValue = function (val) {\n return val;\n };\n Object.defineProperty(Question.prototype, \"quizQuestionCount\", {\n /**\n * Returns questions count: 1 for the non-matrix questions and all inner visible questions that has input(s) widgets for question of matrix types.\n * @see getQuizQuestions\n */\n get: function () {\n if (this.isVisible &&\n this.hasInput &&\n !this.isValueEmpty(this.correctAnswer))\n return this.getQuizQuestionCount();\n return 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"correctAnswerCount\", {\n get: function () {\n if (!this.isEmpty() && !this.isValueEmpty(this.correctAnswer))\n return this.getCorrectAnswerCount();\n return 0;\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.getQuizQuestionCount = function () {\n return 1;\n };\n Question.prototype.getCorrectAnswerCount = function () {\n return this.isTwoValueEquals(this.value, this.correctAnswer, true, true)\n ? 1\n : 0;\n };\n Question.prototype.isAnswerCorrect = function () {\n return this.correctAnswerCount == this.quizQuestionCount;\n };\n Question.prototype.updateValueWithDefaults = function () {\n if (this.isLoadingFromJson ||\n (!this.isDesignMode && this.isDefaultValueEmpty()))\n return;\n if (!this.isDesignMode && !this.isEmpty())\n return;\n if (this.isEmpty() && this.isDefaultValueEmpty())\n return;\n if (!!this.survey && this.survey.isClearValueOnHidden && !this.isVisible)\n return;\n this.setDefaultValue();\n };\n Question.prototype.getQuestionFromArray = function (name, index) {\n return null;\n };\n Question.prototype.getDefaultValue = function () {\n return this.defaultValue;\n };\n Question.prototype.isDefaultValueEmpty = function () {\n return !this.defaultValueExpression && this.isValueEmpty(this.defaultValue);\n };\n Question.prototype.setDefaultValue = function () {\n var _this = this;\n this.setValueAndRunExpression(this.defaultValueExpression, this.getUnbindValue(this.defaultValue), function (val) {\n _this.value = val;\n });\n };\n Question.prototype.isValueExpression = function (val) {\n return !!val && typeof val == \"string\" && val.length > 0 && val[0] == \"=\";\n };\n Question.prototype.setValueAndRunExpression = function (expression, defaultValue, setFunc, values, properties) {\n var _this = this;\n if (values === void 0) { values = null; }\n if (properties === void 0) { properties = null; }\n var func = function (val) {\n if (val instanceof Date) {\n val = val.toISOString().slice(0, 10);\n }\n setFunc(val);\n };\n if (!!expression && !!this.data) {\n if (!values)\n values = this.data.getFilteredValues();\n if (!properties)\n properties = this.data.getFilteredProperties();\n var runner = new _conditions__WEBPACK_IMPORTED_MODULE_7__[\"ExpressionRunner\"](expression);\n if (runner.canRun) {\n runner.onRunComplete = function (res) {\n if (res == undefined)\n res = _this.defaultValue;\n func(res);\n };\n runner.run(values, properties);\n }\n }\n else {\n func(defaultValue);\n }\n };\n Object.defineProperty(Question.prototype, \"comment\", {\n /**\n * The question comment value.\n */\n get: function () {\n return this.getQuestionComment();\n },\n set: function (newValue) {\n if (!!newValue) {\n newValue = newValue.toString().trim();\n }\n if (this.comment == newValue)\n return;\n this.setQuestionComment(newValue);\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.getQuestionComment = function () {\n return this.questionComment;\n };\n Question.prototype.setQuestionComment = function (newValue) {\n this.setNewComment(newValue);\n };\n /**\n * Returns true if the question value is empty\n */\n Question.prototype.isEmpty = function () {\n return this.isValueEmpty(this.value);\n };\n Object.defineProperty(Question.prototype, \"isAnswered\", {\n get: function () {\n return this.getPropertyValue(\"isAnswered\");\n },\n set: function (val) {\n this.setPropertyValue(\"isAnswered\", val);\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.updateIsAnswered = function () {\n this.setPropertyValue(\"isAnswered\", this.getIsAnswered());\n };\n Question.prototype.getIsAnswered = function () {\n return !this.isEmpty();\n };\n Object.defineProperty(Question.prototype, \"validators\", {\n /**\n * The list of question validators.\n * Please note, this property is hidden for question without input, for example html question.\n */\n get: function () {\n return this.getPropertyValue(\"validators\");\n },\n set: function (val) {\n this.setPropertyValue(\"validators\", val);\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.getValidators = function () {\n return this.validators;\n };\n Question.prototype.getSupportedValidators = function () {\n var res = [];\n var className = this.getType();\n while (!!className) {\n var classValidators = _settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].supportedValidators[className];\n if (!!classValidators) {\n for (var i = classValidators.length - 1; i >= 0; i--) {\n res.splice(0, 0, classValidators[i]);\n }\n }\n var classInfo = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].findClass(className);\n className = classInfo.parentName;\n }\n return res;\n };\n Question.prototype.addSupportedValidators = function (supportedValidators, classValidators) { };\n Question.prototype.addConditionObjectsByContext = function (objects, context) {\n objects.push({\n name: this.getValueName(),\n text: this.processedTitle,\n question: this,\n });\n };\n Question.prototype.getConditionJson = function (operator, path) {\n if (operator === void 0) { operator = null; }\n if (path === void 0) { path = null; }\n var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]().toJsonObject(this);\n json[\"type\"] = this.getType();\n return json;\n };\n /**\n * Returns true if there is a validation error(s) in the question.\n * @param fireCallback set it to true to show an error in UI.\n */\n Question.prototype.hasErrors = function (fireCallback, rec) {\n if (fireCallback === void 0) { fireCallback = true; }\n if (rec === void 0) { rec = null; }\n var oldHasErrors = this.errors.length > 0;\n var errors = this.checkForErrors(!!rec && rec.isOnValueChanged === true);\n if (fireCallback) {\n if (!!this.survey) {\n this.survey.beforeSettingQuestionErrors(this, errors);\n }\n this.errors = errors;\n }\n this.updateContainsErrors();\n if (oldHasErrors != errors.length > 0) {\n this.updateQuestionCss();\n }\n if (this.isCollapsed && rec && fireCallback && errors.length > 0) {\n this.expand();\n }\n return errors.length > 0;\n };\n Object.defineProperty(Question.prototype, \"currentErrorCount\", {\n /**\n * Returns the validation errors count.\n */\n get: function () {\n return this.errors.length;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Question.prototype, \"requiredText\", {\n /**\n * Returns the char/string for a required question.\n * @see SurveyModel.requiredText\n */\n get: function () {\n return this.survey != null && this.isRequired\n ? this.survey.requiredText\n : \"\";\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Add error into the question error list.\n * @param error\n */\n Question.prototype.addError = function (error) {\n if (!error)\n return;\n var newError = null;\n if (typeof error === \"string\" || error instanceof String) {\n newError = new _error__WEBPACK_IMPORTED_MODULE_4__[\"CustomError\"](error, this.survey);\n }\n else {\n newError = error;\n }\n this.errors.push(newError);\n };\n /**\n * Remove a particular error from the question error list.\n * @param error\n */\n Question.prototype.removeError = function (error) {\n var errors = this.errors;\n var index = errors.indexOf(error);\n if (index !== -1)\n errors.splice(index, 1);\n };\n Question.prototype.checkForErrors = function (isOnValueChanged) {\n var qErrors = new Array();\n if (this.isVisible && !this.isReadOnly) {\n this.collectErrors(qErrors, isOnValueChanged);\n }\n return qErrors;\n };\n Question.prototype.collectErrors = function (qErrors, isOnValueChanged) {\n this.onCheckForErrors(qErrors, isOnValueChanged);\n if (qErrors.length > 0 || !this.canRunValidators(isOnValueChanged))\n return;\n var errors = this.runValidators();\n if (errors.length > 0) {\n //validators may change the question value.\n qErrors.length = 0;\n for (var i = 0; i < errors.length; i++) {\n qErrors.push(errors[i]);\n }\n }\n if (this.survey && qErrors.length == 0) {\n var error = this.fireSurveyValidation();\n if (error) {\n qErrors.push(error);\n }\n }\n };\n Question.prototype.canRunValidators = function (isOnValueChanged) {\n return true;\n };\n Question.prototype.fireSurveyValidation = function () {\n if (this.validateValueCallback)\n return this.validateValueCallback();\n return this.survey ? this.survey.validateQuestion(this) : null;\n };\n Question.prototype.onCheckForErrors = function (errors, isOnValueChanged) {\n if (!isOnValueChanged && this.hasRequiredError()) {\n errors.push(new _error__WEBPACK_IMPORTED_MODULE_4__[\"AnswerRequiredError\"](this.requiredErrorText, this));\n }\n };\n Question.prototype.hasRequiredError = function () {\n return this.isRequired && this.isEmpty();\n };\n Object.defineProperty(Question.prototype, \"isRunningValidators\", {\n get: function () {\n return this.getIsRunningValidators();\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.getIsRunningValidators = function () {\n return this.isRunningValidatorsValue;\n };\n Question.prototype.runValidators = function () {\n var _this = this;\n if (!!this.validatorRunner) {\n this.validatorRunner.onAsyncCompleted = null;\n }\n this.validatorRunner = new _validator__WEBPACK_IMPORTED_MODULE_5__[\"ValidatorRunner\"]();\n this.isRunningValidatorsValue = true;\n this.validatorRunner.onAsyncCompleted = function (errors) {\n _this.doOnAsyncCompleted(errors);\n };\n return this.validatorRunner.run(this);\n };\n Question.prototype.doOnAsyncCompleted = function (errors) {\n for (var i = 0; i < errors.length; i++) {\n this.errors.push(errors[i]);\n }\n this.isRunningValidatorsValue = false;\n this.raiseOnCompletedAsyncValidators();\n };\n Question.prototype.raiseOnCompletedAsyncValidators = function () {\n if (!!this.onCompletedAsyncValidators && !this.isRunningValidators) {\n this.onCompletedAsyncValidators(this.getAllErrors().length > 0);\n this.onCompletedAsyncValidators = null;\n }\n };\n Question.prototype.setNewValue = function (newValue) {\n var oldAnswered = this.isAnswered;\n this.setNewValueInData(newValue);\n this.allowNotifyValueChanged && this.onValueChanged();\n if (this.isAnswered != oldAnswered) {\n this.updateQuestionCss();\n }\n };\n Question.prototype.isTextValue = function () {\n return false;\n };\n Object.defineProperty(Question.prototype, \"isSurveyInputTextUpdate\", {\n get: function () {\n return !!this.survey ? this.survey.isUpdateValueTextOnTyping : false;\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.getDataLocNotification = function () {\n return this.isInputTextUpdate ? \"text\" : false;\n };\n Object.defineProperty(Question.prototype, \"isInputTextUpdate\", {\n get: function () {\n return this.isSurveyInputTextUpdate && this.isTextValue();\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.setNewValueInData = function (newValue) {\n newValue = this.valueToData(newValue);\n if (!this.isValueChangedInSurvey) {\n this.setValueCore(newValue);\n }\n };\n Question.prototype.getValueCore = function () {\n return this.questionValue;\n };\n Question.prototype.setValueCore = function (newValue) {\n this.setQuestionValue(newValue);\n if (this.data != null && this.canSetValueToSurvey()) {\n newValue = this.valueForSurvey;\n this.data.setValue(this.getValueName(), newValue, this.getDataLocNotification(), this.allowNotifyValueChanged);\n }\n };\n Question.prototype.canSetValueToSurvey = function () {\n return true;\n };\n Question.prototype.valueFromData = function (val) {\n return val;\n };\n Question.prototype.valueToData = function (val) {\n return val;\n };\n Question.prototype.onValueChanged = function () { };\n Question.prototype.setNewComment = function (newValue) {\n this.questionComment = newValue;\n if (this.data != null) {\n this.data.setComment(this.getValueName(), newValue, this.isSurveyInputTextUpdate ? \"text\" : false);\n }\n };\n Question.prototype.getValidName = function (name) {\n if (!name)\n return name;\n return name.trim().replace(/[\\{\\}]+/g, \"\");\n };\n //IQuestion\n Question.prototype.updateValueFromSurvey = function (newValue) {\n newValue = this.getUnbindValue(newValue);\n if (!!this.valueFromDataCallback) {\n newValue = this.valueFromDataCallback(newValue);\n }\n this.setQuestionValue(this.valueFromData(newValue));\n };\n Question.prototype.updateCommentFromSurvey = function (newValue) {\n this.questionComment = newValue;\n };\n Question.prototype.setQuestionValue = function (newValue, updateIsAnswered) {\n if (updateIsAnswered === void 0) { updateIsAnswered = true; }\n this.questionValue = newValue;\n this.allowNotifyValueChanged &&\n this.fireCallback(this.valueChangedCallback);\n if (updateIsAnswered)\n this.updateIsAnswered();\n };\n Question.prototype.onSurveyValueChanged = function (newValue) { };\n Question.prototype.setVisibleIndex = function (val) {\n if (!this.isVisible ||\n (!this.hasTitle && !_settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].setQuestionVisibleIndexForHiddenTitle) ||\n (this.hideNumber && !_settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].setQuestionVisibleIndexForHiddenNumber)) {\n val = -1;\n }\n this.setPropertyValue(\"visibleIndex\", val);\n this.setPropertyValue(\"no\", this.calcNo());\n return val < 0 ? 0 : 1;\n };\n Question.prototype.removeElement = function (element) {\n return false;\n };\n Question.prototype.supportGoNextPageAutomatic = function () {\n return false;\n };\n Question.prototype.supportGoNextPageError = function () {\n return true;\n };\n /**\n * Call this function to remove values from the current question, that end-user will not be able to enter.\n * For example the value that doesn't exists in a radigroup/dropdown/checkbox choices or matrix rows/columns.\n */\n Question.prototype.clearIncorrectValues = function () { };\n Question.prototype.clearOnDeletingContainer = function () { };\n /**\n * Call this function to clear all errors in the question\n */\n Question.prototype.clearErrors = function () {\n this.errors = [];\n };\n Question.prototype.clearUnusedValues = function () { };\n Question.prototype.onAnyValueChanged = function (name) { };\n Question.prototype.checkBindings = function (valueName, value) {\n if (this.bindings.isEmpty() || !this.data)\n return;\n var props = this.bindings.getPropertiesByValueName(valueName);\n for (var i = 0; i < props.length; i++) {\n this[props[i]] = value;\n }\n };\n /**\n * Returns the current survey locale\n * @see SurveyModel.locale\n */\n Question.prototype.getLocale = function () {\n return this.survey\n ? this.survey.getLocale()\n : this.locOwner\n ? this.locOwner.getLocale()\n : \"\";\n };\n Question.prototype.getMarkdownHtml = function (text, name) {\n return this.survey\n ? this.survey.getSurveyMarkdownHtml(this, text, name)\n : this.locOwner\n ? this.locOwner.getMarkdownHtml(text, name)\n : null;\n };\n Question.prototype.getRenderer = function (name) {\n return this.survey && typeof this.survey.getRendererForString === \"function\"\n ? this.survey.getRendererForString(this, name)\n : this.locOwner && typeof this.locOwner.getRenderer === \"function\"\n ? this.locOwner.getRenderer(name)\n : null;\n };\n Question.prototype.getProcessedText = function (text) {\n if (this.isLoadingFromJson)\n return text;\n if (this.textProcessor)\n return this.textProcessor.processText(text, this.useDisplayValuesInTitle);\n if (this.locOwner)\n return this.locOwner.getProcessedText(text);\n return text;\n };\n Question.prototype.getComponentName = function () {\n return _rendererFactory__WEBPACK_IMPORTED_MODULE_10__[\"RendererFactory\"].Instance.getRendererByQuestion(this);\n };\n Question.prototype.isDefaultRendering = function () {\n return (!!this.customWidget ||\n this.renderAs === \"default\" ||\n this.getComponentName() === \"default\");\n };\n //ISurveyErrorOwner\n Question.prototype.getErrorCustomText = function (text, error) {\n if (!!this.survey)\n return this.survey.getErrorCustomText(text, error);\n return text;\n };\n //IValidatorOwner\n Question.prototype.getValidatorTitle = function () {\n return null;\n };\n Object.defineProperty(Question.prototype, \"validatedValue\", {\n get: function () {\n return this.value;\n },\n set: function (val) {\n this.value = val;\n },\n enumerable: false,\n configurable: true\n });\n Question.prototype.getAllValues = function () {\n return !!this.data ? this.data.getAllValues() : null;\n };\n Question.TextPreprocessorValuesMap = {\n title: \"processedTitle\",\n require: \"requiredText\",\n };\n Question.questionCounter = 100;\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ localizable: true })\n ], Question.prototype, \"description\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], Question.prototype, \"cssClassesValue\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: \"default\" })\n ], Question.prototype, \"renderAs\", void 0);\n return Question;\n}(_survey_element__WEBPACK_IMPORTED_MODULE_2__[\"SurveyElement\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"question\", [\n \"!name\",\n {\n name: \"state\",\n default: \"default\",\n choices: [\"default\", \"collapsed\", \"expanded\"],\n },\n { name: \"visible:switch\", default: true },\n { name: \"useDisplayValuesInTitle:boolean\", default: true, layout: \"row\" },\n \"visibleIf:condition\",\n { name: \"width\" },\n { name: \"minWidth\", default: _settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].minWidth },\n { name: \"maxWidth\", default: _settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].maxWidth },\n { name: \"startWithNewLine:boolean\", default: true, layout: \"row\" },\n { name: \"indent:number\", default: 0, choices: [0, 1, 2, 3], layout: \"row\" },\n {\n name: \"page\",\n isSerializable: false,\n visibleIf: function (obj) {\n var survey = obj ? obj.survey : null;\n return !survey || survey.pages.length > 1;\n },\n choices: function (obj) {\n var survey = obj ? obj.survey : null;\n return survey\n ? survey.pages.map(function (p) {\n return { value: p.name, text: p.title };\n })\n : [];\n },\n },\n { name: \"title:text\", serializationProperty: \"locTitle\", layout: \"row\" },\n {\n name: \"titleLocation\",\n default: \"default\",\n choices: [\"default\", \"top\", \"bottom\", \"left\", \"hidden\"],\n layout: \"row\",\n },\n {\n name: \"description:text\",\n serializationProperty: \"locDescription\",\n layout: \"row\",\n },\n {\n name: \"descriptionLocation\",\n default: \"default\",\n choices: [\"default\", \"underInput\", \"underTitle\"],\n },\n {\n name: \"hideNumber:boolean\",\n dependsOn: \"titleLocation\",\n visibleIf: function (obj) {\n if (!obj) {\n return true;\n }\n if (obj.titleLocation === \"hidden\") {\n return false;\n }\n var parent = obj ? obj.parent : null;\n var numberingAllowedByParent = !parent || parent.showQuestionNumbers !== \"off\";\n if (!numberingAllowedByParent) {\n return false;\n }\n var survey = obj ? obj.survey : null;\n return (!survey ||\n survey.showQuestionNumbers !== \"off\" ||\n (!!parent && parent.showQuestionNumbers === \"onpanel\"));\n },\n },\n \"valueName\",\n \"enableIf:condition\",\n \"defaultValue:value\",\n {\n name: \"defaultValueExpression:expression\",\n category: \"logic\",\n },\n \"correctAnswer:value\",\n \"isRequired:switch\",\n \"requiredIf:condition\",\n {\n name: \"requiredErrorText:text\",\n serializationProperty: \"locRequiredErrorText\",\n },\n \"readOnly:switch\",\n {\n name: \"validators:validators\",\n baseClassName: \"surveyvalidator\",\n classNamePart: \"validator\",\n },\n {\n name: \"bindings:bindings\",\n serializationProperty: \"bindings\",\n visibleIf: function (obj) {\n return obj.bindings.getNames().length > 0;\n },\n },\n { name: \"renderAs\", default: \"default\", visible: false },\n]);\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addAlterNativeClassName(\"question\", \"questionbase\");\n\n\n/***/ }),\n\n/***/ \"./src/questionCustomWidgets.ts\":\n/*!**************************************!*\\\n !*** ./src/questionCustomWidgets.ts ***!\n \\**************************************/\n/*! exports provided: QuestionCustomWidget, CustomWidgetCollection */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustomWidget\", function() { return QuestionCustomWidget; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CustomWidgetCollection\", function() { return CustomWidgetCollection; });\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n\nvar QuestionCustomWidget = /** @class */ (function () {\n function QuestionCustomWidget(name, widgetJson) {\n this.name = name;\n this.widgetJson = widgetJson;\n this.isFirstRender = true;\n this.htmlTemplate = widgetJson.htmlTemplate ? widgetJson.htmlTemplate : \"\";\n }\n QuestionCustomWidget.prototype.afterRender = function (question, el) {\n var _this = this;\n if (this.isFirstRender) {\n this.isFirstRender = false;\n question.survey.onLocaleChangedEvent.add(function () {\n _this.widgetJson.willUnmount(question, el);\n _this.widgetJson.afterRender(question, el);\n });\n }\n if (this.widgetJson.afterRender)\n this.widgetJson.afterRender(question, el);\n };\n QuestionCustomWidget.prototype.willUnmount = function (question, el) {\n if (this.widgetJson.willUnmount)\n this.widgetJson.willUnmount(question, el);\n };\n QuestionCustomWidget.prototype.getDisplayValue = function (question, value) {\n if (value === void 0) { value = undefined; }\n if (this.widgetJson.getDisplayValue)\n return this.widgetJson.getDisplayValue(question, value);\n return null;\n };\n QuestionCustomWidget.prototype.isFit = function (question) {\n if (this.isLibraryLoaded() && this.widgetJson.isFit)\n return this.widgetJson.isFit(question);\n return false;\n };\n Object.defineProperty(QuestionCustomWidget.prototype, \"canShowInToolbox\", {\n get: function () {\n if (this.widgetJson.showInToolbox === false)\n return false;\n if (CustomWidgetCollection.Instance.getActivatedBy(this.name) != \"customtype\")\n return false;\n return !this.widgetJson.widgetIsLoaded || this.widgetJson.widgetIsLoaded();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionCustomWidget.prototype, \"showInToolbox\", {\n get: function () {\n return this.widgetJson.showInToolbox !== false;\n },\n set: function (val) {\n this.widgetJson.showInToolbox = val;\n },\n enumerable: false,\n configurable: true\n });\n QuestionCustomWidget.prototype.init = function () {\n if (this.widgetJson.init) {\n this.widgetJson.init();\n }\n };\n QuestionCustomWidget.prototype.activatedByChanged = function (activatedBy) {\n if (this.isLibraryLoaded() && this.widgetJson.activatedByChanged) {\n this.widgetJson.activatedByChanged(activatedBy);\n }\n };\n QuestionCustomWidget.prototype.isLibraryLoaded = function () {\n if (this.widgetJson.widgetIsLoaded)\n return this.widgetJson.widgetIsLoaded() == true;\n return true;\n };\n Object.defineProperty(QuestionCustomWidget.prototype, \"isDefaultRender\", {\n get: function () {\n return this.widgetJson.isDefaultRender;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionCustomWidget.prototype, \"pdfQuestionType\", {\n get: function () {\n return this.widgetJson.pdfQuestionType;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionCustomWidget.prototype, \"pdfRender\", {\n get: function () {\n return this.widgetJson.pdfRender;\n },\n enumerable: false,\n configurable: true\n });\n return QuestionCustomWidget;\n}());\n\nvar CustomWidgetCollection = /** @class */ (function () {\n function CustomWidgetCollection() {\n this.widgetsValues = [];\n this.widgetsActivatedBy = {};\n this.onCustomWidgetAdded = new _base__WEBPACK_IMPORTED_MODULE_0__[\"Event\"]();\n }\n Object.defineProperty(CustomWidgetCollection.prototype, \"widgets\", {\n get: function () {\n return this.widgetsValues;\n },\n enumerable: false,\n configurable: true\n });\n CustomWidgetCollection.prototype.add = function (widgetJson, activatedBy) {\n if (activatedBy === void 0) { activatedBy = \"property\"; }\n this.addCustomWidget(widgetJson, activatedBy);\n };\n CustomWidgetCollection.prototype.addCustomWidget = function (widgetJson, activatedBy) {\n if (activatedBy === void 0) { activatedBy = \"property\"; }\n var name = widgetJson.name;\n if (!name) {\n name = \"widget_\" + this.widgets.length + 1;\n }\n var customWidget = new QuestionCustomWidget(name, widgetJson);\n this.widgetsValues.push(customWidget);\n customWidget.init();\n this.widgetsActivatedBy[name] = activatedBy;\n customWidget.activatedByChanged(activatedBy);\n this.onCustomWidgetAdded.fire(customWidget, null);\n return customWidget;\n };\n /**\n * Returns the way the custom wiget is activated. It can be activated by a property (\"property\"), question type (\"type\") or by new/custom question type (\"customtype\").\n * @param widgetName the custom widget name\n * @see setActivatedBy\n */\n CustomWidgetCollection.prototype.getActivatedBy = function (widgetName) {\n var res = this.widgetsActivatedBy[widgetName];\n return res ? res : \"property\";\n };\n /**\n * Sets the way the custom wiget is activated. The activation types are: property (\"property\"), question type (\"type\") or new/custom question type (\"customtype\"). A custom wiget may support all or only some of this activation types.\n * @param widgetName\n * @param activatedBy there are three possible variants: \"property\", \"type\" and \"customtype\"\n */\n CustomWidgetCollection.prototype.setActivatedBy = function (widgetName, activatedBy) {\n if (!widgetName || !activatedBy)\n return;\n var widget = this.getCustomWidgetByName(widgetName);\n if (!widget)\n return;\n this.widgetsActivatedBy[widgetName] = activatedBy;\n widget.activatedByChanged(activatedBy);\n };\n CustomWidgetCollection.prototype.clear = function () {\n this.widgetsValues = [];\n };\n CustomWidgetCollection.prototype.getCustomWidgetByName = function (name) {\n for (var i = 0; i < this.widgets.length; i++) {\n if (this.widgets[i].name == name)\n return this.widgets[i];\n }\n return null;\n };\n CustomWidgetCollection.prototype.getCustomWidget = function (question) {\n for (var i = 0; i < this.widgetsValues.length; i++) {\n if (this.widgetsValues[i].isFit(question))\n return this.widgetsValues[i];\n }\n return null;\n };\n CustomWidgetCollection.Instance = new CustomWidgetCollection();\n return CustomWidgetCollection;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/question_baseselect.ts\":\n/*!************************************!*\\\n !*** ./src/question_baseselect.ts ***!\n \\************************************/\n/*! exports provided: QuestionSelectBase, QuestionCheckboxBase */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionSelectBase\", function() { return QuestionSelectBase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxBase\", function() { return QuestionCheckboxBase; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _survey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./survey */ \"./src/survey.ts\");\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _choicesRestful__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./choicesRestful */ \"./src/choicesRestful.ts\");\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./conditions */ \"./src/conditions.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\n\n\n\n/**\n * It is a base class for checkbox, dropdown and radiogroup questions.\n */\nvar QuestionSelectBase = /** @class */ (function (_super) {\n __extends(QuestionSelectBase, _super);\n function QuestionSelectBase(name) {\n var _this = _super.call(this, name) || this;\n _this.otherItemValue = new _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"](\"other\");\n _this.dependedQuestions = [];\n _this.noneItemValue = new _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"](\"none\");\n _this.isSettingDefaultValue = false;\n _this.isSettingComment = false;\n _this.isRunningChoices = false;\n _this.isFirstLoadChoicesFromUrl = true;\n _this.isUpdatingChoicesDependedQuestions = false;\n var noneItemText = _this.createLocalizableString(\"noneText\", _this, true);\n noneItemText.onGetTextCallback = function (text) {\n return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"noneItemText\");\n };\n _this.noneItemValue.locOwner = _this;\n _this.noneItemValue.setLocText(noneItemText);\n _this.createItemValues(\"choices\");\n _this.registerFunctionOnPropertyValueChanged(\"choices\", function () {\n if (!_this.filterItems()) {\n _this.onVisibleChoicesChanged();\n }\n });\n _this.registerFunctionOnPropertiesValueChanged([\"choicesFromQuestion\", \"choicesFromQuestionMode\", \"hasNone\"], function () {\n _this.onVisibleChoicesChanged();\n });\n _this.registerFunctionOnPropertyValueChanged(\"hideIfChoicesEmpty\", function () {\n _this.updateVisibilityBasedOnChoices();\n });\n _this.createNewArray(\"visibleChoices\");\n _this.setNewRestfulProperty();\n var locOtherText = _this.createLocalizableString(\"otherText\", _this, true);\n _this.createLocalizableString(\"otherErrorText\", _this, true);\n _this.otherItemValue.locOwner = _this;\n _this.otherItemValue.setLocText(locOtherText);\n locOtherText.onGetTextCallback = function (text) {\n return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"otherItemText\");\n };\n _this.choicesByUrl.beforeSendRequestCallback = function () {\n _this.onBeforeSendRequest();\n };\n _this.choicesByUrl.getResultCallback = function (items) {\n _this.onLoadChoicesFromUrl(items);\n };\n _this.choicesByUrl.updateResultCallback = function (items, serverResult) {\n if (_this.survey) {\n return _this.survey.updateChoicesFromServer(_this, items, serverResult);\n }\n return items;\n };\n _this.createLocalizableString(\"otherPlaceHolder\", _this);\n return _this;\n }\n QuestionSelectBase.prototype.getType = function () {\n return \"selectbase\";\n };\n QuestionSelectBase.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n for (var i = 0; i < this.dependedQuestions.length; i++) {\n this.dependedQuestions[i].choicesFromQuestion = \"\";\n }\n this.removeFromDependedQuestion(this.getQuestionWithChoices());\n };\n QuestionSelectBase.prototype.supportGoNextPageError = function () {\n return !this.isOtherSelected || !!this.comment;\n };\n QuestionSelectBase.prototype.isLayoutTypeSupported = function (layoutType) {\n return true;\n };\n QuestionSelectBase.prototype.localeChanged = function () {\n _super.prototype.localeChanged.call(this);\n if (this.choicesOrder !== \"none\") {\n this.updateVisibleChoices();\n }\n };\n QuestionSelectBase.prototype.locStrsChanged = function () {\n _super.prototype.locStrsChanged.call(this);\n if (!!this.choicesFromUrl) {\n _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].locStrsChanged(this.choicesFromUrl);\n _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].locStrsChanged(this.visibleChoices);\n }\n };\n Object.defineProperty(QuestionSelectBase.prototype, \"otherItem\", {\n /**\n * Returns the other item. By using this property, you may change programmatically it's value and text.\n * @see hasOther\n */\n get: function () {\n return this.otherItemValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"isOtherSelected\", {\n /**\n * Returns true if a user select the 'other' item.\n */\n get: function () {\n return this.hasOther && this.getHasOther(this.renderedValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"hasNone\", {\n /**\n * Set this property to true, to show the \"None\" item on the bottom. If end-user checks this item, all other items would be unchecked.\n */\n get: function () {\n return this.getPropertyValue(\"hasNone\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"hasNone\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"noneItem\", {\n /**\n * Returns the none item. By using this property, you may change programmatically it's value and text.\n * @see hasNone\n */\n get: function () {\n return this.noneItemValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"noneText\", {\n /**\n * Use this property to set the different text for none item.\n */\n get: function () {\n return this.getLocalizableStringText(\"noneText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"noneItemText\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"noneText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"locNoneText\", {\n get: function () {\n return this.getLocalizableString(\"noneText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"choicesVisibleIf\", {\n /**\n * An expression that returns true or false. It runs against each choices item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression.\n * @see visibleIf\n * @see choicesEnableIf\n */\n get: function () {\n return this.getPropertyValue(\"choicesVisibleIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"choicesVisibleIf\", val);\n this.filterItems();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"choicesEnableIf\", {\n /**\n * An expression that returns true or false. It runs against each choices item and if for this item it returns true, then the item is enabled otherwise the item becomes disabled. Please use {item} to get the current item value in the expression.\n * @see choicesVisibleIf\n */\n get: function () {\n return this.getPropertyValue(\"choicesEnableIf\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"choicesEnableIf\", val);\n this.filterItems();\n },\n enumerable: false,\n configurable: true\n });\n QuestionSelectBase.prototype.runCondition = function (values, properties) {\n _super.prototype.runCondition.call(this, values, properties);\n this.runItemsEnableCondition(values, properties);\n this.runItemsCondition(values, properties);\n };\n QuestionSelectBase.prototype.isTextValue = function () {\n return true; //for comments and others\n };\n QuestionSelectBase.prototype.setDefaultValue = function () {\n this.isSettingDefaultValue =\n !this.isValueEmpty(this.defaultValue) &&\n this.hasUnknownValue(this.defaultValue);\n this.prevCommentValue = undefined;\n _super.prototype.setDefaultValue.call(this);\n this.isSettingDefaultValue = false;\n };\n QuestionSelectBase.prototype.getIsMultipleValue = function () {\n return false;\n };\n QuestionSelectBase.prototype.convertDefaultValue = function (val) {\n if (val == null || val == undefined)\n return val;\n if (this.getIsMultipleValue()) {\n if (!Array.isArray(val))\n return [val];\n }\n else {\n if (Array.isArray(val) && val.length > 0)\n return val[0];\n }\n return val;\n };\n QuestionSelectBase.prototype.filterItems = function () {\n if (this.isLoadingFromJson ||\n !this.data ||\n this.areInvisibleElementsShowing)\n return false;\n var values = this.getDataFilteredValues();\n var properties = this.getDataFilteredProperties();\n this.runItemsEnableCondition(values, properties);\n return this.runItemsCondition(values, properties);\n };\n QuestionSelectBase.prototype.runItemsCondition = function (values, properties) {\n this.setConditionalChoicesRunner();\n var hasChanges = this.runConditionsForItems(values, properties);\n if (!!this.filteredChoicesValue &&\n this.filteredChoicesValue.length === this.activeChoices.length) {\n this.filteredChoicesValue = undefined;\n }\n if (hasChanges) {\n this.onVisibleChoicesChanged();\n this.clearIncorrectValues();\n }\n return hasChanges;\n };\n QuestionSelectBase.prototype.runItemsEnableCondition = function (values, properties) {\n var _this = this;\n this.setConditionalEnableChoicesRunner();\n var hasChanged = _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].runEnabledConditionsForItems(this.activeChoices, this.conditionChoicesEnableIfRunner, values, properties, function (item) {\n return _this.onEnableItemCallBack(item);\n });\n if (hasChanged) {\n this.clearDisabledValues();\n }\n this.onAfterRunItemsEnableCondition();\n };\n QuestionSelectBase.prototype.onAfterRunItemsEnableCondition = function () { };\n QuestionSelectBase.prototype.onEnableItemCallBack = function (item) {\n return true;\n };\n QuestionSelectBase.prototype.setConditionalChoicesRunner = function () {\n if (this.choicesVisibleIf) {\n if (!this.conditionChoicesVisibleIfRunner) {\n this.conditionChoicesVisibleIfRunner = new _conditions__WEBPACK_IMPORTED_MODULE_7__[\"ConditionRunner\"](this.choicesVisibleIf);\n }\n this.conditionChoicesVisibleIfRunner.expression = this.choicesVisibleIf;\n }\n else {\n this.conditionChoicesVisibleIfRunner = null;\n }\n };\n QuestionSelectBase.prototype.setConditionalEnableChoicesRunner = function () {\n if (this.choicesEnableIf) {\n if (!this.conditionChoicesEnableIfRunner) {\n this.conditionChoicesEnableIfRunner = new _conditions__WEBPACK_IMPORTED_MODULE_7__[\"ConditionRunner\"](this.choicesEnableIf);\n }\n this.conditionChoicesEnableIfRunner.expression = this.choicesEnableIf;\n }\n else {\n this.conditionChoicesEnableIfRunner = null;\n }\n };\n QuestionSelectBase.prototype.runConditionsForItems = function (values, properties) {\n this.filteredChoicesValue = [];\n return _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].runConditionsForItems(this.activeChoices, this.getFilteredChoices(), this.areInvisibleElementsShowing\n ? null\n : this.conditionChoicesVisibleIfRunner, values, properties, !this.survey || !this.survey.areInvisibleElementsShowing);\n };\n QuestionSelectBase.prototype.getHasOther = function (val) {\n return val === this.otherItem.value;\n };\n Object.defineProperty(QuestionSelectBase.prototype, \"validatedValue\", {\n get: function () {\n return this.rendredValueToDataCore(this.value);\n },\n enumerable: false,\n configurable: true\n });\n QuestionSelectBase.prototype.createRestful = function () {\n return new _choicesRestful__WEBPACK_IMPORTED_MODULE_6__[\"ChoicesRestful\"]();\n };\n QuestionSelectBase.prototype.setNewRestfulProperty = function () {\n this.setPropertyValue(\"choicesByUrl\", this.createRestful());\n this.choicesByUrl.owner = this;\n this.choicesByUrl.loadingOwner = this;\n };\n QuestionSelectBase.prototype.getQuestionComment = function () {\n if (!!this.commentValue)\n return this.commentValue;\n if (this.hasComment || this.getStoreOthersAsComment())\n return _super.prototype.getQuestionComment.call(this);\n return this.commentValue;\n };\n QuestionSelectBase.prototype.setQuestionComment = function (newValue) {\n if (this.hasComment || this.getStoreOthersAsComment())\n _super.prototype.setQuestionComment.call(this, newValue);\n else {\n if (!this.isSettingComment && newValue != this.commentValue) {\n this.isSettingComment = true;\n this.commentValue = newValue;\n if (this.isOtherSelected && !this.isRenderedValueSetting) {\n this.value = this.rendredValueToData(this.renderedValue);\n }\n this.isSettingComment = false;\n }\n }\n };\n QuestionSelectBase.prototype.clearValue = function () {\n _super.prototype.clearValue.call(this);\n this.prevCommentValue = undefined;\n };\n Object.defineProperty(QuestionSelectBase.prototype, \"renderedValue\", {\n get: function () {\n return this.getPropertyValue(\"renderedValue\", null);\n },\n set: function (val) {\n this.setPropertyValue(\"renderedValue\", val);\n this.value = this.rendredValueToData(val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionSelectBase.prototype.setQuestionValue = function (newValue, updateIsAnswered, updateComment) {\n if (updateIsAnswered === void 0) { updateIsAnswered = true; }\n if (updateComment === void 0) { updateComment = true; }\n if (this.isLoadingFromJson ||\n _helpers__WEBPACK_IMPORTED_MODULE_8__[\"Helpers\"].isTwoValueEquals(this.value, newValue))\n return;\n _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);\n this.setPropertyValue(\"renderedValue\", this.rendredValueFromData(newValue));\n if (this.hasComment || !updateComment)\n return;\n var isOtherSel = this.isOtherSelected;\n if (isOtherSel && !!this.prevCommentValue) {\n var oldComment = this.prevCommentValue;\n this.prevCommentValue = undefined;\n this.comment = oldComment;\n }\n if (!isOtherSel && !!this.comment) {\n if (this.getStoreOthersAsComment()) {\n this.prevCommentValue = this.comment;\n }\n this.comment = \"\";\n }\n };\n QuestionSelectBase.prototype.setNewValue = function (newValue) {\n newValue = this.valueFromData(newValue);\n if ((!this.choicesByUrl.isRunning &&\n !this.choicesByUrl.isWaitingForParameters) ||\n !this.isValueEmpty(newValue)) {\n this.cachedValueForUrlRequests = newValue;\n }\n _super.prototype.setNewValue.call(this, newValue);\n };\n QuestionSelectBase.prototype.valueFromData = function (val) {\n var choiceitem = _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].getItemByValue(this.activeChoices, val);\n if (!!choiceitem) {\n return choiceitem.value;\n }\n return _super.prototype.valueFromData.call(this, val);\n };\n QuestionSelectBase.prototype.rendredValueFromData = function (val) {\n if (this.getStoreOthersAsComment())\n return val;\n return this.renderedValueFromDataCore(val);\n };\n QuestionSelectBase.prototype.rendredValueToData = function (val) {\n if (this.getStoreOthersAsComment())\n return val;\n return this.rendredValueToDataCore(val);\n };\n QuestionSelectBase.prototype.renderedValueFromDataCore = function (val) {\n if (!this.hasUnknownValue(val, true, false))\n return this.valueFromData(val);\n this.comment = val;\n return this.otherItem.value;\n };\n QuestionSelectBase.prototype.rendredValueToDataCore = function (val) {\n if (val == this.otherItem.value && this.getQuestionComment()) {\n val = this.getQuestionComment();\n }\n return val;\n };\n QuestionSelectBase.prototype.hasUnknownValue = function (val, includeOther, isFilteredChoices, checkEmptyValue) {\n if (includeOther === void 0) { includeOther = false; }\n if (isFilteredChoices === void 0) { isFilteredChoices = true; }\n if (checkEmptyValue === void 0) { checkEmptyValue = false; }\n if (!checkEmptyValue && this.isValueEmpty(val))\n return false;\n if (includeOther && val == this.otherItem.value)\n return false;\n if (this.hasNone && val == this.noneItem.value)\n return false;\n var choices = isFilteredChoices\n ? this.getFilteredChoices()\n : this.activeChoices;\n return _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].getItemByValue(choices, val) == null;\n };\n QuestionSelectBase.prototype.isValueDisabled = function (val) {\n var itemValue = _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].getItemByValue(this.getFilteredChoices(), val);\n return !!itemValue && !itemValue.isEnabled;\n };\n Object.defineProperty(QuestionSelectBase.prototype, \"choicesByUrl\", {\n /**\n * Use this property to fill the choices from a RESTful service.\n * @see choices\n * @see ChoicesRestful\n * @see [Example: RESTful Dropdown](https://surveyjs.io/Examples/Library/?id=questiontype-dropdownrestfull)\n * @see [Docs: Fill Choices from a RESTful Service](https://surveyjs.io/Documentation/Library/?id=LibraryOverview#fill-the-choices-from-a-restful-service)\n */\n get: function () {\n return this.getPropertyValue(\"choicesByUrl\");\n },\n set: function (val) {\n if (!val)\n return;\n this.setNewRestfulProperty();\n this.choicesByUrl.fromJSON(val.toJSON());\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"choices\", {\n /**\n * The list of items. Every item has value and text. If text is empty, the value is rendered. The item text supports markdown.\n * @see choicesByUrl\n * @see choicesFromQuestion\n */\n get: function () {\n return this.getPropertyValue(\"choices\");\n },\n set: function (newValue) {\n this.setPropertyValue(\"choices\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"choicesFromQuestion\", {\n /**\n * Set this property to get choices from the specified question instead of defining them in the current question. This avoids duplication of choices declaration in your survey definition.\n * By setting this property, the \"choices\", \"choicesVisibleIf\", \"choicesEnableIf\" and \"choicesOrder\" properties become invisible, because these question characteristics depend on actions in another (specified) question.\n * Use the `choicesFromQuestionMode` property to filter choices obtained from the specified question.\n * @see choices\n * @see choicesFromQuestionMode\n */\n get: function () {\n return this.getPropertyValue(\"choicesFromQuestion\");\n },\n set: function (val) {\n var question = this.getQuestionWithChoices();\n if (!!question) {\n question.removeFromDependedQuestion(this);\n }\n this.setPropertyValue(\"choicesFromQuestion\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionSelectBase.prototype.addIntoDependedQuestion = function (question) {\n if (!question || question.dependedQuestions.indexOf(this) > -1)\n return;\n question.dependedQuestions.push(this);\n };\n QuestionSelectBase.prototype.removeFromDependedQuestion = function (question) {\n if (!question)\n return;\n var index = question.dependedQuestions.indexOf(this);\n if (index > -1) {\n question.dependedQuestions.splice(index, 1);\n }\n };\n Object.defineProperty(QuestionSelectBase.prototype, \"choicesFromQuestionMode\", {\n /**\n * This property becomes visible when the `choicesFromQuestion` property is selected. The default value is \"all\" (all visible choices from another question are displayed as they are).\n * You can set this property to \"selected\" or \"unselected\" to display only selected or unselected choices from the specified question.\n * @see choicesFromQuestion\n */\n get: function () {\n return this.getPropertyValue(\"choicesFromQuestionMode\");\n },\n set: function (val) {\n this.setPropertyValue(\"choicesFromQuestionMode\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"hideIfChoicesEmpty\", {\n /**\n * Set this property to true to hide the question if there is no visible choices.\n */\n get: function () {\n return this.getPropertyValue(\"hideIfChoicesEmpty\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"hideIfChoicesEmpty\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"keepIncorrectValues\", {\n get: function () {\n return this.getPropertyValue(\"keepIncorrectValues\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"keepIncorrectValues\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"storeOthersAsComment\", {\n /**\n * Please use survey.storeOthersAsComment to change the behavior on the survey level. This property is depricated and invisible in Survey Creator.\n * By default the entered text in the others input in the checkbox/radiogroup/dropdown are stored as \"question name \" + \"-Comment\". The value itself is \"question name\": \"others\". Set this property to false, to store the entered text directly in the \"question name\" key.\n * Possible values are: \"default\", true, false\n * @see SurveyModel.storeOthersAsComment\n */\n get: function () {\n return this.getPropertyValue(\"storeOthersAsComment\", \"default\");\n },\n set: function (val) {\n this.setPropertyValue(\"storeOthersAsComment\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionSelectBase.prototype.hasOtherChanged = function () {\n this.onVisibleChoicesChanged();\n };\n Object.defineProperty(QuestionSelectBase.prototype, \"choicesOrder\", {\n /**\n * Use this property to render items in a specific order: \"asc\", \"desc\", \"random\". Default value is \"none\".\n */\n get: function () {\n return this.getPropertyValue(\"choicesOrder\");\n },\n set: function (val) {\n val = val.toLowerCase();\n if (val == this.choicesOrder)\n return;\n this.setPropertyValue(\"choicesOrder\", val);\n this.onVisibleChoicesChanged();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"otherText\", {\n /**\n * Use this property to set the different text for other item.\n */\n get: function () {\n return this.getLocalizableStringText(\"otherText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"otherItemText\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"otherText\", val);\n this.onVisibleChoicesChanged();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"locOtherText\", {\n get: function () {\n return this.getLocalizableString(\"otherText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"otherPlaceHolder\", {\n /**\n * Use this property to set the place holder text for other or comment field .\n */\n get: function () {\n return this.getLocalizableStringText(\"otherPlaceHolder\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"otherPlaceHolder\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"locOtherPlaceHolder\", {\n get: function () {\n return this.getLocalizableString(\"otherPlaceHolder\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"otherErrorText\", {\n /**\n * The text that shows when the other item is choosed by the other input is empty.\n */\n get: function () {\n return this.getLocalizableStringText(\"otherErrorText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"otherRequiredError\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"otherErrorText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"locOtherErrorText\", {\n get: function () {\n return this.getLocalizableString(\"otherErrorText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"visibleChoices\", {\n /**\n * The list of items as they will be rendered. If needed items are sorted and the other item is added.\n * @see hasOther\n * @see choicesOrder\n * @see enabledChoices\n */\n get: function () {\n return this.getPropertyValue(\"visibleChoices\", []);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"enabledChoices\", {\n /**\n * The list of enabled items as they will be rendered. The disabled items are not included\n * @see hasOther\n * @see choicesOrder\n * @see visibleChoices\n */\n get: function () {\n var res = [];\n var items = this.visibleChoices;\n for (var i = 0; i < items.length; i++) {\n if (items[i].isEnabled)\n res.push(items[i]);\n }\n return res;\n },\n enumerable: false,\n configurable: true\n });\n QuestionSelectBase.prototype.updateVisibleChoices = function () {\n if (this.isLoadingFromJson)\n return;\n var newValue = new Array();\n var calcValue = this.calcVisibleChoices();\n if (!calcValue)\n calcValue = [];\n for (var i = 0; i < calcValue.length; i++) {\n newValue.push(calcValue[i]);\n }\n this.setPropertyValue(\"visibleChoices\", newValue);\n };\n QuestionSelectBase.prototype.calcVisibleChoices = function () {\n if (this.canUseFilteredChoices())\n return this.getFilteredChoices();\n var res = this.sortVisibleChoices(this.getFilteredChoices().slice());\n this.addToVisibleChoices(res, this.isAddDefaultItems);\n return res;\n };\n QuestionSelectBase.prototype.canUseFilteredChoices = function () {\n return (!this.isAddDefaultItems &&\n !this.hasNone &&\n !this.hasOther &&\n this.choicesOrder == \"none\");\n };\n QuestionSelectBase.prototype.addToVisibleChoices = function (items, isAddAll) {\n if (isAddAll) {\n if (!this.newItemValue) {\n this.newItemValue = new _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"](\"newitem\"); //TODO\n }\n items.push(this.newItemValue);\n }\n if (this.supportOther() && (isAddAll || this.hasOther)) {\n items.push(this.otherItem);\n }\n if (this.supportNone() && (isAddAll || this.hasNone)) {\n items.push(this.noneItem);\n }\n };\n /**\n * For internal use in SurveyJS Creator V2.\n */\n QuestionSelectBase.prototype.isItemInList = function (item) {\n if (item === this.otherItem)\n return this.hasOther;\n if (item === this.noneItem)\n return this.hasNone;\n if (item === this.newItemValue)\n return false;\n return true;\n };\n Object.defineProperty(QuestionSelectBase.prototype, \"isAddDefaultItems\", {\n get: function () {\n return (_settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].supportCreatorV2 && this.isDesignMode && !this.parentQuestion);\n },\n enumerable: false,\n configurable: true\n });\n QuestionSelectBase.prototype.getPlainData = function (options) {\n var _this = this;\n if (options === void 0) { options = {\n includeEmpty: true,\n includeQuestionTypes: false,\n }; }\n var questionPlainData = _super.prototype.getPlainData.call(this, options);\n if (!!questionPlainData) {\n var values = Array.isArray(this.value) ? this.value : [this.value];\n questionPlainData.isNode = true;\n questionPlainData.data = (questionPlainData.data || []).concat(values.map(function (dataValue, index) {\n var choice = _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].getItemByValue(_this.visibleChoices, dataValue);\n var choiceDataItem = {\n name: index,\n title: \"Choice\",\n value: dataValue,\n displayValue: _this.getChoicesDisplayValue(_this.visibleChoices, dataValue),\n getString: function (val) {\n return typeof val === \"object\" ? JSON.stringify(val) : val;\n },\n isNode: false,\n };\n if (!!choice) {\n (options.calculations || []).forEach(function (calculation) {\n choiceDataItem[calculation.propertyName] =\n choice[calculation.propertyName];\n });\n }\n if (_this.isOtherSelected && _this.otherItemValue === choice) {\n choiceDataItem.isOther = true;\n choiceDataItem.displayValue = _this.comment;\n }\n return choiceDataItem;\n }));\n }\n return questionPlainData;\n };\n /**\n * Returns the text for the current value. If the value is null then returns empty string. If 'other' is selected then returns the text for other value.\n */\n QuestionSelectBase.prototype.getDisplayValueCore = function (keysAsText, value) {\n return this.getChoicesDisplayValue(this.visibleChoices, value);\n };\n QuestionSelectBase.prototype.getDisplayValueEmpty = function () {\n return _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].getTextOrHtmlByValue(this.visibleChoices, undefined);\n };\n QuestionSelectBase.prototype.getChoicesDisplayValue = function (items, val) {\n if (val == this.otherItemValue.value)\n return this.comment ? this.comment : this.locOtherText.textOrHtml;\n var str = _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].getTextOrHtmlByValue(items, val);\n return str == \"\" && val ? val : str;\n };\n QuestionSelectBase.prototype.getFilteredChoices = function () {\n return this.filteredChoicesValue\n ? this.filteredChoicesValue\n : this.activeChoices;\n };\n Object.defineProperty(QuestionSelectBase.prototype, \"activeChoices\", {\n get: function () {\n var question = this.getQuestionWithChoices();\n if (!!question) {\n this.addIntoDependedQuestion(question);\n return this.getChoicesFromQuestion(question);\n }\n return this.choicesFromUrl ? this.choicesFromUrl : this.getChoices();\n },\n enumerable: false,\n configurable: true\n });\n QuestionSelectBase.prototype.getQuestionWithChoices = function () {\n if (!this.choicesFromQuestion || !this.survey)\n return null;\n var res = this.survey.getQuestionByName(this.choicesFromQuestion);\n return !!res && !!res.visibleChoices && res !== this ? res : null;\n };\n QuestionSelectBase.prototype.getChoicesFromQuestion = function (question) {\n var res = [];\n var isSelected = this.choicesFromQuestionMode == \"selected\"\n ? true\n : this.choicesFromQuestionMode == \"unselected\"\n ? false\n : undefined;\n var choices = question.visibleChoices;\n for (var i = 0; i < choices.length; i++) {\n if (this.isBuiltInChoice(choices[i], question))\n continue;\n if (isSelected === undefined) {\n res.push(choices[i]);\n continue;\n }\n var itemsSelected = question.isItemSelected(choices[i]);\n if ((itemsSelected && isSelected) || (!itemsSelected && !isSelected)) {\n res.push(choices[i]);\n }\n }\n return res;\n };\n Object.defineProperty(QuestionSelectBase.prototype, \"hasActiveChoices\", {\n get: function () {\n var choices = this.visibleChoices;\n if (!choices || choices.length == 0) {\n this.onVisibleChoicesChanged();\n choices = this.visibleChoices;\n }\n for (var i = 0; i < choices.length; i++) {\n if (!this.isBuiltInChoice(choices[i], this))\n return true;\n }\n return false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionSelectBase.prototype.isBuiltInChoice = function (item, question) {\n return (item === question.noneItem ||\n item === question.otherItem ||\n item === question.newItemValue);\n };\n QuestionSelectBase.prototype.getChoices = function () {\n return this.choices;\n };\n QuestionSelectBase.prototype.supportComment = function () {\n return true;\n };\n QuestionSelectBase.prototype.supportOther = function () {\n return this.isSupportProperty(\"hasOther\");\n };\n QuestionSelectBase.prototype.supportNone = function () {\n return this.isSupportProperty(\"hasNone\");\n };\n QuestionSelectBase.prototype.isSupportProperty = function (propName) {\n return (!this.isDesignMode ||\n _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].findProperty(this.getType(), propName).visible);\n };\n QuestionSelectBase.prototype.onCheckForErrors = function (errors, isOnValueChanged) {\n _super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged);\n if (!this.hasOther || !this.isOtherSelected || this.comment)\n return;\n errors.push(new _error__WEBPACK_IMPORTED_MODULE_5__[\"OtherEmptyError\"](this.otherErrorText, this));\n };\n QuestionSelectBase.prototype.setSurveyImpl = function (value) {\n _super.prototype.setSurveyImpl.call(this, value);\n this.runChoicesByUrl();\n if (this.isAddDefaultItems) {\n this.updateVisibleChoices();\n }\n };\n QuestionSelectBase.prototype.setSurveyCore = function (value) {\n _super.prototype.setSurveyCore.call(this, value);\n if (!!value && !!this.choicesFromQuestion) {\n this.onVisibleChoicesChanged();\n }\n };\n QuestionSelectBase.prototype.getStoreOthersAsComment = function () {\n if (this.isSettingDefaultValue)\n return false;\n return (this.storeOthersAsComment === true ||\n (this.storeOthersAsComment == \"default\" &&\n (this.survey != null ? this.survey.storeOthersAsComment : true)) ||\n (!this.choicesByUrl.isEmpty && !this.choicesFromUrl));\n };\n QuestionSelectBase.prototype.onSurveyLoad = function () {\n this.runChoicesByUrl();\n this.onVisibleChoicesChanged();\n _super.prototype.onSurveyLoad.call(this);\n };\n QuestionSelectBase.prototype.onAnyValueChanged = function (name) {\n _super.prototype.onAnyValueChanged.call(this, name);\n if (name != this.getValueName()) {\n this.runChoicesByUrl();\n }\n if (!!name && name == this.choicesFromQuestion) {\n this.onVisibleChoicesChanged();\n }\n };\n QuestionSelectBase.prototype.updateValueFromSurvey = function (newValue) {\n var newComment = \"\";\n if (this.hasOther &&\n !this.isRunningChoices &&\n !this.choicesByUrl.isRunning &&\n this.getStoreOthersAsComment()) {\n if (this.hasUnknownValue(newValue) && !this.getHasOther(newValue)) {\n newComment = this.getCommentFromValue(newValue);\n newValue = this.setOtherValueIntoValue(newValue);\n }\n else {\n newComment = this.data.getComment(this.getValueName());\n }\n }\n _super.prototype.updateValueFromSurvey.call(this, newValue);\n if (!!newComment) {\n this.setNewComment(newComment);\n }\n };\n QuestionSelectBase.prototype.getCommentFromValue = function (newValue) {\n return newValue;\n };\n QuestionSelectBase.prototype.setOtherValueIntoValue = function (newValue) {\n return this.otherItem.value;\n };\n QuestionSelectBase.prototype.runChoicesByUrl = function () {\n if (!this.choicesByUrl || this.isLoadingFromJson || this.isRunningChoices)\n return;\n var processor = this.surveyImpl\n ? this.surveyImpl.getTextProcessor()\n : this.textProcessor;\n if (!processor)\n processor = this.survey;\n if (!processor)\n return;\n this.isReadyValue = this.isChoicesLoaded || this.choicesByUrl.isEmpty;\n this.isRunningChoices = true;\n this.choicesByUrl.run(processor);\n this.isRunningChoices = false;\n };\n QuestionSelectBase.prototype.onBeforeSendRequest = function () {\n if (_settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].disableOnGettingChoicesFromWeb === true && !this.isReadOnly) {\n this.enableOnLoadingChoices = true;\n this.readOnly = true;\n }\n };\n QuestionSelectBase.prototype.onLoadChoicesFromUrl = function (array) {\n if (this.enableOnLoadingChoices) {\n this.readOnly = false;\n }\n if (!this.isReadOnly) {\n var errors = [];\n if (this.choicesByUrl && this.choicesByUrl.error) {\n errors.push(this.choicesByUrl.error);\n }\n this.errors = errors;\n }\n var newChoices = null;\n var checkCachedValuesOnExisting = true;\n if (this.isFirstLoadChoicesFromUrl &&\n !this.cachedValueForUrlRequests &&\n this.defaultValue) {\n this.cachedValueForUrlRequests = this.defaultValue;\n checkCachedValuesOnExisting = false;\n }\n if (this.isValueEmpty(this.cachedValueForUrlRequests)) {\n this.cachedValueForUrlRequests = this.value;\n }\n this.isFirstLoadChoicesFromUrl = false;\n var cachedValues = this.createCachedValueForUrlRequests(this.cachedValueForUrlRequests, checkCachedValuesOnExisting);\n if (array && (array.length > 0 || this.choicesByUrl.allowEmptyResponse)) {\n newChoices = new Array();\n _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].setData(newChoices, array);\n }\n if (!!newChoices) {\n for (var i = 0; i < newChoices.length; i++) {\n newChoices[i].locOwner = this;\n }\n }\n this.choicesFromUrl = newChoices;\n this.filterItems();\n this.onVisibleChoicesChanged();\n if (newChoices) {\n var newValue = this.updateCachedValueForUrlRequests(cachedValues, newChoices);\n if (!!newValue && !this.isReadOnly) {\n var hasChanged = !_helpers__WEBPACK_IMPORTED_MODULE_8__[\"Helpers\"].isTwoValueEquals(this.value, newValue.value);\n try {\n if (!this.isValueEmpty(newValue.value)) {\n this.allowNotifyValueChanged = false;\n this.setQuestionValue(undefined, true, false);\n }\n this.allowNotifyValueChanged = hasChanged;\n if (hasChanged) {\n this.value = newValue.value;\n }\n else {\n this.setQuestionValue(newValue.value);\n }\n }\n finally {\n this.allowNotifyValueChanged = true;\n }\n }\n }\n this.choicesLoaded();\n };\n QuestionSelectBase.prototype.createCachedValueForUrlRequests = function (val, checkOnExisting) {\n if (this.isValueEmpty(val))\n return null;\n if (Array.isArray(val)) {\n var res = [];\n for (var i = 0; i < val.length; i++) {\n res.push(this.createCachedValueForUrlRequests(val[i], true));\n }\n return res;\n }\n var isExists = checkOnExisting ? !this.hasUnknownValue(val) : true;\n return { value: val, isExists: isExists };\n };\n QuestionSelectBase.prototype.updateCachedValueForUrlRequests = function (val, newChoices) {\n if (this.isValueEmpty(val))\n return null;\n if (Array.isArray(val)) {\n var res = [];\n for (var i = 0; i < val.length; i++) {\n var updatedValue = this.updateCachedValueForUrlRequests(val[i], newChoices);\n if (updatedValue && !this.isValueEmpty(updatedValue.value)) {\n var newValue = updatedValue.value;\n var item = _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].getItemByValue(newChoices, updatedValue.value);\n if (!!item) {\n newValue = item.value;\n }\n res.push(newValue);\n }\n }\n return { value: res };\n }\n var value = val.isExists && this.hasUnknownValue(val.value) ? null : val.value;\n var item = _itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"].getItemByValue(newChoices, value);\n if (!!item) {\n value = item.value;\n }\n return { value: value };\n };\n QuestionSelectBase.prototype.updateChoicesDependedQuestions = function () {\n if (this.isUpdatingChoicesDependedQuestions)\n return;\n this.isUpdatingChoicesDependedQuestions = true;\n for (var i = 0; i < this.dependedQuestions.length; i++) {\n this.dependedQuestions[i].onVisibleChoicesChanged();\n this.dependedQuestions[i].updateChoicesDependedQuestions();\n }\n this.isUpdatingChoicesDependedQuestions = false;\n };\n QuestionSelectBase.prototype.onSurveyValueChanged = function (newValue) {\n _super.prototype.onSurveyValueChanged.call(this, newValue);\n if (this.isLoadingFromJson)\n return;\n this.updateChoicesDependedQuestions();\n };\n QuestionSelectBase.prototype.onVisibleChoicesChanged = function () {\n if (this.isLoadingFromJson)\n return;\n this.updateVisibleChoices();\n this.updateVisibilityBasedOnChoices();\n if (!!this.visibleChoicesChangedCallback) {\n this.visibleChoicesChangedCallback();\n }\n this.updateChoicesDependedQuestions();\n };\n QuestionSelectBase.prototype.updateVisibilityBasedOnChoices = function () {\n if (this.hideIfChoicesEmpty) {\n var filteredChoices = this.getFilteredChoices();\n this.visible = !filteredChoices || filteredChoices.length > 0;\n }\n };\n QuestionSelectBase.prototype.sortVisibleChoices = function (array) {\n var order = this.choicesOrder.toLowerCase();\n if (order == \"asc\")\n return this.sortArray(array, 1);\n if (order == \"desc\")\n return this.sortArray(array, -1);\n if (order == \"random\")\n return this.randomizeArray(array);\n return array;\n };\n QuestionSelectBase.prototype.sortArray = function (array, mult) {\n return array.sort(function (a, b) {\n if (a.calculatedText < b.calculatedText)\n return -1 * mult;\n if (a.calculatedText > b.calculatedText)\n return 1 * mult;\n return 0;\n });\n };\n QuestionSelectBase.prototype.randomizeArray = function (array) {\n return _helpers__WEBPACK_IMPORTED_MODULE_8__[\"Helpers\"].randomizeArray(array);\n };\n QuestionSelectBase.prototype.clearIncorrectValues = function () {\n if (this.keepIncorrectValues || this.isEmpty())\n return;\n if (!!this.survey &&\n this.survey.questionCountByValueName(this.getValueName()) > 1)\n return;\n if (!!this.choicesByUrl &&\n !this.choicesByUrl.isEmpty &&\n (!this.choicesFromUrl || this.choicesFromUrl.length == 0))\n return;\n if (this.clearIncorrectValuesCallback) {\n this.clearIncorrectValuesCallback();\n }\n else {\n this.clearIncorrectValuesCore();\n }\n };\n QuestionSelectBase.prototype.clearValueIfInvisible = function () {\n _super.prototype.clearValueIfInvisible.call(this);\n this.clearIncorrectValues();\n };\n /**\n * Returns true if item is selected\n * @param item checkbox or radio item value\n */\n QuestionSelectBase.prototype.isItemSelected = function (item) {\n return item.value === this.value;\n };\n QuestionSelectBase.prototype.clearDisabledValues = function () {\n if (!this.survey || !this.survey.clearValueOnDisableItems)\n return;\n this.clearDisabledValuesCore();\n };\n QuestionSelectBase.prototype.clearIncorrectValuesCore = function () {\n var val = this.value;\n if (this.canClearValueAnUnknow(val)) {\n this.clearValue();\n }\n };\n QuestionSelectBase.prototype.canClearValueAnUnknow = function (val) {\n if (!this.getStoreOthersAsComment() && this.isOtherSelected)\n return false;\n return this.hasUnknownValue(val, true, true, true);\n };\n QuestionSelectBase.prototype.clearDisabledValuesCore = function () {\n if (this.isValueDisabled(this.value)) {\n this.clearValue();\n }\n };\n QuestionSelectBase.prototype.clearUnusedValues = function () {\n _super.prototype.clearUnusedValues.call(this);\n if (!this.isOtherSelected && !this.hasComment) {\n this.comment = \"\";\n }\n };\n QuestionSelectBase.prototype.getColumnClass = function () {\n var columnClass = this.cssClasses.column;\n if (this.hasColumns) {\n columnClass += \" sv-q-column-\" + this.colCount;\n }\n return columnClass;\n };\n QuestionSelectBase.prototype.getItemIndex = function (item) {\n return this.visibleChoices.indexOf(item);\n };\n QuestionSelectBase.prototype.getItemClass = function (item) {\n var itemClass = this.cssClasses.item;\n var isDisabled = this.isReadOnly || !item.isEnabled;\n var isChecked = this.isItemSelected(item) ||\n (this.isOtherSelected && this.otherItem.value === item.value);\n var allowHover = !isDisabled && !isChecked && !(!!this.survey && this.survey.isDesignMode);\n var isNone = item === this.noneItem;\n if (!this.hasColumns) {\n itemClass +=\n this.colCount === 0\n ? \" \" + this.cssClasses.itemInline\n : \" sv-q-col-\" + this.colCount;\n }\n if (isDisabled && !!this.cssClasses.itemDisabled)\n itemClass += \" \" + this.cssClasses.itemDisabled;\n if (isChecked && !!this.cssClasses.itemChecked)\n itemClass += \" \" + this.cssClasses.itemChecked;\n if (allowHover && !!this.cssClasses.itemHover)\n itemClass += \" \" + this.cssClasses.itemHover;\n if (isNone && !!this.cssClasses.itemNone)\n itemClass += \" \" + this.cssClasses.itemNone;\n return itemClass;\n };\n QuestionSelectBase.prototype.getLabelClass = function (item) {\n var labelClass = this.cssClasses.label;\n if (this.isItemSelected(item)) {\n labelClass += \" \" + this.cssClasses.labelChecked;\n }\n return labelClass;\n };\n QuestionSelectBase.prototype.getControlLabelClass = function (item) {\n var controlLabelClass = this.cssClasses.controlLabel;\n if (this.isItemSelected(item)) {\n controlLabelClass += \" \" + this.cssClasses.controlLabelChecked;\n }\n return controlLabelClass;\n };\n Object.defineProperty(QuestionSelectBase.prototype, \"columns\", {\n get: function () {\n var columns = [];\n var colCount = this.colCount;\n if (this.hasColumns && this.visibleChoices.length > 0) {\n if (_settings__WEBPACK_IMPORTED_MODULE_9__[\"settings\"].showItemsInOrder == \"column\") {\n var prevIndex = 0;\n var leftElementsCount = this.visibleChoices.length % colCount;\n for (var i = 0; i < colCount; i++) {\n var column = [];\n for (var j = prevIndex; j < prevIndex + Math.floor(this.visibleChoices.length / colCount); j++) {\n column.push(this.visibleChoices[j]);\n }\n if (leftElementsCount > 0) {\n leftElementsCount--;\n column.push(this.visibleChoices[j]);\n j++;\n }\n prevIndex = j;\n columns.push(column);\n }\n }\n else {\n for (var i = 0; i < colCount; i++) {\n var column = [];\n for (var j = i; j < this.visibleChoices.length; j += colCount) {\n column.push(this.visibleChoices[j]);\n }\n columns.push(column);\n }\n }\n }\n return columns;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSelectBase.prototype, \"hasColumns\", {\n get: function () {\n return this.colCount > 1;\n },\n enumerable: false,\n configurable: true\n });\n QuestionSelectBase.prototype.choicesLoaded = function () {\n this.isChoicesLoaded = true;\n var oldIsReady = this.isReadyValue;\n this.isReadyValue = true;\n this.onReadyChanged &&\n this.onReadyChanged.fire(this, {\n question: this,\n isReady: true,\n oldIsReady: oldIsReady,\n });\n };\n QuestionSelectBase.prototype.getItemValueWrapperComponentName = function (item) {\n var survey = this.survey;\n if (survey) {\n return survey.getItemValueWrapperComponentName(item, this);\n }\n return _survey__WEBPACK_IMPORTED_MODULE_1__[\"SurveyModel\"].TemplateRendererComponentName;\n };\n QuestionSelectBase.prototype.getItemValueWrapperComponentData = function (item) {\n var survey = this.survey;\n if (survey) {\n return survey.getItemValueWrapperComponentData(item, this);\n }\n return item;\n };\n return QuestionSelectBase;\n}(_question__WEBPACK_IMPORTED_MODULE_2__[\"Question\"]));\n\n/**\n * A base class for checkbox and radiogroup questions. It introduced a colCount property.\n */\nvar QuestionCheckboxBase = /** @class */ (function (_super) {\n __extends(QuestionCheckboxBase, _super);\n function QuestionCheckboxBase(name) {\n return _super.call(this, name) || this;\n }\n Object.defineProperty(QuestionCheckboxBase.prototype, \"colCount\", {\n /**\n * The number of columns for radiogroup and checkbox questions. Items are rendred in one line if the value is 0.\n */\n get: function () {\n return this.getPropertyValue(\"colCount\", this.isFlowLayout ? 0 : 1);\n },\n set: function (value) {\n if (value < 0 || value > 5 || this.isFlowLayout)\n return;\n this.setPropertyValue(\"colCount\", value);\n this.fireCallback(this.colCountChangedCallback);\n },\n enumerable: false,\n configurable: true\n });\n QuestionCheckboxBase.prototype.onParentChanged = function () {\n _super.prototype.onParentChanged.call(this);\n if (this.isFlowLayout) {\n this.setPropertyValue(\"colCount\", null);\n }\n };\n QuestionCheckboxBase.prototype.onParentQuestionChanged = function () {\n this.onVisibleChoicesChanged();\n };\n QuestionCheckboxBase.prototype.getSearchableItemValueKeys = function (keys) {\n keys.push(\"choices\");\n };\n return QuestionCheckboxBase;\n}(QuestionSelectBase));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"selectbase\", [\n { name: \"hasComment:switch\", layout: \"row\" },\n {\n name: \"commentText\",\n dependsOn: \"hasComment\",\n visibleIf: function (obj) {\n return obj.hasComment;\n },\n serializationProperty: \"locCommentText\",\n layout: \"row\",\n },\n \"choicesFromQuestion:question_selectbase\",\n {\n name: \"choices:itemvalue[]\",\n baseValue: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"choices_Item\");\n },\n dependsOn: \"choicesFromQuestion\",\n visibleIf: function (obj) {\n return !obj.choicesFromQuestion;\n },\n },\n {\n name: \"choicesFromQuestionMode\",\n default: \"all\",\n choices: [\"all\", \"selected\", \"unselected\"],\n dependsOn: \"choicesFromQuestion\",\n visibleIf: function (obj) {\n return !!obj.choicesFromQuestion;\n },\n },\n {\n name: \"choicesOrder\",\n default: \"none\",\n choices: [\"none\", \"asc\", \"desc\", \"random\"],\n dependsOn: \"choicesFromQuestion\",\n visibleIf: function (obj) {\n return !obj.choicesFromQuestion;\n },\n },\n {\n name: \"choicesByUrl:restfull\",\n className: \"ChoicesRestful\",\n onGetValue: function (obj) {\n return obj.choicesByUrl.getData();\n },\n onSetValue: function (obj, value) {\n obj.choicesByUrl.setData(value);\n },\n },\n \"hideIfChoicesEmpty:boolean\",\n {\n name: \"choicesVisibleIf:condition\",\n dependsOn: \"choicesFromQuestion\",\n visibleIf: function (obj) {\n return !obj.choicesFromQuestion;\n },\n },\n {\n name: \"choicesEnableIf:condition\",\n dependsOn: \"choicesFromQuestion\",\n visibleIf: function (obj) {\n return !obj.choicesFromQuestion;\n },\n },\n \"hasOther:boolean\",\n \"hasNone:boolean\",\n {\n name: \"otherPlaceHolder\",\n serializationProperty: \"locOtherPlaceHolder\",\n dependsOn: \"hasOther\",\n visibleIf: function (obj) {\n return obj.hasOther;\n },\n },\n {\n name: \"noneText\",\n serializationProperty: \"locNoneText\",\n dependsOn: \"hasNone\",\n visibleIf: function (obj) {\n return obj.hasNone;\n },\n },\n {\n name: \"otherText\",\n serializationProperty: \"locOtherText\",\n dependsOn: \"hasOther\",\n visibleIf: function (obj) {\n return obj.hasOther;\n },\n },\n {\n name: \"otherErrorText\",\n serializationProperty: \"locOtherErrorText\",\n dependsOn: \"hasOther\",\n visibleIf: function (obj) {\n return obj.hasOther;\n },\n },\n {\n name: \"storeOthersAsComment\",\n default: \"default\",\n choices: [\"default\", true, false],\n visible: false,\n },\n], null, \"question\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"checkboxbase\", [\n {\n name: \"colCount:number\",\n default: 1,\n choices: [0, 1, 2, 3, 4, 5],\n layout: \"row\",\n },\n], null, \"selectbase\");\n\n\n/***/ }),\n\n/***/ \"./src/question_boolean.ts\":\n/*!*********************************!*\\\n !*** ./src/question_boolean.ts ***!\n \\*********************************/\n/*! exports provided: QuestionBooleanModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionBooleanModel\", function() { return QuestionBooleanModel; });\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n\n\n\n\n/**\n * A Model for a boolean question.\n */\nvar QuestionBooleanModel = /** @class */ (function (_super) {\n __extends(QuestionBooleanModel, _super);\n function QuestionBooleanModel(name) {\n var _this = _super.call(this, name) || this;\n _this.createLocalizableString(\"labelFalse\", _this, true);\n _this.createLocalizableString(\"labelTrue\", _this, true);\n _this.locLabelFalse.onGetTextCallback = function (text) {\n return !!text\n ? text\n : _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(\"booleanUncheckedLabel\");\n };\n _this.locLabelTrue.onGetTextCallback = function (text) {\n return !!text\n ? text\n : _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(\"booleanCheckedLabel\");\n };\n return _this;\n }\n QuestionBooleanModel.prototype.getType = function () {\n return \"boolean\";\n };\n QuestionBooleanModel.prototype.isLayoutTypeSupported = function (layoutType) {\n return true;\n };\n QuestionBooleanModel.prototype.supportGoNextPageAutomatic = function () {\n return this.renderAs !== \"checkbox\";\n };\n Object.defineProperty(QuestionBooleanModel.prototype, \"isIndeterminate\", {\n /**\n * Returns true if the question check will be rendered in indeterminate mode. value is empty.\n */\n get: function () {\n return this.isEmpty();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionBooleanModel.prototype, \"hasTitle\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionBooleanModel.prototype, \"checkedValue\", {\n /**\n * Get/set question value in 3 modes: indeterminate (value is empty), true (check is set) and false (check is unset).\n * @see valueTrue\n * @see valueFalse\n */\n get: function () {\n if (this.isEmpty())\n return null;\n return this.value == this.getValueTrue();\n },\n set: function (val) {\n if (this.isReadOnly) {\n return;\n }\n this.setCheckedValue(val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionBooleanModel.prototype.setCheckedValue = function (val) {\n if (this.isValueEmpty(val)) {\n this.value = null;\n }\n else {\n this.value = val == true ? this.getValueTrue() : this.getValueFalse();\n }\n };\n Object.defineProperty(QuestionBooleanModel.prototype, \"defaultValue\", {\n /**\n * Set the default state of the check: \"indeterminate\" - default (value is empty/null), \"true\" - value equals valueTrue or true, \"false\" - value equals valueFalse or false.\n */\n get: function () {\n return this.getPropertyValue(\"defaultValue\");\n },\n set: function (val) {\n if (val === true)\n val = \"true\";\n if (val === false)\n val = \"false\";\n this.setPropertyValue(\"defaultValue\", val);\n this.updateValueWithDefaults();\n },\n enumerable: false,\n configurable: true\n });\n QuestionBooleanModel.prototype.getDefaultValue = function () {\n if (this.defaultValue == \"indeterminate\")\n return null;\n if (this.defaultValue === undefined)\n return null;\n return this.defaultValue == \"true\"\n ? this.getValueTrue()\n : this.getValueFalse();\n };\n Object.defineProperty(QuestionBooleanModel.prototype, \"locTitle\", {\n get: function () {\n return this.showTitle || this.isValueEmpty(this.locLabel.text)\n ? this.getLocalizableString(\"title\")\n : this.locLabel;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionBooleanModel.prototype, \"locDisplayLabel\", {\n get: function () {\n if (this.locLabel.text)\n return this.locLabel;\n return this.showTitle ? this.locLabel : this.locTitle;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionBooleanModel.prototype, \"labelTrue\", {\n /**\n * Set this property, if you want to have a different label for state when check is set.\n */\n get: function () {\n return this.getLocalizableStringText(\"labelTrue\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"labelTrue\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionBooleanModel.prototype, \"locLabelTrue\", {\n get: function () {\n return this.getLocalizableString(\"labelTrue\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionBooleanModel.prototype, \"labelFalse\", {\n /**\n * Set this property, if you want to have a different label for state when check is unset.\n */\n get: function () {\n return this.getLocalizableStringText(\"labelFalse\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"labelFalse\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionBooleanModel.prototype, \"locLabelFalse\", {\n get: function () {\n return this.getLocalizableString(\"labelFalse\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionBooleanModel.prototype.getValueTrue = function () {\n return this.valueTrue ? this.valueTrue : true;\n };\n QuestionBooleanModel.prototype.getValueFalse = function () {\n return this.valueFalse ? this.valueFalse : false;\n };\n QuestionBooleanModel.prototype.setDefaultValue = function () {\n if (this.defaultValue == \"true\")\n this.setCheckedValue(true);\n if (this.defaultValue == \"false\")\n this.setCheckedValue(false);\n if (this.defaultValue == \"indeterminate\")\n this.setCheckedValue(null);\n };\n QuestionBooleanModel.prototype.getDisplayValueCore = function (keysAsText, value) {\n if (value == this.getValueTrue())\n return this.locLabelTrue.textOrHtml;\n return this.locLabelFalse.textOrHtml;\n };\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ localizable: true })\n ], QuestionBooleanModel.prototype, \"label\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], QuestionBooleanModel.prototype, \"showTitle\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], QuestionBooleanModel.prototype, \"valueTrue\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])()\n ], QuestionBooleanModel.prototype, \"valueFalse\", void 0);\n return QuestionBooleanModel;\n}(_question__WEBPACK_IMPORTED_MODULE_2__[\"Question\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"boolean\", [\n { name: \"label:text\", serializationProperty: \"locLabel\" },\n {\n name: \"labelTrue:text\",\n serializationProperty: \"locLabelTrue\",\n },\n {\n name: \"labelFalse:text\",\n serializationProperty: \"locLabelFalse\",\n },\n \"showTitle:boolean\",\n \"valueTrue\",\n \"valueFalse\",\n { name: \"renderAs\", default: \"default\", visible: false },\n], function () {\n return new QuestionBooleanModel(\"\");\n}, \"question\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"boolean\", function (name) {\n return new QuestionBooleanModel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_buttongroup.ts\":\n/*!*************************************!*\\\n !*** ./src/question_buttongroup.ts ***!\n \\*************************************/\n/*! exports provided: ButtonGroupItemValue, QuestionButtonGroupModel, ButtonGroupItemModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ButtonGroupItemValue\", function() { return ButtonGroupItemValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionButtonGroupModel\", function() { return QuestionButtonGroupModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ButtonGroupItemModel\", function() { return ButtonGroupItemModel; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\n/* harmony import */ var _question_baseselect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_baseselect */ \"./src/question_baseselect.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n\n\n\nvar ButtonGroupItemValue = /** @class */ (function (_super) {\n __extends(ButtonGroupItemValue, _super);\n function ButtonGroupItemValue(value, text, typeName) {\n if (text === void 0) { text = null; }\n if (typeName === void 0) { typeName = \"buttongroupitemvalue\"; }\n var _this = _super.call(this, value, text, typeName) || this;\n _this.typeName = typeName;\n return _this;\n }\n ButtonGroupItemValue.prototype.getType = function () {\n return !!this.typeName ? this.typeName : \"buttongroupitemvalue\";\n };\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"property\"])()\n ], ButtonGroupItemValue.prototype, \"iconName\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"property\"])()\n ], ButtonGroupItemValue.prototype, \"iconSize\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"property\"])()\n ], ButtonGroupItemValue.prototype, \"showCaption\", void 0);\n return ButtonGroupItemValue;\n}(_itemvalue__WEBPACK_IMPORTED_MODULE_1__[\"ItemValue\"]));\n\n/**\n * A Model for a button group question.\n */\nvar QuestionButtonGroupModel = /** @class */ (function (_super) {\n __extends(QuestionButtonGroupModel, _super);\n function QuestionButtonGroupModel(name) {\n return _super.call(this, name) || this;\n }\n QuestionButtonGroupModel.prototype.getType = function () {\n return \"buttongroup\";\n };\n QuestionButtonGroupModel.prototype.getItemValueType = function () {\n return \"buttongroupitemvalue\";\n };\n QuestionButtonGroupModel.prototype.supportOther = function () {\n return false;\n };\n return QuestionButtonGroupModel;\n}(_question_baseselect__WEBPACK_IMPORTED_MODULE_2__[\"QuestionCheckboxBase\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"buttongroup\", [\n {\n name: \"choices:buttongroupitemvalue[]\",\n },\n], function () {\n return new QuestionButtonGroupModel(\"\");\n}, \"checkboxbase\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"buttongroupitemvalue\", [\n { name: \"showCaption:boolean\", default: true },\n { name: \"iconName:text\" },\n { name: \"iconSize:number\" },\n], function (value) { return new ButtonGroupItemValue(value); }, \"itemvalue\");\n// QuestionFactory.Instance.registerQuestion(\"buttongroup\", name => {\n// var q = new QuestionButtonGroupModel(name);\n// q.choices = QuestionFactory.DefaultChoices;\n// return q;\n// });\nvar ButtonGroupItemModel = /** @class */ (function () {\n function ButtonGroupItemModel(question, item, index) {\n this.question = question;\n this.item = item;\n this.index = index;\n }\n Object.defineProperty(ButtonGroupItemModel.prototype, \"value\", {\n get: function () {\n return this.item.value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"iconName\", {\n get: function () {\n return this.item.iconName;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"iconSize\", {\n get: function () {\n return this.item.iconSize || 24;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"caption\", {\n get: function () {\n return this.item.locText;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"showCaption\", {\n get: function () {\n return this.item.showCaption || this.item.showCaption === undefined;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"isRequired\", {\n get: function () {\n return this.question.isRequired;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"selected\", {\n get: function () {\n return this.question.isItemSelected(this.item);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"readOnly\", {\n get: function () {\n return this.question.isInputReadOnly || !this.item.isEnabled;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"name\", {\n get: function () {\n return this.question.name + \"_\" + this.question.id;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"id\", {\n get: function () {\n return this.question.inputId + \"_\" + this.index;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"hasErrors\", {\n get: function () {\n return this.question.errors.length > 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"describedBy\", {\n get: function () {\n return this.question.errors.length > 0\n ? this.question.id + \"_errors\"\n : null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"labelClass\", {\n get: function () {\n var css = this.question.cssClasses.item;\n if (this.selected) {\n css += \" \" + this.question.cssClasses.itemSelected;\n }\n if (!this.readOnly && !this.selected) {\n css += \" \" + this.question.cssClasses.itemHover;\n }\n if (this.question.isReadOnly || !this.item.isEnabled) {\n css += \" \" + this.question.cssClasses.itemDisabled;\n }\n return css;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ButtonGroupItemModel.prototype, \"css\", {\n get: function () {\n return {\n label: this.labelClass,\n icon: this.question.cssClasses.itemIcon,\n control: this.question.cssClasses.itemControl,\n caption: this.question.cssClasses.itemCaption,\n decorator: this.question.cssClasses.itemDecorator,\n };\n },\n enumerable: false,\n configurable: true\n });\n ButtonGroupItemModel.prototype.onChange = function () {\n this.question.renderedValue = this.item.value;\n };\n return ButtonGroupItemModel;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/question_checkbox.ts\":\n/*!**********************************!*\\\n !*** ./src/question_checkbox.ts ***!\n \\**********************************/\n/*! exports provided: QuestionCheckboxModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionCheckboxModel\", function() { return QuestionCheckboxModel; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _question_baseselect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_baseselect */ \"./src/question_baseselect.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n/**\n * A Model for a checkbox question\n */\nvar QuestionCheckboxModel = /** @class */ (function (_super) {\n __extends(QuestionCheckboxModel, _super);\n function QuestionCheckboxModel(name) {\n var _this = _super.call(this, name) || this;\n _this.selectAllItemValue = new _itemvalue__WEBPACK_IMPORTED_MODULE_4__[\"ItemValue\"](\"selectall\");\n _this.invisibleOldValues = {};\n _this.isChangingValueOnClearIncorrect = false;\n var selectAllItemText = _this.createLocalizableString(\"selectAllText\", _this, true);\n selectAllItemText.onGetTextCallback = function (text) {\n return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_5__[\"surveyLocalization\"].getString(\"selectAllItemText\");\n };\n _this.selectAllItem.locOwner = _this;\n _this.selectAllItem.setLocText(selectAllItemText);\n _this.registerFunctionOnPropertiesValueChanged([\"hasSelectAll\", \"selectAllText\"], function () {\n _this.onVisibleChoicesChanged();\n });\n return _this;\n }\n Object.defineProperty(QuestionCheckboxModel.prototype, \"ariaRole\", {\n get: function () {\n return \"group\";\n },\n enumerable: false,\n configurable: true\n });\n QuestionCheckboxModel.prototype.getType = function () {\n return \"checkbox\";\n };\n QuestionCheckboxModel.prototype.onCreating = function () {\n _super.prototype.onCreating.call(this);\n this.createNewArray(\"renderedValue\");\n this.createNewArray(\"value\");\n };\n QuestionCheckboxModel.prototype.getFirstInputElementId = function () {\n return this.inputId + \"_0\";\n };\n Object.defineProperty(QuestionCheckboxModel.prototype, \"selectAllItem\", {\n /**\n * Returns the select all item. By using this property, you may change programmatically it's value and text.\n * @see hasSelectAll\n */\n get: function () {\n return this.selectAllItemValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionCheckboxModel.prototype, \"selectAllText\", {\n /**\n * Use this property to set the different text for Select All item.\n */\n get: function () {\n return this.getLocalizableStringText(\"selectAllText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_5__[\"surveyLocalization\"].getString(\"selectAllItemText\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"selectAllText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionCheckboxModel.prototype, \"locSelectAllText\", {\n get: function () {\n return this.getLocalizableString(\"selectAllText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionCheckboxModel.prototype, \"hasSelectAll\", {\n /**\n * Set this property to true, to show the \"Select All\" item on the top. If end-user checks this item, then all items are checked.\n */\n get: function () {\n return this.getPropertyValue(\"hasSelectAll\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"hasSelectAll\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionCheckboxModel.prototype, \"isAllSelected\", {\n /**\n * Returns true if all items are selected\n * @see toggleSelectAll\n */\n get: function () {\n var val = this.value;\n if (!val || !Array.isArray(val))\n return false;\n if (this.isItemSelected(this.noneItem))\n return false;\n var allItemCount = this.visibleChoices.length;\n if (this.hasOther)\n allItemCount--;\n if (this.hasNone)\n allItemCount--;\n if (this.hasSelectAll)\n allItemCount--;\n var selectedCount = val.length;\n if (this.isItemSelected(this.otherItem))\n selectedCount--;\n return selectedCount === allItemCount;\n },\n set: function (val) {\n if (val) {\n this.selectAll();\n }\n else {\n this.clearValue();\n }\n },\n enumerable: false,\n configurable: true\n });\n /**\n * It will select all items, except other and none. If all items have been already selected then it will clear the value\n * @see isAllSelected\n * @see selectAll\n */\n QuestionCheckboxModel.prototype.toggleSelectAll = function () {\n this.isAllSelected = !this.isAllSelected;\n };\n /**\n * Select all items, except other and none.\n */\n QuestionCheckboxModel.prototype.selectAll = function () {\n var val = [];\n for (var i = 0; i < this.visibleChoices.length; i++) {\n var item = this.visibleChoices[i];\n if (item === this.noneItem ||\n item === this.otherItem ||\n item === this.selectAllItem)\n continue;\n val.push(item.value);\n }\n this.value = val;\n };\n /**\n * Returns true if item is checked\n * @param item checkbox item value\n */\n QuestionCheckboxModel.prototype.isItemSelected = function (item) {\n if (item === this.selectAllItem)\n return this.isAllSelected;\n var val = this.renderedValue;\n if (!val || !Array.isArray(val))\n return false;\n for (var i = 0; i < val.length; i++) {\n if (_helpers__WEBPACK_IMPORTED_MODULE_3__[\"Helpers\"].isTwoValueEquals(val[i], item.value))\n return true;\n }\n return false;\n };\n Object.defineProperty(QuestionCheckboxModel.prototype, \"maxSelectedChoices\", {\n /**\n * Set this property different to 0 to limit the number of selected choices in the checkbox.\n */\n get: function () {\n return this.getPropertyValue(\"maxSelectedChoices\", 0);\n },\n set: function (val) {\n if (val < 0)\n val = 0;\n this.setPropertyValue(\"maxSelectedChoices\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionCheckboxModel.prototype, \"selectedItems\", {\n /**\n * Return the selected items in the checkbox. Returns empty array if the value is empty\n */\n get: function () {\n if (this.isEmpty())\n return [];\n var val = this.value;\n var res = [];\n for (var i = 0; i < val.length; i++) {\n res.push(_itemvalue__WEBPACK_IMPORTED_MODULE_4__[\"ItemValue\"].getItemByValue(this.visibleChoices, val[i]));\n }\n return res;\n },\n enumerable: false,\n configurable: true\n });\n QuestionCheckboxModel.prototype.onEnableItemCallBack = function (item) {\n if (!this.shouldCheckMaxSelectedChoices())\n return true;\n return this.isItemSelected(item);\n };\n QuestionCheckboxModel.prototype.onAfterRunItemsEnableCondition = function () {\n if (this.maxSelectedChoices < 1)\n return;\n if (this.hasSelectAll) {\n this.selectAllItem.setIsEnabled(this.maxSelectedChoices >= this.activeChoices.length);\n }\n if (this.hasOther) {\n this.otherItem.setIsEnabled(!this.shouldCheckMaxSelectedChoices() || this.isOtherSelected);\n }\n };\n QuestionCheckboxModel.prototype.shouldCheckMaxSelectedChoices = function () {\n if (this.maxSelectedChoices < 1)\n return false;\n var val = this.value;\n var len = !Array.isArray(val) ? 0 : val.length;\n return len >= this.maxSelectedChoices;\n };\n QuestionCheckboxModel.prototype.getItemClass = function (item) {\n var val = this.value; //trigger dependencies from koValue for knockout\n var itemClass = _super.prototype.getItemClass.call(this, item);\n var isSelectAll = item === this.selectAllItem;\n if (isSelectAll && !!this.cssClasses.itemSelectAll)\n itemClass += \" \" + this.cssClasses.itemSelectAll;\n return itemClass;\n };\n QuestionCheckboxModel.prototype.setNewValue = function (newValue) {\n if (!this.isChangingValueOnClearIncorrect) {\n this.invisibleOldValues = [];\n }\n newValue = this.valueFromData(newValue);\n var value = this.value;\n if (!newValue)\n newValue = [];\n if (!value)\n value = [];\n if (_helpers__WEBPACK_IMPORTED_MODULE_3__[\"Helpers\"].isTwoValueEquals(value, newValue))\n return;\n if (this.hasNone) {\n var prevNoneIndex = this.noneIndexInArray(value);\n var newNoneIndex = this.noneIndexInArray(newValue);\n if (prevNoneIndex > -1) {\n if (newNoneIndex > -1 && newValue.length > 1) {\n newValue.splice(newNoneIndex, 1);\n }\n }\n else {\n if (newNoneIndex > -1) {\n newValue.splice(0, newValue.length);\n newValue.push(this.noneItem.value);\n }\n }\n }\n _super.prototype.setNewValue.call(this, this.rendredValueToData(newValue));\n };\n QuestionCheckboxModel.prototype.getIsMultipleValue = function () {\n return true;\n };\n QuestionCheckboxModel.prototype.getCommentFromValue = function (newValue) {\n var ind = this.getFirstUnknownIndex(newValue);\n if (ind < 0)\n return \"\";\n return newValue[ind];\n };\n QuestionCheckboxModel.prototype.setOtherValueIntoValue = function (newValue) {\n var ind = this.getFirstUnknownIndex(newValue);\n if (ind < 0)\n return newValue;\n newValue.splice(ind, 1, this.otherItem.value);\n return newValue;\n };\n QuestionCheckboxModel.prototype.getFirstUnknownIndex = function (newValue) {\n if (!Array.isArray(newValue))\n return -1;\n for (var i = 0; i < newValue.length; i++) {\n if (this.hasUnknownValue(newValue[i]))\n return i;\n }\n return -1;\n };\n QuestionCheckboxModel.prototype.noneIndexInArray = function (val) {\n if (!val || !Array.isArray(val))\n return -1;\n var noneValue = this.noneItem.value;\n for (var i = 0; i < val.length; i++) {\n if (val[i] == noneValue)\n return i;\n }\n return -1;\n };\n QuestionCheckboxModel.prototype.canUseFilteredChoices = function () {\n return !this.hasSelectAll && _super.prototype.canUseFilteredChoices.call(this);\n };\n QuestionCheckboxModel.prototype.supportSelectAll = function () {\n return this.isSupportProperty(\"hasSelectAll\");\n };\n QuestionCheckboxModel.prototype.addToVisibleChoices = function (items, isAddAll) {\n if (this.supportSelectAll() && (isAddAll || this.hasSelectAll)) {\n items.unshift(this.selectAllItem);\n }\n _super.prototype.addToVisibleChoices.call(this, items, isAddAll);\n };\n QuestionCheckboxModel.prototype.isBuiltInChoice = function (item, question) {\n return (item === question.selectAllItem ||\n _super.prototype.isBuiltInChoice.call(this, item, question));\n };\n /**\n * For internal use in SurveyJS Creator V2.\n */\n QuestionCheckboxModel.prototype.isItemInList = function (item) {\n if (item == this.selectAllItem)\n return this.hasSelectAll;\n return _super.prototype.isItemInList.call(this, item);\n };\n QuestionCheckboxModel.prototype.getDisplayValueCore = function (keysAsText, value) {\n if (!Array.isArray(value))\n return _super.prototype.getDisplayValueCore.call(this, keysAsText, value);\n var items = this.visibleChoices;\n var str = \"\";\n for (var i = 0; i < value.length; i++) {\n var valStr = this.getChoicesDisplayValue(items, value[i]);\n if (valStr) {\n if (str)\n str += \", \";\n str += valStr;\n }\n }\n return str;\n };\n QuestionCheckboxModel.prototype.clearIncorrectValuesCore = function () {\n this.clearIncorrectAndDisabledValues(false);\n };\n QuestionCheckboxModel.prototype.clearDisabledValuesCore = function () {\n this.clearIncorrectAndDisabledValues(true);\n };\n QuestionCheckboxModel.prototype.clearIncorrectAndDisabledValues = function (clearDisabled) {\n var val = this.value;\n var hasChanged = false;\n var restoredValues = this.restoreValuesFromInvisible();\n if (!val && restoredValues.length == 0)\n return;\n if (!Array.isArray(val) || val.length == 0) {\n this.isChangingValueOnClearIncorrect = true;\n if (!clearDisabled) {\n if (this.hasComment) {\n this.value = null;\n }\n else {\n this.clearValue();\n }\n }\n this.isChangingValueOnClearIncorrect = false;\n if (restoredValues.length == 0)\n return;\n val = [];\n }\n var newValue = [];\n for (var i = 0; i < val.length; i++) {\n var isUnkown = this.canClearValueAnUnknow(val[i]);\n if ((!clearDisabled && !isUnkown) ||\n (clearDisabled && !this.isValueDisabled(val[i]))) {\n newValue.push(val[i]);\n }\n else {\n hasChanged = true;\n if (isUnkown) {\n this.invisibleOldValues[val[i]] = true;\n }\n }\n }\n for (var i = 0; i < restoredValues.length; i++) {\n newValue.push(restoredValues[i]);\n hasChanged = true;\n }\n if (!hasChanged)\n return;\n this.isChangingValueOnClearIncorrect = true;\n if (newValue.length == 0) {\n this.clearValue();\n }\n else {\n this.value = newValue;\n }\n this.isChangingValueOnClearIncorrect = false;\n };\n QuestionCheckboxModel.prototype.restoreValuesFromInvisible = function () {\n var res = [];\n var visItems = this.visibleChoices;\n for (var i = 0; i < visItems.length; i++) {\n var val = visItems[i].value;\n if (this.invisibleOldValues[val]) {\n res.push(val);\n delete this.invisibleOldValues[val];\n }\n }\n return res;\n };\n QuestionCheckboxModel.prototype.getConditionJson = function (operator, path) {\n if (operator === void 0) { operator = null; }\n if (path === void 0) { path = null; }\n var json = _super.prototype.getConditionJson.call(this);\n if (operator == \"contains\" || operator == \"notcontains\") {\n json[\"type\"] = \"radiogroup\";\n }\n return json;\n };\n QuestionCheckboxModel.prototype.isAnswerCorrect = function () {\n return _helpers__WEBPACK_IMPORTED_MODULE_3__[\"Helpers\"].isArrayContainsEqual(this.value, this.correctAnswer);\n };\n QuestionCheckboxModel.prototype.setDefaultValueWithOthers = function () {\n this.value = this.renderedValueFromDataCore(this.defaultValue);\n };\n QuestionCheckboxModel.prototype.getHasOther = function (val) {\n if (!val || !Array.isArray(val))\n return false;\n return val.indexOf(this.otherItem.value) >= 0;\n };\n QuestionCheckboxModel.prototype.valueFromData = function (val) {\n if (!val)\n return val;\n if (!Array.isArray(val))\n return [_super.prototype.valueFromData.call(this, val)];\n var value = [];\n for (var i = 0; i < val.length; i++) {\n var choiceitem = _itemvalue__WEBPACK_IMPORTED_MODULE_4__[\"ItemValue\"].getItemByValue(this.activeChoices, val[i]);\n if (!!choiceitem) {\n value.push(choiceitem.value);\n }\n else {\n value.push(val[i]);\n }\n }\n return value;\n };\n QuestionCheckboxModel.prototype.renderedValueFromDataCore = function (val) {\n if (!val || !Array.isArray(val))\n val = [];\n if (!this.hasActiveChoices)\n return val;\n for (var i = 0; i < val.length; i++) {\n if (val[i] == this.otherItem.value)\n return val;\n if (this.hasUnknownValue(val[i], true, false)) {\n this.comment = val[i];\n var newVal = val.slice();\n newVal[i] = this.otherItem.value;\n return newVal;\n }\n }\n return val;\n };\n QuestionCheckboxModel.prototype.rendredValueToDataCore = function (val) {\n if (!val || !val.length)\n return val;\n for (var i = 0; i < val.length; i++) {\n if (val[i] == this.otherItem.value) {\n if (this.getQuestionComment()) {\n var newVal = val.slice();\n newVal[i] = this.getQuestionComment();\n return newVal;\n }\n }\n }\n return val;\n };\n return QuestionCheckboxModel;\n}(_question_baseselect__WEBPACK_IMPORTED_MODULE_2__[\"QuestionCheckboxBase\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"checkbox\", [\n \"hasSelectAll:boolean\",\n { name: \"maxSelectedChoices:number\", default: 0 },\n { name: \"selectAllText\", serializationProperty: \"locSelectAllText\" },\n], function () {\n return new QuestionCheckboxModel(\"\");\n}, \"checkboxbase\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].Instance.registerQuestion(\"checkbox\", function (name) {\n var q = new QuestionCheckboxModel(name);\n q.choices = _questionfactory__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].DefaultChoices;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_comment.ts\":\n/*!*********************************!*\\\n !*** ./src/question_comment.ts ***!\n \\*********************************/\n/*! exports provided: QuestionCommentModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionCommentModel\", function() { return QuestionCommentModel; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _question_textbase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_textbase */ \"./src/question_textbase.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n/**\n * A Model for a comment question\n */\nvar QuestionCommentModel = /** @class */ (function (_super) {\n __extends(QuestionCommentModel, _super);\n function QuestionCommentModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Object.defineProperty(QuestionCommentModel.prototype, \"rows\", {\n /**\n * The html rows attribute.\n */\n get: function () {\n return this.getPropertyValue(\"rows\");\n },\n set: function (val) {\n this.setPropertyValue(\"rows\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionCommentModel.prototype, \"cols\", {\n /**\n * The html cols attribute.\n */\n get: function () {\n return this.getPropertyValue(\"cols\");\n },\n set: function (val) {\n this.setPropertyValue(\"cols\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionCommentModel.prototype.getType = function () {\n return \"comment\";\n };\n return QuestionCommentModel;\n}(_question_textbase__WEBPACK_IMPORTED_MODULE_2__[\"QuestionTextBase\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"comment\", [\n { name: \"maxLength:number\", default: -1 },\n { name: \"cols:number\", default: 50 },\n { name: \"rows:number\", default: 4 },\n { name: \"placeHolder\", serializationProperty: \"locPlaceHolder\" },\n {\n name: \"textUpdateMode\",\n default: \"default\",\n choices: [\"default\", \"onBlur\", \"onTyping\"],\n },\n], function () {\n return new QuestionCommentModel(\"\");\n}, \"textbase\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].Instance.registerQuestion(\"comment\", function (name) {\n return new QuestionCommentModel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_custom.ts\":\n/*!********************************!*\\\n !*** ./src/question_custom.ts ***!\n \\********************************/\n/*! exports provided: ComponentQuestionJSON, ComponentCollection, QuestionCustomModelBase, QuestionCustomModel, QuestionCompositeModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ComponentQuestionJSON\", function() { return ComponentQuestionJSON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ComponentCollection\", function() { return ComponentCollection; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustomModelBase\", function() { return QuestionCustomModelBase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionCustomModel\", function() { return QuestionCustomModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionCompositeModel\", function() { return QuestionCompositeModel; });\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./survey-element */ \"./src/survey-element.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _textPreProcessor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./textPreProcessor */ \"./src/textPreProcessor.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\nvar ComponentQuestionJSON = /** @class */ (function () {\n function ComponentQuestionJSON(name, json) {\n this.name = name;\n this.json = json;\n var self = this;\n _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(name, [], function (json) {\n return ComponentCollection.Instance.createQuestion(!!json ? json.name : \"\", self);\n }, \"question\");\n this.onInit();\n }\n ComponentQuestionJSON.prototype.onInit = function () {\n if (!this.json.onInit)\n return;\n this.json.onInit();\n };\n ComponentQuestionJSON.prototype.onCreated = function (question) {\n if (!this.json.onCreated)\n return;\n this.json.onCreated(question);\n };\n ComponentQuestionJSON.prototype.onLoaded = function (question) {\n if (!this.json.onLoaded)\n return;\n this.json.onLoaded(question);\n };\n ComponentQuestionJSON.prototype.onAfterRender = function (question, htmlElement) {\n if (!this.json.onAfterRender)\n return;\n this.json.onAfterRender(question, htmlElement);\n };\n ComponentQuestionJSON.prototype.onAfterRenderContentElement = function (question, element, htmlElement) {\n if (!this.json.onAfterRenderContentElement)\n return;\n this.json.onAfterRenderContentElement(question, element, htmlElement);\n };\n ComponentQuestionJSON.prototype.onPropertyChanged = function (question, propertyName, newValue) {\n if (!this.json.onPropertyChanged)\n return;\n this.json.onPropertyChanged(question, propertyName, newValue);\n };\n ComponentQuestionJSON.prototype.onValueChanged = function (question, name, newValue) {\n if (!this.json.onValueChanged)\n return;\n this.json.onValueChanged(question, name, newValue);\n };\n ComponentQuestionJSON.prototype.onItemValuePropertyChanged = function (question, item, propertyName, name, newValue) {\n if (!this.json.onItemValuePropertyChanged)\n return;\n this.json.onItemValuePropertyChanged(question, {\n obj: item,\n propertyName: propertyName,\n name: name,\n newValue: newValue,\n });\n };\n Object.defineProperty(ComponentQuestionJSON.prototype, \"isComposite\", {\n get: function () {\n return !!this.json.elementsJSON || !!this.json.createElements;\n },\n enumerable: false,\n configurable: true\n });\n return ComponentQuestionJSON;\n}());\n\nvar ComponentCollection = /** @class */ (function () {\n function ComponentCollection() {\n this.customQuestionValues = [];\n }\n ComponentCollection.prototype.add = function (json) {\n if (!json)\n return;\n var name = json.name;\n if (!name) {\n throw \"Attribute name is missed\";\n }\n name = name.toLowerCase();\n if (!!this.getCustomQuestionByName(name)) {\n throw \"There is already registered custom question with name '\" +\n name +\n \"'\";\n }\n if (!!_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].findClass(name)) {\n throw \"There is already class with name '\" + name + \"'\";\n }\n var customQuestion = new ComponentQuestionJSON(name, json);\n if (!!this.onAddingJson)\n this.onAddingJson(name, customQuestion.isComposite);\n this.customQuestionValues.push(customQuestion);\n };\n Object.defineProperty(ComponentCollection.prototype, \"items\", {\n get: function () {\n return this.customQuestionValues;\n },\n enumerable: false,\n configurable: true\n });\n ComponentCollection.prototype.getCustomQuestionByName = function (name) {\n for (var i = 0; i < this.customQuestionValues.length; i++) {\n if (this.customQuestionValues[i].name == name)\n return this.customQuestionValues[i];\n }\n return null;\n };\n ComponentCollection.prototype.clear = function () {\n for (var i = 0; i < this.customQuestionValues.length; i++) {\n _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].removeClass(this.customQuestionValues[i].name);\n }\n this.customQuestionValues = [];\n };\n ComponentCollection.prototype.createQuestion = function (name, questionJSON) {\n if (!!questionJSON.isComposite)\n return this.createCompositeModel(name, questionJSON);\n return this.createCustomModel(name, questionJSON);\n };\n ComponentCollection.prototype.createCompositeModel = function (name, questionJSON) {\n if (!!this.onCreateComposite)\n return this.onCreateComposite(name, questionJSON);\n return new QuestionCompositeModel(name, questionJSON);\n };\n ComponentCollection.prototype.createCustomModel = function (name, questionJSON) {\n if (!!this.onCreateCustom)\n return this.onCreateCustom(name, questionJSON);\n return new QuestionCustomModel(name, questionJSON);\n };\n ComponentCollection.Instance = new ComponentCollection();\n return ComponentCollection;\n}());\n\nvar QuestionCustomModelBase = /** @class */ (function (_super) {\n __extends(QuestionCustomModelBase, _super);\n function QuestionCustomModelBase(name, customQuestion) {\n var _this = _super.call(this, name) || this;\n _this.customQuestion = customQuestion;\n _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"CustomPropertiesCollection\"].createProperties(_this);\n _survey_element__WEBPACK_IMPORTED_MODULE_2__[\"SurveyElement\"].CreateDisabledDesignElements = true;\n _this.createWrapper();\n _survey_element__WEBPACK_IMPORTED_MODULE_2__[\"SurveyElement\"].CreateDisabledDesignElements = false;\n if (!!_this.customQuestion) {\n _this.customQuestion.onCreated(_this);\n }\n return _this;\n }\n QuestionCustomModelBase.prototype.getType = function () {\n return !!this.customQuestion ? this.customQuestion.name : \"custom\";\n };\n QuestionCustomModelBase.prototype.locStrsChanged = function () {\n _super.prototype.locStrsChanged.call(this);\n if (!!this.getElement()) {\n this.getElement().locStrsChanged();\n }\n };\n QuestionCustomModelBase.prototype.createWrapper = function () { };\n QuestionCustomModelBase.prototype.onPropertyValueChanged = function (name, oldValue, newValue) {\n _super.prototype.onPropertyValueChanged.call(this, name, oldValue, newValue);\n if (!!this.customQuestion && !this.isLoadingFromJson) {\n this.customQuestion.onPropertyChanged(this, name, newValue);\n }\n };\n QuestionCustomModelBase.prototype.itemValuePropertyChanged = function (item, name, oldValue, newValue) {\n _super.prototype.itemValuePropertyChanged.call(this, item, name, oldValue, newValue);\n if (!!this.customQuestion && !this.isLoadingFromJson) {\n this.customQuestion.onItemValuePropertyChanged(this, item, item.ownerPropertyName, name, newValue);\n }\n };\n QuestionCustomModelBase.prototype.onFirstRendering = function () {\n var el = this.getElement();\n if (!!el) {\n el.onFirstRendering();\n }\n _super.prototype.onFirstRendering.call(this);\n };\n QuestionCustomModelBase.prototype.initElement = function (el) {\n if (!el)\n return;\n el.setSurveyImpl(this);\n el.disableDesignActions = true;\n };\n QuestionCustomModelBase.prototype.setSurveyImpl = function (value) {\n _super.prototype.setSurveyImpl.call(this, value);\n this.initElement(this.getElement());\n };\n QuestionCustomModelBase.prototype.onSurveyLoad = function () {\n _super.prototype.onSurveyLoad.call(this);\n if (!!this.getElement()) {\n this.getElement().onSurveyLoad();\n this.customQuestion.onLoaded(this);\n }\n };\n QuestionCustomModelBase.prototype.afterRenderQuestionElement = function (el) {\n //Do nothing\n };\n QuestionCustomModelBase.prototype.afterRender = function (el) {\n _super.prototype.afterRender.call(this, el);\n if (!!this.customQuestion) {\n this.customQuestion.onAfterRender(this, el);\n }\n };\n QuestionCustomModelBase.prototype.setQuestionValue = function (newValue, updateIsAnswered) {\n if (updateIsAnswered === void 0) { updateIsAnswered = true; }\n _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);\n this.updateElementCss();\n };\n QuestionCustomModelBase.prototype.setNewValue = function (newValue) {\n _super.prototype.setNewValue.call(this, newValue);\n this.updateElementCss();\n };\n //ISurveyImpl\n QuestionCustomModelBase.prototype.getSurveyData = function () {\n return this;\n };\n // getSurvey(): ISurvey {\n // return this.survey;\n // }\n QuestionCustomModelBase.prototype.getTextProcessor = function () {\n return this.textProcessor;\n };\n //ISurveyData\n QuestionCustomModelBase.prototype.getValue = function (name) {\n return this.value;\n };\n QuestionCustomModelBase.prototype.setValue = function (name, newValue, locNotification, allowNotifyValueChanged) {\n if (!this.data)\n return;\n var newName = this.convertDataName(name);\n this.data.setValue(newName, this.convertDataValue(name, newValue), locNotification, allowNotifyValueChanged);\n this.updateIsAnswered();\n this.updateElementCss();\n if (!!this.customQuestion) {\n this.customQuestion.onValueChanged(this, name, newValue);\n }\n };\n QuestionCustomModelBase.prototype.convertDataName = function (name) {\n return this.getValueName();\n };\n QuestionCustomModelBase.prototype.convertDataValue = function (name, newValue) {\n return newValue;\n };\n QuestionCustomModelBase.prototype.getVariable = function (name) {\n return !!this.data ? this.data.getVariable(name) : null;\n };\n QuestionCustomModelBase.prototype.setVariable = function (name, newValue) {\n if (!this.data)\n return;\n this.data.setVariable(name, newValue);\n };\n QuestionCustomModelBase.prototype.getComment = function (name) {\n return !!this.data ? this.data.getComment(this.getValueName()) : \"\";\n };\n QuestionCustomModelBase.prototype.setComment = function (name, newValue, locNotification) {\n if (!this.data)\n return;\n this.data.setComment(this.getValueName(), newValue, locNotification);\n };\n QuestionCustomModelBase.prototype.getAllValues = function () {\n return !!this.data ? this.data.getAllValues() : {};\n };\n QuestionCustomModelBase.prototype.getFilteredValues = function () {\n return !!this.data ? this.data.getFilteredValues() : {};\n };\n QuestionCustomModelBase.prototype.getFilteredProperties = function () {\n return !!this.data ? this.data.getFilteredProperties() : {};\n };\n //IPanel\n QuestionCustomModelBase.prototype.addElement = function (element, index) { };\n QuestionCustomModelBase.prototype.removeElement = function (element) {\n return false;\n };\n QuestionCustomModelBase.prototype.getQuestionTitleLocation = function () {\n return \"left\";\n };\n QuestionCustomModelBase.prototype.getQuestionStartIndex = function () {\n return this.getStartIndex();\n };\n QuestionCustomModelBase.prototype.getChildrenLayoutType = function () {\n return \"row\";\n };\n QuestionCustomModelBase.prototype.elementWidthChanged = function (el) { };\n Object.defineProperty(QuestionCustomModelBase.prototype, \"elements\", {\n get: function () {\n return [];\n },\n enumerable: false,\n configurable: true\n });\n QuestionCustomModelBase.prototype.indexOf = function (el) {\n return -1;\n };\n QuestionCustomModelBase.prototype.ensureRowsVisibility = function () {\n // do nothing\n };\n return QuestionCustomModelBase;\n}(_question__WEBPACK_IMPORTED_MODULE_0__[\"Question\"]));\n\nvar QuestionCustomModel = /** @class */ (function (_super) {\n __extends(QuestionCustomModel, _super);\n function QuestionCustomModel() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n QuestionCustomModel.prototype.getTemplate = function () {\n return \"custom\";\n };\n QuestionCustomModel.prototype.createWrapper = function () {\n this.questionWrapper = this.createQuestion();\n };\n QuestionCustomModel.prototype.getElement = function () {\n return this.contentQuestion;\n };\n QuestionCustomModel.prototype.onAnyValueChanged = function (name) {\n _super.prototype.onAnyValueChanged.call(this, name);\n if (!!this.contentQuestion) {\n this.contentQuestion.onAnyValueChanged(name);\n }\n };\n QuestionCustomModel.prototype.hasErrors = function (fireCallback, rec) {\n if (fireCallback === void 0) { fireCallback = true; }\n if (rec === void 0) { rec = null; }\n if (!this.contentQuestion)\n return false;\n var res = this.contentQuestion.hasErrors(fireCallback, rec);\n this.errors = [];\n for (var i = 0; i < this.contentQuestion.errors.length; i++) {\n this.errors.push(this.contentQuestion.errors[i]);\n }\n if (!res) {\n res = _super.prototype.hasErrors.call(this, fireCallback, rec);\n }\n this.updateElementCss();\n return res;\n };\n QuestionCustomModel.prototype.focus = function (onError) {\n if (onError === void 0) { onError = false; }\n if (!!this.contentQuestion) {\n this.contentQuestion.focus(onError);\n }\n else {\n _super.prototype.focus.call(this, onError);\n }\n };\n Object.defineProperty(QuestionCustomModel.prototype, \"contentQuestion\", {\n get: function () {\n return this.questionWrapper;\n },\n enumerable: false,\n configurable: true\n });\n QuestionCustomModel.prototype.createQuestion = function () {\n var json = this.customQuestion.json;\n var res = null;\n if (!!json.questionJSON) {\n var qType = json.questionJSON.type;\n if (!qType || !_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].findClass(qType))\n throw \"type attribute in questionJSON is empty or incorrect\";\n res = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].createClass(qType);\n this.initElement(res);\n res.fromJSON(json.questionJSON);\n }\n else {\n if (!!json.createQuestion) {\n res = json.createQuestion();\n this.initElement(res);\n }\n }\n if (!!res && !res.name) {\n res.name = \"question\";\n }\n return res;\n };\n QuestionCustomModel.prototype.onSurveyLoad = function () {\n _super.prototype.onSurveyLoad.call(this);\n if (!this.contentQuestion)\n return;\n if (this.isEmpty() && !this.contentQuestion.isEmpty()) {\n this.value = this.contentQuestion.value;\n }\n };\n QuestionCustomModel.prototype.runCondition = function (values, properties) {\n _super.prototype.runCondition.call(this, values, properties);\n if (!!this.contentQuestion) {\n this.contentQuestion.runCondition(values, properties);\n }\n };\n QuestionCustomModel.prototype.convertDataName = function (name) {\n if (!this.contentQuestion)\n return _super.prototype.convertDataName.call(this, name);\n var newName = name.replace(this.contentQuestion.getValueName(), this.getValueName());\n return newName.indexOf(this.getValueName()) == 0\n ? newName\n : _super.prototype.convertDataName.call(this, name);\n };\n QuestionCustomModel.prototype.convertDataValue = function (name, newValue) {\n return this.convertDataName(name) == _super.prototype.convertDataName.call(this, name)\n ? this.contentQuestion.value\n : newValue;\n };\n QuestionCustomModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) {\n if (updateIsAnswered === void 0) { updateIsAnswered = true; }\n _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);\n if (!!this.contentQuestion &&\n !_helpers__WEBPACK_IMPORTED_MODULE_3__[\"Helpers\"].isTwoValueEquals(this.contentQuestion.value, newValue)) {\n this.contentQuestion.value = this.getUnbindValue(newValue);\n }\n };\n QuestionCustomModel.prototype.onSurveyValueChanged = function (newValue) {\n _super.prototype.onSurveyValueChanged.call(this, newValue);\n if (!!this.contentQuestion) {\n this.contentQuestion.onSurveyValueChanged(newValue);\n }\n };\n QuestionCustomModel.prototype.getValueCore = function () {\n if (!!this.contentQuestion)\n return this.contentQuestion.value;\n return _super.prototype.getValueCore.call(this);\n };\n QuestionCustomModel.prototype.initElement = function (el) {\n var _this = this;\n _super.prototype.initElement.call(this, el);\n if (!!el) {\n el.parent = this;\n el.afterRenderQuestionCallback = function (question, element) {\n if (!!_this.customQuestion) {\n _this.customQuestion.onAfterRenderContentElement(_this, question, element);\n }\n };\n }\n };\n QuestionCustomModel.prototype.updateElementCssCore = function (cssClasses) {\n if (!!this.contentQuestion) {\n cssClasses = this.contentQuestion.cssClasses;\n }\n _super.prototype.updateElementCssCore.call(this, cssClasses);\n };\n QuestionCustomModel.prototype.getDisplayValueCore = function (keyAsText, value) {\n return !!this.contentQuestion\n ? this.contentQuestion.getDisplayValue(keyAsText, value)\n : _super.prototype.getDisplayValueCore.call(this, keyAsText, value);\n };\n return QuestionCustomModel;\n}(QuestionCustomModelBase));\n\nvar QuestionCompositeTextProcessor = /** @class */ (function (_super) {\n __extends(QuestionCompositeTextProcessor, _super);\n function QuestionCompositeTextProcessor(composite, variableName) {\n var _this = _super.call(this, variableName) || this;\n _this.composite = composite;\n _this.variableName = variableName;\n return _this;\n }\n Object.defineProperty(QuestionCompositeTextProcessor.prototype, \"survey\", {\n get: function () {\n return this.composite.survey;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionCompositeTextProcessor.prototype, \"panel\", {\n get: function () {\n return this.composite.contentPanel;\n },\n enumerable: false,\n configurable: true\n });\n return QuestionCompositeTextProcessor;\n}(_textPreProcessor__WEBPACK_IMPORTED_MODULE_4__[\"QuestionTextProcessor\"]));\nvar QuestionCompositeModel = /** @class */ (function (_super) {\n __extends(QuestionCompositeModel, _super);\n function QuestionCompositeModel(name, customQuestion) {\n var _this = _super.call(this, name, customQuestion) || this;\n _this.customQuestion = customQuestion;\n _this.settingNewValue = false;\n _this.textProcessing = new QuestionCompositeTextProcessor(_this, QuestionCompositeModel.ItemVariableName);\n return _this;\n }\n QuestionCompositeModel.prototype.createWrapper = function () {\n this.panelWrapper = this.createPanel();\n };\n QuestionCompositeModel.prototype.getTemplate = function () {\n return \"composite\";\n };\n QuestionCompositeModel.prototype.getCssType = function () {\n return \"composite\";\n };\n QuestionCompositeModel.prototype.getElement = function () {\n return this.contentPanel;\n };\n Object.defineProperty(QuestionCompositeModel.prototype, \"contentPanel\", {\n get: function () {\n return this.panelWrapper;\n },\n enumerable: false,\n configurable: true\n });\n QuestionCompositeModel.prototype.hasErrors = function (fireCallback, rec) {\n if (fireCallback === void 0) { fireCallback = true; }\n if (rec === void 0) { rec = null; }\n var res = _super.prototype.hasErrors.call(this, fireCallback, rec);\n if (!this.contentPanel)\n return res;\n return this.contentPanel.hasErrors(fireCallback, false, rec) || res;\n };\n QuestionCompositeModel.prototype.updateElementCss = function (reNew) {\n _super.prototype.updateElementCss.call(this, reNew);\n if (this.contentPanel) {\n this.contentPanel.updateElementCss(reNew);\n }\n };\n QuestionCompositeModel.prototype.getTextProcessor = function () {\n return this.textProcessing;\n };\n QuestionCompositeModel.prototype.clearValueIfInvisible = function () {\n _super.prototype.clearValueIfInvisible.call(this);\n var questions = this.contentPanel.questions;\n for (var i = 0; i < questions.length; i++) {\n questions[i].clearValueIfInvisible();\n }\n };\n QuestionCompositeModel.prototype.onAnyValueChanged = function (name) {\n _super.prototype.onAnyValueChanged.call(this, name);\n var questions = this.contentPanel.questions;\n for (var i = 0; i < questions.length; i++) {\n questions[i].onAnyValueChanged(name);\n }\n };\n QuestionCompositeModel.prototype.createPanel = function () {\n var res = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].createClass(\"panel\");\n res.showQuestionNumbers = \"off\";\n res.renderWidth = \"100%\";\n var json = this.customQuestion.json;\n if (!!json.elementsJSON) {\n res.fromJSON({ elements: json.elementsJSON });\n }\n if (!!json.createElements) {\n json.createElements(res, this);\n }\n this.initElement(res);\n res.readOnly = this.isReadOnly;\n this.setAfterRenderCallbacks(res);\n return res;\n };\n QuestionCompositeModel.prototype.onReadOnlyChanged = function () {\n if (!!this.contentPanel) {\n this.contentPanel.readOnly = this.isReadOnly;\n }\n _super.prototype.onReadOnlyChanged.call(this);\n };\n QuestionCompositeModel.prototype.onSurveyLoad = function () {\n if (!!this.contentPanel) {\n this.contentPanel.readOnly = this.isReadOnly;\n this.setIsContentElement(this.contentPanel);\n }\n _super.prototype.onSurveyLoad.call(this);\n };\n QuestionCompositeModel.prototype.setIsContentElement = function (panel) {\n panel.isContentElement = true;\n var elements = panel.elements;\n for (var i = 0; i < elements.length; i++) {\n var el = elements[i];\n if (el.isPanel) {\n this.setIsContentElement(el);\n }\n else {\n el.isContentElement = true;\n }\n }\n };\n QuestionCompositeModel.prototype.setVisibleIndex = function (val) {\n var res = _super.prototype.setVisibleIndex.call(this, val);\n if (this.isVisible && !!this.contentPanel) {\n res += this.contentPanel.setVisibleIndex(val);\n }\n return res;\n };\n QuestionCompositeModel.prototype.runCondition = function (values, properties) {\n _super.prototype.runCondition.call(this, values, properties);\n if (!!this.contentPanel) {\n var oldComposite = values[QuestionCompositeModel.ItemVariableName];\n values[QuestionCompositeModel.ItemVariableName] = this.contentPanel.getValue();\n this.contentPanel.runCondition(values, properties);\n delete values[QuestionCompositeModel.ItemVariableName];\n if (!!oldComposite) {\n values[QuestionCompositeModel.ItemVariableName] = oldComposite;\n }\n }\n };\n QuestionCompositeModel.prototype.getValue = function (name) {\n var val = this.value;\n return !!val ? val[name] : null;\n };\n QuestionCompositeModel.prototype.setValue = function (name, newValue, locNotification, allowNotifyValueChanged) {\n if (this.settingNewValue)\n return;\n _super.prototype.setValue.call(this, name, newValue, locNotification, allowNotifyValueChanged);\n if (!this.contentPanel)\n return;\n var q = this.contentPanel.getQuestionByName(name);\n if (!!q && !_helpers__WEBPACK_IMPORTED_MODULE_3__[\"Helpers\"].isTwoValueEquals(newValue, q.value)) {\n this.settingNewValue = true;\n q.value = newValue;\n this.settingNewValue = false;\n }\n };\n QuestionCompositeModel.prototype.addConditionObjectsByContext = function (objects, context) {\n if (!this.contentPanel)\n return;\n var questions = this.contentPanel.questions;\n var prefixName = this.name;\n var prefixText = this.title;\n for (var i = 0; i < questions.length; i++) {\n objects.push({\n name: prefixName + \".\" + questions[i].name,\n text: prefixText + \".\" + questions[i].title,\n question: questions[i],\n });\n }\n };\n QuestionCompositeModel.prototype.convertDataValue = function (name, newValue) {\n var val = this.value;\n if (!val)\n val = {};\n if (this.isValueEmpty(newValue) && !this.isEditingSurveyElement) {\n delete val[name];\n }\n else {\n val[name] = newValue;\n }\n return val;\n };\n QuestionCompositeModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) {\n if (updateIsAnswered === void 0) { updateIsAnswered = true; }\n _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);\n this.settingNewValue = true;\n var questions = this.contentPanel.questions;\n for (var i = 0; i < questions.length; i++) {\n var key = questions[i].getValueName();\n questions[i].value = !!newValue ? newValue[key] : undefined;\n }\n this.settingNewValue = false;\n };\n QuestionCompositeModel.prototype.getDisplayValueCore = function (keyAsText, value) {\n return !!this.contentPanel\n ? this.contentPanel.getDisplayValue(keyAsText)\n : _super.prototype.getDisplayValueCore.call(this, keyAsText, value);\n };\n QuestionCompositeModel.prototype.setAfterRenderCallbacks = function (panel) {\n var _this = this;\n if (!panel || !this.customQuestion)\n return;\n var questions = panel.questions;\n for (var i = 0; i < questions.length; i++) {\n questions[i].afterRenderQuestionCallback = function (question, element) {\n _this.customQuestion.onAfterRenderContentElement(_this, question, element);\n };\n }\n };\n QuestionCompositeModel.ItemVariableName = \"composite\";\n return QuestionCompositeModel;\n}(QuestionCustomModelBase));\n\n\n\n/***/ }),\n\n/***/ \"./src/question_dropdown.ts\":\n/*!**********************************!*\\\n !*** ./src/question_dropdown.ts ***!\n \\**********************************/\n/*! exports provided: QuestionDropdownModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionDropdownModel\", function() { return QuestionDropdownModel; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _question_baseselect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_baseselect */ \"./src/question_baseselect.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n/**\n * A Model for a dropdown question\n */\nvar QuestionDropdownModel = /** @class */ (function (_super) {\n __extends(QuestionDropdownModel, _super);\n function QuestionDropdownModel(name) {\n var _this = _super.call(this, name) || this;\n _this.minMaxChoices = [];\n _this.createLocalizableString(\"optionsCaption\", _this);\n var self = _this;\n _this.registerFunctionOnPropertiesValueChanged([\"choicesMin\", \"choicesMax\", \"choicesStep\"], function () {\n self.onVisibleChoicesChanged();\n });\n return _this;\n }\n Object.defineProperty(QuestionDropdownModel.prototype, \"showOptionsCaption\", {\n /**\n * This flag controls whether to show options caption item ('Choose...').\n */\n get: function () {\n return this.getPropertyValue(\"showOptionsCaption\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"showOptionsCaption\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionDropdownModel.prototype, \"optionsCaption\", {\n /**\n * Use this property to set the options caption different from the default value. The default value is taken from localization strings.\n */\n get: function () {\n return this.getLocalizableStringText(\"optionsCaption\", _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(\"optionsCaption\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"optionsCaption\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionDropdownModel.prototype, \"locOptionsCaption\", {\n get: function () {\n return this.getLocalizableString(\"optionsCaption\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionDropdownModel.prototype.getType = function () {\n return \"dropdown\";\n };\n Object.defineProperty(QuestionDropdownModel.prototype, \"selectedItem\", {\n get: function () {\n if (this.isEmpty())\n return null;\n return _itemvalue__WEBPACK_IMPORTED_MODULE_4__[\"ItemValue\"].getItemByValue(this.visibleChoices, this.value);\n },\n enumerable: false,\n configurable: true\n });\n QuestionDropdownModel.prototype.supportGoNextPageAutomatic = function () {\n return true;\n };\n QuestionDropdownModel.prototype.getChoices = function () {\n var items = _super.prototype.getChoices.call(this);\n if (this.choicesMax <= this.choicesMin)\n return items;\n var res = [];\n for (var i = 0; i < items.length; i++) {\n res.push(items[i]);\n }\n if (this.minMaxChoices.length === 0 ||\n this.minMaxChoices.length !==\n (this.choicesMax - this.choicesMin) / this.choicesStep + 1) {\n this.minMaxChoices = [];\n for (var i = this.choicesMin; i <= this.choicesMax; i += this.choicesStep) {\n this.minMaxChoices.push(new _itemvalue__WEBPACK_IMPORTED_MODULE_4__[\"ItemValue\"](i));\n }\n }\n res = res.concat(this.minMaxChoices);\n return res;\n };\n Object.defineProperty(QuestionDropdownModel.prototype, \"choicesMin\", {\n /**\n * Use this and choicesMax property to automatically add choices. For example choicesMin = 1 and choicesMax = 10 will generate ten additional choices from 1 to 10.\n * @see choicesMax\n * @see choicesStep\n */\n get: function () {\n return this.getPropertyValue(\"choicesMin\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"choicesMin\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionDropdownModel.prototype, \"choicesMax\", {\n /**\n * Use this and choicesMax property to automatically add choices. For example choicesMin = 1 and choicesMax = 10 will generate ten additional choices from 1 to 10.\n * @see choicesMin\n * @see choicesStep\n */\n get: function () {\n return this.getPropertyValue(\"choicesMax\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"choicesMax\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionDropdownModel.prototype, \"choicesStep\", {\n /**\n * The default value is 1. It tells the value of the iterator between choicesMin and choicesMax properties.\n * If choicesMin = 10, choicesMax = 30 and choicesStep = 10 then you will have only three additional choices: [10, 20, 30].\n * @see choicesMin\n * @see choicesMax\n */\n get: function () {\n return this.getPropertyValue(\"choicesStep\", 1);\n },\n set: function (val) {\n if (val < 1)\n val = 1;\n this.setPropertyValue(\"choicesStep\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionDropdownModel.prototype, \"autoComplete\", {\n /**\n * Dropdown auto complete\n */\n get: function () {\n return this.getPropertyValue(\"autoComplete\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"autoComplete\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionDropdownModel.prototype.getControlClass = function () {\n var cssClasses = this.cssClasses;\n var result = cssClasses.control +\n (this.errors.length > 0 ? \" \" + cssClasses.onError : \"\");\n if (this.isReadOnly) {\n result += \" \" + cssClasses.controlDisabled;\n }\n return result;\n };\n return QuestionDropdownModel;\n}(_question_baseselect__WEBPACK_IMPORTED_MODULE_2__[\"QuestionSelectBase\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"dropdown\", [\n { name: \"optionsCaption\", serializationProperty: \"locOptionsCaption\" },\n { name: \"showOptionsCaption:boolean\", default: true },\n { name: \"choicesMin:number\", default: 0 },\n { name: \"choicesMax:number\", default: 0 },\n { name: \"choicesStep:number\", default: 1, minValue: 1 },\n {\n name: \"autoComplete\",\n dataList: [\n \"name\",\n \"honorific-prefix\",\n \"given-name\",\n \"additional-name\",\n \"family-name\",\n \"honorific-suffix\",\n \"nickname\",\n \"organization-title\",\n \"username\",\n \"new-password\",\n \"current-password\",\n \"organization\",\n \"street-address\",\n \"address-line1\",\n \"address-line2\",\n \"address-line3\",\n \"address-level4\",\n \"address-level3\",\n \"address-level2\",\n \"address-level1\",\n \"country\",\n \"country-name\",\n \"postal-code\",\n \"cc-name\",\n \"cc-given-name\",\n \"cc-additional-name\",\n \"cc-family-name\",\n \"cc-number\",\n \"cc-exp\",\n \"cc-exp-month\",\n \"cc-exp-year\",\n \"cc-csc\",\n \"cc-type\",\n \"transaction-currency\",\n \"transaction-amount\",\n \"language\",\n \"bday\",\n \"bday-day\",\n \"bday-month\",\n \"bday-year\",\n \"sex\",\n \"url\",\n \"photo\",\n \"tel\",\n \"tel-country-code\",\n \"tel-national\",\n \"tel-area-code\",\n \"tel-local\",\n \"tel-local-prefix\",\n \"tel-local-suffix\",\n \"tel-extension\",\n \"email\",\n \"impp\",\n ],\n },\n], function () {\n return new QuestionDropdownModel(\"\");\n}, \"selectbase\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].Instance.registerQuestion(\"dropdown\", function (name) {\n var q = new QuestionDropdownModel(name);\n q.choices = _questionfactory__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].DefaultChoices;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_empty.ts\":\n/*!*******************************!*\\\n !*** ./src/question_empty.ts ***!\n \\*******************************/\n/*! exports provided: QuestionEmptyModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionEmptyModel\", function() { return QuestionEmptyModel; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n/**\n * A Model for an question that renders empty \"div\" tag. It used as a base class for some custom widgets\n */\nvar QuestionEmptyModel = /** @class */ (function (_super) {\n __extends(QuestionEmptyModel, _super);\n function QuestionEmptyModel(name) {\n return _super.call(this, name) || this;\n }\n QuestionEmptyModel.prototype.getType = function () {\n return \"empty\";\n };\n return QuestionEmptyModel;\n}(_question__WEBPACK_IMPORTED_MODULE_1__[\"Question\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"empty\", [], function () {\n return new QuestionEmptyModel(\"\");\n}, \"question\");\n\n\n/***/ }),\n\n/***/ \"./src/question_expression.ts\":\n/*!************************************!*\\\n !*** ./src/question_expression.ts ***!\n \\************************************/\n/*! exports provided: QuestionExpressionModel, getCurrecyCodes */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionExpressionModel\", function() { return QuestionExpressionModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCurrecyCodes\", function() { return getCurrecyCodes; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./conditions */ \"./src/conditions.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n/**\n * A Model for expression question. It is a read-only question. It calculates value based on epxression property.\n */\nvar QuestionExpressionModel = /** @class */ (function (_super) {\n __extends(QuestionExpressionModel, _super);\n function QuestionExpressionModel(name) {\n var _this = _super.call(this, name) || this;\n _this.createLocalizableString(\"format\", _this);\n var self = _this;\n _this.registerFunctionOnPropertyValueChanged(\"expression\", function () {\n if (self.expressionRunner) {\n self.expressionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_4__[\"ExpressionRunner\"](self.expression);\n }\n });\n return _this;\n }\n QuestionExpressionModel.prototype.getType = function () {\n return \"expression\";\n };\n Object.defineProperty(QuestionExpressionModel.prototype, \"hasInput\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionExpressionModel.prototype, \"format\", {\n /**\n * Use this property to display the value in your own format. Make sure you have \"{0}\" substring in your string, to display the actual value.\n */\n get: function () {\n return this.getLocalizableStringText(\"format\", \"\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"format\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionExpressionModel.prototype, \"locFormat\", {\n get: function () {\n return this.getLocalizableString(\"format\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionExpressionModel.prototype, \"expression\", {\n /**\n * The Expression that used to calculate the question value. You may use standard operators like +, -, * and /, squares (). Here is the example of accessing the question value {questionname}.\n *
Example: \"({quantity} * {price}) * (100 - {discount}) / 100\"\n */\n get: function () {\n return this.getPropertyValue(\"expression\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"expression\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionExpressionModel.prototype.locCalculation = function () {\n this.expressionIsRunning = true;\n };\n QuestionExpressionModel.prototype.unlocCalculation = function () {\n this.expressionIsRunning = false;\n };\n QuestionExpressionModel.prototype.runCondition = function (values, properties) {\n var _this = this;\n _super.prototype.runCondition.call(this, values, properties);\n if (!this.expression ||\n this.expressionIsRunning ||\n (!this.runIfReadOnly && this.isReadOnly))\n return;\n this.locCalculation();\n if (!this.expressionRunner) {\n this.expressionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_4__[\"ExpressionRunner\"](this.expression);\n }\n this.expressionRunner.onRunComplete = function (newValue) {\n if (!_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isTwoValueEquals(newValue, _this.value)) {\n _this.value = newValue;\n }\n _this.unlocCalculation();\n };\n this.expressionRunner.run(values, properties);\n };\n QuestionExpressionModel.prototype.hasErrors = function (fireCallback, rec) {\n if (fireCallback === void 0) { fireCallback = true; }\n if (rec === void 0) { rec = null; }\n return false;\n };\n QuestionExpressionModel.prototype.getAllErrors = function () {\n return [];\n };\n Object.defineProperty(QuestionExpressionModel.prototype, \"maximumFractionDigits\", {\n /**\n * The maximum number of fraction digits to use if displayStyle is not \"none\". Possible values are from 0 to 20. The default value is -1 and it means that this property is not used.\n */\n get: function () {\n return this.getPropertyValue(\"maximumFractionDigits\", -1);\n },\n set: function (val) {\n if (val < -1 || val > 20)\n return;\n this.setPropertyValue(\"maximumFractionDigits\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionExpressionModel.prototype, \"minimumFractionDigits\", {\n /**\n * The minimum number of fraction digits to use if displayStyle is not \"none\". Possible values are from 0 to 20. The default value is -1 and it means that this property is not used.\n */\n get: function () {\n return this.getPropertyValue(\"minimumFractionDigits\", -1);\n },\n set: function (val) {\n if (val < -1 || val > 20)\n return;\n this.setPropertyValue(\"minimumFractionDigits\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionExpressionModel.prototype, \"runIfReadOnly\", {\n get: function () {\n return this.runIfReadOnlyValue === true;\n },\n set: function (val) {\n this.runIfReadOnlyValue = val;\n },\n enumerable: false,\n configurable: true\n });\n QuestionExpressionModel.prototype.getDisplayValueCore = function (keysAsText, value) {\n var val = this.isValueEmpty(value) ? this.defaultValue : value;\n var res = \"\";\n if (!this.isValueEmpty(val)) {\n var str = this.getValueAsStr(val);\n res = !this.format ? str : this.format[\"format\"](str);\n }\n if (!!this.survey) {\n res = this.survey.getExpressionDisplayValue(this, val, res);\n }\n return res;\n };\n Object.defineProperty(QuestionExpressionModel.prototype, \"displayStyle\", {\n /**\n * You may set this property to \"decimal\", \"currency\", \"percent\" or \"date\". If you set it to \"currency\", you may use the currency property to display the value in currency different from USD.\n * @see currency\n */\n get: function () {\n return this.getPropertyValue(\"displayStyle\");\n },\n set: function (val) {\n this.setPropertyValue(\"displayStyle\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionExpressionModel.prototype, \"currency\", {\n /**\n * Use it to display the value in the currency differen from USD. The displayStype should be set to \"currency\".\n * @see displayStyle\n */\n get: function () {\n return this.getPropertyValue(\"currency\");\n },\n set: function (val) {\n if (getCurrecyCodes().indexOf(val) < 0)\n return;\n this.setPropertyValue(\"currency\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionExpressionModel.prototype, \"useGrouping\", {\n /**\n * \tDetermines whether to display grouping separators. The default value is true.\n */\n get: function () {\n return this.getPropertyValue(\"useGrouping\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"useGrouping\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionExpressionModel.prototype.getValueAsStr = function (val) {\n if (this.displayStyle == \"date\") {\n var d = new Date(val);\n if (!!d && !!d.toLocaleDateString)\n return d.toLocaleDateString();\n }\n if (this.displayStyle != \"none\" && _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isNumber(val)) {\n var locale = this.getLocale();\n if (!locale)\n locale = \"en\";\n var options = {\n style: this.displayStyle,\n currency: this.currency,\n useGrouping: this.useGrouping,\n };\n if (this.maximumFractionDigits > -1) {\n options[\"maximumFractionDigits\"] = this.maximumFractionDigits;\n }\n if (this.minimumFractionDigits > -1) {\n options[\"minimumFractionDigits\"] = this.minimumFractionDigits;\n }\n return val.toLocaleString(locale, options);\n }\n return val.toString();\n };\n return QuestionExpressionModel;\n}(_question__WEBPACK_IMPORTED_MODULE_1__[\"Question\"]));\n\nfunction getCurrecyCodes() {\n return [\n \"AED\",\n \"AFN\",\n \"ALL\",\n \"AMD\",\n \"ANG\",\n \"AOA\",\n \"ARS\",\n \"AUD\",\n \"AWG\",\n \"AZN\",\n \"BAM\",\n \"BBD\",\n \"BDT\",\n \"BGN\",\n \"BHD\",\n \"BIF\",\n \"BMD\",\n \"BND\",\n \"BOB\",\n \"BOV\",\n \"BRL\",\n \"BSD\",\n \"BTN\",\n \"BWP\",\n \"BYN\",\n \"BZD\",\n \"CAD\",\n \"CDF\",\n \"CHE\",\n \"CHF\",\n \"CHW\",\n \"CLF\",\n \"CLP\",\n \"CNY\",\n \"COP\",\n \"COU\",\n \"CRC\",\n \"CUC\",\n \"CUP\",\n \"CVE\",\n \"CZK\",\n \"DJF\",\n \"DKK\",\n \"DOP\",\n \"DZD\",\n \"EGP\",\n \"ERN\",\n \"ETB\",\n \"EUR\",\n \"FJD\",\n \"FKP\",\n \"GBP\",\n \"GEL\",\n \"GHS\",\n \"GIP\",\n \"GMD\",\n \"GNF\",\n \"GTQ\",\n \"GYD\",\n \"HKD\",\n \"HNL\",\n \"HRK\",\n \"HTG\",\n \"HUF\",\n \"IDR\",\n \"ILS\",\n \"INR\",\n \"IQD\",\n \"IRR\",\n \"ISK\",\n \"JMD\",\n \"JOD\",\n \"JPY\",\n \"KES\",\n \"KGS\",\n \"KHR\",\n \"KMF\",\n \"KPW\",\n \"KRW\",\n \"KWD\",\n \"KYD\",\n \"KZT\",\n \"LAK\",\n \"LBP\",\n \"LKR\",\n \"LRD\",\n \"LSL\",\n \"LYD\",\n \"MAD\",\n \"MDL\",\n \"MGA\",\n \"MKD\",\n \"MMK\",\n \"MNT\",\n \"MOP\",\n \"MRO\",\n \"MUR\",\n \"MVR\",\n \"MWK\",\n \"MXN\",\n \"MXV\",\n \"MYR\",\n \"MZN\",\n \"NAD\",\n \"NGN\",\n \"NIO\",\n \"NOK\",\n \"NPR\",\n \"NZD\",\n \"OMR\",\n \"PAB\",\n \"PEN\",\n \"PGK\",\n \"PHP\",\n \"PKR\",\n \"PLN\",\n \"PYG\",\n \"QAR\",\n \"RON\",\n \"RSD\",\n \"RUB\",\n \"RWF\",\n \"SAR\",\n \"SBD\",\n \"SCR\",\n \"SDG\",\n \"SEK\",\n \"SGD\",\n \"SHP\",\n \"SLL\",\n \"SOS\",\n \"SRD\",\n \"SSP\",\n \"STD\",\n \"SVC\",\n \"SYP\",\n \"SZL\",\n \"THB\",\n \"TJS\",\n \"TMT\",\n \"TND\",\n \"TOP\",\n \"TRY\",\n \"TTD\",\n \"TWD\",\n \"TZS\",\n \"UAH\",\n \"UGX\",\n \"USD\",\n \"USN\",\n \"UYI\",\n \"UYU\",\n \"UZS\",\n \"VEF\",\n \"VND\",\n \"VUV\",\n \"WST\",\n \"XAF\",\n \"XAG\",\n \"XAU\",\n \"XBA\",\n \"XBB\",\n \"XBC\",\n \"XBD\",\n \"XCD\",\n \"XDR\",\n \"XOF\",\n \"XPD\",\n \"XPF\",\n \"XPT\",\n \"XSU\",\n \"XTS\",\n \"XUA\",\n \"XXX\",\n \"YER\",\n \"ZAR\",\n \"ZMW\",\n \"ZWL\",\n ];\n}\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"expression\", [\n \"expression:expression\",\n { name: \"format\", serializationProperty: \"locFormat\" },\n {\n name: \"displayStyle\",\n default: \"none\",\n choices: [\"none\", \"decimal\", \"currency\", \"percent\", \"date\"],\n },\n {\n name: \"currency\",\n choices: function () {\n return getCurrecyCodes();\n },\n default: \"USD\",\n },\n { name: \"maximumFractionDigits:number\", default: -1 },\n { name: \"minimumFractionDigits:number\", default: -1 },\n { name: \"useGrouping:boolean\", default: true },\n { name: \"enableIf\", visible: false },\n { name: \"isRequired\", visible: false },\n { name: \"readOnly\", visible: false },\n { name: \"requiredErrorText\", visible: false },\n { name: \"validators\", visible: false },\n { name: \"defaultValue\", visible: false },\n { name: \"correctAnswer\", visible: false },\n { name: \"requiredIf\", visible: false },\n], function () {\n return new QuestionExpressionModel(\"\");\n}, \"question\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_3__[\"QuestionFactory\"].Instance.registerQuestion(\"expression\", function (name) {\n return new QuestionExpressionModel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_file.ts\":\n/*!******************************!*\\\n !*** ./src/question_file.ts ***!\n \\******************************/\n/*! exports provided: QuestionFileModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionFileModel\", function() { return QuestionFileModel; });\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n/**\n * A Model for a file question\n */\nvar QuestionFileModel = /** @class */ (function (_super) {\n __extends(QuestionFileModel, _super);\n function QuestionFileModel(name) {\n var _this = _super.call(this, name) || this;\n _this.isUploading = false;\n /**\n * The event is fired after question state has been changed.\n *
sender the question object that fires the event\n *
options.state new question state value.\n */\n _this.onStateChanged = _this.addEvent();\n _this.previewValue = [];\n _this.currentState = \"empty\";\n return _this;\n }\n QuestionFileModel.prototype.getType = function () {\n return \"file\";\n };\n QuestionFileModel.prototype.clearOnDeletingContainer = function () {\n if (!this.survey)\n return;\n this.survey.clearFiles(this, this.name, this.value, null, function () { });\n };\n Object.defineProperty(QuestionFileModel.prototype, \"showPreview\", {\n /**\n * Set it to true, to show the preview for the image files.\n */\n get: function () {\n return this.getPropertyValue(\"showPreview\");\n },\n set: function (val) {\n this.setPropertyValue(\"showPreview\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"allowMultiple\", {\n /**\n * Set it to true, to allow select multiple files.\n */\n get: function () {\n return this.getPropertyValue(\"allowMultiple\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"allowMultiple\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"imageHeight\", {\n /**\n * The image height.\n */\n get: function () {\n return this.getPropertyValue(\"imageHeight\");\n },\n set: function (val) {\n this.setPropertyValue(\"imageHeight\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"imageWidth\", {\n /**\n * The image width.\n */\n get: function () {\n return this.getPropertyValue(\"imageWidth\");\n },\n set: function (val) {\n this.setPropertyValue(\"imageWidth\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"acceptedTypes\", {\n /**\n * Accepted file types. Passed to the 'accept' attribute of the file input tag. See https://www.w3schools.com/tags/att_input_accept.asp for more details.\n */\n get: function () {\n return this.getPropertyValue(\"acceptedTypes\");\n },\n set: function (val) {\n this.setPropertyValue(\"acceptedTypes\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"storeDataAsText\", {\n /**\n * Set it to false if you do not want to serialize file content as text in the survey.data.\n * In this case, you have to write the code onUploadFiles event to store the file content.\n * @see SurveyModel.onUploadFiles\n */\n get: function () {\n return this.getPropertyValue(\"storeDataAsText\");\n },\n set: function (val) {\n this.setPropertyValue(\"storeDataAsText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"waitForUpload\", {\n /**\n * Set it to true if you want to wait until files will be uploaded to your server.\n */\n get: function () {\n return this.getPropertyValue(\"waitForUpload\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"waitForUpload\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"allowImagesPreview\", {\n /**\n * Set it to false if you want to disable images preview.\n */\n get: function () {\n return this.getPropertyValue(\"allowImagesPreview\");\n },\n set: function (val) {\n this.setPropertyValue(\"allowImagesPreview\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"maxSize\", {\n /**\n * Use this property to setup the maximum allowed file size.\n */\n get: function () {\n return this.getPropertyValue(\"maxSize\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"maxSize\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"needConfirmRemoveFile\", {\n /**\n * Use this property to setup confirmation to remove file.\n */\n get: function () {\n return this.getPropertyValue(\"needConfirmRemoveFile\");\n },\n set: function (val) {\n this.setPropertyValue(\"needConfirmRemoveFile\", val);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * The remove file confirmation message.\n */\n QuestionFileModel.prototype.getConfirmRemoveMessage = function (fileName) {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"]\n .getString(\"confirmRemoveFile\")[\"format\"](fileName);\n };\n Object.defineProperty(QuestionFileModel.prototype, \"confirmRemoveAllMessage\", {\n /**\n * The remove all files confirmation message.\n */\n get: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"confirmRemoveAllFiles\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"noFileChosenCaption\", {\n /**\n * The no file chosen caption for modern theme.\n */\n get: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"noFileChosen\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"chooseButtonCaption\", {\n /**\n * The choose files button caption for modern theme.\n */\n get: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"chooseFileCaption\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"cleanButtonCaption\", {\n /**\n * The clean files button caption.\n */\n get: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"cleanCaption\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"removeFileCaption\", {\n /**\n * The remove file button caption.\n */\n get: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"removeFileCaption\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFileModel.prototype, \"inputTitle\", {\n /**\n * The input title value.\n */\n get: function () {\n if (this.isUploading)\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"loadingFile\");\n if (this.isEmpty())\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"chooseFile\");\n return \" \";\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Clear value programmatically.\n */\n QuestionFileModel.prototype.clear = function (doneCallback) {\n var _this = this;\n if (!this.survey)\n return;\n this.survey.clearFiles(this, this.name, this.value, null, function (status, data) {\n if (status === \"success\") {\n _this.value = undefined;\n _this.errors = [];\n !!doneCallback && doneCallback();\n }\n });\n };\n /**\n * Remove file item programmatically.\n */\n QuestionFileModel.prototype.removeFile = function (content) {\n var _this = this;\n if (!this.survey)\n return;\n this.survey.clearFiles(this, this.name, this.value, content.name, function (status, data) {\n if (status === \"success\") {\n var oldValue = _this.value;\n if (Array.isArray(oldValue)) {\n _this.value = oldValue.filter(function (f) { return f.name !== content.name; });\n }\n else {\n _this.value = undefined;\n }\n }\n });\n };\n /**\n * Load multiple files programmatically.\n * @param files\n */\n QuestionFileModel.prototype.loadFiles = function (files) {\n var _this = this;\n if (!this.survey) {\n return;\n }\n this.errors = [];\n if (!this.allFilesOk(files)) {\n return;\n }\n this.stateChanged(\"loading\");\n var loadFilesProc = function () {\n var content = [];\n if (_this.storeDataAsText) {\n files.forEach(function (file) {\n var fileReader = new FileReader();\n fileReader.onload = function (e) {\n content = content.concat([\n { name: file.name, type: file.type, content: fileReader.result },\n ]);\n if (content.length === files.length) {\n _this.value = (_this.value || []).concat(content);\n }\n };\n fileReader.readAsDataURL(file);\n });\n }\n else {\n if (_this.survey) {\n _this.survey.uploadFiles(_this, _this.name, files, function (status, data) {\n if (status === \"error\") {\n _this.stateChanged(\"error\");\n }\n if (status === \"success\") {\n _this.value = (_this.value || []).concat(data.map(function (r) {\n return {\n name: r.file.name,\n type: r.file.type,\n content: r.content,\n };\n }));\n }\n });\n }\n }\n };\n if (this.allowMultiple) {\n loadFilesProc();\n }\n else {\n this.clear(loadFilesProc);\n }\n };\n QuestionFileModel.prototype.canPreviewImage = function (fileItem) {\n return this.allowImagesPreview && !!fileItem && this.isFileImage(fileItem);\n };\n QuestionFileModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) {\n var _this = this;\n if (updateIsAnswered === void 0) { updateIsAnswered = true; }\n _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);\n this.previewValue = [];\n var state = (!Array.isArray(newValue) && !!newValue) ||\n (Array.isArray(newValue) && newValue.length > 0)\n ? this.showPreview\n ? \"loading\"\n : \"loaded\"\n : \"empty\";\n this.stateChanged(state);\n if (!this.showPreview || !newValue)\n return;\n var newValues = Array.isArray(newValue)\n ? newValue\n : !!newValue\n ? [newValue]\n : [];\n if (this.storeDataAsText) {\n newValues.forEach(function (value) {\n var content = value.content || value;\n _this.previewValue = _this.previewValue.concat([\n {\n name: value.name,\n type: value.type,\n content: content,\n },\n ]);\n });\n if (state === \"loading\")\n this.stateChanged(\"loaded\");\n }\n else {\n newValues.forEach(function (value) {\n var content = value.content || value;\n if (_this.survey) {\n _this.survey.downloadFile(_this.name, value, function (status, data) {\n if (status === \"success\") {\n _this.previewValue = _this.previewValue.concat([\n {\n content: data,\n name: value.name,\n type: value.type,\n },\n ]);\n if (_this.previewValue.length === newValues.length) {\n _this.stateChanged(\"loaded\");\n }\n }\n else {\n _this.stateChanged(\"error\");\n }\n });\n }\n });\n }\n };\n QuestionFileModel.prototype.onCheckForErrors = function (errors, isOnValueChanged) {\n _super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged);\n if (this.isUploading && this.waitForUpload) {\n errors.push(new _error__WEBPACK_IMPORTED_MODULE_3__[\"UploadingFileError\"](_surveyStrings__WEBPACK_IMPORTED_MODULE_4__[\"surveyLocalization\"].getString(\"uploadingFile\"), this));\n }\n };\n QuestionFileModel.prototype.stateChanged = function (state) {\n if (state === \"loading\") {\n this.isUploading = true;\n }\n if (state === \"loaded\") {\n this.isUploading = false;\n }\n if (state === \"error\") {\n this.isUploading = false;\n }\n this.currentState = state;\n this.onStateChanged.fire(this, { state: state });\n };\n QuestionFileModel.prototype.allFilesOk = function (files) {\n var _this = this;\n var errorLength = this.errors ? this.errors.length : 0;\n (files || []).forEach(function (file) {\n if (_this.maxSize > 0 && file.size > _this.maxSize) {\n _this.errors.push(new _error__WEBPACK_IMPORTED_MODULE_3__[\"ExceedSizeError\"](_this.maxSize, _this));\n }\n });\n return errorLength === this.errors.length;\n };\n QuestionFileModel.prototype.isFileImage = function (file) {\n if (!file)\n return false;\n var imagePrefix = \"data:image\";\n var subStr = file.content && file.content.substr(0, imagePrefix.length);\n subStr = subStr && subStr.toLowerCase();\n var result = subStr === imagePrefix ||\n (!!file.type && file.type.toLowerCase().indexOf(\"image/\") === 0);\n return result;\n };\n QuestionFileModel.prototype.getPlainData = function (options) {\n if (options === void 0) { options = {\n includeEmpty: true,\n }; }\n var questionPlainData = _super.prototype.getPlainData.call(this, options);\n if (!!questionPlainData && !this.isEmpty()) {\n questionPlainData.isNode = false;\n var values = Array.isArray(this.value) ? this.value : [this.value];\n questionPlainData.data = values.map(function (dataValue, index) {\n return {\n name: index,\n title: \"File\",\n value: (dataValue.content && dataValue.content) || dataValue,\n displayValue: (dataValue.name && dataValue.name) || dataValue,\n getString: function (val) {\n return typeof val === \"object\" ? JSON.stringify(val) : val;\n },\n isNode: false,\n };\n });\n }\n return questionPlainData;\n };\n QuestionFileModel.prototype.supportComment = function () {\n return true;\n };\n return QuestionFileModel;\n}(_question__WEBPACK_IMPORTED_MODULE_0__[\"Question\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"file\", [\n { name: \"hasComment:switch\", layout: \"row\" },\n {\n name: \"commentText\",\n dependsOn: \"hasComment\",\n visibleIf: function (obj) {\n return obj.hasComment;\n },\n serializationProperty: \"locCommentText\",\n layout: \"row\",\n },\n { name: \"showPreview:boolean\", default: true },\n \"allowMultiple:boolean\",\n { name: \"allowImagesPreview:boolean\", default: true },\n \"imageHeight\",\n \"imageWidth\",\n \"acceptedTypes\",\n { name: \"storeDataAsText:boolean\", default: true },\n { name: \"waitForUpload:boolean\", default: false },\n \"maxSize:number\",\n { name: \"defaultValue\", visible: false },\n { name: \"correctAnswer\", visible: false },\n { name: \"validators\", visible: false },\n { name: \"needConfirmRemoveFile:boolean\", visible: true, default: false },\n], function () {\n return new QuestionFileModel(\"\");\n}, \"question\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_2__[\"QuestionFactory\"].Instance.registerQuestion(\"file\", function (name) {\n return new QuestionFileModel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_html.ts\":\n/*!******************************!*\\\n !*** ./src/question_html.ts ***!\n \\******************************/\n/*! exports provided: QuestionHtmlModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionHtmlModel\", function() { return QuestionHtmlModel; });\n/* harmony import */ var _questionnonvalue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./questionnonvalue */ \"./src/questionnonvalue.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n/**\n * A Model for html question. Unlike other questions it doesn't have value and title.\n */\nvar QuestionHtmlModel = /** @class */ (function (_super) {\n __extends(QuestionHtmlModel, _super);\n function QuestionHtmlModel(name) {\n var _this = _super.call(this, name) || this;\n var locHtml = _this.createLocalizableString(\"html\", _this);\n locHtml.onGetTextCallback = function (str) {\n return !!_this.survey && !_this.ignoreHtmlProgressing\n ? _this.survey.processHtml(str)\n : str;\n };\n return _this;\n }\n QuestionHtmlModel.prototype.getType = function () {\n return \"html\";\n };\n Object.defineProperty(QuestionHtmlModel.prototype, \"isCompositeQuestion\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n QuestionHtmlModel.prototype.getProcessedText = function (text) {\n if (this.ignoreHtmlProgressing)\n return text;\n return _super.prototype.getProcessedText.call(this, text);\n };\n Object.defineProperty(QuestionHtmlModel.prototype, \"html\", {\n /**\n * Set html to display it\n */\n get: function () {\n return this.getLocalizableStringText(\"html\", \"\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"html\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionHtmlModel.prototype, \"locHtml\", {\n get: function () {\n return this.getLocalizableString(\"html\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionHtmlModel.prototype, \"processedHtml\", {\n get: function () {\n return this.survey ? this.survey.processHtml(this.html) : this.html;\n },\n enumerable: false,\n configurable: true\n });\n return QuestionHtmlModel;\n}(_questionnonvalue__WEBPACK_IMPORTED_MODULE_0__[\"QuestionNonValue\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"html\", [{ name: \"html:html\", serializationProperty: \"locHtml\" }], function () {\n return new QuestionHtmlModel(\"\");\n}, \"nonvalue\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_2__[\"QuestionFactory\"].Instance.registerQuestion(\"html\", function (name) {\n return new QuestionHtmlModel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_image.ts\":\n/*!*******************************!*\\\n !*** ./src/question_image.ts ***!\n \\*******************************/\n/*! exports provided: QuestionImageModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionImageModel\", function() { return QuestionImageModel; });\n/* harmony import */ var _questionnonvalue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./questionnonvalue */ \"./src/questionnonvalue.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n/**\n * A Model for image question. This question hasn't any functionality and can be used to improve the appearance of the survey.\n */\nvar QuestionImageModel = /** @class */ (function (_super) {\n __extends(QuestionImageModel, _super);\n function QuestionImageModel(name) {\n var _this = _super.call(this, name) || this;\n _this.createLocalizableString(\"imageLink\", _this, false);\n _this.createLocalizableString(\"text\", _this, false);\n return _this;\n }\n QuestionImageModel.prototype.getType = function () {\n return \"image\";\n };\n Object.defineProperty(QuestionImageModel.prototype, \"isCompositeQuestion\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionImageModel.prototype, \"imageLink\", {\n /**\n * The image URL.\n */\n get: function () {\n return this.getLocalizableStringText(\"imageLink\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"imageLink\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionImageModel.prototype, \"locImageLink\", {\n get: function () {\n return this.getLocalizableString(\"imageLink\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionImageModel.prototype, \"text\", {\n /**\n * The image alt text.\n */\n get: function () {\n return this.getLocalizableStringText(\"text\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"text\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionImageModel.prototype, \"locText\", {\n get: function () {\n return this.getLocalizableString(\"text\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionImageModel.prototype, \"imageHeight\", {\n /**\n * The image height.\n */\n get: function () {\n return this.getPropertyValue(\"imageHeight\");\n },\n set: function (val) {\n this.setPropertyValue(\"imageHeight\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionImageModel.prototype, \"imageWidth\", {\n /**\n * The image width.\n */\n get: function () {\n return this.getPropertyValue(\"imageWidth\");\n },\n set: function (val) {\n this.setPropertyValue(\"imageWidth\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionImageModel.prototype, \"imageFit\", {\n /**\n * The image fit mode.\n */\n get: function () {\n return this.getPropertyValue(\"imageFit\");\n },\n set: function (val) {\n this.setPropertyValue(\"imageFit\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionImageModel.prototype, \"contentMode\", {\n /**\n * The content mode.\n */\n get: function () {\n return this.getPropertyValue(\"contentMode\");\n },\n set: function (val) {\n this.setPropertyValue(\"contentMode\", val);\n if (val === \"video\") {\n this.showLabel = true;\n }\n },\n enumerable: false,\n configurable: true\n });\n return QuestionImageModel;\n}(_questionnonvalue__WEBPACK_IMPORTED_MODULE_0__[\"QuestionNonValue\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"image\", [\n { name: \"imageLink\", serializationProperty: \"locImageLink\" },\n { name: \"text\", serializationProperty: \"locText\" },\n {\n name: \"contentMode\",\n default: \"image\",\n choices: [\"image\", \"video\"],\n },\n {\n name: \"imageFit\",\n default: \"contain\",\n choices: [\"none\", \"contain\", \"cover\", \"fill\"],\n },\n { name: \"imageHeight:number\", default: 150, minValue: 0 },\n { name: \"imageWidth:number\", default: 200, minValue: 0 },\n], function () {\n return new QuestionImageModel(\"\");\n}, \"nonvalue\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_2__[\"QuestionFactory\"].Instance.registerQuestion(\"image\", function (name) {\n return new QuestionImageModel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_imagepicker.ts\":\n/*!*************************************!*\\\n !*** ./src/question_imagepicker.ts ***!\n \\*************************************/\n/*! exports provided: ImageItemValue, QuestionImagePickerModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ImageItemValue\", function() { return ImageItemValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionImagePickerModel\", function() { return QuestionImagePickerModel; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _question_baseselect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_baseselect */ \"./src/question_baseselect.ts\");\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\nvar ImageItemValue = /** @class */ (function (_super) {\n __extends(ImageItemValue, _super);\n function ImageItemValue(value, text, typeName) {\n if (text === void 0) { text = null; }\n if (typeName === void 0) { typeName = \"imageitemvalue\"; }\n var _this = _super.call(this, value, text, typeName) || this;\n _this.typeName = typeName;\n _this.createLocalizableString(\"imageLink\", _this, false);\n return _this;\n }\n ImageItemValue.prototype.getType = function () {\n return !!this.typeName ? this.typeName : \"itemvalue\";\n };\n Object.defineProperty(ImageItemValue.prototype, \"imageLink\", {\n /**\n * The image or video link property.\n */\n get: function () {\n return this.getLocalizableStringText(\"imageLink\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"imageLink\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ImageItemValue.prototype, \"locImageLink\", {\n get: function () {\n return this.getLocalizableString(\"imageLink\");\n },\n enumerable: false,\n configurable: true\n });\n ImageItemValue.prototype.getLocale = function () {\n return !!this.locOwner ? this.locOwner.getLocale() : \"\";\n };\n ImageItemValue.prototype.getMarkdownHtml = function (text, name) {\n return !!this.locOwner ? this.locOwner.getMarkdownHtml(text, name) : text;\n };\n ImageItemValue.prototype.getRenderer = function (name) {\n return !!this.locOwner ? this.locOwner.getRenderer(name) : null;\n };\n ImageItemValue.prototype.getProcessedText = function (text) {\n return !!this.locOwner ? this.locOwner.getProcessedText(text) : text;\n };\n return ImageItemValue;\n}(_itemvalue__WEBPACK_IMPORTED_MODULE_3__[\"ItemValue\"]));\n\n/**\n * A Model for a select image question.\n */\nvar QuestionImagePickerModel = /** @class */ (function (_super) {\n __extends(QuestionImagePickerModel, _super);\n function QuestionImagePickerModel(name) {\n var _this = _super.call(this, name) || this;\n _this.colCount = 0;\n _this.choicesByUrl.createItemValue = function (value) {\n return new ImageItemValue(value);\n };\n return _this;\n }\n QuestionImagePickerModel.prototype.getType = function () {\n return \"imagepicker\";\n };\n QuestionImagePickerModel.prototype.supportGoNextPageAutomatic = function () {\n return true;\n };\n Object.defineProperty(QuestionImagePickerModel.prototype, \"hasSingleInput\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionImagePickerModel.prototype.getItemValueType = function () {\n return \"imageitemvalue\";\n };\n Object.defineProperty(QuestionImagePickerModel.prototype, \"isCompositeQuestion\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n QuestionImagePickerModel.prototype.supportOther = function () {\n return false;\n };\n QuestionImagePickerModel.prototype.supportNone = function () {\n return false;\n };\n Object.defineProperty(QuestionImagePickerModel.prototype, \"multiSelect\", {\n /**\n * Multi select option. If set to true, then allows to select multiple images.\n */\n get: function () {\n return this.getPropertyValue(\"multiSelect\", false);\n },\n set: function (newValue) {\n this.setPropertyValue(\"multiSelect\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Returns true if item is checked\n * @param item image picker item value\n */\n QuestionImagePickerModel.prototype.isItemSelected = function (item) {\n var val = this.value;\n if (this.isValueEmpty(val))\n return false;\n if (!this.multiSelect)\n return _helpers__WEBPACK_IMPORTED_MODULE_4__[\"Helpers\"].isTwoValueEquals(val, item.value);\n if (!Array.isArray(val))\n return false;\n for (var i = 0; i < val.length; i++) {\n if (_helpers__WEBPACK_IMPORTED_MODULE_4__[\"Helpers\"].isTwoValueEquals(val[i], item.value))\n return true;\n }\n return false;\n };\n QuestionImagePickerModel.prototype.clearIncorrectValues = function () {\n if (this.multiSelect) {\n var val = this.value;\n if (!val)\n return;\n if (!Array.isArray(val) || val.length == 0) {\n this.clearValue();\n return;\n }\n var newValue = [];\n for (var i = 0; i < val.length; i++) {\n if (!this.hasUnknownValue(val[i], true)) {\n newValue.push(val[i]);\n }\n }\n if (newValue.length == val.length)\n return;\n if (newValue.length == 0) {\n this.clearValue();\n }\n else {\n this.value = newValue;\n }\n }\n else {\n _super.prototype.clearIncorrectValues.call(this);\n }\n };\n Object.defineProperty(QuestionImagePickerModel.prototype, \"showLabel\", {\n /**\n * Show label under the image.\n */\n get: function () {\n return this.getPropertyValue(\"showLabel\", false);\n },\n set: function (newValue) {\n this.setPropertyValue(\"showLabel\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n QuestionImagePickerModel.prototype.endLoadingFromJson = function () {\n _super.prototype.endLoadingFromJson.call(this);\n if (!this.isDesignMode && this.multiSelect) {\n this.createNewArray(\"renderedValue\");\n this.createNewArray(\"value\");\n }\n };\n QuestionImagePickerModel.prototype.getValueCore = function () {\n var value = _super.prototype.getValueCore.call(this);\n if (value !== undefined) {\n return value;\n }\n if (this.multiSelect) {\n return [];\n }\n return value;\n };\n QuestionImagePickerModel.prototype.convertValToArrayForMultSelect = function (val) {\n if (!this.multiSelect)\n return val;\n if (this.isValueEmpty(val) || Array.isArray(val))\n return val;\n return [val];\n };\n QuestionImagePickerModel.prototype.renderedValueFromDataCore = function (val) {\n return this.convertValToArrayForMultSelect(val);\n };\n QuestionImagePickerModel.prototype.rendredValueToDataCore = function (val) {\n return this.convertValToArrayForMultSelect(val);\n };\n Object.defineProperty(QuestionImagePickerModel.prototype, \"imageHeight\", {\n /**\n * The image height.\n */\n get: function () {\n return this.getPropertyValue(\"imageHeight\");\n },\n set: function (val) {\n this.setPropertyValue(\"imageHeight\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionImagePickerModel.prototype, \"imageWidth\", {\n /**\n * The image width.\n */\n get: function () {\n return this.getPropertyValue(\"imageWidth\");\n },\n set: function (val) {\n this.setPropertyValue(\"imageWidth\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionImagePickerModel.prototype, \"imageFit\", {\n /**\n * The image fit mode.\n */\n get: function () {\n return this.getPropertyValue(\"imageFit\");\n },\n set: function (val) {\n this.setPropertyValue(\"imageFit\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionImagePickerModel.prototype, \"contentMode\", {\n /**\n * The content mode.\n */\n get: function () {\n return this.getPropertyValue(\"contentMode\");\n },\n set: function (val) {\n this.setPropertyValue(\"contentMode\", val);\n if (val === \"video\") {\n this.showLabel = true;\n }\n },\n enumerable: false,\n configurable: true\n });\n QuestionImagePickerModel.prototype.convertDefaultValue = function (val) {\n return val;\n };\n Object.defineProperty(QuestionImagePickerModel.prototype, \"hasColumns\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n return QuestionImagePickerModel;\n}(_question_baseselect__WEBPACK_IMPORTED_MODULE_2__[\"QuestionCheckboxBase\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"imageitemvalue\", [], function (value) { return new ImageItemValue(value); }, \"itemvalue\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addProperty(\"imageitemvalue\", {\n name: \"imageLink\",\n serializationProperty: \"locImageLink\",\n});\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"imagepicker\", [\n { name: \"hasOther\", visible: false },\n { name: \"otherText\", visible: false },\n { name: \"hasNone\", visible: false },\n { name: \"noneText\", visible: false },\n { name: \"optionsCaption\", visible: false },\n { name: \"otherErrorText\", visible: false },\n { name: \"storeOthersAsComment\", visible: false },\n {\n name: \"contentMode\",\n default: \"image\",\n choices: [\"image\", \"video\"],\n },\n {\n name: \"imageFit\",\n default: \"contain\",\n choices: [\"none\", \"contain\", \"cover\", \"fill\"],\n },\n { name: \"imageHeight:number\", default: 150, minValue: 0 },\n { name: \"imageWidth:number\", default: 200, minValue: 0 },\n], function () {\n return new QuestionImagePickerModel(\"\");\n}, \"checkboxbase\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addProperty(\"imagepicker\", {\n name: \"showLabel:boolean\",\n default: false,\n});\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addProperty(\"imagepicker\", {\n name: \"colCount:number\",\n default: 0,\n choices: [0, 1, 2, 3, 4, 5],\n});\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addProperty(\"imagepicker\", {\n name: \"multiSelect:boolean\",\n default: false,\n});\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addProperty(\"imagepicker\", {\n name: \"choices:imageitemvalue[]\",\n});\n_questionfactory__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].Instance.registerQuestion(\"imagepicker\", function (name) {\n var q = new QuestionImagePickerModel(name);\n //q.choices = QuestionFactory.DefaultChoices;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_matrix.ts\":\n/*!********************************!*\\\n !*** ./src/question_matrix.ts ***!\n \\********************************/\n/*! exports provided: MatrixRowModel, MatrixCells, QuestionMatrixModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MatrixRowModel\", function() { return MatrixRowModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MatrixCells\", function() { return MatrixCells; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixModel\", function() { return QuestionMatrixModel; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\n/* harmony import */ var _martixBase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./martixBase */ \"./src/martixBase.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./localizablestring */ \"./src/localizablestring.ts\");\n/* harmony import */ var _question_dropdown__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./question_dropdown */ \"./src/question_dropdown.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\n\n\n\n\nvar MatrixRowModel = /** @class */ (function (_super) {\n __extends(MatrixRowModel, _super);\n function MatrixRowModel(item, fullName, data, value) {\n var _this = _super.call(this) || this;\n _this.fullName = fullName;\n _this.item = item;\n _this.data = data;\n _this.value = value;\n _this.cellClick = function (column) {\n _this.value = column.value;\n };\n _this.registerFunctionOnPropertyValueChanged(\"value\", function () {\n if (_this.data)\n _this.data.onMatrixRowChanged(_this);\n });\n return _this;\n }\n Object.defineProperty(MatrixRowModel.prototype, \"name\", {\n get: function () {\n return this.item.value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixRowModel.prototype, \"text\", {\n get: function () {\n return this.item.text;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixRowModel.prototype, \"locText\", {\n get: function () {\n return this.item.locText;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixRowModel.prototype, \"value\", {\n get: function () {\n return this.getPropertyValue(\"value\");\n },\n set: function (newValue) {\n newValue = this.data.getCorrectedRowValue(newValue);\n this.setPropertyValue(\"value\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixRowModel.prototype, \"rowClasses\", {\n get: function () {\n var cssClasses = this.data.cssClasses;\n var rowClass = !!cssClasses.row ? cssClasses.row : \"\";\n var rowErrorClass = !!cssClasses.rowError ? cssClasses.rowError : \"\";\n var hasError = !!this.data.getErrorByType(\"requiredinallrowserror\");\n var classes = rowClass;\n if (!!rowErrorClass && hasError && this.isValueEmpty(this.value)) {\n if (!!classes)\n classes += \" \";\n classes += rowErrorClass;\n }\n return classes;\n },\n enumerable: false,\n configurable: true\n });\n return MatrixRowModel;\n}(_base__WEBPACK_IMPORTED_MODULE_4__[\"Base\"]));\n\nvar MatrixCells = /** @class */ (function () {\n function MatrixCells(cellsOwner) {\n this.cellsOwner = cellsOwner;\n this.values = {};\n }\n Object.defineProperty(MatrixCells.prototype, \"isEmpty\", {\n get: function () {\n return Object.keys(this.values).length == 0;\n },\n enumerable: false,\n configurable: true\n });\n MatrixCells.prototype.setCellText = function (row, column, val) {\n row = this.getCellRowColumnValue(row, this.rows);\n column = this.getCellRowColumnValue(column, this.columns);\n if (!row || !column)\n return;\n if (val) {\n if (!this.values[row])\n this.values[row] = {};\n if (!this.values[row][column])\n this.values[row][column] = this.createString();\n this.values[row][column].text = val;\n }\n else {\n if (this.values[row] && this.values[row][column]) {\n var loc = this.values[row][column];\n loc.text = \"\";\n if (loc.isEmpty) {\n delete this.values[row][column];\n if (Object.keys(this.values[row]).length == 0) {\n delete this.values[row];\n }\n }\n }\n }\n };\n MatrixCells.prototype.setDefaultCellText = function (column, val) {\n this.setCellText(_settings__WEBPACK_IMPORTED_MODULE_10__[\"settings\"].matrixDefaultRowName, column, val);\n };\n MatrixCells.prototype.getCellLocText = function (row, column) {\n row = this.getCellRowColumnValue(row, this.rows);\n column = this.getCellRowColumnValue(column, this.columns);\n if (!row || !column)\n return null;\n if (!this.values[row])\n return null;\n if (!this.values[row][column])\n return null;\n return this.values[row][column];\n };\n MatrixCells.prototype.getDefaultCellLocText = function (column, val) {\n return this.getCellLocText(_settings__WEBPACK_IMPORTED_MODULE_10__[\"settings\"].matrixDefaultRowName, column);\n };\n MatrixCells.prototype.getCellDisplayLocText = function (row, column) {\n var cellText = this.getCellLocText(row, column);\n if (cellText && !cellText.isEmpty)\n return cellText;\n cellText = this.getCellLocText(_settings__WEBPACK_IMPORTED_MODULE_10__[\"settings\"].matrixDefaultRowName, column);\n if (cellText && !cellText.isEmpty)\n return cellText;\n if (typeof column == \"number\") {\n column =\n column >= 0 && column < this.columns.length\n ? this.columns[column]\n : null;\n }\n if (column && column.locText)\n return column.locText;\n return null;\n };\n MatrixCells.prototype.getCellText = function (row, column) {\n var loc = this.getCellLocText(row, column);\n return loc ? loc.calculatedText : null;\n };\n MatrixCells.prototype.getDefaultCellText = function (column) {\n var loc = this.getCellLocText(_settings__WEBPACK_IMPORTED_MODULE_10__[\"settings\"].matrixDefaultRowName, column);\n return loc ? loc.calculatedText : null;\n };\n MatrixCells.prototype.getCellDisplayText = function (row, column) {\n var loc = this.getCellDisplayLocText(row, column);\n return loc ? loc.calculatedText : null;\n };\n Object.defineProperty(MatrixCells.prototype, \"rows\", {\n get: function () {\n return this.cellsOwner ? this.cellsOwner.getRows() : [];\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixCells.prototype, \"columns\", {\n get: function () {\n return this.cellsOwner ? this.cellsOwner.getColumns() : [];\n },\n enumerable: false,\n configurable: true\n });\n MatrixCells.prototype.getCellRowColumnValue = function (val, values) {\n if (val === null || val === undefined)\n return null;\n if (typeof val == \"number\") {\n if (val < 0 || val >= values.length)\n return null;\n val = values[val].value;\n }\n if (val.value)\n return val.value;\n return val;\n };\n MatrixCells.prototype.getJson = function () {\n if (this.isEmpty)\n return null;\n var res = {};\n for (var row in this.values) {\n var resRow = {};\n var rowValues = this.values[row];\n for (var col in rowValues) {\n resRow[col] = rowValues[col].getJson();\n }\n res[row] = resRow;\n }\n return res;\n };\n MatrixCells.prototype.setJson = function (value) {\n this.values = {};\n if (!value)\n return;\n for (var row in value) {\n if (row == \"pos\")\n continue;\n var rowValues = value[row];\n this.values[row] = {};\n for (var col in rowValues) {\n if (col == \"pos\")\n continue;\n var loc = this.createString();\n loc.setJson(rowValues[col]);\n this.values[row][col] = loc;\n }\n }\n };\n MatrixCells.prototype.createString = function () {\n return new _localizablestring__WEBPACK_IMPORTED_MODULE_8__[\"LocalizableString\"](this.cellsOwner, true);\n };\n return MatrixCells;\n}());\n\n/**\n * A Model for a simple matrix question.\n */\nvar QuestionMatrixModel = /** @class */ (function (_super) {\n __extends(QuestionMatrixModel, _super);\n function QuestionMatrixModel(name) {\n var _this = _super.call(this, name) || this;\n _this.isRowChanging = false;\n _this.emptyLocalizableString = new _localizablestring__WEBPACK_IMPORTED_MODULE_8__[\"LocalizableString\"](_this);\n _this.cellsValue = new MatrixCells(_this);\n var self = _this;\n _this.registerFunctionOnPropertyValueChanged(\"columns\", function () {\n self.onColumnsChanged();\n });\n _this.registerFunctionOnPropertyValueChanged(\"rows\", function () {\n if (!self.filterItems()) {\n self.onRowsChanged();\n }\n });\n _this.registerFunctionOnPropertyValueChanged(\"hideIfRowsEmpty\", function () {\n self.updateVisibilityBasedOnRows();\n });\n return _this;\n }\n QuestionMatrixModel.prototype.getType = function () {\n return \"matrix\";\n };\n Object.defineProperty(QuestionMatrixModel.prototype, \"hasSingleInput\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixModel.prototype, \"isAllRowRequired\", {\n /**\n * Set this property to true, if you want a user to answer all rows.\n */\n get: function () {\n return this.getPropertyValue(\"isAllRowRequired\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"isAllRowRequired\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixModel.prototype, \"hasRows\", {\n /**\n * Returns true, if there is at least one row.\n */\n get: function () {\n return this.rows.length > 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixModel.prototype, \"rowsOrder\", {\n /**\n * Use this property to render items in a specific order: \"random\" or \"initial\". Default is \"initial\".\n */\n get: function () {\n return this.getPropertyValue(\"rowsOrder\");\n },\n set: function (val) {\n val = val.toLowerCase();\n if (val == this.rowsOrder)\n return;\n this.setPropertyValue(\"rowsOrder\", val);\n this.onRowsChanged();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixModel.prototype, \"hideIfRowsEmpty\", {\n /**\n * Set this property to true to hide the question if there is no visible rows in the matrix.\n */\n get: function () {\n return this.getPropertyValue(\"hideIfRowsEmpty\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"hideIfRowsEmpty\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixModel.prototype.getRows = function () {\n return this.rows;\n };\n QuestionMatrixModel.prototype.getColumns = function () {\n return this.visibleColumns;\n };\n QuestionMatrixModel.prototype.addColumn = function (value, text) {\n var col = new _itemvalue__WEBPACK_IMPORTED_MODULE_1__[\"ItemValue\"](value, text);\n this.columns.push(col);\n return col;\n };\n QuestionMatrixModel.prototype.getItemClass = function (row, column) {\n var isChecked = row.value == column.value;\n var isDisabled = this.isReadOnly;\n var allowHover = !isChecked && !isDisabled;\n var cellDisabledClass = this.hasCellText\n ? this.cssClasses.cellTextDisabled\n : this.cssClasses.itemDisabled;\n var cellSelectedClass = this.hasCellText\n ? this.cssClasses.cellTextSelected\n : this.cssClasses.itemChecked;\n var itemHoverClass = !this.hasCellText ? this.cssClasses.itemHover : \"\";\n var cellClass = this.hasCellText\n ? this.cssClasses.cellText\n : this.cssClasses.label;\n var itemClass = this.hasCellText && !!this.cssClasses.cell\n ? this.cssClasses.cell + \" \"\n : \"\";\n itemClass +=\n cellClass +\n (isChecked ? \" \" + cellSelectedClass : \"\") +\n (isDisabled ? \" \" + cellDisabledClass : \"\") +\n (allowHover ? \" \" + itemHoverClass : \"\");\n return itemClass;\n };\n QuestionMatrixModel.prototype.getQuizQuestionCount = function () {\n var res = 0;\n for (var i = 0; i < this.rows.length; i++) {\n if (!this.isValueEmpty(this.correctAnswer[this.rows[i].value]))\n res++;\n }\n return res;\n };\n QuestionMatrixModel.prototype.getCorrectAnswerCount = function () {\n var res = 0;\n var value = this.value;\n for (var i = 0; i < this.rows.length; i++) {\n var row = this.rows[i].value;\n if (!this.isValueEmpty(value[row]) &&\n _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isTwoValueEquals(this.correctAnswer[row], value[row]))\n res++;\n }\n return res;\n };\n QuestionMatrixModel.prototype.getVisibleRows = function () {\n var result = new Array();\n var val = this.value;\n if (!val)\n val = {};\n var rows = !!this.filteredRows ? this.filteredRows : this.rows;\n for (var i = 0; i < rows.length; i++) {\n var row = rows[i];\n if (this.isValueEmpty(row.value))\n continue;\n result.push(this.createMatrixRow(row, this.id + \"_\" + row.value.toString().replace(/\\s/g, \"_\"), val[row.value]));\n }\n if (result.length == 0 && !this.filteredRows) {\n result.push(this.createMatrixRow(new _itemvalue__WEBPACK_IMPORTED_MODULE_1__[\"ItemValue\"](null), this.name.replace(/\\s/g, \"_\"), val));\n }\n this.generatedVisibleRows = result;\n return result;\n };\n QuestionMatrixModel.prototype.sortVisibleRows = function (array) {\n var order = this.rowsOrder.toLowerCase();\n if (order === \"random\")\n return _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].randomizeArray(array);\n return array;\n };\n QuestionMatrixModel.prototype.endLoadingFromJson = function () {\n _super.prototype.endLoadingFromJson.call(this);\n this.rows = this.sortVisibleRows(this.rows);\n this.updateVisibilityBasedOnRows();\n };\n QuestionMatrixModel.prototype.processRowsOnSet = function (newRows) {\n return this.sortVisibleRows(newRows);\n };\n Object.defineProperty(QuestionMatrixModel.prototype, \"visibleRows\", {\n /**\n * Returns the list of visible rows as model objects.\n * @see rowsVisibleIf\n */\n get: function () {\n return this.getVisibleRows();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixModel.prototype, \"cells\", {\n get: function () {\n return this.cellsValue;\n },\n set: function (value) {\n this.cells.setJson(value && value.getJson ? value.getJson() : null);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixModel.prototype, \"hasCellText\", {\n get: function () {\n return !this.cells.isEmpty;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixModel.prototype.setCellText = function (row, column, val) {\n this.cells.setCellText(row, column, val);\n };\n QuestionMatrixModel.prototype.getCellText = function (row, column) {\n return this.cells.getCellText(row, column);\n };\n QuestionMatrixModel.prototype.setDefaultCellText = function (column, val) {\n this.cells.setDefaultCellText(column, val);\n };\n QuestionMatrixModel.prototype.getDefaultCellText = function (column) {\n return this.cells.getDefaultCellText(column);\n };\n QuestionMatrixModel.prototype.getCellDisplayText = function (row, column) {\n return this.cells.getCellDisplayText(row, column);\n };\n QuestionMatrixModel.prototype.getCellDisplayLocText = function (row, column) {\n var loc = this.cells.getCellDisplayLocText(row, column);\n return loc ? loc : this.emptyLocalizableString;\n };\n QuestionMatrixModel.prototype.supportGoNextPageAutomatic = function () {\n return this.hasValuesInAllRows();\n };\n QuestionMatrixModel.prototype.onCheckForErrors = function (errors, isOnValueChanged) {\n _super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged);\n if ((!isOnValueChanged || this.errors.length > 0) &&\n this.hasErrorInRows()) {\n errors.push(new _error__WEBPACK_IMPORTED_MODULE_6__[\"RequiredInAllRowsError\"](null, this));\n }\n };\n QuestionMatrixModel.prototype.hasErrorInRows = function () {\n if (!this.isAllRowRequired)\n return false;\n return !this.hasValuesInAllRows();\n };\n QuestionMatrixModel.prototype.hasValuesInAllRows = function () {\n var rows = this.generatedVisibleRows;\n if (!rows)\n rows = this.visibleRows;\n if (!rows)\n return true;\n for (var i = 0; i < rows.length; i++) {\n if (this.isValueEmpty(rows[i].value))\n return false;\n }\n return true;\n };\n QuestionMatrixModel.prototype.getIsAnswered = function () {\n return _super.prototype.getIsAnswered.call(this) && this.hasValuesInAllRows();\n };\n QuestionMatrixModel.prototype.createMatrixRow = function (item, fullName, value) {\n var row = new MatrixRowModel(item, fullName, this, value);\n this.onMatrixRowCreated(row);\n return row;\n };\n QuestionMatrixModel.prototype.onMatrixRowCreated = function (row) { };\n QuestionMatrixModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) {\n if (updateIsAnswered === void 0) { updateIsAnswered = true; }\n _super.prototype.setQuestionValue.call(this, newValue, this.isRowChanging || updateIsAnswered);\n if (!this.generatedVisibleRows || this.generatedVisibleRows.length == 0)\n return;\n this.isRowChanging = true;\n var val = this.value;\n if (!val)\n val = {};\n if (this.rows.length == 0) {\n this.generatedVisibleRows[0].value = val;\n }\n else {\n for (var i = 0; i < this.generatedVisibleRows.length; i++) {\n var row = this.generatedVisibleRows[i];\n var rowVal = val[row.name];\n if (this.isValueEmpty(rowVal))\n rowVal = null;\n this.generatedVisibleRows[i].value = rowVal;\n }\n }\n this.updateIsAnswered();\n this.isRowChanging = false;\n };\n QuestionMatrixModel.prototype.getDisplayValueCore = function (keysAsText, value) {\n var res = {};\n for (var key in value) {\n var newKey = keysAsText\n ? _itemvalue__WEBPACK_IMPORTED_MODULE_1__[\"ItemValue\"].getTextOrHtmlByValue(this.rows, key)\n : key;\n if (!newKey)\n newKey = key;\n var newValue = _itemvalue__WEBPACK_IMPORTED_MODULE_1__[\"ItemValue\"].getTextOrHtmlByValue(this.columns, value[key]);\n if (!newValue)\n newValue = value[key];\n res[newKey] = newValue;\n }\n return res;\n };\n QuestionMatrixModel.prototype.getPlainData = function (options) {\n var _this = this;\n if (options === void 0) { options = {\n includeEmpty: true,\n }; }\n var questionPlainData = _super.prototype.getPlainData.call(this, options);\n if (!!questionPlainData) {\n var values = this.createValueCopy();\n questionPlainData.isNode = true;\n questionPlainData.data = Object.keys(values || {}).map(function (rowName) {\n var row = _this.rows.filter(function (r) { return r.value === rowName; })[0];\n var rowDataItem = {\n name: rowName,\n title: !!row ? row.text : \"row\",\n value: values[rowName],\n displayValue: _itemvalue__WEBPACK_IMPORTED_MODULE_1__[\"ItemValue\"].getTextOrHtmlByValue(_this.visibleColumns, values[rowName]),\n getString: function (val) {\n return typeof val === \"object\" ? JSON.stringify(val) : val;\n },\n isNode: false,\n };\n var item = _itemvalue__WEBPACK_IMPORTED_MODULE_1__[\"ItemValue\"].getItemByValue(_this.visibleColumns, values[rowName]);\n if (!!item) {\n (options.calculations || []).forEach(function (calculation) {\n rowDataItem[calculation.propertyName] =\n item[calculation.propertyName];\n });\n }\n return rowDataItem;\n });\n }\n return questionPlainData;\n };\n QuestionMatrixModel.prototype.addConditionObjectsByContext = function (objects, context) {\n for (var i = 0; i < this.rows.length; i++) {\n var row = this.rows[i];\n if (!!row.value) {\n objects.push({\n name: this.getValueName() + \".\" + row.value,\n text: this.processedTitle + \".\" + row.calculatedText,\n question: this,\n });\n }\n }\n };\n QuestionMatrixModel.prototype.getConditionJson = function (operator, path) {\n if (operator === void 0) { operator = null; }\n if (path === void 0) { path = null; }\n if (!path)\n return _super.prototype.getConditionJson.call(this);\n var question = new _question_dropdown__WEBPACK_IMPORTED_MODULE_9__[\"QuestionDropdownModel\"](path);\n question.choices = this.columns;\n var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_3__[\"JsonObject\"]().toJsonObject(question);\n json[\"type\"] = question.getType();\n return json;\n };\n QuestionMatrixModel.prototype.clearValueIfInvisible = function () {\n _super.prototype.clearValueIfInvisible.call(this);\n if (this.hasRows) {\n this.clearInvisibleValuesInRows();\n }\n };\n QuestionMatrixModel.prototype.getFirstInputElementId = function () {\n var rows = this.generatedVisibleRows;\n if (!rows)\n rows = this.visibleRows;\n if (rows.length > 0 && this.visibleColumns.length > 0) {\n return this.inputId + \"_\" + rows[0].name + \"_\" + 0;\n }\n return _super.prototype.getFirstInputElementId.call(this);\n };\n QuestionMatrixModel.prototype.onRowsChanged = function () {\n this.updateVisibilityBasedOnRows();\n _super.prototype.onRowsChanged.call(this);\n };\n QuestionMatrixModel.prototype.updateVisibilityBasedOnRows = function () {\n if (this.hideIfRowsEmpty) {\n this.visible =\n this.rows.length > 0 &&\n (!this.filteredRows || this.filteredRows.length > 0);\n }\n };\n //IMatrixData\n QuestionMatrixModel.prototype.onMatrixRowChanged = function (row) {\n if (this.isRowChanging)\n return;\n this.isRowChanging = true;\n if (!this.hasRows) {\n this.setNewValue(row.value);\n }\n else {\n var newValue = this.value;\n if (!newValue) {\n newValue = {};\n }\n newValue[row.name] = row.value;\n this.setNewValue(newValue);\n }\n this.isRowChanging = false;\n };\n QuestionMatrixModel.prototype.getCorrectedRowValue = function (value) {\n for (var i = 0; i < this.columns.length; i++) {\n if (value === this.columns[i].value)\n return value;\n }\n for (var i = 0; i < this.columns.length; i++) {\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isTwoValueEquals(value, this.columns[i].value))\n return this.columns[i].value;\n }\n return value;\n };\n QuestionMatrixModel.prototype.getSearchableItemValueKeys = function (keys) {\n keys.push(\"columns\");\n keys.push(\"rows\");\n };\n Object.defineProperty(QuestionMatrixModel.prototype, \"SurveyModel\", {\n get: function () {\n return this.survey;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixModel.prototype.getColumnHeaderWrapperComponentName = function (cell) {\n return this.SurveyModel.getElementWrapperComponentName({ column: cell }, \"column-header\");\n };\n QuestionMatrixModel.prototype.getColumnHeaderWrapperComponentData = function (cell) {\n return this.SurveyModel.getElementWrapperComponentData({ column: cell }, \"column-header\");\n };\n QuestionMatrixModel.prototype.getRowHeaderWrapperComponentName = function (cell) {\n return this.SurveyModel.getElementWrapperComponentName({ row: cell }, \"row-header\");\n };\n QuestionMatrixModel.prototype.getRowHeaderWrapperComponentData = function (cell) {\n return this.SurveyModel.getElementWrapperComponentData({ row: cell }, \"row-header\");\n };\n return QuestionMatrixModel;\n}(_martixBase__WEBPACK_IMPORTED_MODULE_2__[\"QuestionMatrixBaseModel\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_3__[\"Serializer\"].addClass(\"matrix\", [\n {\n name: \"columns:itemvalue[]\",\n baseValue: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_5__[\"surveyLocalization\"].getString(\"matrix_column\");\n },\n },\n {\n name: \"rows:itemvalue[]\",\n baseValue: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_5__[\"surveyLocalization\"].getString(\"matrix_row\");\n },\n },\n { name: \"cells:cells\", serializationProperty: \"cells\" },\n {\n name: \"rowsOrder\",\n default: \"initial\",\n choices: [\"initial\", \"random\"],\n },\n \"isAllRowRequired:boolean\",\n \"hideIfRowsEmpty:boolean\",\n], function () {\n return new QuestionMatrixModel(\"\");\n}, \"matrixbase\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_7__[\"QuestionFactory\"].Instance.registerQuestion(\"matrix\", function (name) {\n var q = new QuestionMatrixModel(name);\n q.rows = _questionfactory__WEBPACK_IMPORTED_MODULE_7__[\"QuestionFactory\"].DefaultRows;\n q.columns = _questionfactory__WEBPACK_IMPORTED_MODULE_7__[\"QuestionFactory\"].DefaultColums;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_matrixdropdown.ts\":\n/*!****************************************!*\\\n !*** ./src/question_matrixdropdown.ts ***!\n \\****************************************/\n/*! exports provided: MatrixDropdownRowModel, QuestionMatrixDropdownModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownRowModel\", function() { return MatrixDropdownRowModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownModel\", function() { return QuestionMatrixDropdownModel; });\n/* harmony import */ var _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./question_matrixdropdownbase */ \"./src/question_matrixdropdownbase.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\nvar MatrixDropdownRowModel = /** @class */ (function (_super) {\n __extends(MatrixDropdownRowModel, _super);\n function MatrixDropdownRowModel(name, item, data, value) {\n var _this = _super.call(this, data, value) || this;\n _this.name = name;\n _this.item = item;\n _this.buildCells(value);\n return _this;\n }\n Object.defineProperty(MatrixDropdownRowModel.prototype, \"rowName\", {\n get: function () {\n return this.name;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownRowModel.prototype, \"text\", {\n get: function () {\n return this.item.text;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownRowModel.prototype, \"locText\", {\n get: function () {\n return this.item.locText;\n },\n enumerable: false,\n configurable: true\n });\n return MatrixDropdownRowModel;\n}(_question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDropdownRowModelBase\"]));\n\n/**\n * A Model for a matrix dropdown question. You may use a dropdown, checkbox, radiogroup, text and comment questions as a cell editors.\n */\nvar QuestionMatrixDropdownModel = /** @class */ (function (_super) {\n __extends(QuestionMatrixDropdownModel, _super);\n function QuestionMatrixDropdownModel(name) {\n var _this = _super.call(this, name) || this;\n _this.createLocalizableString(\"totalText\", _this, true);\n var self = _this;\n _this.registerFunctionOnPropertyValueChanged(\"rows\", function () {\n self.clearGeneratedRows();\n self.resetRenderedTable();\n self.filterItems();\n });\n return _this;\n }\n QuestionMatrixDropdownModel.prototype.getType = function () {\n return \"matrixdropdown\";\n };\n Object.defineProperty(QuestionMatrixDropdownModel.prototype, \"totalText\", {\n /**\n * Set this property to show it on the first column for the total row.\n */\n get: function () {\n return this.getLocalizableStringText(\"totalText\", \"\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"totalText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModel.prototype, \"locTotalText\", {\n get: function () {\n return this.getLocalizableString(\"totalText\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModel.prototype.getFooterText = function () {\n return this.locTotalText;\n };\n Object.defineProperty(QuestionMatrixDropdownModel.prototype, \"rowTitleWidth\", {\n /**\n * The column width for the first column, row title column.\n */\n get: function () {\n return this.getPropertyValue(\"rowTitleWidth\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"rowTitleWidth\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModel.prototype.getRowTitleWidth = function () {\n return this.rowTitleWidth;\n };\n QuestionMatrixDropdownModel.prototype.getDisplayValueCore = function (keysAsText, value) {\n if (!value)\n return value;\n var rows = this.visibleRows;\n var res = {};\n for (var i = 0; i < rows.length; i++) {\n var rowValue = this.rows[i].value;\n var val = value[rowValue];\n if (!val)\n continue;\n if (keysAsText) {\n var displayRowValue = _itemvalue__WEBPACK_IMPORTED_MODULE_2__[\"ItemValue\"].getTextOrHtmlByValue(this.rows, rowValue);\n if (!!displayRowValue) {\n rowValue = displayRowValue;\n }\n }\n res[rowValue] = this.getRowDisplayValue(keysAsText, rows[i], val);\n }\n return res;\n };\n QuestionMatrixDropdownModel.prototype.addConditionObjectsByContext = function (objects, context) {\n var hasContext = !!context ? this.columns.indexOf(context) > -1 : false;\n for (var i = 0; i < this.rows.length; i++) {\n var row = this.rows[i];\n if (!row.value)\n continue;\n var prefixName = this.getValueName() + \".\" + row.value + \".\";\n var prefixTitle = this.processedTitle + \".\" + row.calculatedText + \".\";\n for (var j = 0; j < this.columns.length; j++) {\n var column = this.columns[j];\n objects.push({\n name: prefixName + column.name,\n text: prefixTitle + column.fullTitle,\n question: this,\n });\n }\n }\n if (hasContext) {\n for (var i = 0; i < this.columns.length; i++) {\n var column = this.columns[i];\n if (column == context)\n continue;\n objects.push({\n name: \"row.\" + column.name,\n text: \"row.\" + column.fullTitle,\n question: this,\n });\n }\n }\n };\n QuestionMatrixDropdownModel.prototype.clearIncorrectValues = function () {\n var val = this.value;\n if (!val)\n return;\n var newVal = null;\n var isChanged = false;\n var rows = !!this.filteredRows ? this.filteredRows : this.rows;\n for (var key in val) {\n if (_itemvalue__WEBPACK_IMPORTED_MODULE_2__[\"ItemValue\"].getItemByValue(rows, key)) {\n if (newVal == null)\n newVal = {};\n newVal[key] = val[key];\n }\n else {\n isChanged = true;\n }\n }\n if (isChanged) {\n this.value = newVal;\n }\n _super.prototype.clearIncorrectValues.call(this);\n };\n QuestionMatrixDropdownModel.prototype.clearValueIfInvisible = function () {\n _super.prototype.clearValueIfInvisible.call(this);\n this.clearInvisibleValuesInRows();\n };\n QuestionMatrixDropdownModel.prototype.generateRows = function () {\n var result = new Array();\n var rows = !!this.filteredRows ? this.filteredRows : this.rows;\n if (!rows || rows.length === 0)\n return result;\n var val = this.value;\n if (!val)\n val = {};\n for (var i = 0; i < rows.length; i++) {\n if (!rows[i].value)\n continue;\n result.push(this.createMatrixRow(rows[i], val[rows[i].value]));\n }\n return result;\n };\n QuestionMatrixDropdownModel.prototype.createMatrixRow = function (item, value) {\n return new MatrixDropdownRowModel(item.value, item, this, value);\n };\n QuestionMatrixDropdownModel.prototype.getSearchableItemValueKeys = function (keys) {\n keys.push(\"rows\");\n };\n return QuestionMatrixDropdownModel;\n}(_question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownModelBase\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"matrixdropdown\", [\n {\n name: \"rows:itemvalue[]\",\n },\n \"rowsVisibleIf:condition\",\n \"rowTitleWidth\",\n { name: \"totalText\", serializationProperty: \"locTotalText\" },\n], function () {\n return new QuestionMatrixDropdownModel(\"\");\n}, \"matrixdropdownbase\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_3__[\"QuestionFactory\"].Instance.registerQuestion(\"matrixdropdown\", function (name) {\n var q = new QuestionMatrixDropdownModel(name);\n q.choices = [1, 2, 3, 4, 5];\n q.rows = _questionfactory__WEBPACK_IMPORTED_MODULE_3__[\"QuestionFactory\"].DefaultRows;\n _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownModelBase\"].addDefaultColumns(q);\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_matrixdropdownbase.ts\":\n/*!********************************************!*\\\n !*** ./src/question_matrixdropdownbase.ts ***!\n \\********************************************/\n/*! exports provided: matrixDropdownColumnTypes, MatrixDropdownColumn, MatrixDropdownCell, MatrixDropdownTotalCell, MatrixDropdownRowModelBase, MatrixDropdownTotalRowModel, QuestionMatrixDropdownRenderedCell, QuestionMatrixDropdownRenderedRow, QuestionMatrixDropdownRenderedTable, QuestionMatrixDropdownModelBase */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"matrixDropdownColumnTypes\", function() { return matrixDropdownColumnTypes; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownColumn\", function() { return MatrixDropdownColumn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownCell\", function() { return MatrixDropdownCell; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownTotalCell\", function() { return MatrixDropdownTotalCell; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownRowModelBase\", function() { return MatrixDropdownRowModelBase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MatrixDropdownTotalRowModel\", function() { return MatrixDropdownTotalRowModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedCell\", function() { return QuestionMatrixDropdownRenderedCell; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedRow\", function() { return QuestionMatrixDropdownRenderedRow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownRenderedTable\", function() { return QuestionMatrixDropdownRenderedTable; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDropdownModelBase\", function() { return QuestionMatrixDropdownModelBase; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _martixBase__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./martixBase */ \"./src/martixBase.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./survey-element */ \"./src/survey-element.ts\");\n/* harmony import */ var _textPreProcessor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./textPreProcessor */ \"./src/textPreProcessor.ts\");\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _question_expression__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./question_expression */ \"./src/question_expression.ts\");\n/* harmony import */ var _functionsfactory__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./functionsfactory */ \"./src/functionsfactory.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _actions_action__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./actions/action */ \"./src/actions/action.ts\");\n/* harmony import */ var _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./actions/adaptive-container */ \"./src/actions/adaptive-container.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data) {\n cellQuestion.storeOthersAsComment = !!question\n ? question.storeOthersAsComment\n : false;\n if ((!cellQuestion.choices || cellQuestion.choices.length == 0) &&\n cellQuestion.choicesByUrl.isEmpty) {\n cellQuestion.choices = question.choices;\n }\n if (!cellQuestion.choicesByUrl.isEmpty) {\n cellQuestion.choicesByUrl.run(data.getTextProcessor());\n }\n}\nvar matrixDropdownColumnTypes = {\n dropdown: {\n properties: [\n \"choices\",\n \"choicesOrder\",\n \"choicesByUrl\",\n \"optionsCaption\",\n \"otherText\",\n \"choicesVisibleIf\",\n ],\n onCellQuestionUpdate: function (cellQuestion, column, question, data) {\n onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data);\n if (!!cellQuestion.locOptionsCaption &&\n cellQuestion.locOptionsCaption.isEmpty &&\n !question.locOptionsCaption.isEmpty) {\n cellQuestion.optionsCaption = question.optionsCaption;\n }\n },\n },\n checkbox: {\n properties: [\n \"choices\",\n \"choicesOrder\",\n \"choicesByUrl\",\n \"otherText\",\n \"choicesVisibleIf\",\n \"hasSelectAll\",\n \"hasNone\",\n ],\n onCellQuestionUpdate: function (cellQuestion, column, question, data) {\n onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data);\n cellQuestion.colCount =\n column.colCount > -1 ? column.colCount : question.columnColCount;\n },\n },\n radiogroup: {\n properties: [\n \"choices\",\n \"choicesOrder\",\n \"choicesByUrl\",\n \"otherText\",\n \"choicesVisibleIf\",\n ],\n onCellQuestionUpdate: function (cellQuestion, column, question, data) {\n onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data);\n cellQuestion.colCount =\n column.colCount > -1 ? column.colCount : question.columnColCount;\n },\n },\n text: {\n properties: [\"placeHolder\", \"inputType\", \"maxLength\", \"min\", \"max\", \"step\"],\n onCellQuestionUpdate: function (cellQuestion, column, question, data) { },\n },\n comment: {\n properties: [\"placeHolder\", \"rows\", \"maxLength\"],\n onCellQuestionUpdate: function (cellQuestion, column, question, data) { },\n },\n boolean: {\n properties: [\"renderAs\", \"defaultValue\"],\n onCellQuestionUpdate: function (cellQuestion, column, question, data) {\n cellQuestion.showTitle = true;\n cellQuestion.renderAs = column.renderAs;\n },\n },\n expression: {\n properties: [\"expression\", \"displayStyle\", \"currency\"],\n onCellQuestionUpdate: function (cellQuestion, column, question, data) { },\n },\n rating: {\n properties: [\"rateValues\"],\n },\n};\nvar MatrixDropdownColumn = /** @class */ (function (_super) {\n __extends(MatrixDropdownColumn, _super);\n function MatrixDropdownColumn(name, title) {\n if (title === void 0) { title = null; }\n var _this = _super.call(this) || this;\n _this.colOwnerValue = null;\n _this.indexValue = -1;\n _this._isVisible = true;\n _this._hasVisibleCell = true;\n var self = _this;\n _this.createLocalizableString(\"totalFormat\", _this);\n _this.registerFunctionOnPropertyValueChanged(\"showInMultipleColumns\", function () {\n self.doShowInMultipleColumnsChanged();\n });\n _this.updateTemplateQuestion();\n _this.name = name;\n if (title) {\n _this.title = title;\n }\n else {\n _this.templateQuestion.locTitle.strChanged();\n }\n return _this;\n }\n MatrixDropdownColumn.getColumnTypes = function () {\n var res = [];\n for (var key in matrixDropdownColumnTypes) {\n res.push(key);\n }\n return res;\n };\n MatrixDropdownColumn.prototype.getOriginalObj = function () {\n return this.templateQuestion;\n };\n MatrixDropdownColumn.prototype.getClassNameProperty = function () {\n return \"cellType\";\n };\n MatrixDropdownColumn.prototype.getSurvey = function (live) {\n if (live === void 0) { live = false; }\n return !!this.colOwner ? this.colOwner.survey : null;\n };\n MatrixDropdownColumn.prototype.endLoadingFromJson = function () {\n var _this = this;\n _super.prototype.endLoadingFromJson.call(this);\n this.templateQuestion.endLoadingFromJson();\n this.templateQuestion.onGetSurvey = function () {\n return _this.getSurvey();\n };\n };\n MatrixDropdownColumn.prototype.getDynamicPropertyName = function () {\n return \"cellType\";\n };\n MatrixDropdownColumn.prototype.getDynamicType = function () {\n return this.calcCellQuestionType();\n };\n Object.defineProperty(MatrixDropdownColumn.prototype, \"colOwner\", {\n get: function () {\n return this.colOwnerValue;\n },\n set: function (value) {\n this.colOwnerValue = value;\n if (!!value) {\n this.updateTemplateQuestion();\n }\n },\n enumerable: false,\n configurable: true\n });\n MatrixDropdownColumn.prototype.locStrsChanged = function () {\n _super.prototype.locStrsChanged.call(this);\n this.locTitle.strChanged();\n };\n MatrixDropdownColumn.prototype.addUsedLocales = function (locales) {\n _super.prototype.addUsedLocales.call(this, locales);\n this.templateQuestion.addUsedLocales(locales);\n };\n Object.defineProperty(MatrixDropdownColumn.prototype, \"index\", {\n get: function () {\n return this.indexValue;\n },\n enumerable: false,\n configurable: true\n });\n MatrixDropdownColumn.prototype.setIndex = function (val) {\n this.indexValue = val;\n };\n MatrixDropdownColumn.prototype.getType = function () {\n return \"matrixdropdowncolumn\";\n };\n Object.defineProperty(MatrixDropdownColumn.prototype, \"cellType\", {\n get: function () {\n return this.getPropertyValue(\"cellType\");\n },\n set: function (val) {\n val = val.toLocaleLowerCase();\n this.setPropertyValue(\"cellType\", val);\n this.updateTemplateQuestion();\n if (!!this.colOwner) {\n this.colOwner.onColumnCellTypeChanged(this);\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"templateQuestion\", {\n get: function () {\n return this.templateQuestionValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"value\", {\n get: function () {\n return this.templateQuestion.name;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"isVisible\", {\n get: function () {\n return this._isVisible;\n },\n enumerable: false,\n configurable: true\n });\n MatrixDropdownColumn.prototype.setIsVisible = function (newVal) {\n this._isVisible = newVal;\n };\n Object.defineProperty(MatrixDropdownColumn.prototype, \"hasVisibleCell\", {\n get: function () {\n return this._hasVisibleCell;\n },\n set: function (newVal) {\n this._hasVisibleCell = newVal;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"name\", {\n get: function () {\n return this.templateQuestion.name;\n },\n set: function (val) {\n this.templateQuestion.name = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"title\", {\n get: function () {\n return this.templateQuestion.title;\n },\n set: function (val) {\n this.templateQuestion.title = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"locTitle\", {\n get: function () {\n return this.templateQuestion.locTitle;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"fullTitle\", {\n get: function () {\n return this.locTitle.textOrHtml;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"isRequired\", {\n get: function () {\n return this.templateQuestion.isRequired;\n },\n set: function (val) {\n this.templateQuestion.isRequired = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"requiredText\", {\n get: function () {\n return this.templateQuestion.requiredText;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"requiredErrorText\", {\n get: function () {\n return this.templateQuestion.requiredErrorText;\n },\n set: function (val) {\n this.templateQuestion.requiredErrorText = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"locRequiredErrorText\", {\n get: function () {\n return this.templateQuestion.locRequiredErrorText;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"readOnly\", {\n get: function () {\n return this.templateQuestion.readOnly;\n },\n set: function (val) {\n this.templateQuestion.readOnly = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"hasOther\", {\n get: function () {\n return this.templateQuestion.hasOther;\n },\n set: function (val) {\n this.templateQuestion.hasOther = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"visibleIf\", {\n get: function () {\n return this.templateQuestion.visibleIf;\n },\n set: function (val) {\n this.templateQuestion.visibleIf = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"enableIf\", {\n get: function () {\n return this.templateQuestion.enableIf;\n },\n set: function (val) {\n this.templateQuestion.enableIf = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"requiredIf\", {\n get: function () {\n return this.templateQuestion.requiredIf;\n },\n set: function (val) {\n this.templateQuestion.requiredIf = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"isUnique\", {\n get: function () {\n return this.getPropertyValue(\"isUnique\");\n },\n set: function (val) {\n this.setPropertyValue(\"isUnique\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"showInMultipleColumns\", {\n get: function () {\n return this.getPropertyValue(\"showInMultipleColumns\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"showInMultipleColumns\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"isSupportMultipleColumns\", {\n get: function () {\n return [\"checkbox\", \"radiogroup\"].indexOf(this.cellType) > -1;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"isShowInMultipleColumns\", {\n get: function () {\n return this.showInMultipleColumns && this.isSupportMultipleColumns;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"validators\", {\n get: function () {\n return this.templateQuestion.validators;\n },\n set: function (val) {\n this.templateQuestion.validators = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"totalType\", {\n get: function () {\n return this.getPropertyValue(\"totalType\", \"none\");\n },\n set: function (val) {\n this.setPropertyValue(\"totalType\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"totalExpression\", {\n get: function () {\n return this.getPropertyValue(\"totalExpression\");\n },\n set: function (val) {\n this.setPropertyValue(\"totalExpression\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"hasTotal\", {\n get: function () {\n return this.totalType != \"none\" || !!this.totalExpression;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"totalFormat\", {\n get: function () {\n return this.getLocalizableStringText(\"totalFormat\", \"\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"totalFormat\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"locTotalFormat\", {\n get: function () {\n return this.getLocalizableString(\"totalFormat\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"renderAs\", {\n get: function () {\n return this.getPropertyValue(\"renderAs\");\n },\n set: function (val) {\n this.setPropertyValue(\"renderAs\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"totalMaximumFractionDigits\", {\n get: function () {\n return this.getPropertyValue(\"totalMaximumFractionDigits\", -1);\n },\n set: function (val) {\n if (val < -1 || val > 20)\n return;\n this.setPropertyValue(\"totalMaximumFractionDigits\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"totalMinimumFractionDigits\", {\n get: function () {\n return this.getPropertyValue(\"totalMinimumFractionDigits\", -1);\n },\n set: function (val) {\n if (val < -1 || val > 20)\n return;\n this.setPropertyValue(\"totalMinimumFractionDigits\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"totalDisplayStyle\", {\n get: function () {\n return this.getPropertyValue(\"totalDisplayStyle\");\n },\n set: function (val) {\n this.setPropertyValue(\"totalDisplayStyle\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"totalCurrency\", {\n get: function () {\n return this.getPropertyValue(\"totalCurrency\");\n },\n set: function (val) {\n if (Object(_question_expression__WEBPACK_IMPORTED_MODULE_9__[\"getCurrecyCodes\"])().indexOf(val) < 0)\n return;\n this.setPropertyValue(\"totalCurrency\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"minWidth\", {\n get: function () {\n return this.getPropertyValue(\"minWidth\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"minWidth\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"width\", {\n get: function () {\n return this.getPropertyValue(\"width\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"width\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownColumn.prototype, \"colCount\", {\n get: function () {\n return this.getPropertyValue(\"colCount\", -1);\n },\n set: function (val) {\n if (val < -1 || val > 4)\n return;\n this.setPropertyValue(\"colCount\", val);\n },\n enumerable: false,\n configurable: true\n });\n MatrixDropdownColumn.prototype.getLocale = function () {\n return this.colOwner ? this.colOwner.getLocale() : \"\";\n };\n MatrixDropdownColumn.prototype.getMarkdownHtml = function (text, name) {\n return this.colOwner ? this.colOwner.getMarkdownHtml(text, name) : null;\n };\n MatrixDropdownColumn.prototype.getRenderer = function (name) {\n return !!this.colOwner ? this.colOwner.getRenderer(name) : null;\n };\n MatrixDropdownColumn.prototype.getProcessedText = function (text) {\n return this.colOwner ? this.colOwner.getProcessedText(text) : text;\n };\n MatrixDropdownColumn.prototype.createCellQuestion = function (data) {\n var qType = this.calcCellQuestionType();\n var cellQuestion = this.createNewQuestion(qType);\n this.callOnCellQuestionUpdate(cellQuestion, data);\n return cellQuestion;\n };\n MatrixDropdownColumn.prototype.updateCellQuestion = function (cellQuestion, data, onUpdateJson) {\n if (onUpdateJson === void 0) { onUpdateJson = null; }\n this.setQuestionProperties(cellQuestion, onUpdateJson);\n this.callOnCellQuestionUpdate(cellQuestion, data);\n };\n MatrixDropdownColumn.prototype.callOnCellQuestionUpdate = function (cellQuestion, data) {\n var qType = cellQuestion.getType();\n var qDefinition = matrixDropdownColumnTypes[qType];\n if (qDefinition && qDefinition[\"onCellQuestionUpdate\"]) {\n qDefinition[\"onCellQuestionUpdate\"](cellQuestion, this, this.colOwner, data);\n }\n };\n MatrixDropdownColumn.prototype.defaultCellTypeChanged = function () {\n this.updateTemplateQuestion();\n };\n MatrixDropdownColumn.prototype.calcCellQuestionType = function () {\n if (this.cellType !== \"default\")\n return this.cellType;\n if (this.colOwner)\n return this.colOwner.getCellType();\n return _settings__WEBPACK_IMPORTED_MODULE_11__[\"settings\"].matrixDefaultCellType;\n };\n MatrixDropdownColumn.prototype.updateTemplateQuestion = function () {\n var _this = this;\n var prevCellType = this.templateQuestion\n ? this.templateQuestion.getType()\n : \"\";\n var curCellType = this.calcCellQuestionType();\n if (curCellType === prevCellType)\n return;\n if (this.templateQuestion) {\n this.removeProperties(prevCellType);\n }\n this.templateQuestionValue = this.createNewQuestion(curCellType);\n this.templateQuestion.locOwner = this;\n this.addProperties(curCellType);\n this.templateQuestion.onPropertyChanged.add(function (sender, options) {\n _this.propertyValueChanged(options.name, options.oldValue, options.newValue);\n });\n this.templateQuestion.onItemValuePropertyChanged.add(function (sender, options) {\n _this.doItemValuePropertyChanged(options.propertyName, options.obj, options.name, options.newValue, options.oldValue);\n });\n this.templateQuestion.isContentElement = true;\n if (!this.isLoadingFromJson) {\n this.templateQuestion.onGetSurvey = function () {\n return _this.getSurvey();\n };\n }\n this.templateQuestion.locTitle.strChanged();\n };\n MatrixDropdownColumn.prototype.createNewQuestion = function (cellType) {\n var question = _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].createClass(cellType);\n if (!question) {\n question = _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].createClass(\"text\");\n }\n question.loadingOwner = this;\n question.isEditableTemplateElement = true;\n this.setQuestionProperties(question);\n return question;\n };\n MatrixDropdownColumn.prototype.setQuestionProperties = function (question, onUpdateJson) {\n if (onUpdateJson === void 0) { onUpdateJson = null; }\n if (this.templateQuestion) {\n var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"JsonObject\"]().toJsonObject(this.templateQuestion, true);\n if (onUpdateJson) {\n onUpdateJson(json);\n }\n json.type = question.getType();\n new _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"JsonObject\"]().toObject(json, question);\n }\n };\n MatrixDropdownColumn.prototype.propertyValueChanged = function (name, oldValue, newValue) {\n _super.prototype.propertyValueChanged.call(this, name, oldValue, newValue);\n if (!_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].hasOriginalProperty(this, name))\n return;\n if (this.colOwner != null && !this.isLoadingFromJson) {\n this.colOwner.onColumnPropertyChanged(this, name, newValue);\n }\n };\n MatrixDropdownColumn.prototype.doItemValuePropertyChanged = function (propertyName, obj, name, newValue, oldValue) {\n if (!_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].hasOriginalProperty(obj, name))\n return;\n if (this.colOwner != null && !this.isLoadingFromJson) {\n this.colOwner.onColumnItemValuePropertyChanged(this, propertyName, obj, name, newValue, oldValue);\n }\n };\n MatrixDropdownColumn.prototype.doShowInMultipleColumnsChanged = function () {\n if (this.colOwner != null && !this.isLoadingFromJson) {\n this.colOwner.onShowInMultipleColumnsChanged(this);\n }\n };\n MatrixDropdownColumn.prototype.getProperties = function (curCellType) {\n return _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].getDynamicPropertiesByObj(this, curCellType);\n };\n MatrixDropdownColumn.prototype.removeProperties = function (curCellType) {\n var properties = this.getProperties(curCellType);\n for (var i = 0; i < properties.length; i++) {\n var prop = properties[i];\n delete this[prop.name];\n if (prop.serializationProperty) {\n delete this[prop.serializationProperty];\n }\n }\n };\n MatrixDropdownColumn.prototype.addProperties = function (curCellType) {\n var question = this.templateQuestion;\n var properties = this.getProperties(curCellType);\n for (var i = 0; i < properties.length; i++) {\n var prop = properties[i];\n this.addProperty(question, prop.name, false);\n if (prop.serializationProperty) {\n this.addProperty(question, prop.serializationProperty, true);\n }\n }\n };\n MatrixDropdownColumn.prototype.addProperty = function (question, propName, isReadOnly) {\n var desc = {\n configurable: true,\n get: function () {\n return question[propName];\n },\n };\n if (!isReadOnly) {\n desc[\"set\"] = function (v) {\n question[propName] = v;\n };\n }\n Object.defineProperty(this, propName, desc);\n };\n return MatrixDropdownColumn;\n}(_base__WEBPACK_IMPORTED_MODULE_3__[\"Base\"]));\n\nvar MatrixDropdownCell = /** @class */ (function () {\n function MatrixDropdownCell(column, row, data) {\n this.column = column;\n this.row = row;\n this.data = data;\n this.questionValue = this.createQuestion(column, row, data);\n this.questionValue.updateCustomWidget();\n }\n MatrixDropdownCell.prototype.locStrsChanged = function () {\n this.question.locStrsChanged();\n };\n MatrixDropdownCell.prototype.createQuestion = function (column, row, data) {\n var res = data.createQuestion(this.row, this.column);\n res.validateValueCallback = function () {\n return data.validateCell(row, column.name, row.value);\n };\n _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"CustomPropertiesCollection\"].getProperties(column.getType()).forEach(function (property) {\n var propertyName = property.name;\n if (column[propertyName] !== undefined) {\n res[propertyName] = column[propertyName];\n }\n });\n return res;\n };\n Object.defineProperty(MatrixDropdownCell.prototype, \"question\", {\n get: function () {\n return this.questionValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownCell.prototype, \"value\", {\n get: function () {\n return this.question.value;\n },\n set: function (value) {\n this.question.value = value;\n },\n enumerable: false,\n configurable: true\n });\n MatrixDropdownCell.prototype.runCondition = function (values, properties) {\n this.question.runCondition(values, properties);\n };\n return MatrixDropdownCell;\n}());\n\nvar MatrixDropdownTotalCell = /** @class */ (function (_super) {\n __extends(MatrixDropdownTotalCell, _super);\n function MatrixDropdownTotalCell(column, row, data) {\n var _this = _super.call(this, column, row, data) || this;\n _this.column = column;\n _this.row = row;\n _this.data = data;\n _this.updateCellQuestion();\n return _this;\n }\n MatrixDropdownTotalCell.prototype.createQuestion = function (column, row, data) {\n var res = _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].createClass(\"expression\");\n res.setSurveyImpl(row);\n return res;\n };\n MatrixDropdownTotalCell.prototype.locStrsChanged = function () {\n this.updateCellQuestion();\n _super.prototype.locStrsChanged.call(this);\n };\n MatrixDropdownTotalCell.prototype.updateCellQuestion = function () {\n this.question.locCalculation();\n this.column.updateCellQuestion(this.question, null, function (json) {\n delete json[\"defaultValue\"];\n });\n this.question.expression = this.getTotalExpression();\n this.question.format = this.column.totalFormat;\n this.question.currency = this.column.totalCurrency;\n this.question.displayStyle = this.column.totalDisplayStyle;\n this.question.maximumFractionDigits = this.column.totalMaximumFractionDigits;\n this.question.minimumFractionDigits = this.column.totalMinimumFractionDigits;\n this.question.unlocCalculation();\n this.question.runIfReadOnly = true;\n };\n MatrixDropdownTotalCell.prototype.getTotalExpression = function () {\n if (!!this.column.totalExpression)\n return this.column.totalExpression;\n if (this.column.totalType == \"none\")\n return \"\";\n var funName = this.column.totalType + \"InArray\";\n if (!_functionsfactory__WEBPACK_IMPORTED_MODULE_10__[\"FunctionFactory\"].Instance.hasFunction(funName))\n return \"\";\n return funName + \"({self}, '\" + this.column.name + \"')\";\n };\n return MatrixDropdownTotalCell;\n}(MatrixDropdownCell));\n\nvar MatrixDropdownRowTextProcessor = /** @class */ (function (_super) {\n __extends(MatrixDropdownRowTextProcessor, _super);\n function MatrixDropdownRowTextProcessor(row, variableName) {\n var _this = _super.call(this, variableName) || this;\n _this.row = row;\n _this.variableName = variableName;\n return _this;\n }\n Object.defineProperty(MatrixDropdownRowTextProcessor.prototype, \"survey\", {\n get: function () {\n return this.row.getSurvey();\n },\n enumerable: false,\n configurable: true\n });\n MatrixDropdownRowTextProcessor.prototype.getValues = function () {\n return this.row.value;\n };\n MatrixDropdownRowTextProcessor.prototype.getQuestionByName = function (name) {\n return this.row.getQuestionByName(name);\n };\n MatrixDropdownRowTextProcessor.prototype.onCustomProcessText = function (textValue) {\n if (textValue.name == MatrixDropdownRowModelBase.IndexVariableName) {\n textValue.isExists = true;\n textValue.value = this.row.rowIndex;\n return true;\n }\n if (textValue.name == MatrixDropdownRowModelBase.RowValueVariableName) {\n textValue.isExists = true;\n textValue.value = this.row.rowName;\n return true;\n }\n return false;\n };\n return MatrixDropdownRowTextProcessor;\n}(_textPreProcessor__WEBPACK_IMPORTED_MODULE_5__[\"QuestionTextProcessor\"]));\nvar MatrixDropdownRowModelBase = /** @class */ (function () {\n function MatrixDropdownRowModelBase(data, value) {\n var _this = this;\n this.isSettingValue = false;\n this.detailPanelValue = null;\n this.cells = [];\n this.isCreatingDetailPanel = false;\n this.data = data;\n this.subscribeToChanges(value);\n this.textPreProcessor = new MatrixDropdownRowTextProcessor(this, MatrixDropdownRowModelBase.RowVariableName);\n this.showHideDetailPanelClick = function () {\n _this.showHideDetailPanel();\n };\n this.idValue = MatrixDropdownRowModelBase.getId();\n }\n MatrixDropdownRowModelBase.getId = function () {\n return \"srow_\" + MatrixDropdownRowModelBase.idCounter++;\n };\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"id\", {\n get: function () {\n return this.idValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"rowName\", {\n get: function () {\n return null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"text\", {\n get: function () {\n return this.rowName;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"value\", {\n get: function () {\n var result = {};\n var questions = this.questions;\n for (var i = 0; i < questions.length; i++) {\n var question = questions[i];\n if (!question.isEmpty()) {\n result[question.getValueName()] = question.value;\n }\n if (!!question.comment &&\n !!this.getSurvey() &&\n this.getSurvey().storeOthersAsComment) {\n result[question.getValueName() + _settings__WEBPACK_IMPORTED_MODULE_11__[\"settings\"].commentPrefix] =\n question.comment;\n }\n }\n return result;\n },\n set: function (value) {\n this.isSettingValue = true;\n this.subscribeToChanges(value);\n var questions = this.questions;\n for (var i = 0; i < questions.length; i++) {\n var question = questions[i];\n var val = this.getCellValue(value, question.getValueName());\n var oldComment = question.comment;\n var comment = !!value\n ? value[question.getValueName() + _settings__WEBPACK_IMPORTED_MODULE_11__[\"settings\"].commentPrefix]\n : \"\";\n if (comment == undefined)\n comment = \"\";\n question.updateValueFromSurvey(val);\n if (!!comment || _helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isTwoValueEquals(oldComment, question.comment)) {\n question.updateCommentFromSurvey(comment);\n }\n question.onSurveyValueChanged(val);\n }\n this.isSettingValue = false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"locText\", {\n get: function () {\n return null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"hasPanel\", {\n get: function () {\n if (!this.data)\n return false;\n return this.data.hasDetailPanel(this);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"detailPanel\", {\n get: function () {\n return this.detailPanelValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"detailPanelId\", {\n get: function () {\n return !!this.detailPanel ? this.detailPanel.id : \"\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"isDetailPanelShowing\", {\n get: function () {\n return !!this.data ? this.data.getIsDetailPanelShowing(this) : false;\n },\n enumerable: false,\n configurable: true\n });\n MatrixDropdownRowModelBase.prototype.setIsDetailPanelShowing = function (val) {\n if (!!this.data) {\n this.data.setIsDetailPanelShowing(this, val);\n }\n if (!!this.onDetailPanelShowingChanged) {\n this.onDetailPanelShowingChanged();\n }\n };\n MatrixDropdownRowModelBase.prototype.showHideDetailPanel = function () {\n if (this.isDetailPanelShowing) {\n this.hideDetailPanel();\n }\n else {\n this.showDetailPanel();\n }\n };\n MatrixDropdownRowModelBase.prototype.showDetailPanel = function () {\n this.ensureDetailPanel();\n if (!this.detailPanelValue)\n return;\n this.setIsDetailPanelShowing(true);\n };\n MatrixDropdownRowModelBase.prototype.hideDetailPanel = function (destroyPanel) {\n if (destroyPanel === void 0) { destroyPanel = false; }\n this.setIsDetailPanelShowing(false);\n if (destroyPanel) {\n this.detailPanelValue = null;\n }\n };\n MatrixDropdownRowModelBase.prototype.ensureDetailPanel = function () {\n if (this.isCreatingDetailPanel)\n return;\n if (!!this.detailPanelValue || !this.hasPanel || !this.data)\n return;\n this.isCreatingDetailPanel = true;\n this.detailPanelValue = this.data.createRowDetailPanel(this);\n var questions = this.detailPanelValue.questions;\n var value = this.data.getRowValue(this.data.getRowIndex(this));\n if (!_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isValueEmpty(value)) {\n for (var i = 0; i < questions.length; i++) {\n var key = questions[i].getValueName();\n if (!_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isValueEmpty(value[key])) {\n questions[i].value = value[key];\n }\n }\n }\n this.detailPanelValue.setSurveyImpl(this);\n this.isCreatingDetailPanel = false;\n };\n MatrixDropdownRowModelBase.prototype.getAllValues = function () {\n return this.value;\n };\n MatrixDropdownRowModelBase.prototype.getFilteredValues = function () {\n var allValues = this.getAllValues();\n var values = { row: allValues };\n for (var key in allValues) {\n values[key] = allValues[key];\n }\n return values;\n };\n MatrixDropdownRowModelBase.prototype.getFilteredProperties = function () {\n return { survey: this.getSurvey(), row: this };\n };\n MatrixDropdownRowModelBase.prototype.runCondition = function (values, properties) {\n if (!!this.data) {\n values[MatrixDropdownRowModelBase.OwnerVariableName] = this.data.value;\n }\n values[MatrixDropdownRowModelBase.IndexVariableName] = this.rowIndex;\n values[MatrixDropdownRowModelBase.RowValueVariableName] = this.rowName;\n if (!properties)\n properties = {};\n properties[MatrixDropdownRowModelBase.RowVariableName] = this;\n for (var i = 0; i < this.cells.length; i++) {\n values[MatrixDropdownRowModelBase.RowVariableName] = this.value;\n this.cells[i].runCondition(values, properties);\n }\n if (!!this.detailPanel) {\n this.detailPanel.runCondition(values, properties);\n }\n };\n MatrixDropdownRowModelBase.prototype.clearValue = function () {\n var questions = this.questions;\n for (var i = 0; i < questions.length; i++) {\n questions[i].clearValue();\n }\n };\n MatrixDropdownRowModelBase.prototype.onAnyValueChanged = function (name) {\n var questions = this.questions;\n for (var i = 0; i < questions.length; i++) {\n questions[i].onAnyValueChanged(name);\n }\n };\n MatrixDropdownRowModelBase.prototype.getDataValueCore = function (valuesHash, key) {\n var survey = this.getSurvey();\n if (!!survey) {\n return survey.getDataValueCore(valuesHash, key);\n }\n else {\n return valuesHash[key];\n }\n };\n MatrixDropdownRowModelBase.prototype.getValue = function (name) {\n var question = this.getQuestionByName(name);\n return !!question ? question.value : null;\n };\n MatrixDropdownRowModelBase.prototype.setValue = function (name, newColumnValue) {\n this.setValueCore(name, newColumnValue, false);\n };\n MatrixDropdownRowModelBase.prototype.getVariable = function (name) {\n return undefined;\n };\n MatrixDropdownRowModelBase.prototype.setVariable = function (name, newValue) { };\n MatrixDropdownRowModelBase.prototype.getComment = function (name) {\n var question = this.getQuestionByName(name);\n return !!question ? question.comment : \"\";\n };\n MatrixDropdownRowModelBase.prototype.setComment = function (name, newValue, locNotification) {\n this.setValueCore(name, newValue, true);\n };\n MatrixDropdownRowModelBase.prototype.setValueCore = function (name, newColumnValue, isComment) {\n if (this.isSettingValue)\n return;\n this.updateQuestionsValue(name, newColumnValue, isComment);\n var newValue = this.value;\n var changedName = isComment ? name + _settings__WEBPACK_IMPORTED_MODULE_11__[\"settings\"].commentPrefix : name;\n var changedValue = isComment ? this.getComment(name) : this.getValue(name);\n var changedQuestion = this.getQuestionByName(name);\n var changingValue = this.data.onRowChanging(this, changedName, newValue);\n if (!!changedQuestion &&\n !_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isTwoValueEquals(changingValue, changedValue)) {\n if (isComment) {\n changedQuestion.comment = changingValue;\n }\n else {\n changedQuestion.value = changingValue;\n }\n }\n else {\n if (this.data.isValidateOnValueChanging &&\n this.hasQuestonError(changedQuestion))\n return;\n this.data.onRowChanged(this, changedName, newValue, newColumnValue == null && !changedQuestion);\n this.onAnyValueChanged(MatrixDropdownRowModelBase.RowVariableName);\n }\n };\n MatrixDropdownRowModelBase.prototype.updateQuestionsValue = function (name, newColumnValue, isComment) {\n if (!this.detailPanel)\n return;\n var colQuestion = this.getQuestionByColumnName(name);\n var detailQuestion = this.detailPanel.getQuestionByName(name);\n if (!colQuestion || !detailQuestion)\n return;\n var isColQuestion = _helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isTwoValueEquals(newColumnValue, isComment ? colQuestion.comment : colQuestion.value);\n var question = isColQuestion ? detailQuestion : colQuestion;\n this.isSettingValue = true;\n if (!isComment) {\n question.value = newColumnValue;\n }\n else {\n question.comment = newColumnValue;\n }\n this.isSettingValue = false;\n };\n MatrixDropdownRowModelBase.prototype.hasQuestonError = function (question) {\n if (!question)\n return false;\n if (question.hasErrors(true, {\n isOnValueChanged: !this.data.isValidateOnValueChanging,\n }))\n return true;\n if (question.isEmpty())\n return false;\n var cell = this.getCellByColumnName(question.name);\n if (!cell || !cell.column || !cell.column.isUnique)\n return false;\n return this.data.checkIfValueInRowDuplicated(this, question);\n };\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"isEmpty\", {\n get: function () {\n var val = this.value;\n if (_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isValueEmpty(val))\n return true;\n for (var key in val) {\n if (val[key] !== undefined && val[key] !== null)\n return false;\n }\n return true;\n },\n enumerable: false,\n configurable: true\n });\n MatrixDropdownRowModelBase.prototype.getQuestionByColumn = function (column) {\n var cell = this.getCellByColumn(column);\n return !!cell ? cell.question : null;\n };\n MatrixDropdownRowModelBase.prototype.getCellByColumn = function (column) {\n for (var i = 0; i < this.cells.length; i++) {\n if (this.cells[i].column == column)\n return this.cells[i];\n }\n return null;\n };\n MatrixDropdownRowModelBase.prototype.getCellByColumnName = function (columnName) {\n for (var i = 0; i < this.cells.length; i++) {\n if (this.cells[i].column.name == columnName)\n return this.cells[i];\n }\n return null;\n };\n MatrixDropdownRowModelBase.prototype.getQuestionByColumnName = function (columnName) {\n var cell = this.getCellByColumnName(columnName);\n return !!cell ? cell.question : null;\n };\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"questions\", {\n get: function () {\n var res = [];\n for (var i = 0; i < this.cells.length; i++) {\n res.push(this.cells[i].question);\n }\n var detailQuestions = !!this.detailPanel ? this.detailPanel.questions : [];\n for (var i = 0; i < detailQuestions.length; i++) {\n res.push(detailQuestions[i]);\n }\n return res;\n },\n enumerable: false,\n configurable: true\n });\n MatrixDropdownRowModelBase.prototype.getQuestionByName = function (name) {\n var res = this.getQuestionByColumnName(name);\n if (!!res)\n return res;\n return !!this.detailPanel ? this.detailPanel.getQuestionByName(name) : null;\n };\n MatrixDropdownRowModelBase.prototype.getQuestionsByName = function (name) {\n var res = [];\n var q = this.getQuestionByColumnName(name);\n if (!!q)\n res.push(q);\n if (!!this.detailPanel) {\n q = this.detailPanel.getQuestionByName(name);\n if (!!q)\n res.push(q);\n }\n return res;\n };\n MatrixDropdownRowModelBase.prototype.getSharedQuestionByName = function (columnName) {\n return !!this.data\n ? this.data.getSharedQuestionByName(columnName, this)\n : null;\n };\n MatrixDropdownRowModelBase.prototype.clearIncorrectValues = function (val) {\n for (var key in val) {\n var question = this.getQuestionByName(key);\n if (question) {\n var qVal = question.value;\n question.clearIncorrectValues();\n if (!_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isTwoValueEquals(qVal, question.value)) {\n this.setValue(key, question.value);\n }\n }\n else {\n if (!this.getSharedQuestionByName(key) &&\n key.indexOf(_settings__WEBPACK_IMPORTED_MODULE_11__[\"settings\"].matrixTotalValuePostFix) < 0) {\n this.setValue(key, null);\n }\n }\n }\n };\n MatrixDropdownRowModelBase.prototype.getLocale = function () {\n return this.data ? this.data.getLocale() : \"\";\n };\n MatrixDropdownRowModelBase.prototype.getMarkdownHtml = function (text, name) {\n return this.data ? this.data.getMarkdownHtml(text, name) : null;\n };\n MatrixDropdownRowModelBase.prototype.getRenderer = function (name) {\n return this.data ? this.data.getRenderer(name) : null;\n };\n MatrixDropdownRowModelBase.prototype.getProcessedText = function (text) {\n return this.data ? this.data.getProcessedText(text) : text;\n };\n MatrixDropdownRowModelBase.prototype.locStrsChanged = function () {\n for (var i = 0; i < this.cells.length; i++) {\n this.cells[i].locStrsChanged();\n }\n if (!!this.detailPanel) {\n this.detailPanel.locStrsChanged();\n }\n };\n MatrixDropdownRowModelBase.prototype.updateCellQuestionOnColumnChanged = function (column, name, newValue) {\n var cell = this.getCellByColumn(column);\n if (!cell)\n return;\n this.updateCellOnColumnChanged(cell, name, newValue);\n };\n MatrixDropdownRowModelBase.prototype.updateCellQuestionOnColumnItemValueChanged = function (column, propertyName, obj, name, newValue, oldValue) {\n var cell = this.getCellByColumn(column);\n if (!cell)\n return;\n this.updateCellOnColumnItemValueChanged(cell, propertyName, obj, name, newValue, oldValue);\n };\n MatrixDropdownRowModelBase.prototype.onQuestionReadOnlyChanged = function (parentIsReadOnly) {\n var questions = this.questions;\n for (var i = 0; i < questions.length; i++) {\n questions[i].readOnly = parentIsReadOnly;\n }\n };\n MatrixDropdownRowModelBase.prototype.hasErrors = function (fireCallback, rec, raiseOnCompletedAsyncValidators) {\n var res = false;\n var cells = this.cells;\n if (!cells)\n return res;\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n if (!cells[colIndex])\n continue;\n var question = cells[colIndex].question;\n if (!question || !question.visible)\n continue;\n question.onCompletedAsyncValidators = function (hasErrors) {\n raiseOnCompletedAsyncValidators();\n };\n if (!!rec && rec.isOnValueChanged === true && question.isEmpty())\n continue;\n res = question.hasErrors(fireCallback, rec) || res;\n }\n if (this.hasPanel) {\n this.ensureDetailPanel();\n var panelHasError = this.detailPanel.hasErrors(fireCallback, false, rec);\n if (!rec.hideErroredPanel && panelHasError && fireCallback) {\n if (rec.isSingleDetailPanel) {\n rec.hideErroredPanel = true;\n }\n this.showDetailPanel();\n }\n res = panelHasError || res;\n }\n return res;\n };\n MatrixDropdownRowModelBase.prototype.updateCellOnColumnChanged = function (cell, name, newValue) {\n cell.question[name] = newValue;\n };\n MatrixDropdownRowModelBase.prototype.updateCellOnColumnItemValueChanged = function (cell, propertyName, obj, name, newValue, oldValue) {\n var items = cell.question[propertyName];\n if (!Array.isArray(items))\n return;\n var val = name === \"value\" ? oldValue : obj[\"value\"];\n var item = _itemvalue__WEBPACK_IMPORTED_MODULE_6__[\"ItemValue\"].getItemByValue(items, val);\n if (!item)\n return;\n item[name] = newValue;\n };\n MatrixDropdownRowModelBase.prototype.buildCells = function (value) {\n this.isSettingValue = true;\n var columns = this.data.columns;\n for (var i = 0; i < columns.length; i++) {\n var column = columns[i];\n if (!column.isVisible)\n continue;\n var cell = this.createCell(column);\n this.cells.push(cell);\n var cellValue = this.getCellValue(value, column.name);\n if (!_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isValueEmpty(cellValue)) {\n cell.question.value = cellValue;\n var commentKey = column.name + _settings__WEBPACK_IMPORTED_MODULE_11__[\"settings\"].commentPrefix;\n if (!!value && !_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isValueEmpty(value[commentKey])) {\n cell.question.comment = value[commentKey];\n }\n }\n }\n this.isSettingValue = false;\n };\n MatrixDropdownRowModelBase.prototype.getCellValue = function (value, name) {\n if (!!this.editingObj)\n return _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].getObjPropertyValue(this.editingObj, name);\n return !!value ? value[name] : undefined;\n };\n MatrixDropdownRowModelBase.prototype.createCell = function (column) {\n return new MatrixDropdownCell(column, this, this.data);\n };\n MatrixDropdownRowModelBase.prototype.getSurveyData = function () {\n return this;\n };\n MatrixDropdownRowModelBase.prototype.getSurvey = function () {\n return this.data ? this.data.getSurvey() : null;\n };\n MatrixDropdownRowModelBase.prototype.getTextProcessor = function () {\n return this.textPreProcessor;\n };\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"rowIndex\", {\n get: function () {\n return !!this.data ? this.data.getRowIndex(this) + 1 : -1;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MatrixDropdownRowModelBase.prototype, \"editingObj\", {\n get: function () {\n return this.editingObjValue;\n },\n enumerable: false,\n configurable: true\n });\n MatrixDropdownRowModelBase.prototype.dispose = function () {\n if (!!this.editingObj) {\n this.editingObj.onPropertyChanged.remove(this.onEditingObjPropertyChanged);\n this.editingObjValue = null;\n }\n };\n MatrixDropdownRowModelBase.prototype.subscribeToChanges = function (value) {\n var _this = this;\n if (!value || !value.getType || !value.onPropertyChanged)\n return;\n if (value === this.editingObj)\n return;\n this.editingObjValue = value;\n this.onEditingObjPropertyChanged = function (sender, options) {\n _this.updateOnSetValue(options.name, options.newValue);\n };\n this.editingObj.onPropertyChanged.add(this.onEditingObjPropertyChanged);\n };\n MatrixDropdownRowModelBase.prototype.updateOnSetValue = function (name, newValue) {\n this.isSettingValue = true;\n var questions = this.getQuestionsByName(name);\n for (var i = 0; i < questions.length; i++) {\n questions[i].value = newValue;\n }\n this.isSettingValue = false;\n };\n MatrixDropdownRowModelBase.RowVariableName = \"row\";\n MatrixDropdownRowModelBase.OwnerVariableName = \"self\";\n MatrixDropdownRowModelBase.IndexVariableName = \"rowIndex\";\n MatrixDropdownRowModelBase.RowValueVariableName = \"rowValue\";\n MatrixDropdownRowModelBase.idCounter = 1;\n return MatrixDropdownRowModelBase;\n}());\n\nvar MatrixDropdownTotalRowModel = /** @class */ (function (_super) {\n __extends(MatrixDropdownTotalRowModel, _super);\n function MatrixDropdownTotalRowModel(data) {\n var _this = _super.call(this, data, null) || this;\n _this.buildCells(null);\n return _this;\n }\n MatrixDropdownTotalRowModel.prototype.createCell = function (column) {\n return new MatrixDropdownTotalCell(column, this, this.data);\n };\n MatrixDropdownTotalRowModel.prototype.setValue = function (name, newValue) {\n if (!!this.data && !this.isSettingValue) {\n this.data.onTotalValueChanged();\n }\n };\n MatrixDropdownTotalRowModel.prototype.runCondition = function (values, properties) {\n var counter = 0;\n var prevValue;\n do {\n prevValue = _helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].getUnbindValue(this.value);\n _super.prototype.runCondition.call(this, values, properties);\n counter++;\n } while (!_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isTwoValueEquals(prevValue, this.value) && counter < 3);\n };\n MatrixDropdownTotalRowModel.prototype.updateCellOnColumnChanged = function (cell, name, newValue) {\n cell.updateCellQuestion();\n };\n return MatrixDropdownTotalRowModel;\n}(MatrixDropdownRowModelBase));\n\nvar QuestionMatrixDropdownRenderedCell = /** @class */ (function () {\n function QuestionMatrixDropdownRenderedCell() {\n this.minWidth = \"\";\n this.width = \"\";\n this.colSpans = 1;\n this.isActionsCell = false;\n this.className = \"\";\n this.idValue = QuestionMatrixDropdownRenderedCell.counter++;\n }\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"hasQuestion\", {\n get: function () {\n return !!this.question;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"hasTitle\", {\n get: function () {\n return !!this.locTitle;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"hasPanel\", {\n get: function () {\n return !!this.panel;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"id\", {\n get: function () {\n return this.idValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"showErrorOnTop\", {\n get: function () {\n return this.showErrorOnCore(\"top\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"showErrorOnBottom\", {\n get: function () {\n return this.showErrorOnCore(\"bottom\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownRenderedCell.prototype.showErrorOnCore = function (location) {\n return (this.getShowErrorLocation() == location &&\n (!this.isChoice || this.isFirstChoice));\n };\n QuestionMatrixDropdownRenderedCell.prototype.getShowErrorLocation = function () {\n return this.hasQuestion ? this.question.survey.questionErrorLocation : \"\";\n };\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"item\", {\n get: function () {\n return this.itemValue;\n },\n set: function (val) {\n this.itemValue = val;\n if (!!val) {\n val.hideCaption = true;\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"isChoice\", {\n get: function () {\n return !!this.item;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"choiceValue\", {\n get: function () {\n return this.isChoice ? this.item.value : null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"isCheckbox\", {\n get: function () {\n return this.isChoice && this.question.getType() == \"checkbox\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"isFirstChoice\", {\n get: function () {\n return this.choiceIndex === 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"css\", {\n get: function () {\n return (this.className +\n (this.question.errors.length > 0 ? \" \" + this.question.cssError : \"\"));\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, \"headers\", {\n get: function () {\n if (this.cell &&\n this.cell.column &&\n this.cell.column.isShowInMultipleColumns) {\n return this.item.locText.renderedHtml;\n }\n if (this.question && this.question.isVisible) {\n return this.question.locTitle.renderedHtml;\n }\n if (this.hasTitle) {\n return this.locTitle.renderedHtml || \"\";\n }\n return \"\";\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownRenderedCell.prototype.calculateFinalClassName = function (matrixCssClasses) {\n var questionCss = this.cell.question.cssClasses;\n var className = \"\";\n if (!!questionCss) {\n className = \"\";\n if (!!questionCss.itemValue) {\n className += \" \" + questionCss.itemValue;\n }\n if (!!questionCss.asCell) {\n if (!!className)\n className += \"\";\n className += questionCss.asCell;\n }\n }\n if (!className && !!matrixCssClasses) {\n className = matrixCssClasses.cell;\n }\n className +=\n this.question.errors.length > 0 ? \" \" + questionCss.hasError : \"\";\n if (this.isChoice) {\n className += \" \" + matrixCssClasses.choiceCell;\n }\n //'text-align': $data.isChoice ? 'center': ''\n return className;\n };\n QuestionMatrixDropdownRenderedCell.counter = 1;\n return QuestionMatrixDropdownRenderedCell;\n}());\n\nvar QuestionMatrixDropdownRenderedRow = /** @class */ (function () {\n function QuestionMatrixDropdownRenderedRow() {\n this.isDetailRow = false;\n this.cells = [];\n this.className = \"\";\n this.idValue = QuestionMatrixDropdownRenderedRow.counter++;\n }\n Object.defineProperty(QuestionMatrixDropdownRenderedRow.prototype, \"id\", {\n get: function () {\n return this.idValue;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownRenderedRow.counter = 1;\n return QuestionMatrixDropdownRenderedRow;\n}());\n\nvar QuestionMatrixDropdownRenderedTable = /** @class */ (function (_super) {\n __extends(QuestionMatrixDropdownRenderedTable, _super);\n function QuestionMatrixDropdownRenderedTable(matrix) {\n var _this = _super.call(this) || this;\n _this.matrix = matrix;\n _this.hasActionCellInRowsValues = {};\n _this.createNewArray(\"rows\");\n _this.build();\n return _this;\n }\n Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, \"showTable\", {\n get: function () {\n return this.getPropertyValue(\"showTable\", true);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, \"showHeader\", {\n get: function () {\n return this.getPropertyValue(\"showHeader\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, \"showAddRowOnTop\", {\n get: function () {\n return this.getPropertyValue(\"showAddRowOnTop\", false);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, \"showAddRowOnBottom\", {\n get: function () {\n return this.getPropertyValue(\"showAddRowOnBottom\", false);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, \"showFooter\", {\n get: function () {\n return this.matrix.hasFooter && this.matrix.isColumnLayoutHorizontal;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, \"hasFooter\", {\n get: function () {\n return !!this.footerRow;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, \"hasRemoveRows\", {\n get: function () {\n return this.hasRemoveRowsValue;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownRenderedTable.prototype.isRequireReset = function () {\n return (this.hasRemoveRows != this.matrix.canRemoveRows ||\n !this.matrix.isColumnLayoutHorizontal);\n };\n Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, \"headerRow\", {\n get: function () {\n return this.headerRowValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, \"footerRow\", {\n get: function () {\n return this.footerRowValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, \"rows\", {\n get: function () {\n return this.getPropertyValue(\"rows\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownRenderedTable.prototype.build = function () {\n this.hasRemoveRowsValue = this.matrix.canRemoveRows;\n //build rows now\n var rows = this.matrix.visibleRows;\n this.cssClasses = this.matrix.cssClasses;\n this.buildRowsActions();\n this.buildHeader();\n this.buildRows();\n this.buildFooter();\n this.updateShowTableAndAddRow();\n };\n QuestionMatrixDropdownRenderedTable.prototype.updateShowTableAndAddRow = function () {\n var showTable = this.rows.length > 0 ||\n this.matrix.isDesignMode ||\n !this.matrix.getShowColumnsIfEmpty();\n this.setPropertyValue(\"showTable\", showTable);\n var showAddRow = this.matrix.canAddRow && showTable;\n var showAddRowOnTop = showAddRow;\n var showAddRowOnBottom = showAddRow;\n if (showAddRowOnTop) {\n if (this.matrix.getAddRowLocation() === \"default\") {\n showAddRowOnTop = this.matrix.columnLayout === \"vertical\";\n }\n else {\n showAddRowOnTop = this.matrix.getAddRowLocation() !== \"bottom\";\n }\n }\n if (showAddRowOnBottom && this.matrix.getAddRowLocation() !== \"topBottom\") {\n showAddRowOnBottom = !showAddRowOnTop;\n }\n this.setPropertyValue(\"showAddRowOnTop\", showAddRowOnTop);\n this.setPropertyValue(\"showAddRowOnBottom\", showAddRowOnBottom);\n };\n QuestionMatrixDropdownRenderedTable.prototype.onAddedRow = function () {\n if (this.getRenderedDataRowCount() >= this.matrix.visibleRows.length)\n return;\n var row = this.matrix.visibleRows[this.matrix.visibleRows.length - 1];\n this.rowsActions.push(this.buildRowActions(row));\n this.addHorizontalRow(this.rows, row, this.matrix.visibleRows.length == 1 && !this.matrix.showHeader);\n this.updateShowTableAndAddRow();\n };\n QuestionMatrixDropdownRenderedTable.prototype.getRenderedDataRowCount = function () {\n var res = 0;\n for (var i = 0; i < this.rows.length; i++) {\n if (!this.rows[i].isDetailRow)\n res++;\n }\n return res;\n };\n QuestionMatrixDropdownRenderedTable.prototype.onRemovedRow = function (row) {\n var rowIndex = this.getRenderedRowIndex(row);\n if (rowIndex < 0)\n return;\n this.rowsActions.splice(rowIndex, 1);\n var removeCount = 1;\n if (rowIndex < this.rows.length - 1 &&\n this.rows[rowIndex + 1].isDetailRow) {\n removeCount++;\n }\n this.rows.splice(rowIndex, removeCount);\n this.updateShowTableAndAddRow();\n };\n QuestionMatrixDropdownRenderedTable.prototype.onDetailPanelChangeVisibility = function (row, isShowing) {\n var rowIndex = this.getRenderedRowIndex(row);\n if (rowIndex < 0)\n return;\n var panelRowIndex = rowIndex < this.rows.length - 1 && this.rows[rowIndex + 1].isDetailRow\n ? rowIndex + 1\n : -1;\n if ((isShowing && panelRowIndex > -1) || (!isShowing && panelRowIndex < 0))\n return;\n if (isShowing) {\n var detailRow = this.createDetailPanelRow(row, this.rows[rowIndex]);\n this.rows.splice(rowIndex + 1, 0, detailRow);\n }\n else {\n this.rows.splice(panelRowIndex, 1);\n }\n };\n QuestionMatrixDropdownRenderedTable.prototype.getRenderedRowIndex = function (row) {\n for (var i = 0; i < this.rows.length; i++) {\n if (this.rows[i].row == row)\n return i;\n }\n return -1;\n };\n QuestionMatrixDropdownRenderedTable.prototype.buildRowsActions = function () {\n this.rowsActions = [];\n var rows = this.matrix.visibleRows;\n for (var i = 0; i < rows.length; i++) {\n this.rowsActions.push(this.buildRowActions(rows[i]));\n }\n };\n QuestionMatrixDropdownRenderedTable.prototype.buildHeader = function () {\n var colHeaders = this.matrix.isColumnLayoutHorizontal && this.matrix.showHeader;\n var isShown = colHeaders ||\n (this.matrix.hasRowText && !this.matrix.isColumnLayoutHorizontal);\n this.setPropertyValue(\"showHeader\", isShown);\n if (!isShown)\n return;\n this.headerRowValue = new QuestionMatrixDropdownRenderedRow();\n if (this.hasActionCellInRows(\"start\")) {\n this.headerRow.cells.push(this.createHeaderCell(null));\n }\n if (this.matrix.hasRowText && this.matrix.showHeader) {\n this.headerRow.cells.push(this.createHeaderCell(null));\n }\n if (this.matrix.isColumnLayoutHorizontal) {\n for (var i = 0; i < this.matrix.visibleColumns.length; i++) {\n var column = this.matrix.visibleColumns[i];\n if (!column.hasVisibleCell)\n continue;\n if (column.isShowInMultipleColumns) {\n this.createMutlipleColumnsHeader(column);\n }\n else {\n this.headerRow.cells.push(this.createHeaderCell(column));\n }\n }\n }\n else {\n var rows = this.matrix.visibleRows;\n for (var i = 0; i < rows.length; i++) {\n this.headerRow.cells.push(this.createTextCell(rows[i].locText));\n }\n if (this.matrix.hasFooter) {\n this.headerRow.cells.push(this.createTextCell(this.matrix.getFooterText()));\n }\n }\n if (this.hasActionCellInRows(\"end\")) {\n this.headerRow.cells.push(this.createHeaderCell(null));\n }\n };\n QuestionMatrixDropdownRenderedTable.prototype.buildFooter = function () {\n if (!this.showFooter)\n return;\n this.footerRowValue = new QuestionMatrixDropdownRenderedRow();\n if (this.hasActionCellInRows(\"start\")) {\n this.footerRow.cells.push(this.createHeaderCell(null));\n }\n if (this.matrix.hasRowText) {\n this.footerRow.cells.push(this.createTextCell(this.matrix.getFooterText()));\n }\n var cells = this.matrix.visibleTotalRow.cells;\n for (var i = 0; i < cells.length; i++) {\n var cell = cells[i];\n if (!cell.column.hasVisibleCell)\n continue;\n if (cell.column.isShowInMultipleColumns) {\n this.createMutlipleColumnsFooter(this.footerRow, cell);\n }\n else {\n this.footerRow.cells.push(this.createEditCell(cell));\n }\n }\n if (this.hasActionCellInRows(\"end\")) {\n this.footerRow.cells.push(this.createHeaderCell(null));\n }\n };\n QuestionMatrixDropdownRenderedTable.prototype.buildRows = function () {\n var rows = this.matrix.isColumnLayoutHorizontal\n ? this.buildHorizontalRows()\n : this.buildVerticalRows();\n this.setPropertyValue(\"rows\", rows);\n };\n QuestionMatrixDropdownRenderedTable.prototype.hasActionCellInRows = function (location) {\n if (this.hasActionCellInRowsValues[location] === undefined) {\n var rows = this.matrix.visibleRows;\n this.hasActionCellInRowsValues[location] = false;\n for (var i = 0; i < rows.length; i++) {\n if (!this.isValueEmpty(this.getRowActions(i, location))) {\n this.hasActionCellInRowsValues[location] = true;\n break;\n }\n }\n }\n return this.hasActionCellInRowsValues[location];\n };\n QuestionMatrixDropdownRenderedTable.prototype.canRemoveRow = function (row) {\n return this.matrix.canRemoveRow(row);\n };\n QuestionMatrixDropdownRenderedTable.prototype.buildHorizontalRows = function () {\n var rows = this.matrix.visibleRows;\n var renderedRows = [];\n for (var i = 0; i < rows.length; i++) {\n this.addHorizontalRow(renderedRows, rows[i], i == 0 && !this.matrix.showHeader);\n }\n return renderedRows;\n };\n QuestionMatrixDropdownRenderedTable.prototype.addHorizontalRow = function (renderedRows, row, useAsHeader) {\n var renderedRow = this.createHorizontalRow(row, useAsHeader);\n renderedRow.row = row;\n renderedRows.push(renderedRow);\n if (row.isDetailPanelShowing) {\n renderedRows.push(this.createDetailPanelRow(row, renderedRow));\n }\n };\n QuestionMatrixDropdownRenderedTable.prototype.getRowActionsCell = function (rowIndex, location) {\n var rowActions = this.getRowActions(rowIndex, location);\n if (!this.isValueEmpty(rowActions)) {\n var cell = new QuestionMatrixDropdownRenderedCell();\n var actionContainer = new _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_14__[\"AdaptiveActionContainer\"]();\n actionContainer.setItems(rowActions);\n var itemValue = new _itemvalue__WEBPACK_IMPORTED_MODULE_6__[\"ItemValue\"](actionContainer);\n cell.item = itemValue;\n cell.isActionsCell = true;\n cell.className = this.cssClasses.actionsCell;\n cell.row = this.matrix.visibleRows[rowIndex];\n return cell;\n }\n return null;\n };\n QuestionMatrixDropdownRenderedTable.prototype.getRowActions = function (rowIndex, location) {\n var actions = this.rowsActions[rowIndex];\n if (!Array.isArray(actions))\n return [];\n return actions.filter(function (action) {\n if (!action.location) {\n action.location = \"start\";\n }\n return action.location === location;\n });\n };\n QuestionMatrixDropdownRenderedTable.prototype.buildRowActions = function (row) {\n var actions = [];\n this.setDefaultRowActions(row, actions);\n if (!!this.matrix.survey) {\n actions = this.matrix.survey.getUpdatedMatrixRowActions(this.matrix, row, actions);\n }\n return actions;\n };\n QuestionMatrixDropdownRenderedTable.prototype.setDefaultRowActions = function (row, actions) {\n if (this.hasRemoveRows && this.canRemoveRow(row)) {\n actions.push(new _actions_action__WEBPACK_IMPORTED_MODULE_13__[\"Action\"]({\n id: \"remove-row\",\n location: \"end\",\n enabled: !this.matrix.isInputReadOnly,\n component: \"sv-matrix-remove-button\",\n data: { row: row, question: this.matrix },\n }));\n }\n if (row.hasPanel) {\n actions.push(new _actions_action__WEBPACK_IMPORTED_MODULE_13__[\"Action\"]({\n id: \"show-detail\",\n location: \"start\",\n component: \"sv-matrix-detail-button\",\n data: { row: row, question: this.matrix },\n }));\n }\n };\n QuestionMatrixDropdownRenderedTable.prototype.createHorizontalRow = function (row, useAsHeader) {\n var res = new QuestionMatrixDropdownRenderedRow();\n this.addRowActionsCell(row, res, \"start\");\n if (this.matrix.hasRowText) {\n var renderedCell = this.createTextCell(row.locText);\n renderedCell.row = row;\n res.cells.push(renderedCell);\n if (useAsHeader) {\n this.setHeaderCellWidth(null, renderedCell);\n }\n if (row.hasPanel && !!this.cssClasses.detailRowText) {\n if (!!renderedCell.className)\n renderedCell.className += \" \";\n renderedCell.className += this.cssClasses.detailRowText;\n }\n }\n for (var i = 0; i < row.cells.length; i++) {\n var cell = row.cells[i];\n if (!cell.column.hasVisibleCell)\n continue;\n if (cell.column.isShowInMultipleColumns) {\n this.createMutlipleEditCells(res, cell);\n }\n else {\n var renderedCell = this.createEditCell(cell);\n res.cells.push(renderedCell);\n if (useAsHeader) {\n this.setHeaderCellWidth(cell.column, renderedCell);\n }\n }\n }\n this.addRowActionsCell(row, res, \"end\");\n return res;\n };\n QuestionMatrixDropdownRenderedTable.prototype.addRowActionsCell = function (row, renderedRow, location) {\n var rowIndex = this.matrix.visibleRows.indexOf(row);\n if (this.hasActionCellInRows(location)) {\n var actions = this.getRowActionsCell(rowIndex, location);\n if (!!actions) {\n renderedRow.cells.push(actions);\n }\n else {\n var cell = new QuestionMatrixDropdownRenderedCell();\n cell.isEmpty = true;\n renderedRow.cells.push(cell);\n }\n }\n };\n QuestionMatrixDropdownRenderedTable.prototype.createDetailPanelRow = function (row, renderedRow) {\n var res = new QuestionMatrixDropdownRenderedRow();\n res.row = row;\n res.className += this.cssClasses.detailRow;\n res.isDetailRow = true;\n var buttonCell = new QuestionMatrixDropdownRenderedCell();\n if (this.matrix.hasRowText) {\n buttonCell.colSpans = 2;\n }\n buttonCell.isEmpty = true;\n res.cells.push(buttonCell);\n var actionsCell = null;\n if (this.hasActionCellInRows(\"end\")) {\n actionsCell = new QuestionMatrixDropdownRenderedCell();\n actionsCell.isEmpty = true;\n }\n var cell = new QuestionMatrixDropdownRenderedCell();\n cell.panel = row.detailPanel;\n cell.colSpans =\n renderedRow.cells.length -\n buttonCell.colSpans -\n (!!actionsCell ? actionsCell.colSpans : 0);\n cell.className = this.cssClasses.detailPanelCell;\n res.cells.push(cell);\n if (!!actionsCell) {\n res.cells.push(actionsCell);\n }\n if (typeof this.matrix.onCreateDetailPanelRenderedRowCallback === \"function\") {\n this.matrix.onCreateDetailPanelRenderedRowCallback(res);\n }\n return res;\n };\n QuestionMatrixDropdownRenderedTable.prototype.buildVerticalRows = function () {\n var columns = this.matrix.columns;\n var renderedRows = [];\n for (var i = 0; i < columns.length; i++) {\n var col = columns[i];\n if (col.isVisible && col.hasVisibleCell) {\n if (col.isShowInMultipleColumns) {\n this.createMutlipleVerticalRows(renderedRows, col, i);\n }\n else {\n renderedRows.push(this.createVerticalRow(col, i));\n }\n }\n }\n if (this.hasActionCellInRows(\"end\")) {\n renderedRows.push(this.createEndVerticalActionRow());\n }\n return renderedRows;\n };\n QuestionMatrixDropdownRenderedTable.prototype.createMutlipleVerticalRows = function (renderedRows, column, index) {\n var choices = this.getMultipleColumnChoices(column);\n if (!choices)\n return;\n for (var i = 0; i < choices.length; i++) {\n renderedRows.push(this.createVerticalRow(column, index, choices[i], i));\n }\n };\n QuestionMatrixDropdownRenderedTable.prototype.createVerticalRow = function (column, index, choice, choiceIndex) {\n if (choice === void 0) { choice = null; }\n if (choiceIndex === void 0) { choiceIndex = -1; }\n var res = new QuestionMatrixDropdownRenderedRow();\n if (this.matrix.showHeader) {\n var lTitle = !!choice ? choice.locText : column.locTitle;\n var hCell = this.createTextCell(lTitle);\n hCell.column = column;\n if (!choice) {\n this.setRequriedToHeaderCell(column, hCell);\n }\n res.cells.push(hCell);\n }\n var rows = this.matrix.visibleRows;\n for (var i = 0; i < rows.length; i++) {\n var rChoice = choice;\n var rChoiceIndex = choiceIndex >= 0 ? choiceIndex : i;\n var cell = rows[i].cells[index];\n var visChoices = !!choice ? cell.question.visibleChoices : undefined;\n if (!!visChoices && rChoiceIndex < visChoices.length) {\n rChoice = visChoices[rChoiceIndex];\n }\n var rCell = this.createEditCell(cell, rChoice);\n rCell.item = rChoice;\n rCell.choiceIndex = rChoiceIndex;\n res.cells.push(rCell);\n }\n if (this.matrix.hasTotal) {\n res.cells.push(this.createEditCell(this.matrix.visibleTotalRow.cells[index]));\n }\n return res;\n };\n QuestionMatrixDropdownRenderedTable.prototype.createEndVerticalActionRow = function () {\n var res = new QuestionMatrixDropdownRenderedRow();\n if (this.matrix.showHeader) {\n res.cells.push(this.createTextCell(null));\n }\n var rows = this.matrix.visibleRows;\n for (var i = 0; i < rows.length; i++) {\n res.cells.push(this.getRowActionsCell(i, \"end\"));\n }\n if (this.matrix.hasTotal) {\n res.cells.push(this.createTextCell(null));\n }\n return res;\n };\n QuestionMatrixDropdownRenderedTable.prototype.createMutlipleEditCells = function (rRow, cell, isFooter) {\n if (isFooter === void 0) { isFooter = false; }\n var choices = isFooter\n ? this.getMultipleColumnChoices(cell.column)\n : cell.question.visibleChoices;\n if (!choices)\n return;\n for (var i = 0; i < choices.length; i++) {\n var rCell = this.createEditCell(cell, !isFooter ? choices[i] : undefined);\n if (!isFooter) {\n //rCell.item = choices[i];\n rCell.choiceIndex = i;\n }\n rRow.cells.push(rCell);\n }\n };\n QuestionMatrixDropdownRenderedTable.prototype.createEditCell = function (cell, choiceItem) {\n if (choiceItem === void 0) { choiceItem = undefined; }\n var res = new QuestionMatrixDropdownRenderedCell();\n res.cell = cell;\n res.row = cell.row;\n res.question = cell.question;\n res.matrix = this.matrix;\n res.item = choiceItem;\n res.className = res.calculateFinalClassName(this.cssClasses);\n //res.css = res.calcCss(this.cssClasses.cell);\n // var questionCss = cell.question.cssClasses;\n // var className = \"\";\n // if (!!questionCss) {\n // className = \"\";\n // if (!!questionCss.itemValue) {\n // className += \" \" + questionCss.itemValue;\n // }\n // if (!!questionCss.asCell) {\n // if (!!className) className += \"\";\n // className += questionCss.asCell;\n // }\n // }\n // if (!className && !!this.cssClasses.cell) {\n // className = this.cssClasses.cell;\n // }\n //res.className = className;\n return res;\n };\n QuestionMatrixDropdownRenderedTable.prototype.createMutlipleColumnsFooter = function (rRow, cell) {\n this.createMutlipleEditCells(rRow, cell, true);\n };\n QuestionMatrixDropdownRenderedTable.prototype.createMutlipleColumnsHeader = function (column) {\n var choices = this.getMultipleColumnChoices(column);\n if (!choices)\n return;\n for (var i = 0; i < choices.length; i++) {\n var cell = this.createTextCell(choices[i].locText);\n this.setHeaderCell(column, cell);\n this.headerRow.cells.push(cell);\n }\n };\n QuestionMatrixDropdownRenderedTable.prototype.getMultipleColumnChoices = function (column) {\n var choices = column.templateQuestion.choices;\n if (!!choices && Array.isArray(choices) && choices.length == 0)\n return this.matrix.choices;\n choices = column.templateQuestion.visibleChoices;\n if (!choices || !Array.isArray(choices))\n return null;\n return choices;\n };\n QuestionMatrixDropdownRenderedTable.prototype.createHeaderCell = function (column) {\n var cell = this.createTextCell(!!column ? column.locTitle : null);\n cell.column = column;\n this.setHeaderCell(column, cell);\n if (this.cssClasses.headerCell) {\n cell.className = this.cssClasses.headerCell;\n }\n return cell;\n };\n QuestionMatrixDropdownRenderedTable.prototype.setHeaderCell = function (column, cell) {\n this.setHeaderCellWidth(column, cell);\n this.setRequriedToHeaderCell(column, cell);\n };\n QuestionMatrixDropdownRenderedTable.prototype.setHeaderCellWidth = function (column, cell) {\n cell.minWidth = column != null ? this.matrix.getColumnWidth(column) : \"\";\n cell.width = column != null ? column.width : this.matrix.getRowTitleWidth();\n };\n QuestionMatrixDropdownRenderedTable.prototype.setRequriedToHeaderCell = function (column, cell) {\n if (!!column && column.isRequired && this.matrix.survey) {\n cell.requiredText = this.matrix.survey.requiredText;\n }\n };\n QuestionMatrixDropdownRenderedTable.prototype.createRemoveRowCell = function (row) {\n var res = new QuestionMatrixDropdownRenderedCell();\n res.row = row;\n res.isRemoveRow = this.canRemoveRow(row);\n if (!!this.cssClasses.cell) {\n res.className = this.cssClasses.cell;\n }\n return res;\n };\n QuestionMatrixDropdownRenderedTable.prototype.createTextCell = function (locTitle) {\n var cell = new QuestionMatrixDropdownRenderedCell();\n cell.locTitle = locTitle;\n if (!!this.cssClasses.cell) {\n cell.className = this.cssClasses.cell;\n }\n return cell;\n };\n return QuestionMatrixDropdownRenderedTable;\n}(_base__WEBPACK_IMPORTED_MODULE_3__[\"Base\"]));\n\n/**\n * A base class for matrix dropdown and matrix dynamic questions.\n */\nvar QuestionMatrixDropdownModelBase = /** @class */ (function (_super) {\n __extends(QuestionMatrixDropdownModelBase, _super);\n function QuestionMatrixDropdownModelBase(name) {\n var _this = _super.call(this, name) || this;\n _this.isRowChanging = false;\n _this.lockResetRenderedTable = false;\n _this.isDoingonAnyValueChanged = false;\n _this.createItemValues(\"choices\");\n _this.createLocalizableString(\"optionsCaption\", _this);\n _this.createLocalizableString(\"keyDuplicationError\", _this);\n _this.detailPanelValue = _this.createNewDetailPanel();\n _this.detailPanel.selectedElementInDesign = _this;\n _this.detailPanel.renderWidth = \"100%\";\n _this.registerFunctionOnPropertyValueChanged(\"columns\", function (newColumns) {\n _this.updateColumnsIndexes(newColumns);\n _this.generatedTotalRow = null;\n _this.clearRowsAndResetRenderedTable();\n });\n _this.registerFunctionOnPropertyValueChanged(\"cellType\", function () {\n _this.updateColumnsCellType();\n _this.clearRowsAndResetRenderedTable();\n });\n _this.registerFunctionOnPropertiesValueChanged([\"optionsCaption\", \"columnColCount\", \"rowTitleWidth\", \"choices\"], function () {\n _this.clearRowsAndResetRenderedTable();\n });\n _this.registerFunctionOnPropertiesValueChanged([\n \"columnLayout\",\n \"addRowLocation\",\n \"hideColumnsIfEmpty\",\n \"showHeader\",\n \"minRowCount\",\n \"isReadOnly\",\n \"rowCount\",\n \"hasFooter\",\n \"detailPanelMode\",\n ], function () {\n _this.resetRenderedTable();\n });\n return _this;\n }\n Object.defineProperty(QuestionMatrixDropdownModelBase, \"defaultCellType\", {\n get: function () {\n return _settings__WEBPACK_IMPORTED_MODULE_11__[\"settings\"].matrixDefaultCellType;\n },\n set: function (val) {\n _settings__WEBPACK_IMPORTED_MODULE_11__[\"settings\"].matrixDefaultCellType = val;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.addDefaultColumns = function (matrix) {\n var colNames = _questionfactory__WEBPACK_IMPORTED_MODULE_8__[\"QuestionFactory\"].DefaultColums;\n for (var i = 0; i < colNames.length; i++)\n matrix.addColumn(colNames[i]);\n };\n QuestionMatrixDropdownModelBase.prototype.createColumnValues = function () {\n var _this = this;\n return this.createNewArray(\"columns\", function (item) {\n item.colOwner = _this;\n }, function (item) {\n item.colOwner = null;\n });\n };\n QuestionMatrixDropdownModelBase.prototype.getType = function () {\n return \"matrixdropdownbase\";\n };\n QuestionMatrixDropdownModelBase.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n this.clearGeneratedRows();\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"hasSingleInput\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"isRowsDynamic\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.itemValuePropertyChanged = function (item, name, oldValue, newValue) {\n _super.prototype.itemValuePropertyChanged.call(this, item, name, oldValue, newValue);\n if (item.ownerPropertyName === \"choices\") {\n this.clearRowsAndResetRenderedTable();\n }\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"columnLayout\", {\n /**\n * Set columnLayout to 'vertical' to place columns vertically and rows horizontally. It makes sense when we have many columns and few rows.\n * @see columns\n * @see rowCount\n */\n get: function () {\n return this.getPropertyValue(\"columnLayout\");\n },\n set: function (val) {\n this.setPropertyValue(\"columnLayout\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"columnsLocation\", {\n get: function () {\n return this.columnLayout;\n },\n set: function (val) {\n this.columnLayout = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"isColumnLayoutHorizontal\", {\n /**\n * Returns true if columns are located horizontally\n * @see columnLayout\n */\n get: function () {\n return this.columnLayout != \"vertical\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"detailPanelMode\", {\n /**\n * Set the value to \"underRow\" to show the detailPanel under the row.\n */\n get: function () {\n return this.getPropertyValue(\"detailPanelMode\", \"none\");\n },\n set: function (val) {\n this.setPropertyValue(\"detailPanelMode\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"detailPanel\", {\n /**\n * The detail template Panel. This panel is used as a template on creating detail panel for a row.\n * @see detailElements\n * @see detailPanelMode\n */\n get: function () {\n return this.detailPanelValue;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.getPanel = function () {\n return this.detailPanel;\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"detailElements\", {\n /**\n * The template Panel elements, questions and panels.\n * @see detailPanel\n * @see detailPanelMode\n */\n get: function () {\n return this.detailPanel.elements;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.createNewDetailPanel = function () {\n return _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].createClass(\"panel\");\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"hasRowText\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.getFooterText = function () {\n return null;\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"canAddRow\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"canRemoveRows\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.canRemoveRow = function (row) {\n return true;\n };\n QuestionMatrixDropdownModelBase.prototype.onRowsChanged = function () {\n this.resetRenderedTable();\n _super.prototype.onRowsChanged.call(this);\n };\n QuestionMatrixDropdownModelBase.prototype.onStartRowAddingRemoving = function () {\n this.lockResetRenderedTable = true;\n };\n QuestionMatrixDropdownModelBase.prototype.onEndRowAdding = function () {\n this.lockResetRenderedTable = false;\n if (!this.renderedTable)\n return;\n if (this.renderedTable.isRequireReset()) {\n this.resetRenderedTable();\n }\n else {\n this.renderedTable.onAddedRow();\n }\n };\n QuestionMatrixDropdownModelBase.prototype.onEndRowRemoving = function (row) {\n this.lockResetRenderedTable = false;\n if (this.renderedTable.isRequireReset()) {\n this.resetRenderedTable();\n }\n else {\n if (!!row) {\n this.renderedTable.onRemovedRow(row);\n }\n }\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"renderedTableValue\", {\n get: function () {\n return this.getPropertyValue(\"renderedTable\", null);\n },\n set: function (val) {\n this.setPropertyValue(\"renderedTable\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.clearRowsAndResetRenderedTable = function () {\n this.clearGeneratedRows();\n this.resetRenderedTable();\n this.fireCallback(this.columnsChangedCallback);\n };\n QuestionMatrixDropdownModelBase.prototype.resetRenderedTable = function () {\n if (this.lockResetRenderedTable || this.isLoadingFromJson)\n return;\n this.renderedTableValue = null;\n this.fireCallback(this.onRenderedTableResetCallback);\n };\n QuestionMatrixDropdownModelBase.prototype.clearGeneratedRows = function () {\n if (!this.generatedVisibleRows)\n return;\n for (var i = 0; i < this.generatedVisibleRows.length; i++) {\n this.generatedVisibleRows[i].dispose();\n }\n _super.prototype.clearGeneratedRows.call(this);\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"renderedTable\", {\n get: function () {\n if (!this.renderedTableValue) {\n this.renderedTableValue = this.createRenderedTable();\n if (!!this.onRenderedTableCreatedCallback) {\n this.onRenderedTableCreatedCallback(this.renderedTableValue);\n }\n }\n return this.renderedTableValue;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.createRenderedTable = function () {\n return new QuestionMatrixDropdownRenderedTable(this);\n };\n QuestionMatrixDropdownModelBase.prototype.onMatrixRowCreated = function (row) {\n if (!this.survey)\n return;\n var options = {\n rowValue: row.value,\n row: row,\n column: null,\n columnName: null,\n cell: null,\n cellQuestion: null,\n value: null,\n };\n for (var i = 0; i < this.visibleColumns.length; i++) {\n options.column = this.visibleColumns[i];\n options.columnName = options.column.name;\n var cell = row.cells[i];\n options.cell = cell;\n options.cellQuestion = cell.question;\n options.value = cell.value;\n if (!!this.onCellCreatedCallback) {\n this.onCellCreatedCallback(options);\n }\n this.survey.matrixCellCreated(this, options);\n }\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"cellType\", {\n /**\n * Use this property to change the default cell type.\n */\n get: function () {\n return this.getPropertyValue(\"cellType\", _settings__WEBPACK_IMPORTED_MODULE_11__[\"settings\"].matrixDefaultCellType);\n },\n set: function (val) {\n val = val.toLowerCase();\n this.setPropertyValue(\"cellType\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.updateColumnsCellType = function () {\n for (var i = 0; i < this.columns.length; i++) {\n this.columns[i].defaultCellTypeChanged();\n }\n };\n QuestionMatrixDropdownModelBase.prototype.updateColumnsIndexes = function (cols) {\n for (var i = 0; i < cols.length; i++) {\n cols[i].setIndex(i);\n }\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"columnColCount\", {\n /**\n * The default column count for radiogroup and checkbox cell types.\n */\n get: function () {\n return this.getPropertyValue(\"columnColCount\", 0);\n },\n set: function (value) {\n if (value < 0 || value > 4)\n return;\n this.setPropertyValue(\"columnColCount\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"columnMinWidth\", {\n /**\n * Use this property to set the minimum column width.\n */\n get: function () {\n return this.getPropertyValue(\"columnMinWidth\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"columnMinWidth\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"horizontalScroll\", {\n /**\n * Set this property to true to show the horizontal scroll.\n */\n get: function () {\n return this.getPropertyValue(\"horizontalScroll\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"horizontalScroll\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.getRequiredText = function () {\n return this.survey ? this.survey.requiredText : \"\";\n };\n QuestionMatrixDropdownModelBase.prototype.onColumnPropertyChanged = function (column, name, newValue) {\n this.updateHasFooter();\n if (!this.generatedVisibleRows)\n return;\n for (var i = 0; i < this.generatedVisibleRows.length; i++) {\n this.generatedVisibleRows[i].updateCellQuestionOnColumnChanged(column, name, newValue);\n }\n if (!!this.generatedTotalRow) {\n this.generatedTotalRow.updateCellQuestionOnColumnChanged(column, name, newValue);\n }\n this.onColumnsChanged();\n if (name == \"isRequired\") {\n this.resetRenderedTable();\n }\n if (column.isShowInMultipleColumns) {\n this.onShowInMultipleColumnsChanged(column);\n }\n };\n QuestionMatrixDropdownModelBase.prototype.onColumnItemValuePropertyChanged = function (column, propertyName, obj, name, newValue, oldValue) {\n if (!this.generatedVisibleRows)\n return;\n for (var i = 0; i < this.generatedVisibleRows.length; i++) {\n this.generatedVisibleRows[i].updateCellQuestionOnColumnItemValueChanged(column, propertyName, obj, name, newValue, oldValue);\n }\n };\n QuestionMatrixDropdownModelBase.prototype.onShowInMultipleColumnsChanged = function (column) {\n this.clearGeneratedRows();\n this.resetRenderedTable();\n };\n QuestionMatrixDropdownModelBase.prototype.onColumnCellTypeChanged = function (column) {\n this.clearGeneratedRows();\n this.resetRenderedTable();\n };\n QuestionMatrixDropdownModelBase.prototype.getRowTitleWidth = function () {\n return \"\";\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"hasFooter\", {\n get: function () {\n return this.getPropertyValue(\"hasFooter\", false);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.getAddRowLocation = function () {\n return \"default\";\n };\n QuestionMatrixDropdownModelBase.prototype.getShowColumnsIfEmpty = function () {\n return false;\n };\n QuestionMatrixDropdownModelBase.prototype.updateShowTableAndAddRow = function () {\n if (!!this.renderedTable) {\n this.renderedTable.updateShowTableAndAddRow();\n }\n };\n QuestionMatrixDropdownModelBase.prototype.updateHasFooter = function () {\n this.setPropertyValue(\"hasFooter\", this.hasTotal);\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"hasTotal\", {\n get: function () {\n for (var i = 0; i < this.columns.length; i++) {\n if (this.columns[i].hasTotal)\n return true;\n }\n return false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.getCellType = function () {\n return this.cellType;\n };\n QuestionMatrixDropdownModelBase.prototype.getConditionJson = function (operator, path) {\n if (operator === void 0) { operator = null; }\n if (path === void 0) { path = null; }\n if (!path)\n return _super.prototype.getConditionJson.call(this);\n var columnName = \"\";\n for (var i = path.length - 1; i >= 0; i--) {\n if (path[i] == \".\")\n break;\n columnName = path[i] + columnName;\n }\n var column = this.getColumnByName(columnName);\n if (!column)\n return null;\n var question = column.createCellQuestion(null);\n if (!question)\n return null;\n return question.getConditionJson(operator);\n };\n QuestionMatrixDropdownModelBase.prototype.clearIncorrectValues = function () {\n var rows = this.visibleRows;\n if (!rows)\n return;\n for (var i = 0; i < rows.length; i++) {\n rows[i].clearIncorrectValues(this.getRowValue(i));\n }\n };\n QuestionMatrixDropdownModelBase.prototype.clearErrors = function () {\n _super.prototype.clearErrors.call(this);\n if (!!this.generatedVisibleRows) {\n for (var i = 0; i < this.generatedVisibleRows.length; i++) {\n var row = this.generatedVisibleRows[i];\n for (var j = 0; j < row.cells.length; j++) {\n row.cells[j].question.clearErrors();\n }\n }\n }\n };\n QuestionMatrixDropdownModelBase.prototype.runCondition = function (values, properties) {\n _super.prototype.runCondition.call(this, values, properties);\n var counter = 0;\n var prevTotalValue;\n do {\n prevTotalValue = _helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].getUnbindValue(this.totalValue);\n this.runCellsCondition(values, properties);\n this.runTotalsCondition(values, properties);\n counter++;\n } while (!_helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].isTwoValueEquals(prevTotalValue, this.totalValue) &&\n counter < 3);\n };\n QuestionMatrixDropdownModelBase.prototype.shouldRunColumnExpression = function () {\n return false;\n };\n QuestionMatrixDropdownModelBase.prototype.runCellsCondition = function (values, properties) {\n if (!this.generatedVisibleRows)\n return;\n var newValues = this.getRowConditionValues(values);\n var rows = this.generatedVisibleRows;\n for (var i = 0; i < rows.length; i++) {\n rows[i].runCondition(newValues, properties);\n }\n this.checkColumnsVisibility();\n };\n QuestionMatrixDropdownModelBase.prototype.checkColumnsVisibility = function () {\n var hasChanged = false;\n for (var i = 0; i < this.visibleColumns.length; i++) {\n if (!this.visibleColumns[i].visibleIf)\n continue;\n hasChanged =\n this.isColumnVisibilityChanged(this.visibleColumns[i]) || hasChanged;\n }\n if (hasChanged) {\n this.resetRenderedTable();\n }\n };\n QuestionMatrixDropdownModelBase.prototype.isColumnVisibilityChanged = function (column) {\n var curVis = column.hasVisibleCell;\n var hasVisCell = false;\n var rows = this.generatedVisibleRows;\n for (var i = 0; i < rows.length; i++) {\n var cell = rows[i].cells[column.index];\n if (!!cell && !!cell.question && cell.question.isVisible) {\n hasVisCell = true;\n break;\n }\n }\n if (curVis != hasVisCell) {\n column.hasVisibleCell = hasVisCell;\n }\n return curVis != hasVisCell;\n };\n QuestionMatrixDropdownModelBase.prototype.runTotalsCondition = function (values, properties) {\n if (!this.generatedTotalRow)\n return;\n this.generatedTotalRow.runCondition(this.getRowConditionValues(values), properties);\n };\n QuestionMatrixDropdownModelBase.prototype.getRowConditionValues = function (values) {\n var newValues = values;\n if (!newValues)\n newValues = {};\n /*\n var newValues: { [index: string]: any } = {};\n if (values && values instanceof Object) {\n newValues = JSON.parse(JSON.stringify(values));\n }\n */\n var totalRow = {};\n if (!this.isValueEmpty(this.totalValue)) {\n totalRow = JSON.parse(JSON.stringify(this.totalValue));\n }\n newValues[\"row\"] = {};\n newValues[\"totalRow\"] = totalRow;\n return newValues;\n };\n QuestionMatrixDropdownModelBase.prototype.locStrsChanged = function () {\n _super.prototype.locStrsChanged.call(this);\n var columns = this.columns;\n for (var i = 0; i < columns.length; i++) {\n columns[i].locStrsChanged();\n }\n var rows = this.generatedVisibleRows;\n if (!rows)\n return;\n for (var i = 0; i < rows.length; i++) {\n rows[i].locStrsChanged();\n }\n if (!!this.generatedTotalRow) {\n this.generatedTotalRow.locStrsChanged();\n }\n };\n /**\n * Returns the column by it's name. Returns null if a column with this name doesn't exist.\n * @param column\n */\n QuestionMatrixDropdownModelBase.prototype.getColumnByName = function (columnName) {\n for (var i = 0; i < this.columns.length; i++) {\n if (this.columns[i].name == columnName)\n return this.columns[i];\n }\n return null;\n };\n QuestionMatrixDropdownModelBase.prototype.getColumnName = function (columnName) {\n return this.getColumnByName(columnName);\n };\n /**\n * Returns the column width.\n * @param column\n */\n QuestionMatrixDropdownModelBase.prototype.getColumnWidth = function (column) {\n return column.minWidth ? column.minWidth : this.columnMinWidth;\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"choices\", {\n /**\n * The default choices for dropdown, checkbox and radiogroup cell types.\n */\n get: function () {\n return this.getPropertyValue(\"choices\");\n },\n set: function (val) {\n this.setPropertyValue(\"choices\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"optionsCaption\", {\n /**\n * The default options caption for dropdown cell type.\n */\n get: function () {\n return this.getLocalizableStringText(\"optionsCaption\", _surveyStrings__WEBPACK_IMPORTED_MODULE_7__[\"surveyLocalization\"].getString(\"optionsCaption\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"optionsCaption\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"locOptionsCaption\", {\n get: function () {\n return this.getLocalizableString(\"optionsCaption\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"keyDuplicationError\", {\n /**\n * The duplication value error text. Set it to show the text different from the default.\n * @see MatrixDropdownColumn.isUnique\n */\n get: function () {\n return this.getLocalizableStringText(\"keyDuplicationError\", _surveyStrings__WEBPACK_IMPORTED_MODULE_7__[\"surveyLocalization\"].getString(\"keyDuplicationError\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"keyDuplicationError\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"locKeyDuplicationError\", {\n get: function () {\n return this.getLocalizableString(\"keyDuplicationError\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"storeOthersAsComment\", {\n get: function () {\n return !!this.survey ? this.survey.storeOthersAsComment : false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.addColumn = function (name, title) {\n if (title === void 0) { title = null; }\n var column = new MatrixDropdownColumn(name, title);\n this.columns.push(column);\n return column;\n };\n QuestionMatrixDropdownModelBase.prototype.getVisibleRows = function () {\n var _this = this;\n if (this.isLoadingFromJson)\n return null;\n if (!this.generatedVisibleRows) {\n this.generatedVisibleRows = this.generateRows();\n this.generatedVisibleRows.forEach(function (row) { return _this.onMatrixRowCreated(row); });\n if (this.data) {\n this.runCellsCondition(this.data.getFilteredValues(), this.data.getFilteredProperties());\n }\n this.updateValueOnRowsGeneration(this.generatedVisibleRows);\n this.updateIsAnswered();\n }\n return this.generatedVisibleRows;\n };\n QuestionMatrixDropdownModelBase.prototype.updateValueOnRowsGeneration = function (rows) {\n var oldValue = this.createNewValue(true);\n var newValue = this.createNewValue();\n for (var i = 0; i < rows.length; i++) {\n var row = rows[i];\n if (!!row.editingObj)\n continue;\n var rowValue = this.getRowValue(i);\n var rValue = row.value;\n if (this.isTwoValueEquals(rowValue, rValue))\n continue;\n newValue = this.getNewValueOnRowChanged(row, \"\", rValue, false, newValue)\n .value;\n }\n if (this.isTwoValueEquals(oldValue, newValue))\n return;\n this.isRowChanging = true;\n this.setNewValue(newValue);\n this.isRowChanging = false;\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"totalValue\", {\n get: function () {\n if (!this.hasTotal || !this.visibleTotalRow)\n return {};\n return this.visibleTotalRow.value;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.getVisibleTotalRow = function () {\n if (this.isLoadingFromJson)\n return null;\n if (this.hasTotal) {\n if (!this.generatedTotalRow) {\n this.generatedTotalRow = this.generateTotalRow();\n if (this.data) {\n var properties = { survey: this.survey };\n this.runTotalsCondition(this.data.getAllValues(), properties);\n }\n }\n }\n else {\n this.generatedTotalRow = null;\n }\n return this.generatedTotalRow;\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"visibleTotalRow\", {\n get: function () {\n return this.getVisibleTotalRow();\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.onSurveyLoad = function () {\n _super.prototype.onSurveyLoad.call(this);\n this.updateColumnsIndexes(this.columns);\n this.clearGeneratedRows();\n this.generatedTotalRow = null;\n this.updateHasFooter();\n };\n /**\n * Returns the row value. If the row value is empty, the object is empty: {}.\n * @param rowIndex row index from 0 to visible row count - 1.\n */\n QuestionMatrixDropdownModelBase.prototype.getRowValue = function (rowIndex) {\n if (rowIndex < 0)\n return null;\n var visRows = this.visibleRows;\n if (rowIndex >= visRows.length)\n return null;\n var newValue = this.createNewValue();\n return this.getRowValueCore(visRows[rowIndex], newValue);\n };\n QuestionMatrixDropdownModelBase.prototype.checkIfValueInRowDuplicated = function (checkedRow, cellQuestion) {\n if (!this.generatedVisibleRows)\n return false;\n var res = false;\n for (var i = 0; i < this.generatedVisibleRows.length; i++) {\n var row = this.generatedVisibleRows[i];\n if (checkedRow === row)\n continue;\n if (row.getValue(cellQuestion.name) == cellQuestion.value) {\n res = true;\n break;\n }\n }\n if (res) {\n this.addDuplicationError(cellQuestion);\n }\n else {\n cellQuestion.clearErrors();\n }\n return res;\n };\n /**\n * Set the row value.\n * @param rowIndex row index from 0 to visible row count - 1.\n * @param rowValue an object {\"column name\": columnValue,... }\n */\n QuestionMatrixDropdownModelBase.prototype.setRowValue = function (rowIndex, rowValue) {\n if (rowIndex < 0)\n return null;\n var visRows = this.visibleRows;\n if (rowIndex >= visRows.length)\n return null;\n visRows[rowIndex].value = rowValue;\n this.onRowChanged(visRows[rowIndex], \"\", rowValue, false);\n };\n QuestionMatrixDropdownModelBase.prototype.generateRows = function () {\n return null;\n };\n QuestionMatrixDropdownModelBase.prototype.generateTotalRow = function () {\n return new MatrixDropdownTotalRowModel(this);\n };\n QuestionMatrixDropdownModelBase.prototype.createNewValue = function (nullOnEmpty) {\n if (nullOnEmpty === void 0) { nullOnEmpty = false; }\n var res = !this.value ? {} : this.createValueCopy();\n if (nullOnEmpty && this.isMatrixValueEmpty(res))\n return null;\n return res;\n };\n QuestionMatrixDropdownModelBase.prototype.getRowValueCore = function (row, questionValue, create) {\n if (create === void 0) { create = false; }\n var result = !!questionValue && !!questionValue[row.rowName]\n ? questionValue[row.rowName]\n : null;\n if (!result && create) {\n result = {};\n if (!!questionValue) {\n questionValue[row.rowName] = result;\n }\n }\n return result;\n };\n QuestionMatrixDropdownModelBase.prototype.getRowObj = function (row) {\n var obj = this.getRowValueCore(row, this.value);\n return !!obj && !!obj.getType ? obj : null;\n };\n QuestionMatrixDropdownModelBase.prototype.getRowDisplayValue = function (keysAsText, row, rowValue) {\n if (!rowValue)\n return rowValue;\n if (!!row.editingObj)\n return rowValue;\n var keys = Object.keys(rowValue);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var question = row.getQuestionByName(key);\n if (!question) {\n question = this.getSharedQuestionByName(key, row);\n }\n if (!!question) {\n var displayvalue = question.getDisplayValue(keysAsText, rowValue[key]);\n if (keysAsText && !!question.title && question.title !== key) {\n rowValue[question.title] = displayvalue;\n delete rowValue[key];\n }\n else {\n rowValue[key] = displayvalue;\n }\n }\n }\n return rowValue;\n };\n QuestionMatrixDropdownModelBase.prototype.getPlainData = function (options) {\n var _this = this;\n if (options === void 0) { options = {\n includeEmpty: true,\n }; }\n var questionPlainData = _super.prototype.getPlainData.call(this, options);\n if (!!questionPlainData) {\n questionPlainData.isNode = true;\n questionPlainData.data = this.visibleRows.map(function (row) {\n var rowDataItem = {\n name: row.rowName,\n title: row.text,\n value: row.value,\n displayValue: _this.getRowDisplayValue(false, row, row.value),\n getString: function (val) {\n return typeof val === \"object\" ? JSON.stringify(val) : val;\n },\n isNode: true,\n data: row.cells\n .map(function (cell) {\n return cell.question.getPlainData(options);\n })\n .filter(function (d) { return !!d; }),\n };\n (options.calculations || []).forEach(function (calculation) {\n rowDataItem[calculation.propertyName] = row[calculation.propertyName];\n });\n return rowDataItem;\n });\n }\n return questionPlainData;\n };\n QuestionMatrixDropdownModelBase.prototype.getProgressInfo = function () {\n return _survey_element__WEBPACK_IMPORTED_MODULE_4__[\"SurveyElement\"].getProgressInfoByElements(this.getCellQuestions(), this.isRequired);\n };\n QuestionMatrixDropdownModelBase.prototype.getCellQuestions = function () {\n var rows = this.visibleRows;\n if (!rows)\n return [];\n var questions = [];\n for (var i = 0; i < rows.length; i++) {\n var row = rows[i];\n for (var j = 0; j < row.cells.length; j++) {\n questions.push(row.cells[j].question);\n }\n }\n return questions;\n };\n QuestionMatrixDropdownModelBase.prototype.onBeforeValueChanged = function (val) { };\n QuestionMatrixDropdownModelBase.prototype.onSetQuestionValue = function () {\n if (this.isRowChanging)\n return;\n this.onBeforeValueChanged(this.value);\n if (!this.generatedVisibleRows || this.generatedVisibleRows.length == 0)\n return;\n this.isRowChanging = true;\n var val = this.createNewValue();\n for (var i = 0; i < this.generatedVisibleRows.length; i++) {\n var row = this.generatedVisibleRows[i];\n this.generatedVisibleRows[i].value = this.getRowValueCore(row, val);\n }\n this.isRowChanging = false;\n };\n QuestionMatrixDropdownModelBase.prototype.setQuestionValue = function (newValue) {\n _super.prototype.setQuestionValue.call(this, newValue, false);\n this.onSetQuestionValue();\n this.updateIsAnswered();\n };\n QuestionMatrixDropdownModelBase.prototype.supportGoNextPageAutomatic = function () {\n var rows = this.generatedVisibleRows;\n if (!rows)\n rows = this.visibleRows;\n if (!rows)\n return true;\n for (var i = 0; i < rows.length; i++) {\n var cells = this.generatedVisibleRows[i].cells;\n if (!cells)\n continue;\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n var question = cells[colIndex].question;\n if (question &&\n (!question.supportGoNextPageAutomatic() || !question.value))\n return false;\n }\n }\n return true;\n };\n QuestionMatrixDropdownModelBase.prototype.getContainsErrors = function () {\n return (_super.prototype.getContainsErrors.call(this) ||\n this.checkForAnswersOrErrors(function (question) { return question.containsErrors; }, false));\n };\n QuestionMatrixDropdownModelBase.prototype.getIsAnswered = function () {\n return (_super.prototype.getIsAnswered.call(this) &&\n this.checkForAnswersOrErrors(function (question) { return question.isAnswered; }, true));\n };\n QuestionMatrixDropdownModelBase.prototype.checkForAnswersOrErrors = function (predicate, every) {\n if (every === void 0) { every = false; }\n var rows = this.generatedVisibleRows;\n if (!rows)\n return false;\n for (var i = 0; i < rows.length; i++) {\n var cells = rows[i].cells;\n if (!cells)\n continue;\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n if (!cells[colIndex])\n continue;\n var question = cells[colIndex].question;\n if (question && question.isVisible)\n if (predicate(question)) {\n if (!every)\n return true;\n }\n else {\n if (every)\n return false;\n }\n }\n }\n return every ? true : false;\n };\n QuestionMatrixDropdownModelBase.prototype.hasErrors = function (fireCallback, rec) {\n if (fireCallback === void 0) { fireCallback = true; }\n if (rec === void 0) { rec = null; }\n var errosInRows = this.hasErrorInRows(fireCallback, rec);\n var isDuplicated = this.isValueDuplicated();\n return _super.prototype.hasErrors.call(this, fireCallback, rec) || errosInRows || isDuplicated;\n };\n QuestionMatrixDropdownModelBase.prototype.getIsRunningValidators = function () {\n if (_super.prototype.getIsRunningValidators.call(this))\n return true;\n if (!this.generatedVisibleRows)\n return false;\n for (var i = 0; i < this.generatedVisibleRows.length; i++) {\n var cells = this.generatedVisibleRows[i].cells;\n if (!cells)\n continue;\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n if (!cells[colIndex])\n continue;\n var question = cells[colIndex].question;\n if (!!question && question.isRunningValidators)\n return true;\n }\n }\n return false;\n };\n QuestionMatrixDropdownModelBase.prototype.getAllErrors = function () {\n var result = _super.prototype.getAllErrors.call(this);\n var rows = this.generatedVisibleRows;\n if (rows === null)\n return result;\n for (var i = 0; i < rows.length; i++) {\n var row = rows[i];\n for (var j = 0; j < row.cells.length; j++) {\n var errors = row.cells[j].question.getAllErrors();\n if (errors && errors.length > 0) {\n result = result.concat(errors);\n }\n }\n }\n return result;\n };\n QuestionMatrixDropdownModelBase.prototype.hasErrorInRows = function (fireCallback, rec) {\n var _this = this;\n if (!this.generatedVisibleRows)\n return false;\n var res = false;\n if (!rec)\n rec = {};\n rec.isSingleDetailPanel = this.detailPanelMode === \"underRowSingle\";\n for (var i = 0; i < this.generatedVisibleRows.length; i++) {\n res =\n this.generatedVisibleRows[i].hasErrors(fireCallback, rec, function () {\n _this.raiseOnCompletedAsyncValidators();\n }) || res;\n }\n return res;\n };\n QuestionMatrixDropdownModelBase.prototype.isValueDuplicated = function () {\n if (!this.generatedVisibleRows)\n return false;\n var columns = this.getUniqueColumns();\n var res = false;\n for (var i = 0; i < columns.length; i++) {\n res = this.isValueInColumnDuplicated(columns[i]) || res;\n }\n return res;\n };\n QuestionMatrixDropdownModelBase.prototype.isValueInColumnDuplicated = function (column) {\n var keyValues = [];\n var res = false;\n for (var i = 0; i < this.generatedVisibleRows.length; i++) {\n res =\n this.isValueDuplicatedInRow(this.generatedVisibleRows[i], column, keyValues) || res;\n }\n return res;\n };\n QuestionMatrixDropdownModelBase.prototype.getUniqueColumns = function () {\n var res = new Array();\n for (var i = 0; i < this.columns.length; i++) {\n if (this.columns[i].isUnique) {\n res.push(this.columns[i]);\n }\n }\n return res;\n };\n QuestionMatrixDropdownModelBase.prototype.isValueDuplicatedInRow = function (row, column, keyValues) {\n var question = row.getQuestionByColumn(column);\n if (!question || question.isEmpty())\n return false;\n var value = question.value;\n for (var i = 0; i < keyValues.length; i++) {\n if (value == keyValues[i]) {\n this.addDuplicationError(question);\n return true;\n }\n }\n keyValues.push(value);\n return false;\n };\n QuestionMatrixDropdownModelBase.prototype.addDuplicationError = function (question) {\n question.addError(new _error__WEBPACK_IMPORTED_MODULE_12__[\"KeyDuplicationError\"](this.keyDuplicationError, this));\n };\n QuestionMatrixDropdownModelBase.prototype.getFirstInputElementId = function () {\n var question = this.getFirstCellQuestion(false);\n return question ? question.inputId : _super.prototype.getFirstInputElementId.call(this);\n };\n QuestionMatrixDropdownModelBase.prototype.getFirstErrorInputElementId = function () {\n var question = this.getFirstCellQuestion(true);\n return question ? question.inputId : _super.prototype.getFirstErrorInputElementId.call(this);\n };\n QuestionMatrixDropdownModelBase.prototype.getFirstCellQuestion = function (onError) {\n if (!this.generatedVisibleRows)\n return null;\n for (var i = 0; i < this.generatedVisibleRows.length; i++) {\n var cells = this.generatedVisibleRows[i].cells;\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n if (!onError)\n return cells[colIndex].question;\n if (cells[colIndex].question.currentErrorCount > 0)\n return cells[colIndex].question;\n }\n }\n return null;\n };\n QuestionMatrixDropdownModelBase.prototype.onReadOnlyChanged = function () {\n _super.prototype.onReadOnlyChanged.call(this);\n if (!this.generateRows)\n return;\n for (var i = 0; i < this.visibleRows.length; i++) {\n this.visibleRows[i].onQuestionReadOnlyChanged(this.isReadOnly);\n }\n };\n //IMatrixDropdownData\n QuestionMatrixDropdownModelBase.prototype.createQuestion = function (row, column) {\n return this.createQuestionCore(row, column);\n };\n QuestionMatrixDropdownModelBase.prototype.createQuestionCore = function (row, column) {\n var question = column.createCellQuestion(row);\n if (this.isReadOnly) {\n question.readOnly = true;\n }\n question.setSurveyImpl(row);\n question.setParentQuestion(this);\n return question;\n };\n QuestionMatrixDropdownModelBase.prototype.deleteRowValue = function (newValue, row) {\n if (!newValue)\n return newValue;\n delete newValue[row.rowName];\n return this.isObject(newValue) && Object.keys(newValue).length == 0\n ? null\n : newValue;\n };\n QuestionMatrixDropdownModelBase.prototype.onAnyValueChanged = function (name) {\n if (this.isLoadingFromJson ||\n this.isDoingonAnyValueChanged ||\n !this.generatedVisibleRows)\n return;\n this.isDoingonAnyValueChanged = true;\n var rows = this.visibleRows;\n for (var i = 0; i < rows.length; i++) {\n rows[i].onAnyValueChanged(name);\n }\n var totalRow = this.visibleTotalRow;\n if (!!totalRow) {\n totalRow.onAnyValueChanged(name);\n }\n this.isDoingonAnyValueChanged = false;\n };\n QuestionMatrixDropdownModelBase.prototype.isObject = function (value) {\n return value !== null && typeof value === \"object\";\n };\n QuestionMatrixDropdownModelBase.prototype.getOnCellValueChangedOptions = function (row, columnName, rowValue) {\n var getQuestion = function (colName) {\n for (var i = 0; i < row.cells.length; i++) {\n var col = row.cells[i].column;\n if (!!col && col.name === colName) {\n return row.cells[i].question;\n }\n }\n return null;\n };\n return {\n row: row,\n columnName: columnName,\n rowValue: rowValue,\n value: !!rowValue ? rowValue[columnName] : null,\n getCellQuestion: getQuestion,\n };\n };\n QuestionMatrixDropdownModelBase.prototype.onCellValueChanged = function (row, columnName, rowValue) {\n if (!this.survey)\n return;\n var options = this.getOnCellValueChangedOptions(row, columnName, rowValue);\n if (!!this.onCellValueChangedCallback) {\n this.onCellValueChangedCallback(options);\n }\n this.survey.matrixCellValueChanged(this, options);\n };\n QuestionMatrixDropdownModelBase.prototype.validateCell = function (row, columnName, rowValue) {\n if (!this.survey)\n return;\n var options = this.getOnCellValueChangedOptions(row, columnName, rowValue);\n return this.survey.matrixCellValidate(this, options);\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"isValidateOnValueChanging\", {\n get: function () {\n return !!this.survey ? this.survey.isValidateOnValueChanging : false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.onRowChanging = function (row, columnName, rowValue) {\n if (!this.survey)\n return !!rowValue ? rowValue[columnName] : null;\n var options = this.getOnCellValueChangedOptions(row, columnName, rowValue);\n var oldRowValue = this.getRowValueCore(row, this.createNewValue(), true);\n options.oldValue = !!oldRowValue ? oldRowValue[columnName] : null;\n this.survey.matrixCellValueChanging(this, options);\n return options.value;\n };\n QuestionMatrixDropdownModelBase.prototype.onRowChanged = function (row, columnName, newRowValue, isDeletingValue) {\n var rowObj = !!columnName ? this.getRowObj(row) : null;\n if (!!rowObj) {\n var columnValue = null;\n if (!!newRowValue && !isDeletingValue) {\n columnValue = newRowValue[columnName];\n }\n this.isRowChanging = true;\n rowObj[columnName] = columnValue;\n this.isRowChanging = false;\n this.onCellValueChanged(row, columnName, rowObj);\n }\n else {\n var oldValue = this.createNewValue(true);\n var combine = this.getNewValueOnRowChanged(row, columnName, newRowValue, isDeletingValue, this.createNewValue());\n if (this.isTwoValueEquals(oldValue, combine.value))\n return;\n this.isRowChanging = true;\n this.setNewValue(combine.value);\n this.isRowChanging = false;\n if (columnName) {\n this.onCellValueChanged(row, columnName, combine.rowValue);\n }\n }\n };\n QuestionMatrixDropdownModelBase.prototype.getNewValueOnRowChanged = function (row, columnName, newRowValue, isDeletingValue, newValue) {\n var rowValue = this.getRowValueCore(row, newValue, true);\n if (isDeletingValue) {\n delete rowValue[columnName];\n }\n for (var i = 0; i < row.cells.length; i++) {\n var key = row.cells[i].question.getValueName();\n delete rowValue[key];\n }\n if (newRowValue) {\n newRowValue = JSON.parse(JSON.stringify(newRowValue));\n for (var key in newRowValue) {\n if (!this.isValueEmpty(newRowValue[key])) {\n rowValue[key] = newRowValue[key];\n }\n }\n }\n if (this.isObject(rowValue) && Object.keys(rowValue).length === 0) {\n newValue = this.deleteRowValue(newValue, row);\n }\n return { value: newValue, rowValue: rowValue };\n };\n QuestionMatrixDropdownModelBase.prototype.getRowIndex = function (row) {\n if (!this.generatedVisibleRows)\n return -1;\n return this.visibleRows.indexOf(row);\n };\n QuestionMatrixDropdownModelBase.prototype.getElementsInDesign = function (includeHidden) {\n if (includeHidden === void 0) { includeHidden = false; }\n if (this.detailPanelMode == \"none\")\n return _super.prototype.getElementsInDesign.call(this, includeHidden);\n return includeHidden ? [this.detailPanel] : this.detailElements;\n };\n QuestionMatrixDropdownModelBase.prototype.hasDetailPanel = function (row) {\n if (this.detailPanelMode == \"none\")\n return false;\n if (this.isDesignMode)\n return true;\n if (!!this.onHasDetailPanelCallback)\n return this.onHasDetailPanelCallback(row);\n return this.detailElements.length > 0;\n };\n QuestionMatrixDropdownModelBase.prototype.getIsDetailPanelShowing = function (row) {\n if (this.detailPanelMode == \"none\")\n return false;\n if (this.isDesignMode) {\n var res = this.visibleRows.indexOf(row) == 0;\n if (res) {\n if (!row.detailPanel) {\n row.showDetailPanel();\n }\n }\n return res;\n }\n return this.getPropertyValue(\"isRowShowing\" + row.id, false);\n };\n QuestionMatrixDropdownModelBase.prototype.setIsDetailPanelShowing = function (row, val) {\n if (val == this.getIsDetailPanelShowing(row))\n return;\n this.setPropertyValue(\"isRowShowing\" + row.id, val);\n this.updateDetailPanelButtonCss(row);\n if (!!this.renderedTable) {\n this.renderedTable.onDetailPanelChangeVisibility(row, val);\n }\n if (val && this.detailPanelMode === \"underRowSingle\") {\n var rows = this.visibleRows;\n for (var i = 0; i < rows.length; i++) {\n if (rows[i].id !== row.id && rows[i].isDetailPanelShowing) {\n rows[i].hideDetailPanel();\n }\n }\n }\n };\n QuestionMatrixDropdownModelBase.prototype.getDetailPanelButtonCss = function (row) {\n var res = this.getPropertyValue(\"detailButtonCss\" + row.id);\n if (!!res)\n return res;\n var res = this.cssClasses.detailButton;\n return !!res ? res : \"\";\n };\n QuestionMatrixDropdownModelBase.prototype.getDetailPanelIconCss = function (row) {\n var res = this.getPropertyValue(\"detailIconCss\" + row.id);\n if (!!res)\n return res;\n var res = this.cssClasses.detailIcon;\n return !!res ? res : \"\";\n };\n QuestionMatrixDropdownModelBase.prototype.updateDetailPanelButtonCss = function (row) {\n var classes = this.cssClasses;\n var icon = classes.detailIcon;\n if (!icon)\n icon = \"\";\n var button = classes.detailButton;\n if (!button)\n button = \"\";\n if (this.getIsDetailPanelShowing(row)) {\n if (!!classes.detailIconExpanded)\n icon += \" \" + classes.detailIconExpanded;\n if (!!classes.detailButtonExpanded)\n button += \" \" + classes.detailButtonExpanded;\n }\n this.setPropertyValue(\"detailIconCss\" + row.id, icon);\n this.setPropertyValue(\"detailButtonCss\" + row.id, button);\n };\n QuestionMatrixDropdownModelBase.prototype.createRowDetailPanel = function (row) {\n if (this.isDesignMode)\n return this.detailPanel;\n var panel = this.createNewDetailPanel();\n var json = this.detailPanel.toJSON();\n new _jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"JsonObject\"]().toObject(json, panel);\n panel.renderWidth = \"100%\";\n panel.updateCustomWidgets();\n if (!!this.onCreateDetailPanelCallback) {\n this.onCreateDetailPanelCallback(row, panel);\n }\n return panel;\n };\n QuestionMatrixDropdownModelBase.prototype.getSharedQuestionByName = function (columnName, row) {\n if (!this.survey || !this.valueName)\n return null;\n var index = this.getRowIndex(row);\n if (index < 0)\n return null;\n return (this.survey.getQuestionByValueNameFromArray(this.valueName, columnName, index));\n };\n QuestionMatrixDropdownModelBase.prototype.onTotalValueChanged = function () {\n if (!!this.data &&\n !!this.visibleTotalRow &&\n !this.isLoadingFromJson &&\n !this.isSett &&\n !this.isReadOnly) {\n this.data.setValue(this.getValueName() + _settings__WEBPACK_IMPORTED_MODULE_11__[\"settings\"].matrixTotalValuePostFix, this.totalValue, false);\n }\n };\n QuestionMatrixDropdownModelBase.prototype.getQuestionFromArray = function (name, index) {\n if (index >= this.visibleRows.length)\n return null;\n return this.visibleRows[index].getQuestionByName(name);\n };\n QuestionMatrixDropdownModelBase.prototype.isMatrixValueEmpty = function (val) {\n if (!val)\n return;\n if (Array.isArray(val)) {\n for (var i = 0; i < val.length; i++) {\n if (this.isObject(val[i]) && Object.keys(val[i]).length > 0)\n return false;\n }\n return true;\n }\n return Object.keys(val).length == 0;\n };\n Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, \"SurveyModel\", {\n get: function () {\n return this.survey;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDropdownModelBase.prototype.getCellTemplateData = function (cell) {\n // return cell.cell.column.templateQuestion;\n return this.SurveyModel.getMatrixCellTemplateData(cell);\n };\n QuestionMatrixDropdownModelBase.prototype.getCellWrapperComponentName = function (cell) {\n return this.SurveyModel.getElementWrapperComponentName(cell, \"cell\");\n };\n QuestionMatrixDropdownModelBase.prototype.getCellWrapperComponentData = function (cell) {\n return this.SurveyModel.getElementWrapperComponentData(cell, \"cell\");\n };\n QuestionMatrixDropdownModelBase.prototype.getColumnHeaderWrapperComponentName = function (cell) {\n return this.SurveyModel.getElementWrapperComponentName(cell, \"column-header\");\n };\n QuestionMatrixDropdownModelBase.prototype.getColumnHeaderWrapperComponentData = function (cell) {\n return this.SurveyModel.getElementWrapperComponentData(cell, \"column-header\");\n };\n QuestionMatrixDropdownModelBase.prototype.getRowHeaderWrapperComponentName = function (cell) {\n return this.SurveyModel.getElementWrapperComponentName(cell, \"row-header\");\n };\n QuestionMatrixDropdownModelBase.prototype.getRowHeaderWrapperComponentData = function (cell) {\n return this.SurveyModel.getElementWrapperComponentData(cell, \"row-header\");\n };\n return QuestionMatrixDropdownModelBase;\n}(_martixBase__WEBPACK_IMPORTED_MODULE_1__[\"QuestionMatrixBaseModel\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"matrixdropdowncolumn\", [\n { name: \"!name\", isUnique: true },\n { name: \"title\", serializationProperty: \"locTitle\" },\n {\n name: \"cellType\",\n default: \"default\",\n choices: function () {\n var res = MatrixDropdownColumn.getColumnTypes();\n res.splice(0, 0, \"default\");\n return res;\n },\n },\n { name: \"colCount\", default: -1, choices: [-1, 0, 1, 2, 3, 4] },\n \"isRequired:boolean\",\n \"isUnique:boolean\",\n {\n name: \"requiredErrorText:text\",\n serializationProperty: \"locRequiredErrorText\",\n },\n \"readOnly:boolean\",\n \"minWidth\",\n \"width\",\n \"visibleIf:condition\",\n \"enableIf:condition\",\n \"requiredIf:condition\",\n {\n name: \"showInMultipleColumns:boolean\",\n dependsOn: \"cellType\",\n visibleIf: function (obj) {\n if (!obj)\n return false;\n return obj.isSupportMultipleColumns;\n },\n },\n {\n name: \"validators:validators\",\n baseClassName: \"surveyvalidator\",\n classNamePart: \"validator\",\n },\n {\n name: \"totalType\",\n default: \"none\",\n choices: [\"none\", \"sum\", \"count\", \"min\", \"max\", \"avg\"],\n },\n \"totalExpression:expression\",\n { name: \"totalFormat\", serializationProperty: \"locTotalFormat\" },\n {\n name: \"totalDisplayStyle\",\n default: \"none\",\n choices: [\"none\", \"decimal\", \"currency\", \"percent\"],\n },\n {\n name: \"totalCurrency\",\n choices: function () {\n return Object(_question_expression__WEBPACK_IMPORTED_MODULE_9__[\"getCurrecyCodes\"])();\n },\n default: \"USD\",\n },\n { name: \"totalMaximumFractionDigits:number\", default: -1 },\n { name: \"totalMinimumFractionDigits:number\", default: -1 },\n { name: \"renderAs\", default: \"default\", visible: false },\n], function () {\n return new MatrixDropdownColumn(\"\");\n});\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"matrixdropdownbase\", [\n {\n name: \"columns:matrixdropdowncolumns\",\n className: \"matrixdropdowncolumn\",\n },\n {\n name: \"columnLayout\",\n alternativeName: \"columnsLocation\",\n default: \"horizontal\",\n choices: [\"horizontal\", \"vertical\"],\n },\n {\n name: \"detailElements\",\n visible: false,\n isLightSerializable: false,\n },\n {\n name: \"detailPanelMode\",\n choices: [\"none\", \"underRow\", \"underRowSingle\"],\n default: \"none\",\n },\n \"horizontalScroll:boolean\",\n {\n name: \"choices:itemvalue[]\",\n },\n { name: \"optionsCaption\", serializationProperty: \"locOptionsCaption\" },\n {\n name: \"keyDuplicationError\",\n serializationProperty: \"locKeyDuplicationError\",\n },\n {\n name: \"cellType\",\n default: \"dropdown\",\n choices: function () {\n return MatrixDropdownColumn.getColumnTypes();\n },\n },\n { name: \"columnColCount\", default: 0, choices: [0, 1, 2, 3, 4] },\n \"columnMinWidth\",\n], function () {\n return new QuestionMatrixDropdownModelBase(\"\");\n}, \"matrixbase\");\n\n\n/***/ }),\n\n/***/ \"./src/question_matrixdynamic.ts\":\n/*!***************************************!*\\\n !*** ./src/question_matrixdynamic.ts ***!\n \\***************************************/\n/*! exports provided: MatrixDynamicRowModel, QuestionMatrixDynamicModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MatrixDynamicRowModel\", function() { return MatrixDynamicRowModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMatrixDynamicModel\", function() { return QuestionMatrixDynamicModel; });\n/* harmony import */ var _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./question_matrixdropdownbase */ \"./src/question_matrixdropdownbase.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\n/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/utils */ \"./src/utils/utils.ts\");\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.esm.js\");\n/* harmony import */ var _actions_action__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./actions/action */ \"./src/actions/action.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\n\n\n\nvar Sortable = sortablejs__WEBPACK_IMPORTED_MODULE_8__[\"default\"];\nvar MatrixDynamicRowModel = /** @class */ (function (_super) {\n __extends(MatrixDynamicRowModel, _super);\n function MatrixDynamicRowModel(index, data, value) {\n var _this = _super.call(this, data, value) || this;\n _this.index = index;\n _this.buildCells(value);\n return _this;\n }\n Object.defineProperty(MatrixDynamicRowModel.prototype, \"rowName\", {\n get: function () {\n return this.id;\n },\n enumerable: false,\n configurable: true\n });\n return MatrixDynamicRowModel;\n}(_question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__[\"MatrixDropdownRowModelBase\"]));\n\n/**\n * A Model for a matrix dymanic question. You may use a dropdown, checkbox, radiogroup, text and comment questions as a cell editors.\n * An end-user may dynamically add/remove rows, unlike in matrix dropdown question.\n */\nvar QuestionMatrixDynamicModel = /** @class */ (function (_super) {\n __extends(QuestionMatrixDynamicModel, _super);\n function QuestionMatrixDynamicModel(name) {\n var _this = _super.call(this, name) || this;\n _this.rowCounter = 0;\n _this.initialRowCount = 2;\n _this.setRowCountValueFromData = false;\n _this.moveRowByIndex = function (fromIndex, toIndex) {\n var value = _this.createNewValue();\n if (!value)\n return;\n var movableRow = value[fromIndex];\n if (!movableRow)\n return;\n value.splice(fromIndex, 1);\n value.splice(toIndex, 0, movableRow);\n _this.value = value;\n };\n void (_this.createLocalizableString(\"confirmDeleteText\", _this));\n var locAddRowText = _this.createLocalizableString(\"addRowText\", _this);\n locAddRowText.onGetTextCallback = function (text) {\n return !!text ? text : _this.defaultAddRowText;\n };\n var locRemoveRowText = _this.createLocalizableString(\"removeRowText\", _this);\n locRemoveRowText.onGetTextCallback = function (text) {\n return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(\"removeRow\");\n };\n var locEmptyRowsText = (_this.createLocalizableString(\"emptyRowsText\", _this));\n locEmptyRowsText.onGetTextCallback = function (text) {\n return !!text ? text : _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(\"emptyRowsText\");\n };\n _this.registerFunctionOnPropertiesValueChanged([\"hideColumnsIfEmpty\", \"allowAddRows\"], function () {\n _this.updateShowTableAndAddRow();\n });\n _this.registerFunctionOnPropertyValueChanged(\"allowRowsDragAndDrop\", function () {\n _this.clearRowsAndResetRenderedTable();\n });\n return _this;\n }\n QuestionMatrixDynamicModel.prototype.getType = function () {\n return \"matrixdynamic\";\n };\n //cross framework initialization\n QuestionMatrixDynamicModel.prototype.afterRenderQuestionElement = function (el) {\n if (!!el && this.allowRowsDragAndDrop) {\n this.initSortable(el.querySelector(\"tbody\"));\n }\n _super.prototype.afterRenderQuestionElement.call(this, el);\n };\n //cross framework destroy\n QuestionMatrixDynamicModel.prototype.beforeDestroyQuestionElement = function (el) {\n if (this.sortableInst)\n this.sortableInst.destroy();\n _super.prototype.beforeDestroyQuestionElement.call(this, el);\n };\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"isRowsDynamic\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"confirmDelete\", {\n /**\n * Set it to true, to show a confirmation dialog on removing a row\n * @see ConfirmDeleteText\n */\n get: function () {\n return this.getPropertyValue(\"confirmDelete\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"confirmDelete\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"keyName\", {\n /**\n * Set it to a column name and the library shows duplication error, if there are same values in different rows in the column.\n * @see keyDuplicationError\n */\n get: function () {\n return this.getPropertyValue(\"keyName\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"keyName\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"defaultRowValue\", {\n /**\n * If it is not empty, then this value is set to every new row, including rows created initially, unless the defaultValue is not empty\n * @see defaultValue\n * @see defaultValueFromLastRow\n */\n get: function () {\n return this.getPropertyValue(\"defaultRowValue\");\n },\n set: function (val) {\n this.setPropertyValue(\"defaultRowValue\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"defaultValueFromLastRow\", {\n /**\n * Set it to true to copy the value into new added row from the last row. If defaultRowValue is set and this property equals to true,\n * then the value for new added row is merging.\n * @see defaultValue\n * @see defaultRowValue\n */\n get: function () {\n return this.getPropertyValue(\"defaultValueFromLastRow\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"defaultValueFromLastRow\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDynamicModel.prototype.isDefaultValueEmpty = function () {\n return (_super.prototype.isDefaultValueEmpty.call(this) && this.isValueEmpty(this.defaultRowValue));\n };\n QuestionMatrixDynamicModel.prototype.valueFromData = function (val) {\n if (this.minRowCount < 1)\n return _super.prototype.valueFromData.call(this, val);\n if (!Array.isArray(val))\n val = [];\n for (var i = val.length; i < this.minRowCount; i++)\n val.push({});\n return val;\n };\n QuestionMatrixDynamicModel.prototype.setDefaultValue = function () {\n if (this.isValueEmpty(this.defaultRowValue) ||\n !this.isValueEmpty(this.defaultValue)) {\n _super.prototype.setDefaultValue.call(this);\n return;\n }\n if (!this.isEmpty() || this.rowCount == 0)\n return;\n var newValue = [];\n for (var i = 0; i < this.rowCount; i++) {\n newValue.push(this.defaultRowValue);\n }\n this.value = newValue;\n };\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"rowCount\", {\n /**\n * The number of rows in the matrix.\n * @see minRowCount\n * @see maxRowCount\n */\n get: function () {\n return this.rowCountValue;\n },\n set: function (val) {\n if (val < 0 || val > _settings__WEBPACK_IMPORTED_MODULE_6__[\"settings\"].matrixMaximumRowCount)\n return;\n this.setRowCountValueFromData = false;\n var prevValue = this.rowCountValue;\n this.rowCountValue = val;\n if (this.value && this.value.length > val) {\n var qVal = this.value;\n qVal.splice(val);\n this.value = qVal;\n }\n if (this.isLoadingFromJson) {\n this.initialRowCount = val;\n return;\n }\n if (this.generatedVisibleRows || prevValue == 0) {\n if (!this.generatedVisibleRows) {\n this.generatedVisibleRows = [];\n }\n this.generatedVisibleRows.splice(val);\n for (var i = prevValue; i < val; i++) {\n var newRow = this.createMatrixRow(this.getValueForNewRow());\n this.generatedVisibleRows.push(newRow);\n this.onMatrixRowCreated(newRow);\n }\n }\n this.onRowsChanged();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"allowRowsDragAndDrop\", {\n /**\n * Set this property to true, to allow rows drag and drop.\n */\n get: function () {\n return this.getPropertyValue(\"allowRowsDragAndDrop\");\n },\n set: function (val) {\n this.setPropertyValue(\"allowRowsDragAndDrop\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDynamicModel.prototype.initSortable = function (domNode) {\n if (!domNode)\n return;\n if (this.isReadOnly)\n return;\n var self = this;\n self.domNode = domNode;\n self.sortableInst = new Sortable(domNode, {\n animation: 100,\n forceFallback: true,\n delay: 200,\n delayOnTouchOnly: true,\n handle: \"tr\",\n onEnd: function (evt) {\n self.moveRowByIndex(evt.oldDraggableIndex, evt.newDraggableIndex);\n },\n });\n };\n QuestionMatrixDynamicModel.prototype.createRenderedTable = function () {\n return new QuestionMatrixDynamicRenderedTable(this);\n };\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"rowCountValue\", {\n get: function () {\n return this.getPropertyValue(\"rowCount\", 2);\n },\n set: function (val) {\n this.setPropertyValue(\"rowCount\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDynamicModel.prototype.getValueForNewRow = function () {\n var res = null;\n if (!!this.onGetValueForNewRowCallBack) {\n res = this.onGetValueForNewRowCallBack(this);\n }\n return res;\n };\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"minRowCount\", {\n /**\n * The minimum row count. A user could not delete a row if the rowCount equals to minRowCount\n * @see rowCount\n * @see maxRowCount\n * @see allowAddRows\n */\n get: function () {\n return this.getPropertyValue(\"minRowCount\", 0);\n },\n set: function (val) {\n if (val < 0)\n val = 0;\n this.setPropertyValue(\"minRowCount\", val);\n if (val > this.maxRowCount)\n this.maxRowCount = val;\n if (this.rowCount < val)\n this.rowCount = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"maxRowCount\", {\n /**\n * The maximum row count. A user could not add a row if the rowCount equals to maxRowCount\n * @see rowCount\n * @see minRowCount\n * @see allowAddRows\n */\n get: function () {\n return this.getPropertyValue(\"maxRowCount\", _settings__WEBPACK_IMPORTED_MODULE_6__[\"settings\"].matrixMaximumRowCount);\n },\n set: function (val) {\n if (val <= 0)\n return;\n if (val > _settings__WEBPACK_IMPORTED_MODULE_6__[\"settings\"].matrixMaximumRowCount)\n val = _settings__WEBPACK_IMPORTED_MODULE_6__[\"settings\"].matrixMaximumRowCount;\n if (val == this.maxRowCount)\n return;\n this.setPropertyValue(\"maxRowCount\", val);\n if (val < this.minRowCount)\n this.minRowCount = val;\n if (this.rowCount > val)\n this.rowCount = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"allowAddRows\", {\n /**\n * Set this property to false to disable ability to add new rows. \"Add new Row\" button becomes invsible in UI\n * @see canAddRow\n * @see allowRemoveRows\n */\n get: function () {\n return this.getPropertyValue(\"allowAddRows\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"allowAddRows\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"allowRemoveRows\", {\n /**\n * Set this property to false to disable ability to remove rows. \"Remove\" row buttons become invsible in UI\n * @see canRemoveRows\n * @see allowAddRows\n */\n get: function () {\n return this.getPropertyValue(\"allowRemoveRows\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"allowRemoveRows\", val);\n if (!this.isLoadingFromJson) {\n this.resetRenderedTable();\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"canAddRow\", {\n /**\n * Returns true, if a new row can be added.\n * @see allowAddRows\n * @see maxRowCount\n * @see canRemoveRows\n * @see rowCount\n */\n get: function () {\n return (this.allowAddRows && !this.isReadOnly && this.rowCount < this.maxRowCount);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"canRemoveRows\", {\n /**\n * Returns true, if row can be removed.\n * @see minRowCount\n * @see canAddRow\n * @see rowCount\n */\n get: function () {\n var res = this.allowRemoveRows &&\n !this.isReadOnly &&\n this.rowCount > this.minRowCount;\n return !!this.canRemoveRowsCallback ? this.canRemoveRowsCallback(res) : res;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDynamicModel.prototype.canRemoveRow = function (row) {\n if (!this.survey)\n return true;\n return this.survey.matrixAllowRemoveRow(this, row.index, row);\n };\n /**\n * Creates and add a new row and focus the cell in the first column.\n */\n QuestionMatrixDynamicModel.prototype.addRowUI = function () {\n var oldRowCount = this.rowCount;\n this.addRow();\n if (oldRowCount === this.rowCount)\n return;\n var q = this.getQuestionToFocusOnAddingRow();\n if (!!q) {\n q.focus();\n }\n };\n QuestionMatrixDynamicModel.prototype.getQuestionToFocusOnAddingRow = function () {\n var row = this.visibleRows[this.visibleRows.length - 1];\n for (var i = 0; i < row.cells.length; i++) {\n var q = row.cells[i].question;\n if (!!q && q.isVisible && !q.isReadOnly) {\n return q;\n }\n }\n return null;\n };\n /**\n * Creates and add a new row.\n */\n QuestionMatrixDynamicModel.prototype.addRow = function () {\n var options = { question: this, canAddRow: this.canAddRow };\n if (!!this.survey) {\n this.survey.matrixBeforeRowAdded(options);\n }\n if (!options.canAddRow)\n return;\n this.onStartRowAddingRemoving();\n this.addRowCore();\n this.onEndRowAdding();\n if (this.detailPanelShowOnAdding && this.visibleRows.length > 0) {\n this.visibleRows[this.visibleRows.length - 1].showDetailPanel();\n }\n };\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"detailPanelShowOnAdding\", {\n /**\n * Set this property to true to show detail panel immediately on adding a new row.\n * @see detailPanelMode\n */\n get: function () {\n return this.getPropertyValue(\"detailPanelShowOnAdding\");\n },\n set: function (val) {\n this.setPropertyValue(\"detailPanelShowOnAdding\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDynamicModel.prototype.hasRowsAsItems = function () {\n return false;\n };\n QuestionMatrixDynamicModel.prototype.unbindValue = function () {\n this.clearGeneratedRows();\n this.clearPropertyValue(\"value\");\n this.rowCountValue = 0;\n _super.prototype.unbindValue.call(this);\n };\n QuestionMatrixDynamicModel.prototype.isValueSurveyElement = function (val) {\n return this.isEditingSurveyElement || _super.prototype.isValueSurveyElement.call(this, val);\n };\n QuestionMatrixDynamicModel.prototype.addRowCore = function () {\n var prevRowCount = this.rowCount;\n this.rowCount = this.rowCount + 1;\n var defaultValue = this.getDefaultRowValue(true);\n var newValue = null;\n if (!this.isValueEmpty(defaultValue)) {\n newValue = this.createNewValue();\n if (newValue.length == this.rowCount) {\n newValue[newValue.length - 1] = defaultValue;\n this.value = newValue;\n }\n }\n if (this.data) {\n this.runCellsCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());\n var row = this.visibleRows[this.rowCount - 1];\n if (!this.isValueEmpty(row.value)) {\n if (!newValue) {\n newValue = this.createNewValue();\n }\n if (!this.isValueSurveyElement(newValue) &&\n !_helpers__WEBPACK_IMPORTED_MODULE_5__[\"Helpers\"].isTwoValueEquals(newValue[newValue.length - 1], row.value)) {\n newValue[newValue.length - 1] = row.value;\n this.value = newValue;\n }\n }\n }\n if (this.survey) {\n if (prevRowCount + 1 == this.rowCount) {\n this.survey.matrixRowAdded(this, this.visibleRows[this.visibleRows.length - 1]);\n this.onRowsChanged();\n }\n }\n };\n QuestionMatrixDynamicModel.prototype.getDefaultRowValue = function (isRowAdded) {\n var res = null;\n for (var i = 0; i < this.columns.length; i++) {\n var q = this.columns[i].templateQuestion;\n if (!!q && !this.isValueEmpty(q.getDefaultValue())) {\n res = res || {};\n res[this.columns[i].name] = q.getDefaultValue();\n }\n }\n if (!this.isValueEmpty(this.defaultRowValue)) {\n for (var key in this.defaultRowValue) {\n res = res || {};\n res[key] = this.defaultRowValue[key];\n }\n }\n if (isRowAdded && this.defaultValueFromLastRow) {\n var val = this.value;\n if (!!val && Array.isArray(val) && val.length >= this.rowCount - 1) {\n var rowValue = val[this.rowCount - 2];\n for (var key in rowValue) {\n res = res || {};\n res[key] = rowValue[key];\n }\n }\n }\n return res;\n };\n /**\n * Removes a row by it's index. If confirmDelete is true, show a confirmation dialog\n * @param index a row index, from 0 to rowCount - 1\n * @see removeRow\n * @see confirmDelete\n */\n QuestionMatrixDynamicModel.prototype.removeRowUI = function (value) {\n if (!!value && !!value.rowName) {\n var index = this.visibleRows.indexOf(value);\n if (index < 0)\n return;\n value = index;\n }\n if (!this.isRequireConfirmOnRowDelete(value) ||\n Object(_utils_utils__WEBPACK_IMPORTED_MODULE_7__[\"confirmAction\"])(this.confirmDeleteText)) {\n this.removeRow(value);\n }\n };\n QuestionMatrixDynamicModel.prototype.isRequireConfirmOnRowDelete = function (index) {\n if (!this.confirmDelete)\n return false;\n if (index < 0 || index >= this.rowCount)\n return false;\n var value = this.createNewValue();\n if (this.isValueEmpty(value) || !Array.isArray(value))\n return false;\n if (index >= value.length)\n return false;\n return !this.isValueEmpty(value[index]);\n };\n /**\n * Removes a row by it's index.\n * @param index a row index, from 0 to rowCount - 1\n */\n QuestionMatrixDynamicModel.prototype.removeRow = function (index) {\n if (!this.canRemoveRows)\n return;\n if (index < 0 || index >= this.rowCount)\n return;\n var row = !!this.visibleRows && index < this.visibleRows.length\n ? this.visibleRows[index]\n : null;\n if (!!row &&\n !!this.survey &&\n !this.survey.matrixRowRemoving(this, index, row))\n return;\n this.onStartRowAddingRemoving();\n this.removeRowCore(index);\n this.onEndRowRemoving(row);\n };\n QuestionMatrixDynamicModel.prototype.removeRowCore = function (index) {\n var row = this.generatedVisibleRows\n ? this.generatedVisibleRows[index]\n : null;\n if (this.generatedVisibleRows && index < this.generatedVisibleRows.length) {\n this.generatedVisibleRows.splice(index, 1);\n }\n this.rowCountValue--;\n if (this.value) {\n var val = [];\n if (Array.isArray(this.value) && index < this.value.length) {\n val = this.createValueCopy();\n }\n else {\n val = this.createNewValue();\n }\n val.splice(index, 1);\n val = this.deleteRowValue(val, null);\n this.isRowChanging = true;\n this.value = val;\n this.isRowChanging = false;\n }\n this.onRowsChanged();\n if (this.survey) {\n this.survey.matrixRowRemoved(this, index, row);\n }\n };\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"confirmDeleteText\", {\n /**\n * Use this property to change the default text showing in the confirmation delete dialog on removing a row.\n */\n get: function () {\n return this.getLocalizableStringText(\"confirmDeleteText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(\"confirmDelete\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"confirmDeleteText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"locConfirmDeleteText\", {\n get: function () {\n return this.getLocalizableString(\"confirmDeleteText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"addRowText\", {\n /**\n * Use this property to change the default value of add row button text.\n */\n get: function () {\n return this.getLocalizableStringText(\"addRowText\", this.defaultAddRowText);\n },\n set: function (val) {\n this.setLocalizableStringText(\"addRowText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"locAddRowText\", {\n get: function () {\n return this.getLocalizableString(\"addRowText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"defaultAddRowText\", {\n get: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(this.isColumnLayoutHorizontal ? \"addRow\" : \"addColumn\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"addRowLocation\", {\n /**\n * By default the 'Add Row' button is shown on bottom if columnLayout is horizontal and on top if columnLayout is vertical.
\n * You may set it to \"top\", \"bottom\" or \"topBottom\" (to show on top and bottom).\n * @see columnLayout\n */\n get: function () {\n return this.getPropertyValue(\"addRowLocation\");\n },\n set: function (val) {\n this.setPropertyValue(\"addRowLocation\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDynamicModel.prototype.getAddRowLocation = function () {\n return this.addRowLocation;\n };\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"hideColumnsIfEmpty\", {\n /**\n * Set this property to true to hide matrix columns when there is no any row.\n */\n get: function () {\n return this.getPropertyValue(\"hideColumnsIfEmpty\");\n },\n set: function (val) {\n this.setPropertyValue(\"hideColumnsIfEmpty\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDynamicModel.prototype.getShowColumnsIfEmpty = function () {\n return this.hideColumnsIfEmpty;\n };\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"removeRowText\", {\n /**\n * Use this property to change the default value of remove row button text.\n */\n get: function () {\n return this.getLocalizableStringText(\"removeRowText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(\"removeRow\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"removeRowText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"locRemoveRowText\", {\n get: function () {\n return this.getLocalizableString(\"removeRowText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"emptyRowsText\", {\n /**\n * Use this property to change the default value of remove row button text.\n */\n get: function () {\n return this.getLocalizableStringText(\"emptyRowsText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(\"emptyRowsText\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"emptyRowsText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"locEmptyRowsText\", {\n get: function () {\n return this.getLocalizableString(\"emptyRowsText\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDynamicModel.prototype.getDisplayValueCore = function (keysAsText, value) {\n if (!value || !Array.isArray(value))\n return value;\n var values = this.getUnbindValue(value);\n var rows = this.visibleRows;\n for (var i = 0; i < rows.length && i < values.length; i++) {\n var val = values[i];\n if (!val)\n continue;\n values[i] = this.getRowDisplayValue(keysAsText, rows[i], val);\n }\n return values;\n };\n QuestionMatrixDynamicModel.prototype.addConditionObjectsByContext = function (objects, context) {\n var hasContext = !!context ? this.columns.indexOf(context) > -1 : false;\n for (var i = 0; i < this.columns.length; i++) {\n var column = this.columns[i];\n this.addColumnIntoaddConditionObjectsByContext(objects, 0, column);\n if (hasContext && column != context) {\n this.addColumnIntoaddConditionObjectsByContext(objects, -1, column);\n }\n for (var j = 1; j < Math.min(_settings__WEBPACK_IMPORTED_MODULE_6__[\"settings\"].matrixMaxRowCountInCondition, this.rowCount); j++) {\n this.addColumnIntoaddConditionObjectsByContext(objects, j, column);\n }\n }\n };\n QuestionMatrixDynamicModel.prototype.addColumnIntoaddConditionObjectsByContext = function (objects, rowIndex, column) {\n var rowName = rowIndex > -1 ? \"[\" + rowIndex.toString() + \"].\" : \"row.\";\n objects.push({\n name: (rowIndex > -1 ? this.getValueName() + rowName : rowName) + column.name,\n text: (rowIndex > -1 ? this.processedTitle + rowName : rowName) +\n column.fullTitle,\n question: this,\n });\n };\n QuestionMatrixDynamicModel.prototype.supportGoNextPageAutomatic = function () {\n return false;\n };\n Object.defineProperty(QuestionMatrixDynamicModel.prototype, \"hasRowText\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMatrixDynamicModel.prototype.onCheckForErrors = function (errors, isOnValueChanged) {\n _super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged);\n if (!isOnValueChanged && this.hasErrorInMinRows()) {\n errors.push(new _error__WEBPACK_IMPORTED_MODULE_4__[\"MinRowCountError\"](this.minRowCount, this));\n }\n };\n QuestionMatrixDynamicModel.prototype.hasErrorInMinRows = function () {\n if (this.minRowCount <= 0 || !this.isRequired || !this.generatedVisibleRows)\n return false;\n var setRowCount = 0;\n for (var rowIndex = 0; rowIndex < this.generatedVisibleRows.length; rowIndex++) {\n var row = this.generatedVisibleRows[rowIndex];\n if (!row.isEmpty)\n setRowCount++;\n }\n return setRowCount < this.minRowCount;\n };\n QuestionMatrixDynamicModel.prototype.getUniqueColumns = function () {\n var res = _super.prototype.getUniqueColumns.call(this);\n if (!!this.keyName) {\n var column = this.getColumnByName(this.keyName);\n if (!!column && res.indexOf(column) < 0) {\n res.push(column);\n }\n }\n return res;\n };\n QuestionMatrixDynamicModel.prototype.generateRows = function () {\n var result = new Array();\n if (this.rowCount === 0)\n return result;\n var val = this.createNewValue();\n for (var i = 0; i < this.rowCount; i++) {\n result.push(this.createMatrixRow(this.getRowValueByIndex(val, i)));\n }\n if (!this.isValueEmpty(this.getDefaultRowValue(false))) {\n this.value = val;\n }\n return result;\n };\n QuestionMatrixDynamicModel.prototype.createMatrixRow = function (value) {\n return new MatrixDynamicRowModel(this.rowCounter++, this, value);\n };\n QuestionMatrixDynamicModel.prototype.onBeforeValueChanged = function (val) {\n if (!val || !Array.isArray(val))\n return;\n var newRowCount = val.length;\n if (newRowCount == this.rowCount)\n return;\n if (!this.setRowCountValueFromData && newRowCount < this.initialRowCount)\n return;\n this.setRowCountValueFromData = true;\n this.rowCountValue = newRowCount;\n if (this.generatedVisibleRows) {\n this.clearGeneratedRows();\n this.generatedVisibleRows = this.visibleRows;\n this.onRowsChanged();\n }\n };\n QuestionMatrixDynamicModel.prototype.createNewValue = function () {\n var result = this.createValueCopy();\n if (!result || !Array.isArray(result))\n result = [];\n if (result.length > this.rowCount)\n result.splice(this.rowCount);\n var rowValue = this.getDefaultRowValue(false);\n rowValue = rowValue || {};\n for (var i = result.length; i < this.rowCount; i++) {\n result.push(this.getUnbindValue(rowValue));\n }\n return result;\n };\n QuestionMatrixDynamicModel.prototype.deleteRowValue = function (newValue, row) {\n var isEmpty = true;\n for (var i = 0; i < newValue.length; i++) {\n if (this.isObject(newValue[i]) && Object.keys(newValue[i]).length > 0) {\n isEmpty = false;\n break;\n }\n }\n return isEmpty ? null : newValue;\n };\n QuestionMatrixDynamicModel.prototype.getRowValueByIndex = function (questionValue, index) {\n return Array.isArray(questionValue) &&\n index >= 0 &&\n index < questionValue.length\n ? questionValue[index]\n : null;\n };\n QuestionMatrixDynamicModel.prototype.getRowValueCore = function (row, questionValue, create) {\n if (create === void 0) { create = false; }\n if (!this.generatedVisibleRows)\n return {};\n var res = this.getRowValueByIndex(questionValue, this.generatedVisibleRows.indexOf(row));\n if (!res && create)\n res = {};\n return res;\n };\n return QuestionMatrixDynamicModel;\n}(_question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownModelBase\"]));\n\nvar QuestionMatrixDynamicRenderedTable = /** @class */ (function (_super) {\n __extends(QuestionMatrixDynamicRenderedTable, _super);\n function QuestionMatrixDynamicRenderedTable() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n QuestionMatrixDynamicRenderedTable.prototype.setDefaultRowActions = function (row, actions) {\n _super.prototype.setDefaultRowActions.call(this, row, actions);\n if (this.matrix.allowRowsDragAndDrop) {\n actions.push(new _actions_action__WEBPACK_IMPORTED_MODULE_9__[\"Action\"]({\n id: \"drag-row\",\n location: \"start\",\n component: \"sv-matrix-drag-drop-icon\",\n data: { row: row, question: this.matrix },\n }));\n }\n };\n return QuestionMatrixDynamicRenderedTable;\n}(_question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownRenderedTable\"]));\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"matrixdynamic\", [\n { name: \"rowsVisibleIf:condition\", visible: false },\n { name: \"allowAddRows:boolean\", default: true },\n { name: \"allowRemoveRows:boolean\", default: true },\n { name: \"rowCount:number\", default: 2, minValue: 0, isBindable: true },\n { name: \"minRowCount:number\", default: 0, minValue: 0 },\n {\n name: \"maxRowCount:number\",\n default: _settings__WEBPACK_IMPORTED_MODULE_6__[\"settings\"].matrixMaximumRowCount,\n },\n { name: \"keyName\" },\n \"defaultRowValue:rowvalue\",\n \"defaultValueFromLastRow:boolean\",\n { name: \"confirmDelete:boolean\" },\n {\n name: \"confirmDeleteText\",\n dependsOn: \"confirmDelete\",\n visibleIf: function (obj) {\n return !obj || obj.confirmDelete;\n },\n serializationProperty: \"locConfirmDeleteText\",\n },\n {\n name: \"addRowLocation\",\n default: \"default\",\n choices: [\"default\", \"top\", \"bottom\", \"topBottom\"],\n },\n { name: \"addRowText\", serializationProperty: \"locAddRowText\" },\n { name: \"removeRowText\", serializationProperty: \"locRemoveRowText\" },\n \"hideColumnsIfEmpty:boolean\",\n {\n name: \"emptyRowsText:text\",\n serializationProperty: \"locEmptyRowsText\",\n dependsOn: \"hideColumnsIfEmpty\",\n visibleIf: function (obj) {\n return !obj || obj.hideColumnsIfEmpty;\n },\n },\n {\n name: \"detailPanelShowOnAdding:boolean\",\n dependsOn: \"detailPanelMode\",\n visibleIf: function (obj) {\n return obj.detailPanelMode !== \"none\";\n },\n },\n {\n name: \"allowRowsDragAndDrop\",\n default: false,\n visible: true,\n isSerializable: false,\n },\n], function () {\n return new QuestionMatrixDynamicModel(\"\");\n}, \"matrixdropdownbase\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_2__[\"QuestionFactory\"].Instance.registerQuestion(\"matrixdynamic\", function (name) {\n var q = new QuestionMatrixDynamicModel(name);\n q.choices = [1, 2, 3, 4, 5];\n _question_matrixdropdownbase__WEBPACK_IMPORTED_MODULE_0__[\"QuestionMatrixDropdownModelBase\"].addDefaultColumns(q);\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_multipletext.ts\":\n/*!**************************************!*\\\n !*** ./src/question_multipletext.ts ***!\n \\**************************************/\n/*! exports provided: MultipleTextItemModel, QuestionMultipleTextModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"MultipleTextItemModel\", function() { return MultipleTextItemModel; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionMultipleTextModel\", function() { return QuestionMultipleTextModel; });\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./survey-element */ \"./src/survey-element.ts\");\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _question_text__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./question_text */ \"./src/question_text.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\nvar MultipleTextItemModel = /** @class */ (function (_super) {\n __extends(MultipleTextItemModel, _super);\n function MultipleTextItemModel(name, title) {\n if (name === void 0) { name = null; }\n if (title === void 0) { title = null; }\n var _this = _super.call(this) || this;\n _this.editorValue = _this.createEditor(name);\n _this.editor.questionTitleTemplateCallback = function () {\n return \"\";\n };\n _this.editor.titleLocation = \"left\";\n if (title) {\n _this.title = title;\n }\n return _this;\n }\n MultipleTextItemModel.prototype.getType = function () {\n return \"multipletextitem\";\n };\n Object.defineProperty(MultipleTextItemModel.prototype, \"id\", {\n get: function () {\n return this.editor.id;\n },\n enumerable: false,\n configurable: true\n });\n MultipleTextItemModel.prototype.getOriginalObj = function () {\n return this.editor;\n };\n Object.defineProperty(MultipleTextItemModel.prototype, \"name\", {\n /**\n * The item name.\n */\n get: function () {\n return this.editor.name;\n },\n set: function (val) {\n this.editor.name = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"question\", {\n get: function () {\n return this.data;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"editor\", {\n get: function () {\n return this.editorValue;\n },\n enumerable: false,\n configurable: true\n });\n MultipleTextItemModel.prototype.createEditor = function (name) {\n return new _question_text__WEBPACK_IMPORTED_MODULE_3__[\"QuestionTextModel\"](name);\n };\n MultipleTextItemModel.prototype.addUsedLocales = function (locales) {\n _super.prototype.addUsedLocales.call(this, locales);\n this.editor.addUsedLocales(locales);\n };\n MultipleTextItemModel.prototype.locStrsChanged = function () {\n _super.prototype.locStrsChanged.call(this);\n this.editor.locStrsChanged();\n };\n MultipleTextItemModel.prototype.setData = function (data) {\n this.data = data;\n if (!!data) {\n this.editor.defaultValue = data.getItemDefaultValue(this.name);\n this.editor.setSurveyImpl(this);\n this.editor.parent = data;\n }\n };\n Object.defineProperty(MultipleTextItemModel.prototype, \"isRequired\", {\n /**\n * Set this property to true, to make the item a required. If a user doesn't fill the item then a validation error will be generated.\n */\n get: function () {\n return this.editor.isRequired;\n },\n set: function (val) {\n this.editor.isRequired = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"inputType\", {\n /**\n * Use this property to change the default input type.\n */\n get: function () {\n return this.editor.inputType;\n },\n set: function (val) {\n this.editor.inputType = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"title\", {\n /**\n * Item title. If it is empty, the item name is rendered as title. This property supports markdown.\n * @see name\n */\n get: function () {\n return this.editor.title;\n },\n set: function (val) {\n this.editor.title = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"locTitle\", {\n get: function () {\n return this.editor.locTitle;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"fullTitle\", {\n /**\n * Returns the text or html for rendering the title.\n */\n get: function () {\n return this.editor.fullTitle;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"maxLength\", {\n /**\n * The maximum text length. If it is -1, defaul value, then the survey maxTextLength property will be used.\n * If it is 0, then the value is unlimited\n * @see SurveyModel.maxTextLength\n */\n get: function () {\n return this.editor.maxLength;\n },\n set: function (val) {\n this.editor.maxLength = val;\n },\n enumerable: false,\n configurable: true\n });\n MultipleTextItemModel.prototype.getMaxLength = function () {\n var survey = this.getSurvey();\n return _helpers__WEBPACK_IMPORTED_MODULE_6__[\"Helpers\"].getMaxLength(this.maxLength, survey ? survey.maxTextLength : -1);\n };\n Object.defineProperty(MultipleTextItemModel.prototype, \"placeHolder\", {\n /**\n * The input place holder.\n */\n get: function () {\n return this.editor.placeHolder;\n },\n set: function (val) {\n this.editor.placeHolder = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"locPlaceHolder\", {\n get: function () {\n return this.editor.locPlaceHolder;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"requiredErrorText\", {\n /**\n * The custom text that will be shown on required error. Use this property, if you do not want to show the default text.\n */\n get: function () {\n return this.editor.requiredErrorText;\n },\n set: function (val) {\n this.editor.requiredErrorText = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"locRequiredErrorText\", {\n get: function () {\n return this.editor.locRequiredErrorText;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"size\", {\n /**\n * The input size.\n */\n get: function () {\n return this.editor.size;\n },\n set: function (val) {\n this.editor.size = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(MultipleTextItemModel.prototype, \"validators\", {\n /**\n * The list of question validators.\n */\n get: function () {\n return this.editor.validators;\n },\n set: function (val) {\n this.editor.validators = val;\n },\n enumerable: false,\n configurable: true\n });\n MultipleTextItemModel.prototype.getValidators = function () {\n return this.validators;\n };\n Object.defineProperty(MultipleTextItemModel.prototype, \"value\", {\n /**\n * The item value.\n */\n get: function () {\n return this.data ? this.data.getMultipleTextValue(this.name) : null;\n },\n set: function (value) {\n if (this.data != null) {\n this.data.setMultipleTextValue(this.name, value);\n }\n },\n enumerable: false,\n configurable: true\n });\n MultipleTextItemModel.prototype.isEmpty = function () {\n return this.editor.isEmpty();\n };\n MultipleTextItemModel.prototype.onValueChanged = function (newValue) {\n if (this.valueChangedCallback)\n this.valueChangedCallback(newValue);\n };\n //ISurveyImpl\n MultipleTextItemModel.prototype.getSurveyData = function () {\n return this;\n };\n MultipleTextItemModel.prototype.getSurvey = function () {\n return this.data ? this.data.getSurvey() : null;\n };\n MultipleTextItemModel.prototype.getTextProcessor = function () {\n return this.data ? this.data.getTextProcessor() : null;\n };\n //ISurveyData\n MultipleTextItemModel.prototype.getValue = function (name) {\n if (!this.data)\n return null;\n return this.data.getMultipleTextValue(name);\n };\n MultipleTextItemModel.prototype.setValue = function (name, value) {\n if (this.data) {\n this.data.setMultipleTextValue(name, value);\n }\n };\n MultipleTextItemModel.prototype.getVariable = function (name) {\n return undefined;\n };\n MultipleTextItemModel.prototype.setVariable = function (name, newValue) { };\n MultipleTextItemModel.prototype.getComment = function (name) {\n return null;\n };\n MultipleTextItemModel.prototype.setComment = function (name, newValue) { };\n MultipleTextItemModel.prototype.getAllValues = function () {\n if (this.data)\n return this.data.getAllValues();\n return this.value;\n };\n MultipleTextItemModel.prototype.getFilteredValues = function () {\n return this.getAllValues();\n };\n MultipleTextItemModel.prototype.getFilteredProperties = function () {\n return { survey: this.getSurvey() };\n };\n //IValidatorOwner\n MultipleTextItemModel.prototype.getValidatorTitle = function () {\n return this.title;\n };\n Object.defineProperty(MultipleTextItemModel.prototype, \"validatedValue\", {\n get: function () {\n return this.value;\n },\n set: function (val) {\n this.value = val;\n },\n enumerable: false,\n configurable: true\n });\n MultipleTextItemModel.prototype.getDataFilteredValues = function () {\n return this.getFilteredValues();\n };\n MultipleTextItemModel.prototype.getDataFilteredProperties = function () {\n return this.getFilteredProperties();\n };\n return MultipleTextItemModel;\n}(_base__WEBPACK_IMPORTED_MODULE_0__[\"Base\"]));\n\n/**\n * A Model for a multiple text question.\n */\nvar QuestionMultipleTextModel = /** @class */ (function (_super) {\n __extends(QuestionMultipleTextModel, _super);\n function QuestionMultipleTextModel(name) {\n var _this = _super.call(this, name) || this;\n _this.isMultipleItemValueChanging = false;\n _this.createNewArray(\"items\", function (item) {\n item.setData(_this);\n });\n _this.registerFunctionOnPropertyValueChanged(\"items\", function () {\n _this.fireCallback(_this.colCountChangedCallback);\n });\n _this.registerFunctionOnPropertyValueChanged(\"colCount\", function () {\n _this.fireCallback(_this.colCountChangedCallback);\n });\n _this.registerFunctionOnPropertyValueChanged(\"itemSize\", function () {\n _this.updateItemsSize();\n });\n return _this;\n }\n QuestionMultipleTextModel.addDefaultItems = function (question) {\n var names = _questionfactory__WEBPACK_IMPORTED_MODULE_5__[\"QuestionFactory\"].DefaultMutlipleTextItems;\n for (var i = 0; i < names.length; i++)\n question.addItem(names[i]);\n };\n QuestionMultipleTextModel.prototype.getType = function () {\n return \"multipletext\";\n };\n QuestionMultipleTextModel.prototype.setSurveyImpl = function (value) {\n _super.prototype.setSurveyImpl.call(this, value);\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].setData(this);\n }\n };\n Object.defineProperty(QuestionMultipleTextModel.prototype, \"isAllowTitleLeft\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMultipleTextModel.prototype, \"hasSingleInput\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionMultipleTextModel.prototype.onSurveyLoad = function () {\n this.editorsOnSurveyLoad();\n _super.prototype.onSurveyLoad.call(this);\n this.fireCallback(this.colCountChangedCallback);\n };\n QuestionMultipleTextModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) {\n if (updateIsAnswered === void 0) { updateIsAnswered = true; }\n _super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);\n this.performForEveryEditor(function (item) {\n item.editor.updateValueFromSurvey(item.value);\n });\n this.updateIsAnswered();\n };\n QuestionMultipleTextModel.prototype.onSurveyValueChanged = function (newValue) {\n _super.prototype.onSurveyValueChanged.call(this, newValue);\n this.performForEveryEditor(function (item) {\n item.editor.onSurveyValueChanged(item.value);\n });\n };\n QuestionMultipleTextModel.prototype.updateItemsSize = function () {\n this.performForEveryEditor(function (item) {\n item.editor.updateInputSize();\n });\n };\n QuestionMultipleTextModel.prototype.editorsOnSurveyLoad = function () {\n this.performForEveryEditor(function (item) {\n item.editor.onSurveyLoad();\n });\n };\n QuestionMultipleTextModel.prototype.performForEveryEditor = function (func) {\n for (var i = 0; i < this.items.length; i++) {\n var item = this.items[i];\n if (item.editor) {\n func(item);\n }\n }\n };\n Object.defineProperty(QuestionMultipleTextModel.prototype, \"items\", {\n /**\n * The list of input items.\n */\n get: function () {\n return this.getPropertyValue(\"items\");\n },\n set: function (val) {\n this.setPropertyValue(\"items\", val);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Add a new text item.\n * @param name a item name\n * @param title a item title (optional)\n */\n QuestionMultipleTextModel.prototype.addItem = function (name, title) {\n if (title === void 0) { title = null; }\n var item = this.createTextItem(name, title);\n this.items.push(item);\n return item;\n };\n QuestionMultipleTextModel.prototype.getItemByName = function (name) {\n for (var i = 0; i < this.items.length; i++) {\n if (this.items[i].name == name)\n return this.items[i];\n }\n return null;\n };\n QuestionMultipleTextModel.prototype.addConditionObjectsByContext = function (objects, context) {\n for (var i = 0; i < this.items.length; i++) {\n var item = this.items[i];\n objects.push({\n name: this.getValueName() + \".\" + item.name,\n text: this.processedTitle + \".\" + item.fullTitle,\n question: this,\n });\n }\n };\n QuestionMultipleTextModel.prototype.getConditionJson = function (operator, path) {\n if (operator === void 0) { operator = null; }\n if (path === void 0) { path = null; }\n if (!path)\n return _super.prototype.getConditionJson.call(this);\n var item = this.getItemByName(path);\n if (!item)\n return null;\n var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_4__[\"JsonObject\"]().toJsonObject(item);\n json[\"type\"] = \"text\";\n return json;\n };\n QuestionMultipleTextModel.prototype.locStrsChanged = function () {\n _super.prototype.locStrsChanged.call(this);\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].locStrsChanged();\n }\n };\n QuestionMultipleTextModel.prototype.supportGoNextPageAutomatic = function () {\n for (var i = 0; i < this.items.length; i++) {\n if (this.items[i].isEmpty())\n return false;\n }\n return true;\n };\n Object.defineProperty(QuestionMultipleTextModel.prototype, \"colCount\", {\n /**\n * The number of columns. Items are rendred in one line if the value is 0.\n */\n get: function () {\n return this.getPropertyValue(\"colCount\");\n },\n set: function (val) {\n if (val < 1 || val > 5)\n return;\n this.setPropertyValue(\"colCount\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionMultipleTextModel.prototype, \"itemSize\", {\n /**\n * The default text input size.\n */\n get: function () {\n return this.getPropertyValue(\"itemSize\");\n },\n set: function (val) {\n this.setPropertyValue(\"itemSize\", val);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Returns the list of rendered rows.\n */\n QuestionMultipleTextModel.prototype.getRows = function () {\n var colCount = this.colCount;\n var items = this.items;\n var rows = [];\n var index = 0;\n for (var i = 0; i < items.length; i++) {\n if (index == 0) {\n rows.push([]);\n }\n rows[rows.length - 1].push(items[i]);\n index++;\n if (index >= colCount) {\n index = 0;\n }\n }\n return rows;\n };\n QuestionMultipleTextModel.prototype.onValueChanged = function () {\n _super.prototype.onValueChanged.call(this);\n this.onItemValueChanged();\n };\n QuestionMultipleTextModel.prototype.createTextItem = function (name, title) {\n return new MultipleTextItemModel(name, title);\n };\n QuestionMultipleTextModel.prototype.onItemValueChanged = function () {\n if (this.isMultipleItemValueChanging)\n return;\n for (var i = 0; i < this.items.length; i++) {\n var itemValue = null;\n if (this.value && this.items[i].name in this.value) {\n itemValue = this.value[this.items[i].name];\n }\n this.items[i].onValueChanged(itemValue);\n }\n };\n QuestionMultipleTextModel.prototype.getIsRunningValidators = function () {\n if (_super.prototype.getIsRunningValidators.call(this))\n return true;\n for (var i = 0; i < this.items.length; i++) {\n if (this.items[i].editor.isRunningValidators)\n return true;\n }\n return false;\n };\n QuestionMultipleTextModel.prototype.hasErrors = function (fireCallback, rec) {\n var _this = this;\n if (fireCallback === void 0) { fireCallback = true; }\n if (rec === void 0) { rec = null; }\n var res = false;\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].editor.onCompletedAsyncValidators = function (hasErrors) {\n _this.raiseOnCompletedAsyncValidators();\n };\n if (!!rec &&\n rec.isOnValueChanged === true &&\n this.items[i].editor.isEmpty())\n continue;\n res = this.items[i].editor.hasErrors(fireCallback, rec) || res;\n }\n return _super.prototype.hasErrors.call(this, fireCallback) || res;\n };\n QuestionMultipleTextModel.prototype.getAllErrors = function () {\n var result = _super.prototype.getAllErrors.call(this);\n for (var i = 0; i < this.items.length; i++) {\n var errors = this.items[i].editor.getAllErrors();\n if (errors && errors.length > 0) {\n result = result.concat(errors);\n }\n }\n return result;\n };\n QuestionMultipleTextModel.prototype.clearErrors = function () {\n _super.prototype.clearErrors.call(this);\n for (var i = 0; i < this.items.length; i++) {\n this.items[i].editor.clearErrors();\n }\n };\n QuestionMultipleTextModel.prototype.getContainsErrors = function () {\n var res = _super.prototype.getContainsErrors.call(this);\n if (res)\n return res;\n var items = this.items;\n for (var i = 0; i < items.length; i++) {\n if (items[i].editor.containsErrors)\n return true;\n }\n return false;\n };\n QuestionMultipleTextModel.prototype.getIsAnswered = function () {\n if (!_super.prototype.getIsAnswered.call(this))\n return false;\n for (var i = 0; i < this.items.length; i++) {\n var editor = this.items[i].editor;\n if (editor.isVisible && !editor.isAnswered)\n return false;\n }\n return true;\n };\n QuestionMultipleTextModel.prototype.getProgressInfo = function () {\n var elements = [];\n for (var i = 0; i < this.items.length; i++) {\n elements.push(this.items[i].editor);\n }\n return _survey_element__WEBPACK_IMPORTED_MODULE_1__[\"SurveyElement\"].getProgressInfoByElements(elements, this.isRequired);\n };\n QuestionMultipleTextModel.prototype.getDisplayValueCore = function (keysAsText, value) {\n if (!value)\n return value;\n var res = {};\n for (var i = 0; i < this.items.length; i++) {\n var item = this.items[i];\n var val = value[item.name];\n if (_helpers__WEBPACK_IMPORTED_MODULE_6__[\"Helpers\"].isValueEmpty(val))\n continue;\n var itemName = item.name;\n if (keysAsText && !!item.title) {\n itemName = item.title;\n }\n res[itemName] = item.editor.getDisplayValue(keysAsText, val);\n }\n return res;\n };\n //IMultipleTextData\n QuestionMultipleTextModel.prototype.getMultipleTextValue = function (name) {\n if (!this.value)\n return null;\n return this.value[name];\n };\n QuestionMultipleTextModel.prototype.setMultipleTextValue = function (name, value) {\n this.isMultipleItemValueChanging = true;\n if (this.isValueEmpty(value)) {\n value = undefined;\n }\n var newValue = this.value;\n if (!newValue) {\n newValue = {};\n }\n newValue[name] = value;\n this.setNewValue(newValue);\n this.isMultipleItemValueChanging = false;\n };\n QuestionMultipleTextModel.prototype.getItemDefaultValue = function (name) {\n return !!this.defaultValue ? this.defaultValue[name] : null;\n };\n QuestionMultipleTextModel.prototype.getTextProcessor = function () {\n return this.textProcessor;\n };\n QuestionMultipleTextModel.prototype.getAllValues = function () {\n return this.data ? this.data.getAllValues() : null;\n };\n QuestionMultipleTextModel.prototype.getIsRequiredText = function () {\n return this.survey ? this.survey.requiredText : \"\";\n };\n //IPanel\n QuestionMultipleTextModel.prototype.addElement = function (element, index) { };\n QuestionMultipleTextModel.prototype.removeElement = function (element) {\n return false;\n };\n QuestionMultipleTextModel.prototype.getQuestionTitleLocation = function () {\n return \"left\";\n };\n QuestionMultipleTextModel.prototype.getQuestionStartIndex = function () {\n return this.getStartIndex();\n };\n QuestionMultipleTextModel.prototype.getChildrenLayoutType = function () {\n return \"row\";\n };\n QuestionMultipleTextModel.prototype.elementWidthChanged = function (el) { };\n Object.defineProperty(QuestionMultipleTextModel.prototype, \"elements\", {\n get: function () {\n return [];\n },\n enumerable: false,\n configurable: true\n });\n QuestionMultipleTextModel.prototype.indexOf = function (el) {\n return -1;\n };\n QuestionMultipleTextModel.prototype.ensureRowsVisibility = function () {\n // do nothing\n };\n return QuestionMultipleTextModel;\n}(_question__WEBPACK_IMPORTED_MODULE_2__[\"Question\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_4__[\"Serializer\"].addClass(\"multipletextitem\", [\n \"name\",\n \"isRequired:boolean\",\n { name: \"placeHolder\", serializationProperty: \"locPlaceHolder\" },\n {\n name: \"inputType\",\n default: \"text\",\n choices: [\n \"color\",\n \"date\",\n \"datetime\",\n \"datetime-local\",\n \"email\",\n \"month\",\n \"number\",\n \"password\",\n \"range\",\n \"tel\",\n \"text\",\n \"time\",\n \"url\",\n \"week\",\n ],\n },\n { name: \"title\", serializationProperty: \"locTitle\" },\n { name: \"maxLength:number\", default: -1 },\n { name: \"size:number\", minValue: 0 },\n {\n name: \"requiredErrorText:text\",\n serializationProperty: \"locRequiredErrorText\",\n },\n {\n name: \"validators:validators\",\n baseClassName: \"surveyvalidator\",\n classNamePart: \"validator\",\n },\n], function () {\n return new MultipleTextItemModel(\"\");\n});\n_jsonobject__WEBPACK_IMPORTED_MODULE_4__[\"Serializer\"].addClass(\"multipletext\", [\n { name: \"!items:textitems\", className: \"multipletextitem\" },\n { name: \"itemSize:number\", minValue: 0 },\n { name: \"colCount:number\", default: 1, choices: [1, 2, 3, 4, 5] },\n], function () {\n return new QuestionMultipleTextModel(\"\");\n}, \"question\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_5__[\"QuestionFactory\"].Instance.registerQuestion(\"multipletext\", function (name) {\n var q = new QuestionMultipleTextModel(name);\n QuestionMultipleTextModel.addDefaultItems(q);\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_paneldynamic.ts\":\n/*!**************************************!*\\\n !*** ./src/question_paneldynamic.ts ***!\n \\**************************************/\n/*! exports provided: QuestionPanelDynamicItem, QuestionPanelDynamicTemplateSurveyImpl, QuestionPanelDynamicModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamicItem\", function() { return QuestionPanelDynamicItem; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamicTemplateSurveyImpl\", function() { return QuestionPanelDynamicTemplateSurveyImpl; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionPanelDynamicModel\", function() { return QuestionPanelDynamicModel; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./survey-element */ \"./src/survey-element.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _textPreProcessor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./textPreProcessor */ \"./src/textPreProcessor.ts\");\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\n/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/utils */ \"./src/utils/utils.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __spreadArray = (undefined && undefined.__spreadArray) || function (to, from) {\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n to[j] = from[i];\n return to;\n};\n\n\n\n\n\n\n\n\n\n\nvar QuestionPanelDynamicItemTextProcessor = /** @class */ (function (_super) {\n __extends(QuestionPanelDynamicItemTextProcessor, _super);\n function QuestionPanelDynamicItemTextProcessor(data, panelItem, variableName) {\n var _this = _super.call(this, variableName) || this;\n _this.data = data;\n _this.panelItem = panelItem;\n _this.variableName = variableName;\n return _this;\n }\n Object.defineProperty(QuestionPanelDynamicItemTextProcessor.prototype, \"survey\", {\n get: function () {\n return this.panelItem.getSurvey();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicItemTextProcessor.prototype, \"panel\", {\n get: function () {\n return this.panelItem.panel;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicItemTextProcessor.prototype, \"panelIndex\", {\n get: function () {\n return !!this.data ? this.data.getItemIndex(this.panelItem) : -1;\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicItemTextProcessor.prototype.getValues = function () {\n return this.panelItem.getAllValues();\n };\n QuestionPanelDynamicItemTextProcessor.prototype.getQuestionByName = function (name) {\n var res = _super.prototype.getQuestionByName.call(this, name);\n if (!!res)\n return res;\n var index = this.panelIndex;\n return index > -1\n ? this.data.getSharedQuestionFromArray(name, index)\n : null;\n };\n QuestionPanelDynamicItemTextProcessor.prototype.onCustomProcessText = function (textValue) {\n if (textValue.name == QuestionPanelDynamicItem.IndexVariableName) {\n var index = this.panelIndex;\n if (index > -1) {\n textValue.isExists = true;\n textValue.value = index + 1;\n return true;\n }\n }\n if (textValue.name.indexOf(QuestionPanelDynamicItem.ParentItemVariableName + \".\") == 0) {\n var q = this.data;\n if (!!q && !!q.parentQuestion && !!q.parent) {\n var data = q.parent.data;\n var processor = new QuestionPanelDynamicItemTextProcessor(q.parentQuestion, data, QuestionPanelDynamicItem.ItemVariableName);\n var text = textValue.name.replace(QuestionPanelDynamicItem.ParentItemVariableName, QuestionPanelDynamicItem.ItemVariableName);\n var res = processor.processValue(text, textValue.returnDisplayValue);\n textValue.isExists = res.isExists;\n textValue.value = res.value;\n }\n return true;\n }\n return false;\n };\n return QuestionPanelDynamicItemTextProcessor;\n}(_textPreProcessor__WEBPACK_IMPORTED_MODULE_3__[\"QuestionTextProcessor\"]));\nvar QuestionPanelDynamicItem = /** @class */ (function () {\n function QuestionPanelDynamicItem(data, panel) {\n this.data = data;\n this.panelValue = panel;\n this.textPreProcessor = new QuestionPanelDynamicItemTextProcessor(data, this, QuestionPanelDynamicItem.ItemVariableName);\n this.setSurveyImpl();\n }\n Object.defineProperty(QuestionPanelDynamicItem.prototype, \"panel\", {\n get: function () {\n return this.panelValue;\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicItem.prototype.setSurveyImpl = function () {\n this.panel.setSurveyImpl(this);\n };\n QuestionPanelDynamicItem.prototype.getValue = function (name) {\n var values = this.getAllValues();\n return values[name];\n };\n QuestionPanelDynamicItem.prototype.setValue = function (name, newValue) {\n this.data.setPanelItemData(this, name, newValue);\n };\n QuestionPanelDynamicItem.prototype.getVariable = function (name) {\n return undefined;\n };\n QuestionPanelDynamicItem.prototype.setVariable = function (name, newValue) { };\n QuestionPanelDynamicItem.prototype.getComment = function (name) {\n var result = this.getValue(name + _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].commentPrefix);\n return result ? result : \"\";\n };\n QuestionPanelDynamicItem.prototype.setComment = function (name, newValue, locNotification) {\n this.setValue(name + _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].commentPrefix, newValue);\n };\n QuestionPanelDynamicItem.prototype.getAllValues = function () {\n return this.data.getPanelItemData(this);\n };\n QuestionPanelDynamicItem.prototype.getFilteredValues = function () {\n var values = {};\n var surveyValues = !!this.data && !!this.data.getRootData()\n ? this.data.getRootData().getFilteredValues()\n : {};\n for (var key in surveyValues) {\n values[key] = surveyValues[key];\n }\n values[QuestionPanelDynamicItem.ItemVariableName] = this.getAllValues();\n if (!!this.data) {\n values[QuestionPanelDynamicItem.IndexVariableName.toLowerCase()] = this.data.getItemIndex(this);\n }\n return values;\n };\n QuestionPanelDynamicItem.prototype.getFilteredProperties = function () {\n if (!!this.data && !!this.data.getRootData())\n return this.data.getRootData().getFilteredProperties();\n return { survey: this.getSurvey() };\n };\n QuestionPanelDynamicItem.prototype.getSurveyData = function () {\n return this;\n };\n QuestionPanelDynamicItem.prototype.getSurvey = function () {\n return this.data ? this.data.getSurvey() : null;\n };\n QuestionPanelDynamicItem.prototype.getTextProcessor = function () {\n return this.textPreProcessor;\n };\n QuestionPanelDynamicItem.ItemVariableName = \"panel\";\n QuestionPanelDynamicItem.ParentItemVariableName = \"parentPanel\";\n QuestionPanelDynamicItem.IndexVariableName = \"panelIndex\";\n return QuestionPanelDynamicItem;\n}());\n\nvar QuestionPanelDynamicTemplateSurveyImpl = /** @class */ (function () {\n function QuestionPanelDynamicTemplateSurveyImpl(data) {\n this.data = data;\n }\n QuestionPanelDynamicTemplateSurveyImpl.prototype.getSurveyData = function () {\n return null;\n };\n QuestionPanelDynamicTemplateSurveyImpl.prototype.getSurvey = function () {\n return this.data.getSurvey();\n };\n QuestionPanelDynamicTemplateSurveyImpl.prototype.getTextProcessor = function () {\n return null;\n };\n return QuestionPanelDynamicTemplateSurveyImpl;\n}());\n\n/**\n * A Model for a panel dymanic question. You setup the template panel, but adding elements (any question or a panel) and assign a text to it's title, and this panel will be used as a template on creating dynamic panels. The number of panels is defined by panelCount property.\n * An end-user may dynamically add/remove panels, unless you forbidden this.\n */\nvar QuestionPanelDynamicModel = /** @class */ (function (_super) {\n __extends(QuestionPanelDynamicModel, _super);\n function QuestionPanelDynamicModel(name) {\n var _this = _super.call(this, name) || this;\n _this.loadingPanelCount = 0;\n _this.currentIndexValue = -1;\n _this.isAddingNewPanels = false;\n _this.createNewArray(\"panels\");\n _this.templateValue = _this.createAndSetupNewPanelObject();\n _this.template.renderWidth = \"100%\";\n _this.template.selectedElementInDesign = _this;\n var self = _this;\n _this.template.addElementCallback = function (element) {\n self.addOnPropertyChangedCallback(element);\n self.rebuildPanels();\n };\n _this.template.removeElementCallback = function (element) {\n self.rebuildPanels();\n };\n _this.createLocalizableString(\"confirmDeleteText\", _this);\n _this.createLocalizableString(\"keyDuplicationError\", _this);\n _this.createLocalizableString(\"panelAddText\", _this);\n _this.createLocalizableString(\"panelRemoveText\", _this);\n _this.createLocalizableString(\"panelPrevText\", _this);\n _this.createLocalizableString(\"panelNextText\", _this);\n _this.registerFunctionOnPropertyValueChanged(\"panelsState\", function () {\n self.setPanelsState();\n });\n return _this;\n }\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"hasSingleInput\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicModel.prototype.setSurveyImpl = function (value) {\n _super.prototype.setSurveyImpl.call(this, value);\n this.setTemplatePanelSurveyImpl();\n this.setPanelsSurveyImpl();\n };\n QuestionPanelDynamicModel.prototype.assignOnPropertyChangedToTemplate = function () {\n var elements = this.template.elements;\n for (var i = 0; i < elements.length; i++) {\n this.addOnPropertyChangedCallback(elements[i]);\n }\n };\n QuestionPanelDynamicModel.prototype.addOnPropertyChangedCallback = function (element) {\n var self = this;\n element.onPropertyChanged.add(function (element, options) {\n self.onTemplateElementPropertyChanged(element, options);\n });\n if (element.isPanel) {\n element.addElementCallback = function (element) {\n self.addOnPropertyChangedCallback(element);\n };\n }\n };\n QuestionPanelDynamicModel.prototype.onTemplateElementPropertyChanged = function (element, options) {\n if (this.isLoadingFromJson || this.isDesignMode || this.panels.length == 0)\n return;\n var property = _jsonobject__WEBPACK_IMPORTED_MODULE_5__[\"Serializer\"].findProperty(element.getType(), options.name);\n if (!property)\n return;\n var panels = this.panels;\n for (var i = 0; i < panels.length; i++) {\n var question = panels[i].getQuestionByName(element.name);\n if (!!question && question[options.name] !== options.newValue) {\n question[options.name] = options.newValue;\n }\n }\n };\n QuestionPanelDynamicModel.prototype.getType = function () {\n return \"paneldynamic\";\n };\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"isCompositeQuestion\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicModel.prototype.clearOnDeletingContainer = function () {\n this.panels.forEach(function (panel) {\n panel.clearOnDeletingContainer();\n });\n };\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"isAllowTitleLeft\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicModel.prototype.removeElement = function (element) {\n return this.template.removeElement(element);\n };\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"template\", {\n /**\n * The template Panel. This panel is used as a template on creatign dynamic panels\n * @see templateElements\n * @see templateTitle\n * @see panelCount\n */\n get: function () {\n return this.templateValue;\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicModel.prototype.getPanel = function () {\n return this.template;\n };\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"templateElements\", {\n /**\n * The template Panel elements, questions and panels.\n * @see templateElements\n * @see template\n * @see panelCount\n */\n get: function () {\n return this.template.elements;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"templateTitle\", {\n /**\n * The template Panel title property.\n * @see templateElements\n * @see template\n * @see panelCount\n */\n get: function () {\n return this.template.title;\n },\n set: function (newValue) {\n this.template.title = newValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"locTemplateTitle\", {\n get: function () {\n return this.template.locTitle;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"templateDescription\", {\n /**\n * The template Panel description property.\n * @see templateElements\n * @see template\n * @see panelCount\n * @see templateTitle\n */\n get: function () {\n return this.template.description;\n },\n set: function (newValue) {\n this.template.description = newValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"locTemplateDescription\", {\n get: function () {\n return this.template.locDescription;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"items\", {\n get: function () {\n var res = [];\n for (var i = 0; i < this.panels.length; i++) {\n res.push(this.panels[i].data);\n }\n return res;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"panels\", {\n /**\n * The array of dynamic panels created based on panel template\n * @see template\n * @see panelCount\n */\n get: function () {\n return this.getPropertyValue(\"panels\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"currentIndex\", {\n /**\n * The index of current active dynamical panel when the renderMode is not \"list\". If there is no dymamic panel (panelCount = 0) or renderMode equals \"list\" it returns -1, otherwise it returns a value from 0 to panelCount - 1.\n * @see currentPanel\n * @see panels\n * @see panelCount\n * @see renderMode\n */\n get: function () {\n if (this.isRenderModeList)\n return -1;\n if (this.isDesignMode)\n return 0;\n if (this.currentIndexValue < 0 && this.panelCount > 0) {\n this.currentIndexValue = 0;\n }\n if (this.currentIndexValue >= this.panelCount) {\n this.currentIndexValue = this.panelCount - 1;\n }\n return this.currentIndexValue;\n },\n set: function (val) {\n if (this.currentIndexValue !== val) {\n if (val >= this.panelCount)\n val = this.panelCount - 1;\n this.currentIndexValue = val;\n this.fireCallback(this.currentIndexChangedCallback);\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"currentPanel\", {\n /**\n * The current active dynamical panel when the renderMode is not \"list\". If there is no dymamic panel (panelCount = 0) or renderMode equals \"list\" it returns null.\n * @see currenIndex\n * @see panels\n * @see panelCount\n * @see renderMode\n */\n get: function () {\n var index = this.currentIndex;\n if (index < 0 || index >= this.panels.length)\n return null;\n return this.panels[index];\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"confirmDelete\", {\n /**\n * Set it to true, to show a confirmation dialog on removing a panel\n * @see ConfirmDeleteText\n */\n get: function () {\n return this.getPropertyValue(\"confirmDelete\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"confirmDelete\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"keyName\", {\n /**\n * Set it to a question name used in the template panel and the library shows duplication error, if there are same values in different panels of this question.\n * @see keyDuplicationError\n */\n get: function () {\n return this.getPropertyValue(\"keyName\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"keyName\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"confirmDeleteText\", {\n /**\n * Use this property to change the default text showing in the confirmation delete dialog on removing a panel.\n */\n get: function () {\n return this.getLocalizableStringText(\"confirmDeleteText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"confirmDelete\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"confirmDeleteText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"locConfirmDeleteText\", {\n get: function () {\n return this.getLocalizableString(\"confirmDeleteText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"keyDuplicationError\", {\n /**\n * The duplication value error text. Set it to show the text different from the default.\n * @see keyName\n */\n get: function () {\n return this.getLocalizableStringText(\"keyDuplicationError\", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"keyDuplicationError\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"keyDuplicationError\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"locKeyDuplicationError\", {\n get: function () {\n return this.getLocalizableString(\"keyDuplicationError\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"panelPrevText\", {\n /**\n * Use this property to change the default previous button text. Previous button shows the previous panel, change the currentPanel, when the renderMode doesn't equal to \"list\".\n * @see currentPanel\n * @see currentIndex\n * @see renderMode\n */\n get: function () {\n return this.getLocalizableStringText(\"panelPrevText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"pagePrevText\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"panelPrevText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"locPanelPrevText\", {\n get: function () {\n return this.getLocalizableString(\"panelPrevText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"panelNextText\", {\n /**\n * Use this property to change the default next button text. Next button shows the next panel, change the currentPanel, when the renderMode doesn't equal to \"list\".\n * @see currentPanel\n * @see currentIndex\n * @see renderMode\n */\n get: function () {\n return this.getLocalizableStringText(\"panelNextText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"pageNextText\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"panelNextText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"locPanelNextText\", {\n get: function () {\n return this.getLocalizableString(\"panelNextText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"panelAddText\", {\n /**\n * Use this property to change the default value of add panel button text.\n */\n get: function () {\n return this.getLocalizableStringText(\"panelAddText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"addPanel\"));\n },\n set: function (value) {\n this.setLocalizableStringText(\"panelAddText\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"locPanelAddText\", {\n get: function () {\n return this.getLocalizableString(\"panelAddText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"panelRemoveText\", {\n /**\n * Use this property to change the default value of remove panel button text.\n */\n get: function () {\n return this.getLocalizableStringText(\"panelRemoveText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"removePanel\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"panelRemoveText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"locPanelRemoveText\", {\n get: function () {\n return this.getLocalizableString(\"panelRemoveText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"isProgressTopShowing\", {\n /**\n * Returns true when the renderMode equals to \"progressTop\" or \"progressTopBottom\"\n */\n get: function () {\n return (this.renderMode == \"progressTop\" || this.renderMode == \"progressTopBottom\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"isProgressBottomShowing\", {\n /**\n * Returns true when the renderMode equals to \"progressBottom\" or \"progressTopBottom\"\n */\n get: function () {\n return (this.renderMode == \"progressBottom\" ||\n this.renderMode == \"progressTopBottom\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"isPrevButtonShowing\", {\n /**\n * Returns true when currentIndex is more than 0.\n * @see currenIndex\n * @see currenPanel\n */\n get: function () {\n return this.currentIndex > 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"isNextButtonShowing\", {\n /**\n * Returns true when currentIndex is more than or equal 0 and less than panelCount - 1.\n * @see currenIndex\n * @see currenPanel\n * @see panelCount\n */\n get: function () {\n return this.currentIndex >= 0 && this.currentIndex < this.panelCount - 1;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"isRangeShowing\", {\n /**\n * Returns true when showRangeInProgress equals to true, renderMode doesn't equal to \"list\" and panelCount is >= 2.\n */\n get: function () {\n return (this.showRangeInProgress && this.currentIndex >= 0 && this.panelCount > 1);\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicModel.prototype.getElementsInDesign = function (includeHidden) {\n if (includeHidden === void 0) { includeHidden = false; }\n return includeHidden ? [this.template] : this.templateElements;\n };\n QuestionPanelDynamicModel.prototype.prepareValueForPanelCreating = function () {\n this.addingNewPanelsValue = this.value;\n this.isAddingNewPanels = true;\n this.isNewPanelsValueChanged = false;\n };\n QuestionPanelDynamicModel.prototype.setValueAfterPanelsCreating = function () {\n this.isAddingNewPanels = false;\n if (this.isNewPanelsValueChanged) {\n this.isValueChangingInternally = true;\n this.value = this.addingNewPanelsValue;\n this.isValueChangingInternally = false;\n }\n };\n QuestionPanelDynamicModel.prototype.getValueCore = function () {\n return this.isAddingNewPanels\n ? this.addingNewPanelsValue\n : _super.prototype.getValueCore.call(this);\n };\n QuestionPanelDynamicModel.prototype.setValueCore = function (newValue) {\n if (this.isAddingNewPanels) {\n this.isNewPanelsValueChanged = true;\n this.addingNewPanelsValue = newValue;\n }\n else {\n _super.prototype.setValueCore.call(this, newValue);\n }\n };\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"panelCount\", {\n /**\n * Use this property to get/set the number of dynamic panels.\n * @see template\n * @see minPanelCount\n * @see maxPanelCount\n * @see addPanel\n * @see removePanel\n * @see removePanelUI\n */\n get: function () {\n return this.isLoadingFromJson || this.isDesignMode\n ? this.loadingPanelCount\n : this.panels.length;\n },\n set: function (val) {\n if (val < 0)\n return;\n if (this.isLoadingFromJson || this.isDesignMode) {\n this.loadingPanelCount = val;\n return;\n }\n if (val == this.panels.length || this.isDesignMode)\n return;\n this.updateBindings(\"panelCount\", val);\n this.prepareValueForPanelCreating();\n for (var i = this.panelCount; i < val; i++) {\n var panel = this.createNewPanel();\n this.panels.push(panel);\n if (this.renderMode == \"list\" && this.panelsState != \"default\") {\n if (this.panelsState === \"expand\") {\n panel.expand();\n }\n else {\n if (!!panel.title) {\n panel.collapse();\n }\n }\n }\n }\n if (val < this.panelCount)\n this.panels.splice(val, this.panelCount - val);\n this.setValueAfterPanelsCreating();\n this.setValueBasedOnPanelCount();\n this.reRunCondition();\n this.fireCallback(this.panelCountChangedCallback);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"panelsState\", {\n /**\n * Use this property to allow the end-user to collapse/expand the panels. It works only if the renderMode property equals to \"list\" and templateTitle property is not empty. The following values are available:\n *
default - the default value. User can't collapse/expand panels\n *
expanded - User can collapse/expand panels and all panels are expanded by default\n *
collapsed - User can collapse/expand panels and all panels are collapsed by default\n *
firstExpanded - User can collapse/expand panels. The first panel is expanded and others are collapsed\n * @see renderMode\n * @see templateTitle\n */\n get: function () {\n return this.getPropertyValue(\"panelsState\");\n },\n set: function (val) {\n this.setPropertyValue(\"panelsState\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicModel.prototype.setTemplatePanelSurveyImpl = function () {\n this.template.setSurveyImpl(this.isDesignMode\n ? this.surveyImpl\n : new QuestionPanelDynamicTemplateSurveyImpl(this));\n };\n QuestionPanelDynamicModel.prototype.setPanelsSurveyImpl = function () {\n for (var i = 0; i < this.panels.length; i++) {\n var panel = this.panels[i];\n if (panel == this.template)\n continue;\n panel.setSurveyImpl(panel.data);\n }\n };\n QuestionPanelDynamicModel.prototype.setPanelsState = function () {\n if (this.isDesignMode || this.renderMode != \"list\" || !this.templateTitle)\n return;\n for (var i = 0; i < this.panels.length; i++) {\n var state = this.panelsState;\n if (state === \"firstExpanded\") {\n state = i === 0 ? \"expanded\" : \"collapsed\";\n }\n this.panels[i].state = state;\n }\n };\n QuestionPanelDynamicModel.prototype.setValueBasedOnPanelCount = function () {\n var value = this.value;\n if (!value || !Array.isArray(value))\n value = [];\n if (value.length == this.panelCount)\n return;\n for (var i = value.length; i < this.panelCount; i++)\n value.push({});\n if (value.length > this.panelCount) {\n value.splice(this.panelCount, value.length - this.panelCount);\n }\n this.isValueChangingInternally = true;\n this.value = value;\n this.isValueChangingInternally = false;\n };\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"minPanelCount\", {\n /**\n * The minimum panel count. A user could not delete a panel if the panelCount equals to minPanelCount\n * @see panelCount\n * @see maxPanelCount\n */\n get: function () {\n return this.getPropertyValue(\"minPanelCount\", 0);\n },\n set: function (val) {\n if (val < 0)\n val = 0;\n if (val == this.minPanelCount)\n return;\n this.setPropertyValue(\"minPanelCount\", val);\n if (val > this.maxPanelCount)\n this.maxPanelCount = val;\n if (this.panelCount < val)\n this.panelCount = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"maxPanelCount\", {\n /**\n * The maximum panel count. A user could not add a panel if the panelCount equals to maxPanelCount\n * @see panelCount\n * @see minPanelCount\n */\n get: function () {\n return this.getPropertyValue(\"maxPanelCount\", _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].panelMaximumPanelCount);\n },\n set: function (val) {\n if (val <= 0)\n return;\n if (val > _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].panelMaximumPanelCount)\n val = _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].panelMaximumPanelCount;\n if (val == this.maxPanelCount)\n return;\n this.setPropertyValue(\"maxPanelCount\", val);\n if (val < this.minPanelCount)\n this.minPanelCount = val;\n if (this.panelCount > val)\n this.panelCount = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"allowAddPanel\", {\n /**\n * Set this property to false to hide the 'Add New' button\n * @see allowRemovePanel\n */\n get: function () {\n return this.getPropertyValue(\"allowAddPanel\");\n },\n set: function (val) {\n this.setPropertyValue(\"allowAddPanel\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"allowRemovePanel\", {\n /**\n * Set this property to false to hide the 'Remove' button\n * @see allowAddPanel\n */\n get: function () {\n return this.getPropertyValue(\"allowRemovePanel\");\n },\n set: function (val) {\n this.setPropertyValue(\"allowRemovePanel\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"templateTitleLocation\", {\n /**\n * Set this property different from \"default\" to set the specific question title location for the template questions.\n * @see SurveyModel.questionTitleLocation\n * @see PanelModelBase.questionTitleLocation\n */\n get: function () {\n return this.getPropertyValue(\"templateTitleLocation\");\n },\n set: function (value) {\n this.setPropertyValue(\"templateTitleLocation\", value.toLowerCase());\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"showQuestionNumbers\", {\n /**\n * Use this property to show/hide the numbers in titles in questions inside a dynamic panel.\n * By default the value is \"off\". You may set it to \"onPanel\" and the first question inside a dynamic panel will start with 1 or \"onSurvey\" to include nested questions in dymamic panels into global survey question numbering.\n */\n get: function () {\n return this.getPropertyValue(\"showQuestionNumbers\");\n },\n set: function (val) {\n this.setPropertyValue(\"showQuestionNumbers\", val);\n if (!this.isLoadingFromJson && this.survey) {\n this.survey.questionVisibilityChanged(this, this.visible);\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"panelRemoveButtonLocation\", {\n /**\n * Use this property to change the location of the remove button relative to the panel.\n * By default the value is \"bottom\". You may set it to \"right\" and remove button will appear to the right of the panel.\n */\n get: function () {\n return this.getPropertyValue(\"panelRemoveButtonLocation\");\n },\n set: function (val) {\n this.setPropertyValue(\"panelRemoveButtonLocation\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"showRangeInProgress\", {\n /**\n * Shows the range from 1 to panelCount when renderMode doesn't equal to \"list\". Set to false to hide this element.\n * @see panelCount\n * @see renderMode\n */\n get: function () {\n return this.getPropertyValue(\"showRangeInProgress\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"showRangeInProgress\", val);\n this.fireCallback(this.currentIndexChangedCallback);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"renderMode\", {\n /**\n * By default the property equals to \"list\" and all dynamic panels are rendered one by one on the page. You may change it to: \"progressTop\", \"progressBottom\" or \"progressTopBottom\" to render only one dynamic panel at once. The progress and navigation elements can be rendred on top, bottom or both.\n */\n get: function () {\n return this.getPropertyValue(\"renderMode\");\n },\n set: function (val) {\n this.setPropertyValue(\"renderMode\", val);\n this.fireCallback(this.renderModeChangedCallback);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"isRenderModeList\", {\n /**\n * Returns true when renderMode equals to \"list\".\n * @see renderMode\n */\n get: function () {\n return this.renderMode == \"list\";\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicModel.prototype.setVisibleIndex = function (value) {\n if (!this.isVisible)\n return 0;\n var startIndex = this.showQuestionNumbers == \"onSurvey\" ? value : 0;\n for (var i = 0; i < this.panels.length; i++) {\n var counter = this.setPanelVisibleIndex(this.panels[i], startIndex, this.showQuestionNumbers != \"off\");\n if (this.showQuestionNumbers == \"onSurvey\") {\n startIndex += counter;\n }\n }\n _super.prototype.setVisibleIndex.call(this, this.showQuestionNumbers != \"onSurvey\" ? value : -1);\n return this.showQuestionNumbers != \"onSurvey\" ? 1 : startIndex - value;\n };\n QuestionPanelDynamicModel.prototype.setPanelVisibleIndex = function (panel, index, showIndex) {\n if (!showIndex) {\n panel.setVisibleIndex(-1);\n return 0;\n }\n return panel.setVisibleIndex(index);\n };\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"canAddPanel\", {\n /**\n * Returns true when an end user may add a new panel. The question is not read only and panelCount less than maxPanelCount\n * @see isReadOnly\n * @see panelCount\n * @see maxPanelCount\n */\n get: function () {\n if (this.survey && this.survey.isDesignMode)\n return false;\n return (this.allowAddPanel &&\n !this.isReadOnly &&\n this.panelCount < this.maxPanelCount);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"canRemovePanel\", {\n /**\n * Returns true when an end user may remove a panel. The question is not read only and panelCount is more than minPanelCount\n * @see isReadOnly\n * @see panelCount\n * @see minPanelCount\n */\n get: function () {\n if (this.survey && this.survey.isDesignMode)\n return false;\n return (this.allowRemovePanel &&\n !this.isReadOnly &&\n this.panelCount > this.minPanelCount);\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicModel.prototype.rebuildPanels = function () {\n var _a;\n if (this.isLoadingFromJson)\n return;\n this.prepareValueForPanelCreating();\n var panels = [];\n if (this.isDesignMode) {\n new QuestionPanelDynamicItem(this, this.template);\n panels.push(this.template);\n }\n else {\n for (var i = 0; i < this.panelCount; i++) {\n panels.push(this.createNewPanel());\n }\n }\n (_a = this.panels).splice.apply(_a, __spreadArray([0, this.panels.length], panels));\n this.setValueAfterPanelsCreating();\n this.setPanelsState();\n this.reRunCondition();\n this.fireCallback(this.panelCountChangedCallback);\n };\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"defaultPanelValue\", {\n /**\n * If it is not empty, then this value is set to every new panel, including panels created initially, unless the defaultValue is not empty\n * @see defaultValue\n * @see defaultValueFromLastRow\n */\n get: function () {\n return this.getPropertyValue(\"defaultPanelValue\");\n },\n set: function (val) {\n this.setPropertyValue(\"defaultPanelValue\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"defaultValueFromLastPanel\", {\n /**\n * Set it to true to copy the value into new added panel from the last panel. If defaultPanelValue is set and this property equals to true,\n * then the value for new added panel is merging.\n * @see defaultValue\n * @see defaultPanelValue\n */\n get: function () {\n return this.getPropertyValue(\"defaultValueFromLastPanel\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"defaultValueFromLastPanel\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicModel.prototype.isDefaultValueEmpty = function () {\n return (_super.prototype.isDefaultValueEmpty.call(this) && this.isValueEmpty(this.defaultPanelValue));\n };\n QuestionPanelDynamicModel.prototype.setDefaultValue = function () {\n if (this.isValueEmpty(this.defaultPanelValue) ||\n !this.isValueEmpty(this.defaultValue)) {\n _super.prototype.setDefaultValue.call(this);\n return;\n }\n if (!this.isEmpty() || this.panelCount == 0)\n return;\n var newValue = [];\n for (var i = 0; i < this.panelCount; i++) {\n newValue.push(this.defaultPanelValue);\n }\n this.value = newValue;\n };\n QuestionPanelDynamicModel.prototype.isEmpty = function () {\n var val = this.value;\n if (!val || !Array.isArray(val))\n return true;\n for (var i = 0; i < val.length; i++) {\n if (!this.isRowEmpty(val[i]))\n return false;\n }\n return true;\n };\n QuestionPanelDynamicModel.prototype.getProgressInfo = function () {\n return _survey_element__WEBPACK_IMPORTED_MODULE_1__[\"SurveyElement\"].getProgressInfoByElements(this.panels, this.isRequired);\n };\n QuestionPanelDynamicModel.prototype.isRowEmpty = function (val) {\n for (var prop in val) {\n if (val.hasOwnProperty(prop))\n return false;\n }\n return true;\n };\n /**\n * Add a new dynamic panel based on the template Panel. It checks if canAddPanel returns true and then calls addPanel method.\n * @see template\n * @see panelCount\n * @see panels\n * @see canAddPanel\n */\n QuestionPanelDynamicModel.prototype.addPanelUI = function () {\n if (!this.canAddPanel)\n return null;\n var newPanel = this.addPanel();\n if (this.renderMode === \"list\" && this.panelsState !== \"default\") {\n newPanel.expand();\n }\n return newPanel;\n };\n /**\n * Add a new dynamic panel based on the template Panel.\n * @see template\n * @see panelCount\n * @see panels\n */\n QuestionPanelDynamicModel.prototype.addPanel = function () {\n this.panelCount++;\n if (!this.isRenderModeList) {\n this.currentIndex = this.panelCount - 1;\n }\n var newValue = this.value;\n var hasModified = false;\n if (!this.isValueEmpty(this.defaultPanelValue)) {\n if (!!newValue &&\n Array.isArray(newValue) &&\n newValue.length == this.panelCount) {\n hasModified = true;\n this.copyValue(newValue[newValue.length - 1], this.defaultPanelValue);\n }\n }\n if (this.defaultValueFromLastPanel &&\n !!newValue &&\n Array.isArray(newValue) &&\n newValue.length > 1 &&\n newValue.length == this.panelCount) {\n hasModified = true;\n this.copyValue(newValue[newValue.length - 1], newValue[newValue.length - 2]);\n }\n if (hasModified) {\n this.value = newValue;\n }\n if (this.survey)\n this.survey.dynamicPanelAdded(this);\n return this.panels[this.panelCount - 1];\n };\n QuestionPanelDynamicModel.prototype.copyValue = function (src, dest) {\n for (var key in dest) {\n src[key] = dest[key];\n }\n };\n /**\n * Call removePanel function. Do nothing is canRemovePanel returns false. If confirmDelete set to true, it shows the confirmation dialog first.\n * @param value a panel or panel index\n * @see removePanel\n * @see confirmDelete\n * @see confirmDeleteText\n * @see canRemovePanel\n *\n */\n QuestionPanelDynamicModel.prototype.removePanelUI = function (value) {\n if (!this.canRemovePanel)\n return;\n if (!this.confirmDelete || Object(_utils_utils__WEBPACK_IMPORTED_MODULE_9__[\"confirmAction\"])(this.confirmDeleteText)) {\n this.removePanel(value);\n }\n };\n /**\n * Goes to the next panel in the PanelDynamic\n *\n */\n QuestionPanelDynamicModel.prototype.goToNextPanel = function () {\n if (this.renderMode !== \"list\" && this.currentPanel.hasErrors())\n return;\n this.currentIndex++;\n };\n /**\n * Goes to the previous panel in the PanelDynamic\n *\n */\n QuestionPanelDynamicModel.prototype.goToPrevPanel = function () {\n this.currentIndex--;\n };\n /**\n * Removes a dynamic panel from the panels array.\n * @param value a panel or panel index\n * @see panels\n * @see template\n */\n QuestionPanelDynamicModel.prototype.removePanel = function (value) {\n var index = this.getPanelIndex(value);\n if (index < 0 || index >= this.panelCount)\n return;\n var panel = this.panels[index];\n this.panels.splice(index, 1);\n this.updateBindings(\"panelCount\", this.panelCount);\n var value = this.value;\n if (!value || !Array.isArray(value) || index >= value.length)\n return;\n this.isValueChangingInternally = true;\n value.splice(index, 1);\n this.value = value;\n this.fireCallback(this.panelCountChangedCallback);\n if (this.survey)\n this.survey.dynamicPanelRemoved(this, index, panel);\n this.isValueChangingInternally = false;\n };\n QuestionPanelDynamicModel.prototype.getPanelIndex = function (val) {\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isNumber(val))\n return val;\n var items = this.items;\n for (var i = 0; i < this.panels.length; i++) {\n if (this.panels[i] === val || items[i] === val)\n return i;\n }\n return -1;\n };\n QuestionPanelDynamicModel.prototype.locStrsChanged = function () {\n _super.prototype.locStrsChanged.call(this);\n var panels = this.panels;\n for (var i = 0; i < panels.length; i++) {\n panels[i].locStrsChanged();\n }\n };\n QuestionPanelDynamicModel.prototype.clearIncorrectValues = function () {\n for (var i = 0; i < this.panels.length; i++) {\n this.clearIncorrectValuesInPanel(i);\n }\n };\n QuestionPanelDynamicModel.prototype.clearErrors = function () {\n _super.prototype.clearErrors.call(this);\n for (var i = 0; i < this.panels.length; i++) {\n this.panels[i].clearErrors();\n }\n };\n QuestionPanelDynamicModel.prototype.getQuestionFromArray = function (name, index) {\n if (index >= this.panelCount)\n return null;\n return this.panels[index].getQuestionByName(name);\n };\n QuestionPanelDynamicModel.prototype.clearIncorrectValuesInPanel = function (index) {\n var panel = this.panels[index];\n panel.clearIncorrectValues();\n var val = this.value;\n var values = !!val && index < val.length ? val[index] : null;\n if (!values)\n return;\n var isChanged = false;\n for (var key in values) {\n if (this.getSharedQuestionFromArray(key, index))\n continue;\n var q = panel.getQuestionByName(key);\n if (!!q)\n continue;\n if (this.iscorrectValueWithPostPrefix(panel, key, _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].commentPrefix) ||\n this.iscorrectValueWithPostPrefix(panel, key, _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].matrixTotalValuePostFix))\n continue;\n delete values[key];\n isChanged = true;\n }\n if (isChanged) {\n val[index] = values;\n this.value = val;\n }\n };\n QuestionPanelDynamicModel.prototype.iscorrectValueWithPostPrefix = function (panel, key, postPrefix) {\n if (key.indexOf(postPrefix) !== key.length - postPrefix.length)\n return false;\n return !!panel.getQuestionByName(key.substr(0, key.indexOf(postPrefix)));\n };\n QuestionPanelDynamicModel.prototype.getSharedQuestionFromArray = function (name, panelIndex) {\n return !!this.survey && !!this.valueName\n ? (this.survey.getQuestionByValueNameFromArray(this.valueName, name, panelIndex))\n : null;\n };\n QuestionPanelDynamicModel.prototype.addConditionObjectsByContext = function (objects, context) {\n var hasContext = !!context\n ? this.template.questions.indexOf(context) > -1\n : false;\n var prefixName = this.getValueName() + \"[0].\";\n var prefixText = this.processedTitle + \"[0].\";\n var panelObjs = new Array();\n var questions = this.template.questions;\n for (var i = 0; i < questions.length; i++) {\n questions[i].addConditionObjectsByContext(panelObjs, context);\n }\n for (var i = 0; i < panelObjs.length; i++) {\n objects.push({\n name: prefixName + panelObjs[i].name,\n text: prefixText + panelObjs[i].text,\n question: panelObjs[i].question,\n });\n }\n if (hasContext) {\n for (var i = 0; i < panelObjs.length; i++) {\n if (panelObjs[i].question == context)\n continue;\n objects.push({\n name: \"panel.\" + panelObjs[i].name,\n text: \"panel.\" + panelObjs[i].text,\n question: panelObjs[i].question,\n });\n }\n }\n };\n QuestionPanelDynamicModel.prototype.getConditionJson = function (operator, path) {\n if (operator === void 0) { operator = null; }\n if (path === void 0) { path = null; }\n if (!path)\n return _super.prototype.getConditionJson.call(this, operator, path);\n var questionName = path;\n var pos = path.indexOf(\".\");\n if (pos > -1) {\n questionName = path.substr(0, pos);\n path = path.substr(pos + 1);\n }\n var question = this.template.getQuestionByName(questionName);\n if (!question)\n return null;\n return question.getConditionJson(operator, path);\n };\n QuestionPanelDynamicModel.prototype.onReadOnlyChanged = function () {\n var readOnly = this.isReadOnly;\n this.template.readOnly = readOnly;\n for (var i = 0; i < this.panels.length; i++) {\n this.panels[i].readOnly = readOnly;\n }\n _super.prototype.onReadOnlyChanged.call(this);\n };\n QuestionPanelDynamicModel.prototype.onSurveyLoad = function () {\n this.template.readOnly = this.isReadOnly;\n this.template.onSurveyLoad();\n if (this.loadingPanelCount > 0) {\n this.panelCount = this.loadingPanelCount;\n }\n if (this.isDesignMode) {\n this.rebuildPanels();\n }\n this.setPanelsSurveyImpl();\n this.setPanelsState();\n this.assignOnPropertyChangedToTemplate();\n _super.prototype.onSurveyLoad.call(this);\n };\n QuestionPanelDynamicModel.prototype.onFirstRendering = function () {\n this.template.onFirstRendering();\n for (var i = 0; i < this.panels.length; i++) {\n this.panels[i].onFirstRendering();\n }\n _super.prototype.onFirstRendering.call(this);\n };\n QuestionPanelDynamicModel.prototype.runCondition = function (values, properties) {\n _super.prototype.runCondition.call(this, values, properties);\n this.runPanelsCondition(values, properties);\n };\n QuestionPanelDynamicModel.prototype.reRunCondition = function () {\n if (!this.data)\n return;\n this.runCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());\n };\n QuestionPanelDynamicModel.prototype.runPanelsCondition = function (values, properties) {\n var cachedValues = {};\n if (values && values instanceof Object) {\n cachedValues = JSON.parse(JSON.stringify(values));\n }\n for (var i = 0; i < this.panels.length; i++) {\n var panelValues = this.getPanelItemData(this.panels[i].data);\n //Should be unique for every panel due async expression support\n var newValues = _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].createCopy(cachedValues);\n newValues[QuestionPanelDynamicItem.ItemVariableName.toLowerCase()] = panelValues;\n newValues[QuestionPanelDynamicItem.IndexVariableName.toLowerCase()] = i;\n this.panels[i].runCondition(newValues, properties);\n }\n };\n QuestionPanelDynamicModel.prototype.onAnyValueChanged = function (name) {\n _super.prototype.onAnyValueChanged.call(this, name);\n for (var i = 0; i < this.panels.length; i++) {\n this.panels[i].onAnyValueChanged(name);\n this.panels[i].onAnyValueChanged(QuestionPanelDynamicItem.ItemVariableName);\n }\n };\n QuestionPanelDynamicModel.prototype.hasKeysDuplicated = function (fireCallback, rec) {\n if (rec === void 0) { rec = null; }\n var keyValues = [];\n var res;\n for (var i = 0; i < this.panels.length; i++) {\n res =\n this.isValueDuplicated(this.panels[i], keyValues, rec, fireCallback) ||\n res;\n }\n return res;\n };\n QuestionPanelDynamicModel.prototype.updatePanelsContainsErrors = function () {\n var question = this.changingValueQuestion;\n var parent = question.parent;\n while (!!parent) {\n parent.updateContainsErrors();\n parent = parent.parent;\n }\n this.updateContainsErrors();\n };\n QuestionPanelDynamicModel.prototype.hasErrors = function (fireCallback, rec) {\n if (fireCallback === void 0) { fireCallback = true; }\n if (rec === void 0) { rec = null; }\n if (this.isValueChangingInternally)\n return false;\n var res = false;\n if (!!this.changingValueQuestion) {\n var res = this.changingValueQuestion.hasErrors(fireCallback, rec);\n res = this.hasKeysDuplicated(fireCallback, rec) || res;\n this.updatePanelsContainsErrors();\n return res;\n }\n else {\n var errosInPanels = this.hasErrorInPanels(fireCallback, rec);\n return _super.prototype.hasErrors.call(this, fireCallback) || errosInPanels;\n }\n };\n QuestionPanelDynamicModel.prototype.getContainsErrors = function () {\n var res = _super.prototype.getContainsErrors.call(this);\n if (res)\n return res;\n var panels = this.panels;\n for (var i = 0; i < panels.length; i++) {\n if (panels[i].containsErrors)\n return true;\n }\n return false;\n };\n QuestionPanelDynamicModel.prototype.getIsAnswered = function () {\n if (!_super.prototype.getIsAnswered.call(this))\n return false;\n var panels = this.panels;\n for (var i = 0; i < panels.length; i++) {\n var visibleQuestions = [];\n panels[i].addQuestionsToList(visibleQuestions, true);\n for (var j = 0; j < visibleQuestions.length; j++) {\n if (!visibleQuestions[j].isAnswered)\n return false;\n }\n }\n return true;\n };\n QuestionPanelDynamicModel.prototype.clearValueIfInvisible = function () {\n for (var i = 0; i < this.panels.length; i++) {\n var questions = this.panels[i].questions;\n for (var j = 0; j < questions.length; j++) {\n questions[j].clearValueIfInvisible();\n }\n }\n _super.prototype.clearValueIfInvisible.call(this);\n };\n QuestionPanelDynamicModel.prototype.getIsRunningValidators = function () {\n if (_super.prototype.getIsRunningValidators.call(this))\n return true;\n for (var i = 0; i < this.panels.length; i++) {\n var questions = this.panels[i].questions;\n for (var j = 0; j < questions.length; j++) {\n if (questions[j].isRunningValidators)\n return true;\n }\n }\n return false;\n };\n QuestionPanelDynamicModel.prototype.getAllErrors = function () {\n var result = _super.prototype.getAllErrors.call(this);\n for (var i = 0; i < this.panels.length; i++) {\n var questions = this.panels[i].questions;\n for (var j = 0; j < questions.length; j++) {\n var errors = questions[j].getAllErrors();\n if (errors && errors.length > 0) {\n result = result.concat(errors);\n }\n }\n }\n return result;\n };\n QuestionPanelDynamicModel.prototype.getDisplayValueCore = function (keysAsText, value) {\n var values = this.getUnbindValue(value);\n if (!values || !Array.isArray(values))\n return values;\n for (var i = 0; i < this.panels.length && i < values.length; i++) {\n var val = values[i];\n if (!val)\n continue;\n values[i] = this.getPanelDisplayValue(i, val, keysAsText);\n }\n return values;\n };\n QuestionPanelDynamicModel.prototype.getPanelDisplayValue = function (panelIndex, val, keysAsText) {\n if (!val)\n return val;\n var panel = this.panels[panelIndex];\n var keys = Object.keys(val);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var question = panel.getQuestionByValueName(key);\n if (!question) {\n question = this.getSharedQuestionFromArray(key, panelIndex);\n }\n if (!!question) {\n var qValue = question.getDisplayValue(keysAsText, val[key]);\n val[key] = qValue;\n if (keysAsText && !!question.title && question.title !== key) {\n val[question.title] = qValue;\n delete val[key];\n }\n }\n }\n return val;\n };\n QuestionPanelDynamicModel.prototype.hasErrorInPanels = function (fireCallback, rec) {\n var res = false;\n var panels = this.panels;\n var keyValues = [];\n for (var i = 0; i < panels.length; i++) {\n this.setOnCompleteAsyncInPanel(panels[i]);\n }\n for (var i = 0; i < panels.length; i++) {\n var pnlError = panels[i].hasErrors(fireCallback, !!rec && rec.focuseOnFirstError, rec);\n pnlError = this.isValueDuplicated(panels[i], keyValues, rec) || pnlError;\n if (!this.isRenderModeList && pnlError && !res) {\n this.currentIndex = i;\n }\n res = pnlError || res;\n }\n return res;\n };\n QuestionPanelDynamicModel.prototype.setOnCompleteAsyncInPanel = function (panel) {\n var _this = this;\n var questions = panel.questions;\n for (var i = 0; i < questions.length; i++) {\n questions[i].onCompletedAsyncValidators = function (hasErrors) {\n _this.raiseOnCompletedAsyncValidators();\n };\n }\n };\n QuestionPanelDynamicModel.prototype.isValueDuplicated = function (panel, keyValues, rec, fireCallback) {\n if (!this.keyName)\n return false;\n var question = panel.getQuestionByValueName(this.keyName);\n if (!question || question.isEmpty())\n return false;\n var value = question.value;\n if (!!this.changingValueQuestion &&\n question != this.changingValueQuestion) {\n question.hasErrors(fireCallback, rec);\n }\n for (var i = 0; i < keyValues.length; i++) {\n if (value == keyValues[i]) {\n question.addError(new _error__WEBPACK_IMPORTED_MODULE_7__[\"KeyDuplicationError\"](this.keyDuplicationError, this));\n if (!!rec && !rec.firstErrorQuestion) {\n rec.firstErrorQuestion = question;\n }\n return true;\n }\n }\n keyValues.push(value);\n return false;\n };\n QuestionPanelDynamicModel.prototype.createNewPanel = function () {\n var panel = this.createAndSetupNewPanelObject();\n var json = this.template.toJSON();\n new _jsonobject__WEBPACK_IMPORTED_MODULE_5__[\"JsonObject\"]().toObject(json, panel);\n panel.renderWidth = \"100%\";\n panel.updateCustomWidgets();\n new QuestionPanelDynamicItem(this, panel);\n panel.onFirstRendering();\n var questions = panel.questions;\n for (var i = 0; i < questions.length; i++) {\n questions[i].setParentQuestion(this);\n }\n return panel;\n };\n QuestionPanelDynamicModel.prototype.createAndSetupNewPanelObject = function () {\n var panel = this.createNewPanelObject();\n panel.isInteractiveDesignElement = false;\n var self = this;\n panel.onGetQuestionTitleLocation = function () {\n return self.getTemplateQuestionTitleLocation();\n };\n return panel;\n };\n QuestionPanelDynamicModel.prototype.getTemplateQuestionTitleLocation = function () {\n return this.templateTitleLocation != \"default\"\n ? this.templateTitleLocation\n : this.getTitleLocationCore();\n };\n QuestionPanelDynamicModel.prototype.createNewPanelObject = function () {\n return _jsonobject__WEBPACK_IMPORTED_MODULE_5__[\"Serializer\"].createClass(\"panel\");\n };\n QuestionPanelDynamicModel.prototype.setPanelCountBasedOnValue = function () {\n if (this.isValueChangingInternally || this.isDesignMode)\n return;\n var val = this.value;\n var newPanelCount = val && Array.isArray(val) ? val.length : 0;\n if (newPanelCount == 0 && this.loadingPanelCount > 0) {\n newPanelCount = this.loadingPanelCount;\n }\n this.panelCount = newPanelCount;\n };\n QuestionPanelDynamicModel.prototype.setQuestionValue = function (newValue) {\n _super.prototype.setQuestionValue.call(this, newValue, false);\n this.setPanelCountBasedOnValue();\n for (var i = 0; i < this.panels.length; i++) {\n this.panelUpdateValueFromSurvey(this.panels[i]);\n }\n this.updateIsAnswered();\n };\n QuestionPanelDynamicModel.prototype.onSurveyValueChanged = function (newValue) {\n _super.prototype.onSurveyValueChanged.call(this, newValue);\n for (var i = 0; i < this.panels.length; i++) {\n this.panelSurveyValueChanged(this.panels[i]);\n }\n if (newValue === undefined) {\n this.setValueBasedOnPanelCount();\n }\n };\n QuestionPanelDynamicModel.prototype.panelUpdateValueFromSurvey = function (panel) {\n var questions = panel.questions;\n var values = this.getPanelItemData(panel.data);\n for (var i = 0; i < questions.length; i++) {\n var q = questions[i];\n q.updateValueFromSurvey(values[q.getValueName()]);\n q.updateCommentFromSurvey(values[q.getValueName() + _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].commentPrefix]);\n }\n };\n QuestionPanelDynamicModel.prototype.panelSurveyValueChanged = function (panel) {\n var questions = panel.questions;\n var values = this.getPanelItemData(panel.data);\n for (var i = 0; i < questions.length; i++) {\n var q = questions[i];\n q.onSurveyValueChanged(values[q.getValueName()]);\n }\n };\n QuestionPanelDynamicModel.prototype.onSetData = function () {\n _super.prototype.onSetData.call(this);\n if (this.isDesignMode) {\n this.setTemplatePanelSurveyImpl();\n this.rebuildPanels();\n }\n };\n //IQuestionPanelDynamicData\n QuestionPanelDynamicModel.prototype.getItemIndex = function (item) {\n var res = this.items.indexOf(item);\n return res > -1 ? res : this.items.length;\n };\n QuestionPanelDynamicModel.prototype.getPanelItemData = function (item) {\n var items = this.items;\n var index = items.indexOf(item);\n var qValue = this.value;\n if (index < 0 && Array.isArray(qValue) && qValue.length > items.length) {\n index = items.length;\n }\n if (index < 0)\n return {};\n if (!qValue || !Array.isArray(qValue) || qValue.length <= index)\n return {};\n return qValue[index];\n };\n QuestionPanelDynamicModel.prototype.setPanelItemData = function (item, name, val) {\n if (this.isSetPanelItemData && this.isSetPanelItemData.indexOf(name) > -1)\n return;\n if (!this.isSetPanelItemData)\n this.isSetPanelItemData = [];\n this.isSetPanelItemData.push(name);\n var items = this.items;\n var index = items.indexOf(item);\n if (index < 0)\n index = items.length;\n var qValue = this.getUnbindValue(this.value);\n if (!qValue || !Array.isArray(qValue)) {\n qValue = [];\n }\n if (qValue.length <= index) {\n for (var i = qValue.length; i <= index; i++) {\n qValue.push({});\n }\n }\n if (!qValue[index])\n qValue[index] = {};\n if (!this.isValueEmpty(val)) {\n qValue[index][name] = val;\n }\n else {\n delete qValue[index][name];\n }\n if (index >= 0 && index < this.panels.length) {\n this.changingValueQuestion = this.panels[index].getQuestionByValueName(name);\n }\n this.value = qValue;\n this.changingValueQuestion = null;\n if (this.survey) {\n var options = {\n question: this,\n panel: item.panel,\n name: name,\n itemIndex: index,\n itemValue: qValue[index],\n value: val,\n };\n this.survey.dynamicPanelItemValueChanged(this, options);\n }\n var index = this.isSetPanelItemData.indexOf(name);\n if (index > -1) {\n this.isSetPanelItemData.splice(index, 1);\n }\n };\n QuestionPanelDynamicModel.prototype.getRootData = function () {\n return this.data;\n };\n QuestionPanelDynamicModel.prototype.getPlainData = function (options) {\n if (options === void 0) { options = {\n includeEmpty: true,\n }; }\n var questionPlainData = _super.prototype.getPlainData.call(this, options);\n if (!!questionPlainData) {\n questionPlainData.isNode = true;\n questionPlainData.data = this.panels.map(function (panel, index) {\n var panelDataItem = {\n name: panel.name || index,\n title: panel.title || \"Panel\",\n value: panel.getValue(),\n displayValue: panel.getValue(),\n getString: function (val) {\n return typeof val === \"object\" ? JSON.stringify(val) : val;\n },\n isNode: true,\n data: panel.questions\n .map(function (question) { return question.getPlainData(options); })\n .filter(function (d) { return !!d; }),\n };\n (options.calculations || []).forEach(function (calculation) {\n panelDataItem[calculation.propertyName] = panel[calculation.propertyName];\n });\n return panelDataItem;\n });\n }\n return questionPlainData;\n };\n QuestionPanelDynamicModel.prototype.updateElementCss = function (reNew) {\n _super.prototype.updateElementCss.call(this, reNew);\n for (var i = 0; i < this.panels.length; i++) {\n var el = this.panels[i];\n el.updateElementCss(reNew);\n }\n };\n Object.defineProperty(QuestionPanelDynamicModel.prototype, \"progressText\", {\n get: function () {\n var rangeMax = this.panelCount;\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"]\n .getString(\"panelDynamicProgressText\")[\"format\"](this.currentIndex + 1, rangeMax);\n },\n enumerable: false,\n configurable: true\n });\n QuestionPanelDynamicModel.prototype.getPanelWrapperCss = function () {\n var cssClasses = this.cssClasses.panelWrapper;\n if (this.panelRemoveButtonLocation === \"right\") {\n cssClasses += \" \" + this.cssClasses.panelWrapperInRow;\n }\n return cssClasses;\n };\n QuestionPanelDynamicModel.prototype.getPanelRemoveButtonCss = function () {\n var cssClasses = this.cssClasses.button + \" \" + this.cssClasses.buttonRemove;\n if (this.panelRemoveButtonLocation === \"right\") {\n cssClasses += \" \" + this.cssClasses.buttonRemoveRight;\n }\n return cssClasses;\n };\n return QuestionPanelDynamicModel;\n}(_question__WEBPACK_IMPORTED_MODULE_4__[\"Question\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_5__[\"Serializer\"].addClass(\"paneldynamic\", [\n {\n name: \"templateElements\",\n alternativeName: \"questions\",\n visible: false,\n isLightSerializable: false,\n },\n { name: \"templateTitle:text\", serializationProperty: \"locTemplateTitle\" },\n {\n name: \"templateDescription:text\",\n serializationProperty: \"locTemplateDescription\",\n },\n { name: \"allowAddPanel:boolean\", default: true },\n { name: \"allowRemovePanel:boolean\", default: true },\n {\n name: \"panelCount:number\",\n isBindable: true,\n default: 0,\n choices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n },\n { name: \"minPanelCount:number\", default: 0, minValue: 0 },\n {\n name: \"maxPanelCount:number\",\n default: _settings__WEBPACK_IMPORTED_MODULE_8__[\"settings\"].panelMaximumPanelCount,\n },\n \"defaultPanelValue:panelvalue\",\n \"defaultValueFromLastPanel:boolean\",\n {\n name: \"panelsState\",\n default: \"default\",\n choices: [\"default\", \"collapsed\", \"expanded\", \"firstExpanded\"],\n },\n { name: \"keyName\" },\n {\n name: \"keyDuplicationError\",\n serializationProperty: \"locKeyDuplicationError\",\n },\n { name: \"confirmDelete:boolean\" },\n {\n name: \"confirmDeleteText\",\n serializationProperty: \"locConfirmDeleteText\",\n },\n { name: \"panelAddText\", serializationProperty: \"locPanelAddText\" },\n { name: \"panelRemoveText\", serializationProperty: \"locPanelRemoveText\" },\n { name: \"panelPrevText\", serializationProperty: \"locPanelPrevText\" },\n { name: \"panelNextText\", serializationProperty: \"locPanelNextText\" },\n {\n name: \"showQuestionNumbers\",\n default: \"off\",\n choices: [\"off\", \"onPanel\", \"onSurvey\"],\n },\n { name: \"showRangeInProgress:boolean\", default: true },\n {\n name: \"renderMode\",\n default: \"list\",\n choices: [\"list\", \"progressTop\", \"progressBottom\", \"progressTopBottom\"],\n },\n {\n name: \"templateTitleLocation\",\n default: \"default\",\n choices: [\"default\", \"top\", \"bottom\", \"left\"],\n },\n {\n name: \"panelRemoveButtonLocation\",\n default: \"bottom\",\n choices: [\"bottom\", \"right\"],\n },\n], function () {\n return new QuestionPanelDynamicModel(\"\");\n}, \"question\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_6__[\"QuestionFactory\"].Instance.registerQuestion(\"paneldynamic\", function (name) {\n return new QuestionPanelDynamicModel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_radiogroup.ts\":\n/*!************************************!*\\\n !*** ./src/question_radiogroup.ts ***!\n \\************************************/\n/*! exports provided: QuestionRadiogroupModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionRadiogroupModel\", function() { return QuestionRadiogroupModel; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _question_baseselect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./question_baseselect */ \"./src/question_baseselect.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n/**\n * A Model for a radiogroup question.\n */\nvar QuestionRadiogroupModel = /** @class */ (function (_super) {\n __extends(QuestionRadiogroupModel, _super);\n function QuestionRadiogroupModel(name) {\n return _super.call(this, name) || this;\n }\n QuestionRadiogroupModel.prototype.getType = function () {\n return \"radiogroup\";\n };\n QuestionRadiogroupModel.prototype.getFirstInputElementId = function () {\n return this.inputId + \"_0\";\n };\n Object.defineProperty(QuestionRadiogroupModel.prototype, \"selectedItem\", {\n /**\n * Return the selected item in the radio group. Returns null if the value is empty\n */\n get: function () {\n if (this.isEmpty())\n return null;\n return _itemvalue__WEBPACK_IMPORTED_MODULE_4__[\"ItemValue\"].getItemByValue(this.visibleChoices, this.value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRadiogroupModel.prototype, \"showClearButton\", {\n /**\n * Show \"clear button\" flag.\n */\n get: function () {\n return this.getPropertyValue(\"showClearButton\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"showClearButton\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRadiogroupModel.prototype, \"canShowClearButton\", {\n get: function () {\n return this.showClearButton && !this.isReadOnly;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRadiogroupModel.prototype, \"clearButtonCaption\", {\n get: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_3__[\"surveyLocalization\"].getString(\"clearCaption\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionRadiogroupModel.prototype.supportGoNextPageAutomatic = function () {\n return true;\n };\n return QuestionRadiogroupModel;\n}(_question_baseselect__WEBPACK_IMPORTED_MODULE_2__[\"QuestionCheckboxBase\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"radiogroup\", [{ name: \"showClearButton:boolean\", default: false }], function () {\n return new QuestionRadiogroupModel(\"\");\n}, \"checkboxbase\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].Instance.registerQuestion(\"radiogroup\", function (name) {\n var q = new QuestionRadiogroupModel(name);\n q.choices = _questionfactory__WEBPACK_IMPORTED_MODULE_1__[\"QuestionFactory\"].DefaultChoices;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_ranking.ts\":\n/*!*********************************!*\\\n !*** ./src/question_ranking.ts ***!\n \\*********************************/\n/*! exports provided: QuestionRankingModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionRankingModel\", function() { return QuestionRankingModel; });\n/* harmony import */ var sortablejs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.esm.js\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _question_checkbox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./question_checkbox */ \"./src/question_checkbox.ts\");\n/* harmony import */ var _utils_is_mobile__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/is-mobile */ \"./src/utils/is-mobile.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\nvar Sortable = sortablejs__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n/**\n * A Model for a ranking question\n */\nvar QuestionRankingModel = /** @class */ (function (_super) {\n __extends(QuestionRankingModel, _super);\n function QuestionRankingModel(name) {\n var _this = _super.call(this, name) || this;\n _this.domNode = null;\n _this.sortableInst = null;\n _this.handleKeydown = function (event) {\n var key = event.key;\n var array = _this.domNode.querySelectorAll(\".\" + _this.cssClasses.item);\n var index = [].indexOf.call(array, event.target);\n if (key === \"ArrowUp\" && index) {\n _this.handleArrowUp(index);\n }\n if (key === \"ArrowDown\" && index !== array.length - 1) {\n _this.handleArrowDown(index);\n }\n };\n _this.handleArrowUp = function (index) {\n var array = _this.sortableInst.toArray();\n _this.moveArrayItemBack(array, index);\n _this.sortableInst.sort(array);\n _this.syncNumbers();\n _this.setValueFromUI();\n _this.focusItem(index - 1);\n };\n _this.handleArrowDown = function (index) {\n var array = _this.sortableInst.toArray();\n _this.moveArrayItemForward(array, index);\n _this.sortableInst.sort(array);\n _this.syncNumbers();\n _this.setValueFromUI();\n _this.focusItem(index + 1);\n };\n _this.moveArrayItemBack = function (array, index) {\n var _a;\n _a = [array[index - 1], array[index]], array[index] = _a[0], array[index - 1] = _a[1];\n };\n _this.moveArrayItemForward = function (array, index) {\n var _a;\n _a = [array[index + 1], array[index]], array[index] = _a[0], array[index + 1] = _a[1];\n };\n _this.focusItem = function (index) {\n var itemsNodes = _this.domNode.querySelectorAll(\".\" + _this.cssClasses.item);\n itemsNodes[index].focus();\n };\n _this.setValueFromUI = function () {\n var value = [];\n var textNodes = _this.domNode.querySelectorAll(\".\" + _this.cssClasses.controlLabel);\n textNodes.forEach(function (textNode, index) {\n var innerText = textNode.innerText;\n _this.visibleChoices.forEach(function (visibleChoice) {\n if (innerText === visibleChoice.text) {\n value.push(visibleChoice.value);\n }\n });\n });\n _this.value = value;\n };\n _this.syncNumbers = function () {\n if (!_this.domNode)\n return;\n var selector = \".\" +\n _this.cssClasses.item +\n \":not(.\" +\n _this.cssClasses.itemDragMod +\n \")\" +\n \" .\" +\n _this.cssClasses.itemIndex;\n var indexNodes = _this.domNode.querySelectorAll(selector);\n indexNodes.forEach(function (indexNode, index) {\n indexNode.innerText = _this.getNumberByIndex(index);\n });\n };\n _this.setGhostText = function (text) {\n var indexNodes = _this.domNode.querySelectorAll(\".\" + _this.cssClasses.itemIndex);\n var ghostNode = indexNodes[indexNodes.length - 1];\n ghostNode.innerText = text;\n };\n return _this;\n }\n QuestionRankingModel.prototype.getType = function () {\n return \"ranking\";\n };\n Object.defineProperty(QuestionRankingModel.prototype, \"isIndeterminate\", {\n get: function () {\n return !this.value || this.value.length === 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRankingModel.prototype, \"rootClass\", {\n get: function () {\n var css = this.cssClasses;\n if (_utils_is_mobile__WEBPACK_IMPORTED_MODULE_4__[\"IsMobile\"])\n return css.root + \" \" + css.rootMobileMod;\n return css.root;\n },\n enumerable: false,\n configurable: true\n });\n QuestionRankingModel.prototype.getNumberByIndex = function (index) {\n return this.isIndeterminate ? \"\\u2013\" : index + 1 + \"\";\n };\n Object.defineProperty(QuestionRankingModel.prototype, \"rankingChoices\", {\n get: function () {\n var result = [];\n var value = this.value;\n var visibleChoices = this.removeOtherChoiceFromChoices(this.visibleChoices);\n if (this.isIndeterminate) {\n result = visibleChoices;\n }\n else {\n result = this.mergeValueAndVisibleChoices(value, visibleChoices);\n }\n // ranking question with only one choice doesn't make sense\n if (result.length === 1)\n result = [];\n return result;\n },\n enumerable: false,\n configurable: true\n });\n QuestionRankingModel.prototype.removeOtherChoiceFromChoices = function (choices) {\n var result = choices;\n choices.forEach(function (choice, index) {\n if (choice.value === \"other\") {\n result.splice(index, 1); // remove other choice\n }\n });\n return result;\n };\n //cross framework initialization\n QuestionRankingModel.prototype.afterRenderQuestionElement = function (el) {\n if (!!el) {\n this.initSortable(el);\n }\n _super.prototype.afterRenderQuestionElement.call(this, el);\n };\n //cross framework destroy\n QuestionRankingModel.prototype.beforeDestroyQuestionElement = function (el) {\n if (this.sortableInst)\n this.sortableInst.destroy();\n _super.prototype.beforeDestroyQuestionElement.call(this, el);\n };\n QuestionRankingModel.prototype.supportSelectAll = function () {\n return false;\n };\n QuestionRankingModel.prototype.supportOther = function () {\n return false;\n };\n QuestionRankingModel.prototype.supportNone = function () {\n return false;\n };\n // to make \"carry forward\" feature work properly with ranking\n QuestionRankingModel.prototype.onVisibleChoicesChanged = function () {\n _super.prototype.onVisibleChoicesChanged.call(this);\n if (this.isIndeterminate)\n return;\n this.value = this.rankingChoices.map(function (choice) { return choice.value; });\n };\n QuestionRankingModel.prototype.mergeValueAndVisibleChoices = function (value, visibleChoices) {\n var length = visibleChoices.length;\n var result = [];\n result.length = length;\n for (var i = 0; i < length; i++) {\n var choice = visibleChoices[i];\n var index = value.indexOf(choice.value);\n if (index !== -1) {\n result.splice(index, 1, choice);\n }\n else {\n result.splice(result.length - 1, 0, choice);\n }\n }\n result = result.filter(function (choice) { return !!choice; });\n return result;\n };\n QuestionRankingModel.prototype.initSortable = function (domNode) {\n if (!domNode)\n return;\n var self = this;\n self.domNode = domNode;\n if (this.isReadOnly)\n return;\n if (this.isDesignMode)\n return;\n self.sortableInst = new Sortable(domNode, {\n animation: 100,\n forceFallback: true,\n delay: 200,\n delayOnTouchOnly: true,\n handle: _utils_is_mobile__WEBPACK_IMPORTED_MODULE_4__[\"IsMobile\"]\n ? \".\" + self.cssClasses.itemIconContainer\n : \".\" + self.cssClasses.itemContent,\n ghostClass: self.cssClasses.itemGhostMod,\n dragClass: self.cssClasses.itemDragMod,\n onStart: function (evt) {\n Sortable.ghost.style.opacity = 1;\n domNode.className += \" \" + self.cssClasses.rootDragMod;\n if (self.isIndeterminate) {\n self.setGhostText(evt.oldIndex + 1);\n }\n },\n onEnd: function () {\n domNode.className = domNode.className.replace(\" \" + self.cssClasses.rootDragMod, \"\");\n self.setValueFromUI();\n },\n onChange: function (evt) {\n if (!self.isIndeterminate)\n self.syncNumbers();\n self.setGhostText(evt.newIndex + 1);\n },\n });\n };\n return QuestionRankingModel;\n}(_question_checkbox__WEBPACK_IMPORTED_MODULE_3__[\"QuestionCheckboxModel\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"ranking\", [\n { name: \"hasOther\", visible: false, isSerializable: false },\n { name: \"otherText\", visible: false, isSerializable: false },\n { name: \"otherErrorText\", visible: false, isSerializable: false },\n { name: \"storeOthersAsComment\", visible: false, isSerializable: false },\n { name: \"hasNone\", visible: false, isSerializable: false },\n { name: \"noneText\", visible: false, isSerializable: false },\n { name: \"hasSelectAll\", visible: false, isSerializable: false },\n { name: \"selectAllText\", visible: false, isSerializable: false },\n { name: \"colCount:number\", visible: false, isSerializable: false },\n { name: \"maxSelectedChoices\", visible: false, isSerializable: false },\n], function () {\n return new QuestionRankingModel(\"\");\n}, \"checkbox\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_2__[\"QuestionFactory\"].Instance.registerQuestion(\"ranking\", function (name) {\n var q = new QuestionRankingModel(name);\n q.choices = _questionfactory__WEBPACK_IMPORTED_MODULE_2__[\"QuestionFactory\"].DefaultChoices;\n return q;\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_rating.ts\":\n/*!********************************!*\\\n !*** ./src/question_rating.ts ***!\n \\********************************/\n/*! exports provided: QuestionRatingModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionRatingModel\", function() { return QuestionRatingModel; });\n/* harmony import */ var _itemvalue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemvalue */ \"./src/itemvalue.ts\");\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n/**\n * A Model for a rating question.\n */\nvar QuestionRatingModel = /** @class */ (function (_super) {\n __extends(QuestionRatingModel, _super);\n function QuestionRatingModel(name) {\n var _this = _super.call(this, name) || this;\n _this.createItemValues(\"rateValues\");\n var self = _this;\n _this.registerFunctionOnPropertyValueChanged(\"rateValues\", function () {\n self.fireCallback(self.rateValuesChangedCallback);\n });\n _this.onPropertyChanged.add(function (sender, options) {\n if (options.name == \"rateMin\" ||\n options.name == \"rateMax\" ||\n options.name == \"rateStep\") {\n self.fireCallback(self.rateValuesChangedCallback);\n }\n });\n var locMinRateDescriptionValue = _this.createLocalizableString(\"minRateDescription\", _this, true);\n var locMaxRateDescriptionValue = _this.createLocalizableString(\"maxRateDescription\", _this, true);\n locMinRateDescriptionValue.onGetTextCallback = function (text) {\n return text ? text + \" \" : text;\n };\n locMaxRateDescriptionValue.onGetTextCallback = function (text) {\n return text ? \" \" + text : text;\n };\n return _this;\n }\n QuestionRatingModel.prototype.onSurveyLoad = function () {\n _super.prototype.onSurveyLoad.call(this);\n this.fireCallback(this.rateValuesChangedCallback);\n };\n Object.defineProperty(QuestionRatingModel.prototype, \"rateValues\", {\n /**\n * The list of rate items. Every item has value and text. If text is empty, the value is rendered. The item text supports markdown. If it is empty the array is generated by using rateMin, rateMax and rateStep properties.\n * @see rateMin\n * @see rateMax\n * @see rateStep\n */\n get: function () {\n return this.getPropertyValue(\"rateValues\");\n },\n set: function (val) {\n this.setPropertyValue(\"rateValues\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRatingModel.prototype, \"rateMin\", {\n /**\n * This property is used to generate rate values if rateValues array is empty. It is the first value in the rating. The default value is 1.\n * @see rateValues\n * @see rateMax\n * @see rateStep\n */\n get: function () {\n return this.getPropertyValue(\"rateMin\");\n },\n set: function (val) {\n if (!this.isLoadingFromJson && val > this.rateMax - this.rateStep)\n val = this.rateMax - this.rateStep;\n this.setPropertyValue(\"rateMin\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRatingModel.prototype, \"rateMax\", {\n /**\n * This property is used to generate rate values if rateValues array is empty. It is the last value in the rating. The default value is 5.\n * @see rateValues\n * @see rateMin\n * @see rateStep\n */\n get: function () {\n return this.getPropertyValue(\"rateMax\");\n },\n set: function (val) {\n if (!this.isLoadingFromJson && val < this.rateMin + this.rateStep)\n val = this.rateMin + this.rateStep;\n this.setPropertyValue(\"rateMax\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRatingModel.prototype, \"rateStep\", {\n /**\n * This property is used to generate rate values if rateValues array is empty. It is the step value. The number of rate values are (rateMax - rateMin) / rateStep. The default value is 1.\n * @see rateValues\n * @see rateMin\n * @see rateMax\n */\n get: function () {\n return this.getPropertyValue(\"rateStep\");\n },\n set: function (val) {\n if (val <= 0)\n val = 1;\n if (!this.isLoadingFromJson && val > this.rateMax - this.rateMin)\n val = this.rateMax - this.rateMin;\n this.setPropertyValue(\"rateStep\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionRatingModel.prototype.getDisplayValueCore = function (keysAsText, value) {\n var res = _itemvalue__WEBPACK_IMPORTED_MODULE_0__[\"ItemValue\"].getTextOrHtmlByValue(this.visibleRateValues, value);\n return !!res ? res : value;\n };\n Object.defineProperty(QuestionRatingModel.prototype, \"visibleRateValues\", {\n get: function () {\n if (this.rateValues.length > 0)\n return this.rateValues;\n var res = [];\n var value = this.rateMin;\n var step = this.rateStep;\n while (value <= this.rateMax &&\n res.length < _settings__WEBPACK_IMPORTED_MODULE_4__[\"settings\"].ratingMaximumRateValueCount) {\n res.push(new _itemvalue__WEBPACK_IMPORTED_MODULE_0__[\"ItemValue\"](value));\n value = this.correctValue(value + step, step);\n }\n return res;\n },\n enumerable: false,\n configurable: true\n });\n QuestionRatingModel.prototype.correctValue = function (value, step) {\n if (!value)\n return value;\n if (Math.round(value) == value)\n return value;\n var fr = 0;\n while (Math.round(step) != step) {\n step *= 10;\n fr++;\n }\n return parseFloat(value.toFixed(fr));\n };\n QuestionRatingModel.prototype.getType = function () {\n return \"rating\";\n };\n QuestionRatingModel.prototype.getFirstInputElementId = function () {\n return this.inputId + \"_0\";\n };\n QuestionRatingModel.prototype.supportGoNextPageAutomatic = function () {\n return true;\n };\n QuestionRatingModel.prototype.supportComment = function () {\n return true;\n };\n QuestionRatingModel.prototype.supportOther = function () {\n return true;\n };\n Object.defineProperty(QuestionRatingModel.prototype, \"minRateDescription\", {\n /**\n * The description of minimum (first) item.\n */\n get: function () {\n return this.getLocalizableStringText(\"minRateDescription\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"minRateDescription\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRatingModel.prototype, \"locMinRateDescription\", {\n get: function () {\n return this.getLocalizableString(\"minRateDescription\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRatingModel.prototype, \"maxRateDescription\", {\n /**\n * The description of maximum (last) item.\n */\n get: function () {\n return this.getLocalizableStringText(\"maxRateDescription\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"maxRateDescription\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionRatingModel.prototype, \"locMaxRateDescription\", {\n get: function () {\n return this.getLocalizableString(\"maxRateDescription\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionRatingModel.prototype.valueToData = function (val) {\n if (this.rateValues.length > 0) {\n var item = _itemvalue__WEBPACK_IMPORTED_MODULE_0__[\"ItemValue\"].getItemByValue(this.rateValues, val);\n return !!item ? item.value : val;\n }\n return !isNaN(val) ? parseFloat(val) : val;\n };\n /**\n * Click value again to clear.\n */\n QuestionRatingModel.prototype.setValueFromClick = function (value) {\n if (this.value === parseFloat(value)) {\n this.clearValue();\n }\n else {\n this.value = value;\n }\n };\n QuestionRatingModel.prototype.getItemClass = function (item) {\n var itemCss = this.cssClasses.item;\n var selected = this.cssClasses.selected;\n var disabled = this.cssClasses.itemDisabled;\n var isSelected = this.value == item.value;\n var isDisabled = this.isReadOnly && !item.isEnabled;\n var allowHover = !isDisabled &&\n !isSelected &&\n !(!!this.survey && this.survey.isDesignMode);\n var result = itemCss;\n if (this.value == item.value) {\n result += \" \" + selected;\n }\n if (this.isReadOnly) {\n result += \" \" + disabled;\n }\n if (allowHover) {\n result += \" \" + this.cssClasses.itemHover;\n }\n return result;\n };\n return QuestionRatingModel;\n}(_question__WEBPACK_IMPORTED_MODULE_1__[\"Question\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"rating\", [\n { name: \"hasComment:switch\", layout: \"row\" },\n {\n name: \"commentText\",\n dependsOn: \"hasComment\",\n visibleIf: function (obj) {\n return obj.hasComment;\n },\n serializationProperty: \"locCommentText\",\n layout: \"row\",\n },\n {\n name: \"rateValues:itemvalue[]\",\n baseValue: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_5__[\"surveyLocalization\"].getString(\"choices_Item\");\n },\n },\n { name: \"rateMin:number\", default: 1 },\n { name: \"rateMax:number\", default: 5 },\n { name: \"rateStep:number\", default: 1, minValue: 0.1 },\n {\n name: \"minRateDescription\",\n alternativeName: \"mininumRateDescription\",\n serializationProperty: \"locMinRateDescription\",\n },\n {\n name: \"maxRateDescription\",\n alternativeName: \"maximumRateDescription\",\n serializationProperty: \"locMaxRateDescription\",\n },\n], function () {\n return new QuestionRatingModel(\"\");\n}, \"question\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_3__[\"QuestionFactory\"].Instance.registerQuestion(\"rating\", function (name) {\n return new QuestionRatingModel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_signaturepad.ts\":\n/*!**************************************!*\\\n !*** ./src/question_signaturepad.ts ***!\n \\**************************************/\n/*! exports provided: QuestionSignaturePadModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionSignaturePadModel\", function() { return QuestionSignaturePadModel; });\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var signature_pad__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! signature_pad */ \"./node_modules/signature_pad/dist/signature_pad.mjs\");\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n\n\n\n\n\nvar defaultWidth = 300;\nvar defaultHeight = 200;\nfunction resizeCanvas(canvas) {\n var context = canvas.getContext(\"2d\");\n var devicePixelRatio = window.devicePixelRatio || 1;\n var backingStoreRatio = context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio ||\n 1;\n var ratio = devicePixelRatio / backingStoreRatio;\n var oldWidth = canvas.width;\n var oldHeight = canvas.height;\n canvas.width = oldWidth * ratio;\n canvas.height = oldHeight * ratio;\n canvas.style.width = oldWidth + \"px\";\n canvas.style.height = oldHeight + \"px\";\n context.scale(ratio, ratio);\n}\n/**\n * A Model for signature pad question.\n */\nvar QuestionSignaturePadModel = /** @class */ (function (_super) {\n __extends(QuestionSignaturePadModel, _super);\n function QuestionSignaturePadModel(name) {\n return _super.call(this, name) || this;\n }\n QuestionSignaturePadModel.prototype.getCssRoot = function (cssClasses) {\n var classes = _super.prototype.getCssRoot.call(this, cssClasses);\n if (\"\" + this.width === \"300\") {\n classes += \" \" + cssClasses.small;\n }\n return classes;\n };\n QuestionSignaturePadModel.prototype.updateValue = function () {\n if (this.signaturePad) {\n var data = this.signaturePad.toDataURL(this.dataFormat);\n this.value = data;\n }\n };\n QuestionSignaturePadModel.prototype.getType = function () {\n return \"signaturepad\";\n };\n QuestionSignaturePadModel.prototype.afterRenderQuestionElement = function (el) {\n if (!!el) {\n this.initSignaturePad(el);\n }\n _super.prototype.afterRenderQuestionElement.call(this, el);\n };\n QuestionSignaturePadModel.prototype.beforeDestroyQuestionElement = function (el) {\n if (!!el) {\n this.destroySignaturePad(el);\n }\n };\n QuestionSignaturePadModel.prototype.initSignaturePad = function (el) {\n var _this = this;\n var canvas = el.getElementsByTagName(\"canvas\")[0];\n var buttonEl = el.getElementsByTagName(\"button\")[0];\n var signaturePad = new signature_pad__WEBPACK_IMPORTED_MODULE_3__[\"default\"](canvas, { backgroundColor: \"#ffffff\" });\n if (this.isInputReadOnly) {\n signaturePad.off();\n }\n buttonEl.onclick = function () {\n _this.value = undefined;\n };\n this.readOnlyChangedCallback = function () {\n if (!_this.allowClear || _this.isInputReadOnly) {\n signaturePad.off();\n buttonEl.style.display = \"none\";\n }\n else {\n signaturePad.on();\n buttonEl.style.display = \"block\";\n }\n };\n signaturePad.penColor = this.penColor;\n signaturePad.backgroundColor = this.backgroundColor;\n signaturePad.onBegin = function () {\n _this.isDrawingValue = true;\n canvas.focus();\n };\n signaturePad.onEnd = function () {\n _this.isDrawingValue = false;\n _this.updateValue();\n };\n var updateValueHandler = function () {\n var data = _this.value;\n canvas.width = _this.width || defaultWidth;\n canvas.height = _this.height || defaultHeight;\n resizeCanvas(canvas);\n if (!data) {\n signaturePad.clear();\n }\n else {\n signaturePad.fromDataURL(data);\n }\n };\n this.valueChangedCallback = updateValueHandler;\n updateValueHandler();\n this.readOnlyChangedCallback();\n this.signaturePad = signaturePad;\n var propertyChangedHandler = function (sender, options) {\n if (options.name === \"width\" || options.name === \"height\") {\n updateValueHandler();\n }\n };\n this.onPropertyChanged.add(propertyChangedHandler);\n this.signaturePad.propertyChangedHandler = propertyChangedHandler;\n };\n QuestionSignaturePadModel.prototype.destroySignaturePad = function (el) {\n if (this.signaturePad) {\n this.onPropertyChanged.remove(this.signaturePad.propertyChangedHandler);\n this.signaturePad.off();\n }\n this.readOnlyChangedCallback = null;\n this.signaturePad = null;\n };\n Object.defineProperty(QuestionSignaturePadModel.prototype, \"width\", {\n /**\n * Use it to set the specific width for the signature pad.\n */\n get: function () {\n return this.getPropertyValue(\"width\", 300);\n },\n set: function (val) {\n this.setPropertyValue(\"width\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSignaturePadModel.prototype, \"height\", {\n /**\n * Use it to set the specific height for the signature pad.\n */\n get: function () {\n return this.getPropertyValue(\"height\", 200);\n },\n set: function (val) {\n this.setPropertyValue(\"height\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSignaturePadModel.prototype, \"allowClear\", {\n /**\n * Use it to clear content of the signature pad.\n */\n get: function () {\n return this.getPropertyValue(\"allowClear\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"allowClear\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSignaturePadModel.prototype, \"penColor\", {\n /**\n * Use it to set pen color for the signature pad.\n */\n get: function () {\n return this.getPropertyValue(\"penColor\", \"#1ab394\");\n },\n set: function (val) {\n this.setPropertyValue(\"penColor\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSignaturePadModel.prototype, \"backgroundColor\", {\n /**\n * Use it to set background color for the signature pad.\n */\n get: function () {\n return this.getPropertyValue(\"backgroundColor\", \"#ffffff\");\n },\n set: function (val) {\n this.setPropertyValue(\"backgroundColor\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionSignaturePadModel.prototype, \"clearButtonCaption\", {\n /**\n * The clear signature button caption.\n */\n get: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"clearCaption\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionSignaturePadModel.prototype.needShowPlaceholder = function () {\n return !this.isDrawingValue && this.isEmpty();\n };\n Object.defineProperty(QuestionSignaturePadModel.prototype, \"placeHolderText\", {\n get: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"signaturePlaceHolder\");\n },\n enumerable: false,\n configurable: true\n });\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"property\"])({ defaultValue: false })\n ], QuestionSignaturePadModel.prototype, \"isDrawingValue\", void 0);\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"property\"])({ defaultValue: \"\" })\n ], QuestionSignaturePadModel.prototype, \"dataFormat\", void 0);\n return QuestionSignaturePadModel;\n}(_question__WEBPACK_IMPORTED_MODULE_1__[\"Question\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_0__[\"Serializer\"].addClass(\"signaturepad\", [\n {\n name: \"width:number\",\n category: \"general\",\n default: 300,\n },\n {\n name: \"height:number\",\n category: \"general\",\n default: 200,\n },\n {\n name: \"allowClear:boolean\",\n category: \"general\",\n default: true,\n },\n {\n name: \"penColor:color\",\n category: \"general\",\n default: \"#1ab394\",\n },\n {\n name: \"backgroundColor:color\",\n category: \"general\",\n default: \"#ffffff\",\n },\n {\n name: \"dataFormat\",\n category: \"general\",\n default: \"\",\n choices: [\n { value: \"\", text: \"PNG\" },\n { value: \"image/jpeg\", text: \"JPEG\" },\n { value: \"image/svg+xml\", text: \"SVG\" },\n ],\n },\n { name: \"defaultValue\", visible: false },\n { name: \"correctAnswer\", visible: false },\n], function () {\n return new QuestionSignaturePadModel(\"\");\n}, \"question\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_4__[\"QuestionFactory\"].Instance.registerQuestion(\"signaturepad\", function (name) {\n return new QuestionSignaturePadModel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_text.ts\":\n/*!******************************!*\\\n !*** ./src/question_text.ts ***!\n \\******************************/\n/*! exports provided: QuestionTextModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionTextModel\", function() { return QuestionTextModel; });\n/* harmony import */ var _questionfactory__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./questionfactory */ \"./src/questionfactory.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./localizablestring */ \"./src/localizablestring.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _validator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./validator */ \"./src/validator.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\n/* harmony import */ var _question_textbase__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./question_textbase */ \"./src/question_textbase.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\n\n\n/**\n * A Model for an input text question.\n */\nvar QuestionTextModel = /** @class */ (function (_super) {\n __extends(QuestionTextModel, _super);\n function QuestionTextModel(name) {\n var _this = _super.call(this, name) || this;\n _this.createLocalizableString(\"minErrorText\", _this, true);\n _this.createLocalizableString(\"maxErrorText\", _this, true);\n _this.locDataListValue = new _localizablestring__WEBPACK_IMPORTED_MODULE_2__[\"LocalizableStrings\"](_this);\n _this.registerFunctionOnPropertiesValueChanged([\"min\", \"max\", \"inputType\", \"minValueExpression\", \"maxValueExpression\"], function () {\n _this.setRenderedMinMax();\n });\n _this.registerFunctionOnPropertiesValueChanged([\"inputType\", \"size\"], function () {\n _this.updateInputSize();\n _this.calcRenderedPlaceHolder();\n });\n return _this;\n }\n QuestionTextModel.prototype.isTextValue = function () {\n return [\"text\", \"number\", \"password\"].indexOf(this.inputType) > -1;\n };\n QuestionTextModel.prototype.getType = function () {\n return \"text\";\n };\n QuestionTextModel.prototype.onSurveyLoad = function () {\n _super.prototype.onSurveyLoad.call(this);\n this.setRenderedMinMax();\n this.updateInputSize();\n };\n Object.defineProperty(QuestionTextModel.prototype, \"inputType\", {\n /**\n * Use this property to change the default input type.\n */\n get: function () {\n return this.getPropertyValue(\"inputType\");\n },\n set: function (val) {\n val = val.toLowerCase();\n if (val == \"datetime_local\")\n val = \"datetime-local\";\n this.setPropertyValue(\"inputType\", val.toLowerCase());\n if (!this.isLoadingFromJson) {\n this.min = undefined;\n this.max = undefined;\n this.step = undefined;\n }\n },\n enumerable: false,\n configurable: true\n });\n QuestionTextModel.prototype.runCondition = function (values, properties) {\n _super.prototype.runCondition.call(this, values, properties);\n if (!!this.minValueExpression || !!this.maxValueExpression) {\n this.setRenderedMinMax(values, properties);\n }\n };\n QuestionTextModel.prototype.getValidators = function () {\n var validators = _super.prototype.getValidators.call(this);\n if (this.inputType === \"email\" &&\n !this.validators.some(function (v) { return v.getType() === \"emailvalidator\"; })) {\n validators.push(new _validator__WEBPACK_IMPORTED_MODULE_4__[\"EmailValidator\"]());\n }\n return validators;\n };\n QuestionTextModel.prototype.isLayoutTypeSupported = function (layoutType) {\n return true;\n };\n Object.defineProperty(QuestionTextModel.prototype, \"size\", {\n /**\n * The text input size\n */\n get: function () {\n return this.getPropertyValue(\"size\");\n },\n set: function (val) {\n this.setPropertyValue(\"size\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"isTextInput\", {\n get: function () {\n return ([\"text\", \"search\", \"tel\", \"url\", \"email\", \"password\"].indexOf(this.inputType) > -1);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"inputSize\", {\n get: function () {\n return this.getPropertyValue(\"inputSize\", 0);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"inputWidth\", {\n get: function () {\n return this.getPropertyValue(\"inputWidth\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionTextModel.prototype.updateInputSize = function () {\n var size = this.isTextInput && this.size > 0 ? this.size : 0;\n if (this.isTextInput &&\n size < 1 &&\n this.parent &&\n !!this.parent[\"itemSize\"]) {\n size = this.parent[\"itemSize\"];\n }\n this.setPropertyValue(\"inputSize\", size);\n this.setPropertyValue(\"inputWidth\", size > 0 ? \"auto\" : \"\");\n };\n Object.defineProperty(QuestionTextModel.prototype, \"autoComplete\", {\n /**\n * Text auto complete\n */\n get: function () {\n return this.getPropertyValue(\"autoComplete\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"autoComplete\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"min\", {\n /**\n * The minimum value\n */\n get: function () {\n return this.getPropertyValue(\"min\");\n },\n set: function (val) {\n if (this.isValueExpression(val)) {\n this.minValueExpression = val.substr(1);\n return;\n }\n this.setPropertyValue(\"min\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"max\", {\n /**\n * The maximum value\n */\n get: function () {\n return this.getPropertyValue(\"max\");\n },\n set: function (val) {\n if (this.isValueExpression(val)) {\n this.maxValueExpression = val.substr(1);\n return;\n }\n this.setPropertyValue(\"max\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"minValueExpression\", {\n /**\n * The minimum value that you can setup as expression, for example today(-1) = yesterday;\n */\n get: function () {\n return this.getPropertyValue(\"minValueExpression\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"minValueExpression\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"maxValueExpression\", {\n /**\n * The maximum value that you can setup as expression, for example today(1) = tomorrow;\n */\n get: function () {\n return this.getPropertyValue(\"maxValueExpression\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"maxValueExpression\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"renderedMin\", {\n get: function () {\n return this.getPropertyValue(\"renderedMin\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"renderedMax\", {\n get: function () {\n return this.getPropertyValue(\"renderedMax\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"minErrorText\", {\n /**\n * The text that shows when value is less than min property.\n * @see min\n * @see maxErrorText\n */\n get: function () {\n return this.getLocalizableStringText(\"minErrorText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_5__[\"surveyLocalization\"].getString(\"minError\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"minErrorText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"locMinErrorText\", {\n get: function () {\n return this.getLocalizableString(\"minErrorText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"maxErrorText\", {\n /**\n * The text that shows when value is greater than man property.\n * @see max\n * @see minErrorText\n */\n get: function () {\n return this.getLocalizableStringText(\"maxErrorText\", _surveyStrings__WEBPACK_IMPORTED_MODULE_5__[\"surveyLocalization\"].getString(\"maxError\"));\n },\n set: function (val) {\n this.setLocalizableStringText(\"maxErrorText\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"locMaxErrorText\", {\n get: function () {\n return this.getLocalizableString(\"maxErrorText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"isMinMaxType\", {\n /**\n * Readonly property that returns true if the current inputType allows to set min and max properties\n * @see inputType\n * @see min\n * @see max\n */\n get: function () {\n return minMaxTypes.indexOf(this.inputType) > -1;\n },\n enumerable: false,\n configurable: true\n });\n QuestionTextModel.prototype.onCheckForErrors = function (errors, isOnValueChanged) {\n _super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged);\n if (isOnValueChanged || this.canSetValueToSurvey())\n return;\n if (this.isValueLessMin) {\n errors.push(new _error__WEBPACK_IMPORTED_MODULE_6__[\"CustomError\"](this.getMinMaxErrorText(this.minErrorText, this.getCalculatedMinMax(this.renderedMin)), this));\n }\n if (this.isValueGreaterMax) {\n errors.push(new _error__WEBPACK_IMPORTED_MODULE_6__[\"CustomError\"](this.getMinMaxErrorText(this.maxErrorText, this.getCalculatedMinMax(this.renderedMax)), this));\n }\n };\n QuestionTextModel.prototype.canSetValueToSurvey = function () {\n if (!this.isMinMaxType)\n return true;\n if (this.isValueLessMin)\n return false;\n if (this.isValueGreaterMax)\n return false;\n return true;\n };\n QuestionTextModel.prototype.getMinMaxErrorText = function (errorText, value) {\n if (!value)\n return errorText;\n return errorText.replace(\"{0}\", value.toString());\n };\n Object.defineProperty(QuestionTextModel.prototype, \"isValueLessMin\", {\n get: function () {\n return (!this.isValueEmpty(this.renderedMin) &&\n this.getCalculatedMinMax(this.value) <\n this.getCalculatedMinMax(this.renderedMin));\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"isValueGreaterMax\", {\n get: function () {\n return (!this.isValueEmpty(this.renderedMax) &&\n this.getCalculatedMinMax(this.value) >\n this.getCalculatedMinMax(this.renderedMax));\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"isDateInputType\", {\n get: function () {\n return this.inputType === \"date\" || this.inputType === \"datetime-local\";\n },\n enumerable: false,\n configurable: true\n });\n QuestionTextModel.prototype.getCalculatedMinMax = function (minMax) {\n if (this.isValueEmpty(minMax))\n return minMax;\n return this.isDateInputType ? new Date(minMax) : minMax;\n };\n QuestionTextModel.prototype.setRenderedMinMax = function (values, properties) {\n var _this = this;\n if (values === void 0) { values = null; }\n if (properties === void 0) { properties = null; }\n this.setValueAndRunExpression(this.minValueExpression, this.min, function (val) {\n if (!val && _this.isDateInputType && !!_settings__WEBPACK_IMPORTED_MODULE_7__[\"settings\"].minDate) {\n val = _settings__WEBPACK_IMPORTED_MODULE_7__[\"settings\"].minDate;\n }\n _this.setPropertyValue(\"renderedMin\", val);\n }, values, properties);\n this.setValueAndRunExpression(this.maxValueExpression, this.max, function (val) {\n if (!val && _this.isDateInputType) {\n val = !!_settings__WEBPACK_IMPORTED_MODULE_7__[\"settings\"].maxDate ? _settings__WEBPACK_IMPORTED_MODULE_7__[\"settings\"].maxDate : \"2999-12-31\";\n }\n _this.setPropertyValue(\"renderedMax\", val);\n }, values, properties);\n };\n Object.defineProperty(QuestionTextModel.prototype, \"step\", {\n /**\n * The step value\n */\n get: function () {\n return this.getPropertyValue(\"step\");\n },\n set: function (val) {\n this.setPropertyValue(\"step\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"renderedStep\", {\n get: function () {\n return this.isValueEmpty(this.step) ? \"any\" : this.step;\n },\n enumerable: false,\n configurable: true\n });\n QuestionTextModel.prototype.supportGoNextPageAutomatic = function () {\n return [\"date\", \"datetime\", \"datetime-local\"].indexOf(this.inputType) < 0;\n };\n QuestionTextModel.prototype.supportGoNextPageError = function () {\n return [\"date\", \"datetime\", \"datetime-local\"].indexOf(this.inputType) < 0;\n };\n Object.defineProperty(QuestionTextModel.prototype, \"dataList\", {\n /**\n * The list of recommended options available to choose.\n */\n get: function () {\n return this.locDataList.value;\n },\n set: function (val) {\n this.locDataList.value = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"locDataList\", {\n get: function () {\n return this.locDataListValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextModel.prototype, \"dataListId\", {\n get: function () {\n return !this.locDataList.isEmpty ? this.id + \"_datalist\" : \"\";\n },\n enumerable: false,\n configurable: true\n });\n QuestionTextModel.prototype.canRunValidators = function (isOnValueChanged) {\n return (this.errors.length > 0 ||\n !isOnValueChanged ||\n this.supportGoNextPageError());\n };\n QuestionTextModel.prototype.setNewValue = function (newValue) {\n newValue = this.correctValueType(newValue);\n _super.prototype.setNewValue.call(this, newValue);\n };\n QuestionTextModel.prototype.correctValueType = function (newValue) {\n if (!newValue)\n return newValue;\n if (this.inputType == \"number\" || this.inputType == \"range\") {\n return _helpers__WEBPACK_IMPORTED_MODULE_3__[\"Helpers\"].isNumber(newValue) ? parseFloat(newValue) : \"\";\n }\n return newValue;\n };\n QuestionTextModel.prototype.getControlClass = function () {\n var cssClasses = this.cssClasses;\n var result = cssClasses.root +\n (this.errors.length > 0 ? \" \" + cssClasses.onError : \"\");\n if (this.isReadOnly) {\n result += \" \" + cssClasses.controlDisabled;\n }\n return result;\n };\n QuestionTextModel.prototype.hasPlaceHolder = function () {\n return !this.isReadOnly && this.inputType !== \"range\";\n };\n return QuestionTextModel;\n}(_question_textbase__WEBPACK_IMPORTED_MODULE_8__[\"QuestionTextBase\"]));\n\nvar minMaxTypes = [\n \"number\",\n \"range\",\n \"date\",\n \"datetime-local\",\n \"month\",\n \"time\",\n \"week\",\n];\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"text\", [\n {\n name: \"inputType\",\n default: \"text\",\n choices: [\n \"color\",\n \"date\",\n \"datetime\",\n \"datetime-local\",\n \"email\",\n \"month\",\n \"number\",\n \"password\",\n \"range\",\n \"tel\",\n \"text\",\n \"time\",\n \"url\",\n \"week\",\n ],\n },\n {\n name: \"size:number\",\n minValue: 0,\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n if (!obj)\n return false;\n return obj.isTextInput;\n },\n },\n {\n name: \"textUpdateMode\",\n default: \"default\",\n choices: [\"default\", \"onBlur\", \"onTyping\"],\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n if (!obj)\n return false;\n return obj.isTextInput;\n },\n },\n {\n name: \"autoComplete\",\n dataList: [\n \"name\",\n \"honorific-prefix\",\n \"given-name\",\n \"additional-name\",\n \"family-name\",\n \"honorific-suffix\",\n \"nickname\",\n \"organization-title\",\n \"username\",\n \"new-password\",\n \"current-password\",\n \"organization\",\n \"street-address\",\n \"address-line1\",\n \"address-line2\",\n \"address-line3\",\n \"address-level4\",\n \"address-level3\",\n \"address-level2\",\n \"address-level1\",\n \"country\",\n \"country-name\",\n \"postal-code\",\n \"cc-name\",\n \"cc-given-name\",\n \"cc-additional-name\",\n \"cc-family-name\",\n \"cc-number\",\n \"cc-exp\",\n \"cc-exp-month\",\n \"cc-exp-year\",\n \"cc-csc\",\n \"cc-type\",\n \"transaction-currency\",\n \"transaction-amount\",\n \"language\",\n \"bday\",\n \"bday-day\",\n \"bday-month\",\n \"bday-year\",\n \"sex\",\n \"url\",\n \"photo\",\n \"tel\",\n \"tel-country-code\",\n \"tel-national\",\n \"tel-area-code\",\n \"tel-local\",\n \"tel-local-prefix\",\n \"tel-local-suffix\",\n \"tel-extension\",\n \"email\",\n \"impp\",\n ],\n },\n {\n name: \"min\",\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n return !!obj && obj.isMinMaxType;\n },\n onPropertyEditorUpdate: function (obj, propertyEditor) {\n propertyEditor.inputType = obj.inputType;\n },\n },\n {\n name: \"max\",\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n return !!obj && obj.isMinMaxType;\n },\n onPropertyEditorUpdate: function (obj, propertyEditor) {\n propertyEditor.inputType = obj.inputType;\n },\n },\n {\n name: \"minValueExpression:expression\",\n category: \"logic\",\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n return !!obj && obj.isMinMaxType;\n },\n },\n {\n name: \"maxValueExpression:expression\",\n category: \"logic\",\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n return !!obj && obj.isMinMaxType;\n },\n },\n {\n name: \"minErrorText\",\n serializationProperty: \"locMinErrorText\",\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n return !!obj && obj.isMinMaxType;\n },\n },\n {\n name: \"maxErrorText\",\n serializationProperty: \"locMaxErrorText\",\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n return !!obj && obj.isMinMaxType;\n },\n },\n {\n name: \"step:number\",\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n if (!obj)\n return false;\n return obj.inputType === \"number\";\n },\n },\n {\n name: \"maxLength:number\",\n default: -1,\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n if (!obj)\n return false;\n return obj.isTextInput;\n },\n },\n {\n name: \"placeHolder\",\n serializationProperty: \"locPlaceHolder\",\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n if (!obj)\n return false;\n return obj.isTextInput;\n },\n },\n {\n name: \"dataList:string[]\",\n serializationProperty: \"locDataList\",\n dependsOn: \"inputType\",\n visibleIf: function (obj) {\n if (!obj)\n return false;\n return obj.inputType === \"text\";\n },\n },\n], function () {\n return new QuestionTextModel(\"\");\n}, \"textbase\");\n_questionfactory__WEBPACK_IMPORTED_MODULE_0__[\"QuestionFactory\"].Instance.registerQuestion(\"text\", function (name) {\n return new QuestionTextModel(name);\n});\n\n\n/***/ }),\n\n/***/ \"./src/question_textbase.ts\":\n/*!**********************************!*\\\n !*** ./src/question_textbase.ts ***!\n \\**********************************/\n/*! exports provided: QuestionTextBase */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionTextBase\", function() { return QuestionTextBase; });\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n/**\n * A Base Model for a comment and text questions\n */\nvar QuestionTextBase = /** @class */ (function (_super) {\n __extends(QuestionTextBase, _super);\n function QuestionTextBase(name) {\n var _this = _super.call(this, name) || this;\n _this.createLocalizableString(\"placeHolder\", _this);\n return _this;\n }\n QuestionTextBase.prototype.isTextValue = function () {\n return true;\n };\n Object.defineProperty(QuestionTextBase.prototype, \"maxLength\", {\n /**\n * The maximum text length. If it is -1, defaul value, then the survey maxTextLength property will be used.\n * If it is 0, then the value is unlimited\n * @see SurveyModel.maxTextLength\n */\n get: function () {\n return this.getPropertyValue(\"maxLength\");\n },\n set: function (val) {\n this.setPropertyValue(\"maxLength\", val);\n },\n enumerable: false,\n configurable: true\n });\n QuestionTextBase.prototype.getMaxLength = function () {\n return _helpers__WEBPACK_IMPORTED_MODULE_2__[\"Helpers\"].getMaxLength(this.maxLength, this.survey ? this.survey.maxTextLength : -1);\n };\n Object.defineProperty(QuestionTextBase.prototype, \"placeHolder\", {\n /**\n * Use this property to set the input place holder.\n */\n get: function () {\n return this.getLocalizableStringText(\"placeHolder\");\n },\n set: function (val) {\n this.setLocalizableStringText(\"placeHolder\", val);\n this.calcRenderedPlaceHolder();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextBase.prototype, \"locPlaceHolder\", {\n get: function () {\n return this.getLocalizableString(\"placeHolder\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionTextBase.prototype.getType = function () {\n return \"textbase\";\n };\n QuestionTextBase.prototype.isEmpty = function () {\n return _super.prototype.isEmpty.call(this) || this.value === \"\";\n };\n Object.defineProperty(QuestionTextBase.prototype, \"textUpdateMode\", {\n /**\n * Gets or sets a value that specifies how the question updates it's value.\n *\n * The following options are available:\n * - `default` - get the value from survey.textUpdateMode\n * - `onBlur` - the value is updated after an input loses the focus.\n * - `onTyping` - update the value of text questions, \"text\" and \"comment\", on every key press.\n *\n * Note, that setting to \"onTyping\" may lead to a performance degradation, in case you have many expressions in the survey.\n * @see survey.textUpdateMode\n */\n get: function () {\n return this.getPropertyValue(\"textUpdateMode\");\n },\n set: function (val) {\n this.setPropertyValue(\"textUpdateMode\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextBase.prototype, \"isSurveyInputTextUpdate\", {\n get: function () {\n if (this.textUpdateMode == \"default\")\n return !!this.survey ? this.survey.isUpdateValueTextOnTyping : false;\n return this.textUpdateMode == \"onTyping\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextBase.prototype, \"renderedPlaceHolder\", {\n get: function () {\n return this.getPropertyValue(\"renderedPlaceHolder\");\n },\n enumerable: false,\n configurable: true\n });\n QuestionTextBase.prototype.setRenderedPlaceHolder = function (val) {\n this.setPropertyValue(\"renderedPlaceHolder\", val);\n };\n QuestionTextBase.prototype.onReadOnlyChanged = function () {\n _super.prototype.onReadOnlyChanged.call(this);\n this.calcRenderedPlaceHolder();\n };\n QuestionTextBase.prototype.endLoadingFromJson = function () {\n _super.prototype.endLoadingFromJson.call(this);\n this.calcRenderedPlaceHolder();\n };\n QuestionTextBase.prototype.calcRenderedPlaceHolder = function () {\n this.setRenderedPlaceHolder(this.hasPlaceHolder() ? this.placeHolder : undefined);\n };\n QuestionTextBase.prototype.hasPlaceHolder = function () {\n return !this.isReadOnly;\n };\n return QuestionTextBase;\n}(_question__WEBPACK_IMPORTED_MODULE_0__[\"Question\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"textbase\", [], function () {\n return new QuestionTextBase(\"\");\n}, \"question\");\n\n\n/***/ }),\n\n/***/ \"./src/questionfactory.ts\":\n/*!********************************!*\\\n !*** ./src/questionfactory.ts ***!\n \\********************************/\n/*! exports provided: QuestionFactory, ElementFactory */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionFactory\", function() { return QuestionFactory; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ElementFactory\", function() { return ElementFactory; });\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n\n\n//TODO replace completely with ElementFactory\nvar QuestionFactory = /** @class */ (function () {\n function QuestionFactory() {\n this.creatorHash = {};\n }\n Object.defineProperty(QuestionFactory, \"DefaultChoices\", {\n get: function () {\n return [\n _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"choices_Item\") + \"1\",\n _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"choices_Item\") + \"2\",\n _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"choices_Item\") + \"3\",\n ];\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFactory, \"DefaultColums\", {\n get: function () {\n var colName = _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"matrix_column\") + \" \";\n return [colName + \"1\", colName + \"2\", colName + \"3\"];\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFactory, \"DefaultRows\", {\n get: function () {\n var rowName = _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"matrix_row\") + \" \";\n return [rowName + \"1\", rowName + \"2\"];\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionFactory, \"DefaultMutlipleTextItems\", {\n get: function () {\n var itemName = _surveyStrings__WEBPACK_IMPORTED_MODULE_0__[\"surveyLocalization\"].getString(\"multipletext_itemname\");\n return [itemName + \"1\", itemName + \"2\"];\n },\n enumerable: false,\n configurable: true\n });\n QuestionFactory.prototype.registerQuestion = function (questionType, questionCreator) {\n this.creatorHash[questionType] = questionCreator;\n };\n QuestionFactory.prototype.unregisterElement = function (elementType) {\n delete this.creatorHash[elementType];\n };\n QuestionFactory.prototype.clear = function () {\n this.creatorHash = {};\n };\n QuestionFactory.prototype.getAllTypes = function () {\n var result = new Array();\n for (var key in this.creatorHash) {\n result.push(key);\n }\n return result.sort();\n };\n QuestionFactory.prototype.createQuestion = function (questionType, name) {\n var creator = this.creatorHash[questionType];\n if (creator == null)\n return null;\n return creator(name);\n };\n QuestionFactory.Instance = new QuestionFactory();\n return QuestionFactory;\n}());\n\nvar ElementFactory = /** @class */ (function () {\n function ElementFactory() {\n this.creatorHash = {};\n }\n ElementFactory.prototype.registerElement = function (elementType, elementCreator) {\n this.creatorHash[elementType] = elementCreator;\n };\n ElementFactory.prototype.clear = function () {\n this.creatorHash = {};\n };\n ElementFactory.prototype.unregisterElement = function (elementType, removeFromSerializer) {\n if (removeFromSerializer === void 0) { removeFromSerializer = false; }\n delete this.creatorHash[elementType];\n QuestionFactory.Instance.unregisterElement(elementType);\n if (removeFromSerializer) {\n _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].removeClass(elementType);\n }\n };\n ElementFactory.prototype.getAllTypes = function () {\n var result = QuestionFactory.Instance.getAllTypes();\n for (var key in this.creatorHash) {\n result.push(key);\n }\n return result.sort();\n };\n ElementFactory.prototype.createElement = function (elementType, name) {\n var creator = this.creatorHash[elementType];\n if (creator == null)\n return QuestionFactory.Instance.createQuestion(elementType, name);\n return creator(name);\n };\n ElementFactory.Instance = new ElementFactory();\n return ElementFactory;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/questionnonvalue.ts\":\n/*!*********************************!*\\\n !*** ./src/questionnonvalue.ts ***!\n \\*********************************/\n/*! exports provided: QuestionNonValue */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionNonValue\", function() { return QuestionNonValue; });\n/* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./question */ \"./src/question.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n/**\n * A Model for non value question. This question doesn't add any new functionality. It hides some properties, including the value.\n */\nvar QuestionNonValue = /** @class */ (function (_super) {\n __extends(QuestionNonValue, _super);\n function QuestionNonValue(name) {\n return _super.call(this, name) || this;\n }\n QuestionNonValue.prototype.getType = function () {\n return \"nonvalue\";\n };\n Object.defineProperty(QuestionNonValue.prototype, \"hasInput\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionNonValue.prototype, \"hasTitle\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionNonValue.prototype.getTitleLocation = function () {\n return \"\";\n };\n Object.defineProperty(QuestionNonValue.prototype, \"hasComment\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n QuestionNonValue.prototype.hasErrors = function (fireCallback, rec) {\n if (fireCallback === void 0) { fireCallback = true; }\n if (rec === void 0) { rec = null; }\n return false;\n };\n QuestionNonValue.prototype.getAllErrors = function () {\n return [];\n };\n QuestionNonValue.prototype.supportGoNextPageAutomatic = function () {\n return false;\n };\n QuestionNonValue.prototype.addConditionObjectsByContext = function (objects, context) { };\n QuestionNonValue.prototype.getConditionJson = function (operator, path) {\n if (operator === void 0) { operator = null; }\n if (path === void 0) { path = null; }\n return null;\n };\n return QuestionNonValue;\n}(_question__WEBPACK_IMPORTED_MODULE_0__[\"Question\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"nonvalue\", [\n { name: \"title\", visible: false },\n { name: \"description\", visible: false },\n { name: \"valueName\", visible: false },\n { name: \"enableIf\", visible: false },\n { name: \"defaultValue\", visible: false },\n { name: \"correctAnswer\", visible: false },\n { name: \"isRequired\", visible: false, isSerializable: false },\n { name: \"requiredErrorText\", visible: false },\n { name: \"readOnly\", visible: false },\n { name: \"requiredIf\", visible: false },\n { name: \"validators\", visible: false },\n { name: \"titleLocation\", visible: false },\n { name: \"useDisplayValuesInTitle\", visible: false },\n], function () {\n return new QuestionNonValue(\"\");\n}, \"question\");\n\n\n/***/ }),\n\n/***/ \"./src/rendererFactory.ts\":\n/*!********************************!*\\\n !*** ./src/rendererFactory.ts ***!\n \\********************************/\n/*! exports provided: RendererFactory */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RendererFactory\", function() { return RendererFactory; });\nvar RendererFactory = /** @class */ (function () {\n function RendererFactory() {\n this.renderersHash = {};\n }\n RendererFactory.prototype.unregisterRenderer = function (questionType, rendererAs) {\n delete this.renderersHash[questionType][rendererAs];\n };\n RendererFactory.prototype.registerRenderer = function (questionType, renderAs, renderer) {\n if (!this.renderersHash[questionType]) {\n this.renderersHash[questionType] = {};\n }\n this.renderersHash[questionType][renderAs] = renderer;\n };\n RendererFactory.prototype.getRenderer = function (questionType, renderAs) {\n return ((this.renderersHash[questionType] &&\n this.renderersHash[questionType][renderAs]) ||\n \"default\");\n };\n RendererFactory.prototype.getRendererByQuestion = function (question) {\n return this.getRenderer(question.getType(), question.renderAs);\n };\n RendererFactory.prototype.clear = function () {\n this.renderersHash = {};\n };\n RendererFactory.Instance = new RendererFactory();\n return RendererFactory;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/settings.ts\":\n/*!*************************!*\\\n !*** ./src/settings.ts ***!\n \\*************************/\n/*! exports provided: settings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"settings\", function() { return settings; });\n/**\n * Global survey settings\n */\nvar settings = {\n /**\n * The prefix that uses to store the question comment, as {questionName} + {commentPrefix}.\n * The default\n */\n commentPrefix: \"-Comment\",\n /**\n * Encode parameter on calling restful web API\n */\n webserviceEncodeParameters: true,\n /**\n * Cache the result for choices getting from web services. Set this property to false, to disable the caching.\n */\n useCachingForChoicesRestful: true,\n get useCachingForChoicesRestfull() {\n return settings.useCachingForChoicesRestful;\n },\n set useCachingForChoicesRestfull(val) {\n settings.useCachingForChoicesRestful = val;\n },\n /**\n * SurveyJS web service API url\n */\n surveyServiceUrl: \"https://api.surveyjs.io/public/v1/Survey\",\n /**\n * separator that can allow to set value and text of ItemValue object in one string as: \"value|text\"\n */\n itemValueSeparator: \"|\",\n /**\n * default locale name for localizable strings that uses during serialization, {\"default\": \"My text\", \"de\": \"Mein Text\"}\n */\n defaultLocaleName: \"default\",\n /**\n * Default row name for matrix (single choice)\n */\n matrixDefaultRowName: \"default\",\n /**\n * Default cell type for dropdown and dynamic matrices\n */\n matrixDefaultCellType: \"dropdown\",\n /**\n * Total value postfix for dropdown and dynamic matrices. The total value stores as: {matrixName} + {postfix}\n */\n matrixTotalValuePostFix: \"-total\",\n /**\n * Maximum row count in dynamic matrix\n */\n matrixMaximumRowCount: 1000,\n /**\n * Maximum rowCount that returns in addConditionObjectsByContext function\n */\n matrixMaxRowCountInCondition: 1,\n /**\n * Maximum panel count in dynamic panel\n */\n panelMaximumPanelCount: 100,\n /**\n * Maximum rate value count in rating question\n */\n ratingMaximumRateValueCount: 20,\n /**\n * Disable the question while choices are getting from the web service\n */\n disableOnGettingChoicesFromWeb: false,\n /**\n * Set to true to always serialize the localization string as object even if there is only one value for default locale. Instead of string \"MyStr\" serialize as {default: \"MyStr\"}\n */\n serializeLocalizableStringAsObject: false,\n /**\n * Set to false to hide empty page title and description in design mode\n */\n allowShowEmptyTitleInDesignMode: true,\n /**\n * Set to false to hide empty page description in design mode\n */\n allowShowEmptyDescriptionInDesignMode: true,\n /**\n * Set this property to true to execute the complete trigger on value change instead of on next page.\n */\n executeCompleteTriggerOnValueChanged: false,\n /**\n * Set this property to false to execute the skip trigger on next page instead of on value change.\n */\n executeSkipTriggerOnValueChanged: true,\n /**\n * Set this property to change readOnlyCommentRenderMode: \"textarea\" (default) or (div)\n */\n readOnlyCommentRenderMode: \"textarea\",\n /**\n * Override this function, set your function, if you want to show your own dialog confirm window instead of standard browser window.\n * @param message\n */\n confirmActionFunc: function (message) {\n return confirm(message);\n },\n /**\n * Set this property to change the default value of the minWidth constraint\n */\n minWidth: \"300px\",\n /**\n * Set this property to change the default value of the minWidth constraint\n */\n maxWidth: \"initial\",\n /**\n * This property tells how many times survey re-run expressions on value changes during condition running. We need it to avoid recursions in the expressions\n */\n maximumConditionRunCountOnValueChanged: 10,\n /**\n * By default visibleIndex for question with titleLocation = \"hidden\" is -1, and survey doesn't count these questions when set questions numbers.\n * Set it true, and a question next to a question with hidden title will increase it's number.\n */\n setQuestionVisibleIndexForHiddenTitle: false,\n /**\n * By default visibleIndex for question with hideNumber = true is -1, and survey doesn't count these questions when set questions numbers.\n * Set it true, and a question next to a question with hidden title number will increase it's number.\n */\n setQuestionVisibleIndexForHiddenNumber: false,\n /**\n * By default all rows are rendered no matters whwther they are visible.\n * Set it true, and survey markup rows will be rendered only if they are visible in viewport.\n * This feature is experimantal and might do not support all the use cases.\n */\n lazyRowsRendering: false,\n lazyRowsRenderingStartRow: 3,\n /**\n * By default checkbox and radiogroup items are ordered in rows.\n * Set it \"column\", and items will be ordered in columns.\n */\n showItemsInOrder: \"default\",\n /**\n * Supported validators by question types. You can modify this variable to add validators for new question types or add/remove for existing question types.\n */\n supportedValidators: {\n question: [\"expression\"],\n comment: [\"text\", \"regex\"],\n text: [\"numeric\", \"text\", \"regex\", \"email\"],\n checkbox: [\"answercount\"],\n },\n /**\n * Set the value as string \"yyyy-mm-dd\". text questions with inputType \"date\" will not allow to set to survey date that less than this value\n */\n minDate: \"\",\n /**\n * Set the value as string \"yyyy-mm-dd\". text questions with inputType \"date\" will not allow to set to survey date that greater than this value\n */\n maxDate: \"\",\n showModal: undefined,\n supportCreatorV2: false,\n /**\n * Specifies a list of custom icons.\n * Use this property to replace SurveyJS default icons (displayed in UI elements of SurveyJS Library or Creator) with your custom icons.\n * For every default icon to replace, add a key/value object with the default icon's name as a key and the name of your custom icon as a value.\n * For example: Survey.settings.customIcons[\"icon-redo\"] = \"my-own-redo-icon\"\n */\n customIcons: {},\n};\n\n\n/***/ }),\n\n/***/ \"./src/stylesmanager.ts\":\n/*!******************************!*\\\n !*** ./src/stylesmanager.ts ***!\n \\******************************/\n/*! exports provided: StylesManager */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"StylesManager\", function() { return StylesManager; });\n/* harmony import */ var _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaultCss/cssstandard */ \"./src/defaultCss/cssstandard.ts\");\n\nvar StylesManager = /** @class */ (function () {\n function StylesManager() {\n this.sheet = null;\n if (StylesManager.Enabled) {\n this.sheet = StylesManager.findSheet(StylesManager.SurveyJSStylesSheetId);\n if (!this.sheet) {\n this.sheet = StylesManager.createSheet(StylesManager.SurveyJSStylesSheetId);\n this.initializeStyles(this.sheet);\n }\n }\n }\n StylesManager.findSheet = function (styleSheetId) {\n if (typeof document === \"undefined\")\n return null;\n for (var i = 0; i < document.styleSheets.length; i++) {\n if (!!document.styleSheets[i].ownerNode &&\n document.styleSheets[i].ownerNode[\"id\"] === styleSheetId) {\n return document.styleSheets[i];\n }\n }\n return null;\n };\n StylesManager.createSheet = function (styleSheetId) {\n var style = document.createElement(\"style\");\n style.id = styleSheetId;\n // Add a media (and/or media query) here if you'd like!\n // style.setAttribute(\"media\", \"screen\")\n // style.setAttribute(\"media\", \"only screen and (max-width : 1024px)\")\n style.appendChild(document.createTextNode(\"\"));\n document.head.appendChild(style);\n return style.sheet;\n };\n StylesManager.applyTheme = function (themeName, themeSelector) {\n if (themeName === void 0) { themeName = \"default\"; }\n if (themeSelector === void 0) { themeSelector = \".sv_main\"; }\n var ThemeCss;\n if (themeName === \"modern\")\n themeSelector = \".sv-root-modern \";\n if ([\"bootstrap\", \"bootstrapmaterial\", \"modern\"].indexOf(themeName) !== -1) {\n ThemeCss = StylesManager[themeName + \"ThemeCss\"];\n _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_0__[\"surveyCss\"].currentType = themeName;\n }\n else {\n ThemeCss = StylesManager.ThemeCss;\n _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_0__[\"surveyCss\"].currentType = \"standard\";\n }\n if (StylesManager.Enabled) {\n var sheet_1 = StylesManager.findSheet(themeName + themeSelector);\n if (!sheet_1) {\n sheet_1 = StylesManager.createSheet(themeName + themeSelector);\n var theme_1 = StylesManager.ThemeColors[themeName] ||\n StylesManager.ThemeColors[\"default\"];\n Object.keys(ThemeCss).forEach(function (selector) {\n var cssRuleText = ThemeCss[selector];\n Object.keys(theme_1).forEach(function (colorVariableName) {\n return (cssRuleText = cssRuleText.replace(new RegExp(\"\\\\\" + colorVariableName, \"g\"), theme_1[colorVariableName]));\n });\n try {\n sheet_1.insertRule(themeSelector + selector + \" { \" + cssRuleText + \" }\", 0);\n }\n catch (e) { }\n });\n }\n }\n };\n StylesManager.prototype.initializeStyles = function (sheet) {\n if (StylesManager.Enabled) {\n Object.keys(StylesManager.Styles).forEach(function (selector) {\n try {\n sheet.insertRule(selector + \" { \" + StylesManager.Styles[selector] + \" }\", 0);\n }\n catch (e) { }\n });\n Object.keys(StylesManager.Media).forEach(function (selector) {\n try {\n sheet.insertRule(StylesManager.Media[selector].media +\n \" { \" +\n selector +\n \" { \" +\n StylesManager.Media[selector].style +\n \" } }\", 0);\n }\n catch (e) { }\n });\n }\n };\n StylesManager.SurveyJSStylesSheetId = \"surveyjs-styles\";\n StylesManager.Styles = {\n // \".sv_bootstrap_css\":\n // \"position: relative; width: 100%; background-color: #f4f4f4\",\n // \".sv_bootstrap_css .sv_custom_header\":\n // \"position: absolute; width: 100%; height: 275px; background-color: #e7e7e7;\",\n // \".sv_bootstrap_css .sv_container\":\n // \"max-width: 80%; margin: auto; position: relative; color: #6d7072; padding: 0 1em;\",\n // \".sv_bootstrap_css .panel-body\":\n // \"background-color: white; padding: 1em 1em 5em 1em; border-top: 2px solid lightgray;\",\n \".sv_main span\": \"word-break: break-word;\",\n \".sv_main legend\": \"border: none; margin: 0;\",\n \".sv_bootstrap_css .sv_qstn\": \"padding: 0.5em 1em 1.5em 1em;\",\n \".sv_bootstrap_css .sv_qcbc input[type=checkbox], .sv_bootstrap_css .sv_qcbc input[type=radio]\": \"vertical-align: middle; margin-top: -1px\",\n \".sv_bootstrap_css .sv_qstn fieldset\": \"display: block;\",\n \".sv_bootstrap_css .sv_qstn .sv_q_checkbox_inline, .sv_bootstrap_css .sv_qstn .sv_q_radiogroup_inline\": \"display: inline-block;\",\n \".sv_bootstrap_css .sv-paneldynamic__progress-container \": \"position: relative; margin-right: 250px; margin-left: 40px; margin-top: 10px;\",\n \".sv_main.sv_bootstrapmaterial_css .sv_q_radiogroup_control_label\": \"display: inline; position: static;\",\n \".sv_main.sv_bootstrapmaterial_css .checkbox\": \"margin-top:10px;margin-bottom:10px;\",\n \".sv_row\": \"clear: both; min-width:300px;\",\n \".sv_row .sv_qstn\": \"float: left\",\n \".sv_row .sv_qstn:last-child\": \"float: none\",\n \".sv_qstn\": \"display: vertical-align: top; overflow: auto; min-width:300px;\",\n \".sv_p_container\": \"display: vertical-align: top; min-width:300px;\",\n \".sv_q_title .sv_question_icon\": \"float: right; margin-right: 1em;\",\n \".sv_q_title .sv_question_icon::before\": \"content: ''; background-repeat: no-repeat; background-position: center; padding: 0.5em; display: inline-block; background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAxMCAxMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTAgMTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM2RDcwNzI7fQ0KPC9zdHlsZT4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMiwyIDAsNCA1LDkgMTAsNCA4LDIgNSw1ICIvPg0KPC9zdmc+DQo=);\",\n \".sv_q_title .sv_question_icon.sv_expanded::before\": \"transform: rotate(180deg);\",\n \".sv_qbln .checkbox-material\": \"margin-right: 3px;\",\n \".sv_qcbx .checkbox-material\": \"margin-right: 5px;\",\n \".sv_qcbx .checkbox label\": \"justify-content: left; display: inline-block;\",\n \".sv_qstn .radio label\": \"justify-content: left; display: inline-block;\",\n \".sv_qstn .sv_q_imgsel > label img\": \"pointer-events: none;\",\n \".sv_qstn .sv_q_imgsel.sv_q_imagepicker_inline\": \"display: inline-block;\",\n \".sv_qstn label.sv_q_m_label\": \"position: absolute; margin: 0; display: block; width: 100%;\",\n \".sv_qstn td\": \"position: relative;\",\n \".sv_q_mt_item_value\": \"float: left;\",\n '[dir=\"rtl\"] .sv_q_mt_item_value': \"float: right;\",\n \".sv_qstn.sv_qstn_left\": \"margin-top: 0.75em;\",\n \".sv_qstn .title-left\": \"float: left; margin-right: 1em;\",\n '[dir=\"rtl\"] .sv_qstn .title-left': \"float: right; margin-left: 1em;\",\n \".sv_qstn .content-left\": \"overflow: hidden\",\n \".sv_q_radiogroup_inline .sv_q_radiogroup_other\": \"display: inline-block;\",\n \".sv_q_checkbox_inline .sv_q_checkbox_other\": \"display: inline-block;\",\n \".sv_q_checkbox_inline, .sv_q_radiogroup_inline, .sv_q_imagepicker_inline\": \"line-height: 2.5em;\",\n \".form-inline .sv_q_checkbox_inline:not(:last-child)\": \"margin-right: 1em;\",\n \".form-inline .sv_q_radiogroup_inline:not(:last-child)\": \"margin-right: 1em;\",\n \".sv_imgsel .sv_q_imagepicker_inline:not(:last-child)\": \"margin-right: 1em;\",\n \".sv_qstn fieldset\": \"border: none; margin: 0; padding: 0;\",\n \".sv_qstn .sv_q_file_placeholder\": \"display:none\",\n \".sv_p_title\": \"padding-left: 1em; padding-bottom: 0.3em;\",\n \".sv_p_title_expandable\": \"cursor: pointer;\",\n \".sv_q_title_expandable\": \"cursor: pointer;\",\n \".sv_p_title .sv_panel_icon\": \"float: right; margin-right: 1em;\",\n \".sv_p_title .sv_panel_icon::before\": \"content: ''; background-repeat: no-repeat; background-position: center; padding: 0.5em; display: inline-block; background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAxMCAxMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTAgMTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM2RDcwNzI7fQ0KPC9zdHlsZT4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMiwyIDAsNCA1LDkgMTAsNCA4LDIgNSw1ICIvPg0KPC9zdmc+DQo=);\",\n \".sv_p_title .sv_panel_icon.sv_expanded::before\": \"transform: rotate(180deg);\",\n \".sv_p_footer\": \"padding-left: 1em; padding-bottom: 1em;padding-top: 1em;\",\n \".sv_matrix_cell_detail_button\": \"position: relative\",\n \".sv_detail_panel_icon\": \"display: block; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 14px; height: 14px;\",\n \".sv_detail_panel_icon::before\": \"content: ''; background-repeat: no-repeat; background-position: center; width: 14px; height: 14px; display: block; transform: rotate(270deg); background-image: url(\\\"data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 15 15' style='enable-background:new 0 0 15 15;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23FFFFFF;%7D%0A%3C/style%3E%3Cpolygon class='st0' points='14,5.5 12.6,4.1 7.5,9.1 2.4,4.1 1,5.5 7.5,12 '/%3E%3C/svg%3E%0A\\\");\",\n \".sv_detail_panel_icon.sv_detail_expanded::before\": \"transform: rotate(0deg)\",\n \".sv_matrix_empty_rows_section\": \"text-align: center; vertical-align: middle;\",\n \".sv_matrix_empty_rows_text\": \"padding:20px\",\n \".sv_q_file > input[type=file], .sv_q_file > button\": \"display: inline-block;\",\n \".sv_q_file_preview\": \"display: inline-block; vertical-align: top; border: 1px solid lightgray; padding: 5px; margin-top: 10px;\",\n \".sv_q_file_preview > a\": \"display: block; overflow: hidden; vertical-align: top; white-space: nowrap; text-overflow: ellipsis;\",\n \".sv_q_file_remove_button\": \"line-height: normal;\",\n \".sv_q_file_remove\": \"display: block; cursor: pointer;\",\n \".sv_q_m_cell_text\": \"cursor: pointer;\",\n \".sv_q_dd_other\": \"margin-top: 1em;\",\n \".sv_q_dd_other input\": \"width: 100%;\",\n \".sv_qstn .sv-q-col-1, .sv-question .sv-q-col-1\": \"width: 100%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;\",\n \".sv_qstn .sv-q-col-2, .sv-question .sv-q-col-2\": \"width: calc(50% - 1em); display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;\",\n \".sv_qstn .sv-q-col-3, .sv-question .sv-q-col-3\": \"width: calc(33.33333% - 1em); display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;\",\n \".sv_qstn .sv-q-col-4, .sv-question .sv-q-col-4\": \"width: calc(25% - 1em); display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;\",\n \".sv_qstn .sv-q-col-5, .sv-question .sv-q-col-5\": \"width: calc(20% - 1em); display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;\",\n \".sv_qstn .sv-q-column-1, .sv-question .sv-q-column-1\": \"width: 100%; max-width: 100%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;\",\n \".sv_qstn .sv-q-column-2, .sv-question .sv-q-column-2\": \"max-width: 50%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;\",\n \".sv_qstn .sv-q-column-3, .sv-question .sv-q-column-3\": \"max-width: 33.33333%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;\",\n \".sv_qstn .sv-q-column-4, .sv-question .sv-q-column-4\": \"max-width: 25%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;\",\n \".sv_qstn .sv-q-column-5, .sv-question .sv-q-column-5\": \"max-width: 20%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;\",\n \".sv_qstn .sv_q_file_input\": \"color: transparent;\",\n \".sv_qstn .sv_q_imgsel label > div\": \"overflow: hidden; white-space: nowrap; text-overflow: ellipsis; padding: 4px; border: 1px solid lightgray; border-radius: 4px;\",\n \".sv_qstn .sv_q_imgsel label > div > img, .sv_qstn .sv_q_imgsel label > div > embed\": \"display: block;\",\n \".sv_qstn table tr td .sv_q_m_cell_label\": \"position: absolute; left: 0; right: 0; top: 0; bottom: 0;\",\n \"f-panel\": \"padding: 0.5em 1em; display: inline-block; line-height: 2em;\",\n \".sv_progress_bar > span\": \"white-space: nowrap;\",\n //progress buttons\n \".sv_progress-buttons__container-center\": \"text-align: center;\",\n \".sv_progress-buttons__container\": \"display: inline-block; font-size:0; width: 100%; max-width: 1100px; white-space: nowrap; overflow: hidden;\",\n \".sv_progress-buttons__image-button-left\": \"display: inline-block; vertical-align: top; margin-top: 22px; font-size: 14px; width: 16px; height: 16px; cursor: pointer; background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAxNiAxNiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTYgMTY7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwb2x5Z29uIHBvaW50cz0iMTEsMTIgOSwxNCAzLDggOSwyIDExLDQgNyw4ICIvPg0KPC9zdmc+DQo=);\",\n \".sv_progress-buttons__image-button-right\": \"display: inline-block; vertical-align: top; margin-top: 22px; font-size: 14px; width: 16px; height: 16px; cursor: pointer; background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAxNiAxNiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTYgMTY7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwb2x5Z29uIHBvaW50cz0iNSw0IDcsMiAxMyw4IDcsMTQgNSwxMiA5LDggIi8+DQo8L3N2Zz4NCg==);\",\n \".sv_progress-buttons__image-button--hidden\": \"visibility: hidden;\",\n \".sv_progress-buttons__list-container\": \"max-width: calc(100% - 36px); display: inline-block; overflow: hidden;\",\n \".sv_progress-buttons__list\": \"display: inline-block; width: max-content; padding-left: 28px; padding-right: 28px; margin-top: 14px; margin-bottom: 14px;\",\n \".sv_progress-buttons__list li\": \"width: 138px; font-size: 14px; font-family: 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif; position: relative; text-align: center; vertical-align: top; display: inline-block;\",\n \".sv_progress-buttons__list li:before\": \"width: 24px; height: 24px; content: ''; line-height: 30px; border: 3px solid #8dd9ca; display: block; margin: 0 auto 10px auto; border-radius: 50%; box-sizing: content-box; background-color: #8dd9ca; cursor: pointer;\",\n \".sv_progress-buttons__list li:after\": \"width: 73%; height: 3px; content: ''; position: absolute; background-color: #d4d4d4; top: 15px; left: -36.5%;\",\n \".sv_progress-buttons__list li:first-child:after\": \"content: none;\",\n \".sv_progress-buttons__list .sv_progress-buttons__page-title\": \"width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: $text-color; font-weight: bold;\",\n \".sv_progress-buttons__list .sv_progress-buttons__page-description\": \"width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: $text-color;\",\n \".sv_progress-buttons__list li.sv_progress-buttons__list-element--passed:before\": \"border-color: #1ab394; background-color: #1ab394;\",\n \".sv_progress-buttons__list li.sv_progress-buttons__list-element--passed + li:after\": \"background-color: #8dd9ca;\",\n \".sv_progress-buttons__list li.sv_progress-buttons__list-element--current:before\": \"border-color: #1ab394; background-color: white;\",\n \".sv_progress-buttons__list li.sv_progress-buttons__list-element--passed.sv_progress-buttons__list-element--current:before\": \"border-color: #1ab394; background-color: white;\",\n \".sv_progress-buttons__list li.sv_progress-buttons__list-element--nonclickable:before\": \"cursor: not-allowed;\",\n // ranking\n \".sv-ranking\": \"outline: none;\",\n \".sv-ranking-item\": \"cursor: pointer; margin-bottom: 5px;position: relative;\",\n \".sv-ranking-item:focus .sv-ranking-item__icon--hover\": \"visibility: hidden;\",\n \".sv-ranking-item:hover .sv-ranking-item__icon--hover\": \"visibility: visible;\",\n \".sv-question--disabled .sv-ranking-item:hover .sv-ranking-item__icon--hover\": \"visibility: hidden;\",\n \".sv-ranking-item:focus\": \"outline: none;\",\n \".sv-ranking-item:focus .sv-ranking-item__icon--focus\": \"visibility: visible; top: 15px;\",\n \".sv-ranking-item:focus .sv-ranking-item__index\": \"background: white; border: 2px solid #19b394;\",\n \".sv-ranking-item__content\": \"display: inline-block;background-color: white;padding-top: 5px;padding-bottom: 5px;padding-left: 35px;padding-right: 10px; border-radius: 100px;\",\n \".sv-ranking-item__icon-container\": \"position: absolute;left: 0;top: 0;bottom: 0;width: 35px;\",\n \".sv-ranking-item__icon\": \"visibility: hidden;left:10px;top:20px;fill:#19b394;position: absolute;\",\n \".sv-ranking-item__index\": \"display: inline-block;padding: 10px 16px;background: rgba(25, 179, 148, 0.1);border-radius: 100px;border: 2px solid transparent; margin-right: 10px;\",\n \".sv-ranking-item__text\": \"display: inline-block;\",\n \".sv-ranking-item__ghost\": \"display: none;background: #f3f3f3;border-radius: 100px;width: 200px;height: 55px;z-index: 1;position: absolute;left: 35px;\",\n \".sv-ranking-item--ghost .sv-ranking-item__ghost\": \"display: block;\",\n \".sv-ranking-item--ghost .sv-ranking-item__content\": \"visibility: hidden;\",\n \".sv-ranking-item--drag .sv-ranking-item__content\": \"box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.1);border-radius: 100px;\",\n \".sv-ranking--drag .sv-ranking-item:hover .sv-ranking-item__icon\": \"visibility: hidden;\",\n \".sv-ranking-item--drag .sv-ranking-item__icon--hover\": \"visibility: visible;\",\n \".sv-ranking--mobile .sv-ranking-item__icon--hover\": \"visibility:visible; fill:#9f9f9f;\",\n \".sv-ranking--mobile.sv-ranking--drag .sv-ranking-item--ghost .sv-ranking-item__icon.sv-ranking-item__icon--hover\": \"visibility:hidden;\",\n \".sv_qstn .sv_q_select_column\": \"display: inline-block; vertical-align: top; min-width: 10%;\",\n \".sv_qstn .sv_q_select_column > *:not(.sv_technical)\": \"display: block;\",\n \".sv_main .sv_container .sv_body .sv_p_root .sv_qstn .sv_q_select_column textarea\": \"margin-left: 0; padding-left: 0; line-height: initial;\",\n \".sv_main .sv-hidden\": \"display: none !important;\",\n \".sv_main .sv-visuallyhidden\": \"position: absolute; height: 1px !important; width: 1px !important; overflow: hidden; clip: rect(1px 1px 1px 1px); clip: rect(1px, 1px, 1px, 1px);\",\n // paneldynamic progress\n \".sv_main .sv-progress\": \"height: 0.19em; background-color: $header-background-color; position: relative;\",\n \".sv_main .sv-progress__bar\": \"background-color: $main-color; height: 100%; position: relative;\",\n // EO paneldynamic progress\n // paneldynamic\n \".sv_main .sv-paneldynamic__progress-container\": \"position: relative; display: inline-block; width: calc(100% - 250px); margin-top: 20px;\",\n \".sv_main .sv-paneldynamic__add-btn\": \"float: right;\",\n \".sv_main .sv-paneldynamic__add-btn--list-mode\": \"float: none; margin-top: 0;\",\n \".sv_main .sv-paneldynamic__remove-btn\": \"margin-top: 1.25em;\",\n \".sv_main .sv-paneldynamic__remove-btn--right\": \"margin-top: 0; margin-left: 1.25em;\",\n \".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn\": \"box-sizing: border-box; display: inline-block; cursor: pointer; width: 0.7em; top: -0.28em; position: absolute;\",\n \".sv_main .sv-paneldynamic__prev-btn\": \"left: -1.3em; transform: rotate(90deg);\",\n \".sv_main .sv-paneldynamic__next-btn \": \"right: -1.3em; transform: rotate(270deg);\",\n \".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled\": \"cursor: auto;\",\n \".sv_main .sv-paneldynamic__progress-text\": \"font-weight: bold; font-size: 0.87em; margin-top: 0.69em; margin-left: 4em\",\n // EO paneldynamic\n //boolean\n \".sv_main .sv-boolean__switch\": \"display: inline-block; box-sizing: border-box; width: 63px; height: 24px; margin-right: 17px; margin-left: 21px; padding: 2px 3px; vertical-align: middle; border-radius: 12px; cursor: pointer;\",\n \".sv_main .sv-boolean__slider\": \"display: inline-block; width: 20px; height: 20px; transition-duration: .4s; transition-property: margin-left; border: none; border-radius: 100%;\",\n \".sv_main .sv-boolean__label\": \"vertical-align: middle; cursor: pointer;\",\n \".sv_main .sv-boolean--indeterminate .sv-boolean__slider\": \"margin-left: calc(50% - 10px);\",\n \".sv_main .sv-boolean--checked .sv-boolean__slider\": \"margin-left: calc(100% - 20px);\",\n \"[dir='rtl'] .sv-boolean__label \": \"float: right;\",\n \"[dir='rtl'] .sv-boolean--indeterminate .sv-boolean__slider\": \"margin-right: calc(50% - 0.625em);\",\n \"[dir='rtl'] .sv-boolean--checked .sv-boolean__slider\": \"margin-right: calc(100% - 1.25em);\",\n \"[dir='rtl'] .sv-boolean__switch\": \"float: right;\",\n \"[style*='direction:rtl'] .sv-boolean__label \": \"float: right;\",\n \"[style*='direction:rtl'] .sv-boolean--indeterminate .sv-boolean__slider\": \"margin-right: calc(50% - 0.625em);\",\n \"[style*='direction:rtl'] .sv-boolean--checked .sv-boolean__slider\": \"margin-right: calc(100% - 1.25em);\",\n \"[style*='direction:rtl'] .sv-boolean__switch\": \"float: right;\",\n // EO boolean\n \".sv_main .sv_q_num\": \"\",\n \".sv_main .sv_q_num + span\": \"\",\n // SignaturePad\n \".sv_main .sjs_sp_container\": \"position: relative; box-sizing: content-box;\",\n \".sv_main .sjs_sp_controls\": \"position: absolute; left: 0; bottom: 0;\",\n \".sv_main .sjs_sp_controls > button\": \"user-select: none;\",\n \".sv_main .sjs_sp_container>div>canvas:focus\": \"outline: none;\",\n \".sv_main .sjs_sp_placeholder\": \"display: flex; align-items: center; justify-content: center; position: absolute; z-index: 0; user-select: none; pointer-events: none; width: 100%; height: 100%;\",\n // logo\n // \".sv_main .sv_header\": \"white-space: nowrap;\",\n \".sv_main .sv_logo\": \"\",\n \".sv_main .sv-logo--left\": \"display: inline-block; vertical-align: top; margin-right: 2em;\",\n \".sv_main .sv-logo--right\": \"display: inline-block; vertical-align: top; margin-left: 2em; float: right;\",\n \".sv_main .sv-logo--right+.sv-logo--right-tail\": \"clear: both;\",\n \".sv_main .sv-logo--top\": \"display: block; width: 100%; text-align: center;\",\n \".sv_main .sv-logo--bottom\": \"display: block; width: 100%; text-align: center;\",\n \".sv_main .sv_header__text\": \"display: inline-block; vertical-align: top; max-width: 100%\",\n \".sv_main .sv-expand-action:before\": \"content: \\\"\\\"; display: inline-block; background-image: url(\\\"data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 10 10' style='enable-background:new 0 0 10 10;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23404040;%7D%0A%3C/style%3E%3Cpolygon class='st0' points='2,2 0,4 5,9 10,4 8,2 5,5 '/%3E%3C/svg%3E%0A\\\"); background-repeat: no-repeat; background-position: center center; height: 10px; width: 12px; margin: auto 8px;\",\n \".sv_main .sv-expand-action--expanded:before\": \"transform: rotate(180deg);\",\n \".sv_main .sv-action-bar\": \"display: flex; position: relative; align-items: center; margin-left: auto; padding: 0 0 0 16px; overflow: hidden; white-space: nowrap;\",\n \".sv_main .sv-action-bar-separator\": \"display: inline-block; width: 1px; height: 24px; vertical-align: middle; margin-right: 16px; background-color: #d6d6d6;\",\n \".sv_main .sv-action-bar-item\": \"-webkit-appearance: none; -moz-appearance: none; appearance: none; display: flex; height: 40px; padding: 8px; box-sizing: border-box; margin-right: 16px; border: none; border-radius: 2px; background-color: transparent; cursor: pointer; line-height: 24px; font-size: 16px; overflow-x: hidden; white-space: nowrap; min-width: auto; font-weight: normal\",\n \".sv_main .sv-action-bar-item__title\": \"vertical-align: middle; white-space: nowrap;\",\n \".sv_main .sv-action-bar-item__title--with-icon\": \"margin-left: 8px;\",\n \".sv_main .sv-action\": \"display: flex; align-items: center;\",\n \".sv_main .sv-action--hidden\": \"display: none;\",\n \".sv_main .sv-action-bar-item__icon svg\": \"display: block;\",\n \".sv_main .sv-action-bar-item:active\": \"opacity: 0.5;\",\n \".sv_main .sv-action-bar-item:focus\": \"outline: none;\",\n \".sv_main .sv-title-actions\": \"display: flex;align-items: center;\",\n \".sv_main .sv-title-actions__title\": \"flex-wrap: wrap; max-width: 90%; min-width: 50%;\",\n \".sv_main .sv-title-actions__bar\": \"min-width: 56px;\",\n \".sv_main .sv_matrix_cell_actions .sv-action-bar\": \"margin-left: 0; padding-left: 0;\",\n \".sv_main .sv_p_wrapper_in_row\": \"display: flex; flex-direction: row; align-items: center;\",\n \".sv_main .sv_p_remove_btn_right\": \"margin-left: 1em;\",\n //button-group\n \".sv_main .sv-button-group\": \"display: flex; align-items: center; flex-direction: row; font-size: 16px; height: 48px; overflow: auto;\",\n \".sv_main .sv-button-group__item\": \"display: flex; box-sizing: border-box; flex-direction: row; justify-content: center; align-items: center; width: 100%; padding: 11px 16px; line-height: 24px; border-width: 1px; border-style: solid; outline: none; font-size: 16px; font-weight: 400; cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\",\n \".sv_main .sv-button-group__item:not(:first-of-type)\": \"margin-left: -1px;\",\n \".sv_main .sv-button-group__item-icon\": \"display: block; height: 24px;\",\n \".sv_main .sv-button-group__item--selected\": \"font-weight: 600;\",\n \".sv_main .sv-button-group__item-decorator\": \"display: flex; align-items: center;\",\n \".sv_main .sv-button-group__item-icon + .sv-button-group__item-caption\": \"margin-left: 8px;\",\n \".sv_main .sv-button-group__item--disabled\": \"color: cursor: default;\",\n //eo button-group\n //popup\n \"sv-popup\": \"display: block; position: absolute; z-index: -1;\",\n \".sv-popup\": \"position: fixed; left: 0; top: 0; z-index: 1000; width: 100vw; height: 100vh; outline: none;\",\n \".sv-popup--modal\": \"display: flex; align-items: center; justify-content: center;\",\n \".sv-popup--modal .sv-popup__container\": \"position: static; filter: none; padding: calc(4 * 8px);\",\n \".sv-popup__container\": \"position: absolute; filter: drop-shadow(0px calc(1 * 8px) calc(2 * 8px) rgba(0, 0, 0, 0.1)); padding: calc(1 * 8px) 0; background: white; border-radius: 4px;\",\n \".sv-popup__scrolling-content\": \"max-width: 90vw; max-height: 90vh; overflow: auto;\",\n \".sv-popup__scrolling-content::-webkit-scrollbar\": \"height: 6px; width: 6px; background-color: #f3f3f3;\",\n \".sv-popup__scrolling-content::-webkit-scrollbar-thumb\": \"background: rgba(25, 179, 148, 0.1);\",\n \".sv-popup__content\": \"min-width: 100%;\",\n \".sv-popup--show-pointer.sv-popup--top\": \"transform: translateY(calc(-1 * 8px));\",\n \".sv-popup--show-pointer.sv-popup--top .sv-popup__pointer\": \"transform: translate(calc(-1 * 8px)) rotate(180deg);\",\n \".sv-popup--show-pointer.sv-popup--bottom\": \"transform: translateY(calc(1 * 8px));\",\n \".sv-popup--show-pointer.sv-popup--bottom .sv-popup__pointer\": \"transform: translate(calc(-1 * 8px), calc(-1 * 8px));\",\n \".sv-popup--show-pointer.sv-popup--right\": \"transform: translate(calc(1 * 8px));\",\n \".sv-popup--show-pointer.sv-popup--right .sv-popup__pointer\": \"transform: translate(-12px, -4px) rotate(-90deg);\",\n \".sv-popup--show-pointer.sv-popup--left\": \"transform: translate(calc(-1 * 8px));\",\n \".sv-popup--show-pointer.sv-popup--left .sv-popup__pointer\": \"transform: translate(-4px, -4px) rotate(90deg);\",\n \".sv-popup__pointer\": \"display: block; position: absolute;\",\n \".sv-popup__pointer:after\": \"content: ' '; display: block; width: 0; height: 0; border-left: calc(1 * 8px) solid transparent; border-right: calc(1 * 8px) solid transparent; border-bottom: calc(1 * 8px) solid white; align-self: center;\",\n \".sv-popup__footer\": \"display: flex; margin-top: calc(4 * 8px);\",\n \".sv-popup__footer-item:first-child\": \"margin-left: auto;\",\n \".sv-popup__footer-item + .sv-popup__footer-item\": \"margin-left: calc(1 * 8px);\",\n \".sv-popup__button\": \"padding: calc(2 * 8px) calc(6 * 8px); background: #fff; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15); border-radius: 4px; cursor: pointer; margin: 2px; font-family: 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-style: normal; font-weight: 600; font-size: calc(2 * 8px); line-height: calc(3 * 8px); text-align: center; color: #19b394; border: none; outline: none;\",\n \".sv-popup__button:hover\": \"box-shadow: 0 0 0 2px #19b394;\",\n \".sv-popup__button:disabled\": \"color: rgba(22, 22, 22, 0.16); cursor: default;\",\n \".sv-popup__button:disabled:hover\": \"box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15);\",\n \".sv-popup__button--apply\": \"background-color: #19b394; color: #fff;\",\n \".sv-popup__button--apply:disabled\": \"background-color: #f3f3f3;\",\n //eo popup\n //list\n \".sv-list\": \"display: flex; flex-direction: column; align-items: flex-start; padding: 0; margin: 0; background: #ffffff; font-family: 'Open Sans'; list-style-type: none;\",\n \".sv-list__item\": \"width: 100%; display: flex; align-items: center; box-sizing: border-box; padding: calc(1 * 8px) calc(2 * 8px); cursor: pointer;\",\n \".sv-list__item-icon\": \"float: left; width: calc(3 * 8px); height: calc(3 * 8px); margin-right: calc(2 * 8px);\",\n \".sv-list__item-icon svg\": \"display: block;\",\n \".sv-list__item-icon use\": \"fill: #909090;\",\n \".sv-list__item:not(.sv-list__item--selected):hover\": \"background-color: #f3f3f3;\",\n \".sv-list__item--selected\": \"background-color: #19b394; color: #fff;\",\n \".sv-list__item--selected .sv-list__item-icon use\": \"fill: #fff;\",\n \".sv-list__item--disabled\": \"color: rgba(22, 22, 22, 0.16); cursor: default; pointer-events: none;\",\n \".sv-list__item span\": \"white-space: nowrap;\",\n //eo list\n };\n StylesManager.Media = {\n \".sv_qstn fieldset .sv-q-col-1\": {\n style: \"width: 100%;\",\n media: \"@media only screen and (max-width: 480px)\",\n },\n \".sv_qstn fieldset .sv-q-col-2\": {\n style: \"width: 100%;\",\n media: \"@media only screen and (max-width: 480px)\",\n },\n \".sv_qstn fieldset .sv-q-col-3\": {\n style: \"width: 100%;\",\n media: \"@media only screen and (max-width: 480px)\",\n },\n \".sv_qstn fieldset .sv-q-col-4\": {\n style: \"width: 100%;\",\n media: \"@media only screen and (max-width: 480px)\",\n },\n \".sv_qstn fieldset .sv-q-col-5\": {\n style: \"width: 100%;\",\n media: \"@media only screen and (max-width: 480px)\",\n },\n \".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn\": {\n style: \"display: block; width: 100% !important;\",\n media: \"@media (max-width: 600px)\",\n },\n \".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .title-left\": {\n style: \"float: none;\",\n media: \"@media (max-width: 600px)\",\n },\n \".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_radiogroup_inline, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_checkbox_inline, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_imagepicker_inline\": {\n style: \"display: block;\",\n media: \"@media (max-width: 600px)\",\n },\n \".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table\": {\n style: \"display: block;\",\n media: \"@media (max-width: 600px)\",\n },\n \".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table thead\": {\n style: \"display: none;\",\n media: \"@media (max-width: 600px)\",\n },\n \".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table tbody, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table tr, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table td\": {\n style: \"display: block;\",\n media: \"@media (max-width: 600px)\",\n },\n \".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table:not(.sv_q_matrix) td:before\": {\n style: \"content: attr(title);\",\n media: \"@media (max-width: 600px)\",\n },\n \".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.sv_q_matrix td:after\": {\n style: \"content: attr(title); padding-left: 1em\",\n media: \"@media (max-width: 600px)\",\n },\n \".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .radio label, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .checkbox label\": {\n style: \"line-height: 12px; vertical-align: top;\",\n media: \"@media (max-width: 600px)\",\n },\n \".sv_qstn label.sv_q_m_label\": {\n style: \"display: inline;\",\n media: \"@media (max-width: 600px)\",\n },\n \".sv_main .sv_custom_header\": {\n style: \"display: none;\",\n media: \"@media (max-width: 1300px)\",\n },\n \".sv_main .sv_container .sv_header h3\": {\n style: \"font-size: 1.5em;\",\n media: \"@media (max-width: 1300px)\",\n },\n \".sv_main .sv_container .sv_header h3 span\": {\n style: \"font-size: 0.75em;\",\n media: \"@media (max-width: 700px)\",\n },\n \".sv_main.sv_bootstrap_css .sv-progress__text\": {\n style: \"margin-left: 8em;\",\n media: \"@media (min-width: 768px)\",\n },\n \".sv_row\": {\n style: \" display: flex; flex-wrap: wrap;\",\n media: \"@supports (display: flex)\",\n },\n \".sv-vue-row-additional-div\": {\n style: \" display: flex; flex-wrap: wrap; flex-basis: 100%; width: 100%;\",\n media: \"@supports (display: flex)\",\n },\n \".sv-row > .sv-row__panel, .sv-row__question:not(:last-child)\": {\n style: \"float: left;\",\n media: \"@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none)\",\n },\n \"[dir='rtl'],[style*='direction:rtl'] .sv-row__question:not(:last-child)\": {\n style: \"float: right;\",\n media: \"@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none)\",\n },\n \".sv-row > .sv-row__panel, .sv-row__question\": {\n style: \"width: 100% !important; padding-right: 0 !important;\",\n media: \"@media only screen and (max-width: 600px)\",\n },\n };\n StylesManager.ThemeColors = {\n default: {\n \"$header-background-color\": \"#e7e7e7\",\n \"$body-container-background-color\": \"#f4f4f4\",\n \"$main-color\": \"#1ab394\",\n \"$main-hover-color\": \"#0aa384\",\n \"$body-background-color\": \"white\",\n \"$inputs-background-color\": \"white\",\n \"$text-color\": \"#6d7072\",\n \"$text-input-color\": \"#6d7072\",\n \"$header-color\": \"#6d7072\",\n \"$border-color\": \"#e7e7e7\",\n \"$error-color\": \"#ed5565\",\n \"$error-background-color\": \"#fd6575\",\n \"$progress-text-color\": \"#9d9d9d\",\n \"$disable-color\": \"#dbdbdb\",\n \"$disabled-label-color\": \"rgba(64, 64, 64, 0.5)\",\n \"$slider-color\": \"white\",\n \"$disabled-switch-color\": \"#9f9f9f\",\n \"$disabled-slider-color\": \"#cfcfcf\",\n \"$foreground-light\": \"#909090\",\n \"$foreground-disabled\": \"#161616\",\n \"$background-dim\": \"#f3f3f3\",\n },\n orange: {\n \"$header-background-color\": \"#4a4a4a\",\n \"$body-container-background-color\": \"#f8f8f8\",\n \"$main-color\": \"#f78119\",\n \"$main-hover-color\": \"#e77109\",\n \"$body-background-color\": \"white\",\n \"$inputs-background-color\": \"white\",\n \"$text-color\": \"#4a4a4a\",\n \"$text-input-color\": \"#4a4a4a\",\n \"$header-color\": \"#f78119\",\n \"$border-color\": \"#e7e7e7\",\n \"$error-color\": \"#ed5565\",\n \"$error-background-color\": \"#fd6575\",\n \"$progress-text-color\": \"#9d9d9d\",\n \"$disable-color\": \"#dbdbdb\",\n \"$disabled-label-color\": \"rgba(64, 64, 64, 0.5)\",\n \"$slider-color\": \"white\",\n \"$disabled-switch-color\": \"#9f9f9f\",\n \"$disabled-slider-color\": \"#cfcfcf\",\n \"$foreground-light\": \"#909090\",\n \"$foreground-disabled\": \"#161616\",\n \"$background-dim\": \"#f3f3f3\",\n },\n darkblue: {\n \"$header-background-color\": \"#d9d8dd\",\n \"$body-container-background-color\": \"#f6f7f2\",\n \"$main-color\": \"#3c4f6d\",\n \"$main-hover-color\": \"#2c3f5d\",\n \"$body-background-color\": \"white\",\n \"$inputs-background-color\": \"white\",\n \"$text-color\": \"#4a4a4a\",\n \"$text-input-color\": \"#4a4a4a\",\n \"$header-color\": \"#6d7072\",\n \"$border-color\": \"#e7e7e7\",\n \"$error-color\": \"#ed5565\",\n \"$error-background-color\": \"#fd6575\",\n \"$progress-text-color\": \"#9d9d9d\",\n \"$disable-color\": \"#dbdbdb\",\n \"$disabled-label-color\": \"rgba(64, 64, 64, 0.5)\",\n \"$slider-color\": \"white\",\n \"$disabled-switch-color\": \"#9f9f9f\",\n \"$disabled-slider-color\": \"#cfcfcf\",\n \"$foreground-light\": \"#909090\",\n \"$foreground-disabled\": \"#161616\",\n \"$background-dim\": \"#f3f3f3\",\n },\n darkrose: {\n \"$header-background-color\": \"#ddd2ce\",\n \"$body-container-background-color\": \"#f7efed\",\n \"$main-color\": \"#68656e\",\n \"$main-hover-color\": \"#58555e\",\n \"$body-background-color\": \"white\",\n \"$inputs-background-color\": \"white\",\n \"$text-color\": \"#4a4a4a\",\n \"$text-input-color\": \"#4a4a4a\",\n \"$header-color\": \"#6d7072\",\n \"$border-color\": \"#e7e7e7\",\n \"$error-color\": \"#ed5565\",\n \"$error-background-color\": \"#fd6575\",\n \"$progress-text-color\": \"#9d9d9d\",\n \"$disable-color\": \"#dbdbdb\",\n \"$disabled-label-color\": \"rgba(64, 64, 64, 0.5)\",\n \"$slider-color\": \"white\",\n \"$disabled-switch-color\": \"#9f9f9f\",\n \"$disabled-slider-color\": \"#cfcfcf\",\n \"$foreground-light\": \"#909090\",\n \"$foreground-disabled\": \"#161616\",\n \"$background-dim\": \"#f3f3f3\",\n },\n stone: {\n \"$header-background-color\": \"#cdccd2\",\n \"$body-container-background-color\": \"#efedf4\",\n \"$main-color\": \"#0f0f33\",\n \"$main-hover-color\": \"#191955\",\n \"$body-background-color\": \"white\",\n \"$inputs-background-color\": \"white\",\n \"$text-color\": \"#0f0f33\",\n \"$text-input-color\": \"#0f0f33\",\n \"$header-color\": \"#0f0f33\",\n \"$border-color\": \"#e7e7e7\",\n \"$error-color\": \"#ed5565\",\n \"$error-background-color\": \"#fd6575\",\n \"$progress-text-color\": \"#9d9d9d\",\n \"$disable-color\": \"#dbdbdb\",\n \"$disabled-label-color\": \"rgba(64, 64, 64, 0.5)\",\n \"$slider-color\": \"white\",\n \"$disabled-switch-color\": \"#9f9f9f\",\n \"$disabled-slider-color\": \"#cfcfcf\",\n \"$foreground-light\": \"#909090\",\n \"$foreground-disabled\": \"#161616\",\n \"$background-dim\": \"#f3f3f3\",\n },\n winter: {\n \"$header-background-color\": \"#82b8da\",\n \"$body-container-background-color\": \"#dae1e7\",\n \"$main-color\": \"#3c3b40\",\n \"$main-hover-color\": \"#1e1d20\",\n \"$body-background-color\": \"white\",\n \"$inputs-background-color\": \"white\",\n \"$text-color\": \"#000\",\n \"$text-input-color\": \"#000\",\n \"$header-color\": \"#000\",\n \"$border-color\": \"#e7e7e7\",\n \"$error-color\": \"#ed5565\",\n \"$error-background-color\": \"#fd6575\",\n \"$disable-color\": \"#dbdbdb\",\n \"$progress-text-color\": \"#9d9d9d\",\n \"$disabled-label-color\": \"rgba(64, 64, 64, 0.5)\",\n \"$slider-color\": \"white\",\n \"$disabled-switch-color\": \"#9f9f9f\",\n \"$disabled-slider-color\": \"#cfcfcf\",\n \"$foreground-light\": \"#909090\",\n \"$foreground-disabled\": \"#161616\",\n \"$background-dim\": \"#f3f3f3\",\n },\n winterstone: {\n \"$header-background-color\": \"#323232\",\n \"$body-container-background-color\": \"#f8f8f8\",\n \"$main-color\": \"#5ac8fa\",\n \"$main-hover-color\": \"#06a1e7\",\n \"$body-background-color\": \"white\",\n \"$inputs-background-color\": \"white\",\n \"$text-color\": \"#000\",\n \"$text-input-color\": \"#000\",\n \"$header-color\": \"#fff\",\n \"$border-color\": \"#e7e7e7\",\n \"$error-color\": \"#ed5565\",\n \"$error-background-color\": \"#fd6575\",\n \"$disable-color\": \"#dbdbdb\",\n \"$progress-text-color\": \"#9d9d9d\",\n \"$disabled-label-color\": \"rgba(64, 64, 64, 0.5)\",\n \"$slider-color\": \"white\",\n \"$disabled-switch-color\": \"#9f9f9f\",\n \"$disabled-slider-color\": \"#cfcfcf\",\n \"$foreground-light\": \"#909090\",\n \"$foreground-disabled\": \"#161616\",\n \"$background-dim\": \"#f3f3f3\",\n },\n modern: {\n \"$main-color\": \"#1ab394\",\n \"$add-button-color\": \"#1948b3\",\n \"$remove-button-color\": \"#ff1800\",\n \"$disable-color\": \"#dbdbdb\",\n \"$progress-text-color\": \"#9d9d9d\",\n \"$disabled-label-color\": \"rgba(64, 64, 64, 0.5)\",\n \"$slider-color\": \"white\",\n \"$disabled-switch-color\": \"#9f9f9f\",\n \"$disabled-slider-color\": \"#cfcfcf\",\n \"$error-color\": \"#d52901\",\n \"$text-color\": \"#404040\",\n \"$light-text-color\": \"#fff\",\n \"$button-text-color\": \"#fff\",\n \"$checkmark-color\": \"#fff\",\n \"$matrix-text-checked-color\": \"#fff\",\n \"$text-input-color\": \"#404040\",\n \"$inputs-background-color\": \"transparent\",\n \"$main-hover-color\": \"#9f9f9f\",\n \"$body-container-background-color\": \"#f4f4f4\",\n \"$text-border-color\": \"#d4d4d4\",\n \"$disabled-text-color\": \"rgba(64, 64, 64, 0.5)\",\n \"$border-color\": \"rgb(64, 64, 64, 0.5)\",\n \"$dropdown-border-color\": \"#d4d4d4\",\n \"$header-background-color\": \"#e7e7e7\",\n \"$answer-background-color\": \"rgba(26, 179, 148, 0.2)\",\n \"$error-background-color\": \"rgba(213, 41, 1, 0.2)\",\n \"$radio-checked-color\": \"#404040\",\n \"$clean-button-color\": \"#1948b3\",\n \"$body-background-color\": \"#ffffff\",\n \"$foreground-light\": \"#909090\",\n \"$foreground-disabled\": \"#161616\",\n \"$background-dim\": \"#f3f3f3\",\n },\n bootstrap: {\n \"$main-color\": \"#18a689\",\n \"$text-color\": \"#404040;\",\n \"$text-input-color\": \"#404040;\",\n \"$progress-text-color\": \"#9d9d9d\",\n \"$disable-color\": \"#dbdbdb\",\n \"$header-background-color\": \"#e7e7e7\",\n \"$disabled-label-color\": \"rgba(64, 64, 64, 0.5)\",\n \"$slider-color\": \"white\",\n \"$disabled-switch-color\": \"#9f9f9f\",\n \"$disabled-slider-color\": \"#cfcfcf\",\n \"$foreground-light\": \"#909090\",\n \"$foreground-disabled\": \"#161616\",\n \"$background-dim\": \"#f3f3f3\",\n },\n bootstrapmaterial: {\n \"$main-color\": \"#18a689\",\n \"$text-color\": \"#404040;\",\n \"$text-input-color\": \"#404040;\",\n \"$progress-text-color\": \"#9d9d9d\",\n \"$disable-color\": \"#dbdbdb\",\n \"$header-background-color\": \"#e7e7e7\",\n \"$disabled-label-color\": \"rgba(64, 64, 64, 0.5)\",\n \"$slider-color\": \"white\",\n \"$disabled-switch-color\": \"#9f9f9f\",\n \"$disabled-slider-color\": \"#cfcfcf\",\n \"$body-background-color\": \"#ffffff\",\n \"$foreground-light\": \"#909090\",\n \"$foreground-disabled\": \"#161616\",\n \"$background-dim\": \"#f3f3f3\",\n },\n };\n StylesManager.ThemeCss = {\n \".sv_default_css\": \"background-color: $body-container-background-color;\",\n \".sv_default_css hr\": \"border-color: $border-color;\",\n \".sv_default_css input[type='button'], .sv_default_css button\": \"color: $body-background-color; background-color: $main-color;\",\n \".sv_default_css input[type='button']:hover, .sv_default_css button:hover\": \"background-color: $main-hover-color;\",\n \".sv_default_css .sv_header\": \"color: $header-color;\",\n \".sv_default_css .sv_custom_header\": \"background-color: $header-background-color;\",\n \".sv_default_css .sv_container\": \"color: $text-color;\",\n \".sv_default_css .sv_body\": \"background-color: $body-background-color; border-color: $main-color;\",\n \".sv_default_css .sv_progress\": \"background-color: $border-color;\",\n \".sv_default_css .sv_progress_bar\": \"background-color: $main-color;\",\n \".sv_default_css .sv_p_root > .sv_row\": \"border-color: $border-color;\",\n \".sv_default_css .sv_p_root > .sv_row:nth-child(odd)\": \"background-color: $body-background-color;\",\n \".sv_default_css .sv_p_root > .sv_row:nth-child(even)\": \"background-color: $body-container-background-color;\",\n \".sv_default_css .sv_q_other input\": \"color: $text-color; -webkit-text-fill-color: $text-color; border-color: $border-color; background-color: $inputs-background-color;\",\n \".sv_default_css .sv_q_text_root\": \"color: $text-color; -webkit-text-fill-color: $text-color; border-color: $border-color; background-color: $inputs-background-color;\",\n \".sv_default_css .sv_q_dropdown_control\": \"color: $text-input-color; border-color: $border-color; background-color: $inputs-background-color;\",\n \".sv_default_css input[type='text']\": \"color: $text-color; -webkit-text-fill-color: $text-color; border-color: $border-color; background-color: $inputs-background-color;\",\n \".sv_default_css select\": \"color: $text-color; border-color: $border-color; background-color: $inputs-background-color;\",\n \".sv_default_css textarea\": \"color: $text-input-color; -webkit-text-fill-color: $text-input-color; border-color: $border-color; background-color: $inputs-background-color;\",\n \".sv_default_css input:not([type='button']):not([type='reset']):not([type='submit']):not([type='image']):not([type='checkbox']):not([type='radio'])\": \"border: 1px solid $border-color; background-color: $inputs-background-color;color: $text-input-color; -webkit-text-fill-color: $text-input-color;\",\n \".sv_default_css input:not([type='button']):not([type='reset']):not([type='submit']):not([type='image']):not([type='checkbox']):not([type='radio']):focus\": \"border: 1px solid $main-color;\",\n \".sv_default_css .sv_container .sv_body .sv_p_root .sv_q .sv_select_wrapper .sv_q_dropdown_control \": \"background-color: $inputs-background-color;\",\n \".sv_default_css .sv_q_other input:focus\": \"border-color: $main-color;\",\n \".sv_default_css .sv_q_text_root:focus\": \"border-color: $main-color;\",\n \".sv_default_css .sv_q_dropdown_control:focus\": \"border-color: $main-color;\",\n \".sv_default_css input[type='text']:focus\": \"border-color: $main-color;\",\n '.sv_default_css .sv_container .sv_body .sv_p_root .sv_q input[type=\"radio\"]:focus, .sv_default_css .sv_container .sv_body .sv_p_root .sv_q input[type=\"checkbox\"]:focus': \"outline: 1px dotted $main-color;\",\n \".sv_default_css select:focus\": \"border-color: $main-color;\",\n \".sv_default_css textarea:focus\": \"border-color: $main-color;\",\n \".sv_default_css .sv_select_wrapper\": \"background-color: $body-background-color;\",\n \".sv_default_css .sv_select_wrapper::before\": \"background-color: $main-color;\",\n \".sv_default_css .sv_q_rating_item.active .sv_q_rating_item_text\": \"background-color: $main-hover-color; border-color: $main-hover-color; color: $body-background-color;\",\n \".sv_default_css .sv_q_rating_item .sv_q_rating_item_text\": \"border-color: $border-color;\",\n \".sv_default_css .sv_q_rating_item .sv_q_rating_item_text:hover\": \"border-color: $main-hover-color;\",\n \".sv_default_css table.sv_q_matrix tr\": \"border-color: $border-color;\",\n \".sv_default_css table.sv_q_matrix_dropdown tr\": \"border-color: $border-color;\",\n \".sv_default_css table.sv_q_matrix_dynamic tr\": \"border-color: $border-color;\",\n \".sv_default_css .sv_q_m_cell_selected\": \"color: $body-background-color; background-color: $main-hover-color;\",\n \".sv_main .sv_q_file_remove:hover\": \"color: $main-color;\",\n \".sv_main .sv_q_file_choose_button\": \"color: $body-background-color; background-color: $main-color;\",\n \".sv_main .sv_q_file_choose_button:hover\": \"background-color: $main-hover-color;\",\n \".sv_main .sv_q_imgsel.checked label>div\": \"background-color: $main-color\",\n \".sv_default_css .sv_p_description\": \"padding-left: 1.29em;\",\n //progress bar\n \".sv_main .sv-progress\": \"background-color: $header-background-color;\",\n \".sv_main .sv-progress__bar\": \"background-color: $main-color;\",\n //paneldynamic\n \".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled\": \"fill: $disable-color;\",\n \".sv_main .sv-paneldynamic__progress-text\": \"color: $progress-text-color;\",\n \".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn\": \"fill: $text-color\",\n //boolean\n \".sv_main .sv-boolean__switch\": \"background-color: $main-color;\",\n \".sv_main .sv-boolean__slider\": \"background-color: $slider-color;\",\n \".sv_main .sv-boolean__label--disabled\": \"color: $disabled-label-color;\",\n \".sv_main .sv-boolean--disabled .sv-boolean__switch\": \"background-color: $disabled-switch-color;\",\n \".sv_main .sv-boolean--disabled .sv-boolean__slider\": \"background-color: $disabled-slider-color;\",\n //eo boolean\n //signature pad\n \".sv_main .sjs_sp_container\": \"border: 1px dashed $disable-color;\",\n \".sv_main .sjs_sp_placeholder\": \"color: $foreground-light;\",\n \".sv_main .sv_matrix_detail_row\": \"background-color: #ededed; border-top: 1px solid $header-background-color; border-bottom: 1px solid $header-background-color;\",\n //action-bar\n \".sv_main .sv-action-bar-item\": \"color: $text-color;\",\n \".sv_main .sv-action-bar-item__icon use\": \"fill: $foreground-light;\",\n \".sv_main .sv-action-bar-item:hover\": \"background-color: $background-dim;\",\n //eo action-bar\n //button-group\n \".sv_main .sv-button-group__item--hover:hover\": \"background-color: $background-dim;\",\n \".sv_main .sv-button-group__item-icon use\": \"fill: $foreground-light;\",\n \".sv_main .sv-button-group__item--selected\": \"color: $main-color;\",\n \".sv_main .sv-button-group__item--selected .sv-button-group__item-icon use\": \"fill: $main-color;\",\n \".sv_main .sv-button-group__item--disabled\": \"color: $foreground-disabled;\",\n \".sv_main .sv-button-group__item--disabled .sv-button-group__item-icon use\": \"fill: $foreground-disabled;\",\n \".sv_main .sv-button-group__item\": \"background: $body-background-color; border-color: $border-color;\",\n //eo button-group\n \".sv_main .sv_qstn textarea\": \"max-width: 100%\",\n \".sv_main .sv-matrixdynamic__drag-icon\": \"padding-top:14px\",\n \".sv_main .sv-matrixdynamic__drag-icon:after\": \"content: ' '; display: block; height: 4px; width: 16px; border: 1px solid $border-color; box-sizing: border-box; border-radius: 10px; cursor: move;\",\n };\n StylesManager.modernThemeCss = {\n // \".sv-paneldynamic__add-btn\": \"background-color: $add-button-color;\",\n // \".sv-paneldynamic__remove-btn\": \"background-color: $remove-button-color;\",\n \".sv-boolean__switch\": \"background-color: $main-color;\",\n \".sv-boolean__slider\": \"background-color: $slider-color;\",\n \".sv-boolean__label--disabled\": \"color: $disabled-label-color;\",\n \".sv-boolean--disabled .sv-boolean__switch\": \"background-color: $disabled-switch-color;\",\n \".sv-boolean--disabled .sv-boolean__slider\": \"background-color: $disabled-slider-color;\",\n \".sv-btn\": \"color: $button-text-color;\",\n \".sv-checkbox__svg\": \"border-color: $border-color; fill: transparent;\",\n \".sv-checkbox--allowhover:hover .sv-checkbox__svg\": \"background-color: $main-hover-color; fill: $checkmark-color;\",\n \".sv-checkbox--checked .sv-checkbox__svg\": \"background-color: $main-color; fill: $checkmark-color;\",\n \".sv-checkbox--checked.sv-checkbox--disabled .sv-checkbox__svg\": \"background-color: $disable-color; fill: $checkmark-color;\",\n \".sv-checkbox--disabled .sv-checkbox__svg\": \"border-color: $disable-color;\",\n \".sv-comment\": \"border-color: $text-border-color; max-width: 100%;\",\n \".sv-comment:focus\": \"border-color: $main-color;\",\n \".sv-completedpage\": \"color: $text-color; background-color: $body-container-background-color;\",\n \".sv-container-modern\": \"color: $text-color;\",\n \".sv-container-modern__title\": \"color: $main-color;\",\n \".sv-description\": \"color: $disabled-text-color;\",\n \".sv-dropdown\": \"border-bottom: 0.06em solid $text-border-color;\",\n \".sv-dropdown:focus\": \"border-color: $dropdown-border-color;\",\n \".sv-dropdown--error\": \"border-color: $error-color; color: $error-color;\",\n \".sv-dropdown--error::placeholder\": \"color: $error-color;\",\n \".sv-dropdown--error::-ms-input-placeholder\": \"color: $error-color;\",\n \".sv-file__decorator\": \"background-color: $body-container-background-color;\",\n \".sv-file__clean-btn\": \"background-color: $remove-button-color;\",\n \".sv-file__choose-btn:not(.sv-file__choose-btn--disabled)\": \"background-color: $add-button-color;\",\n \".sv-file__choose-btn--disabled\": \"background-color: $disable-color;\",\n \".sv-file__remove-svg\": \"fill: #ff1800;\",\n \".sv-file__sign a\": \"color: $text-color;\",\n \".sv-footer__complete-btn\": \"background-color: $main-color;\",\n \".sv-footer__next-btn\": \"background-color: $main-color;\",\n \".sv-footer__prev-btn\": \"background-color: $main-color;\",\n \".sv-footer__start-btn\": \"background-color: $main-color;\",\n \".sv-footer__preview-btn\": \"background-color: $main-color;\",\n \".sv-footer__edit-btn\": \"background-color: $main-color;\",\n \".sv-imagepicker__item--allowhover:hover .sv-imagepicker__image\": \"background-color: $main-hover-color; border-color: $main-hover-color;\",\n \".sv-imagepicker__item--checked .sv-imagepicker__image\": \"background-color: $main-color; border-color: $main-color;\",\n \".sv-imagepicker__item--disabled.sv-imagepicker__item--checked .sv-imagepicker__image\": \"background-color: $disable-color; border-color: $disable-color;\",\n \".sv-item__control:focus + .sv-item__decorator\": \"border-color: $main-color;\",\n \".sv-matrix__text--checked\": \"color: $matrix-text-checked-color; background-color: $main-color;\",\n \".sv-matrix__text--disabled.sv-matrix__text--checked\": \"background-color: $disable-color;\",\n \".sv-matrixdynamic__add-btn\": \"background-color: $add-button-color;\",\n \".sv-matrixdynamic__remove-btn\": \"background-color: $remove-button-color;\",\n \".sv-matrixdynamic__drag-icon\": \"padding-top:16px\",\n \".sv-matrixdynamic__drag-icon:after\": \"content: ' '; display: block; height: 4px; width: 16px; border: 1px solid $border-color; box-sizing: border-box; border-radius: 10px; cursor: move;\",\n \".sv-paneldynamic__add-btn\": \"background-color: $add-button-color;\",\n \".sv-paneldynamic__remove-btn\": \"background-color: $remove-button-color;\",\n \".sv-paneldynamic__prev-btn, .sv-paneldynamic__next-btn\": \"fill: $text-color;\",\n \".sv-paneldynamic__prev-btn--disabled, .sv-paneldynamic__next-btn--disabled\": \"fill: $disable-color;\",\n \".sv-paneldynamic__progress-text\": \"color: $progress-text-color;\",\n \".sv-progress\": \"background-color: $header-background-color;\",\n \".sv-progress__bar\": \"background-color: $main-color;\",\n \".sv-progress__text\": \"color: $progress-text-color;\",\n \".sv-question__erbox\": \"color: $error-color;\",\n \".sv-question__title--answer\": \"background-color: $answer-background-color;\",\n \".sv-question__title--error\": \"background-color: $error-background-color;\",\n \".sv-panel__title--error\": \"background-color: $error-background-color;\",\n \".sv-radio__svg\": \"border-color: $border-color; fill: transparent;\",\n \".sv-radio--allowhover:hover .sv-radio__svg\": \"fill: $border-color;\",\n \".sv-radio--checked .sv-radio__svg\": \"border-color: $radio-checked-color; fill: $radio-checked-color;\",\n \".sv-radio--disabled .sv-radio__svg\": \"border-color: $disable-color;\",\n \".sv-radio--disabled.sv-radio--checked .sv-radio__svg\": \"fill: $disable-color;\",\n \".sv-rating\": \"color: $text-color;\",\n \".sv-rating input:focus + .sv-rating__min-text + .sv-rating__item-text, .sv-rating input:focus + .sv-rating__item-text\": \"outline-color: $main-color;\",\n \".sv-rating__item-text\": \"color: $main-hover-color; border: solid 0.1875em $main-hover-color;\",\n \".sv-rating__item-text:hover\": \"background-color: $main-hover-color; color: $body-background-color;\",\n \".sv-rating__item--selected .sv-rating__item-text\": \"background-color: $main-color; color: $body-background-color; border-color: $main-color;\",\n \".sv-rating--disabled .sv-rating__item-text\": \"color: $disable-color; border-color: $disable-color;\",\n \".sv-rating--disabled .sv-rating__item-text:hover\": \"background-color: transparent;\",\n \".sv-rating--disabled .sv-rating__item-text:hover .sv-rating__item--selected .sv-rating__item-text\": \"background-color: $disable-color; color: $body-background-color;\",\n \"::-webkit-scrollbar\": \"background-color: $main-hover-color;\",\n \"::-webkit-scrollbar-thumb\": \"background: $main-color;\",\n \".sv-selectbase__clear-btn\": \"background-color: $clean-button-color;\",\n \".sv-table\": \"background-color: rgba($main-hover-color, 0.1);\",\n \".sv-text:focus\": \"border-color: $main-color;\",\n '.sv-text[type=\"date\"]::-webkit-calendar-picker-indicator': \"color: transparent; background: transparent;\",\n \".sv-text--error\": \"color: $error-color; border-color: $error-color;\",\n \".sv-text--error::placeholder\": \"color: $error-color;\",\n \".sv-text--error::-ms-placeholder\": \"color: $error-color;\",\n \".sv-text--error:-ms-placeholder\": \"color: $error-color;\",\n \"input.sv-text, textarea.sv-comment, select.sv-dropdown\": \"color: $text-input-color; background-color: $inputs-background-color;\",\n \".sv-text::placeholder\": \"color: $text-input-color;\",\n \".sv-text::-ms-placeholder\": \"color: $text-input-color;\",\n \".sv-text:-ms-placeholder\": \"color: $text-input-color;\",\n \".sv-table__row--detail\": \"background-color: $header-background-color;\",\n //signature pad\n \".sjs_sp_container\": \"border: 1px dashed $disable-color;\",\n \".sjs_sp_placeholder\": \"color: $foreground-light;\",\n };\n StylesManager.bootstrapThemeCss = {\n \".sv_main .sv_q_imgsel.checked label>div\": \"background-color: $main-color\",\n \".sv_main .sv_p_description\": \"padding-left: 1.66em;\",\n \".sv_main .sv_qstn_error_bottom\": \"margin-top: 20px; margin-bottom: 0;\",\n \".sv_main .progress\": \"width: 60%;\",\n \".sv_main .progress-bar\": \"width: auto; margin-left: 2px; margin-right: 2px;\",\n \".sv_main .table>tbody>tr>td\": \"min-width: 90px;\",\n \".sv_main f-panel .sv_qstn\": \"padding: 0; vertical-align: middle;\",\n \".sv_main .sv_q_image\": \"display: inline-block;\",\n \".sv_main .sv_row .sv_qstn:first-child:last-child\": \"flex: none !important;\",\n \".sv_main .sv_row .sv_p_container:first-child:last-child\": \"flex: none !important;\",\n //progress bar\n \".sv_main .sv-progress\": \"background-color: $header-background-color;\",\n \".sv_main .sv-progress__bar\": \"background-color: $main-color;\",\n //paneldynamic\n \".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled\": \"fill: $disable-color;\",\n \".sv_main .sv-paneldynamic__progress-text\": \"color: $progress-text-color;\",\n \".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn\": \"fill: $text-color\",\n //boolean\n \".sv_main .sv-boolean__switch\": \"background-color: $main-color;\",\n \".sv_main .sv-boolean__slider\": \"background-color: $slider-color;\",\n \".sv_main .sv-boolean__label--disabled\": \"color: $disabled-label-color;\",\n \".sv_main .sv-boolean--disabled .sv-boolean__switch\": \"background-color: $disabled-switch-color;\",\n \".sv_main .sv-boolean--disabled .sv-boolean__slider\": \"background-color: $disabled-slider-color;\",\n //eo boolean\n //signature pad\n \".sv_main .sjs_sp_container\": \"border: 1px dashed $disable-color;\",\n \".sv_main .sjs_sp_placeholder\": \"color: $foreground-light;\",\n \".sv_main .sv_matrix_detail_row\": \"background-color: #ededed; border-top: 1px solid $header-background-color; border-bottom: 1px solid $header-background-color;\",\n \".sv_main .sv-action-bar-item\": \"color: $text-color;\",\n \".sv_main .sv-action-bar-item__icon use\": \"fill: $foreground-light;\",\n \".sv_main .sv-action-bar-item:hover\": \"background-color: $background-dim;\",\n };\n StylesManager.bootstrapmaterialThemeCss = {\n \".sv_main.sv_bootstrapmaterial_css .form-group.is-focused .form-control\": \"linear-gradient(0deg, $main-color 2px, $main-color 0),linear-gradient(0deg, #D2D2D2 1px, transparent 0);\",\n \".sv_main.sv_bootstrapmaterial_css .sv_qstn\": \"margin-bottom: 1rem;\",\n \".sv_main.sv_bootstrapmaterial_css .sv_qstn label.sv_q_m_label\": \"height: 100%;\",\n \".sv_main.sv_bootstrapmaterial_css .sv_q_image\": \"display: inline-block;\",\n \".sv_main .sv_row .sv_qstn:first-child:last-child\": \"flex: none !important;\",\n \".sv_main .sv_row .sv_p_container:first-child:last-child\": \"flex: none !important;\",\n \".sv_main.sv_bootstrapmaterial_css .checkbox input[type=checkbox]:checked + .checkbox-material .check\": \"border-color: $main-color;\",\n \".sv_main.sv_bootstrapmaterial_css label.checkbox-inline input[type=checkbox]:checked + .checkbox-material .check\": \"border-color: $main-color;\",\n \".sv_main.sv_bootstrapmaterial_css .checkbox input[type=checkbox]:checked + .checkbox-material .check:before\": \"color: $main-color;\",\n \".sv_main.sv_bootstrapmaterial_css label.checkbox-inline input[type=checkbox]:checked + .checkbox-material .check:before\": \"color: $main-color;\",\n \".sv_main.sv_bootstrapmaterial_css .radio input[type=radio]:checked ~ .circle\": \"border-color: $main-color;\",\n \".sv_main.sv_bootstrapmaterial_css label.radio-inline input[type=radio]:checked ~ .circle\": \"border-color: $main-color;\",\n \".sv_main.sv_bootstrapmaterial_css .radio input[type=radio]:checked ~ .check\": \"background-color: $main-color;\",\n \".sv_main.sv_bootstrapmaterial_css label.radio-inline input[type=radio]:checked ~ .check\": \"background-color: $main-color;\",\n \".sv_main.sv_bootstrapmaterial_css .btn-default.active\": \"background-color: $main-color; color: $body-background-color;\",\n \".sv_main.sv_bootstrapmaterial_css .btn-default:active\": \"background-color: $main-color; color: $body-background-color;\",\n \".sv_main.sv_bootstrapmaterial_css .btn-secondary.active\": \"background-color: $main-color; color: $body-background-color;\",\n \".sv_main.sv_bootstrapmaterial_css .btn-secondary:active\": \"background-color: $main-color; color: $body-background-color;\",\n \".sv_main.sv_bootstrapmaterial_css .open>.dropdown-toggle.btn-default\": \"background-color: $main-color; color: $body-background-color;\",\n \".sv_main.sv_bootstrapmaterial_css input[type='button'].btn-primary, .sv_main.sv_bootstrapmaterial_css button.btn-primary\": \"color: $body-background-color; background-color: $main-color;\",\n \".sv_main.sv_bootstrapmaterial_css input[type='button'].btn-primary:hover, .sv_main.sv_bootstrapmaterial_css button.btn-primary:hover\": \"background-color: $main-hover-color;\",\n \".sv_main .sv_q_imgsel.checked label>div\": \"background-color: $main-color;\",\n \".sv_main.sv_bootstrapmaterial_css .sv_q_file_remove:hover\": \"color: $main-color;\",\n \".sv_main.sv_bootstrapmaterial_css .form-group input[type=file]\": \"position: relative; opacity: 1;\",\n \".sv_main.sv_bootstrapmaterial_css .progress\": \"width: 60%; height: 1.5em;\",\n \".sv_main.sv_bootstrapmaterial_css .progress-bar\": \"width: auto; margin-left: 2px; margin-right: 2px;\",\n //progress bar\n \".sv_main .sv-progress\": \"background-color: $header-background-color;\",\n \".sv_main .sv-progress__bar\": \"background-color: $main-color;\",\n //paneldynamic\n \".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled\": \"fill: $disable-color;\",\n \".sv_main .sv-paneldynamic__progress-text\": \"color: $progress-text-color;\",\n \".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn\": \"fill: $text-color\",\n //boolean\n \".sv_main .sv-boolean .checkbox-decorator\": \"display: none;\",\n \".sv_main .sv-boolean__switch\": \"background-color: $main-color;\",\n \".sv_main .sv-boolean__slider\": \"background-color: $slider-color;\",\n \".sv_main .sv-boolean__label.sv-boolean__label--disabled\": \"color: $disabled-label-color;\",\n \".sv_main .sv-boolean__label\": \"color: $text-color;\",\n \".sv_main .sv-boolean--disabled .sv-boolean__switch\": \"background-color: $disabled-switch-color;\",\n \".sv_main .sv-boolean--disabled .sv-boolean__slider\": \"background-color: $disabled-slider-color;\",\n //eo boolean\n \".sv_main .sv_matrix_detail_row\": \"background-color: #ededed; border-top: 1px solid $header-background-color; border-bottom: 1px solid $header-background-color;\",\n //signature pad\n \".sv_main .sjs_sp_container\": \"border: 1px dashed $disable-color;\",\n \".sv_main .sjs_sp_placeholder\": \"color: $foreground-light;\",\n \".sv_main .sv-action-bar-item\": \"color: $text-color;\",\n \".sv_main .sv-action-bar-item__icon use\": \"fill: $foreground-light;\",\n \".sv_main .sv-action-bar-item:hover\": \"background-color: $background-dim;\",\n };\n StylesManager.Enabled = true;\n return StylesManager;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/survey-element.ts\":\n/*!*******************************!*\\\n !*** ./src/survey-element.ts ***!\n \\*******************************/\n/*! exports provided: SurveyElement */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyElement\", function() { return SurveyElement; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _rendererFactory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./rendererFactory */ \"./src/rendererFactory.ts\");\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _actions_action__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./actions/action */ \"./src/actions/action.ts\");\n/* harmony import */ var _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actions/adaptive-container */ \"./src/actions/adaptive-container.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\n\n\n\n\n\n\n/**\n * Base class of SurveyJS Elements.\n */\nvar SurveyElement = /** @class */ (function (_super) {\n __extends(SurveyElement, _super);\n function SurveyElement(name) {\n var _this = _super.call(this) || this;\n _this.selectedElementInDesignValue = _this;\n _this.disableDesignActions = SurveyElement.CreateDisabledDesignElements;\n _this.isContentElement = false;\n _this.isEditableTemplateElement = false;\n _this.isInteractiveDesignElement = true;\n _this.name = name;\n _this.createNewArray(\"errors\");\n _this.createNewArray(\"titleActions\");\n _this.registerFunctionOnPropertyValueChanged(\"isReadOnly\", function () {\n _this.onReadOnlyChanged();\n });\n _this.registerFunctionOnPropertyValueChanged(\"errors\", function () {\n _this.updateVisibleErrors();\n });\n return _this;\n }\n SurveyElement.getProgressInfoByElements = function (children, isRequired) {\n var info = _base__WEBPACK_IMPORTED_MODULE_3__[\"Base\"].createProgressInfo();\n for (var i = 0; i < children.length; i++) {\n if (!children[i].isVisible)\n continue;\n var childInfo = children[i].getProgressInfo();\n info.questionCount += childInfo.questionCount;\n info.answeredQuestionCount += childInfo.answeredQuestionCount;\n info.requiredQuestionCount += childInfo.requiredQuestionCount;\n info.requiredAnsweredQuestionCount +=\n childInfo.requiredAnsweredQuestionCount;\n }\n if (isRequired && info.questionCount > 0) {\n if (info.requiredQuestionCount == 0)\n info.requiredQuestionCount = 1;\n if (info.answeredQuestionCount > 0)\n info.requiredAnsweredQuestionCount = 1;\n }\n return info;\n };\n SurveyElement.ScrollElementToTop = function (elementId) {\n if (!elementId || typeof document === \"undefined\")\n return false;\n var el = document.getElementById(elementId);\n if (!el || !el.scrollIntoView)\n return false;\n var elemTop = el.getBoundingClientRect().top;\n if (elemTop < 0)\n el.scrollIntoView();\n return elemTop < 0;\n };\n SurveyElement.GetFirstNonTextElement = function (elements, removeSpaces) {\n if (removeSpaces === void 0) { removeSpaces = false; }\n if (!elements || !elements.length || elements.length == 0)\n return null;\n if (removeSpaces) {\n var tEl = elements[0];\n if (tEl.nodeName === \"#text\")\n tEl.data = \"\";\n tEl = elements[elements.length - 1];\n if (tEl.nodeName === \"#text\")\n tEl.data = \"\";\n }\n for (var i = 0; i < elements.length; i++) {\n if (elements[i].nodeName != \"#text\" && elements[i].nodeName != \"#comment\")\n return elements[i];\n }\n return null;\n };\n SurveyElement.FocusElement = function (elementId) {\n if (!elementId || typeof document === \"undefined\")\n return false;\n var res = SurveyElement.focusElementCore(elementId);\n if (!res) {\n setTimeout(function () {\n SurveyElement.focusElementCore(elementId);\n }, 10);\n }\n return res;\n };\n SurveyElement.focusElementCore = function (elementId) {\n var el = document.getElementById(elementId);\n if (el) {\n el.focus();\n return true;\n }\n return false;\n };\n SurveyElement.prototype.onPropertyValueChanged = function (name, oldValue, newValue) {\n _super.prototype.onPropertyValueChanged.call(this, name, oldValue, newValue);\n if (name === \"state\") {\n if (oldValue === \"default\" || newValue === \"default\") {\n this.updateTitleActions();\n }\n else {\n this.updateExpandAction();\n }\n if (this.stateChangedCallback)\n this.stateChangedCallback();\n }\n };\n Object.defineProperty(SurveyElement.prototype, \"state\", {\n /**\n * Set this property to \"collapsed\" to render only Panel title and expanded button and to \"expanded\" to render the collapsed button in the Panel caption\n */\n get: function () {\n return this.getPropertyValue(\"state\");\n },\n set: function (val) {\n this.setPropertyValue(\"state\", val);\n this.notifyStateChanged();\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.notifyStateChanged = function () {\n if (this.survey) {\n this.survey.elementContentVisibilityChanged(this);\n }\n };\n Object.defineProperty(SurveyElement.prototype, \"isCollapsed\", {\n /**\n * Returns true if the Element is in the collapsed state\n * @see state\n * @see collapse\n * @see isExpanded\n */\n get: function () {\n if (this.isDesignMode)\n return;\n return this.state == \"collapsed\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyElement.prototype, \"isExpanded\", {\n /**\n * Returns true if the Element is in the expanded state\n * @see state\n * @see expand\n * @see isCollapsed\n */\n get: function () {\n return this.state == \"expanded\";\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Collapse the Element\n * @see state\n */\n SurveyElement.prototype.collapse = function () {\n if (this.isDesignMode)\n return;\n this.state = \"collapsed\";\n };\n /**\n * Expand the Element\n * @see state\n */\n SurveyElement.prototype.expand = function () {\n this.state = \"expanded\";\n };\n /**\n * Toggle element's state\n * @see state\n */\n SurveyElement.prototype.toggleState = function () {\n if (this.isCollapsed) {\n this.expand();\n return true;\n }\n if (this.isExpanded) {\n this.collapse();\n return false;\n }\n return true;\n };\n Object.defineProperty(SurveyElement.prototype, \"hasStateButton\", {\n get: function () {\n return this.isExpanded || this.isCollapsed;\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.getTitleToolbar = function () {\n if (!this.titleToolbarValue) {\n this.titleToolbarValue = new _actions_adaptive_container__WEBPACK_IMPORTED_MODULE_5__[\"AdaptiveActionContainer\"]();\n this.titleToolbarValue.setItems(this.getTitleActions());\n }\n return this.titleToolbarValue;\n };\n SurveyElement.prototype.updateExpandAction = function () {\n if (!!this.expandAction) {\n this.expandAction.visible = this.isExpanded || this.isCollapsed;\n this.expandAction.innerCss =\n \"sv-expand-action\" +\n (this.isExpanded ? \" sv-expand-action--expanded\" : \"\");\n }\n };\n Object.defineProperty(SurveyElement.prototype, \"titleActions\", {\n get: function () {\n return this.getPropertyValue(\"titleActions\");\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.getTitleActions = function () {\n if (!this.isTitleActionRequested) {\n this.updateTitleActions();\n this.isTitleActionRequested = true;\n }\n return this.titleActions;\n };\n SurveyElement.prototype.updateTitleActions = function () {\n var _this = this;\n var actions = [];\n if (this.hasStateButton && !this.expandAction) {\n this.expandAction = new _actions_action__WEBPACK_IMPORTED_MODULE_4__[\"Action\"]({\n id: \"expand-collapse-action\",\n title: \"\",\n disableTabStop: true,\n action: function () {\n _this.toggleState();\n },\n });\n }\n if (!!this.expandAction) {\n actions.push(this.expandAction);\n }\n if (!!this.survey) {\n actions = this.survey.getUpdatedElementTitleActions(this, actions);\n }\n this.updateExpandAction();\n this.setPropertyValue(\"titleActions\", actions);\n };\n Object.defineProperty(SurveyElement.prototype, \"hasTitleActions\", {\n get: function () {\n return this.getTitleActions().length > 0;\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.getTitleComponentName = function () {\n var componentName = _rendererFactory__WEBPACK_IMPORTED_MODULE_2__[\"RendererFactory\"].Instance.getRenderer(\"element\", \"title-actions\");\n if (componentName == \"default\") {\n return \"sv-default-title\";\n }\n return componentName;\n };\n Object.defineProperty(SurveyElement.prototype, \"titleTabIndex\", {\n get: function () {\n return this.state !== \"default\" ? 0 : undefined;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyElement.prototype, \"titleAriaExpanded\", {\n get: function () {\n if (this.state === \"default\")\n return undefined;\n return this.state === \"expanded\";\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.setSurveyImpl = function (value) {\n this.surveyImplValue = value;\n if (!this.surveyImplValue) {\n this.setSurveyCore(null);\n }\n else {\n this.surveyDataValue = this.surveyImplValue.getSurveyData();\n this.setSurveyCore(this.surveyImplValue.getSurvey());\n this.textProcessorValue = this.surveyImplValue.getTextProcessor();\n this.onSetData();\n }\n };\n Object.defineProperty(SurveyElement.prototype, \"surveyImpl\", {\n get: function () {\n return this.surveyImplValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyElement.prototype, \"data\", {\n get: function () {\n return this.surveyDataValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyElement.prototype, \"survey\", {\n /**\n * Returns the survey object.\n */\n get: function () {\n return this.getSurvey();\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.getSurvey = function (live) {\n if (live === void 0) { live = false; }\n if (!!this.surveyValue)\n return this.surveyValue;\n if (!!this.surveyImplValue) {\n this.setSurveyCore(this.surveyImplValue.getSurvey());\n }\n return this.surveyValue;\n };\n SurveyElement.prototype.setSurveyCore = function (value) {\n this.surveyValue = value;\n if (!!this.surveyChangedCallback) {\n this.surveyChangedCallback();\n }\n };\n Object.defineProperty(SurveyElement.prototype, \"isDesignMode\", {\n /**\n * Returns true if the question in design mode right now.\n */\n get: function () {\n return !!this.survey && this.survey.isDesignMode;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyElement.prototype, \"isInternal\", {\n get: function () {\n return this.isContentElement;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyElement.prototype, \"areInvisibleElementsShowing\", {\n get: function () {\n return (!!this.survey &&\n this.survey.areInvisibleElementsShowing &&\n !this.isContentElement);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyElement.prototype, \"isVisible\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyElement.prototype, \"isReadOnly\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyElement.prototype, \"readOnly\", {\n /**\n * Set it to true to make an element question/panel/page readonly.\n * Please note, this property is hidden for question without input, for example html question.\n * @see enableIf\n * @see isReadOnly\n */\n get: function () {\n return this.getPropertyValue(\"readOnly\", false);\n },\n set: function (val) {\n if (this.readOnly == val)\n return;\n this.setPropertyValue(\"readOnly\", val);\n if (!this.isLoadingFromJson) {\n this.setPropertyValue(\"isReadOnly\", this.isReadOnly);\n }\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.onReadOnlyChanged = function () {\n if (!!this.readOnlyChangedCallback) {\n this.readOnlyChangedCallback();\n }\n };\n SurveyElement.prototype.updateElementCss = function (reNew) { };\n SurveyElement.prototype.getIsLoadingFromJson = function () {\n if (_super.prototype.getIsLoadingFromJson.call(this))\n return true;\n return this.survey ? this.survey.isLoadingFromJson : false;\n };\n Object.defineProperty(SurveyElement.prototype, \"name\", {\n /**\n * This is the identifier of a survey element - question or panel.\n * @see valueName\n */\n get: function () {\n return this.getPropertyValue(\"name\", \"\");\n },\n set: function (val) {\n var oldValue = this.name;\n this.setPropertyValue(\"name\", this.getValidName(val));\n if (!this.isLoadingFromJson && !!oldValue) {\n this.onNameChanged(oldValue);\n }\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.getValidName = function (name) {\n return name;\n };\n SurveyElement.prototype.onNameChanged = function (oldValue) { };\n SurveyElement.prototype.updateBindingValue = function (valueName, value) {\n if (!!this.data &&\n !_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isTwoValueEquals(value, this.data.getValue(valueName))) {\n this.data.setValue(valueName, value, false);\n }\n };\n Object.defineProperty(SurveyElement.prototype, \"errors\", {\n /**\n * The list of errors. It is created by callig hasErrors functions\n * @see hasErrors\n */\n get: function () {\n return this.getPropertyValue(\"errors\");\n },\n set: function (val) {\n this.setPropertyValue(\"errors\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.updateVisibleErrors = function () {\n var counter = 0;\n for (var i = 0; i < this.errors.length; i++) {\n if (this.errors[i].visible)\n counter++;\n }\n this.hasVisibleErrors = counter > 0;\n };\n Object.defineProperty(SurveyElement.prototype, \"containsErrors\", {\n /**\n * Returns true if a question or a container (panel/page) or their chidren have an error.\n * The value can be out of date. hasErrors function should be called to get the correct value.\n */\n get: function () {\n return this.getPropertyValue(\"containsErrors\", false);\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.updateContainsErrors = function () {\n this.setPropertyValue(\"containsErrors\", this.getContainsErrors());\n };\n SurveyElement.prototype.getContainsErrors = function () {\n return this.errors.length > 0;\n };\n SurveyElement.prototype.getElementsInDesign = function (includeHidden) {\n if (includeHidden === void 0) { includeHidden = false; }\n return [];\n };\n Object.defineProperty(SurveyElement.prototype, \"selectedElementInDesign\", {\n get: function () {\n return this.selectedElementInDesignValue;\n },\n set: function (val) {\n this.selectedElementInDesignValue = val;\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.updateCustomWidgets = function () { };\n SurveyElement.prototype.onSurveyLoad = function () { };\n SurveyElement.prototype.onFirstRendering = function () { };\n SurveyElement.prototype.endLoadingFromJson = function () {\n _super.prototype.endLoadingFromJson.call(this);\n if (!this.survey) {\n this.onSurveyLoad();\n }\n };\n SurveyElement.prototype.setVisibleIndex = function (index) {\n return 0;\n };\n Object.defineProperty(SurveyElement.prototype, \"isPage\", {\n /**\n * Returns true if it is a page.\n */\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyElement.prototype, \"isPanel\", {\n /**\n * Returns true if it is a panel.\n */\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyElement.prototype, \"isQuestion\", {\n /**\n * Returns true if it is a question.\n */\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.delete = function () { };\n SurveyElement.prototype.removeSelfFromList = function (list) {\n if (!list || !Array.isArray(list))\n return;\n var index = list.indexOf(this);\n if (index > -1) {\n list.splice(index, 1);\n }\n };\n Object.defineProperty(SurveyElement.prototype, \"textProcessor\", {\n get: function () {\n return this.textProcessorValue;\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.getProcessedHtml = function (html) {\n if (!html || !this.textProcessor)\n return html;\n return this.textProcessor.processText(html, true);\n };\n SurveyElement.prototype.onSetData = function () { };\n Object.defineProperty(SurveyElement.prototype, \"parent\", {\n get: function () {\n return this.getPropertyValue(\"parent\", null);\n },\n set: function (val) {\n this.setPropertyValue(\"parent\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyElement.prototype.getPage = function (parent) {\n while (parent && parent.parent)\n parent = parent.parent;\n if (parent && parent.getType() == \"page\")\n return parent;\n return null;\n };\n SurveyElement.prototype.moveToBase = function (parent, container, insertBefore) {\n if (insertBefore === void 0) { insertBefore = null; }\n if (!container)\n return false;\n parent.removeElement(this);\n var index = -1;\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isNumber(insertBefore)) {\n index = parseInt(insertBefore);\n }\n if (index == -1 && !!insertBefore && !!insertBefore.getType) {\n index = container.indexOf(insertBefore);\n }\n container.addElement(this, index);\n return true;\n };\n SurveyElement.prototype.setPage = function (parent, val) {\n var oldPage = this.getPage(parent);\n if (oldPage === val)\n return;\n if (parent)\n parent.removeElement(this);\n if (val) {\n val.addElement(this, -1);\n }\n };\n SurveyElement.prototype.getSearchableLocKeys = function (keys) {\n keys.push(\"title\");\n keys.push(\"description\");\n };\n SurveyElement.CreateDisabledDesignElements = false;\n __decorate([\n Object(_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"property\"])({ defaultValue: false })\n ], SurveyElement.prototype, \"hasVisibleErrors\", void 0);\n return SurveyElement;\n}(_base__WEBPACK_IMPORTED_MODULE_3__[\"Base\"]));\n\n\n\n/***/ }),\n\n/***/ \"./src/survey-error.ts\":\n/*!*****************************!*\\\n !*** ./src/survey-error.ts ***!\n \\*****************************/\n/*! exports provided: SurveyError */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyError\", function() { return SurveyError; });\n/* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localizablestring */ \"./src/localizablestring.ts\");\n\nvar SurveyError = /** @class */ (function () {\n function SurveyError(text, errorOwner) {\n if (text === void 0) { text = null; }\n if (errorOwner === void 0) { errorOwner = null; }\n this.text = text;\n this.errorOwner = errorOwner;\n this.visible = true;\n }\n Object.defineProperty(SurveyError.prototype, \"locText\", {\n get: function () {\n if (!this.locTextValue) {\n this.locTextValue = new _localizablestring__WEBPACK_IMPORTED_MODULE_0__[\"LocalizableString\"](this.errorOwner, true);\n this.locTextValue.text = this.getText();\n }\n return this.locTextValue;\n },\n enumerable: false,\n configurable: true\n });\n SurveyError.prototype.getText = function () {\n var res = this.text;\n if (!res)\n res = this.getDefaultText();\n if (!!this.errorOwner) {\n res = this.errorOwner.getErrorCustomText(res, this);\n }\n return res;\n };\n SurveyError.prototype.getErrorType = function () {\n return \"base\";\n };\n SurveyError.prototype.getDefaultText = function () {\n return \"\";\n };\n return SurveyError;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/survey.ts\":\n/*!***********************!*\\\n !*** ./src/survey.ts ***!\n \\***********************/\n/*! exports provided: SurveyModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyModel\", function() { return SurveyModel; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _survey_element__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./survey-element */ \"./src/survey-element.ts\");\n/* harmony import */ var _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./defaultCss/cssstandard */ \"./src/defaultCss/cssstandard.ts\");\n/* harmony import */ var _page__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./page */ \"./src/page.ts\");\n/* harmony import */ var _textPreProcessor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textPreProcessor */ \"./src/textPreProcessor.ts\");\n/* harmony import */ var _conditionProcessValue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./conditionProcessValue */ \"./src/conditionProcessValue.ts\");\n/* harmony import */ var _dxSurveyService__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./dxSurveyService */ \"./src/dxSurveyService.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _localizablestring__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./localizablestring */ \"./src/localizablestring.ts\");\n/* harmony import */ var _stylesmanager__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./stylesmanager */ \"./src/stylesmanager.ts\");\n/* harmony import */ var _surveytimer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./surveytimer */ \"./src/surveytimer.ts\");\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./conditions */ \"./src/conditions.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\n/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./utils/utils */ \"./src/utils/utils.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * The `Survey` object contains information about the survey, Pages, Questions, flow logic and etc.\n */\nvar SurveyModel = /** @class */ (function (_super) {\n __extends(SurveyModel, _super);\n //#endregion\n function SurveyModel(jsonObj) {\n if (jsonObj === void 0) { jsonObj = null; }\n var _this = _super.call(this) || this;\n _this.valuesHash = {};\n _this.variablesHash = {};\n _this.localeValue = \"\";\n _this.completedStateValue = \"\";\n _this.completedStateTextValue = \"\";\n _this.isTimerStarted = false;\n //#region Event declarations\n /**\n * The event is fired before the survey is completed and the `onComplete` event is fired. You can prevent the survey from completing by setting `options.allowComplete` to `false`\n *
`sender` - the survey object that fires the event.\n *
`options.allowComplete` - Specifies whether a user can complete a survey. Set this property to `false` to prevent the survey from completing. The default value is `true`.\n *
`options.isCompleteOnTrigger` - returns true if the survey is completing on \"complete\" trigger.\n * @see onComplete\n */\n _this.onCompleting = _this.addEvent();\n /**\n * The event is fired after a user clicks the 'Complete' button and finishes a survey. Use this event to send the survey data to your web server.\n *
`sender` - the survey object that fires the event.\n *
`options.showDataSaving(text)` - call this method to show that the survey is saving survey data on your server. The `text` is an optional parameter to show a custom message instead of default.\n *
`options.showDataSavingError(text)` - call this method to show that an error occurred while saving the data on your server. If you want to show a custom error, use an optional `text` parameter.\n *
`options.showDataSavingSuccess(text)` - call this method to show that the data was successfully saved on the server.\n *
`options.showDataSavingClear` - call this method to hide the text about the saving progress.\n *
`options.isCompleteOnTrigger` - returns true if the survey is completed on \"complete\" trigger.\n * @see data\n * @see clearInvisibleValues\n * @see completeLastPage\n * @see surveyPostId\n */\n _this.onComplete = _this.addEvent();\n /**\n * The event is fired before the survey is going to preview mode, state equals to `preview`. It happens when a user click on \"Preview\" button. It shows when \"showPreviewBeforeComplete\" proeprty equals to \"showAllQuestions\" or \"showAnsweredQuestions\".\n * You can prevent showing it by setting allowShowPreview to `false`.\n *
`sender` - the survey object that fires the event.\n *
`options.allowShowPreview` - Specifies whether a user can see a preview. Set this property to `false` to prevent from showing the preview. The default value is `true`.\n * @see showPreviewBeforeComplete\n */\n _this.onShowingPreview = _this.addEvent();\n /**\n * The event is fired after a user clicks the 'Complete' button. The event allows you to specify the URL opened after completing a survey.\n * Specify the `navigateToUrl` property to make survey navigate to another url.\n *
`sender` - the survey object that fires the event.\n *
`options.url` - Specifies a URL opened after completing a survey. Set this property to an empty string to cancel the navigation and show the completed survey page.\n * @see navigateToUrl\n * @see navigateToUrlOnCondition\n */\n _this.onNavigateToUrl = _this.addEvent();\n /**\n * The event is fired after the survey changed it's state from \"starting\" to \"running\". The \"starting\" state means that survey shows the started page.\n * The `firstPageIsStarted` property should be set to `true`, if you want to display a start page in your survey. In this case, an end user should click the \"Start\" button to start the survey.\n * @see firstPageIsStarted\n */\n _this.onStarted = _this.addEvent();\n /**\n * The event is fired on clicking the 'Next' button if the `sendResultOnPageNext` is set to `true`. You can use it to save the intermediate results, for example, if your survey is large enough.\n *
`sender` - the survey object that fires the event.\n * @see sendResultOnPageNext\n */\n _this.onPartialSend = _this.addEvent();\n /**\n * The event is fired before the current page changes to another page. Typically it happens when a user click the 'Next' or 'Prev' buttons.\n *
`sender` - the survey object that fires the event.\n *
`option.oldCurrentPage` - the previous current/active page.\n *
`option.newCurrentPage` - a new current/active page.\n *
`option.allowChanging` - set it to `false` to disable the current page changing. It is `true` by default.\n *
`option.isNextPage` - commonly means, that end-user press the next page button. In general, it means that options.newCurrentPage is the next page after options.oldCurrentPage\n *
`option.isPrevPage` - commonly means, that end-user press the previous page button. In general, it means that options.newCurrentPage is the previous page before options.oldCurrentPage\n * @see currentPage\n * @see currentPageNo\n * @see nextPage\n * @see prevPage\n * @see completeLastPage\n * @see onCurrentPageChanged\n **/\n _this.onCurrentPageChanging = _this.addEvent();\n /**\n * The event is fired when the current page has been changed to another page. Typically it happens when a user click on 'Next' or 'Prev' buttons.\n *
`sender` - the survey object that fires the event.\n *
`option.oldCurrentPage` - a previous current/active page.\n *
`option.newCurrentPage` - a new current/active page.\n *
`option.isNextPage` - commonly means, that end-user press the next page button. In general, it means that options.newCurrentPage is the next page after options.oldCurrentPage\n *
`option.isPrevPage` - commonly means, that end-user press the previous page button. In general, it means that options.newCurrentPage is the previous page before options.oldCurrentPage\n * @see currentPage\n * @see currentPageNo\n * @see nextPage\n * @see prevPage\n * @see completeLastPage\n * @see onCurrentPageChanging\n */\n _this.onCurrentPageChanged = _this.addEvent();\n /**\n * The event is fired before the question value (answer) is changed. It can be done via UI by a user or programmatically on calling the `setValue` method.\n *
`sender` - the survey object that fires the event.\n *
`options.name` - the value name that has being changed.\n *
`options.question` - a question which `question.name` equals to the value name. If there are several questions with the same name, the first question is used. If there is no such questions, the `options.question` is null.\n *
`options.oldValue` - an old, previous value.\n *
`options.value` - a new value. You can change it.\n * @see setValue\n * @see onValueChanged\n */\n _this.onValueChanging = _this.addEvent();\n /**\n * The event is fired when the question value (i.e., answer) has been changed. The question value can be changed in UI (by a user) or programmatically (on calling `setValue` method).\n * Use the `onDynamicPanelItemValueChanged` and `onMatrixCellValueChanged` events to handle changes in a question in the Panel Dynamic and a cell question in matrices.\n *
`sender` - the survey object that fires the event.\n *
`options.name` - the value name that has been changed.\n *
`options.question` - a question which `question.name` equals to the value name. If there are several questions with the same name, the first question is used. If there is no such questions, the `options.question` is `null`.\n *
`options.value` - a new value.\n * @see setValue\n * @see onValueChanging\n * @see onDynamicPanelItemValueChanged\n * @see onMatrixCellValueChanged\n */\n _this.onValueChanged = _this.addEvent();\n /**\n * The event is fired when a question visibility has been changed.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a question which visibility has been changed.\n *
`options.name` - a question name.\n *
`options.visible` - a question `visible` boolean value.\n * @see Question.visibile\n * @see Question.visibileIf\n */\n _this.onVisibleChanged = _this.addEvent();\n /**\n * The event is fired on changing a page visibility.\n *
`sender` - the survey object that fires the event.\n *
`options.page` - a page which visibility has been changed.\n *
`options.visible` - a page `visible` boolean value.\n * @see PageModel.visibile\n * @see PageModel.visibileIf\n */\n _this.onPageVisibleChanged = _this.addEvent();\n /**\n * The event is fired on changing a panel visibility.\n *
`sender` - the survey object that fires the event.\n *
`options.panel` - a panel which visibility has been changed.\n *
`options.visible` - a panel `visible` boolean value.\n * @see PanelModel.visibile\n * @see PanelModel.visibileIf\n */\n _this.onPanelVisibleChanged = _this.addEvent();\n /**\n * The event is fired on creating a new question.\n * Unlike the onQuestionAdded event, this event calls for all question created in survey including inside: a page, panel, matrix cell, dynamic panel and multiple text.\n * or inside a matrix cell or it can be a text question in multiple text items or inside a panel of a panel dynamic.\n * You can use this event to set up properties to a question based on it's type for all questions, regardless where they are located, on the page or inside a matrix cell.\n * Please note: If you want to use this event for questions loaded from JSON then you have to create survey with empty/null JSON parameter, assign the event and call survey.fromJSON(yourJSON) function.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a newly created question object.\n * @see Question\n * @see onQuestionAdded\n */\n _this.onQuestionCreated = _this.addEvent();\n /**\n * The event is fired on adding a new question into survey.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a newly added question object.\n *
`options.name` - a question name.\n *
`options.index` - an index of the question in the container (page or panel).\n *
`options.parentPanel` - a container where a new question is located. It can be a page or panel.\n *
`options.rootPanel` - typically, it is a page.\n * @see Question\n * @see onQuestionCreated\n */\n _this.onQuestionAdded = _this.addEvent();\n /**\n * The event is fired on removing a question from survey.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a removed question object.\n *
`options.name` - a question name.\n * @see Question\n */\n _this.onQuestionRemoved = _this.addEvent();\n /**\n * The event is fired on adding a panel into survey.\n *
`sender` - the survey object that fires the event.\n *
`options.panel` - a newly added panel object.\n *
`options.name` - a panel name.\n *
`options.index` - an index of the panel in the container (a page or panel).\n *
`options.parentPanel` - a container (a page or panel) where a new panel is located.\n *
`options.rootPanel` - a root container, typically it is a page.\n * @see PanelModel\n */\n _this.onPanelAdded = _this.addEvent();\n /**\n * The event is fired on removing a panel from survey.\n *
`sender` - the survey object that fires the event.\n *
`options.panel` - a removed panel object.\n *
`options.name` - a panel name.\n * @see PanelModel\n */\n _this.onPanelRemoved = _this.addEvent();\n /**\n * The event is fired on adding a page into survey.\n *
`sender` - the survey object that fires the event.\n *
`options.page` - a newly added `panel` object.\n * @see PanelModel\n */\n _this.onPageAdded = _this.addEvent();\n /**\n * The event is fired on validating value in a question. You can specify a custom error message using `options.error`. The survey blocks completing the survey or going to the next page when the error messages are displayed.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a validated question.\n *
`options.name` - a question name.\n *
`options.value` - the current question value (answer).\n *
`options.error` - an error string. It is empty by default.\n * @see onServerValidateQuestions\n * @see onSettingQuestionErrors\n */\n _this.onValidateQuestion = _this.addEvent();\n /**\n * The event is fired before errors are assigned to a question. You may add/remove/modify errors for a question.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a validated question.\n *
`options.errors` - the list of errors. The list is empty by default and remains empty if a validated question has no errors.\n * @see onValidateQuestion\n */\n _this.onSettingQuestionErrors = _this.addEvent();\n /**\n * Use this event to validate data on your server.\n *
`sender` - the survey object that fires the event.\n *
`options.data` - the values of all non-empty questions on the current page. You can get a question value as `options.data[\"myQuestionName\"]`.\n *
`options.errors` - set your errors to this object as: `options.errors[\"myQuestionName\"] = \"Error text\";`. It will be shown as a question error.\n *
`options.complete()` - call this function to tell survey that your server callback has been processed.\n * @see onValidateQuestion\n * @see onValidatePanel\n */\n _this.onServerValidateQuestions = _this.addEvent();\n /**\n * Use this event to modify the HTML before rendering, for example HTML on a completed page.\n *
`sender` - the survey object that fires the event.\n *
`options.html` - an HTML that you may change before text processing and then rendering.\n * @see completedHtml\n * @see loadingHtml\n * @see QuestionHtmlModel.html\n */\n /**\n * The event is fired on validating a panel. Set your error to `options.error` and survey will show the error for the panel and block completing the survey or going to the next page.\n *
`sender` - the survey object that fires the event.\n *
`options.name` - a panel name.\n *
`options.error` - an error string. It is empty by default.\n * @see onValidateQuestion\n */\n _this.onValidatePanel = _this.addEvent();\n /**\n * Use the event to change the default error text.\n *
`sender` - the survey object that fires the event.\n *
`options.text` - an error text.\n *
`options.error` - an instance of the `SurveyError` object.\n *
`options.name` - the error name. The following error names are available:\n * required, requireoneanswer, requirenumeric, exceedsize, webrequest, webrequestempty, otherempty,\n * uploadingfile, requiredinallrowserror, minrowcounterror, keyduplicationerror, custom\n */\n _this.onErrorCustomText = _this.addEvent();\n /**\n * Use the this event to be notified when the survey finished validate questions on the current page. It commonly happens when a user try to go to the next page or complete the survey\n * options.questions - the list of questions that have errors\n * options.errors - the list of errors\n * options.page - the page where question(s) are located\n */\n _this.onValidatedErrorsOnCurrentPage = _this.addEvent();\n /**\n * Use this event to modify the HTML content before rendering, for example `completeHtml` or `loadingHtml`.\n * `options.html` - specifies the modified HTML content.\n * @see completedHtml\n * @see loadingHtml\n */\n _this.onProcessHtml = _this.addEvent();\n /**\n * Use this event to change the question title in code. If you want to remove question numbering then set showQuestionNumbers to \"off\".\n *
`sender` - the survey object that fires the event.\n *
`options.title` - a calculated question title, based on question `title`, `name`.\n *
`options.question` - a question object.\n * @see showQuestionNumbers\n * @see requiredText\n */\n _this.onGetQuestionTitle = _this.addEvent();\n /**\n * Use this event to change the question no in code. If you want to remove question numbering then set showQuestionNumbers to \"off\".\n *
`sender` - the survey object that fires the event.\n *
`options.no` - a calculated question no, based on question `visibleIndex`, survey `.questionStartIndex` properties. You can change it.\n *
`options.question` - a question object.\n * @see showQuestionNumbers\n * @see questionStartIndex\n */\n _this.onGetQuestionNo = _this.addEvent();\n /**\n * Use this event to change the progress text in code.\n *
`sender` - the survey object that fires the event.\n *
`options.text` - a progress text, that SurveyJS will render in progress bar.\n *
`options.questionCount` - a number of questions that have input(s). We do not count html or expression questions\n *
`options.answeredQuestionCount` - a number of questions that have input(s) and an user has answered.\n *
`options.requiredQuestionCount` - a number of required questions that have input(s). We do not count html or expression questions\n *
`options.requiredAnsweredQuestionCount` - a number of required questions that have input(s) and an user has answered.\n * @see progressBarType\n */\n _this.onProgressText = _this.addEvent();\n /**\n * Use this event to process the markdown text.\n *
`sender` - the survey object that fires the event.\n *
`options.element` - SurveyJS element (a question, panel, page, or survey) where the string is going to be rendered.\n *
`options.name` - a property name is going to be rendered.\n *
`options.text` - a text that is going to be rendered.\n *
`options.html` - an HTML content. It is `null` by default. Use this property to specify the HTML content rendered instead of `options.text`.\n */\n _this.onTextMarkdown = _this.addEvent();\n /**\n * Use this event to specity render component name used for text rendering.\n *
`sender` - the survey object that fires the event.\n *
`options.element` - SurveyJS element (a question, panel, page, or survey) where the string is going to be rendered.\n *
`options.name` - a property name is going to be rendered.\n *
`options.renderAs` - a component name used for text rendering.\n */\n _this.onTextRenderAs = _this.addEvent();\n /**\n * The event fires when it gets response from the [api.surveyjs.io](https://api.surveyjs.io) service on saving survey results. Use it to find out if the results have been saved successfully.\n *
`sender` - the survey object that fires the event.\n *
`options.success` - it is `true` if the results has been sent to the service successfully.\n *
`options.response` - a response from the service.\n */\n _this.onSendResult = _this.addEvent();\n /**\n * Use it to get results after calling the `getResult` method. It returns a simple analytics from [api.surveyjs.io](https://api.surveyjs.io) service.\n *
`sender` - the survey object that fires the event.\n *
`options.success` - it is `true` if the results were got from the service successfully.\n *
`options.data` - the object `{AnswersCount, QuestionResult : {} }`. `AnswersCount` is the number of posted survey results. `QuestionResult` is an object with all possible unique answers to the question and number of these answers.\n *
`options.dataList` - an array of objects `{name, value}`, where `name` is a unique value/answer to the question and `value` is a number/count of such answers.\n *
`options.response` - the server response.\n * @see getResult\n */\n _this.onGetResult = _this.addEvent();\n /**\n * The event is fired on uploading the file in QuestionFile when `storeDataAsText` is set to `false`. Use this event to change the uploaded file name or to prevent a particular file from being uploaded.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - the file question instance.\n *
`options.name` - the question name.\n *
`options.files` - the Javascript File objects array to upload.\n *
`options.callback` - a callback function to get the file upload status and the updloaded file content.\n * @see uploadFiles\n * @see QuestionFileModel.storeDataAsText\n * @see onDownloadFile\n * @see onClearFiles\n * @see [View Examples](https://www.google.com/search?q=site%3Ahttps%3A%2F%2Fsurveyjs.io%2FExamples%2F+%22onUploadFiles%22)\n */\n _this.onUploadFiles = _this.addEvent();\n /**\n * The event is fired on downloading a file in QuestionFile. Use this event to pass the file to a preview.\n *
`sender` - the survey object that fires the event.\n *
`options.name` - the question name.\n *
`options.content` - the file content.\n *
`options.fileValue` - single file question value.\n *
`options.callback` - a callback function to get the file downloading status and the downloaded file content.\n * @see downloadFile\n * @see onClearFiles\n * @see onUploadFiles\n * @see [View Examples](https://www.google.com/search?q=site%3Ahttps%3A%2F%2Fsurveyjs.io%2FExamples%2F+%22onDownloadFile%22)\n */\n _this.onDownloadFile = _this.addEvent();\n /**\n * This event is fired on clearing the value in a QuestionFile. Use this event to remove files stored on your server.\n *
`sender` - the survey object that fires the event.\n *
`question` - the question instance.\n *
`options.name` - the question name.\n *
`options.value` - the question value.\n *
`options.fileName` - a removed file's name, set it to `null` to clear all files.\n *
`options.callback` - a callback function to get the operation status.\n * @see clearFiles\n * @see onDownloadFile\n * @see onUploadFiles\n * @see [View Examples](https://www.google.com/search?q=site%3Ahttps%3A%2F%2Fsurveyjs.io%2FExamples%2F+%22onClearFiles%22)\n */\n _this.onClearFiles = _this.addEvent();\n /**\n * The event is fired after choices for radiogroup, checkbox, and dropdown has been loaded from a RESTful service and before they are assigned to a question.\n * You may change the choices, before they are assigned or disable/enabled make visible/invisible question, based on loaded results.\n *
`sender` - the survey object that fires the event.\n *
`question` - the question where loaded choices are going to be assigned.\n *
`choices` - the loaded choices. You can change the loaded choices to before they are assigned to question.\n *
`serverResult` - a result that comes from the server as it is.\n */\n _this.onLoadChoicesFromServer = _this.addEvent();\n /**\n * The event is fired after survey is loaded from api.surveyjs.io service.\n * You can use this event to perform manipulation with the survey model after it was loaded from the web service.\n *
`sender` - the survey object that fires the event.\n * @see surveyId\n * @see loadSurveyFromService\n */\n _this.onLoadedSurveyFromService = _this.addEvent();\n /**\n * The event is fired on processing the text when it finds a text in brackets: `{somevalue}`. By default, it uses the value of survey question values and variables.\n * For example, you may use the text processing in loading choices from the web. If your `choicesByUrl.url` equals to \"UrlToServiceToGetAllCities/{country}/{state}\",\n * you may set on this event `options.value` to \"all\" or empty string when the \"state\" value/question is non selected by a user.\n *
`sender` - the survey object that fires the event.\n *
`options.name` - the name of the processing value, for example, \"state\" in our example.\n *
`options.value` - the value of the processing text.\n *
`options.isExists` - a boolean value. Set it to `true` if you want to use the value and set it to `false` if you don't.\n */\n _this.onProcessTextValue = _this.addEvent();\n /**\n * The event is fired before rendering a question. Use it to override the default question CSS classes.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a question for which you can change the CSS classes.\n *
`options.cssClasses` - an object with CSS classes. For example `{root: \"table\", button: \"button\"}`. You can change them to your own CSS classes.\n */\n _this.onUpdateQuestionCssClasses = _this.addEvent();\n /**\n * The event is fired before rendering a panel. Use it to override the default panel CSS classes.\n *
`sender` - the survey object that fires the event.\n *
`options.panel` - a panel for which you can change the CSS classes.\n *
`options.cssClasses` - an object with CSS classes. For example `{title: \"sv_p_title\", description: \"small\"}`. You can change them to your own CSS classes.\n */\n _this.onUpdatePanelCssClasses = _this.addEvent();\n /**\n * The event is fired before rendering a page. Use it to override the default page CSS classes.\n *
`sender` - the survey object that fires the event.\n *
`options.page` - a page for which you can change the CSS classes.\n *
`options.cssClasses` - an object with CSS classes. For example `{title: \"sv_p_title\", description: \"small\"}`. You can change them to your own CSS classes.\n */\n _this.onUpdatePageCssClasses = _this.addEvent();\n /**\n * The event is fired right after survey is rendered in DOM.\n *
`sender` - the survey object that fires the event.\n *
`options.htmlElement` - a root HTML element bound to the survey object.\n */\n _this.onAfterRenderSurvey = _this.addEvent();\n /**\n * The event is fired right after a page is rendered in DOM. Use it to modify HTML elements.\n *
`sender` - the survey object that fires the event.\n *
`options.htmlElement` - an HTML element bound to the survey header object.\n */\n _this.onAfterRenderHeader = _this.addEvent();\n /**\n * The event is fired right after a page is rendered in DOM. Use it to modify HTML elements.\n *
`sender` - the survey object that fires the event.\n *
`options.page` - a page object for which the event is fired. Typically the current/active page.\n *
`options.htmlElement` - an HTML element bound to the page object.\n */\n _this.onAfterRenderPage = _this.addEvent();\n /**\n * The event is fired right after a question is rendered in DOM. Use it to modify HTML elements.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a question object for which the event is fired.\n *
`options.htmlElement` - an HTML element bound to the question object.\n */\n _this.onAfterRenderQuestion = _this.addEvent();\n /**\n * The event is fired right after a non-composite question (text, comment, dropdown, radiogroup, checkbox) is rendered in DOM. Use it to modify HTML elements.\n * This event is not fired for matrices, panels, multiple text and image picker.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a question object for which the event is fired.\n *
`options.htmlElement` - an HTML element bound to the question object.\n */\n _this.onAfterRenderQuestionInput = _this.addEvent();\n /**\n * The event is fired right after a panel is rendered in DOM. Use it to modify HTML elements.\n *
`sender` - the survey object that fires the event\n *
`options.panel` - a panel object for which the event is fired\n *
`options.htmlElement` - an HTML element bound to the panel object\n */\n _this.onAfterRenderPanel = _this.addEvent();\n /**\n * The event is fired on adding a new row in Matrix Dynamic question.\n *
`sender` - the survey object that fires the event\n *
`options.question` - a matrix question.\n *
`options.row` - a new added row.\n * @see QuestionMatrixDynamicModel\n * @see QuestionMatrixDynamicModel.visibleRows\n */\n _this.onMatrixRowAdded = _this.addEvent();\n /**\n * The event is fired before adding a new row in Matrix Dynamic question.\n *
`sender` - the survey object that fires the event\n *
`options.question` - a matrix question.\n *
`options.canAddRow` - specifies whether a new row can be added\n * @see QuestionMatrixDynamicModel\n * @see QuestionMatrixDynamicModel.visibleRows\n */\n _this.onMatrixBeforeRowAdded = _this.addEvent();\n /**\n * The event is fired before removing a row from Matrix Dynamic question. You can disable removing and clear the data instead.\n *
`sender` - the survey object that fires the event\n *
`options.question` - a matrix question.\n *
`options.rowIndex` - a row index.\n *
`options.row` - a row object.\n *
`options.allow` - a boolean property. Set it to `false` to disable the row removing.\n * @see QuestionMatrixDynamicModel\n * @see onMatrixRowRemoved\n * @see onMatrixAllowRemoveRow\n */\n _this.onMatrixRowRemoving = _this.addEvent();\n /**\n * The event is fired on removing a row from Matrix Dynamic question.\n *
`sender` - the survey object that fires the event\n *
`options.question` - a matrix question\n *
`options.rowIndex` - a removed row index\n *
`options.row` - a removed row object\n * @see QuestionMatrixDynamicModel\n * @see QuestionMatrixDynamicModel.visibleRows\n * @see onMatrixRowRemoving\n * @see onMatrixAllowRemoveRow\n */\n _this.onMatrixRowRemoved = _this.addEvent();\n /**\n * The event is fired before rendering \"Remove\" button for removing a row from Matrix Dynamic question.\n *
`sender` - the survey object that fires the event\n *
`options.question` - a matrix question.\n *
`options.rowIndex` - a row index.\n *
`options.row` - a row object.\n *
`options.allow` - a boolean property. Set it to `false` to disable the row removing.\n * @see QuestionMatrixDynamicModel\n * @see onMatrixRowRemoving\n * @see onMatrixRowRemoved\n */\n _this.onMatrixAllowRemoveRow = _this.addEvent();\n /**\n * The event is fired for every cell created in Matrix Dynamic and Matrix Dropdown questions.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - the matrix question.\n *
`options.cell` - the matrix cell.\n *
`options.cellQuestion` - the question/editor in the cell. You may customize it, change it's properties, like choices or visible.\n *
`options.rowValue` - the value of the current row. To access a particular column's value within the current row, use: `options.rowValue[\"columnValue\"]`.\n *
`options.column` - the matrix column object.\n *
`options.columnName` - the matrix column name.\n *
`options.row` - the matrix row object.\n * @see onMatrixBeforeRowAdded\n * @see onMatrixRowAdded\n * @see QuestionMatrixDynamicModel\n * @see QuestionMatrixDropdownModel\n */\n _this.onMatrixCellCreated = _this.addEvent();\n /**\n * The event is fired for every cell after is has been rendered in DOM.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - the matrix question.\n *
`options.cell` - the matrix cell.\n *
`options.cellQuestion` - the question/editor in the cell.\n *
`options.htmlElement` - an HTML element bound to the `cellQuestion` object.\n *
`options.column` - the matrix column object.\n *
`options.row` - the matrix row object.\n * @see onMatrixCellCreated\n * @see QuestionMatrixDynamicModel\n * @see QuestionMatrixDropdownModel\n */\n _this.onMatrixAfterCellRender = _this.addEvent();\n /**\n * The event is fired when cell value is changed in Matrix Dynamic and Matrix Dropdown questions.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - the matrix question.\n *
`options.columnName` - the matrix column name.\n *
`options.value` - a new value.\n *
`options.row` - the matrix row object.\n *
`options.getCellQuestion(columnName)` - the function that returns the cell question by column name.\n * @see onMatrixCellValueChanging\n * @see onMatrixBeforeRowAdded\n * @see onMatrixRowAdded\n * @see QuestionMatrixDynamicModel\n * @see QuestionMatrixDropdownModel\n */\n _this.onMatrixCellValueChanged = _this.addEvent();\n /**\n * The event is fired on changing cell value in Matrix Dynamic and Matrix Dropdown questions. You may change the `options.value` property to change a cell value.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - the matrix question.\n *
`options.columnName` - the matrix column name.\n *
`options.value` - a new value.\n *
`options.oldValue` - the old value.\n *
`options.row` - the matrix row object.\n *
`options.getCellQuestion(columnName)` - the function that returns a cell question by column name.\n * @see onMatrixCellValueChanged\n * @see onMatrixBeforeRowAdded\n * @see onMatrixRowAdded\n * @see QuestionMatrixDynamicModel\n * @see QuestionMatrixDropdownModel\n */\n _this.onMatrixCellValueChanging = _this.addEvent();\n /**\n * The event is fired when Matrix Dynamic and Matrix Dropdown questions validate the cell value.\n *
`sender` - the survey object that fires the event.\n *
`options.error` - an error string. It is empty by default.\n *
`options.question` - the matrix question.\n *
`options.columnName` - the matrix column name.\n *
`options.value` - a cell value.\n *
`options.row` - the matrix row object.\n *
`options.getCellQuestion(columnName)` - the function that returns the cell question by column name.\n * @see onMatrixBeforeRowAdded\n * @see onMatrixRowAdded\n * @see QuestionMatrixDynamicModel\n * @see QuestionMatrixDropdownModel\n */\n _this.onMatrixCellValidate = _this.addEvent();\n /**\n * The event is fired on adding a new panel in Panel Dynamic question.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a panel question.\n *
`options.panel` - an added panel.\n * @see QuestionPanelDynamicModel\n * @see QuestionPanelDynamicModel.panels\n */\n _this.onDynamicPanelAdded = _this.addEvent();\n /**\n * The event is fired on removing a panel from Panel Dynamic question.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a panel question.\n *
`options.panelIndex` - a removed panel index.\n *
`options.panel` - a removed panel.\n * @see QuestionPanelDynamicModel\n * @see QuestionPanelDynamicModel.panels\n */\n _this.onDynamicPanelRemoved = _this.addEvent();\n /**\n * The event is fired every second if the method `startTimer` has been called.\n * @see startTimer\n * @see timeSpent\n * @see Page.timeSpent\n */\n _this.onTimer = _this.addEvent();\n /**\n * The event is fired before displaying a new information in the Timer Panel. Use it to change the default text.\n *
`sender` - the survey object that fires the event.\n *
`options.text` - the timer panel info text.\n */\n _this.onTimerPanelInfoText = _this.addEvent();\n /**\n * The event is fired when item value is changed in Panel Dynamic question.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - the panel question.\n *
`options.panel` - the dynamic panel item.\n *
`options.name` - the item name.\n *
`options.value` - a new value.\n *
`options.itemIndex` - the panel item index.\n *
`options.itemValue` - the panel item object.\n * @see onDynamicPanelAdded\n * @see QuestionPanelDynamicModel\n */\n _this.onDynamicPanelItemValueChanged = _this.addEvent();\n /**\n * Use this event to define, whether an answer to a question is correct or not.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - a question on which you have to decide if the answer is correct or not.\n *
`options.result` - returns `true`, if an answer is correct, or `false`, if the answer is not correct. Use questions' `value` and `correctAnswer` properties to return the correct value.\n *
`options.correctAnswers` - you may change the default number of correct or incorrect answers in the question, for example for matrix, where each row is a quiz question.\n * @see Question.value\n * @see Question.correctAnswer\n */\n _this.onIsAnswerCorrect = _this.addEvent();\n /**\n * Use this event to control drag&drop operations during design mode.\n *
`sender` - the survey object that fires the event.\n *
`options.allow` - set it to `false` to disable dragging.\n *
`options.target` - a target element that is dragged.\n *
`options.source` - a source element. It can be `null`, if it is a new element, dragging from toolbox.\n *
`options.parent` - a page or panel where target element is dragging.\n *
`options.insertBefore` - an element before the target element is dragging. It can be `null` if parent container (page or panel) is empty or dragging an element after the last element in a container.\n *
`options.insertAfter` - an element after the target element is dragging. It can be `null` if parent container (page or panel) is empty or dragging element to the first position within the parent container.\n * @see setDesignMode\n * @see isDesignMode\n */\n _this.onDragDropAllow = _this.addEvent();\n /**\n * Use this event to control scrolling element to top. You can cancel the default behavior by setting options.cancel property to true.\n *
`sender` - the survey object that fires the event.\n *
`options.element` - an element that is going to be scrolled on top.\n *
`options.question` - a question that is going to be scrolled on top. It can be null if options.page is not null.\n *
`options.page` - a page that is going to be scrolled on top. It can be null if options.question is not null.\n *
`options.elementId` - the unique element DOM Id.\n *
`options.cancel` - set this property to true to cancel the default scrolling.\n */\n _this.onScrollingElementToTop = _this.addEvent();\n _this.onLocaleChangedEvent = _this.addEvent();\n /**\n * Use this event to create/customize actions to be displayed in a question's title.\n *
`sender` - A [Survey](https://surveyjs.io/Documentation/Library?id=SurveyModel) object that fires the event.\n *
`options.question` - A [Question](https://surveyjs.io/Documentation/Library?id=Question) object for which the event is fired.\n *
`options.titleActions` - A list of actions ([IAction](https://surveyjs.io/Documentation/Library?id=IAction) objects) associated with the processed question.\n * @see IAction\n * @see Question\n */\n _this.onGetQuestionTitleActions = _this.addEvent();\n /**\n * Use this event to create/customize actions to be displayed in a panel's title.\n *
`sender` - A survey object that fires the event.\n *
`options.panel` - A panel ([PanelModel](https://surveyjs.io/Documentation/Library?id=panelmodel) object) for which the event is fired.\n *
`options.titleActions` - A list of actions ([IAction](https://surveyjs.io/Documentation/Library?id=IAction) objects) associated with the processed panel.\n * @see IAction\n * @see PanelModel\n */\n _this.onGetPanelTitleActions = _this.addEvent();\n /**\n * Use this event to create/customize actions to be displayed in a page's title.\n *
`sender` - A survey object that fires the event.\n *
`options.page` - A page ([PageModel](https://surveyjs.io/Documentation/Library?id=pagemodel) object) for which the event is fired.\n *
`options.titleActions` - A list of actions ([IAction](https://surveyjs.io/Documentation/Library?id=IAction) objects) associated with the processed page.\n * @see IAction\n * @see PageModel\n */\n _this.onGetPageTitleActions = _this.addEvent();\n /**\n * Use this event to create/customize actions to be displayed in a matrix question's row.\n *
`sender` - A survey object that fires the event.\n *
`options.question` - A matrix question ([QuestionMatrixBaseModel](https://surveyjs.io/Documentation/Library?id=questionmatrixbasemodel) object) for which the event is fired.\n *
`options.row` - A matrix row for which the event is fired.\n *
`options.actions` - A list of actions ([IAction](https://surveyjs.io/Documentation/Library?id=IAction) objects) associated with the processed matrix question and row.\n * @see IAction\n * @see QuestionMatrixDropdownModelBase\n */\n _this.onGetMatrixRowActions = _this.addEvent();\n /**\n * The event is fired after the survey element content was collapsed or expanded.\n *
`sender` - the survey object that fires the event.\n *
`options.element` - Specifies which survey element content was collapsed or expanded.\n * @see onElementContentVisibilityChanged\n */\n _this.onElementContentVisibilityChanged = _this.addEvent();\n /**\n * The event is fired before expression question convert it's value into display value for rendering.\n *
`sender` - the survey object that fires the event.\n *
`options.question` - The expression question.\n *
`options.value` - The question value.\n *
`options.displayValue` - the display value that you can change before rendering.\n */\n _this.onGetExpressionDisplayValue = _this.addEvent();\n /**\n * The list of errors on loading survey JSON. If the list is empty after loading a JSON, then the JSON is correct and has no errors.\n * @see JsonError\n */\n _this.jsonErrors = null;\n _this.cssValue = null;\n /**\n * Gets or sets whether to hide all required errors.\n */\n _this.hideRequiredErrors = false;\n //#endregion\n _this._isMobile = false;\n _this._isDesignMode = false;\n /**\n * Gets or sets whether the survey must ignore validation like required questions and others, on `nextPage` and `completeLastPage` function calls. The default is `false`.\n * @see nextPage\n * @see completeLastPage\n * @see mode\n */\n _this.ignoreValidation = false;\n _this.isNavigationButtonPressed = false;\n _this.isCalculatingProgressText = false;\n _this.isTriggerIsRunning = false;\n _this.triggerValues = null;\n _this.triggerKeys = null;\n _this.conditionValues = null;\n _this.isValueChangedOnRunningCondition = false;\n _this.conditionRunnerCounter = 0;\n _this.conditionUpdateVisibleIndexes = false;\n _this.conditionNotifyElementsOnAnyValueOrVariableChanged = false;\n _this.isEndLoadingFromJson = null;\n _this.questionHashes = {\n names: {},\n namesInsensitive: {},\n valueNames: {},\n valueNamesInsensitive: {},\n };\n _this.timerFunc = null;\n /**\n * Returns the time in seconds an end user spends on the survey\n * @see startTimer\n * @see PageModel.timeSpent\n */\n _this.timeSpent = 0;\n if (typeof document !== \"undefined\") {\n SurveyModel.stylesManager = new _stylesmanager__WEBPACK_IMPORTED_MODULE_12__[\"StylesManager\"]();\n }\n _this.createLocalizableString(\"title\", _this, true);\n _this.createLocalizableString(\"description\", _this, true);\n _this.createLocalizableString(\"logo\", _this, false);\n _this.createLocalizableString(\"completedHtml\", _this);\n _this.createLocalizableString(\"completedBeforeHtml\", _this);\n _this.createLocalizableString(\"loadingHtml\", _this);\n _this.createLocalizableString(\"startSurveyText\", _this);\n _this.createLocalizableString(\"pagePrevText\", _this);\n _this.createLocalizableString(\"pageNextText\", _this);\n _this.createLocalizableString(\"completeText\", _this);\n _this.createLocalizableString(\"previewText\", _this);\n _this.createLocalizableString(\"editText\", _this);\n _this.createLocalizableString(\"questionTitleTemplate\", _this, true);\n _this.textPreProcessor = new _textPreProcessor__WEBPACK_IMPORTED_MODULE_6__[\"TextPreProcessor\"]();\n _this.textPreProcessor.onProcess = function (textValue) {\n _this.getProcessedTextValue(textValue);\n };\n _this.createNewArray(\"pages\", function (value) {\n _this.doOnPageAdded(value);\n }, function (value) {\n _this.doOnPageRemoved(value);\n });\n _this.createNewArray(\"triggers\", function (value) {\n value.setOwner(_this);\n });\n _this.createNewArray(\"calculatedValues\", function (value) {\n value.setOwner(_this);\n });\n _this.createNewArray(\"completedHtmlOnCondition\", function (value) {\n value.locOwner = _this;\n });\n _this.createNewArray(\"navigateToUrlOnCondition\", function (value) {\n value.locOwner = _this;\n });\n _this.registerFunctionOnPropertyValueChanged(\"firstPageIsStarted\", function () {\n _this.onFirstPageIsStartedChanged();\n });\n _this.registerFunctionOnPropertyValueChanged(\"mode\", function () {\n _this.onModeChanged();\n });\n _this.registerFunctionOnPropertyValueChanged(\"progressBarType\", function () {\n _this.updateProgressText();\n });\n _this.registerFunctionOnPropertiesValueChanged([\"questionStartIndex\", \"requiredText\", \"questionTitlePattern\"], function () {\n _this.resetVisibleIndexes();\n });\n _this.onGetQuestionNo.onCallbacksChanged = function () {\n _this.resetVisibleIndexes();\n };\n _this.onProgressText.onCallbacksChanged = function () {\n _this.updateProgressText();\n };\n _this.onTextMarkdown.onCallbacksChanged = function () {\n _this.locStrsChanged();\n };\n _this.onGetQuestionTitle.onCallbacksChanged = function () {\n _this.locStrsChanged();\n };\n _this.onBeforeCreating();\n if (jsonObj) {\n if (typeof jsonObj === \"string\" || jsonObj instanceof String) {\n jsonObj = JSON.parse(jsonObj);\n }\n if (jsonObj && jsonObj.clientId) {\n _this.clientId = jsonObj.clientId;\n }\n _this.fromJSON(jsonObj);\n if (_this.surveyId) {\n _this.loadSurveyFromService(_this.surveyId, _this.clientId);\n }\n }\n _this.onCreating();\n return _this;\n }\n Object.defineProperty(SurveyModel.prototype, \"platformName\", {\n get: function () {\n return SurveyModel.platform;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"commentPrefix\", {\n /**\n * You can display an additional field (comment field) for the most of questions; users can enter additional comments to their response.\n * The comment field input is saved as `'question name' + 'commentPrefix'`.\n * @see data\n * @see Question.hasComment\n */\n get: function () {\n return _settings__WEBPACK_IMPORTED_MODULE_15__[\"settings\"].commentPrefix;\n },\n set: function (val) {\n _settings__WEBPACK_IMPORTED_MODULE_15__[\"settings\"].commentPrefix = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"currentPageValue\", {\n get: function () {\n return this.getPropertyValue(\"currentPageValue\", null);\n },\n set: function (val) {\n this.setPropertyValue(\"currentPageValue\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getType = function () {\n return \"survey\";\n };\n SurveyModel.prototype.onPropertyValueChanged = function (name, oldValue, newValue) {\n if (name === \"questionsOnPageMode\") {\n this.onQuestionsOnPageModeChanged(oldValue);\n }\n };\n Object.defineProperty(SurveyModel.prototype, \"pages\", {\n /**\n * Returns a list of all pages in the survey, including invisible pages.\n * @see PageModel\n * @see visiblePages\n */\n get: function () {\n return this.getPropertyValue(\"pages\");\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getCss = function () {\n return this.css;\n };\n Object.defineProperty(SurveyModel.prototype, \"css\", {\n get: function () {\n if (!this.cssValue) {\n this.cssValue = {};\n this.copyCssClasses(this.cssValue, _defaultCss_cssstandard__WEBPACK_IMPORTED_MODULE_4__[\"surveyCss\"].getCss());\n }\n return this.cssValue;\n },\n set: function (value) {\n this.updateElementCss(false);\n this.mergeValues(value, this.css);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"cssNavigationComplete\", {\n get: function () {\n return this.getNavigationCss(this.css.navigationButton, this.css.navigation.complete);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"cssNavigationPreview\", {\n get: function () {\n return this.getNavigationCss(this.css.navigationButton, this.css.navigation.preview);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"cssNavigationEdit\", {\n get: function () {\n return this.getNavigationCss(this.css.navigationButton, this.css.navigation.edit);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"cssNavigationPrev\", {\n get: function () {\n return this.getNavigationCss(this.css.navigationButton, this.css.navigation.prev);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"cssNavigationStart\", {\n get: function () {\n return this.getNavigationCss(this.css.navigationButton, this.css.navigation.start);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"cssNavigationNext\", {\n get: function () {\n return this.getNavigationCss(this.css.navigationButton, this.css.navigation.next);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"completedCss\", {\n get: function () {\n var css = this.css;\n return css.body + \" \" + css.completedPage;\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getNavigationCss = function (main, btn) {\n var res = \"\";\n if (main)\n res = main;\n if (btn)\n res += \" \" + btn;\n return res;\n };\n Object.defineProperty(SurveyModel.prototype, \"lazyRendering\", {\n /**\n * By default all rows are rendered no matters if they are visible or not.\n * Set it true, and survey markup rows will be rendered only if they are visible in viewport.\n * This feature is experimantal and might do not support all the use cases.\n */\n get: function () {\n return this.lazyRenderingValue === true;\n },\n set: function (val) {\n this.lazyRenderingValue = val;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isLazyRendering\", {\n get: function () {\n return this.lazyRendering || _settings__WEBPACK_IMPORTED_MODULE_15__[\"settings\"].lazyRowsRendering;\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.updateLazyRenderingRowsOnRemovingElements = function () {\n if (!this.isLazyRendering)\n return;\n var page = this.currentPage;\n if (!!page) {\n Object(_utils_utils__WEBPACK_IMPORTED_MODULE_16__[\"scrollElementByChildId\"])(page.id);\n }\n };\n Object.defineProperty(SurveyModel.prototype, \"triggers\", {\n /**\n * Gets or sets a list of triggers in the survey.\n * @see SurveyTrigger\n */\n get: function () {\n return this.getPropertyValue(\"triggers\");\n },\n set: function (val) {\n this.setPropertyValue(\"triggers\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"calculatedValues\", {\n /**\n * Gets or sets a list of calculated values in the survey.\n * @see CalculatedValue\n */\n get: function () {\n return this.getPropertyValue(\"calculatedValues\");\n },\n set: function (val) {\n this.setPropertyValue(\"calculatedValues\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"surveyId\", {\n /**\n * Gets or sets an identifier of a survey model loaded from the [api.surveyjs.io](https://api.surveyjs.io) service. When specified, the survey JSON is automatically loaded from [api.surveyjs.io](https://api.surveyjs.io) service.\n * @see loadSurveyFromService\n * @see onLoadedSurveyFromService\n */\n get: function () {\n return this.getPropertyValue(\"surveyId\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"surveyId\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"surveyPostId\", {\n /**\n * Gets or sets an identifier of a survey model saved to the [api.surveyjs.io](https://api.surveyjs.io) service. When specified, the survey data is automatically saved to the [api.surveyjs.io](https://api.surveyjs.io) service.\n * @see onComplete\n * @see surveyShowDataSaving\n */\n get: function () {\n return this.getPropertyValue(\"surveyPostId\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"surveyPostId\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"clientId\", {\n /**\n * Gets or sets user's identifier (e.g., e-mail or unique customer id) in your web application.\n * If you load survey or post survey results from/to [api.surveyjs.io](https://api.surveyjs.io) service, then the library do not allow users to run the same survey the second time.\n * On the second run, the user will see the survey complete page.\n */\n get: function () {\n return this.getPropertyValue(\"clientId\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"clientId\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"cookieName\", {\n /**\n * Gets or sets a cookie name used to save information about completing the survey.\n * If the property is not empty, before starting the survey, the Survey library checks if the cookie with this name exists.\n * If it is `true`, the survey goes to complete mode and a user sees the survey complete page. On completing the survey the cookie with this name is created.\n */\n get: function () {\n return this.getPropertyValue(\"cookieName\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"cookieName\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"sendResultOnPageNext\", {\n /**\n * Gets or sets whether to save survey results on completing every page. If the property value is set to `true`, the `onPartialSend` event is fired.\n * @see onPartialSend\n * @see clientId\n */\n get: function () {\n return this.getPropertyValue(\"sendResultOnPageNext\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"sendResultOnPageNext\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"surveyShowDataSaving\", {\n /**\n * Gets or sets whether to show the progress on saving/sending data into the [api.surveyjs.io](https://api.surveyjs.io) service.\n * @see surveyPostId\n */\n get: function () {\n return this.getPropertyValue(\"surveyShowDataSaving\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"surveyShowDataSaving\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"focusFirstQuestionAutomatic\", {\n /**\n * Gets or sets whether the first input is focused on showing a next or a previous page.\n */\n get: function () {\n return this.getPropertyValue(\"focusFirstQuestionAutomatic\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"focusFirstQuestionAutomatic\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"focusOnFirstError\", {\n /**\n * Gets or sets whether the first input is focused if the current page has errors.\n * Set this property to `false` (the default value is `true`) if you do not want to bring the focus to the first question that has error on the page.\n */\n get: function () {\n return this.getPropertyValue(\"focusOnFirstError\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"focusOnFirstError\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"showNavigationButtons\", {\n /**\n * Gets or sets the navigation buttons position.\n * Possible values: 'bottom' (default), 'top', 'both' and 'none'. Set it to 'none' to hide 'Prev', 'Next' and 'Complete' buttons.\n * It makes sense if you are going to create a custom navigation, have only a single page, or the `goNextPageAutomatic` property is set to `true`.\n * @see goNextPageAutomatic\n * @see showPrevButton\n */\n get: function () {\n return this.getPropertyValue(\"showNavigationButtons\");\n },\n set: function (val) {\n if (val === true || val === undefined) {\n val = \"bottom\";\n }\n if (val === false) {\n val = \"none\";\n }\n this.setPropertyValue(\"showNavigationButtons\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"showPrevButton\", {\n /**\n * Gets or sets whether the Survey displays \"Prev\" button in its pages. Set it to `false` to prevent end-users from going back to their answers.\n * @see showNavigationButtons\n */\n get: function () {\n return this.getPropertyValue(\"showPrevButton\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"showPrevButton\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"showTitle\", {\n /**\n * Gets or sets whether the Survey displays survey title in its pages. Set it to `false` to hide a survey title.\n * @see title\n */\n get: function () {\n return this.getPropertyValue(\"showTitle\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"showTitle\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"showPageTitles\", {\n /**\n * Gets or sets whether the Survey displays page titles. Set it to `false` to hide page titles.\n * @see PageModel.title\n */\n get: function () {\n return this.getPropertyValue(\"showPageTitles\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"showPageTitles\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"showCompletedPage\", {\n /**\n * On finishing the survey the complete page is shown. Set the property to `false`, to hide the complete page.\n * @see data\n * @see onComplete\n * @see navigateToUrl\n */\n get: function () {\n return this.getPropertyValue(\"showCompletedPage\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"showCompletedPage\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"navigateToUrl\", {\n /**\n * Set this property to a url you want to navigate after a user completing the survey.\n * By default it uses after calling onComplete event. In case calling options.showDataSaving callback in onComplete event, navigateToUrl will be used on calling options.showDataSavingSuccess callback.\n */\n get: function () {\n return this.getPropertyValue(\"navigateToUrl\");\n },\n set: function (val) {\n this.setPropertyValue(\"navigateToUrl\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"navigateToUrlOnCondition\", {\n /**\n * Gets or sets a list of URL condition items. If the expression of this item returns `true`, then survey will navigate to the item URL.\n * @see UrlConditionItem\n * @see navigateToUrl\n */\n get: function () {\n return this.getPropertyValue(\"navigateToUrlOnCondition\");\n },\n set: function (val) {\n this.setPropertyValue(\"navigateToUrlOnCondition\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getNavigateToUrl = function () {\n var item = this.getExpressionItemOnRunCondition(this.navigateToUrlOnCondition);\n var url = !!item ? item.url : this.navigateToUrl;\n if (!!url) {\n url = this.processText(url, true);\n }\n return url;\n };\n SurveyModel.prototype.navigateTo = function () {\n var url = this.getNavigateToUrl();\n var options = { url: url };\n this.onNavigateToUrl.fire(this, options);\n if (!options.url || typeof window === \"undefined\" || !window.location)\n return;\n window.location.href = options.url;\n };\n Object.defineProperty(SurveyModel.prototype, \"requiredText\", {\n /**\n * Gets or sets the required question mark. The required question mark is a char or string that is rendered in the required questions' titles.\n * @see Question.title\n */\n get: function () {\n return this.getPropertyValue(\"requiredText\", \"*\");\n },\n set: function (val) {\n this.setPropertyValue(\"requiredText\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.beforeSettingQuestionErrors = function (question, errors) {\n this.maakeRequiredErrorsInvisibgle(errors);\n this.onSettingQuestionErrors.fire(this, {\n question: question,\n errors: errors,\n });\n };\n SurveyModel.prototype.beforeSettingPanelErrors = function (question, errors) {\n this.maakeRequiredErrorsInvisibgle(errors);\n };\n SurveyModel.prototype.maakeRequiredErrorsInvisibgle = function (errors) {\n if (!this.hideRequiredErrors)\n return;\n for (var i = 0; i < errors.length; i++) {\n var erType = errors[i].getErrorType();\n if (erType == \"required\" || erType == \"requireoneanswer\") {\n errors[i].visible = false;\n }\n }\n };\n Object.defineProperty(SurveyModel.prototype, \"questionStartIndex\", {\n /**\n * Gets or sets the first question index. The first question index is '1' by default. You may start it from '100' or from 'A', by setting '100' or 'A' to this property.\n * You can set the start index to \"(1)\" or \"# A)\" or \"a)\" to render question number as (1), # A) and a) accordingly.\n * @see Question.title\n * @see requiredText\n */\n get: function () {\n return this.getPropertyValue(\"questionStartIndex\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"questionStartIndex\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"storeOthersAsComment\", {\n /**\n * Gets or sets whether the \"Others\" option text is stored as question comment.\n *\n * By default the entered text in the \"Others\" input in the checkbox/radiogroup/dropdown is stored as `\"question name \" + \"-Comment\"`. The value itself is `\"question name\": \"others\"`.\n * Set this property to `false`, to store the entered text directly in the `\"question name\"` key.\n * @see commentPrefix\n */\n get: function () {\n return this.getPropertyValue(\"storeOthersAsComment\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"storeOthersAsComment\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"maxTextLength\", {\n /**\n * Specifies the default maximum length for questions like text and comment, including matrix cell questions.\n *\n * The default value is `0`, that means that the text and comment have the same max length as the standard HTML input - 524288 characters: https://www.w3schools.com/tags/att_input_maxlength.asp.\n * @see maxOthersLength\n */\n get: function () {\n return this.getPropertyValue(\"maxTextLength\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"maxTextLength\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"maxOthersLength\", {\n /**\n * Gets or sets the default maximum length for question comments and others\n *\n * The default value is `0`, that means that the question comments have the same max length as the standard HTML input - 524288 characters: https://www.w3schools.com/tags/att_input_maxlength.asp.\n * @see Question.hasComment\n * @see Question.hasOther\n * @see maxTextLength\n */\n get: function () {\n return this.getPropertyValue(\"maxOthersLength\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"maxOthersLength\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"goNextPageAutomatic\", {\n /**\n * Gets or ses whether a user can navigate the next page automatically after answering all the questions on a page without pressing the \"Next\" button.\n * The available options:\n *\n * - `true` - navigate the next page and submit survey data automatically.\n * - `autogonext` - navigate the next page automatically but do not submit survey data.\n * - `false` - do not navigate the next page and do not submit survey data automatically.\n * @see showNavigationButtons\n */\n get: function () {\n return this.getPropertyValue(\"goNextPageAutomatic\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"goNextPageAutomatic\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"allowCompleteSurveyAutomatic\", {\n /**\n * Gets or sets whether a survey is automatically completed when `goNextPageAutomatic = true`. Set it to `false` if you do not want to submit survey automatically on completing the last survey page.\n * @see goNextPageAutomatic\n */\n get: function () {\n return this.getPropertyValue(\"allowCompleteSurveyAutomatic\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"allowCompleteSurveyAutomatic\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"checkErrorsMode\", {\n /**\n * Gets or sets a value that specifies how the survey validates the question answers.\n *\n * The following options are available:\n *\n * - `onNextPage` (default) - check errors on navigating to the next page or on completing the survey.\n * - `onValueChanged` - check errors on every question value (i.e., answer) changing.\n * - `onValueChanging` - check errors before setting value into survey. If there is an error, then survey data is not changed, but question value will be keeped.\n * - `onComplete` - to validate all visible questions on complete button click. If there are errors on previous pages, then the page with the first error becomes the current.\n */\n get: function () {\n return this.getPropertyValue(\"checkErrorsMode\");\n },\n set: function (val) {\n this.setPropertyValue(\"checkErrorsMode\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"textUpdateMode\", {\n /**\n * Gets or sets a value that specifies how the survey updates its questions' text values.\n *\n * The following options are available:\n *\n * - `onBlur` (default) - the value is updated after an input loses the focus.\n * - `onTyping` - update the value of text questions, \"text\" and \"comment\", on every key press.\n *\n * Note, that setting to \"onTyping\" may lead to a performance degradation, in case you have many expressions in the survey.\n */\n get: function () {\n return this.getPropertyValue(\"textUpdateMode\");\n },\n set: function (val) {\n this.setPropertyValue(\"textUpdateMode\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"clearInvisibleValues\", {\n /**\n * Gets or sets a value that specifies how the invisible data is included in survey data.\n *\n * The following options are available:\n *\n * - `none` - include the invisible values into the survey data.\n * - `onHidden` - clear the question value when it becomes invisible. If a question has value and it was invisible initially then survey clears the value on completing.\n * - `onHiddenContainer` - clear the question value when it or its parent (page or panel) becomes invisible. If a question has value and it was invisible initially then survey clears the value on completing.\n * - `onComplete` (default) - clear invisible question values on survey complete. In this case, the invisible questions will not be stored on the server.\n * @see Question.visible\n * @see onComplete\n */\n get: function () {\n return this.getPropertyValue(\"clearInvisibleValues\");\n },\n set: function (val) {\n if (val === true)\n val = \"onComplete\";\n if (val === false)\n val = \"none\";\n this.setPropertyValue(\"clearInvisibleValues\", val);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Call this function to remove all question values from the survey, that end-user will not be able to enter.\n * For example the value that doesn't exists in a radiogroup/dropdown/checkbox choices or matrix rows/columns.\n * Please note, this function doesn't clear values for invisible questions or values that doesn't associated with questions.\n * In fact this function just call clearIncorrectValues function of all questions in the survey\n * @param removeNonExisingRootKeys - set this parameter to true to remove keys from survey.data that doesn't have corresponded questions and calculated values\n * @see Question.clearIncorrectValues\n * @see Page.clearIncorrectValues\n * @see Panel.clearIncorrectValues\n */\n SurveyModel.prototype.clearIncorrectValues = function (removeNonExisingRootKeys) {\n if (removeNonExisingRootKeys === void 0) { removeNonExisingRootKeys = false; }\n for (var i = 0; i < this.pages.length; i++) {\n this.pages[i].clearIncorrectValues();\n }\n if (!removeNonExisingRootKeys)\n return;\n var data = this.data;\n var hasChanges = false;\n for (var key in data) {\n if (!!this.getQuestionByValueName(key))\n continue;\n if (this.iscorrectValueWithPostPrefix(key, _settings__WEBPACK_IMPORTED_MODULE_15__[\"settings\"].commentPrefix) ||\n this.iscorrectValueWithPostPrefix(key, _settings__WEBPACK_IMPORTED_MODULE_15__[\"settings\"].matrixTotalValuePostFix))\n continue;\n var calcValue = this.getCalculatedValueByName(key);\n if (!!calcValue && calcValue.includeIntoResult)\n continue;\n hasChanges = true;\n delete data[key];\n }\n if (hasChanges) {\n this.data = data;\n }\n };\n SurveyModel.prototype.iscorrectValueWithPostPrefix = function (key, postPrefix) {\n if (key.indexOf(postPrefix) !== key.length - postPrefix.length)\n return false;\n return !!this.getQuestionByValueName(key.substr(0, key.indexOf(postPrefix)));\n };\n Object.defineProperty(SurveyModel.prototype, \"locale\", {\n /**\n * Gets or sets the survey locale. The default value it is empty, this means the 'en' locale is used.\n * You can set it to 'de' - German, 'fr' - French and so on. The library has built-in localization for several languages. The library has a multi-language support as well.\n */\n get: function () {\n return this.localeValue;\n },\n set: function (value) {\n _surveyStrings__WEBPACK_IMPORTED_MODULE_9__[\"surveyLocalization\"].currentLocale = value;\n this.localeValue = _surveyStrings__WEBPACK_IMPORTED_MODULE_9__[\"surveyLocalization\"].currentLocale;\n this.setPropertyValue(\"locale\", this.localeValue);\n if (this.isLoadingFromJson)\n return;\n this.locStrsChanged();\n this.localeChanged();\n this.onLocaleChangedEvent.fire(this, value);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Returns an array of locales that are used in the survey's translation.\n */\n SurveyModel.prototype.getUsedLocales = function () {\n var locs = new Array();\n this.addUsedLocales(locs);\n //Replace the default locale with the real one\n var index = locs.indexOf(\"default\");\n if (index > -1) {\n var defaultLoc = _surveyStrings__WEBPACK_IMPORTED_MODULE_9__[\"surveyLocalization\"].defaultLocale;\n //Remove the defaultLoc\n var defIndex = locs.indexOf(defaultLoc);\n if (defIndex > -1) {\n locs.splice(defIndex, 1);\n }\n index = locs.indexOf(\"default\");\n locs[index] = defaultLoc;\n }\n return locs;\n };\n SurveyModel.prototype.localeChanged = function () {\n for (var i = 0; i < this.pages.length; i++) {\n this.pages[i].localeChanged();\n }\n };\n //ILocalizableOwner\n SurveyModel.prototype.getLocale = function () {\n return this.locale;\n };\n SurveyModel.prototype.locStrsChanged = function () {\n _super.prototype.locStrsChanged.call(this);\n //Do not set current page if it is not set yet.\n //At first we do not need this, at second it creates issues with Vue CLI projects\n //More information here: https://github.com/surveyjs/survey-library/issues/2599\n if (!this.currentPageValue)\n return;\n this.updateProgressText();\n var page = this.activePage;\n if (!!page) {\n page.locStrsChanged();\n }\n };\n SurveyModel.prototype.getMarkdownHtml = function (text, name) {\n return this.getSurveyMarkdownHtml(this, text, name);\n };\n SurveyModel.prototype.getRenderer = function (name) {\n return this.getRendererForString(this, name);\n };\n SurveyModel.prototype.getRendererForString = function (element, name) {\n var renderAs = this.getBuiltInRendererForString(element, name);\n var options = { element: element, name: name, renderAs: renderAs };\n this.onTextRenderAs.fire(this, options);\n return options.renderAs;\n };\n SurveyModel.prototype.getExpressionDisplayValue = function (question, value, displayValue) {\n var options = {\n question: question,\n value: value,\n displayValue: displayValue,\n };\n this.onGetExpressionDisplayValue.fire(this, options);\n return options.displayValue;\n };\n SurveyModel.prototype.getBuiltInRendererForString = function (element, name) {\n if (this.isDesignMode)\n return _localizablestring__WEBPACK_IMPORTED_MODULE_11__[\"LocalizableString\"].editableRenderer;\n return undefined;\n };\n SurveyModel.prototype.getProcessedText = function (text) {\n return this.processText(text, true);\n };\n SurveyModel.prototype.getLocString = function (str) {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_9__[\"surveyLocalization\"].getString(str);\n };\n //ISurveyErrorOwner\n SurveyModel.prototype.getErrorCustomText = function (text, error) {\n var options = {\n text: text,\n name: error.getErrorType(),\n error: error,\n };\n this.onErrorCustomText.fire(this, options);\n return options.text;\n };\n Object.defineProperty(SurveyModel.prototype, \"emptySurveyText\", {\n /**\n * Returns the text that is displayed when there are no any visible pages and questiona.\n */\n get: function () {\n return this.getLocString(\"emptySurvey\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"title\", {\n //#region Title/Header options\n /**\n * Gets or sets a survey title.\n * @see description\n */\n get: function () {\n return this.getLocalizableStringText(\"title\");\n },\n set: function (value) {\n this.setLocalizableStringText(\"title\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locTitle\", {\n get: function () {\n return this.getLocalizableString(\"title\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"description\", {\n /**\n * Gets or sets a survey description. The survey description is displayed under a survey title.\n * @see title\n */\n get: function () {\n return this.getLocalizableStringText(\"description\");\n },\n set: function (value) {\n this.setLocalizableStringText(\"description\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locDescription\", {\n get: function () {\n return this.getLocalizableString(\"description\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"logo\", {\n /**\n * Gets or sets a survey logo.\n * @see title\n */\n get: function () {\n return this.getLocalizableStringText(\"logo\");\n },\n set: function (value) {\n this.setLocalizableStringText(\"logo\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locLogo\", {\n get: function () {\n return this.getLocalizableString(\"logo\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"logoWidth\", {\n /**\n * Gets or sets a survey logo width.\n * @see logo\n */\n get: function () {\n var width = this.getPropertyValue(\"logoWidth\");\n return Object(_utils_utils__WEBPACK_IMPORTED_MODULE_16__[\"getSize\"])(width);\n },\n set: function (value) {\n this.setPropertyValue(\"logoWidth\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"logoHeight\", {\n /**\n * Gets or sets a survey logo height.\n * @see logo\n */\n get: function () {\n var height = this.getPropertyValue(\"logoHeight\");\n return Object(_utils_utils__WEBPACK_IMPORTED_MODULE_16__[\"getSize\"])(height);\n },\n set: function (value) {\n this.setPropertyValue(\"logoHeight\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"logoPosition\", {\n /**\n * Gets or sets a survey logo position.\n * @see logo\n */\n get: function () {\n return this.getPropertyValue(\"logoPosition\");\n },\n set: function (value) {\n this.setPropertyValue(\"logoPosition\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"hasLogo\", {\n get: function () {\n return !!this.logo && this.logoPosition !== \"none\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isLogoBefore\", {\n get: function () {\n if (this.isDesignMode)\n return false;\n return (this.renderedHasLogo &&\n (this.logoPosition === \"left\" || this.logoPosition === \"top\"));\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isLogoAfter\", {\n get: function () {\n if (this.isDesignMode)\n return this.renderedHasLogo;\n return (this.renderedHasLogo &&\n (this.logoPosition === \"right\" || this.logoPosition === \"bottom\"));\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"logoClassNames\", {\n get: function () {\n var logoClasses = {\n left: \"sv-logo--left\",\n right: \"sv-logo--right\",\n top: \"sv-logo--top\",\n bottom: \"sv-logo--bottom\",\n };\n return this.css.logo + \" \" + logoClasses[this.logoPosition];\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"renderedHasTitle\", {\n get: function () {\n if (this.isDesignMode)\n return this.isPropertyVisible(\"title\");\n return !this.locTitle.isEmpty && this.showTitle;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"renderedHasLogo\", {\n get: function () {\n if (this.isDesignMode)\n return this.isPropertyVisible(\"logo\");\n return this.hasLogo;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"renderedHasHeader\", {\n get: function () {\n return this.renderedHasTitle || this.renderedHasLogo;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"logoFit\", {\n /**\n * The logo fit mode.\n * @see logo\n */\n get: function () {\n return this.getPropertyValue(\"logoFit\");\n },\n set: function (val) {\n this.setPropertyValue(\"logoFit\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.setIsMobile = function (newVal) {\n if (newVal === void 0) { newVal = true; }\n this._isMobile = newVal;\n };\n Object.defineProperty(SurveyModel.prototype, \"isMobile\", {\n get: function () {\n return Object(_utils_utils__WEBPACK_IMPORTED_MODULE_16__[\"isMobile\"])() || this._isMobile;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"titleMaxWidth\", {\n get: function () {\n if (!this.isMobile &&\n !this.isValueEmpty(this.logo) &&\n !_settings__WEBPACK_IMPORTED_MODULE_15__[\"settings\"].supportCreatorV2) {\n var logoWidth = this.logoWidth;\n if (this.logoPosition === \"left\" || this.logoPosition === \"right\") {\n return \"calc(100% - 5px - 2em - \" + logoWidth + \")\";\n }\n }\n return \"\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"completedHtml\", {\n /**\n * Gets or sets the HTML content displayed on the complete page. Use this property to change the default complete page text.\n * @see showCompletedPage\n * @see completedHtmlOnCondition\n * @see locale\n */\n get: function () {\n return this.getLocalizableStringText(\"completedHtml\");\n },\n set: function (value) {\n this.setLocalizableStringText(\"completedHtml\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locCompletedHtml\", {\n get: function () {\n return this.getLocalizableString(\"completedHtml\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"completedHtmlOnCondition\", {\n /**\n * The list of HTML condition items. If the expression of this item returns `true`, then a survey will use this item HTML instead of `completedHtml`.\n * @see HtmlConditionItem\n * @see completeHtml\n */\n get: function () {\n return this.getPropertyValue(\"completedHtmlOnCondition\");\n },\n set: function (val) {\n this.setPropertyValue(\"completedHtmlOnCondition\", val);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Calculates a given expression and returns a result value.\n * @param expression\n */\n SurveyModel.prototype.runExpression = function (expression) {\n if (!expression)\n return null;\n var values = this.getFilteredValues();\n var properties = this.getFilteredProperties();\n return new _conditions__WEBPACK_IMPORTED_MODULE_14__[\"ExpressionRunner\"](expression).run(values, properties);\n };\n /**\n * Calculates a given expression and returns `true` or `false`.\n * @param expression\n */\n SurveyModel.prototype.runCondition = function (expression) {\n if (!expression)\n return false;\n var values = this.getFilteredValues();\n var properties = this.getFilteredProperties();\n return new _conditions__WEBPACK_IMPORTED_MODULE_14__[\"ConditionRunner\"](expression).run(values, properties);\n };\n /**\n * Run all triggers that performs on value changed and not on moving to the next page.\n */\n SurveyModel.prototype.runTriggers = function () {\n this.checkTriggers(this.getFilteredValues(), false);\n };\n Object.defineProperty(SurveyModel.prototype, \"renderedCompletedHtml\", {\n get: function () {\n var item = this.getExpressionItemOnRunCondition(this.completedHtmlOnCondition);\n return !!item ? item.html : this.completedHtml;\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getExpressionItemOnRunCondition = function (items) {\n if (items.length == 0)\n return null;\n var values = this.getFilteredValues();\n var properties = this.getFilteredProperties();\n for (var i = 0; i < items.length; i++) {\n if (items[i].runCondition(values, properties)) {\n return items[i];\n }\n }\n return null;\n };\n Object.defineProperty(SurveyModel.prototype, \"completedBeforeHtml\", {\n /**\n * The HTML content displayed to an end user that has already completed the survey.\n * @see clientId\n * @see locale\n */\n get: function () {\n return this.getLocalizableStringText(\"completedBeforeHtml\");\n },\n set: function (value) {\n this.setLocalizableStringText(\"completedBeforeHtml\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locCompletedBeforeHtml\", {\n get: function () {\n return this.getLocalizableString(\"completedBeforeHtml\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"loadingHtml\", {\n /**\n * The HTML that shows on loading survey Json from the [api.surveyjs.io](https://api.surveyjs.io) service.\n * @see surveyId\n * @see locale\n */\n get: function () {\n return this.getLocalizableStringText(\"loadingHtml\");\n },\n set: function (value) {\n this.setLocalizableStringText(\"loadingHtml\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locLoadingHtml\", {\n get: function () {\n return this.getLocalizableString(\"loadingHtml\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"startSurveyText\", {\n /**\n * Gets or sets the 'Start' button caption.\n * The 'Start' button is shown on the started page. Set the `firstPageIsStarted` property to `true`, to display the started page.\n * @see firstPageIsStarted\n * @see locale\n */\n get: function () {\n return this.getLocalizableStringText(\"startSurveyText\", this.getLocString(\"startSurveyText\"));\n },\n set: function (newValue) {\n this.setLocalizableStringText(\"startSurveyText\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locStartSurveyText\", {\n get: function () {\n return this.getLocalizableString(\"startSurveyText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"pagePrevText\", {\n /**\n * Gets or sets the 'Prev' button caption.\n * @see locale\n */\n get: function () {\n return this.getLocalizableStringText(\"pagePrevText\", this.getLocString(\"pagePrevText\"));\n },\n set: function (newValue) {\n this.setLocalizableStringText(\"pagePrevText\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locPagePrevText\", {\n get: function () {\n return this.getLocalizableString(\"pagePrevText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"pageNextText\", {\n /**\n * Gets or sets the 'Next' button caption.\n * @see locale\n */\n get: function () {\n return this.getLocalizableStringText(\"pageNextText\", this.getLocString(\"pageNextText\"));\n },\n set: function (newValue) {\n this.setLocalizableStringText(\"pageNextText\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locPageNextText\", {\n get: function () {\n return this.getLocalizableString(\"pageNextText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"completeText\", {\n /**\n * Gets or sets the 'Complete' button caption.\n * @see locale\n */\n get: function () {\n return this.getLocalizableStringText(\"completeText\", this.getLocString(\"completeText\"));\n },\n set: function (newValue) {\n this.setLocalizableStringText(\"completeText\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locCompleteText\", {\n get: function () {\n return this.getLocalizableString(\"completeText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"previewText\", {\n /**\n * Gets or sets the 'Preview' button caption.\n * @see locale\n * @see showPreviewBeforeComplete\n * @see editText\n * @see showPreview\n */\n get: function () {\n return this.getLocalizableStringText(\"previewText\", this.getLocString(\"previewText\"));\n },\n set: function (newValue) {\n this.setLocalizableStringText(\"previewText\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locPreviewText\", {\n get: function () {\n return this.getLocalizableString(\"previewText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"editText\", {\n /**\n * Gets or sets the 'Edit' button caption.\n * @see locale\n * @see showPreviewBeforeComplete\n * @see previewText\n * @see cancelPreview\n */\n get: function () {\n return this.getLocalizableStringText(\"editText\", this.getLocString(\"editText\"));\n },\n set: function (newValue) {\n this.setLocalizableStringText(\"editText\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"locEditText\", {\n get: function () {\n return this.getLocalizableString(\"editText\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"questionTitlePattern\", {\n /**\n * Set the pattern for question title. Default is \"numTitleRequire\", 1. What is your name? *,\n * You can set it to numRequireTitle: 1. * What is your name?\n * You can set it to requireNumTitle: * 1. What is your name?\n * You can set it to numTitle (remove require symbol completely): 1. What is your name?\n * @see QuestionModel.title\n */\n get: function () {\n return this.getPropertyValue(\"questionTitlePattern\", \"numTitleRequire\");\n },\n set: function (val) {\n if (val !== \"numRequireTitle\" &&\n val !== \"requireNumTitle\" &&\n val != \"numTitle\") {\n val = \"numTitleRequire\";\n }\n this.setPropertyValue(\"questionTitlePattern\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getQuestionTitlePatternOptions = function () {\n var res = new Array();\n var title = this.getLocString(\"questionTitlePatternText\");\n var num = !!this.questionStartIndex ? this.questionStartIndex : \"1.\";\n res.push({\n value: \"numTitleRequire\",\n text: num + \" \" + title + \" \" + this.requiredText,\n });\n res.push({\n value: \"numRequireTitle\",\n text: num + \" \" + this.requiredText + \" \" + title,\n });\n res.push({\n value: \"requireNumTitle\",\n text: this.requiredText + \" \" + num + \" \" + title,\n });\n res.push({\n value: \"numTitle\",\n text: num + \" \" + title,\n });\n return res;\n };\n Object.defineProperty(SurveyModel.prototype, \"questionTitleTemplate\", {\n /**\n * Gets or sets a question title template. Obsolete, please use questionTitlePattern\n * @see QuestionModel.title\n * @see questionTitlePattern\n */\n get: function () {\n return this.getLocalizableStringText(\"questionTitleTemplate\");\n },\n set: function (value) {\n this.setLocalizableStringText(\"questionTitleTemplate\", value);\n this.questionTitlePattern = this.getNewTitlePattern(value);\n this.questionStartIndex = this.getNewQuestionTitleElement(value, \"no\", this.questionStartIndex, \"1\");\n this.requiredText = this.getNewQuestionTitleElement(value, \"require\", this.requiredText, \"*\");\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getNewTitlePattern = function (template) {\n if (!!template) {\n var strs = [];\n while (template.indexOf(\"{\") > -1) {\n template = template.substr(template.indexOf(\"{\") + 1);\n var ind = template.indexOf(\"}\");\n if (ind < 0)\n break;\n strs.push(template.substr(0, ind));\n template = template.substr(ind + 1);\n }\n if (strs.length > 1) {\n if (strs[0] == \"require\")\n return \"requireNumTitle\";\n if (strs[1] == \"require\" && strs.length == 3)\n return \"numRequireTitle\";\n if (strs.indexOf(\"require\") < 0)\n return \"numTitle\";\n }\n if (strs.length == 1 && strs[0] == \"title\") {\n return \"numTitle\";\n }\n }\n return \"numTitleRequire\";\n };\n SurveyModel.prototype.getNewQuestionTitleElement = function (template, name, currentValue, defaultValue) {\n name = \"{\" + name + \"}\";\n if (!template || template.indexOf(name) < 0)\n return currentValue;\n var ind = template.indexOf(name);\n var prefix = \"\";\n var postfix = \"\";\n var i = ind - 1;\n for (; i >= 0; i--) {\n if (template[i] == \"}\")\n break;\n }\n if (i < ind - 1) {\n prefix = template.substr(i + 1, ind - i - 1);\n }\n ind += name.length;\n i = ind;\n for (; i < template.length; i++) {\n if (template[i] == \"{\")\n break;\n }\n if (i > ind) {\n postfix = template.substr(ind, i - ind);\n }\n i = 0;\n while (i < prefix.length && prefix.charCodeAt(i) < 33)\n i++;\n prefix = prefix.substr(i);\n i = postfix.length - 1;\n while (i >= 0 && postfix.charCodeAt(i) < 33)\n i--;\n postfix = postfix.substr(0, i + 1);\n if (!prefix && !postfix)\n return currentValue;\n var value = !!currentValue ? currentValue : defaultValue;\n return prefix + value + postfix;\n };\n Object.defineProperty(SurveyModel.prototype, \"locQuestionTitleTemplate\", {\n get: function () {\n return this.getLocalizableString(\"questionTitleTemplate\");\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getUpdatedQuestionTitle = function (question, title) {\n if (this.onGetQuestionTitle.isEmpty)\n return title;\n var options = { question: question, title: title };\n this.onGetQuestionTitle.fire(this, options);\n return options.title;\n };\n SurveyModel.prototype.getUpdatedQuestionNo = function (question, no) {\n if (this.onGetQuestionNo.isEmpty)\n return no;\n var options = { question: question, no: no };\n this.onGetQuestionNo.fire(this, options);\n return options.no;\n };\n Object.defineProperty(SurveyModel.prototype, \"showPageNumbers\", {\n /**\n * Gets or sets whether the survey displays page numbers on pages titles.\n */\n get: function () {\n return this.getPropertyValue(\"showPageNumbers\", false);\n },\n set: function (value) {\n if (value === this.showPageNumbers)\n return;\n this.setPropertyValue(\"showPageNumbers\", value);\n this.updateVisibleIndexes();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"showQuestionNumbers\", {\n /**\n * Gets or sets a value that specifies how the question numbers are displayed.\n *\n * The following options are available:\n *\n * - `on` - display question numbers\n * - `onpage` - display question numbers, start numbering on every page\n * - `off` - turn off the numbering for questions titles\n */\n get: function () {\n return this.getPropertyValue(\"showQuestionNumbers\");\n },\n set: function (value) {\n value = value.toLowerCase();\n value = value === \"onpage\" ? \"onPage\" : value;\n if (value === this.showQuestionNumbers)\n return;\n this.setPropertyValue(\"showQuestionNumbers\", value);\n this.updateVisibleIndexes();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"showProgressBar\", {\n /**\n * Gets or sets the survey progress bar position.\n *\n * The following options are available:\n *\n * - `off` (default) - don't show progress bar\n * - `top` - show progress bar in the top\n * - `bottom` - show progress bar in the bottom\n * - `both` - show progress bar in both sides: top and bottom.\n */\n get: function () {\n return this.getPropertyValue(\"showProgressBar\");\n },\n set: function (newValue) {\n this.setPropertyValue(\"showProgressBar\", newValue.toLowerCase());\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"progressBarType\", {\n /**\n * Gets or sets the type of info in the progress bar.\n *\n * The following options are available:\n *\n * - `pages` (default),\n * - `questions`,\n * - `requiredQuestions`,\n * - `correctQuestions`,\n * - `buttons`\n */\n get: function () {\n return this.getPropertyValue(\"progressBarType\");\n },\n set: function (newValue) {\n if (newValue === \"correctquestion\")\n newValue = \"correctQuestion\";\n if (newValue === \"requiredquestion\")\n newValue = \"requiredQuestion\";\n this.setPropertyValue(\"progressBarType\", newValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isShowProgressBarOnTop\", {\n get: function () {\n if (!this.canShowProresBar())\n return false;\n return this.showProgressBar === \"top\" || this.showProgressBar === \"both\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isShowProgressBarOnBottom\", {\n get: function () {\n if (!this.canShowProresBar())\n return false;\n return this.showProgressBar === \"bottom\" || this.showProgressBar === \"both\";\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.canShowProresBar = function () {\n return (!this.isShowingPreview ||\n this.showPreviewBeforeComplete != \"showAllQuestions\");\n };\n Object.defineProperty(SurveyModel.prototype, \"processedTitle\", {\n /**\n * Returns the text/HTML that is rendered as a survey title.\n */\n get: function () {\n return this.locTitle.renderedHtml;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"questionTitleLocation\", {\n /**\n * Gets or sets the question title location.\n *\n * The following options are available:\n *\n * - `bottom` - show a question title to bottom\n * - `left` - show a question title to left\n * - `top` - show a question title to top.\n *\n * > Some questions, for example matrixes, do not support 'left' value. The title for them will be displayed to the top.\n */\n get: function () {\n return this.getPropertyValue(\"questionTitleLocation\");\n },\n set: function (value) {\n this.setPropertyValue(\"questionTitleLocation\", value.toLowerCase());\n if (!this.isLoadingFromJson) {\n this.updateElementCss(true);\n }\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.updateElementCss = function (reNew) {\n var pages = this.visiblePages;\n for (var i = 0; i < pages.length; i++) {\n pages[i].updateElementCss(reNew);\n }\n };\n Object.defineProperty(SurveyModel.prototype, \"questionErrorLocation\", {\n /**\n * Gets or sets the error message position.\n *\n * The following options are available:\n *\n * - `top` - to show question error(s) over the question,\n * - `bottom` - to show question error(s) under the question.\n */\n get: function () {\n return this.getPropertyValue(\"questionErrorLocation\");\n },\n set: function (value) {\n this.setPropertyValue(\"questionErrorLocation\", value.toLowerCase());\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"questionDescriptionLocation\", {\n /**\n * Gets or sets the question description position. The default value is `underTitle`.\n *\n * The following options are available:\n *\n * - `underTitle` - show question description under the question title,\n * - `underInput` - show question description under the question input instead of question title.\n */\n get: function () {\n return this.getPropertyValue(\"questionDescriptionLocation\");\n },\n set: function (value) {\n this.setPropertyValue(\"questionDescriptionLocation\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"mode\", {\n /**\n * Gets or sets the survey edit mode.\n *\n * The following options are available:\n *\n * - `edit` (default) - make a survey editable,\n * - `display` - make a survey read-only.\n */\n get: function () {\n return this.getPropertyValue(\"mode\");\n },\n set: function (value) {\n value = value.toLowerCase();\n if (value == this.mode)\n return;\n if (value != \"edit\" && value != \"display\")\n return;\n this.setPropertyValue(\"mode\", value);\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.onModeChanged = function () {\n for (var i = 0; i < this.pages.length; i++) {\n var page = this.pages[i];\n page.setPropertyValue(\"isReadOnly\", page.isReadOnly);\n }\n };\n Object.defineProperty(SurveyModel.prototype, \"data\", {\n /**\n * Gets or sets an object that stores the survey results/data. You can set it directly as `{ 'question name': questionValue, ... }`\n *\n * > If you set the `data` property after creating the survey, you may need to set the `currentPageNo` to `0`, if you are using `visibleIf` properties for questions/pages/panels to ensure that you are starting from the first page.\n * @see setValue\n * @see getValue\n * @see mergeData\n * @see currentPageNo\n */\n get: function () {\n var result = {};\n var keys = this.getValuesKeys();\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var dataValue = this.getDataValueCore(this.valuesHash, key);\n if (dataValue !== undefined) {\n result[key] = dataValue;\n }\n }\n this.setCalcuatedValuesIntoResult(result);\n return result;\n },\n set: function (data) {\n this.valuesHash = {};\n this.setDataCore(data);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Merge the values into survey.data. It works as survey.data, except it doesn't clean the existing data, but overrides them.\n * @param data data to merge. It should be an object {keyValue: Value, ...}\n * @see data\n * @see setValue\n */\n SurveyModel.prototype.mergeData = function (data) {\n if (!data)\n return;\n this.setDataCore(data);\n };\n SurveyModel.prototype.setDataCore = function (data) {\n if (data) {\n for (var key in data) {\n this.setDataValueCore(this.valuesHash, key, data[key]);\n }\n }\n this.updateAllQuestionsValue();\n this.notifyAllQuestionsOnValueChanged();\n this.notifyElementsOnAnyValueOrVariableChanged(\"\");\n this.runConditions();\n };\n Object.defineProperty(SurveyModel.prototype, \"editingObj\", {\n get: function () {\n return this.editingObjValue;\n },\n set: function (val) {\n var _this = this;\n if (this.editingObj == val)\n return;\n if (!!this.editingObj) {\n this.editingObj.onPropertyChanged.remove(this.onEditingObjPropertyChanged);\n }\n this.editingObjValue = val;\n if (this.isDisposed)\n return;\n if (!val) {\n var questions = this.getAllQuestions();\n for (var i = 0; i < questions.length; i++) {\n questions[i].unbindValue();\n }\n }\n if (!!this.editingObj) {\n this.setDataCore({});\n this.onEditingObjPropertyChanged = function (sender, options) {\n if (!_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].hasOriginalProperty(_this.editingObj, options.name))\n return;\n _this.updateOnSetValue(options.name, options.newValue, options.oldValue);\n };\n this.editingObj.onPropertyChanged.add(this.onEditingObjPropertyChanged);\n }\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isEditingSurveyElement\", {\n get: function () {\n return !!this.editingObj;\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.setCalcuatedValuesIntoResult = function (result) {\n for (var i = 0; i < this.calculatedValues.length; i++) {\n var calValue = this.calculatedValues[i];\n if (calValue.includeIntoResult &&\n !!calValue.name &&\n this.getVariable(calValue.name) !== undefined) {\n result[calValue.name] = this.getVariable(calValue.name);\n }\n }\n };\n SurveyModel.prototype.getAllValues = function () {\n return this.data;\n };\n /**\n * Returns survey result data as an array of plain objects: with question `title`, `name`, `value`, and `displayValue`.\n *\n * For complex questions (like matrix, etc.) `isNode` flag is set to `true` and data contains array of nested objects (rows).\n *\n * Set `options.includeEmpty` to `false` if you want to skip empty answers.\n */\n SurveyModel.prototype.getPlainData = function (options) {\n if (options === void 0) { options = {\n includeEmpty: true,\n includeQuestionTypes: false,\n }; }\n var result = [];\n this.getAllQuestions().forEach(function (question) {\n var resultItem = question.getPlainData(options);\n if (!!resultItem) {\n result.push(resultItem);\n }\n });\n return result;\n };\n SurveyModel.prototype.getFilteredValues = function () {\n var values = {};\n for (var key in this.variablesHash)\n values[key] = this.variablesHash[key];\n this.addCalculatedValuesIntoFilteredValues(values);\n var keys = this.getValuesKeys();\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n values[key] = this.getDataValueCore(this.valuesHash, key);\n }\n return values;\n };\n SurveyModel.prototype.addCalculatedValuesIntoFilteredValues = function (values) {\n var caclValues = this.calculatedValues;\n for (var i = 0; i < caclValues.length; i++)\n values[caclValues[i].name] = caclValues[i].value;\n };\n SurveyModel.prototype.getFilteredProperties = function () {\n return { survey: this };\n };\n SurveyModel.prototype.getValuesKeys = function () {\n if (!this.editingObj)\n return Object.keys(this.valuesHash);\n var props = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].getPropertiesByObj(this.editingObj);\n var res = [];\n for (var i = 0; i < props.length; i++) {\n res.push(props[i].name);\n }\n return res;\n };\n SurveyModel.prototype.getDataValueCore = function (valuesHash, key) {\n if (!!this.editingObj)\n return _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].getObjPropertyValue(this.editingObj, key);\n return valuesHash[key];\n };\n SurveyModel.prototype.setDataValueCore = function (valuesHash, key, value) {\n if (!!this.editingObj) {\n _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].setObjPropertyValue(this.editingObj, key, value);\n }\n else {\n valuesHash[key] = value;\n }\n };\n SurveyModel.prototype.deleteDataValueCore = function (valuesHash, key) {\n if (!!this.editingObj) {\n this.editingObj[key] = null;\n }\n else {\n delete valuesHash[key];\n }\n };\n Object.defineProperty(SurveyModel.prototype, \"comments\", {\n /**\n * Returns all comments from the data.\n * @see data\n */\n get: function () {\n var result = {};\n var keys = this.getValuesKeys();\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (key.indexOf(this.commentPrefix) > 0) {\n result[key] = this.getDataValueCore(this.valuesHash, key);\n }\n }\n return result;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"visiblePages\", {\n /**\n * Returns a list of visible pages. If all pages are visible, then this property returns the same list as the `pages` property.\n * @see pages\n * @see PageModel.visible\n * @see PageModel.visibleIf\n */\n get: function () {\n if (this.isDesignMode)\n return this.pages;\n var result = new Array();\n for (var i = 0; i < this.pages.length; i++) {\n if (this.pages[i].isVisible) {\n result.push(this.pages[i]);\n }\n }\n return result;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isEmpty\", {\n /**\n * Returns `true` if the survey contains no pages. The survey is empty.\n */\n get: function () {\n return this.pages.length == 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"PageCount\", {\n /**\n * Deprecated. Use the `pageCount` property instead.\n */\n get: function () {\n return this.pageCount;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"pageCount\", {\n /**\n * Returns the survey page count.\n * @see visiblePageCount\n * @see pages\n */\n get: function () {\n return this.pages.length;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"visiblePageCount\", {\n /**\n * Returns a number of visible pages within the survey.\n * @see pageCount\n * @see visiblePages\n */\n get: function () {\n return this.visiblePages.length;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"startedPage\", {\n /**\n * Returns the started page. This property works if the `firstPageIsStarted` property is set to `true`.\n * @see firstPageIsStarted\n */\n get: function () {\n var page = this.firstPageIsStarted && this.pages.length > 0 ? this.pages[0] : null;\n if (!!page) {\n page.onFirstRendering();\n page.setWasShown(true);\n }\n return page;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"currentPage\", {\n /**\n * Gets or sets the current survey page. If a survey is rendered, then this property returns a page that a user can see/edit.\n */\n get: function () {\n var vPages = this.visiblePages;\n if (this.currentPageValue != null) {\n if (vPages.indexOf(this.currentPageValue) < 0) {\n if (!this.onContainsPageCallback ||\n !this.onContainsPageCallback(this.currentPageValue)) {\n this.currentPage = null;\n }\n }\n }\n if (this.currentPageValue == null && vPages.length > 0) {\n this.currentPage = vPages[0];\n }\n return this.currentPageValue;\n },\n set: function (value) {\n if (this.isLoadingFromJson)\n return;\n var newPage = this.getPageByObject(value);\n if (!!value && !newPage)\n return;\n var vPages = this.visiblePages;\n if (newPage != null && vPages.indexOf(newPage) < 0)\n return;\n if (newPage == this.currentPageValue)\n return;\n var oldValue = this.currentPageValue;\n if (!this.currentPageChanging(newPage, oldValue))\n return;\n this.currentPageValue = newPage;\n if (!!newPage) {\n newPage.onFirstRendering();\n newPage.updateCustomWidgets();\n newPage.setWasShown(true);\n }\n this.locStrsChanged();\n this.currentPageChanged(newPage, oldValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"activePage\", {\n /**\n * Returns the currentPage, unless the started page is showing. In this case returns the started page.\n * @see currentPage\n * @see firstPageIsStarted\n * @see startedPage\n */\n get: function () {\n return this.isStartedState && this.startedPage\n ? this.startedPage\n : this.currentPage;\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getPageByObject = function (value) {\n if (!value)\n return null;\n if (value.getType && value.getType() == \"page\")\n return value;\n if (typeof value === \"string\" || value instanceof String)\n return this.getPageByName(String(value));\n if (!isNaN(value)) {\n var index = Number(value);\n var vPages = this.visiblePages;\n if (value < 0 || value >= vPages.length)\n return null;\n return vPages[index];\n }\n return value;\n };\n Object.defineProperty(SurveyModel.prototype, \"currentPageNo\", {\n /**\n * The zero-based index of the current page in the visible pages array.\n */\n get: function () {\n return this.visiblePages.indexOf(this.currentPage);\n },\n set: function (value) {\n var vPages = this.visiblePages;\n if (value < 0 || value >= vPages.length)\n return;\n this.currentPage = vPages[value];\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"questionsOrder\", {\n /**\n * Gets or sets the question display order. Use this property to randomize questions. You can randomize questions on a specific page.\n *\n * The following options are available:\n *\n * - `random` - randomize questions\n * - `initial` - keep questions in the same order, as in a survey model.\n * @see SurveyPage.questionsOrder\n */\n get: function () {\n return this.getPropertyValue(\"questionsOrder\");\n },\n set: function (val) {\n this.setPropertyValue(\"questionsOrder\", val);\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Sets the input focus to the first question with the input field.\n */\n SurveyModel.prototype.focusFirstQuestion = function () {\n if (this.isFocusingQuestion)\n return;\n var page = this.activePage;\n if (page) {\n page.scrollToTop();\n page.focusFirstQuestion();\n }\n };\n SurveyModel.prototype.scrollToTopOnPageChange = function () {\n var page = this.activePage;\n if (!page)\n return;\n page.scrollToTop();\n if (this.focusFirstQuestionAutomatic && !this.isFocusingQuestion) {\n page.focusFirstQuestion();\n }\n };\n Object.defineProperty(SurveyModel.prototype, \"state\", {\n /**\n * Returns the current survey state:\n *\n * - `loading` - the survey is being loaded from JSON,\n * - `empty` - there is nothing to display in the current survey,\n * - `starting` - the survey's start page is displayed,\n * - `running` - a respondent is answering survey questions right now,\n * - `preview` - a respondent is previewing answered questions before submitting the survey (see [example](https://surveyjs.io/Examples/Library?id=survey-showpreview)),\n * - `completed` - a respondent has completed the survey and submitted the results.\n *\n * Details: [Preview State](https://surveyjs.io/Documentation/Library#states)\n */\n get: function () {\n if (this.isLoading)\n return \"loading\";\n if (this.isCompleted)\n return \"completed\";\n if (this.isCompletedBefore)\n return \"completedbefore\";\n if (!this.isDesignMode &&\n this.isEditMode &&\n this.isStartedState &&\n this.startedPage)\n return \"starting\";\n if (this.isShowingPreview)\n return this.currentPage ? \"preview\" : \"empty\";\n return this.currentPage ? \"running\" : \"empty\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isCompleted\", {\n get: function () {\n return this.getPropertyValue(\"isCompleted\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"isCompleted\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isShowingPreview\", {\n get: function () {\n return this.getPropertyValue(\"isShowingPreview\", false);\n },\n set: function (val) {\n if (this.isShowingPreview == val)\n return;\n this.setPropertyValue(\"isShowingPreview\", val);\n this.onShowingPreviewChanged();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isStartedState\", {\n get: function () {\n return this.getPropertyValue(\"isStartedState\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"isStartedState\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isCompletedBefore\", {\n get: function () {\n return this.getPropertyValue(\"isCompletedBefore\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"isCompletedBefore\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isLoading\", {\n get: function () {\n return this.getPropertyValue(\"isLoading\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"isLoading\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"completedState\", {\n get: function () {\n return this.completedStateValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"completedStateText\", {\n get: function () {\n return this.completedStateTextValue;\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.setCompletedState = function (value, text) {\n this.completedStateValue = value;\n if (!text) {\n if (value == \"saving\")\n text = this.getLocString(\"savingData\");\n if (value == \"error\")\n text = this.getLocString(\"savingDataError\");\n if (value == \"success\")\n text = this.getLocString(\"savingDataSuccess\");\n }\n this.completedStateTextValue = text;\n };\n /**\n * Clears the survey data and state. If the survey has a `completed` state, it will get a `running` state.\n * @param clearData clear the data\n * @param gotoFirstPage make the first page as a current page.\n * @see data\n * @see state\n * @see currentPage\n */\n SurveyModel.prototype.clear = function (clearData, gotoFirstPage) {\n if (clearData === void 0) { clearData = true; }\n if (gotoFirstPage === void 0) { gotoFirstPage = true; }\n if (clearData) {\n this.data = null;\n this.variablesHash = {};\n }\n this.timeSpent = 0;\n for (var i = 0; i < this.pages.length; i++) {\n this.pages[i].timeSpent = 0;\n this.pages[i].setWasShown(false);\n this.pages[i].passed = false;\n }\n this.isCompleted = false;\n this.isCompletedBefore = false;\n this.isLoading = false;\n this.isStartedState = this.firstPageIsStarted;\n if (gotoFirstPage && this.visiblePageCount > 0) {\n this.currentPage = this.visiblePages[0];\n }\n if (clearData) {\n this.updateValuesWithDefaults();\n }\n };\n SurveyModel.prototype.mergeValues = function (src, dest) {\n if (!dest || !src)\n return;\n if (typeof dest !== \"object\")\n return;\n for (var key in src) {\n var value = src[key];\n if (value && typeof value === \"object\") {\n if (!dest[key])\n dest[key] = {};\n this.mergeValues(value, dest[key]);\n }\n else {\n dest[key] = value;\n }\n }\n };\n SurveyModel.prototype.updateValuesWithDefaults = function () {\n if (this.isDesignMode || this.isLoading)\n return;\n for (var i = 0; i < this.pages.length; i++) {\n var questions = this.pages[i].questions;\n for (var j = 0; j < questions.length; j++) {\n questions[j].updateValueWithDefaults();\n }\n }\n };\n SurveyModel.prototype.updateCustomWidgets = function (page) {\n if (!page)\n return;\n page.updateCustomWidgets();\n };\n SurveyModel.prototype.currentPageChanging = function (newValue, oldValue) {\n var options = {\n oldCurrentPage: oldValue,\n newCurrentPage: newValue,\n allowChanging: true,\n isNextPage: this.isNextPage(newValue, oldValue),\n isPrevPage: this.isPrevPage(newValue, oldValue),\n };\n this.onCurrentPageChanging.fire(this, options);\n return options.allowChanging;\n };\n SurveyModel.prototype.currentPageChanged = function (newValue, oldValue) {\n var isNextPage = this.isNextPage(newValue, oldValue);\n if (isNextPage) {\n oldValue.passed = true;\n }\n this.onCurrentPageChanged.fire(this, {\n oldCurrentPage: oldValue,\n newCurrentPage: newValue,\n isNextPage: isNextPage,\n isPrevPage: this.isPrevPage(newValue, oldValue),\n });\n };\n SurveyModel.prototype.isNextPage = function (newValue, oldValue) {\n if (!newValue || !oldValue)\n return false;\n return newValue.visibleIndex == oldValue.visibleIndex + 1;\n };\n SurveyModel.prototype.isPrevPage = function (newValue, oldValue) {\n if (!newValue || !oldValue)\n return false;\n return newValue.visibleIndex + 1 == oldValue.visibleIndex;\n };\n /**\n * Returns the progress that a user made while going through the survey.\n * It depends from progressBarType property\n * @see progressBarType\n * @see progressValue\n */\n SurveyModel.prototype.getProgress = function () {\n if (this.currentPage == null)\n return 0;\n if (this.progressBarType !== \"pages\") {\n var info = this.getProgressInfo();\n if (this.progressBarType === \"requiredQuestions\") {\n return info.requiredQuestionCount > 1\n ? Math.ceil((info.requiredAnsweredQuestionCount * 100) /\n info.requiredQuestionCount)\n : 100;\n }\n return info.questionCount > 1\n ? Math.ceil((info.answeredQuestionCount * 100) / info.questionCount)\n : 100;\n }\n var index = this.visiblePages.indexOf(this.currentPage) + 1;\n return Math.ceil((index * 100) / this.visiblePageCount);\n };\n Object.defineProperty(SurveyModel.prototype, \"progressValue\", {\n /**\n * Returns the progress that a user made while going through the survey.\n * It depends from progressBarType property\n * @see progressBarType\n */\n get: function () {\n return this.getPropertyValue(\"progressValue\", 0);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isNavigationButtonsShowing\", {\n /**\n * Returns the navigation buttons (i.e., 'Prev', 'Next', or 'Complete' and 'Preview') position.\n */\n get: function () {\n if (this.isDesignMode)\n return \"none\";\n var page = this.currentPage;\n if (!page)\n return \"none\";\n if (page.navigationButtonsVisibility === \"show\") {\n return \"bottom\";\n }\n if (page.navigationButtonsVisibility === \"hide\") {\n return \"none\";\n }\n return this.showNavigationButtons;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isNavigationButtonsShowingOnTop\", {\n /**\n * Returns true if the navigation buttons (i.e., 'Prev', 'Next', or 'Complete' and 'Preview') are shows on top.\n */\n get: function () {\n return this.getIsNavigationButtonsShowingOn(\"top\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isNavigationButtonsShowingOnBottom\", {\n /**\n * Returns true if the navigation buttons (i.e., 'Prev', 'Next', or 'Complete' and 'Preview') are shows on bottom.\n */\n get: function () {\n return this.getIsNavigationButtonsShowingOn(\"bottom\");\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getIsNavigationButtonsShowingOn = function (buttonPosition) {\n var res = this.isNavigationButtonsShowing;\n return res == \"both\" || res == buttonPosition;\n };\n Object.defineProperty(SurveyModel.prototype, \"isEditMode\", {\n /**\n * Returns `true` if the survey is in edit mode.\n * @see mode\n */\n get: function () {\n return this.mode == \"edit\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isCompleteButtonVisible\", {\n get: function () {\n return (this.isEditMode &&\n (!this.isShowPreviewBeforeComplete || this.state == \"preview\"));\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isPreviewButtonVisible\", {\n get: function () {\n return (this.isEditMode &&\n this.isShowPreviewBeforeComplete &&\n this.state == \"running\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isCancelPreviewButtonVisible\", {\n get: function () {\n return (this.isEditMode &&\n this.isShowPreviewBeforeComplete &&\n this.state == \"preview\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isDisplayMode\", {\n /**\n * Returns `true` if the survey is in display mode or in preview mode.\n * @see mode\n * @see showPreviewBeforeComplete\n */\n get: function () {\n return this.mode == \"display\" || this.state == \"preview\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isUpdateValueTextOnTyping\", {\n get: function () {\n return this.textUpdateMode == \"onTyping\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isDesignMode\", {\n /**\n * Returns `true` if the survey is in design mode. It is used by SurveyJS Editor.\n * @see setDesignMode\n */\n get: function () {\n return this._isDesignMode;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Sets the survey into design mode.\n * @param value use true to set the survey into the design mode.\n */\n SurveyModel.prototype.setDesignMode = function (value) {\n this._isDesignMode = value;\n this.onQuestionsOnPageModeChanged(\"standard\");\n };\n Object.defineProperty(SurveyModel.prototype, \"showInvisibleElements\", {\n /**\n * Gets or sets whether to show all elements in the survey, regardless their visibility. The default value is `false`.\n */\n get: function () {\n return this.getPropertyValue(\"showInvisibleElements\", false);\n },\n set: function (val) {\n var visPages = this.visiblePages;\n this.setPropertyValue(\"showInvisibleElements\", val);\n if (this.isLoadingFromJson)\n return;\n this.runConditions();\n this.updateAllElementsVisibility(visPages);\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.updateAllElementsVisibility = function (visPages) {\n for (var i = 0; i < this.pages.length; i++) {\n var page = this.pages[i];\n page.updateElementVisibility();\n if (visPages.indexOf(page) > -1 != page.isVisible) {\n this.onPageVisibleChanged.fire(this, {\n page: page,\n visible: page.isVisible,\n });\n }\n }\n };\n Object.defineProperty(SurveyModel.prototype, \"areInvisibleElementsShowing\", {\n get: function () {\n return this.isDesignMode || this.showInvisibleElements;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"areEmptyElementsHidden\", {\n get: function () {\n return (this.isShowingPreview &&\n this.showPreviewBeforeComplete == \"showAnsweredQuestions\");\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"hasCookie\", {\n /**\n * Returns `true`, if a user has already completed the survey in this browser and there is a cookie about it. Survey goes to `completed` state if the function returns `true`.\n * @see cookieName\n * @see setCookie\n * @see deleteCookie\n * @see state\n */\n get: function () {\n if (!this.cookieName || typeof document === \"undefined\")\n return false;\n var cookies = document.cookie;\n return cookies && cookies.indexOf(this.cookieName + \"=true\") > -1;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Set the cookie with `cookieName` in user's browser. It is done automatically on survey complete if the `cookieName` property value is not empty.\n * @see cookieName\n * @see hasCookie\n * @see deleteCookie\n */\n SurveyModel.prototype.setCookie = function () {\n if (!this.cookieName || typeof document === \"undefined\")\n return;\n document.cookie =\n this.cookieName + \"=true; expires=Fri, 31 Dec 9999 0:0:0 GMT\";\n };\n /**\n * Deletes the cookie with `cookieName` from the browser.\n * @see cookieName\n * @see hasCookie\n * @see setCookie\n */\n SurveyModel.prototype.deleteCookie = function () {\n if (!this.cookieName)\n return;\n document.cookie = this.cookieName + \"=;\";\n };\n /**\n * Navigates user to the next page.\n *\n * Returns `false` in the following cases:\n *\n * - if the current page is the last page.\n * - if the current page contains errors (for example, a required question is empty).\n * @see isCurrentPageHasErrors\n * @see prevPage\n * @see completeLastPage\n */\n SurveyModel.prototype.nextPage = function () {\n if (this.isLastPage)\n return false;\n return this.doCurrentPageComplete(false);\n };\n SurveyModel.prototype.hasErrorsOnNavigate = function (doComplete) {\n var _this = this;\n if (this.ignoreValidation || !this.isEditMode)\n return false;\n var func = function (hasErrors) {\n if (!hasErrors) {\n _this.doCurrentPageCompleteCore(doComplete);\n }\n };\n if (this.checkErrorsMode === \"onComplete\") {\n if (!this.isLastPage)\n return false;\n return this.hasErrors(true, true, func) !== false;\n }\n return this.hasCurrentPageErrors(func) !== false;\n };\n SurveyModel.prototype.checkForAsyncQuestionValidation = function (questions, func) {\n var _this = this;\n this.clearAsyncValidationQuesitons();\n for (var i = 0; i < questions.length; i++) {\n if (questions[i].isRunningValidators) {\n questions[i].onCompletedAsyncValidators = function (hasErrors) {\n _this.onCompletedAsyncQuestionValidators(func, hasErrors);\n };\n this.asyncValidationQuesitons.push(questions[i]);\n }\n }\n return this.asyncValidationQuesitons.length > 0;\n };\n SurveyModel.prototype.clearAsyncValidationQuesitons = function () {\n if (!!this.asyncValidationQuesitons) {\n var asynQuestions = this.asyncValidationQuesitons;\n for (var i = 0; i < asynQuestions.length; i++) {\n asynQuestions[i].onCompletedAsyncValidators = null;\n }\n }\n this.asyncValidationQuesitons = [];\n };\n SurveyModel.prototype.onCompletedAsyncQuestionValidators = function (func, hasErrors) {\n if (hasErrors) {\n this.clearAsyncValidationQuesitons();\n func(true);\n return;\n }\n var asynQuestions = this.asyncValidationQuesitons;\n for (var i = 0; i < asynQuestions.length; i++) {\n if (asynQuestions[i].isRunningValidators)\n return;\n }\n func(false);\n };\n Object.defineProperty(SurveyModel.prototype, \"isCurrentPageHasErrors\", {\n /**\n * Returns `true`, if the current page contains errors, for example, the required question is empty or a question validation is failed.\n * @see nextPage\n */\n get: function () {\n return this.checkIsCurrentPageHasErrors();\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Returns `true`, if the current page contains any error. If there is an async function in an expression, then the function will return `undefined` value.\n * In this case, you should use `onAsyncValidation` parameter, which is a callback function: (hasErrors: boolean) => void\n * @param onAsyncValidation use this parameter if you use async functions in your expressions. This callback function will be called with hasErrors value equals to `true` or `false`.\n * @see hasPageErrors\n * @see hasErrors\n * @see currentPage\n */\n SurveyModel.prototype.hasCurrentPageErrors = function (onAsyncValidation) {\n return this.hasPageErrors(undefined, onAsyncValidation);\n };\n /**\n * Returns `true`, if a page contains an error. If there is an async function in an expression, then the function will return `undefined` value.\n * In this case, you should use the second `onAsyncValidation` parameter, which is a callback function: (hasErrors: boolean) => void\n * @param page the page that you want to validate. If the parameter is undefined then the `activePage` is using\n * @param onAsyncValidation use this parameter if you use async functions in your expressions. This callback function will be called with hasErrors value equals to `true` or `false`.\n * @see hasCurrentPageErrors\n * @see hasErrors\n * @see activePage\n * @see currentPage\n */\n SurveyModel.prototype.hasPageErrors = function (page, onAsyncValidation) {\n if (!page) {\n page = this.activePage;\n }\n if (!page)\n return false;\n if (this.checkIsPageHasErrors(page))\n return true;\n if (!onAsyncValidation)\n return false;\n return this.checkForAsyncQuestionValidation(page.questions, function (hasErrors) { return onAsyncValidation(hasErrors); })\n ? undefined\n : false;\n };\n /**\n * Returns `true`, if any of the survey pages contains errors. If there is an async function in an expression, then the function will return `undefined` value.\n * In this case, you should use the third `onAsyncValidation` parameter, which is a callback function: (hasErrors: boolean) => void\n * @param fireCallback set it to `true`, to show errors in UI.\n * @param focusOnFirstError set it to `true` to focus on the first question that doesn't pass the validation and make the page, where the question is located, the current.\n * @param onAsyncValidation use this parameter if you use async functions in your expressions. This callback function will be called with hasErrors value equals to `true` or `false`.\n * @see hasCurrentPageErrors\n * @see hasPageErrors\n */\n SurveyModel.prototype.hasErrors = function (fireCallback, focusOnFirstError, onAsyncValidation) {\n if (fireCallback === void 0) { fireCallback = true; }\n if (focusOnFirstError === void 0) { focusOnFirstError = false; }\n if (!!onAsyncValidation) {\n fireCallback = true;\n }\n var visPages = this.visiblePages;\n var firstErrorPage = null;\n var res = false;\n for (var i = 0; i < visPages.length; i++) {\n if (visPages[i].hasErrors(fireCallback, false)) {\n if (!firstErrorPage)\n firstErrorPage = visPages[i];\n res = true;\n }\n }\n if (focusOnFirstError && !!firstErrorPage) {\n this.currentPage = firstErrorPage;\n var questions = firstErrorPage.questions;\n for (var i = 0; i < questions.length; i++) {\n if (questions[i].errors.length > 0) {\n questions[i].focus(true);\n break;\n }\n }\n }\n if (res || !onAsyncValidation)\n return res;\n return this.checkForAsyncQuestionValidation(this.getAllQuestions(), function (hasErrors) { return onAsyncValidation(hasErrors); })\n ? undefined\n : false;\n };\n /**\n * Checks whether survey elements (pages, panels, and questions) have unique question names.\n * You can check for unique names for individual page and panel (and all their elements) or a question.\n * If the parameter is not specified, then a survey checks that all its elements have unique names.\n * @param element page, panel or question, it is `null` by default, that means all survey elements will be checked\n */\n SurveyModel.prototype.ensureUniqueNames = function (element) {\n if (element === void 0) { element = null; }\n if (element == null) {\n for (var i = 0; i < this.pages.length; i++) {\n this.ensureUniqueName(this.pages[i]);\n }\n }\n else {\n this.ensureUniqueName(element);\n }\n };\n SurveyModel.prototype.ensureUniqueName = function (element) {\n if (element.isPage) {\n this.ensureUniquePageName(element);\n }\n if (element.isPanel) {\n this.ensureUniquePanelName(element);\n }\n if (element.isPage || element.isPanel) {\n var elements = element.elements;\n for (var i = 0; i < elements.length; i++) {\n this.ensureUniqueNames(elements[i]);\n }\n }\n else {\n this.ensureUniqueQuestionName(element);\n }\n };\n SurveyModel.prototype.ensureUniquePageName = function (element) {\n var _this = this;\n return this.ensureUniqueElementName(element, function (name) {\n return _this.getPageByName(name);\n });\n };\n SurveyModel.prototype.ensureUniquePanelName = function (element) {\n var _this = this;\n return this.ensureUniqueElementName(element, function (name) {\n return _this.getPanelByName(name);\n });\n };\n SurveyModel.prototype.ensureUniqueQuestionName = function (element) {\n var _this = this;\n return this.ensureUniqueElementName(element, function (name) {\n return _this.getQuestionByName(name);\n });\n };\n SurveyModel.prototype.ensureUniqueElementName = function (element, getElementByName) {\n var existingElement = getElementByName(element.name);\n if (!existingElement || existingElement == element)\n return;\n var newName = this.getNewName(element.name);\n while (!!getElementByName(newName)) {\n var newName = this.getNewName(element.name);\n }\n element.name = newName;\n };\n SurveyModel.prototype.getNewName = function (name) {\n var pos = name.length;\n while (pos > 0 && name[pos - 1] >= \"0\" && name[pos - 1] <= \"9\") {\n pos--;\n }\n var base = name.substr(0, pos);\n var num = 0;\n if (pos < name.length) {\n num = parseInt(name.substr(pos));\n }\n num++;\n return base + num;\n };\n SurveyModel.prototype.checkIsCurrentPageHasErrors = function (isFocuseOnFirstError) {\n if (isFocuseOnFirstError === void 0) { isFocuseOnFirstError = undefined; }\n return this.checkIsPageHasErrors(this.activePage, isFocuseOnFirstError);\n };\n SurveyModel.prototype.checkIsPageHasErrors = function (page, isFocuseOnFirstError) {\n if (isFocuseOnFirstError === void 0) { isFocuseOnFirstError = undefined; }\n if (isFocuseOnFirstError === undefined) {\n isFocuseOnFirstError = this.focusOnFirstError;\n }\n if (!page)\n return true;\n var res = page.hasErrors(true, isFocuseOnFirstError);\n this.fireValidatedErrorsOnPage(page);\n return res;\n };\n SurveyModel.prototype.fireValidatedErrorsOnPage = function (page) {\n if (this.onValidatedErrorsOnCurrentPage.isEmpty || !page)\n return;\n var questionsOnPage = page.questions;\n var questions = new Array();\n var errors = new Array();\n for (var i = 0; i < questionsOnPage.length; i++) {\n var q = questionsOnPage[i];\n if (q.errors.length > 0) {\n questions.push(q);\n for (var j = 0; j < q.errors.length; j++) {\n errors.push(q.errors[j]);\n }\n }\n }\n this.onValidatedErrorsOnCurrentPage.fire(this, {\n questions: questions,\n errors: errors,\n page: page,\n });\n };\n /**\n * Navigates user to a previous page. If the current page is the first page, `prevPage` returns `false`. `prevPage` does not perform any checks, required questions can be empty.\n * @see isFirstPage\n */\n SurveyModel.prototype.prevPage = function () {\n if (this.isFirstPage)\n return false;\n this.resetNavigationButton();\n var vPages = this.visiblePages;\n var index = vPages.indexOf(this.currentPage);\n this.currentPage = vPages[index - 1];\n };\n /**\n * Completes the survey, if the current page is the last one. It returns `false` if the last page has errors.\n * If the last page has no errors, `completeLastPage` calls `doComplete` and returns `true`.\n * @see isCurrentPageHasErrors\n * @see nextPage\n * @see doComplete\n */\n SurveyModel.prototype.completeLastPage = function () {\n var res = this.doCurrentPageComplete(true);\n if (res) {\n this.cancelPreview();\n }\n return res;\n };\n SurveyModel.prototype.navigationMouseDown = function () {\n this.isNavigationButtonPressed = true;\n return true;\n };\n SurveyModel.prototype.resetNavigationButton = function () {\n this.isNavigationButtonPressed = false;\n };\n /**\n * Shows preview for the survey. Switches the survey to the \"preview\" state.\n *\n * Details: [Preview State](https://surveyjs.io/Documentation/Library#states-preview)\n * @see showPreviewBeforeComplete\n * @see cancelPreview\n * @see state\n * @see previewText\n * @see editText\n */\n SurveyModel.prototype.showPreview = function () {\n this.resetNavigationButton();\n if (this.hasErrorsOnNavigate(true))\n return false;\n if (this.doServerValidation(true, true))\n return false;\n var options = { allowShowPreview: true };\n this.onShowingPreview.fire(this, options);\n this.isShowingPreview = options.allowShowPreview;\n return true;\n };\n /**\n * Cancels preview and switches back to the \"running\" state.\n *\n * Details: [Preview State](https://surveyjs.io/Documentation/Library#states-preview)\n * @param curPage - A new current page. If the parameter is undefined then the last page becomes the current.\n * @see showPreviewBeforeComplete\n * @see showPreview\n * @see state\n */\n SurveyModel.prototype.cancelPreview = function (curPage) {\n if (curPage === void 0) { curPage = null; }\n if (!this.isShowingPreview)\n return;\n this.isShowingPreview = false;\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(curPage) && this.visiblePageCount > 0) {\n curPage = this.visiblePageCount - 1;\n }\n if (curPage !== null) {\n this.currentPage = curPage;\n }\n };\n SurveyModel.prototype.cancelPreviewByPage = function (panel) {\n this.cancelPreview(panel[\"originalPage\"]);\n };\n SurveyModel.prototype.doCurrentPageComplete = function (doComplete) {\n if (this.isValidatingOnServer)\n return false;\n this.resetNavigationButton();\n if (this.hasErrorsOnNavigate(doComplete))\n return false;\n return this.doCurrentPageCompleteCore(doComplete);\n };\n SurveyModel.prototype.doCurrentPageCompleteCore = function (doComplete) {\n if (this.doServerValidation(doComplete))\n return false;\n if (doComplete) {\n this.currentPage.passed = true;\n this.doComplete();\n }\n else {\n this.doNextPage();\n }\n return true;\n };\n Object.defineProperty(SurveyModel.prototype, \"isSinglePage\", {\n /**\n * Obsolete. Use the `questionsOnPageMode` property instead.\n * @see questionsOnPageMode\n */\n get: function () {\n return this.questionsOnPageMode == \"singlePage\";\n },\n set: function (val) {\n this.questionsOnPageMode = val ? \"singlePage\" : \"standard\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"questionsOnPageMode\", {\n /**\n * Gets or sets a value that specifies how the survey combines questions, panels, and pages.\n *\n * The following options are available:\n *\n * - `singlePage` - combine all survey pages in a single page. Pages will be converted to panels.\n * - `questionPerPage` - show one question per page. Survey will create a separate page for every question.\n */\n get: function () {\n return this.getPropertyValue(\"questionsOnPageMode\", \"standard\");\n },\n set: function (val) {\n this.setPropertyValue(\"questionsOnPageMode\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"firstPageIsStarted\", {\n /**\n * Gets or sets whether the first survey page is a start page. Set this property to `true`, to make the first page a starting page.\n * An end user cannot navigate to the start page and the start page does not affect a survey progress.\n */\n get: function () {\n return this.getPropertyValue(\"firstPageIsStarted\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"firstPageIsStarted\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.isPageStarted = function (page) {\n return (this.firstPageIsStarted && this.pages.length > 0 && this.pages[0] === page);\n };\n Object.defineProperty(SurveyModel.prototype, \"showPreviewBeforeComplete\", {\n /**\n * Set this property to \"showAllQuestions\" or \"showAnsweredQuestions\" to allow respondents to preview answers before submitting the survey results.\n *\n * Details: [Preview State](https://surveyjs.io/Documentation/Library#states-preview)\n * Example: [Show Preview Before Complete](https://surveyjs.io/Examples/Library?id=survey-showpreview)\n * @see showPreview\n * @see cancelPreview\n * @see state\n * @see previewText\n * @see editText\n */\n get: function () {\n return this.getPropertyValue(\"showPreviewBeforeComplete\", \"noPreview\");\n },\n set: function (val) {\n this.setPropertyValue(\"showPreviewBeforeComplete\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isShowPreviewBeforeComplete\", {\n get: function () {\n var preview = this.showPreviewBeforeComplete;\n return preview == \"showAllQuestions\" || preview == \"showAnsweredQuestions\";\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.onFirstPageIsStartedChanged = function () {\n if (this.pages.length == 0)\n return;\n this.isStartedState = this.firstPageIsStarted;\n this.pageVisibilityChanged(this.pages[0], !this.firstPageIsStarted);\n };\n SurveyModel.prototype.onShowingPreviewChanged = function () {\n if (this.isDesignMode)\n return;\n if (this.isShowingPreview) {\n this.runningPages = this.pages.slice(0, this.pages.length);\n this.setupPagesForPageModes(true);\n }\n else {\n if (this.runningPages) {\n this.restoreOrigionalPages(this.runningPages);\n }\n this.runningPages = undefined;\n }\n this.runConditions();\n this.updateAllElementsVisibility(this.pages);\n this.updateVisibleIndexes();\n this.currentPageNo = 0;\n };\n SurveyModel.prototype.onQuestionsOnPageModeChanged = function (oldValue) {\n if (this.isShowingPreview)\n return;\n if (this.questionsOnPageMode == \"standard\" || this.isDesignMode) {\n if (this.origionalPages) {\n this.restoreOrigionalPages(this.origionalPages);\n }\n this.origionalPages = undefined;\n }\n else {\n if (!oldValue || oldValue == \"standard\") {\n this.origionalPages = this.pages.slice(0, this.pages.length);\n }\n this.setupPagesForPageModes(this.isSinglePage);\n }\n this.runConditions();\n this.updateVisibleIndexes();\n };\n SurveyModel.prototype.restoreOrigionalPages = function (originalPages) {\n this.questionHashesClear();\n this.pages.splice(0, this.pages.length);\n for (var i = 0; i < originalPages.length; i++) {\n this.pages.push(originalPages[i]);\n }\n };\n SurveyModel.prototype.setupPagesForPageModes = function (isSinglePage) {\n this.questionHashesClear();\n var startIndex = this.firstPageIsStarted ? 1 : 0;\n _super.prototype.startLoadingFromJson.call(this);\n var newPages = this.createPagesForQuestionOnPageMode(isSinglePage, startIndex);\n var deletedLen = this.pages.length - startIndex;\n this.pages.splice(startIndex, deletedLen);\n for (var i = 0; i < newPages.length; i++) {\n this.pages.push(newPages[i]);\n }\n _super.prototype.endLoadingFromJson.call(this);\n for (var i = 0; i < newPages.length; i++) {\n newPages[i].endLoadingFromJson();\n newPages[i].setSurveyImpl(this);\n }\n this.doElementsOnLoad();\n };\n SurveyModel.prototype.createPagesForQuestionOnPageMode = function (isSinglePage, startIndex) {\n if (isSinglePage) {\n return [this.createSinglePage(startIndex)];\n }\n return this.createPagesForEveryQuestion(startIndex);\n };\n SurveyModel.prototype.createSinglePage = function (startIndex) {\n var single = this.createNewPage(\"all\");\n single.setSurveyImpl(this);\n for (var i = startIndex; i < this.pages.length; i++) {\n var page = this.pages[i];\n var panel = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].createClass(\"panel\");\n panel.originalPage = page;\n single.addPanel(panel);\n var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]().toJsonObject(page);\n new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]().toObject(json, panel);\n if (!this.showPageTitles) {\n panel.title = \"\";\n }\n }\n return single;\n };\n SurveyModel.prototype.createPagesForEveryQuestion = function (startIndex) {\n var res = [];\n for (var i = startIndex; i < this.pages.length; i++) {\n var originalPage = this.pages[i];\n // Initialize randomization\n originalPage.setWasShown(true);\n for (var j = 0; j < originalPage.elements.length; j++) {\n var originalElement = originalPage.elements[j];\n var element = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].createClass(originalElement.getType());\n if (!element)\n continue;\n var jsonObj = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]();\n //Deserialize page properties only, excluding elements\n jsonObj.lightSerializing = true;\n var pageJson = jsonObj.toJsonObject(originalPage);\n var page = _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].createClass(originalPage.getType());\n page.fromJSON(pageJson);\n page.name = \"page\" + (res.length + 1);\n page.setSurveyImpl(this);\n res.push(page);\n var json = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]().toJsonObject(originalElement);\n new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]().toObject(json, element);\n page.addElement(element);\n for (var k = 0; k < page.questions.length; k++) {\n this.questionHashesAdded(page.questions[k]);\n }\n }\n }\n return res;\n };\n Object.defineProperty(SurveyModel.prototype, \"isFirstPage\", {\n /**\n * Gets whether the current page is the first one.\n */\n get: function () {\n if (this.currentPage == null)\n return true;\n return this.visiblePages.indexOf(this.currentPage) == 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isShowPrevButton\", {\n get: function () {\n if (this.isFirstPage || !this.showPrevButton)\n return false;\n var page = this.visiblePages[this.currentPageNo - 1];\n return this.getPageMaxTimeToFinish(page) <= 0;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isLastPage\", {\n /**\n * Gets whether the current page is the last one.\n */\n get: function () {\n if (this.currentPage == null)\n return true;\n var vPages = this.visiblePages;\n return vPages.indexOf(this.currentPage) == vPages.length - 1;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Completes the survey.\n *\n * Calling this function performs the following tasks:\n *\n * - writes cookie if the `cookieName` property is not empty\n * - sets the survey into `completed` state\n * - fires the `onComplete` event\n * - calls `sendResult` function.\n *\n * Calling the `doComplete` function does not perform any validation, unlike the `completeLastPage` function.\n * It calls `navigateToUrl` after calling `onComplete` event.\n * In case calling `options.showDataSaving` callback in the `onComplete` event, `navigateToUrl` is used on calling `options.showDataSavingSuccess` callback.\n * @see completeLastPage\n * @see cookieName\n * @see state\n * @see onComplete\n * @see surveyPostId\n * @see completeLastPage\n * @see navigateToUrl\n * @see navigateToUrlOnCondition\n */\n SurveyModel.prototype.doComplete = function (isCompleteOnTrigger) {\n if (isCompleteOnTrigger === void 0) { isCompleteOnTrigger = false; }\n var onCompletingOptions = {\n allowComplete: true,\n isCompleteOnTrigger: isCompleteOnTrigger,\n };\n this.onCompleting.fire(this, onCompletingOptions);\n if (!onCompletingOptions.allowComplete)\n return;\n var previousCookie = this.hasCookie;\n this.stopTimer();\n this.setCompleted();\n this.clearUnusedValues();\n this.setCookie();\n var self = this;\n var savingDataStarted = false;\n var onCompleteOptions = {\n isCompleteOnTrigger: isCompleteOnTrigger,\n showDataSaving: function (text) {\n savingDataStarted = true;\n self.setCompletedState(\"saving\", text);\n },\n showDataSavingError: function (text) {\n self.setCompletedState(\"error\", text);\n },\n showDataSavingSuccess: function (text) {\n self.setCompletedState(\"success\", text);\n self.navigateTo();\n },\n showDataSavingClear: function (text) {\n self.setCompletedState(\"\", \"\");\n },\n };\n this.onComplete.fire(this, onCompleteOptions);\n if (!previousCookie && this.surveyPostId) {\n this.sendResult();\n }\n if (!savingDataStarted) {\n this.navigateTo();\n }\n };\n /**\n * Starts the survey. Changes the survey mode from \"starting\" to \"running\". Call this function if your survey has a start page, otherwise this function does nothing.\n * @see firstPageIsStarted\n */\n SurveyModel.prototype.start = function () {\n if (!this.firstPageIsStarted)\n return false;\n if (this.checkIsPageHasErrors(this.startedPage, true))\n return false;\n this.isStartedState = false;\n this.startTimerFromUI();\n this.onStarted.fire(this, {});\n if (!!this.currentPage) {\n this.currentPage.locStrsChanged();\n }\n return true;\n };\n Object.defineProperty(SurveyModel.prototype, \"isValidatingOnServer\", {\n /**\n * Gets whether the question values on the current page are validating on the server at the current moment.\n * @see onServerValidateQuestions\n */\n get: function () {\n return this.getPropertyValue(\"isValidatingOnServer\", false);\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.setIsValidatingOnServer = function (val) {\n if (val == this.isValidatingOnServer)\n return;\n this.setPropertyValue(\"isValidatingOnServer\", val);\n this.onIsValidatingOnServerChanged();\n };\n SurveyModel.prototype.onIsValidatingOnServerChanged = function () { };\n SurveyModel.prototype.doServerValidation = function (doComplete, isPreview) {\n if (isPreview === void 0) { isPreview = false; }\n if (!this.onServerValidateQuestions ||\n this.onServerValidateQuestions.isEmpty)\n return false;\n if (!doComplete && this.checkErrorsMode === \"onComplete\")\n return false;\n var self = this;\n var options = {\n data: {},\n errors: {},\n survey: this,\n complete: function () {\n self.completeServerValidation(options, isPreview);\n },\n };\n if (doComplete && this.checkErrorsMode === \"onComplete\") {\n options.data = this.data;\n }\n else {\n var questions = this.activePage.questions;\n for (var i = 0; i < questions.length; i++) {\n var question = questions[i];\n if (!question.visible)\n continue;\n var value = this.getValue(question.getValueName());\n if (!this.isValueEmpty(value))\n options.data[question.getValueName()] = value;\n }\n }\n this.setIsValidatingOnServer(true);\n if (typeof this.onServerValidateQuestions === \"function\") {\n this.onServerValidateQuestions(this, options);\n }\n else {\n this.onServerValidateQuestions.fire(this, options);\n }\n return true;\n };\n SurveyModel.prototype.completeServerValidation = function (options, isPreview) {\n this.setIsValidatingOnServer(false);\n if (!options && !options.survey)\n return;\n var self = options.survey;\n var hasErrors = false;\n if (options.errors) {\n var hasToFocus = this.focusOnFirstError;\n for (var name in options.errors) {\n var question = self.getQuestionByName(name);\n if (question && question[\"errors\"]) {\n hasErrors = true;\n question.addError(new _error__WEBPACK_IMPORTED_MODULE_10__[\"CustomError\"](options.errors[name], this));\n if (hasToFocus) {\n hasToFocus = false;\n if (!!question.page) {\n this.currentPage = question.page;\n }\n question.focus(true);\n }\n }\n }\n this.fireValidatedErrorsOnPage(this.currentPage);\n }\n if (!hasErrors) {\n if (isPreview) {\n this.isShowingPreview = true;\n }\n else {\n if (self.isLastPage)\n self.doComplete();\n else\n self.doNextPage();\n }\n }\n };\n SurveyModel.prototype.doNextPage = function () {\n var curPage = this.currentPage;\n this.checkOnPageTriggers();\n if (!this.isCompleted) {\n if (this.sendResultOnPageNext) {\n this.sendResult(this.surveyPostId, this.clientId, true);\n }\n if (curPage === this.currentPage) {\n var vPages = this.visiblePages;\n var index = vPages.indexOf(this.currentPage);\n this.currentPage = vPages[index + 1];\n }\n }\n else {\n this.doComplete(true);\n }\n };\n SurveyModel.prototype.setCompleted = function () {\n this.isCompleted = true;\n };\n Object.defineProperty(SurveyModel.prototype, \"processedCompletedHtml\", {\n /**\n * Returns the HTML content for the complete page.\n * @see completedHtml\n */\n get: function () {\n var html = this.renderedCompletedHtml;\n if (html) {\n return this.processHtml(html);\n }\n return \"

\" + this.getLocString(\"completingSurvey\") + \"

\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"processedCompletedBeforeHtml\", {\n /**\n * Returns the HTML content, that is shown to a user that had completed the survey before.\n * @see completedHtml\n * @see cookieName\n */\n get: function () {\n if (this.completedBeforeHtml) {\n return this.processHtml(this.completedBeforeHtml);\n }\n return \"

\" + this.getLocString(\"completingSurveyBefore\") + \"

\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"processedLoadingHtml\", {\n /**\n * Returns the HTML content, that is shows when a survey loads the survey JSON.\n */\n get: function () {\n if (this.loadingHtml) {\n return this.processHtml(this.loadingHtml);\n }\n return \"

\" + this.getLocString(\"loadingSurvey\") + \"

\";\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getProgressInfo = function () {\n var pages = this.isDesignMode ? this.pages : this.visiblePages;\n return _survey_element__WEBPACK_IMPORTED_MODULE_3__[\"SurveyElement\"].getProgressInfoByElements(pages, false);\n };\n Object.defineProperty(SurveyModel.prototype, \"progressText\", {\n /**\n * Returns the text for the current progress.\n */\n get: function () {\n var res = this.getPropertyValue(\"progressText\", \"\");\n if (!res) {\n this.updateProgressText();\n res = this.getPropertyValue(\"progressText\", \"\");\n }\n return res;\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.updateProgressText = function (onValueChanged) {\n if (onValueChanged === void 0) { onValueChanged = false; }\n if (this.isCalculatingProgressText)\n return;\n if (onValueChanged &&\n this.progressBarType == \"pages\" &&\n this.onProgressText.isEmpty)\n return;\n this.isCalculatingProgressText = true;\n this.setPropertyValue(\"progressText\", this.getProgressText());\n this.setPropertyValue(\"progressValue\", this.getProgress());\n this.isCalculatingProgressText = false;\n };\n SurveyModel.prototype.getProgressText = function () {\n if (!this.isDesignMode && this.currentPage == null)\n return \"\";\n var options = {\n questionCount: 0,\n answeredQuestionCount: 0,\n requiredQuestionCount: 0,\n requiredAnsweredQuestionCount: 0,\n text: \"\",\n };\n var type = this.progressBarType.toLowerCase();\n if (type === \"questions\" ||\n type === \"requiredquestions\" ||\n type === \"correctquestions\" ||\n !this.onProgressText.isEmpty) {\n var info = this.getProgressInfo();\n options.questionCount = info.questionCount;\n options.answeredQuestionCount = info.answeredQuestionCount;\n options.requiredQuestionCount = info.requiredQuestionCount;\n options.requiredAnsweredQuestionCount =\n info.requiredAnsweredQuestionCount;\n }\n options.text = this.getProgressTextCore(options);\n this.onProgressText.fire(this, options);\n return options.text;\n };\n SurveyModel.prototype.getProgressTextCore = function (info) {\n var type = this.progressBarType.toLowerCase();\n if (type === \"questions\") {\n return this.getLocString(\"questionsProgressText\")[\"format\"](info.answeredQuestionCount, info.questionCount);\n }\n if (type === \"requiredquestions\") {\n return this.getLocString(\"questionsProgressText\")[\"format\"](info.requiredAnsweredQuestionCount, info.requiredQuestionCount);\n }\n if (type === \"correctquestions\") {\n var correctAnswersCount = this.getCorrectedAnswerCount();\n return this.getLocString(\"questionsProgressText\")[\"format\"](correctAnswersCount, info.questionCount);\n }\n var vPages = this.isDesignMode ? this.pages : this.visiblePages;\n var index = this.isDesignMode ? 1 : vPages.indexOf(this.currentPage) + 1;\n return this.getLocString(\"progressText\")[\"format\"](index, vPages.length);\n };\n SurveyModel.prototype.afterRenderSurvey = function (htmlElement) {\n this.onAfterRenderSurvey.fire(this, {\n survey: this,\n htmlElement: htmlElement,\n });\n };\n SurveyModel.prototype.updateQuestionCssClasses = function (question, cssClasses) {\n this.onUpdateQuestionCssClasses.fire(this, {\n question: question,\n cssClasses: cssClasses,\n });\n };\n SurveyModel.prototype.updatePanelCssClasses = function (panel, cssClasses) {\n this.onUpdatePanelCssClasses.fire(this, {\n panel: panel,\n cssClasses: cssClasses,\n });\n };\n SurveyModel.prototype.updatePageCssClasses = function (page, cssClasses) {\n this.onUpdatePageCssClasses.fire(this, {\n page: page,\n cssClasses: cssClasses,\n });\n };\n SurveyModel.prototype.afterRenderPage = function (htmlElement) {\n if (this.onAfterRenderPage.isEmpty)\n return;\n this.onAfterRenderPage.fire(this, {\n page: this.activePage,\n htmlElement: htmlElement,\n });\n };\n SurveyModel.prototype.afterRenderHeader = function (htmlElement) {\n if (this.onAfterRenderHeader.isEmpty)\n return;\n this.onAfterRenderHeader.fire(this, {\n htmlElement: htmlElement,\n });\n };\n SurveyModel.prototype.afterRenderQuestion = function (question, htmlElement) {\n this.onAfterRenderQuestion.fire(this, {\n question: question,\n htmlElement: htmlElement,\n });\n };\n SurveyModel.prototype.afterRenderQuestionInput = function (question, htmlElement) {\n if (this.onAfterRenderQuestionInput.isEmpty)\n return;\n var id = question.inputId;\n if (!!id && htmlElement.id !== id && typeof document !== \"undefined\") {\n var el = document.getElementById(id);\n if (!!el) {\n htmlElement = el;\n }\n }\n this.onAfterRenderQuestionInput.fire(this, {\n question: question,\n htmlElement: htmlElement,\n });\n };\n SurveyModel.prototype.afterRenderPanel = function (panel, htmlElement) {\n this.onAfterRenderPanel.fire(this, {\n panel: panel,\n htmlElement: htmlElement,\n });\n };\n SurveyModel.prototype.matrixBeforeRowAdded = function (options) {\n this.onMatrixBeforeRowAdded.fire(this, options);\n };\n SurveyModel.prototype.matrixRowAdded = function (question, row) {\n this.onMatrixRowAdded.fire(this, { question: question, row: row });\n };\n SurveyModel.prototype.getQuestionByValueNameFromArray = function (valueName, name, index) {\n var questions = this.getQuestionsByValueName(valueName);\n if (!questions)\n return;\n for (var i = 0; i < questions.length; i++) {\n var res = questions[i].getQuestionFromArray(name, index);\n if (!!res)\n return res;\n }\n return null;\n };\n SurveyModel.prototype.matrixRowRemoved = function (question, rowIndex, row) {\n this.onMatrixRowRemoved.fire(this, {\n question: question,\n rowIndex: rowIndex,\n row: row,\n });\n };\n SurveyModel.prototype.matrixRowRemoving = function (question, rowIndex, row) {\n var options = {\n question: question,\n rowIndex: rowIndex,\n row: row,\n allow: true,\n };\n this.onMatrixRowRemoving.fire(this, options);\n return options.allow;\n };\n SurveyModel.prototype.matrixAllowRemoveRow = function (question, rowIndex, row) {\n var options = {\n question: question,\n rowIndex: rowIndex,\n row: row,\n allow: true,\n };\n this.onMatrixAllowRemoveRow.fire(this, options);\n return options.allow;\n };\n SurveyModel.prototype.matrixCellCreated = function (question, options) {\n options.question = question;\n this.onMatrixCellCreated.fire(this, options);\n };\n SurveyModel.prototype.matrixAfterCellRender = function (question, options) {\n options.question = question;\n this.onMatrixAfterCellRender.fire(this, options);\n };\n SurveyModel.prototype.matrixCellValueChanged = function (question, options) {\n options.question = question;\n this.onMatrixCellValueChanged.fire(this, options);\n };\n SurveyModel.prototype.matrixCellValueChanging = function (question, options) {\n options.question = question;\n this.onMatrixCellValueChanging.fire(this, options);\n };\n Object.defineProperty(SurveyModel.prototype, \"isValidateOnValueChanging\", {\n get: function () {\n return this.checkErrorsMode === \"onValueChanging\";\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.matrixCellValidate = function (question, options) {\n options.question = question;\n this.onMatrixCellValidate.fire(this, options);\n return options.error ? new _error__WEBPACK_IMPORTED_MODULE_10__[\"CustomError\"](options.error, this) : null;\n };\n SurveyModel.prototype.dynamicPanelAdded = function (question) {\n if (this.onDynamicPanelAdded.isEmpty)\n return;\n var panels = question.panels;\n var panel = panels[panels.length - 1];\n this.onDynamicPanelAdded.fire(this, { question: question, panel: panel });\n };\n SurveyModel.prototype.dynamicPanelRemoved = function (question, panelIndex, panel) {\n var questions = !!panel ? panel.questions : [];\n for (var i = 0; i < questions.length; i++) {\n questions[i].clearOnDeletingContainer();\n }\n this.onDynamicPanelRemoved.fire(this, {\n question: question,\n panelIndex: panelIndex,\n panel: panel,\n });\n };\n SurveyModel.prototype.dynamicPanelItemValueChanged = function (question, options) {\n options.question = question;\n this.onDynamicPanelItemValueChanged.fire(this, options);\n };\n SurveyModel.prototype.dragAndDropAllow = function (options) {\n options.allow = true;\n this.onDragDropAllow.fire(this, options);\n return options.allow;\n };\n SurveyModel.prototype.elementContentVisibilityChanged = function (element) {\n if (this.currentPageValue) {\n this.currentPageValue.ensureRowsVisibility();\n }\n this.onElementContentVisibilityChanged.fire(this, { element: element });\n };\n SurveyModel.prototype.getUpdatedElementTitleActions = function (element, titleActions) {\n if (element.isPage)\n return this.getUpdatedPageTitleActions(element, titleActions);\n if (element.isPanel)\n return this.getUpdatedPanelTitleActions(element, titleActions);\n return this.getUpdatedQuestionTitleActions(element, titleActions);\n };\n SurveyModel.prototype.getUpdatedQuestionTitleActions = function (question, titleActions) {\n var options = {\n question: question,\n titleActions: titleActions,\n };\n this.onGetQuestionTitleActions.fire(this, options);\n return options.titleActions;\n };\n SurveyModel.prototype.getUpdatedPanelTitleActions = function (panel, titleActions) {\n var options = {\n panel: panel,\n titleActions: titleActions,\n };\n this.onGetPanelTitleActions.fire(this, options);\n return options.titleActions;\n };\n SurveyModel.prototype.getUpdatedPageTitleActions = function (page, titleActions) {\n var options = {\n page: page,\n titleActions: titleActions,\n };\n this.onGetPageTitleActions.fire(this, options);\n return options.titleActions;\n };\n SurveyModel.prototype.getUpdatedMatrixRowActions = function (question, row, actions) {\n var options = {\n question: question,\n actions: actions,\n row: row,\n };\n this.onGetMatrixRowActions.fire(this, options);\n return options.actions;\n };\n SurveyModel.prototype.scrollElementToTop = function (element, question, page, id) {\n var options = {\n element: element,\n question: question,\n page: page,\n elementId: id,\n cancel: false,\n };\n this.onScrollingElementToTop.fire(this, options);\n if (!options.cancel) {\n _survey_element__WEBPACK_IMPORTED_MODULE_3__[\"SurveyElement\"].ScrollElementToTop(options.elementId);\n }\n };\n /**\n * Uploads a file to server.\n * @param question a file question object\n * @param name a question name\n * @param files files to upload\n * @param uploadingCallback a call back function to get the status on uploading the files\n */\n SurveyModel.prototype.uploadFiles = function (question, name, files, uploadingCallback) {\n if (this.onUploadFiles.isEmpty) {\n uploadingCallback(\"error\", files);\n }\n else {\n this.onUploadFiles.fire(this, {\n question: question,\n name: name,\n files: files || [],\n callback: uploadingCallback,\n });\n }\n if (this.surveyPostId) {\n this.uploadFilesCore(name, files, uploadingCallback);\n }\n };\n /**\n * Downloads a file from server\n * @param name a question name\n * @param fileValue a single file question value\n * @param callback a call back function to get the status on downloading the file and the downloaded file content\n */\n SurveyModel.prototype.downloadFile = function (questionName, fileValue, callback) {\n if (this.onDownloadFile.isEmpty) {\n !!callback && callback(\"success\", fileValue.content || fileValue);\n }\n this.onDownloadFile.fire(this, {\n name: questionName,\n content: fileValue.content || fileValue,\n fileValue: fileValue,\n callback: callback,\n });\n };\n /**\n * Clears files from server.\n * @param question question\n * @param name question name\n * @param value file question value\n * @param callback call back function to get the status of the clearing operation\n */\n SurveyModel.prototype.clearFiles = function (question, name, value, fileName, callback) {\n if (this.onClearFiles.isEmpty) {\n !!callback && callback(\"success\", value);\n }\n this.onClearFiles.fire(this, {\n question: question,\n name: name,\n value: value,\n fileName: fileName,\n callback: callback,\n });\n };\n SurveyModel.prototype.updateChoicesFromServer = function (question, choices, serverResult) {\n var options = {\n question: question,\n choices: choices,\n serverResult: serverResult,\n };\n this.onLoadChoicesFromServer.fire(this, options);\n return options.choices;\n };\n SurveyModel.prototype.createSurveyService = function () {\n return new _dxSurveyService__WEBPACK_IMPORTED_MODULE_8__[\"dxSurveyService\"]();\n };\n SurveyModel.prototype.uploadFilesCore = function (name, files, uploadingCallback) {\n var _this = this;\n var responses = [];\n files.forEach(function (file) {\n if (uploadingCallback)\n uploadingCallback(\"uploading\", file);\n _this.createSurveyService().sendFile(_this.surveyPostId, file, function (success, response) {\n if (success) {\n responses.push({ content: response, file: file });\n if (responses.length === files.length) {\n if (uploadingCallback)\n uploadingCallback(\"success\", responses);\n }\n }\n else {\n if (uploadingCallback)\n uploadingCallback(\"error\", {\n response: response,\n file: file,\n });\n }\n });\n });\n };\n SurveyModel.prototype.getPage = function (index) {\n return this.pages[index];\n };\n /**\n * Adds an existing page to the survey.\n * @param page a newly added page\n * @param index - a page index to where insert a page. It is -1 by default and the page will be added into the end.\n * @see addNewPage\n */\n SurveyModel.prototype.addPage = function (page, index) {\n if (index === void 0) { index = -1; }\n if (page == null)\n return;\n if (index < 0 || index >= this.pages.length) {\n this.pages.push(page);\n }\n else {\n this.pages.splice(index, 0, page);\n }\n };\n /**\n * Creates a new page and adds it to a survey. Generates a new name if the `name` parameter is not specified.\n * @param name a page name\n * @param index - a page index to where insert a new page. It is -1 by default and the page will be added into the end.\n * @see addPage\n */\n SurveyModel.prototype.addNewPage = function (name, index) {\n if (name === void 0) { name = null; }\n if (index === void 0) { index = -1; }\n var page = this.createNewPage(name);\n this.addPage(page, index);\n return page;\n };\n /**\n * Removes a page from a survey.\n * @param page\n */\n SurveyModel.prototype.removePage = function (page) {\n var index = this.pages.indexOf(page);\n if (index < 0)\n return;\n this.pages.splice(index, 1);\n if (this.currentPageValue == page) {\n this.currentPage = this.pages.length > 0 ? this.pages[0] : null;\n }\n };\n /**\n * Returns a question by its name.\n * @param name a question name\n * @param caseInsensitive\n * @see getQuestionByValueName\n */\n SurveyModel.prototype.getQuestionByName = function (name, caseInsensitive) {\n if (caseInsensitive === void 0) { caseInsensitive = false; }\n if (!name)\n return null;\n if (caseInsensitive) {\n name = name.toLowerCase();\n }\n var hash = !!caseInsensitive\n ? this.questionHashes.namesInsensitive\n : this.questionHashes.names;\n var res = hash[name];\n if (!res)\n return null;\n return res[0];\n };\n /**\n * Returns a question by its value name\n * @param valueName a question name\n * @param caseInsensitive\n * @see getQuestionByName\n * @see getQuestionsByValueName\n * @see Question.valueName\n */\n SurveyModel.prototype.getQuestionByValueName = function (valueName, caseInsensitive) {\n if (caseInsensitive === void 0) { caseInsensitive = false; }\n var res = this.getQuestionsByValueName(valueName, caseInsensitive);\n return !!res ? res[0] : null;\n };\n /**\n * Returns all questions by their valueName. name property is used if valueName property is empty.\n * @param valueName a question name\n * @param caseInsensitive\n * @see getQuestionByName\n * @see getQuestionByValueName\n * @see Question.valueName\n */\n SurveyModel.prototype.getQuestionsByValueName = function (valueName, caseInsensitive) {\n if (caseInsensitive === void 0) { caseInsensitive = false; }\n var hash = !!caseInsensitive\n ? this.questionHashes.valueNamesInsensitive\n : this.questionHashes.valueNames;\n var res = hash[valueName];\n if (!res)\n return null;\n return res;\n };\n SurveyModel.prototype.getCalculatedValueByName = function (name) {\n for (var i = 0; i < this.calculatedValues.length; i++) {\n if (name == this.calculatedValues[i].name)\n return this.calculatedValues[i];\n }\n return null;\n };\n /**\n * Gets a list of questions by their names.\n * @param names an array of question names\n * @param caseInsensitive\n */\n SurveyModel.prototype.getQuestionsByNames = function (names, caseInsensitive) {\n if (caseInsensitive === void 0) { caseInsensitive = false; }\n var result = [];\n if (!names)\n return result;\n for (var i = 0; i < names.length; i++) {\n if (!names[i])\n continue;\n var question = this.getQuestionByName(names[i], caseInsensitive);\n if (question)\n result.push(question);\n }\n return result;\n };\n /**\n * Returns a page on which an element (question or panel) is placed.\n * @param element Question or Panel\n */\n SurveyModel.prototype.getPageByElement = function (element) {\n for (var i = 0; i < this.pages.length; i++) {\n var page = this.pages[i];\n if (page.containsElement(element))\n return page;\n }\n return null;\n };\n /**\n * Returns a page on which a question is located.\n * @param question\n */\n SurveyModel.prototype.getPageByQuestion = function (question) {\n return this.getPageByElement(question);\n };\n /**\n * Returns a page by it's name.\n * @param name\n */\n SurveyModel.prototype.getPageByName = function (name) {\n for (var i = 0; i < this.pages.length; i++) {\n if (this.pages[i].name == name)\n return this.pages[i];\n }\n return null;\n };\n /**\n * Returns a list of pages by their names.\n * @param names a list of page names\n */\n SurveyModel.prototype.getPagesByNames = function (names) {\n var result = [];\n if (!names)\n return result;\n for (var i = 0; i < names.length; i++) {\n if (!names[i])\n continue;\n var page = this.getPageByName(names[i]);\n if (page)\n result.push(page);\n }\n return result;\n };\n /**\n * Returns a list of all questions in a survey.\n * @param visibleOnly set it `true`, if you want to get only visible questions\n */\n SurveyModel.prototype.getAllQuestions = function (visibleOnly, includingDesignTime) {\n if (visibleOnly === void 0) { visibleOnly = false; }\n if (includingDesignTime === void 0) { includingDesignTime = false; }\n var result = new Array();\n for (var i = 0; i < this.pages.length; i++) {\n this.pages[i].addQuestionsToList(result, visibleOnly, includingDesignTime);\n }\n return result;\n };\n /**\n * Returns quiz questions. All visible questions that has input(s) widgets.\n * @see getQuizQuestionCount\n */\n SurveyModel.prototype.getQuizQuestions = function () {\n var result = new Array();\n var startIndex = this.firstPageIsStarted ? 1 : 0;\n for (var i = startIndex; i < this.pages.length; i++) {\n if (!this.pages[i].isVisible)\n continue;\n var questions = this.pages[i].questions;\n for (var j = 0; j < questions.length; j++) {\n var q = questions[j];\n if (q.quizQuestionCount > 0) {\n result.push(q);\n }\n }\n }\n return result;\n };\n /**\n * Returns a panel by its name.\n * @param name a panel name\n * @param caseInsensitive\n * @see getQuestionByName\n */\n SurveyModel.prototype.getPanelByName = function (name, caseInsensitive) {\n if (caseInsensitive === void 0) { caseInsensitive = false; }\n var panels = this.getAllPanels();\n if (caseInsensitive)\n name = name.toLowerCase();\n for (var i = 0; i < panels.length; i++) {\n var panelName = panels[i].name;\n if (caseInsensitive)\n panelName = panelName.toLowerCase();\n if (panelName == name)\n return panels[i];\n }\n return null;\n };\n /**\n * Returns a list of all survey's panels.\n */\n SurveyModel.prototype.getAllPanels = function (visibleOnly, includingDesignTime) {\n if (visibleOnly === void 0) { visibleOnly = false; }\n if (includingDesignTime === void 0) { includingDesignTime = false; }\n var result = new Array();\n for (var i = 0; i < this.pages.length; i++) {\n this.pages[i].addPanelsIntoList(result, visibleOnly, includingDesignTime);\n }\n return result;\n };\n /**\n * Creates and returns a new page, but do not add it into the survey.\n * You can use addPage(page) function to add it into survey later.\n * @see addPage\n * @see addNewPage\n */\n SurveyModel.prototype.createNewPage = function (name) {\n return new _page__WEBPACK_IMPORTED_MODULE_5__[\"PageModel\"](name);\n };\n SurveyModel.prototype.questionOnValueChanging = function (valueName, newValue) {\n if (this.onValueChanging.isEmpty)\n return newValue;\n var options = {\n name: valueName,\n question: this.getQuestionByValueName(valueName),\n value: this.getUnbindValue(newValue),\n oldValue: this.getValue(valueName),\n };\n this.onValueChanging.fire(this, options);\n return options.value;\n };\n SurveyModel.prototype.updateQuestionValue = function (valueName, newValue) {\n if (this.isLoadingFromJson)\n return;\n var questions = this.getQuestionsByValueName(valueName);\n if (!!questions) {\n for (var i = 0; i < questions.length; i++) {\n var qValue = questions[i].value;\n if ((qValue === newValue && Array.isArray(qValue) && !!this.editingObj) ||\n !this.isTwoValueEquals(qValue, newValue)) {\n questions[i].updateValueFromSurvey(newValue);\n }\n }\n }\n };\n SurveyModel.prototype.checkQuestionErrorOnValueChanged = function (question) {\n if (!this.isNavigationButtonPressed &&\n (this.checkErrorsMode === \"onValueChanged\" ||\n question.getAllErrors().length > 0)) {\n this.checkQuestionErrorOnValueChangedCore(question);\n }\n };\n SurveyModel.prototype.checkQuestionErrorOnValueChangedCore = function (question) {\n var oldErrorCount = question.getAllErrors().length;\n var res = question.hasErrors(true, {\n isOnValueChanged: !this.isValidateOnValueChanging,\n });\n if (!!question.page &&\n (oldErrorCount > 0 || question.getAllErrors().length > 0)) {\n this.fireValidatedErrorsOnPage(question.page);\n }\n return res;\n };\n SurveyModel.prototype.checkErrorsOnValueChanging = function (valueName, newValue) {\n if (this.isLoadingFromJson)\n return false;\n var questions = this.getQuestionsByValueName(valueName);\n if (!questions)\n return false;\n var res = false;\n for (var i = 0; i < questions.length; i++) {\n var q = questions[i];\n if (!this.isTwoValueEquals(q.valueForSurvey, newValue)) {\n q.value = newValue;\n }\n if (this.checkQuestionErrorOnValueChangedCore(q))\n res = true;\n res = res || q.errors.length > 0;\n }\n return res;\n };\n SurveyModel.prototype.notifyQuestionOnValueChanged = function (valueName, newValue) {\n if (this.isLoadingFromJson)\n return;\n var questions = this.getQuestionsByValueName(valueName);\n if (!!questions) {\n for (var i = 0; i < questions.length; i++) {\n var question = questions[i];\n this.checkQuestionErrorOnValueChanged(question);\n question.onSurveyValueChanged(newValue);\n this.onValueChanged.fire(this, {\n name: valueName,\n question: question,\n value: newValue,\n });\n }\n }\n else {\n this.onValueChanged.fire(this, {\n name: valueName,\n question: null,\n value: newValue,\n });\n }\n if (this.isDisposed)\n return;\n for (var i = 0; i < this.pages.length; i++) {\n this.pages[i].checkBindings(valueName, newValue);\n }\n this.notifyElementsOnAnyValueOrVariableChanged(valueName);\n };\n SurveyModel.prototype.notifyElementsOnAnyValueOrVariableChanged = function (name) {\n if (this.isEndLoadingFromJson === \"processing\")\n return;\n if (this.isRunningConditions) {\n this.conditionNotifyElementsOnAnyValueOrVariableChanged = true;\n return;\n }\n for (var i = 0; i < this.pages.length; i++) {\n this.pages[i].onAnyValueChanged(name);\n }\n if (!this.isEndLoadingFromJson) {\n this.locStrsChanged();\n }\n };\n SurveyModel.prototype.updateAllQuestionsValue = function () {\n var questions = this.getAllQuestions();\n for (var i = 0; i < questions.length; i++) {\n var q = questions[i];\n var valName = q.getValueName();\n q.updateValueFromSurvey(this.getValue(valName));\n if (q.requireUpdateCommentValue) {\n q.updateCommentFromSurvey(this.getComment(valName));\n }\n }\n };\n SurveyModel.prototype.notifyAllQuestionsOnValueChanged = function () {\n var questions = this.getAllQuestions();\n for (var i = 0; i < questions.length; i++) {\n questions[i].onSurveyValueChanged(this.getValue(questions[i].getValueName()));\n }\n };\n SurveyModel.prototype.checkOnPageTriggers = function () {\n var questions = this.getCurrentPageQuestions(true);\n var values = {};\n for (var i = 0; i < questions.length; i++) {\n var question = questions[i];\n var name = question.getValueName();\n values[name] = this.getValue(name);\n }\n this.addCalculatedValuesIntoFilteredValues(values);\n this.checkTriggers(values, true);\n };\n SurveyModel.prototype.getCurrentPageQuestions = function (includeInvsible) {\n if (includeInvsible === void 0) { includeInvsible = false; }\n var result = [];\n var page = this.currentPage;\n if (!page)\n return result;\n for (var i = 0; i < page.questions.length; i++) {\n var question = page.questions[i];\n if ((!includeInvsible && !question.visible) || !question.name)\n continue;\n result.push(question);\n }\n return result;\n };\n SurveyModel.prototype.checkTriggers = function (key, isOnNextPage) {\n if (this.isCompleted || this.triggers.length == 0)\n return;\n if (this.isTriggerIsRunning) {\n this.triggerValues = this.getFilteredValues();\n for (var k in key) {\n this.triggerKeys[k] = key[k];\n }\n return;\n }\n this.isTriggerIsRunning = true;\n this.triggerKeys = key;\n this.triggerValues = this.getFilteredValues();\n var properties = this.getFilteredProperties();\n for (var i = 0; i < this.triggers.length; i++) {\n var trigger = this.triggers[i];\n if (trigger.isOnNextPage == isOnNextPage) {\n trigger.checkExpression(this.triggerKeys, this.triggerValues, properties);\n }\n }\n this.isTriggerIsRunning = false;\n };\n SurveyModel.prototype.doElementsOnLoad = function () {\n for (var i = 0; i < this.pages.length; i++) {\n this.pages[i].onSurveyLoad();\n }\n };\n Object.defineProperty(SurveyModel.prototype, \"isRunningConditions\", {\n get: function () {\n return !!this.conditionValues;\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.runConditions = function () {\n if (this.isCompleted ||\n this.isEndLoadingFromJson === \"processing\" ||\n this.isRunningConditions)\n return;\n this.conditionValues = this.getFilteredValues();\n var properties = this.getFilteredProperties();\n var oldCurrentPageIndex = this.pages.indexOf(this.currentPageValue);\n this.runConditionsCore(properties);\n this.checkIfNewPagesBecomeVisible(oldCurrentPageIndex);\n this.conditionValues = null;\n if (this.isValueChangedOnRunningCondition &&\n this.conditionRunnerCounter <\n _settings__WEBPACK_IMPORTED_MODULE_15__[\"settings\"].maximumConditionRunCountOnValueChanged) {\n this.isValueChangedOnRunningCondition = false;\n this.conditionRunnerCounter++;\n this.runConditions();\n }\n else {\n this.isValueChangedOnRunningCondition = false;\n this.conditionRunnerCounter = 0;\n if (this.conditionUpdateVisibleIndexes) {\n this.conditionUpdateVisibleIndexes = false;\n this.updateVisibleIndexes();\n }\n if (this.conditionNotifyElementsOnAnyValueOrVariableChanged) {\n this.conditionNotifyElementsOnAnyValueOrVariableChanged = false;\n this.notifyElementsOnAnyValueOrVariableChanged(\"\");\n }\n }\n };\n SurveyModel.prototype.runConditionOnValueChanged = function (name, value) {\n if (this.isRunningConditions) {\n this.conditionValues[name] = value;\n this.isValueChangedOnRunningCondition = true;\n }\n else {\n this.runConditions();\n }\n };\n SurveyModel.prototype.runConditionsCore = function (properties) {\n var pages = this.pages;\n for (var i = 0; i < this.calculatedValues.length; i++) {\n this.calculatedValues[i].resetCalculation();\n }\n for (var i = 0; i < this.calculatedValues.length; i++) {\n this.calculatedValues[i].doCalculation(this.calculatedValues, this.conditionValues, properties);\n }\n for (var i = 0; i < pages.length; i++) {\n pages[i].runCondition(this.conditionValues, properties);\n }\n };\n SurveyModel.prototype.checkIfNewPagesBecomeVisible = function (oldCurrentPageIndex) {\n var newCurrentPageIndex = this.pages.indexOf(this.currentPageValue);\n if (newCurrentPageIndex <= oldCurrentPageIndex + 1)\n return;\n for (var i = oldCurrentPageIndex + 1; i < newCurrentPageIndex; i++) {\n if (this.pages[i].isVisible) {\n this.currentPage = this.pages[i];\n break;\n }\n }\n };\n /**\n * Sends a survey result to the [api.surveyjs.io](https://api.surveyjs.io) service.\n * @param postId [api.surveyjs.io](https://api.surveyjs.io) service postId\n * @param clientId Typically a customer e-mail or an identifier\n * @param isPartialCompleted Set it to `true` if the survey is not completed yet and the results are intermediate\n * @see surveyPostId\n * @see clientId\n */\n SurveyModel.prototype.sendResult = function (postId, clientId, isPartialCompleted) {\n if (postId === void 0) { postId = null; }\n if (clientId === void 0) { clientId = null; }\n if (isPartialCompleted === void 0) { isPartialCompleted = false; }\n if (!this.isEditMode)\n return;\n if (isPartialCompleted && this.onPartialSend) {\n this.onPartialSend.fire(this, null);\n }\n if (!postId && this.surveyPostId) {\n postId = this.surveyPostId;\n }\n if (!postId)\n return;\n if (clientId) {\n this.clientId = clientId;\n }\n if (isPartialCompleted && !this.clientId)\n return;\n var self = this;\n if (this.surveyShowDataSaving) {\n this.setCompletedState(\"saving\", \"\");\n }\n this.createSurveyService().sendResult(postId, this.data, function (success, response, request) {\n if (self.surveyShowDataSaving) {\n if (success) {\n self.setCompletedState(\"success\", \"\");\n }\n else {\n self.setCompletedState(\"error\", response);\n }\n }\n self.onSendResult.fire(self, {\n success: success,\n response: response,\n request: request,\n });\n }, this.clientId, isPartialCompleted);\n };\n /**\n * Calls the [api.surveyjs.io](https://api.surveyjs.io) service and, on callback, fires the `onGetResult` event with all answers that your users made for a question.\n * @param resultId [api.surveyjs.io](https://api.surveyjs.io) service resultId\n * @param name The question name\n * @see onGetResult\n */\n SurveyModel.prototype.getResult = function (resultId, name) {\n var self = this;\n this.createSurveyService().getResult(resultId, name, function (success, data, dataList, response) {\n self.onGetResult.fire(self, {\n success: success,\n data: data,\n dataList: dataList,\n response: response,\n });\n });\n };\n /**\n * Loads the survey JSON from the [api.surveyjs.io](https://api.surveyjs.io) service.\n * If `clientId` is not `null` and a user had completed a survey before, the survey switches to `completedbefore` state.\n * @param surveyId [api.surveyjs.io](https://api.surveyjs.io) service surveyId\n * @param clientId users' indentifier, for example an e-mail or a unique customer id in your web application.\n * @see state\n * @see onLoadedSurveyFromService\n */\n SurveyModel.prototype.loadSurveyFromService = function (surveyId, cliendId) {\n if (surveyId === void 0) { surveyId = null; }\n if (cliendId === void 0) { cliendId = null; }\n if (surveyId) {\n this.surveyId = surveyId;\n }\n if (cliendId) {\n this.clientId = cliendId;\n }\n var self = this;\n this.isLoading = true;\n this.onLoadingSurveyFromService();\n if (cliendId) {\n this.createSurveyService().getSurveyJsonAndIsCompleted(this.surveyId, this.clientId, function (success, json, isCompleted, response) {\n self.isLoading = false;\n if (success) {\n self.isCompletedBefore = isCompleted == \"completed\";\n self.loadSurveyFromServiceJson(json);\n }\n });\n }\n else {\n this.createSurveyService().loadSurvey(this.surveyId, function (success, result, response) {\n self.isLoading = false;\n if (success) {\n self.loadSurveyFromServiceJson(result);\n }\n });\n }\n };\n SurveyModel.prototype.loadSurveyFromServiceJson = function (json) {\n if (!json)\n return;\n this.fromJSON(json);\n this.notifyAllQuestionsOnValueChanged();\n this.onLoadSurveyFromService();\n this.onLoadedSurveyFromService.fire(this, {});\n };\n SurveyModel.prototype.onLoadingSurveyFromService = function () { };\n SurveyModel.prototype.onLoadSurveyFromService = function () { };\n SurveyModel.prototype.resetVisibleIndexes = function () {\n var questions = this.getAllQuestions(true);\n for (var i = 0; i < questions.length; i++) {\n questions[i].setVisibleIndex(-1);\n }\n this.updateVisibleIndexes();\n };\n SurveyModel.prototype.updateVisibleIndexes = function () {\n if (this.isLoadingFromJson || !!this.isEndLoadingFromJson)\n return;\n if (this.isRunningConditions &&\n this.onVisibleChanged.isEmpty &&\n this.onPageVisibleChanged.isEmpty) {\n //Run update visible index only one time on finishing running conditions\n this.conditionUpdateVisibleIndexes = true;\n return;\n }\n this.updatePageVisibleIndexes(this.showPageNumbers);\n if (this.showQuestionNumbers == \"onPage\") {\n var visPages = this.visiblePages;\n for (var i = 0; i < visPages.length; i++) {\n visPages[i].setVisibleIndex(0);\n }\n }\n else {\n var index = this.showQuestionNumbers == \"on\" ? 0 : -1;\n for (var i = 0; i < this.pages.length; i++) {\n index += this.pages[i].setVisibleIndex(index);\n }\n }\n this.updateProgressText(true);\n };\n SurveyModel.prototype.updatePageVisibleIndexes = function (showIndex) {\n var index = 0;\n for (var i = 0; i < this.pages.length; i++) {\n var isPageVisible = this.pages[i].isVisible;\n this.pages[i].visibleIndex = isPageVisible ? index++ : -1;\n this.pages[i].num =\n showIndex && isPageVisible ? this.pages[i].visibleIndex + 1 : -1;\n }\n };\n SurveyModel.prototype.fromJSON = function (json) {\n if (!json)\n return;\n this.questionHashesClear();\n this.jsonErrors = null;\n var jsonConverter = new _jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"JsonObject\"]();\n jsonConverter.toObject(json, this);\n if (jsonConverter.errors.length > 0) {\n this.jsonErrors = jsonConverter.errors;\n }\n };\n SurveyModel.prototype.setJsonObject = function (jsonObj) {\n this.fromJSON(jsonObj);\n };\n SurveyModel.prototype.endLoadingFromJson = function () {\n this.isEndLoadingFromJson = \"processing\";\n this.isStartedState = this.firstPageIsStarted;\n this.onQuestionsOnPageModeChanged(\"standard\");\n _super.prototype.endLoadingFromJson.call(this);\n if (this.hasCookie) {\n this.doComplete();\n }\n this.doElementsOnLoad();\n this.isEndLoadingFromJson = \"conditions\";\n this.runConditions();\n this.notifyElementsOnAnyValueOrVariableChanged(\"\");\n this.isEndLoadingFromJson = null;\n this.updateVisibleIndexes();\n };\n SurveyModel.prototype.onBeforeCreating = function () { };\n SurveyModel.prototype.onCreating = function () { };\n SurveyModel.prototype.getProcessedTextValue = function (textValue) {\n this.getProcessedTextValueCore(textValue);\n if (!this.onProcessTextValue.isEmpty) {\n var wasEmpty = this.isValueEmpty(textValue.value);\n this.onProcessTextValue.fire(this, textValue);\n textValue.isExists =\n textValue.isExists || (wasEmpty && !this.isValueEmpty(textValue.value));\n }\n };\n SurveyModel.prototype.getProcessedTextValueCore = function (textValue) {\n var name = textValue.name.toLocaleLowerCase();\n if ([\"no\", \"require\", \"title\"].indexOf(name) !== -1) {\n return;\n }\n if (name === \"pageno\") {\n textValue.isExists = true;\n var page = this.currentPage;\n textValue.value = page != null ? this.visiblePages.indexOf(page) + 1 : 0;\n return;\n }\n if (name === \"pagecount\") {\n textValue.isExists = true;\n textValue.value = this.visiblePageCount;\n return;\n }\n if (name === \"locale\") {\n textValue.isExists = true;\n textValue.value = !!this.locale\n ? this.locale\n : _surveyStrings__WEBPACK_IMPORTED_MODULE_9__[\"surveyLocalization\"].defaultLocale;\n return;\n }\n if (name === \"correctedanswers\" || name === \"correctedanswercount\") {\n textValue.isExists = true;\n textValue.value = this.getCorrectedAnswerCount();\n return;\n }\n if (name === \"incorrectedanswers\" || name === \"incorrectedanswercount\") {\n textValue.isExists = true;\n textValue.value = this.getInCorrectedAnswerCount();\n return;\n }\n if (name === \"questioncount\") {\n textValue.isExists = true;\n textValue.value = this.getQuizQuestionCount();\n return;\n }\n var variable = this.getVariable(name);\n if (variable !== undefined) {\n textValue.isExists = true;\n textValue.value = variable;\n return;\n }\n var question = this.getFirstName(name);\n if (question) {\n textValue.isExists = true;\n var firstName = question.getValueName().toLowerCase();\n name = firstName + name.substr(firstName.length);\n name = name.toLocaleLowerCase();\n var values = {};\n values[firstName] = textValue.returnDisplayValue\n ? question.getDisplayValue(false, undefined)\n : question.value;\n textValue.value = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_7__[\"ProcessValue\"]().getValue(name, values);\n return;\n }\n var value = this.getValue(textValue.name);\n if (value !== undefined) {\n textValue.isExists = true;\n textValue.value = value;\n }\n };\n SurveyModel.prototype.getFirstName = function (name) {\n name = name.toLowerCase();\n var question;\n do {\n question = this.getQuestionByValueName(name, true);\n name = this.reduceFirstName(name);\n } while (!question && !!name);\n return question;\n };\n SurveyModel.prototype.reduceFirstName = function (name) {\n var pos1 = name.lastIndexOf(\".\");\n var pos2 = name.lastIndexOf(\"[\");\n if (pos1 < 0 && pos2 < 0)\n return \"\";\n var pos = Math.max(pos1, pos2);\n return name.substr(0, pos);\n };\n SurveyModel.prototype.clearUnusedValues = function () {\n var questions = this.getAllQuestions();\n for (var i = 0; i < questions.length; i++) {\n questions[i].clearUnusedValues();\n }\n if (this.clearInvisibleValues != \"none\") {\n this.clearInvisibleQuestionValues();\n }\n };\n SurveyModel.prototype.hasVisibleQuestionByValueName = function (valueName) {\n var questions = this.getQuestionsByValueName(valueName);\n if (!questions)\n return false;\n for (var i = 0; i < questions.length; i++) {\n if (questions[i].isVisible)\n return true;\n }\n return false;\n };\n SurveyModel.prototype.questionCountByValueName = function (valueName) {\n var questions = this.getQuestionsByValueName(valueName);\n return !!questions ? questions.length : 0;\n };\n SurveyModel.prototype.clearInvisibleQuestionValues = function () {\n var questions = this.getAllQuestions();\n for (var i = 0; i < questions.length; i++) {\n questions[i].clearValueIfInvisible();\n }\n };\n /**\n * Returns a variable value. Variable, unlike values, are not stored in the survey results.\n * @param name A variable name\n * @see SetVariable\n */\n SurveyModel.prototype.getVariable = function (name) {\n if (!name)\n return null;\n name = name.toLowerCase();\n var res = this.variablesHash[name];\n if (!this.isValueEmpty(res))\n return res;\n if (name.indexOf(\".\") > -1 || name.indexOf(\"[\") > -1) {\n if (new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_7__[\"ProcessValue\"]().hasValue(name, this.variablesHash))\n return new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_7__[\"ProcessValue\"]().getValue(name, this.variablesHash);\n }\n return res;\n };\n /**\n * Sets a variable value. Variable, unlike values, are not stored in the survey results.\n * @param name A variable name\n * @param newValue A variable new value\n * @see GetVariable\n */\n SurveyModel.prototype.setVariable = function (name, newValue) {\n if (!name)\n return;\n name = name.toLowerCase();\n this.variablesHash[name] = newValue;\n this.notifyElementsOnAnyValueOrVariableChanged(name);\n this.runConditionOnValueChanged(name, newValue);\n };\n /**\n * Returns all variables in the survey. Use setVariable function to create a new variable.\n * @see getVariable\n * @see setVariable\n */\n SurveyModel.prototype.getVariableNames = function () {\n var res = [];\n for (var key in this.variablesHash) {\n res.push(key);\n }\n return res;\n };\n //ISurvey data\n SurveyModel.prototype.getUnbindValue = function (value) {\n if (!!this.editingObj)\n return value;\n return _helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].getUnbindValue(value);\n };\n /**\n * Returns a question value (answer) by a question's name.\n * @param name A question name\n * @see data\n * @see setValue\n */\n SurveyModel.prototype.getValue = function (name) {\n if (!name || name.length == 0)\n return null;\n var value = this.getDataValueCore(this.valuesHash, name);\n return this.getUnbindValue(value);\n };\n /**\n * Sets a question value (answer). It runs all triggers and conditions (`visibleIf` properties).\n *\n * Goes to the next page if `goNextPageAutomatic` is `true` and all questions on the current page are answered correctly.\n * @param name A question name\n * @param newValue A new question value\n * @see data\n * @see getValue\n * @see PageModel.visibleIf\n * @see Question.visibleIf\n * @see goNextPageAutomatic\n */\n SurveyModel.prototype.setValue = function (name, newQuestionValue, locNotification, allowNotifyValueChanged) {\n if (locNotification === void 0) { locNotification = false; }\n if (allowNotifyValueChanged === void 0) { allowNotifyValueChanged = true; }\n var newValue = newQuestionValue;\n if (allowNotifyValueChanged) {\n newValue = this.questionOnValueChanging(name, newQuestionValue);\n }\n if (this.isValidateOnValueChanging &&\n this.checkErrorsOnValueChanging(name, newValue))\n return;\n if (!this.editingObj &&\n this.isValueEqual(name, newValue) &&\n this.isTwoValueEquals(newValue, newQuestionValue))\n return;\n var oldValue = this.getValue(name);\n if (this.isValueEmpty(newValue)) {\n this.deleteDataValueCore(this.valuesHash, name);\n }\n else {\n newValue = this.getUnbindValue(newValue);\n this.setDataValueCore(this.valuesHash, name, newValue);\n }\n this.updateOnSetValue(name, newValue, oldValue, locNotification, allowNotifyValueChanged);\n };\n SurveyModel.prototype.updateOnSetValue = function (name, newValue, oldValue, locNotification, allowNotifyValueChanged) {\n if (locNotification === void 0) { locNotification = false; }\n if (allowNotifyValueChanged === void 0) { allowNotifyValueChanged = true; }\n this.updateQuestionValue(name, newValue);\n if (locNotification === true || this.isDisposed)\n return;\n var triggerKeys = {};\n triggerKeys[name] = { newValue: newValue, oldValue: oldValue };\n this.runConditionOnValueChanged(name, newValue);\n this.checkTriggers(triggerKeys, false);\n if (allowNotifyValueChanged)\n this.notifyQuestionOnValueChanged(name, newValue);\n if (locNotification !== \"text\") {\n this.tryGoNextPageAutomatic(name);\n }\n this.updateProgressText(true);\n };\n SurveyModel.prototype.isValueEqual = function (name, newValue) {\n if (newValue === \"\" || newValue === undefined)\n newValue = null;\n var oldValue = this.getValue(name);\n if (oldValue === \"\" || oldValue === undefined)\n oldValue = null;\n if (newValue === null || oldValue === null)\n return newValue === oldValue;\n return this.isTwoValueEquals(newValue, oldValue);\n };\n SurveyModel.prototype.doOnPageAdded = function (page) {\n page.setSurveyImpl(this);\n if (!page.name)\n page.name = this.generateNewName(this.pages, \"page\");\n this.questionHashesPanelAdded(page);\n this.updateVisibleIndexes();\n if (this.isDesignMode) {\n this.updateProgressText();\n }\n var options = { page: page };\n this.onPageAdded.fire(this, options);\n };\n SurveyModel.prototype.doOnPageRemoved = function (page) {\n page.setSurveyImpl(null);\n this.updateVisibleIndexes();\n if (this.isDesignMode) {\n this.updateProgressText();\n }\n this.updateLazyRenderingRowsOnRemovingElements();\n };\n SurveyModel.prototype.generateNewName = function (elements, baseName) {\n var keys = {};\n for (var i = 0; i < elements.length; i++)\n keys[elements[i][\"name\"]] = true;\n var index = 1;\n while (keys[baseName + index])\n index++;\n return baseName + index;\n };\n SurveyModel.prototype.tryGoNextPageAutomatic = function (name) {\n if (!!this.isEndLoadingFromJson ||\n !this.goNextPageAutomatic ||\n !this.currentPage)\n return;\n var question = this.getQuestionByValueName(name);\n if (!question ||\n (!!question &&\n (!question.visible || !question.supportGoNextPageAutomatic())))\n return;\n if (question.hasErrors(false) && !question.supportGoNextPageError())\n return;\n var questions = this.getCurrentPageQuestions();\n if (questions.indexOf(question) < 0)\n return;\n for (var i = 0; i < questions.length; i++) {\n if (questions[i].hasInput && questions[i].isEmpty())\n return;\n }\n if (!this.checkIsCurrentPageHasErrors(false)) {\n if (!this.isLastPage) {\n this.nextPage();\n }\n else {\n if (this.goNextPageAutomatic === true &&\n this.allowCompleteSurveyAutomatic) {\n this.completeLastPage();\n }\n }\n }\n };\n /**\n * Returns the comment value.\n * @param name A comment's name.\n * @see setComment\n */\n SurveyModel.prototype.getComment = function (name) {\n var result = this.data[name + this.commentPrefix];\n if (result == null)\n result = \"\";\n return result;\n };\n /**\n * Sets a comment value.\n * @param name A comment name.\n * @param newValue A new comment value.\n * @see getComment\n */\n SurveyModel.prototype.setComment = function (name, newValue, locNotification) {\n if (locNotification === void 0) { locNotification = false; }\n if (!newValue)\n newValue = \"\";\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isTwoValueEquals(newValue, this.getComment(name)))\n return;\n var commentName = name + this.commentPrefix;\n if (this.isValueEmpty(newValue)) {\n this.deleteDataValueCore(this.valuesHash, commentName);\n }\n else {\n this.setDataValueCore(this.valuesHash, commentName, newValue);\n }\n var questions = this.getQuestionsByValueName(name);\n if (!!questions) {\n for (var i = 0; i < questions.length; i++) {\n questions[i].updateCommentFromSurvey(newValue);\n this.checkQuestionErrorOnValueChanged(questions[i]);\n }\n }\n if (locNotification !== \"text\") {\n this.tryGoNextPageAutomatic(name);\n }\n var question = this.getQuestionByName(name);\n if (question) {\n this.onValueChanged.fire(this, {\n name: commentName,\n question: question,\n value: newValue,\n });\n }\n };\n /**\n * Removes a value from the survey results.\n * @param {string} name The name of the value. Typically it is a question name.\n */\n SurveyModel.prototype.clearValue = function (name) {\n this.setValue(name, null);\n this.setComment(name, null);\n };\n Object.defineProperty(SurveyModel.prototype, \"clearValueOnDisableItems\", {\n /**\n * Gets or sets whether to clear value on disable items in checkbox, dropdown and radiogroup questions.\n * By default, values are not cleared on disabled the corresponded items. This property is not persisted in survey JSON and you have to set it in code.\n */\n get: function () {\n return this.getPropertyValue(\"clearValueOnDisableItems\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"clearValueOnDisableItems\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isClearValueOnHidden\", {\n get: function () {\n return (this.clearInvisibleValues == \"onHidden\" ||\n this.isClearValueOnHiddenContainer);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isClearValueOnHiddenContainer\", {\n get: function () {\n return (this.clearInvisibleValues == \"onHiddenContainer\" &&\n !this.isShowingPreview &&\n !this.runningPages);\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.questionVisibilityChanged = function (question, newValue) {\n this.updateVisibleIndexes();\n this.onVisibleChanged.fire(this, {\n question: question,\n name: question.name,\n visible: newValue,\n });\n };\n SurveyModel.prototype.pageVisibilityChanged = function (page, newValue) {\n if (this.isLoadingFromJson)\n return;\n if (newValue && !this.currentPageValue) {\n this.currentPageValue = this.currentPage;\n }\n this.updateVisibleIndexes();\n this.onPageVisibleChanged.fire(this, {\n page: page,\n visible: newValue,\n });\n };\n SurveyModel.prototype.panelVisibilityChanged = function (panel, newValue) {\n this.updateVisibleIndexes();\n this.onPanelVisibleChanged.fire(this, {\n panel: panel,\n visible: newValue,\n });\n };\n SurveyModel.prototype.questionCreated = function (question) {\n this.onQuestionCreated.fire(this, { question: question });\n };\n SurveyModel.prototype.questionAdded = function (question, index, parentPanel, rootPanel) {\n if (!question.name) {\n question.name = this.generateNewName(this.getAllQuestions(false, true), \"question\");\n }\n if (!!question.page) {\n this.questionHashesAdded(question);\n }\n this.updateVisibleIndexes();\n this.onQuestionAdded.fire(this, {\n question: question,\n name: question.name,\n index: index,\n parentPanel: parentPanel,\n rootPanel: rootPanel,\n });\n };\n SurveyModel.prototype.questionRemoved = function (question) {\n this.questionHashesRemoved(question, question.name, question.getValueName());\n this.updateVisibleIndexes();\n this.onQuestionRemoved.fire(this, {\n question: question,\n name: question.name,\n });\n this.updateLazyRenderingRowsOnRemovingElements();\n };\n SurveyModel.prototype.questionRenamed = function (question, oldName, oldValueName) {\n this.questionHashesRemoved(question, oldName, oldValueName);\n this.questionHashesAdded(question);\n };\n SurveyModel.prototype.questionHashesClear = function () {\n this.questionHashes.names = {};\n this.questionHashes.namesInsensitive = {};\n this.questionHashes.valueNames = {};\n this.questionHashes.valueNamesInsensitive = {};\n };\n SurveyModel.prototype.questionHashesPanelAdded = function (panel) {\n if (this.isLoadingFromJson)\n return;\n var questions = panel.questions;\n for (var i = 0; i < questions.length; i++) {\n this.questionHashesAdded(questions[i]);\n }\n };\n SurveyModel.prototype.questionHashesAdded = function (question) {\n this.questionHashAddedCore(this.questionHashes.names, question, question.name);\n this.questionHashAddedCore(this.questionHashes.namesInsensitive, question, question.name.toLowerCase());\n this.questionHashAddedCore(this.questionHashes.valueNames, question, question.getValueName());\n this.questionHashAddedCore(this.questionHashes.valueNamesInsensitive, question, question.getValueName().toLowerCase());\n };\n SurveyModel.prototype.questionHashesRemoved = function (question, name, valueName) {\n if (!!name) {\n this.questionHashRemovedCore(this.questionHashes.names, question, name);\n this.questionHashRemovedCore(this.questionHashes.namesInsensitive, question, name.toLowerCase());\n }\n if (!!valueName) {\n this.questionHashRemovedCore(this.questionHashes.valueNames, question, valueName);\n this.questionHashRemovedCore(this.questionHashes.valueNamesInsensitive, question, valueName.toLowerCase());\n }\n };\n SurveyModel.prototype.questionHashAddedCore = function (hash, question, name) {\n var res = hash[name];\n if (!!res) {\n var res = hash[name];\n if (res.indexOf(question) < 0) {\n res.push(question);\n }\n }\n else {\n hash[name] = [question];\n }\n };\n SurveyModel.prototype.questionHashRemovedCore = function (hash, question, name) {\n var res = hash[name];\n if (!res)\n return;\n var index = res.indexOf(question);\n if (index > -1) {\n res.splice(index, 1);\n }\n if (res.length == 0) {\n delete hash[name];\n }\n };\n SurveyModel.prototype.panelAdded = function (panel, index, parentPanel, rootPanel) {\n if (!panel.name) {\n panel.name = this.generateNewName(this.getAllPanels(false, true), \"panel\");\n }\n this.questionHashesPanelAdded(panel);\n this.updateVisibleIndexes();\n this.onPanelAdded.fire(this, {\n panel: panel,\n name: panel.name,\n index: index,\n parentPanel: parentPanel,\n rootPanel: rootPanel,\n });\n };\n SurveyModel.prototype.panelRemoved = function (panel) {\n this.updateVisibleIndexes();\n this.onPanelRemoved.fire(this, { panel: panel, name: panel.name });\n this.updateLazyRenderingRowsOnRemovingElements();\n };\n SurveyModel.prototype.validateQuestion = function (question) {\n if (this.onValidateQuestion.isEmpty)\n return null;\n var options = {\n name: question.name,\n question: question,\n value: question.value,\n error: null,\n };\n this.onValidateQuestion.fire(this, options);\n return options.error ? new _error__WEBPACK_IMPORTED_MODULE_10__[\"CustomError\"](options.error, this) : null;\n };\n SurveyModel.prototype.validatePanel = function (panel) {\n if (this.onValidatePanel.isEmpty)\n return null;\n var options = {\n name: panel.name,\n panel: panel,\n error: null,\n };\n this.onValidatePanel.fire(this, options);\n return options.error ? new _error__WEBPACK_IMPORTED_MODULE_10__[\"CustomError\"](options.error, this) : null;\n };\n SurveyModel.prototype.processHtml = function (html) {\n var options = { html: html };\n this.onProcessHtml.fire(this, options);\n return this.processText(options.html, true);\n };\n SurveyModel.prototype.processText = function (text, returnDisplayValue) {\n return this.processTextEx(text, returnDisplayValue, false).text;\n };\n SurveyModel.prototype.processTextEx = function (text, returnDisplayValue, doEncoding) {\n var res = {\n text: this.processTextCore(text, returnDisplayValue, doEncoding),\n hasAllValuesOnLastRun: true,\n };\n res.hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;\n return res;\n };\n SurveyModel.prototype.processTextCore = function (text, returnDisplayValue, doEncoding) {\n if (doEncoding === void 0) { doEncoding = false; }\n if (this.isDesignMode)\n return text;\n return this.textPreProcessor.process(text, returnDisplayValue, doEncoding);\n };\n SurveyModel.prototype.getSurveyMarkdownHtml = function (element, text, name) {\n var options = {\n element: element,\n text: text,\n name: name,\n html: null,\n };\n this.onTextMarkdown.fire(this, options);\n return options.html;\n };\n /**\n * Returns an amount of corrected quiz answers.\n */\n SurveyModel.prototype.getCorrectedAnswerCount = function () {\n return this.getCorrectedAnswerCountCore(true);\n };\n /**\n * Returns quiz question number. It may be different from `getQuizQuestions.length` because some widgets like matrix may have several questions.\n * @see getQuizQuestions\n */\n SurveyModel.prototype.getQuizQuestionCount = function () {\n var questions = this.getQuizQuestions();\n var res = 0;\n for (var i = 0; i < questions.length; i++) {\n res += questions[i].quizQuestionCount;\n }\n return res;\n };\n /**\n * Returns an amount of incorrect quiz answers.\n */\n SurveyModel.prototype.getInCorrectedAnswerCount = function () {\n return this.getCorrectedAnswerCountCore(false);\n };\n SurveyModel.prototype.getCorrectedAnswerCountCore = function (isCorrect) {\n var questions = this.getQuizQuestions();\n var counter = 0;\n var options = {\n question: null,\n result: false,\n correctAnswers: 0,\n incorrectAnswers: 0,\n };\n for (var i = 0; i < questions.length; i++) {\n var q = questions[i];\n var quizQuestionCount = q.quizQuestionCount;\n options.question = q;\n options.correctAnswers = q.correctAnswerCount;\n options.incorrectAnswers = quizQuestionCount - options.correctAnswers;\n options.result = options.question.isAnswerCorrect();\n this.onIsAnswerCorrect.fire(this, options);\n if (isCorrect) {\n if (options.result || options.correctAnswers < quizQuestionCount) {\n var addCount = options.correctAnswers;\n if (addCount == 0 && options.result)\n addCount = 1;\n counter += addCount;\n }\n }\n else {\n if (!options.result || options.incorrectAnswers < quizQuestionCount) {\n counter += options.incorrectAnswers;\n }\n }\n }\n return counter;\n };\n SurveyModel.prototype.getCorrectedAnswers = function () {\n return this.getCorrectedAnswerCount();\n };\n SurveyModel.prototype.getInCorrectedAnswers = function () {\n return this.getInCorrectedAnswerCount();\n };\n Object.defineProperty(SurveyModel.prototype, \"showTimerPanel\", {\n /**\n * Gets or sets a timer panel position. The timer panel displays information about how much time an end user spends on a survey/page.\n *\n * The available options:\n * - `top` - display timer panel in the top.\n * - `bottom` - display timer panel in the bottom.\n * - `none` - do not display a timer panel.\n *\n * If the value is not equal to 'none', the survey calls the `startTimer()` method on survey rendering.\n * @see showTimerPanelMode\n * @see startTimer\n * @see stopTimer\n */\n get: function () {\n return this.getPropertyValue(\"showTimerPanel\", \"none\");\n },\n set: function (val) {\n this.setPropertyValue(\"showTimerPanel\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isTimerPanelShowingOnTop\", {\n get: function () {\n return this.isTimerStarted && this.showTimerPanel == \"top\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"isTimerPanelShowingOnBottom\", {\n get: function () {\n return this.isTimerStarted && this.showTimerPanel == \"bottom\";\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"showTimerPanelMode\", {\n /**\n * Gets or set a value that specifies whether the timer displays information for the page or for the entire survey.\n *\n * The available options:\n *\n * - `page` - show timer information for page\n * - `survey` - show timer information for survey\n *\n * Use the `onTimerPanelInfoText` event to change the default text.\n * @see showTimerPanel\n * @see onTimerPanelInfoText\n */\n get: function () {\n return this.getPropertyValue(\"showTimerPanelMode\", \"all\");\n },\n set: function (val) {\n this.setPropertyValue(\"showTimerPanelMode\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"timerInfoText\", {\n get: function () {\n var options = { text: this.getTimerInfoText() };\n this.onTimerPanelInfoText.fire(this, options);\n var loc = new _localizablestring__WEBPACK_IMPORTED_MODULE_11__[\"LocalizableString\"](this, true);\n loc.text = options.text;\n return loc.textOrHtml;\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getTimerInfoText = function () {\n var page = this.currentPage;\n if (!page)\n return \"\";\n var pageSpent = this.getDisplayTime(page.timeSpent);\n var surveySpent = this.getDisplayTime(this.timeSpent);\n var pageLimitSec = this.getPageMaxTimeToFinish(page);\n var pageLimit = this.getDisplayTime(pageLimitSec);\n var surveyLimit = this.getDisplayTime(this.maxTimeToFinish);\n if (this.showTimerPanelMode == \"page\")\n return this.getTimerInfoPageText(page, pageSpent, pageLimit);\n if (this.showTimerPanelMode == \"survey\")\n return this.getTimerInfoSurveyText(surveySpent, surveyLimit);\n if (this.showTimerPanelMode == \"all\") {\n if (pageLimitSec <= 0 && this.maxTimeToFinish <= 0) {\n return this.getLocString(\"timerSpentAll\")[\"format\"](pageSpent, surveySpent);\n }\n if (pageLimitSec > 0 && this.maxTimeToFinish > 0) {\n return this.getLocString(\"timerLimitAll\")[\"format\"](pageSpent, pageLimit, surveySpent, surveyLimit);\n }\n var pageText = this.getTimerInfoPageText(page, pageSpent, pageLimit);\n var surveyText = this.getTimerInfoSurveyText(surveySpent, surveyLimit);\n return pageText + \" \" + surveyText;\n }\n return \"\";\n };\n SurveyModel.prototype.getTimerInfoPageText = function (page, pageSpent, pageLimit) {\n return this.getPageMaxTimeToFinish(page) > 0\n ? this.getLocString(\"timerLimitPage\")[\"format\"](pageSpent, pageLimit)\n : this.getLocString(\"timerSpentPage\")[\"format\"](pageSpent, pageLimit);\n };\n SurveyModel.prototype.getTimerInfoSurveyText = function (surveySpent, surveyLimit) {\n return this.maxTimeToFinish > 0\n ? this.getLocString(\"timerLimitSurvey\")[\"format\"](surveySpent, surveyLimit)\n : this.getLocString(\"timerSpentSurvey\")[\"format\"](surveySpent, surveyLimit);\n };\n SurveyModel.prototype.getDisplayTime = function (val) {\n var min = Math.floor(val / 60);\n var sec = val % 60;\n var res = \"\";\n if (min > 0) {\n res += min + \" \" + this.getLocString(\"timerMin\");\n }\n if (res && sec == 0)\n return res;\n if (res)\n res += \" \";\n return res + sec + \" \" + this.getLocString(\"timerSec\");\n };\n /**\n * Starts a timer that will calculate how much time end-user spends on the survey or on pages.\n * @see stopTimer\n * @see timeSpent\n */\n SurveyModel.prototype.startTimer = function () {\n if (this.isTimerStarted || this.isDesignMode)\n return;\n var self = this;\n this.timerFunc = function () {\n self.doTimer();\n };\n this.isTimerStarted = true;\n _surveytimer__WEBPACK_IMPORTED_MODULE_13__[\"SurveyTimer\"].instance.start(this.timerFunc);\n };\n SurveyModel.prototype.startTimerFromUI = function () {\n if (this.showTimerPanel != \"none\" && this.state === \"running\") {\n this.startTimer();\n }\n };\n /**\n * Stops the timer.\n * @see startTimer\n * @see timeSpent\n */\n SurveyModel.prototype.stopTimer = function () {\n if (!this.isTimerStarted)\n return;\n this.isTimerStarted = false;\n _surveytimer__WEBPACK_IMPORTED_MODULE_13__[\"SurveyTimer\"].instance.stop(this.timerFunc);\n };\n Object.defineProperty(SurveyModel.prototype, \"maxTimeToFinish\", {\n /**\n * Gets or sets the maximum time in seconds that end user has to complete a survey. If the value is 0 or less, an end user has no time limit to finish a survey.\n * @see startTimer\n * @see maxTimeToFinishPage\n */\n get: function () {\n return this.getPropertyValue(\"maxTimeToFinish\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"maxTimeToFinish\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyModel.prototype, \"maxTimeToFinishPage\", {\n /**\n * Gets or sets the maximum time in seconds that end user has to complete a page in the survey. If the value is 0 or less, an end user has no time limit.\n *\n * You may override this value for every page.\n * @see startTimer\n * @see maxTimeToFinish\n * @see PageModel.maxTimeToFinish\n */\n get: function () {\n return this.getPropertyValue(\"maxTimeToFinishPage\", 0);\n },\n set: function (val) {\n this.setPropertyValue(\"maxTimeToFinishPage\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyModel.prototype.getPageMaxTimeToFinish = function (page) {\n if (!page || page.maxTimeToFinish < 0)\n return 0;\n return page.maxTimeToFinish > 0\n ? page.maxTimeToFinish\n : this.maxTimeToFinishPage;\n };\n SurveyModel.prototype.doTimer = function () {\n var page = this.currentPage;\n if (page) {\n page.timeSpent = page.timeSpent + 1;\n }\n this.timeSpent = this.timeSpent + 1;\n this.onTimer.fire(this, {});\n if (this.maxTimeToFinish > 0 && this.maxTimeToFinish == this.timeSpent) {\n this.completeLastPage();\n }\n if (page) {\n var pageLimit = this.getPageMaxTimeToFinish(page);\n if (pageLimit > 0 && pageLimit == page.timeSpent) {\n if (this.isLastPage) {\n this.completeLastPage();\n }\n else {\n this.nextPage();\n }\n }\n }\n };\n Object.defineProperty(SurveyModel.prototype, \"inSurvey\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n //ISurveyImplementor\n SurveyModel.prototype.getSurveyData = function () {\n return this;\n };\n SurveyModel.prototype.getSurvey = function () {\n return this;\n };\n SurveyModel.prototype.getTextProcessor = function () {\n return this;\n };\n //ISurveyTriggerOwner\n SurveyModel.prototype.getObjects = function (pages, questions) {\n var result = [];\n Array.prototype.push.apply(result, this.getPagesByNames(pages));\n Array.prototype.push.apply(result, this.getQuestionsByNames(questions));\n return result;\n };\n SurveyModel.prototype.setTriggerValue = function (name, value, isVariable) {\n if (!name)\n return;\n if (isVariable) {\n this.setVariable(name, value);\n }\n else {\n var question = this.getQuestionByName(name);\n if (!!question) {\n question.value = value;\n }\n else {\n var processor = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_7__[\"ProcessValue\"]();\n var firstName = processor.getFirstName(name);\n if (firstName == name) {\n this.setValue(name, value);\n }\n else {\n if (!this.getQuestionByName(firstName))\n return;\n var data = this.getUnbindValue(this.getFilteredValues());\n processor.setValue(data, name, value);\n this.setValue(firstName, data[firstName]);\n }\n }\n }\n };\n SurveyModel.prototype.copyTriggerValue = function (name, fromName) {\n if (!name || !fromName)\n return;\n var processor = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_7__[\"ProcessValue\"]();\n var value = processor.getValue(fromName, this.getFilteredValues());\n this.setTriggerValue(name, value, false);\n };\n SurveyModel.prototype.focusQuestion = function (name) {\n var question = this.getQuestionByName(name, true);\n if (!question || !question.isVisible || !question.page)\n return false;\n this.isFocusingQuestion = true;\n this.currentPage = question.page;\n question.focus();\n this.isFocusingQuestion = false;\n return true;\n };\n SurveyModel.prototype.getElementWrapperComponentName = function (element, reason) {\n if (reason === \"logo-image\") {\n return \"sv-logo-image\";\n }\n return SurveyModel.TemplateRendererComponentName;\n };\n SurveyModel.prototype.getRowWrapperComponentName = function (row) {\n return SurveyModel.TemplateRendererComponentName;\n };\n SurveyModel.prototype.getElementWrapperComponentData = function (element, reason) {\n return element;\n };\n SurveyModel.prototype.getRowWrapperComponentData = function (row) {\n return row;\n };\n SurveyModel.prototype.getItemValueWrapperComponentName = function (item, question) {\n return SurveyModel.TemplateRendererComponentName;\n };\n SurveyModel.prototype.getItemValueWrapperComponentData = function (item, question) {\n return item;\n };\n SurveyModel.prototype.getMatrixCellTemplateData = function (cell) {\n return cell.question;\n };\n SurveyModel.prototype.searchText = function (text) {\n if (!!text)\n text = text.toLowerCase();\n var res = [];\n for (var i = 0; i < this.pages.length; i++) {\n this.pages[i].searchText(text, res);\n }\n return res;\n };\n /**\n * Use this method to dispose survey model properly.\n */\n SurveyModel.prototype.dispose = function () {\n _super.prototype.dispose.call(this);\n this.editingObj = null;\n if (!this.pages)\n return;\n for (var i = 0; i < this.pages.length; i++) {\n this.pages[i].dispose();\n }\n this.pages.splice(0, this.pages.length);\n this.currentPage = null;\n };\n SurveyModel.TemplateRendererComponentName = \"sv-template-renderer\";\n SurveyModel.stylesManager = null;\n SurveyModel.platform = \"unknown\";\n return SurveyModel;\n}(_base__WEBPACK_IMPORTED_MODULE_2__[\"Base\"]));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_1__[\"Serializer\"].addClass(\"survey\", [\n {\n name: \"locale\",\n choices: function () {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_9__[\"surveyLocalization\"].getLocales(true);\n },\n onGetValue: function (obj) {\n return obj.locale == _surveyStrings__WEBPACK_IMPORTED_MODULE_9__[\"surveyLocalization\"].defaultLocale ? null : obj.locale;\n },\n },\n { name: \"title\", serializationProperty: \"locTitle\", dependsOn: \"locale\" },\n {\n name: \"description:text\",\n serializationProperty: \"locDescription\",\n dependsOn: \"locale\",\n },\n { name: \"logo\", serializationProperty: \"locLogo\" },\n { name: \"logoWidth\", default: \"300px\", minValue: 0 },\n { name: \"logoHeight\", default: \"200px\", minValue: 0 },\n {\n name: \"logoFit\",\n default: \"contain\",\n choices: [\"none\", \"contain\", \"cover\", \"fill\"],\n },\n {\n name: \"logoPosition\",\n default: \"left\",\n choices: [\"none\", \"left\", \"right\", \"top\", \"bottom\"],\n },\n { name: \"focusFirstQuestionAutomatic:boolean\", default: true },\n { name: \"focusOnFirstError:boolean\", default: true },\n { name: \"completedHtml:html\", serializationProperty: \"locCompletedHtml\" },\n {\n name: \"completedBeforeHtml:html\",\n serializationProperty: \"locCompletedBeforeHtml\",\n },\n {\n name: \"completedHtmlOnCondition:htmlconditions\",\n className: \"htmlconditionitem\",\n },\n { name: \"loadingHtml:html\", serializationProperty: \"locLoadingHtml\" },\n { name: \"pages:surveypages\", className: \"page\" },\n {\n name: \"questions\",\n alternativeName: \"elements\",\n baseClassName: \"question\",\n visible: false,\n isLightSerializable: false,\n onGetValue: function (obj) {\n return null;\n },\n onSetValue: function (obj, value, jsonConverter) {\n var page = obj.addNewPage(\"\");\n jsonConverter.toObject({ questions: value }, page);\n },\n },\n {\n name: \"triggers:triggers\",\n baseClassName: \"surveytrigger\",\n classNamePart: \"trigger\",\n },\n {\n name: \"calculatedValues:calculatedvalues\",\n className: \"calculatedvalue\",\n },\n { name: \"surveyId\", visible: false },\n { name: \"surveyPostId\", visible: false },\n { name: \"surveyShowDataSaving:boolean\", visible: false },\n \"cookieName\",\n \"sendResultOnPageNext:boolean\",\n {\n name: \"showNavigationButtons\",\n default: \"bottom\",\n choices: [\"none\", \"top\", \"bottom\", \"both\"],\n },\n { name: \"showPrevButton:boolean\", default: true },\n { name: \"showTitle:boolean\", default: true },\n { name: \"showPageTitles:boolean\", default: true },\n { name: \"showCompletedPage:boolean\", default: true },\n \"navigateToUrl\",\n {\n name: \"navigateToUrlOnCondition:urlconditions\",\n className: \"urlconditionitem\",\n },\n {\n name: \"questionsOrder\",\n default: \"initial\",\n choices: [\"initial\", \"random\"],\n },\n \"showPageNumbers:boolean\",\n {\n name: \"showQuestionNumbers\",\n default: \"on\",\n choices: [\"on\", \"onPage\", \"off\"],\n },\n {\n name: \"questionTitleLocation\",\n default: \"top\",\n choices: [\"top\", \"bottom\", \"left\"],\n },\n {\n name: \"questionDescriptionLocation\",\n default: \"underTitle\",\n choices: [\"underInput\", \"underTitle\"],\n },\n { name: \"questionErrorLocation\", default: \"top\", choices: [\"top\", \"bottom\"] },\n {\n name: \"showProgressBar\",\n default: \"off\",\n choices: [\"off\", \"top\", \"bottom\", \"both\"],\n },\n {\n name: \"progressBarType\",\n default: \"pages\",\n choices: [\n \"pages\",\n \"questions\",\n \"requiredQuestions\",\n \"correctQuestions\",\n \"buttons\",\n ],\n },\n { name: \"mode\", default: \"edit\", choices: [\"edit\", \"display\"] },\n { name: \"storeOthersAsComment:boolean\", default: true },\n { name: \"maxTextLength:number\", default: 0, minValue: 0 },\n { name: \"maxOthersLength:number\", default: 0, minValue: 0 },\n \"goNextPageAutomatic:boolean\",\n {\n name: \"clearInvisibleValues\",\n default: \"onComplete\",\n choices: [\"none\", \"onComplete\", \"onHidden\", \"onHiddenContainer\"],\n },\n {\n name: \"checkErrorsMode\",\n default: \"onNextPage\",\n choices: [\"onNextPage\", \"onValueChanged\", \"onValueChanging\", \"onComplete\"],\n },\n {\n name: \"textUpdateMode\",\n default: \"onBlur\",\n choices: [\"onBlur\", \"onTyping\"],\n },\n { name: \"startSurveyText\", serializationProperty: \"locStartSurveyText\" },\n { name: \"pagePrevText\", serializationProperty: \"locPagePrevText\" },\n { name: \"pageNextText\", serializationProperty: \"locPageNextText\" },\n { name: \"completeText\", serializationProperty: \"locCompleteText\" },\n { name: \"previewText\", serializationProperty: \"locPreviewText\" },\n { name: \"editText\", serializationProperty: \"locEditText\" },\n { name: \"requiredText\", default: \"*\" },\n {\n name: \"questionStartIndex\",\n dependsOn: [\"showQuestionNumbers\"],\n visibleIf: function (survey) {\n return !survey || survey.showQuestionNumbers !== \"off\";\n },\n },\n {\n name: \"questionTitlePattern\",\n default: \"numTitleRequire\",\n dependsOn: [\"questionStartIndex\", \"requiredText\"],\n choices: function (obj) {\n if (!obj)\n return [];\n return obj.getQuestionTitlePatternOptions();\n },\n },\n {\n name: \"questionTitleTemplate\",\n visible: false,\n isSerializable: false,\n serializationProperty: \"locQuestionTitleTemplate\",\n },\n { name: \"firstPageIsStarted:boolean\", default: false },\n {\n name: \"isSinglePage:boolean\",\n default: false,\n visible: false,\n isSerializable: false,\n },\n {\n name: \"questionsOnPageMode\",\n default: \"standard\",\n choices: [\"singlePage\", \"standard\", \"questionPerPage\"],\n },\n {\n name: \"showPreviewBeforeComplete\",\n default: \"noPreview\",\n choices: [\"noPreview\", \"showAllQuestions\", \"showAnsweredQuestions\"],\n },\n { name: \"maxTimeToFinish:number\", default: 0, minValue: 0 },\n { name: \"maxTimeToFinishPage:number\", default: 0, minValue: 0 },\n {\n name: \"showTimerPanel\",\n default: \"none\",\n choices: [\"none\", \"top\", \"bottom\"],\n },\n {\n name: \"showTimerPanelMode\",\n default: \"all\",\n choices: [\"all\", \"page\", \"survey\"],\n },\n]);\n\n\n/***/ }),\n\n/***/ \"./src/surveyProgressButtons.ts\":\n/*!**************************************!*\\\n !*** ./src/surveyProgressButtons.ts ***!\n \\**************************************/\n/*! exports provided: SurveyProgressButtonsModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyProgressButtonsModel\", function() { return SurveyProgressButtonsModel; });\nvar SurveyProgressButtonsModel = /** @class */ (function () {\n function SurveyProgressButtonsModel(survey) {\n this.survey = survey;\n }\n SurveyProgressButtonsModel.prototype.isListElementClickable = function (index) {\n if (!this.survey.onServerValidateQuestions ||\n this.survey.onServerValidateQuestions.isEmpty ||\n this.survey.checkErrorsMode === \"onComplete\") {\n return true;\n }\n return index <= this.survey.currentPageNo + 1;\n };\n SurveyProgressButtonsModel.prototype.getListElementCss = function (index) {\n if (index >= this.survey.visiblePages.length)\n return;\n var elementCss = this.survey.visiblePages[index].passed ?\n this.survey.css.progressButtonsListElementPassed : \"\";\n if (this.survey.currentPageNo === index) {\n elementCss += elementCss !== \"\" ? \" \" : \"\";\n elementCss += this.survey.css.progressButtonsListElementCurrent;\n }\n if (!this.isListElementClickable(index)) {\n elementCss += elementCss !== \"\" ? \" \" : \"\";\n elementCss += this.survey.css.progressButtonsListElementNonClickable;\n }\n return elementCss;\n };\n SurveyProgressButtonsModel.prototype.clickListElement = function (index) {\n if (this.survey.isDesignMode)\n return;\n if (index < this.survey.currentPageNo) {\n this.survey.currentPageNo = index;\n }\n else if (index > this.survey.currentPageNo) {\n for (var i = this.survey.currentPageNo; i < index; i++) {\n if (!this.survey.nextPage())\n break;\n }\n }\n };\n return SurveyProgressButtonsModel;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/surveyStrings.ts\":\n/*!******************************!*\\\n !*** ./src/surveyStrings.ts ***!\n \\******************************/\n/*! exports provided: surveyLocalization, surveyStrings */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"surveyLocalization\", function() { return surveyLocalization; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"surveyStrings\", function() { return surveyStrings; });\n/* harmony import */ var _localization_english__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localization/english */ \"./src/localization/english.ts\");\n\nvar surveyLocalization = {\n currentLocaleValue: \"\",\n defaultLocaleValue: \"en\",\n locales: {},\n localeNames: {},\n supportedLocales: [],\n get currentLocale() {\n return this.currentLocaleValue === this.defaultLocaleValue\n ? \"\"\n : this.currentLocaleValue;\n },\n set currentLocale(val) {\n if (val === \"cz\")\n val = \"cs\";\n this.currentLocaleValue = val;\n },\n get defaultLocale() {\n return this.defaultLocaleValue;\n },\n set defaultLocale(val) {\n if (val === \"cz\")\n val = \"cs\";\n this.defaultLocaleValue = val;\n },\n getLocaleStrings: function (loc) {\n return this.locales[loc];\n },\n getCurrentStrings: function () {\n var loc = this.currentLocale\n ? this.locales[this.currentLocale]\n : this.locales[this.defaultLocale];\n if (!loc)\n loc = this.locales[this.defaultLocale];\n return loc;\n },\n getString: function (strName) {\n var loc = this.getCurrentStrings();\n if (!loc[strName])\n loc = this.locales[this.defaultLocale];\n var result = loc[strName];\n if (result === undefined) {\n result = this.locales[\"en\"][strName];\n }\n return result;\n },\n getLocales: function (removeDefaultLoc) {\n if (removeDefaultLoc === void 0) { removeDefaultLoc = false; }\n var res = [];\n res.push(\"\");\n var locs = this.locales;\n if (this.supportedLocales && this.supportedLocales.length > 0) {\n locs = {};\n for (var i = 0; i < this.supportedLocales.length; i++) {\n locs[this.supportedLocales[i]] = true;\n }\n }\n for (var key in locs) {\n if (removeDefaultLoc && key == this.defaultLocale)\n continue;\n res.push(key);\n }\n var locName = function (loc) {\n if (!loc)\n return \"\";\n var res = surveyLocalization.localeNames[loc];\n if (!res)\n res = loc;\n return res.toLowerCase();\n };\n res.sort(function (a, b) {\n var str1 = locName(a);\n var str2 = locName(b);\n if (str1 === str2)\n return 0;\n return str1 < str2 ? -1 : 1;\n });\n return res;\n },\n};\nvar surveyStrings = _localization_english__WEBPACK_IMPORTED_MODULE_0__[\"englishStrings\"];\nsurveyLocalization.locales[\"en\"] = _localization_english__WEBPACK_IMPORTED_MODULE_0__[\"englishStrings\"];\nsurveyLocalization.localeNames[\"en\"] = \"english\";\n\n\n/***/ }),\n\n/***/ \"./src/surveyWindow.ts\":\n/*!*****************************!*\\\n !*** ./src/surveyWindow.ts ***!\n \\*****************************/\n/*! exports provided: SurveyWindowModel */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyWindowModel\", function() { return SurveyWindowModel; });\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _survey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./survey */ \"./src/survey.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n/**\n * A Model for a survey running in the Window.\n */\nvar SurveyWindowModel = /** @class */ (function (_super) {\n __extends(SurveyWindowModel, _super);\n function SurveyWindowModel(jsonObj, initialModel) {\n if (initialModel === void 0) { initialModel = null; }\n var _this = _super.call(this) || this;\n /**\n * Set this value to negative value, for example -1, to avoid closing the window on completing the survey. Leave it equals to 0 (default value) to close the window immediately, or set it to 3, 5, 10, ... to close the window in 3, 5, 10 seconds.\n */\n _this.closeOnCompleteTimeout = 0;\n if (initialModel) {\n _this.surveyValue = initialModel;\n }\n else {\n _this.surveyValue = _this.createSurvey(jsonObj);\n }\n _this.surveyValue.showTitle = false;\n if (\"undefined\" !== typeof document) {\n _this.windowElement = document.createElement(\"div\");\n }\n var self = _this;\n _this.survey.onComplete.add(function (survey, options) {\n self.onSurveyComplete();\n });\n return _this;\n }\n SurveyWindowModel.prototype.getType = function () {\n return \"window\";\n };\n Object.defineProperty(SurveyWindowModel.prototype, \"survey\", {\n /**\n * A survey object.\n * @see SurveyModel\n */\n get: function () {\n return this.surveyValue;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyWindowModel.prototype, \"isShowing\", {\n /**\n * Returns true if the window is currently showing. Set it to true to show the window and false to hide it.\n * @see show\n * @see hide\n */\n get: function () {\n return this.getPropertyValue(\"isShowing\", false);\n },\n set: function (val) {\n if (this.isShowing == val)\n return;\n this.setPropertyValue(\"isShowing\", val);\n if (this.showingChangedCallback)\n this.showingChangedCallback();\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Show the window\n * @see hide\n * @see isShowing\n */\n SurveyWindowModel.prototype.show = function () {\n this.isShowing = true;\n };\n /**\n * Hide the window\n * @see show\n * @see isShowing\n */\n SurveyWindowModel.prototype.hide = function () {\n this.isShowing = false;\n };\n Object.defineProperty(SurveyWindowModel.prototype, \"isExpanded\", {\n /**\n * Returns true if the window is expanded. Set it to true to expand the window or false to collapse it.\n * @see expand\n * @see collapse\n */\n get: function () {\n return this.getPropertyValue(\"isExpanded\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"isExpanded\", val);\n if (!this.isLoadingFromJson && this.expandedChangedCallback)\n this.expandedChangedCallback();\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyWindowModel.prototype, \"title\", {\n /**\n * The window and survey title.\n */\n get: function () {\n return this.survey.title;\n },\n set: function (value) {\n this.survey.title = value;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyWindowModel.prototype, \"locTitle\", {\n get: function () {\n return this.survey.locTitle;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Expand the window to show the survey.\n */\n SurveyWindowModel.prototype.expand = function () {\n this.expandcollapse(true);\n };\n /**\n * Collapse the window and show survey title only.\n */\n SurveyWindowModel.prototype.collapse = function () {\n this.expandcollapse(false);\n };\n SurveyWindowModel.prototype.createSurvey = function (jsonObj) {\n return new _survey__WEBPACK_IMPORTED_MODULE_1__[\"SurveyModel\"](jsonObj);\n };\n SurveyWindowModel.prototype.expandcollapse = function (value) {\n this.isExpanded = value;\n };\n SurveyWindowModel.prototype.onSurveyComplete = function () {\n if (this.closeOnCompleteTimeout < 0)\n return;\n if (this.closeOnCompleteTimeout == 0) {\n this.closeWindowOnComplete();\n }\n else {\n var self = this;\n var timerId = null;\n var func = function () {\n self.closeWindowOnComplete();\n if (typeof window !== \"undefined\") {\n window.clearInterval(timerId);\n }\n };\n timerId =\n typeof window !== \"undefined\"\n ? window.setInterval(func, this.closeOnCompleteTimeout * 1000)\n : 0;\n }\n };\n SurveyWindowModel.prototype.closeWindowOnComplete = function () {\n if (!!this.closeWindowOnCompleteCallback) {\n this.closeWindowOnCompleteCallback();\n }\n };\n SurveyWindowModel.surveyElementName = \"windowSurveyJS\";\n return SurveyWindowModel;\n}(_base__WEBPACK_IMPORTED_MODULE_0__[\"Base\"]));\n\n\n\n/***/ }),\n\n/***/ \"./src/surveytimer.ts\":\n/*!****************************!*\\\n !*** ./src/surveytimer.ts ***!\n \\****************************/\n/*! exports provided: surveyTimerFunctions, SurveyTimer */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"surveyTimerFunctions\", function() { return surveyTimerFunctions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyTimer\", function() { return SurveyTimer; });\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n\nvar surveyTimerFunctions = {\n setTimeout: function (func) {\n if (typeof window === \"undefined\")\n return 0;\n return window.setTimeout(func, 1000);\n },\n clearTimeout: function (timerId) {\n if (typeof window === \"undefined\")\n return;\n window.clearTimeout(timerId);\n },\n};\nvar SurveyTimer = /** @class */ (function () {\n function SurveyTimer() {\n this.listenerCounter = 0;\n this.timerId = -1;\n this.onTimer = new _base__WEBPACK_IMPORTED_MODULE_0__[\"Event\"]();\n }\n Object.defineProperty(SurveyTimer, \"instance\", {\n get: function () {\n if (!SurveyTimer.instanceValue) {\n SurveyTimer.instanceValue = new SurveyTimer();\n }\n return SurveyTimer.instanceValue;\n },\n enumerable: false,\n configurable: true\n });\n SurveyTimer.prototype.start = function (func) {\n var _this = this;\n if (func === void 0) { func = null; }\n if (func) {\n this.onTimer.add(func);\n }\n if (this.timerId < 0) {\n this.timerId = surveyTimerFunctions.setTimeout(function () {\n _this.doTimer();\n });\n }\n this.listenerCounter++;\n };\n SurveyTimer.prototype.stop = function (func) {\n if (func === void 0) { func = null; }\n if (func) {\n this.onTimer.remove(func);\n }\n this.listenerCounter--;\n if (this.listenerCounter == 0 && this.timerId > -1) {\n surveyTimerFunctions.clearTimeout(this.timerId);\n this.timerId = -1;\n }\n };\n SurveyTimer.prototype.doTimer = function () {\n var _this = this;\n if (this.timerId < 0)\n return;\n this.onTimer.fire(this, {});\n this.timerId = surveyTimerFunctions.setTimeout(function () {\n _this.doTimer();\n });\n };\n SurveyTimer.instanceValue = null;\n return SurveyTimer;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/template-renderer.ts\":\n/*!**********************************!*\\\n !*** ./src/template-renderer.ts ***!\n \\**********************************/\n/*! no exports provided */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n\n\n\n/***/ }),\n\n/***/ \"./src/textPreProcessor.ts\":\n/*!*********************************!*\\\n !*** ./src/textPreProcessor.ts ***!\n \\*********************************/\n/*! exports provided: TextPreProcessorItem, TextPreProcessorValue, TextPreProcessor, QuestionTextProcessor */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"TextPreProcessorItem\", function() { return TextPreProcessorItem; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"TextPreProcessorValue\", function() { return TextPreProcessorValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"TextPreProcessor\", function() { return TextPreProcessor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"QuestionTextProcessor\", function() { return QuestionTextProcessor; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _conditionProcessValue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./conditionProcessValue */ \"./src/conditionProcessValue.ts\");\n\n\nvar TextPreProcessorItem = /** @class */ (function () {\n function TextPreProcessorItem() {\n }\n return TextPreProcessorItem;\n}());\n\nvar TextPreProcessorValue = /** @class */ (function () {\n function TextPreProcessorValue(name, returnDisplayValue) {\n this.name = name;\n this.returnDisplayValue = returnDisplayValue;\n this.isExists = false;\n this.canProcess = true;\n }\n return TextPreProcessorValue;\n}());\n\nvar TextPreProcessor = /** @class */ (function () {\n function TextPreProcessor() {\n }\n TextPreProcessor.prototype.process = function (text, returnDisplayValue, doEncoding) {\n if (returnDisplayValue === void 0) { returnDisplayValue = false; }\n if (doEncoding === void 0) { doEncoding = false; }\n this.hasAllValuesOnLastRunValue = true;\n if (!text)\n return text;\n if (!this.onProcess)\n return text;\n var items = this.getItems(text);\n for (var i = items.length - 1; i >= 0; i--) {\n var item = items[i];\n var name = this.getName(text.substring(item.start + 1, item.end));\n if (!name)\n continue;\n var textValue = new TextPreProcessorValue(name, returnDisplayValue);\n this.onProcess(textValue);\n if (!textValue.isExists) {\n if (textValue.canProcess) {\n this.hasAllValuesOnLastRunValue = false;\n }\n continue;\n }\n if (_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(textValue.value)) {\n this.hasAllValuesOnLastRunValue = false;\n }\n var replacedValue = !_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isValueEmpty(textValue.value)\n ? textValue.value\n : \"\";\n if (doEncoding) {\n replacedValue = encodeURIComponent(replacedValue);\n }\n text =\n text.substr(0, item.start) + replacedValue + text.substr(item.end + 1);\n }\n return text;\n };\n TextPreProcessor.prototype.processValue = function (name, returnDisplayValue) {\n var textValue = new TextPreProcessorValue(name, returnDisplayValue);\n if (!!this.onProcess) {\n this.onProcess(textValue);\n }\n return textValue;\n };\n Object.defineProperty(TextPreProcessor.prototype, \"hasAllValuesOnLastRun\", {\n get: function () {\n return !!this.hasAllValuesOnLastRunValue;\n },\n enumerable: false,\n configurable: true\n });\n TextPreProcessor.prototype.getItems = function (text) {\n var items = [];\n var length = text.length;\n var start = -1;\n var ch = \"\";\n for (var i = 0; i < length; i++) {\n ch = text[i];\n if (ch == \"{\")\n start = i;\n if (ch == \"}\") {\n if (start > -1) {\n var item = new TextPreProcessorItem();\n item.start = start;\n item.end = i;\n items.push(item);\n }\n start = -1;\n }\n }\n return items;\n };\n TextPreProcessor.prototype.getName = function (name) {\n if (!name)\n return;\n return name.trim();\n };\n return TextPreProcessor;\n}());\n\nvar QuestionTextProcessor = /** @class */ (function () {\n function QuestionTextProcessor(variableName) {\n var _this = this;\n this.variableName = variableName;\n this.textPreProcessor = new TextPreProcessor();\n this.textPreProcessor.onProcess = function (textValue) {\n _this.getProcessedTextValue(textValue);\n };\n }\n QuestionTextProcessor.prototype.processValue = function (name, returnDisplayValue) {\n return this.textPreProcessor.processValue(name, returnDisplayValue);\n };\n Object.defineProperty(QuestionTextProcessor.prototype, \"survey\", {\n get: function () {\n return null;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(QuestionTextProcessor.prototype, \"panel\", {\n get: function () {\n return null;\n },\n enumerable: false,\n configurable: true\n });\n QuestionTextProcessor.prototype.getValues = function () {\n return !!this.panel ? this.panel.getValue() : null;\n };\n QuestionTextProcessor.prototype.getQuestionByName = function (name) {\n return !!this.panel\n ? this.panel.getQuestionByValueName(name)\n : null;\n };\n QuestionTextProcessor.prototype.onCustomProcessText = function (textValue) {\n return false;\n };\n //ITextProcessor\n QuestionTextProcessor.prototype.getProcessedTextValue = function (textValue) {\n if (!textValue)\n return;\n if (this.onCustomProcessText(textValue))\n return;\n var firstName = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_1__[\"ProcessValue\"]().getFirstName(textValue.name);\n textValue.isExists = firstName == this.variableName;\n textValue.canProcess = textValue.isExists;\n if (!textValue.canProcess)\n return;\n //name should start with the variable name\n textValue.name = textValue.name.replace(this.variableName + \".\", \"\");\n var firstName = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_1__[\"ProcessValue\"]().getFirstName(textValue.name);\n var question = this.getQuestionByName(firstName);\n var values = {};\n if (question) {\n values[firstName] = textValue.returnDisplayValue\n ? question.displayValue\n : question.value;\n }\n else {\n var allValues = !!this.panel ? this.getValues() : null;\n if (allValues) {\n values[firstName] = allValues[firstName];\n }\n }\n textValue.value = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_1__[\"ProcessValue\"]().getValue(textValue.name, values);\n };\n QuestionTextProcessor.prototype.processText = function (text, returnDisplayValue) {\n text = this.textPreProcessor.process(text, returnDisplayValue);\n var survey = this.survey;\n return survey ? survey.processText(text, returnDisplayValue) : text;\n };\n QuestionTextProcessor.prototype.processTextEx = function (text, returnDisplayValue) {\n text = this.processText(text, returnDisplayValue);\n var hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;\n var res = { hasAllValuesOnLastRun: true, text: text };\n if (this.survey) {\n res = this.survey.processTextEx(text, returnDisplayValue, false);\n }\n res.hasAllValuesOnLastRun =\n res.hasAllValuesOnLastRun && hasAllValuesOnLastRun;\n return res;\n };\n return QuestionTextProcessor;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/trigger.ts\":\n/*!************************!*\\\n !*** ./src/trigger.ts ***!\n \\************************/\n/*! exports provided: Trigger, SurveyTrigger, SurveyTriggerVisible, SurveyTriggerComplete, SurveyTriggerSetValue, SurveyTriggerSkip, SurveyTriggerRunExpression, SurveyTriggerCopyValue */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Trigger\", function() { return Trigger; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyTrigger\", function() { return SurveyTrigger; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerVisible\", function() { return SurveyTriggerVisible; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerComplete\", function() { return SurveyTriggerComplete; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerSetValue\", function() { return SurveyTriggerSetValue; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerSkip\", function() { return SurveyTriggerSkip; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerRunExpression\", function() { return SurveyTriggerRunExpression; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyTriggerCopyValue\", function() { return SurveyTriggerCopyValue; });\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./conditions */ \"./src/conditions.ts\");\n/* harmony import */ var _expressions_expressions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./expressions/expressions */ \"./src/expressions/expressions.ts\");\n/* harmony import */ var _conditionProcessValue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./conditionProcessValue */ \"./src/conditionProcessValue.ts\");\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./settings */ \"./src/settings.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\n/**\n * A base class for all triggers.\n * A trigger calls a method when the expression change the result: from false to true or from true to false.\n * Please note, it runs only one changing the expression result.\n */\nvar Trigger = /** @class */ (function (_super) {\n __extends(Trigger, _super);\n function Trigger() {\n var _this = _super.call(this) || this;\n _this.usedNames = [];\n var self = _this;\n _this.registerFunctionOnPropertiesValueChanged([\"operator\", \"value\", \"name\"], function () {\n self.oldPropertiesChanged();\n });\n _this.registerFunctionOnPropertyValueChanged(\"expression\", function () {\n self.onExpressionChanged();\n });\n return _this;\n }\n Object.defineProperty(Trigger, \"operators\", {\n get: function () {\n if (Trigger.operatorsValue != null)\n return Trigger.operatorsValue;\n Trigger.operatorsValue = {\n empty: function (value, expectedValue) {\n return !value;\n },\n notempty: function (value, expectedValue) {\n return !!value;\n },\n equal: function (value, expectedValue) {\n return value == expectedValue;\n },\n notequal: function (value, expectedValue) {\n return value != expectedValue;\n },\n contains: function (value, expectedValue) {\n return value && value[\"indexOf\"] && value.indexOf(expectedValue) > -1;\n },\n notcontains: function (value, expectedValue) {\n return (!value || !value[\"indexOf\"] || value.indexOf(expectedValue) == -1);\n },\n greater: function (value, expectedValue) {\n return value > expectedValue;\n },\n less: function (value, expectedValue) {\n return value < expectedValue;\n },\n greaterorequal: function (value, expectedValue) {\n return value >= expectedValue;\n },\n lessorequal: function (value, expectedValue) {\n return value <= expectedValue;\n },\n };\n return Trigger.operatorsValue;\n },\n enumerable: false,\n configurable: true\n });\n Trigger.prototype.getType = function () {\n return \"triggerbase\";\n };\n Trigger.prototype.toString = function () {\n var res = this.getType().replace(\"trigger\", \"\");\n var exp = !!this.expression ? this.expression : this.buildExpression();\n if (exp) {\n res += \", \" + exp;\n }\n return res;\n };\n Object.defineProperty(Trigger.prototype, \"operator\", {\n get: function () {\n return this.getPropertyValue(\"operator\", \"equal\");\n },\n set: function (value) {\n if (!value)\n return;\n value = value.toLowerCase();\n if (!Trigger.operators[value])\n return;\n this.setPropertyValue(\"operator\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Trigger.prototype, \"value\", {\n get: function () {\n return this.getPropertyValue(\"value\", null);\n },\n set: function (val) {\n this.setPropertyValue(\"value\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Trigger.prototype, \"name\", {\n get: function () {\n return this.getPropertyValue(\"name\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"name\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Trigger.prototype, \"expression\", {\n get: function () {\n return this.getPropertyValue(\"expression\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"expression\", val);\n },\n enumerable: false,\n configurable: true\n });\n Trigger.prototype.checkExpression = function (keys, values, properties) {\n if (properties === void 0) { properties = null; }\n if (!this.isCheckRequired(keys))\n return;\n if (!!this.conditionRunner) {\n this.perform(values, properties);\n }\n };\n Trigger.prototype.check = function (value) {\n var triggerResult = Trigger.operators[this.operator](value, this.value);\n if (triggerResult) {\n this.onSuccess({}, null);\n }\n else {\n this.onFailure();\n }\n };\n Trigger.prototype.perform = function (values, properties) {\n var _this = this;\n this.conditionRunner.onRunComplete = function (res) {\n _this.triggerResult(res, values, properties);\n };\n this.conditionRunner.run(values, properties);\n };\n Trigger.prototype.triggerResult = function (res, values, properties) {\n if (res) {\n this.onSuccess(values, properties);\n }\n else {\n this.onFailure();\n }\n };\n Trigger.prototype.onSuccess = function (values, properties) { };\n Trigger.prototype.onFailure = function () { };\n Trigger.prototype.endLoadingFromJson = function () {\n _super.prototype.endLoadingFromJson.call(this);\n this.oldPropertiesChanged();\n };\n Trigger.prototype.oldPropertiesChanged = function () {\n this.onExpressionChanged();\n };\n Trigger.prototype.onExpressionChanged = function () {\n this.usedNames = [];\n this.hasFunction = false;\n this.conditionRunner = null;\n };\n Trigger.prototype.buildExpression = function () {\n if (!this.name)\n return \"\";\n if (this.isValueEmpty(this.value) && this.isRequireValue)\n return \"\";\n return (\"{\" +\n this.name +\n \"} \" +\n this.operator +\n \" \" +\n _expressions_expressions__WEBPACK_IMPORTED_MODULE_4__[\"OperandMaker\"].toOperandString(this.value));\n };\n Trigger.prototype.isCheckRequired = function (keys) {\n if (!keys)\n return false;\n this.buildUsedNames();\n if (this.hasFunction === true)\n return true;\n var processValue = new _conditionProcessValue__WEBPACK_IMPORTED_MODULE_5__[\"ProcessValue\"]();\n for (var i = 0; i < this.usedNames.length; i++) {\n var name = this.usedNames[i];\n if (keys.hasOwnProperty(name))\n return true;\n var firstName = processValue.getFirstName(name);\n if (!keys.hasOwnProperty(firstName))\n continue;\n if (name == firstName)\n return true;\n var keyValue = keys[firstName];\n if (keyValue == undefined)\n continue;\n if (!keyValue.hasOwnProperty(\"oldValue\") ||\n !keyValue.hasOwnProperty(\"newValue\"))\n return true;\n var v = {};\n v[firstName] = keyValue[\"oldValue\"];\n var oldValue = processValue.getValue(name, v);\n v[firstName] = keyValue[\"newValue\"];\n var newValue = processValue.getValue(name, v);\n return !_helpers__WEBPACK_IMPORTED_MODULE_0__[\"Helpers\"].isTwoValueEquals(oldValue, newValue);\n }\n return false;\n };\n Trigger.prototype.buildUsedNames = function () {\n if (!!this.conditionRunner)\n return;\n var expression = this.expression;\n if (!expression) {\n expression = this.buildExpression();\n }\n if (!expression)\n return;\n this.conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_3__[\"ConditionRunner\"](expression);\n this.hasFunction = this.conditionRunner.hasFunction();\n this.usedNames = this.conditionRunner.getVariables();\n };\n Object.defineProperty(Trigger.prototype, \"isRequireValue\", {\n get: function () {\n return this.operator !== \"empty\" && this.operator != \"notempty\";\n },\n enumerable: false,\n configurable: true\n });\n Trigger.operatorsValue = null;\n return Trigger;\n}(_base__WEBPACK_IMPORTED_MODULE_1__[\"Base\"]));\n\n/**\n * It extends the Trigger base class and add properties required for SurveyJS classes.\n */\nvar SurveyTrigger = /** @class */ (function (_super) {\n __extends(SurveyTrigger, _super);\n function SurveyTrigger() {\n var _this = _super.call(this) || this;\n _this.ownerValue = null;\n return _this;\n }\n Object.defineProperty(SurveyTrigger.prototype, \"owner\", {\n get: function () {\n return this.ownerValue;\n },\n enumerable: false,\n configurable: true\n });\n SurveyTrigger.prototype.setOwner = function (owner) {\n this.ownerValue = owner;\n };\n SurveyTrigger.prototype.getSurvey = function (live) {\n if (live === void 0) { live = false; }\n return !!this.owner && !!this.owner[\"getSurvey\"]\n ? this.owner.getSurvey()\n : null;\n };\n Object.defineProperty(SurveyTrigger.prototype, \"isOnNextPage\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n return SurveyTrigger;\n}(Trigger));\n\n/**\n * If expression returns true, it makes questions/pages visible.\n * Ohterwise it makes them invisible.\n */\nvar SurveyTriggerVisible = /** @class */ (function (_super) {\n __extends(SurveyTriggerVisible, _super);\n function SurveyTriggerVisible() {\n var _this = _super.call(this) || this;\n _this.pages = [];\n _this.questions = [];\n return _this;\n }\n SurveyTriggerVisible.prototype.getType = function () {\n return \"visibletrigger\";\n };\n SurveyTriggerVisible.prototype.onSuccess = function (values, properties) {\n this.onTrigger(this.onItemSuccess);\n };\n SurveyTriggerVisible.prototype.onFailure = function () {\n this.onTrigger(this.onItemFailure);\n };\n SurveyTriggerVisible.prototype.onTrigger = function (func) {\n if (!this.owner)\n return;\n var objects = this.owner.getObjects(this.pages, this.questions);\n for (var i = 0; i < objects.length; i++) {\n func(objects[i]);\n }\n };\n SurveyTriggerVisible.prototype.onItemSuccess = function (item) {\n item.visible = true;\n };\n SurveyTriggerVisible.prototype.onItemFailure = function (item) {\n item.visible = false;\n };\n return SurveyTriggerVisible;\n}(SurveyTrigger));\n\n/**\n * If expression returns true, it completes the survey.\n */\nvar SurveyTriggerComplete = /** @class */ (function (_super) {\n __extends(SurveyTriggerComplete, _super);\n function SurveyTriggerComplete() {\n return _super.call(this) || this;\n }\n SurveyTriggerComplete.prototype.getType = function () {\n return \"completetrigger\";\n };\n Object.defineProperty(SurveyTriggerComplete.prototype, \"isOnNextPage\", {\n get: function () {\n return !_settings__WEBPACK_IMPORTED_MODULE_6__[\"settings\"].executeCompleteTriggerOnValueChanged;\n },\n enumerable: false,\n configurable: true\n });\n SurveyTriggerComplete.prototype.onSuccess = function (values, properties) {\n if (this.owner)\n this.owner.setCompleted();\n };\n return SurveyTriggerComplete;\n}(SurveyTrigger));\n\n/**\n * If expression returns true, the value from property **setValue** will be set to **setToName**\n */\nvar SurveyTriggerSetValue = /** @class */ (function (_super) {\n __extends(SurveyTriggerSetValue, _super);\n function SurveyTriggerSetValue() {\n return _super.call(this) || this;\n }\n SurveyTriggerSetValue.prototype.getType = function () {\n return \"setvaluetrigger\";\n };\n Object.defineProperty(SurveyTriggerSetValue.prototype, \"setToName\", {\n get: function () {\n return this.getPropertyValue(\"setToName\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"setToName\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyTriggerSetValue.prototype, \"setValue\", {\n get: function () {\n return this.getPropertyValue(\"setValue\");\n },\n set: function (val) {\n this.setPropertyValue(\"setValue\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyTriggerSetValue.prototype, \"isVariable\", {\n get: function () {\n return this.getPropertyValue(\"isVariable\", false);\n },\n set: function (val) {\n this.setPropertyValue(\"isVariable\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyTriggerSetValue.prototype.onSuccess = function (values, properties) {\n if (!this.setToName || !this.owner)\n return;\n this.owner.setTriggerValue(this.setToName, this.setValue, this.isVariable);\n };\n return SurveyTriggerSetValue;\n}(SurveyTrigger));\n\n/**\n * If expression returns true, the survey go to question **gotoName** and focus it.\n */\nvar SurveyTriggerSkip = /** @class */ (function (_super) {\n __extends(SurveyTriggerSkip, _super);\n function SurveyTriggerSkip() {\n return _super.call(this) || this;\n }\n SurveyTriggerSkip.prototype.getType = function () {\n return \"skiptrigger\";\n };\n Object.defineProperty(SurveyTriggerSkip.prototype, \"gotoName\", {\n get: function () {\n return this.getPropertyValue(\"gotoName\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"gotoName\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyTriggerSkip.prototype, \"isOnNextPage\", {\n get: function () {\n return !_settings__WEBPACK_IMPORTED_MODULE_6__[\"settings\"].executeSkipTriggerOnValueChanged;\n },\n enumerable: false,\n configurable: true\n });\n SurveyTriggerSkip.prototype.onSuccess = function (values, properties) {\n if (!this.gotoName || !this.owner)\n return;\n this.owner.focusQuestion(this.gotoName);\n };\n return SurveyTriggerSkip;\n}(SurveyTrigger));\n\n/**\n * If expression returns true, the **runExpression** will be run. If **setToName** property is not empty then the result of **runExpression** will be set to it.\n */\nvar SurveyTriggerRunExpression = /** @class */ (function (_super) {\n __extends(SurveyTriggerRunExpression, _super);\n function SurveyTriggerRunExpression() {\n return _super.call(this) || this;\n }\n SurveyTriggerRunExpression.prototype.getType = function () {\n return \"runexpressiontrigger\";\n };\n Object.defineProperty(SurveyTriggerRunExpression.prototype, \"setToName\", {\n get: function () {\n return this.getPropertyValue(\"setToName\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"setToName\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyTriggerRunExpression.prototype, \"runExpression\", {\n get: function () {\n return this.getPropertyValue(\"runExpression\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"runExpression\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyTriggerRunExpression.prototype.onSuccess = function (values, properties) {\n var _this = this;\n if (!this.owner || !this.runExpression)\n return;\n var expression = new _conditions__WEBPACK_IMPORTED_MODULE_3__[\"ExpressionRunner\"](this.runExpression);\n if (expression.canRun) {\n expression.onRunComplete = function (res) {\n _this.onCompleteRunExpression(res);\n };\n expression.run(values, properties);\n }\n };\n SurveyTriggerRunExpression.prototype.onCompleteRunExpression = function (newValue) {\n if (!!this.setToName && newValue !== undefined) {\n this.owner.setTriggerValue(this.setToName, newValue, false);\n }\n };\n return SurveyTriggerRunExpression;\n}(SurveyTrigger));\n\n/**\n * If expression returns true, the value from question **fromName** will be set into **setToName**.\n */\nvar SurveyTriggerCopyValue = /** @class */ (function (_super) {\n __extends(SurveyTriggerCopyValue, _super);\n function SurveyTriggerCopyValue() {\n return _super.call(this) || this;\n }\n Object.defineProperty(SurveyTriggerCopyValue.prototype, \"setToName\", {\n get: function () {\n return this.getPropertyValue(\"setToName\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"setToName\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyTriggerCopyValue.prototype, \"fromName\", {\n get: function () {\n return this.getPropertyValue(\"fromName\", \"\");\n },\n set: function (val) {\n this.setPropertyValue(\"fromName\", val);\n },\n enumerable: false,\n configurable: true\n });\n SurveyTriggerCopyValue.prototype.getType = function () {\n return \"copyvaluetrigger\";\n };\n SurveyTriggerCopyValue.prototype.onSuccess = function (values, properties) {\n if (!this.setToName || !this.owner)\n return;\n this.owner.copyTriggerValue(this.setToName, this.fromName);\n };\n return SurveyTriggerCopyValue;\n}(SurveyTrigger));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"trigger\", [\n { name: \"operator\", default: \"equal\", visible: false },\n { name: \"value\", visible: false },\n \"expression:condition\",\n]);\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"surveytrigger\", [{ name: \"name\", visible: false }], null, \"trigger\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"visibletrigger\", [\"pages:pages\", \"questions:questions\"], function () {\n return new SurveyTriggerVisible();\n}, \"surveytrigger\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"completetrigger\", [], function () {\n return new SurveyTriggerComplete();\n}, \"surveytrigger\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"setvaluetrigger\", [\n { name: \"!setToName:questionvalue\" },\n {\n name: \"setValue:triggervalue\",\n dependsOn: \"setToName\",\n visibleIf: function (obj) {\n return !!obj && !!obj[\"setToName\"];\n },\n },\n { name: \"isVariable:boolean\", visible: false },\n], function () {\n return new SurveyTriggerSetValue();\n}, \"surveytrigger\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"copyvaluetrigger\", [{ name: \"!setToName:questionvalue\" }, { name: \"!fromName:questionvalue\" }], function () {\n return new SurveyTriggerCopyValue();\n}, \"surveytrigger\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"skiptrigger\", [{ name: \"!gotoName:question\" }], function () {\n return new SurveyTriggerSkip();\n}, \"surveytrigger\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_2__[\"Serializer\"].addClass(\"runexpressiontrigger\", [{ name: \"setToName:questionvalue\" }, \"runExpression:expression\"], function () {\n return new SurveyTriggerRunExpression();\n}, \"surveytrigger\");\n\n\n/***/ }),\n\n/***/ \"./src/utils/is-mobile.ts\":\n/*!********************************!*\\\n !*** ./src/utils/is-mobile.ts ***!\n \\********************************/\n/*! exports provided: IsMobile */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"IsMobile\", function() { return IsMobile; });\nvar _isMobile = false;\nvar vendor = null;\nif (typeof navigator !== \"undefined\" &&\n typeof window !== \"undefined\" &&\n navigator &&\n window) {\n vendor = navigator.userAgent || navigator.vendor || window.opera;\n}\n(function (a) {\n if (!a)\n return;\n if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) ||\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4)))\n _isMobile = true;\n})(vendor);\nvar IsMobile = _isMobile;\n\n\n/***/ }),\n\n/***/ \"./src/utils/popup.ts\":\n/*!****************************!*\\\n !*** ./src/utils/popup.ts ***!\n \\****************************/\n/*! exports provided: PopupUtils */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"PopupUtils\", function() { return PopupUtils; });\nvar PopupUtils = /** @class */ (function () {\n function PopupUtils() {\n }\n PopupUtils.calculatePosition = function (targetRect, height, width, verticalPosition, horizontalPosition, showPointer) {\n if (horizontalPosition == \"center\")\n var left = (targetRect.left + targetRect.right - width) / 2;\n else if (horizontalPosition == \"left\")\n left = targetRect.left - width;\n else\n left = targetRect.right;\n if (verticalPosition == \"middle\")\n var top = (targetRect.top + targetRect.bottom - height) / 2;\n else if (verticalPosition == \"top\")\n top = targetRect.top - height;\n else\n top = targetRect.bottom;\n if (showPointer) {\n if (horizontalPosition != \"center\" && verticalPosition != \"middle\") {\n if (verticalPosition == \"top\") {\n top = top + targetRect.height;\n }\n else {\n top = top - targetRect.height;\n }\n }\n }\n return { left: Math.round(left), top: Math.round(top) };\n };\n PopupUtils.updateVerticalDimensions = function (top, height, windowHeight) {\n var result;\n if (top < 0) {\n result = { height: height + top, top: 0 };\n }\n else if (height + top > windowHeight) {\n result = { height: windowHeight - top, top: top };\n }\n return result;\n };\n PopupUtils.updateVerticalPosition = function (targetRect, height, verticalPosition, showPointer, windowHeight) {\n var deltaTop = height - (targetRect.top + (showPointer ? targetRect.height : 0));\n var deltaBottom = height +\n targetRect.bottom -\n (showPointer ? targetRect.height : 0) -\n windowHeight;\n if (deltaTop > 0 && deltaBottom <= 0 && verticalPosition == \"top\") {\n verticalPosition = \"bottom\";\n }\n else if (deltaBottom > 0 &&\n deltaTop <= 0 &&\n verticalPosition == \"bottom\") {\n verticalPosition = \"top\";\n }\n else if (deltaBottom > 0 && deltaTop > 0) {\n verticalPosition = deltaTop < deltaBottom ? \"top\" : \"bottom\";\n }\n return verticalPosition;\n };\n PopupUtils.calculatePopupDirection = function (verticalPosition, horizontalPosition) {\n var popupDirection;\n if (horizontalPosition == \"center\" && verticalPosition != \"middle\") {\n popupDirection = verticalPosition;\n }\n else if (horizontalPosition != \"center\") {\n popupDirection = horizontalPosition;\n }\n return popupDirection;\n };\n //called when showPointer is true\n PopupUtils.calculatePointerTarget = function (targetRect, top, left, verticalPosition, horizontalPosition) {\n var targetPos = {};\n if (horizontalPosition != \"center\") {\n targetPos.top = targetRect.top + targetRect.height / 2;\n targetPos.left = targetRect[horizontalPosition];\n }\n else if (verticalPosition != \"middle\") {\n targetPos.top = targetRect[verticalPosition];\n targetPos.left = targetRect.left + targetRect.width / 2;\n }\n targetPos.left = Math.round(targetPos.left - left);\n targetPos.top = Math.round(targetPos.top - top);\n return targetPos;\n };\n return PopupUtils;\n}());\n\n\n\n/***/ }),\n\n/***/ \"./src/utils/responsivity-manager.ts\":\n/*!*******************************************!*\\\n !*** ./src/utils/responsivity-manager.ts ***!\n \\*******************************************/\n/*! exports provided: ResponsivityManager, VerticalResponsivityManager */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ResponsivityManager\", function() { return ResponsivityManager; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"VerticalResponsivityManager\", function() { return VerticalResponsivityManager; });\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar ResponsivityManager = /** @class */ (function () {\n function ResponsivityManager(container, model, itemsSelector, dotsItemSize) {\n var _this = this;\n if (dotsItemSize === void 0) { dotsItemSize = 48; }\n this.container = container;\n this.model = model;\n this.itemsSelector = itemsSelector;\n this.dotsItemSize = dotsItemSize;\n this.resizeObserver = undefined;\n this.isInilized = false;\n this.minDimensionConst = 56;\n this.separatorSize = 17;\n this.getComputedStyle = window.getComputedStyle.bind(window);\n this.resizeObserver = new ResizeObserver(function (_) { return _this.process(); });\n this.resizeObserver.observe(this.container.parentElement);\n }\n Object.defineProperty(ResponsivityManager.prototype, \"items\", {\n get: function () {\n return this.model.actions.filter(function (item) { return item.visible !== false; });\n },\n enumerable: false,\n configurable: true\n });\n ResponsivityManager.prototype.getDimensions = function (element) {\n return {\n scroll: element.scrollWidth,\n offset: element.offsetWidth,\n };\n };\n ResponsivityManager.prototype.getAvailableSpace = function () {\n var style = this.getComputedStyle(this.container);\n var space = this.container.offsetWidth;\n if (style.boxSizing === \"border-box\") {\n space -= parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);\n }\n return space;\n };\n ResponsivityManager.prototype.calcItemSize = function (item) {\n return item.offsetWidth;\n };\n ResponsivityManager.prototype.calcItemsSizes = function () {\n var _this = this;\n var actions = this.model.actions;\n this.container\n .querySelectorAll(this.itemsSelector)\n .forEach(function (item, index) {\n var currentAction = actions[index];\n currentAction.maxDimension = _this.calcItemSize(item);\n currentAction.minDimension = currentAction.canShrink\n ? _this.minDimensionConst +\n (currentAction.needSeparator ? _this.separatorSize : 0)\n : currentAction.maxDimension;\n });\n };\n ResponsivityManager.prototype.getVisibleItemsCount = function (size) {\n var itemsSizes = this.items.map(function (item) { return item.minDimension; });\n var currSize = 0;\n for (var i = 0; i < itemsSizes.length; i++) {\n currSize += itemsSizes[i];\n if (currSize > size)\n return i;\n }\n return i;\n };\n ResponsivityManager.prototype.updateItemMode = function (dimension, minSize, maxSize) {\n var items = this.items;\n for (var index = items.length - 1; index >= 0; index--) {\n if (minSize <= dimension && dimension < maxSize) {\n maxSize -= items[index].maxDimension - items[index].minDimension;\n items[index].mode = \"small\";\n }\n else {\n items[index].mode = \"large\";\n }\n }\n };\n ResponsivityManager.prototype.fit = function (dimension) {\n if (dimension <= 0)\n return;\n this.model.removeDotsButton();\n var minSize = 0;\n var maxSize = 0;\n var items = this.items;\n items.forEach(function (item) {\n minSize += item.minDimension;\n maxSize += item.maxDimension;\n });\n if (dimension >= maxSize) {\n items.forEach(function (item) { return (item.mode = \"large\"); });\n }\n else if (dimension < minSize) {\n items.forEach(function (item) { return (item.mode = \"small\"); });\n this.model.showFirstN(this.getVisibleItemsCount(dimension - this.dotsItemSize));\n }\n else {\n this.updateItemMode(dimension, minSize, maxSize);\n }\n };\n ResponsivityManager.prototype.process = function () {\n if (!this.isInilized) {\n this.calcItemsSizes();\n this.isInilized = true;\n }\n this.fit(this.getAvailableSpace());\n };\n ResponsivityManager.prototype.dispose = function () {\n this.resizeObserver.disconnect();\n };\n return ResponsivityManager;\n}());\n\nvar VerticalResponsivityManager = /** @class */ (function (_super) {\n __extends(VerticalResponsivityManager, _super);\n function VerticalResponsivityManager(container, model, itemsSelector, dotsItemSize) {\n var _this = _super.call(this, container, model, itemsSelector, dotsItemSize) || this;\n _this.minDimensionConst = 40;\n return _this;\n }\n VerticalResponsivityManager.prototype.getDimensions = function () {\n return {\n scroll: this.container.scrollHeight,\n offset: this.container.offsetHeight,\n };\n };\n VerticalResponsivityManager.prototype.getAvailableSpace = function () {\n var style = this.getComputedStyle(this.container);\n var space = this.container.offsetHeight;\n if (style.boxSizing === \"border-box\") {\n space -= parseFloat(style.paddingTop) + parseFloat(style.paddingBottom);\n }\n return space;\n };\n VerticalResponsivityManager.prototype.calcItemSize = function (item) {\n return item.offsetHeight;\n };\n return VerticalResponsivityManager;\n}(ResponsivityManager));\n\n\n\n/***/ }),\n\n/***/ \"./src/utils/utils.ts\":\n/*!****************************!*\\\n !*** ./src/utils/utils.ts ***!\n \\****************************/\n/*! exports provided: unwrap, getSize, compareVersions, confirmAction, detectIEOrEdge, detectIEBrowser, loadFileFromBase64, isMobile, isElementVisible, findScrollableParent, scrollElementByChildId, createSvg, doKey2Click, getIconNameFromProxy */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"unwrap\", function() { return unwrap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getSize\", function() { return getSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compareVersions\", function() { return compareVersions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"confirmAction\", function() { return confirmAction; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"detectIEOrEdge\", function() { return detectIEOrEdge; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"detectIEBrowser\", function() { return detectIEBrowser; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadFileFromBase64\", function() { return loadFileFromBase64; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isMobile\", function() { return isMobile; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isElementVisible\", function() { return isElementVisible; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"findScrollableParent\", function() { return findScrollableParent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"scrollElementByChildId\", function() { return scrollElementByChildId; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createSvg\", function() { return createSvg; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"doKey2Click\", function() { return doKey2Click; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getIconNameFromProxy\", function() { return getIconNameFromProxy; });\n/* harmony import */ var _settings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../settings */ \"./src/settings.ts\");\n\nfunction compareVersions(a, b) {\n var regExStrip0 = /(\\.0+)+$/;\n var segmentsA = a.replace(regExStrip0, \"\").split(\".\");\n var segmentsB = b.replace(regExStrip0, \"\").split(\".\");\n var len = Math.min(segmentsA.length, segmentsB.length);\n for (var i = 0; i < len; i++) {\n var diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10);\n if (diff) {\n return diff;\n }\n }\n return segmentsA.length - segmentsB.length;\n}\nfunction confirmAction(message) {\n if (!!_settings__WEBPACK_IMPORTED_MODULE_0__[\"settings\"] && !!_settings__WEBPACK_IMPORTED_MODULE_0__[\"settings\"].confirmActionFunc)\n return _settings__WEBPACK_IMPORTED_MODULE_0__[\"settings\"].confirmActionFunc(message);\n return confirm(message);\n}\nfunction detectIEBrowser() {\n if (typeof window === \"undefined\")\n return false;\n var ua = window.navigator.userAgent;\n var oldIe = ua.indexOf(\"MSIE \");\n var elevenIe = ua.indexOf(\"Trident/\");\n return oldIe > -1 || elevenIe > -1;\n}\nfunction detectIEOrEdge() {\n if (typeof window === \"undefined\")\n return false;\n if (typeof detectIEOrEdge.isIEOrEdge === \"undefined\") {\n var ua = window.navigator.userAgent;\n var msie = ua.indexOf(\"MSIE \");\n var trident = ua.indexOf(\"Trident/\");\n var edge = ua.indexOf(\"Edge/\");\n detectIEOrEdge.isIEOrEdge = edge > 0 || trident > 0 || msie > 0;\n }\n return detectIEOrEdge.isIEOrEdge;\n}\nfunction loadFileFromBase64(b64Data, fileName) {\n try {\n var byteString = atob(b64Data.split(\",\")[1]);\n // separate out the mime component\n var mimeString = b64Data\n .split(\",\")[0]\n .split(\":\")[1]\n .split(\";\")[0];\n // write the bytes of the string to an ArrayBuffer\n var ab = new ArrayBuffer(byteString.length);\n var ia = new Uint8Array(ab);\n for (var i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n // write the ArrayBuffer to a blob, and you're done\n var bb = new Blob([ab], { type: mimeString });\n if (typeof window !== \"undefined\" &&\n window.navigator &&\n window.navigator.msSaveBlob) {\n window.navigator.msSaveOrOpenBlob(bb, fileName);\n }\n }\n catch (err) { }\n}\nfunction isMobile() {\n return (typeof window !== \"undefined\" && typeof window.orientation !== \"undefined\");\n}\nfunction isElementVisible(element, threshold) {\n if (threshold === void 0) { threshold = 0; }\n if (typeof document === \"undefined\") {\n return false;\n }\n var elementRect = element.getBoundingClientRect();\n var viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);\n var topWin = -threshold;\n var bottomWin = viewHeight + threshold;\n var topEl = elementRect.top;\n var bottomEl = elementRect.bottom;\n var maxTop = Math.max(topWin, topEl);\n var minBottom = Math.min(bottomWin, bottomEl);\n return maxTop <= minBottom;\n}\nfunction findScrollableParent(element) {\n if (!element) {\n return document.documentElement;\n }\n if (element.scrollHeight > element.clientHeight &&\n (getComputedStyle(element).overflowY === \"scroll\" ||\n getComputedStyle(element).overflowY === \"auto\")) {\n return element;\n }\n else {\n return findScrollableParent(element.parentElement);\n }\n}\nfunction scrollElementByChildId(id) {\n if (!document)\n return;\n var el = document.getElementById(id);\n if (!el)\n return;\n var scrollableEl = findScrollableParent(el);\n if (!!scrollableEl) {\n scrollableEl.dispatchEvent(new CustomEvent(\"scroll\"));\n }\n}\nfunction getIconNameFromProxy(iconName) {\n if (!iconName)\n return iconName;\n var proxyName = _settings__WEBPACK_IMPORTED_MODULE_0__[\"settings\"].customIcons[iconName];\n return !!proxyName ? proxyName : iconName;\n}\nfunction createSvg(size, width, height, iconName, svgElem) {\n svgElem.style.width = (size || width || 16) + \"px\";\n svgElem.style.height = (size || height || 16) + \"px\";\n var node = svgElem.childNodes[0];\n var realIconName = getIconNameFromProxy(iconName);\n node.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", \"#\" + realIconName);\n}\nfunction unwrap(value) {\n if (typeof value !== \"function\") {\n return value;\n }\n else {\n return value();\n }\n}\nfunction getSize(value) {\n if (typeof value === \"number\") {\n return \"\" + value + \"px\";\n }\n if (!!value && typeof value === \"string\" && value.length > 0) {\n var lastSymbol = value[value.length - 1];\n if ((lastSymbol >= \"0\" && lastSymbol <= \"9\") || lastSymbol == \".\") {\n try {\n var num = parseFloat(value);\n return \"\" + num + \"px\";\n }\n catch (_a) { }\n }\n }\n return value;\n}\nfunction doKey2Click(ev) {\n var el = ev.target;\n if (!el)\n return;\n var char = ev.which || ev.keyCode;\n if (char === 13 || char === 32) {\n if (el.click)\n el.click();\n }\n else if (char === 27) {\n if (el.blur)\n el.blur();\n }\n}\n\n\n\n/***/ }),\n\n/***/ \"./src/validator.ts\":\n/*!**************************!*\\\n !*** ./src/validator.ts ***!\n \\**************************/\n/*! exports provided: ValidatorResult, SurveyValidator, ValidatorRunner, NumericValidator, TextValidator, AnswerCountValidator, RegexValidator, EmailValidator, ExpressionValidator */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ValidatorResult\", function() { return ValidatorResult; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"SurveyValidator\", function() { return SurveyValidator; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ValidatorRunner\", function() { return ValidatorRunner; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"NumericValidator\", function() { return NumericValidator; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"TextValidator\", function() { return TextValidator; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AnswerCountValidator\", function() { return AnswerCountValidator; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"RegexValidator\", function() { return RegexValidator; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"EmailValidator\", function() { return EmailValidator; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ExpressionValidator\", function() { return ExpressionValidator; });\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ \"./src/base.ts\");\n/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error */ \"./src/error.ts\");\n/* harmony import */ var _surveyStrings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./surveyStrings */ \"./src/surveyStrings.ts\");\n/* harmony import */ var _jsonobject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./jsonobject */ \"./src/jsonobject.ts\");\n/* harmony import */ var _conditions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./conditions */ \"./src/conditions.ts\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./helpers */ \"./src/helpers.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\nvar ValidatorResult = /** @class */ (function () {\n function ValidatorResult(value, error) {\n if (error === void 0) { error = null; }\n this.value = value;\n this.error = error;\n }\n return ValidatorResult;\n}());\n\n/**\n * Base SurveyJS validator class.\n */\nvar SurveyValidator = /** @class */ (function (_super) {\n __extends(SurveyValidator, _super);\n function SurveyValidator() {\n var _this = _super.call(this) || this;\n _this.createLocalizableString(\"text\", _this, true);\n return _this;\n }\n SurveyValidator.prototype.getSurvey = function (live) {\n if (live === void 0) { live = false; }\n return !!this.errorOwner && !!this.errorOwner[\"getSurvey\"]\n ? this.errorOwner.getSurvey()\n : null;\n };\n Object.defineProperty(SurveyValidator.prototype, \"text\", {\n get: function () {\n return this.getLocalizableStringText(\"text\");\n },\n set: function (value) {\n this.setLocalizableStringText(\"text\", value);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyValidator.prototype, \"isValidateAllValues\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyValidator.prototype, \"locText\", {\n get: function () {\n return this.getLocalizableString(\"text\");\n },\n enumerable: false,\n configurable: true\n });\n SurveyValidator.prototype.getErrorText = function (name) {\n if (this.text)\n return this.text;\n return this.getDefaultErrorText(name);\n };\n SurveyValidator.prototype.getDefaultErrorText = function (name) {\n return \"\";\n };\n SurveyValidator.prototype.validate = function (value, name, values, properties) {\n if (name === void 0) { name = null; }\n if (values === void 0) { values = null; }\n if (properties === void 0) { properties = null; }\n return null;\n };\n Object.defineProperty(SurveyValidator.prototype, \"isRunning\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(SurveyValidator.prototype, \"isAsync\", {\n get: function () {\n return false;\n },\n enumerable: false,\n configurable: true\n });\n SurveyValidator.prototype.getLocale = function () {\n return !!this.errorOwner ? this.errorOwner.getLocale() : \"\";\n };\n SurveyValidator.prototype.getMarkdownHtml = function (text, name) {\n return !!this.errorOwner\n ? this.errorOwner.getMarkdownHtml(text, name)\n : null;\n };\n SurveyValidator.prototype.getRenderer = function (name) {\n return !!this.errorOwner ? this.errorOwner.getRenderer(name) : null;\n };\n SurveyValidator.prototype.getProcessedText = function (text) {\n return !!this.errorOwner ? this.errorOwner.getProcessedText(text) : text;\n };\n SurveyValidator.prototype.createCustomError = function (name) {\n return new _error__WEBPACK_IMPORTED_MODULE_1__[\"CustomError\"](this.getErrorText(name), this.errorOwner);\n };\n SurveyValidator.prototype.toString = function () {\n var res = this.getType().replace(\"validator\", \"\");\n if (!!this.text) {\n res += \", \" + this.text;\n }\n return res;\n };\n return SurveyValidator;\n}(_base__WEBPACK_IMPORTED_MODULE_0__[\"Base\"]));\n\nvar ValidatorRunner = /** @class */ (function () {\n function ValidatorRunner() {\n }\n ValidatorRunner.prototype.run = function (owner) {\n var _this = this;\n var res = [];\n var values = null;\n var properties = null;\n this.prepareAsyncValidators();\n var asyncResults = [];\n var validators = owner.getValidators();\n for (var i = 0; i < validators.length; i++) {\n var validator = validators[i];\n if (!values && validator.isValidateAllValues) {\n values = owner.getDataFilteredValues();\n properties = owner.getDataFilteredProperties();\n }\n if (validator.isAsync) {\n this.asyncValidators.push(validator);\n validator.onAsyncCompleted = function (result) {\n if (!!result && !!result.error)\n asyncResults.push(result.error);\n if (!_this.onAsyncCompleted)\n return;\n for (var i = 0; i < _this.asyncValidators.length; i++) {\n if (_this.asyncValidators[i].isRunning)\n return;\n }\n _this.onAsyncCompleted(asyncResults);\n };\n }\n }\n validators = owner.getValidators();\n for (var i = 0; i < validators.length; i++) {\n var validator = validators[i];\n var validatorResult = validator.validate(owner.validatedValue, owner.getValidatorTitle(), values, properties);\n if (!!validatorResult && !!validatorResult.error) {\n res.push(validatorResult.error);\n }\n }\n if (this.asyncValidators.length == 0 && !!this.onAsyncCompleted)\n this.onAsyncCompleted([]);\n return res;\n };\n ValidatorRunner.prototype.prepareAsyncValidators = function () {\n if (!!this.asyncValidators) {\n for (var i = 0; i < this.asyncValidators.length; i++) {\n this.asyncValidators[i].onAsyncCompleted = null;\n }\n }\n this.asyncValidators = [];\n };\n return ValidatorRunner;\n}());\n\n/**\n * Validate numeric values.\n */\nvar NumericValidator = /** @class */ (function (_super) {\n __extends(NumericValidator, _super);\n function NumericValidator(minValue, maxValue) {\n if (minValue === void 0) { minValue = null; }\n if (maxValue === void 0) { maxValue = null; }\n var _this = _super.call(this) || this;\n _this.minValue = minValue;\n _this.maxValue = maxValue;\n return _this;\n }\n NumericValidator.prototype.getType = function () {\n return \"numericvalidator\";\n };\n NumericValidator.prototype.validate = function (value, name, values, properties) {\n if (name === void 0) { name = null; }\n if (values === void 0) { values = null; }\n if (properties === void 0) { properties = null; }\n if (this.isValueEmpty(value))\n return null;\n if (!_helpers__WEBPACK_IMPORTED_MODULE_5__[\"Helpers\"].isNumber(value)) {\n return new ValidatorResult(null, new _error__WEBPACK_IMPORTED_MODULE_1__[\"RequreNumericError\"](null, this.errorOwner));\n }\n var result = new ValidatorResult(parseFloat(value));\n if (this.minValue !== null && this.minValue > result.value) {\n result.error = this.createCustomError(name);\n return result;\n }\n if (this.maxValue !== null && this.maxValue < result.value) {\n result.error = this.createCustomError(name);\n return result;\n }\n return typeof value === \"number\" ? null : result;\n };\n NumericValidator.prototype.getDefaultErrorText = function (name) {\n var vName = name ? name : _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"value\");\n if (this.minValue !== null && this.maxValue !== null) {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"]\n .getString(\"numericMinMax\")[\"format\"](vName, this.minValue, this.maxValue);\n }\n else {\n if (this.minValue !== null) {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"]\n .getString(\"numericMin\")[\"format\"](vName, this.minValue);\n }\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"]\n .getString(\"numericMax\")[\"format\"](vName, this.maxValue);\n }\n };\n Object.defineProperty(NumericValidator.prototype, \"minValue\", {\n /**\n * The minValue property.\n */\n get: function () {\n return this.getPropertyValue(\"minValue\");\n },\n set: function (val) {\n this.setPropertyValue(\"minValue\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(NumericValidator.prototype, \"maxValue\", {\n /**\n * The maxValue property.\n */\n get: function () {\n return this.getPropertyValue(\"maxValue\");\n },\n set: function (val) {\n this.setPropertyValue(\"maxValue\", val);\n },\n enumerable: false,\n configurable: true\n });\n return NumericValidator;\n}(SurveyValidator));\n\n/**\n * Validate text values.\n */\nvar TextValidator = /** @class */ (function (_super) {\n __extends(TextValidator, _super);\n function TextValidator(minLength, maxLength, allowDigits) {\n if (minLength === void 0) { minLength = 0; }\n if (maxLength === void 0) { maxLength = 0; }\n if (allowDigits === void 0) { allowDigits = true; }\n var _this = _super.call(this) || this;\n _this.minLength = minLength;\n _this.maxLength = maxLength;\n _this.allowDigits = allowDigits;\n return _this;\n }\n TextValidator.prototype.getType = function () {\n return \"textvalidator\";\n };\n TextValidator.prototype.validate = function (value, name, values, properties) {\n if (name === void 0) { name = null; }\n if (values === void 0) { values = null; }\n if (properties === void 0) { properties = null; }\n if (this.isValueEmpty(value))\n return null;\n if (!this.allowDigits) {\n var reg = /^[A-Za-z\\s]*$/;\n if (!reg.test(value)) {\n return new ValidatorResult(null, this.createCustomError(name));\n }\n }\n if (this.minLength > 0 && value.length < this.minLength) {\n return new ValidatorResult(null, this.createCustomError(name));\n }\n if (this.maxLength > 0 && value.length > this.maxLength) {\n return new ValidatorResult(null, this.createCustomError(name));\n }\n return null;\n };\n TextValidator.prototype.getDefaultErrorText = function (name) {\n if (this.minLength > 0 && this.maxLength > 0)\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"]\n .getString(\"textMinMaxLength\")[\"format\"](this.minLength, this.maxLength);\n if (this.minLength > 0)\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"]\n .getString(\"textMinLength\")[\"format\"](this.minLength);\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"]\n .getString(\"textMaxLength\")[\"format\"](this.maxLength);\n };\n Object.defineProperty(TextValidator.prototype, \"minLength\", {\n /**\n * The minLength property.\n */\n get: function () {\n return this.getPropertyValue(\"minLength\");\n },\n set: function (val) {\n this.setPropertyValue(\"minLength\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TextValidator.prototype, \"maxLength\", {\n /**\n * The maxLength property.\n */\n get: function () {\n return this.getPropertyValue(\"maxLength\");\n },\n set: function (val) {\n this.setPropertyValue(\"maxLength\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TextValidator.prototype, \"allowDigits\", {\n /**\n * The allowDigits property.\n */\n get: function () {\n return this.getPropertyValue(\"allowDigits\", true);\n },\n set: function (val) {\n this.setPropertyValue(\"allowDigits\", val);\n },\n enumerable: false,\n configurable: true\n });\n return TextValidator;\n}(SurveyValidator));\n\nvar AnswerCountValidator = /** @class */ (function (_super) {\n __extends(AnswerCountValidator, _super);\n function AnswerCountValidator(minCount, maxCount) {\n if (minCount === void 0) { minCount = null; }\n if (maxCount === void 0) { maxCount = null; }\n var _this = _super.call(this) || this;\n _this.minCount = minCount;\n _this.maxCount = maxCount;\n return _this;\n }\n AnswerCountValidator.prototype.getType = function () {\n return \"answercountvalidator\";\n };\n AnswerCountValidator.prototype.validate = function (value, name, values, properties) {\n if (name === void 0) { name = null; }\n if (values === void 0) { values = null; }\n if (properties === void 0) { properties = null; }\n if (value == null || value.constructor != Array)\n return null;\n var count = value.length;\n if (count == 0)\n return null;\n if (this.minCount && count < this.minCount) {\n return new ValidatorResult(null, this.createCustomError(_surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"]\n .getString(\"minSelectError\")[\"format\"](this.minCount)));\n }\n if (this.maxCount && count > this.maxCount) {\n return new ValidatorResult(null, this.createCustomError(_surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"]\n .getString(\"maxSelectError\")[\"format\"](this.maxCount)));\n }\n return null;\n };\n AnswerCountValidator.prototype.getDefaultErrorText = function (name) {\n return name;\n };\n Object.defineProperty(AnswerCountValidator.prototype, \"minCount\", {\n /**\n * The minCount property.\n */\n get: function () {\n return this.getPropertyValue(\"minCount\");\n },\n set: function (val) {\n this.setPropertyValue(\"minCount\", val);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(AnswerCountValidator.prototype, \"maxCount\", {\n /**\n * The maxCount property.\n */\n get: function () {\n return this.getPropertyValue(\"maxCount\");\n },\n set: function (val) {\n this.setPropertyValue(\"maxCount\", val);\n },\n enumerable: false,\n configurable: true\n });\n return AnswerCountValidator;\n}(SurveyValidator));\n\n/**\n * Use it to validate the text by regular expressions.\n */\nvar RegexValidator = /** @class */ (function (_super) {\n __extends(RegexValidator, _super);\n function RegexValidator(regex) {\n if (regex === void 0) { regex = null; }\n var _this = _super.call(this) || this;\n _this.regex = regex;\n return _this;\n }\n RegexValidator.prototype.getType = function () {\n return \"regexvalidator\";\n };\n RegexValidator.prototype.validate = function (value, name, values, properties) {\n if (name === void 0) { name = null; }\n if (values === void 0) { values = null; }\n if (properties === void 0) { properties = null; }\n if (!this.regex || this.isValueEmpty(value))\n return null;\n var re = new RegExp(this.regex);\n if (Array.isArray(value)) {\n for (var i = 0; i < value.length; i++) {\n var res = this.hasError(re, value[i], name);\n if (res)\n return res;\n }\n }\n return this.hasError(re, value, name);\n };\n RegexValidator.prototype.hasError = function (re, value, name) {\n if (re.test(value))\n return null;\n return new ValidatorResult(value, this.createCustomError(name));\n };\n Object.defineProperty(RegexValidator.prototype, \"regex\", {\n /**\n * The regex property.\n */\n get: function () {\n return this.getPropertyValue(\"regex\");\n },\n set: function (val) {\n this.setPropertyValue(\"regex\", val);\n },\n enumerable: false,\n configurable: true\n });\n return RegexValidator;\n}(SurveyValidator));\n\n/**\n * Validate e-mail address in the text input\n */\nvar EmailValidator = /** @class */ (function (_super) {\n __extends(EmailValidator, _super);\n function EmailValidator() {\n var _this = _super.call(this) || this;\n _this.re = /^(([^<>()\\[\\]\\.,;:\\s@\\\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()=[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()=[\\]\\.,;:\\s@\\\"]{2,})$/i;\n return _this;\n }\n EmailValidator.prototype.getType = function () {\n return \"emailvalidator\";\n };\n EmailValidator.prototype.validate = function (value, name, values, properties) {\n if (name === void 0) { name = null; }\n if (values === void 0) { values = null; }\n if (properties === void 0) { properties = null; }\n if (!value)\n return null;\n if (this.re.test(value))\n return null;\n return new ValidatorResult(value, this.createCustomError(name));\n };\n EmailValidator.prototype.getDefaultErrorText = function (name) {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"].getString(\"invalidEmail\");\n };\n return EmailValidator;\n}(SurveyValidator));\n\n/**\n * Show error if expression returns false\n */\nvar ExpressionValidator = /** @class */ (function (_super) {\n __extends(ExpressionValidator, _super);\n function ExpressionValidator(expression) {\n if (expression === void 0) { expression = null; }\n var _this = _super.call(this) || this;\n _this.conditionRunner = null;\n _this.isRunningValue = false;\n _this.expression = expression;\n return _this;\n }\n ExpressionValidator.prototype.getType = function () {\n return \"expressionvalidator\";\n };\n Object.defineProperty(ExpressionValidator.prototype, \"isValidateAllValues\", {\n get: function () {\n return true;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ExpressionValidator.prototype, \"isAsync\", {\n get: function () {\n if (!this.ensureConditionRunner())\n return false;\n return this.conditionRunner.isAsync;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ExpressionValidator.prototype, \"isRunning\", {\n get: function () {\n return this.isRunningValue;\n },\n enumerable: false,\n configurable: true\n });\n ExpressionValidator.prototype.validate = function (value, name, values, properties) {\n var _this = this;\n if (name === void 0) { name = null; }\n if (values === void 0) { values = null; }\n if (properties === void 0) { properties = null; }\n if (!this.ensureConditionRunner())\n return null;\n this.conditionRunner.onRunComplete = function (res) {\n _this.isRunningValue = false;\n if (!!_this.onAsyncCompleted) {\n _this.onAsyncCompleted(_this.generateError(res, value, name));\n }\n };\n this.isRunningValue = true;\n var res = this.conditionRunner.run(values, properties);\n if (this.conditionRunner.isAsync)\n return null;\n this.isRunningValue = false;\n return this.generateError(res, value, name);\n };\n ExpressionValidator.prototype.generateError = function (res, value, name) {\n if (!res) {\n return new ValidatorResult(value, this.createCustomError(name));\n }\n return null;\n };\n ExpressionValidator.prototype.getDefaultErrorText = function (name) {\n return _surveyStrings__WEBPACK_IMPORTED_MODULE_2__[\"surveyLocalization\"]\n .getString(\"invalidExpression\")[\"format\"](this.expression);\n };\n ExpressionValidator.prototype.ensureConditionRunner = function () {\n if (!!this.conditionRunner) {\n this.conditionRunner.expression = this.expression;\n return true;\n }\n if (!this.expression)\n return false;\n this.conditionRunner = new _conditions__WEBPACK_IMPORTED_MODULE_4__[\"ConditionRunner\"](this.expression);\n return true;\n };\n Object.defineProperty(ExpressionValidator.prototype, \"expression\", {\n /**\n * The expression property.\n */\n get: function () {\n return this.getPropertyValue(\"expression\");\n },\n set: function (val) {\n this.setPropertyValue(\"expression\", val);\n },\n enumerable: false,\n configurable: true\n });\n return ExpressionValidator;\n}(SurveyValidator));\n\n_jsonobject__WEBPACK_IMPORTED_MODULE_3__[\"Serializer\"].addClass(\"surveyvalidator\", [\n { name: \"text\", serializationProperty: \"locText\" },\n]);\n_jsonobject__WEBPACK_IMPORTED_MODULE_3__[\"Serializer\"].addClass(\"numericvalidator\", [\"minValue:number\", \"maxValue:number\"], function () {\n return new NumericValidator();\n}, \"surveyvalidator\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_3__[\"Serializer\"].addClass(\"textvalidator\", [\"minLength:number\", \"maxLength:number\", \"allowDigits:boolean\"], function () {\n return new TextValidator();\n}, \"surveyvalidator\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_3__[\"Serializer\"].addClass(\"answercountvalidator\", [\"minCount:number\", \"maxCount:number\"], function () {\n return new AnswerCountValidator();\n}, \"surveyvalidator\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_3__[\"Serializer\"].addClass(\"regexvalidator\", [\"regex\"], function () {\n return new RegexValidator();\n}, \"surveyvalidator\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_3__[\"Serializer\"].addClass(\"emailvalidator\", [], function () {\n return new EmailValidator();\n}, \"surveyvalidator\");\n_jsonobject__WEBPACK_IMPORTED_MODULE_3__[\"Serializer\"].addClass(\"expressionvalidator\", [\"expression:condition\"], function () {\n return new ExpressionValidator();\n}, \"surveyvalidator\");\n\n\n/***/ }),\n\n/***/ \"knockout\":\n/*!********************************************************************************************!*\\\n !*** external {\"root\":\"ko\",\"commonjs2\":\"knockout\",\"commonjs\":\"knockout\",\"amd\":\"knockout\"} ***!\n \\********************************************************************************************/\n/*! no static exports found */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_knockout__;\n\n/***/ })\n\n/******/ });\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TdXJ2ZXkvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1N1cnZleS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9wYW5lbC9wYW5lbC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3BvcHVwL3BvcHVwLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvcHJvZ3Jlc3MvYnV0dG9ucy5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3Byb2dyZXNzL3Byb2dyZXNzLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9lbnRyeS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvd2luZG93L3dpbmRvdy5odG1sIiwid2VicGFjazovL1N1cnZleS8uL25vZGVfbW9kdWxlcy9zaWduYXR1cmVfcGFkL2Rpc3Qvc2lnbmF0dXJlX3BhZC5tanMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vbm9kZV9tb2R1bGVzL3NvcnRhYmxlanMvbW9kdWxhci9zb3J0YWJsZS5lc20uanMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2FjdGlvbnMvYWN0aW9uLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9hY3Rpb25zL2FkYXB0aXZlLWNvbnRhaW5lci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvYWN0aW9ucy9jb250YWluZXIudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2Jhc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2NhbGN1bGF0ZWRWYWx1ZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvY2hvaWNlc1Jlc3RmdWwudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2NvbmRpdGlvblByb2Nlc3NWYWx1ZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvY29uZGl0aW9ucy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvY29uZGl0aW9uc1BhcnNlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvZGVmYXVsdENzcy9jc3Nib290c3RyYXAudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwbWF0ZXJpYWwudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2RlZmF1bHRDc3MvY3NzbW9kZXJuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9kcmFnZHJvcGhlbHBlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvZHhTdXJ2ZXlTZXJ2aWNlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9lbnRyaWVzL2NodW5rcy9sb2NhbGl6YXRpb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2VudHJpZXMvY2h1bmtzL21vZGVsLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9lbnRyaWVzL2NvcmUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2VudHJpZXMva25vY2tvdXQtdWkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2VudHJpZXMva25vY2tvdXQudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2Vycm9yLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9leHByZXNzaW9uSXRlbXMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2V4cHJlc3Npb25zL2V4cHJlc3Npb25QYXJzZXIudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9mbG93cGFuZWwudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2Z1bmN0aW9uc2ZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2hlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2l0ZW12YWx1ZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvanNvbm9iamVjdC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9hY3Rpb24tYmFyL2FjdGlvbi1iYXItaXRlbS1kcm9wZG93bi5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2FjdGlvbi1iYXIvYWN0aW9uLWJhci1pdGVtLWRyb3Bkb3duLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2FjdGlvbi1iYXIvYWN0aW9uLWJhci1pdGVtLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvYWN0aW9uLWJhci9hY3Rpb24tYmFyLWl0ZW0udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvYWN0aW9uLWJhci9hY3Rpb24tYmFyLXNlcGFyYXRvci5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2FjdGlvbi1iYXIvYWN0aW9uLWJhci1zZXBhcmF0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvYWN0aW9uLWJhci9hY3Rpb24tYmFyLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvYWN0aW9uLWJhci9hY3Rpb24tYmFyLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2FjdGlvbi1iYXIvYWN0aW9uLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvYWN0aW9uLWJhci9hY3Rpb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvYm9vbGVhbi1jaGVja2JveC9ib29sZWFuLWNoZWNrYm94Lmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvYm9vbGVhbi1jaGVja2JveC9ib29sZWFuLWNoZWNrYm94LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2J1dHRvbi1ncm91cC9idXR0b24tZ3JvdXAtaXRlbS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2J1dHRvbi1ncm91cC9idXR0b24tZ3JvdXAtaXRlbS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9kZWZhdWx0LXRpdGxlL2RlZmF1bHQtdGl0bGUuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9kZWZhdWx0LXRpdGxlL2RlZmF1bHQtdGl0bGUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvbGlzdC9saXN0Lmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvbGlzdC9saXN0LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2xvZ28taW1hZ2UvbG9nby1pbWFnZS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL2xvZ28taW1hZ2UvbG9nby1pbWFnZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9kZXRhaWwtYnV0dG9uL2RldGFpbC1idXR0b24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9kZXRhaWwtYnV0dG9uL2RldGFpbC1idXR0b24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvbWF0cml4LWFjdGlvbnMvZHJhZy1kcm9wLWljb24vZHJhZy1kcm9wLWljb24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9kcmFnLWRyb3AtaWNvbi9kcmFnLWRyb3AtaWNvbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9yZW1vdmUtYnV0dG9uL3JlbW92ZS1idXR0b24uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9yZW1vdmUtYnV0dG9uL3JlbW92ZS1idXR0b24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvcGFuZWwvcGFuZWwudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvcG9wdXAvcG9wdXAudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvcHJvZ3Jlc3MvYnV0dG9ucy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9wcm9ncmVzcy9wcm9ncmVzcy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9zdHJpbmctZWRpdG9yL3N0cmluZy1lZGl0b3IuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy9zdHJpbmctZWRpdG9yL3N0cmluZy1lZGl0b3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvc3RyaW5nLXZpZXdlci9zdHJpbmctdmlld2VyLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvc3RyaW5nLXZpZXdlci9zdHJpbmctdmlld2VyLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9jb21wb25lbnRzL3N2Zy1pY29uL3N2Zy1pY29uLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvc3ZnLWljb24vc3ZnLWljb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2NvbXBvbmVudHMvdGVtcGxhdGUtcmVuZGVyZXIvdGVtcGxhdGUtcmVuZGVyZXIuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy90ZW1wbGF0ZS1yZW5kZXJlci90ZW1wbGF0ZS1yZW5kZXJlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy90aXRsZS1hY3Rpb25zL3RpdGxlLWFjdGlvbnMuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvY29tcG9uZW50cy90aXRsZS1hY3Rpb25zL3RpdGxlLWFjdGlvbnMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvU3VydmV5V2luZG93LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb2Jhc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvZmxvd3BhbmVsLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3BhZ2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fYmFzZXNlbGVjdC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9ib29sZWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2J1dHRvbmdyb3VwLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2NoZWNrYm94LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2NvbW1lbnQudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fY3VzdG9tLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2Ryb3Bkb3duLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2VtcHR5LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2V4cHJlc3Npb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fZmlsZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9odG1sLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2ltYWdlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2ltYWdlcGlja2VyLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX21hdHJpeC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkcm9wZG93bi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkeW5hbWljLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX211bHRpcGxldGV4dC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9wYW5lbGR5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcmFkaW9ncm91cC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9yYW5raW5nLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX3JhdGluZy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9zaWduYXR1cmVwYWQudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fdGV4dC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQva29zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlVGV4dC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL2NvbW1lbnQuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL2Zsb3dwYW5lbC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvaGVhZGVyLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9pbmRleC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcGFnZS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcGFuZWwuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWJvb2xlYW4uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWJ1dHRvbmdyb3VwLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1jaGVja2JveC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tY29tbWVudC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tY29tcG9zaXRlLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1jdXN0b20uaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWRyb3Bkb3duLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1lbXB0eS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZXJyb3JzLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1leHByZXNzaW9uLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1maWxlLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1odG1sLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1pbWFnZS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24taW1hZ2VwaWNrZXIuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLW1hdHJpeC5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tbWF0cml4ZHluYW1pYy5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tbXVsdGlwbGV0ZXh0Lmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1wYW5lbGR5bmFtaWMtbmF2aWdhdG9yLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1wYW5lbGR5bmFtaWMuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXJhZGlvZ3JvdXAuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXJhbmtpbmcuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXJhdGluZy5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tc2lnbmF0dXJlcGFkLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi10ZXh0Lmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb250aXRsZS5odG1sIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcm93Lmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9yb3dzLmh0bWwiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9zdHJpbmcuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3RpbWVycGFuZWwuaHRtbCIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbGlzdC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemFibGVzdHJpbmcudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9hcmFiaWMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9iYXNxdWUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9idWxnYXJpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9jYXRhbGFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vY3JvYXRpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9jemVjaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2RhbmlzaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2R1dGNoLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vZW5nbGlzaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2VzdG9uaWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vZmlubmlzaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2dlb3JnaWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vZ2VybWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vZ3JlZWsudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9oZWJyZXcudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9oaW5kaS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2h1bmdhcmlhbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2ljZWxhbmRpYy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL2luZG9uZXNpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9pdGFsaWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vamFwYW5lc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9rYXpha2gudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9rb3JlYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9sYXR2aWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vbGl0aHVhbmlhbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL21hY2Vkb25pYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9ub3J3ZWdpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9wZXJzaWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vcG9saXNoLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vcG9ydHVndWVzZS1ici50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9yb21hbmlhbi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL3J1c3NpYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9zZXJiaWFuLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vc2ltcGxpZmllZC1jaGluZXNlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vc3BhbmlzaC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL3N3YWhpbGkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi9zd2VkaXNoLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vdGFqaWsudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi90aGFpLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vdHJhZGl0aW9uYWwtY2hpbmVzZS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvbG9jYWxpemF0aW9uL3R1cmtpc2gudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi91a3JhaW5pYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL2xvY2FsaXphdGlvbi92aWV0bmFtZXNlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9sb2NhbGl6YXRpb24vd2Vsc2gudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL21haW4uc2Nzcz8zYmMwIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9tYXJ0aXhCYXNlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9wYWdlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9wYW5lbC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcG9wdXAudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbkN1c3RvbVdpZGdldHMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2Jhc2VzZWxlY3QudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2J1dHRvbmdyb3VwLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9jaGVja2JveC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fY29tbWVudC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fY3VzdG9tLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fZW1wdHkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2V4cHJlc3Npb24udHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2ZpbGUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2h0bWwudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX2ltYWdlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9pbWFnZXBpY2tlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fbWF0cml4LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bi50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9tYXRyaXhkeW5hbWljLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX3BhbmVsZHluYW1pYy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fcmFkaW9ncm91cC50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fcmFua2luZy50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvcXVlc3Rpb25fcmF0aW5nLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbl9zaWduYXR1cmVwYWQudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX3RleHQudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9uX3RleHRiYXNlLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9xdWVzdGlvbmZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3F1ZXN0aW9ubm9udmFsdWUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3JlbmRlcmVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvc2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3N0eWxlc21hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3N1cnZleS1lbGVtZW50LnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9zdXJ2ZXktZXJyb3IudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3N1cnZleS50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvc3VydmV5UHJvZ3Jlc3NCdXR0b25zLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9zdXJ2ZXlTdHJpbmdzLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy9zdXJ2ZXlXaW5kb3cudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3N1cnZleXRpbWVyLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy90ZXh0UHJlUHJvY2Vzc29yLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy90cmlnZ2VyLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy91dGlscy9pcy1tb2JpbGUudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3V0aWxzL3BvcHVwLnRzIiwid2VicGFjazovL1N1cnZleS8uL3NyYy91dGlscy9yZXNwb25zaXZpdHktbWFuYWdlci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvLi9zcmMvdXRpbHMvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vU3VydmV5Ly4vc3JjL3ZhbGlkYXRvci50cyIsIndlYnBhY2s6Ly9TdXJ2ZXkvZXh0ZXJuYWwge1wicm9vdFwiOlwia29cIixcImNvbW1vbmpzMlwiOlwia25vY2tvdXRcIixcImNvbW1vbmpzXCI6XCJrbm9ja291dFwiLFwiYW1kXCI6XCJrbm9ja291dFwifSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO1FDVkE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7QUNsRkEscUNBQXFDLGlHQUFpRyxrQjs7Ozs7Ozs7Ozs7QUNBdEksbUpBQW1KLGlDQUFpQyxrQkFBa0IsYUFBYSxFQUFFLEVBQUUsMEVBQTBFLHVDQUF1QyxzQkFBc0IsYUFBYSxFQUFFLG9HQUFvRyxrREFBa0Qs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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRixhQUFhO0FBQ3hHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4REFBOEQ7O0FBRTlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxZQUFZO0FBQ1osWUFBWTs7QUFFWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZOztBQUVaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGlCQUFpQixlQUFlO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsd0JBQXdCO0FBQ3pDOztBQUVBO0FBQ0EscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUgsbUNBQW1DO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFZSwyRUFBWSxFQUFDOzs7Ozs7Ozs7Ozs7O0FDemxCNUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLHNCQUFzQjtBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLHVCQUF1QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSxlQUFlLDZCQUE2QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlEQUFpRCxnQkFBZ0I7O0FBRWpFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCLFlBQVksVUFBVTtBQUN0QixZQUFZLFVBQVU7QUFDdEIsWUFBWSxVQUFVO0FBQ3RCLFlBQVksY0FBYztBQUMxQixZQUFZLE9BQU87QUFDbkI7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7O0FBRXpDO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1QsNENBQTRDOzs7QUFHNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEVBQUU7OztBQUdYO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ01BQWdNOztBQUVoTTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCw4REFBOEQ7O0FBRTlEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0M7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsT0FBTztBQUNQLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0EsZ0VB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QUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixnQkFBZ0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSCxpQ0FBaUM7QUFDakMsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLDhCQUE4QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0M7QUFDRDtBQUNHO0FBQ0Q7QUFDRDtBQUNFO0FBQ0Y7QUFDRDtBQUNDO0FBQ0Q7QUFDSTtBQUNBO0FBQ0M7QUFDSDtBQUNDO0FBQ0Y7QUFDQTtBQUNDO0FBQ0c7QUFDQTtBQUNEO0FBQ0Y7QUFDRDtBQUNJO0FBQ0c7QUFDTDtBQUNEO0FBQ0E7QUFDVztBQUNYO0FBQ0E7QUFDQTtBQUNGO0FBQ0Q7QUFDZTtBQUNaO0FBQ0U7QUFDQztBQUNMOzs7Ozs7Ozs7Ozs7O0FDNUNsQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBUztBQUNnQjtBQUN6Qiw2QkFBNkI7QUFFdEIsSUFBSSxPQUFlLENBQUM7QUFDM0IsT0FBTyxHQUFHLEtBQUcsUUFBcUIsQ0FBQztBQUVPO0FBQ1M7QUFXMUI7QUFDbUI7QUFDVztBQVFOO0FBQ0k7QUFDRztBQU9uQztBQU1ZO0FBQzJDO0FBQ0w7QUFDSTtBQUNOO0FBUTlCO0FBQ21CO0FBQ0M7QUFlakM7QUFVaUI7QUFJSjtBQUlEO0FBTVA7QUFJTTtBQUNzQztBQUMxQjtBQUNWO0FBQ0M7QUFDRTtBQUNnQjtBQUNBO0FBSXZCO0FBQzZCO0FBQ0Y7QUFDQTtBQUNFO0FBQ1E7QUFDaEI7QUFDQTtBQUNZO0FBQ1I7QUFDUTtBQUNaO0FBQ007QUFJMUI7QUFDc0I7QUFDYztBQUluQztBQUNXO0FBQ3lCO0FBQzlCO0FBU3BCO0FBQ2dDO0FBQ0c7QUFFRjtBQUNJO0FBQ1k7QUFDeEUsbURBQW1EO0FBSWQ7QUFNTjtBQUVxQjtBQUNiO0FBQ3NCO0FBS3pCO0FBQ2E7QUFPdEI7QUFFOEI7QUFDekQsZ0RBQWdEO0FBQ2hELDJFQUEyRTtBQUVyQjs7Ozs7Ozs7Ozs7OztBQzFMdEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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Q0FBQyxRQUFRLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQ3pGakQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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O2FBQzNDO1lBQ0QsSUFBSSxDQUFDLGdEQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO2FBQ25DO1lBQ0QsSUFBSSxDQUFDLGdEQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO2FBQ25DO1lBQ0QsSUFBSSxDQUFDLGdEQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO2FBQ25DO1lBQ0QsSUFBSSxDQUFDLGdEQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO2FBQ25DO1lBQ0QsSUFBSSxDQUFDLGdEQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUNwRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDO2FBQ25EO1lBQ0QsSUFBSSxDQUFDLGdEQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO2FBQ3ZDO1lBQ0QsSUFBSSxDQUFDLGdEQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO2FBQ25DO1lBQ0QsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRTtnQkFDM0QsSUFBSSxDQUFDLE9B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QUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtB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QUFtQixFQUFFLENBQUM7QUFDbkMsQ0FBQyxFQUNELGlCQUFpQixDQUNsQixDQUFDOzs7Ozs7Ozs7Ozs7QUN6aUJGLHNEIiwiZmlsZSI6InN1cnZleS5rby5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImtub2Nrb3V0XCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwic3VydmV5LWtvXCIsIFtcImtub2Nrb3V0XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInN1cnZleS1rb1wiXSA9IGZhY3RvcnkocmVxdWlyZShcImtub2Nrb3V0XCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJTdXJ2ZXlcIl0gPSBmYWN0b3J5KHJvb3RbXCJrb1wiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2tub2Nrb3V0X18pIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9lbnRyaWVzL2tub2Nrb3V0LnRzXCIpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1wYW5lbCcsIGRhdGE6IHF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvUGFuZWxBZnRlclJlbmRlciB9IC0tPjwhLS0gL2tvIC0tPlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2XFxuICBjbGFzcz1cXFwic3YtcG9wdXBcXFwiXFxuICB0YWJpbmRleD1cXFwiLTFcXFwiXFxuICBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGlzVmlzaWJsZSwgY2xpY2s6IGNsaWNrT3V0c2lkZSwgY2xhc3M6IHN0eWxlQ2xhc3MsIGV2ZW50OiB7IGtleWRvd246IGZ1bmN0aW9uKGRhdGEsIGV2ZW50KSB7IG9uS2V5RG93bihldmVudCk7IHJldHVybiB0cnVlOyB9IH1cXFwiXFxuPlxcbiAgPGRpdlxcbiAgICBjbGFzcz1cXFwic3YtcG9wdXBfX2NvbnRhaW5lclxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJzdHlsZTogeyBsZWZ0OiBsZWZ0LCB0b3A6IHRvcCwgaGVpZ2h0OiBoZWlnaHQgfSwgIGNsaWNrOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0sIGNsaWNrQnViYmxlOiBmYWxzZVxcXCJcXG4gID5cXG4gICAgPCEtLSBrbyBpZjogc2hvd1BvaW50ZXIgIC0tPlxcbiAgICA8c3BhblxcbiAgICAgIGRhdGEtYmluZD1cXFwic3R5bGU6IHtsZWZ0OiBwb2ludGVyVGFyZ2V0LmxlZnQsIHRvcDogcG9pbnRlclRhcmdldC50b3AgfVxcXCJcXG4gICAgICBjbGFzcz1cXFwic3YtcG9wdXBfX3BvaW50ZXJcXFwiXFxuICAgID48L3NwYW4+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzdi1wb3B1cF9fc2Nyb2xsaW5nLWNvbnRlbnRcXFwiPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInN2LXBvcHVwX19oZWFkZXJcXFwiPjwvZGl2PlxcbiAgICAgIDxkaXZcXG4gICAgICAgIGNsYXNzPVxcXCJzdi1wb3B1cF9fY29udGVudFxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY29tcG9uZW50OiB7IG5hbWU6IGNvbnRlbnRDb21wb25lbnROYW1lLCBwYXJhbXM6IGNvbnRlbnRDb21wb25lbnREYXRhIH1cXFwiXFxuICAgICAgPjwvZGl2PlxcblxcbiAgICAgIDwhLS0ga28gaWY6IGlzTW9kYWwgIC0tPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInN2LXBvcHVwX19mb290ZXJcXFwiPlxcbiAgICAgICAgPGJ1dHRvblxcbiAgICAgICAgICBjbGFzcz1cXFwic3YtcG9wdXBfX2Zvb3Rlci1pdGVtIHN2LXBvcHVwX19idXR0b24gc3YtcG9wdXBfX2J1dHRvbi0tY2FuY2VsXFxcIlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBjYW5jZWwsIHRleHQ6IGNhbmNlbEJ1dHRvblRleHRcXFwiXFxuICAgICAgICA+XFxuICAgICAgICAgIENhbmNlbFxcbiAgICAgICAgPC9idXR0b24+XFxuICAgICAgICA8YnV0dG9uXFxuICAgICAgICAgIGNsYXNzPVxcXCJzdi1wb3B1cF9fZm9vdGVyLWl0ZW0gc3YtcG9wdXBfX2J1dHRvbiBzdi1wb3B1cF9fYnV0dG9uLS1hcHBseVxcXCJcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazogYXBwbHksIHRleHQ6IGFwcGx5QnV0dG9uVGV4dFxcXCJcXG4gICAgICAgID5cXG4gICAgICAgICAgQXBwbHlcXG4gICAgICAgIDwvYnV0dG9uPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG4gIDwvZGl2PlxcbjwvZGl2PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBtb2RlbC5jc3MucHJvZ3Jlc3NCdXR0b25zQ29udGFpbmVyQ2VudGVyXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogbW9kZWwuY3NzLnByb2dyZXNzQnV0dG9uc0NvbnRhaW5lclxcXCI+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBnZXRTY3JvbGxCdXR0b25Dc3ModHJ1ZSksIGNsaWNrOiBjbGlja1Njcm9sbEJ1dHRvbi5iaW5kKCRkYXRhLCAkZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcsIHRydWUpXFxcIiByb2xlPVxcXCJidXR0b25cXFwiPjwvZGl2PlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogbW9kZWwuY3NzLnByb2dyZXNzQnV0dG9uc0xpc3RDb250YWluZXJcXFwiPlxcbiAgICAgICAgICAgIDx1bCBkYXRhLWJpbmQ9XFxcImZvcmVhY2g6IG1vZGVsLnZpc2libGVQYWdlcywgY3NzOiBtb2RlbC5jc3MucHJvZ3Jlc3NCdXR0b25zTGlzdFxcXCI+XFxuICAgICAgICAgICAgICAgIDxsaSBkYXRhLWJpbmQ9XFxcImNzczogJHBhcmVudC5nZXRMaXN0RWxlbWVudENzcygkaW5kZXgpLCBjbGljazogJHBhcmVudC5pc0xpc3RFbGVtZW50Q2xpY2thYmxlKCRpbmRleCkgPyAkcGFyZW50LmNsaWNrTGlzdEVsZW1lbnQuYmluZCgkcGFyZW50LCAkaW5kZXgpIDogbnVsbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MucHJvZ3Jlc3NCdXR0b25zUGFnZVRpdGxlLCB0ZXh0OiBsb2NOYXZpZ2F0aW9uVGl0bGUua29SZW5kZXJlZEh0bWwoKSB8fCBuYW1lLCBhdHRyOiB7IHRpdGxlOiBsb2NOYXZpZ2F0aW9uVGl0bGUua29SZW5kZXJlZEh0bWwoKSB8fCBuYW1lIH1cXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLnByb2dyZXNzQnV0dG9uc1BhZ2VEZXNjcmlwdGlvbiwgdGV4dDogbG9jTmF2aWdhdGlvbkRlc2NyaXB0aW9uLmtvUmVuZGVyZWRIdG1sKCksIGF0dHI6IHsgdGl0bGU6IGxvY05hdmlnYXRpb25EZXNjcmlwdGlvbi5rb1JlbmRlcmVkSHRtbCgpIH1cXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgIDwvdWw+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGdldFNjcm9sbEJ1dHRvbkNzcyhmYWxzZSksIGNsaWNrOiBjbGlja1Njcm9sbEJ1dHRvbi5iaW5kKCRkYXRhLCAkZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLCBmYWxzZSlcXFwiIHJvbGU9XFxcImJ1dHRvblxcXCI+PC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBtb2RlbC5jc3MucHJvZ3Jlc3NcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBtb2RlbC5jc3MucHJvZ3Jlc3NCYXIsIHN0eWxlOnsgd2lkdGg6IG1vZGVsLnByb2dyZXNzVmFsdWUgKyAnJScgfVxcXCJcXG4gICAgICAgIHJvbGU9XFxcInByb2dyZXNzYmFyXFxcIiBhcmlhLXZhbHVlbWluPVxcXCIwXFxcIiBhcmlhLXZhbHVlbWF4PVxcXCIxMDBcXFwiPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiBtb2RlbC5wcm9ncmVzc1RleHQsIGNzczogbW9kZWwuY3NzLnByb2dyZXNzVGV4dCArICcgJyArIG1vZGVsLmNzcy5wcm9ncmVzc1RleHRJbkJhclxcXCI+PC9zcGFuPlxcbiAgICA8L2Rpdj5cXG4gICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiBtb2RlbC5wcm9ncmVzc1RleHQsIGNzczogbW9kZWwuY3NzLnByb2dyZXNzVGV4dCArICcgJyArIG1vZGVsLmNzcy5wcm9ncmVzc1RleHRVbmRlckJhclxcXCI+PC9zcGFuPlxcbjwvZGl2PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCJcIiArIHJlcXVpcmUoJy4vY29tbWVudC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9mbG93cGFuZWwuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vaGVhZGVyLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL2luZGV4Lmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3BhZ2UuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcGFuZWwuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcm93cy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9yb3cuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vc3RyaW5nLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3RpbWVycGFuZWwuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24uaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb250aXRsZS5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1ib29sZWFuLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWNoZWNrYm94Lmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLXJhbmtpbmcuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tY29tbWVudC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1jb21wb3NpdGUuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tY3VzdG9tLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWRyb3Bkb3duLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWVtcHR5Lmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWVycm9ycy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1leHByZXNzaW9uLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWZpbGUuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24taHRtbC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1pbWFnZS5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1pbWFnZXBpY2tlci5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1tYXRyaXguaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tbWF0cml4ZHluYW1pYy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1tdWx0aXBsZXRleHQuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tcGFuZWxkeW5hbWljLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3IuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tcmFkaW9ncm91cC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1yYXRpbmcuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tc2lnbmF0dXJlcGFkLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLXRleHQuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tYnV0dG9uZ3JvdXAuaHRtbCcpICsgXCJcIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBzdHlsZT1cXFwicG9zaXRpb246IGZpeGVkOyBib3R0b206IDNweDsgcmlnaHQ6IDEwcHg7IG1heC13aWR0aDogNjAlO1xcXCIgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy53aW5kb3cucm9vdFxcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy53aW5kb3cuaGVhZGVyLnJvb3RcXFwiPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjbGljazpkb0V4cGFuZFxcXCIgc3R5bGU9XFxcIndpZHRoOiAxMDAlOyBjdXJzb3I6IHBvaW50ZXI7XFxcIj5cXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cXFwicGFkZGluZy1yaWdodDoxMHB4XFxcIiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLndpbmRvdy5oZWFkZXIudGl0bGUsIHRleHQ6IGxvY1RpdGxlLmtvUmVuZGVyZWRIdG1sXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBrb0V4cGFuZGVkQ3NzXFxcIj48L3NwYW4+XFxuICAgICAgICA8L3NwYW4+XFxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInZpc2libGU6a29FeHBhbmRlZCwgY2xpY2s6ZG9FeHBhbmRcXFwiIHN0eWxlPVxcXCJmbG9hdDogcmlnaHQ7IGN1cnNvcjogcG9pbnRlcjtcXFwiPlxcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVxcXCJwYWRkaW5nLXJpZ2h0OjEwcHhcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBjc3Mud2luZG93LmhlYWRlci50aXRsZVxcXCI+WDwvc3Bhbj5cXG4gICAgICAgIDwvc3Bhbj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOmtvRXhwYW5kZWQsIGNzczogY3NzLndpbmRvdy5ib2R5XFxcIj5cXG4gICAgICAgIDxkaXYgaWQ9XFxcIndpbmRvd1N1cnZleUpTXFxcIj48L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XCI7IiwiLyohXG4gKiBTaWduYXR1cmUgUGFkIHYyLjMuMlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9zaWduYXR1cmVfcGFkXG4gKlxuICogQ29weXJpZ2h0IDIwMTcgU3p5bW9uIE5vd2FrXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqXG4gKiBUaGUgbWFpbiBpZGVhIGFuZCBzb21lIHBhcnRzIG9mIHRoZSBjb2RlIChlLmcuIGRyYXdpbmcgdmFyaWFibGUgd2lkdGggQsOpemllciBjdXJ2ZSkgYXJlIHRha2VuIGZyb206XG4gKiBodHRwOi8vY29ybmVyLnNxdWFyZXVwLmNvbS8yMDEyLzA3L3Ntb290aGVyLXNpZ25hdHVyZXMuaHRtbFxuICpcbiAqIEltcGxlbWVudGF0aW9uIG9mIGludGVycG9sYXRpb24gdXNpbmcgY3ViaWMgQsOpemllciBjdXJ2ZXMgaXMgdGFrZW4gZnJvbTpcbiAqIGh0dHA6Ly9iZW5rbm93c2NvZGUud29yZHByZXNzLmNvbS8yMDEyLzA5LzE0L3BhdGgtaW50ZXJwb2xhdGlvbi11c2luZy1jdWJpYy1iZXppZXItYW5kLWNvbnRyb2wtcG9pbnQtZXN0aW1hdGlvbi1pbi1qYXZhc2NyaXB0XG4gKlxuICogQWxnb3JpdGhtIGZvciBhcHByb3hpbWF0ZWQgbGVuZ3RoIG9mIGEgQsOpemllciBjdXJ2ZSBpcyB0YWtlbiBmcm9tOlxuICogaHR0cDovL3d3dy5sZW1vZGEubmV0L21hdGhzL2Jlemllci1sZW5ndGgvaW5kZXguaHRtbFxuICpcbiAqL1xuXG5mdW5jdGlvbiBQb2ludCh4LCB5LCB0aW1lKSB7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMueSA9IHk7XG4gIHRoaXMudGltZSA9IHRpbWUgfHwgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG59XG5cblBvaW50LnByb3RvdHlwZS52ZWxvY2l0eUZyb20gPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgcmV0dXJuIHRoaXMudGltZSAhPT0gc3RhcnQudGltZSA/IHRoaXMuZGlzdGFuY2VUbyhzdGFydCkgLyAodGhpcy50aW1lIC0gc3RhcnQudGltZSkgOiAxO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmRpc3RhbmNlVG8gPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0aGlzLnggLSBzdGFydC54LCAyKSArIE1hdGgucG93KHRoaXMueSAtIHN0YXJ0LnksIDIpKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgcmV0dXJuIHRoaXMueCA9PT0gb3RoZXIueCAmJiB0aGlzLnkgPT09IG90aGVyLnkgJiYgdGhpcy50aW1lID09PSBvdGhlci50aW1lO1xufTtcblxuZnVuY3Rpb24gQmV6aWVyKHN0YXJ0UG9pbnQsIGNvbnRyb2wxLCBjb250cm9sMiwgZW5kUG9pbnQpIHtcbiAgdGhpcy5zdGFydFBvaW50ID0gc3RhcnRQb2ludDtcbiAgdGhpcy5jb250cm9sMSA9IGNvbnRyb2wxO1xuICB0aGlzLmNvbnRyb2wyID0gY29udHJvbDI7XG4gIHRoaXMuZW5kUG9pbnQgPSBlbmRQb2ludDtcbn1cblxuLy8gUmV0dXJucyBhcHByb3hpbWF0ZWQgbGVuZ3RoLlxuQmV6aWVyLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGVwcyA9IDEwO1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgdmFyIHB4ID0gdm9pZCAwO1xuICB2YXIgcHkgPSB2b2lkIDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gc3RlcHM7IGkgKz0gMSkge1xuICAgIHZhciB0ID0gaSAvIHN0ZXBzO1xuICAgIHZhciBjeCA9IHRoaXMuX3BvaW50KHQsIHRoaXMuc3RhcnRQb2ludC54LCB0aGlzLmNvbnRyb2wxLngsIHRoaXMuY29udHJvbDIueCwgdGhpcy5lbmRQb2ludC54KTtcbiAgICB2YXIgY3kgPSB0aGlzLl9wb2ludCh0LCB0aGlzLnN0YXJ0UG9pbnQueSwgdGhpcy5jb250cm9sMS55LCB0aGlzLmNvbnRyb2wyLnksIHRoaXMuZW5kUG9pbnQueSk7XG4gICAgaWYgKGkgPiAwKSB7XG4gICAgICB2YXIgeGRpZmYgPSBjeCAtIHB4O1xuICAgICAgdmFyIHlkaWZmID0gY3kgLSBweTtcbiAgICAgIGxlbmd0aCArPSBNYXRoLnNxcnQoeGRpZmYgKiB4ZGlmZiArIHlkaWZmICogeWRpZmYpO1xuICAgIH1cbiAgICBweCA9IGN4O1xuICAgIHB5ID0gY3k7XG4gIH1cblxuICByZXR1cm4gbGVuZ3RoO1xufTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tbXVsdGktc3BhY2VzLCBzcGFjZS1pbi1wYXJlbnMgKi9cbkJlemllci5wcm90b3R5cGUuX3BvaW50ID0gZnVuY3Rpb24gKHQsIHN0YXJ0LCBjMSwgYzIsIGVuZCkge1xuICByZXR1cm4gc3RhcnQgKiAoMS4wIC0gdCkgKiAoMS4wIC0gdCkgKiAoMS4wIC0gdCkgKyAzLjAgKiBjMSAqICgxLjAgLSB0KSAqICgxLjAgLSB0KSAqIHQgKyAzLjAgKiBjMiAqICgxLjAgLSB0KSAqIHQgKiB0ICsgZW5kICogdCAqIHQgKiB0O1xufTtcblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjcwNzg0MDEvODE1NTA3XG5mdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gIHZhciB0aW1lb3V0ID0gbnVsbDtcbiAgdmFyIHByZXZpb3VzID0gMDtcbiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gIHZhciBsYXRlciA9IGZ1bmN0aW9uIGxhdGVyKCkge1xuICAgIHByZXZpb3VzID0gb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSA/IDAgOiBEYXRlLm5vdygpO1xuICAgIHRpbWVvdXQgPSBudWxsO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gIH07XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKCFwcmV2aW91cyAmJiBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlKSBwcmV2aW91cyA9IG5vdztcbiAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgY29udGV4dCA9IHRoaXM7XG4gICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gd2FpdCkge1xuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzID0gbm93O1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoIXRpbWVvdXQgJiYgb3B0aW9ucy50cmFpbGluZyAhPT0gZmFsc2UpIHtcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5mdW5jdGlvbiBTaWduYXR1cmVQYWQoY2FudmFzLCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHRoaXMudmVsb2NpdHlGaWx0ZXJXZWlnaHQgPSBvcHRzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0IHx8IDAuNztcbiAgdGhpcy5taW5XaWR0aCA9IG9wdHMubWluV2lkdGggfHwgMC41O1xuICB0aGlzLm1heFdpZHRoID0gb3B0cy5tYXhXaWR0aCB8fCAyLjU7XG4gIHRoaXMudGhyb3R0bGUgPSAndGhyb3R0bGUnIGluIG9wdHMgPyBvcHRzLnRocm90dGxlIDogMTY7IC8vIGluIG1pbGlzZWNvbmRzXG4gIHRoaXMubWluRGlzdGFuY2UgPSAnbWluRGlzdGFuY2UnIGluIG9wdHMgPyBvcHRzLm1pbkRpc3RhbmNlIDogNTtcblxuICBpZiAodGhpcy50aHJvdHRsZSkge1xuICAgIHRoaXMuX3N0cm9rZU1vdmVVcGRhdGUgPSB0aHJvdHRsZShTaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VVcGRhdGUsIHRoaXMudGhyb3R0bGUpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX3N0cm9rZU1vdmVVcGRhdGUgPSBTaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VVcGRhdGU7XG4gIH1cblxuICB0aGlzLmRvdFNpemUgPSBvcHRzLmRvdFNpemUgfHwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAodGhpcy5taW5XaWR0aCArIHRoaXMubWF4V2lkdGgpIC8gMjtcbiAgfTtcbiAgdGhpcy5wZW5Db2xvciA9IG9wdHMucGVuQ29sb3IgfHwgJ2JsYWNrJztcbiAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBvcHRzLmJhY2tncm91bmRDb2xvciB8fCAncmdiYSgwLDAsMCwwKSc7XG4gIHRoaXMub25CZWdpbiA9IG9wdHMub25CZWdpbjtcbiAgdGhpcy5vbkVuZCA9IG9wdHMub25FbmQ7XG5cbiAgdGhpcy5fY2FudmFzID0gY2FudmFzO1xuICB0aGlzLl9jdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgdGhpcy5jbGVhcigpO1xuXG4gIC8vIFdlIG5lZWQgYWRkIHRoZXNlIGlubGluZSBzbyB0aGV5IGFyZSBhdmFpbGFibGUgdG8gdW5iaW5kIHdoaWxlIHN0aWxsIGhhdmluZ1xuICAvLyBhY2Nlc3MgdG8gJ3NlbGYnIHdlIGNvdWxkIHVzZSBfLmJpbmQgYnV0IGl0J3Mgbm90IHdvcnRoIGFkZGluZyBhIGRlcGVuZGVuY3kuXG4gIHRoaXMuX2hhbmRsZU1vdXNlRG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC53aGljaCA9PT0gMSkge1xuICAgICAgc2VsZi5fbW91c2VCdXR0b25Eb3duID0gdHJ1ZTtcbiAgICAgIHNlbGYuX3N0cm9rZUJlZ2luKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKHNlbGYuX21vdXNlQnV0dG9uRG93bikge1xuICAgICAgc2VsZi5fc3Ryb2tlTW92ZVVwZGF0ZShldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuX2hhbmRsZU1vdXNlVXAgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDEgJiYgc2VsZi5fbW91c2VCdXR0b25Eb3duKSB7XG4gICAgICBzZWxmLl9tb3VzZUJ1dHRvbkRvd24gPSBmYWxzZTtcbiAgICAgIHNlbGYuX3N0cm9rZUVuZChldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuX2hhbmRsZVRvdWNoU3RhcnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0VG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdO1xuICAgICAgc2VsZi5fc3Ryb2tlQmVnaW4odG91Y2gpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLl9oYW5kbGVUb3VjaE1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBQcmV2ZW50IHNjcm9sbGluZy5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdmFyIHRvdWNoID0gZXZlbnQudGFyZ2V0VG91Y2hlc1swXTtcbiAgICBzZWxmLl9zdHJva2VNb3ZlVXBkYXRlKHRvdWNoKTtcbiAgfTtcblxuICB0aGlzLl9oYW5kbGVUb3VjaEVuZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciB3YXNDYW52YXNUb3VjaGVkID0gZXZlbnQudGFyZ2V0ID09PSBzZWxmLl9jYW52YXM7XG4gICAgaWYgKHdhc0NhbnZhc1RvdWNoZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZWxmLl9zdHJva2VFbmQoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICAvLyBFbmFibGUgbW91c2UgYW5kIHRvdWNoIGV2ZW50IGhhbmRsZXJzXG4gIHRoaXMub24oKTtcbn1cblxuLy8gUHVibGljIG1ldGhvZHNcblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gIHZhciBjYW52YXMgPSB0aGlzLl9jYW52YXM7XG5cbiAgY3R4LmZpbGxTdHlsZSA9IHRoaXMuYmFja2dyb3VuZENvbG9yO1xuICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gIGN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuXG4gIHRoaXMuX2RhdGEgPSBbXTtcbiAgdGhpcy5fcmVzZXQoKTtcbiAgdGhpcy5faXNFbXB0eSA9IHRydWU7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmZyb21EYXRhVVJMID0gZnVuY3Rpb24gKGRhdGFVcmwpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XG4gIHZhciByYXRpbyA9IG9wdGlvbnMucmF0aW8gfHwgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgdmFyIHdpZHRoID0gb3B0aW9ucy53aWR0aCB8fCB0aGlzLl9jYW52YXMud2lkdGggLyByYXRpbztcbiAgdmFyIGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0IHx8IHRoaXMuX2NhbnZhcy5oZWlnaHQgLyByYXRpbztcblxuICB0aGlzLl9yZXNldCgpO1xuICBpbWFnZS5zcmMgPSBkYXRhVXJsO1xuICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMuX2N0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICB9O1xuICB0aGlzLl9pc0VtcHR5ID0gZmFsc2U7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLnRvRGF0YVVSTCA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHZhciBfY2FudmFzO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2ltYWdlL3N2Zyt4bWwnOlxuICAgICAgcmV0dXJuIHRoaXMuX3RvU1ZHKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBvcHRpb25zID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBvcHRpb25zW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChfY2FudmFzID0gdGhpcy5fY2FudmFzKS50b0RhdGFVUkwuYXBwbHkoX2NhbnZhcywgW3R5cGVdLmNvbmNhdChvcHRpb25zKSk7XG4gIH1cbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2hhbmRsZU1vdXNlRXZlbnRzKCk7XG4gIHRoaXMuX2hhbmRsZVRvdWNoRXZlbnRzKCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX2hhbmRsZU1vdXNlRG93bik7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVNb3VzZU1vdmUpO1xuICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5faGFuZGxlTW91c2VVcCk7XG5cbiAgdGhpcy5fY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0KTtcbiAgdGhpcy5fY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX2hhbmRsZVRvdWNoTW92ZSk7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2hhbmRsZVRvdWNoRW5kKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX2lzRW1wdHk7XG59O1xuXG4vLyBQcml2YXRlIG1ldGhvZHNcblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3N0cm9rZUJlZ2luID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHRoaXMuX2RhdGEucHVzaChbXSk7XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuX3N0cm9rZVVwZGF0ZShldmVudCk7XG5cbiAgaWYgKHR5cGVvZiB0aGlzLm9uQmVnaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLm9uQmVnaW4oZXZlbnQpO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VVcGRhdGUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIHggPSBldmVudC5jbGllbnRYO1xuICB2YXIgeSA9IGV2ZW50LmNsaWVudFk7XG5cbiAgdmFyIHBvaW50ID0gdGhpcy5fY3JlYXRlUG9pbnQoeCwgeSk7XG4gIHZhciBsYXN0UG9pbnRHcm91cCA9IHRoaXMuX2RhdGFbdGhpcy5fZGF0YS5sZW5ndGggLSAxXTtcbiAgdmFyIGxhc3RQb2ludCA9IGxhc3RQb2ludEdyb3VwICYmIGxhc3RQb2ludEdyb3VwW2xhc3RQb2ludEdyb3VwLmxlbmd0aCAtIDFdO1xuICB2YXIgaXNMYXN0UG9pbnRUb29DbG9zZSA9IGxhc3RQb2ludCAmJiBwb2ludC5kaXN0YW5jZVRvKGxhc3RQb2ludCkgPCB0aGlzLm1pbkRpc3RhbmNlO1xuXG4gIC8vIFNraXAgdGhpcyBwb2ludCBpZiBpdCdzIHRvbyBjbG9zZSB0byB0aGUgcHJldmlvdXMgb25lXG4gIGlmICghKGxhc3RQb2ludCAmJiBpc0xhc3RQb2ludFRvb0Nsb3NlKSkge1xuICAgIHZhciBfYWRkUG9pbnQgPSB0aGlzLl9hZGRQb2ludChwb2ludCksXG4gICAgICAgIGN1cnZlID0gX2FkZFBvaW50LmN1cnZlLFxuICAgICAgICB3aWR0aHMgPSBfYWRkUG9pbnQud2lkdGhzO1xuXG4gICAgaWYgKGN1cnZlICYmIHdpZHRocykge1xuICAgICAgdGhpcy5fZHJhd0N1cnZlKGN1cnZlLCB3aWR0aHMuc3RhcnQsIHdpZHRocy5lbmQpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGFbdGhpcy5fZGF0YS5sZW5ndGggLSAxXS5wdXNoKHtcbiAgICAgIHg6IHBvaW50LngsXG4gICAgICB5OiBwb2ludC55LFxuICAgICAgdGltZTogcG9pbnQudGltZSxcbiAgICAgIGNvbG9yOiB0aGlzLnBlbkNvbG9yXG4gICAgfSk7XG4gIH1cbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3N0cm9rZUVuZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICB2YXIgY2FuRHJhd0N1cnZlID0gdGhpcy5wb2ludHMubGVuZ3RoID4gMjtcbiAgdmFyIHBvaW50ID0gdGhpcy5wb2ludHNbMF07IC8vIFBvaW50IGluc3RhbmNlXG5cbiAgaWYgKCFjYW5EcmF3Q3VydmUgJiYgcG9pbnQpIHtcbiAgICB0aGlzLl9kcmF3RG90KHBvaW50KTtcbiAgfVxuXG4gIGlmIChwb2ludCkge1xuICAgIHZhciBsYXN0UG9pbnRHcm91cCA9IHRoaXMuX2RhdGFbdGhpcy5fZGF0YS5sZW5ndGggLSAxXTtcbiAgICB2YXIgbGFzdFBvaW50ID0gbGFzdFBvaW50R3JvdXBbbGFzdFBvaW50R3JvdXAubGVuZ3RoIC0gMV07IC8vIHBsYWluIG9iamVjdFxuXG4gICAgLy8gV2hlbiBkcmF3aW5nIGEgZG90LCB0aGVyZSdzIG9ubHkgb25lIHBvaW50IGluIGEgZ3JvdXAsIHNvIHdpdGhvdXQgdGhpcyBjaGVja1xuICAgIC8vIHN1Y2ggZ3JvdXAgd291bGQgZW5kIHVwIHdpdGggZXhhY3RseSB0aGUgc2FtZSAyIHBvaW50cy5cbiAgICBpZiAoIXBvaW50LmVxdWFscyhsYXN0UG9pbnQpKSB7XG4gICAgICBsYXN0UG9pbnRHcm91cC5wdXNoKHtcbiAgICAgICAgeDogcG9pbnQueCxcbiAgICAgICAgeTogcG9pbnQueSxcbiAgICAgICAgdGltZTogcG9pbnQudGltZSxcbiAgICAgICAgY29sb3I6IHRoaXMucGVuQ29sb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdGhpcy5vbkVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMub25FbmQoZXZlbnQpO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9oYW5kbGVNb3VzZUV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fbW91c2VCdXR0b25Eb3duID0gZmFsc2U7XG5cbiAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX2hhbmRsZU1vdXNlRG93bik7XG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVNb3VzZU1vdmUpO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5faGFuZGxlTW91c2VVcCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9oYW5kbGVUb3VjaEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gUGFzcyB0b3VjaCBldmVudHMgdG8gY2FudmFzIGVsZW1lbnQgb24gbW9iaWxlIElFMTEgYW5kIEVkZ2UuXG4gIHRoaXMuX2NhbnZhcy5zdHlsZS5tc1RvdWNoQWN0aW9uID0gJ25vbmUnO1xuICB0aGlzLl9jYW52YXMuc3R5bGUudG91Y2hBY3Rpb24gPSAnbm9uZSc7XG5cbiAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0KTtcbiAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX2hhbmRsZVRvdWNoTW92ZSk7XG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2hhbmRsZVRvdWNoRW5kKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3Jlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnBvaW50cyA9IFtdO1xuICB0aGlzLl9sYXN0VmVsb2NpdHkgPSAwO1xuICB0aGlzLl9sYXN0V2lkdGggPSAodGhpcy5taW5XaWR0aCArIHRoaXMubWF4V2lkdGgpIC8gMjtcbiAgdGhpcy5fY3R4LmZpbGxTdHlsZSA9IHRoaXMucGVuQ29sb3I7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9jcmVhdGVQb2ludCA9IGZ1bmN0aW9uICh4LCB5LCB0aW1lKSB7XG4gIHZhciByZWN0ID0gdGhpcy5fY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIHJldHVybiBuZXcgUG9pbnQoeCAtIHJlY3QubGVmdCwgeSAtIHJlY3QudG9wLCB0aW1lIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2FkZFBvaW50ID0gZnVuY3Rpb24gKHBvaW50KSB7XG4gIHZhciBwb2ludHMgPSB0aGlzLnBvaW50cztcbiAgdmFyIHRtcCA9IHZvaWQgMDtcblxuICBwb2ludHMucHVzaChwb2ludCk7XG5cbiAgaWYgKHBvaW50cy5sZW5ndGggPiAyKSB7XG4gICAgLy8gVG8gcmVkdWNlIHRoZSBpbml0aWFsIGxhZyBtYWtlIGl0IHdvcmsgd2l0aCAzIHBvaW50c1xuICAgIC8vIGJ5IGNvcHlpbmcgdGhlIGZpcnN0IHBvaW50IHRvIHRoZSBiZWdpbm5pbmcuXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPT09IDMpIHBvaW50cy51bnNoaWZ0KHBvaW50c1swXSk7XG5cbiAgICB0bXAgPSB0aGlzLl9jYWxjdWxhdGVDdXJ2ZUNvbnRyb2xQb2ludHMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSk7XG4gICAgdmFyIGMyID0gdG1wLmMyO1xuICAgIHRtcCA9IHRoaXMuX2NhbGN1bGF0ZUN1cnZlQ29udHJvbFBvaW50cyhwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdKTtcbiAgICB2YXIgYzMgPSB0bXAuYzE7XG4gICAgdmFyIGN1cnZlID0gbmV3IEJlemllcihwb2ludHNbMV0sIGMyLCBjMywgcG9pbnRzWzJdKTtcbiAgICB2YXIgd2lkdGhzID0gdGhpcy5fY2FsY3VsYXRlQ3VydmVXaWR0aHMoY3VydmUpO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGxpc3QsXG4gICAgLy8gc28gdGhhdCB3ZSBhbHdheXMgaGF2ZSBubyBtb3JlIHRoYW4gNCBwb2ludHMgaW4gcG9pbnRzIGFycmF5LlxuICAgIHBvaW50cy5zaGlmdCgpO1xuXG4gICAgcmV0dXJuIHsgY3VydmU6IGN1cnZlLCB3aWR0aHM6IHdpZHRocyB9O1xuICB9XG5cbiAgcmV0dXJuIHt9O1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fY2FsY3VsYXRlQ3VydmVDb250cm9sUG9pbnRzID0gZnVuY3Rpb24gKHMxLCBzMiwgczMpIHtcbiAgdmFyIGR4MSA9IHMxLnggLSBzMi54O1xuICB2YXIgZHkxID0gczEueSAtIHMyLnk7XG4gIHZhciBkeDIgPSBzMi54IC0gczMueDtcbiAgdmFyIGR5MiA9IHMyLnkgLSBzMy55O1xuXG4gIHZhciBtMSA9IHsgeDogKHMxLnggKyBzMi54KSAvIDIuMCwgeTogKHMxLnkgKyBzMi55KSAvIDIuMCB9O1xuICB2YXIgbTIgPSB7IHg6IChzMi54ICsgczMueCkgLyAyLjAsIHk6IChzMi55ICsgczMueSkgLyAyLjAgfTtcblxuICB2YXIgbDEgPSBNYXRoLnNxcnQoZHgxICogZHgxICsgZHkxICogZHkxKTtcbiAgdmFyIGwyID0gTWF0aC5zcXJ0KGR4MiAqIGR4MiArIGR5MiAqIGR5Mik7XG5cbiAgdmFyIGR4bSA9IG0xLnggLSBtMi54O1xuICB2YXIgZHltID0gbTEueSAtIG0yLnk7XG5cbiAgdmFyIGsgPSBsMiAvIChsMSArIGwyKTtcbiAgdmFyIGNtID0geyB4OiBtMi54ICsgZHhtICogaywgeTogbTIueSArIGR5bSAqIGsgfTtcblxuICB2YXIgdHggPSBzMi54IC0gY20ueDtcbiAgdmFyIHR5ID0gczIueSAtIGNtLnk7XG5cbiAgcmV0dXJuIHtcbiAgICBjMTogbmV3IFBvaW50KG0xLnggKyB0eCwgbTEueSArIHR5KSxcbiAgICBjMjogbmV3IFBvaW50KG0yLnggKyB0eCwgbTIueSArIHR5KVxuICB9O1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fY2FsY3VsYXRlQ3VydmVXaWR0aHMgPSBmdW5jdGlvbiAoY3VydmUpIHtcbiAgdmFyIHN0YXJ0UG9pbnQgPSBjdXJ2ZS5zdGFydFBvaW50O1xuICB2YXIgZW5kUG9pbnQgPSBjdXJ2ZS5lbmRQb2ludDtcbiAgdmFyIHdpZHRocyA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuXG4gIHZhciB2ZWxvY2l0eSA9IHRoaXMudmVsb2NpdHlGaWx0ZXJXZWlnaHQgKiBlbmRQb2ludC52ZWxvY2l0eUZyb20oc3RhcnRQb2ludCkgKyAoMSAtIHRoaXMudmVsb2NpdHlGaWx0ZXJXZWlnaHQpICogdGhpcy5fbGFzdFZlbG9jaXR5O1xuXG4gIHZhciBuZXdXaWR0aCA9IHRoaXMuX3N0cm9rZVdpZHRoKHZlbG9jaXR5KTtcblxuICB3aWR0aHMuc3RhcnQgPSB0aGlzLl9sYXN0V2lkdGg7XG4gIHdpZHRocy5lbmQgPSBuZXdXaWR0aDtcblxuICB0aGlzLl9sYXN0VmVsb2NpdHkgPSB2ZWxvY2l0eTtcbiAgdGhpcy5fbGFzdFdpZHRoID0gbmV3V2lkdGg7XG5cbiAgcmV0dXJuIHdpZHRocztcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3N0cm9rZVdpZHRoID0gZnVuY3Rpb24gKHZlbG9jaXR5KSB7XG4gIHJldHVybiBNYXRoLm1heCh0aGlzLm1heFdpZHRoIC8gKHZlbG9jaXR5ICsgMSksIHRoaXMubWluV2lkdGgpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fZHJhd1BvaW50ID0gZnVuY3Rpb24gKHgsIHksIHNpemUpIHtcbiAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcblxuICBjdHgubW92ZVRvKHgsIHkpO1xuICBjdHguYXJjKHgsIHksIHNpemUsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7XG4gIHRoaXMuX2lzRW1wdHkgPSBmYWxzZTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2RyYXdDdXJ2ZSA9IGZ1bmN0aW9uIChjdXJ2ZSwgc3RhcnRXaWR0aCwgZW5kV2lkdGgpIHtcbiAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcbiAgdmFyIHdpZHRoRGVsdGEgPSBlbmRXaWR0aCAtIHN0YXJ0V2lkdGg7XG4gIHZhciBkcmF3U3RlcHMgPSBNYXRoLmZsb29yKGN1cnZlLmxlbmd0aCgpKTtcblxuICBjdHguYmVnaW5QYXRoKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkcmF3U3RlcHM7IGkgKz0gMSkge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgQmV6aWVyICh4LCB5KSBjb29yZGluYXRlIGZvciB0aGlzIHN0ZXAuXG4gICAgdmFyIHQgPSBpIC8gZHJhd1N0ZXBzO1xuICAgIHZhciB0dCA9IHQgKiB0O1xuICAgIHZhciB0dHQgPSB0dCAqIHQ7XG4gICAgdmFyIHUgPSAxIC0gdDtcbiAgICB2YXIgdXUgPSB1ICogdTtcbiAgICB2YXIgdXV1ID0gdXUgKiB1O1xuXG4gICAgdmFyIHggPSB1dXUgKiBjdXJ2ZS5zdGFydFBvaW50Lng7XG4gICAgeCArPSAzICogdXUgKiB0ICogY3VydmUuY29udHJvbDEueDtcbiAgICB4ICs9IDMgKiB1ICogdHQgKiBjdXJ2ZS5jb250cm9sMi54O1xuICAgIHggKz0gdHR0ICogY3VydmUuZW5kUG9pbnQueDtcblxuICAgIHZhciB5ID0gdXV1ICogY3VydmUuc3RhcnRQb2ludC55O1xuICAgIHkgKz0gMyAqIHV1ICogdCAqIGN1cnZlLmNvbnRyb2wxLnk7XG4gICAgeSArPSAzICogdSAqIHR0ICogY3VydmUuY29udHJvbDIueTtcbiAgICB5ICs9IHR0dCAqIGN1cnZlLmVuZFBvaW50Lnk7XG5cbiAgICB2YXIgd2lkdGggPSBzdGFydFdpZHRoICsgdHR0ICogd2lkdGhEZWx0YTtcbiAgICB0aGlzLl9kcmF3UG9pbnQoeCwgeSwgd2lkdGgpO1xuICB9XG5cbiAgY3R4LmNsb3NlUGF0aCgpO1xuICBjdHguZmlsbCgpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fZHJhd0RvdCA9IGZ1bmN0aW9uIChwb2ludCkge1xuICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuICB2YXIgd2lkdGggPSB0eXBlb2YgdGhpcy5kb3RTaXplID09PSAnZnVuY3Rpb24nID8gdGhpcy5kb3RTaXplKCkgOiB0aGlzLmRvdFNpemU7XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuICB0aGlzLl9kcmF3UG9pbnQocG9pbnQueCwgcG9pbnQueSwgd2lkdGgpO1xuICBjdHguY2xvc2VQYXRoKCk7XG4gIGN0eC5maWxsKCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9mcm9tRGF0YSA9IGZ1bmN0aW9uIChwb2ludEdyb3VwcywgZHJhd0N1cnZlLCBkcmF3RG90KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRHcm91cHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgZ3JvdXAgPSBwb2ludEdyb3Vwc1tpXTtcblxuICAgIGlmIChncm91cC5sZW5ndGggPiAxKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdyb3VwLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIHZhciByYXdQb2ludCA9IGdyb3VwW2pdO1xuICAgICAgICB2YXIgcG9pbnQgPSBuZXcgUG9pbnQocmF3UG9pbnQueCwgcmF3UG9pbnQueSwgcmF3UG9pbnQudGltZSk7XG4gICAgICAgIHZhciBjb2xvciA9IHJhd1BvaW50LmNvbG9yO1xuXG4gICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgLy8gRmlyc3QgcG9pbnQgaW4gYSBncm91cC4gTm90aGluZyB0byBkcmF3IHlldC5cblxuICAgICAgICAgIC8vIEFsbCBwb2ludHMgaW4gdGhlIGdyb3VwIGhhdmUgdGhlIHNhbWUgY29sb3IsIHNvIGl0J3MgZW5vdWdoIHRvIHNldFxuICAgICAgICAgIC8vIHBlbkNvbG9yIGp1c3QgYXQgdGhlIGJlZ2lubmluZy5cbiAgICAgICAgICB0aGlzLnBlbkNvbG9yID0gY29sb3I7XG4gICAgICAgICAgdGhpcy5fcmVzZXQoKTtcblxuICAgICAgICAgIHRoaXMuX2FkZFBvaW50KHBvaW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChqICE9PSBncm91cC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgLy8gTWlkZGxlIHBvaW50IGluIGEgZ3JvdXAuXG4gICAgICAgICAgdmFyIF9hZGRQb2ludDIgPSB0aGlzLl9hZGRQb2ludChwb2ludCksXG4gICAgICAgICAgICAgIGN1cnZlID0gX2FkZFBvaW50Mi5jdXJ2ZSxcbiAgICAgICAgICAgICAgd2lkdGhzID0gX2FkZFBvaW50Mi53aWR0aHM7XG5cbiAgICAgICAgICBpZiAoY3VydmUgJiYgd2lkdGhzKSB7XG4gICAgICAgICAgICBkcmF3Q3VydmUoY3VydmUsIHdpZHRocywgY29sb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBMYXN0IHBvaW50IGluIGEgZ3JvdXAuIERvIG5vdGhpbmcuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVzZXQoKTtcbiAgICAgIHZhciBfcmF3UG9pbnQgPSBncm91cFswXTtcbiAgICAgIGRyYXdEb3QoX3Jhd1BvaW50KTtcbiAgICB9XG4gIH1cbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX3RvU1ZHID0gZnVuY3Rpb24gKCkge1xuICB2YXIgX3RoaXMyID0gdGhpcztcblxuICB2YXIgcG9pbnRHcm91cHMgPSB0aGlzLl9kYXRhO1xuICB2YXIgY2FudmFzID0gdGhpcy5fY2FudmFzO1xuICB2YXIgcmF0aW8gPSBNYXRoLm1heCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxLCAxKTtcbiAgdmFyIG1pblggPSAwO1xuICB2YXIgbWluWSA9IDA7XG4gIHZhciBtYXhYID0gY2FudmFzLndpZHRoIC8gcmF0aW87XG4gIHZhciBtYXhZID0gY2FudmFzLmhlaWdodCAvIHJhdGlvO1xuICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcblxuICBzdmcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3dpZHRoJywgY2FudmFzLndpZHRoKTtcbiAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICdoZWlnaHQnLCBjYW52YXMuaGVpZ2h0KTtcblxuICB0aGlzLl9mcm9tRGF0YShwb2ludEdyb3VwcywgZnVuY3Rpb24gKGN1cnZlLCB3aWR0aHMsIGNvbG9yKSB7XG4gICAgdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwYXRoJyk7XG5cbiAgICAvLyBOZWVkIHRvIGNoZWNrIGN1cnZlIGZvciBOYU4gdmFsdWVzLCB0aGVzZSBwb3AgdXAgd2hlbiBkcmF3aW5nXG4gICAgLy8gbGluZXMgb24gdGhlIGNhbnZhcyB0aGF0IGFyZSBub3QgY29udGludW91cy4gRS5nLiBTaGFycCBjb3JuZXJzXG4gICAgLy8gb3Igc3RvcHBpbmcgbWlkLXN0cm9rZSBhbmQgdGhhbiBjb250aW51aW5nIHdpdGhvdXQgbGlmdGluZyBtb3VzZS5cbiAgICBpZiAoIWlzTmFOKGN1cnZlLmNvbnRyb2wxLngpICYmICFpc05hTihjdXJ2ZS5jb250cm9sMS55KSAmJiAhaXNOYU4oY3VydmUuY29udHJvbDIueCkgJiYgIWlzTmFOKGN1cnZlLmNvbnRyb2wyLnkpKSB7XG4gICAgICB2YXIgYXR0ciA9ICdNICcgKyBjdXJ2ZS5zdGFydFBvaW50LngudG9GaXhlZCgzKSArICcsJyArIGN1cnZlLnN0YXJ0UG9pbnQueS50b0ZpeGVkKDMpICsgJyAnICsgKCdDICcgKyBjdXJ2ZS5jb250cm9sMS54LnRvRml4ZWQoMykgKyAnLCcgKyBjdXJ2ZS5jb250cm9sMS55LnRvRml4ZWQoMykgKyAnICcpICsgKGN1cnZlLmNvbnRyb2wyLngudG9GaXhlZCgzKSArICcsJyArIGN1cnZlLmNvbnRyb2wyLnkudG9GaXhlZCgzKSArICcgJykgKyAoY3VydmUuZW5kUG9pbnQueC50b0ZpeGVkKDMpICsgJywnICsgY3VydmUuZW5kUG9pbnQueS50b0ZpeGVkKDMpKTtcblxuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ2QnLCBhdHRyKTtcbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAod2lkdGhzLmVuZCAqIDIuMjUpLnRvRml4ZWQoMykpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGNvbG9yKTtcbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWNhcCcsICdyb3VuZCcpO1xuXG4gICAgICBzdmcuYXBwZW5kQ2hpbGQocGF0aCk7XG4gICAgfVxuICB9LCBmdW5jdGlvbiAocmF3UG9pbnQpIHtcbiAgICB2YXIgY2lyY2xlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2lyY2xlJyk7XG4gICAgdmFyIGRvdFNpemUgPSB0eXBlb2YgX3RoaXMyLmRvdFNpemUgPT09ICdmdW5jdGlvbicgPyBfdGhpczIuZG90U2l6ZSgpIDogX3RoaXMyLmRvdFNpemU7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgncicsIGRvdFNpemUpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N4JywgcmF3UG9pbnQueCk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnY3knLCByYXdQb2ludC55KTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCdmaWxsJywgcmF3UG9pbnQuY29sb3IpO1xuXG4gICAgc3ZnLmFwcGVuZENoaWxkKGNpcmNsZSk7XG4gIH0pO1xuXG4gIHZhciBwcmVmaXggPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwnO1xuICB2YXIgaGVhZGVyID0gJzxzdmcnICsgJyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCInICsgJyB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIicgKyAoJyB2aWV3Qm94PVwiJyArIG1pblggKyAnICcgKyBtaW5ZICsgJyAnICsgbWF4WCArICcgJyArIG1heFkgKyAnXCInKSArICgnIHdpZHRoPVwiJyArIG1heFggKyAnXCInKSArICgnIGhlaWdodD1cIicgKyBtYXhZICsgJ1wiJykgKyAnPic7XG4gIHZhciBib2R5ID0gc3ZnLmlubmVySFRNTDtcblxuICAvLyBJRSBoYWNrIGZvciBtaXNzaW5nIGlubmVySFRNTCBwcm9wZXJ0eSBvbiBTVkdFbGVtZW50XG4gIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkdW1teScpO1xuICAgIHZhciBub2RlcyA9IHN2Zy5jaGlsZE5vZGVzO1xuICAgIGR1bW15LmlubmVySFRNTCA9ICcnO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgZHVtbXkuYXBwZW5kQ2hpbGQobm9kZXNbaV0uY2xvbmVOb2RlKHRydWUpKTtcbiAgICB9XG5cbiAgICBib2R5ID0gZHVtbXkuaW5uZXJIVE1MO1xuICB9XG5cbiAgdmFyIGZvb3RlciA9ICc8L3N2Zz4nO1xuICB2YXIgZGF0YSA9IGhlYWRlciArIGJvZHkgKyBmb290ZXI7XG5cbiAgcmV0dXJuIHByZWZpeCArIGJ0b2EoZGF0YSk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmZyb21EYXRhID0gZnVuY3Rpb24gKHBvaW50R3JvdXBzKSB7XG4gIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gIHRoaXMuY2xlYXIoKTtcblxuICB0aGlzLl9mcm9tRGF0YShwb2ludEdyb3VwcywgZnVuY3Rpb24gKGN1cnZlLCB3aWR0aHMpIHtcbiAgICByZXR1cm4gX3RoaXMzLl9kcmF3Q3VydmUoY3VydmUsIHdpZHRocy5zdGFydCwgd2lkdGhzLmVuZCk7XG4gIH0sIGZ1bmN0aW9uIChyYXdQb2ludCkge1xuICAgIHJldHVybiBfdGhpczMuX2RyYXdEb3QocmF3UG9pbnQpO1xuICB9KTtcblxuICB0aGlzLl9kYXRhID0gcG9pbnRHcm91cHM7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLnRvRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX2RhdGE7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTaWduYXR1cmVQYWQ7XG4iLCIvKiohXG4gKiBTb3J0YWJsZSAxLjEzLjBcbiAqIEBhdXRob3JcdFJ1YmFYYSAgIDx0cmFzaEBydWJheGEub3JnPlxuICogQGF1dGhvclx0b3dlbm0gICAgPG93ZW4yMzM1NUBnbWFpbC5jb20+XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuXG4gIHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTtcblxuICB2YXIga2V5LCBpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTtcbiAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gICAgcmV0dXJuIGFycjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xufVxuXG52YXIgdmVyc2lvbiA9IFwiMS4xMy4wXCI7XG5cbmZ1bmN0aW9uIHVzZXJBZ2VudChwYXR0ZXJuKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubmF2aWdhdG9yKSB7XG4gICAgcmV0dXJuICEhXG4gICAgLypAX19QVVJFX18qL1xuICAgIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2gocGF0dGVybik7XG4gIH1cbn1cblxudmFyIElFMTFPckxlc3MgPSB1c2VyQWdlbnQoLyg/OlRyaWRlbnQuKnJ2WyA6XT8xMVxcLnxtc2llfGllbW9iaWxlfFdpbmRvd3MgUGhvbmUpL2kpO1xudmFyIEVkZ2UgPSB1c2VyQWdlbnQoL0VkZ2UvaSk7XG52YXIgRmlyZUZveCA9IHVzZXJBZ2VudCgvZmlyZWZveC9pKTtcbnZhciBTYWZhcmkgPSB1c2VyQWdlbnQoL3NhZmFyaS9pKSAmJiAhdXNlckFnZW50KC9jaHJvbWUvaSkgJiYgIXVzZXJBZ2VudCgvYW5kcm9pZC9pKTtcbnZhciBJT1MgPSB1c2VyQWdlbnQoL2lQKGFkfG9kfGhvbmUpL2kpO1xudmFyIENocm9tZUZvckFuZHJvaWQgPSB1c2VyQWdlbnQoL2Nocm9tZS9pKSAmJiB1c2VyQWdlbnQoL2FuZHJvaWQvaSk7XG5cbnZhciBjYXB0dXJlTW9kZSA9IHtcbiAgY2FwdHVyZTogZmFsc2UsXG4gIHBhc3NpdmU6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBvbihlbCwgZXZlbnQsIGZuKSB7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCAhSUUxMU9yTGVzcyAmJiBjYXB0dXJlTW9kZSk7XG59XG5cbmZ1bmN0aW9uIG9mZihlbCwgZXZlbnQsIGZuKSB7XG4gIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCAhSUUxMU9yTGVzcyAmJiBjYXB0dXJlTW9kZSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXMoXG4vKipIVE1MRWxlbWVudCovXG5lbCxcbi8qKlN0cmluZyovXG5zZWxlY3Rvcikge1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm47XG4gIHNlbGVjdG9yWzBdID09PSAnPicgJiYgKHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyaW5nKDEpKTtcblxuICBpZiAoZWwpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGVsLm1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIGVsLm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmIChlbC5tc01hdGNoZXNTZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZWwubXNNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmIChlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50T3JIb3N0KGVsKSB7XG4gIHJldHVybiBlbC5ob3N0ICYmIGVsICE9PSBkb2N1bWVudCAmJiBlbC5ob3N0Lm5vZGVUeXBlID8gZWwuaG9zdCA6IGVsLnBhcmVudE5vZGU7XG59XG5cbmZ1bmN0aW9uIGNsb3Nlc3QoXG4vKipIVE1MRWxlbWVudCovXG5lbCxcbi8qKlN0cmluZyovXG5zZWxlY3Rvcixcbi8qKkhUTUxFbGVtZW50Ki9cbmN0eCwgaW5jbHVkZUNUWCkge1xuICBpZiAoZWwpIHtcbiAgICBjdHggPSBjdHggfHwgZG9jdW1lbnQ7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCAmJiAoc2VsZWN0b3JbMF0gPT09ICc+JyA/IGVsLnBhcmVudE5vZGUgPT09IGN0eCAmJiBtYXRjaGVzKGVsLCBzZWxlY3RvcikgOiBtYXRjaGVzKGVsLCBzZWxlY3RvcikpIHx8IGluY2x1ZGVDVFggJiYgZWwgPT09IGN0eCkge1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbCA9PT0gY3R4KSBicmVhaztcbiAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgICB9IHdoaWxlIChlbCA9IGdldFBhcmVudE9ySG9zdChlbCkpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBSX1NQQUNFID0gL1xccysvZztcblxuZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWwsIG5hbWUsIHN0YXRlKSB7XG4gIGlmIChlbCAmJiBuYW1lKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdCkge1xuICAgICAgZWwuY2xhc3NMaXN0W3N0YXRlID8gJ2FkZCcgOiAncmVtb3ZlJ10obmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjbGFzc05hbWUgPSAoJyAnICsgZWwuY2xhc3NOYW1lICsgJyAnKS5yZXBsYWNlKFJfU1BBQ0UsICcgJykucmVwbGFjZSgnICcgKyBuYW1lICsgJyAnLCAnICcpO1xuICAgICAgZWwuY2xhc3NOYW1lID0gKGNsYXNzTmFtZSArIChzdGF0ZSA/ICcgJyArIG5hbWUgOiAnJykpLnJlcGxhY2UoUl9TUEFDRSwgJyAnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3NzKGVsLCBwcm9wLCB2YWwpIHtcbiAgdmFyIHN0eWxlID0gZWwgJiYgZWwuc3R5bGU7XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgaWYgKHZhbCA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgICAgICB2YWwgPSBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsLCAnJyk7XG4gICAgICB9IGVsc2UgaWYgKGVsLmN1cnJlbnRTdHlsZSkge1xuICAgICAgICB2YWwgPSBlbC5jdXJyZW50U3R5bGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9wID09PSB2b2lkIDAgPyB2YWwgOiB2YWxbcHJvcF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKHByb3AgaW4gc3R5bGUpICYmIHByb3AuaW5kZXhPZignd2Via2l0JykgPT09IC0xKSB7XG4gICAgICAgIHByb3AgPSAnLXdlYmtpdC0nICsgcHJvcDtcbiAgICAgIH1cblxuICAgICAgc3R5bGVbcHJvcF0gPSB2YWwgKyAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyAnJyA6ICdweCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXRyaXgoZWwsIHNlbGZPbmx5KSB7XG4gIHZhciBhcHBsaWVkVHJhbnNmb3JtcyA9ICcnO1xuXG4gIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgYXBwbGllZFRyYW5zZm9ybXMgPSBlbDtcbiAgfSBlbHNlIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdHJhbnNmb3JtID0gY3NzKGVsLCAndHJhbnNmb3JtJyk7XG5cbiAgICAgIGlmICh0cmFuc2Zvcm0gJiYgdHJhbnNmb3JtICE9PSAnbm9uZScpIHtcbiAgICAgICAgYXBwbGllZFRyYW5zZm9ybXMgPSB0cmFuc2Zvcm0gKyAnICcgKyBhcHBsaWVkVHJhbnNmb3JtcztcbiAgICAgIH1cbiAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuICAgIH0gd2hpbGUgKCFzZWxmT25seSAmJiAoZWwgPSBlbC5wYXJlbnROb2RlKSk7XG4gIH1cblxuICB2YXIgbWF0cml4Rm4gPSB3aW5kb3cuRE9NTWF0cml4IHx8IHdpbmRvdy5XZWJLaXRDU1NNYXRyaXggfHwgd2luZG93LkNTU01hdHJpeCB8fCB3aW5kb3cuTVNDU1NNYXRyaXg7XG4gIC8qanNoaW50IC1XMDU2ICovXG5cbiAgcmV0dXJuIG1hdHJpeEZuICYmIG5ldyBtYXRyaXhGbihhcHBsaWVkVHJhbnNmb3Jtcyk7XG59XG5cbmZ1bmN0aW9uIGZpbmQoY3R4LCB0YWdOYW1lLCBpdGVyYXRvcikge1xuICBpZiAoY3R4KSB7XG4gICAgdmFyIGxpc3QgPSBjdHguZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSksXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBuID0gbGlzdC5sZW5ndGg7XG5cbiAgICBpZiAoaXRlcmF0b3IpIHtcbiAgICAgIGZvciAoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdG9yKGxpc3RbaV0sIGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCkge1xuICB2YXIgc2Nyb2xsaW5nRWxlbWVudCA9IGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQ7XG5cbiAgaWYgKHNjcm9sbGluZ0VsZW1lbnQpIHtcbiAgICByZXR1cm4gc2Nyb2xsaW5nRWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIFwiYm91bmRpbmcgY2xpZW50IHJlY3RcIiBvZiBnaXZlbiBlbGVtZW50XG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgICAgICAgICAgICAgICAgIFRoZSBlbGVtZW50IHdob3NlIGJvdW5kaW5nQ2xpZW50UmVjdCBpcyB3YW50ZWRcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gcmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jayAgV2hldGhlciB0aGUgcmVjdCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2sgb2YgKGluY2x1ZGluZykgdGhlIGNvbnRhaW5lclxuICogQHBhcmFtICB7W0Jvb2xlYW5dfSByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50ICBXaGV0aGVyIHRoZSByZWN0IHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcmVsYXRpdmUgcGFyZW50IG9mIChpbmNsdWRpbmcpIHRoZSBjb250YWllbnJcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gdW5kb1NjYWxlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgY29udGFpbmVyJ3Mgc2NhbGUoKSBzaG91bGQgYmUgdW5kb25lXG4gKiBAcGFyYW0gIHtbSFRNTEVsZW1lbnRdfSBjb250YWluZXIgICAgICAgICAgICAgIFRoZSBwYXJlbnQgdGhlIGVsZW1lbnQgd2lsbCBiZSBwbGFjZWQgaW5cbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJvdW5kaW5nQ2xpZW50UmVjdCBvZiBlbCwgd2l0aCBzcGVjaWZpZWQgYWRqdXN0bWVudHNcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFJlY3QoZWwsIHJlbGF0aXZlVG9Db250YWluaW5nQmxvY2ssIHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQsIHVuZG9TY2FsZSwgY29udGFpbmVyKSB7XG4gIGlmICghZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmIGVsICE9PSB3aW5kb3cpIHJldHVybjtcbiAgdmFyIGVsUmVjdCwgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCBoZWlnaHQsIHdpZHRoO1xuXG4gIGlmIChlbCAhPT0gd2luZG93ICYmIGVsLnBhcmVudE5vZGUgJiYgZWwgIT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkge1xuICAgIGVsUmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRvcCA9IGVsUmVjdC50b3A7XG4gICAgbGVmdCA9IGVsUmVjdC5sZWZ0O1xuICAgIGJvdHRvbSA9IGVsUmVjdC5ib3R0b207XG4gICAgcmlnaHQgPSBlbFJlY3QucmlnaHQ7XG4gICAgaGVpZ2h0ID0gZWxSZWN0LmhlaWdodDtcbiAgICB3aWR0aCA9IGVsUmVjdC53aWR0aDtcbiAgfSBlbHNlIHtcbiAgICB0b3AgPSAwO1xuICAgIGxlZnQgPSAwO1xuICAgIGJvdHRvbSA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICByaWdodCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICB9XG5cbiAgaWYgKChyZWxhdGl2ZVRvQ29udGFpbmluZ0Jsb2NrIHx8IHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQpICYmIGVsICE9PSB3aW5kb3cpIHtcbiAgICAvLyBBZGp1c3QgZm9yIHRyYW5zbGF0ZSgpXG4gICAgY29udGFpbmVyID0gY29udGFpbmVyIHx8IGVsLnBhcmVudE5vZGU7IC8vIHNvbHZlcyAjMTEyMyAoc2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzc5NTM4MDYvNjA4ODMxMilcbiAgICAvLyBOb3QgbmVlZGVkIG9uIDw9IElFMTFcblxuICAgIGlmICghSUUxMU9yTGVzcykge1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoY29udGFpbmVyICYmIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QgJiYgKGNzcyhjb250YWluZXIsICd0cmFuc2Zvcm0nKSAhPT0gJ25vbmUnIHx8IHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQgJiYgY3NzKGNvbnRhaW5lciwgJ3Bvc2l0aW9uJykgIT09ICdzdGF0aWMnKSkge1xuICAgICAgICAgIHZhciBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyAvLyBTZXQgcmVsYXRpdmUgdG8gZWRnZXMgb2YgcGFkZGluZyBib3ggb2YgY29udGFpbmVyXG5cbiAgICAgICAgICB0b3AgLT0gY29udGFpbmVyUmVjdC50b3AgKyBwYXJzZUludChjc3MoY29udGFpbmVyLCAnYm9yZGVyLXRvcC13aWR0aCcpKTtcbiAgICAgICAgICBsZWZ0IC09IGNvbnRhaW5lclJlY3QubGVmdCArIHBhcnNlSW50KGNzcyhjb250YWluZXIsICdib3JkZXItbGVmdC13aWR0aCcpKTtcbiAgICAgICAgICBib3R0b20gPSB0b3AgKyBlbFJlY3QuaGVpZ2h0O1xuICAgICAgICAgIHJpZ2h0ID0gbGVmdCArIGVsUmVjdC53aWR0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cbiAgICAgIH0gd2hpbGUgKGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodW5kb1NjYWxlICYmIGVsICE9PSB3aW5kb3cpIHtcbiAgICAvLyBBZGp1c3QgZm9yIHNjYWxlKClcbiAgICB2YXIgZWxNYXRyaXggPSBtYXRyaXgoY29udGFpbmVyIHx8IGVsKSxcbiAgICAgICAgc2NhbGVYID0gZWxNYXRyaXggJiYgZWxNYXRyaXguYSxcbiAgICAgICAgc2NhbGVZID0gZWxNYXRyaXggJiYgZWxNYXRyaXguZDtcblxuICAgIGlmIChlbE1hdHJpeCkge1xuICAgICAgdG9wIC89IHNjYWxlWTtcbiAgICAgIGxlZnQgLz0gc2NhbGVYO1xuICAgICAgd2lkdGggLz0gc2NhbGVYO1xuICAgICAgaGVpZ2h0IC89IHNjYWxlWTtcbiAgICAgIGJvdHRvbSA9IHRvcCArIGhlaWdodDtcbiAgICAgIHJpZ2h0ID0gbGVmdCArIHdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiB0b3AsXG4gICAgbGVmdDogbGVmdCxcbiAgICBib3R0b206IGJvdHRvbSxcbiAgICByaWdodDogcmlnaHQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59XG4vKipcbiAqIENoZWNrcyBpZiBhIHNpZGUgb2YgYW4gZWxlbWVudCBpcyBzY3JvbGxlZCBwYXN0IGEgc2lkZSBvZiBpdHMgcGFyZW50c1xuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICBlbCAgICAgICAgICAgVGhlIGVsZW1lbnQgd2hvJ3Mgc2lkZSBiZWluZyBzY3JvbGxlZCBvdXQgb2YgdmlldyBpcyBpbiBxdWVzdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICBlbFNpZGUgICAgICAgU2lkZSBvZiB0aGUgZWxlbWVudCBpbiBxdWVzdGlvbiAoJ3RvcCcsICdsZWZ0JywgJ3JpZ2h0JywgJ2JvdHRvbScpXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgIHBhcmVudFNpZGUgICBTaWRlIG9mIHRoZSBwYXJlbnQgaW4gcXVlc3Rpb24gKCd0b3AnLCAnbGVmdCcsICdyaWdodCcsICdib3R0b20nKVxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgICAgICAgICAgICAgVGhlIHBhcmVudCBzY3JvbGwgZWxlbWVudCB0aGF0IHRoZSBlbCdzIHNpZGUgaXMgc2Nyb2xsZWQgcGFzdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIGlzU2Nyb2xsZWRQYXN0KGVsLCBlbFNpZGUsIHBhcmVudFNpZGUpIHtcbiAgdmFyIHBhcmVudCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsLCB0cnVlKSxcbiAgICAgIGVsU2lkZVZhbCA9IGdldFJlY3QoZWwpW2VsU2lkZV07XG4gIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuICB3aGlsZSAocGFyZW50KSB7XG4gICAgdmFyIHBhcmVudFNpZGVWYWwgPSBnZXRSZWN0KHBhcmVudClbcGFyZW50U2lkZV0sXG4gICAgICAgIHZpc2libGUgPSB2b2lkIDA7XG5cbiAgICBpZiAocGFyZW50U2lkZSA9PT0gJ3RvcCcgfHwgcGFyZW50U2lkZSA9PT0gJ2xlZnQnKSB7XG4gICAgICB2aXNpYmxlID0gZWxTaWRlVmFsID49IHBhcmVudFNpZGVWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2libGUgPSBlbFNpZGVWYWwgPD0gcGFyZW50U2lkZVZhbDtcbiAgICB9XG5cbiAgICBpZiAoIXZpc2libGUpIHJldHVybiBwYXJlbnQ7XG4gICAgaWYgKHBhcmVudCA9PT0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpKSBicmVhaztcbiAgICBwYXJlbnQgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChwYXJlbnQsIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogR2V0cyBudGggY2hpbGQgb2YgZWwsIGlnbm9yaW5nIGhpZGRlbiBjaGlsZHJlbiwgc29ydGFibGUncyBlbGVtZW50cyAoZG9lcyBub3QgaWdub3JlIGNsb25lIGlmIGl0J3MgdmlzaWJsZSlcbiAqIGFuZCBub24tZHJhZ2dhYmxlIGVsZW1lbnRzXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgVGhlIHBhcmVudCBlbGVtZW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGNoaWxkTnVtICAgICAgVGhlIGluZGV4IG9mIHRoZSBjaGlsZFxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zICAgICAgIFBhcmVudCBTb3J0YWJsZSdzIG9wdGlvbnNcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICBUaGUgY2hpbGQgYXQgaW5kZXggY2hpbGROdW0sIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRDaGlsZChlbCwgY2hpbGROdW0sIG9wdGlvbnMpIHtcbiAgdmFyIGN1cnJlbnRDaGlsZCA9IDAsXG4gICAgICBpID0gMCxcbiAgICAgIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47XG5cbiAgd2hpbGUgKGkgPCBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBpZiAoY2hpbGRyZW5baV0uc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnICYmIGNoaWxkcmVuW2ldICE9PSBTb3J0YWJsZS5naG9zdCAmJiBjaGlsZHJlbltpXSAhPT0gU29ydGFibGUuZHJhZ2dlZCAmJiBjbG9zZXN0KGNoaWxkcmVuW2ldLCBvcHRpb25zLmRyYWdnYWJsZSwgZWwsIGZhbHNlKSkge1xuICAgICAgaWYgKGN1cnJlbnRDaGlsZCA9PT0gY2hpbGROdW0pIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2ldO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50Q2hpbGQrKztcbiAgICB9XG5cbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2V0cyB0aGUgbGFzdCBjaGlsZCBpbiB0aGUgZWwsIGlnbm9yaW5nIGdob3N0RWwgb3IgaW52aXNpYmxlIGVsZW1lbnRzIChjbG9uZXMpXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgUGFyZW50IGVsZW1lbnRcbiAqIEBwYXJhbSAge3NlbGVjdG9yfSBzZWxlY3RvciAgICBBbnkgb3RoZXIgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgaWdub3JlZFxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgICAgICAgIFRoZSBsYXN0IGNoaWxkLCBpZ25vcmluZyBnaG9zdEVsXG4gKi9cblxuXG5mdW5jdGlvbiBsYXN0Q2hpbGQoZWwsIHNlbGVjdG9yKSB7XG4gIHZhciBsYXN0ID0gZWwubGFzdEVsZW1lbnRDaGlsZDtcblxuICB3aGlsZSAobGFzdCAmJiAobGFzdCA9PT0gU29ydGFibGUuZ2hvc3QgfHwgY3NzKGxhc3QsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBzZWxlY3RvciAmJiAhbWF0Y2hlcyhsYXN0LCBzZWxlY3RvcikpKSB7XG4gICAgbGFzdCA9IGxhc3QucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgfVxuXG4gIHJldHVybiBsYXN0IHx8IG51bGw7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIGFuIGVsZW1lbnQgd2l0aGluIGl0cyBwYXJlbnQgZm9yIGEgc2VsZWN0ZWQgc2V0IG9mXG4gKiBlbGVtZW50c1xuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcGFyYW0gIHtzZWxlY3Rvcn0gc2VsZWN0b3JcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuXG5cbmZ1bmN0aW9uIGluZGV4KGVsLCBzZWxlY3Rvcikge1xuICB2YXIgaW5kZXggPSAwO1xuXG4gIGlmICghZWwgfHwgIWVsLnBhcmVudE5vZGUpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXG5cbiAgd2hpbGUgKGVsID0gZWwucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgIGlmIChlbC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnVEVNUExBVEUnICYmIGVsICE9PSBTb3J0YWJsZS5jbG9uZSAmJiAoIXNlbGVjdG9yIHx8IG1hdGNoZXMoZWwsIHNlbGVjdG9yKSkpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZGV4O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBnaXZlbiBlbGVtZW50LCBhZGRlZCB3aXRoIGFsbCB0aGUgc2Nyb2xsIG9mZnNldHMgb2YgcGFyZW50IGVsZW1lbnRzLlxuICogVGhlIHZhbHVlIGlzIHJldHVybmVkIGluIHJlYWwgcGl4ZWxzLlxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgICAgICAgT2Zmc2V0cyBpbiB0aGUgZm9ybWF0IG9mIFtsZWZ0LCB0b3BdXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChlbCkge1xuICB2YXIgb2Zmc2V0TGVmdCA9IDAsXG4gICAgICBvZmZzZXRUb3AgPSAwLFxuICAgICAgd2luU2Nyb2xsZXIgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG5cbiAgaWYgKGVsKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGVsTWF0cml4ID0gbWF0cml4KGVsKSxcbiAgICAgICAgICBzY2FsZVggPSBlbE1hdHJpeC5hLFxuICAgICAgICAgIHNjYWxlWSA9IGVsTWF0cml4LmQ7XG4gICAgICBvZmZzZXRMZWZ0ICs9IGVsLnNjcm9sbExlZnQgKiBzY2FsZVg7XG4gICAgICBvZmZzZXRUb3AgKz0gZWwuc2Nyb2xsVG9wICogc2NhbGVZO1xuICAgIH0gd2hpbGUgKGVsICE9PSB3aW5TY3JvbGxlciAmJiAoZWwgPSBlbC5wYXJlbnROb2RlKSk7XG4gIH1cblxuICByZXR1cm4gW29mZnNldExlZnQsIG9mZnNldFRvcF07XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBvYmplY3Qgd2l0aGluIHRoZSBnaXZlbiBhcnJheVxuICogQHBhcmFtICB7QXJyYXl9IGFyciAgIEFycmF5IHRoYXQgbWF5IG9yIG1heSBub3QgaG9sZCB0aGUgb2JqZWN0XG4gKiBAcGFyYW0gIHtPYmplY3R9IG9iaiAgQW4gb2JqZWN0IHRoYXQgaGFzIGEga2V5LXZhbHVlIHBhaXIgdW5pcXVlIHRvIGFuZCBpZGVudGljYWwgdG8gYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgb2JqZWN0IHlvdSB3YW50IHRvIGZpbmRcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICBUaGUgaW5kZXggb2YgdGhlIG9iamVjdCBpbiB0aGUgYXJyYXksIG9yIC0xXG4gKi9cblxuXG5mdW5jdGlvbiBpbmRleE9mT2JqZWN0KGFyciwgb2JqKSB7XG4gIGZvciAodmFyIGkgaW4gYXJyKSB7XG4gICAgaWYgKCFhcnIuaGFzT3duUHJvcGVydHkoaSkpIGNvbnRpbnVlO1xuXG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG9ialtrZXldID09PSBhcnJbaV1ba2V5XSkgcmV0dXJuIE51bWJlcihpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsLCBpbmNsdWRlU2VsZikge1xuICAvLyBza2lwIHRvIHdpbmRvd1xuICBpZiAoIWVsIHx8ICFlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHJldHVybiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gIHZhciBlbGVtID0gZWw7XG4gIHZhciBnb3RTZWxmID0gZmFsc2U7XG5cbiAgZG8ge1xuICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gZ2V0IGVsZW0gY3NzIGlmIGl0IGlzbid0IGV2ZW4gb3ZlcmZsb3dpbmcgaW4gdGhlIGZpcnN0IHBsYWNlIChwZXJmb3JtYW5jZSlcbiAgICBpZiAoZWxlbS5jbGllbnRXaWR0aCA8IGVsZW0uc2Nyb2xsV2lkdGggfHwgZWxlbS5jbGllbnRIZWlnaHQgPCBlbGVtLnNjcm9sbEhlaWdodCkge1xuICAgICAgdmFyIGVsZW1DU1MgPSBjc3MoZWxlbSk7XG5cbiAgICAgIGlmIChlbGVtLmNsaWVudFdpZHRoIDwgZWxlbS5zY3JvbGxXaWR0aCAmJiAoZWxlbUNTUy5vdmVyZmxvd1ggPT0gJ2F1dG8nIHx8IGVsZW1DU1Mub3ZlcmZsb3dYID09ICdzY3JvbGwnKSB8fCBlbGVtLmNsaWVudEhlaWdodCA8IGVsZW0uc2Nyb2xsSGVpZ2h0ICYmIChlbGVtQ1NTLm92ZXJmbG93WSA9PSAnYXV0bycgfHwgZWxlbUNTUy5vdmVyZmxvd1kgPT0gJ3Njcm9sbCcpKSB7XG4gICAgICAgIGlmICghZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgfHwgZWxlbSA9PT0gZG9jdW1lbnQuYm9keSkgcmV0dXJuIGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAgICAgaWYgKGdvdFNlbGYgfHwgaW5jbHVkZVNlbGYpIHJldHVybiBlbGVtO1xuICAgICAgICBnb3RTZWxmID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXG4gIH0gd2hpbGUgKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpO1xuXG4gIHJldHVybiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkc3QsIHNyYykge1xuICBpZiAoZHN0ICYmIHNyYykge1xuICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBkc3Rba2V5XSA9IHNyY1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkc3Q7XG59XG5cbmZ1bmN0aW9uIGlzUmVjdEVxdWFsKHJlY3QxLCByZWN0Mikge1xuICByZXR1cm4gTWF0aC5yb3VuZChyZWN0MS50b3ApID09PSBNYXRoLnJvdW5kKHJlY3QyLnRvcCkgJiYgTWF0aC5yb3VuZChyZWN0MS5sZWZ0KSA9PT0gTWF0aC5yb3VuZChyZWN0Mi5sZWZ0KSAmJiBNYXRoLnJvdW5kKHJlY3QxLmhlaWdodCkgPT09IE1hdGgucm91bmQocmVjdDIuaGVpZ2h0KSAmJiBNYXRoLnJvdW5kKHJlY3QxLndpZHRoKSA9PT0gTWF0aC5yb3VuZChyZWN0Mi53aWR0aCk7XG59XG5cbnZhciBfdGhyb3R0bGVUaW1lb3V0O1xuXG5mdW5jdGlvbiB0aHJvdHRsZShjYWxsYmFjaywgbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIV90aHJvdHRsZVRpbWVvdXQpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoX3RoaXMsIGFyZ3NbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2suYXBwbHkoX3RoaXMsIGFyZ3MpO1xuICAgICAgfVxuXG4gICAgICBfdGhyb3R0bGVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aHJvdHRsZVRpbWVvdXQgPSB2b2lkIDA7XG4gICAgICB9LCBtcyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjYW5jZWxUaHJvdHRsZSgpIHtcbiAgY2xlYXJUaW1lb3V0KF90aHJvdHRsZVRpbWVvdXQpO1xuICBfdGhyb3R0bGVUaW1lb3V0ID0gdm9pZCAwO1xufVxuXG5mdW5jdGlvbiBzY3JvbGxCeShlbCwgeCwgeSkge1xuICBlbC5zY3JvbGxMZWZ0ICs9IHg7XG4gIGVsLnNjcm9sbFRvcCArPSB5O1xufVxuXG5mdW5jdGlvbiBjbG9uZShlbCkge1xuICB2YXIgUG9seW1lciA9IHdpbmRvdy5Qb2x5bWVyO1xuICB2YXIgJCA9IHdpbmRvdy5qUXVlcnkgfHwgd2luZG93LlplcHRvO1xuXG4gIGlmIChQb2x5bWVyICYmIFBvbHltZXIuZG9tKSB7XG4gICAgcmV0dXJuIFBvbHltZXIuZG9tKGVsKS5jbG9uZU5vZGUodHJ1ZSk7XG4gIH0gZWxzZSBpZiAoJCkge1xuICAgIHJldHVybiAkKGVsKS5jbG9uZSh0cnVlKVswXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZWwuY2xvbmVOb2RlKHRydWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlY3QoZWwsIHJlY3QpIHtcbiAgY3NzKGVsLCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgY3NzKGVsLCAndG9wJywgcmVjdC50b3ApO1xuICBjc3MoZWwsICdsZWZ0JywgcmVjdC5sZWZ0KTtcbiAgY3NzKGVsLCAnd2lkdGgnLCByZWN0LndpZHRoKTtcbiAgY3NzKGVsLCAnaGVpZ2h0JywgcmVjdC5oZWlnaHQpO1xufVxuXG5mdW5jdGlvbiB1bnNldFJlY3QoZWwpIHtcbiAgY3NzKGVsLCAncG9zaXRpb24nLCAnJyk7XG4gIGNzcyhlbCwgJ3RvcCcsICcnKTtcbiAgY3NzKGVsLCAnbGVmdCcsICcnKTtcbiAgY3NzKGVsLCAnd2lkdGgnLCAnJyk7XG4gIGNzcyhlbCwgJ2hlaWdodCcsICcnKTtcbn1cblxudmFyIGV4cGFuZG8gPSAnU29ydGFibGUnICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbmZ1bmN0aW9uIEFuaW1hdGlvblN0YXRlTWFuYWdlcigpIHtcbiAgdmFyIGFuaW1hdGlvblN0YXRlcyA9IFtdLFxuICAgICAgYW5pbWF0aW9uQ2FsbGJhY2tJZDtcbiAgcmV0dXJuIHtcbiAgICBjYXB0dXJlQW5pbWF0aW9uU3RhdGU6IGZ1bmN0aW9uIGNhcHR1cmVBbmltYXRpb25TdGF0ZSgpIHtcbiAgICAgIGFuaW1hdGlvblN0YXRlcyA9IFtdO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSByZXR1cm47XG4gICAgICB2YXIgY2hpbGRyZW4gPSBbXS5zbGljZS5jYWxsKHRoaXMuZWwuY2hpbGRyZW4pO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNzcyhjaGlsZCwgJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8IGNoaWxkID09PSBTb3J0YWJsZS5naG9zdCkgcmV0dXJuO1xuICAgICAgICBhbmltYXRpb25TdGF0ZXMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiBjaGlsZCxcbiAgICAgICAgICByZWN0OiBnZXRSZWN0KGNoaWxkKVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgZnJvbVJlY3QgPSBfb2JqZWN0U3ByZWFkKHt9LCBhbmltYXRpb25TdGF0ZXNbYW5pbWF0aW9uU3RhdGVzLmxlbmd0aCAtIDFdLnJlY3QpOyAvLyBJZiBhbmltYXRpbmc6IGNvbXBlbnNhdGUgZm9yIGN1cnJlbnQgYW5pbWF0aW9uXG5cblxuICAgICAgICBpZiAoY2hpbGQudGhpc0FuaW1hdGlvbkR1cmF0aW9uKSB7XG4gICAgICAgICAgdmFyIGNoaWxkTWF0cml4ID0gbWF0cml4KGNoaWxkLCB0cnVlKTtcblxuICAgICAgICAgIGlmIChjaGlsZE1hdHJpeCkge1xuICAgICAgICAgICAgZnJvbVJlY3QudG9wIC09IGNoaWxkTWF0cml4LmY7XG4gICAgICAgICAgICBmcm9tUmVjdC5sZWZ0IC09IGNoaWxkTWF0cml4LmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQuZnJvbVJlY3QgPSBmcm9tUmVjdDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgYWRkQW5pbWF0aW9uU3RhdGU6IGZ1bmN0aW9uIGFkZEFuaW1hdGlvblN0YXRlKHN0YXRlKSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMucHVzaChzdGF0ZSk7XG4gICAgfSxcbiAgICByZW1vdmVBbmltYXRpb25TdGF0ZTogZnVuY3Rpb24gcmVtb3ZlQW5pbWF0aW9uU3RhdGUodGFyZ2V0KSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMuc3BsaWNlKGluZGV4T2ZPYmplY3QoYW5pbWF0aW9uU3RhdGVzLCB7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgICB9KSwgMSk7XG4gICAgfSxcbiAgICBhbmltYXRlQWxsOiBmdW5jdGlvbiBhbmltYXRlQWxsKGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGFuaW1hdGlvbkNhbGxiYWNrSWQpO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBhbmltYXRpbmcgPSBmYWxzZSxcbiAgICAgICAgICBhbmltYXRpb25UaW1lID0gMDtcbiAgICAgIGFuaW1hdGlvblN0YXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgdGltZSA9IDAsXG4gICAgICAgICAgICB0YXJnZXQgPSBzdGF0ZS50YXJnZXQsXG4gICAgICAgICAgICBmcm9tUmVjdCA9IHRhcmdldC5mcm9tUmVjdCxcbiAgICAgICAgICAgIHRvUmVjdCA9IGdldFJlY3QodGFyZ2V0KSxcbiAgICAgICAgICAgIHByZXZGcm9tUmVjdCA9IHRhcmdldC5wcmV2RnJvbVJlY3QsXG4gICAgICAgICAgICBwcmV2VG9SZWN0ID0gdGFyZ2V0LnByZXZUb1JlY3QsXG4gICAgICAgICAgICBhbmltYXRpbmdSZWN0ID0gc3RhdGUucmVjdCxcbiAgICAgICAgICAgIHRhcmdldE1hdHJpeCA9IG1hdHJpeCh0YXJnZXQsIHRydWUpO1xuXG4gICAgICAgIGlmICh0YXJnZXRNYXRyaXgpIHtcbiAgICAgICAgICAvLyBDb21wZW5zYXRlIGZvciBjdXJyZW50IGFuaW1hdGlvblxuICAgICAgICAgIHRvUmVjdC50b3AgLT0gdGFyZ2V0TWF0cml4LmY7XG4gICAgICAgICAgdG9SZWN0LmxlZnQgLT0gdGFyZ2V0TWF0cml4LmU7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQudG9SZWN0ID0gdG9SZWN0O1xuXG4gICAgICAgIGlmICh0YXJnZXQudGhpc0FuaW1hdGlvbkR1cmF0aW9uKSB7XG4gICAgICAgICAgLy8gQ291bGQgYWxzbyBjaGVjayBpZiBhbmltYXRpbmdSZWN0IGlzIGJldHdlZW4gZnJvbVJlY3QgYW5kIHRvUmVjdFxuICAgICAgICAgIGlmIChpc1JlY3RFcXVhbChwcmV2RnJvbVJlY3QsIHRvUmVjdCkgJiYgIWlzUmVjdEVxdWFsKGZyb21SZWN0LCB0b1JlY3QpICYmIC8vIE1ha2Ugc3VyZSBhbmltYXRpbmdSZWN0IGlzIG9uIGxpbmUgYmV0d2VlbiB0b1JlY3QgJiBmcm9tUmVjdFxuICAgICAgICAgIChhbmltYXRpbmdSZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKGFuaW1hdGluZ1JlY3QubGVmdCAtIHRvUmVjdC5sZWZ0KSA9PT0gKGZyb21SZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKGZyb21SZWN0LmxlZnQgLSB0b1JlY3QubGVmdCkpIHtcbiAgICAgICAgICAgIC8vIElmIHJldHVybmluZyB0byBzYW1lIHBsYWNlIGFzIHN0YXJ0ZWQgZnJvbSBhbmltYXRpb24gYW5kIG9uIHNhbWUgYXhpc1xuICAgICAgICAgICAgdGltZSA9IGNhbGN1bGF0ZVJlYWxUaW1lKGFuaW1hdGluZ1JlY3QsIHByZXZGcm9tUmVjdCwgcHJldlRvUmVjdCwgX3RoaXMub3B0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIGlmIGZyb21SZWN0ICE9IHRvUmVjdDogYW5pbWF0ZVxuXG5cbiAgICAgICAgaWYgKCFpc1JlY3RFcXVhbCh0b1JlY3QsIGZyb21SZWN0KSkge1xuICAgICAgICAgIHRhcmdldC5wcmV2RnJvbVJlY3QgPSBmcm9tUmVjdDtcbiAgICAgICAgICB0YXJnZXQucHJldlRvUmVjdCA9IHRvUmVjdDtcblxuICAgICAgICAgIGlmICghdGltZSkge1xuICAgICAgICAgICAgdGltZSA9IF90aGlzLm9wdGlvbnMuYW5pbWF0aW9uO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLmFuaW1hdGUodGFyZ2V0LCBhbmltYXRpbmdSZWN0LCB0b1JlY3QsIHRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgICBhbmltYXRpbmcgPSB0cnVlO1xuICAgICAgICAgIGFuaW1hdGlvblRpbWUgPSBNYXRoLm1heChhbmltYXRpb25UaW1lLCB0aW1lKTtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGFyZ2V0LmFuaW1hdGlvblJlc2V0VGltZXIpO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpb25SZXNldFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0YXJnZXQuYW5pbWF0aW9uVGltZSA9IDA7XG4gICAgICAgICAgICB0YXJnZXQucHJldkZyb21SZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRhcmdldC5mcm9tUmVjdCA9IG51bGw7XG4gICAgICAgICAgICB0YXJnZXQucHJldlRvUmVjdCA9IG51bGw7XG4gICAgICAgICAgICB0YXJnZXQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgICB9LCB0aW1lKTtcbiAgICAgICAgICB0YXJnZXQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gdGltZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbGVhclRpbWVvdXQoYW5pbWF0aW9uQ2FsbGJhY2tJZCk7XG5cbiAgICAgIGlmICghYW5pbWF0aW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmltYXRpb25DYWxsYmFja0lkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcbiAgICAgICAgfSwgYW5pbWF0aW9uVGltZSk7XG4gICAgICB9XG5cbiAgICAgIGFuaW1hdGlvblN0YXRlcyA9IFtdO1xuICAgIH0sXG4gICAgYW5pbWF0ZTogZnVuY3Rpb24gYW5pbWF0ZSh0YXJnZXQsIGN1cnJlbnRSZWN0LCB0b1JlY3QsIGR1cmF0aW9uKSB7XG4gICAgICBpZiAoZHVyYXRpb24pIHtcbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgICAgIHZhciBlbE1hdHJpeCA9IG1hdHJpeCh0aGlzLmVsKSxcbiAgICAgICAgICAgIHNjYWxlWCA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmEsXG4gICAgICAgICAgICBzY2FsZVkgPSBlbE1hdHJpeCAmJiBlbE1hdHJpeC5kLFxuICAgICAgICAgICAgdHJhbnNsYXRlWCA9IChjdXJyZW50UmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQpIC8gKHNjYWxlWCB8fCAxKSxcbiAgICAgICAgICAgIHRyYW5zbGF0ZVkgPSAoY3VycmVudFJlY3QudG9wIC0gdG9SZWN0LnRvcCkgLyAoc2NhbGVZIHx8IDEpO1xuICAgICAgICB0YXJnZXQuYW5pbWF0aW5nWCA9ICEhdHJhbnNsYXRlWDtcbiAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1kgPSAhIXRyYW5zbGF0ZVk7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlM2QoJyArIHRyYW5zbGF0ZVggKyAncHgsJyArIHRyYW5zbGF0ZVkgKyAncHgsMCknKTtcbiAgICAgICAgdGhpcy5mb3JSZXBhaW50RHVtbXkgPSByZXBhaW50KHRhcmdldCk7IC8vIHJlcGFpbnRcblxuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNpdGlvbicsICd0cmFuc2Zvcm0gJyArIGR1cmF0aW9uICsgJ21zJyArICh0aGlzLm9wdGlvbnMuZWFzaW5nID8gJyAnICsgdGhpcy5vcHRpb25zLmVhc2luZyA6ICcnKSk7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlM2QoMCwwLDApJyk7XG4gICAgICAgIHR5cGVvZiB0YXJnZXQuYW5pbWF0ZWQgPT09ICdudW1iZXInICYmIGNsZWFyVGltZW91dCh0YXJnZXQuYW5pbWF0ZWQpO1xuICAgICAgICB0YXJnZXQuYW5pbWF0ZWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNpdGlvbicsICcnKTtcbiAgICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJycpO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRlZCA9IGZhbHNlO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpbmdYID0gZmFsc2U7XG4gICAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1kgPSBmYWxzZTtcbiAgICAgICAgfSwgZHVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVwYWludCh0YXJnZXQpIHtcbiAgcmV0dXJuIHRhcmdldC5vZmZzZXRXaWR0aDtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlUmVhbFRpbWUoYW5pbWF0aW5nUmVjdCwgZnJvbVJlY3QsIHRvUmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGZyb21SZWN0LnRvcCAtIGFuaW1hdGluZ1JlY3QudG9wLCAyKSArIE1hdGgucG93KGZyb21SZWN0LmxlZnQgLSBhbmltYXRpbmdSZWN0LmxlZnQsIDIpKSAvIE1hdGguc3FydChNYXRoLnBvdyhmcm9tUmVjdC50b3AgLSB0b1JlY3QudG9wLCAyKSArIE1hdGgucG93KGZyb21SZWN0LmxlZnQgLSB0b1JlY3QubGVmdCwgMikpICogb3B0aW9ucy5hbmltYXRpb247XG59XG5cbnZhciBwbHVnaW5zID0gW107XG52YXIgZGVmYXVsdHMgPSB7XG4gIGluaXRpYWxpemVCeURlZmF1bHQ6IHRydWVcbn07XG52YXIgUGx1Z2luTWFuYWdlciA9IHtcbiAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KHBsdWdpbikge1xuICAgIC8vIFNldCBkZWZhdWx0IHN0YXRpYyBwcm9wZXJ0aWVzXG4gICAgZm9yICh2YXIgb3B0aW9uIGluIGRlZmF1bHRzKSB7XG4gICAgICBpZiAoZGVmYXVsdHMuaGFzT3duUHJvcGVydHkob3B0aW9uKSAmJiAhKG9wdGlvbiBpbiBwbHVnaW4pKSB7XG4gICAgICAgIHBsdWdpbltvcHRpb25dID0gZGVmYXVsdHNbb3B0aW9uXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmIChwLnBsdWdpbk5hbWUgPT09IHBsdWdpbi5wbHVnaW5OYW1lKSB7XG4gICAgICAgIHRocm93IFwiU29ydGFibGU6IENhbm5vdCBtb3VudCBwbHVnaW4gXCIuY29uY2F0KHBsdWdpbi5wbHVnaW5OYW1lLCBcIiBtb3JlIHRoYW4gb25jZVwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgfSxcbiAgcGx1Z2luRXZlbnQ6IGZ1bmN0aW9uIHBsdWdpbkV2ZW50KGV2ZW50TmFtZSwgc29ydGFibGUsIGV2dCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLmV2ZW50Q2FuY2VsZWQgPSBmYWxzZTtcblxuICAgIGV2dC5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5ldmVudENhbmNlbGVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgdmFyIGV2ZW50TmFtZUdsb2JhbCA9IGV2ZW50TmFtZSArICdHbG9iYWwnO1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICBpZiAoIXNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSkgcmV0dXJuOyAvLyBGaXJlIGdsb2JhbCBldmVudHMgaWYgaXQgZXhpc3RzIGluIHRoaXMgc29ydGFibGVcblxuICAgICAgaWYgKHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVHbG9iYWxdKSB7XG4gICAgICAgIHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVHbG9iYWxdKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZVxuICAgICAgICB9LCBldnQpKTtcbiAgICAgIH0gLy8gT25seSBmaXJlIHBsdWdpbiBldmVudCBpZiBwbHVnaW4gaXMgZW5hYmxlZCBpbiB0aGlzIHNvcnRhYmxlLFxuICAgICAgLy8gYW5kIHBsdWdpbiBoYXMgZXZlbnQgZGVmaW5lZFxuXG5cbiAgICAgIGlmIChzb3J0YWJsZS5vcHRpb25zW3BsdWdpbi5wbHVnaW5OYW1lXSAmJiBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lXSkge1xuICAgICAgICBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lXShfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGVcbiAgICAgICAgfSwgZXZ0KSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIGluaXRpYWxpemVQbHVnaW5zOiBmdW5jdGlvbiBpbml0aWFsaXplUGx1Z2lucyhzb3J0YWJsZSwgZWwsIGRlZmF1bHRzLCBvcHRpb25zKSB7XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHZhciBwbHVnaW5OYW1lID0gcGx1Z2luLnBsdWdpbk5hbWU7XG4gICAgICBpZiAoIXNvcnRhYmxlLm9wdGlvbnNbcGx1Z2luTmFtZV0gJiYgIXBsdWdpbi5pbml0aWFsaXplQnlEZWZhdWx0KSByZXR1cm47XG4gICAgICB2YXIgaW5pdGlhbGl6ZWQgPSBuZXcgcGx1Z2luKHNvcnRhYmxlLCBlbCwgc29ydGFibGUub3B0aW9ucyk7XG4gICAgICBpbml0aWFsaXplZC5zb3J0YWJsZSA9IHNvcnRhYmxlO1xuICAgICAgaW5pdGlhbGl6ZWQub3B0aW9ucyA9IHNvcnRhYmxlLm9wdGlvbnM7XG4gICAgICBzb3J0YWJsZVtwbHVnaW5OYW1lXSA9IGluaXRpYWxpemVkOyAvLyBBZGQgZGVmYXVsdCBvcHRpb25zIGZyb20gcGx1Z2luXG5cbiAgICAgIF9leHRlbmRzKGRlZmF1bHRzLCBpbml0aWFsaXplZC5kZWZhdWx0cyk7XG4gICAgfSk7XG5cbiAgICBmb3IgKHZhciBvcHRpb24gaW4gc29ydGFibGUub3B0aW9ucykge1xuICAgICAgaWYgKCFzb3J0YWJsZS5vcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbikpIGNvbnRpbnVlO1xuICAgICAgdmFyIG1vZGlmaWVkID0gdGhpcy5tb2RpZnlPcHRpb24oc29ydGFibGUsIG9wdGlvbiwgc29ydGFibGUub3B0aW9uc1tvcHRpb25dKTtcblxuICAgICAgaWYgKHR5cGVvZiBtb2RpZmllZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc29ydGFibGUub3B0aW9uc1tvcHRpb25dID0gbW9kaWZpZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBnZXRFdmVudFByb3BlcnRpZXM6IGZ1bmN0aW9uIGdldEV2ZW50UHJvcGVydGllcyhuYW1lLCBzb3J0YWJsZSkge1xuICAgIHZhciBldmVudFByb3BlcnRpZXMgPSB7fTtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgaWYgKHR5cGVvZiBwbHVnaW4uZXZlbnRQcm9wZXJ0aWVzICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XG5cbiAgICAgIF9leHRlbmRzKGV2ZW50UHJvcGVydGllcywgcGx1Z2luLmV2ZW50UHJvcGVydGllcy5jYWxsKHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSwgbmFtZSkpO1xuICAgIH0pO1xuICAgIHJldHVybiBldmVudFByb3BlcnRpZXM7XG4gIH0sXG4gIG1vZGlmeU9wdGlvbjogZnVuY3Rpb24gbW9kaWZ5T3B0aW9uKHNvcnRhYmxlLCBuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBtb2RpZmllZFZhbHVlO1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICAvLyBQbHVnaW4gbXVzdCBleGlzdCBvbiB0aGUgU29ydGFibGVcbiAgICAgIGlmICghc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdKSByZXR1cm47IC8vIElmIHN0YXRpYyBvcHRpb24gbGlzdGVuZXIgZXhpc3RzIGZvciB0aGlzIG9wdGlvbiwgY2FsbCBpbiB0aGUgY29udGV4dCBvZiB0aGUgU29ydGFibGUncyBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpblxuXG4gICAgICBpZiAocGx1Z2luLm9wdGlvbkxpc3RlbmVycyAmJiB0eXBlb2YgcGx1Z2luLm9wdGlvbkxpc3RlbmVyc1tuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtb2RpZmllZFZhbHVlID0gcGx1Z2luLm9wdGlvbkxpc3RlbmVyc1tuYW1lXS5jYWxsKHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtb2RpZmllZFZhbHVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KF9yZWYpIHtcbiAgdmFyIHNvcnRhYmxlID0gX3JlZi5zb3J0YWJsZSxcbiAgICAgIHJvb3RFbCA9IF9yZWYucm9vdEVsLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgIHRhcmdldEVsID0gX3JlZi50YXJnZXRFbCxcbiAgICAgIGNsb25lRWwgPSBfcmVmLmNsb25lRWwsXG4gICAgICB0b0VsID0gX3JlZi50b0VsLFxuICAgICAgZnJvbUVsID0gX3JlZi5mcm9tRWwsXG4gICAgICBvbGRJbmRleCA9IF9yZWYub2xkSW5kZXgsXG4gICAgICBuZXdJbmRleCA9IF9yZWYubmV3SW5kZXgsXG4gICAgICBvbGREcmFnZ2FibGVJbmRleCA9IF9yZWYub2xkRHJhZ2dhYmxlSW5kZXgsXG4gICAgICBuZXdEcmFnZ2FibGVJbmRleCA9IF9yZWYubmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgICBvcmlnaW5hbEV2ZW50ID0gX3JlZi5vcmlnaW5hbEV2ZW50LFxuICAgICAgcHV0U29ydGFibGUgPSBfcmVmLnB1dFNvcnRhYmxlLFxuICAgICAgZXh0cmFFdmVudFByb3BlcnRpZXMgPSBfcmVmLmV4dHJhRXZlbnRQcm9wZXJ0aWVzO1xuICBzb3J0YWJsZSA9IHNvcnRhYmxlIHx8IHJvb3RFbCAmJiByb290RWxbZXhwYW5kb107XG4gIGlmICghc29ydGFibGUpIHJldHVybjtcbiAgdmFyIGV2dCxcbiAgICAgIG9wdGlvbnMgPSBzb3J0YWJsZS5vcHRpb25zLFxuICAgICAgb25OYW1lID0gJ29uJyArIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cigxKTsgLy8gU3VwcG9ydCBmb3IgbmV3IEN1c3RvbUV2ZW50IGZlYXR1cmVcblxuICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmICFJRTExT3JMZXNzICYmICFFZGdlKSB7XG4gICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KG5hbWUsIHtcbiAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZ0LmluaXRFdmVudChuYW1lLCB0cnVlLCB0cnVlKTtcbiAgfVxuXG4gIGV2dC50byA9IHRvRWwgfHwgcm9vdEVsO1xuICBldnQuZnJvbSA9IGZyb21FbCB8fCByb290RWw7XG4gIGV2dC5pdGVtID0gdGFyZ2V0RWwgfHwgcm9vdEVsO1xuICBldnQuY2xvbmUgPSBjbG9uZUVsO1xuICBldnQub2xkSW5kZXggPSBvbGRJbmRleDtcbiAgZXZ0Lm5ld0luZGV4ID0gbmV3SW5kZXg7XG4gIGV2dC5vbGREcmFnZ2FibGVJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4O1xuICBldnQubmV3RHJhZ2dhYmxlSW5kZXggPSBuZXdEcmFnZ2FibGVJbmRleDtcbiAgZXZ0Lm9yaWdpbmFsRXZlbnQgPSBvcmlnaW5hbEV2ZW50O1xuICBldnQucHVsbE1vZGUgPSBwdXRTb3J0YWJsZSA/IHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlIDogdW5kZWZpbmVkO1xuXG4gIHZhciBhbGxFdmVudFByb3BlcnRpZXMgPSBfb2JqZWN0U3ByZWFkKHt9LCBleHRyYUV2ZW50UHJvcGVydGllcywgUGx1Z2luTWFuYWdlci5nZXRFdmVudFByb3BlcnRpZXMobmFtZSwgc29ydGFibGUpKTtcblxuICBmb3IgKHZhciBvcHRpb24gaW4gYWxsRXZlbnRQcm9wZXJ0aWVzKSB7XG4gICAgZXZ0W29wdGlvbl0gPSBhbGxFdmVudFByb3BlcnRpZXNbb3B0aW9uXTtcbiAgfVxuXG4gIGlmIChyb290RWwpIHtcbiAgICByb290RWwuZGlzcGF0Y2hFdmVudChldnQpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnNbb25OYW1lXSkge1xuICAgIG9wdGlvbnNbb25OYW1lXS5jYWxsKHNvcnRhYmxlLCBldnQpO1xuICB9XG59XG5cbnZhciBwbHVnaW5FdmVudCA9IGZ1bmN0aW9uIHBsdWdpbkV2ZW50KGV2ZW50TmFtZSwgc29ydGFibGUpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9LFxuICAgICAgb3JpZ2luYWxFdmVudCA9IF9yZWYuZXZ0LFxuICAgICAgZGF0YSA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBbXCJldnRcIl0pO1xuXG4gIFBsdWdpbk1hbmFnZXIucGx1Z2luRXZlbnQuYmluZChTb3J0YWJsZSkoZXZlbnROYW1lLCBzb3J0YWJsZSwgX29iamVjdFNwcmVhZCh7XG4gICAgZHJhZ0VsOiBkcmFnRWwsXG4gICAgcGFyZW50RWw6IHBhcmVudEVsLFxuICAgIGdob3N0RWw6IGdob3N0RWwsXG4gICAgcm9vdEVsOiByb290RWwsXG4gICAgbmV4dEVsOiBuZXh0RWwsXG4gICAgbGFzdERvd25FbDogbGFzdERvd25FbCxcbiAgICBjbG9uZUVsOiBjbG9uZUVsLFxuICAgIGNsb25lSGlkZGVuOiBjbG9uZUhpZGRlbixcbiAgICBkcmFnU3RhcnRlZDogbW92ZWQsXG4gICAgcHV0U29ydGFibGU6IHB1dFNvcnRhYmxlLFxuICAgIGFjdGl2ZVNvcnRhYmxlOiBTb3J0YWJsZS5hY3RpdmUsXG4gICAgb3JpZ2luYWxFdmVudDogb3JpZ2luYWxFdmVudCxcbiAgICBvbGRJbmRleDogb2xkSW5kZXgsXG4gICAgb2xkRHJhZ2dhYmxlSW5kZXg6IG9sZERyYWdnYWJsZUluZGV4LFxuICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICBuZXdEcmFnZ2FibGVJbmRleDogbmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgaGlkZUdob3N0Rm9yVGFyZ2V0OiBfaGlkZUdob3N0Rm9yVGFyZ2V0LFxuICAgIHVuaGlkZUdob3N0Rm9yVGFyZ2V0OiBfdW5oaWRlR2hvc3RGb3JUYXJnZXQsXG4gICAgY2xvbmVOb3dIaWRkZW46IGZ1bmN0aW9uIGNsb25lTm93SGlkZGVuKCkge1xuICAgICAgY2xvbmVIaWRkZW4gPSB0cnVlO1xuICAgIH0sXG4gICAgY2xvbmVOb3dTaG93bjogZnVuY3Rpb24gY2xvbmVOb3dTaG93bigpIHtcbiAgICAgIGNsb25lSGlkZGVuID0gZmFsc2U7XG4gICAgfSxcbiAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQ6IGZ1bmN0aW9uIGRpc3BhdGNoU29ydGFibGVFdmVudChuYW1lKSB7XG4gICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogb3JpZ2luYWxFdmVudFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBkYXRhKSk7XG59O1xuXG5mdW5jdGlvbiBfZGlzcGF0Y2hFdmVudChpbmZvKSB7XG4gIGRpc3BhdGNoRXZlbnQoX29iamVjdFNwcmVhZCh7XG4gICAgcHV0U29ydGFibGU6IHB1dFNvcnRhYmxlLFxuICAgIGNsb25lRWw6IGNsb25lRWwsXG4gICAgdGFyZ2V0RWw6IGRyYWdFbCxcbiAgICByb290RWw6IHJvb3RFbCxcbiAgICBvbGRJbmRleDogb2xkSW5kZXgsXG4gICAgb2xkRHJhZ2dhYmxlSW5kZXg6IG9sZERyYWdnYWJsZUluZGV4LFxuICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICBuZXdEcmFnZ2FibGVJbmRleDogbmV3RHJhZ2dhYmxlSW5kZXhcbiAgfSwgaW5mbykpO1xufVxuXG52YXIgZHJhZ0VsLFxuICAgIHBhcmVudEVsLFxuICAgIGdob3N0RWwsXG4gICAgcm9vdEVsLFxuICAgIG5leHRFbCxcbiAgICBsYXN0RG93bkVsLFxuICAgIGNsb25lRWwsXG4gICAgY2xvbmVIaWRkZW4sXG4gICAgb2xkSW5kZXgsXG4gICAgbmV3SW5kZXgsXG4gICAgb2xkRHJhZ2dhYmxlSW5kZXgsXG4gICAgbmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgYWN0aXZlR3JvdXAsXG4gICAgcHV0U29ydGFibGUsXG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlLFxuICAgIGlnbm9yZU5leHRDbGljayA9IGZhbHNlLFxuICAgIHNvcnRhYmxlcyA9IFtdLFxuICAgIHRhcEV2dCxcbiAgICB0b3VjaEV2dCxcbiAgICBsYXN0RHgsXG4gICAgbGFzdER5LFxuICAgIHRhcERpc3RhbmNlTGVmdCxcbiAgICB0YXBEaXN0YW5jZVRvcCxcbiAgICBtb3ZlZCxcbiAgICBsYXN0VGFyZ2V0LFxuICAgIGxhc3REaXJlY3Rpb24sXG4gICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2UsXG4gICAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9IGZhbHNlLFxuICAgIHRhcmdldE1vdmVEaXN0YW5jZSxcbiAgICAvLyBGb3IgcG9zaXRpb25pbmcgZ2hvc3QgYWJzb2x1dGVseVxuZ2hvc3RSZWxhdGl2ZVBhcmVudCxcbiAgICBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbCA9IFtdLFxuICAgIC8vIChsZWZ0LCB0b3ApXG5fc2lsZW50ID0gZmFsc2UsXG4gICAgc2F2ZWRJbnB1dENoZWNrZWQgPSBbXTtcbi8qKiBAY29uc3QgKi9cblxudmFyIGRvY3VtZW50RXhpc3RzID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyxcbiAgICBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSA9IElPUyxcbiAgICBDU1NGbG9hdFByb3BlcnR5ID0gRWRnZSB8fCBJRTExT3JMZXNzID8gJ2Nzc0Zsb2F0JyA6ICdmbG9hdCcsXG4gICAgLy8gVGhpcyB3aWxsIG5vdCBwYXNzIGZvciBJRTksIGJlY2F1c2UgSUU5IERuRCBvbmx5IHdvcmtzIG9uIGFuY2hvcnNcbnN1cHBvcnREcmFnZ2FibGUgPSBkb2N1bWVudEV4aXN0cyAmJiAhQ2hyb21lRm9yQW5kcm9pZCAmJiAhSU9TICYmICdkcmFnZ2FibGUnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLFxuICAgIHN1cHBvcnRDc3NQb2ludGVyRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIWRvY3VtZW50RXhpc3RzKSByZXR1cm47IC8vIGZhbHNlIHdoZW4gPD0gSUUxMVxuXG4gIGlmIChJRTExT3JMZXNzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgneCcpO1xuICBlbC5zdHlsZS5jc3NUZXh0ID0gJ3BvaW50ZXItZXZlbnRzOmF1dG8nO1xuICByZXR1cm4gZWwuc3R5bGUucG9pbnRlckV2ZW50cyA9PT0gJ2F1dG8nO1xufSgpLFxuICAgIF9kZXRlY3REaXJlY3Rpb24gPSBmdW5jdGlvbiBfZGV0ZWN0RGlyZWN0aW9uKGVsLCBvcHRpb25zKSB7XG4gIHZhciBlbENTUyA9IGNzcyhlbCksXG4gICAgICBlbFdpZHRoID0gcGFyc2VJbnQoZWxDU1Mud2lkdGgpIC0gcGFyc2VJbnQoZWxDU1MucGFkZGluZ0xlZnQpIC0gcGFyc2VJbnQoZWxDU1MucGFkZGluZ1JpZ2h0KSAtIHBhcnNlSW50KGVsQ1NTLmJvcmRlckxlZnRXaWR0aCkgLSBwYXJzZUludChlbENTUy5ib3JkZXJSaWdodFdpZHRoKSxcbiAgICAgIGNoaWxkMSA9IGdldENoaWxkKGVsLCAwLCBvcHRpb25zKSxcbiAgICAgIGNoaWxkMiA9IGdldENoaWxkKGVsLCAxLCBvcHRpb25zKSxcbiAgICAgIGZpcnN0Q2hpbGRDU1MgPSBjaGlsZDEgJiYgY3NzKGNoaWxkMSksXG4gICAgICBzZWNvbmRDaGlsZENTUyA9IGNoaWxkMiAmJiBjc3MoY2hpbGQyKSxcbiAgICAgIGZpcnN0Q2hpbGRXaWR0aCA9IGZpcnN0Q2hpbGRDU1MgJiYgcGFyc2VJbnQoZmlyc3RDaGlsZENTUy5tYXJnaW5MZWZ0KSArIHBhcnNlSW50KGZpcnN0Q2hpbGRDU1MubWFyZ2luUmlnaHQpICsgZ2V0UmVjdChjaGlsZDEpLndpZHRoLFxuICAgICAgc2Vjb25kQ2hpbGRXaWR0aCA9IHNlY29uZENoaWxkQ1NTICYmIHBhcnNlSW50KHNlY29uZENoaWxkQ1NTLm1hcmdpbkxlZnQpICsgcGFyc2VJbnQoc2Vjb25kQ2hpbGRDU1MubWFyZ2luUmlnaHQpICsgZ2V0UmVjdChjaGlsZDIpLndpZHRoO1xuXG4gIGlmIChlbENTUy5kaXNwbGF5ID09PSAnZmxleCcpIHtcbiAgICByZXR1cm4gZWxDU1MuZmxleERpcmVjdGlvbiA9PT0gJ2NvbHVtbicgfHwgZWxDU1MuZmxleERpcmVjdGlvbiA9PT0gJ2NvbHVtbi1yZXZlcnNlJyA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gIH1cblxuICBpZiAoZWxDU1MuZGlzcGxheSA9PT0gJ2dyaWQnKSB7XG4gICAgcmV0dXJuIGVsQ1NTLmdyaWRUZW1wbGF0ZUNvbHVtbnMuc3BsaXQoJyAnKS5sZW5ndGggPD0gMSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gIH1cblxuICBpZiAoY2hpbGQxICYmIGZpcnN0Q2hpbGRDU1NbXCJmbG9hdFwiXSAmJiBmaXJzdENoaWxkQ1NTW1wiZmxvYXRcIl0gIT09ICdub25lJykge1xuICAgIHZhciB0b3VjaGluZ1NpZGVDaGlsZDIgPSBmaXJzdENoaWxkQ1NTW1wiZmxvYXRcIl0gPT09ICdsZWZ0JyA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgcmV0dXJuIGNoaWxkMiAmJiAoc2Vjb25kQ2hpbGRDU1MuY2xlYXIgPT09ICdib3RoJyB8fCBzZWNvbmRDaGlsZENTUy5jbGVhciA9PT0gdG91Y2hpbmdTaWRlQ2hpbGQyKSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gIH1cblxuICByZXR1cm4gY2hpbGQxICYmIChmaXJzdENoaWxkQ1NTLmRpc3BsYXkgPT09ICdibG9jaycgfHwgZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAnZmxleCcgfHwgZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAndGFibGUnIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ2dyaWQnIHx8IGZpcnN0Q2hpbGRXaWR0aCA+PSBlbFdpZHRoICYmIGVsQ1NTW0NTU0Zsb2F0UHJvcGVydHldID09PSAnbm9uZScgfHwgY2hpbGQyICYmIGVsQ1NTW0NTU0Zsb2F0UHJvcGVydHldID09PSAnbm9uZScgJiYgZmlyc3RDaGlsZFdpZHRoICsgc2Vjb25kQ2hpbGRXaWR0aCA+IGVsV2lkdGgpID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbn0sXG4gICAgX2RyYWdFbEluUm93Q29sdW1uID0gZnVuY3Rpb24gX2RyYWdFbEluUm93Q29sdW1uKGRyYWdSZWN0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCkge1xuICB2YXIgZHJhZ0VsUzFPcHAgPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LmxlZnQgOiBkcmFnUmVjdC50b3AsXG4gICAgICBkcmFnRWxTMk9wcCA9IHZlcnRpY2FsID8gZHJhZ1JlY3QucmlnaHQgOiBkcmFnUmVjdC5ib3R0b20sXG4gICAgICBkcmFnRWxPcHBMZW5ndGggPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LndpZHRoIDogZHJhZ1JlY3QuaGVpZ2h0LFxuICAgICAgdGFyZ2V0UzFPcHAgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QubGVmdCA6IHRhcmdldFJlY3QudG9wLFxuICAgICAgdGFyZ2V0UzJPcHAgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QucmlnaHQgOiB0YXJnZXRSZWN0LmJvdHRvbSxcbiAgICAgIHRhcmdldE9wcExlbmd0aCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC53aWR0aCA6IHRhcmdldFJlY3QuaGVpZ2h0O1xuICByZXR1cm4gZHJhZ0VsUzFPcHAgPT09IHRhcmdldFMxT3BwIHx8IGRyYWdFbFMyT3BwID09PSB0YXJnZXRTMk9wcCB8fCBkcmFnRWxTMU9wcCArIGRyYWdFbE9wcExlbmd0aCAvIDIgPT09IHRhcmdldFMxT3BwICsgdGFyZ2V0T3BwTGVuZ3RoIC8gMjtcbn0sXG5cbi8qKlxuICogRGV0ZWN0cyBmaXJzdCBuZWFyZXN0IGVtcHR5IHNvcnRhYmxlIHRvIFggYW5kIFkgcG9zaXRpb24gdXNpbmcgZW1wdHlJbnNlcnRUaHJlc2hvbGQuXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHggICAgICBYIHBvc2l0aW9uXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IHkgICAgICBZIHBvc2l0aW9uXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICBFbGVtZW50IG9mIHRoZSBmaXJzdCBmb3VuZCBuZWFyZXN0IFNvcnRhYmxlXG4gKi9cbl9kZXRlY3ROZWFyZXN0RW1wdHlTb3J0YWJsZSA9IGZ1bmN0aW9uIF9kZXRlY3ROZWFyZXN0RW1wdHlTb3J0YWJsZSh4LCB5KSB7XG4gIHZhciByZXQ7XG4gIHNvcnRhYmxlcy5zb21lKGZ1bmN0aW9uIChzb3J0YWJsZSkge1xuICAgIGlmIChsYXN0Q2hpbGQoc29ydGFibGUpKSByZXR1cm47XG4gICAgdmFyIHJlY3QgPSBnZXRSZWN0KHNvcnRhYmxlKSxcbiAgICAgICAgdGhyZXNob2xkID0gc29ydGFibGVbZXhwYW5kb10ub3B0aW9ucy5lbXB0eUluc2VydFRocmVzaG9sZCxcbiAgICAgICAgaW5zaWRlSG9yaXpvbnRhbGx5ID0geCA+PSByZWN0LmxlZnQgLSB0aHJlc2hvbGQgJiYgeCA8PSByZWN0LnJpZ2h0ICsgdGhyZXNob2xkLFxuICAgICAgICBpbnNpZGVWZXJ0aWNhbGx5ID0geSA+PSByZWN0LnRvcCAtIHRocmVzaG9sZCAmJiB5IDw9IHJlY3QuYm90dG9tICsgdGhyZXNob2xkO1xuXG4gICAgaWYgKHRocmVzaG9sZCAmJiBpbnNpZGVIb3Jpem9udGFsbHkgJiYgaW5zaWRlVmVydGljYWxseSkge1xuICAgICAgcmV0dXJuIHJldCA9IHNvcnRhYmxlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXQ7XG59LFxuICAgIF9wcmVwYXJlR3JvdXAgPSBmdW5jdGlvbiBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpIHtcbiAgZnVuY3Rpb24gdG9Gbih2YWx1ZSwgcHVsbCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodG8sIGZyb20sIGRyYWdFbCwgZXZ0KSB7XG4gICAgICB2YXIgc2FtZUdyb3VwID0gdG8ub3B0aW9ucy5ncm91cC5uYW1lICYmIGZyb20ub3B0aW9ucy5ncm91cC5uYW1lICYmIHRvLm9wdGlvbnMuZ3JvdXAubmFtZSA9PT0gZnJvbS5vcHRpb25zLmdyb3VwLm5hbWU7XG5cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIChwdWxsIHx8IHNhbWVHcm91cCkpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBwdWxsIHZhbHVlXG4gICAgICAgIC8vIERlZmF1bHQgcHVsbCBhbmQgcHV0IHZhbHVlIGlmIHNhbWUgZ3JvdXBcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAocHVsbCAmJiB2YWx1ZSA9PT0gJ2Nsb25lJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdG9Gbih2YWx1ZSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpLCBwdWxsKSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG90aGVyR3JvdXAgPSAocHVsbCA/IHRvIDogZnJvbSkub3B0aW9ucy5ncm91cC5uYW1lO1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSA9PT0gb3RoZXJHcm91cCB8fCB2YWx1ZS5qb2luICYmIHZhbHVlLmluZGV4T2Yob3RoZXJHcm91cCkgPiAtMTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGdyb3VwID0ge307XG4gIHZhciBvcmlnaW5hbEdyb3VwID0gb3B0aW9ucy5ncm91cDtcblxuICBpZiAoIW9yaWdpbmFsR3JvdXAgfHwgX3R5cGVvZihvcmlnaW5hbEdyb3VwKSAhPSAnb2JqZWN0Jykge1xuICAgIG9yaWdpbmFsR3JvdXAgPSB7XG4gICAgICBuYW1lOiBvcmlnaW5hbEdyb3VwXG4gICAgfTtcbiAgfVxuXG4gIGdyb3VwLm5hbWUgPSBvcmlnaW5hbEdyb3VwLm5hbWU7XG4gIGdyb3VwLmNoZWNrUHVsbCA9IHRvRm4ob3JpZ2luYWxHcm91cC5wdWxsLCB0cnVlKTtcbiAgZ3JvdXAuY2hlY2tQdXQgPSB0b0ZuKG9yaWdpbmFsR3JvdXAucHV0KTtcbiAgZ3JvdXAucmV2ZXJ0Q2xvbmUgPSBvcmlnaW5hbEdyb3VwLnJldmVydENsb25lO1xuICBvcHRpb25zLmdyb3VwID0gZ3JvdXA7XG59LFxuICAgIF9oaWRlR2hvc3RGb3JUYXJnZXQgPSBmdW5jdGlvbiBfaGlkZUdob3N0Rm9yVGFyZ2V0KCkge1xuICBpZiAoIXN1cHBvcnRDc3NQb2ludGVyRXZlbnRzICYmIGdob3N0RWwpIHtcbiAgICBjc3MoZ2hvc3RFbCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xuICB9XG59LFxuICAgIF91bmhpZGVHaG9zdEZvclRhcmdldCA9IGZ1bmN0aW9uIF91bmhpZGVHaG9zdEZvclRhcmdldCgpIHtcbiAgaWYgKCFzdXBwb3J0Q3NzUG9pbnRlckV2ZW50cyAmJiBnaG9zdEVsKSB7XG4gICAgY3NzKGdob3N0RWwsICdkaXNwbGF5JywgJycpO1xuICB9XG59OyAvLyAjMTE4NCBmaXggLSBQcmV2ZW50IGNsaWNrIGV2ZW50IG9uIGZhbGxiYWNrIGlmIGRyYWdnZWQgYnV0IGl0ZW0gbm90IGNoYW5nZWQgcG9zaXRpb25cblxuXG5pZiAoZG9jdW1lbnRFeGlzdHMpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgaWYgKGlnbm9yZU5leHRDbGljaykge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldnQuc3RvcFByb3BhZ2F0aW9uICYmIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gJiYgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgaWdub3JlTmV4dENsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB0cnVlKTtcbn1cblxudmFyIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50ID0gZnVuY3Rpb24gbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQoZXZ0KSB7XG4gIGlmIChkcmFnRWwpIHtcbiAgICBldnQgPSBldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0O1xuXG4gICAgdmFyIG5lYXJlc3QgPSBfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcblxuICAgIGlmIChuZWFyZXN0KSB7XG4gICAgICAvLyBDcmVhdGUgaW1pdGF0aW9uIGV2ZW50XG4gICAgICB2YXIgZXZlbnQgPSB7fTtcblxuICAgICAgZm9yICh2YXIgaSBpbiBldnQpIHtcbiAgICAgICAgaWYgKGV2dC5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgIGV2ZW50W2ldID0gZXZ0W2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV2ZW50LnRhcmdldCA9IGV2ZW50LnJvb3RFbCA9IG5lYXJlc3Q7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCA9IHZvaWQgMDtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IHZvaWQgMDtcblxuICAgICAgbmVhcmVzdFtleHBhbmRvXS5fb25EcmFnT3ZlcihldmVudCk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgX2NoZWNrT3V0c2lkZVRhcmdldEVsID0gZnVuY3Rpb24gX2NoZWNrT3V0c2lkZVRhcmdldEVsKGV2dCkge1xuICBpZiAoZHJhZ0VsKSB7XG4gICAgZHJhZ0VsLnBhcmVudE5vZGVbZXhwYW5kb10uX2lzT3V0c2lkZVRoaXNFbChldnQudGFyZ2V0KTtcbiAgfVxufTtcbi8qKlxuICogQGNsYXNzICBTb3J0YWJsZVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICBlbFxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICBbb3B0aW9uc11cbiAqL1xuXG5cbmZ1bmN0aW9uIFNvcnRhYmxlKGVsLCBvcHRpb25zKSB7XG4gIGlmICghKGVsICYmIGVsLm5vZGVUeXBlICYmIGVsLm5vZGVUeXBlID09PSAxKSkge1xuICAgIHRocm93IFwiU29ydGFibGU6IGBlbGAgbXVzdCBiZSBhbiBIVE1MRWxlbWVudCwgbm90IFwiLmNvbmNhdCh7fS50b1N0cmluZy5jYWxsKGVsKSk7XG4gIH1cblxuICB0aGlzLmVsID0gZWw7IC8vIHJvb3QgZWxlbWVudFxuXG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgb3B0aW9ucyk7IC8vIEV4cG9ydCBpbnN0YW5jZVxuXG4gIGVsW2V4cGFuZG9dID0gdGhpcztcbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIGdyb3VwOiBudWxsLFxuICAgIHNvcnQ6IHRydWUsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHN0b3JlOiBudWxsLFxuICAgIGhhbmRsZTogbnVsbCxcbiAgICBkcmFnZ2FibGU6IC9eW3VvXWwkL2kudGVzdChlbC5ub2RlTmFtZSkgPyAnPmxpJyA6ICc+KicsXG4gICAgc3dhcFRocmVzaG9sZDogMSxcbiAgICAvLyBwZXJjZW50YWdlOyAwIDw9IHggPD0gMVxuICAgIGludmVydFN3YXA6IGZhbHNlLFxuICAgIC8vIGludmVydCBhbHdheXNcbiAgICBpbnZlcnRlZFN3YXBUaHJlc2hvbGQ6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgdG8gc2FtZSBhcyBzd2FwVGhyZXNob2xkIGlmIGRlZmF1bHRcbiAgICByZW1vdmVDbG9uZU9uSGlkZTogdHJ1ZSxcbiAgICBkaXJlY3Rpb246IGZ1bmN0aW9uIGRpcmVjdGlvbigpIHtcbiAgICAgIHJldHVybiBfZGV0ZWN0RGlyZWN0aW9uKGVsLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0sXG4gICAgZ2hvc3RDbGFzczogJ3NvcnRhYmxlLWdob3N0JyxcbiAgICBjaG9zZW5DbGFzczogJ3NvcnRhYmxlLWNob3NlbicsXG4gICAgZHJhZ0NsYXNzOiAnc29ydGFibGUtZHJhZycsXG4gICAgaWdub3JlOiAnYSwgaW1nJyxcbiAgICBmaWx0ZXI6IG51bGwsXG4gICAgcHJldmVudE9uRmlsdGVyOiB0cnVlLFxuICAgIGFuaW1hdGlvbjogMCxcbiAgICBlYXNpbmc6IG51bGwsXG4gICAgc2V0RGF0YTogZnVuY3Rpb24gc2V0RGF0YShkYXRhVHJhbnNmZXIsIGRyYWdFbCkge1xuICAgICAgZGF0YVRyYW5zZmVyLnNldERhdGEoJ1RleHQnLCBkcmFnRWwudGV4dENvbnRlbnQpO1xuICAgIH0sXG4gICAgZHJvcEJ1YmJsZTogZmFsc2UsXG4gICAgZHJhZ292ZXJCdWJibGU6IGZhbHNlLFxuICAgIGRhdGFJZEF0dHI6ICdkYXRhLWlkJyxcbiAgICBkZWxheTogMCxcbiAgICBkZWxheU9uVG91Y2hPbmx5OiBmYWxzZSxcbiAgICB0b3VjaFN0YXJ0VGhyZXNob2xkOiAoTnVtYmVyLnBhcnNlSW50ID8gTnVtYmVyIDogd2luZG93KS5wYXJzZUludCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMTApIHx8IDEsXG4gICAgZm9yY2VGYWxsYmFjazogZmFsc2UsXG4gICAgZmFsbGJhY2tDbGFzczogJ3NvcnRhYmxlLWZhbGxiYWNrJyxcbiAgICBmYWxsYmFja09uQm9keTogZmFsc2UsXG4gICAgZmFsbGJhY2tUb2xlcmFuY2U6IDAsXG4gICAgZmFsbGJhY2tPZmZzZXQ6IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfSxcbiAgICBzdXBwb3J0UG9pbnRlcjogU29ydGFibGUuc3VwcG9ydFBvaW50ZXIgIT09IGZhbHNlICYmICdQb2ludGVyRXZlbnQnIGluIHdpbmRvdyAmJiAhU2FmYXJpLFxuICAgIGVtcHR5SW5zZXJ0VGhyZXNob2xkOiA1XG4gIH07XG4gIFBsdWdpbk1hbmFnZXIuaW5pdGlhbGl6ZVBsdWdpbnModGhpcywgZWwsIGRlZmF1bHRzKTsgLy8gU2V0IGRlZmF1bHQgb3B0aW9uc1xuXG4gIGZvciAodmFyIG5hbWUgaW4gZGVmYXVsdHMpIHtcbiAgICAhKG5hbWUgaW4gb3B0aW9ucykgJiYgKG9wdGlvbnNbbmFtZV0gPSBkZWZhdWx0c1tuYW1lXSk7XG4gIH1cblxuICBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpOyAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcblxuXG4gIGZvciAodmFyIGZuIGluIHRoaXMpIHtcbiAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgfVxuICB9IC8vIFNldHVwIGRyYWcgbW9kZVxuXG5cbiAgdGhpcy5uYXRpdmVEcmFnZ2FibGUgPSBvcHRpb25zLmZvcmNlRmFsbGJhY2sgPyBmYWxzZSA6IHN1cHBvcnREcmFnZ2FibGU7XG5cbiAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgLy8gVG91Y2ggc3RhcnQgdGhyZXNob2xkIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG5hdGl2ZSBkcmFnc3RhcnQgdGhyZXNob2xkXG4gICAgdGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgPSAxO1xuICB9IC8vIEJpbmQgZXZlbnRzXG5cblxuICBpZiAob3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgIG9uKGVsLCAncG9pbnRlcmRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgfSBlbHNlIHtcbiAgICBvbihlbCwgJ21vdXNlZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgIG9uKGVsLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVGFwU3RhcnQpO1xuICB9XG5cbiAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgb24oZWwsICdkcmFnb3ZlcicsIHRoaXMpO1xuICAgIG9uKGVsLCAnZHJhZ2VudGVyJywgdGhpcyk7XG4gIH1cblxuICBzb3J0YWJsZXMucHVzaCh0aGlzLmVsKTsgLy8gUmVzdG9yZSBzb3J0aW5nXG5cbiAgb3B0aW9ucy5zdG9yZSAmJiBvcHRpb25zLnN0b3JlLmdldCAmJiB0aGlzLnNvcnQob3B0aW9ucy5zdG9yZS5nZXQodGhpcykgfHwgW10pOyAvLyBBZGQgYW5pbWF0aW9uIHN0YXRlIG1hbmFnZXJcblxuICBfZXh0ZW5kcyh0aGlzLCBBbmltYXRpb25TdGF0ZU1hbmFnZXIoKSk7XG59XG5cblNvcnRhYmxlLnByb3RvdHlwZSA9XG4vKiogQGxlbmRzIFNvcnRhYmxlLnByb3RvdHlwZSAqL1xue1xuICBjb25zdHJ1Y3RvcjogU29ydGFibGUsXG4gIF9pc091dHNpZGVUaGlzRWw6IGZ1bmN0aW9uIF9pc091dHNpZGVUaGlzRWwodGFyZ2V0KSB7XG4gICAgaWYgKCF0aGlzLmVsLmNvbnRhaW5zKHRhcmdldCkgJiYgdGFyZ2V0ICE9PSB0aGlzLmVsKSB7XG4gICAgICBsYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICB9XG4gIH0sXG4gIF9nZXREaXJlY3Rpb246IGZ1bmN0aW9uIF9nZXREaXJlY3Rpb24oZXZ0LCB0YXJnZXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMub3B0aW9ucy5kaXJlY3Rpb24gPT09ICdmdW5jdGlvbicgPyB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uLmNhbGwodGhpcywgZXZ0LCB0YXJnZXQsIGRyYWdFbCkgOiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICB9LFxuICBfb25UYXBTdGFydDogZnVuY3Rpb24gX29uVGFwU3RhcnQoXG4gIC8qKiBFdmVudHxUb3VjaEV2ZW50ICovXG4gIGV2dCkge1xuICAgIGlmICghZXZ0LmNhbmNlbGFibGUpIHJldHVybjtcblxuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICAgIGVsID0gdGhpcy5lbCxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgcHJldmVudE9uRmlsdGVyID0gb3B0aW9ucy5wcmV2ZW50T25GaWx0ZXIsXG4gICAgICAgIHR5cGUgPSBldnQudHlwZSxcbiAgICAgICAgdG91Y2ggPSBldnQudG91Y2hlcyAmJiBldnQudG91Y2hlc1swXSB8fCBldnQucG9pbnRlclR5cGUgJiYgZXZ0LnBvaW50ZXJUeXBlID09PSAndG91Y2gnICYmIGV2dCxcbiAgICAgICAgdGFyZ2V0ID0gKHRvdWNoIHx8IGV2dCkudGFyZ2V0LFxuICAgICAgICBvcmlnaW5hbFRhcmdldCA9IGV2dC50YXJnZXQuc2hhZG93Um9vdCAmJiAoZXZ0LnBhdGggJiYgZXZ0LnBhdGhbMF0gfHwgZXZ0LmNvbXBvc2VkUGF0aCAmJiBldnQuY29tcG9zZWRQYXRoKClbMF0pIHx8IHRhcmdldCxcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG5cbiAgICBfc2F2ZUlucHV0Q2hlY2tlZFN0YXRlKGVsKTsgLy8gRG9uJ3QgdHJpZ2dlciBzdGFydCBldmVudCB3aGVuIGFuIGVsZW1lbnQgaXMgYmVlbiBkcmFnZ2VkLCBvdGhlcndpc2UgdGhlIGV2dC5vbGRpbmRleCBhbHdheXMgd3Jvbmcgd2hlbiBzZXQgb3B0aW9uLmdyb3VwLlxuXG5cbiAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKC9tb3VzZWRvd258cG9pbnRlcmRvd24vLnRlc3QodHlwZSkgJiYgZXZ0LmJ1dHRvbiAhPT0gMCB8fCBvcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47IC8vIG9ubHkgbGVmdCBidXR0b24gYW5kIGVuYWJsZWRcbiAgICB9IC8vIGNhbmNlbCBkbmQgaWYgb3JpZ2luYWwgdGFyZ2V0IGlzIGNvbnRlbnQgZWRpdGFibGVcblxuXG4gICAgaWYgKG9yaWdpbmFsVGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBTYWZhcmkgaWdub3JlcyBmdXJ0aGVyIGV2ZW50IGhhbmRsaW5nIGFmdGVyIG1vdXNlZG93blxuXG5cbiAgICBpZiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlICYmIFNhZmFyaSAmJiB0YXJnZXQgJiYgdGFyZ2V0LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSBjbG9zZXN0KHRhcmdldCwgb3B0aW9ucy5kcmFnZ2FibGUsIGVsLCBmYWxzZSk7XG5cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5hbmltYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsYXN0RG93bkVsID09PSB0YXJnZXQpIHtcbiAgICAgIC8vIElnbm9yaW5nIGR1cGxpY2F0ZSBgZG93bmBcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGRyYWdnZWQgZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudFxuXG5cbiAgICBvbGRJbmRleCA9IGluZGV4KHRhcmdldCk7XG4gICAgb2xkRHJhZ2dhYmxlSW5kZXggPSBpbmRleCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlKTsgLy8gQ2hlY2sgZmlsdGVyXG5cbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGZpbHRlci5jYWxsKHRoaXMsIGV2dCwgdGFyZ2V0LCB0aGlzKSkge1xuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgIHJvb3RFbDogb3JpZ2luYWxUYXJnZXQsXG4gICAgICAgICAgbmFtZTogJ2ZpbHRlcicsXG4gICAgICAgICAgdGFyZ2V0RWw6IHRhcmdldCxcbiAgICAgICAgICB0b0VsOiBlbCxcbiAgICAgICAgICBmcm9tRWw6IGVsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBsdWdpbkV2ZW50KCdmaWx0ZXInLCBfdGhpcywge1xuICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgIH0pO1xuICAgICAgICBwcmV2ZW50T25GaWx0ZXIgJiYgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjsgLy8gY2FuY2VsIGRuZFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSBmaWx0ZXIuc3BsaXQoJywnKS5zb21lKGZ1bmN0aW9uIChjcml0ZXJpYSkge1xuICAgICAgICBjcml0ZXJpYSA9IGNsb3Nlc3Qob3JpZ2luYWxUYXJnZXQsIGNyaXRlcmlhLnRyaW0oKSwgZWwsIGZhbHNlKTtcblxuICAgICAgICBpZiAoY3JpdGVyaWEpIHtcbiAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgICAgICByb290RWw6IGNyaXRlcmlhLFxuICAgICAgICAgICAgbmFtZTogJ2ZpbHRlcicsXG4gICAgICAgICAgICB0YXJnZXRFbDogdGFyZ2V0LFxuICAgICAgICAgICAgZnJvbUVsOiBlbCxcbiAgICAgICAgICAgIHRvRWw6IGVsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwbHVnaW5FdmVudCgnZmlsdGVyJywgX3RoaXMsIHtcbiAgICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgIHByZXZlbnRPbkZpbHRlciAmJiBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuOyAvLyBjYW5jZWwgZG5kXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaGFuZGxlICYmICFjbG9zZXN0KG9yaWdpbmFsVGFyZ2V0LCBvcHRpb25zLmhhbmRsZSwgZWwsIGZhbHNlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gUHJlcGFyZSBgZHJhZ3N0YXJ0YFxuXG5cbiAgICB0aGlzLl9wcmVwYXJlRHJhZ1N0YXJ0KGV2dCwgdG91Y2gsIHRhcmdldCk7XG4gIH0sXG4gIF9wcmVwYXJlRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfcHJlcGFyZURyYWdTdGFydChcbiAgLyoqIEV2ZW50ICovXG4gIGV2dCxcbiAgLyoqIFRvdWNoICovXG4gIHRvdWNoLFxuICAvKiogSFRNTEVsZW1lbnQgKi9cbiAgdGFyZ2V0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcyxcbiAgICAgICAgZWwgPSBfdGhpcy5lbCxcbiAgICAgICAgb3B0aW9ucyA9IF90aGlzLm9wdGlvbnMsXG4gICAgICAgIG93bmVyRG9jdW1lbnQgPSBlbC5vd25lckRvY3VtZW50LFxuICAgICAgICBkcmFnU3RhcnRGbjtcblxuICAgIGlmICh0YXJnZXQgJiYgIWRyYWdFbCAmJiB0YXJnZXQucGFyZW50Tm9kZSA9PT0gZWwpIHtcbiAgICAgIHZhciBkcmFnUmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgIHJvb3RFbCA9IGVsO1xuICAgICAgZHJhZ0VsID0gdGFyZ2V0O1xuICAgICAgcGFyZW50RWwgPSBkcmFnRWwucGFyZW50Tm9kZTtcbiAgICAgIG5leHRFbCA9IGRyYWdFbC5uZXh0U2libGluZztcbiAgICAgIGxhc3REb3duRWwgPSB0YXJnZXQ7XG4gICAgICBhY3RpdmVHcm91cCA9IG9wdGlvbnMuZ3JvdXA7XG4gICAgICBTb3J0YWJsZS5kcmFnZ2VkID0gZHJhZ0VsO1xuICAgICAgdGFwRXZ0ID0ge1xuICAgICAgICB0YXJnZXQ6IGRyYWdFbCxcbiAgICAgICAgY2xpZW50WDogKHRvdWNoIHx8IGV2dCkuY2xpZW50WCxcbiAgICAgICAgY2xpZW50WTogKHRvdWNoIHx8IGV2dCkuY2xpZW50WVxuICAgICAgfTtcbiAgICAgIHRhcERpc3RhbmNlTGVmdCA9IHRhcEV2dC5jbGllbnRYIC0gZHJhZ1JlY3QubGVmdDtcbiAgICAgIHRhcERpc3RhbmNlVG9wID0gdGFwRXZ0LmNsaWVudFkgLSBkcmFnUmVjdC50b3A7XG4gICAgICB0aGlzLl9sYXN0WCA9ICh0b3VjaCB8fCBldnQpLmNsaWVudFg7XG4gICAgICB0aGlzLl9sYXN0WSA9ICh0b3VjaCB8fCBldnQpLmNsaWVudFk7XG4gICAgICBkcmFnRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnYWxsJztcblxuICAgICAgZHJhZ1N0YXJ0Rm4gPSBmdW5jdGlvbiBkcmFnU3RhcnRGbigpIHtcbiAgICAgICAgcGx1Z2luRXZlbnQoJ2RlbGF5RW5kZWQnLCBfdGhpcywge1xuICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgX3RoaXMuX29uRHJvcCgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIERlbGF5ZWQgZHJhZyBoYXMgYmVlbiB0cmlnZ2VyZWRcbiAgICAgICAgLy8gd2UgY2FuIHJlLWVuYWJsZSB0aGUgZXZlbnRzOiB0b3VjaG1vdmUvbW91c2Vtb3ZlXG5cblxuICAgICAgICBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCk7XG5cbiAgICAgICAgaWYgKCFGaXJlRm94ICYmIF90aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICAgIGRyYWdFbC5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB9IC8vIEJpbmQgdGhlIGV2ZW50czogZHJhZ3N0YXJ0L2RyYWdlbmRcblxuXG4gICAgICAgIF90aGlzLl90cmlnZ2VyRHJhZ1N0YXJ0KGV2dCwgdG91Y2gpOyAvLyBEcmFnIHN0YXJ0IGV2ZW50XG5cblxuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgIG5hbWU6ICdjaG9vc2UnLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICB9KTsgLy8gQ2hvc2VuIGl0ZW1cblxuXG4gICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5jaG9zZW5DbGFzcywgdHJ1ZSk7XG4gICAgICB9OyAvLyBEaXNhYmxlIFwiZHJhZ2dhYmxlXCJcblxuXG4gICAgICBvcHRpb25zLmlnbm9yZS5zcGxpdCgnLCcpLmZvckVhY2goZnVuY3Rpb24gKGNyaXRlcmlhKSB7XG4gICAgICAgIGZpbmQoZHJhZ0VsLCBjcml0ZXJpYS50cmltKCksIF9kaXNhYmxlRHJhZ2dhYmxlKTtcbiAgICAgIH0pO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ2RyYWdvdmVyJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ21vdXNlbW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaG1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoZW5kJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCBfdGhpcy5fb25Ecm9wKTsgLy8gTWFrZSBkcmFnRWwgZHJhZ2dhYmxlIChtdXN0IGJlIGJlZm9yZSBkZWxheSBmb3IgRmlyZUZveClcblxuICAgICAgaWYgKEZpcmVGb3ggJiYgdGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgPSA0O1xuICAgICAgICBkcmFnRWwuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcGx1Z2luRXZlbnQoJ2RlbGF5U3RhcnQnLCB0aGlzLCB7XG4gICAgICAgIGV2dDogZXZ0XG4gICAgICB9KTsgLy8gRGVsYXkgaXMgaW1wb3NzaWJsZSBmb3IgbmF0aXZlIERuRCBpbiBFZGdlIG9yIElFXG5cbiAgICAgIGlmIChvcHRpb25zLmRlbGF5ICYmICghb3B0aW9ucy5kZWxheU9uVG91Y2hPbmx5IHx8IHRvdWNoKSAmJiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlIHx8ICEoRWRnZSB8fCBJRTExT3JMZXNzKSkpIHtcbiAgICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgICB0aGlzLl9vbkRyb3AoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBJZiB0aGUgdXNlciBtb3ZlcyB0aGUgcG9pbnRlciBvciBsZXQgZ28gdGhlIGNsaWNrIG9yIHRvdWNoXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgZGVsYXkgaGFzIGJlZW4gcmVhY2hlZDpcbiAgICAgICAgLy8gZGlzYWJsZSB0aGUgZGVsYXllZCBkcmFnXG5cblxuICAgICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCBfdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBvcHRpb25zLnN1cHBvcnRQb2ludGVyICYmIG9uKG93bmVyRG9jdW1lbnQsICdwb2ludGVybW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBfdGhpcy5fZHJhZ1N0YXJ0VGltZXIgPSBzZXRUaW1lb3V0KGRyYWdTdGFydEZuLCBvcHRpb25zLmRlbGF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdTdGFydEZuKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBfZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyOiBmdW5jdGlvbiBfZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKFxuICAvKiogVG91Y2hFdmVudHxQb2ludGVyRXZlbnQgKiovXG4gIGUpIHtcbiAgICB2YXIgdG91Y2ggPSBlLnRvdWNoZXMgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgaWYgKE1hdGgubWF4KE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLl9sYXN0WCksIE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLl9sYXN0WSkpID49IE1hdGguZmxvb3IodGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgLyAodGhpcy5uYXRpdmVEcmFnZ2FibGUgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkpKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcoKTtcbiAgICB9XG4gIH0sXG4gIF9kaXNhYmxlRGVsYXllZERyYWc6IGZ1bmN0aW9uIF9kaXNhYmxlRGVsYXllZERyYWcoKSB7XG4gICAgZHJhZ0VsICYmIF9kaXNhYmxlRHJhZ2dhYmxlKGRyYWdFbCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2RyYWdTdGFydFRpbWVyKTtcblxuICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpO1xuICB9LFxuICBfZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzOiBmdW5jdGlvbiBfZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCkge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gdGhpcy5lbC5vd25lckRvY3VtZW50O1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgfSxcbiAgX3RyaWdnZXJEcmFnU3RhcnQ6IGZ1bmN0aW9uIF90cmlnZ2VyRHJhZ1N0YXJ0KFxuICAvKiogRXZlbnQgKi9cbiAgZXZ0LFxuICAvKiogVG91Y2ggKi9cbiAgdG91Y2gpIHtcbiAgICB0b3VjaCA9IHRvdWNoIHx8IGV2dC5wb2ludGVyVHlwZSA9PSAndG91Y2gnICYmIGV2dDtcblxuICAgIGlmICghdGhpcy5uYXRpdmVEcmFnZ2FibGUgfHwgdG91Y2gpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH0gZWxzZSBpZiAodG91Y2gpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbihkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb24oZHJhZ0VsLCAnZHJhZ2VuZCcsIHRoaXMpO1xuICAgICAgb24ocm9vdEVsLCAnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7XG4gICAgICAgIC8vIFRpbWVvdXQgbmVjY2Vzc2FyeSBmb3IgSUU5XG4gICAgICAgIF9uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge31cbiAgfSxcbiAgX2RyYWdTdGFydGVkOiBmdW5jdGlvbiBfZHJhZ1N0YXJ0ZWQoZmFsbGJhY2ssIGV2dCkge1xuXG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHJvb3RFbCAmJiBkcmFnRWwpIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdkcmFnU3RhcnRlZCcsIHRoaXMsIHtcbiAgICAgICAgZXZ0OiBldnRcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdkcmFnb3ZlcicsIF9jaGVja091dHNpZGVUYXJnZXRFbCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOyAvLyBBcHBseSBlZmZlY3RcblxuICAgICAgIWZhbGxiYWNrICYmIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIGZhbHNlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5naG9zdENsYXNzLCB0cnVlKTtcbiAgICAgIFNvcnRhYmxlLmFjdGl2ZSA9IHRoaXM7XG4gICAgICBmYWxsYmFjayAmJiB0aGlzLl9hcHBlbmRHaG9zdCgpOyAvLyBEcmFnIHN0YXJ0IGV2ZW50XG5cbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgIG5hbWU6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX251bGxpbmcoKTtcbiAgICB9XG4gIH0sXG4gIF9lbXVsYXRlRHJhZ092ZXI6IGZ1bmN0aW9uIF9lbXVsYXRlRHJhZ092ZXIoKSB7XG4gICAgaWYgKHRvdWNoRXZ0KSB7XG4gICAgICB0aGlzLl9sYXN0WCA9IHRvdWNoRXZ0LmNsaWVudFg7XG4gICAgICB0aGlzLl9sYXN0WSA9IHRvdWNoRXZ0LmNsaWVudFk7XG5cbiAgICAgIF9oaWRlR2hvc3RGb3JUYXJnZXQoKTtcblxuICAgICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQodG91Y2hFdnQuY2xpZW50WCwgdG91Y2hFdnQuY2xpZW50WSk7XG4gICAgICB2YXIgcGFyZW50ID0gdGFyZ2V0O1xuXG4gICAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC5zaGFkb3dSb290KSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5zaGFkb3dSb290LmVsZW1lbnRGcm9tUG9pbnQodG91Y2hFdnQuY2xpZW50WCwgdG91Y2hFdnQuY2xpZW50WSk7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IHBhcmVudCkgYnJlYWs7XG4gICAgICAgIHBhcmVudCA9IHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgZHJhZ0VsLnBhcmVudE5vZGVbZXhwYW5kb10uX2lzT3V0c2lkZVRoaXNFbCh0YXJnZXQpO1xuXG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAocGFyZW50W2V4cGFuZG9dKSB7XG4gICAgICAgICAgICB2YXIgaW5zZXJ0ZWQgPSB2b2lkIDA7XG4gICAgICAgICAgICBpbnNlcnRlZCA9IHBhcmVudFtleHBhbmRvXS5fb25EcmFnT3Zlcih7XG4gICAgICAgICAgICAgIGNsaWVudFg6IHRvdWNoRXZ0LmNsaWVudFgsXG4gICAgICAgICAgICAgIGNsaWVudFk6IHRvdWNoRXZ0LmNsaWVudFksXG4gICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICByb290RWw6IHBhcmVudFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChpbnNlcnRlZCAmJiAhdGhpcy5vcHRpb25zLmRyYWdvdmVyQnViYmxlKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRhcmdldCA9IHBhcmVudDsgLy8gc3RvcmUgbGFzdCBlbGVtZW50XG4gICAgICAgIH1cbiAgICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuICAgICAgICB3aGlsZSAocGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGUpO1xuICAgICAgfVxuXG4gICAgICBfdW5oaWRlR2hvc3RGb3JUYXJnZXQoKTtcbiAgICB9XG4gIH0sXG4gIF9vblRvdWNoTW92ZTogZnVuY3Rpb24gX29uVG91Y2hNb3ZlKFxuICAvKipUb3VjaEV2ZW50Ki9cbiAgZXZ0KSB7XG4gICAgaWYgKHRhcEV2dCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgZmFsbGJhY2tUb2xlcmFuY2UgPSBvcHRpb25zLmZhbGxiYWNrVG9sZXJhbmNlLFxuICAgICAgICAgIGZhbGxiYWNrT2Zmc2V0ID0gb3B0aW9ucy5mYWxsYmFja09mZnNldCxcbiAgICAgICAgICB0b3VjaCA9IGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQsXG4gICAgICAgICAgZ2hvc3RNYXRyaXggPSBnaG9zdEVsICYmIG1hdHJpeChnaG9zdEVsLCB0cnVlKSxcbiAgICAgICAgICBzY2FsZVggPSBnaG9zdEVsICYmIGdob3N0TWF0cml4ICYmIGdob3N0TWF0cml4LmEsXG4gICAgICAgICAgc2NhbGVZID0gZ2hvc3RFbCAmJiBnaG9zdE1hdHJpeCAmJiBnaG9zdE1hdHJpeC5kLFxuICAgICAgICAgIHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID0gUG9zaXRpb25HaG9zdEFic29sdXRlbHkgJiYgZ2hvc3RSZWxhdGl2ZVBhcmVudCAmJiBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChnaG9zdFJlbGF0aXZlUGFyZW50KSxcbiAgICAgICAgICBkeCA9ICh0b3VjaC5jbGllbnRYIC0gdGFwRXZ0LmNsaWVudFggKyBmYWxsYmFja09mZnNldC54KSAvIChzY2FsZVggfHwgMSkgKyAocmVsYXRpdmVTY3JvbGxPZmZzZXQgPyByZWxhdGl2ZVNjcm9sbE9mZnNldFswXSAtIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsWzBdIDogMCkgLyAoc2NhbGVYIHx8IDEpLFxuICAgICAgICAgIGR5ID0gKHRvdWNoLmNsaWVudFkgLSB0YXBFdnQuY2xpZW50WSArIGZhbGxiYWNrT2Zmc2V0LnkpIC8gKHNjYWxlWSB8fCAxKSArIChyZWxhdGl2ZVNjcm9sbE9mZnNldCA/IHJlbGF0aXZlU2Nyb2xsT2Zmc2V0WzFdIC0gZ2hvc3RSZWxhdGl2ZVBhcmVudEluaXRpYWxTY3JvbGxbMV0gOiAwKSAvIChzY2FsZVkgfHwgMSk7IC8vIG9ubHkgc2V0IHRoZSBzdGF0dXMgdG8gZHJhZ2dpbmcsIHdoZW4gd2UgYXJlIGFjdHVhbGx5IGRyYWdnaW5nXG5cbiAgICAgIGlmICghU29ydGFibGUuYWN0aXZlICYmICFhd2FpdGluZ0RyYWdTdGFydGVkKSB7XG4gICAgICAgIGlmIChmYWxsYmFja1RvbGVyYW5jZSAmJiBNYXRoLm1heChNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy5fbGFzdFgpLCBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy5fbGFzdFkpKSA8IGZhbGxiYWNrVG9sZXJhbmNlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25EcmFnU3RhcnQoZXZ0LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdob3N0RWwpIHtcbiAgICAgICAgaWYgKGdob3N0TWF0cml4KSB7XG4gICAgICAgICAgZ2hvc3RNYXRyaXguZSArPSBkeCAtIChsYXN0RHggfHwgMCk7XG4gICAgICAgICAgZ2hvc3RNYXRyaXguZiArPSBkeSAtIChsYXN0RHkgfHwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2hvc3RNYXRyaXggPSB7XG4gICAgICAgICAgICBhOiAxLFxuICAgICAgICAgICAgYjogMCxcbiAgICAgICAgICAgIGM6IDAsXG4gICAgICAgICAgICBkOiAxLFxuICAgICAgICAgICAgZTogZHgsXG4gICAgICAgICAgICBmOiBkeVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY3NzTWF0cml4ID0gXCJtYXRyaXgoXCIuY29uY2F0KGdob3N0TWF0cml4LmEsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguYiwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5jLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmQsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguZSwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5mLCBcIilcIik7XG4gICAgICAgIGNzcyhnaG9zdEVsLCAnd2Via2l0VHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICdtb3pUcmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgJ21zVHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBsYXN0RHggPSBkeDtcbiAgICAgICAgbGFzdER5ID0gZHk7XG4gICAgICAgIHRvdWNoRXZ0ID0gdG91Y2g7XG4gICAgICB9XG5cbiAgICAgIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSxcbiAgX2FwcGVuZEdob3N0OiBmdW5jdGlvbiBfYXBwZW5kR2hvc3QoKSB7XG4gICAgLy8gQnVnIGlmIHVzaW5nIHNjYWxlKCk6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI2MzcwNThcbiAgICAvLyBOb3QgYmVpbmcgYWRqdXN0ZWQgZm9yXG4gICAgaWYgKCFnaG9zdEVsKSB7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5vcHRpb25zLmZhbGxiYWNrT25Cb2R5ID8gZG9jdW1lbnQuYm9keSA6IHJvb3RFbCxcbiAgICAgICAgICByZWN0ID0gZ2V0UmVjdChkcmFnRWwsIHRydWUsIFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5LCB0cnVlLCBjb250YWluZXIpLFxuICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7IC8vIFBvc2l0aW9uIGFic29sdXRlbHlcblxuICAgICAgaWYgKFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5KSB7XG4gICAgICAgIC8vIEdldCByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgcGFyZW50XG4gICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBjb250YWluZXI7XG5cbiAgICAgICAgd2hpbGUgKGNzcyhnaG9zdFJlbGF0aXZlUGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycgJiYgY3NzKGdob3N0UmVsYXRpdmVQYXJlbnQsICd0cmFuc2Zvcm0nKSA9PT0gJ25vbmUnICYmIGdob3N0UmVsYXRpdmVQYXJlbnQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdob3N0UmVsYXRpdmVQYXJlbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmIGdob3N0UmVsYXRpdmVQYXJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgIGlmIChnaG9zdFJlbGF0aXZlUGFyZW50ID09PSBkb2N1bWVudCkgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAgICAgICByZWN0LnRvcCArPSBnaG9zdFJlbGF0aXZlUGFyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICByZWN0LmxlZnQgKz0gZ2hvc3RSZWxhdGl2ZVBhcmVudC5zY3JvbGxMZWZ0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbCA9IGdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0KGdob3N0UmVsYXRpdmVQYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICBnaG9zdEVsID0gZHJhZ0VsLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGdob3N0RWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgZmFsc2UpO1xuICAgICAgdG9nZ2xlQ2xhc3MoZ2hvc3RFbCwgb3B0aW9ucy5mYWxsYmFja0NsYXNzLCB0cnVlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGdob3N0RWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCB0cnVlKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAndHJhbnNpdGlvbicsICcnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAndHJhbnNmb3JtJywgJycpO1xuICAgICAgY3NzKGdob3N0RWwsICdib3gtc2l6aW5nJywgJ2JvcmRlci1ib3gnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnbWFyZ2luJywgMCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3RvcCcsIHJlY3QudG9wKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnbGVmdCcsIHJlY3QubGVmdCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3dpZHRoJywgcmVjdC53aWR0aCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnb3BhY2l0eScsICcwLjgnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAncG9zaXRpb24nLCBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSA/ICdhYnNvbHV0ZScgOiAnZml4ZWQnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnekluZGV4JywgJzEwMDAwMCcpO1xuICAgICAgY3NzKGdob3N0RWwsICdwb2ludGVyRXZlbnRzJywgJ25vbmUnKTtcbiAgICAgIFNvcnRhYmxlLmdob3N0ID0gZ2hvc3RFbDtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChnaG9zdEVsKTsgLy8gU2V0IHRyYW5zZm9ybS1vcmlnaW5cblxuICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0tb3JpZ2luJywgdGFwRGlzdGFuY2VMZWZ0IC8gcGFyc2VJbnQoZ2hvc3RFbC5zdHlsZS53aWR0aCkgKiAxMDAgKyAnJSAnICsgdGFwRGlzdGFuY2VUb3AgLyBwYXJzZUludChnaG9zdEVsLnN0eWxlLmhlaWdodCkgKiAxMDAgKyAnJScpO1xuICAgIH1cbiAgfSxcbiAgX29uRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfb25EcmFnU3RhcnQoXG4gIC8qKkV2ZW50Ki9cbiAgZXZ0LFxuICAvKipib29sZWFuKi9cbiAgZmFsbGJhY2spIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGRhdGFUcmFuc2ZlciA9IGV2dC5kYXRhVHJhbnNmZXI7XG4gICAgdmFyIG9wdGlvbnMgPSBfdGhpcy5vcHRpb25zO1xuICAgIHBsdWdpbkV2ZW50KCdkcmFnU3RhcnQnLCB0aGlzLCB7XG4gICAgICBldnQ6IGV2dFxuICAgIH0pO1xuXG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIHRoaXMuX29uRHJvcCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGx1Z2luRXZlbnQoJ3NldHVwQ2xvbmUnLCB0aGlzKTtcblxuICAgIGlmICghU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgY2xvbmVFbCA9IGNsb25lKGRyYWdFbCk7XG4gICAgICBjbG9uZUVsLmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgY2xvbmVFbC5zdHlsZVsnd2lsbC1jaGFuZ2UnXSA9ICcnO1xuXG4gICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgdG9nZ2xlQ2xhc3MoY2xvbmVFbCwgdGhpcy5vcHRpb25zLmNob3NlbkNsYXNzLCBmYWxzZSk7XG4gICAgICBTb3J0YWJsZS5jbG9uZSA9IGNsb25lRWw7XG4gICAgfSAvLyAjMTE0MzogSUZyYW1lIHN1cHBvcnQgd29ya2Fyb3VuZFxuXG5cbiAgICBfdGhpcy5jbG9uZUlkID0gX25leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdjbG9uZScsIF90aGlzKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm47XG5cbiAgICAgIGlmICghX3RoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSkge1xuICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIGRyYWdFbCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgIG5hbWU6ICdjbG9uZSdcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgICFmYWxsYmFjayAmJiB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCB0cnVlKTsgLy8gU2V0IHByb3BlciBkcm9wIGV2ZW50c1xuXG4gICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICBpZ25vcmVOZXh0Q2xpY2sgPSB0cnVlO1xuICAgICAgX3RoaXMuX2xvb3BJZCA9IHNldEludGVydmFsKF90aGlzLl9lbXVsYXRlRHJhZ092ZXIsIDUwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5kbyB3aGF0IHdhcyBzZXQgaW4gX3ByZXBhcmVEcmFnU3RhcnQgYmVmb3JlIGRyYWcgc3RhcnRlZFxuICAgICAgb2ZmKGRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2hlbmQnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgX3RoaXMuX29uRHJvcCk7XG5cbiAgICAgIGlmIChkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XG4gICAgICAgIG9wdGlvbnMuc2V0RGF0YSAmJiBvcHRpb25zLnNldERhdGEuY2FsbChfdGhpcywgZGF0YVRyYW5zZmVyLCBkcmFnRWwpO1xuICAgICAgfVxuXG4gICAgICBvbihkb2N1bWVudCwgJ2Ryb3AnLCBfdGhpcyk7IC8vICMxMjc2IGZpeDpcblxuICAgICAgY3NzKGRyYWdFbCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGVaKDApJyk7XG4gICAgfVxuXG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgX3RoaXMuX2RyYWdTdGFydElkID0gX25leHRUaWNrKF90aGlzLl9kcmFnU3RhcnRlZC5iaW5kKF90aGlzLCBmYWxsYmFjaywgZXZ0KSk7XG4gICAgb24oZG9jdW1lbnQsICdzZWxlY3RzdGFydCcsIF90aGlzKTtcbiAgICBtb3ZlZCA9IHRydWU7XG5cbiAgICBpZiAoU2FmYXJpKSB7XG4gICAgICBjc3MoZG9jdW1lbnQuYm9keSwgJ3VzZXItc2VsZWN0JywgJ25vbmUnKTtcbiAgICB9XG4gIH0sXG4gIC8vIFJldHVybnMgdHJ1ZSAtIGlmIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIG5lZWRlZCAoZWl0aGVyIGluc2VydGVkIG9yIGFub3RoZXIgY29uZGl0aW9uKVxuICBfb25EcmFnT3ZlcjogZnVuY3Rpb24gX29uRHJhZ092ZXIoXG4gIC8qKkV2ZW50Ki9cbiAgZXZ0KSB7XG4gICAgdmFyIGVsID0gdGhpcy5lbCxcbiAgICAgICAgdGFyZ2V0ID0gZXZ0LnRhcmdldCxcbiAgICAgICAgZHJhZ1JlY3QsXG4gICAgICAgIHRhcmdldFJlY3QsXG4gICAgICAgIHJldmVydCxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZ3JvdXAgPSBvcHRpb25zLmdyb3VwLFxuICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IFNvcnRhYmxlLmFjdGl2ZSxcbiAgICAgICAgaXNPd25lciA9IGFjdGl2ZUdyb3VwID09PSBncm91cCxcbiAgICAgICAgY2FuU29ydCA9IG9wdGlvbnMuc29ydCxcbiAgICAgICAgZnJvbVNvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgYWN0aXZlU29ydGFibGUsXG4gICAgICAgIHZlcnRpY2FsLFxuICAgICAgICBfdGhpcyA9IHRoaXMsXG4gICAgICAgIGNvbXBsZXRlZEZpcmVkID0gZmFsc2U7XG5cbiAgICBpZiAoX3NpbGVudCkgcmV0dXJuO1xuXG4gICAgZnVuY3Rpb24gZHJhZ092ZXJFdmVudChuYW1lLCBleHRyYSkge1xuICAgICAgcGx1Z2luRXZlbnQobmFtZSwgX3RoaXMsIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICBldnQ6IGV2dCxcbiAgICAgICAgaXNPd25lcjogaXNPd25lcixcbiAgICAgICAgYXhpczogdmVydGljYWwgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnLFxuICAgICAgICByZXZlcnQ6IHJldmVydCxcbiAgICAgICAgZHJhZ1JlY3Q6IGRyYWdSZWN0LFxuICAgICAgICB0YXJnZXRSZWN0OiB0YXJnZXRSZWN0LFxuICAgICAgICBjYW5Tb3J0OiBjYW5Tb3J0LFxuICAgICAgICBmcm9tU29ydGFibGU6IGZyb21Tb3J0YWJsZSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIGNvbXBsZXRlZDogY29tcGxldGVkLFxuICAgICAgICBvbk1vdmU6IGZ1bmN0aW9uIG9uTW92ZSh0YXJnZXQsIGFmdGVyKSB7XG4gICAgICAgICAgcmV0dXJuIF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCBnZXRSZWN0KHRhcmdldCksIGV2dCwgYWZ0ZXIpO1xuICAgICAgICB9LFxuICAgICAgICBjaGFuZ2VkOiBjaGFuZ2VkXG4gICAgICB9LCBleHRyYSkpO1xuICAgIH0gLy8gQ2FwdHVyZSBhbmltYXRpb24gc3RhdGVcblxuXG4gICAgZnVuY3Rpb24gY2FwdHVyZSgpIHtcbiAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyQW5pbWF0aW9uQ2FwdHVyZScpO1xuXG4gICAgICBfdGhpcy5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcblxuICAgICAgaWYgKF90aGlzICE9PSBmcm9tU29ydGFibGUpIHtcbiAgICAgICAgZnJvbVNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgfVxuICAgIH0gLy8gUmV0dXJuIGludm9jYXRpb24gd2hlbiBkcmFnRWwgaXMgaW5zZXJ0ZWQgKG9yIGNvbXBsZXRlZClcblxuXG4gICAgZnVuY3Rpb24gY29tcGxldGVkKGluc2VydGlvbikge1xuICAgICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXJDb21wbGV0ZWQnLCB7XG4gICAgICAgIGluc2VydGlvbjogaW5zZXJ0aW9uXG4gICAgICB9KTtcblxuICAgICAgaWYgKGluc2VydGlvbikge1xuICAgICAgICAvLyBDbG9uZXMgbXVzdCBiZSBoaWRkZW4gYmVmb3JlIGZvbGRpbmcgYW5pbWF0aW9uIHRvIGNhcHR1cmUgZHJhZ1JlY3RBYnNvbHV0ZSBwcm9wZXJseVxuICAgICAgICBpZiAoaXNPd25lcikge1xuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9oaWRlQ2xvbmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKF90aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpcyAhPT0gZnJvbVNvcnRhYmxlKSB7XG4gICAgICAgICAgLy8gU2V0IGdob3N0IGNsYXNzIHRvIG5ldyBzb3J0YWJsZSdzIGdob3N0IGNsYXNzXG4gICAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBwdXRTb3J0YWJsZSA/IHB1dFNvcnRhYmxlLm9wdGlvbnMuZ2hvc3RDbGFzcyA6IGFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuZ2hvc3RDbGFzcywgZmFsc2UpO1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5naG9zdENsYXNzLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwdXRTb3J0YWJsZSAhPT0gX3RoaXMgJiYgX3RoaXMgIT09IFNvcnRhYmxlLmFjdGl2ZSkge1xuICAgICAgICAgIHB1dFNvcnRhYmxlID0gX3RoaXM7XG4gICAgICAgIH0gZWxzZSBpZiAoX3RoaXMgPT09IFNvcnRhYmxlLmFjdGl2ZSAmJiBwdXRTb3J0YWJsZSkge1xuICAgICAgICAgIHB1dFNvcnRhYmxlID0gbnVsbDtcbiAgICAgICAgfSAvLyBBbmltYXRpb25cblxuXG4gICAgICAgIGlmIChmcm9tU29ydGFibGUgPT09IF90aGlzKSB7XG4gICAgICAgICAgX3RoaXMuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID0gdGFyZ2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMuYW5pbWF0ZUFsbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZScpO1xuICAgICAgICAgIF90aGlzLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9IG51bGw7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChfdGhpcyAhPT0gZnJvbVNvcnRhYmxlKSB7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgICBmcm9tU29ydGFibGUuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBOdWxsIGxhc3RUYXJnZXQgaWYgaXQgaXMgbm90IGluc2lkZSBhIHByZXZpb3VzbHkgc3dhcHBlZCBlbGVtZW50XG5cblxuICAgICAgaWYgKHRhcmdldCA9PT0gZHJhZ0VsICYmICFkcmFnRWwuYW5pbWF0ZWQgfHwgdGFyZ2V0ID09PSBlbCAmJiAhdGFyZ2V0LmFuaW1hdGVkKSB7XG4gICAgICAgIGxhc3RUYXJnZXQgPSBudWxsO1xuICAgICAgfSAvLyBubyBidWJibGluZyBhbmQgbm90IGZhbGxiYWNrXG5cblxuICAgICAgaWYgKCFvcHRpb25zLmRyYWdvdmVyQnViYmxlICYmICFldnQucm9vdEVsICYmIHRhcmdldCAhPT0gZG9jdW1lbnQpIHtcbiAgICAgICAgZHJhZ0VsLnBhcmVudE5vZGVbZXhwYW5kb10uX2lzT3V0c2lkZVRoaXNFbChldnQudGFyZ2V0KTsgLy8gRG8gbm90IGRldGVjdCBmb3IgZW1wdHkgaW5zZXJ0IGlmIGFscmVhZHkgaW5zZXJ0ZWRcblxuXG4gICAgICAgICFpbnNlcnRpb24gJiYgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQoZXZ0KTtcbiAgICAgIH1cblxuICAgICAgIW9wdGlvbnMuZHJhZ292ZXJCdWJibGUgJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbiAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm4gY29tcGxldGVkRmlyZWQgPSB0cnVlO1xuICAgIH0gLy8gQ2FsbCB3aGVuIGRyYWdFbCBoYXMgYmVlbiBpbnNlcnRlZFxuXG5cbiAgICBmdW5jdGlvbiBjaGFuZ2VkKCkge1xuICAgICAgbmV3SW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcblxuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgIG5hbWU6ICdjaGFuZ2UnLFxuICAgICAgICB0b0VsOiBlbCxcbiAgICAgICAgbmV3SW5kZXg6IG5ld0luZGV4LFxuICAgICAgICBuZXdEcmFnZ2FibGVJbmRleDogbmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGV2dC5wcmV2ZW50RGVmYXVsdCAhPT0gdm9pZCAwKSB7XG4gICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSBjbG9zZXN0KHRhcmdldCwgb3B0aW9ucy5kcmFnZ2FibGUsIGVsLCB0cnVlKTtcbiAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlcicpO1xuICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm4gY29tcGxldGVkRmlyZWQ7XG5cbiAgICBpZiAoZHJhZ0VsLmNvbnRhaW5zKGV2dC50YXJnZXQpIHx8IHRhcmdldC5hbmltYXRlZCAmJiB0YXJnZXQuYW5pbWF0aW5nWCAmJiB0YXJnZXQuYW5pbWF0aW5nWSB8fCBfdGhpcy5faWdub3JlV2hpbGVBbmltYXRpbmcgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgaWdub3JlTmV4dENsaWNrID0gZmFsc2U7XG5cbiAgICBpZiAoYWN0aXZlU29ydGFibGUgJiYgIW9wdGlvbnMuZGlzYWJsZWQgJiYgKGlzT3duZXIgPyBjYW5Tb3J0IHx8IChyZXZlcnQgPSAhcm9vdEVsLmNvbnRhaW5zKGRyYWdFbCkpIC8vIFJldmVydGluZyBpdGVtIGludG8gdGhlIG9yaWdpbmFsIGxpc3RcbiAgICA6IHB1dFNvcnRhYmxlID09PSB0aGlzIHx8ICh0aGlzLmxhc3RQdXRNb2RlID0gYWN0aXZlR3JvdXAuY2hlY2tQdWxsKHRoaXMsIGFjdGl2ZVNvcnRhYmxlLCBkcmFnRWwsIGV2dCkpICYmIGdyb3VwLmNoZWNrUHV0KHRoaXMsIGFjdGl2ZVNvcnRhYmxlLCBkcmFnRWwsIGV2dCkpKSB7XG4gICAgICB2ZXJ0aWNhbCA9IHRoaXMuX2dldERpcmVjdGlvbihldnQsIHRhcmdldCkgPT09ICd2ZXJ0aWNhbCc7XG4gICAgICBkcmFnUmVjdCA9IGdldFJlY3QoZHJhZ0VsKTtcbiAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyVmFsaWQnKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm4gY29tcGxldGVkRmlyZWQ7XG5cbiAgICAgIGlmIChyZXZlcnQpIHtcbiAgICAgICAgcGFyZW50RWwgPSByb290RWw7IC8vIGFjdHVhbGl6YXRpb25cblxuICAgICAgICBjYXB0dXJlKCk7XG5cbiAgICAgICAgdGhpcy5faGlkZUNsb25lKCk7XG5cbiAgICAgICAgZHJhZ092ZXJFdmVudCgncmV2ZXJ0Jyk7XG5cbiAgICAgICAgaWYgKCFTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgaWYgKG5leHRFbCkge1xuICAgICAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShkcmFnRWwsIG5leHRFbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbExhc3RDaGlsZCA9IGxhc3RDaGlsZChlbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuXG4gICAgICBpZiAoIWVsTGFzdENoaWxkIHx8IF9naG9zdElzTGFzdChldnQsIHZlcnRpY2FsLCB0aGlzKSAmJiAhZWxMYXN0Q2hpbGQuYW5pbWF0ZWQpIHtcbiAgICAgICAgLy8gSWYgYWxyZWFkeSBhdCBlbmQgb2YgbGlzdDogRG8gbm90IGluc2VydFxuICAgICAgICBpZiAoZWxMYXN0Q2hpbGQgPT09IGRyYWdFbCkge1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICB9IC8vIGFzc2lnbiB0YXJnZXQgb25seSBpZiBjb25kaXRpb24gaXMgdHJ1ZVxuXG5cbiAgICAgICAgaWYgKGVsTGFzdENoaWxkICYmIGVsID09PSBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0ID0gZWxMYXN0Q2hpbGQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0UmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgdGFyZ2V0UmVjdCwgZXZ0LCAhIXRhcmdldCkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgY2FwdHVyZSgpO1xuICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgcGFyZW50RWwgPSBlbDsgLy8gYWN0dWFsaXphdGlvblxuXG4gICAgICAgICAgY2hhbmdlZCgpO1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LnBhcmVudE5vZGUgPT09IGVsKSB7XG4gICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSAwLFxuICAgICAgICAgICAgdGFyZ2V0QmVmb3JlRmlyc3RTd2FwLFxuICAgICAgICAgICAgZGlmZmVyZW50TGV2ZWwgPSBkcmFnRWwucGFyZW50Tm9kZSAhPT0gZWwsXG4gICAgICAgICAgICBkaWZmZXJlbnRSb3dDb2wgPSAhX2RyYWdFbEluUm93Q29sdW1uKGRyYWdFbC5hbmltYXRlZCAmJiBkcmFnRWwudG9SZWN0IHx8IGRyYWdSZWN0LCB0YXJnZXQuYW5pbWF0ZWQgJiYgdGFyZ2V0LnRvUmVjdCB8fCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCksXG4gICAgICAgICAgICBzaWRlMSA9IHZlcnRpY2FsID8gJ3RvcCcgOiAnbGVmdCcsXG4gICAgICAgICAgICBzY3JvbGxlZFBhc3RUb3AgPSBpc1Njcm9sbGVkUGFzdCh0YXJnZXQsICd0b3AnLCAndG9wJykgfHwgaXNTY3JvbGxlZFBhc3QoZHJhZ0VsLCAndG9wJywgJ3RvcCcpLFxuICAgICAgICAgICAgc2Nyb2xsQmVmb3JlID0gc2Nyb2xsZWRQYXN0VG9wID8gc2Nyb2xsZWRQYXN0VG9wLnNjcm9sbFRvcCA6IHZvaWQgMDtcblxuICAgICAgICBpZiAobGFzdFRhcmdldCAhPT0gdGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0QmVmb3JlRmlyc3RTd2FwID0gdGFyZ2V0UmVjdFtzaWRlMV07XG4gICAgICAgICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2U7XG4gICAgICAgICAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9ICFkaWZmZXJlbnRSb3dDb2wgJiYgb3B0aW9ucy5pbnZlcnRTd2FwIHx8IGRpZmZlcmVudExldmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlyZWN0aW9uID0gX2dldFN3YXBEaXJlY3Rpb24oZXZ0LCB0YXJnZXQsIHRhcmdldFJlY3QsIHZlcnRpY2FsLCBkaWZmZXJlbnRSb3dDb2wgPyAxIDogb3B0aW9ucy5zd2FwVGhyZXNob2xkLCBvcHRpb25zLmludmVydGVkU3dhcFRocmVzaG9sZCA9PSBudWxsID8gb3B0aW9ucy5zd2FwVGhyZXNob2xkIDogb3B0aW9ucy5pbnZlcnRlZFN3YXBUaHJlc2hvbGQsIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQsIGxhc3RUYXJnZXQgPT09IHRhcmdldCk7XG4gICAgICAgIHZhciBzaWJsaW5nO1xuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0YXJnZXQgaXMgYmVzaWRlIGRyYWdFbCBpbiByZXNwZWN0aXZlIGRpcmVjdGlvbiAoaWdub3JpbmcgaGlkZGVuIGVsZW1lbnRzKVxuICAgICAgICAgIHZhciBkcmFnSW5kZXggPSBpbmRleChkcmFnRWwpO1xuXG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgZHJhZ0luZGV4IC09IGRpcmVjdGlvbjtcbiAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnRFbC5jaGlsZHJlbltkcmFnSW5kZXhdO1xuICAgICAgICAgIH0gd2hpbGUgKHNpYmxpbmcgJiYgKGNzcyhzaWJsaW5nLCAnZGlzcGxheScpID09PSAnbm9uZScgfHwgc2libGluZyA9PT0gZ2hvc3RFbCkpO1xuICAgICAgICB9IC8vIElmIGRyYWdFbCBpcyBhbHJlYWR5IGJlc2lkZSB0YXJnZXQ6IERvIG5vdCBpbnNlcnRcblxuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IDAgfHwgc2libGluZyA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICBsYXN0RGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICB2YXIgbmV4dFNpYmxpbmcgPSB0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nLFxuICAgICAgICAgICAgYWZ0ZXIgPSBmYWxzZTtcbiAgICAgICAgYWZ0ZXIgPSBkaXJlY3Rpb24gPT09IDE7XG5cbiAgICAgICAgdmFyIG1vdmVWZWN0b3IgPSBfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgdGFyZ2V0UmVjdCwgZXZ0LCBhZnRlcik7XG5cbiAgICAgICAgaWYgKG1vdmVWZWN0b3IgIT09IGZhbHNlKSB7XG4gICAgICAgICAgaWYgKG1vdmVWZWN0b3IgPT09IDEgfHwgbW92ZVZlY3RvciA9PT0gLTEpIHtcbiAgICAgICAgICAgIGFmdGVyID0gbW92ZVZlY3RvciA9PT0gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfc2lsZW50ID0gdHJ1ZTtcbiAgICAgICAgICBzZXRUaW1lb3V0KF91bnNpbGVudCwgMzApO1xuICAgICAgICAgIGNhcHR1cmUoKTtcblxuICAgICAgICAgIGlmIChhZnRlciAmJiAhbmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkcmFnRWwsIGFmdGVyID8gbmV4dFNpYmxpbmcgOiB0YXJnZXQpO1xuICAgICAgICAgIH0gLy8gVW5kbyBjaHJvbWUncyBzY3JvbGwgYWRqdXN0bWVudCAoaGFzIG5vIGVmZmVjdCBvbiBvdGhlciBicm93c2VycylcblxuXG4gICAgICAgICAgaWYgKHNjcm9sbGVkUGFzdFRvcCkge1xuICAgICAgICAgICAgc2Nyb2xsQnkoc2Nyb2xsZWRQYXN0VG9wLCAwLCBzY3JvbGxCZWZvcmUgLSBzY3JvbGxlZFBhc3RUb3Auc2Nyb2xsVG9wKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJlbnRFbCA9IGRyYWdFbC5wYXJlbnROb2RlOyAvLyBhY3R1YWxpemF0aW9uXG4gICAgICAgICAgLy8gbXVzdCBiZSBkb25lIGJlZm9yZSBhbmltYXRpb25cblxuICAgICAgICAgIGlmICh0YXJnZXRCZWZvcmVGaXJzdFN3YXAgIT09IHVuZGVmaW5lZCAmJiAhaXNDaXJjdW1zdGFudGlhbEludmVydCkge1xuICAgICAgICAgICAgdGFyZ2V0TW92ZURpc3RhbmNlID0gTWF0aC5hYnModGFyZ2V0QmVmb3JlRmlyc3RTd2FwIC0gZ2V0UmVjdCh0YXJnZXQpW3NpZGUxXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hhbmdlZCgpO1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGVsLmNvbnRhaW5zKGRyYWdFbCkpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBfaWdub3JlV2hpbGVBbmltYXRpbmc6IG51bGwsXG4gIF9vZmZNb3ZlRXZlbnRzOiBmdW5jdGlvbiBfb2ZmTW92ZUV2ZW50cygpIHtcbiAgICBvZmYoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ2RyYWdvdmVyJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgIG9mZihkb2N1bWVudCwgJ21vdXNlbW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICBvZmYoZG9jdW1lbnQsICd0b3VjaG1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gIH0sXG4gIF9vZmZVcEV2ZW50czogZnVuY3Rpb24gX29mZlVwRXZlbnRzKCkge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gdGhpcy5lbC5vd25lckRvY3VtZW50O1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX29uRHJvcCk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX29uRHJvcCk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihkb2N1bWVudCwgJ3NlbGVjdHN0YXJ0JywgdGhpcyk7XG4gIH0sXG4gIF9vbkRyb3A6IGZ1bmN0aW9uIF9vbkRyb3AoXG4gIC8qKkV2ZW50Ki9cbiAgZXZ0KSB7XG4gICAgdmFyIGVsID0gdGhpcy5lbCxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XG5cbiAgICBuZXdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG4gICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICBwbHVnaW5FdmVudCgnZHJvcCcsIHRoaXMsIHtcbiAgICAgIGV2dDogZXZ0XG4gICAgfSk7XG4gICAgcGFyZW50RWwgPSBkcmFnRWwgJiYgZHJhZ0VsLnBhcmVudE5vZGU7IC8vIEdldCBhZ2FpbiBhZnRlciBwbHVnaW4gZXZlbnRcblxuICAgIG5ld0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcbiAgICBuZXdEcmFnZ2FibGVJbmRleCA9IGluZGV4KGRyYWdFbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuXG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIHRoaXMuX251bGxpbmcoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICBpc0NpcmN1bXN0YW50aWFsSW52ZXJ0ID0gZmFsc2U7XG4gICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2U7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9sb29wSWQpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9kcmFnU3RhcnRUaW1lcik7XG5cbiAgICBfY2FuY2VsTmV4dFRpY2sodGhpcy5jbG9uZUlkKTtcblxuICAgIF9jYW5jZWxOZXh0VGljayh0aGlzLl9kcmFnU3RhcnRJZCk7IC8vIFVuYmluZCBldmVudHNcblxuXG4gICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICBvZmYoZG9jdW1lbnQsICdkcm9wJywgdGhpcyk7XG4gICAgICBvZmYoZWwsICdkcmFnc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydCk7XG4gICAgfVxuXG4gICAgdGhpcy5fb2ZmTW92ZUV2ZW50cygpO1xuXG4gICAgdGhpcy5fb2ZmVXBFdmVudHMoKTtcblxuICAgIGlmIChTYWZhcmkpIHtcbiAgICAgIGNzcyhkb2N1bWVudC5ib2R5LCAndXNlci1zZWxlY3QnLCAnJyk7XG4gICAgfVxuXG4gICAgY3NzKGRyYWdFbCwgJ3RyYW5zZm9ybScsICcnKTtcblxuICAgIGlmIChldnQpIHtcbiAgICAgIGlmIChtb3ZlZCkge1xuICAgICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgIW9wdGlvbnMuZHJvcEJ1YmJsZSAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGdob3N0RWwgJiYgZ2hvc3RFbC5wYXJlbnROb2RlICYmIGdob3N0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChnaG9zdEVsKTtcblxuICAgICAgaWYgKHJvb3RFbCA9PT0gcGFyZW50RWwgfHwgcHV0U29ydGFibGUgJiYgcHV0U29ydGFibGUubGFzdFB1dE1vZGUgIT09ICdjbG9uZScpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGNsb25lKHMpXG4gICAgICAgIGNsb25lRWwgJiYgY2xvbmVFbC5wYXJlbnROb2RlICYmIGNsb25lRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZUVsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdFbCkge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgICBvZmYoZHJhZ0VsLCAnZHJhZ2VuZCcsIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2Rpc2FibGVEcmFnZ2FibGUoZHJhZ0VsKTtcblxuICAgICAgICBkcmFnRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnJzsgLy8gUmVtb3ZlIGNsYXNzZXNcbiAgICAgICAgLy8gZ2hvc3RDbGFzcyBpcyBhZGRlZCBpbiBkcmFnU3RhcnRlZFxuXG4gICAgICAgIGlmIChtb3ZlZCAmJiAhYXdhaXRpbmdEcmFnU3RhcnRlZCkge1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgcHV0U29ydGFibGUgPyBwdXRTb3J0YWJsZS5vcHRpb25zLmdob3N0Q2xhc3MgOiB0aGlzLm9wdGlvbnMuZ2hvc3RDbGFzcywgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTsgLy8gRHJhZyBzdG9wIGV2ZW50XG5cbiAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgIG5hbWU6ICd1bmNob29zZScsXG4gICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgbmV3SW5kZXg6IG51bGwsXG4gICAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG51bGwsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyb290RWwgIT09IHBhcmVudEVsKSB7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ID49IDApIHtcbiAgICAgICAgICAgIC8vIEFkZCBldmVudFxuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICByb290RWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBuYW1lOiAnYWRkJyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIGZyb21FbDogcm9vdEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pOyAvLyBSZW1vdmUgZXZlbnRcblxuXG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICBuYW1lOiAncmVtb3ZlJyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgfSk7IC8vIGRyYWcgZnJvbSBvbmUgbGlzdCBhbmQgZHJvcCBpbnRvIGFub3RoZXJcblxuXG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHJvb3RFbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIG5hbWU6ICdzb3J0JyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIGZyb21FbDogcm9vdEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICBuYW1lOiAnc29ydCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLnNhdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobmV3SW5kZXggIT09IG9sZEluZGV4KSB7XG4gICAgICAgICAgICBpZiAobmV3SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAvLyBkcmFnICYgZHJvcCB3aXRoaW4gdGhlIHNhbWUgbGlzdFxuICAgICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmFtZTogJ3VwZGF0ZScsXG4gICAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnc29ydCcsXG4gICAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChTb3J0YWJsZS5hY3RpdmUpIHtcbiAgICAgICAgICAvKiBqc2hpbnQgZXFudWxsOnRydWUgKi9cbiAgICAgICAgICBpZiAobmV3SW5kZXggPT0gbnVsbCB8fCBuZXdJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIG5ld0luZGV4ID0gb2xkSW5kZXg7XG4gICAgICAgICAgICBuZXdEcmFnZ2FibGVJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgbmFtZTogJ2VuZCcsXG4gICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgIH0pOyAvLyBTYXZlIHNvcnRpbmdcblxuXG4gICAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9udWxsaW5nKCk7XG4gIH0sXG4gIF9udWxsaW5nOiBmdW5jdGlvbiBfbnVsbGluZygpIHtcbiAgICBwbHVnaW5FdmVudCgnbnVsbGluZycsIHRoaXMpO1xuICAgIHJvb3RFbCA9IGRyYWdFbCA9IHBhcmVudEVsID0gZ2hvc3RFbCA9IG5leHRFbCA9IGNsb25lRWwgPSBsYXN0RG93bkVsID0gY2xvbmVIaWRkZW4gPSB0YXBFdnQgPSB0b3VjaEV2dCA9IG1vdmVkID0gbmV3SW5kZXggPSBuZXdEcmFnZ2FibGVJbmRleCA9IG9sZEluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXggPSBsYXN0VGFyZ2V0ID0gbGFzdERpcmVjdGlvbiA9IHB1dFNvcnRhYmxlID0gYWN0aXZlR3JvdXAgPSBTb3J0YWJsZS5kcmFnZ2VkID0gU29ydGFibGUuZ2hvc3QgPSBTb3J0YWJsZS5jbG9uZSA9IFNvcnRhYmxlLmFjdGl2ZSA9IG51bGw7XG4gICAgc2F2ZWRJbnB1dENoZWNrZWQuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGVsLmNoZWNrZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHNhdmVkSW5wdXRDaGVja2VkLmxlbmd0aCA9IGxhc3REeCA9IGxhc3REeSA9IDA7XG4gIH0sXG4gIGhhbmRsZUV2ZW50OiBmdW5jdGlvbiBoYW5kbGVFdmVudChcbiAgLyoqRXZlbnQqL1xuICBldnQpIHtcbiAgICBzd2l0Y2ggKGV2dC50eXBlKSB7XG4gICAgICBjYXNlICdkcm9wJzpcbiAgICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgICAgICB0aGlzLl9vbkRyb3AoZXZ0KTtcblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICAgICAgaWYgKGRyYWdFbCkge1xuICAgICAgICAgIHRoaXMuX29uRHJhZ092ZXIoZXZ0KTtcblxuICAgICAgICAgIF9nbG9iYWxEcmFnT3ZlcihldnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbGVjdHN0YXJ0JzpcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU2VyaWFsaXplcyB0aGUgaXRlbSBpbnRvIGFuIGFycmF5IG9mIHN0cmluZy5cbiAgICogQHJldHVybnMge1N0cmluZ1tdfVxuICAgKi9cbiAgdG9BcnJheTogZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICB2YXIgb3JkZXIgPSBbXSxcbiAgICAgICAgZWwsXG4gICAgICAgIGNoaWxkcmVuID0gdGhpcy5lbC5jaGlsZHJlbixcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIG4gPSBjaGlsZHJlbi5sZW5ndGgsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBmb3IgKDsgaSA8IG47IGkrKykge1xuICAgICAgZWwgPSBjaGlsZHJlbltpXTtcblxuICAgICAgaWYgKGNsb3Nlc3QoZWwsIG9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLmVsLCBmYWxzZSkpIHtcbiAgICAgICAgb3JkZXIucHVzaChlbC5nZXRBdHRyaWJ1dGUob3B0aW9ucy5kYXRhSWRBdHRyKSB8fCBfZ2VuZXJhdGVJZChlbCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcmRlcjtcbiAgfSxcblxuICAvKipcbiAgICogU29ydHMgdGhlIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgYXJyYXkuXG4gICAqIEBwYXJhbSAge1N0cmluZ1tdfSAgb3JkZXIgIG9yZGVyIG9mIHRoZSBpdGVtc1xuICAgKi9cbiAgc29ydDogZnVuY3Rpb24gc29ydChvcmRlciwgdXNlQW5pbWF0aW9uKSB7XG4gICAgdmFyIGl0ZW1zID0ge30sXG4gICAgICAgIHJvb3RFbCA9IHRoaXMuZWw7XG4gICAgdGhpcy50b0FycmF5KCkuZm9yRWFjaChmdW5jdGlvbiAoaWQsIGkpIHtcbiAgICAgIHZhciBlbCA9IHJvb3RFbC5jaGlsZHJlbltpXTtcblxuICAgICAgaWYgKGNsb3Nlc3QoZWwsIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUsIHJvb3RFbCwgZmFsc2UpKSB7XG4gICAgICAgIGl0ZW1zW2lkXSA9IGVsO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICAgIHVzZUFuaW1hdGlvbiAmJiB0aGlzLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIG9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoaXRlbXNbaWRdKSB7XG4gICAgICAgIHJvb3RFbC5yZW1vdmVDaGlsZChpdGVtc1tpZF0pO1xuICAgICAgICByb290RWwuYXBwZW5kQ2hpbGQoaXRlbXNbaWRdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1c2VBbmltYXRpb24gJiYgdGhpcy5hbmltYXRlQWxsKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIGN1cnJlbnQgc29ydGluZ1xuICAgKi9cbiAgc2F2ZTogZnVuY3Rpb24gc2F2ZSgpIHtcbiAgICB2YXIgc3RvcmUgPSB0aGlzLm9wdGlvbnMuc3RvcmU7XG4gICAgc3RvcmUgJiYgc3RvcmUuc2V0ICYmIHN0b3JlLnNldCh0aGlzKTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0LCBnZXQgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciBieSB0ZXN0aW5nIHRoZSBlbGVtZW50IGl0c2VsZiBhbmQgdHJhdmVyc2luZyB1cCB0aHJvdWdoIGl0cyBhbmNlc3RvcnMgaW4gdGhlIERPTSB0cmVlLlxuICAgKiBAcGFyYW0gICB7SFRNTEVsZW1lbnR9ICBlbFxuICAgKiBAcGFyYW0gICB7U3RyaW5nfSAgICAgICBbc2VsZWN0b3JdICBkZWZhdWx0OiBgb3B0aW9ucy5kcmFnZ2FibGVgXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgY2xvc2VzdDogZnVuY3Rpb24gY2xvc2VzdCQxKGVsLCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBjbG9zZXN0KGVsLCBzZWxlY3RvciB8fCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLmVsLCBmYWxzZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldC9nZXQgb3B0aW9uXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtICAgeyp9ICAgICAgW3ZhbHVlXVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIG9wdGlvbjogZnVuY3Rpb24gb3B0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnNbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtb2RpZmllZFZhbHVlID0gUGx1Z2luTWFuYWdlci5tb2RpZnlPcHRpb24odGhpcywgbmFtZSwgdmFsdWUpO1xuXG4gICAgICBpZiAodHlwZW9mIG1vZGlmaWVkVmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9wdGlvbnNbbmFtZV0gPSBtb2RpZmllZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmFtZSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRGVzdHJveVxuICAgKi9cbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBwbHVnaW5FdmVudCgnZGVzdHJveScsIHRoaXMpO1xuICAgIHZhciBlbCA9IHRoaXMuZWw7XG4gICAgZWxbZXhwYW5kb10gPSBudWxsO1xuICAgIG9mZihlbCwgJ21vdXNlZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgIG9mZihlbCwgJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgICBvZmYoZWwsICdwb2ludGVyZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuXG4gICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICBvZmYoZWwsICdkcmFnb3ZlcicsIHRoaXMpO1xuICAgICAgb2ZmKGVsLCAnZHJhZ2VudGVyJywgdGhpcyk7XG4gICAgfSAvLyBSZW1vdmUgZHJhZ2dhYmxlIGF0dHJpYnV0ZXNcblxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbC5xdWVyeVNlbGVjdG9yQWxsKCdbZHJhZ2dhYmxlXScpLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dhYmxlJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9vbkRyb3AoKTtcblxuICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpO1xuXG4gICAgc29ydGFibGVzLnNwbGljZShzb3J0YWJsZXMuaW5kZXhPZih0aGlzLmVsKSwgMSk7XG4gICAgdGhpcy5lbCA9IGVsID0gbnVsbDtcbiAgfSxcbiAgX2hpZGVDbG9uZTogZnVuY3Rpb24gX2hpZGVDbG9uZSgpIHtcbiAgICBpZiAoIWNsb25lSGlkZGVuKSB7XG4gICAgICBwbHVnaW5FdmVudCgnaGlkZUNsb25lJywgdGhpcyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuO1xuICAgICAgY3NzKGNsb25lRWwsICdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSAmJiBjbG9uZUVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgY2xvbmVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lRWwpO1xuICAgICAgfVxuXG4gICAgICBjbG9uZUhpZGRlbiA9IHRydWU7XG4gICAgfVxuICB9LFxuICBfc2hvd0Nsb25lOiBmdW5jdGlvbiBfc2hvd0Nsb25lKHB1dFNvcnRhYmxlKSB7XG4gICAgaWYgKHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlICE9PSAnY2xvbmUnKSB7XG4gICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjbG9uZUhpZGRlbikge1xuICAgICAgcGx1Z2luRXZlbnQoJ3Nob3dDbG9uZScsIHRoaXMpO1xuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybjsgLy8gc2hvdyBjbG9uZSBhdCBkcmFnRWwgb3Igb3JpZ2luYWwgcG9zaXRpb25cblxuICAgICAgaWYgKGRyYWdFbC5wYXJlbnROb2RlID09IHJvb3RFbCAmJiAhdGhpcy5vcHRpb25zLmdyb3VwLnJldmVydENsb25lKSB7XG4gICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmVFbCwgZHJhZ0VsKTtcbiAgICAgIH0gZWxzZSBpZiAobmV4dEVsKSB7XG4gICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmVFbCwgbmV4dEVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChjbG9uZUVsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncm91cC5yZXZlcnRDbG9uZSkge1xuICAgICAgICB0aGlzLmFuaW1hdGUoZHJhZ0VsLCBjbG9uZUVsKTtcbiAgICAgIH1cblxuICAgICAgY3NzKGNsb25lRWwsICdkaXNwbGF5JywgJycpO1xuICAgICAgY2xvbmVIaWRkZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9nbG9iYWxEcmFnT3Zlcihcbi8qKkV2ZW50Ki9cbmV2dCkge1xuICBpZiAoZXZ0LmRhdGFUcmFuc2Zlcikge1xuICAgIGV2dC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcbiAgfVxuXG4gIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG5mdW5jdGlvbiBfb25Nb3ZlKGZyb21FbCwgdG9FbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0RWwsIHRhcmdldFJlY3QsIG9yaWdpbmFsRXZlbnQsIHdpbGxJbnNlcnRBZnRlcikge1xuICB2YXIgZXZ0LFxuICAgICAgc29ydGFibGUgPSBmcm9tRWxbZXhwYW5kb10sXG4gICAgICBvbk1vdmVGbiA9IHNvcnRhYmxlLm9wdGlvbnMub25Nb3ZlLFxuICAgICAgcmV0VmFsOyAvLyBTdXBwb3J0IGZvciBuZXcgQ3VzdG9tRXZlbnQgZmVhdHVyZVxuXG4gIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgIUlFMTFPckxlc3MgJiYgIUVkZ2UpIHtcbiAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ21vdmUnLCB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2dC5pbml0RXZlbnQoJ21vdmUnLCB0cnVlLCB0cnVlKTtcbiAgfVxuXG4gIGV2dC50byA9IHRvRWw7XG4gIGV2dC5mcm9tID0gZnJvbUVsO1xuICBldnQuZHJhZ2dlZCA9IGRyYWdFbDtcbiAgZXZ0LmRyYWdnZWRSZWN0ID0gZHJhZ1JlY3Q7XG4gIGV2dC5yZWxhdGVkID0gdGFyZ2V0RWwgfHwgdG9FbDtcbiAgZXZ0LnJlbGF0ZWRSZWN0ID0gdGFyZ2V0UmVjdCB8fCBnZXRSZWN0KHRvRWwpO1xuICBldnQud2lsbEluc2VydEFmdGVyID0gd2lsbEluc2VydEFmdGVyO1xuICBldnQub3JpZ2luYWxFdmVudCA9IG9yaWdpbmFsRXZlbnQ7XG4gIGZyb21FbC5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cbiAgaWYgKG9uTW92ZUZuKSB7XG4gICAgcmV0VmFsID0gb25Nb3ZlRm4uY2FsbChzb3J0YWJsZSwgZXZ0LCBvcmlnaW5hbEV2ZW50KTtcbiAgfVxuXG4gIHJldHVybiByZXRWYWw7XG59XG5cbmZ1bmN0aW9uIF9kaXNhYmxlRHJhZ2dhYmxlKGVsKSB7XG4gIGVsLmRyYWdnYWJsZSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBfdW5zaWxlbnQoKSB7XG4gIF9zaWxlbnQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gX2dob3N0SXNMYXN0KGV2dCwgdmVydGljYWwsIHNvcnRhYmxlKSB7XG4gIHZhciByZWN0ID0gZ2V0UmVjdChsYXN0Q2hpbGQoc29ydGFibGUuZWwsIHNvcnRhYmxlLm9wdGlvbnMuZHJhZ2dhYmxlKSk7XG4gIHZhciBzcGFjZXIgPSAxMDtcbiAgcmV0dXJuIHZlcnRpY2FsID8gZXZ0LmNsaWVudFggPiByZWN0LnJpZ2h0ICsgc3BhY2VyIHx8IGV2dC5jbGllbnRYIDw9IHJlY3QucmlnaHQgJiYgZXZ0LmNsaWVudFkgPiByZWN0LmJvdHRvbSAmJiBldnQuY2xpZW50WCA+PSByZWN0LmxlZnQgOiBldnQuY2xpZW50WCA+IHJlY3QucmlnaHQgJiYgZXZ0LmNsaWVudFkgPiByZWN0LnRvcCB8fCBldnQuY2xpZW50WCA8PSByZWN0LnJpZ2h0ICYmIGV2dC5jbGllbnRZID4gcmVjdC5ib3R0b20gKyBzcGFjZXI7XG59XG5cbmZ1bmN0aW9uIF9nZXRTd2FwRGlyZWN0aW9uKGV2dCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCwgc3dhcFRocmVzaG9sZCwgaW52ZXJ0ZWRTd2FwVGhyZXNob2xkLCBpbnZlcnRTd2FwLCBpc0xhc3RUYXJnZXQpIHtcbiAgdmFyIG1vdXNlT25BeGlzID0gdmVydGljYWwgPyBldnQuY2xpZW50WSA6IGV2dC5jbGllbnRYLFxuICAgICAgdGFyZ2V0TGVuZ3RoID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LmhlaWdodCA6IHRhcmdldFJlY3Qud2lkdGgsXG4gICAgICB0YXJnZXRTMSA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC50b3AgOiB0YXJnZXRSZWN0LmxlZnQsXG4gICAgICB0YXJnZXRTMiA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5ib3R0b20gOiB0YXJnZXRSZWN0LnJpZ2h0LFxuICAgICAgaW52ZXJ0ID0gZmFsc2U7XG5cbiAgaWYgKCFpbnZlcnRTd2FwKSB7XG4gICAgLy8gTmV2ZXIgaW52ZXJ0IG9yIGNyZWF0ZSBkcmFnRWwgc2hhZG93IHdoZW4gdGFyZ2V0IG1vdmVtZW5ldCBjYXVzZXMgbW91c2UgdG8gbW92ZSBwYXN0IHRoZSBlbmQgb2YgcmVndWxhciBzd2FwVGhyZXNob2xkXG4gICAgaWYgKGlzTGFzdFRhcmdldCAmJiB0YXJnZXRNb3ZlRGlzdGFuY2UgPCB0YXJnZXRMZW5ndGggKiBzd2FwVGhyZXNob2xkKSB7XG4gICAgICAvLyBtdWx0aXBsaWVkIG9ubHkgYnkgc3dhcFRocmVzaG9sZCBiZWNhdXNlIG1vdXNlIHdpbGwgYWxyZWFkeSBiZSBpbnNpZGUgdGFyZ2V0IGJ5ICgxIC0gdGhyZXNob2xkKSAqIHRhcmdldExlbmd0aCAvIDJcbiAgICAgIC8vIGNoZWNrIGlmIHBhc3QgZmlyc3QgaW52ZXJ0IHRocmVzaG9sZCBvbiBzaWRlIG9wcG9zaXRlIG9mIGxhc3REaXJlY3Rpb25cbiAgICAgIGlmICghcGFzdEZpcnN0SW52ZXJ0VGhyZXNoICYmIChsYXN0RGlyZWN0aW9uID09PSAxID8gbW91c2VPbkF4aXMgPiB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIgOiBtb3VzZU9uQXhpcyA8IHRhcmdldFMyIC0gdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMikpIHtcbiAgICAgICAgLy8gcGFzdCBmaXJzdCBpbnZlcnQgdGhyZXNob2xkLCBkbyBub3QgcmVzdHJpY3QgaW52ZXJ0ZWQgdGhyZXNob2xkIHRvIGRyYWdFbCBzaGFkb3dcbiAgICAgICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwYXN0Rmlyc3RJbnZlcnRUaHJlc2gpIHtcbiAgICAgICAgLy8gZHJhZ0VsIHNoYWRvdyAodGFyZ2V0IG1vdmUgZGlzdGFuY2Ugc2hhZG93KVxuICAgICAgICBpZiAobGFzdERpcmVjdGlvbiA9PT0gMSA/IG1vdXNlT25BeGlzIDwgdGFyZ2V0UzEgKyB0YXJnZXRNb3ZlRGlzdGFuY2UgLy8gb3ZlciBkcmFnRWwgc2hhZG93XG4gICAgICAgIDogbW91c2VPbkF4aXMgPiB0YXJnZXRTMiAtIHRhcmdldE1vdmVEaXN0YW5jZSkge1xuICAgICAgICAgIHJldHVybiAtbGFzdERpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW52ZXJ0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVndWxhclxuICAgICAgaWYgKG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggKiAoMSAtIHN3YXBUaHJlc2hvbGQpIC8gMiAmJiBtb3VzZU9uQXhpcyA8IHRhcmdldFMyIC0gdGFyZ2V0TGVuZ3RoICogKDEgLSBzd2FwVGhyZXNob2xkKSAvIDIpIHtcbiAgICAgICAgcmV0dXJuIF9nZXRJbnNlcnREaXJlY3Rpb24odGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpbnZlcnQgPSBpbnZlcnQgfHwgaW52ZXJ0U3dhcDtcblxuICBpZiAoaW52ZXJ0KSB7XG4gICAgLy8gSW52ZXJ0IG9mIHJlZ3VsYXJcbiAgICBpZiAobW91c2VPbkF4aXMgPCB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIgfHwgbW91c2VPbkF4aXMgPiB0YXJnZXRTMiAtIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIpIHtcbiAgICAgIHJldHVybiBtb3VzZU9uQXhpcyA+IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoIC8gMiA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cbi8qKlxuICogR2V0cyB0aGUgZGlyZWN0aW9uIGRyYWdFbCBtdXN0IGJlIHN3YXBwZWQgcmVsYXRpdmUgdG8gdGFyZ2V0IGluIG9yZGVyIHRvIG1ha2UgaXRcbiAqIHNlZW0gdGhhdCBkcmFnRWwgaGFzIGJlZW4gXCJpbnNlcnRlZFwiIGludG8gdGhhdCBlbGVtZW50J3MgcG9zaXRpb25cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSB0YXJnZXQgICAgICAgVGhlIHRhcmdldCB3aG9zZSBwb3NpdGlvbiBkcmFnRWwgaXMgYmVpbmcgaW5zZXJ0ZWQgYXRcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGRyYWdFbCBtdXN0IGJlIHN3YXBwZWRcbiAqL1xuXG5cbmZ1bmN0aW9uIF9nZXRJbnNlcnREaXJlY3Rpb24odGFyZ2V0KSB7XG4gIGlmIChpbmRleChkcmFnRWwpIDwgaW5kZXgodGFyZ2V0KSkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAtMTtcbiAgfVxufVxuLyoqXG4gKiBHZW5lcmF0ZSBpZFxuICogQHBhcmFtICAge0hUTUxFbGVtZW50fSBlbFxuICogQHJldHVybnMge1N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5mdW5jdGlvbiBfZ2VuZXJhdGVJZChlbCkge1xuICB2YXIgc3RyID0gZWwudGFnTmFtZSArIGVsLmNsYXNzTmFtZSArIGVsLnNyYyArIGVsLmhyZWYgKyBlbC50ZXh0Q29udGVudCxcbiAgICAgIGkgPSBzdHIubGVuZ3RoLFxuICAgICAgc3VtID0gMDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgc3VtICs9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICB9XG5cbiAgcmV0dXJuIHN1bS50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIF9zYXZlSW5wdXRDaGVja2VkU3RhdGUocm9vdCkge1xuICBzYXZlZElucHV0Q2hlY2tlZC5sZW5ndGggPSAwO1xuICB2YXIgaW5wdXRzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTtcbiAgdmFyIGlkeCA9IGlucHV0cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGlkeC0tKSB7XG4gICAgdmFyIGVsID0gaW5wdXRzW2lkeF07XG4gICAgZWwuY2hlY2tlZCAmJiBzYXZlZElucHV0Q2hlY2tlZC5wdXNoKGVsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfbmV4dFRpY2soZm4pIHtcbiAgcmV0dXJuIHNldFRpbWVvdXQoZm4sIDApO1xufVxuXG5mdW5jdGlvbiBfY2FuY2VsTmV4dFRpY2soaWQpIHtcbiAgcmV0dXJuIGNsZWFyVGltZW91dChpZCk7XG59IC8vIEZpeGVkICM5NzM6XG5cblxuaWYgKGRvY3VtZW50RXhpc3RzKSB7XG4gIG9uKGRvY3VtZW50LCAndG91Y2htb3ZlJywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGlmICgoU29ydGFibGUuYWN0aXZlIHx8IGF3YWl0aW5nRHJhZ1N0YXJ0ZWQpICYmIGV2dC5jYW5jZWxhYmxlKSB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0pO1xufSAvLyBFeHBvcnQgdXRpbHNcblxuXG5Tb3J0YWJsZS51dGlscyA9IHtcbiAgb246IG9uLFxuICBvZmY6IG9mZixcbiAgY3NzOiBjc3MsXG4gIGZpbmQ6IGZpbmQsXG4gIGlzOiBmdW5jdGlvbiBpcyhlbCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gISFjbG9zZXN0KGVsLCBzZWxlY3RvciwgZWwsIGZhbHNlKTtcbiAgfSxcbiAgZXh0ZW5kOiBleHRlbmQsXG4gIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgY2xvc2VzdDogY2xvc2VzdCxcbiAgdG9nZ2xlQ2xhc3M6IHRvZ2dsZUNsYXNzLFxuICBjbG9uZTogY2xvbmUsXG4gIGluZGV4OiBpbmRleCxcbiAgbmV4dFRpY2s6IF9uZXh0VGljayxcbiAgY2FuY2VsTmV4dFRpY2s6IF9jYW5jZWxOZXh0VGljayxcbiAgZGV0ZWN0RGlyZWN0aW9uOiBfZGV0ZWN0RGlyZWN0aW9uLFxuICBnZXRDaGlsZDogZ2V0Q2hpbGRcbn07XG4vKipcbiAqIEdldCB0aGUgU29ydGFibGUgaW5zdGFuY2Ugb2YgYW4gZWxlbWVudFxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnRcbiAqIEByZXR1cm4ge1NvcnRhYmxlfHVuZGVmaW5lZH0gICAgICAgICBUaGUgaW5zdGFuY2Ugb2YgU29ydGFibGVcbiAqL1xuXG5Tb3J0YWJsZS5nZXQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudFtleHBhbmRvXTtcbn07XG4vKipcbiAqIE1vdW50IGEgcGx1Z2luIHRvIFNvcnRhYmxlXG4gKiBAcGFyYW0gIHsuLi5Tb3J0YWJsZVBsdWdpbnxTb3J0YWJsZVBsdWdpbltdfSBwbHVnaW5zICAgICAgIFBsdWdpbnMgYmVpbmcgbW91bnRlZFxuICovXG5cblxuU29ydGFibGUubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwbHVnaW5zID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHBsdWdpbnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAocGx1Z2luc1swXS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHBsdWdpbnMgPSBwbHVnaW5zWzBdO1xuICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgIGlmICghcGx1Z2luLnByb3RvdHlwZSB8fCAhcGx1Z2luLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcikge1xuICAgICAgdGhyb3cgXCJTb3J0YWJsZTogTW91bnRlZCBwbHVnaW4gbXVzdCBiZSBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCBub3QgXCIuY29uY2F0KHt9LnRvU3RyaW5nLmNhbGwocGx1Z2luKSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbi51dGlscykgU29ydGFibGUudXRpbHMgPSBfb2JqZWN0U3ByZWFkKHt9LCBTb3J0YWJsZS51dGlscywgcGx1Z2luLnV0aWxzKTtcbiAgICBQbHVnaW5NYW5hZ2VyLm1vdW50KHBsdWdpbik7XG4gIH0pO1xufTtcbi8qKlxuICogQ3JlYXRlIHNvcnRhYmxlIGluc3RhbmNlXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSAgZWxcbiAqIEBwYXJhbSB7T2JqZWN0fSAgICAgIFtvcHRpb25zXVxuICovXG5cblxuU29ydGFibGUuY3JlYXRlID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgU29ydGFibGUoZWwsIG9wdGlvbnMpO1xufTsgLy8gRXhwb3J0XG5cblxuU29ydGFibGUudmVyc2lvbiA9IHZlcnNpb247XG5cbnZhciBhdXRvU2Nyb2xscyA9IFtdLFxuICAgIHNjcm9sbEVsLFxuICAgIHNjcm9sbFJvb3RFbCxcbiAgICBzY3JvbGxpbmcgPSBmYWxzZSxcbiAgICBsYXN0QXV0b1Njcm9sbFgsXG4gICAgbGFzdEF1dG9TY3JvbGxZLFxuICAgIHRvdWNoRXZ0JDEsXG4gICAgcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWw7XG5cbmZ1bmN0aW9uIEF1dG9TY3JvbGxQbHVnaW4oKSB7XG4gIGZ1bmN0aW9uIEF1dG9TY3JvbGwoKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIHNjcm9sbDogdHJ1ZSxcbiAgICAgIHNjcm9sbFNlbnNpdGl2aXR5OiAzMCxcbiAgICAgIHNjcm9sbFNwZWVkOiAxMCxcbiAgICAgIGJ1YmJsZVNjcm9sbDogdHJ1ZVxuICAgIH07IC8vIEJpbmQgYWxsIHByaXZhdGUgbWV0aG9kc1xuXG4gICAgZm9yICh2YXIgZm4gaW4gdGhpcykge1xuICAgICAgaWYgKGZuLmNoYXJBdCgwKSA9PT0gJ18nICYmIHR5cGVvZiB0aGlzW2ZuXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQXV0b1Njcm9sbC5wcm90b3R5cGUgPSB7XG4gICAgZHJhZ1N0YXJ0ZWQ6IGZ1bmN0aW9uIGRyYWdTdGFydGVkKF9yZWYpIHtcbiAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gX3JlZi5vcmlnaW5hbEV2ZW50O1xuXG4gICAgICBpZiAodGhpcy5zb3J0YWJsZS5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdkcmFnb3ZlcicsIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgICAgICAgIG9uKGRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbmFsRXZlbnQudG91Y2hlcykge1xuICAgICAgICAgIG9uKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQ29tcGxldGVkOiBmdW5jdGlvbiBkcmFnT3ZlckNvbXBsZXRlZChfcmVmMikge1xuICAgICAgdmFyIG9yaWdpbmFsRXZlbnQgPSBfcmVmMi5vcmlnaW5hbEV2ZW50O1xuXG4gICAgICAvLyBGb3Igd2hlbiBidWJibGluZyBpcyBjYW5jZWxlZCBhbmQgdXNpbmcgZmFsbGJhY2sgKGZhbGxiYWNrICd0b3VjaG1vdmUnIGFsd2F5cyByZWFjaGVkKVxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZHJhZ092ZXJCdWJibGUgJiYgIW9yaWdpbmFsRXZlbnQucm9vdEVsKSB7XG4gICAgICAgIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwob3JpZ2luYWxFdmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKCkge1xuICAgICAgaWYgKHRoaXMuc29ydGFibGUubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIG9mZihkb2N1bWVudCwgJ2RyYWdvdmVyJywgdGhpcy5faGFuZGxlQXV0b1Njcm9sbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvZmYoZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIG9mZihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIG9mZihkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICB9XG5cbiAgICAgIGNsZWFyUG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwoKTtcbiAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgIGNhbmNlbFRocm90dGxlKCk7XG4gICAgfSxcbiAgICBudWxsaW5nOiBmdW5jdGlvbiBudWxsaW5nKCkge1xuICAgICAgdG91Y2hFdnQkMSA9IHNjcm9sbFJvb3RFbCA9IHNjcm9sbEVsID0gc2Nyb2xsaW5nID0gcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgPSBsYXN0QXV0b1Njcm9sbFggPSBsYXN0QXV0b1Njcm9sbFkgPSBudWxsO1xuICAgICAgYXV0b1Njcm9sbHMubGVuZ3RoID0gMDtcbiAgICB9LFxuICAgIF9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGw6IGZ1bmN0aW9uIF9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwoZXZ0KSB7XG4gICAgICB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKGV2dCwgdHJ1ZSk7XG4gICAgfSxcbiAgICBfaGFuZGxlQXV0b1Njcm9sbDogZnVuY3Rpb24gX2hhbmRsZUF1dG9TY3JvbGwoZXZ0LCBmYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHggPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WCxcbiAgICAgICAgICB5ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFksXG4gICAgICAgICAgZWxlbSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgICB0b3VjaEV2dCQxID0gZXZ0OyAvLyBJRSBkb2VzIG5vdCBzZWVtIHRvIGhhdmUgbmF0aXZlIGF1dG9zY3JvbGwsXG4gICAgICAvLyBFZGdlJ3MgYXV0b3Njcm9sbCBzZWVtcyB0b28gY29uZGl0aW9uYWwsXG4gICAgICAvLyBNQUNPUyBTYWZhcmkgZG9lcyBub3QgaGF2ZSBhdXRvc2Nyb2xsLFxuICAgICAgLy8gRmlyZWZveCBhbmQgQ2hyb21lIGFyZSBnb29kXG5cbiAgICAgIGlmIChmYWxsYmFjayB8fCBFZGdlIHx8IElFMTFPckxlc3MgfHwgU2FmYXJpKSB7XG4gICAgICAgIGF1dG9TY3JvbGwoZXZ0LCB0aGlzLm9wdGlvbnMsIGVsZW0sIGZhbGxiYWNrKTsgLy8gTGlzdGVuZXIgZm9yIHBvaW50ZXIgZWxlbWVudCBjaGFuZ2VcblxuICAgICAgICB2YXIgb2dFbGVtU2Nyb2xsZXIgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbGVtLCB0cnVlKTtcblxuICAgICAgICBpZiAoc2Nyb2xsaW5nICYmICghcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgfHwgeCAhPT0gbGFzdEF1dG9TY3JvbGxYIHx8IHkgIT09IGxhc3RBdXRvU2Nyb2xsWSkpIHtcbiAgICAgICAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCAmJiBjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKCk7IC8vIERldGVjdCBmb3IgcG9pbnRlciBlbGVtIGNoYW5nZSwgZW11bGF0aW5nIG5hdGl2ZSBEbkQgYmVoYXZpb3VyXG5cbiAgICAgICAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuZXdFbGVtID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmIChuZXdFbGVtICE9PSBvZ0VsZW1TY3JvbGxlcikge1xuICAgICAgICAgICAgICBvZ0VsZW1TY3JvbGxlciA9IG5ld0VsZW07XG4gICAgICAgICAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXV0b1Njcm9sbChldnQsIF90aGlzLm9wdGlvbnMsIG5ld0VsZW0sIGZhbGxiYWNrKTtcbiAgICAgICAgICB9LCAxMCk7XG4gICAgICAgICAgbGFzdEF1dG9TY3JvbGxYID0geDtcbiAgICAgICAgICBsYXN0QXV0b1Njcm9sbFkgPSB5O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBEbkQgaXMgZW5hYmxlZCAoYW5kIGJyb3dzZXIgaGFzIGdvb2QgYXV0b3Njcm9sbGluZyksIGZpcnN0IGF1dG9zY3JvbGwgd2lsbCBhbHJlYWR5IHNjcm9sbCwgc28gZ2V0IHBhcmVudCBhdXRvc2Nyb2xsIG9mIGZpcnN0IGF1dG9zY3JvbGxcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnViYmxlU2Nyb2xsIHx8IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsZW0sIHRydWUpID09PSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCkpIHtcbiAgICAgICAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0b1Njcm9sbChldnQsIHRoaXMub3B0aW9ucywgZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgZmFsc2UpLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gX2V4dGVuZHMoQXV0b1Njcm9sbCwge1xuICAgIHBsdWdpbk5hbWU6ICdzY3JvbGwnLFxuICAgIGluaXRpYWxpemVCeURlZmF1bHQ6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyQXV0b1Njcm9sbHMoKSB7XG4gIGF1dG9TY3JvbGxzLmZvckVhY2goZnVuY3Rpb24gKGF1dG9TY3JvbGwpIHtcbiAgICBjbGVhckludGVydmFsKGF1dG9TY3JvbGwucGlkKTtcbiAgfSk7XG4gIGF1dG9TY3JvbGxzID0gW107XG59XG5cbmZ1bmN0aW9uIGNsZWFyUG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwoKSB7XG4gIGNsZWFySW50ZXJ2YWwocG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwpO1xufVxuXG52YXIgYXV0b1Njcm9sbCA9IHRocm90dGxlKGZ1bmN0aW9uIChldnQsIG9wdGlvbnMsIHJvb3RFbCwgaXNGYWxsYmFjaykge1xuICAvLyBCdWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTUyMVxuICBpZiAoIW9wdGlvbnMuc2Nyb2xsKSByZXR1cm47XG4gIHZhciB4ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFgsXG4gICAgICB5ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFksXG4gICAgICBzZW5zID0gb3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eSxcbiAgICAgIHNwZWVkID0gb3B0aW9ucy5zY3JvbGxTcGVlZCxcbiAgICAgIHdpblNjcm9sbGVyID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICB2YXIgc2Nyb2xsVGhpc0luc3RhbmNlID0gZmFsc2UsXG4gICAgICBzY3JvbGxDdXN0b21GbjsgLy8gTmV3IHNjcm9sbCByb290LCBzZXQgc2Nyb2xsRWxcblxuICBpZiAoc2Nyb2xsUm9vdEVsICE9PSByb290RWwpIHtcbiAgICBzY3JvbGxSb290RWwgPSByb290RWw7XG4gICAgY2xlYXJBdXRvU2Nyb2xscygpO1xuICAgIHNjcm9sbEVsID0gb3B0aW9ucy5zY3JvbGw7XG4gICAgc2Nyb2xsQ3VzdG9tRm4gPSBvcHRpb25zLnNjcm9sbEZuO1xuXG4gICAgaWYgKHNjcm9sbEVsID09PSB0cnVlKSB7XG4gICAgICBzY3JvbGxFbCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KHJvb3RFbCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxheWVyc091dCA9IDA7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gc2Nyb2xsRWw7XG5cbiAgZG8ge1xuICAgIHZhciBlbCA9IGN1cnJlbnRQYXJlbnQsXG4gICAgICAgIHJlY3QgPSBnZXRSZWN0KGVsKSxcbiAgICAgICAgdG9wID0gcmVjdC50b3AsXG4gICAgICAgIGJvdHRvbSA9IHJlY3QuYm90dG9tLFxuICAgICAgICBsZWZ0ID0gcmVjdC5sZWZ0LFxuICAgICAgICByaWdodCA9IHJlY3QucmlnaHQsXG4gICAgICAgIHdpZHRoID0gcmVjdC53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gcmVjdC5oZWlnaHQsXG4gICAgICAgIGNhblNjcm9sbFggPSB2b2lkIDAsXG4gICAgICAgIGNhblNjcm9sbFkgPSB2b2lkIDAsXG4gICAgICAgIHNjcm9sbFdpZHRoID0gZWwuc2Nyb2xsV2lkdGgsXG4gICAgICAgIHNjcm9sbEhlaWdodCA9IGVsLnNjcm9sbEhlaWdodCxcbiAgICAgICAgZWxDU1MgPSBjc3MoZWwpLFxuICAgICAgICBzY3JvbGxQb3NYID0gZWwuc2Nyb2xsTGVmdCxcbiAgICAgICAgc2Nyb2xsUG9zWSA9IGVsLnNjcm9sbFRvcDtcblxuICAgIGlmIChlbCA9PT0gd2luU2Nyb2xsZXIpIHtcbiAgICAgIGNhblNjcm9sbFggPSB3aWR0aCA8IHNjcm9sbFdpZHRoICYmIChlbENTUy5vdmVyZmxvd1ggPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1ggPT09ICdzY3JvbGwnIHx8IGVsQ1NTLm92ZXJmbG93WCA9PT0gJ3Zpc2libGUnKTtcbiAgICAgIGNhblNjcm9sbFkgPSBoZWlnaHQgPCBzY3JvbGxIZWlnaHQgJiYgKGVsQ1NTLm92ZXJmbG93WSA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WSA9PT0gJ3Njcm9sbCcgfHwgZWxDU1Mub3ZlcmZsb3dZID09PSAndmlzaWJsZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW5TY3JvbGxYID0gd2lkdGggPCBzY3JvbGxXaWR0aCAmJiAoZWxDU1Mub3ZlcmZsb3dYID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dYID09PSAnc2Nyb2xsJyk7XG4gICAgICBjYW5TY3JvbGxZID0gaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0ICYmIChlbENTUy5vdmVyZmxvd1kgPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1kgPT09ICdzY3JvbGwnKTtcbiAgICB9XG5cbiAgICB2YXIgdnggPSBjYW5TY3JvbGxYICYmIChNYXRoLmFicyhyaWdodCAtIHgpIDw9IHNlbnMgJiYgc2Nyb2xsUG9zWCArIHdpZHRoIDwgc2Nyb2xsV2lkdGgpIC0gKE1hdGguYWJzKGxlZnQgLSB4KSA8PSBzZW5zICYmICEhc2Nyb2xsUG9zWCk7XG4gICAgdmFyIHZ5ID0gY2FuU2Nyb2xsWSAmJiAoTWF0aC5hYnMoYm90dG9tIC0geSkgPD0gc2VucyAmJiBzY3JvbGxQb3NZICsgaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0KSAtIChNYXRoLmFicyh0b3AgLSB5KSA8PSBzZW5zICYmICEhc2Nyb2xsUG9zWSk7XG5cbiAgICBpZiAoIWF1dG9TY3JvbGxzW2xheWVyc091dF0pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGxheWVyc091dDsgaSsrKSB7XG4gICAgICAgIGlmICghYXV0b1Njcm9sbHNbaV0pIHtcbiAgICAgICAgICBhdXRvU2Nyb2xsc1tpXSA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF1dG9TY3JvbGxzW2xheWVyc091dF0udnggIT0gdnggfHwgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eSAhPSB2eSB8fCBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLmVsICE9PSBlbCkge1xuICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5lbCA9IGVsO1xuICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eCA9IHZ4O1xuICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eSA9IHZ5O1xuICAgICAgY2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnBpZCk7XG5cbiAgICAgIGlmICh2eCAhPSAwIHx8IHZ5ICE9IDApIHtcbiAgICAgICAgc2Nyb2xsVGhpc0luc3RhbmNlID0gdHJ1ZTtcbiAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOnRydWUgKi9cblxuICAgICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnBpZCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBlbXVsYXRlIGRyYWcgb3ZlciBkdXJpbmcgYXV0b3Njcm9sbCAoZmFsbGJhY2spLCBlbXVsYXRpbmcgbmF0aXZlIERuRCBiZWhhdmlvdXJcbiAgICAgICAgICBpZiAoaXNGYWxsYmFjayAmJiB0aGlzLmxheWVyID09PSAwKSB7XG4gICAgICAgICAgICBTb3J0YWJsZS5hY3RpdmUuX29uVG91Y2hNb3ZlKHRvdWNoRXZ0JDEpOyAvLyBUbyBtb3ZlIGdob3N0IGlmIGl0IGlzIHBvc2l0aW9uZWQgYWJzb2x1dGVseVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHNjcm9sbE9mZnNldFkgPSBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eSA/IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ5ICogc3BlZWQgOiAwO1xuICAgICAgICAgIHZhciBzY3JvbGxPZmZzZXRYID0gYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0udnggPyBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eCAqIHNwZWVkIDogMDtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygc2Nyb2xsQ3VzdG9tRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmIChzY3JvbGxDdXN0b21Gbi5jYWxsKFNvcnRhYmxlLmRyYWdnZWQucGFyZW50Tm9kZVtleHBhbmRvXSwgc2Nyb2xsT2Zmc2V0WCwgc2Nyb2xsT2Zmc2V0WSwgZXZ0LCB0b3VjaEV2dCQxLCBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS5lbCkgIT09ICdjb250aW51ZScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjcm9sbEJ5KGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLmVsLCBzY3JvbGxPZmZzZXRYLCBzY3JvbGxPZmZzZXRZKTtcbiAgICAgICAgfS5iaW5kKHtcbiAgICAgICAgICBsYXllcjogbGF5ZXJzT3V0XG4gICAgICAgIH0pLCAyNCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGF5ZXJzT3V0Kys7XG4gIH0gd2hpbGUgKG9wdGlvbnMuYnViYmxlU2Nyb2xsICYmIGN1cnJlbnRQYXJlbnQgIT09IHdpblNjcm9sbGVyICYmIChjdXJyZW50UGFyZW50ID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoY3VycmVudFBhcmVudCwgZmFsc2UpKSk7XG5cbiAgc2Nyb2xsaW5nID0gc2Nyb2xsVGhpc0luc3RhbmNlOyAvLyBpbiBjYXNlIGFub3RoZXIgZnVuY3Rpb24gY2F0Y2hlcyBzY3JvbGxpbmcgYXMgZmFsc2UgaW4gYmV0d2VlbiB3aGVuIGl0IGlzIG5vdFxufSwgMzApO1xuXG52YXIgZHJvcCA9IGZ1bmN0aW9uIGRyb3AoX3JlZikge1xuICB2YXIgb3JpZ2luYWxFdmVudCA9IF9yZWYub3JpZ2luYWxFdmVudCxcbiAgICAgIHB1dFNvcnRhYmxlID0gX3JlZi5wdXRTb3J0YWJsZSxcbiAgICAgIGRyYWdFbCA9IF9yZWYuZHJhZ0VsLFxuICAgICAgYWN0aXZlU29ydGFibGUgPSBfcmVmLmFjdGl2ZVNvcnRhYmxlLFxuICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50ID0gX3JlZi5kaXNwYXRjaFNvcnRhYmxlRXZlbnQsXG4gICAgICBoaWRlR2hvc3RGb3JUYXJnZXQgPSBfcmVmLmhpZGVHaG9zdEZvclRhcmdldCxcbiAgICAgIHVuaGlkZUdob3N0Rm9yVGFyZ2V0ID0gX3JlZi51bmhpZGVHaG9zdEZvclRhcmdldDtcbiAgaWYgKCFvcmlnaW5hbEV2ZW50KSByZXR1cm47XG4gIHZhciB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgYWN0aXZlU29ydGFibGU7XG4gIGhpZGVHaG9zdEZvclRhcmdldCgpO1xuICB2YXIgdG91Y2ggPSBvcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID8gb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXSA6IG9yaWdpbmFsRXZlbnQ7XG4gIHZhciB0YXJnZXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpO1xuICB1bmhpZGVHaG9zdEZvclRhcmdldCgpO1xuXG4gIGlmICh0b1NvcnRhYmxlICYmICF0b1NvcnRhYmxlLmVsLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoJ3NwaWxsJyk7XG4gICAgdGhpcy5vblNwaWxsKHtcbiAgICAgIGRyYWdFbDogZHJhZ0VsLFxuICAgICAgcHV0U29ydGFibGU6IHB1dFNvcnRhYmxlXG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFJldmVydCgpIHt9XG5cblJldmVydC5wcm90b3R5cGUgPSB7XG4gIHN0YXJ0SW5kZXg6IG51bGwsXG4gIGRyYWdTdGFydDogZnVuY3Rpb24gZHJhZ1N0YXJ0KF9yZWYyKSB7XG4gICAgdmFyIG9sZERyYWdnYWJsZUluZGV4ID0gX3JlZjIub2xkRHJhZ2dhYmxlSW5kZXg7XG4gICAgdGhpcy5zdGFydEluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXg7XG4gIH0sXG4gIG9uU3BpbGw6IGZ1bmN0aW9uIG9uU3BpbGwoX3JlZjMpIHtcbiAgICB2YXIgZHJhZ0VsID0gX3JlZjMuZHJhZ0VsLFxuICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYzLnB1dFNvcnRhYmxlO1xuICAgIHRoaXMuc29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG5cbiAgICBpZiAocHV0U29ydGFibGUpIHtcbiAgICAgIHB1dFNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIH1cblxuICAgIHZhciBuZXh0U2libGluZyA9IGdldENoaWxkKHRoaXMuc29ydGFibGUuZWwsIHRoaXMuc3RhcnRJbmRleCwgdGhpcy5vcHRpb25zKTtcblxuICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgdGhpcy5zb3J0YWJsZS5lbC5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBuZXh0U2libGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydGFibGUuZWwuYXBwZW5kQ2hpbGQoZHJhZ0VsKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcblxuICAgIGlmIChwdXRTb3J0YWJsZSkge1xuICAgICAgcHV0U29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgIH1cbiAgfSxcbiAgZHJvcDogZHJvcFxufTtcblxuX2V4dGVuZHMoUmV2ZXJ0LCB7XG4gIHBsdWdpbk5hbWU6ICdyZXZlcnRPblNwaWxsJ1xufSk7XG5cbmZ1bmN0aW9uIFJlbW92ZSgpIHt9XG5cblJlbW92ZS5wcm90b3R5cGUgPSB7XG4gIG9uU3BpbGw6IGZ1bmN0aW9uIG9uU3BpbGwoX3JlZjQpIHtcbiAgICB2YXIgZHJhZ0VsID0gX3JlZjQuZHJhZ0VsLFxuICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWY0LnB1dFNvcnRhYmxlO1xuICAgIHZhciBwYXJlbnRTb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IHRoaXMuc29ydGFibGU7XG4gICAgcGFyZW50U29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgZHJhZ0VsLnBhcmVudE5vZGUgJiYgZHJhZ0VsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZHJhZ0VsKTtcbiAgICBwYXJlbnRTb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gIH0sXG4gIGRyb3A6IGRyb3Bcbn07XG5cbl9leHRlbmRzKFJlbW92ZSwge1xuICBwbHVnaW5OYW1lOiAncmVtb3ZlT25TcGlsbCdcbn0pO1xuXG52YXIgbGFzdFN3YXBFbDtcblxuZnVuY3Rpb24gU3dhcFBsdWdpbigpIHtcbiAgZnVuY3Rpb24gU3dhcCgpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgc3dhcENsYXNzOiAnc29ydGFibGUtc3dhcC1oaWdobGlnaHQnXG4gICAgfTtcbiAgfVxuXG4gIFN3YXAucHJvdG90eXBlID0ge1xuICAgIGRyYWdTdGFydDogZnVuY3Rpb24gZHJhZ1N0YXJ0KF9yZWYpIHtcbiAgICAgIHZhciBkcmFnRWwgPSBfcmVmLmRyYWdFbDtcbiAgICAgIGxhc3RTd2FwRWwgPSBkcmFnRWw7XG4gICAgfSxcbiAgICBkcmFnT3ZlclZhbGlkOiBmdW5jdGlvbiBkcmFnT3ZlclZhbGlkKF9yZWYyKSB7XG4gICAgICB2YXIgY29tcGxldGVkID0gX3JlZjIuY29tcGxldGVkLFxuICAgICAgICAgIHRhcmdldCA9IF9yZWYyLnRhcmdldCxcbiAgICAgICAgICBvbk1vdmUgPSBfcmVmMi5vbk1vdmUsXG4gICAgICAgICAgYWN0aXZlU29ydGFibGUgPSBfcmVmMi5hY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgICBjaGFuZ2VkID0gX3JlZjIuY2hhbmdlZCxcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmMi5jYW5jZWw7XG4gICAgICBpZiAoIWFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuc3dhcCkgcmV0dXJuO1xuICAgICAgdmFyIGVsID0gdGhpcy5zb3J0YWJsZS5lbCxcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gZWwpIHtcbiAgICAgICAgdmFyIHByZXZTd2FwRWwgPSBsYXN0U3dhcEVsO1xuXG4gICAgICAgIGlmIChvbk1vdmUodGFyZ2V0KSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICB0b2dnbGVDbGFzcyh0YXJnZXQsIG9wdGlvbnMuc3dhcENsYXNzLCB0cnVlKTtcbiAgICAgICAgICBsYXN0U3dhcEVsID0gdGFyZ2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3RTd2FwRWwgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZTd2FwRWwgJiYgcHJldlN3YXBFbCAhPT0gbGFzdFN3YXBFbCkge1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKHByZXZTd2FwRWwsIG9wdGlvbnMuc3dhcENsYXNzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2hhbmdlZCgpO1xuICAgICAgY29tcGxldGVkKHRydWUpO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKF9yZWYzKSB7XG4gICAgICB2YXIgYWN0aXZlU29ydGFibGUgPSBfcmVmMy5hY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYzLnB1dFNvcnRhYmxlLFxuICAgICAgICAgIGRyYWdFbCA9IF9yZWYzLmRyYWdFbDtcbiAgICAgIHZhciB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgdGhpcy5zb3J0YWJsZTtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgbGFzdFN3YXBFbCAmJiB0b2dnbGVDbGFzcyhsYXN0U3dhcEVsLCBvcHRpb25zLnN3YXBDbGFzcywgZmFsc2UpO1xuXG4gICAgICBpZiAobGFzdFN3YXBFbCAmJiAob3B0aW9ucy5zd2FwIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLm9wdGlvbnMuc3dhcCkpIHtcbiAgICAgICAgaWYgKGRyYWdFbCAhPT0gbGFzdFN3YXBFbCkge1xuICAgICAgICAgIHRvU29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgICAgICAgaWYgKHRvU29ydGFibGUgIT09IGFjdGl2ZVNvcnRhYmxlKSBhY3RpdmVTb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgICBzd2FwTm9kZXMoZHJhZ0VsLCBsYXN0U3dhcEVsKTtcbiAgICAgICAgICB0b1NvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgICBpZiAodG9Tb3J0YWJsZSAhPT0gYWN0aXZlU29ydGFibGUpIGFjdGl2ZVNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbnVsbGluZzogZnVuY3Rpb24gbnVsbGluZygpIHtcbiAgICAgIGxhc3RTd2FwRWwgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzKFN3YXAsIHtcbiAgICBwbHVnaW5OYW1lOiAnc3dhcCcsXG4gICAgZXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBldmVudFByb3BlcnRpZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzd2FwSXRlbTogbGFzdFN3YXBFbFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzd2FwTm9kZXMobjEsIG4yKSB7XG4gIHZhciBwMSA9IG4xLnBhcmVudE5vZGUsXG4gICAgICBwMiA9IG4yLnBhcmVudE5vZGUsXG4gICAgICBpMSxcbiAgICAgIGkyO1xuICBpZiAoIXAxIHx8ICFwMiB8fCBwMS5pc0VxdWFsTm9kZShuMikgfHwgcDIuaXNFcXVhbE5vZGUobjEpKSByZXR1cm47XG4gIGkxID0gaW5kZXgobjEpO1xuICBpMiA9IGluZGV4KG4yKTtcblxuICBpZiAocDEuaXNFcXVhbE5vZGUocDIpICYmIGkxIDwgaTIpIHtcbiAgICBpMisrO1xuICB9XG5cbiAgcDEuaW5zZXJ0QmVmb3JlKG4yLCBwMS5jaGlsZHJlbltpMV0pO1xuICBwMi5pbnNlcnRCZWZvcmUobjEsIHAyLmNoaWxkcmVuW2kyXSk7XG59XG5cbnZhciBtdWx0aURyYWdFbGVtZW50cyA9IFtdLFxuICAgIG11bHRpRHJhZ0Nsb25lcyA9IFtdLFxuICAgIGxhc3RNdWx0aURyYWdTZWxlY3QsXG4gICAgLy8gZm9yIHNlbGVjdGlvbiB3aXRoIG1vZGlmaWVyIGtleSBkb3duIChTSElGVClcbm11bHRpRHJhZ1NvcnRhYmxlLFxuICAgIGluaXRpYWxGb2xkaW5nID0gZmFsc2UsXG4gICAgLy8gSW5pdGlhbCBtdWx0aS1kcmFnIGZvbGQgd2hlbiBkcmFnIHN0YXJ0ZWRcbmZvbGRpbmcgPSBmYWxzZSxcbiAgICAvLyBGb2xkaW5nIGFueSBvdGhlciB0aW1lXG5kcmFnU3RhcnRlZCA9IGZhbHNlLFxuICAgIGRyYWdFbCQxLFxuICAgIGNsb25lc0Zyb21SZWN0LFxuICAgIGNsb25lc0hpZGRlbjtcblxuZnVuY3Rpb24gTXVsdGlEcmFnUGx1Z2luKCkge1xuICBmdW5jdGlvbiBNdWx0aURyYWcoc29ydGFibGUpIHtcbiAgICAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcbiAgICBmb3IgKHZhciBmbiBpbiB0aGlzKSB7XG4gICAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc29ydGFibGUub3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgICAgb24oZG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uKGRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9uKGRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgfVxuXG4gICAgb24oZG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5fY2hlY2tLZXlEb3duKTtcbiAgICBvbihkb2N1bWVudCwgJ2tleXVwJywgdGhpcy5fY2hlY2tLZXlVcCk7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIHNlbGVjdGVkQ2xhc3M6ICdzb3J0YWJsZS1zZWxlY3RlZCcsXG4gICAgICBtdWx0aURyYWdLZXk6IG51bGwsXG4gICAgICBzZXREYXRhOiBmdW5jdGlvbiBzZXREYXRhKGRhdGFUcmFuc2ZlciwgZHJhZ0VsKSB7XG4gICAgICAgIHZhciBkYXRhID0gJyc7XG5cbiAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCAmJiBtdWx0aURyYWdTb3J0YWJsZSA9PT0gc29ydGFibGUpIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50LCBpKSB7XG4gICAgICAgICAgICBkYXRhICs9ICghaSA/ICcnIDogJywgJykgKyBtdWx0aURyYWdFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGEgPSBkcmFnRWwudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhVHJhbnNmZXIuc2V0RGF0YSgnVGV4dCcsIGRhdGEpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBNdWx0aURyYWcucHJvdG90eXBlID0ge1xuICAgIG11bHRpRHJhZ0tleURvd246IGZhbHNlLFxuICAgIGlzTXVsdGlEcmFnOiBmYWxzZSxcbiAgICBkZWxheVN0YXJ0R2xvYmFsOiBmdW5jdGlvbiBkZWxheVN0YXJ0R2xvYmFsKF9yZWYpIHtcbiAgICAgIHZhciBkcmFnZ2VkID0gX3JlZi5kcmFnRWw7XG4gICAgICBkcmFnRWwkMSA9IGRyYWdnZWQ7XG4gICAgfSxcbiAgICBkZWxheUVuZGVkOiBmdW5jdGlvbiBkZWxheUVuZGVkKCkge1xuICAgICAgdGhpcy5pc011bHRpRHJhZyA9IH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKTtcbiAgICB9LFxuICAgIHNldHVwQ2xvbmU6IGZ1bmN0aW9uIHNldHVwQ2xvbmUoX3JlZjIpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYyLnNvcnRhYmxlLFxuICAgICAgICAgIGNhbmNlbCA9IF9yZWYyLmNhbmNlbDtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lcy5wdXNoKGNsb25lKG11bHRpRHJhZ0VsZW1lbnRzW2ldKSk7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lc1tpXS5zb3J0YWJsZUluZGV4ID0gbXVsdGlEcmFnRWxlbWVudHNbaV0uc29ydGFibGVJbmRleDtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzW2ldLmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgICBtdWx0aURyYWdDbG9uZXNbaV0uc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnJztcbiAgICAgICAgdG9nZ2xlQ2xhc3MobXVsdGlEcmFnQ2xvbmVzW2ldLCB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50c1tpXSA9PT0gZHJhZ0VsJDEgJiYgdG9nZ2xlQ2xhc3MobXVsdGlEcmFnQ2xvbmVzW2ldLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgc29ydGFibGUuX2hpZGVDbG9uZSgpO1xuXG4gICAgICBjYW5jZWwoKTtcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZShfcmVmMykge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjMuc29ydGFibGUsXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjMucm9vdEVsLFxuICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCA9IF9yZWYzLmRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmMy5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUpIHtcbiAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCAmJiBtdWx0aURyYWdTb3J0YWJsZSA9PT0gc29ydGFibGUpIHtcbiAgICAgICAgICBpbnNlcnRNdWx0aURyYWdDbG9uZXModHJ1ZSwgcm9vdEVsKTtcbiAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoJ2Nsb25lJyk7XG4gICAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHNob3dDbG9uZTogZnVuY3Rpb24gc2hvd0Nsb25lKF9yZWY0KSB7XG4gICAgICB2YXIgY2xvbmVOb3dTaG93biA9IF9yZWY0LmNsb25lTm93U2hvd24sXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjQucm9vdEVsLFxuICAgICAgICAgIGNhbmNlbCA9IF9yZWY0LmNhbmNlbDtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuICAgICAgaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKGZhbHNlLCByb290RWwpO1xuICAgICAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgIGNzcyhjbG9uZSwgJ2Rpc3BsYXknLCAnJyk7XG4gICAgICB9KTtcbiAgICAgIGNsb25lTm93U2hvd24oKTtcbiAgICAgIGNsb25lc0hpZGRlbiA9IGZhbHNlO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBoaWRlQ2xvbmU6IGZ1bmN0aW9uIGhpZGVDbG9uZShfcmVmNSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjUuc29ydGFibGUsXG4gICAgICAgICAgY2xvbmVOb3dIaWRkZW4gPSBfcmVmNS5jbG9uZU5vd0hpZGRlbixcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmNS5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICBjc3MoY2xvbmUsICdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSAmJiBjbG9uZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgY2xvbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2xvbmVOb3dIaWRkZW4oKTtcbiAgICAgIGNsb25lc0hpZGRlbiA9IHRydWU7XG4gICAgICBjYW5jZWwoKTtcbiAgICB9LFxuICAgIGRyYWdTdGFydEdsb2JhbDogZnVuY3Rpb24gZHJhZ1N0YXJ0R2xvYmFsKF9yZWY2KSB7XG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmNi5zb3J0YWJsZTtcblxuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnICYmIG11bHRpRHJhZ1NvcnRhYmxlKSB7XG4gICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlLm11bHRpRHJhZy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcbiAgICAgIH1cblxuICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgIH0pOyAvLyBTb3J0IG11bHRpLWRyYWcgZWxlbWVudHNcblxuICAgICAgbXVsdGlEcmFnRWxlbWVudHMgPSBtdWx0aURyYWdFbGVtZW50cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnNvcnRhYmxlSW5kZXggLSBiLnNvcnRhYmxlSW5kZXg7XG4gICAgICB9KTtcbiAgICAgIGRyYWdTdGFydGVkID0gdHJ1ZTtcbiAgICB9LFxuICAgIGRyYWdTdGFydGVkOiBmdW5jdGlvbiBkcmFnU3RhcnRlZChfcmVmNykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWY3LnNvcnRhYmxlO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc29ydCkge1xuICAgICAgICAvLyBDYXB0dXJlIHJlY3RzLFxuICAgICAgICAvLyBoaWRlIG11bHRpIGRyYWcgZWxlbWVudHMgKGJ5IHBvc2l0aW9uaW5nIHRoZW0gYWJzb2x1dGUpLFxuICAgICAgICAvLyBzZXQgbXVsdGkgZHJhZyBlbGVtZW50cyByZWN0cyB0byBkcmFnUmVjdCxcbiAgICAgICAgLy8gc2hvdyBtdWx0aSBkcmFnIGVsZW1lbnRzLFxuICAgICAgICAvLyBhbmltYXRlIHRvIHJlY3RzLFxuICAgICAgICAvLyB1bnNldCByZWN0cyAmIHJlbW92ZSBmcm9tIERPTVxuICAgICAgICBzb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgICAgICAgICAgY3NzKG11bHRpRHJhZ0VsZW1lbnQsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBkcmFnUmVjdCA9IGdldFJlY3QoZHJhZ0VsJDEsIGZhbHNlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICAgICAgICAgIHNldFJlY3QobXVsdGlEcmFnRWxlbWVudCwgZHJhZ1JlY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvbGRpbmcgPSB0cnVlO1xuICAgICAgICAgIGluaXRpYWxGb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzb3J0YWJsZS5hbmltYXRlQWxsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9sZGluZyA9IGZhbHNlO1xuICAgICAgICBpbml0aWFsRm9sZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gLy8gUmVtb3ZlIGFsbCBhdXhpbGlhcnkgbXVsdGlkcmFnIGl0ZW1zIGZyb20gZWwsIGlmIHNvcnRpbmcgZW5hYmxlZFxuXG5cbiAgICAgICAgaWYgKF90aGlzMi5vcHRpb25zLnNvcnQpIHtcbiAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGRyYWdPdmVyOiBmdW5jdGlvbiBkcmFnT3ZlcihfcmVmOCkge1xuICAgICAgdmFyIHRhcmdldCA9IF9yZWY4LnRhcmdldCxcbiAgICAgICAgICBjb21wbGV0ZWQgPSBfcmVmOC5jb21wbGV0ZWQsXG4gICAgICAgICAgY2FuY2VsID0gX3JlZjguY2FuY2VsO1xuXG4gICAgICBpZiAoZm9sZGluZyAmJiB+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZih0YXJnZXQpKSB7XG4gICAgICAgIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIGNhbmNlbCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmV2ZXJ0OiBmdW5jdGlvbiByZXZlcnQoX3JlZjkpIHtcbiAgICAgIHZhciBmcm9tU29ydGFibGUgPSBfcmVmOS5mcm9tU29ydGFibGUsXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjkucm9vdEVsLFxuICAgICAgICAgIHNvcnRhYmxlID0gX3JlZjkuc29ydGFibGUsXG4gICAgICAgICAgZHJhZ1JlY3QgPSBfcmVmOS5kcmFnUmVjdDtcblxuICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gU2V0dXAgdW5mb2xkIGFuaW1hdGlvblxuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgc29ydGFibGUuYWRkQW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgdGFyZ2V0OiBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgICAgcmVjdDogZm9sZGluZyA/IGdldFJlY3QobXVsdGlEcmFnRWxlbWVudCkgOiBkcmFnUmVjdFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHVuc2V0UmVjdChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LmZyb21SZWN0ID0gZHJhZ1JlY3Q7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLnJlbW92ZUFuaW1hdGlvblN0YXRlKG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9sZGluZyA9IGZhbHNlO1xuICAgICAgICBpbnNlcnRNdWx0aURyYWdFbGVtZW50cyghdGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlLCByb290RWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ092ZXJDb21wbGV0ZWQ6IGZ1bmN0aW9uIGRyYWdPdmVyQ29tcGxldGVkKF9yZWYxMCkge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjEwLnNvcnRhYmxlLFxuICAgICAgICAgIGlzT3duZXIgPSBfcmVmMTAuaXNPd25lcixcbiAgICAgICAgICBpbnNlcnRpb24gPSBfcmVmMTAuaW5zZXJ0aW9uLFxuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZjEwLmFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICAgIHBhcmVudEVsID0gX3JlZjEwLnBhcmVudEVsLFxuICAgICAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjEwLnB1dFNvcnRhYmxlO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmIChpbnNlcnRpb24pIHtcbiAgICAgICAgLy8gQ2xvbmVzIG11c3QgYmUgaGlkZGVuIGJlZm9yZSBmb2xkaW5nIGFuaW1hdGlvbiB0byBjYXB0dXJlIGRyYWdSZWN0QWJzb2x1dGUgcHJvcGVybHlcbiAgICAgICAgaWYgKGlzT3duZXIpIHtcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5faGlkZUNsb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbml0aWFsRm9sZGluZyA9IGZhbHNlOyAvLyBJZiBsZWF2aW5nIHNvcnQ6ZmFsc2Ugcm9vdCwgb3IgYWxyZWFkeSBmb2xkaW5nIC0gRm9sZCB0byBuZXcgbG9jYXRpb25cblxuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24gJiYgbXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSAmJiAoZm9sZGluZyB8fCAhaXNPd25lciAmJiAhYWN0aXZlU29ydGFibGUub3B0aW9ucy5zb3J0ICYmICFwdXRTb3J0YWJsZSkpIHtcbiAgICAgICAgICAvLyBGb2xkOiBTZXQgYWxsIG11bHRpIGRyYWcgZWxlbWVudHMncyByZWN0cyB0byBkcmFnRWwncyByZWN0IHdoZW4gbXVsdGktZHJhZyBlbGVtZW50cyBhcmUgaW52aXNpYmxlXG4gICAgICAgICAgdmFyIGRyYWdSZWN0QWJzb2x1dGUgPSBnZXRSZWN0KGRyYWdFbCQxLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgICAgICAgICBzZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQsIGRyYWdSZWN0QWJzb2x1dGUpOyAvLyBNb3ZlIGVsZW1lbnQocykgdG8gZW5kIG9mIHBhcmVudEVsIHNvIHRoYXQgaXQgZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggbXVsdGktZHJhZyBjbG9uZXMgaW5zZXJ0aW9uIGlmIHRoZXkgYXJlIGluc2VydGVkXG4gICAgICAgICAgICAvLyB3aGlsZSBmb2xkaW5nLCBhbmQgc28gdGhhdCB3ZSBjYW4gY2FwdHVyZSB0aGVtIGFnYWluIGJlY2F1c2Ugb2xkIHNvcnRhYmxlIHdpbGwgbm8gbG9uZ2VyIGJlIGZyb21Tb3J0YWJsZVxuXG4gICAgICAgICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgfSAvLyBDbG9uZXMgbXVzdCBiZSBzaG93biAoYW5kIGNoZWNrIHRvIHJlbW92ZSBtdWx0aSBkcmFncykgYWZ0ZXIgZm9sZGluZyB3aGVuIGludGVyZmVyaW5nIG11bHRpRHJhZ0VsZW1lbnRzIGFyZSBtb3ZlZCBvdXRcblxuXG4gICAgICAgIGlmICghaXNPd25lcikge1xuICAgICAgICAgIC8vIE9ubHkgcmVtb3ZlIGlmIG5vdCBmb2xkaW5nIChmb2xkaW5nIHdpbGwgcmVtb3ZlIHRoZW0gYW55d2F5cylcbiAgICAgICAgICBpZiAoIWZvbGRpbmcpIHtcbiAgICAgICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBjbG9uZXNIaWRkZW5CZWZvcmUgPSBjbG9uZXNIaWRkZW47XG5cbiAgICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9zaG93Q2xvbmUoc29ydGFibGUpOyAvLyBVbmZvbGQgYW5pbWF0aW9uIGZvciBjbG9uZXMgaWYgc2hvd2luZyBmcm9tIGhpZGRlblxuXG5cbiAgICAgICAgICAgIGlmIChhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmFuaW1hdGlvbiAmJiAhY2xvbmVzSGlkZGVuICYmIGNsb25lc0hpZGRlbkJlZm9yZSkge1xuICAgICAgICAgICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICAgICAgICB0YXJnZXQ6IGNsb25lLFxuICAgICAgICAgICAgICAgICAgcmVjdDogY2xvbmVzRnJvbVJlY3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjbG9uZS5mcm9tUmVjdCA9IGNsb25lc0Zyb21SZWN0O1xuICAgICAgICAgICAgICAgIGNsb25lLnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKHNvcnRhYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQW5pbWF0aW9uQ2FwdHVyZTogZnVuY3Rpb24gZHJhZ092ZXJBbmltYXRpb25DYXB0dXJlKF9yZWYxMSkge1xuICAgICAgdmFyIGRyYWdSZWN0ID0gX3JlZjExLmRyYWdSZWN0LFxuICAgICAgICAgIGlzT3duZXIgPSBfcmVmMTEuaXNPd25lcixcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYxMS5hY3RpdmVTb3J0YWJsZTtcbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudC50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmFuaW1hdGlvbiAmJiAhaXNPd25lciAmJiBhY3RpdmVTb3J0YWJsZS5tdWx0aURyYWcuaXNNdWx0aURyYWcpIHtcbiAgICAgICAgY2xvbmVzRnJvbVJlY3QgPSBfZXh0ZW5kcyh7fSwgZHJhZ1JlY3QpO1xuICAgICAgICB2YXIgZHJhZ01hdHJpeCA9IG1hdHJpeChkcmFnRWwkMSwgdHJ1ZSk7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0LnRvcCAtPSBkcmFnTWF0cml4LmY7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0LmxlZnQgLT0gZHJhZ01hdHJpeC5lO1xuICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZTogZnVuY3Rpb24gZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZSgpIHtcbiAgICAgIGlmIChmb2xkaW5nKSB7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyb3A6IGZ1bmN0aW9uIGRyb3AoX3JlZjEyKSB7XG4gICAgICB2YXIgZXZ0ID0gX3JlZjEyLm9yaWdpbmFsRXZlbnQsXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjEyLnJvb3RFbCxcbiAgICAgICAgICBwYXJlbnRFbCA9IF9yZWYxMi5wYXJlbnRFbCxcbiAgICAgICAgICBzb3J0YWJsZSA9IF9yZWYxMi5zb3J0YWJsZSxcbiAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQgPSBfcmVmMTIuZGlzcGF0Y2hTb3J0YWJsZUV2ZW50LFxuICAgICAgICAgIG9sZEluZGV4ID0gX3JlZjEyLm9sZEluZGV4LFxuICAgICAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjEyLnB1dFNvcnRhYmxlO1xuICAgICAgdmFyIHRvU29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCB0aGlzLnNvcnRhYmxlO1xuICAgICAgaWYgKCFldnQpIHJldHVybjtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGNoaWxkcmVuID0gcGFyZW50RWwuY2hpbGRyZW47IC8vIE11bHRpLWRyYWcgc2VsZWN0aW9uXG5cbiAgICAgIGlmICghZHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubXVsdGlEcmFnS2V5ICYmICF0aGlzLm11bHRpRHJhZ0tleURvd24pIHtcbiAgICAgICAgICB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsJDEsIG9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgIX5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKSk7XG5cbiAgICAgICAgaWYgKCF+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSkpIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5wdXNoKGRyYWdFbCQxKTtcbiAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICAgICAgbmFtZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICB0YXJnZXRFbDogZHJhZ0VsJDEsXG4gICAgICAgICAgICBvcmlnaW5hbEV2dDogZXZ0XG4gICAgICAgICAgfSk7IC8vIE1vZGlmaWVyIGFjdGl2YXRlZCwgc2VsZWN0IGZyb20gbGFzdCB0byBkcmFnRWxcblxuICAgICAgICAgIGlmIChldnQuc2hpZnRLZXkgJiYgbGFzdE11bHRpRHJhZ1NlbGVjdCAmJiBzb3J0YWJsZS5lbC5jb250YWlucyhsYXN0TXVsdGlEcmFnU2VsZWN0KSkge1xuICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IGluZGV4KGxhc3RNdWx0aURyYWdTZWxlY3QpLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4KGRyYWdFbCQxKTtcblxuICAgICAgICAgICAgaWYgKH5sYXN0SW5kZXggJiYgfmN1cnJlbnRJbmRleCAmJiBsYXN0SW5kZXggIT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgICAgICAvLyBNdXN0IGluY2x1ZGUgbGFzdE11bHRpRHJhZ1NlbGVjdCAoc2VsZWN0IGl0KSwgaW4gY2FzZSBtb2RpZmllZCBzZWxlY3Rpb24gZnJvbSBubyBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgLy8gKGJ1dCBwcmV2aW91cyBzZWxlY3Rpb24gZXhpc3RlZClcbiAgICAgICAgICAgICAgdmFyIG4sIGk7XG5cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgIGkgPSBsYXN0SW5kZXg7XG4gICAgICAgICAgICAgICAgbiA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gY3VycmVudEluZGV4O1xuICAgICAgICAgICAgICAgIG4gPSBsYXN0SW5kZXggKyAxO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yICg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAofm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoY2hpbGRyZW5baV0pKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0b2dnbGVDbGFzcyhjaGlsZHJlbltpXSwgb3B0aW9ucy5zZWxlY3RlZENsYXNzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgICAgICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICAgICAgICAgICAgbmFtZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgICAgICB0YXJnZXRFbDogY2hpbGRyZW5baV0sXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2dDogZXZ0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdE11bHRpRHJhZ1NlbGVjdCA9IGRyYWdFbCQxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gdG9Tb3J0YWJsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5zcGxpY2UobXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSksIDEpO1xuICAgICAgICAgIGxhc3RNdWx0aURyYWdTZWxlY3QgPSBudWxsO1xuICAgICAgICAgIGRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlLFxuICAgICAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgICAgICBuYW1lOiAnZGVzZWxlY3QnLFxuICAgICAgICAgICAgdGFyZ2V0RWw6IGRyYWdFbCQxLFxuICAgICAgICAgICAgb3JpZ2luYWxFdnQ6IGV2dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IC8vIE11bHRpLWRyYWcgZHJvcFxuXG5cbiAgICAgIGlmIChkcmFnU3RhcnRlZCAmJiB0aGlzLmlzTXVsdGlEcmFnKSB7XG4gICAgICAgIC8vIERvIG5vdCBcInVuZm9sZFwiIGFmdGVyIGFyb3VuZCBkcmFnRWwgaWYgcmV2ZXJ0ZWRcbiAgICAgICAgaWYgKChwYXJlbnRFbFtleHBhbmRvXS5vcHRpb25zLnNvcnQgfHwgcGFyZW50RWwgIT09IHJvb3RFbCkgJiYgbXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHZhciBkcmFnUmVjdCA9IGdldFJlY3QoZHJhZ0VsJDEpLFxuICAgICAgICAgICAgICBtdWx0aURyYWdJbmRleCA9IGluZGV4KGRyYWdFbCQxLCAnOm5vdCguJyArIHRoaXMub3B0aW9ucy5zZWxlY3RlZENsYXNzICsgJyknKTtcbiAgICAgICAgICBpZiAoIWluaXRpYWxGb2xkaW5nICYmIG9wdGlvbnMuYW5pbWF0aW9uKSBkcmFnRWwkMS50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICAgIHRvU29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG5cbiAgICAgICAgICBpZiAoIWluaXRpYWxGb2xkaW5nKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgZHJhZ0VsJDEuZnJvbVJlY3QgPSBkcmFnUmVjdDtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ICE9PSBkcmFnRWwkMSkge1xuICAgICAgICAgICAgICAgICAgdmFyIHJlY3QgPSBmb2xkaW5nID8gZ2V0UmVjdChtdWx0aURyYWdFbGVtZW50KSA6IGRyYWdSZWN0O1xuICAgICAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudC5mcm9tUmVjdCA9IHJlY3Q7IC8vIFByZXBhcmUgdW5mb2xkIGFuaW1hdGlvblxuXG4gICAgICAgICAgICAgICAgICB0b1NvcnRhYmxlLmFkZEFuaW1hdGlvblN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICByZWN0OiByZWN0XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSAvLyBNdWx0aSBkcmFnIGVsZW1lbnRzIGFyZSBub3QgbmVjZXNzYXJpbHkgcmVtb3ZlZCBmcm9tIHRoZSBET00gb24gZHJvcCwgc28gdG8gcmVpbnNlcnRcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHRoZXkgbXVzdCBhbGwgYmUgcmVtb3ZlZFxuXG5cbiAgICAgICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgIGlmIChjaGlsZHJlblttdWx0aURyYWdJbmRleF0pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUobXVsdGlEcmFnRWxlbWVudCwgY2hpbGRyZW5bbXVsdGlEcmFnSW5kZXhdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG11bHRpRHJhZ0luZGV4Kys7XG4gICAgICAgICAgICB9KTsgLy8gSWYgaW5pdGlhbCBmb2xkaW5nIGlzIGRvbmUsIHRoZSBlbGVtZW50cyBtYXkgaGF2ZSBjaGFuZ2VkIHBvc2l0aW9uIGJlY2F1c2UgdGhleSBhcmUgbm93XG4gICAgICAgICAgICAvLyB1bmZvbGRpbmcgYXJvdW5kIGRyYWdFbCwgZXZlbiB0aG91Z2ggZHJhZ0VsIG1heSBub3QgaGF2ZSBoaXMgaW5kZXggY2hhbmdlZCwgc28gdXBkYXRlIGV2ZW50XG4gICAgICAgICAgICAvLyBtdXN0IGJlIGZpcmVkIGhlcmUgYXMgU29ydGFibGUgd2lsbCBub3QuXG5cbiAgICAgICAgICAgIGlmIChvbGRJbmRleCA9PT0gaW5kZXgoZHJhZ0VsJDEpKSB7XG4gICAgICAgICAgICAgIHZhciB1cGRhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggIT09IGluZGV4KG11bHRpRHJhZ0VsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICB1cGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCgndXBkYXRlJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIE11c3QgYmUgZG9uZSBhZnRlciBjYXB0dXJpbmcgaW5kaXZpZHVhbCByZWN0cyAoc2Nyb2xsIGJhcilcblxuXG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgdW5zZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRvU29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbXVsdGlEcmFnU29ydGFibGUgPSB0b1NvcnRhYmxlO1xuICAgICAgfSAvLyBSZW1vdmUgY2xvbmVzIGlmIG5lY2Vzc2FyeVxuXG5cbiAgICAgIGlmIChyb290RWwgPT09IHBhcmVudEVsIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlICE9PSAnY2xvbmUnKSB7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICAgIGNsb25lLnBhcmVudE5vZGUgJiYgY2xvbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgbnVsbGluZ0dsb2JhbDogZnVuY3Rpb24gbnVsbGluZ0dsb2JhbCgpIHtcbiAgICAgIHRoaXMuaXNNdWx0aURyYWcgPSBkcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgbXVsdGlEcmFnQ2xvbmVzLmxlbmd0aCA9IDA7XG4gICAgfSxcbiAgICBkZXN0cm95R2xvYmFsOiBmdW5jdGlvbiBkZXN0cm95R2xvYmFsKCkge1xuICAgICAgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcblxuICAgICAgb2ZmKGRvY3VtZW50LCAncG9pbnRlcnVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgb2ZmKGRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgb2ZmKGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuX2NoZWNrS2V5RG93bik7XG4gICAgICBvZmYoZG9jdW1lbnQsICdrZXl1cCcsIHRoaXMuX2NoZWNrS2V5VXApO1xuICAgIH0sXG4gICAgX2Rlc2VsZWN0TXVsdGlEcmFnOiBmdW5jdGlvbiBfZGVzZWxlY3RNdWx0aURyYWcoZXZ0KSB7XG4gICAgICBpZiAodHlwZW9mIGRyYWdTdGFydGVkICE9PSBcInVuZGVmaW5lZFwiICYmIGRyYWdTdGFydGVkKSByZXR1cm47IC8vIE9ubHkgZGVzZWxlY3QgaWYgc2VsZWN0aW9uIGlzIGluIHRoaXMgc29ydGFibGVcblxuICAgICAgaWYgKG11bHRpRHJhZ1NvcnRhYmxlICE9PSB0aGlzLnNvcnRhYmxlKSByZXR1cm47IC8vIE9ubHkgZGVzZWxlY3QgaWYgdGFyZ2V0IGlzIG5vdCBpdGVtIGluIHRoaXMgc29ydGFibGVcblxuICAgICAgaWYgKGV2dCAmJiBjbG9zZXN0KGV2dC50YXJnZXQsIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUsIHRoaXMuc29ydGFibGUuZWwsIGZhbHNlKSkgcmV0dXJuOyAvLyBPbmx5IGRlc2VsZWN0IGlmIGxlZnQgY2xpY2tcblxuICAgICAgaWYgKGV2dCAmJiBldnQuYnV0dG9uICE9PSAwKSByZXR1cm47XG5cbiAgICAgIHdoaWxlIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGVsID0gbXVsdGlEcmFnRWxlbWVudHNbMF07XG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5zaGlmdCgpO1xuICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZTogdGhpcy5zb3J0YWJsZSxcbiAgICAgICAgICByb290RWw6IHRoaXMuc29ydGFibGUuZWwsXG4gICAgICAgICAgbmFtZTogJ2Rlc2VsZWN0JyxcbiAgICAgICAgICB0YXJnZXRFbDogZWwsXG4gICAgICAgICAgb3JpZ2luYWxFdnQ6IGV2dFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9jaGVja0tleURvd246IGZ1bmN0aW9uIF9jaGVja0tleURvd24oZXZ0KSB7XG4gICAgICBpZiAoZXZ0LmtleSA9PT0gdGhpcy5vcHRpb25zLm11bHRpRHJhZ0tleSkge1xuICAgICAgICB0aGlzLm11bHRpRHJhZ0tleURvd24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgX2NoZWNrS2V5VXA6IGZ1bmN0aW9uIF9jaGVja0tleVVwKGV2dCkge1xuICAgICAgaWYgKGV2dC5rZXkgPT09IHRoaXMub3B0aW9ucy5tdWx0aURyYWdLZXkpIHtcbiAgICAgICAgdGhpcy5tdWx0aURyYWdLZXlEb3duID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gX2V4dGVuZHMoTXVsdGlEcmFnLCB7XG4gICAgLy8gU3RhdGljIG1ldGhvZHMgJiBwcm9wZXJ0aWVzXG4gICAgcGx1Z2luTmFtZTogJ211bHRpRHJhZycsXG4gICAgdXRpbHM6IHtcbiAgICAgIC8qKlxyXG4gICAgICAgKiBTZWxlY3RzIHRoZSBwcm92aWRlZCBtdWx0aS1kcmFnIGl0ZW1cclxuICAgICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgIFRoZSBlbGVtZW50IHRvIGJlIHNlbGVjdGVkXHJcbiAgICAgICAqL1xuICAgICAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QoZWwpIHtcbiAgICAgICAgdmFyIHNvcnRhYmxlID0gZWwucGFyZW50Tm9kZVtleHBhbmRvXTtcbiAgICAgICAgaWYgKCFzb3J0YWJsZSB8fCAhc29ydGFibGUub3B0aW9ucy5tdWx0aURyYWcgfHwgfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZWwpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKG11bHRpRHJhZ1NvcnRhYmxlICYmIG11bHRpRHJhZ1NvcnRhYmxlICE9PSBzb3J0YWJsZSkge1xuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlLm11bHRpRHJhZy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcblxuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gc29ydGFibGU7XG4gICAgICAgIH1cblxuICAgICAgICB0b2dnbGVDbGFzcyhlbCwgc29ydGFibGUub3B0aW9ucy5zZWxlY3RlZENsYXNzLCB0cnVlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMucHVzaChlbCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcclxuICAgICAgICogRGVzZWxlY3RzIHRoZSBwcm92aWRlZCBtdWx0aS1kcmFnIGl0ZW1cclxuICAgICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgIFRoZSBlbGVtZW50IHRvIGJlIGRlc2VsZWN0ZWRcclxuICAgICAgICovXG4gICAgICBkZXNlbGVjdDogZnVuY3Rpb24gZGVzZWxlY3QoZWwpIHtcbiAgICAgICAgdmFyIHNvcnRhYmxlID0gZWwucGFyZW50Tm9kZVtleHBhbmRvXSxcbiAgICAgICAgICAgIGluZGV4ID0gbXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihlbCk7XG4gICAgICAgIGlmICghc29ydGFibGUgfHwgIXNvcnRhYmxlLm9wdGlvbnMubXVsdGlEcmFnIHx8ICF+aW5kZXgpIHJldHVybjtcbiAgICAgICAgdG9nZ2xlQ2xhc3MoZWwsIHNvcnRhYmxlLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBldmVudFByb3BlcnRpZXMoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIG9sZEluZGljaWVzID0gW10sXG4gICAgICAgICAgbmV3SW5kaWNpZXMgPSBbXTtcbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgb2xkSW5kaWNpZXMucHVzaCh7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICBpbmRleDogbXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4XG4gICAgICAgIH0pOyAvLyBtdWx0aURyYWdFbGVtZW50cyB3aWxsIGFscmVhZHkgYmUgc29ydGVkIGlmIGZvbGRpbmdcblxuICAgICAgICB2YXIgbmV3SW5kZXg7XG5cbiAgICAgICAgaWYgKGZvbGRpbmcgJiYgbXVsdGlEcmFnRWxlbWVudCAhPT0gZHJhZ0VsJDEpIHtcbiAgICAgICAgICBuZXdJbmRleCA9IC0xO1xuICAgICAgICB9IGVsc2UgaWYgKGZvbGRpbmcpIHtcbiAgICAgICAgICBuZXdJbmRleCA9IGluZGV4KG11bHRpRHJhZ0VsZW1lbnQsICc6bm90KC4nICsgX3RoaXMzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcyArICcpJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3SW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0luZGljaWVzLnB1c2goe1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgaW5kZXg6IG5ld0luZGV4XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpdGVtczogX3RvQ29uc3VtYWJsZUFycmF5KG11bHRpRHJhZ0VsZW1lbnRzKSxcbiAgICAgICAgY2xvbmVzOiBbXS5jb25jYXQobXVsdGlEcmFnQ2xvbmVzKSxcbiAgICAgICAgb2xkSW5kaWNpZXM6IG9sZEluZGljaWVzLFxuICAgICAgICBuZXdJbmRpY2llczogbmV3SW5kaWNpZXNcbiAgICAgIH07XG4gICAgfSxcbiAgICBvcHRpb25MaXN0ZW5lcnM6IHtcbiAgICAgIG11bHRpRHJhZ0tleTogZnVuY3Rpb24gbXVsdGlEcmFnS2V5KGtleSkge1xuICAgICAgICBrZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoa2V5ID09PSAnY3RybCcpIHtcbiAgICAgICAgICBrZXkgPSAnQ29udHJvbCc7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRNdWx0aURyYWdFbGVtZW50cyhjbG9uZXNJbnNlcnRlZCwgcm9vdEVsKSB7XG4gIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQsIGkpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcm9vdEVsLmNoaWxkcmVuW211bHRpRHJhZ0VsZW1lbnQuc29ydGFibGVJbmRleCArIChjbG9uZXNJbnNlcnRlZCA/IE51bWJlcihpKSA6IDApXTtcblxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUobXVsdGlEcmFnRWxlbWVudCwgdGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgIH1cbiAgfSk7XG59XG4vKipcclxuICogSW5zZXJ0IG11bHRpLWRyYWcgY2xvbmVzXHJcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gZWxlbWVudHNJbnNlcnRlZCAgV2hldGhlciB0aGUgbXVsdGktZHJhZyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWRcclxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IHJvb3RFbFxyXG4gKi9cblxuXG5mdW5jdGlvbiBpbnNlcnRNdWx0aURyYWdDbG9uZXMoZWxlbWVudHNJbnNlcnRlZCwgcm9vdEVsKSB7XG4gIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSwgaSkge1xuICAgIHZhciB0YXJnZXQgPSByb290RWwuY2hpbGRyZW5bY2xvbmUuc29ydGFibGVJbmRleCArIChlbGVtZW50c0luc2VydGVkID8gTnVtYmVyKGkpIDogMCldO1xuXG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShjbG9uZSwgdGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpIHtcbiAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgIG11bHRpRHJhZ0VsZW1lbnQucGFyZW50Tm9kZSAmJiBtdWx0aURyYWdFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gIH0pO1xufVxuXG5Tb3J0YWJsZS5tb3VudChuZXcgQXV0b1Njcm9sbFBsdWdpbigpKTtcblNvcnRhYmxlLm1vdW50KFJlbW92ZSwgUmV2ZXJ0KTtcblxuZXhwb3J0IGRlZmF1bHQgU29ydGFibGU7XG5leHBvcnQgeyBNdWx0aURyYWdQbHVnaW4gYXMgTXVsdGlEcmFnLCBTb3J0YWJsZSwgU3dhcFBsdWdpbiBhcyBTd2FwIH07XG4iLCJpbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcclxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xyXG5cclxuLyoqXHJcbiAqIERlZmluZXMgYW4gaW5kaXZpZHVhbCBhY3Rpb24uIEFjdGlvbiBpdGVtcyBjYW4gYmUgZGlzcGxheWVkIGluIGNlcnRhaW4gc3VydmV5IGVsZW1lbnRzIC0gaW4gVG9vbGJhciAob3IgYWN0aW9uIGJhciksIGluIHRpdGxlcyAob2YgcGFnZXMsIHBhbmVscywgcXVlc3Rpb25zKSwgaW4gbWF0cml4IHJvd3MgKGFzICdleHBhbmQgZGV0YWlscycgb3IgJ3JlbW92ZSByb3cnIGJ1dHRvbnMpLCBhbmQgZXRjLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uIHtcclxuICAvKipcclxuICAgKiBVbmlxdWUgc3RyaW5nIGlkXHJcbiAgICovXHJcbiAgaWQ6IHN0cmluZztcclxuICAvKipcclxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBtYWtlIHRoZSB0b29sYmFyIGl0ZW0gaW52aXNpYmxlLlxyXG4gICAqL1xyXG4gIHZpc2libGU/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFRvb2xiYXIgaXRlbSB0aXRsZVxyXG4gICAqL1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFRvb2xiYXIgaXRlbSB0b29sdGlwXHJcbiAgICovXHJcbiAgdG9vbHRpcD86IHN0cmluZztcclxuICAvKipcclxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBkaXNhYmxlIHRoZSB0b29sYmFyIGl0ZW0uXHJcbiAgICovXHJcbiAgZW5hYmxlZD86IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgdG8gaGlkZSB0aGUgdG9vbGJhciBpdGVtIHRpdGxlLlxyXG4gICAqL1xyXG4gIHNob3dUaXRsZT86IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogQSBjYWxsYmFjayB0aGF0IGNhbGxzIG9uIHRvb2xiYXIgaXRlbSBjbGljay5cclxuICAgKi9cclxuICBhY3Rpb24/OiAoY29udGV4dD86IGFueSkgPT4gdm9pZDtcclxuICAvKipcclxuICAgKiBUb29sYmFyIGl0ZW0gY3NzIGNsYXNzXHJcbiAgICovXHJcbiAgY3NzPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFRvb2xiYXIgaW5uZXIgZWxlbWVudCBjc3MgY2xhc3NcclxuICAgKi9cclxuICBpbm5lckNzcz86IHN0cmluZztcclxuICAvKipcclxuICAgKiBUb29sYmFyIGl0ZW0gZGF0YSBvYmplY3QuIFVzZWQgYXMgZGF0YSBmb3IgY3VzdG9tIHRlbXBsYXRlIG9yIGNvbXBvbmVudCByZW5kZXJpbmdcclxuICAgKi9cclxuICBkYXRhPzogYW55O1xyXG4gIHBvcHVwTW9kZWw/OiBhbnk7IC8vVE9ETzogdGVtcCwgdXNlIGRhdGEgaW5zdGVhZFxyXG4gIG5lZWRTZXBhcmF0b3I/OiBib29sZWFuOyAvL1RPRE86IHRlbXBcclxuICAvKipcclxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIGFjdGl2YXRlIHRoZSB0b29sYmFyIGl0ZW0gKHBhZ2UpXHJcbiAgICovXHJcbiAgYWN0aXZlPzogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiBUb29sYmFyIGl0ZW0gdGVtcGxhdGUgbmFtZVxyXG4gICAqL1xyXG4gIHRlbXBsYXRlPzogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIFRvb2xiYXIgaXRlbSBjb21wb25lbnQgbmFtZVxyXG4gICAqL1xyXG4gIGNvbXBvbmVudD86IHN0cmluZztcclxuICAvKipcclxuICAgKiBUb29sYmFyIGl0ZW0gaWNvbiBuYW1lXHJcbiAgICovXHJcbiAgaWNvbk5hbWU/OiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogVG9vbGJhciBpdGVtIGNoaWxkIGl0ZW1zLiBDYW4gYmUgdXNlZCBhcyBjb250aWFuZXIgZm9yIG9wdGlvbnNcclxuICAgKi9cclxuICBpdGVtcz86IGFueTtcclxuICAvKipcclxuICAgKiBHZXRzIG9yIHNldHMgYW4gYWN0aW9uJ3MgbG9jYXRpb24gaW4gYSBtYXRyaXggcXVlc3Rpb24ncyByb3cuXHJcbiAgICpcclxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcclxuICAgKlxyXG4gICAqIC0gYHN0YXJ0YCAtIEFuIGFjdGlvbiBpcyBsb2NhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSByb3cuXHJcbiAgICogLSBgZW5kYCAtIEFuIGFjdGlvbiBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgYSByb3cuXHJcbiAgICovXHJcbiAgbG9jYXRpb24/OiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gbWFrZSB0aGUgdGFiSW5kZXggLTEgdG8gZGlzYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uIHRvIHRoaXMgaXRlbVxyXG4gICAqL1xyXG4gIGRpc2FibGVUYWJTdG9wPzogYm9vbGVhbjtcclxuICB2aXNpYmxlSW5kZXg/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBY3Rpb24gZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSUFjdGlvbiB7XHJcbiAgY29uc3RydWN0b3IoaXRlbTogSUFjdGlvbikge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIE9iamVjdC5hc3NpZ24odGhpcywgaXRlbSk7XHJcbiAgfVxyXG4gIGxvY2F0aW9uPzogc3RyaW5nO1xyXG4gIEBwcm9wZXJ0eSgpIGlkOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KCkgaWNvbk5hbWU6IHN0cmluZztcclxuICBAcHJvcGVydHkoKSB2aXNpYmxlOiBib29sZWFuO1xyXG4gIEBwcm9wZXJ0eSgpIHRpdGxlOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KCkgdG9vbHRpcDogc3RyaW5nO1xyXG4gIEBwcm9wZXJ0eSgpIGVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgQHByb3BlcnR5KCkgc2hvd1RpdGxlOiBib29sZWFuO1xyXG4gIEBwcm9wZXJ0eSgpIGFjdGlvbjogKGNvbnRleHQ/OiBhbnkpID0+IHZvaWQ7XHJcbiAgQHByb3BlcnR5KCkgY3NzOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KCkgaW5uZXJDc3M6IHN0cmluZztcclxuICBAcHJvcGVydHkoKSBkYXRhOiBhbnk7XHJcbiAgQHByb3BlcnR5KCkgcG9wdXBNb2RlbDogYW55O1xyXG4gIEBwcm9wZXJ0eSgpIG5lZWRTZXBhcmF0b3I6IGJvb2xlYW47XHJcbiAgQHByb3BlcnR5KCkgYWN0aXZlOiBib29sZWFuO1xyXG4gIEBwcm9wZXJ0eSgpIHRlbXBsYXRlOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KCkgY29tcG9uZW50OiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KCkgaXRlbXM6IGFueTtcclxuICBAcHJvcGVydHkoKSB2aXNpYmxlSW5kZXg6IG51bWJlcjtcclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IFwibGFyZ2VcIiB9KSBtb2RlOiBcImxhcmdlXCIgfCBcInNtYWxsXCIgfCBcInBvcHVwXCI7XHJcbiAgQHByb3BlcnR5KCkgZGlzYWJsZVRhYlN0b3A6IGJvb2xlYW47XHJcblxyXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmFibGVkICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuZW5hYmxlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAoKHRoaXMubW9kZSAhPSBcInNtYWxsXCIgJiZcclxuICAgICAgICAodGhpcy5zaG93VGl0bGUgfHwgdGhpcy5zaG93VGl0bGUgPT09IHVuZGVmaW5lZCkpIHx8XHJcbiAgICAgICAgIXRoaXMuaWNvbk5hbWUpICYmXHJcbiAgICAgICEhdGhpcy50aXRsZVxyXG4gICAgKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBpc1Zpc2libGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlICE9PSBcInBvcHVwXCI7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgY2FuU2hyaW5rKCkge1xyXG4gICAgcmV0dXJuICEhdGhpcy5pY29uTmFtZTtcclxuICB9XHJcblxyXG4gIG1pbkRpbWVuc2lvbjogbnVtYmVyO1xyXG4gIG1heERpbWVuc2lvbjogbnVtYmVyO1xyXG59XHJcbiIsImltcG9ydCB7IExpc3RNb2RlbCB9IGZyb20gXCIuLi9saXN0XCI7XHJcbmltcG9ydCB7IFBvcHVwTW9kZWwgfSBmcm9tIFwiLi4vcG9wdXBcIjtcclxuaW1wb3J0IHsgQWN0aW9uLCBJQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9uXCI7XHJcbmltcG9ydCB7IEFjdGlvbkNvbnRhaW5lciB9IGZyb20gXCIuL2NvbnRhaW5lclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFkYXB0aXZlQWN0aW9uQ29udGFpbmVyPFQgZXh0ZW5kcyBBY3Rpb24gPSBBY3Rpb24sIFYgZXh0ZW5kcyBJQWN0aW9uID0gSUFjdGlvbj4gZXh0ZW5kcyBBY3Rpb25Db250YWluZXI8VD4ge1xyXG4gIHByb3RlY3RlZCBkb3RzSXRlbTogQWN0aW9uOyAvLyAoLi4uKSBidXR0b25cclxuICBwdWJsaWMgZG90c0l0ZW1Qb3B1cE1vZGVsOiBQb3B1cE1vZGVsO1xyXG5cclxuICBwdWJsaWMgZ2V0IHZpc2libGVJdGVtcygpOiBBcnJheTxBY3Rpb24+IHtcclxuICAgIHJldHVybiB0aGlzLmFjdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm1vZGUgIT09IFwicG9wdXBcIik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0SXRlbXMoaXRlbXM6IEFycmF5PFY+LCBzb3J0QnlWaXNpYmxlSW5kZXggPSB0cnVlKSB7XHJcbiAgICBjb25zdCBhY3Rpb25zOiBBcnJheTxUPiA9IDxhbnk+aXRlbXMubWFwKChpdGVtKSA9PiAoaXRlbSBpbnN0YW5jZW9mIEFjdGlvbiA/IGl0ZW0gOiBuZXcgQWN0aW9uKGl0ZW0pKSk7XHJcbiAgICBpZiAoc29ydEJ5VmlzaWJsZUluZGV4KSB7XHJcbiAgICAgIHRoaXMuYWN0aW9ucyA9IHRoaXMuc29ydEl0ZW1zKGFjdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3Rpb25zID0gYWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgfVxyXG4gIHByaXZhdGUgc29ydEl0ZW1zKGl0ZW1zOiBBcnJheTxUPikge1xyXG4gICAgcmV0dXJuIFtdXHJcbiAgICAgIC5jb25jYXQoaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnZpc2libGVJbmRleCA+PSAwIHx8IGl0ZW0udmlzaWJsZUluZGV4ID09PSB1bmRlZmluZWQpKVxyXG4gICAgICAuc29ydCgoZmlyc3RJdGVtLCBzZWNvbmRJdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0SXRlbS52aXNpYmxlSW5kZXggLSBzZWNvbmRJdGVtLnZpc2libGVJbmRleDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmRvdHNJdGVtUG9wdXBNb2RlbCA9IG5ldyBQb3B1cE1vZGVsKFwic3YtbGlzdFwiLCB7XHJcbiAgICAgIG1vZGVsOiB0aGlzLmludmlzaWJsZUl0ZW1zTGlzdE1vZGVsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZG90c0l0ZW0gPSBuZXcgQWN0aW9uKHtcclxuICAgICAgaWQ6IFwiZG90c0l0ZW0taWRcIixcclxuICAgICAgY29tcG9uZW50OiBcInN2LWFjdGlvbi1iYXItaXRlbS1kcm9wZG93blwiLFxyXG4gICAgICBjc3M6IFwic3YtZG90c1wiLFxyXG4gICAgICBpbm5lckNzczogXCJzdi1kb3RzX19pdGVtXCIsXHJcbiAgICAgIGljb25OYW1lOiBcImljb24tZG90c1wiLFxyXG4gICAgICAvLyBzaG93VGl0bGU6IHRydWUsXHJcbiAgICAgIC8vIHRpdGxlOiBcIi4uLlwiLFxyXG4gICAgICBhY3Rpb246IChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmRvdHNJdGVtUG9wdXBNb2RlbC50b2dnbGVWaXNpYmlsaXR5KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHBvcHVwTW9kZWw6IHRoaXMuZG90c0l0ZW1Qb3B1cE1vZGVsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGFzSXRlbXMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHRoaXMuYWN0aW9ucyB8fCBbXSkubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbnZpc2libGVJdGVtU2VsZWN0ZWQoaXRlbTogVCk6IHZvaWQge1xyXG4gICAgaWYgKCEhaXRlbSAmJiB0eXBlb2YgaXRlbS5hY3Rpb24gPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBpdGVtLmFjdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGludmlzaWJsZUl0ZW1zTGlzdE1vZGVsOiBMaXN0TW9kZWwgPSBuZXcgTGlzdE1vZGVsKFxyXG4gICAgW10sXHJcbiAgICAoaXRlbTogVCkgPT4ge1xyXG4gICAgICB0aGlzLmludmlzaWJsZUl0ZW1TZWxlY3RlZChpdGVtKTtcclxuICAgICAgdGhpcy5kb3RzSXRlbVBvcHVwTW9kZWwudG9nZ2xlVmlzaWJpbGl0eSgpO1xyXG4gICAgfSxcclxuICAgIGZhbHNlXHJcbiAgKTtcclxuXHJcbiAgcHVibGljIHNob3dGaXJzdE4odmlzaWJsZUl0ZW1zQ291bnQ6IG51bWJlcikge1xyXG4gICAgbGV0IGxlZnRJdGVtc1RvU2hvdyA9IHZpc2libGVJdGVtc0NvdW50O1xyXG4gICAgY29uc3QgaW52aXNpYmxlSXRlbXM6IEFjdGlvbltdID0gW107XHJcbiAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbSA9PT0gdGhpcy5kb3RzSXRlbSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobGVmdEl0ZW1zVG9TaG93IDw9IDApIHtcclxuICAgICAgICBpdGVtLm1vZGUgPSBcInBvcHVwXCI7XHJcbiAgICAgICAgaW52aXNpYmxlSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgfVxyXG4gICAgICBsZWZ0SXRlbXNUb1Nob3ctLTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5pbnZpc2libGVJdGVtc0xpc3RNb2RlbC5pdGVtcyA9IGludmlzaWJsZUl0ZW1zO1xyXG4gICAgdGhpcy5hZGREb3RzQnV0dG9uKHZpc2libGVJdGVtc0NvdW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVEb3RzQnV0dG9uKCkge1xyXG4gICAgdmFyIGluZGV4ID0gdGhpcy5hY3Rpb25zLmluZGV4T2YoPGFueT50aGlzLmRvdHNJdGVtKTtcclxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgdGhpcy5hY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZERvdHNCdXR0b24obmV3SW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKG5ld0luZGV4IDwgdGhpcy5hY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmFjdGlvbnMuc3BsaWNlKG5ld0luZGV4LCAwLCA8YW55PnRoaXMuZG90c0l0ZW0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBwcm9wZXJ0eUFycmF5IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcclxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XHJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuL2FjdGlvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFjdGlvbkNvbnRhaW5lcjxUIGV4dGVuZHMgQWN0aW9uPiBleHRlbmRzIEJhc2Uge1xyXG4gICAgQHByb3BlcnR5QXJyYXkoKSBhY3Rpb25zOiBBcnJheTxUPjtcclxuXHJcbiAgICBwdWJsaWMgZ2V0IGhhc0l0ZW1zKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5hY3Rpb25zIHx8IFtdKS5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24sXG4gIEpzb25PYmplY3QsXG4gIEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgU2VyaWFsaXplcixcbn0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBJRmluZEVsZW1lbnQsIElQcm9ncmVzc0luZm8sIElTdXJ2ZXkgfSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRpbmdzIHtcbiAgcHJpdmF0ZSBwcm9wZXJ0aWVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+ID0gbnVsbDtcbiAgcHJpdmF0ZSB2YWx1ZXM6IGFueSA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb2JqOiBCYXNlKSB7fVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImJpbmRpbmdzXCI7XG4gIH1cbiAgcHVibGljIGdldE5hbWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICB0aGlzLmZpbGxQcm9wZXJ0aWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXNbaV0uaXNWaXNpYmxlKFwiXCIsIHRoaXMub2JqKSkge1xuICAgICAgICByZXMucHVzaCh0aGlzLnByb3BlcnRpZXNbaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldFByb3BlcnRpZXMoKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHJlczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiA9IFtdO1xuICAgIHRoaXMuZmlsbFByb3BlcnRpZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2godGhpcy5wcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc2V0QmluZGluZyhwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWVOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMudmFsdWVzKSB0aGlzLnZhbHVlcyA9IHt9O1xuICAgIGlmICghIXZhbHVlTmFtZSkge1xuICAgICAgdGhpcy52YWx1ZXNbcHJvcGVydHlOYW1lXSA9IHZhbHVlTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMudmFsdWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy52YWx1ZXMpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRoaXMudmFsdWVzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyQmluZGluZyhwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QmluZGluZyhwcm9wZXJ0eU5hbWUsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy52YWx1ZXM7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlTmFtZUJ5UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMudmFsdWVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9wZXJ0aWVzQnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMudmFsdWVzKSByZXR1cm4gW107XG4gICAgdmFyIHJlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhbHVlcykge1xuICAgICAgaWYgKHRoaXMudmFsdWVzW2tleV0gPT0gdmFsdWVOYW1lKSB7XG4gICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldEpzb24oKTogYW55IHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybiBudWxsO1xuICAgIHZhciByZXM6IGFueSA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhbHVlcykge1xuICAgICAgcmVzW2tleV0gPSB0aGlzLnZhbHVlc1trZXldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBzZXRKc29uKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlcyA9IG51bGw7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlc1trZXldID0gdmFsdWVba2V5XTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaWxsUHJvcGVydGllcygpIHtcbiAgICBpZiAodGhpcy5wcm9wZXJ0aWVzICE9PSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gW107XG4gICAgdmFyIG9ialByb3BlcnRpZXMgPSBTZXJpYWxpemVyLmdldFByb3BlcnRpZXNCeU9iaih0aGlzLm9iaik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAob2JqUHJvcGVydGllc1tpXS5pc0JpbmRhYmxlKSB7XG4gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXNoKG9ialByb3BlcnRpZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgU3VydmV5SlMgb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2Uge1xuICBwdWJsaWMgc3RhdGljIGdldCBjb21tZW50UHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNldHRpbmdzLmNvbW1lbnRQcmVmaXg7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgY29tbWVudFByZWZpeCh2YWw6IHN0cmluZykge1xuICAgIHNldHRpbmdzLmNvbW1lbnRQcmVmaXggPSB2YWw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVJdGVtVmFsdWU6IChpdGVtOiBhbnksIHR5cGU/OiBzdHJpbmcpID0+IGFueTtcbiAgcHVibGljIHN0YXRpYyBpdGVtVmFsdWVMb2NTdHJDaGFuZ2VkOiAoYXJyOiBBcnJheTxhbnk+KSA9PiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgdW5kZWZpbmVkLCBudWxsLCBlbXB0eSBzdHJpbmcgb3IgZW1wdHkgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKiBAcGFyYW0gdHJpbVN0cmluZyBhIGJvb2xlYW4gcGFyYW1ldGVyLCBkZWZhdWx0IHZhbHVlIHRydWUuIElmIHRydWUgdGhlbiBpdCB0cmltcyB0aGUgc3RyaW5nIGFuZCBmdW5jdGlvbnMgcmV0dXJucyB0cnVlIGZvciBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIHdoaXRlIHNwYWNlcyBvbmx5LlxuICAgKi9cbiAgcHVibGljIGlzVmFsdWVFbXB0eSh2YWx1ZTogYW55LCB0cmltU3RyaW5nOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0cmltU3RyaW5nKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMudHJpbVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgdHJpbVZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICghIXZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKVxuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIElzUHJvcGVydHlFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiICYmIHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcGVydHlIYXNoOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBsb2NhbGl6YWJsZVN0cmluZ3M6IHsgW2luZGV4OiBzdHJpbmddOiBMb2NhbGl6YWJsZVN0cmluZyB9O1xuICBwcml2YXRlIGFycmF5c0luZm86IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfTtcbiAgcHJpdmF0ZSBldmVudExpc3Q6IEFycmF5PEV2ZW50QmFzZTxhbnk+PiA9IFtdO1xuICBwcml2YXRlIGJpbmRpbmdzVmFsdWU6IEJpbmRpbmdzO1xuICBwcml2YXRlIGlzRGlzcG9zZWRWYWx1ZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBvblByb3BDaGFuZ2VGdW5jdGlvbnM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZnVuYzogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuICAgIGtleTogc3RyaW5nO1xuICB9PjtcbiAgcHJvdGVjdGVkIGlzTG9hZGluZ0Zyb21Kc29uVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGxvYWRpbmdPd25lcjogQmFzZSA9IG51bGw7XG4gIC8qKlxuICAgKiBFdmVudCB0aGF0IHJhaXNlIG9uIHByb3BlcnR5IGNoYW5nZSBvZiB0aGUgc2VuZGVyIG9iamVjdFxuICAgKiBzZW5kZXIgLSB0aGUgb2JqZWN0IHRoYXQgb3ducyB0aGUgcHJvcGVydHlcbiAgICogb3B0aW9ucy5uYW1lIC0gdGhlIHByb3BlcnR5IG5hbWUgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkXG4gICAqIG9wdGlvbnMub2xkVmFsdWUgLSBvbGQgdmFsdWUuIFBsZWFzZSBub3RlLCBpdCBlcXVhbHMgdG8gb3B0aW9ucy5uZXdWYWx1ZSBpZiBwcm9wZXJ0eSBpcyBhbiBhcnJheVxuICAgKiBvcHRpb25zLm5ld1ZhbHVlIC0gbmV3IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIG9uUHJvcGVydHlDaGFuZ2VkOiBFdmVudEJhc2U8QmFzZT4gPSB0aGlzLmFkZEV2ZW50PEJhc2U+KCk7XG4gIC8qKlxuICAgKiBFdmVudCB0aGF0IHJhaXNlZCBvbiBjaGFuZ2luZyBwcm9wZXJ0eSBvZiB0aGUgSXRlbVZhbHVlIG9iamVjdC5cbiAgICogc2VuZGVyIC0gdGhlIG9iamVjdCB0aGF0IG93bnMgdGhlIHByb3BlcnR5XG4gICAqIG9wdGlvbnMucHJvcGVydHlOYW1lIC0gdGhlIHByb3BlcnR5IG5hbWUgdG8gd2hpY2ggSXRlbVZhbHVlIGFycmF5IGlzIGJlbG9uZy4gSXQgY2FuIGJlIFwiY2hvaWNlc1wiIGZvciBkcm9wZG93biBxdWVzdGlvblxuICAgKiBvcHRpb25zLm9iaiAtIHRoZSBpbnN0YW5jZSBvZiBJdGVtVmFsdWUgb2JqZWN0IHdoaWNoIHByb3BlcnR5IGhhcyBiZWVuIGNoYW5nZWRcbiAgICogb3B0aW9ucy5uYW1lIC0gdGhlIHByb3BlcnR5IG9mIEl0ZW1PYmplY3QgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkXG4gICAqIG9wdGlvbnMub2xkVmFsdWUgLSBvbGQgdmFsdWVcbiAgICogb3B0aW9ucy5uZXdWYWx1ZSAtIG5ldyB2YWx1ZVxuICAgKi9cbiAgcHVibGljIG9uSXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IHRoaXMuYWRkRXZlbnQ8QmFzZT4oKTtcblxuICBnZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXI6IChwcm9wZXJ0aWVzSGFzaDogYW55LCBuYW1lOiBzdHJpbmcpID0+IGFueTtcblxuICBzZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXI6IChcbiAgICBwcm9wZXJ0aWVzSGFzaDogYW55LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWw6IGFueVxuICApID0+IHZvaWQ7XG4gIGNyZWF0ZUFycmF5Q29yZUhhbmRsZXI6IChwcm9wZXJ0aWVzSGFzaDogYW55LCBuYW1lOiBzdHJpbmcpID0+IEFycmF5PGFueT47XG4gIHN1cnZleUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBwcml2YXRlIGlzQ3JlYXRpbmcgPSB0cnVlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmJpbmRpbmdzVmFsdWUgPSBuZXcgQmluZGluZ3ModGhpcyk7XG4gICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllcyh0aGlzKTtcbiAgICB0aGlzLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5pc0NyZWF0aW5nID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmV2ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5ldmVudExpc3RbaV0uY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5pc0Rpc3Bvc2VkVmFsdWUgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNEaXNwb3NlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0Rpc3Bvc2VkVmFsdWUgPT09IHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGFkZEV2ZW50PFQ+KCk6IEV2ZW50QmFzZTxUPiB7XG4gICAgdmFyIHJlcyA9IG5ldyBFdmVudEJhc2U8VD4oKTtcbiAgICB0aGlzLmV2ZW50TGlzdC5wdXNoKHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7fVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGFzIGEgc3RyaW5nIGFzIGl0IHJlcHJlc2VudHMgaW4gdGhlIGpzb24uIEl0IHNob3VsZCBiZSBpbiBsb3djYXNlLlxuICAgKi9cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJiYXNlXCI7XG4gIH1cbiAgcHVibGljIGdldFN1cnZleShpc0xpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IElTdXJ2ZXkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyBpbmx1ZGVkIGludG8gc3VydmV5LCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5TdXJ2ZXkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRTdXJ2ZXkodHJ1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBiaW5kaW5ncygpOiBCaW5kaW5ncyB7XG4gICAgcmV0dXJuIHRoaXMuYmluZGluZ3NWYWx1ZTtcbiAgfVxuICBjaGVja0JpbmRpbmdzKHZhbHVlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7fVxuICBwcm90ZWN0ZWQgdXBkYXRlQmluZGluZ3MocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgdmFsdWVOYW1lID0gdGhpcy5iaW5kaW5ncy5nZXRWYWx1ZU5hbWVCeVByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpO1xuICAgIGlmICghIXZhbHVlTmFtZSkge1xuICAgICAgdGhpcy51cGRhdGVCaW5kaW5nVmFsdWUodmFsdWVOYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVCaW5kaW5nVmFsdWUodmFsdWVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHt9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHRlbXBsYXRlIG5hbWUgd2l0aG91dCBwcmVmaXguIFR5cGljYWxseSBpdCBlcXVhbHMgdG8gZ2V0VHlwZSgpLlxuICAgKiBAc2VlIGdldFR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFR5cGUoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgbG9hZGluZyBmcm9tIEpzb24gYXQgdGhlIGN1cnJlbnQgbW9tZW50LlxuICAgKi9cbiAgcHVibGljIGdldCBpc0xvYWRpbmdGcm9tSnNvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJc0xvYWRpbmdGcm9tSnNvbigpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0xvYWRpbmdGcm9tSnNvbigpOiBib29sZWFuIHtcbiAgICBpZiAoISF0aGlzLmxvYWRpbmdPd25lciAmJiB0aGlzLmxvYWRpbmdPd25lci5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZTtcbiAgfVxuXG4gIHN0YXJ0TG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZSA9IHRydWU7XG4gIH1cbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZSA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZWQgdGhlIGN1cnJlbnQgb2JqZWN0IGludG8gSlNPTlxuICAgKiBAc2VlIGZyb21KU09OXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBMb2FkIG9iamVjdCBwcm9wZXJ0aWVzIGFuZCBlbGVtZW50cy4gSXQgZG9lc24ndCByZXNldCBwcm9wZXJ0aWVzIHRoYXQgd2FzIGNoYW5nZWQgYmVmb3JlIGFuZCB0aGV5IGFyZSBub3QgZGVmaW5lZCBpbiB0aGUganNvbiBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBqc29uIHRoZSBvYmplY3QgSlNPTiBkZWZpbml0aW9uXG4gICAqIEBzZWUgdG9KU09OXG4gICAqL1xuICBwdWJsaWMgZnJvbUpTT04oanNvbjogYW55KSB7XG4gICAgcmV0dXJuIG5ldyBKc29uT2JqZWN0KCkudG9PYmplY3QoanNvbiwgdGhpcyk7XG4gIH1cbiAgLyoqXG4gICAqIE1ha2UgYSBjbG9uZSBvZiB0aGUgZXhpc3Rpbmcgb2JqZWN0LiBDcmVhdGUgYSBuZXcgb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUgYW5kIGxvYWQgYWxsIHByb3BlcnRpZXMgaW50byBpdC5cbiAgICovXG4gIHB1YmxpYyBjbG9uZSgpOiBCYXNlIHtcbiAgICB2YXIgY2xvbmVkT2JqID0gPEJhc2U+U2VyaWFsaXplci5jcmVhdGVDbGFzcyh0aGlzLmdldFR5cGUoKSk7XG4gICAgY2xvbmVkT2JqLmZyb21KU09OKHRoaXMudG9KU09OKCkpO1xuICAgIHJldHVybiBjbG9uZWRPYmo7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNlcmlhbGl6YWJsZSBwcm9wZXJ0eSB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBpbnN0YW5jZSBieSBwcm9wZXJ0eSBuYW1lLiBJdCByZXR1cm5zIG51bGwgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBleGlzdHMuXG4gICAqIEBwYXJhbSBwcm9wTmFtZSBwcm9wZXJ0eSBuYW1lXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgZ2V0UHJvcGVydHlCeU5hbWUocHJvcE5hbWU6IHN0cmluZyk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KHRoaXMuZ2V0VHlwZSgpLCBwcm9wTmFtZSk7XG4gIH1cbiAgcHVibGljIGlzUHJvcGVydHlWaXNpYmxlKHByb3BOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5nZXRQcm9wZXJ0eUJ5TmFtZShwcm9wTmFtZSk7XG4gICAgcmV0dXJuICEhcHJvcCA/IHByb3AuaXNWaXNpYmxlKFwiXCIsIHRoaXMpIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVQcm9ncmVzc0luZm8oKTogSVByb2dyZXNzSW5mbyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICBhbnN3ZXJlZFF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICByZXF1aXJlZFF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICByZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudDogMCxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXRQcm9ncmVzc0luZm8oKTogSVByb2dyZXNzSW5mbyB7XG4gICAgcmV0dXJuIEJhc2UuY3JlYXRlUHJvZ3Jlc3NJbmZvKCk7XG4gIH1cbiAgcHVibGljIGxvY2FsZUNoYW5nZWQoKSB7fVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgaWYgKCEhdGhpcy5hcnJheXNJbmZvKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5hcnJheXNJbmZvKSB7XG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5hcnJheXNJbmZvW2tleV07XG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0uaXNJdGVtVmFsdWVzKSB7XG4gICAgICAgICAgdmFyIGFyciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShrZXkpO1xuICAgICAgICAgIGlmIChhcnIgJiYgISFCYXNlLml0ZW1WYWx1ZUxvY1N0ckNoYW5nZWQpXG4gICAgICAgICAgICBCYXNlLml0ZW1WYWx1ZUxvY1N0ckNoYW5nZWQoYXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISF0aGlzLmxvY2FsaXphYmxlU3RyaW5ncykge1xuICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMubG9jYWxpemFibGVTdHJpbmdzKSB7XG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhrZXkpO1xuICAgICAgICBpZiAoaXRlbSkgaXRlbS5zdHJDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBieSBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIHByb3BlcnR5IG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRQcm9wZXJ0eVZhbHVlKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKTogYW55IHtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlQ29yZSh0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSk7XG4gICAgaWYgKHRoaXMuSXNQcm9wZXJ0eUVtcHR5KHJlcykpIHtcbiAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgIHZhciBwcm9wID0gU2VyaWFsaXplci5maW5kUHJvcGVydHkodGhpcy5nZXRUeXBlKCksIG5hbWUpO1xuICAgICAgaWYgKCEhcHJvcCAmJiAoIXByb3AuaXNDdXN0b20gfHwgIXRoaXMuaXNDcmVhdGluZykpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLklzUHJvcGVydHlFbXB0eShwcm9wLmRlZmF1bHRWYWx1ZSkgJiZcbiAgICAgICAgICAhQXJyYXkuaXNBcnJheShwcm9wLmRlZmF1bHRWYWx1ZSlcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBwcm9wLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgaWYgKHByb3AudHlwZSA9PSBcImJvb2xlYW5cIiB8fCBwcm9wLnR5cGUgPT0gXCJzd2l0Y2hcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocHJvcC5pc0N1c3RvbSAmJiAhIXByb3Aub25HZXRWYWx1ZSkgcmV0dXJuIHByb3Aub25HZXRWYWx1ZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvcGVydHlWYWx1ZUNvcmUocHJvcGVydGllc0hhc2g6IGFueSwgbmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZ2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKHByb3BlcnRpZXNIYXNoLCBuYW1lKTtcbiAgICBlbHNlIHJldHVybiBwcm9wZXJ0aWVzSGFzaFtuYW1lXTtcbiAgfVxuICBwdWJsaWMgZ2VWYWx1ZUZyb21IYXNoKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlIYXNoW1widmFsdWVcIl07XG4gIH1cbiAgcHJvdGVjdGVkIHNldFByb3BlcnR5VmFsdWVDb3JlKHByb3BlcnRpZXNIYXNoOiBhbnksIG5hbWU6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIgJiYgIXRoaXMuaXNEaXNwb3NlZFZhbHVlKVxuICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIocHJvcGVydGllc0hhc2gsIG5hbWUsIHZhbCk7XG4gICAgZWxzZSBwcm9wZXJ0aWVzSGFzaFtuYW1lXSA9IHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGlzRWRpdGluZ1N1cnZleUVsZW1lbnQoKTogYm9vbGVhbiB7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMuZ2V0U3VydmV5KCk7XG4gICAgcmV0dXJuICEhc3VydmV5ICYmIHN1cnZleS5pc0VkaXRpbmdTdXJ2ZXlFbGVtZW50O1xuICB9XG4gIHB1YmxpYyBpdGVyYXRlUHJvcGVydGllc0hhc2goZnVuYzogKGhhc2g6IGFueSwga2V5OiBhbnkpID0+IHZvaWQpIHtcbiAgICB2YXIga2V5czogYW55W10gPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5wcm9wZXJ0eUhhc2gpIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5ID09PSBcInZhbHVlXCIgJiZcbiAgICAgICAgdGhpcy5pc0VkaXRpbmdTdXJ2ZXlFbGVtZW50ICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoKDxhbnk+dGhpcykudmFsdWUpXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IGZ1bmModGhpcy5wcm9wZXJ0eUhhc2gsIGtleSkpO1xuICB9XG4gIC8qKlxuICAgKiBzZXQgcHJvcGVydHkgdmFsdWVcbiAgICogQHBhcmFtIG5hbWUgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0gdmFsIG5ldyBwcm9wZXJ0eSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHNldFByb3BlcnR5VmFsdWUobmFtZTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbiAgICBpZiAob2xkVmFsdWUgJiYgQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkpIHtcbiAgICAgIGlmICh0aGlzLmlzVHdvVmFsdWVFcXVhbHMob2xkVmFsdWUsIHZhbCkpIHJldHVybjtcbiAgICAgIHZhciBhcnJheUluZm8gPSB0aGlzLmFycmF5c0luZm9bbmFtZV07XG4gICAgICB0aGlzLnNldEFycmF5KFxuICAgICAgICBuYW1lLFxuICAgICAgICBvbGRWYWx1ZSxcbiAgICAgICAgdmFsLFxuICAgICAgICBhcnJheUluZm8gPyBhcnJheUluZm8uaXNJdGVtVmFsdWVzIDogZmFsc2UsXG4gICAgICAgIGFycmF5SW5mbyA/IGFycmF5SW5mby5vblB1c2ggOiBudWxsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWVDb3JlKHRoaXMucHJvcGVydHlIYXNoLCBuYW1lLCB2YWwpO1xuICAgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWRWYWx1ZSAmJiAhdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG9sZFZhbHVlLCB2YWwpKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgb2xkVmFsdWUsIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjbGVhclByb3BlcnR5VmFsdWUobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZSh0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSwgbnVsbCk7XG4gICAgZGVsZXRlIHRoaXMucHJvcGVydHlIYXNoW25hbWVdO1xuICB9XG4gIHB1YmxpYyBvblByb3BlcnR5VmFsdWVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9sZFZhbHVlOiBhbnksXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICBzZW5kZXI6IEJhc2UsXG4gICAgYXJyYXlDaGFuZ2VzOiBBcnJheUNoYW5nZXNcbiAgKSB7fVxuICBwdWJsaWMgaXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkKFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICBuZXdWYWx1ZTogYW55XG4gICkge1xuICAgIHRoaXMub25JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICBvYmo6IGl0ZW0sXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgcHJvcGVydHlOYW1lOiBpdGVtLm93bmVyUHJvcGVydHlOYW1lLFxuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBvblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7fVxuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9sZFZhbHVlOiBhbnksXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICBhcnJheUNoYW5nZXM/OiBBcnJheUNoYW5nZXMsXG4gICAgdGFyZ2V0PzogQmFzZVxuICApIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlQmluZGluZ3MobmFtZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMub25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kb1Byb3BlcnR5VmFsdWVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgICBuYW1lLFxuICAgICAgb2xkVmFsdWUsXG4gICAgICBuZXdWYWx1ZSxcbiAgICAgIGFycmF5Q2hhbmdlcyxcbiAgICAgIHRoaXNcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXS5uYW1lID09IG5hbWUpXG4gICAgICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zW2ldLmZ1bmMobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGlzSW50ZXJuYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgZG9Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgYXJyYXlDaGFuZ2VzPzogQXJyYXlDaGFuZ2VzLFxuICAgIHRhcmdldD86IEJhc2VcbiAgKSB7XG4gICAgaWYgKHRoaXMuaXNJbnRlcm5hbCkgcmV0dXJuO1xuICAgIGlmICghdGFyZ2V0KSB0YXJnZXQgPSB0aGlzO1xuICAgIHZhciBub3RpZmllcjogYW55ID0gdGhpcy5nZXRTdXJ2ZXkoKTtcbiAgICBpZiAoIW5vdGlmaWVyKSBub3RpZmllciA9IHRoaXM7XG4gICAgaWYgKCEhbm90aWZpZXIuZG9Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKSB7XG4gICAgICBub3RpZmllci5vblByb3BlcnR5VmFsdWVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG9sZFZhbHVlLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBhcnJheUNoYW5nZXNcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gYSBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VkLlxuICAgKiBAcGFyYW0gbmFtZSB0aGUgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0gZnVuYyB0aGUgZnVuY3Rpb24gd2l0aCBubyBwYXJhbWV0ZXJzIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gcHJvcGVydHkgY2hhbmdlZC5cbiAgICogQHBhcmFtIGtleSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuIElmIHRoZXJlIGlzIGFscmVhZHkgYSByZWdpc3RlcmVkIGZ1bmN0aW9uIGZvciB0aGlzIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5LCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmdW5jOiBhbnksXG4gICAga2V5OiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIGlmICghdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMpIHtcbiAgICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zID0gW107XG4gICAgfVxuICAgIGlmIChrZXkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXTtcbiAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PSBuYW1lICYmIGl0ZW0ua2V5ID09IGtleSkge1xuICAgICAgICAgIGl0ZW0uZnVuYyA9IGZ1bmM7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLnB1c2goeyBuYW1lOiBuYW1lLCBmdW5jOiBmdW5jLCBrZXk6IGtleSB9KTtcbiAgfVxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGEgcHJvcGVydHkgdmFsdWUgY2hhbmdlZCBmcm9tIHRoZSBuYW1lcyBsaXN0LlxuICAgKiBAcGFyYW0gbmFtZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBuYW1lc1xuICAgKiBAcGFyYW0gZnVuYyB0aGUgZnVuY3Rpb24gd2l0aCBubyBwYXJhbWV0ZXJzIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gcHJvcGVydHkgY2hhbmdlZC5cbiAgICogQHBhcmFtIGtleSBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuIElmIHRoZXJlIGlzIGFscmVhZHkgYSByZWdpc3RlcmVkIGZ1bmN0aW9uIGZvciB0aGlzIHByb3BlcnR5IHdpdGggdGhlIHNhbWUga2V5LCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgZnVuYzogYW55LFxuICAgIGtleTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWVzW2ldLCBmdW5jLCBrZXkpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVW5yZWdpc3RlciBub3RpZmljYXRpb24gb24gcHJvcGVydHkgdmFsdWUgY2hhbmdlZFxuICAgKiBAcGFyYW0gbmFtZSB0aGUgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgd2l0aCB3aGljaCB5b3UgaGF2ZSByZWdpc3RlcmVkIHRoZSBub3RpZmljYXRpb24gZm9yIHRoaXMgcHJvcGVydHkuIEl0IGNhbiBiZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGtleTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBpZiAoIXRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXTtcbiAgICAgIGlmIChpdGVtLm5hbWUgPT0gbmFtZSAmJiBpdGVtLmtleSA9PSBrZXkpIHtcbiAgICAgICAgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIG5vdGlmaWNhdGlvbiBvbiBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VkIGZvciBhbGwgcHJvcGVydGllcyBpbiB0aGUgbmFtZXMgbGlzdC5cbiAgICogQHBhcmFtIG5hbWVzIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgbmFtZXNcbiAgICogQHBhcmFtIGtleSB0aGUga2V5IHdpdGggd2hpY2ggeW91IGhhdmUgcmVnaXN0ZXJlZCB0aGUgbm90aWZpY2F0aW9uIGZvciB0aGlzIHByb3BlcnR5LiBJdCBjYW4gYmUgbnVsbC5cbiAgICovXG4gIHB1YmxpYyB1blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAga2V5OiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lc1tpXSwga2V5KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNyZWF0ZUN1c3RvbUxvY2FsaXphYmxlT2JqKG5hbWU6IHN0cmluZykge1xuICAgIHZhciBsb2NTdHIgPSB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKG5hbWUpO1xuICAgIGlmIChsb2NTdHIgfHwgISg8YW55PnRoaXMpLmdldExvY2FsZSkgcmV0dXJuO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcobmFtZSwgPElMb2NhbGl6YWJsZU93bmVyPig8YW55PnRoaXMpKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG93bmVyOiBJTG9jYWxpemFibGVPd25lcixcbiAgICB1c2VNYXJrRG93bjogYm9vbGVhbiA9IGZhbHNlXG4gICk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICB2YXIgbG9jU3RyID0gbmV3IExvY2FsaXphYmxlU3RyaW5nKG93bmVyLCB1c2VNYXJrRG93biwgbmFtZSk7XG4gICAgbG9jU3RyLm9uU3RyQ2hhbmdlZCA9IChvbGRWYWx1ZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgfTtcbiAgICBpZiAoIXRoaXMubG9jYWxpemFibGVTdHJpbmdzKSB7XG4gICAgICB0aGlzLmxvY2FsaXphYmxlU3RyaW5ncyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLmxvY2FsaXphYmxlU3RyaW5nc1tuYW1lXSA9IGxvY1N0cjtcbiAgICByZXR1cm4gbG9jU3RyO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGl6YWJsZVN0cmluZyhuYW1lOiBzdHJpbmcpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MgPyB0aGlzLmxvY2FsaXphYmxlU3RyaW5nc1tuYW1lXSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVmYXVsdFN0cjogc3RyaW5nID0gXCJcIlxuICApOiBzdHJpbmcge1xuICAgIHZhciBsb2NTdHIgPSB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKG5hbWUpO1xuICAgIGlmICghbG9jU3RyKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgcmVzID0gbG9jU3RyLnRleHQ7XG4gICAgcmV0dXJuIHJlcyA/IHJlcyA6IGRlZmF1bHRTdHI7XG4gIH1cbiAgcHVibGljIHNldExvY2FsaXphYmxlU3RyaW5nVGV4dChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YXIgbG9jU3RyID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhuYW1lKTtcbiAgICBpZiAoIWxvY1N0cikgcmV0dXJuO1xuICAgIGxvY1N0ci50ZXh0ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIGFkZFVzZWRMb2NhbGVzKGxvY2FsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBpZiAoISF0aGlzLmxvY2FsaXphYmxlU3RyaW5ncykge1xuICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMubG9jYWxpemFibGVTdHJpbmdzKSB7XG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhrZXkpO1xuICAgICAgICBpZiAoaXRlbSkgdGhpcy5BZGRMb2NTdHJpbmdUb1VzZWRMb2NhbGVzKGl0ZW0sIGxvY2FsZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISF0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGtleSk7XG4gICAgICAgIGlmICghaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkgY29udGludWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uYWRkVXNlZExvY2FsZXMpIHtcbiAgICAgICAgICAgIGl0ZW0uYWRkVXNlZExvY2FsZXMobG9jYWxlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZWFyY2hUZXh0KHRleHQ6IHN0cmluZywgZm91bmRlZDogQXJyYXk8SUZpbmRFbGVtZW50Pikge1xuICAgIHZhciBzdHJzOiBBcnJheTxMb2NhbGl6YWJsZVN0cmluZz4gPSBbXTtcbiAgICB0aGlzLmdldFNlYXJjaGFibGVMb2NhbGl6ZWRTdHJpbmdzKHN0cnMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3Rycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHN0cnNbaV0uc2V0RmluZFRleHQodGV4dCkpIHtcbiAgICAgICAgZm91bmRlZC5wdXNoKHsgZWxlbWVudDogdGhpcywgc3RyOiBzdHJzW2ldIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFNlYXJjaGFibGVMb2NhbGl6ZWRTdHJpbmdzKGFycjogQXJyYXk8TG9jYWxpemFibGVTdHJpbmc+KSB7XG4gICAgaWYgKCEhdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgIGxldCBrZXlzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICB0aGlzLmdldFNlYXJjaGFibGVMb2NLZXlzKGtleXMpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhrZXlzW2ldKTtcbiAgICAgICAgaWYgKGl0ZW0pIGFyci5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuYXJyYXlzSW5mbykgcmV0dXJuO1xuICAgIGxldCBrZXlzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgdGhpcy5nZXRTZWFyY2hhYmxlSXRlbVZhbHVlS2V5cyhrZXlzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShrZXlzW2ldKTtcbiAgICAgIGlmICghaXRlbXMpIGNvbnRpbnVlO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpdGVtcy5sZW5ndGg7IGorKykge1xuICAgICAgICBhcnIucHVzaChpdGVtc1tqXS5sb2NUZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldFNlYXJjaGFibGVMb2NLZXlzKGtleXM6IEFycmF5PHN0cmluZz4pIHt9XG4gIHByb3RlY3RlZCBnZXRTZWFyY2hhYmxlSXRlbVZhbHVlS2V5cyhrZXlzOiBBcnJheTxzdHJpbmc+KSB7fVxuICBwcm90ZWN0ZWQgQWRkTG9jU3RyaW5nVG9Vc2VkTG9jYWxlcyhcbiAgICBsb2NTdHI6IExvY2FsaXphYmxlU3RyaW5nLFxuICAgIGxvY2FsZXM6IEFycmF5PHN0cmluZz5cbiAgKSB7XG4gICAgdmFyIGxvY3MgPSBsb2NTdHIuZ2V0TG9jYWxlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxvY2FsZXMuaW5kZXhPZihsb2NzW2ldKSA8IDApIHtcbiAgICAgICAgbG9jYWxlcy5wdXNoKGxvY3NbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlSXRlbVZhbHVlcyhuYW1lOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuY3JlYXRlTmV3QXJyYXkobmFtZSwgZnVuY3Rpb24oaXRlbTogYW55KSB7XG4gICAgICBpdGVtLmxvY093bmVyID0gc2VsZjtcbiAgICAgIGl0ZW0ub3duZXJQcm9wZXJ0eU5hbWUgPSBuYW1lO1xuICAgIH0pO1xuICAgIHRoaXMuYXJyYXlzSW5mb1tuYW1lXS5pc0l0ZW1WYWx1ZXMgPSB0cnVlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlBcnJheUNoYW5nZWQoYXI6IGFueSwgYXJyYXlDaGFuZ2VzOiBBcnJheUNoYW5nZXMpIHtcbiAgICAhIWFyLm9uQXJyYXlDaGFuZ2VkICYmIGFyLm9uQXJyYXlDaGFuZ2VkKGFycmF5Q2hhbmdlcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld0FycmF5Q29yZShuYW1lOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgcmVzID0gbnVsbDtcbiAgICBpZiAoISF0aGlzLmNyZWF0ZUFycmF5Q29yZUhhbmRsZXIpIHtcbiAgICAgIHJlcyA9IHRoaXMuY3JlYXRlQXJyYXlDb3JlSGFuZGxlcih0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSk7XG4gICAgfVxuICAgIGlmICghcmVzKSB7XG4gICAgICByZXMgPSBuZXcgQXJyYXk8YW55PigpO1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZSh0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSwgcmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZW5zdXJlQXJyYXkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9uUHVzaDogYW55ID0gbnVsbCxcbiAgICBvblJlbW92ZTogYW55ID0gbnVsbFxuICApIHtcbiAgICBpZiAodGhpcy5hcnJheXNJbmZvICYmIHRoaXMuYXJyYXlzSW5mb1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ld0FycmF5KG5hbWUsIG9uUHVzaCwgb25SZW1vdmUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld0FycmF5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvblB1c2g6IGFueSA9IG51bGwsXG4gICAgb25SZW1vdmU6IGFueSA9IG51bGxcbiAgKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIG5ld0FycmF5ID0gdGhpcy5jcmVhdGVOZXdBcnJheUNvcmUobmFtZSk7XG4gICAgaWYgKCF0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgIHRoaXMuYXJyYXlzSW5mbyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLmFycmF5c0luZm9bbmFtZV0gPSB7IG9uUHVzaDogb25QdXNoLCBpc0l0ZW1WYWx1ZXM6IGZhbHNlIH07XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIG5ld0FycmF5LnB1c2ggPSBmdW5jdGlvbih2YWx1ZSk6IG51bWJlciB7XG4gICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ld0FycmF5KS5wdXNoLmNhbGwobmV3QXJyYXksIHZhbHVlKTtcbiAgICAgIGlmICghc2VsZi5pc0Rpc3Bvc2VkVmFsdWUpIHtcbiAgICAgICAgaWYgKG9uUHVzaCkgb25QdXNoKHZhbHVlLCBuZXdBcnJheS5sZW5ndGggLSAxKTtcbiAgICAgICAgY29uc3QgYXJyYXlDaGFuZ2VzID0gbmV3IEFycmF5Q2hhbmdlcyhcbiAgICAgICAgICBuZXdBcnJheS5sZW5ndGggLSAxLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgW3ZhbHVlXSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgICBzZWxmLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG5ld0FycmF5LCBuZXdBcnJheSwgYXJyYXlDaGFuZ2VzKTtcbiAgICAgICAgc2VsZi5ub3RpZnlBcnJheUNoYW5nZWQobmV3QXJyYXksIGFycmF5Q2hhbmdlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgbmV3QXJyYXkudW5zaGlmdCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3QXJyYXkpLnVuc2hpZnQuY2FsbChcbiAgICAgICAgbmV3QXJyYXksXG4gICAgICAgIHZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKCFzZWxmLmlzRGlzcG9zZWRWYWx1ZSkge1xuICAgICAgICBpZiAob25QdXNoKSBvblB1c2godmFsdWUsIG5ld0FycmF5Lmxlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCBhcnJheUNoYW5nZXMgPSBuZXcgQXJyYXlDaGFuZ2VzKDAsIDAsIFt2YWx1ZV0sIFtdKTtcbiAgICAgICAgc2VsZi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBuZXdBcnJheSwgbmV3QXJyYXksIGFycmF5Q2hhbmdlcyk7XG4gICAgICAgIHNlbGYubm90aWZ5QXJyYXlDaGFuZ2VkKG5ld0FycmF5LCBhcnJheUNoYW5nZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIG5ld0FycmF5LnBvcCA9IGZ1bmN0aW9uKCk6IG51bWJlciB7XG4gICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ld0FycmF5KS5wb3AuY2FsbChuZXdBcnJheSk7XG4gICAgICBpZiAoIXNlbGYuaXNEaXNwb3NlZFZhbHVlKSB7XG4gICAgICAgIGlmIChvblJlbW92ZSkgb25SZW1vdmUocmVzdWx0KTtcbiAgICAgICAgY29uc3QgYXJyYXlDaGFuZ2VzID0gbmV3IEFycmF5Q2hhbmdlcyhuZXdBcnJheS5sZW5ndGggLSAxLCAxLCBbXSwgW10pO1xuICAgICAgICBzZWxmLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG5ld0FycmF5LCBuZXdBcnJheSwgYXJyYXlDaGFuZ2VzKTtcbiAgICAgICAgc2VsZi5ub3RpZnlBcnJheUNoYW5nZWQobmV3QXJyYXksIGFycmF5Q2hhbmdlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgbmV3QXJyYXkuc3BsaWNlID0gZnVuY3Rpb24oXG4gICAgICBzdGFydD86IG51bWJlcixcbiAgICAgIGRlbGV0ZUNvdW50PzogbnVtYmVyLFxuICAgICAgLi4uaXRlbXM6IGFueVtdXG4gICAgKTogYW55W10ge1xuICAgICAgaWYgKCFzdGFydCkgc3RhcnQgPSAwO1xuICAgICAgaWYgKCFkZWxldGVDb3VudCkgZGVsZXRlQ291bnQgPSAwO1xuICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXdBcnJheSkuc3BsaWNlLmNhbGwoXG4gICAgICAgIG5ld0FycmF5LFxuICAgICAgICBzdGFydCxcbiAgICAgICAgZGVsZXRlQ291bnQsXG4gICAgICAgIC4uLml0ZW1zXG4gICAgICApO1xuICAgICAgaWYgKCFpdGVtcykgaXRlbXMgPSBbXTtcbiAgICAgIGlmICghc2VsZi5pc0Rpc3Bvc2VkVmFsdWUpIHtcbiAgICAgICAgaWYgKG9uUmVtb3ZlICYmIHJlc3VsdCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBvblJlbW92ZShyZXN1bHRbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob25QdXNoKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgb25QdXNoKGl0ZW1zW2ldLCBzdGFydCArIGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheUNoYW5nZXMgPSBuZXcgQXJyYXlDaGFuZ2VzKFxuICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgIGRlbGV0ZUNvdW50LFxuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIHJlc3VsdFxuICAgICAgICApO1xuICAgICAgICBzZWxmLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG5ld0FycmF5LCBuZXdBcnJheSwgYXJyYXlDaGFuZ2VzKTtcbiAgICAgICAgc2VsZi5ub3RpZnlBcnJheUNoYW5nZWQobmV3QXJyYXksIGFycmF5Q2hhbmdlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3QXJyYXk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1WYWx1ZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHByb3RlY3RlZCBzZXRBcnJheShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3JjOiBhbnlbXSxcbiAgICBkZXN0OiBhbnlbXSxcbiAgICBpc0l0ZW1WYWx1ZXM6IGJvb2xlYW4sXG4gICAgb25QdXNoOiBhbnlcbiAgKSB7XG4gICAgdmFyIGRlbGV0ZWRJdGVtcyA9IFtdLmNvbmNhdChzcmMpO1xuICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihzcmMpLnNwbGljZS5jYWxsKHNyYywgMCwgc3JjLmxlbmd0aCk7XG4gICAgaWYgKCEhZGVzdCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpdGVtID0gZGVzdFtpXTtcbiAgICAgICAgaWYgKGlzSXRlbVZhbHVlcykge1xuICAgICAgICAgIGlmICghIUJhc2UuY3JlYXRlSXRlbVZhbHVlKSB7XG4gICAgICAgICAgICBpdGVtID0gQmFzZS5jcmVhdGVJdGVtVmFsdWUoaXRlbSwgdGhpcy5nZXRJdGVtVmFsdWVUeXBlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc3JjKS5wdXNoLmNhbGwoc3JjLCBpdGVtKTtcbiAgICAgICAgaWYgKG9uUHVzaCkgb25QdXNoKHNyY1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFycmF5Q2hhbmdlcyA9IG5ldyBBcnJheUNoYW5nZXMoXG4gICAgICAwLFxuICAgICAgZGVsZXRlZEl0ZW1zLmxlbmd0aCxcbiAgICAgIHNyYyxcbiAgICAgIGRlbGV0ZWRJdGVtc1xuICAgICk7XG4gICAgdGhpcy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBkZWxldGVkSXRlbXMsIHNyYywgYXJyYXlDaGFuZ2VzKTtcbiAgICB0aGlzLm5vdGlmeUFycmF5Q2hhbmdlZChzcmMsIGFycmF5Q2hhbmdlcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVHdvVmFsdWVFcXVhbHMoXG4gICAgeDogYW55LFxuICAgIHk6IGFueSxcbiAgICBjYXNlSW5TZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICB0cmltU3RyaW5nOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKGNhc2VJblNlbnNpdGl2ZSkge1xuICAgICAgeCA9IHRoaXMuZ2V0VmFsdWVJbkxvd0Nhc2UoeCk7XG4gICAgICB5ID0gdGhpcy5nZXRWYWx1ZUluTG93Q2FzZSh5KTtcbiAgICB9XG4gICAgaWYgKHRyaW1TdHJpbmcpIHtcbiAgICAgIHggPSB0aGlzLnRyaW1WYWx1ZSh4KTtcbiAgICAgIHkgPSB0aGlzLnRyaW1WYWx1ZSh5KTtcbiAgICB9XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh4LCB5KTtcbiAgfVxuICBwcml2YXRlIHN0YXRpYyBjb3B5T2JqZWN0KGRzdDogYW55LCBzcmM6IGFueSkge1xuICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzcmNba2V5XTtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHNvdXJjZSA9IHt9O1xuICAgICAgICB0aGlzLmNvcHlPYmplY3Qoc291cmNlLCBzcmNba2V5XSk7XG4gICAgICB9XG4gICAgICBkc3Rba2V5XSA9IHNvdXJjZTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNvcHlDc3NDbGFzc2VzKGRlc3Q6IGFueSwgc291cmNlOiBhbnkpIHtcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IHNvdXJjZSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgZGVzdFtcInJvb3RcIl0gPSBzb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIEJhc2UuY29weU9iamVjdChkZXN0LCBzb3VyY2UpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFZhbHVlSW5Mb3dDYXNlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoISF2YWwgJiYgdHlwZW9mIHZhbCA9PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJyYXlDaGFuZ2VzIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGluZGV4OiBudW1iZXIsXG4gICAgcHVibGljIGRlbGV0ZUNvdW50OiBudW1iZXIsXG4gICAgcHVibGljIGl0ZW1zVG9BZGQ6IGFueVtdLFxuICAgIHB1YmxpYyBkZWxldGVkSXRlbXM6IGFueVtdXG4gICkge31cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50PFQgZXh0ZW5kcyBGdW5jdGlvbiwgT3B0aW9ucz4ge1xuICBwdWJsaWMgb25DYWxsYmFja3NDaGFuZ2VkOiAoKSA9PiB2b2lkO1xuICBwcm90ZWN0ZWQgY2FsbGJhY2tzOiBBcnJheTxUPjtcbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5jYWxsYmFja3MgfHwgdGhpcy5jYWxsYmFja3MubGVuZ3RoID09IDA7XG4gIH1cbiAgcHVibGljIGZpcmUoc2VuZGVyOiBhbnksIG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMuY2FsbGJhY2tzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jYWxsYmFja3NbaV0oc2VuZGVyLCBvcHRpb25zKTtcbiAgICAgIGlmICghdGhpcy5jYWxsYmFja3MpIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuY2FsbGJhY2tzID0gdW5kZWZpbmVkO1xuICB9XG4gIHB1YmxpYyBhZGQoZnVuYzogVCkge1xuICAgIGlmICh0aGlzLmhhc0Z1bmMoZnVuYykpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBBcnJheTxUPigpO1xuICAgIH1cbiAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrQ2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyByZW1vdmUoZnVuYzogVCkge1xuICAgIGlmICh0aGlzLmhhc0Z1bmMoZnVuYykpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuY2FsbGJhY2tzLmluZGV4T2YoZnVuYywgMCk7XG4gICAgICB0aGlzLmNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy5maXJlQ2FsbGJhY2tDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBoYXNGdW5jKGZ1bmM6IFQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrcy5pbmRleE9mKGZ1bmMsIDApID4gLTE7XG4gIH1cbiAgcHJpdmF0ZSBmaXJlQ2FsbGJhY2tDaGFuZ2VkKCkge1xuICAgIGlmICghIXRoaXMub25DYWxsYmFja3NDaGFuZ2VkKSB7XG4gICAgICB0aGlzLm9uQ2FsbGJhY2tzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRCYXNlPFQ+IGV4dGVuZHMgRXZlbnQ8XG4gIChzZW5kZXI6IFQsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICBhbnlcbj4ge31cbiIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBJU3VydmV5LCBJU3VydmV5RGF0YSB9IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgRXhwcmVzc2lvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5cbi8qKlxuICogVGhlIGNhbGN1bGF0ZWQgdmFsdWUgaXMgYSB3YXkgdG8gZGVmaW5lIHRoZSB2YXJpYWJsZSBpbiBTdXJ2ZXkgQ3JlYXRvci5cbiAqIEl0IGhhcyB0d28gbWFpbiBwcm9wZXJ0aWVzOiBuYW1lIGFuZCBleHByZXNzaW9uLiBCYXNlZCBvbiBleHByZXNzaW9uIHRoZSB2YWx1ZSByZWFkLW9ubHkgcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkLlxuICogVGhlIG5hbWUgcHJvcGVydHkgc2hvdWxkIGJlIHVuaXF1ZSB0aG91Z2ggYWxsIGNhbGN1bGF0ZWQgdmFsdWVzLlxuICogSXQgdXNlcyBzdXJ2ZXkuZ2V0VmFyaWFibGUvc2VydXZleS5zZXRWYXJpYWJsZSBmdW5jdGlvbnMgdG8gZ2V0L3NldCBpdHMgdmFsdWUuIFRoZSBjbGFzcyBkbyBub3Qgc3RvcmUgaXRzIHZhbHVlIGludGVybmFsbHkuXG4gKiBZb3UgbWF5IHNldCBpbmNsdWRlSW50b1Jlc3VsdCBwcm9wZXJ0eSB0byB0cnVlIHRvIHN0b3JlIHRoaXMgY2FsY3VsYXRlZCB2YWx1ZSBpbnRvIHN1cnZleSByZXN1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWxjdWxhdGVkVmFsdWUgZXh0ZW5kcyBCYXNlIHtcbiAgcHJpdmF0ZSBkYXRhOiBJU3VydmV5RGF0YTtcbiAgcHJpdmF0ZSBleHByZXNzaW9uSXNSdW5uaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZXhwcmVzc2lvblJ1bm5lcjogRXhwcmVzc2lvblJ1bm5lcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nID0gbnVsbCwgZXhwcmVzc2lvbjogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKCEhbmFtZSkge1xuICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG4gICAgaWYgKCEhZXhwcmVzc2lvbikge1xuICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldE93bmVyKGRhdGE6IElTdXJ2ZXlEYXRhKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnJlcnVuRXhwcmVzc2lvbigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY2FsY3VsYXRlZHZhbHVlXCI7XG4gIH1cbiAgcHVibGljIGdldFN1cnZleShsaXZlOiBib29sZWFuID0gZmFsc2UpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgJiYgISEoPGFueT50aGlzLmRhdGEpW1wiZ2V0U3VydmV5XCJdXG4gICAgICA/ICg8YW55PnRoaXMuZGF0YSkuZ2V0U3VydmV5KClcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0IG93bmVyKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY2FsY3VsYXRlZCB2YWx1ZSBuYW1lLiBJdCBzaG91bGQgYmUgbm9uIGVtcHR5IGFuZCB1bmlxdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gaW5jbHVkZSB0aGUgbm9uLWVtcHR5IGNhbGN1bGF0ZWQgdmFsdWUgaW50byBzdXJ2ZXkgcmVzdWx0LCBzdXJ2ZXkuZGF0YSBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5jbHVkZUludG9SZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImluY2x1ZGVJbnRvUmVzdWx0XCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluY2x1ZGVJbnRvUmVzdWx0KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImluY2x1ZGVJbnRvUmVzdWx0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBFeHByZXNzaW9uIHRoYXQgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHZhbHVlLiBZb3UgbWF5IHVzZSBzdGFuZGFyZCBvcGVyYXRvcnMgbGlrZSArLCAtLCAqIGFuZCAvLCBzcXVhcmVzICgpLiBIZXJlIGlzIHRoZSBleGFtcGxlIG9mIGFjY2Vzc2luZyB0aGUgcXVlc3Rpb24gdmFsdWUge3F1ZXN0aW9ubmFtZX0uXG4gICAqIDxici8+RXhhbXBsZTogXCIoe3F1YW50aXR5fSAqIHtwcmljZX0pICogKDEwMCAtIHtkaXNjb3VudH0pIC8gMTAwXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgdmFsKTtcbiAgICB0aGlzLnJlcnVuRXhwcmVzc2lvbigpO1xuICB9XG4gIHB1YmxpYyBsb2NDYWxjdWxhdGlvbigpIHtcbiAgICB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyB1bmxvY0NhbGN1bGF0aW9uKCkge1xuICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyA9IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgaXNDYWxjdWxhdGVkID0gZmFsc2U7XG4gIHB1YmxpYyByZXNldENhbGN1bGF0aW9uKCkge1xuICAgIHRoaXMuaXNDYWxjdWxhdGVkID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIGRvQ2FsY3VsYXRpb24oXG4gICAgY2FsY3VsYXRlZFZhbHVlczogQXJyYXk8Q2FsY3VsYXRlZFZhbHVlPixcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICh0aGlzLmlzQ2FsY3VsYXRlZCkgcmV0dXJuO1xuICAgIHRoaXMucnVuRXhwcmVzc2lvbkNvcmUoY2FsY3VsYXRlZFZhbHVlcywgdmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLmlzQ2FsY3VsYXRlZCA9IHRydWU7XG4gIH1cbiAgcHVibGljIHJ1bkV4cHJlc3Npb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB0aGlzLnJ1bkV4cHJlc3Npb25Db3JlKG51bGwsIHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0VmFyaWFibGUodGhpcy5uYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0VmFsdWUodmFsOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMuZGF0YS5zZXRWYXJpYWJsZSh0aGlzLm5hbWUsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY2FuUnVuRXhwcmVzc2lvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLmRhdGEgJiZcbiAgICAgICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmXG4gICAgICAhIXRoaXMuZXhwcmVzc2lvbiAmJlxuICAgICAgIXRoaXMuZXhwcmVzc2lvbklzUnVubmluZyAmJlxuICAgICAgISF0aGlzLm5hbWVcbiAgICApO1xuICB9XG4gIHByaXZhdGUgcmVydW5FeHByZXNzaW9uKCkge1xuICAgIGlmICghdGhpcy5jYW5SdW5FeHByZXNzaW9uKSByZXR1cm47XG4gICAgdGhpcy5ydW5FeHByZXNzaW9uKFxuICAgICAgdGhpcy5kYXRhLmdldEZpbHRlcmVkVmFsdWVzKCksXG4gICAgICB0aGlzLmRhdGEuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICApO1xuICB9XG4gIHByaXZhdGUgcnVuRXhwcmVzc2lvbkNvcmUoXG4gICAgY2FsY3VsYXRlZFZhbHVlczogQXJyYXk8Q2FsY3VsYXRlZFZhbHVlPixcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy5jYW5SdW5FeHByZXNzaW9uKSByZXR1cm47XG4gICAgdGhpcy5lbnN1cmVFeHByZXNzaW9uKHZhbHVlcyk7XG4gICAgdGhpcy5sb2NDYWxjdWxhdGlvbigpO1xuICAgIGlmICghIWNhbGN1bGF0ZWRWYWx1ZXMpIHtcbiAgICAgIHRoaXMucnVuRGVwZW5kZW50RXhwcmVzc2lvbnMoY2FsY3VsYXRlZFZhbHVlcywgdmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgdGhpcy5leHByZXNzaW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuRGVwZW5kZW50RXhwcmVzc2lvbnMoXG4gICAgY2FsY3VsYXRlZFZhbHVlczogQXJyYXk8Q2FsY3VsYXRlZFZhbHVlPixcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIHZhciB2YXJpYWJsZXMgPSB0aGlzLmV4cHJlc3Npb25SdW5uZXIuZ2V0VmFyaWFibGVzKCk7XG4gICAgaWYgKCF2YXJpYWJsZXMpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGN1bGF0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjYWxjSXRlbSA9IGNhbGN1bGF0ZWRWYWx1ZXNbaV07XG4gICAgICBpZiAoY2FsY0l0ZW0gPT09IHRoaXMgfHwgdmFyaWFibGVzLmluZGV4T2YoY2FsY0l0ZW0ubmFtZSkgPCAwKSBjb250aW51ZTtcbiAgICAgIGNhbGNJdGVtLmRvQ2FsY3VsYXRpb24oY2FsY3VsYXRlZFZhbHVlcywgdmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICAgIHZhbHVlc1tjYWxjSXRlbS5uYW1lXSA9IGNhbGNJdGVtLnZhbHVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGVuc3VyZUV4cHJlc3Npb24odmFsdWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghIXRoaXMuZXhwcmVzc2lvblJ1bm5lcikgcmV0dXJuO1xuICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lciA9IG5ldyBFeHByZXNzaW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgdGhpcy5leHByZXNzaW9uUnVubmVyLm9uUnVuQ29tcGxldGUgPSBuZXdWYWx1ZSA9PiB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhuZXdWYWx1ZSwgdGhpcy52YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnVubG9jQ2FsY3VsYXRpb24oKTtcbiAgICB9O1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY2FsY3VsYXRlZHZhbHVlXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwiIW5hbWVcIiwgaXNVbmlxdWU6IHRydWUgfSxcbiAgICBcImV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgIFwiaW5jbHVkZUludG9SZXN1bHQ6Ym9vbGVhblwiLFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IENhbGN1bGF0ZWRWYWx1ZSgpO1xuICB9LFxuICBcImJhc2VcIlxuKTtcbiIsImltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBJVGV4dFByb2Nlc3NvciwgSVF1ZXN0aW9uLCBJU3VydmV5IH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIsIEpzb25PYmplY3RQcm9wZXJ0eSB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFdlYlJlcXVlc3RFcnJvciwgV2ViUmVxdWVzdEVtcHR5RXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9zdXJ2ZXktZXJyb3JcIjtcblxuY2xhc3MgWG1sUGFyc2VyIHtcbiAgcHJpdmF0ZSBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gIHB1YmxpYyBhc3NpZ25WYWx1ZSh0YXJnZXQ6IGFueSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdLnB1c2godmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0W25hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IFt0YXJnZXRbbmFtZV1dLmNvbmNhdCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgT2JqZWN0LmtleXModmFsdWUpWzBdID09PSBuYW1lXG4gICAgKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZVtuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0W25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyB4bWwySnNvbih4bWxOb2RlOiBhbnksIHJlc3VsdDogYW55KSB7XG4gICAgaWYgKHhtbE5vZGUuY2hpbGRyZW4gJiYgeG1sTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhtbE5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkTm9kZSA9IHhtbE5vZGUuY2hpbGRyZW5baV07XG4gICAgICAgIGxldCBjaGlsZE9iamVjdCA9IHt9O1xuICAgICAgICB0aGlzLnhtbDJKc29uKGNoaWxkTm9kZSwgY2hpbGRPYmplY3QpO1xuICAgICAgICB0aGlzLmFzc2lnblZhbHVlKHJlc3VsdCwgY2hpbGROb2RlLm5vZGVOYW1lLCBjaGlsZE9iamVjdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzaWduVmFsdWUocmVzdWx0LCB4bWxOb2RlLm5vZGVOYW1lLCB4bWxOb2RlLnRleHRDb250ZW50KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHBhcnNlWG1sU3RyaW5nKHhtbFN0cmluZzogc3RyaW5nKSB7XG4gICAgbGV0IHhtbFJvb3QgPSB0aGlzLnBhcnNlci5wYXJzZUZyb21TdHJpbmcoeG1sU3RyaW5nLCBcInRleHQveG1sXCIpO1xuICAgIGxldCBqc29uID0ge307XG4gICAgdGhpcy54bWwySnNvbih4bWxSb290LCBqc29uKTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxufVxuXG4vKipcbiAqIEEgZGVmaW5pdGlvbiBmb3IgZmlsbGluZyBjaG9pY2VzIGZvciBjaGVja2JveCwgZHJvcGRvd24gYW5kIHJhZGlvZ3JvdXAgcXVlc3Rpb25zIGZyb20gcmVzZnVsbCBzZXJ2aWNlcy5cbiAqIFRoZSBydW4gbWV0aG9kIGNhbGwgYSByZXN0ZnVsIHNlcnZpY2UgYW5kIHJlc3VsdHMgY2FuIGJlIGdldCBvbiBnZXRSZXN1bHRDYWxsYmFjay5cbiAqL1xuZXhwb3J0IGNsYXNzIENob2ljZXNSZXN0ZnVsIGV4dGVuZHMgQmFzZSB7XG4gIHByaXZhdGUgc3RhdGljIGNhY2hlVGV4dCA9IFwie0NBQ0hFfVwiO1xuICBwcml2YXRlIHN0YXRpYyBub0NhY2hlVGV4dCA9IFwie05PQ0FDSEV9XCI7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEVuY29kZVBhcmFtZXRlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNldHRpbmdzLndlYnNlcnZpY2VFbmNvZGVQYXJhbWV0ZXJzO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0IEVuY29kZVBhcmFtZXRlcnModmFsOiBib29sZWFuKSB7XG4gICAgc2V0dGluZ3Mud2Vic2VydmljZUVuY29kZVBhcmFtZXRlcnMgPSB2YWw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBjbGVhckNhY2hlKCkge1xuICAgIENob2ljZXNSZXN0ZnVsLml0ZW1zUmVzdWx0ID0ge307XG4gICAgQ2hvaWNlc1Jlc3RmdWwuc2VuZGluZ1NhbWVSZXF1ZXN0cyA9IHt9O1xuICB9XG4gIHByaXZhdGUgc3RhdGljIGl0ZW1zUmVzdWx0OiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBzdGF0aWMgc2VuZGluZ1NhbWVSZXF1ZXN0czoge1xuICAgIFtpbmRleDogc3RyaW5nXTogQXJyYXk8Q2hvaWNlc1Jlc3RmdWw+O1xuICB9ID0ge307XG4gIHByaXZhdGUgc3RhdGljIGFkZFNhbWVSZXF1ZXN0KG9iajogQ2hvaWNlc1Jlc3RmdWwpOiBib29sZWFuIHtcbiAgICBpZiAoIW9iai5pc1VzaW5nQ2FjaGUpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgaGFzaCA9IG9iai5vYmpIYXNoO1xuICAgIHZhciByZXMgPSBDaG9pY2VzUmVzdGZ1bC5zZW5kaW5nU2FtZVJlcXVlc3RzW2hhc2hdO1xuICAgIGlmICghcmVzKSB7XG4gICAgICBDaG9pY2VzUmVzdGZ1bC5zZW5kaW5nU2FtZVJlcXVlc3RzW29iai5vYmpIYXNoXSA9IFtdO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXMucHVzaChvYmopO1xuICAgIG9iai5pc1J1bm5pbmdWYWx1ZSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgdW5yZWdpc3RlclNhbWVSZXF1ZXN0cyhvYmo6IENob2ljZXNSZXN0ZnVsLCBpdGVtczogYW55KSB7XG4gICAgaWYgKCFvYmouaXNVc2luZ0NhY2hlKSByZXR1cm47XG4gICAgdmFyIHJlcyA9IENob2ljZXNSZXN0ZnVsLnNlbmRpbmdTYW1lUmVxdWVzdHNbb2JqLm9iakhhc2hdO1xuICAgIGRlbGV0ZSBDaG9pY2VzUmVzdGZ1bC5zZW5kaW5nU2FtZVJlcXVlc3RzW29iai5vYmpIYXNoXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXNbaV0uaXNSdW5uaW5nVmFsdWUgPSBmYWxzZTtcbiAgICAgIGlmICghIXJlc1tpXS5nZXRSZXN1bHRDYWxsYmFjaykge1xuICAgICAgICByZXNbaV0uZ2V0UmVzdWx0Q2FsbGJhY2soaXRlbXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIG9uQmVmb3JlU2VuZFJlcXVlc3Q6IChcbiAgICBzZW5kZXI6IENob2ljZXNSZXN0ZnVsLFxuICAgIG9wdGlvbnM6IHsgcmVxdWVzdDogWE1MSHR0cFJlcXVlc3QgfVxuICApID0+IHZvaWQ7XG4gIHByaXZhdGUgc3RhdGljIGdldENhY2hlZEl0ZW1zUmVzdWx0KG9iajogQ2hvaWNlc1Jlc3RmdWwpOiBib29sZWFuIHtcbiAgICB2YXIgaGFzaCA9IG9iai5vYmpIYXNoO1xuICAgIHZhciByZXMgPSBDaG9pY2VzUmVzdGZ1bC5pdGVtc1Jlc3VsdFtoYXNoXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChvYmouZ2V0UmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgIG9iai5nZXRSZXN1bHRDYWxsYmFjayhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGxhc3RPYmpIYXNoOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIGlzUnVubmluZ1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBwcm9jZXNzZWRVcmw6IHN0cmluZyA9IFwiXCI7XG4gIHByb3RlY3RlZCBwcm9jZXNzZWRQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIGlzVXNpbmdDYWNoZUZyb21Vcmw6IGJvb2xlYW4gPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyBvblByb2Nlc3NlZFVybENhbGxiYWNrOiAodXJsOiBzdHJpbmcsIHBhdGg6IHN0cmluZykgPT4gdm9pZDtcbiAgcHVibGljIGdldFJlc3VsdENhbGxiYWNrOiAoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pID0+IHZvaWQ7XG4gIHB1YmxpYyBiZWZvcmVTZW5kUmVxdWVzdENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgdXBkYXRlUmVzdWx0Q2FsbGJhY2s6IChcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBzZXJ2ZXJSZXN1bHQ6IGFueVxuICApID0+IEFycmF5PEl0ZW1WYWx1ZT47XG4gIHB1YmxpYyBnZXRJdGVtVmFsdWVDYWxsYmFjazogKGl0ZW06IGFueSkgPT4gYW55O1xuICBwdWJsaWMgZXJyb3I6IFN1cnZleUVycm9yID0gbnVsbDtcbiAgcHVibGljIG93bmVyOiBJUXVlc3Rpb247XG4gIHB1YmxpYyBjcmVhdGVJdGVtVmFsdWUgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgIHJldHVybiBuZXcgSXRlbVZhbHVlKHZhbHVlKTtcbiAgfTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0U3VydmV5KGxpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IElTdXJ2ZXkge1xuICAgIHJldHVybiAhIXRoaXMub3duZXIgPyB0aGlzLm93bmVyLnN1cnZleSA6IG51bGw7XG4gIH1cbiAgcHVibGljIHJ1bih0ZXh0UHJvY2Vzc29yOiBJVGV4dFByb2Nlc3NvciA9IG51bGwpIHtcbiAgICBpZiAoIXRoaXMudXJsIHx8ICF0aGlzLmdldFJlc3VsdENhbGxiYWNrKSByZXR1cm47XG4gICAgdGhpcy5wcm9jZXNzZWRUZXh0KHRleHRQcm9jZXNzb3IpO1xuICAgIGlmICghdGhpcy5wcm9jZXNzZWRVcmwpIHtcbiAgICAgIHRoaXMuZG9FbXB0eVJlc3VsdENhbGxiYWNrKHt9KTtcbiAgICAgIHRoaXMubGFzdE9iakhhc2ggPSB0aGlzLm9iakhhc2g7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmxhc3RPYmpIYXNoID09PSB0aGlzLm9iakhhc2gpIHJldHVybjtcbiAgICB0aGlzLmxhc3RPYmpIYXNoID0gdGhpcy5vYmpIYXNoO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIGlmICh0aGlzLnVzZUNoYW5nZWRJdGVtc1Jlc3VsdHMoKSkgcmV0dXJuO1xuICAgIGlmIChDaG9pY2VzUmVzdGZ1bC5hZGRTYW1lUmVxdWVzdCh0aGlzKSkgcmV0dXJuO1xuICAgIHRoaXMuc2VuZFJlcXVlc3QoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVXNpbmdDYWNoZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1VzaW5nQ2FjaGVGcm9tVXJsID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5pc1VzaW5nQ2FjaGVGcm9tVXJsID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBzZXR0aW5ncy51c2VDYWNoaW5nRm9yQ2hvaWNlc1Jlc3RmdWw7XG4gIH1cbiAgcHVibGljIGdldCBpc1J1bm5pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SXNSdW5uaW5nKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzUnVubmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1J1bm5pbmdWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNXYWl0aW5nRm9yUGFyYW1ldGVycygpIHtcbiAgICByZXR1cm4gdGhpcy51cmwgJiYgIXRoaXMucHJvY2Vzc2VkVXJsO1xuICB9XG4gIHByb3RlY3RlZCB1c2VDaGFuZ2VkSXRlbXNSZXN1bHRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBDaG9pY2VzUmVzdGZ1bC5nZXRDYWNoZWRJdGVtc1Jlc3VsdCh0aGlzKTtcbiAgfVxuICBwcml2YXRlIGRvRW1wdHlSZXN1bHRDYWxsYmFjayhzZXJ2ZXJSZXN1bHQ6IGFueSkge1xuICAgIHZhciBpdGVtczogQXJyYXk8YW55PiA9IFtdO1xuICAgIGlmICh0aGlzLnVwZGF0ZVJlc3VsdENhbGxiYWNrKSB7XG4gICAgICBpdGVtcyA9IHRoaXMudXBkYXRlUmVzdWx0Q2FsbGJhY2soaXRlbXMsIHNlcnZlclJlc3VsdCk7XG4gICAgfVxuICAgIHRoaXMuZ2V0UmVzdWx0Q2FsbGJhY2soaXRlbXMpO1xuICB9XG4gIHByaXZhdGUgcHJvY2Vzc2VkVGV4dCh0ZXh0UHJvY2Vzc29yOiBJVGV4dFByb2Nlc3Nvcikge1xuICAgIHZhciB1cmxUZXh0ID0gdGhpcy51cmw7XG4gICAgaWYgKCEhdXJsVGV4dCkge1xuICAgICAgdXJsVGV4dCA9IHVybFRleHRcbiAgICAgICAgLnJlcGxhY2UoQ2hvaWNlc1Jlc3RmdWwuY2FjaGVUZXh0LCBcIlwiKVxuICAgICAgICAucmVwbGFjZShDaG9pY2VzUmVzdGZ1bC5ub0NhY2hlVGV4dCwgXCJcIik7XG4gICAgfVxuICAgIGlmICh0ZXh0UHJvY2Vzc29yKSB7XG4gICAgICB2YXIgcFVybCA9IHRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHRFeChcbiAgICAgICAgdXJsVGV4dCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHNldHRpbmdzLndlYnNlcnZpY2VFbmNvZGVQYXJhbWV0ZXJzXG4gICAgICApO1xuICAgICAgdmFyIHBQYXRoID0gdGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dEV4KFxuICAgICAgICB0aGlzLnBhdGgsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBzZXR0aW5ncy53ZWJzZXJ2aWNlRW5jb2RlUGFyYW1ldGVyc1xuICAgICAgKTtcbiAgICAgIGlmICghcFVybC5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gfHwgIXBQYXRoLmhhc0FsbFZhbHVlc09uTGFzdFJ1bikge1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFVybCA9IFwiXCI7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkUGF0aCA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFVybCA9IHBVcmwudGV4dDtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoID0gcFBhdGgudGV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgPSB1cmxUZXh0O1xuICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoID0gdGhpcy5wYXRoO1xuICAgIH1cbiAgICBpZiAodGhpcy5vblByb2Nlc3NlZFVybENhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uUHJvY2Vzc2VkVXJsQ2FsbGJhY2sodGhpcy5wcm9jZXNzZWRVcmwsIHRoaXMucHJvY2Vzc2VkUGF0aCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBwYXJzZVJlc3BvbnNlKHJlc3BvbnNlOiBhbnkpIHtcbiAgICBsZXQgcGFyc2VkUmVzcG9uc2U7XG4gICAgaWYgKFxuICAgICAgISFyZXNwb25zZSAmJlxuICAgICAgdHlwZW9mIHJlc3BvbnNlLmluZGV4T2YgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgcmVzcG9uc2UuaW5kZXhPZihcIjxcIikgPT09IDBcbiAgICApIHtcbiAgICAgIHZhciBwYXJzZXIgPSBuZXcgWG1sUGFyc2VyKCk7XG4gICAgICBwYXJzZWRSZXNwb25zZSA9IHBhcnNlci5wYXJzZVhtbFN0cmluZyhyZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZFJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcGFyc2VkUmVzcG9uc2UgPSAocmVzcG9uc2UgfHwgXCJcIilcbiAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAubWFwKChzOiBhbnkpID0+IHMudHJpbShcIiBcIikpXG4gICAgICAgICAgLmZpbHRlcigoczogYW55KSA9PiAhIXMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkUmVzcG9uc2U7XG4gIH1cbiAgcHJvdGVjdGVkIHNlbmRSZXF1ZXN0KCkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbihcIkdFVFwiLCB0aGlzLnByb2Nlc3NlZFVybCk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBsb2FkaW5nT2JqSGFzaCA9IHRoaXMub2JqSGFzaDtcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmJlZm9yZUxvYWRSZXF1ZXN0KCk7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgIHNlbGYub25Mb2FkKHNlbGYucGFyc2VSZXNwb25zZSh4aHIucmVzcG9uc2UpLCBsb2FkaW5nT2JqSGFzaCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLm9uRXJyb3IoeGhyLnN0YXR1c1RleHQsIHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIG9wdGlvbnMgPSB7IHJlcXVlc3Q6IHhociB9O1xuICAgIGlmICghIUNob2ljZXNSZXN0ZnVsLm9uQmVmb3JlU2VuZFJlcXVlc3QpIHtcbiAgICAgIENob2ljZXNSZXN0ZnVsLm9uQmVmb3JlU2VuZFJlcXVlc3QodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHRoaXMuYmVmb3JlU2VuZFJlcXVlc3QoKTtcbiAgICBvcHRpb25zLnJlcXVlc3Quc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY2hvaWNlc0J5VXJsXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhdGhpcy51cmwgJiZcbiAgICAgICF0aGlzLnBhdGggJiZcbiAgICAgICF0aGlzLnZhbHVlTmFtZSAmJlxuICAgICAgIXRoaXMudGl0bGVOYW1lICYmXG4gICAgICAhdGhpcy5pbWFnZUxpbmtOYW1lXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRDdXN0b21Qcm9wZXJ0aWVzKCk7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaCh0aGlzLmdldEN1c3RvbVByb3BlcnR5TmFtZShwcm9wZXJ0aWVzW2ldLm5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGdldEN1c3RvbVByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb3BlcnR5TmFtZSArIFwiTmFtZVwiO1xuICB9XG4gIHByaXZhdGUgZ2V0Q3VzdG9tUHJvcGVydGllcygpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgcHJvcGVydGllcyA9IFNlcmlhbGl6ZXIuZ2V0UHJvcGVydGllcyh0aGlzLml0ZW1WYWx1ZVR5cGUpO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvcGVydGllc1tpXS5uYW1lID09PSBcInZhbHVlXCIgfHxcbiAgICAgICAgcHJvcGVydGllc1tpXS5uYW1lID09PSBcInRleHRcIiB8fFxuICAgICAgICBwcm9wZXJ0aWVzW2ldLm5hbWUgPT09IFwidmlzaWJsZUlmXCIgfHxcbiAgICAgICAgcHJvcGVydGllc1tpXS5uYW1lID09PSBcImVuYWJsZUlmXCJcbiAgICAgIClcbiAgICAgICAgY29udGludWU7XG4gICAgICByZXMucHVzaChwcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc2V0RGF0YShqc29uOiBhbnkpIHtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgaWYgKGpzb24udXJsKSB0aGlzLnVybCA9IGpzb24udXJsO1xuICAgIGlmIChqc29uLnBhdGgpIHRoaXMucGF0aCA9IGpzb24ucGF0aDtcbiAgICBpZiAoanNvbi52YWx1ZU5hbWUpIHRoaXMudmFsdWVOYW1lID0ganNvbi52YWx1ZU5hbWU7XG4gICAgaWYgKGpzb24udGl0bGVOYW1lKSB0aGlzLnRpdGxlTmFtZSA9IGpzb24udGl0bGVOYW1lO1xuICAgIGlmIChqc29uLmltYWdlTGlua05hbWUpIHRoaXMuaW1hZ2VMaW5rTmFtZSA9IGpzb24uaW1hZ2VMaW5rTmFtZTtcbiAgICBpZiAoanNvbi5hbGxvd0VtcHR5UmVzcG9uc2UgIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuYWxsb3dFbXB0eVJlc3BvbnNlID0ganNvbi5hbGxvd0VtcHR5UmVzcG9uc2U7XG4gICAgaWYgKGpzb24uYXR0YWNoT3JpZ2luYWxJdGVtcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgdGhpcy5hdHRhY2hPcmlnaW5hbEl0ZW1zID0ganNvbi5hdHRhY2hPcmlnaW5hbEl0ZW1zO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRDdXN0b21Qcm9wZXJ0aWVzTmFtZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChqc29uW3Byb3BlcnRpZXNbaV1dKSAoPGFueT50aGlzKVtwcm9wZXJ0aWVzW2ldXSA9IGpzb25bcHJvcGVydGllc1tpXV07XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXREYXRhKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHJlczogYW55ID0ge307XG4gICAgaWYgKHRoaXMudXJsKSByZXNbXCJ1cmxcIl0gPSB0aGlzLnVybDtcbiAgICBpZiAodGhpcy5wYXRoKSByZXNbXCJwYXRoXCJdID0gdGhpcy5wYXRoO1xuICAgIGlmICh0aGlzLnZhbHVlTmFtZSkgcmVzW1widmFsdWVOYW1lXCJdID0gdGhpcy52YWx1ZU5hbWU7XG4gICAgaWYgKHRoaXMudGl0bGVOYW1lKSByZXNbXCJ0aXRsZU5hbWVcIl0gPSB0aGlzLnRpdGxlTmFtZTtcbiAgICBpZiAodGhpcy5pbWFnZUxpbmtOYW1lKSByZXNbXCJpbWFnZUxpbmtOYW1lXCJdID0gdGhpcy5pbWFnZUxpbmtOYW1lO1xuICAgIGlmICh0aGlzLmFsbG93RW1wdHlSZXNwb25zZSlcbiAgICAgIHJlc1tcImFsbG93RW1wdHlSZXNwb25zZVwiXSA9IHRoaXMuYWxsb3dFbXB0eVJlc3BvbnNlO1xuICAgIGlmICh0aGlzLmF0dGFjaE9yaWdpbmFsSXRlbXMpXG4gICAgICByZXNbXCJhdHRhY2hPcmlnaW5hbEl0ZW1zXCJdID0gdGhpcy5hdHRhY2hPcmlnaW5hbEl0ZW1zO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRDdXN0b21Qcm9wZXJ0aWVzTmFtZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICgoPGFueT50aGlzKVtwcm9wZXJ0aWVzW2ldXSlcbiAgICAgICAgcmVzW3Byb3BlcnRpZXNbaV1dID0gKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV07XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIGxpbmsgdG8gYSB3ZWIgc2VydmljZS4gWW91IGNhbiB1c2UgdGV4dCBwcmVwcm9jZXNzaW5nIGhlcmUuXG4gICAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHVybDogX2h0dHBzOi8vcmVzdGNvdW50cmllcy5ldS9yZXN0L3YyL3JlZ2lvbi97cmVnaW9ufV8gaXMgY2hhbmdlZCBiYXNlZCBvbiB0aGUgX3JlZ2lvbl8gcXVlc3Rpb24ncyB2YWx1ZS5cbiAgICogU3VydmV5SlMgYXV0b21hdGljYWxseSBnZXRzIGRhdGEgZnJvbSB0aGUgd2ViIHNlcnZpY2Ugd2hlbiB0aGUgdmFsdWUgb2YgdGhlIF9yZWdpb25fIHF1ZXN0aW9uIGNoYW5nZXMuXG4gICAqIEBzZWUgcGF0aFxuICAgKiBAc2VlIHZhbHVlTmFtZVxuICAgKiBAc2VlIHRpdGxlTmFtZVxuICAgKiBAc2VlIFtFeGFtcGxlOiBSRVNUZnVsIERyb3Bkb3duXShodHRwczovL3N1cnZleWpzLmlvL0V4YW1wbGVzL0xpYnJhcnkvP2lkPXF1ZXN0aW9udHlwZS1kcm9wZG93bnJlc3RmdWxsKVxuICAgKiBAc2VlIFtEb2NzOiBGaWxsIENob2ljZXMgZnJvbSBhIFJFU1RmdWwgU2VydmljZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnkvP2lkPUxpYnJhcnlPdmVydmlldyNmaWxsLXRoZS1jaG9pY2VzLWZyb20tYS1yZXN0ZnVsLXNlcnZpY2UpXG4gICAqL1xuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ1cmxcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB1cmwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ1cmxcIiwgdmFsKTtcbiAgICB0aGlzLmlzVXNpbmdDYWNoZUZyb21VcmwgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCF2YWwpIHJldHVybjtcbiAgICBpZiAodmFsLmluZGV4T2YoQ2hvaWNlc1Jlc3RmdWwuY2FjaGVUZXh0KSA+IC0xKSB7XG4gICAgICB0aGlzLmlzVXNpbmdDYWNoZUZyb21VcmwgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsLmluZGV4T2YoQ2hvaWNlc1Jlc3RmdWwubm9DYWNoZVRleHQpID4gLTEpIHtcbiAgICAgICAgdGhpcy5pc1VzaW5nQ2FjaGVGcm9tVXJsID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSwgaWYgYSB3ZWIgc2VydmljZSByZXR1cm5zIGEgbG90IG9mIGluZm9ybWF0aW9uIGFuZCB5b3UgbmVlZCBvbmx5IGEgcGFydCBvZiBpdC5cbiAgICogRm9yIGV4YW1wbGUsIGEgd2ViIHNlcnZpY2UgcmV0dXJucyBhIGxpc3Qgb2YgY291bnRyaWVzIGFuZCBhIGxpc3Qgb2YgY2FwaXRhbHMuXG4gICAqIElmIHlvdSBuZWVkIGEgbGlzdCBvZiBjb3VudHJpZXMsIHNldCBhIGNvcnJlY3QgcGF0aCBmcm9tIHdoaWNoIFN1cnZleUpTIG9idGFpbnMgdGhlIGRhdGEsIGxpa2U6IF9EYXRhTGlzdDFcXERhdGFMaXN0Ml9cbiAgICogQHNlZSB1cmxcbiAgICogQHNlZSB2YWx1ZU5hbWVcbiAgICogQHNlZSB0aXRsZU5hbWVcbiAgICogQHNlZSBbRXhhbXBsZTogUkVTVGZ1bCBEcm9wZG93bl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9FeGFtcGxlcy9MaWJyYXJ5Lz9pZD1xdWVzdGlvbnR5cGUtZHJvcGRvd25yZXN0ZnVsbClcbiAgICogQHNlZSBbRG9jczogRmlsbCBDaG9pY2VzIGZyb20gYSBSRVNUZnVsIFNlcnZpY2VdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5Lz9pZD1MaWJyYXJ5T3ZlcnZpZXcjZmlsbC10aGUtY2hvaWNlcy1mcm9tLWEtcmVzdGZ1bC1zZXJ2aWNlKVxuICAgKi9cblxuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGF0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYXRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbmFtZSBvZiBhIHByb3BlcnR5IChpbiB0aGUgb2J0YWluZWQgZGF0YSBvYmplY3QpIHRvIHdoaWNoIFN1cnZleUpTIGJpbmRzIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBjaG9pY2UgaXRlbXMuXG4gICAqIEBzZWUgdXJsXG4gICAqIEBzZWUgcGF0aFxuICAgKiBAc2VlIHRpdGxlTmFtZVxuICAgKiBAc2VlIFtFeGFtcGxlOiBSRVNUZnVsIERyb3Bkb3duXShodHRwczovL3N1cnZleWpzLmlvL0V4YW1wbGVzL0xpYnJhcnkvP2lkPXF1ZXN0aW9udHlwZS1kcm9wZG93bnJlc3RmdWxsKVxuICAgKiBAc2VlIFtEb2NzOiBGaWxsIENob2ljZXMgZnJvbSBhIFJFU1RmdWwgU2VydmljZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnkvP2lkPUxpYnJhcnlPdmVydmlldyNmaWxsLXRoZS1jaG9pY2VzLWZyb20tYS1yZXN0ZnVsLXNlcnZpY2UpXG4gICAqL1xuXG4gIHB1YmxpYyBnZXQgdmFsdWVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSAoaW4gdGhlIG9idGFpbmVkIGRhdGEgb2JqZWN0KSB0byB3aGljaCBTdXJ2ZXlKUyBiaW5kcyB0byBwcm92aWRlIGRpc3BsYXkgdGV4dHMgZm9yIGNob2ljZSBpdGVtcy5cbiAgICogQHNlZSB1cmxcbiAgICogQHNlZSBwYXRoXG4gICAqIEBzZWUgdmFsdWVlTmFtZVxuICAgKiBAc2VlIFtFeGFtcGxlOiBSRVNUZnVsIERyb3Bkb3duXShodHRwczovL3N1cnZleWpzLmlvL0V4YW1wbGVzL0xpYnJhcnkvP2lkPXF1ZXN0aW9udHlwZS1kcm9wZG93bnJlc3RmdWxsKVxuICAgKiBAc2VlIFtEb2NzOiBGaWxsIENob2ljZXMgZnJvbSBhIFJFU1RmdWwgU2VydmljZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnkvP2lkPUxpYnJhcnlPdmVydmlldyNmaWxsLXRoZS1jaG9pY2VzLWZyb20tYS1yZXN0ZnVsLXNlcnZpY2UpXG4gICAqL1xuXG4gIHB1YmxpYyBnZXQgdGl0bGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRpdGxlTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRpdGxlTmFtZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW1hZ2VMaW5rTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZUxpbmtOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VMaW5rTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlTGlua05hbWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGFsbG93RW1wdHlSZXNwb25zZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dFbXB0eVJlc3BvbnNlXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93RW1wdHlSZXNwb25zZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0VtcHR5UmVzcG9uc2VcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGF0dGFjaE9yaWdpbmFsSXRlbXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImF0dGFjaE9yaWdpbmFsSXRlbXNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXR0YWNoT3JpZ2luYWxJdGVtcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhdHRhY2hPcmlnaW5hbEl0ZW1zXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpdGVtVmFsdWVUeXBlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLm93bmVyKSByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgICB2YXIgcHJvcCA9IFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KHRoaXMub3duZXIuZ2V0VHlwZSgpLCBcImNob2ljZXNcIik7XG4gICAgaWYgKCFwcm9wKSByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgICBpZiAocHJvcC50eXBlID09IFwiaXRlbXZhbHVlW11cIikgcmV0dXJuIFwiaXRlbXZhbHVlXCI7XG4gICAgcmV0dXJuIHByb3AudHlwZTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy51cmwgPSBcIlwiO1xuICAgIHRoaXMucGF0aCA9IFwiXCI7XG4gICAgdGhpcy52YWx1ZU5hbWUgPSBcIlwiO1xuICAgIHRoaXMudGl0bGVOYW1lID0gXCJcIjtcbiAgICB0aGlzLmltYWdlTGlua05hbWUgPSBcIlwiO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRDdXN0b21Qcm9wZXJ0aWVzTmFtZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICgoPGFueT50aGlzKVtwcm9wZXJ0aWVzW2ldXSkgKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV0gPSBcIlwiO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgYmVmb3JlU2VuZFJlcXVlc3QoKSB7XG4gICAgdGhpcy5pc1J1bm5pbmdWYWx1ZSA9IHRydWU7XG4gICAgaWYgKCEhdGhpcy5iZWZvcmVTZW5kUmVxdWVzdENhbGxiYWNrKSB7XG4gICAgICB0aGlzLmJlZm9yZVNlbmRSZXF1ZXN0Q2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGJlZm9yZUxvYWRSZXF1ZXN0KCkge1xuICAgIHRoaXMuaXNSdW5uaW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Mb2FkKHJlc3VsdDogYW55LCBsb2FkaW5nT2JqSGFzaDogc3RyaW5nID0gbnVsbCkge1xuICAgIGlmICghbG9hZGluZ09iakhhc2gpIHtcbiAgICAgIGxvYWRpbmdPYmpIYXNoID0gdGhpcy5vYmpIYXNoO1xuICAgIH1cbiAgICB2YXIgaXRlbXMgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xuICAgIHZhciB1cGRhdGVkUmVzdWx0ID0gdGhpcy5nZXRSZXN1bHRBZnRlclBhdGgocmVzdWx0KTtcbiAgICBpZiAodXBkYXRlZFJlc3VsdCAmJiB1cGRhdGVkUmVzdWx0W1wibGVuZ3RoXCJdKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZWRSZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW1WYWx1ZSA9IHVwZGF0ZWRSZXN1bHRbaV07XG4gICAgICAgIGlmICghaXRlbVZhbHVlKSBjb250aW51ZTtcbiAgICAgICAgdmFyIHZhbHVlID0gISF0aGlzLmdldEl0ZW1WYWx1ZUNhbGxiYWNrXG4gICAgICAgICAgPyB0aGlzLmdldEl0ZW1WYWx1ZUNhbGxiYWNrKGl0ZW1WYWx1ZSlcbiAgICAgICAgICA6IHRoaXMuZ2V0VmFsdWUoaXRlbVZhbHVlKTtcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuc2V0VGl0bGUoaXRlbSwgaXRlbVZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRDdXN0b21Qcm9wZXJ0aWVzKGl0ZW0sIGl0ZW1WYWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaE9yaWdpbmFsSXRlbXMpIHtcbiAgICAgICAgICBpdGVtLm9yaWdpbmFsSXRlbSA9IGl0ZW1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW1hZ2VMaW5rID0gdGhpcy5nZXRJbWFnZUxpbmsoaXRlbVZhbHVlKTtcbiAgICAgICAgaWYgKCEhaW1hZ2VMaW5rKSB7XG4gICAgICAgICAgaXRlbS5pbWFnZUxpbmsgPSBpbWFnZUxpbms7XG4gICAgICAgIH1cbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmFsbG93RW1wdHlSZXNwb25zZSkge1xuICAgICAgICB0aGlzLmVycm9yID0gbmV3IFdlYlJlcXVlc3RFbXB0eUVycm9yKG51bGwsIHRoaXMub3duZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy51cGRhdGVSZXN1bHRDYWxsYmFjaykge1xuICAgICAgaXRlbXMgPSB0aGlzLnVwZGF0ZVJlc3VsdENhbGxiYWNrKGl0ZW1zLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1VzaW5nQ2FjaGUpIHtcbiAgICAgIENob2ljZXNSZXN0ZnVsLml0ZW1zUmVzdWx0W2xvYWRpbmdPYmpIYXNoXSA9IGl0ZW1zO1xuICAgIH1cbiAgICB0aGlzLmNhbGxSZXN1bHRDYWxsYmFjayhpdGVtcywgbG9hZGluZ09iakhhc2gpO1xuICAgIENob2ljZXNSZXN0ZnVsLnVucmVnaXN0ZXJTYW1lUmVxdWVzdHModGhpcywgaXRlbXMpO1xuICB9XG4gIHByb3RlY3RlZCBjYWxsUmVzdWx0Q2FsbGJhY2soXG4gICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgbG9hZGluZ09iakhhc2g6IHN0cmluZ1xuICApIHtcbiAgICBpZiAobG9hZGluZ09iakhhc2ggIT0gdGhpcy5vYmpIYXNoKSByZXR1cm47XG4gICAgdGhpcy5nZXRSZXN1bHRDYWxsYmFjayhpdGVtcyk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRDdXN0b21Qcm9wZXJ0aWVzKGl0ZW06IEl0ZW1WYWx1ZSwgaXRlbVZhbHVlOiBhbnkpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWVDb3JlKFxuICAgICAgICBpdGVtVmFsdWUsXG4gICAgICAgIHRoaXMuZ2V0UHJvcGVydHlCaW5kaW5nKHByb3AubmFtZSlcbiAgICAgICk7XG4gICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgICAgKDxhbnk+aXRlbSlbcHJvcC5uYW1lXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eUJpbmRpbmcocHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoKDxhbnk+dGhpcylbdGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKV0pXG4gICAgICByZXR1cm4gKDxhbnk+dGhpcylbdGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKV07XG4gICAgaWYgKCg8YW55PnRoaXMpW3Byb3BlcnR5TmFtZV0pIHJldHVybiAoPGFueT50aGlzKVtwcm9wZXJ0eU5hbWVdO1xuICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gIH1cbiAgcHJpdmF0ZSBvbkVycm9yKHN0YXR1czogc3RyaW5nLCByZXNwb25zZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lcnJvciA9IG5ldyBXZWJSZXF1ZXN0RXJyb3Ioc3RhdHVzLCByZXNwb25zZSwgdGhpcy5vd25lcik7XG4gICAgdGhpcy5kb0VtcHR5UmVzdWx0Q2FsbGJhY2socmVzcG9uc2UpO1xuICAgIENob2ljZXNSZXN0ZnVsLnVucmVnaXN0ZXJTYW1lUmVxdWVzdHModGhpcywgW10pO1xuICB9XG4gIHByaXZhdGUgZ2V0UmVzdWx0QWZ0ZXJQYXRoKHJlc3VsdDogYW55KSB7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgaWYgKCF0aGlzLnByb2Nlc3NlZFBhdGgpIHJldHVybiByZXN1bHQ7XG4gICAgdmFyIHBhdGhlcyA9IHRoaXMuZ2V0UGF0aGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdFtwYXRoZXNbaV1dO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgZ2V0UGF0aGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBwYXRoZXMgPSBbXTtcbiAgICBpZiAodGhpcy5wcm9jZXNzZWRQYXRoLmluZGV4T2YoXCI7XCIpID4gLTEpIHtcbiAgICAgIHBhdGhlcyA9IHRoaXMucGF0aC5zcGxpdChcIjtcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhlcyA9IHRoaXMucHJvY2Vzc2VkUGF0aC5zcGxpdChcIixcIik7XG4gICAgfVxuICAgIGlmIChwYXRoZXMubGVuZ3RoID09IDApIHBhdGhlcy5wdXNoKHRoaXMucHJvY2Vzc2VkUGF0aCk7XG4gICAgcmV0dXJuIHBhdGhlcztcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlKGl0ZW06IGFueSk6IGFueSB7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy52YWx1ZU5hbWUpIHJldHVybiB0aGlzLmdldFZhbHVlQ29yZShpdGVtLCB0aGlzLnZhbHVlTmFtZSk7XG4gICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIE9iamVjdCkpIHJldHVybiBpdGVtO1xuICAgIHZhciBsZW4gPSBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGg7XG4gICAgaWYgKGxlbiA8IDEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBpdGVtW09iamVjdC5rZXlzKGl0ZW0pWzBdXTtcbiAgfVxuICBwcml2YXRlIHNldFRpdGxlKGl0ZW06IEl0ZW1WYWx1ZSwgaXRlbVZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciB0aXRsZSA9IHRoaXMudGl0bGVOYW1lID8gdGhpcy50aXRsZU5hbWUgOiBcInRpdGxlXCI7XG4gICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWVDb3JlKGl0ZW1WYWx1ZSwgdGl0bGUpO1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGl0ZW0udGV4dCA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbS5sb2NUZXh0LnNldEpzb24odmFsKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRJbWFnZUxpbmsoaXRlbTogYW55KTogYW55IHtcbiAgICB2YXIgaW1hZ2VMaW5rID0gdGhpcy5pbWFnZUxpbmtOYW1lID8gdGhpcy5pbWFnZUxpbmtOYW1lIDogXCJpbWFnZUxpbmtcIjtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUNvcmUoaXRlbSwgaW1hZ2VMaW5rKTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlQ29yZShpdGVtOiBhbnksIHByb3BlcnR5OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHByb3BlcnR5LmluZGV4T2YoXCIuXCIpIDwgMCkgcmV0dXJuIGl0ZW1bcHJvcGVydHldO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gcHJvcGVydHkuc3BsaXQoXCIuXCIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaXRlbSA9IGl0ZW1bcHJvcGVydGllc1tpXV07XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICBwcml2YXRlIGdldCBvYmpIYXNoKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnByb2Nlc3NlZFVybCArXG4gICAgICBcIjtcIiArXG4gICAgICB0aGlzLnByb2Nlc3NlZFBhdGggK1xuICAgICAgXCI7XCIgK1xuICAgICAgdGhpcy52YWx1ZU5hbWUgK1xuICAgICAgXCI7XCIgK1xuICAgICAgdGhpcy50aXRsZU5hbWUgK1xuICAgICAgXCI7XCIgK1xuICAgICAgdGhpcy5pbWFnZUxpbmtOYW1lXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIE9ic29sZXRlLCBwbGVhc2UgdXNlIENob2ljZXNSZXN0ZnVsXG4gKi9cbmV4cG9ydCBjbGFzcyBDaG9pY2VzUmVzdGZ1bGwgZXh0ZW5kcyBDaG9pY2VzUmVzdGZ1bCB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEVuY29kZVBhcmFtZXRlcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIENob2ljZXNSZXN0ZnVsLkVuY29kZVBhcmFtZXRlcnM7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgRW5jb2RlUGFyYW1ldGVycyh2YWw6IGJvb2xlYW4pIHtcbiAgICBDaG9pY2VzUmVzdGZ1bC5FbmNvZGVQYXJhbWV0ZXJzID0gdmFsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZSgpIHtcbiAgICBDaG9pY2VzUmVzdGZ1bC5jbGVhckNhY2hlKCk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXQgb25CZWZvcmVTZW5kUmVxdWVzdCgpOiAoXG4gICAgc2VuZGVyOiBDaG9pY2VzUmVzdGZ1bCxcbiAgICBvcHRpb25zOiB7IHJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0IH1cbiAgKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gQ2hvaWNlc1Jlc3RmdWwub25CZWZvcmVTZW5kUmVxdWVzdDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBvbkJlZm9yZVNlbmRSZXF1ZXN0KFxuICAgIHZhbDogKHNlbmRlcjogQ2hvaWNlc1Jlc3RmdWwsIG9wdGlvbnM6IHsgcmVxdWVzdDogWE1MSHR0cFJlcXVlc3QgfSkgPT4gdm9pZFxuICApIHtcbiAgICBDaG9pY2VzUmVzdGZ1bC5vbkJlZm9yZVNlbmRSZXF1ZXN0ID0gdmFsO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY2hvaWNlc0J5VXJsXCIsXG4gIFtcbiAgICBcInVybFwiLFxuICAgIFwicGF0aFwiLFxuICAgIFwidmFsdWVOYW1lXCIsXG4gICAgXCJ0aXRsZU5hbWVcIixcbiAgICB7XG4gICAgICBuYW1lOiBcImltYWdlTGlua05hbWVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhb2JqICYmICEhb2JqLm93bmVyICYmIG9iai5vd25lci5nZXRUeXBlKCkgPT0gXCJpbWFnZXBpY2tlclwiO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJhbGxvd0VtcHR5UmVzcG9uc2U6Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJhdHRhY2hPcmlnaW5hbEl0ZW1zOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgQ2hvaWNlc1Jlc3RmdWwoKTtcbiAgfVxuKTtcbiIsImltcG9ydCB7IEhlbHBlcnMsIEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFByb2Nlc3NWYWx1ZSB7XG4gIHB1YmxpYyB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbDtcbiAgcHVibGljIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbDtcbiAgY29uc3RydWN0b3IoKSB7fVxuICBwdWJsaWMgZ2V0Rmlyc3ROYW1lKHRleHQ6IHN0cmluZywgb2JqOiBhbnkgPSBudWxsKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiB0ZXh0O1xuICAgIHZhciByZXMgPSBcIlwiO1xuICAgIGlmICghIW9iaikge1xuICAgICAgcmVzID0gdGhpcy5nZXRGaXJzdFByb3BlcnR5TmFtZSh0ZXh0LCBvYmopO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaCA9IHRleHRbaV07XG4gICAgICBpZiAoY2ggPT0gXCIuXCIgfHwgY2ggPT0gXCJbXCIpIGJyZWFrO1xuICAgICAgcmVzICs9IGNoO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBoYXNWYWx1ZSh0ZXh0OiBzdHJpbmcsIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZXMpIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlQ29yZSh0ZXh0LCB2YWx1ZXMpO1xuICAgIHJldHVybiByZXMuaGFzVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGwpOiBhbnkge1xuICAgIGlmICghdmFsdWVzKSB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZUNvcmUodGV4dCwgdmFsdWVzKTtcbiAgICByZXR1cm4gcmVzLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShvYmo6IGFueSwgdGV4dDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgdmFyIG5vbk5lc3RlZE9iaiA9IHRoaXMuZ2V0Tm9uTmVzdGVkT2JqZWN0KG9iaiwgdGV4dCwgdHJ1ZSk7XG4gICAgaWYgKCFub25OZXN0ZWRPYmopIHJldHVybjtcbiAgICBvYmogPSBub25OZXN0ZWRPYmoudmFsdWU7XG4gICAgdGV4dCA9IG5vbk5lc3RlZE9iai50ZXh0O1xuICAgIGlmICghIW9iaiAmJiAhIXRleHQpIHtcbiAgICAgIG9ialt0ZXh0XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWVJbmZvKHZhbHVlSW5mbzogYW55KSB7XG4gICAgaWYgKCEhdmFsdWVJbmZvLnBhdGgpIHtcbiAgICAgIHZhbHVlSW5mby52YWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tUGF0aCh2YWx1ZUluZm8ucGF0aCwgdGhpcy52YWx1ZXMpO1xuICAgICAgdmFsdWVJbmZvLmhhc1ZhbHVlID1cbiAgICAgICAgdmFsdWVJbmZvLnZhbHVlICE9PSBudWxsICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZUluZm8udmFsdWUpO1xuICAgICAgaWYgKFxuICAgICAgICAhdmFsdWVJbmZvLmhhc1ZhbHVlICYmXG4gICAgICAgIHZhbHVlSW5mby5wYXRoLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgdmFsdWVJbmZvLnBhdGhbdmFsdWVJbmZvLnBhdGgubGVuZ3RoIC0gMV0gPT0gXCJsZW5ndGhcIlxuICAgICAgKSB7XG4gICAgICAgIHZhbHVlSW5mby5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICAgIHZhbHVlSW5mby52YWx1ZSA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlQ29yZSh2YWx1ZUluZm8ubmFtZSwgdGhpcy52YWx1ZXMpO1xuICAgIHZhbHVlSW5mby52YWx1ZSA9IHJlcy52YWx1ZTtcbiAgICB2YWx1ZUluZm8uaGFzVmFsdWUgPSByZXMuaGFzVmFsdWU7XG4gICAgdmFsdWVJbmZvLnBhdGggPSByZXMuaGFzVmFsdWUgPyByZXMucGF0aCA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZUZyb21QYXRoKHBhdGg6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sIHZhbHVlczogYW55KTogYW55IHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlICghIXZhbHVlcyAmJiBpbmRleCA8IHBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgaW5kX25hbWUgPSBwYXRoW2luZGV4XTtcbiAgICAgIGlmIChcbiAgICAgICAgSGVscGVycy5pc051bWJlcihpbmRfbmFtZSkgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZXMpICYmXG4gICAgICAgIGluZF9uYW1lID49IHZhbHVlcy5sZW5ndGhcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXNbaW5kX25hbWVdO1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlQ29yZSh0ZXh0OiBzdHJpbmcsIHZhbHVlczogYW55KTogYW55IHtcbiAgICB2YXIgcmVzOiBhbnkgPSB7IGhhc1ZhbHVlOiBmYWxzZSwgdmFsdWU6IG51bGwsIHBhdGg6IG51bGwgfTtcbiAgICB2YXIgY3VyVmFsdWUgPSB2YWx1ZXM7XG4gICAgaWYgKCFjdXJWYWx1ZSAmJiBjdXJWYWx1ZSAhPT0gMCAmJiBjdXJWYWx1ZSAhPT0gZmFsc2UpIHJldHVybiByZXM7XG4gICAgaWYgKFxuICAgICAgdGV4dCAmJlxuICAgICAgdGV4dC5sYXN0SW5kZXhPZihcIi5sZW5ndGhcIikgPiAtMSAmJlxuICAgICAgdGV4dC5sYXN0SW5kZXhPZihcIi5sZW5ndGhcIikgPT09IHRleHQubGVuZ3RoIC0gXCIubGVuZ3RoXCIubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXMudmFsdWUgPSAwO1xuICAgICAgcmVzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIG5vbk5lc3RlZE9iaiA9IHRoaXMuZ2V0Tm9uTmVzdGVkT2JqZWN0KGN1clZhbHVlLCB0ZXh0LCBmYWxzZSk7XG4gICAgaWYgKCFub25OZXN0ZWRPYmopIHJldHVybiByZXM7XG4gICAgcmVzLnBhdGggPSBub25OZXN0ZWRPYmoucGF0aDtcbiAgICByZXMudmFsdWUgPSAhIW5vbk5lc3RlZE9iai50ZXh0XG4gICAgICA/IHRoaXMuZ2V0T2JqZWN0VmFsdWUobm9uTmVzdGVkT2JqLnZhbHVlLCBub25OZXN0ZWRPYmoudGV4dClcbiAgICAgIDogbm9uTmVzdGVkT2JqLnZhbHVlO1xuICAgIHJlcy5oYXNWYWx1ZSA9ICFIZWxwZXJzLmlzVmFsdWVFbXB0eShyZXMudmFsdWUpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXROb25OZXN0ZWRPYmplY3Qob2JqOiBhbnksIHRleHQ6IHN0cmluZywgY3JlYXRlUGF0aDogYm9vbGVhbik6IGFueSB7XG4gICAgdmFyIGN1ck5hbWUgPSB0aGlzLmdldEZpcnN0UHJvcGVydHlOYW1lKHRleHQsIG9iaiwgY3JlYXRlUGF0aCk7XG4gICAgdmFyIHBhdGggPSAhIWN1ck5hbWUgPyBbY3VyTmFtZV0gOiBudWxsO1xuICAgIHdoaWxlICh0ZXh0ICE9IGN1ck5hbWUgJiYgISFvYmopIHtcbiAgICAgIHZhciBpc0FycmF5ID0gdGV4dFswXSA9PSBcIltcIjtcbiAgICAgIGlmICghaXNBcnJheSkge1xuICAgICAgICBpZiAoIWN1ck5hbWUgJiYgdGV4dCA9PSB0aGlzLmdldEZpcnN0TmFtZSh0ZXh0KSlcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb2JqLCB0ZXh0OiB0ZXh0LCBwYXRoOiBwYXRoIH07XG4gICAgICAgIG9iaiA9IHRoaXMuZ2V0T2JqZWN0VmFsdWUob2JqLCBjdXJOYW1lKTtcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KG9iaikgJiYgIWNyZWF0ZVBhdGgpIHJldHVybiBudWxsO1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHIoY3VyTmFtZS5sZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9iakluQXJyYXkgPSB0aGlzLmdldE9iakluQXJyYXkob2JqLCB0ZXh0KTtcbiAgICAgICAgaWYgKCFvYmpJbkFycmF5KSByZXR1cm4gbnVsbDtcbiAgICAgICAgb2JqID0gb2JqSW5BcnJheS52YWx1ZTtcbiAgICAgICAgdGV4dCA9IG9iakluQXJyYXkudGV4dDtcbiAgICAgICAgcGF0aC5wdXNoKG9iakluQXJyYXkuaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKCEhdGV4dCAmJiB0ZXh0WzBdID09IFwiLlwiKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cigxKTtcbiAgICAgIH1cbiAgICAgIGN1ck5hbWUgPSB0aGlzLmdldEZpcnN0UHJvcGVydHlOYW1lKHRleHQsIG9iaiwgY3JlYXRlUGF0aCk7XG4gICAgICBpZiAoISFjdXJOYW1lKSB7XG4gICAgICAgIHBhdGgucHVzaChjdXJOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWU6IG9iaiwgdGV4dDogdGV4dCwgcGF0aDogcGF0aCB9O1xuICB9XG4gIHByaXZhdGUgZ2V0T2JqSW5BcnJheShjdXJWYWx1ZTogYW55LCB0ZXh0OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJWYWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHZhciBpbmRleCA9IDE7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgd2hpbGUgKGluZGV4IDwgdGV4dC5sZW5ndGggJiYgdGV4dFtpbmRleF0gIT0gXCJdXCIpIHtcbiAgICAgIHN0ciArPSB0ZXh0W2luZGV4XTtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICAgIHRleHQgPSBpbmRleCA8IHRleHQubGVuZ3RoID8gdGV4dC5zdWJzdHIoaW5kZXggKyAxKSA6IFwiXCI7XG4gICAgaW5kZXggPSB0aGlzLmdldEludFZhbHVlKHN0cik7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBjdXJWYWx1ZS5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IHZhbHVlOiBjdXJWYWx1ZVtpbmRleF0sIHRleHQ6IHRleHQsIGluZGV4OiBpbmRleCB9O1xuICB9XG4gIHByaXZhdGUgZ2V0Rmlyc3RQcm9wZXJ0eU5hbWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9iajogYW55LFxuICAgIGNyZWF0ZVByb3A6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG5hbWU7XG4gICAgaWYgKCFvYmopIG9iaiA9IHt9O1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkobmFtZSkpIHJldHVybiBuYW1lO1xuICAgIHZhciBuYW1lSW5Mb3cgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIEEgPSBuYW1lSW5Mb3dbMF07XG4gICAgdmFyIGEgPSBBLnRvVXBwZXJDYXNlKCk7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgdmFyIGZpcnN0ID0ga2V5WzBdO1xuICAgICAgaWYgKGZpcnN0ID09PSBhIHx8IGZpcnN0ID09PSBBKSB7XG4gICAgICAgIHZhciBrZXlOYW1lID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChrZXlOYW1lID09IG5hbWVJbkxvdykgcmV0dXJuIGtleTtcbiAgICAgICAgaWYgKG5hbWVJbkxvdy5sZW5ndGggPD0ga2V5TmFtZS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICB2YXIgY2ggPSBuYW1lSW5Mb3dba2V5TmFtZS5sZW5ndGhdO1xuICAgICAgICBpZiAoY2ggIT0gXCIuXCIgJiYgY2ggIT0gXCJbXCIpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoa2V5TmFtZSA9PSBuYW1lSW5Mb3cuc3Vic3RyKDAsIGtleU5hbWUubGVuZ3RoKSkgcmV0dXJuIGtleTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNyZWF0ZVByb3AgJiYgbmFtZVswXSAhPT0gXCJbXCIpIHtcbiAgICAgIHZhciBpbmQgPSBuYW1lLmluZGV4T2YoXCIuXCIpO1xuICAgICAgaWYgKGluZCA+IC0xKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigwLCBpbmQpO1xuICAgICAgICBvYmpbbmFtZV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcml2YXRlIGdldE9iamVjdFZhbHVlKG9iajogYW55LCBuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG9ialtuYW1lXTtcbiAgfVxuICBwcml2YXRlIGdldEludFZhbHVlKHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciA9PSBcIjBcIiB8fCAoKHN0ciB8IDApID4gMCAmJiBzdHIgJSAxID09IDApKSByZXR1cm4gTnVtYmVyKHN0cik7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iLCJpbXBvcnQgeyBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcblxuaW1wb3J0IHsgT3BlcmFuZCwgRnVuY3Rpb25PcGVyYW5kIH0gZnJvbSBcIi4vZXhwcmVzc2lvbnMvZXhwcmVzc2lvbnNcIjtcbmltcG9ydCB7IENvbmRpdGlvbnNQYXJzZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zUGFyc2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uUnVubmVyQmFzZSB7XG4gIHByaXZhdGUgZXhwcmVzc2lvblZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgb3BlcmFuZDogT3BlcmFuZDtcbiAgcHJpdmF0ZSBwcm9jZXNzVmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gIHByaXZhdGUgcGFyc2VyID0gbmV3IENvbmRpdGlvbnNQYXJzZXIoKTtcbiAgcHJpdmF0ZSBpc0FzeW5jVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBoYXNGdW5jdGlvblZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgYXN5bmNGdW5jTGlzdDogQXJyYXk8RnVuY3Rpb25PcGVyYW5kPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25WYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZXhwcmVzc2lvbiA9PT0gdmFsdWUpIHJldHVybjtcbiAgICB0aGlzLmV4cHJlc3Npb25WYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub3BlcmFuZCA9IHRoaXMucGFyc2VyLnBhcnNlRXhwcmVzc2lvbih2YWx1ZSk7XG4gICAgdGhpcy5oYXNGdW5jdGlvblZhbHVlID0gdGhpcy5jYW5SdW4oKSA/IHRoaXMub3BlcmFuZC5oYXNGdW5jdGlvbigpIDogZmFsc2U7XG4gICAgdGhpcy5pc0FzeW5jVmFsdWUgPSB0aGlzLmhhc0Z1bmN0aW9uKClcbiAgICAgID8gdGhpcy5vcGVyYW5kLmhhc0FzeW5jRnVuY3Rpb24oKVxuICAgICAgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLm9wZXJhbmQpIHJldHVybiBbXTtcblxuICAgIHZhciB2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICB0aGlzLm9wZXJhbmQuc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7XG4gICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgfVxuXG4gIHB1YmxpYyBoYXNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNGdW5jdGlvblZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBc3luYygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0FzeW5jVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgY2FuUnVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMub3BlcmFuZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBydW5Db3JlKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4gPSBudWxsXG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLm9wZXJhbmQpIHJldHVybiBudWxsO1xuXG4gICAgdGhpcy5wcm9jZXNzVmFsdWUudmFsdWVzID0gdmFsdWVzO1xuICAgIHRoaXMucHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIGlmICghdGhpcy5pc0FzeW5jKSByZXR1cm4gdGhpcy5ydW5WYWx1ZXMoKTtcbiAgICB0aGlzLmFzeW5jRnVuY0xpc3QgPSBbXTtcbiAgICB0aGlzLm9wZXJhbmQuYWRkVG9Bc3luY0xpc3QodGhpcy5hc3luY0Z1bmNMaXN0KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXN5bmNGdW5jTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hc3luY0Z1bmNMaXN0W2ldLm9uQXN5bmNSZWFkeSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb0FzeW5jRnVuY3Rpb25SZWFkeSgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFzeW5jRnVuY0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYXN5bmNGdW5jTGlzdFtpXS5ldmFsdWF0ZUFzeW5jKHRoaXMucHJvY2Vzc1ZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgZG9Bc3luY0Z1bmN0aW9uUmVhZHkoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFzeW5jRnVuY0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5hc3luY0Z1bmNMaXN0W2ldLmlzUmVhZHkpIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ydW5WYWx1ZXMoKTtcbiAgfVxuICBwcml2YXRlIHJ1blZhbHVlcygpOiBhbnkge1xuICAgIHZhciByZXMgPSB0aGlzLm9wZXJhbmQuZXZhbHVhdGUodGhpcy5wcm9jZXNzVmFsdWUpO1xuICAgIHRoaXMuZG9PbkNvbXBsZXRlKHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZG9PbkNvbXBsZXRlKHJlczogYW55KSB7fVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uUnVubmVyIGV4dGVuZHMgRXhwcmVzc2lvblJ1bm5lckJhc2Uge1xuICBwdWJsaWMgb25SdW5Db21wbGV0ZTogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZDtcbiAgcHVibGljIHJ1bihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ydW5Db3JlKHZhbHVlcywgcHJvcGVydGllcykgPT0gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9PbkNvbXBsZXRlKHJlczogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5vblJ1bkNvbXBsZXRlKSB0aGlzLm9uUnVuQ29tcGxldGUocmVzID09IHRydWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uUnVubmVyIGV4dGVuZHMgRXhwcmVzc2lvblJ1bm5lckJhc2Uge1xuICBwdWJsaWMgb25SdW5Db21wbGV0ZTogKHJlc3VsdDogYW55KSA9PiB2b2lkO1xuICBwdWJsaWMgcnVuKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucnVuQ29yZSh2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByb3RlY3RlZCBkb09uQ29tcGxldGUocmVzOiBhbnkpIHtcbiAgICBpZiAoISF0aGlzLm9uUnVuQ29tcGxldGUpIHRoaXMub25SdW5Db21wbGV0ZShyZXMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBPcGVyYW5kLCBDb25zdCB9IGZyb20gXCIuL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zXCI7XG5pbXBvcnQgeyBTeW50YXhFcnJvciwgcGFyc2UgfSBmcm9tIFwiLi9leHByZXNzaW9ucy9leHByZXNzaW9uUGFyc2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25zUGFyc2VyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYXQ6IG51bWJlciwgcHVibGljIGNvZGU6IHN0cmluZykge31cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbnNQYXJzZXIge1xuICBwcml2YXRlIGNvbmRpdGlvbkVycm9yOiBDb25kaXRpb25zUGFyc2VyRXJyb3I7XG4gIHByaXZhdGUgc3RhdGljIHBhcnNlckNhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogT3BlcmFuZCB9ID0ge307XG5cbiAgcHJpdmF0ZSBwYXRjaEV4cHJlc3Npb24odGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRleHRcbiAgICAgIC5yZXBsYWNlKC89Pi9nLCBcIj49XCIpXG4gICAgICAucmVwbGFjZSgvPTwvZywgXCI8PVwiKVxuICAgICAgLnJlcGxhY2UoLzw+L2csIFwiIT1cIilcbiAgICAgIC5yZXBsYWNlKC89PS9nLCBcIj0gXCIpXG4gICAgICAucmVwbGFjZSgvZXF1YWxzL2csIFwiZXF1YWwgXCIpXG4gICAgICAucmVwbGFjZSgvbm90ZXF1YWxzL2csIFwibm90ZXF1YWwgXCIpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUNvbmRpdGlvbih0ZXh0OiBzdHJpbmcpOiBPcGVyYW5kIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZUV4cHJlc3Npb24odGV4dCk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VFeHByZXNzaW9uKHRleHQ6IHN0cmluZyk6IE9wZXJhbmQge1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzdWx0ID0gQ29uZGl0aW9uc1BhcnNlci5wYXJzZXJDYWNoZVt0ZXh0XTtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSBwYXJzZSh0aGlzLnBhdGNoRXhwcmVzc2lvbih0ZXh0KSk7XG4gICAgICAgIGlmICghcmVzdWx0Lmhhc0FzeW5jRnVuY3Rpb24oKSkge1xuICAgICAgICAgIENvbmRpdGlvbnNQYXJzZXIucGFyc2VyQ2FjaGVbdGV4dF0gPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikge1xuICAgICAgICB0aGlzLmNvbmRpdGlvbkVycm9yID0gbmV3IENvbmRpdGlvbnNQYXJzZXJFcnJvcihcbiAgICAgICAgICBlLmxvY2F0aW9uLnN0YXJ0Lm9mZnNldCxcbiAgICAgICAgICBlLm1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVycm9yKCk6IENvbmRpdGlvbnNQYXJzZXJFcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uRXJyb3I7XG4gIH1cbn1cbiIsImltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2Nzc3N0YW5kYXJkXCI7XG5cbmV4cG9ydCB2YXIgZGVmYXVsdEJvb3RzdHJhcENzcyA9IHtcbiAgcm9vdDogXCJzdl9tYWluIHN2X2Jvb3RzdHJhcF9jc3NcIixcbiAgY29udGFpbmVyOiBcInN2X2NvbnRhaW5lclwiLFxuICBoZWFkZXI6IFwicGFuZWwtaGVhZGluZyBjYXJkLWhlYWRlclwiLFxuICBib2R5OiBcInBhbmVsLWJvZHkgY2FyZC1ibG9jayBtdC00XCIsXG4gIGJvZHlFbXB0eTogXCJwYW5lbC1ib2R5IGNhcmQtYmxvY2sgbXQtNCBzdl9ib2R5X2VtcHR5XCIsXG4gIGZvb3RlcjogXCJwYW5lbC1mb290ZXIgY2FyZC1mb290ZXJcIixcbiAgdGl0bGU6IFwiXCIsXG4gIGRlc2NyaXB0aW9uOiBcIlwiLFxuICBsb2dvOiBcInN2X2xvZ29cIixcbiAgbG9nb0ltYWdlOiBcInN2X2xvZ29fX2ltYWdlXCIsXG4gIGhlYWRlclRleHQ6IFwic3ZfaGVhZGVyX190ZXh0XCIsXG4gIG5hdmlnYXRpb25CdXR0b246IFwiXCIsXG4gIGNvbXBsZXRlZFBhZ2U6IFwiXCIsXG4gIG5hdmlnYXRpb246IHtcbiAgICBjb21wbGV0ZTogXCJidG4gc3ZfY29tcGxldGVfYnRuXCIsXG4gICAgcHJldjogXCJidG4gc3ZfcHJldl9idG5cIixcbiAgICBuZXh0OiBcImJ0biBzdl9uZXh0X2J0blwiLFxuICAgIHN0YXJ0OiBcImJ0biBzdl9zdGFydF9idG5cIixcbiAgICBwcmV2aWV3OiBcImJ0biBzdl9wcmV2aWV3X2J0blwiLFxuICAgIGVkaXQ6IFwiYnRuIHN2X2VkaXRfYnRuXCIsXG4gIH0sXG4gIHByb2dyZXNzOiBcInByb2dyZXNzIGNlbnRlci1ibG9jayBteC1hdXRvIG1iLTRcIixcbiAgcHJvZ3Jlc3NCYXI6IFwicHJvZ3Jlc3MtYmFyXCIsXG4gIHByb2dyZXNzVGV4dFVuZGVyQmFyOiBcInN2LWhpZGRlblwiLFxuICBwcm9ncmVzc0J1dHRvbnNDb250YWluZXJDZW50ZXI6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fY29udGFpbmVyLWNlbnRlclwiLFxuICBwcm9ncmVzc0J1dHRvbnNDb250YWluZXI6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fY29udGFpbmVyXCIsXG4gIHByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uTGVmdDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19pbWFnZS1idXR0b24tbGVmdFwiLFxuICBwcm9ncmVzc0J1dHRvbnNJbWFnZUJ1dHRvblJpZ2h0OiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2ltYWdlLWJ1dHRvbi1yaWdodFwiLFxuICBwcm9ncmVzc0J1dHRvbnNJbWFnZUJ1dHRvbkhpZGRlbjogXCJzdl9wcm9ncmVzcy1idXR0b25zX19pbWFnZS1idXR0b24tLWhpZGRlblwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0Q29udGFpbmVyOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtY29udGFpbmVyXCIsXG4gIHByb2dyZXNzQnV0dG9uc0xpc3Q6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdFwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudFBhc3NlZDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLXBhc3NlZFwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudEN1cnJlbnQ6XG4gICAgXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLWN1cnJlbnRcIixcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdEVsZW1lbnROb25DbGlja2FibGU6XG4gICAgXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLW5vbmNsaWNrYWJsZVwiLFxuICBwcm9ncmVzc0J1dHRvbnNQYWdlVGl0bGU6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fcGFnZS10aXRsZVwiLFxuICBwcm9ncmVzc0J1dHRvbnNQYWdlRGVzY3JpcHRpb246IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fcGFnZS1kZXNjcmlwdGlvblwiLFxuICBwYWdlOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICB0aXRsZTogXCJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzbWFsbFwiLFxuICB9LFxuICBwYWdlVGl0bGU6IFwiXCIsXG4gIHBhZ2VEZXNjcmlwdGlvbjogXCJzbWFsbFwiLFxuICByb3c6IFwic3Zfcm93XCIsXG4gIHF1ZXN0aW9uOiB7XG4gICAgbWFpblJvb3Q6IFwic3ZfcXN0blwiLFxuICAgIGZsb3dSb290OiBcInN2X3FfZmxvdyBzdl9xc3RuXCIsXG4gICAgaGVhZGVyOiBcIlwiLFxuICAgIGhlYWRlckxlZnQ6IFwidGl0bGUtbGVmdFwiLFxuICAgIGNvbnRlbnQ6IFwiXCIsXG4gICAgY29udGVudExlZnQ6IFwiY29udGVudC1sZWZ0XCIsXG4gICAgdGl0bGVMZWZ0Um9vdDogXCJzdl9xc3RuX2xlZnRcIixcbiAgICB0aXRsZTogXCJcIixcbiAgICB0aXRsZUV4cGFuZGFibGU6IFwic3ZfcV90aXRsZV9leHBhbmRhYmxlXCIsXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgICBkZXNjcmlwdGlvblVuZGVySW5wdXQ6IFwic21hbGxcIixcbiAgICByZXF1aXJlZFRleHQ6IFwic3ZfcV9yZXF1aXJlZF90ZXh0XCIsXG4gICAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICByZXF1aXJlZDogXCJcIixcbiAgICB0aXRsZVJlcXVpcmVkOiBcIlwiLFxuICAgIGhhc0Vycm9yOiBcImhhcy1lcnJvclwiLFxuICAgIGluZGVudDogMjAsXG4gICAgZm9ybUdyb3VwOiBcImZvcm0tZ3JvdXBcIixcbiAgfSxcbiAgcGFuZWw6IHtcbiAgICB0aXRsZTogXCJzdl9wX3RpdGxlXCIsXG4gICAgdGl0bGVFeHBhbmRhYmxlOiBcInN2X3BfdGl0bGVfZXhwYW5kYWJsZVwiLFxuICAgIHRpdGxlT25FcnJvcjogXCJcIixcbiAgICBpY29uOiBcInN2X3BhbmVsX2ljb25cIixcbiAgICBpY29uRXhwYW5kZWQ6IFwic3ZfZXhwYW5kZWRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzbWFsbCBzdl9wX2Rlc2NyaXB0aW9uXCIsXG4gICAgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCIsXG4gICAgZm9vdGVyOiBcInN2X3BfZm9vdGVyXCIsXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2X3FfcmVxdWlyZWRfdGV4dFwiLFxuICB9LFxuICBlcnJvcjoge1xuICAgIHJvb3Q6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgaWNvbjogXCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIixcbiAgICBpdGVtOiBcIlwiLFxuICAgIGxvY2F0aW9uVG9wOiBcInN2X3FzdG5fZXJyb3JfdG9wXCIsXG4gICAgbG9jYXRpb25Cb3R0b206IFwic3ZfcXN0bl9lcnJvcl9ib3R0b21cIixcbiAgfSxcbiAgYm9vbGVhbjoge1xuICAgIHJvb3Q6IFwic3ZfcWJsbiBmb3JtLWlubGluZSBjaGVja2JveFwiLFxuICAgIGl0ZW06IFwic3YtYm9vbGVhblwiLFxuICAgIGNvbnRyb2w6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1ib29sZWFuLS1jaGVja2VkIGNoZWNrZWRcIixcbiAgICBpdGVtSW5kZXRlcm1pbmF0ZTogXCJzdi1ib29sZWFuLS1pbmRldGVybWluYXRlXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWJvb2xlYW4tLWRpc2FibGVkXCIsXG4gICAgc3dpdGNoOiBcInN2LWJvb2xlYW5fX3N3aXRjaFwiLFxuICAgIHNsaWRlcjogXCJzdi1ib29sZWFuX19zbGlkZXJcIixcbiAgICBzbGlkZXJUZXh0OiBcInN2LWhpZGRlblwiLFxuICAgIGxhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsIFwiLFxuICAgIGRpc2FibGVkTGFiZWw6IFwic3YtYm9vbGVhbl9fbGFiZWwtLWRpc2FibGVkXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwic3YtaXRlbV9fZGVjb3JhdG9yIHN2LWJvb2xlYW5fX2RlY29yYXRvciBcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWl0ZW1fX3N2ZyAgc3YtYm9vbGVhbl9fc3ZnXCIsXG4gICAgY2hlY2tlZFBhdGg6IFwic3YtYm9vbGVhbl9fY2hlY2tlZC1wYXRoXCIsXG4gICAgdW5jaGVja2VkUGF0aDogXCJzdi1ib29sZWFuX191bmNoZWNrZWQtcGF0aFwiLFxuICAgIGluZGV0ZXJtaW5hdGVQYXRoOiBcInN2LWJvb2xlYW5fX2luZGV0ZXJtaW5hdGUtcGF0aFwiLFxuICB9LFxuICBjaGVja2JveDoge1xuICAgIHJvb3Q6IFwic3ZfcWNiYyBzdl9xY2J4IGZvcm0taW5saW5lXCIsXG4gICAgaXRlbTogXCJjaGVja2JveFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtU2VsZWN0QWxsOiBcInN2X3FfY2hlY2tib3hfc2VsZWN0YWxsXCIsXG4gICAgaXRlbU5vbmU6IFwic3ZfcV9jaGVja2JveF9ub25lXCIsXG4gICAgaXRlbUlubGluZTogXCJzdl9xX2NoZWNrYm94X2lubGluZVwiLFxuICAgIGl0ZW1Db250cm9sOiBcIlwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXG4gICAgbGFiZWw6IFwiXCIsXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiLFxuICAgIG90aGVyOiBcInN2X3FfY2hlY2tib3hfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gICAgY29sdW1uOiBcInN2X3Ffc2VsZWN0X2NvbHVtblwiLFxuICB9LFxuICByYW5raW5nOiB7XG4gICAgcm9vdDogXCJzdi1yYW5raW5nXCIsXG4gICAgcm9vdE1vYmlsZU1vZDogXCJzdi1yYW5raW5nLS1tb2JpbGVcIixcbiAgICByb290RHJhZ01vZDogXCJzdi1yYW5raW5nLS1kcmFnXCIsXG4gICAgaXRlbTogXCJzdi1yYW5raW5nLWl0ZW1cIixcbiAgICBpdGVtQ29udGVudDogXCJzdi1yYW5raW5nLWl0ZW1fX2NvbnRlbnRcIixcbiAgICBpdGVtSW5kZXg6IFwic3YtcmFua2luZy1pdGVtX19pbmRleFwiLFxuICAgIC8vIGl0ZW1UZXh0OiBcInN2LXJhbmtpbmctaXRlbV9fdGV4dFwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJzdi1yYW5raW5nLWl0ZW1fX3RleHRcIixcbiAgICBpdGVtR2hvc3ROb2RlOiBcInN2LXJhbmtpbmctaXRlbV9fZ2hvc3RcIixcbiAgICBpdGVtSWNvbkNvbnRhaW5lcjogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb24tY29udGFpbmVyXCIsXG4gICAgaXRlbUljb246IFwic3YtcmFua2luZy1pdGVtX19pY29uXCIsXG4gICAgaXRlbUljb25Ib3Zlck1vZDogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb24tLWhvdmVyXCIsXG4gICAgaXRlbUljb25Gb2N1c01vZDogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb24tLWZvY3VzXCIsXG4gICAgaXRlbUdob3N0TW9kOiBcInN2LXJhbmtpbmctaXRlbS0tZ2hvc3RcIixcbiAgICBpdGVtRHJhZ01vZDogXCJzdi1yYW5raW5nLWl0ZW0tLWRyYWdcIixcbiAgfSxcbiAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZHJvcGRvd246IHtcbiAgICByb290OiBcIlwiLFxuICAgIGNvbnRyb2w6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9kZF9vdGhlciBmb3JtLWNvbnRyb2xcIixcbiAgfSxcbiAgaHRtbDogeyByb290OiBcIlwiIH0sXG4gIGltYWdlOiB7IHJvb3Q6IFwic3ZfcV9pbWFnZVwiLCBpbWFnZTogXCJzdl9pbWFnZV9pbWFnZVwiIH0sXG4gIG1hdHJpeDoge1xuICAgIHJvb3Q6IFwidGFibGUgc3ZfcV9tYXRyaXhcIixcbiAgICBsYWJlbDogXCJzdl9xX21fbGFiZWxcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBjZWxsVGV4dDogXCJzdl9xX21fY2VsbF90ZXh0XCIsXG4gICAgY2VsbFRleHRTZWxlY3RlZDogXCJzdl9xX21fY2VsbF9zZWxlY3RlZCBiZy1wcmltYXJ5XCIsXG4gICAgY2VsbExhYmVsOiBcInN2X3FfbV9jZWxsX2xhYmVsXCIsXG4gIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGNlbGw6IFwic3ZfbWF0cml4X2NlbGxcIixcbiAgICBoZWFkZXJDZWxsOiBcInN2X21hdHJpeF9jZWxsX2hlYWRlclwiLFxuICAgIHJvdzogXCJzdl9tYXRyaXhfcm93XCIsXG4gICAgZGV0YWlsUm93OiBcInN2X21hdHJpeF9kZXRhaWxfcm93XCIsXG4gICAgZGV0YWlsUm93VGV4dDogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfcm93dGV4dFwiLFxuICAgIGRldGFpbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsXCIsXG4gICAgZGV0YWlsQnV0dG9uOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9idXR0b25cIixcbiAgICBkZXRhaWxCdXR0b25FeHBhbmRlZDogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uX2V4cGFuZGVkXCIsXG4gICAgZGV0YWlsSWNvbjogXCJzdl9kZXRhaWxfcGFuZWxfaWNvblwiLFxuICAgIGRldGFpbEljb25FeHBhbmRlZDogXCJzdl9kZXRhaWxfZXhwYW5kZWRcIixcbiAgICBkZXRhaWxQYW5lbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX3BhbmVsXCIsXG4gICAgYWN0aW9uc0NlbGw6IFwic3ZfbWF0cml4X2NlbGwgc3ZfbWF0cml4X2NlbGxfYWN0aW9uc1wiLFxuICB9LFxuICBtYXRyaXhkeW5hbWljOiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGJ1dHRvbjogXCJidXR0b25cIixcbiAgICBidXR0b25BZGQ6IFwiXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcIlwiLFxuICAgIGljb25BZGQ6IFwiXCIsXG4gICAgaWNvblJlbW92ZTogXCJcIixcbiAgICBpY29uRHJhZzogXCJzdi1tYXRyaXhkeW5hbWljX19kcmFnLWljb25cIixcbiAgICBoZWFkZXJDZWxsOiBcInN2X21hdHJpeF9jZWxsX2hlYWRlclwiLFxuICAgIHJvdzogXCJzdl9tYXRyaXhfcm93XCIsXG4gICAgZGV0YWlsUm93OiBcInN2X21hdHJpeF9kZXRhaWxfcm93XCIsXG4gICAgZGV0YWlsQ2VsbDogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxcIixcbiAgICBkZXRhaWxCdXR0b246IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX2J1dHRvblwiLFxuICAgIGRldGFpbEJ1dHRvbkV4cGFuZGVkOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9idXR0b25fZXhwYW5kZWRcIixcbiAgICBkZXRhaWxJY29uOiBcInN2X2RldGFpbF9wYW5lbF9pY29uXCIsXG4gICAgZGV0YWlsSWNvbkV4cGFuZGVkOiBcInN2X2RldGFpbF9leHBhbmRlZFwiLFxuICAgIGRldGFpbFBhbmVsQ2VsbDogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfcGFuZWxcIixcbiAgICBhY3Rpb25zQ2VsbDogXCJzdl9tYXRyaXhfY2VsbCBzdl9tYXRyaXhfY2VsbF9hY3Rpb25zXCIsXG4gICAgZW1wdHlSb3dzU2VjdGlvbjogXCJzdl9tYXRyaXhfZW1wdHlfcm93c19zZWN0aW9uXCIsXG4gICAgZW1wdHlSb3dzVGV4dDogXCJzdl9tYXRyaXhfZW1wdHlfcm93c190ZXh0XCIsXG4gICAgZW1wdHlSb3dzQnV0dG9uOiBcIlwiLFxuICB9LFxuICBwYW5lbGR5bmFtaWM6IHtcbiAgICByb290OiBcIlwiLFxuICAgIG5hdmlnYXRpb246IFwic3YtcGFuZWxkeW5hbWljX19uYXZpZ2F0aW9uXCIsXG4gICAgcHJvZ3Jlc3NUb3A6IFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcyBzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLS10b3BcIixcbiAgICBwcm9ncmVzc0JvdHRvbTpcbiAgICAgIFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcyBzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLS1ib3R0b21cIixcbiAgICB0aXRsZTogXCJzdi10aXRsZSBzdi1xdWVzdGlvbl9fdGl0bGVcIixcbiAgICBidXR0b246IFwiYnV0dG9uXCIsXG4gICAgYnV0dG9uQWRkOiBcImJ1dHRvbiBzdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIixcbiAgICBidXR0b25SZW1vdmU6IFwic3ZfcF9yZW1vdmVfYnRuXCIsXG4gICAgYnV0dG9uUmVtb3ZlUmlnaHQ6IFwiYnV0dG9uIHN2LXBhbmVsZHluYW1pY19fcmVtb3ZlLWJ0bi0tcmlnaHRcIixcbiAgICBidXR0b25QcmV2OiBcInN2LXBhbmVsZHluYW1pY19fcHJldi1idG5cIixcbiAgICBidXR0b25OZXh0OiBcInN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIixcbiAgICBwcm9ncmVzc0NvbnRhaW5lcjogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLWNvbnRhaW5lclwiLFxuICAgIHByb2dyZXNzOiBcInN2LXByb2dyZXNzXCIsXG4gICAgcHJvZ3Jlc3NCYXI6IFwic3YtcHJvZ3Jlc3NfX2JhclwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIixcbiAgICBwYW5lbFdyYXBwZXI6IFwic3ZfcF93cmFwcGVyXCIsXG4gICAgcGFuZWxXcmFwcGVySW5Sb3c6IFwic3ZfcF93cmFwcGVyX2luX3Jvd1wiLFxuICB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInRhYmxlXCIsXG4gICAgaXRlbVRpdGxlOiBcIlwiLFxuICAgIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgZm9ybS1jb250cm9sXCIsXG4gIH0sXG4gIHJhZGlvZ3JvdXA6IHtcbiAgICByb290OiBcInN2X3FjYmMgZm9ybS1pbmxpbmVcIixcbiAgICBpdGVtOiBcInJhZGlvXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9yYWRpb2dyb3VwX2lubGluZVwiLFxuICAgIGxhYmVsOiBcIlwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBpdGVtQ29udHJvbDogXCJcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaXJjbGVcIixcbiAgICBvdGhlcjogXCJzdl9xX3JhZGlvZ3JvdXBfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyIGJ1dHRvblwiLFxuICAgIGNvbHVtbjogXCJzdl9xX3NlbGVjdF9jb2x1bW5cIixcbiAgfSxcbiAgYnV0dG9uZ3JvdXA6IHtcbiAgICByb290OiBcInN2LWJ1dHRvbi1ncm91cFwiLFxuICAgIGl0ZW06IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtXCIsXG4gICAgaXRlbUljb246IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLWljb25cIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS1kZWNvcmF0b3JcIixcbiAgICBpdGVtQ2FwdGlvbjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tY2FwdGlvblwiLFxuICAgIGl0ZW1Ib3ZlcjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tLWhvdmVyXCIsXG4gICAgaXRlbVNlbGVjdGVkOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS0tc2VsZWN0ZWRcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLS1kaXNhYmxlZFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXG4gIH0sXG4gIGltYWdlcGlja2VyOiB7XG4gICAgcm9vdDogXCJzdl9pbWdzZWxcIixcbiAgICBpdGVtOiBcInN2X3FfaW1nc2VsXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIixcbiAgICBsYWJlbDogXCJzdl9xX2ltZ3NlbF9sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfaW1nc2VsX2NvbnRyb2xfaXRlbVwiLFxuICAgIGltYWdlOiBcInN2X3FfaW1nc2VsX2ltYWdlXCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9pbWdzZWxfdGV4dFwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiLFxuICB9LFxuICByYXRpbmc6IHtcbiAgICByb290OiBcImJ0bi1ncm91cFwiLFxuICAgIGl0ZW06IFwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zZWNvbmRhcnlcIixcbiAgICBzZWxlY3RlZDogXCJhY3RpdmVcIixcbiAgICBtaW5UZXh0OiBcInN2X3FfcmF0aW5nX21pbl90ZXh0XCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9yYXRpbmdfaXRlbV90ZXh0XCIsXG4gICAgbWF4VGV4dDogXCJzdl9xX3JhdGluZ19tYXhfdGV4dFwiLFxuICAgIGRpc2FibGVkOiBcIlwiLFxuICB9LFxuICB0ZXh0OiBcImZvcm0tY29udHJvbFwiLFxuICBleHByZXNzaW9uOiBcImZvcm0tY29udHJvbFwiLFxuICBmaWxlOiB7XG4gICAgcm9vdDogXCJzdl9xX2ZpbGVcIixcbiAgICBwbGFjZWhvbGRlcklucHV0OiBcInN2X3FfZmlsZV9wbGFjZWhvbGRlclwiLFxuICAgIHByZXZpZXc6IFwic3ZfcV9maWxlX3ByZXZpZXdcIixcbiAgICByZW1vdmVCdXR0b246IFwic3ZfcV9maWxlX3JlbW92ZV9idXR0b25cIixcbiAgICBmaWxlSW5wdXQ6IFwic3ZfcV9maWxlX2lucHV0XCIsXG4gICAgcmVtb3ZlRmlsZTogXCJzdl9xX2ZpbGVfcmVtb3ZlXCIsXG4gICAgcmVtb3ZlRmlsZVN2ZzogXCJzdi1oaWRkZW5cIixcbiAgICBmaWxlRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGZpbGVTaWduQm90dG9tOiBcInN2LWhpZGRlblwiLFxuICAgIHJlbW92ZUJ1dHRvbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcbiAgfSxcbiAgc2lnbmF0dXJlcGFkOiB7XG4gICAgcm9vdDogXCJzdl9xX3NpZ25hdHVyZXBhZCBzanNfc3BfY29udGFpbmVyXCIsXG4gICAgY29udHJvbHM6IFwic2pzX3NwX2NvbnRyb2xzXCIsXG4gICAgcGxhY2Vob2xkZXI6IFwic2pzX3NwX3BsYWNlaG9sZGVyXCIsXG4gICAgY2xlYXJCdXR0b246IFwic2pzX3NwX2NsZWFyXCIsXG4gIH0sXG4gIHNhdmVEYXRhOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBzYXZpbmc6IFwiYWxlcnQgYWxlcnQtaW5mb1wiLFxuICAgIGVycm9yOiBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiLFxuICAgIHN1Y2Nlc3M6IFwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiLFxuICAgIHNhdmVBZ2FpbkJ1dHRvbjogXCJcIixcbiAgfSxcbiAgd2luZG93OiB7XG4gICAgcm9vdDogXCJtb2RhbC1jb250ZW50XCIsXG4gICAgYm9keTogXCJtb2RhbC1ib2R5XCIsXG4gICAgaGVhZGVyOiB7XG4gICAgICByb290OiBcIm1vZGFsLWhlYWRlciBwYW5lbC10aXRsZVwiLFxuICAgICAgdGl0bGU6IFwicHVsbC1sZWZ0XCIsXG4gICAgICBidXR0b246IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHRcIixcbiAgICAgIGJ1dHRvbkV4cGFuZGVkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLXVwXCIsXG4gICAgICBidXR0b25Db2xsYXBzZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tZG93blwiLFxuICAgIH0sXG4gIH0sXG59O1xuKDxhbnk+c3VydmV5Q3NzKVtcImJvb3RzdHJhcFwiXSA9IGRlZmF1bHRCb290c3RyYXBDc3M7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9jc3NzdGFuZGFyZFwiO1xuXG5leHBvcnQgdmFyIGRlZmF1bHRCb290c3RyYXBNYXRlcmlhbENzcyA9IHtcbiAgcm9vdDogXCJzdl9tYWluIHN2X2Jvb3RzdHJhcG1hdGVyaWFsX2Nzc1wiLFxuICBjb250YWluZXI6IFwic3ZfY29udGFpbmVyXCIsXG4gIGhlYWRlcjogXCJjYXJkLWhlYWRpbmdcIixcbiAgYm9keTogXCJjYXJkLWJvZHlcIixcbiAgYm9keUVtcHR5OiBcImNhcmQtYm9keSBzdl9ib2R5X2VtcHR5XCIsXG4gIGZvb3RlcjogXCJjYXJkLWZvb3RlclwiLFxuICB0aXRsZTogXCJcIixcbiAgZGVzY3JpcHRpb246IFwiXCIsXG4gIGxvZ286IFwic3ZfbG9nb1wiLFxuICBsb2dvSW1hZ2U6IFwic3ZfbG9nb19faW1hZ2VcIixcbiAgaGVhZGVyVGV4dDogXCJzdl9oZWFkZXJfX3RleHRcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJcIixcbiAgbmF2aWdhdGlvbjoge1xuICAgIGNvbXBsZXRlOiBcImJ0biBzdl9jb21wbGV0ZV9idG4gYnRuLXByaW1hcnlcIixcbiAgICBwcmV2OiBcImJ0biBzdl9wcmV2X2J0biBidG4tcHJpbWFyeVwiLFxuICAgIG5leHQ6IFwiYnRuIHN2X25leHRfYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgc3RhcnQ6IFwiYnRuIHN2X3N0YXJ0X2J0biBidG4tcHJpbWFyeVwiLFxuICAgIHByZXZpZXc6IFwiYnRuIHN2X3ByZXZpZXdfYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgZWRpdDogXCJidG4gc3ZfZWRpdF9idG4gYnRuLXByaW1hcnlcIixcbiAgfSxcbiAgcHJvZ3Jlc3M6IFwicHJvZ3Jlc3MgY2VudGVyLWJsb2NrIG14LWF1dG8gbWItNFwiLFxuICBwcm9ncmVzc0JhcjogXCJwcm9ncmVzcy1iYXJcIixcbiAgcHJvZ3Jlc3NUZXh0VW5kZXJCYXI6IFwic3YtaGlkZGVuXCIsXG4gIHByb2dyZXNzQnV0dG9uc0NvbnRhaW5lckNlbnRlcjogXCJzdl9wcm9ncmVzcy1idXR0b25zX19jb250YWluZXItY2VudGVyXCIsXG4gIHByb2dyZXNzQnV0dG9uc0NvbnRhaW5lcjogXCJzdl9wcm9ncmVzcy1idXR0b25zX19jb250YWluZXJcIixcbiAgcHJvZ3Jlc3NCdXR0b25zSW1hZ2VCdXR0b25MZWZ0OiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2ltYWdlLWJ1dHRvbi1sZWZ0XCIsXG4gIHByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uUmlnaHQ6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19faW1hZ2UtYnV0dG9uLXJpZ2h0XCIsXG4gIHByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uSGlkZGVuOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2ltYWdlLWJ1dHRvbi0taGlkZGVuXCIsXG4gIHByb2dyZXNzQnV0dG9uc0xpc3RDb250YWluZXI6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1jb250YWluZXJcIixcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0XCIsXG4gIHByb2dyZXNzQnV0dG9uc0xpc3RFbGVtZW50UGFzc2VkOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tcGFzc2VkXCIsXG4gIHByb2dyZXNzQnV0dG9uc0xpc3RFbGVtZW50Q3VycmVudDpcbiAgICBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tY3VycmVudFwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudE5vbkNsaWNrYWJsZTpcbiAgICBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tbm9uY2xpY2thYmxlXCIsXG4gIHByb2dyZXNzQnV0dG9uc1BhZ2VUaXRsZTogXCJzdl9wcm9ncmVzcy1idXR0b25zX19wYWdlLXRpdGxlXCIsXG4gIHByb2dyZXNzQnV0dG9uc1BhZ2VEZXNjcmlwdGlvbjogXCJzdl9wcm9ncmVzcy1idXR0b25zX19wYWdlLWRlc2NyaXB0aW9uXCIsXG4gIHBhZ2U6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gIH0sXG4gIHBhZ2VUaXRsZTogXCJcIixcbiAgcGFnZURlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gIHJvdzogXCJzdl9yb3dcIixcbiAgcXVlc3Rpb246IHtcbiAgICBtYWluUm9vdDogXCJzdl9xc3RuIGZvcm0tZ3JvdXAgYm1kLWZvcm0tZ3JvdXBcIixcbiAgICBmbG93Um9vdDogXCJzdl9xX2Zsb3cgZm9ybS1ncm91cCBibWQtZm9ybS1ncm91cFwiLFxuICAgIGhlYWRlcjogXCJcIixcbiAgICBoZWFkZXJMZWZ0OiBcInRpdGxlLWxlZnRcIixcbiAgICBjb250ZW50OiBcIlwiLFxuICAgIGNvbnRlbnRMZWZ0OiBcImNvbnRlbnQtbGVmdFwiLFxuICAgIHRpdGxlTGVmdFJvb3Q6IFwic3ZfcXN0bl9sZWZ0XCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2X3FfcmVxdWlyZWRfdGV4dFwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIHRpdGxlRXhwYW5kYWJsZTogXCJzdl9xX3RpdGxlX2V4cGFuZGFibGVcIixcbiAgICBudW1iZXI6IFwic3ZfcV9udW1cIixcbiAgICBkZXNjcmlwdGlvbjogXCJzbWFsbFwiLFxuICAgIGRlc2NyaXB0aW9uVW5kZXJJbnB1dDogXCJzbWFsbFwiLFxuICAgIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgcmVxdWlyZWQ6IFwiXCIsXG4gICAgdGl0bGVSZXF1aXJlZDogXCJcIixcbiAgICBoYXNFcnJvcjogXCJoYXMtZXJyb3JcIixcbiAgICBpbmRlbnQ6IDIwLFxuICAgIGZvcm1Hcm91cDogXCJmb3JtLWdyb3VwIGJtZC1mb3JtLWdyb3VwXCIsXG4gIH0sXG4gIHBhbmVsOiB7XG4gICAgdGl0bGU6IFwic3ZfcF90aXRsZVwiLFxuICAgIHRpdGxlRXhwYW5kYWJsZTogXCJzdl9wX3RpdGxlX2V4cGFuZGFibGVcIixcbiAgICB0aXRsZU9uRXJyb3I6IFwiXCIsXG4gICAgaWNvbjogXCJzdl9wYW5lbF9pY29uXCIsXG4gICAgaWNvbkV4cGFuZGVkOiBcInN2X2V4cGFuZGVkXCIsXG4gICAgZGVzY3JpcHRpb246IFwic21hbGwgc3ZfcF9kZXNjcmlwdGlvblwiLFxuICAgIGNvbnRhaW5lcjogXCJzdl9wX2NvbnRhaW5lclwiLFxuICAgIGZvb3RlcjogXCJzdl9wX2Zvb3RlclwiLFxuICAgIG51bWJlcjogXCJzdl9xX251bVwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJzdl9xX3JlcXVpcmVkX3RleHRcIixcbiAgfSxcbiAgZXJyb3I6IHtcbiAgICByb290OiBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiLFxuICAgIGljb246IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1leGNsYW1hdGlvbi1zaWduXCIsXG4gICAgaXRlbTogXCJcIixcbiAgICBsb2NhdGlvblRvcDogXCJzdl9xc3RuX2Vycm9yX3RvcFwiLFxuICAgIGxvY2F0aW9uQm90dG9tOiBcInN2X3FzdG5fZXJyb3JfYm90dG9tXCIsXG4gIH0sXG5cbiAgYm9vbGVhbjoge1xuICAgIHJvb3Q6IFwic3ZfcWJsbiBjaGVja2JveFwiLFxuICAgIGl0ZW06IFwic3YtYm9vbGVhblwiLFxuICAgIGNvbnRyb2w6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1ib29sZWFuLS1jaGVja2VkIGNoZWNrZWRcIixcbiAgICBpdGVtSW5kZXRlcm1pbmF0ZTogXCJzdi1ib29sZWFuLS1pbmRldGVybWluYXRlXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWJvb2xlYW4tLWRpc2FibGVkXCIsXG4gICAgc3dpdGNoOiBcInN2LWJvb2xlYW5fX3N3aXRjaFwiLFxuICAgIHNsaWRlcjogXCJzdi1ib29sZWFuX19zbGlkZXJcIixcbiAgICBzbGlkZXJUZXh0OiBcInN2LWhpZGRlblwiLFxuICAgIGxhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsIFwiLFxuICAgIGRpc2FibGVkTGFiZWw6IFwic3YtYm9vbGVhbl9fbGFiZWwtLWRpc2FibGVkXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwic3YtaXRlbV9fZGVjb3JhdG9yIHN2LWJvb2xlYW5fX2RlY29yYXRvciBcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWl0ZW1fX3N2ZyAgc3YtYm9vbGVhbl9fc3ZnXCIsXG4gICAgY2hlY2tlZFBhdGg6IFwic3YtYm9vbGVhbl9fY2hlY2tlZC1wYXRoXCIsXG4gICAgdW5jaGVja2VkUGF0aDogXCJzdi1ib29sZWFuX191bmNoZWNrZWQtcGF0aFwiLFxuICAgIGluZGV0ZXJtaW5hdGVQYXRoOiBcInN2LWJvb2xlYW5fX2luZGV0ZXJtaW5hdGUtcGF0aFwiLFxuICB9LFxuICBjaGVja2JveDoge1xuICAgIHJvb3Q6IFwic3ZfcWNieFwiLFxuICAgIGl0ZW06IFwiY2hlY2tib3hcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbVNlbGVjdEFsbDogXCJzdl9xX2NoZWNrYm94X3NlbGVjdGFsbFwiLFxuICAgIGl0ZW1Ob25lOiBcInN2X3FfY2hlY2tib3hfbm9uZVwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9jaGVja2JveF9pbmxpbmVcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGl0ZW1Db250cm9sOiBcIlwiLFxuICAgIGxhYmVsOiBcIlwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBjb250cm9sTGFiZWw6IFwiXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiY2hlY2tib3gtZGVjb3JhdG9yXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9jaGVja2JveF9vdGhlciBmb3JtLWNvbnRyb2xcIixcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCIsXG4gIH0sXG4gIHJhbmtpbmc6IHtcbiAgICByb290OiBcInN2LXJhbmtpbmdcIixcbiAgICByb290TW9iaWxlTW9kOiBcInN2LXJhbmtpbmctLW1vYmlsZVwiLFxuICAgIHJvb3REcmFnTW9kOiBcInN2LXJhbmtpbmctLWRyYWdcIixcbiAgICBpdGVtOiBcInN2LXJhbmtpbmctaXRlbVwiLFxuICAgIGl0ZW1Db250ZW50OiBcInN2LXJhbmtpbmctaXRlbV9fY29udGVudFwiLFxuICAgIGl0ZW1JbmRleDogXCJzdi1yYW5raW5nLWl0ZW1fX2luZGV4XCIsXG4gICAgLy8gaXRlbVRleHQ6IFwic3YtcmFua2luZy1pdGVtX190ZXh0XCIsXG4gICAgY29udHJvbExhYmVsOiBcInN2LXJhbmtpbmctaXRlbV9fdGV4dFwiLFxuICAgIGl0ZW1HaG9zdE5vZGU6IFwic3YtcmFua2luZy1pdGVtX19naG9zdFwiLFxuICAgIGl0ZW1JY29uQ29udGFpbmVyOiBcInN2LXJhbmtpbmctaXRlbV9faWNvbi1jb250YWluZXJcIixcbiAgICBpdGVtSWNvbjogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb25cIixcbiAgICBpdGVtSWNvbkhvdmVyTW9kOiBcInN2LXJhbmtpbmctaXRlbV9faWNvbi0taG92ZXJcIixcbiAgICBpdGVtSWNvbkZvY3VzTW9kOiBcInN2LXJhbmtpbmctaXRlbV9faWNvbi0tZm9jdXNcIixcbiAgICBpdGVtR2hvc3RNb2Q6IFwic3YtcmFua2luZy1pdGVtLS1naG9zdFwiLFxuICAgIGl0ZW1EcmFnTW9kOiBcInN2LXJhbmtpbmctaXRlbS0tZHJhZ1wiLFxuICB9LFxuICBjb21tZW50OiBcImZvcm0tY29udHJvbFwiLFxuICBkcm9wZG93bjoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgY29udHJvbDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICBvdGhlcjogXCJzdl9xX2RkX290aGVyIGZvcm0tY29udHJvbFwiLFxuICB9LFxuICBodG1sOiB7IHJvb3Q6IFwiXCIgfSxcbiAgaW1hZ2U6IHsgcm9vdDogXCJzdl9xX2ltYWdlXCIsIGltYWdlOiBcInN2X2ltYWdlX2ltYWdlXCIgfSxcbiAgbWF0cml4OiB7XG4gICAgcm9vdDogXCJ0YWJsZSBzdl9xX21hdHJpeFwiLFxuICAgIHJvdzogXCJmb3JtLWdyb3VwIGJtZC1mb3JtLWdyb3VwXCIsXG4gICAgbGFiZWw6IFwic3ZfcV9tX2xhYmVsIHJhZGlvLWlubGluZVwiLFxuICAgIGNlbGxUZXh0OiBcInN2X3FfbV9jZWxsX3RleHRcIixcbiAgICBjZWxsVGV4dFNlbGVjdGVkOiBcInN2X3FfbV9jZWxsX3NlbGVjdGVkIGJnLXByaW1hcnlcIixcbiAgICBjZWxsTGFiZWw6IFwic3ZfcV9tX2NlbGxfbGFiZWxcIixcbiAgICBpdGVtVmFsdWU6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiYm1kLXJhZGlvXCIsXG4gIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGl0ZW1WYWx1ZTogXCJmb3JtLWdyb3VwIGJtZC1mb3JtLWdyb3VwXCIsXG4gICAgaGVhZGVyQ2VsbDogXCJzdl9tYXRyaXhfY2VsbF9oZWFkZXJcIixcbiAgICByb3c6IFwic3ZfbWF0cml4X3Jvd1wiLFxuICAgIGRldGFpbFJvdzogXCJzdl9tYXRyaXhfZGV0YWlsX3Jvd1wiLFxuICAgIGRldGFpbFJvd1RleHQ6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX3Jvd3RleHRcIixcbiAgICBkZXRhaWxDZWxsOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbFwiLFxuICAgIGRldGFpbEJ1dHRvbjogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uXCIsXG4gICAgZGV0YWlsQnV0dG9uRXhwYW5kZWQ6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX2J1dHRvbl9leHBhbmRlZFwiLFxuICAgIGRldGFpbEljb246IFwic3ZfZGV0YWlsX3BhbmVsX2ljb25cIixcbiAgICBkZXRhaWxJY29uRXhwYW5kZWQ6IFwic3ZfZGV0YWlsX2V4cGFuZGVkXCIsXG4gICAgZGV0YWlsUGFuZWxDZWxsOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9wYW5lbFwiLFxuICAgIGFjdGlvbnNDZWxsOiBcInN2X21hdHJpeF9jZWxsIHN2X21hdHJpeF9jZWxsX2FjdGlvbnNcIixcbiAgfSxcbiAgbWF0cml4ZHluYW1pYzoge1xuICAgIG1haW5Sb290OiBcInN2X3FzdG5cIixcbiAgICBmbG93Um9vdDogXCJzdl9xX2Zsb3dcIixcbiAgICByb290OiBcInRhYmxlXCIsXG4gICAgYnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxuICAgIGl0ZW1WYWx1ZTogXCJmb3JtLWdyb3VwIGJtZC1mb3JtLWdyb3VwXCIsXG4gICAgYnV0dG9uQWRkOiBcIlwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJcIixcbiAgICBpY29uQWRkOiBcIlwiLFxuICAgIGljb25SZW1vdmU6IFwiXCIsXG4gICAgaWNvbkRyYWc6IFwic3YtbWF0cml4ZHluYW1pY19fZHJhZy1pY29uXCIsXG4gICAgaGVhZGVyQ2VsbDogXCJzdl9tYXRyaXhfY2VsbF9oZWFkZXJcIixcbiAgICByb3c6IFwic3ZfbWF0cml4X3Jvd1wiLFxuICAgIGRldGFpbFJvdzogXCJzdl9tYXRyaXhfZGV0YWlsX3Jvd1wiLFxuICAgIGRldGFpbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsXCIsXG4gICAgZGV0YWlsQnV0dG9uOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9idXR0b25cIixcbiAgICBkZXRhaWxCdXR0b25FeHBhbmRlZDogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uX2V4cGFuZGVkXCIsXG4gICAgZGV0YWlsSWNvbjogXCJzdl9kZXRhaWxfcGFuZWxfaWNvblwiLFxuICAgIGRldGFpbEljb25FeHBhbmRlZDogXCJzdl9kZXRhaWxfZXhwYW5kZWRcIixcbiAgICBkZXRhaWxQYW5lbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX3BhbmVsXCIsXG4gICAgYWN0aW9uc0NlbGw6IFwic3ZfbWF0cml4X2NlbGwgc3ZfbWF0cml4X2NlbGxfYWN0aW9uc1wiLFxuICAgIGVtcHR5Um93c1NlY3Rpb246IFwic3ZfbWF0cml4X2VtcHR5X3Jvd3Nfc2VjdGlvblwiLFxuICAgIGVtcHR5Um93c1RleHQ6IFwic3ZfbWF0cml4X2VtcHR5X3Jvd3NfdGV4dFwiLFxuICAgIGVtcHR5Um93c0J1dHRvbjogXCJcIixcbiAgfSxcbiAgcGFuZWxkeW5hbWljOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBuYXZpZ2F0aW9uOiBcInN2LXBhbmVsZHluYW1pY19fbmF2aWdhdGlvblwiLFxuICAgIHByb2dyZXNzVG9wOiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3Mgc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy0tdG9wXCIsXG4gICAgcHJvZ3Jlc3NCb3R0b206XG4gICAgICBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3Mgc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy0tYm90dG9tXCIsXG4gICAgdGl0bGU6IFwic3YtdGl0bGUgc3YtcXVlc3Rpb25fX3RpdGxlXCIsXG4gICAgYnV0dG9uOiBcImJ1dHRvblwiLFxuICAgIGJ1dHRvbkFkZDogXCJidXR0b24gc3YtcGFuZWxkeW5hbWljX19hZGQtYnRuIGJ0biBidG4tcHJpbWFyeVwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJidXR0b24gc3YtcGFuZWxkeW5hbWljX19yZW1vdmUtYnRuIGJ0biBidG4tcHJpbWFyeVwiLFxuICAgIGJ1dHRvblJlbW92ZVJpZ2h0OiBcInN2LXBhbmVsZHluYW1pY19fcmVtb3ZlLWJ0bi0tcmlnaHRcIixcbiAgICBidXR0b25QcmV2OiBcInN2LXBhbmVsZHluYW1pY19fcHJldi1idG5cIixcbiAgICBidXR0b25OZXh0OiBcInN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIixcbiAgICBwcm9ncmVzc0NvbnRhaW5lcjogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLWNvbnRhaW5lclwiLFxuICAgIHByb2dyZXNzOiBcInN2LXByb2dyZXNzXCIsXG4gICAgcHJvZ3Jlc3NCYXI6IFwic3YtcHJvZ3Jlc3NfX2JhclwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIixcbiAgICBwYW5lbFdyYXBwZXI6IFwic3ZfcF93cmFwcGVyXCIsXG4gICAgcGFuZWxXcmFwcGVySW5Sb3c6IFwic3ZfcF93cmFwcGVyX2luX3Jvd1wiLFxuICB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInRhYmxlXCIsXG4gICAgaXRlbVRpdGxlOiBcIlwiLFxuICAgIHJvdzogXCJmb3JtLWdyb3VwIGJtZC1mb3JtLWdyb3VwXCIsXG4gICAgaXRlbVZhbHVlOiBcInN2X3FfbXRfaXRlbV92YWx1ZSBmb3JtLWNvbnRyb2xcIixcbiAgfSxcbiAgcmFkaW9ncm91cDoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgaXRlbTogXCJyYWRpb1wiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtSW5saW5lOiBcInN2X3FfcmFkaW9ncm91cF9pbmxpbmVcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGxhYmVsOiBcIlwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBpdGVtQ29udHJvbDogXCJcIixcbiAgICBjb250cm9sTGFiZWw6IFwic3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfbGFiZWxcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJibWQtcmFkaW9cIixcbiAgICBvdGhlcjogXCJzdl9xX3JhZGlvZ3JvdXBfb3RoZXIgZm9ybS1jb250cm9sXCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyIGJ1dHRvbiBidG4gYnRuLXByaW1hcnlcIixcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCIsXG4gIH0sXG4gIGJ1dHRvbmdyb3VwOiB7XG4gICAgcm9vdDogXCJzdi1idXR0b24tZ3JvdXBcIixcbiAgICBpdGVtOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbVwiLFxuICAgIGl0ZW1JY29uOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS1pY29uXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tZGVjb3JhdG9yXCIsXG4gICAgaXRlbUNhcHRpb246IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLWNhcHRpb25cIixcbiAgICBpdGVtU2VsZWN0ZWQ6IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLS1zZWxlY3RlZFwiLFxuICAgIGl0ZW1Ib3ZlcjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tLWhvdmVyXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS0tZGlzYWJsZWRcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxuICB9LFxuICBpbWFnZXBpY2tlcjoge1xuICAgIHJvb3Q6IFwic3ZfaW1nc2VsXCIsXG4gICAgaXRlbTogXCJzdl9xX2ltZ3NlbFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtSW5saW5lOiBcInN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lXCIsXG4gICAgbGFiZWw6IFwic3ZfcV9pbWdzZWxfbGFiZWxcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdl9xX2ltZ3NlbF9jb250cm9sX2l0ZW1cIixcbiAgICBpbWFnZTogXCJzdl9xX2ltZ3NlbF9pbWFnZVwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfaW1nc2VsX3RleHRcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzdl9xX3JhZGlvZ3JvdXBfY2xlYXJcIixcbiAgfSxcbiAgcmF0aW5nOiB7XG4gICAgcm9vdDogXCJidG4tZ3JvdXBcIixcbiAgICBpdGVtOiBcImJ0biBidG4tZGVmYXVsdCBidG4tc2Vjb25kYXJ5XCIsXG4gICAgc2VsZWN0ZWQ6IFwiYWN0aXZlXCIsXG4gICAgbWluVGV4dDogXCJzdl9xX3JhdGluZ19taW5fdGV4dFwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiLFxuICAgIG1heFRleHQ6IFwic3ZfcV9yYXRpbmdfbWF4X3RleHRcIixcbiAgICBkaXNhYmxlZDogXCJcIixcbiAgfSxcbiAgdGV4dDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZXhwcmVzc2lvbjogXCJmb3JtLWNvbnRyb2xcIixcbiAgZmlsZToge1xuICAgIHJvb3Q6IFwiZm9ybS1ncm91cCBibWQtZm9ybS1ncm91cCBpcy1maWxlaW5wdXQgc3ZfcV9maWxlXCIsXG4gICAgcGxhY2Vob2xkZXJJbnB1dDogXCJcIixcbiAgICBwcmV2aWV3OiBcInN2X3FfZmlsZV9wcmV2aWV3XCIsXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCIsXG4gICAgZmlsZUlucHV0OiBcInN2X3FfZmlsZV9pbnB1dFwiLFxuICAgIHJlbW92ZUZpbGU6IFwic3ZfcV9maWxlX3JlbW92ZVwiLFxuICAgIHJlbW92ZUZpbGVTdmc6IFwic3YtaGlkZGVuXCIsXG4gICAgZmlsZURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBmaWxlU2lnbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcbiAgICByZW1vdmVCdXR0b25Cb3R0b206IFwic3YtaGlkZGVuXCIsXG4gIH0sXG4gIHNpZ25hdHVyZXBhZDoge1xuICAgIHJvb3Q6IFwic3ZfcV9zaWduYXR1cmVwYWQgc2pzX3NwX2NvbnRhaW5lclwiLFxuICAgIGNvbnRyb2xzOiBcInNqc19zcF9jb250cm9sc1wiLFxuICAgIHBsYWNlaG9sZGVyOiBcInNqc19zcF9wbGFjZWhvbGRlclwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInNqc19zcF9jbGVhclwiLFxuICB9LFxuICBzYXZlRGF0YToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgc2F2aW5nOiBcImFsZXJ0IGFsZXJ0LWluZm9cIixcbiAgICBlcnJvcjogXCJhbGVydCBhbGVydC1kYW5nZXJcIixcbiAgICBzdWNjZXNzOiBcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIixcbiAgICBzYXZlQWdhaW5CdXR0b246IFwiXCIsXG4gIH0sXG4gIHdpbmRvdzoge1xuICAgIHJvb3Q6IFwibW9kYWwtY29udGVudFwiLFxuICAgIGJvZHk6IFwibW9kYWwtYm9keVwiLFxuICAgIGhlYWRlcjoge1xuICAgICAgcm9vdDogXCJtb2RhbC1oZWFkZXIgY2FyZC10aXRsZVwiLFxuICAgICAgdGl0bGU6IFwicHVsbC1sZWZ0XCIsXG4gICAgICBidXR0b246IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHRcIixcbiAgICAgIGJ1dHRvbkV4cGFuZGVkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLXVwXCIsXG4gICAgICBidXR0b25Db2xsYXBzZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tZG93blwiLFxuICAgIH0sXG4gIH0sXG59O1xuKDxhbnk+c3VydmV5Q3NzKVtcImJvb3RzdHJhcG1hdGVyaWFsXCJdID0gZGVmYXVsdEJvb3RzdHJhcE1hdGVyaWFsQ3NzO1xuIiwiaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4vY3Nzc3RhbmRhcmRcIjtcbmV4cG9ydCB2YXIgbW9kZXJuQ3NzID0ge1xuICByb290OiBcInN2LXJvb3QtbW9kZXJuXCIsXG4gIGNvbnRhaW5lcjogXCJzdi1jb250YWluZXItbW9kZXJuXCIsXG4gIGhlYWRlcjogXCJzdi10aXRsZSBzdi1jb250YWluZXItbW9kZXJuX190aXRsZVwiLFxuICBib2R5OiBcInN2LWJvZHlcIixcbiAgYm9keUVtcHR5OiBcInN2LWJvZHkgc3YtYm9keS0tZW1wdHlcIixcbiAgZm9vdGVyOiBcInN2LWZvb3RlciBzdi1ib2R5X19mb290ZXIgc3YtY2xlYXJmaXhcIixcbiAgdGl0bGU6IFwiXCIsXG4gIGRlc2NyaXB0aW9uOiBcIlwiLFxuICBsb2dvOiBcInN2LWxvZ29cIixcbiAgbG9nb0ltYWdlOiBcInN2LWxvZ29fX2ltYWdlXCIsXG4gIGhlYWRlclRleHQ6IFwic3YtaGVhZGVyX190ZXh0XCIsXG4gIG5hdmlnYXRpb25CdXR0b246IFwiXCIsXG4gIGNvbXBsZXRlZFBhZ2U6IFwic3YtY29tcGxldGVkcGFnZVwiLFxuICBuYXZpZ2F0aW9uOiB7XG4gICAgY29tcGxldGU6IFwic3YtYnRuIHN2LWZvb3Rlcl9fY29tcGxldGUtYnRuXCIsXG4gICAgcHJldjogXCJzdi1idG4gc3YtZm9vdGVyX19wcmV2LWJ0blwiLFxuICAgIG5leHQ6IFwic3YtYnRuIHN2LWZvb3Rlcl9fbmV4dC1idG5cIixcbiAgICBzdGFydDogXCJzdi1idG4gc3YtZm9vdGVyX19zdGFydC1idG5cIixcbiAgICBwcmV2aWV3OiBcInN2LWJ0biBzdi1mb290ZXJfX3ByZXZpZXctYnRuXCIsXG4gICAgZWRpdDogXCJzdi1idG4gc3YtZm9vdGVyX19lZGl0LWJ0blwiLFxuICB9LFxuICBwYW5lbDoge1xuICAgIHRpdGxlOiBcInN2LXRpdGxlIHN2LXBhbmVsX190aXRsZVwiLFxuICAgIHRpdGxlRXhwYW5kYWJsZTogXCJzdi1wYW5lbF9fdGl0bGUtLWV4cGFuZGFibGVcIixcbiAgICB0aXRsZU9uRXJyb3I6IFwic3YtcGFuZWxfX3RpdGxlLS1lcnJvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInN2LWRlc2NyaXB0aW9uIHN2LXBhbmVsX19kZXNjcmlwdGlvblwiLFxuICAgIGNvbnRhaW5lcjogXCJzdi1wYW5lbCBzdi1yb3dfX3BhbmVsXCIsXG4gICAgY29udGVudDogXCJzdi1wYW5lbF9fY29udGVudFwiLFxuICAgIGljb246IFwic3YtcGFuZWxfX2ljb25cIixcbiAgICBpY29uRXhwYW5kZWQ6IFwic3YtcGFuZWxfX2ljb24tLWV4cGFuZGVkXCIsXG4gICAgZm9vdGVyOiBcInN2LXBhbmVsX19mb290ZXJcIixcbiAgICByZXF1aXJlZFRleHQ6IFwic3YtcGFuZWxfX3JlcXVpcmVkLXRleHRcIixcbiAgICBudW1iZXI6IFwic3YtcXVlc3Rpb25fX251bVwiLFxuICB9LFxuICBwYW5lbGR5bmFtaWM6IHtcbiAgICByb290OiBcInN2LXBhbmVsZHluYW1pY1wiLFxuICAgIG5hdmlnYXRpb246IFwic3YtcGFuZWxkeW5hbWljX19uYXZpZ2F0aW9uXCIsXG4gICAgdGl0bGU6IFwic3YtdGl0bGUgc3YtcXVlc3Rpb25fX3RpdGxlXCIsXG4gICAgYnV0dG9uOiBcInN2LWJ0blwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJzdi1wYW5lbGR5bmFtaWNfX3JlbW92ZS1idG5cIixcbiAgICBidXR0b25SZW1vdmVSaWdodDogXCJzdi1wYW5lbGR5bmFtaWNfX3JlbW92ZS1idG4tLXJpZ2h0XCIsXG4gICAgYnV0dG9uQWRkOiBcInN2LXBhbmVsZHluYW1pY19fYWRkLWJ0blwiLFxuICAgIHByb2dyZXNzVG9wOiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3Mgc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy0tdG9wXCIsXG4gICAgcHJvZ3Jlc3NCb3R0b206XG4gICAgICBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3Mgc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy0tYm90dG9tXCIsXG4gICAgYnV0dG9uUHJldjogXCJzdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuXCIsXG4gICAgYnV0dG9uTmV4dDogXCJzdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuXCIsXG4gICAgcHJvZ3Jlc3NDb250YWluZXI6IFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy1jb250YWluZXJcIixcbiAgICBwcm9ncmVzczogXCJzdi1wcm9ncmVzc1wiLFxuICAgIHByb2dyZXNzQmFyOiBcInN2LXByb2dyZXNzX19iYXJcIixcbiAgICBwcm9ncmVzc1RleHQ6IFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy10ZXh0XCIsXG4gICAgc2VwYXJhdG9yOiBcInN2LXBhbmVsZHluYW1pY19fc2VwYXJhdG9yXCIsXG4gICAgcGFuZWxXcmFwcGVyOiBcInN2LXBhbmVsZHluYW1pY19fcGFuZWwtd3JhcHBlclwiLFxuICAgIHBhbmVsV3JhcHBlckluUm93OiBcInN2LXBhbmVsZHluYW1pY19fcGFuZWwtd3JhcHBlci0taW4tcm93XCIsXG4gIH0sXG4gIHByb2dyZXNzOiBcInN2LXByb2dyZXNzIHN2LWJvZHlfX3Byb2dyZXNzXCIsXG4gIHByb2dyZXNzQmFyOiBcInN2LXByb2dyZXNzX19iYXJcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcInN2LXByb2dyZXNzX190ZXh0XCIsXG4gIHByb2dyZXNzVGV4dEluQmFyOiBcInN2LWhpZGRlblwiLFxuICBwcm9ncmVzc0J1dHRvbnNDb250YWluZXJDZW50ZXI6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fY29udGFpbmVyLWNlbnRlclwiLFxuICBwcm9ncmVzc0J1dHRvbnNDb250YWluZXI6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fY29udGFpbmVyXCIsXG4gIHByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uTGVmdDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19pbWFnZS1idXR0b24tbGVmdFwiLFxuICBwcm9ncmVzc0J1dHRvbnNJbWFnZUJ1dHRvblJpZ2h0OiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2ltYWdlLWJ1dHRvbi1yaWdodFwiLFxuICBwcm9ncmVzc0J1dHRvbnNJbWFnZUJ1dHRvbkhpZGRlbjogXCJzdl9wcm9ncmVzcy1idXR0b25zX19pbWFnZS1idXR0b24tLWhpZGRlblwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0Q29udGFpbmVyOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtY29udGFpbmVyXCIsXG4gIHByb2dyZXNzQnV0dG9uc0xpc3Q6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdFwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudFBhc3NlZDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLXBhc3NlZFwiLFxuICBwcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudEN1cnJlbnQ6XG4gICAgXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLWN1cnJlbnRcIixcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdEVsZW1lbnROb25DbGlja2FibGU6XG4gICAgXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLW5vbmNsaWNrYWJsZVwiLFxuICBwcm9ncmVzc0J1dHRvbnNQYWdlVGl0bGU6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fcGFnZS10aXRsZVwiLFxuICBwcm9ncmVzc0J1dHRvbnNQYWdlRGVzY3JpcHRpb246IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fcGFnZS1kZXNjcmlwdGlvblwiLFxuICBwYWdlOiB7XG4gICAgcm9vdDogXCJzdi1wYWdlIHN2LWJvZHlfX3BhZ2VcIixcbiAgICB0aXRsZTogXCJzdi10aXRsZSBzdi1wYWdlX190aXRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInN2LWRlc2NyaXB0aW9uIHN2LXBhZ2VfX2Rlc2NyaXB0aW9uXCIsXG4gIH0sXG4gIHBhZ2VUaXRsZTogXCJzdi10aXRsZSBzdi1wYWdlX190aXRsZVwiLFxuICBwYWdlRGVzY3JpcHRpb246IFwic3YtZGVzY3JpcHRpb24gc3YtcGFnZV9fZGVzY3JpcHRpb25cIixcbiAgcm93OiBcInN2LXJvdyBzdi1jbGVhcmZpeFwiLFxuICBxdWVzdGlvbjoge1xuICAgIG1haW5Sb290OiBcInN2LXF1ZXN0aW9uIHN2LXJvd19fcXVlc3Rpb25cIixcbiAgICBmbG93Um9vdDogXCJzdi1xdWVzdGlvbiBzdi1yb3dfX3F1ZXN0aW9uIHN2LXJvd19fcXVlc3Rpb24tLWZsb3dcIixcbiAgICBhc0NlbGw6IFwic3YtdGFibGVfX2NlbGxcIixcbiAgICBoZWFkZXI6IFwic3YtcXVlc3Rpb25fX2hlYWRlclwiLFxuICAgIGhlYWRlckxlZnQ6IFwic3YtcXVlc3Rpb25fX2hlYWRlci0tbG9jYXRpb24tLWxlZnRcIixcbiAgICBoZWFkZXJUb3A6IFwic3YtcXVlc3Rpb25fX2hlYWRlci0tbG9jYXRpb24tLXRvcFwiLFxuICAgIGhlYWRlckJvdHRvbTogXCJzdi1xdWVzdGlvbl9faGVhZGVyLS1sb2NhdGlvbi0tYm90dG9tXCIsXG4gICAgY29udGVudDogXCJzdi1xdWVzdGlvbl9fY29udGVudFwiLFxuICAgIGNvbnRlbnRMZWZ0OiBcInN2LXF1ZXN0aW9uX19jb250ZW50LS1sZWZ0XCIsXG4gICAgdGl0bGVMZWZ0Um9vdDogXCJcIixcbiAgICB0aXRsZU9uQW5zd2VyOiBcInN2LXF1ZXN0aW9uX190aXRsZS0tYW5zd2VyXCIsXG4gICAgdGl0bGVPbkVycm9yOiBcInN2LXF1ZXN0aW9uX190aXRsZS0tZXJyb3JcIixcbiAgICB0aXRsZTogXCJzdi10aXRsZSBzdi1xdWVzdGlvbl9fdGl0bGVcIixcbiAgICB0aXRsZUV4cGFuZGFibGU6IFwic3YtcXVlc3Rpb25fX3RpdGxlLS1leHBhbmRhYmxlXCIsXG4gICAgaWNvbjogXCJzdi1xdWVzdGlvbl9faWNvblwiLFxuICAgIGljb25FeHBhbmRlZDogXCJzdi1xdWVzdGlvbl9faWNvbi0tZXhwYW5kZWRcIixcbiAgICByZXF1aXJlZFRleHQ6IFwic3YtcXVlc3Rpb25fX3JlcXVpcmVkLXRleHRcIixcbiAgICBudW1iZXI6IFwic3YtcXVlc3Rpb25fX251bVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInN2LWRlc2NyaXB0aW9uIHN2LXF1ZXN0aW9uX19kZXNjcmlwdGlvblwiLFxuICAgIGRlc2NyaXB0aW9uVW5kZXJJbnB1dDogXCJzdi1kZXNjcmlwdGlvbiBzdi1xdWVzdGlvbl9fZGVzY3JpcHRpb25cIixcbiAgICBjb21tZW50OiBcInN2LWNvbW1lbnRcIixcbiAgICByZXF1aXJlZDogXCJzdi1xdWVzdGlvbi0tcmVxdWlyZWRcIixcbiAgICB0aXRsZVJlcXVpcmVkOiBcInN2LXF1ZXN0aW9uX190aXRsZS0tcmVxdWlyZWRcIixcbiAgICBpbmRlbnQ6IDIwLFxuICAgIGZvb3RlcjogXCJzdi1xdWVzdGlvbl9fZm9vdGVyXCIsXG4gICAgZm9ybUdyb3VwOiBcInN2LXF1ZXN0aW9uX19mb3JtLWdyb3VwXCIsXG4gICAgaGFzRXJyb3I6IFwiXCIsXG4gICAgZGlzYWJsZWQ6IFwic3YtcXVlc3Rpb24tLWRpc2FibGVkXCIsXG4gIH0sXG4gIGltYWdlOiB7IHJvb3Q6IFwic3YtaW1hZ2VcIiwgaW1hZ2U6IFwic3ZfaW1hZ2VfaW1hZ2VcIiB9LFxuICBlcnJvcjoge1xuICAgIHJvb3Q6IFwic3YtcXVlc3Rpb25fX2VyYm94XCIsXG4gICAgaWNvbjogXCJcIixcbiAgICBpdGVtOiBcIlwiLFxuICAgIGxvY2F0aW9uVG9wOiBcInN2LXF1ZXN0aW9uX19lcmJveC0tbG9jYXRpb24tLXRvcFwiLFxuICAgIGxvY2F0aW9uQm90dG9tOiBcInN2LXF1ZXN0aW9uX19lcmJveC0tbG9jYXRpb24tLWJvdHRvbVwiLFxuICB9LFxuICBjaGVja2JveDoge1xuICAgIHJvb3Q6IFwic3Ytc2VsZWN0YmFzZVwiLFxuICAgIGl0ZW06IFwic3YtaXRlbSBzdi1jaGVja2JveCBzdi1zZWxlY3RiYXNlX19pdGVtXCIsXG4gICAgaXRlbVNlbGVjdEFsbDogXCJzdi1jaGVja2JveC0tc2VsZWN0YWxsXCIsXG4gICAgaXRlbU5vbmU6IFwic3YtY2hlY2tib3gtLW5vbmVcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtaXRlbS0tZGlzYWJsZWQgc3YtY2hlY2tib3gtLWRpc2FibGVkXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwic3YtY2hlY2tib3gtLWNoZWNrZWRcIixcbiAgICBpdGVtSG92ZXI6IFwic3YtY2hlY2tib3gtLWFsbG93aG92ZXJcIixcbiAgICBpdGVtSW5saW5lOiBcInN2LXNlbGVjdGJhc2VfX2l0ZW0tLWlubGluZVwiLFxuICAgIGxhYmVsOiBcInN2LXNlbGVjdGJhc2VfX2xhYmVsXCIsXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuIHN2LWl0ZW1fX2NvbnRyb2xcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWl0ZW1fX3N2ZyBzdi1jaGVja2JveF9fc3ZnXCIsXG4gICAgY29udHJvbExhYmVsOiBcInN2LWl0ZW1fX2NvbnRyb2wtbGFiZWxcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJzdi1pdGVtX19kZWNvcmF0b3Igc3YtY2hlY2tib3hfX2RlY29yYXRvclwiLFxuICAgIG90aGVyOiBcInN2LWNvbW1lbnQgc3YtcXVlc3Rpb25fX290aGVyXCIsXG4gICAgY29sdW1uOiBcInN2LXNlbGVjdGJhc2VfX2NvbHVtblwiLFxuICB9LFxuICByYW5raW5nOiB7XG4gICAgcm9vdDogXCJzdi1yYW5raW5nXCIsXG4gICAgcm9vdE1vYmlsZU1vZDogXCJzdi1yYW5raW5nLS1tb2JpbGVcIixcbiAgICByb290RHJhZ01vZDogXCJzdi1yYW5raW5nLS1kcmFnXCIsXG4gICAgaXRlbTogXCJzdi1yYW5raW5nLWl0ZW1cIixcbiAgICBpdGVtQ29udGVudDogXCJzdi1yYW5raW5nLWl0ZW1fX2NvbnRlbnRcIixcbiAgICBpdGVtSW5kZXg6IFwic3YtcmFua2luZy1pdGVtX19pbmRleFwiLFxuICAgIC8vIGl0ZW1UZXh0OiBcInN2LXJhbmtpbmctaXRlbV9fdGV4dFwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJzdi1yYW5raW5nLWl0ZW1fX3RleHRcIixcbiAgICBpdGVtR2hvc3ROb2RlOiBcInN2LXJhbmtpbmctaXRlbV9fZ2hvc3RcIixcbiAgICBpdGVtSWNvbkNvbnRhaW5lcjogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb24tY29udGFpbmVyXCIsXG4gICAgaXRlbUljb246IFwic3YtcmFua2luZy1pdGVtX19pY29uXCIsXG4gICAgaXRlbUljb25Ib3Zlck1vZDogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb24tLWhvdmVyXCIsXG4gICAgaXRlbUljb25Gb2N1c01vZDogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb24tLWZvY3VzXCIsXG4gICAgaXRlbUdob3N0TW9kOiBcInN2LXJhbmtpbmctaXRlbS0tZ2hvc3RcIixcbiAgICBpdGVtRHJhZ01vZDogXCJzdi1yYW5raW5nLWl0ZW0tLWRyYWdcIixcbiAgfSxcbiAgcmFkaW9ncm91cDoge1xuICAgIHJvb3Q6IFwic3Ytc2VsZWN0YmFzZVwiLFxuICAgIGl0ZW06IFwic3YtaXRlbSBzdi1yYWRpbyBzdi1zZWxlY3RiYXNlX19pdGVtXCIsXG4gICAgaXRlbUlubGluZTogXCJzdi1zZWxlY3RiYXNlX19pdGVtLS1pbmxpbmVcIixcbiAgICBsYWJlbDogXCJzdi1zZWxlY3RiYXNlX19sYWJlbFwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtaXRlbS0tZGlzYWJsZWQgc3YtcmFkaW8tLWRpc2FibGVkXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwic3YtcmFkaW8tLWNoZWNrZWRcIixcbiAgICBpdGVtSG92ZXI6IFwic3YtcmFkaW8tLWFsbG93aG92ZXJcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdi12aXN1YWxseWhpZGRlbiBzdi1pdGVtX19jb250cm9sXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1pdGVtX19zdmcgc3YtcmFkaW9fX3N2Z1wiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJzdi1pdGVtX19jb250cm9sLWxhYmVsXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwic3YtaXRlbV9fZGVjb3JhdG9yIHN2LXJhZGlvX19kZWNvcmF0b3JcIixcbiAgICBvdGhlcjogXCJzdi1jb21tZW50IHN2LXF1ZXN0aW9uX19vdGhlclwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2LWJ0biBzdi1zZWxlY3RiYXNlX19jbGVhci1idG5cIixcbiAgICBjb2x1bW46IFwic3Ytc2VsZWN0YmFzZV9fY29sdW1uXCIsXG4gIH0sXG4gIGJ1dHRvbmdyb3VwOiB7XG4gICAgcm9vdDogXCJzdi1idXR0b24tZ3JvdXBcIixcbiAgICBpdGVtOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbVwiLFxuICAgIGl0ZW1JY29uOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS1pY29uXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tZGVjb3JhdG9yXCIsXG4gICAgaXRlbUNhcHRpb246IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLWNhcHRpb25cIixcbiAgICBpdGVtU2VsZWN0ZWQ6IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLS1zZWxlY3RlZFwiLFxuICAgIGl0ZW1Ib3ZlcjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tLWhvdmVyXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS0tZGlzYWJsZWRcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxuICB9LFxuICBib29sZWFuOiB7XG4gICAgcm9vdDogXCJzdl9xYmxuXCIsXG4gICAgc21hbGw6IFwic3Ytcm93X19xdWVzdGlvbi0tc21hbGxcIixcbiAgICBpdGVtOiBcInN2LWJvb2xlYW4gc3YtaXRlbVwiLFxuICAgIGNvbnRyb2w6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1ib29sZWFuLS1jaGVja2VkXCIsXG4gICAgaXRlbUluZGV0ZXJtaW5hdGU6IFwic3YtYm9vbGVhbi0taW5kZXRlcm1pbmF0ZVwiLFxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1pdGVtLS1kaXNhYmxlZCBzdi1ib29sZWFuLS1kaXNhYmxlZFwiLFxuICAgIHN3aXRjaDogXCJzdi1ib29sZWFuX19zd2l0Y2hcIixcbiAgICBzbGlkZXI6IFwic3YtYm9vbGVhbl9fc2xpZGVyXCIsXG4gICAgc2xpZGVyVGV4dDogXCJzdi1oaWRkZW5cIixcbiAgICBsYWJlbDogXCJzdi1ib29sZWFuX19sYWJlbCBcIixcbiAgICBkaXNhYmxlZExhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcInN2LWl0ZW1fX2RlY29yYXRvciBzdi1ib29sZWFuX19kZWNvcmF0b3IgXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1pdGVtX19zdmcgIHN2LWJvb2xlYW5fX3N2Z1wiLFxuICAgIGNoZWNrZWRQYXRoOiBcInN2LWJvb2xlYW5fX2NoZWNrZWQtcGF0aFwiLFxuICAgIHVuY2hlY2tlZFBhdGg6IFwic3YtYm9vbGVhbl9fdW5jaGVja2VkLXBhdGhcIixcbiAgICBpbmRldGVybWluYXRlUGF0aDogXCJzdi1ib29sZWFuX19pbmRldGVybWluYXRlLXBhdGhcIixcbiAgfSxcbiAgdGV4dDoge1xuICAgIHJvb3Q6IFwic3YtdGV4dFwiLFxuICAgIHNtYWxsOiBcInN2LXJvd19fcXVlc3Rpb24tLXNtYWxsXCIsXG4gICAgb25FcnJvcjogXCJzdi10ZXh0LS1lcnJvclwiLFxuICB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInN2LW11bHRpcGxldGV4dFwiLFxuICAgIGl0ZW06IFwic3YtbXVsdGlwbGV0ZXh0X19pdGVtXCIsXG4gICAgaXRlbVRpdGxlOiBcInN2LW11bHRpcGxldGV4dF9faXRlbS10aXRsZVwiLFxuICAgIHJvdzogXCJzdi1tdWx0aXBsZXRleHRfX3Jvd1wiLFxuICAgIGNlbGw6IFwic3YtbXVsdGlwbGV0ZXh0X19jZWxsXCIsXG4gIH0sXG4gIGRyb3Bkb3duOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBzbWFsbDogXCJzdi1yb3dfX3F1ZXN0aW9uLS1zbWFsbFwiLFxuICAgIGNvbnRyb2w6IFwic3YtZHJvcGRvd25cIixcbiAgICBzZWxlY3RXcmFwcGVyOiBcIlwiLFxuICAgIG90aGVyOiBcInN2LWNvbW1lbnQgc3YtcXVlc3Rpb25fX290aGVyXCIsXG4gICAgb25FcnJvcjogXCJzdi1kcm9wZG93bi0tZXJyb3JcIixcbiAgfSxcbiAgaW1hZ2VwaWNrZXI6IHtcbiAgICByb290OiBcInN2LWltYWdlcGlja2VyXCIsXG4gICAgaXRlbTogXCJzdi1pbWFnZXBpY2tlcl9faXRlbVwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3YtaW1hZ2VwaWNrZXJfX2l0ZW0tLWlubGluZVwiLFxuICAgIGl0ZW1DaGVja2VkOiBcInN2LWltYWdlcGlja2VyX19pdGVtLS1jaGVja2VkXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWltYWdlcGlja2VyX19pdGVtLS1kaXNhYmxlZFwiLFxuICAgIGl0ZW1Ib3ZlcjogXCJzdi1pbWFnZXBpY2tlcl9faXRlbS0tYWxsb3dob3ZlclwiLFxuICAgIGxhYmVsOiBcInN2LWltYWdlcGlja2VyX19sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2LWltYWdlcGlja2VyX19jb250cm9sXCIsXG4gICAgaW1hZ2U6IFwic3YtaW1hZ2VwaWNrZXJfX2ltYWdlXCIsXG4gICAgaXRlbVRleHQ6IFwic3YtaW1hZ2VwaWNrZXJfX3RleHRcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzdi1idG5cIixcbiAgICBvdGhlcjogXCJzdi1jb21tZW50IHN2LXF1ZXN0aW9uX19vdGhlclwiLFxuICB9LFxuICBtYXRyaXg6IHtcbiAgICB0YWJsZVdyYXBwZXI6IFwic3YtbWF0cml4XCIsXG4gICAgcm9vdDogXCJzdi10YWJsZSBzdi1tYXRyaXgtcm9vdFwiLFxuICAgIHJvd0Vycm9yOiBcInN2LW1hdHJpeF9fcm93LS1lcnJvclwiLFxuICAgIGNlbGw6IFwic3YtdGFibGVfX2NlbGwgc3YtbWF0cml4X19jZWxsXCIsXG4gICAgaGVhZGVyQ2VsbDogXCJzdi10YWJsZV9fY2VsbCBzdi10YWJsZV9fY2VsbC0taGVhZGVyXCIsXG4gICAgbGFiZWw6IFwic3YtaXRlbSBzdi1yYWRpbyBzdi1tYXRyaXhfX2xhYmVsXCIsXG4gICAgaXRlbVZhbHVlOiBcInN2LXZpc3VhbGx5aGlkZGVuIHN2LWl0ZW1fX2NvbnRyb2wgc3YtcmFkaW9fX2NvbnRyb2xcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1yYWRpby0tY2hlY2tlZFwiLFxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1pdGVtLS1kaXNhYmxlZCBzdi1yYWRpby0tZGlzYWJsZWRcIixcbiAgICBpdGVtSG92ZXI6IFwic3YtcmFkaW8tLWFsbG93aG92ZXJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJzdi1pdGVtX19kZWNvcmF0b3Igc3YtcmFkaW9fX2RlY29yYXRvclwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaXRlbV9fc3ZnIHN2LXJhZGlvX19zdmdcIixcbiAgICBjZWxsVGV4dDogXCJzdi1tYXRyaXhfX3RleHRcIixcbiAgICBjZWxsVGV4dFNlbGVjdGVkOiBcInN2LW1hdHJpeF9fdGV4dC0tY2hlY2tlZFwiLFxuICAgIGNlbGxUZXh0RGlzYWJsZWQ6IFwic3YtbWF0cml4X190ZXh0LS1kaXNhYmxlZFwiLFxuICB9LFxuICBtYXRyaXhkcm9wZG93bjoge1xuICAgIHJvb3Q6IFwic3YtdGFibGUgc3YtbWF0cml4ZHJvcGRvd25cIixcbiAgICBjZWxsOiBcInN2LXRhYmxlX19jZWxsXCIsXG4gICAgaGVhZGVyQ2VsbDogXCJzdi10YWJsZV9fY2VsbCBzdi10YWJsZV9fY2VsbC0taGVhZGVyXCIsXG4gICAgcm93OiBcInN2LXRhYmxlX19yb3dcIixcbiAgICBkZXRhaWxSb3c6IFwic3YtdGFibGVfX3JvdyBzdi10YWJsZV9fcm93LS1kZXRhaWxcIixcbiAgICBkZXRhaWxSb3dUZXh0OiBcInN2LXRhYmxlX19jZWxsLS1kZXRhaWwtcm93dGV4dFwiLFxuICAgIGRldGFpbENlbGw6IFwic3YtdGFibGVfX2NlbGwtLWRldGFpbFwiLFxuICAgIGNob2ljZUNlbGw6IFwic3YtdGFibGVfX2NlbGwtLWNob2ljZVwiLFxuICAgIGRldGFpbEJ1dHRvbjogXCJzdi10YWJsZV9fY2VsbC0tZGV0YWlsLWJ1dHRvblwiLFxuICAgIGRldGFpbEJ1dHRvbkV4cGFuZGVkOiBcInN2LXRhYmxlX19jZWxsLS1kZXRhaWwtYnV0dG9uLS1leHBhbmRlZFwiLFxuICAgIGRldGFpbEljb246IFwic3YtZGV0YWlsLXBhbmVsX19pY29uXCIsXG4gICAgZGV0YWlsSWNvbkV4cGFuZGVkOiBcInN2LWRldGFpbC1wYW5lbF9faWNvbi0tZXhwYW5kZWRcIixcbiAgICBkZXRhaWxQYW5lbENlbGw6IFwic3YtdGFibGVfX2NlbGwtLWRldGFpbC1wYW5lbFwiLFxuICAgIGFjdGlvbnNDZWxsOiBcInN2LXRhYmxlX19jZWxsIHN2LXRhYmxlX19jZWxsLS1hY3Rpb25zXCIsXG4gIH0sXG4gIG1hdHJpeGR5bmFtaWM6IHtcbiAgICByb290OiBcInN2LXRhYmxlIHN2LW1hdHJpeGR5bmFtaWNcIixcbiAgICBjZWxsOiBcInN2LXRhYmxlX19jZWxsXCIsXG4gICAgaGVhZGVyQ2VsbDogXCJzdi10YWJsZV9fY2VsbCBzdi10YWJsZV9fY2VsbC0taGVhZGVyXCIsXG4gICAgYnV0dG9uOiBcInN2LWJ0blwiLFxuICAgIGJ1dHRvbkFkZDogXCJzdi1tYXRyaXhkeW5hbWljX19hZGQtYnRuXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcInN2LW1hdHJpeGR5bmFtaWNfX3JlbW92ZS1idG5cIixcbiAgICBpY29uQWRkOiBcIlwiLFxuICAgIGljb25SZW1vdmU6IFwiXCIsXG4gICAgaWNvbkRyYWc6IFwic3YtbWF0cml4ZHluYW1pY19fZHJhZy1pY29uXCIsXG4gICAgcm93OiBcInN2LXRhYmxlX19yb3dcIixcbiAgICBkZXRhaWxSb3c6IFwic3YtdGFibGVfX3JvdyBzdi10YWJsZV9fcm93LS1kZXRhaWxcIixcbiAgICBkZXRhaWxDZWxsOiBcInN2LXRhYmxlX19jZWxsLS1kZXRhaWxcIixcbiAgICBjaG9pY2VDZWxsOiBcInN2LXRhYmxlX19jZWxsLS1jaG9pY2VcIixcbiAgICBkZXRhaWxCdXR0b246IFwic3YtdGFibGVfX2NlbGwtLWRldGFpbC1idXR0b25cIixcbiAgICBkZXRhaWxCdXR0b25FeHBhbmRlZDogXCJzdi10YWJsZV9fY2VsbC0tZGV0YWlsLWJ1dHRvbi0tZXhwYW5kZWRcIixcbiAgICBkZXRhaWxJY29uOiBcInN2LWRldGFpbC1wYW5lbF9faWNvblwiLFxuICAgIGRldGFpbEljb25FeHBhbmRlZDogXCJzdi1kZXRhaWwtcGFuZWxfX2ljb24tLWV4cGFuZGVkXCIsXG4gICAgZGV0YWlsUGFuZWxDZWxsOiBcInN2LXRhYmxlX19jZWxsLS1kZXRhaWwtcGFuZWxcIixcbiAgICBhY3Rpb25zQ2VsbDogXCJzdi10YWJsZV9fY2VsbCBzdi10YWJsZV9fY2VsbC0tYWN0aW9uc1wiLFxuICAgIGVtcHR5Um93c1NlY3Rpb246IFwic3YtdGFibGVfX2VtcHR5LS1yb3dzLS1zZWN0aW9uXCIsXG4gICAgZW1wdHlSb3dzVGV4dDogXCJzdi10YWJsZV9fZW1wdHktLXJvd3MtLXRleHRcIixcbiAgICBlbXB0eVJvd3NCdXR0b246IFwiXCIsXG4gIH0sXG4gIHJhdGluZzoge1xuICAgIHJvb3Q6IFwic3YtcmF0aW5nXCIsXG4gICAgaXRlbTogXCJzdi1yYXRpbmdfX2l0ZW1cIixcbiAgICBzZWxlY3RlZDogXCJzdi1yYXRpbmdfX2l0ZW0tLXNlbGVjdGVkXCIsXG4gICAgbWluVGV4dDogXCJzdi1yYXRpbmdfX21pbi10ZXh0XCIsXG4gICAgaXRlbVRleHQ6IFwic3YtcmF0aW5nX19pdGVtLXRleHRcIixcbiAgICBtYXhUZXh0OiBcInN2LXJhdGluZ19fbWF4LXRleHRcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtcmF0aW5nLS1kaXNhYmxlZFwiLFxuICB9LFxuICBjb21tZW50OiB7XG4gICAgcm9vdDogXCJzdi1jb21tZW50XCIsXG4gICAgc21hbGw6IFwic3Ytcm93X19xdWVzdGlvbi0tc21hbGxcIixcbiAgfSxcbiAgZXhwcmVzc2lvbjogXCJcIixcbiAgZmlsZToge1xuICAgIHJvb3Q6IFwic3YtZmlsZVwiLFxuICAgIG90aGVyOiBcInN2LWNvbW1lbnQgc3YtcXVlc3Rpb25fX290aGVyXCIsXG4gICAgcGxhY2Vob2xkZXJJbnB1dDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxuICAgIHByZXZpZXc6IFwic3YtZmlsZV9fcHJldmlld1wiLFxuICAgIGZpbGVTaWduOiBcInN2LWhpZGRlblwiLFxuICAgIGZpbGVTaWduQm90dG9tOiBcInN2LWZpbGVfX3NpZ25cIixcbiAgICBmaWxlRGVjb3JhdG9yOiBcInN2LWZpbGVfX2RlY29yYXRvclwiLFxuICAgIGZpbGVJbnB1dDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxuICAgIG5vRmlsZUNob3NlbjogXCJzdi1kZXNjcmlwdGlvbiBzdi1maWxlX19uby1maWxlLWNob3NlblwiLFxuICAgIGNob29zZUZpbGU6IFwic3YtYnRuIHN2LWZpbGVfX2Nob29zZS1idG5cIixcbiAgICBjb250cm9sRGlzYWJsZWQ6IFwic3YtZmlsZV9fY2hvb3NlLWJ0bi0tZGlzYWJsZWRcIixcbiAgICByZW1vdmVCdXR0b246IFwic3YtaGlkZGVuXCIsXG4gICAgcmVtb3ZlQnV0dG9uQm90dG9tOiBcInN2LWJ0biBzdi1maWxlX19jbGVhbi1idG5cIixcbiAgICByZW1vdmVGaWxlOiBcInN2LWhpZGRlblwiLFxuICAgIHJlbW92ZUZpbGVTdmc6IFwic3YtZmlsZV9fcmVtb3ZlLXN2Z1wiLFxuICAgIHdyYXBwZXI6IFwic3YtZmlsZV9fd3JhcHBlclwiLFxuICB9LFxuICBzaWduYXR1cmVwYWQ6IHtcbiAgICByb290OiBcInN2LXNpZ25hdHVyZXBhZCBzanNfc3BfY29udGFpbmVyXCIsXG4gICAgc21hbGw6IFwic3Ytcm93X19xdWVzdGlvbi0tc21hbGxcIixcbiAgICBjb250cm9sczogXCJzanNfc3BfY29udHJvbHNcIixcbiAgICBwbGFjZWhvbGRlcjogXCJzanNfc3BfcGxhY2Vob2xkZXJcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzanNfc3BfY2xlYXJcIixcbiAgfSxcbiAgc2F2ZURhdGE6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHNhdmluZzogXCJcIixcbiAgICBlcnJvcjogXCJcIixcbiAgICBzdWNjZXNzOiBcIlwiLFxuICAgIHNhdmVBZ2FpbkJ1dHRvbjogXCJcIixcbiAgfSxcbiAgd2luZG93OiB7XG4gICAgcm9vdDogXCJzdl93aW5kb3dcIixcbiAgICBib2R5OiBcInN2X3dpbmRvd19jb250ZW50XCIsXG4gICAgaGVhZGVyOiB7XG4gICAgICByb290OiBcInN2X3dpbmRvd190aXRsZVwiLFxuICAgICAgdGl0bGU6IFwiXCIsXG4gICAgICBidXR0b246IFwiXCIsXG4gICAgICBidXR0b25FeHBhbmRlZDogXCJcIixcbiAgICAgIGJ1dHRvbkNvbGxhcHNlZDogXCJcIixcbiAgICB9LFxuICB9LFxufTtcblxuc3VydmV5Q3NzW1wibW9kZXJuXCJdID0gbW9kZXJuQ3NzO1xuIiwiZXhwb3J0IHZhciBzdXJ2ZXlDc3M6IGFueSA9IHtcclxuICBjdXJyZW50VHlwZTogXCJcIixcclxuICBnZXRDc3M6IGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudFR5cGUgPyB0aGlzW3RoaXMuY3VycmVudFR5cGVdIDogZGVmYXVsdFN0YW5kYXJkQ3NzO1xyXG4gICAgaWYgKCFsb2MpIGxvYyA9IGRlZmF1bHRTdGFuZGFyZENzcztcclxuICAgIHJldHVybiBsb2M7XHJcbiAgfSxcclxufTtcclxuXHJcbmV4cG9ydCB2YXIgZGVmYXVsdFN0YW5kYXJkQ3NzID0ge1xyXG4gIHJvb3Q6IFwic3ZfbWFpbiBzdl9kZWZhdWx0X2Nzc1wiLFxyXG4gIGNvbnRhaW5lcjogXCJzdl9jb250YWluZXJcIixcclxuICBoZWFkZXI6IFwic3ZfaGVhZGVyXCIsXHJcbiAgYm9keTogXCJzdl9ib2R5XCIsXHJcbiAgYm9keUVtcHR5OiBcInN2X2JvZHkgc3ZfYm9keV9lbXB0eVwiLFxyXG4gIGZvb3RlcjogXCJzdl9uYXZcIixcclxuICB0aXRsZTogXCJcIixcclxuICBkZXNjcmlwdGlvbjogXCJcIixcclxuICBsb2dvOiBcInN2X2xvZ29cIixcclxuICBsb2dvSW1hZ2U6IFwic3ZfbG9nb19faW1hZ2VcIixcclxuICBoZWFkZXJUZXh0OiBcInN2X2hlYWRlcl9fdGV4dFwiLFxyXG4gIG5hdmlnYXRpb25CdXR0b246IFwiXCIsXHJcbiAgY29tcGxldGVkUGFnZTogXCJzdl9jb21wbGV0ZWRfcGFnZVwiLFxyXG4gIG5hdmlnYXRpb246IHtcclxuICAgIGNvbXBsZXRlOiBcInN2X2NvbXBsZXRlX2J0blwiLFxyXG4gICAgcHJldjogXCJzdl9wcmV2X2J0blwiLFxyXG4gICAgbmV4dDogXCJzdl9uZXh0X2J0blwiLFxyXG4gICAgc3RhcnQ6IFwic3Zfc3RhcnRfYnRuXCIsXHJcbiAgICBwcmV2aWV3OiBcInN2X3ByZXZpZXdfYnRuXCIsXHJcbiAgICBlZGl0OiBcInN2X2VkaXRfYnRuXCIsXHJcbiAgfSxcclxuICBwcm9ncmVzczogXCJzdl9wcm9ncmVzc1wiLFxyXG4gIHByb2dyZXNzQmFyOiBcInN2X3Byb2dyZXNzX2JhclwiLFxyXG4gIHByb2dyZXNzVGV4dEluQmFyOiBcInN2LWhpZGRlblwiLFxyXG4gIHByb2dyZXNzQnV0dG9uc0NvbnRhaW5lckNlbnRlcjogXCJzdl9wcm9ncmVzcy1idXR0b25zX19jb250YWluZXItY2VudGVyXCIsXHJcbiAgcHJvZ3Jlc3NCdXR0b25zQ29udGFpbmVyOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2NvbnRhaW5lclwiLFxyXG4gIHByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uTGVmdDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19pbWFnZS1idXR0b24tbGVmdFwiLFxyXG4gIHByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uUmlnaHQ6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19faW1hZ2UtYnV0dG9uLXJpZ2h0XCIsXHJcbiAgcHJvZ3Jlc3NCdXR0b25zSW1hZ2VCdXR0b25IaWRkZW46IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19faW1hZ2UtYnV0dG9uLS1oaWRkZW5cIixcclxuICBwcm9ncmVzc0J1dHRvbnNMaXN0Q29udGFpbmVyOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtY29udGFpbmVyXCIsXHJcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdDogXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0XCIsXHJcbiAgcHJvZ3Jlc3NCdXR0b25zTGlzdEVsZW1lbnRQYXNzZWQ6IFwic3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdC1lbGVtZW50LS1wYXNzZWRcIixcclxuICBwcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudEN1cnJlbnQ6XHJcbiAgICBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tY3VycmVudFwiLFxyXG4gIHByb2dyZXNzQnV0dG9uc0xpc3RFbGVtZW50Tm9uQ2xpY2thYmxlOlxyXG4gICAgXCJzdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLW5vbmNsaWNrYWJsZVwiLFxyXG4gIHByb2dyZXNzQnV0dG9uc1BhZ2VUaXRsZTogXCJzdl9wcm9ncmVzcy1idXR0b25zX19wYWdlLXRpdGxlXCIsXHJcbiAgcHJvZ3Jlc3NCdXR0b25zUGFnZURlc2NyaXB0aW9uOiBcInN2X3Byb2dyZXNzLWJ1dHRvbnNfX3BhZ2UtZGVzY3JpcHRpb25cIixcclxuICBwYWdlOiB7XHJcbiAgICByb290OiBcInN2X3Bfcm9vdFwiLFxyXG4gICAgdGl0bGU6IFwic3ZfcGFnZV90aXRsZVwiLFxyXG4gICAgZGVzY3JpcHRpb246IFwiXCIsXHJcbiAgfSxcclxuICAvLyBUT0RPOiBtb3ZlIHRvIHRoZSBwYWdlIG9iamVjdFxyXG4gIHBhZ2VUaXRsZTogXCJzdl9wYWdlX3RpdGxlXCIsXHJcbiAgcGFnZURlc2NyaXB0aW9uOiBcIlwiLFxyXG4gIHJvdzogXCJzdl9yb3dcIixcclxuICBxdWVzdGlvbjoge1xyXG4gICAgbWFpblJvb3Q6IFwic3ZfcSBzdl9xc3RuXCIsXHJcbiAgICBmbG93Um9vdDogXCJzdl9xX2Zsb3cgc3ZfcXN0blwiLFxyXG4gICAgaGVhZGVyOiBcIlwiLFxyXG4gICAgaGVhZGVyTGVmdDogXCJ0aXRsZS1sZWZ0XCIsXHJcbiAgICBjb250ZW50OiBcIlwiLFxyXG4gICAgY29udGVudExlZnQ6IFwiY29udGVudC1sZWZ0XCIsXHJcbiAgICB0aXRsZUxlZnRSb290OiBcInN2X3FzdG5fbGVmdFwiLFxyXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2X3FfcmVxdWlyZWRfdGV4dFwiLFxyXG4gICAgdGl0bGU6IFwic3ZfcV90aXRsZVwiLFxyXG4gICAgdGl0bGVFeHBhbmRhYmxlOiBcInN2X3FfdGl0bGVfZXhwYW5kYWJsZVwiLFxyXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXHJcbiAgICBkZXNjcmlwdGlvbjogXCJzdl9xX2Rlc2NyaXB0aW9uXCIsXHJcbiAgICBjb21tZW50OiBcIlwiLFxyXG4gICAgcmVxdWlyZWQ6IFwiXCIsXHJcbiAgICB0aXRsZVJlcXVpcmVkOiBcIlwiLFxyXG4gICAgaGFzRXJyb3I6IFwiXCIsXHJcbiAgICBpbmRlbnQ6IDIwLFxyXG4gICAgZm9vdGVyOiBcInN2X3FfZm9vdGVyXCIsXHJcbiAgICBmb3JtR3JvdXA6IFwiZm9ybS1ncm91cFwiLFxyXG4gICAgYXNDZWxsOiBcInN2X21hdHJpeF9jZWxsXCIsXHJcbiAgICBpY29uOiBcInN2X3F1ZXN0aW9uX2ljb25cIixcclxuICAgIGljb25FeHBhbmRlZDogXCJzdl9leHBhbmRlZFwiLFxyXG4gICAgZGlzYWJsZWQ6IFwic3ZfcS0tZGlzYWJsZWRcIixcclxuICB9LFxyXG4gIHBhbmVsOiB7XHJcbiAgICB0aXRsZTogXCJzdl9wX3RpdGxlXCIsXHJcbiAgICB0aXRsZUV4cGFuZGFibGU6IFwic3ZfcF90aXRsZV9leHBhbmRhYmxlXCIsXHJcbiAgICB0aXRsZU9uRXJyb3I6IFwiXCIsXHJcbiAgICBpY29uOiBcInN2X3BhbmVsX2ljb25cIixcclxuICAgIGljb25FeHBhbmRlZDogXCJzdl9leHBhbmRlZFwiLFxyXG4gICAgZGVzY3JpcHRpb246IFwic3ZfcF9kZXNjcmlwdGlvblwiLFxyXG4gICAgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCIsXHJcbiAgICBmb290ZXI6IFwic3ZfcF9mb290ZXJcIixcclxuICAgIG51bWJlcjogXCJzdl9xX251bVwiLFxyXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2X3FfcmVxdWlyZWRfdGV4dFwiLFxyXG4gIH0sXHJcbiAgZXJyb3I6IHtcclxuICAgIHJvb3Q6IFwic3ZfcV9lcmJveFwiLFxyXG4gICAgaWNvbjogXCJcIixcclxuICAgIGl0ZW06IFwiXCIsXHJcbiAgICBsb2NhdGlvblRvcDogXCJzdl9xc3RuX2Vycm9yX3RvcFwiLFxyXG4gICAgbG9jYXRpb25Cb3R0b206IFwic3ZfcXN0bl9lcnJvcl9ib3R0b21cIixcclxuICB9LFxyXG5cclxuICBib29sZWFuOiB7XHJcbiAgICByb290OiBcInN2X3FjYmMgc3ZfcWJsblwiLFxyXG4gICAgaXRlbTogXCJzdi1ib29sZWFuXCIsXHJcbiAgICBjb250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXHJcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1ib29sZWFuLS1jaGVja2VkIGNoZWNrZWRcIixcclxuICAgIGl0ZW1JbmRldGVybWluYXRlOiBcInN2LWJvb2xlYW4tLWluZGV0ZXJtaW5hdGVcIixcclxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1ib29sZWFuLS1kaXNhYmxlZFwiLFxyXG4gICAgc3dpdGNoOiBcInN2LWJvb2xlYW5fX3N3aXRjaFwiLFxyXG4gICAgc2xpZGVyOiBcInN2LWJvb2xlYW5fX3NsaWRlclwiLFxyXG4gICAgc2xpZGVyVGV4dDogXCJzdi1oaWRkZW5cIixcclxuICAgIGxhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsIFwiLFxyXG4gICAgZGlzYWJsZWRMYWJlbDogXCJzdi1ib29sZWFuX19sYWJlbC0tZGlzYWJsZWRcIixcclxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcInN2LWl0ZW1fX2RlY29yYXRvciBzdi1ib29sZWFuX19kZWNvcmF0b3IgXCIsXHJcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWl0ZW1fX3N2ZyAgc3YtYm9vbGVhbl9fc3ZnXCIsXHJcbiAgICBjaGVja2VkUGF0aDogXCJzdi1ib29sZWFuX19jaGVja2VkLXBhdGhcIixcclxuICAgIHVuY2hlY2tlZFBhdGg6IFwic3YtYm9vbGVhbl9fdW5jaGVja2VkLXBhdGhcIixcclxuICAgIGluZGV0ZXJtaW5hdGVQYXRoOiBcInN2LWJvb2xlYW5fX2luZGV0ZXJtaW5hdGUtcGF0aFwiLFxyXG4gIH0sXHJcbiAgY2hlY2tib3g6IHtcclxuICAgIHJvb3Q6IFwic3ZfcWNiYyBzdl9xY2J4XCIsXHJcbiAgICBpdGVtOiBcInN2X3FfY2hlY2tib3hcIixcclxuICAgIGl0ZW1TZWxlY3RBbGw6IFwic3ZfcV9jaGVja2JveF9zZWxlY3RhbGxcIixcclxuICAgIGl0ZW1Ob25lOiBcInN2X3FfY2hlY2tib3hfbm9uZVwiLFxyXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxyXG4gICAgaXRlbUlubGluZTogXCJzdl9xX2NoZWNrYm94X2lubGluZVwiLFxyXG4gICAgbGFiZWw6IFwic3ZfcV9jaGVja2JveF9sYWJlbFwiLFxyXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxyXG4gICAgaXRlbUNvbnRyb2w6IFwic3ZfcV9jaGVja2JveF9jb250cm9sX2l0ZW1cIixcclxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXHJcbiAgICBjb250cm9sTGFiZWw6IFwic3ZfcV9jaGVja2JveF9jb250cm9sX2xhYmVsXCIsXHJcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1tYXRlcmlhbFwiLFxyXG4gICAgb3RoZXI6IFwic3ZfcV9vdGhlciBzdl9xX2NoZWNrYm94X290aGVyXCIsXHJcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCIsXHJcbiAgfSxcclxuICByYW5raW5nOiB7XHJcbiAgICByb290OiBcInN2LXJhbmtpbmdcIixcclxuICAgIHJvb3RNb2JpbGVNb2Q6IFwic3YtcmFua2luZy0tbW9iaWxlXCIsXHJcbiAgICByb290RHJhZ01vZDogXCJzdi1yYW5raW5nLS1kcmFnXCIsXHJcbiAgICBpdGVtOiBcInN2LXJhbmtpbmctaXRlbVwiLFxyXG4gICAgaXRlbUNvbnRlbnQ6IFwic3YtcmFua2luZy1pdGVtX19jb250ZW50XCIsXHJcbiAgICBpdGVtSW5kZXg6IFwic3YtcmFua2luZy1pdGVtX19pbmRleFwiLFxyXG4gICAgLy8gaXRlbVRleHQ6IFwic3YtcmFua2luZy1pdGVtX190ZXh0XCIsXHJcbiAgICBjb250cm9sTGFiZWw6IFwic3YtcmFua2luZy1pdGVtX190ZXh0XCIsXHJcbiAgICBpdGVtR2hvc3ROb2RlOiBcInN2LXJhbmtpbmctaXRlbV9fZ2hvc3RcIixcclxuICAgIGl0ZW1JY29uQ29udGFpbmVyOiBcInN2LXJhbmtpbmctaXRlbV9faWNvbi1jb250YWluZXJcIixcclxuICAgIGl0ZW1JY29uOiBcInN2LXJhbmtpbmctaXRlbV9faWNvblwiLFxyXG4gICAgaXRlbUljb25Ib3Zlck1vZDogXCJzdi1yYW5raW5nLWl0ZW1fX2ljb24tLWhvdmVyXCIsXHJcbiAgICBpdGVtSWNvbkZvY3VzTW9kOiBcInN2LXJhbmtpbmctaXRlbV9faWNvbi0tZm9jdXNcIixcclxuICAgIGl0ZW1HaG9zdE1vZDogXCJzdi1yYW5raW5nLWl0ZW0tLWdob3N0XCIsXHJcbiAgICBpdGVtRHJhZ01vZDogXCJzdi1yYW5raW5nLWl0ZW0tLWRyYWdcIixcclxuICB9LFxyXG4gIGNvbW1lbnQ6IFwiXCIsXHJcbiAgZHJvcGRvd246IHtcclxuICAgIHJvb3Q6IFwiXCIsXHJcbiAgICBjb250cm9sOiBcInN2X3FfZHJvcGRvd25fY29udHJvbFwiLFxyXG4gICAgc2VsZWN0V3JhcHBlcjogXCJzdl9zZWxlY3Rfd3JhcHBlclwiLFxyXG4gICAgb3RoZXI6IFwic3ZfcV9kZF9vdGhlclwiLFxyXG4gIH0sXHJcbiAgaHRtbDogeyByb290OiBcIlwiIH0sXHJcbiAgaW1hZ2U6IHsgcm9vdDogXCJzdl9xX2ltYWdlXCIsIGltYWdlOiBcInN2X2ltYWdlX2ltYWdlXCIgfSxcclxuICBtYXRyaXg6IHtcclxuICAgIHJvb3Q6IFwic3ZfcV9tYXRyaXhcIixcclxuICAgIGxhYmVsOiBcInN2X3FfbV9sYWJlbFwiLFxyXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxyXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcclxuICAgIGNlbGw6IFwic3ZfcV9tX2NlbGxcIixcclxuICAgIGNlbGxUZXh0OiBcInN2X3FfbV9jZWxsX3RleHRcIixcclxuICAgIGNlbGxUZXh0U2VsZWN0ZWQ6IFwic3ZfcV9tX2NlbGxfc2VsZWN0ZWRcIixcclxuICAgIGNlbGxMYWJlbDogXCJzdl9xX21fY2VsbF9sYWJlbFwiLFxyXG4gIH0sXHJcbiAgbWF0cml4ZHJvcGRvd246IHtcclxuICAgIHJvb3Q6IFwic3ZfcV9tYXRyaXhfZHJvcGRvd25cIixcclxuICAgIGNlbGw6IFwic3ZfbWF0cml4X2NlbGxcIixcclxuICAgIGhlYWRlckNlbGw6IFwic3ZfbWF0cml4X2NlbGxfaGVhZGVyXCIsXHJcbiAgICByb3c6IFwic3ZfbWF0cml4X3Jvd1wiLFxyXG4gICAgZGV0YWlsUm93OiBcInN2X21hdHJpeF9kZXRhaWxfcm93XCIsXHJcbiAgICBkZXRhaWxSb3dUZXh0OiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9yb3d0ZXh0XCIsXHJcbiAgICBkZXRhaWxDZWxsOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbFwiLFxyXG4gICAgY2hvaWNlQ2VsbDogXCJzdi10YWJsZV9fY2VsbC0tY2hvaWNlXCIsXHJcbiAgICBkZXRhaWxCdXR0b246IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX2J1dHRvblwiLFxyXG4gICAgZGV0YWlsQnV0dG9uRXhwYW5kZWQ6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX2J1dHRvbl9leHBhbmRlZFwiLFxyXG4gICAgZGV0YWlsSWNvbjogXCJzdl9kZXRhaWxfcGFuZWxfaWNvblwiLFxyXG4gICAgZGV0YWlsSWNvbkV4cGFuZGVkOiBcInN2X2RldGFpbF9leHBhbmRlZFwiLFxyXG4gICAgZGV0YWlsUGFuZWxDZWxsOiBcInN2X21hdHJpeF9jZWxsX2RldGFpbF9wYW5lbFwiLFxyXG4gICAgYWN0aW9uc0NlbGw6IFwic3ZfbWF0cml4X2NlbGwgc3ZfbWF0cml4X2NlbGxfYWN0aW9uc1wiLFxyXG4gIH0sXHJcbiAgbWF0cml4ZHluYW1pYzoge1xyXG4gICAgcm9vdDogXCJzdl9xX21hdHJpeF9keW5hbWljXCIsXHJcbiAgICBidXR0b246IFwic3ZfbWF0cml4X2R5bmFtaWNfYnV0dG9uXCIsXHJcbiAgICBidXR0b25BZGQ6IFwiXCIsXHJcbiAgICBidXR0b25SZW1vdmU6IFwiXCIsXHJcbiAgICBpY29uQWRkOiBcIlwiLFxyXG4gICAgaWNvblJlbW92ZTogXCJcIixcclxuICAgIGljb25EcmFnOiBcInN2LW1hdHJpeGR5bmFtaWNfX2RyYWctaWNvblwiLFxyXG4gICAgY2VsbDogXCJzdl9tYXRyaXhfY2VsbFwiLFxyXG4gICAgaGVhZGVyQ2VsbDogXCJzdl9tYXRyaXhfY2VsbF9oZWFkZXJcIixcclxuICAgIHJvdzogXCJzdl9tYXRyaXhfcm93XCIsXHJcbiAgICBkZXRhaWxSb3c6IFwic3ZfbWF0cml4X2RldGFpbF9yb3dcIixcclxuICAgIGRldGFpbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsXCIsXHJcbiAgICBjaG9pY2VDZWxsOiBcInN2LXRhYmxlX19jZWxsLS1jaG9pY2VcIixcclxuICAgIGRldGFpbEJ1dHRvbjogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uXCIsXHJcbiAgICBkZXRhaWxCdXR0b25FeHBhbmRlZDogXCJzdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uX2V4cGFuZGVkXCIsXHJcbiAgICBkZXRhaWxJY29uOiBcInN2X2RldGFpbF9wYW5lbF9pY29uXCIsXHJcbiAgICBkZXRhaWxJY29uRXhwYW5kZWQ6IFwic3ZfZGV0YWlsX2V4cGFuZGVkXCIsXHJcbiAgICBkZXRhaWxQYW5lbENlbGw6IFwic3ZfbWF0cml4X2NlbGxfZGV0YWlsX3BhbmVsXCIsXHJcbiAgICBhY3Rpb25zQ2VsbDogXCJzdl9tYXRyaXhfY2VsbCBzdl9tYXRyaXhfY2VsbF9hY3Rpb25zXCIsXHJcbiAgICBlbXB0eVJvd3NTZWN0aW9uOiBcInN2X21hdHJpeF9lbXB0eV9yb3dzX3NlY3Rpb25cIixcclxuICAgIGVtcHR5Um93c1RleHQ6IFwic3ZfbWF0cml4X2VtcHR5X3Jvd3NfdGV4dFwiLFxyXG4gICAgZW1wdHlSb3dzQnV0dG9uOiBcIlwiLFxyXG4gIH0sXHJcbiAgcGFuZWxkeW5hbWljOiB7XHJcbiAgICByb290OiBcInN2X3BhbmVsX2R5bmFtaWNcIixcclxuICAgIHRpdGxlOiBcInN2X3BfdGl0bGVcIixcclxuICAgIGJ1dHRvbjogXCJcIixcclxuICAgIGJ1dHRvbkFkZDogXCJzdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIixcclxuICAgIGJ1dHRvblJlbW92ZTogXCJzdl9wX3JlbW92ZV9idG5cIixcclxuICAgIGJ1dHRvblJlbW92ZVJpZ2h0OiBcInN2X3BfcmVtb3ZlX2J0bl9yaWdodFwiLFxyXG4gICAgYnV0dG9uUHJldjogXCJzdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuXCIsXHJcbiAgICBidXR0b25OZXh0OiBcInN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIixcclxuICAgIHByb2dyZXNzQ29udGFpbmVyOiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtY29udGFpbmVyXCIsXHJcbiAgICBwcm9ncmVzczogXCJzdi1wcm9ncmVzc1wiLFxyXG4gICAgcHJvZ3Jlc3NCYXI6IFwic3YtcHJvZ3Jlc3NfX2JhclwiLFxyXG4gICAgcHJvZ3Jlc3NUZXh0OiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiLFxyXG4gICAgcGFuZWxXcmFwcGVyOiBcInN2X3Bfd3JhcHBlclwiLFxyXG4gICAgcGFuZWxXcmFwcGVySW5Sb3c6IFwic3ZfcF93cmFwcGVyX2luX3Jvd1wiLFxyXG4gIH0sXHJcbiAgbXVsdGlwbGV0ZXh0OiB7XHJcbiAgICByb290OiBcInN2X3FfbXRcIixcclxuICAgIGl0ZW1UaXRsZTogXCJzdl9xX210X3RpdGxlXCIsXHJcbiAgICByb3c6IFwic3ZfcV9tdF9yb3dcIixcclxuICAgIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgc3ZfcV90ZXh0X3Jvb3RcIixcclxuICB9LFxyXG4gIHJhZGlvZ3JvdXA6IHtcclxuICAgIHJvb3Q6IFwic3ZfcWNiY1wiLFxyXG4gICAgaXRlbTogXCJzdl9xX3JhZGlvZ3JvdXBcIixcclxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcclxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9yYWRpb2dyb3VwX2lubGluZVwiLFxyXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcclxuICAgIGxhYmVsOiBcInN2X3FfcmFkaW9ncm91cF9sYWJlbFwiLFxyXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxyXG4gICAgaXRlbUNvbnRyb2w6IFwic3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfaXRlbVwiLFxyXG4gICAgY29udHJvbExhYmVsOiBcIlwiLFxyXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiY2lyY2xlXCIsXHJcbiAgICBvdGhlcjogXCJzdl9xX290aGVyIHN2X3FfcmFkaW9ncm91cF9vdGhlclwiLFxyXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyXCIsXHJcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCIsXHJcbiAgfSxcclxuICBidXR0b25ncm91cDoge1xyXG4gICAgcm9vdDogXCJzdi1idXR0b24tZ3JvdXBcIixcclxuICAgIGl0ZW06IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtXCIsXHJcbiAgICBpdGVtSWNvbjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0taWNvblwiLFxyXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tZGVjb3JhdG9yXCIsXHJcbiAgICBpdGVtQ2FwdGlvbjogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tY2FwdGlvblwiLFxyXG4gICAgaXRlbUhvdmVyOiBcInN2LWJ1dHRvbi1ncm91cF9faXRlbS0taG92ZXJcIixcclxuICAgIGl0ZW1TZWxlY3RlZDogXCJzdi1idXR0b24tZ3JvdXBfX2l0ZW0tLXNlbGVjdGVkXCIsXHJcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtYnV0dG9uLWdyb3VwX19pdGVtLS1kaXNhYmxlZFwiLFxyXG4gICAgaXRlbUNvbnRyb2w6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcclxuICB9LFxyXG4gIGltYWdlcGlja2VyOiB7XHJcbiAgICByb290OiBcInN2X2ltZ3NlbFwiLFxyXG4gICAgaXRlbTogXCJzdl9xX2ltZ3NlbFwiLFxyXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxyXG4gICAgbGFiZWw6IFwic3ZfcV9pbWdzZWxfbGFiZWxcIixcclxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfaW1nc2VsX2NvbnRyb2xfaXRlbVwiLFxyXG4gICAgaW1hZ2U6IFwic3ZfcV9pbWdzZWxfaW1hZ2VcIixcclxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIixcclxuICAgIGl0ZW1UZXh0OiBcInN2X3FfaW1nc2VsX3RleHRcIixcclxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiLFxyXG4gIH0sXHJcbiAgcmF0aW5nOiB7XHJcbiAgICByb290OiBcInN2X3FfcmF0aW5nXCIsXHJcbiAgICBpdGVtOiBcInN2X3FfcmF0aW5nX2l0ZW1cIixcclxuICAgIHNlbGVjdGVkOiBcImFjdGl2ZVwiLFxyXG4gICAgbWluVGV4dDogXCJzdl9xX3JhdGluZ19taW5fdGV4dFwiLFxyXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9yYXRpbmdfaXRlbV90ZXh0XCIsXHJcbiAgICBtYXhUZXh0OiBcInN2X3FfcmF0aW5nX21heF90ZXh0XCIsXHJcbiAgfSxcclxuICB0ZXh0OiBcInN2X3FfdGV4dF9yb290XCIsXHJcbiAgZXhwcmVzc2lvbjogXCJcIixcclxuICBmaWxlOiB7XHJcbiAgICByb290OiBcInN2X3FfZmlsZVwiLFxyXG4gICAgcGxhY2Vob2xkZXJJbnB1dDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxyXG4gICAgcHJldmlldzogXCJzdl9xX2ZpbGVfcHJldmlld1wiLFxyXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCIsXHJcbiAgICBmaWxlSW5wdXQ6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcclxuICAgIHJlbW92ZUZpbGU6IFwic3ZfcV9maWxlX3JlbW92ZVwiLFxyXG4gICAgcmVtb3ZlRmlsZVN2ZzogXCJzdi1oaWRkZW5cIixcclxuICAgIGZpbGVEZWNvcmF0b3I6IFwic3YtZmlsZV9fZGVjb3JhdG9yXCIsXHJcbiAgICBmaWxlU2lnbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcclxuICAgIHJlbW92ZUJ1dHRvbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcclxuICAgIGNob29zZUZpbGU6IFwic3ZfcV9maWxlX2Nob29zZV9idXR0b25cIixcclxuICAgIG5vRmlsZUNob3NlbjogXCJzdl9xX2ZpbGVfcGxhY2Vob2xkZXJcIixcclxuICB9LFxyXG4gIHNpZ25hdHVyZXBhZDoge1xyXG4gICAgcm9vdDogXCJzdl9xX3NpZ25hdHVyZXBhZCBzanNfc3BfY29udGFpbmVyXCIsXHJcbiAgICBjb250cm9sczogXCJzanNfc3BfY29udHJvbHNcIixcclxuICAgIHBsYWNlaG9sZGVyOiBcInNqc19zcF9wbGFjZWhvbGRlclwiLFxyXG4gICAgY2xlYXJCdXR0b246IFwic2pzX3NwX2NsZWFyXCIsXHJcbiAgfSxcclxuICBzYXZlRGF0YToge1xyXG4gICAgcm9vdDogXCJcIixcclxuICAgIHNhdmluZzogXCJcIixcclxuICAgIGVycm9yOiBcIlwiLFxyXG4gICAgc3VjY2VzczogXCJcIixcclxuICAgIHNhdmVBZ2FpbkJ1dHRvbjogXCJcIixcclxuICB9LFxyXG4gIHdpbmRvdzoge1xyXG4gICAgcm9vdDogXCJzdl93aW5kb3dcIixcclxuICAgIGJvZHk6IFwic3Zfd2luZG93X2NvbnRlbnRcIixcclxuICAgIGhlYWRlcjoge1xyXG4gICAgICByb290OiBcInN2X3dpbmRvd190aXRsZVwiLFxyXG4gICAgICB0aXRsZTogXCJcIixcclxuICAgICAgYnV0dG9uOiBcIlwiLFxyXG4gICAgICBidXR0b25FeHBhbmRlZDogXCJcIixcclxuICAgICAgYnV0dG9uQ29sbGFwc2VkOiBcIlwiLFxyXG4gICAgfSxcclxuICB9LFxyXG59O1xyXG5cclxuc3VydmV5Q3NzW1wic3RhbmRhcmRcIl0gPSBkZWZhdWx0U3RhbmRhcmRDc3M7XHJcbiIsImltcG9ydCB7IEJhc2UsIEV2ZW50QmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IElFbGVtZW50IH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IEpzb25PYmplY3QsIHByb3BlcnR5LCBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUGFnZU1vZGVsIH0gZnJvbSBcIi4vcGFnZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25TZWxlY3RCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi9zdXJ2ZXlcIjtcblxuZXhwb3J0IGNsYXNzIERyYWdEcm9wSGVscGVyIGV4dGVuZHMgQmFzZSB7XG4gIHB1YmxpYyBvbkJlZm9yZURyb3A6IEV2ZW50QmFzZTxEcmFnRHJvcEhlbHBlcj4gPSBuZXcgRXZlbnRCYXNlKCk7XG4gIHB1YmxpYyBvbkFmdGVyRHJvcDogRXZlbnRCYXNlPERyYWdEcm9wSGVscGVyPiA9IG5ldyBFdmVudEJhc2UoKTtcblxuICBwdWJsaWMgc3RhdGljIHJlc3RyaWN0RHJhZ1F1ZXN0aW9uQmV0d2VlblBhZ2VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIHN0YXRpYyBlZGdlSGVpZ2h0OiBudW1iZXIgPSAzMDtcbiAgcHVibGljIHN0YXRpYyBuZXN0ZWRQYW5lbERlcHRoOiBudW1iZXIgPSAtMTtcbiAgcHVibGljIHN0YXRpYyBwcmV2RXZlbnQ6IGFueSA9IHtcbiAgICBlbGVtZW50OiBudWxsLFxuICAgIHg6IC0xLFxuICAgIHk6IC0xLFxuICB9O1xuICBwdWJsaWMgc3RhdGljIG5ld0dob3N0UGFnZTogUGFnZU1vZGVsID0gbnVsbDtcbiAgcHVibGljIHN0YXRpYyBnaG9zdFN1cnZleUVsZW1lbnROYW1lID1cbiAgICBcInN2Yy1kcmFnLWRyb3AtZ2hvc3Qtc3VydmV5LWVsZW1lbnQtbmFtZVwiOyAvLyBiZWZvcmUgcmVuYW1pbmcgdXNlIGdsb2JhIHNlYXJjaCAod2UgaGF2ZSBhbHNvIGNzcyBzZWxlY3RvcnMpXG5cbiAgcHJpdmF0ZSBkcmFnZ2VkU3VydmV5RWxlbWVudDogSUVsZW1lbnQgPSBudWxsO1xuICBAcHJvcGVydHkoKSBkcm9wVGFyZ2V0U3VydmV5RWxlbWVudDogSUVsZW1lbnQgPSBudWxsO1xuXG4gIHByaXZhdGUgZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dDogSFRNTEVsZW1lbnQgPSBudWxsO1xuICBwcml2YXRlIHNjcm9sbEludGVydmFsSWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+ID0gbnVsbDtcbiAgcHJpdmF0ZSBnaG9zdFN1cnZleUVsZW1lbnQ6IElFbGVtZW50ID0gbnVsbDtcbiAgQHByb3BlcnR5KCkgaXNCb3R0b206IGJvb2xlYW4gPSBudWxsO1xuICBwcml2YXRlIGlzRWRnZTogYm9vbGVhbiA9IG51bGw7XG4gIHByaXZhdGUgcGFnZU9yUGFuZWw6IFBhZ2VNb2RlbCA9IG51bGw7XG4gIHByaXZhdGUgaXRlbVZhbHVlUGFyZW50UXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZSA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGlzSXRlbVZhbHVlQmVpbmdEcmFnZ2VkKCkge1xuICAgIHJldHVybiBTZXJpYWxpemVyLmlzRGVzY2VuZGFudE9mKFxuICAgICAgdGhpcy5kcmFnZ2VkU3VydmV5RWxlbWVudC5nZXRUeXBlKCksXG4gICAgICBcIml0ZW12YWx1ZVwiXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZHJvcFRhcmdldERhdGFBdHRyaWJ1dGVOYW1lKCkge1xuICAgIGlmICh0aGlzLmlzSXRlbVZhbHVlQmVpbmdEcmFnZ2VkKCkpIHtcbiAgICAgIHJldHVybiBcIltkYXRhLXN2Yy1kcm9wLXRhcmdldC1pdGVtLXZhbHVlXVwiO1xuICAgIH1cbiAgICByZXR1cm4gXCJbZGF0YS1zdmMtZHJvcC10YXJnZXQtZWxlbWVudC1uYW1lXVwiO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdXJ2ZXlWYWx1ZT86IFN1cnZleU1vZGVsLCBwcml2YXRlIGNyZWF0b3I/OiBhbnkpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBzdXJ2ZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5VmFsdWUgfHwgdGhpcy5jcmVhdG9yLnN1cnZleTtcbiAgfVxuXG4gIHB1YmxpYyBzdGFydERyYWdUb29sYm94SXRlbShcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIGRyYWdnZWRFbGVtZW50SnNvbjogSnNvbk9iamVjdFxuICApIHtcbiAgICBjb25zdCBkcmFnZ2VkRWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudEZyb21Kc29uKGRyYWdnZWRFbGVtZW50SnNvbik7XG4gICAgdGhpcy5zdGFydERyYWdTdXJ2ZXlFbGVtZW50KGV2ZW50LCBkcmFnZ2VkRWxlbWVudCk7XG4gIH1cblxuICBwdWJsaWMgc3RhcnREcmFnU3VydmV5RWxlbWVudChldmVudDogUG9pbnRlckV2ZW50LCBkcmFnZ2VkRWxlbWVudDogSUVsZW1lbnQpIHtcbiAgICB0aGlzLnN0YXJ0RHJhZyhldmVudCwgZHJhZ2dlZEVsZW1lbnQpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0RHJhZ0l0ZW1WYWx1ZShcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvblNlbGVjdEJhc2UsXG4gICAgaXRlbTogSXRlbVZhbHVlXG4gICkge1xuICAgIGNvbnN0IGRyYWdnZWRFbGVtZW50ID0gPGFueT5pdGVtO1xuICAgIHRoaXMuaXRlbVZhbHVlUGFyZW50UXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLnN0YXJ0RHJhZyhldmVudCwgZHJhZ2dlZEVsZW1lbnQpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0RHJhZyhldmVudDogUG9pbnRlckV2ZW50LCBkcmFnZ2VkRWxlbWVudDogSUVsZW1lbnQpIHtcbiAgICB0aGlzLmRyYWdnZWRTdXJ2ZXlFbGVtZW50ID0gZHJhZ2dlZEVsZW1lbnQ7XG4gICAgdGhpcy5naG9zdFN1cnZleUVsZW1lbnQgPSB0aGlzLmNyZWF0ZUdob3N0U3VydmV5RWxlbWVudCgpO1xuICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dCA9IHRoaXMuY3JlYXRlRHJhZ2dlZEVsZW1lbnRTaG9ydGN1dCgpO1xuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmQodGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0KTtcbiAgICB0aGlzLm1vdmVTaG9ydGN1dEVsZW1lbnQoZXZlbnQpO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHRoaXMubW92ZURyYWdnZWRFbGVtZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmhhbmRsZUVzY2FwZUJ1dHRvbik7XG4gICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy5kcm9wKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJdGVtVmFsdWVHaG9zdFBvc2l0aW9uKGl0ZW06IGFueSkge1xuICAgIGlmICh0aGlzLmRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50ICE9PSBpdGVtKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5pc0JvdHRvbSkgcmV0dXJuIFwiYm90dG9tXCI7XG4gICAgcmV0dXJuIFwidG9wXCI7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUdob3N0U3VydmV5RWxlbWVudCgpOiBhbnkge1xuICAgIGNvbnN0IHN0YXJ0V2l0aE5ld0xpbmUgPSB0aGlzLmRyYWdnZWRTdXJ2ZXlFbGVtZW50LnN0YXJ0V2l0aE5ld0xpbmU7XG4gICAgbGV0IGNsYXNzTmFtZSA9IFwic3ZjLWRyYWctZHJvcC1naG9zdFwiO1xuXG4gICAgY29uc3QganNvbiA9IHtcbiAgICAgIHR5cGU6IFwiaHRtbFwiLFxuICAgICAgbmFtZTogRHJhZ0Ryb3BIZWxwZXIuZ2hvc3RTdXJ2ZXlFbGVtZW50TmFtZSxcbiAgICAgIGh0bWw6IGA8ZGl2IGNsYXNzPVwiJHtjbGFzc05hbWV9XCI+PC9kaXY+YCxcbiAgICB9O1xuXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudEZyb21Kc29uKGpzb24pO1xuICAgIGVsZW1lbnQuc3RhcnRXaXRoTmV3TGluZSA9IHN0YXJ0V2l0aE5ld0xpbmU7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRHJhZ2dlZEVsZW1lbnRTaG9ydGN1dCgpIHtcbiAgICBjb25zdCBkcmFnZ2VkRWxlbWVudFNob3J0Y3V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb25zdCBkcmFnZ2VkRWxlbWVudDogYW55ID0gdGhpcy5kcmFnZ2VkU3VydmV5RWxlbWVudDtcbiAgICBkcmFnZ2VkRWxlbWVudFNob3J0Y3V0LmlubmVyVGV4dCA9XG4gICAgICBkcmFnZ2VkRWxlbWVudFtcInRpdGxlXCJdIHx8XG4gICAgICBkcmFnZ2VkRWxlbWVudFtcInRleHRcIl0gfHxcbiAgICAgIGRyYWdnZWRFbGVtZW50W1wibmFtZVwiXTtcbiAgICBkcmFnZ2VkRWxlbWVudFNob3J0Y3V0LmNsYXNzTmFtZSA9IFwic3ZjLWRyYWctc2hvcnRjdXRcIjtcbiAgICByZXR1cm4gZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dDtcbiAgfVxuXG4gIHByaXZhdGUgbW92ZURyYWdnZWRFbGVtZW50ID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICB0aGlzLm1vdmVTaG9ydGN1dEVsZW1lbnQoZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuaXNJdGVtVmFsdWVCZWluZ0RyYWdnZWQoKSkge1xuICAgICAgdGhpcy5oYW5kbGVJdGVtVmFsdWVEcmFnT3ZlcihldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlU3VydmV5RWxlbWVudERyYWdPdmVyKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVFc2NhcGVCdXR0b24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAyNykge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG1vdmVTaG9ydGN1dEVsZW1lbnQoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIHRoaXMuZG9TY3JvbGwoZXZlbnQuY2xpZW50WSwgZXZlbnQuY2xpZW50WCk7XG5cbiAgICBjb25zdCBzaG9ydGN1dEhlaWdodCA9IHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3Qgc2hvcnRjdXRXaWR0aCA9IHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBzaG9ydGN1dFhDZW50ZXIgPSBzaG9ydGN1dFdpZHRoIC8gMjtcbiAgICBjb25zdCBzaG9ydGN1dFlDZW50ZXIgPSBzaG9ydGN1dEhlaWdodCAvIDI7XG5cbiAgICBjb25zdCBkb2N1bWVudENsaWVudEhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgZG9jdW1lbnRDbGllbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcblxuICAgIGlmIChldmVudC5jbGllbnRYICsgc2hvcnRjdXRYQ2VudGVyID49IGRvY3VtZW50Q2xpZW50V2lkdGgpIHtcbiAgICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5zdHlsZS5sZWZ0ID1cbiAgICAgICAgZXZlbnQucGFnZVggLVxuICAgICAgICBldmVudC5jbGllbnRYICtcbiAgICAgICAgZG9jdW1lbnRDbGllbnRXaWR0aCAtXG4gICAgICAgIHNob3J0Y3V0V2lkdGggK1xuICAgICAgICBcInB4XCI7XG4gICAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQuc3R5bGUudG9wID1cbiAgICAgICAgZXZlbnQucGFnZVkgLSBzaG9ydGN1dFlDZW50ZXIgKyBcInB4XCI7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmNsaWVudFggLSBzaG9ydGN1dFhDZW50ZXIgPD0gMCkge1xuICAgICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnN0eWxlLmxlZnQgPVxuICAgICAgICBldmVudC5wYWdlWCAtIGV2ZW50LmNsaWVudFggKyBcInB4XCI7XG4gICAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQuc3R5bGUudG9wID1cbiAgICAgICAgZXZlbnQucGFnZVkgLSBzaG9ydGN1dFlDZW50ZXIgKyBcInB4XCI7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmNsaWVudFkgKyBzaG9ydGN1dFlDZW50ZXIgPj0gZG9jdW1lbnRDbGllbnRIZWlnaHQpIHtcbiAgICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5zdHlsZS5sZWZ0ID1cbiAgICAgICAgZXZlbnQucGFnZVggLSBzaG9ydGN1dFhDZW50ZXIgKyBcInB4XCI7XG4gICAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQuc3R5bGUudG9wID1cbiAgICAgICAgZXZlbnQucGFnZVkgLVxuICAgICAgICBldmVudC5jbGllbnRZICtcbiAgICAgICAgZG9jdW1lbnRDbGllbnRIZWlnaHQgLVxuICAgICAgICBzaG9ydGN1dEhlaWdodCArXG4gICAgICAgIFwicHhcIjtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuY2xpZW50WSAtIHNob3J0Y3V0WUNlbnRlciA8PSAwKSB7XG4gICAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQuc3R5bGUubGVmdCA9XG4gICAgICAgIGV2ZW50LnBhZ2VYIC0gc2hvcnRjdXRYQ2VudGVyICsgXCJweFwiO1xuICAgICAgdGhpcy5kcmFnZ2VkRWxlbWVudFNob3J0Y3V0LnN0eWxlLnRvcCA9XG4gICAgICAgIGV2ZW50LnBhZ2VZIC0gZXZlbnQuY2xpZW50WSArIFwicHhcIjtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQuc3R5bGUubGVmdCA9XG4gICAgICBldmVudC5wYWdlWCAtIHNob3J0Y3V0WENlbnRlciArIFwicHhcIjtcbiAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQuc3R5bGUudG9wID1cbiAgICAgIGV2ZW50LnBhZ2VZIC0gc2hvcnRjdXRZQ2VudGVyICsgXCJweFwiO1xuICB9XG5cbiAgcHJpdmF0ZSBkb1Njcm9sbChjbGllbnRZOiBudW1iZXIsIGNsaWVudFg6IG51bWJlcikge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxJbnRlcnZhbElkKTtcbiAgICBjb25zdCBzdGFydFNjcm9sbEJvdW5kYXJ5ID0gNTA7XG5cbiAgICAvLyBuZWVkIHRvIGltcG9ydCBnZXRTY3JvbGxhYmxlUGFyZW50IG1ldGhvZFxuICAgIC8vIGxldCBzY3JvbGxhYmxlUGFyZW50RWxlbWVudCA9IGdldFNjcm9sbGFibGVQYXJlbnQoZHJvcFpvbmVFbGVtZW50KVxuICAgIC8vICAgLnBhcmVudE5vZGU7XG4gICAgbGV0IHNjcm9sbGFibGVQYXJlbnRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgIFwiLnN2Yy10YWItZGVzaWduZXIuc2Qtcm9vdC1tb2Rlcm5cIlxuICAgICk7XG5cbiAgICBsZXQgdG9wID0gc2Nyb2xsYWJsZVBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgIGxldCBib3R0b20gPSBzY3JvbGxhYmxlUGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207XG4gICAgbGV0IGxlZnQgPSBzY3JvbGxhYmxlUGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuICAgIGxldCByaWdodCA9IHNjcm9sbGFibGVQYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0O1xuXG4gICAgaWYgKGNsaWVudFkgLSB0b3AgPD0gc3RhcnRTY3JvbGxCb3VuZGFyeSkge1xuICAgICAgdGhpcy5zY3JvbGxJbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBzY3JvbGxhYmxlUGFyZW50RWxlbWVudC5zY3JvbGxUb3AgLT0gNTtcbiAgICAgIH0sIDEwKTtcbiAgICB9IGVsc2UgaWYgKGJvdHRvbSAtIGNsaWVudFkgPD0gc3RhcnRTY3JvbGxCb3VuZGFyeSkge1xuICAgICAgdGhpcy5zY3JvbGxJbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBzY3JvbGxhYmxlUGFyZW50RWxlbWVudC5zY3JvbGxUb3AgKz0gNTtcbiAgICAgIH0sIDEwKTtcbiAgICB9IGVsc2UgaWYgKHJpZ2h0IC0gY2xpZW50WCA8PSBzdGFydFNjcm9sbEJvdW5kYXJ5KSB7XG4gICAgICB0aGlzLnNjcm9sbEludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHNjcm9sbGFibGVQYXJlbnRFbGVtZW50LnNjcm9sbExlZnQgKz0gNTtcbiAgICAgIH0sIDEwKTtcbiAgICB9IGVsc2UgaWYgKGNsaWVudFggLSBsZWZ0IDw9IHN0YXJ0U2Nyb2xsQm91bmRhcnkpIHtcbiAgICAgIHRoaXMuc2Nyb2xsSW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgc2Nyb2xsYWJsZVBhcmVudEVsZW1lbnQuc2Nyb2xsTGVmdCAtPSA1O1xuICAgICAgfSwgMTApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlSXRlbVZhbHVlRHJhZ092ZXIoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5zdHlsZS5jdXJzb3IgPSBcImdyYWJiaW5nXCI7XG5cbiAgICBjb25zdCBkcmFnSW5mbyA9IHRoaXMuZ2V0RHJhZ0luZm8oZXZlbnQpO1xuICAgIGxldCBkcm9wVGFyZ2V0U3VydmV5RWxlbWVudCA9IGRyYWdJbmZvLmRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50O1xuICAgIGxldCBpc0VkZ2UgPSBkcmFnSW5mby5pc0VkZ2U7XG4gICAgbGV0IGlzQm90dG9tID0gZHJhZ0luZm8uaXNCb3R0b207XG5cbiAgICBjb25zdCBjaG9pY2VzID0gdGhpcy5pdGVtVmFsdWVQYXJlbnRRdWVzdGlvbi5jaG9pY2VzO1xuXG4gICAgLy8gc2hvdWxkbid0IGFsbG93IHRvIGRyb3Agb24gXCJhZG9ybmVyc1wiIChzZWxlY3RhbGwsIG5vbmUsIG90aGVyKVxuICAgIGlmIChjaG9pY2VzLmluZGV4T2YoZHJvcFRhcmdldFN1cnZleUVsZW1lbnQpID09PSAtMSkge1xuICAgICAgdGhpcy5iYW5Ecm9wSGVyZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vZHJhZyBvdmVyIG5leHQgaXRlbVxuICAgIGlmIChcbiAgICAgIGNob2ljZXMuaW5kZXhPZihkcm9wVGFyZ2V0U3VydmV5RWxlbWVudCkgLVxuICAgICAgICBjaG9pY2VzLmluZGV4T2YodGhpcy5kcmFnZ2VkU3VydmV5RWxlbWVudCkgPT09XG4gICAgICAxXG4gICAgKSB7XG4gICAgICBpc0JvdHRvbSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy9kcmFnIG92ZXIgcHJldiBpdGVtXG4gICAgaWYgKFxuICAgICAgY2hvaWNlcy5pbmRleE9mKHRoaXMuZHJhZ2dlZFN1cnZleUVsZW1lbnQpIC1cbiAgICAgICAgY2hvaWNlcy5pbmRleE9mKGRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50KSA9PT1cbiAgICAgIDFcbiAgICApIHtcbiAgICAgIGlzQm90dG9tID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50ID09PSB0aGlzLmRyYWdnZWRTdXJ2ZXlFbGVtZW50KSB7XG4gICAgICB0aGlzLmJhbkRyb3BIZXJlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBkcm9wVGFyZ2V0U3VydmV5RWxlbWVudCA9PT0gdGhpcy5kcm9wVGFyZ2V0U3VydmV5RWxlbWVudCAmJlxuICAgICAgaXNFZGdlID09PSB0aGlzLmlzRWRnZSAmJlxuICAgICAgaXNCb3R0b20gPT09IHRoaXMuaXNCb3R0b21cbiAgICApXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLmRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50ID0gZHJvcFRhcmdldFN1cnZleUVsZW1lbnQ7XG4gICAgdGhpcy5pc0VkZ2UgPSBpc0VkZ2U7XG4gICAgdGhpcy5pc0JvdHRvbSA9IGlzQm90dG9tO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTdXJ2ZXlFbGVtZW50RHJhZ092ZXIoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5zdHlsZS5jdXJzb3IgPSBcImdyYWJiaW5nXCI7XG5cbiAgICBjb25zdCBkcmFnSW5mbyA9IHRoaXMuZ2V0RHJhZ0luZm8oZXZlbnQpO1xuICAgIGxldCBkcm9wVGFyZ2V0U3VydmV5RWxlbWVudCA9IGRyYWdJbmZvLmRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50O1xuICAgIGxldCBpc0VkZ2UgPSBkcmFnSW5mby5pc0VkZ2U7XG4gICAgbGV0IGlzQm90dG9tID0gZHJhZ0luZm8uaXNCb3R0b207XG5cbiAgICBpZiAoIWRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50KSB7XG4gICAgICB0aGlzLmJhbkRyb3BTdXJ2ZXlFbGVtZW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgRHJhZ0Ryb3BIZWxwZXIucmVzdHJpY3REcmFnUXVlc3Rpb25CZXR3ZWVuUGFnZXMgJiZcbiAgICAgIGRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50W1wicGFnZVwiXSAhPT1cbiAgICAgICAgKDxhbnk+dGhpcy5kcmFnZ2VkU3VydmV5RWxlbWVudClbXCJwYWdlXCJdXG4gICAgKSB7XG4gICAgICB0aGlzLmJhbkRyb3BTdXJ2ZXlFbGVtZW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50ID09PSB0aGlzLmdob3N0U3VydmV5RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50ID09PSB0aGlzLmRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50ICYmXG4gICAgICBpc0VkZ2UgPT09IHRoaXMuaXNFZGdlICYmXG4gICAgICBpc0JvdHRvbSA9PT0gdGhpcy5pc0JvdHRvbVxuICAgIClcbiAgICAgIHJldHVybjtcblxuICAgIHRoaXMuaXNFZGdlID0gaXNFZGdlO1xuICAgIHRoaXMuaXNCb3R0b20gPSBpc0JvdHRvbTtcbiAgICB0aGlzLmRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50ID0gZHJvcFRhcmdldFN1cnZleUVsZW1lbnQ7XG4gICAgdGhpcy5pbnNlcnRHaG9zdEVsZW1lbnRJbnRvU3VydmV5KCk7XG4gIH1cblxuICBwcml2YXRlIGdldERyYWdJbmZvKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICBsZXQgZHJvcFRhcmdldEhUTUxFbGVtZW50ID0gdGhpcy5maW5kRHJvcFRhcmdldEhUTUxFbGVtZW50RnJvbVBvaW50KFxuICAgICAgZXZlbnQuY2xpZW50WCxcbiAgICAgIGV2ZW50LmNsaWVudFlcbiAgICApO1xuXG4gICAgaWYgKCFkcm9wVGFyZ2V0SFRNTEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB7IGRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50OiBudWxsLCBpc0VkZ2U6IHRydWUsIGlzQm90dG9tOiB0cnVlIH07XG4gICAgfVxuXG4gICAgbGV0IGRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50ID0gdGhpcy5nZXREcm9wVGFyZ2V0U3VydmV5RWxlbWVudEZyb21IVE1MRWxlbWVudChcbiAgICAgIGRyb3BUYXJnZXRIVE1MRWxlbWVudFxuICAgICk7XG5cbiAgICBsZXQgaXNFZGdlID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5pc0l0ZW1WYWx1ZUJlaW5nRHJhZ2dlZCgpKSB7XG4gICAgICBpZiAoZHJvcFRhcmdldFN1cnZleUVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgICBjb25zdCBwYW5lbERyYWdJbmZvID0gdGhpcy5nZXRQYW5lbERyYWdJbmZvKFxuICAgICAgICAgIGRyb3BUYXJnZXRIVE1MRWxlbWVudCxcbiAgICAgICAgICBkcm9wVGFyZ2V0U3VydmV5RWxlbWVudCxcbiAgICAgICAgICBldmVudFxuICAgICAgICApO1xuICAgICAgICBkcm9wVGFyZ2V0U3VydmV5RWxlbWVudCA9IHBhbmVsRHJhZ0luZm8uZHJvcFRhcmdldFN1cnZleUVsZW1lbnQ7XG4gICAgICAgIGlzRWRnZSA9IHBhbmVsRHJhZ0luZm8uaXNFZGdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkcm9wVGFyZ2V0U3VydmV5RWxlbWVudCA9PT0gdGhpcy5kcmFnZ2VkU3VydmV5RWxlbWVudCkge1xuICAgICAgZHJvcFRhcmdldFN1cnZleUVsZW1lbnQgPSBudWxsO1xuICAgIH1cblxuICAgIGxldCBpc0JvdHRvbSA9IHRoaXMuY2FsY3VsYXRlSXNCb3R0b20oZHJvcFRhcmdldEhUTUxFbGVtZW50LCBldmVudC5jbGllbnRZKTtcblxuICAgIGlmIChcbiAgICAgIC8vIFRPRE8gd2UgY2FuJ3QgZHJvcCBvbiBub3QgZW1wdHkgcGFnZSBkaXJlY3RseSBmb3Igbm93XG4gICAgICBkcm9wVGFyZ2V0U3VydmV5RWxlbWVudCAmJlxuICAgICAgZHJvcFRhcmdldFN1cnZleUVsZW1lbnQuZ2V0VHlwZSgpID09PSBcInBhZ2VcIiAmJlxuICAgICAgZHJvcFRhcmdldFN1cnZleUVsZW1lbnQuZWxlbWVudHMubGVuZ3RoICE9PSAwXG4gICAgKSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IGRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50LmVsZW1lbnRzO1xuICAgICAgZHJvcFRhcmdldFN1cnZleUVsZW1lbnQgPSBpc0JvdHRvbVxuICAgICAgICA/IGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdXG4gICAgICAgIDogZWxlbWVudHNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZHJvcFRhcmdldFN1cnZleUVsZW1lbnQsIGlzRWRnZSwgaXNCb3R0b20gfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFuZWxEcmFnSW5mbyhcbiAgICBIVE1MRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgc3VydmV5RWxlbWVudDogSUVsZW1lbnQsXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudFxuICApIHtcbiAgICBsZXQgaXNFZGdlID0gdGhpcy5jYWxjdWxhdGVJc0VkZ2UoSFRNTEVsZW1lbnQsIGV2ZW50LmNsaWVudFkpO1xuICAgIGxldCBkcm9wVGFyZ2V0U3VydmV5RWxlbWVudCA9IHN1cnZleUVsZW1lbnQ7XG5cbiAgICBpZiAoIWlzRWRnZSkge1xuICAgICAgSFRNTEVsZW1lbnQgPSB0aGlzLmZpbmREZWVwZXN0RHJvcFRhcmdldENoaWxkKEhUTUxFbGVtZW50KTtcblxuICAgICAgZHJvcFRhcmdldFN1cnZleUVsZW1lbnQgPSB0aGlzLmdldERyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50RnJvbUhUTUxFbGVtZW50KFxuICAgICAgICBIVE1MRWxlbWVudFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBkcm9wVGFyZ2V0U3VydmV5RWxlbWVudCwgaXNFZGdlIH07XG4gIH1cblxuICBwcml2YXRlIGJhbkRyb3BIZXJlID0gKCkgPT4ge1xuICAgIHRoaXMuZHJvcFRhcmdldFN1cnZleUVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuaXNCb3R0b20gPSBudWxsO1xuICAgIHRoaXMuaXNFZGdlID0gbnVsbDtcbiAgICB0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQuc3R5bGUuY3Vyc29yID0gXCJub3QtYWxsb3dlZFwiO1xuICB9O1xuXG4gIHByaXZhdGUgYmFuRHJvcFN1cnZleUVsZW1lbnQgPSAoKSA9PiB7XG4gICAgdGhpcy5yZW1vdmVHaG9zdEVsZW1lbnRGcm9tU3VydmV5KCk7XG4gICAgdGhpcy5iYW5Ecm9wSGVyZSgpO1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0RHJvcFRhcmdldFN1cnZleUVsZW1lbnROYW1lKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgbGV0IGRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50TmFtZSA9IGVsZW1lbnQuZGF0YXNldC5zdmNEcm9wVGFyZ2V0RWxlbWVudE5hbWU7XG4gICAgaWYgKCFkcm9wVGFyZ2V0U3VydmV5RWxlbWVudE5hbWUpIHtcbiAgICAgIGRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50TmFtZSA9IGVsZW1lbnQuZGF0YXNldC5zdmNEcm9wVGFyZ2V0SXRlbVZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZHJvcFRhcmdldFN1cnZleUVsZW1lbnROYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREcm9wVGFyZ2V0U3VydmV5RWxlbWVudEZyb21IVE1MRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGxldCByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGRyb3BUYXJnZXROYW1lID0gdGhpcy5nZXREcm9wVGFyZ2V0U3VydmV5RWxlbWVudE5hbWUoZWxlbWVudCk7XG4gICAgbGV0IGlzRHJhZ092ZXJJbm5lclBhbmVsID0gZmFsc2U7XG4gICAgaWYgKCFkcm9wVGFyZ2V0TmFtZSkge1xuICAgICAgY29uc3QgbmVhcmVzdERyb3BUYXJnZXRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Q8XG4gICAgICAgIEhUTUxFbGVtZW50XG4gICAgICA+KHRoaXMuZHJvcFRhcmdldERhdGFBdHRyaWJ1dGVOYW1lKTtcbiAgICAgIGRyb3BUYXJnZXROYW1lID0gdGhpcy5nZXREcm9wVGFyZ2V0U3VydmV5RWxlbWVudE5hbWUoXG4gICAgICAgIG5lYXJlc3REcm9wVGFyZ2V0RWxlbWVudFxuICAgICAgKTtcbiAgICAgIGlzRHJhZ092ZXJJbm5lclBhbmVsID1cbiAgICAgICAgbmVhcmVzdERyb3BUYXJnZXRFbGVtZW50ICE9PSBlbGVtZW50ICYmICEhZHJvcFRhcmdldE5hbWU7XG4gICAgfVxuICAgIGlmICghZHJvcFRhcmdldE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgZHJvcCB0YXJnZXQgc3VydmV5IGVsZW1lbnQgbmFtZVwiKTtcbiAgICB9XG5cbiAgICBpZiAoZHJvcFRhcmdldE5hbWUgPT09IERyYWdEcm9wSGVscGVyLmdob3N0U3VydmV5RWxlbWVudE5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdob3N0U3VydmV5RWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBkcm9wIHRvIHBhZ2VcbiAgICBpZiAoZHJvcFRhcmdldE5hbWUgPT09IFwibmV3R2hvc3RQYWdlXCIpIHtcbiAgICAgIHJlc3VsdCA9IERyYWdEcm9wSGVscGVyLm5ld0dob3N0UGFnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdGhpcy5zdXJ2ZXkuZ2V0UGFnZUJ5TmFtZShkcm9wVGFyZ2V0TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gZHJvcCB0byBlbGVtZW50IChxdWVzdGlvbiBvciBwYW5lbClcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgbGV0IGVsZW1lbnQ7XG4gICAgICB0aGlzLnN1cnZleS5wYWdlcy5mb3JFYWNoKChwYWdlOiBQYWdlTW9kZWwpID0+IHtcbiAgICAgICAgZWxlbWVudCA9IHBhZ2UuZ2V0RWxlbWVudEJ5TmFtZShkcm9wVGFyZ2V0TmFtZSk7XG4gICAgICAgIGlmIChlbGVtZW50KSByZXN1bHQgPSBlbGVtZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoXG4gICAgICAgICEhcmVzdWx0ICYmXG4gICAgICAgIHJlc3VsdC5nZXRUeXBlKCkgPT09IFwicGFuZWxkeW5hbWljXCIgJiZcbiAgICAgICAgaXNEcmFnT3ZlcklubmVyUGFuZWxcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwYWdlID0gKDxhbnk+cmVzdWx0KS5wYWdlO1xuICAgICAgICByZXN1bHQgPSAoPGFueT5yZXN1bHQpLnRlbXBsYXRlO1xuICAgICAgICByZXN1bHQucGFnZSA9IHBhZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZHJvcCB0byBpdGVtLXZhbHVlXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuaXRlbVZhbHVlUGFyZW50UXVlc3Rpb24uY2hvaWNlcy5maWx0ZXIoXG4gICAgICAgIChjaG9pY2UpID0+IGNob2ljZS52YWx1ZSA9PT0gZHJvcFRhcmdldE5hbWVcbiAgICAgIClbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlTWlkZGxlT2ZIVE1MRWxlbWVudChIVE1MRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCByZWN0ID0gSFRNTEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHJlY3QueSArIHJlY3QuaGVpZ2h0IC8gMjtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlSXNCb3R0b20oSFRNTEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjbGllbnRZOiBudW1iZXIpIHtcbiAgICBjb25zdCBtaWRkbGUgPSB0aGlzLmNhbGN1bGF0ZU1pZGRsZU9mSFRNTEVsZW1lbnQoSFRNTEVsZW1lbnQpO1xuICAgIHJldHVybiBjbGllbnRZID49IG1pZGRsZTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlSXNFZGdlKEhUTUxFbGVtZW50OiBIVE1MRWxlbWVudCwgY2xpZW50WTogbnVtYmVyKSB7XG4gICAgY29uc3QgbWlkZGxlID0gdGhpcy5jYWxjdWxhdGVNaWRkbGVPZkhUTUxFbGVtZW50KEhUTUxFbGVtZW50KTtcbiAgICByZXR1cm4gTWF0aC5hYnMoY2xpZW50WSAtIG1pZGRsZSkgPj0gRHJhZ0Ryb3BIZWxwZXIuZWRnZUhlaWdodDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERyb3BUYXJnZXRIVE1MRWxlbWVudChkcmFnZ2VkT3Zlck5vZGU6IEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgaWYgKCFkcmFnZ2VkT3Zlck5vZGUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmRyb3BUYXJnZXREYXRhQXR0cmlidXRlTmFtZTtcbiAgICBsZXQgZHJvcFRhcmdldEhUTUxFbGVtZW50ID1cbiAgICAgIGRyYWdnZWRPdmVyTm9kZS5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihzZWxlY3RvcikgfHxcbiAgICAgIGRyYWdnZWRPdmVyTm9kZS5jbG9zZXN0PEhUTUxFbGVtZW50PihzZWxlY3Rvcik7XG5cbiAgICByZXR1cm4gZHJvcFRhcmdldEhUTUxFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRHJvcFRhcmdldEhUTUxFbGVtZW50RnJvbVBvaW50KFxuICAgIGNsaWVudFg6IG51bWJlcixcbiAgICBjbGllbnRZOiBudW1iZXJcbiAgKTogSFRNTEVsZW1lbnQge1xuICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5oaWRkZW4gPSB0cnVlO1xuICAgIGxldCBkcmFnZ2VkT3Zlck5vZGUgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5oaWRkZW4gPSBmYWxzZTtcblxuICAgIHJldHVybiB0aGlzLmZpbmREcm9wVGFyZ2V0SFRNTEVsZW1lbnQoZHJhZ2dlZE92ZXJOb2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERlZXBlc3REcm9wVGFyZ2V0Q2hpbGQocGFyZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBzZWxlY3RvciA9IFwiW2RhdGEtc3ZjLWRyb3AtdGFyZ2V0LWVsZW1lbnQtbmFtZV1cIjtcblxuICAgIGxldCByZXN1bHQgPSBwYXJlbnQ7XG4gICAgd2hpbGUgKCEhcGFyZW50KSB7XG4gICAgICByZXN1bHQgPSBwYXJlbnQ7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIDxIVE1MRWxlbWVudD5yZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGluc2VydEdob3N0RWxlbWVudEludG9TdXJ2ZXkoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5yZW1vdmVHaG9zdEVsZW1lbnRGcm9tU3VydmV5KCk7XG5cbiAgICB0aGlzLmdob3N0U3VydmV5RWxlbWVudC5uYW1lID0gRHJhZ0Ryb3BIZWxwZXIuZ2hvc3RTdXJ2ZXlFbGVtZW50TmFtZTsgLy9UT0RPIHdoeSBkbyB3ZSBuZWVkIHNldHVwIGl0IG1hbnVhbGx5IHNlZSBjcmVhdGVHaG9zdFN1cnZleUVsZW1lbnQgbWV0aG9kXG5cbiAgICB0aGlzLnBhZ2VPclBhbmVsID0gdGhpcy5kcm9wVGFyZ2V0U3VydmV5RWxlbWVudC5pc1BhZ2VcbiAgICAgID8gdGhpcy5kcm9wVGFyZ2V0U3VydmV5RWxlbWVudFxuICAgICAgOiAoPGFueT50aGlzLmRyb3BUYXJnZXRTdXJ2ZXlFbGVtZW50KVtcInBhZ2VcIl07XG5cbiAgICB0aGlzLnBhZ2VPclBhbmVsLmRyYWdEcm9wU3RhcnQoXG4gICAgICB0aGlzLmRyYWdnZWRTdXJ2ZXlFbGVtZW50LFxuICAgICAgdGhpcy5naG9zdFN1cnZleUVsZW1lbnQsXG4gICAgICBEcmFnRHJvcEhlbHBlci5uZXN0ZWRQYW5lbERlcHRoXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnBhZ2VPclBhbmVsLmRyYWdEcm9wTW92ZVRvKFxuICAgICAgdGhpcy5kcm9wVGFyZ2V0U3VydmV5RWxlbWVudCxcbiAgICAgIHRoaXMuaXNCb3R0b20sXG4gICAgICB0aGlzLmlzRWRnZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluc2VydFJlYWxFbGVtZW50SW50b1N1cnZleSgpIHtcbiAgICB0aGlzLnJlbW92ZUdob3N0RWxlbWVudEZyb21TdXJ2ZXkoKTtcblxuICAgIC8vIGdob3N0IG5ldyBwYWdlXG4gICAgaWYgKFxuICAgICAgdGhpcy5kcm9wVGFyZ2V0U3VydmV5RWxlbWVudC5pc1BhZ2UgJiZcbiAgICAgICg8YW55PnRoaXMuZHJvcFRhcmdldFN1cnZleUVsZW1lbnQpW1wiX2lzR2hvc3RcIl1cbiAgICApIHtcbiAgICAgICg8YW55PnRoaXMuZHJvcFRhcmdldFN1cnZleUVsZW1lbnQpW1wiX2FkZEdob3N0UGFnZVZpZXdNb2JlbFwiXSgpO1xuICAgIH1cbiAgICAvLyBFTyBnaG9zdCBuZXcgcGFnZVxuXG4gICAgLy8gZmFrZSB0YXJnZXQgZWxlbWVudCAobmVlZCBvbmx5IGZvciBcInN0YXJ0V2l0aE5ld0xpbmU6ZmFsc2VcIiBmZWF0dXJlKVxuICAgIC8vVE9ETyBuZWVkIGZvciBkcmFnRHJvcCBoZWxwZXIgaW4gbGlicmFyeVxuICAgIGNvbnN0IGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdCh0aGlzLmRyYWdnZWRTdXJ2ZXlFbGVtZW50KTtcbiAgICBqc29uW1widHlwZVwiXSA9IHRoaXMuZHJhZ2dlZFN1cnZleUVsZW1lbnQuZ2V0VHlwZSgpO1xuICAgIGNvbnN0IGZha2VUYXJnZXRFbGVtZW50ID0gdGhpcy5jcmVhdGVGYWtlVGFyZ2V0RWxlbWVudChcbiAgICAgIHRoaXMuZHJhZ2dlZFN1cnZleUVsZW1lbnQubmFtZSxcbiAgICAgIGpzb25cbiAgICApO1xuICAgIC8vIEVPIGZha2UgdGFyZ2V0IGVsZW1lbnRcblxuICAgIHRoaXMucGFnZU9yUGFuZWwuZHJhZ0Ryb3BTdGFydChcbiAgICAgIHRoaXMuZHJhZ2dlZFN1cnZleUVsZW1lbnQsXG4gICAgICBmYWtlVGFyZ2V0RWxlbWVudCxcbiAgICAgIERyYWdEcm9wSGVscGVyLm5lc3RlZFBhbmVsRGVwdGhcbiAgICApO1xuXG4gICAgdGhpcy5wYWdlT3JQYW5lbC5kcmFnRHJvcE1vdmVUbyhcbiAgICAgIHRoaXMuZHJvcFRhcmdldFN1cnZleUVsZW1lbnQsXG4gICAgICB0aGlzLmlzQm90dG9tLFxuICAgICAgdGhpcy5pc0VkZ2VcbiAgICApO1xuXG4gICAgdGhpcy5vbkJlZm9yZURyb3AuZmlyZSh0aGlzLCBudWxsKTtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gdGhpcy5wYWdlT3JQYW5lbC5kcmFnRHJvcEZpbmlzaCgpO1xuICAgIHRoaXMub25BZnRlckRyb3AuZmlyZSh0aGlzLCB7IGRyYWdnZWRFbGVtZW50OiBuZXdFbGVtZW50IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVHaG9zdEVsZW1lbnRGcm9tU3VydmV5KCkge1xuICAgIGlmICghIXRoaXMucGFnZU9yUGFuZWwpIHRoaXMucGFnZU9yUGFuZWwuZHJhZ0Ryb3BGaW5pc2godHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVsZW1lbnRGcm9tSnNvbihqc29uOiBvYmplY3QpIHtcbiAgICBjb25zdCBlbGVtZW50OiBhbnkgPSB0aGlzLmNyZWF0ZU5ld0VsZW1lbnQoanNvbik7XG4gICAgaWYgKGVsZW1lbnRbXCJzZXRTdXJ2ZXlJbXBsXCJdKSB7XG4gICAgICBlbGVtZW50W1wic2V0U3VydmV5SW1wbFwiXSh0aGlzLnN1cnZleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRbXCJzZXREYXRhXCJdKHRoaXMuc3VydmV5KTtcbiAgICB9XG4gICAgZWxlbWVudC5yZW5kZXJXaWR0aCA9IFwiMTAwJVwiO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXdFbGVtZW50KGpzb246IGFueSk6IElFbGVtZW50IHtcbiAgICB2YXIgbmV3RWxlbWVudCA9IFNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoanNvbltcInR5cGVcIl0pO1xuICAgIG5ldyBKc29uT2JqZWN0KCkudG9PYmplY3QoanNvbiwgbmV3RWxlbWVudCk7XG4gICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZha2VUYXJnZXRFbGVtZW50KGVsZW1lbnROYW1lOiBzdHJpbmcsIGpzb246IGFueSk6IGFueSB7XG4gICAgaWYgKCFlbGVtZW50TmFtZSB8fCAhanNvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIHRhcmdldEVsZW1lbnQgPSBudWxsO1xuICAgIHRhcmdldEVsZW1lbnQgPSBTZXJpYWxpemVyLmNyZWF0ZUNsYXNzKGpzb25bXCJ0eXBlXCJdKTtcbiAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHRhcmdldEVsZW1lbnQpO1xuICAgIHRhcmdldEVsZW1lbnQubmFtZSA9IGVsZW1lbnROYW1lO1xuICAgIGlmICh0YXJnZXRFbGVtZW50W1wic2V0U3VydmV5SW1wbFwiXSkge1xuICAgICAgdGFyZ2V0RWxlbWVudFtcInNldFN1cnZleUltcGxcIl0odGhpcy5zdXJ2ZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRFbGVtZW50W1wic2V0RGF0YVwiXSh0aGlzLnN1cnZleSk7XG4gICAgfVxuICAgIHRhcmdldEVsZW1lbnQucmVuZGVyV2lkdGggPSBcIjEwMCVcIjtcbiAgICByZXR1cm4gdGFyZ2V0RWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZHJvcCA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5pc0l0ZW1WYWx1ZUJlaW5nRHJhZ2dlZCgpKSB7XG4gICAgICB0aGlzLmRvRHJvcEl0ZW1WYWx1ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRvRHJvcFN1cnZleUVsZW1lbnQoKTtcbiAgICB9XG4gICAgdGhpcy5jbGVhcigpO1xuICB9O1xuXG4gIHByaXZhdGUgZG9Ecm9wU3VydmV5RWxlbWVudCgpIHtcbiAgICBpZiAodGhpcy5kcm9wVGFyZ2V0U3VydmV5RWxlbWVudCkge1xuICAgICAgdGhpcy5pbnNlcnRSZWFsRWxlbWVudEludG9TdXJ2ZXkoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRvRHJvcEl0ZW1WYWx1ZSA9ICgpID0+IHtcbiAgICBjb25zdCBpc1RvcCA9ICF0aGlzLmlzQm90dG9tO1xuICAgIGNvbnN0IGNob2ljZXMgPSB0aGlzLml0ZW1WYWx1ZVBhcmVudFF1ZXN0aW9uLmNob2ljZXM7XG4gICAgY29uc3Qgb2xkSW5kZXggPSBjaG9pY2VzLmluZGV4T2YodGhpcy5kcmFnZ2VkU3VydmV5RWxlbWVudCk7XG4gICAgbGV0IG5ld0luZGV4ID0gY2hvaWNlcy5pbmRleE9mKHRoaXMuZHJvcFRhcmdldFN1cnZleUVsZW1lbnQpO1xuXG4gICAgaWYgKG9sZEluZGV4IDwgbmV3SW5kZXggJiYgaXNUb3ApIHtcbiAgICAgIG5ld0luZGV4LS07XG4gICAgfSBlbHNlIGlmIChvbGRJbmRleCA+IG5ld0luZGV4ICYmIHRoaXMuaXNCb3R0b20pIHtcbiAgICAgIG5ld0luZGV4Kys7XG4gICAgfVxuXG4gICAgdGhpcy5vbkJlZm9yZURyb3AuZmlyZSh0aGlzLCBudWxsKTtcbiAgICBjaG9pY2VzLnNwbGljZShvbGRJbmRleCwgMSk7XG4gICAgY2hvaWNlcy5zcGxpY2UobmV3SW5kZXgsIDAsIHRoaXMuZHJhZ2dlZFN1cnZleUVsZW1lbnQpO1xuICAgIHRoaXMub25BZnRlckRyb3AuZmlyZSh0aGlzLCB7XG4gICAgICBkcmFnZ2VkRWxlbWVudDogdGhpcy5pdGVtVmFsdWVQYXJlbnRRdWVzdGlvbixcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGNsZWFyID0gKCkgPT4ge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxJbnRlcnZhbElkKTtcblxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCB0aGlzLm1vdmVEcmFnZ2VkRWxlbWVudCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5oYW5kbGVFc2NhcGVCdXR0b24pO1xuICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHRoaXMuZHJvcCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLmRyYWdnZWRFbGVtZW50U2hvcnRjdXQpO1xuXG4gICAgdGhpcy5yZW1vdmVHaG9zdEVsZW1lbnRGcm9tU3VydmV5KCk7XG5cbiAgICBjb25zdCBwcmV2RXZlbnQgPSBEcmFnRHJvcEhlbHBlci5wcmV2RXZlbnQ7XG4gICAgcHJldkV2ZW50LmVsZW1lbnQgPSBudWxsO1xuICAgIHByZXZFdmVudC54ID0gLTE7XG4gICAgcHJldkV2ZW50LnkgPSAtMTtcblxuICAgIHRoaXMuZHJvcFRhcmdldFN1cnZleUVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnRTaG9ydGN1dCA9IG51bGw7XG4gICAgdGhpcy5naG9zdFN1cnZleUVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuZHJhZ2dlZFN1cnZleUVsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMucGFnZU9yUGFuZWwgPSBudWxsO1xuICAgIHRoaXMuaXRlbVZhbHVlUGFyZW50UXVlc3Rpb24gPSBudWxsO1xuICAgIHRoaXMuaXNCb3R0b20gPSBudWxsO1xuICAgIHRoaXMuaXNFZGdlID0gbnVsbDtcbiAgICB0aGlzLnNjcm9sbEludGVydmFsSWQgPSBudWxsO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuLyoqXG4gKiBUaGUgY2xhc3MgY29udGFpbnMgbWV0aG9kcyB0byB3b3JrIHdpdGggYXBpLnN1cnZleWpzLmlvIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBkeFN1cnZleVNlcnZpY2Uge1xuICBwdWJsaWMgc3RhdGljIGdldCBzZXJ2aWNlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNldHRpbmdzLnN1cnZleVNlcnZpY2VVcmw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgc2VydmljZVVybCh2YWw6IHN0cmluZykge1xuICAgIHNldHRpbmdzLnN1cnZleVNlcnZpY2VVcmwgPSB2YWw7XG4gIH1cbiAgY29uc3RydWN0b3IoKSB7fVxuICBwdWJsaWMgbG9hZFN1cnZleShcbiAgICBzdXJ2ZXlJZDogc3RyaW5nLFxuICAgIG9uTG9hZDogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogc3RyaW5nLCByZXNwb25zZTogYW55KSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbihcbiAgICAgIFwiR0VUXCIsXG4gICAgICBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArIFwiL2dldFN1cnZleT9zdXJ2ZXlJZD1cIiArIHN1cnZleUlkXG4gICAgKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgIG9uTG9hZCh4aHIuc3RhdHVzID09IDIwMCwgcmVzdWx0LCB4aHIucmVzcG9uc2UpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0U3VydmV5SnNvbkFuZElzQ29tcGxldGVkKFxuICAgIHN1cnZleUlkOiBzdHJpbmcsXG4gICAgY2xpZW50SWQ6IHN0cmluZyxcbiAgICBvbkxvYWQ6IChcbiAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICBzdXJ2ZXlKc29uOiBhbnksXG4gICAgICByZXN1bHQ6IHN0cmluZyxcbiAgICAgIHJlc3BvbnNlOiBhbnlcbiAgICApID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKFxuICAgICAgXCJHRVRcIixcbiAgICAgIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICtcbiAgICAgICAgXCIvZ2V0U3VydmV5QW5kSXNDb21wbGV0ZWQ/c3VydmV5SWQ9XCIgK1xuICAgICAgICBzdXJ2ZXlJZCArXG4gICAgICAgIFwiJmNsaWVudElkPVwiICtcbiAgICAgICAgY2xpZW50SWRcbiAgICApO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgdmFyIHN1cnZleUpzb24gPSByZXN1bHQgPyByZXN1bHQuc3VydmV5IDogbnVsbDtcbiAgICAgIHZhciBpc0NvbXBsZXRlZCA9IHJlc3VsdCA/IHJlc3VsdC5pc0NvbXBsZXRlZCA6IG51bGw7XG4gICAgICBvbkxvYWQoeGhyLnN0YXR1cyA9PSAyMDAsIHN1cnZleUpzb24sIGlzQ29tcGxldGVkLCB4aHIucmVzcG9uc2UpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoKTtcbiAgfVxuICBwdWJsaWMgc2VuZFJlc3VsdChcbiAgICBwb3N0SWQ6IHN0cmluZyxcbiAgICByZXN1bHQ6IEpTT04sXG4gICAgb25TZW5kUmVzdWx0OiAoc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSwgcmVxdWVzdD86IGFueSkgPT4gdm9pZCxcbiAgICBjbGllbnRJZDogc3RyaW5nID0gbnVsbCxcbiAgICBpc1BhcnRpYWxDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oXCJQT1NUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvcG9zdC9cIik7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHZhciBkYXRhID0geyBwb3N0SWQ6IHBvc3RJZCwgc3VydmV5UmVzdWx0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQpIH07XG4gICAgaWYgKGNsaWVudElkKSAoPGFueT5kYXRhKVtcImNsaWVudElkXCJdID0gY2xpZW50SWQ7XG4gICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCkgKDxhbnk+ZGF0YSlbXCJpc1BhcnRpYWxDb21wbGV0ZWRcIl0gPSB0cnVlO1xuICAgIHZhciBkYXRhU3RyaW5naWZ5OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgeGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFvblNlbmRSZXN1bHQpIHJldHVybjtcbiAgICAgIG9uU2VuZFJlc3VsdCh4aHIuc3RhdHVzID09PSAyMDAsIHhoci5yZXNwb25zZSwgeGhyKTtcbiAgICB9O1xuICAgIHhoci5zZW5kKGRhdGFTdHJpbmdpZnkpO1xuICB9XG4gIHB1YmxpYyBzZW5kRmlsZShcbiAgICBwb3N0SWQ6IHN0cmluZyxcbiAgICBmaWxlOiBGaWxlLFxuICAgIG9uU2VuZEZpbGU6IChzdWNjZXNzOiBib29sZWFuLCByZXNwb25zZTogYW55KSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub25sb2FkID0geGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIW9uU2VuZEZpbGUpIHJldHVybjtcbiAgICAgIG9uU2VuZEZpbGUoeGhyLnN0YXR1cyA9PSAyMDAsIEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKSk7XG4gICAgfTtcbiAgICB4aHIub3BlbihcIlBPU1RcIiwgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyBcIi91cGxvYWQvXCIsIHRydWUpO1xuICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcImZpbGVcIiwgZmlsZSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKFwicG9zdElkXCIsIHBvc3RJZCk7XG4gICAgeGhyLnNlbmQoZm9ybURhdGEpO1xuICB9XG4gIHB1YmxpYyBnZXRSZXN1bHQoXG4gICAgcmVzdWx0SWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb25HZXRSZXN1bHQ6IChcbiAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICBkYXRhOiBhbnksXG4gICAgICBkYXRhTGlzdDogQXJyYXk8YW55PixcbiAgICAgIHJlc3BvbnNlOiBhbnlcbiAgICApID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHZhciBkYXRhID0gXCJyZXN1bHRJZD1cIiArIHJlc3VsdElkICsgXCImbmFtZT1cIiArIG5hbWU7XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyBcIi9nZXRSZXN1bHQ/XCIgKyBkYXRhKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgICAgdmFyIGxpc3QgPSBudWxsO1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgbGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0LlF1ZXN0aW9uUmVzdWx0KSB7XG4gICAgICAgICAgdmFyIGVsID0geyBuYW1lOiBrZXksIHZhbHVlOiByZXN1bHQuUXVlc3Rpb25SZXN1bHRba2V5XSB9O1xuICAgICAgICAgIGxpc3QucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uR2V0UmVzdWx0KHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIGxpc3QsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBpc0NvbXBsZXRlZChcbiAgICByZXN1bHRJZDogc3RyaW5nLFxuICAgIGNsaWVudElkOiBzdHJpbmcsXG4gICAgb25Jc0NvbXBsZXRlZDogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogc3RyaW5nLCByZXNwb25zZTogYW55KSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgZGF0YSA9IFwicmVzdWx0SWQ9XCIgKyByZXN1bHRJZCArIFwiJmNsaWVudElkPVwiICsgY2xpZW50SWQ7XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyBcIi9pc0NvbXBsZXRlZD9cIiArIGRhdGEpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgb25Jc0NvbXBsZXRlZCh4aHIuc3RhdHVzID09IDIwMCwgcmVzdWx0LCB4aHIucmVzcG9uc2UpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoKTtcbiAgfVxufVxuIiwiaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2FyYWJpY1wiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2Jhc3F1ZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2J1bGdhcmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2NhdGFsYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9jcm9hdGlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2N6ZWNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZGFuaXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZHV0Y2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9lc3RvbmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2Zpbm5pc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9mcmVuY2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9nZW9yZ2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2dlcm1hblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2dyZWVrXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaGVicmV3XCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaGluZGlcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9odW5nYXJpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9pY2VsYW5kaWNcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9pbmRvbmVzaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaXRhbGlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2phcGFuZXNlXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24va2F6YWtoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24va29yZWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vbGF0dmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2xpdGh1YW5pYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9tYWNlZG9uaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vbm9yd2VnaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcGVyc2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3BvbGlzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2VcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9wb3J0dWd1ZXNlLWJyXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcm9tYW5pYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9ydXNzaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vc2VyYmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3NpbXBsaWZpZWQtY2hpbmVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3NwYW5pc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9zd2FoaWxpXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vc3dlZGlzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3RhamlrXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vdGhhaVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3RyYWRpdGlvbmFsLWNoaW5lc2VcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi90dXJraXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vdWtyYWluaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vdmlldG5hbWVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3dlbHNoXCI7XG4iLCIvLyBzdHlsZXNcbmltcG9ydCBcIi4uLy4uL21haW4uc2Nzc1wiO1xuLy9pbXBvcnQgXCIuLi8uLi9tb2Rlcm4uc2Nzc1wiO1xuXG5leHBvcnQgdmFyIFZlcnNpb246IHN0cmluZztcblZlcnNpb24gPSBgJHtwcm9jZXNzLmVudi5WRVJTSU9OfWA7XG5cbmV4cG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzXCI7XG5leHBvcnQgeyBIZWxwZXJzLCBIYXNoVGFibGUgfSBmcm9tIFwiLi4vLi4vaGVscGVyc1wiO1xuZXhwb3J0IHtcbiAgQW5zd2VyQ291bnRWYWxpZGF0b3IsXG4gIEVtYWlsVmFsaWRhdG9yLFxuICBOdW1lcmljVmFsaWRhdG9yLFxuICBSZWdleFZhbGlkYXRvcixcbiAgU3VydmV5VmFsaWRhdG9yLFxuICBUZXh0VmFsaWRhdG9yLFxuICBWYWxpZGF0b3JSZXN1bHQsXG4gIEV4cHJlc3Npb25WYWxpZGF0b3IsXG4gIFZhbGlkYXRvclJ1bm5lcixcbn0gZnJvbSBcIi4uLy4uL3ZhbGlkYXRvclwiO1xuZXhwb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4uLy4uL2l0ZW12YWx1ZVwiO1xuZXhwb3J0IHsgQmFzZSwgRXZlbnQsIEFycmF5Q2hhbmdlcyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5leHBvcnQge1xuICBJU3VydmV5LFxuICBJU3VydmV5RWxlbWVudCxcbiAgSUVsZW1lbnQsXG4gIElQYWdlLFxuICBJVGl0bGVPd25lcixcbn0gZnJvbSBcIi4uLy4uL2Jhc2UtaW50ZXJmYWNlc1wiO1xuZXhwb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi4vLi4vc3VydmV5LWVycm9yXCI7XG5leHBvcnQgeyBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4uLy4uL3N1cnZleS1lbGVtZW50XCI7XG5leHBvcnQgeyBDYWxjdWxhdGVkVmFsdWUgfSBmcm9tIFwiLi4vLi4vY2FsY3VsYXRlZFZhbHVlXCI7XG5leHBvcnQge1xuICBDdXN0b21FcnJvcixcbiAgQW5zd2VyUmVxdWlyZWRFcnJvcixcbiAgT25lQW5zd2VyUmVxdWlyZWRFcnJvcixcbiAgUmVxdXJlTnVtZXJpY0Vycm9yLFxuICBFeGNlZWRTaXplRXJyb3IsXG59IGZyb20gXCIuLi8uLi9lcnJvclwiO1xuZXhwb3J0IHtcbiAgSUxvY2FsaXphYmxlT3duZXIsXG4gIElMb2NhbGl6YWJsZVN0cmluZyxcbiAgTG9jYWxpemFibGVTdHJpbmcsXG4gIExvY2FsaXphYmxlU3RyaW5ncyxcbn0gZnJvbSBcIi4uLy4uL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5leHBvcnQgeyBIdG1sQ29uZGl0aW9uSXRlbSwgVXJsQ29uZGl0aW9uSXRlbSB9IGZyb20gXCIuLi8uLi9leHByZXNzaW9uSXRlbXNcIjtcbmV4cG9ydCB7IENob2ljZXNSZXN0ZnVsLCBDaG9pY2VzUmVzdGZ1bGwgfSBmcm9tIFwiLi4vLi4vY2hvaWNlc1Jlc3RmdWxcIjtcbmV4cG9ydCB7IEZ1bmN0aW9uRmFjdG9yeSwgcmVnaXN0ZXJGdW5jdGlvbiB9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnNmYWN0b3J5XCI7XG5leHBvcnQgeyBDb25kaXRpb25SdW5uZXIsIEV4cHJlc3Npb25SdW5uZXIgfSBmcm9tIFwiLi4vLi4vY29uZGl0aW9uc1wiO1xuZXhwb3J0IHtcbiAgT3BlcmFuZCxcbiAgQ29uc3QsXG4gIEJpbmFyeU9wZXJhbmQsXG4gIFZhcmlhYmxlLFxuICBGdW5jdGlvbk9wZXJhbmQsXG4gIEFycmF5T3BlcmFuZCxcbn0gZnJvbSBcIi4uLy4uL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zXCI7XG5leHBvcnQgeyBDb25kaXRpb25zUGFyc2VyIH0gZnJvbSBcIi4uLy4uL2NvbmRpdGlvbnNQYXJzZXJcIjtcbmV4cG9ydCB7IFByb2Nlc3NWYWx1ZSB9IGZyb20gXCIuLi8uLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmV4cG9ydCB7XG4gIEpzb25FcnJvcixcbiAgSnNvbkluY29ycmVjdFR5cGVFcnJvcixcbiAgSnNvbk1ldGFkYXRhLFxuICBKc29uTWV0YWRhdGFDbGFzcyxcbiAgSnNvbk1pc3NpbmdUeXBlRXJyb3IsXG4gIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSxcbiAgSnNvbk9iamVjdCxcbiAgSnNvbk9iamVjdFByb3BlcnR5LFxuICBKc29uUmVxdWlyZWRQcm9wZXJ0eUVycm9yLFxuICBKc29uVW5rbm93blByb3BlcnR5RXJyb3IsXG4gIFNlcmlhbGl6ZXIsXG4gIHByb3BlcnR5LFxuICBwcm9wZXJ0eUFycmF5LFxufSBmcm9tIFwiLi4vLi4vanNvbm9iamVjdFwiO1xuZXhwb3J0IHtcbiAgTWF0cml4RHJvcGRvd25DZWxsLFxuICBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgbWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcyxcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyxcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUsXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmV4cG9ydCB7XG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWwsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duXCI7XG5leHBvcnQge1xuICBNYXRyaXhEeW5hbWljUm93TW9kZWwsXG4gIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsLFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbWF0cml4ZHluYW1pY1wiO1xuZXhwb3J0IHtcbiAgTWF0cml4Um93TW9kZWwsXG4gIE1hdHJpeENlbGxzLFxuICBRdWVzdGlvbk1hdHJpeE1vZGVsLFxuICBJTWF0cml4RGF0YSxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeFwiO1xuZXhwb3J0IHtcbiAgTXVsdGlwbGVUZXh0SXRlbU1vZGVsLFxuICBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsLFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbXVsdGlwbGV0ZXh0XCI7XG5leHBvcnQgeyBQYW5lbE1vZGVsLCBQYW5lbE1vZGVsQmFzZSwgUXVlc3Rpb25Sb3dNb2RlbCB9IGZyb20gXCIuLi8uLi9wYW5lbFwiO1xuZXhwb3J0IHsgRmxvd1BhbmVsTW9kZWwgfSBmcm9tIFwiLi4vLi4vZmxvd3BhbmVsXCI7XG5leHBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi4vLi4vcGFnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4uLy4uL3RlbXBsYXRlLXJlbmRlcmVyXCI7XG5leHBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi8uLi9xdWVzdGlvblwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Ob25WYWx1ZSB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbm5vbnZhbHVlXCI7XG5leHBvcnQgeyBRdWVzdGlvbkVtcHR5TW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fZW1wdHlcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uQ2hlY2tib3hCYXNlLFxuICBRdWVzdGlvblNlbGVjdEJhc2UsXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5leHBvcnQgeyBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fY2hlY2tib3hcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3JhbmtpbmdcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ29tbWVudE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2NvbW1lbnRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9kcm9wZG93blwiO1xuZXhwb3J0IHsgUXVlc3Rpb25GYWN0b3J5LCBFbGVtZW50RmFjdG9yeSB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRmlsZU1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2ZpbGVcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSHRtbE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2h0bWxcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3JhZGlvZ3JvdXBcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmF0aW5nTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fcmF0aW5nXCI7XG5leHBvcnQgeyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9leHByZXNzaW9uXCI7XG5leHBvcnQgeyBRdWVzdGlvblRleHRNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl90ZXh0XCI7XG5leHBvcnQgeyBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9ib29sZWFuXCI7XG5leHBvcnQge1xuICBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwsXG4gIEltYWdlSXRlbVZhbHVlLFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25faW1hZ2VwaWNrZXJcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSW1hZ2VNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9pbWFnZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9zaWduYXR1cmVwYWRcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwsXG4gIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3BhbmVsZHluYW1pY1wiO1xuZXhwb3J0IHsgU3VydmV5VGltZXIgfSBmcm9tIFwiLi4vLi4vc3VydmV5dGltZXJcIjtcbmV4cG9ydCB7IFN1cnZleVByb2dyZXNzQnV0dG9uc01vZGVsIH0gZnJvbSBcIi4uLy4uL3N1cnZleVByb2dyZXNzQnV0dG9uc1wiO1xuZXhwb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vLi4vc3VydmV5XCI7XG5leHBvcnQge1xuICBTdXJ2ZXlUcmlnZ2VyLFxuICBTdXJ2ZXlUcmlnZ2VyQ29tcGxldGUsXG4gIFN1cnZleVRyaWdnZXJTZXRWYWx1ZSxcbiAgU3VydmV5VHJpZ2dlclZpc2libGUsXG4gIFN1cnZleVRyaWdnZXJDb3B5VmFsdWUsXG4gIFN1cnZleVRyaWdnZXJSdW5FeHByZXNzaW9uLFxuICBUcmlnZ2VyLFxufSBmcm9tIFwiLi4vLi4vdHJpZ2dlclwiO1xuZXhwb3J0IHsgU3VydmV5V2luZG93TW9kZWwgfSBmcm9tIFwiLi4vLi4vc3VydmV5V2luZG93XCI7XG5leHBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yIH0gZnJvbSBcIi4uLy4uL3RleHRQcmVQcm9jZXNzb3JcIjtcblxuZXhwb3J0IHsgZHhTdXJ2ZXlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2R4U3VydmV5U2VydmljZVwiO1xuZXhwb3J0IHsgZW5nbGlzaFN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vbG9jYWxpemF0aW9uL2VuZ2xpc2hcIjtcbmV4cG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiwgc3VydmV5U3RyaW5ncyB9IGZyb20gXCIuLi8uLi9zdXJ2ZXlTdHJpbmdzXCI7XG4vLyBleHBvcnQgeyBjdWx0dXJlSW5mbyB9IGZyb20gXCIuLi8uLi9jdWx0dXJlSW5mb1wiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25DdXN0b21XaWRnZXQsXG4gIEN1c3RvbVdpZGdldENvbGxlY3Rpb24sXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbkN1c3RvbVdpZGdldHNcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uQ3VzdG9tTW9kZWwsXG4gIFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwsXG4gIENvbXBvbmVudFF1ZXN0aW9uSlNPTixcbiAgQ29tcG9uZW50Q29sbGVjdGlvbixcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2N1c3RvbVwiO1xuXG5leHBvcnQgeyBTdHlsZXNNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL3N0eWxlc21hbmFnZXJcIjtcbmV4cG9ydCB7IExpc3RNb2RlbCB9IGZyb20gXCIuLi8uLi9saXN0XCI7XG5leHBvcnQgeyBQb3B1cE1vZGVsLCBQb3B1cEJhc2VWaWV3TW9kZWwgfSBmcm9tIFwiLi4vLi4vcG9wdXBcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uQnV0dG9uR3JvdXBNb2RlbCxcbiAgQnV0dG9uR3JvdXBJdGVtTW9kZWwsXG4gIEJ1dHRvbkdyb3VwSXRlbVZhbHVlLFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fYnV0dG9uZ3JvdXBcIjtcbmV4cG9ydCB7IElzTW9iaWxlIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2lzLW1vYmlsZVwiO1xuZXhwb3J0IHtcbiAgY29uZmlybUFjdGlvbixcbiAgZGV0ZWN0SUVPckVkZ2UsXG4gIGRvS2V5MkNsaWNrLFxuICBsb2FkRmlsZUZyb21CYXNlNjQsXG4gIGNyZWF0ZVN2Zyxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5cbmV4cG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuLi8uLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG4vL1VuY29tbWVudCB0byBpbmNsdWRlIHRoZSBcImRhdGVcIiBxdWVzdGlvbiB0eXBlLlxuLy9leHBvcnQge2RlZmF1bHQgYXMgUXVlc3Rpb25EYXRlTW9kZWx9IGZyb20gXCIuLi8uLi9wbHVnaW5zL3F1ZXN0aW9uX2RhdGVcIjtcblxuZXhwb3J0IHsgRHJhZ0Ryb3BIZWxwZXIgfSBmcm9tIFwiLi4vLi4vZHJhZ2Ryb3BoZWxwZXJcIjtcbiIsIi8vIG1vZGVsXG5leHBvcnQgKiBmcm9tIFwiLi9jaHVua3MvbW9kZWxcIjtcblxuLy8gbG9jYWxpemF0aW9uXG5pbXBvcnQgXCIuL2NodW5rcy9sb2NhbGl6YXRpb25cIjtcblxuLy8gY3NzIHN0YW5kYXJkIGNsYXNzZXNcbmV4cG9ydCB7IGRlZmF1bHRTdGFuZGFyZENzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG4vLyBjc3MgYm9vdHN0cmFwIGNsYXNzZXNcbmV4cG9ydCB7IGRlZmF1bHRCb290c3RyYXBDc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Nib290c3RyYXBcIjtcbi8vIGNzcyBib290c3RyYXAgKyBtYXRlcmlhbCBjbGFzc2VzXG5leHBvcnQgeyBkZWZhdWx0Qm9vdHN0cmFwTWF0ZXJpYWxDc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Nib290c3RyYXBtYXRlcmlhbFwiO1xuLy8gY3NzIG1vZGVybiBjbGFzc2VzXG5leHBvcnQgeyBtb2Rlcm5Dc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Ntb2Rlcm5cIjtcblxuLy8gdXRpbHNcbmV4cG9ydCAqIGZyb20gXCIuLi9yZW5kZXJlckZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi91dGlscy9yZXNwb25zaXZpdHktbWFuYWdlclwiO1xuZXhwb3J0IHsgdW53cmFwIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9hY3Rpb25zL2FkYXB0aXZlLWNvbnRhaW5lclwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2FjdGlvbnMvY29udGFpbmVyXCI7XG4iLCIvKlxuLy8gbW9kZWxcbmV4cG9ydCAqIGZyb20gXCIuL2NodW5rcy9tb2RlbFwiO1xuXG4vLyBsb2NhbGl6YXRpb25cbmltcG9ydCBcIi4vY2h1bmtzL2xvY2FsaXphdGlvblwiO1xuXG4vLyBoZWxwZXJzXG5leHBvcnQgKiBmcm9tIFwiLi9jaHVua3MvaGVscGVyc1wiO1xuXG4vLyBjc3Mgc3RhbmRhcmRcbmV4cG9ydCB7IGRlZmF1bHRTdGFuZGFyZENzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG4vLyBjc3MgYm9vdHN0cmFwXG5leHBvcnQgeyBkZWZhdWx0Qm9vdHN0cmFwQ3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwXCI7XG4vLyBjc3MgYm9vdHN0cmFwICsgbWF0ZXJpYWxcbmV4cG9ydCB7IGRlZmF1bHRCb290c3RyYXBNYXRlcmlhbENzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcG1hdGVyaWFsXCI7XG5leHBvcnQgeyBtb2Rlcm5Dc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Ntb2Rlcm5cIjtcbiovXG4vLyBrbm9ja291dFxuZXhwb3J0IHsgU3VydmV5IH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvc3VydmV5XCI7XG5leHBvcnQgeyBTdXJ2ZXkgYXMgTW9kZWwgfSBmcm9tIFwiLi4va25vY2tvdXQva29zdXJ2ZXlcIjtcbmV4cG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuLi9rbm9ja291dC9rb2Jhc2VcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUm93LCBQYWdlLCBQYW5lbCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3BhZ2VcIjtcbmV4cG9ydCB7IEZsb3dQYW5lbCB9IGZyb20gXCIuLi9rbm9ja291dC9rb2Zsb3dwYW5lbFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uXCI7XG5leHBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2VJbXBsZW1lbnRvciB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5leHBvcnQgeyBRdWVzdGlvbkNoZWNrYm94IH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fY2hlY2tib3hcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmFua2luZyB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX3JhbmtpbmdcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ29tbWVudCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2NvbW1lbnRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRHJvcGRvd24gfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9kcm9wZG93blwiO1xuZXhwb3J0IHsgUXVlc3Rpb25GaWxlIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fZmlsZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25IdG1sIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25faHRtbFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25NYXRyaXggfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd24gfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEeW5hbWljSW1wbGVtZW50b3IsXG4gIFF1ZXN0aW9uTWF0cml4RHluYW1pYyxcbn0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4ZHluYW1pY1wiO1xuZXhwb3J0IHsgUXVlc3Rpb25QYW5lbER5bmFtaWMgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9wYW5lbGR5bmFtaWNcIjtcbmV4cG9ydCB7XG4gIE11bHRpcGxlVGV4dEl0ZW0sXG4gIFF1ZXN0aW9uTXVsdGlwbGVUZXh0LFxufSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tdWx0aXBsZXRleHRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmFkaW9ncm91cCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX3JhZGlvZ3JvdXBcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uUmF0aW5nLFxuICBRdWVzdGlvblJhdGluZ0ltcGxlbWVudG9yLFxufSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9yYXRpbmdcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uVGV4dCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX3RleHRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQm9vbGVhbiB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2Jvb2xlYW5cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRW1wdHkgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9lbXB0eVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25FeHByZXNzaW9uIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fZXhwcmVzc2lvblwiO1xuZXhwb3J0IHsgUXVlc3Rpb25JbWFnZVBpY2tlciB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2ltYWdlcGlja2VyXCI7XG5leHBvcnQgeyBTdXJ2ZXlXaW5kb3cgfSBmcm9tIFwiLi4va25vY2tvdXQva29TdXJ2ZXlXaW5kb3dcIjtcbmV4cG9ydCB7IFN1cnZleVRlbXBsYXRlVGV4dCB9IGZyb20gXCIuLi9rbm9ja291dC90ZW1wbGF0ZVRleHRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSW1hZ2UgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9pbWFnZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25TaWduYXR1cmVQYWQgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9zaWduYXR1cmVwYWRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ3VzdG9tIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fY3VzdG9tXCI7XG5leHBvcnQgeyBRdWVzdGlvbkJ1dHRvbkdyb3VwIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fYnV0dG9uZ3JvdXBcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4uL2tub2Nrb3V0L2NvbXBvbmVudHMvYWN0aW9uLWJhci9hY3Rpb24tYmFyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9ib29sZWFuLWNoZWNrYm94L2Jvb2xlYW4tY2hlY2tib3hcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9rbm9ja291dC9jb21wb25lbnRzL2RlZmF1bHQtdGl0bGUvZGVmYXVsdC10aXRsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2tub2Nrb3V0L2NvbXBvbmVudHMvcGFuZWwvcGFuZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9rbm9ja291dC9jb21wb25lbnRzL3BvcHVwL3BvcHVwXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9wcm9ncmVzcy9idXR0b25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9wcm9ncmVzcy9wcm9ncmVzc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2tub2Nrb3V0L2NvbXBvbmVudHMvdGVtcGxhdGUtcmVuZGVyZXIvdGVtcGxhdGUtcmVuZGVyZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9rbm9ja291dC9jb21wb25lbnRzL3RpdGxlLWFjdGlvbnMvdGl0bGUtYWN0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2tub2Nrb3V0L2NvbXBvbmVudHMvc3RyaW5nLWVkaXRvci9zdHJpbmctZWRpdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9zdHJpbmctdmlld2VyL3N0cmluZy12aWV3ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9rbm9ja291dC9jb21wb25lbnRzL2xvZ28taW1hZ2UvbG9nby1pbWFnZVwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9kZWZhdWx0LXRpdGxlL2RlZmF1bHQtdGl0bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuLi9rbm9ja291dC9jb21wb25lbnRzL2xpc3QvbGlzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4uL2tub2Nrb3V0L2NvbXBvbmVudHMvc3ZnLWljb24vc3ZnLWljb25cIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uTWF0cml4RHluYW1pY1JlbW92ZUJ1dHRvbiB9IGZyb20gXCIuLi9rbm9ja291dC9jb21wb25lbnRzL21hdHJpeC1hY3Rpb25zL3JlbW92ZS1idXR0b24vcmVtb3ZlLWJ1dHRvblwiO1xuZXhwb3J0IHsgU3VydmV5UXVlc3Rpb25NYXRyaXhEZXRhaWxCdXR0b24gfSBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9tYXRyaXgtYWN0aW9ucy9kZXRhaWwtYnV0dG9uL2RldGFpbC1idXR0b25cIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uTWF0cml4RHluYW1pY0RyYWdEcm9wSWNvbiB9IGZyb20gXCIuLi9rbm9ja291dC9jb21wb25lbnRzL21hdHJpeC1hY3Rpb25zL2RyYWctZHJvcC1pY29uL2RyYWctZHJvcC1pY29uXCI7XG5leHBvcnQgeyBCdXR0b25Hcm91cEl0ZW1WaWV3TW9kZWwgfSBmcm9tIFwiLi4va25vY2tvdXQvY29tcG9uZW50cy9idXR0b24tZ3JvdXAvYnV0dG9uLWdyb3VwLWl0ZW1cIjtcbi8vZXhwb3J0ICogZnJvbSBcIi4uL3V0aWxzL3Jlc29uc2liaWxpdHltYW5hZ2VyXCI7XG4vL2V4cG9ydCB7IHVud3JhcCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuLy9VbmNvbW1lbnQgdG8gaW5jbHVkZSB0aGUgXCJkYXRlXCIgcXVlc3Rpb24gdHlwZS5cbi8vZXhwb3J0IHtRdWVzdGlvbkRhdGV9IGZyb20gXCIuLi9wbHVnaW5zL2tub2Nrb3V0L2tvcXVlc3Rpb25fZGF0ZVwiO1xuXG5pbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyByZWdpc3RlclRlbXBsYXRlRW5naW5lIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvc3VydmV5XCI7XG5yZWdpc3RlclRlbXBsYXRlRW5naW5lKGtvLCBTdXJ2ZXlNb2RlbC5wbGF0Zm9ybSk7XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jb3JlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9rbm9ja291dC11aVwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9zdXJ2ZXktZXJyb3JcIjtcbmltcG9ydCB7IElTdXJ2ZXlFcnJvck93bmVyIH0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBBbnN3ZXJSZXF1aXJlZEVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdGV4dDogc3RyaW5nID0gbnVsbCxcbiAgICBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGxcbiAgKSB7XG4gICAgc3VwZXIodGV4dCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJlcXVpcmVkXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEVycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgT25lQW5zd2VyUmVxdWlyZWRFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZXF1aXJlb25lYW5zd2VyXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEVycm9ySW5QYW5lbFwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFJlcXVyZU51bWVyaWNFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZXF1aXJlbnVtZXJpY1wiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibnVtZXJpY0Vycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgRXhjZWVkU2l6ZUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1heFNpemU6IG51bWJlciwgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIobnVsbCwgZXJyb3JPd25lcik7XG4gICAgdGhpcy5sb2NUZXh0LnRleHQgPSB0aGlzLmdldFRleHQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZXhjZWVkc2l6ZVwiO1xuICB9XG4gIHB1YmxpYyBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJleGNlZWRNYXhTaXplXCIpXG4gICAgICBbXCJmb3JtYXRcIl0odGhpcy5nZXRUZXh0U2l6ZSgpKTtcbiAgfVxuICBwcml2YXRlIGdldFRleHRTaXplKCkge1xuICAgIHZhciBzaXplcyA9IFtcIkJ5dGVzXCIsIFwiS0JcIiwgXCJNQlwiLCBcIkdCXCIsIFwiVEJcIl07XG4gICAgdmFyIGZpeGVkID0gWzAsIDAsIDIsIDMsIDNdO1xuICAgIGlmICh0aGlzLm1heFNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBcIjAgQnl0ZVwiO1xuICAgIH1cbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2codGhpcy5tYXhTaXplKSAvIE1hdGgubG9nKDEwMjQpKTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLm1heFNpemUgLyBNYXRoLnBvdygxMDI0LCBpKTtcbiAgICByZXR1cm4gdmFsdWUudG9GaXhlZChmaXhlZFtpXSkgKyBcIiBcIiArIHNpemVzW2ldO1xuICB9XG59XG5leHBvcnQgY2xhc3MgV2ViUmVxdWVzdEVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3RhdHVzOiBzdHJpbmcsXG4gICAgcHVibGljIHJlc3BvbnNlOiBzdHJpbmcsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKG51bGwsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ3ZWJyZXF1ZXN0XCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcInVybFJlcXVlc3RFcnJvclwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMuc3RhdHVzLCB0aGlzLnJlc3BvbnNlKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFdlYlJlcXVlc3RFbXB0eUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nLCBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGwpIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwid2VicmVxdWVzdGVtcHR5XCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ1cmxHZXRDaG9pY2VzRXJyb3JcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBPdGhlckVtcHR5RXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJvdGhlcmVtcHR5XCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlclJlcXVpcmVkRXJyb3JcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBVcGxvYWRpbmdGaWxlRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ1cGxvYWRpbmdmaWxlXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ1cGxvYWRpbmdGaWxlXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgUmVxdWlyZWRJbkFsbFJvd3NFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZywgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIodGV4dCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJlcXVpcmVkaW5hbGxyb3dzZXJyb3JcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlcXVpcmVkSW5BbGxSb3dzRXJyb3JcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBNaW5Sb3dDb3VudEVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbWluUm93Q291bnQ6IG51bWJlcixcbiAgICBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGxcbiAgKSB7XG4gICAgc3VwZXIobnVsbCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1pbnJvd2NvdW50ZXJyb3JcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAuZ2V0U3RyaW5nKFwibWluUm93Q291bnRFcnJvclwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMubWluUm93Q291bnQpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgS2V5RHVwbGljYXRpb25FcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZywgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIodGV4dCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImtleWR1cGxpY2F0aW9uZXJyb3JcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBDdXN0b21FcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZywgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIodGV4dCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImN1c3RvbVwiO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uSXRlbSBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBJTG9jYWxpemFibGVPd25lciB7XG4gIHB1YmxpYyBsb2NPd25lcjogSUxvY2FsaXphYmxlT3duZXI7XG4gIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJodG1sXCIsIHRoaXMpO1xuICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJleHByZXNzaW9uaXRlbVwiO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBhbnksIHByb3BlcnRpZXM6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5leHByZXNzaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy5leHByZXNzaW9uKS5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGV4cHJlc3Npb24gcHJvcGVydHkuIElmIHRoaXMgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIHRoZW4gc3VydmV5IHdpbGwgdXNlIGh0bWwgcHJvcGVydHkgdG8gc2hvdyBvbiBjb21wbGV0ZSBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NIdG1sKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImh0bWxcIik7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5sb2NPd25lciA/IHRoaXMubG9jT3duZXIuZ2V0TG9jYWxlKCkgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldE1hcmtkb3duSHRtbCh0ZXh0LCBuYW1lKSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldFJlbmRlcmVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5sb2NPd25lciA/IHRoaXMubG9jT3duZXIuZ2V0UmVuZGVyZXIobmFtZSkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldFByb2Nlc3NlZFRleHQodGV4dCkgOiB0ZXh0O1xuICB9XG59XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IGNvbnRhaW5zIGV4cHJlc3Npb24gYW5kIGh0bWwgcHJvcGV0aWVzLiBJdCB1c2VzIGluIHN1cnZleS5jb21wbGV0ZWRIdG1sT25Db25kaXRpb24gYXJyYXkuXG4gKiBJZiB0aGUgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUgdGhlbiBodG1sIG9mIHRoaXMgaXRlbSB1c2VzIGluc3RlYWQgb2Ygc3VydmV5LmNvbXBsZXRlZEh0bWwgcHJvcGVydHlcbiAqIEBzZWUgU3VydmV5TW9kZWwuY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uXG4gKiBAc2VlIFN1cnZleU1vZGVsLmNvbXBsZXRlZEh0bWxcbiAqL1xuZXhwb3J0IGNsYXNzIEh0bWxDb25kaXRpb25JdGVtIGV4dGVuZHMgRXhwcmVzc2lvbkl0ZW0ge1xuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBzdHJpbmcgPSBudWxsLCBodG1sOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoZXhwcmVzc2lvbik7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImh0bWxcIiwgdGhpcyk7XG4gICAgdGhpcy5odG1sID0gaHRtbDtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImh0bWxjb25kaXRpb25pdGVtXCI7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBodG1sIHRoYXQgc2hvd3Mgb24gY29tcGxldGVkICgnVGhhbmsgeW91JykgcGFnZS4gVGhlIGV4cHJlc3Npb24gc2hvdWxkIHJldHVybiB0cnVlXG4gICAqIEBzZWUgZXhwcmVzc2lvblxuICAgKi9cbiAgcHVibGljIGdldCBodG1sKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiaHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGh0bWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiaHRtbFwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0h0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBjb250YWlucyBleHByZXNzaW9uIGFuZCB1cmwgcHJvcGV0aWVzLiBJdCB1c2VzIGluIHN1cnZleS5uYXZpZ2F0ZVRvVXJsT25Db25kaXRpb24gYXJyYXkuXG4gKiBJZiB0aGUgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUgdGhlbiB1cmwgb2YgdGhpcyBpdGVtIHVzZXMgaW5zdGVhZCBvZiBzdXJ2ZXkubmF2aWdhdGVUb1VybCBwcm9wZXJ0eVxuICogQHNlZSBTdXJ2ZXlNb2RlbC5uYXZpZ2F0ZVRvVXJsXG4gKi9cbmV4cG9ydCBjbGFzcyBVcmxDb25kaXRpb25JdGVtIGV4dGVuZHMgRXhwcmVzc2lvbkl0ZW0ge1xuICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBzdHJpbmcgPSBudWxsLCB1cmw6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcihleHByZXNzaW9uKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidXJsXCIsIHRoaXMpO1xuICAgIHRoaXMudXJsID0gdXJsO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidXJsY29uZGl0aW9uaXRlbVwiO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdXJsIHRoYXQgc3VydmV5IG5hdmlnYXRlcyB0byBvbiBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkuIFRoZSBleHByZXNzaW9uIHNob3VsZCByZXR1cm4gdHJ1ZVxuICAgKiBAc2VlIGV4cHJlc3Npb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidXJsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXJsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInVybFwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1VybCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ1cmxcIik7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJleHByZXNzaW9uaXRlbVwiLFxuICBbXCJleHByZXNzaW9uOmNvbmRpdGlvblwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uSXRlbSgpO1xuICB9LFxuICBcImJhc2VcIlxuKTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJodG1sY29uZGl0aW9uaXRlbVwiLFxuICBbeyBuYW1lOiBcImh0bWw6aHRtbFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jSHRtbFwiIH1dLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEh0bWxDb25kaXRpb25JdGVtKCk7XG4gIH0sXG4gIFwiZXhwcmVzc2lvbml0ZW1cIlxuKTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJ1cmxjb25kaXRpb25pdGVtXCIsXG4gIFt7IG5hbWU6IFwidXJsOnN0cmluZ1wiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVXJsXCIgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgVXJsQ29uZGl0aW9uSXRlbSgpO1xuICB9LFxuICBcImV4cHJlc3Npb25pdGVtXCJcbik7XG4iLCJpbXBvcnQge1xuQ29uc3QsXG5CaW5hcnlPcGVyYW5kLFxuVmFyaWFibGUsXG5PcGVyYW5kLFxuVW5hcnlPcGVyYW5kLFxuRnVuY3Rpb25PcGVyYW5kLFxuQXJyYXlPcGVyYW5kXG59IGZyb20gXCIuL2V4cHJlc3Npb25zXCI7XG5cbi8vIEdlbmVyYXRlZCBieSBQRUcuanMgdi4gMC4xMC4wICh0cy1wZWdqcyBwbHVnaW4gdi4gMC4zLjEgKVxuLy9cbi8vIGh0dHBzOi8vcGVnanMub3JnLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhZGV2cHJvL3RzLXBlZ2pzXG5cblwidXNlIHN0cmljdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElGaWxlUG9zaXRpb24ge1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgbGluZTogbnVtYmVyO1xuICBjb2x1bW46IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRmlsZVJhbmdlIHtcbiAgc3RhcnQ6IElGaWxlUG9zaXRpb247XG4gIGVuZDogSUZpbGVQb3NpdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTGl0ZXJhbEV4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJsaXRlcmFsXCI7XG4gIHRleHQ6IHN0cmluZztcbiAgaWdub3JlQ2FzZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2xhc3NQYXJ0cyBleHRlbmRzIEFycmF5PHN0cmluZyB8IElDbGFzc1BhcnRzPiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIElDbGFzc0V4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJjbGFzc1wiO1xuICBwYXJ0czogSUNsYXNzUGFydHM7XG4gIGludmVydGVkOiBib29sZWFuO1xuICBpZ25vcmVDYXNlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBbnlFeHBlY3RhdGlvbiB7XG4gIHR5cGU6IFwiYW55XCI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVuZEV4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJlbmRcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJT3RoZXJFeHBlY3RhdGlvbiB7XG4gIHR5cGU6IFwib3RoZXJcIjtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRXhwZWN0YXRpb24gPSBJTGl0ZXJhbEV4cGVjdGF0aW9uIHwgSUNsYXNzRXhwZWN0YXRpb24gfCBJQW55RXhwZWN0YXRpb24gfCBJRW5kRXhwZWN0YXRpb24gfCBJT3RoZXJFeHBlY3RhdGlvbjtcblxuZXhwb3J0IGNsYXNzIFN5bnRheEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgc3RhdGljIGJ1aWxkTWVzc2FnZShleHBlY3RlZDogRXhwZWN0YXRpb25bXSwgZm91bmQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICBmdW5jdGlvbiBoZXgoY2g6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXRlcmFsRXNjYXBlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gc1xuICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cIi9nLCAgXCJcXFxcXFxcIlwiKVxuICAgICAgICAucmVwbGFjZSgvXFwwL2csIFwiXFxcXDBcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcdC9nLCBcIlxcXFx0XCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csIFwiXFxcXHJcIilcbiAgICAgICAgLnJlcGxhY2UoL1tcXHgwMC1cXHgwRl0vZywgICAgICAgICAgICAoY2gpID0+IFwiXFxcXHgwXCIgKyBoZXgoY2gpIClcbiAgICAgICAgLnJlcGxhY2UoL1tcXHgxMC1cXHgxRlxceDdGLVxceDlGXS9nLCAoY2gpID0+IFwiXFxcXHhcIiAgKyBoZXgoY2gpICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xhc3NFc2NhcGUoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBzXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcXS9nLCBcIlxcXFxdXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXF4vZywgXCJcXFxcXlwiKVxuICAgICAgICAucmVwbGFjZSgvLS9nLCAgXCJcXFxcLVwiKVxuICAgICAgICAucmVwbGFjZSgvXFwwL2csIFwiXFxcXDBcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcdC9nLCBcIlxcXFx0XCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csIFwiXFxcXHJcIilcbiAgICAgICAgLnJlcGxhY2UoL1tcXHgwMC1cXHgwRl0vZywgICAgICAgICAgICAoY2gpID0+IFwiXFxcXHgwXCIgKyBoZXgoY2gpIClcbiAgICAgICAgLnJlcGxhY2UoL1tcXHgxMC1cXHgxRlxceDdGLVxceDlGXS9nLCAoY2gpID0+IFwiXFxcXHhcIiAgKyBoZXgoY2gpICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVzY3JpYmVFeHBlY3RhdGlvbihleHBlY3RhdGlvbjogRXhwZWN0YXRpb24pIHtcbiAgICAgIHN3aXRjaCAoZXhwZWN0YXRpb24udHlwZSkge1xuICAgICAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgICAgIHJldHVybiBcIlxcXCJcIiArIGxpdGVyYWxFc2NhcGUoZXhwZWN0YXRpb24udGV4dCkgKyBcIlxcXCJcIjtcbiAgICAgICAgY2FzZSBcImNsYXNzXCI6XG4gICAgICAgICAgY29uc3QgZXNjYXBlZFBhcnRzID0gZXhwZWN0YXRpb24ucGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXJ0KVxuICAgICAgICAgICAgICA/IGNsYXNzRXNjYXBlKHBhcnRbMF0gYXMgc3RyaW5nKSArIFwiLVwiICsgY2xhc3NFc2NhcGUocGFydFsxXSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgIDogY2xhc3NFc2NhcGUocGFydCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gXCJbXCIgKyAoZXhwZWN0YXRpb24uaW52ZXJ0ZWQgPyBcIl5cIiA6IFwiXCIpICsgZXNjYXBlZFBhcnRzICsgXCJdXCI7XG4gICAgICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgICAgICByZXR1cm4gXCJhbnkgY2hhcmFjdGVyXCI7XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gXCJlbmQgb2YgaW5wdXRcIjtcbiAgICAgICAgY2FzZSBcIm90aGVyXCI6XG4gICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uLmRlc2NyaXB0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlRXhwZWN0ZWQoZXhwZWN0ZWQxOiBFeHBlY3RhdGlvbltdKSB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbnMgPSBleHBlY3RlZDEubWFwKGRlc2NyaWJlRXhwZWN0YXRpb24pO1xuICAgICAgbGV0IGk6IG51bWJlcjtcbiAgICAgIGxldCBqOiBudW1iZXI7XG5cbiAgICAgIGRlc2NyaXB0aW9ucy5zb3J0KCk7XG5cbiAgICAgIGlmIChkZXNjcmlwdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGkgPSAxLCBqID0gMTsgaSA8IGRlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChkZXNjcmlwdGlvbnNbaSAtIDFdICE9PSBkZXNjcmlwdGlvbnNbaV0pIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uc1tqXSA9IGRlc2NyaXB0aW9uc1tpXTtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVzY3JpcHRpb25zLmxlbmd0aCA9IGo7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGVzY3JpcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uc1swXTtcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uc1swXSArIFwiIG9yIFwiICsgZGVzY3JpcHRpb25zWzFdO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9ucy5zbGljZSgwLCAtMSkuam9pbihcIiwgXCIpXG4gICAgICAgICAgICArIFwiLCBvciBcIlxuICAgICAgICAgICAgKyBkZXNjcmlwdGlvbnNbZGVzY3JpcHRpb25zLmxlbmd0aCAtIDFdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlRm91bmQoZm91bmQxOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICByZXR1cm4gZm91bmQxID8gXCJcXFwiXCIgKyBsaXRlcmFsRXNjYXBlKGZvdW5kMSkgKyBcIlxcXCJcIiA6IFwiZW5kIG9mIGlucHV0XCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiRXhwZWN0ZWQgXCIgKyBkZXNjcmliZUV4cGVjdGVkKGV4cGVjdGVkKSArIFwiIGJ1dCBcIiArIGRlc2NyaWJlRm91bmQoZm91bmQpICsgXCIgZm91bmQuXCI7XG4gIH1cblxuICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nO1xuICBwdWJsaWMgZXhwZWN0ZWQ6IEV4cGVjdGF0aW9uW107XG4gIHB1YmxpYyBmb3VuZDogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIGxvY2F0aW9uOiBJRmlsZVJhbmdlO1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgZXhwZWN0ZWQ6IEV4cGVjdGF0aW9uW10sIGZvdW5kOiBzdHJpbmcgfCBudWxsLCBsb2NhdGlvbjogSUZpbGVSYW5nZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7XG4gICAgdGhpcy5mb3VuZCA9IGZvdW5kO1xuICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICB0aGlzLm5hbWUgPSBcIlN5bnRheEVycm9yXCI7XG5cbiAgICBpZiAodHlwZW9mIChFcnJvciBhcyBhbnkpLmNhcHR1cmVTdGFja1RyYWNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIChFcnJvciBhcyBhbnkpLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFN5bnRheEVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2FjaGVkIHtcbiAgbmV4dFBvczogbnVtYmVyO1xuICByZXN1bHQ6IGFueTtcbn1cblxuZnVuY3Rpb24gcGVnJHBhcnNlKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM/OiBJUGFyc2VPcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zICE9PSB1bmRlZmluZWQgPyBvcHRpb25zIDoge307XG5cbiAgY29uc3QgcGVnJEZBSUxFRDogUmVhZG9ubHk8YW55PiA9IHt9O1xuXG4gIGNvbnN0IHBlZyRzdGFydFJ1bGVGdW5jdGlvbnM6IHtbaWQ6IHN0cmluZ106IGFueX0gPSB7IEV4cHJlc3Npb246IHBlZyRwYXJzZUV4cHJlc3Npb24gfTtcbiAgbGV0IHBlZyRzdGFydFJ1bGVGdW5jdGlvbjogKCkgPT4gYW55ID0gcGVnJHBhcnNlRXhwcmVzc2lvbjtcblxuICBjb25zdCBwZWckYzAgPSBmdW5jdGlvbihoZWFkOiBhbnksIHRhaWw6IGFueSk6IGFueSB7XG4gICAgICByZXR1cm4gYnVpbGRCaW5hcnlPcGVyYW5kKGhlYWQsIHRhaWwsIHRydWUpO1xuICAgIH07XG4gIGNvbnN0IHBlZyRjMSA9IFwifHxcIjtcbiAgY29uc3QgcGVnJGMyID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcInx8XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMzID0gXCJvclwiO1xuICBjb25zdCBwZWckYzQgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwib3JcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNSA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm9yXCI7IH07XG4gIGNvbnN0IHBlZyRjNiA9IFwiJiZcIjtcbiAgY29uc3QgcGVnJGM3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIiYmXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM4ID0gXCJhbmRcIjtcbiAgY29uc3QgcGVnJGM5ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImFuZFwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGMxMCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImFuZFwiOyB9O1xuICBjb25zdCBwZWckYzExID0gZnVuY3Rpb24oaGVhZDogYW55LCB0YWlsOiBhbnkpOiBhbnkge1xuICAgICAgcmV0dXJuIGJ1aWxkQmluYXJ5T3BlcmFuZChoZWFkLCB0YWlsKTtcbiAgICB9O1xuICBjb25zdCBwZWckYzEyID0gXCI8PVwiO1xuICBjb25zdCBwZWckYzEzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIjw9XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNCA9IFwibGVzc29yZXF1YWxcIjtcbiAgY29uc3QgcGVnJGMxNSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJsZXNzb3JlcXVhbFwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGMxNiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImxlc3NvcmVxdWFsXCI7IH07XG4gIGNvbnN0IHBlZyRjMTcgPSBcIj49XCI7XG4gIGNvbnN0IHBlZyRjMTggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiPj1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE5ID0gXCJncmVhdGVyb3JlcXVhbFwiO1xuICBjb25zdCBwZWckYzIwID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImdyZWF0ZXJvcmVxdWFsXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzIxID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZ3JlYXRlcm9yZXF1YWxcIjsgfTtcbiAgY29uc3QgcGVnJGMyMiA9IFwiPVwiO1xuICBjb25zdCBwZWckYzIzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIj1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzI0ID0gXCJlcXVhbFwiO1xuICBjb25zdCBwZWckYzI1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImVxdWFsXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzI2ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZXF1YWxcIjsgfTtcbiAgY29uc3QgcGVnJGMyNyA9IFwiIT1cIjtcbiAgY29uc3QgcGVnJGMyOCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIhPVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMjkgPSBcIm5vdGVxdWFsXCI7XG4gIGNvbnN0IHBlZyRjMzAgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibm90ZXF1YWxcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMzEgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJub3RlcXVhbFwiOyB9O1xuICBjb25zdCBwZWckYzMyID0gXCI8XCI7XG4gIGNvbnN0IHBlZyRjMzMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiPFwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMzQgPSBcImxlc3NcIjtcbiAgY29uc3QgcGVnJGMzNSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJsZXNzXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzM2ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwibGVzc1wiOyB9O1xuICBjb25zdCBwZWckYzM3ID0gXCI+XCI7XG4gIGNvbnN0IHBlZyRjMzggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiPlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMzkgPSBcImdyZWF0ZXJcIjtcbiAgY29uc3QgcGVnJGM0MCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJncmVhdGVyXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzQxID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZ3JlYXRlclwiOyB9O1xuICBjb25zdCBwZWckYzQyID0gXCIrXCI7XG4gIGNvbnN0IHBlZyRjNDMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiK1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNDQgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJwbHVzXCI7ICB9O1xuICBjb25zdCBwZWckYzQ1ID0gXCItXCI7XG4gIGNvbnN0IHBlZyRjNDYgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiLVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNDcgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJtaW51c1wiOyB9O1xuICBjb25zdCBwZWckYzQ4ID0gXCIqXCI7XG4gIGNvbnN0IHBlZyRjNDkgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiKlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNTAgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJtdWxcIjsgfTtcbiAgY29uc3QgcGVnJGM1MSA9IFwiL1wiO1xuICBjb25zdCBwZWckYzUyID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIi9cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzUzID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZGl2XCI7IH07XG4gIGNvbnN0IHBlZyRjNTQgPSBcIiVcIjtcbiAgY29uc3QgcGVnJGM1NSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIlXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM1NiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm1vZFwiOyB9O1xuICBjb25zdCBwZWckYzU3ID0gXCJeXCI7XG4gIGNvbnN0IHBlZyRjNTggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiXlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNTkgPSBcInBvd2VyXCI7XG4gIGNvbnN0IHBlZyRjNjAgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwicG93ZXJcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNjEgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJwb3dlclwiOyB9O1xuICBjb25zdCBwZWckYzYyID0gXCIqPVwiO1xuICBjb25zdCBwZWckYzYzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIio9XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM2NCA9IFwiY29udGFpbnNcIjtcbiAgY29uc3QgcGVnJGM2NSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJjb250YWluc1wiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM2NiA9IFwiY29udGFpblwiO1xuICBjb25zdCBwZWckYzY3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImNvbnRhaW5cIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNjggPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJjb250YWluc1wiOyB9O1xuICBjb25zdCBwZWckYzY5ID0gXCJub3Rjb250YWluc1wiO1xuICBjb25zdCBwZWckYzcwID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIm5vdGNvbnRhaW5zXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzcxID0gXCJub3Rjb250YWluXCI7XG4gIGNvbnN0IHBlZyRjNzIgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibm90Y29udGFpblwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM3MyA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm5vdGNvbnRhaW5zXCI7IH07XG4gIGNvbnN0IHBlZyRjNzQgPSBcImFueW9mXCI7XG4gIGNvbnN0IHBlZyRjNzUgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiYW55b2ZcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNzYgPSBmdW5jdGlvbigpOiBhbnkge3JldHVybiBcImFueW9mXCI7IH07XG4gIGNvbnN0IHBlZyRjNzcgPSBcImFsbG9mXCI7XG4gIGNvbnN0IHBlZyRjNzggPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiYWxsb2ZcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNzkgPSBmdW5jdGlvbigpOiBhbnkge3JldHVybiBcImFsbG9mXCI7IH07XG4gIGNvbnN0IHBlZyRjODAgPSBcIihcIjtcbiAgY29uc3QgcGVnJGM4MSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIoXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM4MiA9IFwiKVwiO1xuICBjb25zdCBwZWckYzgzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIilcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzg0ID0gZnVuY3Rpb24oZXhwcjogYW55KTogYW55IHsgcmV0dXJuIGV4cHI7IH07XG4gIGNvbnN0IHBlZyRjODUgPSBmdW5jdGlvbihuYW1lOiBhbnksIHBhcmFtczogYW55KTogYW55IHsgcmV0dXJuIG5ldyBGdW5jdGlvbk9wZXJhbmQobmFtZSwgcGFyYW1zKTsgfTtcbiAgY29uc3QgcGVnJGM4NiA9IFwiIVwiO1xuICBjb25zdCBwZWckYzg3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIiFcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzg4ID0gXCJuZWdhdGVcIjtcbiAgY29uc3QgcGVnJGM4OSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJuZWdhdGVcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjOTAgPSBmdW5jdGlvbihleHByOiBhbnkpOiBhbnkgeyByZXR1cm4gbmV3IFVuYXJ5T3BlcmFuZChleHByLCBcIm5lZ2F0ZVwiKTsgfTtcbiAgY29uc3QgcGVnJGM5MSA9IGZ1bmN0aW9uKGV4cHI6IGFueSwgb3A6IGFueSk6IGFueSB7IHJldHVybiBuZXcgVW5hcnlPcGVyYW5kKGV4cHIsIG9wKTsgfTtcbiAgY29uc3QgcGVnJGM5MiA9IFwiZW1wdHlcIjtcbiAgY29uc3QgcGVnJGM5MyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJlbXB0eVwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM5NCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImVtcHR5XCI7IH07XG4gIGNvbnN0IHBlZyRjOTUgPSBcIm5vdGVtcHR5XCI7XG4gIGNvbnN0IHBlZyRjOTYgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibm90ZW1wdHlcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjOTcgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJub3RlbXB0eVwiOyB9O1xuICBjb25zdCBwZWckYzk4ID0gXCJ1bmRlZmluZWRcIjtcbiAgY29uc3QgcGVnJGM5OSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJ1bmRlZmluZWRcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEwMCA9IFwibnVsbFwiO1xuICBjb25zdCBwZWckYzEwMSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJudWxsXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMDIgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gbnVsbDsgfTtcbiAgY29uc3QgcGVnJGMxMDMgPSBmdW5jdGlvbih2YWx1ZTogYW55KTogYW55IHsgcmV0dXJuIG5ldyBDb25zdCh2YWx1ZSk7IH07XG4gIGNvbnN0IHBlZyRjMTA0ID0gXCJ7XCI7XG4gIGNvbnN0IHBlZyRjMTA1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIntcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEwNiA9IFwifVwiO1xuICBjb25zdCBwZWckYzEwNyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJ9XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMDggPSBmdW5jdGlvbih2YWx1ZTogYW55KTogYW55IHsgcmV0dXJuIG5ldyBWYXJpYWJsZSh2YWx1ZSk7IH07XG4gIGNvbnN0IHBlZyRjMTA5ID0gZnVuY3Rpb24odmFsdWU6IGFueSk6IGFueSB7IHJldHVybiB2YWx1ZTsgfTtcbiAgY29uc3QgcGVnJGMxMTAgPSBcIicnXCI7XG4gIGNvbnN0IHBlZyRjMTExID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIicnXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMTIgPSBmdW5jdGlvbigpOiBhbnkge3JldHVybiBcIlwiOyB9O1xuICBjb25zdCBwZWckYzExMyA9IFwiXFxcIlxcXCJcIjtcbiAgY29uc3QgcGVnJGMxMTQgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiXFxcIlxcXCJcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzExNSA9IFwiJ1wiO1xuICBjb25zdCBwZWckYzExNiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCInXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMTcgPSBmdW5jdGlvbih2YWx1ZTogYW55KTogYW55IHsgcmV0dXJuIFwiJ1wiICsgdmFsdWUgKyBcIidcIjsgfTtcbiAgY29uc3QgcGVnJGMxMTggPSBcIlxcXCJcIjtcbiAgY29uc3QgcGVnJGMxMTkgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiXFxcIlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTIwID0gXCJbXCI7XG4gIGNvbnN0IHBlZyRjMTIxID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIltcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEyMiA9IFwiXVwiO1xuICBjb25zdCBwZWckYzEyMyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJdXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMjQgPSBmdW5jdGlvbihzZXF1ZW5jZTogYW55KTogYW55IHsgcmV0dXJuIHNlcXVlbmNlOyB9O1xuICBjb25zdCBwZWckYzEyNSA9IFwiLFwiO1xuICBjb25zdCBwZWckYzEyNiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIsXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMjcgPSBmdW5jdGlvbihleHByOiBhbnksIHRhaWw6IGFueSk6IGFueSB7XG4gICAgICBpZiAoZXhwciA9PSBudWxsKVxuICAgICAgICByZXR1cm4gbmV3IEFycmF5T3BlcmFuZChbXSk7XG5cbiAgICAgIHZhciBhcnJheSA9IFtleHByXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhaWwpKSB7XG4gICAgICAgIHZhciBmbGF0dGVuID0gZmxhdHRlbkFycmF5KHRhaWwpO1xuICAgICAgICBmb3IgKHZhciBpID0gMzsgaSA8IGZsYXR0ZW4ubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKGZsYXR0ZW5baV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQXJyYXlPcGVyYW5kKGFycmF5KTtcbiAgICB9O1xuICBjb25zdCBwZWckYzEyOCA9IFwidHJ1ZVwiO1xuICBjb25zdCBwZWckYzEyOSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJ0cnVlXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzEzMCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiB0cnVlOyB9O1xuICBjb25zdCBwZWckYzEzMSA9IFwiZmFsc2VcIjtcbiAgY29uc3QgcGVnJGMxMzIgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiZmFsc2VcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMTMzID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIGZhbHNlOyB9O1xuICBjb25zdCBwZWckYzEzNCA9IFwiMHhcIjtcbiAgY29uc3QgcGVnJGMxMzUgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiMHhcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEzNiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBwYXJzZUludCh0ZXh0KCksIDE2KTsgfTtcbiAgY29uc3QgcGVnJGMxMzcgPSAvXltcXC1dLztcbiAgY29uc3QgcGVnJGMxMzggPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCItXCJdLCBmYWxzZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEzOSA9IGZ1bmN0aW9uKHNpZ246IGFueSwgbnVtOiBhbnkpOiBhbnkgeyByZXR1cm4gc2lnbiA9PSBudWxsID8gbnVtIDogLW51bTsgfTtcbiAgY29uc3QgcGVnJGMxNDAgPSBcIi5cIjtcbiAgY29uc3QgcGVnJGMxNDEgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiLlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTQyID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIHBhcnNlRmxvYXQodGV4dCgpKTsgfTtcbiAgY29uc3QgcGVnJGMxNDMgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gcGFyc2VJbnQodGV4dCgpLCAxMCk7IH07XG4gIGNvbnN0IHBlZyRjMTQ0ID0gXCIwXCI7XG4gIGNvbnN0IHBlZyRjMTQ1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIjBcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE0NiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiAwOyB9O1xuICBjb25zdCBwZWckYzE0NyA9IGZ1bmN0aW9uKGNoYXJzOiBhbnkpOiBhbnkgeyByZXR1cm4gY2hhcnMuam9pbihcIlwiKTsgfTtcbiAgY29uc3QgcGVnJGMxNDggPSBcIlxcXFwnXCI7XG4gIGNvbnN0IHBlZyRjMTQ5ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIlxcXFwnXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNTAgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCInXCI7IH07XG4gIGNvbnN0IHBlZyRjMTUxID0gXCJcXFxcXFxcIlwiO1xuICBjb25zdCBwZWckYzE1MiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFxcXFxcIlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTUzID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiXFxcIlwiOyB9O1xuICBjb25zdCBwZWckYzE1NCA9IC9eW15cIiddLztcbiAgY29uc3QgcGVnJGMxNTUgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCJcXFwiXCIsIFwiJ1wiXSwgdHJ1ZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE1NiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiB0ZXh0KCk7IH07XG4gIGNvbnN0IHBlZyRjMTU3ID0gL15bXnt9XS87XG4gIGNvbnN0IHBlZyRjMTU4ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wie1wiLCBcIn1cIl0sIHRydWUsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNTkgPSAvXlswLTldLztcbiAgY29uc3QgcGVnJGMxNjAgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbW1wiMFwiLCBcIjlcIl1dLCBmYWxzZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE2MSA9IC9eWzEtOV0vO1xuICBjb25zdCBwZWckYzE2MiA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtbXCIxXCIsIFwiOVwiXV0sIGZhbHNlLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTYzID0gL15bYS16QS1aXS87XG4gIGNvbnN0IHBlZyRjMTY0ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1tcImFcIiwgXCJ6XCJdLCBbXCJBXCIsIFwiWlwiXV0sIGZhbHNlLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTY1ID0gcGVnJG90aGVyRXhwZWN0YXRpb24oXCJ3aGl0ZXNwYWNlXCIpO1xuICBjb25zdCBwZWckYzE2NiA9IC9eWyBcXHRcXG5cXHJdLztcbiAgY29uc3QgcGVnJGMxNjcgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCIgXCIsIFwiXFx0XCIsIFwiXFxuXCIsIFwiXFxyXCJdLCBmYWxzZSwgZmFsc2UpO1xuXG4gIGxldCBwZWckY3VyclBvcyA9IDA7XG4gIGxldCBwZWckc2F2ZWRQb3MgPSAwO1xuICBjb25zdCBwZWckcG9zRGV0YWlsc0NhY2hlID0gW3sgbGluZTogMSwgY29sdW1uOiAxIH1dO1xuICBsZXQgcGVnJG1heEZhaWxQb3MgPSAwO1xuICBsZXQgcGVnJG1heEZhaWxFeHBlY3RlZDogRXhwZWN0YXRpb25bXSA9IFtdO1xuICBsZXQgcGVnJHNpbGVudEZhaWxzID0gMDtcblxuICBjb25zdCBwZWckcmVzdWx0c0NhY2hlOiB7W2lkOiBudW1iZXJdOiBJQ2FjaGVkfSA9IHt9O1xuXG4gIGxldCBwZWckcmVzdWx0O1xuXG4gIGlmIChvcHRpb25zLnN0YXJ0UnVsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCEob3B0aW9ucy5zdGFydFJ1bGUgaW4gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHN0YXJ0IHBhcnNpbmcgZnJvbSBydWxlIFxcXCJcIiArIG9wdGlvbnMuc3RhcnRSdWxlICsgXCJcXFwiLlwiKTtcbiAgICB9XG5cbiAgICBwZWckc3RhcnRSdWxlRnVuY3Rpb24gPSBwZWckc3RhcnRSdWxlRnVuY3Rpb25zW29wdGlvbnMuc3RhcnRSdWxlXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaW5wdXQuc3Vic3RyaW5nKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9jYXRpb24oKTogSUZpbGVSYW5nZSB7XG4gICAgcmV0dXJuIHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG4gIH1cblxuICBmdW5jdGlvbiBleHBlY3RlZChkZXNjcmlwdGlvbjogc3RyaW5nLCBsb2NhdGlvbjE/OiBJRmlsZVJhbmdlKSB7XG4gICAgbG9jYXRpb24xID0gbG9jYXRpb24xICE9PSB1bmRlZmluZWRcbiAgICAgID8gbG9jYXRpb24xXG4gICAgICA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG5cbiAgICB0aHJvdyBwZWckYnVpbGRTdHJ1Y3R1cmVkRXJyb3IoXG4gICAgICBbcGVnJG90aGVyRXhwZWN0YXRpb24oZGVzY3JpcHRpb24pXSxcbiAgICAgIGlucHV0LnN1YnN0cmluZyhwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKSxcbiAgICAgIGxvY2F0aW9uMVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGxvY2F0aW9uMT86IElGaWxlUmFuZ2UpIHtcbiAgICBsb2NhdGlvbjEgPSBsb2NhdGlvbjEgIT09IHVuZGVmaW5lZFxuICAgICAgPyBsb2NhdGlvbjFcbiAgICAgIDogcGVnJGNvbXB1dGVMb2NhdGlvbihwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKTtcblxuICAgIHRocm93IHBlZyRidWlsZFNpbXBsZUVycm9yKG1lc3NhZ2UsIGxvY2F0aW9uMSk7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKHRleHQxOiBzdHJpbmcsIGlnbm9yZUNhc2U6IGJvb2xlYW4pOiBJTGl0ZXJhbEV4cGVjdGF0aW9uIHtcbiAgICByZXR1cm4geyB0eXBlOiBcImxpdGVyYWxcIiwgdGV4dDogdGV4dDEsIGlnbm9yZUNhc2U6IGlnbm9yZUNhc2UgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRjbGFzc0V4cGVjdGF0aW9uKHBhcnRzOiBJQ2xhc3NQYXJ0cywgaW52ZXJ0ZWQ6IGJvb2xlYW4sIGlnbm9yZUNhc2U6IGJvb2xlYW4pOiBJQ2xhc3NFeHBlY3RhdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJjbGFzc1wiLCBwYXJ0czogcGFydHMsIGludmVydGVkOiBpbnZlcnRlZCwgaWdub3JlQ2FzZTogaWdub3JlQ2FzZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGFueUV4cGVjdGF0aW9uKCk6IElBbnlFeHBlY3RhdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJhbnlcIiB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGVuZEV4cGVjdGF0aW9uKCk6IElFbmRFeHBlY3RhdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJlbmRcIiB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJG90aGVyRXhwZWN0YXRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IElPdGhlckV4cGVjdGF0aW9uIHtcbiAgICByZXR1cm4geyB0eXBlOiBcIm90aGVyXCIsIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHBvczogbnVtYmVyKSB7XG4gICAgbGV0IGRldGFpbHMgPSBwZWckcG9zRGV0YWlsc0NhY2hlW3Bvc107XG4gICAgbGV0IHA7XG5cbiAgICBpZiAoZGV0YWlscykge1xuICAgICAgcmV0dXJuIGRldGFpbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAgPSBwb3MgLSAxO1xuICAgICAgd2hpbGUgKCFwZWckcG9zRGV0YWlsc0NhY2hlW3BdKSB7XG4gICAgICAgIHAtLTtcbiAgICAgIH1cblxuICAgICAgZGV0YWlscyA9IHBlZyRwb3NEZXRhaWxzQ2FjaGVbcF07XG4gICAgICBkZXRhaWxzID0ge1xuICAgICAgICBsaW5lOiBkZXRhaWxzLmxpbmUsXG4gICAgICAgIGNvbHVtbjogZGV0YWlscy5jb2x1bW5cbiAgICAgIH07XG5cbiAgICAgIHdoaWxlIChwIDwgcG9zKSB7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHApID09PSAxMCkge1xuICAgICAgICAgIGRldGFpbHMubGluZSsrO1xuICAgICAgICAgIGRldGFpbHMuY29sdW1uID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXRhaWxzLmNvbHVtbisrO1xuICAgICAgICB9XG5cbiAgICAgICAgcCsrO1xuICAgICAgfVxuXG4gICAgICBwZWckcG9zRGV0YWlsc0NhY2hlW3Bvc10gPSBkZXRhaWxzO1xuXG4gICAgICByZXR1cm4gZGV0YWlscztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwZWckY29tcHV0ZUxvY2F0aW9uKHN0YXJ0UG9zOiBudW1iZXIsIGVuZFBvczogbnVtYmVyKTogSUZpbGVSYW5nZSB7XG4gICAgY29uc3Qgc3RhcnRQb3NEZXRhaWxzID0gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHN0YXJ0UG9zKTtcbiAgICBjb25zdCBlbmRQb3NEZXRhaWxzID0gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKGVuZFBvcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgb2Zmc2V0OiBzdGFydFBvcyxcbiAgICAgICAgbGluZTogc3RhcnRQb3NEZXRhaWxzLmxpbmUsXG4gICAgICAgIGNvbHVtbjogc3RhcnRQb3NEZXRhaWxzLmNvbHVtblxuICAgICAgfSxcbiAgICAgIGVuZDoge1xuICAgICAgICBvZmZzZXQ6IGVuZFBvcyxcbiAgICAgICAgbGluZTogZW5kUG9zRGV0YWlscy5saW5lLFxuICAgICAgICBjb2x1bW46IGVuZFBvc0RldGFpbHMuY29sdW1uXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRmYWlsKGV4cGVjdGVkMTogRXhwZWN0YXRpb24pIHtcbiAgICBpZiAocGVnJGN1cnJQb3MgPCBwZWckbWF4RmFpbFBvcykgeyByZXR1cm47IH1cblxuICAgIGlmIChwZWckY3VyclBvcyA+IHBlZyRtYXhGYWlsUG9zKSB7XG4gICAgICBwZWckbWF4RmFpbFBvcyA9IHBlZyRjdXJyUG9zO1xuICAgICAgcGVnJG1heEZhaWxFeHBlY3RlZCA9IFtdO1xuICAgIH1cblxuICAgIHBlZyRtYXhGYWlsRXhwZWN0ZWQucHVzaChleHBlY3RlZDEpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGJ1aWxkU2ltcGxlRXJyb3IobWVzc2FnZTogc3RyaW5nLCBsb2NhdGlvbjE6IElGaWxlUmFuZ2UpIHtcbiAgICByZXR1cm4gbmV3IFN5bnRheEVycm9yKG1lc3NhZ2UsIFtdLCBcIlwiLCBsb2NhdGlvbjEpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGJ1aWxkU3RydWN0dXJlZEVycm9yKGV4cGVjdGVkMTogRXhwZWN0YXRpb25bXSwgZm91bmQ6IHN0cmluZyB8IG51bGwsIGxvY2F0aW9uMTogSUZpbGVSYW5nZSkge1xuICAgIHJldHVybiBuZXcgU3ludGF4RXJyb3IoXG4gICAgICBTeW50YXhFcnJvci5idWlsZE1lc3NhZ2UoZXhwZWN0ZWQxLCBmb3VuZCksXG4gICAgICBleHBlY3RlZDEsXG4gICAgICBmb3VuZCxcbiAgICAgIGxvY2F0aW9uMVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VFeHByZXNzaW9uKCk6IE9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDA7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZV8oKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlTG9naWNPcigpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gW107XG4gICAgICAgIHM0ID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM1ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNiA9IHBlZyRwYXJzZU9yU2lnbigpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczggPSBwZWckcGFyc2VMb2dpY09yKCk7XG4gICAgICAgICAgICAgIGlmIChzOCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM1ID0gW3M1LCBzNiwgczcsIHM4XTtcbiAgICAgICAgICAgICAgICBzNCA9IHM1O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzLnB1c2goczQpO1xuICAgICAgICAgIHM0ID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZU9yU2lnbigpO1xuICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzOCA9IHBlZyRwYXJzZUxvZ2ljT3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoczggIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIHM1ID0gW3M1LCBzNiwgczcsIHM4XTtcbiAgICAgICAgICAgICAgICAgIHM0ID0gczU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjMChzMiwgczMpO1xuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VPclNpZ24oKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMxKSB7XG4gICAgICBzMSA9IHBlZyRjMTtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyKTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMykge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMik7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0KTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzUoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUxvZ2ljT3IoKTogQmluYXJ5T3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VMb2dpY0FuZCgpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZUFuZFNpZ24oKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUxvZ2ljQW5kKCk7XG4gICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VBbmRTaWduKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUxvZ2ljQW5kKCk7XG4gICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMwKHMxLCBzMik7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQW5kU2lnbigpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMztcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzYpIHtcbiAgICAgIHMxID0gcGVnJGM2O1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzcpOyB9XG4gICAgfVxuICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMykudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM4KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAzKTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gMztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzkpOyB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTAoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUxvZ2ljQW5kKCk6IEJpbmFyeU9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgNDtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlQ29tcE9wcygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZUNvbXBhcmFibGVPcGVyYXRvcnMoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUNvbXBPcHMoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZUNvbXBhcmFibGVPcGVyYXRvcnMoKTtcbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlQ29tcE9wcygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTEoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VDb21wYXJhYmxlT3BlcmF0b3JzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA1O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTIpIHtcbiAgICAgIHMxID0gcGVnJGMxMjtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMyk7IH1cbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAxMSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGMxNCkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTEpO1xuICAgICAgICBwZWckY3VyclBvcyArPSAxMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1KTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzE2KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTcpIHtcbiAgICAgICAgczEgPSBwZWckYzE3O1xuICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTgpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTQpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMTkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTQpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDE0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjApOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzIxKCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNjEpIHtcbiAgICAgICAgICBzMSA9IHBlZyRjMjI7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzIzKTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMjQpIHtcbiAgICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyNSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzI2KCk7XG4gICAgICAgIH1cbiAgICAgICAgczAgPSBzMTtcbiAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMyNykge1xuICAgICAgICAgICAgczEgPSBwZWckYzI3O1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzI4KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMjkpIHtcbiAgICAgICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpO1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSA4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMzApOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjMzEoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDYwKSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGMzMjtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzMzKTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDQpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMzQpIHtcbiAgICAgICAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCk7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzM1KTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGMzNigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDYyKSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzM3O1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzOCk7IH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA3KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzM5KSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNyk7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSA3O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDApOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGM0MSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQ29tcE9wcygpOiBCaW5hcnlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDY7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZVBsdXNNaW51c09wcygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VQbHVzTWludXNPcHMoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZVBsdXNNaW51c09wcygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMChzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA3O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Mykge1xuICAgICAgczEgPSBwZWckYzQyO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQzKTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzQ0KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NSkge1xuICAgICAgICBzMSA9IHBlZyRjNDU7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0Nik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzQ3KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVBsdXNNaW51c09wcygpOiBCaW5hcnlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDg7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZU11bERpdk9wcygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZU11bERpdlNpZ25zKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VNdWxEaXZPcHMoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZU11bERpdlNpZ25zKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZU11bERpdk9wcygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMChzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZU11bERpdlNpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA5O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Mikge1xuICAgICAgczEgPSBwZWckYzQ4O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQ5KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzUwKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Nykge1xuICAgICAgICBzMSA9IHBlZyRjNTE7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1Mik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzUzKCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzcpIHtcbiAgICAgICAgICBzMSA9IHBlZyRjNTQ7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzU1KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM1NigpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlTXVsRGl2T3BzKCk6IEJpbmFyeU9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTA7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUJpbmFyeUZ1bmNPcCgpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZVBvd2VyU2lnbnMoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUJpbmFyeUZ1bmNPcCgpO1xuICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlUG93ZXJTaWducygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VCaW5hcnlGdW5jT3AoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzAoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VQb3dlclNpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxMTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gOTQpIHtcbiAgICAgIHMxID0gcGVnJGM1NztcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1OCk7IH1cbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzU5KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzYwKTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzYxKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VCaW5hcnlGdW5jT3AoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDEyO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VGYWN0b3IoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VCaW5GdW5jdGlvbnMoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUZhY3RvcigpO1xuICAgICAgICAgICAgaWYgKHM3ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZUJpbkZ1bmN0aW9ucygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VGYWN0b3IoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczcgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxMShzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUJpbkZ1bmN0aW9ucygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTM7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM2Mikge1xuICAgICAgczEgPSBwZWckYzYyO1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzYzKTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNjQpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpO1xuICAgICAgICBwZWckY3VyclBvcyArPSA4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNjUpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNykudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM2Nikge1xuICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA3KTtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSA3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNjcpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM2OCgpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDExKS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzY5KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAxMSk7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDExO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNzApOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTApLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNzEpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTApO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDEwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNzIpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzczKCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNzQpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzc1KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM3NigpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM3Nykge1xuICAgICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpO1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzc4KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzc5KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VGYWN0b3IoKTogT3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczU7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTQ7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQwKSB7XG4gICAgICBzMSA9IHBlZyRjODA7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjODEpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0MSkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRjODI7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4Myk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzNSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGM4NChzMyk7XG4gICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckcGFyc2VGdW5jdGlvbk9wKCk7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckcGFyc2VVbmFyeUZ1bmN0aW9uT3AoKTtcbiAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBwZWckcGFyc2VBdG9tKCk7XG4gICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMCA9IHBlZyRwYXJzZUFycmF5T3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VGdW5jdGlvbk9wKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNDtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxNTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlTGV0dGVyc0FuZERpZ2l0cygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0MCkge1xuICAgICAgICBzMiA9IHBlZyRjODA7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4MSk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZVNlcXVlbmNlKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDEpIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJGM4MjtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4Myk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM0ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjODUoczEsIHMzKTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlVW5hcnlGdW5jdGlvbk9wKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE2O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzMykge1xuICAgICAgczEgPSBwZWckYzg2O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzg3KTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjODgpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpO1xuICAgICAgICBwZWckY3VyclBvcyArPSA2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjODkpOyB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM5MChzMyk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IHBlZyRwYXJzZUF0b20oKTtcbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSBwZWckcGFyc2VVbkZ1bmN0aW9ucygpO1xuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjOTEoczEsIHMzKTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlVW5GdW5jdGlvbnMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE3O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM5Mikge1xuICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpO1xuICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzkzKTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzk0KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgOCkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM5NSkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgOCk7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM5Nik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzk3KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUF0b20oKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE4O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VfKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA5KSA9PT0gcGVnJGM5OCkge1xuICAgICAgICBzMiA9IHBlZyRjOTg7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM5OSk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KSA9PT0gcGVnJGMxMDApIHtcbiAgICAgICAgICBzMiA9IHBlZyRjMTAwO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMDEpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEwMigpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZUNvbnN0VmFsdWUoKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzEwMyhzMik7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHMxID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEyMykge1xuICAgICAgICAgICAgczIgPSBwZWckYzEwNDtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMDUpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczMgPSBwZWckcGFyc2VWYWx1ZUlucHV0KCk7XG4gICAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICBzNCA9IHBlZyRjMTA2O1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMDcpOyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzEwOChzMyk7XG4gICAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUNvbnN0VmFsdWUoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczM7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTk7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUxvZ2ljVmFsdWUoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzEwOShzMSk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckcGFyc2VBcml0aG1ldGljVmFsdWUoKTtcbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEwOShzMSk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHMxID0gcGVnJHBhcnNlTGV0dGVyc0FuZERpZ2l0cygpO1xuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTA5KHMxKTtcbiAgICAgICAgfVxuICAgICAgICBzMCA9IHMxO1xuICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzExMCkge1xuICAgICAgICAgICAgczEgPSBwZWckYzExMDtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMTEpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjMTEyKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTEzKSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGMxMTM7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMTQpOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGMxMTIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzOSkge1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGMxMTU7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzExNik7IH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzMiA9IHBlZyRwYXJzZUFueUlucHV0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDM5KSB7XG4gICAgICAgICAgICAgICAgICAgIHMzID0gcGVnJGMxMTU7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMTYpOyB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgIHMxID0gcGVnJGMxMTcoczIpO1xuICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzQpIHtcbiAgICAgICAgICAgICAgICAgIHMxID0gcGVnJGMxMTg7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTE5KTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIHMyID0gcGVnJHBhcnNlQW55SW5wdXQoKTtcbiAgICAgICAgICAgICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDM0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgczMgPSBwZWckYzExODtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTE5KTsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgIHMxID0gcGVnJGMxMTcoczIpO1xuICAgICAgICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VBcnJheU9wKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDIwO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA5MSkge1xuICAgICAgczEgPSBwZWckYzEyMDtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMjEpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VTZXF1ZW5jZSgpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gOTMpIHtcbiAgICAgICAgICBzMyA9IHBlZyRjMTIyO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMjMpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzEyNChzMik7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVNlcXVlbmNlKCk6IEFycmF5T3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyMTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlRXhwcmVzc2lvbigpO1xuICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczEgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NCkge1xuICAgICAgICAgIHM1ID0gcGVnJGMxMjU7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEyNik7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICAgIHM1ID0gcGVnJGMxMjU7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTI2KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTI3KHMxLCBzMik7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlTG9naWNWYWx1ZSgpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjI7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzEyOCkge1xuICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDQpO1xuICAgICAgcGVnJGN1cnJQb3MgKz0gNDtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEyOSk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMxMzAoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzEzMSkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSk7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMzIpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxMzMoKTtcbiAgICAgIH1cbiAgICAgIHMwID0gczE7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQXJpdGhtZXRpY1ZhbHVlKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczI7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjM7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMxMzQpIHtcbiAgICAgIHMxID0gcGVnJGMxMzQ7XG4gICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTM1KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxMzYoKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKHBlZyRjMTM3LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTM4KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZU51bWJlcigpO1xuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTM5KHMxLCBzMik7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZU51bWJlcigpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyNDtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ2KSB7XG4gICAgICAgIHMyID0gcGVnJGMxNDA7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNDEpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VEaWdpdHMoKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzE0MigpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckcGFyc2VOb25aZXJvRGlnaXRzKCk7XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VEaWdpdHMoKTtcbiAgICAgICAgaWYgKHMyID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxNDMoKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0OCkge1xuICAgICAgICAgIHMxID0gcGVnJGMxNDQ7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE0NSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTQ2KCk7XG4gICAgICAgIH1cbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VWYWx1ZUlucHV0KCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczI7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjU7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IFtdO1xuICAgIHMyID0gcGVnJHBhcnNlVmFsdWVDaGFyYWN0ZXJzKCk7XG4gICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEucHVzaChzMik7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlVmFsdWVDaGFyYWN0ZXJzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMxNDcoczEpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQW55SW5wdXQoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMjtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyNjtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gW107XG4gICAgczIgPSBwZWckcGFyc2VBbnlDaGFyYWN0ZXJzKCk7XG4gICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEucHVzaChzMik7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlQW55Q2hhcmFjdGVycygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTQ3KHMxKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUFueUNoYXJhY3RlcnMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI3O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTQ4KSB7XG4gICAgICBzMSA9IHBlZyRjMTQ4O1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE0OSk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMxNTAoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMxNTEpIHtcbiAgICAgICAgczEgPSBwZWckYzE1MTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1Mik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzE1MygpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBpZiAocGVnJGMxNTQudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTU1KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxNTYoKTtcbiAgICAgICAgfVxuICAgICAgICBzMCA9IHMxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVZhbHVlQ2hhcmFjdGVycygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjg7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAocGVnJGMxNTcudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1OCk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMxNTYoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUxldHRlcnNBbmREaWdpdHMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczY7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjk7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUxldHRlcnMoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2VEaWdpdHMoKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IFtdO1xuICAgICAgICBzNiA9IHBlZyRwYXJzZUxldHRlcnMoKTtcbiAgICAgICAgd2hpbGUgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUucHVzaChzNik7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VMZXR0ZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBbczQsIHM1XTtcbiAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1ID0gW107XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VMZXR0ZXJzKCk7XG4gICAgICAgICAgd2hpbGUgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNS5wdXNoKHM2KTtcbiAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlTGV0dGVycygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM0ID0gW3M0LCBzNV07XG4gICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTU2KCk7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlRGlnaXRzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAzMDtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IFtdO1xuICAgIGlmIChwZWckYzE1OS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTYwKTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHdoaWxlIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMC5wdXNoKHMxKTtcbiAgICAgICAgaWYgKHBlZyRjMTU5LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2MCk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlTm9uWmVyb0RpZ2l0cygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMzE7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBbXTtcbiAgICBpZiAocGVnJGMxNjEudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2Mik7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICB3aGlsZSAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAucHVzaChzMSk7XG4gICAgICAgIGlmIChwZWckYzE2MS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNjIpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUxldHRlcnMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDMyO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gW107XG4gICAgaWYgKHBlZyRjMTYzLnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNjQpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwLnB1c2goczEpO1xuICAgICAgICBpZiAocGVnJGMxNjMudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTY0KTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VfKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAzMztcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICBzMCA9IFtdO1xuICAgIGlmIChwZWckYzE2Ni50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTY3KTsgfVxuICAgIH1cbiAgICB3aGlsZSAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwLnB1c2goczEpO1xuICAgICAgaWYgKHBlZyRjMTY2LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTY3KTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBwZWckc2lsZW50RmFpbHMtLTtcbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNjUpOyB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cblxuICAgIGZ1bmN0aW9uIGJ1aWxkQmluYXJ5T3BlcmFuZChoZWFkOiBPcGVyYW5kLCB0YWlsOiBBcnJheTxhbnk+LCBpc0FyaXRobWV0aWNPcDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGFpbC5yZWR1Y2UoXG4gICAgICAgIGZ1bmN0aW9uKHJlc3VsdCwgZWxlbWVudHMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhbmQoZWxlbWVudHNbMV0sIHJlc3VsdCwgZWxlbWVudHNbM10sIGlzQXJpdGhtZXRpY09wKTtcbiAgICAgICAgfSwgXG4gICAgICAgIGhlYWQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZsYXR0ZW5BcnJheShhcnJheTogQXJyYXk8YW55Pik6IEFycmF5PGFueT4ge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgYXJyYXkpO1xuICAgIH1cblxuXG4gIHBlZyRyZXN1bHQgPSBwZWckc3RhcnRSdWxlRnVuY3Rpb24oKTtcblxuICBpZiAocGVnJHJlc3VsdCAhPT0gcGVnJEZBSUxFRCAmJiBwZWckY3VyclBvcyA9PT0gaW5wdXQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHBlZyRyZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHBlZyRyZXN1bHQgIT09IHBlZyRGQUlMRUQgJiYgcGVnJGN1cnJQb3MgPCBpbnB1dC5sZW5ndGgpIHtcbiAgICAgIHBlZyRmYWlsKHBlZyRlbmRFeHBlY3RhdGlvbigpKTtcbiAgICB9XG5cbiAgICB0aHJvdyBwZWckYnVpbGRTdHJ1Y3R1cmVkRXJyb3IoXG4gICAgICBwZWckbWF4RmFpbEV4cGVjdGVkLFxuICAgICAgcGVnJG1heEZhaWxQb3MgPCBpbnB1dC5sZW5ndGggPyBpbnB1dC5jaGFyQXQocGVnJG1heEZhaWxQb3MpIDogbnVsbCxcbiAgICAgIHBlZyRtYXhGYWlsUG9zIDwgaW5wdXQubGVuZ3RoXG4gICAgICAgID8gcGVnJGNvbXB1dGVMb2NhdGlvbihwZWckbWF4RmFpbFBvcywgcGVnJG1heEZhaWxQb3MgKyAxKVxuICAgICAgICA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJG1heEZhaWxQb3MsIHBlZyRtYXhGYWlsUG9zKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUGFyc2VPcHRpb25zIHtcbiAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIHN0YXJ0UnVsZT86IHN0cmluZztcbiAgdHJhY2VyPzogYW55O1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5leHBvcnQgdHlwZSBQYXJzZUZ1bmN0aW9uID0gKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM/OiBJUGFyc2VPcHRpb25zKSA9PiBhbnk7XG5leHBvcnQgY29uc3QgcGFyc2U6IFBhcnNlRnVuY3Rpb24gPSBwZWckcGFyc2U7XG5cbiIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBGdW5jdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vZnVuY3Rpb25zZmFjdG9yeVwiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4uL2NvbmRpdGlvblByb2Nlc3NWYWx1ZVwiO1xuaW1wb3J0IHsgZXF1YWwgfSBmcm9tIFwiYXNzZXJ0XCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPcGVyYW5kIHtcbiAgcHVibGljIHRvU3RyaW5nKGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nID0gdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwdWJsaWMgYWJzdHJhY3QgZ2V0VHlwZSgpOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBhbnk7XG4gIHB1YmxpYyBhYnN0cmFjdCBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBBcnJheTxzdHJpbmc+KTogYW55O1xuICBwdWJsaWMgaGFzRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBoYXNBc3luY0Z1bmN0aW9uKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgYWRkVG9Bc3luY0xpc3QobGlzdDogQXJyYXk8RnVuY3Rpb25PcGVyYW5kPik6IHZvaWQge31cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmFyeU9wZXJhbmQgZXh0ZW5kcyBPcGVyYW5kIHtcbiAgcHJpdmF0ZSBjb25zdW1lcjogRnVuY3Rpb247XG4gIHByaXZhdGUgaXNBcml0aG1ldGljVmFsdWU6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgb3BlcmF0b3JOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBsZWZ0OiBhbnkgPSBudWxsLFxuICAgIHByaXZhdGUgcmlnaHQ6IGFueSA9IG51bGwsXG4gICAgaXNBcml0aG1ldGljT3A6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaXNBcml0aG1ldGljVmFsdWUgPSBpc0FyaXRobWV0aWNPcDtcbiAgICBpZiAoaXNBcml0aG1ldGljT3ApIHtcbiAgICAgIHRoaXMuY29uc3VtZXIgPSBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zW1wiYXJpdGhtZXRpY09wXCJdKFxuICAgICAgICBvcGVyYXRvck5hbWVcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uc3VtZXIgPSBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zW29wZXJhdG9yTmFtZV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uc3VtZXIgPT0gbnVsbCkge1xuICAgICAgT3BlcmFuZE1ha2VyLnRocm93SW52YWxpZE9wZXJhdG9yRXJyb3Iob3BlcmF0b3JOYW1lKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJiaW5hcnlcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQXJpdGhtZXRpYygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0FyaXRobWV0aWNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ29uanVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3BlcmF0b3JOYW1lID09IFwib3JcIiB8fCB0aGlzLm9wZXJhdG9yTmFtZSA9PSBcImFuZFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgY29uanVuY3Rpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbmp1bmN0aW9uID8gdGhpcy5vcGVyYXRvck5hbWUgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXQgb3BlcmF0b3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvck5hbWU7XG4gIH1cbiAgcHVibGljIGdldCBsZWZ0T3BlcmFuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5sZWZ0O1xuICB9XG4gIHB1YmxpYyBnZXQgcmlnaHRPcGVyYW5kKCkge1xuICAgIHJldHVybiB0aGlzLnJpZ2h0O1xuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZVBhcmFtKHg6IGFueSwgcHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogYW55IHtcbiAgICByZXR1cm4geCA9PSBudWxsID8gbnVsbCA6IHguZXZhbHVhdGUocHJvY2Vzc1ZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvbnN1bWVyLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5ldmFsdWF0ZVBhcmFtKHRoaXMubGVmdCwgcHJvY2Vzc1ZhbHVlKSxcbiAgICAgIHRoaXMuZXZhbHVhdGVQYXJhbSh0aGlzLnJpZ2h0LCBwcm9jZXNzVmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZyhmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBcIihcIiArXG4gICAgICBPcGVyYW5kTWFrZXIuc2FmZVRvU3RyaW5nKHRoaXMubGVmdCwgZnVuYykgK1xuICAgICAgXCIgXCIgK1xuICAgICAgT3BlcmFuZE1ha2VyLm9wZXJhdG9yVG9TdHJpbmcodGhpcy5vcGVyYXRvck5hbWUpICtcbiAgICAgIFwiIFwiICtcbiAgICAgIE9wZXJhbmRNYWtlci5zYWZlVG9TdHJpbmcodGhpcy5yaWdodCwgZnVuYykgK1xuICAgICAgXCIpXCJcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBpZiAodGhpcy5sZWZ0ICE9IG51bGwpIHRoaXMubGVmdC5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcbiAgICBpZiAodGhpcy5yaWdodCAhPSBudWxsKSB0aGlzLnJpZ2h0LnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuICB9XG5cbiAgcHVibGljIGhhc0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAoISF0aGlzLmxlZnQgJiYgdGhpcy5sZWZ0Lmhhc0Z1bmN0aW9uKCkpIHx8XG4gICAgICAoISF0aGlzLnJpZ2h0ICYmIHRoaXMucmlnaHQuaGFzRnVuY3Rpb24oKSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBoYXNBc3luY0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAoISF0aGlzLmxlZnQgJiYgdGhpcy5sZWZ0Lmhhc0FzeW5jRnVuY3Rpb24oKSkgfHxcbiAgICAgICghIXRoaXMucmlnaHQgJiYgdGhpcy5yaWdodC5oYXNBc3luY0Z1bmN0aW9uKCkpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgYWRkVG9Bc3luY0xpc3QobGlzdDogQXJyYXk8RnVuY3Rpb25PcGVyYW5kPikge1xuICAgIGlmICghIXRoaXMubGVmdCkgdGhpcy5sZWZ0LmFkZFRvQXN5bmNMaXN0KGxpc3QpO1xuICAgIGlmICghIXRoaXMucmlnaHQpIHRoaXMucmlnaHQuYWRkVG9Bc3luY0xpc3QobGlzdCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuYXJ5T3BlcmFuZCBleHRlbmRzIE9wZXJhbmQge1xuICBwcml2YXRlIGNvbnN1bWVyOiBGdW5jdGlvbjtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uVmFsdWU6IE9wZXJhbmQsIHByaXZhdGUgb3BlcmF0b3JOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY29uc3VtZXIgPSBPcGVyYW5kTWFrZXIudW5hcnlGdW5jdGlvbnNbb3BlcmF0b3JOYW1lXTtcbiAgICBpZiAodGhpcy5jb25zdW1lciA9PSBudWxsKSB7XG4gICAgICBPcGVyYW5kTWFrZXIudGhyb3dJbnZhbGlkT3BlcmF0b3JFcnJvcihvcGVyYXRvck5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3BlcmF0b3JOYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBPcGVyYW5kIHtcbiAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ1bmFyeVwiO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZyhmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBPcGVyYW5kTWFrZXIub3BlcmF0b3JUb1N0cmluZyh0aGlzLm9wZXJhdG9yTmFtZSkgK1xuICAgICAgXCIgXCIgK1xuICAgICAgdGhpcy5leHByZXNzaW9uLnRvU3RyaW5nKGZ1bmMpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBib29sZWFuIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUocHJvY2Vzc1ZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5jb25zdW1lci5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5leHByZXNzaW9uLnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcnJheU9wZXJhbmQgZXh0ZW5kcyBPcGVyYW5kIHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlczogQXJyYXk8T3BlcmFuZD4pIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoZnVuYzogKG9wOiBPcGVyYW5kKSA9PiBzdHJpbmcgPSB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghIWZ1bmMpIHtcbiAgICAgIHZhciByZXMgPSBmdW5jKHRoaXMpO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgXCJbXCIgK1xuICAgICAgdGhpcy52YWx1ZXNcbiAgICAgICAgLm1hcChmdW5jdGlvbihlbDogT3BlcmFuZCkge1xuICAgICAgICAgIHJldHVybiBlbC50b1N0cmluZyhmdW5jKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKSArXG4gICAgICBcIl1cIlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZXZhbHVhdGUocHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzLm1hcChmdW5jdGlvbihlbDogT3BlcmFuZCkge1xuICAgICAgcmV0dXJuIGVsLmV2YWx1YXRlKHByb2Nlc3NWYWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMudmFsdWVzLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBlbC5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuc29tZSgob3BlcmFuZCkgPT4gb3BlcmFuZC5oYXNGdW5jdGlvbigpKTtcbiAgfVxuICBwdWJsaWMgaGFzQXN5bmNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuc29tZSgob3BlcmFuZCkgPT4gb3BlcmFuZC5oYXNBc3luY0Z1bmN0aW9uKCkpO1xuICB9XG4gIHB1YmxpYyBhZGRUb0FzeW5jTGlzdChsaXN0OiBBcnJheTxGdW5jdGlvbk9wZXJhbmQ+KSB7XG4gICAgdGhpcy52YWx1ZXMuZm9yRWFjaCgob3BlcmFuZCkgPT4gb3BlcmFuZC5hZGRUb0FzeW5jTGlzdChsaXN0KSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnN0IGV4dGVuZHMgT3BlcmFuZCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmFsdWU6IGFueSkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb25zdFwiO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZyhmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZhbHVlLnRvU3RyaW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCBjb3JyZWN0VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0VmFsdWUodGhpcy52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZXZhbHVhdGUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0VmFsdWUodGhpcy52YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPikge31cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHRoaXMuaXNCb29sZWFuVmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG4gICAgaWYgKFxuICAgICAgdmFsdWUubGVuZ3RoID4gMSAmJlxuICAgICAgdGhpcy5pc1F1b3RlKHZhbHVlWzBdKSAmJlxuICAgICAgdGhpcy5pc1F1b3RlKHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdKVxuICAgIClcbiAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMik7XG4gICAgaWYgKE9wZXJhbmRNYWtlci5pc051bWVyaWModmFsdWUpKSB7XG4gICAgICBpZiAodmFsdWUuaW5kZXhPZihcIjB4XCIpID09IDApIHJldHVybiBwYXJzZUludCh2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUubGVuZ3RoID4gMSAmJiB2YWx1ZVswXSA9PSBcIjBcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc1F1b3RlKGNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2ggPT0gXCInXCIgfHwgY2ggPT0gJ1wiJztcbiAgfVxuICBwcml2YXRlIGlzQm9vbGVhblZhbHVlKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgJiZcbiAgICAgICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIiB8fCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcImZhbHNlXCIpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmFyaWFibGUgZXh0ZW5kcyBDb25zdCB7XG4gIHN0YXRpYyBEaXNhYmxlQ29udmVyc2lvbkNoYXIgPSBcIiNcIjtcbiAgcHJpdmF0ZSB2YWx1ZUluZm86IGFueSA9IHt9O1xuICBwcml2YXRlIHVzZVZhbHVlQXNJdElzOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmFyaWFibGVOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcih2YXJpYWJsZU5hbWUpO1xuICAgIGlmIChcbiAgICAgICEhdGhpcy52YXJpYWJsZU5hbWUgJiZcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lLmxlbmd0aCA+IDEgJiZcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lWzBdID09PSBWYXJpYWJsZS5EaXNhYmxlQ29udmVyc2lvbkNoYXJcbiAgICApIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lID0gdGhpcy52YXJpYWJsZU5hbWUuc3Vic3RyKDEpO1xuICAgICAgdGhpcy51c2VWYWx1ZUFzSXRJcyA9IHRydWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidmFyaWFibGVcIjtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoZnVuYzogKG9wOiBPcGVyYW5kKSA9PiBzdHJpbmcgPSB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghIWZ1bmMpIHtcbiAgICAgIHZhciByZXMgPSBmdW5jKHRoaXMpO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICB2YXIgcHJlZml4ID0gdGhpcy51c2VWYWx1ZUFzSXRJcyA/IFZhcmlhYmxlLkRpc2FibGVDb252ZXJzaW9uQ2hhciA6IFwiXCI7XG4gICAgcmV0dXJuIFwie1wiICsgcHJlZml4ICsgdGhpcy52YXJpYWJsZU5hbWUgKyBcIn1cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhcmlhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnZhcmlhYmxlTmFtZTtcbiAgfVxuICBwdWJsaWMgZXZhbHVhdGUocHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogYW55IHtcbiAgICB0aGlzLnZhbHVlSW5mby5uYW1lID0gdGhpcy52YXJpYWJsZU5hbWU7XG4gICAgcHJvY2Vzc1ZhbHVlLmdldFZhbHVlSW5mbyh0aGlzLnZhbHVlSW5mbyk7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVJbmZvLmhhc1ZhbHVlXG4gICAgICA/IHRoaXMuZ2V0Q29ycmVjdFZhbHVlKHRoaXMudmFsdWVJbmZvLnZhbHVlKVxuICAgICAgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdmFyaWFibGVzLnB1c2godGhpcy52YXJpYWJsZU5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb3JyZWN0VmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMudXNlVmFsdWVBc0l0SXMpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gc3VwZXIuZ2V0Q29ycmVjdFZhbHVlKHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25PcGVyYW5kIGV4dGVuZHMgT3BlcmFuZCB7XG4gIHByaXZhdGUgaXNSZWFkeVZhbHVlOiBib29sZWFuO1xuICBwcml2YXRlIGFzeW5SZXN1bHQ6IGFueTtcbiAgcHVibGljIG9uQXN5bmNSZWFkeTogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvcmlnaW5hbFZhbHVlOiBzdHJpbmcsIHByaXZhdGUgcGFyYW1ldGVyczogQXJyYXlPcGVyYW5kKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlzUmVhZHlWYWx1ZSA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtZXRlcnMpICYmIHBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnBhcmFtZXRlcnMgPSBuZXcgQXJyYXlPcGVyYW5kKFtdKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmdW5jdGlvblwiO1xuICB9XG4gIHB1YmxpYyBldmFsdWF0ZUFzeW5jKHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlKSB7XG4gICAgdGhpcy5pc1JlYWR5VmFsdWUgPSBmYWxzZTtcbiAgICB2YXIgYXN5bmNQcm9jZXNzVmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gICAgYXN5bmNQcm9jZXNzVmFsdWUudmFsdWVzID0gSGVscGVycy5jcmVhdGVDb3B5KHByb2Nlc3NWYWx1ZS52YWx1ZXMpO1xuICAgIGFzeW5jUHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMgPSBIZWxwZXJzLmNyZWF0ZUNvcHkocHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMpO1xuICAgIGFzeW5jUHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMucmV0dXJuUmVzdWx0ID0gKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICB0aGlzLmFzeW5SZXN1bHQgPSByZXN1bHQ7XG4gICAgICB0aGlzLmlzUmVhZHlWYWx1ZSA9IHRydWU7XG4gICAgICB0aGlzLm9uQXN5bmNSZWFkeSgpO1xuICAgIH07XG4gICAgdGhpcy5ldmFsdWF0ZUNvcmUoYXN5bmNQcm9jZXNzVmFsdWUpO1xuICB9XG4gIHB1YmxpYyBldmFsdWF0ZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzUmVhZHkpIHJldHVybiB0aGlzLmFzeW5SZXN1bHQ7XG4gICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVDb3JlKHByb2Nlc3NWYWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBldmFsdWF0ZUNvcmUocHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogYW55IHtcbiAgICByZXR1cm4gRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJ1bihcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZSxcbiAgICAgIHRoaXMucGFyYW1ldGVycy5ldmFsdWF0ZShwcm9jZXNzVmFsdWUpLFxuICAgICAgcHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXNcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsVmFsdWUgKyBcIihcIiArIHRoaXMucGFyYW1ldGVycy50b1N0cmluZyhmdW5jKSArIFwiKVwiO1xuICB9XG5cbiAgcHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLnBhcmFtZXRlcnMuc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVhZHlWYWx1ZTtcbiAgfVxuICBwdWJsaWMgaGFzRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGhhc0FzeW5jRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5pc0FzeW5jRnVuY3Rpb24odGhpcy5vcmlnaW5hbFZhbHVlKTtcbiAgfVxuICBwdWJsaWMgYWRkVG9Bc3luY0xpc3QobGlzdDogQXJyYXk8RnVuY3Rpb25PcGVyYW5kPikge1xuICAgIGlmICh0aGlzLmhhc0FzeW5jRnVuY3Rpb24oKSkge1xuICAgICAgbGlzdC5wdXNoKHRoaXMpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3BlcmFuZE1ha2VyIHtcbiAgc3RhdGljIHRocm93SW52YWxpZE9wZXJhdG9yRXJyb3Iob3A6IHN0cmluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb3BlcmF0b3I6ICdcIiArIG9wICsgXCInXCIpO1xuICB9XG5cbiAgc3RhdGljIHNhZmVUb1N0cmluZyhvcGVyYW5kOiBPcGVyYW5kLCBmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG9wZXJhbmQgPT0gbnVsbCA/IFwiXCIgOiBvcGVyYW5kLnRvU3RyaW5nKGZ1bmMpO1xuICB9XG5cbiAgc3RhdGljIHRvT3BlcmFuZFN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoXG4gICAgICAhIXZhbHVlICYmXG4gICAgICAhT3BlcmFuZE1ha2VyLmlzTnVtZXJpYyh2YWx1ZSkgJiZcbiAgICAgICFPcGVyYW5kTWFrZXIuaXNCb29sZWFuVmFsdWUodmFsdWUpXG4gICAgKVxuICAgICAgdmFsdWUgPSBcIidcIiArIHZhbHVlICsgXCInXCI7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc3RhdGljIGlzU3BhY2VTdHJpbmcoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzdHIgJiYgIXN0ci5yZXBsYWNlKFwiIFwiLCBcIlwiKTtcbiAgfVxuXG4gIHN0YXRpYyBpc051bWVyaWModmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICEhdmFsdWUgJiZcbiAgICAgICh2YWx1ZS5pbmRleE9mKFwiLVwiKSA+IC0xIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCIrXCIpID4gMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiKlwiKSA+IC0xIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCJeXCIpID4gLTEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIi9cIikgPiAtMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiJVwiKSA+IC0xKVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoT3BlcmFuZE1ha2VyLmlzU3BhY2VTdHJpbmcodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNOdW1iZXIodmFsdWUpO1xuICB9XG5cbiAgc3RhdGljIGlzQm9vbGVhblZhbHVlKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF2YWx1ZSAmJlxuICAgICAgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiIHx8IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwiZmFsc2VcIilcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHVuYXJ5RnVuY3Rpb25zOiBIYXNoVGFibGU8RnVuY3Rpb24+ID0ge1xuICAgIGVtcHR5OiBmdW5jdGlvbih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpO1xuICAgIH0sXG4gICAgbm90ZW1wdHk6IGZ1bmN0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhT3BlcmFuZE1ha2VyLnVuYXJ5RnVuY3Rpb25zLmVtcHR5KHZhbHVlKTtcbiAgICB9LFxuICAgIG5lZ2F0ZTogZnVuY3Rpb24odmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgfSxcbiAgfTtcblxuICBzdGF0aWMgYmluYXJ5RnVuY3Rpb25zOiBIYXNoVGFibGU8RnVuY3Rpb24+ID0ge1xuICAgIGFyaXRobWV0aWNPcChvcGVyYXRvck5hbWU6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGE6IGFueSwgYjogYW55KTogYW55IHtcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KGEpICYmICFPcGVyYW5kTWFrZXIuaXNTcGFjZVN0cmluZyhhKSkge1xuICAgICAgICAgIGEgPSB0eXBlb2YgYiA9PT0gXCJzdHJpbmdcIiA/IFwiXCIgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShiKSAmJiAhT3BlcmFuZE1ha2VyLmlzU3BhY2VTdHJpbmcoYikpIHtcbiAgICAgICAgICBiID0gdHlwZW9mIGEgPT09IFwic3RyaW5nXCIgPyBcIlwiIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb25zdW1lciA9IE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnNbb3BlcmF0b3JOYW1lXTtcbiAgICAgICAgcmV0dXJuIGNvbnN1bWVyID09IG51bGwgPyBudWxsIDogY29uc3VtZXIuY2FsbCh0aGlzLCBhLCBiKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBhbmQ6IGZ1bmN0aW9uKGE6IGJvb2xlYW4sIGI6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBhICYmIGI7XG4gICAgfSxcbiAgICBvcjogZnVuY3Rpb24oYTogYm9vbGVhbiwgYjogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGEgfHwgYjtcbiAgICB9LFxuICAgIHBsdXM6IGZ1bmN0aW9uKGE6IGFueSwgYjogYW55KTogYW55IHtcbiAgICAgIHJldHVybiBhICsgYjtcbiAgICB9LFxuICAgIG1pbnVzOiBmdW5jdGlvbihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSxcbiAgICBtdWw6IGZ1bmN0aW9uKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBhICogYjtcbiAgICB9LFxuICAgIGRpdjogZnVuY3Rpb24oYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgaWYgKCFiKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBhIC8gYjtcbiAgICB9LFxuICAgIG1vZDogZnVuY3Rpb24oYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgaWYgKCFiKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBhICUgYjtcbiAgICB9LFxuICAgIHBvd2VyOiBmdW5jdGlvbihhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gTWF0aC5wb3coYSwgYik7XG4gICAgfSxcbiAgICBncmVhdGVyOiBmdW5jdGlvbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGxlZnQgPiByaWdodDtcbiAgICB9LFxuICAgIGxlc3M6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKGxlZnQgPT0gbnVsbCB8fCByaWdodCA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0O1xuICAgIH0sXG4gICAgZ3JlYXRlcm9yZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuZXF1YWwobGVmdCwgcmlnaHQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmdyZWF0ZXIobGVmdCwgcmlnaHQpO1xuICAgIH0sXG4gICAgbGVzc29yZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuZXF1YWwobGVmdCwgcmlnaHQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmxlc3MobGVmdCwgcmlnaHQpO1xuICAgIH0sXG4gICAgZXF1YWw6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5pc1R3b1ZhbHVlRXF1YWxzKGxlZnQsIHJpZ2h0KTtcbiAgICB9LFxuICAgIG5vdGVxdWFsOiBmdW5jdGlvbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5lcXVhbChsZWZ0LCByaWdodCk7XG4gICAgfSxcbiAgICBjb250YWluczogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5jb250YWluc0NvcmUobGVmdCwgcmlnaHQsIHRydWUpO1xuICAgIH0sXG4gICAgbm90Y29udGFpbnM6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKCFsZWZ0ICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eShyaWdodCkpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuY29udGFpbnNDb3JlKGxlZnQsIHJpZ2h0LCBmYWxzZSk7XG4gICAgfSxcbiAgICBhbnlvZjogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkobGVmdCkgJiYgSGVscGVycy5pc1ZhbHVlRW1wdHkocmlnaHQpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChcbiAgICAgICAgSGVscGVycy5pc1ZhbHVlRW1wdHkobGVmdCkgfHxcbiAgICAgICAgKCFBcnJheS5pc0FycmF5KGxlZnQpICYmIGxlZnQubGVuZ3RoID09PSAwKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkocmlnaHQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShsZWZ0KSlcbiAgICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuY29udGFpbnMocmlnaHQsIGxlZnQpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJpZ2h0KSlcbiAgICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuY29udGFpbnMobGVmdCwgcmlnaHQpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaWdodC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5jb250YWlucyhsZWZ0LCByaWdodFtpXSkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgYWxsb2Y6IGZ1bmN0aW9uKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKCFsZWZ0ICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eShyaWdodCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyaWdodCkpXG4gICAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zKGxlZnQsIHJpZ2h0KTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmlnaHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zKGxlZnQsIHJpZ2h0W2ldKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGNvbnRhaW5zQ29yZTogZnVuY3Rpb24obGVmdDogYW55LCByaWdodDogYW55LCBpc0NvbnRhaW5zOiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmICghbGVmdCAmJiBsZWZ0ICE9PSAwICYmIGxlZnQgIT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWxlZnQubGVuZ3RoKSB7XG4gICAgICAgIGxlZnQgPSBsZWZ0LnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmlnaHQgPT09IFwic3RyaW5nXCIgfHwgcmlnaHQgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgICBsZWZ0ID0gbGVmdC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIHJpZ2h0ID0gcmlnaHQudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsZWZ0ID09PSBcInN0cmluZ1wiIHx8IGxlZnQgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgaWYgKCFyaWdodCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByaWdodCA9IHJpZ2h0LnRvU3RyaW5nKCk7XG4gICAgICAgIHZhciBmb3VuZCA9IGxlZnQuaW5kZXhPZihyaWdodCkgPiAtMTtcbiAgICAgICAgcmV0dXJuIGlzQ29udGFpbnMgPyBmb3VuZCA6ICFmb3VuZDtcbiAgICAgIH1cbiAgICAgIHZhciByaWdodEFycmF5ID0gQXJyYXkuaXNBcnJheShyaWdodCkgPyByaWdodCA6IFtyaWdodF07XG4gICAgICBmb3IgKHZhciBySW5kZXggPSAwOyBySW5kZXggPCByaWdodEFycmF5Lmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICByaWdodCA9IHJpZ2h0QXJyYXlbckluZGV4XTtcbiAgICAgICAgZm9yICg7IGkgPCBsZWZ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKE9wZXJhbmRNYWtlci5pc1R3b1ZhbHVlRXF1YWxzKGxlZnRbaV0sIHJpZ2h0KSkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT0gbGVmdC5sZW5ndGgpIHJldHVybiAhaXNDb250YWlucztcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0NvbnRhaW5zO1xuICAgIH0sXG4gIH07XG5cbiAgc3RhdGljIGlzVHdvVmFsdWVFcXVhbHMoeDogYW55LCB5OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoeCA9PT0gXCJ1bmRlZmluZWRcIikgeCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoeSA9PT0gXCJ1bmRlZmluZWRcIikgeSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHgsIHksIHRydWUpO1xuICB9XG5cbiAgc3RhdGljIG9wZXJhdG9yVG9TdHJpbmcob3BlcmF0b3JOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBvcFN0ciA9IE9wZXJhbmRNYWtlci5zaWduc1tvcGVyYXRvck5hbWVdO1xuICAgIHJldHVybiBvcFN0ciA9PSBudWxsID8gb3BlcmF0b3JOYW1lIDogb3BTdHI7XG4gIH1cblxuICBzdGF0aWMgc2lnbnM6IEhhc2hUYWJsZTxzdHJpbmc+ID0ge1xuICAgIGxlc3M6IFwiPFwiLFxuICAgIGxlc3NvcmVxdWFsOiBcIjw9XCIsXG4gICAgZ3JlYXRlcjogXCI+XCIsXG4gICAgZ3JlYXRlcm9yZXF1YWw6IFwiPj1cIixcbiAgICBlcXVhbDogXCI9PVwiLFxuICAgIG5vdGVxdWFsOiBcIiE9XCIsXG4gICAgcGx1czogXCIrXCIsXG4gICAgbWludXM6IFwiLVwiLFxuICAgIG11bDogXCIqXCIsXG4gICAgZGl2OiBcIi9cIixcbiAgICBhbmQ6IFwiYW5kXCIsXG4gICAgb3I6IFwib3JcIixcbiAgICBwb3dlcjogXCJeXCIsXG4gICAgbW9kOiBcIiVcIixcbiAgICBuZWdhdGU6IFwiIVwiLFxuICB9O1xufVxuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IElFbGVtZW50LCBJUXVlc3Rpb24gfSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IFBhbmVsTW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuXG4vKipcbiAqIFRoZSBmbG93IHBhbmVsIG9iamVjdC4gSXQgaXMgYSBjb250YWluZXIgd2l0aCBmbG93IGxheW91dCB3aGVyZSB5b3UgY2FuIG1peCBxdWVzdGlvbnMgd2l0aCBtYXJrZG93biB0ZXh0LlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEZsb3dQYW5lbE1vZGVsIGV4dGVuZHMgUGFuZWxNb2RlbCB7XG4gIHN0YXRpYyBjb250ZW50RWxlbWVudE5hbWVQcmVmaXggPSBcImVsZW1lbnQ6XCI7XG4gIHB1YmxpYyBjb250ZW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgb25HZXRIdG1sRm9yUXVlc3Rpb246IChxdWVzdGlvbjogUXVlc3Rpb24pID0+IHN0cmluZztcbiAgcHVibGljIG9uQ3VzdG9tSHRtbFByb2R1Y2luZzogKCkgPT4gc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbnRlbnRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJjb250ZW50XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYub25Db250ZW50Q2hhbmdlZCgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZmxvd3BhbmVsXCI7XG4gIH1cbiAgZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZmxvd1wiO1xuICB9XG4gIG9uU3VydmV5TG9hZCgpOiBhbnkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMub25Db250ZW50Q2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29udGVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbnRlbnRcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb250ZW50KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb250ZW50XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NDb250ZW50KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbnRlbnRcIik7XG4gIH1cbiAgcHVibGljIGdldCBodG1sKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImh0bWxcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBodG1sKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaHRtbFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbnRlbnRDaGFuZ2VkKCk6IGFueSB7XG4gICAgdmFyIGh0bWwgPSBcIlwiO1xuICAgIGlmICghIXRoaXMub25DdXN0b21IdG1sUHJvZHVjaW5nKSB7XG4gICAgICBodG1sID0gdGhpcy5vbkN1c3RvbUh0bWxQcm9kdWNpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaHRtbCA9IHRoaXMucHJvZHVjZUh0bWwoKTtcbiAgICB9XG4gICAgdGhpcy5odG1sID0gaHRtbDtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRDaGFuZ2VkQ2FsbGJhY2spIHRoaXMuY29udGVudENoYW5nZWRDYWxsYmFjaygpO1xuICB9XG4gIHB1YmxpYyBwcm9kdWNlSHRtbCgpOiBzdHJpbmcge1xuICAgIHZhciBodG1sID0gW107XG4gICAgLy9jb250ZW50RWxlbWVudE5hbWVQcmVmaXhcbiAgICB2YXIgcmVnRXggPSAveyguKj8oZWxlbWVudDopW14kXS4qPyl9L2c7XG4gICAgdmFyIHN0ciA9IHRoaXMuY29udGVudDtcbiAgICB2YXIgc3RhcnRJbmRleCA9IDA7XG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgd2hpbGUgKChyZXMgPSByZWdFeC5leGVjKHN0cikpICE9PSBudWxsKSB7XG4gICAgICBpZiAocmVzLmluZGV4ID4gc3RhcnRJbmRleCkge1xuICAgICAgICBodG1sLnB1c2goc3RyLnN1YnN0cihzdGFydEluZGV4LCByZXMuaW5kZXggLSBzdGFydEluZGV4KSk7XG4gICAgICAgIHN0YXJ0SW5kZXggPSByZXMuaW5kZXg7XG4gICAgICB9XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uRnJvbVRleHQocmVzWzBdKTtcbiAgICAgIGlmICghIXF1ZXN0aW9uKSB7XG4gICAgICAgIGh0bWwucHVzaCh0aGlzLmdldEh0bWxGb3JRdWVzdGlvbihxdWVzdGlvbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHRtbC5wdXNoKFxuICAgICAgICAgIHN0ci5zdWJzdHIoc3RhcnRJbmRleCwgcmVzLmluZGV4ICsgcmVzWzBdLmxlbmd0aCAtIHN0YXJ0SW5kZXgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGFydEluZGV4ID0gcmVzLmluZGV4ICsgcmVzWzBdLmxlbmd0aDtcbiAgICB9XG4gICAgaWYgKHN0YXJ0SW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgICBodG1sLnB1c2goc3RyLnN1YnN0cihzdGFydEluZGV4LCBzdHIubGVuZ3RoIC0gc3RhcnRJbmRleCkpO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbC5qb2luKFwiXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIjxicj5cIiwgXCJnXCIpLCBcIjxici8+XCIpO1xuICB9XG4gIHB1YmxpYyBnZXRRdWVzdGlvbkZyb21UZXh0KHN0cjogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHN0ciA9IHN0ci5zdWJzdHIoMSwgc3RyLmxlbmd0aCAtIDIpO1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKEZsb3dQYW5lbE1vZGVsLmNvbnRlbnRFbGVtZW50TmFtZVByZWZpeCwgXCJcIikudHJpbSgpO1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKHN0cik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEh0bWxGb3JRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMub25HZXRIdG1sRm9yUXVlc3Rpb24pIHJldHVybiB0aGlzLm9uR2V0SHRtbEZvclF1ZXN0aW9uKHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb25IdG1sSWQocXVlc3Rpb246IFF1ZXN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lICsgXCJfXCIgKyBxdWVzdGlvbi5pZDtcbiAgfVxuICBwcm90ZWN0ZWQgb25BZGRFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgc3VwZXIub25BZGRFbGVtZW50KGVsZW1lbnQsIGluZGV4KTtcbiAgICB0aGlzLmFkZEVsZW1lbnRUb0NvbnRlbnQoZWxlbWVudCk7XG4gICAgZWxlbWVudC5yZW5kZXJXaWR0aCA9IFwiXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIHZhciBzZWFyY2hTdHIgPSB0aGlzLmdldEVsZW1lbnRDb250ZW50VGV4dChlbGVtZW50KTtcbiAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQucmVwbGFjZShzZWFyY2hTdHIsIFwiXCIpO1xuICAgIHN1cGVyLm9uUmVtb3ZlRWxlbWVudChlbGVtZW50KTtcbiAgfVxuICBkcmFnRHJvcE1vdmVFbGVtZW50KHNyYzogSUVsZW1lbnQsIHRhcmdldDogSUVsZW1lbnQsIHRhcmdldEluZGV4OiBudW1iZXIpIHt9XG4gIHByaXZhdGUgYWRkRWxlbWVudFRvQ29udGVudChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHRleHQgPSB0aGlzLmdldEVsZW1lbnRDb250ZW50VGV4dChlbGVtZW50KTtcbiAgICBpZiAoIXRoaXMuaW5zZXJ0VGV4dEF0Q3Vyc29yKHRleHQpKSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQgKyB0ZXh0O1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGluc2VydFRleHRBdEN1cnNvcih0ZXh0OiBzdHJpbmcsIHByZXZOYW1lOiBzdHJpbmcgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNEZXNpZ25Nb2RlIHx8XG4gICAgICB0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgICF3aW5kb3cuZ2V0U2VsZWN0aW9uXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHNlbC5nZXRSYW5nZUF0ICYmIHNlbC5yYW5nZUNvdW50KSB7XG4gICAgICBsZXQgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgICByYW5nZS5pbnNlcnROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpKTtcbiAgICAgIHZhciBzZWxmID0gPGFueT50aGlzO1xuICAgICAgaWYgKHNlbGYuZ2V0Q29udGVudCkge1xuICAgICAgICB2YXIgc3RyID0gc2VsZi5nZXRDb250ZW50KHByZXZOYW1lKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc3RyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudENvbnRlbnRUZXh0KGVsZW1lbnQ6IElFbGVtZW50KSB7XG4gICAgcmV0dXJuIFwie1wiICsgRmxvd1BhbmVsTW9kZWwuY29udGVudEVsZW1lbnROYW1lUHJlZml4ICsgZWxlbWVudC5uYW1lICsgXCJ9XCI7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJmbG93cGFuZWxcIixcbiAgW3sgbmFtZTogXCJjb250ZW50Omh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbnRlbnRcIiB9XSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRmxvd1BhbmVsTW9kZWwoKTtcbiAgfSxcbiAgXCJwYW5lbFwiXG4pO1xuIiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25GYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogRnVuY3Rpb25GYWN0b3J5ID0gbmV3IEZ1bmN0aW9uRmFjdG9yeSgpO1xuICBwcml2YXRlIGZ1bmN0aW9uSGFzaDogSGFzaFRhYmxlPChwYXJhbXM6IGFueVtdKSA9PiBhbnk+ID0ge307XG4gIHByaXZhdGUgaXNBc3luY0hhc2g6IEhhc2hUYWJsZTxib29sZWFuPiA9IHt9O1xuXG4gIHB1YmxpYyByZWdpc3RlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZnVuYzogKHBhcmFtczogYW55W10pID0+IGFueSxcbiAgICBpc0FzeW5jOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5mdW5jdGlvbkhhc2hbbmFtZV0gPSBmdW5jO1xuICAgIGlmIChpc0FzeW5jKSB0aGlzLmlzQXN5bmNIYXNoW25hbWVdID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgdW5yZWdpc3RlcihuYW1lOiBzdHJpbmcpIHtcbiAgICBkZWxldGUgdGhpcy5mdW5jdGlvbkhhc2hbbmFtZV07XG4gICAgZGVsZXRlIHRoaXMuaXNBc3luY0hhc2hbbmFtZV07XG4gIH1cbiAgcHVibGljIGhhc0Z1bmN0aW9uKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZnVuY3Rpb25IYXNoW25hbWVdO1xuICB9XG4gIHB1YmxpYyBpc0FzeW5jRnVuY3Rpb24obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5pc0FzeW5jSGFzaFtuYW1lXTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLmZ1bmN0aW9uSGFzaCA9IHt9O1xuICB9XG4gIHB1YmxpYyBnZXRBbGwoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmZ1bmN0aW9uSGFzaCkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gIH1cbiAgcHVibGljIHJ1bihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBhbnlbXSxcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGxcbiAgKTogYW55IHtcbiAgICB2YXIgZnVuYyA9IHRoaXMuZnVuY3Rpb25IYXNoW25hbWVdO1xuICAgIGlmICghZnVuYykgcmV0dXJuIG51bGw7XG4gICAgbGV0IGNsYXNzUnVubmVyID0ge1xuICAgICAgZnVuYzogZnVuYyxcbiAgICB9O1xuXG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICg8YW55PmNsYXNzUnVubmVyKVtrZXldID0gcHJvcGVydGllc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xhc3NSdW5uZXIuZnVuYyhwYXJhbXMpO1xuICB9XG59XG5cbmV4cG9ydCB2YXIgcmVnaXN0ZXJGdW5jdGlvbiA9IEZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcjtcblxuZnVuY3Rpb24gZ2V0UGFyYW1zQXNBcnJheSh2YWx1ZTogYW55LCBhcnI6IGFueVtdKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm47XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGdldFBhcmFtc0FzQXJyYXkodmFsdWVbaV0sIGFycik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChIZWxwZXJzLmlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9XG4gICAgYXJyLnB1c2godmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1bShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgdmFyIGFycjogYW55W10gPSBbXTtcbiAgZ2V0UGFyYW1zQXNBcnJheShwYXJhbXMsIGFycik7XG4gIHZhciByZXMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHJlcyArPSBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcInN1bVwiLCBzdW0pO1xuXG5mdW5jdGlvbiBtaW5fbWF4KHBhcmFtczogYW55W10sIGlzTWluOiBib29sZWFuKTogYW55IHtcbiAgdmFyIGFycjogYW55W10gPSBbXTtcbiAgZ2V0UGFyYW1zQXNBcnJheShwYXJhbXMsIGFycik7XG4gIHZhciByZXMgPSB1bmRlZmluZWQ7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXMgPSBhcnJbaV07XG4gICAgfVxuICAgIGlmIChpc01pbikge1xuICAgICAgaWYgKHJlcyA+IGFycltpXSkgcmVzID0gYXJyW2ldO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVzIDwgYXJyW2ldKSByZXMgPSBhcnJbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIG1pbihwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgcmV0dXJuIG1pbl9tYXgocGFyYW1zLCB0cnVlKTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcIm1pblwiLCBtaW4pO1xuXG5mdW5jdGlvbiBtYXgocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHJldHVybiBtaW5fbWF4KHBhcmFtcywgZmFsc2UpO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwibWF4XCIsIG1heCk7XG5cbmZ1bmN0aW9uIGNvdW50KHBhcmFtczogYW55W10pOiBhbnkge1xuICB2YXIgYXJyOiBhbnlbXSA9IFtdO1xuICBnZXRQYXJhbXNBc0FycmF5KHBhcmFtcywgYXJyKTtcbiAgcmV0dXJuIGFyci5sZW5ndGg7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJjb3VudFwiLCBjb3VudCk7XG5cbmZ1bmN0aW9uIGF2ZyhwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgdmFyIGFycjogYW55W10gPSBbXTtcbiAgZ2V0UGFyYW1zQXNBcnJheShwYXJhbXMsIGFycik7XG4gIHZhciByZXMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHJlcyArPSBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIGFyci5sZW5ndGggPiAwID8gcmVzIC8gYXJyLmxlbmd0aCA6IDA7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJhdmdcIiwgYXZnKTtcblxuZnVuY3Rpb24gZ2V0SW5BcnJheVBhcmFtcyhwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKHBhcmFtcy5sZW5ndGggIT0gMikgcmV0dXJuIG51bGw7XG4gIHZhciBhcnIgPSBwYXJhbXNbMF07XG4gIGlmICghYXJyKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycikgJiYgIUFycmF5LmlzQXJyYXkoT2JqZWN0LmtleXMoYXJyKSkpIHJldHVybiBudWxsO1xuICB2YXIgbmFtZSA9IHBhcmFtc1sxXTtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiICYmICEobmFtZSBpbnN0YW5jZW9mIFN0cmluZykpIHJldHVybiBudWxsO1xuICByZXR1cm4geyBkYXRhOiBhcnIsIG5hbWU6IG5hbWUgfTtcbn1cblxuZnVuY3Rpb24gY2FsY0luQXJyYXkoXG4gIHBhcmFtczogYW55W10sXG4gIGZ1bmM6IChyZXM6IG51bWJlciwgdmFsOiBudW1iZXIpID0+IG51bWJlclxuKTogYW55IHtcbiAgdmFyIHYgPSBnZXRJbkFycmF5UGFyYW1zKHBhcmFtcyk7XG4gIGlmICghdikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIHJlcyA9IHVuZGVmaW5lZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkodi5kYXRhKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdi5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHYuZGF0YVtpXTtcbiAgICAgIGlmICghIWl0ZW0gJiYgaXRlbVs8c3RyaW5nPnYubmFtZV0pIHtcbiAgICAgICAgcmVzID0gZnVuYyhyZXMsIGl0ZW1bPHN0cmluZz52Lm5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIga2V5IGluIHYuZGF0YSkge1xuICAgICAgdmFyIGl0ZW0gPSB2LmRhdGFba2V5XTtcbiAgICAgIGlmICghIWl0ZW0gJiYgaXRlbVs8c3RyaW5nPnYubmFtZV0pIHtcbiAgICAgICAgcmVzID0gZnVuYyhyZXMsIGl0ZW1bPHN0cmluZz52Lm5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gc3VtSW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgdmFyIHJlcyA9IGNhbGNJbkFycmF5KHBhcmFtcywgZnVuY3Rpb24ocmVzOiBudW1iZXIsIHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmVzID09IHVuZGVmaW5lZCkgcmVzID0gMDtcbiAgICByZXR1cm4gK3JlcyArICt2YWw7XG4gIH0pO1xuICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgPyByZXMgOiAwO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwic3VtSW5BcnJheVwiLCBzdW1JbkFycmF5KTtcblxuZnVuY3Rpb24gbWluSW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgcmV0dXJuIGNhbGNJbkFycmF5KHBhcmFtcywgZnVuY3Rpb24ocmVzOiBudW1iZXIsIHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmVzID09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gcmVzIDwgdmFsID8gcmVzIDogdmFsO1xuICB9KTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcIm1pbkluQXJyYXlcIiwgbWluSW5BcnJheSk7XG5cbmZ1bmN0aW9uIG1heEluQXJyYXkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHJldHVybiBjYWxjSW5BcnJheShwYXJhbXMsIGZ1bmN0aW9uKHJlczogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHJlcyA9PSB1bmRlZmluZWQpIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHJlcyA+IHZhbCA/IHJlcyA6IHZhbDtcbiAgfSk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJtYXhJbkFycmF5XCIsIG1heEluQXJyYXkpO1xuXG5mdW5jdGlvbiBjb3VudEluQXJyYXkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciByZXMgPSBjYWxjSW5BcnJheShwYXJhbXMsIGZ1bmN0aW9uKHJlczogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHJlcyA9PSB1bmRlZmluZWQpIHJlcyA9IDA7XG4gICAgcmV0dXJuIHJlcyArIDE7XG4gIH0pO1xuICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgPyByZXMgOiAwO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiY291bnRJbkFycmF5XCIsIGNvdW50SW5BcnJheSk7XG5cbmZ1bmN0aW9uIGF2Z0luQXJyYXkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciBjb3VudCA9IGNvdW50SW5BcnJheShwYXJhbXMpO1xuICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIDA7XG4gIHJldHVybiBzdW1JbkFycmF5KHBhcmFtcykgLyBjb3VudDtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImF2Z0luQXJyYXlcIiwgYXZnSW5BcnJheSk7XG5cbmZ1bmN0aW9uIGlpZihwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBwYXJhbXNbMF0gPyBwYXJhbXNbMV0gOiBwYXJhbXNbMl07XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJpaWZcIiwgaWlmKTtcblxuZnVuY3Rpb24gZ2V0RGF0ZShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCA8IDEpIHJldHVybiBudWxsO1xuICBpZiAoIXBhcmFtc1swXSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBuZXcgRGF0ZShwYXJhbXNbMF0pO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiZ2V0RGF0ZVwiLCBnZXREYXRlKTtcblxuZnVuY3Rpb24gYWdlKHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAoIXBhcmFtcyAmJiBwYXJhbXMubGVuZ3RoIDwgMSkgcmV0dXJuIG51bGw7XG4gIGlmICghcGFyYW1zWzBdKSByZXR1cm4gbnVsbDtcbiAgdmFyIGJpcnRoRGF0ZSA9IG5ldyBEYXRlKHBhcmFtc1swXSk7XG4gIHZhciB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIHZhciBhZ2UgPSB0b2RheS5nZXRGdWxsWWVhcigpIC0gYmlydGhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gIHZhciBtID0gdG9kYXkuZ2V0TW9udGgoKSAtIGJpcnRoRGF0ZS5nZXRNb250aCgpO1xuICBpZiAobSA8IDAgfHwgKG0gPT09IDAgJiYgdG9kYXkuZ2V0RGF0ZSgpIDwgYmlydGhEYXRlLmdldERhdGUoKSkpIHtcbiAgICBhZ2UgLT0gYWdlID4gMCA/IDEgOiAwO1xuICB9XG4gIHJldHVybiBhZ2U7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJhZ2VcIiwgYWdlKTtcblxuZnVuY3Rpb24gaXNDb250YWluZXJSZWFkeShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCA8IDEpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFwYXJhbXNbMF0gfHwgIXRoaXMuc3VydmV5KSByZXR1cm4gZmFsc2U7XG4gIHZhciBuYW1lID0gcGFyYW1zWzBdO1xuICB2YXIgY29udGFpbmVyID0gdGhpcy5zdXJ2ZXkuZ2V0UGFnZUJ5TmFtZShuYW1lKTtcbiAgaWYgKCFjb250YWluZXIpIGNvbnRhaW5lciA9IHRoaXMuc3VydmV5LmdldFBhbmVsQnlOYW1lKG5hbWUpO1xuICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIGZhbHNlO1xuICB2YXIgcXVlc3Rpb25zID0gY29udGFpbmVyLnF1ZXN0aW9ucztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocXVlc3Rpb25zW2ldLmhhc0Vycm9ycyhmYWxzZSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImlzQ29udGFpbmVyUmVhZHlcIiwgaXNDb250YWluZXJSZWFkeSk7XG5cbmZ1bmN0aW9uIGlzRGlzcGxheU1vZGUoKSB7XG4gIHJldHVybiB0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiaXNEaXNwbGF5TW9kZVwiLCBpc0Rpc3BsYXlNb2RlKTtcblxuZnVuY3Rpb24gY3VycmVudERhdGUoKSB7XG4gIHJldHVybiBuZXcgRGF0ZSgpO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiY3VycmVudERhdGVcIiwgY3VycmVudERhdGUpO1xuXG5mdW5jdGlvbiB0b2RheShwYXJhbXM6IGFueVtdKSB7XG4gIHZhciByZXMgPSBuZXcgRGF0ZSgpO1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMpICYmIHBhcmFtcy5sZW5ndGggPT0gMSkge1xuICAgIHJlcy5zZXREYXRlKHJlcy5nZXREYXRlKCkgKyBwYXJhbXNbMF0pO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJ0b2RheVwiLCB0b2RheSk7XG5cbmZ1bmN0aW9uIGRpZmZEYXlzKHBhcmFtczogYW55W10pIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcykgfHwgcGFyYW1zLmxlbmd0aCAhPT0gMikgcmV0dXJuIDA7XG4gIGlmICghcGFyYW1zWzBdIHx8ICFwYXJhbXNbMV0pIHJldHVybiAwO1xuICBjb25zdCBkYXRlMTogYW55ID0gbmV3IERhdGUocGFyYW1zWzBdKTtcbiAgY29uc3QgZGF0ZTI6IGFueSA9IG5ldyBEYXRlKHBhcmFtc1sxXSk7XG4gIGNvbnN0IGRpZmZUaW1lID0gTWF0aC5hYnMoZGF0ZTIgLSBkYXRlMSk7XG4gIHJldHVybiBNYXRoLmNlaWwoZGlmZlRpbWUgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiZGlmZkRheXNcIiwgZGlmZkRheXMpO1xuIiwiZXhwb3J0IGludGVyZmFjZSBIYXNoVGFibGU8VD4ge1xuICBba2V5OiBzdHJpbmddOiBUO1xufVxuXG5leHBvcnQgY2xhc3MgSGVscGVycyB7XG4gIC8qKlxuICAgKiBBIHN0YXRpYyBtZXRob2RzIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgdW5kZWZpbmVkLCBudWxsLCBlbXB0eSBzdHJpbmcgb3IgZW1wdHkgYXJyYXkuXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc1ZhbHVlRW1wdHkodmFsdWU6IGFueSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGlmICghIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZVtrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiAhdmFsdWUgJiYgdmFsdWUgIT09IDAgJiYgdmFsdWUgIT09IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheUNvbnRhaW5zRXF1YWwoeDogYW55LCB5OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoeCkgfHwgIUFycmF5LmlzQXJyYXkoeSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoeC5sZW5ndGggIT09IHkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaiA9IDA7XG4gICAgICBmb3IgKDsgaiA8IHkubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh4W2ldLCB5W2pdKSkgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaiA9PT0geS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBpc0FycmF5c0VxdWFsKFxuICAgIHg6IGFueSxcbiAgICB5OiBhbnksXG4gICAgaWdub3JlT3JkZXI6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoeCkgfHwgIUFycmF5LmlzQXJyYXkoeSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoeC5sZW5ndGggIT09IHkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlnbm9yZU9yZGVyKSB7XG4gICAgICB2YXIgeFNvcnRlZCA9IFtdO1xuICAgICAgdmFyIHlTb3J0ZWQgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgICB4U29ydGVkLnB1c2goeFtpXSk7XG4gICAgICAgIHlTb3J0ZWQucHVzaCh5W2ldKTtcbiAgICAgIH1cbiAgICAgIHhTb3J0ZWQuc29ydCgpO1xuICAgICAgeVNvcnRlZC5zb3J0KCk7XG4gICAgICB4ID0geFNvcnRlZDtcbiAgICAgIHkgPSB5U29ydGVkO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHhbaV0sIHlbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNUd29WYWx1ZUVxdWFscyhcbiAgICB4OiBhbnksXG4gICAgeTogYW55LFxuICAgIGlnbm9yZU9yZGVyOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHggPT09IHkpIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeCkgJiYgeC5sZW5ndGggPT09IDAgJiYgdHlwZW9mIHkgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh5KSAmJiB5Lmxlbmd0aCA9PT0gMCAmJiB0eXBlb2YgeCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICgoeCA9PT0gdW5kZWZpbmVkIHx8IHggPT09IG51bGwpICYmIHkgPT09IFwiXCIpIHJldHVybiB0cnVlO1xuICAgIGlmICgoeSA9PT0gdW5kZWZpbmVkIHx8IHkgPT09IG51bGwpICYmIHggPT09IFwiXCIpIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiB4ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB5ID09IFwic3RyaW5nXCIpIHJldHVybiB4ID09IHk7XG5cbiAgICBpZiAoSGVscGVycy5pc0NvbnZlcnRpYmxlVG9OdW1iZXIoeCkgJiYgSGVscGVycy5pc0NvbnZlcnRpYmxlVG9OdW1iZXIoeSkpIHtcbiAgICAgIGlmIChwYXJzZUludCh4KSA9PT0gcGFyc2VJbnQoeSkgJiYgcGFyc2VGbG9hdCh4KSA9PT0gcGFyc2VGbG9hdCh5KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHgpICYmIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHkpKSB8fFxuICAgICAgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHgpICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eSh5KSlcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCh4ID09PSB0cnVlIHx8IHggPT09IGZhbHNlKSAmJiB0eXBlb2YgeSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4geC50b1N0cmluZygpID09PSB5LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmICgoeSA9PT0gdHJ1ZSB8fCB5ID09PSBmYWxzZSkgJiYgdHlwZW9mIHggPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHkudG9TdHJpbmcoKSA9PT0geC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBpZiAoISh4IGluc3RhbmNlb2YgT2JqZWN0KSAmJiAhKHkgaW5zdGFuY2VvZiBPYmplY3QpKSByZXR1cm4geCA9PSB5O1xuICAgIGlmICghKHggaW5zdGFuY2VvZiBPYmplY3QpIHx8ICEoeSBpbnN0YW5jZW9mIE9iamVjdCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoeFtcImVxdWFsc1wiXSkgcmV0dXJuIHguZXF1YWxzKHkpO1xuICAgIGlmICghIXgudG9KU09OICYmICEheS50b0pTT04gJiYgISF4LmdldFR5cGUgJiYgISF5LmdldFR5cGUpIHtcbiAgICAgIGlmICh4LmlzRGlwb3NlZCB8fCB5LmlzRGlwb3NlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHguZ2V0VHlwZSgpICE9PSB5LmdldFR5cGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCEheC5uYW1lICYmIHgubmFtZSAhPT0geS5uYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHgudG9KU09OKCksIHkudG9KU09OKCkpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSAmJiBBcnJheS5pc0FycmF5KHkpKVxuICAgICAgcmV0dXJuIEhlbHBlcnMuaXNBcnJheXNFcXVhbCh4LCB5LCBpZ25vcmVPcmRlcik7XG5cbiAgICBmb3IgKHZhciBwIGluIHgpIHtcbiAgICAgIGlmICgheC5oYXNPd25Qcm9wZXJ0eShwKSkgY29udGludWU7XG4gICAgICBpZiAoIXkuaGFzT3duUHJvcGVydHkocCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh4W3BdID09PSB5W3BdKSBjb250aW51ZTtcbiAgICAgIGlmICh0eXBlb2YgeFtwXSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCF0aGlzLmlzVHdvVmFsdWVFcXVhbHMoeFtwXSwgeVtwXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChwIGluIHkpIHtcbiAgICAgIGlmICh5Lmhhc093blByb3BlcnR5KHApICYmICF4Lmhhc093blByb3BlcnR5KHApKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgcmFuZG9taXplQXJyYXk8VD4oYXJyYXk6IEFycmF5PFQ+KTogQXJyYXk8VD4ge1xuICAgIGZvciAodmFyIGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICB2YXIgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTtcbiAgICAgIGFycmF5W2ldID0gYXJyYXlbal07XG4gICAgICBhcnJheVtqXSA9IHRlbXA7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldFVuYmluZFZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICghIXZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAvL2RvIG5vdCByZXR1cm4gdGhlIHNhbWUgb2JqZWN0IGluc3RhbmNlISEhXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVDb3B5KG9iajogYW55KSB7XG4gICAgdmFyIHJlczogYW55ID0ge307XG4gICAgaWYgKCFvYmopIHJldHVybiByZXM7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgcmVzW2tleV0gPSBvYmpba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQ29udmVydGlibGVUb051bWJlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICFpc05hTih2YWx1ZSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiICYmXG4gICAgICAhIXZhbHVlICYmXG4gICAgICB2YWx1ZS5pbmRleE9mKFwiMHhcIikgPT0gMCAmJlxuICAgICAgdmFsdWUubGVuZ3RoID4gMzJcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgJiYgaXNGaW5pdGUodmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0TWF4TGVuZ3RoKG1heExlbmd0aDogbnVtYmVyLCBzdXJ2ZXlMZW5ndGg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKG1heExlbmd0aCA8IDApIHtcbiAgICAgIG1heExlbmd0aCA9IHN1cnZleUxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIG1heExlbmd0aCA+IDAgPyBtYXhMZW5ndGggOiBudWxsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0TnVtYmVyQnlJbmRleChpbmRleDogbnVtYmVyLCBzdGFydEluZGV4U3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybiBcIlwiO1xuICAgIHZhciBzdGFydEluZGV4ID0gMTtcbiAgICB2YXIgcHJlZml4ID0gXCJcIjtcbiAgICB2YXIgcG9zdGZpeCA9IFwiLlwiO1xuICAgIHZhciBpc051bWVyaWMgPSB0cnVlO1xuICAgIHZhciBzdHJJbmRleCA9IFwiQVwiO1xuICAgIHZhciBzdHIgPSBcIlwiO1xuICAgIGlmICghIXN0YXJ0SW5kZXhTdHIpIHtcbiAgICAgIHN0ciA9IHN0YXJ0SW5kZXhTdHI7XG4gICAgICB2YXIgaW5kID0gc3RyLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgaGFzRGlnaXQgPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChIZWxwZXJzLmlzQ2hhckRpZ2l0KHN0cltpXSkpIHtcbiAgICAgICAgICBoYXNEaWdpdCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjaGVja0xldHRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChoYXNEaWdpdCAmJiAhSGVscGVycy5pc0NoYXJEaWdpdChzdHJbaW5kXSkpIHx8XG4gICAgICAgICAgSGVscGVycy5pc0NoYXJOb3RMZXR0ZXJBbmREaWdpdChzdHJbaW5kXSlcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICB3aGlsZSAoaW5kID49IDAgJiYgY2hlY2tMZXR0ZXIoKSkgaW5kLS07XG4gICAgICB2YXIgbmV3UG9zdGZpeCA9IFwiXCI7XG4gICAgICBpZiAoaW5kIDwgc3RyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgbmV3UG9zdGZpeCA9IHN0ci5zdWJzdHIoaW5kICsgMSk7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgaW5kICsgMSk7XG4gICAgICB9XG4gICAgICBpbmQgPSBzdHIubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlIChpbmQgPj0gMCkge1xuICAgICAgICBpZiAoY2hlY2tMZXR0ZXIoKSkgYnJlYWs7XG4gICAgICAgIGluZC0tO1xuICAgICAgICBpZiAoIWhhc0RpZ2l0KSBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0ckluZGV4ID0gc3RyLnN1YnN0cihpbmQgKyAxKTtcbiAgICAgIHByZWZpeCA9IHN0ci5zdWJzdHIoMCwgaW5kICsgMSk7XG4gICAgICBpZiAocGFyc2VJbnQoc3RySW5kZXgpKSBzdGFydEluZGV4ID0gcGFyc2VJbnQoc3RySW5kZXgpO1xuICAgICAgZWxzZSBpZiAoc3RySW5kZXgubGVuZ3RoID09IDEpIGlzTnVtZXJpYyA9IGZhbHNlO1xuICAgICAgaWYgKCEhbmV3UG9zdGZpeCB8fCAhIXByZWZpeCkge1xuICAgICAgICBwb3N0Zml4ID0gbmV3UG9zdGZpeDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTnVtZXJpYykgcmV0dXJuIHByZWZpeCArIChpbmRleCArIHN0YXJ0SW5kZXgpLnRvU3RyaW5nKCkgKyBwb3N0Zml4O1xuICAgIHJldHVybiAoXG4gICAgICBwcmVmaXggKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHN0ckluZGV4LmNoYXJDb2RlQXQoMCkgKyBpbmRleCkgKyBwb3N0Zml4XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQ2hhck5vdExldHRlckFuZERpZ2l0KGNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2gudG9VcHBlckNhc2UoKSA9PSBjaC50b0xvd2VyQ2FzZSgpICYmICFIZWxwZXJzLmlzQ2hhckRpZ2l0KGNoKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQ2hhckRpZ2l0KGNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2ggPj0gXCIwXCIgJiYgY2ggPD0gXCI5XCI7XG4gIH1cbn1cbmlmICghKDxhbnk+U3RyaW5nLnByb3RvdHlwZSlbXCJmb3JtYXRcIl0pIHtcbiAgKDxhbnk+U3RyaW5nLnByb3RvdHlwZSlbXCJmb3JtYXRcIl0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC97KFxcZCspfS9nLCBmdW5jdGlvbihtYXRjaDogYW55LCBudW1iZXI6IGFueSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBhcmdzW251bWJlcl0gIT0gXCJ1bmRlZmluZWRcIiA/IGFyZ3NbbnVtYmVyXSA6IG1hdGNoO1xuICAgIH0pO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7XG4gIEpzb25PYmplY3QsXG4gIEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgU2VyaWFsaXplcixcbiAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24sXG59IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSVN1cnZleSB9IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG4vKipcbiAqIEFycmF5IG9mIEl0ZW1WYWx1ZSBpcyB1c2VkIGluIGNoZWNrb3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIGNob2ljZXMsIG1hdHJpeCBjb2x1bW5zIGFuZCByb3dzLlxuICogSXQgaGFzIHR3byBtYWluIHByb3BlcnRpZXM6IHZhbHVlIGFuZCB0ZXh0LiBJZiB0ZXh0IGlzIGVtcHR5LCB2YWx1ZSBpcyB1c2VkIGZvciBkaXNwbGF5aW5nLlxuICogVGhlIHRleHQgcHJvcGVydHkgaXMgbG9jYWxpemFibGUgYW5kIHN1cHBvcnQgbWFya2Rvd24uXG4gKi9cbmV4cG9ydCBjbGFzcyBJdGVtVmFsdWUgZXh0ZW5kcyBCYXNlIHtcbiAgW2luZGV4OiBzdHJpbmddOiBhbnk7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IFNlcGFyYXRvcigpIHtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXRlbVZhbHVlU2VwYXJhdG9yO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0IFNlcGFyYXRvcih2YWw6IHN0cmluZykge1xuICAgIHNldHRpbmdzLml0ZW1WYWx1ZVNlcGFyYXRvciA9IHZhbDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUFycmF5KGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lcik6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHZhciBpdGVtczogQXJyYXk8SXRlbVZhbHVlPiA9IFtdO1xuICAgIEl0ZW1WYWx1ZS5zZXR1cEFycmF5KGl0ZW1zLCBsb2NPd25lcik7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0dXBBcnJheShcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBsb2NPd25lcjogSUxvY2FsaXphYmxlT3duZXJcbiAgKSB7XG4gICAgaXRlbXMucHVzaCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHZhbHVlLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaXRlbXMudW5zaGlmdCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUudW5zaGlmdC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHZhbHVlLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaXRlbXMuc3BsaWNlID0gZnVuY3Rpb24oXG4gICAgICBzdGFydD86IG51bWJlcixcbiAgICAgIGRlbGV0ZUNvdW50PzogbnVtYmVyLFxuICAgICAgLi4uaXRlbXM6IEl0ZW1WYWx1ZVtdXG4gICAgKTogSXRlbVZhbHVlW10ge1xuICAgICAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGRlbGV0ZUNvdW50LFxuICAgICAgICAuLi5pdGVtc1xuICAgICAgKTtcbiAgICAgIGlmICghaXRlbXMpIGl0ZW1zID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZW1zW2ldLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXREYXRhKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCB2YWx1ZXM6IEFycmF5PGFueT4pIHtcbiAgICBpdGVtcy5sZW5ndGggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgICB2YXIgaXRlbTogSXRlbVZhbHVlO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5nZXRUeXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaXRlbSA9IFNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3ModmFsdWUuZ2V0VHlwZSgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0gPSBuZXcgSXRlbVZhbHVlKG51bGwpO1xuICAgICAgfVxuICAgICAgaXRlbS5zZXREYXRhKHZhbHVlKTtcbiAgICAgIGlmICghIXZhbHVlLm9yaWdpbmFsSXRlbSkge1xuICAgICAgICBpdGVtLm9yaWdpbmFsSXRlbSA9IHZhbHVlLm9yaWdpbmFsSXRlbTtcbiAgICAgIH1cbiAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0RGF0YShpdGVtczogQXJyYXk8SXRlbVZhbHVlPik6IGFueSB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW1zW2ldLmdldERhdGEoKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRJdGVtQnlWYWx1ZShpdGVtczogQXJyYXk8SXRlbVZhbHVlPiwgdmFsOiBhbnkpOiBJdGVtVmFsdWUge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShpdGVtcykpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHZhbElzRW1wdHkgPSBIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWwpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWxJc0VtcHR5ICYmIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KGl0ZW1zW2ldLnZhbHVlKSkgcmV0dXJuIGl0ZW1zW2ldO1xuICAgICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhpdGVtc1tpXS52YWx1ZSwgdmFsKSkgcmV0dXJuIGl0ZW1zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldFRleHRPckh0bWxCeVZhbHVlKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHZhbDogYW55XG4gICk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUoaXRlbXMsIHZhbCk7XG4gICAgcmV0dXJuIGl0ZW0gIT09IG51bGwgPyBpdGVtLmxvY1RleHQudGV4dE9ySHRtbCA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBsb2NTdHJzQ2hhbmdlZChpdGVtczogQXJyYXk8SXRlbVZhbHVlPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW1zW2ldLmxvY1RleHQuc3RyQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIHJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBmaWx0ZXJlZEl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHJ1bm5lcjogQ29uZGl0aW9uUnVubmVyLFxuICAgIHZhbHVlczogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueSxcbiAgICB1c2VJdGVtRXhwcmVzc2lvbjogYm9vbGVhbiA9IHRydWVcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5ydW5Db25kaXRpb25zRm9ySXRlbXNDb3JlKFxuICAgICAgaXRlbXMsXG4gICAgICBmaWx0ZXJlZEl0ZW1zLFxuICAgICAgcnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIHRydWUsXG4gICAgICB1c2VJdGVtRXhwcmVzc2lvblxuICAgICk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBydW5FbmFibGVkQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHJ1bm5lcjogQ29uZGl0aW9uUnVubmVyLFxuICAgIHZhbHVlczogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueSxcbiAgICBvbkl0ZW1DYWxsQmFjaz86IChpdGVtOiBJdGVtVmFsdWUpID0+IGJvb2xlYW5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5ydW5Db25kaXRpb25zRm9ySXRlbXNDb3JlKFxuICAgICAgaXRlbXMsXG4gICAgICBudWxsLFxuICAgICAgcnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIGZhbHNlLFxuICAgICAgdHJ1ZSxcbiAgICAgIG9uSXRlbUNhbGxCYWNrXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHN0YXRpYyBydW5Db25kaXRpb25zRm9ySXRlbXNDb3JlKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIGZpbHRlcmVkSXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgcnVubmVyOiBDb25kaXRpb25SdW5uZXIsXG4gICAgdmFsdWVzOiBhbnksXG4gICAgcHJvcGVydGllczogYW55LFxuICAgIGlzVmlzaWJsZTogYm9vbGVhbixcbiAgICB1c2VJdGVtRXhwcmVzc2lvbjogYm9vbGVhbiA9IHRydWUsXG4gICAgb25JdGVtQ2FsbEJhY2s/OiAoaXRlbTogSXRlbVZhbHVlKSA9PiBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICB2YWx1ZXMgPSB7fTtcbiAgICB9XG4gICAgdmFyIGl0ZW1WYWx1ZSA9IHZhbHVlc1tcIml0ZW1cIl07XG4gICAgdmFyIGNob2ljZVZhbHVlID0gdmFsdWVzW1wiY2hvaWNlXCJdO1xuICAgIHZhciBoYXNDaGFuZGVkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgIHZhbHVlc1tcIml0ZW1cIl0gPSBpdGVtLnZhbHVlO1xuICAgICAgdmFsdWVzW1wiY2hvaWNlXCJdID0gaXRlbS52YWx1ZTtcbiAgICAgIHZhciBpdGVtUnVubmVyID1cbiAgICAgICAgdXNlSXRlbUV4cHJlc3Npb24gJiYgISFpdGVtLmdldENvbmRpdGlvblJ1bm5lclxuICAgICAgICAgID8gaXRlbS5nZXRDb25kaXRpb25SdW5uZXIoaXNWaXNpYmxlKVxuICAgICAgICAgIDogZmFsc2U7XG4gICAgICBpZiAoIWl0ZW1SdW5uZXIpIHtcbiAgICAgICAgaXRlbVJ1bm5lciA9IHJ1bm5lcjtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRydWU7XG4gICAgICBpZiAoaXRlbVJ1bm5lcikge1xuICAgICAgICBuZXdWYWx1ZSA9IGl0ZW1SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgICB9XG4gICAgICBpZiAobmV3VmFsdWUgJiYgISFvbkl0ZW1DYWxsQmFjaykge1xuICAgICAgICBuZXdWYWx1ZSA9IG9uSXRlbUNhbGxCYWNrKGl0ZW0pO1xuICAgICAgfVxuICAgICAgaWYgKCEhZmlsdGVyZWRJdGVtcyAmJiBuZXdWYWx1ZSkge1xuICAgICAgICBmaWx0ZXJlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgICB2YXIgb2xkVmFsdWUgPSBpc1Zpc2libGUgPyBpdGVtLmlzVmlzaWJsZSA6IGl0ZW0uaXNFbmFibGVkO1xuICAgICAgaWYgKG5ld1ZhbHVlICE9IG9sZFZhbHVlKSB7XG4gICAgICAgIGhhc0NoYW5kZWQgPSB0cnVlO1xuICAgICAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICAgICAgaWYgKCEhaXRlbS5zZXRJc1Zpc2libGUpIGl0ZW0uc2V0SXNWaXNpYmxlKG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoISFpdGVtLnNldElzRW5hYmxlZCkgaXRlbS5zZXRJc0VuYWJsZWQobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdGVtVmFsdWUpIHtcbiAgICAgIHZhbHVlc1tcIml0ZW1cIl0gPSBpdGVtVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZXNbXCJpdGVtXCJdO1xuICAgIH1cbiAgICBpZiAoY2hvaWNlVmFsdWUpIHtcbiAgICAgIHZhbHVlc1tcImNob2ljZVwiXSA9IGNob2ljZVZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVzW1wiY2hvaWNlXCJdO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmRlZDtcbiAgfVxuICBwdWJsaWMgb3duZXJQcm9wZXJ0eU5hbWU6IHN0cmluZyA9IFwiXCI7XG4gIC8vcHJpdmF0ZSBpdGVtVmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBsb2NUZXh0VmFsdWU6IExvY2FsaXphYmxlU3RyaW5nO1xuICBwcml2YXRlIGlzVmlzaWJsZVZhbHVlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSB2aXNpYmxlQ29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHByaXZhdGUgZW5hYmxlQ29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdmFsdWU6IGFueSxcbiAgICB0ZXh0OiBzdHJpbmcgPSBudWxsLFxuICAgIHByb3RlY3RlZCB0eXBlTmFtZSA9IFwiaXRlbXZhbHVlXCJcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxvY1RleHRWYWx1ZSA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhudWxsLCB0cnVlKTtcbiAgICB0aGlzLmxvY1RleHRWYWx1ZS5vblN0ckNoYW5nZWQgPSAob2xkVmFsdWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKG5ld1ZhbHVlID09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgbmV3VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKFwidGV4dFwiLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5sb2NUZXh0VmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSAodHh0KSA9PiB7XG4gICAgICByZXR1cm4gdHh0XG4gICAgICAgID8gdHh0XG4gICAgICAgIDogIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpXG4gICAgICAgID8gdGhpcy52YWx1ZS50b1N0cmluZygpXG4gICAgICAgIDogbnVsbDtcbiAgICB9O1xuICAgIGlmICh0ZXh0KSB0aGlzLmxvY1RleHQudGV4dCA9IHRleHQ7XG4gICAgaWYgKCEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLnNldERhdGEodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldFR5cGUoKSAhPSBcIml0ZW12YWx1ZVwiKSB7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzKHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNyZWF0aW5nKCk6IGFueSB7fVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMudHlwZU5hbWUgPyB0aGlzLnR5cGVOYW1lIDogXCJpdGVtdmFsdWVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0U3VydmV5KGxpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IElTdXJ2ZXkge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgJiYgISEoPGFueT50aGlzLmxvY093bmVyKVtcImdldFN1cnZleVwiXVxuICAgICAgPyAoPGFueT50aGlzLmxvY093bmVyKS5nZXRTdXJ2ZXkoKVxuICAgICAgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMubG9jVGV4dCAmJiB0aGlzLmxvY1RleHQubG9jYWxlKSB8fCBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dFZhbHVlO1xuICB9XG4gIHNldExvY1RleHQobG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcpIHtcbiAgICB0aGlzLmxvY1RleHRWYWx1ZSA9IGxvY1RleHQ7XG4gIH1cbiAgcHVibGljIGdldCBsb2NPd25lcigpOiBJTG9jYWxpemFibGVPd25lciB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dC5vd25lcjtcbiAgfVxuICBwdWJsaWMgc2V0IGxvY093bmVyKHZhbHVlOiBJTG9jYWxpemFibGVPd25lcikge1xuICAgIHRoaXMubG9jVGV4dC5vd25lciA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdmFyIHRleHQ6IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KG5ld1ZhbHVlKSkge1xuICAgICAgdmFyIHN0cjogc3RyaW5nID0gbmV3VmFsdWUudG9TdHJpbmcoKTtcbiAgICAgIHZhciBpbmRleCA9IHN0ci5pbmRleE9mKHNldHRpbmdzLml0ZW1WYWx1ZVNlcGFyYXRvcik7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHN0ci5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIHRleHQgPSBzdHIuc2xpY2UoaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIiwgbmV3VmFsdWUpO1xuICAgIGlmICghIXRleHQpIHtcbiAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaGFzVGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0LnB1cmVUZXh0ID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgcHVyZVRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0LnB1cmVUZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgcHVyZVRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRleHQgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dC5jYWxjdWxhdGVkVGV4dDsgLy9UT0RPOiBpdCB3aWxsIGJlIGNvcnJlY3QgdG8gdXNlIHRoaXMubG9jVGV4dC50ZXh0LCBob3dldmVyIGl0IHdvdWxkIHJlcXVpcmUgYSBsb3Qgb2YgcmV3cml0aW5nIGluIENyZWF0b3JcbiAgfVxuICBwdWJsaWMgc2V0IHRleHQobmV3VGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2NUZXh0LnRleHQgPSBuZXdUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgY2FsY3VsYXRlZFRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dC5jYWxjdWxhdGVkVGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0RGF0YSgpOiBhbnkge1xuICAgIHZhciBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICBpZiAoISFqc29uW1widmFsdWVcIl0gJiYgISFqc29uW1widmFsdWVcIl1bXCJwb3NcIl0pIHtcbiAgICAgIGRlbGV0ZSBqc29uW1widmFsdWVcIl1bXCJwb3NcIl07XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhqc29uKS5sZW5ndGggPT0gMSAmJiAhSGVscGVycy5pc1ZhbHVlRW1wdHkoanNvbltcInZhbHVlXCJdKSlcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIHJldHVybiBqc29uO1xuICB9XG4gIHB1YmxpYyB0b0pTT04oKTogYW55IHtcbiAgICB2YXIgcmVzID0ge307XG4gICAgdmFyIHByb3BlcnRpZXMgPSBTZXJpYWxpemVyLmdldFByb3BlcnRpZXModGhpcy5nZXRUeXBlKCkpO1xuICAgIGlmICghcHJvcGVydGllcyB8fCBwcm9wZXJ0aWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBwcm9wZXJ0aWVzID0gU2VyaWFsaXplci5nZXRQcm9wZXJ0aWVzKFwiaXRlbXZhbHVlXCIpO1xuICAgIH1cbiAgICB2YXIganNvT2JqID0gbmV3IEpzb25PYmplY3QoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGpzb09iai52YWx1ZVRvSnNvbih0aGlzLCByZXMsIHByb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBzZXREYXRhKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiB2YWx1ZS52YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdmFyIGpzb24gPSB2YWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUudG9KU09OID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAganNvbiA9ICg8QmFzZT52YWx1ZSkudG9KU09OKCk7XG4gICAgICB9XG4gICAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHRoaXMubG9jVGV4dC5zdHJDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBlbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1Zpc2libGVWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0SXNWaXNpYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNWaXNpYmxlVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBpc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzRW5hYmxlZFwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0SXNFbmFibGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzRW5hYmxlZFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBhZGRVc2VkTG9jYWxlcyhsb2NhbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5BZGRMb2NTdHJpbmdUb1VzZWRMb2NhbGVzKHRoaXMubG9jVGV4dFZhbHVlLCBsb2NhbGVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAobmFtZSA9PT0gXCJ2YWx1ZVwiICYmICF0aGlzLmhhc1RleHQpIHtcbiAgICAgIHRoaXMubG9jVGV4dC5vbkNoYW5nZWQoKTtcbiAgICB9XG4gICAgdmFyIGZ1bmNOYW1lID0gXCJpdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWRcIjtcbiAgICBpZiAoIXRoaXMubG9jT3duZXIgfHwgISg8YW55PnRoaXMubG9jT3duZXIpW2Z1bmNOYW1lXSkgcmV0dXJuO1xuICAgICg8YW55PnRoaXMubG9jT3duZXIpW2Z1bmNOYW1lXSh0aGlzLCBuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb25kaXRpb25SdW5uZXIoaXNWaXNpYmxlOiBib29sZWFuKSB7XG4gICAgaWYgKGlzVmlzaWJsZSkgcmV0dXJuIHRoaXMuZ2V0VmlzaWJsZUNvbmRpdGlvblJ1bm5lcigpO1xuICAgIHJldHVybiB0aGlzLmdldEVuYWJsZUNvbmRpdGlvblJ1bm5lcigpO1xuICB9XG4gIHByaXZhdGUgZ2V0VmlzaWJsZUNvbmRpdGlvblJ1bm5lcigpOiBDb25kaXRpb25SdW5uZXIge1xuICAgIGlmICghdGhpcy52aXNpYmxlSWYpIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyKVxuICAgICAgdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnZpc2libGVJZik7XG4gICAgdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLnZpc2libGVJZjtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyO1xuICB9XG4gIHByaXZhdGUgZ2V0RW5hYmxlQ29uZGl0aW9uUnVubmVyKCk6IENvbmRpdGlvblJ1bm5lciB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUlmKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMuZW5hYmxlQ29uZGl0aW9uUnVubmVyKVxuICAgICAgdGhpcy5lbmFibGVDb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZW5hYmxlSWYpO1xuICAgIHRoaXMuZW5hYmxlQ29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmVuYWJsZUlmO1xuICAgIHJldHVybiB0aGlzLmVuYWJsZUNvbmRpdGlvblJ1bm5lcjtcbiAgfVxuICBwdWJsaWMgb3JpZ2luYWxJdGVtOiBhbnk7XG59XG5cbkJhc2UuY3JlYXRlSXRlbVZhbHVlID0gZnVuY3Rpb24oc291cmNlOiBhbnksIHR5cGU/OiBzdHJpbmcpOiBhbnkge1xuICB2YXIgaXRlbSA9IG51bGw7XG4gIGlmICghIXR5cGUpIHtcbiAgICBpdGVtID0gSnNvbk9iamVjdC5tZXRhRGF0YS5jcmVhdGVDbGFzcyh0eXBlLCB7fSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZS5nZXRUeXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBpdGVtID0gbmV3IEl0ZW1WYWx1ZShudWxsLCB1bmRlZmluZWQsIHNvdXJjZS5nZXRUeXBlKCkpO1xuICB9IGVsc2Uge1xuICAgIGl0ZW0gPSBuZXcgSXRlbVZhbHVlKG51bGwpO1xuICB9XG4gIGl0ZW0uc2V0RGF0YShzb3VyY2UpO1xuICByZXR1cm4gaXRlbTtcbn07XG5CYXNlLml0ZW1WYWx1ZUxvY1N0ckNoYW5nZWQgPSBmdW5jdGlvbihhcnI6IEFycmF5PGFueT4pOiB2b2lkIHtcbiAgSXRlbVZhbHVlLmxvY1N0cnNDaGFuZ2VkKGFycik7XG59O1xuSnNvbk9iamVjdFByb3BlcnR5LmdldEl0ZW1WYWx1ZXNEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbih2YWw6IGFueSk6IGFueSB7XG4gIHZhciByZXMgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xuICBJdGVtVmFsdWUuc2V0RGF0YShyZXMsIHZhbCB8fCBbXSk7XG4gIHJldHVybiByZXM7XG59O1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIml0ZW12YWx1ZVwiLFxuICBbXG4gICAgXCIhdmFsdWVcIixcbiAgICB7XG4gICAgICBuYW1lOiBcInRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZXh0XCIsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidmlzaWJsZUlmOmNvbmRpdGlvblwiLCBzaG93TW9kZTogXCJmb3JtXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImVuYWJsZUlmOmNvbmRpdGlvblwiLFxuICAgICAgc2hvd01vZGU6IFwiZm9ybVwiLFxuICAgICAgdmlzaWJsZUlmOiAob2JqOiBJdGVtVmFsdWUpOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuICFvYmogfHwgb2JqLm93bmVyUHJvcGVydHlOYW1lICE9PSBcInJhdGVWYWx1ZXNcIjtcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgKHZhbHVlOiBhbnkpID0+IG5ldyBJdGVtVmFsdWUodmFsdWUpXG4pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSGVscGVycywgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wZXJ0eURlY29yYXRvck9wdGlvbnMge1xuICBkZWZhdWx0VmFsdWU/OiBhbnk7XG4gIGRlZmF1bHRTb3VyY2U/OiBzdHJpbmc7XG4gIGxvY2FsaXphYmxlPzpcbiAgICB8IHsgbmFtZTogc3RyaW5nOyBvbkdldFRleHRDYWxsYmFjaz86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nIH1cbiAgICB8IGJvb2xlYW47XG4gIG9uU2V0PzogKHZhbDogYW55LCB0YXJnZXQ6IGFueSkgPT4gdm9pZDtcbn1cblxuZnVuY3Rpb24gZW5zdXJlTG9jU3RyaW5nKFxuICB0YXJnZXQ6IGFueSxcbiAgb3B0aW9uczogSVByb3BlcnR5RGVjb3JhdG9yT3B0aW9ucyxcbiAga2V5OiBzdHJpbmdcbikge1xuICBsZXQgbG9jU3RyaW5nID0gdGFyZ2V0LmdldExvY2FsaXphYmxlU3RyaW5nKGtleSk7XG4gIGlmICghbG9jU3RyaW5nKSB7XG4gICAgbG9jU3RyaW5nID0gdGFyZ2V0LmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKGtleSwgdGFyZ2V0LCB0cnVlKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygb3B0aW9ucy5sb2NhbGl6YWJsZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdHlwZW9mIG9wdGlvbnMubG9jYWxpemFibGUub25HZXRUZXh0Q2FsbGJhY2sgPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgbG9jU3RyaW5nLm9uR2V0VGV4dENhbGxiYWNrID0gb3B0aW9ucy5sb2NhbGl6YWJsZS5vbkdldFRleHRDYWxsYmFjaztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5KG9wdGlvbnM/OiBJUHJvcGVydHlEZWNvcmF0b3JPcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbih0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubG9jYWxpemFibGUpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGtleSk7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoISFvcHRpb25zKSB7XG4gICAgICAgICAgICBpZihvcHRpb25zLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKG9wdGlvbnMuZGVmYXVsdFNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzW29wdGlvbnMuZGVmYXVsdFNvdXJjZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24odmFsOiBhbnkpIHtcbiAgICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoa2V5LCB2YWwpO1xuICAgICAgICAgIGlmICghIW9wdGlvbnMgJiYgb3B0aW9ucy5vblNldCkge1xuICAgICAgICAgICAgb3B0aW9ucy5vblNldCh2YWwsIHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbnN1cmVMb2NTdHJpbmcodGhpcywgb3B0aW9ucywga2V5KTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoa2V5KSB8fFxuICAgICAgICAgICAgb3B0aW9ucy5kZWZhdWx0VmFsdWUgfHxcbiAgICAgICAgICAgIHRoaXNbb3B0aW9ucy5kZWZhdWx0U291cmNlXVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24odmFsOiBhbnkpIHtcbiAgICAgICAgICBlbnN1cmVMb2NTdHJpbmcodGhpcywgb3B0aW9ucywga2V5KTtcbiAgICAgICAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChrZXksIHZhbCk7XG4gICAgICAgICAgaWYgKCEhb3B0aW9ucyAmJiBvcHRpb25zLm9uU2V0KSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uU2V0KHZhbCwgdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgb3B0aW9ucy5sb2NhbGl6YWJsZSA9PT0gdHJ1ZVxuICAgICAgICAgID8gXCJsb2NcIiArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKVxuICAgICAgICAgIDogb3B0aW9ucy5sb2NhbGl6YWJsZS5uYW1lLFxuICAgICAgICB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGVuc3VyZUxvY1N0cmluZyh0aGlzLCBvcHRpb25zLCBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoa2V5KTtcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQXJyYXlQcm9wZXJ0eURlY29yYXRvck9wdGlvbnMge1xuICBvblB1c2g/OiBhbnk7XG4gIG9uUmVtb3ZlPzogYW55O1xuICBvblNldD86ICh2YWw6IGFueSwgdGFyZ2V0OiBhbnkpID0+IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZUFycmF5KFxuICB0YXJnZXQ6IGFueSxcbiAgb3B0aW9uczogSUFycmF5UHJvcGVydHlEZWNvcmF0b3JPcHRpb25zLFxuICBrZXk6IHN0cmluZ1xuKSB7XG4gIHRhcmdldC5lbnN1cmVBcnJheShcbiAgICBrZXksXG4gICAgISFvcHRpb25zID8gb3B0aW9ucy5vblB1c2ggOiBudWxsLFxuICAgICEhb3B0aW9ucyA/IG9wdGlvbnMub25SZW1vdmUgOiBudWxsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eUFycmF5KG9wdGlvbnM/OiBJQXJyYXlQcm9wZXJ0eURlY29yYXRvck9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRhcmdldDogYW55LCBrZXk6IHN0cmluZykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgZW5zdXJlQXJyYXkodGhpcywgb3B0aW9ucywga2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShrZXkpO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsOiBhbnkpIHtcbiAgICAgICAgZW5zdXJlQXJyYXkodGhpcywgb3B0aW9ucywga2V5KTtcbiAgICAgICAgY29uc3QgYXJyID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGtleSk7XG4gICAgICAgIGlmICh2YWwgPT09IGFycikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJyKSB7XG4gICAgICAgICAgYXJyLnNwbGljZSgwLCBhcnIubGVuZ3RoLCAuLi4odmFsIHx8IFtdKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKGtleSwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISFvcHRpb25zICYmIG9wdGlvbnMub25TZXQpIHtcbiAgICAgICAgICBvcHRpb25zLm9uU2V0KHZhbCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9iamVjdCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb3BlcnR5IG9mIGEgc3VydmV5IGVsZW1lbnQgKHBhZ2UsIHBhbmVsLCBxdWVzdGlvbnMsIGFuZCBldGMpLlxuICogQHNlZSBhZGRQcm9wZXJ0eVxuICogQHNlZSByZW1vdmVQcm9wZXJ0eVxuICogQHNlZSBbQWRkIFByb3BlcnRpZXNdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9TdXJ2ZXktQ3JlYXRvciNhZGRwcm9wZXJ0aWVzKVxuICogQHNlZSBbUmVtb3ZlIFByb3BlcnRpZXNdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9TdXJ2ZXktQ3JlYXRvciNyZW1vdmVwcm9wZXJ0aWVzKVxuICovXG5leHBvcnQgY2xhc3MgSnNvbk9iamVjdFByb3BlcnR5IGltcGxlbWVudHMgSU9iamVjdCB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0SXRlbVZhbHVlc0RlZmF1bHRWYWx1ZTogKHZhbDogYW55KSA9PiBhbnk7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgcHJpdmF0ZSBzdGF0aWMgSW5kZXggPSAxO1xuICBwcml2YXRlIHN0YXRpYyBtZXJnYWJsZVZhbHVlcyA9IFtcbiAgICBcInR5cGVWYWx1ZVwiLFxuICAgIFwiY2hvaWNlc1ZhbHVlXCIsXG4gICAgXCJiYXNlVmFsdWVcIixcbiAgICBcInJlYWRPbmx5VmFsdWVcIixcbiAgICBcInZpc2libGVWYWx1ZVwiLFxuICAgIFwiaXNTZXJpYWxpemFibGVcIixcbiAgICBcImlzTGlnaHRTZXJpYWxpemFibGVcIixcbiAgICBcImlzQ3VzdG9tXCIsXG4gICAgXCJpc0JpbmRhYmxlXCIsXG4gICAgXCJpc1VuaXF1ZVwiLFxuICAgIFwiaXNEeW5hbWljQ2hvaWNlc1wiLFxuICAgIFwiaXNMb2NhbGl6YWJsZVZhbHVlXCIsXG4gICAgXCJjbGFzc05hbWVcIixcbiAgICBcImFsdGVybmF0aXZlTmFtZVwiLFxuICAgIFwibGF5b3V0XCIsXG4gICAgXCJjbGFzc05hbWVQYXJ0XCIsXG4gICAgXCJiYXNlQ2xhc3NOYW1lXCIsXG4gICAgXCJkZWZhdWx0VmFsdWVcIixcbiAgICBcInNlcmlhbGl6YXRpb25Qcm9wZXJ0eVwiLFxuICAgIFwib25HZXRWYWx1ZVwiLFxuICAgIFwib25TZXRWYWx1ZVwiLFxuICAgIFwiZGlzcGxheU5hbWVcIixcbiAgICBcImNhdGVnb3J5XCIsXG4gICAgXCJjYXRlZ29yeUluZGV4XCIsXG4gICAgXCJ2aXNpYmxlSW5kZXhcIixcbiAgICBcIm5leHRUb1Byb3BlcnR5XCIsXG4gICAgXCJzaG93TW9kZVwiLFxuICAgIFwiZGVwZW5kZWRQcm9wZXJ0aWVzXCIsXG4gICAgXCJ2aXNpYmxlSWZcIixcbiAgICBcIm9uUHJvcGVydHlFZGl0b3JVcGRhdGVcIixcbiAgICBcIm1heExlbmd0aFwiLFxuICAgIFwibWF4VmFsdWVcIixcbiAgICBcIm1pblZhbHVlXCIsXG4gICAgXCJkYXRhTGlzdFZhbHVlXCIsXG4gIF07XG4gIHByaXZhdGUgaWRWYWx1ZTogbnVtYmVyO1xuICBwcml2YXRlIGNsYXNzSW5mb1ZhbHVlOiBKc29uTWV0YWRhdGFDbGFzcztcbiAgcHJpdmF0ZSB0eXBlVmFsdWU6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgY2hvaWNlc1ZhbHVlOiBBcnJheTxhbnk+ID0gbnVsbDtcbiAgcHJpdmF0ZSBiYXNlVmFsdWU6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgaXNSZXF1aXJlZFZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgaXNVbmlxdWVWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRPbmx5VmFsdWU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2aXNpYmxlVmFsdWU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpc0xvY2FsaXphYmxlVmFsdWU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjaG9pY2VzZnVuYzogKG9iajogYW55LCBjaG9pY2VzQ2FsbGJhY2s6IGFueSkgPT4gQXJyYXk8YW55PiA9IG51bGw7XG4gIHByaXZhdGUgZGVwZW5kZWRQcm9wZXJ0aWVzOiBBcnJheTxzdHJpbmc+ID0gbnVsbDtcbiAgcHVibGljIGlzU2VyaWFsaXphYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGlzTGlnaHRTZXJpYWxpemFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgaXNDdXN0b206IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGlzRHluYW1pY0Nob2ljZXM6IGJvb2xlYW4gPSBmYWxzZTsgLy9UT0RPIG9ic29sZXRlLCB1c2UgZGVwZW5kc09uIGF0dHJpYnV0ZVxuICBwdWJsaWMgaXNCaW5kYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgY2xhc3NOYW1lOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgYWx0ZXJuYXRpdmVOYW1lOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgY2xhc3NOYW1lUGFydDogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBkZWZhdWx0VmFsdWVWYWx1ZTogYW55ID0gbnVsbDtcbiAgcHVibGljIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIGRpc3BsYXlOYW1lOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgY2F0ZWdvcnk6IHN0cmluZyA9IFwiXCI7XG4gIHB1YmxpYyBjYXRlZ29yeUluZGV4OiBudW1iZXIgPSAtMTtcbiAgcHVibGljIHZpc2libGVJbmRleDogbnVtYmVyID0gLTE7XG4gIHB1YmxpYyBuZXh0VG9Qcm9wZXJ0eTogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIHNob3dNb2RlOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgbWF4TGVuZ3RoOiBudW1iZXIgPSAtMTtcbiAgcHVibGljIG1heFZhbHVlOiBhbnk7XG4gIHB1YmxpYyBtaW5WYWx1ZTogYW55O1xuICBwcml2YXRlIGRhdGFMaXN0VmFsdWU6IEFycmF5PHN0cmluZz47XG4gIHB1YmxpYyBsYXlvdXQ6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBvbkdldFZhbHVlOiAob2JqOiBhbnkpID0+IGFueSA9IG51bGw7XG4gIHB1YmxpYyBvblNldFZhbHVlOiAob2JqOiBhbnksIHZhbHVlOiBhbnksIGpzb25Db252OiBKc29uT2JqZWN0KSA9PiBhbnkgPSBudWxsO1xuICBwdWJsaWMgdmlzaWJsZUlmOiAob2JqOiBhbnkpID0+IGJvb2xlYW4gPSBudWxsO1xuICBwdWJsaWMgb25Qcm9wZXJ0eUVkaXRvclVwZGF0ZTogKG9iajogYW55LCBwcm9wRWRpdG9yOiBhbnkpID0+IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGFzc0luZm86IEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICAgaXNSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuY2xhc3NJbmZvVmFsdWUgPSBjbGFzc0luZm87XG4gICAgdGhpcy5pc1JlcXVpcmVkVmFsdWUgPSBpc1JlcXVpcmVkO1xuICAgIHRoaXMuaWRWYWx1ZSA9IEpzb25PYmplY3RQcm9wZXJ0eS5JbmRleCsrO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pZFZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgY2xhc3NJbmZvKCk6IEpzb25NZXRhZGF0YUNsYXNzIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc0luZm9WYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50eXBlVmFsdWUgPyB0aGlzLnR5cGVWYWx1ZSA6IFwic3RyaW5nXCI7XG4gIH1cbiAgcHVibGljIHNldCB0eXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT09IFwiaXRlbXZhbHVlc1wiKSB2YWx1ZSA9IFwiaXRlbXZhbHVlW11cIjtcbiAgICB0aGlzLnR5cGVWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLnR5cGVWYWx1ZS5pbmRleE9mKFwiW11cIikgPT09IHRoaXMudHlwZVZhbHVlLmxlbmd0aCAtIDIpIHtcbiAgICAgIHRoaXMuaXNBcnJheSA9IHRydWU7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9IHRoaXMudHlwZVZhbHVlLnN1YnN0cigwLCB0aGlzLnR5cGVWYWx1ZS5sZW5ndGggLSAyKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGlzQXJyYXkgPSBmYWxzZTtcbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1JlcXVpcmVkVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBpc1VuaXF1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1VuaXF1ZVZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNVbmlxdWUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1VuaXF1ZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVG9Vc2VHZXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vbkdldFZhbHVlIHx8IHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5O1xuICB9XG4gIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlKCkge1xuICAgIHZhciByZXN1bHQ6IGFueSA9IHRoaXMuZGVmYXVsdFZhbHVlVmFsdWU7XG4gICAgaWYgKFxuICAgICAgISFKc29uT2JqZWN0UHJvcGVydHkuZ2V0SXRlbVZhbHVlc0RlZmF1bHRWYWx1ZSAmJlxuICAgICAgSnNvbk9iamVjdC5tZXRhRGF0YS5pc0Rlc2NlbmRhbnRPZih0aGlzLmNsYXNzTmFtZSwgXCJpdGVtdmFsdWVcIilcbiAgICApIHtcbiAgICAgIHJlc3VsdCA9IEpzb25PYmplY3RQcm9wZXJ0eS5nZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlKFxuICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZVZhbHVlIHx8IFtdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWVWYWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBpc0RlZmF1bHRWYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRWYWx1ZSkpXG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWUgPT0gdmFsdWU7XG4gICAgcmV0dXJuIChcbiAgICAgICh2YWx1ZSA9PT0gZmFsc2UgJiYgKHRoaXMudHlwZSA9PSBcImJvb2xlYW5cIiB8fCB0aGlzLnR5cGUgPT0gXCJzd2l0Y2hcIikpIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJcIiB8fFxuICAgICAgSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUob2JqOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLm9uR2V0VmFsdWUpIHJldHVybiB0aGlzLm9uR2V0VmFsdWUob2JqKTtcbiAgICBpZiAodGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHkgJiYgISFvYmpbdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHldKVxuICAgICAgcmV0dXJuIG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0uZ2V0SnNvbigpO1xuICAgIHJldHVybiBvYmpbdGhpcy5uYW1lXTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydHlWYWx1ZShvYmo6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNMb2NhbGl6YWJsZSkge1xuICAgICAgcmV0dXJuICEhb2JqW3RoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5XVxuICAgICAgICA/IG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0udGV4dFxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKG9iaik7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUb1VzZVNldFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLm9uU2V0VmFsdWUgfHwgdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHk7XG4gIH1cbiAgcHVibGljIHNldFZhbHVlKG9iajogYW55LCB2YWx1ZTogYW55LCBqc29uQ29udjogSnNvbk9iamVjdCkge1xuICAgIGlmICh0aGlzLm9uU2V0VmFsdWUpIHtcbiAgICAgIHRoaXMub25TZXRWYWx1ZShvYmosIHZhbHVlLCBqc29uQ29udik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSAmJiAhIW9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0pXG4gICAgICAgIG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0uc2V0SnNvbih2YWx1ZSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gXCJib29sZWFuXCIgfHwgdGhpcy50eXBlID09IFwic3dpdGNoXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9ialt0aGlzLm5hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRPYmpUeXBlKG9ialR5cGU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jbGFzc05hbWVQYXJ0KSByZXR1cm4gb2JqVHlwZTtcbiAgICByZXR1cm4gb2JqVHlwZS5yZXBsYWNlKHRoaXMuY2xhc3NOYW1lUGFydCwgXCJcIik7XG4gIH1cbiAgcHVibGljIGdldENsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGNsYXNzTmFtZSkgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NOYW1lUGFydCAmJiBjbGFzc05hbWUuaW5kZXhPZih0aGlzLmNsYXNzTmFtZVBhcnQpIDwgMFxuICAgICAgPyBjbGFzc05hbWUgKyB0aGlzLmNsYXNzTmFtZVBhcnRcbiAgICAgIDogY2xhc3NOYW1lO1xuICB9XG4gIC8qKlxuICAgKiBEZXByaWNhdGVkLCBwbGVhc2UgdXNlIGdldENob2ljZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDaG9pY2VzKG51bGwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzQ2hvaWNlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNob2ljZXNWYWx1ZSB8fCAhIXRoaXMuY2hvaWNlc2Z1bmM7XG4gIH1cbiAgcHVibGljIGdldENob2ljZXMob2JqOiBhbnksIGNob2ljZXNDYWxsYmFjazogYW55ID0gbnVsbCk6IEFycmF5PGFueT4ge1xuICAgIGlmICh0aGlzLmNob2ljZXNWYWx1ZSAhPSBudWxsKSByZXR1cm4gdGhpcy5jaG9pY2VzVmFsdWU7XG4gICAgaWYgKHRoaXMuY2hvaWNlc2Z1bmMgIT0gbnVsbCkgcmV0dXJuIHRoaXMuY2hvaWNlc2Z1bmMob2JqLCBjaG9pY2VzQ2FsbGJhY2spO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBzZXRDaG9pY2VzKFxuICAgIHZhbHVlOiBBcnJheTxhbnk+LFxuICAgIHZhbHVlRnVuYzogKG9iajogYW55KSA9PiBBcnJheTxhbnk+ID0gbnVsbFxuICApIHtcbiAgICB0aGlzLmNob2ljZXNWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuY2hvaWNlc2Z1bmMgPSB2YWx1ZUZ1bmM7XG4gIH1cbiAgcHVibGljIGdldEJhc2VWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5iYXNlVmFsdWUpIHJldHVybiBcIlwiO1xuICAgIGlmICh0eXBlb2YgdGhpcy5iYXNlVmFsdWUgPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdGhpcy5iYXNlVmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5iYXNlVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldEJhc2VWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuYmFzZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZE9ubHlWYWx1ZSAhPSBudWxsID8gdGhpcy5yZWFkT25seVZhbHVlIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldCByZWFkT25seSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJlYWRPbmx5VmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGlzVmlzaWJsZShsYXlvdXQ6IHN0cmluZywgb2JqOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgbGV0IGlzTGF5b3V0ID0gIXRoaXMubGF5b3V0IHx8IHRoaXMubGF5b3V0ID09IGxheW91dDtcbiAgICBpZiAoIXRoaXMudmlzaWJsZSB8fCAhaXNMYXlvdXQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoISF0aGlzLnZpc2libGVJZiAmJiAhIW9iaikgcmV0dXJuIHRoaXMudmlzaWJsZUlmKG9iaik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVWYWx1ZSAhPSBudWxsID8gdGhpcy52aXNpYmxlVmFsdWUgOiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnZpc2libGVWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzTG9jYWxpemFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2NhbGl6YWJsZVZhbHVlICE9IG51bGwgPyB0aGlzLmlzTG9jYWxpemFibGVWYWx1ZSA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNMb2NhbGl6YWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTG9jYWxpemFibGVWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGRhdGFMaXN0KCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMuZGF0YUxpc3RWYWx1ZSkgPyB0aGlzLmRhdGFMaXN0VmFsdWUgOiBbXTtcbiAgfVxuICBwdWJsaWMgc2V0IGRhdGFMaXN0KHZhbDogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuZGF0YUxpc3RWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgbWVyZ2VXaXRoKHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIHZhciB2YWx1ZXNOYW1lcyA9IEpzb25PYmplY3RQcm9wZXJ0eS5tZXJnYWJsZVZhbHVlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLm1lcmdlVmFsdWUocHJvcCwgdmFsdWVzTmFtZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkRGVwZW5kZWRQcm9wZXJ0eShuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuZGVwZW5kZWRQcm9wZXJ0aWVzKSB7XG4gICAgICB0aGlzLmRlcGVuZGVkUHJvcGVydGllcyA9IFtdO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXBlbmRlZFByb3BlcnRpZXMuaW5kZXhPZihuYW1lKSA8IDApIHtcbiAgICAgIHRoaXMuZGVwZW5kZWRQcm9wZXJ0aWVzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXREZXBlbmRlZFByb3BlcnRpZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuICEhdGhpcy5kZXBlbmRlZFByb3BlcnRpZXMgPyB0aGlzLmRlcGVuZGVkUHJvcGVydGllcyA6IFtdO1xuICB9XG4gIHB1YmxpYyBzY2hlbWFUeXBlKCk6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5jbGFzc05hbWUpIHJldHVybiBcImFycmF5XCI7XG4gICAgaWYgKCEhdGhpcy5iYXNlQ2xhc3NOYW1lKSByZXR1cm4gXCJhcnJheVwiO1xuICAgIGlmICh0aGlzLnR5cGUgPT0gXCJib29sZWFuXCIgfHwgdGhpcy50eXBlID09IFwibnVtYmVyXCIpIHJldHVybiB0aGlzLnR5cGU7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cbiAgcHJpdmF0ZSBtZXJnZVZhbHVlKHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSwgdmFsdWVOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpc1t2YWx1ZU5hbWVdID09IG51bGwgJiYgcHJvcFt2YWx1ZU5hbWVdICE9IG51bGwpIHtcbiAgICAgIHRoaXNbdmFsdWVOYW1lXSA9IHByb3BbdmFsdWVOYW1lXTtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbiB7XG4gIHByaXZhdGUgc3RhdGljIHByb3BlcnRpZXM6IElPYmplY3QgPSB7fTtcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyZW50Q2xhc3NlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBwdWJsaWMgc3RhdGljIGFkZFByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eTogYW55KSB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICBpZiAoIXByb3BzW2NsYXNzTmFtZV0pIHtcbiAgICAgIHByb3BzW2NsYXNzTmFtZV0gPSBbXTtcbiAgICB9XG4gICAgcHJvcHNbY2xhc3NOYW1lXS5wdXNoKHByb3BlcnR5KTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHJlbW92ZVByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgaWYgKCFwcm9wc1tjbGFzc05hbWVdKSByZXR1cm47XG4gICAgdmFyIHByb3BlcnRpZXMgPSBwcm9wc1tjbGFzc05hbWVdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHByb3BlcnRpZXNbaV0ubmFtZSA9PSBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgcHJvcHNbY2xhc3NOYW1lXS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIGFkZENsYXNzKGNsYXNzTmFtZTogc3RyaW5nLCBwYXJlbnRDbGFzc05hbWU6IHN0cmluZykge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChwYXJlbnRDbGFzc05hbWUpIHtcbiAgICAgIHBhcmVudENsYXNzTmFtZSA9IHBhcmVudENsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wYXJlbnRDbGFzc2VzW2NsYXNzTmFtZV0gPSBwYXJlbnRDbGFzc05hbWU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nKTogQXJyYXk8YW55PiB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgd2hpbGUgKGNsYXNzTmFtZSkge1xuICAgICAgdmFyIHByb3BlcnRpZXMgPSBwcm9wc1tjbGFzc05hbWVdO1xuICAgICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzTmFtZSA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnBhcmVudENsYXNzZXNbY2xhc3NOYW1lXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVByb3BlcnRpZXMob2JqOiBhbnkpIHtcbiAgICBpZiAoIW9iaiB8fCAhb2JqLmdldFR5cGUpIHJldHVybjtcbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzQ29yZShvYmosIG9iai5nZXRUeXBlKCkpO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVByb3BlcnRpZXNDb3JlKG9iajogYW55LCBjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgaWYgKHByb3BzW2NsYXNzTmFtZV0pIHtcbiAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXNJbk9iaihvYmosIHByb3BzW2NsYXNzTmFtZV0pO1xuICAgIH1cbiAgICB2YXIgcGFyZW50Q2xhc3MgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wYXJlbnRDbGFzc2VzW2NsYXNzTmFtZV07XG4gICAgaWYgKHBhcmVudENsYXNzKSB7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzQ29yZShvYmosIHBhcmVudENsYXNzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUHJvcGVydGllc0luT2JqKG9iajogYW55LCBwcm9wZXJ0aWVzOiBhbnlbXSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydHlJbk9iaihvYmosIHByb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eUluT2JqKG9iajogYW55LCBwcm9wOiBKc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBpZiAob2JqW3Byb3AubmFtZV0gfHwgb2JqLmhhc093blByb3BlcnR5KHByb3AubmFtZSkpIHJldHVybjtcbiAgICBpZiAoXG4gICAgICBwcm9wLmlzTG9jYWxpemFibGUgJiZcbiAgICAgIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5ICYmXG4gICAgICAhb2JqW3Byb3Auc2VyaWFsaXphdGlvblByb3BlcnR5XSAmJlxuICAgICAgb2JqLmNyZWF0ZUN1c3RvbUxvY2FsaXphYmxlT2JqXG4gICAgKSB7XG4gICAgICBvYmouY3JlYXRlQ3VzdG9tTG9jYWxpemFibGVPYmoocHJvcC5uYW1lKTtcbiAgICAgIHZhciBsb2NEZXNjID0ge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBvYmouZ2V0TG9jYWxpemFibGVTdHJpbmcocHJvcC5uYW1lKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSwgbG9jRGVzYyk7XG4gICAgICB2YXIgZGVzYyA9IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gb2JqLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChwcm9wLm5hbWUsIHByb3AuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbih2OiBhbnkpIHtcbiAgICAgICAgICBvYmouc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KHByb3AubmFtZSwgdik7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcC5uYW1lLCBkZXNjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3AuZGVmYXVsdFZhbHVlO1xuICAgICAgdmFyIGlzQXJyYXlQcm9wID0gZmFsc2U7XG4gICAgICBpZiAodHlwZW9mIG9iai5jcmVhdGVOZXdBcnJheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGlmIChKc29uT2JqZWN0Lm1ldGFEYXRhLmlzRGVzY2VuZGFudE9mKHByb3AuY2xhc3NOYW1lLCBcIml0ZW12YWx1ZVwiKSkge1xuICAgICAgICAgIG9iai5jcmVhdGVOZXdBcnJheShwcm9wLm5hbWUsIGZ1bmN0aW9uKGl0ZW06IGFueSkge1xuICAgICAgICAgICAgaXRlbS5sb2NPd25lciA9IG9iajtcbiAgICAgICAgICAgIGl0ZW0ub3duZXJQcm9wZXJ0eU5hbWUgPSBwcm9wLm5hbWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaXNBcnJheVByb3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vSXQgaXMgYSBzaW1wbGUgYXJyYXkgcHJvcGVydHlcbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJtdWx0aXBsZXZhbHVlc1wiKSB7XG4gICAgICAgICAgb2JqLmNyZWF0ZU5ld0FycmF5KHByb3AubmFtZSk7XG4gICAgICAgICAgaXNBcnJheVByb3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FycmF5UHJvcCkge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgIG9iai5zZXRQcm9wZXJ0eVZhbHVlKHByb3AubmFtZSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdFZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCEhb2JqLmdldFByb3BlcnR5VmFsdWUgJiYgISFvYmouc2V0UHJvcGVydHlWYWx1ZSkge1xuICAgICAgICB2YXIgZGVzYyA9IHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghIXByb3Aub25HZXRWYWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gcHJvcC5vbkdldFZhbHVlKG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqLmdldFByb3BlcnR5VmFsdWUocHJvcC5uYW1lLCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0OiBmdW5jdGlvbih2OiBhbnkpIHtcbiAgICAgICAgICAgIGlmICghIXByb3Aub25TZXRWYWx1ZSkge1xuICAgICAgICAgICAgICBwcm9wLm9uU2V0VmFsdWUob2JqLCB2LCBudWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9iai5zZXRQcm9wZXJ0eVZhbHVlKHByb3AubmFtZSwgdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcC5uYW1lLCBkZXNjKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEpzb25NZXRhZGF0YUNsYXNzIHtcbiAgc3RhdGljIHJlcXVpcmVkU3ltYm9sID0gXCIhXCI7XG4gIHN0YXRpYyB0eXBlU3ltYm9sID0gXCI6XCI7XG4gIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4gPSBudWxsO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM6IEFycmF5PGFueT4sXG4gICAgcHVibGljIGNyZWF0b3I6IChqc29uPzogYW55KSA9PiBhbnkgPSBudWxsLFxuICAgIHB1YmxpYyBwYXJlbnROYW1lOiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHRoaXMucGFyZW50TmFtZSkge1xuICAgICAgdGhpcy5wYXJlbnROYW1lID0gdGhpcy5wYXJlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5hZGRDbGFzcyhuYW1lLCB0aGlzLnBhcmVudE5hbWUpO1xuICAgIH1cbiAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSB0aGlzLmNyZWF0ZVByb3BlcnR5KHByb3BlcnRpZXNbaV0pO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1c2gocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBmaW5kKG5hbWU6IHN0cmluZyk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgY3JlYXRlUHJvcGVydHkocHJvcEluZm86IGFueSk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHR5cGVvZiBwcm9wSW5mbyA9PT0gXCJzdHJpbmdcIiA/IHByb3BJbmZvIDogcHJvcEluZm8ubmFtZTtcbiAgICBpZiAoIXByb3BlcnR5TmFtZSkgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0eVR5cGUgPSBudWxsO1xuICAgIHZhciB0eXBlSW5kZXggPSBwcm9wZXJ0eU5hbWUuaW5kZXhPZihKc29uTWV0YWRhdGFDbGFzcy50eXBlU3ltYm9sKTtcbiAgICBpZiAodHlwZUluZGV4ID4gLTEpIHtcbiAgICAgIHByb3BlcnR5VHlwZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcodHlwZUluZGV4ICsgMSk7XG4gICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIHR5cGVJbmRleCk7XG4gICAgfVxuICAgIHZhciBpc1JlcXVpcmVkID1cbiAgICAgIHRoaXMuZ2V0SXNQcm9wZXJ0eU5hbWVSZXF1aXJlZChwcm9wZXJ0eU5hbWUpIHx8ICEhcHJvcEluZm8uaXNSZXF1aXJlZDtcbiAgICBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpO1xuICAgIHZhciBwcm9wID0gbmV3IEpzb25PYmplY3RQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eU5hbWUsIGlzUmVxdWlyZWQpO1xuICAgIGlmIChwcm9wZXJ0eVR5cGUpIHtcbiAgICAgIHByb3AudHlwZSA9IHByb3BlcnR5VHlwZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcm9wSW5mbyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgaWYgKHByb3BJbmZvLnR5cGUpIHtcbiAgICAgICAgcHJvcC50eXBlID0gcHJvcEluZm8udHlwZTtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uZGVmYXVsdCkpIHtcbiAgICAgICAgcHJvcC5kZWZhdWx0VmFsdWUgPSBwcm9wSW5mby5kZWZhdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5pc1NlcmlhbGl6YWJsZSkpIHtcbiAgICAgICAgcHJvcC5pc1NlcmlhbGl6YWJsZSA9IHByb3BJbmZvLmlzU2VyaWFsaXphYmxlO1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5pc0xpZ2h0U2VyaWFsaXphYmxlKSkge1xuICAgICAgICBwcm9wLmlzTGlnaHRTZXJpYWxpemFibGUgPSBwcm9wSW5mby5pc0xpZ2h0U2VyaWFsaXphYmxlO1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5tYXhMZW5ndGgpKSB7XG4gICAgICAgIHByb3AubWF4TGVuZ3RoID0gcHJvcEluZm8ubWF4TGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5kaXNwbGF5TmFtZSkpIHtcbiAgICAgICAgcHJvcC5kaXNwbGF5TmFtZSA9IHByb3BJbmZvLmRpc3BsYXlOYW1lO1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5jYXRlZ29yeSkpIHtcbiAgICAgICAgcHJvcC5jYXRlZ29yeSA9IHByb3BJbmZvLmNhdGVnb3J5O1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5jYXRlZ29yeUluZGV4KSkge1xuICAgICAgICBwcm9wLmNhdGVnb3J5SW5kZXggPSBwcm9wSW5mby5jYXRlZ29yeUluZGV4O1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5uZXh0VG9Qcm9wZXJ0eSkpIHtcbiAgICAgICAgcHJvcC5uZXh0VG9Qcm9wZXJ0eSA9IHByb3BJbmZvLm5leHRUb1Byb3BlcnR5O1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby52aXNpYmxlSW5kZXgpKSB7XG4gICAgICAgIHByb3AudmlzaWJsZUluZGV4ID0gcHJvcEluZm8udmlzaWJsZUluZGV4O1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5zaG93TW9kZSkpIHtcbiAgICAgICAgcHJvcC5zaG93TW9kZSA9IHByb3BJbmZvLnNob3dNb2RlO1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5tYXhWYWx1ZSkpIHtcbiAgICAgICAgcHJvcC5tYXhWYWx1ZSA9IHByb3BJbmZvLm1heFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5taW5WYWx1ZSkpIHtcbiAgICAgICAgcHJvcC5taW5WYWx1ZSA9IHByb3BJbmZvLm1pblZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5kYXRhTGlzdCkpIHtcbiAgICAgICAgcHJvcC5kYXRhTGlzdCA9IHByb3BJbmZvLmRhdGFMaXN0O1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5pc0R5bmFtaWNDaG9pY2VzKSkge1xuICAgICAgICBwcm9wLmlzRHluYW1pY0Nob2ljZXMgPSBwcm9wSW5mby5pc0R5bmFtaWNDaG9pY2VzO1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5pc0JpbmRhYmxlKSkge1xuICAgICAgICBwcm9wLmlzQmluZGFibGUgPSBwcm9wSW5mby5pc0JpbmRhYmxlO1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5pc1VuaXF1ZSkpIHtcbiAgICAgICAgcHJvcC5pc1VuaXF1ZSA9IHByb3BJbmZvLmlzVW5pcXVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLnZpc2libGUgPT09IHRydWUgfHwgcHJvcEluZm8udmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcHJvcC52aXNpYmxlID0gcHJvcEluZm8udmlzaWJsZTtcbiAgICAgIH1cbiAgICAgIGlmICghIXByb3BJbmZvLnZpc2libGVJZikge1xuICAgICAgICBwcm9wLnZpc2libGVJZiA9IHByb3BJbmZvLnZpc2libGVJZjtcbiAgICAgIH1cbiAgICAgIGlmICghIXByb3BJbmZvLm9uUHJvcGVydHlFZGl0b3JVcGRhdGUpIHtcbiAgICAgICAgcHJvcC5vblByb3BlcnR5RWRpdG9yVXBkYXRlID0gcHJvcEluZm8ub25Qcm9wZXJ0eUVkaXRvclVwZGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5yZWFkT25seSA9PT0gdHJ1ZSkge1xuICAgICAgICBwcm9wLnJlYWRPbmx5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5jaG9pY2VzKSB7XG4gICAgICAgIHZhciBjaG9pY2VzRnVuYyA9XG4gICAgICAgICAgdHlwZW9mIHByb3BJbmZvLmNob2ljZXMgPT09IFwiZnVuY3Rpb25cIiA/IHByb3BJbmZvLmNob2ljZXMgOiBudWxsO1xuICAgICAgICB2YXIgY2hvaWNlc1ZhbHVlID1cbiAgICAgICAgICB0eXBlb2YgcHJvcEluZm8uY2hvaWNlcyAhPT0gXCJmdW5jdGlvblwiID8gcHJvcEluZm8uY2hvaWNlcyA6IG51bGw7XG4gICAgICAgIHByb3Auc2V0Q2hvaWNlcyhjaG9pY2VzVmFsdWUsIGNob2ljZXNGdW5jKTtcbiAgICAgIH1cbiAgICAgIGlmICghIXByb3BJbmZvLmJhc2VWYWx1ZSkge1xuICAgICAgICBwcm9wLnNldEJhc2VWYWx1ZShwcm9wSW5mby5iYXNlVmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLm9uR2V0VmFsdWUpIHtcbiAgICAgICAgcHJvcC5vbkdldFZhbHVlID0gcHJvcEluZm8ub25HZXRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5vblNldFZhbHVlKSB7XG4gICAgICAgIHByb3Aub25TZXRWYWx1ZSA9IHByb3BJbmZvLm9uU2V0VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uaXNMb2NhbGl6YWJsZSkge1xuICAgICAgICBwcm9wSW5mby5zZXJpYWxpemF0aW9uUHJvcGVydHkgPSBcImxvY1wiICsgcHJvcC5uYW1lO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSkge1xuICAgICAgICBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSA9IHByb3BJbmZvLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eTtcbiAgICAgICAgdmFyIHM6IHN0cmluZztcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5ICYmXG4gICAgICAgICAgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHkuaW5kZXhPZihcImxvY1wiKSA9PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIHByb3AuaXNMb2NhbGl6YWJsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5pc0xvY2FsaXphYmxlKSB7XG4gICAgICAgIHByb3AuaXNMb2NhbGl6YWJsZSA9IHByb3BJbmZvLmlzTG9jYWxpemFibGU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uY2xhc3NOYW1lKSB7XG4gICAgICAgIHByb3AuY2xhc3NOYW1lID0gcHJvcEluZm8uY2xhc3NOYW1lO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmJhc2VDbGFzc05hbWUpIHtcbiAgICAgICAgcHJvcC5iYXNlQ2xhc3NOYW1lID0gcHJvcEluZm8uYmFzZUNsYXNzTmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5jbGFzc05hbWVQYXJ0KSB7XG4gICAgICAgIHByb3AuY2xhc3NOYW1lUGFydCA9IHByb3BJbmZvLmNsYXNzTmFtZVBhcnQ7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uYWx0ZXJuYXRpdmVOYW1lKSB7XG4gICAgICAgIHByb3AuYWx0ZXJuYXRpdmVOYW1lID0gcHJvcEluZm8uYWx0ZXJuYXRpdmVOYW1lO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmxheW91dCkge1xuICAgICAgICBwcm9wLmxheW91dCA9IHByb3BJbmZvLmxheW91dDtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5kZXBlbmRzT24pIHtcbiAgICAgICAgdGhpcy5hZGREZXBlbmRzT25Qcm9wZXJ0aWVzKHByb3AsIHByb3BJbmZvLmRlcGVuZHNPbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wO1xuICB9XG4gIHByaXZhdGUgYWRkRGVwZW5kc09uUHJvcGVydGllcyhwcm9wOiBKc29uT2JqZWN0UHJvcGVydHksIGRlcGVuZHNPbjogYW55KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwZW5kc09uKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRzT24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5hZGREZXBlbmRzT25Qcm9wZXJ0eShwcm9wLCBkZXBlbmRzT25baV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZERlcGVuZHNPblByb3BlcnR5KHByb3AsIGRlcGVuZHNPbik7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkRGVwZW5kc09uUHJvcGVydHkocHJvcDogSnNvbk9iamVjdFByb3BlcnR5LCBkZXBlbmRzT246IHN0cmluZykge1xuICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMuZmluZChkZXBlbmRzT24pO1xuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgIHByb3BlcnR5ID0gU2VyaWFsaXplci5maW5kUHJvcGVydHkodGhpcy5wYXJlbnROYW1lLCBkZXBlbmRzT24pO1xuICAgIH1cbiAgICBpZiAoIXByb3BlcnR5KSByZXR1cm47XG4gICAgcHJvcGVydHkuYWRkRGVwZW5kZWRQcm9wZXJ0eShwcm9wLm5hbWUpO1xuICB9XG4gIHByaXZhdGUgZ2V0SXNQcm9wZXJ0eU5hbWVSZXF1aXJlZChwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBwcm9wZXJ0eU5hbWUubGVuZ3RoID4gMCAmJlxuICAgICAgcHJvcGVydHlOYW1lWzBdID09IEpzb25NZXRhZGF0YUNsYXNzLnJlcXVpcmVkU3ltYm9sXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmdldElzUHJvcGVydHlOYW1lUmVxdWlyZWQocHJvcGVydHlOYW1lKSkgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuc2xpY2UoMSk7XG4gICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBtZXRhZGF0YSBvYmplY3QuIEl0IGNvbnRhaW5zIG9iamVjdCBwcm9wZXJ0aWVzJyBydW50aW1lIGluZm9ybWF0aW9uIGFuZCBhbGxvd3MgeW91IHRvIG1vZGlmeSBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEpzb25NZXRhZGF0YSB7XG4gIHByaXZhdGUgY2xhc3NlczogSGFzaFRhYmxlPEpzb25NZXRhZGF0YUNsYXNzPiA9IHt9O1xuICBwcml2YXRlIGFsdGVybmF0aXZlTmFtZXM6IEhhc2hUYWJsZTxzdHJpbmc+ID0ge307XG4gIHByaXZhdGUgY2hpbGRyZW5DbGFzc2VzOiBIYXNoVGFibGU8QXJyYXk8SnNvbk1ldGFkYXRhQ2xhc3M+PiA9IHt9O1xuICBwcml2YXRlIGNsYXNzUHJvcGVydGllczogSGFzaFRhYmxlPEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4+ID0ge307XG4gIHByaXZhdGUgY2xhc3NIYXNoUHJvcGVydGllczogSGFzaFRhYmxlPEhhc2hUYWJsZTxKc29uT2JqZWN0UHJvcGVydHk+PiA9IHt9O1xuICBwdWJsaWMgZ2V0T2JqUHJvcGVydHlWYWx1ZShvYmo6IGFueSwgbmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAodGhpcy5pc09ialdyYXBwZXIob2JqKSkge1xuICAgICAgdmFyIG9yaWduYWxPYmogPSBvYmouZ2V0T3JpZ2luYWxPYmooKTtcbiAgICAgIHZhciBwcm9wID0gU2VyaWFsaXplci5maW5kUHJvcGVydHkob3JpZ25hbE9iai5nZXRUeXBlKCksIG5hbWUpO1xuICAgICAgaWYgKCEhcHJvcCkgcmV0dXJuIHRoaXMuZ2V0T2JqUHJvcGVydHlWYWx1ZUNvcmUob3JpZ25hbE9iaiwgcHJvcCk7XG4gICAgfVxuICAgIHZhciBwcm9wID0gU2VyaWFsaXplci5maW5kUHJvcGVydHkob2JqLmdldFR5cGUoKSwgbmFtZSk7XG4gICAgaWYgKCFwcm9wKSByZXR1cm4gb2JqW25hbWVdO1xuICAgIHJldHVybiB0aGlzLmdldE9ialByb3BlcnR5VmFsdWVDb3JlKG9iaiwgcHJvcCk7XG4gIH1cbiAgcHVibGljIHNldE9ialByb3BlcnR5VmFsdWUob2JqOiBhbnksIG5hbWU6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBpZiAob2JqW25hbWVdID09PSB2YWwpIHJldHVybjtcbiAgICBpZiAoISFvYmpbbmFtZV0gJiYgISFvYmpbbmFtZV0uc2V0SnNvbikge1xuICAgICAgb2JqW25hbWVdLnNldEpzb24odmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW25hbWVdID0gdmFsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldE9ialByb3BlcnR5VmFsdWVDb3JlKG9iajogYW55LCBwcm9wOiBKc29uT2JqZWN0UHJvcGVydHkpOiBhbnkge1xuICAgIGlmICghcHJvcC5pc1NlcmlhbGl6YWJsZSkgcmV0dXJuIG9ialtwcm9wLm5hbWVdO1xuICAgIGlmIChwcm9wLmlzTG9jYWxpemFibGUpIHtcbiAgICAgIGlmIChwcm9wLmlzQXJyYXkpIHJldHVybiBvYmpbcHJvcC5uYW1lXTtcbiAgICAgIGlmICghIXByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5KVxuICAgICAgICByZXR1cm4gb2JqW3Byb3Auc2VyaWFsaXphdGlvblByb3BlcnR5XS50ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gb2JqLmdldFByb3BlcnR5VmFsdWUocHJvcC5uYW1lKTtcbiAgfVxuICBwcml2YXRlIGlzT2JqV3JhcHBlcihvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIW9iai5nZXRPcmlnaW5hbE9iaiAmJiAhIW9iai5nZXRPcmlnaW5hbE9iaigpO1xuICB9XG4gIHB1YmxpYyBhZGRDbGFzcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydGllczogQXJyYXk8YW55PixcbiAgICBjcmVhdG9yOiAoanNvbj86IGFueSkgPT4gYW55ID0gbnVsbCxcbiAgICBwYXJlbnROYW1lOiBzdHJpbmcgPSBudWxsXG4gICk6IEpzb25NZXRhZGF0YUNsYXNzIHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gbmV3IEpzb25NZXRhZGF0YUNsYXNzKFxuICAgICAgbmFtZSxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICBjcmVhdG9yLFxuICAgICAgcGFyZW50TmFtZVxuICAgICk7XG4gICAgdGhpcy5jbGFzc2VzW25hbWVdID0gbWV0YURhdGFDbGFzcztcbiAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5DbGFzc2VzW3BhcmVudE5hbWVdO1xuICAgICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgICB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1twYXJlbnROYW1lXSA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGlsZHJlbkNsYXNzZXNbcGFyZW50TmFtZV0ucHVzaChtZXRhRGF0YUNsYXNzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFEYXRhQ2xhc3M7XG4gIH1cbiAgcHVibGljIHJlbW92ZUNsYXNzKG5hbWU6IHN0cmluZykge1xuICAgIHZhciBtZXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhuYW1lKTtcbiAgICBpZiAoIW1ldGFDbGFzcykgcmV0dXJuO1xuICAgIGRlbGV0ZSB0aGlzLmNsYXNzZXNbbWV0YUNsYXNzLm5hbWVdO1xuICAgIGlmICghIW1ldGFDbGFzcy5wYXJlbnROYW1lKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1ttZXRhQ2xhc3MucGFyZW50TmFtZV0uaW5kZXhPZihtZXRhQ2xhc3MpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbkNsYXNzZXNbbWV0YUNsYXNzLnBhcmVudE5hbWVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBvdmVycmlkZUNsYXNzQ3JlYXRvcmUobmFtZTogc3RyaW5nLCBjcmVhdG9yOiAoKSA9PiBhbnkpIHtcbiAgICB0aGlzLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKG5hbWUsIGNyZWF0b3IpO1xuICB9XG4gIHB1YmxpYyBvdmVycmlkZUNsYXNzQ3JlYXRvcihuYW1lOiBzdHJpbmcsIGNyZWF0b3I6ICgpID0+IGFueSkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhuYW1lKTtcbiAgICBpZiAobWV0YURhdGFDbGFzcykge1xuICAgICAgbWV0YURhdGFDbGFzcy5jcmVhdG9yID0gY3JlYXRvcjtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFByb3BlcnRpZXMoY2xhc3NOYW1lOiBzdHJpbmcpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgbWV0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICBpZiAoIW1ldGFDbGFzcykgcmV0dXJuIFtdO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5jbGFzc1Byb3BlcnRpZXNbbWV0YUNsYXNzLm5hbWVdO1xuICAgIGlmICghIXByb3BlcnRpZXMpIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIHRoaXMuZmlsbFByb3BlcnRpZXNGb3JDbGFzcyhtZXRhQ2xhc3MubmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NQcm9wZXJ0aWVzW21ldGFDbGFzcy5uYW1lXTtcbiAgfVxuICBwcml2YXRlIGdldEhhc2hQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nKTogSGFzaFRhYmxlPEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciBtZXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpO1xuICAgIGlmICghbWV0YUNsYXNzKSByZXR1cm4ge307XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmNsYXNzSGFzaFByb3BlcnRpZXNbbWV0YUNsYXNzLm5hbWVdO1xuICAgIGlmICghIXByb3BlcnRpZXMpIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIHRoaXMuZmlsbFByb3BlcnRpZXNGb3JDbGFzcyhtZXRhQ2xhc3MubmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NIYXNoUHJvcGVydGllc1ttZXRhQ2xhc3MubmFtZV07XG4gIH1cbiAgcHJpdmF0ZSBmaWxsUHJvcGVydGllc0ZvckNsYXNzKGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBuZXcgQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PigpO1xuICAgIHZhciBoYXNoUHJvcGVydGllcyA9IHt9O1xuICAgIHRoaXMuZmlsbFByb3BlcnRpZXMoY2xhc3NOYW1lLCBwcm9wZXJ0aWVzLCBoYXNoUHJvcGVydGllcyk7XG4gICAgdGhpcy5jbGFzc1Byb3BlcnRpZXNbY2xhc3NOYW1lXSA9IHByb3BlcnRpZXM7XG4gICAgdGhpcy5jbGFzc0hhc2hQcm9wZXJ0aWVzW2NsYXNzTmFtZV0gPSBoYXNoUHJvcGVydGllcztcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydGllc0J5T2JqKG9iajogYW55KTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgaWYgKCFvYmogfHwgIW9iai5nZXRUeXBlKSByZXR1cm4gW107XG4gICAgdmFyIHJlczogYW55ID0ge307XG4gICAgdmFyIHByb3BzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKG9iai5nZXRUeXBlKCkpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc1twcm9wc1tpXS5uYW1lXSA9IHByb3BzW2ldO1xuICAgIH1cbiAgICB2YXIgZHluYW1pY1Byb3BzID0gISFvYmouZ2V0RHluYW1pY1R5cGVcbiAgICAgID8gdGhpcy5nZXRQcm9wZXJ0aWVzKG9iai5nZXREeW5hbWljVHlwZSgpKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChkeW5hbWljUHJvcHMgJiYgZHluYW1pY1Byb3BzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHluYW1pY1Byb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBkUHJvcCA9IGR5bmFtaWNQcm9wc1tpXTtcbiAgICAgICAgaWYgKCEhcmVzW2RQcm9wLm5hbWVdKSBjb250aW51ZTtcbiAgICAgICAgcmVzW2RQcm9wLm5hbWVdID0gZFByb3A7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXMpLm1hcCgoa2V5KSA9PiByZXNba2V5XSk7XG4gIH1cbiAgcHVibGljIGdldER5bmFtaWNQcm9wZXJ0aWVzQnlPYmooXG4gICAgb2JqOiBhbnksXG4gICAgZHluYW1pY1R5cGU6IHN0cmluZyA9IG51bGxcbiAgKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgaWYgKCFvYmogfHwgIW9iai5nZXRUeXBlIHx8ICghb2JqLmdldER5bmFtaWNUeXBlICYmICFkeW5hbWljVHlwZSkpXG4gICAgICByZXR1cm4gW107XG4gICAgdmFyIGRUeXBlID0gISFkeW5hbWljVHlwZSA/IGR5bmFtaWNUeXBlIDogb2JqLmdldER5bmFtaWNUeXBlKCk7XG4gICAgaWYgKCFkVHlwZSkgcmV0dXJuIFtdO1xuICAgIHZhciBkeW5hbWljUHJvcHMgPSB0aGlzLmdldFByb3BlcnRpZXMoZFR5cGUpO1xuICAgIGlmICghZHluYW1pY1Byb3BzIHx8IGR5bmFtaWNQcm9wcy5sZW5ndGggPT0gMCkgcmV0dXJuIFtdO1xuICAgIHZhciBoYXNoOiBhbnkgPSB7fTtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLmdldFByb3BlcnRpZXMob2JqLmdldFR5cGUoKSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgaGFzaFtwcm9wc1tpXS5uYW1lXSA9IHByb3BzW2ldO1xuICAgIH1cbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkeW5hbWljUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBkUHJvcCA9IGR5bmFtaWNQcm9wc1tpXTtcbiAgICAgIGlmICghaGFzaFtkUHJvcC5uYW1lXSkge1xuICAgICAgICByZXMucHVzaChkUHJvcCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGhhc09yaWdpbmFsUHJvcGVydHkob2JqOiBCYXNlLCBwcm9wTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPcmlnaW5hbFByb3BlcnR5KG9iaiwgcHJvcE5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRPcmlnaW5hbFByb3BlcnR5KG9iajogQmFzZSwgcHJvcE5hbWU6IHN0cmluZyk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgdmFyIHJlcyA9IHRoaXMuZmluZFByb3BlcnR5KG9iai5nZXRUeXBlKCksIHByb3BOYW1lKTtcbiAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgaWYgKHRoaXMuaXNPYmpXcmFwcGVyKG9iaikpXG4gICAgICByZXR1cm4gdGhpcy5maW5kUHJvcGVydHkoKDxhbnk+b2JqKS5nZXRPcmlnaW5hbE9iaigpLmdldFR5cGUoKSwgcHJvcE5hbWUpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBmaW5kUHJvcGVydHkoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmdcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICB2YXIgaGFzaCA9IHRoaXMuZ2V0SGFzaFByb3BlcnRpZXMoY2xhc3NOYW1lKTtcbiAgICB2YXIgcmVzID0gaGFzaFtwcm9wZXJ0eU5hbWVdO1xuICAgIHJldHVybiAhIXJlcyA/IHJlcyA6IG51bGw7XG4gIH1cbiAgcHVibGljIGZpbmRQcm9wZXJ0aWVzKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnR5TmFtZXM6IEFycmF5PHN0cmluZz5cbiAgKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBoYXNoID0gdGhpcy5nZXRIYXNoUHJvcGVydGllcyhjbGFzc05hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBoYXNoW3Byb3BlcnR5TmFtZXNbaV1dO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldEFsbFByb3BlcnRpZXNCeU5hbWUoXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+KCk7XG4gICAgdmFyIGNsYXNzZXMgPSB0aGlzLmdldEFsbENsYXNzZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjbGFzc0luZm8gPSB0aGlzLmZpbmRDbGFzcyhjbGFzc2VzW2ldKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2xhc3NJbmZvLnByb3BlcnRpZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKGNsYXNzSW5mby5wcm9wZXJ0aWVzW2pdLm5hbWUgPT0gcHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgcmVzLnB1c2goY2xhc3NJbmZvLnByb3BlcnRpZXNbal0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldEFsbENsYXNzZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLmNsYXNzZXMpIHtcbiAgICAgIHJlcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVDbGFzcyhuYW1lOiBzdHJpbmcsIGpzb246IGFueSA9IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuIG51bGw7XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MuY3JlYXRvcikgcmV0dXJuIG1ldGFEYXRhQ2xhc3MuY3JlYXRvcihqc29uKTtcbiAgICB2YXIgcGFyZW50TmFtZSA9IG1ldGFEYXRhQ2xhc3MucGFyZW50TmFtZTtcbiAgICB3aGlsZSAocGFyZW50TmFtZSkge1xuICAgICAgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKHBhcmVudE5hbWUpO1xuICAgICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gbnVsbDtcbiAgICAgIHBhcmVudE5hbWUgPSBtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWU7XG4gICAgICBpZiAobWV0YURhdGFDbGFzcy5jcmVhdG9yKVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDdXN0b21UeXBlKG5hbWUsIG1ldGFEYXRhQ2xhc3MuY3JlYXRvciwganNvbik7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlQ3VzdG9tVHlwZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlYXRvcjogYW55LFxuICAgIGpzb246IGFueSA9IHVuZGVmaW5lZFxuICApOiBhbnkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlcyA9IGNyZWF0b3IoanNvbik7XG4gICAgdmFyIGN1c3RvbVR5cGVOYW1lID0gbmFtZTtcbiAgICB2YXIgY3VzdG9tVGVtcGxhdGVOYW1lID0gcmVzLmdldFRlbXBsYXRlXG4gICAgICA/IHJlcy5nZXRUZW1wbGF0ZSgpXG4gICAgICA6IHJlcy5nZXRUeXBlKCk7XG4gICAgcmVzLmdldFR5cGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjdXN0b21UeXBlTmFtZTtcbiAgICB9O1xuICAgIHJlcy5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGN1c3RvbVRlbXBsYXRlTmFtZTtcbiAgICB9O1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXMocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXRDaGlsZHJlbkNsYXNzZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhbkJlQ3JlYXRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPiB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcmVzdWx0OiBBcnJheTxKc29uTWV0YWRhdGFDbGFzcz4gPSBbXTtcbiAgICB0aGlzLmZpbGxDaGlsZHJlbkNsYXNzZXMobmFtZSwgY2FuQmVDcmVhdGVkLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldFJlcXVpcmVkUHJvcGVydGllcyhuYW1lOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhuYW1lKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJvcGVydGllc1tpXS5pc1JlcXVpcmVkKSB7XG4gICAgICAgIHJlcy5wdXNoKHByb3BlcnRpZXNbaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGFkZFByb3BlcnRpZXMoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnRpZXNJbmZvczogQXJyYXk8YW55Pikge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXNJbmZvcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hZGRDdXN0b21Qcm9wZXJ0eUNvcmUobWV0YURhdGFDbGFzcywgcHJvcGVydGllc0luZm9zW2ldKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFkZFByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eUluZm86IGFueSk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ3VzdG9tUHJvcGVydHlDb3JlKHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSksIHByb3BlcnR5SW5mbyk7XG4gIH1cbiAgcHJpdmF0ZSBhZGRDdXN0b21Qcm9wZXJ0eUNvcmUoXG4gICAgbWV0YURhdGFDbGFzczogSnNvbk1ldGFkYXRhQ2xhc3MsXG4gICAgcHJvcGVydHlJbmZvOiBhbnlcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybiBudWxsO1xuICAgIHZhciBwcm9wZXJ0eSA9IG1ldGFEYXRhQ2xhc3MuY3JlYXRlUHJvcGVydHkocHJvcGVydHlJbmZvKTtcbiAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgIHByb3BlcnR5LmlzQ3VzdG9tID0gdHJ1ZTtcbiAgICAgIHRoaXMuYWRkUHJvcGVydHlUb0NsYXNzKG1ldGFEYXRhQ2xhc3MsIHByb3BlcnR5KTtcbiAgICAgIHRoaXMuZW1wdHlDbGFzc1Byb3BlcnRpZXNIYXNoKG1ldGFEYXRhQ2xhc3MpO1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uYWRkUHJvcGVydHkobWV0YURhdGFDbGFzcy5uYW1lLCBwcm9wZXJ0eSk7XG4gICAgfVxuICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgfVxuICBwdWJsaWMgcmVtb3ZlUHJvcGVydHkoY2xhc3NOYW1lOiBzdHJpbmcsIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpO1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBwcm9wZXJ0eSA9IG1ldGFEYXRhQ2xhc3MuZmluZChwcm9wZXJ0eU5hbWUpO1xuICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgdGhpcy5yZW1vdmVQcm9wZXJ0eUZyb21DbGFzcyhtZXRhRGF0YUNsYXNzLCBwcm9wZXJ0eSk7XG4gICAgICB0aGlzLmVtcHR5Q2xhc3NQcm9wZXJ0aWVzSGFzaChtZXRhRGF0YUNsYXNzKTtcbiAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnJlbW92ZVByb3BlcnR5KFxuICAgICAgICBtZXRhRGF0YUNsYXNzLm5hbWUsXG4gICAgICAgIHByb3BlcnR5TmFtZVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRQcm9wZXJ0eVRvQ2xhc3MoXG4gICAgbWV0YURhdGFDbGFzczogSnNvbk1ldGFkYXRhQ2xhc3MsXG4gICAgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eVxuICApIHtcbiAgICBpZiAobWV0YURhdGFDbGFzcy5maW5kKHByb3BlcnR5Lm5hbWUpICE9IG51bGwpIHJldHVybjtcbiAgICBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmVQcm9wZXJ0eUZyb21DbGFzcyhcbiAgICBtZXRhRGF0YUNsYXNzOiBKc29uTWV0YWRhdGFDbGFzcyxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5XG4gICkge1xuICAgIHZhciBpbmRleCA9IG1ldGFEYXRhQ2xhc3MucHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5KTtcbiAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG4gICAgbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbiAgcHJpdmF0ZSBlbXB0eUNsYXNzUHJvcGVydGllc0hhc2gobWV0YURhdGFDbGFzczogSnNvbk1ldGFkYXRhQ2xhc3MpIHtcbiAgICB0aGlzLmNsYXNzUHJvcGVydGllc1ttZXRhRGF0YUNsYXNzLm5hbWVdID0gbnVsbDtcbiAgICB0aGlzLmNsYXNzSGFzaFByb3BlcnRpZXNbbWV0YURhdGFDbGFzcy5uYW1lXSA9IG51bGw7XG4gICAgdmFyIGNoaWxkQ2xhc3NlcyA9IHRoaXMuZ2V0Q2hpbGRyZW5DbGFzc2VzKG1ldGFEYXRhQ2xhc3MubmFtZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2xhc3NQcm9wZXJ0aWVzW2NoaWxkQ2xhc3Nlc1tpXS5uYW1lXSA9IG51bGw7XG4gICAgICB0aGlzLmNsYXNzSGFzaFByb3BlcnRpZXNbY2hpbGRDbGFzc2VzW2ldLm5hbWVdID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaWxsQ2hpbGRyZW5DbGFzc2VzKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYW5CZUNyZWF0ZWQ6IGJvb2xlYW4sXG4gICAgcmVzdWx0OiBBcnJheTxKc29uTWV0YWRhdGFDbGFzcz5cbiAgKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbkNsYXNzZXNbbmFtZV07XG4gICAgaWYgKCFjaGlsZHJlbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghY2FuQmVDcmVhdGVkIHx8IGNoaWxkcmVuW2ldLmNyZWF0b3IpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgfVxuICAgICAgdGhpcy5maWxsQ2hpbGRyZW5DbGFzc2VzKGNoaWxkcmVuW2ldLm5hbWUsIGNhbkJlQ3JlYXRlZCwgcmVzdWx0KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGZpbmRDbGFzcyhuYW1lOiBzdHJpbmcpOiBKc29uTWV0YWRhdGFDbGFzcyB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcmVzID0gdGhpcy5jbGFzc2VzW25hbWVdO1xuICAgIGlmICghcmVzKSB7XG4gICAgICB2YXIgbmV3TmFtZSA9IHRoaXMuYWx0ZXJuYXRpdmVOYW1lc1tuYW1lXTtcbiAgICAgIGlmICghIW5ld05hbWUgJiYgbmV3TmFtZSAhPSBuYW1lKSByZXR1cm4gdGhpcy5maW5kQ2xhc3MobmV3TmFtZSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGlzRGVzY2VuZGFudE9mKGNsYXNzTmFtZTogc3RyaW5nLCBhbmNlc3RvckNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFjbGFzc05hbWUgfHwgIWFuY2VzdG9yQ2xhc3NOYW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGFuY2VzdG9yQ2xhc3NOYW1lID0gYW5jZXN0b3JDbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgY2xhc3NfID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICBpZiAoIWNsYXNzXykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgcGFyZW50Q2xhc3MgPSBjbGFzc187XG4gICAgZG8ge1xuICAgICAgaWYgKHBhcmVudENsYXNzLm5hbWUgPT09IGFuY2VzdG9yQ2xhc3NOYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcGFyZW50Q2xhc3MgPSB0aGlzLmNsYXNzZXNbcGFyZW50Q2xhc3MucGFyZW50TmFtZV07XG4gICAgfSB3aGlsZSAoISFwYXJlbnRDbGFzcyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBhZGRBbHRlck5hdGl2ZUNsYXNzTmFtZShuYW1lOiBzdHJpbmcsIGFsdGVybmF0aXZlTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5hbHRlcm5hdGl2ZU5hbWVzW2FsdGVybmF0aXZlTmFtZS50b0xvd2VyQ2FzZSgpXSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgfVxuICBwdWJsaWMgZ2VuZXJhdGVTY2hlbWEoY2xhc3NOYW1lOiBzdHJpbmcgPSB1bmRlZmluZWQpOiBhbnkge1xuICAgIGlmICghY2xhc3NOYW1lKSBjbGFzc05hbWUgPSBcInN1cnZleVwiO1xuICAgIHZhciBjbGFzc0luZm8gPSB0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpO1xuICAgIGlmICghY2xhc3NJbmZvKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgJHNjaGVtYTogXCJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSNcIixcbiAgICAgIHRpdGxlOiBcIlN1cnZleUpTIExpYnJhcnkganNvbiBzY2hlbWFcIixcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgIGRlZmluaXRpb25zOiB7fSxcbiAgICB9O1xuICAgIHRoaXMuZ2VuZXJhdGVTY2hlbWFQcm9wZXJ0aWVzKGNsYXNzSW5mbywgcmVzLnByb3BlcnRpZXMsIHJlcy5kZWZpbml0aW9ucyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGdlbmVyYXRlU2NoZW1hUHJvcGVydGllcyhcbiAgICBjbGFzc0luZm86IEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIHNjaGVtYVByb3BlcnRpZXM6IGFueSxcbiAgICBzY2hlbWFEZWY6IGFueVxuICApOiB2b2lkIHtcbiAgICBpZiAoIWNsYXNzSW5mbykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xhc3NJbmZvLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gY2xhc3NJbmZvLnByb3BlcnRpZXNbaV07XG4gICAgICBzY2hlbWFQcm9wZXJ0aWVzW3Byb3AubmFtZV0gPSB0aGlzLmdlbmVyYXRlU2NoZW1hUHJvcGVydHkoXG4gICAgICAgIHByb3AsXG4gICAgICAgIHNjaGVtYURlZlxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZW5lcmF0ZVNjaGVtYVByb3BlcnR5KFxuICAgIHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBzY2hlbWFEZWY6IGFueVxuICApOiBhbnkge1xuICAgIHZhciByZXM6IGFueSA9IHsgdHlwZTogcHJvcC5zY2hlbWFUeXBlKCkgfTtcbiAgICBpZiAocHJvcC5oYXNDaG9pY2VzKSB7XG4gICAgICByZXMuZW51bSA9IHByb3AuZ2V0Q2hvaWNlcyhudWxsKTtcbiAgICB9XG4gICAgaWYgKCEhcHJvcC5jbGFzc05hbWUpIHtcbiAgICAgIHJlcy5pdGVtcyA9IHsgJHJlZjogXCIjXCIgKyBwcm9wLmNsYXNzTmFtZSB9O1xuICAgICAgdGhpcy5nZW5lcmF0ZUNoZW1hQ2xhc3MocHJvcC5jbGFzc05hbWUsIHNjaGVtYURlZik7XG4gICAgfVxuICAgIGlmICghIXByb3AuYmFzZUNsYXNzTmFtZSkge1xuICAgICAgdmFyIHVzZWRDbGFzc2VzID0gdGhpcy5nZXRDaGlsZHJlbkNsYXNzZXMocHJvcC5iYXNlQ2xhc3NOYW1lLCB0cnVlKTtcbiAgICAgIGlmIChwcm9wLmJhc2VDbGFzc05hbWUgPT0gXCJxdWVzdGlvblwiKSB7XG4gICAgICAgIHVzZWRDbGFzc2VzLnB1c2godGhpcy5maW5kQ2xhc3MoXCJwYW5lbFwiKSk7XG4gICAgICB9XG4gICAgICByZXMuaXRlbXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXNlZENsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHVzZWRDbGFzc2VzW2ldLm5hbWU7XG4gICAgICAgIHJlcy5pdGVtcy5wdXNoKHsgJHJlZjogXCIjXCIgKyBjbGFzc05hbWUgfSk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVDaGVtYUNsYXNzKGNsYXNzTmFtZSwgc2NoZW1hRGVmKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGdlbmVyYXRlQ2hlbWFDbGFzcyhjbGFzc05hbWU6IHN0cmluZywgc2NoZW1hRGVmOiBhbnkpIHtcbiAgICBpZiAoISFzY2hlbWFEZWZbY2xhc3NOYW1lXSkgcmV0dXJuO1xuICAgIHZhciBjbGFzc0luZm8gPSB0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpO1xuICAgIGlmICghY2xhc3NJbmZvKSByZXR1cm47XG4gICAgdmFyIGhhc1BhcmVudCA9ICEhY2xhc3NJbmZvLnBhcmVudE5hbWUgJiYgY2xhc3NJbmZvLnBhcmVudE5hbWUgIT0gXCJiYXNlXCI7XG4gICAgaWYgKGhhc1BhcmVudCkge1xuICAgICAgdGhpcy5nZW5lcmF0ZUNoZW1hQ2xhc3MoY2xhc3NJbmZvLnBhcmVudE5hbWUsIHNjaGVtYURlZik7XG4gICAgfVxuICAgIHZhciByZXM6IGFueSA9IHsgdHlwZTogXCJvYmplY3RcIiwgJGlkOiBcIiNcIiArIGNsYXNzTmFtZSB9O1xuICAgIHNjaGVtYURlZltjbGFzc05hbWVdID0gcmVzO1xuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIHRoaXMuZ2VuZXJhdGVTY2hlbWFQcm9wZXJ0aWVzKGNsYXNzSW5mbywgcHJvcHMsIHNjaGVtYURlZik7XG4gICAgaWYgKGhhc1BhcmVudCkge1xuICAgICAgcmVzLmFsbE9mZiA9IFtcbiAgICAgICAgeyAkcmVmOiBcIiNcIiArIGNsYXNzSW5mby5wYXJlbnROYW1lIH0sXG4gICAgICAgIHsgcHJvcGVydGllczogcHJvcHMgfSxcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy5wcm9wZXJ0aWVzID0gcHJvcHM7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmlsbFByb3BlcnRpZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGxpc3Q6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAgaGFzaDogSGFzaFRhYmxlPEpzb25PYmplY3RQcm9wZXJ0eT5cbiAgKSB7XG4gICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhuYW1lKTtcbiAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybjtcbiAgICBpZiAobWV0YURhdGFDbGFzcy5wYXJlbnROYW1lKSB7XG4gICAgICB0aGlzLmZpbGxQcm9wZXJ0aWVzKG1ldGFEYXRhQ2xhc3MucGFyZW50TmFtZSwgbGlzdCwgaGFzaCk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IG1ldGFEYXRhQ2xhc3MucHJvcGVydGllc1tpXTtcbiAgICAgIHRoaXMuYWRkUHJvcGVydHlDb3JlKHByb3AsIGxpc3QsIGhhc2gpO1xuICAgICAgaGFzaFtwcm9wLm5hbWVdID0gcHJvcDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRQcm9wZXJ0eUNvcmUoXG4gICAgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBsaXN0OiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+LFxuICAgIGhhc2g6IEhhc2hUYWJsZTxKc29uT2JqZWN0UHJvcGVydHk+XG4gICkge1xuICAgIGlmICghaGFzaFtwcm9wZXJ0eS5uYW1lXSkge1xuICAgICAgbGlzdC5wdXNoKHByb3BlcnR5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGlzdFtpXS5uYW1lID09IHByb3BlcnR5Lm5hbWUpIHtcbiAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvcGVydHkubWVyZ2VXaXRoKGxpc3RbaW5kZXhdKTtcbiAgICBsaXN0W2luZGV4XSA9IHByb3BlcnR5O1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvbkVycm9yIHtcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgYXQ6IE51bWJlciA9IC0xO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHlwZTogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogc3RyaW5nKSB7fVxuICBwdWJsaWMgZ2V0RnVsbERlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZSArICh0aGlzLmRlc2NyaXB0aW9uID8gXCJcXG5cIiArIHRoaXMuZGVzY3JpcHRpb24gOiBcIlwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25Vbmtub3duUHJvcGVydHlFcnJvciBleHRlbmRzIEpzb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBcInVua25vd25wcm9wZXJ0eVwiLFxuICAgICAgXCJUaGUgcHJvcGVydHkgJ1wiICtcbiAgICAgICAgcHJvcGVydHlOYW1lICtcbiAgICAgICAgXCInIGluIGNsYXNzICdcIiArXG4gICAgICAgIGNsYXNzTmFtZSArXG4gICAgICAgIFwiJyBpcyB1bmtub3duLlwiXG4gICAgKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IEpzb25PYmplY3QubWV0YURhdGEuZ2V0UHJvcGVydGllcyhjbGFzc05hbWUpO1xuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uID0gXCJUaGUgbGlzdCBvZiBhdmFpbGFibGUgcHJvcGVydGllcyBhcmU6IFwiO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID4gMCkgdGhpcy5kZXNjcmlwdGlvbiArPSBcIiwgXCI7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gcHJvcGVydGllc1tpXS5uYW1lO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXNjcmlwdGlvbiArPSBcIi5cIjtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uTWlzc2luZ1R5cGVFcnJvckJhc2UgZXh0ZW5kcyBKc29uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYmFzZUNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmcsXG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcih0eXBlLCBtZXNzYWdlKTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gXCJUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBhdmFpbGFibGU6IFwiO1xuICAgIHZhciB0eXBlcyA9IEpzb25PYmplY3QubWV0YURhdGEuZ2V0Q2hpbGRyZW5DbGFzc2VzKGJhc2VDbGFzc05hbWUsIHRydWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkgdGhpcy5kZXNjcmlwdGlvbiArPSBcIiwgXCI7XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uICs9IFwiJ1wiICsgdHlwZXNbaV0ubmFtZSArIFwiJ1wiO1xuICAgIH1cbiAgICB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLlwiO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvbk1pc3NpbmdUeXBlRXJyb3IgZXh0ZW5kcyBKc29uTWlzc2luZ1R5cGVFcnJvckJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyBiYXNlQ2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGJhc2VDbGFzc05hbWUsXG4gICAgICBcIm1pc3Npbmd0eXBlcHJvcGVydHlcIixcbiAgICAgIFwiVGhlIHByb3BlcnR5IHR5cGUgaXMgbWlzc2luZyBpbiB0aGUgb2JqZWN0LiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgcHJvcGVydHk6ICdcIiArXG4gICAgICAgIHByb3BlcnR5TmFtZSArXG4gICAgICAgIFwiJy5cIlxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uSW5jb3JyZWN0VHlwZUVycm9yIGV4dGVuZHMgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHByb3BlcnR5TmFtZTogc3RyaW5nLCBwdWJsaWMgYmFzZUNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBiYXNlQ2xhc3NOYW1lLFxuICAgICAgXCJpbmNvcnJlY3R0eXBlcHJvcGVydHlcIixcbiAgICAgIFwiVGhlIHByb3BlcnR5IHR5cGUgaXMgaW5jb3JyZWN0IGluIHRoZSBvYmplY3QuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCBwcm9wZXJ0eTogJ1wiICtcbiAgICAgICAgcHJvcGVydHlOYW1lICtcbiAgICAgICAgXCInLlwiXG4gICAgKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25SZXF1aXJlZFByb3BlcnR5RXJyb3IgZXh0ZW5kcyBKc29uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgXCJyZXF1aXJlZHByb3BlcnR5XCIsXG4gICAgICBcIlRoZSBwcm9wZXJ0eSAnXCIgK1xuICAgICAgICBwcm9wZXJ0eU5hbWUgK1xuICAgICAgICBcIicgaXMgcmVxdWlyZWQgaW4gY2xhc3MgJ1wiICtcbiAgICAgICAgY2xhc3NOYW1lICtcbiAgICAgICAgXCInLlwiXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSnNvbk9iamVjdCB7XG4gIHByaXZhdGUgc3RhdGljIHR5cGVQcm9wZXJ0eU5hbWUgPSBcInR5cGVcIjtcbiAgcHJpdmF0ZSBzdGF0aWMgcG9zaXRpb25Qcm9wZXJ0eU5hbWUgPSBcInBvc1wiO1xuICBwcml2YXRlIHN0YXRpYyBtZXRhRGF0YVZhbHVlID0gbmV3IEpzb25NZXRhZGF0YSgpO1xuICBwdWJsaWMgc3RhdGljIGdldCBtZXRhRGF0YSgpIHtcbiAgICByZXR1cm4gSnNvbk9iamVjdC5tZXRhRGF0YVZhbHVlO1xuICB9XG4gIHB1YmxpYyBlcnJvcnMgPSBuZXcgQXJyYXk8SnNvbkVycm9yPigpO1xuICBwdWJsaWMgbGlnaHRTZXJpYWxpemluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgdG9Kc29uT2JqZWN0KG9iajogYW55LCBzdG9yZURlZmF1bHRzID0gZmFsc2UpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnRvSnNvbk9iamVjdENvcmUob2JqLCBudWxsLCBzdG9yZURlZmF1bHRzKTtcbiAgfVxuICBwdWJsaWMgdG9PYmplY3QoanNvbk9iajogYW55LCBvYmo6IGFueSkge1xuICAgIHRoaXMudG9PYmplY3RDb3JlKGpzb25PYmosIG9iaik7XG4gICAgdmFyIGVycm9yID0gdGhpcy5nZXRSZXF1aXJlZEVycm9yKG9iaiwganNvbk9iaik7XG4gICAgaWYgKCEhZXJyb3IpIHtcbiAgICAgIHRoaXMuYWRkTmV3RXJyb3IoZXJyb3IsIGpzb25PYmopO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgdG9PYmplY3RDb3JlKGpzb25PYmo6IGFueSwgb2JqOiBhbnkpIHtcbiAgICBpZiAoIWpzb25PYmopIHJldHVybjtcbiAgICB2YXIgcHJvcGVydGllcyA9IG51bGw7XG4gICAgdmFyIG9ialR5cGUgPSB1bmRlZmluZWQ7XG4gICAgdmFyIG5lZWRBZGRFcnJvcnMgPSB0cnVlO1xuICAgIGlmIChvYmouZ2V0VHlwZSkge1xuICAgICAgb2JqVHlwZSA9IG9iai5nZXRUeXBlKCk7XG4gICAgICBwcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKG9ialR5cGUpO1xuICAgICAgbmVlZEFkZEVycm9ycyA9XG4gICAgICAgICEhb2JqVHlwZSAmJiAhSnNvbk9iamVjdC5tZXRhRGF0YS5pc0Rlc2NlbmRhbnRPZihvYmpUeXBlLCBcIml0ZW12YWx1ZVwiKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wZXJ0aWVzKSByZXR1cm47XG4gICAgaWYgKG9iai5zdGFydExvYWRpbmdGcm9tSnNvbikge1xuICAgICAgb2JqLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgfVxuICAgIHByb3BlcnRpZXMgPSB0aGlzLmFkZER5bmFtaWNQcm9wZXJ0aWVzKG9iaiwganNvbk9iaiwgcHJvcGVydGllcyk7XG4gICAgZm9yICh2YXIga2V5IGluIGpzb25PYmopIHtcbiAgICAgIGlmIChrZXkgPT09IEpzb25PYmplY3QudHlwZVByb3BlcnR5TmFtZSkgY29udGludWU7XG4gICAgICBpZiAoa2V5ID09PSBKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lKSB7XG4gICAgICAgIG9ialtrZXldID0ganNvbk9ialtrZXldO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMuZmluZFByb3BlcnR5KHByb3BlcnRpZXMsIGtleSk7XG4gICAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICAgIGlmIChuZWVkQWRkRXJyb3JzKSB7XG4gICAgICAgICAgdGhpcy5hZGROZXdFcnJvcihcbiAgICAgICAgICAgIG5ldyBKc29uVW5rbm93blByb3BlcnR5RXJyb3Ioa2V5LnRvU3RyaW5nKCksIG9ialR5cGUpLFxuICAgICAgICAgICAganNvbk9ialxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlVG9PYmooanNvbk9ialtrZXldLCBvYmosIHByb3BlcnR5KTtcbiAgICB9XG4gICAgaWYgKG9iai5lbmRMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIG9iai5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHRvSnNvbk9iamVjdENvcmUoXG4gICAgb2JqOiBhbnksXG4gICAgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgICBzdG9yZURlZmF1bHRzID0gZmFsc2VcbiAgKTogYW55IHtcbiAgICBpZiAoIW9iaiB8fCAhb2JqLmdldFR5cGUpIHJldHVybiBvYmo7XG4gICAgaWYgKHR5cGVvZiBvYmouZ2V0RGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gb2JqLmdldERhdGEoKTtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgIXByb3BlcnR5LmNsYXNzTmFtZSkge1xuICAgICAgKDxhbnk+cmVzdWx0KVtKc29uT2JqZWN0LnR5cGVQcm9wZXJ0eU5hbWVdID0gcHJvcGVydHkuZ2V0T2JqVHlwZShcbiAgICAgICAgb2JqLmdldFR5cGUoKVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5wcm9wZXJ0aWVzVG9Kc29uKFxuICAgICAgb2JqLFxuICAgICAgSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKG9iai5nZXRUeXBlKCkpLFxuICAgICAgcmVzdWx0LFxuICAgICAgc3RvcmVEZWZhdWx0c1xuICAgICk7XG4gICAgdGhpcy5wcm9wZXJ0aWVzVG9Kc29uKFxuICAgICAgb2JqLFxuICAgICAgdGhpcy5nZXREeW5hbWljUHJvcGVydGllcyhvYmopLFxuICAgICAgcmVzdWx0LFxuICAgICAgc3RvcmVEZWZhdWx0c1xuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGdldER5bmFtaWNQcm9wZXJ0aWVzKG9iajogYW55KTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgcmV0dXJuIFNlcmlhbGl6ZXIuZ2V0RHluYW1pY1Byb3BlcnRpZXNCeU9iaihvYmopO1xuICB9XG4gIHByaXZhdGUgYWRkRHluYW1pY1Byb3BlcnRpZXMoXG4gICAgb2JqOiBhbnksXG4gICAganNvbk9iajogYW55LFxuICAgIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT5cbiAgKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgaWYgKCFvYmouZ2V0RHluYW1pY1Byb3BlcnR5TmFtZSkgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgdmFyIGR5bmFtaWNQcm9wTmFtZSA9IG9iai5nZXREeW5hbWljUHJvcGVydHlOYW1lKCk7XG4gICAgaWYgKCFkeW5hbWljUHJvcE5hbWUpIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIGlmIChqc29uT2JqW2R5bmFtaWNQcm9wTmFtZV0pIHtcbiAgICAgIG9ialtkeW5hbWljUHJvcE5hbWVdID0ganNvbk9ialtkeW5hbWljUHJvcE5hbWVdO1xuICAgIH1cbiAgICB2YXIgZHluYW1pY1Byb3BlcnRpZXMgPSB0aGlzLmdldER5bmFtaWNQcm9wZXJ0aWVzKG9iaik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHluYW1pY1Byb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKGR5bmFtaWNQcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHByb3BlcnRpZXNUb0pzb24oXG4gICAgb2JqOiBhbnksXG4gICAgcHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PixcbiAgICBqc29uOiBhbnksXG4gICAgc3RvcmVEZWZhdWx0cyA9IGZhbHNlXG4gICkge1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnZhbHVlVG9Kc29uKG9iaiwganNvbiwgcHJvcGVydGllc1tpXSwgc3RvcmVEZWZhdWx0cyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyB2YWx1ZVRvSnNvbihcbiAgICBvYmo6IGFueSxcbiAgICByZXN1bHQ6IGFueSxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIHN0b3JlRGVmYXVsdHMgPSBmYWxzZVxuICApIHtcbiAgICBpZiAoXG4gICAgICBwcm9wZXJ0eS5pc1NlcmlhbGl6YWJsZSA9PT0gZmFsc2UgfHxcbiAgICAgIChwcm9wZXJ0eS5pc0xpZ2h0U2VyaWFsaXphYmxlID09PSBmYWxzZSAmJiB0aGlzLmxpZ2h0U2VyaWFsaXppbmcpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciB2YWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKG9iaik7XG4gICAgaWYgKCFzdG9yZURlZmF1bHRzICYmIHByb3BlcnR5LmlzRGVmYXVsdFZhbHVlKHZhbHVlKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzVmFsdWVBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhciBhcnJWYWx1ZSA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJWYWx1ZS5wdXNoKHRoaXMudG9Kc29uT2JqZWN0Q29yZSh2YWx1ZVtpXSwgcHJvcGVydHksIHN0b3JlRGVmYXVsdHMpKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gYXJyVmFsdWUubGVuZ3RoID4gMCA/IGFyclZhbHVlIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSB0aGlzLnRvSnNvbk9iamVjdENvcmUodmFsdWUsIHByb3BlcnR5LCBzdG9yZURlZmF1bHRzKTtcbiAgICB9XG4gICAgdmFyIGhhc1ZhbHVlID1cbiAgICAgIHR5cGVvZiBvYmpbXCJnZXRQcm9wZXJ0eVZhbHVlXCJdID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIG9ialtcImdldFByb3BlcnR5VmFsdWVcIl0ocHJvcGVydHkubmFtZSwgbnVsbCkgIT09IG51bGw7XG4gICAgaWYgKChzdG9yZURlZmF1bHRzICYmIGhhc1ZhbHVlKSB8fCAhcHJvcGVydHkuaXNEZWZhdWx0VmFsdWUodmFsdWUpKSB7XG4gICAgICByZXN1bHRbcHJvcGVydHkubmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHZhbHVlVG9PYmoodmFsdWU6IGFueSwgb2JqOiBhbnksIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuO1xuICAgIHRoaXMucmVtb3ZlUG9zKHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgcHJvcGVydHkuaGFzVG9Vc2VTZXRWYWx1ZSkge1xuICAgICAgcHJvcGVydHkuc2V0VmFsdWUob2JqLCB2YWx1ZSwgdGhpcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzVmFsdWVBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMudmFsdWVUb0FycmF5KHZhbHVlLCBvYmosIHByb3BlcnR5Lm5hbWUsIHByb3BlcnR5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5ld09iaiA9IHRoaXMuY3JlYXRlTmV3T2JqKHZhbHVlLCBwcm9wZXJ0eSk7XG4gICAgaWYgKG5ld09iai5uZXdPYmopIHtcbiAgICAgIHRoaXMudG9PYmplY3RDb3JlKHZhbHVlLCBuZXdPYmoubmV3T2JqKTtcbiAgICAgIHZhbHVlID0gbmV3T2JqLm5ld09iajtcbiAgICB9XG4gICAgaWYgKCFuZXdPYmouZXJyb3IpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7XG4gICAgICAgIHByb3BlcnR5LnNldFZhbHVlKG9iaiwgdmFsdWUsIHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW3Byb3BlcnR5Lm5hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcmVtb3ZlUG9zKHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXByb3BlcnR5IHx8ICFwcm9wZXJ0eS50eXBlIHx8IHByb3BlcnR5LnR5cGUuaW5kZXhPZihcInZhbHVlXCIpIDwgMClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnJlbW92ZVBvc0Zyb21PYmoodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUG9zRnJvbU9iaihvYmo6IGFueSkge1xuICAgIGlmICghb2JqKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5yZW1vdmVQb3NGcm9tT2JqKG9ialtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIW9ialtKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lXSkge1xuICAgICAgZGVsZXRlIG9ialtKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lXTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlQXJyYXkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5ld09iaih2YWx1ZTogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KTogYW55IHtcbiAgICB2YXIgcmVzdWx0OiBhbnkgPSB7IG5ld09iajogbnVsbCwgZXJyb3I6IG51bGwgfTtcbiAgICB2YXIgY2xhc3NOYW1lID0gdmFsdWVbSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lXTtcbiAgICBpZiAoIWNsYXNzTmFtZSAmJiBwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5LmNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lID0gcHJvcGVydHkuY2xhc3NOYW1lO1xuICAgIH1cbiAgICBjbGFzc05hbWUgPSBwcm9wZXJ0eS5nZXRDbGFzc05hbWUoY2xhc3NOYW1lKTtcbiAgICByZXN1bHQubmV3T2JqID0gY2xhc3NOYW1lXG4gICAgICA/IEpzb25PYmplY3QubWV0YURhdGEuY3JlYXRlQ2xhc3MoY2xhc3NOYW1lLCB2YWx1ZSlcbiAgICAgIDogbnVsbDtcbiAgICByZXN1bHQuZXJyb3IgPSB0aGlzLmNoZWNrTmV3T2JqZWN0T25FcnJvcnMoXG4gICAgICByZXN1bHQubmV3T2JqLFxuICAgICAgdmFsdWUsXG4gICAgICBwcm9wZXJ0eSxcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGNoZWNrTmV3T2JqZWN0T25FcnJvcnMoXG4gICAgbmV3T2JqOiBhbnksXG4gICAgdmFsdWU6IGFueSxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIGNsYXNzTmFtZTogc3RyaW5nXG4gICk6IEpzb25FcnJvciB7XG4gICAgdmFyIGVycm9yID0gbnVsbDtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBlcnJvciA9IHRoaXMuZ2V0UmVxdWlyZWRFcnJvcihuZXdPYmosIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb3BlcnR5LmJhc2VDbGFzc05hbWUpIHtcbiAgICAgICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBKc29uTWlzc2luZ1R5cGVFcnJvcihcbiAgICAgICAgICAgIHByb3BlcnR5Lm5hbWUsXG4gICAgICAgICAgICBwcm9wZXJ0eS5iYXNlQ2xhc3NOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBKc29uSW5jb3JyZWN0VHlwZUVycm9yKFxuICAgICAgICAgICAgcHJvcGVydHkubmFtZSxcbiAgICAgICAgICAgIHByb3BlcnR5LmJhc2VDbGFzc05hbWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgdGhpcy5hZGROZXdFcnJvcihlcnJvciwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbiAgcHJpdmF0ZSBnZXRSZXF1aXJlZEVycm9yKG9iajogYW55LCBqc29uVmFsdWU6IGFueSk6IEpzb25FcnJvciB7XG4gICAgaWYgKCFvYmouZ2V0VHlwZSB8fCB0eXBlb2Ygb2JqLmdldERhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7XG4gICAgdmFyIGNsYXNzTmFtZSA9IG9iai5nZXRUeXBlKCk7XG4gICAgdmFyIHJlcXVpcmVkUHJvcGVydGllcyA9IEpzb25PYmplY3QubWV0YURhdGEuZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgICBpZiAoIXJlcXVpcmVkUHJvcGVydGllcykgcmV0dXJuIG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghanNvblZhbHVlW3JlcXVpcmVkUHJvcGVydGllc1tpXV0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKc29uUmVxdWlyZWRQcm9wZXJ0eUVycm9yKHJlcXVpcmVkUHJvcGVydGllc1tpXSwgY2xhc3NOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBhZGROZXdFcnJvcihlcnJvcjogSnNvbkVycm9yLCBqc29uT2JqOiBhbnkpIHtcbiAgICBpZiAoanNvbk9iaiAmJiBqc29uT2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdKSB7XG4gICAgICBlcnJvci5hdCA9IGpzb25PYmpbSnNvbk9iamVjdC5wb3NpdGlvblByb3BlcnR5TmFtZV0uc3RhcnQ7XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICB9XG4gIHByaXZhdGUgdmFsdWVUb0FycmF5KFxuICAgIHZhbHVlOiBBcnJheTxhbnk+LFxuICAgIG9iajogYW55LFxuICAgIGtleTogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgaWYgKG9ialtrZXldICYmIHZhbHVlLmxlbmd0aCA+IDApIG9ialtrZXldLnNwbGljZSgwLCBvYmpba2V5XS5sZW5ndGgpO1xuICAgIHZhciB2YWx1ZVJlcyA9IG9ialtrZXldID8gb2JqW2tleV0gOiBbXTtcbiAgICB0aGlzLmFkZFZhbHVlc0ludG9BcnJheSh2YWx1ZSwgdmFsdWVSZXMsIHByb3BlcnR5KTtcbiAgICBpZiAoIW9ialtrZXldKSBvYmpba2V5XSA9IHZhbHVlUmVzO1xuICB9XG4gIHByaXZhdGUgYWRkVmFsdWVzSW50b0FycmF5KFxuICAgIHZhbHVlOiBBcnJheTxhbnk+LFxuICAgIHJlc3VsdDogQXJyYXk8YW55PixcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5XG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3T2JqKHZhbHVlW2ldLCBwcm9wZXJ0eSk7XG4gICAgICBpZiAobmV3VmFsdWUubmV3T2JqKSB7XG4gICAgICAgIGlmICghIXZhbHVlW2ldLm5hbWUpIHtcbiAgICAgICAgICBuZXdWYWx1ZS5uZXdPYmoubmFtZSA9IHZhbHVlW2ldLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2gobmV3VmFsdWUubmV3T2JqKTtcbiAgICAgICAgdGhpcy50b09iamVjdENvcmUodmFsdWVbaV0sIG5ld1ZhbHVlLm5ld09iaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIW5ld1ZhbHVlLmVycm9yKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmluZFByb3BlcnR5KFxuICAgIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAga2V5OiBhbnlcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgaWYgKHByb3AubmFtZSA9PSBrZXkgfHwgcHJvcC5hbHRlcm5hdGl2ZU5hbWUgPT0ga2V5KSByZXR1cm4gcHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBhbGlhcyBmb3IgdGhlIG1ldGFkYXRhIG9iamVjdC4gSXQgY29udGFpbnMgb2JqZWN0IHByb3BlcnRpZXMnIHJ1bnRpbWUgaW5mb3JtYXRpb24gYW5kIGFsbG93cyB5b3UgdG8gbW9kaWZ5IGl0LlxuICogQHNlZSBKc29uTWV0YWRhdGFcbiAqL1xuZXhwb3J0IHZhciBTZXJpYWxpemVyID0gSnNvbk9iamVjdC5tZXRhRGF0YTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8YnV0dG9uXFxuICBjbGFzcz1cXFwic3YtYWN0aW9uLWJhci1pdGVtIHN2LWFjdGlvbi1iYXItaXRlbS1kcm9wZG93blxcXCJcXG4gIGRhdGEtYmluZD1cXFwiY2xpY2s6IGFjdGlvbiwgY3NzOiB7ICdzdi1hY3Rpb24tYmFyLWl0ZW0tLWFjdGl2ZSc6ICEha28udW53cmFwKCRkYXRhLmFjdGl2ZSkgfSwgY2xhc3M6ICRkYXRhLmlubmVyQ3NzLCBhdHRyOiB7IGRpc2FibGVkOiAkZGF0YS5lbmFibGVkICE9PSB1bmRlZmluZWQgJiYgIWtvLnVud3JhcCgkZGF0YS5lbmFibGVkKSwgdGl0bGU6ICRkYXRhLnRvb2x0aXAgfHwgJGRhdGEudGl0bGV9XFxcIlxcbj5cXG4gIDwhLS0ga28gaWY6ICRkYXRhLmljb25OYW1lIC0tPlxcbiAgPHN2LXN2Zy1pY29uXFxuICAgIGNsYXNzPVxcXCJzdi1hY3Rpb24tYmFyLWl0ZW1fX2ljb25cXFwiXFxuICAgIHBhcmFtcz1cXFwiaWNvbk5hbWU6IGljb25OYW1lLCBzaXplOiAyNFxcXCJcXG4gID48L3N2LXN2Zy1pY29uPlxcbiAgPCEtLSAva28gLS0+XFxuICA8IS0tIGtvIGlmOiAkZGF0YS5oYXNUaXRsZSAtLT5cXG4gIDxzcGFuXFxuICAgIGNsYXNzPVxcXCJzdi1hY3Rpb24tYmFyLWl0ZW1fX3RpdGxlXFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcInRleHQ6IHRpdGxlLCBjc3M6IHsgJ3N2LWFjdGlvbi1iYXItaXRlbV9fdGl0bGUtLXdpdGgtaWNvbic6ICEhJGRhdGEuaWNvbk5hbWUgfVxcXCJcXG4gID48L3NwYW4+XFxuICA8IS0tIC9rbyAtLT5cXG4gIDxzdi1wb3B1cFxcbiAgICBwYXJhbXM9XFxcIm1vZGVsOiBwb3B1cE1vZGVsXFxcIlxcbiAgPjwvc3YtcG9wdXA+XFxuXFxuPC9idXR0b24+XFxuXCI7IiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vYWN0aW9uLWJhci1pdGVtLWRyb3Bkb3duLmh0bWxcIik7XG5cbmV4cG9ydCB2YXIgQWN0aW9uQmFySXRlbURyb3Bkb3duVmlld01vZGVsOiBhbnk7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1hY3Rpb24tYmFyLWl0ZW0tZHJvcGRvd25cIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiBwYXJhbXMuaXRlbSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGJ1dHRvblxcbiAgY2xhc3M9XFxcInN2LWFjdGlvbi1iYXItaXRlbVxcXCJcXG4gIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gIGRhdGEtYmluZD1cXFwiY2xpY2s6IGFjdGlvbiwgY2xhc3M6ICRkYXRhLmlubmVyQ3NzLCBkaXNhYmxlOiAkZGF0YS5kaXNhYmxlZCwgY3NzOiB7ICdzdi1hY3Rpb24tYmFyLWl0ZW0tLWFjdGl2ZSc6ICEha28udW53cmFwKCRkYXRhLmFjdGl2ZSkgfSwgYXR0cjogeyB0aXRsZTogJGRhdGEudG9vbHRpcCB8fCAkZGF0YS50aXRsZSwgdGFiaW5kZXg6ICRkYXRhLmRpc2FibGVUYWJTdG9wPyAtMSA6IG51bGwgfVxcXCJcXG4+XFxuICA8IS0tIGtvIGlmOiAkZGF0YS5pY29uTmFtZSAtLT5cXG4gIDxzdi1zdmctaWNvblxcbiAgICBjbGFzcz1cXFwic3YtYWN0aW9uLWJhci1pdGVtX19pY29uXFxcIlxcbiAgICBwYXJhbXM9XFxcImljb25OYW1lOiBpY29uTmFtZSwgc2l6ZTogMjRcXFwiXFxuICA+PC9zdi1zdmctaWNvbj5cXG4gIDwhLS0gL2tvIC0tPlxcblxcbiAgPCEtLSBrbyBpZjogJGRhdGEuaGFzVGl0bGUgLS0+XFxuICA8c3BhblxcbiAgICBjbGFzcz1cXFwic3YtYWN0aW9uLWJhci1pdGVtX190aXRsZVxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJ0ZXh0OiB0aXRsZSwgY3NzOiB7ICdzdi1hY3Rpb24tYmFyLWl0ZW1fX3RpdGxlLS13aXRoLWljb24nOiAhISRkYXRhLmljb25OYW1lIH1cXFwiXFxuICA+PC9zcGFuPlxcbiAgPCEtLSAva28gLS0+XFxuPC9idXR0b24+XFxuXCI7IiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vYWN0aW9uLWJhci1pdGVtLmh0bWxcIik7XG5cbmV4cG9ydCB2YXIgQWN0aW9uQmFySXRlbVZpZXdNb2RlbDogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtYWN0aW9uLWJhci1pdGVtXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtcy5pdGVtO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcInN2LWFjdGlvbi1iYXItc2VwYXJhdG9yXFxcIiBkYXRhLWJpbmQ9XFxcImNzczogJGRhdGEuY3NzXFxcIj48L2Rpdj5cIjsiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcblxuY29uc3QgdGVtcGxhdGUgPSByZXF1aXJlKFwiLi9hY3Rpb24tYmFyLXNlcGFyYXRvci5odG1sXCIpO1xuXG5leHBvcnQgdmFyIEFjdGlvbkJhclNlcGFyYXRvclZpZXdNb2RlbDogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtYWN0aW9uLWJhci1zZXBhcmF0b3JcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XG4gICAgICB2YXIgaXRlbSA9IHBhcmFtcy5pdGVtO1xuICAgICAgaWYgKCEhaXRlbSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNzczogaXRlbS5pbm5lckNzcyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tIGtvIGlmOiBtb2RlbC5oYXNJdGVtcyAtLT5cXG48ZGl2XFxuICBjbGFzcz1cXFwic3YtYWN0aW9uLWJhclxcXCJcXG4gIGRhdGEtYmluZD1cXFwiY2xpY2s6IGhhbmRsZUNsaWNrID8gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9IDogdW5kZWZpbmVkLCBjbGlja0J1YmJsZTogaGFuZGxlQ2xpY2sgPyBmYWxzZSA6IHVuZGVmaW5lZFxcXCJcXG4+XFxuICA8IS0tIGtvIGZvcmVhY2g6IG1vZGVsLmFjdGlvbnMgLS0+XFxuICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAnc3YtYWN0aW9uJywgcGFyYW1zOiB7IGl0ZW06ICRkYXRhIH0gfSAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbiAgPCEtLS9rby0tPlxcbjwvZGl2PlxcbjwhLS0va28tLT5cXG5cIjsiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IEJhc2UsIEFjdGlvbiwgQWRhcHRpdmVBY3Rpb25Db250YWluZXIsIElBY3Rpb24sIEFjdGlvbkNvbnRhaW5lciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUmVzcG9uc2l2aXR5TWFuYWdlciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSW1wbGVtZW50b3JCYXNlIH0gZnJvbSBcIi4uLy4uL2tvYmFzZVwiO1xuXG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL2FjdGlvbi1iYXIuaHRtbFwiKTtcblxuZXhwb3J0ICogZnJvbSBcIi4vYWN0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hY3Rpb24tYmFyLWl0ZW1cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FjdGlvbi1iYXItaXRlbS1kcm9wZG93blwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYWN0aW9uLWJhci1zZXBhcmF0b3JcIjtcblxuZXhwb3J0IGNsYXNzIEFjdGlvbkJhclZpZXdNb2RlbCBleHRlbmRzIEFkYXB0aXZlQWN0aW9uQ29udGFpbmVyIHtcbiAgcHVibGljIGl0ZW1zU3Vic2NyaXB0aW9uOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoX2l0ZW1zOiBBcnJheTxJQWN0aW9uPiwgcHVibGljIGhhbmRsZUNsaWNrID0gdHJ1ZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5pdGVtc1N1YnNjcmlwdGlvbiA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0SXRlbXMoa28udW53cmFwKF9pdGVtcykpO1xuICAgIH0pO1xuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgdGhpcy5pdGVtc1N1YnNjcmlwdGlvbi5kaXNwb3NlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFkYXB0aXZlRWxlbWVudEltcGxlbWVudG9yIGV4dGVuZHMgSW1wbGVtZW50b3JCYXNlIHtcbiAgcHJpdmF0ZSBpdGVtc1N1YnNjcmlwdGlvbjogYW55O1xuXG4gIGNvbnN0cnVjdG9yKG1vZGVsOiBBZGFwdGl2ZUFjdGlvbkNvbnRhaW5lcikge1xuICAgIHN1cGVyKG1vZGVsKTtcblxuICAgIHRoaXMuaXRlbXNTdWJzY3JpcHRpb24gPSBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICAoKDxhbnk+bW9kZWwpLml0ZW1zIHx8ICg8YW55Pm1vZGVsKS5hY3Rpb25zKS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCEhaXRlbS5zdGF0ZUl0ZW0pIHtcbiAgICAgICAgICBuZXcgSW1wbGVtZW50b3JCYXNlKGl0ZW0uc3RhdGVJdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXcgSW1wbGVtZW50b3JCYXNlKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIHRoaXMuaXRlbXNTdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1hY3Rpb24tYmFyXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlQ2xpY2sgPVxuICAgICAgICBwYXJhbXMuaGFuZGxlQ2xpY2sgIT09IHVuZGVmaW5lZCA/IHBhcmFtcy5oYW5kbGVDbGljayA6IHRydWU7XG4gICAgICBsZXQgbW9kZWwgPSB7IG1vZGVsOiBwYXJhbXMubW9kZWwsIGhhbmRsZUNsaWNrOiBoYW5kbGVDbGljayB9O1xuICAgICAgbmV3IEltcGxlbWVudG9yQmFzZShwYXJhbXMubW9kZWwpO1xuXG4gICAgICBjb25zdCBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID1cbiAgICAgICAgY29tcG9uZW50SW5mby5lbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgIGNvbnN0IG1hbmFnZXI6IFJlc3BvbnNpdml0eU1hbmFnZXIgPSBuZXcgUmVzcG9uc2l2aXR5TWFuYWdlcihcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBwYXJhbXMubW9kZWwsXG4gICAgICAgIFwic3Bhbi5zdi1hY3Rpb246bm90KC5zdi1kb3RzKVwiXG4gICAgICApO1xuICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhjb250YWluZXIsICgpID0+XG4gICAgICAgIG1hbmFnZXIuZGlzcG9zZSgpXG4gICAgICApO1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzcGFuIGNsYXNzPVxcXCJzdi1hY3Rpb25cXFwiXFxyXFxuICAgIGRhdGEtYmluZD1cXFwiY3NzOiB7ICdzdi1hY3Rpb24tLWhpZGRlbic6ICFpc1Zpc2libGUgfSwgY2xhc3M6ICRkYXRhLmNzcywgYXR0cjogeyBpZDogJGRhdGEuaWQgfSwgdmlzaWJsZTogJGRhdGEudmlzaWJsZSA9PT0gdW5kZWZpbmVkIHx8ICRkYXRhLnZpc2libGVcXFwiPlxcclxcbiAgICA8IS0tIGtvIGlmOiAkZGF0YS5uZWVkU2VwYXJhdG9yIC0tPlxcclxcbiAgICA8c3YtYWN0aW9uLWJhci1zZXBhcmF0b3I+PC9zdi1hY3Rpb24tYmFyLXNlcGFyYXRvcj5cXHJcXG4gICAgPCEtLSAva28gLS0+XFxyXFxuICAgIDwhLS0ga28gaWZub3Q6ICRkYXRhLnRlbXBsYXRlLS0+XFxyXFxuICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICRkYXRhLmNvbXBvbmVudCB8fCAnc3YtYWN0aW9uLWJhci1pdGVtJywgcGFyYW1zOiB7IGl0ZW06ICRkYXRhIH0gfSAtLT5cXHJcXG4gICAgPCEtLSAva28gLS0+XFxyXFxuICAgIDwhLS0gL2tvIC0tPlxcclxcbiAgICA8IS0tIGtvIGlmOiAkZGF0YS50ZW1wbGF0ZSAgLS0+XFxyXFxuICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJGRhdGEudGVtcGxhdGUsIGRhdGE6ICRkYXRhLmRhdGEgfHwgJGRhdGEgfSAtLT5cXHJcXG4gICAgPCEtLSAva28gLS0+XFxyXFxuICAgIDwhLS0gL2tvIC0tPlxcclxcbjwvc3Bhbj5cIjsiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcclxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XHJcbmltcG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuLi8uLi9rb2Jhc2VcIjtcclxuXHJcbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vYWN0aW9uLmh0bWxcIik7XHJcblxyXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtYWN0aW9uXCIsIHtcclxuICAgIHZpZXdNb2RlbDoge1xyXG4gICAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaXRlbTogQWN0aW9uID0gcGFyYW1zLml0ZW07XHJcbiAgICAgICAgbmV3IEltcGxlbWVudG9yQmFzZShpdGVtKTtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICB0ZW1wbGF0ZTogdGVtcGxhdGUsXHJcbiAgfSk7XHJcbiAgIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1Dc3MoKVxcXCI+XFxuICAgIDxpbnB1dFxcbiAgICAgIHR5cGU9XFxcImNoZWNrYm94XFxcIlxcbiAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmNvbnRyb2wsIGF0dHI6IHtuYW1lOiBxdWVzdGlvbi5uYW1lLCBpZDogcXVlc3Rpb24uaW5wdXRJZCwgJ2FyaWEtcmVxdWlyZWQnOiBxdWVzdGlvbi5pc1JlcXVpcmVkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCwgJ2FyaWEtaW52YWxpZCc6IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwLCAnYXJpYS1kZXNjcmliZWRieSc6IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwID8gcXVlc3Rpb24uaWQgKyAnX2Vycm9ycycgOiBudWxsfSwgY2hlY2tlZDogcXVlc3Rpb24uY2hlY2tlZFZhbHVlLCBzdXJ2ZXlQcm9wOiB7aW5kZXRlcm1pbmF0ZTogcXVlc3Rpb24uaXNJbmRldGVybWluYXRlfSwgZW5hYmxlOiAhcXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5XFxcIlxcbiAgICAvPlxcbiAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5tYXRlcmlhbERlY29yYXRvclxcXCI+XFxuICAgICAgPHN2ZyB2aWV3Qm94PVxcXCIwIDAgMjQgMjRcXFwiIGRhdGEtYmluZD1cXFwiY3NzOnF1ZXN0aW9uLmtvQ3NzKCkuaXRlbURlY29yYXRvclxcXCI+XFxuICAgICAgICA8cmVjdFxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczpxdWVzdGlvbi5rb0NzcygpLnVuY2hlY2tlZFBhdGhcXFwiXFxuICAgICAgICAgIHg9XFxcIjVcXFwiXFxuICAgICAgICAgIHk9XFxcIjEwXFxcIlxcbiAgICAgICAgICB3aWR0aD1cXFwiMTRcXFwiXFxuICAgICAgICAgIGhlaWdodD1cXFwiNFxcXCJcXG4gICAgICAgIC8+XFxuICAgICAgICA8cG9seWdvblxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczpxdWVzdGlvbi5rb0NzcygpLmNoZWNrZWRQYXRoXFxcIlxcbiAgICAgICAgICBwb2ludHM9XFxcIjE5LDEwIDE0LDEwIDE0LDUgMTAsNSAxMCwxMCA1LDEwIDUsMTQgMTAsMTQgMTAsMTkgMTQsMTkgMTQsMTQgMTksMTQgXFxcIlxcbiAgICAgICAgLz5cXG4gICAgICAgIDxwYXRoXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOnF1ZXN0aW9uLmtvQ3NzKCkuaW5kZXRlcm1pbmF0ZVBhdGhcXFwiXFxuICAgICAgICAgIGQ9XFxcIk0yMiwwSDJDMC45LDAsMCwwLjksMCwydjIwYzAsMS4xLDAuOSwyLDIsMmgyMGMxLjEsMCwyLTAuOSwyLTJWMkMyNCwwLjksMjMuMSwwLDIyLDB6IE0yMSwxOEw2LDNoMTVWMTh6IE0zLDZsMTUsMTVIM1Y2elxcXCJcXG4gICAgICAgIC8+XFxuICAgICAgPC9zdmc+XFxuICAgICAgPHNwYW4gY2xhc3M9XFxcImNoZWNrXFxcIj48L3NwYW4+XFxuICAgIDwvc3Bhbj5cXG4gICAgPHNwYW5cXG4gICAgICBkYXRhLWJpbmQ9XFxcImlmOiBxdWVzdGlvbi50aXRsZUxvY2F0aW9uID09PSAnaGlkZGVuJywgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmxhYmVsXFxcIlxcbiAgICA+XFxuICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IHF1ZXN0aW9uLmxvY0Rpc3BsYXlMYWJlbCB9IC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L3NwYW4+XFxuICA8L2xhYmVsPlxcbjwvZGl2PlxcblwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUmVuZGVyZXJGYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vYm9vbGVhbi1jaGVja2JveC5odG1sXCIpO1xuXG5leHBvcnQgdmFyIENoZWNrYm94Vmlld01vZGVsOiBhbnk7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1ib29sZWFuLWNoZWNrYm94XCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHsgcXVlc3Rpb246IHBhcmFtcy5xdWVzdGlvbiB9O1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuXG5SZW5kZXJlckZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJSZW5kZXJlcihcbiAgXCJib29sZWFuXCIsXG4gIFwiY2hlY2tib3hcIixcbiAgXCJzdi1ib29sZWFuLWNoZWNrYm94XCJcbik7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGxhYmVsIGRhdGEtYmluZD1cXFwiY3NzOiBtb2RlbC5jc3MubGFiZWwsIGF0dHI6IHsgdGl0bGU6IG1vZGVsLmNhcHRpb24ua29SZW5kZXJlZEh0bWwgfVxcXCI+XFxyXFxuICA8aW5wdXQgdHlwZT1cXFwicmFkaW9cXFwiXFxyXFxuICAgIGRhdGEtYmluZD1cXFwiYXR0cjogeyBuYW1lOiBtb2RlbC5uYW1lLCBpZDogbW9kZWwuaWQsICdhcmlhLXJlcXVpcmVkJzogbW9kZWwuaXNSZXF1aXJlZCwgJ2FyaWEtbGFiZWwnOiBtb2RlbC5jYXB0aW9uLmtvUmVuZGVyZWRIdG1sLCByb2xlOiAncmFkaW8nLCAnYXJpYS1pbnZhbGlkJzogbW9kZWwuaGFzRXJyb3JzLCAnYXJpYS1kZXNjcmliZWRieSc6IG1vZGVsLmRlc2NyaWJlQnl9LCBjaGVja2VkVmFsdWU6IG1vZGVsLnZhbHVlLCBjaGVja2VkOiBtb2RlbC5xdWVzdGlvbi5yZW5kZXJlZFZhbHVlLCBkaXNhYmxlOiBtb2RlbC5yZWFkT25seSwgY3NzOiBtb2RlbC5jc3MuY29udHJvbFxcXCIgLz5cXHJcXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IG1vZGVsLmNzcy5kZWNvcmF0b3JcXFwiPlxcclxcbiAgICA8IS0tIGtvIGlmOiAhIW1vZGVsLmljb25OYW1lLS0+XFxyXFxuICAgIDxzdi1zdmctaWNvbiBkYXRhLWJpbmQ9XFxcImNzczogbW9kZWwuY3NzLmljb25cXFwiIHBhcmFtcz1cXFwiaWNvbk5hbWU6IG1vZGVsLmljb25OYW1lLCBzaXplOiBtb2RlbC5pY29uU2l6ZVxcXCI+PC9zdi1zdmctaWNvbj5cXHJcXG4gICAgPCEtLSAva28gLS0+XFxyXFxuICAgIDwhLS0ga28gaWY6IG1vZGVsLnNob3dDYXB0aW9uIC0tPlxcclxcbiAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogbW9kZWwuY3NzLmNhcHRpb24sIGF0dHI6IHsgdGl0bGU6IG1vZGVsLmNhcHRpb24ua29SZW5kZXJlZEh0bWwgfVxcXCI+XFxyXFxuICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IG1vZGVsLmNhcHRpb24gfSAtLT5cXHJcXG4gICAgICA8IS0tIC9rbyAtLT5cXHJcXG4gICAgPC9zcGFuPlxcclxcbiAgICA8IS0tIC9rbyAtLT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvbGFiZWw+XCI7IiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XHJcbmltcG9ydCB7IEJ1dHRvbkdyb3VwSXRlbU1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XHJcbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vYnV0dG9uLWdyb3VwLWl0ZW0uaHRtbFwiKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBCdXR0b25Hcm91cEl0ZW1WaWV3TW9kZWwge1xyXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgbW9kZWw6IEJ1dHRvbkdyb3VwSXRlbU1vZGVsKSB7fVxyXG59XHJcbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1idXR0b24tZ3JvdXAtaXRlbVwiLCB7XHJcbiAgdmlld01vZGVsOiB7XHJcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBtb2RlbCA9IG5ldyBCdXR0b25Hcm91cEl0ZW1Nb2RlbChcclxuICAgICAgICBwYXJhbXMucXVlc3Rpb24sXHJcbiAgICAgICAgcGFyYW1zLml0ZW0sXHJcbiAgICAgICAgcGFyYW1zLmluZGV4KClcclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgdmlld01vZGVsID0gbmV3IEJ1dHRvbkdyb3VwSXRlbVZpZXdNb2RlbChtb2RlbCk7XHJcbiAgICAgIHJldHVybiB2aWV3TW9kZWw7XHJcbiAgICB9LFxyXG4gIH0sXHJcbiAgdGVtcGxhdGU6IHRlbXBsYXRlLFxyXG59KTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi10aXRsZS1jb250ZW50JywgZGF0YTogZWxlbWVudCB9IC0tPjwhLS0va28tLT5cXG48IS0tIGtvIGlmOiBlbGVtZW50LmlzQ29sbGFwc2VkIHx8IGVsZW1lbnQuaXNFeHBhbmRlZCAtLT5cXG48c3BhblxcbiAgICBkYXRhLWJpbmQ9XFxcImNzczogZ2V0SWNvbkNsYXNzKCksIGV2ZW50OiB7IGtleXVwOiBlbGVtZW50LnRvZ2dsZVN0YXRlQnlLZXlVcCB9LCBhdHRyOnsnYXJpYS1leHBhbmRlZCc6IGVsZW1lbnQuaXNDb2xsYXBzZWQgPyAnZmFsc2UnOiAndHJ1ZSd9XFxcIlxcbiAgICB0YWJpbmRleD1cXFwiMFxcXCI+PC9zcGFuPlxcbjwhLS0gL2tvIC0tPlwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFJlbmRlcmVyRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUGFuZWwgfSBmcm9tIFwiLi4vLi4va29wYWdlXCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vZGVmYXVsdC10aXRsZS5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFRpdGxlVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IFF1ZXN0aW9uIHwgUGFuZWwpIHt9XG5cbiAgZ2V0SWNvbkNsYXNzKCkge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5lbGVtZW50O1xuICAgIHZhciBjc3NDbGFzc2VzID0gZWxlbWVudC5pc1BhbmVsXG4gICAgICA/IGVsZW1lbnQuY3NzQ2xhc3Nlcy5wYW5lbFxuICAgICAgOiBlbGVtZW50LmNzc0NsYXNzZXM7XG4gICAgcmV0dXJuIChcbiAgICAgIGNzc0NsYXNzZXMuaWNvbiArXG4gICAgICAoIWVsZW1lbnQuaXNDb2xsYXBzZWQgPyBcIiBcIiArIGNzc0NsYXNzZXMuaWNvbkV4cGFuZGVkIDogXCJcIilcbiAgICApO1xuICB9XG59XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1kZWZhdWx0LXRpdGxlXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0VGl0bGVWaWV3TW9kZWwocGFyYW1zLmVsZW1lbnQpO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuXG5SZW5kZXJlckZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJSZW5kZXJlcihcbiAgXCJlbGVtZW50XCIsXG4gIFwiZGVmYXVsdC10aXRsZVwiLFxuICBcInN2LWRlZmF1bHQtdGl0bGVcIlxuKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8dWwgY2xhc3M9XFxcInN2LWxpc3RcXFwiIGRhdGEtYmluZD1cXFwiZXZlbnQ6IHsgbW91c2Vkb3duOiBmdW5jdGlvbiAoZGF0YSwgZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IH0gfVxcXCI+XFxuICA8IS0ta28gZm9yZWFjaDogaXRlbXMtLT5cXG4gIDxsaSBjbGFzcz1cXFwic3YtbGlzdF9faXRlbVxcXCIgdGFiaW5kZXg9XFxcIjBcXFwiXFxuICAgIGRhdGEtYmluZD1cXFwic3R5bGU6IHsgcGFkZGluZ0xlZnQ6ICRwYXJlbnQuZ2V0SXRlbUluZGVudCgkZGF0YSkgfSwgY3NzOiB7ICdzdi1saXN0X19pdGVtLS1kaXNhYmxlZCc6ICRwYXJlbnQuaXNJdGVtRGlzYWJsZWQoJGRhdGEpLCAnc3YtbGlzdF9faXRlbS0tc2VsZWN0ZWQnOiAkcGFyZW50LmlzSXRlbVNlbGVjdGVkKCRkYXRhKSB9LCBjbGljazogJHBhcmVudC5zZWxlY3RJdGVtLCB2aXNpYmxlOiAkZGF0YS52aXNpYmxlID09PSB1bmRlZmluZWQgfHwgJGRhdGEudmlzaWJsZVxcXCI+XFxuICAgIDwhLS0ga28gaWY6ICRkYXRhLmljb25OYW1lIC0tPlxcbiAgICA8c3Ytc3ZnLWljb24gY2xhc3M9XFxcInN2LWxpc3RfX2l0ZW0taWNvblxcXCIgcGFyYW1zPVxcXCJpY29uTmFtZTogaWNvbk5hbWUsIHNpemU6IDI0XFxcIj48L3N2LXN2Zy1pY29uPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiAkZGF0YS50aXRsZVxcXCI+PC9zcGFuPlxcbiAgPC9saT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvdWw+XCI7IiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBMaXN0TW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuLi8uLi9rb2Jhc2VcIjtcblxuY29uc3QgdGVtcGxhdGUgPSByZXF1aXJlKFwiLi9saXN0Lmh0bWxcIik7XG5cbmV4cG9ydCB2YXIgTGlzdFZpZXdDb21wb25lbnQ6IGFueTtcblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2LWxpc3RcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogTGlzdE1vZGVsID0gcGFyYW1zLm1vZGVsO1xuICAgICAgbmV3IEltcGxlbWVudG9yQmFzZShtb2RlbCk7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLSBrbyB3aXRoOiBzdXJ2ZXkgLS0+XFxuPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogbG9nb0NsYXNzTmFtZXNcXFwiPlxcbiAgPGltZyBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmxvZ29JbWFnZSwgYXR0cjogeyBzcmM6IGxvY0xvZ28ua29SZW5kZXJlZEh0bWwsIHdpZHRoOiBsb2dvV2lkdGggPyBsb2dvV2lkdGggOiB1bmRlZmluZWQsIGhlaWdodDogbG9nb0hlaWdodCA/IGxvZ29IZWlnaHQgOiB1bmRlZmluZWQsIGFsdDogbG9jVGl0bGUucmVuZGVyZWRIdG1sIH0sIHN0eWxlOiB7IG9iamVjdEZpdDogbG9nb0ZpdCB9XFxcIj5cXG48L2Rpdj5cXG48IS0tIGtvIGlmOiBpc0xvZ29BZnRlciAtLT5cXG48ZGl2IGNsYXNzPVxcXCJzdi1sb2dvLS1yaWdodC10YWlsXFxcIj48L2Rpdj5cXG48IS0tIC9rbyAtLT5cXG48IS0tIC9rbyAtLT5cIjsiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmNvbnN0IHRlbXBsYXRlOiBzdHJpbmcgPSByZXF1aXJlKFwiLi9sb2dvLWltYWdlLmh0bWxcIik7XG5leHBvcnQgbGV0IExvZ29JbWFnZVZpZXdNb2RlbDogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtbG9nby1pbWFnZVwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55KSA9PiB7XG4gICAgICByZXR1cm4geyBzdXJ2ZXk6IHBhcmFtcyB9O1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZVxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGJ1dHRvblxcbnR5cGU9XFxcImJ1dHRvblxcXCJcXG5kYXRhLWJpbmQ9XFxcImNzczpxdWVzdGlvbi5nZXREZXRhaWxQYW5lbEJ1dHRvbkNzcyhyb3cpLCBjbGljazpyb3cuc2hvd0hpZGVEZXRhaWxQYW5lbENsaWNrLCBhdHRyOnsgJ2FyaWEtZXhwYW5kZWQnOiBxdWVzdGlvbi5nZXRJc0RldGFpbFBhbmVsU2hvd2luZygkZGF0YS5yb3cpID8gJ3RydWUnOiAnZmFsc2UnLCAnYXJpYS1jb250cm9scyc6IHF1ZXN0aW9uLmdldElzRGV0YWlsUGFuZWxTaG93aW5nKCRkYXRhLnJvdykgPyByb3cuZGV0YWlsUGFuZWxJZDogZmFsc2V9XFxcIlxcbj5cXG48c3BhblxcbiAgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldERldGFpbFBhbmVsSWNvbkNzcyhyb3cpXFxcIlxcbj48L3NwYW4+XFxuPC9idXR0b24+XFxuPCEtLSBrbyBpZjogcXVlc3Rpb24uZGV0YWlsUGFuZWxNb2RlID09PSBcXFwicG9wdXBcXFwiICYmIHF1ZXN0aW9uLmdldEtvUG9wdXBJc1Zpc2libGUocm93KSAtLT5cXG48c3YtcG9wdXBcXG5wYXJhbXM9XFxcImNvbnRlbnRDb21wb25lbnROYW1lOiAnc3YtcGFuZWwnLCBjb250ZW50Q29tcG9uZW50RGF0YTogeyBxdWVzdGlvbjogcm93LmRldGFpbFBhbmVsLCBvbkl0ZW1TZWxlY3Q6IGZ1bmN0aW9uKCl7fSB9LCBpc1Zpc2libGU6IHF1ZXN0aW9uLmdldEtvUG9wdXBJc1Zpc2libGUocm93KSwgaXNNb2RhbDogdHJ1ZSwgb25IaWRlOiBmdW5jdGlvbigpIHsgcm93LmhpZGVEZXRhaWxQYW5lbCgpIH0sIHZlcnRpY2FsUG9zaXRpb246ICd0b3AnLCBob3Jpem9udGFsUG9zaXRpb246ICdyaWdodCdcXFwiXFxuPjwvc3YtcG9wdXA+XFxuPCEtLSAva28gLS0+XCI7IiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vZGV0YWlsLWJ1dHRvbi5odG1sXCIpO1xuXG5leHBvcnQgdmFyIFN1cnZleVF1ZXN0aW9uTWF0cml4RGV0YWlsQnV0dG9uOiBhbnk7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1tYXRyaXgtZGV0YWlsLWJ1dHRvblwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBwYXJhbXMuaXRlbS5kYXRhO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmljb25EcmFnXFxcIj48L3NwYW4+XFxuXCI7IiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vZHJhZy1kcm9wLWljb24uaHRtbFwiKTtcblxuZXhwb3J0IHZhciBTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWNEcmFnRHJvcEljb246IGFueTtcblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2LW1hdHJpeC1kcmFnLWRyb3AtaWNvblwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBwYXJhbXMuaXRlbS5kYXRhO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxidXR0b25cXG4gIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gIGRhdGEtYmluZD1cXFwiY2xpY2s6IHF1ZXN0aW9uLmtvUmVtb3ZlUm93Q2xpY2ssIGRpc2FibGU6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbiArICcgJyArIHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uUmVtb3ZlXFxcIlxcbj5cXG4gIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBxdWVzdGlvbi5sb2NSZW1vdmVSb3dUZXh0IH0gLS0+PCEtLSAva28gLS0+XFxuICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pY29uUmVtb3ZlXFxcIj48L3NwYW4+XFxuPC9idXR0b24+XFxuXCI7IiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vcmVtb3ZlLWJ1dHRvbi5odG1sXCIpO1xuXG5leHBvcnQgdmFyIFN1cnZleVF1ZXN0aW9uTWF0cml4RHluYW1pY1JlbW92ZUJ1dHRvbjogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtbWF0cml4LXJlbW92ZS1idXR0b25cIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XG4gICAgICByZXR1cm4gcGFyYW1zLml0ZW0uZGF0YTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuY29uc3QgdGVtcGxhdGUgPSByZXF1aXJlKFwiaHRtbC1sb2FkZXI/aW50ZXJwb2xhdGUhdmFsLWxvYWRlciEuL3BhbmVsLmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBQYW5lbFZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWVzdGlvbjogUGFuZWxNb2RlbCwgcHVibGljIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7fVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtcGFuZWxcIiwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IGFueSwgY29tcG9uZW50SW5mbzogYW55KSA9PiB7XG4gICAgICBjb25zdCB2aWV3TW9kZWwgPSBuZXcgUGFuZWxWaWV3TW9kZWwoXG4gICAgICAgIHBhcmFtcy5xdWVzdGlvbixcbiAgICAgICAgY29tcG9uZW50SW5mby5lbGVtZW50LnBhcmVudEVsZW1lbnRcbiAgICAgICk7XG4gICAgICByZXR1cm4gdmlld01vZGVsO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBQb3B1cE1vZGVsLCBQb3B1cEJhc2VWaWV3TW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuLi8uLi9rb2Jhc2VcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vcG9wdXAuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFBvcHVwVmlld01vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBvcHVwVmlld01vZGVsOiBQb3B1cEJhc2VWaWV3TW9kZWwpIHtcbiAgICBwb3B1cFZpZXdNb2RlbC5pbml0aWFsaXplUG9wdXBDb250YWluZXIoKTtcbiAgICBuZXcgSW1wbGVtZW50b3JCYXNlKHBvcHVwVmlld01vZGVsLm1vZGVsKTtcbiAgICBuZXcgSW1wbGVtZW50b3JCYXNlKHBvcHVwVmlld01vZGVsKTtcbiAgICBwb3B1cFZpZXdNb2RlbC5jb250YWluZXIuaW5uZXJIVE1MID0gdGVtcGxhdGU7XG4gICAgcG9wdXBWaWV3TW9kZWwubW9kZWwub25WaXNpYmlsaXR5Q2hhbmdlZCA9IChpc1Zpc2libGU6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmIChpc1Zpc2libGUpIHtcbiAgICAgICAga28udGFza3MucnVuRWFybHkoKTtcbiAgICAgICAgcG9wdXBWaWV3TW9kZWwudXBkYXRlT25TaG93aW5nKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBrby5hcHBseUJpbmRpbmdzKHBvcHVwVmlld01vZGVsLCBwb3B1cFZpZXdNb2RlbC5jb250YWluZXIpO1xuICB9XG4gIGRpc3Bvc2UoKSB7XG4gICAga28uY2xlYW5Ob2RlKHRoaXMucG9wdXBWaWV3TW9kZWwuY29udGFpbmVyKTtcbiAgICB0aGlzLnBvcHVwVmlld01vZGVsLmRlc3Ryb3lQb3B1cENvbnRhaW5lcigpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG93TW9kYWwoXG4gIGNvbXBvbmVudE5hbWU6IHN0cmluZyxcbiAgZGF0YTogYW55LFxuICBvbkFwcGx5OiAoKSA9PiBib29sZWFuLFxuICBvbkNhbmNlbD86ICgpID0+IHZvaWRcbikge1xuICBjb25zdCBwb3B1cE1vZGVsID0gbmV3IFBvcHVwTW9kZWwoXG4gICAgY29tcG9uZW50TmFtZSxcbiAgICBkYXRhLFxuICAgIFwidG9wXCIsXG4gICAgXCJsZWZ0XCIsXG4gICAgZmFsc2UsXG4gICAgdHJ1ZSxcbiAgICBvbkNhbmNlbCxcbiAgICBvbkFwcGx5XG4gICk7XG4gIGNvbnN0IHBvcHVwVmlld01vZGVsOiBQb3B1cEJhc2VWaWV3TW9kZWwgPSBuZXcgUG9wdXBCYXNlVmlld01vZGVsKFxuICAgIHBvcHVwTW9kZWwsXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIHZhciB2aWV3TW9kZWwgPSBuZXcgUG9wdXBWaWV3TW9kZWwocG9wdXBWaWV3TW9kZWwpO1xuICBwb3B1cE1vZGVsLm9uSGlkZSA9ICgpID0+IHtcbiAgICB2aWV3TW9kZWwuZGlzcG9zZSgpO1xuICB9O1xuICBwb3B1cFZpZXdNb2RlbC5tb2RlbC5pc1Zpc2libGUgPSB0cnVlO1xufVxuXG5zZXR0aW5ncy5zaG93TW9kYWwgPSBzaG93TW9kYWw7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1wb3B1cFwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdNb2RlbCA9IG5ldyBQb3B1cEJhc2VWaWV3TW9kZWwoXG4gICAgICAgIGtvLnVud3JhcChwYXJhbXMubW9kZWwpLFxuICAgICAgICBjb21wb25lbnRJbmZvLmVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgUG9wdXBWaWV3TW9kZWwodmlld01vZGVsKTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogXCI8ZGl2PjwvZGl2PlwiLFxufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQcm9ncmVzc0J1dHRvbnNNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuY29uc3QgdGVtcGxhdGU6IGFueSA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vYnV0dG9ucy5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3NCdXR0b25zVmlld01vZGVsIHtcbiAgcHJpdmF0ZSBwcm9ncmVzc0J1dHRvbnNNb2RlbDogU3VydmV5UHJvZ3Jlc3NCdXR0b25zTW9kZWw7XG4gIHByaXZhdGUgc2Nyb2xsQnV0dG9uQ3NzS286IGFueSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBoYXNTY3JvbGxlcjogYW55ID0ga28ub2JzZXJ2YWJsZShmYWxzZSk7XG4gIHByaXZhdGUgdXBkYXRlU2Nyb2xsZXI6IGFueSA9IHVuZGVmaW5lZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RlbDogU3VydmV5TW9kZWwsIGVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMucHJvZ3Jlc3NCdXR0b25zTW9kZWwgPSBuZXcgU3VydmV5UHJvZ3Jlc3NCdXR0b25zTW9kZWwobW9kZWwpO1xuICAgIHRoaXMudXBkYXRlU2Nyb2xsZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBsZXQgbGlzdENvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcIi5cIiArIG1vZGVsLmNzcy5wcm9ncmVzc0J1dHRvbnNMaXN0Q29udGFpbmVyXG4gICAgICApO1xuICAgICAgaWYgKCEhbGlzdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5oYXNTY3JvbGxlcihcbiAgICAgICAgICBsaXN0Q29udGFpbmVyRWxlbWVudC5zY3JvbGxXaWR0aCA+IGxpc3RDb250YWluZXJFbGVtZW50Lm9mZnNldFdpZHRoXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuICBwdWJsaWMgaXNMaXN0RWxlbWVudENsaWNrYWJsZShpbmRleDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3NCdXR0b25zTW9kZWwuaXNMaXN0RWxlbWVudENsaWNrYWJsZShpbmRleCgpKTtcbiAgfVxuICBwdWJsaWMgZ2V0TGlzdEVsZW1lbnRDc3MoaW5kZXg6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3NCdXR0b25zTW9kZWwuZ2V0TGlzdEVsZW1lbnRDc3MoaW5kZXgoKSk7XG4gIH1cbiAgcHVibGljIGNsaWNrTGlzdEVsZW1lbnQoaW5kZXg6IGFueSk6IHZvaWQge1xuICAgIHRoaXMucHJvZ3Jlc3NCdXR0b25zTW9kZWwuY2xpY2tMaXN0RWxlbWVudChpbmRleCgpKTtcbiAgfVxuICBwdWJsaWMgZ2V0U2Nyb2xsQnV0dG9uQ3NzKGlzTGVmdFNjcm9sbDogYm9vbGVhbik6IGFueSB7XG4gICAgdGhpcy5zY3JvbGxCdXR0b25Dc3NLbyA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGxldCBzY3JvbGxDc3M6IHN0cmluZyA9IGlzTGVmdFNjcm9sbFxuICAgICAgICA/IHRoaXMubW9kZWwuY3NzLnByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uTGVmdFxuICAgICAgICA6IHRoaXMubW9kZWwuY3NzLnByb2dyZXNzQnV0dG9uc0ltYWdlQnV0dG9uUmlnaHQ7XG4gICAgICBpZiAoIXRoaXMuaGFzU2Nyb2xsZXIoKSlcbiAgICAgICAgc2Nyb2xsQ3NzICs9IFwiIFwiICsgdGhpcy5tb2RlbC5jc3MucHJvZ3Jlc3NCdXR0b25zSW1hZ2VCdXR0b25IaWRkZW47XG4gICAgICByZXR1cm4gc2Nyb2xsQ3NzO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnNjcm9sbEJ1dHRvbkNzc0tvO1xuICB9XG4gIHB1YmxpYyBjbGlja1Njcm9sbEJ1dHRvbihcbiAgICBsaXN0Q29udGFpbmVyRWxlbWVudDogRWxlbWVudCxcbiAgICBpc0xlZnRTY3JvbGw6IGJvb2xlYW5cbiAgKTogdm9pZCB7XG4gICAgbGlzdENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsTGVmdCArPSAoaXNMZWZ0U2Nyb2xsID8gLTEgOiAxKSAqIDcwO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgdGhpcy51cGRhdGVTY3JvbGxlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVNjcm9sbGVyKTtcbiAgICAgIHRoaXMudXBkYXRlU2Nyb2xsZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5zY3JvbGxCdXR0b25Dc3NLbyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5zY3JvbGxCdXR0b25Dc3NLby5kaXNwb3NlKCk7XG4gICAgICB0aGlzLnNjcm9sbEJ1dHRvbkNzc0tvID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtcHJvZ3Jlc3MtYnV0dG9uc1wiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvZ3Jlc3NCdXR0b25zVmlld01vZGVsKFxuICAgICAgICBwYXJhbXMubW9kZWwsXG4gICAgICAgIGNvbXBvbmVudEluZm8uZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICAgICk7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlLFxufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi9wcm9ncmVzcy5odG1sXCIpO1xuZXhwb3J0IHZhciBwcm9ncmVzc1Byb2dyZXNzVmlld01vZGVsOiBhbnkgPSBmdW5jdGlvbihwYXJhbXM6IGFueSkge1xuICByZXR1cm4geyBtb2RlbDogcGFyYW1zLm1vZGVsIH07XG59O1xua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN2LXByb2dyZXNzLXByb2dyZXNzXCIsIHtcbiAgdmlld01vZGVsOiBwcm9ncmVzc1Byb2dyZXNzVmlld01vZGVsLFxuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG59KTtcblxuY29uc3QgdGVtcGxhdGVCcmlkZ2UgPVxuICBcIjwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICdzdi1wcm9ncmVzcy1wcm9ncmVzcycsIHBhcmFtczogJGRhdGEgfSAtLT48IS0tIC9rbyAtLT5cIjtcbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1wcm9ncmVzcy1wYWdlc1wiLCB7XG4gIHZpZXdNb2RlbDogcHJvZ3Jlc3NQcm9ncmVzc1ZpZXdNb2RlbCxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlQnJpZGdlLFxufSk7XG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtcHJvZ3Jlc3MtcXVlc3Rpb25zXCIsIHtcbiAgdmlld01vZGVsOiBwcm9ncmVzc1Byb2dyZXNzVmlld01vZGVsLFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVCcmlkZ2UsXG59KTtcbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1wcm9ncmVzcy1jb3JyZWN0UXVlc3Rpb25zXCIsIHtcbiAgdmlld01vZGVsOiBwcm9ncmVzc1Byb2dyZXNzVmlld01vZGVsLFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVCcmlkZ2UsXG59KTtcbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1wcm9ncmVzcy1yZXF1aXJlZFF1ZXN0aW9uc1wiLCB7XG4gIHZpZXdNb2RlbDogcHJvZ3Jlc3NQcm9ncmVzc1ZpZXdNb2RlbCxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlQnJpZGdlLFxufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPCEtLSA8aW5wdXQgY2xhc3M9XFxcInN2LXN0cmluZy1lZGl0b3JcXFwiIGRhdGEtYmluZD1cXFwidmFsdWU6IGVkaXRWYWx1ZVxcXCIgLz4gLS0+XFxuXFxuPCEtLSBrbyBpZm5vdDoga29IYXNIdG1sIC0tPlxcbjxzcGFuIGNsYXNzPVxcXCJzdi1zdHJpbmctZWRpdG9yXFxcIiBzdHlsZT1cXFwicG9zaXRpb246IHN0YXRpYztcXFwiIGRhdGEtYmluZD1cXFwidGV4dDogZWRpdFZhbHVlLCBldmVudDogeyBibHVyOiBvbklucHV0LCBjbGljazogb25DbGljaywgY2xpY2tCdWJibGU6IGZhbHNlIH1cXFwiIGNvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcbjwhLS0gL2tvIC0tPlxcbjwhLS0ga28gaWY6IGtvSGFzSHRtbCAtLT5cXG48c3BhbiBjbGFzcz1cXFwic3Ytc3RyaW5nLWVkaXRvclxcXCIgc3R5bGU9XFxcInBvc2l0aW9uOiBzdGF0aWM7XFxcIiBkYXRhLWJpbmQ9XFxcImh0bWw6IGVkaXRWYWx1ZSwgZXZlbnQ6IHsgYmx1cjogb25JbnB1dCwgY2xpY2s6IG9uQ2xpY2ssIGNsaWNrQnViYmxlOiBmYWxzZSB9XFxcIiBjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiPjwvc3Bhbj5cXG48IS0tIC9rbyAtLT5cIjsiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL3N0cmluZy1lZGl0b3IuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFN0cmluZ0VkaXRvclZpZXdNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBsb2NTdHJpbmc6IGFueSkge31cbiAgZ2V0IGtvSGFzSHRtbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NTdHJpbmcua29IYXNIdG1sKCk7XG4gIH1cbiAgZ2V0IGVkaXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NTdHJpbmcua29SZW5kZXJlZEh0bWwoKTtcbiAgfVxuICBzZXQgZWRpdFZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy5sb2NTdHJpbmcuc2VhcmNoRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxvY1N0cmluZy50ZXh0ID0gdmFsdWU7XG4gIH1cbiAgb25JbnB1dChzZW5kZXI6IFN0cmluZ0VkaXRvclZpZXdNb2RlbCwgZXZlbnQ6IGFueSkge1xuICAgIHNlbmRlci5lZGl0VmFsdWUgPSBldmVudC50YXJnZXQuaW5uZXJUZXh0O1xuICB9XG4gIG9uQ2xpY2soc2VuZGVyOiBTdHJpbmdFZGl0b3JWaWV3TW9kZWwsIGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMubG9jU3RyaW5nLm9uU2VhcmNoQ2hhbmdlZCA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTZWFyY2hFbGVtZW50KGVsZW1lbnQ6IGFueSk6IGFueSB7XG4gIHdoaWxlICghIWVsZW1lbnQgJiYgZWxlbWVudC5ub2RlTmFtZSAhPT0gXCJTUEFOXCIpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgIFwic3Ytc3RyaW5nLWVkaXRvclwiXG4gICAgKTtcbiAgICBlbGVtZW50ID0gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuICB9XG4gIGlmICghIWVsZW1lbnQgJiYgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHJldHVybiBlbGVtZW50O1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVzZXRMb2NhbGl6YXRpb25TcGFuKGVsZW1lbnQ6IGFueSwgbG9jU3RyOiBhbnkpIHtcbiAgd2hpbGUgKGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmNoaWxkTm9kZXNbMV0pO1xuICB9XG4gIGVsZW1lbnQuY2hpbGROb2Rlc1swXS50ZXh0Q29udGVudCA9IGxvY1N0ci5yZW5kZXJlZEh0bWw7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TG9jU3RyT25TZWFyY2hDaGFuZ2VkKGVsZW1lbnQ6IGFueSwgbG9jU3RyOiBhbnkpIHtcbiAgbG9jU3RyLm9uU2VhcmNoQ2hhbmdlZCA9ICgpID0+IHtcbiAgICBpZiAobG9jU3RyLnNlYXJjaEVsZW1lbnQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsb2NTdHIuc2VhcmNoRWxlbWVudCA9IGdldFNlYXJjaEVsZW1lbnQoZWxlbWVudCk7XG4gICAgfVxuICAgIGlmIChsb2NTdHIuc2VhcmNoRWxlbWVudCA9PSBudWxsKSByZXR1cm47XG4gICAgY29uc3QgZWwgPSBsb2NTdHIuc2VhcmNoRWxlbWVudDtcbiAgICBpZiAoIWxvY1N0ci5oaWdobGlnaHREaXYpIHtcbiAgICAgIGxvY1N0ci5oaWdobGlnaHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIGxvY1N0ci5oaWdobGlnaHREaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJsaWdodGdyYXlcIjtcbiAgICB9XG4gICAgaWYgKGxvY1N0ci5zZWFyY2hJbmRleCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc2V0TG9jYWxpemF0aW9uU3BhbihlbCwgbG9jU3RyKTtcbiAgICAgIGNvbnN0IHJuZzogUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgcm5nLnNldFN0YXJ0KGVsLmNoaWxkTm9kZXNbMF0sIGxvY1N0ci5zZWFyY2hJbmRleCk7XG4gICAgICBybmcuc2V0RW5kKFxuICAgICAgICBlbC5jaGlsZE5vZGVzWzBdLFxuICAgICAgICBsb2NTdHIuc2VhcmNoSW5kZXggKyBsb2NTdHIuc2VhcmNoVGV4dC5sZW5ndGhcbiAgICAgICk7XG4gICAgICBybmcuc3Vycm91bmRDb250ZW50cyhsb2NTdHIuaGlnaGxpZ2h0RGl2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXRMb2NhbGl6YXRpb25TcGFuKGVsLCBsb2NTdHIpO1xuICAgICAgbG9jU3RyLnNlYXJjaEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xufVxuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKExvY2FsaXphYmxlU3RyaW5nLmVkaXRhYmxlUmVuZGVyZXIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkgPT4ge1xuICAgICAgY29uc3QgbG9jU3RyID0gcGFyYW1zLmxvY1N0cmluZztcbiAgICAgIGFwcGx5TG9jU3RyT25TZWFyY2hDaGFuZ2VkKGNvbXBvbmVudEluZm8uZWxlbWVudCwgbG9jU3RyKTtcbiAgICAgIHJldHVybiBuZXcgU3RyaW5nRWRpdG9yVmlld01vZGVsKGxvY1N0cik7XG4gICAgfSxcbiAgfSxcbiAgdGVtcGxhdGU6IHRlbXBsYXRlXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tIGtvIGlmbm90OiBrb0hhc0h0bWwgLS0+XFxuPHNwYW4gc3R5bGU9XFxcInBvc2l0aW9uOiBzdGF0aWM7XFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6IGtvUmVuZGVyZWRIdG1sXFxcIj48L3NwYW4+XFxuPCEtLSAva28gLS0+XFxuPCEtLSBrbyBpZjoga29IYXNIdG1sIC0tPlxcbjxzcGFuIHN0eWxlPVxcXCJwb3NpdGlvbjogc3RhdGljO1xcXCIgZGF0YS1iaW5kPVxcXCJodG1sOiBrb1JlbmRlcmVkSHRtbFxcXCI+PC9zcGFuPlxcbjwhLS0gL2tvIC0tPlwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuY29uc3QgdGVtcGxhdGUgPSByZXF1aXJlKFwiLi9zdHJpbmctdmlld2VyLmh0bWxcIik7XG5leHBvcnQgdmFyIFN0cmluZ1ZpZXdlclZpZXdNb2RlbDogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3Ytc3RyaW5nLXZpZXdlclwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBwYXJhbXMubG9jU3RyaW5nO1xuICAgIH0sXG4gIH0sXG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzdmcgY2xhc3M9XFxcInN2LXN2Zy1pY29uXFxcIiByb2xlPVxcXCJpbWdcXFwiPjx1c2U+PC91c2U+PC9zdmc+XFxuXCI7IiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBjcmVhdGVTdmcgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vc3ZnLWljb24uaHRtbFwiKTtcblxuZXhwb3J0IHZhciBTdmdJY29uVmlld01vZGVsOiBhbnk7XG5cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJzdi1zdmctaWNvblwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY3JlYXRlU3ZnKFxuICAgICAgICAgIGtvLnVud3JhcChwYXJhbXMuc2l6ZSksXG4gICAgICAgICAga28udW53cmFwKHBhcmFtcy53aWR0aCksXG4gICAgICAgICAga28udW53cmFwKHBhcmFtcy5oZWlnaHQpLFxuICAgICAgICAgIGtvLnVud3JhcChwYXJhbXMuaWNvbk5hbWUpLFxuICAgICAgICAgIGNvbXBvbmVudEluZm8uZWxlbWVudC5jaGlsZE5vZGVzWzBdXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tIGtvIGlmOiB0ZW1wbGF0ZURhdGEubmFtZSAtLT5cXG4gIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogdGVtcGxhdGVEYXRhLm5hbWUsIGRhdGE6IHRlbXBsYXRlRGF0YS5kYXRhLCBhZnRlclJlbmRlcjogdGVtcGxhdGVEYXRhLmFmdGVyUmVuZGVyIH0gLS0+XFxuICA8IS0tIC9rbyAtLT5cXG48IS0tIC9rbyAtLT5cXG48IS0tIGtvIGlmbm90OiB0ZW1wbGF0ZURhdGEubmFtZSAtLT5cXG4gIDwhLS0ga28gdGVtcGxhdGU6IHsgbm9kZXM6IHRlbXBsYXRlRGF0YS5ub2RlcyB8fCAkY29tcG9uZW50VGVtcGxhdGVOb2RlcywgZGF0YTogdGVtcGxhdGVEYXRhLmRhdGEsIGFmdGVyUmVuZGVyOiB0ZW1wbGF0ZURhdGEuYWZ0ZXJSZW5kZXIgfSAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwhLS0gL2tvIC0tPlxcblwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vLi4vLi4vc3VydmV5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlUZW1wbGF0ZVJlbmRlcmVyVmlld01vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL3RlbXBsYXRlLXJlbmRlcmVyXCI7XG5cbmNvbnN0IHRlbXBsYXRlID0gcmVxdWlyZShcIi4vdGVtcGxhdGUtcmVuZGVyZXIuaHRtbFwiKTtcblxua28uY29tcG9uZW50cy5yZWdpc3RlcihTdXJ2ZXlNb2RlbC5UZW1wbGF0ZVJlbmRlcmVyQ29tcG9uZW50TmFtZSwge1xuICB2aWV3TW9kZWw6IHtcbiAgICBjcmVhdGVWaWV3TW9kZWw6IChwYXJhbXM6IFN1cnZleVRlbXBsYXRlUmVuZGVyZXJWaWV3TW9kZWwpID0+IHtcbiAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfVxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGVcbn0pOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJzdi10aXRsZS1hY3Rpb25zXFxcIj5cXG4gIDxzcGFuIGNsYXNzPVxcXCJzdi10aXRsZS1hY3Rpb25zX190aXRsZVxcXCI+XFxuICAgIDwhLS0ga28gaWY6IGVsZW1lbnQuaXNQYWdlIC0tPlxcbiAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogZWxlbWVudC5sb2NUaXRsZSB9IC0tPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSAva28tLT5cXG4gICAgPCEtLSBrbyBpZjogIWVsZW1lbnQuaXNQYWdlIC0tPlxcbiAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tdGl0bGUtY29udGVudCcsIGRhdGE6IGVsZW1lbnQgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgPCEtLSAva28tLT5cXG4gIDwvc3Bhbj5cXG4gIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICdzdi1hY3Rpb24tYmFyJywgcGFyYW1zOiB7IG1vZGVsOiB0b29sYmFyIH0gfSAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvZGl2PlxcblwiOyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgSVN1cnZleUVsZW1lbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFJlbmRlcmVyRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5jb25zdCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuL3RpdGxlLWFjdGlvbnMuaHRtbFwiKTtcblxuZXhwb3J0IHZhciBUaXRsZUFjdGlvblZpZXdNb2RlbDogYW55O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3YtdGl0bGUtYWN0aW9uc1wiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogKHBhcmFtczogYW55LCBjb21wb25lbnRJbmZvOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQ6IElTdXJ2ZXlFbGVtZW50ID0gcGFyYW1zLmVsZW1lbnQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICB0b29sYmFyOiBlbGVtZW50LmdldFRpdGxlVG9vbGJhcigpLFxuICAgICAgfTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG59KTtcblxuUmVuZGVyZXJGYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUmVuZGVyZXIoXG4gIFwiZWxlbWVudFwiLFxuICBcInRpdGxlLWFjdGlvbnNcIixcbiAgXCJzdi10aXRsZS1hY3Rpb25zXCJcbik7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFN1cnZleVdpbmRvd01vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU3VydmV5IH0gZnJvbSBcIi4va29zdXJ2ZXlcIjtcbnZhciBrb1RlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi90ZW1wbGF0ZXMvd2luZG93L3dpbmRvdy5odG1sXCIpO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5V2luZG93IGV4dGVuZHMgU3VydmV5V2luZG93TW9kZWwge1xuICBrb0V4cGFuZGVkOiBhbnk7XG4gIGtvRXhwYW5kZWRDc3M6IGFueTtcbiAgZG9FeHBhbmQ6IGFueTtcbiAgY29uc3RydWN0b3IoanNvbk9iajogYW55ID0gbnVsbCwgaW5pdGlhbE1vZGVsOiBTdXJ2ZXlNb2RlbCA9IG51bGwpIHtcbiAgICBzdXBlcihqc29uT2JqLCBpbml0aWFsTW9kZWwpO1xuICAgIHRoaXMua29FeHBhbmRlZCA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICAgIHRoaXMua29FeHBhbmRlZENzcyA9IGtvLm9ic2VydmFibGUodGhpcy5nZXRCdXR0b25Dc3MoKSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmtvRXhwYW5kZWQoc2VsZi5pc0V4cGFuZGVkKTtcbiAgICAgIHNlbGYua29FeHBhbmRlZENzcyhzZWxmLmdldEJ1dHRvbkNzcygpKTtcbiAgICB9O1xuICAgIHRoaXMuc2hvd2luZ0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuZG9TaG93aW5nQ2hhbmdlZCgpO1xuICAgIH07XG4gICAgdGhpcy5kb0V4cGFuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuY2hhbmdlRXhwYW5kZWQoKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXkoanNvbk9iajogYW55KTogU3VydmV5TW9kZWwge1xuICAgIHJldHVybiBuZXcgU3VydmV5KGpzb25PYmopO1xuICB9XG4gIHByb3RlY3RlZCBjbG9zZVdpbmRvd09uQ29tcGxldGUoKSB7XG4gICAgdGhpcy5oaWRlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFsdWUgPyB0aGlzLnRlbXBsYXRlVmFsdWUgOiB0aGlzLmdldERlZmF1bHRUZW1wbGF0ZSgpO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgdGVtcGxhdGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBkb1Nob3dpbmdDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzU2hvd2luZykge1xuICAgICAgdGhpcy53aW5kb3dFbGVtZW50LmlubmVySFRNTCA9IHRoaXMudGVtcGxhdGU7XG4gICAgICBrby5jbGVhbk5vZGUodGhpcy53aW5kb3dFbGVtZW50KTtcbiAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcywgdGhpcy53aW5kb3dFbGVtZW50KTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy53aW5kb3dFbGVtZW50KTtcbiAgICAgICg8U3VydmV5PnRoaXMuc3VydmV5KS5yZW5kZXIoU3VydmV5V2luZG93LnN1cnZleUVsZW1lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLndpbmRvd0VsZW1lbnQpO1xuICAgICAgdGhpcy53aW5kb3dFbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4ga29UZW1wbGF0ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzcygpOiBhbnkge1xuICAgIHJldHVybiAoPGFueT50aGlzKS5zdXJ2ZXlbXCJjc3NcIl07XG4gIH1cbiAgcHJpdmF0ZSBjaGFuZ2VFeHBhbmRlZCgpIHtcbiAgICB0aGlzLmV4cGFuZGNvbGxhcHNlKCF0aGlzLmlzRXhwYW5kZWQpO1xuICB9XG4gIHByaXZhdGUgZ2V0QnV0dG9uQ3NzKCkge1xuICAgIHJldHVybiB0aGlzLmtvRXhwYW5kZWQoKVxuICAgICAgPyB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkNvbGxhcHNlZFxuICAgICAgOiB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkV4cGFuZGVkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIEltcGxlbWVudG9yQmFzZSB7XG4gIHByaXZhdGUgc3RhdGljIGRvSXRlcmF0ZVByb3BlcnRpZXMoZWxlbWVudDogQmFzZSwgaGFzaDogYW55LCBrZXk6IGFueSk6IGFueSB7XG4gICAgdmFyIHZhbCA9IGhhc2hba2V5XTtcbiAgICBpZiAodmFsID09PSBcImZ1bmN0aW9uXCIpIHJldHVybjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBoYXNoW2tleV0gPSBrby5vYnNlcnZhYmxlQXJyYXkodmFsKTtcbiAgICAgICg8YW55PnZhbClbXCJvbkFycmF5Q2hhbmdlZFwiXSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNMb2FkaW5nRnJvbUpzb24gfHwgZWxlbWVudC5pc0Rpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgIGhhc2hba2V5XS5ub3RpZnlTdWJzY3JpYmVycygpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZSh2YWwpO1xuICAgIH1cbiAgfVxuICByZWFkb25seSBpbXBsZW1lbnRlZE1hcmsgPSBcIl9fc3VydmV5SW1wbGVtZW50ZWRLb1wiO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogQmFzZSkge1xuICAgIGlmICgoPGFueT5lbGVtZW50KVt0aGlzLmltcGxlbWVudGVkTWFya10pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudC5pdGVyYXRlUHJvcGVydGllc0hhc2goKGhhc2gsIGtleSkgPT4ge1xuICAgICAgSW1wbGVtZW50b3JCYXNlLmRvSXRlcmF0ZVByb3BlcnRpZXMoZWxlbWVudCwgaGFzaCwga2V5KTtcbiAgICB9KTtcbiAgICBlbGVtZW50LmNyZWF0ZUFycmF5Q29yZUhhbmRsZXIgPSAoaGFzaCwga2V5OiBzdHJpbmcpOiBBcnJheTxhbnk+ID0+IHtcbiAgICAgIHZhciByZXMgPSBrby5vYnNlcnZhYmxlQXJyYXkoKTtcbiAgICAgICg8YW55PnJlcygpKVtcIm9uQXJyYXlDaGFuZ2VkXCJdID0gKCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5pc0xvYWRpbmdGcm9tSnNvbiB8fCBlbGVtZW50LmlzRGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgcmVzLm5vdGlmeVN1YnNjcmliZXJzKCk7XG4gICAgICB9O1xuICAgICAgaGFzaFtrZXldID0gcmVzO1xuXG4gICAgICByZXR1cm4gcmVzKCk7XG4gICAgfTtcbiAgICBlbGVtZW50LmdldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlciA9IChoYXNoLCBrZXkpID0+IHtcbiAgICAgIGlmIChoYXNoW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBoYXNoW2tleV0gPSBrby5vYnNlcnZhYmxlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIGhhc2hba2V5XSA9PT0gXCJmdW5jdGlvblwiID8gaGFzaFtrZXldKCkgOiBoYXNoW2tleV07XG4gICAgfTtcbiAgICBlbGVtZW50LnNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlciA9IChoYXNoLCBrZXksIHZhbCkgPT5cbiAgICAgIGhhc2hba2V5XSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gaGFzaFtrZXldKHZhbClcbiAgICAgICAgOiAoaGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZSh2YWwpKTtcbiAgICAoPGFueT5lbGVtZW50KVt0aGlzLmltcGxlbWVudGVkTWFya10gPSB0cnVlO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuZWxlbWVudC5pdGVyYXRlUHJvcGVydGllc0hhc2goKGhhc2gsIGtleSkgPT4ge1xuICAgICAgZGVsZXRlIGhhc2hba2V5XTtcbiAgICB9KTtcbiAgICB0aGlzLmVsZW1lbnQuY3JlYXRlQXJyYXlDb3JlSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVsZW1lbnQuZ2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZWxlbWVudC5zZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgZGVsZXRlICg8YW55PnRoaXMuZWxlbWVudClbdGhpcy5pbXBsZW1lbnRlZE1hcmtdO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IEZsb3dQYW5lbE1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSW1wbGVtZW50b3JCYXNlIH0gZnJvbSBcIi4va29iYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBGbG93UGFuZWwgZXh0ZW5kcyBGbG93UGFuZWxNb2RlbCB7XG4gIGtvRWxlbWVudFR5cGU6IGFueTtcbiAga29FbGVtZW50QWZ0ZXJSZW5kZXI6IGFueTtcbiAgcGxhY2VIb2xkZXI6IHN0cmluZztcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMua29FbGVtZW50VHlwZSA9IGtvLm9ic2VydmFibGUoXCJzdXJ2ZXktZmxvd3BhbmVsXCIpO1xuICAgIG5ldyBJbXBsZW1lbnRvckJhc2UodGhpcyk7XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29FbGVtZW50QWZ0ZXJSZW5kZXIgPSBmdW5jdGlvbiAoZWw6IGFueSwgY29uOiBhbnkpIHtcbiAgICAgIHJldHVybiBzZWxmLmVsZW1lbnRBZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge31cbiAgcHJvdGVjdGVkIGdldEh0bWxGb3JRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAnPHNwYW4gcXVlc3Rpb249XCJ0cnVlXCIgY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIiBpZD1cImZsb3dwYW5lbF8nICtcbiAgICAgIHF1ZXN0aW9uLm5hbWUgK1xuICAgICAgJ1wiPjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogXCJzdXJ2ZXktZmxvd3BhbmVsLXF1ZXN0aW9uXCIsIGRhdGE6IFwiJyArXG4gICAgICBxdWVzdGlvbi5uYW1lICtcbiAgICAgICdcIn0gLS0+PCEtLSAva28gLS0+PC9zcGFuPidcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZWxlbWVudEFmdGVyUmVuZGVyKGVsZW1lbnRzOiBhbnksIGNvbjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgaWYgKCEhZWwpIHtcbiAgICAgIHRoaXMuc3VydmV5LmFmdGVyUmVuZGVyUXVlc3Rpb24oY29uLCBlbCk7XG4gICAgfVxuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJmbG93cGFuZWxcIiwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IEZsb3dQYW5lbCgpO1xufSk7XG4vKlxuRWxlbWVudEZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJFbGVtZW50KFwiZmxvd3BhbmVsXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IEZsb3dQYW5lbChuYW1lKTtcbn0pO1xuKi9cbmtvLmNvbXBvbmVudHMucmVnaXN0ZXIoXCJmLXBhbmVsXCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiBmdW5jdGlvbiAocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHF1ZXN0aW9uID0ga28udW53cmFwKHBhcmFtcy5xdWVzdGlvbik7XG4gICAgICBzZWxmLmVsZW1lbnQgPSBjb21wb25lbnRJbmZvLmVsZW1lbnQ7XG4gICAgICBzZWxmLmVsZW1lbnQuaW5uZXJIVE1MID0gcXVlc3Rpb24uaHRtbDtcbiAgICAgIHNlbGYuaXNPbkZvY3VzID0gZmFsc2U7XG4gICAgICBzZWxmLndhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYuaXNDb250ZW50VXBkYXRpbmcgPSBmYWxzZTtcbiAgICAgIHF1ZXN0aW9uLmNvbnRlbnRDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzZWxmLmlzQ29udGVudFVwZGF0aW5nKSByZXR1cm47XG4gICAgICAgIGtvLmNsZWFuTm9kZShzZWxmLmVsZW1lbnQpO1xuICAgICAgICBzZWxmLmVsZW1lbnQuaW5uZXJIVE1MID0gcXVlc3Rpb24uaHRtbDtcbiAgICAgICAga28uYXBwbHlCaW5kaW5ncyh7IHF1ZXN0aW9uIH0sIHNlbGYuZWxlbWVudCk7XG4gICAgICAgICEha28udGFza3MgJiYga28udGFza3MucnVuRWFybHkoKTtcbiAgICAgIH07XG4gICAgICBzZWxmLmVsZW1lbnQub25mb2N1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5pc09uRm9jdXMgPSB0cnVlO1xuICAgICAgfTtcbiAgICAgIHNlbGYuZWxlbWVudC5vbmJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzZWxmLndhc0NoYW5nZWQpIHNlbGYudXBkYXRlQ29udGVudCgpO1xuICAgICAgICBzZWxmLmlzT25Gb2N1cyA9IGZhbHNlO1xuICAgICAgICBzZWxmLndhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgICBzZWxmLmVsZW1lbnQub25kcmFnZW5kID0gZnVuY3Rpb24gKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdmFyIHJlZ0V4ID0gL3soLio/KGVsZW1lbnQ6KVteJF0uKj8pfS9nO1xuICAgICAgICB2YXIgc3RyID0gc2VsZi5lbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgdmFyIHJlcyA9IHJlZ0V4LmV4ZWMoc3RyKTtcbiAgICAgICAgaWYgKHJlcyAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBxID0gcXVlc3Rpb24uZ2V0UXVlc3Rpb25Gcm9tVGV4dChyZXNbMF0pO1xuICAgICAgICAgIGlmICghIXEpIHtcbiAgICAgICAgICAgIHF1ZXN0aW9uLmNvbnRlbnQgPSBzZWxmLmdldENvbnRlbnQocS5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBzZWxmLnVwZGF0ZUNvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuaXNDb250ZW50VXBkYXRpbmcgPSB0cnVlO1xuICAgICAgICBxdWVzdGlvbi5jb250ZW50ID0gc2VsZi5nZXRDb250ZW50KCk7XG4gICAgICAgIHNlbGYuaXNDb250ZW50VXBkYXRpbmcgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgICBxdWVzdGlvbi5nZXRDb250ZW50ID0gc2VsZi5nZXRDb250ZW50ID0gZnVuY3Rpb24gKGRlbGV0ZWROYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiRElWXCIpO1xuICAgICAgICBjb250ZW50LmlubmVySFRNTCA9IHNlbGYuZWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBjcHMgPSBjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NwYW5bcXVlc3Rpb249XCJ0cnVlXCJdJyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBjcHNbaV0uaWQucmVwbGFjZShcImZsb3dwYW5lbF9cIiwgXCJcIik7XG4gICAgICAgICAgdmFyIGh0bWwgPSBcIlwiO1xuICAgICAgICAgIGlmIChuYW1lICE9PSBkZWxldGVkTmFtZSkge1xuICAgICAgICAgICAgdmFyIGVsID0gcXVlc3Rpb24uZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgICAgICAgICBodG1sID0gISFlbCA/IHF1ZXN0aW9uLmdldEVsZW1lbnRDb250ZW50VGV4dChlbCkgOiBcIlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjcHNbaV0ub3V0ZXJIVE1MID0gaHRtbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGVudC5pbm5lckhUTUw7XG4gICAgICB9O1xuICAgICAgdmFyIGNvbmZpZyA9IHtcbiAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIChtdXRhdGlvbnNMaXN0OiBhbnksIG9ic2VydmVyOiBhbnkpIHtcbiAgICAgICAgaWYgKCFzZWxmLmlzT25Gb2N1cykgcmV0dXJuO1xuICAgICAgICBzZWxmLndhc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfTtcbiAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoc2VsZi5lbGVtZW50LCBjb25maWcpO1xuICAgICAgcmV0dXJuIHsgcXVlc3Rpb24gfTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZTogXCI8ZGl2PjwvZGl2PlwiLFxufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFBhZ2VNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHtcbiAgUGFuZWxNb2RlbEJhc2UsXG4gIFBhbmVsTW9kZWwsXG4gIFF1ZXN0aW9uUm93TW9kZWwsXG4gIFF1ZXN0aW9uLFxuICBkb0tleTJDbGljayxcbn0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50LCBJRWxlbWVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuL2tvYmFzZVwiO1xuaW1wb3J0IHt9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Sb3cgZXh0ZW5kcyBRdWVzdGlvblJvd01vZGVsIHtcbiAga29FbGVtZW50QWZ0ZXJSZW5kZXI6IGFueTtcbiAgY29uc3RydWN0b3IocHVibGljIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHN1cGVyKHBhbmVsKTtcbiAgICBuZXcgSW1wbGVtZW50b3JCYXNlKHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvRWxlbWVudEFmdGVyUmVuZGVyID0gZnVuY3Rpb24oZWw6IGFueSwgY29uOiBhbnkpIHtcbiAgICAgIHJldHVybiBzZWxmLmVsZW1lbnRBZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXRFbGVtZW50VHlwZShlbDogYW55KSB7XG4gICAgcmV0dXJuIGVsLmlzUGFuZWwgPyBcInN1cnZleS1wYW5lbFwiIDogXCJzdXJ2ZXktcXVlc3Rpb25cIjtcbiAgfVxuICBwdWJsaWMga29BZnRlclJlbmRlcihlbDogYW55LCBjb246IGFueSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB0RWwgPSBlbFtpXTtcbiAgICAgIHZhciBuTmFtZSA9IHRFbC5ub2RlTmFtZTtcbiAgICAgIGlmIChuTmFtZSA9PSBcIiN0ZXh0XCIpIHRFbC5kYXRhID0gXCJcIjtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBlbGVtZW50QWZ0ZXJSZW5kZXIoZWxlbWVudHM6IGFueSwgY29uOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMucGFuZWwgfHwgIXRoaXMucGFuZWwuc3VydmV5KSByZXR1cm47XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICEha28udGFza3MgJiYga28udGFza3MucnVuRWFybHkoKTtcbiAgICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgICB2YXIgZWxlbWVudCA9IDxJRWxlbWVudD5jb247XG4gICAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICAgIHRoaXMucGFuZWwuc3VydmV5LmFmdGVyUmVuZGVyUGFuZWwoY29uLCBlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoPFF1ZXN0aW9uPmVsZW1lbnQpLmFmdGVyUmVuZGVyKGVsKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIHJvd0FmdGVyUmVuZGVyKGVsZW1lbnRzOiBIVE1MRWxlbWVudFtdLCBtb2RlbDogUXVlc3Rpb25Sb3cpIHtcbiAgICBpZiAoIW1vZGVsLmlzTmVlZFJlbmRlcikge1xuICAgICAgdmFyIHJvd0NvbnRhaW5lckRpdiA9IGVsZW1lbnRzWzBdLnBhcmVudEVsZW1lbnQ7XG4gICAgICBtb2RlbC5zdGFydExhenlSZW5kZXJpbmcocm93Q29udGFpbmVyRGl2KTtcbiAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2socm93Q29udGFpbmVyRGl2LCAoKSA9PiB7XG4gICAgICAgIG1vZGVsLnN0b3BMYXp5UmVuZGVyaW5nKCk7XG4gICAgICAgIG1vZGVsLmlzTmVlZFJlbmRlciA9ICFtb2RlbC5pc0xhenlSZW5kZXJpbmc7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIHRoaXMua29FbGVtZW50QWZ0ZXJSZW5kZXIgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhbmVsSW1wbGVtZW50b3JCYXNlIGV4dGVuZHMgSW1wbGVtZW50b3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHN1cGVyKHBhbmVsKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFuZWwgZXh0ZW5kcyBQYW5lbE1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IEltcGxlbWVudG9yQmFzZTtcbiAga29FbGVtZW50VHlwZTogYW55O1xuICBrb0NzczogYW55O1xuICBrb0Vycm9yQ2xhc3M6IGFueTtcbiAgdG9nZ2xlU3RhdGVCeUtleVVwOiBhbnk7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0VsZW1lbnRUeXBlID0ga28ub2JzZXJ2YWJsZShcInN1cnZleS1wYW5lbFwiKTtcbiAgICB0aGlzLmtvQ3NzID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNlbGYuY3NzQ2xhc3NlcztcbiAgICB9KTtcbiAgICB0aGlzLnRvZ2dsZVN0YXRlQnlLZXlVcCA9IGZ1bmN0aW9uKF86IGFueSwgZXZlbnQ6IGFueSkge1xuICAgICAgZG9LZXkyQ2xpY2soZXZlbnQpO1xuICAgIH07XG4gICAgdGhpcy5rb0Vycm9yQ2xhc3MgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc2VsZi5jc3NFcnJvcjtcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBQYW5lbEltcGxlbWVudG9yQmFzZSh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUm93KCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Sb3codGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMua29Dc3MuZGlzcG9zZSgpO1xuICAgIHRoaXMua29FcnJvckNsYXNzLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYWdlIGV4dGVuZHMgUGFnZU1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IEltcGxlbWVudG9yQmFzZTtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMub25DcmVhdGluZygpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IEltcGxlbWVudG9yQmFzZSh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUm93KCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Sb3codGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcInBhbmVsXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFBhbmVsKCk7XG59KTtcblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJwYWdlXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFBhZ2UoKTtcbn0pO1xuXG5FbGVtZW50RmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlckVsZW1lbnQoXCJwYW5lbFwiLCAobmFtZSkgPT4ge1xuICByZXR1cm4gbmV3IFBhbmVsKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uLCBTdXJ2ZXlFbGVtZW50LCBIZWxwZXJzLCBkb0tleTJDbGljayB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSW1wbGVtZW50b3JCYXNlIH0gZnJvbSBcIi4va29iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltcGxlbWVudG9yIGV4dGVuZHMgSW1wbGVtZW50b3JCYXNlIHtcbiAgcHJpdmF0ZSBkaXNwb3NlZE9iamVjdHM6IEFycmF5PHN0cmluZz47XG4gIHByaXZhdGUgY2FsbEJhY2tGdW5jdGlvbnM6IEFycmF5PHN0cmluZz47XG4gIHByaXZhdGUga29EdW1teTogYW55O1xuICBrb0VsZW1lbnRUeXBlOiBhbnk7XG4gIHRvZ2dsZVN0YXRlQnlDbGljazogYW55O1xuICB0b2dnbGVTdGF0ZUJ5S2V5VXA6IGFueTtcbiAgcHJpdmF0ZSBfa29WYWx1ZSA9IGtvLm9ic2VydmFibGVBcnJheTxhbnk+KCk7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdGhpcy5kaXNwb3NlZE9iamVjdHMgPSBbXTtcbiAgICB0aGlzLmNhbGxCYWNrRnVuY3Rpb25zID0gW107XG4gICAgdmFyIGlzU3luY2hyb25pemluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2tvVmFsdWUuc3Vic2NyaWJlKChuZXdWYWx1ZSkgPT4ge1xuICAgICAgaWYgKCFpc1N5bmNocm9uaXppbmcpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy50b2dnbGVTdGF0ZUJ5Q2xpY2sgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi50b2dnbGVTdGF0ZSgpO1xuICAgIH07XG4gICAgdGhpcy50b2dnbGVTdGF0ZUJ5S2V5VXAgPSAoXzogYW55LCBldmVudDogYW55KSA9PiB7XG4gICAgICBkb0tleTJDbGljayhldmVudCk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5xdWVzdGlvbiwgXCJrb1ZhbHVlXCIsIHtcbiAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLl9rb1ZhbHVlKCksIHRoaXMuZ2V0S29WYWx1ZSgpKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpc1N5bmNocm9uaXppbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fa29WYWx1ZSh0aGlzLmdldEtvVmFsdWUoKSk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlzU3luY2hyb25pemluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fa29WYWx1ZTtcbiAgICAgIH0sXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIHF1ZXN0aW9uLnN1cnZleUxvYWRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMub25TdXJ2ZXlMb2FkKCk7XG4gICAgfTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcbiAgICAgIFwia29UZW1wbGF0ZU5hbWVcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRlbXBsYXRlTmFtZSgpO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFwia29FbGVtZW50VHlwZVwiLCBrby5vYnNlcnZhYmxlKFwic3VydmV5LXF1ZXN0aW9uXCIpKTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcInVwZGF0ZVF1ZXN0aW9uXCIsICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlUXVlc3Rpb24oKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcbiAgICAgIFwia29Dc3NcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvUm9vdENzc1wiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdmFyIGNzc1Jvb3QgPSB0aGlzLnF1ZXN0aW9uLmNzc1Jvb3Q7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkpXG4gICAgICAgICAgY3NzUm9vdCArPSBcIiBcIiArIHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5kaXNhYmxlZDtcbiAgICAgICAgcmV0dXJuIGNzc1Jvb3Q7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJ0b2dnbGVTdGF0ZUJ5Q2xpY2tcIiwgdGhpcy50b2dnbGVTdGF0ZUJ5Q2xpY2spO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwidG9nZ2xlU3RhdGVCeUtleVVwXCIsIHRoaXMudG9nZ2xlU3RhdGVCeUtleVVwKTtcblxuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0Vycm9yQ2xhc3NcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmNzc0Vycm9yO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMua29EdW1teSA9IGtvLm9ic2VydmFibGUoMCk7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJrb1F1ZXN0aW9uQWZ0ZXJSZW5kZXJcIiwgKGVsOiBhbnksIGNvbjogYW55KSA9PiB7XG4gICAgICB0aGlzLmtvUXVlc3Rpb25BZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0T2JzZXJ2YWxlT2JqKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvYmo6IGFueSxcbiAgICBhZGRUb1F1ZXN0aW9uOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmRpc3Bvc2VkT2JqZWN0cy5wdXNoKG5hbWUpO1xuICAgIGlmIChhZGRUb1F1ZXN0aW9uKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uW25hbWVdID0gb2JqO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIHByb3RlY3RlZCBzZXRDYWxsYmFja0Z1bmMobmFtZTogc3RyaW5nLCBmdW5jOiBhbnkpIHtcbiAgICB0aGlzLmNhbGxCYWNrRnVuY3Rpb25zLnB1c2gobmFtZSk7XG4gICAgdGhpcy5xdWVzdGlvbltuYW1lXSA9IGZ1bmM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEtvVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVF1ZXN0aW9uKCkge1xuICAgIHRoaXMudXBkYXRlS29EdW1teSgpO1xuICB9XG4gIHByb3RlY3RlZCBvblN1cnZleUxvYWQoKSB7fVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb25UZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmdldFRlbXBsYXRlKCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUZW1wbGF0ZU5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldCAmJlxuICAgICAgIXRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LndpZGdldEpzb24uaXNEZWZhdWx0UmVuZGVyXG4gICAgKVxuICAgICAgcmV0dXJuIFwic3VydmV5LXdpZGdldC1cIiArIHRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0Lm5hbWU7XG4gICAgcmV0dXJuIFwic3VydmV5LXF1ZXN0aW9uLVwiICsgdGhpcy5nZXRRdWVzdGlvblRlbXBsYXRlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldE5vKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmlzaWJsZUluZGV4ID4gLTFcbiAgICAgID8gdGhpcy5xdWVzdGlvbi52aXNpYmxlSW5kZXggKyAxICsgXCIuIFwiXG4gICAgICA6IFwiXCI7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUtvRHVtbXkoKSB7XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uaXNEaXNwb3NlZCkgcmV0dXJuO1xuICAgIHRoaXMua29EdW1teSh0aGlzLmtvRHVtbXkoKSArIDEpO1xuICAgIHRoaXMucXVlc3Rpb24ubG9jVGl0bGUub25DaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGtvUXVlc3Rpb25BZnRlclJlbmRlcihlbGVtZW50czogYW55LCBjb246IGFueSkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgISFrby50YXNrcyAmJiBrby50YXNrcy5ydW5FYXJseSgpO1xuICAgICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzLCB0cnVlKTtcbiAgICAgIGlmICghIWVsKSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb24uYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWwpO1xuICAgICAgICBpZiAoISF0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldCkge1xuICAgICAgICAgIHRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LmFmdGVyUmVuZGVyKHRoaXMucXVlc3Rpb24sIGVsKTtcbiAgICAgICAgfVxuICAgICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5xdWVzdGlvbi5iZWZvcmVEZXN0cm95UXVlc3Rpb25FbGVtZW50KGVsKTtcbiAgICAgICAgICBpZiAoISF0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQud2lsbFVubW91bnQodGhpcy5xdWVzdGlvbiwgZWwpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkN1c3RvbSB3aWRnZXQgd2lsbCB1bm1vdW50IGZhaWxlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcG9zZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IHRoaXMuZGlzcG9zZWRPYmplY3RzW2ldO1xuICAgICAgdmFyIG9iaiA9ICg8YW55PnRoaXMpW25hbWVdIHx8IHRoaXMucXVlc3Rpb25bbmFtZV07XG4gICAgICBpZiAoIW9iaikgY29udGludWU7XG4gICAgICBpZiAoKDxhbnk+dGhpcylbbmFtZV0pICg8YW55PnRoaXMpW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKHRoaXMucXVlc3Rpb25bbmFtZV0pIHRoaXMucXVlc3Rpb25bbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICBpZiAob2JqW1wiZGlzcG9zZVwiXSkgb2JqLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5kaXNwb3NlZE9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FsbEJhY2tGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucXVlc3Rpb25bdGhpcy5jYWxsQmFja0Z1bmN0aW9uc1tpXV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuY2FsbEJhY2tGdW5jdGlvbnMgPSBbXTtcbiAgICB0aGlzLnF1ZXN0aW9uLnVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ2aXNpYmxlSW5kZXhcIik7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2UgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uU2VsZWN0QmFzZUltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25JbXBsZW1lbnRvciB7XG4gIHByb3RlY3RlZCBvbkNyZWF0ZWQoKSB7fVxuICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdGhpcy5vbkNyZWF0ZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGlzT3RoZXJTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKDxRdWVzdGlvblNlbGVjdEJhc2U+dGhpcy5xdWVzdGlvbikuaXNPdGhlclNlbGVjdGVkO1xuICB9XG59XG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uU2VsZWN0QmFzZUltcGxlbWVudG9yIHtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwia29BZnRlclJlbmRlclwiLCB0aGlzLmtvQWZ0ZXJSZW5kZXIpO1xuICB9XG4gIHByaXZhdGUga29BZnRlclJlbmRlcihlbDogYW55LCBjb246IGFueSkge1xuICAgIHZhciB0RWwgPSBlbFswXTtcbiAgICBpZiAodEVsLm5vZGVOYW1lID09IFwiI3RleHRcIikgdEVsLmRhdGEgPSBcIlwiO1xuICAgIHRFbCA9IGVsW2VsLmxlbmd0aCAtIDFdO1xuICAgIGlmICh0RWwubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB0RWwuZGF0YSA9IFwiXCI7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Cb29sZWFuTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQm9vbGVhbiBleHRlbmRzIFF1ZXN0aW9uQm9vbGVhbk1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uSW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgYWxsb3dDbGljaygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0luZGV0ZXJtaW5hdGUgJiYgIXRoaXMuaXNJbnB1dFJlYWRPbmx5O1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtQ3NzKHJvdzogYW55LCBjb2x1bW46IGFueSkge1xuICAgIGxldCBpc0NoZWNrZWQgPSB0aGlzLmNoZWNrZWRWYWx1ZTtcbiAgICBsZXQgaXNEaXNhYmxlZCA9IHRoaXMuaXNSZWFkT25seTtcbiAgICBsZXQgaXRlbUNsYXNzID0gdGhpcy5jc3NDbGFzc2VzLml0ZW07XG4gICAgaWYgKGlzRGlzYWJsZWQpIGl0ZW1DbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtRGlzYWJsZWQ7XG4gICAgaWYgKGlzQ2hlY2tlZCkgaXRlbUNsYXNzICs9IFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLml0ZW1DaGVja2VkO1xuICAgIGVsc2UgaWYgKGlzQ2hlY2tlZCA9PT0gbnVsbClcbiAgICAgIGl0ZW1DbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSW5kZXRlcm1pbmF0ZTtcbiAgICByZXR1cm4gaXRlbUNsYXNzO1xuICB9XG4gIHB1YmxpYyBnZXRDaGVja2VkTGFiZWxDc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMYWJlbENsYXNzKHRydWUpO1xuICB9XG4gIHB1YmxpYyBnZXRVbmNoZWNrZWRMYWJlbENzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExhYmVsQ2xhc3MoZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgZ2V0TGFiZWxDbGFzcyhjaGVja2VkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jc3NDbGFzc2VzLmxhYmVsICtcbiAgICAgICh0aGlzLmNoZWNrZWRWYWx1ZSA9PT0gIWNoZWNrZWQgfHwgdGhpcy5pc1JlYWRPbmx5XG4gICAgICAgID8gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuZGlzYWJsZWRMYWJlbFxuICAgICAgICA6IFwiXCIpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHByZXZlbnREZWZhdWx0cyhldmVudDogYW55KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuICBwcml2YXRlIG9uTGFiZWxDbGljayhldmVudDogYW55LCB2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmFsbG93Q2xpY2spIHtcbiAgICAgIHRoaXMucHJldmVudERlZmF1bHRzKGV2ZW50KTtcbiAgICAgIHRoaXMuY2hlY2tlZFZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBvblN3aXRjaENsaWNrKGRhdGE6IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmFsbG93Q2xpY2spIHtcbiAgICAgIHRoaXMucHJldmVudERlZmF1bHRzKGV2ZW50KTtcbiAgICAgIHZhciBpc1JpZ2h0Q2xpY2sgPSBldmVudC5vZmZzZXRYIC8gZXZlbnQudGFyZ2V0Lm9mZnNldFdpZHRoID4gMC41O1xuICAgICAgdmFyIGlzUnRsID1cbiAgICAgICAgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShldmVudC50YXJnZXQpLmRpcmVjdGlvbiA9PSBcInJ0bFwiO1xuXG4gICAgICB0aGlzLmNoZWNrZWRWYWx1ZSA9IGlzUnRsID8gIWlzUmlnaHRDbGljayA6IGlzUmlnaHRDbGljaztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIG9uVHJ1ZUxhYmVsQ2xpY2soZGF0YTogYW55LCBldmVudDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMub25MYWJlbENsaWNrKGV2ZW50LCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgb25GYWxzZUxhYmVsQ2xpY2soZGF0YTogYW55LCBldmVudDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMub25MYWJlbENsaWNrKGV2ZW50LCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImJvb2xlYW5cIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiYm9vbGVhblwiLCAobmFtZSkgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQm9vbGVhbihuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb25CdXR0b25Hcm91cE1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQnV0dG9uR3JvdXAgZXh0ZW5kcyBRdWVzdGlvbkJ1dHRvbkdyb3VwTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cbi8vIFNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJidXR0b25ncm91cFwiLCBmdW5jdGlvbigpIHtcbi8vICAgcmV0dXJuIG5ldyBRdWVzdGlvbkJ1dHRvbkdyb3VwKFwiXCIpO1xuLy8gfSk7XG5cbi8vIFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiYnV0dG9uZ3JvdXBcIiwgbmFtZSA9PiB7XG4vLyAgIHZhciBxID0gbmV3IFF1ZXN0aW9uQnV0dG9uR3JvdXAobmFtZSk7XG4vLyAgIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbi8vICAgcmV0dXJuIHE7XG4vLyB9KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNoZWNrYm94SW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yIHtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICB9XG4gIHByb3RlY3RlZCBnZXRLb1ZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ2hlY2tib3ggZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94TW9kZWwge1xuICBrb0FsbFNlbGVjdGVkOiBhbnk7XG4gIHByaXZhdGUgaXNBbGxTZWxlY3RlZFVwZGF0aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkNoZWNrYm94SW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMua29BbGxTZWxlY3RlZCA9IGtvLm9ic2VydmFibGUodGhpcy5pc0FsbFNlbGVjdGVkKTtcbiAgICB0aGlzLmtvQWxsU2VsZWN0ZWQuc3Vic2NyaWJlKChuZXdWYWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkVXBkYXRpbmcpIHJldHVybjtcbiAgICAgIGlmIChuZXdWYWx1ZSkgdGhpcy5zZWxlY3RBbGwoKTtcbiAgICAgIGVsc2UgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25DaGVja2JveEltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIHRoaXMudXBkYXRlQWxsU2VsZWN0ZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgICB0aGlzLnVwZGF0ZUFsbFNlbGVjdGVkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUFsbFNlbGVjdGVkKCkge1xuICAgIHRoaXMuaXNBbGxTZWxlY3RlZFVwZGF0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmtvQWxsU2VsZWN0ZWQodGhpcy5pc0FsbFNlbGVjdGVkKTtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWRVcGRhdGluZyA9IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmtvQWxsU2VsZWN0ZWQgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJjaGVja2JveFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNoZWNrYm94KFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNoZWNrYm94XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkNoZWNrYm94KG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Db21tZW50TW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNvbW1lbnQgZXh0ZW5kcyBRdWVzdGlvbkNvbW1lbnRNb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImNvbW1lbnRcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Db21tZW50KFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNvbW1lbnRcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Db21tZW50KG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7XG4gIFF1ZXN0aW9uQ3VzdG9tTW9kZWwsXG4gIFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwsXG4gIENvbXBvbmVudFF1ZXN0aW9uSlNPTixcbiAgQ29tcG9uZW50Q29sbGVjdGlvbixcbn0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DdXN0b20gZXh0ZW5kcyBRdWVzdGlvbkN1c3RvbU1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uSW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT04pIHtcbiAgICBzdXBlcihuYW1lLCBxdWVzdGlvbkpTT04pO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Db21wb3NpdGUgZXh0ZW5kcyBRdWVzdGlvbkNvbXBvc2l0ZU1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uSW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT04pIHtcbiAgICBzdXBlcihuYW1lLCBxdWVzdGlvbkpTT04pO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5Db21wb25lbnRDb2xsZWN0aW9uLkluc3RhbmNlLm9uQ3JlYXRlQ3VzdG9tID0gZnVuY3Rpb24oXG4gIG5hbWU6IHN0cmluZyxcbiAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbikge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQ3VzdG9tKG5hbWUsIHF1ZXN0aW9uSlNPTik7XG59O1xuXG5Db21wb25lbnRDb2xsZWN0aW9uLkluc3RhbmNlLm9uQ3JlYXRlQ29tcG9zaXRlID0gZnVuY3Rpb24oXG4gIG5hbWU6IHN0cmluZyxcbiAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbikge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tcG9zaXRlKG5hbWUsIHF1ZXN0aW9uSlNPTik7XG59O1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25TZWxlY3RCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmNsYXNzIFF1ZXN0aW9uRHJvcGRvd25JbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uU2VsZWN0QmFzZUltcGxlbWVudG9yIHtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkRyb3Bkb3duIGV4dGVuZHMgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uRHJvcGRvd25JbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25Ecm9wZG93bkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJkcm9wZG93blwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkRyb3Bkb3duKFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImRyb3Bkb3duXCIsIChuYW1lKSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uRHJvcGRvd24obmFtZSk7XG4gIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25FbXB0eU1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRW1wdHkgZXh0ZW5kcyBRdWVzdGlvbkVtcHR5TW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25JbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJlbXB0eVwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkVtcHR5KFwiXCIpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25FeHByZXNzaW9uIGV4dGVuZHMgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25JbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJleHByZXNzaW9uXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRXhwcmVzc2lvbihcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJleHByZXNzaW9uXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRXhwcmVzc2lvbihuYW1lKTtcbn0pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmlsZU1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IGNvbmZpcm1BY3Rpb24sIGRldGVjdElFT3JFZGdlLCBsb2FkRmlsZUZyb21CYXNlNjQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuY2xhc3MgUXVlc3Rpb25GaWxlSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFwia29TdGF0ZVwiLCBrby5vYnNlcnZhYmxlPHN0cmluZz4oXCJlbXB0eVwiKSk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvSGFzVmFsdWVcIixcbiAgICAgIGtvLmNvbXB1dGVkKCgpID0+IHRoaXMucXVlc3Rpb24ua29TdGF0ZSgpID09PSBcImxvYWRlZFwiKVxuICAgICk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvRGF0YVwiLFxuICAgICAga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5rb0hhc1ZhbHVlKCkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFwia29JbnB1dFRpdGxlXCIsIGtvLm9ic2VydmFibGU8c3RyaW5nPigpKTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcbiAgICAgIFwia29DaG9vc2VGaWxlQ2xhc3NcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdGhpcy5xdWVzdGlvbi5rb0NzcygpLmNob29zZUZpbGUgK1xuICAgICAgICAgICh0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkgPyBcIiBcIiArIHRoaXMucXVlc3Rpb24ua29Dc3MoKS5jb250cm9sRGlzYWJsZWQgOiBcIlwiKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwib25kcm9wXCIsIChkYXRhOiBhbnksIGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkpIHJldHVybiBmYWxzZTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBsZXQgc3JjID0gZXZlbnQub3JpZ2luYWxFdmVudFxuICAgICAgICA/IGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyXG4gICAgICAgIDogZXZlbnQuZGF0YVRyYW5zZmVyO1xuICAgICAgdGhpcy5vbkNoYW5nZShzcmMpO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwib25kcmFnb3ZlclwiLCAoZGF0YTogYW55LCBldmVudDogYW55KSA9PiB7XG4gICAgICBpZiAodGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5KSB7XG4gICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGxldCBkYXRhVHJhbnNmZXIgPSBldmVudC5vcmlnaW5hbEV2ZW50XG4gICAgICAgID8gZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXJcbiAgICAgICAgOiBldmVudC5kYXRhVHJhbnNmZXI7XG4gICAgICBkYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IFwiY29weVwiO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImRvY2hhbmdlXCIsIChkYXRhOiBhbnksIGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIHZhciBzcmMgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDtcbiAgICAgIHRoaXMub25DaGFuZ2Uoc3JjKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImRvY2xlYW5cIiwgKGRhdGE6IGFueSwgZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgdmFyIHNyYyA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50O1xuICAgICAgaWYgKHRoaXMucXVlc3Rpb24ubmVlZENvbmZpcm1SZW1vdmVGaWxlKSB7XG4gICAgICAgIHZhciBpc0NvbmZpcm1lZCA9IGNvbmZpcm1BY3Rpb24odGhpcy5xdWVzdGlvbi5jb25maXJtUmVtb3ZlQWxsTWVzc2FnZSk7XG4gICAgICAgIGlmICghaXNDb25maXJtZWQpIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBpbnB1dCA9IHNyYy5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFwiKVswXTtcbiAgICAgIHRoaXMucXVlc3Rpb24uY2xlYXIoKTtcbiAgICAgIGlucHV0LnZhbHVlID0gXCJcIjtcbiAgICB9KTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImRvcmVtb3ZlZmlsZVwiLCAoZGF0YTogYW55LCBldmVudDogYW55KSA9PiB7XG4gICAgICBpZiAodGhpcy5xdWVzdGlvbi5uZWVkQ29uZmlybVJlbW92ZUZpbGUpIHtcbiAgICAgICAgdmFyIGlzQ29uZmlybWVkID0gY29uZmlybUFjdGlvbihcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmdldENvbmZpcm1SZW1vdmVNZXNzYWdlKGRhdGEubmFtZSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFpc0NvbmZpcm1lZCkgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5xdWVzdGlvbi5yZW1vdmVGaWxlKGRhdGEpO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwiZG9kb3dubG9hZFwiLCAoZGF0YTogYW55LCBldmVudDogYW55KSA9PiB7XG4gICAgICBpZiAoZGV0ZWN0SUVPckVkZ2UoKSkge1xuICAgICAgICBsb2FkRmlsZUZyb21CYXNlNjQoZGF0YS5jb250ZW50LCBkYXRhLm5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBvbkNoYW5nZShzcmM6IGFueSkge1xuICAgIGlmICghKDxhbnk+d2luZG93KVtcIkZpbGVSZWFkZXJcIl0pIHJldHVybjtcbiAgICBpZiAoIXNyYyB8fCAhc3JjLmZpbGVzIHx8IHNyYy5maWxlcy5sZW5ndGggPCAxKSByZXR1cm47XG4gICAgbGV0IGZpbGVzID0gW107XG4gICAgbGV0IGFsbG93Q291bnQgPSB0aGlzLnF1ZXN0aW9uLmFsbG93TXVsdGlwbGUgPyBzcmMuZmlsZXMubGVuZ3RoIDogMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbG93Q291bnQ7IGkrKykge1xuICAgICAgZmlsZXMucHVzaChzcmMuZmlsZXNbaV0pO1xuICAgIH1cbiAgICBzcmMudmFsdWUgPSBcIlwiO1xuICAgIHRoaXMucXVlc3Rpb24ubG9hZEZpbGVzKGZpbGVzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25GaWxlIGV4dGVuZHMgUXVlc3Rpb25GaWxlTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25GaWxlSW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciB1cGRhdGVTdGF0ZSA9IChzdGF0ZTogYW55KSA9PiB7XG4gICAgICB0aGlzLmtvU3RhdGUoc3RhdGUpO1xuICAgICAgdGhpcy5rb0lucHV0VGl0bGUodGhpcy5pbnB1dFRpdGxlKTtcbiAgICB9O1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuYWRkKChzZW5kZXIsIG9wdGlvbnMpID0+IHtcbiAgICAgIHVwZGF0ZVN0YXRlKG9wdGlvbnMuc3RhdGUpO1xuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uRmlsZUltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcImZpbGVcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25GaWxlKFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImZpbGVcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25GaWxlKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkh0bWxNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25IdG1sIGV4dGVuZHMgUXVlc3Rpb25IdG1sTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25JbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJodG1sXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uSHRtbChcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJodG1sXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uSHRtbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbWFnZU1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltYWdlIGV4dGVuZHMgUXVlc3Rpb25JbWFnZU1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uSW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwiaW1hZ2VcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25JbWFnZShcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJpbWFnZVwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkltYWdlKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5jbGFzcyBRdWVzdGlvbkltYWdlUGlja2VySW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yIHtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICB9XG4gIHByb3RlY3RlZCBnZXRLb1ZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uSW1hZ2VQaWNrZXIgZXh0ZW5kcyBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25JbWFnZVBpY2tlckltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkltYWdlUGlja2VySW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwiaW1hZ2VwaWNrZXJcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25JbWFnZVBpY2tlcihcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImltYWdlcGlja2VyXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkltYWdlUGlja2VyKG5hbWUpO1xuICAvL3EuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhNb2RlbCwgTWF0cml4Um93TW9kZWwsIElNYXRyaXhEYXRhIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgSW1wbGVtZW50b3JCYXNlIH0gZnJvbSBcIi4va29iYXNlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4IGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhNb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkltcGxlbWVudG9yO1xuICBrb1Zpc2libGVSb3dzOiBhbnkgPSA8YW55PmtvLm9ic2VydmFibGVBcnJheTxNYXRyaXhSb3dNb2RlbD4oKTtcbiAga29WaXNpYmxlQ29sdW1uczogYW55ID0gPGFueT5rby5vYnNlcnZhYmxlQXJyYXk8YW55PigpO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmtvVmlzaWJsZVJvd3ModGhpcy52aXNpYmxlUm93cyk7XG4gICAgdGhpcy5rb1Zpc2libGVDb2x1bW5zKHRoaXMudmlzaWJsZUNvbHVtbnMpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ29sdW1uc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIub25Db2x1bW5zQ2hhbmdlZCgpO1xuICAgIHRoaXMua29WaXNpYmxlQ29sdW1ucyh0aGlzLnZpc2libGVDb2x1bW5zKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Sb3dzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5vblJvd3NDaGFuZ2VkKCk7XG4gICAgdGhpcy5rb1Zpc2libGVSb3dzKHRoaXMudmlzaWJsZVJvd3MpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTWF0cml4Um93Q3JlYXRlZChyb3c6IE1hdHJpeFJvd01vZGVsKSB7XG4gICAgbmV3IEltcGxlbWVudG9yQmFzZShyb3cpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWaXNpYmxlUm93cygpOiBBcnJheTxNYXRyaXhSb3dNb2RlbD4ge1xuICAgIHZhciByb3dzID0gc3VwZXIuZ2V0VmlzaWJsZVJvd3MoKTtcbiAgICB0aGlzLmtvVmlzaWJsZVJvd3Mocm93cyk7XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMua29WaXNpYmxlUm93cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmtvVmlzaWJsZUNvbHVtbnMgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJtYXRyaXhcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXgoXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeChuYW1lKTtcbiAgcS5yb3dzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRSb3dzO1xuICBxLmNvbHVtbnMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENvbHVtcztcbiAgcmV0dXJuIHE7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQge1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLFxuICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsXG59IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IEltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuL2tvYmFzZVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUGFuZWwgfSBmcm9tIFwiLi9rb3BhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4QmFzZUltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25JbXBsZW1lbnRvciB7XG4gIHByaXZhdGUgX3RhYmxlSW1wbGVtZW50b3I6IEltcGxlbWVudG9yQmFzZTtcbiAga29SZWNhbGM6IGFueTtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHRoaXMua29SZWNhbGMgPSBrby5vYnNlcnZhYmxlKDApO1xuICAgICg8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPihcbiAgICAgIHRoaXMucXVlc3Rpb25cbiAgICApKS5vblJlbmRlcmVkVGFibGVDcmVhdGVkQ2FsbGJhY2sgPSAoXG4gICAgICB0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGVcbiAgICApID0+IHtcbiAgICAgIGlmICghIXRoaXMuX3RhYmxlSW1wbGVtZW50b3IpIHtcbiAgICAgICAgdGhpcy5fdGFibGVJbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl90YWJsZUltcGxlbWVudG9yID0gbmV3IEltcGxlbWVudG9yQmFzZSh0YWJsZSk7XG4gICAgfTtcbiAgICAoPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbD4oXG4gICAgICB0aGlzLnF1ZXN0aW9uXG4gICAgKSkub25SZW5kZXJlZFRhYmxlUmVzZXRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzRGlzcG9zZWQpIHJldHVybjtcbiAgICAgIHRoaXMua29SZWNhbGModGhpcy5rb1JlY2FsYygpICsgMSk7XG4gICAgfTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcbiAgICAgIFwia29UYWJsZVwiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gKDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWw+dGhpcy5xdWVzdGlvbikucmVuZGVyZWRUYWJsZTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImtvQ2VsbEFmdGVyUmVuZGVyXCIsIChlbDogYW55LCBjb246IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2VsbEFmdGVyUmVuZGVyKGVsLCBjb24pO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwia29DZWxsUXVlc3Rpb25BZnRlclJlbmRlclwiLCAoZWw6IGFueSwgY29uOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNlbGxRdWVzdGlvbkFmdGVyUmVuZGVyKGVsLCBjb24pO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwia29BZGRSb3dDbGlja1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLmFkZFJvdygpO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwia29SZW1vdmVSb3dDbGlja1wiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlbW92ZVJvdyhkYXRhLnJvdyk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRDYWxsYmFja0Z1bmMoXCJrb1BhbmVsQWZ0ZXJSZW5kZXJcIiwgKGVsOiBhbnksIGNvbjogYW55KSA9PiB7XG4gICAgICB0aGlzLnBhbmVsQWZ0ZXJSZW5kZXIoZWwsIGNvbik7XG4gICAgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFF1ZXN0aW9uVGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhkeW5hbWljXCI7XG4gIH1cbiAgcHJpdmF0ZSBjZWxsQWZ0ZXJSZW5kZXIoZWxlbWVudHM6IGFueSwgY29uOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24uc3VydmV5KSByZXR1cm47XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAhIWtvLnRhc2tzICYmIGtvLnRhc2tzLnJ1bkVhcmx5KCk7XG4gICAgICB2YXIgZWwgPSBTdXJ2ZXlFbGVtZW50LkdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHMpO1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgdmFyIGNlbGwgPSA8UXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbD5jb247XG4gICAgICBpZiAoY2VsbC5xdWVzdGlvbi5jdXN0b21XaWRnZXQpIHtcbiAgICAgICAgY2VsbC5xdWVzdGlvbi5jdXN0b21XaWRnZXQuYWZ0ZXJSZW5kZXIoY2VsbC5xdWVzdGlvbiwgZWwpO1xuICAgICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsLCAoKSA9PiB7XG4gICAgICAgICAgY2VsbC5xdWVzdGlvbi5jdXN0b21XaWRnZXQud2lsbFVubW91bnQoY2VsbC5xdWVzdGlvbiwgZWwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBjZWxsOiBjZWxsLmNlbGwsXG4gICAgICAgIGNlbGxRdWVzdGlvbjogY2VsbC5xdWVzdGlvbixcbiAgICAgICAgaHRtbEVsZW1lbnQ6IGVsLFxuICAgICAgICByb3c6IGNlbGwucm93LFxuICAgICAgICBjb2x1bW46ICEhY2VsbC5jZWxsID8gY2VsbC5jZWxsLmNvbHVtbiA6IG51bGwsXG4gICAgICB9O1xuICAgICAgdGhpcy5xdWVzdGlvbi5zdXJ2ZXkubWF0cml4QWZ0ZXJDZWxsUmVuZGVyKHRoaXMucXVlc3Rpb24sIG9wdGlvbnMpO1xuICAgIH0sIDApO1xuICB9XG4gIHByaXZhdGUgY2VsbFF1ZXN0aW9uQWZ0ZXJSZW5kZXIoZWxlbWVudHM6IGFueSwgY29uOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24uc3VydmV5KSByZXR1cm47XG4gICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgdmFyIGNlbGwgPSA8UXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbD5jb247XG4gICAgY2VsbC5xdWVzdGlvbi5hZnRlclJlbmRlclF1ZXN0aW9uRWxlbWVudChlbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQWRkUm93VG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNBZGRSb3dCb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBhZGRSb3coKSB7fVxuICBwcm90ZWN0ZWQgcmVtb3ZlUm93KHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpIHt9XG4gIHByaXZhdGUgcGFuZWxBZnRlclJlbmRlcihlbGVtZW50czogYW55LCBjb246IGFueSkge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbiB8fCAhdGhpcy5xdWVzdGlvbi5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgZWwgPSBTdXJ2ZXlFbGVtZW50LkdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHMpO1xuICAgIHRoaXMucXVlc3Rpb24uc3VydmV5LmFmdGVyUmVuZGVyUGFuZWwoY29uLCBlbCk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgaWYgKCEhdGhpcy5fdGFibGVJbXBsZW1lbnRvcikge1xuICAgICAgdGhpcy5fdGFibGVJbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgfVxuICAgICg8UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsPihcbiAgICAgIHRoaXMucXVlc3Rpb25cbiAgICApKS5vblJlbmRlcmVkVGFibGVDcmVhdGVkQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgKDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWw+KFxuICAgICAgdGhpcy5xdWVzdGlvblxuICAgICkpLm9uUmVuZGVyZWRUYWJsZVJlc2V0Q2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uSW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uTWF0cml4QmFzZUltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcIm1hdHJpeGRyb3Bkb3duXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd24oXCJcIik7XG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkcm9wZG93blwiLCAobmFtZSkgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIHEucm93cyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Um93cztcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZS5hZGREZWZhdWx0Q29sdW1ucyhxKTtcbiAgcmV0dXJuIHE7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duXCI7XG5pbXBvcnQgeyBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7XG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLFxufSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IE1hdHJpeER5bmFtaWNSb3dNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUGFuZWwgfSBmcm9tIFwiLi9rb3BhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHluYW1pY0ltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhCYXNlSW1wbGVtZW50b3Ige1xuICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgKDxhbnk+dGhpcy5xdWVzdGlvbilbXCJnZXRLb1BvcHVwSXNWaXNpYmxlXCJdID0gdGhpcy5nZXRLb1BvcHVwSXNWaXNpYmxlO1xuICB9XG4gIHByb3RlY3RlZCBhZGRSb3coKSB7XG4gICAgKDxRdWVzdGlvbk1hdHJpeER5bmFtaWM+dGhpcy5xdWVzdGlvbikuYWRkUm93VUkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVtb3ZlUm93KHJvdzogTWF0cml4RHluYW1pY1Jvd01vZGVsKSB7XG4gICAgKDxRdWVzdGlvbk1hdHJpeER5bmFtaWM+dGhpcy5xdWVzdGlvbikucmVtb3ZlUm93VUkocm93KTtcbiAgfVxuICBwdWJsaWMgZ2V0S29Qb3B1cElzVmlzaWJsZShyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSB7XG4gICAgcmV0dXJuIDxhbnk+a28ub2JzZXJ2YWJsZShyb3cuaXNEZXRhaWxQYW5lbFNob3dpbmcpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAoPGFueT50aGlzLnF1ZXN0aW9uKVtcImdldEtvUG9wdXBJc1Zpc2libGVcIl0gPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHluYW1pYyBleHRlbmRzIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uTWF0cml4RHluYW1pY0ltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbk1hdHJpeER5bmFtaWNJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJtYXRyaXhkeW5hbWljXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pYyhcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGR5bmFtaWNcIiwgKG5hbWUpID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXhEeW5hbWljKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIHEucm93Q291bnQgPSAyO1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLmFkZERlZmF1bHRDb2x1bW5zKHEpO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsLCBNdWx0aXBsZVRleHRJdGVtTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0IH0gZnJvbSBcIi4va29xdWVzdGlvbl90ZXh0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBNdWx0aXBsZVRleHRJdGVtIGV4dGVuZHMgTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcbiAgY29uc3RydWN0b3IobmFtZTogYW55ID0gbnVsbCwgdGl0bGU6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcihuYW1lLCB0aXRsZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUVkaXRvcihuYW1lOiBzdHJpbmcpOiBRdWVzdGlvblRleHRNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblRleHQobmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0IGV4dGVuZHMgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkltcGxlbWVudG9yO1xuICBrb1Jvd3M6IGFueTtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5rb1Jvd3MgPSBrby5vYnNlcnZhYmxlQXJyYXkodGhpcy5nZXRSb3dzKCkpO1xuICAgIHRoaXMuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLm9uQ29sQ291bnRDaGFuZ2VkKCk7XG4gICAgfTtcbiAgICB0aGlzLm9uQ29sQ291bnRDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Db2xDb3VudENoYW5nZWQoKSB7XG4gICAgdGhpcy5rb1Jvd3ModGhpcy5nZXRSb3dzKCkpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVUZXh0SXRlbShuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwge1xuICAgIHJldHVybiBuZXcgTXVsdGlwbGVUZXh0SXRlbShuYW1lLCB0aXRsZSk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMua29Sb3dzID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwibXVsdGlwbGV0ZXh0aXRlbVwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBNdWx0aXBsZVRleHRJdGVtKFwiXCIpO1xufSk7XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJtdWx0aXBsZXRleHRcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHQoXCJcIik7XG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtdWx0aXBsZXRleHRcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uTXVsdGlwbGVUZXh0KG5hbWUpO1xuICBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsLmFkZERlZmF1bHRJdGVtcyhxKTtcbiAgcmV0dXJuIHE7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCxcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLFxufSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBQYW5lbCB9IGZyb20gXCIuL2tvcGFnZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25QYW5lbER5bmFtaWNJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uSW1wbGVtZW50b3Ige1xuICBrb1JlY2FsYzogYW55O1xuICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdGhpcy5rb1JlY2FsYyA9IGtvLm9ic2VydmFibGUoMCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwia29BZGRQYW5lbENsaWNrXCIsICgpID0+IHtcbiAgICAgIHRoaXMuYWRkUGFuZWwoKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImtvUmVtb3ZlUGFuZWxDbGlja1wiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlbW92ZVBhbmVsKGRhdGEpO1xuICAgIH0pO1xuICAgIHRoaXMuc2V0Q2FsbGJhY2tGdW5jKFwia29QcmV2UGFuZWxDbGlja1wiLCAoKSA9PiB7XG4gICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLmdvVG9QcmV2UGFuZWwoKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImtvTmV4dFBhbmVsQ2xpY2tcIiwgKCkgPT4ge1xuICAgICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5nb1RvTmV4dFBhbmVsKCk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvQ2FuQWRkUGFuZWxcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+dGhpcy5xdWVzdGlvbikuY2FuQWRkUGFuZWw7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvQ2FuUmVtb3ZlUGFuZWxcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+dGhpcy5xdWVzdGlvbikuY2FuUmVtb3ZlUGFuZWw7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvSXNQcmV2QnV0dG9uXCIsXG4gICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtvUmVjYWxjKCk7XG4gICAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLmlzUHJldkJ1dHRvblNob3dpbmc7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvSXNOZXh0QnV0dG9uXCIsXG4gICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtvUmVjYWxjKCk7XG4gICAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLmlzTmV4dEJ1dHRvblNob3dpbmc7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvSXNSYW5nZVwiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5pc1JhbmdlU2hvd2luZztcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcbiAgICAgIFwia29QYW5lbFwiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5jdXJyZW50UGFuZWw7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvSXNMaXN0XCIsXG4gICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtvUmVjYWxjKCk7XG4gICAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLmlzUmVuZGVyTW9kZUxpc3Q7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvSXNQcm9ncmVzc1RvcFwiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5pc1Byb2dyZXNzVG9wU2hvd2luZztcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcbiAgICAgIFwia29Jc1Byb2dyZXNzQm90dG9tXCIsXG4gICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtvUmVjYWxjKCk7XG4gICAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLmlzUHJvZ3Jlc3NCb3R0b21TaG93aW5nO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbGV0IGtvUmFuZ2VWYWx1ZSA9IGtvLm9ic2VydmFibGUoXG4gICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLmN1cnJlbnRJbmRleFxuICAgICk7XG4gICAga29SYW5nZVZhbHVlLnN1YnNjcmliZSgobmV3VmFsdWU6IGFueSkgPT4ge1xuICAgICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5jdXJyZW50SW5kZXggPSBuZXdWYWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcImtvUmFuZ2VWYWx1ZVwiLCBrb1JhbmdlVmFsdWUpO1xuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb1JhbmdlTWF4XCIsXG4gICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtvUmVjYWxjKCk7XG4gICAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLnBhbmVsQ291bnQgLSAxO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zZXRPYnNlcnZhbGVPYmooXG4gICAgICBcImtvQnV0dG9uQWRkQ3NzXCIsXG4gICAgICBrby5wdXJlQ29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmtvUmVjYWxjKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1dHRvbkFkZENzcztcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0J1dHRvbk5leHRDc3NcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnV0dG9uTmV4dENzcztcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb0J1dHRvblByZXZDc3NcIixcbiAgICAgIGtvLnB1cmVDb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnV0dG9uUHJldkNzcztcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb1Byb2dyZXNzVGV4dFwiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5wcm9ncmVzc1RleHQ7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnNldE9ic2VydmFsZU9iaihcbiAgICAgIFwia29Qcm9ncmVzc1wiLFxuICAgICAga28ucHVyZUNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rb1JlY2FsYygpO1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9ncmVzcztcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnNldENhbGxiYWNrRnVuYyhcImtvUGFuZWxBZnRlclJlbmRlclwiLCAoZWw6IGFueSwgY29uOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucGFuZWxBZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9KTtcbiAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLm9uUGFuZWxDb3VudENoYW5nZWQoKTtcbiAgICB9O1xuICAgICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+dGhpcy5xdWVzdGlvbikucmVuZGVyTW9kZUNoYW5nZWRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMub25SZW5kZXJNb2RlQ2hhbmdlZCgpO1xuICAgIH07XG4gICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLm9uQ3VycmVudEluZGV4Q2hhbmdlZCgpO1xuICAgIH07XG4gIH1cbiAgcHJvdGVjdGVkIG9uUGFuZWxDb3VudENoYW5nZWQoKSB7XG4gICAgdGhpcy5vbkN1cnJlbnRJbmRleENoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZW5kZXJNb2RlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLm9uQ3VycmVudEluZGV4Q2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvbkN1cnJlbnRJbmRleENoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uaXNEaXNwb3NlZCkgcmV0dXJuO1xuICAgIHRoaXMua29SZWNhbGModGhpcy5rb1JlY2FsYygpICsgMSk7XG4gICAgdGhpcy5xdWVzdGlvbi5rb1JhbmdlVmFsdWUoXG4gICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLmN1cnJlbnRJbmRleFxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGFkZFBhbmVsKCkge1xuICAgICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+dGhpcy5xdWVzdGlvbikuYWRkUGFuZWxVSSgpO1xuICB9XG4gIHByb3RlY3RlZCByZW1vdmVQYW5lbCh2YWw6IGFueSkge1xuICAgIHZhciBxID0gPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb247XG4gICAgaWYgKCFxLmlzUmVuZGVyTW9kZUxpc3QpIHtcbiAgICAgIHZhbCA9IHEuY3VycmVudFBhbmVsO1xuICAgIH1cbiAgICBxLnJlbW92ZVBhbmVsVUkodmFsKTtcbiAgfVxuICBwcml2YXRlIHBhbmVsQWZ0ZXJSZW5kZXIoZWxlbWVudHM6IGFueSwgY29uOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24gfHwgIXRoaXMucXVlc3Rpb24uc3VydmV5KSByZXR1cm47XG4gICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICB0aGlzLnF1ZXN0aW9uLnN1cnZleS5hZnRlclJlbmRlclBhbmVsKGNvbiwgZWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBidXR0b25BZGRDc3MoKSB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbjtcbiAgICB2YXIgYnRuQ2xhc3NlcyA9XG4gICAgICBxdWVzdGlvbi5jc3NDbGFzc2VzLmJ1dHRvbiArIFwiIFwiICsgcXVlc3Rpb24uY3NzQ2xhc3Nlcy5idXR0b25BZGQ7XG5cbiAgICBpZiAodGhpcy5xdWVzdGlvbi5yZW5kZXJNb2RlID09PSBcImxpc3RcIikge1xuICAgICAgYnRuQ2xhc3NlcyArPSBcIiBcIiArIHF1ZXN0aW9uLmNzc0NsYXNzZXMuYnV0dG9uQWRkICsgXCItLWxpc3QtbW9kZVwiO1xuICAgIH1cblxuICAgIHJldHVybiBidG5DbGFzc2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBidXR0b25QcmV2Q3NzKCkge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMucXVlc3Rpb247XG4gICAgdmFyIGJ0bkNsYXNzZXMgPSBxdWVzdGlvbi5jc3NDbGFzc2VzLmJ1dHRvblByZXY7XG4gICAgaWYgKCFxdWVzdGlvbi5pc1ByZXZCdXR0b25TaG93aW5nKSB7XG4gICAgICBidG5DbGFzc2VzICs9IFwiIFwiICsgcXVlc3Rpb24uY3NzQ2xhc3Nlcy5idXR0b25QcmV2ICsgXCItLWRpc2FibGVkXCI7XG4gICAgfVxuICAgIHJldHVybiBidG5DbGFzc2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBidXR0b25OZXh0Q3NzKCkge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMucXVlc3Rpb247XG4gICAgdmFyIGJ0bkNsYXNzZXMgPSBxdWVzdGlvbi5jc3NDbGFzc2VzLmJ1dHRvbk5leHQ7XG4gICAgaWYgKCFxdWVzdGlvbi5pc05leHRCdXR0b25TaG93aW5nKSB7XG4gICAgICBidG5DbGFzc2VzICs9IFwiIFwiICsgcXVlc3Rpb24uY3NzQ2xhc3Nlcy5idXR0b25OZXh0ICsgXCItLWRpc2FibGVkXCI7XG4gICAgfVxuICAgIHJldHVybiBidG5DbGFzc2VzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBwcm9ncmVzcygpIHtcbiAgICB2YXIgcmFuZ2VNYXggPSB0aGlzLnF1ZXN0aW9uLnBhbmVsQ291bnQgLSAxO1xuICAgIHJldHVybiAodGhpcy5xdWVzdGlvbi5jdXJyZW50SW5kZXggLyByYW5nZU1heCkgKiAxMDAgKyBcIiVcIjtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5yZW5kZXJNb2RlQ2hhbmdlZENhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+KFxuICAgICAgdGhpcy5xdWVzdGlvblxuICAgICkpLmN1cnJlbnRJbmRleENoYW5nZWRDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljIGV4dGVuZHMgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvblBhbmVsRHluYW1pY0ltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY0ltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcInBhbmVsZHluYW1pY1wiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pYyhcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInBhbmVsZHluYW1pY1wiLCAobmFtZSkgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJhZGlvZ3JvdXAgZXh0ZW5kcyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcInJhZGlvZ3JvdXBcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25SYWRpb2dyb3VwKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmFkaW9ncm91cFwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25SYWRpb2dyb3VwKG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25SYW5raW5nTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJhbmtpbmcgZXh0ZW5kcyBRdWVzdGlvblJhbmtpbmdNb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkltcGxlbWVudG9yO1xuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcInJhbmtpbmdcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25SYW5raW5nKFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhbmtpbmdcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uUmFua2luZyhuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25SYXRpbmdNb2RlbCxcbiAgU2VyaWFsaXplcixcbiAgUXVlc3Rpb25GYWN0b3J5LFxuICBRdWVzdGlvbixcbn0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJhdGluZ0ltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25JbXBsZW1lbnRvciB7XG4gIGtvVmlzaWJsZVJhdGVWYWx1ZXM6IGFueTtcbiAgcHJvdGVjdGVkIG9uQ3JlYXRlZCgpIHt9XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLm9uQ3JlYXRlZCgpO1xuICAgIHRoaXMua29WaXNpYmxlUmF0ZVZhbHVlcyA9IHRoaXMuc2V0T2JzZXJ2YWxlT2JqKFxuICAgICAgXCJrb1Zpc2libGVSYXRlVmFsdWVzXCIsXG4gICAgICBrby5vYnNlcnZhYmxlQXJyYXkoKVxuICAgICk7XG4gICAgKDxRdWVzdGlvblJhdGluZz50aGlzLnF1ZXN0aW9uKS5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5vblJhdGVWYWx1ZXNDaGFuZ2VkKCk7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25SYXRlVmFsdWVzQ2hhbmdlZCgpIHtcbiAgICB0aGlzLmtvVmlzaWJsZVJhdGVWYWx1ZXModGhpcy5nZXRWYWx1ZXMoKSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuICg8UXVlc3Rpb25SYXRpbmc+dGhpcy5xdWVzdGlvbikudmlzaWJsZVJhdGVWYWx1ZXM7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgKDxRdWVzdGlvblJhdGluZz50aGlzLnF1ZXN0aW9uKS5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYXRpbmcgZXh0ZW5kcyBRdWVzdGlvblJhdGluZ01vZGVsIHtcbiAgcHJpdmF0ZSBfaW1wbGVtZW50b3I6IFF1ZXN0aW9uUmF0aW5nSW1wbGVtZW50b3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gbmV3IFF1ZXN0aW9uUmF0aW5nSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5faW1wbGVtZW50b3IuZGlzcG9zZSgpO1xuICAgIHRoaXMuX2ltcGxlbWVudG9yID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKFwicmF0aW5nXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUmF0aW5nKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmF0aW5nXCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25SYXRpbmcobmFtZSk7XG59KTtcbiIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5LCBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uU2lnbmF0dXJlUGFkIGV4dGVuZHMgUXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbCB7XG4gIHByaXZhdGUgX2ltcGxlbWVudG9yOiBRdWVzdGlvbkltcGxlbWVudG9yO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMuX2ltcGxlbWVudG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLl9pbXBsZW1lbnRvciA9IHVuZGVmaW5lZDtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5vdmVycmlkZUNsYXNzQ3JlYXRvcihcInNpZ25hdHVyZXBhZFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblNpZ25hdHVyZVBhZChcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInNpZ25hdHVyZXBhZFwiLCAobmFtZSkgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uU2lnbmF0dXJlUGFkKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25UZXh0IGV4dGVuZHMgUXVlc3Rpb25UZXh0TW9kZWwge1xuICBwcml2YXRlIF9pbXBsZW1lbnRvcjogUXVlc3Rpb25JbXBsZW1lbnRvcjtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmFzZUNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQmFzZUNyZWF0aW5nKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9pbXBsZW1lbnRvci5kaXNwb3NlKCk7XG4gICAgdGhpcy5faW1wbGVtZW50b3IgPSB1bmRlZmluZWQ7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIub3ZlcnJpZGVDbGFzc0NyZWF0b3IoXCJ0ZXh0XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dChcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInRleHRcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0KG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uLCBTdXJ2ZXlNb2RlbCB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSVBhZ2UsIFN1cnZleUVsZW1lbnQgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFBhZ2UsIFBhbmVsIH0gZnJvbSBcIi4va29wYWdlXCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsga29UZW1wbGF0ZSwgU3VydmV5VGVtcGxhdGVUZXh0IH0gZnJvbSBcIi4vdGVtcGxhdGVUZXh0XCI7XG5pbXBvcnQgeyBDdXN0b21XaWRnZXRDb2xsZWN0aW9uIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCJzdXJ2ZXktY29yZVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcInN1cnZleS1jb3JlXCI7XG5pbXBvcnQgeyBJbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi9rb2Jhc2VcIjtcbmltcG9ydCB7IFN0eWxlc01hbmFnZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcblxuQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbi5JbnN0YW5jZS5vbkN1c3RvbVdpZGdldEFkZGVkLmFkZChjdXN0b21XaWRnZXQgPT4ge1xuICBpZiAoY3VzdG9tV2lkZ2V0LndpZGdldEpzb24uaXNEZWZhdWx0UmVuZGVyKSByZXR1cm47XG4gIGlmICghY3VzdG9tV2lkZ2V0Lmh0bWxUZW1wbGF0ZSlcbiAgICBjdXN0b21XaWRnZXQuaHRtbFRlbXBsYXRlID1cbiAgICAgIFwiPGRpdj4naHRtbFRlbXBsYXRlJyBhdHRyaWJ1dGUgaXMgbWlzc2VkLjwvZGl2PlwiO1xuICBuZXcgU3VydmV5VGVtcGxhdGVUZXh0KCkucmVwbGFjZVRleHQoXG4gICAgY3VzdG9tV2lkZ2V0Lmh0bWxUZW1wbGF0ZSxcbiAgICBcIndpZGdldFwiLFxuICAgIGN1c3RvbVdpZGdldC5uYW1lXG4gICk7XG59KTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleSBleHRlbmRzIFN1cnZleU1vZGVsIHtcbiAgcHVibGljIHN0YXRpYyBnZXQgY3NzVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlDc3MuY3VycmVudFR5cGU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgY3NzVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgU3R5bGVzTWFuYWdlci5hcHBseVRoZW1lKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHJlbmRlcmVkRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgaXNGaXJzdFJlbmRlcjogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgbW91c2VEb3duUGFnZTogYW55ID0gbnVsbDtcblxuICBrb0N1cnJlbnRQYWdlOiBhbnk7XG4gIGtvSXNGaXJzdFBhZ2U6IGFueTtcbiAga29Jc0xhc3RQYWdlOiBhbnk7XG4gIGR1bW15T2JzZXJ2YWJsZTogYW55O1xuICBrb1N0YXRlOiBhbnk7XG4gIGtvQWZ0ZXJSZW5kZXJQYWdlOiBhbnk7XG4gIGtvQWZ0ZXJSZW5kZXJIZWFkZXI6IGFueTtcbiAga29Db21wbGV0ZWRTdGF0ZTogYW55O1xuICBrb0NvbXBsZXRlZFN0YXRlVGV4dDogYW55O1xuICBrb0NvbXBsZXRlZFN0YXRlQ3NzOiBhbnk7XG4gIGtvVGltZXJJbmZvVGV4dDogYW55O1xuICBrb1RpdGxlVGVtcGxhdGU6IGFueSA9IDxhbnk+a28ub2JzZXJ2YWJsZShcInN1cnZleS1oZWFkZXJcIik7XG5cbiAgcHVibGljIGdldERhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaDogYW55LCBrZXk6IHN0cmluZykge1xuICAgIGlmICghIXRoaXMuZWRpdGluZ09iaikgcmV0dXJuIHN1cGVyLmdldERhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaCwga2V5KTtcbiAgICBpZiAodmFsdWVzSGFzaFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlc0hhc2hba2V5XSA9IGtvLm9ic2VydmFibGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIGtvLnVud3JhcCh2YWx1ZXNIYXNoW2tleV0pO1xuICB9XG4gIHB1YmxpYyBzZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoISF0aGlzLmVkaXRpbmdPYmopIHtcbiAgICAgIHN1cGVyLnNldERhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaCwga2V5LCB2YWx1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrby5pc1dyaXRlYWJsZU9ic2VydmFibGUodmFsdWVzSGFzaFtrZXldKSkge1xuICAgICAgdmFsdWVzSGFzaFtrZXldKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWVzSGFzaFtrZXldID0ga28ub2JzZXJ2YWJsZSh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBkZWxldGVEYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoISF0aGlzLmVkaXRpbmdPYmopIHtcbiAgICAgIHN1cGVyLmRlbGV0ZURhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaCwga2V5KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZSh2YWx1ZXNIYXNoW2tleV0pKSB7XG4gICAgICB2YWx1ZXNIYXNoW2tleV0odW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlc0hhc2hba2V5XTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBqc29uT2JqOiBhbnkgPSBudWxsLFxuICAgIHJlbmRlcmVkRWxlbWVudDogYW55ID0gbnVsbCxcbiAgICBjc3M6IGFueSA9IG51bGxcbiAgKSB7XG4gICAgc3VwZXIoanNvbk9iaik7XG4gICAgaWYgKHR5cGVvZiBrbyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImtub2Nrb3V0anMgbGlicmFyeSBpcyBub3QgbG9hZGVkLlwiKTtcblxuICAgIGlmIChjc3MpIHtcbiAgICAgIHRoaXMuY3NzID0gY3NzO1xuICAgIH1cbiAgICBpZiAocmVuZGVyZWRFbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudDtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXIocmVuZGVyZWRFbGVtZW50KTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CYXNlQ3JlYXRpbmcoKSB7XG4gICAgc3VwZXIub25CYXNlQ3JlYXRpbmcoKTtcbiAgICBuZXcgSW1wbGVtZW50b3JCYXNlKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBuZXh0UGFnZVVJQ2xpY2soKSB7XG4gICAgaWYgKCEhdGhpcy5tb3VzZURvd25QYWdlICYmIHRoaXMubW91c2VEb3duUGFnZSAhPT0gdGhpcy5jdXJyZW50UGFnZSkgcmV0dXJuO1xuICAgIHRoaXMubW91c2VEb3duUGFnZSA9IG51bGw7XG4gICAgdGhpcy5uZXh0UGFnZSgpO1xuICB9XG4gIHB1YmxpYyBuZXh0UGFnZU1vdXNlRG93bigpIHtcbiAgICB0aGlzLm1vdXNlRG93blBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25Nb3VzZURvd24oKTtcbiAgfVxuICBwdWJsaWMgcmVuZGVyKGVsZW1lbnQ6IGFueSA9IG51bGwpIHtcbiAgICB0aGlzLnVwZGF0ZUtvQ3VycmVudFBhZ2UoKTtcbiAgICB0aGlzLnVwZGF0ZUN1c3RvbVdpZGdldHModGhpcy5jdXJyZW50UGFnZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChlbGVtZW50ICYmIHR5cGVvZiBlbGVtZW50ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRFbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG4gICAgZWxlbWVudCA9IHRoaXMucmVuZGVyZWRFbGVtZW50O1xuICAgIHNlbGYuc3RhcnRUaW1lckZyb21VSSgpO1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuICAgIHNlbGYuYXBwbHlCaW5kaW5nKCk7XG4gIH1cbiAgcHVibGljIGNsZWFyKGNsZWFyRGF0YTogYm9vbGVhbiA9IHRydWUsIGdvdG9GaXJzdFBhZ2U6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIuY2xlYXIoY2xlYXJEYXRhLCBnb3RvRmlyc3RQYWdlKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG4gIHB1YmxpYyBsb2NhbGVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY2FsZUNoYW5nZWQoKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG4gIHB1YmxpYyBrb0V2ZW50QWZ0ZXJSZW5kZXIoZWxlbWVudDogYW55LCBzdXJ2ZXk6IGFueSkge1xuICAgIHN1cnZleS5hZnRlclJlbmRlclN1cnZleShlbGVtZW50KTtcbiAgfVxuICBwdWJsaWMgbG9hZFN1cnZleUZyb21TZXJ2aWNlKFxuICAgIHN1cnZleUlkOiBzdHJpbmcgPSBudWxsLFxuICAgIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLFxuICAgIHJlbmRlcmVkRWxlbWVudDogYW55ID0gbnVsbFxuICApIHtcbiAgICBpZiAocmVuZGVyZWRFbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudDtcbiAgICB9XG4gICAgc3VwZXIubG9hZFN1cnZleUZyb21TZXJ2aWNlKHN1cnZleUlkLCBjbGllbnRJZCk7XG4gIH1cbiAgcHVibGljIHNldENvbXBsZXRlZCgpIHtcbiAgICBzdXBlci5zZXRDb21wbGV0ZWQoKTtcbiAgICB0aGlzLnVwZGF0ZUtvQ3VycmVudFBhZ2UoKTtcbiAgfVxuICBwdWJsaWMgc3RhcnQoKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IHN1cGVyLnN0YXJ0KCk7XG4gICAgdGhpcy51cGRhdGVLb0N1cnJlbnRQYWdlKCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgY3JlYXRlTmV3UGFnZShuYW1lOiBzdHJpbmcpOiBQYWdlTW9kZWwge1xuICAgIHJldHVybiBuZXcgUGFnZShuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SHRtbFRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGtvVGVtcGxhdGU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmVmb3JlQ3JlYXRpbmcoKSB7XG4gICAgdGhpcy5kdW1teU9ic2VydmFibGUgPSBrby5vYnNlcnZhYmxlKDApO1xuICAgIHRoaXMua29DdXJyZW50UGFnZSA9IGtvLm9ic2VydmFibGUodGhpcy5jdXJyZW50UGFnZSk7XG4gICAgdGhpcy5pc0N1cnJlbnRQYWdlRW1wdHkgPSBrby5jb21wdXRlZChcbiAgICAgICgpID0+XG4gICAgICAgICEhdGhpcy5rb0N1cnJlbnRQYWdlKCkgJiZcbiAgICAgICAgdGhpcy5nZXRSb3dzKHRoaXMua29DdXJyZW50UGFnZSgpKS5sZW5ndGggPT09IDBcbiAgICApO1xuICAgIHRoaXMua29Jc0ZpcnN0UGFnZSA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHRoaXMuZHVtbXlPYnNlcnZhYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5pc0ZpcnN0UGFnZTtcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNMYXN0UGFnZSA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHRoaXMuZHVtbXlPYnNlcnZhYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5pc0xhc3RQYWdlO1xuICAgIH0pO1xuICAgIHRoaXMua29TdGF0ZSA9IGtvLm9ic2VydmFibGUodGhpcy5zdGF0ZSk7XG4gICAgdGhpcy5rb0NvbXBsZXRlZFN0YXRlID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcbiAgICB0aGlzLmtvQ29tcGxldGVkU3RhdGVUZXh0ID0ga28ub2JzZXJ2YWJsZShcIlwiKTtcbiAgICB0aGlzLmtvQ29tcGxldGVkU3RhdGVDc3MgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHRoaXMua29UaW1lckluZm9UZXh0ID0ga28ub2JzZXJ2YWJsZSh0aGlzLnRpbWVySW5mb1RleHQpO1xuICAgIHRoaXMua29BZnRlclJlbmRlclBhZ2UgPSAoZWxlbWVudHM6IGFueSwgY29uOiBhbnkpID0+IHtcbiAgICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgICBpZiAoZWwpIHRoaXMuYWZ0ZXJSZW5kZXJQYWdlKGVsKTtcbiAgICB9O1xuICAgIHRoaXMua29BZnRlclJlbmRlckhlYWRlciA9IChlbGVtZW50czogYW55LCBjb246IGFueSkgPT4ge1xuICAgICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICAgIGlmIChlbCkgdGhpcy5hZnRlclJlbmRlckhlYWRlcihlbCk7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgY3VycmVudFBhZ2VDaGFuZ2VkKG5ld1ZhbHVlOiBQYWdlTW9kZWwsIG9sZFZhbHVlOiBQYWdlTW9kZWwpIHtcbiAgICB0aGlzLnVwZGF0ZUtvQ3VycmVudFBhZ2UoKTtcbiAgICBzdXBlci5jdXJyZW50UGFnZUNoYW5nZWQobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICBpZiAoIXRoaXMuaXNEZXNpZ25Nb2RlKSB0aGlzLnNjcm9sbFRvVG9wT25QYWdlQ2hhbmdlKCk7XG4gIH1cbiAgcGFnZVZpc2liaWxpdHlDaGFuZ2VkKHBhZ2U6IElQYWdlLCBuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIHN1cGVyLnBhZ2VWaXNpYmlsaXR5Q2hhbmdlZChwYWdlLCBuZXdWYWx1ZSk7XG4gICAgdGhpcy51cGRhdGVLb0N1cnJlbnRQYWdlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCkge1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCkge1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENvbXBsZXRlZFN0YXRlKHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgIHN1cGVyLnNldENvbXBsZXRlZFN0YXRlKHZhbHVlLCB0ZXh0KTtcbiAgICB0aGlzLmtvQ29tcGxldGVkU3RhdGUodGhpcy5jb21wbGV0ZWRTdGF0ZSk7XG4gICAgdGhpcy5rb0NvbXBsZXRlZFN0YXRlVGV4dCh0aGlzLmNvbXBsZXRlZFN0YXRlVGV4dCk7XG4gICAgdGhpcy5rb0NvbXBsZXRlZFN0YXRlQ3NzKFxuICAgICAgdGhpcy5jb21wbGV0ZWRTdGF0ZSAhPT0gXCJcIiA/IHRoaXMuY3NzLnNhdmVEYXRhW3RoaXMuY29tcGxldGVkU3RhdGVdIDogXCJcIlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGRvVGltZXIoKSB7XG4gICAgc3VwZXIuZG9UaW1lcigpO1xuICAgIHRoaXMua29UaW1lckluZm9UZXh0KHRoaXMudGltZXJJbmZvVGV4dCk7XG4gIH1cbiAgcHJpdmF0ZSBhcHBseUJpbmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnJlbmRlcmVkRWxlbWVudCkgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlS29DdXJyZW50UGFnZSgpO1xuICAgIGtvLmNsZWFuTm9kZSh0aGlzLnJlbmRlcmVkRWxlbWVudCk7XG4gICAgaWYgKCF0aGlzLmlzRmlyc3RSZW5kZXIpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFBhZ2VRdWVzdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5pc0ZpcnN0UmVuZGVyID0gZmFsc2U7XG4gICAga28ucmVuZGVyVGVtcGxhdGUoXG4gICAgICBcInN1cnZleS1jb250ZW50XCIsXG4gICAgICB0aGlzLFxuICAgICAgeyBhZnRlclJlbmRlcjogdGhpcy5rb0V2ZW50QWZ0ZXJSZW5kZXIgfSxcbiAgICAgIHRoaXMucmVuZGVyZWRFbGVtZW50XG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUtvQ3VycmVudFBhZ2UoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHwgdGhpcy5pc0Rpc3Bvc2VkKSByZXR1cm47XG4gICAgdGhpcy5kdW1teU9ic2VydmFibGUodGhpcy5kdW1teU9ic2VydmFibGUoKSArIDEpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlICE9PSB0aGlzLmtvQ3VycmVudFBhZ2UoKSkge1xuICAgICAgdGhpcy5rb0N1cnJlbnRQYWdlKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIH1cbiAgICB0aGlzLmtvU3RhdGUodGhpcy5zdGF0ZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRSb3dzKHBubDogYW55KTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuICEhcG5sW1wia29Sb3dzXCJdID8gcG5sW1wia29Sb3dzXCJdKCkgOiBwbmwucm93cztcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUN1cnJlbnRQYWdlUXVlc3Rpb25zKCkge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5jdXJyZW50UGFnZSA/IHRoaXMuY3VycmVudFBhZ2UucXVlc3Rpb25zIDogW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKHEudmlzaWJsZSkgcVtcInVwZGF0ZVF1ZXN0aW9uXCJdKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyB1cGRhdGVTdXJ2ZXkobmV3UHJvcHM6IGFueSwgb2xkUHJvcHM/OiBhbnkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gbmV3UHJvcHMpIHtcbiAgICAgIGlmIChrZXkgPT0gXCJtb2RlbFwiIHx8IGtleSA9PSBcImNoaWxkcmVuXCIpIGNvbnRpbnVlO1xuICAgICAgaWYgKGtleSA9PSBcImNzc1wiKSB7XG4gICAgICAgIHRoaXMubWVyZ2VWYWx1ZXMobmV3UHJvcHMuY3NzLCB0aGlzLmdldENzcygpKTtcbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGtleS5pbmRleE9mKFwib25cIikgPT0gMCAmJiB0aGlzW2tleV0gJiYgdGhpc1trZXldLmFkZCkge1xuICAgICAgICBsZXQgZnVuY0JvZHkgPSBuZXdQcm9wc1trZXldO1xuICAgICAgICBsZXQgZnVuYyA9IGZ1bmN0aW9uKHNlbmRlcjogYW55LCBvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgICBmdW5jQm9keShzZW5kZXIsIG9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzW2tleV0uYWRkKGZ1bmMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1trZXldID0gbmV3UHJvcHNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV3UHJvcHMgJiYgbmV3UHJvcHMuZGF0YSlcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuYWRkKChzZW5kZXIsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgbmV3UHJvcHMuZGF0YVtvcHRpb25zLm5hbWVdID0gb3B0aW9ucy52YWx1ZTtcbiAgICAgIH0pO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICBpZiAoISF0aGlzLnJlbmRlcmVkRWxlbWVudCkge1xuICAgICAga28uY2xlYW5Ob2RlKHRoaXMucmVuZGVyZWRFbGVtZW50KTtcbiAgICAgIHRoaXMucmVuZGVyZWRFbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICAgIHRoaXMua29BZnRlclJlbmRlclBhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5rb0FmdGVyUmVuZGVySGVhZGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNDdXJyZW50UGFnZUVtcHR5LmRpc3Bvc2UoKTtcbiAgICB0aGlzLmtvSXNGaXJzdFBhZ2UuZGlzcG9zZSgpO1xuICAgIHRoaXMua29Jc0xhc3RQYWdlLmRpc3Bvc2UoKTtcbiAgICB0aGlzLml0ZXJhdGVQcm9wZXJ0aWVzSGFzaCgoaGFzaCwga2V5KSA9PiB7XG4gICAgICBkZWxldGUgaGFzaFtrZXldO1xuICAgIH0pO1xuICAgIHRoaXMua29DdXJyZW50UGFnZSh1bmRlZmluZWQpO1xuICB9XG59XG5cbkxvY2FsaXphYmxlU3RyaW5nLnByb3RvdHlwZVtcIm9uQ3JlYXRpbmdcIl0gPSBmdW5jdGlvbigpIHtcbiAgLy8gdmFyIHNlbGYgPSB0aGlzO1xuICAvLyB0aGlzLmtvUmVSZW5kZXIgPSBrby5vYnNlcnZhYmxlKDApO1xuICB0aGlzLmtvSGFzSHRtbCA9IGtvLm9ic2VydmFibGUodGhpcy5oYXNIdG1sKTtcbiAgdGhpcy5rb1JlbmRlcmVkSHRtbCA9IGtvLm9ic2VydmFibGUodGhpcy5yZW5kZXJlZEh0bWwpO1xuICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZiwgXCJrb0hhc0h0bWxcIiwge1xuICAvLyAgIGdldDogKCkgPT4ge1xuICAvLyAgICAgc2VsZi5rb1JlUmVuZGVyKCk7XG4gIC8vICAgICByZXR1cm4gc2VsZi5oYXNIdG1sO1xuICAvLyAgIH0sXG4gIC8vIH0pO1xuICAvLyB0aGlzLmtvUmVuZGVyZWRIdG1sID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAvLyAgIHNlbGYua29SZVJlbmRlcigpO1xuICAvLyAgIHJldHVybiBzZWxmLnJlbmRlcmVkSHRtbDtcbiAgLy8gfSk7XG59O1xuXG5JdGVtVmFsdWUucHJvdG90eXBlW1wib25DcmVhdGluZ1wiXSA9IGZ1bmN0aW9uKCkge1xuICBuZXcgSW1wbGVtZW50b3JCYXNlKHRoaXMpO1xufTtcblxuTG9jYWxpemFibGVTdHJpbmcucHJvdG90eXBlW1wib25DaGFuZ2VkXCJdID0gZnVuY3Rpb24oKSB7XG4gIC8vIHRoaXMua29SZVJlbmRlcih0aGlzLmtvUmVSZW5kZXIoKSArIDEpO1xuICBjb25zdCBoYXNIdG1sID0gdGhpcy5oYXNIdG1sO1xuICB0aGlzLmtvSGFzSHRtbChoYXNIdG1sKTtcbiAgdGhpcy5rb1JlbmRlcmVkSHRtbChoYXNIdG1sID8gdGhpcy5nZXRIdG1sVmFsdWUoKSA6IHRoaXMuY2FsY3VsYXRlZFRleHQpO1xufTtcblxua28uY29tcG9uZW50cy5yZWdpc3RlcihcInN1cnZleVwiLCB7XG4gIHZpZXdNb2RlbDoge1xuICAgIGNyZWF0ZVZpZXdNb2RlbDogZnVuY3Rpb24ocGFyYW1zOiBhbnksIGNvbXBvbmVudEluZm86IGFueSkge1xuICAgICAgdmFyIHN1cnZleTogU3VydmV5ID0ga28udW53cmFwKHBhcmFtcy5zdXJ2ZXkpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHZhciBzdXJ2ZXlSb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgY29tcG9uZW50SW5mby5lbGVtZW50LmFwcGVuZENoaWxkKHN1cnZleVJvb3QpO1xuICAgICAgICBzdXJ2ZXkucmVuZGVyKHN1cnZleVJvb3QpO1xuICAgICAgfSwgMSk7XG4gICAgICAvLyAhIWtvLnRhc2tzICYmIGtvLnRhc2tzLnJ1bkVhcmx5KCk7XG4gICAgICByZXR1cm4gcGFyYW1zLnN1cnZleTtcbiAgICB9LFxuICB9LFxuICB0ZW1wbGF0ZToga29UZW1wbGF0ZSxcbn0pO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbXCJzdXJ2ZXlQcm9wXCJdID0ge1xuICB1cGRhdGU6IGZ1bmN0aW9uKGVsZW1lbnQ6IGFueSwgdmFsdWVBY2Nlc3NvcjogYW55LCBhbGxCaW5kaW5nc0FjY2Vzc29yOiBhbnkpIHtcbiAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSkgfHwge307XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcE5hbWUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB2YXIgcHJvcFZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZVtwcm9wTmFtZV0pO1xuICAgICAgICBlbGVtZW50W3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuU3VydmV5TW9kZWwucGxhdGZvcm0gPSBcImtub2Nrb3V0XCI7XG5cbmV4cG9ydCB2YXIgcmVnaXN0ZXJUZW1wbGF0ZUVuZ2luZSA9IChrbzogYW55LCBwbGF0Zm9ybTogc3RyaW5nKSA9PiB7XG4gICg8YW55PmtvKS5zdXJ2ZXlUZW1wbGF0ZUVuZ2luZSA9IGZ1bmN0aW9uKCkge307XG5cbiAgKDxhbnk+a28pLnN1cnZleVRlbXBsYXRlRW5naW5lLnByb3RvdHlwZSA9IG5ldyBrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZSgpO1xuXG4gICg8YW55PmtvKS5zdXJ2ZXlUZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGUubWFrZVRlbXBsYXRlU291cmNlID0gZnVuY3Rpb24oXG4gICAgdGVtcGxhdGU6IGFueSxcbiAgICB0ZW1wbGF0ZURvY3VtZW50OiBhbnlcbiAgKSB7XG4gICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGVtcGxhdGVEb2N1bWVudCA9IHRlbXBsYXRlRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gICAgICB2YXIgdGVtcGxhdGVFbGVtZW50Um9vdCA9IHRlbXBsYXRlRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAgIFwic3VydmV5LWNvbnRlbnQtXCIgKyBwbGF0Zm9ybVxuICAgICAgKTtcbiAgICAgIGlmICghdGVtcGxhdGVFbGVtZW50Um9vdCkge1xuICAgICAgICB0ZW1wbGF0ZUVsZW1lbnRSb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGVtcGxhdGVFbGVtZW50Um9vdC5pZCA9IFwic3VydmV5LWNvbnRlbnQtXCIgKyBTdXJ2ZXlNb2RlbC5wbGF0Zm9ybTtcbiAgICAgICAgdGVtcGxhdGVFbGVtZW50Um9vdC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIHRlbXBsYXRlRWxlbWVudFJvb3QuaW5uZXJIVE1MID0ga29UZW1wbGF0ZTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wbGF0ZUVsZW1lbnRSb290KTtcbiAgICAgIH1cbiAgICAgIHZhciBlbGVtO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZW1wbGF0ZUVsZW1lbnRSb290LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZW1wbGF0ZUVsZW1lbnRSb290LmNoaWxkcmVuW2ldLmlkID09PSB0ZW1wbGF0ZSkge1xuICAgICAgICAgIGVsZW0gPSB0ZW1wbGF0ZUVsZW1lbnRSb290LmNoaWxkcmVuW2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWVsZW0pIHtcbiAgICAgICAgZWxlbSA9IHRlbXBsYXRlRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGVtcGxhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKCFlbGVtKSB7XG4gICAgICAgIHJldHVybiBuZXcga28ubmF0aXZlVGVtcGxhdGVFbmdpbmUoKS5tYWtlVGVtcGxhdGVTb3VyY2UoXG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgdGVtcGxhdGVEb2N1bWVudFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudChlbGVtKTtcbiAgICB9IGVsc2UgaWYgKHRlbXBsYXRlLm5vZGVUeXBlID09PSAxIHx8IHRlbXBsYXRlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICByZXR1cm4gbmV3IGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdGVtcGxhdGUgdHlwZTogXCIgKyB0ZW1wbGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIC8vICg8YW55PmtvKS5zdXJ2ZXlUZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGUucmVuZGVyVGVtcGxhdGVTb3VyY2UgPSBmdW5jdGlvbiAodGVtcGxhdGVTb3VyY2U6IGFueSwgYmluZGluZ0NvbnRleHQ6IGFueSwgb3B0aW9uczogYW55LCB0ZW1wbGF0ZURvY3VtZW50OiBhbnkpIHtcbiAgLy8gICB2YXIgdXNlTm9kZXNJZkF2YWlsYWJsZSA9ICEoKDxhbnk+a28udXRpbHMpLmllVmVyc2lvbiA8IDkpLFxuICAvLyAgICAgdGVtcGxhdGVOb2Rlc0Z1bmMgPSB1c2VOb2Rlc0lmQXZhaWxhYmxlID8gdGVtcGxhdGVTb3VyY2VbXCJub2Rlc1wiXSA6IG51bGwsXG4gIC8vICAgICB0ZW1wbGF0ZU5vZGVzID0gdGVtcGxhdGVOb2Rlc0Z1bmMgPyB0ZW1wbGF0ZVNvdXJjZVtcIm5vZGVzXCJdKCkgOiBudWxsO1xuICAvLyAgIGlmICh0ZW1wbGF0ZU5vZGVzKSB7XG4gIC8vICAgICByZXR1cm4gKDxhbnk+a28udXRpbHMpLm1ha2VBcnJheSh0ZW1wbGF0ZU5vZGVzLmNsb25lTm9kZSh0cnVlKS5jaGlsZE5vZGVzKTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgdmFyIHRlbXBsYXRlVGV4dCA9IHRlbXBsYXRlU291cmNlW1widGV4dFwiXSgpO1xuICAvLyAgICAgcmV0dXJuICg8YW55PmtvLnV0aWxzKS5wYXJzZUh0bWxGcmFnbWVudCh0ZW1wbGF0ZVRleHQsIHRlbXBsYXRlRG9jdW1lbnQpO1xuICAvLyAgIH1cbiAgLy8gfTtcblxuICB2YXIgc3VydmV5VGVtcGxhdGVFbmdpbmVJbnN0YW5jZSA9IG5ldyAoPGFueT5rbykuc3VydmV5VGVtcGxhdGVFbmdpbmUoKTtcbiAga28uc2V0VGVtcGxhdGVFbmdpbmUoc3VydmV5VGVtcGxhdGVFbmdpbmVJbnN0YW5jZSk7XG59O1xuIiwiZXhwb3J0IHZhciBrb1RlbXBsYXRlID0gcmVxdWlyZShcImh0bWwtbG9hZGVyP2ludGVycG9sYXRlIXZhbC1sb2FkZXIhLi90ZW1wbGF0ZXMvZW50cnkuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVRlbXBsYXRlVGV4dCB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgYWRkVGV4dChuZXdUZXh0OiBzdHJpbmcsIGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIGlkID0gdGhpcy5nZXRJZChpZCwgbmFtZSk7XG4gICAgdGhpcy50ZXh0ID1cbiAgICAgIHRoaXMudGV4dCArXG4gICAgICAnPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgJyArXG4gICAgICBpZCArXG4gICAgICBcIj5cIiArXG4gICAgICBuZXdUZXh0ICtcbiAgICAgIFwiPC9zY3JpcHQ+XCI7XG4gIH1cbiAgcHVibGljIHJlcGxhY2VUZXh0KFxuICAgIHJlcGxhY2VUZXh0OiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBxdWVzdGlvblR5cGU6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgdmFyIHBvc0lkID0gdGhpcy5nZXRJZChpZCwgcXVlc3Rpb25UeXBlKTtcbiAgICB2YXIgcG9zID0gdGhpcy50ZXh0LmluZGV4T2YocG9zSWQpO1xuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICB0aGlzLmFkZFRleHQocmVwbGFjZVRleHQsIGlkLCBxdWVzdGlvblR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwb3MgPSB0aGlzLnRleHQuaW5kZXhPZihcIj5cIiwgcG9zKTtcbiAgICBpZiAocG9zIDwgMCkgcmV0dXJuO1xuICAgIHZhciBzdGFydFBvcyA9IHBvcyArIDE7XG4gICAgdmFyIGVuZFN0cmluZyA9IFwiPC9zY3JpcHQ+XCI7XG4gICAgcG9zID0gdGhpcy50ZXh0LmluZGV4T2YoZW5kU3RyaW5nLCBzdGFydFBvcyk7XG4gICAgaWYgKHBvcyA8IDApIHJldHVybjtcbiAgICB0aGlzLnRleHQgPVxuICAgICAgdGhpcy50ZXh0LnN1YnN0cigwLCBzdGFydFBvcykgKyByZXBsYWNlVGV4dCArIHRoaXMudGV4dC5zdWJzdHIocG9zKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SWQoaWQ6IHN0cmluZywgcXVlc3Rpb25UeXBlOiBzdHJpbmcpIHtcbiAgICB2YXIgcmVzdWx0ID0gJ2lkPVwic3VydmV5LScgKyBpZDtcbiAgICBpZiAocXVlc3Rpb25UeXBlKSB7XG4gICAgICByZXN1bHQgKz0gXCItXCIgKyBxdWVzdGlvblR5cGU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgKyAnXCInO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBrb1RlbXBsYXRlO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAga29UZW1wbGF0ZSA9IHZhbHVlO1xuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktY29tbWVudFxcXCI+XFxuICA8IS0ta28gaWY6ICFxdWVzdGlvbi5pc1JlYWRPbmx5UmVuZGVyRGl2KCkgLS0+XFxuICAgICAgPCEtLWtvIGlmOiAhcXVlc3Rpb24uaXNJbnB1dFRleHRVcGRhdGUgLS0+XFxuICAgICAgPHRleHRhcmVhIHR5cGU9XFxcInRleHRcXFwiIGRhdGEtYmluZD1cXFwiZGlzYWJsZTogcXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5LCB2YWx1ZTogJGRhdGEucXVlc3Rpb24uY29tbWVudCwgdmlzaWJsZTogJGRhdGEudmlzaWJsZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLm90aGVyLCBhdHRyOiB7bWF4TGVuZ3RoOiBxdWVzdGlvbi5nZXRPdGhlcnNNYXhMZW5ndGgoKSwgJ2FyaWEtbGFiZWwnOiAhIXF1ZXN0aW9uLmxvY1RpdGxlICYmIHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCwgcGxhY2Vob2xkZXI6IHF1ZXN0aW9uLm90aGVyUGxhY2VIb2xkZXJ9XFxcIj48L3RleHRhcmVhPlxcbiAgICAgIDwhLS0va28tLT5cXG4gICAgICA8IS0ta28gaWY6IHF1ZXN0aW9uLmlzSW5wdXRUZXh0VXBkYXRlIC0tPlxcbiAgICAgIDx0ZXh0YXJlYSB0eXBlPVxcXCJ0ZXh0XFxcIiBkYXRhLWJpbmQ9XFxcImRpc2FibGU6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seSwgdGV4dElucHV0OiAkZGF0YS5xdWVzdGlvbi5jb21tZW50LCB2aXNpYmxlOiAkZGF0YS52aXNpYmxlLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkub3RoZXIsIGF0dHI6IHttYXhMZW5ndGg6IHF1ZXN0aW9uLmdldE90aGVyc01heExlbmd0aCgpLCAnYXJpYS1sYWJlbCc6ICEhcXVlc3Rpb24ubG9jVGl0bGUgJiYgcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sLCBwbGFjZWhvbGRlcjogcXVlc3Rpb24ub3RoZXJQbGFjZUhvbGRlcn1cXFwiPjwvdGV4dGFyZWE+XFxuICAgICAgPCEtLS9rby0tPlxcbiAgIDwhLS0va28tLT5cXG5cXG4gICAgPCEtLWtvIGlmOiBxdWVzdGlvbi5pc1JlYWRPbmx5UmVuZGVyRGl2KCkgLS0+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGV4dDogcXVlc3Rpb24uY29tbWVudFxcXCI+PC9kaXY+XFxuICAgIDwhLS0va28tLT5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktZmxvd3BhbmVsXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJzdHlsZTp7IGZsZXhCYXNpczogcmVuZGVyV2lkdGgsIGZsZXhHcm93OiAxLCBmbGV4U2hyaW5rOiAxLCB3aWR0aDogcmVuZGVyV2lkdGgsIG1pbldpZHRoOiAkZGF0YS5taW5XaWR0aCwgbWF4V2lkdGg6ICRkYXRhLm1heFdpZHRoIH0sIGF0dHI6IHtpZDogaWR9LCBjc3M6IGNzc0NsYXNzZXMucGFuZWwuY29udGFpbmVyXFxcIj5cXG4gICAgICA8aDQgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAocHJvY2Vzc2VkVGl0bGUubGVuZ3RoID4gMCksIGNzczogY3NzQ2xhc3Nlcy5wYW5lbC50aXRsZVxcXCI+XFxuICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NUaXRsZSB9IC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8L2g0PlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzc0NsYXNzZXMucGFuZWwuZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7IHBhZGRpbmdMZWZ0OiBpbm5lclBhZGRpbmdMZWZ0fVxcXCI+PC9kaXY+XFxuICAgICAgPGYtcGFuZWwgcGFyYW1zPVxcXCJxdWVzdGlvbjogcXVlc3Rpb25cXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge2NvbnRlbnRlZGl0YWJsZSA6IHF1ZXN0aW9uLmlzRGVzaWduTW9kZSwgcGxhY2VIb2xkZXI6IHF1ZXN0aW9uLnBsYWNlSG9sZGVyfVxcXCI+PC9mLXBhbmVsPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktZmxvd3BhbmVsLXF1ZXN0aW9uXFxcIj5cXG4gIDwhLS0ga28gd2l0aDogJHBhcmVudC5xdWVzdGlvbi5nZXRRdWVzdGlvbkJ5TmFtZSgkZGF0YSkgLS0+XFxuICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZToga29FbGVtZW50VHlwZSgpLCBkYXRhOiAkZGF0YSwgYXM6ICdxdWVzdGlvbicsIGFmdGVyUmVuZGVyOiBwYXJlbnQua29FbGVtZW50QWZ0ZXJSZW5kZXIgfSAtLT48IS0tIC9rbyAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1oZWFkZXJcXFwiPlxcbiAgPCEtLSBrbyBpZjogcmVuZGVyZWRIYXNIZWFkZXIgLS0+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MuaGVhZGVyXFxcIj5cXG4gICAgICA8IS0tIGtvIGlmOiBpc0xvZ29CZWZvcmUgLS0+XFxuICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKCRkYXRhLCAnbG9nby1pbWFnZScpLCBwYXJhbXM6IGdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50RGF0YSgkZGF0YSwgJ2xvZ28taW1hZ2UnKSB9IC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcblxcbiAgICAgIDwhLS0ga28gaWY6IHJlbmRlcmVkSGFzVGl0bGUgLS0+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmhlYWRlclRleHQsIHN0eWxlOiB7IG1heFdpZHRoOiB0aXRsZU1heFdpZHRoIH1cXFwiPlxcbiAgICAgICAgICA8aDMgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy50aXRsZVxcXCI+PCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY1RpdGxlIH0gLS0+PCEtLSAva28gLS0+PC9oMz5cXG4gICAgICAgICAgPGg1IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MuZGVzY3JpcHRpb25cXFwiPjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NEZXNjcmlwdGlvbiB9IC0tPjwhLS0gL2tvIC0tPjwvaDU+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPCEtLSAva28gLS0+XFxuXFxuICAgICAgPCEtLSBrbyBpZjogaXNMb2dvQWZ0ZXIgLS0+XFxuICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKCRkYXRhLCAnbG9nby1pbWFnZScpLCBwYXJhbXM6IGdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50RGF0YSgkZGF0YSwgJ2xvZ28taW1hZ2UnKSB9IC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuICA8IS0tIC9rbyAtLT5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktY29udGVudFxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3Mucm9vdCwgYWZ0ZXJSZW5kZXI6IGtvRXZlbnRBZnRlclJlbmRlclxcXCI+XFxuICAgICAgPGZvcm0gb25zdWJtaXQ9XFxcInJldHVybiBmYWxzZTtcXFwiPlxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdl9jdXN0b21faGVhZGVyXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICFoYXNMb2dvXFxcIj48L2Rpdj5cXG4gICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmNvbnRhaW5lclxcXCI+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6IGtvVGl0bGVUZW1wbGF0ZSwgYWZ0ZXJSZW5kZXI6IGtvQWZ0ZXJSZW5kZXJIZWFkZXIgfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJzdGFydGluZ1xcXCIgLS0+XFxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MuYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmdPblRvcCAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktbmF2aWdhdGlvbi1zdGFydCcgfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiYXR0cjogeyBpZDogc3RhcnRlZFBhZ2UuaWQgfSwgdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1wYWdlJywgZGF0YTogc3RhcnRlZFBhZ2UsIGFmdGVyUmVuZGVyOiBrb0FmdGVyUmVuZGVyUGFnZSB9XFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZ09uQm90dG9tIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1uYXZpZ2F0aW9uLXN0YXJ0JyB9IC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwicnVubmluZ1xcXCIgfHwga29TdGF0ZSgpID09IFxcXCJwcmV2aWV3XFxcIiAtLT5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc1RpbWVyUGFuZWxTaG93aW5nT25Ub3AgLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXRpbWVycGFuZWwnIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNTaG93UHJvZ3Jlc3NCYXJPblRvcCAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAnc3YtcHJvZ3Jlc3MtJyArIHByb2dyZXNzQmFyVHlwZSwgcGFyYW1zOiB7IG1vZGVsOiAkZGF0YSB9IH0gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmdPblRvcCAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktbmF2aWdhdGlvbicgfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBrb0N1cnJlbnRQYWdlIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgaWQ6IGtvQ3VycmVudFBhZ2UoKS5pZCB9LCB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXBhZ2UnLCBkYXRhOiBrb0N1cnJlbnRQYWdlLCBhZnRlclJlbmRlcjoga29BZnRlclJlbmRlclBhZ2UgfVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc0N1cnJlbnRQYWdlRW1wdHkoKSAmJiAkZGF0YS5lbXB0eVBhZ2VUZW1wbGF0ZSAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogZW1wdHlQYWdlVGVtcGxhdGUsIGRhdGE6ICRkYXRhLmVtcHR5UGFnZVRlbXBsYXRlRGF0YSB8fCAkZGF0YSB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc1Nob3dQcm9ncmVzc0Jhck9uQm90dG9tIC0tPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICdzdi1wcm9ncmVzcy0nICsgcHJvZ3Jlc3NCYXJUeXBlLCBwYXJhbXM6IHsgbW9kZWw6ICRkYXRhIH0gfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc1RpbWVyUGFuZWxTaG93aW5nT25Cb3R0b20gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXRpbWVycGFuZWwnIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmdPbkJvdHRvbSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktbmF2aWdhdGlvbicgfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBrb1N0YXRlKCkgPT0gXFxcImNvbXBsZXRlZFxcXCIgJiYgc2hvd0NvbXBsZXRlZFBhZ2UgLS0+XFxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiaHRtbDogcHJvY2Vzc2VkQ29tcGxldGVkSHRtbCwgY3NzOiBjb21wbGV0ZWRDc3NcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvQ29tcGxldGVkU3RhdGUoKSAhPSAnJywgY3NzOiBjc3Muc2F2ZURhdGEucm9vdFxcXCI+XFxuICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczoga29Db21wbGV0ZWRTdGF0ZUNzc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDprb0NvbXBsZXRlZFN0YXRlVGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvQ29tcGxldGVkU3RhdGUoKSA9PSAnZXJyb3InLCB2YWx1ZTogZ2V0TG9jU3RyaW5nKCdzYXZlQWdhaW5CdXR0b24nKSwgY2xpY2s6IGRvQ29tcGxldGUsIGNzczogY3NzLnNhdmVEYXRhLnNhdmVBZ2FpbkJ1dHRvblxcXCIvPlxcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwiY29tcGxldGVkYmVmb3JlXFxcIiAtLT5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJodG1sOiBwcm9jZXNzZWRDb21wbGV0ZWRCZWZvcmVIdG1sLCBjc3M6IGNzcy5ib2R5XFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJsb2FkaW5nXFxcIiAtLT5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJodG1sOiBwcm9jZXNzZWRMb2FkaW5nSHRtbCwgY3NzOiBjc3MuYm9keVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwiZW1wdHlcXFwiIC0tPlxcbiAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6ZW1wdHlTdXJ2ZXlUZXh0LCBjc3M6IGNzcy5ib2R5RW1wdHlcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZm9ybT5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcbjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LW5hdmlnYXRpb25cXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmZvb3RlclxcXCI+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJldmVudDogeyBtb3VzZWRvd246IG5hdmlnYXRpb25Nb3VzZURvd24gfSwgdmFsdWU6IHBhZ2VQcmV2VGV4dCwgY2xpY2s6IHByZXZQYWdlLCB2aXNpYmxlOiAha29Jc0ZpcnN0UGFnZSgpICYmIGlzU2hvd1ByZXZCdXR0b24sIGNzczogY3NzTmF2aWdhdGlvblByZXZcXFwiIC8+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJldmVudDogeyBtb3VzZWRvd246IG5leHRQYWdlTW91c2VEb3duIH0sIHZhbHVlOiBwYWdlTmV4dFRleHQsIGNsaWNrOiBuZXh0UGFnZVVJQ2xpY2ssIHZpc2libGU6ICFrb0lzTGFzdFBhZ2UoKSwgY3NzOiBjc3NOYXZpZ2F0aW9uTmV4dFxcXCIgLz5cXG4gICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcImV2ZW50OiB7IG1vdXNlZG93bjogbmF2aWdhdGlvbk1vdXNlRG93biB9LCB2YWx1ZTogcHJldmlld1RleHQsIGNsaWNrOiBzaG93UHJldmlldywgdmlzaWJsZToga29Jc0xhc3RQYWdlKCkgJiYgaXNQcmV2aWV3QnV0dG9uVmlzaWJsZSwgY3NzOiBjc3NOYXZpZ2F0aW9uUHJldmlld1xcXCIgLz5cXG4gICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcImV2ZW50OiB7IG1vdXNlZG93bjogbmF2aWdhdGlvbk1vdXNlRG93biB9LCB2YWx1ZTogY29tcGxldGVUZXh0LCBjbGljazogY29tcGxldGVMYXN0UGFnZSwgdmlzaWJsZToga29Jc0xhc3RQYWdlKCkgJiYgaXNDb21wbGV0ZUJ1dHRvblZpc2libGUsIGNzczogY3NzTmF2aWdhdGlvbkNvbXBsZXRlXFxcIiAvPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktbmF2aWdhdGlvbi1zdGFydFxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MuZm9vdGVyXFxcIj5cXG4gICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcInZhbHVlOiBzdGFydFN1cnZleVRleHQsIGNsaWNrOiBzdGFydCwgY3NzOiBjc3NOYXZpZ2F0aW9uU3RhcnRcXFwiLz5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1wYWdlXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzc0NsYXNzZXMucGFnZS5yb290XFxcIj5cXG4gICAgPCEtLSBrbyBpZjogX3Nob3dUaXRsZSAtLT5cXG4gICAgPGg0IGRhdGEtYmluZD1cXFwiY3NzOiBjc3NDbGFzc2VzLnBhZ2UudGl0bGVcXFwiPlxcbiAgICAgIDwhLS0ga28gaWY6ICFoYXNUaXRsZUFjdGlvbnMgLS0+XFxuICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY1RpdGxlIH0gLS0+PCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSBrbyBpZjogaGFzVGl0bGVBY3Rpb25zIC0tPlxcbiAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICdzdi10aXRsZS1hY3Rpb25zJywgcGFyYW1zOiB7IGVsZW1lbnQ6ICRkYXRhIH0gfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9oND5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6IF9zaG93RGVzY3JpcHRpb24tLT5cXG4gICAgPGRpdlxcbiAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZTogZGF0YS5zaG93UGFnZVRpdGxlcywgY3NzOiBjc3NDbGFzc2VzLnBhZ2UuZGVzY3JpcHRpb25cXFwiXFxuICAgID5cXG4gICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcm93cycsIGRhdGE6ICRkYXRhfSAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcGFuZWxcXFwiPlxcbiAgPGRpdlxcbiAgICBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgaWQ6IGlkIH0sIGNzczogY3NzQ2xhc3Nlcy5wYW5lbC5jb250YWluZXJcXFwiXFxuICA+XFxuICAgIDxoNFxcbiAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZTogISFsb2NUaXRsZS5rb1JlbmRlcmVkSHRtbCgpLCBhdHRyOiB7ICdhcmlhLWxhYmVsJzogbG9jVGl0bGUucmVuZGVyZWRIdG1sLCB0YWJpbmRleDogdGl0bGVUYWJJbmRleCwgJ2FyaWEtZXhwYW5kZWQnOiB0aXRsZUFyaWFFeHBhbmRlZH0sIGNzczogJGRhdGEuY3NzVGl0bGUsIGNsaWNrOiB0b2dnbGVTdGF0ZSxldmVudDogeyBrZXl1cDogdG9nZ2xlU3RhdGVCeUtleVVwIH1cXFwiXFxuICAgID5cXG4gICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBnZXRUaXRsZUNvbXBvbmVudE5hbWUoKSwgcGFyYW1zOiB7IGVsZW1lbnQ6ICRkYXRhIH0gfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgPC9oND5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzQ2xhc3Nlcy5wYW5lbC5kZXNjcmlwdGlvblxcXCI+XFxuICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY0Rlc2NyaXB0aW9uIH0gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogJGRhdGEgfSAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6IHN0YXRlICE9IFxcXCJjb2xsYXBzZWRcXFwiIC0tPlxcbiAgICA8ZGl2XFxuICAgICAgZGF0YS1iaW5kPVxcXCJzdHlsZTogeyBwYWRkaW5nTGVmdDogaW5uZXJQYWRkaW5nTGVmdCB9LCBjc3M6IGNzc0NsYXNzZXMucGFuZWwuY29udGVudCwgYXR0cjoge2lkOmNvbnRlbnRJZH1cXFwiXFxuICAgID5cXG4gICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcm93cycsIGRhdGE6ICRkYXRhfSAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIGlmOiBoYXNFZGl0QnV0dG9uIC0tPlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzc0NsYXNzZXMucGFuZWwuZm9vdGVyXFxcIj5cXG4gICAgICAgIDxpbnB1dFxcbiAgICAgICAgICB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwidmFsdWU6IHN1cnZleS5lZGl0VGV4dCwgY2xpY2s6IGNhbmNlbFByZXZpZXcsIGNzczogc3VydmV5LmNzc05hdmlnYXRpb25FZGl0XFxcIlxcbiAgICAgICAgLz5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWJvb2xlYW5cXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgPGxhYmVsIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRJdGVtQ3NzKClcXFwiPlxcbiAgICAgIDxpbnB1dFxcbiAgICAgICAgdHlwZT1cXFwiY2hlY2tib3hcXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5jb250cm9sLCBhdHRyOiB7bmFtZTogcXVlc3Rpb24ubmFtZSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQsICdhcmlhLXJlcXVpcmVkJzogcXVlc3Rpb24uaXNSZXF1aXJlZCwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsICdhcmlhLWludmFsaWQnOiBxdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMCwgJ2FyaWEtZGVzY3JpYmVkYnknOiBxdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMCA/IHF1ZXN0aW9uLmlkICsgJ19lcnJvcnMnIDogbnVsbH0sIGNoZWNrZWQ6IHF1ZXN0aW9uLmNoZWNrZWRWYWx1ZSwgc3VydmV5UHJvcDoge2luZGV0ZXJtaW5hdGU6IHF1ZXN0aW9uLmlzSW5kZXRlcm1pbmF0ZX0sIGVuYWJsZTogIXF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seVxcXCJcXG4gICAgICAvPlxcbiAgICAgIDxzcGFuXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0VW5jaGVja2VkTGFiZWxDc3MoKSwgY2xpY2s6IG9uRmFsc2VMYWJlbENsaWNrXFxcIlxcbiAgICAgICAgPjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NMYWJlbEZhbHNlIH0gLS0+PCEtLSAva28gLS0+PC9zcGFuXFxuICAgICAgPlxcbiAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuc3dpdGNoLCBjbGljazogb25Td2l0Y2hDbGlja1xcXCI+XFxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5zbGlkZXJcXFwiPlxcbiAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5zbGlkZXJUZXh0XFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5jaGVja2VkVmFsdWUgPT09IGZhbHNlIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY0xhYmVsRmFsc2UgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5jaGVja2VkVmFsdWUgPT09IHRydWUgLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jTGFiZWxUcnVlIH0gLS0+PCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgIDwvc3Bhbj5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8c3BhblxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldENoZWNrZWRMYWJlbENzcygpLCBjbGljazogb25UcnVlTGFiZWxDbGlja1xcXCJcXG4gICAgICAgID48IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jTGFiZWxUcnVlIH0gLS0+PCEtLSAva28gLS0+PC9zcGFuXFxuICAgICAgPlxcbiAgICA8L2xhYmVsPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWJ1dHRvbmdyb3VwXFxcIj5cXG4gIDxkaXYgcm9sZT1cXFwiZ3JvdXBcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24udmlzaWJsZUNob2ljZXMgLS0+XFxuICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiAnc3YtYnV0dG9uLWdyb3VwLWl0ZW0nLCBwYXJhbXM6IHsgcXVlc3Rpb246IHF1ZXN0aW9uLCBpdGVtOiAkZGF0YSwgaW5kZXg6ICRpbmRleCB9IH0gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWNoZWNrYm94XFxcIj5cXG4gIDxmaWVsZHNldCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICA8bGVnZW5kIGRhdGEtYmluZD1cXFwiYXR0cjogeyAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCB9XFxcIj48L2xlZ2VuZD5cXG4gICAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5oYXNDb2x1bW5zICAtLT5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi52aXNpYmxlQ2hvaWNlcywgYXM6ICdpdGVtJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvQWZ0ZXJSZW5kZXIgfSAgLS0+XFxuICAgICAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6IHF1ZXN0aW9uLmdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnROYW1lKGl0ZW0pLCBwYXJhbXM6IHsgY29tcG9uZW50RGF0YTogIHF1ZXN0aW9uLmdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnREYXRhKGl0ZW0pLCB0ZW1wbGF0ZURhdGE6IHsgbmFtZTogJ3N1cnZleS1jaGVja2JveC1pdGVtJywgZGF0YTogaXRlbSB9IH0gfSAtLT5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNDb2x1bW5zICAtLT5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24uY29sdW1ucyAtLT5cXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRDb2x1bW5DbGFzcygpXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogJGRhdGEsIGFzOiAnaXRlbScsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb0FmdGVyUmVuZGVyIH0gIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uZ2V0SXRlbVZhbHVlV3JhcHBlckNvbXBvbmVudE5hbWUoaXRlbSksIHBhcmFtczogeyBjb21wb25lbnREYXRhOiAgcXVlc3Rpb24uZ2V0SXRlbVZhbHVlV3JhcHBlckNvbXBvbmVudERhdGEoaXRlbSksIHRlbXBsYXRlRGF0YTogeyBuYW1lOiAnc3VydmV5LWNoZWNrYm94LWl0ZW0nLCBkYXRhOiBpdGVtIH0gfSB9IC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9maWVsZHNldD5cXG48L3NjcmlwdD5cXG48c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1jaGVja2JveC1pdGVtXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1DbGFzcyhpdGVtKVxcXCI+XFxuICAgICAgPGxhYmVsIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRMYWJlbENsYXNzKGl0ZW0pXFxcIj5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogaXRlbSA9PSBxdWVzdGlvbi5zZWxlY3RBbGxJdGVtIC0tPlxcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge25hbWU6IHF1ZXN0aW9uLm5hbWUsIGlkOiBxdWVzdGlvbi5pbnB1dElkICsgJ18nICsgcXVlc3Rpb24uZ2V0SXRlbUluZGV4KGl0ZW0pLCAnYXJpYS1yZXF1aXJlZCc6IHF1ZXN0aW9uLmlzUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogaXRlbS5sb2NUZXh0LnJlbmRlcmVkSHRtbCwgJ2FyaWEtaW52YWxpZCc6IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwLCAnYXJpYS1kZXNjcmliZWRieSc6IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwID8gcXVlc3Rpb24uaWQgKyAnX2Vycm9ycycgOiBudWxsIH0sIGNoZWNrZWQ6IHF1ZXN0aW9uLmtvQWxsU2VsZWN0ZWQsIGVuYWJsZTogIXF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seSAmJiBpdGVtLmlzRW5hYmxlZCwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1Db250cm9sXFxcIi8+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8IS0tIGtvIGlmOiBpdGVtICE9IHF1ZXN0aW9uLnNlbGVjdEFsbEl0ZW0gLS0+XFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgZGF0YS1iaW5kPVxcXCJhdHRyOiB7bmFtZTogcXVlc3Rpb24ubmFtZSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQgKyAnXycgKyBxdWVzdGlvbi5nZXRJdGVtSW5kZXgoaXRlbSksICdhcmlhLXJlcXVpcmVkJzogcXVlc3Rpb24uaXNSZXF1aXJlZCwgJ2FyaWEtbGFiZWwnOiBpdGVtLmxvY1RleHQucmVuZGVyZWRIdG1sLCAnYXJpYS1pbnZhbGlkJzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAsICdhcmlhLWRlc2NyaWJlZGJ5JzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAgPyBxdWVzdGlvbi5pZCArICdfZXJyb3JzJyA6IG51bGwgfSwgY2hlY2tlZFZhbHVlOiBpdGVtLnZhbHVlLCBjaGVja2VkOiBxdWVzdGlvbi5rb1ZhbHVlLCBlbmFibGU6ICFxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHkgJiYgaXRlbS5pc0VuYWJsZWQsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCIvPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubWF0ZXJpYWxEZWNvcmF0b3JcXFwiPlxcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtRGVjb3JhdG9yXFxcIj5cXG4gICAgICAgICAgICAgIDxwYXRoIGQ9XFxcIk01LDEzbDItMmwzLDNsNy03bDIsMmwtOSw5TDUsMTN6XFxcIi8+XFxuICAgICAgICAgICAgPC9zdmc+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNoZWNrXFxcIj48L3NwYW4+XFxuICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAhaXRlbS5oaWRlQ2FwdGlvbiwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmNvbnRyb2xMYWJlbCwgYXR0cjogeyB0aXRsZTogaXRlbS5sb2NUZXh0LmtvUmVuZGVyZWRIdG1sIH1cXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGl0ZW0ubG9jVGV4dCB9IC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICA8L2xhYmVsPlxcbiAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc090aGVyICYmIChpdGVtLnZhbHVlID09IHF1ZXN0aW9uLm90aGVySXRlbS52YWx1ZSkgLS0+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCIgZGF0YS1iaW5kPVxcXCJ0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LWNvbW1lbnQnLCBkYXRhOiB7J3F1ZXN0aW9uJzogcXVlc3Rpb24sICd2aXNpYmxlJzogcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkIH0gfVxcXCI+PC9kaXY+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tY29tbWVudFxcXCI+XFxuICAgIDwhLS1rbyBpZjogIXF1ZXN0aW9uLmlzUmVhZE9ubHlSZW5kZXJEaXYoKSAtLT5cXG4gIDwhLS1rbyBpZjogIXF1ZXN0aW9uLmlzSW5wdXRUZXh0VXBkYXRlIC0tPlxcbiAgPHRleHRhcmVhIHR5cGU9XFxcInRleHRcXFwiXFxuICAgIGRhdGEtYmluZD1cXFwiYXR0cjogeydyZWFkb25seSc6IHF1ZXN0aW9uLmlzUmVhZE9ubHksICdkaXNhYmxlZCc6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seSwgbWF4TGVuZ3RoOiBxdWVzdGlvbi5nZXRNYXhMZW5ndGgoKSwgY29sczogcXVlc3Rpb24uY29scywgcm93czogcXVlc3Rpb24ucm93cywgaWQ6IHF1ZXN0aW9uLmlucHV0SWQsIHBsYWNlaG9sZGVyOiBxdWVzdGlvbi5yZW5kZXJlZFBsYWNlSG9sZGVyLCAnYXJpYS1yZXF1aXJlZCc6IHF1ZXN0aW9uLmlzUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sLCAnYXJpYS1pbnZhbGlkJzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAsICdhcmlhLWRlc2NyaWJlZGJ5JzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAgPyBxdWVzdGlvbi5pZCArICdfZXJyb3JzJyA6IG51bGx9LCB2YWx1ZTpxdWVzdGlvbi52YWx1ZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPjwvdGV4dGFyZWE+XFxuICA8IS0tL2tvLS0+XFxuICA8IS0ta28gaWY6IHF1ZXN0aW9uLmlzSW5wdXRUZXh0VXBkYXRlIC0tPlxcbiAgPHRleHRhcmVhIHR5cGU9XFxcInRleHRcXFwiXFxuICAgIGRhdGEtYmluZD1cXFwiYXR0cjogeydyZWFkb25seSc6IHF1ZXN0aW9uLmlzUmVhZE9ubHksICdkaXNhYmxlZCc6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seSwgbWF4TGVuZ3RoOiBxdWVzdGlvbi5nZXRNYXhMZW5ndGgoKSwgY29sczogcXVlc3Rpb24uY29scywgcm93czogcXVlc3Rpb24ucm93cywgaWQ6IHF1ZXN0aW9uLmlucHV0SWQsIHBsYWNlaG9sZGVyOiBxdWVzdGlvbi5yZW5kZXJlZFBsYWNlSG9sZGVyLCAnYXJpYS1yZXF1aXJlZCc6IHF1ZXN0aW9uLmlzUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sLCAnYXJpYS1pbnZhbGlkJzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAsICdhcmlhLWRlc2NyaWJlZGJ5JzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAgPyBxdWVzdGlvbi5pZCArICdfZXJyb3JzJyA6IG51bGx9LCB0ZXh0SW5wdXQ6cXVlc3Rpb24udmFsdWUsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj48L3RleHRhcmVhPlxcbiAgPCEtLS9rby0tPlxcbiAgPCEtLS9rby0tPlxcblxcbiAgPCEtLWtvIGlmOiBxdWVzdGlvbi5pc1JlYWRPbmx5UmVuZGVyRGl2KCkgLS0+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwidGV4dDogcXVlc3Rpb24udmFsdWVcXFwiPjwvZGl2PlxcbiAgPCEtLS9rby0tPlxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1jb21wb3NpdGVcXFwiPlxcbiAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXBhbmVsJywgZGF0YTogcXVlc3Rpb24uY29udGVudFBhbmVsLCBhczogJ3F1ZXN0aW9uJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmNvbnRlbnRQYW5lbC5rb1BhbmVsQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1jdXN0b21cXFwiPlxcbiAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBxdWVzdGlvbi5jb250ZW50UXVlc3Rpb24ua29UZW1wbGF0ZU5hbWUoKSwgZGF0YTogcXVlc3Rpb24uY29udGVudFF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmNvbnRlbnRRdWVzdGlvbi5rb1F1ZXN0aW9uQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1kcm9wZG93blxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnNlbGVjdFdyYXBwZXJcXFwiPlxcbiAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5pc1JlYWRPbmx5IC0tPlxcbiAgICA8c2VsZWN0XFxuICAgICAgZGF0YS1iaW5kPVxcXCJpZjogdHJ1ZSwgYXR0cjoge2lkOiBxdWVzdGlvbi5pbnB1dElkLCBhdXRvQ29tcGxldGU6IHF1ZXN0aW9uLmF1dG9Db21wbGV0ZSwgcmVxdWlyZWQ6IHF1ZXN0aW9uLmlzUmVxdWlyZWQsICdhcmlhLXJlcXVpcmVkJzogcXVlc3Rpb24uaXNSZXF1aXJlZCwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsICdhcmlhLWludmFsaWQnOiBxdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMCwgJ2FyaWEtZGVzY3JpYmVkYnknOiBxdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMCA/IHF1ZXN0aW9uLmlkICsgJ19lcnJvcnMnIDogbnVsbH0sIGRpc2FibGU6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seSwgdmFsdWU6IHF1ZXN0aW9uLnJlbmRlcmVkVmFsdWUsIHZhbHVlQWxsb3dVbnNldDogdHJ1ZSwgY3NzOiBxdWVzdGlvbi5nZXRDb250cm9sQ2xhc3MoKVxcXCI+XFxuICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uc2hvd09wdGlvbnNDYXB0aW9uIC0tPlxcbiAgICAgIDxvcHRpb24gZGF0YS1iaW5kPVxcXCJ0ZXh0OnF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uLCB2YWx1ZTogbnVsbFxcXCI+PC9vcHRpb24+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSBrbyBmb3JlYWNoOiBxdWVzdGlvbi52aXNpYmxlQ2hvaWNlcyAtLT5cXG4gICAgICA8b3B0aW9uIGRhdGEtYmluZD1cXFwidmFsdWU6ICRkYXRhLnZhbHVlLCB0ZXh0OiAkZGF0YS50ZXh0LCBhdHRyOiB7IGRpc2FibGVkOiAhJGRhdGEuaXNFbmFibGVkIH1cXFwiPjwvb3B0aW9uPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L3NlbGVjdD5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmlzUmVhZE9ubHkgLS0+XFxuICAgICAgPGRpdiBkaXNhYmxlZFxcbiAgICAgIGRhdGEtYmluZD1cXFwiYXR0cjoge2lkOiBxdWVzdGlvbi5pbnB1dElkfSwgdGV4dDogcXVlc3Rpb24uaGFzT3RoZXIgJiYgcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkID8gcXVlc3Rpb24ub3RoZXJUZXh0IDogcXVlc3Rpb24uZGlzcGxheVZhbHVlLCBjc3M6IHF1ZXN0aW9uLmdldENvbnRyb2xDbGFzcygpXFxcIj5cXG4gICAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG4gIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc090aGVyIC0tPlxcbiAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCJcXG4gICAgZGF0YS1iaW5kPVxcXCJ0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LWNvbW1lbnQnLCBkYXRhOiB7J3F1ZXN0aW9uJzogcXVlc3Rpb24sICd2aXNpYmxlJzogcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkIH0gfSwgc3R5bGU6IHtkaXNwbGF5OiBxdWVzdGlvbi5pc0Zsb3dMYXlvdXQgPyAnaW5saW5lJzogJyd9XFxcIj5cXG4gIDwvZGl2PlxcbiAgPCEtLSAva28gLS0+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWVtcHR5XFxcIj5cXG4gICAgPGRpdj48L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzXFxcIj5cXG4gICAgICAgIDxkaXYgcm9sZT1cXFwiYWxlcnRcXFwiIGFyaWEtbGl2ZT1cXFwicG9saXRlXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGhhc1Zpc2libGVFcnJvcnMsIGZvcmVhY2g6IHsgZGF0YTogZXJyb3JzLCBhczogJ2Vycm9yJyB9LCBjc3M6IGtvRXJyb3JDbGFzcygpLCBhdHRyOiB7IGlkOiBxdWVzdGlvbi5pZCArICdfZXJyb3JzJyB9XFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogZXJyb3IudmlzaWJsZVxcXCI+ICAgXFxuICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5lcnJvci5pY29uXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmVycm9yLml0ZW1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGVycm9yLmxvY1RleHQgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWV4cHJlc3Npb25cXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6cXVlc3Rpb24uZGlzcGxheVZhbHVlLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+PC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWZpbGVcXFwiPlxcbiAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHkgLS0+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImZpbGVcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLmZpbGVJbnB1dCwgYXR0cjoge2lkOiBxdWVzdGlvbi5pbnB1dElkLCAnYXJpYS1yZXF1aXJlZCc6IHF1ZXN0aW9uLmlzUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sLCAnYXJpYS1pbnZhbGlkJzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAsICdhcmlhLWRlc2NyaWJlZGJ5JzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAgPyBxdWVzdGlvbi5pZCArICdfZXJyb3JzJyA6IG51bGwsIG11bHRpcGxlOiBxdWVzdGlvbi5hbGxvd011bHRpcGxlID8gJ211bHRpcGxlJyA6IHVuZGVmaW5lZCwgdGl0bGU6IGtvSW5wdXRUaXRsZSwgYWNjZXB0OiBxdWVzdGlvbi5hY2NlcHRlZFR5cGVzIH0sIGV2ZW50OiB7Y2hhbmdlOiBxdWVzdGlvbi5kb2NoYW5nZX1cXFwiPlxcbiAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmlzUmVhZE9ubHkgLS0+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImZpbGVcXFwiIGRpc2FibGVkIGRhdGEtYmluZD1cXFwiY3NzOiAnZm9ybS1jb250cm9sICcgKyBxdWVzdGlvbi5jc3NDbGFzc2VzLnBsYWNlaG9sZGVySW5wdXQsIGF0dHI6IHsgcGxhY2Vob2xkZXI6IHF1ZXN0aW9uLnRpdGxlIH1cXFwiIHN0eWxlPVxcXCJjb2xvcjogdHJhbnNwYXJlbnQ7XFxcIi8+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczpxdWVzdGlvbi5rb0NzcygpLmZpbGVEZWNvcmF0b3IsIGV2ZW50OnsgZHJhZ292ZXI6IHF1ZXN0aW9uLm9uZHJhZ292ZXIsIGRyb3A6IHF1ZXN0aW9uLm9uZHJvcH1cXFwiPlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS53cmFwcGVyXFxcIj5cXG4gICAgICAgICAgPGxhYmVsIHJvbGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ2hvb3NlRmlsZUNsYXNzLCBhdHRyOiB7Zm9yOiBxdWVzdGlvbi5pbnB1dElkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmNob29zZUJ1dHRvbkNhcHRpb259LCB0ZXh0OiBxdWVzdGlvbi5jaG9vc2VCdXR0b25DYXB0aW9uXFxcIj48L2xhYmVsPlxcbiAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5ub0ZpbGVDaG9zZW4sIHZpc2libGU6ICFxdWVzdGlvbi5rb0hhc1ZhbHVlKCksIHRleHQ6IHF1ZXN0aW9uLm5vRmlsZUNob3NlbkNhcHRpb25cXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvSGFzVmFsdWUoKSAmJiAhcXVlc3Rpb24uaXNSZWFkT25seSAtLT5cXG4gICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmNzc0NsYXNzZXMucmVtb3ZlQnV0dG9uLCBkaXNhYmxlZDogcXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5LCBjbGljazogcXVlc3Rpb24uZG9jbGVhbiwgdGV4dDogcXVlc3Rpb24uY2xlYW5CdXR0b25DYXB0aW9uXFxcIj48L2J1dHRvbj5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiZm9yZWFjaDogcXVlc3Rpb24ua29EYXRhLCB2aXNpYmxlOiBxdWVzdGlvbi5rb0hhc1ZhbHVlXFxcIj5cXG4gICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5zaG93UHJldmlldywgY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLnByZXZpZXdcXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEubmFtZSAtLT5cXG4gICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuZmlsZVNpZ25cXFwiPlxcbiAgICAgICAgICAgICAgPGEgZGF0YS1iaW5kPVxcXCJzdHlsZTogeyB3aWR0aDogcXVlc3Rpb24uaW1hZ2VXaWR0aCArICdweCcgfSwgY2xpY2s6IHF1ZXN0aW9uLmRvZG93bmxvYWQsIHRleHQ6ICRkYXRhLm5hbWUsXFxuICAgICAgICAgICAgICBhdHRyOiB7IGhyZWY6ICRkYXRhLmNvbnRlbnQsIHRpdGxlOiAkZGF0YS5uYW1lLCBkb3dubG9hZDogJGRhdGEubmFtZSB9XFxcIj48L2E+XFxuICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uY2FuUHJldmlld0ltYWdlKCRkYXRhKSAtLT5cXG4gICAgICAgICAgICAgIDxpbWcgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IHNyYzogJGRhdGEuY29udGVudCwgaGVpZ2h0OiBxdWVzdGlvbi5pbWFnZUhlaWdodCwgd2lkdGg6IHF1ZXN0aW9uLmltYWdlV2lkdGggfVxcXCIgYWx0PVxcXCJGaWxlIHByZXZpZXdcXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkZGF0YS5uYW1lIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24uaXNSZWFkT25seSAtLT5cXG4gICAgICAgICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmNzc0NsYXNzZXMucmVtb3ZlRmlsZSwgY2xpY2s6IHF1ZXN0aW9uLmRvcmVtb3ZlZmlsZSwgdGV4dDogcXVlc3Rpb24ucmVtb3ZlRmlsZUNhcHRpb25cXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICA8c3ZnIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLnJlbW92ZUZpbGVTdmcsIGNsaWNrOiBxdWVzdGlvbi5kb3JlbW92ZWZpbGVcXFwiIHZpZXdCb3g9XFxcIjAgMCAxNiAxNlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVxcXCJNOCwyQzQuNywyLDIsNC43LDIsOHMyLjcsNiw2LDZzNi0yLjcsNi02UzExLjMsMiw4LDJ6IE0xMSwxMGwtMSwxTDgsOWwtMiwybC0xLTFsMi0yTDUsNmwxLTFsMiwybDItMmwxLDFMOSw4IEwxMSwxMHpcXFwiLz5cXG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cXG4gICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkZGF0YS5uYW1lIC0tPlxcbiAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5maWxlU2lnbkJvdHRvbVxcXCI+XFxuICAgICAgICAgICAgICAgIDxhIGRhdGEtYmluZD1cXFwic3R5bGU6IHsgd2lkdGg6IHF1ZXN0aW9uLmltYWdlV2lkdGggKyAncHgnIH0sIGNsaWNrOiBxdWVzdGlvbi5kb2Rvd25sb2FkLCB0ZXh0OiAkZGF0YS5uYW1lLCBhdHRyOiB7IGhyZWY6ICRkYXRhLmNvbnRlbnQsIHRpdGxlOiAkZGF0YS5uYW1lLCBkb3dubG9hZDogJGRhdGEubmFtZSB9XFxcIj48L2E+XFxuICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5rb0hhc1ZhbHVlKCkgJiYgIXF1ZXN0aW9uLmlzUmVhZE9ubHkgLS0+XFxuICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLnJlbW92ZUJ1dHRvbkJvdHRvbSwgZGlzYWJsZWQ6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seSwgY2xpY2s6IHF1ZXN0aW9uLmRvY2xlYW4sIHRleHQ6IHF1ZXN0aW9uLmNsZWFuQnV0dG9uQ2FwdGlvblxcXCI+PC9idXR0b24+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24taHRtbFxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiaHRtbDogcXVlc3Rpb24ubG9jSHRtbC5rb1JlbmRlcmVkSHRtbCwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPjwvZGl2Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1pbWFnZVxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5jb250ZW50TW9kZSA9PT0gXFxcImltYWdlXFxcIiAtLT5cXG4gICAgPGltZyBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pbWFnZSwgYXR0cjogeyBzcmM6ICRkYXRhLmxvY0ltYWdlTGluay5rb1JlbmRlcmVkSHRtbCgpLCB3aWR0aDogcXVlc3Rpb24uaW1hZ2VXaWR0aCA/IHF1ZXN0aW9uLmltYWdlV2lkdGggKyAncHgnIDogdW5kZWZpbmVkLCBoZWlnaHQ6IHF1ZXN0aW9uLmltYWdlSGVpZ2h0ID8gcXVlc3Rpb24uaW1hZ2VIZWlnaHQgKyAncHgnIDogdW5kZWZpbmVkLCBhbHQ6IHF1ZXN0aW9uLnRleHQgfHwgcXVlc3Rpb24udGl0bGUgfSwgc3R5bGU6IHsgb2JqZWN0Rml0OiBxdWVzdGlvbi5pbWFnZUZpdCB9XFxcIi8+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5jb250ZW50TW9kZSA9PT0gXFxcInZpZGVvXFxcIiAtLT5cXG4gICAgPGVtYmVkIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmltYWdlLCBhdHRyOiB7IHNyYzogJGRhdGEubG9jSW1hZ2VMaW5rLmtvUmVuZGVyZWRIdG1sKCksIHdpZHRoOiBxdWVzdGlvbi5pbWFnZVdpZHRoID8gcXVlc3Rpb24uaW1hZ2VXaWR0aCArICdweCcgOiB1bmRlZmluZWQsIGhlaWdodDogcXVlc3Rpb24uaW1hZ2VIZWlnaHQgPyBxdWVzdGlvbi5pbWFnZUhlaWdodCArICdweCcgOiB1bmRlZmluZWQgfSwgc3R5bGU6IHsgb2JqZWN0Rml0OiBxdWVzdGlvbi5pbWFnZUZpdCB9XFxcIi8+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWltYWdlcGlja2VyXFxcIj5cXG4gIDxmaWVsZHNldCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICA8bGVnZW5kIGRhdGEtYmluZD1cXFwiYXR0cjogeyAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCB9XFxcIj48L2xlZ2VuZD5cXG4gICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24udmlzaWJsZUNob2ljZXMsIGFzOiAnaXRlbScsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb0FmdGVyUmVuZGVyfSAgLS0+XFxuICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBxdWVzdGlvbi5nZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50TmFtZShpdGVtKSwgcGFyYW1zOiB7IGNvbXBvbmVudERhdGE6ICBxdWVzdGlvbi5nZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50RGF0YShpdGVtKSwgdGVtcGxhdGVEYXRhOiB7IG5hbWU6ICdzdXJ2ZXktaW1hZ2VwaWNrZXItaXRlbScsIGRhdGE6IGl0ZW0gfSB9IH0gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZmllbGRzZXQ+XFxuPC9zY3JpcHQ+XFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktaW1hZ2VwaWNrZXItaXRlbVxcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1DbGFzcyhpdGVtKVxcXCI+XFxuICAgICAgICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubGFiZWxcXFwiPlxcbiAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cXFwiZGlzcGxheTogbm9uZTtcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge3R5cGU6IHF1ZXN0aW9uLm11bHRpU2VsZWN0ID8gJ2NoZWNrYm94JyA6ICdyYWRpbycsIG5hbWU6IHF1ZXN0aW9uLm5hbWUgKyAnXycgKyBxdWVzdGlvbi5pZCwgdmFsdWU6IGl0ZW0udmFsdWUsIGlkOiBxdWVzdGlvbi5pbnB1dElkICsgJ18nICsgaXRlbS52YWx1ZSwgJ2FyaWEtcmVxdWlyZWQnOiBxdWVzdGlvbi5pc1JlcXVpcmVkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCwgJ2FyaWEtaW52YWxpZCc6IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwLCAnYXJpYS1kZXNjcmliZWRieSc6IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwID8gcXVlc3Rpb24uaWQgKyAnX2Vycm9ycycgOiBudWxsfSwgY2hlY2tlZDogcXVlc3Rpb24ua29WYWx1ZSwgZW5hYmxlOiAhcXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5ICYmIGl0ZW0uaXNFbmFibGVkLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaXRlbUNvbnRyb2xcXFwiXFxuICAgICAgICAgICAgLz5cXG4gICAgICAgICAgICA8ZGl2PlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5jb250ZW50TW9kZSA9PT0gXFxcImltYWdlXFxcIiAtLT5cXG4gICAgICAgICAgICAgICAgPGltZyBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pbWFnZSwgYXR0cjogeyBzcmM6ICRkYXRhLmxvY0ltYWdlTGluay5rb1JlbmRlcmVkSHRtbCwgd2lkdGg6IHF1ZXN0aW9uLmltYWdlV2lkdGggPyBxdWVzdGlvbi5pbWFnZVdpZHRoICsgJ3B4JyA6IHVuZGVmaW5lZCwgaGVpZ2h0OiBxdWVzdGlvbi5pbWFnZUhlaWdodCA/IHF1ZXN0aW9uLmltYWdlSGVpZ2h0ICsgJ3B4JyA6IHVuZGVmaW5lZCwgYWx0OiBpdGVtLmxvY1RleHQua29SZW5kZXJlZEh0bWwgfSwgc3R5bGU6IHsgb2JqZWN0Rml0OiBxdWVzdGlvbi5pbWFnZUZpdCB9XFxcIi8+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5jb250ZW50TW9kZSA9PT0gXFxcInZpZGVvXFxcIiAtLT5cXG4gICAgICAgICAgICAgICAgPGVtYmVkIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmltYWdlLCBhdHRyOiB7IHNyYzogJGRhdGEubG9jSW1hZ2VMaW5rLmtvUmVuZGVyZWRIdG1sLCB3aWR0aDogcXVlc3Rpb24uaW1hZ2VXaWR0aCA/IHF1ZXN0aW9uLmltYWdlV2lkdGggKyAncHgnIDogdW5kZWZpbmVkLCBoZWlnaHQ6IHF1ZXN0aW9uLmltYWdlSGVpZ2h0ID8gcXVlc3Rpb24uaW1hZ2VIZWlnaHQgKyAncHgnIDogdW5kZWZpbmVkIH0sIHN0eWxlOiB7IG9iamVjdEZpdDogcXVlc3Rpb24uaW1hZ2VGaXQgfVxcXCIvPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uc2hvd0xhYmVsIC0tPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtVGV4dCwgYXR0cjogeyB0aXRsZTogaXRlbS5sb2NUZXh0LmtvUmVuZGVyZWRIdG1sIH1cXFwiPlxcbiAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBpdGVtLmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2xhYmVsPlxcbiAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tbWF0cml4XFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkudGFibGVXcmFwcGVyXFxcIj5cXG4gICAgPGZpZWxkc2V0PlxcbiAgICAgIDxsZWdlbmRcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiYXR0cjogeyAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCB9XFxcIlxcbiAgICAgID48L2xlZ2VuZD5cXG4gICAgICA8dGFibGUgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5zaG93SGVhZGVyIC0tPlxcbiAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uaGFzUm93c1xcXCI+PC90ZD5cXG4gICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmtvVmlzaWJsZUNvbHVtbnMgLS0+XFxuICAgICAgICAgICAgPHRoIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmhlYWRlckNlbGxcXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uZ2V0Q29sdW1uSGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoJGRhdGEpLCBwYXJhbXM6IHsgY29tcG9uZW50RGF0YTogIHF1ZXN0aW9uLmdldENvbHVtbkhlYWRlcldyYXBwZXJDb21wb25lbnREYXRhKCRkYXRhKSwgdGVtcGxhdGVEYXRhOiB7IGRhdGE6ICRkYXRhIH0gfSB9IC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogJGRhdGEubG9jVGV4dCB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC90aD5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC90cj5cXG4gICAgICAgIDwvdGhlYWQ+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHF1ZXN0aW9uLmtvVmlzaWJsZVJvd3MsIGFzOiAncm93JyB9IC0tPlxcbiAgICAgICAgICA8dHIgZGF0YS1iaW5kPVxcXCJjc3M6IHJvdy5yb3dDbGFzc2VzXFxcIj5cXG4gICAgICAgICAgICA8dGRcXG4gICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uaGFzUm93cywgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmNlbGxcXFwiXFxuICAgICAgICAgICAgPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uZ2V0Um93SGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoJGRhdGEpLCBwYXJhbXM6IHsgY29tcG9uZW50RGF0YTogIHF1ZXN0aW9uLmdldFJvd0hlYWRlcldyYXBwZXJDb21wb25lbnREYXRhKCRkYXRhKSwgdGVtcGxhdGVEYXRhOiB7IGRhdGE6ICRkYXRhIH0gfSB9IC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcm93LmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24ua29WaXNpYmxlQ29sdW1ucyAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNDZWxsVGV4dCAtLT5cXG4gICAgICAgICAgICA8dGRcXG4gICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5nZXRJdGVtQ2xhc3Mocm93LCAkZGF0YSksIGNsaWNrOiBmdW5jdGlvbigpIHsgaWYgKCFxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHkpIHsgcm93LmNlbGxDbGljaygkZGF0YSk7IH0gfVxcXCJcXG4gICAgICAgICAgICA+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24uZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHJvdy5uYW1lLCAkZGF0YSkgfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogIXF1ZXN0aW9uLmhhc0NlbGxUZXh0IC0tPlxcbiAgICAgICAgICAgIDx0ZFxcbiAgICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJhdHRyOiB7IHRpdGxlOiAkZGF0YS5sb2NUZXh0LnJlbmRlcmVkSHRtbCB9LCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY2VsbFxcXCJcXG4gICAgICAgICAgICA+XFxuICAgICAgICAgICAgICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1DbGFzcyhyb3csICRkYXRhKVxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbnB1dFxcbiAgICAgICAgICAgICAgICAgIHR5cGU9XFxcInJhZGlvXFxcIlxcbiAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1WYWx1ZSwgYXR0cjogeyBuYW1lOiByb3cuZnVsbE5hbWUsICdhcmlhLXJlcXVpcmVkJzogcXVlc3Rpb24uaXNSZXF1aXJlZCwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsIGlkOiBxdWVzdGlvbi5pbnB1dElkICsgJ18nICsgcm93Lm5hbWUgKyAnXycgKyAkaW5kZXgoKSB9LCBjaGVja2VkVmFsdWU6ICRkYXRhLnZhbHVlLCBjaGVja2VkOiByb3cudmFsdWUsIGVuYWJsZTogIXF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seVxcXCJcXG4gICAgICAgICAgICAgICAgLz5cXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubWF0ZXJpYWxEZWNvcmF0b3JcXFwiPlxcbiAgICAgICAgICAgICAgICAgIDxzdmdcXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOnF1ZXN0aW9uLmtvQ3NzKCkuaXRlbURlY29yYXRvclxcXCJcXG4gICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XFxcIi0xMiAtMTIgMjQgMjRcXFwiXFxuICAgICAgICAgICAgICAgICAgPlxcbiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSByPVxcXCI2XFxcIiBjeD1cXFwiMFxcXCIgY3k9XFxcIjBcXFwiIC8+XFxuICAgICAgICAgICAgICAgICAgPC9zdmc+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNpcmNsZVxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2hlY2tcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPHNwYW5cXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cXFwiZGlzcGxheTogbm9uZVxcXCJcXG4gICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmxvY1RleHQudGV4dFxcXCJcXG4gICAgICAgICAgICAgICAgPjwvc3Bhbj5cXG4gICAgICAgICAgICAgIDwvbGFiZWw+XFxuICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC90cj5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L3Rib2R5PlxcbiAgICAgIDwvdGFibGU+XFxuICAgIDwvZmllbGRzZXQ+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG48c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS10ZXh0XFxcIj5cXG4gIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDokZGF0YS5yZW5kZXJlZEh0bWxcXFwiPjwvc3Bhbj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwi77u/PHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tbWF0cml4ZHluYW1pY1xcXCI+XFxuICAgIDxkaXY+XFxuICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvVGFibGUoKS5zaG93QWRkUm93T25Ub3AgLS0+XFxuICAgIDxkaXZcXG4gICAgICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5mb290ZXJcXFwiXFxuICAgID5cXG4gICAgICA8YnV0dG9uXFxuICAgICAgICB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgICBkYXRhLWJpbmQ9XFxcImNsaWNrOiBxdWVzdGlvbi5pc0Rlc2lnbk1vZGUgPyB1bmRlZmluZWQgOiBxdWVzdGlvbi5rb0FkZFJvd0NsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uICsgJyAnICsgcXVlc3Rpb24ua29Dc3MoKS5idXR0b25BZGQsIGRpc2FibGU6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seVxcXCJcXG4gICAgICA+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24ubG9jQWRkUm93VGV4dCB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaWNvbkFkZFxcXCI+PC9zcGFuPlxcbiAgICAgIDwvYnV0dG9uPlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDxkaXZcXG4gICAgICBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmtvVGFibGUoKS5zaG93VGFibGUsIHN0eWxlOiB7b3ZlcmZsb3dYOiBxdWVzdGlvbi5ob3Jpem9udGFsU2Nyb2xsPyAnc2Nyb2xsJzogJyd9XFxcIlxcbiAgICA+XFxuICAgICAgPHRhYmxlIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29UYWJsZSgpLnNob3dIZWFkZXIgLS0+XFxuICAgICAgICA8dGhlYWQ+XFxuICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmtvVGFibGUoKS5oZWFkZXJSb3cuY2VsbHMgLS0+XFxuICAgICAgICAgICAgPHRoXFxuICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7IG1pbldpZHRoOiAkZGF0YS5taW5XaWR0aCwgd2lkdGg6ICRkYXRhLndpZHRoIH0sIGNzczogcXVlc3Rpb24ua29Dc3MoKS5oZWFkZXJDZWxsXFxcIlxcbiAgICAgICAgICAgID5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmhhc1RpdGxlIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uZ2V0Q29sdW1uSGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoJGRhdGEpLCBwYXJhbXM6IHsgY29tcG9uZW50RGF0YTogIHF1ZXN0aW9uLmdldENvbHVtbkhlYWRlcldyYXBwZXJDb21wb25lbnREYXRhKCRkYXRhKSwgdGVtcGxhdGVEYXRhOiB7IGRhdGE6ICRkYXRhIH0gfSB9IC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogJGRhdGEubG9jVGl0bGUgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEucmVxdWlyZWRUZXh0IC0tPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLnJlcXVpcmVkVGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC90aD5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC90cj5cXG4gICAgICAgIDwvdGhlYWQ+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBxdWVzdGlvbi5rb1RhYmxlKCkucm93cyAtLT5cXG4gICAgICAgICAgPCEtLSBrbyBpZm5vdDogJHBhcmVudC5kZXRhaWxQYW5lbE1vZGUgPT09IFxcXCJwb3B1cFxcXCIgJiYgJGRhdGEuaXNEZXRhaWxSb3cgLS0+XFxuICAgICAgICAgIDx0ciBkYXRhLWJpbmQ9XFxcImNzczokZGF0YS5jbGFzc05hbWVcXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogJGRhdGEuY2VsbHMgLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEuaXNBY3Rpb25zQ2VsbCAtLT5cXG4gICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVxcXCJjc3M6JGRhdGEuY2xhc3NOYW1lLCBhdHRyOiB7Y29sc3BhbjogJGRhdGEuY29sU3BhbnN9XFxcIj5cXG4gICAgICAgICAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICdzdi1hY3Rpb24tYmFyJywgcGFyYW1zOiB7IG1vZGVsOiAkZGF0YS5pdGVtLmdldERhdGEoKSwgaGFuZGxlQ2xpY2s6IGZhbHNlIH19IC0tPlxcbiAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiAkZGF0YS5pc0VtcHR5IC0tPlxcbiAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgY29sc3BhbjogJGRhdGEuY29sU3BhbnMgfVxcXCI+PC90ZD5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiAkZGF0YS5oYXNQYW5lbCAtLT5cXG4gICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVxcXCJjc3M6JGRhdGEuY2xhc3NOYW1lLCBhdHRyOiB7Y29sc3BhbjogJGRhdGEuY29sU3BhbnN9XFxcIj5cXG4gICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJGRhdGEucGFuZWwua29FbGVtZW50VHlwZSwgZGF0YTogJGRhdGEucGFuZWwsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb1BhbmVsQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEuaGFzUXVlc3Rpb24gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LW1hdHJpeGNlbGwnLCBhZnRlclJlbmRlcjogZnVuY3Rpb24oZWxzKSB7ICRkYXRhLm1hdHJpeC5rb0NlbGxBZnRlclJlbmRlcihlbHMsICRkYXRhKTsgfSB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmhhc1RpdGxlIC0tPlxcbiAgICAgICAgICAgIDx0ZFxcbiAgICAgICAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6ICRkYXRhLmNsYXNzTmFtZSwgc3R5bGU6IHsgbWluV2lkdGg6ICRkYXRhLm1pbldpZHRoLCB3aWR0aDogJGRhdGEud2lkdGggfVxcXCJcXG4gICAgICAgICAgICA+XFxuICAgICAgICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBxdWVzdGlvbi5nZXRSb3dIZWFkZXJXcmFwcGVyQ29tcG9uZW50TmFtZSgkZGF0YSksIHBhcmFtczogeyBjb21wb25lbnREYXRhOiAgcXVlc3Rpb24uZ2V0Um93SGVhZGVyV3JhcHBlckNvbXBvbmVudERhdGEoJGRhdGEpLCB0ZW1wbGF0ZURhdGE6IHsgZGF0YTogJGRhdGEgfSB9IH0gLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogJGRhdGEubG9jVGl0bGUgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLnJlcXVpcmVkVGV4dCAtLT5cXG4gICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEucmVxdWlyZWRUZXh0XFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvdGJvZHk+XFxuICAgICAgICA8IS0tIGtvIGlmOnF1ZXN0aW9uLmtvVGFibGUoKS5oYXNGb290ZXIgLS0+XFxuICAgICAgICA8dGZvb3Q+XFxuICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmtvVGFibGUoKS5mb290ZXJSb3cuY2VsbHMgLS0+XFxuICAgICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGRhdGEuaGFzUXVlc3Rpb24gLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktbWF0cml4Y2VsbCcsIGFmdGVyUmVuZGVyOiBmdW5jdGlvbihlbHMpIHsgJGRhdGEubWF0cml4LmtvQ2VsbEFmdGVyUmVuZGVyKGVscywgJGRhdGEpOyB9IH0gLS0+PCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRkYXRhLmhhc1RpdGxlIC0tPjwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiAkZGF0YS5sb2NUaXRsZSB9IC0tPjwhLS0gL2tvIC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwvdHI+XFxuICAgICAgICA8L3Rmb290PlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPC90YWJsZT5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0ga28gaWZub3Q6IHF1ZXN0aW9uLmtvVGFibGUoKS5zaG93VGFibGUgLS0+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuZW1wdHlSb3dzU2VjdGlvblxcXCI+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5lbXB0eVJvd3NUZXh0XFxcIj5cXG4gICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBxdWVzdGlvbi5sb2NFbXB0eVJvd3NUZXh0IH0gLS0+PCEtLSAva28gLS0+XFxuICAgICAgPC9kaXY+XFxuICAgICAgPGJ1dHRvblxcbiAgICAgICAgdHlwZT1cXFwiYnV0dG9uXFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazpxdWVzdGlvbi5rb0FkZFJvd0NsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uICsgJyAnICsgcXVlc3Rpb24ua29Dc3MoKS5idXR0b25BZGQgKyAnJyArIHF1ZXN0aW9uLmtvQ3NzKCkuZW1wdHlSb3dzQnV0dG9uLCBkaXNhYmxlOiBxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHlcXFwiXFxuICAgICAgPlxcbiAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IHF1ZXN0aW9uLmxvY0FkZFJvd1RleHQgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmljb25BZGRcXFwiPjwvc3Bhbj5cXG4gICAgICA8L2J1dHRvbj5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5rb1RhYmxlKCkuc2hvd0FkZFJvd09uQm90dG9tIC0tPlxcbiAgICA8ZGl2XFxuICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuZm9vdGVyXFxcIlxcbiAgICA+XFxuICAgICAgPGJ1dHRvblxcbiAgICAgICAgdHlwZT1cXFwiYnV0dG9uXFxcIlxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJjbGljazpxdWVzdGlvbi5rb0FkZFJvd0NsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uICsgJyAnICsgcXVlc3Rpb24ua29Dc3MoKS5idXR0b25BZGQsIGRpc2FibGU6IHF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seVxcXCJcXG4gICAgICA+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24ubG9jQWRkUm93VGV4dCB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaWNvbkFkZFxcXCI+PC9zcGFuPlxcbiAgICAgIDwvYnV0dG9uPlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG48c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1tYXRyaXhjZWxsXFxcIj5cXG4gIDx0ZFxcbiAgICBkYXRhLWJpbmQ9XFxcImNzczogJGRhdGEuY2xhc3NOYW1lLCBzdHlsZToge21pbldpZHRoOiAkZGF0YS5taW5XaWR0aCwgd2lkdGg6ICRkYXRhLndpZHRofSwgYXR0cjogeyB0aXRsZTogaGVhZGVycyB9XFxcIlxcbiAgPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uaXNWaXNpYmxlXFxcIj5cXG4gICAgICA8IS0tIGtvIGlmOiAkZGF0YS5zaG93RXJyb3JPblRvcCAtLT5cXG4gICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogcXVlc3Rpb24sIGFzOiAncXVlc3Rpb24nIH0gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSBrbyBpZjogJGRhdGEuaXNDaG9pY2UgLS0+XFxuICAgICAgPCEtLSBrbyBpZjogJGRhdGEuaXNDaGVja2JveCAtLT5cXG4gICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHtuYW1lOiAnc3VydmV5LWNoZWNrYm94LWl0ZW0nLCB0ZW1wbGF0ZU9wdGlvbnM6IHtoaWRlQ2FwdGlvbjogdHJ1ZX0gfSAgLS0+PCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSBrbyBpZm5vdDogJGRhdGEuaXNDaGVja2JveCAtLT5cXG4gICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHtuYW1lOiAnc3VydmV5LXJhZGlvZ3JvdXAtaXRlbScsIHRlbXBsYXRlT3B0aW9uczoge2hpZGVDYXB0aW9uOiB0cnVlfSB9ICAtLT48IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIGlmbm90OiAkZGF0YS5pc0Nob2ljZSAtLT5cXG4gICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5pc0RlZmF1bHRSZW5kZXJpbmcoKSAtLT5cXG4gICAgICAgIDwhLS0ga28gbGV0OiB7IHF1ZXN0aW9uOiAkZGF0YS5tYXRyaXguZ2V0Q2VsbFRlbXBsYXRlRGF0YSgkZGF0YSkgfSAtLT5cXG4gICAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6ICRkYXRhLm1hdHJpeC5nZXRDZWxsV3JhcHBlckNvbXBvbmVudE5hbWUoJGRhdGEpLCBwYXJhbXM6IHsgY29tcG9uZW50RGF0YTogICRkYXRhLm1hdHJpeC5nZXRDZWxsV3JhcHBlckNvbXBvbmVudERhdGEoJGRhdGEpLCB0ZW1wbGF0ZURhdGE6IHsgbmFtZTogcXVlc3Rpb24ua29UZW1wbGF0ZU5hbWUoKSwgZGF0YTogcXVlc3Rpb24sIGFmdGVyUmVuZGVyOiBmdW5jdGlvbihlbCkgeyAkZGF0YS5tYXRyaXgua29DZWxsUXVlc3Rpb25BZnRlclJlbmRlcihlbCwgJGRhdGEpOyB9IH0gfSB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5pc0RlZmF1bHRSZW5kZXJpbmcoKSAtLT5cXG4gICAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6IHF1ZXN0aW9uLmdldENvbXBvbmVudE5hbWUoKSwgcGFyYW1zOiB7IHF1ZXN0aW9uOiBxdWVzdGlvbiB9IH0gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIGlmOiAkZGF0YS5zaG93RXJyb3JPbkJvdHRvbSAtLT5cXG4gICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogcXVlc3Rpb24sIGFzOiAncXVlc3Rpb24nIH0gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgIDwvZGl2PlxcbiAgPC90ZD5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tbXVsdGlwbGV0ZXh0XFxcIj5cXG4gIDx0YWJsZSBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290LCBmb3JlYWNoOiB7IGRhdGE6ICBxdWVzdGlvbi5rb1Jvd3MsIGFzOiAncm93JyB9XFxcIj5cXG4gICAgICA8dHIgZGF0YS1iaW5kPVxcXCJmb3JlYWNoOiB7IGRhdGE6IHJvdywgYXM6ICdpdGVtJyB9LCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm93XFxcIj5cXG4gICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1UaXRsZSArICcgJyArIHF1ZXN0aW9uLmtvQ3NzKCkuY2VsbFxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLXRpdGxlLWNvbnRlbnQnLCBkYXRhOiBpdGVtLmVkaXRvciwgYXM6ICdxdWVzdGlvbicgfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW0gKyAnICcgKyBxdWVzdGlvbi5rb0NzcygpLmNlbGxcXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IGl0ZW0uZWRpdG9yLmVycm9yTG9jYXRpb24gPT0gJ3RvcCcgLS0+XFxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5lcnJvci5sb2NhdGlvblRvcFxcXCI+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi1lcnJvcnMnLCBkYXRhOiBpdGVtLmVkaXRvciB9IC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6IGl0ZW0uZWRpdG9yLmtvVGVtcGxhdGVOYW1lKCksIGRhdGE6IGl0ZW0uZWRpdG9yLCBhczogJ3F1ZXN0aW9uJywgYWZ0ZXJSZW5kZXI6IGl0ZW0uZWRpdG9yLmtvUXVlc3Rpb25BZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IGl0ZW0uZWRpdG9yLmVycm9yTG9jYXRpb24gPT0gJ2JvdHRvbScgLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogaXRlbS5lZGl0b3IgfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC90ZD5cXG4gICAgICA8L3RyPlxcbiAgPC90YWJsZT5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tcGFuZWxkeW5hbWljLW5hdmlnYXRvclxcXCI+XFxuICA8ZGl2IHN0eWxlPVxcXCJjbGVhcjpib3RoO1xcXCI+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnByb2dyZXNzQ29udGFpbmVyXFxcIj5cXG4gICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRpdGxlOiBxdWVzdGlvbi5wYW5lbFByZXZUZXh0LCBjbGljazogcXVlc3Rpb24ua29QcmV2UGFuZWxDbGlja1xcXCI+XFxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVxcXCIwIDAgMTAgMTBcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0J1dHRvblByZXZDc3NcXFwiPlxcbiAgICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVxcXCIyLDIgMCw0IDUsOSAxMCw0IDgsMiA1LDUgXFxcIiAvPlxcbiAgICAgICAgICAgIDwvc3ZnPlxcbiAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29Jc1JhbmdlIC0tPlxcbiAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnByb2dyZXNzXFxcIj5cXG4gICAgICAgICAgICA8ZGl2XFxuICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5wcm9ncmVzc0Jhciwgc3R5bGU6IHt3aWR0aDogcXVlc3Rpb24ua29Qcm9ncmVzc31cXFwiXFxuICAgICAgICAgICAgICByb2xlPVxcXCJwcm9ncmVzc2JhclxcXCJcXG4gICAgICAgICAgICA+PC9kaXY+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG5cXG4gICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRpdGxlOnF1ZXN0aW9uLnBhbmVsTmV4dFRleHQsIGNsaWNrOiBxdWVzdGlvbi5rb05leHRQYW5lbENsaWNrXFxcIj5cXG4gICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XFxcIjAgMCAxMCAxMFxcXCIgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQnV0dG9uTmV4dENzc1xcXCI+XFxuICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XFxcIjIsMiAwLDQgNSw5IDEwLDQgOCwyIDUsNSBcXFwiIC8+XFxuICAgICAgICAgICAgPC9zdmc+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5jYW5BZGRQYW5lbCAtLT5cXG4gICAgICAgIDxpbnB1dFxcbiAgICAgICAgICB0eXBlPVxcXCJidXR0b25cXFwiXFxuICAgICAgICAgIGRhdGEtYmluZD1cXFwidmFsdWU6IHF1ZXN0aW9uLnBhbmVsQWRkVGV4dCwgY3NzOnF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uICArICcgJyArIHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uQWRkLCBjbGljazpxdWVzdGlvbi5rb0FkZFBhbmVsQ2xpY2tcXFwiXFxuICAgICAgICAvPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuXFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGV4dDpxdWVzdGlvbi5rb1Byb2dyZXNzVGV4dCwgY3NzOnF1ZXN0aW9uLmtvQ3NzKCkucHJvZ3Jlc3NUZXh0XFxcIj48L2Rpdj5cXG4gICAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tcGFuZWxkeW5hbWljXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCI+XFxuICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29Jc0xpc3QoKSAtLT5cXG4gICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24ucGFuZWxzIH0gLS0+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0UGFuZWxXcmFwcGVyQ3NzKClcXFwiPlxcbiAgICAgICAgPCEtLSBrbyBsZXQ6IHsgcXVlc3Rpb246ICRkYXRhIH0gLS0+XFxuICAgICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBzdXJ2ZXkuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKHF1ZXN0aW9uKSwgcGFyYW1zOiB7IGNvbXBvbmVudERhdGE6ICBzdXJ2ZXkuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnREYXRhKHF1ZXN0aW9uKSwgdGVtcGxhdGVEYXRhOiB7IG5hbWU6IHF1ZXN0aW9uLmtvRWxlbWVudFR5cGUsIGRhdGE6IHF1ZXN0aW9uLCBhZnRlclJlbmRlcjogJHBhcmVudC5rb1BhbmVsQWZ0ZXJSZW5kZXIgfSB9IH0gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5rb0NhblJlbW92ZVBhbmVsKCkgJiYgJGRhdGEuc3RhdGUgIT0gJ2NvbGxhcHNlZCcsIGNsaWNrOnF1ZXN0aW9uLmtvUmVtb3ZlUGFuZWxDbGljaywgY3NzOiBxdWVzdGlvbi5nZXRQYW5lbFJlbW92ZUJ1dHRvbkNzcygpLCB2YWx1ZTogcXVlc3Rpb24ucGFuZWxSZW1vdmVUZXh0XFxcIlxcbiAgICAgICAgLz5cXG4gICAgICA8L2Rpdj5cXG4gICAgICAgIDxociBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5zZXBhcmF0b3JcXFwiLz5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOnF1ZXN0aW9uLmtvQ2FuQWRkUGFuZWwsIGNsaWNrOnF1ZXN0aW9uLmtvQWRkUGFuZWxDbGljaywgY3NzOiBxdWVzdGlvbi5rb0J1dHRvbkFkZENzcywgdmFsdWU6IHF1ZXN0aW9uLnBhbmVsQWRkVGV4dFxcXCJcXG4gICAgICAgIC8+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5rb0lzTGlzdCgpICAtLT5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOnF1ZXN0aW9uLmtvSXNQcm9ncmVzc1RvcCwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnByb2dyZXNzVG9wXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tcGFuZWxkeW5hbWljLW5hdmlnYXRvcicsIGRhdGE6IHF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJ30gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvUGFuZWwoKSAtLT5cXG4gICAgICAgICAgICA8IS0tIGtvIGxldDogeyBxdWVzdGlvbjogcXVlc3Rpb24ua29QYW5lbCgpIH0gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uc3VydmV5LmdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50TmFtZShxdWVzdGlvbiksIHBhcmFtczogeyBjb21wb25lbnREYXRhOiAgcXVlc3Rpb24uc3VydmV5LmdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50RGF0YShxdWVzdGlvbiksIHRlbXBsYXRlRGF0YTogeyBuYW1lOiBxdWVzdGlvbi5rb0VsZW1lbnRUeXBlLCBkYXRhOiBxdWVzdGlvbiwgYWZ0ZXJSZW5kZXI6ICRwYXJlbnQua29QYW5lbEFmdGVyUmVuZGVyIH0gfSB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmtvQ2FuUmVtb3ZlUGFuZWwsIGNsaWNrOnF1ZXN0aW9uLmtvUmVtb3ZlUGFuZWxDbGljaywgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbiArICcgJyArIHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uUmVtb3ZlLCB2YWx1ZTogcXVlc3Rpb24ucGFuZWxSZW1vdmVUZXh0XFxcIlxcbiAgICAgICAgLz5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOnF1ZXN0aW9uLmtvSXNQcm9ncmVzc0JvdHRvbSwgIGNzczogcXVlc3Rpb24ua29Dc3MoKS5wcm9ncmVzc0JvdHRvbVxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3InLCBkYXRhOiBxdWVzdGlvbiwgYXM6ICdxdWVzdGlvbid9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tcmFkaW9ncm91cFxcXCI+XFxuICA8ZmllbGRzZXQgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdFxcXCIgcm9sZT1cXFwicmFkaW9ncm91cFxcXCI+XFxuICAgIDwhLS0ga28gaWZub3Q6IHF1ZXN0aW9uLmhhc1RpdGxlIC0tPlxcbiAgICA8bGVnZW5kIGRhdGEtYmluZD1cXFwiYXR0cjogeyAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCB9XFxcIj48L2xlZ2VuZD5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWZub3Q6IHF1ZXN0aW9uLmhhc0NvbHVtbnMgLS0+XFxuICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi52aXNpYmxlQ2hvaWNlcywgYXM6ICdpdGVtJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBxdWVzdGlvbi5nZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50TmFtZShpdGVtKSwgcGFyYW1zOiB7IGNvbXBvbmVudERhdGE6ICBxdWVzdGlvbi5nZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50RGF0YShpdGVtKSwgdGVtcGxhdGVEYXRhOiB7IG5hbWU6ICdzdXJ2ZXktcmFkaW9ncm91cC1pdGVtJywgZGF0YTogaXRlbSB9IH0gfSAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNDb2x1bW5zIC0tPlxcbiAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmNvbHVtbnMgLS0+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldENvbHVtbkNsYXNzKClcXFwiPlxcbiAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiAkZGF0YSwgYXM6ICdpdGVtJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6IHF1ZXN0aW9uLmdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnROYW1lKGl0ZW0pLCBwYXJhbXM6IHsgY29tcG9uZW50RGF0YTogIHF1ZXN0aW9uLmdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnREYXRhKGl0ZW0pLCB0ZW1wbGF0ZURhdGE6IHsgbmFtZTogJ3N1cnZleS1yYWRpb2dyb3VwLWl0ZW0nLCBkYXRhOiBpdGVtIH0gfSB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmNhblNob3dDbGVhckJ1dHRvbiAtLT5cXG4gICAgPGRpdj5cXG4gICAgICA8aW5wdXRcXG4gICAgICAgIHR5cGU9XFxcImJ1dHRvblxcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiY2xpY2s6cXVlc3Rpb24uY2xlYXJWYWx1ZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmNsZWFyQnV0dG9uLCB2YWx1ZTogcXVlc3Rpb24uY2xlYXJCdXR0b25DYXB0aW9uXFxcIlxcbiAgICAgIC8+XFxuICAgIDwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZmllbGRzZXQ+XFxuPC9zY3JpcHQ+XFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcmFkaW9ncm91cC1pdGVtXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1DbGFzcyhpdGVtKVxcXCI+XFxuICAgIDxsYWJlbCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0TGFiZWxDbGFzcyhpdGVtKVxcXCI+XFxuICAgICAgPGlucHV0XFxuICAgICAgICB0eXBlPVxcXCJyYWRpb1xcXCJcXG4gICAgICAgIGRhdGEtYmluZD1cXFwiYXR0cjogeyBuYW1lOiBxdWVzdGlvbi5uYW1lICsgJ18nICsgcXVlc3Rpb24uaWQsIGlkOiBxdWVzdGlvbi5pbnB1dElkICsgJ18nICsgcXVlc3Rpb24uZ2V0SXRlbUluZGV4KGl0ZW0pLCAnYXJpYS1yZXF1aXJlZCc6IHF1ZXN0aW9uLmlzUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogaXRlbS5sb2NUZXh0LnJlbmRlcmVkSHRtbCwgJ2FyaWEtaW52YWxpZCc6IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwLCAnYXJpYS1kZXNjcmliZWRieSc6IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwID8gcXVlc3Rpb24uaWQgKyAnX2Vycm9ycycgOiBudWxsfSwgY2hlY2tlZFZhbHVlOiBpdGVtLnZhbHVlLCBjaGVja2VkOiBxdWVzdGlvbi5yZW5kZXJlZFZhbHVlLCBlbmFibGU6ICFxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHkgJiYgaXRlbS5pc0VuYWJsZWQsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCJcXG4gICAgICAvPlxcbiAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLm1hdGVyaWFsRGVjb3JhdG9yXFxcIj5cXG4gICAgICAgIDxzdmdcXG4gICAgICAgICAgZGF0YS1iaW5kPVxcXCJjc3M6cXVlc3Rpb24ua29Dc3MoKS5pdGVtRGVjb3JhdG9yXFxcIlxcbiAgICAgICAgICB2aWV3Qm94PVxcXCItMTIgLTEyIDI0IDI0XFxcIlxcbiAgICAgICAgPlxcbiAgICAgICAgICA8Y2lyY2xlIHI9XFxcIjZcXFwiIGN4PVxcXCIwXFxcIiBjeT1cXFwiMFxcXCIgLz5cXG4gICAgICAgIDwvc3ZnPlxcbiAgICAgIDwvc3Bhbj5cXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiY2hlY2tcXFwiPjwvc3Bhbj5cXG4gICAgICA8c3BhblxcbiAgICAgICAgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiAhaXRlbS5oaWRlQ2FwdGlvbiwgY3NzOiBxdWVzdGlvbi5nZXRDb250cm9sTGFiZWxDbGFzcyhpdGVtKSwgYXR0cjogeyB0aXRsZTogaXRlbS5sb2NUZXh0LmtvUmVuZGVyZWRIdG1sIH1cXFwiXFxuICAgICAgPlxcbiAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGl0ZW0ubG9jVGV4dCB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPC9zcGFuPlxcbiAgICA8L2xhYmVsPlxcbiAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNPdGhlciAmJiAoaXRlbS52YWx1ZSA9PSBxdWVzdGlvbi5vdGhlckl0ZW0udmFsdWUpIC0tPlxcbiAgICA8ZGl2XFxuICAgICAgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiXFxuICAgICAgZGF0YS1iaW5kPVxcXCJ0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LWNvbW1lbnQnLCBkYXRhOiB7J3F1ZXN0aW9uJzogcXVlc3Rpb24sICd2aXNpYmxlJzogcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkfX1cXFwiXFxuICAgID48L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tcmFua2luZ1xcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5yb290Q2xhc3NcXFwiPlxcbiAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24ucmFua2luZ0Nob2ljZXMsIGFzOiAnaXRlbScsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb0FmdGVyUmVuZGVyIH0gLS0+XFxuICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcXVlc3Rpb24uZ2V0SXRlbVZhbHVlV3JhcHBlckNvbXBvbmVudE5hbWUoaXRlbSksIHBhcmFtczogeyBjb21wb25lbnREYXRhOiAgcXVlc3Rpb24uZ2V0SXRlbVZhbHVlV3JhcHBlckNvbXBvbmVudERhdGEoaXRlbSksIHRlbXBsYXRlRGF0YTogeyBuYW1lOiAnc3VydmV5LXJhbmtpbmctaXRlbScsIGRhdGE6IGl0ZW0gfSB9IH0gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXFxuPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcmFua2luZy1pdGVtXFxcIj5cXG4gIDxkaXZcXG4gICAgdGFiaW5kZXg9XFxcIjBcXFwiXFxuICAgIGRhdGEtYmluZD1cXFwiZXZlbnQ6IHsga2V5ZG93bjogZnVuY3Rpb24oZGF0YSwgZXZlbnQpe3F1ZXN0aW9uLmhhbmRsZUtleWRvd24uY2FsbChxdWVzdGlvbiwgZXZlbnQpOyByZXR1cm4gdHJ1ZTt9IH0sIGNzczogcXVlc3Rpb24uZ2V0SXRlbUNsYXNzKCRkYXRhKVxcXCJcXG4gID5cXG4gICAgPGRpdiB0YWJpbmRleD1cXFwiLTFcXFwiIHN0eWxlPVxcXCJvdXRsaW5lOiBub25lO1xcXCI+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtR2hvc3ROb2RlXFxcIj48L2Rpdj5cXG4gICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLml0ZW1Db250ZW50XFxcIj5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbUljb25Db250YWluZXJcXFwiPlxcbiAgICAgICAgICA8c3ZnXFxuICAgICAgICAgICAgd2lkdGg9XFxcIjEwXFxcIlxcbiAgICAgICAgICAgIGhlaWdodD1cXFwiMTZcXFwiXFxuICAgICAgICAgICAgdmlld0JveD1cXFwiMCAwIDEwIDE2XFxcIlxcbiAgICAgICAgICAgIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLml0ZW1JY29uICsgJyAnICsgcXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtSWNvbkhvdmVyTW9kXFxcIlxcbiAgICAgICAgICAgIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCJcXG4gICAgICAgICAgPlxcbiAgICAgICAgICAgIDxwYXRoXFxuICAgICAgICAgICAgICBkPVxcXCJNNiAyQzYgMC45IDYuOSAwIDggMEM5LjEgMCAxMCAwLjkgMTAgMkMxMCAzLjEgOS4xIDQgOCA0QzYuOSA0IDYgMy4xIDYgMlpNMiAwQzAuOSAwIDAgMC45IDAgMkMwIDMuMSAwLjkgNCAyIDRDMy4xIDQgNCAzLjEgNCAyQzQgMC45IDMuMSAwIDIgMFpNOCA2QzYuOSA2IDYgNi45IDYgOEM2IDkuMSA2LjkgMTAgOCAxMEM5LjEgMTAgMTAgOS4xIDEwIDhDMTAgNi45IDkuMSA2IDggNlpNMiA2QzAuOSA2IDAgNi45IDAgOEMwIDkuMSAwLjkgMTAgMiAxMEMzLjEgMTAgNCA5LjEgNCA4QzQgNi45IDMuMSA2IDIgNlpNOCAxMkM2LjkgMTIgNiAxMi45IDYgMTRDNiAxNS4xIDYuOSAxNiA4IDE2QzkuMSAxNiAxMCAxNS4xIDEwIDE0QzEwIDEyLjkgOS4xIDEyIDggMTJaTTIgMTJDMC45IDEyIDAgMTIuOSAwIDE0QzAgMTUuMSAwLjkgMTYgMiAxNkMzLjEgMTYgNCAxNS4xIDQgMTRDNCAxMi45IDMuMSAxMiAyIDEyWlxcXCJcXG4gICAgICAgICAgICAvPlxcbiAgICAgICAgICA8L3N2Zz5cXG4gICAgICAgICAgPHN2Z1xcbiAgICAgICAgICAgIHdpZHRoPVxcXCIxMFxcXCJcXG4gICAgICAgICAgICBoZWlnaHQ9XFxcIjI0XFxcIlxcbiAgICAgICAgICAgIHZpZXdCb3g9XFxcIjAgMCAxMCAyNFxcXCJcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtSWNvbiArICcgJyArIHF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbUljb25Gb2N1c01vZFxcXCJcXG4gICAgICAgICAgICB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiXFxuICAgICAgICAgID5cXG4gICAgICAgICAgICA8cGF0aCBkPVxcXCJNMTAgNUw1IDBMMCA1SDRWOUg2VjVIMTBaXFxcIiAvPlxcbiAgICAgICAgICAgIDxwYXRoIGQ9XFxcIk02IDE5VjE1SDRWMTlIMEw1IDI0TDEwIDE5SDZaXFxcIiAvPlxcbiAgICAgICAgICA8L3N2Zz5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdlxcbiAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtSW5kZXgsIHRleHQ6IHF1ZXN0aW9uLmdldE51bWJlckJ5SW5kZXgoJGluZGV4KCkpXFxcIlxcbiAgICAgICAgPjwvZGl2PlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5jb250cm9sTGFiZWxcXFwiPlxcbiAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogJGRhdGEubG9jVGV4dCB9IC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1yYXRpbmdcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICAgICAgPGZpZWxkc2V0IHJvbGU9XFxcInJhZGlvZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgIDxsZWdlbmRcXG4gICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwgfVxcXCJcXG4gICAgICAgICAgICA+PC9sZWdlbmQ+XFxuICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBxdWVzdGlvbi5rb1Zpc2libGVSYXRlVmFsdWVzIC0tPlxcbiAgICAgICAgICAgIDxsYWJlbCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0SXRlbUNsYXNzKCRkYXRhKVxcXCI+XFxuICAgICAgICAgICAgICAgIDxpbnB1dFxcbiAgICAgICAgICAgICAgICB0eXBlPVxcXCJjaGVja2JveFxcXCJcXG4gICAgICAgICAgICAgICAgY2xhc3M9XFxcInN2LXZpc3VhbGx5aGlkZGVuXFxcIlxcbiAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImF0dHI6IHsgbmFtZTogcXVlc3Rpb24ubmFtZSwgaWQ6IHF1ZXN0aW9uLmlucHV0SWQgKyAnXycgKyAkaW5kZXgoKSwgdmFsdWU6ICRkYXRhLnZhbHVlLCAnYXJpYS1yZXF1aXJlZCc6IHF1ZXN0aW9uLmlzUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogJGRhdGEubG9jVGV4dC50ZXh0LCAnYXJpYS1pbnZhbGlkJzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAsICdhcmlhLWRlc2NyaWJlZGJ5JzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAgPyBxdWVzdGlvbi5pZCArICdfZXJyb3JzJyA6IG51bGwgfSwgY2hlY2tlZFZhbHVlOiAkZGF0YS52YWx1ZSwgY2hlY2tlZDogcXVlc3Rpb24udmFsdWUsIGVuYWJsZTogIXF1ZXN0aW9uLmlzSW5wdXRSZWFkT25seVxcXCJcXG4gICAgICAgICAgICAgICAgLz5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGluZGV4KCkgPT0gMCAtLT5cXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubWluVGV4dFxcXCI+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBxdWVzdGlvbi5sb2NNaW5SYXRlRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuXFxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1UZXh0XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6ICRkYXRhLmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJGluZGV4KCkgPT0gKHF1ZXN0aW9uLmtvVmlzaWJsZVJhdGVWYWx1ZXMoKS5sZW5ndGgtMSkgLS0+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLm1heFRleHRcXFwiPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24ubG9jTWF4UmF0ZURlc2NyaXB0aW9uIH0gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvbGFiZWw+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2ZpZWxkc2V0PlxcbiAgICA8L2Rpdj5cXG5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmhhc090aGVyXFxcIj5cXG4gICAgICA8ZGl2XFxuICAgICAgICBkYXRhLWJpbmQ9XFxcInRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktY29tbWVudCcsIGRhdGE6IHsgJ3F1ZXN0aW9uJzogcXVlc3Rpb24gfSB9XFxcIlxcbiAgICAgID48L2Rpdj5cXG4gICAgPC9kaXY+XFxuICA8L2ZpZWxkc2V0Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1zaWduYXR1cmVwYWRcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3QsIHN0eWxlOiB7IGhlaWdodDogaGVpZ2h0LCB3aWR0aDogd2lkdGggfVxcXCI+XFxuICAgICAgICA8ZGl2IFxcbiAgICAgICAgICAgIGRhdGEtYmluZD1cXFwidGV4dDogcGxhY2VIb2xkZXJUZXh0LCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucGxhY2Vob2xkZXIsIHZpc2libGU6ICRkYXRhLm5lZWRTaG93UGxhY2Vob2xkZXIoKVxcXCI+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgPGNhbnZhcyB0YWJpbmRleD0nMCc+PC9jYW52YXM+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY29udHJvbHMsIHZpc2libGU6ICFxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHlcXFwiPlxcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJ1xcbiAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5jbGVhckJ1dHRvbiwgYXR0cjogeyB0aXRsZTogcXVlc3Rpb24uY2xlYXJCdXR0b25DYXB0aW9uIH1cXFwiPuKcljwvYnV0dG9uPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2Plxcbjwvc2NyaXB0PlwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi10ZXh0XFxcIj5cXG4gIDwhLS1rbyBpZjogIXF1ZXN0aW9uLmlzSW5wdXRUZXh0VXBkYXRlIC0tPlxcbiAgPGlucHV0XFxuICAgIGRhdGEtYmluZD1cXFwiZGlzYWJsZTogcXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5LCBzdHlsZToge3dpZHRoOiBxdWVzdGlvbi5pbnB1dFdpZHRofSwgYXR0cjoge3R5cGU6IHF1ZXN0aW9uLmlucHV0VHlwZSwgc2l6ZTogcXVlc3Rpb24uaW5wdXRTaXplLCBpZDogcXVlc3Rpb24uaW5wdXRJZCwgcGxhY2Vob2xkZXI6IHF1ZXN0aW9uLnJlbmRlcmVkUGxhY2VIb2xkZXIsIG1heExlbmd0aDogcXVlc3Rpb24uZ2V0TWF4TGVuZ3RoKCksIG1pbjogcXVlc3Rpb24ucmVuZGVyZWRNaW4sIG1heDogcXVlc3Rpb24ucmVuZGVyZWRNYXgsIHN0ZXA6IHF1ZXN0aW9uLnJlbmRlcmVkU3RlcCwgJ2FyaWEtcmVxdWlyZWQnOiBxdWVzdGlvbi5pc1JlcXVpcmVkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCwgJ2FyaWEtaW52YWxpZCc6IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwLCAnYXJpYS1kZXNjcmliZWRieSc6IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwID8gcXVlc3Rpb24uaWQgKyAnX2Vycm9ycycgOiBudWxsLCBhdXRvQ29tcGxldGU6IHF1ZXN0aW9uLmF1dG9Db21wbGV0ZSwgbGlzdDpxdWVzdGlvbi5kYXRhTGlzdElkfSwgdmFsdWU6IHF1ZXN0aW9uLnZhbHVlLCBjc3M6IHF1ZXN0aW9uLmdldENvbnRyb2xDbGFzcygpXFxcIlxcbiAgLz5cXG4gIDwhLS0va28tLT5cXG4gIDwhLS1rbyBpZjogcXVlc3Rpb24uaXNJbnB1dFRleHRVcGRhdGUgLS0+XFxuICA8aW5wdXRcXG4gICAgZGF0YS1iaW5kPVxcXCJkaXNhYmxlOiBxdWVzdGlvbi5pc0lucHV0UmVhZE9ubHksIHN0eWxlOiB7d2lkdGg6IHF1ZXN0aW9uLmlucHV0V2lkdGh9LCBhdHRyOiB7dHlwZTogcXVlc3Rpb24uaW5wdXRUeXBlLCBzaXplOiBxdWVzdGlvbi5pbnB1dFNpemUsIGlkOiBxdWVzdGlvbi5pbnB1dElkLCBwbGFjZWhvbGRlcjogcXVlc3Rpb24ucmVuZGVyZWRQbGFjZUhvbGRlciwgbWF4TGVuZ3RoOiBxdWVzdGlvbi5nZXRNYXhMZW5ndGgoKSwgbWluOiBxdWVzdGlvbi5yZW5kZXJlZE1pbiwgbWF4OiBxdWVzdGlvbi5yZW5kZXJlZE1heCwgc3RlcDogcXVlc3Rpb24ucmVuZGVyZWRTdGVwLCAnYXJpYS1yZXF1aXJlZCc6IHF1ZXN0aW9uLmlzUmVxdWlyZWQsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sLCAnYXJpYS1pbnZhbGlkJzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAsICdhcmlhLWRlc2NyaWJlZGJ5JzogcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAgPyBxdWVzdGlvbi5pZCArICdfZXJyb3JzJyA6IG51bGwsIGF1dG9Db21wbGV0ZTogcXVlc3Rpb24uYXV0b0NvbXBsZXRlLCBsaXN0OnF1ZXN0aW9uLmRhdGFMaXN0SWR9LCB0ZXh0SW5wdXQ6IHF1ZXN0aW9uLnZhbHVlLCBjc3M6IHF1ZXN0aW9uLmdldENvbnRyb2xDbGFzcygpXFxcIlxcbiAgLz5cXG4gIDwhLS0va28tLT5cXG4gIDwhLS1rbyBpZjogcXVlc3Rpb24uZGF0YUxpc3RJZCAtLT5cXG4gIDxkYXRhbGlzdCBkYXRhLWJpbmQ9XFxcImF0dHI6IHtpZDogcXVlc3Rpb24uZGF0YUxpc3RJZH1cXFwiPlxcbiAgICA8IS0tIGtvIGZvcmVhY2g6IHF1ZXN0aW9uLmRhdGFMaXN0IC0tPlxcbiAgICAgIDxvcHRpb24gZGF0YS1iaW5kPVxcXCJ2YWx1ZTokZGF0YVxcXCI+PC9vcHRpb24+XFxuICAgIDwhLS0va28tLT5cXG4gIDwvZGF0YWxpc3Q+XFxuICA8IS0tL2tvLS0+XFxuPC9zY3JpcHQ+XFxuXCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uXFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvUm9vdENzcygpLCBzdHlsZTogeyBwYWRkaW5nTGVmdDogcXVlc3Rpb24ucGFkZGluZ0xlZnQsIHBhZGRpbmdSaWdodDogcXVlc3Rpb24ucGFkZGluZ1JpZ2h0IH0sIGF0dHI6IHsgaWQ6IHF1ZXN0aW9uLmlkLCBuYW1lOiBxdWVzdGlvbi5uYW1lLCByb2xlOiBxdWVzdGlvbi5hcmlhUm9sZSwgJ2FyaWEtbGFiZWxsZWRieSc6IHF1ZXN0aW9uLmhhc1RpdGxlID8gcXVlc3Rpb24uYXJpYVRpdGxlSWQgOiBudWxsIH1cXFwiPlxcbiAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc1RpdGxlT25MZWZ0VG9wIC0tPlxcbiAgICAgIDwhLS1rbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLXRpdGxlJywgZGF0YTogcXVlc3Rpb24gIH0gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6ICFxdWVzdGlvbi5pc0NvbGxhcHNlZCwgY3NzOiBxdWVzdGlvbi5jc3NDb250ZW50XFxcIiA+XFxuICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmVycm9yTG9jYXRpb24gPT0gJ3RvcCcgLS0+XFxuICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tZXJyb3JzJywgZGF0YTogcXVlc3Rpb24gfSAtLT5cXG4gICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaXNEZWZhdWx0UmVuZGVyaW5nKCkgLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBxdWVzdGlvbi5rb1RlbXBsYXRlTmFtZSgpLCBkYXRhOiBxdWVzdGlvbiwgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvUXVlc3Rpb25BZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24uaXNEZWZhdWx0UmVuZGVyaW5nKCkgLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogZ2V0Q29tcG9uZW50TmFtZSgpLCBwYXJhbXM6IHsgcXVlc3Rpb246IHF1ZXN0aW9uIH0gfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc0NvbW1lbnQgLS0+XFxuICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuZm9ybUdyb3VwXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24ubG9jQ29tbWVudFRleHQgfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1jb21tZW50JywgZGF0YTogeydxdWVzdGlvbic6IHF1ZXN0aW9uLCAndmlzaWJsZSc6IHRydWUgfSB9XFxcIj48L2Rpdj5cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5lcnJvckxvY2F0aW9uID09ICdib3R0b20nIC0tPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLWVycm9ycycsIGRhdGE6IHF1ZXN0aW9uIH0gLS0+XFxuICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5oYXNEZXNjcmlwdGlvblVuZGVySW5wdXQsIGNzczoga29Dc3MoKS5kZXNjcmlwdGlvblVuZGVySW5wdXRcXFwiPlxcbiAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY0Rlc2NyaXB0aW9uIH0gLS0+PCEtLSAva28gLS0+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc1RpdGxlT25Cb3R0b20gLS0+XFxuICAgICAgPCEtLWtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tdGl0bGUnLCBkYXRhOiBxdWVzdGlvbiAgfSAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICA8IS0tIC9rbyAtLT5cXG4gIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi10aXRsZVxcXCI+XFxuICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NIZWFkZXIsIGNsaWNrOiBxdWVzdGlvbi5jbGlja1RpdGxlRnVuY3Rpb25cXFwiPlxcbiAgICA8aDVcXG4gICAgICBkYXRhLWJpbmQ9XFxcImNzczogY3NzVGl0bGUsIGF0dHI6IHsgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsIGlkOiBhcmlhVGl0bGVJZCwgdGFiaW5kZXg6IHF1ZXN0aW9uLnRpdGxlVGFiSW5kZXgsICdhcmlhLWV4cGFuZGVkJzogcXVlc3Rpb24udGl0bGVBcmlhRXhwYW5kZWR9LCBjbGljazogdG9nZ2xlU3RhdGVCeUNsaWNrLCBldmVudDogeyBrZXl1cDogcXVlc3Rpb24udG9nZ2xlU3RhdGVCeUtleVVwIH1cXFwiXFxuICAgID5cXG4gICAgICA8IS0tIGtvIGNvbXBvbmVudDogeyBuYW1lOiBnZXRUaXRsZUNvbXBvbmVudE5hbWUoKSwgcGFyYW1zOiB7IGVsZW1lbnQ6ICRkYXRhIH0gfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgPC9oNT5cXG4gICAgPGRpdlxcbiAgICAgIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uaGFzRGVzY3JpcHRpb25VbmRlclRpdGxlLCBjc3M6IGtvQ3NzKCkuZGVzY3JpcHRpb25cXFwiXFxuICAgID5cXG4gICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jRGVzY3JpcHRpb24gfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG48c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi10aXRsZS1jb250ZW50XFxcIj5cXG4gIDwhLS0ga28gaWY6ICRkYXRhLmlzUmVxdWlyZVRleHRPblN0YXJ0IC0tPlxcbiAgPHNwYW5cXG4gICAgZGF0YS1iaW5kPVxcXCJjc3M6IGtvQ3NzKCkucmVxdWlyZWRUZXh0IHx8IChrb0NzcygpLnBhbmVsICYmIGtvQ3NzKCkucGFuZWwucmVxdWlyZWRUZXh0KSwgdGV4dDogJGRhdGEucmVxdWlyZWRUZXh0LCBhdHRyOiB7ICdhcmlhLWhpZGRlbic6IHRydWUgfVxcXCJcXG4gID48L3NwYW4+XFxuICA8IS0tIC9rbyAtLT5cXG4gIDwhLS0ga28gaWY6IG5vIC0tPlxcbiAgPHNwYW5cXG4gICAgc3R5bGU9XFxcInBvc2l0aW9uOiBzdGF0aWM7XFxcIlxcbiAgICBkYXRhLWJpbmQ9XFxcImNzczoga29Dc3MoKS5udW1iZXIsIHRleHQ6IG5vLCBhdHRyOiB7ICdhcmlhLWhpZGRlbic6IHRydWUgfVxcXCJcXG4gID48L3NwYW4+XFxuICA8c3Bhbj4mbmJzcDwvc3Bhbj5cXG4gIDwhLS0gL2tvIC0tPlxcbiAgPCEtLSBrbyBpZjogJGRhdGEuaXNSZXF1aXJlVGV4dEJlZm9yZVRpdGxlIC0tPlxcbiAgPHNwYW5cXG4gICAgZGF0YS1iaW5kPVxcXCJjc3M6IGtvQ3NzKCkucmVxdWlyZWRUZXh0IHx8IChrb0NzcygpLnBhbmVsICYmIGtvQ3NzKCkucGFuZWwucmVxdWlyZWRUZXh0KSwgdGV4dDogJGRhdGEucmVxdWlyZWRUZXh0LCBhdHRyOiB7ICdhcmlhLWhpZGRlbic6IHRydWUgfVxcXCJcXG4gID48L3NwYW4+XFxuICA8c3Bhbj4mbmJzcDwvc3Bhbj5cXG4gIDwhLS0gL2tvIC0tPlxcbiAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY1RpdGxlIH0gLS0+PCEtLSAva28gLS0+XFxuICA8IS0tIGtvIGlmOiAkZGF0YS5pc1JlcXVpcmVUZXh0QWZ0ZXJUaXRsZSAtLT5cXG4gIDxzcGFuPiZuYnNwPC9zcGFuPlxcbiAgPHNwYW5cXG4gICAgZGF0YS1iaW5kPVxcXCJjc3M6IGtvQ3NzKCkucmVxdWlyZWRUZXh0IHx8IChrb0NzcygpLnBhbmVsICYmIGtvQ3NzKCkucGFuZWwucmVxdWlyZWRUZXh0KSwgdGV4dDogJGRhdGEucmVxdWlyZWRUZXh0LCBhdHRyOiB7ICdhcmlhLWhpZGRlbic6IHRydWUgfVxcXCJcXG4gID48L3NwYW4+XFxuICA8IS0tIC9rbyAtLT5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcm93XFxcIj5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHJvdy5wYW5lbC5jc3NDbGFzc2VzLnJvd1xcXCI+XFxuICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogXFxcInN1cnZleS1yb3ctY29udGVudFxcXCIsIGFmdGVyUmVuZGVyOiByb3cucm93QWZ0ZXJSZW5kZXIgfSAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG48L3NjcmlwdD5cXG48c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1yb3ctY29udGVudFxcXCI+XFxuICA8IS0tIGtvIGlmOiByb3cuaXNOZWVkUmVuZGVyIC0tPlxcbiAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHJvdy5lbGVtZW50cywgYXM6ICdxdWVzdGlvbicgLCBhZnRlclJlbmRlcjogcm93LmtvQWZ0ZXJSZW5kZXIgfSAtLT5cXG4gIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmlzVmlzaWJsZSAtLT5cXG4gIDxkaXYgZGF0YS1iaW5kPVxcXCJzdHlsZTogeyBmbGV4QmFzaXM6IHJlbmRlcldpZHRoLCBmbGV4R3JvdzogMSwgZmxleFNocmluazogMSwgd2lkdGg6IHJlbmRlcldpZHRoLCBtaW5XaWR0aDogJGRhdGEubWluV2lkdGgsIG1heFdpZHRoOiAkZGF0YS5tYXhXaWR0aCB9XFxcIj5cXG4gICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogcm93LnBhbmVsLnN1cnZleS5nZXRFbGVtZW50V3JhcHBlckNvbXBvbmVudE5hbWUocXVlc3Rpb24pLCBwYXJhbXM6IHsgY29tcG9uZW50RGF0YTogIHJvdy5wYW5lbC5zdXJ2ZXkuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnREYXRhKHF1ZXN0aW9uKSwgdGVtcGxhdGVEYXRhOiB7IG5hbWU6IHF1ZXN0aW9uLmtvRWxlbWVudFR5cGUsIGRhdGE6IHF1ZXN0aW9uLCBhZnRlclJlbmRlcjogJHBhcmVudC5rb0VsZW1lbnRBZnRlclJlbmRlciB9IH0gfSAtLT5cXG4gICAgPCEtLSAva28gLS0+XFxuICA8L2Rpdj5cXG4gIDwhLS0gL2tvIC0tPlxcbiAgPCEtLSAva28gLS0+XFxuICA8IS0tIC9rbyAtLT5cXG48L3NjcmlwdD5cXG5cIjsiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcm93c1xcXCI+XFxuICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcm93cywgYXM6ICdyb3cnfSAtLT5cXG4gICAgPCEtLSBrbyBpZjogcm93LnZpc2libGUgLS0+XFxuICAgICAgPCEtLSBrbyBjb21wb25lbnQ6IHsgbmFtZTogJHBhcmVudC5zdXJ2ZXkuZ2V0Um93V3JhcHBlckNvbXBvbmVudE5hbWUocm93KSwgcGFyYW1zOiB7IGNvbXBvbmVudERhdGE6ICAkcGFyZW50LnN1cnZleS5nZXRSb3dXcmFwcGVyQ29tcG9uZW50RGF0YShyb3cpLCB0ZW1wbGF0ZURhdGE6IHsgbmFtZTogJ3N1cnZleS1yb3cnLCBkYXRhOiByb3cgfSB9IH0gLS0+XFxuICAgICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgPCEtLSAva28gLS0+XFxuPC9zY3JpcHQ+XCI7IiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXN0cmluZ1xcXCI+XFxuICAgIDwhLS0ga28gY29tcG9uZW50OiB7IG5hbWU6IHJlbmRlckFzLCBwYXJhbXM6IHsgbG9jU3RyaW5nOiAkZGF0YSB9IH0gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlxcblwiOyIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS10aW1lcnBhbmVsXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6a29UaW1lckluZm9UZXh0XFxcIj48L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjsiLCJpbXBvcnQgeyBJQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9ucy9hY3Rpb25cIjtcclxuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcclxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTGlzdE1vZGVsIGV4dGVuZHMgQmFzZSB7XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBmYWxzZSB9KSBpc0V4cGFuZGVkOiBib29sZWFuO1xyXG4gIEBwcm9wZXJ0eSgpIHNlbGVjdGVkSXRlbTogSUFjdGlvbjtcclxuICBwdWJsaWMgc3RhdGljIElOREVOVDogbnVtYmVyID0gMTY7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgaXRlbXM6IEFycmF5PElBY3Rpb24+LFxyXG4gICAgcHVibGljIG9uSXRlbVNlbGVjdDogKGl0ZW06IElBY3Rpb24pID0+IHZvaWQsXHJcbiAgICBwdWJsaWMgYWxsb3dTZWxlY3Rpb246IGJvb2xlYW4sXHJcbiAgICBzZWxlY3RlZEl0ZW0/OiBJQWN0aW9uXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcIml0ZW1zXCIpO1xyXG4gICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBzZWxlY3RlZEl0ZW07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IEFycmF5PElBY3Rpb24+IHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpdGVtc1wiKTtcclxuICB9XHJcbiAgcHVibGljIHNldCBpdGVtcyh2YWx1ZTogQXJyYXk8SUFjdGlvbj4pIHtcclxuICAgIHRoaXMuaXRlbXMuc3BsaWNlKDAsIHRoaXMuaXRlbXMubGVuZ3RoLCAuLi4odmFsdWUgfHwgW10pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RJdGVtID0gKGl0ZW1WYWx1ZTogSUFjdGlvbikgPT4ge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5hbGxvd1NlbGVjdGlvbikge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW1WYWx1ZTtcclxuICAgIH1cclxuICAgIGlmICghIXRoaXMub25JdGVtU2VsZWN0KSB7XHJcbiAgICAgIHRoaXMub25JdGVtU2VsZWN0KGl0ZW1WYWx1ZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGlzSXRlbURpc2FibGVkID0gKGl0ZW1WYWx1ZTogSUFjdGlvbikgPT4ge1xyXG4gICAgcmV0dXJuIGl0ZW1WYWx1ZS5lbmFibGVkICE9PSB1bmRlZmluZWQgJiYgIWl0ZW1WYWx1ZS5lbmFibGVkO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZCA9IChpdGVtVmFsdWU6IElBY3Rpb24pID0+IHtcclxuICAgIHJldHVybiB0aGlzLmFsbG93U2VsZWN0aW9uICYmIHRoaXMuc2VsZWN0ZWRJdGVtID09IGl0ZW1WYWx1ZTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgZ2V0SXRlbUNsYXNzID0gKGl0ZW1WYWx1ZTogSUFjdGlvbikgPT4ge1xyXG4gICAgdmFyIGNsYXNzTmFtZSA9IFwic3YtbGlzdF9faXRlbVwiO1xyXG4gICAgaWYgKHRoaXMuaXNJdGVtRGlzYWJsZWQoaXRlbVZhbHVlKSkge1xyXG4gICAgICBjbGFzc05hbWUgKz0gXCIgc3YtbGlzdF9faXRlbS0tZGlzYWJsZWRcIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW1WYWx1ZSkpIHtcclxuICAgICAgY2xhc3NOYW1lICs9IFwiIHN2LWxpc3RfX2l0ZW0tLXNlbGVjdGVkXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xhc3NOYW1lO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBnZXRJdGVtSW5kZW50ID0gKGl0ZW1WYWx1ZTogYW55KSA9PiB7XHJcbiAgICBjb25zdCBsZXZlbCA9IGl0ZW1WYWx1ZS5sZXZlbCB8fCAwO1xyXG4gICAgcmV0dXJuIChsZXZlbCArIDEpICogTGlzdE1vZGVsLklOREVOVCArIFwicHhcIjtcclxuICB9O1xyXG59XHJcbiIsImltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvY2FsaXphYmxlT3duZXIge1xuICBnZXRMb2NhbGUoKTogc3RyaW5nO1xuICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRSZW5kZXJlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIElMb2NhbGl6YWJsZVN0cmluZyB7XG4gIGdldExvY2FsZVRleHQobG9jOiBzdHJpbmcpOiBzdHJpbmc7XG4gIHNldExvY2FsZVRleHQobG9jOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpOiBhbnk7XG4gIGdldExvY2FsZXMoKTogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVGhlIGNsYXNzIHJlcHJlc2VudHMgdGhlIHN0cmluZyB0aGF0IHN1cHBvcnRzIG11bHRpLWxhbmd1YWdlcyBhbmQgbWFya2Rvd24uXG4gKiBJdCB1c2VzIGluIGFsbCBvYmplY3RzIHdoZXJlIHN1cHBvcnQgZm9yIG11bHRpLWxhbmd1YWdlcyBhbmQgbWFya2Rvd24gaXMgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbGl6YWJsZVN0cmluZyBpbXBsZW1lbnRzIElMb2NhbGl6YWJsZVN0cmluZyB7XG4gIHB1YmxpYyBzdGF0aWMgU2VyaWFsaXplQXNPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBkZWZhdWx0TG9jYWxlKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UmVuZGVyZXIgPSBcInN2LXN0cmluZy12aWV3ZXJcIjtcbiAgcHVibGljIHN0YXRpYyBlZGl0YWJsZVJlbmRlcmVyID0gXCJzdi1zdHJpbmctZWRpdG9yXCI7XG4gIHByaXZhdGUgdmFsdWVzID0ge307XG4gIHByaXZhdGUgaHRtbFZhbHVlcyA9IHt9O1xuICBwcml2YXRlIHJlbmRlcmVkVGV4dDogc3RyaW5nO1xuICBwcml2YXRlIGNhbGN1bGF0ZWRUZXh0VmFsdWU6IHN0cmluZztcbiAgcHVibGljIG9uR2V0VGV4dENhbGxiYWNrOiAoc3RyOiBzdHJpbmcpID0+IHN0cmluZztcbiAgcHVibGljIG9uU3RyQ2hhbmdlZDogKG9sZFZhbHVlOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHB1YmxpYyBvblNlYXJjaENoYW5nZWQ6ICgpID0+IHZvaWQ7XG4gIHB1YmxpYyBzaGFyZWREYXRhOiBMb2NhbGl6YWJsZVN0cmluZztcbiAgcHVibGljIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgcHVibGljIHNlYXJjaEluZGV4OiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvd25lcjogSUxvY2FsaXphYmxlT3duZXIsXG4gICAgcHVibGljIHVzZU1hcmtkb3duOiBib29sZWFuID0gZmFsc2UsXG4gICAgcHVibGljIG5hbWU/OiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXIgJiYgdGhpcy5vd25lci5nZXRMb2NhbGUgPyB0aGlzLm93bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgc3RyQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnNlYXJjaGFibGVUZXh0ID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnJlbmRlcmVkVGV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5jYWxjdWxhdGVkVGV4dFZhbHVlID0gdGhpcy5jYWxUZXh0KCk7XG4gICAgaWYgKHRoaXMucmVuZGVyZWRUZXh0ICE9PSB0aGlzLmNhbGN1bGF0ZWRUZXh0VmFsdWUpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRUZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jYWxjdWxhdGVkVGV4dFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnB1cmVUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgY2FsY3VsYXRlZFRleHQoKTogc3RyaW5nIHtcbiAgICB0aGlzLnJlbmRlcmVkVGV4dCA9XG4gICAgICB0aGlzLmNhbGN1bGF0ZWRUZXh0VmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuY2FsY3VsYXRlZFRleHRWYWx1ZVxuICAgICAgICA6IHRoaXMuY2FsVGV4dCgpO1xuICAgIHRoaXMuY2FsY3VsYXRlZFRleHRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFRleHQ7XG4gIH1cbiAgcHJpdmF0ZSBjYWxUZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMucHVyZVRleHQ7XG4gICAgaWYgKFxuICAgICAgcmVzICYmXG4gICAgICB0aGlzLm93bmVyICYmXG4gICAgICB0aGlzLm93bmVyLmdldFByb2Nlc3NlZFRleHQgJiZcbiAgICAgIHJlcy5pbmRleE9mKFwie1wiKSA+IC0xXG4gICAgKSB7XG4gICAgICByZXMgPSB0aGlzLm93bmVyLmdldFByb2Nlc3NlZFRleHQocmVzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub25HZXRUZXh0Q2FsbGJhY2spIHJlcyA9IHRoaXMub25HZXRUZXh0Q2FsbGJhY2socmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgcHVyZVRleHQoKSB7XG4gICAgdmFyIGxvYyA9IHRoaXMubG9jYWxlO1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZShsb2MpO1xuICAgIGlmICghcmVzICYmIGxvYyA9PSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSkge1xuICAgICAgcmVzID0gdGhpcy5nZXRWYWx1ZShzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZSk7XG4gICAgfVxuICAgIGlmICghcmVzICYmIGxvYyAhPT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpIHtcbiAgICAgIHJlcyA9IHRoaXMuZ2V0VmFsdWUoc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpO1xuICAgIH1cbiAgICBpZiAoIXJlcykgcmVzID0gXCJcIjtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzSHRtbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNIdG1sVmFsdWUoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGh0bWwoKSB7XG4gICAgaWYgKCF0aGlzLmhhc0h0bWwpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiB0aGlzLmdldEh0bWxWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZXNLZXlzKCkubGVuZ3RoID09IDA7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0T3JIdG1sKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0h0bWwgPyB0aGlzLmdldEh0bWxWYWx1ZSgpIDogdGhpcy5jYWxjdWxhdGVkVGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlbmRlcmVkSHRtbCgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0T3JIdG1sO1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGVUZXh0KHRoaXMubG9jYWxlLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldExvY2FsZVRleHQobG9jOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZShsb2MpO1xuICAgIHJldHVybiByZXMgPyByZXMgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzZXRMb2NhbGVUZXh0KGxvYzogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09IHRoaXMuZ2V0TG9jYWxlVGV4dChsb2MpKSByZXR1cm47XG4gICAgaWYgKFxuICAgICAgdmFsdWUgJiZcbiAgICAgIGxvYyAmJlxuICAgICAgbG9jICE9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lICYmXG4gICAgICAhdGhpcy5nZXRWYWx1ZShsb2MpICYmXG4gICAgICB2YWx1ZSA9PSB0aGlzLmdldExvY2FsZVRleHQoc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBjdXJMb2MgPSB0aGlzLmxvY2FsZTtcbiAgICBpZiAoIWxvYykgbG9jID0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gICAgaWYgKCFjdXJMb2MpIGN1ckxvYyA9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lO1xuICAgIHZhciBoYXNPblN0ckNoYW5nZWQgPSB0aGlzLm9uU3RyQ2hhbmdlZCAmJiBsb2MgPT09IGN1ckxvYztcbiAgICB2YXIgb2xkVmFsdWUgPSBoYXNPblN0ckNoYW5nZWQgPyB0aGlzLnB1cmVUZXh0IDogdW5kZWZpbmVkO1xuXG4gICAgZGVsZXRlICg8YW55PnRoaXMpLmh0bWxWYWx1ZXNbbG9jXTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5nZXRWYWx1ZShsb2MpKSB0aGlzLmRlbGV0ZVZhbHVlKGxvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGxvYyAhPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSAmJlxuICAgICAgICAgIHZhbHVlID09IHRoaXMuZ2V0TG9jYWxlVGV4dChzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zZXRMb2NhbGVUZXh0KGxvYywgbnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZShsb2MsIHZhbHVlKTtcbiAgICAgICAgICBpZiAobG9jID09IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZVZhbHVlc0VxdWFsc1RvRGVmYXVsdCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RyQ2hhbmdlZCgpO1xuICAgIGlmIChoYXNPblN0ckNoYW5nZWQpIHtcbiAgICAgIHRoaXMub25TdHJDaGFuZ2VkKG9sZFZhbHVlLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBoYXNOb25EZWZhdWx0VGV4dCgpOiBib29sZWFuIHtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGtleXMubGVuZ3RoID4gMSB8fCBrZXlzWzBdICE9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBrZXlzID0gdGhpcy5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4ga2V5cztcbiAgfVxuICBwdWJsaWMgZ2V0SnNvbigpOiBhbnkge1xuICAgIGlmICghIXRoaXMuc2hhcmVkRGF0YSkgcmV0dXJuIHRoaXMuc2hhcmVkRGF0YS5nZXRKc29uKCk7XG4gICAgdmFyIGtleXMgPSB0aGlzLmdldFZhbHVlc0tleXMoKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKFxuICAgICAga2V5cy5sZW5ndGggPT0gMSAmJlxuICAgICAga2V5c1swXSA9PSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSAmJlxuICAgICAgIXNldHRpbmdzLnNlcmlhbGl6ZUxvY2FsaXphYmxlU3RyaW5nQXNPYmplY3RcbiAgICApXG4gICAgICByZXR1cm4gKDxhbnk+dGhpcykudmFsdWVzW2tleXNbMF1dO1xuICAgIHJldHVybiB0aGlzLnZhbHVlcztcbiAgfVxuICBwdWJsaWMgc2V0SnNvbih2YWx1ZTogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5zaGFyZWREYXRhKSB7XG4gICAgICB0aGlzLnNoYXJlZERhdGEuc2V0SnNvbih2YWx1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgdGhpcy5odG1sVmFsdWVzID0ge307XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuc2V0TG9jYWxlVGV4dChudWxsLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldExvY2FsZVRleHQoa2V5LCB2YWx1ZVtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdHJDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJBcygpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5vd25lcikge1xuICAgICAgcmV0dXJuIExvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRSZW5kZXJlcjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLm93bmVyLmdldFJlbmRlcmVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0UmVuZGVyZXI7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm93bmVyLmdldFJlbmRlcmVyKHRoaXMubmFtZSkgfHwgTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdFJlbmRlcmVyXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZXF1YWxzKG9iajogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCEhdGhpcy5zaGFyZWREYXRhKSByZXR1cm4gdGhpcy5zaGFyZWREYXRhLmVxdWFscyhvYmopO1xuICAgIGlmICghb2JqIHx8ICFvYmoudmFsdWVzKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLnZhbHVlcywgb2JqLnZhbHVlcyk7XG4gIH1cbiAgcHJpdmF0ZSBzZWFyY2hhYmxlVGV4dDogc3RyaW5nO1xuICBwdWJsaWMgc2V0RmluZFRleHQodGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dCA9PSB0ZXh0KSByZXR1cm47XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gdGV4dDtcbiAgICBpZiAoIXRoaXMuc2VhcmNoYWJsZVRleHQpIHtcbiAgICAgIGxldCB0ZXh0T3JIdG1sID0gdGhpcy50ZXh0T3JIdG1sO1xuICAgICAgdGhpcy5zZWFyY2hhYmxlVGV4dCA9ICEhdGV4dE9ySHRtbCA/IHRleHRPckh0bWwudG9Mb3dlckNhc2UoKSA6IFwiXCI7XG4gICAgfVxuICAgIHZhciBzdHIgPSB0aGlzLnNlYXJjaGFibGVUZXh0O1xuICAgIHZhciBpbmRleCA9ICEhc3RyICYmICEhdGV4dCA/IHN0ci5pbmRleE9mKHRleHQpIDogdW5kZWZpbmVkO1xuICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gdW5kZWZpbmVkO1xuICAgIGlmIChpbmRleCAhPSB1bmRlZmluZWQgfHwgdGhpcy5zZWFyY2hJbmRleCAhPSBpbmRleCkge1xuICAgICAgdGhpcy5zZWFyY2hJbmRleCA9IGluZGV4O1xuICAgICAgaWYgKCEhdGhpcy5vblNlYXJjaENoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5vblNlYXJjaENoYW5nZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoSW5kZXggIT0gdW5kZWZpbmVkO1xuICB9XG4gIHB1YmxpYyBvbkNoYW5nZWQoKSB7fVxuICBwcm90ZWN0ZWQgb25DcmVhdGluZygpIHt9XG4gIHByaXZhdGUgaGFzSHRtbFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5vd25lciB8fCAhdGhpcy51c2VNYXJrZG93bikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByZW5kZXJlZFRleHQgPSB0aGlzLmNhbGN1bGF0ZWRUZXh0O1xuICAgIGlmICghcmVuZGVyZWRUZXh0KSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGxvYyA9IHRoaXMubG9jYWxlO1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICAoPGFueT50aGlzKS5odG1sVmFsdWVzW2xvY10gPSB0aGlzLm93bmVyLmdldE1hcmtkb3duSHRtbChcbiAgICAgIHJlbmRlcmVkVGV4dCxcbiAgICAgIHRoaXMubmFtZVxuICAgICk7XG4gICAgcmV0dXJuICg8YW55PnRoaXMpLmh0bWxWYWx1ZXNbbG9jXSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0SHRtbFZhbHVlKCk6IHN0cmluZyB7XG4gICAgdmFyIGxvYyA9IHRoaXMubG9jYWxlO1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICByZXR1cm4gKDxhbnk+dGhpcykuaHRtbFZhbHVlc1tsb2NdO1xuICB9XG4gIHByaXZhdGUgZGVsZXRlVmFsdWVzRXF1YWxzVG9EZWZhdWx0KGRlZmF1bHRWYWx1ZTogc3RyaW5nKSB7XG4gICAgdmFyIGtleXMgPSB0aGlzLmdldFZhbHVlc0tleXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChrZXlzW2ldID09IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLmdldFZhbHVlKGtleXNbaV0pID09IGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICB0aGlzLmRlbGV0ZVZhbHVlKGtleXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFZhbHVlKGxvYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnNoYXJlZERhdGEpIHJldHVybiB0aGlzLnNoYXJlZERhdGEuZ2V0VmFsdWUobG9jKTtcbiAgICByZXR1cm4gKDxhbnk+dGhpcykudmFsdWVzW2xvY107XG4gIH1cbiAgcHJpdmF0ZSBzZXRWYWx1ZShsb2M6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGlmICghIXRoaXMuc2hhcmVkRGF0YSkgdGhpcy5zaGFyZWREYXRhLnNldFZhbHVlKGxvYywgdmFsdWUpO1xuICAgIGVsc2UgKDxhbnk+dGhpcykudmFsdWVzW2xvY10gPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIGRlbGV0ZVZhbHVlKGxvYzogc3RyaW5nKSB7XG4gICAgaWYgKCEhdGhpcy5zaGFyZWREYXRhKSB0aGlzLnNoYXJlZERhdGEuZGVsZXRlVmFsdWUobG9jKTtcbiAgICBlbHNlIGRlbGV0ZSAoPGFueT50aGlzKS52YWx1ZXNbbG9jXTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlc0tleXMoKTogc3RyaW5nW10ge1xuICAgIGlmICghIXRoaXMuc2hhcmVkRGF0YSkgcmV0dXJuIHRoaXMuc2hhcmVkRGF0YS5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKTtcbiAgfVxufVxuLyoqXG4gKiBUaGUgY2xhc3MgcmVwcmVzZW50cyB0aGUgbGlzdCBvZiBzdHJpbmdzIHRoYXQgc3VwcG9ydHMgbXVsdGktbGFuZ3VhZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxpemFibGVTdHJpbmdzIGltcGxlbWVudHMgSUxvY2FsaXphYmxlU3RyaW5nIHtcbiAgcHJpdmF0ZSB2YWx1ZXM6IGFueSA9IHt9O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgb3duZXI6IElMb2NhbGl6YWJsZU93bmVyKSB7fVxuICBwdWJsaWMgZ2V0IGxvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vd25lciAmJiB0aGlzLm93bmVyLmdldExvY2FsZSA/IHRoaXMub3duZXIuZ2V0TG9jYWxlKCkgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWw6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLnNldFZhbHVlKFwiXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlLmpvaW4oXCJcXG5cIikgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSAhIXZhbCA/IHZhbC5zcGxpdChcIlxcblwiKSA6IFtdO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGVUZXh0KGxvYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZUNvcmUobG9jLCAhbG9jIHx8IGxvYyA9PT0gdGhpcy5sb2NhbGUpO1xuICAgIGlmICghcmVzIHx8ICFBcnJheS5pc0FycmF5KHJlcykgfHwgcmVzLmxlbmd0aCA9PSAwKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gcmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcHVibGljIHNldExvY2FsZVRleHQobG9jOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpOiBhbnkge1xuICAgIHZhciB2YWwgPSAhIW5ld1ZhbHVlID8gbmV3VmFsdWUuc3BsaXQoXCJcXG5cIikgOiBudWxsO1xuICAgIHRoaXMuc2V0VmFsdWUobG9jLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZShsb2M6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlQ29yZShsb2MpO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVDb3JlKGxvYzogc3RyaW5nLCB1c2VEZWZhdWx0OiBib29sZWFuID0gdHJ1ZSk6IEFycmF5PHN0cmluZz4ge1xuICAgIGxvYyA9IHRoaXMuZ2V0TG9jYWxlKGxvYyk7XG4gICAgaWYgKHRoaXMudmFsdWVzW2xvY10pIHJldHVybiB0aGlzLnZhbHVlc1tsb2NdO1xuICAgIGlmICh1c2VEZWZhdWx0KSB7XG4gICAgICB2YXIgZGVmTG9jID0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gICAgICBpZiAobG9jICE9PSBkZWZMb2MpIHJldHVybiB0aGlzLnZhbHVlc1tkZWZMb2NdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIHNldFZhbHVlKGxvYzogc3RyaW5nLCB2YWw6IEFycmF5PHN0cmluZz4pIHtcbiAgICBsb2MgPSB0aGlzLmdldExvY2FsZShsb2MpO1xuICAgIGlmICghdmFsIHx8IHZhbC5sZW5ndGggPT0gMCkge1xuICAgICAgZGVsZXRlIHRoaXMudmFsdWVzW2xvY107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVzW2xvY10gPSB2YWw7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZXNLZXlzKCkubGVuZ3RoID09IDA7XG4gIH1cbiAgcHJpdmF0ZSBnZXRMb2NhbGUobG9jOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghIWxvYykgcmV0dXJuIGxvYztcbiAgICBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICByZXR1cm4gISFsb2MgPyBsb2MgOiBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGtleXM7XG4gIH1cbiAgcHVibGljIGdldEpzb24oKTogYW55IHtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoXG4gICAgICBrZXlzLmxlbmd0aCA9PSAxICYmXG4gICAgICBrZXlzWzBdID09IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lICYmXG4gICAgICAhc2V0dGluZ3Muc2VyaWFsaXplTG9jYWxpemFibGVTdHJpbmdBc09iamVjdFxuICAgIClcbiAgICAgIHJldHVybiAoPGFueT50aGlzKS52YWx1ZXNba2V5c1swXV07XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzO1xuICB9XG4gIHB1YmxpYyBzZXRKc29uKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlcyA9IHt9O1xuICAgIGlmICghdmFsdWUpIHJldHVybjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUobnVsbCwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZShrZXksIHZhbHVlW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFZhbHVlc0tleXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgYXJhYmljU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItin2YTYs9in2KjZglwiLFxuICBwYWdlTmV4dFRleHQ6IFwi2KfZhNiq2KfZhNmKXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLYpdix2LPYp9mEINin2YTYqNmK2KfZhtin2KpcIixcbiAgcHJldmlld1RleHQ6IFwi2YXYudin2YrZhtipXCIsXG4gIGVkaXRUZXh0OiBcItiq2LnYr9mK2YRcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcItio2K/Yp9mK2KlcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLZhti1INii2K7YsVwiLFxuICBub25lSXRlbVRleHQ6IFwi2YTYpyDYtNmK2KFcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwi2KfYrtiq2LEg2KfZhNmD2YRcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcInsxfSDYtdmB2K3YqSB7MH0g2YXZhlwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwi2LPYrNmEIHswfSDZhdmGIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwi2KrZhdiqINin2YTYpdis2KfYqNipINi52YTZiSDYo9iz2KbZhNipIHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCLZhNinINiq2YjYrNivINi12YHYrdipINmF2LHYptmK2Kkg2KPZiCDYs9ik2KfZhCDZgdmKINin2YTZhtmF2YjYsNisXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi2LTZg9ix2Kcg2YTZg9mFINmE2KfYs9iq2YPZhdin2YQg2KfZhNmG2YXZiNiw2KwhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLYqti42YfYsSDYs9is2YTYp9iq2YbYpyDYo9mG2YMg2YLYryDYo9mD2YXZhNiqINmH2LDYpyDYp9mE2KfYs9iq2LfZhNin2Lkg2KjYp9mE2YHYudmELlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIi4uLtmK2KrZhSDYqtit2YXZitmEINin2YTZhtmF2YjYsNisXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIi4uLtin2K7YqtixXCIsXG4gIHZhbHVlOiBcItin2YTZgtmK2YXYqVwiLFxuICByZXF1aXJlZEVycm9yOiBcIi7Zitix2KzZiSDYp9mE2KXYrNin2KjYqSDYudmE2Ykg2KfZhNiz2KTYp9mEXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcItin2YTYsdis2KfYoSDYp9mE2KXYrNin2KjYqSDYudmE2Ykg2LPYpNin2YQg2YjYp9it2K8g2LnZhNmJINin2YTYo9mC2YQuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi2YrYsdis2Ykg2KfZhNil2KzYp9io2Kkg2LnZhNmJINin2YTYo9iz2KbZhNipINmB2Yog2KzZhdmK2Lkg2KfZhNi12YHZiNmBXCIsXG4gIG51bWVyaWNFcnJvcjogXCLZitis2Kgg2KPZhiDYqtmD2YjZhiDYp9mE2YLZitmF2Kkg2LHZgtmF2YrYqS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLYp9mE2LHYrNin2KEg2KXYr9iu2KfZhCDZhdinINmE2Kcg2YrZgtmEINi52YYgezB9INit2LHZiNmBXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi2KfZhNix2KzYp9ihINil2K/Yrtin2YQg2KPZgtmEINmF2YYgezB9INit2LHZiNmBXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi2YrYsdis2Ykg2KXYr9iu2KfZhCDYo9mD2KvYsSDZhdmGIHswfSDZiNij2YLZhCDZhdmGIHsxfSDYrdix2YjZgVwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItmK2LHYrNmJINmF2YTYoSDZhdinINmE2Kcg2YrZgtmEINi52YYgezB9INin2YTYtdmB2YjZgVwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLZitix2KzZiSDYqtit2K/ZitivINmF2Kcg2YTYpyDZitmC2YQg2LnZhiB7MH0g2KfZhNmF2KrYutmK2LHYp9iqXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcItmK2LHYrNmJINiq2K3Yr9mK2K8g2YXYpyDZhNinINmK2LLZitivINi52YYgezB9INin2YTZhdiq2LrZitix2KfYqlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwi2YgnezB9JyDZitis2Kgg2KPZhiDYqtmD2YjZhiDZhdiz2KfZiNmK2Kkg2KPZiCDYo9mD2KvYsSDZhdmGIHsxfSDZiNiq2LPYp9mI2Yog2KPZiCDYo9mC2YQg2YXZhiB7Mn3Yp1wiLFxuICBudW1lcmljTWluOiBcItmIJ3swfScg2YrYrNioINij2YYg2KrZg9mI2YYg2YXYs9in2YjZitipINij2Ygg2KPZg9ir2LEg2YXZhiB7MX3Yp1wiLFxuICBudW1lcmljTWF4OiBcItmIJ3swfScg2YrYrNioINij2YYg2KrZg9mI2YYg2YXYs9in2YjZitipINij2Ygg2KPZgtmEINmF2YYgezF92KdcIixcbiAgaW52YWxpZEVtYWlsOiBcItin2YTYsdis2KfYoSDYpdiv2K7Yp9mEINio2LHZitivINin2YTZg9iq2LHZiNmG2Yog2LXYrdmK2K1cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi2YrYrNioINij2YYg2YrYudix2LYg2KfZhNiq2LnYqNmK2LE6IHswfSAn2LXZiNin2KgnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi2LfZhNioINil2LHYrNin2Lkg2K7Yt9ijICd7MH0nLiB7MX3Yp1wiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwi2LnYp9ivINi32YTYqCDYp9mE2KjZitin2YbYp9iqINmB2KfYsdi6INij2YggJ9in2YTZhdiz2KfYsScg2LrZitixINi12K3ZititIFwiLFxuICBleGNlZWRNYXhTaXplOiBcItmK2YbYqNi62Yog2KPZhNinINmK2KrYrNin2YjYsiDYrdis2YUg2KfZhNmF2YTZgSB7MH3Yp1wiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi2KfZhNix2KzYp9ihINil2K/Yrtin2YQg2YLZitmF2Kkg2KPYrtix2YlcIixcbiAgdXBsb2FkaW5nRmlsZTogXCLYqtit2YXZitmEINin2YTZhdmE2YEg2KfZhNiu2KfYtSDYqNmDLiDZitix2KzZiSDYp9mE2KfZhtiq2LjYp9ixINi52K/YqSDYq9mI2KfZhiDZiNin2YTZhdit2KfZiNmE2Kkg2YTYp9it2YLZi9inXCIsXG4gIGxvYWRpbmdGaWxlOiBcItis2KfYsSDYp9mE2KrYrdmF2YrZhC4uLlwiLFxuICBjaG9vc2VGaWxlOiBcItin2K7YqtixINin2YTZhdmE2YHYp9iqLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLZhNmFINiq2YLZhSDYqNin2K7YqtmK2KfYsSDZhdmE2YFcIixcbiAgY29uZmlybURlbGV0ZTogXCLZh9mEINiq2LHZitivINit2LDZgSDYp9mE2LPYrNmE2J9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLZitis2Kgg2KPZhiDYqtmD2YjZhiDZh9iw2Ycg2KfZhNmC2YrZhdipINmB2LHZitiv2KkuXCIsXG4gIGFkZENvbHVtbjogXCLYo9i22YEg2KfZhNi52YXZiNivXCIsXG4gIGFkZFJvdzogXCLYp9i22KfZgdipINi12YFcIixcbiAgcmVtb3ZlUm93OiBcItil2LLYp9mE2Kkg2LXZgVwiLFxuICBhZGRQYW5lbDogXCLYp9i22YEg2KzYr9mK2K9cIixcbiAgcmVtb3ZlUGFuZWw6IFwi2KXYstin2YTYqVwiLFxuICBjaG9pY2VzX0l0ZW06IFwi2KjZhtivXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi2LnZhdmI2K9cIixcbiAgbWF0cml4X3JvdzogXCLYtdmBXCIsXG4gIHNhdmluZ0RhdGE6IFwi2YrYqtmFINit2YHYuCDYp9mE2YbYqtin2KbYrCDYudmE2Ykg2KfZhNiu2KfYr9mFIC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi2K3Yr9irINiu2LfYoyDZiNmE2YUg2YbYqtmF2YPZhiDZhdmGINit2YHYuCDYp9mE2YbYqtin2KbYrC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi2KrZhSDYrdmB2Lgg2KfZhNmG2KrYp9im2Kwg2KjZhtis2KfYrSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcItit2KfZiNmEINmF2KzYr9iv2KdcIixcbiAgdGltZXJNaW46IFwi2K/ZgtmK2YLYqVwiLFxuICB0aW1lclNlYzogXCLYq9in2YbZitipXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwi2YTZgtivINij2YbZgdmC2KogezB9INi52YTZiSDZh9iw2Ycg2KfZhNi12YHYrdipINmIIHsxfSDYpdis2YXYp9mE2KfZiy5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi2YTZgtivINij2YbZgdmC2KogezB9INi52YTZiSDZh9iw2Ycg2KfZhNi12YHYrdipLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcItmE2YLYryDYo9mG2YHZgtiqIHswfSDYpdis2YXYp9mE2KfZiy5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcItmE2YLYryDYo9mG2YHZgtiqIHswfSDZhdmGIHsxfSDZgdmKINmH2LDZhyDYp9mE2LXZgdit2Kkg2YggezJ9INmF2YYg2KXYrNmF2KfZhNmKIHszfS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi2YTZgtivINij2YbZgdmC2KogezB9INmF2YYgezF9INmB2Yog2YfYsNmHINin2YTYtdmB2K3YqS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLZhNmC2K8g2KPZhtmB2YLYqiB7MH0g2YXZhiDYpdis2YXYp9mE2YogezF9LlwiLFxuICBjbGVhbkNhcHRpb246IFwi2YbYuNmK2YFcIixcbiAgY2xlYXJDYXB0aW9uOiBcItmI2KfYttitXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcItin2K7YqtixINmF2YTZgVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLZgtmFINio2KXYstin2YTYqSDZh9iw2Kcg2KfZhNmF2YTZgVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcItmG2LnZhVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwi2YTYp1wiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLZh9mEINij2YbYqiDZhdiq2KPZg9ivINij2YbZgyDYqtix2YrYryDYpdiy2KfZhNipINmH2LDYpyDYp9mE2YXZhNmBOiB7MH3Yn1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwi2YfZhCDYo9mG2Kog2YXYqtij2YPYryDYo9mG2YMg2KrYsdmK2K8g2KXYstin2YTYqSDZg9in2YHYqSDYp9mE2YXZhNmB2KfYqtifXCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLYudmG2YjYp9mGINin2YTYs9ik2KfZhFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJhclwiXSA9IGFyYWJpY1N1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJhclwiXSA9IFwi2KfZhNi52LHYqNmK2KlcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgYmFzcXVlU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkF1cnJla29hXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJIdXJyZW5nb2FcIixcbiAgY29tcGxldGVUZXh0OiBcIkJ1a2F0dVwiLFxuICBwcmV2aWV3VGV4dDogXCJBdXJyZWJpc3RhXCIsXG4gIGVkaXRUZXh0OiBcIkVkaXRhdHVcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkhhc2lcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJCZXN0ZSBiYXQgKHplaGF6dHUpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJCYXQgZXJlIGV6XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIkd1enRpYSBoYXV0YXR1XCIsXG4gIHByb2dyZXNzVGV4dDogXCJ7MX0tKGUpdGlrIHswfSBvcnJpYWxkZVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiezB9IGVycmlnaXN0cm8gezF9LShlKXRpa1wiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiRXJhbnR6dW5kYWtvIGdhbGRlcmFrIHswfS97MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiRXogZGFnbyBvcnJpYWxkZSBiaXN0YXJhZ2FycmlyaWsgZWRvIGV6IGRhZ28gZ2FsZGVyYXJpay5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJFc2tlcnJpayBhc2tvIGdhbGRldGVnaWEgZXJhbnR6dXRlYWdhdGlrIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIkd1cmUgZGF0dWVrIGRpb3RlIGRhZ29lbmVrbyBnYWxkZXRlZ2lhIGVyYW50enVuIGR1enVsYS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJHYWxkZXRlZ2lhIGthcmdhdHplbi4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJIYXV0YXR1Li4uXCIsXG4gIHZhbHVlOiBcImJhbGlvYVwiLFxuICByZXF1aXJlZEVycm9yOiBcIk1lc2VkZXosIGdhbGRlcmEgZXJhbnR6dW4uXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIk1lc2VkZXosIGd1dHhpZW5leiBnYWxkZXJhIGJhdCBlcmFudHp1bi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJNZXNlZGV6LCBlcnJlbmthZGFrbyBnYWxkZXJhIGd1enRpYWsgZXJhbnR6dW4uXCIsXG4gIG51bWVyaWNFcnJvcjogXCJFc3RpbWF6aW9hIHplbmJha2l6a29hIGl6YW4gYmVoYXIgZHUuXCIsXG4gIG1pbkVycm9yOiBcIkJhbGlvYSBleiBkYSB7MH0gYmFpbm8gdHhpa2lhZ29hIGl6YW4gYmVoYXJcIixcbiAgbWF4RXJyb3I6IFwiQmFsaW9hIGV6IGRhIHswfSBiYWlubyBoYW5kaWFnb2EgaXphbiBiZWhhclwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIk1lc2VkZXosIGd1dHhpZW5leiB7MH0ga2FyYWt0ZXJlIGVyYWJpbGkgYmVoYXIgZGlyYS5cIixcbiAgdGV4dE1heExlbmd0aDogXCJNZXNlZGV6LCBnZWhpZW5leiB7MH0ga2FyYWt0ZXJlIGVyYWJpbGkgYmVoYXIgZGlyYS5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJNZXNlZGV6LCBnZWhpZW5leiB7MH0gZXRhIGd1dHhpZW5leiB7MX0ga2FyYWt0ZXJlIGVyYWJpbGkgYmVoYXIgZGlyYS5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJNZXNlZGV6LCBndXR4aWVuZXogezB9IGVycmVua2FkYSBiZXRlLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJNZXNlZGV6LCBndXR4aWVuZXogezB9IGF1a2VyYSBoYXV0YXR1LlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJNZXNlZGV6LCB7MH0gYXVrZXJhIGJhaW5vIGdlaGlhZ28gZXogaGF1dGF0dS5cIixcbiAgbnVtZXJpY01pbk1heDogXCJFbCAnezB9JyBkZWJlIGRlIHNlciBpZ3VhbCBvIG3DoXMgZGUgezF9IHkgaWd1YWwgbyBtZW5vcyBkZSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyB7MX0gYmFpbm8gaGFuZGlhZ29hIGVkbyBiZXJkaW4gaXphbiBiZWhhciBkYVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIHsxfSBiYWlubyB0eGlraWFnbyBlZG8gYmVyZGluIGl6YW4gYmVoYXIgZGFcIixcbiAgaW52YWxpZEVtYWlsOiBcIk1lc2VkZXosIGJhbGlvemtvIGVtYWlsYSBpZGF0eiBlemF6dS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiezB9IGFkaWVyYXpwZW5hayAnZWdpYXprb2EnIGl0enVsaSBiZWhhcmtvIGx1a2UuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJFc2thZXJhayAnezB9JyBlcnJvcmVhIGl0enVsaSBkdS4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCJMYSBzb2xpY2l0dWQgcmVncmVzw7MgdmFjw61vIGRlIGRhdGEgbyBsYSBwcm9waWVkYWQgJ3RyYXllY3RvcmlhJyBubyBlcyBjb3JyZWN0YVwiLFxuICBleGNlZWRNYXhTaXplOiBcIkZpdHhhdGVnaWFyZW4gdGFtYWluYSBleiBkYSB7MH0gYmFpbm8gaGFuZGlhZ29hIGl6YW4gYmVoYXIuXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJNZXNlZGV6LCBiZXN0ZSBlc3RpbWF6aW9hIGdlaGl0dS5cIixcbiAgdXBsb2FkaW5nRmlsZTogXCJadXJlIGZpdHhhdGVnaWEgaWdvdHplbiBhcmkgZGEuIE1lc2VkZXosIHNlZ3VuZG8gYmF0enVrIGl0eGFyb24gZXRhIHNhaWF0dSBiZXJyaXJvLlwiLFxuICBsb2FkaW5nRmlsZTogXCJLYXJnYXR6ZW4uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJGaXR4YXRlZ2lhKGspIGhhdXRhdHUuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkV6IGRhIGlub2xha28gZml0eGF0ZWdpcmlrIGhhdXRhdHVcIixcbiAgY29uZmlybURlbGV0ZTogXCLCv0VycmVnaXN0cm9hIGJvcnJhdHUgbmFoaSBhbCBkdXp1P1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkJhbGlvIGhhdSBiYWthcnJhIGl6YW4gYmVoYXIgZHUuXCIsXG4gIGFkZENvbHVtbjogXCJadXRhYmUgYmF0IGdlaGl0dVwiLFxuICBhZGRSb3c6IFwiRXJyZW5rYWRhIGJhdCBnZWhpdHVcIixcbiAgcmVtb3ZlUm93OiBcIkVycmVua2FkYSBiYXQga2VuZHVcIixcbiAgZW1wdHlSb3dzVGV4dDogXCJFeiBkYWdvIGVycmVua2FkYXJpay5cIixcbiAgYWRkUGFuZWw6IFwiQmVycmlhIGdlaGl0dVwiLFxuICByZW1vdmVQYW5lbDogXCJLZW5kdVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiYXJ0aWt1bHVhXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiWnV0YWJlYVwiLFxuICBtYXRyaXhfcm93OiBcIkVycmVua2FkYVwiLFxuICBtdWx0aXBsZXRleHRfaXRlbW5hbWU6IFwidGVzdHVhXCIsXG4gIHNhdmluZ0RhdGE6IFwiRXJhbnR6dW5hayB6ZXJiaXR6YXJpYW4gZ29yZGV0emVuIGFyaSBkaXJhLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJFcnJvcmVyZW4gYmF0IGdlcnRhdHUgZXRhIGVyYW50enVuYWsgZXogZGlyYSB6ZXJiaXR6YXJpYW4gZ29yZGUgYWhhbCBpemFuLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJFcmFudHp1bmFrIGVnb2tpIGdvcmRlIGRpcmEhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJCZXJyaXJvIHNhaWF0dS5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlZ1wiLFxuICB0aW1lclNwZW50QWxsOiBcInswfSBlcmFiaWxpIGR1enUgb3JyaWFsZGUgaG9uZXRhbiBldGEgb3JvdGFyYSB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlp1ayB7MH0gZXJhYmlsaSBkdXp1LlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIk9yb3RhcmEgZ2FzdGF0dSBkdXp1LlwiLFxuICB0aW1lckxpbWl0QWxsOiBcInswfSBnYXN0YXR1IGR1enUgezF9LShlKXRpayBvcnJpYWxkZSBob25ldGFuIGV0YSBvcm90YXJhIHsyfSB7M30tKGUpdGlrLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJ7MH0gZ2FzdGF0dSBkdXp1IG9ycmlhbGRlIGhvbmV0YW4gezF9LShlKXRpay5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJadWsgb3JvdGFyYSB7MH0gZ2FzdGF0dSBkdXp1IHsxfS0oZSl0aWsuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJHYXJiaXR1XCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJIdXN0dVwiLFxuICBzaWduYXR1cmVQbGFjZUhvbGRlcjogXCJTaW5hdHUgaGVtZW5cIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiRml0eGF0ZWdpYSBoYXV0YXR1XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkZpdHhhdGVnaSBoYXUgZXphYmF0dVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkJhaVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiRXpcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiWml1ciB6YXVkZSBodXJyZW5nbyBmaXR4YXRlZ2lhIGV6YWJhdHUgbmFoaSBkdXp1bGE6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIlppdXIgYWwgemF1ZGUgZml0eGF0ZWdpIGd1enRpYWsgZXphYmF0dSBuYWhpIGRpdHV6dWxhP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiR2FsZGVyYXJlbiBpemVuYnVydWFcIixcbiAgbW9kYWxDYW5jZWxCdXR0b25UZXh0OiBcIkV6ZXp0YXR1XCIsXG4gIG1vZGFsQXBwbHlCdXR0b25UZXh0OiBcIkV6YXJyaVwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJldVwiXSA9IGJhc3F1ZVN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJldVwiXSA9IFwiRXVza2FyYVwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBidWxnYXJpYW5TdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi0J3QsNC30LDQtFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi0J3QsNC/0YDQtdC0XCIsXG4gIGNvbXBsZXRlVGV4dDogXCLQmtGA0LDQuVwiLFxuICBwcmV2aWV3VGV4dDogXCLQktC40LfRg9Cw0LvQuNC30LDRhtC40Y9cIixcbiAgZWRpdFRleHQ6IFwi0YDQtdC00LDQutGC0LjRgNCw0L3QtVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi0J3QsNGH0LDQu9C+XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi0JTRgNGD0LPQviAo0L7Qv9C40YjQtdGC0LUpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLQndC40YLQviDQtdC00LjQvVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLQktGB0LjRh9C60LhcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcItGB0YLRgC4gezB9LCDQvtCx0YnQviDRgdGC0YAuIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwi0JfQsNC/0LjRgSB7MH0g0L7RgiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcItCe0YLQs9C+0LLQvtGA0LXQvdC4INC90LAgezB9IC8gezF9INCy0YrQv9GA0L7RgdCwXCIsXG4gIGVtcHR5U3VydmV5OiBcItCQ0L3QutC10YLQsNGC0LAg0L3QtSDRgdGK0LTRitGA0LbQsCDQstC40LTQuNC80Lgg0YHRgtGA0LDQvdC40YbQuCDQuNC70Lgg0LLRitC/0YDQvtGB0LguXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi0JHQu9Cw0LPQvtC00LDRgNC40Lwg0LLQuCDQt9CwINGD0YfQsNGB0YLQuNC10YLQviDQsiDQsNC90LrQtdGC0LDRgtCwIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcItCY0LfQs9C70LXQttC00LAsINGH0LUg0LLQuNC1INCy0LXRh9C1INGB0YLQtSDQv9C+0L/RitC70L3QuNC70Lgg0LDQvdC60LXRgtCw0YLQsC5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLQl9Cw0YDQtdC20LTQsNC90LUg0L3QsCDQsNC90LrQtdGC0LDRgtCwLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcItCY0LfQsdC10YDQtdGC0LUuLi5cIixcbiAgdmFsdWU6IFwidmFsdWVcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLQnNC+0LvRjywg0L7RgtCz0L7QstC+0YDQtdGC0LUg0L3QsCDRgdC70LXQtNC90LjRjyDQstGK0L/RgNC+0YEuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcItCc0L7Qu9GPLCDQvtGC0LPQvtCy0L7RgNC10YLQtSDQv9C+0L3QtSDQvdCwINC10LTQuNC9INC+0YIg0LLRitC/0YDQvtGB0LjRgtC1LlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItCc0L7Qu9GPLCDQvtGC0LPQvtCy0L7RgNC10YLQtSDQvdCwINCy0YrQv9GA0L7RgdC40YLQtSDQvdCwINCy0YHQuNGH0LrQuCDRgNC10LTQvtCy0LUuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLQodGC0L7QudC90L7RgdGC0YLQsCDRgdC70LXQtNCy0LAg0LTQsCDQsdGK0LTQtSDRh9C40YHQu9C+LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcItCc0L7Qu9GPLCDQuNC30L/QvtC70LfQstCw0LnRgtC1INC/0L7QvdC1IHswfSDRgdC40LzQstC+0LvQsC5cIixcbiAgdGV4dE1heExlbmd0aDogXCLQnNC+0LvRjywg0LjQt9C/0L7Qu9C30LLQsNC50YLQtSDQvdC1INC/0L7QstC10YfQtSDQvtGCIHswfSDRgdC40LzQstC+0LvQsC5cIixcbiAgdGV4dE1pbk1heExlbmd0aDpcbiAgICBcItCc0L7Qu9GPLCDQuNC30L/QvtC70LfQstCw0LnRgtC1INC/0L7QstC10YfQtSDQvtGCIHswfSDQuCDQv9C+LdC80LDQu9C60L4g0L7RgiB7MX0g0YHQuNC80LLQvtC70LAuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwi0JzQvtC70Y8sINC/0L7Qv9GK0LvQvdC10YLQtSDQv9C+0L3QtSB7MH0g0YDQtdC00LAuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItCc0L7Qu9GPLCDQuNC30LHQtdGA0LXRgtC1INC/0L7QvdC1IHswfSDQstCw0YDQuNCw0L3RgtCwLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLQnNC+0LvRjywg0LjQt9Cx0LXRgNC10YLQtSDQvdC1INC/0L7QstC10YfQtSDQvtGCIHswfSDQstCw0YDQuNCw0L3RgtCwLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwi0KHRgtC+0LnQvdC+0YHRgtGC0LAgJ3swfScg0YHQu9C10LTQstCwINC00LAg0LHRitC00LUg0YDQsNCy0L3QsCDQuNC70Lgg0L/Qvi3Qs9C+0LvRj9C80LAg0L7RgiB7MX0g0Lgg0YDQsNCy0L3QsCDQuNC70Lgg0L/Qvi3QvNCw0LvQutCwINC+0YIgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwi0KHRgtC+0LnQvdC+0YHRgtGC0LAgJ3swfScg0YHQu9C10LTQstCwINC00LAg0LHRitC00LUg0YDQsNCy0L3QsCDQuNC70Lgg0L/Qvi3Qs9C+0LvRj9C80LAg0L7RgiB7MX1cIixcbiAgbnVtZXJpY01heDogXCLQodGC0L7QudC90L7RgdGC0YLQsCAnezB9JyDRgdC70LXQtNCy0LAg0LTQsCDQsdGK0LTQtSDRgNCw0LLQvdCwINC40LvQuCDQv9C+LdC80LDQu9C60LAg0L7RgiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcItCc0L7Qu9GPLCDQstGK0LLQtdC00LXRgtC1INCy0LDQu9C40LTQtdC9INCw0LTRgNC10YEg0L3QsCDQtdC70LXQutGC0YDQvtC90L3QsCDQv9C+0YnQsC5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi0JjQt9GA0LDQt9GK0YI6IHswfSDRgtGA0Y/QsdCy0LAg0LTQsCDQtNCw0LLQsCDRgNC10LfRg9C70YLQsNGCICd0cnVlJyAo0LjRgdGC0LjQvdCwKS5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcItCX0LDRj9Cy0LrQsNGC0LAg0LLQvtC00Lgg0LTQviDQs9GA0LXRiNC60LAgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLQl9Cw0Y/QstC60LDRgtCwINC90LUg0LLRgNGK0YnQsCDQtNCw0L3QvdC4INC40LvQuCDRh9Cw0YHRgtGC0LAgJ3BhdGgnICjQv9GK0YIg0LTQviDRgtGK0YDRgdC10L3QuNGPINGA0LXRgdGD0YDRgSDQvdCwINGB0YrRgNCy0YrRgNCwKSDQtSDQvdC10L/RgNCw0LLQuNC70L3QviDQt9Cw0LTQsNC00LXQvdCwXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi0KDQsNC30LzQtdGA0YrRgiDQvdCwINGE0LDQudC70LAg0YHQu9C10LTQstCwINC00LAg0L3QtSDQv9GA0LXQstC40YjQsNCy0LAgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi0JzQvtC70Y8sINCy0YrQstC10LTQtdGC0LUg0LTRgNGD0LPQsNGC0LAg0YHRgtC+0LnQvdC+0YHRgi5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcItCS0LDRiNC40YIg0YTQsNC50Lsg0YHQtSDQt9Cw0YDQtdC20LTQsCDQvdCwINGB0YrRgNCy0YrRgNCwLiDQnNC+0LvRjywg0LjQt9GH0LDQutCw0LnRgtC1INC90Y/QutC+0LvQutC+INGB0LXQutGD0L3QtNC4INC4INGC0L7Qs9Cw0LLQsCDQvtC/0LjRgtCy0LDQudGC0LUg0L7RgtC90L7QstC+LlwiLFxuICBsb2FkaW5nRmlsZTogXCLQl9Cw0YDQtdC20LTQsNC90LUuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLQmNC30LHQtdGA0LXRgtC1INGE0LDQudC7KNC+0LLQtSkuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcItCd0Y/QvNCwINC40LfQsdGA0LDQvSDRhNCw0LnQu1wiLFxuICBjb25maXJtRGVsZXRlOiBcItCW0LXQu9Cw0LXRgtC1INC70Lgg0LTQsCDQuNC30YLRgNC40LXRgtC1INC30LDQv9C40YHQsD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLQodGC0L7QudC90L7RgdGC0YLQsCDRgdC70LXQtNCy0LAg0LTQsCDQsdGK0LTQtSDRg9C90LjQutCw0LvQvdCwLlwiLFxuICBhZGRDb2x1bW46IFwi0JTQvtCx0LDQstGP0L3QtSDQvdCwINC60L7Qu9C+0L3QsFwiLFxuICBhZGRSb3c6IFwi0JTQvtCx0LDQstGP0L3QtSDQvdCwINGA0LXQtFwiLFxuICByZW1vdmVSb3c6IFwi0J/RgNC10LzQsNGF0LLQsNC90LUg0L3QsCDRgNC10LRcIixcbiAgYWRkUGFuZWw6IFwi0JTQvtCx0LDQstGP0L3QtSDQvdCwINC/0LDQvdC10LtcIixcbiAgcmVtb3ZlUGFuZWw6IFwi0J/RgNC10LzQsNGF0LLQsNC90LUg0L3QsCDQv9Cw0L3QtdC7XCIsXG4gIGNob2ljZXNfSXRlbTogXCLQtdC70LXQvNC10L3RglwiLFxuICBtYXRyaXhfY29sdW1uOiBcItCa0L7Qu9C+0L3QsFwiLFxuICBtYXRyaXhfcm93OiBcItCg0LXQtFwiLFxuICBzYXZpbmdEYXRhOiBcItCg0LXQt9GD0LvRgtCw0YLQuNGC0LUg0YHQtSDQt9Cw0L/QsNC30LLQsNGCINC90LAg0YHRitGA0LLRitGA0LAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOlxuICAgIFwi0J/QvtGA0LDQtNC4INCy0YrQt9C90LjQutC90LDQu9CwINCz0YDQtdGI0LrQsCDRgNC10LfRg9C70YLQsNGC0LjRgtC1INC90LUg0LzQvtC20LDRhdCwINC00LAg0LHRitC00LDRgiDQt9Cw0L/QsNC30LXQvdC4LlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLQoNC10LfRg9C70YLQsNGC0LjRgtC1INCx0Y/RhdCwINC30LDQv9Cw0LfQtdC90Lgg0YPRgdC/0LXRiNC90L4hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLQndC+0LIg0L7Qv9C40YJcIixcbiAgdGltZXJNaW46IFwi0LzQuNC9XCIsXG4gIHRpbWVyU2VjOiBcItGB0LXQulwiLFxuICB0aW1lclNwZW50QWxsOiBcItCS0LjQtSDQuNC30L/QvtC70LfQstCw0YXRgtC1IHswfSDQvdCwINGC0LDQt9C4INGB0YLRgNCw0L3QuNGG0LAg0Lgg0L7QsdGJ0L4gezF9LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCLQktC40LUg0LjQt9C/0L7Qu9C30LLQsNGF0YLQtSB7MH0g0L3QsCDRgtCw0LfQuCDRgdGC0YDQsNC90LjRhtCwLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcItCS0LjQtSDQuNC30L/QvtC70LfQstCw0YXRgtC1INC+0LHRidC+IHswfS5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcItCS0LjQtSDQuNC30L/QvtC30LLQsNGF0YLQtSB7MH0g0L7RgiB7MX0g0L3QsCDRgtCw0LfQuCDRgdGC0YDQsNC90LjRhtCwINC4INC+0LHRidC+IHsyfSDQvtGCIHszfS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi0JLQuNC1INC40LfQv9C+0LvQt9Cy0LDRhdGC0LUgezB9INC+0YIgezF9INC90LAg0YLQsNC30Lgg0YHRgtGA0LDQvdC40YbQsC5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLQktC40LUg0LjQt9C/0L7Qu9C30LLQsNGF0YLQtSDQvtCx0YnQviB7MH0g0L7RgiB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLQmNC30YfQuNGB0YLQstCw0L3QtVwiLFxuICBjbGVhckNhcHRpb246IFwi0J3QsNGH0LDQu9C90L4g0YHRitGB0YLQvtGP0L3QuNC1XCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcItCY0LfQsdC10YDQtdGC0LUg0YTQsNC50LtcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi0J/RgNC10LzQsNGF0LLQsNC90LUg0L3QsCDRhNCw0LnQu9CwXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi0JTQsFwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwi0J3QtVwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLQndCw0LjRgdGC0LjQvdCwINC70Lgg0LjRgdC60LDRgtC1INC00LAg0L/RgNC10LzQsNGF0L3QtdGC0LUg0YLQvtC30Lgg0YTQsNC50Ls6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcItCd0LDQuNGB0YLQuNC90LAg0LvQuCDQuNGB0LrQsNGC0LUg0LTQsCDQv9GA0LXQvNCw0YXQvdC10YLQtSDQstGB0LjRh9C60Lgg0YTQsNC50LvQvtCy0LU/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLQl9Cw0LPQu9Cw0LLQuNC1INC90LAg0LLRitC/0YDQvtGB0LBcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiYmdcIl0gPSBidWxnYXJpYW5TdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiYmdcIl0gPSBcItCx0YrQu9Cz0LDRgNGB0LrQuFwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBjYXRhbGFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkFudGVyaW9yXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJTZWfDvGVudFwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQ29tcGxldFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIlVuIGFsdHJlIChkZXNjcmlndWkpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQw6BnaW5hIHswfSBkZSB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTm8gaGkgaGEgY2FwIHDDoGdpbmEgdmlzaWJsZSBvIHByZWd1bnRhIGEgbCdlbnF1ZXN0YS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJHcsOgY2llcyBwZXIgY29tcGxldGFyIGwnZW5xdWVzdGEhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTCdlbnF1ZXN0YSBzJ2VzdMOgIGNhcnJlZ2FudCAuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2VsZWNjaW9uYSAuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJTaSB1cyBwbGF1IGNvbnRlc3RpIGxhIHByZWd1bnRhLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlNpIHVzIHBsYXUgY29udGVzdGkgbGVzIHByZWd1bnRlcyBkZSBjYWRhIGZpbGVyYS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkwnZXN0aW1hY2nDsyBoYSBkZSBzZXIgbnVtw6hyaWNhLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlNpIHVzIHBsYXUgZW50cmUgYWxtZW55cyB7MH0gc8OtbWJvbHMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiU2kgdXMgcGxhdSBlbnRyZSBtZW55cyBkZSB7MH0gc8OtbWJvbHMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiU2kgdXMgcGxhdSBlbnRyZSBtw6lzIGRlIHswfSBpIG1lbnlzIGRlIHsxfSBzw61tYm9scy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJTaSB1cyBwbGF1IG9tcGxpIGFsbWVueXMgezB9IGZpbGVyZXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlNpIHVzIHBsYXUgc2VsZWNjaW9uaSBhbG1lbnlzIHswfSB2YXJpYW50cy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiU2kgdXMgcGxhdSBzZWxlY2Npb25pIG5vIG3DqXMgZGUgezB9IHZhcmlhbnRzLlwiLFxuICBudW1lcmljTWluTWF4OiBcIkVsICd7MH0nIGRldSBzZXIgaWd1YWwgbyBtw6lzIGRlIHsxfSBpIGlndWFsIG8gbWVueXMgZGUgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiRWwgJ3swfScgaGEgZGUgc2VyIGlndWFsIG8gbcOpcyBkZSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJFbCAnezB9JyBoYSBkZSBzZXIgaWd1YWwgbyBtZW55cyBkZSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlNpIHVzIHBsYXUgYWZlZ2l1IHVuIGNvcnJldSBlbGVjdHLDsm5pYyB2w6BsaWQuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJMYSBzb2zCt2xpY2l0dWQgdmEgdG9ybmFyIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiTGEgc29swrdsaWNpdHVkIHZhIHRvcm5hciBidWlkYSBkZSBkYXRlcyBvIGxhIHByb3BpZXRhdCAndHJhamVjdMOycmlhJyBubyDDqXMgY29ycmVjdGFcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJMYSBtaWRhIGRlIGwnYXJ4aXUgbm8gcG90IGV4Y2VkaXIgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiU2kgdXMgcGxhdSBhZmVnaXUgbCdhbHRyYSBlc3RpbWFjacOzLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRWwgc2V1IGFyeGl1IHMnZXN0w6AgcHVqYW50LiBTaSB1cyBwbGF1IGVzcGVyaSB1bnMgc2Vnb25zIGkgaW50ZW50ZXUtaG8gZGUgbm91LlwiLFxuICBhZGRSb3c6IFwiQWZlZ2l1IHVuYSBmaWxlcmFcIixcbiAgcmVtb3ZlUm93OiBcIkVsaW1pbmFyIHVuYSBmaWxlcmFcIixcbiAgY2hvaWNlc19maXJzdEl0ZW06IFwicHJpbWVyIGFydGljbGVcIixcbiAgY2hvaWNlc19zZWNvbmRJdGVtOiBcInNlZ29uIGFydGljbGVcIixcbiAgY2hvaWNlc190aGlyZEl0ZW06IFwidGVyY2VyIGFydGljbGVcIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bW5hXCIsXG4gIG1hdHJpeF9yb3c6IFwiRmlsZXJhXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiY2FcIl0gPSBjYXRhbGFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImNhXCJdID0gXCJjYXRhbMOgXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGNyb2F0aWFuU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlByZXRob2RuaVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU2xqZWRlxIdpXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJLb21wbGV0YW5cIixcbiAgcHJldmlld1RleHQ6IFwiUHJlZ2xlZFwiLFxuICBlZGl0VGV4dDogXCJVcmXEkWl2YW5qZVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiUG/EjWV0YWtcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJPc3RhbGkgKG9waXMpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOaXRrb1wiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJTZWxlY3QgQWxsXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTdHJhbmljYSB7MH0gb2QgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJaYXBpc2EgezB9IG9kIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiT2Rnb3ZvcmlvIG5hIHswfS97MX0gcGl0YW5qYVwiLFxuICBlbXB0eVN1cnZleTogXCJVIGFua2V0aSBuZW1hIHZpZGxqaXZlIHN0cmFuaWNlIGlsaSBwaXRhbmphLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkh2YWxhIHZhbSDFoXRvIHN0ZSB6YXZyxaFpbGkgYW5rZXR1IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiTmHFoWkgemFwaXNpIHBva2F6dWp1IGRhIHN0ZSB2ZcSHIHphdnLFoWlsaSBvdnUgYW5rZXR1LlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkFua2V0YSBvIHXEjWl0YXZhbmplLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIk9kYWJlcml0ZS4uLlwiLFxuICB2YWx1ZTogXCJ2cmlqZWRub3N0XCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiTW9saW0gdmFzIG9kZ292b3JpdGUgbmEgcGl0YW5qZS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiTW9saW0gdmFzIG9kZ292b3JpdGUgbmEgYmFyZW0gamVkbm8gcGl0YW5qZS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJPZGdvdm9yaXRlIG5hIHBpdGFuamEgdSBzdmltIHJlZG92aW1hLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVnJpamVkbm9zdCBiaSB0cmViYWxhIGJpdGkgYnJvasSNYW5hLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlVuZXNpdGUgbmFqbWFuamUgezB9IHpuYWsob3ZhKS5cIixcbiAgdGV4dE1heExlbmd0aDogXCJVbmVzaXRlIG1hbmplIG9kIHswfSB6bmFrKG92YSkuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiVW5lc2l0ZSB2acWhZSBvZCB7MH0gaSBtYW5qZSBvZCB7MX0gem5ha292YS5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJNb2xpbW8gaXNwdW5pdGUgbmFqbWFuamUgezB9IHJlZGFrYS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiT2RhYmVyaXRlIGJhcmVtIHswfSB2YXJpamFudGUuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk9kYWJlcml0ZSBuZSB2acWhZSBvZCB7MH0gdmFyaWphbnRpLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfSdiaSB0cmViYW8gYml0aSBqZWRuYWsgaWxpIHZpxaFlIG9kIHsxfSBpIGplZG5hayBpbGkgbWFuamkgb2QgezJ9LlwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGJpIHRyZWJhbyBiaXRpIGplZG5hayBpbGkgdmnFoWUgb2QgezF9LlwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIGJpIHRyZWJhbyBiaXRpIGplZG5hayBpbGkgbWFuamkgb2QgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJVbmVzaXRlIHZhbGphbnUgZS1tYWlsIGFkcmVzdS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiSXpyYXo6IHswfSB0cmViYSB2cmF0aXRpICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlphaHRqZXYgdnJhdGlvIHBvZ3JlxaFrdSAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlphaHRqZXYgamUgdnJhdGlvIHByYXpuZSBwb2RhdGtlIGlsaSBqZSAncGF0aCcgc3ZvanN0dm8gbmV0b8SNbmEuXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiVmVsacSNaW5hIGRhdG90ZWtlIG5lIHNtaWplIHByZWxheml0aSB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJVbmVzaXRlIGRydWd1IHZyaWplZG5vc3QuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJWYcWhYSBkYXRvdGVrYSBzZSBwcmVub3NpLiBQcmnEjWVrYWp0ZSBuZWtvbGlrbyBzZWt1bmRpIGkgcG9rdcWhYWp0ZSBwb25vdm5vLlwiLFxuICBsb2FkaW5nRmlsZTogXCJVxI1pdGF2YW5qZS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIk9kYWJlcml0ZSBkYXRvdGVrdS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTmlqZSBvZGFicmFuYSBkYXRvdGVrYVwiLFxuICBjb25maXJtRGVsZXRlOiBcIsW9ZWxpdGUgbGkgaXpicmlzYXRpIHphcGlzP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlRhIGJpIHZyaWplZG5vc3QgdHJlYmFsYSBiaXRpIGplZGluc3R2ZW5hLlwiLFxuICBhZGRDb2x1bW46IFwiRG9kYXZhbmplIHN0dXBjYVwiLFxuICBhZGRSb3c6IFwiRG9kYXZhbmplIHJlZGFrYVwiLFxuICByZW1vdmVSb3c6IFwiVWtsb25pdGlcIixcbiAgYWRkUGFuZWw6IFwiRG9kYXZhbmplIG5vdmloXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlVrbG9uaXRpXCIsXG4gIGNob2ljZXNfSXRlbTogXCJzdGF2a3VcIixcbiAgbWF0cml4X2NvbHVtbjogXCJTdHVwY2FcIixcbiAgbWF0cml4X3JvdzogXCJSZWRha1wiLFxuICBzYXZpbmdEYXRhOiBcIlJlenVsdGF0aSBzZSBzcHJlbWFqdSBuYSBwb3NsdcW+aXRlbGp1Li4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJEb8WhbG8gamUgZG8gcG9ncmXFoWtlIGkgbmlzbW8gbW9nbGkgc3ByZW1pdGkgcmV6dWx0YXRlLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJSZXp1bHRhdGkgc3UgdXNwamXFoW5vIHNwcmVtbGplbmkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQb2t1xaFhaiBwb25vdm9cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlZpIHN0ZSBwcm92ZWxpIHswfSBuYSBvdm9qIHN0cmFuaWNpIGkgezF9IHVrdXBuby5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiUG90cm/FoWlsaSBzdGUgezB9IG5hIG92dSBzdHJhbmljdS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gaW4gdG90YWwuIHswfS5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIlZpIHN0ZSBwcm92ZWxpIHswfSBvZCB7MX0gbmEgb3ZvaiBzdHJhbmljaSBpIHsyfSBvZCB7M30gdWt1cG5vLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJQb3Ryb8WhaW8gc2kgezB9IG9kIHsxfSBuYSBvdm9qIHN0cmFuaWNpLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlVrdXBubyBzdGUgcG90cm/FoWlsaSB7MH0gb2QgezF9LlwiLFxuICBjbGVhbkNhcHRpb246IFwiT8SNaXN0aXRpXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJPxI1pc3RpdGlcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiT2RhYmVyaXRlIGRhdG90ZWt1XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlVrbG9uaXRlIG92dSBkYXRvdGVrdVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkRhXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOZVwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJKZXN0ZSBsaSBzaWd1cm5pIGRhIMW+ZWxpdGUgdWtsb25pdGkgb3Z1IGRhdG90ZWt1OiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCJKZXN0ZSBsaSBzaWd1cm5pIGRhIMW+ZWxpdGUgdWtsb25pdGkgc3ZlIGRhdG90ZWtlP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiTmFzbG92IHBpdGFuamFcIixcbiAgbW9kYWxDYW5jZWxCdXR0b25UZXh0OiBcIk90a2F6YXRpXCIsXG4gIG1vZGFsQXBwbHlCdXR0b25UZXh0OiBcIlByaW1pamVuaXRpXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImhyXCJdID0gY3JvYXRpYW5TdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiaHJcIl0gPSBcImhydmF0c2tpXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGN6ZWNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlDFmWVkY2hvesOtXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJEYWzFocOtXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJIb3Rvdm9cIixcbiAgcHJldmlld1RleHQ6IFwiTsOhaGxlZFwiLFxuICBlZGl0VGV4dDogXCJVcHJhdml0XCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkppbsOhIG9kcG92xJvEjyAobmFwacWhdGUpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLFvcOhZG7DvVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJWeWJyYXQgdsWhZVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU3RyYW5hIHswfSB6IHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiWsOhem5hbSB7MH0geiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIlpvZHBvdsSbemVuw6kgb3TDoXpreTogezB9IC8gezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIlByxa96a3VtdSBuZW9ic2FodWplIMW+w6FkbsOpIG90w6F6a3kuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiRMSba3VqZW1lIHphIHZ5cGxuxJtuw60gcHLFr3prdW11IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiTmHFoWUgesOhem5hbXkgdWthenVqw60sIMW+ZSBqc3RlIHRlbnRvIHByxa96a3VtIGppxb4gZG9rb27EjWlsaS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJQcm9iw61ow6EgbmHEjcOtdMOhbsOtIHByxa96a3VtdS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWeWJlci4uLlwiLFxuICB2YWx1ZTogXCJob2Rub3RhXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiT2Rwb3bEm3p0ZSBwcm9zw61tIG5hIG90w6F6a3UuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlBsZWFzZSBhbnN3ZXIgYXQgbGVhc3Qgb25lIHF1ZXN0aW9uLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIk9kcG92xJt6dGUgcHJvc8OtbSBuYSB2xaFlY2hueSBvdMOhemt5LlwiLFxuICBudW1lcmljRXJyb3I6IFwiViB0b210byBwb2xpIGx6ZSB6YWRhdCBwb3V6ZSDEjcOtc2xhLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gem5ha8WvLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSBtw6luxJsgbmXFviB7MH0gem5ha8WvLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSB2w61jZSBuZcW+IHswfSBhIG3DqW7EmyBuZcW+IHsxfSB6bmFrxa8uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVnlwbMWIdGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gxZnDoWRrxa8uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlZ5YmVydGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gdmFyaWFudHkuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk5ldnliw61yZWp0ZSBwcm9zw61tIHbDrWNlIG5lxb4gezB9IHZhcmlhbnQuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPZHBvdsSbxI8gJ3swfScgYnkgbcSbbG8gYsO9dCB2xJt0xaHDrSBuZWJvIHJvdm5vIHsxfSBhIG1lbsWhw60gbmVibyByb3ZubyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJPZHBvdsSbxI8gJ3swfScgYnkgbcSbbG8gYsO9dCB2xJt0xaHDrSBuZWJvIHJvdm5vIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIk9kcG92xJvEjyAnezB9JyBieSBtxJtsbyBiw710IG1lbsWhw60gbmVibyByb3ZubyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlphZGVqdGUgcHJvc8OtbSBwbGF0bm91IGUtbWFpbG92b3UgYWRyZXN1LlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJWw71yYXo6IHswfSBieSBtxJtsIHZyw6F0aXQgaG9kbm90dSDigJ50cnVl4oCcLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUG/FvmFkYXZlayB2csOhdGlsIGNoeWJ1ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIlBvxb5hZGF2ZWsgbmV2csOhdGlsIGRhdGEgbmVibyBjZXN0YSBqZSBuZXBsYXRuw6FcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJWZWxpa29zdCBzb3Vib3J1IGJ5IG5lbcSbbGEgYsO9dCB2xJt0xaHDrSBuZcW+IHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlphZGVqdGUgcHJvc8OtbSBqaW5vdSBob2Rub3R1LlwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIlbDocWhIHNvdWJvciBzZSBuYWhyw6F2w6EuIFprdXN0ZSB0byBwcm9zw61tIHphIG7Em2tvbGlrIHNla3VuZC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiTmHEjcOtdMOhbsOtLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiVnliZXJ0ZSBzb3Vib3J5IC4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTmVuw60genZvbGVuw70gxb7DoWRuw70gc291Ym9yXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiQ2hjZXRlIHNtYXphdCB6w6F6bmFtP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlRhdG8gaG9kbm90YSBieSBtxJtsYSBiw710IGplZGluZcSNbsOhLlwiLFxuICBhZGRDb2x1bW46IFwiUMWZaWRhdCBzbG91cGVjXCIsXG4gIGFkZFJvdzogXCJQxZlpZGF0IMWZw6FkZWtcIixcbiAgcmVtb3ZlUm93OiBcIk9kc3RyYW5pdFwiLFxuICBhZGRQYW5lbDogXCJQxZlpZGF0IG5vdsO9XCIsXG4gIHJlbW92ZVBhbmVsOiBcIk9kc3RyYW5pdFwiLFxuICBjaG9pY2VzX0l0ZW06IFwicG9sb8W+a2FcIixcbiAgbWF0cml4X2NvbHVtbjogXCJTbG91cGVjXCIsXG4gIG1hdHJpeF9yb3c6IFwixZjDoWRla1wiLFxuICBzYXZpbmdEYXRhOiBcIlbDvXNsZWRreSBzZSB1a2zDoWRhasOtIG5hIHNlcnZlciAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkRvxaFsbyBrIGNoeWLEmyBhIHbDvXNsZWRreSBqc21lIG5lbW9obGkgdWxvxb5pdC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiVsO9c2xlZGt5IGJ5bHkgw7pzcMSbxaFuxJsgdWxvxb5lbnkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJaa3VzIHRvIHpub3Z1XCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJOYSB0w6l0byBzdHLDoW5jZSBqc3RlIHV0cmF0aWxpIGNlbGtlbSB7MH0gYSBjZWxrZW0gezF9LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJOYSB0w6l0byBzdHLDoW5jZSBqc3RlIHV0cmF0aWxpIHswfS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJDZWxrZW0ganN0ZSB1dHJhdGlsaSB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJOYSB0w6l0byBzdHLDoW5jZSBqc3RlIHV0cmF0aWxpIHswfSB6IHsxfSBhIGNlbGtlbSB7Mn0geiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIk5hIHTDqXRvIHN0csOhbmNlIGpzdGUgc3Ryw6F2aWxpIHswfSB6IHsxfS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJDZWxrb3bEmyBqc3RlIHV0cmF0aWxpIHswfSB6IHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIsSMaXN0w71cIixcbiAgY2xlYXJDYXB0aW9uOiBcIlByxa9obGVkbsOhXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlZ5YmVydGUgc291Ym9yXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIk9kZWJlcnRlIHRlbnRvIHNvdWJvclwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkFub1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTmVcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiT3ByYXZkdSBjaGNldGUgb2RlYnJhdCB0ZW50byBzb3Vib3I6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIk9wcmF2ZHUgY2hjZXRlIG9kc3RyYW5pdCB2xaFlY2hueSBzb3Vib3J5P1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiTsOhemV2IG90w6F6a3lcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiY3NcIl0gPSBjemVjaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJjc1wiXSA9IFwixI1lxaF0aW5hXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGRhbmlzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJUaWxiYWdlXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJWaWRlcmVcIixcbiAgY29tcGxldGVUZXh0OiBcIkbDpnJkaWdcIixcbiAgcHJldmlld1RleHQ6IFwiRm9ycHJlbWllcmVcIixcbiAgZWRpdFRleHQ6IFwiUmVkaWfDqXJcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlN0YXJ0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiVmFsZ2ZyaXQgc3Zhci4uLlwiLFxuICBub25lSXRlbVRleHQ6IFwiSW5nZW5cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiVsOmbGcgYWxsZVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2lkZSB7MH0gYWYgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJPcHRhZyB7MH0gYWYgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJCZXN2YXJlZGUgezB9IC8gezF9IHNww7hyZ3Ntw6VsXCIsXG4gIGVtcHR5U3VydmV5OiBcIkRlciBlciBpbmdlbiBzeW5saWdlIHNww7hyZ3Ntw6VsLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIk1hbmdlIHRhayBmb3IgZGluIGJlc3ZhcmVsc2UhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJWb3JlcyBkYXRhIHZpc2VyIGF0IGR1IGFsbGVyZWRlIGhhciBnZW5uZW1mw7hydCBkZXR0ZSBzcMO4cmdlc2tlbWEuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiU3DDuHJnZXNrZW1hZXQgaGVudGVzIGZyYSBzZXJ2ZXJlbi4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWw6ZsZy4uLlwiLFxuICB2YWx1ZTogXCJ2w6ZyZGlcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJCZXN2YXIgdmVubGlnc3Qgc3DDuHJnc23DpWxldC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiQmVzdmFyIHZlbmxpZ3N0IG1pbmRzdCDDqXQgc3DDuHJnc23DpWwuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiQmVzdmFyIHZlbmxpZ3N0IHNww7hyZ3Ntw6VsIGkgYWxsZSByw6Zra2VyLlwiLFxuICBudW1lcmljRXJyb3I6IFwiQW5naXYgZXQgdGFsLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIkFuZ2l2IG1pbmRzdCB7MH0gdGVnbi5cIixcbiAgdGV4dE1heExlbmd0aDogXCJQbGVhc2UgZW50ZXIgbGVzcyB0aGFuIHswfSBjaGFyYWN0ZXJzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIkFuZ2l2IG1lcmUgZW5kIHswfSBvZyBtaW5kcmUgZW5kIHsxfSB0ZWduLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlVkZnlsZCBtaW5kc3QgezB9IHLDpmtrZXIuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlbDpmxnIHZlbmxpZ3N0IG1pbmRzdCB7MH0gc3Zhcm11bGlnaGVkKGVyKS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVsOmbGcgdmVubGlnc3QgZsOmcnJlIHswfSBzdmFybXVsaWdoZWRlcihlcikuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBza2FsIHbDpnJlIGxpZyBtZWQgZWxsZXIgc3TDuHJyZSBlbmQgezF9IG9nIGxpZyBtZWQgZWxsZXIgbWluZHJlIGVuZCB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBza2FsIHbDpnJlIGxpZyBtZWQgZWxsZXIgc3TDuHJyZSBlbmQgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIG1pbmRyZSBlbmQgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJBbmdpdiB2ZW5saWdzdCBlbiBneWxkaWcgZS1tYWlsIGFkcmVzc2UuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlVkdHJ5a2tldDogezB9IHNrYWwgcmV0dXJuZXJlICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkZvcmVzcMO4cmdzbGVuIHJldHVybmVyZWRlIGZlamxlbiAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkZvcmVzcMO4cmdzbGVuIHJldHVybmVyZWRlIGluZ2VuIGRhdGEgZWxsZXIgJ3BhdGgnIHBhcmFtZXRlcmVuIGVyIGZvcmtlcnRcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJGaWxzdMO4cnJlbHNlbiBtw6UgaWtrZSBvdmVyc3RpZ2UgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQW5naXYgZW4gdsOmcmRpIGZvciBkaXQgdmFsZ2ZyaWUgc3Zhci5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkRpbiBmaWwgYmxpdmVyIHVwbG9hZGV0LiBWZW50IG5vZ2xlIHNla3VuZGVyIG9nIHByw7h2IGV2ZW50dWVsdCBpZ2VuLlwiLFxuICBsb2FkaW5nRmlsZTogXCJJbmRsw6ZzZXIuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJWw6ZsZyBmaWwoZXIpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJJbmdlbiBmaWwgZXIgdmFsZ3RcIixcbiAgY29uZmlybURlbGV0ZTogXCJWaWwgZHUgZmplcm5lIGRlbj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJEZW5uZSB2w6ZyZGkgc2thbCB2w6ZyZSB1bmlrLlwiLFxuICBhZGRDb2x1bW46IFwiVGlsZsO4aiBrb2xvbm5lXCIsXG4gIGFkZFJvdzogXCJUaWxmw7hqIHLDpmtrZVwiLFxuICByZW1vdmVSb3c6IFwiRmplcm5cIixcbiAgYWRkUGFuZWw6IFwiVGlsZsO4aiBueVwiLFxuICByZW1vdmVQYW5lbDogXCJGamVyblwiLFxuICBjaG9pY2VzX0l0ZW06IFwidmFsZ1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIktvbG9ubmVcIixcbiAgbWF0cml4X3JvdzogXCJSw6Zra2VcIixcbiAgc2F2aW5nRGF0YTogXCJSZXN1bHRhdGVybmUgYmxpdmVyIGdlbXQgcMOlIHNlcnZlcmVuLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJEZXIgb3BzdG9kIGVuIGZlamwgb2cgdmkga3VubmUgaWtrZSBnZW1tZSByZXN1bHRhdGV0LlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJSZXN1bHRhdGV0IGJsZXYgZ2VtdCFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlByw7h2IGlnZW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIkR1IGhhciBicnVndCB7MH0gcMOlIGRlbm5lIHNpZGUgb2cgezF9IGkgYWx0LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJEdSBoYXIgYnJ1Z3QgezB9IHDDpSBkZW5uZSBzaWRlLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkR1IGhhciBicnVndCB7MH0gaSBhbHQuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJEdSBoYXIgYnJ1Z3QgezB9IGFmIHsxfSBww6UgZGVubmUgc2lkZSBvZyB7Mn0gYWYgezN9IGkgYWx0LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJEdSBoYXIgYnJ1Z3QgezB9IGFmIHsxfSBww6UgZGVubmUgc2lkZS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJEdSBoYXIgYnJ1Z3QgezB9IGFmIHsxfSBpIGFsdC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIlJlbnNcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkZqZXJuXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlbDpmxnIGZpbFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJGamVybiBkZW5uZSBmaWxcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJKYVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiSW5nZW5cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiRXIgZHUgc2lra2VyIHDDpSwgYXQgZHUgdmlsIGZqZXJuZSBkZW5uZSBmaWw6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkVyIGR1IHNpa2tlciBww6UsIGF0IGR1IHZpbCBmamVybmUgYWxsZSBmaWxlcj9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlNww7hyZ3Ntw6VscyB0aXRlbFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJkYVwiXSA9IGRhbmlzaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJkYVwiXSA9IFwiZGFuc2tcIjtcbiIsIi8vQ3JlYXRlZCBvbiBiZWhhbGYgaHR0cHM6Ly9naXRodWIuY29tL0ZyYW5rMTNcbi8vTW9kaWZpZWQgb24gYmVoYWxmIFJvZWxhbmQgVmVyYmFrZWxcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZHV0Y2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiVm9yaWdlXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJWb2xnZW5kZVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiVmVyemVuZGVuXCIsXG4gIHByZXZpZXdUZXh0OiBcIlZvb3JiZWVsZFwiLFxuICBlZGl0VGV4dDogXCJCZXdlcmtcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkJlZ2luIG1ldFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkFuZGVycywgbmwuXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJHZWVuXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlNlbGVjdGVlciBBbGxlc1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSB2YW4gezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJSZWNvcmQgezB9IG9mIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiR2VhbnR3b29yZCB7MH0vezF9IHZyYWdlblwiLFxuICBlbXB0eVN1cnZleTogXCJFciBpcyBnZWVuIHppY2h0YmFyZSBwYWdpbmEgb2YgdnJhYWcgaW4gZGV6ZSB2cmFnZW5saWpzdFwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkJlZGFua3Qgdm9vciBoZXQgaW52dWxsZW4gdmFuIGRlIHZyYWdlbmxpanN0XCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgICBcIk9uemUgZ2VnZXZlbnMgdG9uZW4gYWFuIGRhdCBqZSBkZXplIHZyYWdlbmxpanN0IHJlZWRzIGJlYW50d29vcmQgaGVidC5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJEZSB2cmFnZW5saWpzdCBpcyBhYW4gaGV0IGxhZGVuLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIktpZXMuLi5cIixcbiAgdmFsdWU6IFwid2FhcmRlXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiRGl0IGlzIGVlbiB2ZXJlaXN0ZSB2cmFhZ1wiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJHZWxpZXZlIHRlbiBtaW5zdGUgZWVuIHZyYWFnIHRlIGJlYW50d29vcmRlbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJEZXplIHZyYWFnIHZlcmVpc3Qgw6nDqW4gYW50d29vcmQgcGVyIHJpalwiLFxuICBudW1lcmljRXJyb3I6IFwiSGV0IGFudHdvb3JkIG1vZXQgZWVuIGdldGFsIHppam5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJWdWwgbWluc3RlbnMgezB9IGthcmFrdGVycyBpblwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIkdlbGlldmUgbWluZGVyIGRhbiB7MH0ga2FyYWt0ZXJzIGluIHRlIHZ1bGxlbi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJHZWxpZXZlIG1lZXIgZGFuIHswfSBlbiBtaW5kZXIgZGFuIHsxfSBrYXJha3RlcnMgaW4gdGUgdnVsbGVuLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIkdlbGlldmUgdGVuIG1pbnN0ZSB7MH0gcmlqZW4gaW4gdGUgdnVsbGVuLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTZWxlY3RlZXIgbWluaW11bSB7MH0gYW50d29vcmRlblwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJTZWxlY3RlZXIgbmlldCBtZWVyIGRhbiB7MH0gYW50d29vcmRlblwiLFxuICBudW1lcmljTWluTWF4OlxuICAgICAgXCJVdyBhbnR3b29yZCAnezB9JyBtb2V0IGdyb3RlciBvZiBnZWxpamsgemlqbiBhYW4gezF9IGVuIGtsZWluZXIgb2YgZ2VsaWprIGFhbiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJVdyBhbnR3b29yZCAnezB9JyBtb2V0IGdyb3RlciBvZiBnZWxpamsgemlqbiBhYW4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVnVsIGVlbiBnZWxkaWcgZS1tYWlsYWRyZXMgaW5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiRGUgdWl0ZHJ1a2tpbmc6IHswfSBtb2V0ICd3YWFyJyB0ZXJ1Z2dldmVuLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiRGUgdnJhYWcga2VlcmRlIGVlbiBmb3V0IHRlcnVnICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgICAgXCJEZSB2cmFhZyBnYWYgZWVuIGxlZWcgYW50d29vcmQgdGVydWcgb2YgZGUgJ3BhZCcgZWlnZW5zY2hhcCBpcyBuaWV0IGNvcnJlY3RcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJEZSBncm9vdHRlIHZhbiBoZXQgYmVzdGFuZCBtYWcgbmlldCBncm90ZXIgemlqbiBkYW4gezB9XCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJWdWwgaGV0IHZlbGQgJ0FuZGVycywgbmwuJyBpblwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgICAgXCJVdyBiZXN0YW5kIHdvcmR0IG9wZ2VsYWRlbi4gR2VsaWV2ZSBlbmtlbGUgc2Vjb25kZW4gdGUgd2FjaHRlbiBlbiBvcG5pZXV3IHRlIHByb2JlcmVuLlwiLFxuICBsb2FkaW5nRmlsZTogXCJPcGxhZGVuLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiS2llcyB1dyBiZXN0YW5kKGVuKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiR2VlbiBiZXN0YW5kIGdla296ZW5cIixcbiAgY29uZmlybURlbGV0ZTogXCJXaWwgamUgZGV6ZSBnZWdldmVucyB2ZXJ3aWpkZXJlbj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJEZXplIHdhYXJkZSBtb2V0IHVuaWVrIHppam4uXCIsXG4gIGFkZENvbHVtbjogXCJWb2VnIGtvbG9tIHRvZVwiLFxuICBhZGRSb3c6IFwiVm9lZyByaWogdG9lXCIsXG4gIHJlbW92ZVJvdzogXCJWZXJ3aWpkZXJcIixcbiAgYWRkUGFuZWw6IFwiTmlldXdlIHRvZXZvZWdlblwiLFxuICByZW1vdmVQYW5lbDogXCJWZXJ3aWpkZXJcIixcbiAgY2hvaWNlc19JdGVtOiBcIm9uZGVyd2VycFwiLFxuICBtYXRyaXhfY29sdW1uOiBcIktvbG9tXCIsXG4gIG1hdHJpeF9yb3c6IFwiUmlqXCIsXG4gIHNhdmluZ0RhdGE6IFwiRGUgcmVzdWx0YXRlbiB3b3JkZW4gYmV3YWFyZCBvcCBkZSBzZXJ2ZXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkVyIHdhcyBlZW4gcHJvYmxlZW0gZW4gd2Uga29uZGVuIGRlIHJlc3VsdGF0ZW4gbmlldCBiZXdhcmVuLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJEZSByZXN1bHRhdGVuIHdlcmRlbiBzdWNjZXN2b2wgYmV3YWFyZCFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlByb2JlZXIgb3BuaWV1d1wiLFxuICB0aW1lck1pbjogXCJtaW5pbXVtXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlUgaGVlZnQgezB9IGdlc3BlbmRlZXJkIG9wIGRlemUgcGFnaW5hIGVuIHsxfSBpbiB0b3RhYWwuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlUgaGVlZnQgezB9IG9wIGRlemUgcGFnaW5hIGdlc3BlbmRlZXJkLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlUgaGVlZnQgaW4gdG90YWFsIHswfSBnZXNwZW5kZWVyZC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICAgIFwiVSBoZWVmdCB7MH0gdmFuIHsxfSBvcCBkZXplIHBhZ2luYSBnZXNwZW5kZWVyZCBlbiB7Mn0gdmFuIHszfSBpbiB0b3RhYWwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIlUgaGVlZnQgezB9IHZhbiB7MX0gZ2VzcGVuZGVlcmQgb3AgZGV6ZSBwYWdpbmEuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiVSBoZWVmdCB7MH0gdmFuIHsxfSBpbiBoZXQgdG90YWFsLlwiLFxuICBjbGVhbkNhcHRpb246IFwiS3VpcyBvcFwiLFxuICBjbGVhckNhcHRpb246IFwiS3VpcyBvcFwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJHZWtvemVuIGJlc3RhbmRcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiVmVyd2lqZGVyIGRlemUgZmlsZVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkphXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOZWVuXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkJlbnQgdSB6ZWtlciBkYXQgdSBkZXplIGZpbGUgd2lsdCB2ZXJ3aWpkZXJlbjogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiQmVudCB1IHpla2VyIGRhdCB1IGFsIGRlemUgZmlsZXMgd2lsdCB2ZXJ3aWpkZXJlbj9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlRpdGVsIHZhbiBkZSB2cmFhZ1wiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJubFwiXSA9IGR1dGNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIm5sXCJdID0gXCJuZWRlcmxhbmRzXCI7XG4iLCIvL1VuY29tbWVudCB0aGlzIGxpbmUgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlXG4vL2ltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZW5nbGlzaFN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJQcmV2aW91c1wiLFxuICBwYWdlTmV4dFRleHQ6IFwiTmV4dFwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQ29tcGxldGVcIixcbiAgcHJldmlld1RleHQ6IFwiUHJldmlld1wiLFxuICBlZGl0VGV4dDogXCJFZGl0XCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk90aGVyIChkZXNjcmliZSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk5vbmVcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiU2VsZWN0IEFsbFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnZSB7MH0gb2YgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJSZWNvcmQgezB9IG9mIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiQW5zd2VyZWQgezB9L3sxfSBxdWVzdGlvbnNcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiVGhlcmUgaXMgbm8gdmlzaWJsZSBwYWdlIG9yIHF1ZXN0aW9uIGluIHRoZSBzdXJ2ZXkuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVGhhbmsgeW91IGZvciBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJPdXIgcmVjb3JkcyBzaG93IHRoYXQgeW91IGhhdmUgYWxyZWFkeSBjb21wbGV0ZWQgdGhpcyBzdXJ2ZXkuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTG9hZGluZyBTdXJ2ZXkuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQ2hvb3NlLi4uXCIsXG4gIHZhbHVlOiBcInZhbHVlXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUGxlYXNlIGFuc3dlciB0aGUgcXVlc3Rpb24uXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlBsZWFzZSBhbnN3ZXIgYXQgbGVhc3Qgb25lIHF1ZXN0aW9uLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlBsZWFzZSBhbnN3ZXIgcXVlc3Rpb25zIGluIGFsbCByb3dzLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVGhlIHZhbHVlIHNob3VsZCBiZSBudW1lcmljLlwiLFxuICBtaW5FcnJvcjogXCJUaGUgdmFsdWUgc2hvdWxkIG5vdCBiZSBsZXNzIHRoYW4gezB9XCIsXG4gIG1heEVycm9yOiBcIlRoZSB2YWx1ZSBzaG91bGQgbm90IGJlIGdyZWF0ZXIgdGhhbiB7MH1cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQbGVhc2UgZW50ZXIgYXQgbGVhc3QgezB9IGNoYXJhY3RlcihzKS5cIixcbiAgdGV4dE1heExlbmd0aDogXCJQbGVhc2UgZW50ZXIgbm8gbW9yZSB0aGFuIHswfSBjaGFyYWN0ZXIocykuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6XG4gICAgXCJQbGVhc2UgZW50ZXIgYXQgbGVhc3QgezB9IGFuZCBubyBtb3JlIHRoYW4gezF9IGNoYXJhY3RlcnMuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUGxlYXNlIGZpbGwgaW4gYXQgbGVhc3QgezB9IHJvdyhzKS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCB7MH0gdmFyaWFudChzKS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUGxlYXNlIHNlbGVjdCBubyBtb3JlIHRoYW4gezB9IHZhcmlhbnQocykuXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiVGhlICd7MH0nIHNob3VsZCBiZSBhdCBsZWFzdCB7MX0gYW5kIGF0IG1vc3QgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiVGhlICd7MH0nIHNob3VsZCBiZSBhdCBsZWFzdCB7MX1cIixcbiAgbnVtZXJpY01heDogXCJUaGUgJ3swfScgc2hvdWxkIGJlIGF0IG1vc3QgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlLW1haWwgYWRkcmVzcy5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVGhlIGV4cHJlc3Npb246IHswfSBzaG91bGQgcmV0dXJuICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlRoZSByZXF1ZXN0IHJldHVybmVkIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiVGhlIHJlcXVlc3QgcmV0dXJuZWQgZW1wdHkgZGF0YSBvciB0aGUgJ3BhdGgnIHByb3BlcnR5IGlzIGluY29ycmVjdFwiLFxuICBleGNlZWRNYXhTaXplOiBcIlRoZSBmaWxlIHNpemUgc2hvdWxkIG5vdCBleGNlZWQgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUGxlYXNlIGVudGVyIHRoZSBvdGhlciB2YWx1ZS5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIllvdXIgZmlsZSBpcyB1cGxvYWRpbmcuIFBsZWFzZSB3YWl0IHNldmVyYWwgc2Vjb25kcyBhbmQgdHJ5IGFnYWluLlwiLFxuICBsb2FkaW5nRmlsZTogXCJMb2FkaW5nLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiQ2hvb3NlIGZpbGUocykuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5vIGZpbGUgY2hvc2VuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiRG8geW91IHdhbnQgdG8gZGVsZXRlIHRoZSByZWNvcmQ/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiVGhpcyB2YWx1ZSBzaG91bGQgYmUgdW5pcXVlLlwiLFxuICBhZGRDb2x1bW46IFwiQWRkIGNvbHVtblwiLFxuICBhZGRSb3c6IFwiQWRkIHJvd1wiLFxuICByZW1vdmVSb3c6IFwiUmVtb3ZlXCIsXG4gIGVtcHR5Um93c1RleHQ6IFwiVGhlcmUgYXJlIG5vIHJvd3MuXCIsXG4gIGFkZFBhbmVsOiBcIkFkZCBuZXdcIixcbiAgcmVtb3ZlUGFuZWw6IFwiUmVtb3ZlXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sdW1uXCIsXG4gIG1hdHJpeF9yb3c6IFwiUm93XCIsXG4gIG11bHRpcGxldGV4dF9pdGVtbmFtZTogXCJ0ZXh0XCIsXG4gIHNhdmluZ0RhdGE6IFwiVGhlIHJlc3VsdHMgYXJlIGJlaW5nIHNhdmVkIG9uIHRoZSBzZXJ2ZXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkFuIGVycm9yIG9jY3VycmVkIGFuZCB3ZSBjb3VsZCBub3Qgc2F2ZSB0aGUgcmVzdWx0cy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiVGhlIHJlc3VsdHMgd2VyZSBzYXZlZCBzdWNjZXNzZnVsbHkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJUcnkgYWdhaW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIllvdSBoYXZlIHNwZW50IHswfSBvbiB0aGlzIHBhZ2UgYW5kIHsxfSBpbiB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9uIHRoaXMgcGFnZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gaW4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJZb3UgaGF2ZSBzcGVudCB7MH0gb2YgezF9IG9uIHRoaXMgcGFnZSBhbmQgezJ9IG9mIHszfSBpbiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBvbiB0aGlzIHBhZ2UuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBpbiB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkNsZWFuXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJDbGVhclwiLFxuICBzaWduYXR1cmVQbGFjZUhvbGRlcjogXCJTaWduIGhlcmVcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiQ2hvb3NlIGZpbGVcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiUmVtb3ZlIHRoaXMgZmlsZVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIlllc1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTm9cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgZmlsZTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlIGFsbCBmaWxlcz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlF1ZXN0aW9uIFRpdGxlXCIsXG4gIG1vZGFsQ2FuY2VsQnV0dG9uVGV4dDogXCJDYW5jZWxcIixcbiAgbW9kYWxBcHBseUJ1dHRvblRleHQ6IFwiQXBwbHlcIixcbn07XG5cbi8vVW5jb21tZW50IHRoZXNlIHR3byBsaW5lcyBvbiBjcmVhdGluZyBhIHRyYW5zbGF0aW9uIGZpbGUuIFlvdSBzaG91bGQgcmVwbGFjZSBcImVuXCIgYW5kIGVuU3RyaW5ncyB3aXRoIHlvdXIgbG9jYWxlIChcImZyXCIsIFwiZGVcIiBhbmQgc28gb24pIGFuZCB5b3VyIHZhcmlhYmxlLlxuLy9zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImVuXCJdID0gZW5nbGlzaFN0cmluZ3M7XG4vL3N1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImVuXCJdID0gXCJFbmdsaXNoXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGVzdG9uaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlRhZ2FzaVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiRWRhc2lcIixcbiAgY29tcGxldGVUZXh0OiBcIkzDtXBldGFcIixcbiAgcHJldmlld1RleHQ6IFwiRWVsdmFhZGVcIixcbiAgZWRpdFRleHQ6IFwiTXV1ZGFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkFsdXN0YVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk11dSAodMOkcHN1c3RhKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTWl0dGUgbWlkYWdpXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlZhbGkga8O1aWtcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIkxlaGVrw7xsZyB7MH0vezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJLaXJqZSB7MH0vezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJWYXN0YXR1ZCB7MH0ga8O8c2ltdXN0IHsxfS1zdFwiLFxuICBlbXB0eVN1cnZleTogXCJTZWxsZXMgdXVyaW5ndXMgZWkgb2xlIMO8aHRraSBuw6RodGF2YXQgbGVoZWvDvGxnZSB2w7VpIGvDvHNpbXVzdC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJBaXTDpGgsIGV0IHZhc3Rhc2lkIGFua2VlZGlsZSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk1laWUgYW5kbWV0ZWwgb2xlZCBzYSBzZWxsZWxlIGFua2VlZGlsZSBqdWJhIHZhc3RhbnVkLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxhZW4gYW5rZWV0aS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWYWxpLi4uXCIsXG4gIHZhbHVlOiBcInbDpMOkcnR1c1wiLFxuICByZXF1aXJlZEVycm9yOiBcIlBhbHVuIHZhc3RhIGvDvHNpbXVzZWxlLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQYWx1biB2YXN0YSB2w6RoZW1hbHQgw7xoZWxlIGvDvHNpbXVzZWxlLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlBhbHVuIGFubmEgdmFzdHVzIGlnYWwgcmVhbC5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlNlZSBwZWFrcyBvbGVtYSBudW1icmlsaW5lIHbDpMOkcnR1cy5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQYWx1biBzaXNlc3RhIHbDpGhlbWFsdCB7MH0gdMOkaGVtw6Rya2kuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUGFsdW4gw6RyYSBzaXNlc3RhIHJvaGtlbSBrdWkgezB9IHTDpGhlbcOkcmtpLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlNpc2VzdGEgcGFsdW4gezB9IC0gezF9IHTDpGhlbcOkcmtpLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlNpc2VzdGEgcGxhdW4gdsOkaGVtYWx0IHswfSByaWRhLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJQYWx1biB2YWxpIHbDpGhlbWFsdCB7MH0gdmFyaWFudGkuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBhbHVuIHZhbGkga8O1aWdlIHJvaGtlbSB7MH0gdmFyaWFudGkuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBwZWFrcyBvbGVtYSB2w7VyZG5lIHbDtWkgc3V1cmVtIGt1aSB7MX0gamEgdsO1cmRuZSB2w7VpIHbDpGlrc2VtIGt1aSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBwZWFrcyBvbGVtYSB2w7VyZG5lIHbDtWkgc3V1cmVtIGt1aSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBwZWFrcyBvbGVtYSB2w7VybmRlIHbDtWkgdsOkaWtzZW0ga3VpIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiU2lzZXN0YSBwYWx1biBrb3JyZWt0bmUgZS1wb3N0aSBhYWRyZXNzLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJBdmFsZGlzOiB7MH0gcGVha3MgdGFnYXN0YW1hIHTDtWVzZS5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlRhb3RsdXMgdGFnYXN0YXMgdmVhIOKAnnswfeKAnS4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlRhb3RsdXMgdGFnYXN0YXMgdMO8aGphZCBhbmRtZWQgdsO1aSBhdHJpYnV1dCAncGF0aCcgb24gdmFsZVwiLFxuICBleGNlZWRNYXhTaXplOiBcIkZhaWxpIHN1dXJ1cyBlaSB0b2hpIMO8bGV0YWRhIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlNpc2VzdGEgcGFsdW4gbXV1IHZhc3R1cy5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIlNpbnUgZmFpbCBsYWViIMO8bGVzLiBQYWx1biBvb3RhIG3DtW5lZCBzZWt1bmRpZCBuaW5nIHByb292aSBzZWVqw6RyZWwgdXVlc3RpLlwiLFxuICBsb2FkaW5nRmlsZTogXCJMYWVuLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiVmFsaSBmYWlsKGlkKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiRmFpbGkgcG9sZSB2YWxpdHVkXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiS2FzIHRhaGFkIGtpcmplIGt1c3R1dGFkYT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJTZWUgdsOkw6RydHVzIHBlYWIgb2xlbWEgdW5pa2FhbG5lLlwiLFxuICBhZGRDb2x1bW46IFwiTGlzYSB2ZWVyZ1wiLFxuICBhZGRSb3c6IFwiTGlzYSByaWRhXCIsXG4gIHJlbW92ZVJvdzogXCJFZW1hbGRhXCIsXG4gIGFkZFBhbmVsOiBcIkxpc2EgdXVzXCIsXG4gIHJlbW92ZVBhbmVsOiBcIkVlbWFsZGFcIixcbiAgY2hvaWNlc19JdGVtOiBcIsO8a3N1c1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIlZlZXJnXCIsXG4gIG1hdHJpeF9yb3c6IFwiUmlkYVwiLFxuICBzYXZpbmdEYXRhOiBcIlNhbHZlc3RhbiBhbmRtZWQgc2VydmVyaXMuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIlRla2tpcyB2aWdhIG5pbmcgbWUgZWkgc2FhbnVkIHZhc3R1c2VpZCBzYWx2ZXN0YWRhLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJWYXN0dXN0ZSBzYWx2ZXN0YW1pbmUgw7VubmVzdHVzIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUHJvb3ZpIHV1ZXN0aVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiT2xlZCB2ZWV0bnVkIHswfSBzZWxsZWwgbGVoZWwgbmluZyBrb2trdSB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIk9sZWQgdmVldG51ZCB7MH0gc2VsbGVsIGxlaGVsLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIk9sZWQgdmVldG51ZCB7MH0ga29ra3UuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJPbGVkIGt1bHV0YW51ZCB7MH0gdsO1aW1hbGlrdXN0IHsxfSBzZWxsZWwgbGVoZWwgbmluZyB7Mn0gdsO1aW1hbGlrdXN0IHszfSBrb2trdS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiT2xlZCBrdWx1dGFudWQgezB9IHbDtWltYWxpa3VzdCB7MX0gc2VsbGVsIGxlaGVsLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIk9sZWQga3VsdXRhbnVkIHswfSB2w7VpbWFsaWt1c3QgezF9IGtvZ3VhamFzdC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIlB1aGFzdGFcIixcbiAgY2xlYXJDYXB0aW9uOiBcIlB1aGFzdGFcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiVmFsaSBmYWlsXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkVlbWFsZGEgc2VlIGZhaWxcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJKYWhcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIkVpXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIk9sZWQgc2Ega2luZGVsLCBldCBzb292aWQgc2VsbGUgZmFpbGkgZWVtYWxkYWRhOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCJPbGVkIHNhIGtpbmRlbCwgZXQgc29vdmlkIGVlbWFsZGFkYSBrw7VpayBmYWlsaWQ/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJLw7xzaW11c2UgcGVhbGtpcmlcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZXRcIl0gPSBlc3RvbmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJldFwiXSA9IFwiZWVzdGkga2VlbFwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBmaW5uaXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkVkZWxsaW5lblwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU2V1cmFhdmFcIixcbiAgY29tcGxldGVUZXh0OiBcIlZhbG1pc1wiLFxuICBwcmV2aWV3VGV4dDogXCJFc2lrYXRzZWx1XCIsXG4gIGVkaXRUZXh0OiBcIk11b2trYWFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkFsb2l0YVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk11dSAodGFya2VubmEpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJFaSBtaXTDpMOkblwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJWYWxpdHNlIGthaWtraVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2l2dSB7MH0gLyB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIk9zaW8gezB9IC8gezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJPbGV0IHZhc3Rhbm51dCB7MH0gLyB7MX0ga3lzeW15a3NlZW4uXCIsXG4gIGVtcHR5U3VydmV5OlxuICAgIFwiVMOkc3PDpCBreXNlbHlzc8OkIGVpIG9sZSB5aHTDpMOkbiBuw6RreXZpbGzDpCBvbGV2YWEgc2l2dWEgdGFpIGt5c3lteXN0w6QuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiS2lpdG9zIGt5c2VseXluIHZhc3RhYW1pc2VzdGEhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJUaWV0b2plbW1lIG11a2FhbiBvbGV0IGpvIHN1b3JpdHRhbnV0IHTDpG3DpG4ga3lzZWx5bi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJLeXNlbHnDpCBsYWRhdGFhbiBwYWx2ZWxpbWVsdGEuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVmFsaXRzZS4uLlwiLFxuICB2YWx1ZTogXCJhcnZvXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiVmFzdGFhIGt5c3lteWtzZWVuLCBraWl0b3MuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlZhc3RhYSBhaW5ha2luIHlodGVlbiBreXN5bXlrc2Vlbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWYXN0YWEga3lzeW15a3NpaW4ga2Fpa2lsbGEgcml2ZWlsbMOkLlwiLFxuICBudW1lcmljRXJyb3I6IFwiQXJ2b24gdHVsZWUgb2xsYSBudW1lZXJpbmVuLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlN5w7Z0w6QgdsOkaGludMOkw6RuIHswfSBtZXJra2nDpC5cIixcbiAgdGV4dE1heExlbmd0aDogXCLDhGzDpCBzecO2dMOkIHlsaSB7MH0gbWVya2tpw6QuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiU3nDtnTDpCB2w6RoaW50w6TDpG4gezB9IGphIGVuaW50w6TDpG4gezF9IG1lcmtracOkLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlTDpHl0w6QgdsOkaGludMOkw6RuIHswfSByaXZpw6QuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlZhbGl0c2UgdsOkaGludMOkw6RuIHswfSB2YWlodG9laHRvYS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVmFsaXRzZSBlbmludMOkw6RuIHswfSB2YWlodG9laHRvYS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIkx1dnVuICd7MH0nIHR1bGVlIG9sbGEgdsOkaGludMOkw6RuIHsxfSBqYSBrb3JrZWludGFhbiB7Mn0uXCIsXG4gIG51bWVyaWNNaW46IFwiTHV2dW4gJ3swfScgdHVsZWUgb2xsYSB2w6RoaW50w6TDpG4gezF9LlwiLFxuICBudW1lcmljTWF4OiBcIkx1dnVuICd7MH0nIHR1bGVlIG9sbGEga29ya2VpbnRhYW4gezF9LlwiLFxuICBpbnZhbGlkRW1haWw6IFwiU3nDtnTDpCB2YWxpZGkgc8OkaGvDtnBvc3Rpb3NvaXRlLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJMYXVzZWtrZWVuOiB7MH0gcGl0w6Rpc2kgcGFsYXV0dGFhICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlB5eW50w7YgcGFsYXV0dGkgdmlyaGVlbiB7MH0uIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJQeXludMO2IHBhbGF1dHRpIHR5aGrDpG4gdGllZG9zdG9uIHRhaSAncGF0aCctYXNldHVzIG9uIHbDpMOkcsOkXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiVGllZG9zdG9uIGtva28gZWkgc2FhIG9sbGEgc3V1cmVtcGkga3VpbiB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJUYXJrZW5uYSB2YXN0YXVzdGFzaSB0ZWtzdGlrZW50dMOkw6RuLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiVGllZG9zdG9hIGzDpGhldGV0w6TDpG4uIE9kb3RhIG11dXRhbWEgc2VrdW50aSBqYSB5cml0w6QgdXVkZWxsZWVuLlwiLFxuICBsb2FkaW5nRmlsZTogXCJMYWRhdGFhbi4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlZhbGl0c2UgdGllZG9zdG8odCkuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkVpIHRpZWRvc3RvYSB2YWxpdHR1bmFcIixcbiAgY29uZmlybURlbGV0ZTogXCJIYWx1YXRrbyBwb2lzdGFhIG9zaW9uP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlTDpG3DpCBhcnZvIG9uIGpvIGvDpHl0w7Zzc8OkLiBTecO2dMOkIHRvaW5lbiBhcnZvLlwiLFxuICBhZGRDb2x1bW46IFwiTGlzw6TDpCBzYXJha2VcIixcbiAgYWRkUm93OiBcIkxpc8Okw6Qgcml2aVwiLFxuICByZW1vdmVSb3c6IFwiUG9pc3RhXCIsXG4gIGVtcHR5Um93c1RleHQ6IFwiRWkgcml2ZWrDpFwiLFxuICBhZGRQYW5lbDogXCJMaXPDpMOkIHV1c2lcIixcbiAgcmVtb3ZlUGFuZWw6IFwiUG9pc3RhXCIsXG4gIGNob2ljZXNfSXRlbTogXCJrb2hkZVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIlNhcmFrZVwiLFxuICBtYXRyaXhfcm93OiBcIlJpdmlcIixcbiAgc2F2aW5nRGF0YTogXCJUaWV0b2phIHRhbGxlbm5ldGFhbiBwYWx2ZWxpbWVsbGUuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIlRhcGFodHVpIHZpcmhlLCBlbW1la8OkIHZvaW5lZXQgdGFsbGVudGFhIGt5c2VseW4gdGlldG9qYS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiVGllZG90IHRhbGxlbm5ldHRpaW4gb25uaXN0dW5lZXN0aSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIllyaXTDpCB1dWRlbGxlZW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIk9sZXQga8OkeXR0w6RueXQgezB9IHTDpGxsw6Qgc2l2dWxsYSBqYSB5aHRlZW5zw6QgezF9LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJPbGV0IGvDpHl0dMOkbnl0IHswfSB0w6RsbMOkIHNpdnVsbGEuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiT2xldCBrw6R5dHTDpG55dCB5aHRlZW5zw6QgezB9LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiT2xldCBrw6R5dHTDpG55dCB0w6RsbMOkIHNpdnVsbGEgezB9IC8gezF9IGphIHlodGVlbnPDpCB7Mn0gLyB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIk9sZXQga8OkeXR0w6RueXQgezB9IC8gezF9IHTDpGxsw6Qgc2l2dWxsYS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJPbGV0IGvDpHl0dMOkbnl0IHlodGVlbnPDpCB7MH0gLyB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJQeXloaVwiLFxuICBjbGVhckNhcHRpb246IFwiVHloamVubsOkXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlZhbGl0c2UgdGllZG9zdG9cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiUG9pc3RhIHTDpG3DpCB0aWVkb3N0b1wiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkt5bGzDpFwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiRWlcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiSGFsdWF0a28gdmFybWFzdGkgcG9pc3RhYSB0w6Rtw6RuIHRpZWRvc3RvbjogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiSGFsdWF0a28gdmFybWFzdGkgcG9pc3RhYSBrYWlra2kgdGllZG9zdG90P1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiS3lzeW15a3NlbiBvdHNpa2tvXCIsXG4gIG1vZGFsQ2FuY2VsQnV0dG9uVGV4dDogXCJQZXJ1dXRhXCIsXG4gIG1vZGFsQXBwbHlCdXR0b25UZXh0OiBcIkvDpHl0w6RcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZmlcIl0gPSBmaW5uaXNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImZpXCJdID0gXCJzdW9taVwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBmcmVuY2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHLDqWPDqWRlbnRcIixcbiAgcGFnZU5leHRUZXh0OiBcIlN1aXZhbnRcIixcbiAgY29tcGxldGVUZXh0OiBcIlRlcm1pbmVyXCIsXG4gIHByZXZpZXdUZXh0OiBcIkFwZXLDp3VcIixcbiAgZWRpdFRleHQ6IFwiTW9kaWZpZXJcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkNvbW1lbmNlclwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkF1dHJlIChwcsOpY2lzZXIpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJBdWN1blwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJUb3V0IHPDqWxlY3Rpb25uZXJcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2UgezB9IHN1ciB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIkVucmVnaXN0cmVtZW50IHswfSBzdXIgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJ7MH0vezF9IHF1ZXN0aW9uKHMpIHLDqXBvbmR1ZShzKVwiLFxuICBlbXB0eVN1cnZleTogXCJJbCBuJ3kgYSBuaSBwYWdlIHZpc2libGUgbmkgcXVlc3Rpb24gdmlzaWJsZSBkYW5zIGNlIHF1ZXN0aW9ubmFpcmVcIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJNZXJjaSBkJ2F2b2lyIHLDqXBvbmR1IGF1IHF1ZXN0aW9ubmFpcmUgIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIk5vcyBkb25uw6llcyBpbmRpcXVlbnQgcXVlIHZvdXMgYXZleiBkw6lqw6AgcmVtcGxpIGNlIHF1ZXN0aW9ubmFpcmUuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTGUgcXVlc3Rpb25uYWlyZSBlc3QgZW4gY291cnMgZGUgY2hhcmdlbWVudC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJDaG9pc2lzc2V6Li4uXCIsXG4gIHZhbHVlOiBcInZhbGV1clwiLFxuICByZXF1aXJlZEVycm9yOiBcIkxhIHLDqXBvbnNlIMOgIGNldHRlIHF1ZXN0aW9uIGVzdCBvYmxpZ2F0b2lyZS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiTWVyY2kgZGUgcsOpcG9uZHJlIGF1IG1vaW5zIMOgIHVuZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJUb3V0ZXMgbGVzIGxpZ25lcyBzb250IG9ibGlnYXRvaXJlc1wiLFxuICBudW1lcmljRXJyb3I6IFwiTGEgcsOpcG9uc2UgZG9pdCDDqnRyZSB1biBub21icmUuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiTWVyY2kgZGUgc2Fpc2lyIGF1IG1vaW5zIHswfSBjYXJhY3TDqHJlcy5cIixcbiAgdGV4dE1heExlbmd0aDogXCJNZXJjaSBkZSBzYWlzaXIgbW9pbnMgZGUgezB9IGNhcmFjdMOocmVzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIk1lcmNpIGRlIHNhaXNpciBlbnRyZSB7MH0gZXQgezF9IGNhcmFjdMOocmVzLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIk1lcmNpIGRlIGNvbXBsw6l0ZXIgYXUgbW9pbnMgezB9IGxpZ25lcy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiTWVyY2kgZGUgc8OpbGVjdGlvbm5lciBhdSBtaW5pbXVtIHswfSByw6lwb25zZXMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk1lcmNpIGRlIHPDqWxlY3Rpb25uZXIgYXUgbWF4aW11bSB7MH0gcsOpcG9uc2VzLlwiLFxuICBudW1lcmljTWluTWF4OiBcIlZvdHJlIHLDqXBvbnNlICd7MH0nIGRvaXQgw6p0cmUgc3Vww6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsxfSBldCBpbmbDqXJpZXVyZSBvdSDDqWdhbGUgw6AgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiVm90cmUgcsOpcG9uc2UgJ3swfScgZG9pdCDDqnRyZSBzdXDDqXJpZXVyZSBvdSDDqWdhbGUgw6AgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiVm90cmUgcsOpcG9uc2UgJ3swfScgZG9pdCDDqnRyZSBpbmbDqXJpZXVyZSBvdSDDqWdhbGUgw6AgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJNZXJjaSBkJ2VudHJlciB1bmUgYWRyZXNzZSBtYWlsIHZhbGlkZS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiTCdleHByZXNzaW9uOiB7MH0gZG9pdCByZXRvdXJuZXIgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgcmVxdcOqdGUgYSByZW52b3nDqSB1bmUgZXJyZXVyICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIkxhIHJlcXXDqnRlIGEgcmVudm95w6kgZGVzIGRvbm7DqWVzIHZpZGVzIG91IGxhIHByb3ByacOpdMOpICdwYXRoJyBlc3QgaW5jb3JyZWN0ZVwiLFxuICBleGNlZWRNYXhTaXplOiBcIkxhIHRhaWxsZSBkdSBmaWNoaWVyIG5lIGRvaXQgcGFzIGV4Y8OpZGVyIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIk1lcmNpIGRlIHByw6ljaXNlciBsZSBjaGFtcCAnQXV0cmUnLlwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIlZvdHJlIGZpY2hpZXIgZXN0IGVuIGNvdXJzIGRlIGNoYXJnZW1lbnQuIE1lcmNpIGQnYXR0ZW5kcmUgcXVlbHF1ZXMgc2Vjb25kZXMgZXQgZGUgcsOpZXNzYXllci5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiQ2hhcmdlbWVudC4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkFqb3V0ZXIgZGVzIGZpY2hpZXJzLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJBdWN1biBmaWNoaWVyIGFqb3V0w6lcIixcbiAgY29uZmlybURlbGV0ZTogXCJWb3VsZXotdm91cyBzdXBwcmltZXIgY2V0IGVucmVnaXN0cmVtZW50ID9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJDZXR0ZSB2YWxldXIgZG9pdCDDqnRyZSB1bmlxdWUuXCIsXG4gIGFkZENvbHVtbjogXCJBam91dGVyIHVuZSBjb2xvbm5lXCIsXG4gIGFkZFJvdzogXCJBam91dGVyIHVuZSBsaWduZVwiLFxuICByZW1vdmVSb3c6IFwiU3VwcHJpbWVyXCIsXG4gIGFkZFBhbmVsOiBcIkFqb3V0ZXJcIixcbiAgcmVtb3ZlUGFuZWw6IFwiU3VwcHJpbWVyXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sb25uZVwiLFxuICBtYXRyaXhfcm93OiBcIkxpZ25lXCIsXG4gIHNhdmluZ0RhdGE6IFwiTGVzIHLDqXN1bHRhdHMgc29udCBlbiBjb3VycyBkZSBzYXV2ZWdhcmRlIHN1ciBsZSBzZXJ2ZXVyLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJVbmUgZXJyZXVyIGVzdCBzdXJ2ZW51ZSBldCBhIGVtcMOqY2jDqSBsYSBzYXV2ZWdhcmRlIGRlcyByw6lzdWx0YXRzLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJMZXMgcsOpc3VsdGF0cyBvbnQgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqXMgIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUsOpZXNzYXllclwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gc3VyIGNldHRlIHBhZ2UgZXQgezF9IGF1IHRvdGFsLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBzdXIgY2V0dGUgcGFnZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBhdSB0b3RhbC5cIixcbiAgdGltZXJMaW1pdEFsbDogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBzdXIgezF9IHN1ciBjZXR0ZSBwYWdlIGV0IHsyfSBzdXIgezN9IGF1IHRvdGFsLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBzdXIgezF9IHN1ciBjZXR0ZSBwYWdlLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IHN1ciB7MX0gYXUgdG90YWwuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJOZXR0b3llclwiLFxuICBjbGVhckNhcHRpb246IFwiVmlkZXJcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiQWpvdXRlciB1biBmaWNoaWVyXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkVubGV2ZXIgY2UgZmljaGllclwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIk91aVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTm9uXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIsOKdGVzLXZvdXMgY2VydGFpbnMgZGUgdm91bG9pciBzdXBwcmltZXIgY2UgZmljaGllciA6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIsOKdGVzLXZvdXMgY2VydGFpbnMgZGUgdm91bG9pciBzdXBwcmltZXIgdG91cyBsZXMgZmljaGllcnM/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJUaXRyZSBkZSBsYSBxdWVzdGlvblwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmclwiXSA9IGZyZW5jaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJmclwiXSA9IFwiZnJhbsOnYWlzXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGdlb3JnaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIuGDo+GDmeGDkOGDnFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi4YOo4YOU4YOb4YOT4YOU4YOSXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLhg5Phg5Dhg6Hhg6Dhg6Phg5rhg5Thg5Hhg5BcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIuGDkuGDleGDlOGDoOGDk+GDmCB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi4YOQ4YOg4YOq4YOU4YOg4YOX4YOYIOGDmeGDmOGDl+GDruGDleGDkCDhg5Dhg6Ag4YOQ4YOg4YOY4YOhLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuGDkuGDm+GDkOGDk+GDmuGDneGDkeGDlyDhg5nhg5jhg5fhg67hg5Xhg5Dhg6Dhg5jhg6Eg4YOo4YOU4YOV4YOh4YOU4YOR4YOY4YOh4YOX4YOV4YOY4YOhIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIuGDqeGDkOGDouGDleGDmOGDoOGDl+GDleGDkCDhg6Hhg5Thg6Dhg5Xhg5Thg6Dhg5jhg5Phg5Dhg5wuLi5cIixcbiAgb3RoZXJJdGVtVGV4dDogXCLhg6Hhg67hg5Xhg5AgKOGDkuGDl+GDruGDneGDleGDlyDhg5vhg5jhg6Phg5fhg5jhg5fhg5Thg5cpXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIuGDkOGDoOGDqeGDlOGDleGDkC4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg6Phg57hg5Dhg6Hhg6Phg67hg5Thg5cg4YOZ4YOY4YOX4YOu4YOV4YOQ4YOhLlwiLFxuICBudW1lcmljRXJyb3I6IFwi4YOe4YOQ4YOh4YOj4YOu4YOYIOGDo+GDnOGDk+GDkCDhg5jhg6fhg53hg6Eg4YOg4YOY4YOq4YOu4YOV4YOYLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg6jhg5Thg5jhg6fhg5Xhg5Dhg5zhg5Thg5cg4YOQ4YOg4YOQ4YOc4YOQ4YOZ4YOa4YOU4YORIHswfSDhg6Hhg5jhg5vhg5Hhg53hg5rhg50uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg5Dhg5jhg6Dhg6nhg5jhg5Thg5cg4YOQ4YOg4YOQ4YOc4YOQ4YOZ4YOa4YOU4YORIHswfSDhg5Xhg5Dhg6Dhg5jhg5Dhg5zhg6Lhg5guXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg5Dhg5jhg6Dhg6nhg5jhg5Thg5cg4YOQ4YOg4YOQ4YOj4YOb4YOU4YOi4YOU4YOhIHswfSDhg5Xhg5Dhg6Dhg5jhg5Dhg5zhg6Lhg5guXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhIOGDm+GDlOGDouGDmCDhg5Dhg5wg4YOi4YOd4YOa4YOYLCDhg5Xhg5jhg5Phg6Dhg5QgezF9LCDhg5Phg5Ag4YOc4YOQ4YOZ4YOa4YOU4YOR4YOYIOGDkOGDnCDhg6Lhg53hg5rhg5gg4YOV4YOY4YOT4YOg4YOUIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIOGDo+GDnOGDk+GDkCDhg5jhg6fhg53hg6Eg4YOb4YOU4YOi4YOYIOGDkOGDnCDhg6Lhg53hg5rhg5gg4YOV4YOY4YOT4YOg4YOUIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIOGDo+GDnOGDk+GDkCDhg5jhg6fhg53hg6Eg4YOc4YOQ4YOZ4YOa4YOU4YOR4YOYIOGDkOGDnCDhg6Lhg53hg5rhg5gg4YOV4YOY4YOT4YOg4YOUIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDqOGDlOGDmOGDp+GDleGDkOGDnOGDneGDlyDhg5Thg5ouIOGDpOGDneGDoeGDouGDmOGDoSDhg6Dhg5Thg5Dhg5rhg6Phg6Dhg5gg4YOb4YOY4YOh4YOQ4YOb4YOQ4YOg4YOX4YOYLlwiLFxuICBvdGhlclJlcXVpcmVkRXJvcjogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOo4YOU4YOQ4YOV4YOh4YOU4YOXIOGDleGDlOGDmuGDmCAn4YOh4YOu4YOV4YOQJ1wiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImthXCJdID0gZ2VvcmdpYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wia2FcIl0gPSBcIuGDpeGDkOGDoOGDl+GDo+GDmuGDmFwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBnZXJtYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiWnVyw7xja1wiLFxuICBwYWdlTmV4dFRleHQ6IFwiV2VpdGVyXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJBYnNjaGxpZcOfZW5cIixcbiAgcHJldmlld1RleHQ6IFwiVm9yc2NoYXVcIixcbiAgZWRpdFRleHQ6IFwiQmVhcmJlaXRlblwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJTb25zdGlnZXMgKEJpdHRlIGFuZ2ViZW4pXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOaWNodHMgdHJpZmZ0IHp1XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIkFsbGVzIGF1c3fDpGhsZW5cIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNlaXRlIHswfSB2b24gezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJFaW50cmFnIHswfSB2b24gezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJ7MH0vezF9IEZyYWdlbiBiZWFudHdvcnRldFwiLFxuICBlbXB0eVN1cnZleTogXCJFcyBzaW5kIGtlaW5lIEZyYWdlbiB2b3JoYW5kZW4uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVmllbGVuIERhbmssIGRhc3MgU2llIGRpZSBVbWZyYWdlIGFiZ2VzY2hsb3NzZW4gaGFiZW4hXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJXaXIgaGFiZW4gZmVzdGdlc3RlbGx0LCBkYXNzIFNpZSBkaWVzZSBVbWZyYWdlIGJlcmVpdHMgYWJnZXNjaGxvc3NlbiBoYWJlbi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJVbWZyYWdlIHdpcmQgZ2VsYWRlbi4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJCaXR0ZSBhdXN3w6RobGVuLi4uXCIsXG4gIHZhbHVlOiBcIldlcnRcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJCaXR0ZSBiZWFudHdvcnRlbiBTaWUgZGllc2UgRnJhZ2UuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkJpdHRlIGJlYW50d29ydGVuIFNpZSBtaW5kZXN0ZW5zIGVpbmUgRnJhZ2UuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiQml0dGUgYmVhbnR3b3J0ZW4gU2llIGFsbGUgRnJhZ2VuLlwiLFxuICBudW1lcmljRXJyb3I6IFwiRGVyIFdlcnQgbXVzcyBlaW5lIFphaGwgc2Vpbi5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJCaXR0ZSBnZWJlbiBTaWUgbWluZGVzdGVucyB7MH0gWmVpY2hlbiBlaW4uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiQml0dGUgZ2ViZW4gU2llIG5pY2h0IG1laHIgYWxzIHswfSBaZWljaGVuIGVpbi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJCaXR0ZSBnZWJlbiBTaWUgbWluZGVzdGVucyB7MH0gdW5kIG1heGltYWwgezF9IFplaWNoZW4gZWluLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIkJpdHRlIG1hY2hlbiBTaWUgaW4gbWluZGVzdGVucyB7MH0gWmVpbGVuIGVpbmUgRWluZ2FiZS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiQml0dGUgd8OkaGxlbiBTaWUgbWluZGVzdGVucyB7MH0gQW50d29ydChlbikgYXVzLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJCaXR0ZSB3w6RobGVuIFNpZSBuaWNodCBtZWhyIGFscyB7MH0gQW50d29ydChlbikgYXVzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgbXVzcyBncsO2w59lciBvZGVyIGdsZWljaCB7MX0gdW5kIGtsZWluZXIgb2RlciBnbGVpY2ggezJ9IHNlaW5cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBtdXNzIGdyw7bDn2VyIG9kZXIgZ2xlaWNoIHsxfSBzZWluXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgbXVzcyBrbGVpbmVyIG9kZXIgZ2xlaWNoIHsxfSBzZWluXCIsXG4gIGludmFsaWRFbWFpbDogXCJCaXR0ZSBnZWJlbiBTaWUgZWluZSBnw7xsdGlnZSBFLU1haWwtQWRyZXNzZSBlaW4uXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkRlciBBdXNkcnVjazogezB9IG11c3MgZGVuIFdlcnQgJ3dhaHInIHp1csO8Y2tnZWJlbi5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkVpbiBOZXR6d2Vya2RpZW5zdCBoYXQgZm9sZ2VuZGVuIEZlaGxlciB6dXLDvGNrZ2VnZWJlbiAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkVpbmUgTmV0endlcmtkaWVuc3QgaGF0IHVuZ8O8bHRpZ2UgRGF0ZW4genVyw7xja2dlZ2ViZW5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJEaWUgRGF0ZWkgZGFyZiBuaWNodCBncsO2w59lciBhbHMgezB9IHNlaW4uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJCaXR0ZSBnZWJlbiBTaWUgZWluZW4gV2VydCBhbi5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkJpdHRlIHdhcnRlbiBTaWUgYmlzIGRlciBVcGxvYWQgSWhyZXIgRGF0ZWllbiBhYmdlc2NobG9zc2VuIGlzdC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiV2lyZCBob2NoZ2VsYWRlbi4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkRhdGVpKGVuKSBhdXN3w6RobGVuLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJLZWluZSBEYXRlaSBhdXNnZXfDpGhsdFwiLFxuICBjb25maXJtRGVsZXRlOiBcIldvbGxlbiBTaWUgZGVuIEVpbnRyYWcgbMO2c2NoZW4/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRGllc2VyIFdlcnQgbXVzcyBlaW5tYWxpZyBzZWluLlwiLFxuICBhZGRDb2x1bW46IFwiU3BhbHRlIGhpbnp1ZsO8Z2VuXCIsXG4gIGFkZFJvdzogXCJaZWlsZSBoaW56dWbDvGdlblwiLFxuICByZW1vdmVSb3c6IFwiRW50ZmVybmVuXCIsXG4gIGFkZFBhbmVsOiBcIk5ldSBoaW56dWbDvGdlblwiLFxuICByZW1vdmVQYW5lbDogXCJFbnRmZXJuZW5cIixcbiAgY2hvaWNlc19JdGVtOiBcIkVsZW1lbnRcIixcbiAgbWF0cml4X2NvbHVtbjogXCJTcGFsdGVcIixcbiAgbWF0cml4X3JvdzogXCJaZWlsZVwiLFxuICBzYXZpbmdEYXRhOiBcIkRpZSBFcmdlYm5pc3NlIHdlcmRlbiBhdWYgZGVtIFNlcnZlciBnZXNwZWljaGVydC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRXMgaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uIERpZSBFcmdlYm5pc3NlIGtvbm50ZW4gbmljaHQgZ2VzcGVpY2hlcnQgd2VyZGVuLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJEaWUgRXJnZWJuaXNzZSB3dXJkZW4gZ2VzcGVpY2hlcnQhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJFcm5ldXQgYWJzZW5kZW5cIixcbiAgdGltZXJNaW46IFwiTWluLlwiLFxuICB0aW1lclNlYzogXCJTZWsuXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiU2llIHdhcmVuIHswfSBhdWYgZGllc2VyIFNlaXRlIHVuZCBicmF1Y2h0ZW4gaW5zZ2VzYW10IHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiU2llIHdhcmVuIHswfSBhdWYgZGllc2VyIFNlaXRlLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlNpZSBoYWJlbiBpbnNnZXNhbXQgezB9IGdlYnJhdWNodC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIlNpZSB3YXJlbiB7MH0gdm9uIHsxfSBhdWYgZGllc2VyIFNlaXRlIHVuZCBicmF1Y2h0ZW4gaW5zZ2VzYW10IHsyfSB2b24gezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJTaWUgd2FyZW4gezB9IHZvbiB7MX0gYXVmIGRpZXNlciBTZWl0ZS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJTaWUgaGFiZW4gaW5zZ2VzYW10IHswfSB2b24gezF9IGdlYnJhdWNodC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkFsbGVzIGzDtnNjaGVuXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJBdXN3YWhsIGVudGZlcm5lblwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJEYXRlaSBhdXN3w6RobGVuXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkRhdGVpIGzDtnNjaGVuXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiSmFcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5laW5cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiU2luZCBTaWUgc2ljaGVyLCBkYXNzIFNpZSBkaWVzZSBEYXRlaSBsw7ZzY2hlbiBtw7ZjaHRlbjogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiU2luZCBTaWUgc2ljaGVyLCBkYXNzIFNpZSBhbGxlIERhdGVpZW4gbMO2c2NoZW4gbcO2Y2h0ZW4/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJGcmFnZW50aXRlbFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJkZVwiXSA9IGdlcm1hblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJkZVwiXSA9IFwiZGV1dHNjaFwiO1xuIiwiLy9DcmVhdGVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9hZ2Vsb3NwYW5hZ2lvdGFraXNcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZ3JlZWtTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwizqDPgc6/zrfOs86/z43OvM61zr3Ov1wiLFxuICBwYWdlTmV4dFRleHQ6IFwizpXPgM+MzrzOtc69zr9cIixcbiAgY29tcGxldGVUZXh0OiBcIs6fzrvOv866zrvOrs+Bz4nPg863XCIsXG4gIHByZXZpZXdUZXh0OiBcIs6gz4HOv861z4DOuc+DzrrPjM+AzrfPg863XCIsXG4gIGVkaXRUZXh0OiBcIs6Vz4DOtc6+zrXPgc6zzrHPg86vzrFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIs6Rz4HPh86uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwizobOu867zr8gKM+AzrHPgc6xzrrOsc67z44gzrTOuc61z4XOus+BzrnOvc6vz4PPhM61KVwiLFxuICBub25lSXRlbVRleHQ6IFwizprOsc69zq3Ovc6xz4JcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwizpXPgM65zrvOv86zzq4gz4zOu8+Jzr1cIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIs6jzrXOu86vzrTOsSB7MH0gzrHPgM+MIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwizpXOs86zz4HOsc+Gzq4gezB9IM6xz4DPjCB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIs6Rz4DOsc69z4TOrs64zrfOus6xzr0gezB9IC8gezF9IM61z4HPic+Ezq7Pg861zrnPglwiLFxuICBlbXB0eVN1cnZleTpcbiAgICBcIs6UzrXOvSDPhc+AzqzPgc+HzrXOuSDOus6xzrzOr86xIM6/z4HOsc+Ezq4gz4POtc67zq/OtM6xIM6uIM6/z4HOsc+Ezq4gzrXPgc+Oz4TOt8+Dzrcgz4POtSDOsc+Fz4TPjCDPhM6/IM61z4HPic+EzrfOvM6xz4TOv867z4zOs865zr8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6XG4gICAgXCLOlc+Fz4fOsc+BzrnPg8+Ezr/Pjc68zrUgzrPOuc6xIM+EzrfOvSDPg8+FzrzPgM67zq7Pgc+Jz4POtyDOsc+Fz4TOv8+NIM+Ezr/PhSDOtc+Bz4nPhM63zrzOsc+Ezr/Ou86/zrPOr86/z4UhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLOpM6xIM6xz4HPh861zq/OsSDOvM6xz4IgzrTOtc6vz4fOvc6/z4XOvSDPjM+Ezrkgzq3Ph861z4TOtSDOrs60zrcgzr/Ou86/zrrOu863z4HPjs+DzrXOuSDOsc+Fz4TOrs69IM+EzrfOvSDOrc+BzrXPhc69zrEuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwizqTOvyDOtc+Bz4nPhM63zrzOsc+Ezr/Ou8+MzrPOuc6/IM+Gzr/Pgc+Ez47Ovc61z4TOsc65IM6xz4DOvyDPhM6/IM60zrnOsc66zr/OvM65z4PPhM6uLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIs6Vz4DOuc67zq3Ovs+EzrUuLi5cIixcbiAgdmFsdWU6IFwizrHOvs6vzrFcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM6xz4DOsc69z4TOrs+Dz4TOtSDPg8+EzrfOvSDOtc+Bz47PhM63z4POty5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwizpHPgM6xzr3PhM6uz4PPhM61IM+DzrUgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSDOvM6vzrEgzrXPgc+Oz4TOt8+DzrcuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6XG4gICAgXCLOoM6xz4HOsc66zrHOu8+OIM6xz4DOsc69z4TOrs+Dz4TOtSDPg8+EzrnPgiDOtc+Bz4nPhM6uz4POtc65z4Igz4POtSDPjM67zrXPgiDPhM65z4IgzrPPgc6xzrzOvM6tz4IuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM6xz4HOuc64zrzOt8+EzrnOus6uLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIs6gzrHPgc6xzrrOsc67z44gz4PPhc68z4DOu863z4HPjs+Dz4TOtSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPg8+NzrzOss6/zrvOsS5cIixcbiAgdGV4dE1heExlbmd0aDogXCLOlc65z4POsc6zzqzOs861z4TOtSDOu865zrPPjM+EzrXPgc6/z4XPgiDOsc+Az4wgezB9IM+HzrHPgc6xzrrPhM6uz4HOtc+CLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIs6VzrnPg86xzrPOrM6zzrXPhM61IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/Phc+CIM6xz4DPjCB7MH0gzrrOsc65IM67zrnOs8+Mz4TOtc+Bzr/Phc+CIM6xz4DPjCB7MX0gz4fOsc+BzrHOus+Ezq7Pgc61z4IuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDPg8+FzrzPgM67zrfPgc+Oz4PPhM61IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM6zz4HOsc68zrzOrc+CLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM61z4DOuc67zq3Ovs+EzrUgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSB7MH0gz4DOsc+BzrHOu867zrHOs86tz4IuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gzrXPgM65zrvOrc6+z4TOtSDPjM+Hzrkgz4DOsc+BzrHPgM6szr3PiSDOsc+Azr8gezB9IM+AzrHPgc6xzrvOu86xzrPOrc+CLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwizqTOvyAnezB9JyDOuM6xIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzq/Pg86/IM6uIM68zrXOs86xzrvPjc+EzrXPgc6/IM6xz4DOvyDPhM6/IHsxfSDOus6xzrkgzq/Pg86/IM6uIM68zrnOus+Bz4zPhM61z4HOvyDOsc+Azr8gz4TOvyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCLOpM6/ICd7MH0nIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrzOtc6zzrHOu8+Nz4TOtc+Bzr8gzq4gzrnPg86/IM68zrUgz4TOvyB7MX1cIixcbiAgbnVtZXJpY01heDogXCLOpM6/ICd7MH0nIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrzOuc66z4HPjM+EzrXPgc6/IM6uIM6vz4POvyDOsc+Azr8gz4TOvyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIs6gzrHPgc6xzrrOsc67z44gzrTPjs+Dz4TOtSDOvM65zrEgzrHPgM6/zrTOtc66z4TOriDOtM65zrXPjc64z4XOvc+DzrcgZS1tYWlsLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLOlyDOrc66z4bPgc6xz4POtzogezB9IM64zrEgz4DPgc6tz4DOtc65IM69zrEgzrXPgM65z4PPhM+Bzq3PiM61zrkgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwizpcgzrHOr8+EzrfPg863IM61z4DOrc+Dz4TPgc61z4jOtSDPg8+GzqzOu868zrEgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLOlyDOsc6vz4TOt8+DzrcgzrXPgM6tz4PPhM+BzrXPiM61IM66zrXOvc6sIM60zrXOtM6/zrzOrc69zrEgzq4gzrcgzrnOtM65z4zPhM63z4TOsSAnzrzOv869zr/PgM6sz4TOuS9wYXRoJyDOtc6vzr3Osc65IM61z4PPhs6xzrvOvM6tzr3Ot1wiLFxuICBleGNlZWRNYXhTaXplOiBcIs6kzr8gzrzOrc6zzrXOuM6/z4IgzrTOtc69IM68z4DOv8+BzrXOryDOvc6xIM+Fz4DOtc+BzrLOsc6vzr3Otc65IM+EzrEgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDPg8+FzrzPgM67zrfPgc+Oz4PPhM61IM+EzrfOvSDPhM65zrzOriDOs865zrEgz4TOvyDPgM61zrTOr86/ICfOrM67zrvOvycuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLOpM6/IM6xz4HPh861zq/OvyDPg86xz4IgzrHOvc61zrLOsc6vzr3Otc65LiDOoM6xz4HOsc66zrHOu8+OIM+AzrXPgc65zrzOrc69zrXPhM61IM66zrHPgM6/zrnOsSDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEgzrrOsc65IM60zr/Ous65zrzOrM+Dz4TOtSDOvs6xzr3OrC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwizqbPjM+Bz4TPic+DzrcuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLOlc+AzrnOu86/zrPOriDOsc+Bz4fOtc6vz4nOvSAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIs6UzrXOvSDOrc+HzrXOuSDOtc+AzrnOu861zrPOtc6vIM6xz4HPh861zq/Ov1wiLFxuICBjb25maXJtRGVsZXRlOiBcIs6Yzq3Ou861z4TOtSDOvc6xIM60zrnOsc6zz4HOrM+IzrXPhM61IM+EzrfOvSDOtc6zzrPPgc6xz4bOrjtcIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLOkc+Fz4TOriDOtyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM68zr/Ovc6xzrTOuc66zq4uXCIsXG4gIGFkZENvbHVtbjogXCLOoM+Bzr/Pg864zq7Ous63IM+Dz4TOrs67zrfPglwiLFxuICBhZGRSb3c6IFwizqDPgc6/z4POuM6uzrrOtyDOs8+BzrHOvM68zq7PglwiLFxuICByZW1vdmVSb3c6IFwizpHPhs6xzq/Pgc61z4POt1wiLFxuICBhZGRQYW5lbDogXCLOoM+Bzr/Pg864zrXPg861IM69zrXOv1wiLFxuICByZW1vdmVQYW5lbDogXCLOkc+GzrHOuc+Bz45cIixcbiAgY2hvaWNlc19JdGVtOiBcIs61zq/OtM6/z4JcIixcbiAgbWF0cml4X2NvbHVtbjogXCLOo8+Ezq7Ou863XCIsXG4gIG1hdHJpeF9yb3c6IFwizqPOtc65z4HOrFwiLFxuICBzYXZpbmdEYXRhOiBcIs6kzrEgzrHPgM6/z4TOtc67zq3Pg868zrHPhM6xIM6xz4DOv864zrfOus61z43Ov869z4TOsc65IM+Dz4TOv869IM60zrnOsc66zr/OvM65z4PPhM6uIC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwizqDOsc+Bzr/Phc+DzrnOrM+Dz4TOt866zrUgz4PPhs6szrvOvM6xIM66zrHOuSDOtM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM6uIM63IM6xz4DOv864zq7Ous61z4XPg863IM+Ez4nOvSDOsc+Azr/PhM61zrvOtc+DzrzOrM+Ez4nOvS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwizqTOsSDOsc+Azr/PhM61zrvOrc+DzrzOsc+EzrEgzrHPgM6/zrjOt866zrXPjc+EzrfOus6xzr0gzrzOtSDOtc+AzrnPhM+Fz4fOr86xIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwizqDPgc6/z4PPgM6szrjOt8+DzrUgzr7Osc69zqxcIixcbiAgdGltZXJNaW46IFwizrXOu86sz4dcIixcbiAgdGltZXJTZWM6IFwizrTOtc+Fz4RcIixcbiAgdGltZXJTcGVudEFsbDogXCLOiM+HzrXPhM61IM60zrHPgM6xzr3Ors+DzrXOuSB7MH0gz4POtSDOsc+Fz4TOrs69IM+Ezrcgz4POtc67zq/OtM6xIM66zrHOuSB7MX0gz4PPhc69zr/Ou865zrrOrC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwizojPh861z4TOtSDOvs6/zrTOrc+IzrXOuSB7MH0gz4POtSDOsc+Fz4TOrs69IM+Ezrcgz4POtc67zq/OtM6xLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIs6Iz4fOtc+EzrUgzr7Ov860zq3PiM61zrkgz4PPhc69zr/Ou865zrrOrCB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLOiM+HzrXPhM61IM60zrHPgM6xzr3Ors+DzrXOuSB7MH0gzrHPgM+MIHsxfSDPg861IM6xz4XPhM6uzr0gz4TOtyDPg861zrvOr860zrEgzrrOsc65IHsyfSDOsc+Az4wgezN9IM+Dz4XOvc6/zrvOuc66zqwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIs6Iz4fOtc+EzrUgzr7Ov860zq3PiM61zrkgezB9IM6xz4DPjCB7MX0gz4POtSDOsc+Fz4TOrs69IM+Ezrcgz4POtc67zq/OtM6xLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIs6Iz4fOtc+EzrUgzr7Ov860zq3PiM61zrkgezB9IM6xz4DPjCB7MX0gz4PPhc69zr/Ou865zrrOrC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIs6azpHOmM6RzqHOl1wiLFxuICBjbGVhckNhcHRpb246IFwizqPOsc+Gzq5cIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwizpXPgM65zrvOrc6+z4TOtSDPhM6/IM6xz4HPh861zq/Ov1wiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLOms6xz4TOsc+BzrPOrs+Dz4TOtSDOsc+Fz4TPjCDPhM6/IM6xz4HPh861zq/Ov1wiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIs6dzrHOr1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwizp/Ph865XCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIs6Vzq/Pg8+EzrUgzrLOrc6yzrHOuc6/zrkgz4zPhM65IM64zq3Ou861z4TOtSDOvc6xIM66zrHPhM6xz4HOs86uz4POtc+EzrUgzrHPhc+Ez4wgz4TOvyDOsc+Bz4fOtc6vzr86IHswfTtcIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIs6Vzq/Pg8+EzrUgzrLOrc6yzrHOuc6/zrkgz4zPhM65IM64zq3Ou861z4TOtSDOvc6xIM66zrHPhM6xz4HOs86uz4POtc+EzrUgz4zOu86xIM+EzrEgzrHPgc+HzrXOr86xO1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwizqTOr8+EzrvOv8+CIM61z4HPjs+EzrfPg863z4JcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZ3JcIl0gPSBncmVla1N1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJnclwiXSA9IFwizrXOu867zrfOvc65zrrOrFwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBoZWJyZXdTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi15DXl9eV16jXlFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi16fXk9eZ157XlFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi16HXmdeV151cIixcbiAgcHJldmlld1RleHQ6IFwi16rXpteV15LXlCDXnten15PXmdee15RcIixcbiAgZWRpdFRleHQ6IFwi15zWt9ei1rLXqNeV1rnXmlwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi15TWt9eq15fWuNec1rjXlFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIteQ15fXqCAo16DXkCDXnNeq15DXqClcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIteQ16Mg15DXl9eTXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIteR15fXqCDXlNeb15xcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIteT16MgezF9INee16rXldeaIHswfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwi15TXp9ec15jXlCB7MH0g157XqteV15ogezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCLXoteg15Qg16LXnCDXqdeQ15zXldeqXCIsXG4gIGVtcHR5U3VydmV5OiBcIteQ15nXnyDXqdeQ15zXldeqXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi16rXldeT15Qg16LXnCDXnteZ15zXldeZINeU16nXkNec15XXnyFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIteU16jXqdeV157XldeqINep15zXoNeVINee16jXkNeV16og16nXm9eR16gg16HXmdeZ157XqiDXkNeqINeU16HXp9eoINeU15bXlC5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLXmNei15nXoNeUINee15TXqdeo16ouLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi15HXl9eoLi4uXCIsXG4gIHZhbHVlOiBcItei16jXmlwiLFxuICByZXF1aXJlZEVycm9yOiBcIteQ16DXkCDXlNep15Eg16LXnCDXlNep15DXnNeUXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIteQ16DXkCDXoteg15Qg15zXpNeX15XXqiDXotecINep15DXnNeUINeQ15fXqi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLXkNeg15Ag16LXoNeUINei15wg16nXkNec15XXqiDXkdeb15wg15TXqdeV16jXldeqLlwiLFxuICBudW1lcmljRXJyb3I6IFwi15TXqtep15XXkdeUINem16jXmdeb15Qg15zXlNeZ15XXqiDXnteh16TXqC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLXlNeW158g15zXpNeX15XXqiB7MH0g16rXldeV15nXnS5cIixcbiAgdGV4dE1heExlbmd0aDogXCLXlNeW158g16TXl9eV16og154tIHswfSDXqteV15XXmdedLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIteU15bXnyDXmdeV16rXqCDXni0gezB9INeV16TXl9eV16og154tIHsxfSDXqteV15XXmdedLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIteQ16DXkCDXntec15Ag15zXpNeX15XXqiB7MH0g16nXldeo15XXqi5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi15HXl9eoINec16TXl9eV16ogezB9INeQ16TXqdeo15XXmdeV16ouXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIteR15fXqCDXoteTIHswfSDXkNek16nXqNeV15nXldeqLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScg15fXmdeZ15Eg15zXlNeZ15XXqiDXqdeV15XXlCDXkNeVINeS15PXldecINeeIHsxfSwg15XXqdeV15XXlCDXnC0gezJ9INeQ15Ug16TXl9eV16og154tIHt9fVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nINeX15nXmdeRINec15TXmdeV16og16nXldeV15Qg15DXlSDXkteT15XXnCDXniB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDXl9eZ15nXkSDXnNeU15nXldeqINep15XXldeUINeQ15Ug16fXmNefINeeIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6ICfXlNeW158g15vXqteV15HXqiDXk9eV15BcItecINeX15XXp9eZ16ouJyxcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi15TXkdeZ15jXldeZOiB7MH0g16bXqNeZ15og15zXlNeX15bXmdeoICfXkNee16onLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi15TXkden16nXlCDXlNeX15bXmdeo15Qg15DXqiDXlNep15LXmdeQ15QgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLXlNeR16fXqdeUINeU15fXlteZ16jXlCDXoNeq15XXoNeZ150g16jXmden15nXnSDXkNeVINep15TXnteQ16TXmdeZ158gJ9eg16rXmdeRJyDXqdeS15XXmVwiLFxuICBleGNlZWRNYXhTaXplOiBcIteS15XXk9ecINeU16fXldeR16Ug15zXkCDXmdei15zXlCDXotecIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiAn16DXkCDXnNeU15bXmdefINeg16rXldeg15nXnSDXkdep15PXlCBcIteQ15fXqFwiJyxcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIteU16fXldeR16Ug16nXnNeaINeg15jXotefLiDXlNee16rXnyDXnteh16TXqCDXqdeg15nXldeqINeV16DXodeUINep15XXkS5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi15jXldei158uLi5cIixcbiAgY2hvb3NlRmlsZTogXCLXnNeR15fXldeoINen15HXpteZ150uLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcItec15Ag16DXkdeX16gg16fXldeR16VcIixcbiAgY29uZmlybURlbGV0ZTogXCLXlNeQ150g15DXqteUINeo15XXpteUINec157Xl9eV16cg15DXqiDXlNeo16nXldee15Q/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi16LXqNeaINeW15Qg16bXqNeZ15og15zXlNeZ15XXqiDXmdeZ15fXldeT15kuXCIsXG4gIGFkZENvbHVtbjogXCLXlNeV16HXoyDXotee15XXk9eUXCIsXG4gIGFkZFJvdzogXCLXnNeU15XXodeZ16Mg16nXldeo15RcIixcbiAgcmVtb3ZlUm93OiBcItec1rDXlNa316HWtNeZ16hcIixcbiAgYWRkUGFuZWw6IFwi15TXldeh16Mg15fXk9epXCIsXG4gIHJlbW92ZVBhbmVsOiBcItec1rDXlNa316HWtNeZ16hcIixcbiAgY2hvaWNlc19JdGVtOiBcItek16jXmdeYXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi15jXldeoXCIsXG4gIG1hdHJpeF9yb3c6IFwi16nXgdeV1rzXqNa415RcIixcbiAgc2F2aW5nRGF0YTogXCLXlNeq15XXpteQ15XXqiDXoNep157XqNeV16og15HXqdeo16ogLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLXkNeZ16jXoteUINep15LXmdeQ15Qg15XXnNeQINeU16bXnNeX16DXlSDXnNep157XldeoINeQ16og15TXqteV16bXkNeV16ouXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIteU16rXldem15DXldeqINeg16nXnteo15Ug15HXlNem15zXl9eUIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi16DXodeUINep15XXkVwiLFxuICB0aW1lck1pbjogXCLXk9en15RcIixcbiAgdGltZXJTZWM6IFwi16nXoNeZ15XXqlwiLFxuICB0aW1lclNwZW50QWxsOiBcIteU15XXpteQ16ogezB9INeR15PXoyDXlteUINeV15HXodeaINeU15vXnCB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIteU15XXpteQ16ogezB9INeR15PXoyDXlteULlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIteU15XXpteQ16og16HXm9eV150g15vXldec15wg16nXnCB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLXlNeV16bXkNeqIHswfSDXnteq15XXmiB7MX0g15HXk9ejINeW15Qg15UtIHsyfSDXnteq15XXmiB7M30g15HXodeaINeU15vXnC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi15TXldem15DXqiB7MH0g157XqteV15ogezF9INeR15PXoyDXlteULlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIteU15XXpteQ16og16HXm9eV150g15vXldec15wg16nXnCB7MH0g157XqteV15ogezF9LlwiLFxuICBjbGVhbkNhcHRpb246IFwi15zWsNeg1rfXp9eV1rnXqlwiLFxuICBjbGVhckNhcHRpb246IFwi15HXqNeV16hcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi15HXl9eoINen15XXkdelXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIteU16HXqCDXp9eV15HXpSDXlteUXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi15vXn1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwi15zXkFwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLXlNeQ150g15DXqteUINeR15jXldeXINep15HXqNem15XXoNeaINec15TXodeZ16gg16fXldeR16Ug15bXlDogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwi15TXkNedINeQ16rXlCDXkdeY15XXlyDXqdeR16jXpteV16DXmiDXnNeU16HXmdeoINeQ16og15vXnCDXlNen15HXpteZ150/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLXm9eV16rXqNeqINep15DXnNeUXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImhlXCJdID0gaGVicmV3U3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImhlXCJdID0gXCLXoteR16jXmdeqXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGhpbmRpU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIuCkquCkv+Ckm+CksuCkvlwiLFxuICBwYWdlTmV4dFRleHQ6IFwi4KSF4KSX4KSy4KS+XCIsXG4gIGNvbXBsZXRlVGV4dDogXCLgpKrgpYLgpLDgpL5cIixcbiAgcHJldmlld1RleHQ6IFwi4KSq4KWC4KSw4KWN4KS14KS44KSu4KWA4KSV4KWN4KS34KS+XCIsXG4gIGVkaXRUZXh0OiBcIuCkuOCkguCkquCkvuCkpuCkv+CkpFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi4KS24KWB4KSw4KWCXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi4KSm4KWC4KS44KSw4KS+ICjgpLXgpLDgpY3gpKPgpKgg4KSV4KSw4KWH4KSCKVwiLFxuICBub25lSXRlbVRleDogXCLgpJXgpYvgpIgg4KSo4KS54KWA4KSCXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIuCkuOCkreClgCDgpJXgpL4g4KSa4KSv4KSoIOCkleCksOClh+CkglwiLFxuICBwcm9ncmVzc1RleHQ6IFwi4KSq4KWD4KS34KWN4KSgIDEg4KSu4KWH4KSCIOCkuOClhyAwXCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCIg4KSm4KS44KWN4KSk4KS+4KS14KWH4KScIHsxfSDgpJXgpYcgezB9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJ7MX0g4KS44KS14KS+4KSy4KWL4KSCIOCkruClh+CkgiDgpLjgpYcgezB9IOCkleClhyDgpJzgpLXgpL7gpKwg4KSm4KS/4KSPXCIsXG4gIGVtcHR5U3VydmV5OiBcIuCkuOCksOCljeCkteClh+CkleCljeCkt+CkoyDgpK7gpYfgpIIg4KSV4KWL4KSIIOCkpuClg+CktuCljeCkr+CkruCkvuCkqCDgpKrgpYPgpLfgpY3gpKAg4KSv4KS+IOCkquCljeCksOCktuCljeCkqCDgpKjgpLngpYDgpIIg4KS54KWIXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi4KS44KSw4KWN4KS14KWH4KSV4KWN4KS34KSjIOCkleCliyDgpKrgpYLgpLDgpL4g4KSV4KSw4KSo4KWHIOCkleClhyDgpLLgpL/gpI8g4KSn4KSo4KWN4KSv4KS14KS+4KSmXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6IFwiIOCkueCkruCkvuCksOClhyDgpLDgpL/gpJXgpYngpLDgpY3gpKEg4KSs4KSk4KS+4KSk4KWHIOCkueCliOCkgiDgpJXgpL8g4KSG4KSqIOCkquCkueCksuClhyDgpLngpYAg4KSH4KS4IOCkuOCksOCljeCkteClh+CkleCljeCkt+CkoyDgpJXgpYsg4KSq4KWC4KSw4KS+IOCkleCksCDgpJrgpYHgpJXgpYcg4KS54KWI4KSCXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi4KS44KSw4KWN4KS14KWH4KSV4KWN4KS34KSjIOCkluClgeCksiDgpLDgpLngpL4g4KS54KWILuKAplwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLgpJrgpYHgpKjgpYfgpIJcIixcbiAgdmFsdWU6IFwi4KSu4KWC4KSy4KWN4KSvXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi4KSV4KWD4KSq4KSv4KS+IOCkquCljeCksOCktuCljeCkqCDgpJXgpL4g4KSJ4KSk4KWN4KSk4KSwIOCkpuClh+CkglwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLgpJXgpYPgpKrgpK/gpL4g4KSV4KSuIOCkuOClhyDgpJXgpK4g4KSP4KSVIOCkquCljeCksOCktuCljeCkqCDgpJXgpL4g4KSJ4KSk4KWN4KSk4KSwIOCkpuClh+CkglwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuCkleClg+CkquCkr+CkviDgpLjgpK3gpYAg4KSq4KSC4KSV4KWN4KSk4KS/4KSv4KWL4KSCIOCkruClh+CkgiDgpLjgpLXgpL7gpLLgpYvgpIIg4KSV4KWHIOCknOCkteCkvuCkrCDgpKbgpYfgpIJcIixcbiAgbnVtZXJpY0Vycm9yOiBcIuCkruClguCksuCljeCkryDgpLjgpILgpJbgpY3gpK/gpL7gpKTgpY3gpK7gpJUg4KS54KWL4KSo4KS+IOCkmuCkvuCkueCkv+Ckj1wiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuCkleClg+CkquCkr+CkviDgpJXgpK4g4KS44KWHIOCkleCkriB7MH0g4KS14KSw4KWN4KSjIOCkpuCksOCljeCknCDgpJXgpLDgpYfgpIJcIixcbiAgdGV4dE1heExlbmd0aDogXCLgpJXgpYPgpKrgpK/gpL4gezB9IOCkuOClhyDgpJXgpK4g4KS14KSw4KWN4KSjIOCkpuCksOCljeCknCDgpJXgpLDgpYfgpIJcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLgpJXgpYPgpKrgpK/gpL4gezB9IOCkuOClhyDgpIXgpKfgpL/gpJUg4KSU4KSwIHsxfSDgpLjgpYcg4KSV4KSuIOCkquCkvuCkpOCljeCksOCli+CkgiDgpK7gpYfgpIIg4KSq4KWN4KSw4KS14KWH4KS2IOCkleCksOClh+CkglwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuCkleClg+CkquCkr+CkviDgpJXgpK4g4KS44KWHIOCkleCkriB7MH0g4KSq4KSC4KSV4KWN4KSk4KS/4KSv4KWL4KSCIOCkleCliyDgpK3gpLDgpYfgpIJcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi4KSV4KWD4KSq4KSv4KS+IOCkleCkriDgpLjgpYcg4KSV4KSuIHswfSDgpLXgpL/gpJXgpLLgpY3gpKog4KSV4KS+IOCkmuCkr+CkqCDgpJXgpLDgpYfgpIJcIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi4KSV4KWD4KSq4KSv4KS+IHswfSDgpLXgpL/gpJXgpLLgpY3gpKrgpYvgpIIg4KS44KWHIOCkheCkp+Ckv+CklSDgpKjgpLngpYDgpIIg4KSa4KWB4KSo4KWH4KSCXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiJ3swfScgezF9IOCkuOClhyDgpKzgpLDgpL7gpKzgpLAg4KSv4KS+IOCkheCkp+Ckv+CklSDgpJTgpLAgezJ9IOCkuOClhyDgpKzgpLDgpL7gpKzgpLAg4KSv4KS+IOCkleCkriDgpLngpYvgpKjgpL4g4KSa4KS+4KS54KS/4KSPXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgezF9IOCkuOClhyDgpKzgpLDgpL7gpKzgpLAg4KSv4KS+IOCkheCkp+Ckv+CklSDgpLngpYvgpKjgpL4g4KSa4KS+4KS54KS/4KSPXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgezF9IOCkuOClhyDgpKzgpLDgpL7gpKzgpLAg4KSv4KS+IOCkleCkriDgpLngpYvgpKjgpL4g4KSa4KS+4KS54KS/4KSPXCIsXG4gIGludmFsaWRFbWFpbDogXCLgpJXgpYPgpKrgpK/gpL4g4KSP4KSVIOCkteCliOCkpyDgpIjgpK7gpYfgpLIg4KSq4KSk4KS+IOCkpuCksOCljeCknCDgpJXgpLDgpYfgpIJcIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi4KSF4KSt4KS/4KS14KWN4KSv4KSV4KWN4KSk4KS/OiB7MH0g4KSV4KWLICcg4KS44KSaICcg4KSy4KWM4KSf4KSo4KS+IOCkmuCkvuCkueCkv+Ckj1wiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi4KSF4KSo4KWB4KSw4KWL4KSnIOCksuCljOCkn+CkvuCkr+CkviDgpKTgpY3gpLDgpYHgpJ/gpL8gJ3swfScgLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIuCkheCkqOClgeCksOCli+CkpyDgpKjgpYcg4KSW4KS+4KSy4KWAIOCkoeClh+Ckn+CkviDgpLXgpL7gpKrgpLgg4KSV4KSwIOCkpuCkv+Ckr+CkviDgpLngpYggXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi4KSr4KS84KS+4KSH4KSyIOCkleCkviDgpIbgpJXgpL7gpLAgezB9IOCkuOClhyDgpIXgpKfgpL/gpJUg4KSo4KS54KWA4KSCIOCkueCli+CkqOCkviDgpJrgpL7gpLngpL/gpI8gIOCkr+CkviDgpKvgpL/gpLAgJ+CkquCkvuCkpScg4KSq4KWN4KSw4KWJ4KSq4KSw4KWN4KSf4KWAIOCkl+CksuCkpCDgpLngpYhcIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIuCkleClg+CkquCkr+CkviDgpKbgpYLgpLjgpLDgpL4g4KSu4KWC4KSy4KWN4KSvIOCkpuCksOCljeCknCDgpJXgpLDgpYfgpIJcIixcbiAgdXBsb2FkaW5nRmlsZTogXCLgpIbgpKrgpJXgpYAg4KSr4KS+4KSH4KSyIOCkheCkquCksuCli+CkoSDgpLngpYsg4KSw4KS54KWAIOCkueCliOClpCDgpJXgpYPgpKrgpK/gpL4g4KSV4KSIIOCkuOClh+CkleCkguCkoSDgpIfgpILgpKTgpJzgpL7gpLAg4KSV4KSw4KWH4KSCIOCklOCksCDgpKvgpL/gpLAg4KS44KWHIOCkquCljeCksOCkr+CkvuCkuCDgpJXgpLDgpYfgpILgpaRcIixcbiAgbG9hZGluZ0ZpbGU6IFwi4KSy4KWL4KSh4KS/4KSC4KSXXCIsXG4gIGNob29zZUZpbGU6IFwi4KSr4KS84KS+4KSH4KSyIOCkmuClgeCkqOClh+CkglwiLFxuICBub0ZpbGVDaG9zZW46IFwi4KSV4KWL4KSIIOCkq+CkvuCkh+CksiDgpKjgpLngpYDgpIIg4KSa4KWB4KSo4KWAIOCkl+CkiFwiLFxuICBjb25maXJtRGVsZXRlOiBcIuCkleCljeCkr+CkviDgpIbgpKog4KSw4KS/4KSV4KWJ4KSw4KWN4KShIOCkueCkn+CkvuCkqOCkviDgpJrgpL7gpLngpKTgpYcg4KS54KWI4KSCXCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi4KSv4KS5IOCkruCkvuCkqCDgpIXgpKjgpYvgpJbgpL4g4KS54KWL4KSo4KS+IOCkmuCkvuCkueCkv+Ckj1wiLFxuICBhZGRDb2x1bW46IFwi4KSV4KWJ4KSy4KSuIOCknOCli+CkoeCkvOClh+CkglwiLFxuICBhZGRSb3c6IFwi4KSq4KSC4KSV4KWN4KSk4KS/IOCknOCli+CkoeCkvOClh+CkglwiLFxuICByZW1vdmVSb3c6IFwi4KS54KSf4KS+4KSPXCIsXG4gIGFkZFBhbmVsOiBcIuCkqOCkr+CkviDgpJzgpYvgpKHgpLzgpYfgpIJcIixcbiAgcmVtb3ZlUGFuZWw6IFwi4KS54KSf4KS+4KSPXCIsXG4gIGNob2ljZXNfSXRlbTogXCLgpK7gpKZcIixcbiAgbWF0cml4X2NvbHVtbjogXCLgpJXgpYngpLLgpK5cIixcbiAgbWF0cml4X3JvdzogXCLgpKrgpILgpJXgpY3gpKTgpL9cIixcbiAgc2F2aW5nRGF0YTogXCLgpKrgpLDgpL/gpKPgpL7gpK4g4KS44KSw4KWN4KS14KSwIOCkquCksCDgpLjgpYfgpLUg4KS54KWLIOCksOCkueClhyDgpLngpYjgpIJcIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIuCkj+CklSDgpKTgpY3gpLDgpYHgpJ/gpL8g4KS54KWB4KSIIOCklOCksCDgpLngpK4g4KSq4KSw4KS/4KSj4KS+4KSu4KWL4KSCIOCkleCliyDgpKjgpLngpYDgpIIg4KS44KWH4KS1IOCkleCksCDgpLjgpJXgpYdcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi4KSq4KSw4KS/4KSj4KS+4KSuIOCkuOCkq+CksuCkpOCkvuCkquClguCksOCljeCkteCklSDgpLjgpYfgpLUg4KS54KWLIOCkl+Ckj1wiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi4KSr4KS/4KSwIOCkleCli+CktuCkv+CktiDgpJXgpLDgpYtcIixcbiAgdGltZXJNaW46IFwi4KSu4KS/4KSo4KSfXCIsXG4gIHRpbWVyU2VjOiBcIuCkuOClh+CkleCkguCkoVwiLFxuICB0aW1lclNwZW50QWxsOiBcIuCkhuCkquCkqOClhyDgpIfgpLgg4KSq4KWD4KS34KWN4KSgIOCkquCksCB7MH0g4KSW4KSw4KWN4KSaIOCkleCkv+CkjyDgpLngpYjgpIIg4KSU4KSwIOCkleClgeCksiB7MX1cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi4KSG4KSq4KSo4KWHIOCkh+CkuCDgpKrgpYPgpLfgpY3gpKAg4KSq4KSwIHswfSDgpJbgpLDgpY3gpJog4KSV4KS/4KSv4KS+IOCkueCliFwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIuCkhuCkquCkqOClhyDgpJXgpYHgpLIgezB9IOCkluCksOCljeCkmiDgpJXgpL/gpK/gpL4g4KS54KWIXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwi4KSG4KSq4KSo4KWHIOCkh+CkuCDgpKrgpYPgpLfgpY3gpKAg4KSq4KSwIHsxfSDgpJXgpYAgezB9IOCklOCksCDgpJXgpYHgpLIgezN9IOCkleClgCB7Mn0g4KSW4KSw4KWN4KSaIOCkleClgCDgpLngpYjgpaRcIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi4KSG4KSq4KSo4KWHIOCkh+CkuCDgpKrgpYPgpLfgpY3gpKAg4KSq4KSwIHsxfSDgpJXgpL4gezB9IOCkluCksOCljeCkmiDgpJXgpL/gpK/gpL4g4KS54KWIXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi4KSG4KSq4KSo4KWHIOCkleClgeCksiB7MX0g4KSV4KWAIHswfSDgpJbgpLDgpY3gpJog4KSV4KWAIOCkueCliFwiLFxuICBjbGVhbkNhcHRpb246IFwi4KS44KS+4KSrXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLgpLjgpY3gpKrgpLfgpY3gpJ9cIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi4KSr4KS84KS+4KSH4KSyIOCkmuClgeCkqOClh+CkglwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLgpIfgpLgg4KSr4KS+4KSH4KSyIOCkleCliyDgpKjgpL/gpJXgpL7gpLLgpYfgpIJcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLgpLngpL7gpIFcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIuCkqOCkueClgOCkglwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLgpJXgpY3gpK/gpL4g4KSG4KSqIOCkuOClgeCkqOCkv+CktuCljeCkmuCkv+CkpCDgpLngpYjgpIIg4KSV4KS/IOCkhuCkqiDgpIfgpLgg4KSr4KS84KS+4KSH4KSyIOCkleCliyDgpLngpJ/gpL7gpKjgpL4g4KSa4KS+4KS54KSk4KWHIOCkueCliOCkgjogezB9XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLgpJXgpY3gpK/gpL4g4KSG4KSqIOCkuOClgeCkqOCkv+CktuCljeCkmuCkv+CkpCDgpLngpYjgpIIg4KSV4KS/IOCkhuCkqiDgpLjgpK3gpYAg4KSr4KS84KS+4KSH4KSy4KWL4KSCIOCkleCliyDgpLngpJ/gpL7gpKjgpL4g4KSa4KS+4KS54KSk4KWHIOCkueCliOCkglwiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwi4KSq4KWN4KSw4KS24KWN4KSoIOCkleCkviDgpLbgpYDgpLDgpY3gpLfgpJVcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaGlcIl0gPSBoaW5kaVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJoaVwiXSA9IFwiaGluZGlcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaHVuZ2FyaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlZpc3N6YVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVG92w6FiYlwiLFxuICBjb21wbGV0ZVRleHQ6IFwiS8Opc3pcIixcbiAgcHJldmlld1RleHQ6IFwiRWzFkW7DqXpldFwiLFxuICBlZGl0VGV4dDogXCJTemVya2VzenTDqXNcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlJhanRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJFZ3nDqWIgKGFkamEgbWVnKVwiLFxuICBub25lSXRlbVRleHQ6IFwiRWd5aWsgc2VtXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIk1pbmRldCBraXbDoWxhc3p0XCIsXG4gIHByb2dyZXNzVGV4dDogXCJ7MH0uL3sxfSBvbGRhbFwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiezB9IC8gezF9IHJla29yZFwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiVsOhbGFzem9sdCBrw6lyZMOpc2VrOiB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiVGhlcmUgaXMgbm8gdmlzaWJsZSBwYWdlIG9yIHF1ZXN0aW9uIGluIHRoZSBzdXJ2ZXkuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiS8O2c3rDtm5qw7xrLCBob2d5IGtpdMO2bHTDtnR0ZSBmZWxtw6lyw6lzw7xua2V0IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIk3DoXIga2l0w7ZsdMO2dHRlIGEgZmVsbcOpcsOpc3QuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiRmVsbcOpcsOpcyBiZXTDtmx0w6lzZS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWw6FsYXNzem9uLi4uXCIsXG4gIHZhbHVlOiBcIsOpcnTDqWtcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJLw6lyasO8aywgdsOhbGFzem9samEgbWVnIGV6dCBhIGvDqXJkw6lzdCFcIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiS8OpcmrDvGssIHbDoWxhc3pvbGpvbiBsZWdhbMOhYmIgZWd5IGvDqXJkw6lzcmUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiS8OpcmrDvGsgYWRqb24gdsOhbGFzenQgbWluZGVuIHNvcmJhbiFcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkF6IMOpcnTDqWsgc3rDoW0ga2VsbCwgaG9neSBsZWd5ZW4hXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiQWRqb24gbWVnIGxlZ2Fsw6FiYiB7MH0ga2FyYWt0ZXJ0IVwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIkxlZ2ZlbGplYmIgezB9IGthcmFrdGVydCBhZGpvbiBtZWchXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiQWRqb24gbWVnIGxlZ2Fsw6FiYiB7MH0sIGRlIGxlZ2ZlbGplYmIgezF9IGthcmFrdGVydCFcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJUw7ZsdHPDtm4ga2kgbWluaW11bSB7MH0gc29ydCFcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVsOhbGFzc3pvbiBraSBsZWdhbMOhYmIgezB9IGxlaGV0xZFzw6lnZXQhXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk5lIHbDoWxhc3N6b24gdMO2YmJldCwgbWludCB7MH0gbGVoZXTFkXPDqWchXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBsZWd5ZW4gbmFneW9iYiwgdmFneSBlZ3llbmzFkSwgbWludCB7MX0gw6lzIGtpc2ViYiwgdmFneSBlZ3llbmzFkSwgbWludCB7Mn0hXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgbGVneWVuIGxlZ2Fsw6FiYiB7MX0hXCIsXG4gIG51bWVyaWNNYXg6IFwiVGhlICd7MH0nIG5lIGxlZ3llbiBuYWd5b2JiLCBtaW50IHsxfSFcIixcbiAgaW52YWxpZEVtYWlsOiBcIkFkam9uIG1lZyBlZ3kgdmFsw7NzIGVtYWlsIGPDrW1ldCFcIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiQSBrw7Z2ZXRrZXrFkSBraWZlamV6w6lzOiB7MH0gdmlzc3phIGtlbGwgYWRuaWEgYXog4oCeaWdheuKAnSDDqXJ0w6lrZXQuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJBIGxla8OpcmRlesOpcyBoaWLDoXZhbCB0w6lydCB2aXNzemE6ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQSBsZWvDqXJkZXrDqXMgw7xyZXMgYWRhdHRhbCB0w6lydCB2aXNzemEsIHZhZ3kgYSAncGF0aCcgcGFyYW3DqXRlciBoZWx5dGVsZW4uXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiQSBtw6lyZXQgbmVtIGxlaGV0IG5hZ3lvYmIsIG1pbnQgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQWRqYSBtZWcgYXogZWd5w6liIMOpcnTDqWtldCFcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZlbHTDtmx0w6lzIGZvbHlhbWF0YmFuLiBWw6Fyam9uIHDDoXIgbcOhc29kcGVyY2V0LCBtYWpkIHByw7Niw6FsamEgw7pqcmEuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkJldMO2bHTDqXMuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJGw6FqbG9rIGtpdsOhbGFzenTDoXNhIC4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTmluY3Mga2l2w6FsYXN6dHZhIGbDoWpsXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVMO2cmxpIGV6dCBhIHJla29yZG90P1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkF6IMOpcnTDqWtuZWsgZWd5ZWRpbmVrIGtlbGwgbGVubmllLlwiLFxuICBhZGRDb2x1bW46IFwiT3N6bG9wIGhvenrDoWFkw6FzYVwiLFxuICBhZGRSb3c6IFwiU29yIGhvenrDoWFkw6FzYVwiLFxuICByZW1vdmVSb3c6IFwiRWx0w6F2b2zDrXTDoXNcIixcbiAgYWRkUGFuZWw6IFwiw5pqIGhvenrDoWFkw6FzYVwiLFxuICByZW1vdmVQYW5lbDogXCJFbHTDoXZvbMOtdMOhc1wiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWxlbVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIk9zemxvcFwiLFxuICBtYXRyaXhfcm93OiBcIlNvclwiLFxuICBzYXZpbmdEYXRhOiBcIkVyZWRtw6lueSBtZW50w6lzZSBhIHN6ZXJ2ZXJyZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRWd5IGhpYmEgZm9seXTDoW4gbmVtIHR1ZHR1ayBlbG1lbnRlbmkgYXogZXJlZG3DqW55dC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiRXJlZG3DqW55IHNpa2VyZXNlbiBtZW50dmUhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcsOzYsOhbGphIMO6anJhXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCLDlm4gezB9IMO2c3N6ZWdldCBrw7ZsdMO2dHQgZXplbiBheiBvbGRhbG9uLCDDqXMgw7Zzc3plc2VuIHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiezB9IMO2c3N6ZWdldCBrw7ZsdMO2dHQgZXplbiBheiBvbGRhbG9uLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIsOWc3N6ZXNlbiB7MH0ga8O2bHTDtnR0LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiw5ZuIHswfSAvIHsxfSDDtnNzemVnZXQga8O2bHTDtnR0IGV6ZW4gYXogb2xkYWxvbiwgw6lzIMO2c3N6ZXNlbiB7Mn0gLyB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIsOWbiB7MH0gLyB7MX0gw7Zzc3plZ2V0IGvDtmx0w7Z0dCBlemVuIGF6IG9sZGFsb24uXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiw5Zzc3plc2VuIHswfSAvIHsxfSDDtnNzemVnZXQga8O2bHTDtnR0IGVsLlwiLFxuICBjbGVhbkNhcHRpb246IFwiVGlzenRhXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJFZ3nDqXJ0ZWxtxbFcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiVsOhbGFzc3ogZsOhamx0XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlTDoXZvbMOtdHNhIGVsIGV6dCBhIGbDoWpsdFwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIklnZW5cIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5lbVwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJCaXp0b3NhbiBlbHTDoXZvbMOtdGphIGV6dCBhIGbDoWpsdDogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiQml6dG9zYW4gZWwgYWthcmphIHTDoXZvbMOtdGFuaSBheiDDtnNzemVzIGbDoWpsdD9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIkvDqXJkw6lzIGPDrW1lXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImh1XCJdID0gaHVuZ2FyaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImh1XCJdID0gXCJtYWd5YXJcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaWNlbGFuZGljU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlRpbGJha2FcIixcbiAgcGFnZU5leHRUZXh0OiBcIsOBZnJhbVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiTG9racOwXCIsXG4gIHByZXZpZXdUZXh0OiBcIkZvcnNrb8OwYVwiLFxuICBlZGl0VGV4dDogXCJCcmV5dGFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkJ5cmphw7B1XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiSGlubiAoc2vDvXJpbmcpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJFbmdpbm5cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiVmVsamEgYWxsdFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU8Otw7BhIHswfSBvZiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlRha2EgdXBwIHswfSBhZiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIlN2YXJhw7AgezB9IC8gezF9IHNwdXJuaW5ndW1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiw55hw7AgZXIgZW5naW5uIHPDrcOwYSBlw7BhIHNwdXJuaW5nYXIgw60gw75lc3Nhcmkga8O2bm51bi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUYWtrIGZ5cmlyIGHDsCBmeWxsamEgw7p0IMO+ZXNzYSBrw7ZubnVuIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiU2tyw6FyIG9ra2FyIHPDvW5hIGHDsCDDvsO6IGhlZnVyIMO+ZWdhciBsb2tpw7Agw75lc3Nhcmkga8O2bm51bi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJLw7ZubnVuaW4gZXIgYcOwIGhsYcOwYS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWZWxkdS4uLlwiLFxuICB2YWx1ZTogXCJnaWxkaVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZpbnNhbWxlZ2FzdCBzdmFyacOwIHNwdXJuaW5ndW5uaS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiVmluc2FtbGVnYXN0IHN2YXJhw7B1IGHDsCBtaW5uc3RhIGtvc3RpIGVpbm5pIHNwdXJuaW5ndS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWaW5zYW1sZWdhc3Qgc3ZhcmnDsCBzcHVybmluZ3VtIMOtIMO2bGx1bSByw7bDsHVtLlwiLFxuICBudW1lcmljRXJyb3I6IFwiw55ldHRhIGdpbGRpIHZlcsOwdXIgYcOwIHZlcmEgdGFsYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLDnmHDsCDDpnR0aSBhw7AgdmVyYSBtaW5uc3QgezB9IHTDoWtuLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIG1lc3QgezB9IHTDoWtuLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIGZsZWlyaSBlbiB7MH0gb2cgZsOmcnJpIGVuIHsxfSB0w6Frbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJWaW5zYW1sZWdhc3QgZnlsbGnDsCDDunIgYcOwIG1pbm5zdGEga29zdGkgezB9IHJhw7Bpci5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVmluc2FtbGVnYXN0IHZlbGppw7AgYcOwIG1pbm5zdGEga29zdGkgezB9IG3Dtmd1bGVpa2EuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlZpbnNhbWxlZ2FzdCB2ZWxqacOwIGVra2kgZmxlaXJpIGVuIHswfSBtw7ZndWxlaWthLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgw6Z0dGkgYcOwIHZlcmEgbWVpcmEgZW4gZcOwYSBqYWZudCBvZyB7MX0gbWlubmEgZW4gZcOwYSBqYWZudCBvZyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJ7MH0nIMOmdHRpIGHDsCB2ZXJhIG1laXJhIGVuIGXDsGEgamFmbnQgb2cgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgw6Z0dGkgYcOwIHZlcmEgbWlubmEgZW4gZcOwYSBqYWZudCBvZyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlZpbnNhbWxlZ2FzdCBzbMOhacOwIGlubiBnaWx0IG5ldGZhbmcuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlRqw6FuaW5naW46IHswfSDDpnR0aSBhw7Agc2tpbGEgJ3NhdHQnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiQmVpw7BuaW5uIHNraWxhw7BpIGVmdGlyZmFyYW5hZGkgdmlsbHUgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiQmVpw7BuaW5uZyBza2lsYcOwaSBlbmd1bSBnw7ZnbnVtIGXDsGEgc2zDs8OwaW5uIHZhciByw7ZuZ1wiLFxuICBleGNlZWRNYXhTaXplOiBcIlNrcsOhaW5uIHNrYWwgZWtraSB2ZXJhIHN0w6ZycmkgZW4gezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVmluYW1sZWdhc3QgZnlsbGnDsCDDunQgaGl0dCBnaWxkacOwLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiU2tyw6Fpbm4gw77DrW4gdmFyIHNlbmQuIFZpbnNhbWxlZ2FzdCBiw63DsGnDsCDDrSBub2trcmFyIHNla8O6bmR1ciBvZyByZXluacOwIGFmdHVyLlwiLFxuICBsb2FkaW5nRmlsZTogXCJIbGXDsHVyIC4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlZlbGR1IHNrcsOhciAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkVuZ2luIHNrcsOhIHZhbGluXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVmlsdHUgZXnDsGEgc2tyw6Fubmk/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiw55ldHRhIGdpbGRpIMOmdHRpIGHDsCB2ZXJhIGVpbnN0YWt0LlwiLFxuICBhZGRDb2x1bW46IFwiQsOmdGEgdmnDsCBkw6Fsa2lcIixcbiAgYWRkUm93OiBcIkLDpnRhIHZpw7AgcsO2w7BcIixcbiAgcmVtb3ZlUm93OiBcIkZqYXJsw6ZnamFcIixcbiAgYWRkUGFuZWw6IFwiQsOmdGEgdmnDsCBuw71qdVwiLFxuICByZW1vdmVQYW5lbDogXCJGamFybMOmZ8OwdVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiaGx1dHVyXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiRMOhbGt1clwiLFxuICBtYXRyaXhfcm93OiBcIlLDtsOwXCIsXG5cbiAgc2F2aW5nRGF0YTogXCJOacOwdXJzdMO2w7B1cm5hciBlcnUgYcOwIHNwYXJhIMOhIG5ldMO+asOzbmludW0gLi4uIFwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiVmlsbGEga29tIHVwcCBvZyB2acOwIGfDoXR1bSBla2tpIHZpc3Rhw7AgbmnDsHVyc3TDtsOwdXJuYXIuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIsOBcmFuZ3VyaW5uIHZhciB2aXN0YcOwdXIgbWXDsCBnw7PDsHVtIMOhcmFuZ3JpIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUmV5bmR1IGFmdHVyXCIsXG4gIHRpbWVyTWluOiBcIm3DrW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiw57DuiBoZWZ1ciBleXR0IHswfSDDoSDDvmVzc2FyaSBzw63DsHUgb2cgezF9IHNhbXRhbHMuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIsOew7ogaGVmdXIgZXl0dCB7MH0gw6Egw75lc3Nhcmkgc8Otw7B1LlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIsOew7ogaGVmdXIgZXl0dCB7MH0gc2FtdGFscy5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIsOew7ogaGVmdXIgZXl0dCB7MH0gYWYgezF9IMOhIMO+ZXNzYXJpIHPDrcOwdSBvZyB7Mn0gYWYgezN9IHNhbXRhbHMuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIsOew7ogaGVmdXIgZXl0dCB7MH0gYWYgezF9IMOhIMO+ZXNzYXJpIHPDrcOwdS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLDnsO6IGhlZnVyIGV5dHQgezB9IGFmIHsxfSBzYW10YWxzLlwiLFxuICBjbGVhbkNhcHRpb246IFwiSHJlaW50XCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJIcmVpbnNhXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlZlbGR1IHNrcsOhXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkZqYXJsw6Znw7B1IMO+ZXNzYSBza3LDoVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkrDoVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTmVpXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkVydHUgdmlzcyB1bSBhw7Agw77DuiB2aWxqaXIgZmphcmzDpmdqYSDDvmVzc2Egc2tyw6E6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkVydHUgdmlzcyB1bSBhw7Agw77DuiB2aWxqaXIgZmphcmzDpmdqYSBhbGxhciBza3LDoXI/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJTcHVybmluZ2FydGl0aWxsXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImlzXCJdID0gaWNlbGFuZGljU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImlzXCJdID0gXCLDrXNsZW5za2FcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaW5kb25lc2lhblN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJTZWJlbHVtbnlhXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJTZWxhbmp1dG55YVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiU2VsZXNhaVwiLFxuICBwcmV2aWV3VGV4dDogXCJQcmF0aW5qYXVcIixcbiAgZWRpdFRleHQ6IFwiU3VudGluZ1wiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiTXVsYWlcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJMYWlubnlhIChqZWxhc2thbilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIlRpZGFrIEFkYVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJQaWxpaCBTZW11YVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiSGFsYW1hbiB7MH0gZGFyaSB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlJla2FtIHswfSBkYXJpIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiTWVuamF3YWIgcGVydGFueWFhbiB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiVGlkYWsgYWRhIGhhbGFtYW4gYXRhdSBwZXJ0YW55YWFuIGRhbGFtIHN1cnZlaS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUZXJpbWEga2FzaWggdGVsYWggbWVueWVsZXNhaWthbiBzdXJ2ZWkhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJDYXRhdGFuIGthbWkgbWVudW5qdWtrYW4gYmFod2EgQW5kYSB0ZWxhaCBtZW55ZWxlc2Fpa2FuIHN1cnZlaSBpbmkuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTWVtdWF0IHN1cnZlaS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJQaWxpaC4uLlwiLFxuICB2YWx1ZTogXCJuaWxhaVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlNpbGFoa2FuIGphd2FiIHBlcnRhbnlhYW4gYmVyaWt1dC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiU2lsYWhrYW4gamF3YWIgc2V0aWRha255YSBzYXR1IHBldGFueWFhbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJTaWxhaGthbiBqYXdhYiBwZXJ0YW55YWFuIHBhZGEgc2VtdWEgYmFyaXMuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJOaWxhaSBoYXJ1cyBiZXJ1cGEgYW5na2EuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiU2lsYWhrYW4gbWFzdWtrYW4gc2V0aWRha255YSB7MH0ga2FyYWt0ZXIuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiU2lsYWhrYW4gbWFzdWtrYW4ga3VyYW5nIHswfSBrYXJha3Rlci5cIixcbiAgdGV4dE1pbk1heExlbmd0aDpcbiAgICBcIlBTaWxhaGthbiBtYXN1a2thbiBsZWJpaCBkYXJpIHswfSBkYW4ga3VyYW5nIGRhcmkgezF9IGthcmFrdGVyLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlNpbGFoa2FuIGlzaSBzZXRpZGFrbnlhIHswfSBiYXJpcy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiU2lsYWhrYW4gcGlsaWggc2V0aWRha255YSB7MH0gdmFyaWFuLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJTaWxhaGthbiBwaWxpaCB0aWRhayBsZWJpaCBkYXJpIHswfSB2YXJpYW4uXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBoYXJ1cyBzYW1hIGRlbmdhbiBhdGF1IGxlYmloIGRhcmkgezF9IGRhbiBoYXJ1cyBzYW1hIGRlbmdhbiBhdGF1IGt1cmFuZyBkYXJpIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGhhcnVzIHNhbWEgZGVuZ2FuIGF0YXUgbGViaWggZGFyaSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBoYXJ1cyBzYW1hIGRlbmdhbiBhdGF1IGt1cmFuZyBkYXJpIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiU2lsYWhrYW4gbWFzdWtrYW4gZS1tYWlsIHlhbmcgYmVuYXIuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkVrc3ByZXNpOiB7MH0gaGFydXMgbWVuZ2VtYmFsaWthbiAnYmVuYXInLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUGVybWludGFhbiBtZW5nZW1iYWxpa2FuIGtlc2FsYWhhbiAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlBlcm1pbnRhYW4gbWVuZ2VtYmFsaWthbiBkYXRhIGtvc29uZyBhdGF1IHByb3BlcnRpICdwYXRoJyBzYWxhaC5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJVa3VyYW4gYmVya2FzIHRpZGFrIGJvbGVoIG1lbGViaWhpIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlNpbGFoa2FuIG1hc3Vra2FuIG5pbGFpIGxhaW5ubnlhLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiQmVya2FzIEFuZGEgc2VkYW5nIGRpdW5nZ2FoLiBTaWxhaGthbiB0dW5nZ3UgYmViZXJhcGEgc2FhdCBhdGF1IGNvYmEgbGFnaS5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiTWVtdWF0Li4uXCIsXG4gIGNob29zZUZpbGU6IFwiUGlsaWggYmVya2FzLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJUaWRhayBhZGEgZmlsZSB5YW5nIGRpcGlsaWhcIixcbiAgY29uZmlybURlbGV0ZTogXCJBcGFrYWggQW5kYSBpbmdpbiBtZW5naGFwdXMgY2F0YXRhbj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJOaWxhaSBoYXJ1cyB1bmlrLlwiLFxuICBhZGRDb2x1bW46IFwiVGFtYmFoIGtvbG9tXCIsXG4gIGFkZFJvdzogXCJUYW1iYWggYmFyaXNcIixcbiAgcmVtb3ZlUm93OiBcIkhhcHVzXCIsXG4gIGFkZFBhbmVsOiBcIlRhbWJhaCBiYXJ1XCIsXG4gIHJlbW92ZVBhbmVsOiBcIkhhcHVzXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sb21cIixcbiAgbWF0cml4X3JvdzogXCJCYXJpc1wiLFxuICBzYXZpbmdEYXRhOiBcIkhhc2lsIHNlZGFuZyBkaXNpbXBhbiBwYWRhIHNlcnZlci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiS2VzYWxhaGFuIHRlcmphZGkgZGFuIGthbWkgdGlkYWsgZGFwYXQgbWVueWltcGFuIGhhc2lsLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJIYXNpbCB0ZWxhaCBzdWtzZXMgZGlzaW1wYW4hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJDb2JhIGxhZ2lcIixcbiAgdGltZXJNaW46IFwibWVuaXRcIixcbiAgdGltZXJTZWM6IFwiZGV0aWtcIixcbiAgdGltZXJTcGVudEFsbDpcbiAgICBcIkFuZGEgdGVsYWggbWVuZ2hhYmlza2FuIHswfSBwYWRhIGhhbGFtYW4gaW5pIGRhbiB7MX0gc2VjYXJhIGtlc2VsdXJ1aGFuLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJZQW5kYSB0ZWxhaCBtZW5naGFiaXNrYW4gezB9IHBhZGEgaGFsYW1hbiBpbmkuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiQW5kYSB0ZWxhaCBtZW5naGFiaXNrYW4gezB9IHNlY2FyYSBrZXNlbHVydWhhbi5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkFuZGEgdGVsYWggbWVuZ2hhYmlza2FuIHswfSBkYXJpIHsxfSBwYWRhIGhhbGFtYW4gaW5pIGRhbiB7Mn0gZGFyaSB7M30gc2VjYXJhIGtlc2VsdXJ1aGFuLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJBbmRhIHRlbGFoIG1lbmdoYWJpc2thbiB7MH0gZGFyaSB7MX0gcGFkYSBoYWxhbWFuIGluaS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJBbmRhIHRlbGFoIG1lbmdoYWJpc2thbiB7MH0gZGFyaSB7MX0gc2VjYXJhIGtlc2VsdXJ1aGFuLlwiLFxuICBjbGVhbkNhcHRpb246IFwiQmVyc2loa2FuXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJCZXJzaWhrYW5cIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiUGlsaWggRmlsZVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJIYXB1cyBiZXJrYXMgaW5pXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiSXlhXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJUaWRha1wiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJBbmRhIHlha2luIGluZ2luIG1lbmdoYXB1cyBmaWxlIGluaTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiQW5kYSB5YWtpbiBpbmdpbiBtZW5naGFwdXMgc2VtdWEgZmlsZT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIkp1ZHVsIHBlcnRhbnlhYW5cIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaWRcIl0gPSBpbmRvbmVzaWFuU3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImlkXCJdID0gXCJiYWhhc2EgSW5kb25lc2lhXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGl0YWxpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJlY2VkZW50ZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU3VjY2Vzc2l2b1wiLFxuICBjb21wbGV0ZVRleHQ6IFwiU2FsdmFcIixcbiAgcHJldmlld1RleHQ6IFwiQW50ZXByaW1hXCIsXG4gIGVkaXRUZXh0OiBcIk1vZGlmaWNhXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJJbml6aW9cIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbHRybyAoZGVzY3JpdmkpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOZXNzdW5vXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlNlbGV6aW9uYSB0dXR0aVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSBkaSB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlJlY29yZCBkaSB7MH0gZGkgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJSaXNwb3N0ZSBhIHswfS97MX0gZG9tYW5kZVwiLFxuICBlbXB0eVN1cnZleTogXCJOb24gY2kgc29ubyBwYWdpbmUgbyBkb21hbmRlIHZpc2liaWxpIG5lbCBxdWVzdGlvbmFyaW8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3JhemllIHBlciBhdmVyIGNvbXBsZXRhdG8gaWwgcXVlc3Rpb25hcmlvIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiSSBub3N0cmkgcmVjb3JkcyBtb3N0cmFubyBjaGUgaGFpIGdpw6AgY29tcGxldGF0byBxdWVzdG8gcXVlc3Rpb25hcmlvLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkNhcmljYW1lbnRvIGRlbCBxdWVzdGlvbmFyaW8gaW4gY29yc28uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2NlZ2xpLi4uXCIsXG4gIHZhbHVlOiBcInZhbG9yZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIkNhbXBvIG9iYmxpZ2F0b3Jpb1wiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQZXIgRmF2b3JlLCByaXNwb25kaSBhZCBhbG1lbm8gdW5hIGRvbWFuZGEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiQ29tcGxldGFyZSB0dXR0ZSBsZSByaWdoZVwiLFxuICBudW1lcmljRXJyb3I6IFwiSWwgdmFsb3JlIGRldmUgZXNzZXJlIG51bWVyaWNvXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiSW5zZXJpcmUgYWxtZW5vIHswfSBjYXJhdHRlcmlcIixcbiAgdGV4dE1heExlbmd0aDogXCJMdW5naGV6emEgbWFzc2ltYSBjb25zZW50aXRhIHswfSBjYXJhdHRlcmlcIixcbiAgdGV4dE1pbk1heExlbmd0aDpcbiAgICBcIkluc2VyaXJlIHVuYSBzdHJpbmdhIGNvbiBtaW5pbW8gezB9IGUgbWFzc2ltbyB7MX0gY2FyYXR0ZXJpXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiQ29tcGxldGFyZSBhbG1lbm8gezB9IHJpZ2hlLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTZWxlemlvbmFyZSBhbG1lbm8gezB9IHZhcmlhbnRpLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJTZWxlemlvbmFyZSBtYXNzaW1vIHswfSB2YXJpYW50aS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIHN1cGVyaW9yZSBhIHsxfSBlIHVndWFsZSBvIGluZmVyaW9yZSBhIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIHN1cGVyaW9yZSBhIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIGRldmUgZXNzZXJlIHVndWFsZSBvIGluZmVyaW9yZSBhIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiSW5zZXJpcmUgaW5kaXJpenpvIG1haWwgdmFsaWRvXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkwnZXNwcmVzc2lvbmU6IHswfSBkb3ZyZWJiZSB0b3JuYXJlICd2ZXJvJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkxhIHJpY2hpZXN0YSBoYSByaXNwb3N0byBjb24gdW4gZXJyb3JlICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiTGEgcmljaGllc3RhIGhhIHJpc3Bvc3RvIG51bGwgb3BwdXJlIGlsIHBlcmNvcnNvIG5vbiDDqCBjb3JyZXR0b1wiLFxuICBleGNlZWRNYXhTaXplOiBcIklsIGZpbGUgbm9uIHB1w7IgZWNjZWRlcmUgezB9XCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJJbnNlcmlyZSBpbCB2YWxvcmUgJ2FsdHJvJ1wiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRmlsZSBpbiBjYXJpY2FtZW50by4gQXR0ZW5kaSBhbGN1bmkgc2Vjb25kaSBlIHJpcHJvdmFcIixcbiAgbG9hZGluZ0ZpbGU6IFwiQ2FyaWNhbWVudG8uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJTZWxlemlvbmFyZSBmaWxlKHMpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJOZXNzdW4gZmlsZSBzZWxlemlvbmF0b1wiLFxuICBjb25maXJtRGVsZXRlOiBcIlNlaSBzaWN1cm8gZGkgdm9sZXIgZWxtaW5hcmUgaWwgcmVjb3JkP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlF1ZXN0byB2YWxvcmUgZGV2ZSBlc3NlcmUgdW5pdm9jby5cIixcbiAgYWRkQ29sdW1uOiBcIkFnZ2l1bmdpIGNvbG9ubmFcIixcbiAgYWRkUm93OiBcIkFnZ2l1bmdpIHJpZ2FcIixcbiAgcmVtb3ZlUm93OiBcIlJpbXVvdmkgcmlnYVwiLFxuICBhZGRQYW5lbDogXCJBZ2dpdW5naSByaWdhXCIsXG4gIHJlbW92ZVBhbmVsOiBcIkVsaW1pbmFcIixcbiAgY2hvaWNlc19JdGVtOiBcIkVsZW1lbnRvXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sb25uYVwiLFxuICBtYXRyaXhfcm93OiBcIlJpZ2FcIixcbiAgc2F2aW5nRGF0YTogXCJTYWx2YXRhZ2dpbyBkYXRpIHN1bCBzZXJ2ZXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIlNpIMOoIHZlcmlmaWNhdG8gdW4gZXJyb3JlIGUgbm9uIMOoIHN0YXRvIHBvc3NpYmlsZSBzYWx2YXJlIGkgcmlzdWx0YXRpLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJJIHJpc3VsdGF0aSBzb25vIHN0YXRpIHNhbHZhdGkgY29uIHN1Y2Nlc3NvIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUmlwcm92YVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiSGFpIGltcGllZ2F0byB7MH0gc3UgcXVlc3RhIHBhZ2luYSBlIHsxfSBpbiB0b3RhbGUuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkhhaSBpbXBpZWdhdG8gezB9IHN1IHF1ZXN0YSBwYWdpbmEuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiSGFpIGltcGllZ2F0byB7MH0gaW4gdG90YWxlLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IHN1IHF1ZXN0YSBwYWdpbmEgZSB7Mn0gZGkgezN9IGluIHRvdGFsZS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IHN1IHF1ZXN0YSBwYWdpbmEuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiSGFpIGltcGllZ2F0byB7MH0gZGkgezF9IGluIHRvdGFsZS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIlB1bGlzY2lcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkNhbmNlbGxhXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlNjZWdsaWVyZSBpbCBmaWxlXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlJpbXVvdmVyZSBxdWVzdG8gZmlsZVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIlPDrFwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTm9cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiU2VpIHNpY3VybyBkaSB2b2xlciBlbG1pbmFyZSBxdWVzdG8gZmlsZTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiU2VpIHNpY3VybyBkaSB2b2xlciBlbG1pbmFyZSB0dXR0aSBpIGZpbGVzP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiVGl0b2xvIGRlbGxhIGRvbWFuZGFcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaXRcIl0gPSBpdGFsaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIml0XCJdID0gXCJpdGFsaWFub1wiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcclxuXHJcbmV4cG9ydCB2YXIgamFwYW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xyXG4gIHBhZ2VQcmV2VGV4dDogXCLliY3jgbhcIixcclxuICBwYWdlTmV4dFRleHQ6IFwi5qyh44G4XCIsXHJcbiAgY29tcGxldGVUZXh0OiBcIuWujOS6hlwiLFxyXG4gIHByZXZpZXdUZXh0OiBcIuODl+ODrOODk+ODpeODvFwiLFxyXG4gIGVkaXRUZXh0OiBcIue3qOmbhlwiLFxyXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLjgrnjgr/jg7zjg4hcIixcclxuICBvdGhlckl0ZW1UZXh0OiBcIuOBneOBruS7lu+8iOiqrOaYju+8iVwiLFxyXG4gIG5vbmVJdGVtVGV4dDogXCLjgarjgZdcIixcclxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLjgZnjgbnjgabpgbjmip5cIixcclxuICBwcm9ncmVzc1RleHQ6IFwiezB9L3sxfemggVwiLFxyXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJ7MX3jga57MH3jgpLoqJjpjLLjgZnjgotcIixcclxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiezB9L3sxfeOBruizquWVj+OBq+WbnuetlOOBl+OBvuOBl+OBn+OAglwiLFxyXG4gIGVtcHR5U3VydmV5OiBcIuOBk+OBruiqv+afu+OBq+ihqOekuuOBp+OBjeOCi+ODmuODvOOCuOOChOizquWVj+OBr+OBguOCiuOBvuOBm+OCk1wiLFxyXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi6Kq/5p+744KS5a6M5LqG44GX44Gm44GP44KM44Gm44GC44KK44GM44Go44GG44GU44GW44GE44G+44GX44GfXCIsXHJcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcclxuICAgIFwi5b2T56S+44Gu6KiY6Yyy44Gr44KI44KL44Go44CB44GT44Gu6Kq/5p+744Gv44GZ44Gn44Gr5a6M5LqG44GX44Gm44GE44G+44GZ44CCXCIsXHJcbiAgbG9hZGluZ1N1cnZleTogXCLoqr/mn7vjgpLjg4Djgqbjg7Pjg63jg7zjg4nkuK1cIixcclxuICBvcHRpb25zQ2FwdGlvbjogXCLpgbjmip5cIixcclxuICB2YWx1ZTogXCLlgKTmiZPjgaFcIixcclxuICByZXF1aXJlZEVycm9yOiBcIuizquWVj+OBq+OBiuetlOOBiOS4i+OBleOBhFwiLFxyXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIuacgOS9juOBp+OCgjHjgaTjga7os6rllY/jgavnrZTjgYjjgabjgY/jgaDjgZXjgYTjgIJcIixcclxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuizquWVj+OBq+OBr+WFqOWIl+OBp+WbnuetlOOBl+OBpuOBj+OBoOOBleOBhOOAglwiLFxyXG4gIG51bWVyaWNFcnJvcjogXCLmlbDlrZfjgafjgZToqJjlhaXkuIvjgZXjgYRcIixcclxuICB0ZXh0TWluTGVuZ3RoOiBcInswfSDmloflrZfku6XkuIrjgaflhaXlipvjgZfjgabkuIvjgZXjgYRcIixcclxuICB0ZXh0TWF4TGVuZ3RoOiBcInswfeaWh+Wtl+S7peS4i+OBp+WFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAglwiLFxyXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiezB95Lul5LiKezF95pyq5rqA44Gu5paH5a2X44KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GE44CCXCIsXHJcbiAgbWluUm93Q291bnRFcnJvcjogXCJ7MH3ooYzku6XkuIrjgaflhaXlipvjgZfjgabkuIvjgZXjgYRcIixcclxuICBtaW5TZWxlY3RFcnJvcjogXCJ7MH3nqK7poZ7ku6XkuIrjgpLpgbjmip7jgZfjgabkuIvjgZXjgYRcIixcclxuICBtYXhTZWxlY3RFcnJvcjogXCJ7MH3ku6XkuIrjga7jg5Djg6rjgqLjg7Pjg4jjgpLpgbjmip7jgZfjgarjgYTjgafjgY/jgaDjgZXjgYTjgIJcIixcclxuICBudW1lcmljTWluTWF4OlxyXG4gICAgXCJ7MH3jga97MX3ku6XkuIrjgafjgYLjgorjgIF7Mn3ku6XkuIvjgafjgYLjgovjgZPjgajjgYzmnJvjgb7jgZfjgYTjgIJcIixcclxuICBudW1lcmljTWluOiBcIid7MH0nIOOBr+WQjOetieOBi3sxfeOCiOOCiuWkp+OBjeOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCk1wiLFxyXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg44Gv5ZCM562J44GLezF944KI44KK5bCP44GV44GP44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KTXCIsXHJcbiAgaW52YWxpZEVtYWlsOiBcIuacieWKueOBquODoeODvOODq+OCouODieODrOOCueOCkuOBlOiomOWFpeS4i+OBleOBhFwiLFxyXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIuW8j+OBryB7MH3jga8ndHJ1ZSfjgpLov5TjgZnjgbnjgY3jgafjgZnjgIJcIixcclxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi44Oq44Kv44Ko44K544OI44Gv44Ko44Op44O8ICd7MH0nIOOCkui/lOOBl+OBvuOBl+OBn+OAgnsxfVwiLFxyXG4gIHVybEdldENob2ljZXNFcnJvcjpcclxuICAgIFwi44Oq44Kv44Ko44K544OI44GM56m644Gu44OH44O844K/44KS6L+U44GX44Gf44GL44CBJ3BhdGgnIOODl+ODreODkeODhuOCo+OBjOato+OBl+OBj+OBguOCiuOBvuOBm+OCk+OAglwiLFxyXG4gIGV4Y2VlZE1heFNpemU6IFwi44OV44Kh44Kk44Or44Gu44K144Kk44K644GvezB944KS6LaF44GI44Gm44Gv44GE44GR44G+44Gb44KTXCIsXHJcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIuOBneOBruS7luOBruWApOOCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAglwiLFxyXG4gIHVwbG9hZGluZ0ZpbGU6XHJcbiAgICBcIuODleOCoeOCpOODq+OCkuOCouODg+ODl+ODreODvOODieS4reOBp+OBmeOAguOBl+OBsOOCieOBj+OBl+OBpuOBi+OCieWGjeW6puOBiuippuOBl+S4i+OBleOBhFwiLFxyXG4gIGxvYWRpbmdGaWxlOiBcIuiqreOBv+i+vOOBv+S4rVwiLFxyXG4gIGNob29zZUZpbGU6IFwi44OV44Kh44Kk44Or44KS6YG45oqeXCIsXHJcbiAgbm9GaWxlQ2hvc2VuOiBcIumBuOaKnuOBleOCjOOBn+ODleOCoeOCpOODq+OBr+OBguOCiuOBvuOBm+OCk1wiLFxyXG4gIGNvbmZpcm1EZWxldGU6IFwi44Os44Kz44O844OJ44KS5YmK6Zmk44GX44G+44GZ44GL77yfXCIsXHJcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLjgZPjga7lgKTjga/kuIDmhI/jgafjgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpPjgIJcIixcclxuICBhZGRDb2x1bW46IFwi5YiX44Gu6L+95YqgXCIsXHJcbiAgYWRkUm93OiBcIui/veWKoOihjFwiLFxyXG4gIHJlbW92ZVJvdzogXCLpmaTljrtcIixcclxuICBhZGRQYW5lbDogXCLmlrDopo/ov73liqBcIixcclxuICByZW1vdmVQYW5lbDogXCLpmaTljrtcIixcclxuICBjaG9pY2VzX0l0ZW06IFwi5ZOB55uuXCIsXHJcbiAgbWF0cml4X2NvbHVtbjogXCLjgrPjg6njg6BcIixcclxuICBtYXRyaXhfcm93OiBcIuihjFwiLFxyXG4gIHNhdmluZ0RhdGE6IFwi57WQ5p6c44Gv44K144O844OQ44O844Gr5L+d5a2Y44GV44KM44Gm44GE44G+44GZLi4u44CCXCIsXHJcbiAgc2F2aW5nRGF0YUVycm9yOiBcIuOCqOODqeODvOOBjOeZuueUn+OBl+OAgee1kOaenOOCkuS/neWtmOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn+OAglwiLFxyXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIue1kOaenOOBr+eEoeS6i+OBq+S/neWtmOOBleOCjOOBvuOBl+OBn1wiLFxyXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLjgoLjgYbkuIDluqboqabjgZfjgabjgb/jgabjgY/jgaDjgZXjgYTjgIJcIixcclxuICB0aW1lck1pbjogXCLlg4XlsJFcIixcclxuICB0aW1lclNlYzogXCLjgrvjg4Pjgq9cIixcclxuICB0aW1lclNwZW50QWxsOiBcIuOBguOBquOBn+OBr+OBk+OBruODmuODvOOCuOOBq3swfeOCkuiyu+OChOOBl+OAgeWQiOioiOOBp3sxfeOCkuiyu+OChOOBl+OBvuOBl+OBn+OAglwiLFxyXG4gIHRpbWVyU3BlbnRQYWdlOiBcIuOBguOBquOBn+OBr+OBk+OBruODmuODvOOCuOOBq3swfeOCkuiyu+OChOOBl+OBvuOBl+OBn+OAglwiLFxyXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi5ZCI6KiI44GnezB944KS5L2/44Gj44Gf44GT44Go44Gr44Gq44KK44G+44GZ44CCXCIsXHJcbiAgdGltZXJMaW1pdEFsbDpcclxuICAgIFwi44GT44Gu44Oa44O844K444GrezF944Gu44GG44GhezB944KS6LK744KE44GX44CBezN944Gu44GG44GhezJ944KS5ZCI6KiI44Gn6LK744KE44GX44G+44GX44Gf44CCXCIsXHJcbiAgdGltZXJMaW1pdFBhZ2U6IFwi44GT44Gu44Oa44O844K444GnezF944GuezB944KS5L2/44Gj44Gf44GT44Go44GM44GC44KK44G+44GZ44CCXCIsXHJcbiAgdGltZXJMaW1pdFN1cnZleTogXCLlkIjoqIjjgad7MX3jga57MH3jgpLkvb/jgaPjgZ/jgZPjgajjgYzjgYLjgorjgb7jgZnjgIJcIixcclxuICBjbGVhbkNhcHRpb246IFwi5YmK6ZmkXCIsXHJcbiAgY2xlYXJDYXB0aW9uOiBcIuepuueZvVwiLFxyXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIuODleOCoeOCpOODq+OCkumBuOaKnlwiLFxyXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIuOBk+OBruODleOCoeOCpOODq+OCkuWJiumZpFwiLFxyXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi5ZmrXCIsXHJcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIuWQplwiLFxyXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIuOBk+OBruODleOCoeOCpOODq+OCkuWJiumZpOOBl+OBpuOCguOCiOOCjeOBl+OBhOOBp+OBmeOBi++8n3swfT9cIixcclxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwi44GZ44G544Gm44Gu44OV44Kh44Kk44Or44KS5YmK6Zmk44GX44Gm44KC44KI44KN44GX44GE44Gn44GZ44GL77yfXCIsXHJcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIuizquWVj+WQjVwiLFxyXG59O1xyXG5cclxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJqYVwiXSA9IGphcGFuZXNlU3VydmV5U3RyaW5ncztcclxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiamFcIl0gPSBcIuaXpeacrOiqnlwiO1xyXG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGthemFraFN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLQkNGA0YLSm9CwXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLQmtC10LvQtdGB0ZZcIixcbiAgY29tcGxldGVUZXh0OiBcItCU0LDQudGL0L1cIixcbiAgcHJldmlld1RleHQ6IFwi0JDQu9C00YvQvSDQsNC70LAg0pvQsNGA0LDRg1wiLFxuICBlZGl0VGV4dDogXCLQoNC10LTQsNC60YbQuNGP0LvQsNGDXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLQkdCw0YHRgtCw0YNcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLQkdCw0YHSm9CwICjTqdGC0ZbQvdC10LzRltC3LCDQttCw0LfRi9Kj0YvQtylcIixcbiAgbm9uZUl0ZW1UZXh0OiBcItCW0L7Sm1wiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLQkdCw0YDQu9GL0pPRi9C9INGC0LDSo9C00LDRg1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiezB9INC00LXQvSB7MX0g0LHQtdGCIFwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiezB9INC00LXQvSB7MX0g0LbQsNC30LHQsFwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiezB9L3sxfSDRgdKx0YDQsNKb0YLQsNGA0pPQsCDQttCw0YPQsNC/XCIsXG4gIGVtcHR5U3VydmV5OiBcItCR0ZbRgCDQtNC1INCx0ZbRgCDRgdKx0YDQsNKbINC20L7Smy5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLQodCw0YPQsNC70L3QsNC80LDQvdGLINGC0L7Qu9GC0YvRgNKT0LDQvdGL0qPRi9C3INKv0YjRltC9INGA0LDRhdC80LXRgiFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCLQodGW0Lcg0LHSsdC7INGB0LDRg9Cw0LvQvdCw0LzQsNC90Ysg06nRgtGW0L8g0pvQvtC50LTRi9Kj0YvQty5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLQodC10YDQstC10YDQtNC10L0g0LbSr9C60YLQtdGDLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcItCi0LDSo9C00LDRgy4uLlwiLFxuICB2YWx1ZTogXCLQvNOZ0L3RllwiLFxuICByZXF1aXJlZEVycm9yOiBcItOo0YLRltC90LXQvNGW0LcsINGB0rHRgNCw0pvSm9CwINC20LDRg9Cw0L8g0LHQtdGA0ZbSo9GW0LcuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcItOo0YLRltC90LXQvNGW0LcsINC60LXQvCDQtNC10LPQtdC90LTQtSDQsdGW0YAg0YHSsdGA0LDSm9Kb0LAg0LbQsNGD0LDQvyDQsdC10YDRltKj0ZbQty5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLTqNGC0ZbQvdC10LzRltC3LCDTmdGA0LHRltGAINC20L7Qu9C00YvSoyDRgdKx0YDQsNKT0LDQvdGLINC20LDRg9Cw0L8g0LHQtdGA0ZbSo9GW0LcuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLQltCw0YPQsNC/INGB0LDQvSDRgtKv0YDRltC90LTQtSDQsdC+0LvRg9GLINC60LXRgNC10LouXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi06jRgtGW0L3QtdC80ZbQtywgezB9INC00LXQvSDQutOp0L8g0YLQsNKj0LHQsCDQtdC90LPRltC30ZbSo9GW0LcuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi06jRgtGW0L3QtdC80ZbQtywgezB9INC00LXQvSDQsNC3INGC0LDSo9Cx0LAg0LXQvdCz0ZbQt9GW0qPRltC3LlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcItOo0YLRltC90LXQvNGW0LcsIHswfSDQsNC3INC205nQvdC1IHsxfSDQutOp0L8g0YLQsNKj0LHQsCDQtdC90LPRltC30ZbSo9GW0LcuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwi06jRgtGW0L3QtdC80ZbQtywgezB9INC00LXQvSDQutC10Lwg0LXQvNC10YEg0LbQvtC7INGC0L7Qu9GC0YvRgNGL0qPRi9C3LlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLTqNGC0ZbQvdC10LzRltC3LCDRgtGL0Lwg0LHQvtC70LzQsNGB0LAgezB9INC90rHRgdKb0LAg0YLQsNKj0LTQsNKj0YvQty5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi06jRgtGW0L3QtdC80ZbQtywgezB9INC90rHRgdKb0LDQtNCw0L0g0LrTqdC/INGC0LDSo9C00LDQvNCw0qPRi9C3LlwiLFxuICBudW1lcmljTWluTWF4OiAgIFwiJ3swfScgezF9INC00LXQvSDQutC10Lwg0LXQvNC10YEg0LbTmdC90LUgezJ9INC00LXQvSDQutOp0L8g0LXQvNC10YEg0LHQvtC70YMg0LrQtdGA0LXQulwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIHsxfSDQtNC10L0g0LrQtdC8INC10LzQtdGBINCx0L7Qu9GDINC60LXRgNC10LpcIixcbiAgbnVtZXJpY01heDogXCInezB9JyB7MX0g0LTQtdC9INC606nQvyDQtdC80LXRgSDQsdC+0LvRgyDQutC10YDQtdC6XCIsXG4gIGludmFsaWRFbWFpbDogXCLTqNGC0ZbQvdC10LzRltC3LCDQttCw0YDQsNC80LTRiyDRjdC70LXQutGC0YDQvtC90LTRi9KbINC/0L7RiNGC0LDSo9GL0LfQtNGLINC10L3Qs9GW0LfRltKj0ZbQty5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiezB9INOp0YDQvdC10LPRliAgJ3RydWUnINKb0LDQudGC0LDRgNGDINC60LXRgNC10LouXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLQodKx0YDQsNGC0YvQvCDSm9Cw0YLQtdC70ZbQutGC0ZYg0pvQsNC50YLQsNGA0LTRiyd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiAgXCLQodKx0YDQsNGC0YvQvNKT0LAg0LbQsNGD0LDQvyDQsdC+0YEg0LrQtdC70LTRliDQvdC10LzQtdGB0LUgJ3BhdGgnINKb0LDRgdC40LXRgtGWINKb0LDRgtC1INC606nRgNGB0LXRgtGW0LvQs9C10L0gXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi0KTQsNC50LvQtNGL0qMg0LzTqdC70YjQtdGA0ZYgezB9INCw0YHQv9Cw0YMg0LrQtdGA0LXQui5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItOo0YLRltC90LXQvNGW0LcsIOKAnNCR0LDRgdKb0LDigJ0g0LbQvtC70YvQvdCwINC00LXRgNC10LrRgtGWINC10L3Qs9GW0LfRltKj0ZbQt1wiLFxuICB1cGxvYWRpbmdGaWxlOiAgXCLQodGW0LfQtNGW0qMg0YTQsNC50LvRi9Kj0YvQtyDQttKv0LrRgtC10LvRltC/INC20LDRgtGL0YAuINCR0ZbRgNC90LXRiNC1INGB0LXQutGD0L3QtCDRgtC+0YHRi9C/LCDSm9Cw0LnRgtCw0LTQsNC9INCx0LDQudKb0LDQvyDQutOp0YDRltKj0ZbQty5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi0JbSr9C60YLQtdGDLi4uXCIsXG4gIGNob29zZUZpbGU6IFwi0KTQsNC50LvQtNCw0YDQtNGLINGC0LDSo9C00LDSo9GL0LcuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcItCk0LDQudC7INGC0LDSo9C00LDQu9GL0L3QsdCw0LTRi1wiLFxuICBjb25maXJtRGVsZXRlOiBcItCh0ZbQtyDQttCw0LfQsdCw0L3RiyDQttC+0Y/RgtGL0L3Ri9Kj0YvQt9KT0LAg0YHQtdC90ZbQvNC00ZbRgdGW0Lcg0LHQtT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLQkdKx0Lsg0LzTmdC9INCx0ZbRgNC10LPQtdC5INCx0L7Qu9GDINC60LXRgNC10LouXCIsXG4gIGFkZENvbHVtbjogXCLQkdCw0pPQsNC90LAg0pvQvtGB0YNcIixcbiAgYWRkUm93OiBcItCW0L7Qu9C00Ysg0pvQvtGB0YNcIixcbiAgcmVtb3ZlUm93OiBcItOo0YjRltGA0YNcIixcbiAgYWRkUGFuZWw6IFwi0JbQsNKj0LAg0pvQvtGB0YNcIixcbiAgcmVtb3ZlUGFuZWw6IFwi06jRiNGW0YDRg1wiLFxuICBjaG9pY2VzX0l0ZW06IFwi0J3SsdGB0pvQsFwiLFxuICBtYXRyaXhfY29sdW1uOiBcItCR0LDSk9Cw0L3QsFwiLFxuICBtYXRyaXhfcm93OiBcItCW0L7Qu1wiLFxuICBzYXZpbmdEYXRhOiBcItCd05nRgtC40LbQtdC70LXRgCDRgdC10YDQstC10YDQtNC1INGB0LDSm9GC0LDQu9Cw0LTRiy4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi0prQsNGC0LXQu9GW0Log0YLRg9GL0L3QtNCw0LTRiywg0L3TmdGC0LjQttC1INGB0LDSm9GC0LDQu9GL0L3QsdCw0LTRiy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi0J3TmdGC0LjQttC1INC+0LnQtNCw0pPRi9C00LDQuSDRgdCw0pvRgtCw0LvQtNGLIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi0prQsNC50YLQsNC00LDQvSDQsdCw0LnSm9Cw0L8g0LrTqdGA0YNcIixcbiAgdGltZXJNaW46IFwi0LzQuNC9XCIsXG4gIHRpbWVyU2VjOiBcItGB0LXQulwiLFxuICB0aW1lclNwZW50QWxsOiBcItCh0ZbQtyDQsdKx0Lsg0LHQtdGC0YLQtSB7MH0g0LrQtdGC0ZbRgNC00ZbSo9GW0Lcg0LbTmdC90LUg0LHQsNGA0LvRi9KT0YsgezF9LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCLQodGW0Lcg0LHSsdC7INCx0LXRgtGC0LUgezB9INC60LXRgtGW0YDQtNGW0qPRltC3LlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcItCh0ZbQtyDRgdCw0YPQsNC70L3QsNC80LAg0LrQtdC30ZbQvdC00LUgezB9INC60LXRgtGW0YDQtNGW0qPRltC3LlwiLFxuICB0aW1lckxpbWl0QWxsOiBcItCh0ZbQtyDQsdKx0Lsg0LHQtdGC0YLQtSB7MH0g0LTQtdC9IHsxfSDQutC10YLRltGA0LTRltKj0ZbQtyDQttOZ0L3QtSB7Mn0g0LTQtdC9IHszfSDQsdKv0LrRltC7INGB0LDRg9Cw0LvQvdCw0LzQsCDSr9GI0ZbQvS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi0KHRltC3INCx0rHQuyDQsdC10YLRgtC1IHswfSDQtNC10L0gezF9INC60LXRgtGW0YDQtNGW0qPRltC3LlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcItCh0ZbQtyDQsdKv0LrRltC7INGB0LDRg9Cw0LvQvdCw0LzQsCDSr9GI0ZbQvSB7MH0g0LTQtdC9IHsxfSDQutC10YLRltGA0LTRltKj0ZbQtyBcIixcbiAgY2xlYW5DYXB0aW9uOiBcItCi0LDQt9Cw0LvQsNGDXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLQotCw0LfQsNC70LDRg1wiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLQpNCw0LnQuyDRgtCw0qPQtNCw0qPRi9C3XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcItCk0LDQudC70LTRiyDQttC+0LnRi9Kj0YvQt1wiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcItCY05lcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcItCW0L7Sm1wiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLQodGW0Lcg0LHSsdC7INGE0LDQudC70LTRiyDQttC+0Y/RgtGL0L3Ri9Kj0YvQt9KT0LAg0YHQtdC90ZbQvNC00ZbRgdGW0Lcg0LHQtTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwi0KHRltC3INCx0LDRgNC70YvSmyDRhNCw0LnQu9C00LDRgNC00Ysg0LbQvtGP0YLRi9C90YvSo9GL0LfSk9CwINGB0LXQvdGW0LzQtNGW0YHRltC3INCx0LU/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLQodKx0YDQsNKb0YLRi9KjINCw0YLQsNGD0YtcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wia2tcIl0gPSBrYXpha2hTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wia2tcIl0gPSBcIkthemFraFwiOyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIga29yZWFuU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIuydtOyghFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi64uk7J2MXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLsmYTro4xcIixcbiAgcHJldmlld1RleHQ6IFwi7Iuc7IKsXCIsXG4gIGVkaXRUZXh0OiBcIu2OuOynke2VmOuLpFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi7Iuc7J6RXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi6riw7YOAKOyEpOuqhSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIuyXhuydjFwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLrqqjrkZAg7ISg7YOdXCIsXG4gIHByb2dyZXNzVGV4dDogXCLtjpjsnbTsp4AgezF9IOykkSB7MH1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcInswfSAvIHsxfSDquLDroZ1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcInswfSAvIHsxfSDqsJzsnZgg7KeI66y47JeQIOuLteuzgCDtlahcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi7ISk66y47KeA7JeQIOuztOyXrOyngOuKlCDtjpjsnbTsp4Drgpgg7KeI66y47J20IOyXhuyKteuLiOuLpFwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuyEpOusuCDsobDsgqzrpbwg7JmE66OM7ZW0IOyjvOyFlOyEnCDqsJDsgqztlanri4jri6QhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6IFwi6riw66Gd7JeQIOuUsOultOuptCDsnbTrr7gg7ISk66y4IOyhsOyCrOulvCDrp4jsuZjshajsirXri4jri6QuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi7ISk66y47KGw7IKs6rCAIOuhnOuTnOykkeyeheuLiOuLpC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLshKDtg53tlZjsi63si5zsmKQuLi5cIixcbiAgdmFsdWU6IFwi6rCSXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi7KeI66y47JeQIOuLte2VmOyLnOyYpC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi7ZWY64KYIOydtOyDgeydmCDsp4jrrLjsl5Ag64u17ZWY7Iut7Iuc7JikLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuuqqOuToCDtlonsl5Ag7J6I64qUIOyniOusuOyXkCDri7XtlZjsi63si5zsmKQuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLqsJLsnYAg7Iir7J6Q7Jes7JW8IO2VqeuLiOuLpC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLri7Xrs4DsnZgg6ri47J2064qUIOy1nOyGjCB7MH3snpDsl6zslbwg7J6F64uI64ukLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIuuLteuzgOydmCDquLjsnbTripQgezB97J6Q66W8IOy0iOqzvCDtlaAg7IiYIOyXhuyKteuLiOuLpC5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLri7Xrs4DsnZgg6ri47J2064qUIHswfSAtIHsxfeyekCDsgqzsnbTsl6zslbwg7ZWp64uI64ukLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuy1nOyGjCB7MH3qsJzsnZgg7ZaJ7J2EIOyxhOyasOyLreyLnOyYpFwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLstZzshowgezB96rCc7J2YIOuzgOyImOulvCDshKDtg53tlZjsi63si5zsmKQuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuy1nOuMgCB7MH3qsJzsnZgg67OA7IiY66W8IOyEoO2Dne2VmOyLreyLnOyYpC5cIixcbiAgbnVtZXJpY01pbk1heDogXCInezB9J+ydgCB7MX3rs7Tri6Qg7YGs6rGw64KYIOqwmeqzoCB7Mn3rs7Tri6Qg7J6R6rGw64KYIOqwmeyVhOyVvO2VqeuLiOuLpC5cIixcbiAgbnVtZXJpY01pbjogXCInezB9J+ydgCB7MX3rs7Tri6Qg7YGs6rGw64KYIOqwmeyVhOyVvO2VqeuLiOuLpC5cIixcbiAgbnVtZXJpY01heDogXCInezB9J+ydgCB7MX3rs7Tri6Qg7J6R6rGw64KYIOqwmeyVhOyVvO2VqeuLiOuLpC5cIixcbiAgaW52YWxpZEVtYWlsOiBcIuyYrOuwlOuluCDsnbTrqZTsnbwg7KO87IaM66W8IOyeheugpe2VmOyLreyLnOyYpC5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi7ZGc7ZiE7IudOiB7MH3snYAgJ+ywuCfsnbTslrTslbwg7ZWp64uI64ukLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiJ3swfSfsnLzroZwg7J6Y66q765CcIOyalOyyreyeheuLiOuLpC4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLruYTslrTsnojripQg642w7J207YSw66W8IOyalOyyre2WiOqxsOuCmCDsnpjrqrvrkJwg7IaN7ISx7J2YIOqyveuhnOyeheuLiOuLpC5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLtjIzsnbwg7YGs6riw6rCAIHswfeydhCDstIjqs7wg7ZWgIOyImCDsl4bsirXri4jri6QuXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLri6Trpbgg7KeI66y47J2EIOyekeyEse2VmOyLreyLnOyYpC5cIixcbiAgdXBsb2FkaW5nRmlsZTogXCLtjIzsnbwg7JeF66Gc65OcIOykkeyeheuLiOuLpC4g7J6g7IucIO2bhCDri6Tsi5wg7Iuc64+E7ZWY7Iut7Iuc7JikLlwiLFxuICBsb2FkaW5nRmlsZTogXCLroZzrk5wg7KSRLi4uXCIsXG4gIGNob29zZUZpbGU6IFwi7YyM7J28IOyEoO2DnS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwi7ISg7YOd65CcIO2MjOydvOydtCDsl4bsirXri4jri6RcIixcbiAgY29uZmlybURlbGV0ZTogXCLquLDroZ3snYQg7IKt7KCc7ZWY7Iuc6rKg7Iq164uI6rmMP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIiDsnbQg6rCS7J2AIOqzoOycoO2VtOyVvO2VqeuLiOuLpC5cIixcbiAgYWRkQ29sdW1uOiBcIuyXtCDstpTqsIBcIixcbiAgYWRkUm93OiBcIu2WiSDstpTqsIBcIixcbiAgcmVtb3ZlUm93OiBcIuygnOqxsFwiLFxuICBhZGRQYW5lbDogXCLsg4jroa3qsowg7LaU6rCAXCIsXG4gIHJlbW92ZVBhbmVsOiBcIuygnOqxsFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi7ZWt66qpXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi7Je0XCIsXG4gIG1hdHJpeF9yb3c6IFwi7ZaJXCIsXG4gIHNhdmluZ0RhdGE6IFwi6rKw6rO86rCAIOyEnOuyhOyXkCDsoIDsnqUg7KSR7J6F64uI64ukLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLsmKTrpZjqsIAg67Cc7IOd7ZWY7JesIOqysOqzvOulvCDsoIDsnqXtlaAg7IiYIOyXhuyKteuLiOuLpC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi6rKw6rO86rCAIOyEseqzteyggeycvOuhnCDsoIDsnqXrkJjsl4jsirXri4jri6QhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLri6Tsi5wg7Iuc64+E7ZWY7Iut7Iuc7JikXCIsXG4gIHRpbWVyTWluOiBcIuu2hFwiLFxuICB0aW1lclNlYzogXCLstIhcIixcbiAgdGltZXJTcGVudEFsbDogXCLtmITsnqwg7Y6Y7J207KeA7JeQ7IScIHswfeydhCDshozsmpTtlbQg7LSdIHsxfeydtCDqsbjroLjsirXri4jri6QuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezBd7J20IOqxuOuguOyKteuLiOuLpFwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIuy0nSB7MH3snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0QWxsOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezB9L3sxfeydhCDshozsmpTtlbQg7LSdIHsyfS97M33snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLtmITsnqwg7Y6Y7J207KeA7JeQ7IScIHswfS97MX3snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIuy0nSB7MH0vezF97J20IOqxuOuguOyKteuLiOuLpC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIuuLpuq4sFwiLFxuICBjbGVhckNhcHRpb246IFwi7KeA7Jqw6riwXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIu2MjOydvOydhCDshKDtg51cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi7J20IO2MjOydvCDsoJzqsbBcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLsmIhcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIuyVhOuLiFwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJ7MH0g7YyM7J287J2EIOygnOqxsCDtlZjsi5zqsqDsirXri4jquYw/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLrqqjrk6Ag7YyM7J287J2EIOygnOqxsCDtlZjsi5zqsqDsirXri4jquYw/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLsp4jrrLgg7KCc66qpXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImtvXCJdID0ga29yZWFuU3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImtvXCJdID0gXCLtlZzqta3slrRcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgbGF0dmlhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBdHBha2HEvFwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVMSBbMSBa1wiLFxuICBjb21wbGV0ZVRleHQ6IFwiUGFiZWlndFwiLFxuICBwcmV2aWV3VGV4dDogXCJQcmlla8Whc2thdMSranVtc1wiLFxuICBlZGl0VGV4dDogXCJSZWRpxKPEk3RcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlPEgWt0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQ2l0cyAobMWrZHp1LCBhcHJha3N0aWV0ISlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk5hdlwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJJenbEk2zEk3RpZXMgdmlzdXNcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIkxhcHB1c2UgezB9IG5vIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiSWVyYWtzdMSrdCB7MH0gbm8gezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJBdGJpbGTEk2phIHV6IGphdXTEgWp1bWllbSB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTmF2IG5ldmllbmEgamF1dMSBanVtYS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJQYXRlaWNhbWllcyBKdW1zIHBhciBhbmtldGFzIGFpenBpbGTEq8WhYW51IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiTcWrc3UgaWVyYWtzdGkgbGllY2luYSwga2EgasWrcyBqYXUgZXNhdCBhaXpwaWxkxKtqaXMgxaFvIGFwdGF1anUuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiSWVsxIFkZSBubyBzZXJ2ZXJhLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIkl6dsSTbMSTdGllcy4uLlwiLFxuICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIkzFq2R6dSwgYXRiaWxkaWV0IHV6IGphdXTEgWp1bXUhXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkzFq2R6dSwgYXRiaWxkaWV0IHV6IHZpc21heiB2aWVudSBqYXV0xIFqdW11LlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkzFq2R6dSwgYXRiaWxkaWV0IHV6IGphdXTEgWp1bWllbSB2aXPEgXMgcmluZMSBcy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkF0YmlsZGVpIGlyIGrEgWLFq3Qgc2thaXRsaW0uXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiTMWrZHp1LCBpZXZhZGlldCB2aXNtYXogezB9IHNpbWJvbHVzLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIkzFq2R6dSwgaWV2YWRpZXQgbWF6xIFrIG5la8SBIHswfSByYWtzdHrEq21lcy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJMxatkenUsIGlldmFkaWV0IHZhaXLEgWsgbmVrxIEgezB9IHJha3N0esSrbWVzIHVuIG1hesSBayBuZWvEgSB7MX0gcmFrc3R6xKttZXMuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiTMWrZHp1LCBhaXpwaWxkaWV0IHZpc21heiB7MH0gcmluZGFzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJMxatkenUsIGl6dsSTbGlldGllcyB2aXNtYXogezB9IHZhcmlhbnR1LlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJMxatkenUsIGl6dsSTbGlldGllcyBuZSB2YWlyYWsgcGFyIHswfSB2YXJpYW50aWVtLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSBuZWvEgSB7MX0sIHVuIHZpZW7EgWRhbSB2YWkgbWF6xIFrYW0sIG5la8SBIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGrEgWLFq3QgdmllbsSBZGFtIHZhaSBsaWVsxIFrYW0gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIkzFq2R6dSwgaWV2YWRpZXQgcGF0aWVzdSBlLXBhc3RhIGFkcmVzaSFcIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiSXp0ZWljaWVuYW06IHswfSBqxIFhdGdyaWXFviDigJx0cnVl4oCdLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUGllcHJhc8SranVtxIEgdGlrYSBhdGdyaWV6dGEga8S8xatkYSDigJx7MH3igJ0uIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJQaWVwcmFzxKtqdW1zIGF0Z3JpZXphIHR1a8WhdXMgZGF0dXMgdmFpIHJla3ZpesSrdHMg4oCccGF0aOKAnSBpciBuZXBhcmVpenNcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJGYWlsYSBsaWVsdW1zIG5lZHLEq2tzdCBwxIFyc25pZWd0IHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkzFq2R6dSwgaWV2YWRpZXQgZGF0dXMgbGF1a8SBICdDaXRzJ1wiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiSsWrc3UgZmFpbHMgdGllayBhdWfFoXVwaWVsxIFkxJN0cy4gTMWrZHp1LCB1emdhaWRpZXQgdmFpcsSBa2FzIHNla3VuZGVzIHVuIG3Ek8SjaW5pZXQgdsSTbHJlaXouXCIsXG4gIGxvYWRpbmdGaWxlOiBcIk5vdGllayBpZWzEgWRlIC4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkl6dsSTbGlldGllcyBmYWlsdXMgLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJOYXYgaXp2xJNsxJN0cyBuZXZpZW5zIGZhaWxzXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVmFpIHbEk2xhdGllcyBpemR6xJNzdCBpZXJha3N0dT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLFoGFpIHbEk3J0xKtiYWkgasSBYsWrdCB1bmlrxIFsYWkuXCIsXG4gIGFkZENvbHVtbjogXCJQaWV2aWVub3Qga29sb25udVwiLFxuICBhZGRSb3c6IFwiUGlldmllbm90IHJpbmR1XCIsXG4gIHJlbW92ZVJvdzogXCJOb8WGZW10XCIsXG4gIGFkZFBhbmVsOiBcIlBpZXZpZW5vIGphdW51XCIsXG4gIHJlbW92ZVBhbmVsOiBcIk5vxYZlbXRcIixcbiAgY2hvaWNlc19JdGVtOiBcImxpZXRhXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiU2xlamFcIixcbiAgbWF0cml4X3JvdzogXCJSaW5kYVwiLFxuICBzYXZpbmdEYXRhOiBcIlJlenVsdMSBdGkgdGllayBzYWdsYWLEgXRpIHNlcnZlcsSrIC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiUmFkxIFzIGvEvMWrZGEsIHVuIG3Ek3MgbmV2YXLEk2rEgW0gc2FnbGFixIF0IHJlenVsdMSBdHVzLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJSZXp1bHTEgXRpIHRpa2EgdmVpa3NtxKtnaSBzYWdsYWLEgXRpIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiTcSTxKNpbmkgdsSTbHJlaXpcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIsWgYWrEgSBsYXDEgSBlc2F0IGl6dMSTcsSTamlzIHswfSB1biBrb3DEgSB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIsWgYWrEgSBsYXDEgSBlc2F0IGl6dMSTcsSTamlzIHswfS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJLb3DEgSBlc2F0IGl6dMSTcsSTamlzIHswfS5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIsWgYWrEgSBsYXDEgSBlc2F0IGl6dMSTcsSTamlzIHswfSBubyB7MX0gdW4ga29wxIEgezJ9IG5vIHszfS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwixaBhasSBIGxhcMSBIGVzYXQgaXp0xJNyxJNqaXMgezB9IG5vIHsxfS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJLb3DEgSBlc2F0IGl6dMSTcsSTamlzIHswfSBubyB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJUxKtyc1wiLFxuICBjbGVhckNhcHRpb246IFwiU2thaWRyc1wiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJJenbEk2zEk3RpZXMgZmFpbHVcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiTm/FhmVtaWV0IMWhbyBmYWlsdVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkrEgVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTsSTXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIlZhaSB0aWXFocSBbSB2xJNsYXRpZXMgbm/FhmVtdCDFoW8gZmFpbHU6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIlZhaSB0aWXFocSBbSB2xJNsYXRpZXMgbm/FhmVtdCB2aXN1cyBmYWlsdXM/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJKYXV0xIFqdW1hIG5vc2F1a3Vtc1wiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJsdlwiXSA9IGxhdHZpYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wibHZcIl0gPSBcImxhdHZpZcWhdVwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBsaXRodWFuaWFTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQXRnYWxcIixcbiAgcGFnZU5leHRUZXh0OiBcIlRvbGlhdVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQmFpZ3RpXCIsXG4gIHByZXZpZXdUZXh0OiBcIlBlcsW+acWrcmFcIixcbiAgZWRpdFRleHQ6IFwiUmVkYWd1b3RpXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJQcmFkxJd0aVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIktpdGEgKMSvdmVzdGkpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOxJdyYVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJQYXNpcmlua3RpIHZpc3VzXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQdXNsYXBpcyB7MH0gacWhIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwixK5yYcWheXRpIHswfSBpxaEgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJBdHNha8SXIMSvIHswfSAvIHsxfSBrbGF1c2ltdXNcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiQXBrbGF1c29qZSBuxJdyYSBtYXRvbW8gcHVzbGFwaW8gYXIga2xhdXNpbW8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiRMSXa29qYW1lIHXFviBkYWx5dmF2aW3EhSBhcGtsYXVzb2plIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOiBcIk3Fq3PFsyDEr3JhxaFhaSByb2RvLCBrYWQgamF1IGF0bGlrb3RlIMWhacSFIGFwa2xhdXPEhS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJQcmHFoW9tZSBwYWxhdWt0aS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJQYXNpcmlua3RpLi4uXCIsXG4gIHZhbHVlOiBcInJlaWvFoW3El1wiLFxuICByZXF1aXJlZEVycm9yOiBcIkLFq3RpbmEgYXRzYWt5dGkgxK8gxaHEryBrbGF1c2ltxIUuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkLFq3RpbmEgYXRzYWt5dGkgYmVudCDEryB2aWVuxIUga2xhdXNpbcSFLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlByYcWhb21lIGF0c2FreXRpIMSvIGtsYXVzaW11cyB2aXNvc2UgZWlsdXTEl3NlLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVHVyaSBixat0aSBza2FpxI1pYWkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUHJhxaFvbWUgc3V2ZXN0aSBiZW50IHswfSBzaW1ib2xpdXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUHJhxaFvbWUgc3V2ZXN0aSBtYcW+aWF1IG5laSB7MH0gc2ltYm9sacWzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOlxuICAgIFwiUHJhxaFvbWUgc3V2ZXN0aSBkYXVnaWF1IG5laSB7MH0gaXIgbWHFvmlhdSBuZWkgezF9IHNpbWJvbGnFsy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQcmHFoW9tZSBzdXZlc3RpIG5lIG1hxb5pYXUgbmVpIHswfSBlaWx1xI1pxbMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlByYcWhb21lIHBhc2lyaW5rdGkgYmVudCB7MH0gdmFyaWFudMWzLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJQYXNpcmlua2l0ZSBuZSBkYXVnaWF1IGthaXAgezB9IHZhcmlhbnR1cy5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIHR1cmkgYsWrdGkgbHlndXMgYXJiYSBkaWRlc25pcyBuZWkgezF9IGlyIGx5Z3VzIGFyYmEgbWHFvmVzbmlzIG5laSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyB0dXLEl3TFsyBixat0aSBseWd1cyBhcmJhIGRpZGVzbmlzIG5laSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyB0dXLEl3TFsyBixat0aSBseWd1cyBhciBtYcW+ZXNuaXMgdcW+IHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUHJhxaFvbWUgxK92ZXN0aSBnYWxpb2phbnTEryBlbGVrdHJvbmluaW8gcGHFoXRvIGFkcmVzxIUuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlJlaWvFoW3ElzogezB9IHR1cmkgZ3LEhcW+aW50aSAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJVxb5rbGF1c2EgZ3LEhcW+aW5vIGtsYWlkxIUnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlXFvmtsYXVzYSBncsSFxb5pbm8gdHXFocSNaXVzIGR1b21lbmlzIGFyYmEgJ3BhdGgnIHNhdnlixJcgeXJhIG5ldGVpc2luZ2FcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJGYWlsbyBkeWRpcyBuZXR1cmkgdmlyxaF5dGkgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwixK52ZXNraXRlIGtpdMSFIHJlaWvFoW3EmS5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkrFq3PFsyBmYWlsYXMgeXJhIGtlbGlhbWFzLiBQYWxhdWtpdGUga2VsZXTEhSBzZWt1bmTFvmnFsyBpciBiYW5keWtpdGUgZGFyIGthcnTEhS5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiUHJhxaFvbWUgcGFsYXVrdGkuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJQYXNpcmlua3RpIGZhaWzEhSh1cykuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5lcGFzaXJpbmt0YXMgam9rcyBmYWlsYXNcIixcbiAgY29uZmlybURlbGV0ZTogXCJBciBub3JpdGUgacWhdHJpbnRpIMSvcmHFocSFP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIsWgaSByZWlrxaFtxJcgdHVyxJd0xbMgYsWrdGkgdW5pa2FsaS5cIixcbiAgYWRkQ29sdW1uOiBcIlByaWTEl3RpIHN0dWxwZWzEr1wiLFxuICBhZGRSb3c6IFwiUHJpZMSXdGkgZWlsdXTEmVwiLFxuICByZW1vdmVSb3c6IFwiScWhdHJpbnRpXCIsXG4gIGFkZFBhbmVsOiBcIlByaWTEl3RpIG5hdWrEhVwiLFxuICByZW1vdmVQYW5lbDogXCJJxaF0cmludGlcIixcbiAgY2hvaWNlc19JdGVtOiBcImVsZW1lbnRhc1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIlN0dWxwZWxpc1wiLFxuICBtYXRyaXhfcm93OiBcIkVpbHV0xJdcIixcbiAgc2F2aW5nRGF0YTogXCJSZXp1bHRhdGFpIHNhdWdvbWkgc2VydmVyeWplLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLErnZ5a28ga2xhaWRhIGlyIG1lcyBuZWdhbMSXam9tZSBpxaFzYXVnb3RpIHJlenVsdGF0xbMuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlenVsdGF0YWkgYnV2byBpxaFzYXVnb3RpIHPEl2ttaW5nYWkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJCYW5keXRpIGRhciBrYXJ0xIVcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlByYWxlaWRvdGUgezB9IMWhaWFtZSBwdXNsYXB5amUgaXIgezF9IGnFoSB2aXNvLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJQcmFsZWlkb3RlIHswfSDFoWlhbWUgcHVzbGFweWplLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlByYWxlaWRvdGUgezB9IGnFoSB2aXNvLlwiLFxuICB0aW1lckxpbWl0QWxsOiBcIlByYWxlaWRvdGUgezB9IGnFoSB7MX0gxaFpYW1lIHB1c2xhcHlqZSBpciB7Mn0gacWhIHszfSBpxaEgdmlzby5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiUHJhbGVpZG90ZSB7MH0gacWhIHsxfSDFoWlhbWUgcHVzbGFweWplLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlByYWxlaWRvdGUgezB9IGnFoSB7MX0gacWhIHZpc28uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJJxaF2YWx5dGlcIixcbiAgY2xlYXJDYXB0aW9uOiBcIlZhbHl0aVwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJQYXNpcmlua3RpIGZhaWzEhVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJJxaF0cmludGkgxaHEryBmYWlsxIVcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJUYWlwXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOZVwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJBciB0aWtyYWkgbm9yaXRlIHBhxaFhbGludGkgxaHEryBmYWlsxIU6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkFyIHRpa3JhaSBub3JpdGUgcGHFoWFsaW50aSB2aXN1cyBmYWlsdXM/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJLbGF1c2ltbyBwYXZhZGluaW1hc1wiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJsdFwiXSA9IGxpdGh1YW5pYVN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJsdFwiXSA9IFwibGlldHV2acWzXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIG1hY2Vkb25pYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi0J/RgNC10YLRhdC+0LTQvdCwXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLQodC70LXQtNC90L5cIixcbiAgY29tcGxldGVUZXh0OiBcItCX0LDQstGA0YjQuFwiLFxuICBwcmV2aWV3VGV4dDogXCLQn9GA0LXQs9C70LXQtFwiLFxuICBlZGl0VGV4dDogXCLQo9GA0LXQtNGD0LLQsNGa0LVcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcItCX0LDQv9C+0YfQvdC10YLQtVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcItCU0YDRg9Cz0L4gKNC+0L/QuNGI0LgpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLQndC40YjRgtC+XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItCh0LXQu9C10LrRgtC40YDQsNGYINGB0LVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcItCh0YLRgNCw0L3QuNGG0LAgezB9INC+0LQgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCLQodC90LjQvNC4IHswfSDQvtC0IHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwi0J7QtNCz0L7QstC+0YDQtdC90Lgg0L3QsCB7MH0gLyB7MX0g0L/RgNCw0YjQsNGa0LBcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi0J3QtdC80LAg0LLQuNC00LvQuNCy0LAg0YHRgtGA0LDQvdC40YbQsCDQuNC70Lgg0L/RgNCw0YjQsNGa0LUg0LLQviDQuNGB0YLRgNCw0LbRg9Cy0LDRmtC10YLQvi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLQktC4INCx0LvQsNCz0L7QtNCw0YDQuNC80LUg0YjRgtC+INCz0L4g0LfQsNCy0YDRiNC40LLRgtC1INC40YHRgtGA0LDQttGD0LLQsNGa0LXRgtC+IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwi0J3QsNGI0LjRgtC1INC30LDQv9C40YHQuCDQv9C+0LrQsNC20YPQstCw0LDRgiDQtNC10LrQsCDQstC10ZzQtSDRgdGC0LUg0LPQviDQt9Cw0LLRgNGI0LjQu9C1INC+0LLQsCDQuNGB0YLRgNCw0LbRg9Cy0LDRmtC1LlwiLFxuICBsb2FkaW5nU3VydmV5OiBcItCQ0L3QutC10YLQsNGC0LAg0YHQtSDQstGH0LjRgtGD0LLQsCAuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi0JjQt9Cx0LXRgNC10YLQtSAuLi5cIixcbiAgdmFsdWU6IFwi0LLRgNC10LTQvdC+0YHRglwiLFxuICByZXF1aXJlZEVycm9yOiBcItCS0LUg0LzQvtC70LDQvCwg0L7QtNCz0L7QstC+0YDQtdGC0LUg0L3QsCDQv9GA0LDRiNCw0ZrQtdGC0L4uXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcItCS0LUg0LzQvtC70LDQvCwg0L7QtNCz0L7QstC+0YDQtdGC0LUg0LHQsNGA0LXQvCDQvdCwINC10LTQvdC+INC/0YDQsNGI0LDRmtC1LlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItCS0LUg0LzQvtC70LjQvNC1LCDQvtC00LPQvtCy0L7RgNC10YLQtSDQvdCwINC/0YDQsNGI0LDRmtCwINCy0L4g0YHQuNGC0LUg0YDQtdC00L7QstC4LlwiLFxuICBudW1lcmljRXJyb3I6IFwi0JLRgNC10LTQvdC+0YHRgtCwINGC0YDQtdCx0LAg0LTQsCDQsdC40LTQtSDQvdGD0LzQtdGA0LjRh9C60LAuXCIsXG4gIG1pbkVycm9yOiBcItCS0YDQtdC00L3QvtGB0YLQsCDQvdC1INGC0YDQtdCx0LAg0LTQsCDQsdC40LTQtSDQv9C+0LzQsNC70LAg0L7QtCB7MH1cIixcbiAgbWF4RXJyb3I6IFwi0JLRgNC10LTQvdC+0YHRgtCwINC90LUg0YLRgNC10LHQsCDQtNCwINCx0LjQtNC1INC/0L7Qs9C+0LvQtdC80LAg0L7QtCB7MH1cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLQktC90LXRgdC10YLQtSDQvdCw0ZjQvNCw0LvQutGDIHswfSDQt9C90LDQui/RhtC4LlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItCS0L3QtdGB0LXRgtC1INC90LUg0L/QvtCy0LXRnNC1INC+0LQgezB9INC30L3QsNC6L9GG0LguXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi0JLQvdC10YHQtdGC0LUg0L3QsNGY0LzQsNC70LrRgyB7MH0g0Lgg0L3QtSDQv9C+0LLQtdGc0LUg0L7QtCB7MX0g0LfQvdCw0YbQuC5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLQn9C+0L/QvtC70L3QtdGC0LUg0L3QsNGY0LzQsNC70LrRgyB7MH0g0YDQtdC0KNC+0LLQuCkuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItCS0LUg0LzQvtC70LjQvNC1INC40LfQsdC10YDQtdGC0LUg0L3QsNGY0LzQsNC70LrRgyB7MH0g0LLQsNGA0LjRmNCw0L3RgtCwKNC4KS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi0JjQt9Cx0LXRgNC10YLQtSDQvdC1INC/0L7QstC10ZzQtSDQvtC0IHswfSDQstCw0YDQuNGY0LDQvdGC0LAo0LgpLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScg0YLRgNC10LHQsCDQtNCwINCx0LjQtNC1INC90LDRmNC80LDQu9C60YMgezF9INC4INC90LDRmNC80L3QvtCz0YMgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg0YLRgNC10LHQsCDQtNCwINCx0LjQtNC1INC90LDRmNC80LDQu9C60YMgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg0YLRgNC10LHQsCDQtNCwINCx0LjQtNC1INC90LDRmNC80L3QvtCz0YMgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLQktC1INC80L7Qu9C40LzQtSDQstC90LXRgdC10YLQtSDQstCw0LvQuNC00L3QsCDQtS3QvNCw0LjQuyDQsNC00YDQtdGB0LAuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcItCY0LfRgNCw0LfQvtGCOiB7MH0g0YLRgNC10LHQsCDQtNCwINGB0LUg0LLRgNCw0YLQuCAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLQkdCw0YDQsNGa0LXRgtC+INCy0YDQsNGC0Lgg0LPRgNC10YjQutCwICd7MH0nLiB7MX0gXCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcItCR0LDRgNCw0ZrQtdGC0L4g0LLRgNCw0YLQuCDQv9GA0LDQt9C90Lgg0L/QvtC00LDRgtC+0YbQuCDQuNC70Lgg0YHQstC+0ZjRgdGC0LLQvtGC0L4gJ3BhdGgnINC1INC90LXRgtC+0YfQvdC+XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi0JPQvtC70LXQvNC40L3QsNGC0LAg0L3QsCDQtNCw0YLQvtGC0LXQutCw0YLQsCDQvdC1INGC0YDQtdCx0LAg0LTQsCDQvdCw0LTQvNC40L3Rg9Cy0LAgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi0JLQvdC10YHQtdGC0LUg0ZjQsCDQtNGA0YPQs9Cw0YLQsCDQstGA0LXQtNC90L7RgdGCLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwi0JLQsNGI0LDRgtCwINC00LDRgtC+0YLQtdC60LAg0YHQtSDQv9C+0YHRgtCw0LLRg9Cy0LAuINCS0LUg0LzQvtC70LjQvNC1INC/0L7Rh9C10LrQsNGY0YLQtSDQvdC10LrQvtC70LrRgyDRgdC10LrRg9C90LTQuCDQuCDQvtCx0LjQtNC10YLQtSDRgdC1INC/0L7QstGC0L7RgNC90L4uXCIsXG4gIGxvYWRpbmdGaWxlOiBcItCh0LUg0LLRh9C40YLRg9Cy0LAgLi4uXCIsXG4gIGNob29zZUZpbGU6IFwi0JjQt9Cx0LXRgNC10YLQtSDQtNCw0YLQvtGC0LXQutCwICjQuCkgLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLQndC1INGB0LUg0LjQt9Cx0YDQsNC90Lgg0LTQsNGC0L7RgtC10LrQuFwiLFxuICBjb25maXJtRGVsZXRlOiBcItCU0LDQu9C4INGB0LDQutCw0YLQtSDQtNCwINCz0L4g0LjQt9Cx0YDQuNGI0LXRgtC1INC30LDQv9C40YHQvtGCP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItCe0LLQsNCwINCy0YDQtdC00L3QvtGB0YIg0YLRgNC10LHQsCDQtNCwINCx0LjQtNC1INC10LTQuNC90YHRgtCy0LXQvdCwLlwiLFxuICBhZGRDb2x1bW46IFwi0JTQvtC00LDRmCDQutC+0LvQvtC90LBcIixcbiAgYWRkUm93OiBcItCU0L7QtNCw0LTQuCDRgNC10LRcIixcbiAgcmVtb3ZlUm93OiBcItCe0YLRgdGC0YDQsNC90LhcIixcbiAgZW1wdHlSb3dzVGV4dDogXCLQndC10LzQsCDRgNC10LTQvtCy0LguXCIsXG4gIGFkZFBhbmVsOiBcItCU0L7QtNCw0LTQuCDQvdC+0LLQvlwiLFxuICByZW1vdmVQYW5lbDogXCLQntGC0YHRgtGA0LDQvdC4XCIsXG4gIGNob2ljZXNfSXRlbTogXCLRgdGC0LDQstC60LBcIixcbiAgbWF0cml4X2NvbHVtbjogXCLQmtC+0LvQvtC90LBcIixcbiAgbWF0cml4X3JvdzogXCLQoNC10LRcIixcbiAgc2F2aW5nRGF0YTogXCLQoNC10LfRg9C70YLQsNGC0LjRgtC1INGB0LUg0LfQsNGH0YPQstGD0LLQsNCw0YIg0L3QsCDRgdC10YDQstC10YDQvtGCIC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi0J3QsNGB0YLQsNC90LAg0LPRgNC10YjQutCwINC4INC90LUg0LzQvtC20LXQstC80LUg0LTQsCDQs9C4INC30LDRh9GD0LLQsNC80LUg0YDQtdC30YPQu9GC0LDRgtC40YLQtS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi0KDQtdC30YPQu9GC0LDRgtC40YLQtSDQsdC10LAg0YPRgdC/0LXRiNC90L4g0LfQsNGH0YPQstCw0L3QuCFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcItCe0LHQuNC00Lgg0YHQtSDQv9C+0LLRgtC+0YDQvdC+XCIsXG4gIHRpbWVyTWluOiBcItC80LjQvVwiLFxuICB0aW1lclNlYzogXCLRgdC10LpcIixcbiAgdGltZXJTcGVudEFsbDogXCLQn9C+0LzQuNC90LDQstGC0LUgezB9INC90LAg0L7QstCw0LAg0YHRgtGA0LDQvdC40YbQsCDQuCDQstC60YPQv9C90L4gezF9LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCLQn9C+0LzQuNC90LDQstGC0LUgezB9INC90LAg0L7QstCw0LAg0YHRgtGA0LDQvdC40YbQsC5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLQktC40LUg0L/QvtGC0YDQvtGI0LjQstGC0LUg0LLQutGD0L/QvdC+IHswfS5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcItCf0L7QvNC40L3QsNCy0YLQtSB7MH0g0L7QtCB7MX0g0L3QsCDQvtCy0LDQsCDRgdGC0YDQsNC90LjRhtCwINC4IHsyfSDQvtC0IHszfSDQstC60YPQv9C90L4uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcItCf0L7QvNC40L3QsNCy0YLQtSB7MH0g0L7QtCB7MX0g0L3QsCDQvtCy0LDQsCDRgdGC0YDQsNC90LjRhtCwLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcItCS0LjQtSDQv9C+0YLRgNC+0YjQuNCy0YLQtSDQstC60YPQv9C90L4gezB9INC+0LQgezF9LlwiLFxuICBjbGVhbkNhcHRpb246IFwi0KfQuNGB0YLQuFwiLFxuICBjbGVhckNhcHRpb246IFwi0JTQsCDRgNCw0YHRh9C40YHRgtC4XCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcItCY0LfQsdC10YDQtdGC0LUg0LTQsNGC0L7RgtC10LrQsFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLQntGC0YHRgtGA0LDQvdC10YLQtSDRmNCwINC+0LLQsNCwINC00LDRgtC+0YLQtdC60LBcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLQlNCwXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLQndC1XCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcItCU0LDQu9C4INGB0YLQtSDRgdC40LPRg9GA0L3QuCDQtNC10LrQsCDRgdCw0LrQsNGC0LUg0LTQsCDRmNCwINC+0YLRgdGC0YDQsNC90LjRgtC1INC+0LLQsNCwINC00LDRgtC+0YLQtdC60LA6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcItCU0LDQu9C4INGB0YLQtSDRgdC40LPRg9GA0L3QuCDQtNC10LrQsCDRgdCw0LrQsNGC0LUg0LTQsCDQs9C4INC+0YLRgdGC0YDQsNC90LjRgtC1INGB0LjRgtC1INC00LDRgtC+0YLQtdC60Lg/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLQndCw0YHQu9C+0LIg0L3QsCDQv9GA0LDRiNCw0ZrQtdGC0L5cIixcbiAgbW9kYWxDYW5jZWxCdXR0b25UZXh0OiBcItCe0YLQutCw0LbQuFwiLFxuICBtb2RhbEFwcGx5QnV0dG9uVGV4dDogXCLQkNC/0LvQuNGG0LjRgNCw0ZhcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wibWtcIl0gPSBtYWNlZG9uaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIm1rXCJdID0gXCLQnNCw0LrQtdC00L7QvdGB0LrQuFwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBub3J3ZWdpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiRm9ycmlnZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiTmVzdGVcIixcbiAgY29tcGxldGVUZXh0OiBcIkZ1bGxmw7hyXCIsXG4gIHByZXZpZXdUZXh0OiBcIkZvcmjDpW5kc3Zpc25pbmdcIixcbiAgZWRpdFRleHQ6IFwiUmVkaWdlcmVcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlN0YXJ0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQW5uZXQgKGJlc2tyaXYpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJJbmdlblwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJWZWxnIGFsbGVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNpZGUgezB9IGF2IHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiVGEgb3BwIHswfSBhdiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkJlc3ZhcnRlIHswfSAvIHsxfSBzcMO4cnNtw6VsXCIsXG4gIGVtcHR5U3VydmV5OiBcIkRldCBlciBpbmdlbiBzeW5saWcgc2lkZSBlbGxlciBzcMO4cnNtw6VsIGkgdW5kZXJzw7hrZWxzZW4uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVGFrayBmb3IgYXQgZHUgZnVsbGbDuHJ0ZSB1bmRlcnPDuGtlbHNlbiFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIlbDpXJlIGRhdGEgdmlzZXIgYXQgZHUgYWxsZXJlZGUgaGFyIGdqZW5ub21mw7hydCBkZW5uZSB1bmRlcnPDuGtlbHNlbi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJVbmRlcnPDuGtlbHNlbiBsYXN0ZXIuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVmVsZy4uLlwiLFxuICB2YWx1ZTogXCJ2ZXJkaVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZlbm5saWdzdCBzdmFyIHDDpSBzcMO4cnNtw6VsZXQuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlZlbm5saWdzdCBzdmFyIHDDpSBtaW5zdCBldHQgc3DDuHJzbcOlbC5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWZW5ubGlnc3Qgc3ZhciBww6Ugc3DDuHJzbcOlbCBpIGFsbGUgcmFkZXIuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJWZXJkaWVuIHNrYWwgdsOmcmUgbnVtZXJpc2suXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBtaW5zdCB7MH0gdGVnbi5cIixcbiAgdGV4dE1heExlbmd0aDogXCJWZW5ubGlnc3Qgc2tyaXYgaW5uIG1pbmRyZSBlbm4gezB9IHRlZ24uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBtZXIgZW5uIHswfSBvZyBtaW5kcmUgZW5uIHsxfSB0ZWduLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlZlbm5saWdzdCBmeWxsIGlubiBtaW5zdCB7MH0gcmFkZXIuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlZlbm5saWdzdCB2ZWxnIG1pbnN0IHswfSB2YXJpYW50ZXIuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlZlbm5saWdzdCBpa2tlIHZlbGcgbWVyIGVubiB7MH0gdmFyaWFudGVyLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgYsO4ciB2w6ZyZSBsaWsgZWxsZXIgbWVyIGVubiB7MX0gb2cgbGlrIGVsbGVyIG1pbmRyZSBlbm4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgYsO4ciB2w6ZyZSBsaWsgZWxsZXIgbWVyIGVubiB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBiw7hyIHbDpnJlIGxpayBlbGxlciBtaW5kcmUgZW5uIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBlbiBneWxkaWcgZS1wb3N0IGFkcmVzc2UuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlV0dHJ5a2tldDogezB9IHNrYWwgcmV0dXJuZXJlICdzYW50Jy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkZvcmVzcMO4cnNlbGVuIHJldHVybmVydGUgZmVpbGVuICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiRm9yZXNww7hyc2VsZW4gcmV0dXJuZXJ0ZSB0b21tZSBkYXRhLCBlbGxlciAnc3RpJyAtZWdlbnNrYXBlbiBlciBmZWlsXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRmlsc3TDuHJyZWxzZW4gYsO4ciBpa2tlIG92ZXJzdGlnZSB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJWZW5ubGlnc3Qgc2tyaXYgaW5uIGRlbiBhbmRyZSB2ZXJkaWVuLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRmlsZW4gZGluIGxhc3RlcyBvcHAuIFZlbm5saWdzdCB2ZW50IG5vZW4gc2VrdW5kZXIgb2cgcHLDuHYgaWdqZW4uXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkxhc3RlciBpbm4gLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiVmVsZyBmaWwgKGVyKSAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkluZ2VuIGZpbCB2YWxndFwiLFxuICBjb25maXJtRGVsZXRlOiBcIsOYbnNrZXIgZHUgw6Ugc2xldHRlIHBvc3Rlbj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJEZW5uZSB2ZXJkaWVuIHNrYWwgdsOmcmUgdW5pay5cIixcbiAgYWRkQ29sdW1uOiBcIkxlZ2cgdGlsIGtvbG9ubmVcIixcbiAgYWRkUm93OiBcIkxlZ2cgdGlsIHJhZFwiLFxuICByZW1vdmVSb3c6IFwiRmplcm5cIixcbiAgYWRkUGFuZWw6IFwiTGVnZyB0aWwgbnlcIixcbiAgcmVtb3ZlUGFuZWw6IFwiRmplcm5lXCIsXG4gIGNob2ljZXNfSXRlbTogXCJlbGVtZW50XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sb25uZVwiLFxuICBtYXRyaXhfcm93OiBcIlJhZFwiLFxuICBzYXZpbmdEYXRhOiBcIlJlc3VsdGF0ZW5lIGxhZ3JlcyBww6Ugc2VydmVyZW4gLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJEZXQgb3Bwc3RvIGVuIGZlaWwsIG9nIHZpIGt1bm5lIGlra2UgbGFncmUgcmVzdWx0YXRlbmUuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlc3VsdGF0ZW5lIGJsZSBsYWdyZXQhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcsO4diBpZ2plblwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSBww6UgZGVubmUgc2lkZW4gb2cgezF9IHRvdGFsdC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSBww6UgZGVubmUgc2lkZW4uXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSB0b3RhbHQuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJEdSBoYXIgdGlsYnJha3QgezB9IGF2IHsxfSBww6UgZGVubmUgc2lkZW4gb2cgdG90YWx0IHsyfSBhdiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkR1IGhhciB0aWxicmFrdCB7MH0gYXYgezF9IHDDpSBkZW5uZSBzaWRlbi5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJEdSBoYXIgdGlsYnJha3QgezB9IGF2IHsxfSB0b3RhbHQuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJSZW5zXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJLbGFyXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlZlbGcgRmlsXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkZqZXJuIGRlbm5lIGZpbGVuXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiSmFcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5laVwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJFciBkdSBzaWtrZXIgcMOlIGF0IGR1IHZpbCBmamVybmUgZGVubmUgZmlsZW46IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkVyIGR1IHNpa2tlciBww6UgYXQgZHUgdmlsIGZqZXJuZSBhbGxlIGZpbGVuZT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlNww7hyc23DpWxzdGl0dGVsXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcIm5vXCJdID0gbm9yd2VnaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIm5vXCJdID0gXCJub3Jza1wiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBwZXJzaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItmC2KjZhNuMXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLYqNi52K/bjFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi2KraqdmF24zZhFwiLFxuICBwcmV2aWV3VGV4dDogXCLZvtuM2LQg2YbZhdin24zYtFwiLFxuICBlZGl0VGV4dDogXCLZiNuM2LHYp9uM2LRcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIti02LHZiNi5XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi2K/bjNqv2LEo2KrZiNi224zYrSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcItmH24zahlwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLYp9mG2KrYrtin2Kgg2YfZhdmHXCIsXG4gIHByb2dyZXNzVGV4dDogXCLYtdmB2K3ZhyB7MH0g2KfYsiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcItmF2YjYsdivIHswfSDYp9iyIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwi2KrYudiv2KfYryDZvtin2LPYriB7MH0vezF9INiz2YjYp9mEXCIsXG4gIGVtcHR5U3VydmV5OiBcIti12YHYrdmHINin24wg24zYpyDar9iy24zZhtmHINin24wg2KjYsdin24wg2KfbjNmGINm+2LHYs9i02YbYp9mF2Ycg2YXZiNis2YjYryDZhtuM2LPYqi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLYp9iyINi02YXYpyDYqNin2KjYqiDYqtqp2YXbjNmEINin24zZhiDZvtix2LPYtNmG2KfZhdmHINmF2KrYtNqp2LHbjNmFXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLYqNmHINmG2LjYsSDZhduMINix2LPYryDZh9mFINmH2YUg2KfaqdmG2YjZhiDZvtix2LPYtNmG2KfZhdmHINix2Kcg2KraqdmF24zZhCDaqdix2K/ZhyDYp9uM2K8uXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi2K/Ysdit2KfZhCDYp9uM2KzYp9ivINm+2LHYs9i02YbYp9mF2YdcIixcbiAgb3B0aW9uc0NhcHRpb246IFwi2KfZhtiq2K7Yp9ioINqp2YbbjNivLi4uXCIsXG4gIHZhbHVlOiBcItmF2YLYr9in2LFcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLZhNi32YHYpyDYqNmHINiz2YjYp9mEINm+2KfYs9iuINiv2YfbjNivXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcItmE2LfZgdinINit2K/Yp9mC2YQg2KjZhyDbjNqpINiz2YjYp9mEINm+2KfYs9iuINiv2YfbjNivLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItmE2LfZgdinINiz2YjYp9mE2KfYqiDYqtmF2KfZhSDYs9i32LHZh9inINix2Kcg2b7Yp9iz2K4g2K/Zh9uM2K8uXCIsXG4gIG51bWVyaWNFcnJvcjogXCLZhdmC2K/Yp9ixINio2KfbjNivINi52K/Yr9uMINio2KfYtNivXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi2YTYt9mB2Kcg2K3Yr9in2YLZhCAgezB9INit2LHZgSDZiNin2LHYryDaqdmG24zYr1wiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItmE2LfZgdinINqp2YXYqtixINin2LIgIHswfSDYrdix2YEg2YjYp9ix2K8g2qnZhtuM2K8uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi2YTYt9mB2Kcg2KjbjNi02KrYsSDYp9iyICB7MH0g2K3YsdmBINmIINqp2YXYqtixINin2LIgezF9INit2LHZgSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLZhNi32YHYpyDYrdiv2KfZgtmEIHswfSDYs9i32LEg2YjYp9ix2K8g2qnZhtuM2K8uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItit2K/Yp9mC2YQgezB9INin2YbYqtiu2KfYqCDaqdmG24zYry5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi2YTYt9mB2Kcg2KjbjNi02KrYsSDYp9iyICB7MH0g2KfZhtiq2K7Yp9ioINqp2YbbjNivLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgXCInezB9JyDYqNin24zYryDYqNuM2YYgezF9INmIIHsyfSDYqNin2LTYr1wiLFxuICBudW1lcmljTWluOiBcIid7MH0nINio2LLYsdqv2KrYsSDZhdiz2KfZiNuMIHsxfSDYqNin2LTYr1wiLFxuICBudW1lcmljTWF4OiBcIid7MH0nINio2KfbjNivINqp2Yjahtqp2KrYsSDbjNinINmF2LPYp9mI24wgezF9INio2KfYtNivXCIsXG4gIGludmFsaWRFbWFpbDogXCLZhNi32YHYpyDYp9uM2YXbjNmEINi12K3bjNitINiv2LHYrCDaqdmG24zYr1wiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLYudio2KfYsdiqOiB7MH0g2b7Yp9iz2K4g2KjYp9uM2K8gJ3RydWUnINio2KfYtNivLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi2K/Ysdiu2YjYp9iz2Kog2KjYpyDYrti32Kcg2LHZiNio2LHZiCDYtNivOiAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgIFwi2K/Ysdiu2YjYp9iz2Kog2YXYs9uM2LHbjCDYrtin2YTbjCDYqNin2LLar9i02Kog2K/Yp9iv2Ycg24zYpyDZhdiz24zYsSDYr9ix2LPYqiDYqtmG2LjbjNmFINmG2LTYr9mHXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi2KjbjNi02KrYsduM2YYg2K3YrNmFINmF2KzYp9iyINmB2KfbjNmEOiB7MH1cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItmF2YLYr9in2LEgJ9iv24zar9ixJyDYsdinINmI2KfYsdivINqp2YbbjNivXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICBcItmB2KfbjNmEINiv2LEg2K3Yp9mEINii24zZhNmI2K8g2KfYs9iqLiDZhNi32YHYpyDYtdio2LEg2qnZhtuM2K8uXCIsXG4gIGxvYWRpbmdGaWxlOiBcItio2KfYsdqv24zYsduMLi4uXCIsXG4gIGNob29zZUZpbGU6IFwi2KfZhtiq2K7Yp9ioINmB2KfbjNmEKNmH2KcpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLZh9uM2oYg2YHYp9uM2YTbjCDYp9mG2KrYrtin2Kgg2YbYtNiv2YdcIixcbiAgY29uZmlybURlbGV0ZTogXCLYotuM2Kcg2YXYp9uM2YQg2KjZhyDYrdiw2YEg2KfbjNmGINix2K/bjNmBINmH2LPYqtuM2K/Yn1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItin24zZhiDZhdmC2K/Yp9ixINio2KfbjNivINi624zYsSDYqtqp2LHYp9ix24wg2KjYp9i02K9cIixcbiAgYWRkQ29sdW1uOiBcItiz2KrZiNmGINis2K/bjNivXCIsXG4gIGFkZFJvdzogXCLYs9i32LEg2KzYr9uM2K9cIixcbiAgcmVtb3ZlUm93OiBcItit2LDZgVwiLFxuICBhZGRQYW5lbDogXCLYrNiv24zYr1wiLFxuICByZW1vdmVQYW5lbDogXCLYrdiw2YFcIixcbiAgY2hvaWNlc19JdGVtOiBcItii24zYqtmFXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi2LPYqtmI2YZcIixcbiAgbWF0cml4X3JvdzogXCLYs9i32LFcIixcbiAgc2F2aW5nRGF0YTogXCLZhtiq2KfbjNisINiv2LEg2K3Yp9mEINiw2K7bjNix2Ycg2LPYp9iy24wg2K/YsSDYs9ix2YjYsSDYp9iz2KpcIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcItiu2LfYp9uM24wg2K/YsSDYsNiu24zYsdmHINiz2KfYstuMINmG2KrYp9uM2Kwg2LHYriDYr9in2K/ZhyDYp9iz2KpcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi2YbYqtin24zYrCDYqNinINmF2YjZgdmC24zYqiDYsNiu24zYsdmHINi02K9cIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcItmF2KzYr9ivINiq2YTYp9i0INqp2YbbjNivXCIsXG4gIHRpbWVyTWluOiBcItiv2YLbjNmC2YdcIixcbiAgdGltZXJTZWM6IFwi2KvYp9mG24zZh1wiLFxuICB0aW1lclNwZW50QWxsOiBcIti02YXYpyDZhdiv2KogezB9INiv2LEg2KfbjNmGINi12YHYrdmHINmIINmF2K/YqiB7MX0g2LHYpyDYr9ixINmF2KzZhdmI2Lkg2LPZvtix24wg2qnYsdiv2Ycg2KfbjNivLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCLYtNmF2Kcg2YXYr9iqIHswfSDYsdinINiv2LEg2KfbjNmGINi12YHYrdmHINiz2b7YsduMINqp2LHYr9mHINin24zYry5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLYtNmF2Kcg2YXYr9iqIHswfSDYsdinINiv2LEg2YXYrNmF2YjYuSDYs9m+2LHbjCDaqdix2K/ZhyDYp9uM2K8uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLYtNmF2Kcg2YXYr9iqIHswfSDYp9iyIHsxfSDYr9ixINin24zZhiDYtdmB2K3ZhyDZiCDZhdiv2KogezJ9INin2LIgezN9INix2Kcg2K/YsSDZhdis2YXZiNi5INiz2b7YsduMINqp2LHYr9mHINin24zYry5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi2LTZhdinINmF2K/YqiB7MH0g2KfYsiB7MX0g2LHYpyDYr9ixINin24zZhiDYtdmB2K3ZhyDYs9m+2LHbjCDaqdix2K/ZhyDYp9uM2K8uXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi2LTZhdinINmF2K/YqiB7MH0g2KfYsiB7MX0g2LHYpyDYr9ixINmF2KzZhdmI2Lkg2LPZvtix24wg2qnYsdiv2Ycg2KfbjNivLlwiLFxuICBjbGVhbkNhcHRpb246IFwi2b7Yp9qp2LPYp9iy24xcIixcbiAgY2xlYXJDYXB0aW9uOiBcItiu2KfZhNuMINqp2LHYr9mGXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcItin2YbYqtiu2KfYqCDZgdin24zZhFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLYrdiw2YEg2KfbjNmGINmB2KfbjNmEXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi2KjZhNmHXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLYrtuM2LFcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi2KLbjNinINmF24zYrtmI2KfZh9uM2K8g2KfbjNmGINmB2KfbjNmEINix2Kcg2b7Yp9qpINqp2YbbjNivOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLYotuM2Kcg2YXbjNiu2YjYp9mH24zYryDYqtmF2KfZhSDZgdin24zZhCDZh9inINix2Kcg2b7Yp9qpINqp2YbbjNivP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwi2LnZhtmI2KfZhiDYs9mI2KfZhFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmYVwiXSA9IHBlcnNpYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZmFcIl0gPSBcItmB2KfYsdmS2LPZkNmJXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBvbGlzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJXc3RlY3pcIixcbiAgcGFnZU5leHRUZXh0OiBcIkRhbGVqXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJHb3Rvd2VcIixcbiAgcHJldmlld1RleHQ6IFwiUHJlbWllcmFcIixcbiAgZWRpdFRleHQ6IFwiRWR5Y2phXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIklubmEgb2Rwb3dpZWTFuiAod3Bpc3opXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJCcmFrXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIld5Ymllcnogd3N6eXN0a2llXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTdHJvbmEgezB9IHogezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJaYXBpcyB7MH0geiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIk9kcG93aWVkemkgbmEgezB9L3sxfSBweXRhbmlhXCIsXG4gIGVtcHR5U3VydmV5OiBcIk5pZSBtYSB3aWRvY3pueWNoIHB5dGHFhC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJEemnEmWt1amVteSB6YSB3eXBlxYJuaWVuaWUgYW5raWV0eSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIlogbmFzenljaCB6YXBpc8OzdyB3eW5pa2EsIMW8ZSB3eXBlxYJuacWCZcWbIGp1xbwgdMSZIGFua2lldMSZLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlRyd2Egd2N6eXR5d2FuaWUgYW5raWV0eS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJXeWJpZXJ6Li4uXCIsXG4gIHZhbHVlOiBcIldhcnRvxZvEh1wiLFxuICByZXF1aXJlZEVycm9yOiBcIlByb3N6xJkgb2Rwb3dpZWR6aWXEhyBuYSB0byBweXRhbmllLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQcm9zesSZIG9kcG93aWVkemllxIcgbmEgY28gbmFqbW5pZWogamVkbm8gcHl0YW5pZS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJQcm9zesSZIG9kcG93aWVkemllxIcgbmEgd3N6eXN0a2llIHB5dGFuaWEuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJXIHR5bSBwb2x1IG1vxbxuYSB3cGlzYcSHIHR5bGtvIGxpY3pieS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQcm9zesSZIHdwaXNhxIcgY28gbmFqbW5pZWogezB9IHpuYWvDs3cuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUHJvc3rEmSB3cGlzYcSHIG1uaWVqIG5pxbwgezB9IHpuYWvDs3cuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUHJvc3rEmSB3cGlzYcSHIHdpxJljZWogbmnFvCB7MH0gaSBtbmllaiBuacW8IHsxfSB6bmFrw7N3LlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlByb3N6xJkgdXp1cGXFgm5pxIcgcHJ6eW5ham1uaWVqIHswfSB3aWVyc3p5LlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJQcm9zesSZIHd5YnJhxIcgY28gbmFqbW5pZWogezB9IHBvenljamkuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlByb3N6xJkgd3licmHEhyBuaWUgd2nEmWNlaiBuacW8IHswfSBwb3p5Y2ppLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiT2Rwb3dpZWTFuiAnezB9JyBwb3dpbm5hIGJ5xIcgd2nEmWtzemEgbHViIHLDs3duYSB7MX0gb3JheiBtbmllanN6YSBsdWIgcsOzd25hIHsyfVwiLFxuICBudW1lcmljTWluOiBcIk9kcG93aWVkxbogJ3swfScgcG93aW5uYSBiecSHIHdpxJlrc3phIGx1YiByw7N3bmEgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiT2Rwb3dpZWTFuiAnezB9JyBwb3dpbm5hIGJ5xIcgbW5pZWpzemEgbHViIHLDs3duYSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlByb3N6xJkgcG9kYcSHIHByYXdpZMWCb3d5IGFkcmVzIGVtYWlsLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJXeXJhxbxlbmllOiB7MH0gcG93aW5ubyB3cmFjYcSHICdwcmF3ZHppd2UnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwixbvEhWRhbmllIHp3csOzY2nFgm8gYsWCxIVkICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwixbvEhWRhbmllIG5pZSB6d3LDs2NpxYJvIGRhbnljaCBhbGJvIMWbY2llxbxrYSBqZXN0IG5pZXByYXdpZMWCb3dhXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiUm96bWlhciBwcnplc8WCYW5lZ28gcGxpa3UgbmllIG1vxbxlIHByemVrcmFjemHEhyB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJQcm9zesSZIHBvZGHEhyBpbm7EhSBvZHBvd2llZMW6LlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiVHJ3YSBwcnplbm9zemVuaWUgVHdvamVnbyBwbGlrdSwgcHJvc3rEmSBzcHLDs2Jvd2HEhyBwb25vd25pZSB6YSBraWxrYSBzZWt1bmQuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIsWBYWRvd2FuaWUuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJXeWJpZXJ6IHBsaWsoaSkuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5pZSB3eWJyYW5vIMW8YWRuZWdvIHBsaWt1XCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiQ2hjZXN6IHNrYXNvd2HEhyBuYWdyYW5pZT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJUYSB3YXJ0b8WbxIcgcG93aW5uYSBiecSHIHd5asSFdGtvd2EuXCIsXG4gIGFkZENvbHVtbjogXCJEb2RhaiBrb2x1bW7EmVwiLFxuICBhZGRSb3c6IFwiRG9kYWogd2llcnN6XCIsXG4gIHJlbW92ZVJvdzogXCJVc3XFhFwiLFxuICBhZGRQYW5lbDogXCJEb2RhaiBwYW5lbFwiLFxuICByZW1vdmVQYW5lbDogXCJVc3XFhFwiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWxlbWVudFwiLFxuICBtYXRyaXhfY29sdW1uOiBcIktvbHVtbmFcIixcbiAgbWF0cml4X3JvdzogXCJXaWVyc3pcIixcbiAgc2F2aW5nRGF0YTogXCJaYXBpc3VqxJkgd3luaWtpIGFua2lldHkgbmEgc2Vyd2VyemUuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIld5c3TEhXBpxYIgYsWCxIVkIGkgd3luaWtpIG5pZSBtb2fFgnkgem9zdGHEhyB6YXBpc2FuZS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiV3luaWtpIHpvc3RhxYJ5IHBvcHJhd25pZSB6YXBpc2FuZSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlNwcsOzYnVqIHBvbm93bmllXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJTcMSZZHppxYJlxZsgezB9IG5hIHRlaiBzdHJvbmllIGEgdyBzdW1pZSB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlNwxJlkemnFgmXFmyB7MH0gbmEgdGVqIHN0cm9uaWUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiU3DEmWR6acWCZcWbIHcgc3VtaWUgezB9LlwiLFxuICB0aW1lckxpbWl0QWxsOiBcIlNwxJlkemnFgmXFmyB7MH0geiB7MX0gbmEgdGVqIHN0cm9uaWUgYSB3IHN1bWllIHsyfSB6IHszfS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiU3DEmWR6acWCZcWbIHswfSB6IHsxfSBuYSB0ZWogc3Ryb25pZVwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlNwxJlkemnFgmXFmyB7MH0geiB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJXeWN6ecWbxIdcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkphc25lXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIld5YmllcnogcGxpa1wiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJVc3XFhCB0ZW4gcGxpa1wiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIlRha1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTmllXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkplc3RlxZsgcGV3aWVuLCDFvGUgY2hjZXN6IHVzdW7EhcSHIHRlbiBwbGlrOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCJKZXN0ZcWbIHBld2llbiwgxbxlIGNoY2VzeiB1c3VuxIXEhyB3c3p5c3RraWUgcGxpa2k/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJUeXR1xYIgcHl0YW5pYVwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJwbFwiXSA9IHBvbGlzaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJwbFwiXSA9IFwicG9sc2tpXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBvcnR1Z3Vlc2VCclN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBbnRlcmlvclwiLFxuICBwYWdlTmV4dFRleHQ6IFwiUHLDs3hpbW9cIixcbiAgY29tcGxldGVUZXh0OiBcIkZpbmFsaXphclwiLFxuICBwcmV2aWV3VGV4dDogXCJQcsOpLXZpc3VhbGl6YcOnw6NvXCIsXG4gIGVkaXRUZXh0OiBcIkVkaXRhclwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiQ29tZcOnYXJcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJPdXRyb3MgKGRlc2NyZXZlcilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk5lbmh1bVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJTZWxlY2lvbmFyIFRvZG9zXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQw6FnaW5hIHswfSBkZSB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlJlZ2lzdHJvIHswfSBkZSB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIlJlc3Bvc3RhcyB7MH0vezF9IHBlcmd1bnRhc1wiLFxuICBlbXB0eVN1cnZleTogXCJOw6NvIGjDoSBww6FnaW5hIHZpc8OtdmVsIG91IHBlcmd1bnRhIG5hIHBlc3F1aXNhLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIk9icmlnYWRvIHBvciBmaW5hbGl6YXIgYSBwZXNxdWlzYSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk5vc3NvcyByZWdpc3Ryb3MgbW9zdHJhbSBxdWUgdm9jw6ogasOhIGZpbmFsaXpvdSBhIHBlc3F1aXNhLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkEgcGVzcXVpc2EgZXN0w6EgY2FycmVnYW5kby4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJTZWxlY2lvbmUuLi5cIixcbiAgdmFsdWU6IFwidmFsb3JcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IsIHJlc3BvbmRhIGEgcGVyZ3VudGEuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlBvciBmYXZvciwgcmVzcG9uZGEgcGVsbyBtZW5vcyB1bWEgcGVyZ3VudGEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6XG4gICAgXCJQb3IgZmF2b3IsIHJlc3BvbmRhIGFzIHBlcmd1bnRhcyBlbSB0b2RhcyBhcyBsaW5oYXMuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJPIHZhbG9yIGRldmUgc2VyIG51bcOpcmljby5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQb3IgZmF2b3IsIGluc2lyYSBwZWxvIG1lbm9zIHswfSBjYXJhY3RlcmVzLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIG1lbm9zIGRlIHswfSBjYXJhY3RlcmVzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIG1haXMgZGUgezB9IGUgbWVub3MgZGUgezF9IGNhcmFjdGVyZXMuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUHJlZW5jaGEgcGVsbyBtZW5vcyB7MH0gbGluaGFzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTZWxlY2lvbmUgcGVsbyBtZW5vcyB7MH0gb3DDp8O1ZXMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBvciBmYXZvciwgc2VsZWNpb25lIG7Do28gbWFpcyBkbyBxdWUgezB9IG9ww6fDtWVzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiTyAnezB9JyBkZXZlIHNlciBpZ3VhbCBvdSBzdXBlcmlvciBhIHsxfSBlIGlndWFsIG91IG1lbm9yIHF1ZSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IHN1cGVyaW9yIGEgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiTyAnezB9JyBkZXZlIHNlciBpZ3VhbCBvdSBpbmZlcmlvciBhIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUG9yIGZhdm9yLCBpbmZvcm1lIHVtIGUtbWFpbCB2w6FsaWRvLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJBIGV4cHJlc3PDo286IHswfSBkZXZlIHJldG9ybmFyICd2ZXJkYWRlaXJvJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkEgcmVxdWlzacOnw6NvIHJldG9ybm91IG8gZXJybyAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkEgcmVxdWlzacOnw6NvIG7Do28gcmV0b3Jub3UgZGFkb3Mgb3UgbyAnY2FtaW5obycgZGEgcmVxdWlzacOnw6NvIG7Do28gZXN0w6EgY29ycmV0b1wiLFxuICBleGNlZWRNYXhTaXplOiBcIk8gdGFtYW5obyBkbyBhcnF1aXZvIG7Do28gZGV2ZSBleGNlZGVyIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlBvciBmYXZvciwgaW5mb3JtZSBvIG91dHJvIHZhbG9yLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiU2V1IGFycXVpdm8gZXN0w6Egc2VuZG8gY2FycmVnYWRvLiBQb3IgZmF2b3IsIGFndWFyZGUgYWxndW5zIHNlZ3VuZG9zIGUgdGVudGUgbm92YW1lbnRlLlwiLFxuICBsb2FkaW5nRmlsZTogXCJDYXJyZWdhbmRvLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiU2VsZWNpb25lIG8ocykgYXJxdWl2byhzKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTmVuaHVtIGFycXVpdm8gZXNjb2xoaWRvXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVGVtIGNlcnRlemEgcXVlIGRlc2VqYSBkZWxldGFyP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkVzc2UgdmFsb3IgZGV2ZSBzZXIgw7puaWNvLlwiLFxuICBhZGRDb2x1bW46IFwiQWRpY2lvbmFyIGNvbHVuYVwiLFxuICBhZGRSb3c6IFwiQWRpY2lvbmFyIGxpbmhhXCIsXG4gIHJlbW92ZVJvdzogXCJSZW1vdmVyIGxpbmhhXCIsXG4gIGFkZFBhbmVsOiBcIkFkaWNpb25hciBub3ZvXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlJlbW92ZXJcIixcbiAgY2hvaWNlc19JdGVtOiBcIml0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bmFcIixcbiAgbWF0cml4X3JvdzogXCJMaW5oYVwiLFxuICBzYXZpbmdEYXRhOiBcIk9zIHJlc3VsdGFkb3MgZXN0byBzZW5kbyBzYWx2b3Mgbm8gc2Vydmlkb3IuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIk9jb3JyZXUgdW0gZXJybyBlIG7Do28gZm9pIHBvc3PDrXZlbCBzYWx2YXIgb3MgcmVzdWx0YWRvcy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiT3MgcmVzdWx0YWRvcyBmb3JhbSBzYWx2b3MgY29tIHN1Y2Vzc28hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJUZW50ZSBub3ZhbWVudGVcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlZ1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlZvY8OqIGdhc3RvdSB7MH0gbmVzdGEgcMOhZ2luYSBlIHsxfSBubyB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiVm9jw6ogZ2FzdG91IHswfSBuZXN0YSBww6FnaW5hLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlZvY8OqIGdhc3RvdSB7MH0gbm8gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwiVm9jw6ogZ2FzdG91IHswfSBkZSB7MX0gbmVzdGEgcMOhZ2luYSBlIHsyfSBkZSB7M30gbm8gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIlZvY8OqIGdhc3RvdSB7MH0gZGUgezF9IG5lc3RhIHDDoWdpbmEuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiVm9jw6ogZ2FzdG91IHswfSBkZSB7MX0gbm8gdG90YWwuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJMaW1wYXJcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkxpbXBhclwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJFc2NvbGhlciBhcnF1aXZvXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlJlbW92ZXIgZXN0ZSBhcnF1aXZvXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiU2ltXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOw6NvXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIlRlbSBjZXJ0ZXphIHF1ZSBkZXNlamEgcmVtb3ZlciBlc3RlIGFycXVpdm86IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIlRlbSBjZXJ0ZXphIHF1ZSBkZXNlamEgcmVtb3ZlciB0b2RvcyBvcyBhcnF1aXZvcz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlTDrXR1bG8gZGEgcXVlc3TDo29cIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicHQtYnJcIl0gPSBwb3J0dWd1ZXNlQnJTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wicHQtYnJcIl0gPSBcInBvcnR1Z3XDqnMgYnJhc2lsZWlyb1wiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBwb3J0dWd1ZXNlU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkFudGVyaW9yXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJQcsOzeGltb1wiLFxuICBjb21wbGV0ZVRleHQ6IFwiRmluYWxpemFyXCIsXG4gIHByZXZpZXdUZXh0OiBcIlByw6ktdmlzdWFsaXphw6fDo29cIixcbiAgZWRpdFRleHQ6IFwiRWRpdGFyXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJDb21lw6dhclwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk91dHJvcyAoZGVzY3JldmVyKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTmVuaHVtXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlNlbGVjaW9uYXIgVG9kb3NcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlDDoWdpbmEgezB9IGRlIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiUmVnaXN0byB7MH0gZGUgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJSZXNwb3N0YXMgezB9L3sxfSBwZXJndW50YXNcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTsOjbyBow6EgcMOhZ2luYSB2aXPDrXZlbCBvdSBwZXJndW50YSBubyBxdWVzdGlvbsOhcmlvLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIk9icmlnYWRvIHBvciBmaW5hbGl6YXIgbyBxdWVzdGlvbsOhcmlvIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiT3Mgbm9zc29zIHJlZ2lzdG9zIG1vc3RyYW0gcXVlIGrDoSBmaW5hbGl6b3UgbyBxdWVzdGlvbsOhcmlvLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIk8gcXVlc3Rpb27DoXJpbyBlc3TDoSBhIGNhcnJlZ2FyLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlbGVjaW9uZS4uLlwiLFxuICB2YWx1ZTogXCJ2YWxvclwiLFxuICByZXF1aXJlZEVycm9yOiBcIlBvciBmYXZvciwgcmVzcG9uZGEgw6AgcGVyZ3VudGEuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlBvciBmYXZvciwgcmVzcG9uZGEgcGVsbyBtZW5vcyBhIHVtYSBwZXJndW50YS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjpcbiAgICBcIlBvciBmYXZvciwgcmVzcG9uZGEgw6BzIHBlcmd1bnRhcyBlbSB0b2RhcyBhcyBsaW5oYXMuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJPIHZhbG9yIGRldmUgc2VyIG51bcOpcmljby5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQb3IgZmF2b3IsIGluc2lyYSBwZWxvIG1lbm9zIHswfSBjYXJhY3RlcmVzLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIG1lbm9zIGRlIHswfSBjYXJhY3RlcmVzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIG1haXMgZGUgezB9IGUgbWVub3MgZGUgezF9IGNhcmFjdGVyZXMuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUHJlZW5jaGEgcGVsbyBtZW5vcyB7MH0gbGluaGFzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTZWxlY2lvbmUgcGVsbyBtZW5vcyB7MH0gb3DDp8O1ZXMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBvciBmYXZvciwgc2VsZWNpb25lIG5vIG3DoXhpbW8gezB9IG9ww6fDtWVzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiTyAnezB9JyBkZXZlIHNlciBpZ3VhbCBvdSBzdXBlcmlvciBhIHsxfSBlIGlndWFsIG91IG1lbm9yIHF1ZSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IHN1cGVyaW9yIGEgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiTyAnezB9JyBkZXZlIHNlciBpZ3VhbCBvdSBpbmZlcmlvciBhIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUG9yIGZhdm9yLCBpbnNpcmEgdW0gZS1tYWlsIHbDoWxpZG8uXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkEgZXhwcmVzc8OjbzogezB9IGRldmUgcmV0b3JuYXIgJ3ZlcmRhZGVpcm8nLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTyBwZWRpZG8gcmV0b3Jub3UgbyBlcnJvICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiTyBwZWRpZG8gbsOjbyByZXRvcm5vdSBkYWRvcyBvdSBvICdjYW1pbmhvJyBkbyBwZWRpZG8gbsOjbyBlc3TDoSBjb3JyZXRvXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiTyB0YW1hbmhvIGRvIGFycXVpdm8gbsOjbyBkZXZlIGV4Y2VkZXIgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbyBvdXRybyB2YWxvci5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIk8gc2V1IGZpY2hlaXJvIGVzdMOhIGEgY2FycmVnYXIuIFBvciBmYXZvciwgYWd1YXJkZSBhbGd1bnMgc2VndW5kb3MgZSB0ZW50ZSBub3ZhbWVudGUuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkEgY2FycmVnYXIuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJTZWxlY2lvbmUgbyhzKSBhcnF1aXZvKHMpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJOZW5odW0gZmljaGVpcm8gZXNjb2xoaWRvXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVGVtIGEgY2VydGV6YSBxdWUgZGVzZWphIGFwYWdhcj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJFc3RlIHZhbG9yIGRldmUgc2VyIMO6bmljby5cIixcbiAgYWRkQ29sdW1uOiBcIkFkaWNpb25hciBjb2x1bmFcIixcbiAgYWRkUm93OiBcIkFkaWNpb25hciBsaW5oYVwiLFxuICByZW1vdmVSb3c6IFwiUmVtb3ZlciBsaW5oYVwiLFxuICBhZGRQYW5lbDogXCJBZGljaW9uYXIgbm92b1wiLFxuICByZW1vdmVQYW5lbDogXCJSZW1vdmVyXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sdW5hXCIsXG4gIG1hdHJpeF9yb3c6IFwiTGluaGFcIixcbiAgc2F2aW5nRGF0YTogXCJPcyByZXN1bHRhZG9zIGVzdMOjbyBhIHNlciBndWFyZGFkb3Mgbm8gc2Vydmlkb3IuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIk9jb3JyZXUgdW0gZXJybyBlIG7Do28gZm9pIHBvc3PDrXZlbCBndWFyZGFyIG9zIHJlc3VsdGFkb3MuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIk9zIHJlc3VsdGFkb3MgZm9yYW0gZ3VhcmRhZG9zIGNvbSBzdWNlc3NvIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiVGVudGUgbm92YW1lbnRlXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWdcIixcbiAgdGltZXJTcGVudEFsbDogXCJWb2PDqiBnYXN0b3UgezB9IG5lc3RhIHDDoWdpbmEgZSB7MX0gbm8gdG90YWwuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlZvY8OqIGdhc3RvdSB7MH0gbmVzdGEgcMOhZ2luYS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJWb2PDqiBnYXN0b3UgezB9IG5vIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0QWxsOiBcIlZvY8OqIGdhc3RvdSB7MH0gZGUgezF9IG5lc3RhIHDDoWdpbmEgZSB7Mn0gZGUgezN9IG5vIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJWb2PDqiBnYXN0b3UgezB9IGRlIHsxfSBuZXN0YSBww6FnaW5hLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlZvY8OqIGdhc3RvdSB7MH0gZGUgezF9IG5vIHRvdGFsLlwiLFxuICBjbGVhbkNhcHRpb246IFwiTGltcGFyXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJMaW1wYXJcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiRXNjb2xoZXIgZmljaGVpcm9cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiUmVtb3ZlciBlc3RlIGZpY2hlaXJvXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiU2ltXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOw6NvXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIlRlbSBhIGNlcnRlemEgcXVlIGRlc2VqYSByZW1vdmVyIGVzdGUgZmljaGVpcm86IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIlRlbSBhIGNlcnRlemEgcXVlIGRlc2VqYSByZW1vdmVyIHRvZG9zIG9zIGZpY2hlaXJvcz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlTDrXR1bG8gZGEgcXVlc3TDo29cIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicHRcIl0gPSBwb3J0dWd1ZXNlU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInB0XCJdID0gXCJwb3J0dWd1w6pzXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHJvbWFuaWFuU3VydmV5U3RyaW5nczogYW55ID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJlY2VkZW50XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJVcm3Eg3RvclwiLFxuICBjb21wbGV0ZVRleHQ6IFwiRmluYWxpemFyZVwiLFxuICBwcmV2aWV3VGV4dDogXCJwcmV2aXp1YWxpemFyZVwiLFxuICBlZGl0VGV4dDogXCJFZGl0YcibaVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwic3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbHR1bChwcmVjaXphxaNpKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTmljaSB1bnVsXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlNlbGVjdGVhesSDIHRvdFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSBkaW4gezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCLDjm5yZWdpc3RyYXJlIHswfSBkaW4gezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJSxINzcHVuc3VyaSBsYSB7MH0gLyB7MX0gw65udHJlYsSDcmlcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTnUgc3VudCDDrm50cmVixINyaSBwZW50cnUgYWNlc3QgY2hlc3Rpb25hclwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlbEgyBtdWzFo3VtaW0gcGVudHJ1IHRpbXB1bCBhY29yZGF0IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiRGluIMOubnJlZ2lzdHLEg3JpbGUgbm9hc3RyZSByZWllc2UgY8SDIGHIm2kgY29tcGxldGF0IGRlamEgYWNlc3QgY2hlc3Rpb25hci5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJDaGVzdGlvbmFydWwgc2Ugw65uY2FyY8SDLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIkFsZWdlxaNpLi4uXCIsXG4gIHZhbHVlOiBcInZhbG9hcmVcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJSxINzcHVuc3VsIGxhIGFjZWFzdMSDIMOubnRyZWJhcmUgZXN0ZSBvYmxpZ2F0b3JpdS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiVsSDIHJ1Z8SDbSBzxIMgcsSDc3B1bmRlyJtpIGxhIGNlbCBwdcibaW4gbyDDrm50cmViYXJlLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlRvYXRlIHLEg3NwdW5zdXJpbGUgc3VudCBvYmxpZ2F0b3JpaVwiLFxuICBudW1lcmljRXJyb3I6IFwiUsSDc3B1bnN1bCB0cmVidWllIHPEgyBmaWUgbnVtZXJpYy5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJUcmVidWllIHPEgyBpbnRyb2R1Y2XIm2kgbWluaW0gezB9IGNhcmFjdGVyZS5cIixcbiAgdGV4dE1heExlbmd0aDogXCJUcmVidWllIHPEgyBpbnRyb2R1Y2XIm2kgbWF4aW0gezB9IGNhcmFjdGVyZS5cIixcbiAgdGV4dE1pbk1heExlbmd0aDpcbiAgICBcIlRyZWJ1aWUgc8SDIGludHJvZHVjZcibaSBtYWkgbXVsdCBkZSB7MH0gyJlpIG1haSBwdcibaW4gZGUgezF9IGNhcmFjdGVyZS5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJUcmVidWllIHPEgyBjb21wbGV0YcibaSBtaW5pbSB7MH0gcsOibmR1cmkuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlRyZWJ1aWUgc8SDIHNlbGVjdGHIm2kgbWluaW0gezB9IG9wxaNpdW5pLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJUcmVidWllIHPEgyBzZWxlY3RhyJtpIG1heGltIHswfSBvcMWjaXVuaS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIlLEg3NwdW5zdWwgJ3swfScgdHJlYnVpZSBzxIMgZmllIG1haSBtYXJlIHNhdSBlZ2FsIGNhIHsxfSDFn8OuIG1haSBtaWMgc2F1IGVnYWwgY3UgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1hcmUgc2F1IGVnYWwgY2EgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1pYyBzYXUgZWdhbCBjYSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlRyZWJ1aWUgc8SDIGludHJvZHVjZcWjaSBvIGFkcmVzYSBkZSBlbWFpbCB2YWxpZMSDLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJFeHByZXNpYTogezB9IGFyIHRyZWJ1aSBzxIMgcmV0dXJuZXplIOKAnmFkZXbEg3JhdOKAnS5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlJlcXVlc3QtdWwgYSByZXR1cm5hdCBlcm9hcmVhICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiUmVxdWVzdC11bCBudSBhIHJldHVybmF0IGRhdGUgc2F1IHByb3ByaWV0YXRlYSAncGF0aCcgZXN0ZSBpbmNvcmVjdMSDXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRGltZW5zaXVuZWEgZmnFn2llcnVsdWkgbnUgdHJlYnVpZSBzxIMgZGVwxIPFn2Vhc2PEgyB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJUcmVidWllIHPEgyBjb21wbGV0YcibaSBjw6JtcHVsICdBbHR1bCcuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJGaciZaWVydWwgZHVtbmVhdm9hc3RyxIMgZXN0ZSDDrm4gY3VycyBkZSDDrm5jxINyY2FyZS4gVsSDIHJ1Z8SDbSBhyJl0ZXB0YcibaSBjw6J0ZXZhIHNlY3VuZGUgyJlpIHJldmVuacibaSBhcG9pLlwiLFxuICBsb2FkaW5nRmlsZTogXCJTZSDDrm5jYXJjxIMuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJBbGVnZSBmaXNpZXJlbGUuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5pY2l1biBmaciZaWVyIGFsZXNcIixcbiAgY29uZmlybURlbGV0ZTogXCJTdW50ZcibaSBzaWd1ciBjxIMgZG9yacibaSBzxIMgyJl0ZXJnZcibaSDDrm5yZWdpc3RyYXJlYT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJWYWxvYXJlYSB0cmVidWllIHPEgyBmaWUgdW5pY8SDLlwiLFxuICBhZGRDb2x1bW46IFwiQWTEg3VnYcibaSBjb2xvYW7Eg1wiLFxuICBhZGRSb3c6IFwiQWTEg3VnYXJlIHLDom5kXCIsXG4gIHJlbW92ZVJvdzogXCLImHRlcmdlcmVcIixcbiAgYWRkUGFuZWw6IFwiQWTEg3VnYXJlXCIsXG4gIHJlbW92ZVBhbmVsOiBcIsiYdGVyZ2VyZVwiLFxuICBjaG9pY2VzX0l0ZW06IFwib3DIm2l1bmVcIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2xvYW7Eg1wiLFxuICBtYXRyaXhfcm93OiBcIlLDom5kXCIsXG4gIHNhdmluZ0RhdGE6IFwiUmV6dWx0YXRlbGUgc3VudCDDrm4gY3VycyBkZSBzYWx2YXJlLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJBIGludGVydmVuaXQgbyBlcm9hcmUsIHJlenVsdGF0ZWxlIG51IGF1IHB1dHV0IGZpIHNhbHZhdGUuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlenVsdGF0ZWxlIGF1IGZvc3Qgc2FsdmF0ZSBjdSBzdWNjZXMhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLDjm5jZXJjYcibaSBkaW4gbm91XCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCJByJtpIHBldHJlY3V0IHswfSBwZSBhY2Vhc3TEgyBwYWdpbsSDIMiZaSB7MX0gw65uIHRvdGFsLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJByJtpIHBldHJlY3V0IHswfSBwZSBhY2Vhc3TEgyBwYWdpbsSDLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkHIm2kgcGV0cmVjdXQgezB9IMOubiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkHIm2kgcGV0cmVjdXQgezB9IGRpbiB7MX0gcGUgYWNlYXN0xIMgcGFnaW7EgyDImWkgezJ9IGRpbiB7M30gw65uIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJByJtpIHBldHJlY3V0IHswfSBkaW4gezF9IHBlIGFjZWFzdMSDIHBhZ2luxIMuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiQcibaSBwZXRyZWN1dCB7MH0gZGluIHsxfSDDrm4gdG90YWwuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJDdXJhdFwiLFxuICBjbGVhckNhcHRpb246IFwiY2xhclwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJBbGVnZSBmaciZaWVydWxcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiRWxpbWluYcibaSBhY2VzdCBmaciZaWVyXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiZGFcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk51XCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIlNpZ3VyIGRvcmnIm2kgc8SDIGVsaW1pbmHIm2kgYWNlc3QgZmnImWllcjogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiU2lndXIgZG9yacibaSBzxIMgZWxpbWluYcibaSB0b2F0ZSBmaciZaWVyZWxlP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiVGl0bHVsIGludHJlYmFyaWlcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicm9cIl0gPSByb21hbmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJyb1wiXSA9IFwicm9tw6JuxINcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgcnVzc2lhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLQndCw0LfQsNC0XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLQlNCw0LvQtdC1XCIsXG4gIGNvbXBsZXRlVGV4dDogXCLQk9C+0YLQvtCy0L5cIixcbiAgcHJldmlld1RleHQ6IFwi0J/RgNC10LTQstCw0YDQuNGC0LXQu9GM0L3Ri9C5INC/0YDQvtGB0LzQvtGC0YBcIixcbiAgZWRpdFRleHQ6IFwi0KDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjQtVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi0J3QsNGH0LDRgtGMXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi0JTRgNGD0LPQvtC1ICjQv9C+0LbQsNC70YPQudGB0YLQsCwg0L7Qv9C40YjQuNGC0LUpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLQndC10YJcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwi0JLRi9Cx0YDQsNGC0Ywg0LLRgdGRXCIsXG4gIHByb2dyZXNzVGV4dDogXCLQodGC0YDQsNC90LjRhtCwIHswfSDQuNC3IHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwi0JfQsNC/0LjRgdGMIHswfSDQuNC3IHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwi0J7RgtCy0LXRgtGLINC90LAgezB9L3sxfdCy0L7Qv9GA0L7RgdGLXCIsXG4gIGVtcHR5U3VydmV5OiBcItCd0LXRgiDQvdC4INC+0LTQvdC+0LPQviDQstC+0L/RgNC+0YHQsC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCLQkdC70LDQs9C+0LTQsNGA0LjQvCDQktCw0YEg0LfQsCDQt9Cw0L/QvtC70L3QtdC90LjQtSDQsNC90LrQtdGC0YshXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLQktGLINGD0LbQtSDQv9GA0L7RhdC+0LTQuNC70Lgg0Y3RgtC+0YIg0L7Qv9GA0L7RgS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLQl9Cw0LPRgNGD0LfQutCwINGBINGB0LXRgNCy0LXRgNCwLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcItCS0YvQsdGA0LDRgtGMLi4uXCIsXG4gIHZhbHVlOiBcItC30L3QsNGH0LXQvdC40LVcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0L7RgtCy0LXRgtGM0YLQtSDQvdCwINCy0L7Qv9GA0L7RgS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINC+0YLQstC10YLRjNGC0LUg0L/QviDQutGA0LDQudC90LXQuSDQvNC10YDQtSDQvdCwINC+0LTQuNC9INCy0L7Qv9GA0L7RgS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0L7RgtCy0LXRgtGM0YLQtSDQvdCwINCy0L7Qv9GA0L7RgdGLINCyINC60LDQttC00L7QuSDRgdGC0YDQvtC60LUuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLQntGC0LLQtdGCINC00L7Qu9C20LXQvSDQsdGL0YLRjCDRh9C40YHQu9C+0LwuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAg0LLQstC10LTQuNGC0LUg0LHQvtC70YzRiNC1IHswfSDRgdC40LzQstC+0LvQvtCyLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItCf0L7QttCw0LvRg9C50YHRgtCwINCy0LLQtdC00LjRgtC1INC80LXQvdGM0YjQtSB7MH0g0YHQuNC80LLQvtC70L7Qsi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLQn9C+0LbQsNC70YPQudGB0YLQsCDQstCy0LXQtNC40YLQtSDQsdC+0LvRjNGI0LUgezB9INC4INC80LXQvdGM0YjQtSB7MX0g0YHQuNC80LLQvtC70L7Qsi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LfQsNC/0L7Qu9C90LjRgtC1INC90LUg0LzQtdC90YzRiNC1IHswfSDRgdGC0YDQvtC6LlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLRi9Cx0LXRgNC40YLQtSDRhdC+0YLRjyDQsdGLIHswfSDQstCw0YDQuNCw0L3RgtC+0LIuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstGL0LHQtdGA0LjRgtC1INC90LUg0LHQvtC70LXQtSB7MH0g0LLQsNGA0LjQsNC90YLQvtCyLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScg0LTQvtC70LbQvdC+INCx0YvRgtGMINC90LUg0LzQtdC90YzRiNC1INGH0LXQvCB7MX0sINC4INC90LUg0LHQvtC70YzRiNC1INGH0LXQvCB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0L3QtSDQvNC10L3RjNGI0LUg0YfQtdC8IHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nINC00L7Qu9C20L3QviDQsdGL0YLRjCDQvdC1INCx0L7Qu9GM0YjQtSDRh9C10LwgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLQstC10LTQuNGC0LUg0LTQtdC50YHRgtCy0LjRgtC10LvRjNC90YvQuSDQsNC00YDQtdGBINGN0LvQtdC60YLRgNC+0L3QvdC+0Lkg0L/QvtGH0YLRiy5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi0JLRi9GA0LDQttC10L3QuNC1IHswfSDQtNC+0LvQttC90L4g0LLQvtC30LLRgNCw0YnQsNGC0YwgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi0JfQsNC/0YDQvtGBINCy0LXRgNC90YPQuyDQvtGI0LjQsdC60YMgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLQntGC0LLQtdGCINC90LAg0LfQsNC/0YDQvtGBINC/0YDQuNGI0LXQuyDQv9GD0YHRgtC+0Lkg0LjQu9C4INGB0LLQvtC50YHRgtCy0L4gJ3BhdGgnINGD0LrQsNC30LDQvdC+INC90LXQstC10YDQvdC+XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi0KDQsNC30LzQtdGAINGE0LDQudC70LAg0L3QtSDQtNC+0LvQttC10L0g0L/RgNC10LLRi9GI0LDRgtGMIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstCy0LXQtNC40YLQtSDQtNCw0L3QvdGL0LUg0LIg0L/QvtC70LUgJ9CU0YDRg9Cz0L7QtSdcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcItCS0LDRiCDRhNCw0LnQuyDQt9Cw0LPRgNGD0LbQsNC10YLRgdGPLiDQn9C+0LTQvtC20LTQuNGC0LUg0L3QtdGB0LrQvtC70YzQutC+INGB0LXQutGD0L3QtCDQuCDQv9C+0L/RgNC+0LHRg9C50YLQtSDRgdC90L7QstCwLlwiLFxuICBsb2FkaW5nRmlsZTogXCLQl9Cw0LPRgNGD0LfQutCwLi4uXCIsXG4gIGNob29zZUZpbGU6IFwi0JLRi9Cx0LXRgNC40YLQtSDRhNCw0LnQuyjRiykuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcItCk0LDQudC7INC90LUg0LLRi9Cx0YDQsNC9XCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi0JLRiyDRgtC+0YfQvdC+INGF0L7RgtC40YLQtSDRg9C00LDQu9C40YLRjCDQt9Cw0L/QuNGB0Yw/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi0K3RgtC+INC30L3QsNGH0LXQvdC40LUg0LTQvtC70LbQvdC+INCx0YvRgtGMINGD0L3QuNC60LDQu9GM0L3Ri9C8LlwiLFxuICBhZGRDb2x1bW46IFwi0JTQvtCx0LDQstC40YLRjCDQutC+0LvQvtC90LrRg1wiLFxuICBhZGRSb3c6IFwi0JTQvtCx0LDQstC40YLRjCDRgdGC0YDQvtC60YNcIixcbiAgcmVtb3ZlUm93OiBcItCj0LTQsNC70LjRgtGMXCIsXG4gIGFkZFBhbmVsOiBcItCU0L7QsdCw0LLQuNGC0Ywg0L3QvtCy0YPRjlwiLFxuICByZW1vdmVQYW5lbDogXCLQo9C00LDQu9C40YLRjFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi0JLQsNGA0LjQsNC90YJcIixcbiAgbWF0cml4X2NvbHVtbjogXCLQmtC+0LvQvtC90LrQsFwiLFxuICBtYXRyaXhfcm93OiBcItCh0YLRgNC+0LrQsFwiLFxuICBzYXZpbmdEYXRhOiBcItCg0LXQt9GD0LvRjNGC0LDRgtGLINGB0L7RhdGA0LDQvdGP0Y7RgtGB0Y8g0L3QsCDRgdC10YDQstC10YAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcItCf0YDQvtC40LfQvtGI0LvQsCDQvtGI0LjQsdC60LAsINGA0LXQt9GD0LvRjNGC0LDRgiDQvdC1INCx0YvQuyDRgdC+0YXRgNCw0L3RkdC9LlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLQoNC10LfRg9C70YzRgtCw0YIg0YPRgdC/0LXRiNC90L4g0YHQvtGF0YDQsNC90ZHQvSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcItCf0L7Qv9GA0L7QsdC+0LLQsNGC0Ywg0YHQvdC+0LLQsFwiLFxuICB0aW1lck1pbjogXCLQvNC40L1cIixcbiAgdGltZXJTZWM6IFwi0YHQtdC6XCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwi0JLRiyDQv9C+0YLRgNCw0YLQuNC70LggezB9INC90LAg0Y3RgtC+0Lkg0YHRgtGA0LDQvdC40YbQtSDQuCB7MX0g0LLRgdC10LPQvi5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi0JLRiyDQv9C+0YLRgNCw0YLQuNC70LggezB9INC90LAg0Y3RgtC+0Lkg0YHRgtGA0LDQvdC40YbQtS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLQktGLINC/0L7RgtGA0LDRgtC40LvQuCB7MH0g0LIg0YLQtdGH0LXQvdC40LUg0YLQtdGB0YLQsC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQuNC3IHsxfSDQvdCwINGN0YLQvtC5INGB0YLRgNCw0L3QuNGG0LUg0LggezJ9INC40LcgezN9INC00LvRjyDQstGB0LXQs9C+INGC0LXRgdGC0LAuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQuNC3IHsxfSDQvdCwINGN0YLQvtC5INGB0YLRgNCw0L3QuNGG0LUuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi0JLRiyDQv9C+0YLRgNCw0YLQuNC70LggezB9INC40LcgezF9INC00LvRjyDQstGB0LXQs9C+INGC0LXRgdGC0LAuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLQntGH0LjRgdGC0LjRgtGMXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLQntGH0LjRgdGC0LjRgtGMXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcItCS0YvQsdC10YDQuNGC0LUg0YTQsNC50LtcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi0KPQtNCw0LvQuNGC0Ywg0YTQsNC50LtcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLQlNCwXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLQndC10YJcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi0JLRiyDRg9Cy0LXRgNC10L3Riywg0YfRgtC+INGF0L7RgtC40YLQtSDRg9C00LDQu9C40YLRjCDRjdGC0L7RgiDRhNCw0LnQuzogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwi0JLRiyDRg9Cy0LXRgNC10L3Riywg0YfRgtC+INGF0L7RgtC40YLQtSDRg9C00LDQu9C40YLRjCDQstGB0LUg0YTQsNC50LvRiz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcItCd0LDQt9Cy0LDQvdC40LUg0LLQvtC/0YDQvtGB0LBcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicnVcIl0gPSBydXNzaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInJ1XCJdID0gXCLRgNGD0YHRgdC60LjQuVwiO1xuIiwiLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBzZXJiaWFuU3RyaW5ncyA9IHtcbiAgICBwYWdlUHJldlRleHQ6IFwiTmF6YWRcIixcbiAgICBwYWdlTmV4dFRleHQ6IFwiRGFsamVcIixcbiAgICBjb21wbGV0ZVRleHQ6IFwiWmF2csWhaVwiLFxuICAgIHByZXZpZXdUZXh0OiBcIlByZWdsZWRhalwiLFxuICAgIGVkaXRUZXh0OiBcIkl6bWVuaVwiLFxuICAgIHN0YXJ0U3VydmV5VGV4dDogXCJaYXBvxI1uaVwiLFxuICAgIG90aGVySXRlbVRleHQ6IFwiRHJ1Z28gKHVwacWhaSlcIixcbiAgICBub25lSXRlbVRleHQ6IFwiTmnFoXRhXCIsXG4gICAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiSXphYmVyaSBzdmVcIixcbiAgICBwcm9ncmVzc1RleHQ6IFwiU3RyYW5pY2EgezB9IG9kIHsxfVwiLFxuICAgIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJVcGlzIHswfSBvZCB7MX1cIixcbiAgICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiT2Rnb3ZvcmVubyBuYSB7MH0vezF9IHBpdGFuamFcIixcbiAgICBlbXB0eVN1cnZleTogXCJOZW1hIHZpZGxqaXZpaCBzdHJhbmljYSBpbGkgcGl0YW5qYSB1IGFua2V0aS5cIixcbiAgICBjb21wbGV0aW5nU3VydmV5OiBcIkh2YWxhIG5hIHBvcHVuamF2YW5qdSBhbmtldGUhXCIsXG4gICAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICAgIFwiUHJlbWEgbmHFoWltIHBvZGFjaW1hLCB2ZcSHIHN0ZSBwb3B1bmlsaSBvdnUgYW5rZXR1LlwiLFxuICAgIGxvYWRpbmdTdXJ2ZXk6IFwiVcSNaXRhdmFtIGFua2V0dS4uLlwiLFxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIkl6YWJlcmkuLi5cIixcbiAgICB2YWx1ZTogXCJ2cmVkbm9zdFwiLFxuICAgIHJlcXVpcmVkRXJyb3I6IFwiTW9saW1vIG9kZ292b3JpdGUgbmEgb3ZvIHBpdGFuamUuXCIsXG4gICAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiTW9saW1vIG9kZ292b3JpdGUgbmEgYmFyIGplZG5vIHBpdGFuamUuXCIsXG4gICAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJNb2xpbW8gb2Rnb3Zvcml0ZSBuYSBwaXRhbmphIHUgc3ZpbSByZWRvdmltYS5cIixcbiAgICBudW1lcmljRXJyb3I6IFwiVnJlZG5vc3QgYmkgdHJlYmFsbyBkYSBidWRlIG51bWVyacSNa2EuXCIsXG4gICAgbWluRXJyb3I6IFwiVnJlZG5vc3QgbmUgYmkgdHJlYmFsbyBkYSBidWRlIG1hbmphIG9kIHswfVwiLFxuICAgIG1heEVycm9yOiBcIlZyZWRub3N0IG5lIGJpIHRyZWJhbG8gZGEgYnVkZSB2ZcSHYSBvZCB7MH1cIixcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIk1vbGltbyB1bmVzaXRlIGJhciB7MH0gem5hayhvdilhLlwiLFxuICAgIHRleHRNYXhMZW5ndGg6IFwiTW9saW1vIHVuZXNpdGUgbmFqdmnFoWUgezB9IHpuYWsob3YpYS5cIixcbiAgICB0ZXh0TWluTWF4TGVuZ3RoOlxuICAgICAgXCJNb2xpbW8gdW5lc2l0ZSBuYWptYW5qZSB7MH0gaSBuZSB2acWhZSBvZCB7MX0gem5hayhvdilhLlwiLFxuICAgIG1pblJvd0NvdW50RXJyb3I6IFwiTW9saW1vIHBvcHVuaXRlIG5ham1hbmplIHswfSByZWQob3ZhKS5cIixcbiAgICBtaW5TZWxlY3RFcnJvcjogXCJNb2xpbW8gaXphYmVyaXRlIG5ham1hbmplIHswfSBvcGNpamEvZS5cIixcbiAgICBtYXhTZWxlY3RFcnJvcjogXCJNb2xpbW8gaXphYmVyaXRlIG5hanZpxaFlIHswfSBvcGNpamEvZS5cIixcbiAgICBudW1lcmljTWluTWF4OiBcIid7MH0nIGJpIHRyZWJhbG8gZGEgYnVkZSBuYWptYW5qZSB7MX0gaSBuYWp2acWhZSB7Mn1cIixcbiAgICBudW1lcmljTWluOiBcIid7MH0nIGJpIHRyZWJhbG8gZGEgYnVkZSBuYWptYW5qZSB7MX1cIixcbiAgICBudW1lcmljTWF4OiBcIid7MH0nIGJpIHRyZWJhbG8gZGEgYnVkZSBuYWp2acWhZSB7MX1cIixcbiAgICBpbnZhbGlkRW1haWw6IFwiTW9saW1vIHVuZXNpdGUgaXNwcmF2bnUgZS1tYWlsIGFkcmVzdS5cIixcbiAgICAvLyB2cmF0aXRpIFwidHJ1ZVwiID9cbiAgICBpbnZhbGlkRXhwcmVzc2lvbjogXCJJenJhejogezB9IGJpIHRyZWJhbG8gZGEgYnVkZSB0YcSNYW4uXCIsXG4gICAgdXJsUmVxdWVzdEVycm9yOiBcIlphaHRldiBqZSBuYWnFoWFvIG5hIGdyZcWha3UgJ3swfScuIHsxfVwiLFxuICAgIHVybEdldENob2ljZXNFcnJvcjpcbiAgICAgIFwiWmFodGV2IG5pamUgcHJvbmHFoWFvIHBvZGF0a2UsIGlsaSBqZSBwdXRhbmphIG5ldGHEjW5hXCIsXG4gICAgZXhjZWVkTWF4U2l6ZTogXCJWZWxpxI1pbmEgZmFqbGEgbmUgYmkgdHJlYmFsbyBkYSBwcmVsYXppIHswfS5cIixcbiAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTW9saW1vIHVuZXNpdGUgZHJ1Z3UgdnJlZG5vc3QuXCIsXG4gICAgdXBsb2FkaW5nRmlsZTpcbiAgICAgIFwiRmFqbCBzZSDFoWFsamUuIE1vbGltbyBzYcSNZWthanRlIG5la28gdnJlbWUgaSBwb2t1xaFhanRlIHBvbm92by5cIixcbiAgICBsb2FkaW5nRmlsZTogXCJVxI1pdGF2YW5qZS4uLlwiLFxuICAgIGNob29zZUZpbGU6IFwiSXphYmVyaXRlIGZhamxvdmUuLi5cIixcbiAgICBub0ZpbGVDaG9zZW46IFwiTmlqZSBpemFicmFuIG5pamVkYW4gZmFqbFwiLFxuICAgIGNvbmZpcm1EZWxldGU6IFwiRGEgbGkgxb5lbGl0ZSBkYSBpemJyacWhZXRlIHVub3M/XCIsXG4gICAga2V5RHVwbGljYXRpb25FcnJvcjogXCJPdmEgdnJlZG5vc3QgdHJlYmEgZGEgYnVkZSBqZWRpbnN0dmVuYS5cIixcbiAgICBhZGRDb2x1bW46IFwiRG9kYWoga29sb251XCIsXG4gICAgYWRkUm93OiBcIkRvZGFqIHJlZFwiLFxuICAgIHJlbW92ZVJvdzogXCJVa2xvbmlcIixcbiAgICBlbXB0eVJvd3NUZXh0OiBcIk5lbWEgcmVkb3ZhLlwiLFxuICAgIGFkZFBhbmVsOiBcIkRvZGFqIG5vdm9cIixcbiAgICByZW1vdmVQYW5lbDogXCJVa2xvbmlcIixcbiAgICBjaG9pY2VzX0l0ZW06IFwic3RhdmthXCIsXG4gICAgbWF0cml4X2NvbHVtbjogXCJLb2xvbmFcIixcbiAgICBtYXRyaXhfcm93OiBcIlJlZFwiLFxuICAgIG11bHRpcGxldGV4dF9pdGVtbmFtZTogXCJ0ZWtzdFwiLFxuICAgIHNhdmluZ0RhdGE6IFwiVSB0b2t1IGplIMSNdXZhbmplIHBvZGF0YWthIG5hIHNlcnZlcnUuLi5cIixcbiAgICBzYXZpbmdEYXRhRXJyb3I6IFwiRG/FoWxvIGplIGRvIGdyZcWha2UgaSByZXp1bHRhdGkgbmlzdSBzYcSNdXZhbmkuXCIsXG4gICAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiUmV6dWx0YXRpIHN1IHVzcGXFoW5vIHNhxI11dmFuaSFcIixcbiAgICBzYXZlQWdhaW5CdXR0b246IFwiUG9rdcWhYWp0ZSBwb25vdm9cIixcbiAgICB0aW1lck1pbjogXCJtaW5cIixcbiAgICB0aW1lclNlYzogXCJzZWtcIixcbiAgICB0aW1lclNwZW50QWxsOiBcIlByb3ZlbGkgc3RlIHswfSBuYSBvdm9qIHN0cmFuaWNpIGkgezF9IHVrdXBuby5cIixcbiAgICB0aW1lclNwZW50UGFnZTogXCJQcm92ZWxpIHN0ZSB7MH0gbmEgb3ZvaiBzdHJhbmljaS5cIixcbiAgICB0aW1lclNwZW50U3VydmV5OiBcIlByb3ZlbGkgc3RlIHswfSB1a3Vwbm8uXCIsXG4gICAgdGltZXJMaW1pdEFsbDpcbiAgICAgIFwiUHJvdmVsaSBzdGUgezB9IG9kIHsxfSBuYSBvdm9qIHN0cmFuaWNpIGkgezJ9IG9kIHszfSB1a3Vwbm8uXCIsXG4gICAgdGltZXJMaW1pdFBhZ2U6IFwiUHJvdmVsaSBzdGUgezB9IG9kIHsxfSBuYSBvdm9qIHN0cmFuaWNpLlwiLFxuICAgIHRpbWVyTGltaXRTdXJ2ZXk6IFwiUHJvdmVsaSBzdGUgezB9IG9kIHsxfSB1a3Vwbm8uXCIsXG4gICAgY2xlYW5DYXB0aW9uOiBcIk/EjWlzdGlcIixcbiAgICBjbGVhckNhcHRpb246IFwiUG9uacWhdGlcIixcbiAgICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJJemFiZXJpIGZhamxcIixcbiAgICByZW1vdmVGaWxlQ2FwdGlvbjogXCJVa2xvbmkgb3ZhaiBmYWpsXCIsXG4gICAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJEYVwiLFxuICAgIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOZVwiLFxuICAgIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkRhIGxpIHN0ZSBzaWd1cm5pIGRhIMW+ZWxpdGUgZGEgdWtsb25pdGUgb3ZhaiBmYWpsOiB7MH0/XCIsXG4gICAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkRhIGxpIHN0ZSBzaWd1cm5pIGRhIMW+ZWxpdGUgZGEgdWtsb25pdGUgc3ZlIGZhamxvdmU/XCIsXG4gICAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIk5hc2xvdiBwaXRhbmphXCIsXG4gICAgbW9kYWxDYW5jZWxCdXR0b25UZXh0OiBcIk90a2HFvmlcIixcbiAgICBtb2RhbEFwcGx5QnV0dG9uVGV4dDogXCJQcmltZW5pXCIsXG4gIH07XG4gIFxuICAvL1VuY29tbWVudCB0aGVzZSB0d28gbGluZXMgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlLiBZb3Ugc2hvdWxkIHJlcGxhY2UgXCJlblwiIGFuZCBlblN0cmluZ3Mgd2l0aCB5b3VyIGxvY2FsZSAoXCJmclwiLCBcImRlXCIgYW5kIHNvIG9uKSBhbmQgeW91ciB2YXJpYWJsZS5cbiAgc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJyc1wiXSA9IHNlcmJpYW5TdHJpbmdzO1xuICBzdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJyc1wiXSA9IFwiU3Jwc2tpXCI7XG4gICIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc2ltcGxpZmllZENoaW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi5LiK5LiA6aG1XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLkuIvkuIDpobVcIixcbiAgY29tcGxldGVUZXh0OiBcIuaPkOS6pOmXruWNt1wiLFxuICBwcmV2aWV3VGV4dDogXCLpooTop4hcIixcbiAgZWRpdFRleHQ6IFwi57yW6L6RXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLlvIDlp4vpl67ljbdcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLloavlhpnlhbbku5bnrZTmoYhcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIuaXoFwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLpgInmi6nlhajpg6hcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIuesrCB7MH0g6aG1LCDlhbEgezF9IOmhtVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiezB9IG9mIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwi56ysIHswfS97MX0g6aKYXCIsXG4gIGVtcHR5U3VydmV5OiBcIumXruWNt+S4reayoeaciemXrumimOaIlumhtemdolwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuaEn+iwouaCqOeahOWPguS4jiFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCLkvaDlt7LlrozmiJDpl67ljbcuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi6Zeu5Y235q2j5Zyo5Yqg6L295LitLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIuivt+mAieaLqS4uLlwiLFxuICB2YWx1ZTogXCLlgLxcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLor7floavlhpnmraTpl67pophcIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi6Iez5bCR5Zue562U5LiA6aKYLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuivt+Whq+WGmeaJgOacieihjOS4remXrumimFwiLFxuICBudW1lcmljRXJyb3I6IFwi562U5qGI5b+F6aG75piv5Liq5pWw5a2XXCIsXG4gIG1pbkVycm9yOiBcIuivpeWAvOS4jeiDveWwj+S6jiB7MH1cIixcbiAgbWF4RXJyb3I6IFwi6K+l5YC85LiN6IO95aSn5LqOIHswfVwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuetlOahiOmVv+W6puiHs+WwkSB7MH0g5Liq5a2X56ymXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi562U5qGI6ZW/5bqm5LiN6IO96LaF6L+HIHswfSDkuKrlrZfnrKZcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLnrZTmoYjplb/luqblv4XpobvlnKggezB9IC0gezF9IOS4quWtl+espuS5i+mXtFwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuacgOWwkemcgOimgeWhq+WGmSB7MH0g6KGM562U5qGIXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuacgOWwkemcgOimgemAieaLqSB7MH0g6aG5562U5qGIXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuacgOWkmuWPquiDvemAieaLqSB7MH0g6aG5562U5qGIXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwi562U5qGIICd7MH0nIOW/hemhu+Wkp+S6juetieS6jiB7MX0g5LiU5bCP5LqO562J5LqOIHsyfVwiLFxuICBudW1lcmljTWluOiBcIuetlOahiCAnezB9JyDlv4XpobvlpKfkuo7nrYnkuo4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwi562U5qGIICd7MH0nIOW/hemhu+Wwj+S6juetieS6jiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIuivt+i+k+WFpeacieaViOeahCBFbWFpbCDlnLDlnYBcIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi5YWs5byPOiB7MH0g5peg5pWILlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi6L295YWl6YCJ6aG55pe25Y+R55Sf6ZSZ6K+vICd7MH0nOiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIuacquiDvei9veWFpeacieaViOeahOmAiemhueaIluivt+axguWPguaVsOi3r+W+hOacieivr1wiLFxuICBleGNlZWRNYXhTaXplOiBcIuaWh+S7tuWkp+Wwj+S4jeiDvei2hei/hyB7MH1cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIuivt+WujOaIkOWFtuS7lumXrumimFwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIuaWh+S7tuS4iuS8oOS4rS4uLiDor7fogJDlv4PnrYnlvoXlh6Dnp5LlkI7ph43or5VcIixcbiAgbG9hZGluZ0ZpbGU6IFwi5Yqg6L29Li4uXCIsXG4gIGNob29zZUZpbGU6IFwi6YCJ5oup5paH5Lu2Li4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLmnKrpgInmi6nmlofku7ZcIixcbiAgY29uZmlybURlbGV0ZTogXCLliKDpmaTorrDlvZU/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi5Li76ZSu5LiN6IO96YeN5aSNXCIsXG4gIGFkZENvbHVtbjogXCLmt7vliqDliJdcIixcbiAgYWRkUm93OiBcIua3u+WKoOihjFwiLFxuICByZW1vdmVSb3c6IFwi5Yig6Zmk562U5qGIXCIsXG4gIGVtcHR5Um93c1RleHQ6IFwi5peg5YaF5a65XCIsXG4gIGFkZFBhbmVsOiBcIuaWsOa3u1wiLFxuICByZW1vdmVQYW5lbDogXCLliKDpmaRcIixcbiAgY2hvaWNlc19JdGVtOiBcIumAiemhuVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIuWIl1wiLFxuICBtYXRyaXhfcm93OiBcIuihjFwiLFxuICBtdWx0aXBsZXRleHRfaXRlbW5hbWU6IFwi5paH5pysXCIsXG4gIHNhdmluZ0RhdGE6IFwi5q2j5Zyo5bCG57uT5p6c5L+d5a2Y5Yiw5pyN5Yqh5ZmoLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLlnKjkv53lrZjnu5Pmnpzov4fnqIvkuK3lj5HnlJ/kuobplJnor6/vvIznu5PmnpzmnKrog73kv53lrZhcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi57uT5p6c5L+d5a2Y5oiQ5YqfIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi6K+36YeN6K+VXCIsXG4gIHRpbWVyTWluOiBcIuWIhlwiLFxuICB0aW1lclNlYzogXCLnp5JcIixcbiAgdGltZXJTcGVudEFsbDogXCLmnKzpobXnlKjml7YgezB9IOaAu+iuoeeUqOaXtnsxfSAuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIuacrOmhteeUqOaXtnswfSAuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi5oC76K6h55So5pe2IHswfSAuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLmnKzpobXnlKjml7YgezB9IOWFsSB7MX3vvIwg5oC76K6h55So5pe2IHsyfSDlhbEgezN9IC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi5pys6aG155So5pe2IHswfSDlhbEgezF9IC5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLmgLvorqHnlKjml7YgezB9IOWFsSB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLmuIXnkIZcIixcbiAgY2xlYXJDYXB0aW9uOiBcIua4hemZpFwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLpgInmi6nmlofku7ZcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi56e76Zmk5paH5Lu2XCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi5pivXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLlkKZcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi5Yig6Zmk5paH5Lu2OiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLliKDpmaTmiYDmnInmlofku7Y/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLmoIfpophcIixcbiAgbW9kYWxDYW5jZWxCdXR0b25UZXh0OiBcIuWPlua2iFwiLFxuICBtb2RhbEFwcGx5QnV0dG9uVGV4dDogXCLnoa7lrppcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiemgtY25cIl0gPSBzaW1wbGlmaWVkQ2hpbmVzZVN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJ6aC1jblwiXSA9IFwi566A5L2T5Lit5paHXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHNwYW5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQW50ZXJpb3JcIixcbiAgcGFnZU5leHRUZXh0OiBcIlNpZ3VpZW50ZVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQ29tcGxldGFyXCIsXG4gIHByZXZpZXdUZXh0OiBcIlZpc3RhIHByZXZpYVwiLFxuICBlZGl0VGV4dDogXCJFZGl0YVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiQ29taWVuemFcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJPdHJvIChkZXNjcmliYSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk5pbmd1bm9cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiU2VsZWNjaW9uYXIgdG9kb1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiUMOhZ2luYSB7MH0gZGUgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJSZWdpc3RybyB7MH0gZGUgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJSZXNwb25kacOzIGEgezB9L3sxfSBwcmVndW50YXNcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTm8gaGF5IHDDoWdpbmEgdmlzaWJsZSBvIHByZWd1bnRhIGVuIGxhIGVuY3Vlc3RhLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkdyYWNpYXMgcG9yIGNvbXBsZXRhciBsYSBlbmN1ZXN0YSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk51ZXN0cm9zIHJlZ2lzdHJvcyBtdWVzdHJhbiBxdWUgeWEgaGEgY29tcGxldGFkbyBlc3RhIGVuY3Vlc3RhLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxhIGVuY3Vlc3RhIGVzdMOhIGNhcmdhbmRvLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlbGVjY2lvbmUuLi5cIixcbiAgdmFsdWU6IFwidmFsb3JcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IgY29udGVzdGUgbGEgcHJlZ3VudGEuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlBvciBmYXZvciwgcmVzcG9uZGEgYWwgbWVub3MgdW5hIHByZWd1bnRhLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlBvciBmYXZvciBjb250ZXN0ZSBsYXMgcHJlZ3VudGFzIGVuIGNhZGEgaGlsZXJhLlwiLFxuICBudW1lcmljRXJyb3I6IFwiTGEgZXN0aW1hY2nDs24gZGViZSBzZXIgbnVtw6lyaWNhLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlBvciBmYXZvciBlbnRyZSBwb3IgbG8gbWVub3MgezB9IHPDrW1ib2xvcy5cIixcbiAgdGV4dE1heExlbmd0aDogXCJQb3IgZmF2b3IgZW50cmUgbWVub3MgZGUgezB9IHPDrW1ib2xvcy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJQb3IgZmF2b3IgZW50cmUgbcOhcyBkZSB7MH0geSBtZW5vcyBkZSB7MX0gc8OtbWJvbG9zLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlBvciBmYXZvciBsbGVuZSBwb3IgbG8gbWVub3MgezB9IGhpbGVyYXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlBvciBmYXZvciBzZWxlY2Npb25lIHBvciBsbyBtZW5vcyB7MH0gdmFyaWFudGVzLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJQb3IgZmF2b3Igc2VsZWNjaW9uZSBubyBtw6FzIGRlIHswfSB2YXJpYW50ZXMuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJFbCAnezB9JyBkZWJlIGRlIHNlciBpZ3VhbCBvIG3DoXMgZGUgezF9IHkgaWd1YWwgbyBtZW5vcyBkZSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJFbCAnezB9JyBkZWJlIHNlciBpZ3VhbCBvIG3DoXMgZGUgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiRWwgJ3swfScgZGViZSBzZXIgaWd1YWwgbyBtZW5vcyBkZSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlBvciBmYXZvciBhZ3JlZ3VlIHVuIGNvcnJlbyBlbGVjdHLDs25pY28gdsOhbGlkby5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiTGEgZXhwcmVzacOzbjogezB9IGRlYmVyw61hIGRldm9sdmVyICd2ZXJkYWRlcm8nLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgc29saWNpdHVkIHJlZ3Jlc8OzIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiTGEgc29saWNpdHVkIHJlZ3Jlc8OzIHZhY8OtbyBkZSBkYXRhIG8gbGEgcHJvcGllZGFkICd0cmF5ZWN0b3JpYScgbm8gZXMgY29ycmVjdGFcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJFbCB0YW1hw7FvIGRlbCBhcmNoaXZvIG5vIGRlYmUgZGUgZXhjZWRlciB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IgYWdyZWd1ZSBsYSBvdHJhIGVzdGltYWNpw7NuLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiU3UgYXJjaGl2byBzZSBlc3TDoSBzdWJpZW5kby4gUG9yIGZhdm9yIGVzcGVyZSB1bm9zIHNlZ3VuZG9zIGUgaW50ZW50ZSBkZSBudWV2by5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiQ2FyZ2FuZG8uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJFbGlqYSBhcmNoaXZvKHMpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJObyBzZSBoYSBlbGVnaWRvIG5pbmfDum4gYXJjaGl2b1wiLFxuICBjb25maXJtRGVsZXRlOiBcIsK/UXVpZXJlcyBib3JyYXIgZWwgcmVnaXN0cm8/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRXN0ZSB2YWxvciBkZWJlIHNlciDDum5pY28uXCIsXG4gIGFkZENvbHVtbjogXCJBw7FhZGlyIGNvbHVtbmFcIixcbiAgYWRkUm93OiBcIkFncmVndWUgdW5hIGhpbGVyYVwiLFxuICByZW1vdmVSb3c6IFwiRWxpbWluYXIgdW5hIGhpbGVyYVwiLFxuICBhZGRQYW5lbDogXCJBw7FhZGlyIG51ZXZvXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlJldGlyZVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiYXJ0w61jdWxvXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sdW1uYVwiLFxuICBtYXRyaXhfcm93OiBcIkhpbGVyYVwiLFxuICBzYXZpbmdEYXRhOiBcIkxvcyByZXN1bHRhZG9zIHNlIGVzdMOhbiBndWFyZGFuZG8gZW4gZWwgc2Vydmlkb3IuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkxvcyByZXN1bHRhZG9zIHNlIGVzdMOhbiBndWFyZGFuZG8gZW4gZWwgc2Vydmlkb3IuLi5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiwqFMb3MgcmVzdWx0YWRvcyBzZSBndWFyZGFyb24gY29uIMOpeGl0byFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIkludMOpbnRhbG8gZGUgbnVldm8uXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCJIYXMgZ2FzdGFkbyB7MH0gZW4gZXN0YSBww6FnaW5hIHkgezF9IGVuIHRvdGFsLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJVc3RlZCBoYSBwYXNhZG8gezB9IGVuIGVzdGEgcMOhZ2luYS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJIYXMgZ2FzdGFkbyBlbiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkhhcyBnYXN0YWRvIHswfSBkZSB7MX0gZW4gZXN0YSBww6FnaW5hIHkgezJ9IGRlIHszfSBlbiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiSGFzIGdhc3RhZG8gezB9IGRlIHsxfSBlbiBlc3RhIHDDoWdpbmEuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiVXN0ZWQgaGEgZ2FzdGFkbyB7MH0gZGUgezF9IGVuIHRvdGFsLlwiLFxuICBjbGVhbkNhcHRpb246IFwiTGltcGlhXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJEZXNwZWplblwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJFbGlqYSBlbCBhcmNoaXZvXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkVsaW1pbmEgZXN0ZSBhcmNoaXZvXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiU8OtXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOb1wiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLCv0VzdMOhcyBzZWd1cm8gZGUgcXVlIHF1aWVyZXMgZWxpbWluYXIgZXN0ZSBhcmNoaXZvOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLCv0VzdMOhcyBzZWd1cm8gZGUgcXVlIHF1aWVyZXMgZWxpbWluYXIgdG9kb3MgbG9zIGFyY2hpdm9zP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiVMOtdHVsbyBkZSBsYSBwcmVndW50YVwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlc1wiXSA9IHNwYW5pc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZXNcIl0gPSBcImVzcGHDsW9sXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHN3YWhpbGlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiSWxpeW90YW5ndWxpYVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiSWZ1YXRheW9cIixcbiAgY29tcGxldGVUZXh0OiBcIkthbWlsaVwiLFxuICBwcmV2aWV3VGV4dDogXCJIYWtpa2lcIixcbiAgZWRpdFRleHQ6IFwiSGFyaXJpXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJBbnphXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiTnlpbmdpbmUgKGVsZXphKVwiLFxuICBub25lSXRlbVRleHQ6IFwiSGFrdW5hXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIkNoYWd1YSBab3RlXCIsXG4gIHByb2dyZXNzVGV4dDogXCJVa3VyYXNhIHswfSB3YSB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlJla29kaSB7MH0geWEgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJZYWxpeW9qaWJpd2EgezB9L3sxfSBtYXN3YWxpXCIsXG4gIGVtcHR5U3VydmV5OiBcIkhha3VuYSB1a3VyYXNhIHVuYW9vbmVrYW5hIGF1IHN3YWxpIGthdGlrYSB1dGFmaXRpLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkFzYW50aSBrd2Ega3VrYW1pbGlzaGEgdXRhZml0aSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIlJlY29kaSB6ZXR1IHppbmF0dW9ueWVzaGEgdGF5YXJpIHVtZWthbWlsaXNoYSB1dGFmaXRpLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlR1bmFhbmRhYSB1dGFmaXRpLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIkNoYWd1YS4uLlwiLFxuICB2YWx1ZTogXCJ0aGFtYW5pXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiVGFmYWRoYWxpIGppYnUgaGlsaSBzd2FsaS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiVGFmYWRoYWxpIGppYnUgc3dhbGkgYW5nYWxhdSBtb2phLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlRhZmFkaGFsaSBqaWJ1IG1hc3dhbGkga2F0aWthIHNhZnUgem90ZS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlRoYW1hbmkgaW5hcGFzd2Ega3V3YSB5YSBuYW1iYXJpLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlRhZmFkaGFsaSBpbmdpemEgYW5nYWxhdXswfSBodXNpa2EuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiVGFmYWRoYWxpIGluZ2l6YSBpc2lvemlkaSB7MH0gaHVzaWthLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOlxuICAgIFwiVGFmYWRoYWxpIGluZ2l6YSBraXdhbmdvIHphaWRpIHlhIHswfSBuYSBraXNpY2hvcHVuZ3VhIHsxfSBodXNpa2EuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVGFmYWRoYWxpIGphemEgaXNpb3B1bmd1YSB7MH0gc2FmdS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVGFmYWRoYWxpIGNoYWd1YSBhbmdhbGF1IHswfSBsYWhhamEuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlRhZmFkaGFsaSBjaGFuZ3VhIGlzaW96aWRpIHswfSBsYWhhamEuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCIgJ3swfScgaW5hcGFzd2Ega3V3YSBzYXdhIGF1IHphaWRpIHlhIHsxfSBuYSBzYXdhIGF1IGNoaW5pIHlhIHsyfVwiLFxuICBudW1lcmljTWluOiBcIiAnezB9J2luYXBhc3dhIGt1d2Egc2F3YSBhdSB6YWlkaSB5YSB7MX1cIixcbiAgbnVtZXJpY01heDogXCIgJ3swfSdpbmFwYXN3YSBrdXdhIHNhd2EgYXUgY2hpbmkgeWEgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJUYWZhZGhhbGkgaW5naXphIGFud2FuaSBoYWxhbGkgeWEgYmFydWEtcGVwZS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVXNlbWk6ezB9IGluYXBhc3dhIGt1cnVkaSAna3dlbGknLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiT21iaSBsaW5hIGtvc2EgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJPbWJpIGxpbGlydWRpc2hhIGRhdGEgdHVwdSBhdSB0aGUgJ3BhdGgnIG1hbGkgeWEgbmppYSBzaW8gc2FoaWhpXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiU2FpemkgeWEgZmFpbGkgaGFpcGFzd2kga3V6aWRpIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlRhZmFkaGFsaSBpbmdpemEgdGhhbWFuaSBueWluZ2luZS5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZhaWxpIHlha28gaW5hcGFraWEuVGFmYWRoYWxpIHN1YmlyaSBzZWt1bmRlIGthZGhhYSBuYSB1amFyaWJ1IHRlbmEuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkluYXBha2lhLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiQ2hhZ3VhIGZhaWxpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJIdWphY2hhZ3VhIGZhaWxpXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiSmUhIFVuYXRha2Ega3VmdXRhIHJla29kaT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJUaGFtYW5pIGhpaSBpbmFwYXN3YSBrdXdhIHlhIGtpcGVrZWUuXCIsXG4gIGFkZENvbHVtbjogXCJPbmdlemEgS29sYW11XCIsXG4gIGFkZFJvdzogXCJPbmdlemEgc2FmdVwiLFxuICByZW1vdmVSb3c6IFwiVG9hXCIsXG4gIGFkZFBhbmVsOiBcIk9uZ2V6YSBtcHlhXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlRvYVwiLFxuICBjaG9pY2VzX0l0ZW06IFwia2l0dVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIktvbGFtdVwiLFxuICBtYXRyaXhfcm93OiBcIlNhZnVcIixcbiAgc2F2aW5nRGF0YTogXCJNYXRva2VvIHlhbWVoaWZhZGhpd2Ega3dhIHNldmEuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIktvc2EgbGltZXRva2VhIG5hIGhhdHVrdXdlemEga3VoaWZhZGhpIG1hdG9rZW8uXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIk1hdG9rZW8geWFtZWhpZmFkaGl3YSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIkphcmlidSB0ZW5hXCIsXG4gIHRpbWVyTWluOiBcImRha2lrYVwiLFxuICB0aW1lclNlYzogXCJzZWt1bmRlXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiVW1ldHVtaWEgezB9IGt3ZW55ZSB1a3VyYXNhIGh1dSBuYSB7MX0ga3dhIGp1bWxhLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJVbWV0dW1pYSB7MH0ga3dlbnllIHVrdXJhc2EgaHV1LlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlVtZXR1bWlhIHswfSBrd2EganVtbGEuXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwiVW1ldHVtaWEgezB9IHlhIHsxfSBrd2VueWUgdWt1cmFzYSBodXUgezJ9IHdhIHszfSBrd2EganVtbGEuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIlVtZXR1bWlhIHswfSB5YSB7MX0ga3dlbnllIHVrdXJhc2EgaHV1LlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlVtZXR1bWlhIHswfSB5YSB7MX0ga3dhIGp1bWxhLlwiLFxuICBjbGVhbkNhcHRpb246IFwiU2FmaXNoYVwiLFxuICBjbGVhckNhcHRpb246IFwiT25kb2FcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiQ2hhZ3VhIGZhaWxpXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIk9uZG9hIGZhaWxpXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiTmRpb1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiSGFwYW5hXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkplISBVbmEgdWhha2lrYSBrdXdhIHVuYXRha2Ega3VvbmRvYSBmYWlsaSBoaWk6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkplISBVbmEgdWhha2lrYSBrdXdhIHVuYXRha2Ega3VvbmRvYSBmYWlsaSB6b3RlP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiS2ljaHdhIGNoYSBTd2FsaVwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJzd1wiXSA9IHN3YWhpbGlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wic3dcIl0gPSBcInN3YWhpbGlcIjtcbiIsIi8vQ3JlYXRlIGJ5IE1hdHRpYXMgQXNwbHVuZFxuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBzd2VkaXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkbDtnJlZ8OlZW5kZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiTsOkc3RhXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJGw6RyZGlnXCIsXG4gIHByZXZpZXdUZXh0OiBcIkbDtnJoYW5kc3Zpc25pbmdcIixcbiAgZWRpdFRleHQ6IFwiUmVkaWdlcmFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlN0YXJ0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQW5uYXQgKGJlc2tyaXYpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJJbmdlblwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJWw6RsaiBhbGxhXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTaWRhIHswfSBhdiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlNwZWxhIGluIHswfSBhdiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkJlc3ZhcmFkZSB7MH0gLyB7MX0gZnLDpWdvclwiLFxuICBlbXB0eVN1cnZleTogXCJEZXQgZmlubnMgaW5nZW4gc3lubGlnIHNpZGEgZWxsZXIgZnLDpWdhIGkgZW5rw6R0ZW4uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVGFjayBmw7ZyIGF0dCBkdSBnZW5vbWbDtnJ0IGVua8OkdGVuISFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIlbDpXJhIHJlZ2lzdGVyIHZpc2FyIGF0dCBkdSByZWRhbiBoYXIgc2x1dGbDtnJ0IGRlbm5hIHVuZGVyc8O2a25pbmcuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiRW5rw6R0ZW4gbGFkZGFzLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlbDpGxqLi4uXCIsXG4gIHZhbHVlOiBcInbDpHJkZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZhciB2w6RubGlnIGJlc3ZhcmEgZnLDpWdhbi5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiVsOkbmxpZ2VuIHN2YXJhIHDDpSBtaW5zdCBlbiBmcsOlZ2EuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVmFyIHbDpG5saWcgYmVzdmFyYSBmcsOlZ29ybmEgcMOlIGFsbGEgcmFkZXIuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJWw6RyZGV0IHNrYSB2YXJhIG51bWVyaXNrdC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJWYXIgdsOkbmxpZyBhbmdlIG1pbnN0IHswfSB0ZWNrZW4uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiQW5nZSBmw6RycmUgw6RuIHswfSB0ZWNrZW4uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiQW5nZSBtZXIgw6RuIHswfSBvY2ggZsOkcnJlIMOkbiB7MX0gdGVja2VuLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlZhciB2w6RubGlnIGZ5bGwgaSBtaW5zdCB7MH0gcmFkZXIuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlZhciB2w6RubGlnIHbDpGxqIMOldG1pbnN0b25lIHswfSB2YXJpYW50ZXIuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlZhciB2w6RubGlnIHbDpGxqIGludGUgZmxlciDDpG4gezB9IHZhcmlhbnRlci5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIHNrYSB2YXJhIGxpa2EgbWVkIGVsbGVyIG1lciDDpG4gezF9IHNhbXQgbGlrYSBtZWQgZWxsZXIgbWluZHJlIMOkbiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBza2EgdmFyYSBsaWthIG1lZCBlbGxlciBtZXIgw6RuIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIHNrYSB2YXJhIGxpa2EgbWVkIGVsbGVyIG1pbmRyZSDDpG4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJWYXIgdsOkbmxpZyBhbmdlIGVuIGtvcnJla3QgZS1wb3N0YWRyZXNzLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJVdHRyeWNrZXQ6IHswfSBza2EgcmV0dXJuZXJhICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkbDtnJmcsOlZ2FuIHJldHVybmVyYWRlIGZlbGV0ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQW50aW5nZW4gcmV0dXJuZXJhZGUgZsO2cmZyw6VnYW4gaW5nZW4gZGF0YSBlbGxlciBzw6Ugw6RyIGVnZW5za2FwZW4gJ3BhdGgnIGludGUga29ycmVrdFwiLFxuICBleGNlZWRNYXhTaXplOiBcIkZpbHN0b3JsZWtlbiBmw6VyIGVqIMO2dmVyc3RpZ2EgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVmFyIHbDpG5saWcgYW5nZSBkZXQgYW5kcmEgdsOkcmRldC5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkRpbiBmaWwgbGFkZGFzIHVwcC4gVmFyIHbDpG5saWcgdsOkbnRhIG7DpWdyYSBzZWt1bmRlciBvY2ggZsO2cnPDtmsgc2VkYW4gaWdlbi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiTMOkc2VyIGluLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiVsOkbGogZmlsIChlcikgLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJJbmdlbiBmaWwgdmFsZFwiLFxuICBjb25maXJtRGVsZXRlOiBcIlZpbGwgZHUgcmFkZXJhIHBvc3Rlbj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJEZXR0YSB2w6RyZGUgc2thIHZhcmEgdW5pa3QuXCIsXG4gIGFkZENvbHVtbjogXCJMw6RnZyB0aWxsIGtvbHVtblwiLFxuICBhZGRSb3c6IFwiTMOkZ2cgdGlsbCByYWRcIixcbiAgcmVtb3ZlUm93OiBcIlRhIGJvcnRcIixcbiAgYWRkUGFuZWw6IFwiTMOkZ2cgdGlsbCBueVwiLFxuICByZW1vdmVQYW5lbDogXCJUYSBib3J0XCIsXG4gIGNob2ljZXNfSXRlbTogXCJBcnRpa2VsXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sdW1uXCIsXG4gIG1hdHJpeF9yb3c6IFwiUmFkXCIsXG4gIHNhdmluZ0RhdGE6IFwiUmVzdWx0YXRlbiBzcGFyYXMgcMOlIHNlcnZlcm4gLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJFdHQgZmVsIGludHLDpGZmYWRlIG9jaCB2aSBrdW5kZSBpbnRlIHNwYXJhIHJlc3VsdGF0ZW4uXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlc3VsdGF0ZW4gc3BhcmFkZXMgZnJhbWfDpW5nc3Jpa3QhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJGw7Zyc8O2ayBpZ2VuXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJEdSBoYXIgc3BlbmRlcmF0IHswfSBww6UgZGVuIGjDpHIgc2lkYW4gb2NoIHsxfSB0b3RhbHQuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkR1IGhhciBzcGVuZGVyYXQgezB9IHDDpSBkZW4gaMOkciBzaWRhbi5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJEdSBoYXIgc3BlbmRlcmF0IHswfSB0b3RhbHQuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJEdSBoYXIgc3BlbmRlcmF0IHswfSBhdiB7MX0gcMOlIGRlbiBow6RyIHNpZGFuIG9jaCB7Mn0gYXYgezN9IHRvdGFsdC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiRHUgaGFyIHNwZW5kZXJhdCB7MH0gYXYgezF9IHDDpSBkZW4gaMOkciBzaWRhbi5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJEdSBoYXIgc3BlbmRlcmF0IHswfSBhdiB7MX0gdG90YWx0LlwiLFxuICBjbGVhbkNhcHRpb246IFwiUmVuYVwiLFxuICBjbGVhckNhcHRpb246IFwiS2xhclwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJWw6RsaiBGSUxcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiVGEgYm9ydCBkZW4gaMOkciBmaWxlblwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkphXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOZWpcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiw4RyIGR1IHPDpGtlciBww6UgYXR0IGR1IHZpbGwgdGEgYm9ydCBkZW4gaMOkciBmaWxlbjogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiw4RyIGR1IHPDpGtlciBww6UgYXR0IGR1IHZpbGwgdGEgYm9ydCBhbGxhIGZpbGVyP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiRnLDpWdldGl0ZWxcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wic3ZcIl0gPSBzd2VkaXNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInN2XCJdID0gXCJzdmVuc2thXCI7XG4iLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHRhamlrU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItCR0L7Qt9Cz0LDRiNGCXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLQntGP0L3QtNCwXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLQmNK30YDQviDRiNGD0LRcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcItCe0pPQvtC3XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi0JTQuNCz0LDRgCAo0LvRg9GC0YTQsNC9INGC0LDQstGB0LjRhCDQutGD0L3QtdC0KVwiLFxuICBub25lSXRlbVRleHQ6IFwi0J3QtVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLSstCw0LzQsNGA0L4g0LjQvdGC0LjRhdC+0LEg0LrQsNGA0LTQsNC9XCIsXG4gIHByb2dyZXNzVGV4dDogXCLQodCw0rPQuNGE0LDQuCB7MH0g0LDQtyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi0K/Qs9C+0L0g0YHQsNCy0L7QuyDQstGD0rfRg9C0INC90LDQtNC+0YDQsNC0LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItCi0LDRiNCw0LrQutGD0YAg0LHQsNGA0L7QuCDQv9GD0YAg0LrQsNGA0LTQsNC90Lgg0YHQsNCy0L7Qu9C90L7QvNCwIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwi0KjRg9C80L4g0LDQu9C70LDQutCw0Lkg0LjQvSDQv9GD0YDRgdC40YjRgNC+INCw0L3St9C+0Lwg0LTQvtC00LDQtdC0LlwiLFxuICBsb2FkaW5nU3VydmV5OiBcItCR0L7RgNCz0LjRgNOjINCw0Lcg0YHQtdGA0LLQtdGALi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcItCY0L3RgtC40YXQvtCxINC60LDRgNC00LDQvS4uLlwiLFxuICB2YWx1ZTogXCLSm9C40LzQvNCw0YJcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLQmNC70YLQuNC80L7RgSwg0LHQsCDRgdCw0LLQvtC7INK30LDQstC+0LEg0LTQuNKz0LXQtC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi0JjQu9GC0LjQvNC+0YEsINCw0pvQsNC70LDQvSDQsdCwINGP0Log0YHQsNCy0L7QuyDSt9Cw0LLQvtCxINC00LjSs9C10LQuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi0JjQu9GC0LjQvNC+0YEsINCx0LAg0rPQsNC80LDQuCDRgdCw0LLQvtC70rPQviDQtNCw0YAg0rPQsNC80LDQuCDRgdCw0YLRgNKz0L4g0rfQsNCy0L7QsSDQtNC40rPQtdC0LlwiLFxuICBudW1lcmljRXJyb3I6IFwi0rbQsNCy0L7QsSDQsdC+0Y/QtCDRgNCw0pvQsNC8INCx0L7RiNCw0LQuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi0JjQu9GC0LjQvNC+0YEsINCw0LcgezB9INC30LjRkdC00YLQsNGAINGA0LDQvNC3INCy0L7RgNC40LQg0LrRg9C90LXQtC5cIixcbiAgdGV4dE1heExlbmd0aDogXCLQmNC70YLQuNC80L7RgSwg0LDQtyB7MH0g0LrQsNC80YLQsNGAINGA0LDQvNC3INCy0L7RgNC40LQg0LrRg9C90LXQtC5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLQmNC70YLQuNC80L7RgSwg0LDQtyB7MH0g0LfQuNGR0LTRgtCw0YAg0LLQsCDQsNC3IHsxfSDQutCw0LzRgtCw0YAg0YDQsNC80Lcg0LLQvtGA0LjQtCDQutGD0L3QtdC0LlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItCY0LvRgtC40LzQvtGBLCDQvdCwINC60LDQvNGC0LDRgCDQsNC3IHswfSDRgdCw0YLRgCDQv9GD0YAg0LrRg9C90LXQtC5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi0JjQu9GC0LjQvNC+0YEsINCw0pvQsNC70LDQvSB7MH0g0LLQsNGA0LjQsNC90YIg0LjQvdGC0LjRhdC+0LEg0LrRg9C90LXQtC5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi0JjQu9GC0LjQvNC+0YEsINC90LAg0LfQuNGR0LTRgtCw0YAg0LDQtyB7MH0g0LLQsNGA0LjQsNC90YIg0LjQvdGC0LjRhdC+0LEg0LrRg9C90LXQtC5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nINCx0L7Rj9C0INC90LAg0LrQsNC8INCw0LcgezF9INCy0LAg0L3QsCDQsdC40YHRkdGAINCw0LcgezJ9INCx0L7RiNCw0LRcIixcbiAgbnVtZXJpY01pbjogXCInezB9JyDQsdC+0Y/QtCDQvdCwINC60LDQvCDQsNC3IHsxfSDQsdC+0YjQsNC0XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg0LHQvtGP0LQg0L3QsCDQt9C40ZHQtCDQsNC3IHsxfSDQsdC+0YjQsNC0XCIsXG4gIGludmFsaWRFbWFpbDogXCLQmNC70YLQuNC80L7RgSwg0L/QvtGH0YLQsNC4INGN0LvQtdC60YLRgNC+0L3QuNC4INCy0L7Sm9C10LjRgNC+INCy0L7RgNC40LQg0LrRg9C90LXQtC5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi0JjRhNC+0LTQsNC4IHswfSDQsdC+0Y/QtCAndHJ1ZScg0LHQsNGA0LPQsNGA0LTQvtC90LDQtC5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcItCU0LDRgNGF0L7RgdGCINGF0LDRgtC+0LPToyDQsdC+0LfQs9Cw0YDQtNC+0L3QtCAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcItK20LDQstC+0LEg0LHQsCDQtNCw0YDRhdC+0YHRgiDRhdC+0LvToyDQvtC80LDQtCDRkSDRhdC+0YHQuNGP0YLQuCAncGF0aCcg0L3QvtC00YPRgNGD0YHRgiDQvNGD0LDQudGP0L0g0LrQsNGA0LTQsCDRiNGD0LTQsNCw0YHRglwiLFxuICBleGNlZWRNYXhTaXplOiBcItCQ0L3QtNC+0LfQsNC4INGE0LDQudC7INCx0L7Rj9C0INC90LAg0LrQsNC70L7QvSDQsNC3IHswfSDQsdC+0YjQsNC0LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi0JjQu9GC0LjQvNC+0YEsINCx0LAg0LzQsNC50LTQvtC90LggJ9CU0LjQs9Cw0YAnINC00L7QtNCw0rPQvtGA0L4g0LLQvtGA0LjQtCDQutGD0L3QtdC0XCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLQpNCw0LnQu9C4INGI0YPQvNC+INCx0L7RgCDRiNGD0LTQsCDQuNGB0YLQvtC00LDQsNGB0YIuINCv0LrRh9Cw0L3QtCDRgdC+0L3QuNGPINC40L3RgtC40LfQvtGAINGI0LDQstC10LQg0LLQsCDQsdC+0YDQuCDQtNC40LPQsNGAINC606/RiNC40Ygg0LrRg9C90LXQtC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi0JHQvtGA0LrRg9C906MuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLQpNCw0LnQuyjSs9C+KS3RgNC+INC40L3RgtC40YXQvtCxINC60YPQvdC10LQuLi5cIixcbiAgY29uZmlybURlbGV0ZTogXCLQqNGD0LzQviDQvNGD0YLQvNCw0LjQvSDSs9Cw0YHRgtC10LQsINC60Lgg0LzQtdGF0L7Ss9C10LQg0LLQvtGA0LjQtNGA0L4g0YLQvtC30LAg0LrRg9C90LXQtD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLQmNC9INCw0YDQt9C40Ygg0LHQvtGP0LQg0LHQtdC90LDQt9C40YAg0LHQvtGI0LDQtC5cIixcbiAgYWRkQ29sdW1uOiBcItCY0LvQvtCy0LDQuCDRgdGD0YLRg9C9XCIsXG4gIGFkZFJvdzogXCLQmNC70L7QstCw0Lgg0YHQsNGC0YBcIixcbiAgcmVtb3ZlUm93OiBcItCd0LXRgdGCINC60LDRgNC00LDQvVwiLFxuICBhZGRQYW5lbDogXCLQmNC70L7QstCwINC60LDRgNC00LDQvVwiLFxuICByZW1vdmVQYW5lbDogXCLQndC10YHRgiDQutCw0YDQtNCw0L1cIixcbiAgY2hvaWNlc19JdGVtOiBcItCS0LDRgNC40LDQvdGCXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi0KHRg9GC0YPQvVwiLFxuICBtYXRyaXhfcm93OiBcItCh0LDRgtGAXCIsXG4gIHNhdmluZ0RhdGE6IFwi0J3QsNGC0LjSt9CwINCx0LAg0YHQtdGA0LLQtdGAINGB0LDQsdGCINGI0YPQtNCwINC40YHRgtC+0LTQsNCw0L3QtC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi0KXQsNGC0L7Qs9OjINCx0LAg0LDQvNCw0Lsg0L7QvNCw0LQsINC90LDRgtC40rfQsCDRgdCw0LHRgiDQvdCw0YjRg9C0LlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLQndCw0YLQuNK30LAg0LHQvtC80YPQstCw0YTRhNCw0LrQuNGP0YIg0YHQsNCx0YIg0YjRg9C0IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi0JHQvtGA0Lgg0LTQuNCz0LDRgCDQutOv0YjQuNGIINC60LDRgNC00LDQvdC0XCIsXG4gIHRpbWVyTWluOiBcItC00LDSm1wiLFxuICB0aW1lclNlYzogXCLRgdC+0L1cIixcbiAgdGltZXJTcGVudEFsbDogXCLQqNGD0LzQviB7MH0g0LTQsNGAINC40L0g0YHQsNKz0LjRhNCwINCy0LAgezF9INC00LDRgCDRg9C80YPQvCDRgdCw0YDRhCDQutCw0YDQtNC10LQuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcItCo0YPQvNC+IHswfSDQtNCw0YAg0LjQvSDRgdCw0rPQuNGE0LAg0YHQsNGA0YQg0LrQsNGA0LTQtdC0LlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcItCo0YPQvNC+IHswfSDQtNCw0YAg0LjQvSDRgtC10YHRgiDRgdCw0YDRhCDQvdCw0LzRg9C00LXQtC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcItCo0YPQvNC+IHswfSDQsNC3IHsxfSDQtNCw0YAg0LjQvSDRgdCw0rPQuNGE0LAg0LLQsCB7Mn0g0LDQtyB7M30g0LTQsNGAINGD0LzRg9C8INGB0LDRgNGEINC60LDRgNC00LXQtCDQtNCw0YAg0LTQvtGF0LjQu9C4INC40L0g0YLQtdGB0YIuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcItCo0YPQvNC+IHswfSDQsNC3IHsxfSDQtNCw0YAg0LjQvSDRgdCw0rPQuNGE0LAg0YHQsNGA0YQg0LrQsNGA0LTQtdC0LlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcItCo0YPQvNC+IHswfSDQsNC3IHsxfSDQtNCw0YAg0rPQsNC80LDQuCDRgtC10YHRgiDRgdCw0YDRhCDQutCw0YDQtNC10LQuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLQotC+0LfQsCDQutCw0YDQtNCw0L1cIixcbiAgY2xlYXJDYXB0aW9uOiBcItCi0L7Qt9CwINC60LDRgNC00LDQvVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLQpNCw0LnQu9GA0L4g0L3QtdGB0YIg0LrQsNGA0LTQsNC9XCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1widGdcIl0gPSB0YWppa1N1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJ0Z1wiXSA9IFwi0YLQvtK30LjQutOjXCI7XG4iLCIvL0NyZWF0ZWQgYnkgUGFkZXQgVGF3ZWVrdW5rYW5cbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgdGhhaVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLguIHguYjguK3guJnguKvguJnguYnguLJcIixcbiAgcGFnZU5leHRUZXh0OiBcIuC4luC4seC4lOC5hOC4m1wiLFxuICBjb21wbGV0ZVRleHQ6IFwi4Liq4Liz4LmA4Lij4LmH4LiIXCIsXG4gIHByZXZpZXdUZXh0OiBcIuC4lOC4ueC4leC4seC4p+C4reC4ouC5iOC4suC4h1wiLFxuICBlZGl0VGV4dDogXCLguYHguIHguYnguYTguIJcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIuC5gOC4o+C4tOC5iOC4oVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIuC4reC4t+C5iOC4meC5hiAo4LmC4Lib4Lij4LiU4Lij4Liw4Lia4Li4KVwiLFxuICBub25lSXRlbVRleHQ6IFwi4LmE4Lih4LmI4Lih4Li1XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIuC5gOC4peC4t+C4reC4geC4l+C4seC5ieC4h+C4q+C4oeC4lFwiLFxuICBwcm9ncmVzc1RleHQ6IFwi4Lir4LiZ4LmJ4Liy4LiX4Li14LmIIHswfSDguIjguLLguIEgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCLguKPguLLguKLguIHguLLguKPguJfguLXguYggezB9IOC4iOC4suC4gSB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIuC4hOC4s+C4leC4reC4muC4l+C4teC5iCB7MH0vezF9IOC4iOC4s+C4meC4p+C4meC4hOC4s+C4luC4suC4oVwiLFxuICBlbXB0eVN1cnZleTogXCLguYTguKHguYjguKHguLXguKvguJnguYnguLLguYDguJ7guIjguJfguLXguYjguKHguK3guIfguYDguKvguYfguJkg4Lir4Lij4Li34LitIOC4hOC4s+C4luC4suC4oeC5g+C4mSBzdXJ2ZXkg4LiZ4Li14LmJXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi4LiC4Lit4Lia4LiE4Li44LiT4LiX4Li14LmI4LiX4LizIHN1cnZleSDguIjguJnguYDguKrguKPguYfguIhcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIuC4o+C4suC4ouC4geC4suC4o+C4guC4reC4h+C5gOC4o+C4suC5geC4quC4lOC4h+C4p+C5iOC4suC4hOC4uOC4k+C5hOC4lOC5ieC4l+C4syBzdXJ2ZXkg4LmA4Liq4Lij4LmH4LiI4LmA4Lij4Li14Lii4Lia4Lij4LmJ4Lit4Lii4LmB4Lil4LmJ4LinXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi4LiB4Liz4Lil4Lix4LiH4LmC4Lir4Lil4LiUIFN1cnZleS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLguYDguKXguLfguK3guIEuLi5cIixcbiAgdmFsdWU6IFwi4LiC4LmJ4Lit4Lih4Li54LilXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi4LiB4Lij4Li44LiT4Liy4LiV4Lit4Lia4LiE4Liz4LiW4Liy4LihXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIuC4geC4o+C4uOC4k+C4suC4leC4reC4muC4guC4seC5ieC4meC4leC5iOC4s+C4q+C4meC4tuC5iOC4h+C4hOC4s+C4luC4suC4oVwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuC4geC4o+C4uOC4k+C4suC4leC4reC4muC4hOC4s+C4luC4suC4oeC5g+C4meC4l+C4uOC4geC5huC5geC4luC4p1wiLFxuICBudW1lcmljRXJyb3I6IFwi4LiC4LmJ4Lit4Lih4Li54Lil4LiX4Li14LmI4LmD4Liq4LmI4LiV4LmJ4Lit4LiH4LmA4Lib4LmH4LiZ4LiV4Lix4Lin4LmA4Lil4LiCXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi4LiB4Lij4Li44LiT4Liy4LmD4Liq4LmI4LiC4Lix4LmJ4LiZ4LiV4LmI4Liz4LiI4Liz4LiZ4Lin4LiZIHswfSDguJXguLHguKfguK3guLHguIHguKnguKNcIixcbiAgdGV4dE1heExlbmd0aDogXCLguIHguKPguLjguJPguLLguYPguKrguYjguYTguKHguYjguYDguIHguLTguJnguIjguLPguJnguKfguJkgezB9IOC4leC4seC4p+C4reC4seC4geC4qeC4o1wiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIuC4geC4o+C4uOC4k+C4suC5g+C4quC5iOC4guC4seC5ieC4meC4leC5iOC4s+C4iOC4s+C4meC4p+C4mSB7MH0g4LmB4Lil4Liw4LmE4Lih4LmI4LmA4LiB4Li04LiZ4LiI4Liz4LiZ4Lin4LiZIHsxfSDguJXguLHguKfguK3guLHguIHguKnguKNcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLguIHguKPguLjguJPguLLguYPguKrguYjguILguLHguYnguJnguJXguYjguLPguIjguLPguJnguKfguJkgezB9IOC5geC4luC4p1wiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLguIHguKPguLjguJPguLLguYDguKXguLfguK3guIHguK3guKLguYjguLLguIfguJnguYnguK3guKIgezB9IOC4o+C4suC4ouC4geC4suC4o1wiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLguIHguKPguLjguJPguLLguYDguKXguLfguK3guIHguYTguKHguYjguYDguIHguLTguJkgezB9IOC4o+C4suC4ouC4geC4suC4o1wiLFxuICBudW1lcmljTWluTWF4OiBcIid7MH0nIOC4leC5ieC4reC4h+C4oeC4suC4geC4geC4p+C5iOC4suC4q+C4o+C4t+C4reC5gOC4l+C5iOC4suC4geC4seC4miB7MX0g4LmB4Lil4Liw4LiZ4LmJ4Lit4Lii4LiB4Lin4LmI4Liy4Lir4Lij4Li34Lit4LmA4LiX4LmI4Liy4LiB4Lix4LiaIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIOC4leC5ieC4reC4h+C4oeC4suC4geC4geC4p+C5iOC4suC4q+C4o+C4t+C4reC5gOC4l+C5iOC4suC4geC4seC4miB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDguJnguYnguK3guKLguIHguKfguYjguLLguKvguKPguLfguK3guYDguJfguYjguLLguIHguLHguJogezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLguIHguKPguLjguJPguLLguYPguKrguYjguK3guLXguYDguKHguKXguYzguYHguK3guJTguYDguJTguKPguKrguJfguLXguYjguJbguLnguIHguJXguYnguK3guIdcIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVGhlIGV4cHJlc3Npb246IHswfSDguJXguYnguK3guIfguKPguLXguYDguJfguLTguKPguYzguJkgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi4Lij4Li14LmA4LiE4Lin4Liq4Lij4Li14LmA4LiX4Li04Lij4LmM4LiZIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwi4Lij4Li14LmA4LiE4Lin4Liq4Lij4Li14LmA4LiX4Li04Lij4LmM4LiZ4LiC4LmJ4Lit4Lih4Li54Lil4Lin4LmI4Liy4LiH4LmA4Lib4Lil4LmI4LiyIOC4q+C4o+C4t+C4rSAncGF0aCcgcHJvcGVydHkg4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi4LiC4LiZ4Liy4LiU4LmE4Lif4Lil4LmM4LiV4LmJ4Lit4LiH4LmE4Lih4LmI4LmA4LiB4Li04LiZIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIuC4geC4o+C4uOC4k+C4suC5g+C4quC5iOC4hOC5iOC4suC4reC4t+C5iOC4mVwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwi4LmE4Lif4Lil4LmM4LiC4Lit4LiH4LiE4Li44LiT4LiB4Liz4Lil4Lix4LiH4Lit4Lix4Lie4LmC4Lir4Lil4LiU4Lit4Lii4Li54LmILiDguIHguKPguLjguJPguLLguKPguK3guKrguLHguIHguITguKPguLnguYjguYHguKXguYnguKfguJfguLPguIHguLLguKPguKXguK3guIfguK3guLXguIHguITguKPguLHguYnguIdcIixcbiAgbG9hZGluZ0ZpbGU6IFwi4LiB4Liz4Lil4Lix4LiH4LmC4Lir4Lil4LiULi4uXCIsXG4gIGNob29zZUZpbGU6IFwi4LmA4Lil4Li34Lit4LiB4LmE4Lif4Lil4LmMLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLguYTguKHguYjguYTguJ/guKXguYzguJfguLXguYjguYDguKXguLfguK3guIFcIixcbiAgY29uZmlybURlbGV0ZTogXCLguITguLjguJPguJXguYnguK3guIfguIHguLLguKPguKXguJrguKPguLLguKLguIHguLLguKPguJnguLXguYnguIjguKPguLTguIfguKvguKPguLfguK3guYTguKHguYg/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi4LiC4LmJ4Lit4Lih4Li54Lil4LiZ4Li14LmJ4LiV4LmJ4Lit4LiH4LmA4Lib4LmH4LiZIHVuaXF1ZS5cIixcbiAgYWRkQ29sdW1uOiBcIuC5gOC4nuC4tOC5iOC4oeC4hOC4reC4peC4seC4oeC4meC5jFwiLFxuICBhZGRSb3c6IFwi4LmA4Lie4Li04LmI4Lih4LmB4LiW4LinXCIsXG4gIHJlbW92ZVJvdzogXCLguKXguJpcIixcbiAgYWRkUGFuZWw6IFwi4LmA4Lie4Li04LmI4LihXCIsXG4gIHJlbW92ZVBhbmVsOiBcIuC4peC4mlwiLFxuICBjaG9pY2VzX0l0ZW06IFwi4LiK4Li04LmJ4LiZXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi4LiE4Lit4Lil4Lix4Lih4LiZ4LmMXCIsXG4gIG1hdHJpeF9yb3c6IFwi4LmB4LiW4LinXCIsXG4gIHNhdmluZ0RhdGE6IFwi4Lic4Lil4Lil4Lix4Lie4LiX4LmM4LiB4Liz4Lil4Lix4LiH4Lia4Lix4LiZ4LiX4Li24LiB4Lil4LiH4LiX4Li14LmI4LmA4LiL4Li04Lij4LmM4Lif4LmA4Lin4Lit4Lij4LmMLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLguKHguLXguITguKfguLLguKHguJzguLTguJTguJ7guKXguLLguJTguYDguIHguLTguJTguILguLbguYnguJnguKrguYjguIfguJzguKXguYPguKvguYnguYTguKHguYjguKrguLLguKHguLLguKPguJbguJrguLHguJnguJfguLbguIHguJzguKXguYTguJTguYlcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi4Lia4Lix4LiZ4LiX4Li24LiB4Liq4Liz4LmA4Lij4LmH4LiI4LmB4Lil4LmJ4LinXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLguKPguJrguIHguKfguJnguKXguK3guIfguK3guLXguIHguITguKPguLHguYnguIdcIixcbiAgdGltZXJNaW46IFwi4LiZ4Liy4LiX4Li1XCIsXG4gIHRpbWVyU2VjOiBcIuC4p+C4tOC4meC4suC4l+C4tVwiLFxuICB0aW1lclNwZW50QWxsOiBcIuC4hOC4uOC4k+C5g+C4iuC5ieC5gOC4p+C4peC4siB7MH0g4Lia4LiZ4Lir4LiZ4LmJ4Liy4LiZ4Li14LmJ4LmB4Lil4LiwIHsxfSDguKPguKfguKHguJfguLHguYnguIfguKvguKHguJRcIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi4LiE4Li44LiT4LmD4LiK4LmJ4LmA4Lin4Lil4LiyIHswfSDguJrguJnguKvguJnguYnguLLguJnguLXguYlcIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLguITguLjguJPguYPguIrguYnguYDguKfguKXguLIgezB9IOC4o+C4p+C4oeC4l+C4seC5ieC4h+C4q+C4oeC4lFwiLFxuICB0aW1lckxpbWl0QWxsOiBcIuC4hOC4uOC4k+C5g+C4iuC5ieC5gOC4p+C4peC4siB7MH0g4LiC4Lit4LiHIHsxfSDguJrguJnguKvguJnguYnguLLguJnguLXguYnguYHguKXguLAgezJ9IOC4guC4reC4hyB7M30g4Lij4Lin4Lih4LiX4Lix4LmJ4LiH4Lir4Lih4LiUXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIuC4hOC4uOC4k+C5g+C4iuC5ieC5gOC4p+C4peC4siB7MH0g4LiC4Lit4LiHIHsxfSDguJrguJnguKvguJnguYnguLLguJnguLXguYlcIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLguITguLjguJPguYPguIrguYnguYDguKfguKXguLIgezB9IOC4guC4reC4hyB7MX0g4Lij4Lin4Lih4LiX4Lix4LmJ4LiH4Lir4Lih4LiUXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLguITguKXguLXguJlcIixcbiAgY2xlYXJDYXB0aW9uOiBcIuC5gOC4hOC4peC4teC4ouC4o+C5jFwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLguYDguKXguLfguK3guIHguYTguJ/guKXguYxcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi4LiZ4Liz4LmE4Lif4Lil4LmM4LiZ4Li14LmJ4Lit4Lit4LiBXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi4LmD4LiK4LmIXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLguYTguKHguYjguYPguIrguYhcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi4LiE4Li44LiT4LmB4LiZ4LmI4LmD4LiI4LiX4Li14LmI4LiI4Liw4LiZ4Liz4LmE4Lif4Lil4LmM4LiZ4Li14LmJ4Lit4Lit4LiB4LmD4LiK4LmI4Lir4Lij4Li34Lit4LmE4Lih4LmIOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLguITguLjguJPguYHguJnguYjguYPguIjguJfguLXguYjguIjguLDguJnguLPguYTguJ/guKXguYzguJfguLHguYnguIfguKvguKHguJTguK3guK3guIHguYPguIrguYjguKvguKPguLfguK3guYTguKHguYhcIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIuC4iuC4t+C5iOC4reC4hOC4s+C4luC4suC4oVwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJ0aFwiXSA9IHRoYWlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1widGhcIl0gPSBcIuC5hOC4l+C4olwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciB0cmFkaXRpb25hbENoaW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi5LiK5LiA6aCBXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLkuIvkuIDpoIFcIixcbiAgY29tcGxldGVUZXh0OiBcIuaPkOS6pOWVj+WNt1wiLFxuICBvdGhlckl0ZW1UZXh0OiBcIuWhq+Wvq+WFtuS7luetlOahiFwiLFxuICBwcm9ncmVzc1RleHQ6IFwi56ysIHswfSDpoIEsIOWFsSB7MX0g6aCBXCIsXG4gIGVtcHR5U3VydmV5OiBcIuWVj+WNt+S4reaykuacieWVj+mhjOaIlumggemdolwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuaEn+isneaCqOeahOWPg+iIhyFcIixcbiAgbG9hZGluZ1N1cnZleTogXCLllY/ljbfovInlhaXkuK0uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi6KuL6YG45pOHLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi6KuL5aGr5a+r5q2k5ZWP6aGMXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi6KuL5aGr5a+r5omA5pyJ6KGM5Lit5ZWP6aGMXCIsXG4gIG51bWVyaWNFcnJvcjogXCLnrZTmoYjlv4XpoIjmmK/lgIvmlbjlrZdcIixcbiAgdGV4dE1pbkxlbmd0aDogXCLnrZTmoYjplbfluqboh7PlsJEgezB9IOWAi+Wtl+WFg1wiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIuetlOahiOmVt+W6puS4jeiDvei2hemBjiB7MH0g5YCL5a2X5YWDXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi562U5qGI6ZW35bqm5b+F6aCI5ZyoIHswfSAtIHsxfSDlgIvlrZflhYPkuYvplpNcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLmnIDlsJHpnIDopoHloavlr6sgezB9IOihjOetlOahiFwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLmnIDlsJHpnIDopoHpgbjmk4cgezB9IOmgheetlOahiFwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLmnIDlpJrlj6rog73pgbjmk4cgezB9IOmgheetlOahiFwiLFxuICBudW1lcmljTWluTWF4OiBcIuetlOahiCAnezB9JyDlv4XpoIjlpKfmlrznrYnmlrwgezF9IOS4lOWwj+aWvOetieaWvCB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCLnrZTmoYggJ3swfScg5b+F6aCI5aSn5pa8562J5pa8IHsxfVwiLFxuICBudW1lcmljTWF4OiBcIuetlOahiCAnezB9JyDlv4XpoIjlsI/mlrznrYnmlrwgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLoq4vovLjlhaXmnInmlYjnmoQgRW1haWwg5Zyw5Z2AXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLovInlhaXpgbjpoIXmmYLnmbznlJ/pjK/oqqQgJ3swfSc6IHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwi5pyq6IO96LyJ5YWl5pyJ5pWI55qE6YG46aCF5oiW6KuL5rGC5Y+D5pW46Lev5b6R5pyJ6KqkXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi5paH5Lu25aSn5bCP5LiN6IO96LaF6YGOIHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi6KuL5a6M5oiQ5YW25LuW5ZWP6aGMXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi5paH5Lu25LiK5YKz5LitLi4uIOiri+iAkOW/g+etieW+heW5vuenkuW+jOmHjeipplwiLFxuICBhZGRSb3c6IFwi5re75Yqg562U5qGIXCIsXG4gIHJlbW92ZVJvdzogXCLliKrpmaTnrZTmoYhcIixcbiAgY2hvaWNlc19JdGVtOiBcIumBuOmghVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIuWIl1wiLFxuICBtYXRyaXhfcm93OiBcIuihjFwiLFxuICBzYXZpbmdEYXRhOiBcIuato+WcqOWwh+e1kOaenOS/neWtmOWIsOacjeWLmeWZqC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi5Zyo5L+d5a2Y57WQ5p6c6YGO56iL5Lit55m855Sf5LqG6Yyv6Kqk77yM57WQ5p6c5pyq6IO95L+d5a2YXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIue1kOaenOS/neWtmOaIkOWKnyFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIuiri+mHjeipplwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInpoLXR3XCJdID0gdHJhZGl0aW9uYWxDaGluZXNlU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInpoLXR3XCJdID0gXCLnuYHpq5TkuK3mlodcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgdHVya2lzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJHZXJpXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLEsGxlcmlcIixcbiAgY29tcGxldGVUZXh0OiBcIkFua2V0aSBUYW1hbWxhXCIsXG4gIHByZXZpZXdUZXh0OiBcIsOWbiBpemxlbWVcIixcbiAgZWRpdFRleHQ6IFwiRMO8emVubGVcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkJhxZ9sYXRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJEacSfZXIgKGHDp8Sxa2xhecSxbsSxeilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIllva1wiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJIZXBzaW5pIHNlw6dcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNheWZhIHswfSAvIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiS2F5xLF0IHswfSAvIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiU29ydWxhcsSxIGNldmFwbGFkxLEgezB9IC8gezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkFua2V0dGUgZ8O2csO8bnTDvGxlbmVjZWsgc2F5ZmEgeWEgZGEgc29ydSBtZXZjdXQgZGXEn2lsLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkFua2V0aW1pemkgdGFtYW1sYWTEscSfxLFuxLF6IGnDp2luIHRlxZ9la2vDvHIgZWRlcml6LlwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiS2F5xLF0bGFyxLFtxLF6LCBidSBhbmtldGkgemF0ZW4gdGFtYW1sYWTEscSfxLFuxLF6xLEgZ8O2c3Rlcml5b3IuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiQW5rZXQgc3VudWN1ZGFuIHnDvGtsZW5peW9yIC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJTZcOnaW5peiAuLi5cIixcbiAgdmFsdWU6IFwiZGXEn2VyXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiTMO8dGZlbiBzb3J1eWEgY2V2YXAgdmVyaW5pelwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJMw7x0ZmVuIGVuIGF6IGJpciBzb3J1eXUgeWFuxLF0bGF5xLFuLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkzDvHRmZW4gdMO8bSBzYXTEsXJsYXJkYWtpIHNvcnVsYXLEsSBjZXZhcGxhecSxbsSxei5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkdpcmlsZW4gZGXEn2VyIG51bWVyaWsgb2xtYWzEsWTEsXJcIixcbiAgdGV4dE1pbkxlbmd0aDogXCJFbiBheiB7MH0gc2VtYm9sIGdpcmluaXouXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTMO8dGZlbiB7MH0ga2FyYWt0ZXJkZW4gYXogZ2lyaW4uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiTMO8dGZlbiB7MH0g4oCZZGVuIGZhemxhIHZlIHsxfSDigJlkZW4gYXoga2FyYWt0ZXIgZ2lyaW4uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiTMO8dGZlbiBlbiBheiB7MH0gc2F0xLFyxLEgZG9sZHVydW4uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkzDvHRmZW4gZW4gYXogezB9IHNlw6dlbmXEn2kgc2XDp2luaXouXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIkzDvHRmZW4gezB9IGFkZXR0ZW4gZmF6bGEgc2XDp21leWluaXouXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJUaGUgJ3swfScgc2hvdWxkIGJlIGVxdWFsIG9yIG1vcmUgdGhhbiB7MX0gYW5kIGVxdWFsIG9yIGxlc3MgdGhhbiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBkZcSfZXJpIHsxfSBkZcSfZXJpbmUgZcWfaXQgdmV5YSBiw7x5w7xrIG9sbWFsxLFkxLFyXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgZGXEn2VyaSB7MX0gZGXEn2VyaW5lIGXFn2l0IHlhIGRhIGvDvMOnw7xrIG9sbWFsxLFkxLFyLlwiLFxuICBpbnZhbGlkRW1haWw6IFwiTMO8dGZlbiBnZcOnZXJsaSBiaXIgZXBvc3RhIGFkcmVzaSBnaXJpbml6LlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLEsGZhZGU6IHswfSAndHJ1ZScgZMO2bmTDvHJtZWxpZGlyLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiVGFsZWJpIMWfdSBoYXRhecSxIGTDtm5kw7wgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJUYWxlcCBoZXJoYW5naSBiaXIgdmVyaSBkw7ZubWVkaSB5YSBkYSAncGF0aCcgw7Z6ZWxsacSfaSBoYXRhbMSxLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkRvc3lhIGJveXV0dSB7MH0gZGXEn2VyaW5pIGdlw6dlbWV6LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTMO8dGZlbiBkacSfZXIgZGXEn2VybGVyaSBnaXJpbml6LlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRG9zeWFuxLF6IHnDvGtsZW5peW9yLiBMw5x0ZmVuIGJpcmthw6cgc2FuaXllIGJla2xleWluIHZlIHRla3JhciBkZW5leWluLlwiLFxuICBsb2FkaW5nRmlsZTogXCJZw7xrbGVuaXlvci4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkRvc3lhbGFyxLEgc2XDp2luIC4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiRG9zeWEgc2XDp2lsaSBkZcSfaWxcIixcbiAgY29uZmlybURlbGV0ZTogXCJLYXlkxLEgc2lsbWVrIGlzdGl5b3IgbXVzdW51ej9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJCdSBkZcSfZXIgYmVuemVyc2l6IG9sbWFsxLFkxLFyLlwiLFxuICBhZGRDb2x1bW46IFwiU8O8dHVuIGVrbGV5aW5cIixcbiAgYWRkUm93OiBcIlNhdMSxciBFa2xlXCIsXG4gIHJlbW92ZVJvdzogXCJLYWxkxLFyXCIsXG4gIGFkZFBhbmVsOiBcIlllbmkgZWtsZVwiLFxuICByZW1vdmVQYW5lbDogXCJLYWxkxLFybWFrXCIsXG4gIGNob2ljZXNfSXRlbTogXCJlxZ95YVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIlPDvHR1blwiLFxuICBtYXRyaXhfcm93OiBcIkvDvHJlayDDp2VrbWVrXCIsXG4gIHNhdmluZ0RhdGE6IFwiU29udcOnbGFyIHN1bnVjdXlhIGtheWRlZGlsaXlvciAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkJpciBoYXRhIG9sdcWfdHUgdmUgc29udcOnbGFyxLEga2F5ZGVkZW1lZGlrLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJTb251w6dsYXIgYmHFn2FyxLF5bGEga2F5ZGVkaWxkaSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlRla3JhciBkZW5leWluXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzYW5peWVcIixcbiAgdGltZXJTcGVudEFsbDogXCJCdSBzYXlmYWRhIHswfSB2ZSB0b3BsYW1kYSB7MX0gaGFyY2FkxLFuxLF6LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJCdSBzYXlmYXlhIHswfSBoYXJjYWTEsW7EsXouXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiVG9wbGFtZGEgezB9IGhhcmNhZMSxbsSxei5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkJ1IHNheWZheWEgezB9IC8gezF9IHZlIHRvcGxhbWRhIHsyfSAvIHszfSBoYXJjYWTEsW7EsXouXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkJ1IHNheWZheWEgezB9IC8gezF9IGhhcmNhZMSxbsSxei5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJUb3BsYW1kYSB7MH0gLyB7MX0gaGFyY2FkxLFuxLF6LlwiLFxuICBjbGVhbkNhcHRpb246IFwiVGVtaXpcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkHDp8Sxa1wiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJEb3N5YSBzZcOnaW5cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiQnUgZG9zeWF5xLEga2FsZMSxclwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkV2ZXRcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIkhhecSxclwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJCdSBkb3N5YXnEsSBrYWxkxLFybWFrIGlzdGVkacSfaW5pemRlbiBlbWluIG1pc2luaXo6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIlTDvG0gZG9zeWFsYXLEsSBrYWxkxLFybWFrIGlzdGVkacSfaW5pemRlbiBlbWluIG1pc2luaXo/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJTb3J1IGJhxZ9sxLHEn8SxXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInRyXCJdID0gdHVya2lzaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJ0clwiXSA9IFwidMO8cmvDp2VcIjtcbiIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgdWtyYWluaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItCd0LDQt9Cw0LRcIixcbiAgcGFnZU5leHRUZXh0OiBcItCU0LDQu9GWXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLQl9Cw0LLQtdGA0YjQuNGC0LhcIixcbiAgcHJldmlld1RleHQ6IFwi0J/QvtC/0LXRgNC10LTQvdGW0Lkg0L/QtdGA0LXQs9C70Y/QtFwiLFxuICBlZGl0VGV4dDogXCLQoNC10LTQsNCz0YPQstCw0YLQuFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi0J/QvtGH0LDRgtC4XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi0IbQvdGI0LUgKNCx0YPQtNGMINC70LDRgdC60LAsINC+0L/QuNGI0ZbRgtGMKVwiLFxuICBub25lSXRlbVRleHQ6IFwi0JbQvtC00LXQvVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLQktC40LHRgNCw0YLQuCDQstGB0LVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcItCh0YLQvtGA0ZbQvdC60LAgezB9INC3IHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwi0JfQsNC/0LjRgSB7MH0g0ZbQtyB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcItCS0ZbQtNC/0L7QstGW0LvQuCDQvdCwIHswfS97MX0g0L/QuNGC0LDQvdGMXCIsXG4gIGVtcHR5U3VydmV5OiBcItCd0LXQvNCw0ZQg0LbQvtC00L3QvtCz0L4g0L/QuNGC0LDQvdC90Y8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi0JTRj9C60YPRlNC80L4g0JLQsNC8INC30LAg0LfQsNC/0L7QstC90LXQvdC90Y8g0LDQvdC60LXRgtC4IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwi0JLQuCDQstC20LUg0L/RgNC+0YXQvtC00LjQu9C4INGG0LUg0L7Qv9C40YLRg9Cy0LDQvdC90Y8uXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi0JfQsNCy0LDQvdGC0LDQttC10L3QvdGPINC+0L/QuNGC0YPQstCw0L3QvdGPLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcItCS0LjQsdGA0LDRgtC4Li4uXCIsXG4gIHZhbHVlOiBcItC30L3QsNGH0LXQvdC90Y9cIixcbiAgcmVxdWlyZWRFcnJvcjogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQtNCw0LnRgtC1INCy0ZbQtNC/0L7QstGW0LTRjC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LTQsNC50YLQtSDQstGW0LTQv9C+0LLRltC00Ywg0YXQvtGH0LAg0LEg0L3QsCDQvtC00L3QtSDQv9C40YLQsNC90L3Rjy5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQtNCw0LnRgtC1INCy0ZbQtNC/0L7QstGW0LTRjCDQvdCwINC/0LjRgtCw0L3QvdGPINCyINC60L7QttC90L7QvNGDINGA0Y/QtNC60YMuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLQktGW0LTQv9C+0LLRltC00Ywg0L/QvtCy0LjQvdC90LAg0LHRg9GC0Lgg0YfQuNGB0LvQvtC8LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcItCR0YPQtNGMINC70LDRgdC60LAg0LLQstC10LTRltGC0Ywg0LHRltC70YzRiNC1IHswfSDRgdC40LzQstC+0LvRltCyLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItCR0YPQtNGMINC70LDRgdC60LAg0LLQstC10LTRltGC0Ywg0LzQtdC90YjQtSB7MH0g0YHQuNC80LLQvtC70ZbQsi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLQkdGD0LTRjCDQu9Cw0YHQutCwINCy0LLQtdC00ZbRgtGMINCx0ZbQu9GM0YjQtSB7MH0g0Lgg0LzQtdC90YjQtSB7MX0g0YHQuNC80LLQvtC70ZbQsi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQt9Cw0L/QvtCy0L3RltGC0Ywg0L3QtSDQvNC10L3RiNC1IHswfSDRgNGP0LTQutGW0LIuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItCR0YPQtNGMINC70LDRgdC60LAsINCy0LjQsdC10YDRltGC0Ywg0YXQvtGH0LAg0LEgezB9INCy0LDRgNGW0LDQvdGC0ZbQsi5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LLQuNCx0LXRgNGW0YLRjCDQvdC1INCx0ZbQu9GM0YjQtSB7MH0g0LLQsNGA0ZbQsNC90YLRltCyLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScg0L/QvtCy0LjQvdC90L4g0LHRg9GC0Lgg0L3QtSDQvNC10L3RiNC1INC90ZbQtiB7MX0sINGWINC90LUg0LHRltC70YzRiNC1INC90ZbQtiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyDQv9C+0LLQuNC90L3QviDQsdGD0YLQuCDQvdC1INC80LXQvdGI0LUg0L3RltC2IHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nINC/0L7QstC40L3QvdC+INCx0YPRgtC4INC90LUg0LHRltC70YzRiNC1INC90ZbQtiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcItCR0YPQtNGMINC70LDRgdC60LAsINCy0LLQtdC00ZbRgtGMINC00ZbQudGB0L3RgyDQsNC00YDQtdGB0YMg0LXQu9C10LrRgtGA0L7QvdC90L7RlyDQv9C+0YjRgtC4LlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLQktC40YDQsNC3IHswfSDQv9C+0LLQuNC90LXQvSDQv9C+0LLQtdGA0YLQsNGC0LggJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi0JfQsNC/0LjRgiDQv9C+0LLQtdGA0L3Rg9CyINC/0L7QvNC40LvQutGDICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwi0JLRltC00L/QvtCy0ZbQtNGMINC90LAg0LfQsNC/0LjRgiDQv9C+0LLQtdGA0L3Rg9C70LDRgdGMINC/0L7RgNC+0LbQvdGM0L7RjiDQsNCx0L4g0LLQu9Cw0YHRgtC40LLRltGC0YwgJ3BhdGgnINCy0LrQsNC30LDQvdC+INC90LXQstGW0YDQvdC+XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi0KDQvtC30LzRltGAINGE0LDQudC70YMg0L3QtSDQv9C+0LLQuNC90LXQvSDQv9C10YDQtdCy0LjRidGD0LLQsNGC0LggezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LLQstC10LTRltGC0Ywg0LTQsNC90ZYg0LIg0L/QvtC70LUgJ9CG0L3RiNC1J1wiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwi0JLQsNGIINGE0LDQudC7INC30LDQstCw0L3RgtCw0LbRg9GU0YLRjNGB0Y8uINCX0LDRh9C10LrQsNC50YLQtSDQtNC10LrRltC70YzQutCwINGB0LXQutGD0L3QtCDRliDRgdC/0YDQvtCx0YPQudGC0LUg0LfQvdC+0LLRgy5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi0JfQsNCy0LDQvdGC0LDQttC10L3QvdGPLi4uXCIsXG4gIGNob29zZUZpbGU6IFwi0JLQuNCx0LXRgNGW0YLRjCDRhNCw0LnQuyjQuCkuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcItCk0LDQudC7INC90LUg0LLQuNCx0YDQsNC90L5cIixcbiAgY29uZmlybURlbGV0ZTogXCLQktC4INGF0L7Rh9C10YLQtSDQstC40LTQsNC70LjRgtC4INC30LDQv9C40YE/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi0KbQtSDQt9C90LDRh9C10L3QvdGPINC/0L7QstC40L3QvdC+INCx0YPRgtC4INGD0L3RltC60LDQu9GM0L3QuNC8LlwiLFxuICBhZGRDb2x1bW46IFwi0JTQvtC00LDRgtC4INC60L7Qu9C+0L3QutGDXCIsXG4gIGFkZFJvdzogXCLQlNC+0LTQsNGC0Lgg0YDRj9C00L7QulwiLFxuICByZW1vdmVSb3c6IFwi0JLQuNC00LDQu9C40YLQuFwiLFxuICBhZGRQYW5lbDogXCLQlNC+0LTQsNGC0Lgg0L3QvtCy0YNcIixcbiAgcmVtb3ZlUGFuZWw6IFwi0JLQuNC00LDQu9C40YLQuFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi0JLQsNGA0ZbQsNC90YJcIixcbiAgbWF0cml4X2NvbHVtbjogXCLQmtC+0LvQvtC90LrQsFwiLFxuICBtYXRyaXhfcm93OiBcItCg0Y/QtNC+0LpcIixcbiAgc2F2aW5nRGF0YTogXCLQoNC10LfRg9C70YzRgtCw0YLQuCDQt9Cx0LXRgNGW0LPQsNGO0YLRjNGB0Y8g0L3QsCDRgdC10YDQstC10YAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcItCS0ZbQtNCx0YPQu9Cw0YHRjyDQv9C+0LzQuNC70LrQsCwg0YDQtdC30YPQu9GM0YLQsNGCINC90LUg0LHRg9CyINC30LHQtdGA0LXQttC10L3QuNC5LlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLQoNC10LfQstGD0LvRjNGC0LDRgiDRg9GB0L/RltGI0L3QviDQt9Cx0LXRgNC10LbQtdC90LjQuSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcItCh0L/RgNC+0LHRg9Cy0LDRgtC4INC30L3QvtCy0YNcIixcbiAgdGltZXJNaW46IFwi0YXQslwiLFxuICB0aW1lclNlYzogXCLRgdC10LpcIixcbiAgdGltZXJTcGVudEFsbDogXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0L3QsCDRhtGW0Lkg0YHRgtC+0YDRltC90YbRliDRliB7MX0g0LfQsNCz0LDQu9C+0LwuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcItCS0Lgg0LLQuNGC0YDQsNGC0LjQu9C4IHswfSDQvdCwINGG0ZbQuSDRgdGC0L7RgNGW0L3RhtGWLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcItCS0Lgg0LLQuNGC0YDQsNGC0LjQu9C4IHswfSDQv9GA0L7RgtGP0LPQvtC8INGC0LXRgdGC0YMuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0LcgezF9INC90LAg0YbRltC5INGB0YLQvtGA0ZbQvdGG0ZYg0ZYgezJ9INC3IHszfSDQtNC70Y8g0LLRgdGM0L7Qs9C+INGC0LXRgdGC0YMuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcItCS0Lgg0LLQuNGC0YDQsNGC0LjQu9C4IHswfSDQtyB7MX0g0L3QsCDRhtGW0Lkg0YHRgtC+0YDRltC90YbRli5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0LcgezF9INC00LvRjyDQstGB0YzQvtCz0L4g0YLQtdGB0YLRgy5cIixcbiAgY2xlYW5DYXB0aW9uOiBcItCe0YfQuNGB0YLQuNGC0LhcIixcbiAgY2xlYXJDYXB0aW9uOiBcItCe0YfQuNGB0YLQuNGC0LhcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi0JLQuNCx0LXRgNGW0YLRjCDRhNCw0LnQu1wiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLQktC40LTQsNC70LjRgtC4INGE0LDQudC7XCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi0KLQsNC6XCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLQndGWXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcItCS0Lgg0LLQv9C10LLQvdC10L3Rliwg0YnQviDRhdC+0YfQtdGC0LUg0LLQuNC00LDQu9C40YLQuCDRhtC10Lkg0YTQsNC50Ls6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcItCS0Lgg0LLQv9C10LLQvdC10L3Rliwg0YnQviDRhdC+0YfQtdGC0LUg0LLQuNC00LDQu9C40YLQuCDQstGB0ZYg0YTQsNC50LvQuD9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcItCd0LDQt9Cy0LAg0LfQsNC/0LjRgtCw0L3QvdGPXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInVhXCJdID0gdWtyYWluaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInVhXCJdID0gXCLRg9C60YDQsNGX0L3RgdGM0LrQsFwiO1xuIiwiLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciB2aWV0bmFtZXNlU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlByZXZpb3VzXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJOZXh0XCIsXG4gIGNvbXBsZXRlVGV4dDogXCJDb21wbGV0ZVwiLFxuICBwcmV2aWV3VGV4dDogXCJQcmV2aWV3XCIsXG4gIGVkaXRUZXh0OiBcIkVkaXRcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlN0YXJ0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiT3RoZXIgKGRlc2NyaWJlKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTm9uZVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJTZWxlY3QgQWxsXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQYWdlIHswfSBvZiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlJlY29yZCB7MH0gb2YgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJBbnN3ZXJlZCB7MH0vezF9IHF1ZXN0aW9uc1wiLFxuICBlbXB0eVN1cnZleTogXCJUaGVyZSBpcyBubyB2aXNpYmxlIHBhZ2Ugb3IgcXVlc3Rpb24gaW4gdGhlIHN1cnZleS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUaGFuayB5b3UgZm9yIGNvbXBsZXRpbmcgdGhlIHN1cnZleSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk91ciByZWNvcmRzIHNob3cgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGNvbXBsZXRlZCB0aGlzIHN1cnZleS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJMb2FkaW5nIFN1cnZleS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJDaOG7jW4uLi5cIixcbiAgdmFsdWU6IFwidmFsdWVcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJQbGVhc2UgYW5zd2VyIHRoZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiUGxlYXNlIGFuc3dlciBhdCBsZWFzdCBvbmUgcXVlc3Rpb24uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUGxlYXNlIGFuc3dlciBxdWVzdGlvbnMgaW4gYWxsIHJvd3MuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJUaGUgdmFsdWUgc2hvdWxkIGJlIG51bWVyaWMuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUGxlYXNlIGVudGVyIGF0IGxlYXN0IHswfSBjaGFyYWN0ZXJzLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlBsZWFzZSBlbnRlciBsZXNzIHRoYW4gezB9IGNoYXJhY3RlcnMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUGxlYXNlIGVudGVyIG1vcmUgdGhhbiB7MH0gYW5kIGxlc3MgdGhhbiB7MX0gY2hhcmFjdGVycy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQbGVhc2UgZmlsbCBpbiBhdCBsZWFzdCB7MH0gcm93cy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCB7MH0gdmFyaWFudHMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBsZWFzZSBzZWxlY3Qgbm8gbW9yZSB0aGFuIHswfSB2YXJpYW50cy5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbW9yZSB0aGFuIHsxfSBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuIHsyfVwiLFxuICBudW1lcmljTWluOiBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbW9yZSB0aGFuIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZS1tYWlsIGFkZHJlc3MuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlRoZSBleHByZXNzaW9uOiB7MH0gc2hvdWxkIHJldHVybiAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJUaGUgcmVxdWVzdCByZXR1cm5lZCBlcnJvciAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlRoZSByZXF1ZXN0IHJldHVybmVkIGVtcHR5IGRhdGEgb3IgdGhlICdwYXRoJyBwcm9wZXJ0eSBpcyBpbmNvcnJlY3RcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJUaGUgZmlsZSBzaXplIHNob3VsZCBub3QgZXhjZWVkIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlBsZWFzZSBlbnRlciB0aGUgb3RoZXIgdmFsdWUuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJZb3VyIGZpbGUgaXMgdXBsb2FkaW5nLiBQbGVhc2Ugd2FpdCBzZXZlcmFsIHNlY29uZHMgYW5kIHRyeSBhZ2Fpbi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiTG9hZGluZy4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkNob29zZSBmaWxlKHMpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJObyBmaWxlIGNob3NlblwiLFxuICBjb25maXJtRGVsZXRlOiBcIkRvIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgcmVjb3JkP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlRoaXMgdmFsdWUgc2hvdWxkIGJlIHVuaXF1ZS5cIixcbiAgYWRkQ29sdW1uOiBcIkFkZCBjb2x1bW5cIixcbiAgYWRkUm93OiBcIkFkZCByb3dcIixcbiAgcmVtb3ZlUm93OiBcIlJlbW92ZVwiLFxuICBhZGRQYW5lbDogXCJBZGQgbmV3XCIsXG4gIHJlbW92ZVBhbmVsOiBcIlJlbW92ZVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiaXRlbVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbHVtblwiLFxuICBtYXRyaXhfcm93OiBcIlJvd1wiLFxuICBzYXZpbmdEYXRhOiBcIlRoZSByZXN1bHRzIGFyZSBzYXZpbmcgb24gdGhlIHNlcnZlci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiQW4gZXJyb3Igb2NjdXJyZWQgYW5kIHdlIGNvdWxkIG5vdCBzYXZlIHRoZSByZXN1bHRzLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJUaGUgcmVzdWx0cyB3ZXJlIHNhdmVkIHN1Y2Nlc3NmdWxseSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlRyeSBhZ2FpblwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9uIHRoaXMgcGFnZSBhbmQgezF9IGluIHRvdGFsLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gb24gdGhpcyBwYWdlLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIllvdSBoYXZlIHNwZW50IHswfSBpbiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIllvdSBoYXZlIHNwZW50IHswfSBvZiB7MX0gb24gdGhpcyBwYWdlIGFuZCB7Mn0gb2YgezN9IGluIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gb2YgezF9IG9uIHRoaXMgcGFnZS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gb2YgezF9IGluIHRvdGFsLlwiLFxuICBjbGVhbkNhcHRpb246IFwiQ2xlYW5cIixcbiAgY2xlYXJDYXB0aW9uOiBcIkNsZWFyXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIkNob29zZSBmaWxlXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlJlbW92ZSB0aGlzIGZpbGVcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJZZXNcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5vXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkFyZSB5b3Ugc3VyZSB0aGF0IHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIGZpbGU6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkFyZSB5b3Ugc3VyZSB0aGF0IHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgZmlsZXM/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJRdWVzdGlvbiBUaXRsZVwiLFxufTtcblxuLy9VbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZS4gWW91IHNob3VsZCByZXBsYWNlIFwiZW5cIiBhbmQgZW5TdHJpbmdzIHdpdGggeW91ciBsb2NhbGUgKFwiZnJcIiwgXCJkZVwiIGFuZCBzbyBvbikgYW5kIHlvdXIgdmFyaWFibGUuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInZpXCJdID0gdmlldG5hbWVzZVN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJ2aVwiXSA9IFwidmlldG5hbWVzZVwiO1xuIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciB3ZWxzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJCbGFlbm9yb2xcIixcbiAgcGFnZU5leHRUZXh0OiBcIk5lc2FmXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJDd2JsaGF1XCIsXG4gIHByZXZpZXdUZXh0OiBcIlJoYWdvbHdnXCIsXG4gIGVkaXRUZXh0OiBcIkdvbHlndVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiRGVjaHJhdVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkFyYWxsIChkaXNncmlmaXdjaClcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIkRpbVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJEZXdpcyB5IEN5ZmFuIFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiVHVkYWxlbiB7MH0gbyB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIkNvZm5vZCB7MH0gbyB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIldlZGkgYXRlYiB7MH0vezF9IGN3ZXN0aXduXCIsXG4gIGVtcHR5U3VydmV5OiBcIkRvZXMgZGltIG1vZGQgZ3dlbGQgdHVkYWxlbiBuYSBjaHdlc3Rpd24geW4geXIgYXJvbHdnLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkRpb2xjaCBhbSBsZW53aeKAmXIgaG9saWFkdXIhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6IFwiUnlkeWNoIGNoaSB3ZWRpIGxsZW53aeKAmXIgYXJvbHdnIGh3biB5biBiYXJvZCB5biDDtGwgZWluIGNvZm5vZGlvbi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJXcnRoaeKAmW4gTGx3eXRob+KAmXIgQXJvbHdnLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIkRld2lzd2NoLi4uXCIsXG4gIHZhbHVlOiBcImd3ZXJ0aFwiLFxuICByZXF1aXJlZEVycm9yOiBcIkF0ZWJ3Y2ggeSBjd2VzdGl3bi5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiQXRlYndjaCBvIGxlaWFmIHVuIGN3ZXN0aXduLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkF0ZWJ3Y2ggeSBjd2VzdGl5bmF1IHltIG1ob2Igcmhlcy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkR5bGFp4oCZciBnd2VydGggZm9kIHluIHJoaWYuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUmhvd2NoIG8gbGVpYWYgezB9IG5vZC5cIixcbiAgdGV4dE1heExlbmd0aDogXCJSaG93Y2ggbGFpIG5hIHswfSBub2QuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUmhvd2NoIG8gbGVpYWYgezB9IG5vZCBvbmQgZGltIG13eSBuYSB7MX0uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiTGxlbndjaCBvIGxlaWFmIHswfSByaGVzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJEZXdpc3djaCBvIGxlaWFmIHswfSBhbXJ5d2lvbHluLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJQZWlkaXdjaCDDoiBkZXdpcyBtd3kgbmEgezB9IGFtcnl3aW9seW4uXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiRHlsYWnigJlyICd7MH0nIGZvZCB5ciB1biBmYXRoIMOiIHsxfSBuZXXigJluIGZ3eSwgYeKAmXIgZmF0aCDDoiB7Mn0gbmV14oCZbiBsbGFpXCIsXG4gIG51bWVyaWNNaW46IFwiRHlsYWnigJlyICd7MH0nIGZvZCB5ciB1biBmYXRoIMOiIHsxfSBuZXXigJluIGZ3eVwiLFxuICBudW1lcmljTWF4OiBcIkR5bGFp4oCZciAnezB9JyBmb2QgeXIgdW4gZmF0aCDDoiB7MX0gbmV14oCZbiBsbGFpXCIsXG4gIGludmFsaWRFbWFpbDogXCJSaG93Y2ggZ3lmZWlyaWFkIGUtYm9zdCBkaWx5cy5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiRHlsYWnigJlyIG15bmVnaWFkIHswfSBhcndhaW4gYXQgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUm9lZGQgeSBjYWlzIHdlZGkgYXJ3YWluIGF0IHkgZ3dhbGwgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiUm9lZGQgeSBjYWlzIHdlZGkgYXJ3YWluIGF0IGRkYXRhIGd3YWcgbmV1IG1hZSBwcmlvZHdlZGQgeSDigJhwYXRo4oCZIHluIGFuZ2h5d2lyIFwiLFxuICBleGNlZWRNYXhTaXplOiBcIkRkeWxhaeKAmXIgZmZlaWwgZGRpbSBib2QgeW4gZnd5IG5hIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlJob3djaCB5IGd3ZXJ0aCBhcmFsbC5cIixcbiAgdXBsb2FkaW5nRmlsZTogXCJNYWUgZWljaCBmZmVpbCB3cnRoaeKAmW4gbGx3eXRobyBpIGZ5bnkuIEFyaG9zd2NoIHljaHlkaWcgbyBlaWxpYWRhdSBhIHJob2kgY3lubmlnIGFyYWxsIGFybmkuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIldydGhp4oCZbiBsbHd5dGhvLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiRGV3aXN3Y2ggZmZlaWwoaWF1KS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiSGViIGRkZXdpcyBmZmVpbCBcIixcbiAgY29uZmlybURlbGV0ZTogXCJZZHljaCBjaGkgYW0gZGRpbGV14oCZciBjb2Zub2Q/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRHlsYWnigJlyIGd3ZXJ0aCBod24gZm9kIHluIHVuaWdyeXcuXCIsXG4gIGFkZENvbHVtbjogXCJZY2h3YW5lZ3UgY29sb2ZuIFwiLFxuICBhZGRSb3c6IFwiWWNod2FuZWd1IHJoZXNcIixcbiAgcmVtb3ZlUm93OiBcIlR5bm51XCIsXG4gIGFkZFBhbmVsOiBcIlljaHdhbmVndSBv4oCZciBuZXd5ZGRcIixcbiAgcmVtb3ZlUGFuZWw6IFwiVHlubnVcIixcbiAgY2hvaWNlc19JdGVtOiBcImVpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sb2ZuXCIsXG4gIG1hdHJpeF9yb3c6IFwiUmhlc1wiLFxuICBzYXZpbmdEYXRhOiBcIk1hZeKAmXIgY2FubHluaWFkYXXigJluIGNhZWwgZXUgY2FkdyBhciB5IGd3ZWlueWRkLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJSb2VkZCBnd2FsbCBhIGRvZWRkIGRpbSBtb2RkIGNhZHfigJlyIGNhbmx5bmlhZGF1LlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJXZWRpIGxsd3lkZG8gaSBnYWR34oCZciBjYW5seW5pYWRhdSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlJob3djaCBneW5uaWcgYXJhbGwgYXJuaVwiLFxuICB0aW1lck1pbjogXCJtdW5cIixcbiAgdGltZXJTZWM6IFwiZWlsXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiUnlkeWNoIGNoaSB3ZWRpIHRyZXVsaW8gezB9IGFyIHkgZHVkYWxlbiBob24gYSB7MX0gZ3lkYeKAmWkgZ2lseWRkLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJSeWR5Y2ggY2hpIHdlZGkgdHJldWxpbyB7MH0gYXIgeSBkdWRhbGVuIGhvbi5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJSeWR5Y2ggY2hpIHdlZGkgdHJldWxpbyB7MH0gZ3lkYeKAmWkgZ2lseWRkLlwiLFxuICB0aW1lckxpbWl0QWxsOiBcIlJ5ZHljaCBjaGkgd2VkaSB0cmV1bGlvIHswfSBvIHsxfSBhciB5IGR1ZGFsZW4gaG9uIGEgezJ9IG8gezN9IGd5ZGHigJlpIGdpbHlkZC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiUnlkeWNoIGNoaSB3ZWRpIHRyZXVsaW8gezB9IG8gezF9IGFyIHkgZHVkYWxlbiBob24uXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiUnlkeWNoIGNoaSB3ZWRpIHRyZXVsaW8gezB9IG8gezF9IGd5ZGHigJlpIGdpbHlkZC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkdsYW5oYXVcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkNsaXJpb1wiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJEZXdpc3djaCBmZmVpbCBcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiVHlubnXigJlyIGZmZWlsIGhvbiBcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJJYXduXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOYVwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJZZHljaCBjaGnigJluIHNpxbVyIGVpY2ggYm9kIGFtIGR5bm514oCZciBmZmVpbCBob246IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIllkeWNoIGNoaeKAmW4gc2nFtXIgZWljaCBib2QgYW0gZHlubnUgcG9iIGZmZWlsP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiVGVpdGwgeSBDd2VzdGl3biBcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiY3lcIl0gPSB3ZWxzaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJjeVwiXSA9IFwiY3ltcmFlZ1wiO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG1hdHJpeCBiYXNlIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhCYXNlTW9kZWw8VFJvdywgVENvbHVtbj4gZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIHByb3RlY3RlZCBmaWx0ZXJlZENvbHVtbnM6IEFycmF5PFRDb2x1bW4+O1xuICBwcm90ZWN0ZWQgZmlsdGVyZWRSb3dzOiBBcnJheTxJdGVtVmFsdWU+O1xuICBwcm90ZWN0ZWQgZ2VuZXJhdGVkVmlzaWJsZVJvd3M6IEFycmF5PFRSb3c+ID0gbnVsbDtcbiAgcHJvdGVjdGVkIGdlbmVyYXRlZFRvdGFsUm93OiBUUm93ID0gbnVsbDtcbiAgcHVibGljIHZpc2libGVSb3dzQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIHByb3RlY3RlZCBjcmVhdGVDb2x1bW5WYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwiY29sdW1uc1wiKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gbnVsbDtcbiAgICB0aGlzLmZpbHRlcmVkQ29sdW1ucyA9IG51bGw7XG4gICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jcmVhdGVDb2x1bW5WYWx1ZXMoKTtcbiAgICB0aGlzLnJvd3MgPSB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZXMoXCJyb3dzXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4YmFzZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDb21wb3NpdGVRdWVzdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UsIHRvIGhpZGUgdGFibGUgaGVhZGVyLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93SGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93SGVhZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0hlYWRlcih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93SGVhZGVyXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGNvbHVtbnMuIEEgY29sdW1uIGhhcyBhIHZhbHVlIGFuZCBhbiBvcHRpb25hbCB0ZXh0XG4gICAqL1xuICBnZXQgY29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uc1wiKTtcbiAgfVxuICBzZXQgY29sdW1ucyhuZXdWYWx1ZTogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbnNcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZUNvbHVtbnMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuICEhdGhpcy5maWx0ZXJlZENvbHVtbnMgPyB0aGlzLmZpbHRlcmVkQ29sdW1ucyA6IHRoaXMuY29sdW1ucztcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2Ygcm93cy4gQSByb3cgaGFzIGEgdmFsdWUgYW5kIGFuIG9wdGlvbmFsIHRleHRcbiAgICovXG4gIGdldCByb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIpO1xuICB9XG4gIHNldCByb3dzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdmFyIG5ld1Jvd3MgPSB0aGlzLnByb2Nlc3NSb3dzT25TZXQobmV3VmFsdWUpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIiwgbmV3Um93cyk7XG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG4gIHByb3RlY3RlZCBwcm9jZXNzUm93c09uU2V0KG5ld1Jvd3M6IEFycmF5PGFueT4pIHtcbiAgICByZXR1cm4gbmV3Um93cztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZVJvd3MoKTogQXJyYXk8VFJvdz4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB2aXNpYmxlIHJvd3MgYXMgbW9kZWwgb2JqZWN0cy5cbiAgICogQHNlZSByb3dzVmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVSb3dzKCk6IEFycmF5PFRSb3c+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWaXNpYmxlUm93cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIEl0IHJ1bnMgYWdhaW5zdCBlYWNoIHJvdyBpdGVtIGFuZCBpZiBmb3IgdGhpcyBpdGVtIGl0IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgaXRlbSBpcyB2aXNpYmxlIG90aGVyd2lzZSB0aGUgaXRlbSBiZWNvbWVzIGludmlzaWJsZS4gUGxlYXNlIHVzZSB7aXRlbX0gdG8gZ2V0IHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUgaW4gdGhlIGV4cHJlc3Npb24uXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd3NWaXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c1Zpc2libGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJvd3NWaXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dzVmlzaWJsZUlmXCIsIHZhbCk7XG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJdCBydW5zIGFnYWluc3QgZWFjaCBjb2x1bW4gaXRlbSBhbmQgaWYgZm9yIHRoaXMgaXRlbSBpdCByZXR1cm5zIHRydWUsIHRoZW4gdGhlIGl0ZW0gaXMgdmlzaWJsZSBvdGhlcndpc2UgdGhlIGl0ZW0gYmVjb21lcyBpbnZpc2libGUuIFBsZWFzZSB1c2Uge2l0ZW19IHRvIGdldCB0aGUgY3VycmVudCBpdGVtIHZhbHVlIGluIHRoZSBleHByZXNzaW9uLlxuICAgKiBAc2VlIHJvd3NWaXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgY29sdW1uc1Zpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5zVmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sdW1uc1Zpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbnNWaXNpYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuSXRlbXNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZmlsdGVySXRlbXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nKSB7XG4gICAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHwgIXRoaXMuZGF0YSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnJ1bkl0ZW1zQ29uZGl0aW9uKFxuICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKSxcbiAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Db2x1bW5zQ2hhbmdlZCgpIHt9XG4gIHByb3RlY3RlZCBvblJvd3NDaGFuZ2VkKCkge1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudmlzaWJsZVJvd3NDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIHByb3RlY3RlZCBzaG91bGRSdW5Db2x1bW5FeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5zdXJ2ZXkgfHwgIXRoaXMuc3VydmV5LmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZztcbiAgfVxuICBwcm90ZWN0ZWQgaGFzUm93c0FzSXRlbXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIHJ1bkl0ZW1zQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIG9sZFZpc2libGVSb3dzID0gbnVsbDtcbiAgICBpZiAoISF0aGlzLmZpbHRlcmVkUm93cyAmJiAhSGVscGVycy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpKSB7XG4gICAgICBvbGRWaXNpYmxlUm93cyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvbGRWaXNpYmxlUm93cy5wdXNoKHRoaXMuZmlsdGVyZWRSb3dzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGhhc0NoYW5nZXMgPVxuICAgICAgdGhpcy5oYXNSb3dzQXNJdGVtcygpICYmIHRoaXMucnVuQ29uZGl0aW9uc0ZvclJvd3ModmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB2YXIgaGFzQ29sdW1uc0NoYW5nZWQgPSB0aGlzLnJ1bkNvbmRpdGlvbnNGb3JDb2x1bW5zKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaGFzQ2hhbmdlcyA9IGhhc0NvbHVtbnNDaGFuZ2VkIHx8IGhhc0NoYW5nZXM7XG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgISF0aGlzLnN1cnZleSAmJlxuICAgICAgICB0aGlzLnN1cnZleS5pc0NsZWFyVmFsdWVPbkhpZGRlbiAmJlxuICAgICAgICAoISF0aGlzLmZpbHRlcmVkQ29sdW1ucyB8fCAhIXRoaXMuZmlsdGVyZWRSb3dzKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICAgIH1cbiAgICAgIGlmICghIW9sZFZpc2libGVSb3dzKSB7XG4gICAgICAgIHRoaXMucmVzdG9yZU5ld1Zpc2libGVSb3dzVmFsdWVzKG9sZFZpc2libGVSb3dzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xlYXJHZW5lcmF0ZWRSb3dzKCk7XG4gICAgICBpZiAoaGFzQ29sdW1uc0NoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5vbkNvbHVtbnNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0NoYW5nZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGNsZWFyR2VuZXJhdGVkUm93cygpIHtcbiAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDtcbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnNGb3JSb3dzKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIHNob3dJbnZpc2liaWxlID1cbiAgICAgICEhdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nO1xuICAgIHZhciBydW5uZXIgPVxuICAgICAgIXNob3dJbnZpc2liaWxlICYmICEhdGhpcy5yb3dzVmlzaWJsZUlmXG4gICAgICAgID8gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnJvd3NWaXNpYmxlSWYpXG4gICAgICAgIDogbnVsbDtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IFtdO1xuICAgIHZhciBoYXNDaGFuZ2VkID0gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICAgIHRoaXMucm93cyxcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzLFxuICAgICAgcnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgICFzaG93SW52aXNpYmlsZVxuICAgICk7XG4gICAgaWYgKHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCA9PT0gdGhpcy5yb3dzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlZDtcbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnNGb3JDb2x1bW5zKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIHVzZUNvbHVtbnNFeHByZXNzaW9uID1cbiAgICAgICEhdGhpcy5zdXJ2ZXkgJiYgIXRoaXMuc3VydmV5LmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZztcbiAgICB2YXIgcnVubmVyID1cbiAgICAgIHVzZUNvbHVtbnNFeHByZXNzaW9uICYmICEhdGhpcy5jb2x1bW5zVmlzaWJsZUlmXG4gICAgICAgID8gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLmNvbHVtbnNWaXNpYmxlSWYpXG4gICAgICAgIDogbnVsbDtcbiAgICB0aGlzLmZpbHRlcmVkQ29sdW1ucyA9IFtdO1xuICAgIHZhciBoYXNDaGFuZ2VkID0gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICAgIHRoaXMuY29sdW1ucyxcbiAgICAgIDxhbnk+dGhpcy5maWx0ZXJlZENvbHVtbnMsXG4gICAgICBydW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgdGhpcy5zaG91bGRSdW5Db2x1bW5FeHByZXNzaW9uKClcbiAgICApO1xuICAgIGlmICh0aGlzLmZpbHRlcmVkQ29sdW1ucy5sZW5ndGggPT09IHRoaXMuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDb2x1bW5zID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0NoYW5nZWQ7XG4gIH1cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbCA9IG51bGw7XG4gICAgdmFyIGlzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciByb3dzID0gISF0aGlzLmZpbHRlcmVkUm93cyA/IHRoaXMuZmlsdGVyZWRSb3dzIDogdGhpcy5yb3dzO1xuICAgIHZhciBjb2x1bW5zID0gISF0aGlzLmZpbHRlcmVkQ29sdW1ucyA/IHRoaXMuZmlsdGVyZWRDb2x1bW5zIDogdGhpcy5jb2x1bW5zO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIGlmIChcbiAgICAgICAgSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHJvd3MsIGtleSkgJiZcbiAgICAgICAgSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKGNvbHVtbnMsIHZhbFtrZXldKVxuICAgICAgKSB7XG4gICAgICAgIGlmIChuZXdWYWwgPT0gbnVsbCkgbmV3VmFsID0ge307XG4gICAgICAgICg8YW55Pm5ld1ZhbClba2V5XSA9IHZhbFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhbmdlZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbDtcbiAgICB9XG4gICAgc3VwZXIuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJJbnZpc2libGVWYWx1ZXNJblJvd3MoKSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm47XG4gICAgdmFyIG5ld0RhdGEgPSB0aGlzLmdldFVuYmluZFZhbHVlKHRoaXMudmFsdWUpO1xuICAgIHZhciByb3dzID0gdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IHJvd3NbaV0udmFsdWU7XG4gICAgICBpZiAoISFuZXdEYXRhW2tleV0gJiYgIXJvd3NbaV0uaXNWaXNpYmxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdEYXRhW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3RGF0YSwgdGhpcy52YWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLnZhbHVlID0gbmV3RGF0YTtcbiAgfVxuICBwcml2YXRlIHJlc3RvcmVOZXdWaXNpYmxlUm93c1ZhbHVlcyhvbGRWaXNpYmxlUm93czogYW55KSB7XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgdmFyIHZhbCA9IHRoaXMuZGVmYXVsdFZhbHVlO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuZ2V0VW5iaW5kVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgdmFyIGlzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIGlmIChcbiAgICAgICAgSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHJvd3MsIGtleSkgJiZcbiAgICAgICAgIUl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShvbGRWaXNpYmxlUm93cywga2V5KVxuICAgICAgKSB7XG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PSBudWxsKSBuZXdWYWx1ZSA9IHt9O1xuICAgICAgICAoPGFueT5uZXdWYWx1ZSlba2V5XSA9IHZhbFtrZXldO1xuICAgICAgICBpc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibWF0cml4YmFzZVwiLFxuICBbXG4gICAgXCJjb2x1bW5zVmlzaWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIFwicm93c1Zpc2libGVJZjpjb25kaXRpb25cIixcbiAgICB7IG5hbWU6IFwic2hvd0hlYWRlcjpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgXSxcbiAgdW5kZWZpbmVkLFxuICBcInF1ZXN0aW9uXCJcbik7XG4iLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gIElQYWdlLFxuICBJUGFuZWwsXG4gIElFbGVtZW50LFxuICBJU3VydmV5RWxlbWVudCxcbiAgSVF1ZXN0aW9uLFxufSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IERyYWdEcm9wSW5mbywgUGFuZWxNb2RlbEJhc2UsIFF1ZXN0aW9uUm93TW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuLyoqXG4gKiBUaGUgcGFnZSBvYmplY3QuIEl0IGhhcyBlbGVtZW50cyBjb2xsZWN0aW9uLCB0aGF0IGNvbnRhaW5zIHF1ZXN0aW9ucyBhbmQgcGFuZWxzLlxuICovXG5leHBvcnQgY2xhc3MgUGFnZU1vZGVsIGV4dGVuZHMgUGFuZWxNb2RlbEJhc2UgaW1wbGVtZW50cyBJUGFnZSB7XG4gIHByaXZhdGUgaGFzU2hvd25WYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubG9jVGl0bGUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICBpZiAoc2VsZi5udW0gPiAwKSByZXR1cm4gc2VsZi5udW0gKyBcIi4gXCIgKyB0ZXh0O1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibmF2aWdhdGlvblRpdGxlXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJuYXZpZ2F0aW9uRGVzY3JpcHRpb25cIiwgdGhpcywgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJwYWdlXCI7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUGFnZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2hvdyB0aXRsZSBpbiBuYXZpZ2F0aW9uIGJ1dHRvbnMuIElmIHRoZSB2YWx1ZSBpcyBlbXB0eSB0aGVuIHBhZ2UgbmFtZSBpcyB1c2VkLlxuICAgKiBAc2VlIHN1cnZleS5wcm9ncmVzc0JhclR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXQgbmF2aWdhdGlvblRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibmF2aWdhdGlvblRpdGxlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmF2aWdhdGlvblRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJuYXZpZ2F0aW9uVGl0bGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY05hdmlnYXRpb25UaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJuYXZpZ2F0aW9uVGl0bGVcIik7XG4gIH1cbiAgcHVibGljIGdldCBuYXZpZ2F0aW9uRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJuYXZpZ2F0aW9uRGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBuYXZpZ2F0aW9uRGVzY3JpcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm5hdmlnYXRpb25EZXNjcmlwdGlvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jTmF2aWdhdGlvbkRlc2NyaXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm5hdmlnYXRpb25EZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBhc3NlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFzc2VkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhc3NlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYXNzZWRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZGVsZXRlKCkge1xuICAgIGlmICghIXRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnJlbW92ZVNlbGZGcm9tTGlzdCh0aGlzLnN1cnZleS5wYWdlcyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBvbkZpcnN0UmVuZGVyaW5nKCkge1xuICAgIGlmICh0aGlzLndhc1Nob3duKSByZXR1cm47XG4gICAgc3VwZXIub25GaXJzdFJlbmRlcmluZygpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdmlzaWJsZSBpbmRleCBvZiB0aGUgcGFnZS4gSXQgaGFzIHZhbHVlcyBmcm9tIDAgdG8gdmlzaWJsZSBwYWdlIGNvdW50IC0gMS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC52aXNpYmxlUGFnZXNcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5wYWdlc1xuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUluZGV4XCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGVJbmRleCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJbmRleFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBjYW5SZW5kZXJGaXJzdFJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzRGVzaWduTW9kZSB8fCB0aGlzLnZpc2libGVJbmRleCA9PSAwO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIHRoZSBwYWdlIGlzIHN0YXJ0ZWQgcGFnZSBpbiB0aGUgc3VydmV5LiBJdCBjYW4gYmUgc2hvd24gb24gdGhlIHN0YXJ0IG9ubHkgYW5kIHRoZSBlbmQtdXNlciBjb3VsZCBub3QgY29tZWJhY2sgdG8gaXQgYWZ0ZXIgaXQgcGFzc2VkIGl0LlxuICAgKi9cbiAgcHVibGljIGdldCBpc1N0YXJ0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzUGFnZVN0YXJ0ZWQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGNhbGNDc3NDbGFzc2VzKCk6IGFueSB7XG4gICAgdmFyIGNzcyA9IHRoaXMuY3NzO1xuICAgIHZhciBjbGFzc2VzID0geyBwYWdlOiB7fSwgcGFnZVRpdGxlOiBcIlwiLCBwYWdlRGVzY3JpcHRpb246IFwiXCIsIHJvdzogXCJcIiB9O1xuICAgIHRoaXMuY29weUNzc0NsYXNzZXMoY2xhc3Nlcy5wYWdlLCBjc3MucGFnZSk7XG4gICAgaWYgKCEhY3NzLnBhZ2VUaXRsZSkge1xuICAgICAgY2xhc3Nlcy5wYWdlVGl0bGUgPSBjc3MucGFnZVRpdGxlO1xuICAgIH1cbiAgICBpZiAoISFjc3MucGFnZURlc2NyaXB0aW9uKSB7XG4gICAgICBjbGFzc2VzLnBhZ2VEZXNjcmlwdGlvbiA9IGNzcy5wYWdlRGVzY3JpcHRpb247XG4gICAgfVxuICAgIGlmICghIWNzcy5yb3cpIHtcbiAgICAgIGNsYXNzZXMucm93ID0gY3NzLnJvdztcbiAgICB9XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS51cGRhdGVQYWdlQ3NzQ2xhc3Nlcyh0aGlzLCBjbGFzc2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cbiAgZ2V0SXNQYWdlVmlzaWJsZShleGNlcHRpb25RdWVzdGlvbjogSVF1ZXN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNTdGFydGVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHN1cGVyLmdldElzUGFnZVZpc2libGUoZXhjZXB0aW9uUXVlc3Rpb24pO1xuICB9XG4gIHB1YmxpYyBnZXQgbnVtKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJudW1cIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgbnVtKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMubnVtID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm51bVwiLCB2YWwpO1xuICAgIHRoaXMub25OdW1DaGFuZ2VkKHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIFwiaGlkZVwiIHRvIG1ha2UgXCJQcmV2XCIsIFwiTmV4dFwiIGFuZCBcIkNvbXBsZXRlXCIgYnV0dG9ucyBhcmUgaW52aXNpYmxlIGZvciB0aGlzIHBhZ2UuIFNldCB0aGlzIHByb3BlcnR5IHRvIFwic2hvd1wiIHRvIG1ha2UgdGhlc2UgYnV0dG9ucyB2aXNpYmxlLCBldmVuIGlmIHN1cnZleSBzaG93TmF2aWdhdGlvbkJ1dHRvbnMgcHJvcGVydHkgaXMgZmFsc2UuXG4gICAqIEBzZWUgU3VydmV5TW9kZS5zaG93TmF2aWdhdGlvbkJ1dHRvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgbmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eVwiLCB2YWwudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSByZXR1cm5zIHRydWUsIGlmIHRoZSBwYWdlIGhhcyBiZWVuIHNob3duIHRvIHRoZSBlbmQtdXNlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgd2FzU2hvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzU2hvd25WYWx1ZTtcbiAgfVxuICBnZXQgaGFzU2hvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMud2FzU2hvd247XG4gIH1cbiAgcHVibGljIHNldFdhc1Nob3duKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh2YWwgPT0gdGhpcy5oYXNTaG93blZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5oYXNTaG93blZhbHVlID0gdmFsO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIGlmICh2YWwgPT0gdHJ1ZSAmJiB0aGlzLmFyZVF1ZXN0aW9uc1JhbmRvbWl6ZWQpIHtcbiAgICAgIHRoaXMucmFuZG9taXplRWxlbWVudHMoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc1JhbmRvbWl6aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgcmFuZG9taXplRWxlbWVudHMoKSB7XG4gICAgaWYgKHRoaXMuaXNSYW5kb21pemluZykgcmV0dXJuO1xuICAgIHRoaXMuaXNSYW5kb21pemluZyA9IHRydWU7XG4gICAgdmFyIG9sZEVsZW1lbnRzID0gW107XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvbGRFbGVtZW50cy5wdXNoKGVsZW1lbnRzW2ldKTtcbiAgICB9XG4gICAgdmFyIG5ld0VsZW1lbnRzID0gSGVscGVycy5yYW5kb21pemVBcnJheTxJRWxlbWVudD4ob2xkRWxlbWVudHMpO1xuICAgIHRoaXMuZWxlbWVudHMuc3BsaWNlKDAsIHRoaXMuZWxlbWVudHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLnB1c2gobmV3RWxlbWVudHNbaV0pO1xuICAgIH1cbiAgICB0aGlzLmlzUmFuZG9taXppbmcgPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdHJ1ZSwgaWYgdGhlIGVsZW1lbnRzIGFyZSByYW5kb21pemVkIG9uIHRoZSBwYWdlXG4gICAqIEBzZWUgaGFzU2hvd25cbiAgICogQHNlZSBxdWVzdGlvbnNPcmRlclxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uc09yZGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFyZVF1ZXN0aW9uc1JhbmRvbWl6ZWQoKTogYm9vbGVhbiB7XG4gICAgdmFyIG9yZGVyID1cbiAgICAgIHRoaXMucXVlc3Rpb25zT3JkZXIgPT0gXCJkZWZhdWx0XCIgJiYgdGhpcy5zdXJ2ZXlcbiAgICAgICAgPyB0aGlzLnN1cnZleS5xdWVzdGlvbnNPcmRlclxuICAgICAgICA6IHRoaXMucXVlc3Rpb25zT3JkZXI7XG4gICAgcmV0dXJuIG9yZGVyID09IFwicmFuZG9tXCI7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHJhbmRvbWl6ZSBxdWVzdGlvbnMuIFNldCBpdCB0byAncmFuZG9tJyB0byByYW5kb21pemUgcXVlc3Rpb25zLCAnaW5pdGlhbCcgdG8ga2VlcCB0aGVtIGluIHRoZSBzYW1lIG9yZGVyIG9yICdkZWZhdWx0JyB0byB1c2UgdGhlIFN1cnZleSBxdWVzdGlvbnNPcmRlciBwcm9wZXJ0eVxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uc09yZGVyXG4gICAqIEBzZWUgYXJlUXVlc3Rpb25zUmFuZG9taXplZFxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvbnNPcmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT3JkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbnNPcmRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uc09yZGVyXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gc2Nyb2xsIHRvIHRoZSBwYWdlIHRvcC5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxUb1RvcCgpIHtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkuc2Nyb2xsRWxlbWVudFRvVG9wKHRoaXMsIG51bGwsIHRoaXMsIHRoaXMuaWQpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGltZSBpbiBzZWNvbmRzIGVuZC11c2VyIHNwZW50IG9uIHRoaXMgcGFnZVxuICAgKi9cbiAgcHVibGljIHRpbWVTcGVudCA9IDA7XG4gIC8vIHB1YmxpYyBnZXQgdGltZVNwZW50KCk6IG51bWJlciB7XG4gIC8vICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRpbWVTcGVudFwiLCAwKTtcbiAgLy8gfVxuICAvLyBwdWJsaWMgc2V0IHRpbWVTcGVudCh2YWw6IG51bWJlcikge1xuICAvLyAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRpbWVTcGVudFwiLCB2YWwpO1xuICAvLyB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBwYW5lbHMgaW4gdGhlIHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRQYW5lbHMoXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8SVBhbmVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUGFuZWw+KCk7XG4gICAgdGhpcy5hZGRQYW5lbHNJbnRvTGlzdChyZXN1bHQsIHZpc2libGVPbmx5LCBpbmNsdWRpbmdEZXNpZ25UaW1lKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIGluIHNlY29uZHMgdGhhdCBlbmQtdXNlciBoYXMgdG8gY29tcGxldGUgdGhlIHBhZ2UuIElmIHRoZSB2YWx1ZSBpcyAwIG9yIGxlc3MsIHRoZSBlbmQtdXNlciBoYXMgdW5saW1pdGVkIG51bWJlciBvZiB0aW1lIHRvIGZpbmlzaCB0aGUgcGFnZS5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubWF4VGltZVRvRmluaXNoUGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBtYXhUaW1lVG9GaW5pc2goKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VGltZVRvRmluaXNoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTnVtQ2hhbmdlZCh2YWx1ZTogbnVtYmVyKSB7fVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc1JhbmRvbWl6aW5nKSByZXR1cm47XG4gICAgc3VwZXIub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLnN1cnZleSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnN1cnZleS5wYWdlVmlzaWJpbGl0eUNoYW5nZWQodGhpcywgdGhpcy5pc1Zpc2libGUpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvO1xuICBwdWJsaWMgZHJhZ0Ryb3BTdGFydChcbiAgICBzcmM6IElFbGVtZW50LFxuICAgIHRhcmdldDogSUVsZW1lbnQsXG4gICAgbmVzdGVkUGFuZWxEZXB0aDogbnVtYmVyID0gLTFcbiAgKSB7XG4gICAgdGhpcy5kcmFnRHJvcEluZm8gPSBuZXcgRHJhZ0Ryb3BJbmZvKHNyYywgdGFyZ2V0LCBuZXN0ZWRQYW5lbERlcHRoKTtcbiAgfVxuICBwdWJsaWMgZHJhZ0Ryb3BNb3ZlVG8oXG4gICAgZGVzdGluYXRpb246IElTdXJ2ZXlFbGVtZW50LFxuICAgIGlzQm90dG9tOiBib29sZWFuID0gZmFsc2UsXG4gICAgaXNFZGdlOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmRyYWdEcm9wSW5mbykgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgdGhpcy5kcmFnRHJvcEluZm8uaXNCb3R0b20gPSBpc0JvdHRvbTtcbiAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0VkZ2UgPSBpc0VkZ2U7XG4gICAgdGhpcy5jb3JyZWN0RHJhZ0Ryb3BJbmZvKHRoaXMuZHJhZ0Ryb3BJbmZvKTtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BDYW5Ecm9wVGFnZXJ0KCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BDYW5Ecm9wU291cmNlKCkgfHwgIXRoaXMuZHJhZ0Ryb3BBbGxvd0Zyb21TdXJ2ZXkoKSkge1xuICAgICAgaWYgKCEhdGhpcy5kcmFnRHJvcEluZm8uc291cmNlKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLmRyYWdEcm9wRmluZFJvdyh0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyh0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQsIHJvdyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXQodGhpcy5kcmFnRHJvcEluZm8pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgY29ycmVjdERyYWdEcm9wSW5mbyhkcmFnRHJvcEluZm86IERyYWdEcm9wSW5mbykge1xuICAgIGlmICghZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uKSByZXR1cm47XG4gICAgdmFyIHBhbmVsID0gKDxJRWxlbWVudD5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24pLmlzUGFuZWxcbiAgICAgID8gPElQYW5lbD4oPGFueT5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24pXG4gICAgICA6IG51bGw7XG4gICAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgICFkcmFnRHJvcEluZm8udGFyZ2V0LmlzTGF5b3V0VHlwZVN1cHBvcnRlZChwYW5lbC5nZXRDaGlsZHJlbkxheW91dFR5cGUoKSlcbiAgICApIHtcbiAgICAgIGRyYWdEcm9wSW5mby5pc0VkZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWxsb3dGcm9tU3VydmV5KCk6IGJvb2xlYW4ge1xuICAgIHZhciBkZXN0ID0gdGhpcy5kcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgaWYgKCFkZXN0IHx8ICF0aGlzLnN1cnZleSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIGluc2VydEJlZm9yZTogSUVsZW1lbnQgPSBudWxsO1xuICAgIHZhciBpbnNlcnRBZnRlcjogSUVsZW1lbnQgPSBudWxsO1xuICAgIHZhciBwYXJlbnQgPVxuICAgICAgZGVzdC5pc1BhZ2UgfHwgKCF0aGlzLmRyYWdEcm9wSW5mby5pc0VkZ2UgJiYgKDxJRWxlbWVudD5kZXN0KS5pc1BhbmVsKVxuICAgICAgICA/IGRlc3RcbiAgICAgICAgOiAoPElFbGVtZW50PmRlc3QpLnBhcmVudDtcbiAgICBpZiAoIWRlc3QuaXNQYWdlKSB7XG4gICAgICB2YXIgY29udGFpbmVyID0gKDxJRWxlbWVudD5kZXN0KS5wYXJlbnQ7XG4gICAgICBpZiAoISFjb250YWluZXIpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gKDxQYW5lbE1vZGVsQmFzZT5jb250YWluZXIpLmVsZW1lbnRzO1xuICAgICAgICB2YXIgaW5kZXggPSBlbGVtZW50cy5pbmRleE9mKDxJRWxlbWVudD5kZXN0KTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICBpbnNlcnRCZWZvcmUgPSA8SUVsZW1lbnQ+ZGVzdDtcbiAgICAgICAgICBpbnNlcnRBZnRlciA9IDxJRWxlbWVudD5kZXN0O1xuICAgICAgICAgIGlmICh0aGlzLmRyYWdEcm9wSW5mby5pc0JvdHRvbSkge1xuICAgICAgICAgICAgaW5zZXJ0QmVmb3JlID1cbiAgICAgICAgICAgICAgaW5kZXggPCBlbGVtZW50cy5sZW5ndGggLSAxID8gZWxlbWVudHNbaW5kZXggKyAxXSA6IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluc2VydEFmdGVyID0gaW5kZXggPiAwID8gZWxlbWVudHNbaW5kZXggLSAxXSA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgdGFyZ2V0OiB0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQsXG4gICAgICBzb3VyY2U6IHRoaXMuZHJhZ0Ryb3BJbmZvLnNvdXJjZSxcbiAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgaW5zZXJ0QWZ0ZXI6IGluc2VydEFmdGVyLFxuICAgICAgaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkuZHJhZ0FuZERyb3BBbGxvdyhvcHRpb25zKTtcbiAgfVxuICBwdWJsaWMgZHJhZ0Ryb3BGaW5pc2goaXNDYW5jZWw6IGJvb2xlYW4gPSBmYWxzZSk6IElFbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BJbmZvKSByZXR1cm47XG4gICAgdmFyIHRhcmdldCA9IHRoaXMuZHJhZ0Ryb3BJbmZvLnRhcmdldDtcbiAgICB2YXIgcm93ID0gdGhpcy5kcmFnRHJvcEZpbmRSb3codGFyZ2V0KTtcbiAgICB2YXIgdGFyZ2V0SW5kZXggPSB0aGlzLmRyYWdEcm9wR2V0RWxlbWVudEluZGV4KHRhcmdldCwgcm93KTtcbiAgICB0aGlzLnVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyh0YXJnZXQsIHJvdyk7XG4gICAgaWYgKCFpc0NhbmNlbCAmJiAhIXJvdykge1xuICAgICAgdmFyIHNyYyA9IHRoaXMuZHJhZ0Ryb3BJbmZvLnNvdXJjZTtcbiAgICAgIHZhciBpc1NhbWVQYW5lbCA9IGZhbHNlO1xuICAgICAgaWYgKCEhc3JjICYmICEhc3JjLnBhcmVudCkge1xuICAgICAgICBpc1NhbWVQYW5lbCA9IHJvdy5wYW5lbCA9PSBzcmMucGFyZW50O1xuICAgICAgICBpZiAoaXNTYW1lUGFuZWwpIHtcbiAgICAgICAgICByb3cucGFuZWwuZHJhZ0Ryb3BNb3ZlRWxlbWVudChzcmMsIHRhcmdldCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIHRhcmdldEluZGV4ID0gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3JjLnBhcmVudC5yZW1vdmVFbGVtZW50KHNyYyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXRJbmRleCA+IC0xKSB7XG4gICAgICAgIHJvdy5wYW5lbC5hZGRFbGVtZW50KHRhcmdldCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRyYWdEcm9wSW5mbyA9IG51bGw7XG4gICAgcmV0dXJuICFpc0NhbmNlbCA/IHRhcmdldCA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcEdldEVsZW1lbnRJbmRleChcbiAgICB0YXJnZXQ6IElFbGVtZW50LFxuICAgIHJvdzogUXVlc3Rpb25Sb3dNb2RlbFxuICApOiBudW1iZXIge1xuICAgIGlmICghcm93KSByZXR1cm4gLTE7XG4gICAgdmFyIGluZGV4ID0gcm93LmVsZW1lbnRzLmluZGV4T2YodGFyZ2V0KTtcbiAgICBpZiAocm93LmluZGV4ID09IDApIHJldHVybiBpbmRleDtcbiAgICB2YXIgcHJldlJvdyA9IHJvdy5wYW5lbC5yb3dzW3Jvdy5pbmRleCAtIDFdO1xuICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZSb3cuZWxlbWVudHNbcHJldlJvdy5lbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gaW5kZXggKyByb3cucGFuZWwuZWxlbWVudHMuaW5kZXhPZihwcmV2RWxlbWVudCkgKyAxO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BDYW5Ecm9wVGFnZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uO1xuICAgIGlmICghZGVzdGluYXRpb24gfHwgZGVzdGluYXRpb24uaXNQYWdlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5kcmFnRHJvcENhbkRyb3BDb3JlKFxuICAgICAgdGhpcy5kcmFnRHJvcEluZm8udGFyZ2V0LFxuICAgICAgPElFbGVtZW50PmRlc3RpbmF0aW9uXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQ2FuRHJvcFNvdXJjZSgpOiBib29sZWFuIHtcbiAgICB2YXIgc291cmNlID0gdGhpcy5kcmFnRHJvcEluZm8uc291cmNlO1xuICAgIGlmICghc291cmNlKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgZGVzdGluYXRpb24gPSA8SUVsZW1lbnQ+dGhpcy5kcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgaWYgKCF0aGlzLmRyYWdEcm9wQ2FuRHJvcENvcmUoc291cmNlLCBkZXN0aW5hdGlvbikpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kcmFnRHJvcENhbkRyb3BOb3ROZXh0KFxuICAgICAgc291cmNlLFxuICAgICAgZGVzdGluYXRpb24sXG4gICAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0VkZ2UsXG4gICAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0JvdHRvbVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcENhbkRyb3BDb3JlKFxuICAgIHRhcmdldDogSUVsZW1lbnQsXG4gICAgZGVzdGluYXRpb246IElFbGVtZW50XG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghZGVzdGluYXRpb24pIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmRyYWdEcm9wSXNTYW1lRWxlbWVudChkZXN0aW5hdGlvbiwgdGFyZ2V0KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0YXJnZXQuaXNQYW5lbCkge1xuICAgICAgdmFyIHBubCA9IDxQYW5lbE1vZGVsQmFzZT4oPGFueT50YXJnZXQpO1xuICAgICAgaWYgKFxuICAgICAgICBwbmwuY29udGFpbnNFbGVtZW50KGRlc3RpbmF0aW9uKSB8fFxuICAgICAgICAhIXBubC5nZXRFbGVtZW50QnlOYW1lKGRlc3RpbmF0aW9uLm5hbWUpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcENhbkRyb3BOb3ROZXh0KFxuICAgIHNvdXJjZTogSUVsZW1lbnQsXG4gICAgZGVzdGluYXRpb246IElFbGVtZW50LFxuICAgIGlzRWRnZTogYm9vbGVhbixcbiAgICBpc0JvdHRvbTogYm9vbGVhblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWRlc3RpbmF0aW9uIHx8IChkZXN0aW5hdGlvbi5pc1BhbmVsICYmICFpc0VkZ2UpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIHNvdXJjZS5wYXJlbnQgPT09IFwidW5kZWZpbmVkXCIgfHwgc291cmNlLnBhcmVudCAhPT0gZGVzdGluYXRpb24ucGFyZW50KSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgcG5sID0gPFBhbmVsTW9kZWxCYXNlPnNvdXJjZS5wYXJlbnQ7XG4gICAgdmFyIHNyY0luZGV4ID0gcG5sLmVsZW1lbnRzLmluZGV4T2Yoc291cmNlKTtcbiAgICB2YXIgZGVzdEluZGV4ID0gcG5sLmVsZW1lbnRzLmluZGV4T2YoZGVzdGluYXRpb24pO1xuICAgIGlmIChkZXN0SW5kZXggPCBzcmNJbmRleCAmJiAhaXNCb3R0b20pIGRlc3RJbmRleC0tO1xuICAgIGlmIChpc0JvdHRvbSkgZGVzdEluZGV4Kys7XG4gICAgcmV0dXJuIHNyY0luZGV4IDwgZGVzdEluZGV4XG4gICAgICA/IGRlc3RJbmRleCAtIHNyY0luZGV4ID4gMVxuICAgICAgOiBzcmNJbmRleCAtIGRlc3RJbmRleCA+IDA7XG4gIH1cblxuICBwcml2YXRlIGRyYWdEcm9wSXNTYW1lRWxlbWVudChlbDE6IElFbGVtZW50LCBlbDI6IElFbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsMSA9PSBlbDIgfHwgZWwxLm5hbWUgPT0gZWwyLm5hbWU7XG4gIH1cbiAgcHVibGljIGVuc3VyZVJvd3NWaXNpYmlsaXR5KCkge1xuICAgIHN1cGVyLmVuc3VyZVJvd3NWaXNpYmlsaXR5KCk7XG4gICAgdGhpcy5nZXRQYW5lbHMoKS5mb3JFYWNoKChwYW5lbCkgPT4gcGFuZWwuZW5zdXJlUm93c1Zpc2liaWxpdHkoKSk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJwYWdlXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcIm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eVwiLFxuICAgICAgZGVmYXVsdDogXCJpbmhlcml0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbmhlcml0XCIsIFwic2hvd1wiLCBcImhpZGVcIl0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInF1ZXN0aW9uc09yZGVyXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJpbml0aWFsXCIsIFwicmFuZG9tXCJdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcIm1heFRpbWVUb0ZpbmlzaDpudW1iZXJcIiwgZGVmYXVsdDogMCwgbWluVmFsdWU6IDAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm5hdmlnYXRpb25UaXRsZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gISFvYmouc3VydmV5ICYmIG9iai5zdXJ2ZXkucHJvZ3Jlc3NCYXJUeXBlID09PSBcImJ1dHRvbnNcIjtcbiAgICAgIH0sXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTmF2aWdhdGlvblRpdGxlXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm5hdmlnYXRpb25EZXNjcmlwdGlvblwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gISFvYmouc3VydmV5ICYmIG9iai5zdXJ2ZXkucHJvZ3Jlc3NCYXJUeXBlID09PSBcImJ1dHRvbnNcIjtcbiAgICAgIH0sXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTmF2aWdhdGlvbkRlc2NyaXB0aW9uXCIsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidGl0bGU6dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGl0bGVcIiB9LFxuICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvbjp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NEZXNjcmlwdGlvblwiIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUGFnZU1vZGVsKCk7XG4gIH0sXG4gIFwicGFuZWxiYXNlXCJcbik7XG4iLCJpbXBvcnQgeyBTZXJpYWxpemVyLCBwcm9wZXJ0eSB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQge1xuICBJU3VydmV5SW1wbCxcbiAgSVBhZ2UsXG4gIElQYW5lbCxcbiAgSUNvbmRpdGlvblJ1bm5lcixcbiAgSUVsZW1lbnQsXG4gIElTdXJ2ZXlFbGVtZW50LFxuICBJUXVlc3Rpb24sXG4gIElTdXJ2ZXlFcnJvck93bmVyLFxuICBJVGl0bGVPd25lcixcbiAgSVByb2dyZXNzSW5mbyxcbiAgSVN1cnZleSxcbiAgSUZpbmRFbGVtZW50LFxufSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnQgfSBmcm9tIFwiLi9zdXJ2ZXktZWxlbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnksIFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IE9uZUFuc3dlclJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgUGFnZU1vZGVsIH0gZnJvbSBcIi4vcGFnZVwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgZmluZFNjcm9sbGFibGVQYXJlbnQsIGlzRWxlbWVudFZpc2libGUgfSBmcm9tIFwiLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9zdXJ2ZXktZXJyb3JcIjtcblxuZXhwb3J0IGNsYXNzIERyYWdEcm9wSW5mbyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzb3VyY2U6IElFbGVtZW50LFxuICAgIHB1YmxpYyB0YXJnZXQ6IElFbGVtZW50LFxuICAgIHB1YmxpYyBuZXN0ZWRQYW5lbERlcHRoOiBudW1iZXIgPSAtMVxuICApIHt9XG4gIHB1YmxpYyBkZXN0aW5hdGlvbjogSVN1cnZleUVsZW1lbnQ7XG4gIHB1YmxpYyBpc0JvdHRvbTogYm9vbGVhbjtcbiAgcHVibGljIGlzRWRnZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUm93TW9kZWwgZXh0ZW5kcyBCYXNlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcm93Q291bnRlciA9IDEwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Um93SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJwcl9cIiArIFF1ZXN0aW9uUm93TW9kZWwucm93Q291bnRlcisrO1xuICB9XG4gIHByb3RlY3RlZCBfc2Nyb2xsYWJsZVBhcmVudDogYW55ID0gdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgX3VwZGF0ZVZpc2liaWxpdHk6IGFueSA9IHVuZGVmaW5lZDtcbiAgcHVibGljIHN0YXJ0TGF6eVJlbmRlcmluZyhcbiAgICByb3dDb250YWluZXJEaXY6IEhUTUxFbGVtZW50LFxuICAgIGZpbmRTY3JvbGxhYmxlQ29udGFpbmVyID0gZmluZFNjcm9sbGFibGVQYXJlbnRcbiAgKSB7XG4gICAgdGhpcy5fc2Nyb2xsYWJsZVBhcmVudCA9IGZpbmRTY3JvbGxhYmxlQ29udGFpbmVyKHJvd0NvbnRhaW5lckRpdik7XG4gICAgdGhpcy5pc05lZWRSZW5kZXIgPSAhKFxuICAgICAgdGhpcy5fc2Nyb2xsYWJsZVBhcmVudC5zY3JvbGxIZWlnaHQgPiB0aGlzLl9zY3JvbGxhYmxlUGFyZW50LmNsaWVudEhlaWdodFxuICAgICk7XG4gICAgLy8gaWYgIHRoaXMuX3Njcm9sbGFibGVQYXJlbnQgaXMgaHRtbCB0aGUgc2Nyb2xsIGV2ZW50IGlzbid0IGZpcmVkLCBzbyB3ZSBzaG91bGQgdXNlIHdpbmRvd1xuICAgIGlmICh0aGlzLl9zY3JvbGxhYmxlUGFyZW50ID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3Njcm9sbGFibGVQYXJlbnQgPSB3aW5kb3c7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc05lZWRSZW5kZXIpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVZpc2liaWxpdHkgPSAoKSA9PiB7XG4gICAgICAgIHZhciBpc1Jvd0NvbnRhaW5lckRpdlZpc2libGUgPSBpc0VsZW1lbnRWaXNpYmxlKHJvd0NvbnRhaW5lckRpdiwgNTApO1xuICAgICAgICBpZiAoIXRoaXMuaXNOZWVkUmVuZGVyICYmIGlzUm93Q29udGFpbmVyRGl2VmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMuaXNOZWVkUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnN0b3BMYXp5UmVuZGVyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICEhdGhpcy5fc2Nyb2xsYWJsZVBhcmVudCAmJlxuICAgICAgICAgICEhdGhpcy5fc2Nyb2xsYWJsZVBhcmVudC5hZGRFdmVudExpc3RlbmVyXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuX3Njcm9sbGFibGVQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwic2Nyb2xsXCIsXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVWaXNpYmlsaXR5XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuc3VyZVZpc2liaWxpdHkoKTtcbiAgICAgIH0sIDEwKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGVuc3VyZVZpc2liaWxpdHkoKSB7XG4gICAgaWYgKCEhdGhpcy5fdXBkYXRlVmlzaWJpbGl0eSkge1xuICAgICAgdGhpcy5fdXBkYXRlVmlzaWJpbGl0eSgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RvcExhenlSZW5kZXJpbmcoKSB7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLl9zY3JvbGxhYmxlUGFyZW50ICYmXG4gICAgICAhIXRoaXMuX3VwZGF0ZVZpc2liaWxpdHkgJiZcbiAgICAgICEhdGhpcy5fc2Nyb2xsYWJsZVBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyXG4gICAgKSB7XG4gICAgICB0aGlzLl9zY3JvbGxhYmxlUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFwic2Nyb2xsXCIsXG4gICAgICAgIHRoaXMuX3VwZGF0ZVZpc2liaWxpdHlcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX3Njcm9sbGFibGVQYXJlbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdXBkYXRlVmlzaWJpbGl0eSA9IHVuZGVmaW5lZDtcbiAgfVxuICBwcml2YXRlIGlkVmFsdWU6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHVibGljIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5pZFZhbHVlID0gUXVlc3Rpb25Sb3dNb2RlbC5nZXRSb3dJZCgpO1xuICAgIHRoaXMudmlzaWJsZSA9IHBhbmVsLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZztcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwiZWxlbWVudHNcIik7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInZpc2libGVFbGVtZW50c1wiKTtcbiAgfVxuICBwcml2YXRlIGlzTGF6eVJlbmRlcmluZ1ZhbHVlOiBib29sZWFuO1xuICBwdWJsaWMgc2V0SXNMYXp5UmVuZGVyaW5nKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNMYXp5UmVuZGVyaW5nVmFsdWUgPSB2YWw7XG4gICAgdGhpcy5pc05lZWRSZW5kZXIgPSAhdmFsO1xuICB9XG4gIHB1YmxpYyBpc0xhenlSZW5kZXJpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMYXp5UmVuZGVyaW5nVmFsdWUgPT09IHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBlbGVtZW50cygpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlbGVtZW50c1wiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGVFbGVtZW50cygpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlRWxlbWVudHNcIik7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc05lZWRSZW5kZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzbmVlZHJlbmRlclwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzTmVlZFJlbmRlcih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc25lZWRyZW5kZXJcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlVmlzaWJsZSgpIHtcbiAgICB0aGlzLnZpc2libGUgPSB0aGlzLmNhbGNWaXNpYmxlKCk7XG4gICAgdGhpcy5zZXRXaWR0aCgpO1xuICB9XG4gIHB1YmxpYyBhZGRFbGVtZW50KHE6IElFbGVtZW50KSB7XG4gICAgdGhpcy5lbGVtZW50cy5wdXNoKHEpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbC5yb3dzLmluZGV4T2YodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRXaWR0aCgpIHtcbiAgICB2YXIgdmlzQ291bnQgPSB0aGlzLnZpc2libGVFbGVtZW50cy5sZW5ndGg7XG4gICAgaWYgKHZpc0NvdW50ID09IDApIHJldHVybjtcbiAgICB2YXIgY291bnRlciA9IDA7XG4gICAgdmFyIHByZVNldFdpZHRoRWxlbWVudHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICB0aGlzLnNldEVsZW1lbnRNYXhNaW5XaWR0aChlbCk7XG5cbiAgICAgIGlmIChlbC5pc1Zpc2libGUpIHtcbiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy5nZXRFbGVtZW50V2lkdGgoZWwpO1xuICAgICAgICBpZiAoISF3aWR0aCkge1xuICAgICAgICAgIGVsLnJlbmRlcldpZHRoID0gdGhpcy5nZXRSZW5kZXJlZFdpZHRoRnJvbVdpZHRoKHdpZHRoKTtcbiAgICAgICAgICBwcmVTZXRXaWR0aEVsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsLnJpZ2h0SW5kZW50ID0gY291bnRlciA8IHZpc0NvdW50IC0gMSA/IDEgOiAwO1xuICAgICAgICBjb3VudGVyKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbC5yZW5kZXJXaWR0aCA9IFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gdGhpcy5lbGVtZW50c1tpXTtcbiAgICAgIGlmICghZWwuaXNWaXNpYmxlIHx8IHByZVNldFdpZHRoRWxlbWVudHMuaW5kZXhPZihlbCkgPiAtMSkgY29udGludWU7XG4gICAgICBpZiAocHJlU2V0V2lkdGhFbGVtZW50cy5sZW5ndGggPT0gMCkge1xuICAgICAgICBlbC5yZW5kZXJXaWR0aCA9ICgxMDAgLyB2aXNDb3VudCkudG9GaXhlZCg2KSArIFwiJVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwucmVuZGVyV2lkdGggPSB0aGlzLmdldFJlbmRlcmVkQ2FsY1dpZHRoKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHByZVNldFdpZHRoRWxlbWVudHMsXG4gICAgICAgICAgdmlzQ291bnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIHNldEVsZW1lbnRNYXhNaW5XaWR0aChlbDogSUVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBlbC53aWR0aCAmJlxuICAgICAgdHlwZW9mIGVsLndpZHRoID09PSBcInN0cmluZ1wiICYmXG4gICAgICBlbC53aWR0aC5pbmRleE9mKFwiJVwiKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIGVsLm1pbldpZHRoID0gZWwud2lkdGg7XG4gICAgICBlbC5tYXhXaWR0aCA9IGVsLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVuZGVyZWRDYWxjV2lkdGgoXG4gICAgZWw6IElFbGVtZW50LFxuICAgIHByZVNldFdpZHRoRWxlbWVudHM6IEFycmF5PElFbGVtZW50PixcbiAgICB2aXNDb3VudDogbnVtYmVyXG4gICk6IHN0cmluZyB7XG4gICAgdmFyIGV4cHJlc3Npb24gPSBcIjEwMCVcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZVNldFdpZHRoRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4cHJlc3Npb24gKz0gXCIgLSBcIiArIHByZVNldFdpZHRoRWxlbWVudHNbaV0ucmVuZGVyV2lkdGg7XG4gICAgfVxuICAgIHZhciBjYWxjV2lkdGhFbCA9IHZpc0NvdW50IC0gcHJlU2V0V2lkdGhFbGVtZW50cy5sZW5ndGg7XG4gICAgaWYgKGNhbGNXaWR0aEVsID4gMSkge1xuICAgICAgZXhwcmVzc2lvbiA9IFwiKFwiICsgZXhwcmVzc2lvbiArIFwiKS9cIiArIGNhbGNXaWR0aEVsLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBcImNhbGMoXCIgKyBleHByZXNzaW9uICsgXCIpXCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXRFbGVtZW50V2lkdGgoZWw6IElFbGVtZW50KTogc3RyaW5nIHtcbiAgICB2YXIgd2lkdGggPSBlbC53aWR0aDtcbiAgICBpZiAoIXdpZHRoIHx8IHR5cGVvZiB3aWR0aCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHdpZHRoLnRyaW0oKTtcbiAgfVxuICBwcml2YXRlIGdldFJlbmRlcmVkV2lkdGhGcm9tV2lkdGgod2lkdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNOdW1iZXIod2lkdGgpID8gd2lkdGggKyBcInB4XCIgOiB3aWR0aDtcbiAgfVxuICBwcml2YXRlIGNhbGNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHZhciB2aXNFbGVtZW50czogQXJyYXk8SUVsZW1lbnQ+ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5pc1Zpc2libGUpIHtcbiAgICAgICAgdmlzRWxlbWVudHMucHVzaCh0aGlzLmVsZW1lbnRzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMubmVlZFRvVXBkYXRlVmlzaWJsZUVsZW1lbnRzKHZpc0VsZW1lbnRzKSkge1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUVsZW1lbnRzXCIsIHZpc0VsZW1lbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc0VsZW1lbnRzLmxlbmd0aCA+IDA7XG4gIH1cbiAgcHJpdmF0ZSBuZWVkVG9VcGRhdGVWaXNpYmxlRWxlbWVudHModmlzRWxlbWVudHM6IEFycmF5PElFbGVtZW50Pik6IGJvb2xlYW4ge1xuICAgIGlmICh2aXNFbGVtZW50cy5sZW5ndGggIT09IHRoaXMudmlzaWJsZUVsZW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZpc0VsZW1lbnRzW2ldICE9PSB0aGlzLnZpc2libGVFbGVtZW50c1tpXSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgdGhpcy5zdG9wTGF6eVJlbmRlcmluZygpO1xuICB9XG59XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciBhIFBhbmVsIGFuZCBQYWdlIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYW5lbE1vZGVsQmFzZSBleHRlbmRzIFN1cnZleUVsZW1lbnRcbiAgaW1wbGVtZW50cyBJUGFuZWwsIElDb25kaXRpb25SdW5uZXIsIElMb2NhbGl6YWJsZU93bmVyLCBJU3VydmV5RXJyb3JPd25lciB7XG4gIHByaXZhdGUgc3RhdGljIHBhbmVsQ291bnRlciA9IDEwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UGFuZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNwX1wiICsgUGFuZWxNb2RlbEJhc2UucGFuZWxDb3VudGVyKys7XG4gIH1cblxuICBwcml2YXRlIGVsZW1lbnRzVmFsdWU6IEFycmF5PElFbGVtZW50PjtcbiAgcHJpdmF0ZSBpc1F1ZXN0aW9uc1JlYWR5OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcXVlc3Rpb25zVmFsdWU6IEFycmF5PFF1ZXN0aW9uPiA9IG5ldyBBcnJheTxRdWVzdGlvbj4oKTtcbiAgYWRkRWxlbWVudENhbGxiYWNrOiAoZWxlbWVudDogSUVsZW1lbnQpID0+IHZvaWQ7XG4gIHJlbW92ZUVsZW1lbnRDYWxsYmFjazogKGVsZW1lbnQ6IElFbGVtZW50KSA9PiB2b2lkO1xuICBvbkdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbjogKCkgPT4gc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicm93c1wiKTtcbiAgICB0aGlzLmVsZW1lbnRzVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld0FycmF5KFxuICAgICAgXCJlbGVtZW50c1wiLFxuICAgICAgdGhpcy5vbkFkZEVsZW1lbnQuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMub25SZW1vdmVFbGVtZW50LmJpbmQodGhpcylcbiAgICApO1xuICAgIHRoaXMuaWQgPSBQYW5lbE1vZGVsQmFzZS5nZXRQYW5lbElkKCk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJkZXNjcmlwdGlvblwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicmVxdWlyZWRFcnJvclRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCAoKSA9PiB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMudXBkYXRlRWxlbWVudENzcyh0cnVlKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJxdWVzdGlvblN0YXJ0SW5kZXhcIiwgXCJzaG93UXVlc3Rpb25OdW1iZXJzXCJdLFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhbmVsYmFzZVwiO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIH1cbiAgfVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdGhpcy5tYXJrUXVlc3Rpb25MaXN0RGlydHkoKTtcbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogUGFuZWxNb2RlbCBvciBQYWdlTW9kZWwgdGl0bGUgcHJvcGVydHkuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIpO1xuICB9XG4gIGdldCBfc2hvd1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAoKDxhbnk+dGhpcy5zdXJ2ZXkpLnNob3dQYWdlVGl0bGVzICYmIHRoaXMudGl0bGUubGVuZ3RoID4gMCkgfHxcbiAgICAgICh0aGlzLmlzRGVzaWduTW9kZSAmJiBzZXR0aW5ncy5hbGxvd1Nob3dFbXB0eVRpdGxlSW5EZXNpZ25Nb2RlKVxuICAgICk7XG4gIH1cblxuICBnZXQgX3Nob3dEZXNjcmlwdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKCg8YW55PnRoaXMuc3VydmV5KS5zaG93UGFnZVRpdGxlcyAmJiB0aGlzLmRlc2NyaXB0aW9uLmxlbmd0aCA+IDApIHx8XG4gICAgICAodGhpcy5pc0Rlc2lnbk1vZGUgJiZcbiAgICAgICAgc2V0dGluZ3MuYWxsb3dTaG93RW1wdHlUaXRsZUluRGVzaWduTW9kZSAmJlxuICAgICAgICBzZXR0aW5ncy5hbGxvd1Nob3dFbXB0eURlc2NyaXB0aW9uSW5EZXNpZ25Nb2RlKVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFBhbmVsTW9kZWwgb3IgUGFnZU1vZGVsIGRlc2NyaXB0aW9uIHByb3BlcnR5LiBJdCByZW5kZXJzIHVuZGVyIHRpdGxlIGJ5IHVzaW5nIHNtYWxsZXIgZm9udC4gVW5saWtlIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24gY2FuIGJlIGVtcHR5LlxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBkZXNjcmlwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIGxvY2FsZUNoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jYWxlQ2hhbmdlZCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgKDxCYXNlPig8YW55PnRoaXMuZWxlbWVudHNbaV0pKS5sb2NhbGVDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hhci9zdHJpbmcgZm9yIGEgcmVxdWlyZWQgcGFuZWwuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucmVxdWlyZWRUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSAhPSBudWxsICYmIHRoaXMuaXNSZXF1aXJlZFxuICAgICAgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHRcbiAgICAgIDogXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHRpdGxlUGF0dGVybigpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucXVlc3Rpb25UaXRsZVBhdHRlcm4gOiBcIm51bVRpdGxlUmVxdWlyZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlVGV4dE9uU3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZCAmJiB0aGlzLnRpdGxlUGF0dGVybiA9PSBcInJlcXVpcmVOdW1UaXRsZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlVGV4dEJlZm9yZVRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWQgJiYgdGhpcy50aXRsZVBhdHRlcm4gPT0gXCJudW1SZXF1aXJlVGl0bGVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZVRleHRBZnRlclRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWQgJiYgdGhpcy50aXRsZVBhdHRlcm4gPT0gXCJudW1UaXRsZVJlcXVpcmVcIjtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1c3RvbSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBvbiByZXF1aXJlZCBlcnJvci4gVXNlIHRoaXMgcHJvcGVydHksIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBkZWZhdWx0IHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZEVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5XG4gICAgICA/ICg8SUxvY2FsaXphYmxlT3duZXI+KDxhbnk+dGhpcy5zdXJ2ZXkpKS5nZXRMb2NhbGUoKVxuICAgICAgOiBcIlwiO1xuICB9XG4gIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN1cnZleVxuICAgICAgPyB0aGlzLnN1cnZleS5nZXRTdXJ2ZXlNYXJrZG93bkh0bWwodGhpcywgdGV4dCwgbmFtZSlcbiAgICAgIDogbnVsbDtcbiAgfVxuICBnZXRSZW5kZXJlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LmdldFJlbmRlcmVyRm9yU3RyaW5nKHRoaXMsIG5hbWUpIDogbnVsbDtcbiAgfVxuICBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3NvclxuICAgICAgPyB0aGlzLnRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHQodGV4dCwgdHJ1ZSlcbiAgICAgIDogdGV4dDtcbiAgfVxuICAvKipcbiAgICogQSBwYXJlbnQgZWxlbWVudC4gSXQgaXMgYWx3YXlzIG51bGwgZm9yIHRoZSBQYWdlIG9iamVjdCBhbmQgYWx3YXlzIG5vdCBudWxsIGZvciB0aGUgUGFuZWwgb2JqZWN0LiBQYW5lbCBvYmplY3QgbWF5IGNvbnRhaW4gUXVlc3Rpb25zIGFuZCBvdGhlciBQYW5lbHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhcmVudCgpOiBQYW5lbE1vZGVsQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCBudWxsKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhcmVudCh2YWw6IFBhbmVsTW9kZWxCYXNlKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBkZXB0aCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnBhcmVudCA9PSBudWxsKSByZXR1cm4gMDtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuZGVwdGggKyAxO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIHRydWUgdGhlIFBhbmVsIGJlY29tZXMgdmlzaWJsZSBhbmQgaWYgaXQgcmV0dXJucyBmYWxzZSB0aGUgUGFuZWwgYmVjb21lcyBpbnZpc2libGUuIFRoZSBsaWJyYXJ5IHJ1bnMgdGhlIGV4cHJlc3Npb24gb24gc3VydmV5IHN0YXJ0IGFuZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZhbHVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZW1wdHkgdGhlbiB2aXNpYmxlIHByb3BlcnR5IGlzIHVzZWQuXG4gICAqIEBzZWUgdmlzaWJsZVxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBjc3NDbGFzc2VzVmFsdWU6IGFueTtcbiAgcHVibGljIGdldCBjc3NDbGFzc2VzKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmNzc0NsYXNzZXNWYWx1ZSkge1xuICAgICAgdGhpcy5jc3NDbGFzc2VzVmFsdWUgPSB0aGlzLmNhbGNDc3NDbGFzc2VzKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNzc0NsYXNzZXNWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FsY0Nzc0NsYXNzZXMoKTogYW55IHtcbiAgICB2YXIgY2xhc3NlcyA9IHsgcGFuZWw6IHt9LCBlcnJvcjoge30sIHJvdzogXCJcIiB9O1xuICAgIHRoaXMuY29weUNzc0NsYXNzZXMoY2xhc3Nlcy5wYW5lbCwgdGhpcy5jc3MucGFuZWwpO1xuICAgIHRoaXMuY29weUNzc0NsYXNzZXMoY2xhc3Nlcy5lcnJvciwgdGhpcy5jc3MuZXJyb3IpO1xuICAgIGlmICghIXRoaXMuY3NzLnJvdykge1xuICAgICAgY2xhc3Nlcy5yb3cgPSB0aGlzLmNzcy5yb3c7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkudXBkYXRlUGFuZWxDc3NDbGFzc2VzKHRoaXMsIGNsYXNzZXMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGNzcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkuZ2V0Q3NzKCkgOiB7fTtcbiAgfVxuICAvKipcbiAgICogQSB1bmlxdWUgZWxlbWVudCBpZGVudGlmaWNhdG9yLiBJdCBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaWRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvYmplY3QgaXMgUGFuZWwuIFJldHVybnMgZmFsc2UgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhZ2UgKGEgcm9vdCBQYW5lbCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRQYW5lbCgpOiBJUGFuZWwge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldExheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyb3dcIjtcbiAgfVxuICBpc0xheW91dFR5cGVTdXBwb3J0ZWQobGF5b3V0VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGxheW91dFR5cGUgIT09IFwiZmxvd1wiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBxdWVzdGlvbnMgbG9jYXRlZCBpbiB0aGUgUGFuZWwvUGFnZSwgaW5jbHVkaW5nIGluIHRoZSBuZXN0ZWQgUGFuZWxzLlxuICAgKiBAc2VlIFF1ZXN0aW9uXG4gICAqIEBzZWUgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zKCk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgaWYgKCF0aGlzLmlzUXVlc3Rpb25zUmVhZHkpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICAgIHZhciBxcyA9ICg8UGFuZWxNb2RlbD5lbCkucXVlc3Rpb25zO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaChxc1tqXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaCg8UXVlc3Rpb24+ZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmlzUXVlc3Rpb25zUmVhZHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uc1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWxpZE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoISFuYW1lKSByZXR1cm4gbmFtZS50cmltKCk7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHF1ZXN0aW9uIGJ5IGl0cyBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBxdWVzdGlvbiBuYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHF1ZXN0aW9uc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiBxdWVzdGlvbnNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGJ5IGl0cyBuYW1lLiBJdCB3b3JrcyByZWN1cnNpdmVseS5cbiAgICogQHBhcmFtIG5hbWUgdGhlIGVsZW1lbnQgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldEVsZW1lbnRCeU5hbWUobmFtZTogc3RyaW5nKTogSUVsZW1lbnQge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWwubmFtZSA9PSBuYW1lKSByZXR1cm4gZWw7XG4gICAgICB2YXIgcG5sID0gZWwuZ2V0UGFuZWwoKTtcbiAgICAgIGlmICghIXBubCkge1xuICAgICAgICB2YXIgcmVzID0gKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmdldEVsZW1lbnRCeU5hbWUobmFtZSk7XG4gICAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpID09IHZhbHVlTmFtZSkgcmV0dXJuIHF1ZXN0aW9uc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgcXVlc3Rpb24gdmFsdWVzIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRWYWx1ZSgpOiBhbnkge1xuICAgIHZhciBkYXRhOiBhbnkgPSB7fTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBpZiAocS5pc0VtcHR5KCkpIGNvbnRpbnVlO1xuICAgICAgdmFyIHZhbHVlTmFtZSA9IHEuZ2V0VmFsdWVOYW1lKCk7XG4gICAgICBkYXRhW3ZhbHVlTmFtZV0gPSBxLnZhbHVlO1xuICAgICAgaWYgKCEhdGhpcy5kYXRhKSB7XG4gICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5kYXRhLmdldENvbW1lbnQodmFsdWVOYW1lKTtcbiAgICAgICAgaWYgKCEhY29tbWVudCkge1xuICAgICAgICAgIGRhdGFbdmFsdWVOYW1lICsgc2V0dGluZ3MuY29tbWVudFByZWZpeF0gPSBjb21tZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gcXVlc3Rpb25zIHZhbHVlcyBhcyBhIEpTT04gb2JqZWN0IHdpdGggZGlzcGxheSB0ZXh0LiBGb3IgZXhhbXBsZSwgZm9yIGRyb3Bkb3duLCBpdCB3b3VsZCByZXR1cm4gdGhlIGl0ZW0gdGV4dCBpbnN0ZWFkIG9mIGl0ZW0gdmFsdWUuXG4gICAqIEBwYXJhbSBrZXlzQXNUZXh0IFNldCB0aGlzIHZhbHVlIHRvIHRydWUsIHRvIHJldHVybiBrZXkgKGluIG1hdHJpY2VzIHF1ZXN0aW9ucykgYXMgZGlzcGxheSB0ZXh0IGFzIHdlbGwuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlKGtleXNBc1RleHQ6IGJvb2xlYW4pOiBhbnkge1xuICAgIHZhciBkYXRhOiBhbnkgPSB7fTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBpZiAocS5pc0VtcHR5KCkpIGNvbnRpbnVlO1xuICAgICAgdmFyIHZhbHVlTmFtZSA9IGtleXNBc1RleHQgPyBxLnRpdGxlIDogcS5nZXRWYWx1ZU5hbWUoKTtcbiAgICAgIGRhdGFbdmFsdWVOYW1lXSA9IHEuZ2V0RGlzcGxheVZhbHVlKGtleXNBc1RleHQpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBxdWVzdGlvbiBjb21tZW50cyBvbiB0aGUgY3VycmVudCBwYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tbWVudHMoKTogYW55IHtcbiAgICB2YXIgY29tbWVudHMgPSB7fTtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuIGNvbW1lbnRzO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICB2YXIgY29tbWVudCA9IHRoaXMuZGF0YS5nZXRDb21tZW50KHEuZ2V0VmFsdWVOYW1lKCkpO1xuICAgICAgaWYgKCEhY29tbWVudCkge1xuICAgICAgICAoPGFueT5jb21tZW50cylbcS5nZXRWYWx1ZU5hbWUoKV0gPSBjb21tZW50O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tbWVudHM7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZW1vdmUgYWxsIHF1ZXN0aW9uIHZhbHVlcyBmcm9tIHRoZSBjdXJyZW50IHBhZ2UvcGFuZWwsIHRoYXQgZW5kLXVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlci5cbiAgICogRm9yIGV4YW1wbGUgdGhlIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdHMgaW4gYSByYWRpZ3JvdXAvZHJvcGRvd24vY2hlY2tib3ggY2hvaWNlcyBvciBtYXRyaXggcm93cy9jb2x1bW5zLlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNsZWFyIHZhbHVlcyBmb3IgaW52aXNpYmxlIHF1ZXN0aW9ucyBvciB2YWx1ZXMgdGhhdCBkb2Vzbid0IGFzc29jaWF0ZWQgd2l0aCBxdWVzdGlvbnMuXG4gICAqIEBzZWUgUXVlc3Rpb24uY2xlYXJJbmNvcnJlY3RWYWx1ZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byBjbGVhciBhbGwgZXJyb3JzIGluIHRoZSBwYW5lbCAvIHBhZ2UgYW5kIGFsbCBpdHMgY2hpbGQgZWxlbWVudHMgKHBhbmVscyBhbmQgcXVlc3Rpb25zKVxuICAgKi9cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5jbGVhckVycm9ycygpO1xuICAgIH1cbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICB9XG4gIHByaXZhdGUgbWFya1F1ZXN0aW9uTGlzdERpcnR5KCkge1xuICAgIHRoaXMuaXNRdWVzdGlvbnNSZWFkeSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnBhcmVudCkgdGhpcy5wYXJlbnQubWFya1F1ZXN0aW9uTGlzdERpcnR5KCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBvYmplY3QsIFBhbmVsL1BhZ2UuIEVsZW1lbnRzIGNhbiBiZSBxdWVzdGlvbnMgb3IgcGFuZWxzLiBUaGUgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gZWxlbWVudHMgaW4gdGhlIG5lc3RlZCBQYW5lbHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0RWxlbWVudHNJbkRlc2lnbihpbmNsdWRlSGlkZGVuOiBib29sZWFuID0gZmFsc2UpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgZWxlbWVudCBiZWxvbmdzIHRvIHRoZSBQYW5lbC9QYWdlLiBJdCBsb29rcyBpbiBuZXN0ZWQgUGFuZWxzIGFzIHdlbGwuXG4gICAqIEBwYXJhbSBlbGVtZW50XG4gICAqIEBzZWUgUGFuZWxNb2RlbFxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5zRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsOiBhbnkgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgaWYgKGVsID09IGVsZW1lbnQpIHJldHVybiB0cnVlO1xuICAgICAgdmFyIHBubCA9IGVsLmdldFBhbmVsKCk7XG4gICAgICBpZiAoISFwbmwpIHtcbiAgICAgICAgaWYgKCg8UGFuZWxNb2RlbEJhc2U+cG5sKS5jb250YWluc0VsZW1lbnQoZWxlbWVudCkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIHJlcXVpcmUgdGhlIGFuc3dlciBhdCBsZWFzdCBpbiBvbmUgcXVlc3Rpb24gaW4gdGhlIHBhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZXF1aXJlZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIHRydWUgdGhlIFBhbmVsL1BhZ2UgYmVjb21lcyByZXF1aXJlZC5cbiAgICogVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIGlzUmVxdWlyZWQgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSBpc1JlcXVpcmVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVxdWlyZWRJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZElmXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIHNlYXJjaFRleHQodGV4dDogc3RyaW5nLCBmb3VuZGVkOiBBcnJheTxJRmluZEVsZW1lbnQ+KSB7XG4gICAgc3VwZXIuc2VhcmNoVGV4dCh0ZXh0LCBmb3VuZGVkKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICg8QmFzZT4oPGFueT50aGlzLmVsZW1lbnRzW2ldKSkuc2VhcmNoVGV4dCh0ZXh0LCBmb3VuZGVkKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlcmUgaXMgYW4gZXJyb3Igb24gdGhpcyBQYWdlIG9yIGluc2lkZSB0aGUgY3VycmVudCBQYW5lbFxuICAgKiBAcGFyYW0gZmlyZUNhbGxiYWNrIHNldCBpdCB0byB0cnVlLCB0byBzaG93IGVycm9ycyBpbiBVSVxuICAgKiBAcGFyYW0gZm9jdXNPbkZpcnN0RXJyb3Igc2V0IGl0IHRvIHRydWUgdG8gZm9jdXMgb24gdGhlIGZpcnN0IHF1ZXN0aW9uIHRoYXQgZG9lc24ndCBwYXNzIHRoZSB2YWxpZGF0aW9uXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsXG4gICAgZm9jdXNPbkZpcnN0RXJyb3I6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICByZWM6IGFueSA9IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmVjID0gISFyZWNcbiAgICAgID8gcmVjXG4gICAgICA6IHtcbiAgICAgICAgICBmaXJlQ2FsbGJhY2s6IGZpcmVDYWxsYmFjayxcbiAgICAgICAgICBmb2N1c2VPbkZpcnN0RXJyb3I6IGZvY3VzT25GaXJzdEVycm9yLFxuICAgICAgICAgIGZpcnN0RXJyb3JRdWVzdGlvbjogPGFueT5udWxsLFxuICAgICAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgdGhpcy5oYXNFcnJvcnNDb3JlKHJlYyk7XG4gICAgaWYgKHJlYy5maXJzdEVycm9yUXVlc3Rpb24pIHtcbiAgICAgIHJlYy5maXJzdEVycm9yUXVlc3Rpb24uZm9jdXModHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZWMucmVzdWx0O1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JzSW5QYW5lbHMocmVjOiBhbnkpIHtcbiAgICB2YXIgZXJyb3JzID0gPEFycmF5PGFueT4+W107XG4gICAgdGhpcy5oYXNSZXF1aXJlZEVycm9yKHJlYywgZXJyb3JzKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHZhciBjdXN0b21FcnJvciA9IHRoaXMuc3VydmV5LnZhbGlkYXRlUGFuZWwodGhpcyk7XG4gICAgICBpZiAoY3VzdG9tRXJyb3IpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goY3VzdG9tRXJyb3IpO1xuICAgICAgICByZWMucmVzdWx0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhcmVjLmZpcmVDYWxsYmFjaykge1xuICAgICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkuYmVmb3JlU2V0dGluZ1BhbmVsRXJyb3JzKHRoaXMsIGVycm9ycyk7XG4gICAgICB9XG4gICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB9XG4gIH1cbiAgLy9JU3VydmV5RXJyb3JPd25lclxuICBnZXRFcnJvckN1c3RvbVRleHQodGV4dDogc3RyaW5nLCBlcnJvcjogU3VydmV5RXJyb3IpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMuc3VydmV5KSByZXR1cm4gdGhpcy5zdXJ2ZXkuZ2V0RXJyb3JDdXN0b21UZXh0KHRleHQsIGVycm9yKTtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzUmVxdWlyZWRFcnJvcihyZWM6IGFueSwgZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBpZiAoIXRoaXMuaXNSZXF1aXJlZCkgcmV0dXJuO1xuICAgIHZhciB2aXNRdWVzdGlvbnMgPSA8QXJyYXk8YW55Pj5bXTtcbiAgICB0aGlzLmFkZFF1ZXN0aW9uc1RvTGlzdCh2aXNRdWVzdGlvbnMsIHRydWUpO1xuICAgIGlmICh2aXNRdWVzdGlvbnMubGVuZ3RoID09IDApIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc1F1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF2aXNRdWVzdGlvbnNbaV0uaXNFbXB0eSgpKSByZXR1cm47XG4gICAgfVxuICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgIGVycm9ycy5wdXNoKG5ldyBPbmVBbnN3ZXJSZXF1aXJlZEVycm9yKHRoaXMucmVxdWlyZWRFcnJvclRleHQsIHRoaXMpKTtcbiAgICBpZiAocmVjLmZvY3VzZU9uRmlyc3RFcnJvciAmJiAhcmVjLmZpcnN0RXJyb3JRdWVzdGlvbikge1xuICAgICAgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbiA9IHZpc1F1ZXN0aW9uc1swXTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhc0Vycm9yc0NvcmUocmVjOiBhbnkpIHtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIHZhciBlbGVtZW50ID0gbnVsbDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcblxuICAgICAgaWYgKCFlbGVtZW50LmlzVmlzaWJsZSkgY29udGludWU7XG5cbiAgICAgIGlmIChlbGVtZW50LmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbGVtZW50KSkuaGFzRXJyb3JzQ29yZShyZWMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gPFF1ZXN0aW9uPmVsZW1lbnQ7XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc1JlYWRPbmx5KSBjb250aW51ZTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmhhc0Vycm9ycyhyZWMuZmlyZUNhbGxiYWNrLCByZWMpKSB7XG4gICAgICAgICAgaWYgKHJlYy5mb2N1c2VPbkZpcnN0RXJyb3IgJiYgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZWMuZmlyc3RFcnJvclF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaGFzRXJyb3JzSW5QYW5lbHMocmVjKTtcbiAgICB0aGlzLnVwZGF0ZUNvbnRhaW5zRXJyb3JzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5nZXRDb250YWluc0Vycm9ycygpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZWxlbWVudHNbaV0uY29udGFpbnNFcnJvcnMpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdXBkYXRlRWxlbWVudFZpc2liaWxpdHkoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgKDxCYXNlPig8YW55PmVsKSkuc2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCBlbC5pc1Zpc2libGUpO1xuICAgICAgaWYgKGVsLmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbCkpLnVwZGF0ZUVsZW1lbnRWaXNpYmlsaXR5KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKHdpdGhFcnJvcjogYm9vbGVhbiA9IGZhbHNlKTogUXVlc3Rpb24ge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoIWVsLmlzVmlzaWJsZSkgY29udGludWU7XG4gICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICB2YXIgcmVzID0gKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbCkpLmdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKFxuICAgICAgICAgIHdpdGhFcnJvclxuICAgICAgICApO1xuICAgICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcSA9IDxRdWVzdGlvbj5lbDtcbiAgICAgICAgaWYgKHEuaGFzSW5wdXQgJiYgKCF3aXRoRXJyb3IgfHwgcS5jdXJyZW50RXJyb3JDb3VudCA+IDApKSByZXR1cm4gcTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gZm9jdXMgdGhlIGlucHV0IG9uIHRoZSBmaXJzdCBxdWVzdGlvblxuICAgKi9cbiAgcHVibGljIGZvY3VzRmlyc3RRdWVzdGlvbigpIHtcbiAgICB2YXIgcSA9IHRoaXMuZ2V0Rmlyc3RRdWVzdGlvblRvRm9jdXMoKTtcbiAgICBpZiAoISFxKSB7XG4gICAgICBxLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIGl0IHRvIGZvY3VzIHRoZSBpbnB1dCBvZiB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBoYXMgYW4gZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgZm9jdXNGaXJzdEVycm9yUXVlc3Rpb24oKSB7XG4gICAgdmFyIHEgPSB0aGlzLmdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKHRydWUpO1xuICAgIGlmICghIXEpIHtcbiAgICAgIHEuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEZpbGwgbGlzdCBhcnJheSB3aXRoIHRoZSBxdWVzdGlvbnMuXG4gICAqIEBwYXJhbSBsaXN0XG4gICAqIEBwYXJhbSB2aXNpYmxlT25seSBzZXQgaXQgdG8gdHJ1ZSB0byBnZXQgdmlzaWJsZSBxdWVzdGlvbnMgb25seVxuICAgKi9cbiAgcHVibGljIGFkZFF1ZXN0aW9uc1RvTGlzdChcbiAgICBsaXN0OiBBcnJheTxJUXVlc3Rpb24+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3QobGlzdCwgdmlzaWJsZU9ubHksIGluY2x1ZGluZ0Rlc2lnblRpbWUsIGZhbHNlKTtcbiAgfVxuICAvKipcbiAgICogRmlsbCBsaXN0IGFycmF5IHdpdGggdGhlIHBhbmVscy5cbiAgICogQHBhcmFtIGxpc3RcbiAgICovXG4gIHB1YmxpYyBhZGRQYW5lbHNJbnRvTGlzdChcbiAgICBsaXN0OiBBcnJheTxJUGFuZWw+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3QoXG4gICAgICA8QXJyYXk8SUVsZW1lbnQ+Pig8QXJyYXk8YW55Pj5saXN0KSxcbiAgICAgIHZpc2libGVPbmx5LFxuICAgICAgaW5jbHVkaW5nRGVzaWduVGltZSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG4gIHByaXZhdGUgYWRkRWxlbWVudHNUb0xpc3QoXG4gICAgbGlzdDogQXJyYXk8SUVsZW1lbnQ+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4sXG4gICAgaXNQYW5lbDogYm9vbGVhblxuICApIHtcbiAgICBpZiAodmlzaWJsZU9ubHkgJiYgIXRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3RDb3JlKFxuICAgICAgbGlzdCxcbiAgICAgIHRoaXMuZWxlbWVudHMsXG4gICAgICB2aXNpYmxlT25seSxcbiAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWUsXG4gICAgICBpc1BhbmVsXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGFkZEVsZW1lbnRzVG9MaXN0Q29yZShcbiAgICBsaXN0OiBBcnJheTxJRWxlbWVudD4sXG4gICAgZWxlbWVudHM6IEFycmF5PElFbGVtZW50PixcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbixcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuLFxuICAgIGlzUGFuZWw6IGJvb2xlYW5cbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAodmlzaWJsZU9ubHkgJiYgIWVsLnZpc2libGUpIGNvbnRpbnVlO1xuICAgICAgaWYgKChpc1BhbmVsICYmIGVsLmlzUGFuZWwpIHx8ICghaXNQYW5lbCAmJiAhZWwuaXNQYW5lbCkpIHtcbiAgICAgICAgbGlzdC5wdXNoKGVsKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbC5pc1BhbmVsKSB7XG4gICAgICAgICg8UGFuZWxNb2RlbD5lbCkuYWRkRWxlbWVudHNUb0xpc3RDb3JlKFxuICAgICAgICAgIGxpc3QsXG4gICAgICAgICAgKDxQYW5lbE1vZGVsPmVsKS5lbGVtZW50cyxcbiAgICAgICAgICB2aXNpYmxlT25seSxcbiAgICAgICAgICBpbmNsdWRpbmdEZXNpZ25UaW1lLFxuICAgICAgICAgIGlzUGFuZWxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpbmNsdWRpbmdEZXNpZ25UaW1lKSB7XG4gICAgICAgICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdENvcmUoXG4gICAgICAgICAgICBsaXN0LFxuICAgICAgICAgICAgKDxTdXJ2ZXlFbGVtZW50Pig8YW55PmVsKSkuZ2V0RWxlbWVudHNJbkRlc2lnbihmYWxzZSksXG4gICAgICAgICAgICB2aXNpYmxlT25seSxcbiAgICAgICAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWUsXG4gICAgICAgICAgICBpc1BhbmVsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IG9iamVjdCBpcyBQYWdlIGFuZCBpdCBpcyB0aGUgY3VycmVudCBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuc3VydmV5IHx8IDxQYWdlTW9kZWw+dGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2UgPT0gdGhpcy5yb290O1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXRzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBkaWZmZXJlbnQgZnJvbSBcImRlZmF1bHRcIiB0byBzZXQgdGhlIHNwZWNpZmljIHF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uIGZvciB0aGlzIHBhbmVsL3BhZ2UuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvblRpdGxlTG9jYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICBnZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vbkdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbilcbiAgICAgIHJldHVybiB0aGlzLm9uR2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk7XG4gICAgaWYgKHRoaXMucXVlc3Rpb25UaXRsZUxvY2F0aW9uICE9IFwiZGVmYXVsdFwiKVxuICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25UaXRsZUxvY2F0aW9uO1xuICAgIGlmICh0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpO1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVMb2NhdGlvbiA6IFwidG9wXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0YXJ0SW5kZXgoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldFF1ZXN0aW9uU3RhcnRJbmRleCgpO1xuICAgIGlmICghIXRoaXMuc3VydmV5KSByZXR1cm4gdGhpcy5zdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4O1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIGdldFF1ZXN0aW9uU3RhcnRJbmRleCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFN0YXJ0SW5kZXgoKTtcbiAgfVxuICBnZXRDaGlsZHJlbkxheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyb3dcIjtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvZ3Jlc3NJbmZvKCk6IElQcm9ncmVzc0luZm8ge1xuICAgIHJldHVybiBTdXJ2ZXlFbGVtZW50LmdldFByb2dyZXNzSW5mb0J5RWxlbWVudHMoXG4gICAgICA8QXJyYXk8U3VydmV5RWxlbWVudD4+KDxhbnk+dGhpcy5lbGVtZW50cyksXG4gICAgICB0aGlzLmlzUmVxdWlyZWRcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcm9vdCgpOiBQYW5lbE1vZGVsQmFzZSB7XG4gICAgdmFyIHJlcyA9IDxQYW5lbE1vZGVsQmFzZT50aGlzO1xuICAgIHdoaWxlIChyZXMucGFyZW50KSByZXMgPSByZXMucGFyZW50O1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGNoaWxkVmlzaWJpbGl0eUNoYW5nZWQoKSB7XG4gICAgdmFyIG5ld0lzVmlzaWJsZVZhbHVlID0gdGhpcy5nZXRJc1BhZ2VWaXNpYmxlKG51bGwpO1xuICAgIHZhciBvbGRJc1Zpc2libGVWYWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCB0cnVlKTtcbiAgICBpZiAobmV3SXNWaXNpYmxlVmFsdWUgIT09IG9sZElzVmlzaWJsZVZhbHVlKSB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJvd0FuZFNldExhenkoaW5kZXg6IG51bWJlcik6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIGNvbnN0IHJvdyA9IHRoaXMuY3JlYXRlUm93KCk7XG4gICAgcm93LnNldElzTGF6eVJlbmRlcmluZyh0aGlzLmlzTGF6eVJlbmRlckluUm93KGluZGV4KSk7XG4gICAgcmV0dXJuIHJvdztcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUm93KCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Sb3dNb2RlbCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5vblN1cnZleUxvYWQoKTtcbiAgICB9XG4gICAgdGhpcy5vbkVsZW1lbnRWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgb25GaXJzdFJlbmRlcmluZygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0ub25GaXJzdFJlbmRlcmluZygpO1xuICAgIH1cbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICBnZXQgcm93cygpOiBBcnJheTxRdWVzdGlvblJvd01vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIik7XG4gIH1cblxuICBwdWJsaWMgZW5zdXJlUm93c1Zpc2liaWxpdHkoKSB7XG4gICAgdGhpcy5yb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgcm93LmVuc3VyZVZpc2liaWxpdHkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblJvd3NDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiLCB0aGlzLmJ1aWxkUm93cygpKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25BZGRFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgZWxlbWVudC5zZXRTdXJ2ZXlJbXBsKHRoaXMuc3VydmV5SW1wbCk7XG4gICAgZWxlbWVudC5wYXJlbnQgPSB0aGlzO1xuICAgIHRoaXMubWFya1F1ZXN0aW9uTGlzdERpcnR5KCk7XG4gICAgdGhpcy51cGRhdGVSb3dzT25FbGVtZW50QWRkZWQoZWxlbWVudCwgaW5kZXgpO1xuICAgIGlmIChlbGVtZW50LmlzUGFuZWwpIHtcbiAgICAgIHZhciBwID0gPFBhbmVsTW9kZWw+ZWxlbWVudDtcbiAgICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgICB0aGlzLnN1cnZleS5wYW5lbEFkZGVkKHAsIGluZGV4LCB0aGlzLCB0aGlzLnJvb3QpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgdmFyIHEgPSA8UXVlc3Rpb24+ZWxlbWVudDtcbiAgICAgICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25BZGRlZChxLCBpbmRleCwgdGhpcywgdGhpcy5yb290KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhdGhpcy5hZGRFbGVtZW50Q2FsbGJhY2spIHRoaXMuYWRkRWxlbWVudENhbGxiYWNrKGVsZW1lbnQpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAoPEJhc2U+KDxhbnk+ZWxlbWVudCkpLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJ2aXNpYmxlXCIsIFwiaXNWaXNpYmxlXCJdLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQoZWxlbWVudCk7XG4gICAgICB9LFxuICAgICAgdGhpcy5pZFxuICAgICk7XG4gICAgKDxCYXNlPig8YW55PmVsZW1lbnQpKS5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwic3RhcnRXaXRoTmV3TGluZVwiLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYub25FbGVtZW50U3RhcnRXaXRoTmV3TGluZUNoYW5nZWQoZWxlbWVudCk7XG4gICAgICB9LFxuICAgICAgdGhpcy5pZFxuICAgICk7XG4gICAgdGhpcy5vbkVsZW1lbnRWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KSB7XG4gICAgZWxlbWVudC5wYXJlbnQgPSBudWxsO1xuICAgIHRoaXMubWFya1F1ZXN0aW9uTGlzdERpcnR5KCk7XG4gICAgKDxCYXNlPig8YW55PmVsZW1lbnQpKS51blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJ2aXNpYmxlXCIsIFwiaXNWaXNpYmxlXCIsIFwic3RhcnRXaXRoTmV3TGluZVwiXSxcbiAgICAgIHRoaXMuaWRcbiAgICApO1xuICAgIHRoaXMudXBkYXRlUm93c09uRWxlbWVudFJlbW92ZWQoZWxlbWVudCk7XG4gICAgaWYgKCFlbGVtZW50LmlzUGFuZWwpIHtcbiAgICAgIGlmICh0aGlzLnN1cnZleSkgdGhpcy5zdXJ2ZXkucXVlc3Rpb25SZW1vdmVkKDxRdWVzdGlvbj5lbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5wYW5lbFJlbW92ZWQoZWxlbWVudCk7XG4gICAgfVxuICAgIGlmICghIXRoaXMucmVtb3ZlRWxlbWVudENhbGxiYWNrKSB0aGlzLnJlbW92ZUVsZW1lbnRDYWxsYmFjayhlbGVtZW50KTtcbiAgICB0aGlzLm9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKHRoaXMpO1xuICB9XG4gIHByaXZhdGUgb25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQoZWxlbWVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZVJvd3NWaXNpYmlsaXR5KGVsZW1lbnQpO1xuICAgIHRoaXMuY2hpbGRWaXNpYmlsaXR5Q2hhbmdlZCgpO1xuICAgIGlmICghIXRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLnBhcmVudC5vbkVsZW1lbnRWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBvbkVsZW1lbnRTdGFydFdpdGhOZXdMaW5lQ2hhbmdlZChlbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVJvd3NWaXNpYmlsaXR5KGVsZW1lbnQ6IGFueSkge1xuICAgIHZhciByb3dzID0gdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvdyA9IHJvd3NbaV07XG4gICAgICBpZiAocm93LmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCkgPiAtMSkge1xuICAgICAgICByb3cudXBkYXRlVmlzaWJsZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjYW5CdWlsZFJvd3MoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHRoaXMuZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCkgPT0gXCJyb3dcIjtcbiAgfVxuICBwcml2YXRlIGJ1aWxkUm93cygpOiBBcnJheTxRdWVzdGlvblJvd01vZGVsPiB7XG4gICAgaWYgKCF0aGlzLmNhbkJ1aWxkUm93cygpKSByZXR1cm4gW107XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxRdWVzdGlvblJvd01vZGVsPigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gdGhpcy5lbGVtZW50c1tpXTtcbiAgICAgIHZhciBpc05ld1JvdyA9IGkgPT0gMCB8fCBlbC5zdGFydFdpdGhOZXdMaW5lO1xuICAgICAgdmFyIHJvdyA9IGlzTmV3Um93ID8gdGhpcy5jcmVhdGVSb3dBbmRTZXRMYXp5KHJlc3VsdC5sZW5ndGgpIDogcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChpc05ld1JvdykgcmVzdWx0LnB1c2gocm93KTtcbiAgICAgIHJvdy5hZGRFbGVtZW50KGVsKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXS51cGRhdGVWaXNpYmxlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBpc0xhenlSZW5kZXJJblJvdyhyb3dJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCAhdGhpcy5zdXJ2ZXkuaXNMYXp5UmVuZGVyaW5nKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIChcbiAgICAgIHJvd0luZGV4ID49IHNldHRpbmdzLmxhenlSb3dzUmVuZGVyaW5nU3RhcnRSb3cgfHxcbiAgICAgICF0aGlzLmNhblJlbmRlckZpcnN0Um93cygpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVuZGVyRmlyc3RSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGFnZTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVJvd3NPbkVsZW1lbnRBZGRlZChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuO1xuICAgIHZhciBkcmFnRHJvcEluZm8gPSBuZXcgRHJhZ0Ryb3BJbmZvKG51bGwsIGVsZW1lbnQpO1xuICAgIGRyYWdEcm9wSW5mby50YXJnZXQgPSBlbGVtZW50O1xuICAgIGRyYWdEcm9wSW5mby5pc0VkZ2UgPSB0aGlzLmVsZW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgaWYgKHRoaXMuZWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmlzQm90dG9tID0gaW5kZXggPiAwO1xuICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gdGhpcy5lbGVtZW50c1sxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbiA9IHRoaXMuZWxlbWVudHNbaW5kZXggLSAxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcmFnRHJvcEFkZFRhcmdldFRvUm93KGRyYWdEcm9wSW5mbywgbnVsbCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVSb3dzT25FbGVtZW50UmVtb3ZlZChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlUm93c1JlbW92ZUVsZW1lbnRGcm9tUm93KFxuICAgICAgZWxlbWVudCxcbiAgICAgIHRoaXMuZmluZFJvd0J5RWxlbWVudChlbGVtZW50KVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyhcbiAgICBlbGVtZW50OiBJRWxlbWVudCxcbiAgICByb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKSB7XG4gICAgaWYgKCFyb3cgfHwgIXJvdy5wYW5lbCkgcmV0dXJuO1xuICAgIHZhciBlbEluZGV4ID0gcm93LmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7XG4gICAgaWYgKGVsSW5kZXggPCAwKSByZXR1cm47XG4gICAgcm93LmVsZW1lbnRzLnNwbGljZShlbEluZGV4LCAxKTtcbiAgICBpZiAocm93LmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb3cuaW5kZXggPj0gMCkge1xuICAgICAgICByb3cucGFuZWwucm93cy5zcGxpY2Uocm93LmluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaW5kUm93QnlFbGVtZW50KGVsOiBJRWxlbWVudCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHZhciByb3dzID0gdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJvd3NbaV0uZWxlbWVudHMuaW5kZXhPZihlbCkgPiAtMSkgcmV0dXJuIHJvd3NbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGVsZW1lbnRXaWR0aENoYW5nZWQoZWw6IElFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGVsKTtcbiAgICBpZiAoISFyb3cpIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlbmRlcmVkIHRpdGxlIHRleHQgb3IgaHRtbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVuZGVyZWRUaXRsZSh0aGlzLmxvY1RpdGxlLnRleHRPckh0bWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRSZW5kZXJlZFRpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yICE9IG51bGxcbiAgICAgID8gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KHN0ciwgdHJ1ZSlcbiAgICAgIDogc3RyO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZ2V0L3NldCB0aGUgb2JqZWN0IHZpc2liaWxpdHkuXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnZpc2libGUpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHZhbHVlKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIHRoaXMuaXNWaXNpYmxlKTtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuc3VydmV5ICYmXG4gICAgICB0aGlzLnN1cnZleS5pc0NsZWFyVmFsdWVPbkhpZGRlbkNvbnRhaW5lciAmJlxuICAgICAgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb25cbiAgICApIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgICAgICBxdWVzdGlvbnNbaV0uY2xlYXJWYWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXN0aW9uc1tpXS51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIHZpc2libGUgb3Igc3VydmV5IGlzIGluIGRlc2lnbiBtb2RlIHJpZ2h0IG5vdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZyB8fCB0aGlzLmdldElzUGFnZVZpc2libGUobnVsbCk7XG4gIH1cbiAgZ2V0SXNQYWdlVmlzaWJsZShleGNlcHRpb25RdWVzdGlvbjogSVF1ZXN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnZpc2libGUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRzW2ldID09IGV4Y2VwdGlvblF1ZXN0aW9uKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRzW2ldLmlzVmlzaWJsZSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGxhc3RWaXNpYmxlSW5kZXg6IG51bWJlcjtcbiAgcHVibGljIHNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlIHx8IGluZGV4IDwgMCkge1xuICAgICAgdGhpcy5yZXNldFZpc2libGVJbmRleGVzKCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgdGhpcy5sYXN0VmlzaWJsZUluZGV4ID0gaW5kZXg7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSBpbmRleDtcbiAgICBpbmRleCArPSB0aGlzLmJlZm9yZVNldFZpc2libGVJbmRleChpbmRleCk7XG4gICAgdmFyIHBhbmVsU3RhcnRJbmRleCA9IHRoaXMuZ2V0UGFuZWxTdGFydEluZGV4KGluZGV4KTtcbiAgICB2YXIgcGFuZWxJbmRleCA9IHBhbmVsU3RhcnRJbmRleDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhbmVsSW5kZXggKz0gdGhpcy5lbGVtZW50c1tpXS5zZXRWaXNpYmxlSW5kZXgocGFuZWxJbmRleCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQ29udGludWVOdW1iZXJpbmcoKSkge1xuICAgICAgaW5kZXggKz0gcGFuZWxJbmRleCAtIHBhbmVsU3RhcnRJbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4IC0gc3RhcnRJbmRleDtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVZpc2libGVJbmRleGVzKCkge1xuICAgIGlmICh0aGlzLmxhc3RWaXNpYmxlSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMuc2V0VmlzaWJsZUluZGV4KHRoaXMubGFzdFZpc2libGVJbmRleCk7XG4gIH1cbiAgcHJpdmF0ZSByZXNldFZpc2libGVJbmRleGVzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5zZXRWaXNpYmxlSW5kZXgoLTEpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgYmVmb3JlU2V0VmlzaWJsZUluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHByb3RlY3RlZCBnZXRQYW5lbFN0YXJ0SW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG4gIHByb3RlY3RlZCBpc0NvbnRpbnVlTnVtYmVyaW5nKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgcmVhZE9ubHkgcHJvcGVydHkgaXMgdHJ1ZSBvciBzdXJ2ZXkgaXMgaW4gZGlzcGxheSBtb2RlIG9yIHBhcmVudCBwYW5lbC9wYWdlIGlzIHJlYWRPbmx5LlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLm1vZGVsXG4gICAqIEBzZWUgcmVhZE9ubHlcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICB2YXIgaXNQYXJlbnRSZWFkT25seSA9ICEhdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuaXNSZWFkT25seTtcbiAgICB2YXIgaXNTdXJ2ZXlSZWFkT25seSA9ICEhdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEaXNwbGF5TW9kZTtcbiAgICByZXR1cm4gdGhpcy5yZWFkT25seSB8fCBpc1BhcmVudFJlYWRPbmx5IHx8IGlzU3VydmV5UmVhZE9ubHk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVhZE9ubHlDaGFuZ2VkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gPFN1cnZleUVsZW1lbnQ+KDxhbnk+dGhpcy5lbGVtZW50c1tpXSk7XG4gICAgICBlbC5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZWFkT25seVwiLCBlbC5pc1JlYWRPbmx5KTtcbiAgICB9XG4gICAgc3VwZXIub25SZWFkT25seUNoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlRWxlbWVudENzcyhyZU5ldz86IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNzc0NsYXNzZXNWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IDxTdXJ2ZXlFbGVtZW50Pig8YW55PnRoaXMuZWxlbWVudHNbaV0pO1xuICAgICAgZWwudXBkYXRlRWxlbWVudENzcyhyZU5ldyk7XG4gICAgfVxuICAgIHN1cGVyLnVwZGF0ZUVsZW1lbnRDc3MocmVOZXcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgZmFsc2UgdGhlIFBhbmVsL1BhZ2UgYmVjb21lcyByZWFkIG9ubHkgYW5kIGFuIGVuZC11c2VyIHdpbGwgbm90IGFibGUgdG8gYW5zd2VyIG9uIHF1c3Rpb25zIGluc2lkZSBpdC5cbiAgICogVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIHJlYWRPbmx5IHByb3BlcnR5IGlzIHVzZWQuXG4gICAqIEBzZWUgcmVhZE9ubHlcbiAgICogQHNlZSBpc1JlYWRPbmx5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGVuYWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImVuYWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZW5hYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYW4gZWxlbWVudCBpbnRvIFBhbmVsIG9yIFBhZ2UuIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBhZGRlZCBzdWNjZXNzZnVsbHkuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICAgKiBAcGFyYW0gZWxlbWVudFxuICAgKiBAcGFyYW0gaW5kZXggZWxlbWVudCBpbmRleCBpbiB0aGUgZWxlbWVudHMgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBhZGRFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBpbmRleDogbnVtYmVyID0gLTEpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY2FuQWRkRWxlbWVudChlbGVtZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoaW5kZXgsIDAsIGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBpbnNlcnRFbGVtZW50QWZ0ZXIoZWxlbWVudDogSUVsZW1lbnQsIGFmdGVyOiBJRWxlbWVudCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5lbGVtZW50cy5pbmRleE9mKGFmdGVyKTtcbiAgICBpZiAoaW5kZXggPj0gMCkgdGhpcy5hZGRFbGVtZW50KGVsZW1lbnQsIGluZGV4ICsgMSk7XG4gIH1cbiAgcHVibGljIGluc2VydEVsZW1lbnRCZWZvcmUoZWxlbWVudDogSUVsZW1lbnQsIGJlZm9yZTogSUVsZW1lbnQpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZWxlbWVudHMuaW5kZXhPZihiZWZvcmUpO1xuICAgIGlmIChpbmRleCA+PSAwKSB0aGlzLmFkZEVsZW1lbnQoZWxlbWVudCwgaW5kZXgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbkFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFlbGVtZW50ICYmIGVsZW1lbnQuaXNMYXlvdXRUeXBlU3VwcG9ydGVkKHRoaXMuZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCkpXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcXVlc3Rpb24gaW50byBQYW5lbCBvciBQYWdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIGFkZGVkIHN1Y2Nlc3NmdWxseS4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gICAqIEBwYXJhbSBxdWVzdGlvblxuICAgKiBAcGFyYW0gaW5kZXggZWxlbWVudCBpbmRleCBpbiB0aGUgZWxlbWVudHMgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBhZGRRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24sIGluZGV4OiBudW1iZXIgPSAtMSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZEVsZW1lbnQocXVlc3Rpb24sIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcGFuZWwgaW50byBQYW5lbCBvciBQYWdlLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYW5lbCBhZGRlZCBzdWNjZXNzZnVsbHkuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICAgKiBAcGFyYW0gcGFuZWxcbiAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwdWJsaWMgYWRkUGFuZWwocGFuZWw6IFBhbmVsTW9kZWwsIGluZGV4OiBudW1iZXIgPSAtMSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZEVsZW1lbnQocGFuZWwsIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBxdWVzdGlvbiBhbmQgYWRkcyBpdCBhdCBsb2NhdGlvbiBvZiBpbmRleCwgYnkgZGVmYXVsdCB0aGUgZW5kIG9mIHRoZSBlbGVtZW50cyBsaXN0LiBSZXR1cm5zIG51bGwsIGlmIHRoZSBxdWVzdGlvbiBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciBjb3VsZCBub3QgYmUgYWRkZWQgaW50byBwYWdlIG9yIHBhbmVsLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25UeXBlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBcInRleHRcIiwgXCJjaGVja2JveFwiLCBcImRyb3Bkb3duXCIsIFwibWF0cml4XCIsIFwiaHRtbFwiLCBcIm1hdHJpeGR5bmFtaWNcIiwgXCJtYXRyaXhkcm9wZG93blwiIGFuZCBzbyBvbi5cbiAgICogQHBhcmFtIG5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBpbmRleCBlbGVtZW50IGluZGV4IGluIHRoZSBlbGVtZW50cyBhcnJheVxuICAgKi9cbiAgcHVibGljIGFkZE5ld1F1ZXN0aW9uKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgaW5kZXg6IG51bWJlciA9IC0xXG4gICk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb24gPSBRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UuY3JlYXRlUXVlc3Rpb24ocXVlc3Rpb25UeXBlLCBuYW1lKTtcbiAgICBpZiAoIXRoaXMuYWRkUXVlc3Rpb24ocXVlc3Rpb24sIGluZGV4KSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBhbmVsIGFuZCBhZGRzIGl0IGludG8gdGhlIGVuZCBvZiB0aGUgZWxlbWVudHMgbGlzdC4gUmV0dXJucyBudWxsLCBpZiB0aGUgcGFuZWwgY291bGQgbm90IGJlIGNyZWF0ZWQgb3IgY291bGQgbm90IGJlIGFkZGVkIGludG8gcGFnZSBvciBwYW5lbC5cbiAgICogQHBhcmFtIG5hbWUgYSBwYW5lbCBuYW1lXG4gICAqL1xuICBwdWJsaWMgYWRkTmV3UGFuZWwobmFtZTogc3RyaW5nID0gbnVsbCk6IFBhbmVsTW9kZWwge1xuICAgIHZhciBwYW5lbCA9IHRoaXMuY3JlYXRlTmV3UGFuZWwobmFtZSk7XG4gICAgaWYgKCF0aGlzLmFkZFBhbmVsKHBhbmVsKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHBhbmVsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBlbGVtZW50IHBhcmFtZXRlciBpbiB0aGUgZWxlbWVudHMgbGlzdC5cbiAgICogQHBhcmFtIGVsZW1lbnQgcXVlc3Rpb24gb3IgcGFuZWxcbiAgICovXG4gIHB1YmxpYyBpbmRleE9mKGVsZW1lbnQ6IElFbGVtZW50KTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbChuYW1lOiBzdHJpbmcpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgcmVzID0gU2VyaWFsaXplci5jcmVhdGVDbGFzcyhcInBhbmVsXCIpO1xuICAgIHJlcy5uYW1lID0gbmFtZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZWxlbWVudCAoUGFuZWwgb3IgUXVlc3Rpb24pIGZyb20gdGhlIGVsZW1lbnRzIGxpc3QuXG4gICAqIEBwYXJhbSBlbGVtZW50XG4gICAqIEBzZWUgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5yZW1vdmVFbGVtZW50KGVsZW1lbnQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgcXVlc3Rpb24gIGZyb20gdGhlIGVsZW1lbnRzIGxpc3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvblxuICAgKiBAc2VlIGVsZW1lbnRzXG4gICAqIEBzZWUgcmVtb3ZlRWxlbWVudFxuICAgKi9cbiAgcHVibGljIHJlbW92ZVF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHRoaXMucmVtb3ZlRWxlbWVudChxdWVzdGlvbik7XG4gIH1cbiAgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzLnNsaWNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgZWxlbWVudHNbaV0ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcpIHtcbiAgICAgIHRoaXMucnVuVmlzaWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLnJ1bkVuYWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuUmVxdWlyZWRDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1blZpc2libGVDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMudmlzaWJsZUlmKSByZXR1cm47XG4gICAgdmFyIGNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy52aXNpYmxlSWYpO1xuICAgIGNvbmRpdGlvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy52aXNpYmxlID0gcmVzO1xuICAgIH07XG4gICAgY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuRW5hYmxlQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUlmKSByZXR1cm47XG4gICAgdmFyIGNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy5lbmFibGVJZik7XG4gICAgY29uZGl0aW9uUnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnJlYWRPbmx5ID0gIXJlcztcbiAgICB9O1xuICAgIGNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1blJlcXVpcmVkQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVkSWYpIHJldHVybjtcbiAgICB2YXIgY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnJlcXVpcmVkSWYpO1xuICAgIGNvbmRpdGlvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gcmVzO1xuICAgIH07XG4gICAgY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIHZhciBlbHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlbHNbaV0ub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgfVxuICB9XG4gIGNoZWNrQmluZGluZ3ModmFsdWVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgZWxzID0gdGhpcy5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgKDxCYXNlPig8YW55PmVsc1tpXSkpLmNoZWNrQmluZGluZ3ModmFsdWVOYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBkcmFnRHJvcEFkZFRhcmdldChkcmFnRHJvcEluZm86IERyYWdEcm9wSW5mbykge1xuICAgIHZhciBwcmV2Um93ID0gdGhpcy5kcmFnRHJvcEZpbmRSb3coZHJhZ0Ryb3BJbmZvLnRhcmdldCk7XG4gICAgaWYgKHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb1JvdyhkcmFnRHJvcEluZm8sIHByZXZSb3cpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyhkcmFnRHJvcEluZm8udGFyZ2V0LCBwcmV2Um93KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGRyYWdEcm9wRmluZFJvdyhmaW5kRWxlbWVudDogSVN1cnZleUVsZW1lbnQpOiBRdWVzdGlvblJvd01vZGVsIHtcbiAgICBpZiAoIWZpbmRFbGVtZW50IHx8IGZpbmRFbGVtZW50LmlzUGFnZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGVsZW1lbnQgPSA8SUVsZW1lbnQ+ZmluZEVsZW1lbnQ7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocm93c1tpXS5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpID4gLTEpIHJldHVybiByb3dzW2ldO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwbmwgPSB0aGlzLmVsZW1lbnRzW2ldLmdldFBhbmVsKCk7XG4gICAgICBpZiAoIXBubCkgY29udGludWU7XG4gICAgICB2YXIgcm93ID0gKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmRyYWdEcm9wRmluZFJvdyhlbGVtZW50KTtcbiAgICAgIGlmICghIXJvdykgcmV0dXJuIHJvdztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcEFkZFRhcmdldFRvUm93KFxuICAgIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvLFxuICAgIHByZXZSb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkcmFnRHJvcEluZm8uZGVzdGluYXRpb24pIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsKGRyYWdEcm9wSW5mbykpIHJldHVybiB0cnVlO1xuICAgIHZhciBkZXN0ID0gZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uO1xuICAgIHZhciBkZXN0Um93ID0gdGhpcy5kcmFnRHJvcEZpbmRSb3coZGVzdCk7XG4gICAgaWYgKCFkZXN0Um93KSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWRyYWdEcm9wSW5mby50YXJnZXQuc3RhcnRXaXRoTmV3TGluZSlcbiAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FeGlzdGluZ1JvdyhcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLFxuICAgICAgICBkZXN0Um93LFxuICAgICAgICBwcmV2Um93XG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9OZXdSb3coZHJhZ0Ryb3BJbmZvLCBkZXN0Um93LCBwcmV2Um93KTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsKGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvKTogYm9vbGVhbiB7XG4gICAgaWYgKGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbi5pc1BhZ2UpIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWxDb3JlKFxuICAgICAgICB0aGlzLnJvb3QsXG4gICAgICAgIGRyYWdEcm9wSW5mby50YXJnZXQsXG4gICAgICAgIGRyYWdEcm9wSW5mby5pc0JvdHRvbVxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgZGVzdCA9IDxJRWxlbWVudD5kcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgaWYgKGRlc3QuaXNQYW5lbCAmJiAhZHJhZ0Ryb3BJbmZvLmlzRWRnZSkge1xuICAgICAgdmFyIHBhbmVsID0gPFBhbmVsTW9kZWxCYXNlPig8YW55PmRlc3QpO1xuICAgICAgaWYgKCg8YW55PmRyYWdEcm9wSW5mby50YXJnZXQpW1widGVtcGxhdGVcIl0gPT09IGRlc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBkcmFnRHJvcEluZm8ubmVzdGVkUGFuZWxEZXB0aCA8IDAgfHxcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLm5lc3RlZFBhbmVsRGVwdGggPj0gcGFuZWwuZGVwdGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsQ29yZShcbiAgICAgICAgICA8UGFuZWxNb2RlbEJhc2U+KDxhbnk+ZGVzdCksXG4gICAgICAgICAgZHJhZ0Ryb3BJbmZvLnRhcmdldCxcbiAgICAgICAgICBkcmFnRHJvcEluZm8uaXNCb3R0b21cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9FeGlzdGluZ1JvdyhcbiAgICBkcmFnRHJvcEluZm86IERyYWdEcm9wSW5mbyxcbiAgICBkZXN0Um93OiBRdWVzdGlvblJvd01vZGVsLFxuICAgIHByZXZSb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIGluZGV4ID0gZGVzdFJvdy5lbGVtZW50cy5pbmRleE9mKDxJRWxlbWVudD5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24pO1xuICAgIGlmIChcbiAgICAgIGluZGV4ID09IDAgJiZcbiAgICAgICFkcmFnRHJvcEluZm8uaXNCb3R0b20gJiZcbiAgICAgIGRlc3RSb3cuZWxlbWVudHNbMF0uc3RhcnRXaXRoTmV3TGluZVxuICAgICkge1xuICAgICAgaWYgKGRlc3RSb3cuaW5kZXggPiAwKSB7XG4gICAgICAgIGRyYWdEcm9wSW5mby5pc0JvdHRvbSA9IHRydWU7XG4gICAgICAgIGRlc3RSb3cgPSBkZXN0Um93LnBhbmVsLnJvd3NbZGVzdFJvdy5pbmRleCAtIDFdO1xuICAgICAgICBkcmFnRHJvcEluZm8uZGVzdGluYXRpb24gPVxuICAgICAgICAgIGRlc3RSb3cuZWxlbWVudHNbZGVzdFJvdy5lbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0V4aXN0aW5nUm93KFxuICAgICAgICAgIGRyYWdEcm9wSW5mbyxcbiAgICAgICAgICBkZXN0Um93LFxuICAgICAgICAgIHByZXZSb3dcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9OZXdSb3coZHJhZ0Ryb3BJbmZvLCBkZXN0Um93LCBwcmV2Um93KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHByZXZSb3dJbmRleCA9IC0xO1xuICAgIGlmIChwcmV2Um93ID09IGRlc3RSb3cpIHtcbiAgICAgIHByZXZSb3dJbmRleCA9IGRlc3RSb3cuZWxlbWVudHMuaW5kZXhPZihkcmFnRHJvcEluZm8udGFyZ2V0KTtcbiAgICB9XG4gICAgaWYgKGRyYWdEcm9wSW5mby5pc0JvdHRvbSkgaW5kZXgrKztcbiAgICB2YXIgc3JjUm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGRyYWdEcm9wSW5mby5zb3VyY2UpO1xuICAgIGlmIChcbiAgICAgIHNyY1JvdyA9PSBkZXN0Um93ICYmXG4gICAgICBzcmNSb3cuZWxlbWVudHMuaW5kZXhPZihkcmFnRHJvcEluZm8uc291cmNlKSA9PSBpbmRleFxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5kZXggPT0gcHJldlJvd0luZGV4KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHByZXZSb3dJbmRleCA+IC0xKSB7XG4gICAgICBkZXN0Um93LmVsZW1lbnRzLnNwbGljZShwcmV2Um93SW5kZXgsIDEpO1xuICAgICAgaWYgKHByZXZSb3dJbmRleCA8IGluZGV4KSBpbmRleC0tO1xuICAgIH1cbiAgICBkZXN0Um93LmVsZW1lbnRzLnNwbGljZShpbmRleCwgMCwgZHJhZ0Ryb3BJbmZvLnRhcmdldCk7XG4gICAgZGVzdFJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgcmV0dXJuIHByZXZSb3dJbmRleCA8IDA7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcEFkZFRhcmdldFRvTmV3Um93KFxuICAgIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvLFxuICAgIGRlc3RSb3c6IFF1ZXN0aW9uUm93TW9kZWwsXG4gICAgcHJldlJvdzogUXVlc3Rpb25Sb3dNb2RlbFxuICApOiBib29sZWFuIHtcbiAgICB2YXIgdGFyZ2V0Um93ID0gZGVzdFJvdy5wYW5lbC5jcmVhdGVSb3dBbmRTZXRMYXp5KGRlc3RSb3cucGFuZWwucm93cy5sZW5ndGgpO1xuICAgIHRhcmdldFJvdy5hZGRFbGVtZW50KGRyYWdEcm9wSW5mby50YXJnZXQpO1xuICAgIHZhciBpbmRleCA9IGRlc3RSb3cuaW5kZXg7XG4gICAgaWYgKGRyYWdEcm9wSW5mby5pc0JvdHRvbSkge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgLy9zYW1lIHJvd1xuICAgIGlmICghIXByZXZSb3cgJiYgcHJldlJvdy5wYW5lbCA9PSB0YXJnZXRSb3cucGFuZWwgJiYgcHJldlJvdy5pbmRleCA9PSBpbmRleClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB2YXIgc3JjUm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGRyYWdEcm9wSW5mby5zb3VyY2UpO1xuICAgIGlmIChcbiAgICAgICEhc3JjUm93ICYmXG4gICAgICBzcmNSb3cucGFuZWwgPT0gdGFyZ2V0Um93LnBhbmVsICYmXG4gICAgICBzcmNSb3cuZWxlbWVudHMubGVuZ3RoID09IDEgJiZcbiAgICAgIHNyY1Jvdy5pbmRleCA9PSBpbmRleFxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBkZXN0Um93LnBhbmVsLnJvd3Muc3BsaWNlKGluZGV4LCAwLCB0YXJnZXRSb3cpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWxDb3JlKFxuICAgIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSxcbiAgICB0YXJnZXQ6IElFbGVtZW50LFxuICAgIGlzQm90dG9tOiBib29sZWFuXG4gICkge1xuICAgIHZhciB0YXJnZXRSb3cgPSBwYW5lbC5jcmVhdGVSb3coKTtcbiAgICB0YXJnZXRSb3cuYWRkRWxlbWVudCh0YXJnZXQpO1xuICAgIGlmIChwYW5lbC5lbGVtZW50cy5sZW5ndGggPT0gMCB8fCBpc0JvdHRvbSkge1xuICAgICAgcGFuZWwucm93cy5wdXNoKHRhcmdldFJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhbmVsLnJvd3Muc3BsaWNlKDAsIDAsIHRhcmdldFJvdyk7XG4gICAgfVxuICB9XG4gIGRyYWdEcm9wTW92ZUVsZW1lbnQoc3JjOiBJRWxlbWVudCwgdGFyZ2V0OiBJRWxlbWVudCwgdGFyZ2V0SW5kZXg6IG51bWJlcikge1xuICAgIHZhciBzcmNJbmRleCA9ICg8UGFuZWxNb2RlbEJhc2U+c3JjLnBhcmVudCkuZWxlbWVudHMuaW5kZXhPZihzcmMpO1xuICAgIGlmICh0YXJnZXRJbmRleCA+IHNyY0luZGV4KSB7XG4gICAgICB0YXJnZXRJbmRleC0tO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUVsZW1lbnQoc3JjKTtcbiAgICB0aGlzLmFkZEVsZW1lbnQodGFyZ2V0LCB0YXJnZXRJbmRleCk7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIGlmICh0aGlzLnJvd3MpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucm93c1tpXS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJvd3Muc3BsaWNlKDAsIHRoaXMucm93cy5sZW5ndGgpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0uZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzLnNwbGljZSgwLCB0aGlzLmVsZW1lbnRzLmxlbmd0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBlbGVtZW50LCBzaW1pbGFyIHRvIHRoZSBQYWdlIG9iamVjdHMuIEhvd2V2ZXIsIHVubGlrZSB0aGUgUGFnZSwgUGFuZWwgY2FuJ3QgYmUgYSByb290LlxuICogSXQgbWF5IGNvbnRhaW4gcXVlc3Rpb25zIGFuZCBvdGhlciBwYW5lbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYW5lbE1vZGVsIGV4dGVuZHMgUGFuZWxNb2RlbEJhc2VcbiAgaW1wbGVtZW50cyBJRWxlbWVudCwgSVRpdGxlT3duZXIge1xuICBwdWJsaWMgbWluV2lkdGg/OiBzdHJpbmc7XG4gIHB1YmxpYyBtYXhXaWR0aD86IHN0cmluZztcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwid2lkdGhcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoISFzZWxmLnBhcmVudCkge1xuICAgICAgICBzZWxmLnBhcmVudC5lbGVtZW50V2lkdGhDaGFuZ2VkKHNlbGYpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImluZGVudFwiLCBcImlubmVySW5kZW50XCIsIFwicmlnaHRJbmRlbnRcIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5vbkluZGVudENoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicGFuZWxcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvbnRlbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkICsgXCJfY29udGVudFwiO1xuICB9XG4gIHB1YmxpYyBnZXRTdXJ2ZXkobGl2ZTogYm9vbGVhbiA9IGZhbHNlKTogSVN1cnZleSB7XG4gICAgaWYgKGxpdmUpIHtcbiAgICAgIHJldHVybiAhIXRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQuZ2V0U3VydmV5KGxpdmUpIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmdldFN1cnZleShsaXZlKTtcbiAgfVxuICBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5vbkluZGVudENoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TZXREYXRhKCkge1xuICAgIHN1cGVyLm9uU2V0RGF0YSgpO1xuICAgIHRoaXMub25JbmRlbnRDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGdldCBpc1BhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBwYWdlIHdoZXJlIHRoZSBwYW5lbCBpcyBsb2NhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlKCk6IElQYWdlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlKHRoaXMucGFyZW50KTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhZ2UodmFsOiBJUGFnZSkge1xuICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhcmVudCwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZGVsZXRlKCkge1xuICAgIGlmICghIXRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLnJlbW92ZVNlbGZGcm9tTGlzdCh0aGlzLnBhcmVudC5lbGVtZW50cyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBNb3ZlIHBhbmVsIHRvIGEgbmV3IGNvbnRhaW5lciBQYWdlL1BhbmVsLiBBZGQgYXMgYSBsYXN0IGVsZW1lbnQgaWYgaW5zZXJ0QmVmb3JlIHBhcmFtZXRlciBpcyBub3QgdXNlZCBvciBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBpbmRleCxcbiAgICogaWYgaW5zZXJ0IHBhcmFtZXRlciBpcyBudW1iZXIsIG9yIGJlZm9yZSB0aGUgZ2l2ZW4gZWxlbWVudCwgaWYgdGhlIGluc2VydEJlZm9yZSBwYXJhbWV0ZXIgaXMgYSBxdWVzdGlvbiBvciBwYW5lbFxuICAgKiBAcGFyYW0gY29udGFpbmVyIFBhZ2Ugb3IgUGFuZWwgdG8gd2hlcmUgYSBxdWVzdGlvbiBpcyByZWxvY2F0ZWQuXG4gICAqIEBwYXJhbSBpbnNlcnRCZWZvcmUgVXNlIGl0IGlmIHlvdSB3YW50IHRvIHNldCB0aGUgcGFuZWwgdG8gYSBzcGVjaWZpYyBwb3NpdGlvbi4gWW91IG1heSB1c2UgYSBudW1iZXIgKHVzZSAwIHRvIGluc2VydCBpbnQgdGhlIGJlZ2lubmluZykgb3IgZWxlbWVudCwgaWYgeW91IHdhbnQgdG8gaW5zZXJ0IGJlZm9yZSB0aGlzIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgbW92ZVRvKGNvbnRhaW5lcjogSVBhbmVsLCBpbnNlcnRCZWZvcmU6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG9CYXNlKHRoaXMucGFyZW50LCBjb250YWluZXIsIGluc2VydEJlZm9yZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZpc2libGUgaW5kZXggb2YgdGhlIHBhbmVsIGluIHRoZSBzdXJ2ZXkuIENvbW1vbmx5IGl0IGlzIC0xIGFuZCBpdCBkb2Vzbid0IHNob3cuXG4gICAqIFlvdSBoYXZlIHRvIHNldCBzaG93TnVtYmVyIHRvIHRydWUgdG8gc2hvdyBpbmRleC9udW1iZXJpbmcgZm9yIHRoZSBQYW5lbFxuICAgKiBAc2VlIHNob3dOdW1iZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJbmRleFwiLCAtMSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBzaG93TnVtYmVyIHRvIHRydWUgdG8gc3RhcnQgc2hvd2luZyB0aGUgbnVtYmVyIGZvciB0aGlzIHBhbmVsLlxuICAgKiBAc2VlIHZpc2libGVJbmRleFxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TnVtYmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93TnVtYmVyXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dOdW1iZXIodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd051bWJlclwiLCB2YWwpO1xuICAgIHRoaXMubm90aWZ5U3VydmV5T25WaXNpYmlsaXR5Q2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnRzIG51bWJlcnMgaW5zaWRlIHBhbmVsIGFyZSBkaXNwbGF5ZWQuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKlxuICAgKiAtIGBkZWZhdWx0YCAtIGRpc3BsYXkgcXVlc3Rpb25zIG51bWJlcnMgYXMgZGVmaW5lZCBpbiBwYXJlbnQgcGFuZWwgb3Igc3VydmV5XG4gICAqIC0gYG9ucGFuZWxgIC0gZGlzcGxheSBxdWVzdGlvbnMgbnVtYmVycywgc3RhcnQgbnVtYmVyaW5nIGZyb20gYmVnaW5uaW5nIG9mIHRoaXMgcGFnZVxuICAgKiAtIGBvZmZgIC0gdHVybiBvZmYgdGhlIG51bWJlcmluZyBmb3IgcXVlc3Rpb25zIHRpdGxlc1xuICAgKiBAc2VlIHNob3dOdW1iZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1F1ZXN0aW9uTnVtYmVycygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsIFwiZGVmYXVsdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dRdWVzdGlvbk51bWJlcnModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIiwgdmFsdWUpO1xuICAgIHRoaXMubm90aWZ5U3VydmV5T25WaXNpYmlsaXR5Q2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGZpcnN0IHF1ZXN0aW9uIGluZGV4IGZvciBlbGVtZW50cyBpbnNpZGUgdGhlIHBhbmVsLiBUaGUgZmlyc3QgcXVlc3Rpb24gaW5kZXggaXMgJzEuJyBieSBkZWZhdWx0IGFuZCBpdCBpcyB0YWtlbiBmcm9tIHN1cnZleS5xdWVzdGlvblN0YXJ0SW5kZXggcHJvcGVydHkuXG4gICAqIFlvdSBtYXkgc3RhcnQgaXQgZnJvbSAnMTAwJyBvciBmcm9tICdBJywgYnkgc2V0dGluZyAnMTAwJyBvciAnQScgdG8gdGhpcyBwcm9wZXJ0eS5cbiAgICogWW91IGNhbiBzZXQgdGhlIHN0YXJ0IGluZGV4IHRvIFwiKDEpXCIgb3IgXCIjIEEpXCIgb3IgXCJhKVwiIHRvIHJlbmRlciBxdWVzdGlvbiBudW1iZXIgYXMgKDEpLCAjIEEpIGFuZCBhKSBhY2NvcmRpbmdseS5cbiAgICogQHNlZSBzdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4XG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uU3RhcnRJbmRleCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblN0YXJ0SW5kZXhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvblN0YXJ0SW5kZXgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblN0YXJ0SW5kZXhcIiwgdmFsKTtcbiAgfVxuICBnZXRRdWVzdGlvblN0YXJ0SW5kZXgoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnF1ZXN0aW9uU3RhcnRJbmRleCkgcmV0dXJuIHRoaXMucXVlc3Rpb25TdGFydEluZGV4O1xuICAgIHJldHVybiBzdXBlci5nZXRRdWVzdGlvblN0YXJ0SW5kZXgoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdGhlIHF1ZXN0aW9uIG51bWJlci4gSWYgcXVlc3Rpb24gaXMgaW52aXNpYmxlIHRoZW4gaXQgcmV0dXJucyBlbXB0eSBzdHJpbmcuXG4gICAqIElmIHZpc2libGVJbmRleCBpcyAxLCB0aGVuIG5vIGlzIDIsIG9yICdCJyBpZiBzdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4IGlzICdBJy5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblN0YXJ0SW5kZXhcbiAgICovXG4gIHB1YmxpYyBnZXQgbm8oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibm9cIiwgXCJcIik7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5vKHZpc2libGVJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgXCJub1wiLFxuICAgICAgSGVscGVycy5nZXROdW1iZXJCeUluZGV4KHRoaXMudmlzaWJsZUluZGV4LCB0aGlzLmdldFN0YXJ0SW5kZXgoKSlcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBiZWZvcmVTZXRWaXNpYmxlSW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHZpc2libGVJbmRleCA9IC0xO1xuICAgIGlmICh0aGlzLnNob3dOdW1iZXIgJiYgKHRoaXMuaXNEZXNpZ25Nb2RlIHx8ICF0aGlzLmxvY1RpdGxlLmlzRW1wdHkpKSB7XG4gICAgICB2aXNpYmxlSW5kZXggPSBpbmRleDtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUluZGV4XCIsIHZpc2libGVJbmRleCk7XG4gICAgdGhpcy5zZXRObyh2aXNpYmxlSW5kZXgpO1xuICAgIHJldHVybiB2aXNpYmxlSW5kZXggPCAwID8gMCA6IDE7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFBhbmVsU3RhcnRJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib2ZmXCIpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25wYW5lbFwiKSByZXR1cm4gMDtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQ29udGludWVOdW1iZXJpbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPSBcIm9mZlwiICYmIHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPSBcIm9ucGFuZWxcIlxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlTdXJ2ZXlPblZpc2liaWxpdHlDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLnN1cnZleSAhPSBudWxsICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLnN1cnZleS5wYW5lbFZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIHRoaXMuaXNWaXNpYmxlKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhc0Vycm9yc0NvcmUocmVjOiBhbnkpIHtcbiAgICBzdXBlci5oYXNFcnJvcnNDb3JlKHJlYyk7XG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQgJiYgcmVjLnJlc3VsdCAmJiByZWMuZmlyZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmV4cGFuZCgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UmVuZGVyZWRUaXRsZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFzdHIpIHtcbiAgICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkIHx8IHRoaXMuaXNFeHBhbmRlZCkgcmV0dXJuIHRoaXMubmFtZTtcbiAgICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIFwiW1wiICsgdGhpcy5uYW1lICsgXCJdXCI7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRSZW5kZXJlZFRpdGxlKHN0cik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBQYW5lbCB3aWR0aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgd2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIik7XG4gIH1cbiAgcHVibGljIHNldCB3aWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsZWZ0IGluZGVudC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gaW5jcmVhc2UgdGhlIHBhbmVsIGxlZnQgaW5kZW50LlxuICAgKi9cbiAgcHVibGljIGdldCBpbmRlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5kZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5kZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbm5lciBpbmRlbnQuIFNldCB0aGlzIHByb3BlcnR5IHRvIGluY3JlYXNlIHRoZSBwYW5lbCBjb250ZW50IG1hcmdpbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5uZXJJbmRlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5uZXJJbmRlbnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBpbm5lckluZGVudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlubmVySW5kZW50XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IHJlbmRlcldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcldpZHRoXCIpO1xuICB9XG4gIHNldCByZW5kZXJXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcldpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBQYW5lbCByZW5kZXJzIG9uIHRoZSBuZXcgbGluZSBpZiB0aGUgcHJvcGVydHkgaXMgdHJ1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGZhbHNlLCB0aGUgcGFuZWwgdHJpZXMgdG8gcmVuZGVyIG9uIHRoZSBzYW1lIGxpbmUvcm93IHdpdGggYSBwcmV2aW91cyBxdWVzdGlvbi9wYW5lbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRXaXRoTmV3TGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RhcnRXaXRoTmV3TGluZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXJ0V2l0aE5ld0xpbmUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdGFydFdpdGhOZXdMaW5lXCIsIHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHJpZ2h0IGluZGVudCBvZiB0aGUgUGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJpZ2h0SW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJpZ2h0SW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgcmlnaHRJbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyaWdodEluZGVudFwiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nTGVmdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nTGVmdFwiLCBcIlwiKTtcbiAgfVxuICBzZXQgcGFkZGluZ0xlZnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nTGVmdFwiLCB2YWwpO1xuICB9XG4gIGdldCBpbm5lclBhZGRpbmdMZWZ0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlubmVyUGFkZGluZ0xlZnRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IGlubmVyUGFkZGluZ0xlZnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbm5lclBhZGRpbmdMZWZ0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IHBhZGRpbmdSaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nUmlnaHRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IHBhZGRpbmdSaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmdSaWdodFwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgb25JbmRlbnRDaGFuZ2VkKCkge1xuICAgIGlmICghdGhpcy5nZXRTdXJ2ZXkoKSkgcmV0dXJuO1xuICAgIHRoaXMuaW5uZXJQYWRkaW5nTGVmdCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLmlubmVySW5kZW50KTtcbiAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gdGhpcy5nZXRJbmRlbnRTaXplKHRoaXMuaW5kZW50KTtcbiAgICB0aGlzLnBhZGRpbmdSaWdodCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLnJpZ2h0SW5kZW50KTtcbiAgfVxuICBwcml2YXRlIGdldEluZGVudFNpemUoaW5kZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChpbmRlbnQgPCAxKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgY3NzID0gKDxhbnk+dGhpcykuc3VydmV5W1wiY3NzXCJdO1xuICAgIGlmICghY3NzKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gaW5kZW50ICogY3NzLnF1ZXN0aW9uLmluZGVudCArIFwicHhcIjtcbiAgfVxuICBwdWJsaWMgY2xlYXJPbkRlbGV0aW5nQ29udGFpbmVyKCkge1xuICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBRdWVzdGlvbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgUGFuZWxNb2RlbCkge1xuICAgICAgICBlbGVtZW50LmNsZWFyT25EZWxldGluZ0NvbnRhaW5lcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzRWRpdEJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuc3RhdGUgPT0gXCJwcmV2aWV3XCIpIHJldHVybiB0aGlzLmRlcHRoID09IDE7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBjYW5jZWxQcmV2aWV3KCkge1xuICAgIGlmICghdGhpcy5oYXNFZGl0QnV0dG9uKSByZXR1cm47XG4gICAgdGhpcy5zdXJ2ZXkuY2FuY2VsUHJldmlld0J5UGFnZSh0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc1RpdGxlKCk6IHN0cmluZyB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuY3NzQ2xhc3Nlcy5wYW5lbC50aXRsZTtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgIHJlc3VsdCArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5wYW5lbC50aXRsZUV4cGFuZGFibGU7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRhaW5zRXJyb3JzKSB7XG4gICAgICByZXN1bHQgKz0gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMucGFuZWwudGl0bGVPbkVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzRXJyb3IoKTogc3RyaW5nIHtcbiAgICB2YXIgcm9vdENsYXNzID0gdGhpcy5jc3NDbGFzc2VzLmVycm9yLnJvb3Q7XG4gICAgcmV0dXJuIHJvb3RDbGFzcyA/IHJvb3RDbGFzcyA6IFwicGFuZWwtZXJyb3Itcm9vdFwiO1xuICB9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICB0aGlzLm5vdGlmeVN1cnZleU9uVmlzaWJpbGl0eUNoYW5nZWQoKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInBhbmVsYmFzZVwiLFxuICBbXG4gICAgXCJuYW1lXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJlbGVtZW50c1wiLFxuICAgICAgYWx0ZXJuYXRpdmVOYW1lOiBcInF1ZXN0aW9uc1wiLFxuICAgICAgYmFzZUNsYXNzTmFtZTogXCJxdWVzdGlvblwiLFxuICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICBpc0xpZ2h0U2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJ2aXNpYmxlOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIFwidmlzaWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIFwiZW5hYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJyZXF1aXJlZElmOmNvbmRpdGlvblwiLFxuICAgIFwicmVhZE9ubHk6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwiaGlkZGVuXCJdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcInRpdGxlOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7IG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGVzY3JpcHRpb25cIiB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFBhbmVsTW9kZWxCYXNlKCk7XG4gIH1cbik7XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicGFuZWxcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwic3RhdGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcImNvbGxhcHNlZFwiLCBcImV4cGFuZGVkXCJdLFxuICAgIH0sXG4gICAgXCJpc1JlcXVpcmVkOmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0OnRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZXF1aXJlZEVycm9yVGV4dFwiLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcInN0YXJ0V2l0aE5ld0xpbmU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgXCJ3aWR0aFwiLFxuICAgIHsgbmFtZTogXCJpbm5lckluZGVudDpudW1iZXJcIiwgZGVmYXVsdDogMCwgY2hvaWNlczogWzAsIDEsIDIsIDNdIH0sXG4gICAgeyBuYW1lOiBcImluZGVudDpudW1iZXJcIiwgZGVmYXVsdDogMCwgY2hvaWNlczogWzAsIDEsIDIsIDNdIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJwYWdlXCIsXG4gICAgICBpc1NlcmlhbGl6YWJsZTogZmFsc2UsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHZhciBzdXJ2ZXkgPSBvYmogPyBvYmouc3VydmV5IDogbnVsbDtcbiAgICAgICAgcmV0dXJuICFzdXJ2ZXkgfHwgc3VydmV5LnBhZ2VzLmxlbmd0aCA+IDE7XG4gICAgICB9LFxuICAgICAgY2hvaWNlczogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgdmFyIHN1cnZleSA9IG9iaiA/IG9iai5zdXJ2ZXkgOiBudWxsO1xuICAgICAgICByZXR1cm4gc3VydmV5XG4gICAgICAgICAgPyBzdXJ2ZXkucGFnZXMubWFwKChwOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHAubmFtZSwgdGV4dDogcC50aXRsZSB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IFtdO1xuICAgICAgfSxcbiAgICB9LFxuICAgIFwic2hvd051bWJlcjpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJvbnBhbmVsXCIsIFwib2ZmXCJdLFxuICAgIH0sXG4gICAgXCJxdWVzdGlvblN0YXJ0SW5kZXhcIixcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQYW5lbE1vZGVsKCk7XG4gIH0sXG4gIFwicGFuZWxiYXNlXCJcbik7XG5cbkVsZW1lbnRGYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyRWxlbWVudChcInBhbmVsXCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUGFuZWxNb2RlbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgQmFzZSwgRXZlbnRCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xyXG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcclxuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xyXG5pbXBvcnQge1xyXG4gIFBvcHVwVXRpbHMsXHJcbiAgVmVydGljYWxQb3NpdGlvbixcclxuICBIb3Jpem9udGFsUG9zaXRpb24sXHJcbiAgSVBvc2l0aW9uLFxyXG4gIElTaXplLFxyXG59IGZyb20gXCIuL3V0aWxzL3BvcHVwXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUG9wdXBNb2RlbCBleHRlbmRzIEJhc2Uge1xyXG4gIEBwcm9wZXJ0eSgpIGNvbnRlbnRDb21wb25lbnROYW1lOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KCkgY29udGVudENvbXBvbmVudERhdGE6IGFueTtcclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IFwiYm90dG9tXCIgfSkgdmVydGljYWxQb3NpdGlvbjogVmVydGljYWxQb3NpdGlvbjtcclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IFwibGVmdFwiIH0pIGhvcml6b250YWxQb3NpdGlvbjogSG9yaXpvbnRhbFBvc2l0aW9uO1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogZmFsc2UgfSkgc2hvd1BvaW50ZXI6IGJvb2xlYW47XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBmYWxzZSB9KSBpc01vZGFsOiBib29sZWFuO1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogKCkgPT4ge30gfSkgb25DYW5jZWw6ICgpID0+IHZvaWQ7XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiAoKSA9PiB7cmV0dXJuIHRydWU7fSB9KSBvbkFwcGx5OiAoKSA9PiBib29sZWFuO1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogKCkgPT4ge30gfSkgb25IaWRlOiAoKSA9PiB2b2lkO1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogKCkgPT4ge30gfSkgb25TaG93OiAoKSA9PiB2b2lkO1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogXCJcIiB9KSBjc3NDbGFzczogc3RyaW5nO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgY29udGVudENvbXBvbmVudE5hbWU6IHN0cmluZyxcclxuICAgIGNvbnRlbnRDb21wb25lbnREYXRhOiBhbnksXHJcbiAgICB2ZXJ0aWNhbFBvc2l0aW9uOiBWZXJ0aWNhbFBvc2l0aW9uID0gXCJib3R0b21cIixcclxuICAgIGhvcml6b250YWxQb3NpdGlvbjogSG9yaXpvbnRhbFBvc2l0aW9uID0gXCJsZWZ0XCIsXHJcbiAgICBzaG93UG9pbnRlcjogYm9vbGVhbiA9IHRydWUsXHJcbiAgICBpc01vZGFsOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBvbkNhbmNlbCA9ICgpID0+IHt9LFxyXG4gICAgb25BcHBseSA9ICgpID0+IHtyZXR1cm4gdHJ1ZTt9LFxyXG4gICAgb25IaWRlID0gKCkgPT4ge30sXHJcbiAgICBvblNob3cgPSAoKSA9PiB7fSxcclxuICAgIGNzc0NsYXNzOiBzdHJpbmcgPSBcIlwiXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSA9IGNvbnRlbnRDb21wb25lbnROYW1lO1xyXG4gICAgdGhpcy5jb250ZW50Q29tcG9uZW50RGF0YSA9IGNvbnRlbnRDb21wb25lbnREYXRhO1xyXG4gICAgdGhpcy52ZXJ0aWNhbFBvc2l0aW9uID0gdmVydGljYWxQb3NpdGlvbjtcclxuICAgIHRoaXMuaG9yaXpvbnRhbFBvc2l0aW9uID0gaG9yaXpvbnRhbFBvc2l0aW9uO1xyXG4gICAgdGhpcy5zaG93UG9pbnRlciA9IHNob3dQb2ludGVyO1xyXG4gICAgdGhpcy5pc01vZGFsID0gaXNNb2RhbDtcclxuICAgIHRoaXMub25DYW5jZWwgPSBvbkNhbmNlbDtcclxuICAgIHRoaXMub25BcHBseSA9IG9uQXBwbHk7XHJcbiAgICB0aGlzLm9uSGlkZSA9IG9uSGlkZTtcclxuICAgIHRoaXMub25TaG93ID0gb25TaG93O1xyXG4gICAgdGhpcy5jc3NDbGFzcyA9IGNzc0NsYXNzO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgZmFsc2UpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGlzVmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdmFsdWUpO1xyXG4gICAgdGhpcy5vblZpc2liaWxpdHlDaGFuZ2VkICYmIHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlZCh2YWx1ZSk7XHJcbiAgICBpZiAodGhpcy5pc1Zpc2libGUpIHtcclxuICAgICAgdGhpcy5vblNob3coKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub25IaWRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyB0b2dnbGVWaXNpYmlsaXR5KCkge1xyXG4gICAgdGhpcy5pc1Zpc2libGUgPSAhdGhpcy5pc1Zpc2libGU7XHJcbiAgfVxyXG4gIHB1YmxpYyBvblZpc2liaWxpdHlDaGFuZ2VkOiAoaXNWaXNpYmxlOiBib29sZWFuKSA9PiB2b2lkO1xyXG59XHJcblxyXG5jb25zdCBGT0NVU19JTlBVVF9TRUxFQ1RPUiA9XHJcbiAgXCJpbnB1dDpub3QoOmRpc2FibGVkKTpub3QoW3JlYWRvbmx5XSk6bm90KFt0eXBlPWhpZGRlbl0pLHNlbGVjdDpub3QoOmRpc2FibGVkKTpub3QoW3JlYWRvbmx5XSksdGV4dGFyZWE6bm90KDpkaXNhYmxlZCk6bm90KFtyZWFkb25seV0pLCBidXR0b246bm90KDpkaXNhYmxlZCk6bm90KFtyZWFkb25seV0pXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUG9wdXBCYXNlVmlld01vZGVsIGV4dGVuZHMgQmFzZSB7XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBcIjBweFwiIH0pIHRvcDogc3RyaW5nO1xyXG4gIEBwcm9wZXJ0eSh7IGRlZmF1bHRWYWx1ZTogXCIwcHhcIiB9KSBsZWZ0OiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBcImF1dG9cIiB9KSBoZWlnaHQ6IHN0cmluZztcclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IGZhbHNlIH0pIGlzVmlzaWJsZTogYm9vbGVhbjtcclxuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IFwibGVmdFwiIH0pIHBvcHVwRGlyZWN0aW9uOiBzdHJpbmc7XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiB7IGxlZnQ6IFwiMHB4XCIsIHRvcDogXCIwcHhcIiB9IH0pXHJcbiAgcG9pbnRlclRhcmdldDogSVBvc2l0aW9uO1xyXG4gIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtb2RlbDogUG9wdXBNb2RlbCwgcHVibGljIHRhcmdldEVsZW1lbnQ/OiBIVE1MRWxlbWVudCkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMubW9kZWwucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJpc1Zpc2libGVcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzVmlzaWJsZSA9IHRoaXMubW9kZWwuaXNWaXNpYmxlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgY29udGVudENvbXBvbmVudE5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGVsLmNvbnRlbnRDb21wb25lbnROYW1lO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGNvbnRlbnRDb21wb25lbnREYXRhKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5jb250ZW50Q29tcG9uZW50RGF0YTtcclxuICB9XHJcbiAgcHVibGljIGdldCBzaG93UG9pbnRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGVsLnNob3dQb2ludGVyO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGlzTW9kYWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5pc01vZGFsO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHN0eWxlQ2xhc3MoKTogc3RyaW5nIHtcclxuICAgIGxldCBjc3MgPSB0aGlzLm1vZGVsLmNzc0NsYXNzO1xyXG4gICAgaWYgKHRoaXMuaXNNb2RhbCkge1xyXG4gICAgICBjc3MgKz0gXCIgc3YtcG9wdXAtLW1vZGFsXCI7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2hvd1BvaW50ZXIpIHtcclxuICAgICAgY3NzICs9IFwiIHN2LXBvcHVwLS1zaG93LXBvaW50ZXJcIjtcclxuICAgICAgY3NzICs9IGAgc3YtcG9wdXAtLSR7dGhpcy5wb3B1cERpcmVjdGlvbn1gO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjc3M7XHJcbiAgfVxyXG4gIHB1YmxpYyBvbktleURvd24oZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIiB8fCBldmVudC5rZXlDb2RlID09PSA5KSB7XHJcbiAgICAgIHRoaXMudHJhcEZvY3VzKGV2ZW50KTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIkVzY2FwZVwiIHx8IGV2ZW50LmtleUNvZGUgPT09IDI3KSB7XHJcbiAgICAgIGlmICh0aGlzLmlzTW9kYWwpIHtcclxuICAgICAgICB0aGlzLm1vZGVsLm9uQ2FuY2VsKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tb2RlbC5pc1Zpc2libGUgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSB0cmFwRm9jdXMoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKFxyXG4gICAgICBGT0NVU19JTlBVVF9TRUxFQ1RPUlxyXG4gICAgKTtcclxuICAgIGNvbnN0IGZpcnN0Rm9jdXNhYmxlRWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzWzBdO1xyXG4gICAgY29uc3QgbGFzdEZvY3VzYWJsZUVsZW1lbnQgPVxyXG4gICAgICBmb2N1c2FibGVFbGVtZW50c1tmb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxXTtcclxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xyXG4gICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZmlyc3RGb2N1c2FibGVFbGVtZW50KSB7XHJcbiAgICAgICAgKDxIVE1MRWxlbWVudD5sYXN0Rm9jdXNhYmxlRWxlbWVudCkuZm9jdXMoKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gbGFzdEZvY3VzYWJsZUVsZW1lbnQpIHtcclxuICAgICAgICAoPEhUTUxFbGVtZW50PmZpcnN0Rm9jdXNhYmxlRWxlbWVudCkuZm9jdXMoKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyB1cGRhdGVPblNob3dpbmcoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNNb2RhbCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvY3VzRmlyc3RJbnB1dCgpO1xyXG4gIH1cclxuICBwcml2YXRlIHVwZGF0ZVBvc2l0aW9uKCkge1xyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMudGFyZ2V0RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IGJhY2tncm91bmQgPSA8SFRNTEVsZW1lbnQ+dGhpcy5jb250YWluZXIuY2hpbGRyZW5bMF07XHJcbiAgICBjb25zdCBwb3B1cENvbnRhaW5lciA9IDxIVE1MRWxlbWVudD5iYWNrZ3JvdW5kLmNoaWxkcmVuWzBdO1xyXG4gICAgY29uc3Qgc2Nyb2xsQ29udGVudCA9IDxIVE1MRWxlbWVudD5iYWNrZ3JvdW5kLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdO1xyXG4gICAgY29uc3QgaGVpZ2h0ID1cclxuICAgICAgcG9wdXBDb250YWluZXIub2Zmc2V0SGVpZ2h0IC1cclxuICAgICAgc2Nyb2xsQ29udGVudC5vZmZzZXRIZWlnaHQgK1xyXG4gICAgICBzY3JvbGxDb250ZW50LnNjcm9sbEhlaWdodDtcclxuICAgIGNvbnN0IHdpZHRoID0gcG9wdXBDb250YWluZXIub2Zmc2V0V2lkdGg7XHJcbiAgICB0aGlzLmhlaWdodCA9IFwiYXV0b1wiO1xyXG4gICAgbGV0IHZlcnRpY2FsUG9zaXRpb24gPSB0aGlzLm1vZGVsLnZlcnRpY2FsUG9zaXRpb247XHJcbiAgICBpZiAoISF3aW5kb3cpIHtcclxuICAgICAgdmVydGljYWxQb3NpdGlvbiA9IFBvcHVwVXRpbHMudXBkYXRlVmVydGljYWxQb3NpdGlvbihcclxuICAgICAgICByZWN0LFxyXG4gICAgICAgIGhlaWdodCxcclxuICAgICAgICB0aGlzLm1vZGVsLnZlcnRpY2FsUG9zaXRpb24sXHJcbiAgICAgICAgdGhpcy5tb2RlbC5zaG93UG9pbnRlcixcclxuICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMucG9wdXBEaXJlY3Rpb24gPSBQb3B1cFV0aWxzLmNhbGN1bGF0ZVBvcHVwRGlyZWN0aW9uKFxyXG4gICAgICB2ZXJ0aWNhbFBvc2l0aW9uLFxyXG4gICAgICB0aGlzLm1vZGVsLmhvcml6b250YWxQb3NpdGlvblxyXG4gICAgKTtcclxuICAgIGNvbnN0IHBvcyA9IFBvcHVwVXRpbHMuY2FsY3VsYXRlUG9zaXRpb24oXHJcbiAgICAgIHJlY3QsXHJcbiAgICAgIGhlaWdodCxcclxuICAgICAgd2lkdGgsXHJcbiAgICAgIHZlcnRpY2FsUG9zaXRpb24sXHJcbiAgICAgIHRoaXMubW9kZWwuaG9yaXpvbnRhbFBvc2l0aW9uLFxyXG4gICAgICB0aGlzLnNob3dQb2ludGVyXHJcbiAgICApO1xyXG5cclxuICAgIGlmICghIXdpbmRvdykge1xyXG4gICAgICBjb25zdCBuZXdWZXJ0aWNhbERpbWVuc2lvbnMgPSBQb3B1cFV0aWxzLnVwZGF0ZVZlcnRpY2FsRGltZW5zaW9ucyhcclxuICAgICAgICBwb3MudG9wLFxyXG4gICAgICAgIGhlaWdodCxcclxuICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHRcclxuICAgICAgKTtcclxuICAgICAgaWYgKCEhbmV3VmVydGljYWxEaW1lbnNpb25zKSB7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBuZXdWZXJ0aWNhbERpbWVuc2lvbnMuaGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICAgIHBvcy50b3AgPSBuZXdWZXJ0aWNhbERpbWVuc2lvbnMudG9wO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmxlZnQgPSBwb3MubGVmdCArIFwicHhcIjtcclxuICAgIHRoaXMudG9wID0gcG9zLnRvcCArIFwicHhcIjtcclxuXHJcbiAgICBpZiAodGhpcy5zaG93UG9pbnRlcikge1xyXG4gICAgICB0aGlzLnBvaW50ZXJUYXJnZXQgPSBQb3B1cFV0aWxzLmNhbGN1bGF0ZVBvaW50ZXJUYXJnZXQoXHJcbiAgICAgICAgcmVjdCxcclxuICAgICAgICBwb3MudG9wLFxyXG4gICAgICAgIHBvcy5sZWZ0LFxyXG4gICAgICAgIHZlcnRpY2FsUG9zaXRpb24sXHJcbiAgICAgICAgdGhpcy5tb2RlbC5ob3Jpem9udGFsUG9zaXRpb25cclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMucG9pbnRlclRhcmdldC50b3AgKz0gXCJweFwiO1xyXG4gICAgdGhpcy5wb2ludGVyVGFyZ2V0LmxlZnQgKz0gXCJweFwiO1xyXG4gIH1cclxuICBwcml2YXRlIGZvY3VzRmlyc3RJbnB1dCgpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB2YXIgZWwgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKEZPQ1VTX0lOUFVUX1NFTEVDVE9SKTtcclxuICAgICAgaWYgKCEhZWwpICg8SFRNTEVsZW1lbnQ+ZWwpLmZvY3VzKCk7XHJcbiAgICAgIGVsc2UgKDxIVE1MRWxlbWVudD50aGlzLmNvbnRhaW5lci5jaGlsZHJlblswXSkuZm9jdXMoKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBjbGlja091dHNpZGUoKSB7XHJcbiAgICBpZiAodGhpcy5pc01vZGFsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubW9kZWwuaXNWaXNpYmxlID0gZmFsc2U7XHJcbiAgfVxyXG4gIHB1YmxpYyBjYW5jZWwoKSB7XHJcbiAgICB0aGlzLm1vZGVsLm9uQ2FuY2VsKCk7XHJcbiAgICB0aGlzLm1vZGVsLmlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gIH1cclxuICBwdWJsaWMgYXBwbHkoKSB7XHJcbiAgICBpZiAoISF0aGlzLm1vZGVsLm9uQXBwbHkgJiYgIXRoaXMubW9kZWwub25BcHBseSgpKSByZXR1cm47XHJcbiAgICB0aGlzLm1vZGVsLmlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGNhbmNlbEJ1dHRvblRleHQoKSB7XHJcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1vZGFsQ2FuY2VsQnV0dG9uVGV4dFwiKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBhcHBseUJ1dHRvblRleHQoKSB7XHJcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1vZGFsQXBwbHlCdXR0b25UZXh0XCIpO1xyXG4gIH1cclxuICBwdWJsaWMgZGlzcG9zZSgpIHtcclxuICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMubW9kZWwub25WaXNpYmlsaXR5Q2hhbmdlZCA9IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcHVibGljIGNyZWF0ZVBvcHVwQ29udGFpbmVyKCkge1xyXG4gICAgY29uc3QgY29udGFpbmVyOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICB9XHJcbiAgcHVibGljIG1vdW50UG9wdXBDb250YWluZXIoKSB7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcclxuICB9XHJcbiAgcHVibGljIGluaXRpYWxpemVQb3B1cENvbnRhaW5lcigpIHtcclxuICAgIHRoaXMuY3JlYXRlUG9wdXBDb250YWluZXIoKTtcclxuICAgIHRoaXMubW91bnRQb3B1cENvbnRhaW5lcigpO1xyXG4gIH1cclxuICBwdWJsaWMgZGVzdHJveVBvcHVwQ29udGFpbmVyKCkge1xyXG4gICAgdGhpcy5jb250YWluZXIucmVtb3ZlKCk7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCwgU2VyaWFsaXplciwgcHJvcGVydHkgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBCYXNlLCBFdmVudEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQge1xuICBJRWxlbWVudCxcbiAgSVF1ZXN0aW9uLFxuICBJUGFuZWwsXG4gIElDb25kaXRpb25SdW5uZXIsXG4gIElTdXJ2ZXlJbXBsLFxuICBJUGFnZSxcbiAgSVRpdGxlT3duZXIsXG4gIElQcm9ncmVzc0luZm8sXG4gIElTdXJ2ZXksXG59IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuL3N1cnZleS1lbGVtZW50XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBBbnN3ZXJSZXF1aXJlZEVycm9yLCBDdXN0b21FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlWYWxpZGF0b3IsIElWYWxpZGF0b3JPd25lciwgVmFsaWRhdG9yUnVubmVyIH0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yLCBUZXh0UHJlUHJvY2Vzc29yVmFsdWUgfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyLCBFeHByZXNzaW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25DdXN0b21XaWRnZXQgfSBmcm9tIFwiLi9xdWVzdGlvbkN1c3RvbVdpZGdldHNcIjtcbmltcG9ydCB7IEN1c3RvbVdpZGdldENvbGxlY3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvbkN1c3RvbVdpZGdldHNcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4vc3VydmV5XCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsIH0gZnJvbSBcIi4vcGFuZWxcIjtcbmltcG9ydCB7IFJlbmRlcmVyRmFjdG9yeSB9IGZyb20gXCIuL3JlbmRlcmVyRmFjdG9yeVwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9zdXJ2ZXktZXJyb3JcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQ29uZGl0aW9uT2JqZWN0IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGFsbCBxdWVzdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbiBleHRlbmRzIFN1cnZleUVsZW1lbnRcbiAgaW1wbGVtZW50c1xuICAgIElRdWVzdGlvbixcbiAgICBJQ29uZGl0aW9uUnVubmVyLFxuICAgIElMb2NhbGl6YWJsZU93bmVyLFxuICAgIElWYWxpZGF0b3JPd25lcixcbiAgICBJVGl0bGVPd25lciB7XG4gIFtpbmRleDogc3RyaW5nXTogYW55O1xuICBwcml2YXRlIHN0YXRpYyBUZXh0UHJlcHJvY2Vzc29yVmFsdWVzTWFwID0ge1xuICAgIHRpdGxlOiBcInByb2Nlc3NlZFRpdGxlXCIsXG4gICAgcmVxdWlyZTogXCJyZXF1aXJlZFRleHRcIixcbiAgfTtcbiAgcHJpdmF0ZSBzdGF0aWMgcXVlc3Rpb25Db3VudGVyID0gMTAwO1xuICBwcml2YXRlIHN0YXRpYyBnZXRRdWVzdGlvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3FfXCIgKyBRdWVzdGlvbi5xdWVzdGlvbkNvdW50ZXIrKztcbiAgfVxuICBwcml2YXRlIGNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyID0gbnVsbDtcbiAgcHJpdmF0ZSBpc0N1c3RvbVdpZGdldFJlcXVlc3RlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjdXN0b21XaWRnZXRWYWx1ZTogUXVlc3Rpb25DdXN0b21XaWRnZXQ7XG4gIGN1c3RvbVdpZGdldERhdGEgPSB7IGlzTmVlZFJlbmRlcjogdHJ1ZSB9O1xuICBmb2N1c0NhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBzdXJ2ZXlMb2FkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIGRpc3BsYXlWYWx1ZUNhbGxiYWNrOiAodGV4dDogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSB0ZXh0UHJlUHJvY2Vzc29yOiBUZXh0UHJlUHJvY2Vzc29yO1xuICBwcml2YXRlIGNvbmRpdGlvbkVuYWJlbFJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICBwcml2YXRlIGNvbmRpdGlvblJlcXVpcmVkUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHZhbHVlQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb21tZW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICB2YWxpZGF0ZVZhbHVlQ2FsbGJhY2s6ICgpID0+IFN1cnZleUVycm9yO1xuICBxdWVzdGlvblRpdGxlVGVtcGxhdGVDYWxsYmFjazogKCkgPT4gc3RyaW5nO1xuICBhZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2s6IChxdWVzdGlvbjogUXVlc3Rpb24sIGVsZW1lbnQ6IGFueSkgPT4gYW55O1xuICB2YWx1ZUZyb21EYXRhQ2FsbGJhY2s6ICh2YWw6IGFueSkgPT4gYW55O1xuICB2YWx1ZVRvRGF0YUNhbGxiYWNrOiAodmFsOiBhbnkpID0+IGFueTtcbiAgb25HZXRTdXJ2ZXk6ICgpID0+IElTdXJ2ZXk7XG4gIHByaXZhdGUgbG9jUHJvY2Vzc2VkVGl0bGU6IExvY2FsaXphYmxlU3RyaW5nO1xuICBwcm90ZWN0ZWQgaXNSZWFkeVZhbHVlOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gaXNSZWFkeSBwcm9wZXJ0eSBvZiBxdWVzdGlvbiBpcyBjaGFuZ2VkLlxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIC0gdGhlIHF1ZXN0aW9uXG4gICAqIDxici8+IG9wdGlvbnMuaXNSZWFkeSAtIGN1cnJlbnQgdmFsdWUgb2YgaXNSZWFkeVxuICAgKiA8YnIvPiBvcHRpb25zLm9sZElzUmVhZHkgLSBvbGQgdmFsdWUgb2YgaXNSZWFkeVxuICAgKi9cbiAgcHVibGljIG9uUmVhZHlDaGFuZ2VkOiBFdmVudEJhc2U8UXVlc3Rpb24+ID0gdGhpcy5hZGRFdmVudDxRdWVzdGlvbj4oKTtcblxuICBwdWJsaWMgaXNSZWFkT25seVJlbmRlckRpdigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlYWRPbmx5ICYmIHNldHRpbmdzLnJlYWRPbmx5Q29tbWVudFJlbmRlck1vZGUgPT09IFwiZGl2XCI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmlkID0gUXVlc3Rpb24uZ2V0UXVlc3Rpb25JZCgpO1xuICAgIHRoaXMub25DcmVhdGluZygpO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJ2YWxpZGF0b3JzXCIsICh2YWxpZGF0b3I6IGFueSkgPT4ge1xuICAgICAgdmFsaWRhdG9yLmVycm9yT3duZXIgPSB0aGlzO1xuICAgIH0pO1xuICAgIHZhciBsb2NUaXRsZVZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIsIHRoaXMsIHRydWUpO1xuICAgIGxvY1RpdGxlVmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIGlmICghdGV4dCkge1xuICAgICAgICB0ZXh0ID0gdGhpcy5uYW1lO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuIHRleHQ7XG4gICAgICByZXR1cm4gdGhpcy5zdXJ2ZXkuZ2V0VXBkYXRlZFF1ZXN0aW9uVGl0bGUodGhpcywgdGV4dCk7XG4gICAgfTtcbiAgICB0aGlzLmxvY1Byb2Nlc3NlZFRpdGxlID0gbmV3IExvY2FsaXphYmxlU3RyaW5nKHRoaXMsIHRydWUpO1xuICAgIHRoaXMubG9jUHJvY2Vzc2VkVGl0bGUuc2hhcmVkRGF0YSA9IGxvY1RpdGxlVmFsdWU7XG4gICAgdmFyIGxvY0NvbW1lbnRUZXh0ID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwiY29tbWVudFRleHRcIixcbiAgICAgIHRoaXMsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBsb2NDb21tZW50VGV4dC5vbkdldFRleHRDYWxsYmFjayA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJJdGVtVGV4dFwiKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ3aWR0aFwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uQ3NzKCk7XG4gICAgICBpZiAoISF0aGlzLnBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudC5lbGVtZW50V2lkdGhDaGFuZ2VkKHRoaXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJpc1JlcXVpcmVkXCIsICgpID0+IHtcbiAgICAgIHRoaXMubG9jVGl0bGUub25DaGFuZ2VkKCk7XG4gICAgICB0aGlzLmNzc0NsYXNzZXNWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJpbmRlbnRcIiwgXCJyaWdodEluZGVudFwiXSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5vbkluZGVudENoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiaGFzQ29tbWVudFwiLCBcImhhc090aGVyXCJdLFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRDb21tZW50RnJvbVN1cnZleSgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldFN1cnZleShsaXZlOiBib29sZWFuID0gZmFsc2UpOiBJU3VydmV5IHtcbiAgICBpZiAobGl2ZSkge1xuICAgICAgcmV0dXJuICEhdGhpcy5wYXJlbnQgPyAoPEJhc2U+KDxhbnk+dGhpcy5wYXJlbnQpKS5nZXRTdXJ2ZXkobGl2ZSkgOiBudWxsO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLm9uR2V0U3VydmV5KSByZXR1cm4gdGhpcy5vbkdldFN1cnZleSgpO1xuICAgIHJldHVybiBzdXBlci5nZXRTdXJ2ZXkoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWVOYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy52YWx1ZU5hbWUpIHJldHVybiB0aGlzLnZhbHVlTmFtZS50b1N0cmluZygpO1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IGlmIHlvdSB3YW50IHRvIHN0b3JlIHRoZSBxdWVzdGlvbiByZXN1bHQgaW4gdGhlIG5hbWUgZGlmZmVyZW50IGZyb20gdGhlIHF1ZXN0aW9uIG5hbWUuXG4gICAqIFF1ZXN0aW9uIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgc3VydmV5IGFuZCB2YWx1ZU5hbWUgY291bGQgYmUgbm90IHVuaXF1ZS4gSXQgYWxsb3dzIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiBzZXZlcmFsIHF1ZXN0aW9ucyB3aXRoIHRoZSBzYW1lIHZhbHVlTmFtZS5cbiAgICogVGhlIGxpYnJhcnkgc2V0IHRoZSB2YWx1ZSBhdXRvbWF0aWNhbGx5IGlmIHRoZSBxdWVzdGlvbi5uYW1lIHByb3BlcnR5IGlzIG5vdCB2YWxpZC4gRm9yIGV4YW1wbGUsIGlmIGl0IGNvbnRhaW5zIHRoZSBwZXJpb2QgJy4nIHN5bWJvbC5cbiAgICogSW4gdGhpcyBjYXNlIGlmIHlvdSBzZXQgdGhlIHF1ZXN0aW9uLm5hbWUgcHJvcGVydHkgdG8gJ3gueScgdGhlbiB0aGUgdmFsdWVOYW1lIGJlY29tZXMgJ3ggeScuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBmb3IgcXVlc3Rpb25zIHdpdGhvdXQgaW5wdXQsIGZvciBleGFtcGxlIGh0bWwgcXVlc3Rpb24uXG4gICAqIEBzZWUgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWVOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdmFyIG9sZFZhbHVlTmFtZSA9IHRoaXMuZ2V0VmFsdWVOYW1lKCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVOYW1lXCIsIHZhbCk7XG4gICAgdGhpcy5vblZhbHVlTmFtZUNoYW5nZWQob2xkVmFsdWVOYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WYWx1ZU5hbWVDaGFuZ2VkKG9sZFZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm47XG4gICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25SZW5hbWVkKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgICEhb2xkVmFsdWUgPyBvbGRWYWx1ZSA6IHRoaXMubmFtZVxuICAgICk7XG4gICAgdGhpcy5pbml0RGF0YUZyb21TdXJ2ZXkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25OYW1lQ2hhbmdlZChvbGRWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2NUaXRsZS5vbkNoYW5nZWQoKTtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm47XG4gICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25SZW5hbWVkKFxuICAgICAgdGhpcyxcbiAgICAgIG9sZFZhbHVlLFxuICAgICAgdGhpcy52YWx1ZU5hbWUgPyB0aGlzLnZhbHVlTmFtZSA6IG9sZFZhbHVlXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZWFkeVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgaXMgcXVlc3Rpb24gcmVhZHkgdG8gdXNlXG4gICAqL1xuICBwdWJsaWMgY2hvaWNlc0xvYWRlZCgpOiB2b2lkIHt9XG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBwYWdlIHdoZXJlIHRoZSBxdWVzdGlvbiBpcyBsb2NhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlKCk6IElQYWdlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlKHRoaXMucGFyZW50KTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhZ2UodmFsOiBJUGFnZSkge1xuICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhcmVudCwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0UGFuZWwoKTogSVBhbmVsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZGVsZXRlKCkge1xuICAgIGlmICghIXRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLnJlbW92ZVNlbGZGcm9tTGlzdCh0aGlzLnBhcmVudC5lbGVtZW50cyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaXNGbG93TGF5b3V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldExheW91dFR5cGUoKSA9PT0gXCJmbG93XCI7XG4gIH1cbiAgcHVibGljIGdldExheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldENoaWxkcmVuTGF5b3V0VHlwZSgpO1xuICAgIHJldHVybiBcInJvd1wiO1xuICB9XG4gIGlzTGF5b3V0VHlwZVN1cHBvcnRlZChsYXlvdXRUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbGF5b3V0VHlwZSAhPT0gXCJmbG93XCI7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBnZXQvc2V0IHRoZSBxdWVzdGlvbiB2aXNpYmlsaXR5LlxuICAgKiBAc2VlIHZpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsID09IHRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdmFsKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICB0aGlzLm5vdGlmeVN1cnZleVZpc2liaWxpdHlDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIHRoaXMuaXNWaXNpYmxlKTtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNDbGVhclZhbHVlT25IaWRkZW4pIHtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSAmJiB0aGlzLmVycm9ycyAmJiB0aGlzLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIGNob29zZSBob3cgb3RoZXIgcXVlc3Rpb24gdmFsdWVzIHdpbGwgYmUgcmVuZGVyZWQgaW4gdGl0bGUgaWYgcmVmZXJlbmNlZCBpbiB7fS5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCB1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidXNlRGlzcGxheVZhbHVlc0luVGl0bGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIHRydWUgdGhlIFF1ZXN0aW9uIGJlY29tZXMgdmlzaWJsZSBhbmQgaWYgaXQgcmV0dXJucyBmYWxzZSB0aGUgUXVlc3Rpb24gYmVjb21lcyBpbnZpc2libGUuIFRoZSBsaWJyYXJ5IHJ1bnMgdGhlIGV4cHJlc3Npb24gb24gc3VydmV5IHN0YXJ0IGFuZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZhbHVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZW1wdHkgdGhlbiB2aXNpYmxlIHByb3BlcnR5IGlzIHVzZWQuXG4gICAqIEBzZWUgdmlzaWJsZVxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIHZhbCk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gaXMgdmlzaWJsZSBvciBzdXJ2ZXkgaXMgaW4gZGVzaWduIG1vZGUgcmlnaHQgbm93LlxuICAgKi9cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmFyZUVtcHR5RWxlbWVudHNIaWRkZW4gJiYgdGhpcy5pc0VtcHR5KCkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZSB8fCB0aGlzLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmlzaWJsZSBpbmRleCBvZiB0aGUgcXVlc3Rpb24gaW4gdGhlIHN1cnZleS4gSXQgY2FuIGJlIGZyb20gMCB0byBhbGwgdmlzaWJsZSBxdWVzdGlvbnMgY291bnQgLSAxXG4gICAqIFRoZSB2aXNpYmxlSW5kZXggaXMgLTEgaWYgdGhlIHRpdGxlIGlzICdoaWRkZW4nIG9yIGhpZGVOdW1iZXIgaXMgdHJ1ZVxuICAgKiBAc2VlIHRpdGxlTG9jYXRpb25cbiAgICogQHNlZSBoaWRlTnVtYmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgLTEpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaGlkZU51bWJlciB0byB0cnVlIHRvIHN0b3Agc2hvd2luZyB0aGUgbnVtYmVyIGZvciB0aGlzIHF1ZXN0aW9uLiBUaGUgcXVlc3Rpb24gd2lsbCBub3QgYmUgY291bnRlclxuICAgKiBAc2VlIHZpc2libGVJbmRleFxuICAgKiBAc2VlIHRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgaGlkZU51bWJlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZU51bWJlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhpZGVOdW1iZXIodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZU51bWJlclwiLCB2YWwpO1xuICAgIHRoaXMubm90aWZ5U3VydmV5VmlzaWJpbGl0eUNoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBtYXkgaGF2ZSBhIHRpdGxlIGxvY2F0ZWQgb24gdGhlIGxlZnRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGFzIGEgc3RyaW5nIGFzIGl0IHJlcHJlc2VudHMgaW4gdGhlIGpzb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInF1ZXN0aW9uXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1F1ZXN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBNb3ZlIHF1ZXN0aW9uIHRvIGEgbmV3IGNvbnRhaW5lciBQYWdlL1BhbmVsLiBBZGQgYXMgYSBsYXN0IGVsZW1lbnQgaWYgaW5zZXJ0QmVmb3JlIHBhcmFtZXRlciBpcyBub3QgdXNlZCBvciBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBpbmRleCxcbiAgICogaWYgaW5zZXJ0IHBhcmFtZXRlciBpcyBudW1iZXIsIG9yIGJlZm9yZSB0aGUgZ2l2ZW4gZWxlbWVudCwgaWYgdGhlIGluc2VydEJlZm9yZSBwYXJhbWV0ZXIgaXMgYSBxdWVzdGlvbiBvciBwYW5lbFxuICAgKiBAcGFyYW0gY29udGFpbmVyIFBhZ2Ugb3IgUGFuZWwgdG8gd2hlcmUgYSBxdWVzdGlvbiBpcyByZWxvY2F0ZWQuXG4gICAqIEBwYXJhbSBpbnNlcnRCZWZvcmUgVXNlIGl0IGlmIHlvdSB3YW50IHRvIHNldCB0aGUgcXVlc3Rpb24gdG8gYSBzcGVjaWZpYyBwb3NpdGlvbi4gWW91IG1heSB1c2UgYSBudW1iZXIgKHVzZSAwIHRvIGluc2VydCBpbnQgdGhlIGJlZ2lubmluZykgb3IgZWxlbWVudCwgaWYgeW91IHdhbnQgdG8gaW5zZXJ0IGJlZm9yZSB0aGlzIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgbW92ZVRvKGNvbnRhaW5lcjogSVBhbmVsLCBpbnNlcnRCZWZvcmU6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG9CYXNlKHRoaXMucGFyZW50LCBjb250YWluZXIsIGluc2VydEJlZm9yZSk7XG4gIH1cbiAgcHVibGljIGdldFByb2dyZXNzSW5mbygpOiBJUHJvZ3Jlc3NJbmZvIHtcbiAgICBpZiAoIXRoaXMuaGFzSW5wdXQpIHJldHVybiBzdXBlci5nZXRQcm9ncmVzc0luZm8oKTtcbiAgICByZXR1cm4ge1xuICAgICAgcXVlc3Rpb25Db3VudDogMSxcbiAgICAgIGFuc3dlcmVkUXVlc3Rpb25Db3VudDogIXRoaXMuaXNFbXB0eSgpID8gMSA6IDAsXG4gICAgICByZXF1aXJlZFF1ZXN0aW9uQ291bnQ6IHRoaXMuaXNSZXF1aXJlZCA/IDEgOiAwLFxuICAgICAgcmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnQ6ICF0aGlzLmlzRW1wdHkoKSAmJiB0aGlzLmlzUmVxdWlyZWQgPyAxIDogMCxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9ucygpIHtcbiAgICBpZiAodGhpcy5kYXRhICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICBpZiAoIXRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICAgIHRoaXMucnVuQ29uZGl0aW9uKFxuICAgICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCksXG4gICAgICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS5xdWVzdGlvbkNyZWF0ZWQodGhpcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGUgJiYgIXRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICB9XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgcHVibGljIGdldERhdGFGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRGaWx0ZXJlZFZhbHVlcygpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHZhciBwcm9wcyA9ICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldEZpbHRlcmVkUHJvcGVydGllcygpIDoge307XG4gICAgcHJvcHMucXVlc3Rpb24gPSB0aGlzO1xuICAgIHJldHVybiBwcm9wcztcbiAgfVxuICAvKipcbiAgICogQSBwYXJlbnQgZWxlbWVudC4gSXQgY2FuIGJlIHBhbmVsIG9yIHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhcmVudCgpOiBJUGFuZWwge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYXJlbnRcIiwgbnVsbCk7XG4gIH1cbiAgcHVibGljIHNldCBwYXJlbnQodmFsOiBJUGFuZWwpIHtcbiAgICBpZiAodGhpcy5wYXJlbnQgPT09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuZGVsZXRlKCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVRdWVzdGlvbkNzcygpO1xuICAgIHRoaXMub25QYXJlbnRDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSBwYXJlbnRRdWVzdGlvblZhbHVlOiBRdWVzdGlvbiA9IG51bGw7XG4gIC8qKlxuICAgKiBBIHBhcmVudCBxdWVzdGlvbi4gSXQgY2FuIGJlIGEgZHluYW1pYyBwYW5lbCBvciBkeW5hbWljL2Ryb3Bkb3duIG1hdHJpY2VzLiBJZiB0aGUgdmFsdWUgaXMgYSBtYXRyaXgsIGl0IG1lYW5zIHRoYXQgcXVlc3Rpb24gaXMgYSBjZWxsIHF1ZXN0aW9uLlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIG51bGwgZm9yIGEgc3RhbmQgYWxvbmUgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhcmVudFF1ZXN0aW9uKCk6IFF1ZXN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRRdWVzdGlvblZhbHVlO1xuICB9XG4gIHNldFBhcmVudFF1ZXN0aW9uKHZhbDogUXVlc3Rpb24pIHtcbiAgICB0aGlzLnBhcmVudFF1ZXN0aW9uVmFsdWUgPSB2YWw7XG4gICAgdGhpcy5vblBhcmVudFF1ZXN0aW9uQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblBhcmVudFF1ZXN0aW9uQ2hhbmdlZCgpIHt9XG4gIHByb3RlY3RlZCBvblBhcmVudENoYW5nZWQoKSB7fVxuICAvKipcbiAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgcXVlc3Rpb24gZG9lc24ndCBoYXZlIGEgdGl0bGUgcHJvcGVydHksIGZvciBleGFtcGxlOiBRdWVzdGlvbkh0bWxNb2RlbCwgb3IgdGl0bGVMb2NhdGlvbiBwcm9wZXJ0eSBlcXVhbHMgdG8gXCJoaWRkZW5cIlxuICAgKiBAc2VlIHRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpICE9PSBcImhpZGRlblwiO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBkaWZmZXJlbnQgZnJvbSBcImRlZmF1bHRcIiB0byBzZXQgdGhlIHNwZWNpZmljIHF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uIGZvciB0aGlzIHBhbmVsL3BhZ2UuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBmb3IgcXVlc3Rpb25zIHdpdGhvdXQgaW5wdXQsIGZvciBleGFtcGxlIGh0bWwgcXVlc3Rpb24uXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGl0bGVMb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlTG9jYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHZhciBpc1Zpc2liaWxpdHlDaGFuZ2VkID1cbiAgICAgIHRoaXMudGl0bGVMb2NhdGlvbiA9PSBcImhpZGRlblwiIHx8IHZhbHVlID09IFwiaGlkZGVuXCI7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGl0bGVMb2NhdGlvblwiLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uQ3NzKCk7XG4gICAgaWYgKGlzVmlzaWJpbGl0eUNoYW5nZWQpIHtcbiAgICAgIHRoaXMubm90aWZ5U3VydmV5VmlzaWJpbGl0eUNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlTdXJ2ZXlWaXNpYmlsaXR5Q2hhbmdlZCgpIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5IHx8IHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5xdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIHRoaXMuaXNWaXNpYmxlKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkuaXNDbGVhclZhbHVlT25IaWRkZW4gJiYgIXRoaXMudmlzaWJsZSkge1xuICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHRpdGxlIGxvY2F0aW9uIGJhc2VkIG9uIHF1ZXN0aW9uIHRpdGxlTG9jYXRpb24gcHJvcGVydHkgYW5kIFF1ZXN0aW9uVGl0bGVMb2NhdGlvbiBvZiBpdCdzIHBhcmVudHNcbiAgICogQHNlZSB0aXRsZUxvY2F0aW9uXG4gICAqIEBzZWUgUGFuZWxNb2RlbEJhc2UuUXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqIEBzZWUgU3VydmV5TW9kZWwuUXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0VGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzRmxvd0xheW91dCkgcmV0dXJuIFwiaGlkZGVuXCI7XG4gICAgdmFyIGxvY2F0aW9uID0gdGhpcy5nZXRUaXRsZUxvY2F0aW9uQ29yZSgpO1xuICAgIGlmIChsb2NhdGlvbiA9PT0gXCJsZWZ0XCIgJiYgIXRoaXMuaXNBbGxvd1RpdGxlTGVmdCkgbG9jYXRpb24gPSBcInRvcFwiO1xuICAgIHJldHVybiBsb2NhdGlvbjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VGl0bGVMb2NhdGlvbkNvcmUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50aXRsZUxvY2F0aW9uICE9PSBcImRlZmF1bHRcIikgcmV0dXJuIHRoaXMudGl0bGVMb2NhdGlvbjtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpO1xuICAgIGlmICghIXRoaXMuc3VydmV5KSByZXR1cm4gdGhpcy5zdXJ2ZXkucXVlc3Rpb25UaXRsZUxvY2F0aW9uO1xuICAgIHJldHVybiBcInRvcFwiO1xuICB9XG4gIGdldCBoYXNUaXRsZU9uTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNUaXRsZSAmJiB0aGlzLmdldFRpdGxlTG9jYXRpb24oKSA9PT0gXCJsZWZ0XCI7XG4gIH1cbiAgZ2V0IGhhc1RpdGxlT25Ub3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVGl0bGUgJiYgdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgPT09IFwidG9wXCI7XG4gIH1cbiAgZ2V0IGhhc1RpdGxlT25Cb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVGl0bGUgJiYgdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgPT09IFwiYm90dG9tXCI7XG4gIH1cbiAgZ2V0IGhhc1RpdGxlT25MZWZ0VG9wKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5oYXNUaXRsZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpO1xuICAgIHJldHVybiBsb2NhdGlvbiA9PT0gXCJsZWZ0XCIgfHwgbG9jYXRpb24gPT09IFwidG9wXCI7XG4gIH1cbiAgcHVibGljIGdldCBlcnJvckxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucXVlc3Rpb25FcnJvckxvY2F0aW9uIDogXCJ0b3BcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgcXVlc3Rpb24gZG9lc24ndCBoYXZlIGFuIGlucHV0IGVsZW1lbnQsIGZvciBleGFtcGxlOiBRdWVzdGlvbkh0bWxNb2RlbFxuICAgKiBAc2VlIGhhc1NpbmdsZUlucHV0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc0lucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVzdGlvbiBkb2Vzbid0IGhhdmUgYW4gaW5wdXQgZWxlbWVudCBvciBoYXZlIG11bHRpcGxlIGlucHV0czogbWF0cmljZXMgb3IgcGFuZWwgZHluYW1pY1xuICAgKiBAc2VlIGhhc0lucHV0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc1NpbmdsZUlucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0lucHV0O1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkICsgXCJpXCI7XG4gIH1cbiAgLyoqXG4gICAqIFF1ZXN0aW9uIHRpdGxlLiBVc2Ugc3VydmV5IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIHRpdGxlIHF1ZXN0aW9uIGlzIHJlbmRlcmVkLiBJZiBpdCBpcyBlbXB0eSwgdGhlbiBxdWVzdGlvbiBuYW1lIHByb3BlcnR5IGlzIHVzZWQuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZVRlbXBsYXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdGhpcy5uYW1lKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NUaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiKTtcbiAgfVxuICAvKipcbiAgICogUXVlc3Rpb24gZGVzY3JpcHRpb24uIEl0IHJlbmRlcnMgdW5kZXIgcXVlc3Rpb24gdGl0bGUgYnkgdXNpbmcgc21hbGxlciBmb250LiBVbmxpa2UgdGhlIHRpdGxlLCBkZXNjcmlwdGlvbiBjYW4gYmUgZW1wdHkuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBmb3IgcXVlc3Rpb25zIHdpdGhvdXQgaW5wdXQsIGZvciBleGFtcGxlIGh0bWwgcXVlc3Rpb24uXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIEBwcm9wZXJ0eSh7IGxvY2FsaXphYmxlOiB0cnVlIH0pXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRdWVzdGlvbiBkZXNjcmlwdGlvbiBsb2NhdGlvbi4gQnkgZGVmYXVsdCwgdmFsdWUgaXMgXCJkZWZhdWx0XCIgYW5kIGl0IGRlcGVuZHMgb24gc3VydmV5IHF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvbiBwcm9wZXJ0eVxuICAgKiBZb3UgbWF5IGNoYW5nZSBpdCB0byBcInVuZGVySW5wdXRcIiB0byByZW5kZXIgaXQgdW5kZXIgcXVlc3Rpb24gaW5wdXQgb3IgXCJ1bmRlclRpdGxlXCIgdG8gcmVuZGVyZWQgaXQgdW5kZXIgdGl0bGUuXG4gICAqIEBzZWUgZGVzY3JpcHRpb25cbiAgICogQHNlZSBTdXJ2ZXkucXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVzY3JpcHRpb25Mb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uTG9jYXRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZXNjcmlwdGlvbkxvY2F0aW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGhhc0Rlc2NyaXB0aW9uVW5kZXJUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdGlvbkxvY2F0aW9uKCkgPT0gXCJ1bmRlclRpdGxlXCI7XG4gIH1cbiAgZ2V0IGhhc0Rlc2NyaXB0aW9uVW5kZXJJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdGlvbkxvY2F0aW9uKCkgPT0gXCJ1bmRlcklucHV0XCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXREZXNjcmlwdGlvbkxvY2F0aW9uKCkge1xuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uTG9jYXRpb24gIT09IFwiZGVmYXVsdFwiKSByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbkxvY2F0aW9uO1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5XG4gICAgICA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvblxuICAgICAgOiBcInVuZGVyVGl0bGVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNsaWNrVGl0bGVGdW5jdGlvbigpOiBhbnkge1xuICAgIGlmICh0aGlzLmhhc0lucHV0KSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChzZWxmLmlzQ29sbGFwc2VkKSByZXR1cm47XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHNlbGYuZm9jdXMoKTtcbiAgICAgICAgfSwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1c3RvbSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBvbiByZXF1aXJlZCBlcnJvci4gVXNlIHRoaXMgcHJvcGVydHksIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBkZWZhdWx0IHRleHQuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBmb3IgcXVlc3Rpb24gd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRFcnJvclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJyZXF1aXJlZEVycm9yVGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkRXJyb3JUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NSZXF1aXJlZEVycm9yVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJyZXF1aXJlZEVycm9yVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIGdldCBvciBzZXQgdGhlIGNvbW1lbnQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1lbnRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJjb21tZW50VGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVySXRlbVRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tbWVudFRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbW1lbnRUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0NvbW1lbnRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbW1lbnRUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29weSBvZiBxdWVzdGlvbiBlcnJvcnMgc3VydmV5LiBGb3Igc29tZSBxdWVzdGlvbnMgbGlrZSBtYXRyaXggYW5kIHBhbmVsIGR5bmFtaWMgaXQgaW5jbHVkZXMgdGhlIGVycm9ycyBvZiBuZXN0ZWQgcXVlc3Rpb25zLlxuICAgKi9cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5zbGljZSgpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvckJ5VHlwZShlcnJvclR5cGU6IHN0cmluZyk6IFN1cnZleUVycm9yIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5lcnJvcnNbaV0uZ2V0RXJyb3JUeXBlKCkgPT09IGVycm9yVHlwZSkgcmV0dXJuIHRoaXMuZXJyb3JzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpbmsgdG8gdGhlIGN1c3RvbSB3aWRnZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1c3RvbVdpZGdldCgpOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gICAgaWYgKCF0aGlzLmlzQ3VzdG9tV2lkZ2V0UmVxdWVzdGVkICYmICF0aGlzLmN1c3RvbVdpZGdldFZhbHVlKSB7XG4gICAgICB0aGlzLmlzQ3VzdG9tV2lkZ2V0UmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMudXBkYXRlQ3VzdG9tV2lkZ2V0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1c3RvbVdpZGdldFZhbHVlO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXQoKSB7XG4gICAgdGhpcy5jdXN0b21XaWRnZXRWYWx1ZSA9IEN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3VzdG9tV2lkZ2V0KFxuICAgICAgdGhpc1xuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBpc0NvbXBvc2l0ZVF1ZXN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCAhdGhpcy5oYXNTaW5nbGVJbnB1dCkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5LmFmdGVyUmVuZGVyUXVlc3Rpb25JbnB1dCh0aGlzLCBlbCk7XG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyKGVsOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5hZnRlclJlbmRlclF1ZXN0aW9uKHRoaXMsIGVsKTtcbiAgICBpZiAoISF0aGlzLmFmdGVyUmVuZGVyUXVlc3Rpb25DYWxsYmFjaykge1xuICAgICAgdGhpcy5hZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2sodGhpcywgZWwpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYmVmb3JlRGVzdHJveVF1ZXN0aW9uRWxlbWVudChlbDogSFRNTEVsZW1lbnQpIHt9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZW5kcmVkIHF1ZXN0aW9uIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm9jZXNzZWRUaXRsZSgpIHtcbiAgICB2YXIgcmVzID0gdGhpcy5sb2NQcm9jZXNzZWRUaXRsZS50ZXh0T3JIdG1sO1xuICAgIHJldHVybiByZXMgPyByZXMgOiB0aGlzLm5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRpdGxlIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHF1ZXN0aW9uIHRlbXBsYXRlLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVxuICAgKi9cbiAgcHVibGljIGdldCBmdWxsVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUaXRsZS5yZW5kZXJlZEh0bWw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0aXRsZVBhdHRlcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVQYXR0ZXJuIDogXCJudW1UaXRsZVJlcXVpcmVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZVRleHRPblN0YXJ0KCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWQgJiYgdGhpcy50aXRsZVBhdHRlcm4gPT0gXCJyZXF1aXJlTnVtVGl0bGVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZVRleHRCZWZvcmVUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkICYmIHRoaXMudGl0bGVQYXR0ZXJuID09IFwibnVtUmVxdWlyZVRpdGxlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlcXVpcmVUZXh0QWZ0ZXJUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkICYmIHRoaXMudGl0bGVQYXR0ZXJuID09IFwibnVtVGl0bGVSZXF1aXJlXCI7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBRdWVzdGlvbiByZW5kZXJzIG9uIHRoZSBuZXcgbGluZSBpZiB0aGUgcHJvcGVydHkgaXMgdHJ1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGZhbHNlLCB0aGUgcXVlc3Rpb24gdHJpZXMgdG8gcmVuZGVyIG9uIHRoZSBzYW1lIGxpbmUvcm93IHdpdGggYSBwcmV2aW91cyBxdWVzdGlvbi9wYW5lbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRXaXRoTmV3TGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RhcnRXaXRoTmV3TGluZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXJ0V2l0aE5ld0xpbmUodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuc3RhcnRXaXRoTmV3TGluZSA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdGFydFdpdGhOZXdMaW5lXCIsIHZhbCk7XG4gIH1cbiAgQHByb3BlcnR5KCkgY3NzQ2xhc3Nlc1ZhbHVlOiBhbnk7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBjc3MgY2xhc3NlcyB0aGF0IHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgcXVlc3Rpb24uIFlvdSBtYXkgdXNlIHN1cnZleS51cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMgZXZlbnQgdG8gb3ZlcnJpZGUgY3NzIGNsYXNzZXMgZm9yIGEgcXVlc3Rpb24uXG4gICAqIEBzZWUgU3VydmV5TW9kZWwudXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNzc0NsYXNzZXMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4gdGhpcy5jYWxjQ3NzQ2xhc3NlcygpO1xuICAgIGlmICghdGhpcy5jc3NDbGFzc2VzVmFsdWUpIHtcbiAgICAgIHRoaXMuY3NzQ2xhc3Nlc1ZhbHVlID0gdGhpcy5jYWxjQ3NzQ2xhc3NlcygpO1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzQ29yZSh0aGlzLmNzc0NsYXNzZXNWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNzc0NsYXNzZXNWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGNhbGNDc3NDbGFzc2VzKCk6IGFueSB7XG4gICAgdmFyIGNzcyA9IHRoaXMuY3NzO1xuICAgIHZhciBjbGFzc2VzID0geyBlcnJvcjoge30gfTtcbiAgICB0aGlzLmNvcHlDc3NDbGFzc2VzKGNsYXNzZXMsIGNzcy5xdWVzdGlvbik7XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLmVycm9yLCBjc3MuZXJyb3IpO1xuICAgIHRoaXMudXBkYXRlQ3NzQ2xhc3NlcyhjbGFzc2VzLCBjc3MpO1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkudXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzKHRoaXMsIGNsYXNzZXMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc1Jvb3QoKTogc3RyaW5nIHtcbiAgICB0aGlzLmVuc3VyZUVsZW1lbnRDc3MoKTtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY3NzUm9vdFwiLCBcIlwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0Q3NzUm9vdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNzc1Jvb3RcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q3NzUm9vdChjc3NDbGFzc2VzOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPVxuICAgICAgdGhpcy5pc0Zsb3dMYXlvdXQgJiYgIXRoaXMuaXNEZXNpZ25Nb2RlXG4gICAgICAgID8gY3NzQ2xhc3Nlcy5mbG93Um9vdFxuICAgICAgICA6IGNzc0NsYXNzZXMubWFpblJvb3Q7XG4gICAgaWYgKCFyZXMpIHJlcyA9IFwiXCI7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNGbG93TGF5b3V0ICYmXG4gICAgICB0aGlzLmhhc1RpdGxlT25MZWZ0ICYmXG4gICAgICAhIWNzc0NsYXNzZXMudGl0bGVMZWZ0Um9vdFxuICAgICkge1xuICAgICAgcmVzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy50aXRsZUxlZnRSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5lcnJvcnMubGVuZ3RoID4gMCAmJiAhIWNzc0NsYXNzZXMuaGFzRXJyb3IpIHtcbiAgICAgIHJlcyArPSBcIiBcIiArIGNzc0NsYXNzZXMuaGFzRXJyb3I7XG4gICAgfVxuICAgIGlmIChjc3NDbGFzc2VzLnNtYWxsICYmICF0aGlzLndpZHRoKSB7XG4gICAgICByZXMgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLnNtYWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzSGVhZGVyKCk6IHN0cmluZyB7XG4gICAgdGhpcy5lbnN1cmVFbGVtZW50Q3NzKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNzc0hlYWRlclwiLCBcIlwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0Q3NzSGVhZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY3NzSGVhZGVyXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENzc0hlYWRlcihjc3NDbGFzc2VzOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSBjc3NDbGFzc2VzLmhlYWRlciB8fCBcIlwiO1xuICAgIGlmICh0aGlzLmhhc1RpdGxlT25Ub3AgJiYgISFjc3NDbGFzc2VzLmhlYWRlclRvcCkge1xuICAgICAgcmVzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5oZWFkZXJUb3A7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc1RpdGxlT25MZWZ0ICYmICEhY3NzQ2xhc3Nlcy5oZWFkZXJMZWZ0KSB7XG4gICAgICByZXMgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLmhlYWRlckxlZnQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc1RpdGxlT25Cb3R0b20gJiYgISFjc3NDbGFzc2VzLmhlYWRlckJvdHRvbSkge1xuICAgICAgcmVzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5oZWFkZXJCb3R0b207XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBjc3NDb250ZW50KCk6IHN0cmluZyB7XG4gICAgdGhpcy5lbnN1cmVFbGVtZW50Q3NzKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNzc0NvbnRlbnRcIiwgXCJcIik7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENzc0NvbnRlbnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjc3NDb250ZW50XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENzc0NvbnRlbnQoY3NzQ2xhc3NlczogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gY3NzQ2xhc3Nlcy5jb250ZW50IHx8IFwiXCI7XG4gICAgaWYgKHRoaXMuaGFzVGl0bGVPbkxlZnQgJiYgISFjc3NDbGFzc2VzLmNvbnRlbnRMZWZ0KSB7XG4gICAgICByZXMgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLmNvbnRlbnRMZWZ0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzVGl0bGUoKTogc3RyaW5nIHtcbiAgICB0aGlzLmVuc3VyZUVsZW1lbnRDc3MoKTtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY3NzVGl0bGVcIiwgXCJcIik7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENzc1RpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY3NzVGl0bGVcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q3NzVGl0bGUoY3NzQ2xhc3NlczogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gY3NzQ2xhc3Nlcy50aXRsZTtcblxuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkIHx8IHRoaXMuaXNFeHBhbmRlZCkge1xuICAgICAgcmVzdWx0ICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy50aXRsZUV4cGFuZGFibGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udGFpbnNFcnJvcnMpIHtcbiAgICAgIGlmICghIWNzc0NsYXNzZXMudGl0bGVPbkVycm9yKSB7XG4gICAgICAgIHJlc3VsdCArPSBcIiBcIiArIGNzc0NsYXNzZXMudGl0bGVPbkVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0Fuc3dlcmVkICYmICEhY3NzQ2xhc3Nlcy50aXRsZU9uQW5zd2VyKSB7XG4gICAgICByZXN1bHQgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLnRpdGxlT25BbnN3ZXI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldCBjc3NFcnJvcigpOiBzdHJpbmcge1xuICAgIHRoaXMuZW5zdXJlRWxlbWVudENzcygpO1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjc3NFcnJvclwiLCBcIlwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0Q3NzRXJyb3IodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjc3NFcnJvclwiLCB2YWwpO1xuICB9XG4gIC8vVE9ETyB3YXMgbm90IHJlbW92ZWQgZnJvbSBvdGhlciBwbGFjZXNcbiAgcHJvdGVjdGVkIGdldENzc0Vycm9yKGNzc0NsYXNzZXM6IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IGNzc0NsYXNzZXMuZXJyb3Iucm9vdCB8fCBcIlwiO1xuICAgIGlmICh0aGlzLmVycm9yTG9jYXRpb24gPT0gXCJ0b3BcIikge1xuICAgICAgaWYgKCEhY3NzQ2xhc3Nlcy5lcnJvci5sb2NhdGlvblRvcCkge1xuICAgICAgICByZXMgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLmVycm9yLmxvY2F0aW9uVG9wO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmVycm9yTG9jYXRpb24gPT09IFwiYm90dG9tXCIgJiZcbiAgICAgICEhY3NzQ2xhc3Nlcy5lcnJvci5sb2NhdGlvbkJvdHRvbVxuICAgICkge1xuICAgICAgcmVzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5lcnJvci5sb2NhdGlvbkJvdHRvbTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgdXBkYXRlRWxlbWVudENzcyhyZU5ldz86IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNzc0NsYXNzZXNWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVOZXcpIHtcbiAgICAgIHRoaXMudXBkYXRlUXVlc3Rpb25Dc3ModHJ1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVRdWVzdGlvbkNzcyhyZU5ldz86IGJvb2xlYW4pIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8XG4gICAgICAhdGhpcy5zdXJ2ZXkgfHxcbiAgICAgIChyZU5ldyAhPT0gdHJ1ZSAmJiAhdGhpcy5jc3NDbGFzc2VzVmFsdWUpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jc3NDbGFzc2VzVmFsdWUpIHtcbiAgICAgIHRoaXMuY3NzQ2xhc3Nlc1ZhbHVlID0gdGhpcy5jYWxjQ3NzQ2xhc3NlcygpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnRDc3NDb3JlKHRoaXMuY3NzQ2xhc3Nlcyk7XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVFbGVtZW50Q3NzKCkge1xuICAgIGlmICghdGhpcy5jc3NDbGFzc2VzVmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlUXVlc3Rpb25Dc3ModHJ1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVFbGVtZW50Q3NzQ29yZShjc3NDbGFzc2VzOiBhbnkpIHtcbiAgICB0aGlzLnNldENzc1Jvb3QodGhpcy5nZXRDc3NSb290KGNzc0NsYXNzZXMpKTtcbiAgICB0aGlzLnNldENzc0hlYWRlcih0aGlzLmdldENzc0hlYWRlcihjc3NDbGFzc2VzKSk7XG4gICAgdGhpcy5zZXRDc3NDb250ZW50KHRoaXMuZ2V0Q3NzQ29udGVudChjc3NDbGFzc2VzKSk7XG4gICAgdGhpcy5zZXRDc3NUaXRsZSh0aGlzLmdldENzc1RpdGxlKGNzc0NsYXNzZXMpKTtcbiAgICB0aGlzLnNldENzc0Vycm9yKHRoaXMuZ2V0Q3NzRXJyb3IoY3NzQ2xhc3NlcykpO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVDc3NDbGFzc2VzKHJlczogYW55LCBjc3M6IGFueSkge1xuICAgIGlmICghY3NzLnF1ZXN0aW9uKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNSZXF1aXJlZCkge1xuICAgICAgaWYgKCEhY3NzLnF1ZXN0aW9uLnJlcXVpcmVkKSB7XG4gICAgICAgIHJlcy5yb290ID0gKHJlcy5yb290ID8gcmVzLnJvb3QgKyBcIiBcIiA6IFwiXCIpICsgb2JqQ3NzO1xuICAgICAgfVxuICAgICAgaWYgKGNzcy5xdWVzdGlvbi50aXRsZVJlcXVpcmVkKSB7XG4gICAgICAgIHJlcy50aXRsZSArPSBcIiBcIiArIGNzcy5xdWVzdGlvbi50aXRsZVJlcXVpcmVkO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgb2JqQ3NzID0gY3NzW3RoaXMuZ2V0Q3NzVHlwZSgpXTtcbiAgICBpZiAob2JqQ3NzID09PSB1bmRlZmluZWQgfHwgb2JqQ3NzID09PSBudWxsKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBvYmpDc3MgPT09IFwic3RyaW5nXCIgfHwgb2JqQ3NzIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICByZXMucm9vdCA9IChyZXMucm9vdCA/IHJlcy5yb290ICsgXCIgXCIgOiBcIlwiKSArIG9iakNzcztcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIG9iakNzcykge1xuICAgICAgICByZXNba2V5XSA9IG9iakNzc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q3NzVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFR5cGUoKTtcbiAgfVxuICBwcml2YXRlIGdldCBjc3MoKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LmdldENzcygpIDoge307XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBzZXQgdGhlIHNwZWNpZmljIHdpZHRoIHRvIHRoZSBxdWVzdGlvbiBsaWtlIGNzcyBzdHlsZSAoJSwgcHgsIGVtIGV0YykuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgd2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gc2V0IHRoZSBzcGVjaWZpYyBtaW5XaWR0aCBjb25zdHJhaW50IHRvIHRoZSBxdWVzdGlvbiBsaWtlIGNzcyBzdHlsZSAoJSwgcHgsIGVtIGV0YykuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pbldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pbldpZHRoXCIsIHNldHRpbmdzLm1pbldpZHRoKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbldpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIHNldCB0aGUgc3BlY2lmaWMgbWF4V2lkdGggY29uc3RyYWludCB0byB0aGUgcXVlc3Rpb24gbGlrZSBjc3Mgc3R5bGUgKCUsIHB4LCBlbSBldGMpLlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhXaWR0aFwiLCBzZXR0aW5ncy5tYXhXaWR0aCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFdpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSByZW5kZXJlZCB3aWR0aCBvZiB0aGUgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlbmRlcldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcldpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVuZGVyV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgZGlmZmVyZW50IGZyb20gMCB0byBpbmNyZWFzZSB0aGUgbGVmdCBwYWRkaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCBpbmRlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5kZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5kZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCBkaWZmZXJlbnQgZnJvbSAwIHRvIGluY3JlYXNlIHRoZSByaWdodCBwYWRkaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCByaWdodEluZGVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyaWdodEluZGVudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJpZ2h0SW5kZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmlnaHRJbmRlbnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgcGFkZGluZ0xlZnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGludExlZnRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IHBhZGRpbmdMZWZ0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGludExlZnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgcGFkZGluZ1JpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmdSaWdodFwiLCBcIlwiKTtcbiAgfVxuICBzZXQgcGFkZGluZ1JpZ2h0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ1JpZ2h0XCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBvbkluZGVudENoYW5nZWQoKSB7XG4gICAgdGhpcy5wYWRkaW5nTGVmdCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLmluZGVudCk7XG4gICAgdGhpcy5wYWRkaW5nUmlnaHQgPSB0aGlzLmdldEluZGVudFNpemUodGhpcy5yaWdodEluZGVudCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJbmRlbnRTaXplKGluZGVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoaW5kZW50IDwgMSB8fCAhdGhpcy5nZXRTdXJ2ZXkoKSB8fCAhdGhpcy5jc3NDbGFzc2VzKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gaW5kZW50ICogdGhpcy5jc3NDbGFzc2VzLmluZGVudCArIFwicHhcIjtcbiAgfVxuICAvKipcbiAgICogTW92ZSB0aGUgZm9jdXMgdG8gdGhlIGlucHV0IG9mIHRoaXMgcXVlc3Rpb24uXG4gICAqIEBwYXJhbSBvbkVycm9yIHNldCB0aGlzIHBhcmFtZXRlciB0byB0cnVlLCB0byBmb2N1cyB0aGUgaW5wdXQgd2l0aCB0aGUgZmlyc3QgZXJyb3IsIG90aGVyIHdpc2UgdGhlIGZpcnN0IGlucHV0IHdpbGwgYmUgZm9jdXNlZC5cbiAgICovXG4gIHB1YmxpYyBmb2N1cyhvbkVycm9yOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcblxuICAgIGlmICghIXRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS5zY3JvbGxFbGVtZW50VG9Ub3AodGhpcywgdGhpcywgbnVsbCwgdGhpcy5pZCk7XG4gICAgfVxuICAgIHZhciBpZCA9ICFvbkVycm9yXG4gICAgICA/IHRoaXMuZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpXG4gICAgICA6IHRoaXMuZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk7XG4gICAgaWYgKFN1cnZleUVsZW1lbnQuRm9jdXNFbGVtZW50KGlkKSkge1xuICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5mb2N1c0NhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGZpcmVDYWxsYmFjayhjYWxsYmFjazogKCkgPT4gdm9pZCkge1xuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgfVxuICBwdWJsaWMgZ2V0T3RoZXJzTWF4TGVuZ3RoKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5Lm1heE90aGVyc0xlbmd0aCA+IDAgPyB0aGlzLnN1cnZleS5tYXhPdGhlcnNMZW5ndGggOiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge31cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dElkO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRGaXJzdElucHV0RWxlbWVudElkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkge1xuICAgIHZhciBuYW1lID0gdGV4dFZhbHVlLm5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPVxuICAgICAgT2JqZWN0LmtleXMoUXVlc3Rpb24uVGV4dFByZXByb2Nlc3NvclZhbHVlc01hcCkuaW5kZXhPZihuYW1lKSAhPT0gLTEgfHxcbiAgICAgICg8YW55PnRoaXMpW3RleHRWYWx1ZS5uYW1lXSAhPT0gdW5kZWZpbmVkO1xuICAgIHRleHRWYWx1ZS52YWx1ZSA9ICg8YW55PnRoaXMpW1xuICAgICAgKDxhbnk+UXVlc3Rpb24uVGV4dFByZXByb2Nlc3NvclZhbHVlc01hcClbbmFtZV0gfHwgdGV4dFZhbHVlLm5hbWVcbiAgICBdO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0Q29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIG1ha2UgdGhlIHF1ZXN0aW9uIGEgcmVxdWlyZWQuIElmIGEgdXNlciBkb2Vzbid0IGFuc3dlciB0aGUgcXVlc3Rpb24gdGhlbiBhIHZhbGlkYXRpb24gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBmb3IgcXVlc3Rpb24gd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZXF1aXJlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVxdWlyZWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIHJlcXVpcmVkIGFuZCBhbiBlbmQtdXNlciBoYXMgdG8gYW5zd2VyIGl0LlxuICAgKiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBRdWVzdGlvbiB0aGVuIGFuIGVuZC11c2VyIG1heSBub3QgYW5zd2VyIGl0IHRoZSBRdWVzdGlvbiBtYXliZSBlbXB0eS5cbiAgICogVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIGlzUmVxdWlyZWQgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKiBAc2VlIGlzUmVxdWlyZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZElmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlcXVpcmVkSWZcIiwgdmFsKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIGFkZCBhIGNvbW1lbnQgZm9yIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzQ29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGFzQ29tbWVudFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoYXNDb21tZW50KHZhbDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5zdXBwb3J0Q29tbWVudCgpKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzQ29tbWVudFwiLCB2YWwpO1xuICAgIGlmICh0aGlzLmhhc0NvbW1lbnQpIHRoaXMuaGFzT3RoZXIgPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWNhdG9yLiBJdCBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaWRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlkXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBhcmlhVGl0bGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkICsgXCJfYXJpYVRpdGxlXCI7XG4gIH1cbiAgcHVibGljIGdldCBhcmlhUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzT3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5zdXBwb3J0T3RoZXIoKSB8fCB0aGlzLmhhc090aGVyID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIHZhbCk7XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIHRoaXMuaGFzQ29tbWVudCA9IGZhbHNlO1xuICAgIHRoaXMuaGFzT3RoZXJDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpIHt9XG4gIHB1YmxpYyBnZXQgcmVxdWlyZVVwZGF0ZUNvbW1lbnRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNDb21tZW50IHx8IHRoaXMuaGFzT3RoZXI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiByZWFkT25seSBwcm9wZXJ0eSBpcyB0cnVlIG9yIHN1cnZleSBpcyBpbiBkaXNwbGF5IG1vZGUgb3IgcGFyZW50IHBhbmVsL3BhZ2UgaXMgcmVhZE9ubHkuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubW9kZWxcbiAgICogQHNlZSByZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCkge1xuICAgIHZhciBpc1BhcmVudFJlYWRPbmx5ID0gISF0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc1JlYWRPbmx5O1xuICAgIHZhciBpc1N1cnZleVJlYWRPbmx5ID0gISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlO1xuICAgIHJldHVybiB0aGlzLnJlYWRPbmx5IHx8IGlzUGFyZW50UmVhZE9ubHkgfHwgaXNTdXJ2ZXlSZWFkT25seTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzSW5wdXRSZWFkT25seSgpIHtcbiAgICB2YXIgaXNEZXNpZ25Nb2RlVjIgPSBzZXR0aW5ncy5zdXBwb3J0Q3JlYXRvclYyICYmIHRoaXMuaXNEZXNpZ25Nb2RlO1xuICAgIHJldHVybiB0aGlzLmlzUmVhZE9ubHkgfHwgaXNEZXNpZ25Nb2RlVjI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVhZE9ubHlDaGFuZ2VkKCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzSW5wdXRSZWFkT25seVwiLCB0aGlzLmlzSW5wdXRSZWFkT25seSk7XG4gICAgc3VwZXIub25SZWFkT25seUNoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyBmYWxzZSB0aGUgUXVlc3Rpb24gYmVjb21lcyByZWFkIG9ubHkgYW5kIGFuIGVuZC11c2VyIHdpbGwgbm90IGFibGUgdG8gYW5zd2VyIG9uIHRoZSBxdXN0aW9uLiBUaGUgbGlicmFyeSBydW5zIHRoZSBleHByZXNzaW9uIG9uIHN1cnZleSBzdGFydCBhbmQgb24gY2hhbmdpbmcgYSBxdWVzdGlvbiB2YWx1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGVtcHR5IHRoZW4gcmVhZE9ubHkgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBlbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgfVxuICAvKipcbiAgICogUnVuIHZpc2libGVJZiBhbmQgZW5hYmxlSWYgZXhwcmVzc2lvbnMuIElmIHZpc2libGVJZiBvci9hbmQgZW5hYmxlZElmIGFyZSBub3QgZW1wdHksIHRoZW4gdGhlIHJlc3VsdHMgb2YgcGVyZm9ybWluZyB0aGUgZXhwcmVzc2lvbiAodHJ1ZSBvciBmYWxzZSkgc2V0IHRvIHRoZSB2aXNpYmxlL3JlYWRPbmx5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSB2YWx1ZXMgVHlwaWNhbGx5IHN1cnZleSByZXN1bHRzXG4gICAqIEBzZWUgdmlzaWJsZVxuICAgKiBAc2VlIHZpc2libGVJZlxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqIEBzZWUgZW5hYmxlSWZcbiAgICovXG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHByb3BlcnRpZXMgPSB7fTtcbiAgICBwcm9wZXJ0aWVzW1wicXVlc3Rpb25cIl0gPSB0aGlzO1xuICAgIGlmICghdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcpIHtcbiAgICAgIHRoaXMucnVuVmlzaWJsZUlmQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICAgIHRoaXMucnVuRW5hYmxlSWZDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLnJ1blJlcXVpcmVkSWZDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1blZpc2libGVJZkNvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy52aXNpYmxlSWYpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29uZGl0aW9uUnVubmVyKVxuICAgICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMudmlzaWJsZUlmKTtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy52aXNpYmxlSWY7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIub25SdW5Db21wbGV0ZSA9IChyZXM6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IHJlcztcbiAgICB9O1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuRW5hYmxlSWZDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlSWYpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyKVxuICAgICAgdGhpcy5jb25kaXRpb25FbmFiZWxSdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZW5hYmxlSWYpO1xuICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmVuYWJsZUlmO1xuICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnJlYWRPbmx5ID0gIXJlcztcbiAgICB9O1xuICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuUmVxdWlyZWRJZkNvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy5yZXF1aXJlZElmKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvblJlcXVpcmVkUnVubmVyKVxuICAgICAgdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy5yZXF1aXJlZElmKTtcbiAgICB0aGlzLmNvbmRpdGlvblJlcXVpcmVkUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLnJlcXVpcmVkSWY7XG4gICAgdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gcmVzO1xuICAgIH07XG4gICAgdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdGhlIHF1ZXN0aW9uIG51bWJlci4gSWYgcXVlc3Rpb24gaXMgaW52aXNpYmxlIHRoZW4gaXQgcmV0dXJucyBlbXB0eSBzdHJpbmcuXG4gICAqIElmIHZpc2libGVJbmRleCBpcyAxLCB0aGVuIG5vIGlzIDIsIG9yICdCJyBpZiBzdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4IGlzICdBJy5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblN0YXJ0SW5kZXhcbiAgICovXG4gIHB1YmxpYyBnZXQgbm8oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibm9cIik7XG4gIH1cbiAgcHJpdmF0ZSBjYWxjTm8oKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaGFzVGl0bGUgfHwgdGhpcy5oaWRlTnVtYmVyKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgbm8gPSBIZWxwZXJzLmdldE51bWJlckJ5SW5kZXgodGhpcy52aXNpYmxlSW5kZXgsIHRoaXMuZ2V0U3RhcnRJbmRleCgpKTtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgbm8gPSB0aGlzLnN1cnZleS5nZXRVcGRhdGVkUXVlc3Rpb25Obyh0aGlzLCBubyk7XG4gICAgfVxuICAgIHJldHVybiBubztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhcnRJbmRleCgpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMucGFyZW50KSByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UXVlc3Rpb25TdGFydEluZGV4KCk7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHJldHVybiB0aGlzLnN1cnZleS5xdWVzdGlvblN0YXJ0SW5kZXg7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnN1cnZleUxvYWRDYWxsYmFjayk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICB9XG4gIHByb3RlY3RlZCBvblNldERhdGEoKSB7XG4gICAgc3VwZXIub25TZXREYXRhKCk7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHRoaXMuaW5pdERhdGFGcm9tU3VydmV5KCk7XG4gICAgdGhpcy5vblN1cnZleVZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk7XG4gICAgdGhpcy5vbkluZGVudENoYW5nZWQoKTtcbiAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uQ3NzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGluaXREYXRhRnJvbVN1cnZleSgpIHtcbiAgICBpZiAoISF0aGlzLmRhdGEpIHtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWVGcm9tU3VydmV5KHRoaXMuZGF0YS5nZXRWYWx1ZSh0aGlzLmdldFZhbHVlTmFtZSgpKSk7XG4gICAgICB0aGlzLmluaXRDb21tZW50RnJvbVN1cnZleSgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaW5pdENvbW1lbnRGcm9tU3VydmV5KCkge1xuICAgIGlmICghIXRoaXMuZGF0YSAmJiB0aGlzLnJlcXVpcmVVcGRhdGVDb21tZW50VmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkodGhpcy5kYXRhLmdldENvbW1lbnQodGhpcy5nZXRWYWx1ZU5hbWUoKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbW1lbnRGcm9tU3VydmV5KFwiXCIpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgcnVuRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkgfHwgIWV4cHJlc3Npb24pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LnJ1bkV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcXVlc3Rpb25WYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVwiKTtcbiAgfVxuICBwcml2YXRlIHNldCBxdWVzdGlvblZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldCBxdWVzdGlvbkNvbW1lbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29tbWVudFwiKTtcbiAgfVxuICBwcml2YXRlIHNldCBxdWVzdGlvbkNvbW1lbnQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb21tZW50XCIsIHZhbCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb21tZW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogR2V0L1NldCB0aGUgcXVlc3Rpb24gdmFsdWUuXG4gICAqIEBzZWUgU3VydmV5TW9kZS5zZXRWYWx1ZVxuICAgKiBAc2VlIFN1cnZleU1vZGUuZ2V0VmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUNvcmUoKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlRm9yU3VydmV5KCk6IGFueSB7XG4gICAgaWYgKCEhdGhpcy52YWx1ZVRvRGF0YUNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZVRvRGF0YUNhbGxiYWNrKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuICAvKipcbiAgICogQ2xlYXIgdGhlIHF1ZXN0aW9uIHZhbHVlLiBJdCBjbGVhcnMgdGhlIHF1ZXN0aW9uIGNvbW1lbnQgYXMgd2VsbC5cbiAgICovXG4gIHB1YmxpYyBjbGVhclZhbHVlKCkge1xuICAgIGlmICh0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuY29tbWVudCA9IHVuZGVmaW5lZDtcbiAgfVxuICBwdWJsaWMgdW5iaW5kVmFsdWUoKSB7XG4gICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gIH1cbiAgcHVibGljIGNyZWF0ZVZhbHVlQ29weSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFVuYmluZFZhbHVlKHRoaXMudmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRVbmJpbmRWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZVN1cnZleUVsZW1lbnQodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUodmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBpc1ZhbHVlU3VydmV5RWxlbWVudCh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSlcbiAgICAgIHJldHVybiB2YWwubGVuZ3RoID4gMCA/IHRoaXMuaXNWYWx1ZVN1cnZleUVsZW1lbnQodmFsWzBdKSA6IGZhbHNlO1xuICAgIHJldHVybiAhIXZhbC5nZXRUeXBlICYmICEhdmFsLm9uUHJvcGVydHlDaGFuZ2VkO1xuICB9XG4gIHByaXZhdGUgY2FuQ2xlYXJWYWx1ZUFzSW52aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzVmlzaWJsZSAmJiB0aGlzLmlzUGFyZW50VmlzaWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghIXRoaXMucGFnZSAmJiB0aGlzLnBhZ2UuaXNTdGFydGVkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCAhdGhpcy52YWx1ZU5hbWUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiAhdGhpcy5zdXJ2ZXkuaGFzVmlzaWJsZVF1ZXN0aW9uQnlWYWx1ZU5hbWUodGhpcy52YWx1ZU5hbWUpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzUGFyZW50VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgaWYgKCFwYXJlbnQuaXNWaXNpYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCkge1xuICAgIGlmICh0aGlzLmNhbkNsZWFyVmFsdWVBc0ludmlzaWJsZSgpKSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBkaXNwbGF5VmFsdWUoKTogYW55IHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheVZhbHVlKHRydWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHF1ZXN0aW9uIHZhbHVlIGFzIGEgZGlzcGxheSB0ZXh0LiBGb3IgZXhhbXBsZSwgZm9yIGRyb3Bkb3duLCBpdCB3b3VsZCByZXR1cm4gdGhlIGl0ZW0gdGV4dCBpbnN0ZWFkIG9mIGl0ZW0gdmFsdWUuXG4gICAqIEBwYXJhbSBrZXlzQXNUZXh0IFNldCB0aGlzIHZhbHVlIHRvIHRydWUsIHRvIHJldHVybiBrZXkgKGluIG1hdHJpY2VzIHF1ZXN0aW9ucykgYXMgZGlzcGxheSB0ZXh0IGFzIHdlbGwuXG4gICAqIEBwYXJhbSB2YWx1ZSB1c2UgdGhpcyBwYXJhbWV0ZXIsIGlmIHlvdSB3YW50IHRvIGdldCBkaXNwbGF5IHZhbHVlIGZvciB0aGlzIHZhbHVlIGFuZCBub3QgcXVlc3Rpb24udmFsdWUuIEl0IGlzIHVuZGVmaW5lZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcHVibGljIGdldERpc3BsYXlWYWx1ZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55ID0gdW5kZWZpbmVkKTogYW55IHtcbiAgICB2YXIgcmVzID0gdGhpcy5jYWxjRGlzcGxheVZhbHVlKGtleXNBc1RleHQsIHZhbHVlKTtcbiAgICByZXR1cm4gISF0aGlzLmRpc3BsYXlWYWx1ZUNhbGxiYWNrID8gdGhpcy5kaXNwbGF5VmFsdWVDYWxsYmFjayhyZXMpIDogcmVzO1xuICB9XG4gIHByaXZhdGUgY2FsY0Rpc3BsYXlWYWx1ZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55ID0gdW5kZWZpbmVkKTogYW55IHtcbiAgICBpZiAodGhpcy5jdXN0b21XaWRnZXQpIHtcbiAgICAgIHZhciByZXMgPSB0aGlzLmN1c3RvbVdpZGdldC5nZXREaXNwbGF5VmFsdWUodGhpcywgdmFsdWUpO1xuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyB0aGlzLmNyZWF0ZVZhbHVlQ29weSgpIDogdmFsdWU7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheVZhbHVlRW1wdHkoKTtcbiAgICByZXR1cm4gdGhpcy5nZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQsIHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlRW1wdHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IHZhbHVlIHRvIHRoZSBxdWVzdGlvbi4gSXQgd2lsbCBiZSBhc3NpZ24gdG8gdGhlIHF1ZXN0aW9uIG9uIGxvYWRpbmcgdGhlIHN1cnZleSBmcm9tIEpTT04gb3IgYWRkaW5nIGEgcXVlc3Rpb24gdG8gdGhlIHN1cnZleSBvciBvbiBzZXR0aW5nIHRoaXMgcHJvcGVydHkgb2YgdGhlIHZhbHVlIGlzIGVtcHR5LlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBwcm9wZXJ0eSBpcyBoaWRkZW4gZm9yIHF1ZXN0aW9uIHdpdGhvdXQgaW5wdXQsIGZvciBleGFtcGxlIGh0bWwgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWUodmFsOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRXhwcmVzc2lvbih2YWwpKSB7XG4gICAgICB0aGlzLmRlZmF1bHRWYWx1ZUV4cHJlc3Npb24gPSB2YWwuc3Vic3RyKDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVcIiwgdGhpcy5jb252ZXJ0RGVmYXVsdFZhbHVlKHZhbCkpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZUV4cHJlc3Npb24oKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlRXhwcmVzc2lvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZUV4cHJlc3Npb24odmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVFeHByZXNzaW9uXCIsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHF1ZXN0aW9uIGFuc3dlciBkYXRhIGFzIGEgcGxhaW4gb2JqZWN0OiB3aXRoIHF1ZXN0aW9uIHRpdGxlLCBuYW1lLCB2YWx1ZSBhbmQgZGlzcGxheVZhbHVlLlxuICAgKiBGb3IgY29tcGxleCBxdWVzdGlvbnMgKGxpa2UgbWF0cml4LCBldGMuKSBpc05vZGUgZmxhZyBpcyBzZXQgdG8gdHJ1ZSBhbmQgZGF0YSBjb250YWlucyBhcnJheSBvZiBuZXN0ZWQgb2JqZWN0cyAocm93cylcbiAgICogc2V0IG9wdGlvbnMuaW5jbHVkZUVtcHR5IHRvIGZhbHNlIGlmIHlvdSB3YW50IHRvIHNraXAgZW1wdHkgYW5zd2Vyc1xuICAgKi9cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZVF1ZXN0aW9uVHlwZXM/OiBib29sZWFuO1xuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWUsXG4gICAgICBpbmNsdWRlUXVlc3Rpb25UeXBlczogZmFsc2UsXG4gICAgfVxuICApIHtcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlRW1wdHkgfHwgIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB2YXIgcXVlc3Rpb25QbGFpbkRhdGEgPSA8YW55PntcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB0aXRsZTogdGhpcy5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsXG4gICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICBkaXNwbGF5VmFsdWU6IHRoaXMuZGlzcGxheVZhbHVlLFxuICAgICAgICBpc05vZGU6IGZhbHNlLFxuICAgICAgICBnZXRTdHJpbmc6ICh2YWw6IGFueSkgPT5cbiAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucy5pbmNsdWRlUXVlc3Rpb25UeXBlcyA9PT0gdHJ1ZSkge1xuICAgICAgICBxdWVzdGlvblBsYWluRGF0YS5xdWVzdGlvblR5cGUgPSB0aGlzLmdldFR5cGUoKTtcbiAgICAgIH1cbiAgICAgIChvcHRpb25zLmNhbGN1bGF0aW9ucyB8fCBbXSkuZm9yRWFjaCgoY2FsY3VsYXRpb24pID0+IHtcbiAgICAgICAgcXVlc3Rpb25QbGFpbkRhdGFbY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXSA9IHRoaXNbXG4gICAgICAgICAgY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXG4gICAgICAgIF07XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLmhhc0NvbW1lbnQpIHtcbiAgICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuaXNOb2RlID0gdHJ1ZTtcbiAgICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAwLFxuICAgICAgICAgICAgaXNDb21tZW50OiB0cnVlLFxuICAgICAgICAgICAgdGl0bGU6IFwiQ29tbWVudFwiLFxuICAgICAgICAgICAgdmFsdWU6IHNldHRpbmdzLmNvbW1lbnRQcmVmaXgsXG4gICAgICAgICAgICBkaXNwbGF5VmFsdWU6IHRoaXMuY29tbWVudCxcbiAgICAgICAgICAgIGdldFN0cmluZzogKHZhbDogYW55KSA9PlxuICAgICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgICAgIGlzTm9kZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBxdWVzdGlvblBsYWluRGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogVGhlIGNvcnJlY3QgYW5zd2VyIG9uIHRoZSBxdWVzdGlvbi4gU2V0IHRoaXMgdmFsdWUgaWYgeW91IGFyZSBkb2luZyBhIHF1aXouXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBmb3IgcXVlc3Rpb24gd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5jb3JyZWN0QW5zd2Vyc1xuICAgKiBAc2VlIFN1cnZleU1vZGVsLmluQ29ycmVjdEFuc3dlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgY29ycmVjdEFuc3dlcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb3JyZWN0QW5zd2VyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29ycmVjdEFuc3dlcih2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvcnJlY3RBbnN3ZXJcIiwgdGhpcy5jb252ZXJ0RGVmYXVsdFZhbHVlKHZhbCkpO1xuICB9XG4gIHByb3RlY3RlZCBjb252ZXJ0RGVmYXVsdFZhbHVlKHZhbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHF1ZXN0aW9ucyBjb3VudDogMSBmb3IgdGhlIG5vbi1tYXRyaXggcXVlc3Rpb25zIGFuZCBhbGwgaW5uZXIgdmlzaWJsZSBxdWVzdGlvbnMgdGhhdCBoYXMgaW5wdXQocykgd2lkZ2V0cyBmb3IgcXVlc3Rpb24gb2YgbWF0cml4IHR5cGVzLlxuICAgKiBAc2VlIGdldFF1aXpRdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVpelF1ZXN0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzVmlzaWJsZSAmJlxuICAgICAgdGhpcy5oYXNJbnB1dCAmJlxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuY29ycmVjdEFuc3dlcilcbiAgICApXG4gICAgICByZXR1cm4gdGhpcy5nZXRRdWl6UXVlc3Rpb25Db3VudCgpO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHB1YmxpYyBnZXQgY29ycmVjdEFuc3dlckNvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmlzRW1wdHkoKSAmJiAhdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5jb3JyZWN0QW5zd2VyKSlcbiAgICAgIHJldHVybiB0aGlzLmdldENvcnJlY3RBbnN3ZXJDb3VudCgpO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWl6UXVlc3Rpb25Db3VudCgpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdEFuc3dlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLmNvcnJlY3RBbnN3ZXIsIHRydWUsIHRydWUpXG4gICAgICA/IDFcbiAgICAgIDogMDtcbiAgfVxuICBwdWJsaWMgaXNBbnN3ZXJDb3JyZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvcnJlY3RBbnN3ZXJDb3VudCA9PSB0aGlzLnF1aXpRdWVzdGlvbkNvdW50O1xuICB9XG4gIHB1YmxpYyB1cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8XG4gICAgICAoIXRoaXMuaXNEZXNpZ25Nb2RlICYmIHRoaXMuaXNEZWZhdWx0VmFsdWVFbXB0eSgpKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAoIXRoaXMuaXNEZXNpZ25Nb2RlICYmICF0aGlzLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSAmJiB0aGlzLmlzRGVmYXVsdFZhbHVlRW1wdHkoKSkgcmV0dXJuO1xuICAgIGlmICghIXRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzQ2xlYXJWYWx1ZU9uSGlkZGVuICYmICF0aGlzLmlzVmlzaWJsZSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnNldERlZmF1bHRWYWx1ZSgpO1xuICB9XG4gIGdldFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IElRdWVzdGlvbiB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNEZWZhdWx0VmFsdWVFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZGVmYXVsdFZhbHVlRXhwcmVzc2lvbiAmJiB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICB0aGlzLnNldFZhbHVlQW5kUnVuRXhwcmVzc2lvbihcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlRXhwcmVzc2lvbixcbiAgICAgIHRoaXMuZ2V0VW5iaW5kVmFsdWUodGhpcy5kZWZhdWx0VmFsdWUpLFxuICAgICAgKHZhbCkgPT4ge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVmFsdWVFeHByZXNzaW9uKHZhbDogYW55KSB7XG4gICAgcmV0dXJuICEhdmFsICYmIHR5cGVvZiB2YWwgPT0gXCJzdHJpbmdcIiAmJiB2YWwubGVuZ3RoID4gMCAmJiB2YWxbMF0gPT0gXCI9XCI7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFZhbHVlQW5kUnVuRXhwcmVzc2lvbihcbiAgICBleHByZXNzaW9uOiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiBhbnksXG4gICAgc2V0RnVuYzogKHZhbDogYW55KSA9PiB2b2lkLFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsLFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApIHtcbiAgICB2YXIgZnVuYyA9ICh2YWw6IGFueSkgPT4ge1xuICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgdmFsID0gdmFsLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuICAgICAgfVxuICAgICAgc2V0RnVuYyh2YWwpO1xuICAgIH07XG4gICAgaWYgKCEhZXhwcmVzc2lvbiAmJiAhIXRoaXMuZGF0YSkge1xuICAgICAgaWYgKCF2YWx1ZXMpIHZhbHVlcyA9IHRoaXMuZGF0YS5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICAgICAgaWYgKCFwcm9wZXJ0aWVzKSBwcm9wZXJ0aWVzID0gdGhpcy5kYXRhLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgICAgdmFyIHJ1bm5lciA9IG5ldyBFeHByZXNzaW9uUnVubmVyKGV4cHJlc3Npb24pO1xuICAgICAgaWYgKHJ1bm5lci5jYW5SdW4pIHtcbiAgICAgICAgcnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcyA9PSB1bmRlZmluZWQpIHJlcyA9IHRoaXMuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgIGZ1bmMocmVzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmdW5jKGRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgcXVlc3Rpb24gY29tbWVudCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29tbWVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXN0aW9uQ29tbWVudCgpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCEhbmV3VmFsdWUpIHtcbiAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUudG9TdHJpbmcoKS50cmltKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbW1lbnQgPT0gbmV3VmFsdWUpIHJldHVybjtcbiAgICB0aGlzLnNldFF1ZXN0aW9uQ29tbWVudChuZXdWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFF1ZXN0aW9uQ29tbWVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQ29tbWVudDtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25Db21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldE5ld0NvbW1lbnQobmV3VmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIHZhbHVlIGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy52YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBpc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0Fuc3dlcmVkXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNBbnN3ZXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0Fuc3dlcmVkXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUlzQW5zd2VyZWQoKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNBbnN3ZXJlZFwiLCB0aGlzLmdldElzQW5zd2VyZWQoKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzQW5zd2VyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzRW1wdHkoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcXVlc3Rpb24gdmFsaWRhdG9ycy5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWxpZGF0b3JzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsaWRhdG9ycyh2YWw6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWxpZGF0b3JzXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldFZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9ycztcbiAgfVxuICBwdWJsaWMgZ2V0U3VwcG9ydGVkVmFsaWRhdG9ycygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMuZ2V0VHlwZSgpO1xuICAgIHdoaWxlICghIWNsYXNzTmFtZSkge1xuICAgICAgdmFyIGNsYXNzVmFsaWRhdG9ycyA9ICg8YW55PnNldHRpbmdzLnN1cHBvcnRlZFZhbGlkYXRvcnMpW2NsYXNzTmFtZV07XG4gICAgICBpZiAoISFjbGFzc1ZhbGlkYXRvcnMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IGNsYXNzVmFsaWRhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIHJlcy5zcGxpY2UoMCwgMCwgY2xhc3NWYWxpZGF0b3JzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNsYXNzSW5mbyA9IFNlcmlhbGl6ZXIuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgICBjbGFzc05hbWUgPSBjbGFzc0luZm8ucGFyZW50TmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGFkZFN1cHBvcnRlZFZhbGlkYXRvcnMoXG4gICAgc3VwcG9ydGVkVmFsaWRhdG9yczogQXJyYXk8c3RyaW5nPixcbiAgICBjbGFzc1ZhbGlkYXRvcnM6IEFycmF5PHN0cmluZz5cbiAgKSB7fVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgIG5hbWU6IHRoaXMuZ2V0VmFsdWVOYW1lKCksXG4gICAgICB0ZXh0OiB0aGlzLnByb2Nlc3NlZFRpdGxlLFxuICAgICAgcXVlc3Rpb246IHRoaXMsXG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QodGhpcyk7XG4gICAganNvbltcInR5cGVcIl0gPSB0aGlzLmdldFR5cGUoKTtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgdmFsaWRhdGlvbiBlcnJvcihzKSBpbiB0aGUgcXVlc3Rpb24uXG4gICAqIEBwYXJhbSBmaXJlQ2FsbGJhY2sgc2V0IGl0IHRvIHRydWUgdG8gc2hvdyBhbiBlcnJvciBpbiBVSS5cbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgdmFyIG9sZEhhc0Vycm9ycyA9IHRoaXMuZXJyb3JzLmxlbmd0aCA+IDA7XG4gICAgdmFyIGVycm9ycyA9IHRoaXMuY2hlY2tGb3JFcnJvcnMoISFyZWMgJiYgcmVjLmlzT25WYWx1ZUNoYW5nZWQgPT09IHRydWUpO1xuICAgIGlmIChmaXJlQ2FsbGJhY2spIHtcbiAgICAgIGlmICghIXRoaXMuc3VydmV5KSB7XG4gICAgICAgIHRoaXMuc3VydmV5LmJlZm9yZVNldHRpbmdRdWVzdGlvbkVycm9ycyh0aGlzLCBlcnJvcnMpO1xuICAgICAgfVxuICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ29udGFpbnNFcnJvcnMoKTtcbiAgICBpZiAob2xkSGFzRXJyb3JzICE9IGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uQ3NzKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkICYmIHJlYyAmJiBmaXJlQ2FsbGJhY2sgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID4gMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgY291bnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRFcnJvckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmxlbmd0aDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hhci9zdHJpbmcgZm9yIGEgcmVxdWlyZWQgcXVlc3Rpb24uXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucmVxdWlyZWRUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSAhPSBudWxsICYmIHRoaXMuaXNSZXF1aXJlZFxuICAgICAgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHRcbiAgICAgIDogXCJcIjtcbiAgfVxuICAvKipcbiAgICogQWRkIGVycm9yIGludG8gdGhlIHF1ZXN0aW9uIGVycm9yIGxpc3QuXG4gICAqIEBwYXJhbSBlcnJvclxuICAgKi9cbiAgcHVibGljIGFkZEVycm9yKGVycm9yOiBTdXJ2ZXlFcnJvciB8IHN0cmluZykge1xuICAgIGlmICghZXJyb3IpIHJldHVybjtcbiAgICBsZXQgbmV3RXJyb3I6IFN1cnZleUVycm9yID0gbnVsbDtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiIHx8IGVycm9yIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICBuZXdFcnJvciA9IG5ldyBDdXN0b21FcnJvcig8c3RyaW5nPmVycm9yLCB0aGlzLnN1cnZleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0Vycm9yID0gPFN1cnZleUVycm9yPmVycm9yO1xuICAgIH1cbiAgICB0aGlzLmVycm9ycy5wdXNoKG5ld0Vycm9yKTtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFydGljdWxhciBlcnJvciBmcm9tIHRoZSBxdWVzdGlvbiBlcnJvciBsaXN0LlxuICAgKiBAcGFyYW0gZXJyb3JcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFcnJvcihlcnJvcjogU3VydmV5RXJyb3IpIHtcbiAgICB2YXIgZXJyb3JzID0gdGhpcy5lcnJvcnM7XG4gICAgdmFyIGluZGV4ID0gZXJyb3JzLmluZGV4T2YoZXJyb3IpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIGVycm9ycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHByaXZhdGUgY2hlY2tGb3JFcnJvcnMoaXNPblZhbHVlQ2hhbmdlZDogYm9vbGVhbik6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHFFcnJvcnMgPSBuZXcgQXJyYXk8U3VydmV5RXJyb3I+KCk7XG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmICF0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHRoaXMuY29sbGVjdEVycm9ycyhxRXJyb3JzLCBpc09uVmFsdWVDaGFuZ2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIHFFcnJvcnM7XG4gIH1cbiAgcHJpdmF0ZSBjb2xsZWN0RXJyb3JzKFxuICAgIHFFcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPixcbiAgICBpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuXG4gICkge1xuICAgIHRoaXMub25DaGVja0ZvckVycm9ycyhxRXJyb3JzLCBpc09uVmFsdWVDaGFuZ2VkKTtcbiAgICBpZiAocUVycm9ycy5sZW5ndGggPiAwIHx8ICF0aGlzLmNhblJ1blZhbGlkYXRvcnMoaXNPblZhbHVlQ2hhbmdlZCkpIHJldHVybjtcbiAgICB2YXIgZXJyb3JzID0gdGhpcy5ydW5WYWxpZGF0b3JzKCk7XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAvL3ZhbGlkYXRvcnMgbWF5IGNoYW5nZSB0aGUgcXVlc3Rpb24gdmFsdWUuXG4gICAgICBxRXJyb3JzLmxlbmd0aCA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBxRXJyb3JzLnB1c2goZXJyb3JzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHFFcnJvcnMubGVuZ3RoID09IDApIHtcbiAgICAgIHZhciBlcnJvciA9IHRoaXMuZmlyZVN1cnZleVZhbGlkYXRpb24oKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBxRXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2FuUnVuVmFsaWRhdG9ycyhpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBmaXJlU3VydmV5VmFsaWRhdGlvbigpOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKHRoaXMudmFsaWRhdGVWYWx1ZUNhbGxiYWNrKSByZXR1cm4gdGhpcy52YWxpZGF0ZVZhbHVlQ2FsbGJhY2soKTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS52YWxpZGF0ZVF1ZXN0aW9uKHRoaXMpIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhcbiAgICBlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPixcbiAgICBpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuXG4gICkge1xuICAgIGlmICghaXNPblZhbHVlQ2hhbmdlZCAmJiB0aGlzLmhhc1JlcXVpcmVkRXJyb3IoKSkge1xuICAgICAgZXJyb3JzLnB1c2gobmV3IEFuc3dlclJlcXVpcmVkRXJyb3IodGhpcy5yZXF1aXJlZEVycm9yVGV4dCwgdGhpcykpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaGFzUmVxdWlyZWRFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkICYmIHRoaXMuaXNFbXB0eSgpO1xuICB9XG4gIHByaXZhdGUgdmFsaWRhdG9yUnVubmVyOiBWYWxpZGF0b3JSdW5uZXI7XG4gIHByaXZhdGUgaXNSdW5uaW5nVmFsaWRhdG9yc1ZhbHVlID0gZmFsc2U7XG4gIHB1YmxpYyBvbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9yczogKGhhc0Vycm9yczogYm9vbGVhbikgPT4gdm9pZDtcbiAgcHVibGljIGdldCBpc1J1bm5pbmdWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldElzUnVubmluZ1ZhbGlkYXRvcnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXNSdW5uaW5nVmFsaWRhdG9ycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1J1bm5pbmdWYWxpZGF0b3JzVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHJ1blZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICBpZiAoISF0aGlzLnZhbGlkYXRvclJ1bm5lcikge1xuICAgICAgdGhpcy52YWxpZGF0b3JSdW5uZXIub25Bc3luY0NvbXBsZXRlZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdG9yUnVubmVyID0gbmV3IFZhbGlkYXRvclJ1bm5lcigpO1xuICAgIHRoaXMuaXNSdW5uaW5nVmFsaWRhdG9yc1ZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLnZhbGlkYXRvclJ1bm5lci5vbkFzeW5jQ29tcGxldGVkID0gKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSA9PiB7XG4gICAgICB0aGlzLmRvT25Bc3luY0NvbXBsZXRlZChlcnJvcnMpO1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yUnVubmVyLnJ1bih0aGlzKTtcbiAgfVxuICBwcml2YXRlIGRvT25Bc3luY0NvbXBsZXRlZChlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yc1tpXSk7XG4gICAgfVxuICAgIHRoaXMuaXNSdW5uaW5nVmFsaWRhdG9yc1ZhbHVlID0gZmFsc2U7XG4gICAgdGhpcy5yYWlzZU9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJhaXNlT25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMoKSB7XG4gICAgaWYgKCEhdGhpcy5vbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycyAmJiAhdGhpcy5pc1J1bm5pbmdWYWxpZGF0b3JzKSB7XG4gICAgICB0aGlzLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzKHRoaXMuZ2V0QWxsRXJyb3JzKCkubGVuZ3RoID4gMCk7XG4gICAgICB0aGlzLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlQ2hhbmdlZEluU3VydmV5ID0gZmFsc2U7XG4gIHByb3RlY3RlZCBhbGxvd05vdGlmeVZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdmFyIG9sZEFuc3dlcmVkID0gdGhpcy5pc0Fuc3dlcmVkO1xuICAgIHRoaXMuc2V0TmV3VmFsdWVJbkRhdGEobmV3VmFsdWUpO1xuICAgIHRoaXMuYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQgJiYgdGhpcy5vblZhbHVlQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLmlzQW5zd2VyZWQgIT0gb2xkQW5zd2VyZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlUXVlc3Rpb25Dc3MoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGlzVGV4dFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU3VydmV5SW5wdXRUZXh0VXBkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkuaXNVcGRhdGVWYWx1ZVRleHRPblR5cGluZyA6IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgZ2V0RGF0YUxvY05vdGlmaWNhdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmlzSW5wdXRUZXh0VXBkYXRlID8gXCJ0ZXh0XCIgOiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzSW5wdXRUZXh0VXBkYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmlzU3VydmV5SW5wdXRUZXh0VXBkYXRlICYmIHRoaXMuaXNUZXh0VmFsdWUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWVJbkRhdGEobmV3VmFsdWU6IGFueSkge1xuICAgIG5ld1ZhbHVlID0gdGhpcy52YWx1ZVRvRGF0YShuZXdWYWx1ZSk7XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVDaGFuZ2VkSW5TdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWVDb3JlKG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldFZhbHVlQ29yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvblZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRWYWx1ZUNvcmUobmV3VmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSk7XG4gICAgaWYgKHRoaXMuZGF0YSAhPSBudWxsICYmIHRoaXMuY2FuU2V0VmFsdWVUb1N1cnZleSgpKSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMudmFsdWVGb3JTdXJ2ZXk7XG4gICAgICB0aGlzLmRhdGEuc2V0VmFsdWUoXG4gICAgICAgIHRoaXMuZ2V0VmFsdWVOYW1lKCksXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICB0aGlzLmdldERhdGFMb2NOb3RpZmljYXRpb24oKSxcbiAgICAgICAgdGhpcy5hbGxvd05vdGlmeVZhbHVlQ2hhbmdlZFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNhblNldFZhbHVlVG9TdXJ2ZXkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlVG9EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHt9XG4gIHByb3RlY3RlZCBzZXROZXdDb21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnF1ZXN0aW9uQ29tbWVudCA9IG5ld1ZhbHVlO1xuICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kYXRhLnNldENvbW1lbnQoXG4gICAgICAgIHRoaXMuZ2V0VmFsdWVOYW1lKCksXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICB0aGlzLmlzU3VydmV5SW5wdXRUZXh0VXBkYXRlID8gXCJ0ZXh0XCIgOiBmYWxzZVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldFZhbGlkTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG5hbWU7XG4gICAgcmV0dXJuIG5hbWUudHJpbSgpLnJlcGxhY2UoL1tcXHtcXH1dKy9nLCBcIlwiKTtcbiAgfVxuICAvL0lRdWVzdGlvblxuICB1cGRhdGVWYWx1ZUZyb21TdXJ2ZXkobmV3VmFsdWU6IGFueSkge1xuICAgIG5ld1ZhbHVlID0gdGhpcy5nZXRVbmJpbmRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgaWYgKCEhdGhpcy52YWx1ZUZyb21EYXRhQ2FsbGJhY2spIHtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy52YWx1ZUZyb21EYXRhQ2FsbGJhY2sobmV3VmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnNldFF1ZXN0aW9uVmFsdWUodGhpcy52YWx1ZUZyb21EYXRhKG5ld1ZhbHVlKSk7XG4gIH1cbiAgdXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkobmV3VmFsdWU6IGFueSk6IGFueSB7XG4gICAgdGhpcy5xdWVzdGlvbkNvbW1lbnQgPSBuZXdWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55LCB1cGRhdGVJc0Fuc3dlcmVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRoaXMucXVlc3Rpb25WYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMuYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQgJiZcbiAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudmFsdWVDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIGlmICh1cGRhdGVJc0Fuc3dlcmVkKSB0aGlzLnVwZGF0ZUlzQW5zd2VyZWQoKTtcbiAgfVxuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7fVxuICBwdWJsaWMgc2V0VmlzaWJsZUluZGV4KHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc1Zpc2libGUgfHxcbiAgICAgICghdGhpcy5oYXNUaXRsZSAmJiAhc2V0dGluZ3Muc2V0UXVlc3Rpb25WaXNpYmxlSW5kZXhGb3JIaWRkZW5UaXRsZSkgfHxcbiAgICAgICh0aGlzLmhpZGVOdW1iZXIgJiYgIXNldHRpbmdzLnNldFF1ZXN0aW9uVmlzaWJsZUluZGV4Rm9ySGlkZGVuTnVtYmVyKVxuICAgICkge1xuICAgICAgdmFsID0gLTE7XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJbmRleFwiLCB2YWwpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5vXCIsIHRoaXMuY2FsY05vKCkpO1xuICAgIHJldHVybiB2YWwgPCAwID8gMCA6IDE7XG4gIH1cbiAgcHVibGljIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydEdvTmV4dFBhZ2VFcnJvcigpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHJlbW92ZSB2YWx1ZXMgZnJvbSB0aGUgY3VycmVudCBxdWVzdGlvbiwgdGhhdCBlbmQtdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyLlxuICAgKiBGb3IgZXhhbXBsZSB0aGUgdmFsdWUgdGhhdCBkb2Vzbid0IGV4aXN0cyBpbiBhIHJhZGlncm91cC9kcm9wZG93bi9jaGVja2JveCBjaG9pY2VzIG9yIG1hdHJpeCByb3dzL2NvbHVtbnMuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7fVxuICBwdWJsaWMgY2xlYXJPbkRlbGV0aW5nQ29udGFpbmVyKCkge31cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byBjbGVhciBhbGwgZXJyb3JzIGluIHRoZSBxdWVzdGlvblxuICAgKi9cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIHRoaXMuZXJyb3JzID0gW107XG4gIH1cbiAgcHVibGljIGNsZWFyVW51c2VkVmFsdWVzKCkge31cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7fVxuICBjaGVja0JpbmRpbmdzKHZhbHVlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuYmluZGluZ3MuaXNFbXB0eSgpIHx8ICF0aGlzLmRhdGEpIHJldHVybjtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLmJpbmRpbmdzLmdldFByb3BlcnRpZXNCeVZhbHVlTmFtZSh2YWx1ZU5hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXNbcHJvcHNbaV1dID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8vSUxvY2FsaXphYmxlT3duZXJcbiAgbG9jT3duZXI6IElMb2NhbGl6YWJsZU93bmVyID0gbnVsbDtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VydmV5IGxvY2FsZVxuICAgKiBAc2VlIFN1cnZleU1vZGVsLmxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleVxuICAgICAgPyAoPElMb2NhbGl6YWJsZU93bmVyPig8YW55PnRoaXMuc3VydmV5KSkuZ2V0TG9jYWxlKClcbiAgICAgIDogdGhpcy5sb2NPd25lclxuICAgICAgPyB0aGlzLmxvY093bmVyLmdldExvY2FsZSgpXG4gICAgICA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5XG4gICAgICA/IHRoaXMuc3VydmV5LmdldFN1cnZleU1hcmtkb3duSHRtbCh0aGlzLCB0ZXh0LCBuYW1lKVxuICAgICAgOiB0aGlzLmxvY093bmVyXG4gICAgICA/IHRoaXMubG9jT3duZXIuZ2V0TWFya2Rvd25IdG1sKHRleHQsIG5hbWUpXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldFJlbmRlcmVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ICYmIHR5cGVvZiB0aGlzLnN1cnZleS5nZXRSZW5kZXJlckZvclN0cmluZyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHRoaXMuc3VydmV5LmdldFJlbmRlcmVyRm9yU3RyaW5nKHRoaXMsIG5hbWUpXG4gICAgICA6IHRoaXMubG9jT3duZXIgJiYgdHlwZW9mIHRoaXMubG9jT3duZXIuZ2V0UmVuZGVyZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0aGlzLmxvY093bmVyLmdldFJlbmRlcmVyKG5hbWUpXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuIHRleHQ7XG4gICAgaWYgKHRoaXMudGV4dFByb2Nlc3NvcilcbiAgICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHQodGV4dCwgdGhpcy51c2VEaXNwbGF5VmFsdWVzSW5UaXRsZSk7XG4gICAgaWYgKHRoaXMubG9jT3duZXIpIHJldHVybiB0aGlzLmxvY093bmVyLmdldFByb2Nlc3NlZFRleHQodGV4dCk7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgcHVibGljIGdldENvbXBvbmVudE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gUmVuZGVyZXJGYWN0b3J5Lkluc3RhbmNlLmdldFJlbmRlcmVyQnlRdWVzdGlvbih0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0RlZmF1bHRSZW5kZXJpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5jdXN0b21XaWRnZXQgfHxcbiAgICAgIHRoaXMucmVuZGVyQXMgPT09IFwiZGVmYXVsdFwiIHx8XG4gICAgICB0aGlzLmdldENvbXBvbmVudE5hbWUoKSA9PT0gXCJkZWZhdWx0XCJcbiAgICApO1xuICB9XG5cbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBcImRlZmF1bHRcIiB9KVxuICByZW5kZXJBczogc3RyaW5nO1xuXG4gIC8vSVN1cnZleUVycm9yT3duZXJcbiAgZ2V0RXJyb3JDdXN0b21UZXh0KHRleHQ6IHN0cmluZywgZXJyb3I6IFN1cnZleUVycm9yKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkgcmV0dXJuIHRoaXMuc3VydmV5LmdldEVycm9yQ3VzdG9tVGV4dCh0ZXh0LCBlcnJvcik7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgLy9JVmFsaWRhdG9yT3duZXJcbiAgZ2V0VmFsaWRhdG9yVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgdmFsaWRhdGVkVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuICBzZXQgdmFsaWRhdGVkVmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsO1xuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSA6IG51bGw7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXCJxdWVzdGlvblwiLCBbXG4gIFwiIW5hbWVcIixcbiAge1xuICAgIG5hbWU6IFwic3RhdGVcIixcbiAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwiY29sbGFwc2VkXCIsIFwiZXhwYW5kZWRcIl0sXG4gIH0sXG4gIHsgbmFtZTogXCJ2aXNpYmxlOnN3aXRjaFwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJ1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUsIGxheW91dDogXCJyb3dcIiB9LFxuICBcInZpc2libGVJZjpjb25kaXRpb25cIixcbiAgeyBuYW1lOiBcIndpZHRoXCIgfSxcbiAgeyBuYW1lOiBcIm1pbldpZHRoXCIsIGRlZmF1bHQ6IHNldHRpbmdzLm1pbldpZHRoIH0sXG4gIHsgbmFtZTogXCJtYXhXaWR0aFwiLCBkZWZhdWx0OiBzZXR0aW5ncy5tYXhXaWR0aCB9LFxuICB7IG5hbWU6IFwic3RhcnRXaXRoTmV3TGluZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUsIGxheW91dDogXCJyb3dcIiB9LFxuICB7IG5hbWU6IFwiaW5kZW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgM10sIGxheW91dDogXCJyb3dcIiB9LFxuICB7XG4gICAgbmFtZTogXCJwYWdlXCIsXG4gICAgaXNTZXJpYWxpemFibGU6IGZhbHNlLFxuICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgIHZhciBzdXJ2ZXkgPSBvYmogPyBvYmouc3VydmV5IDogbnVsbDtcbiAgICAgIHJldHVybiAhc3VydmV5IHx8IHN1cnZleS5wYWdlcy5sZW5ndGggPiAxO1xuICAgIH0sXG4gICAgY2hvaWNlczogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgIHZhciBzdXJ2ZXkgPSBvYmogPyBvYmouc3VydmV5IDogbnVsbDtcbiAgICAgIHJldHVybiBzdXJ2ZXlcbiAgICAgICAgPyBzdXJ2ZXkucGFnZXMubWFwKChwOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBwLm5hbWUsIHRleHQ6IHAudGl0bGUgfTtcbiAgICAgICAgICB9KVxuICAgICAgICA6IFtdO1xuICAgIH0sXG4gIH0sXG4gIHsgbmFtZTogXCJ0aXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAge1xuICAgIG5hbWU6IFwidGl0bGVMb2NhdGlvblwiLFxuICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwiaGlkZGVuXCJdLFxuICAgIGxheW91dDogXCJyb3dcIixcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLFxuICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NEZXNjcmlwdGlvblwiLFxuICAgIGxheW91dDogXCJyb3dcIixcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiZGVzY3JpcHRpb25Mb2NhdGlvblwiLFxuICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJ1bmRlcklucHV0XCIsIFwidW5kZXJUaXRsZVwiXSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiaGlkZU51bWJlcjpib29sZWFuXCIsXG4gICAgZGVwZW5kc09uOiBcInRpdGxlTG9jYXRpb25cIixcbiAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICBpZiAoIW9iaikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICgoPFF1ZXN0aW9uPm9iaikudGl0bGVMb2NhdGlvbiA9PT0gXCJoaWRkZW5cIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcGFyZW50OiBQYW5lbE1vZGVsID0gb2JqID8gb2JqLnBhcmVudCA6IG51bGw7XG4gICAgICB2YXIgbnVtYmVyaW5nQWxsb3dlZEJ5UGFyZW50ID1cbiAgICAgICAgIXBhcmVudCB8fCBwYXJlbnQuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPT0gXCJvZmZcIjtcbiAgICAgIGlmICghbnVtYmVyaW5nQWxsb3dlZEJ5UGFyZW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBzdXJ2ZXk6IFN1cnZleU1vZGVsID0gb2JqID8gb2JqLnN1cnZleSA6IG51bGw7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhc3VydmV5IHx8XG4gICAgICAgIHN1cnZleS5zaG93UXVlc3Rpb25OdW1iZXJzICE9PSBcIm9mZlwiIHx8XG4gICAgICAgICghIXBhcmVudCAmJiBwYXJlbnQuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PT0gXCJvbnBhbmVsXCIpXG4gICAgICApO1xuICAgIH0sXG4gIH0sXG4gIFwidmFsdWVOYW1lXCIsXG4gIFwiZW5hYmxlSWY6Y29uZGl0aW9uXCIsXG4gIFwiZGVmYXVsdFZhbHVlOnZhbHVlXCIsXG4gIHtcbiAgICBuYW1lOiBcImRlZmF1bHRWYWx1ZUV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgIGNhdGVnb3J5OiBcImxvZ2ljXCIsXG4gIH0sXG4gIFwiY29ycmVjdEFuc3dlcjp2YWx1ZVwiLFxuICBcImlzUmVxdWlyZWQ6c3dpdGNoXCIsXG4gIFwicmVxdWlyZWRJZjpjb25kaXRpb25cIixcbiAge1xuICAgIG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHQ6dGV4dFwiLFxuICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZXF1aXJlZEVycm9yVGV4dFwiLFxuICB9LFxuICBcInJlYWRPbmx5OnN3aXRjaFwiLFxuICB7XG4gICAgbmFtZTogXCJ2YWxpZGF0b3JzOnZhbGlkYXRvcnNcIixcbiAgICBiYXNlQ2xhc3NOYW1lOiBcInN1cnZleXZhbGlkYXRvclwiLFxuICAgIGNsYXNzTmFtZVBhcnQ6IFwidmFsaWRhdG9yXCIsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcImJpbmRpbmdzOmJpbmRpbmdzXCIsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImJpbmRpbmdzXCIsXG4gICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgcmV0dXJuIG9iai5iaW5kaW5ncy5nZXROYW1lcygpLmxlbmd0aCA+IDA7XG4gICAgfSxcbiAgfSxcbiAgeyBuYW1lOiBcInJlbmRlckFzXCIsIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuXSk7XG5TZXJpYWxpemVyLmFkZEFsdGVyTmF0aXZlQ2xhc3NOYW1lKFwicXVlc3Rpb25cIiwgXCJxdWVzdGlvbmJhc2VcIik7XG4iLCJpbXBvcnQgeyBCYXNlLCBFdmVudCB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICBwdWJsaWMgaHRtbFRlbXBsYXRlOiBzdHJpbmc7XG4gIHB1YmxpYyBpc0ZpcnN0UmVuZGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgd2lkZ2V0SnNvbjogYW55KSB7XG4gICAgdGhpcy5odG1sVGVtcGxhdGUgPSB3aWRnZXRKc29uLmh0bWxUZW1wbGF0ZSA/IHdpZGdldEpzb24uaHRtbFRlbXBsYXRlIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgYWZ0ZXJSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgZWw6IGFueSkge1xuICAgIGlmICh0aGlzLmlzRmlyc3RSZW5kZXIpIHtcbiAgICAgIHRoaXMuaXNGaXJzdFJlbmRlciA9IGZhbHNlO1xuICAgICAgcXVlc3Rpb24uc3VydmV5Lm9uTG9jYWxlQ2hhbmdlZEV2ZW50LmFkZCgoKSA9PiB7XG4gICAgICAgIHRoaXMud2lkZ2V0SnNvbi53aWxsVW5tb3VudChxdWVzdGlvbiwgZWwpO1xuICAgICAgICB0aGlzLndpZGdldEpzb24uYWZ0ZXJSZW5kZXIocXVlc3Rpb24sIGVsKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndpZGdldEpzb24uYWZ0ZXJSZW5kZXIpIHRoaXMud2lkZ2V0SnNvbi5hZnRlclJlbmRlcihxdWVzdGlvbiwgZWwpO1xuICB9XG4gIHB1YmxpYyB3aWxsVW5tb3VudChxdWVzdGlvbjogSVF1ZXN0aW9uLCBlbDogYW55KSB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SnNvbi53aWxsVW5tb3VudCkgdGhpcy53aWRnZXRKc29uLndpbGxVbm1vdW50KHF1ZXN0aW9uLCBlbCk7XG4gIH1cbiAgcHVibGljIGdldERpc3BsYXlWYWx1ZShxdWVzdGlvbjogSVF1ZXN0aW9uLCB2YWx1ZTogYW55ID0gdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLmdldERpc3BsYXlWYWx1ZSlcbiAgICAgIHJldHVybiB0aGlzLndpZGdldEpzb24uZ2V0RGlzcGxheVZhbHVlKHF1ZXN0aW9uLCB2YWx1ZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGlzRml0KHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0xpYnJhcnlMb2FkZWQoKSAmJiB0aGlzLndpZGdldEpzb24uaXNGaXQpXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLmlzRml0KHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBjYW5TaG93SW5Ub29sYm94KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLndpZGdldEpzb24uc2hvd0luVG9vbGJveCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoXG4gICAgICBDdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmdldEFjdGl2YXRlZEJ5KHRoaXMubmFtZSkgIT0gXCJjdXN0b210eXBlXCJcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICF0aGlzLndpZGdldEpzb24ud2lkZ2V0SXNMb2FkZWQgfHwgdGhpcy53aWRnZXRKc29uLndpZGdldElzTG9hZGVkKCk7XG4gIH1cbiAgcHVibGljIGdldCBzaG93SW5Ub29sYm94KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLndpZGdldEpzb24uc2hvd0luVG9vbGJveCAhPT0gZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldCBzaG93SW5Ub29sYm94KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMud2lkZ2V0SnNvbi5zaG93SW5Ub29sYm94ID0gdmFsO1xuICB9XG4gIHB1YmxpYyBpbml0KCkge1xuICAgIGlmICh0aGlzLndpZGdldEpzb24uaW5pdCkge1xuICAgICAgdGhpcy53aWRnZXRKc29uLmluaXQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaXNMaWJyYXJ5TG9hZGVkKCkgJiYgdGhpcy53aWRnZXRKc29uLmFjdGl2YXRlZEJ5Q2hhbmdlZCkge1xuICAgICAgdGhpcy53aWRnZXRKc29uLmFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNMaWJyYXJ5TG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLndpZGdldEpzb24ud2lkZ2V0SXNMb2FkZWQpXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLndpZGdldElzTG9hZGVkKCkgPT0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzRGVmYXVsdFJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLmlzRGVmYXVsdFJlbmRlcjtcbiAgfVxuICBwdWJsaWMgZ2V0IHBkZlF1ZXN0aW9uVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLndpZGdldEpzb24ucGRmUXVlc3Rpb25UeXBlO1xuICB9XG4gIHB1YmxpYyBnZXQgcGRmUmVuZGVyKCkge1xuICAgIHJldHVybiB0aGlzLndpZGdldEpzb24ucGRmUmVuZGVyO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21XaWRnZXRDb2xsZWN0aW9uIHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbiA9IG5ldyBDdXN0b21XaWRnZXRDb2xsZWN0aW9uKCk7XG4gIHByaXZhdGUgd2lkZ2V0c1ZhbHVlczogQXJyYXk8UXVlc3Rpb25DdXN0b21XaWRnZXQ+ID0gW107XG4gIHByaXZhdGUgd2lkZ2V0c0FjdGl2YXRlZEJ5ID0ge307XG5cbiAgcHVibGljIG9uQ3VzdG9tV2lkZ2V0QWRkZWQ6IEV2ZW50PFxuICAgIChjdXN0b21XaWRnZXQ6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KGN1c3RvbVdpZGdldDogUXVlc3Rpb25DdXN0b21XaWRnZXQpID0+IGFueSwgYW55PigpO1xuXG4gIHB1YmxpYyBnZXQgd2lkZ2V0cygpOiBBcnJheTxRdWVzdGlvbkN1c3RvbVdpZGdldD4ge1xuICAgIHJldHVybiB0aGlzLndpZGdldHNWYWx1ZXM7XG4gIH1cbiAgcHVibGljIGFkZCh3aWRnZXRKc29uOiBhbnksIGFjdGl2YXRlZEJ5OiBzdHJpbmcgPSBcInByb3BlcnR5XCIpIHtcbiAgICB0aGlzLmFkZEN1c3RvbVdpZGdldCh3aWRnZXRKc29uLCBhY3RpdmF0ZWRCeSk7XG4gIH1cbiAgcHVibGljIGFkZEN1c3RvbVdpZGdldChcbiAgICB3aWRnZXRKc29uOiBhbnksXG4gICAgYWN0aXZhdGVkQnk6IHN0cmluZyA9IFwicHJvcGVydHlcIlxuICApOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gICAgdmFyIG5hbWUgPSB3aWRnZXRKc29uLm5hbWU7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBuYW1lID0gXCJ3aWRnZXRfXCIgKyB0aGlzLndpZGdldHMubGVuZ3RoICsgMTtcbiAgICB9XG4gICAgdmFyIGN1c3RvbVdpZGdldCA9IG5ldyBRdWVzdGlvbkN1c3RvbVdpZGdldChuYW1lLCB3aWRnZXRKc29uKTtcbiAgICB0aGlzLndpZGdldHNWYWx1ZXMucHVzaChjdXN0b21XaWRnZXQpO1xuICAgIGN1c3RvbVdpZGdldC5pbml0KCk7XG4gICAgKDxhbnk+dGhpcykud2lkZ2V0c0FjdGl2YXRlZEJ5W25hbWVdID0gYWN0aXZhdGVkQnk7XG4gICAgY3VzdG9tV2lkZ2V0LmFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeSk7XG4gICAgdGhpcy5vbkN1c3RvbVdpZGdldEFkZGVkLmZpcmUoY3VzdG9tV2lkZ2V0LCBudWxsKTtcbiAgICByZXR1cm4gY3VzdG9tV2lkZ2V0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3YXkgdGhlIGN1c3RvbSB3aWdldCBpcyBhY3RpdmF0ZWQuIEl0IGNhbiBiZSBhY3RpdmF0ZWQgYnkgYSBwcm9wZXJ0eSAoXCJwcm9wZXJ0eVwiKSwgcXVlc3Rpb24gdHlwZSAoXCJ0eXBlXCIpIG9yIGJ5IG5ldy9jdXN0b20gcXVlc3Rpb24gdHlwZSAoXCJjdXN0b210eXBlXCIpLlxuICAgKiBAcGFyYW0gd2lkZ2V0TmFtZSB0aGUgY3VzdG9tIHdpZGdldCBuYW1lXG4gICAqIEBzZWUgc2V0QWN0aXZhdGVkQnlcbiAgICovXG4gIHB1YmxpYyBnZXRBY3RpdmF0ZWRCeSh3aWRnZXROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSAoPGFueT50aGlzKS53aWRnZXRzQWN0aXZhdGVkQnlbd2lkZ2V0TmFtZV07XG4gICAgcmV0dXJuIHJlcyA/IHJlcyA6IFwicHJvcGVydHlcIjtcbiAgfVxuICAvKipcbiAgICogU2V0cyB0aGUgd2F5IHRoZSBjdXN0b20gd2lnZXQgaXMgYWN0aXZhdGVkLiBUaGUgYWN0aXZhdGlvbiB0eXBlcyBhcmU6IHByb3BlcnR5IChcInByb3BlcnR5XCIpLCBxdWVzdGlvbiB0eXBlIChcInR5cGVcIikgb3IgbmV3L2N1c3RvbSBxdWVzdGlvbiB0eXBlIChcImN1c3RvbXR5cGVcIikuIEEgY3VzdG9tIHdpZ2V0IG1heSBzdXBwb3J0IGFsbCBvciBvbmx5IHNvbWUgb2YgdGhpcyBhY3RpdmF0aW9uIHR5cGVzLlxuICAgKiBAcGFyYW0gd2lkZ2V0TmFtZVxuICAgKiBAcGFyYW0gYWN0aXZhdGVkQnkgdGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHZhcmlhbnRzOiBcInByb3BlcnR5XCIsIFwidHlwZVwiIGFuZCBcImN1c3RvbXR5cGVcIlxuICAgKi9cbiAgcHVibGljIHNldEFjdGl2YXRlZEJ5KHdpZGdldE5hbWU6IHN0cmluZywgYWN0aXZhdGVkQnk6IHN0cmluZykge1xuICAgIGlmICghd2lkZ2V0TmFtZSB8fCAhYWN0aXZhdGVkQnkpIHJldHVybjtcbiAgICB2YXIgd2lkZ2V0ID0gdGhpcy5nZXRDdXN0b21XaWRnZXRCeU5hbWUod2lkZ2V0TmFtZSk7XG4gICAgaWYgKCF3aWRnZXQpIHJldHVybjtcbiAgICAoPGFueT50aGlzKS53aWRnZXRzQWN0aXZhdGVkQnlbd2lkZ2V0TmFtZV0gPSBhY3RpdmF0ZWRCeTtcbiAgICB3aWRnZXQuYWN0aXZhdGVkQnlDaGFuZ2VkKGFjdGl2YXRlZEJ5KTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy53aWRnZXRzVmFsdWVzID0gW107XG4gIH1cbiAgcHVibGljIGdldEN1c3RvbVdpZGdldEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndpZGdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLndpZGdldHNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy53aWRnZXRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0Q3VzdG9tV2lkZ2V0KHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndpZGdldHNWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLndpZGdldHNWYWx1ZXNbaV0uaXNGaXQocXVlc3Rpb24pKSByZXR1cm4gdGhpcy53aWRnZXRzVmFsdWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vc3VydmV5LWVycm9yXCI7XG5pbXBvcnQgeyBJU3VydmV5SW1wbCwgSVN1cnZleSB9IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgT3RoZXJFbXB0eUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IENob2ljZXNSZXN0ZnVsIH0gZnJvbSBcIi4vY2hvaWNlc1Jlc3RmdWxcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IEhlbHBlcnMsIEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuLyoqXG4gKiBJdCBpcyBhIGJhc2UgY2xhc3MgZm9yIGNoZWNrYm94LCBkcm9wZG93biBhbmQgcmFkaW9ncm91cCBxdWVzdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblNlbGVjdEJhc2UgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIHB1YmxpYyB2aXNpYmxlQ2hvaWNlc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBmaWx0ZXJlZENob2ljZXNWYWx1ZTogQXJyYXk8SXRlbVZhbHVlPjtcbiAgcHJpdmF0ZSBjb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHByaXZhdGUgY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHByaXZhdGUgY29tbWVudFZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgcHJldkNvbW1lbnRWYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIG90aGVySXRlbVZhbHVlOiBJdGVtVmFsdWUgPSBuZXcgSXRlbVZhbHVlKFwib3RoZXJcIik7XG4gIHByaXZhdGUgY2hvaWNlc0Zyb21Vcmw6IEFycmF5PEl0ZW1WYWx1ZT47XG4gIHByaXZhdGUgY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0czogYW55O1xuICBwcml2YXRlIGlzQ2hvaWNlc0xvYWRlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBlbmFibGVPbkxvYWRpbmdDaG9pY2VzOiBib29sZWFuO1xuICBwcml2YXRlIGRlcGVuZGVkUXVlc3Rpb25zOiBBcnJheTxRdWVzdGlvblNlbGVjdEJhc2U+ID0gW107XG4gIHByaXZhdGUgbm9uZUl0ZW1WYWx1ZTogSXRlbVZhbHVlID0gbmV3IEl0ZW1WYWx1ZShcIm5vbmVcIik7XG4gIHByaXZhdGUgbmV3SXRlbVZhbHVlOiBJdGVtVmFsdWU7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBub25lSXRlbVRleHQgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibm9uZVRleHRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgbm9uZUl0ZW1UZXh0Lm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9uZUl0ZW1UZXh0XCIpO1xuICAgIH07XG4gICAgdGhpcy5ub25lSXRlbVZhbHVlLmxvY093bmVyID0gdGhpcztcbiAgICB0aGlzLm5vbmVJdGVtVmFsdWUuc2V0TG9jVGV4dChub25lSXRlbVRleHQpO1xuXG4gICAgdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwiY2hvaWNlc1wiKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiY2hvaWNlc1wiLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZmlsdGVySXRlbXMoKSkge1xuICAgICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiY2hvaWNlc0Zyb21RdWVzdGlvblwiLCBcImNob2ljZXNGcm9tUXVlc3Rpb25Nb2RlXCIsIFwiaGFzTm9uZVwiXSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImhpZGVJZkNob2ljZXNFbXB0eVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHlCYXNlZE9uQ2hvaWNlcygpO1xuICAgIH0pO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJ2aXNpYmxlQ2hvaWNlc1wiKTtcbiAgICB0aGlzLnNldE5ld1Jlc3RmdWxQcm9wZXJ0eSgpO1xuICAgIHZhciBsb2NPdGhlclRleHQgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJvdGhlckVycm9yVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLm90aGVySXRlbVZhbHVlLmxvY093bmVyID0gdGhpcztcbiAgICB0aGlzLm90aGVySXRlbVZhbHVlLnNldExvY1RleHQobG9jT3RoZXJUZXh0KTtcbiAgICBsb2NPdGhlclRleHQub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gISF0ZXh0ID8gdGV4dCA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpO1xuICAgIH07XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwuYmVmb3JlU2VuZFJlcXVlc3RDYWxsYmFjayA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25CZWZvcmVTZW5kUmVxdWVzdCgpO1xuICAgIH07XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwuZ2V0UmVzdWx0Q2FsbGJhY2sgPSAoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25Mb2FkQ2hvaWNlc0Zyb21VcmwoaXRlbXMpO1xuICAgIH07XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwudXBkYXRlUmVzdWx0Q2FsbGJhY2sgPSAoXG4gICAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICAgIHNlcnZlclJlc3VsdDogYW55XG4gICAgKTogQXJyYXk8SXRlbVZhbHVlPiA9PiB7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VydmV5LnVwZGF0ZUNob2ljZXNGcm9tU2VydmVyKHRoaXMsIGl0ZW1zLCBzZXJ2ZXJSZXN1bHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH07XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyUGxhY2VIb2xkZXJcIiwgdGhpcyk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzZWxlY3RiYXNlXCI7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kZXBlbmRlZFF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5kZXBlbmRlZFF1ZXN0aW9uc1tpXS5jaG9pY2VzRnJvbVF1ZXN0aW9uID0gXCJcIjtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVGcm9tRGVwZW5kZWRRdWVzdGlvbih0aGlzLmdldFF1ZXN0aW9uV2l0aENob2ljZXMoKSk7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlRXJyb3IoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzT3RoZXJTZWxlY3RlZCB8fCAhIXRoaXMuY29tbWVudDtcbiAgfVxuICBpc0xheW91dFR5cGVTdXBwb3J0ZWQobGF5b3V0VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGxvY2FsZUNoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jYWxlQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLmNob2ljZXNPcmRlciAhPT0gXCJub25lXCIpIHtcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUNob2ljZXMoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgaWYgKCEhdGhpcy5jaG9pY2VzRnJvbVVybCkge1xuICAgICAgSXRlbVZhbHVlLmxvY1N0cnNDaGFuZ2VkKHRoaXMuY2hvaWNlc0Zyb21VcmwpO1xuICAgICAgSXRlbVZhbHVlLmxvY1N0cnNDaGFuZ2VkKHRoaXMudmlzaWJsZUNob2ljZXMpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3RoZXIgaXRlbS4gQnkgdXNpbmcgdGhpcyBwcm9wZXJ0eSwgeW91IG1heSBjaGFuZ2UgcHJvZ3JhbW1hdGljYWxseSBpdCdzIHZhbHVlIGFuZCB0ZXh0LlxuICAgKiBAc2VlIGhhc090aGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVySXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIHJldHVybiB0aGlzLm90aGVySXRlbVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYSB1c2VyIHNlbGVjdCB0aGUgJ290aGVyJyBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBpc090aGVyU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzT3RoZXIgJiYgdGhpcy5nZXRIYXNPdGhlcih0aGlzLnJlbmRlcmVkVmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBzaG93IHRoZSBcIk5vbmVcIiBpdGVtIG9uIHRoZSBib3R0b20uIElmIGVuZC11c2VyIGNoZWNrcyB0aGlzIGl0ZW0sIGFsbCBvdGhlciBpdGVtcyB3b3VsZCBiZSB1bmNoZWNrZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc05vbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc05vbmVcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaGFzTm9uZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJoYXNOb25lXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vbmUgaXRlbS4gQnkgdXNpbmcgdGhpcyBwcm9wZXJ0eSwgeW91IG1heSBjaGFuZ2UgcHJvZ3JhbW1hdGljYWxseSBpdCdzIHZhbHVlIGFuZCB0ZXh0LlxuICAgKiBAc2VlIGhhc05vbmVcbiAgICovXG4gIHB1YmxpYyBnZXQgbm9uZUl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5ub25lSXRlbVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIGRpZmZlcmVudCB0ZXh0IGZvciBub25lIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5vbmVUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJub25lVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vbmVJdGVtVGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBub25lVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibm9uZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTm9uZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibm9uZVRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIEl0IHJ1bnMgYWdhaW5zdCBlYWNoIGNob2ljZXMgaXRlbSBhbmQgaWYgZm9yIHRoaXMgaXRlbSBpdCByZXR1cm5zIHRydWUsIHRoZW4gdGhlIGl0ZW0gaXMgdmlzaWJsZSBvdGhlcndpc2UgdGhlIGl0ZW0gYmVjb21lcyBpbnZpc2libGUuIFBsZWFzZSB1c2Uge2l0ZW19IHRvIGdldCB0aGUgY3VycmVudCBpdGVtIHZhbHVlIGluIHRoZSBleHByZXNzaW9uLlxuICAgKiBAc2VlIHZpc2libGVJZlxuICAgKiBAc2VlIGNob2ljZXNFbmFibGVJZlxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzVmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNWaXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzVmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1Zpc2libGVJZlwiLCB2YWwpO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSXQgcnVucyBhZ2FpbnN0IGVhY2ggY2hvaWNlcyBpdGVtIGFuZCBpZiBmb3IgdGhpcyBpdGVtIGl0IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgaXRlbSBpcyBlbmFibGVkIG90aGVyd2lzZSB0aGUgaXRlbSBiZWNvbWVzIGRpc2FibGVkLiBQbGVhc2UgdXNlIHtpdGVtfSB0byBnZXQgdGhlIGN1cnJlbnQgaXRlbSB2YWx1ZSBpbiB0aGUgZXhwcmVzc2lvbi5cbiAgICogQHNlZSBjaG9pY2VzVmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNFbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzRW5hYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzRW5hYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzRW5hYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuSXRlbXNFbmFibGVDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLnJ1bkl0ZW1zQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVGV4dFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlOyAvL2ZvciBjb21tZW50cyBhbmQgb3RoZXJzXG4gIH1cbiAgcHJpdmF0ZSBpc1NldHRpbmdEZWZhdWx0VmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICB0aGlzLmlzU2V0dGluZ0RlZmF1bHRWYWx1ZSA9XG4gICAgICAhdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpICYmXG4gICAgICB0aGlzLmhhc1Vua25vd25WYWx1ZSh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gICAgdGhpcy5wcmV2Q29tbWVudFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHN1cGVyLnNldERlZmF1bHRWYWx1ZSgpO1xuICAgIHRoaXMuaXNTZXR0aW5nRGVmYXVsdFZhbHVlID0gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzTXVsdGlwbGVWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGNvbnZlcnREZWZhdWx0VmFsdWUodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgPT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsO1xuICAgIGlmICh0aGlzLmdldElzTXVsdGlwbGVWYWx1ZSgpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIFt2YWxdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPiAwKSByZXR1cm4gdmFsWzBdO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByb3RlY3RlZCBmaWx0ZXJJdGVtcygpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8XG4gICAgICAhdGhpcy5kYXRhIHx8XG4gICAgICB0aGlzLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZ1xuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgIHRoaXMucnVuSXRlbXNFbmFibGVDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICByZXR1cm4gdGhpcy5ydW5JdGVtc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByb3RlY3RlZCBydW5JdGVtc0NvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICk6IGJvb2xlYW4ge1xuICAgIHRoaXMuc2V0Q29uZGl0aW9uYWxDaG9pY2VzUnVubmVyKCk7XG4gICAgdmFyIGhhc0NoYW5nZXMgPSB0aGlzLnJ1bkNvbmRpdGlvbnNGb3JJdGVtcyh2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIGlmIChcbiAgICAgICEhdGhpcy5maWx0ZXJlZENob2ljZXNWYWx1ZSAmJlxuICAgICAgdGhpcy5maWx0ZXJlZENob2ljZXNWYWx1ZS5sZW5ndGggPT09IHRoaXMuYWN0aXZlQ2hvaWNlcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VzO1xuICB9XG4gIHByb3RlY3RlZCBydW5JdGVtc0VuYWJsZUNvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICk6IGFueSB7XG4gICAgdGhpcy5zZXRDb25kaXRpb25hbEVuYWJsZUNob2ljZXNSdW5uZXIoKTtcbiAgICB2YXIgaGFzQ2hhbmdlZCA9IEl0ZW1WYWx1ZS5ydW5FbmFibGVkQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgICAgdGhpcy5hY3RpdmVDaG9pY2VzLFxuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzRW5hYmxlSWZSdW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgKGl0ZW06IEl0ZW1WYWx1ZSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vbkVuYWJsZUl0ZW1DYWxsQmFjayhpdGVtKTtcbiAgICAgIH1cbiAgICApO1xuICAgIGlmIChoYXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmNsZWFyRGlzYWJsZWRWYWx1ZXMoKTtcbiAgICB9XG4gICAgdGhpcy5vbkFmdGVyUnVuSXRlbXNFbmFibGVDb25kaXRpb24oKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25BZnRlclJ1bkl0ZW1zRW5hYmxlQ29uZGl0aW9uKCkge31cbiAgcHJvdGVjdGVkIG9uRW5hYmxlSXRlbUNhbGxCYWNrKGl0ZW06IEl0ZW1WYWx1ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgc2V0Q29uZGl0aW9uYWxDaG9pY2VzUnVubmVyKCkge1xuICAgIGlmICh0aGlzLmNob2ljZXNWaXNpYmxlSWYpIHtcbiAgICAgIGlmICghdGhpcy5jb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyKSB7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIoXG4gICAgICAgICAgdGhpcy5jaG9pY2VzVmlzaWJsZUlmXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNWaXNpYmxlSWZSdW5uZXIuZXhwcmVzc2lvbiA9IHRoaXMuY2hvaWNlc1Zpc2libGVJZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZXRDb25kaXRpb25hbEVuYWJsZUNob2ljZXNSdW5uZXIoKSB7XG4gICAgaWYgKHRoaXMuY2hvaWNlc0VuYWJsZUlmKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyKSB7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcihcbiAgICAgICAgICB0aGlzLmNob2ljZXNFbmFibGVJZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzRW5hYmxlSWZSdW5uZXIuZXhwcmVzc2lvbiA9IHRoaXMuY2hvaWNlc0VuYWJsZUlmO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNFbmFibGVJZlJ1bm5lciA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdGhpcy5maWx0ZXJlZENob2ljZXNWYWx1ZSA9IFtdO1xuICAgIHJldHVybiBJdGVtVmFsdWUucnVuQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgICAgdGhpcy5hY3RpdmVDaG9pY2VzLFxuICAgICAgdGhpcy5nZXRGaWx0ZXJlZENob2ljZXMoKSxcbiAgICAgIHRoaXMuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMuY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lcixcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICAhdGhpcy5zdXJ2ZXkgfHwgIXRoaXMuc3VydmV5LmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZ1xuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEhhc090aGVyKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbCA9PT0gdGhpcy5vdGhlckl0ZW0udmFsdWU7XG4gIH1cbiAgZ2V0IHZhbGlkYXRlZFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZHJlZFZhbHVlVG9EYXRhQ29yZSh0aGlzLnZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzdGZ1bCgpOiBDaG9pY2VzUmVzdGZ1bCB7XG4gICAgcmV0dXJuIG5ldyBDaG9pY2VzUmVzdGZ1bCgpO1xuICB9XG4gIHByaXZhdGUgc2V0TmV3UmVzdGZ1bFByb3BlcnR5KCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNCeVVybFwiLCB0aGlzLmNyZWF0ZVJlc3RmdWwoKSk7XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwub3duZXIgPSB0aGlzO1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsLmxvYWRpbmdPd25lciA9IHRoaXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFF1ZXN0aW9uQ29tbWVudCgpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMuY29tbWVudFZhbHVlKSByZXR1cm4gdGhpcy5jb21tZW50VmFsdWU7XG4gICAgaWYgKHRoaXMuaGFzQ29tbWVudCB8fCB0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpXG4gICAgICByZXR1cm4gc3VwZXIuZ2V0UXVlc3Rpb25Db21tZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuY29tbWVudFZhbHVlO1xuICB9XG4gIHByaXZhdGUgaXNTZXR0aW5nQ29tbWVudDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25Db21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5oYXNDb21tZW50IHx8IHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSlcbiAgICAgIHN1cGVyLnNldFF1ZXN0aW9uQ29tbWVudChuZXdWYWx1ZSk7XG4gICAgZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuaXNTZXR0aW5nQ29tbWVudCAmJiBuZXdWYWx1ZSAhPSB0aGlzLmNvbW1lbnRWYWx1ZSkge1xuICAgICAgICB0aGlzLmlzU2V0dGluZ0NvbW1lbnQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbW1lbnRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICBpZiAodGhpcy5pc090aGVyU2VsZWN0ZWQgJiYgIXRoaXMuaXNSZW5kZXJlZFZhbHVlU2V0dGluZykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnJlbmRyZWRWYWx1ZVRvRGF0YSh0aGlzLnJlbmRlcmVkVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNTZXR0aW5nQ29tbWVudCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgY2xlYXJWYWx1ZSgpIHtcbiAgICBzdXBlci5jbGVhclZhbHVlKCk7XG4gICAgdGhpcy5wcmV2Q29tbWVudFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZFZhbHVlXCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVuZGVyZWRWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcmVkVmFsdWVcIiwgdmFsKTtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5yZW5kcmVkVmFsdWVUb0RhdGEodmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShcbiAgICBuZXdWYWx1ZTogYW55LFxuICAgIHVwZGF0ZUlzQW5zd2VyZWQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgIHVwZGF0ZUNvbW1lbnQ6IGJvb2xlYW4gPSB0cnVlXG4gICkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgIEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLnZhbHVlLCBuZXdWYWx1ZSlcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSwgdXBkYXRlSXNBbnN3ZXJlZCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRWYWx1ZVwiLCB0aGlzLnJlbmRyZWRWYWx1ZUZyb21EYXRhKG5ld1ZhbHVlKSk7XG4gICAgaWYgKHRoaXMuaGFzQ29tbWVudCB8fCAhdXBkYXRlQ29tbWVudCkgcmV0dXJuO1xuICAgIHZhciBpc090aGVyU2VsID0gdGhpcy5pc090aGVyU2VsZWN0ZWQ7XG4gICAgaWYgKGlzT3RoZXJTZWwgJiYgISF0aGlzLnByZXZDb21tZW50VmFsdWUpIHtcbiAgICAgIHZhciBvbGRDb21tZW50ID0gdGhpcy5wcmV2Q29tbWVudFZhbHVlO1xuICAgICAgdGhpcy5wcmV2Q29tbWVudFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jb21tZW50ID0gb2xkQ29tbWVudDtcbiAgICB9XG4gICAgaWYgKCFpc090aGVyU2VsICYmICEhdGhpcy5jb21tZW50KSB7XG4gICAgICBpZiAodGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKSB7XG4gICAgICAgIHRoaXMucHJldkNvbW1lbnRWYWx1ZSA9IHRoaXMuY29tbWVudDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29tbWVudCA9IFwiXCI7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgbmV3VmFsdWUgPSB0aGlzLnZhbHVlRnJvbURhdGEobmV3VmFsdWUpO1xuICAgIGlmIChcbiAgICAgICghdGhpcy5jaG9pY2VzQnlVcmwuaXNSdW5uaW5nICYmXG4gICAgICAgICF0aGlzLmNob2ljZXNCeVVybC5pc1dhaXRpbmdGb3JQYXJhbWV0ZXJzKSB8fFxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KG5ld1ZhbHVlKVxuICAgICkge1xuICAgICAgdGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIHN1cGVyLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVGcm9tRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgbGV0IGNob2ljZWl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUodGhpcy5hY3RpdmVDaG9pY2VzLCB2YWwpO1xuICAgIGlmICghIWNob2ljZWl0ZW0pIHtcbiAgICAgIHJldHVybiBjaG9pY2VpdGVtLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIudmFsdWVGcm9tRGF0YSh2YWwpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kcmVkVmFsdWVGcm9tRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSkgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFZhbHVlRnJvbURhdGFDb3JlKHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRyZWRWYWx1ZVRvRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSkgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gdGhpcy5yZW5kcmVkVmFsdWVUb0RhdGFDb3JlKHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlcmVkVmFsdWVGcm9tRGF0YUNvcmUodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICghdGhpcy5oYXNVbmtub3duVmFsdWUodmFsLCB0cnVlLCBmYWxzZSkpIHJldHVybiB0aGlzLnZhbHVlRnJvbURhdGEodmFsKTtcbiAgICB0aGlzLmNvbW1lbnQgPSB2YWw7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJJdGVtLnZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kcmVkVmFsdWVUb0RhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlICYmIHRoaXMuZ2V0UXVlc3Rpb25Db21tZW50KCkpIHtcbiAgICAgIHZhbCA9IHRoaXMuZ2V0UXVlc3Rpb25Db21tZW50KCk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc1Vua25vd25WYWx1ZShcbiAgICB2YWw6IGFueSxcbiAgICBpbmNsdWRlT3RoZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpc0ZpbHRlcmVkQ2hvaWNlczogYm9vbGVhbiA9IHRydWUsXG4gICAgY2hlY2tFbXB0eVZhbHVlOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFjaGVja0VtcHR5VmFsdWUgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmNsdWRlT3RoZXIgJiYgdmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuaGFzTm9uZSAmJiB2YWwgPT0gdGhpcy5ub25lSXRlbS52YWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjaG9pY2VzID0gaXNGaWx0ZXJlZENob2ljZXNcbiAgICAgID8gdGhpcy5nZXRGaWx0ZXJlZENob2ljZXMoKVxuICAgICAgOiB0aGlzLmFjdGl2ZUNob2ljZXM7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShjaG9pY2VzLCB2YWwpID09IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVmFsdWVEaXNhYmxlZCh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHZhciBpdGVtVmFsdWUgPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUodGhpcy5nZXRGaWx0ZXJlZENob2ljZXMoKSwgdmFsKTtcbiAgICByZXR1cm4gISFpdGVtVmFsdWUgJiYgIWl0ZW1WYWx1ZS5pc0VuYWJsZWQ7XG4gIH1cbiAgLyoqXG4gICAqIElmIHRoZSBjbGVhckluY29ycmVjdFZhbHVlc0NhbGxiYWNrIGlzIHNldCwgaXQgaXMgdXNlZCB0byBjbGVhciBpbmNvcnJlY3QgdmFsdWVzIGluc3RlYWQgb2YgZGVmYXVsdCBiZWhhdmlvdXIuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXNDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGZpbGwgdGhlIGNob2ljZXMgZnJvbSBhIFJFU1RmdWwgc2VydmljZS5cbiAgICogQHNlZSBjaG9pY2VzXG4gICAqIEBzZWUgQ2hvaWNlc1Jlc3RmdWxcbiAgICogQHNlZSBbRXhhbXBsZTogUkVTVGZ1bCBEcm9wZG93bl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9FeGFtcGxlcy9MaWJyYXJ5Lz9pZD1xdWVzdGlvbnR5cGUtZHJvcGRvd25yZXN0ZnVsbClcbiAgICogQHNlZSBbRG9jczogRmlsbCBDaG9pY2VzIGZyb20gYSBSRVNUZnVsIFNlcnZpY2VdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5Lz9pZD1MaWJyYXJ5T3ZlcnZpZXcjZmlsbC10aGUtY2hvaWNlcy1mcm9tLWEtcmVzdGZ1bC1zZXJ2aWNlKVxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzQnlVcmwoKTogQ2hvaWNlc1Jlc3RmdWwge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzQnlVcmxcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzQnlVcmwodmFsOiBDaG9pY2VzUmVzdGZ1bCkge1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXROZXdSZXN0ZnVsUHJvcGVydHkoKTtcbiAgICB0aGlzLmNob2ljZXNCeVVybC5mcm9tSlNPTih2YWwudG9KU09OKCkpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBpdGVtcy4gRXZlcnkgaXRlbSBoYXMgdmFsdWUgYW5kIHRleHQuIElmIHRleHQgaXMgZW1wdHksIHRoZSB2YWx1ZSBpcyByZW5kZXJlZC4gVGhlIGl0ZW0gdGV4dCBzdXBwb3J0cyBtYXJrZG93bi5cbiAgICogQHNlZSBjaG9pY2VzQnlVcmxcbiAgICogQHNlZSBjaG9pY2VzRnJvbVF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1wiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGdldCBjaG9pY2VzIGZyb20gdGhlIHNwZWNpZmllZCBxdWVzdGlvbiBpbnN0ZWFkIG9mIGRlZmluaW5nIHRoZW0gaW4gdGhlIGN1cnJlbnQgcXVlc3Rpb24uIFRoaXMgYXZvaWRzIGR1cGxpY2F0aW9uIG9mIGNob2ljZXMgZGVjbGFyYXRpb24gaW4geW91ciBzdXJ2ZXkgZGVmaW5pdGlvbi5cbiAgICogQnkgc2V0dGluZyB0aGlzIHByb3BlcnR5LCB0aGUgXCJjaG9pY2VzXCIsIFwiY2hvaWNlc1Zpc2libGVJZlwiLCBcImNob2ljZXNFbmFibGVJZlwiIGFuZCBcImNob2ljZXNPcmRlclwiIHByb3BlcnRpZXMgYmVjb21lIGludmlzaWJsZSwgYmVjYXVzZSB0aGVzZSBxdWVzdGlvbiBjaGFyYWN0ZXJpc3RpY3MgZGVwZW5kIG9uIGFjdGlvbnMgaW4gYW5vdGhlciAoc3BlY2lmaWVkKSBxdWVzdGlvbi5cbiAgICogVXNlIHRoZSBgY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGVgIHByb3BlcnR5IHRvIGZpbHRlciBjaG9pY2VzIG9idGFpbmVkIGZyb20gdGhlIHNwZWNpZmllZCBxdWVzdGlvbi5cbiAgICogQHNlZSBjaG9pY2VzXG4gICAqIEBzZWUgY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc0Zyb21RdWVzdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzRnJvbVF1ZXN0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc0Zyb21RdWVzdGlvbih2YWw6IHN0cmluZykge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25XaXRoQ2hvaWNlcygpO1xuICAgIGlmICghIXF1ZXN0aW9uKSB7XG4gICAgICBxdWVzdGlvbi5yZW1vdmVGcm9tRGVwZW5kZWRRdWVzdGlvbih0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc0Zyb21RdWVzdGlvblwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgYWRkSW50b0RlcGVuZGVkUXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZSkge1xuICAgIGlmICghcXVlc3Rpb24gfHwgcXVlc3Rpb24uZGVwZW5kZWRRdWVzdGlvbnMuaW5kZXhPZih0aGlzKSA+IC0xKSByZXR1cm47XG4gICAgcXVlc3Rpb24uZGVwZW5kZWRRdWVzdGlvbnMucHVzaCh0aGlzKTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZUZyb21EZXBlbmRlZFF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvblNlbGVjdEJhc2UpIHtcbiAgICBpZiAoIXF1ZXN0aW9uKSByZXR1cm47XG4gICAgdmFyIGluZGV4ID0gcXVlc3Rpb24uZGVwZW5kZWRRdWVzdGlvbnMuaW5kZXhPZih0aGlzKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgcXVlc3Rpb24uZGVwZW5kZWRRdWVzdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgYmVjb21lcyB2aXNpYmxlIHdoZW4gdGhlIGBjaG9pY2VzRnJvbVF1ZXN0aW9uYCBwcm9wZXJ0eSBpcyBzZWxlY3RlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCJhbGxcIiAoYWxsIHZpc2libGUgY2hvaWNlcyBmcm9tIGFub3RoZXIgcXVlc3Rpb24gYXJlIGRpc3BsYXllZCBhcyB0aGV5IGFyZSkuXG4gICAqIFlvdSBjYW4gc2V0IHRoaXMgcHJvcGVydHkgdG8gXCJzZWxlY3RlZFwiIG9yIFwidW5zZWxlY3RlZFwiIHRvIGRpc3BsYXkgb25seSBzZWxlY3RlZCBvciB1bnNlbGVjdGVkIGNob2ljZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHF1ZXN0aW9uLlxuICAgKiBAc2VlIGNob2ljZXNGcm9tUXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzRnJvbVF1ZXN0aW9uTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNGcm9tUXVlc3Rpb25Nb2RlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gaGlkZSB0aGUgcXVlc3Rpb24gaWYgdGhlcmUgaXMgbm8gdmlzaWJsZSBjaG9pY2VzLlxuICAgKi9cbiAgcHVibGljIGdldCBoaWRlSWZDaG9pY2VzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhpZGVJZkNob2ljZXNFbXB0eVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoaWRlSWZDaG9pY2VzRW1wdHkodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZUlmQ2hvaWNlc0VtcHR5XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBrZWVwSW5jb3JyZWN0VmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJrZWVwSW5jb3JyZWN0VmFsdWVzXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtlZXBJbmNvcnJlY3RWYWx1ZXModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwia2VlcEluY29ycmVjdFZhbHVlc1wiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsZWFzZSB1c2Ugc3VydmV5LnN0b3JlT3RoZXJzQXNDb21tZW50IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb24gdGhlIHN1cnZleSBsZXZlbC4gVGhpcyBwcm9wZXJ0eSBpcyBkZXByaWNhdGVkIGFuZCBpbnZpc2libGUgaW4gU3VydmV5IENyZWF0b3IuXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGVudGVyZWQgdGV4dCBpbiB0aGUgb3RoZXJzIGlucHV0IGluIHRoZSBjaGVja2JveC9yYWRpb2dyb3VwL2Ryb3Bkb3duIGFyZSBzdG9yZWQgYXMgXCJxdWVzdGlvbiBuYW1lIFwiICsgXCItQ29tbWVudFwiLiBUaGUgdmFsdWUgaXRzZWxmIGlzIFwicXVlc3Rpb24gbmFtZVwiOiBcIm90aGVyc1wiLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gc3RvcmUgdGhlIGVudGVyZWQgdGV4dCBkaXJlY3RseSBpbiB0aGUgXCJxdWVzdGlvbiBuYW1lXCIga2V5LlxuICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBcImRlZmF1bHRcIiwgdHJ1ZSwgZmFsc2VcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5zdG9yZU90aGVyc0FzQ29tbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBzdG9yZU90aGVyc0FzQ29tbWVudCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCBcImRlZmF1bHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBzdG9yZU90aGVyc0FzQ29tbWVudCh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpIHtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHJlbmRlciBpdGVtcyBpbiBhIHNwZWNpZmljIG9yZGVyOiBcImFzY1wiLCBcImRlc2NcIiwgXCJyYW5kb21cIi4gRGVmYXVsdCB2YWx1ZSBpcyBcIm5vbmVcIi5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc09yZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNPcmRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNPcmRlcih2YWw6IHN0cmluZykge1xuICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWwgPT0gdGhpcy5jaG9pY2VzT3JkZXIpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzT3JkZXJcIiwgdmFsKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgZGlmZmVyZW50IHRleHQgZm9yIG90aGVyIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3RoZXJUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJJdGVtVGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBvdGhlclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyVGV4dFwiLCB2YWwpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgfVxuICBnZXQgbG9jT3RoZXJUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgcGxhY2UgaG9sZGVyIHRleHQgZm9yIG90aGVyIG9yIGNvbW1lbnQgZmllbGQgIC5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3RoZXJQbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyUGxhY2VIb2xkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBvdGhlclBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvdGhlclBsYWNlSG9sZGVyXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY090aGVyUGxhY2VIb2xkZXIoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJQbGFjZUhvbGRlclwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRleHQgdGhhdCBzaG93cyB3aGVuIHRoZSBvdGhlciBpdGVtIGlzIGNob29zZWQgYnkgdGhlIG90aGVyIGlucHV0IGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBvdGhlckVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3RoZXJFcnJvclRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlclJlcXVpcmVkRXJyb3JcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgb3RoZXJFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyRXJyb3JUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY090aGVyRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyRXJyb3JUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBpdGVtcyBhcyB0aGV5IHdpbGwgYmUgcmVuZGVyZWQuIElmIG5lZWRlZCBpdGVtcyBhcmUgc29ydGVkIGFuZCB0aGUgb3RoZXIgaXRlbSBpcyBhZGRlZC5cbiAgICogQHNlZSBoYXNPdGhlclxuICAgKiBAc2VlIGNob2ljZXNPcmRlclxuICAgKiBAc2VlIGVuYWJsZWRDaG9pY2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlQ2hvaWNlc1wiLCBbXSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVuYWJsZWQgaXRlbXMgYXMgdGhleSB3aWxsIGJlIHJlbmRlcmVkLiBUaGUgZGlzYWJsZWQgaXRlbXMgYXJlIG5vdCBpbmNsdWRlZFxuICAgKiBAc2VlIGhhc090aGVyXG4gICAqIEBzZWUgY2hvaWNlc09yZGVyXG4gICAqIEBzZWUgdmlzaWJsZUNob2ljZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5hYmxlZENob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBpdGVtcyA9IHRoaXMudmlzaWJsZUNob2ljZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGl0ZW1zW2ldLmlzRW5hYmxlZCkgcmVzLnB1c2goaXRlbXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVWaXNpYmxlQ2hvaWNlcygpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZSA9IG5ldyBBcnJheTxJdGVtVmFsdWU+KCk7XG4gICAgdmFyIGNhbGNWYWx1ZSA9IHRoaXMuY2FsY1Zpc2libGVDaG9pY2VzKCk7XG4gICAgaWYgKCFjYWxjVmFsdWUpIGNhbGNWYWx1ZSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsY1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuZXdWYWx1ZS5wdXNoKGNhbGNWYWx1ZVtpXSk7XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVDaG9pY2VzXCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNhbGNWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICBpZiAodGhpcy5jYW5Vc2VGaWx0ZXJlZENob2ljZXMoKSkgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRDaG9pY2VzKCk7XG4gICAgdmFyIHJlcyA9IHRoaXMuc29ydFZpc2libGVDaG9pY2VzKHRoaXMuZ2V0RmlsdGVyZWRDaG9pY2VzKCkuc2xpY2UoKSk7XG4gICAgdGhpcy5hZGRUb1Zpc2libGVDaG9pY2VzKHJlcywgdGhpcy5pc0FkZERlZmF1bHRJdGVtcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgY2FuVXNlRmlsdGVyZWRDaG9pY2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhdGhpcy5pc0FkZERlZmF1bHRJdGVtcyAmJlxuICAgICAgIXRoaXMuaGFzTm9uZSAmJlxuICAgICAgIXRoaXMuaGFzT3RoZXIgJiZcbiAgICAgIHRoaXMuY2hvaWNlc09yZGVyID09IFwibm9uZVwiXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWRkVG9WaXNpYmxlQ2hvaWNlcyhpdGVtczogQXJyYXk8SXRlbVZhbHVlPiwgaXNBZGRBbGw6IGJvb2xlYW4pIHtcbiAgICBpZiAoaXNBZGRBbGwpIHtcbiAgICAgIGlmICghdGhpcy5uZXdJdGVtVmFsdWUpIHtcbiAgICAgICAgdGhpcy5uZXdJdGVtVmFsdWUgPSBuZXcgSXRlbVZhbHVlKFwibmV3aXRlbVwiKTsgLy9UT0RPXG4gICAgICB9XG4gICAgICBpdGVtcy5wdXNoKHRoaXMubmV3SXRlbVZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3VwcG9ydE90aGVyKCkgJiYgKGlzQWRkQWxsIHx8IHRoaXMuaGFzT3RoZXIpKSB7XG4gICAgICBpdGVtcy5wdXNoKHRoaXMub3RoZXJJdGVtKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3VwcG9ydE5vbmUoKSAmJiAoaXNBZGRBbGwgfHwgdGhpcy5oYXNOb25lKSkge1xuICAgICAgaXRlbXMucHVzaCh0aGlzLm5vbmVJdGVtKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEZvciBpbnRlcm5hbCB1c2UgaW4gU3VydmV5SlMgQ3JlYXRvciBWMi5cbiAgICovXG4gIHB1YmxpYyBpc0l0ZW1Jbkxpc3QoaXRlbTogSXRlbVZhbHVlKTogYm9vbGVhbiB7XG4gICAgaWYgKGl0ZW0gPT09IHRoaXMub3RoZXJJdGVtKSByZXR1cm4gdGhpcy5oYXNPdGhlcjtcbiAgICBpZiAoaXRlbSA9PT0gdGhpcy5ub25lSXRlbSkgcmV0dXJuIHRoaXMuaGFzTm9uZTtcbiAgICBpZiAoaXRlbSA9PT0gdGhpcy5uZXdJdGVtVmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGlzQWRkRGVmYXVsdEl0ZW1zKCkge1xuICAgIHJldHVybiAoXG4gICAgICBzZXR0aW5ncy5zdXBwb3J0Q3JlYXRvclYyICYmIHRoaXMuaXNEZXNpZ25Nb2RlICYmICF0aGlzLnBhcmVudFF1ZXN0aW9uXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0UGxhaW5EYXRhKFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGluY2x1ZGVFbXB0eT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlUXVlc3Rpb25UeXBlcz86IGJvb2xlYW47XG4gICAgICBjYWxjdWxhdGlvbnM/OiBBcnJheTx7XG4gICAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgfSA9IHtcbiAgICAgIGluY2x1ZGVFbXB0eTogdHJ1ZSxcbiAgICAgIGluY2x1ZGVRdWVzdGlvblR5cGVzOiBmYWxzZSxcbiAgICB9XG4gICkge1xuICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IHN1cGVyLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICBpZiAoISFxdWVzdGlvblBsYWluRGF0YSkge1xuICAgICAgdmFyIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlIDogW3RoaXMudmFsdWVdO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuaXNOb2RlID0gdHJ1ZTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmRhdGEgPSAocXVlc3Rpb25QbGFpbkRhdGEuZGF0YSB8fCBbXSkuY29uY2F0KFxuICAgICAgICB2YWx1ZXMubWFwKChkYXRhVmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgdmFyIGNob2ljZSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCBkYXRhVmFsdWUpO1xuICAgICAgICAgIHZhciBjaG9pY2VEYXRhSXRlbSA9IDxhbnk+e1xuICAgICAgICAgICAgbmFtZTogaW5kZXgsXG4gICAgICAgICAgICB0aXRsZTogXCJDaG9pY2VcIixcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhVmFsdWUsXG4gICAgICAgICAgICBkaXNwbGF5VmFsdWU6IHRoaXMuZ2V0Q2hvaWNlc0Rpc3BsYXlWYWx1ZShcbiAgICAgICAgICAgICAgdGhpcy52aXNpYmxlQ2hvaWNlcyxcbiAgICAgICAgICAgICAgZGF0YVZhbHVlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeSh2YWwpIDogdmFsLFxuICAgICAgICAgICAgaXNOb2RlOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICghIWNob2ljZSkge1xuICAgICAgICAgICAgKG9wdGlvbnMuY2FsY3VsYXRpb25zIHx8IFtdKS5mb3JFYWNoKChjYWxjdWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgICBjaG9pY2VEYXRhSXRlbVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdID1cbiAgICAgICAgICAgICAgICBjaG9pY2VbY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5pc090aGVyU2VsZWN0ZWQgJiYgdGhpcy5vdGhlckl0ZW1WYWx1ZSA9PT0gY2hvaWNlKSB7XG4gICAgICAgICAgICBjaG9pY2VEYXRhSXRlbS5pc090aGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGNob2ljZURhdGFJdGVtLmRpc3BsYXlWYWx1ZSA9IHRoaXMuY29tbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNob2ljZURhdGFJdGVtO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBjdXJyZW50IHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgbnVsbCB0aGVuIHJldHVybnMgZW1wdHkgc3RyaW5nLiBJZiAnb3RoZXInIGlzIHNlbGVjdGVkIHRoZW4gcmV0dXJucyB0aGUgdGV4dCBmb3Igb3RoZXIgdmFsdWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDaG9pY2VzRGlzcGxheVZhbHVlKHRoaXMudmlzaWJsZUNob2ljZXMsIHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlRW1wdHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMudmlzaWJsZUNob2ljZXMsIHVuZGVmaW5lZCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENob2ljZXNEaXNwbGF5VmFsdWUoaXRlbXM6IEl0ZW1WYWx1ZVtdLCB2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLm90aGVySXRlbVZhbHVlLnZhbHVlKVxuICAgICAgcmV0dXJuIHRoaXMuY29tbWVudCA/IHRoaXMuY29tbWVudCA6IHRoaXMubG9jT3RoZXJUZXh0LnRleHRPckh0bWw7XG4gICAgdmFyIHN0ciA9IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZShpdGVtcywgdmFsKTtcbiAgICByZXR1cm4gc3RyID09IFwiXCIgJiYgdmFsID8gdmFsIDogc3RyO1xuICB9XG4gIHByaXZhdGUgZ2V0RmlsdGVyZWRDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlXG4gICAgICA/IHRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWVcbiAgICAgIDogdGhpcy5hY3RpdmVDaG9pY2VzO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgYWN0aXZlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uV2l0aENob2ljZXMoKTtcbiAgICBpZiAoISFxdWVzdGlvbikge1xuICAgICAgdGhpcy5hZGRJbnRvRGVwZW5kZWRRdWVzdGlvbihxdWVzdGlvbik7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDaG9pY2VzRnJvbVF1ZXN0aW9uKHF1ZXN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hvaWNlc0Zyb21VcmwgPyB0aGlzLmNob2ljZXNGcm9tVXJsIDogdGhpcy5nZXRDaG9pY2VzKCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRRdWVzdGlvbldpdGhDaG9pY2VzKCk6IFF1ZXN0aW9uU2VsZWN0QmFzZSB7XG4gICAgaWYgKCF0aGlzLmNob2ljZXNGcm9tUXVlc3Rpb24gfHwgIXRoaXMuc3VydmV5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcmVzOiBhbnkgPSB0aGlzLnN1cnZleS5nZXRRdWVzdGlvbkJ5TmFtZSh0aGlzLmNob2ljZXNGcm9tUXVlc3Rpb24pO1xuICAgIHJldHVybiAhIXJlcyAmJiAhIXJlcy52aXNpYmxlQ2hvaWNlcyAmJiByZXMgIT09IHRoaXMgPyByZXMgOiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDaG9pY2VzRnJvbVF1ZXN0aW9uKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvblNlbGVjdEJhc2VcbiAgKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIHJlczogQXJyYXk8SXRlbVZhbHVlPiA9IFtdO1xuICAgIHZhciBpc1NlbGVjdGVkID1cbiAgICAgIHRoaXMuY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGUgPT0gXCJzZWxlY3RlZFwiXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IHRoaXMuY2hvaWNlc0Zyb21RdWVzdGlvbk1vZGUgPT0gXCJ1bnNlbGVjdGVkXCJcbiAgICAgICAgPyBmYWxzZVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB2YXIgY2hvaWNlcyA9IHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaXNCdWlsdEluQ2hvaWNlKGNob2ljZXNbaV0sIHF1ZXN0aW9uKSkgY29udGludWU7XG4gICAgICBpZiAoaXNTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlcy5wdXNoKGNob2ljZXNbaV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVtc1NlbGVjdGVkID0gcXVlc3Rpb24uaXNJdGVtU2VsZWN0ZWQoY2hvaWNlc1tpXSk7XG4gICAgICBpZiAoKGl0ZW1zU2VsZWN0ZWQgJiYgaXNTZWxlY3RlZCkgfHwgKCFpdGVtc1NlbGVjdGVkICYmICFpc1NlbGVjdGVkKSkge1xuICAgICAgICByZXMucHVzaChjaG9pY2VzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGhhc0FjdGl2ZUNob2ljZXMoKTogYm9vbGVhbiB7XG4gICAgdmFyIGNob2ljZXMgPSB0aGlzLnZpc2libGVDaG9pY2VzO1xuICAgIGlmICghY2hvaWNlcyB8fCBjaG9pY2VzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICBjaG9pY2VzID0gdGhpcy52aXNpYmxlQ2hvaWNlcztcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuaXNCdWlsdEluQ2hvaWNlKGNob2ljZXNbaV0sIHRoaXMpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBpc0J1aWx0SW5DaG9pY2UoXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvblNlbGVjdEJhc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGl0ZW0gPT09IHF1ZXN0aW9uLm5vbmVJdGVtIHx8XG4gICAgICBpdGVtID09PSBxdWVzdGlvbi5vdGhlckl0ZW0gfHxcbiAgICAgIGl0ZW0gPT09IHF1ZXN0aW9uLm5ld0l0ZW1WYWx1ZVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hvaWNlcztcbiAgfVxuICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1N1cHBvcnRQcm9wZXJ0eShcImhhc090aGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0Tm9uZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1N1cHBvcnRQcm9wZXJ0eShcImhhc05vbmVcIik7XG4gIH1cbiAgcHJvdGVjdGVkIGlzU3VwcG9ydFByb3BlcnR5KHByb3BOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMuaXNEZXNpZ25Nb2RlIHx8XG4gICAgICBTZXJpYWxpemVyLmZpbmRQcm9wZXJ0eSh0aGlzLmdldFR5cGUoKSwgcHJvcE5hbWUpLnZpc2libGVcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKFxuICAgIGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+LFxuICAgIGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMsIGlzT25WYWx1ZUNoYW5nZWQpO1xuICAgIGlmICghdGhpcy5oYXNPdGhlciB8fCAhdGhpcy5pc090aGVyU2VsZWN0ZWQgfHwgdGhpcy5jb21tZW50KSByZXR1cm47XG4gICAgZXJyb3JzLnB1c2gobmV3IE90aGVyRW1wdHlFcnJvcih0aGlzLm90aGVyRXJyb3JUZXh0LCB0aGlzKSk7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgdGhpcy5ydW5DaG9pY2VzQnlVcmwoKTtcbiAgICBpZiAodGhpcy5pc0FkZERlZmF1bHRJdGVtcykge1xuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlQ2hvaWNlcygpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc2V0U3VydmV5Q29yZSh2YWx1ZTogSVN1cnZleSkge1xuICAgIHN1cGVyLnNldFN1cnZleUNvcmUodmFsdWUpO1xuICAgIGlmICghIXZhbHVlICYmICEhdGhpcy5jaG9pY2VzRnJvbVF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpIHtcbiAgICBpZiAodGhpcy5pc1NldHRpbmdEZWZhdWx0VmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdG9yZU90aGVyc0FzQ29tbWVudCA9PT0gdHJ1ZSB8fFxuICAgICAgKHRoaXMuc3RvcmVPdGhlcnNBc0NvbW1lbnQgPT0gXCJkZWZhdWx0XCIgJiZcbiAgICAgICAgKHRoaXMuc3VydmV5ICE9IG51bGwgPyB0aGlzLnN1cnZleS5zdG9yZU90aGVyc0FzQ29tbWVudCA6IHRydWUpKSB8fFxuICAgICAgKCF0aGlzLmNob2ljZXNCeVVybC5pc0VtcHR5ICYmICF0aGlzLmNob2ljZXNGcm9tVXJsKVxuICAgICk7XG4gIH1cbiAgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHRoaXMucnVuQ2hvaWNlc0J5VXJsKCk7XG4gICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICB9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIGlmIChuYW1lICE9IHRoaXMuZ2V0VmFsdWVOYW1lKCkpIHtcbiAgICAgIHRoaXMucnVuQ2hvaWNlc0J5VXJsKCk7XG4gICAgfVxuICAgIGlmICghIW5hbWUgJiYgbmFtZSA9PSB0aGlzLmNob2ljZXNGcm9tUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlVmFsdWVGcm9tU3VydmV5KG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB2YXIgbmV3Q29tbWVudCA9IFwiXCI7XG4gICAgaWYgKFxuICAgICAgdGhpcy5oYXNPdGhlciAmJlxuICAgICAgIXRoaXMuaXNSdW5uaW5nQ2hvaWNlcyAmJlxuICAgICAgIXRoaXMuY2hvaWNlc0J5VXJsLmlzUnVubmluZyAmJlxuICAgICAgdGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5oYXNVbmtub3duVmFsdWUobmV3VmFsdWUpICYmICF0aGlzLmdldEhhc090aGVyKG5ld1ZhbHVlKSkge1xuICAgICAgICBuZXdDb21tZW50ID0gdGhpcy5nZXRDb21tZW50RnJvbVZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgbmV3VmFsdWUgPSB0aGlzLnNldE90aGVyVmFsdWVJbnRvVmFsdWUobmV3VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Q29tbWVudCA9IHRoaXMuZGF0YS5nZXRDb21tZW50KHRoaXMuZ2V0VmFsdWVOYW1lKCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci51cGRhdGVWYWx1ZUZyb21TdXJ2ZXkobmV3VmFsdWUpO1xuICAgIGlmICghIW5ld0NvbW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0TmV3Q29tbWVudChuZXdDb21tZW50KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbW1lbnRGcm9tVmFsdWUobmV3VmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRPdGhlclZhbHVlSW50b1ZhbHVlKG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgfVxuICBwcml2YXRlIGlzUnVubmluZ0Nob2ljZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBydW5DaG9pY2VzQnlVcmwoKSB7XG4gICAgaWYgKCF0aGlzLmNob2ljZXNCeVVybCB8fCB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8IHRoaXMuaXNSdW5uaW5nQ2hvaWNlcylcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcHJvY2Vzc29yID0gdGhpcy5zdXJ2ZXlJbXBsXG4gICAgICA/IHRoaXMuc3VydmV5SW1wbC5nZXRUZXh0UHJvY2Vzc29yKClcbiAgICAgIDogdGhpcy50ZXh0UHJvY2Vzc29yO1xuICAgIGlmICghcHJvY2Vzc29yKSBwcm9jZXNzb3IgPSB0aGlzLnN1cnZleTtcbiAgICBpZiAoIXByb2Nlc3NvcikgcmV0dXJuO1xuICAgIHRoaXMuaXNSZWFkeVZhbHVlID0gdGhpcy5pc0Nob2ljZXNMb2FkZWQgfHwgdGhpcy5jaG9pY2VzQnlVcmwuaXNFbXB0eTtcbiAgICB0aGlzLmlzUnVubmluZ0Nob2ljZXMgPSB0cnVlO1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsLnJ1bihwcm9jZXNzb3IpO1xuICAgIHRoaXMuaXNSdW5uaW5nQ2hvaWNlcyA9IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgaXNGaXJzdExvYWRDaG9pY2VzRnJvbVVybCA9IHRydWU7XG4gIHByb3RlY3RlZCBvbkJlZm9yZVNlbmRSZXF1ZXN0KCkge1xuICAgIGlmIChzZXR0aW5ncy5kaXNhYmxlT25HZXR0aW5nQ2hvaWNlc0Zyb21XZWIgPT09IHRydWUgJiYgIXRoaXMuaXNSZWFkT25seSkge1xuICAgICAgdGhpcy5lbmFibGVPbkxvYWRpbmdDaG9pY2VzID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVhZE9ubHkgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25Mb2FkQ2hvaWNlc0Zyb21VcmwoYXJyYXk6IEFycmF5PEl0ZW1WYWx1ZT4pIHtcbiAgICBpZiAodGhpcy5lbmFibGVPbkxvYWRpbmdDaG9pY2VzKSB7XG4gICAgICB0aGlzLnJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1JlYWRPbmx5KSB7XG4gICAgICB2YXIgZXJyb3JzID0gW107XG4gICAgICBpZiAodGhpcy5jaG9pY2VzQnlVcmwgJiYgdGhpcy5jaG9pY2VzQnlVcmwuZXJyb3IpIHtcbiAgICAgICAgZXJyb3JzLnB1c2godGhpcy5jaG9pY2VzQnlVcmwuZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgfVxuICAgIHZhciBuZXdDaG9pY2VzID0gbnVsbDtcbiAgICB2YXIgY2hlY2tDYWNoZWRWYWx1ZXNPbkV4aXN0aW5nID0gdHJ1ZTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzRmlyc3RMb2FkQ2hvaWNlc0Zyb21VcmwgJiZcbiAgICAgICF0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMgJiZcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlXG4gICAgKSB7XG4gICAgICB0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMgPSB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGNoZWNrQ2FjaGVkVmFsdWVzT25FeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKSkge1xuICAgICAgdGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzID0gdGhpcy52YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5pc0ZpcnN0TG9hZENob2ljZXNGcm9tVXJsID0gZmFsc2U7XG4gICAgdmFyIGNhY2hlZFZhbHVlcyA9IHRoaXMuY3JlYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICAgIHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyxcbiAgICAgIGNoZWNrQ2FjaGVkVmFsdWVzT25FeGlzdGluZ1xuICAgICk7XG4gICAgaWYgKGFycmF5ICYmIChhcnJheS5sZW5ndGggPiAwIHx8IHRoaXMuY2hvaWNlc0J5VXJsLmFsbG93RW1wdHlSZXNwb25zZSkpIHtcbiAgICAgIG5ld0Nob2ljZXMgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xuICAgICAgSXRlbVZhbHVlLnNldERhdGEobmV3Q2hvaWNlcywgYXJyYXkpO1xuICAgIH1cbiAgICBpZiAoISFuZXdDaG9pY2VzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0Nob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3Q2hvaWNlc1tpXS5sb2NPd25lciA9IHRoaXM7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hvaWNlc0Zyb21VcmwgPSBuZXdDaG9pY2VzO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgaWYgKG5ld0Nob2ljZXMpIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICAgICAgY2FjaGVkVmFsdWVzLFxuICAgICAgICBuZXdDaG9pY2VzXG4gICAgICApO1xuICAgICAgaWYgKCEhbmV3VmFsdWUgJiYgIXRoaXMuaXNSZWFkT25seSkge1xuICAgICAgICB2YXIgaGFzQ2hhbmdlZCA9ICFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModGhpcy52YWx1ZSwgbmV3VmFsdWUudmFsdWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkobmV3VmFsdWUudmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLmFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNldFF1ZXN0aW9uVmFsdWUodW5kZWZpbmVkLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQgPSBoYXNDaGFuZ2VkO1xuICAgICAgICAgIGlmIChoYXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWUudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hvaWNlc0xvYWRlZCgpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICB2YWw6IGFueSxcbiAgICBjaGVja09uRXhpc3Rpbmc6IGJvb2xlYW5cbiAgKTogYW55IHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnB1c2godGhpcy5jcmVhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKHZhbFtpXSwgdHJ1ZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgdmFyIGlzRXhpc3RzID0gY2hlY2tPbkV4aXN0aW5nID8gIXRoaXMuaGFzVW5rbm93blZhbHVlKHZhbCkgOiB0cnVlO1xuICAgIHJldHVybiB7IHZhbHVlOiB2YWwsIGlzRXhpc3RzOiBpc0V4aXN0cyB9O1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICB2YWw6IGFueSxcbiAgICBuZXdDaG9pY2VzOiBBcnJheTxJdGVtVmFsdWU+XG4gICk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHJldHVybiBudWxsO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB1cGRhdGVkVmFsdWUgPSB0aGlzLnVwZGF0ZUNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMoXG4gICAgICAgICAgdmFsW2ldLFxuICAgICAgICAgIG5ld0Nob2ljZXNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVwZGF0ZWRWYWx1ZSAmJiAhdGhpcy5pc1ZhbHVlRW1wdHkodXBkYXRlZFZhbHVlLnZhbHVlKSkge1xuICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHVwZGF0ZWRWYWx1ZS52YWx1ZTtcbiAgICAgICAgICB2YXIgaXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShuZXdDaG9pY2VzLCB1cGRhdGVkVmFsdWUudmFsdWUpO1xuICAgICAgICAgIGlmICghIWl0ZW0pIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXRlbS52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzLnB1c2gobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyB2YWx1ZTogcmVzIH07XG4gICAgfVxuICAgIHZhciB2YWx1ZSA9XG4gICAgICB2YWwuaXNFeGlzdHMgJiYgdGhpcy5oYXNVbmtub3duVmFsdWUodmFsLnZhbHVlKSA/IG51bGwgOiB2YWwudmFsdWU7XG4gICAgdmFyIGl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUobmV3Q2hvaWNlcywgdmFsdWUpO1xuICAgIGlmICghIWl0ZW0pIHtcbiAgICAgIHZhbHVlID0gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlIH07XG4gIH1cbiAgcHJpdmF0ZSBpc1VwZGF0aW5nQ2hvaWNlc0RlcGVuZGVkUXVlc3Rpb25zID0gZmFsc2U7XG4gIHByb3RlY3RlZCB1cGRhdGVDaG9pY2VzRGVwZW5kZWRRdWVzdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuaXNVcGRhdGluZ0Nob2ljZXNEZXBlbmRlZFF1ZXN0aW9ucykgcmV0dXJuO1xuICAgIHRoaXMuaXNVcGRhdGluZ0Nob2ljZXNEZXBlbmRlZFF1ZXN0aW9ucyA9IHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRlcGVuZGVkUXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmRlcGVuZGVkUXVlc3Rpb25zW2ldLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICB0aGlzLmRlcGVuZGVkUXVlc3Rpb25zW2ldLnVwZGF0ZUNob2ljZXNEZXBlbmRlZFF1ZXN0aW9ucygpO1xuICAgIH1cbiAgICB0aGlzLmlzVXBkYXRpbmdDaG9pY2VzRGVwZW5kZWRRdWVzdGlvbnMgPSBmYWxzZTtcbiAgfVxuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVDaG9pY2VzRGVwZW5kZWRRdWVzdGlvbnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVDaG9pY2VzKCk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5QmFzZWRPbkNob2ljZXMoKTtcbiAgICBpZiAoISF0aGlzLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrKSB7XG4gICAgICB0aGlzLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrKCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ2hvaWNlc0RlcGVuZGVkUXVlc3Rpb25zKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmlsaXR5QmFzZWRPbkNob2ljZXMoKSB7XG4gICAgaWYgKHRoaXMuaGlkZUlmQ2hvaWNlc0VtcHR5KSB7XG4gICAgICB2YXIgZmlsdGVyZWRDaG9pY2VzID0gdGhpcy5nZXRGaWx0ZXJlZENob2ljZXMoKTtcbiAgICAgIHRoaXMudmlzaWJsZSA9ICFmaWx0ZXJlZENob2ljZXMgfHwgZmlsdGVyZWRDaG9pY2VzLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc29ydFZpc2libGVDaG9pY2VzKGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIG9yZGVyID0gdGhpcy5jaG9pY2VzT3JkZXIudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3JkZXIgPT0gXCJhc2NcIikgcmV0dXJuIHRoaXMuc29ydEFycmF5KGFycmF5LCAxKTtcbiAgICBpZiAob3JkZXIgPT0gXCJkZXNjXCIpIHJldHVybiB0aGlzLnNvcnRBcnJheShhcnJheSwgLTEpO1xuICAgIGlmIChvcmRlciA9PSBcInJhbmRvbVwiKSByZXR1cm4gdGhpcy5yYW5kb21pemVBcnJheShhcnJheSk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIHByaXZhdGUgc29ydEFycmF5KGFycmF5OiBBcnJheTxJdGVtVmFsdWU+LCBtdWx0OiBudW1iZXIpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICBpZiAoYS5jYWxjdWxhdGVkVGV4dCA8IGIuY2FsY3VsYXRlZFRleHQpIHJldHVybiAtMSAqIG11bHQ7XG4gICAgICBpZiAoYS5jYWxjdWxhdGVkVGV4dCA+IGIuY2FsY3VsYXRlZFRleHQpIHJldHVybiAxICogbXVsdDtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgcmFuZG9taXplQXJyYXkoYXJyYXk6IEFycmF5PEl0ZW1WYWx1ZT4pOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gSGVscGVycy5yYW5kb21pemVBcnJheTxJdGVtVmFsdWU+KGFycmF5KTtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgaWYgKHRoaXMua2VlcEluY29ycmVjdFZhbHVlcyB8fCB0aGlzLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgICEhdGhpcy5zdXJ2ZXkgJiZcbiAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uQ291bnRCeVZhbHVlTmFtZSh0aGlzLmdldFZhbHVlTmFtZSgpKSA+IDFcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgaWYgKFxuICAgICAgISF0aGlzLmNob2ljZXNCeVVybCAmJlxuICAgICAgIXRoaXMuY2hvaWNlc0J5VXJsLmlzRW1wdHkgJiZcbiAgICAgICghdGhpcy5jaG9pY2VzRnJvbVVybCB8fCB0aGlzLmNob2ljZXNGcm9tVXJsLmxlbmd0aCA9PSAwKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAodGhpcy5jbGVhckluY29ycmVjdFZhbHVlc0NhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzQ2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlc0NvcmUoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpIHtcbiAgICBzdXBlci5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBpdGVtIGlzIHNlbGVjdGVkXG4gICAqIEBwYXJhbSBpdGVtIGNoZWNrYm94IG9yIHJhZGlvIGl0ZW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZChpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbS52YWx1ZSA9PT0gdGhpcy52YWx1ZTtcbiAgfVxuICBwcml2YXRlIGNsZWFyRGlzYWJsZWRWYWx1ZXMoKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCAhdGhpcy5zdXJ2ZXkuY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zKSByZXR1cm47XG4gICAgdGhpcy5jbGVhckRpc2FibGVkVmFsdWVzQ29yZSgpO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhckluY29ycmVjdFZhbHVlc0NvcmUoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKHRoaXMuY2FuQ2xlYXJWYWx1ZUFuVW5rbm93KHZhbCkpIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2FuQ2xlYXJWYWx1ZUFuVW5rbm93KHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkgJiYgdGhpcy5pc090aGVyU2VsZWN0ZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5oYXNVbmtub3duVmFsdWUodmFsLCB0cnVlLCB0cnVlLCB0cnVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJEaXNhYmxlZFZhbHVlc0NvcmUoKSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZURpc2FibGVkKHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgY2xlYXJVbnVzZWRWYWx1ZXMoKSB7XG4gICAgc3VwZXIuY2xlYXJVbnVzZWRWYWx1ZXMoKTtcbiAgICBpZiAoIXRoaXMuaXNPdGhlclNlbGVjdGVkICYmICF0aGlzLmhhc0NvbW1lbnQpIHtcbiAgICAgIHRoaXMuY29tbWVudCA9IFwiXCI7XG4gICAgfVxuICB9XG4gIGdldENvbHVtbkNsYXNzKCkge1xuICAgIHZhciBjb2x1bW5DbGFzcyA9IHRoaXMuY3NzQ2xhc3Nlcy5jb2x1bW47XG4gICAgaWYgKHRoaXMuaGFzQ29sdW1ucykge1xuICAgICAgY29sdW1uQ2xhc3MgKz0gXCIgc3YtcS1jb2x1bW4tXCIgKyB0aGlzLmNvbENvdW50O1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uQ2xhc3M7XG4gIH1cbiAgZ2V0SXRlbUluZGV4KGl0ZW06IGFueSkge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVDaG9pY2VzLmluZGV4T2YoaXRlbSk7XG4gIH1cbiAgZ2V0SXRlbUNsYXNzKGl0ZW06IGFueSkge1xuICAgIGxldCBpdGVtQ2xhc3MgPSB0aGlzLmNzc0NsYXNzZXMuaXRlbTtcbiAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5pc1JlYWRPbmx5IHx8ICFpdGVtLmlzRW5hYmxlZDtcbiAgICBjb25zdCBpc0NoZWNrZWQgPVxuICAgICAgdGhpcy5pc0l0ZW1TZWxlY3RlZChpdGVtKSB8fFxuICAgICAgKHRoaXMuaXNPdGhlclNlbGVjdGVkICYmIHRoaXMub3RoZXJJdGVtLnZhbHVlID09PSBpdGVtLnZhbHVlKTtcbiAgICBjb25zdCBhbGxvd0hvdmVyID1cbiAgICAgICFpc0Rpc2FibGVkICYmICFpc0NoZWNrZWQgJiYgISghIXRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZSk7XG4gICAgY29uc3QgaXNOb25lID0gaXRlbSA9PT0gdGhpcy5ub25lSXRlbTtcbiAgICBpZiAoIXRoaXMuaGFzQ29sdW1ucykge1xuICAgICAgaXRlbUNsYXNzICs9XG4gICAgICAgIHRoaXMuY29sQ291bnQgPT09IDBcbiAgICAgICAgICA/IFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLml0ZW1JbmxpbmVcbiAgICAgICAgICA6IFwiIHN2LXEtY29sLVwiICsgdGhpcy5jb2xDb3VudDtcbiAgICB9XG4gICAgaWYgKGlzRGlzYWJsZWQgJiYgISF0aGlzLmNzc0NsYXNzZXMuaXRlbURpc2FibGVkKVxuICAgICAgaXRlbUNsYXNzICs9IFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLml0ZW1EaXNhYmxlZDtcbiAgICBpZiAoaXNDaGVja2VkICYmICEhdGhpcy5jc3NDbGFzc2VzLml0ZW1DaGVja2VkKVxuICAgICAgaXRlbUNsYXNzICs9IFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLml0ZW1DaGVja2VkO1xuICAgIGlmIChhbGxvd0hvdmVyICYmICEhdGhpcy5jc3NDbGFzc2VzLml0ZW1Ib3ZlcilcbiAgICAgIGl0ZW1DbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSG92ZXI7XG4gICAgaWYgKGlzTm9uZSAmJiAhIXRoaXMuY3NzQ2xhc3Nlcy5pdGVtTm9uZSlcbiAgICAgIGl0ZW1DbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtTm9uZTtcbiAgICByZXR1cm4gaXRlbUNsYXNzO1xuICB9XG4gIGdldExhYmVsQ2xhc3MoaXRlbTogSXRlbVZhbHVlKSB7XG4gICAgdmFyIGxhYmVsQ2xhc3MgPSB0aGlzLmNzc0NsYXNzZXMubGFiZWw7XG4gICAgaWYgKHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSkpIHtcbiAgICAgIGxhYmVsQ2xhc3MgKz0gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMubGFiZWxDaGVja2VkO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWxDbGFzcztcbiAgfVxuICBnZXRDb250cm9sTGFiZWxDbGFzcyhpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICB2YXIgY29udHJvbExhYmVsQ2xhc3MgPSB0aGlzLmNzc0NsYXNzZXMuY29udHJvbExhYmVsO1xuICAgIGlmICh0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKSB7XG4gICAgICBjb250cm9sTGFiZWxDbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5jb250cm9sTGFiZWxDaGVja2VkO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbExhYmVsQ2xhc3M7XG4gIH1cbiAgZ2V0IGNvbHVtbnMoKSB7XG4gICAgdmFyIGNvbHVtbnMgPSBbXTtcbiAgICB2YXIgY29sQ291bnQgPSB0aGlzLmNvbENvdW50O1xuICAgIGlmICh0aGlzLmhhc0NvbHVtbnMgJiYgdGhpcy52aXNpYmxlQ2hvaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvd0l0ZW1zSW5PcmRlciA9PSBcImNvbHVtblwiKSB7XG4gICAgICAgIHZhciBwcmV2SW5kZXggPSAwO1xuICAgICAgICB2YXIgbGVmdEVsZW1lbnRzQ291bnQgPSB0aGlzLnZpc2libGVDaG9pY2VzLmxlbmd0aCAlIGNvbENvdW50O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbENvdW50OyBpKyspIHtcbiAgICAgICAgICB2YXIgY29sdW1uID0gW107XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIHZhciBqID0gcHJldkluZGV4O1xuICAgICAgICAgICAgaiA8IHByZXZJbmRleCArIE1hdGguZmxvb3IodGhpcy52aXNpYmxlQ2hvaWNlcy5sZW5ndGggLyBjb2xDb3VudCk7XG4gICAgICAgICAgICBqKytcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbHVtbi5wdXNoKHRoaXMudmlzaWJsZUNob2ljZXNbal0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGVmdEVsZW1lbnRzQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBsZWZ0RWxlbWVudHNDb3VudC0tO1xuICAgICAgICAgICAgY29sdW1uLnB1c2godGhpcy52aXNpYmxlQ2hvaWNlc1tqXSk7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByZXZJbmRleCA9IGo7XG4gICAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sQ291bnQ7IGkrKykge1xuICAgICAgICAgIHZhciBjb2x1bW4gPSBbXTtcbiAgICAgICAgICBmb3IgKHZhciBqID0gaTsgaiA8IHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoOyBqICs9IGNvbENvdW50KSB7XG4gICAgICAgICAgICBjb2x1bW4ucHVzaCh0aGlzLnZpc2libGVDaG9pY2VzW2pdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cbiAgZ2V0IGhhc0NvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29sQ291bnQgPiAxO1xuICB9XG4gIHB1YmxpYyBjaG9pY2VzTG9hZGVkKCk6IHZvaWQge1xuICAgIHRoaXMuaXNDaG9pY2VzTG9hZGVkID0gdHJ1ZTtcbiAgICBsZXQgb2xkSXNSZWFkeTogYm9vbGVhbiA9IHRoaXMuaXNSZWFkeVZhbHVlO1xuICAgIHRoaXMuaXNSZWFkeVZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLm9uUmVhZHlDaGFuZ2VkICYmXG4gICAgICB0aGlzLm9uUmVhZHlDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgICBxdWVzdGlvbjogdGhpcyxcbiAgICAgICAgaXNSZWFkeTogdHJ1ZSxcbiAgICAgICAgb2xkSXNSZWFkeTogb2xkSXNSZWFkeSxcbiAgICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtVmFsdWVXcmFwcGVyQ29tcG9uZW50TmFtZShpdGVtOiBJdGVtVmFsdWUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1cnZleTogU3VydmV5TW9kZWwgPSB0aGlzLnN1cnZleSBhcyBTdXJ2ZXlNb2RlbDtcbiAgICBpZiAoc3VydmV5KSB7XG4gICAgICByZXR1cm4gc3VydmV5LmdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnROYW1lKGl0ZW0sIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gU3VydmV5TW9kZWwuVGVtcGxhdGVSZW5kZXJlckNvbXBvbmVudE5hbWU7XG4gIH1cbiAgcHVibGljIGdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnREYXRhKGl0ZW06IEl0ZW1WYWx1ZSk6IGFueSB7XG4gICAgY29uc3Qgc3VydmV5OiBTdXJ2ZXlNb2RlbCA9IHRoaXMuc3VydmV5IGFzIFN1cnZleU1vZGVsO1xuICAgIGlmIChzdXJ2ZXkpIHtcbiAgICAgIHJldHVybiBzdXJ2ZXkuZ2V0SXRlbVZhbHVlV3JhcHBlckNvbXBvbmVudERhdGEoaXRlbSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9XG59XG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgY2hlY2tib3ggYW5kIHJhZGlvZ3JvdXAgcXVlc3Rpb25zLiBJdCBpbnRyb2R1Y2VkIGEgY29sQ291bnQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNoZWNrYm94QmFzZSBleHRlbmRzIFF1ZXN0aW9uU2VsZWN0QmFzZSB7XG4gIGNvbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIGZvciByYWRpb2dyb3VwIGFuZCBjaGVja2JveCBxdWVzdGlvbnMuIEl0ZW1zIGFyZSByZW5kcmVkIGluIG9uZSBsaW5lIGlmIHRoZSB2YWx1ZSBpcyAwLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2xDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCB0aGlzLmlzRmxvd0xheW91dCA/IDAgOiAxKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbENvdW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNSB8fCB0aGlzLmlzRmxvd0xheW91dCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIHZhbHVlKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25QYXJlbnRDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uUGFyZW50Q2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLmlzRmxvd0xheW91dCkge1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgbnVsbCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvblBhcmVudFF1ZXN0aW9uQ2hhbmdlZCgpIHtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFNlYXJjaGFibGVJdGVtVmFsdWVLZXlzKGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBrZXlzLnB1c2goXCJjaG9pY2VzXCIpO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInNlbGVjdGJhc2VcIixcbiAgW1xuICAgIHsgbmFtZTogXCJoYXNDb21tZW50OnN3aXRjaFwiLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbW1lbnRUZXh0XCIsXG4gICAgICBkZXBlbmRzT246IFwiaGFzQ29tbWVudFwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc0NvbW1lbnQ7XG4gICAgICB9LFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbW1lbnRUZXh0XCIsXG4gICAgICBsYXlvdXQ6IFwicm93XCIsXG4gICAgfSxcbiAgICBcImNob2ljZXNGcm9tUXVlc3Rpb246cXVlc3Rpb25fc2VsZWN0YmFzZVwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlczppdGVtdmFsdWVbXVwiLFxuICAgICAgYmFzZVZhbHVlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIik7XG4gICAgICB9LFxuICAgICAgZGVwZW5kc09uOiBcImNob2ljZXNGcm9tUXVlc3Rpb25cIixcbiAgICAgIHZpc2libGVJZjogKG9iajogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiAhb2JqLmNob2ljZXNGcm9tUXVlc3Rpb247XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjaG9pY2VzRnJvbVF1ZXN0aW9uTW9kZVwiLFxuICAgICAgZGVmYXVsdDogXCJhbGxcIixcbiAgICAgIGNob2ljZXM6IFtcImFsbFwiLCBcInNlbGVjdGVkXCIsIFwidW5zZWxlY3RlZFwiXSxcbiAgICAgIGRlcGVuZHNPbjogXCJjaG9pY2VzRnJvbVF1ZXN0aW9uXCIsXG4gICAgICB2aXNpYmxlSWY6IChvYmo6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gISFvYmouY2hvaWNlc0Zyb21RdWVzdGlvbjtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXNPcmRlclwiLFxuICAgICAgZGVmYXVsdDogXCJub25lXCIsXG4gICAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwiYXNjXCIsIFwiZGVzY1wiLCBcInJhbmRvbVwiXSxcbiAgICAgIGRlcGVuZHNPbjogXCJjaG9pY2VzRnJvbVF1ZXN0aW9uXCIsXG4gICAgICB2aXNpYmxlSWY6IChvYmo6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gIW9iai5jaG9pY2VzRnJvbVF1ZXN0aW9uO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlc0J5VXJsOnJlc3RmdWxsXCIsXG4gICAgICBjbGFzc05hbWU6IFwiQ2hvaWNlc1Jlc3RmdWxcIixcbiAgICAgIG9uR2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBvYmouY2hvaWNlc0J5VXJsLmdldERhdGEoKTtcbiAgICAgIH0sXG4gICAgICBvblNldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSwgdmFsdWU6IGFueSkge1xuICAgICAgICBvYmouY2hvaWNlc0J5VXJsLnNldERhdGEodmFsdWUpO1xuICAgICAgfSxcbiAgICB9LFxuICAgIFwiaGlkZUlmQ2hvaWNlc0VtcHR5OmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXNWaXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgICBkZXBlbmRzT246IFwiY2hvaWNlc0Zyb21RdWVzdGlvblwiLFxuICAgICAgdmlzaWJsZUlmOiAob2JqOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuICFvYmouY2hvaWNlc0Zyb21RdWVzdGlvbjtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXNFbmFibGVJZjpjb25kaXRpb25cIixcbiAgICAgIGRlcGVuZHNPbjogXCJjaG9pY2VzRnJvbVF1ZXN0aW9uXCIsXG4gICAgICB2aXNpYmxlSWY6IChvYmo6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gIW9iai5jaG9pY2VzRnJvbVF1ZXN0aW9uO1xuICAgICAgfSxcbiAgICB9LFxuICAgIFwiaGFzT3RoZXI6Ym9vbGVhblwiLFxuICAgIFwiaGFzTm9uZTpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJvdGhlclBsYWNlSG9sZGVyXCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jT3RoZXJQbGFjZUhvbGRlclwiLFxuICAgICAgZGVwZW5kc09uOiBcImhhc090aGVyXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBvYmouaGFzT3RoZXI7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJub25lVGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY05vbmVUZXh0XCIsXG4gICAgICBkZXBlbmRzT246IFwiaGFzTm9uZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc05vbmU7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJvdGhlclRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPdGhlclRleHRcIixcbiAgICAgIGRlcGVuZHNPbjogXCJoYXNPdGhlclwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc090aGVyO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwib3RoZXJFcnJvclRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPdGhlckVycm9yVGV4dFwiLFxuICAgICAgZGVwZW5kc09uOiBcImhhc090aGVyXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBvYmouaGFzT3RoZXI7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIHRydWUsIGZhbHNlXSxcbiAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgIH0sXG4gIF0sXG4gIG51bGwsXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJjaGVja2JveGJhc2VcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiY29sQ291bnQ6bnVtYmVyXCIsXG4gICAgICBkZWZhdWx0OiAxLFxuICAgICAgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDVdLFxuICAgICAgbGF5b3V0OiBcInJvd1wiLFxuICAgIH0sXG4gIF0sXG4gIG51bGwsXG4gIFwic2VsZWN0YmFzZVwiXG4pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIGJvb2xlYW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkJvb2xlYW5Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsRmFsc2VcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsVHJ1ZVwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmxvY0xhYmVsRmFsc2Uub25HZXRUZXh0Q2FsbGJhY2sgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiAhIXRleHRcbiAgICAgICAgPyB0ZXh0XG4gICAgICAgIDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImJvb2xlYW5VbmNoZWNrZWRMYWJlbFwiKTtcbiAgICB9O1xuICAgIHRoaXMubG9jTGFiZWxUcnVlLm9uR2V0VGV4dENhbGxiYWNrID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gISF0ZXh0XG4gICAgICAgID8gdGV4dFxuICAgICAgICA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJib29sZWFuQ2hlY2tlZExhYmVsXCIpO1xuICAgIH07XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH1cbiAgaXNMYXlvdXRUeXBlU3VwcG9ydGVkKGxheW91dFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0aGlzLnJlbmRlckFzICE9PSBcImNoZWNrYm94XCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gY2hlY2sgd2lsbCBiZSByZW5kZXJlZCBpbiBpbmRldGVybWluYXRlIG1vZGUuIHZhbHVlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEdldC9zZXQgcXVlc3Rpb24gdmFsdWUgaW4gMyBtb2RlczogaW5kZXRlcm1pbmF0ZSAodmFsdWUgaXMgZW1wdHkpLCB0cnVlIChjaGVjayBpcyBzZXQpIGFuZCBmYWxzZSAoY2hlY2sgaXMgdW5zZXQpLlxuICAgKiBAc2VlIHZhbHVlVHJ1ZVxuICAgKiBAc2VlIHZhbHVlRmFsc2VcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hlY2tlZFZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSA9PSB0aGlzLmdldFZhbHVlVHJ1ZSgpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hlY2tlZFZhbHVlKHZhbDogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNSZWFkT25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldENoZWNrZWRWYWx1ZSh2YWwpO1xuICB9XG4gIHByaXZhdGUgc2V0Q2hlY2tlZFZhbHVlKHZhbDogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsID09IHRydWUgPyB0aGlzLmdldFZhbHVlVHJ1ZSgpIDogdGhpcy5nZXRWYWx1ZUZhbHNlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgc3RhdGUgb2YgdGhlIGNoZWNrOiBcImluZGV0ZXJtaW5hdGVcIiAtIGRlZmF1bHQgKHZhbHVlIGlzIGVtcHR5L251bGwpLCBcInRydWVcIiAtIHZhbHVlIGVxdWFscyB2YWx1ZVRydWUgb3IgdHJ1ZSwgXCJmYWxzZVwiIC0gdmFsdWUgZXF1YWxzIHZhbHVlRmFsc2Ugb3IgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWUodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB2YWwgPSBcInRydWVcIjtcbiAgICBpZiAodmFsID09PSBmYWxzZSkgdmFsID0gXCJmYWxzZVwiO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZVwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdFZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09IFwiaW5kZXRlcm1pbmF0ZVwiKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlID09IFwidHJ1ZVwiXG4gICAgICA/IHRoaXMuZ2V0VmFsdWVUcnVlKClcbiAgICAgIDogdGhpcy5nZXRWYWx1ZUZhbHNlKCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NUaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1RpdGxlIHx8IHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMubG9jTGFiZWwudGV4dClcbiAgICAgID8gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIpXG4gICAgICA6IHRoaXMubG9jTGFiZWw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjaGVja2JveCBsYWJlbC4gSWYgaXQgaXMgZW1wdHkgYW5kIHNob3dUaXRsZSBpcyBmYWxzZSB0aGVuIHRpdGxlIGlzIHJlbmRlcmVkXG4gICAqIEBzZWUgc2hvd1RpdGxlXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIEBwcm9wZXJ0eSh7IGxvY2FsaXphYmxlOiB0cnVlIH0pXG4gIGxhYmVsOiBzdHJpbmc7XG5cbiAgZ2V0IGxvY0Rpc3BsYXlMYWJlbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgaWYgKHRoaXMubG9jTGFiZWwudGV4dCkgcmV0dXJuIHRoaXMubG9jTGFiZWw7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1RpdGxlID8gdGhpcy5sb2NMYWJlbCA6IHRoaXMubG9jVGl0bGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHksIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGFiZWwgZm9yIHN0YXRlIHdoZW4gY2hlY2sgaXMgc2V0LlxuICAgKi9cbiAgcHVibGljIGdldCBsYWJlbFRydWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsYWJlbFRydWVcIik7XG4gIH1cbiAgcHVibGljIHNldCBsYWJlbFRydWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxhYmVsVHJ1ZVwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NMYWJlbFRydWUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibGFiZWxUcnVlXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5LCBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZGlmZmVyZW50IGxhYmVsIGZvciBzdGF0ZSB3aGVuIGNoZWNrIGlzIHVuc2V0LlxuICAgKi9cbiAgcHVibGljIGdldCBsYWJlbEZhbHNlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibGFiZWxGYWxzZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxhYmVsRmFsc2UodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxhYmVsRmFsc2VcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTGFiZWxGYWxzZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJsYWJlbEZhbHNlXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gc2hvdyB0aGUgcXVlc3Rpb24gdGl0bGUuIEl0IGlzIGhpZGRlbiBieSBkZWZhdWx0LlxuICAgKi9cbiAgQHByb3BlcnR5KClcbiAgc2hvd1RpdGxlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmcm9tIHRydWUgd2hlbiBjaGVjayBpcyBzZXQuXG4gICAqL1xuICBAcHJvcGVydHkoKVxuICB2YWx1ZVRydWU6IGFueTtcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5LCBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGZyb20gZmFsc2Ugd2hlbiBjaGVjayBpcyB1bnNldC5cbiAgICovXG4gIEBwcm9wZXJ0eSgpXG4gIHZhbHVlRmFsc2U6IGFueTtcblxuICBwcml2YXRlIGdldFZhbHVlVHJ1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlVHJ1ZSA/IHRoaXMudmFsdWVUcnVlIDogdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlRmFsc2UoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZUZhbHNlID8gdGhpcy52YWx1ZUZhbHNlIDogZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUgPT0gXCJ0cnVlXCIpIHRoaXMuc2V0Q2hlY2tlZFZhbHVlKHRydWUpO1xuICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZSA9PSBcImZhbHNlXCIpIHRoaXMuc2V0Q2hlY2tlZFZhbHVlKGZhbHNlKTtcbiAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUgPT0gXCJpbmRldGVybWluYXRlXCIpIHRoaXMuc2V0Q2hlY2tlZFZhbHVlKG51bGwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWx1ZSA9PSB0aGlzLmdldFZhbHVlVHJ1ZSgpKSByZXR1cm4gdGhpcy5sb2NMYWJlbFRydWUudGV4dE9ySHRtbDtcbiAgICByZXR1cm4gdGhpcy5sb2NMYWJlbEZhbHNlLnRleHRPckh0bWw7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJib29sZWFuXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwibGFiZWw6dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTGFiZWxcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibGFiZWxUcnVlOnRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMYWJlbFRydWVcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibGFiZWxGYWxzZTp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTGFiZWxGYWxzZVwiLFxuICAgIH0sXG4gICAgXCJzaG93VGl0bGU6Ym9vbGVhblwiLFxuICAgIFwidmFsdWVUcnVlXCIsXG4gICAgXCJ2YWx1ZUZhbHNlXCIsXG4gICAgeyBuYW1lOiBcInJlbmRlckFzXCIsIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uQm9vbGVhbk1vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImJvb2xlYW5cIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkJvb2xlYW5Nb2RlbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgU2VyaWFsaXplciwgcHJvcGVydHkgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbmV4cG9ydCBjbGFzcyBCdXR0b25Hcm91cEl0ZW1WYWx1ZSBleHRlbmRzIEl0ZW1WYWx1ZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHZhbHVlOiBhbnksXG4gICAgdGV4dDogc3RyaW5nID0gbnVsbCxcbiAgICBwcm90ZWN0ZWQgdHlwZU5hbWUgPSBcImJ1dHRvbmdyb3VwaXRlbXZhbHVlXCJcbiAgKSB7XG4gICAgc3VwZXIodmFsdWUsIHRleHQsIHR5cGVOYW1lKTtcbiAgfVxuICAvKlxuICAgIEl0ZW0gaWNvbiBwcm9wZXJ0eVxuICAqL1xuICBAcHJvcGVydHkoKVxuICBpY29uTmFtZTogc3RyaW5nO1xuICAvKlxuICAgIEJ5IGRlZmF1bHQgaWNvbiBzaXplIGlzIDI0LlxuICAgIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSBpdGVtIGljb24gc2l6ZS4gIFxuICAqL1xuICBAcHJvcGVydHkoKVxuICBpY29uU2l6ZTogbnVtYmVyO1xuICAvKipcbiAgICogQnkgZGVmYXVsdCBpdGVtIGNhcHRpb24gaXMgdmlzaWJsZS5cbiAgICogU2V0IGl0ICdmYWxzZScgdG8gaGlkZSBpdGVtIGNhcHRpb24uXG4gICAqL1xuICBAcHJvcGVydHkoKVxuICBzaG93Q2FwdGlvbjogYm9vbGVhbjtcbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLnR5cGVOYW1lID8gdGhpcy50eXBlTmFtZSA6IFwiYnV0dG9uZ3JvdXBpdGVtdmFsdWVcIjtcbiAgfVxufVxuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgYnV0dG9uIGdyb3VwIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25CdXR0b25Hcm91cE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2Uge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImJ1dHRvbmdyb3VwXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1WYWx1ZVR5cGUoKSB7XG4gICAgcmV0dXJuIFwiYnV0dG9uZ3JvdXBpdGVtdmFsdWVcIjtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydE90aGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImJ1dHRvbmdyb3VwXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXM6YnV0dG9uZ3JvdXBpdGVtdmFsdWVbXVwiLFxuICAgIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25CdXR0b25Hcm91cE1vZGVsKFwiXCIpO1xuICB9LFxuICBcImNoZWNrYm94YmFzZVwiXG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImJ1dHRvbmdyb3VwaXRlbXZhbHVlXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwic2hvd0NhcHRpb246Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImljb25OYW1lOnRleHRcIiB9LFxuICAgIHsgbmFtZTogXCJpY29uU2l6ZTpudW1iZXJcIiB9LFxuICBdLFxuICAodmFsdWU6IGFueSkgPT4gbmV3IEJ1dHRvbkdyb3VwSXRlbVZhbHVlKHZhbHVlKSxcbiAgXCJpdGVtdmFsdWVcIlxuKTtcblxuLy8gUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJidXR0b25ncm91cFwiLCBuYW1lID0+IHtcbi8vICAgdmFyIHEgPSBuZXcgUXVlc3Rpb25CdXR0b25Hcm91cE1vZGVsKG5hbWUpO1xuLy8gICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4vLyAgIHJldHVybiBxO1xuLy8gfSk7XG5cbmV4cG9ydCBjbGFzcyBCdXR0b25Hcm91cEl0ZW1Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb25CdXR0b25Hcm91cE1vZGVsLFxuICAgIHB1YmxpYyBpdGVtOiBJdGVtVmFsdWUsXG4gICAgcHVibGljIGluZGV4OiBudW1iZXJcbiAgKSB7fVxuICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW0udmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBpY29uTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtLmljb25OYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgaWNvblNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS5pY29uU2l6ZSB8fCAyNDtcbiAgfVxuICBwdWJsaWMgZ2V0IGNhcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0ubG9jVGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IHNob3dDYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW0uc2hvd0NhcHRpb24gfHwgdGhpcy5pdGVtLnNob3dDYXB0aW9uID09PSB1bmRlZmluZWQ7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmlzUmVxdWlyZWQ7XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5pc0l0ZW1TZWxlY3RlZCh0aGlzLml0ZW0pO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uaXNJbnB1dFJlYWRPbmx5IHx8ICF0aGlzLml0ZW0uaXNFbmFibGVkO1xuICB9XG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5uYW1lICsgXCJfXCIgKyB0aGlzLnF1ZXN0aW9uLmlkO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uaW5wdXRJZCArIFwiX1wiICsgdGhpcy5pbmRleDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0Vycm9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMDtcbiAgfVxuICBwdWJsaWMgZ2V0IGRlc2NyaWJlZEJ5KCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwXG4gICAgICA/IHRoaXMucXVlc3Rpb24uaWQgKyBcIl9lcnJvcnNcIlxuICAgICAgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgZ2V0IGxhYmVsQ2xhc3MoKSB7XG4gICAgbGV0IGNzcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XG4gICAgICBjc3MgKz0gXCIgXCIgKyB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbVNlbGVjdGVkO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucmVhZE9ubHkgJiYgIXRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgIGNzcyArPSBcIiBcIiArIHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtSG92ZXI7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgIXRoaXMuaXRlbS5pc0VuYWJsZWQpIHtcbiAgICAgIGNzcyArPSBcIiBcIiArIHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtRGlzYWJsZWQ7XG4gICAgfVxuICAgIHJldHVybiBjc3M7XG4gIH1cbiAgcHVibGljIGdldCBjc3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsQ2xhc3MsXG4gICAgICBpY29uOiB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbUljb24sXG4gICAgICBjb250cm9sOiB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbUNvbnRyb2wsXG4gICAgICBjYXB0aW9uOiB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbUNhcHRpb24sXG4gICAgICBkZWNvcmF0b3I6IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5pdGVtRGVjb3JhdG9yLFxuICAgIH07XG4gIH1cbiAgcHVibGljIG9uQ2hhbmdlKCkge1xuICAgIHRoaXMucXVlc3Rpb24ucmVuZGVyZWRWYWx1ZSA9IHRoaXMuaXRlbS52YWx1ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25DaGVja2JveEJhc2UsXG4gIFF1ZXN0aW9uU2VsZWN0QmFzZSxcbn0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgY2hlY2tib3ggcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIHtcbiAgcHJpdmF0ZSBzZWxlY3RBbGxJdGVtVmFsdWU6IEl0ZW1WYWx1ZSA9IG5ldyBJdGVtVmFsdWUoXCJzZWxlY3RhbGxcIik7XG4gIHByaXZhdGUgaW52aXNpYmxlT2xkVmFsdWVzOiBhbnkgPSB7fTtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGVjdEFsbEl0ZW1UZXh0ID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwic2VsZWN0QWxsVGV4dFwiLFxuICAgICAgdGhpcyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIHNlbGVjdEFsbEl0ZW1UZXh0Lm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2VsZWN0QWxsSXRlbVRleHRcIik7XG4gICAgfTtcbiAgICB0aGlzLnNlbGVjdEFsbEl0ZW0ubG9jT3duZXIgPSB0aGlzO1xuICAgIHRoaXMuc2VsZWN0QWxsSXRlbS5zZXRMb2NUZXh0KHNlbGVjdEFsbEl0ZW1UZXh0KTtcblxuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImhhc1NlbGVjdEFsbFwiLCBcInNlbGVjdEFsbFRleHRcIl0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgYXJpYVJvbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJncm91cFwiO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY2hlY2tib3hcIjtcbiAgfVxuICBwcm90ZWN0ZWQgb25DcmVhdGluZygpIHtcbiAgICBzdXBlci5vbkNyZWF0aW5nKCk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInJlbmRlcmVkVmFsdWVcIik7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInZhbHVlXCIpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJZCArIFwiXzBcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2VsZWN0IGFsbCBpdGVtLiBCeSB1c2luZyB0aGlzIHByb3BlcnR5LCB5b3UgbWF5IGNoYW5nZSBwcm9ncmFtbWF0aWNhbGx5IGl0J3MgdmFsdWUgYW5kIHRleHQuXG4gICAqIEBzZWUgaGFzU2VsZWN0QWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlbGVjdEFsbEl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RBbGxJdGVtVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgZGlmZmVyZW50IHRleHQgZm9yIFNlbGVjdCBBbGwgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0QWxsVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwic2VsZWN0QWxsVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNlbGVjdEFsbEl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNlbGVjdEFsbFRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInNlbGVjdEFsbFRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jU2VsZWN0QWxsVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJzZWxlY3RBbGxUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBzaG93IHRoZSBcIlNlbGVjdCBBbGxcIiBpdGVtIG9uIHRoZSB0b3AuIElmIGVuZC11c2VyIGNoZWNrcyB0aGlzIGl0ZW0sIHRoZW4gYWxsIGl0ZW1zIGFyZSBjaGVja2VkLlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNTZWxlY3RBbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc1NlbGVjdEFsbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoYXNTZWxlY3RBbGwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzU2VsZWN0QWxsXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgYXJlIHNlbGVjdGVkXG4gICAqIEBzZWUgdG9nZ2xlU2VsZWN0QWxsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmlzSXRlbVNlbGVjdGVkKHRoaXMubm9uZUl0ZW0pKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGFsbEl0ZW1Db3VudCA9IHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoO1xuICAgIGlmICh0aGlzLmhhc090aGVyKSBhbGxJdGVtQ291bnQtLTtcbiAgICBpZiAodGhpcy5oYXNOb25lKSBhbGxJdGVtQ291bnQtLTtcbiAgICBpZiAodGhpcy5oYXNTZWxlY3RBbGwpIGFsbEl0ZW1Db3VudC0tO1xuICAgIHZhciBzZWxlY3RlZENvdW50ID0gdmFsLmxlbmd0aDtcbiAgICBpZiAodGhpcy5pc0l0ZW1TZWxlY3RlZCh0aGlzLm90aGVySXRlbSkpIHNlbGVjdGVkQ291bnQtLTtcbiAgICByZXR1cm4gc2VsZWN0ZWRDb3VudCA9PT0gYWxsSXRlbUNvdW50O1xuICB9XG4gIHB1YmxpYyBzZXQgaXNBbGxTZWxlY3RlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsKSB7XG4gICAgICB0aGlzLnNlbGVjdEFsbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEl0IHdpbGwgc2VsZWN0IGFsbCBpdGVtcywgZXhjZXB0IG90aGVyIGFuZCBub25lLiBJZiBhbGwgaXRlbXMgaGF2ZSBiZWVuIGFscmVhZHkgc2VsZWN0ZWQgdGhlbiBpdCB3aWxsIGNsZWFyIHRoZSB2YWx1ZVxuICAgKiBAc2VlIGlzQWxsU2VsZWN0ZWRcbiAgICogQHNlZSBzZWxlY3RBbGxcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoKSB7XG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gIXRoaXMuaXNBbGxTZWxlY3RlZDtcbiAgfVxuICAvKipcbiAgICogU2VsZWN0IGFsbCBpdGVtcywgZXhjZXB0IG90aGVyIGFuZCBub25lLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdEFsbCgpIHtcbiAgICB2YXIgdmFsID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMudmlzaWJsZUNob2ljZXNbaV07XG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0gPT09IHRoaXMubm9uZUl0ZW0gfHxcbiAgICAgICAgaXRlbSA9PT0gdGhpcy5vdGhlckl0ZW0gfHxcbiAgICAgICAgaXRlbSA9PT0gdGhpcy5zZWxlY3RBbGxJdGVtXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdmFsLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBpdGVtIGlzIGNoZWNrZWRcbiAgICogQHBhcmFtIGl0ZW0gY2hlY2tib3ggaXRlbSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGlzSXRlbVNlbGVjdGVkKGl0ZW06IEl0ZW1WYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGlmIChpdGVtID09PSB0aGlzLnNlbGVjdEFsbEl0ZW0pIHJldHVybiB0aGlzLmlzQWxsU2VsZWN0ZWQ7XG4gICAgdmFyIHZhbCA9IHRoaXMucmVuZGVyZWRWYWx1ZTtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModmFsW2ldLCBpdGVtLnZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgZGlmZmVyZW50IHRvIDAgdG8gbGltaXQgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBjaG9pY2VzIGluIHRoZSBjaGVja2JveC5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2VsZWN0ZWRDaG9pY2VzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFNlbGVjdGVkQ2hvaWNlc1wiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFNlbGVjdGVkQ2hvaWNlcyh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAwKSB2YWwgPSAwO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFNlbGVjdGVkQ2hvaWNlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSBjaGVja2JveC4gUmV0dXJucyBlbXB0eSBhcnJheSBpZiB0aGUgdmFsdWUgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRJdGVtcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybiBbXTtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCB2YWxbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgb25FbmFibGVJdGVtQ2FsbEJhY2soaXRlbTogSXRlbVZhbHVlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnNob3VsZENoZWNrTWF4U2VsZWN0ZWRDaG9pY2VzKCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pO1xuICB9XG4gIHByb3RlY3RlZCBvbkFmdGVyUnVuSXRlbXNFbmFibGVDb25kaXRpb24oKSB7XG4gICAgaWYgKHRoaXMubWF4U2VsZWN0ZWRDaG9pY2VzIDwgMSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmhhc1NlbGVjdEFsbCkge1xuICAgICAgdGhpcy5zZWxlY3RBbGxJdGVtLnNldElzRW5hYmxlZChcbiAgICAgICAgdGhpcy5tYXhTZWxlY3RlZENob2ljZXMgPj0gdGhpcy5hY3RpdmVDaG9pY2VzLmxlbmd0aFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIHtcbiAgICAgIHRoaXMub3RoZXJJdGVtLnNldElzRW5hYmxlZChcbiAgICAgICAgIXRoaXMuc2hvdWxkQ2hlY2tNYXhTZWxlY3RlZENob2ljZXMoKSB8fCB0aGlzLmlzT3RoZXJTZWxlY3RlZFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzaG91bGRDaGVja01heFNlbGVjdGVkQ2hvaWNlcygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tYXhTZWxlY3RlZENob2ljZXMgPCAxKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgdmFyIGxlbiA9ICFBcnJheS5pc0FycmF5KHZhbCkgPyAwIDogdmFsLmxlbmd0aDtcbiAgICByZXR1cm4gbGVuID49IHRoaXMubWF4U2VsZWN0ZWRDaG9pY2VzO1xuICB9XG4gIGdldEl0ZW1DbGFzcyhpdGVtOiBhbnkpIHtcbiAgICBsZXQgdmFsID0gdGhpcy52YWx1ZTsgLy90cmlnZ2VyIGRlcGVuZGVuY2llcyBmcm9tIGtvVmFsdWUgZm9yIGtub2Nrb3V0XG4gICAgbGV0IGl0ZW1DbGFzcyA9IHN1cGVyLmdldEl0ZW1DbGFzcyhpdGVtKTtcbiAgICBjb25zdCBpc1NlbGVjdEFsbCA9IGl0ZW0gPT09IHRoaXMuc2VsZWN0QWxsSXRlbTtcbiAgICBpZiAoaXNTZWxlY3RBbGwgJiYgISF0aGlzLmNzc0NsYXNzZXMuaXRlbVNlbGVjdEFsbClcbiAgICAgIGl0ZW1DbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtU2VsZWN0QWxsO1xuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuaXNDaGFuZ2luZ1ZhbHVlT25DbGVhckluY29ycmVjdCkge1xuICAgICAgdGhpcy5pbnZpc2libGVPbGRWYWx1ZXMgPSBbXTtcbiAgICB9XG4gICAgbmV3VmFsdWUgPSB0aGlzLnZhbHVlRnJvbURhdGEobmV3VmFsdWUpO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCFuZXdWYWx1ZSkgbmV3VmFsdWUgPSBbXTtcbiAgICBpZiAoIXZhbHVlKSB2YWx1ZSA9IFtdO1xuICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModmFsdWUsIG5ld1ZhbHVlKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmhhc05vbmUpIHtcbiAgICAgIHZhciBwcmV2Tm9uZUluZGV4ID0gdGhpcy5ub25lSW5kZXhJbkFycmF5KHZhbHVlKTtcbiAgICAgIHZhciBuZXdOb25lSW5kZXggPSB0aGlzLm5vbmVJbmRleEluQXJyYXkobmV3VmFsdWUpO1xuICAgICAgaWYgKHByZXZOb25lSW5kZXggPiAtMSkge1xuICAgICAgICBpZiAobmV3Tm9uZUluZGV4ID4gLTEgJiYgbmV3VmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG5ld1ZhbHVlLnNwbGljZShuZXdOb25lSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobmV3Tm9uZUluZGV4ID4gLTEpIHtcbiAgICAgICAgICBuZXdWYWx1ZS5zcGxpY2UoMCwgbmV3VmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICBuZXdWYWx1ZS5wdXNoKHRoaXMubm9uZUl0ZW0udmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLnNldE5ld1ZhbHVlKHRoaXMucmVuZHJlZFZhbHVlVG9EYXRhKG5ld1ZhbHVlKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzTXVsdGlwbGVWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29tbWVudEZyb21WYWx1ZShuZXdWYWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgaW5kID0gdGhpcy5nZXRGaXJzdFVua25vd25JbmRleChuZXdWYWx1ZSk7XG4gICAgaWYgKGluZCA8IDApIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBuZXdWYWx1ZVtpbmRdO1xuICB9XG4gIHByb3RlY3RlZCBzZXRPdGhlclZhbHVlSW50b1ZhbHVlKG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciBpbmQgPSB0aGlzLmdldEZpcnN0VW5rbm93bkluZGV4KG5ld1ZhbHVlKTtcbiAgICBpZiAoaW5kIDwgMCkgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIG5ld1ZhbHVlLnNwbGljZShpbmQsIDEsIHRoaXMub3RoZXJJdGVtLnZhbHVlKTtcbiAgICByZXR1cm4gbmV3VmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBnZXRGaXJzdFVua25vd25JbmRleChuZXdWYWx1ZTogYW55KTogbnVtYmVyIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobmV3VmFsdWUpKSByZXR1cm4gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaGFzVW5rbm93blZhbHVlKG5ld1ZhbHVlW2ldKSkgcmV0dXJuIGk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBwcml2YXRlIG5vbmVJbmRleEluQXJyYXkodmFsOiBhbnkpIHtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gLTE7XG4gICAgdmFyIG5vbmVWYWx1ZSA9IHRoaXMubm9uZUl0ZW0udmFsdWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWxbaV0gPT0gbm9uZVZhbHVlKSByZXR1cm4gaTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHByb3RlY3RlZCBjYW5Vc2VGaWx0ZXJlZENob2ljZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmhhc1NlbGVjdEFsbCAmJiBzdXBlci5jYW5Vc2VGaWx0ZXJlZENob2ljZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgc3VwcG9ydFNlbGVjdEFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1N1cHBvcnRQcm9wZXJ0eShcImhhc1NlbGVjdEFsbFwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWRkVG9WaXNpYmxlQ2hvaWNlcyhpdGVtczogQXJyYXk8SXRlbVZhbHVlPiwgaXNBZGRBbGw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5zdXBwb3J0U2VsZWN0QWxsKCkgJiYgKGlzQWRkQWxsIHx8IHRoaXMuaGFzU2VsZWN0QWxsKSkge1xuICAgICAgaXRlbXMudW5zaGlmdCh0aGlzLnNlbGVjdEFsbEl0ZW0pO1xuICAgIH1cbiAgICBzdXBlci5hZGRUb1Zpc2libGVDaG9pY2VzKGl0ZW1zLCBpc0FkZEFsbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQnVpbHRJbkNob2ljZShcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgaXRlbSA9PT0gKDxRdWVzdGlvbkNoZWNrYm94QmFzZT5xdWVzdGlvbikuc2VsZWN0QWxsSXRlbSB8fFxuICAgICAgc3VwZXIuaXNCdWlsdEluQ2hvaWNlKGl0ZW0sIHF1ZXN0aW9uKVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEZvciBpbnRlcm5hbCB1c2UgaW4gU3VydmV5SlMgQ3JlYXRvciBWMi5cbiAgICovXG4gIHB1YmxpYyBpc0l0ZW1Jbkxpc3QoaXRlbTogSXRlbVZhbHVlKTogYm9vbGVhbiB7XG4gICAgaWYgKGl0ZW0gPT0gdGhpcy5zZWxlY3RBbGxJdGVtKSByZXR1cm4gdGhpcy5oYXNTZWxlY3RBbGw7XG4gICAgcmV0dXJuIHN1cGVyLmlzSXRlbUluTGlzdChpdGVtKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgcmV0dXJuIHN1cGVyLmdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dCwgdmFsdWUpO1xuICAgIHZhciBpdGVtcyA9IHRoaXMudmlzaWJsZUNob2ljZXM7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbFN0ciA9IHRoaXMuZ2V0Q2hvaWNlc0Rpc3BsYXlWYWx1ZShpdGVtcywgdmFsdWVbaV0pO1xuICAgICAgaWYgKHZhbFN0cikge1xuICAgICAgICBpZiAoc3RyKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICBzdHIgKz0gdmFsU3RyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhckluY29ycmVjdFZhbHVlc0NvcmUoKSB7XG4gICAgdGhpcy5jbGVhckluY29ycmVjdEFuZERpc2FibGVkVmFsdWVzKGZhbHNlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJEaXNhYmxlZFZhbHVlc0NvcmUoKSB7XG4gICAgdGhpcy5jbGVhckluY29ycmVjdEFuZERpc2FibGVkVmFsdWVzKHRydWUpO1xuICB9XG4gIHByaXZhdGUgaXNDaGFuZ2luZ1ZhbHVlT25DbGVhckluY29ycmVjdDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGNsZWFySW5jb3JyZWN0QW5kRGlzYWJsZWRWYWx1ZXMoY2xlYXJEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIHZhciBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIHJlc3RvcmVkVmFsdWVzID0gdGhpcy5yZXN0b3JlVmFsdWVzRnJvbUludmlzaWJsZSgpO1xuICAgIGlmICghdmFsICYmIHJlc3RvcmVkVmFsdWVzLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkgfHwgdmFsLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmlzQ2hhbmdpbmdWYWx1ZU9uQ2xlYXJJbmNvcnJlY3QgPSB0cnVlO1xuICAgICAgaWYgKCFjbGVhckRpc2FibGVkKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pc0NoYW5naW5nVmFsdWVPbkNsZWFySW5jb3JyZWN0ID0gZmFsc2U7XG4gICAgICBpZiAocmVzdG9yZWRWYWx1ZXMubGVuZ3RoID09IDApIHJldHVybjtcbiAgICAgIHZhbCA9IFtdO1xuICAgIH1cbiAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlzVW5rb3duID0gdGhpcy5jYW5DbGVhclZhbHVlQW5Vbmtub3codmFsW2ldKTtcbiAgICAgIGlmIChcbiAgICAgICAgKCFjbGVhckRpc2FibGVkICYmICFpc1Vua293bikgfHxcbiAgICAgICAgKGNsZWFyRGlzYWJsZWQgJiYgIXRoaXMuaXNWYWx1ZURpc2FibGVkKHZhbFtpXSkpXG4gICAgICApIHtcbiAgICAgICAgbmV3VmFsdWUucHVzaCh2YWxbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGlmIChpc1Vua293bikge1xuICAgICAgICAgIHRoaXMuaW52aXNpYmxlT2xkVmFsdWVzW3ZhbFtpXV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdG9yZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld1ZhbHVlLnB1c2gocmVzdG9yZWRWYWx1ZXNbaV0pO1xuICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmICghaGFzQ2hhbmdlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNDaGFuZ2luZ1ZhbHVlT25DbGVhckluY29ycmVjdCA9IHRydWU7XG4gICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICB0aGlzLmlzQ2hhbmdpbmdWYWx1ZU9uQ2xlYXJJbmNvcnJlY3QgPSBmYWxzZTtcbiAgfVxuICBwcml2YXRlIHJlc3RvcmVWYWx1ZXNGcm9tSW52aXNpYmxlKCk6IEFycmF5PGFueT4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgdmlzSXRlbXMgPSB0aGlzLnZpc2libGVDaG9pY2VzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzSXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWwgPSB2aXNJdGVtc1tpXS52YWx1ZTtcbiAgICAgIGlmICh0aGlzLmludmlzaWJsZU9sZFZhbHVlc1t2YWxdKSB7XG4gICAgICAgIHJlcy5wdXNoKHZhbCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmludmlzaWJsZU9sZFZhbHVlc1t2YWxdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICB2YXIganNvbiA9IHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICBpZiAob3BlcmF0b3IgPT0gXCJjb250YWluc1wiIHx8IG9wZXJhdG9yID09IFwibm90Y29udGFpbnNcIikge1xuICAgICAganNvbltcInR5cGVcIl0gPSBcInJhZGlvZ3JvdXBcIjtcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgcHVibGljIGlzQW5zd2VyQ29ycmVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gSGVscGVycy5pc0FycmF5Q29udGFpbnNFcXVhbCh0aGlzLnZhbHVlLCB0aGlzLmNvcnJlY3RBbnN3ZXIpO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWVXaXRoT3RoZXJzKCkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLnJlbmRlcmVkVmFsdWVGcm9tRGF0YUNvcmUodGhpcy5kZWZhdWx0VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRIYXNPdGhlcih2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdmFsLmluZGV4T2YodGhpcy5vdGhlckl0ZW0udmFsdWUpID49IDA7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICghdmFsKSByZXR1cm4gdmFsO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gW3N1cGVyLnZhbHVlRnJvbURhdGEodmFsKV07XG4gICAgbGV0IHZhbHVlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjaG9pY2VpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMuYWN0aXZlQ2hvaWNlcywgdmFsW2ldKTtcbiAgICAgIGlmICghIWNob2ljZWl0ZW0pIHtcbiAgICAgICAgdmFsdWUucHVzaChjaG9pY2VpdGVtLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlLnB1c2godmFsW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJlZFZhbHVlRnJvbURhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSB2YWwgPSBbXTtcbiAgICBpZiAoIXRoaXMuaGFzQWN0aXZlQ2hvaWNlcykgcmV0dXJuIHZhbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbFtpXSA9PSB0aGlzLm90aGVySXRlbS52YWx1ZSkgcmV0dXJuIHZhbDtcbiAgICAgIGlmICh0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWxbaV0sIHRydWUsIGZhbHNlKSkge1xuICAgICAgICB0aGlzLmNvbW1lbnQgPSB2YWxbaV07XG4gICAgICAgIHZhciBuZXdWYWwgPSB2YWwuc2xpY2UoKTtcbiAgICAgICAgbmV3VmFsW2ldID0gdGhpcy5vdGhlckl0ZW0udmFsdWU7XG4gICAgICAgIHJldHVybiBuZXdWYWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRyZWRWYWx1ZVRvRGF0YUNvcmUodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICghdmFsIHx8ICF2YWwubGVuZ3RoKSByZXR1cm4gdmFsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsW2ldID09IHRoaXMub3RoZXJJdGVtLnZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmdldFF1ZXN0aW9uQ29tbWVudCgpKSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbCA9IHZhbC5zbGljZSgpO1xuICAgICAgICAgIG5ld1ZhbFtpXSA9IHRoaXMuZ2V0UXVlc3Rpb25Db21tZW50KCk7XG4gICAgICAgICAgcmV0dXJuIG5ld1ZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImNoZWNrYm94XCIsXG4gIFtcbiAgICBcImhhc1NlbGVjdEFsbDpib29sZWFuXCIsXG4gICAgeyBuYW1lOiBcIm1heFNlbGVjdGVkQ2hvaWNlczpudW1iZXJcIiwgZGVmYXVsdDogMCB9LFxuICAgIHsgbmFtZTogXCJzZWxlY3RBbGxUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NTZWxlY3RBbGxUZXh0XCIgfSxcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkNoZWNrYm94TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwiY2hlY2tib3hiYXNlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNoZWNrYm94XCIsIChuYW1lKSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX3RleHRiYXNlXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBjb21tZW50IHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNvbW1lbnRNb2RlbCBleHRlbmRzIFF1ZXN0aW9uVGV4dEJhc2Uge1xuICAvKipcbiAgICogVGhlIGh0bWwgcm93cyBhdHRyaWJ1dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd3MoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJvd3ModmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBodG1sIGNvbHMgYXR0cmlidXRlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2xzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHNcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb2xzKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sc1wiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImNvbW1lbnRcIixcbiAgW1xuICAgIHsgbmFtZTogXCJtYXhMZW5ndGg6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAgeyBuYW1lOiBcImNvbHM6bnVtYmVyXCIsIGRlZmF1bHQ6IDUwIH0sXG4gICAgeyBuYW1lOiBcInJvd3M6bnVtYmVyXCIsIGRlZmF1bHQ6IDQgfSxcbiAgICB7IG5hbWU6IFwicGxhY2VIb2xkZXJcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BsYWNlSG9sZGVyXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRleHRVcGRhdGVNb2RlXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJvbkJsdXJcIiwgXCJvblR5cGluZ1wiXSxcbiAgICB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKFwiXCIpO1xuICB9LFxuICBcInRleHRiYXNlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNvbW1lbnRcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnRNb2RlbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciwgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24gfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQge1xuICBJU3VydmV5SW1wbCxcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXksXG4gIElUZXh0UHJvY2Vzc29yLFxuICBJUGFuZWwsXG4gIElFbGVtZW50XG59IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuL3N1cnZleS1lbGVtZW50XCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsIH0gZnJvbSBcIi4vcGFuZWxcIjtcbmltcG9ydCB7IEhlbHBlcnMsIEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0UHJvY2Vzc29yIH0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50UXVlc3Rpb25KU09OIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBqc29uOiBhbnkpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgICAgIG5hbWUsXG4gICAgICBbXSxcbiAgICAgIGZ1bmN0aW9uKGpzb246IGFueSkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50Q29sbGVjdGlvbi5JbnN0YW5jZS5jcmVhdGVRdWVzdGlvbihcbiAgICAgICAgICAhIWpzb24gPyBqc29uLm5hbWUgOiBcIlwiLFxuICAgICAgICAgIHNlbGZcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBcInF1ZXN0aW9uXCJcbiAgICApO1xuICAgIHRoaXMub25Jbml0KCk7XG4gIH1cbiAgcHVibGljIG9uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuanNvbi5vbkluaXQpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25Jbml0KCk7XG4gIH1cbiAgcHVibGljIG9uQ3JlYXRlZChxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBpZiAoIXRoaXMuanNvbi5vbkNyZWF0ZWQpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25DcmVhdGVkKHF1ZXN0aW9uKTtcbiAgfVxuICBwdWJsaWMgb25Mb2FkZWQocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmpzb24ub25Mb2FkZWQpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25Mb2FkZWQocXVlc3Rpb24pO1xuICB9XG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyKHF1ZXN0aW9uOiBRdWVzdGlvbiwgaHRtbEVsZW1lbnQ6IGFueSkge1xuICAgIGlmICghdGhpcy5qc29uLm9uQWZ0ZXJSZW5kZXIpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25BZnRlclJlbmRlcihxdWVzdGlvbiwgaHRtbEVsZW1lbnQpO1xuICB9XG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyQ29udGVudEVsZW1lbnQoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGVsZW1lbnQ6IFF1ZXN0aW9uLFxuICAgIGh0bWxFbGVtZW50OiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmpzb24ub25BZnRlclJlbmRlckNvbnRlbnRFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5qc29uLm9uQWZ0ZXJSZW5kZXJDb250ZW50RWxlbWVudChxdWVzdGlvbiwgZWxlbWVudCwgaHRtbEVsZW1lbnQpO1xuICB9XG4gIHB1YmxpYyBvblByb3BlcnR5Q2hhbmdlZChcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueVxuICApIHtcbiAgICBpZiAoIXRoaXMuanNvbi5vblByb3BlcnR5Q2hhbmdlZCkgcmV0dXJuO1xuICAgIHRoaXMuanNvbi5vblByb3BlcnR5Q2hhbmdlZChxdWVzdGlvbiwgcHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIG9uVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBRdWVzdGlvbiwgbmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLmpzb24ub25WYWx1ZUNoYW5nZWQpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25WYWx1ZUNoYW5nZWQocXVlc3Rpb24sIG5hbWUsIG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgb25JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueVxuICApIHtcbiAgICBpZiAoIXRoaXMuanNvbi5vbkl0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZCkgcmV0dXJuO1xuICAgIHRoaXMuanNvbi5vbkl0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZChxdWVzdGlvbiwge1xuICAgICAgb2JqOiBpdGVtLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlLFxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDb21wb3NpdGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5qc29uLmVsZW1lbnRzSlNPTiB8fCAhIXRoaXMuanNvbi5jcmVhdGVFbGVtZW50cztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50Q29sbGVjdGlvbiB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IENvbXBvbmVudENvbGxlY3Rpb24gPSBuZXcgQ29tcG9uZW50Q29sbGVjdGlvbigpO1xuICBwcml2YXRlIGN1c3RvbVF1ZXN0aW9uVmFsdWVzOiBBcnJheTxDb21wb25lbnRRdWVzdGlvbkpTT04+ID0gW107XG4gIHB1YmxpYyBvbkNyZWF0ZUNvbXBvc2l0ZTogKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBxdWVzdGlvbkpTT046IENvbXBvbmVudFF1ZXN0aW9uSlNPTlxuICApID0+IFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWw7XG4gIHB1YmxpYyBvbkNyZWF0ZUN1c3RvbTogKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBxdWVzdGlvbkpTT046IENvbXBvbmVudFF1ZXN0aW9uSlNPTlxuICApID0+IFF1ZXN0aW9uQ3VzdG9tTW9kZWw7XG4gIHB1YmxpYyBvbkFkZGluZ0pzb246IChuYW1lOiBzdHJpbmcsIGlzQ29tcG9zaXRlOiBib29sZWFuKSA9PiB2b2lkO1xuICBwdWJsaWMgYWRkKGpzb246IGFueSkge1xuICAgIGlmICghanNvbikgcmV0dXJuO1xuICAgIGxldCBuYW1lID0ganNvbi5uYW1lO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgXCJBdHRyaWJ1dGUgbmFtZSBpcyBtaXNzZWRcIjtcbiAgICB9XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoISF0aGlzLmdldEN1c3RvbVF1ZXN0aW9uQnlOYW1lKG5hbWUpKSB7XG4gICAgICB0aHJvdyBcIlRoZXJlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBjdXN0b20gcXVlc3Rpb24gd2l0aCBuYW1lICdcIiArXG4gICAgICAgIG5hbWUgK1xuICAgICAgICBcIidcIjtcbiAgICB9XG4gICAgaWYgKCEhU2VyaWFsaXplci5maW5kQ2xhc3MobmFtZSkpIHtcbiAgICAgIHRocm93IFwiVGhlcmUgaXMgYWxyZWFkeSBjbGFzcyB3aXRoIG5hbWUgJ1wiICsgbmFtZSArIFwiJ1wiO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tUXVlc3Rpb24gPSBuZXcgQ29tcG9uZW50UXVlc3Rpb25KU09OKG5hbWUsIGpzb24pO1xuICAgIGlmICghIXRoaXMub25BZGRpbmdKc29uKVxuICAgICAgdGhpcy5vbkFkZGluZ0pzb24obmFtZSwgY3VzdG9tUXVlc3Rpb24uaXNDb21wb3NpdGUpO1xuICAgIHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXMucHVzaChjdXN0b21RdWVzdGlvbik7XG4gIH1cbiAgcHVibGljIGdldCBpdGVtcygpOiBBcnJheTxDb21wb25lbnRRdWVzdGlvbkpTT04+IHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVzdGlvblZhbHVlcztcbiAgfVxuICBwdWJsaWMgZ2V0Q3VzdG9tUXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogQ29tcG9uZW50UXVlc3Rpb25KU09OIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmN1c3RvbVF1ZXN0aW9uVmFsdWVzW2ldLm5hbWUgPT0gbmFtZSlcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIFNlcmlhbGl6ZXIucmVtb3ZlQ2xhc3ModGhpcy5jdXN0b21RdWVzdGlvblZhbHVlc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5jdXN0b21RdWVzdGlvblZhbHVlcyA9IFtdO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbiAgKTogUXVlc3Rpb24ge1xuICAgIGlmICghIXF1ZXN0aW9uSlNPTi5pc0NvbXBvc2l0ZSlcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNvbXBvc2l0ZU1vZGVsKG5hbWUsIHF1ZXN0aW9uSlNPTik7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ3VzdG9tTW9kZWwobmFtZSwgcXVlc3Rpb25KU09OKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQ29tcG9zaXRlTW9kZWwoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uSlNPTjogQ29tcG9uZW50UXVlc3Rpb25KU09OXG4gICk6IFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwge1xuICAgIGlmICghIXRoaXMub25DcmVhdGVDb21wb3NpdGUpXG4gICAgICByZXR1cm4gdGhpcy5vbkNyZWF0ZUNvbXBvc2l0ZShuYW1lLCBxdWVzdGlvbkpTT04pO1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Db21wb3NpdGVNb2RlbChuYW1lLCBxdWVzdGlvbkpTT04pO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVDdXN0b21Nb2RlbChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbiAgKTogUXVlc3Rpb25DdXN0b21Nb2RlbCB7XG4gICAgaWYgKCEhdGhpcy5vbkNyZWF0ZUN1c3RvbSkgcmV0dXJuIHRoaXMub25DcmVhdGVDdXN0b20obmFtZSwgcXVlc3Rpb25KU09OKTtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uQ3VzdG9tTW9kZWwobmFtZSwgcXVlc3Rpb25KU09OKTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXVlc3Rpb25DdXN0b21Nb2RlbEJhc2UgZXh0ZW5kcyBRdWVzdGlvblxuICBpbXBsZW1lbnRzIElTdXJ2ZXlJbXBsLCBJU3VydmV5RGF0YSwgSVBhbmVsIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBwdWJsaWMgY3VzdG9tUXVlc3Rpb246IENvbXBvbmVudFF1ZXN0aW9uSlNPTikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXModGhpcyk7XG4gICAgU3VydmV5RWxlbWVudC5DcmVhdGVEaXNhYmxlZERlc2lnbkVsZW1lbnRzID0gdHJ1ZTtcbiAgICB0aGlzLmNyZWF0ZVdyYXBwZXIoKTtcbiAgICBTdXJ2ZXlFbGVtZW50LkNyZWF0ZURpc2FibGVkRGVzaWduRWxlbWVudHMgPSBmYWxzZTtcbiAgICBpZiAoISF0aGlzLmN1c3RvbVF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmN1c3RvbVF1ZXN0aW9uLm9uQ3JlYXRlZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmN1c3RvbVF1ZXN0aW9uID8gdGhpcy5jdXN0b21RdWVzdGlvbi5uYW1lIDogXCJjdXN0b21cIjtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICBpZiAoISF0aGlzLmdldEVsZW1lbnQoKSkge1xuICAgICAgdGhpcy5nZXRFbGVtZW50KCkubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVdyYXBwZXIoKSB7fVxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5vblByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgaWYgKCEhdGhpcy5jdXN0b21RdWVzdGlvbiAmJiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5jdXN0b21RdWVzdGlvbi5vblByb3BlcnR5Q2hhbmdlZCh0aGlzLCBuYW1lLCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBpdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIuaXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkKGl0ZW0sIG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgaWYgKCEhdGhpcy5jdXN0b21RdWVzdGlvbiAmJiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5jdXN0b21RdWVzdGlvbi5vbkl0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgaXRlbSxcbiAgICAgICAgaXRlbS5vd25lclByb3BlcnR5TmFtZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbmV3VmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBvbkZpcnN0UmVuZGVyaW5nKCkge1xuICAgIHZhciBlbCA9IHRoaXMuZ2V0RWxlbWVudCgpO1xuICAgIGlmICghIWVsKSB7XG4gICAgICBlbC5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgfVxuICAgIHN1cGVyLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0RWxlbWVudCgpOiBTdXJ2ZXlFbGVtZW50O1xuICBwcm90ZWN0ZWQgaW5pdEVsZW1lbnQoZWw6IFN1cnZleUVsZW1lbnQpIHtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICBlbC5kaXNhYmxlRGVzaWduQWN0aW9ucyA9IHRydWU7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgdGhpcy5pbml0RWxlbWVudCh0aGlzLmdldEVsZW1lbnQoKSk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICBpZiAoISF0aGlzLmdldEVsZW1lbnQoKSkge1xuICAgICAgdGhpcy5nZXRFbGVtZW50KCkub25TdXJ2ZXlMb2FkKCk7XG4gICAgICB0aGlzLmN1c3RvbVF1ZXN0aW9uLm9uTG9hZGVkKHRoaXMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgLy9EbyBub3RoaW5nXG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyKGVsOiBhbnkpIHtcbiAgICBzdXBlci5hZnRlclJlbmRlcihlbCk7XG4gICAgaWYgKCEhdGhpcy5jdXN0b21RdWVzdGlvbikge1xuICAgICAgdGhpcy5jdXN0b21RdWVzdGlvbi5vbkFmdGVyUmVuZGVyKHRoaXMsIGVsKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSwgdXBkYXRlSXNBbnN3ZXJlZDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlLCB1cGRhdGVJc0Fuc3dlcmVkKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnRDc3MoKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnRDc3MoKTtcbiAgfVxuICAvL0lTdXJ2ZXlJbXBsXG4gIGdldFN1cnZleURhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8vIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgLy8gICByZXR1cm4gdGhpcy5zdXJ2ZXk7XG4gIC8vIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3NvcjtcbiAgfVxuICAvL0lTdXJ2ZXlEYXRhXG4gIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgc2V0VmFsdWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgbG9jTm90aWZpY2F0aW9uOiBhbnksXG4gICAgYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQ/OiBib29sZWFuXG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybjtcbiAgICB2YXIgbmV3TmFtZSA9IHRoaXMuY29udmVydERhdGFOYW1lKG5hbWUpO1xuICAgIHRoaXMuZGF0YS5zZXRWYWx1ZShcbiAgICAgIG5ld05hbWUsXG4gICAgICB0aGlzLmNvbnZlcnREYXRhVmFsdWUobmFtZSwgbmV3VmFsdWUpLFxuICAgICAgbG9jTm90aWZpY2F0aW9uLFxuICAgICAgYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWRcbiAgICApO1xuICAgIHRoaXMudXBkYXRlSXNBbnN3ZXJlZCgpO1xuICAgIHRoaXMudXBkYXRlRWxlbWVudENzcygpO1xuICAgIGlmICghIXRoaXMuY3VzdG9tUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuY3VzdG9tUXVlc3Rpb24ub25WYWx1ZUNoYW5nZWQodGhpcywgbmFtZSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY29udmVydERhdGFOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVOYW1lKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNvbnZlcnREYXRhVmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gbmV3VmFsdWU7XG4gIH1cbiAgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0VmFyaWFibGUobmFtZSkgOiBudWxsO1xuICB9XG4gIHNldFZhcmlhYmxlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm47XG4gICAgdGhpcy5kYXRhLnNldFZhcmlhYmxlKG5hbWUsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldENvbW1lbnQodGhpcy5nZXRWYWx1ZU5hbWUoKSkgOiBcIlwiO1xuICB9XG4gIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nLCBsb2NOb3RpZmljYXRpb246IGFueSk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybjtcbiAgICB0aGlzLmRhdGEuc2V0Q29tbWVudCh0aGlzLmdldFZhbHVlTmFtZSgpLCBuZXdWYWx1ZSwgbG9jTm90aWZpY2F0aW9uKTtcbiAgfVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0QWxsVmFsdWVzKCkgOiB7fTtcbiAgfVxuICBnZXRGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRGaWx0ZXJlZFZhbHVlcygpIDoge307XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldEZpbHRlcmVkUHJvcGVydGllcygpIDoge307XG4gIH1cbiAgLy9JUGFuZWxcbiAgYWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge31cbiAgcmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJsZWZ0XCI7XG4gIH1cbiAgZ2V0UXVlc3Rpb25TdGFydEluZGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhcnRJbmRleCgpO1xuICB9XG4gIGdldENoaWxkcmVuTGF5b3V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJvd1wiO1xuICB9XG4gIGVsZW1lbnRXaWR0aENoYW5nZWQoZWw6IElFbGVtZW50KSB7fVxuICBnZXQgZWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaW5kZXhPZihlbDogSUVsZW1lbnQpOiBudW1iZXIge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBlbnN1cmVSb3dzVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ3VzdG9tTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbkN1c3RvbU1vZGVsQmFzZSB7XG4gIHByaXZhdGUgcXVlc3Rpb25XcmFwcGVyOiBRdWVzdGlvbjtcbiAgcHVibGljIGdldFRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY3VzdG9tXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVdyYXBwZXIoKSB7XG4gICAgdGhpcy5xdWVzdGlvbldyYXBwZXIgPSB0aGlzLmNyZWF0ZVF1ZXN0aW9uKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEVsZW1lbnQoKTogU3VydmV5RWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudFF1ZXN0aW9uO1xuICB9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIGlmICghIXRoaXMuY29udGVudFF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmNvbnRlbnRRdWVzdGlvbi5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLCByZWM6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFF1ZXN0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHJlcyA9IHRoaXMuY29udGVudFF1ZXN0aW9uLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29udGVudFF1ZXN0aW9uLmVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lcnJvcnMucHVzaCh0aGlzLmNvbnRlbnRRdWVzdGlvbi5lcnJvcnNbaV0pO1xuICAgIH1cbiAgICBpZiAoIXJlcykge1xuICAgICAgcmVzID0gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgcmVjKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzKCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZm9jdXMob25FcnJvcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKCEhdGhpcy5jb250ZW50UXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuY29udGVudFF1ZXN0aW9uLmZvY3VzKG9uRXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5mb2N1cyhvbkVycm9yKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBjb250ZW50UXVlc3Rpb24oKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uV3JhcHBlcjtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUXVlc3Rpb24oKTogUXVlc3Rpb24ge1xuICAgIHZhciBqc29uID0gdGhpcy5jdXN0b21RdWVzdGlvbi5qc29uO1xuICAgIHZhciByZXMgPSBudWxsO1xuICAgIGlmICghIWpzb24ucXVlc3Rpb25KU09OKSB7XG4gICAgICB2YXIgcVR5cGUgPSBqc29uLnF1ZXN0aW9uSlNPTi50eXBlO1xuICAgICAgaWYgKCFxVHlwZSB8fCAhU2VyaWFsaXplci5maW5kQ2xhc3MocVR5cGUpKVxuICAgICAgICB0aHJvdyBcInR5cGUgYXR0cmlidXRlIGluIHF1ZXN0aW9uSlNPTiBpcyBlbXB0eSBvciBpbmNvcnJlY3RcIjtcbiAgICAgIHJlcyA9IDxRdWVzdGlvbj5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKHFUeXBlKTtcbiAgICAgIHRoaXMuaW5pdEVsZW1lbnQocmVzKTtcbiAgICAgIHJlcy5mcm9tSlNPTihqc29uLnF1ZXN0aW9uSlNPTik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghIWpzb24uY3JlYXRlUXVlc3Rpb24pIHtcbiAgICAgICAgcmVzID0ganNvbi5jcmVhdGVRdWVzdGlvbigpO1xuICAgICAgICB0aGlzLmluaXRFbGVtZW50KHJlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIXJlcyAmJiAhcmVzLm5hbWUpIHtcbiAgICAgIHJlcy5uYW1lID0gXCJxdWVzdGlvblwiO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRRdWVzdGlvbikgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSAmJiAhdGhpcy5jb250ZW50UXVlc3Rpb24uaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5jb250ZW50UXVlc3Rpb24udmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBzdXBlci5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRRdWVzdGlvbikge1xuICAgICAgdGhpcy5jb250ZW50UXVlc3Rpb24ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjb252ZXJ0RGF0YU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29udGVudFF1ZXN0aW9uKSByZXR1cm4gc3VwZXIuY29udmVydERhdGFOYW1lKG5hbWUpO1xuICAgIHZhciBuZXdOYW1lID0gbmFtZS5yZXBsYWNlKFxuICAgICAgdGhpcy5jb250ZW50UXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCksXG4gICAgICB0aGlzLmdldFZhbHVlTmFtZSgpXG4gICAgKTtcbiAgICByZXR1cm4gbmV3TmFtZS5pbmRleE9mKHRoaXMuZ2V0VmFsdWVOYW1lKCkpID09IDBcbiAgICAgID8gbmV3TmFtZVxuICAgICAgOiBzdXBlci5jb252ZXJ0RGF0YU5hbWUobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNvbnZlcnREYXRhVmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0RGF0YU5hbWUobmFtZSkgPT0gc3VwZXIuY29udmVydERhdGFOYW1lKG5hbWUpXG4gICAgICA/IHRoaXMuY29udGVudFF1ZXN0aW9uLnZhbHVlXG4gICAgICA6IG5ld1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnksIHVwZGF0ZUlzQW5zd2VyZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSwgdXBkYXRlSXNBbnN3ZXJlZCk7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLmNvbnRlbnRRdWVzdGlvbiAmJlxuICAgICAgIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLmNvbnRlbnRRdWVzdGlvbi52YWx1ZSwgbmV3VmFsdWUpXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbnRlbnRRdWVzdGlvbi52YWx1ZSA9IHRoaXMuZ2V0VW5iaW5kVmFsdWUobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIGlmICghIXRoaXMuY29udGVudFF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmNvbnRlbnRRdWVzdGlvbi5vblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUNvcmUoKSB7XG4gICAgaWYgKCEhdGhpcy5jb250ZW50UXVlc3Rpb24pIHJldHVybiB0aGlzLmNvbnRlbnRRdWVzdGlvbi52YWx1ZTtcbiAgICByZXR1cm4gc3VwZXIuZ2V0VmFsdWVDb3JlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGluaXRFbGVtZW50KGVsOiBTdXJ2ZXlFbGVtZW50KSB7XG4gICAgc3VwZXIuaW5pdEVsZW1lbnQoZWwpO1xuICAgIGlmICghIWVsKSB7XG4gICAgICAoPFF1ZXN0aW9uPmVsKS5wYXJlbnQgPSB0aGlzO1xuICAgICAgKDxRdWVzdGlvbj5lbCkuYWZ0ZXJSZW5kZXJRdWVzdGlvbkNhbGxiYWNrID0gKFxuICAgICAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGVsZW1lbnQ6IGFueVxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmICghIXRoaXMuY3VzdG9tUXVlc3Rpb24pIHtcbiAgICAgICAgICB0aGlzLmN1c3RvbVF1ZXN0aW9uLm9uQWZ0ZXJSZW5kZXJDb250ZW50RWxlbWVudChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlRWxlbWVudENzc0NvcmUoY3NzQ2xhc3NlczogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5jb250ZW50UXVlc3Rpb24pIHtcbiAgICAgIGNzc0NsYXNzZXMgPSB0aGlzLmNvbnRlbnRRdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIH1cbiAgICBzdXBlci51cGRhdGVFbGVtZW50Q3NzQ29yZShjc3NDbGFzc2VzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuY29udGVudFF1ZXN0aW9uXG4gICAgICA/IHRoaXMuY29udGVudFF1ZXN0aW9uLmdldERpc3BsYXlWYWx1ZShrZXlBc1RleHQsIHZhbHVlKVxuICAgICAgOiBzdXBlci5nZXREaXNwbGF5VmFsdWVDb3JlKGtleUFzVGV4dCwgdmFsdWUpO1xuICB9XG59XG5cbmNsYXNzIFF1ZXN0aW9uQ29tcG9zaXRlVGV4dFByb2Nlc3NvciBleHRlbmRzIFF1ZXN0aW9uVGV4dFByb2Nlc3NvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb21wb3NpdGU6IFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwsXG4gICAgcHJvdGVjdGVkIHZhcmlhYmxlTmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHZhcmlhYmxlTmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9zaXRlLnN1cnZleTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmNvbXBvc2l0ZS5jb250ZW50UGFuZWw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbkN1c3RvbU1vZGVsQmFzZSB7XG4gIHB1YmxpYyBzdGF0aWMgSXRlbVZhcmlhYmxlTmFtZSA9IFwiY29tcG9zaXRlXCI7XG4gIHByaXZhdGUgcGFuZWxXcmFwcGVyOiBQYW5lbE1vZGVsO1xuICBwcml2YXRlIHRleHRQcm9jZXNzaW5nOiBRdWVzdGlvbkNvbXBvc2l0ZVRleHRQcm9jZXNzb3I7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcHVibGljIGN1c3RvbVF1ZXN0aW9uOiBDb21wb25lbnRRdWVzdGlvbkpTT04pIHtcbiAgICBzdXBlcihuYW1lLCBjdXN0b21RdWVzdGlvbik7XG4gICAgdGhpcy50ZXh0UHJvY2Vzc2luZyA9IG5ldyBRdWVzdGlvbkNvbXBvc2l0ZVRleHRQcm9jZXNzb3IoXG4gICAgICB0aGlzLFxuICAgICAgUXVlc3Rpb25Db21wb3NpdGVNb2RlbC5JdGVtVmFyaWFibGVOYW1lXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlV3JhcHBlcigpIHtcbiAgICB0aGlzLnBhbmVsV3JhcHBlciA9IHRoaXMuY3JlYXRlUGFuZWwoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb21wb3NpdGVcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q3NzVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNvbXBvc2l0ZVwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFbGVtZW50KCk6IFN1cnZleUVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRQYW5lbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvbnRlbnRQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbFdyYXBwZXI7XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLCByZWM6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgcmVjKTtcbiAgICBpZiAoIXRoaXMuY29udGVudFBhbmVsKSByZXR1cm4gcmVzO1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRQYW5lbC5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrLCBmYWxzZSwgcmVjKSB8fCByZXM7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUVsZW1lbnRDc3MocmVOZXc/OiBib29sZWFuKSB7XG4gICAgc3VwZXIudXBkYXRlRWxlbWVudENzcyhyZU5ldyk7XG4gICAgaWYgKHRoaXMuY29udGVudFBhbmVsKSB7XG4gICAgICB0aGlzLmNvbnRlbnRQYW5lbC51cGRhdGVFbGVtZW50Q3NzKHJlTmV3KTtcbiAgICB9XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3Npbmc7XG4gIH1cbiAgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCkge1xuICAgIHN1cGVyLmNsZWFyVmFsdWVJZkludmlzaWJsZSgpO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmNvbnRlbnRQYW5lbC5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICB9XG4gIH1cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuY29udGVudFBhbmVsLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgdmFyIHJlcyA9IDxQYW5lbE1vZGVsPlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoXCJwYW5lbFwiKTtcbiAgICByZXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9IFwib2ZmXCI7XG4gICAgcmVzLnJlbmRlcldpZHRoID0gXCIxMDAlXCI7XG4gICAgdmFyIGpzb24gPSB0aGlzLmN1c3RvbVF1ZXN0aW9uLmpzb247XG4gICAgaWYgKCEhanNvbi5lbGVtZW50c0pTT04pIHtcbiAgICAgIHJlcy5mcm9tSlNPTih7IGVsZW1lbnRzOiBqc29uLmVsZW1lbnRzSlNPTiB9KTtcbiAgICB9XG4gICAgaWYgKCEhanNvbi5jcmVhdGVFbGVtZW50cykge1xuICAgICAganNvbi5jcmVhdGVFbGVtZW50cyhyZXMsIHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLmluaXRFbGVtZW50KHJlcyk7XG4gICAgcmVzLnJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgIHRoaXMuc2V0QWZ0ZXJSZW5kZXJDYWxsYmFja3MocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBvblJlYWRPbmx5Q2hhbmdlZCgpIHtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRQYW5lbCkge1xuICAgICAgdGhpcy5jb250ZW50UGFuZWwucmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHk7XG4gICAgfVxuICAgIHN1cGVyLm9uUmVhZE9ubHlDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRQYW5lbCkge1xuICAgICAgdGhpcy5jb250ZW50UGFuZWwucmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHk7XG4gICAgICB0aGlzLnNldElzQ29udGVudEVsZW1lbnQodGhpcy5jb250ZW50UGFuZWwpO1xuICAgIH1cbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgfVxuICBwcml2YXRlIHNldElzQ29udGVudEVsZW1lbnQocGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICBwYW5lbC5pc0NvbnRlbnRFbGVtZW50ID0gdHJ1ZTtcbiAgICB2YXIgZWxlbWVudHMgPSBwYW5lbC5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmIChlbC5pc1BhbmVsKSB7XG4gICAgICAgIHRoaXMuc2V0SXNDb250ZW50RWxlbWVudCg8UGFuZWxNb2RlbD5lbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAoPFF1ZXN0aW9uPmVsKS5pc0NvbnRlbnRFbGVtZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleCh2YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgdmFyIHJlcyA9IHN1cGVyLnNldFZpc2libGVJbmRleCh2YWwpO1xuICAgIGlmICh0aGlzLmlzVmlzaWJsZSAmJiAhIXRoaXMuY29udGVudFBhbmVsKSB7XG4gICAgICByZXMgKz0gdGhpcy5jb250ZW50UGFuZWwuc2V0VmlzaWJsZUluZGV4KHZhbCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIGlmICghIXRoaXMuY29udGVudFBhbmVsKSB7XG4gICAgICB2YXIgb2xkQ29tcG9zaXRlID0gdmFsdWVzW1F1ZXN0aW9uQ29tcG9zaXRlTW9kZWwuSXRlbVZhcmlhYmxlTmFtZV07XG4gICAgICB2YWx1ZXNbXG4gICAgICAgIFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwuSXRlbVZhcmlhYmxlTmFtZVxuICAgICAgXSA9IHRoaXMuY29udGVudFBhbmVsLmdldFZhbHVlKCk7XG4gICAgICB0aGlzLmNvbnRlbnRQYW5lbC5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICAgIGRlbGV0ZSB2YWx1ZXNbUXVlc3Rpb25Db21wb3NpdGVNb2RlbC5JdGVtVmFyaWFibGVOYW1lXTtcbiAgICAgIGlmICghIW9sZENvbXBvc2l0ZSkge1xuICAgICAgICB2YWx1ZXNbUXVlc3Rpb25Db21wb3NpdGVNb2RlbC5JdGVtVmFyaWFibGVOYW1lXSA9IG9sZENvbXBvc2l0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICByZXR1cm4gISF2YWwgPyB2YWxbbmFtZV0gOiBudWxsO1xuICB9XG4gIHByaXZhdGUgc2V0dGluZ05ld1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHNldFZhbHVlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogYW55LFxuICAgIGxvY05vdGlmaWNhdGlvbjogYW55LFxuICAgIGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkPzogYm9vbGVhblxuICApOiBhbnkge1xuICAgIGlmICh0aGlzLnNldHRpbmdOZXdWYWx1ZSkgcmV0dXJuO1xuICAgIHN1cGVyLnNldFZhbHVlKG5hbWUsIG5ld1ZhbHVlLCBsb2NOb3RpZmljYXRpb24sIGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkKTtcbiAgICBpZiAoIXRoaXMuY29udGVudFBhbmVsKSByZXR1cm47XG4gICAgdmFyIHEgPSB0aGlzLmNvbnRlbnRQYW5lbC5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICBpZiAoISFxICYmICFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIHEudmFsdWUpKSB7XG4gICAgICB0aGlzLnNldHRpbmdOZXdWYWx1ZSA9IHRydWU7XG4gICAgICBxLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB0aGlzLnNldHRpbmdOZXdWYWx1ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRQYW5lbCkgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmNvbnRlbnRQYW5lbC5xdWVzdGlvbnM7XG4gICAgdmFyIHByZWZpeE5hbWUgPSB0aGlzLm5hbWU7XG4gICAgdmFyIHByZWZpeFRleHQgPSB0aGlzLnRpdGxlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICBuYW1lOiBwcmVmaXhOYW1lICsgXCIuXCIgKyBxdWVzdGlvbnNbaV0ubmFtZSxcbiAgICAgICAgdGV4dDogcHJlZml4VGV4dCArIFwiLlwiICsgcXVlc3Rpb25zW2ldLnRpdGxlLFxuICAgICAgICBxdWVzdGlvbjogcXVlc3Rpb25zW2ldLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjb252ZXJ0RGF0YVZhbHVlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHZhbCA9IHt9O1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSkgJiYgIXRoaXMuaXNFZGl0aW5nU3VydmV5RWxlbWVudCkge1xuICAgICAgZGVsZXRlIHZhbFtuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsW25hbWVdID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSwgdXBkYXRlSXNBbnN3ZXJlZDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlLCB1cGRhdGVJc0Fuc3dlcmVkKTtcbiAgICB0aGlzLnNldHRpbmdOZXdWYWx1ZSA9IHRydWU7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuY29udGVudFBhbmVsLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IHF1ZXN0aW9uc1tpXS5nZXRWYWx1ZU5hbWUoKTtcbiAgICAgIHF1ZXN0aW9uc1tpXS52YWx1ZSA9ICEhbmV3VmFsdWUgPyBuZXdWYWx1ZVtrZXldIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLnNldHRpbmdOZXdWYWx1ZSA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleUFzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5jb250ZW50UGFuZWxcbiAgICAgID8gdGhpcy5jb250ZW50UGFuZWwuZ2V0RGlzcGxheVZhbHVlKGtleUFzVGV4dClcbiAgICAgIDogc3VwZXIuZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlBc1RleHQsIHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHNldEFmdGVyUmVuZGVyQ2FsbGJhY2tzKHBhbmVsOiBQYW5lbE1vZGVsKSB7XG4gICAgaWYgKCFwYW5lbCB8fCAhdGhpcy5jdXN0b21RdWVzdGlvbikgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbnMgPSBwYW5lbC5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5hZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2sgPSAoXG4gICAgICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgZWxlbWVudDogYW55XG4gICAgICApID0+IHtcbiAgICAgICAgdGhpcy5jdXN0b21RdWVzdGlvbi5vbkFmdGVyUmVuZGVyQ29udGVudEVsZW1lbnQoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgICBlbGVtZW50XG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25TZWxlY3RCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBkcm9wZG93biBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIGV4dGVuZHMgUXVlc3Rpb25TZWxlY3RCYXNlIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIsIHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJjaG9pY2VzTWluXCIsIFwiY2hvaWNlc01heFwiLCBcImNob2ljZXNTdGVwXCJdLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciB0byBzaG93IG9wdGlvbnMgY2FwdGlvbiBpdGVtICgnQ2hvb3NlLi4uJykuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dPcHRpb25zQ2FwdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd09wdGlvbnNDYXB0aW9uXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd09wdGlvbnNDYXB0aW9uKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dPcHRpb25zQ2FwdGlvblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIG9wdGlvbnMgY2FwdGlvbiBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCB2YWx1ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGFrZW4gZnJvbSBsb2NhbGl6YXRpb24gc3RyaW5ncy5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3B0aW9uc0NhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvcHRpb25zQ2FwdGlvblwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wdGlvbnNDYXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvcHRpb25zQ2FwdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NPcHRpb25zQ2FwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImRyb3Bkb3duXCI7XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZEl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUodGhpcy52aXNpYmxlQ2hvaWNlcywgdGhpcy52YWx1ZSk7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBtaW5NYXhDaG9pY2VzID0gPEFycmF5PEl0ZW1WYWx1ZT4+W107XG4gIHByb3RlY3RlZCBnZXRDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHZhciBpdGVtcyA9IHN1cGVyLmdldENob2ljZXMoKTtcbiAgICBpZiAodGhpcy5jaG9pY2VzTWF4IDw9IHRoaXMuY2hvaWNlc01pbikgcmV0dXJuIGl0ZW1zO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChpdGVtc1tpXSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMubWluTWF4Q2hvaWNlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIHRoaXMubWluTWF4Q2hvaWNlcy5sZW5ndGggIT09XG4gICAgICAgICh0aGlzLmNob2ljZXNNYXggLSB0aGlzLmNob2ljZXNNaW4pIC8gdGhpcy5jaG9pY2VzU3RlcCArIDFcbiAgICApIHtcbiAgICAgIHRoaXMubWluTWF4Q2hvaWNlcyA9IFtdO1xuICAgICAgZm9yIChcbiAgICAgICAgdmFyIGkgPSB0aGlzLmNob2ljZXNNaW47XG4gICAgICAgIGkgPD0gdGhpcy5jaG9pY2VzTWF4O1xuICAgICAgICBpICs9IHRoaXMuY2hvaWNlc1N0ZXBcbiAgICAgICkge1xuICAgICAgICB0aGlzLm1pbk1heENob2ljZXMucHVzaChuZXcgSXRlbVZhbHVlKGkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzID0gcmVzLmNvbmNhdCh0aGlzLm1pbk1heENob2ljZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIGFuZCBjaG9pY2VzTWF4IHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgYWRkIGNob2ljZXMuIEZvciBleGFtcGxlIGNob2ljZXNNaW4gPSAxIGFuZCBjaG9pY2VzTWF4ID0gMTAgd2lsbCBnZW5lcmF0ZSB0ZW4gYWRkaXRpb25hbCBjaG9pY2VzIGZyb20gMSB0byAxMC5cbiAgICogQHNlZSBjaG9pY2VzTWF4XG4gICAqIEBzZWUgY2hvaWNlc1N0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc01pbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzTWluXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc01pbih2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNNaW5cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgYW5kIGNob2ljZXNNYXggcHJvcGVydHkgdG8gYXV0b21hdGljYWxseSBhZGQgY2hvaWNlcy4gRm9yIGV4YW1wbGUgY2hvaWNlc01pbiA9IDEgYW5kIGNob2ljZXNNYXggPSAxMCB3aWxsIGdlbmVyYXRlIHRlbiBhZGRpdGlvbmFsIGNob2ljZXMgZnJvbSAxIHRvIDEwLlxuICAgKiBAc2VlIGNob2ljZXNNaW5cbiAgICogQHNlZSBjaG9pY2VzU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzTWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNNYXhcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzTWF4KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc01heFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLiBJdCB0ZWxscyB0aGUgdmFsdWUgb2YgdGhlIGl0ZXJhdG9yIGJldHdlZW4gY2hvaWNlc01pbiBhbmQgY2hvaWNlc01heCBwcm9wZXJ0aWVzLlxuICAgKiBJZiBjaG9pY2VzTWluID0gMTAsIGNob2ljZXNNYXggPSAzMCBhbmQgY2hvaWNlc1N0ZXAgPSAxMCB0aGVuIHlvdSB3aWxsIGhhdmUgb25seSB0aHJlZSBhZGRpdGlvbmFsIGNob2ljZXM6IFsxMCwgMjAsIDMwXS5cbiAgICogQHNlZSBjaG9pY2VzTWluXG4gICAqIEBzZWUgY2hvaWNlc01heFxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzU3RlcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzU3RlcFwiLCAxKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNTdGVwKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDEpIHZhbCA9IDE7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1N0ZXBcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogRHJvcGRvd24gYXV0byBjb21wbGV0ZVxuICAgKi9cbiAgcHVibGljIGdldCBhdXRvQ29tcGxldGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYXV0b0NvbXBsZXRlXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXV0b0NvbXBsZXRlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYXV0b0NvbXBsZXRlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldENvbnRyb2xDbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNzc0NsYXNzZXMgPSB0aGlzLmNzc0NsYXNzZXM7XG4gICAgbGV0IHJlc3VsdCA9XG4gICAgICBjc3NDbGFzc2VzLmNvbnRyb2wgK1xuICAgICAgKHRoaXMuZXJyb3JzLmxlbmd0aCA+IDAgPyBcIiBcIiArIGNzc0NsYXNzZXMub25FcnJvciA6IFwiXCIpO1xuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHJlc3VsdCArPSBcIiBcIiArIGNzc0NsYXNzZXMuY29udHJvbERpc2FibGVkO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImRyb3Bkb3duXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY09wdGlvbnNDYXB0aW9uXCIgfSxcbiAgICB7IG5hbWU6IFwic2hvd09wdGlvbnNDYXB0aW9uOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJjaG9pY2VzTWluOm51bWJlclwiLCBkZWZhdWx0OiAwIH0sXG4gICAgeyBuYW1lOiBcImNob2ljZXNNYXg6bnVtYmVyXCIsIGRlZmF1bHQ6IDAgfSxcbiAgICB7IG5hbWU6IFwiY2hvaWNlc1N0ZXA6bnVtYmVyXCIsIGRlZmF1bHQ6IDEsIG1pblZhbHVlOiAxIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJhdXRvQ29tcGxldGVcIixcbiAgICAgIGRhdGFMaXN0OiBbXG4gICAgICAgIFwibmFtZVwiLFxuICAgICAgICBcImhvbm9yaWZpYy1wcmVmaXhcIixcbiAgICAgICAgXCJnaXZlbi1uYW1lXCIsXG4gICAgICAgIFwiYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgIFwiZmFtaWx5LW5hbWVcIixcbiAgICAgICAgXCJob25vcmlmaWMtc3VmZml4XCIsXG4gICAgICAgIFwibmlja25hbWVcIixcbiAgICAgICAgXCJvcmdhbml6YXRpb24tdGl0bGVcIixcbiAgICAgICAgXCJ1c2VybmFtZVwiLFxuICAgICAgICBcIm5ldy1wYXNzd29yZFwiLFxuICAgICAgICBcImN1cnJlbnQtcGFzc3dvcmRcIixcbiAgICAgICAgXCJvcmdhbml6YXRpb25cIixcbiAgICAgICAgXCJzdHJlZXQtYWRkcmVzc1wiLFxuICAgICAgICBcImFkZHJlc3MtbGluZTFcIixcbiAgICAgICAgXCJhZGRyZXNzLWxpbmUyXCIsXG4gICAgICAgIFwiYWRkcmVzcy1saW5lM1wiLFxuICAgICAgICBcImFkZHJlc3MtbGV2ZWw0XCIsXG4gICAgICAgIFwiYWRkcmVzcy1sZXZlbDNcIixcbiAgICAgICAgXCJhZGRyZXNzLWxldmVsMlwiLFxuICAgICAgICBcImFkZHJlc3MtbGV2ZWwxXCIsXG4gICAgICAgIFwiY291bnRyeVwiLFxuICAgICAgICBcImNvdW50cnktbmFtZVwiLFxuICAgICAgICBcInBvc3RhbC1jb2RlXCIsXG4gICAgICAgIFwiY2MtbmFtZVwiLFxuICAgICAgICBcImNjLWdpdmVuLW5hbWVcIixcbiAgICAgICAgXCJjYy1hZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgXCJjYy1mYW1pbHktbmFtZVwiLFxuICAgICAgICBcImNjLW51bWJlclwiLFxuICAgICAgICBcImNjLWV4cFwiLFxuICAgICAgICBcImNjLWV4cC1tb250aFwiLFxuICAgICAgICBcImNjLWV4cC15ZWFyXCIsXG4gICAgICAgIFwiY2MtY3NjXCIsXG4gICAgICAgIFwiY2MtdHlwZVwiLFxuICAgICAgICBcInRyYW5zYWN0aW9uLWN1cnJlbmN5XCIsXG4gICAgICAgIFwidHJhbnNhY3Rpb24tYW1vdW50XCIsXG4gICAgICAgIFwibGFuZ3VhZ2VcIixcbiAgICAgICAgXCJiZGF5XCIsXG4gICAgICAgIFwiYmRheS1kYXlcIixcbiAgICAgICAgXCJiZGF5LW1vbnRoXCIsXG4gICAgICAgIFwiYmRheS15ZWFyXCIsXG4gICAgICAgIFwic2V4XCIsXG4gICAgICAgIFwidXJsXCIsXG4gICAgICAgIFwicGhvdG9cIixcbiAgICAgICAgXCJ0ZWxcIixcbiAgICAgICAgXCJ0ZWwtY291bnRyeS1jb2RlXCIsXG4gICAgICAgIFwidGVsLW5hdGlvbmFsXCIsXG4gICAgICAgIFwidGVsLWFyZWEtY29kZVwiLFxuICAgICAgICBcInRlbC1sb2NhbFwiLFxuICAgICAgICBcInRlbC1sb2NhbC1wcmVmaXhcIixcbiAgICAgICAgXCJ0ZWwtbG9jYWwtc3VmZml4XCIsXG4gICAgICAgIFwidGVsLWV4dGVuc2lvblwiLFxuICAgICAgICBcImVtYWlsXCIsXG4gICAgICAgIFwiaW1wcFwiLFxuICAgICAgXSxcbiAgICB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJzZWxlY3RiYXNlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImRyb3Bkb3duXCIsIChuYW1lKSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhbiBxdWVzdGlvbiB0aGF0IHJlbmRlcnMgZW1wdHkgXCJkaXZcIiB0YWcuIEl0IHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZvciBzb21lIGN1c3RvbSB3aWRnZXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkVtcHR5TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZW1wdHlcIjtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImVtcHR5XCIsXG4gIFtdLFxuICBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkVtcHR5TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcbiIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGV4cHJlc3Npb24gcXVlc3Rpb24uIEl0IGlzIGEgcmVhZC1vbmx5IHF1ZXN0aW9uLiBJdCBjYWxjdWxhdGVzIHZhbHVlIGJhc2VkIG9uIGVweHJlc3Npb24gcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHJpdmF0ZSBleHByZXNzaW9uSXNSdW5uaW5nOiBib29sZWFuO1xuICBwcml2YXRlIGV4cHJlc3Npb25SdW5uZXI6IEV4cHJlc3Npb25SdW5uZXI7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJmb3JtYXRcIiwgdGhpcyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJleHByZXNzaW9uXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuZXhwcmVzc2lvblJ1bm5lcikge1xuICAgICAgICBzZWxmLmV4cHJlc3Npb25SdW5uZXIgPSBuZXcgRXhwcmVzc2lvblJ1bm5lcihzZWxmLmV4cHJlc3Npb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZXhwcmVzc2lvblwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBkaXNwbGF5IHRoZSB2YWx1ZSBpbiB5b3VyIG93biBmb3JtYXQuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBcInswfVwiIHN1YnN0cmluZyBpbiB5b3VyIHN0cmluZywgdG8gZGlzcGxheSB0aGUgYWN0dWFsIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCBmb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJmb3JtYXRcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBmb3JtYXQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImZvcm1hdFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NGb3JtYXQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZm9ybWF0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgRXhwcmVzc2lvbiB0aGF0IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBxdWVzdGlvbiB2YWx1ZS4gWW91IG1heSB1c2Ugc3RhbmRhcmQgb3BlcmF0b3JzIGxpa2UgKywgLSwgKiBhbmQgLywgc3F1YXJlcyAoKS4gSGVyZSBpcyB0aGUgZXhhbXBsZSBvZiBhY2Nlc3NpbmcgdGhlIHF1ZXN0aW9uIHZhbHVlIHtxdWVzdGlvbm5hbWV9LlxuICAgKiA8YnIvPkV4YW1wbGU6IFwiKHtxdWFudGl0eX0gKiB7cHJpY2V9KSAqICgxMDAgLSB7ZGlzY291bnR9KSAvIDEwMFwiXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGxvY0NhbGN1bGF0aW9uKCkge1xuICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyA9IHRydWU7XG4gIH1cbiAgcHVibGljIHVubG9jQ2FsY3VsYXRpb24oKSB7XG4gICAgdGhpcy5leHByZXNzaW9uSXNSdW5uaW5nID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmV4cHJlc3Npb24gfHxcbiAgICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyB8fFxuICAgICAgKCF0aGlzLnJ1bklmUmVhZE9ubHkgJiYgdGhpcy5pc1JlYWRPbmx5KVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmV4cHJlc3Npb25SdW5uZXIpIHtcbiAgICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lciA9IG5ldyBFeHByZXNzaW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKG5ld1ZhbHVlKSA9PiB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhuZXdWYWx1ZSwgdGhpcy52YWx1ZSkpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy51bmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgfTtcbiAgICB0aGlzLmV4cHJlc3Npb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLCByZWM6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGZyYWN0aW9uIGRpZ2l0cyB0byB1c2UgaWYgZGlzcGxheVN0eWxlIGlzIG5vdCBcIm5vbmVcIi4gUG9zc2libGUgdmFsdWVzIGFyZSBmcm9tIDAgdG8gMjAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC0xIGFuZCBpdCBtZWFucyB0aGF0IHRoaXMgcHJvcGVydHkgaXMgbm90IHVzZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heGltdW1GcmFjdGlvbkRpZ2l0cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhpbXVtRnJhY3Rpb25EaWdpdHNcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4aW11bUZyYWN0aW9uRGlnaXRzKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDIwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4aW11bUZyYWN0aW9uRGlnaXRzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMgdG8gdXNlIGlmIGRpc3BsYXlTdHlsZSBpcyBub3QgXCJub25lXCIuIFBvc3NpYmxlIHZhbHVlcyBhcmUgZnJvbSAwIHRvIDIwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAtMSBhbmQgaXQgbWVhbnMgdGhhdCB0aGlzIHByb3BlcnR5IGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5pbXVtRnJhY3Rpb25EaWdpdHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluaW11bUZyYWN0aW9uRGlnaXRzXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbmltdW1GcmFjdGlvbkRpZ2l0cyh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiAyMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbmltdW1GcmFjdGlvbkRpZ2l0c1wiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgcnVuSWZSZWFkT25seVZhbHVlOiBib29sZWFuO1xuICBwdWJsaWMgZ2V0IHJ1bklmUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucnVuSWZSZWFkT25seVZhbHVlID09PSB0cnVlO1xuICB9XG4gIHB1YmxpYyBzZXQgcnVuSWZSZWFkT25seSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJ1bklmUmVhZE9ubHlWYWx1ZSA9IHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICB2YXIgdmFsID0gdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICB2YXIgcmVzID0gXCJcIjtcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgIHZhciBzdHIgPSB0aGlzLmdldFZhbHVlQXNTdHIodmFsKTtcbiAgICAgIHJlcyA9ICF0aGlzLmZvcm1hdCA/IHN0ciA6ICg8YW55PnRoaXMuZm9ybWF0KVtcImZvcm1hdFwiXShzdHIpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgcmVzID0gdGhpcy5zdXJ2ZXkuZ2V0RXhwcmVzc2lvbkRpc3BsYXlWYWx1ZSh0aGlzLCB2YWwsIHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFlvdSBtYXkgc2V0IHRoaXMgcHJvcGVydHkgdG8gXCJkZWNpbWFsXCIsIFwiY3VycmVuY3lcIiwgXCJwZXJjZW50XCIgb3IgXCJkYXRlXCIuIElmIHlvdSBzZXQgaXQgdG8gXCJjdXJyZW5jeVwiLCB5b3UgbWF5IHVzZSB0aGUgY3VycmVuY3kgcHJvcGVydHkgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4gY3VycmVuY3kgZGlmZmVyZW50IGZyb20gVVNELlxuICAgKiBAc2VlIGN1cnJlbmN5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpc3BsYXlTdHlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5U3R5bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkaXNwbGF5U3R5bGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5U3R5bGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIGRpc3BsYXkgdGhlIHZhbHVlIGluIHRoZSBjdXJyZW5jeSBkaWZmZXJlbiBmcm9tIFVTRC4gVGhlIGRpc3BsYXlTdHlwZSBzaG91bGQgYmUgc2V0IHRvIFwiY3VycmVuY3lcIi5cbiAgICogQHNlZSBkaXNwbGF5U3R5bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVuY3koKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY3VycmVuY3lcIik7XG4gIH1cbiAgcHVibGljIHNldCBjdXJyZW5jeSh2YWw6IHN0cmluZykge1xuICAgIGlmIChnZXRDdXJyZWN5Q29kZXMoKS5pbmRleE9mKHZhbCkgPCAwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY3VycmVuY3lcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogXHREZXRlcm1pbmVzIHdoZXRoZXIgdG8gZGlzcGxheSBncm91cGluZyBzZXBhcmF0b3JzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIGdldCB1c2VHcm91cGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidXNlR3JvdXBpbmdcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB1c2VHcm91cGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ1c2VHcm91cGluZ1wiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUFzU3RyKHZhbDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5U3R5bGUgPT0gXCJkYXRlXCIpIHtcbiAgICAgIHZhciBkID0gbmV3IERhdGUodmFsKTtcbiAgICAgIGlmICghIWQgJiYgISFkLnRvTG9jYWxlRGF0ZVN0cmluZykgcmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpc3BsYXlTdHlsZSAhPSBcIm5vbmVcIiAmJiBIZWxwZXJzLmlzTnVtYmVyKHZhbCkpIHtcbiAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmdldExvY2FsZSgpO1xuICAgICAgaWYgKCFsb2NhbGUpIGxvY2FsZSA9IFwiZW5cIjtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdHlsZTogdGhpcy5kaXNwbGF5U3R5bGUsXG4gICAgICAgIGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5LFxuICAgICAgICB1c2VHcm91cGluZzogdGhpcy51c2VHcm91cGluZyxcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPiAtMSkge1xuICAgICAgICAoPGFueT5vcHRpb25zKVtcIm1heGltdW1GcmFjdGlvbkRpZ2l0c1wiXSA9IHRoaXMubWF4aW11bUZyYWN0aW9uRGlnaXRzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubWluaW11bUZyYWN0aW9uRGlnaXRzID4gLTEpIHtcbiAgICAgICAgKDxhbnk+b3B0aW9ucylbXCJtaW5pbXVtRnJhY3Rpb25EaWdpdHNcIl0gPSB0aGlzLm1pbmltdW1GcmFjdGlvbkRpZ2l0cztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWwudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbC50b1N0cmluZygpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZWN5Q29kZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gIHJldHVybiBbXG4gICAgXCJBRURcIixcbiAgICBcIkFGTlwiLFxuICAgIFwiQUxMXCIsXG4gICAgXCJBTURcIixcbiAgICBcIkFOR1wiLFxuICAgIFwiQU9BXCIsXG4gICAgXCJBUlNcIixcbiAgICBcIkFVRFwiLFxuICAgIFwiQVdHXCIsXG4gICAgXCJBWk5cIixcbiAgICBcIkJBTVwiLFxuICAgIFwiQkJEXCIsXG4gICAgXCJCRFRcIixcbiAgICBcIkJHTlwiLFxuICAgIFwiQkhEXCIsXG4gICAgXCJCSUZcIixcbiAgICBcIkJNRFwiLFxuICAgIFwiQk5EXCIsXG4gICAgXCJCT0JcIixcbiAgICBcIkJPVlwiLFxuICAgIFwiQlJMXCIsXG4gICAgXCJCU0RcIixcbiAgICBcIkJUTlwiLFxuICAgIFwiQldQXCIsXG4gICAgXCJCWU5cIixcbiAgICBcIkJaRFwiLFxuICAgIFwiQ0FEXCIsXG4gICAgXCJDREZcIixcbiAgICBcIkNIRVwiLFxuICAgIFwiQ0hGXCIsXG4gICAgXCJDSFdcIixcbiAgICBcIkNMRlwiLFxuICAgIFwiQ0xQXCIsXG4gICAgXCJDTllcIixcbiAgICBcIkNPUFwiLFxuICAgIFwiQ09VXCIsXG4gICAgXCJDUkNcIixcbiAgICBcIkNVQ1wiLFxuICAgIFwiQ1VQXCIsXG4gICAgXCJDVkVcIixcbiAgICBcIkNaS1wiLFxuICAgIFwiREpGXCIsXG4gICAgXCJES0tcIixcbiAgICBcIkRPUFwiLFxuICAgIFwiRFpEXCIsXG4gICAgXCJFR1BcIixcbiAgICBcIkVSTlwiLFxuICAgIFwiRVRCXCIsXG4gICAgXCJFVVJcIixcbiAgICBcIkZKRFwiLFxuICAgIFwiRktQXCIsXG4gICAgXCJHQlBcIixcbiAgICBcIkdFTFwiLFxuICAgIFwiR0hTXCIsXG4gICAgXCJHSVBcIixcbiAgICBcIkdNRFwiLFxuICAgIFwiR05GXCIsXG4gICAgXCJHVFFcIixcbiAgICBcIkdZRFwiLFxuICAgIFwiSEtEXCIsXG4gICAgXCJITkxcIixcbiAgICBcIkhSS1wiLFxuICAgIFwiSFRHXCIsXG4gICAgXCJIVUZcIixcbiAgICBcIklEUlwiLFxuICAgIFwiSUxTXCIsXG4gICAgXCJJTlJcIixcbiAgICBcIklRRFwiLFxuICAgIFwiSVJSXCIsXG4gICAgXCJJU0tcIixcbiAgICBcIkpNRFwiLFxuICAgIFwiSk9EXCIsXG4gICAgXCJKUFlcIixcbiAgICBcIktFU1wiLFxuICAgIFwiS0dTXCIsXG4gICAgXCJLSFJcIixcbiAgICBcIktNRlwiLFxuICAgIFwiS1BXXCIsXG4gICAgXCJLUldcIixcbiAgICBcIktXRFwiLFxuICAgIFwiS1lEXCIsXG4gICAgXCJLWlRcIixcbiAgICBcIkxBS1wiLFxuICAgIFwiTEJQXCIsXG4gICAgXCJMS1JcIixcbiAgICBcIkxSRFwiLFxuICAgIFwiTFNMXCIsXG4gICAgXCJMWURcIixcbiAgICBcIk1BRFwiLFxuICAgIFwiTURMXCIsXG4gICAgXCJNR0FcIixcbiAgICBcIk1LRFwiLFxuICAgIFwiTU1LXCIsXG4gICAgXCJNTlRcIixcbiAgICBcIk1PUFwiLFxuICAgIFwiTVJPXCIsXG4gICAgXCJNVVJcIixcbiAgICBcIk1WUlwiLFxuICAgIFwiTVdLXCIsXG4gICAgXCJNWE5cIixcbiAgICBcIk1YVlwiLFxuICAgIFwiTVlSXCIsXG4gICAgXCJNWk5cIixcbiAgICBcIk5BRFwiLFxuICAgIFwiTkdOXCIsXG4gICAgXCJOSU9cIixcbiAgICBcIk5PS1wiLFxuICAgIFwiTlBSXCIsXG4gICAgXCJOWkRcIixcbiAgICBcIk9NUlwiLFxuICAgIFwiUEFCXCIsXG4gICAgXCJQRU5cIixcbiAgICBcIlBHS1wiLFxuICAgIFwiUEhQXCIsXG4gICAgXCJQS1JcIixcbiAgICBcIlBMTlwiLFxuICAgIFwiUFlHXCIsXG4gICAgXCJRQVJcIixcbiAgICBcIlJPTlwiLFxuICAgIFwiUlNEXCIsXG4gICAgXCJSVUJcIixcbiAgICBcIlJXRlwiLFxuICAgIFwiU0FSXCIsXG4gICAgXCJTQkRcIixcbiAgICBcIlNDUlwiLFxuICAgIFwiU0RHXCIsXG4gICAgXCJTRUtcIixcbiAgICBcIlNHRFwiLFxuICAgIFwiU0hQXCIsXG4gICAgXCJTTExcIixcbiAgICBcIlNPU1wiLFxuICAgIFwiU1JEXCIsXG4gICAgXCJTU1BcIixcbiAgICBcIlNURFwiLFxuICAgIFwiU1ZDXCIsXG4gICAgXCJTWVBcIixcbiAgICBcIlNaTFwiLFxuICAgIFwiVEhCXCIsXG4gICAgXCJUSlNcIixcbiAgICBcIlRNVFwiLFxuICAgIFwiVE5EXCIsXG4gICAgXCJUT1BcIixcbiAgICBcIlRSWVwiLFxuICAgIFwiVFREXCIsXG4gICAgXCJUV0RcIixcbiAgICBcIlRaU1wiLFxuICAgIFwiVUFIXCIsXG4gICAgXCJVR1hcIixcbiAgICBcIlVTRFwiLFxuICAgIFwiVVNOXCIsXG4gICAgXCJVWUlcIixcbiAgICBcIlVZVVwiLFxuICAgIFwiVVpTXCIsXG4gICAgXCJWRUZcIixcbiAgICBcIlZORFwiLFxuICAgIFwiVlVWXCIsXG4gICAgXCJXU1RcIixcbiAgICBcIlhBRlwiLFxuICAgIFwiWEFHXCIsXG4gICAgXCJYQVVcIixcbiAgICBcIlhCQVwiLFxuICAgIFwiWEJCXCIsXG4gICAgXCJYQkNcIixcbiAgICBcIlhCRFwiLFxuICAgIFwiWENEXCIsXG4gICAgXCJYRFJcIixcbiAgICBcIlhPRlwiLFxuICAgIFwiWFBEXCIsXG4gICAgXCJYUEZcIixcbiAgICBcIlhQVFwiLFxuICAgIFwiWFNVXCIsXG4gICAgXCJYVFNcIixcbiAgICBcIlhVQVwiLFxuICAgIFwiWFhYXCIsXG4gICAgXCJZRVJcIixcbiAgICBcIlpBUlwiLFxuICAgIFwiWk1XXCIsXG4gICAgXCJaV0xcIixcbiAgXTtcbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJleHByZXNzaW9uXCIsXG4gIFtcbiAgICBcImV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgIHsgbmFtZTogXCJmb3JtYXRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0Zvcm1hdFwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJkaXNwbGF5U3R5bGVcIixcbiAgICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcImRlY2ltYWxcIiwgXCJjdXJyZW5jeVwiLCBcInBlcmNlbnRcIiwgXCJkYXRlXCJdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjdXJyZW5jeVwiLFxuICAgICAgY2hvaWNlczogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0Q3VycmVjeUNvZGVzKCk7XG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogXCJVU0RcIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJtYXhpbXVtRnJhY3Rpb25EaWdpdHM6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAgeyBuYW1lOiBcIm1pbmltdW1GcmFjdGlvbkRpZ2l0czpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwidXNlR3JvdXBpbmc6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImVuYWJsZUlmXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImlzUmVxdWlyZWRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicmVhZE9ubHlcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidmFsaWRhdG9yc1wiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJkZWZhdWx0VmFsdWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiY29ycmVjdEFuc3dlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJyZXF1aXJlZElmXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZXhwcmVzc2lvblwiLCAobmFtZSkgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsKG5hbWUpO1xufSk7XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBFdmVudEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBVcGxvYWRpbmdGaWxlRXJyb3IsIEV4Y2VlZFNpemVFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgZmlsZSBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25GaWxlTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIHByaXZhdGUgaXNVcGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBhZnRlciBxdWVzdGlvbiBzdGF0ZSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHF1ZXN0aW9uIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnN0YXRlIG5ldyBxdWVzdGlvbiBzdGF0ZSB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBvblN0YXRlQ2hhbmdlZDogRXZlbnRCYXNlPFF1ZXN0aW9uRmlsZU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgUXVlc3Rpb25GaWxlTW9kZWxcbiAgPigpO1xuICBwdWJsaWMgcHJldmlld1ZhbHVlOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgY3VycmVudFN0YXRlID0gXCJlbXB0eVwiO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZpbGVcIjtcbiAgfVxuICBwdWJsaWMgY2xlYXJPbkRlbGV0aW5nQ29udGFpbmVyKCkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5jbGVhckZpbGVzKHRoaXMsIHRoaXMubmFtZSwgdGhpcy52YWx1ZSwgbnVsbCwgKCkgPT4ge30pO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSwgdG8gc2hvdyB0aGUgcHJldmlldyBmb3IgdGhlIGltYWdlIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UHJldmlldygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1ByZXZpZXdcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UHJldmlldyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldmlld1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSwgdG8gYWxsb3cgc2VsZWN0IG11bHRpcGxlIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd011bHRpcGxlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd011bHRpcGxlXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93TXVsdGlwbGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dNdWx0aXBsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgaGVpZ2h0LlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZUhlaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZUhlaWdodFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlSGVpZ2h0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VIZWlnaHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGltYWdlIHdpZHRoLlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZVdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlV2lkdGhcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZVdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBY2NlcHRlZCBmaWxlIHR5cGVzLiBQYXNzZWQgdG8gdGhlICdhY2NlcHQnIGF0dHJpYnV0ZSBvZiB0aGUgZmlsZSBpbnB1dCB0YWcuIFNlZSBodHRwczovL3d3dy53M3NjaG9vbHMuY29tL3RhZ3MvYXR0X2lucHV0X2FjY2VwdC5hc3AgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWNjZXB0ZWRUeXBlcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhY2NlcHRlZFR5cGVzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWNjZXB0ZWRUeXBlcyh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFjY2VwdGVkVHlwZXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzZXJpYWxpemUgZmlsZSBjb250ZW50IGFzIHRleHQgaW4gdGhlIHN1cnZleS5kYXRhLlxuICAgKiBJbiB0aGlzIGNhc2UsIHlvdSBoYXZlIHRvIHdyaXRlIHRoZSBjb2RlIG9uVXBsb2FkRmlsZXMgZXZlbnQgdG8gc3RvcmUgdGhlIGZpbGUgY29udGVudC5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5vblVwbG9hZEZpbGVzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0b3JlRGF0YUFzVGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RvcmVEYXRhQXNUZXh0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RvcmVEYXRhQXNUZXh0KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlRGF0YUFzVGV4dFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byB3YWl0IHVudGlsIGZpbGVzIHdpbGwgYmUgdXBsb2FkZWQgdG8geW91ciBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdhaXRGb3JVcGxvYWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIndhaXRGb3JVcGxvYWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgd2FpdEZvclVwbG9hZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ3YWl0Rm9yVXBsb2FkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGltYWdlcyBwcmV2aWV3LlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0ltYWdlc1ByZXZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93SW1hZ2VzUHJldmlld1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93SW1hZ2VzUHJldmlldyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0ltYWdlc1ByZXZpZXdcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0dXAgdGhlIG1heGltdW0gYWxsb3dlZCBmaWxlIHNpemUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4U2l6ZVwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFNpemUodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhTaXplXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldHVwIGNvbmZpcm1hdGlvbiB0byByZW1vdmUgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbmVlZENvbmZpcm1SZW1vdmVGaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuZWVkQ29uZmlybVJlbW92ZUZpbGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBuZWVkQ29uZmlybVJlbW92ZUZpbGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibmVlZENvbmZpcm1SZW1vdmVGaWxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSByZW1vdmUgZmlsZSBjb25maXJtYXRpb24gbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyBnZXRDb25maXJtUmVtb3ZlTWVzc2FnZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAuZ2V0U3RyaW5nKFwiY29uZmlybVJlbW92ZUZpbGVcIilcbiAgICAgIFtcImZvcm1hdFwiXShmaWxlTmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSByZW1vdmUgYWxsIGZpbGVzIGNvbmZpcm1hdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgZ2V0IGNvbmZpcm1SZW1vdmVBbGxNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjb25maXJtUmVtb3ZlQWxsRmlsZXNcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBubyBmaWxlIGNob3NlbiBjYXB0aW9uIGZvciBtb2Rlcm4gdGhlbWUuXG4gICAqL1xuICBnZXQgbm9GaWxlQ2hvc2VuQ2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9GaWxlQ2hvc2VuXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY2hvb3NlIGZpbGVzIGJ1dHRvbiBjYXB0aW9uIGZvciBtb2Rlcm4gdGhlbWUuXG4gICAqL1xuICBnZXQgY2hvb3NlQnV0dG9uQ2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hvb3NlRmlsZUNhcHRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjbGVhbiBmaWxlcyBidXR0b24gY2FwdGlvbi5cbiAgICovXG4gIGdldCBjbGVhbkJ1dHRvbkNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNsZWFuQ2FwdGlvblwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHJlbW92ZSBmaWxlIGJ1dHRvbiBjYXB0aW9uLlxuICAgKi9cbiAgZ2V0IHJlbW92ZUZpbGVDYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZW1vdmVGaWxlQ2FwdGlvblwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGlucHV0IHRpdGxlIHZhbHVlLlxuICAgKi9cbiAgZ2V0IGlucHV0VGl0bGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc1VwbG9hZGluZykgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJsb2FkaW5nRmlsZVwiKTtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hvb3NlRmlsZVwiKTtcbiAgICByZXR1cm4gXCIgXCI7XG4gIH1cbiAgLyoqXG4gICAqIENsZWFyIHZhbHVlIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoZG9uZUNhbGxiYWNrPzogKCkgPT4gdm9pZCkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5jbGVhckZpbGVzKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIHRoaXMudmFsdWUsXG4gICAgICBudWxsLFxuICAgICAgKHN0YXR1cywgZGF0YSkgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgICAhIWRvbmVDYWxsYmFjayAmJiBkb25lQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSBmaWxlIGl0ZW0gcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVGaWxlKGNvbnRlbnQ6IHsgbmFtZTogc3RyaW5nIH0pIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm47XG4gICAgdGhpcy5zdXJ2ZXkuY2xlYXJGaWxlcyhcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLm5hbWUsXG4gICAgICB0aGlzLnZhbHVlLFxuICAgICAgY29udGVudC5uYW1lLFxuICAgICAgKHN0YXR1cywgZGF0YSkgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2xkVmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gb2xkVmFsdWUuZmlsdGVyKChmKSA9PiBmLm5hbWUgIT09IGNvbnRlbnQubmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogTG9hZCBtdWx0aXBsZSBmaWxlcyBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKiBAcGFyYW0gZmlsZXNcbiAgICovXG4gIHB1YmxpYyBsb2FkRmlsZXMoZmlsZXM6IEZpbGVbXSkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICBpZiAoIXRoaXMuYWxsRmlsZXNPayhmaWxlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRpbmdcIik7XG5cbiAgICB2YXIgbG9hZEZpbGVzUHJvYyA9ICgpID0+IHtcbiAgICAgIHZhciBjb250ZW50ID0gPEFycmF5PGFueT4+W107XG4gICAgICBpZiAodGhpcy5zdG9yZURhdGFBc1RleHQpIHtcbiAgICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgIGxldCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7XG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5jb25jYXQoW1xuICAgICAgICAgICAgICB7IG5hbWU6IGZpbGUubmFtZSwgdHlwZTogZmlsZS50eXBlLCBjb250ZW50OiBmaWxlUmVhZGVyLnJlc3VsdCB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPT09IGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gKHRoaXMudmFsdWUgfHwgW10pLmNvbmNhdChjb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgICB0aGlzLnN1cnZleS51cGxvYWRGaWxlcyh0aGlzLCB0aGlzLm5hbWUsIGZpbGVzLCAoc3RhdHVzLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJlcnJvclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgIHRoaXMudmFsdWUgPSAodGhpcy52YWx1ZSB8fCBbXSkuY29uY2F0KFxuICAgICAgICAgICAgICAgIGRhdGEubWFwKChyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHIuZmlsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiByLmZpbGUudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogci5jb250ZW50LFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodGhpcy5hbGxvd011bHRpcGxlKSB7XG4gICAgICBsb2FkRmlsZXNQcm9jKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXIobG9hZEZpbGVzUHJvYyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjYW5QcmV2aWV3SW1hZ2UoZmlsZUl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFsbG93SW1hZ2VzUHJldmlldyAmJiAhIWZpbGVJdGVtICYmIHRoaXMuaXNGaWxlSW1hZ2UoZmlsZUl0ZW0pO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnksIHVwZGF0ZUlzQW5zd2VyZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSwgdXBkYXRlSXNBbnN3ZXJlZCk7XG4gICAgdGhpcy5wcmV2aWV3VmFsdWUgPSBbXTtcbiAgICB2YXIgc3RhdGUgPVxuICAgICAgKCFBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSAmJiAhIW5ld1ZhbHVlKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmIG5ld1ZhbHVlLmxlbmd0aCA+IDApXG4gICAgICAgID8gdGhpcy5zaG93UHJldmlld1xuICAgICAgICAgID8gXCJsb2FkaW5nXCJcbiAgICAgICAgICA6IFwibG9hZGVkXCJcbiAgICAgICAgOiBcImVtcHR5XCI7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoc3RhdGUpO1xuICAgIGlmICghdGhpcy5zaG93UHJldmlldyB8fCAhbmV3VmFsdWUpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShuZXdWYWx1ZSlcbiAgICAgID8gbmV3VmFsdWVcbiAgICAgIDogISFuZXdWYWx1ZVxuICAgICAgPyBbbmV3VmFsdWVdXG4gICAgICA6IFtdO1xuXG4gICAgaWYgKHRoaXMuc3RvcmVEYXRhQXNUZXh0KSB7XG4gICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSB2YWx1ZS5jb250ZW50IHx8IHZhbHVlO1xuICAgICAgICB0aGlzLnByZXZpZXdWYWx1ZSA9IHRoaXMucHJldmlld1ZhbHVlLmNvbmNhdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoc3RhdGUgPT09IFwibG9hZGluZ1wiKSB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRlZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIHZhciBjb250ZW50ID0gdmFsdWUuY29udGVudCB8fCB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICAgICAgdGhpcy5zdXJ2ZXkuZG93bmxvYWRGaWxlKHRoaXMubmFtZSwgdmFsdWUsIChzdGF0dXMsIGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJldmlld1ZhbHVlID0gdGhpcy5wcmV2aWV3VmFsdWUuY29uY2F0KFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50OiBkYXRhLFxuICAgICAgICAgICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnByZXZpZXdWYWx1ZS5sZW5ndGggPT09IG5ld1ZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJlcnJvclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKFxuICAgIGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+LFxuICAgIGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMsIGlzT25WYWx1ZUNoYW5nZWQpO1xuICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nICYmIHRoaXMud2FpdEZvclVwbG9hZCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG5ldyBVcGxvYWRpbmdGaWxlRXJyb3IoXG4gICAgICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInVwbG9hZGluZ0ZpbGVcIiksXG4gICAgICAgICAgdGhpc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc3RhdGVDaGFuZ2VkKHN0YXRlOiBzdHJpbmcpIHtcbiAgICBpZiAoc3RhdGUgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHN0YXRlID09PSBcImxvYWRlZFwiKSB7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICB0aGlzLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlZC5maXJlKHRoaXMsIHsgc3RhdGU6IHN0YXRlIH0pO1xuICB9XG4gIHByaXZhdGUgYWxsRmlsZXNPayhmaWxlczogRmlsZVtdKTogYm9vbGVhbiB7XG4gICAgdmFyIGVycm9yTGVuZ3RoID0gdGhpcy5lcnJvcnMgPyB0aGlzLmVycm9ycy5sZW5ndGggOiAwO1xuICAgIChmaWxlcyB8fCBbXSkuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgaWYgKHRoaXMubWF4U2l6ZSA+IDAgJiYgZmlsZS5zaXplID4gdGhpcy5tYXhTaXplKSB7XG4gICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IEV4Y2VlZFNpemVFcnJvcih0aGlzLm1heFNpemUsIHRoaXMpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZXJyb3JMZW5ndGggPT09IHRoaXMuZXJyb3JzLmxlbmd0aDtcbiAgfVxuICBwcml2YXRlIGlzRmlsZUltYWdlKGZpbGU6IHtcbiAgICBjb250ZW50OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICB0eXBlPzogc3RyaW5nO1xuICB9KTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWxlKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgaW1hZ2VQcmVmaXggPSBcImRhdGE6aW1hZ2VcIjtcbiAgICB2YXIgc3ViU3RyID0gZmlsZS5jb250ZW50ICYmIGZpbGUuY29udGVudC5zdWJzdHIoMCwgaW1hZ2VQcmVmaXgubGVuZ3RoKTtcbiAgICBzdWJTdHIgPSBzdWJTdHIgJiYgc3ViU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlc3VsdCA9XG4gICAgICBzdWJTdHIgPT09IGltYWdlUHJlZml4IHx8XG4gICAgICAoISFmaWxlLnR5cGUgJiYgZmlsZS50eXBlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImltYWdlL1wiKSA9PT0gMCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgZ2V0UGxhaW5EYXRhKFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGluY2x1ZGVFbXB0eT86IGJvb2xlYW47XG4gICAgICBjYWxjdWxhdGlvbnM/OiBBcnJheTx7XG4gICAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgfSA9IHtcbiAgICAgIGluY2x1ZGVFbXB0eTogdHJ1ZSxcbiAgICB9XG4gICkge1xuICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IHN1cGVyLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICBpZiAoISFxdWVzdGlvblBsYWluRGF0YSAmJiAhdGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IGZhbHNlO1xuICAgICAgdmFyIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlIDogW3RoaXMudmFsdWVdO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IHZhbHVlcy5tYXAoKGRhdGFWYWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBpbmRleCxcbiAgICAgICAgICB0aXRsZTogXCJGaWxlXCIsXG4gICAgICAgICAgdmFsdWU6IChkYXRhVmFsdWUuY29udGVudCAmJiBkYXRhVmFsdWUuY29udGVudCkgfHwgZGF0YVZhbHVlLFxuICAgICAgICAgIGRpc3BsYXlWYWx1ZTogKGRhdGFWYWx1ZS5uYW1lICYmIGRhdGFWYWx1ZS5uYW1lKSB8fCBkYXRhVmFsdWUsXG4gICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiID8gSlNPTi5zdHJpbmdpZnkodmFsKSA6IHZhbCxcbiAgICAgICAgICBpc05vZGU6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBxdWVzdGlvblBsYWluRGF0YTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiZmlsZVwiLFxuICBbXG4gICAgeyBuYW1lOiBcImhhc0NvbW1lbnQ6c3dpdGNoXCIsIGxheW91dDogXCJyb3dcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29tbWVudFRleHRcIixcbiAgICAgIGRlcGVuZHNPbjogXCJoYXNDb21tZW50XCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBvYmouaGFzQ29tbWVudDtcbiAgICAgIH0sXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tbWVudFRleHRcIixcbiAgICAgIGxheW91dDogXCJyb3dcIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJzaG93UHJldmlldzpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBcImFsbG93TXVsdGlwbGU6Ym9vbGVhblwiLFxuICAgIHsgbmFtZTogXCJhbGxvd0ltYWdlc1ByZXZpZXc6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgXCJpbWFnZUhlaWdodFwiLFxuICAgIFwiaW1hZ2VXaWR0aFwiLFxuICAgIFwiYWNjZXB0ZWRUeXBlc1wiLFxuICAgIHsgbmFtZTogXCJzdG9yZURhdGFBc1RleHQ6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcIndhaXRGb3JVcGxvYWQ6Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIFwibWF4U2l6ZTpudW1iZXJcIixcbiAgICB7IG5hbWU6IFwiZGVmYXVsdFZhbHVlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImNvcnJlY3RBbnN3ZXJcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidmFsaWRhdG9yc1wiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJuZWVkQ29uZmlybVJlbW92ZUZpbGU6Ym9vbGVhblwiLCB2aXNpYmxlOiB0cnVlLCBkZWZhdWx0OiBmYWxzZSB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRmlsZU1vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImZpbGVcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkZpbGVNb2RlbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb25Ob25WYWx1ZSB9IGZyb20gXCIuL3F1ZXN0aW9ubm9udmFsdWVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBodG1sIHF1ZXN0aW9uLiBVbmxpa2Ugb3RoZXIgcXVlc3Rpb25zIGl0IGRvZXNuJ3QgaGF2ZSB2YWx1ZSBhbmQgdGl0bGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkh0bWxNb2RlbCBleHRlbmRzIFF1ZXN0aW9uTm9uVmFsdWUge1xuICBwdWJsaWMgaWdub3JlSHRtbFByb2dyZXNzaW5nOiBib29sZWFuO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgbG9jSHRtbCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJodG1sXCIsIHRoaXMpO1xuICAgIGxvY0h0bWwub25HZXRUZXh0Q2FsbGJhY2sgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgJiYgIXRoaXMuaWdub3JlSHRtbFByb2dyZXNzaW5nXG4gICAgICAgID8gdGhpcy5zdXJ2ZXkucHJvY2Vzc0h0bWwoc3RyKVxuICAgICAgICA6IHN0cjtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiaHRtbFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDb21wb3NpdGVRdWVzdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlnbm9yZUh0bWxQcm9ncmVzc2luZykgcmV0dXJuIHRleHQ7XG4gICAgcmV0dXJuIHN1cGVyLmdldFByb2Nlc3NlZFRleHQodGV4dCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBodG1sIHRvIGRpc3BsYXkgaXRcbiAgICovXG4gIHB1YmxpYyBnZXQgaHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImh0bWxcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBodG1sKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJodG1sXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0h0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZEh0bWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucHJvY2Vzc0h0bWwodGhpcy5odG1sKSA6IHRoaXMuaHRtbDtcbiAgfVxufVxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJodG1sXCIsXG4gIFt7IG5hbWU6IFwiaHRtbDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NIdG1sXCIgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25IdG1sTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwibm9udmFsdWVcIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaHRtbFwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkh0bWxNb2RlbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb25Ob25WYWx1ZSB9IGZyb20gXCIuL3F1ZXN0aW9ubm9udmFsdWVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBpbWFnZSBxdWVzdGlvbi4gVGhpcyBxdWVzdGlvbiBoYXNuJ3QgYW55IGZ1bmN0aW9uYWxpdHkgYW5kIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHN1cnZleS5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uSW1hZ2VNb2RlbCBleHRlbmRzIFF1ZXN0aW9uTm9uVmFsdWUge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiaW1hZ2VMaW5rXCIsIHRoaXMsIGZhbHNlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidGV4dFwiLCB0aGlzLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJpbWFnZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDb21wb3NpdGVRdWVzdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBVUkwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlTGluaygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImltYWdlTGlua1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlTGluayh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiaW1hZ2VMaW5rXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0ltYWdlTGluaygpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJpbWFnZUxpbmtcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBhbHQgdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCB0ZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0ZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGltYWdlIGhlaWdodC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VIZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VIZWlnaHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUhlaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB3aWR0aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGltYWdlIGZpdCBtb2RlLlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZUZpdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZUZpdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlRml0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VGaXRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgbW9kZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29udGVudE1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29udGVudE1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb250ZW50TW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbnRlbnRNb2RlXCIsIHZhbCk7XG4gICAgaWYgKHZhbCA9PT0gXCJ2aWRlb1wiKSB7XG4gICAgICB0aGlzLnNob3dMYWJlbCA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiaW1hZ2VcIixcbiAgW1xuICAgIHsgbmFtZTogXCJpbWFnZUxpbmtcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0ltYWdlTGlua1wiIH0sXG4gICAgeyBuYW1lOiBcInRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RleHRcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29udGVudE1vZGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiaW1hZ2VcIixcbiAgICAgIGNob2ljZXM6IFtcImltYWdlXCIsIFwidmlkZW9cIl0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImltYWdlRml0XCIsXG4gICAgICBkZWZhdWx0OiBcImNvbnRhaW5cIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJjb250YWluXCIsIFwiY292ZXJcIiwgXCJmaWxsXCJdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImltYWdlSGVpZ2h0Om51bWJlclwiLCBkZWZhdWx0OiAxNTAsIG1pblZhbHVlOiAwIH0sXG4gICAgeyBuYW1lOiBcImltYWdlV2lkdGg6bnVtYmVyXCIsIGRlZmF1bHQ6IDIwMCwgbWluVmFsdWU6IDAgfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25JbWFnZU1vZGVsKFwiXCIpO1xuICB9LFxuICBcIm5vbnZhbHVlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaW1hZ2VcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkltYWdlTW9kZWwobmFtZSk7XG59KTtcbiIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuZXhwb3J0IGNsYXNzIEltYWdlSXRlbVZhbHVlIGV4dGVuZHMgSXRlbVZhbHVlIGltcGxlbWVudHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICB2YWx1ZTogYW55LFxuICAgIHRleHQ6IHN0cmluZyA9IG51bGwsXG4gICAgcHJvdGVjdGVkIHR5cGVOYW1lID0gXCJpbWFnZWl0ZW12YWx1ZVwiXG4gICkge1xuICAgIHN1cGVyKHZhbHVlLCB0ZXh0LCB0eXBlTmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImltYWdlTGlua1wiLCB0aGlzLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLnR5cGVOYW1lID8gdGhpcy50eXBlTmFtZSA6IFwiaXRlbXZhbHVlXCI7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBvciB2aWRlbyBsaW5rIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZUxpbmsoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJpbWFnZUxpbmtcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUxpbmsodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImltYWdlTGlua1wiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NJbWFnZUxpbmsoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiaW1hZ2VMaW5rXCIpO1xuICB9XG4gIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldE1hcmtkb3duSHRtbCh0ZXh0LCBuYW1lKSA6IHRleHQ7XG4gIH1cbiAgZ2V0UmVuZGVyZXIobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRSZW5kZXJlcihuYW1lKSA6IG51bGw7XG4gIH1cbiAgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldFByb2Nlc3NlZFRleHQodGV4dCkgOiB0ZXh0O1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBzZWxlY3QgaW1hZ2UgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZSB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY29sQ291bnQgPSAwO1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsLmNyZWF0ZUl0ZW1WYWx1ZSA9ICh2YWx1ZTogYW55KSA9PlxuICAgICAgbmV3IEltYWdlSXRlbVZhbHVlKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImltYWdlcGlja2VyXCI7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBoYXNTaW5nbGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1WYWx1ZVR5cGUoKSB7XG4gICAgcmV0dXJuIFwiaW1hZ2VpdGVtdmFsdWVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ29tcG9zaXRlUXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHN1cHBvcnROb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogTXVsdGkgc2VsZWN0IG9wdGlvbi4gSWYgc2V0IHRvIHRydWUsIHRoZW4gYWxsb3dzIHRvIHNlbGVjdCBtdWx0aXBsZSBpbWFnZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG11bHRpU2VsZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtdWx0aVNlbGVjdFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBtdWx0aVNlbGVjdChuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm11bHRpU2VsZWN0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGl0ZW0gaXMgY2hlY2tlZFxuICAgKiBAcGFyYW0gaXRlbSBpbWFnZSBwaWNrZXIgaXRlbSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGlzSXRlbVNlbGVjdGVkKGl0ZW06IEl0ZW1WYWx1ZSk6IGJvb2xlYW4ge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLm11bHRpU2VsZWN0KSByZXR1cm4gSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHZhbCwgaXRlbS52YWx1ZSk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh2YWxbaV0sIGl0ZW0udmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBpZiAodGhpcy5tdWx0aVNlbGVjdCkge1xuICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAoIXZhbCkgcmV0dXJuO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkgfHwgdmFsLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNVbmtub3duVmFsdWUodmFsW2ldLCB0cnVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlLnB1c2godmFsW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PSB2YWwubGVuZ3RoKSByZXR1cm47XG4gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgbGFiZWwgdW5kZXIgdGhlIGltYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TGFiZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dMYWJlbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93TGFiZWwobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93TGFiZWxcIiwgbmV3VmFsdWUpO1xuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICBpZiAoIXRoaXMuaXNEZXNpZ25Nb2RlICYmIHRoaXMubXVsdGlTZWxlY3QpIHtcbiAgICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJyZW5kZXJlZFZhbHVlXCIpO1xuICAgICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInZhbHVlXCIpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVDb3JlKCkge1xuICAgIHZhciB2YWx1ZSA9IHN1cGVyLmdldFZhbHVlQ29yZSgpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLm11bHRpU2VsZWN0KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIGNvbnZlcnRWYWxUb0FycmF5Rm9yTXVsdFNlbGVjdCh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKCF0aGlzLm11bHRpU2VsZWN0KSByZXR1cm4gdmFsO1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWwpIHx8IEFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gW3ZhbF07XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlcmVkVmFsdWVGcm9tRGF0YUNvcmUodmFsOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnRWYWxUb0FycmF5Rm9yTXVsdFNlbGVjdCh2YWwpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kcmVkVmFsdWVUb0RhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsVG9BcnJheUZvck11bHRTZWxlY3QodmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGltYWdlIGhlaWdodC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VIZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VIZWlnaHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUhlaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB3aWR0aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGltYWdlIGZpdCBtb2RlLlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZUZpdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZUZpdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlRml0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VGaXRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgbW9kZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29udGVudE1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29udGVudE1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb250ZW50TW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbnRlbnRNb2RlXCIsIHZhbCk7XG4gICAgaWYgKHZhbCA9PT0gXCJ2aWRlb1wiKSB7XG4gICAgICB0aGlzLnNob3dMYWJlbCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjb252ZXJ0RGVmYXVsdFZhbHVlKHZhbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJpbWFnZWl0ZW12YWx1ZVwiLFxuICBbXSxcbiAgKHZhbHVlOiBhbnkpID0+IG5ldyBJbWFnZUl0ZW1WYWx1ZSh2YWx1ZSksXG4gIFwiaXRlbXZhbHVlXCJcbik7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KFwiaW1hZ2VpdGVtdmFsdWVcIiwge1xuICBuYW1lOiBcImltYWdlTGlua1wiLFxuICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jSW1hZ2VMaW5rXCIsXG59KTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJpbWFnZXBpY2tlclwiLFxuICBbXG4gICAgeyBuYW1lOiBcImhhc090aGVyXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcIm90aGVyVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJoYXNOb25lXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcIm5vbmVUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcIm9wdGlvbnNDYXB0aW9uXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcIm90aGVyRXJyb3JUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb250ZW50TW9kZVwiLFxuICAgICAgZGVmYXVsdDogXCJpbWFnZVwiLFxuICAgICAgY2hvaWNlczogW1wiaW1hZ2VcIiwgXCJ2aWRlb1wiXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiaW1hZ2VGaXRcIixcbiAgICAgIGRlZmF1bHQ6IFwiY29udGFpblwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcImNvbnRhaW5cIiwgXCJjb3ZlclwiLCBcImZpbGxcIl0sXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiaW1hZ2VIZWlnaHQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDE1MCwgbWluVmFsdWU6IDAgfSxcbiAgICB7IG5hbWU6IFwiaW1hZ2VXaWR0aDpudW1iZXJcIiwgZGVmYXVsdDogMjAwLCBtaW5WYWx1ZTogMCB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJjaGVja2JveGJhc2VcIlxuKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoXCJpbWFnZXBpY2tlclwiLCB7XG4gIG5hbWU6IFwic2hvd0xhYmVsOmJvb2xlYW5cIixcbiAgZGVmYXVsdDogZmFsc2UsXG59KTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoXCJpbWFnZXBpY2tlclwiLCB7XG4gIG5hbWU6IFwiY29sQ291bnQ6bnVtYmVyXCIsXG4gIGRlZmF1bHQ6IDAsXG4gIGNob2ljZXM6IFswLCAxLCAyLCAzLCA0LCA1XSxcbn0pO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eShcImltYWdlcGlja2VyXCIsIHtcbiAgbmFtZTogXCJtdWx0aVNlbGVjdDpib29sZWFuXCIsXG4gIGRlZmF1bHQ6IGZhbHNlLFxufSk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KFwiaW1hZ2VwaWNrZXJcIiwge1xuICBuYW1lOiBcImNob2ljZXM6aW1hZ2VpdGVtdmFsdWVbXVwiLFxufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaW1hZ2VwaWNrZXJcIiwgKG5hbWUpID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsKG5hbWUpO1xuICAvL3EuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcbiIsImltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsIH0gZnJvbSBcIi4vbWFydGl4QmFzZVwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgUmVxdWlyZWRJbkFsbFJvd3NFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nLCBJTG9jYWxpemFibGVPd25lciB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgfSBmcm9tIFwiLi9xdWVzdGlvbl9kcm9wZG93blwiO1xuaW1wb3J0IHsgSUNvbmRpdGlvbk9iamVjdCB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuL3N1cnZleVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhEYXRhIHtcbiAgb25NYXRyaXhSb3dDaGFuZ2VkKHJvdzogTWF0cml4Um93TW9kZWwpOiB2b2lkO1xuICBnZXRDb3JyZWN0ZWRSb3dWYWx1ZSh2YWx1ZTogYW55KTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4Um93TW9kZWwgZXh0ZW5kcyBCYXNlIHtcbiAgcHJpdmF0ZSBkYXRhOiBJTWF0cml4RGF0YTtcbiAgcHJpdmF0ZSBpdGVtOiBJdGVtVmFsdWU7XG4gIHB1YmxpYyBjZWxsQ2xpY2s6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgcHVibGljIGZ1bGxOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogSU1hdHJpeERhdGEsXG4gICAgdmFsdWU6IGFueVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaXRlbSA9IGl0ZW07XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5jZWxsQ2xpY2sgPSAoY29sdW1uOiBhbnkpID0+IHtcbiAgICAgIHRoaXMudmFsdWUgPSBjb2x1bW4udmFsdWU7XG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwidmFsdWVcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGF0YSkgdGhpcy5kYXRhLm9uTWF0cml4Um93Q2hhbmdlZCh0aGlzKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0udGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0ubG9jVGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBuZXdWYWx1ZSA9IHRoaXMuZGF0YS5nZXRDb3JyZWN0ZWRSb3dWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgcm93Q2xhc3NlcygpOiBzdHJpbmcge1xuICAgIHZhciBjc3NDbGFzc2VzID0gKDxhbnk+dGhpcy5kYXRhKS5jc3NDbGFzc2VzO1xuICAgIHZhciByb3dDbGFzcyA9ICEhY3NzQ2xhc3Nlcy5yb3cgPyBjc3NDbGFzc2VzLnJvdyA6IFwiXCI7XG4gICAgdmFyIHJvd0Vycm9yQ2xhc3MgPSAhIWNzc0NsYXNzZXMucm93RXJyb3IgPyBjc3NDbGFzc2VzLnJvd0Vycm9yIDogXCJcIjtcbiAgICB2YXIgaGFzRXJyb3IgPSAhISg8YW55PnRoaXMuZGF0YSkuZ2V0RXJyb3JCeVR5cGUoXCJyZXF1aXJlZGluYWxscm93c2Vycm9yXCIpO1xuXG4gICAgdmFyIGNsYXNzZXMgPSByb3dDbGFzcztcbiAgICBpZiAoISFyb3dFcnJvckNsYXNzICYmIGhhc0Vycm9yICYmIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpKSB7XG4gICAgICBpZiAoISFjbGFzc2VzKSBjbGFzc2VzICs9IFwiIFwiO1xuICAgICAgY2xhc3NlcyArPSByb3dFcnJvckNsYXNzO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhDZWxsc093bmVyIGV4dGVuZHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBnZXRSb3dzKCk6IEFycmF5PGFueT47XG4gIGdldENvbHVtbnMoKTogQXJyYXk8YW55Pjtcbn1cblxuZXhwb3J0IGNsYXNzIE1hdHJpeENlbGxzIHtcbiAgcHJpdmF0ZSB2YWx1ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGNlbGxzT3duZXI6IElNYXRyaXhDZWxsc093bmVyKSB7fVxuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKS5sZW5ndGggPT0gMDtcbiAgfVxuICBwdWJsaWMgc2V0Q2VsbFRleHQocm93OiBhbnksIGNvbHVtbjogYW55LCB2YWw6IHN0cmluZykge1xuICAgIHJvdyA9IHRoaXMuZ2V0Q2VsbFJvd0NvbHVtblZhbHVlKHJvdywgdGhpcy5yb3dzKTtcbiAgICBjb2x1bW4gPSB0aGlzLmdldENlbGxSb3dDb2x1bW5WYWx1ZShjb2x1bW4sIHRoaXMuY29sdW1ucyk7XG4gICAgaWYgKCFyb3cgfHwgIWNvbHVtbikgcmV0dXJuO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZXNbcm93XSkgdGhpcy52YWx1ZXNbcm93XSA9IHt9O1xuICAgICAgaWYgKCF0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl0pXG4gICAgICAgIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXSA9IHRoaXMuY3JlYXRlU3RyaW5nKCk7XG4gICAgICB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl0udGV4dCA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMudmFsdWVzW3Jvd10gJiYgdGhpcy52YWx1ZXNbcm93XVtjb2x1bW5dKSB7XG4gICAgICAgIHZhciBsb2MgPSB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl07XG4gICAgICAgIGxvYy50ZXh0ID0gXCJcIjtcbiAgICAgICAgaWYgKGxvYy5pc0VtcHR5KSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy52YWx1ZXNbcm93XSkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlc1tyb3ddO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbjogYW55LCB2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0Q2VsbFRleHQoc2V0dGluZ3MubWF0cml4RGVmYXVsdFJvd05hbWUsIGNvbHVtbiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbExvY1RleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJvdyA9IHRoaXMuZ2V0Q2VsbFJvd0NvbHVtblZhbHVlKHJvdywgdGhpcy5yb3dzKTtcbiAgICBjb2x1bW4gPSB0aGlzLmdldENlbGxSb3dDb2x1bW5WYWx1ZShjb2x1bW4sIHRoaXMuY29sdW1ucyk7XG4gICAgaWYgKCFyb3cgfHwgIWNvbHVtbikgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLnZhbHVlc1tyb3ddKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMudmFsdWVzW3Jvd11bY29sdW1uXSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXTtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdENlbGxMb2NUZXh0KGNvbHVtbjogYW55LCB2YWw6IHN0cmluZyk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDZWxsTG9jVGV4dChzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Um93TmFtZSwgY29sdW1uKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICB2YXIgY2VsbFRleHQgPSB0aGlzLmdldENlbGxMb2NUZXh0KHJvdywgY29sdW1uKTtcbiAgICBpZiAoY2VsbFRleHQgJiYgIWNlbGxUZXh0LmlzRW1wdHkpIHJldHVybiBjZWxsVGV4dDtcbiAgICBjZWxsVGV4dCA9IHRoaXMuZ2V0Q2VsbExvY1RleHQoc2V0dGluZ3MubWF0cml4RGVmYXVsdFJvd05hbWUsIGNvbHVtbik7XG4gICAgaWYgKGNlbGxUZXh0ICYmICFjZWxsVGV4dC5pc0VtcHR5KSByZXR1cm4gY2VsbFRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4gPT0gXCJudW1iZXJcIikge1xuICAgICAgY29sdW1uID1cbiAgICAgICAgY29sdW1uID49IDAgJiYgY29sdW1uIDwgdGhpcy5jb2x1bW5zLmxlbmd0aFxuICAgICAgICAgID8gdGhpcy5jb2x1bW5zW2NvbHVtbl1cbiAgICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmxvY1RleHQpIHJldHVybiBjb2x1bW4ubG9jVGV4dDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbFRleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgbG9jID0gdGhpcy5nZXRDZWxsTG9jVGV4dChyb3csIGNvbHVtbik7XG4gICAgcmV0dXJuIGxvYyA/IGxvYy5jYWxjdWxhdGVkVGV4dCA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRDZWxsVGV4dChjb2x1bW46IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIGxvYyA9IHRoaXMuZ2V0Q2VsbExvY1RleHQoc2V0dGluZ3MubWF0cml4RGVmYXVsdFJvd05hbWUsIGNvbHVtbik7XG4gICAgcmV0dXJuIGxvYyA/IGxvYy5jYWxjdWxhdGVkVGV4dCA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldENlbGxEaXNwbGF5VGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmdldENlbGxEaXNwbGF5TG9jVGV4dChyb3csIGNvbHVtbik7XG4gICAgcmV0dXJuIGxvYyA/IGxvYy5jYWxjdWxhdGVkVGV4dCA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldCByb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNlbGxzT3duZXIgPyB0aGlzLmNlbGxzT3duZXIuZ2V0Um93cygpIDogW107XG4gIH1cbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNlbGxzT3duZXIgPyB0aGlzLmNlbGxzT3duZXIuZ2V0Q29sdW1ucygpIDogW107XG4gIH1cbiAgcHJpdmF0ZSBnZXRDZWxsUm93Q29sdW1uVmFsdWUodmFsOiBhbnksIHZhbHVlczogQXJyYXk8YW55Pik6IGFueSB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID49IHZhbHVlcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgdmFsID0gdmFsdWVzW3ZhbF0udmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWwudmFsdWUpIHJldHVybiB2YWwudmFsdWU7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0SnNvbigpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciByZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIHJvdyBpbiB0aGlzLnZhbHVlcykge1xuICAgICAgdmFyIHJlc1JvdzogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICB2YXIgcm93VmFsdWVzID0gdGhpcy52YWx1ZXNbcm93XTtcbiAgICAgIGZvciAodmFyIGNvbCBpbiByb3dWYWx1ZXMpIHtcbiAgICAgICAgcmVzUm93W2NvbF0gPSByb3dWYWx1ZXNbY29sXS5nZXRKc29uKCk7XG4gICAgICB9XG4gICAgICByZXNbcm93XSA9IHJlc1JvdztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc2V0SnNvbih2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgZm9yICh2YXIgcm93IGluIHZhbHVlKSB7XG4gICAgICBpZiAocm93ID09IFwicG9zXCIpIGNvbnRpbnVlO1xuICAgICAgdmFyIHJvd1ZhbHVlcyA9IHZhbHVlW3Jvd107XG4gICAgICB0aGlzLnZhbHVlc1tyb3ddID0ge307XG4gICAgICBmb3IgKHZhciBjb2wgaW4gcm93VmFsdWVzKSB7XG4gICAgICAgIGlmIChjb2wgPT0gXCJwb3NcIikgY29udGludWU7XG4gICAgICAgIHZhciBsb2MgPSB0aGlzLmNyZWF0ZVN0cmluZygpO1xuICAgICAgICBsb2Muc2V0SnNvbihyb3dWYWx1ZXNbY29sXSk7XG4gICAgICAgIHRoaXMudmFsdWVzW3Jvd11bY29sXSA9IGxvYztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN0cmluZygpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbGl6YWJsZVN0cmluZyh0aGlzLmNlbGxzT3duZXIsIHRydWUpO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBzaW1wbGUgbWF0cml4IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhNb2RlbFxuICBleHRlbmRzIFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsPE1hdHJpeFJvd01vZGVsLCBJdGVtVmFsdWU+XG4gIGltcGxlbWVudHMgSU1hdHJpeERhdGEsIElNYXRyaXhDZWxsc093bmVyIHtcbiAgcHJpdmF0ZSBpc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIHByaXZhdGUgY2VsbHNWYWx1ZTogTWF0cml4Q2VsbHM7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jZWxsc1ZhbHVlID0gbmV3IE1hdHJpeENlbGxzKHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiY29sdW1uc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25Db2x1bW5zQ2hhbmdlZCgpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJyb3dzXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFzZWxmLmZpbHRlckl0ZW1zKCkpIHtcbiAgICAgICAgc2VsZi5vblJvd3NDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImhpZGVJZlJvd3NFbXB0eVwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYudXBkYXRlVmlzaWJpbGl0eUJhc2VkT25Sb3dzKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1NpbmdsZUlucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgaWYgeW91IHdhbnQgYSB1c2VyIHRvIGFuc3dlciBhbGwgcm93cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxSb3dSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNBbGxSb3dSZXF1aXJlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc0FsbFJvd1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzQWxsUm93UmVxdWlyZWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoID4gMDtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmVuZGVyIGl0ZW1zIGluIGEgc3BlY2lmaWMgb3JkZXI6IFwicmFuZG9tXCIgb3IgXCJpbml0aWFsXCIuIERlZmF1bHQgaXMgXCJpbml0aWFsXCIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd3NPcmRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzT3JkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCByb3dzT3JkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB2YWwgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodmFsID09IHRoaXMucm93c09yZGVyKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c09yZGVyXCIsIHZhbCk7XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gaGlkZSB0aGUgcXVlc3Rpb24gaWYgdGhlcmUgaXMgbm8gdmlzaWJsZSByb3dzIGluIHRoZSBtYXRyaXguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhpZGVJZlJvd3NFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZUlmUm93c0VtcHR5XCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhpZGVJZlJvd3NFbXB0eSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJoaWRlSWZSb3dzRW1wdHlcIiwgdmFsKTtcbiAgfVxuICBnZXRSb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJvd3M7XG4gIH1cbiAgZ2V0Q29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgfVxuICBwdWJsaWMgYWRkQ29sdW1uKHZhbHVlOiBhbnksIHRleHQ/OiBzdHJpbmcpOiBJdGVtVmFsdWUge1xuICAgIHZhciBjb2wgPSBuZXcgSXRlbVZhbHVlKHZhbHVlLCB0ZXh0KTtcbiAgICB0aGlzLmNvbHVtbnMucHVzaChjb2wpO1xuICAgIHJldHVybiBjb2w7XG4gIH1cbiAgcHVibGljIGdldEl0ZW1DbGFzcyhyb3c6IGFueSwgY29sdW1uOiBhbnkpIHtcbiAgICB2YXIgaXNDaGVja2VkID0gcm93LnZhbHVlID09IGNvbHVtbi52YWx1ZTtcbiAgICB2YXIgaXNEaXNhYmxlZCA9IHRoaXMuaXNSZWFkT25seTtcbiAgICB2YXIgYWxsb3dIb3ZlciA9ICFpc0NoZWNrZWQgJiYgIWlzRGlzYWJsZWQ7XG4gICAgdmFyIGNlbGxEaXNhYmxlZENsYXNzID0gdGhpcy5oYXNDZWxsVGV4dFxuICAgICAgPyB0aGlzLmNzc0NsYXNzZXMuY2VsbFRleHREaXNhYmxlZFxuICAgICAgOiB0aGlzLmNzc0NsYXNzZXMuaXRlbURpc2FibGVkO1xuXG4gICAgdmFyIGNlbGxTZWxlY3RlZENsYXNzID0gdGhpcy5oYXNDZWxsVGV4dFxuICAgICAgPyB0aGlzLmNzc0NsYXNzZXMuY2VsbFRleHRTZWxlY3RlZFxuICAgICAgOiB0aGlzLmNzc0NsYXNzZXMuaXRlbUNoZWNrZWQ7XG5cbiAgICB2YXIgaXRlbUhvdmVyQ2xhc3MgPSAhdGhpcy5oYXNDZWxsVGV4dCA/IHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSG92ZXIgOiBcIlwiO1xuXG4gICAgdmFyIGNlbGxDbGFzcyA9IHRoaXMuaGFzQ2VsbFRleHRcbiAgICAgID8gdGhpcy5jc3NDbGFzc2VzLmNlbGxUZXh0XG4gICAgICA6IHRoaXMuY3NzQ2xhc3Nlcy5sYWJlbDtcblxuICAgIGxldCBpdGVtQ2xhc3MgPVxuICAgICAgdGhpcy5oYXNDZWxsVGV4dCAmJiAhIXRoaXMuY3NzQ2xhc3Nlcy5jZWxsXG4gICAgICAgID8gdGhpcy5jc3NDbGFzc2VzLmNlbGwgKyBcIiBcIlxuICAgICAgICA6IFwiXCI7XG4gICAgaXRlbUNsYXNzICs9XG4gICAgICBjZWxsQ2xhc3MgK1xuICAgICAgKGlzQ2hlY2tlZCA/IFwiIFwiICsgY2VsbFNlbGVjdGVkQ2xhc3MgOiBcIlwiKSArXG4gICAgICAoaXNEaXNhYmxlZCA/IFwiIFwiICsgY2VsbERpc2FibGVkQ2xhc3MgOiBcIlwiKSArXG4gICAgICAoYWxsb3dIb3ZlciA/IFwiIFwiICsgaXRlbUhvdmVyQ2xhc3MgOiBcIlwiKTtcbiAgICByZXR1cm4gaXRlbUNsYXNzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFF1aXpRdWVzdGlvbkNvdW50KCkge1xuICAgIHZhciByZXMgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuY29ycmVjdEFuc3dlclt0aGlzLnJvd3NbaV0udmFsdWVdKSkgcmVzKys7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHZhciByZXMgPSAwO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLnJvd3NbaV0udmFsdWU7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmlzVmFsdWVFbXB0eSh2YWx1ZVtyb3ddKSAmJlxuICAgICAgICBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModGhpcy5jb3JyZWN0QW5zd2VyW3Jvd10sIHZhbHVlW3Jvd10pXG4gICAgICApXG4gICAgICAgIHJlcysrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFZpc2libGVSb3dzKCk6IEFycmF5PE1hdHJpeFJvd01vZGVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxNYXRyaXhSb3dNb2RlbD4oKTtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gcm93c1tpXTtcbiAgICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eShyb3cudmFsdWUpKSBjb250aW51ZTtcbiAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICB0aGlzLmNyZWF0ZU1hdHJpeFJvdyhcbiAgICAgICAgICByb3csXG4gICAgICAgICAgdGhpcy5pZCArIFwiX1wiICsgcm93LnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzL2csIFwiX1wiKSxcbiAgICAgICAgICB2YWxbcm93LnZhbHVlXVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAwICYmICF0aGlzLmZpbHRlcmVkUm93cykge1xuICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgIHRoaXMuY3JlYXRlTWF0cml4Um93KFxuICAgICAgICAgIG5ldyBJdGVtVmFsdWUobnVsbCksXG4gICAgICAgICAgdGhpcy5uYW1lLnJlcGxhY2UoL1xccy9nLCBcIl9cIiksXG4gICAgICAgICAgdmFsXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgc29ydFZpc2libGVSb3dzKFxuICAgIGFycmF5OiBBcnJheTxNYXRyaXhSb3dNb2RlbD5cbiAgKTogQXJyYXk8TWF0cml4Um93TW9kZWw+IHtcbiAgICB2YXIgb3JkZXIgPSB0aGlzLnJvd3NPcmRlci50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChvcmRlciA9PT0gXCJyYW5kb21cIilcbiAgICAgIHJldHVybiBIZWxwZXJzLnJhbmRvbWl6ZUFycmF5PE1hdHJpeFJvd01vZGVsPihhcnJheSk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB0aGlzLnJvd3MgPSB0aGlzLnNvcnRWaXNpYmxlUm93cyh0aGlzLnJvd3MpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eUJhc2VkT25Sb3dzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHByb2Nlc3NSb3dzT25TZXQobmV3Um93czogQXJyYXk8YW55Pikge1xuICAgIHJldHVybiB0aGlzLnNvcnRWaXNpYmxlUm93cyhuZXdSb3dzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpc2libGUgcm93cyBhcyBtb2RlbCBvYmplY3RzLlxuICAgKiBAc2VlIHJvd3NWaXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVJvd3MoKTogQXJyYXk8TWF0cml4Um93TW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWaXNpYmxlUm93cygpO1xuICB9XG4gIHB1YmxpYyBnZXQgY2VsbHMoKTogTWF0cml4Q2VsbHMge1xuICAgIHJldHVybiB0aGlzLmNlbGxzVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjZWxscyh2YWx1ZTogTWF0cml4Q2VsbHMpIHtcbiAgICB0aGlzLmNlbGxzLnNldEpzb24odmFsdWUgJiYgdmFsdWUuZ2V0SnNvbiA/IHZhbHVlLmdldEpzb24oKSA6IG51bGwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzQ2VsbFRleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmNlbGxzLmlzRW1wdHk7XG4gIH1cbiAgcHVibGljIHNldENlbGxUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSwgdmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNlbGxzLnNldENlbGxUZXh0KHJvdywgY29sdW1uLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsVGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNlbGxzLmdldENlbGxUZXh0KHJvdywgY29sdW1uKTtcbiAgfVxuICBwdWJsaWMgc2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbjogYW55LCB2YWw6IHN0cmluZykge1xuICAgIHRoaXMuY2VsbHMuc2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdENlbGxUZXh0KGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jZWxscy5nZXREZWZhdWx0Q2VsbFRleHQoY29sdW1uKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2VsbERpc3BsYXlUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHMuZ2V0Q2VsbERpc3BsYXlUZXh0KHJvdywgY29sdW1uKTtcbiAgfVxuICBwcml2YXRlIGVtcHR5TG9jYWxpemFibGVTdHJpbmcgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcodGhpcyk7XG4gIHB1YmxpYyBnZXRDZWxsRGlzcGxheUxvY1RleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmNlbGxzLmdldENlbGxEaXNwbGF5TG9jVGV4dChyb3csIGNvbHVtbik7XG4gICAgcmV0dXJuIGxvYyA/IGxvYyA6IHRoaXMuZW1wdHlMb2NhbGl6YWJsZVN0cmluZztcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNWYWx1ZXNJbkFsbFJvd3MoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhcbiAgICBlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPixcbiAgICBpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzLCBpc09uVmFsdWVDaGFuZ2VkKTtcbiAgICBpZiAoXG4gICAgICAoIWlzT25WYWx1ZUNoYW5nZWQgfHwgdGhpcy5lcnJvcnMubGVuZ3RoID4gMCkgJiZcbiAgICAgIHRoaXMuaGFzRXJyb3JJblJvd3MoKVxuICAgICkge1xuICAgICAgZXJyb3JzLnB1c2gobmV3IFJlcXVpcmVkSW5BbGxSb3dzRXJyb3IobnVsbCwgdGhpcykpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGhhc0Vycm9ySW5Sb3dzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc0FsbFJvd1JlcXVpcmVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICF0aGlzLmhhc1ZhbHVlc0luQWxsUm93cygpO1xuICB9XG4gIHByaXZhdGUgaGFzVmFsdWVzSW5BbGxSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkocm93c1tpXS52YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzQW5zd2VyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLmdldElzQW5zd2VyZWQoKSAmJiB0aGlzLmhhc1ZhbHVlc0luQWxsUm93cygpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTWF0cml4Um93KFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBmdWxsTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogTWF0cml4Um93TW9kZWwge1xuICAgIHZhciByb3cgPSBuZXcgTWF0cml4Um93TW9kZWwoaXRlbSwgZnVsbE5hbWUsIHRoaXMsIHZhbHVlKTtcbiAgICB0aGlzLm9uTWF0cml4Um93Q3JlYXRlZChyb3cpO1xuICAgIHJldHVybiByb3c7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTWF0cml4Um93Q3JlYXRlZChyb3c6IE1hdHJpeFJvd01vZGVsKSB7fVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55LCB1cGRhdGVJc0Fuc3dlcmVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHN1cGVyLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUsIHRoaXMuaXNSb3dDaGFuZ2luZyB8fCB1cGRhdGVJc0Fuc3dlcmVkKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgfHwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSB2YWwgPSB7fTtcbiAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzWzBdLnZhbHVlID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJvdyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV07XG4gICAgICAgIHZhciByb3dWYWwgPSB2YWxbcm93Lm5hbWVdO1xuICAgICAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkocm93VmFsKSkgcm93VmFsID0gbnVsbDtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS52YWx1ZSA9IHJvd1ZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVJc0Fuc3dlcmVkKCk7XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIHJlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICB2YXIgbmV3S2V5ID0ga2V5c0FzVGV4dFxuICAgICAgICA/IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZSh0aGlzLnJvd3MsIGtleSlcbiAgICAgICAgOiBrZXk7XG4gICAgICBpZiAoIW5ld0tleSkgbmV3S2V5ID0ga2V5O1xuICAgICAgdmFyIG5ld1ZhbHVlID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMuY29sdW1ucywgdmFsdWVba2V5XSk7XG4gICAgICBpZiAoIW5ld1ZhbHVlKSBuZXdWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICByZXNbbmV3S2V5XSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbjtcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlLFxuICAgIH1cbiAgKSB7XG4gICAgdmFyIHF1ZXN0aW9uUGxhaW5EYXRhID0gc3VwZXIuZ2V0UGxhaW5EYXRhKG9wdGlvbnMpO1xuICAgIGlmICghIXF1ZXN0aW9uUGxhaW5EYXRhKSB7XG4gICAgICB2YXIgdmFsdWVzID0gdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IHRydWU7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5kYXRhID0gT2JqZWN0LmtleXModmFsdWVzIHx8IHt9KS5tYXAoKHJvd05hbWUpID0+IHtcbiAgICAgICAgdmFyIHJvdyA9IHRoaXMucm93cy5maWx0ZXIoXG4gICAgICAgICAgKHI6IE1hdHJpeFJvd01vZGVsKSA9PiByLnZhbHVlID09PSByb3dOYW1lXG4gICAgICAgIClbMF07XG4gICAgICAgIHZhciByb3dEYXRhSXRlbSA9IDxhbnk+e1xuICAgICAgICAgIG5hbWU6IHJvd05hbWUsXG4gICAgICAgICAgdGl0bGU6ICEhcm93ID8gcm93LnRleHQgOiBcInJvd1wiLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZXNbcm93TmFtZV0sXG4gICAgICAgICAgZGlzcGxheVZhbHVlOiBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUoXG4gICAgICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zLFxuICAgICAgICAgICAgdmFsdWVzW3Jvd05hbWVdXG4gICAgICAgICAgKSxcbiAgICAgICAgICBnZXRTdHJpbmc6ICh2YWw6IGFueSkgPT5cbiAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeSh2YWwpIDogdmFsLFxuICAgICAgICAgIGlzTm9kZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHZhciBpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKFxuICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMsXG4gICAgICAgICAgdmFsdWVzW3Jvd05hbWVdXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIWl0ZW0pIHtcbiAgICAgICAgICAob3B0aW9ucy5jYWxjdWxhdGlvbnMgfHwgW10pLmZvckVhY2goKGNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgICAgICByb3dEYXRhSXRlbVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdID1cbiAgICAgICAgICAgICAgaXRlbVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dEYXRhSXRlbTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25QbGFpbkRhdGE7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5yb3dzW2ldO1xuICAgICAgaWYgKCEhcm93LnZhbHVlKSB7XG4gICAgICAgIG9iamVjdHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogdGhpcy5nZXRWYWx1ZU5hbWUoKSArIFwiLlwiICsgcm93LnZhbHVlLFxuICAgICAgICAgIHRleHQ6IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyBcIi5cIiArIHJvdy5jYWxjdWxhdGVkVGV4dCxcbiAgICAgICAgICBxdWVzdGlvbjogdGhpcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiBzdXBlci5nZXRDb25kaXRpb25Kc29uKCk7XG4gICAgdmFyIHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbChwYXRoKTtcbiAgICBxdWVzdGlvbi5jaG9pY2VzID0gdGhpcy5jb2x1bW5zO1xuICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QocXVlc3Rpb24pO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgIHJldHVybiBqc29uO1xuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgc3VwZXIuY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgaWYgKHRoaXMuaGFzUm93cykge1xuICAgICAgdGhpcy5jbGVhckludmlzaWJsZVZhbHVlc0luUm93cygpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmIChyb3dzLmxlbmd0aCA+IDAgJiYgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dElkICsgXCJfXCIgKyByb3dzWzBdLm5hbWUgKyBcIl9cIiArIDA7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5nZXRGaXJzdElucHV0RWxlbWVudElkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUm93c0NoYW5nZWQoKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5QmFzZWRPblJvd3MoKTtcbiAgICBzdXBlci5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmlsaXR5QmFzZWRPblJvd3MoKSB7XG4gICAgaWYgKHRoaXMuaGlkZUlmUm93c0VtcHR5KSB7XG4gICAgICB0aGlzLnZpc2libGUgPVxuICAgICAgICB0aGlzLnJvd3MubGVuZ3RoID4gMCAmJlxuICAgICAgICAoIXRoaXMuZmlsdGVyZWRSb3dzIHx8IHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCA+IDApO1xuICAgIH1cbiAgfVxuICAvL0lNYXRyaXhEYXRhXG4gIG9uTWF0cml4Um93Q2hhbmdlZChyb3c6IE1hdHJpeFJvd01vZGVsKSB7XG4gICAgaWYgKHRoaXMuaXNSb3dDaGFuZ2luZykgcmV0dXJuO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgaWYgKCF0aGlzLmhhc1Jvd3MpIHtcbiAgICAgIHRoaXMuc2V0TmV3VmFsdWUocm93LnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIGlmICghbmV3VmFsdWUpIHtcbiAgICAgICAgbmV3VmFsdWUgPSB7fTtcbiAgICAgIH1cbiAgICAgIG5ld1ZhbHVlW3Jvdy5uYW1lXSA9IHJvdy52YWx1ZTtcbiAgICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgfVxuICBnZXRDb3JyZWN0ZWRSb3dWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlID09PSB0aGlzLmNvbHVtbnNbaV0udmFsdWUpIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModmFsdWUsIHRoaXMuY29sdW1uc1tpXS52YWx1ZSkpXG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbnNbaV0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U2VhcmNoYWJsZUl0ZW1WYWx1ZUtleXMoa2V5czogQXJyYXk8c3RyaW5nPikge1xuICAgIGtleXMucHVzaChcImNvbHVtbnNcIik7XG4gICAga2V5cy5wdXNoKFwicm93c1wiKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IFN1cnZleU1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSBhcyBTdXJ2ZXlNb2RlbDtcbiAgfVxuICBwdWJsaWMgZ2V0Q29sdW1uSGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoY2VsbDogSXRlbVZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKFxuICAgICAgeyBjb2x1bW46IGNlbGwgfSxcbiAgICAgIFwiY29sdW1uLWhlYWRlclwiXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q29sdW1uSGVhZGVyV3JhcHBlckNvbXBvbmVudERhdGEoY2VsbDogSXRlbVZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnREYXRhKFxuICAgICAgeyBjb2x1bW46IGNlbGwgfSxcbiAgICAgIFwiY29sdW1uLWhlYWRlclwiXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0Um93SGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoY2VsbDogSXRlbVZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKFxuICAgICAgeyByb3c6IGNlbGwgfSxcbiAgICAgIFwicm93LWhlYWRlclwiXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0Um93SGVhZGVyV3JhcHBlckNvbXBvbmVudERhdGEoY2VsbDogSXRlbVZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnREYXRhKFxuICAgICAgeyByb3c6IGNlbGwgfSxcbiAgICAgIFwicm93LWhlYWRlclwiXG4gICAgKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm1hdHJpeFwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJjb2x1bW5zOml0ZW12YWx1ZVtdXCIsXG4gICAgICBiYXNlVmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9jb2x1bW5cIik7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzOml0ZW12YWx1ZVtdXCIsXG4gICAgICBiYXNlVmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9yb3dcIik7XG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImNlbGxzOmNlbGxzXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJjZWxsc1wiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzT3JkZXJcIixcbiAgICAgIGRlZmF1bHQ6IFwiaW5pdGlhbFwiLFxuICAgICAgY2hvaWNlczogW1wiaW5pdGlhbFwiLCBcInJhbmRvbVwiXSxcbiAgICB9LFxuICAgIFwiaXNBbGxSb3dSZXF1aXJlZDpib29sZWFuXCIsXG4gICAgXCJoaWRlSWZSb3dzRW1wdHk6Ym9vbGVhblwiLFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwibWF0cml4YmFzZVwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeFwiLCAobmFtZSkgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeE1vZGVsKG5hbWUpO1xuICBxLnJvd3MgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdFJvd3M7XG4gIHEuY29sdW1ucyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q29sdW1zO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gIElNYXRyaXhEcm9wZG93bkRhdGEsXG59IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duUm93TW9kZWwgZXh0ZW5kcyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIoZGF0YSwgdmFsdWUpO1xuICAgIHRoaXMuaXRlbSA9IGl0ZW07XG4gICAgdGhpcy5idWlsZENlbGxzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0udGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0ubG9jVGV4dDtcbiAgfVxufVxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG1hdHJpeCBkcm9wZG93biBxdWVzdGlvbi4gWW91IG1heSB1c2UgYSBkcm9wZG93biwgY2hlY2tib3gsIHJhZGlvZ3JvdXAsIHRleHQgYW5kIGNvbW1lbnQgcXVlc3Rpb25zIGFzIGEgY2VsbCBlZGl0b3JzLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICBpbXBsZW1lbnRzIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidG90YWxUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicm93c1wiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuY2xlYXJHZW5lcmF0ZWRSb3dzKCk7XG4gICAgICBzZWxmLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgICAgc2VsZi5maWx0ZXJJdGVtcygpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25cIjtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gc2hvdyBpdCBvbiB0aGUgZmlyc3QgY29sdW1uIGZvciB0aGUgdG90YWwgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCB0b3RhbFRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidG90YWxUZXh0XCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0b3RhbFRleHRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RvdGFsVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0b3RhbFRleHRcIik7XG4gIH1cbiAgcHVibGljIGdldEZvb3RlclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY1RvdGFsVGV4dDtcbiAgfVxuICAvKipcbiAgICogVGhlIGNvbHVtbiB3aWR0aCBmb3IgdGhlIGZpcnN0IGNvbHVtbiwgcm93IHRpdGxlIGNvbHVtbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcm93VGl0bGVXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dUaXRsZVdpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93VGl0bGVXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd1RpdGxlV2lkdGhcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Um93VGl0bGVXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJvd1RpdGxlV2lkdGg7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICAgIHZhciByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICB2YXIgcmVzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93VmFsdWUgPSB0aGlzLnJvd3NbaV0udmFsdWU7XG4gICAgICB2YXIgdmFsID0gdmFsdWVbcm93VmFsdWVdO1xuICAgICAgaWYgKCF2YWwpIGNvbnRpbnVlO1xuICAgICAgaWYgKGtleXNBc1RleHQpIHtcbiAgICAgICAgdmFyIGRpc3BsYXlSb3dWYWx1ZSA9IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZShcbiAgICAgICAgICB0aGlzLnJvd3MsXG4gICAgICAgICAgcm93VmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhZGlzcGxheVJvd1ZhbHVlKSB7XG4gICAgICAgICAgcm93VmFsdWUgPSBkaXNwbGF5Um93VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICg8YW55PnJlcylbcm93VmFsdWVdID0gdGhpcy5nZXRSb3dEaXNwbGF5VmFsdWUoa2V5c0FzVGV4dCwgcm93c1tpXSwgdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgdmFyIGhhc0NvbnRleHQgPSAhIWNvbnRleHQgPyB0aGlzLmNvbHVtbnMuaW5kZXhPZihjb250ZXh0KSA+IC0xIDogZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLnJvd3NbaV07XG4gICAgICBpZiAoIXJvdy52YWx1ZSkgY29udGludWU7XG4gICAgICB2YXIgcHJlZml4TmFtZSA9IHRoaXMuZ2V0VmFsdWVOYW1lKCkgKyBcIi5cIiArIHJvdy52YWx1ZSArIFwiLlwiO1xuICAgICAgdmFyIHByZWZpeFRpdGxlID0gdGhpcy5wcm9jZXNzZWRUaXRsZSArIFwiLlwiICsgcm93LmNhbGN1bGF0ZWRUZXh0ICsgXCIuXCI7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5jb2x1bW5zW2pdO1xuICAgICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IHByZWZpeE5hbWUgKyBjb2x1bW4ubmFtZSxcbiAgICAgICAgICB0ZXh0OiBwcmVmaXhUaXRsZSArIGNvbHVtbi5mdWxsVGl0bGUsXG4gICAgICAgICAgcXVlc3Rpb246IHRoaXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgICAgaWYgKGNvbHVtbiA9PSBjb250ZXh0KSBjb250aW51ZTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcInJvdy5cIiArIGNvbHVtbi5uYW1lLFxuICAgICAgICAgIHRleHQ6IFwicm93LlwiICsgY29sdW1uLmZ1bGxUaXRsZSxcbiAgICAgICAgICBxdWVzdGlvbjogdGhpcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgcmV0dXJuO1xuICAgIHZhciBuZXdWYWwgPSBudWxsO1xuICAgIHZhciBpc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgcm93cyA9ICEhdGhpcy5maWx0ZXJlZFJvd3MgPyB0aGlzLmZpbHRlcmVkUm93cyA6IHRoaXMucm93cztcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICBpZiAoSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHJvd3MsIGtleSkpIHtcbiAgICAgICAgaWYgKG5ld1ZhbCA9PSBudWxsKSBuZXdWYWwgPSB7fTtcbiAgICAgICAgKDxhbnk+bmV3VmFsKVtrZXldID0gdmFsW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsO1xuICAgIH1cbiAgICBzdXBlci5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgc3VwZXIuY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgdGhpcy5jbGVhckludmlzaWJsZVZhbHVlc0luUm93cygpO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbD4ge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbD4oKTtcbiAgICB2YXIgcm93cyA9ICEhdGhpcy5maWx0ZXJlZFJvd3MgPyB0aGlzLmZpbHRlcmVkUm93cyA6IHRoaXMucm93cztcbiAgICBpZiAoIXJvd3MgfHwgcm93cy5sZW5ndGggPT09IDApIHJldHVybiByZXN1bHQ7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHZhbCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFyb3dzW2ldLnZhbHVlKSBjb250aW51ZTtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlTWF0cml4Um93KHJvd3NbaV0sIHZhbFtyb3dzW2ldLnZhbHVlXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVNYXRyaXhSb3coXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogTWF0cml4RHJvcGRvd25Sb3dNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXhEcm9wZG93blJvd01vZGVsKGl0ZW0udmFsdWUsIGl0ZW0sIHRoaXMsIHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U2VhcmNoYWJsZUl0ZW1WYWx1ZUtleXMoa2V5czogQXJyYXk8c3RyaW5nPikge1xuICAgIGtleXMucHVzaChcInJvd3NcIik7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhkcm9wZG93blwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzOml0ZW12YWx1ZVtdXCIsXG4gICAgfSxcbiAgICBcInJvd3NWaXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJyb3dUaXRsZVdpZHRoXCIsXG4gICAgeyBuYW1lOiBcInRvdGFsVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVG90YWxUZXh0XCIgfSxcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwibWF0cml4ZHJvcGRvd25iYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4ZHJvcGRvd25cIiwgKG5hbWUpID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIHEucm93cyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Um93cztcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZS5hZGREZWZhdWx0Q29sdW1ucyhxKTtcbiAgcmV0dXJuIHE7XG59KTtcbiIsImltcG9ydCB7XG4gIEpzb25PYmplY3QsXG4gIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLFxuICBKc29uT2JqZWN0UHJvcGVydHksXG4gIFNlcmlhbGl6ZXIsXG59IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsIH0gZnJvbSBcIi4vbWFydGl4QmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7XG4gIElFbGVtZW50LFxuICBJUXVlc3Rpb24sXG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5LFxuICBJU3VydmV5SW1wbCxcbiAgSVRleHRQcm9jZXNzb3IsXG4gIElQcm9ncmVzc0luZm8sXG4gIElQYW5lbCxcbiAgSVdyYXBwZXJPYmplY3QsXG59IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuL3N1cnZleS1lbGVtZW50XCI7XG5pbXBvcnQge1xuICBUZXh0UHJlUHJvY2Vzc29yVmFsdWUsXG4gIFF1ZXN0aW9uVGV4dFByb2Nlc3Nvcixcbn0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBTdXJ2ZXlWYWxpZGF0b3IgfSBmcm9tIFwiLi92YWxpZGF0b3JcIjtcbmltcG9ydCB7IGdldEN1cnJlY3lDb2RlcyB9IGZyb20gXCIuL3F1ZXN0aW9uX2V4cHJlc3Npb25cIjtcbmltcG9ydCB7IEZ1bmN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL2Z1bmN0aW9uc2ZhY3RvcnlcIjtcbmltcG9ydCB7IFBhbmVsTW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgS2V5RHVwbGljYXRpb25FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuL3N1cnZleVwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9zdXJ2ZXktZXJyb3JcIjtcbmltcG9ydCB7IEFjdGlvbiwgSUFjdGlvbiB9IGZyb20gXCIuL2FjdGlvbnMvYWN0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGl2ZUFjdGlvbkNvbnRhaW5lciB9IGZyb20gXCIuL2FjdGlvbnMvYWRhcHRpdmUtY29udGFpbmVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeERyb3Bkb3duRGF0YSB7XG4gIHZhbHVlOiBhbnk7XG4gIG9uUm93Q2hhbmdlZChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICBuZXdSb3dWYWx1ZTogYW55LFxuICAgIGlzRGVsZXRpbmdWYWx1ZTogYm9vbGVhblxuICApOiB2b2lkO1xuICBvblJvd0NoYW5naW5nKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogYW55O1xuICBpc1ZhbGlkYXRlT25WYWx1ZUNoYW5naW5nOiBib29sZWFuO1xuICBnZXRSb3dJbmRleChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogbnVtYmVyO1xuICBnZXRSb3dWYWx1ZShyb3dJbmRleDogbnVtYmVyKTogYW55O1xuICBjaGVja0lmVmFsdWVJblJvd0R1cGxpY2F0ZWQoXG4gICAgY2hlY2tlZFJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY2VsbFF1ZXN0aW9uOiBRdWVzdGlvblxuICApOiBib29sZWFuO1xuICBoYXNEZXRhaWxQYW5lbChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogYm9vbGVhbjtcbiAgZ2V0SXNEZXRhaWxQYW5lbFNob3dpbmcocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IGJvb2xlYW47XG4gIHNldElzRGV0YWlsUGFuZWxTaG93aW5nKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsIHZhbDogYm9vbGVhbik6IHZvaWQ7XG4gIGNyZWF0ZVJvd0RldGFpbFBhbmVsKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBQYW5lbE1vZGVsO1xuICB2YWxpZGF0ZUNlbGwoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93VmFsdWU6IGFueVxuICApOiBTdXJ2ZXlFcnJvcjtcbiAgY29sdW1uczogQXJyYXk8TWF0cml4RHJvcGRvd25Db2x1bW4+O1xuICBjcmVhdGVRdWVzdGlvbihcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgKTogUXVlc3Rpb247XG4gIGdldExvY2FsZSgpOiBzdHJpbmc7XG4gIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0UmVuZGVyZXIobmFtZTogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbiAgKTogUXVlc3Rpb247XG4gIG9uVG90YWxWYWx1ZUNoYW5nZWQoKTogYW55O1xuICBnZXRTdXJ2ZXkoKTogSVN1cnZleTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWF0cml4Q29sdW1uT3duZXIgZXh0ZW5kcyBJTG9jYWxpemFibGVPd25lciB7XG4gIGdldFJlcXVpcmVkVGV4dCgpOiBzdHJpbmc7XG4gIG9uQ29sdW1uUHJvcGVydHlDaGFuZ2VkKFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKTogdm9pZDtcbiAgb25Db2x1bW5JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBvYmo6IEl0ZW1WYWx1ZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICBvbGRWYWx1ZTogYW55XG4gICk6IHZvaWQ7XG4gIG9uU2hvd0luTXVsdGlwbGVDb2x1bW5zQ2hhbmdlZChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogdm9pZDtcbiAgZ2V0Q2VsbFR5cGUoKTogc3RyaW5nO1xuICBvbkNvbHVtbkNlbGxUeXBlQ2hhbmdlZChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogdm9pZDtcbn1cblxuZnVuY3Rpb24gb25VcGRhdGVTZWxlY3RCYXNlQ2VsbFF1ZXN0aW9uKFxuICBjZWxsUXVlc3Rpb246IFF1ZXN0aW9uU2VsZWN0QmFzZSxcbiAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXG4gIGRhdGE6IGFueVxuKSB7XG4gIGNlbGxRdWVzdGlvbi5zdG9yZU90aGVyc0FzQ29tbWVudCA9ICEhcXVlc3Rpb25cbiAgICA/IHF1ZXN0aW9uLnN0b3JlT3RoZXJzQXNDb21tZW50XG4gICAgOiBmYWxzZTtcbiAgaWYgKFxuICAgICghY2VsbFF1ZXN0aW9uLmNob2ljZXMgfHwgY2VsbFF1ZXN0aW9uLmNob2ljZXMubGVuZ3RoID09IDApICYmXG4gICAgY2VsbFF1ZXN0aW9uLmNob2ljZXNCeVVybC5pc0VtcHR5XG4gICkge1xuICAgIGNlbGxRdWVzdGlvbi5jaG9pY2VzID0gcXVlc3Rpb24uY2hvaWNlcztcbiAgfVxuICBpZiAoIWNlbGxRdWVzdGlvbi5jaG9pY2VzQnlVcmwuaXNFbXB0eSkge1xuICAgIGNlbGxRdWVzdGlvbi5jaG9pY2VzQnlVcmwucnVuKGRhdGEuZ2V0VGV4dFByb2Nlc3NvcigpKTtcbiAgfVxufVxuZXhwb3J0IHZhciBtYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzID0ge1xuICBkcm9wZG93bjoge1xuICAgIHByb3BlcnRpZXM6IFtcbiAgICAgIFwiY2hvaWNlc1wiLFxuICAgICAgXCJjaG9pY2VzT3JkZXJcIixcbiAgICAgIFwiY2hvaWNlc0J5VXJsXCIsXG4gICAgICBcIm9wdGlvbnNDYXB0aW9uXCIsXG4gICAgICBcIm90aGVyVGV4dFwiLFxuICAgICAgXCJjaG9pY2VzVmlzaWJsZUlmXCIsXG4gICAgXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHtcbiAgICAgIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb24sIGNvbHVtbiwgcXVlc3Rpb24sIGRhdGEpO1xuICAgICAgaWYgKFxuICAgICAgICAhIWNlbGxRdWVzdGlvbi5sb2NPcHRpb25zQ2FwdGlvbiAmJlxuICAgICAgICBjZWxsUXVlc3Rpb24ubG9jT3B0aW9uc0NhcHRpb24uaXNFbXB0eSAmJlxuICAgICAgICAhcXVlc3Rpb24ubG9jT3B0aW9uc0NhcHRpb24uaXNFbXB0eVxuICAgICAgKSB7XG4gICAgICAgIGNlbGxRdWVzdGlvbi5vcHRpb25zQ2FwdGlvbiA9IHF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIGNoZWNrYm94OiB7XG4gICAgcHJvcGVydGllczogW1xuICAgICAgXCJjaG9pY2VzXCIsXG4gICAgICBcImNob2ljZXNPcmRlclwiLFxuICAgICAgXCJjaG9pY2VzQnlVcmxcIixcbiAgICAgIFwib3RoZXJUZXh0XCIsXG4gICAgICBcImNob2ljZXNWaXNpYmxlSWZcIixcbiAgICAgIFwiaGFzU2VsZWN0QWxsXCIsXG4gICAgICBcImhhc05vbmVcIixcbiAgICBdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcbiAgICAgIGNvbHVtbjogYW55LFxuICAgICAgcXVlc3Rpb246IGFueSxcbiAgICAgIGRhdGE6IGFueVxuICAgICkgPT4ge1xuICAgICAgb25VcGRhdGVTZWxlY3RCYXNlQ2VsbFF1ZXN0aW9uKGNlbGxRdWVzdGlvbiwgY29sdW1uLCBxdWVzdGlvbiwgZGF0YSk7XG4gICAgICBjZWxsUXVlc3Rpb24uY29sQ291bnQgPVxuICAgICAgICBjb2x1bW4uY29sQ291bnQgPiAtMSA/IGNvbHVtbi5jb2xDb3VudCA6IHF1ZXN0aW9uLmNvbHVtbkNvbENvdW50O1xuICAgIH0sXG4gIH0sXG4gIHJhZGlvZ3JvdXA6IHtcbiAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICBcImNob2ljZXNcIixcbiAgICAgIFwiY2hvaWNlc09yZGVyXCIsXG4gICAgICBcImNob2ljZXNCeVVybFwiLFxuICAgICAgXCJvdGhlclRleHRcIixcbiAgICAgIFwiY2hvaWNlc1Zpc2libGVJZlwiLFxuICAgIF0sXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxuICAgICAgY29sdW1uOiBhbnksXG4gICAgICBxdWVzdGlvbjogYW55LFxuICAgICAgZGF0YTogYW55XG4gICAgKSA9PiB7XG4gICAgICBvblVwZGF0ZVNlbGVjdEJhc2VDZWxsUXVlc3Rpb24oY2VsbFF1ZXN0aW9uLCBjb2x1bW4sIHF1ZXN0aW9uLCBkYXRhKTtcbiAgICAgIGNlbGxRdWVzdGlvbi5jb2xDb3VudCA9XG4gICAgICAgIGNvbHVtbi5jb2xDb3VudCA+IC0xID8gY29sdW1uLmNvbENvdW50IDogcXVlc3Rpb24uY29sdW1uQ29sQ291bnQ7XG4gICAgfSxcbiAgfSxcbiAgdGV4dDoge1xuICAgIHByb3BlcnRpZXM6IFtcInBsYWNlSG9sZGVyXCIsIFwiaW5wdXRUeXBlXCIsIFwibWF4TGVuZ3RoXCIsIFwibWluXCIsIFwibWF4XCIsIFwic3RlcFwiXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHt9LFxuICB9LFxuICBjb21tZW50OiB7XG4gICAgcHJvcGVydGllczogW1wicGxhY2VIb2xkZXJcIiwgXCJyb3dzXCIsIFwibWF4TGVuZ3RoXCJdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcbiAgICAgIGNvbHVtbjogYW55LFxuICAgICAgcXVlc3Rpb246IGFueSxcbiAgICAgIGRhdGE6IGFueVxuICAgICkgPT4ge30sXG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJyZW5kZXJBc1wiLCBcImRlZmF1bHRWYWx1ZVwiXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHtcbiAgICAgIGNlbGxRdWVzdGlvbi5zaG93VGl0bGUgPSB0cnVlO1xuICAgICAgY2VsbFF1ZXN0aW9uLnJlbmRlckFzID0gY29sdW1uLnJlbmRlckFzO1xuICAgIH0sXG4gIH0sXG4gIGV4cHJlc3Npb246IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJleHByZXNzaW9uXCIsIFwiZGlzcGxheVN0eWxlXCIsIFwiY3VycmVuY3lcIl0sXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxuICAgICAgY29sdW1uOiBhbnksXG4gICAgICBxdWVzdGlvbjogYW55LFxuICAgICAgZGF0YTogYW55XG4gICAgKSA9PiB7fSxcbiAgfSxcbiAgcmF0aW5nOiB7XG4gICAgcHJvcGVydGllczogW1wicmF0ZVZhbHVlc1wiXSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93bkNvbHVtbiBleHRlbmRzIEJhc2VcbiAgaW1wbGVtZW50cyBJTG9jYWxpemFibGVPd25lciwgSVdyYXBwZXJPYmplY3Qge1xuICBwdWJsaWMgc3RhdGljIGdldENvbHVtblR5cGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcykge1xuICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHRlbXBsYXRlUXVlc3Rpb25WYWx1ZTogUXVlc3Rpb247XG4gIHByaXZhdGUgY29sT3duZXJWYWx1ZTogSU1hdHJpeENvbHVtbk93bmVyID0gbnVsbDtcbiAgcHJpdmF0ZSBpbmRleFZhbHVlID0gLTE7XG4gIHByaXZhdGUgX2lzVmlzaWJsZSA9IHRydWU7XG4gIHByaXZhdGUgX2hhc1Zpc2libGVDZWxsID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRvdGFsRm9ybWF0XCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICBcInNob3dJbk11bHRpcGxlQ29sdW1uc1wiLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuZG9TaG93SW5NdWx0aXBsZUNvbHVtbnNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubG9jVGl0bGUuc3RyQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0T3JpZ2luYWxPYmooKTogQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbjtcbiAgfVxuICBnZXRDbGFzc05hbWVQcm9wZXJ0eSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNlbGxUeXBlXCI7XG4gIH1cbiAgcHVibGljIGdldFN1cnZleShsaXZlOiBib29sZWFuID0gZmFsc2UpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gISF0aGlzLmNvbE93bmVyID8gKDxhbnk+dGhpcy5jb2xPd25lcikuc3VydmV5IDogbnVsbDtcbiAgfVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5vbkdldFN1cnZleSA9ICgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldFN1cnZleSgpO1xuICAgIH07XG4gIH1cbiAgZ2V0RHluYW1pY1Byb3BlcnR5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNlbGxUeXBlXCI7XG4gIH1cbiAgZ2V0RHluYW1pY1R5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjQ2VsbFF1ZXN0aW9uVHlwZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29sT3duZXIoKTogSU1hdHJpeENvbHVtbk93bmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb2xPd25lclZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sT3duZXIodmFsdWU6IElNYXRyaXhDb2x1bW5Pd25lcikge1xuICAgIHRoaXMuY29sT3duZXJWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICghIXZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgdGhpcy5sb2NUaXRsZS5zdHJDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGFkZFVzZWRMb2NhbGVzKGxvY2FsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBzdXBlci5hZGRVc2VkTG9jYWxlcyhsb2NhbGVzKTtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uYWRkVXNlZExvY2FsZXMobG9jYWxlcyk7XG4gIH1cbiAgcHVibGljIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXRJbmRleCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuaW5kZXhWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpIHtcbiAgICByZXR1cm4gXCJtYXRyaXhkcm9wZG93bmNvbHVtblwiO1xuICB9XG4gIHB1YmxpYyBnZXQgY2VsbFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2VsbFR5cGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBjZWxsVHlwZSh2YWw6IHN0cmluZykge1xuICAgIHZhbCA9IHZhbC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCk7XG4gICAgaWYgKCEhdGhpcy5jb2xPd25lcikge1xuICAgICAgdGhpcy5jb2xPd25lci5vbkNvbHVtbkNlbGxUeXBlQ2hhbmdlZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCB0ZW1wbGF0ZVF1ZXN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb25WYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlO1xuICB9XG4gIHB1YmxpYyBzZXRJc1Zpc2libGUobmV3VmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNWaXNpYmxlID0gbmV3VmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVmlzaWJsZUNlbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc1Zpc2libGVDZWxsO1xuICB9XG4gIHB1YmxpYyBzZXQgaGFzVmlzaWJsZUNlbGwobmV3VmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGFzVmlzaWJsZUNlbGwgPSBuZXdWYWw7XG4gIH1cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubmFtZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnRpdGxlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NUaXRsZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGZ1bGxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY1RpdGxlLnRleHRPckh0bWw7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uaXNSZXF1aXJlZDtcbiAgfVxuICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmlzUmVxdWlyZWQgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCByZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlcXVpcmVkVGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZXF1aXJlZEVycm9yVGV4dDtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkRXJyb3JUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlcXVpcmVkRXJyb3JUZXh0ID0gdmFsO1xuICB9XG4gIGdldCBsb2NSZXF1aXJlZEVycm9yVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NSZXF1aXJlZEVycm9yVGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVhZE9ubHk7XG4gIH1cbiAgcHVibGljIHNldCByZWFkT25seSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVhZE9ubHkgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBoYXNPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmhhc090aGVyO1xuICB9XG4gIHB1YmxpYyBzZXQgaGFzT3RoZXIodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmhhc090aGVyID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi52aXNpYmxlSWY7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udmlzaWJsZUlmID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgZW5hYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmVuYWJsZUlmO1xuICB9XG4gIHB1YmxpYyBzZXQgZW5hYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uZW5hYmxlSWYgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCByZXF1aXJlZElmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZXF1aXJlZElmO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZXF1aXJlZElmID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNVbmlxdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzVW5pcXVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNVbmlxdWUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNVbmlxdWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHNob3dJbk11bHRpcGxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0luTXVsdGlwbGVDb2x1bW5zXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dJbk11bHRpcGxlQ29sdW1ucyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93SW5NdWx0aXBsZUNvbHVtbnNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU3VwcG9ydE11bHRpcGxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gW1wiY2hlY2tib3hcIiwgXCJyYWRpb2dyb3VwXCJdLmluZGV4T2YodGhpcy5jZWxsVHlwZSkgPiAtMTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU2hvd0luTXVsdGlwbGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dJbk11bHRpcGxlQ29sdW1ucyAmJiB0aGlzLmlzU3VwcG9ydE11bHRpcGxlQ29sdW1ucztcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi52YWxpZGF0b3JzO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsaWRhdG9ycyh2YWw6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4pIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udmFsaWRhdG9ycyA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbFR5cGVcIiwgXCJub25lXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxUeXBlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbEV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxFeHByZXNzaW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxFeHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxFeHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUb3RhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b3RhbFR5cGUgIT0gXCJub25lXCIgfHwgISF0aGlzLnRvdGFsRXhwcmVzc2lvbjtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidG90YWxGb3JtYXRcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB0b3RhbEZvcm1hdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidG90YWxGb3JtYXRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jVG90YWxGb3JtYXQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidG90YWxGb3JtYXRcIik7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJBcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJBc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlbmRlckFzKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyQXNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDIwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxNYXhpbXVtRnJhY3Rpb25EaWdpdHNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDIwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxNaW5pbXVtRnJhY3Rpb25EaWdpdHNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsRGlzcGxheVN0eWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRvdGFsRGlzcGxheVN0eWxlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxEaXNwbGF5U3R5bGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0b3RhbERpc3BsYXlTdHlsZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdG90YWxDdXJyZW5jeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbEN1cnJlbmN5XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxDdXJyZW5jeSh2YWw6IHN0cmluZykge1xuICAgIGlmIChnZXRDdXJyZWN5Q29kZXMoKS5pbmRleE9mKHZhbCkgPCAwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxDdXJyZW5jeVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgbWluV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluV2lkdGhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW5XaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbldpZHRoXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB3aWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDQpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2xPd25lciA/IHRoaXMuY29sT3duZXIuZ2V0TG9jYWxlKCkgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbE93bmVyID8gdGhpcy5jb2xPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dCwgbmFtZSkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRSZW5kZXJlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMuY29sT3duZXIgPyB0aGlzLmNvbE93bmVyLmdldFJlbmRlcmVyKG5hbWUpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbE93bmVyID8gdGhpcy5jb2xPd25lci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpIDogdGV4dDtcbiAgfVxuICBwdWJsaWMgY3JlYXRlQ2VsbFF1ZXN0aW9uKGRhdGE6IGFueSk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcVR5cGUgPSB0aGlzLmNhbGNDZWxsUXVlc3Rpb25UeXBlKCk7XG4gICAgdmFyIGNlbGxRdWVzdGlvbiA9IDxRdWVzdGlvbj50aGlzLmNyZWF0ZU5ld1F1ZXN0aW9uKHFUeXBlKTtcbiAgICB0aGlzLmNhbGxPbkNlbGxRdWVzdGlvblVwZGF0ZShjZWxsUXVlc3Rpb24sIGRhdGEpO1xuICAgIHJldHVybiBjZWxsUXVlc3Rpb247XG4gIH1cbiAgcHVibGljIHVwZGF0ZUNlbGxRdWVzdGlvbihcbiAgICBjZWxsUXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGRhdGE6IGFueSxcbiAgICBvblVwZGF0ZUpzb246IChqc29uOiBhbnkpID0+IGFueSA9IG51bGxcbiAgKSB7XG4gICAgdGhpcy5zZXRRdWVzdGlvblByb3BlcnRpZXMoY2VsbFF1ZXN0aW9uLCBvblVwZGF0ZUpzb24pO1xuICAgIHRoaXMuY2FsbE9uQ2VsbFF1ZXN0aW9uVXBkYXRlKGNlbGxRdWVzdGlvbiwgZGF0YSk7XG4gIH1cbiAgcHJpdmF0ZSBjYWxsT25DZWxsUXVlc3Rpb25VcGRhdGUoY2VsbFF1ZXN0aW9uOiBRdWVzdGlvbiwgZGF0YTogYW55KSB7XG4gICAgdmFyIHFUeXBlID0gY2VsbFF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICB2YXIgcURlZmluaXRpb24gPSAoPGFueT5tYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzKVtxVHlwZV07XG4gICAgaWYgKHFEZWZpbml0aW9uICYmIHFEZWZpbml0aW9uW1wib25DZWxsUXVlc3Rpb25VcGRhdGVcIl0pIHtcbiAgICAgIHFEZWZpbml0aW9uW1wib25DZWxsUXVlc3Rpb25VcGRhdGVcIl0oXG4gICAgICAgIGNlbGxRdWVzdGlvbixcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5jb2xPd25lcixcbiAgICAgICAgZGF0YVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgZGVmYXVsdENlbGxUeXBlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FsY0NlbGxRdWVzdGlvblR5cGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jZWxsVHlwZSAhPT0gXCJkZWZhdWx0XCIpIHJldHVybiB0aGlzLmNlbGxUeXBlO1xuICAgIGlmICh0aGlzLmNvbE93bmVyKSByZXR1cm4gdGhpcy5jb2xPd25lci5nZXRDZWxsVHlwZSgpO1xuICAgIHJldHVybiBzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Q2VsbFR5cGU7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKSB7XG4gICAgdmFyIHByZXZDZWxsVHlwZSA9IHRoaXMudGVtcGxhdGVRdWVzdGlvblxuICAgICAgPyB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uZ2V0VHlwZSgpXG4gICAgICA6IFwiXCI7XG4gICAgdmFyIGN1ckNlbGxUeXBlID0gdGhpcy5jYWxjQ2VsbFF1ZXN0aW9uVHlwZSgpO1xuICAgIGlmIChjdXJDZWxsVHlwZSA9PT0gcHJldkNlbGxUeXBlKSByZXR1cm47XG4gICAgaWYgKHRoaXMudGVtcGxhdGVRdWVzdGlvbikge1xuICAgICAgdGhpcy5yZW1vdmVQcm9wZXJ0aWVzKHByZXZDZWxsVHlwZSk7XG4gICAgfVxuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvblZhbHVlID0gdGhpcy5jcmVhdGVOZXdRdWVzdGlvbihjdXJDZWxsVHlwZSk7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmxvY093bmVyID0gdGhpcztcbiAgICB0aGlzLmFkZFByb3BlcnRpZXMoY3VyQ2VsbFR5cGUpO1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5vblByb3BlcnR5Q2hhbmdlZC5hZGQoKHNlbmRlciwgb3B0aW9ucykgPT4ge1xuICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgICAgb3B0aW9ucy5uYW1lLFxuICAgICAgICBvcHRpb25zLm9sZFZhbHVlLFxuICAgICAgICBvcHRpb25zLm5ld1ZhbHVlXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5vbkl0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZC5hZGQoKHNlbmRlciwgb3B0aW9ucykgPT4ge1xuICAgICAgdGhpcy5kb0l0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZChcbiAgICAgICAgb3B0aW9ucy5wcm9wZXJ0eU5hbWUsXG4gICAgICAgIG9wdGlvbnMub2JqLFxuICAgICAgICBvcHRpb25zLm5hbWUsXG4gICAgICAgIG9wdGlvbnMubmV3VmFsdWUsXG4gICAgICAgIG9wdGlvbnMub2xkVmFsdWVcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmlzQ29udGVudEVsZW1lbnQgPSB0cnVlO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm9uR2V0U3VydmV5ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdXJ2ZXkoKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NUaXRsZS5zdHJDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1F1ZXN0aW9uKGNlbGxUeXBlOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHF1ZXN0aW9uID0gPFF1ZXN0aW9uPlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoY2VsbFR5cGUpO1xuICAgIGlmICghcXVlc3Rpb24pIHtcbiAgICAgIHF1ZXN0aW9uID0gPFF1ZXN0aW9uPlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoXCJ0ZXh0XCIpO1xuICAgIH1cbiAgICBxdWVzdGlvbi5sb2FkaW5nT3duZXIgPSB0aGlzO1xuICAgIHF1ZXN0aW9uLmlzRWRpdGFibGVUZW1wbGF0ZUVsZW1lbnQgPSB0cnVlO1xuICAgIHRoaXMuc2V0UXVlc3Rpb25Qcm9wZXJ0aWVzKHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uUHJvcGVydGllcyhcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgb25VcGRhdGVKc29uOiAoanNvbjogYW55KSA9PiBhbnkgPSBudWxsXG4gICkge1xuICAgIGlmICh0aGlzLnRlbXBsYXRlUXVlc3Rpb24pIHtcbiAgICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QodGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLCB0cnVlKTtcbiAgICAgIGlmIChvblVwZGF0ZUpzb24pIHtcbiAgICAgICAgb25VcGRhdGVKc29uKGpzb24pO1xuICAgICAgfVxuICAgICAganNvbi50eXBlID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBxdWVzdGlvbik7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIGlmICghU2VyaWFsaXplci5oYXNPcmlnaW5hbFByb3BlcnR5KHRoaXMsIG5hbWUpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY29sT3duZXIgIT0gbnVsbCAmJiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5jb2xPd25lci5vbkNvbHVtblByb3BlcnR5Q2hhbmdlZCh0aGlzLCBuYW1lLCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZG9JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgb2JqOiBJdGVtVmFsdWUsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgb2xkVmFsdWU6IGFueVxuICApIHtcbiAgICBpZiAoIVNlcmlhbGl6ZXIuaGFzT3JpZ2luYWxQcm9wZXJ0eShvYmosIG5hbWUpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY29sT3duZXIgIT0gbnVsbCAmJiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5jb2xPd25lci5vbkNvbHVtbkl0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICBvYmosXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICBvbGRWYWx1ZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRvU2hvd0luTXVsdGlwbGVDb2x1bW5zQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5jb2xPd25lciAhPSBudWxsICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmNvbE93bmVyLm9uU2hvd0luTXVsdGlwbGVDb2x1bW5zQ2hhbmdlZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlOiBzdHJpbmcpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICByZXR1cm4gU2VyaWFsaXplci5nZXREeW5hbWljUHJvcGVydGllc0J5T2JqKHRoaXMsIGN1ckNlbGxUeXBlKTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZVByb3BlcnRpZXMoY3VyQ2VsbFR5cGU6IHN0cmluZykge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcGVydGllc1tpXTtcbiAgICAgIGRlbGV0ZSAoPGFueT50aGlzKVtwcm9wLm5hbWVdO1xuICAgICAgaWYgKHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5KSB7XG4gICAgICAgIGRlbGV0ZSAoPGFueT50aGlzKVtwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkUHJvcGVydGllcyhjdXJDZWxsVHlwZTogc3RyaW5nKSB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcGVydGllc1tpXTtcbiAgICAgIHRoaXMuYWRkUHJvcGVydHkocXVlc3Rpb24sIHByb3AubmFtZSwgZmFsc2UpO1xuICAgICAgaWYgKHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5KSB7XG4gICAgICAgIHRoaXMuYWRkUHJvcGVydHkocXVlc3Rpb24sIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRQcm9wZXJ0eShcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBpc1JlYWRPbmx5OiBib29sZWFuXG4gICkge1xuICAgIHZhciBkZXNjID0ge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICg8YW55PnF1ZXN0aW9uKVtwcm9wTmFtZV07XG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKCFpc1JlYWRPbmx5KSB7XG4gICAgICAoPGFueT5kZXNjKVtcInNldFwiXSA9IGZ1bmN0aW9uKHY6IGFueSkge1xuICAgICAgICAoPGFueT5xdWVzdGlvbilbcHJvcE5hbWVdID0gdjtcbiAgICAgIH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wTmFtZSwgZGVzYyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gIHByaXZhdGUgcXVlc3Rpb25WYWx1ZTogUXVlc3Rpb247XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIHB1YmxpYyByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHB1YmxpYyBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhXG4gICkge1xuICAgIHRoaXMucXVlc3Rpb25WYWx1ZSA9IHRoaXMuY3JlYXRlUXVlc3Rpb24oY29sdW1uLCByb3csIGRhdGEpO1xuICAgIHRoaXMucXVlc3Rpb25WYWx1ZS51cGRhdGVDdXN0b21XaWRnZXQoKTtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgdGhpcy5xdWVzdGlvbi5sb2NTdHJzQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVRdWVzdGlvbihcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YVxuICApOiBRdWVzdGlvbiB7XG4gICAgdmFyIHJlcyA9IGRhdGEuY3JlYXRlUXVlc3Rpb24odGhpcy5yb3csIHRoaXMuY29sdW1uKTtcbiAgICByZXMudmFsaWRhdGVWYWx1ZUNhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZGF0YS52YWxpZGF0ZUNlbGwocm93LCBjb2x1bW4ubmFtZSwgcm93LnZhbHVlKTtcbiAgICB9O1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmdldFByb3BlcnRpZXMoY29sdW1uLmdldFR5cGUoKSkuZm9yRWFjaChcbiAgICAgIChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBsZXQgcHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZTtcbiAgICAgICAgaWYgKCg8YW55PmNvbHVtbilbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzW3Byb3BlcnR5TmFtZV0gPSAoPGFueT5jb2x1bW4pW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25WYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24udmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB0aGlzLnF1ZXN0aW9uLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93blRvdGFsQ2VsbCBleHRlbmRzIE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIHB1YmxpYyByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHB1YmxpYyBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhXG4gICkge1xuICAgIHN1cGVyKGNvbHVtbiwgcm93LCBkYXRhKTtcbiAgICB0aGlzLnVwZGF0ZUNlbGxRdWVzdGlvbigpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVRdWVzdGlvbihcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YVxuICApOiBRdWVzdGlvbiB7XG4gICAgdmFyIHJlcyA9IDxRdWVzdGlvbj5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKFwiZXhwcmVzc2lvblwiKTtcbiAgICByZXMuc2V0U3VydmV5SW1wbChyb3cpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHRoaXMudXBkYXRlQ2VsbFF1ZXN0aW9uKCk7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ2VsbFF1ZXN0aW9uKCkge1xuICAgIHRoaXMucXVlc3Rpb24ubG9jQ2FsY3VsYXRpb24oKTtcbiAgICB0aGlzLmNvbHVtbi51cGRhdGVDZWxsUXVlc3Rpb24odGhpcy5xdWVzdGlvbiwgbnVsbCwgZnVuY3Rpb24oanNvbikge1xuICAgICAgZGVsZXRlIGpzb25bXCJkZWZhdWx0VmFsdWVcIl07XG4gICAgfSk7XG4gICAgdGhpcy5xdWVzdGlvbi5leHByZXNzaW9uID0gdGhpcy5nZXRUb3RhbEV4cHJlc3Npb24oKTtcbiAgICB0aGlzLnF1ZXN0aW9uLmZvcm1hdCA9IHRoaXMuY29sdW1uLnRvdGFsRm9ybWF0O1xuICAgIHRoaXMucXVlc3Rpb24uY3VycmVuY3kgPSB0aGlzLmNvbHVtbi50b3RhbEN1cnJlbmN5O1xuICAgIHRoaXMucXVlc3Rpb24uZGlzcGxheVN0eWxlID0gdGhpcy5jb2x1bW4udG90YWxEaXNwbGF5U3R5bGU7XG4gICAgdGhpcy5xdWVzdGlvbi5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSB0aGlzLmNvbHVtbi50b3RhbE1heGltdW1GcmFjdGlvbkRpZ2l0cztcbiAgICB0aGlzLnF1ZXN0aW9uLm1pbmltdW1GcmFjdGlvbkRpZ2l0cyA9IHRoaXMuY29sdW1uLnRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzO1xuICAgIHRoaXMucXVlc3Rpb24udW5sb2NDYWxjdWxhdGlvbigpO1xuICAgIHRoaXMucXVlc3Rpb24ucnVuSWZSZWFkT25seSA9IHRydWU7XG4gIH1cbiAgcHVibGljIGdldFRvdGFsRXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMuY29sdW1uLnRvdGFsRXhwcmVzc2lvbikgcmV0dXJuIHRoaXMuY29sdW1uLnRvdGFsRXhwcmVzc2lvbjtcbiAgICBpZiAodGhpcy5jb2x1bW4udG90YWxUeXBlID09IFwibm9uZVwiKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgZnVuTmFtZSA9IHRoaXMuY29sdW1uLnRvdGFsVHlwZSArIFwiSW5BcnJheVwiO1xuICAgIGlmICghRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLmhhc0Z1bmN0aW9uKGZ1bk5hbWUpKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gZnVuTmFtZSArIFwiKHtzZWxmfSwgJ1wiICsgdGhpcy5jb2x1bW4ubmFtZSArIFwiJylcIjtcbiAgfVxufVxuXG5jbGFzcyBNYXRyaXhEcm9wZG93blJvd1RleHRQcm9jZXNzb3IgZXh0ZW5kcyBRdWVzdGlvblRleHRQcm9jZXNzb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBwcm90ZWN0ZWQgdmFyaWFibGVOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIodmFyaWFibGVOYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5yb3cuZ2V0U3VydmV5KCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnJvdy52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiB0aGlzLnJvdy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DdXN0b21Qcm9jZXNzVGV4dCh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0ZXh0VmFsdWUubmFtZSA9PSBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5JbmRleFZhcmlhYmxlTmFtZSkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMucm93LnJvd0luZGV4O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0ZXh0VmFsdWUubmFtZSA9PSBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5Sb3dWYWx1ZVZhcmlhYmxlTmFtZSkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMucm93LnJvd05hbWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICBpbXBsZW1lbnRzIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCwgSUxvY2FsaXphYmxlT3duZXIge1xuICBwdWJsaWMgc3RhdGljIFJvd1ZhcmlhYmxlTmFtZSA9IFwicm93XCI7XG4gIHB1YmxpYyBzdGF0aWMgT3duZXJWYXJpYWJsZU5hbWUgPSBcInNlbGZcIjtcbiAgcHVibGljIHN0YXRpYyBJbmRleFZhcmlhYmxlTmFtZSA9IFwicm93SW5kZXhcIjtcbiAgcHVibGljIHN0YXRpYyBSb3dWYWx1ZVZhcmlhYmxlTmFtZSA9IFwicm93VmFsdWVcIjtcblxuICBwcml2YXRlIHN0YXRpYyBpZENvdW50ZXI6IG51bWJlciA9IDE7XG4gIHByaXZhdGUgc3RhdGljIGdldElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3Jvd19cIiArIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLmlkQ291bnRlcisrO1xuICB9XG4gIHByb3RlY3RlZCBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhO1xuICBwcm90ZWN0ZWQgaXNTZXR0aW5nVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpZFZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogTWF0cml4RHJvcGRvd25Sb3dUZXh0UHJvY2Vzc29yO1xuICBwcml2YXRlIGRldGFpbFBhbmVsVmFsdWU6IFBhbmVsTW9kZWwgPSBudWxsO1xuXG4gIHB1YmxpYyBjZWxsczogQXJyYXk8TWF0cml4RHJvcGRvd25DZWxsPiA9IFtdO1xuICBwdWJsaWMgc2hvd0hpZGVEZXRhaWxQYW5lbENsaWNrOiBhbnk7XG4gIHB1YmxpYyBvbkRldGFpbFBhbmVsU2hvd2luZ0NoYW5nZWQ6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YSwgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5zdWJzY3JpYmVUb0NoYW5nZXModmFsdWUpO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3NvciA9IG5ldyBNYXRyaXhEcm9wZG93blJvd1RleHRQcm9jZXNzb3IoXG4gICAgICB0aGlzLFxuICAgICAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuUm93VmFyaWFibGVOYW1lXG4gICAgKTtcbiAgICB0aGlzLnNob3dIaWRlRGV0YWlsUGFuZWxDbGljayA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2hvd0hpZGVEZXRhaWxQYW5lbCgpO1xuICAgIH07XG4gICAgdGhpcy5pZFZhbHVlID0gTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuZ2V0SWQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd05hbWUoKTogYW55IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHRleHQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5yb3dOYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICB2YXIgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIGlmICghcXVlc3Rpb24uaXNFbXB0eSgpKSB7XG4gICAgICAgIHJlc3VsdFtxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKV0gPSBxdWVzdGlvbi52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgISFxdWVzdGlvbi5jb21tZW50ICYmXG4gICAgICAgICEhdGhpcy5nZXRTdXJ2ZXkoKSAmJlxuICAgICAgICB0aGlzLmdldFN1cnZleSgpLnN0b3JlT3RoZXJzQXNDb21tZW50XG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0W3F1ZXN0aW9uLmdldFZhbHVlTmFtZSgpICsgc2V0dGluZ3MuY29tbWVudFByZWZpeF0gPVxuICAgICAgICAgIHF1ZXN0aW9uLmNvbW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldCBsb2NUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1BhbmVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5oYXNEZXRhaWxQYW5lbCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRldGFpbFBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmRldGFpbFBhbmVsVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBkZXRhaWxQYW5lbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5kZXRhaWxQYW5lbCA/IHRoaXMuZGV0YWlsUGFuZWwuaWQgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNEZXRhaWxQYW5lbFNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldElzRGV0YWlsUGFuZWxTaG93aW5nKHRoaXMpIDogZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBzZXRJc0RldGFpbFBhbmVsU2hvd2luZyh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAoISF0aGlzLmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRJc0RldGFpbFBhbmVsU2hvd2luZyh0aGlzLCB2YWwpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLm9uRGV0YWlsUGFuZWxTaG93aW5nQ2hhbmdlZCkge1xuICAgICAgdGhpcy5vbkRldGFpbFBhbmVsU2hvd2luZ0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzaG93SGlkZURldGFpbFBhbmVsKCkge1xuICAgIGlmICh0aGlzLmlzRGV0YWlsUGFuZWxTaG93aW5nKSB7XG4gICAgICB0aGlzLmhpZGVEZXRhaWxQYW5lbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dEZXRhaWxQYW5lbCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzQ3JlYXRpbmdEZXRhaWxQYW5lbCA9IGZhbHNlO1xuICBwdWJsaWMgc2hvd0RldGFpbFBhbmVsKCkge1xuICAgIHRoaXMuZW5zdXJlRGV0YWlsUGFuZWwoKTtcbiAgICBpZiAoIXRoaXMuZGV0YWlsUGFuZWxWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0SXNEZXRhaWxQYW5lbFNob3dpbmcodHJ1ZSk7XG4gIH1cbiAgcHVibGljIGhpZGVEZXRhaWxQYW5lbChkZXN0cm95UGFuZWw6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuc2V0SXNEZXRhaWxQYW5lbFNob3dpbmcoZmFsc2UpO1xuICAgIGlmIChkZXN0cm95UGFuZWwpIHtcbiAgICAgIHRoaXMuZGV0YWlsUGFuZWxWYWx1ZSA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZW5zdXJlRGV0YWlsUGFuZWwoKSB7XG4gICAgaWYgKHRoaXMuaXNDcmVhdGluZ0RldGFpbFBhbmVsKSByZXR1cm47XG4gICAgaWYgKCEhdGhpcy5kZXRhaWxQYW5lbFZhbHVlIHx8ICF0aGlzLmhhc1BhbmVsIHx8ICF0aGlzLmRhdGEpIHJldHVybjtcbiAgICB0aGlzLmlzQ3JlYXRpbmdEZXRhaWxQYW5lbCA9IHRydWU7XG4gICAgdGhpcy5kZXRhaWxQYW5lbFZhbHVlID0gdGhpcy5kYXRhLmNyZWF0ZVJvd0RldGFpbFBhbmVsKHRoaXMpO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmRldGFpbFBhbmVsVmFsdWUucXVlc3Rpb25zO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZGF0YS5nZXRSb3dWYWx1ZSh0aGlzLmRhdGEuZ2V0Um93SW5kZXgodGhpcykpO1xuICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIga2V5ID0gcXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpO1xuICAgICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlW2tleV0pKSB7XG4gICAgICAgICAgcXVlc3Rpb25zW2ldLnZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRldGFpbFBhbmVsVmFsdWUuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICB0aGlzLmlzQ3JlYXRpbmdEZXRhaWxQYW5lbCA9IGZhbHNlO1xuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgdmFyIGFsbFZhbHVlcyA9IHRoaXMuZ2V0QWxsVmFsdWVzKCk7XG4gICAgdmFyIHZhbHVlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHsgcm93OiBhbGxWYWx1ZXMgfTtcbiAgICBmb3IgKHZhciBrZXkgaW4gYWxsVmFsdWVzKSB7XG4gICAgICB2YWx1ZXNba2V5XSA9IGFsbFZhbHVlc1trZXldO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIGdldEZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHJldHVybiB7IHN1cnZleTogdGhpcy5nZXRTdXJ2ZXkoKSwgcm93OiB0aGlzIH07XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghIXRoaXMuZGF0YSkge1xuICAgICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLk93bmVyVmFyaWFibGVOYW1lXSA9IHRoaXMuZGF0YS52YWx1ZTtcbiAgICB9XG4gICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLkluZGV4VmFyaWFibGVOYW1lXSA9IHRoaXMucm93SW5kZXg7XG4gICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhbHVlVmFyaWFibGVOYW1lXSA9IHRoaXMucm93TmFtZTtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHByb3BlcnRpZXMgPSB7fTtcbiAgICBwcm9wZXJ0aWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhcmlhYmxlTmFtZV0gPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzW01hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhcmlhYmxlTmFtZV0gPSB0aGlzLnZhbHVlO1xuICAgICAgdGhpcy5jZWxsc1tpXS5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5kZXRhaWxQYW5lbCkge1xuICAgICAgdGhpcy5kZXRhaWxQYW5lbC5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWUoKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0uY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLnN1YnNjcmliZVRvQ2hhbmdlcyh2YWx1ZSk7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XG4gICAgICB2YXIgdmFsID0gdGhpcy5nZXRDZWxsVmFsdWUodmFsdWUsIHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpKTtcbiAgICAgIHZhciBvbGRDb21tZW50ID0gcXVlc3Rpb24uY29tbWVudDtcbiAgICAgIHZhciBjb21tZW50ID0gISF2YWx1ZVxuICAgICAgICA/IHZhbHVlW3F1ZXN0aW9uLmdldFZhbHVlTmFtZSgpICsgc2V0dGluZ3MuY29tbWVudFByZWZpeF1cbiAgICAgICAgOiBcIlwiO1xuICAgICAgaWYgKGNvbW1lbnQgPT0gdW5kZWZpbmVkKSBjb21tZW50ID0gXCJcIjtcbiAgICAgIHF1ZXN0aW9uLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh2YWwpO1xuICAgICAgaWYgKCEhY29tbWVudCB8fCBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMob2xkQ29tbWVudCwgcXVlc3Rpb24uY29tbWVudCkpIHtcbiAgICAgICAgcXVlc3Rpb24udXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkoY29tbWVudCk7XG4gICAgICB9XG4gICAgICBxdWVzdGlvbi5vblN1cnZleVZhbHVlQ2hhbmdlZCh2YWwpO1xuICAgIH1cbiAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgdmFyIHN1cnZleSA9IHRoaXMuZ2V0U3VydmV5KCk7XG4gICAgaWYgKCEhc3VydmV5KSB7XG4gICAgICByZXR1cm4gKDxhbnk+c3VydmV5KS5nZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2gsIGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWx1ZXNIYXNoW2tleV07XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgcmV0dXJuICEhcXVlc3Rpb24gPyBxdWVzdGlvbi52YWx1ZSA6IG51bGw7XG4gIH1cbiAgcHVibGljIHNldFZhbHVlKG5hbWU6IHN0cmluZywgbmV3Q29sdW1uVmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2V0VmFsdWVDb3JlKG5hbWUsIG5ld0NvbHVtblZhbHVlLCBmYWxzZSk7XG4gIH1cbiAgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHNldFZhcmlhYmxlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge31cbiAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgIHJldHVybiAhIXF1ZXN0aW9uID8gcXVlc3Rpb24uY29tbWVudCA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nLCBsb2NOb3RpZmljYXRpb246IGFueSkge1xuICAgIHRoaXMuc2V0VmFsdWVDb3JlKG5hbWUsIG5ld1ZhbHVlLCB0cnVlKTtcbiAgfVxuICBwcml2YXRlIHNldFZhbHVlQ29yZShuYW1lOiBzdHJpbmcsIG5ld0NvbHVtblZhbHVlOiBhbnksIGlzQ29tbWVudDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmlzU2V0dGluZ1ZhbHVlKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVRdWVzdGlvbnNWYWx1ZShuYW1lLCBuZXdDb2x1bW5WYWx1ZSwgaXNDb21tZW50KTtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIHZhciBjaGFuZ2VkTmFtZSA9IGlzQ29tbWVudCA/IG5hbWUgKyBzZXR0aW5ncy5jb21tZW50UHJlZml4IDogbmFtZTtcbiAgICB2YXIgY2hhbmdlZFZhbHVlID0gaXNDb21tZW50ID8gdGhpcy5nZXRDb21tZW50KG5hbWUpIDogdGhpcy5nZXRWYWx1ZShuYW1lKTtcbiAgICB2YXIgY2hhbmdlZFF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICB2YXIgY2hhbmdpbmdWYWx1ZSA9IHRoaXMuZGF0YS5vblJvd0NoYW5naW5nKHRoaXMsIGNoYW5nZWROYW1lLCBuZXdWYWx1ZSk7XG4gICAgaWYgKFxuICAgICAgISFjaGFuZ2VkUXVlc3Rpb24gJiZcbiAgICAgICFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoY2hhbmdpbmdWYWx1ZSwgY2hhbmdlZFZhbHVlKVxuICAgICkge1xuICAgICAgaWYgKGlzQ29tbWVudCkge1xuICAgICAgICBjaGFuZ2VkUXVlc3Rpb24uY29tbWVudCA9IGNoYW5naW5nVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFuZ2VkUXVlc3Rpb24udmFsdWUgPSBjaGFuZ2luZ1ZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZGF0YS5pc1ZhbGlkYXRlT25WYWx1ZUNoYW5naW5nICYmXG4gICAgICAgIHRoaXMuaGFzUXVlc3RvbkVycm9yKGNoYW5nZWRRdWVzdGlvbilcbiAgICAgIClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5kYXRhLm9uUm93Q2hhbmdlZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgY2hhbmdlZE5hbWUsXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICBuZXdDb2x1bW5WYWx1ZSA9PSBudWxsICYmICFjaGFuZ2VkUXVlc3Rpb25cbiAgICAgICk7XG4gICAgICB0aGlzLm9uQW55VmFsdWVDaGFuZ2VkKE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLlJvd1ZhcmlhYmxlTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVRdWVzdGlvbnNWYWx1ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbmV3Q29sdW1uVmFsdWU6IGFueSxcbiAgICBpc0NvbW1lbnQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLmRldGFpbFBhbmVsKSByZXR1cm47XG4gICAgdmFyIGNvbFF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5Q29sdW1uTmFtZShuYW1lKTtcbiAgICB2YXIgZGV0YWlsUXVlc3Rpb24gPSB0aGlzLmRldGFpbFBhbmVsLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgIGlmICghY29sUXVlc3Rpb24gfHwgIWRldGFpbFF1ZXN0aW9uKSByZXR1cm47XG4gICAgdmFyIGlzQ29sUXVlc3Rpb24gPSBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoXG4gICAgICBuZXdDb2x1bW5WYWx1ZSxcbiAgICAgIGlzQ29tbWVudCA/IGNvbFF1ZXN0aW9uLmNvbW1lbnQgOiBjb2xRdWVzdGlvbi52YWx1ZVxuICAgICk7XG4gICAgdmFyIHF1ZXN0aW9uID0gaXNDb2xRdWVzdGlvbiA/IGRldGFpbFF1ZXN0aW9uIDogY29sUXVlc3Rpb247XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IHRydWU7XG4gICAgaWYgKCFpc0NvbW1lbnQpIHtcbiAgICAgIHF1ZXN0aW9uLnZhbHVlID0gbmV3Q29sdW1uVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXN0aW9uLmNvbW1lbnQgPSBuZXdDb2x1bW5WYWx1ZTtcbiAgICB9XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNRdWVzdG9uRXJyb3IocXVlc3Rpb246IFF1ZXN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKCFxdWVzdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChcbiAgICAgIHF1ZXN0aW9uLmhhc0Vycm9ycyh0cnVlLCB7XG4gICAgICAgIGlzT25WYWx1ZUNoYW5nZWQ6ICF0aGlzLmRhdGEuaXNWYWxpZGF0ZU9uVmFsdWVDaGFuZ2luZyxcbiAgICAgIH0pXG4gICAgKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHF1ZXN0aW9uLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsQnlDb2x1bW5OYW1lKHF1ZXN0aW9uLm5hbWUpO1xuICAgIGlmICghY2VsbCB8fCAhY2VsbC5jb2x1bW4gfHwgIWNlbGwuY29sdW1uLmlzVW5pcXVlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5jaGVja0lmVmFsdWVJblJvd0R1cGxpY2F0ZWQodGhpcywgcXVlc3Rpb24pO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpIHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbCkge1xuICAgICAgaWYgKHZhbFtrZXldICE9PSB1bmRlZmluZWQgJiYgdmFsW2tleV0gIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlDb2x1bW4oY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IFF1ZXN0aW9uIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbEJ5Q29sdW1uKGNvbHVtbik7XG4gICAgcmV0dXJuICEhY2VsbCA/IGNlbGwucXVlc3Rpb24gOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsQnlDb2x1bW4oY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jZWxsc1tpXS5jb2x1bW4gPT0gY29sdW1uKSByZXR1cm4gdGhpcy5jZWxsc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDZWxsQnlDb2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jZWxsc1tpXS5jb2x1bW4ubmFtZSA9PSBjb2x1bW5OYW1lKSByZXR1cm4gdGhpcy5jZWxsc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbEJ5Q29sdW1uTmFtZShjb2x1bW5OYW1lKTtcbiAgICByZXR1cm4gISFjZWxsID8gY2VsbC5xdWVzdGlvbiA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldCBxdWVzdGlvbnMoKTogQXJyYXk8UXVlc3Rpb24+IHtcbiAgICB2YXIgcmVzOiBBcnJheTxRdWVzdGlvbj4gPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKHRoaXMuY2VsbHNbaV0ucXVlc3Rpb24pO1xuICAgIH1cbiAgICB2YXIgZGV0YWlsUXVlc3Rpb25zID0gISF0aGlzLmRldGFpbFBhbmVsID8gdGhpcy5kZXRhaWxQYW5lbC5xdWVzdGlvbnMgOiBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRldGFpbFF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goZGV0YWlsUXVlc3Rpb25zW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKG5hbWUpO1xuICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICByZXR1cm4gISF0aGlzLmRldGFpbFBhbmVsID8gdGhpcy5kZXRhaWxQYW5lbC5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uc0J5TmFtZShuYW1lOiBzdHJpbmcpOiBBcnJheTxRdWVzdGlvbj4ge1xuICAgIGxldCByZXMgPSBbXTtcbiAgICBsZXQgcSA9IHRoaXMuZ2V0UXVlc3Rpb25CeUNvbHVtbk5hbWUobmFtZSk7XG4gICAgaWYgKCEhcSkgcmVzLnB1c2gocSk7XG4gICAgaWYgKCEhdGhpcy5kZXRhaWxQYW5lbCkge1xuICAgICAgcSA9IHRoaXMuZGV0YWlsUGFuZWwuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgICBpZiAoISFxKSByZXMucHVzaChxKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoY29sdW1uTmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YVxuICAgICAgPyB0aGlzLmRhdGEuZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoY29sdW1uTmFtZSwgdGhpcylcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXModmFsOiBhbnkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKGtleSk7XG4gICAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgICAgdmFyIHFWYWwgPSBxdWVzdGlvbi52YWx1ZTtcbiAgICAgICAgcXVlc3Rpb24uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICAgICAgaWYgKCFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMocVZhbCwgcXVlc3Rpb24udmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZShrZXksIHF1ZXN0aW9uLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLmdldFNoYXJlZFF1ZXN0aW9uQnlOYW1lKGtleSkgJiZcbiAgICAgICAgICBrZXkuaW5kZXhPZihzZXR0aW5ncy5tYXRyaXhUb3RhbFZhbHVlUG9zdEZpeCkgPCAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUoa2V5LCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRNYXJrZG93bkh0bWwodGV4dCwgbmFtZSkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRSZW5kZXJlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0UmVuZGVyZXIobmFtZSkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9jZXNzZWRUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRQcm9jZXNzZWRUZXh0KHRleHQpIDogdGV4dDtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNlbGxzW2ldLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICAgIGlmICghIXRoaXMuZGV0YWlsUGFuZWwpIHtcbiAgICAgIHRoaXMuZGV0YWlsUGFuZWwubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHVwZGF0ZUNlbGxRdWVzdGlvbk9uQ29sdW1uQ2hhbmdlZChcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogYW55XG4gICkge1xuICAgIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsQnlDb2x1bW4oY29sdW1uKTtcbiAgICBpZiAoIWNlbGwpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZUNlbGxPbkNvbHVtbkNoYW5nZWQoY2VsbCwgbmFtZSwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDZWxsUXVlc3Rpb25PbkNvbHVtbkl0ZW1WYWx1ZUNoYW5nZWQoXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBvYmo6IEl0ZW1WYWx1ZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICBvbGRWYWx1ZTogYW55XG4gICkge1xuICAgIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsQnlDb2x1bW4oY29sdW1uKTtcbiAgICBpZiAoIWNlbGwpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZUNlbGxPbkNvbHVtbkl0ZW1WYWx1ZUNoYW5nZWQoXG4gICAgICBjZWxsLFxuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgb2JqLFxuICAgICAgbmFtZSxcbiAgICAgIG5ld1ZhbHVlLFxuICAgICAgb2xkVmFsdWVcbiAgICApO1xuICB9XG4gIHB1YmxpYyBvblF1ZXN0aW9uUmVhZE9ubHlDaGFuZ2VkKHBhcmVudElzUmVhZE9ubHk6IGJvb2xlYW4pIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5yZWFkT25seSA9IHBhcmVudElzUmVhZE9ubHk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgZmlyZUNhbGxiYWNrOiBib29sZWFuLFxuICAgIHJlYzogYW55LFxuICAgIHJhaXNlT25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnM6ICgpID0+IHZvaWRcbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIHZhciBjZWxscyA9IHRoaXMuY2VsbHM7XG4gICAgaWYgKCFjZWxscykgcmV0dXJuIHJlcztcbiAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY2VsbHMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICBpZiAoIWNlbGxzW2NvbEluZGV4XSkgY29udGludWU7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICBpZiAoIXF1ZXN0aW9uIHx8ICFxdWVzdGlvbi52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgIHF1ZXN0aW9uLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzID0gKGhhc0Vycm9yczogYm9vbGVhbikgPT4ge1xuICAgICAgICByYWlzZU9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzKCk7XG4gICAgICB9O1xuICAgICAgaWYgKCEhcmVjICYmIHJlYy5pc09uVmFsdWVDaGFuZ2VkID09PSB0cnVlICYmIHF1ZXN0aW9uLmlzRW1wdHkoKSlcbiAgICAgICAgY29udGludWU7XG4gICAgICByZXMgPSBxdWVzdGlvbi5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrLCByZWMpIHx8IHJlcztcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzUGFuZWwpIHtcbiAgICAgIHRoaXMuZW5zdXJlRGV0YWlsUGFuZWwoKTtcbiAgICAgIHZhciBwYW5lbEhhc0Vycm9yID0gdGhpcy5kZXRhaWxQYW5lbC5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrLCBmYWxzZSwgcmVjKTtcbiAgICAgIGlmICghcmVjLmhpZGVFcnJvcmVkUGFuZWwgJiYgcGFuZWxIYXNFcnJvciAmJiBmaXJlQ2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHJlYy5pc1NpbmdsZURldGFpbFBhbmVsKSB7XG4gICAgICAgICAgcmVjLmhpZGVFcnJvcmVkUGFuZWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd0RldGFpbFBhbmVsKCk7XG4gICAgICB9XG4gICAgICByZXMgPSBwYW5lbEhhc0Vycm9yIHx8IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVDZWxsT25Db2x1bW5DaGFuZ2VkKFxuICAgIGNlbGw6IE1hdHJpeERyb3Bkb3duQ2VsbCxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueVxuICApIHtcbiAgICBjZWxsLnF1ZXN0aW9uW25hbWVdID0gbmV3VmFsdWU7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUNlbGxPbkNvbHVtbkl0ZW1WYWx1ZUNoYW5nZWQoXG4gICAgY2VsbDogTWF0cml4RHJvcGRvd25DZWxsLFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIG9iajogSXRlbVZhbHVlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogYW55LFxuICAgIG9sZFZhbHVlOiBhbnlcbiAgKSB7XG4gICAgdmFyIGl0ZW1zID0gY2VsbC5xdWVzdGlvbltwcm9wZXJ0eU5hbWVdO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShpdGVtcykpIHJldHVybjtcbiAgICB2YXIgdmFsID0gbmFtZSA9PT0gXCJ2YWx1ZVwiID8gb2xkVmFsdWUgOiBvYmpbXCJ2YWx1ZVwiXTtcbiAgICB2YXIgaXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShpdGVtcywgdmFsKTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybjtcbiAgICBpdGVtW25hbWVdID0gbmV3VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGJ1aWxkQ2VsbHModmFsdWU6IGFueSkge1xuICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSB0cnVlO1xuICAgIHZhciBjb2x1bW5zID0gdGhpcy5kYXRhLmNvbHVtbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY29sdW1uID0gY29sdW1uc1tpXTtcbiAgICAgIGlmICghY29sdW1uLmlzVmlzaWJsZSkgY29udGludWU7XG4gICAgICB2YXIgY2VsbCA9IHRoaXMuY3JlYXRlQ2VsbChjb2x1bW4pO1xuICAgICAgdGhpcy5jZWxscy5wdXNoKGNlbGwpO1xuICAgICAgdmFyIGNlbGxWYWx1ZSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKHZhbHVlLCBjb2x1bW4ubmFtZSk7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KGNlbGxWYWx1ZSkpIHtcbiAgICAgICAgY2VsbC5xdWVzdGlvbi52YWx1ZSA9IGNlbGxWYWx1ZTtcbiAgICAgICAgdmFyIGNvbW1lbnRLZXkgPSBjb2x1bW4ubmFtZSArIHNldHRpbmdzLmNvbW1lbnRQcmVmaXg7XG4gICAgICAgIGlmICghIXZhbHVlICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZVtjb21tZW50S2V5XSkpIHtcbiAgICAgICAgICBjZWxsLnF1ZXN0aW9uLmNvbW1lbnQgPSB2YWx1ZVtjb21tZW50S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlID0gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDZWxsVmFsdWUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoISF0aGlzLmVkaXRpbmdPYmopXG4gICAgICByZXR1cm4gU2VyaWFsaXplci5nZXRPYmpQcm9wZXJ0eVZhbHVlKHRoaXMuZWRpdGluZ09iaiwgbmFtZSk7XG4gICAgcmV0dXJuICEhdmFsdWUgPyB2YWx1ZVtuYW1lXSA6IHVuZGVmaW5lZDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQ2VsbChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogTWF0cml4RHJvcGRvd25DZWxsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duQ2VsbChjb2x1bW4sIHRoaXMsIHRoaXMuZGF0YSk7XG4gIH1cbiAgZ2V0U3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0U3VydmV5KCkgOiBudWxsO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzLnRleHRQcmVQcm9jZXNzb3I7XG4gIH1cbiAgcHVibGljIGdldCByb3dJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRSb3dJbmRleCh0aGlzKSArIDEgOiAtMTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRpbmdPYmooKTogQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGluZ09ialZhbHVlO1xuICB9XG4gIHByaXZhdGUgb25FZGl0aW5nT2JqUHJvcGVydHlDaGFuZ2VkOiAoc2VuZGVyOiBCYXNlLCBvcHRpb25zOiBhbnkpID0+IHZvaWQ7XG4gIHByaXZhdGUgZWRpdGluZ09ialZhbHVlOiBCYXNlO1xuICBwdWJsaWMgZGlzcG9zZSgpIHtcbiAgICBpZiAoISF0aGlzLmVkaXRpbmdPYmopIHtcbiAgICAgIHRoaXMuZWRpdGluZ09iai5vblByb3BlcnR5Q2hhbmdlZC5yZW1vdmUoXG4gICAgICAgIHRoaXMub25FZGl0aW5nT2JqUHJvcGVydHlDaGFuZ2VkXG4gICAgICApO1xuICAgICAgdGhpcy5lZGl0aW5nT2JqVmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHN1YnNjcmliZVRvQ2hhbmdlcyh2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF2YWx1ZSB8fCAhdmFsdWUuZ2V0VHlwZSB8fCAhdmFsdWUub25Qcm9wZXJ0eUNoYW5nZWQpIHJldHVybjtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuZWRpdGluZ09iaikgcmV0dXJuO1xuICAgIHRoaXMuZWRpdGluZ09ialZhbHVlID0gPEJhc2U+dmFsdWU7XG4gICAgdGhpcy5vbkVkaXRpbmdPYmpQcm9wZXJ0eUNoYW5nZWQgPSAoc2VuZGVyOiBCYXNlLCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlT25TZXRWYWx1ZShvcHRpb25zLm5hbWUsIG9wdGlvbnMubmV3VmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5lZGl0aW5nT2JqLm9uUHJvcGVydHlDaGFuZ2VkLmFkZCh0aGlzLm9uRWRpdGluZ09ialByb3BlcnR5Q2hhbmdlZCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVPblNldFZhbHVlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSB0cnVlO1xuICAgIGxldCBxdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9uc0J5TmFtZShuYW1lKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duVG90YWxSb3dNb2RlbCBleHRlbmRzIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgY29uc3RydWN0b3IoZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YSkge1xuICAgIHN1cGVyKGRhdGEsIG51bGwpO1xuICAgIHRoaXMuYnVpbGRDZWxscyhudWxsKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQ2VsbChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogTWF0cml4RHJvcGRvd25DZWxsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duVG90YWxDZWxsKGNvbHVtbiwgdGhpcywgdGhpcy5kYXRhKTtcbiAgfVxuICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5kYXRhICYmICF0aGlzLmlzU2V0dGluZ1ZhbHVlKSB7XG4gICAgICB0aGlzLmRhdGEub25Ub3RhbFZhbHVlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgIHZhciBwcmV2VmFsdWU7XG4gICAgZG8ge1xuICAgICAgcHJldlZhbHVlID0gSGVscGVycy5nZXRVbmJpbmRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgY291bnRlcisrO1xuICAgIH0gd2hpbGUgKCFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMocHJldlZhbHVlLCB0aGlzLnZhbHVlKSAmJiBjb3VudGVyIDwgMyk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUNlbGxPbkNvbHVtbkNoYW5nZWQoXG4gICAgY2VsbDogTWF0cml4RHJvcGRvd25DZWxsLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogYW55XG4gICkge1xuICAgICg8TWF0cml4RHJvcGRvd25Ub3RhbENlbGw+Y2VsbCkudXBkYXRlQ2VsbFF1ZXN0aW9uKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwge1xuICBwcml2YXRlIHN0YXRpYyBjb3VudGVyID0gMTtcbiAgcHJpdmF0ZSBpZFZhbHVlOiBudW1iZXI7XG4gIHByaXZhdGUgaXRlbVZhbHVlOiBJdGVtVmFsdWU7XG4gIHB1YmxpYyBtaW5XaWR0aDogc3RyaW5nID0gXCJcIjtcbiAgcHVibGljIHdpZHRoOiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgbG9jVGl0bGU6IExvY2FsaXphYmxlU3RyaW5nO1xuICBwdWJsaWMgY2VsbDogTWF0cml4RHJvcGRvd25DZWxsO1xuICBwdWJsaWMgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbjtcbiAgcHVibGljIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2U7XG4gIHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb247XG4gIHB1YmxpYyBpc1JlbW92ZVJvdzogYm9vbGVhbjtcbiAgcHVibGljIGNob2ljZUluZGV4OiBudW1iZXI7XG4gIHB1YmxpYyBtYXRyaXg6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2U7XG4gIHB1YmxpYyByZXF1aXJlZFRleHQ6IHN0cmluZztcbiAgcHVibGljIGlzRW1wdHk6IGJvb2xlYW47XG4gIHB1YmxpYyBjb2xTcGFuczogbnVtYmVyID0gMTtcbiAgcHVibGljIHBhbmVsOiBQYW5lbE1vZGVsO1xuICBwdWJsaWMgaXNTaG93SGlkZURldGFpbDogYm9vbGVhbjtcbiAgcHVibGljIGlzQWN0aW9uc0NlbGw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nID0gXCJcIjtcbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaWRWYWx1ZSA9IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwuY291bnRlcisrO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzUXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWVzdGlvbjtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMubG9jVGl0bGU7XG4gIH1cbiAgcHVibGljIGdldCBoYXNQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnBhbmVsO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pZFZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0Vycm9yT25Ub3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0Vycm9yT25Db3JlKFwidG9wXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0Vycm9yT25Cb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0Vycm9yT25Db3JlKFwiYm90dG9tXCIpO1xuICB9XG4gIHByaXZhdGUgc2hvd0Vycm9yT25Db3JlKGxvY2F0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5nZXRTaG93RXJyb3JMb2NhdGlvbigpID09IGxvY2F0aW9uICYmXG4gICAgICAoIXRoaXMuaXNDaG9pY2UgfHwgdGhpcy5pc0ZpcnN0Q2hvaWNlKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRTaG93RXJyb3JMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmhhc1F1ZXN0aW9uID8gdGhpcy5xdWVzdGlvbi5zdXJ2ZXkucXVlc3Rpb25FcnJvckxvY2F0aW9uIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBpdGVtKHZhbDogSXRlbVZhbHVlKSB7XG4gICAgdGhpcy5pdGVtVmFsdWUgPSB2YWw7XG4gICAgaWYgKCEhdmFsKSB7XG4gICAgICB2YWwuaGlkZUNhcHRpb24gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ2hvaWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuaXRlbTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNob2ljZVZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDaG9pY2UgPyB0aGlzLml0ZW0udmFsdWUgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDaGVja2JveCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Nob2ljZSAmJiB0aGlzLnF1ZXN0aW9uLmdldFR5cGUoKSA9PSBcImNoZWNrYm94XCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0ZpcnN0Q2hvaWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNob2ljZUluZGV4ID09PSAwO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2xhc3NOYW1lICtcbiAgICAgICh0aGlzLnF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwID8gXCIgXCIgKyB0aGlzLnF1ZXN0aW9uLmNzc0Vycm9yIDogXCJcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgaGVhZGVycygpOiBzdHJpbmcge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY2VsbCAmJlxuICAgICAgdGhpcy5jZWxsLmNvbHVtbiAmJlxuICAgICAgdGhpcy5jZWxsLmNvbHVtbi5pc1Nob3dJbk11bHRpcGxlQ29sdW1uc1xuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbS5sb2NUZXh0LnJlbmRlcmVkSHRtbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVlc3Rpb24gJiYgdGhpcy5xdWVzdGlvbi5pc1Zpc2libGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzVGl0bGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCB8fCBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGVGaW5hbENsYXNzTmFtZShtYXRyaXhDc3NDbGFzc2VzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHF1ZXN0aW9uQ3NzID0gdGhpcy5jZWxsLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgbGV0IGNsYXNzTmFtZSA9IFwiXCI7XG4gICAgaWYgKCEhcXVlc3Rpb25Dc3MpIHtcbiAgICAgIGNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICBpZiAoISFxdWVzdGlvbkNzcy5pdGVtVmFsdWUpIHtcbiAgICAgICAgY2xhc3NOYW1lICs9IFwiIFwiICsgcXVlc3Rpb25Dc3MuaXRlbVZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKCEhcXVlc3Rpb25Dc3MuYXNDZWxsKSB7XG4gICAgICAgIGlmICghIWNsYXNzTmFtZSkgY2xhc3NOYW1lICs9IFwiXCI7XG4gICAgICAgIGNsYXNzTmFtZSArPSBxdWVzdGlvbkNzcy5hc0NlbGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghY2xhc3NOYW1lICYmICEhbWF0cml4Q3NzQ2xhc3Nlcykge1xuICAgICAgY2xhc3NOYW1lID0gbWF0cml4Q3NzQ2xhc3Nlcy5jZWxsO1xuICAgIH1cbiAgICBjbGFzc05hbWUgKz1cbiAgICAgIHRoaXMucXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDAgPyBcIiBcIiArIHF1ZXN0aW9uQ3NzLmhhc0Vycm9yIDogXCJcIjtcblxuICAgIGlmICh0aGlzLmlzQ2hvaWNlKSB7XG4gICAgICBjbGFzc05hbWUgKz0gXCIgXCIgKyBtYXRyaXhDc3NDbGFzc2VzLmNob2ljZUNlbGw7XG4gICAgfVxuICAgIC8vJ3RleHQtYWxpZ24nOiAkZGF0YS5pc0Nob2ljZSA/ICdjZW50ZXInOiAnJ1xuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyB7XG4gIHB1YmxpYyBpc0RldGFpbFJvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZTtcbiAgcHJpdmF0ZSBzdGF0aWMgY291bnRlciA9IDE7XG4gIHByaXZhdGUgaWRWYWx1ZTogbnVtYmVyO1xuICBwdWJsaWMgY2VsbHM6IEFycmF5PFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGw+ID0gW107XG4gIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZyA9IFwiXCI7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlkVmFsdWUgPSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cuY291bnRlcisrO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pZFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSBleHRlbmRzIEJhc2Uge1xuICBwcml2YXRlIGhlYWRlclJvd1ZhbHVlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c7XG4gIHByaXZhdGUgZm9vdGVyUm93VmFsdWU6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdztcbiAgcHJpdmF0ZSBoYXNSZW1vdmVSb3dzVmFsdWU6IGJvb2xlYW47XG4gIHByaXZhdGUgcm93c0FjdGlvbnM6IEFycmF5PEFycmF5PElBY3Rpb24+PjtcbiAgcHJpdmF0ZSBjc3NDbGFzc2VzOiBhbnk7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgbWF0cml4OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicm93c1wiKTtcbiAgICB0aGlzLmJ1aWxkKCk7XG4gIH1cbiAgcHVibGljIGdldCBzaG93VGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dUYWJsZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHNob3dIZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dIZWFkZXJcIik7XG4gIH1cbiAgcHVibGljIGdldCBzaG93QWRkUm93T25Ub3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dBZGRSb3dPblRvcFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIGdldCBzaG93QWRkUm93T25Cb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dBZGRSb3dPbkJvdHRvbVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIGdldCBzaG93Rm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeC5oYXNGb290ZXIgJiYgdGhpcy5tYXRyaXguaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZm9vdGVyUm93O1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzUmVtb3ZlUm93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNSZW1vdmVSb3dzVmFsdWU7XG4gIH1cbiAgcHVibGljIGlzUmVxdWlyZVJlc2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmhhc1JlbW92ZVJvd3MgIT0gdGhpcy5tYXRyaXguY2FuUmVtb3ZlUm93cyB8fFxuICAgICAgIXRoaXMubWF0cml4LmlzQ29sdW1uTGF5b3V0SG9yaXpvbnRhbFxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBoZWFkZXJSb3coKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93IHtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJSb3dWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGZvb3RlclJvdygpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cge1xuICAgIHJldHVybiB0aGlzLmZvb3RlclJvd1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgcm93cygpOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiKTtcbiAgfVxuICBwcm90ZWN0ZWQgYnVpbGQoKSB7XG4gICAgdGhpcy5oYXNSZW1vdmVSb3dzVmFsdWUgPSB0aGlzLm1hdHJpeC5jYW5SZW1vdmVSb3dzO1xuICAgIC8vYnVpbGQgcm93cyBub3dcbiAgICB2YXIgcm93cyA9IHRoaXMubWF0cml4LnZpc2libGVSb3dzO1xuICAgIHRoaXMuY3NzQ2xhc3NlcyA9IHRoaXMubWF0cml4LmNzc0NsYXNzZXM7XG4gICAgdGhpcy5idWlsZFJvd3NBY3Rpb25zKCk7XG4gICAgdGhpcy5idWlsZEhlYWRlcigpO1xuICAgIHRoaXMuYnVpbGRSb3dzKCk7XG4gICAgdGhpcy5idWlsZEZvb3RlcigpO1xuICAgIHRoaXMudXBkYXRlU2hvd1RhYmxlQW5kQWRkUm93KCk7XG4gIH1cbiAgcHVibGljIHVwZGF0ZVNob3dUYWJsZUFuZEFkZFJvdygpIHtcbiAgICB2YXIgc2hvd1RhYmxlID1cbiAgICAgIHRoaXMucm93cy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLm1hdHJpeC5pc0Rlc2lnbk1vZGUgfHxcbiAgICAgICF0aGlzLm1hdHJpeC5nZXRTaG93Q29sdW1uc0lmRW1wdHkoKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93VGFibGVcIiwgc2hvd1RhYmxlKTtcbiAgICB2YXIgc2hvd0FkZFJvdyA9IHRoaXMubWF0cml4LmNhbkFkZFJvdyAmJiBzaG93VGFibGU7XG4gICAgdmFyIHNob3dBZGRSb3dPblRvcCA9IHNob3dBZGRSb3c7XG4gICAgdmFyIHNob3dBZGRSb3dPbkJvdHRvbSA9IHNob3dBZGRSb3c7XG4gICAgaWYgKHNob3dBZGRSb3dPblRvcCkge1xuICAgICAgaWYgKHRoaXMubWF0cml4LmdldEFkZFJvd0xvY2F0aW9uKCkgPT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIHNob3dBZGRSb3dPblRvcCA9IHRoaXMubWF0cml4LmNvbHVtbkxheW91dCA9PT0gXCJ2ZXJ0aWNhbFwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd0FkZFJvd09uVG9wID0gdGhpcy5tYXRyaXguZ2V0QWRkUm93TG9jYXRpb24oKSAhPT0gXCJib3R0b21cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNob3dBZGRSb3dPbkJvdHRvbSAmJiB0aGlzLm1hdHJpeC5nZXRBZGRSb3dMb2NhdGlvbigpICE9PSBcInRvcEJvdHRvbVwiKSB7XG4gICAgICBzaG93QWRkUm93T25Cb3R0b20gPSAhc2hvd0FkZFJvd09uVG9wO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93QWRkUm93T25Ub3BcIiwgc2hvd0FkZFJvd09uVG9wKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93QWRkUm93T25Cb3R0b21cIiwgc2hvd0FkZFJvd09uQm90dG9tKTtcbiAgfVxuICBwdWJsaWMgb25BZGRlZFJvdygpIHtcbiAgICBpZiAodGhpcy5nZXRSZW5kZXJlZERhdGFSb3dDb3VudCgpID49IHRoaXMubWF0cml4LnZpc2libGVSb3dzLmxlbmd0aClcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcm93ID0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3NbdGhpcy5tYXRyaXgudmlzaWJsZVJvd3MubGVuZ3RoIC0gMV07XG4gICAgdGhpcy5yb3dzQWN0aW9ucy5wdXNoKHRoaXMuYnVpbGRSb3dBY3Rpb25zKHJvdykpO1xuICAgIHRoaXMuYWRkSG9yaXpvbnRhbFJvdyhcbiAgICAgIHRoaXMucm93cyxcbiAgICAgIHJvdyxcbiAgICAgIHRoaXMubWF0cml4LnZpc2libGVSb3dzLmxlbmd0aCA9PSAxICYmICF0aGlzLm1hdHJpeC5zaG93SGVhZGVyXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVNob3dUYWJsZUFuZEFkZFJvdygpO1xuICB9XG4gIHByaXZhdGUgZ2V0UmVuZGVyZWREYXRhUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLnJvd3NbaV0uaXNEZXRhaWxSb3cpIHJlcysrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBvblJlbW92ZWRSb3cocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSkge1xuICAgIHZhciByb3dJbmRleCA9IHRoaXMuZ2V0UmVuZGVyZWRSb3dJbmRleChyb3cpO1xuICAgIGlmIChyb3dJbmRleCA8IDApIHJldHVybjtcbiAgICB0aGlzLnJvd3NBY3Rpb25zLnNwbGljZShyb3dJbmRleCwgMSk7XG4gICAgdmFyIHJlbW92ZUNvdW50ID0gMTtcbiAgICBpZiAoXG4gICAgICByb3dJbmRleCA8IHRoaXMucm93cy5sZW5ndGggLSAxICYmXG4gICAgICB0aGlzLnJvd3Nbcm93SW5kZXggKyAxXS5pc0RldGFpbFJvd1xuICAgICkge1xuICAgICAgcmVtb3ZlQ291bnQrKztcbiAgICB9XG4gICAgdGhpcy5yb3dzLnNwbGljZShyb3dJbmRleCwgcmVtb3ZlQ291bnQpO1xuICAgIHRoaXMudXBkYXRlU2hvd1RhYmxlQW5kQWRkUm93KCk7XG4gIH1cbiAgcHVibGljIG9uRGV0YWlsUGFuZWxDaGFuZ2VWaXNpYmlsaXR5KFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgaXNTaG93aW5nOiBib29sZWFuXG4gICkge1xuICAgIHZhciByb3dJbmRleCA9IHRoaXMuZ2V0UmVuZGVyZWRSb3dJbmRleChyb3cpO1xuICAgIGlmIChyb3dJbmRleCA8IDApIHJldHVybjtcbiAgICB2YXIgcGFuZWxSb3dJbmRleCA9XG4gICAgICByb3dJbmRleCA8IHRoaXMucm93cy5sZW5ndGggLSAxICYmIHRoaXMucm93c1tyb3dJbmRleCArIDFdLmlzRGV0YWlsUm93XG4gICAgICAgID8gcm93SW5kZXggKyAxXG4gICAgICAgIDogLTE7XG4gICAgaWYgKChpc1Nob3dpbmcgJiYgcGFuZWxSb3dJbmRleCA+IC0xKSB8fCAoIWlzU2hvd2luZyAmJiBwYW5lbFJvd0luZGV4IDwgMCkpXG4gICAgICByZXR1cm47XG4gICAgaWYgKGlzU2hvd2luZykge1xuICAgICAgdmFyIGRldGFpbFJvdyA9IHRoaXMuY3JlYXRlRGV0YWlsUGFuZWxSb3cocm93LCB0aGlzLnJvd3Nbcm93SW5kZXhdKTtcbiAgICAgIHRoaXMucm93cy5zcGxpY2Uocm93SW5kZXggKyAxLCAwLCBkZXRhaWxSb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvd3Muc3BsaWNlKHBhbmVsUm93SW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFJlbmRlcmVkUm93SW5kZXgocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IG51bWJlciB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnJvd3NbaV0ucm93ID09IHJvdykgcmV0dXJuIGk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBwcm90ZWN0ZWQgYnVpbGRSb3dzQWN0aW9ucygpIHtcbiAgICB0aGlzLnJvd3NBY3Rpb25zID0gW107XG4gICAgdmFyIHJvd3MgPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucm93c0FjdGlvbnMucHVzaCh0aGlzLmJ1aWxkUm93QWN0aW9ucyhyb3dzW2ldKSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBidWlsZEhlYWRlcigpIHtcbiAgICB2YXIgY29sSGVhZGVycyA9XG4gICAgICB0aGlzLm1hdHJpeC5pc0NvbHVtbkxheW91dEhvcml6b250YWwgJiYgdGhpcy5tYXRyaXguc2hvd0hlYWRlcjtcbiAgICB2YXIgaXNTaG93biA9XG4gICAgICBjb2xIZWFkZXJzIHx8XG4gICAgICAodGhpcy5tYXRyaXguaGFzUm93VGV4dCAmJiAhdGhpcy5tYXRyaXguaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93SGVhZGVyXCIsIGlzU2hvd24pO1xuICAgIGlmICghaXNTaG93bikgcmV0dXJuO1xuICAgIHRoaXMuaGVhZGVyUm93VmFsdWUgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93KCk7XG4gICAgaWYgKHRoaXMuaGFzQWN0aW9uQ2VsbEluUm93cyhcInN0YXJ0XCIpKSB7XG4gICAgICB0aGlzLmhlYWRlclJvdy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlSGVhZGVyQ2VsbChudWxsKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdHJpeC5oYXNSb3dUZXh0ICYmIHRoaXMubWF0cml4LnNob3dIZWFkZXIpIHtcbiAgICAgIHRoaXMuaGVhZGVyUm93LmNlbGxzLnB1c2godGhpcy5jcmVhdGVIZWFkZXJDZWxsKG51bGwpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0cml4LmlzQ29sdW1uTGF5b3V0SG9yaXpvbnRhbCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1hdHJpeC52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5tYXRyaXgudmlzaWJsZUNvbHVtbnNbaV07XG4gICAgICAgIGlmICghY29sdW1uLmhhc1Zpc2libGVDZWxsKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGNvbHVtbi5pc1Nob3dJbk11bHRpcGxlQ29sdW1ucykge1xuICAgICAgICAgIHRoaXMuY3JlYXRlTXV0bGlwbGVDb2x1bW5zSGVhZGVyKGNvbHVtbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5oZWFkZXJSb3cuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZUhlYWRlckNlbGwoY29sdW1uKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJvd3MgPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmhlYWRlclJvdy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlVGV4dENlbGwocm93c1tpXS5sb2NUZXh0KSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5tYXRyaXguaGFzRm9vdGVyKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyUm93LmNlbGxzLnB1c2goXG4gICAgICAgICAgdGhpcy5jcmVhdGVUZXh0Q2VsbCh0aGlzLm1hdHJpeC5nZXRGb290ZXJUZXh0KCkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0FjdGlvbkNlbGxJblJvd3MoXCJlbmRcIikpIHtcbiAgICAgIHRoaXMuaGVhZGVyUm93LmNlbGxzLnB1c2godGhpcy5jcmVhdGVIZWFkZXJDZWxsKG51bGwpKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGJ1aWxkRm9vdGVyKCkge1xuICAgIGlmICghdGhpcy5zaG93Rm9vdGVyKSByZXR1cm47XG4gICAgdGhpcy5mb290ZXJSb3dWYWx1ZSA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3coKTtcbiAgICBpZiAodGhpcy5oYXNBY3Rpb25DZWxsSW5Sb3dzKFwic3RhcnRcIikpIHtcbiAgICAgIHRoaXMuZm9vdGVyUm93LmNlbGxzLnB1c2godGhpcy5jcmVhdGVIZWFkZXJDZWxsKG51bGwpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0cml4Lmhhc1Jvd1RleHQpIHtcbiAgICAgIHRoaXMuZm9vdGVyUm93LmNlbGxzLnB1c2goXG4gICAgICAgIHRoaXMuY3JlYXRlVGV4dENlbGwodGhpcy5tYXRyaXguZ2V0Rm9vdGVyVGV4dCgpKVxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIGNlbGxzID0gdGhpcy5tYXRyaXgudmlzaWJsZVRvdGFsUm93LmNlbGxzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjZWxsID0gY2VsbHNbaV07XG4gICAgICBpZiAoIWNlbGwuY29sdW1uLmhhc1Zpc2libGVDZWxsKSBjb250aW51ZTtcbiAgICAgIGlmIChjZWxsLmNvbHVtbi5pc1Nob3dJbk11bHRpcGxlQ29sdW1ucykge1xuICAgICAgICB0aGlzLmNyZWF0ZU11dGxpcGxlQ29sdW1uc0Zvb3Rlcih0aGlzLmZvb3RlclJvdywgY2VsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvb3RlclJvdy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlRWRpdENlbGwoY2VsbCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5oYXNBY3Rpb25DZWxsSW5Sb3dzKFwiZW5kXCIpKSB7XG4gICAgICB0aGlzLmZvb3RlclJvdy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlSGVhZGVyQ2VsbChudWxsKSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBidWlsZFJvd3MoKSB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLm1hdHJpeC5pc0NvbHVtbkxheW91dEhvcml6b250YWxcbiAgICAgID8gdGhpcy5idWlsZEhvcml6b250YWxSb3dzKClcbiAgICAgIDogdGhpcy5idWlsZFZlcnRpY2FsUm93cygpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIiwgcm93cyk7XG4gIH1cbiAgcHJpdmF0ZSBoYXNBY3Rpb25DZWxsSW5Sb3dzVmFsdWVzOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBoYXNBY3Rpb25DZWxsSW5Sb3dzKGxvY2F0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaGFzQWN0aW9uQ2VsbEluUm93c1ZhbHVlc1tsb2NhdGlvbl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJvd3MgPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cztcbiAgICAgIHRoaXMuaGFzQWN0aW9uQ2VsbEluUm93c1ZhbHVlc1tsb2NhdGlvbl0gPSBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZ2V0Um93QWN0aW9ucyhpLCBsb2NhdGlvbikpKSB7XG4gICAgICAgICAgdGhpcy5oYXNBY3Rpb25DZWxsSW5Sb3dzVmFsdWVzW2xvY2F0aW9uXSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaGFzQWN0aW9uQ2VsbEluUm93c1ZhbHVlc1tsb2NhdGlvbl07XG4gIH1cbiAgcHJpdmF0ZSBjYW5SZW1vdmVSb3cocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeC5jYW5SZW1vdmVSb3cocm93KTtcbiAgfVxuICBwcml2YXRlIGJ1aWxkSG9yaXpvbnRhbFJvd3MoKTogQXJyYXk8UXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93PiB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cztcbiAgICB2YXIgcmVuZGVyZWRSb3dzOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFkZEhvcml6b250YWxSb3coXG4gICAgICAgIHJlbmRlcmVkUm93cyxcbiAgICAgICAgcm93c1tpXSxcbiAgICAgICAgaSA9PSAwICYmICF0aGlzLm1hdHJpeC5zaG93SGVhZGVyXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVuZGVyZWRSb3dzO1xuICB9XG4gIHByaXZhdGUgYWRkSG9yaXpvbnRhbFJvdyhcbiAgICByZW5kZXJlZFJvd3M6IEFycmF5PFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdz4sXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICB1c2VBc0hlYWRlcjogYm9vbGVhblxuICApIHtcbiAgICB2YXIgcmVuZGVyZWRSb3cgPSB0aGlzLmNyZWF0ZUhvcml6b250YWxSb3cocm93LCB1c2VBc0hlYWRlcik7XG4gICAgcmVuZGVyZWRSb3cucm93ID0gcm93O1xuICAgIHJlbmRlcmVkUm93cy5wdXNoKHJlbmRlcmVkUm93KTtcbiAgICBpZiAocm93LmlzRGV0YWlsUGFuZWxTaG93aW5nKSB7XG4gICAgICByZW5kZXJlZFJvd3MucHVzaCh0aGlzLmNyZWF0ZURldGFpbFBhbmVsUm93KHJvdywgcmVuZGVyZWRSb3cpKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRSb3dBY3Rpb25zQ2VsbChyb3dJbmRleDogbnVtYmVyLCBsb2NhdGlvbjogXCJzdGFydFwiIHwgXCJlbmRcIikge1xuICAgIGNvbnN0IHJvd0FjdGlvbnMgPSB0aGlzLmdldFJvd0FjdGlvbnMocm93SW5kZXgsIGxvY2F0aW9uKTtcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHJvd0FjdGlvbnMpKSB7XG4gICAgICBjb25zdCBjZWxsID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwoKTtcbiAgICAgIGNvbnN0IGFjdGlvbkNvbnRhaW5lciA9IG5ldyBBZGFwdGl2ZUFjdGlvbkNvbnRhaW5lcigpO1xuICAgICAgYWN0aW9uQ29udGFpbmVyLnNldEl0ZW1zKHJvd0FjdGlvbnMpO1xuXG4gICAgICBjb25zdCBpdGVtVmFsdWUgPSBuZXcgSXRlbVZhbHVlKGFjdGlvbkNvbnRhaW5lcik7XG4gICAgICBjZWxsLml0ZW0gPSBpdGVtVmFsdWU7XG4gICAgICBjZWxsLmlzQWN0aW9uc0NlbGwgPSB0cnVlO1xuICAgICAgY2VsbC5jbGFzc05hbWUgPSB0aGlzLmNzc0NsYXNzZXMuYWN0aW9uc0NlbGw7XG4gICAgICBjZWxsLnJvdyA9IHRoaXMubWF0cml4LnZpc2libGVSb3dzW3Jvd0luZGV4XTtcbiAgICAgIHJldHVybiBjZWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcml2YXRlIGdldFJvd0FjdGlvbnMocm93SW5kZXg6IG51bWJlciwgbG9jYXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCIpIHtcbiAgICB2YXIgYWN0aW9ucyA9IHRoaXMucm93c0FjdGlvbnNbcm93SW5kZXhdO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhY3Rpb25zKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIWFjdGlvbi5sb2NhdGlvbikge1xuICAgICAgICBhY3Rpb24ubG9jYXRpb24gPSBcInN0YXJ0XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWN0aW9uLmxvY2F0aW9uID09PSBsb2NhdGlvbjtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGJ1aWxkUm93QWN0aW9ucyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogQXJyYXk8SUFjdGlvbj4ge1xuICAgIHZhciBhY3Rpb25zOiBBcnJheTxJQWN0aW9uPiA9IFtdO1xuICAgIHRoaXMuc2V0RGVmYXVsdFJvd0FjdGlvbnMocm93LCBhY3Rpb25zKTtcbiAgICBpZiAoISF0aGlzLm1hdHJpeC5zdXJ2ZXkpIHtcbiAgICAgIGFjdGlvbnMgPSB0aGlzLm1hdHJpeC5zdXJ2ZXkuZ2V0VXBkYXRlZE1hdHJpeFJvd0FjdGlvbnMoXG4gICAgICAgIHRoaXMubWF0cml4LFxuICAgICAgICByb3csXG4gICAgICAgIGFjdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhY3Rpb25zO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0Um93QWN0aW9ucyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGFjdGlvbnM6IEFycmF5PElBY3Rpb24+XG4gICkge1xuICAgIGlmICh0aGlzLmhhc1JlbW92ZVJvd3MgJiYgdGhpcy5jYW5SZW1vdmVSb3cocm93KSkge1xuICAgICAgYWN0aW9ucy5wdXNoKFxuICAgICAgICBuZXcgQWN0aW9uKHtcbiAgICAgICAgICBpZDogXCJyZW1vdmUtcm93XCIsXG4gICAgICAgICAgbG9jYXRpb246IFwiZW5kXCIsXG4gICAgICAgICAgZW5hYmxlZDogIXRoaXMubWF0cml4LmlzSW5wdXRSZWFkT25seSxcbiAgICAgICAgICBjb21wb25lbnQ6IFwic3YtbWF0cml4LXJlbW92ZS1idXR0b25cIixcbiAgICAgICAgICBkYXRhOiB7IHJvdzogcm93LCBxdWVzdGlvbjogdGhpcy5tYXRyaXggfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJvdy5oYXNQYW5lbCkge1xuICAgICAgYWN0aW9ucy5wdXNoKFxuICAgICAgICBuZXcgQWN0aW9uKHtcbiAgICAgICAgICBpZDogXCJzaG93LWRldGFpbFwiLFxuICAgICAgICAgIGxvY2F0aW9uOiBcInN0YXJ0XCIsXG4gICAgICAgICAgY29tcG9uZW50OiBcInN2LW1hdHJpeC1kZXRhaWwtYnV0dG9uXCIsXG4gICAgICAgICAgZGF0YTogeyByb3c6IHJvdywgcXVlc3Rpb246IHRoaXMubWF0cml4IH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNyZWF0ZUhvcml6b250YWxSb3coXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICB1c2VBc0hlYWRlcjogYm9vbGVhblxuICApOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cge1xuICAgIHZhciByZXMgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93KCk7XG4gICAgdGhpcy5hZGRSb3dBY3Rpb25zQ2VsbChyb3csIHJlcywgXCJzdGFydFwiKTtcbiAgICBpZiAodGhpcy5tYXRyaXguaGFzUm93VGV4dCkge1xuICAgICAgdmFyIHJlbmRlcmVkQ2VsbCA9IHRoaXMuY3JlYXRlVGV4dENlbGwocm93LmxvY1RleHQpO1xuICAgICAgcmVuZGVyZWRDZWxsLnJvdyA9IHJvdztcbiAgICAgIHJlcy5jZWxscy5wdXNoKHJlbmRlcmVkQ2VsbCk7XG4gICAgICBpZiAodXNlQXNIZWFkZXIpIHtcbiAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsV2lkdGgobnVsbCwgcmVuZGVyZWRDZWxsKTtcbiAgICAgIH1cbiAgICAgIGlmIChyb3cuaGFzUGFuZWwgJiYgISF0aGlzLmNzc0NsYXNzZXMuZGV0YWlsUm93VGV4dCkge1xuICAgICAgICBpZiAoISFyZW5kZXJlZENlbGwuY2xhc3NOYW1lKSByZW5kZXJlZENlbGwuY2xhc3NOYW1lICs9IFwiIFwiO1xuICAgICAgICByZW5kZXJlZENlbGwuY2xhc3NOYW1lICs9IHRoaXMuY3NzQ2xhc3Nlcy5kZXRhaWxSb3dUZXh0O1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbaV07XG4gICAgICBpZiAoIWNlbGwuY29sdW1uLmhhc1Zpc2libGVDZWxsKSBjb250aW51ZTtcbiAgICAgIGlmIChjZWxsLmNvbHVtbi5pc1Nob3dJbk11bHRpcGxlQ29sdW1ucykge1xuICAgICAgICB0aGlzLmNyZWF0ZU11dGxpcGxlRWRpdENlbGxzKHJlcywgY2VsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVuZGVyZWRDZWxsID0gdGhpcy5jcmVhdGVFZGl0Q2VsbChjZWxsKTtcbiAgICAgICAgcmVzLmNlbGxzLnB1c2gocmVuZGVyZWRDZWxsKTtcbiAgICAgICAgaWYgKHVzZUFzSGVhZGVyKSB7XG4gICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsV2lkdGgoY2VsbC5jb2x1bW4sIHJlbmRlcmVkQ2VsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRSb3dBY3Rpb25zQ2VsbChyb3csIHJlcywgXCJlbmRcIik7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGFkZFJvd0FjdGlvbnNDZWxsKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcmVuZGVyZWRSb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyxcbiAgICBsb2NhdGlvbjogXCJzdGFydFwiIHwgXCJlbmRcIlxuICApIHtcbiAgICB2YXIgcm93SW5kZXggPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cy5pbmRleE9mKHJvdyk7XG4gICAgaWYgKHRoaXMuaGFzQWN0aW9uQ2VsbEluUm93cyhsb2NhdGlvbikpIHtcbiAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmdldFJvd0FjdGlvbnNDZWxsKHJvd0luZGV4LCBsb2NhdGlvbik7XG4gICAgICBpZiAoISFhY3Rpb25zKSB7XG4gICAgICAgIHJlbmRlcmVkUm93LmNlbGxzLnB1c2goYWN0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY2VsbCA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKCk7XG4gICAgICAgIGNlbGwuaXNFbXB0eSA9IHRydWU7XG4gICAgICAgIHJlbmRlcmVkUm93LmNlbGxzLnB1c2goY2VsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY3JlYXRlRGV0YWlsUGFuZWxSb3coXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICByZW5kZXJlZFJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93XG4gICk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyB7XG4gICAgdmFyIHJlcyA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3coKTtcbiAgICByZXMucm93ID0gcm93O1xuICAgIHJlcy5jbGFzc05hbWUgKz0gdGhpcy5jc3NDbGFzc2VzLmRldGFpbFJvdztcbiAgICByZXMuaXNEZXRhaWxSb3cgPSB0cnVlO1xuICAgIHZhciBidXR0b25DZWxsID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwoKTtcbiAgICBpZiAodGhpcy5tYXRyaXguaGFzUm93VGV4dCkge1xuICAgICAgYnV0dG9uQ2VsbC5jb2xTcGFucyA9IDI7XG4gICAgfVxuICAgIGJ1dHRvbkNlbGwuaXNFbXB0eSA9IHRydWU7XG4gICAgcmVzLmNlbGxzLnB1c2goYnV0dG9uQ2VsbCk7XG4gICAgdmFyIGFjdGlvbnNDZWxsID0gbnVsbDtcbiAgICBpZiAodGhpcy5oYXNBY3Rpb25DZWxsSW5Sb3dzKFwiZW5kXCIpKSB7XG4gICAgICBhY3Rpb25zQ2VsbCA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKCk7XG4gICAgICBhY3Rpb25zQ2VsbC5pc0VtcHR5ID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGNlbGwgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCgpO1xuICAgIGNlbGwucGFuZWwgPSByb3cuZGV0YWlsUGFuZWw7XG4gICAgY2VsbC5jb2xTcGFucyA9XG4gICAgICByZW5kZXJlZFJvdy5jZWxscy5sZW5ndGggLVxuICAgICAgYnV0dG9uQ2VsbC5jb2xTcGFucyAtXG4gICAgICAoISFhY3Rpb25zQ2VsbCA/IGFjdGlvbnNDZWxsLmNvbFNwYW5zIDogMCk7XG4gICAgY2VsbC5jbGFzc05hbWUgPSB0aGlzLmNzc0NsYXNzZXMuZGV0YWlsUGFuZWxDZWxsO1xuICAgIHJlcy5jZWxscy5wdXNoKGNlbGwpO1xuICAgIGlmICghIWFjdGlvbnNDZWxsKSB7XG4gICAgICByZXMuY2VsbHMucHVzaChhY3Rpb25zQ2VsbCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiB0aGlzLm1hdHJpeC5vbkNyZWF0ZURldGFpbFBhbmVsUmVuZGVyZWRSb3dDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICB0aGlzLm1hdHJpeC5vbkNyZWF0ZURldGFpbFBhbmVsUmVuZGVyZWRSb3dDYWxsYmFjayhyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFZlcnRpY2FsUm93cygpOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+IHtcbiAgICB2YXIgY29sdW1ucyA9IHRoaXMubWF0cml4LmNvbHVtbnM7XG4gICAgdmFyIHJlbmRlcmVkUm93cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbCA9IGNvbHVtbnNbaV07XG4gICAgICBpZiAoY29sLmlzVmlzaWJsZSAmJiBjb2wuaGFzVmlzaWJsZUNlbGwpIHtcbiAgICAgICAgaWYgKGNvbC5pc1Nob3dJbk11bHRpcGxlQ29sdW1ucykge1xuICAgICAgICAgIHRoaXMuY3JlYXRlTXV0bGlwbGVWZXJ0aWNhbFJvd3MocmVuZGVyZWRSb3dzLCBjb2wsIGkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbmRlcmVkUm93cy5wdXNoKHRoaXMuY3JlYXRlVmVydGljYWxSb3coY29sLCBpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzQWN0aW9uQ2VsbEluUm93cyhcImVuZFwiKSkge1xuICAgICAgcmVuZGVyZWRSb3dzLnB1c2godGhpcy5jcmVhdGVFbmRWZXJ0aWNhbEFjdGlvblJvdygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbmRlcmVkUm93cztcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU11dGxpcGxlVmVydGljYWxSb3dzKFxuICAgIHJlbmRlcmVkUm93czogQXJyYXk8UXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93PixcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKSB7XG4gICAgdmFyIGNob2ljZXMgPSB0aGlzLmdldE11bHRpcGxlQ29sdW1uQ2hvaWNlcyhjb2x1bW4pO1xuICAgIGlmICghY2hvaWNlcykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVuZGVyZWRSb3dzLnB1c2godGhpcy5jcmVhdGVWZXJ0aWNhbFJvdyhjb2x1bW4sIGluZGV4LCBjaG9pY2VzW2ldLCBpKSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY3JlYXRlVmVydGljYWxSb3coXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGNob2ljZTogSXRlbVZhbHVlID0gbnVsbCxcbiAgICBjaG9pY2VJbmRleDogbnVtYmVyID0gLTFcbiAgKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93IHtcbiAgICB2YXIgcmVzID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdygpO1xuICAgIGlmICh0aGlzLm1hdHJpeC5zaG93SGVhZGVyKSB7XG4gICAgICB2YXIgbFRpdGxlID0gISFjaG9pY2UgPyBjaG9pY2UubG9jVGV4dCA6IGNvbHVtbi5sb2NUaXRsZTtcbiAgICAgIHZhciBoQ2VsbCA9IHRoaXMuY3JlYXRlVGV4dENlbGwobFRpdGxlKTtcbiAgICAgIGhDZWxsLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgIGlmICghY2hvaWNlKSB7XG4gICAgICAgIHRoaXMuc2V0UmVxdXJpZWRUb0hlYWRlckNlbGwoY29sdW1uLCBoQ2VsbCk7XG4gICAgICB9XG4gICAgICByZXMuY2VsbHMucHVzaChoQ2VsbCk7XG4gICAgfVxuICAgIHZhciByb3dzID0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgckNob2ljZSA9IGNob2ljZTtcbiAgICAgIHZhciByQ2hvaWNlSW5kZXggPSBjaG9pY2VJbmRleCA+PSAwID8gY2hvaWNlSW5kZXggOiBpO1xuICAgICAgdmFyIGNlbGwgPSByb3dzW2ldLmNlbGxzW2luZGV4XTtcbiAgICAgIHZhciB2aXNDaG9pY2VzID0gISFjaG9pY2UgPyBjZWxsLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCEhdmlzQ2hvaWNlcyAmJiByQ2hvaWNlSW5kZXggPCB2aXNDaG9pY2VzLmxlbmd0aCkge1xuICAgICAgICByQ2hvaWNlID0gdmlzQ2hvaWNlc1tyQ2hvaWNlSW5kZXhdO1xuICAgICAgfVxuICAgICAgdmFyIHJDZWxsID0gdGhpcy5jcmVhdGVFZGl0Q2VsbChjZWxsLCByQ2hvaWNlKTtcbiAgICAgIHJDZWxsLml0ZW0gPSByQ2hvaWNlO1xuICAgICAgckNlbGwuY2hvaWNlSW5kZXggPSByQ2hvaWNlSW5kZXg7XG4gICAgICByZXMuY2VsbHMucHVzaChyQ2VsbCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdHJpeC5oYXNUb3RhbCkge1xuICAgICAgcmVzLmNlbGxzLnB1c2goXG4gICAgICAgIHRoaXMuY3JlYXRlRWRpdENlbGwodGhpcy5tYXRyaXgudmlzaWJsZVRvdGFsUm93LmNlbGxzW2luZGV4XSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGNyZWF0ZUVuZFZlcnRpY2FsQWN0aW9uUm93KCk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyB7XG4gICAgdmFyIHJlcyA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3coKTtcbiAgICBpZiAodGhpcy5tYXRyaXguc2hvd0hlYWRlcikge1xuICAgICAgcmVzLmNlbGxzLnB1c2godGhpcy5jcmVhdGVUZXh0Q2VsbChudWxsKSk7XG4gICAgfVxuICAgIHZhciByb3dzID0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMuY2VsbHMucHVzaCh0aGlzLmdldFJvd0FjdGlvbnNDZWxsKGksIFwiZW5kXCIpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF0cml4Lmhhc1RvdGFsKSB7XG4gICAgICByZXMuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZVRleHRDZWxsKG51bGwpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU11dGxpcGxlRWRpdENlbGxzKFxuICAgIHJSb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyxcbiAgICBjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwsXG4gICAgaXNGb290ZXI6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB2YXIgY2hvaWNlcyA9IGlzRm9vdGVyXG4gICAgICA/IHRoaXMuZ2V0TXVsdGlwbGVDb2x1bW5DaG9pY2VzKGNlbGwuY29sdW1uKVxuICAgICAgOiBjZWxsLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzO1xuICAgIGlmICghY2hvaWNlcykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJDZWxsID0gdGhpcy5jcmVhdGVFZGl0Q2VsbChjZWxsLCAhaXNGb290ZXIgPyBjaG9pY2VzW2ldIDogdW5kZWZpbmVkKTtcbiAgICAgIGlmICghaXNGb290ZXIpIHtcbiAgICAgICAgLy9yQ2VsbC5pdGVtID0gY2hvaWNlc1tpXTtcbiAgICAgICAgckNlbGwuY2hvaWNlSW5kZXggPSBpO1xuICAgICAgfVxuICAgICAgclJvdy5jZWxscy5wdXNoKHJDZWxsKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVFZGl0Q2VsbChcbiAgICBjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwsXG4gICAgY2hvaWNlSXRlbTogYW55ID0gdW5kZWZpbmVkXG4gICk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwge1xuICAgIHZhciByZXMgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCgpO1xuICAgIHJlcy5jZWxsID0gY2VsbDtcbiAgICByZXMucm93ID0gY2VsbC5yb3c7XG4gICAgcmVzLnF1ZXN0aW9uID0gY2VsbC5xdWVzdGlvbjtcbiAgICByZXMubWF0cml4ID0gdGhpcy5tYXRyaXg7XG4gICAgcmVzLml0ZW0gPSBjaG9pY2VJdGVtO1xuXG4gICAgcmVzLmNsYXNzTmFtZSA9IHJlcy5jYWxjdWxhdGVGaW5hbENsYXNzTmFtZSh0aGlzLmNzc0NsYXNzZXMpO1xuICAgIC8vcmVzLmNzcyA9IHJlcy5jYWxjQ3NzKHRoaXMuY3NzQ2xhc3Nlcy5jZWxsKTtcblxuICAgIC8vIHZhciBxdWVzdGlvbkNzcyA9IGNlbGwucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICAvLyB2YXIgY2xhc3NOYW1lID0gXCJcIjtcbiAgICAvLyBpZiAoISFxdWVzdGlvbkNzcykge1xuICAgIC8vICAgY2xhc3NOYW1lID0gXCJcIjtcbiAgICAvLyAgIGlmICghIXF1ZXN0aW9uQ3NzLml0ZW1WYWx1ZSkge1xuICAgIC8vICAgICBjbGFzc05hbWUgKz0gXCIgXCIgKyBxdWVzdGlvbkNzcy5pdGVtVmFsdWU7XG4gICAgLy8gICB9XG4gICAgLy8gICBpZiAoISFxdWVzdGlvbkNzcy5hc0NlbGwpIHtcbiAgICAvLyAgICAgaWYgKCEhY2xhc3NOYW1lKSBjbGFzc05hbWUgKz0gXCJcIjtcbiAgICAvLyAgICAgY2xhc3NOYW1lICs9IHF1ZXN0aW9uQ3NzLmFzQ2VsbDtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gICAgLy8gaWYgKCFjbGFzc05hbWUgJiYgISF0aGlzLmNzc0NsYXNzZXMuY2VsbCkge1xuICAgIC8vICAgY2xhc3NOYW1lID0gdGhpcy5jc3NDbGFzc2VzLmNlbGw7XG4gICAgLy8gfVxuICAgIC8vcmVzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTXV0bGlwbGVDb2x1bW5zRm9vdGVyKFxuICAgIHJSb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyxcbiAgICBjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGxcbiAgKSB7XG4gICAgdGhpcy5jcmVhdGVNdXRsaXBsZUVkaXRDZWxscyhyUm93LCBjZWxsLCB0cnVlKTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU11dGxpcGxlQ29sdW1uc0hlYWRlcihjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSB7XG4gICAgdmFyIGNob2ljZXMgPSB0aGlzLmdldE11bHRpcGxlQ29sdW1uQ2hvaWNlcyhjb2x1bW4pO1xuICAgIGlmICghY2hvaWNlcykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGwgPSB0aGlzLmNyZWF0ZVRleHRDZWxsKGNob2ljZXNbaV0ubG9jVGV4dCk7XG4gICAgICB0aGlzLnNldEhlYWRlckNlbGwoY29sdW1uLCBjZWxsKTtcbiAgICAgIHRoaXMuaGVhZGVyUm93LmNlbGxzLnB1c2goY2VsbCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0TXVsdGlwbGVDb2x1bW5DaG9pY2VzKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBhbnkge1xuICAgIHZhciBjaG9pY2VzID0gY29sdW1uLnRlbXBsYXRlUXVlc3Rpb24uY2hvaWNlcztcbiAgICBpZiAoISFjaG9pY2VzICYmIEFycmF5LmlzQXJyYXkoY2hvaWNlcykgJiYgY2hvaWNlcy5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybiB0aGlzLm1hdHJpeC5jaG9pY2VzO1xuICAgIGNob2ljZXMgPSBjb2x1bW4udGVtcGxhdGVRdWVzdGlvbi52aXNpYmxlQ2hvaWNlcztcbiAgICBpZiAoIWNob2ljZXMgfHwgIUFycmF5LmlzQXJyYXkoY2hvaWNlcykpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBjaG9pY2VzO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlSGVhZGVyQ2VsbChcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uXG4gICk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwge1xuICAgIHZhciBjZWxsID0gdGhpcy5jcmVhdGVUZXh0Q2VsbCghIWNvbHVtbiA/IGNvbHVtbi5sb2NUaXRsZSA6IG51bGwpO1xuICAgIGNlbGwuY29sdW1uID0gY29sdW1uO1xuICAgIHRoaXMuc2V0SGVhZGVyQ2VsbChjb2x1bW4sIGNlbGwpO1xuICAgIGlmICh0aGlzLmNzc0NsYXNzZXMuaGVhZGVyQ2VsbCkge1xuICAgICAgY2VsbC5jbGFzc05hbWUgPSB0aGlzLmNzc0NsYXNzZXMuaGVhZGVyQ2VsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNlbGw7XG4gIH1cbiAgcHJpdmF0ZSBzZXRIZWFkZXJDZWxsKFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbFxuICApIHtcbiAgICB0aGlzLnNldEhlYWRlckNlbGxXaWR0aChjb2x1bW4sIGNlbGwpO1xuICAgIHRoaXMuc2V0UmVxdXJpZWRUb0hlYWRlckNlbGwoY29sdW1uLCBjZWxsKTtcbiAgfVxuICBwcml2YXRlIHNldEhlYWRlckNlbGxXaWR0aChcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGxcbiAgKSB7XG4gICAgY2VsbC5taW5XaWR0aCA9IGNvbHVtbiAhPSBudWxsID8gdGhpcy5tYXRyaXguZ2V0Q29sdW1uV2lkdGgoY29sdW1uKSA6IFwiXCI7XG4gICAgY2VsbC53aWR0aCA9IGNvbHVtbiAhPSBudWxsID8gY29sdW1uLndpZHRoIDogdGhpcy5tYXRyaXguZ2V0Um93VGl0bGVXaWR0aCgpO1xuICB9XG4gIHByaXZhdGUgc2V0UmVxdXJpZWRUb0hlYWRlckNlbGwoXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBjZWxsOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsXG4gICkge1xuICAgIGlmICghIWNvbHVtbiAmJiBjb2x1bW4uaXNSZXF1aXJlZCAmJiB0aGlzLm1hdHJpeC5zdXJ2ZXkpIHtcbiAgICAgIGNlbGwucmVxdWlyZWRUZXh0ID0gdGhpcy5tYXRyaXguc3VydmV5LnJlcXVpcmVkVGV4dDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVSZW1vdmVSb3dDZWxsKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbiAgKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCB7XG4gICAgdmFyIHJlcyA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKCk7XG4gICAgcmVzLnJvdyA9IHJvdztcbiAgICByZXMuaXNSZW1vdmVSb3cgPSB0aGlzLmNhblJlbW92ZVJvdyhyb3cpO1xuICAgIGlmICghIXRoaXMuY3NzQ2xhc3Nlcy5jZWxsKSB7XG4gICAgICByZXMuY2xhc3NOYW1lID0gdGhpcy5jc3NDbGFzc2VzLmNlbGw7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVUZXh0Q2VsbChcbiAgICBsb2NUaXRsZTogTG9jYWxpemFibGVTdHJpbmdcbiAgKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCB7XG4gICAgdmFyIGNlbGwgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCgpO1xuICAgIGNlbGwubG9jVGl0bGUgPSBsb2NUaXRsZTtcbiAgICBpZiAoISF0aGlzLmNzc0NsYXNzZXMuY2VsbCkge1xuICAgICAgY2VsbC5jbGFzc05hbWUgPSB0aGlzLmNzc0NsYXNzZXMuY2VsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNlbGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIG1hdHJpeCBkcm9wZG93biBhbmQgbWF0cml4IGR5bmFtaWMgcXVlc3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICBleHRlbmRzIFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsPFxuICAgIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIE1hdHJpeERyb3Bkb3duQ29sdW1uXG4gID5cbiAgaW1wbGVtZW50cyBJTWF0cml4RHJvcGRvd25EYXRhIHtcbiAgcHVibGljIHN0YXRpYyBnZXQgZGVmYXVsdENlbGxUeXBlKCkge1xuICAgIHJldHVybiBzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Q2VsbFR5cGU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgZGVmYXVsdENlbGxUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3MubWF0cml4RGVmYXVsdENlbGxUeXBlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgYWRkRGVmYXVsdENvbHVtbnMobWF0cml4OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlKSB7XG4gICAgdmFyIGNvbE5hbWVzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xOYW1lcy5sZW5ndGg7IGkrKykgbWF0cml4LmFkZENvbHVtbihjb2xOYW1lc1tpXSk7XG4gIH1cbiAgcHJpdmF0ZSBkZXRhaWxQYW5lbFZhbHVlOiBQYW5lbE1vZGVsO1xuICBwcm90ZWN0ZWQgaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICBjb2x1bW5zQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBvblJlbmRlcmVkVGFibGVSZXNldENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBvblJlbmRlcmVkVGFibGVDcmVhdGVkQ2FsbGJhY2s6IChcbiAgICB0YWJsZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGVcbiAgKSA9PiB2b2lkO1xuICBvbkNlbGxDcmVhdGVkQ2FsbGJhY2s6IChvcHRpb25zOiBhbnkpID0+IHZvaWQ7XG4gIG9uQ2VsbFZhbHVlQ2hhbmdlZENhbGxiYWNrOiAob3B0aW9uczogYW55KSA9PiB2b2lkO1xuICBvbkhhc0RldGFpbFBhbmVsQ2FsbGJhY2s6IChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSA9PiBib29sZWFuO1xuICBvbkNyZWF0ZURldGFpbFBhbmVsQ2FsbGJhY2s6IChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHBhbmVsOiBQYW5lbE1vZGVsXG4gICkgPT4gdm9pZDtcbiAgb25DcmVhdGVEZXRhaWxQYW5lbFJlbmRlcmVkUm93Q2FsbGJhY2s6IChcbiAgICByZW5kZXJlZFJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93XG4gICkgPT4gdm9pZDtcblxuICBwcm90ZWN0ZWQgY3JlYXRlQ29sdW1uVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ld0FycmF5KFxuICAgICAgXCJjb2x1bW5zXCIsXG4gICAgICAoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGl0ZW0uY29sT3duZXIgPSB0aGlzO1xuICAgICAgfSxcbiAgICAgIChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgaXRlbS5jb2xPd25lciA9IG51bGw7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcImNob2ljZXNcIik7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHRoaXMpO1xuICAgIHRoaXMuZGV0YWlsUGFuZWxWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3RGV0YWlsUGFuZWwoKTtcbiAgICB0aGlzLmRldGFpbFBhbmVsLnNlbGVjdGVkRWxlbWVudEluRGVzaWduID0gdGhpcztcbiAgICB0aGlzLmRldGFpbFBhbmVsLnJlbmRlcldpZHRoID0gXCIxMDAlXCI7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwiY29sdW1uc1wiLFxuICAgICAgKG5ld0NvbHVtbnM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnNJbmRleGVzKG5ld0NvbHVtbnMpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jbGVhclJvd3NBbmRSZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJjZWxsVHlwZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbHVtbnNDZWxsVHlwZSgpO1xuICAgICAgdGhpcy5jbGVhclJvd3NBbmRSZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJvcHRpb25zQ2FwdGlvblwiLCBcImNvbHVtbkNvbENvdW50XCIsIFwicm93VGl0bGVXaWR0aFwiLCBcImNob2ljZXNcIl0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xlYXJSb3dzQW5kUmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXG4gICAgICAgIFwiY29sdW1uTGF5b3V0XCIsXG4gICAgICAgIFwiYWRkUm93TG9jYXRpb25cIixcbiAgICAgICAgXCJoaWRlQ29sdW1uc0lmRW1wdHlcIixcbiAgICAgICAgXCJzaG93SGVhZGVyXCIsXG4gICAgICAgIFwibWluUm93Q291bnRcIixcbiAgICAgICAgXCJpc1JlYWRPbmx5XCIsXG4gICAgICAgIFwicm93Q291bnRcIixcbiAgICAgICAgXCJoYXNGb290ZXJcIixcbiAgICAgICAgXCJkZXRhaWxQYW5lbE1vZGVcIixcbiAgICAgIF0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB0aGlzLmNsZWFyR2VuZXJhdGVkUm93cygpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzU2luZ2xlSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSb3dzRHluYW1pYygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGl0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZChcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9sZFZhbHVlOiBhbnksXG4gICAgbmV3VmFsdWU6IGFueVxuICApIHtcbiAgICBzdXBlci5pdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoaXRlbSwgbmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICBpZiAoaXRlbS5vd25lclByb3BlcnR5TmFtZSA9PT0gXCJjaG9pY2VzXCIpIHtcbiAgICAgIHRoaXMuY2xlYXJSb3dzQW5kUmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgY29sdW1uTGF5b3V0IHRvICd2ZXJ0aWNhbCcgdG8gcGxhY2UgY29sdW1ucyB2ZXJ0aWNhbGx5IGFuZCByb3dzIGhvcml6b250YWxseS4gSXQgbWFrZXMgc2Vuc2Ugd2hlbiB3ZSBoYXZlIG1hbnkgY29sdW1ucyBhbmQgZmV3IHJvd3MuXG4gICAqIEBzZWUgY29sdW1uc1xuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbHVtbkxheW91dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5MYXlvdXRcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb2x1bW5MYXlvdXQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5MYXlvdXRcIiwgdmFsKTtcbiAgfVxuICBnZXQgY29sdW1uc0xvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uTGF5b3V0O1xuICB9XG4gIHNldCBjb2x1bW5zTG9jYXRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbHVtbkxheW91dCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGNvbHVtbnMgYXJlIGxvY2F0ZWQgaG9yaXpvbnRhbGx5XG4gICAqIEBzZWUgY29sdW1uTGF5b3V0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQ29sdW1uTGF5b3V0SG9yaXpvbnRhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5MYXlvdXQgIT0gXCJ2ZXJ0aWNhbFwiO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIHZhbHVlIHRvIFwidW5kZXJSb3dcIiB0byBzaG93IHRoZSBkZXRhaWxQYW5lbCB1bmRlciB0aGUgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCBkZXRhaWxQYW5lbE1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGV0YWlsUGFuZWxNb2RlXCIsIFwibm9uZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRldGFpbFBhbmVsTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRldGFpbFBhbmVsTW9kZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGV0YWlsIHRlbXBsYXRlIFBhbmVsLiBUaGlzIHBhbmVsIGlzIHVzZWQgYXMgYSB0ZW1wbGF0ZSBvbiBjcmVhdGluZyBkZXRhaWwgcGFuZWwgZm9yIGEgcm93LlxuICAgKiBAc2VlICBkZXRhaWxFbGVtZW50c1xuICAgKiBAc2VlIGRldGFpbFBhbmVsTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBkZXRhaWxQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5kZXRhaWxQYW5lbFZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRQYW5lbCgpOiBJUGFuZWwge1xuICAgIHJldHVybiB0aGlzLmRldGFpbFBhbmVsO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgUGFuZWwgZWxlbWVudHMsIHF1ZXN0aW9ucyBhbmQgcGFuZWxzLlxuICAgKiBAc2VlICBkZXRhaWxQYW5lbFxuICAgKiBAc2VlIGRldGFpbFBhbmVsTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBkZXRhaWxFbGVtZW50cygpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLmRldGFpbFBhbmVsLmVsZW1lbnRzO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdEZXRhaWxQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gU2VyaWFsaXplci5jcmVhdGVDbGFzcyhcInBhbmVsXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzUm93VGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0Rm9vdGVyVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldCBjYW5BZGRSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgY2FuUmVtb3ZlUm93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGNhblJlbW92ZVJvdyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUm93c0NoYW5nZWQoKSB7XG4gICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICBzdXBlci5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSBsb2NrUmVzZXRSZW5kZXJlZFRhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBvblN0YXJ0Um93QWRkaW5nUmVtb3ZpbmcoKSB7XG4gICAgdGhpcy5sb2NrUmVzZXRSZW5kZXJlZFRhYmxlID0gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25FbmRSb3dBZGRpbmcoKSB7XG4gICAgdGhpcy5sb2NrUmVzZXRSZW5kZXJlZFRhYmxlID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLnJlbmRlcmVkVGFibGUpIHJldHVybjtcbiAgICBpZiAodGhpcy5yZW5kZXJlZFRhYmxlLmlzUmVxdWlyZVJlc2V0KCkpIHtcbiAgICAgIHRoaXMucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuZGVyZWRUYWJsZS5vbkFkZGVkUm93KCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkVuZFJvd1JlbW92aW5nKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpIHtcbiAgICB0aGlzLmxvY2tSZXNldFJlbmRlcmVkVGFibGUgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5yZW5kZXJlZFRhYmxlLmlzUmVxdWlyZVJlc2V0KCkpIHtcbiAgICAgIHRoaXMucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghIXJvdykge1xuICAgICAgICB0aGlzLnJlbmRlcmVkVGFibGUub25SZW1vdmVkUm93KHJvdyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0IHJlbmRlcmVkVGFibGVWYWx1ZSgpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcmVkVGFibGVcIiwgbnVsbCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgcmVuZGVyZWRUYWJsZVZhbHVlKHZhbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZFRhYmxlXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNsZWFyUm93c0FuZFJlc2V0UmVuZGVyZWRUYWJsZSgpIHtcbiAgICB0aGlzLmNsZWFyR2VuZXJhdGVkUm93cygpO1xuICAgIHRoaXMucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb2x1bW5zQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVzZXRSZW5kZXJlZFRhYmxlKCkge1xuICAgIGlmICh0aGlzLmxvY2tSZXNldFJlbmRlcmVkVGFibGUgfHwgdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMucmVuZGVyZWRUYWJsZVZhbHVlID0gbnVsbDtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLm9uUmVuZGVyZWRUYWJsZVJlc2V0Q2FsbGJhY2spO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhckdlbmVyYXRlZFJvd3MoKSB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgc3VwZXIuY2xlYXJHZW5lcmF0ZWRSb3dzKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlbmRlcmVkVGFibGUoKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUge1xuICAgIGlmICghdGhpcy5yZW5kZXJlZFRhYmxlVmFsdWUpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRUYWJsZVZhbHVlID0gdGhpcy5jcmVhdGVSZW5kZXJlZFRhYmxlKCk7XG4gICAgICBpZiAoISF0aGlzLm9uUmVuZGVyZWRUYWJsZUNyZWF0ZWRDYWxsYmFjaykge1xuICAgICAgICB0aGlzLm9uUmVuZGVyZWRUYWJsZUNyZWF0ZWRDYWxsYmFjayh0aGlzLnJlbmRlcmVkVGFibGVWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVkVGFibGVWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUmVuZGVyZWRUYWJsZSgpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25NYXRyaXhSb3dDcmVhdGVkKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm47XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICByb3dWYWx1ZTogcm93LnZhbHVlLFxuICAgICAgcm93OiByb3csXG4gICAgICBjb2x1bW46IDxhbnk+bnVsbCxcbiAgICAgIGNvbHVtbk5hbWU6IDxhbnk+bnVsbCxcbiAgICAgIGNlbGw6IDxhbnk+bnVsbCxcbiAgICAgIGNlbGxRdWVzdGlvbjogPGFueT5udWxsLFxuICAgICAgdmFsdWU6IDxhbnk+bnVsbCxcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgb3B0aW9ucy5jb2x1bW4gPSB0aGlzLnZpc2libGVDb2x1bW5zW2ldO1xuICAgICAgb3B0aW9ucy5jb2x1bW5OYW1lID0gb3B0aW9ucy5jb2x1bW4ubmFtZTtcbiAgICAgIHZhciBjZWxsID0gcm93LmNlbGxzW2ldO1xuICAgICAgb3B0aW9ucy5jZWxsID0gY2VsbDtcbiAgICAgIG9wdGlvbnMuY2VsbFF1ZXN0aW9uID0gY2VsbC5xdWVzdGlvbjtcbiAgICAgIG9wdGlvbnMudmFsdWUgPSBjZWxsLnZhbHVlO1xuICAgICAgaWYgKCEhdGhpcy5vbkNlbGxDcmVhdGVkQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vbkNlbGxDcmVhdGVkQ2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aGlzLnN1cnZleS5tYXRyaXhDZWxsQ3JlYXRlZCh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBjZWxsIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNlbGxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIsIHNldHRpbmdzLm1hdHJpeERlZmF1bHRDZWxsVHlwZSk7XG4gIH1cbiAgcHVibGljIHNldCBjZWxsVHlwZSh2YWw6IHN0cmluZykge1xuICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zQ2VsbFR5cGUoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY29sdW1uc1tpXS5kZWZhdWx0Q2VsbFR5cGVDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uc0luZGV4ZXMoY29sczogQXJyYXk8TWF0cml4RHJvcGRvd25Db2x1bW4+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb2xzW2ldLnNldEluZGV4KGkpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgY29sdW1uIGNvdW50IGZvciByYWRpb2dyb3VwIGFuZCBjaGVja2JveCAgY2VsbCB0eXBlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29sdW1uQ29sQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uQ29sQ291bnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBjb2x1bW5Db2xDb3VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDQpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5Db2xDb3VudFwiLCB2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgbWluaW11bSBjb2x1bW4gd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbHVtbk1pbldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbk1pbldpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sdW1uTWluV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5NaW5XaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIHNob3cgdGhlIGhvcml6b250YWwgc2Nyb2xsLlxuICAgKi9cbiAgcHVibGljIGdldCBob3Jpem9udGFsU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJob3Jpem9udGFsU2Nyb2xsXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhvcml6b250YWxTY3JvbGwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaG9yaXpvbnRhbFNjcm9sbFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRSZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHQgOiBcIlwiO1xuICB9XG4gIG9uQ29sdW1uUHJvcGVydHlDaGFuZ2VkKFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgdGhpcy51cGRhdGVIYXNGb290ZXIoKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0udXBkYXRlQ2VsbFF1ZXN0aW9uT25Db2x1bW5DaGFuZ2VkKFxuICAgICAgICBjb2x1bW4sXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG5ld1ZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmdlbmVyYXRlZFRvdGFsUm93KSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93LnVwZGF0ZUNlbGxRdWVzdGlvbk9uQ29sdW1uQ2hhbmdlZChcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBuYW1lLFxuICAgICAgICBuZXdWYWx1ZVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5vbkNvbHVtbnNDaGFuZ2VkKCk7XG4gICAgaWYgKG5hbWUgPT0gXCJpc1JlcXVpcmVkXCIpIHtcbiAgICAgIHRoaXMucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgfVxuICAgIGlmIChjb2x1bW4uaXNTaG93SW5NdWx0aXBsZUNvbHVtbnMpIHtcbiAgICAgIHRoaXMub25TaG93SW5NdWx0aXBsZUNvbHVtbnNDaGFuZ2VkKGNvbHVtbik7XG4gICAgfVxuICB9XG4gIG9uQ29sdW1uSXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkKFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgb2JqOiBJdGVtVmFsdWUsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgb2xkVmFsdWU6IGFueVxuICApIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0udXBkYXRlQ2VsbFF1ZXN0aW9uT25Db2x1bW5JdGVtVmFsdWVDaGFuZ2VkKFxuICAgICAgICBjb2x1bW4sXG4gICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgb2JqLFxuICAgICAgICBuYW1lLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgb2xkVmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgb25TaG93SW5NdWx0aXBsZUNvbHVtbnNDaGFuZ2VkKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pIHtcbiAgICB0aGlzLmNsZWFyR2VuZXJhdGVkUm93cygpO1xuICAgIHRoaXMucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gIH1cbiAgb25Db2x1bW5DZWxsVHlwZUNoYW5nZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikge1xuICAgIHRoaXMuY2xlYXJHZW5lcmF0ZWRSb3dzKCk7XG4gICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgfVxuICBwdWJsaWMgZ2V0Um93VGl0bGVXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJoYXNGb290ZXJcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBnZXRBZGRSb3dMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImRlZmF1bHRcIjtcbiAgfVxuICBwdWJsaWMgZ2V0U2hvd0NvbHVtbnNJZkVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlU2hvd1RhYmxlQW5kQWRkUm93KCkge1xuICAgIGlmICghIXRoaXMucmVuZGVyZWRUYWJsZSkge1xuICAgICAgdGhpcy5yZW5kZXJlZFRhYmxlLnVwZGF0ZVNob3dUYWJsZUFuZEFkZFJvdygpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlSGFzRm9vdGVyKCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc0Zvb3RlclwiLCB0aGlzLmhhc1RvdGFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RvdGFsKCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jb2x1bW5zW2ldLmhhc1RvdGFsKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldENlbGxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbFR5cGU7XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICB2YXIgY29sdW1uTmFtZSA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChwYXRoW2ldID09IFwiLlwiKSBicmVhaztcbiAgICAgIGNvbHVtbk5hbWUgPSBwYXRoW2ldICsgY29sdW1uTmFtZTtcbiAgICB9XG4gICAgdmFyIGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcXVlc3Rpb24gPSBjb2x1bW4uY3JlYXRlQ2VsbFF1ZXN0aW9uKG51bGwpO1xuICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiBxdWVzdGlvbi5nZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5jbGVhckluY29ycmVjdFZhbHVlcyh0aGlzLmdldFJvd1ZhbHVlKGkpKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIHN1cGVyLmNsZWFyRXJyb3JzKCk7XG4gICAgaWYgKCEhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJvdy5jZWxscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHJvdy5jZWxsc1tqXS5xdWVzdGlvbi5jbGVhckVycm9ycygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICB2YXIgcHJldlRvdGFsVmFsdWU7XG4gICAgZG8ge1xuICAgICAgcHJldlRvdGFsVmFsdWUgPSBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHRoaXMudG90YWxWYWx1ZSk7XG4gICAgICB0aGlzLnJ1bkNlbGxzQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgICB0aGlzLnJ1blRvdGFsc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgY291bnRlcisrO1xuICAgIH0gd2hpbGUgKFxuICAgICAgIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhwcmV2VG90YWxWYWx1ZSwgdGhpcy50b3RhbFZhbHVlKSAmJlxuICAgICAgY291bnRlciA8IDNcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBzaG91bGRSdW5Db2x1bW5FeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuQ2VsbHNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWVzID0gdGhpcy5nZXRSb3dDb25kaXRpb25WYWx1ZXModmFsdWVzKTtcbiAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzW2ldLnJ1bkNvbmRpdGlvbihuZXdWYWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrQ29sdW1uc1Zpc2liaWxpdHkoKTtcbiAgfVxuICBwcml2YXRlIGNoZWNrQ29sdW1uc1Zpc2liaWxpdHkoKSB7XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlQ29sdW1uc1tpXS52aXNpYmxlSWYpIGNvbnRpbnVlO1xuICAgICAgaGFzQ2hhbmdlZCA9XG4gICAgICAgIHRoaXMuaXNDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLnZpc2libGVDb2x1bW5zW2ldKSB8fCBoYXNDaGFuZ2VkO1xuICAgIH1cbiAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc0NvbHVtblZpc2liaWxpdHlDaGFuZ2VkKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBib29sZWFuIHtcbiAgICB2YXIgY3VyVmlzID0gY29sdW1uLmhhc1Zpc2libGVDZWxsO1xuICAgIHZhciBoYXNWaXNDZWxsID0gZmFsc2U7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGwgPSByb3dzW2ldLmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICBpZiAoISFjZWxsICYmICEhY2VsbC5xdWVzdGlvbiAmJiBjZWxsLnF1ZXN0aW9uLmlzVmlzaWJsZSkge1xuICAgICAgICBoYXNWaXNDZWxsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJWaXMgIT0gaGFzVmlzQ2VsbCkge1xuICAgICAgY29sdW1uLmhhc1Zpc2libGVDZWxsID0gaGFzVmlzQ2VsbDtcbiAgICB9XG4gICAgcmV0dXJuIGN1clZpcyAhPSBoYXNWaXNDZWxsO1xuICB9XG4gIHByb3RlY3RlZCBydW5Ub3RhbHNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVG90YWxSb3cpIHJldHVybjtcbiAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93LnJ1bkNvbmRpdGlvbihcbiAgICAgIHRoaXMuZ2V0Um93Q29uZGl0aW9uVmFsdWVzKHZhbHVlcyksXG4gICAgICBwcm9wZXJ0aWVzXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldFJvd0NvbmRpdGlvblZhbHVlcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KTogSGFzaFRhYmxlPGFueT4ge1xuICAgIHZhciBuZXdWYWx1ZXMgPSB2YWx1ZXM7XG4gICAgaWYgKCFuZXdWYWx1ZXMpIG5ld1ZhbHVlcyA9IHt9O1xuICAgIC8qXG4gICAgdmFyIG5ld1ZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIG5ld1ZhbHVlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWVzKSk7XG4gICAgfVxuICAgICovXG4gICAgdmFyIHRvdGFsUm93ID0ge307XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLnRvdGFsVmFsdWUpKSB7XG4gICAgICB0b3RhbFJvdyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy50b3RhbFZhbHVlKSk7XG4gICAgfVxuICAgIG5ld1ZhbHVlc1tcInJvd1wiXSA9IHt9O1xuICAgIG5ld1ZhbHVlc1tcInRvdGFsUm93XCJdID0gdG90YWxSb3c7XG4gICAgcmV0dXJuIG5ld1ZhbHVlcztcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB2YXIgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbHVtbnNbaV0ubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLmdlbmVyYXRlZFRvdGFsUm93KSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93LmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gYnkgaXQncyBuYW1lLiBSZXR1cm5zIG51bGwgaWYgYSBjb2x1bW4gd2l0aCB0aGlzIG5hbWUgZG9lc24ndCBleGlzdC5cbiAgICogQHBhcmFtIGNvbHVtblxuICAgKi9cbiAgcHVibGljIGdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lOiBzdHJpbmcpOiBNYXRyaXhEcm9wZG93bkNvbHVtbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbnNbaV0ubmFtZSA9PSBjb2x1bW5OYW1lKSByZXR1cm4gdGhpcy5jb2x1bW5zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRDb2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IE1hdHJpeERyb3Bkb3duQ29sdW1uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbHVtbiB3aWR0aC5cbiAgICogQHBhcmFtIGNvbHVtblxuICAgKi9cbiAgcHVibGljIGdldENvbHVtbldpZHRoKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2x1bW4ubWluV2lkdGggPyBjb2x1bW4ubWluV2lkdGggOiB0aGlzLmNvbHVtbk1pbldpZHRoO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBjaG9pY2VzIGZvciBkcm9wZG93biwgY2hlY2tib3ggYW5kIHJhZGlvZ3JvdXAgY2VsbCB0eXBlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXModmFsOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvcHRpb25zIGNhcHRpb24gZm9yIGRyb3Bkb3duIGNlbGwgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3B0aW9uc0NhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvcHRpb25zQ2FwdGlvblwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wdGlvbnNDYXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvcHRpb25zQ2FwdGlvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jT3B0aW9uc0NhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGR1cGxpY2F0aW9uIHZhbHVlIGVycm9yIHRleHQuIFNldCBpdCB0byBzaG93IHRoZSB0ZXh0IGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0LlxuICAgKiBAc2VlIE1hdHJpeERyb3Bkb3duQ29sdW1uLmlzVW5pcXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGtleUR1cGxpY2F0aW9uRXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBrZXlEdXBsaWNhdGlvbkVycm9yKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0tleUR1cGxpY2F0aW9uRXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgc3RvcmVPdGhlcnNBc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5zdG9yZU90aGVyc0FzQ29tbWVudCA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBhZGRDb2x1bW4obmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nID0gbnVsbCk6IE1hdHJpeERyb3Bkb3duQ29sdW1uIHtcbiAgICB2YXIgY29sdW1uID0gbmV3IE1hdHJpeERyb3Bkb3duQ29sdW1uKG5hbWUsIHRpdGxlKTtcbiAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgIHJldHVybiBjb2x1bW47XG4gIH1cbiAgcHJvdGVjdGVkIGdldFZpc2libGVSb3dzKCk6IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlPiB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IHRoaXMuZ2VuZXJhdGVSb3dzKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmZvckVhY2goKHJvdykgPT4gdGhpcy5vbk1hdHJpeFJvd0NyZWF0ZWQocm93KSk7XG4gICAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24oXG4gICAgICAgICAgdGhpcy5kYXRhLmdldEZpbHRlcmVkVmFsdWVzKCksXG4gICAgICAgICAgdGhpcy5kYXRhLmdldEZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlT25Sb3dzR2VuZXJhdGlvbih0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKTtcbiAgICAgIHRoaXMudXBkYXRlSXNBbnN3ZXJlZCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVZhbHVlT25Sb3dzR2VuZXJhdGlvbihyb3dzOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZT4pIHtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRydWUpO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgaWYgKCEhcm93LmVkaXRpbmdPYmopIGNvbnRpbnVlO1xuICAgICAgdmFyIHJvd1ZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZShpKTtcbiAgICAgIHZhciByVmFsdWUgPSByb3cudmFsdWU7XG4gICAgICBpZiAodGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHJvd1ZhbHVlLCByVmFsdWUpKSBjb250aW51ZTtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy5nZXROZXdWYWx1ZU9uUm93Q2hhbmdlZChyb3csIFwiXCIsIHJWYWx1ZSwgZmFsc2UsIG5ld1ZhbHVlKVxuICAgICAgICAudmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzVHdvVmFsdWVFcXVhbHMob2xkVmFsdWUsIG5ld1ZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbFZhbHVlKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmhhc1RvdGFsIHx8ICF0aGlzLnZpc2libGVUb3RhbFJvdykgcmV0dXJuIHt9O1xuICAgIHJldHVybiB0aGlzLnZpc2libGVUb3RhbFJvdy52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZVRvdGFsUm93KCk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuaGFzVG90YWwpIHtcbiAgICAgIGlmICghdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdykge1xuICAgICAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93ID0gdGhpcy5nZW5lcmF0ZVRvdGFsUm93KCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsgc3VydmV5OiB0aGlzLnN1cnZleSB9O1xuICAgICAgICAgIHRoaXMucnVuVG90YWxzQ29uZGl0aW9uKHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSwgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdyA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlZFRvdGFsUm93O1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZVRvdGFsUm93KCk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWaXNpYmxlVG90YWxSb3coKTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uc0luZGV4ZXModGhpcy5jb2x1bW5zKTtcbiAgICB0aGlzLmNsZWFyR2VuZXJhdGVkUm93cygpO1xuICAgIHRoaXMuZ2VuZXJhdGVkVG90YWxSb3cgPSBudWxsO1xuICAgIHRoaXMudXBkYXRlSGFzRm9vdGVyKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvdyB2YWx1ZS4gSWYgdGhlIHJvdyB2YWx1ZSBpcyBlbXB0eSwgdGhlIG9iamVjdCBpcyBlbXB0eToge30uXG4gICAqIEBwYXJhbSByb3dJbmRleCByb3cgaW5kZXggZnJvbSAwIHRvIHZpc2libGUgcm93IGNvdW50IC0gMS5cbiAgICovXG4gIHB1YmxpYyBnZXRSb3dWYWx1ZShyb3dJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHJvd0luZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHZpc1Jvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmIChyb3dJbmRleCA+PSB2aXNSb3dzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmdldFJvd1ZhbHVlQ29yZSh2aXNSb3dzW3Jvd0luZGV4XSwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBjaGVja0lmVmFsdWVJblJvd0R1cGxpY2F0ZWQoXG4gICAgY2hlY2tlZFJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY2VsbFF1ZXN0aW9uOiBRdWVzdGlvblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXTtcbiAgICAgIGlmIChjaGVja2VkUm93ID09PSByb3cpIGNvbnRpbnVlO1xuICAgICAgaWYgKHJvdy5nZXRWYWx1ZShjZWxsUXVlc3Rpb24ubmFtZSkgPT0gY2VsbFF1ZXN0aW9uLnZhbHVlKSB7XG4gICAgICAgIHJlcyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLmFkZER1cGxpY2F0aW9uRXJyb3IoY2VsbFF1ZXN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2VsbFF1ZXN0aW9uLmNsZWFyRXJyb3JzKCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgcm93IHZhbHVlLlxuICAgKiBAcGFyYW0gcm93SW5kZXggcm93IGluZGV4IGZyb20gMCB0byB2aXNpYmxlIHJvdyBjb3VudCAtIDEuXG4gICAqIEBwYXJhbSByb3dWYWx1ZSBhbiBvYmplY3Qge1wiY29sdW1uIG5hbWVcIjogY29sdW1uVmFsdWUsLi4uIH1cbiAgICovXG4gIHB1YmxpYyBzZXRSb3dWYWx1ZShyb3dJbmRleDogbnVtYmVyLCByb3dWYWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAocm93SW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmlzUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKHJvd0luZGV4ID49IHZpc1Jvd3MubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICB2aXNSb3dzW3Jvd0luZGV4XS52YWx1ZSA9IHJvd1ZhbHVlO1xuICAgIHRoaXMub25Sb3dDaGFuZ2VkKHZpc1Jvd3Nbcm93SW5kZXhdLCBcIlwiLCByb3dWYWx1ZSwgZmFsc2UpO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2U+IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVUb3RhbFJvdygpOiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXhEcm9wZG93blRvdGFsUm93TW9kZWwodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1ZhbHVlKG51bGxPbkVtcHR5OiBib29sZWFuID0gZmFsc2UpOiBhbnkge1xuICAgIHZhciByZXMgPSAhdGhpcy52YWx1ZSA/IHt9IDogdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgICBpZiAobnVsbE9uRW1wdHkgJiYgdGhpcy5pc01hdHJpeFZhbHVlRW1wdHkocmVzKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um93VmFsdWVDb3JlKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcXVlc3Rpb25WYWx1ZTogYW55LFxuICAgIGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGFueSB7XG4gICAgdmFyIHJlc3VsdCA9XG4gICAgICAhIXF1ZXN0aW9uVmFsdWUgJiYgISFxdWVzdGlvblZhbHVlW3Jvdy5yb3dOYW1lXVxuICAgICAgICA/IHF1ZXN0aW9uVmFsdWVbcm93LnJvd05hbWVdXG4gICAgICAgIDogbnVsbDtcbiAgICBpZiAoIXJlc3VsdCAmJiBjcmVhdGUpIHtcbiAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgaWYgKCEhcXVlc3Rpb25WYWx1ZSkge1xuICAgICAgICBxdWVzdGlvblZhbHVlW3Jvdy5yb3dOYW1lXSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um93T2JqKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBhbnkge1xuICAgIHZhciBvYmogPSB0aGlzLmdldFJvd1ZhbHVlQ29yZShyb3csIHRoaXMudmFsdWUpO1xuICAgIHJldHVybiAhIW9iaiAmJiAhIW9iai5nZXRUeXBlID8gb2JqIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um93RGlzcGxheVZhbHVlKFxuICAgIGtleXNBc1RleHQ6IGJvb2xlYW4sXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICByb3dWYWx1ZTogYW55XG4gICk6IGFueSB7XG4gICAgaWYgKCFyb3dWYWx1ZSkgcmV0dXJuIHJvd1ZhbHVlO1xuICAgIGlmICghIXJvdy5lZGl0aW5nT2JqKSByZXR1cm4gcm93VmFsdWU7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyb3dWYWx1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHJvdy5nZXRRdWVzdGlvbkJ5TmFtZShrZXkpO1xuICAgICAgaWYgKCFxdWVzdGlvbikge1xuICAgICAgICBxdWVzdGlvbiA9IHRoaXMuZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoa2V5LCByb3cpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcXVlc3Rpb24pIHtcbiAgICAgICAgdmFyIGRpc3BsYXl2YWx1ZSA9IHF1ZXN0aW9uLmdldERpc3BsYXlWYWx1ZShrZXlzQXNUZXh0LCByb3dWYWx1ZVtrZXldKTtcbiAgICAgICAgaWYgKGtleXNBc1RleHQgJiYgISFxdWVzdGlvbi50aXRsZSAmJiBxdWVzdGlvbi50aXRsZSAhPT0ga2V5KSB7XG4gICAgICAgICAgcm93VmFsdWVbcXVlc3Rpb24udGl0bGVdID0gZGlzcGxheXZhbHVlO1xuICAgICAgICAgIGRlbGV0ZSByb3dWYWx1ZVtrZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvd1ZhbHVlW2tleV0gPSBkaXNwbGF5dmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbjtcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlLFxuICAgIH1cbiAgKSB7XG4gICAgdmFyIHF1ZXN0aW9uUGxhaW5EYXRhID0gc3VwZXIuZ2V0UGxhaW5EYXRhKG9wdGlvbnMpO1xuICAgIGlmICghIXF1ZXN0aW9uUGxhaW5EYXRhKSB7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5pc05vZGUgPSB0cnVlO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuZGF0YSA9IHRoaXMudmlzaWJsZVJvd3MubWFwKFxuICAgICAgICAocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSkgPT4ge1xuICAgICAgICAgIHZhciByb3dEYXRhSXRlbSA9IDxhbnk+e1xuICAgICAgICAgICAgbmFtZTogcm93LnJvd05hbWUsXG4gICAgICAgICAgICB0aXRsZTogcm93LnRleHQsXG4gICAgICAgICAgICB2YWx1ZTogcm93LnZhbHVlLFxuICAgICAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLmdldFJvd0Rpc3BsYXlWYWx1ZShmYWxzZSwgcm93LCByb3cudmFsdWUpLFxuICAgICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeSh2YWwpIDogdmFsLFxuICAgICAgICAgICAgaXNOb2RlOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogcm93LmNlbGxzXG4gICAgICAgICAgICAgIC5tYXAoKGNlbGw6IE1hdHJpeERyb3Bkb3duQ2VsbCkgPT5cbiAgICAgICAgICAgICAgICBjZWxsLnF1ZXN0aW9uLmdldFBsYWluRGF0YShvcHRpb25zKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gISFkKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIChvcHRpb25zLmNhbGN1bGF0aW9ucyB8fCBbXSkuZm9yRWFjaCgoY2FsY3VsYXRpb24pID0+IHtcbiAgICAgICAgICAgIHJvd0RhdGFJdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV0gPSAoPGFueT5yb3cpW1xuICAgICAgICAgICAgICBjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJvd0RhdGFJdGVtO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25QbGFpbkRhdGE7XG4gIH1cbiAgcHVibGljIGdldFByb2dyZXNzSW5mbygpOiBJUHJvZ3Jlc3NJbmZvIHtcbiAgICByZXR1cm4gU3VydmV5RWxlbWVudC5nZXRQcm9ncmVzc0luZm9CeUVsZW1lbnRzKFxuICAgICAgdGhpcy5nZXRDZWxsUXVlc3Rpb25zKCksXG4gICAgICB0aGlzLmlzUmVxdWlyZWRcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0Q2VsbFF1ZXN0aW9ucygpOiBBcnJheTxRdWVzdGlvbj4ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHF1ZXN0aW9ucyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgcm93ID0gcm93c1tpXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHF1ZXN0aW9ucy5wdXNoKHJvdy5jZWxsc1tqXS5xdWVzdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBxdWVzdGlvbnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWZvcmVWYWx1ZUNoYW5nZWQodmFsOiBhbnkpIHt9XG4gIHByaXZhdGUgb25TZXRRdWVzdGlvblZhbHVlKCkge1xuICAgIGlmICh0aGlzLmlzUm93Q2hhbmdpbmcpIHJldHVybjtcbiAgICB0aGlzLm9uQmVmb3JlVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyB8fCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aCA9PSAwKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgdmFyIHZhbCA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldO1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS52YWx1ZSA9IHRoaXMuZ2V0Um93VmFsdWVDb3JlKHJvdywgdmFsKTtcbiAgICB9XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUsIGZhbHNlKTtcbiAgICB0aGlzLm9uU2V0UXVlc3Rpb25WYWx1ZSgpO1xuICAgIHRoaXMudXBkYXRlSXNBbnN3ZXJlZCgpO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbHMgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLmNlbGxzO1xuICAgICAgaWYgKCFjZWxscykgY29udGludWU7XG4gICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY2VsbHMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHF1ZXN0aW9uICYmXG4gICAgICAgICAgKCFxdWVzdGlvbi5zdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHx8ICFxdWVzdGlvbi52YWx1ZSlcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBzdXBlci5nZXRDb250YWluc0Vycm9ycygpIHx8XG4gICAgICB0aGlzLmNoZWNrRm9yQW5zd2Vyc09yRXJyb3JzKFxuICAgICAgICAocXVlc3Rpb246IFF1ZXN0aW9uKSA9PiBxdWVzdGlvbi5jb250YWluc0Vycm9ycyxcbiAgICAgICAgZmFsc2VcbiAgICAgIClcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBzdXBlci5nZXRJc0Fuc3dlcmVkKCkgJiZcbiAgICAgIHRoaXMuY2hlY2tGb3JBbnN3ZXJzT3JFcnJvcnMoXG4gICAgICAgIChxdWVzdGlvbjogUXVlc3Rpb24pID0+IHF1ZXN0aW9uLmlzQW5zd2VyZWQsXG4gICAgICAgIHRydWVcbiAgICAgIClcbiAgICApO1xuICB9XG4gIHByaXZhdGUgY2hlY2tGb3JBbnN3ZXJzT3JFcnJvcnMoXG4gICAgcHJlZGljYXRlOiAocXVlc3Rpb246IFF1ZXN0aW9uKSA9PiBib29sZWFuLFxuICAgIGV2ZXJ5OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gcm93c1tpXS5jZWxscztcbiAgICAgIGlmICghY2VsbHMpIGNvbnRpbnVlO1xuICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGNlbGxzLmxlbmd0aDsgY29sSW5kZXgrKykge1xuICAgICAgICBpZiAoIWNlbGxzW2NvbEluZGV4XSkgY29udGludWU7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgaWYgKHF1ZXN0aW9uICYmIHF1ZXN0aW9uLmlzVmlzaWJsZSlcbiAgICAgICAgICBpZiAocHJlZGljYXRlKHF1ZXN0aW9uKSkge1xuICAgICAgICAgICAgaWYgKCFldmVyeSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChldmVyeSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV2ZXJ5ID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgdmFyIGVycm9zSW5Sb3dzID0gdGhpcy5oYXNFcnJvckluUm93cyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgdmFyIGlzRHVwbGljYXRlZCA9IHRoaXMuaXNWYWx1ZUR1cGxpY2F0ZWQoKTtcbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgcmVjKSB8fCBlcnJvc0luUm93cyB8fCBpc0R1cGxpY2F0ZWQ7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzUnVubmluZ1ZhbGlkYXRvcnMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHN1cGVyLmdldElzUnVubmluZ1ZhbGlkYXRvcnMoKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbHMgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLmNlbGxzO1xuICAgICAgaWYgKCFjZWxscykgY29udGludWU7XG4gICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY2VsbHMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIGlmICghY2VsbHNbY29sSW5kZXhdKSBjb250aW51ZTtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uO1xuICAgICAgICBpZiAoISFxdWVzdGlvbiAmJiBxdWVzdGlvbi5pc1J1bm5pbmdWYWxpZGF0b3JzKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICB2YXIgcmVzdWx0ID0gc3VwZXIuZ2V0QWxsRXJyb3JzKCk7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuXG4gICAgaWYgKHJvd3MgPT09IG51bGwpIHJldHVybiByZXN1bHQ7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3cuY2VsbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IHJvdy5jZWxsc1tqXS5xdWVzdGlvbi5nZXRBbGxFcnJvcnMoKTtcbiAgICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJblJvd3MoZmlyZUNhbGxiYWNrOiBib29sZWFuLCByZWM6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBpZiAoIXJlYykgcmVjID0ge307XG4gICAgcmVjLmlzU2luZ2xlRGV0YWlsUGFuZWwgPSB0aGlzLmRldGFpbFBhbmVsTW9kZSA9PT0gXCJ1bmRlclJvd1NpbmdsZVwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzID1cbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrLCByZWMsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnJhaXNlT25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMoKTtcbiAgICAgICAgfSkgfHwgcmVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgaXNWYWx1ZUR1cGxpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGNvbHVtbnMgPSB0aGlzLmdldFVuaXF1ZUNvbHVtbnMoKTtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMgPSB0aGlzLmlzVmFsdWVJbkNvbHVtbkR1cGxpY2F0ZWQoY29sdW1uc1tpXSkgfHwgcmVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgaXNWYWx1ZUluQ29sdW1uRHVwbGljYXRlZChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgdmFyIGtleVZhbHVlcyA9IDxBcnJheTxhbnk+PltdO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyA9XG4gICAgICAgIHRoaXMuaXNWYWx1ZUR1cGxpY2F0ZWRJblJvdyhcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLFxuICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICBrZXlWYWx1ZXNcbiAgICAgICAgKSB8fCByZXM7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFVuaXF1ZUNvbHVtbnMoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Db2x1bW4+IHtcbiAgICB2YXIgcmVzID0gbmV3IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jb2x1bW5zW2ldLmlzVW5pcXVlKSB7XG4gICAgICAgIHJlcy5wdXNoKHRoaXMuY29sdW1uc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlRHVwbGljYXRlZEluUm93KFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBrZXlWYWx1ZXM6IEFycmF5PGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIHF1ZXN0aW9uID0gcm93LmdldFF1ZXN0aW9uQnlDb2x1bW4oY29sdW1uKTtcbiAgICBpZiAoIXF1ZXN0aW9uIHx8IHF1ZXN0aW9uLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB2YWx1ZSA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsdWUgPT0ga2V5VmFsdWVzW2ldKSB7XG4gICAgICAgIHRoaXMuYWRkRHVwbGljYXRpb25FcnJvcihxdWVzdGlvbik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBrZXlWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgYWRkRHVwbGljYXRpb25FcnJvcihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBxdWVzdGlvbi5hZGRFcnJvcihuZXcgS2V5RHVwbGljYXRpb25FcnJvcih0aGlzLmtleUR1cGxpY2F0aW9uRXJyb3IsIHRoaXMpKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0Rmlyc3RDZWxsUXVlc3Rpb24oZmFsc2UpO1xuICAgIHJldHVybiBxdWVzdGlvbiA/IHF1ZXN0aW9uLmlucHV0SWQgOiBzdXBlci5nZXRGaXJzdElucHV0RWxlbWVudElkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0RXJyb3JJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0Rmlyc3RDZWxsUXVlc3Rpb24odHJ1ZSk7XG4gICAgcmV0dXJuIHF1ZXN0aW9uID8gcXVlc3Rpb24uaW5wdXRJZCA6IHN1cGVyLmdldEZpcnN0RXJyb3JJbnB1dEVsZW1lbnRJZCgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdENlbGxRdWVzdGlvbihvbkVycm9yOiBib29sZWFuKTogUXVlc3Rpb24ge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbHMgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLmNlbGxzO1xuICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGNlbGxzLmxlbmd0aDsgY29sSW5kZXgrKykge1xuICAgICAgICBpZiAoIW9uRXJyb3IpIHJldHVybiBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICAgIGlmIChjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb24uY3VycmVudEVycm9yQ291bnQgPiAwKVxuICAgICAgICAgIHJldHVybiBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBvblJlYWRPbmx5Q2hhbmdlZCgpIHtcbiAgICBzdXBlci5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZVJvd3MpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudmlzaWJsZVJvd3NbaV0ub25RdWVzdGlvblJlYWRPbmx5Q2hhbmdlZCh0aGlzLmlzUmVhZE9ubHkpO1xuICAgIH1cbiAgfVxuXG4gIC8vSU1hdHJpeERyb3Bkb3duRGF0YVxuICBwdWJsaWMgY3JlYXRlUXVlc3Rpb24oXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uXG4gICk6IFF1ZXN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVRdWVzdGlvbkNvcmUocm93LCBjb2x1bW4pO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVRdWVzdGlvbkNvcmUoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uXG4gICk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb24gPSBjb2x1bW4uY3JlYXRlQ2VsbFF1ZXN0aW9uKHJvdyk7XG4gICAgaWYgKHRoaXMuaXNSZWFkT25seSkge1xuICAgICAgcXVlc3Rpb24ucmVhZE9ubHkgPSB0cnVlO1xuICAgIH1cbiAgICBxdWVzdGlvbi5zZXRTdXJ2ZXlJbXBsKHJvdyk7XG4gICAgcXVlc3Rpb24uc2V0UGFyZW50UXVlc3Rpb24odGhpcyk7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG4gIHByb3RlY3RlZCBkZWxldGVSb3dWYWx1ZShcbiAgICBuZXdWYWx1ZTogYW55LFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbiAgKTogYW55IHtcbiAgICBpZiAoIW5ld1ZhbHVlKSByZXR1cm4gbmV3VmFsdWU7XG4gICAgZGVsZXRlIG5ld1ZhbHVlW3Jvdy5yb3dOYW1lXTtcbiAgICByZXR1cm4gdGhpcy5pc09iamVjdChuZXdWYWx1ZSkgJiYgT2JqZWN0LmtleXMobmV3VmFsdWUpLmxlbmd0aCA9PSAwXG4gICAgICA/IG51bGxcbiAgICAgIDogbmV3VmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc0RvaW5nb25BbnlWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fFxuICAgICAgdGhpcy5pc0RvaW5nb25BbnlWYWx1ZUNoYW5nZWQgfHxcbiAgICAgICF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuaXNEb2luZ29uQW55VmFsdWVDaGFuZ2VkID0gdHJ1ZTtcbiAgICB2YXIgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgICB2YXIgdG90YWxSb3cgPSB0aGlzLnZpc2libGVUb3RhbFJvdztcbiAgICBpZiAoISF0b3RhbFJvdykge1xuICAgICAgdG90YWxSb3cub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgfVxuICAgIHRoaXMuaXNEb2luZ29uQW55VmFsdWVDaGFuZ2VkID0gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGlzT2JqZWN0KHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiO1xuICB9XG4gIHByaXZhdGUgZ2V0T25DZWxsVmFsdWVDaGFuZ2VkT3B0aW9ucyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICByb3dWYWx1ZTogYW55XG4gICk6IGFueSB7XG4gICAgdmFyIGdldFF1ZXN0aW9uID0gKGNvbE5hbWU6IGFueSkgPT4ge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3cuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbCA9IHJvdy5jZWxsc1tpXS5jb2x1bW47XG4gICAgICAgIGlmICghIWNvbCAmJiBjb2wubmFtZSA9PT0gY29sTmFtZSkge1xuICAgICAgICAgIHJldHVybiByb3cuY2VsbHNbaV0ucXVlc3Rpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvdzogcm93LFxuICAgICAgY29sdW1uTmFtZTogY29sdW1uTmFtZSxcbiAgICAgIHJvd1ZhbHVlOiByb3dWYWx1ZSxcbiAgICAgIHZhbHVlOiAhIXJvd1ZhbHVlID8gcm93VmFsdWVbY29sdW1uTmFtZV0gOiBudWxsLFxuICAgICAgZ2V0Q2VsbFF1ZXN0aW9uOiBnZXRRdWVzdGlvbixcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBvbkNlbGxWYWx1ZUNoYW5nZWQoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93VmFsdWU6IGFueVxuICApIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm47XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLmdldE9uQ2VsbFZhbHVlQ2hhbmdlZE9wdGlvbnMocm93LCBjb2x1bW5OYW1lLCByb3dWYWx1ZSk7XG4gICAgaWYgKCEhdGhpcy5vbkNlbGxWYWx1ZUNoYW5nZWRDYWxsYmFjaykge1xuICAgICAgdGhpcy5vbkNlbGxWYWx1ZUNoYW5nZWRDYWxsYmFjayhvcHRpb25zKTtcbiAgICB9XG4gICAgdGhpcy5zdXJ2ZXkubWF0cml4Q2VsbFZhbHVlQ2hhbmdlZCh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICB2YWxpZGF0ZUNlbGwoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93VmFsdWU6IGFueVxuICApOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRPbkNlbGxWYWx1ZUNoYW5nZWRPcHRpb25zKHJvdywgY29sdW1uTmFtZSwgcm93VmFsdWUpO1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5tYXRyaXhDZWxsVmFsaWRhdGUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgZ2V0IGlzVmFsaWRhdGVPblZhbHVlQ2hhbmdpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5pc1ZhbGlkYXRlT25WYWx1ZUNoYW5naW5nIDogZmFsc2U7XG4gIH1cbiAgb25Sb3dDaGFuZ2luZyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICByb3dWYWx1ZTogYW55XG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuICEhcm93VmFsdWUgPyByb3dWYWx1ZVtjb2x1bW5OYW1lXSA6IG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLmdldE9uQ2VsbFZhbHVlQ2hhbmdlZE9wdGlvbnMocm93LCBjb2x1bW5OYW1lLCByb3dWYWx1ZSk7XG4gICAgdmFyIG9sZFJvd1ZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZUNvcmUocm93LCB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCksIHRydWUpO1xuICAgIG9wdGlvbnMub2xkVmFsdWUgPSAhIW9sZFJvd1ZhbHVlID8gb2xkUm93VmFsdWVbY29sdW1uTmFtZV0gOiBudWxsO1xuICAgIHRoaXMuc3VydmV5Lm1hdHJpeENlbGxWYWx1ZUNoYW5naW5nKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnZhbHVlO1xuICB9XG4gIG9uUm93Q2hhbmdlZChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICBuZXdSb3dWYWx1ZTogYW55LFxuICAgIGlzRGVsZXRpbmdWYWx1ZTogYm9vbGVhblxuICApIHtcbiAgICB2YXIgcm93T2JqID0gISFjb2x1bW5OYW1lID8gdGhpcy5nZXRSb3dPYmoocm93KSA6IG51bGw7XG4gICAgaWYgKCEhcm93T2JqKSB7XG4gICAgICB2YXIgY29sdW1uVmFsdWUgPSBudWxsO1xuICAgICAgaWYgKCEhbmV3Um93VmFsdWUgJiYgIWlzRGVsZXRpbmdWYWx1ZSkge1xuICAgICAgICBjb2x1bW5WYWx1ZSA9IG5ld1Jvd1ZhbHVlW2NvbHVtbk5hbWVdO1xuICAgICAgfVxuICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcbiAgICAgIHJvd09ialtjb2x1bW5OYW1lXSA9IGNvbHVtblZhbHVlO1xuICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm9uQ2VsbFZhbHVlQ2hhbmdlZChyb3csIGNvbHVtbk5hbWUsIHJvd09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodHJ1ZSk7XG4gICAgICB2YXIgY29tYmluZSA9IHRoaXMuZ2V0TmV3VmFsdWVPblJvd0NoYW5nZWQoXG4gICAgICAgIHJvdyxcbiAgICAgICAgY29sdW1uTmFtZSxcbiAgICAgICAgbmV3Um93VmFsdWUsXG4gICAgICAgIGlzRGVsZXRpbmdWYWx1ZSxcbiAgICAgICAgdGhpcy5jcmVhdGVOZXdWYWx1ZSgpXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgY29tYmluZS52YWx1ZSkpIHJldHVybjtcbiAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLnNldE5ld1ZhbHVlKGNvbWJpbmUudmFsdWUpO1xuICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gICAgICBpZiAoY29sdW1uTmFtZSkge1xuICAgICAgICB0aGlzLm9uQ2VsbFZhbHVlQ2hhbmdlZChyb3csIGNvbHVtbk5hbWUsIGNvbWJpbmUucm93VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldE5ld1ZhbHVlT25Sb3dDaGFuZ2VkKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIG5ld1Jvd1ZhbHVlOiBhbnksXG4gICAgaXNEZWxldGluZ1ZhbHVlOiBib29sZWFuLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKTogYW55IHtcbiAgICB2YXIgcm93VmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlQ29yZShyb3csIG5ld1ZhbHVlLCB0cnVlKTtcbiAgICBpZiAoaXNEZWxldGluZ1ZhbHVlKSB7XG4gICAgICBkZWxldGUgcm93VmFsdWVbY29sdW1uTmFtZV07XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gcm93LmNlbGxzW2ldLnF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpO1xuICAgICAgZGVsZXRlIHJvd1ZhbHVlW2tleV07XG4gICAgfVxuICAgIGlmIChuZXdSb3dWYWx1ZSkge1xuICAgICAgbmV3Um93VmFsdWUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5ld1Jvd1ZhbHVlKSk7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gbmV3Um93VmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eShuZXdSb3dWYWx1ZVtrZXldKSkge1xuICAgICAgICAgIHJvd1ZhbHVlW2tleV0gPSBuZXdSb3dWYWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlzT2JqZWN0KHJvd1ZhbHVlKSAmJiBPYmplY3Qua2V5cyhyb3dWYWx1ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMuZGVsZXRlUm93VmFsdWUobmV3VmFsdWUsIHJvdyk7XG4gICAgfVxuICAgIHJldHVybiB7IHZhbHVlOiBuZXdWYWx1ZSwgcm93VmFsdWU6IHJvd1ZhbHVlIH07XG4gIH1cbiAgZ2V0Um93SW5kZXgocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gLTE7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3MuaW5kZXhPZihyb3cpO1xuICB9XG4gIHB1YmxpYyBnZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgaWYgKHRoaXMuZGV0YWlsUGFuZWxNb2RlID09IFwibm9uZVwiKVxuICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzSW5EZXNpZ24oaW5jbHVkZUhpZGRlbik7XG4gICAgcmV0dXJuIGluY2x1ZGVIaWRkZW4gPyBbdGhpcy5kZXRhaWxQYW5lbF0gOiB0aGlzLmRldGFpbEVsZW1lbnRzO1xuICB9XG4gIGhhc0RldGFpbFBhbmVsKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kZXRhaWxQYW5lbE1vZGUgPT0gXCJub25lXCIpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiB0cnVlO1xuICAgIGlmICghIXRoaXMub25IYXNEZXRhaWxQYW5lbENhbGxiYWNrKVxuICAgICAgcmV0dXJuIHRoaXMub25IYXNEZXRhaWxQYW5lbENhbGxiYWNrKHJvdyk7XG4gICAgcmV0dXJuIHRoaXMuZGV0YWlsRWxlbWVudHMubGVuZ3RoID4gMDtcbiAgfVxuICBnZXRJc0RldGFpbFBhbmVsU2hvd2luZyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGV0YWlsUGFuZWxNb2RlID09IFwibm9uZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy52aXNpYmxlUm93cy5pbmRleE9mKHJvdykgPT0gMDtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgaWYgKCFyb3cuZGV0YWlsUGFuZWwpIHtcbiAgICAgICAgICByb3cuc2hvd0RldGFpbFBhbmVsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1Jvd1Nob3dpbmdcIiArIHJvdy5pZCwgZmFsc2UpO1xuICB9XG4gIHNldElzRGV0YWlsUGFuZWxTaG93aW5nKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsIHZhbDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWwgPT0gdGhpcy5nZXRJc0RldGFpbFBhbmVsU2hvd2luZyhyb3cpKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNSb3dTaG93aW5nXCIgKyByb3cuaWQsIHZhbCk7XG4gICAgdGhpcy51cGRhdGVEZXRhaWxQYW5lbEJ1dHRvbkNzcyhyb3cpO1xuICAgIGlmICghIXRoaXMucmVuZGVyZWRUYWJsZSkge1xuICAgICAgdGhpcy5yZW5kZXJlZFRhYmxlLm9uRGV0YWlsUGFuZWxDaGFuZ2VWaXNpYmlsaXR5KHJvdywgdmFsKTtcbiAgICB9XG4gICAgaWYgKHZhbCAmJiB0aGlzLmRldGFpbFBhbmVsTW9kZSA9PT0gXCJ1bmRlclJvd1NpbmdsZVwiKSB7XG4gICAgICB2YXIgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHJvd3NbaV0uaWQgIT09IHJvdy5pZCAmJiByb3dzW2ldLmlzRGV0YWlsUGFuZWxTaG93aW5nKSB7XG4gICAgICAgICAgcm93c1tpXS5oaWRlRGV0YWlsUGFuZWwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0RGV0YWlsUGFuZWxCdXR0b25Dc3Mocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRldGFpbEJ1dHRvbkNzc1wiICsgcm93LmlkKTtcbiAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIHJlcyA9IHRoaXMuY3NzQ2xhc3Nlcy5kZXRhaWxCdXR0b247XG4gICAgcmV0dXJuICEhcmVzID8gcmVzIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0RGV0YWlsUGFuZWxJY29uQ3NzKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZXRhaWxJY29uQ3NzXCIgKyByb3cuaWQpO1xuICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICB2YXIgcmVzID0gdGhpcy5jc3NDbGFzc2VzLmRldGFpbEljb247XG4gICAgcmV0dXJuICEhcmVzID8gcmVzIDogXCJcIjtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZURldGFpbFBhbmVsQnV0dG9uQ3NzKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpIHtcbiAgICB2YXIgY2xhc3NlcyA9IHRoaXMuY3NzQ2xhc3NlcztcbiAgICB2YXIgaWNvbiA9IGNsYXNzZXMuZGV0YWlsSWNvbjtcbiAgICBpZiAoIWljb24pIGljb24gPSBcIlwiO1xuICAgIHZhciBidXR0b24gPSBjbGFzc2VzLmRldGFpbEJ1dHRvbjtcbiAgICBpZiAoIWJ1dHRvbikgYnV0dG9uID0gXCJcIjtcbiAgICBpZiAodGhpcy5nZXRJc0RldGFpbFBhbmVsU2hvd2luZyhyb3cpKSB7XG4gICAgICBpZiAoISFjbGFzc2VzLmRldGFpbEljb25FeHBhbmRlZClcbiAgICAgICAgaWNvbiArPSBcIiBcIiArIGNsYXNzZXMuZGV0YWlsSWNvbkV4cGFuZGVkO1xuICAgICAgaWYgKCEhY2xhc3Nlcy5kZXRhaWxCdXR0b25FeHBhbmRlZClcbiAgICAgICAgYnV0dG9uICs9IFwiIFwiICsgY2xhc3Nlcy5kZXRhaWxCdXR0b25FeHBhbmRlZDtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGV0YWlsSWNvbkNzc1wiICsgcm93LmlkLCBpY29uKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZXRhaWxCdXR0b25Dc3NcIiArIHJvdy5pZCwgYnV0dG9uKTtcbiAgfVxuICBjcmVhdGVSb3dEZXRhaWxQYW5lbChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogUGFuZWxNb2RlbCB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gdGhpcy5kZXRhaWxQYW5lbDtcbiAgICB2YXIgcGFuZWwgPSB0aGlzLmNyZWF0ZU5ld0RldGFpbFBhbmVsKCk7XG4gICAgdmFyIGpzb24gPSB0aGlzLmRldGFpbFBhbmVsLnRvSlNPTigpO1xuICAgIG5ldyBKc29uT2JqZWN0KCkudG9PYmplY3QoanNvbiwgcGFuZWwpO1xuICAgIHBhbmVsLnJlbmRlcldpZHRoID0gXCIxMDAlXCI7XG4gICAgcGFuZWwudXBkYXRlQ3VzdG9tV2lkZ2V0cygpO1xuICAgIGlmICghIXRoaXMub25DcmVhdGVEZXRhaWxQYW5lbENhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uQ3JlYXRlRGV0YWlsUGFuZWxDYWxsYmFjayhyb3csIHBhbmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhbmVsO1xuICB9XG4gIGdldFNoYXJlZFF1ZXN0aW9uQnlOYW1lKFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlXG4gICk6IFF1ZXN0aW9uIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5IHx8ICF0aGlzLnZhbHVlTmFtZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5nZXRSb3dJbmRleChyb3cpO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiA8UXVlc3Rpb24+KFxuICAgICAgdGhpcy5zdXJ2ZXkuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZUZyb21BcnJheShcbiAgICAgICAgdGhpcy52YWx1ZU5hbWUsXG4gICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgIGluZGV4XG4gICAgICApXG4gICAgKTtcbiAgfVxuICBvblRvdGFsVmFsdWVDaGFuZ2VkKCk6IGFueSB7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLmRhdGEgJiZcbiAgICAgICEhdGhpcy52aXNpYmxlVG90YWxSb3cgJiZcbiAgICAgICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmXG4gICAgICAhdGhpcy5pc1NldHQgJiZcbiAgICAgICF0aGlzLmlzUmVhZE9ubHlcbiAgICApIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRWYWx1ZShcbiAgICAgICAgdGhpcy5nZXRWYWx1ZU5hbWUoKSArIHNldHRpbmdzLm1hdHJpeFRvdGFsVmFsdWVQb3N0Rml4LFxuICAgICAgICB0aGlzLnRvdGFsVmFsdWUsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25Gcm9tQXJyYXkobmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogSVF1ZXN0aW9uIHtcbiAgICBpZiAoaW5kZXggPj0gdGhpcy52aXNpYmxlUm93cy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnZpc2libGVSb3dzW2luZGV4XS5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgfVxuICBwcml2YXRlIGlzTWF0cml4VmFsdWVFbXB0eSh2YWw6IGFueSkge1xuICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPYmplY3QodmFsW2ldKSAmJiBPYmplY3Qua2V5cyh2YWxbaV0pLmxlbmd0aCA+IDApXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyh2YWwpLmxlbmd0aCA9PSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgU3VydmV5TW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5IGFzIFN1cnZleU1vZGVsO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsVGVtcGxhdGVEYXRhKGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwpIHtcbiAgICAvLyByZXR1cm4gY2VsbC5jZWxsLmNvbHVtbi50ZW1wbGF0ZVF1ZXN0aW9uO1xuICAgIHJldHVybiB0aGlzLlN1cnZleU1vZGVsLmdldE1hdHJpeENlbGxUZW1wbGF0ZURhdGEoY2VsbCk7XG4gIH1cbiAgcHVibGljIGdldENlbGxXcmFwcGVyQ29tcG9uZW50TmFtZShjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwpIHtcbiAgICByZXR1cm4gdGhpcy5TdXJ2ZXlNb2RlbC5nZXRFbGVtZW50V3JhcHBlckNvbXBvbmVudE5hbWUoY2VsbCwgXCJjZWxsXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsV3JhcHBlckNvbXBvbmVudERhdGEoY2VsbDogTWF0cml4RHJvcGRvd25DZWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnREYXRhKGNlbGwsIFwiY2VsbFwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q29sdW1uSGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoY2VsbDogTWF0cml4RHJvcGRvd25DZWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKFxuICAgICAgY2VsbCxcbiAgICAgIFwiY29sdW1uLWhlYWRlclwiXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q29sdW1uSGVhZGVyV3JhcHBlckNvbXBvbmVudERhdGEoY2VsbDogTWF0cml4RHJvcGRvd25DZWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnREYXRhKFxuICAgICAgY2VsbCxcbiAgICAgIFwiY29sdW1uLWhlYWRlclwiXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0Um93SGVhZGVyV3JhcHBlckNvbXBvbmVudE5hbWUoY2VsbDogTWF0cml4RHJvcGRvd25DZWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnROYW1lKGNlbGwsIFwicm93LWhlYWRlclwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0Um93SGVhZGVyV3JhcHBlckNvbXBvbmVudERhdGEoY2VsbDogTWF0cml4RHJvcGRvd25DZWxsKSB7XG4gICAgcmV0dXJuIHRoaXMuU3VydmV5TW9kZWwuZ2V0RWxlbWVudFdyYXBwZXJDb21wb25lbnREYXRhKGNlbGwsIFwicm93LWhlYWRlclwiKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm1hdHJpeGRyb3Bkb3duY29sdW1uXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwiIW5hbWVcIiwgaXNVbmlxdWU6IHRydWUgfSxcbiAgICB7IG5hbWU6IFwidGl0bGVcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNlbGxUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6ICgpID0+IHtcbiAgICAgICAgdmFyIHJlcyA9IE1hdHJpeERyb3Bkb3duQ29sdW1uLmdldENvbHVtblR5cGVzKCk7XG4gICAgICAgIHJlcy5zcGxpY2UoMCwgMCwgXCJkZWZhdWx0XCIpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJjb2xDb3VudFwiLCBkZWZhdWx0OiAtMSwgY2hvaWNlczogWy0xLCAwLCAxLCAyLCAzLCA0XSB9LFxuICAgIFwiaXNSZXF1aXJlZDpib29sZWFuXCIsXG4gICAgXCJpc1VuaXF1ZTpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJyZXF1aXJlZEVycm9yVGV4dDp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUmVxdWlyZWRFcnJvclRleHRcIixcbiAgICB9LFxuICAgIFwicmVhZE9ubHk6Ym9vbGVhblwiLFxuICAgIFwibWluV2lkdGhcIixcbiAgICBcIndpZHRoXCIsXG4gICAgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJlbmFibGVJZjpjb25kaXRpb25cIixcbiAgICBcInJlcXVpcmVkSWY6Y29uZGl0aW9uXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJzaG93SW5NdWx0aXBsZUNvbHVtbnM6Ym9vbGVhblwiLFxuICAgICAgZGVwZW5kc09uOiBcImNlbGxUeXBlXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIGlmICghb2JqKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBvYmouaXNTdXBwb3J0TXVsdGlwbGVDb2x1bW5zO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidmFsaWRhdG9yczp2YWxpZGF0b3JzXCIsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiBcInN1cnZleXZhbGlkYXRvclwiLFxuICAgICAgY2xhc3NOYW1lUGFydDogXCJ2YWxpZGF0b3JcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidG90YWxUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJzdW1cIiwgXCJjb3VudFwiLCBcIm1pblwiLCBcIm1heFwiLCBcImF2Z1wiXSxcbiAgICB9LFxuICAgIFwidG90YWxFeHByZXNzaW9uOmV4cHJlc3Npb25cIixcbiAgICB7IG5hbWU6IFwidG90YWxGb3JtYXRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RvdGFsRm9ybWF0XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRvdGFsRGlzcGxheVN0eWxlXCIsXG4gICAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJkZWNpbWFsXCIsIFwiY3VycmVuY3lcIiwgXCJwZXJjZW50XCJdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ0b3RhbEN1cnJlbmN5XCIsXG4gICAgICBjaG9pY2VzOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXRDdXJyZWN5Q29kZXMoKTtcbiAgICAgIH0sXG4gICAgICBkZWZhdWx0OiBcIlVTRFwiLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcInRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzOm51bWJlclwiLCBkZWZhdWx0OiAtMSB9LFxuICAgIHsgbmFtZTogXCJ0b3RhbE1pbmltdW1GcmFjdGlvbkRpZ2l0czpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwicmVuZGVyQXNcIiwgZGVmYXVsdDogXCJkZWZhdWx0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHJvcGRvd25Db2x1bW4oXCJcIik7XG4gIH1cbik7XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibWF0cml4ZHJvcGRvd25iYXNlXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbHVtbnM6bWF0cml4ZHJvcGRvd25jb2x1bW5zXCIsXG4gICAgICBjbGFzc05hbWU6IFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29sdW1uTGF5b3V0XCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwiY29sdW1uc0xvY2F0aW9uXCIsXG4gICAgICBkZWZhdWx0OiBcImhvcml6b250YWxcIixcbiAgICAgIGNob2ljZXM6IFtcImhvcml6b250YWxcIiwgXCJ2ZXJ0aWNhbFwiXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZGV0YWlsRWxlbWVudHNcIixcbiAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgaXNMaWdodFNlcmlhbGl6YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImRldGFpbFBhbmVsTW9kZVwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcInVuZGVyUm93XCIsIFwidW5kZXJSb3dTaW5nbGVcIl0sXG4gICAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICB9LFxuICAgIFwiaG9yaXpvbnRhbFNjcm9sbDpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJjaG9pY2VzOml0ZW12YWx1ZVtdXCIsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY09wdGlvbnNDYXB0aW9uXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NLZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNlbGxUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcImRyb3Bkb3duXCIsXG4gICAgICBjaG9pY2VzOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBNYXRyaXhEcm9wZG93bkNvbHVtbi5nZXRDb2x1bW5UeXBlcygpO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJjb2x1bW5Db2xDb3VudFwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgMywgNF0gfSxcbiAgICBcImNvbHVtbk1pbldpZHRoXCIsXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZShcIlwiKTtcbiAgfSxcbiAgXCJtYXRyaXhiYXNlXCJcbik7XG4iLCJpbXBvcnQge1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLFxuICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgSU1hdHJpeERyb3Bkb3duRGF0YSxcbiAgTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlLFxufSBmcm9tIFwiLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vc3VydmV5LWVycm9yXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBNaW5Sb3dDb3VudEVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcbmltcG9ydCB7IGNvbmZpcm1BY3Rpb24gfSBmcm9tIFwiLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IFNvcnRhYmxlTGliIGZyb20gXCJzb3J0YWJsZWpzXCI7XG5pbXBvcnQgeyBBY3Rpb24sIElBY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25zL2FjdGlvblwiO1xuXG5jb25zdCBTb3J0YWJsZSA9IDxhbnk+U29ydGFibGVMaWI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEeW5hbWljUm93TW9kZWwgZXh0ZW5kcyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbmRleDogbnVtYmVyLCBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLCB2YWx1ZTogYW55KSB7XG4gICAgc3VwZXIoZGF0YSwgdmFsdWUpO1xuICAgIHRoaXMuYnVpbGRDZWxscyh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCByb3dOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmlkO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBtYXRyaXggZHltYW5pYyBxdWVzdGlvbi4gWW91IG1heSB1c2UgYSBkcm9wZG93biwgY2hlY2tib3gsIHJhZGlvZ3JvdXAsIHRleHQgYW5kIGNvbW1lbnQgcXVlc3Rpb25zIGFzIGEgY2VsbCBlZGl0b3JzLlxuICogQW4gZW5kLXVzZXIgbWF5IGR5bmFtaWNhbGx5IGFkZC9yZW1vdmUgcm93cywgdW5saWtlIGluIG1hdHJpeCBkcm9wZG93biBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICBpbXBsZW1lbnRzIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICBwdWJsaWMgb25HZXRWYWx1ZUZvck5ld1Jvd0NhbGxCYWNrOiAoXG4gICAgc2VuZGVyOiBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICApID0+IGFueTtcbiAgcHJpdmF0ZSByb3dDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBpbml0aWFsUm93Q291bnQ6IG51bWJlciA9IDI7XG4gIHByaXZhdGUgc2V0Um93Q291bnRWYWx1ZUZyb21EYXRhOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdm9pZCAoPExvY2FsaXphYmxlU3RyaW5nPihcbiAgICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb25maXJtRGVsZXRlVGV4dFwiLCB0aGlzKVxuICAgICkpO1xuICAgIHZhciBsb2NBZGRSb3dUZXh0ID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImFkZFJvd1RleHRcIiwgdGhpcyk7XG4gICAgbG9jQWRkUm93VGV4dC5vbkdldFRleHRDYWxsYmFjayA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiB0aGlzLmRlZmF1bHRBZGRSb3dUZXh0O1xuICAgIH07XG4gICAgdmFyIGxvY1JlbW92ZVJvd1RleHQgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicmVtb3ZlUm93VGV4dFwiLCB0aGlzKTtcbiAgICBsb2NSZW1vdmVSb3dUZXh0Lm9uR2V0VGV4dENhbGxiYWNrID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gISF0ZXh0ID8gdGV4dCA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZW1vdmVSb3dcIik7XG4gICAgfTtcbiAgICB2YXIgbG9jRW1wdHlSb3dzVGV4dCA9IDxMb2NhbGl6YWJsZVN0cmluZz4oXG4gICAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiZW1wdHlSb3dzVGV4dFwiLCB0aGlzKVxuICAgICk7XG4gICAgbG9jRW1wdHlSb3dzVGV4dC5vbkdldFRleHRDYWxsYmFjayA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZW1wdHlSb3dzVGV4dFwiKTtcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImhpZGVDb2x1bW5zSWZFbXB0eVwiLCBcImFsbG93QWRkUm93c1wiXSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVTaG93VGFibGVBbmRBZGRSb3coKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJhbGxvd1Jvd3NEcmFnQW5kRHJvcFwiLCAoKSA9PiB7XG4gICAgICB0aGlzLmNsZWFyUm93c0FuZFJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHluYW1pY1wiO1xuICB9XG5cbiAgLy9jcm9zcyBmcmFtZXdvcmsgaW5pdGlhbGl6YXRpb25cbiAgcHVibGljIGFmdGVyUmVuZGVyUXVlc3Rpb25FbGVtZW50KGVsOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghIWVsICYmIHRoaXMuYWxsb3dSb3dzRHJhZ0FuZERyb3ApIHtcbiAgICAgIHRoaXMuaW5pdFNvcnRhYmxlKGVsLnF1ZXJ5U2VsZWN0b3IoXCJ0Ym9keVwiKSk7XG4gICAgfVxuICAgIHN1cGVyLmFmdGVyUmVuZGVyUXVlc3Rpb25FbGVtZW50KGVsKTtcbiAgfVxuICAvL2Nyb3NzIGZyYW1ld29yayBkZXN0cm95XG4gIHB1YmxpYyBiZWZvcmVEZXN0cm95UXVlc3Rpb25FbGVtZW50KGVsOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICh0aGlzLnNvcnRhYmxlSW5zdCkgdGhpcy5zb3J0YWJsZUluc3QuZGVzdHJveSgpO1xuICAgIHN1cGVyLmJlZm9yZURlc3Ryb3lRdWVzdGlvbkVsZW1lbnQoZWwpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1Jvd3NEeW5hbWljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSwgdG8gc2hvdyBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgb24gcmVtb3ZpbmcgYSByb3dcbiAgICogQHNlZSBDb25maXJtRGVsZXRlVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbmZpcm1EZWxldGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29uZmlybURlbGV0ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gYSBjb2x1bW4gbmFtZSBhbmQgdGhlIGxpYnJhcnkgc2hvd3MgZHVwbGljYXRpb24gZXJyb3IsIGlmIHRoZXJlIGFyZSBzYW1lIHZhbHVlcyBpbiBkaWZmZXJlbnQgcm93cyBpbiB0aGUgY29sdW1uLlxuICAgKiBAc2VlIGtleUR1cGxpY2F0aW9uRXJyb3JcbiAgICovXG4gIHB1YmxpYyBnZXQga2V5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJrZXlOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5TmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImtleU5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogSWYgaXQgaXMgbm90IGVtcHR5LCB0aGVuIHRoaXMgdmFsdWUgaXMgc2V0IHRvIGV2ZXJ5IG5ldyByb3csIGluY2x1ZGluZyByb3dzIGNyZWF0ZWQgaW5pdGlhbGx5LCB1bmxlc3MgdGhlIGRlZmF1bHRWYWx1ZSBpcyBub3QgZW1wdHlcbiAgICogQHNlZSBkZWZhdWx0VmFsdWVcbiAgICogQHNlZSBkZWZhdWx0VmFsdWVGcm9tTGFzdFJvd1xuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0Um93VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFJvd1ZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFJvd1ZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFJvd1ZhbHVlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIHRvIGNvcHkgdGhlIHZhbHVlIGludG8gbmV3IGFkZGVkIHJvdyBmcm9tIHRoZSBsYXN0IHJvdy4gSWYgZGVmYXVsdFJvd1ZhbHVlIGlzIHNldCBhbmQgdGhpcyBwcm9wZXJ0eSBlcXVhbHMgdG8gdHJ1ZSxcbiAgICogdGhlbiB0aGUgdmFsdWUgZm9yIG5ldyBhZGRlZCByb3cgaXMgbWVyZ2luZy5cbiAgICogQHNlZSBkZWZhdWx0VmFsdWVcbiAgICogQHNlZSBkZWZhdWx0Um93VmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUZyb21MYXN0Um93XCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZUZyb21MYXN0Um93KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUZyb21MYXN0Um93XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzRGVmYXVsdFZhbHVlRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN1cGVyLmlzRGVmYXVsdFZhbHVlRW1wdHkoKSAmJiB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRSb3dWYWx1ZSlcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5taW5Sb3dDb3VudCA8IDEpIHJldHVybiBzdXBlci52YWx1ZUZyb21EYXRhKHZhbCk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHZhbCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSB2YWwubGVuZ3RoOyBpIDwgdGhpcy5taW5Sb3dDb3VudDsgaSsrKSB2YWwucHVzaCh7fSk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFZhbHVlKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFJvd1ZhbHVlKSB8fFxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKVxuICAgICkge1xuICAgICAgc3VwZXIuc2V0RGVmYXVsdFZhbHVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0VtcHR5KCkgfHwgdGhpcy5yb3dDb3VudCA9PSAwKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbHVlID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd0NvdW50OyBpKyspIHtcbiAgICAgIG5ld1ZhbHVlLnB1c2godGhpcy5kZWZhdWx0Um93VmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIG1vdmVSb3dCeUluZGV4ID0gKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcblxuICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgIGNvbnN0IG1vdmFibGVSb3cgPSB2YWx1ZVtmcm9tSW5kZXhdO1xuXG4gICAgaWYgKCFtb3ZhYmxlUm93KSByZXR1cm47XG5cbiAgICB2YWx1ZS5zcGxpY2UoZnJvbUluZGV4LCAxKTtcbiAgICB2YWx1ZS5zcGxpY2UodG9JbmRleCwgMCwgbW92YWJsZVJvdyk7XG5cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIG1hdHJpeC5cbiAgICogQHNlZSBtaW5Sb3dDb3VudFxuICAgKiBAc2VlIG1heFJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucm93Q291bnRWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gYWxsb3cgcm93cyBkcmFnIGFuZCBkcm9wLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd1Jvd3NEcmFnQW5kRHJvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dSb3dzRHJhZ0FuZERyb3BcIik7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd1Jvd3NEcmFnQW5kRHJvcCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd1Jvd3NEcmFnQW5kRHJvcFwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgaW5pdFNvcnRhYmxlKGRvbU5vZGU6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCFkb21Ob2RlKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNSZWFkT25seSkgcmV0dXJuO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuZG9tTm9kZSA9IGRvbU5vZGU7XG5cbiAgICBzZWxmLnNvcnRhYmxlSW5zdCA9IG5ldyBTb3J0YWJsZShkb21Ob2RlLCB7XG4gICAgICBhbmltYXRpb246IDEwMCxcbiAgICAgIGZvcmNlRmFsbGJhY2s6IHRydWUsXG4gICAgICBkZWxheTogMjAwLFxuICAgICAgZGVsYXlPblRvdWNoT25seTogdHJ1ZSxcbiAgICAgIGhhbmRsZTogXCJ0clwiLFxuICAgICAgb25FbmQoZXZ0OiBhbnkpIHtcbiAgICAgICAgc2VsZi5tb3ZlUm93QnlJbmRleChldnQub2xkRHJhZ2dhYmxlSW5kZXgsIGV2dC5uZXdEcmFnZ2FibGVJbmRleCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlbmRlcmVkVGFibGUoKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEeW5hbWljUmVuZGVyZWRUYWJsZSh0aGlzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHJvd0NvdW50VmFsdWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93Q291bnRcIiwgMik7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgcm93Q291bnRWYWx1ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd0NvdW50XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIHNldCByb3dDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IHNldHRpbmdzLm1hdHJpeE1heGltdW1Sb3dDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0Um93Q291bnRWYWx1ZUZyb21EYXRhID0gZmFsc2U7XG4gICAgdmFyIHByZXZWYWx1ZSA9IHRoaXMucm93Q291bnRWYWx1ZTtcbiAgICB0aGlzLnJvd0NvdW50VmFsdWUgPSB2YWw7XG4gICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiB2YWwpIHtcbiAgICAgIHZhciBxVmFsID0gdGhpcy52YWx1ZTtcbiAgICAgIHFWYWwuc3BsaWNlKHZhbCk7XG4gICAgICB0aGlzLnZhbHVlID0gcVZhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMuaW5pdGlhbFJvd0NvdW50ID0gdmFsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyB8fCBwcmV2VmFsdWUgPT0gMCkge1xuICAgICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3Muc3BsaWNlKHZhbCk7XG4gICAgICBmb3IgKHZhciBpID0gcHJldlZhbHVlOyBpIDwgdmFsOyBpKyspIHtcbiAgICAgICAgdmFyIG5ld1JvdyA9IHRoaXMuY3JlYXRlTWF0cml4Um93KHRoaXMuZ2V0VmFsdWVGb3JOZXdSb3coKSk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MucHVzaChuZXdSb3cpO1xuICAgICAgICB0aGlzLm9uTWF0cml4Um93Q3JlYXRlZChuZXdSb3cpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlRm9yTmV3Um93KCk6IGFueSB7XG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgaWYgKCEhdGhpcy5vbkdldFZhbHVlRm9yTmV3Um93Q2FsbEJhY2spIHtcbiAgICAgIHJlcyA9IHRoaXMub25HZXRWYWx1ZUZvck5ld1Jvd0NhbGxCYWNrKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSByb3cgY291bnQuIEEgdXNlciBjb3VsZCBub3QgZGVsZXRlIGEgcm93IGlmIHRoZSByb3dDb3VudCBlcXVhbHMgdG8gbWluUm93Q291bnRcbiAgICogQHNlZSByb3dDb3VudFxuICAgKiBAc2VlIG1heFJvd0NvdW50XG4gICAqIEBzZWUgYWxsb3dBZGRSb3dzXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pblJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pblJvd0NvdW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluUm93Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMCkgdmFsID0gMDtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5Sb3dDb3VudFwiLCB2YWwpO1xuICAgIGlmICh2YWwgPiB0aGlzLm1heFJvd0NvdW50KSB0aGlzLm1heFJvd0NvdW50ID0gdmFsO1xuICAgIGlmICh0aGlzLnJvd0NvdW50IDwgdmFsKSB0aGlzLnJvd0NvdW50ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSByb3cgY291bnQuIEEgdXNlciBjb3VsZCBub3QgYWRkIGEgcm93IGlmIHRoZSByb3dDb3VudCBlcXVhbHMgdG8gbWF4Um93Q291bnRcbiAgICogQHNlZSByb3dDb3VudFxuICAgKiBAc2VlIG1pblJvd0NvdW50XG4gICAqIEBzZWUgYWxsb3dBZGRSb3dzXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFJvd0NvdW50XCIsIHNldHRpbmdzLm1hdHJpeE1heGltdW1Sb3dDb3VudCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhSb3dDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPD0gMCkgcmV0dXJuO1xuICAgIGlmICh2YWwgPiBzZXR0aW5ncy5tYXRyaXhNYXhpbXVtUm93Q291bnQpXG4gICAgICB2YWwgPSBzZXR0aW5ncy5tYXRyaXhNYXhpbXVtUm93Q291bnQ7XG4gICAgaWYgKHZhbCA9PSB0aGlzLm1heFJvd0NvdW50KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4Um93Q291bnRcIiwgdmFsKTtcbiAgICBpZiAodmFsIDwgdGhpcy5taW5Sb3dDb3VudCkgdGhpcy5taW5Sb3dDb3VudCA9IHZhbDtcbiAgICBpZiAodGhpcy5yb3dDb3VudCA+IHZhbCkgdGhpcy5yb3dDb3VudCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgdG8gZGlzYWJsZSBhYmlsaXR5IHRvIGFkZCBuZXcgcm93cy4gXCJBZGQgbmV3IFJvd1wiIGJ1dHRvbiBiZWNvbWVzIGludnNpYmxlIGluIFVJXG4gICAqIEBzZWUgY2FuQWRkUm93XG4gICAqIEBzZWUgYWxsb3dSZW1vdmVSb3dzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93QWRkUm93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dBZGRSb3dzXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dBZGRSb3dzKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93QWRkUm93c1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBkaXNhYmxlIGFiaWxpdHkgdG8gcmVtb3ZlIHJvd3MuIFwiUmVtb3ZlXCIgcm93IGJ1dHRvbnMgYmVjb21lIGludnNpYmxlIGluIFVJXG4gICAqIEBzZWUgY2FuUmVtb3ZlUm93c1xuICAgKiBAc2VlIGFsbG93QWRkUm93c1xuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd1JlbW92ZVJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93UmVtb3ZlUm93c1wiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93UmVtb3ZlUm93cyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd1JlbW92ZVJvd3NcIiwgdmFsKTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIGEgbmV3IHJvdyBjYW4gYmUgYWRkZWQuXG4gICAqIEBzZWUgYWxsb3dBZGRSb3dzXG4gICAqIEBzZWUgbWF4Um93Q291bnRcbiAgICogQHNlZSBjYW5SZW1vdmVSb3dzXG4gICAqIEBzZWUgcm93Q291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgY2FuQWRkUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFsbG93QWRkUm93cyAmJiAhdGhpcy5pc1JlYWRPbmx5ICYmIHRoaXMucm93Q291bnQgPCB0aGlzLm1heFJvd0NvdW50XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgY2FuUmVtb3ZlUm93c0NhbGxiYWNrOiAoYWxsb3c6IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIHJvdyBjYW4gYmUgcmVtb3ZlZC5cbiAgICogQHNlZSBtaW5Sb3dDb3VudFxuICAgKiBAc2VlIGNhbkFkZFJvd1xuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhblJlbW92ZVJvd3MoKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9XG4gICAgICB0aGlzLmFsbG93UmVtb3ZlUm93cyAmJlxuICAgICAgIXRoaXMuaXNSZWFkT25seSAmJlxuICAgICAgdGhpcy5yb3dDb3VudCA+IHRoaXMubWluUm93Q291bnQ7XG4gICAgcmV0dXJuICEhdGhpcy5jYW5SZW1vdmVSb3dzQ2FsbGJhY2sgPyB0aGlzLmNhblJlbW92ZVJvd3NDYWxsYmFjayhyZXMpIDogcmVzO1xuICB9XG4gIHB1YmxpYyBjYW5SZW1vdmVSb3cocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5tYXRyaXhBbGxvd1JlbW92ZVJvdyhcbiAgICAgIHRoaXMsXG4gICAgICAoPE1hdHJpeER5bmFtaWNSb3dNb2RlbD5yb3cpLmluZGV4LFxuICAgICAgcm93XG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgYWRkIGEgbmV3IHJvdyBhbmQgZm9jdXMgdGhlIGNlbGwgaW4gdGhlIGZpcnN0IGNvbHVtbi5cbiAgICovXG4gIHB1YmxpYyBhZGRSb3dVSSgpIHtcbiAgICB2YXIgb2xkUm93Q291bnQgPSB0aGlzLnJvd0NvdW50O1xuICAgIHRoaXMuYWRkUm93KCk7XG4gICAgaWYgKG9sZFJvd0NvdW50ID09PSB0aGlzLnJvd0NvdW50KSByZXR1cm47XG4gICAgdmFyIHEgPSB0aGlzLmdldFF1ZXN0aW9uVG9Gb2N1c09uQWRkaW5nUm93KCk7XG4gICAgaWYgKCEhcSkge1xuICAgICAgcS5mb2N1cygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFF1ZXN0aW9uVG9Gb2N1c09uQWRkaW5nUm93KCk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcm93ID0gdGhpcy52aXNpYmxlUm93c1t0aGlzLnZpc2libGVSb3dzLmxlbmd0aCAtIDFdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHJvdy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICAgIGlmICghIXEgJiYgcS5pc1Zpc2libGUgJiYgIXEuaXNSZWFkT25seSkge1xuICAgICAgICByZXR1cm4gcTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGFkZCBhIG5ldyByb3cuXG4gICAqL1xuICBwdWJsaWMgYWRkUm93KCkge1xuICAgIHZhciBvcHRpb25zID0geyBxdWVzdGlvbjogdGhpcywgY2FuQWRkUm93OiB0aGlzLmNhbkFkZFJvdyB9O1xuICAgIGlmICghIXRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS5tYXRyaXhCZWZvcmVSb3dBZGRlZChvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmNhbkFkZFJvdykgcmV0dXJuO1xuICAgIHRoaXMub25TdGFydFJvd0FkZGluZ1JlbW92aW5nKCk7XG4gICAgdGhpcy5hZGRSb3dDb3JlKCk7XG4gICAgdGhpcy5vbkVuZFJvd0FkZGluZygpO1xuICAgIGlmICh0aGlzLmRldGFpbFBhbmVsU2hvd09uQWRkaW5nICYmIHRoaXMudmlzaWJsZVJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy52aXNpYmxlUm93c1t0aGlzLnZpc2libGVSb3dzLmxlbmd0aCAtIDFdLnNob3dEZXRhaWxQYW5lbCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBzaG93IGRldGFpbCBwYW5lbCBpbW1lZGlhdGVseSBvbiBhZGRpbmcgYSBuZXcgcm93LlxuICAgKiBAc2VlIGRldGFpbFBhbmVsTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBkZXRhaWxQYW5lbFNob3dPbkFkZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGV0YWlsUGFuZWxTaG93T25BZGRpbmdcIik7XG4gIH1cbiAgcHVibGljIHNldCBkZXRhaWxQYW5lbFNob3dPbkFkZGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZXRhaWxQYW5lbFNob3dPbkFkZGluZ1wiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBoYXNSb3dzQXNJdGVtcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHVuYmluZFZhbHVlKCkge1xuICAgIHRoaXMuY2xlYXJHZW5lcmF0ZWRSb3dzKCk7XG4gICAgdGhpcy5jbGVhclByb3BlcnR5VmFsdWUoXCJ2YWx1ZVwiKTtcbiAgICB0aGlzLnJvd0NvdW50VmFsdWUgPSAwO1xuICAgIHN1cGVyLnVuYmluZFZhbHVlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVmFsdWVTdXJ2ZXlFbGVtZW50KHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNFZGl0aW5nU3VydmV5RWxlbWVudCB8fCBzdXBlci5pc1ZhbHVlU3VydmV5RWxlbWVudCh2YWwpO1xuICB9XG4gIHByaXZhdGUgYWRkUm93Q29yZSgpIHtcbiAgICB2YXIgcHJldlJvd0NvdW50ID0gdGhpcy5yb3dDb3VudDtcbiAgICB0aGlzLnJvd0NvdW50ID0gdGhpcy5yb3dDb3VudCArIDE7XG4gICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFJvd1ZhbHVlKHRydWUpO1xuICAgIHZhciBuZXdWYWx1ZSA9IG51bGw7XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eShkZWZhdWx0VmFsdWUpKSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPT0gdGhpcy5yb3dDb3VudCkge1xuICAgICAgICBuZXdWYWx1ZVtuZXdWYWx1ZS5sZW5ndGggLSAxXSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLnJ1bkNlbGxzQ29uZGl0aW9uKFxuICAgICAgICB0aGlzLmdldERhdGFGaWx0ZXJlZFZhbHVlcygpLFxuICAgICAgICB0aGlzLmdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKVxuICAgICAgKTtcbiAgICAgIHZhciByb3cgPSB0aGlzLnZpc2libGVSb3dzW3RoaXMucm93Q291bnQgLSAxXTtcbiAgICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkocm93LnZhbHVlKSkge1xuICAgICAgICBpZiAoIW5ld1ZhbHVlKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLmlzVmFsdWVTdXJ2ZXlFbGVtZW50KG5ld1ZhbHVlKSAmJlxuICAgICAgICAgICFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWVbbmV3VmFsdWUubGVuZ3RoIC0gMV0sIHJvdy52YWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgbmV3VmFsdWVbbmV3VmFsdWUubGVuZ3RoIC0gMV0gPSByb3cudmFsdWU7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgaWYgKHByZXZSb3dDb3VudCArIDEgPT0gdGhpcy5yb3dDb3VudCkge1xuICAgICAgICB0aGlzLnN1cnZleS5tYXRyaXhSb3dBZGRlZChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMudmlzaWJsZVJvd3NbdGhpcy52aXNpYmxlUm93cy5sZW5ndGggLSAxXVxuICAgICAgICApO1xuICAgICAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXREZWZhdWx0Um93VmFsdWUoaXNSb3dBZGRlZDogYm9vbGVhbik6IGFueSB7XG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gdGhpcy5jb2x1bW5zW2ldLnRlbXBsYXRlUXVlc3Rpb247XG4gICAgICBpZiAoISFxICYmICF0aGlzLmlzVmFsdWVFbXB0eShxLmdldERlZmF1bHRWYWx1ZSgpKSkge1xuICAgICAgICByZXMgPSByZXMgfHwge307XG4gICAgICAgICg8YW55PnJlcylbdGhpcy5jb2x1bW5zW2ldLm5hbWVdID0gcS5nZXREZWZhdWx0VmFsdWUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRSb3dWYWx1ZSkpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmRlZmF1bHRSb3dWYWx1ZSkge1xuICAgICAgICByZXMgPSByZXMgfHwge307XG4gICAgICAgICg8YW55PnJlcylba2V5XSA9IHRoaXMuZGVmYXVsdFJvd1ZhbHVlW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1Jvd0FkZGVkICYmIHRoaXMuZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3cpIHtcbiAgICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgICAgaWYgKCEhdmFsICYmIEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID49IHRoaXMucm93Q291bnQgLSAxKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHZhbFt0aGlzLnJvd0NvdW50IC0gMl07XG4gICAgICAgIGZvciAodmFyIGtleSBpbiByb3dWYWx1ZSkge1xuICAgICAgICAgIHJlcyA9IHJlcyB8fCB7fTtcbiAgICAgICAgICAoPGFueT5yZXMpW2tleV0gPSByb3dWYWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSByb3cgYnkgaXQncyBpbmRleC4gSWYgY29uZmlybURlbGV0ZSBpcyB0cnVlLCBzaG93IGEgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgKiBAcGFyYW0gaW5kZXggYSByb3cgaW5kZXgsIGZyb20gMCB0byByb3dDb3VudCAtIDFcbiAgICogQHNlZSByZW1vdmVSb3dcbiAgICogQHNlZSBjb25maXJtRGVsZXRlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUm93VUkodmFsdWU6IGFueSkge1xuICAgIGlmICghIXZhbHVlICYmICEhdmFsdWUucm93TmFtZSkge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy52aXNpYmxlUm93cy5pbmRleE9mKHZhbHVlKTtcbiAgICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcbiAgICAgIHZhbHVlID0gaW5kZXg7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICF0aGlzLmlzUmVxdWlyZUNvbmZpcm1PblJvd0RlbGV0ZSh2YWx1ZSkgfHxcbiAgICAgIGNvbmZpcm1BY3Rpb24odGhpcy5jb25maXJtRGVsZXRlVGV4dClcbiAgICApIHtcbiAgICAgIHRoaXMucmVtb3ZlUm93KHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGlzUmVxdWlyZUNvbmZpcm1PblJvd0RlbGV0ZShpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpcm1EZWxldGUpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucm93Q291bnQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5kZXggPj0gdmFsdWUubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICF0aGlzLmlzVmFsdWVFbXB0eSh2YWx1ZVtpbmRleF0pO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcm93IGJ5IGl0J3MgaW5kZXguXG4gICAqIEBwYXJhbSBpbmRleCBhIHJvdyBpbmRleCwgZnJvbSAwIHRvIHJvd0NvdW50IC0gMVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVJvdyhpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmNhblJlbW92ZVJvd3MpIHJldHVybjtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucm93Q291bnQpIHJldHVybjtcbiAgICB2YXIgcm93ID1cbiAgICAgICEhdGhpcy52aXNpYmxlUm93cyAmJiBpbmRleCA8IHRoaXMudmlzaWJsZVJvd3MubGVuZ3RoXG4gICAgICAgID8gdGhpcy52aXNpYmxlUm93c1tpbmRleF1cbiAgICAgICAgOiBudWxsO1xuICAgIGlmIChcbiAgICAgICEhcm93ICYmXG4gICAgICAhIXRoaXMuc3VydmV5ICYmXG4gICAgICAhdGhpcy5zdXJ2ZXkubWF0cml4Um93UmVtb3ZpbmcodGhpcywgaW5kZXgsIHJvdylcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5vblN0YXJ0Um93QWRkaW5nUmVtb3ZpbmcoKTtcbiAgICB0aGlzLnJlbW92ZVJvd0NvcmUoaW5kZXgpO1xuICAgIHRoaXMub25FbmRSb3dSZW1vdmluZyhyb3cpO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUm93Q29yZShpbmRleDogbnVtYmVyKSB7XG4gICAgdmFyIHJvdyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NcbiAgICAgID8gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpbmRleF1cbiAgICAgIDogbnVsbDtcbiAgICBpZiAodGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyAmJiBpbmRleCA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIHRoaXMucm93Q291bnRWYWx1ZS0tO1xuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICB2YXIgdmFsID0gW107XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiBpbmRleCA8IHRoaXMudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHZhbCA9IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgICB9XG4gICAgICB2YWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHZhbCA9IHRoaXMuZGVsZXRlUm93VmFsdWUodmFsLCBudWxsKTtcbiAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkubWF0cml4Um93UmVtb3ZlZCh0aGlzLCBpbmRleCwgcm93KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0IHNob3dpbmcgaW4gdGhlIGNvbmZpcm1hdGlvbiBkZWxldGUgZGlhbG9nIG9uIHJlbW92aW5nIGEgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY29uZmlybURlbGV0ZVwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBjb25maXJtRGVsZXRlVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29uZmlybURlbGV0ZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jQ29uZmlybURlbGV0ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb25maXJtRGVsZXRlVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFkZCByb3cgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFkZFJvd1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiYWRkUm93VGV4dFwiLCB0aGlzLmRlZmF1bHRBZGRSb3dUZXh0KTtcbiAgfVxuICBwdWJsaWMgc2V0IGFkZFJvd1RleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImFkZFJvd1RleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jQWRkUm93VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImFkZFJvd1RleHRcIik7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgZGVmYXVsdEFkZFJvd1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcbiAgICAgIHRoaXMuaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsID8gXCJhZGRSb3dcIiA6IFwiYWRkQ29sdW1uXCJcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSAnQWRkIFJvdycgYnV0dG9uIGlzIHNob3duIG9uIGJvdHRvbSBpZiBjb2x1bW5MYXlvdXQgaXMgaG9yaXpvbnRhbCBhbmQgb24gdG9wIGlmIGNvbHVtbkxheW91dCBpcyB2ZXJ0aWNhbC4gPGJyLz5cbiAgICogWW91IG1heSBzZXQgaXQgdG8gXCJ0b3BcIiwgXCJib3R0b21cIiBvciBcInRvcEJvdHRvbVwiICh0byBzaG93IG9uIHRvcCBhbmQgYm90dG9tKS5cbiAgICogQHNlZSBjb2x1bW5MYXlvdXRcbiAgICovXG4gIHB1YmxpYyBnZXQgYWRkUm93TG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWRkUm93TG9jYXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBhZGRSb3dMb2NhdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFkZFJvd0xvY2F0aW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldEFkZFJvd0xvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkUm93TG9jYXRpb247XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gaGlkZSBtYXRyaXggY29sdW1ucyB3aGVuIHRoZXJlIGlzIG5vIGFueSByb3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhpZGVDb2x1bW5zSWZFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZUNvbHVtbnNJZkVtcHR5XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaGlkZUNvbHVtbnNJZkVtcHR5KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhpZGVDb2x1bW5zSWZFbXB0eVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRTaG93Q29sdW1uc0lmRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGlkZUNvbHVtbnNJZkVtcHR5O1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgcmVtb3ZlIHJvdyBidXR0b24gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVtb3ZlUm93VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInJlbW92ZVJvd1RleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZW1vdmVSb3dcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVtb3ZlUm93VGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVtb3ZlUm93VGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NSZW1vdmVSb3dUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicmVtb3ZlUm93VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHJlbW92ZSByb3cgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVtcHR5Um93c1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJlbXB0eVJvd3NUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZW1wdHlSb3dzVGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBlbXB0eVJvd3NUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJlbXB0eVJvd3NUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0VtcHR5Um93c1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJlbXB0eVJvd3NUZXh0XCIpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICghdmFsdWUgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0VW5iaW5kVmFsdWUodmFsdWUpO1xuICAgIHZhciByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoICYmIGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWwgPSB2YWx1ZXNbaV07XG4gICAgICBpZiAoIXZhbCkgY29udGludWU7XG4gICAgICB2YWx1ZXNbaV0gPSB0aGlzLmdldFJvd0Rpc3BsYXlWYWx1ZShrZXlzQXNUZXh0LCByb3dzW2ldLCB2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIHB1YmxpYyBhZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KFxuICAgIG9iamVjdHM6IEFycmF5PElDb25kaXRpb25PYmplY3Q+LFxuICAgIGNvbnRleHQ6IGFueVxuICApIHtcbiAgICB2YXIgaGFzQ29udGV4dCA9ICEhY29udGV4dCA/IHRoaXMuY29sdW1ucy5pbmRleE9mKGNvbnRleHQpID4gLTEgOiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgIHRoaXMuYWRkQ29sdW1uSW50b2FkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQob2JqZWN0cywgMCwgY29sdW1uKTtcbiAgICAgIGlmIChoYXNDb250ZXh0ICYmIGNvbHVtbiAhPSBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uSW50b2FkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQob2JqZWN0cywgLTEsIGNvbHVtbik7XG4gICAgICB9XG4gICAgICBmb3IgKFxuICAgICAgICB2YXIgaiA9IDE7XG4gICAgICAgIGogPCBNYXRoLm1pbihzZXR0aW5ncy5tYXRyaXhNYXhSb3dDb3VudEluQ29uZGl0aW9uLCB0aGlzLnJvd0NvdW50KTtcbiAgICAgICAgaisrXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5hZGRDb2x1bW5JbnRvYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChvYmplY3RzLCBqLCBjb2x1bW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZENvbHVtbkludG9hZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KFxuICAgIG9iamVjdHM6IEFycmF5PElDb25kaXRpb25PYmplY3Q+LFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtblxuICApIHtcbiAgICB2YXIgcm93TmFtZSA9IHJvd0luZGV4ID4gLTEgPyBcIltcIiArIHJvd0luZGV4LnRvU3RyaW5nKCkgKyBcIl0uXCIgOiBcInJvdy5cIjtcbiAgICBvYmplY3RzLnB1c2goe1xuICAgICAgbmFtZTpcbiAgICAgICAgKHJvd0luZGV4ID4gLTEgPyB0aGlzLmdldFZhbHVlTmFtZSgpICsgcm93TmFtZSA6IHJvd05hbWUpICsgY29sdW1uLm5hbWUsXG4gICAgICB0ZXh0OlxuICAgICAgICAocm93SW5kZXggPiAtMSA/IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyByb3dOYW1lIDogcm93TmFtZSkgK1xuICAgICAgICBjb2x1bW4uZnVsbFRpdGxlLFxuICAgICAgcXVlc3Rpb246IHRoaXMsXG4gICAgfSk7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1Jvd1RleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKFxuICAgIGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+LFxuICAgIGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMsIGlzT25WYWx1ZUNoYW5nZWQpO1xuICAgIGlmICghaXNPblZhbHVlQ2hhbmdlZCAmJiB0aGlzLmhhc0Vycm9ySW5NaW5Sb3dzKCkpIHtcbiAgICAgIGVycm9ycy5wdXNoKG5ldyBNaW5Sb3dDb3VudEVycm9yKHRoaXMubWluUm93Q291bnQsIHRoaXMpKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBoYXNFcnJvckluTWluUm93cygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5taW5Sb3dDb3VudCA8PSAwIHx8ICF0aGlzLmlzUmVxdWlyZWQgfHwgIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHNldFJvd0NvdW50ID0gMDtcbiAgICBmb3IgKFxuICAgICAgdmFyIHJvd0luZGV4ID0gMDtcbiAgICAgIHJvd0luZGV4IDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7XG4gICAgICByb3dJbmRleCsrXG4gICAgKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tyb3dJbmRleF07XG4gICAgICBpZiAoIXJvdy5pc0VtcHR5KSBzZXRSb3dDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gc2V0Um93Q291bnQgPCB0aGlzLm1pblJvd0NvdW50O1xuICB9XG4gIHByb3RlY3RlZCBnZXRVbmlxdWVDb2x1bW5zKCk6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPiB7XG4gICAgdmFyIHJlcyA9IHN1cGVyLmdldFVuaXF1ZUNvbHVtbnMoKTtcbiAgICBpZiAoISF0aGlzLmtleU5hbWUpIHtcbiAgICAgIGxldCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZSh0aGlzLmtleU5hbWUpO1xuICAgICAgaWYgKCEhY29sdW1uICYmIHJlcy5pbmRleE9mKGNvbHVtbikgPCAwKSB7XG4gICAgICAgIHJlcy5wdXNoKGNvbHVtbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdlbmVyYXRlUm93cygpOiBBcnJheTxNYXRyaXhEeW5hbWljUm93TW9kZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PE1hdHJpeER5bmFtaWNSb3dNb2RlbD4oKTtcbiAgICBpZiAodGhpcy5yb3dDb3VudCA9PT0gMCkgcmV0dXJuIHJlc3VsdDtcbiAgICB2YXIgdmFsID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dDb3VudDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyh0aGlzLmdldFJvd1ZhbHVlQnlJbmRleCh2YWwsIGkpKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5nZXREZWZhdWx0Um93VmFsdWUoZmFsc2UpKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTWF0cml4Um93KHZhbHVlOiBhbnkpOiBNYXRyaXhEeW5hbWljUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHluYW1pY1Jvd01vZGVsKHRoaXMucm93Q291bnRlcisrLCB0aGlzLCB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQmVmb3JlVmFsdWVDaGFuZ2VkKHZhbDogYW55KSB7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuO1xuICAgIHZhciBuZXdSb3dDb3VudCA9IHZhbC5sZW5ndGg7XG4gICAgaWYgKG5ld1Jvd0NvdW50ID09IHRoaXMucm93Q291bnQpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuc2V0Um93Q291bnRWYWx1ZUZyb21EYXRhICYmIG5ld1Jvd0NvdW50IDwgdGhpcy5pbml0aWFsUm93Q291bnQpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5zZXRSb3dDb3VudFZhbHVlRnJvbURhdGEgPSB0cnVlO1xuICAgIHRoaXMucm93Q291bnRWYWx1ZSA9IG5ld1Jvd0NvdW50O1xuICAgIGlmICh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB7XG4gICAgICB0aGlzLmNsZWFyR2VuZXJhdGVkUm93cygpO1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1ZhbHVlKCk6IGFueSB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgaWYgKCFyZXN1bHQgfHwgIUFycmF5LmlzQXJyYXkocmVzdWx0KSkgcmVzdWx0ID0gW107XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiB0aGlzLnJvd0NvdW50KSByZXN1bHQuc3BsaWNlKHRoaXMucm93Q291bnQpO1xuICAgIHZhciByb3dWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFJvd1ZhbHVlKGZhbHNlKTtcbiAgICByb3dWYWx1ZSA9IHJvd1ZhbHVlIHx8IHt9O1xuICAgIGZvciAodmFyIGkgPSByZXN1bHQubGVuZ3RoOyBpIDwgdGhpcy5yb3dDb3VudDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmdldFVuYmluZFZhbHVlKHJvd1ZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGRlbGV0ZVJvd1ZhbHVlKFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBhbnkge1xuICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pc09iamVjdChuZXdWYWx1ZVtpXSkgJiYgT2JqZWN0LmtleXMobmV3VmFsdWVbaV0pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNFbXB0eSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzRW1wdHkgPyBudWxsIDogbmV3VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGdldFJvd1ZhbHVlQnlJbmRleChxdWVzdGlvblZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHF1ZXN0aW9uVmFsdWUpICYmXG4gICAgICBpbmRleCA+PSAwICYmXG4gICAgICBpbmRleCA8IHF1ZXN0aW9uVmFsdWUubGVuZ3RoXG4gICAgICA/IHF1ZXN0aW9uVmFsdWVbaW5kZXhdXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJvd1ZhbHVlQ29yZShcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHF1ZXN0aW9uVmFsdWU6IGFueSxcbiAgICBjcmVhdGU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBhbnkge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIHt9O1xuICAgIHZhciByZXMgPSB0aGlzLmdldFJvd1ZhbHVlQnlJbmRleChcbiAgICAgIHF1ZXN0aW9uVmFsdWUsXG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmluZGV4T2Yocm93KVxuICAgICk7XG4gICAgaWYgKCFyZXMgJiYgY3JlYXRlKSByZXMgPSB7fTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbmNsYXNzIFF1ZXN0aW9uTWF0cml4RHluYW1pY1JlbmRlcmVkVGFibGUgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSB7XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0Um93QWN0aW9ucyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGFjdGlvbnM6IEFycmF5PElBY3Rpb24+XG4gICkge1xuICAgIHN1cGVyLnNldERlZmF1bHRSb3dBY3Rpb25zKHJvdywgYWN0aW9ucyk7XG4gICAgaWYgKHRoaXMubWF0cml4LmFsbG93Um93c0RyYWdBbmREcm9wKSB7XG4gICAgICBhY3Rpb25zLnB1c2goXG4gICAgICAgIG5ldyBBY3Rpb24oe1xuICAgICAgICAgIGlkOiBcImRyYWctcm93XCIsXG4gICAgICAgICAgbG9jYXRpb246IFwic3RhcnRcIixcbiAgICAgICAgICBjb21wb25lbnQ6IFwic3YtbWF0cml4LWRyYWctZHJvcC1pY29uXCIsXG4gICAgICAgICAgZGF0YTogeyByb3c6IHJvdywgcXVlc3Rpb246IHRoaXMubWF0cml4IH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm1hdHJpeGR5bmFtaWNcIixcbiAgW1xuICAgIHsgbmFtZTogXCJyb3dzVmlzaWJsZUlmOmNvbmRpdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJhbGxvd0FkZFJvd3M6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImFsbG93UmVtb3ZlUm93czpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICB7IG5hbWU6IFwicm93Q291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDIsIG1pblZhbHVlOiAwLCBpc0JpbmRhYmxlOiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcIm1pblJvd0NvdW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4Um93Q291bnQ6bnVtYmVyXCIsXG4gICAgICBkZWZhdWx0OiBzZXR0aW5ncy5tYXRyaXhNYXhpbXVtUm93Q291bnQsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwia2V5TmFtZVwiIH0sXG4gICAgXCJkZWZhdWx0Um93VmFsdWU6cm93dmFsdWVcIixcbiAgICBcImRlZmF1bHRWYWx1ZUZyb21MYXN0Um93OmJvb2xlYW5cIixcbiAgICB7IG5hbWU6IFwiY29uZmlybURlbGV0ZTpib29sZWFuXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBkZXBlbmRzT246IFwiY29uZmlybURlbGV0ZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIW9iaiB8fCBvYmouY29uZmlybURlbGV0ZTtcbiAgICAgIH0sXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29uZmlybURlbGV0ZVRleHRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYWRkUm93TG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcInRvcEJvdHRvbVwiXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJhZGRSb3dUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NBZGRSb3dUZXh0XCIgfSxcbiAgICB7IG5hbWU6IFwicmVtb3ZlUm93VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUmVtb3ZlUm93VGV4dFwiIH0sXG4gICAgXCJoaWRlQ29sdW1uc0lmRW1wdHk6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZW1wdHlSb3dzVGV4dDp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRW1wdHlSb3dzVGV4dFwiLFxuICAgICAgZGVwZW5kc09uOiBcImhpZGVDb2x1bW5zSWZFbXB0eVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIW9iaiB8fCBvYmouaGlkZUNvbHVtbnNJZkVtcHR5O1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZGV0YWlsUGFuZWxTaG93T25BZGRpbmc6Ym9vbGVhblwiLFxuICAgICAgZGVwZW5kc09uOiBcImRldGFpbFBhbmVsTW9kZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gb2JqLmRldGFpbFBhbmVsTW9kZSAhPT0gXCJub25lXCI7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJhbGxvd1Jvd3NEcmFnQW5kRHJvcFwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgaXNTZXJpYWxpemFibGU6IGZhbHNlLFxuICAgIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwibWF0cml4ZHJvcGRvd25iYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4ZHluYW1pY1wiLCAobmFtZSkgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbChuYW1lKTtcbiAgcS5jaG9pY2VzID0gWzEsIDIsIDMsIDQsIDVdO1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLmFkZERlZmF1bHRDb2x1bW5zKHEpO1xuICByZXR1cm4gcTtcbn0pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7XG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5SW1wbCxcbiAgSVN1cnZleSxcbiAgSVBhbmVsLFxuICBJRWxlbWVudCxcbiAgSVRleHRQcm9jZXNzb3IsXG4gIElQcm9ncmVzc0luZm8sXG59IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuL3N1cnZleS1lbGVtZW50XCI7XG5pbXBvcnQgeyBTdXJ2ZXlWYWxpZGF0b3IsIElWYWxpZGF0b3JPd25lciB9IGZyb20gXCIuL3ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi9xdWVzdGlvbl90ZXh0XCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU11bHRpcGxlVGV4dERhdGEgZXh0ZW5kcyBJTG9jYWxpemFibGVPd25lciwgSVBhbmVsIHtcbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXk7XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3I7XG4gIGdldEFsbFZhbHVlcygpOiBhbnk7XG4gIGdldE11bHRpcGxlVGV4dFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgc2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55O1xuICBnZXRJdGVtRGVmYXVsdFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgZ2V0SXNSZXF1aXJlZFRleHQoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVUZXh0SXRlbU1vZGVsIGV4dGVuZHMgQmFzZVxuICBpbXBsZW1lbnRzIElWYWxpZGF0b3JPd25lciwgSVN1cnZleURhdGEsIElTdXJ2ZXlJbXBsIHtcbiAgcHJpdmF0ZSBlZGl0b3JWYWx1ZTogUXVlc3Rpb25UZXh0TW9kZWw7XG4gIHByaXZhdGUgZGF0YTogSU11bHRpcGxlVGV4dERhdGE7XG5cbiAgdmFsdWVDaGFuZ2VkQ2FsbGJhY2s6IChuZXdWYWx1ZTogYW55KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IGFueSA9IG51bGwsIHRpdGxlOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVkaXRvclZhbHVlID0gdGhpcy5jcmVhdGVFZGl0b3IobmFtZSk7XG4gICAgdGhpcy5lZGl0b3IucXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH07XG4gICAgdGhpcy5lZGl0b3IudGl0bGVMb2NhdGlvbiA9IFwibGVmdFwiO1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm11bHRpcGxldGV4dGl0ZW1cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmlkO1xuICB9XG4gIHB1YmxpYyBnZXRPcmlnaW5hbE9iaigpOiBCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3I7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpdGVtIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IubmFtZTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5uYW1lID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiA8UXVlc3Rpb24+KDxhbnk+dGhpcy5kYXRhKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRvcigpOiBRdWVzdGlvblRleHRNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUVkaXRvcihuYW1lOiBzdHJpbmcpOiBRdWVzdGlvblRleHRNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblRleHRNb2RlbChuYW1lKTtcbiAgfVxuICBwdWJsaWMgYWRkVXNlZExvY2FsZXMobG9jYWxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIHN1cGVyLmFkZFVzZWRMb2NhbGVzKGxvY2FsZXMpO1xuICAgIHRoaXMuZWRpdG9yLmFkZFVzZWRMb2NhbGVzKGxvY2FsZXMpO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHRoaXMuZWRpdG9yLmxvY1N0cnNDaGFuZ2VkKCk7XG4gIH1cbiAgc2V0RGF0YShkYXRhOiBJTXVsdGlwbGVUZXh0RGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgaWYgKCEhZGF0YSkge1xuICAgICAgdGhpcy5lZGl0b3IuZGVmYXVsdFZhbHVlID0gZGF0YS5nZXRJdGVtRGVmYXVsdFZhbHVlKHRoaXMubmFtZSk7XG4gICAgICB0aGlzLmVkaXRvci5zZXRTdXJ2ZXlJbXBsKHRoaXMpO1xuICAgICAgdGhpcy5lZGl0b3IucGFyZW50ID0gZGF0YTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIG1ha2UgdGhlIGl0ZW0gYSByZXF1aXJlZC4gSWYgYSB1c2VyIGRvZXNuJ3QgZmlsbCB0aGUgaXRlbSB0aGVuIGEgdmFsaWRhdGlvbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuaXNSZXF1aXJlZDtcbiAgfVxuICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5lZGl0b3IuaXNSZXF1aXJlZCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGlucHV0IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5pbnB1dFR5cGU7XG4gIH1cbiAgcHVibGljIHNldCBpbnB1dFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5pbnB1dFR5cGUgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIEl0ZW0gdGl0bGUuIElmIGl0IGlzIGVtcHR5LCB0aGUgaXRlbSBuYW1lIGlzIHJlbmRlcmVkIGFzIHRpdGxlLiBUaGlzIHByb3BlcnR5IHN1cHBvcnRzIG1hcmtkb3duLlxuICAgKiBAc2VlIG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IudGl0bGU7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZWRpdG9yLnRpdGxlID0gdmFsO1xuICB9XG4gIGdldCBsb2NUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IubG9jVGl0bGU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgb3IgaHRtbCBmb3IgcmVuZGVyaW5nIHRoZSB0aXRsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZnVsbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmZ1bGxUaXRsZTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gdGV4dCBsZW5ndGguIElmIGl0IGlzIC0xLCBkZWZhdWwgdmFsdWUsIHRoZW4gdGhlIHN1cnZleSBtYXhUZXh0TGVuZ3RoIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAgICogSWYgaXQgaXMgMCwgdGhlbiB0aGUgdmFsdWUgaXMgdW5saW1pdGVkXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubWF4VGV4dExlbmd0aFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IubWF4TGVuZ3RoO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4TGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5lZGl0b3IubWF4TGVuZ3RoID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXRNYXhMZW5ndGgoKTogYW55IHtcbiAgICB2YXIgc3VydmV5ID0gdGhpcy5nZXRTdXJ2ZXkoKTtcbiAgICByZXR1cm4gSGVscGVycy5nZXRNYXhMZW5ndGgoXG4gICAgICB0aGlzLm1heExlbmd0aCxcbiAgICAgIHN1cnZleSA/IHN1cnZleS5tYXhUZXh0TGVuZ3RoIDogLTFcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgcGxhY2UgaG9sZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBwbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5wbGFjZUhvbGRlcjtcbiAgfVxuICBwdWJsaWMgc2V0IHBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3IucGxhY2VIb2xkZXIgPSB2YWw7XG4gIH1cbiAgZ2V0IGxvY1BsYWNlSG9sZGVyKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IubG9jUGxhY2VIb2xkZXI7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXN0b20gdGV4dCB0aGF0IHdpbGwgYmUgc2hvd24gb24gcmVxdWlyZWQgZXJyb3IuIFVzZSB0aGlzIHByb3BlcnR5LCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc2hvdyB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZEVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5yZXF1aXJlZEVycm9yVGV4dDtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkRXJyb3JUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3IucmVxdWlyZWRFcnJvclRleHQgPSB2YWw7XG4gIH1cbiAgZ2V0IGxvY1JlcXVpcmVkRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IubG9jUmVxdWlyZWRFcnJvclRleHQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBzaXplLlxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnNpemU7XG4gIH1cbiAgcHVibGljIHNldCBzaXplKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5lZGl0b3Iuc2l6ZSA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcXVlc3Rpb24gdmFsaWRhdG9ycy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IudmFsaWRhdG9ycztcbiAgfVxuICBwdWJsaWMgc2V0IHZhbGlkYXRvcnModmFsOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+KSB7XG4gICAgdGhpcy5lZGl0b3IudmFsaWRhdG9ycyA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+IHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0b3JzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaXRlbSB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRNdWx0aXBsZVRleHRWYWx1ZSh0aGlzLm5hbWUpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5kYXRhICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRNdWx0aXBsZVRleHRWYWx1ZSh0aGlzLm5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmlzRW1wdHkoKTtcbiAgfVxuICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKSB0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKG5ld1ZhbHVlKTtcbiAgfVxuICAvL0lTdXJ2ZXlJbXBsXG4gIGdldFN1cnZleURhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFN1cnZleSgpIDogbnVsbDtcbiAgfVxuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFRleHRQcm9jZXNzb3IoKSA6IG51bGw7XG4gIH1cbiAgLy9JU3VydmV5RGF0YVxuICBnZXRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdldE11bHRpcGxlVGV4dFZhbHVlKG5hbWUpO1xuICB9XG4gIHNldFZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIGdldFZhcmlhYmxlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHt9XG4gIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBzZXRDb21tZW50KG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZykge31cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuZGF0YSkgcmV0dXJuIHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKTtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuICBnZXRGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldEFsbFZhbHVlcygpO1xuICB9XG4gIGdldEZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHJldHVybiB7IHN1cnZleTogdGhpcy5nZXRTdXJ2ZXkoKSB9O1xuICB9XG4gIC8vSVZhbGlkYXRvck93bmVyXG4gIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGl0bGU7XG4gIH1cbiAgZ2V0IHZhbGlkYXRlZFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgc2V0IHZhbGlkYXRlZFZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgfVxuICBnZXREYXRhRmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICB9XG4gIGdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgbXVsdGlwbGUgdGV4dCBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwgZXh0ZW5kcyBRdWVzdGlvblxuICBpbXBsZW1lbnRzIElNdWx0aXBsZVRleHREYXRhLCBJUGFuZWwge1xuICBwdWJsaWMgc3RhdGljIGFkZERlZmF1bHRJdGVtcyhxdWVzdGlvbjogUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCkge1xuICAgIHZhciBuYW1lcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0TXV0bGlwbGVUZXh0SXRlbXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgcXVlc3Rpb24uYWRkSXRlbShuYW1lc1tpXSk7XG4gIH1cblxuICBjb2xDb3VudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcIml0ZW1zXCIsIChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGl0ZW0uc2V0RGF0YSh0aGlzKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiaXRlbXNcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNvbENvdW50XCIsICgpID0+IHtcbiAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJpdGVtU2l6ZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUl0ZW1zU2l6ZSgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibXVsdGlwbGV0ZXh0XCI7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLml0ZW1zW2ldLnNldERhdGEodGhpcyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBoYXNTaW5nbGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHRoaXMuZWRpdG9yc09uU3VydmV5TG9hZCgpO1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSwgdXBkYXRlSXNBbnN3ZXJlZDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlLCB1cGRhdGVJc0Fuc3dlcmVkKTtcbiAgICB0aGlzLnBlcmZvcm1Gb3JFdmVyeUVkaXRvcigoaXRlbTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsKTogdm9pZCA9PiB7XG4gICAgICBpdGVtLmVkaXRvci51cGRhdGVWYWx1ZUZyb21TdXJ2ZXkoaXRlbS52YWx1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVJc0Fuc3dlcmVkKCk7XG4gIH1cbiAgb25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLm9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcbiAgICB0aGlzLnBlcmZvcm1Gb3JFdmVyeUVkaXRvcigoaXRlbTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsKTogdm9pZCA9PiB7XG4gICAgICBpdGVtLmVkaXRvci5vblN1cnZleVZhbHVlQ2hhbmdlZChpdGVtLnZhbHVlKTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUl0ZW1zU2l6ZSgpIHtcbiAgICB0aGlzLnBlcmZvcm1Gb3JFdmVyeUVkaXRvcigoaXRlbTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsKTogdm9pZCA9PiB7XG4gICAgICBpdGVtLmVkaXRvci51cGRhdGVJbnB1dFNpemUoKTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGVkaXRvcnNPblN1cnZleUxvYWQoKSB7XG4gICAgdGhpcy5wZXJmb3JtRm9yRXZlcnlFZGl0b3IoKGl0ZW06IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCk6IHZvaWQgPT4ge1xuICAgICAgaXRlbS5lZGl0b3Iub25TdXJ2ZXlMb2FkKCk7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBwZXJmb3JtRm9yRXZlcnlFZGl0b3IoZnVuYzogKGl0ZW06IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCkgPT4gdm9pZCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgICAgaWYgKGl0ZW0uZWRpdG9yKSB7XG4gICAgICAgIGZ1bmMoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBpbnB1dCBpdGVtcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXRlbXMoKTogQXJyYXk8TXVsdGlwbGVUZXh0SXRlbU1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIml0ZW1zXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXRlbXModmFsOiBBcnJheTxNdWx0aXBsZVRleHRJdGVtTW9kZWw+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgbmV3IHRleHQgaXRlbS5cbiAgICogQHBhcmFtIG5hbWUgYSBpdGVtIG5hbWVcbiAgICogQHBhcmFtIHRpdGxlIGEgaXRlbSB0aXRsZSAob3B0aW9uYWwpXG4gICAqL1xuICBwdWJsaWMgYWRkSXRlbShuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgPSBudWxsKTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuY3JlYXRlVGV4dEl0ZW0obmFtZSwgdGl0bGUpO1xuICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICBwdWJsaWMgZ2V0SXRlbUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuaXRlbXNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy5pdGVtc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgbmFtZTogdGhpcy5nZXRWYWx1ZU5hbWUoKSArIFwiLlwiICsgaXRlbS5uYW1lLFxuICAgICAgICB0ZXh0OiB0aGlzLnByb2Nlc3NlZFRpdGxlICsgXCIuXCIgKyBpdGVtLmZ1bGxUaXRsZSxcbiAgICAgICAgcXVlc3Rpb246IHRoaXMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbUJ5TmFtZShwYXRoKTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QoaXRlbSk7XG4gICAganNvbltcInR5cGVcIl0gPSBcInRleHRcIjtcbiAgICByZXR1cm4ganNvbjtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0ubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpXS5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucy4gSXRlbXMgYXJlIHJlbmRyZWQgaW4gb25lIGxpbmUgaWYgdGhlIHZhbHVlIGlzIDAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMSB8fCB2YWwgPiA1KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdGV4dCBpbnB1dCBzaXplLlxuICAgKi9cbiAgcHVibGljIGdldCBpdGVtU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpdGVtU2l6ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGl0ZW1TaXplKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbVNpemVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiByZW5kZXJlZCByb3dzLlxuICAgKi9cbiAgcHVibGljIGdldFJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIGNvbENvdW50ID0gdGhpcy5jb2xDb3VudDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIHZhciByb3dzID0gW107XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaW5kZXggPT0gMCkge1xuICAgICAgICByb3dzLnB1c2goW10pO1xuICAgICAgfVxuICAgICAgcm93c1tyb3dzLmxlbmd0aCAtIDFdLnB1c2goaXRlbXNbaV0pO1xuICAgICAgaW5kZXgrKztcbiAgICAgIGlmIChpbmRleCA+PSBjb2xDb3VudCkge1xuICAgICAgICBpbmRleCA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG4gIHByaXZhdGUgaXNNdWx0aXBsZUl0ZW1WYWx1ZUNoYW5naW5nID0gZmFsc2U7XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5vblZhbHVlQ2hhbmdlZCgpO1xuICAgIHRoaXMub25JdGVtVmFsdWVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVRleHRJdGVtKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aXBsZVRleHRJdGVtTW9kZWwobmFtZSwgdGl0bGUpO1xuICB9XG4gIHByb3RlY3RlZCBvbkl0ZW1WYWx1ZUNoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZUl0ZW1WYWx1ZUNoYW5naW5nKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbVZhbHVlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMuaXRlbXNbaV0ubmFtZSBpbiB0aGlzLnZhbHVlKSB7XG4gICAgICAgIGl0ZW1WYWx1ZSA9IHRoaXMudmFsdWVbdGhpcy5pdGVtc1tpXS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaXRlbXNbaV0ub25WYWx1ZUNoYW5nZWQoaXRlbVZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzUnVubmluZ1ZhbGlkYXRvcnMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHN1cGVyLmdldElzUnVubmluZ1ZhbGlkYXRvcnMoKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpXS5lZGl0b3IuaXNSdW5uaW5nVmFsaWRhdG9ycykgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsIHJlYzogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0uZWRpdG9yLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzID0gKFxuICAgICAgICBoYXNFcnJvcnM6IGJvb2xlYW5cbiAgICAgICkgPT4ge1xuICAgICAgICB0aGlzLnJhaXNlT25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMoKTtcbiAgICAgIH07XG4gICAgICBpZiAoXG4gICAgICAgICEhcmVjICYmXG4gICAgICAgIHJlYy5pc09uVmFsdWVDaGFuZ2VkID09PSB0cnVlICYmXG4gICAgICAgIHRoaXMuaXRlbXNbaV0uZWRpdG9yLmlzRW1wdHkoKVxuICAgICAgKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHJlcyA9IHRoaXMuaXRlbXNbaV0uZWRpdG9yLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYykgfHwgcmVzO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaykgfHwgcmVzO1xuICB9XG4gIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICB2YXIgcmVzdWx0ID0gc3VwZXIuZ2V0QWxsRXJyb3JzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZXJyb3JzID0gdGhpcy5pdGVtc1tpXS5lZGl0b3IuZ2V0QWxsRXJyb3JzKCk7XG4gICAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXJyb3JzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgY2xlYXJFcnJvcnMoKSB7XG4gICAgc3VwZXIuY2xlYXJFcnJvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0uZWRpdG9yLmNsZWFyRXJyb3JzKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRDb250YWluc0Vycm9ycygpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gc3VwZXIuZ2V0Q29udGFpbnNFcnJvcnMoKTtcbiAgICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGl0ZW1zW2ldLmVkaXRvci5jb250YWluc0Vycm9ycykgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXNBbnN3ZXJlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXN1cGVyLmdldElzQW5zd2VyZWQoKSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkaXRvciA9IHRoaXMuaXRlbXNbaV0uZWRpdG9yO1xuICAgICAgaWYgKGVkaXRvci5pc1Zpc2libGUgJiYgIWVkaXRvci5pc0Fuc3dlcmVkKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9ncmVzc0luZm8oKTogSVByb2dyZXNzSW5mbyB7XG4gICAgdmFyIGVsZW1lbnRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKHRoaXMuaXRlbXNbaV0uZWRpdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFN1cnZleUVsZW1lbnQuZ2V0UHJvZ3Jlc3NJbmZvQnlFbGVtZW50cyhlbGVtZW50cywgdGhpcy5pc1JlcXVpcmVkKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gdmFsdWU7XG4gICAgdmFyIHJlcyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgICAgdmFyIHZhbCA9IHZhbHVlW2l0ZW0ubmFtZV07XG4gICAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsKSkgY29udGludWU7XG4gICAgICB2YXIgaXRlbU5hbWUgPSBpdGVtLm5hbWU7XG4gICAgICBpZiAoa2V5c0FzVGV4dCAmJiAhIWl0ZW0udGl0bGUpIHtcbiAgICAgICAgaXRlbU5hbWUgPSBpdGVtLnRpdGxlO1xuICAgICAgfVxuICAgICAgKDxhbnk+cmVzKVtpdGVtTmFtZV0gPSBpdGVtLmVkaXRvci5nZXREaXNwbGF5VmFsdWUoa2V5c0FzVGV4dCwgdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvL0lNdWx0aXBsZVRleHREYXRhXG4gIGdldE11bHRpcGxlVGV4dFZhbHVlKG5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy52YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVbbmFtZV07XG4gIH1cbiAgc2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSB0cnVlO1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghbmV3VmFsdWUpIHtcbiAgICAgIG5ld1ZhbHVlID0ge307XG4gICAgfVxuICAgIG5ld1ZhbHVlW25hbWVdID0gdmFsdWU7XG4gICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5pc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSBmYWxzZTtcbiAgfVxuICBnZXRJdGVtRGVmYXVsdFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5kZWZhdWx0VmFsdWUgPyB0aGlzLmRlZmF1bHRWYWx1ZVtuYW1lXSA6IG51bGw7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3NvcjtcbiAgfVxuICBnZXRBbGxWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSA6IG51bGw7XG4gIH1cbiAgZ2V0SXNSZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHQgOiBcIlwiO1xuICB9XG4gIC8vSVBhbmVsXG4gIGFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIpIHt9XG4gIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibGVmdFwiO1xuICB9XG4gIGdldFF1ZXN0aW9uU3RhcnRJbmRleCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFN0YXJ0SW5kZXgoKTtcbiAgfVxuICBnZXRDaGlsZHJlbkxheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyb3dcIjtcbiAgfVxuICBlbGVtZW50V2lkdGhDaGFuZ2VkKGVsOiBJRWxlbWVudCkge31cbiAgZ2V0IGVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGluZGV4T2YoZWw6IElFbGVtZW50KTogbnVtYmVyIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgZW5zdXJlUm93c1Zpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibXVsdGlwbGV0ZXh0aXRlbVwiLFxuICBbXG4gICAgXCJuYW1lXCIsXG4gICAgXCJpc1JlcXVpcmVkOmJvb2xlYW5cIixcbiAgICB7IG5hbWU6IFwicGxhY2VIb2xkZXJcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BsYWNlSG9sZGVyXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImlucHV0VHlwZVwiLFxuICAgICAgZGVmYXVsdDogXCJ0ZXh0XCIsXG4gICAgICBjaG9pY2VzOiBbXG4gICAgICAgIFwiY29sb3JcIixcbiAgICAgICAgXCJkYXRlXCIsXG4gICAgICAgIFwiZGF0ZXRpbWVcIixcbiAgICAgICAgXCJkYXRldGltZS1sb2NhbFwiLFxuICAgICAgICBcImVtYWlsXCIsXG4gICAgICAgIFwibW9udGhcIixcbiAgICAgICAgXCJudW1iZXJcIixcbiAgICAgICAgXCJwYXNzd29yZFwiLFxuICAgICAgICBcInJhbmdlXCIsXG4gICAgICAgIFwidGVsXCIsXG4gICAgICAgIFwidGV4dFwiLFxuICAgICAgICBcInRpbWVcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJ3ZWVrXCIsXG4gICAgICBdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcInRpdGxlXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiIH0sXG4gICAgeyBuYW1lOiBcIm1heExlbmd0aDpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwic2l6ZTpudW1iZXJcIiwgbWluVmFsdWU6IDAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0OnRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZXF1aXJlZEVycm9yVGV4dFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ2YWxpZGF0b3JzOnZhbGlkYXRvcnNcIixcbiAgICAgIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dmFsaWRhdG9yXCIsXG4gICAgICBjbGFzc05hbWVQYXJ0OiBcInZhbGlkYXRvclwiLFxuICAgIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgTXVsdGlwbGVUZXh0SXRlbU1vZGVsKFwiXCIpO1xuICB9XG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm11bHRpcGxldGV4dFwiLFxuICBbXG4gICAgeyBuYW1lOiBcIiFpdGVtczp0ZXh0aXRlbXNcIiwgY2xhc3NOYW1lOiBcIm11bHRpcGxldGV4dGl0ZW1cIiB9LFxuICAgIHsgbmFtZTogXCJpdGVtU2l6ZTpudW1iZXJcIiwgbWluVmFsdWU6IDAgfSxcbiAgICB7IG5hbWU6IFwiY29sQ291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDEsIGNob2ljZXM6IFsxLCAyLCAzLCA0LCA1XSB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtdWx0aXBsZXRleHRcIiwgKG5hbWUpID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbChuYW1lKTtcbiAgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbC5hZGREZWZhdWx0SXRlbXMocSk7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5pbXBvcnQge1xuICBJRWxlbWVudCxcbiAgSVF1ZXN0aW9uLFxuICBJUGFuZWwsXG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5LFxuICBJU3VydmV5SW1wbCxcbiAgSVRleHRQcm9jZXNzb3IsXG4gIElQcm9ncmVzc0luZm8sXG59IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuL3N1cnZleS1lbGVtZW50XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQge1xuICBUZXh0UHJlUHJvY2Vzc29yVmFsdWUsXG4gIFF1ZXN0aW9uVGV4dFByb2Nlc3Nvcixcbn0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCIuL3BhbmVsXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBwcm9wZXJ0eSwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgS2V5RHVwbGljYXRpb25FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBQYW5lbCB9IGZyb20gXCIuL2tub2Nrb3V0L2tvcGFnZVwiO1xuaW1wb3J0IHsgY29uZmlybUFjdGlvbiB9IGZyb20gXCIuL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEge1xuICBnZXRJdGVtSW5kZXgoaXRlbTogSVN1cnZleURhdGEpOiBudW1iZXI7XG4gIGdldFBhbmVsSXRlbURhdGEoaXRlbTogSVN1cnZleURhdGEpOiBhbnk7XG4gIHNldFBhbmVsSXRlbURhdGEoaXRlbTogSVN1cnZleURhdGEsIG5hbWU6IHN0cmluZywgdmFsOiBhbnkpOiBhbnk7XG4gIGdldFNoYXJlZFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgcGFuZWxJbmRleDogbnVtYmVyKTogUXVlc3Rpb247XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xuICBnZXRSb290RGF0YSgpOiBJU3VydmV5RGF0YTtcbn1cblxuY2xhc3MgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtVGV4dFByb2Nlc3NvciBleHRlbmRzIFF1ZXN0aW9uVGV4dFByb2Nlc3NvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGF0YTogSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSxcbiAgICBwcm90ZWN0ZWQgcGFuZWxJdGVtOiBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0sXG4gICAgcHJvdGVjdGVkIHZhcmlhYmxlTmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHZhcmlhYmxlTmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxJdGVtLmdldFN1cnZleSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxJdGVtLnBhbmVsO1xuICB9XG4gIHByaXZhdGUgZ2V0IHBhbmVsSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0SXRlbUluZGV4KHRoaXMucGFuZWxJdGVtKSA6IC0xO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbEl0ZW0uZ2V0QWxsVmFsdWVzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFF1ZXN0aW9uQnlOYW1lKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcmVzID0gc3VwZXIuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIHZhciBpbmRleCA9IHRoaXMucGFuZWxJbmRleDtcbiAgICByZXR1cm4gaW5kZXggPiAtMVxuICAgICAgPyB0aGlzLmRhdGEuZ2V0U2hhcmVkUXVlc3Rpb25Gcm9tQXJyYXkobmFtZSwgaW5kZXgpXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3VzdG9tUHJvY2Vzc1RleHQodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAodGV4dFZhbHVlLm5hbWUgPT0gUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkluZGV4VmFyaWFibGVOYW1lKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLnBhbmVsSW5kZXg7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgICB0ZXh0VmFsdWUudmFsdWUgPSBpbmRleCArIDE7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB0ZXh0VmFsdWUubmFtZS5pbmRleE9mKFxuICAgICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uUGFyZW50SXRlbVZhcmlhYmxlTmFtZSArIFwiLlwiXG4gICAgICApID09IDBcbiAgICApIHtcbiAgICAgIHZhciBxID0gPFF1ZXN0aW9uPig8YW55PnRoaXMuZGF0YSk7XG4gICAgICBpZiAoISFxICYmICEhcS5wYXJlbnRRdWVzdGlvbiAmJiAhIXEucGFyZW50KSB7XG4gICAgICAgIHZhciBkYXRhID0gKDxhbnk+cS5wYXJlbnQpLmRhdGE7XG4gICAgICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtVGV4dFByb2Nlc3NvcihcbiAgICAgICAgICA8SVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YT4oPGFueT5xLnBhcmVudFF1ZXN0aW9uKSxcbiAgICAgICAgICA8UXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtPmRhdGEsXG4gICAgICAgICAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIHRleHQgPSB0ZXh0VmFsdWUubmFtZS5yZXBsYWNlKFxuICAgICAgICAgIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5QYXJlbnRJdGVtVmFyaWFibGVOYW1lLFxuICAgICAgICAgIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JdGVtVmFyaWFibGVOYW1lXG4gICAgICAgICk7XG4gICAgICAgIHZhciByZXMgPSBwcm9jZXNzb3IucHJvY2Vzc1ZhbHVlKHRleHQsIHRleHRWYWx1ZS5yZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSByZXMuaXNFeGlzdHM7XG4gICAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHJlcy52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSBpbXBsZW1lbnRzIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCB7XG4gIHB1YmxpYyBzdGF0aWMgSXRlbVZhcmlhYmxlTmFtZSA9IFwicGFuZWxcIjtcbiAgcHVibGljIHN0YXRpYyBQYXJlbnRJdGVtVmFyaWFibGVOYW1lID0gXCJwYXJlbnRQYW5lbFwiO1xuICBwdWJsaWMgc3RhdGljIEluZGV4VmFyaWFibGVOYW1lID0gXCJwYW5lbEluZGV4XCI7XG4gIHByaXZhdGUgcGFuZWxWYWx1ZTogUGFuZWxNb2RlbDtcbiAgcHJpdmF0ZSBkYXRhOiBJUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhO1xuICBwcml2YXRlIHRleHRQcmVQcm9jZXNzb3I6IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbVRleHRQcm9jZXNzb3I7XG4gIGNvbnN0cnVjdG9yKGRhdGE6IElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEsIHBhbmVsOiBQYW5lbE1vZGVsKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnBhbmVsVmFsdWUgPSBwYW5lbDtcbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtVGV4dFByb2Nlc3NvcihcbiAgICAgIGRhdGEsXG4gICAgICB0aGlzLFxuICAgICAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWVcbiAgICApO1xuICAgIHRoaXMuc2V0U3VydmV5SW1wbCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgcGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCgpIHtcbiAgICB0aGlzLnBhbmVsLnNldFN1cnZleUltcGwodGhpcyk7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0QWxsVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlc1tuYW1lXTtcbiAgfVxuICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5kYXRhLnNldFBhbmVsSXRlbURhdGEodGhpcywgbmFtZSwgbmV3VmFsdWUpO1xuICB9XG4gIGdldFZhcmlhYmxlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHt9XG4gIHB1YmxpYyBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWUobmFtZSArIHNldHRpbmdzLmNvbW1lbnRQcmVmaXgpO1xuICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzZXRDb21tZW50KG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZywgbG9jTm90aWZpY2F0aW9uOiBhbnkpIHtcbiAgICB0aGlzLnNldFZhbHVlKG5hbWUgKyBzZXR0aW5ncy5jb21tZW50UHJlZml4LCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZXRQYW5lbEl0ZW1EYXRhKHRoaXMpO1xuICB9XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgdmFyIHZhbHVlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIHZhciBzdXJ2ZXlWYWx1ZXMgPVxuICAgICAgISF0aGlzLmRhdGEgJiYgISF0aGlzLmRhdGEuZ2V0Um9vdERhdGEoKVxuICAgICAgICA/IHRoaXMuZGF0YS5nZXRSb290RGF0YSgpLmdldEZpbHRlcmVkVmFsdWVzKClcbiAgICAgICAgOiB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3VydmV5VmFsdWVzKSB7XG4gICAgICB2YWx1ZXNba2V5XSA9IHN1cnZleVZhbHVlc1trZXldO1xuICAgIH1cbiAgICB2YWx1ZXNbUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWVdID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICBpZiAoISF0aGlzLmRhdGEpIHtcbiAgICAgIHZhbHVlc1tcbiAgICAgICAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkluZGV4VmFyaWFibGVOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgIF0gPSB0aGlzLmRhdGEuZ2V0SXRlbUluZGV4KHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIGdldEZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIGlmICghIXRoaXMuZGF0YSAmJiAhIXRoaXMuZGF0YS5nZXRSb290RGF0YSgpKVxuICAgICAgcmV0dXJuIHRoaXMuZGF0YS5nZXRSb290RGF0YSgpLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgIHJldHVybiB7IHN1cnZleTogdGhpcy5nZXRTdXJ2ZXkoKSB9O1xuICB9XG4gIGdldFN1cnZleURhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFN1cnZleSgpIDogbnVsbDtcbiAgfVxuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJlUHJvY2Vzc29yO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblBhbmVsRHluYW1pY1RlbXBsYXRlU3VydmV5SW1wbCBpbXBsZW1lbnRzIElTdXJ2ZXlJbXBsIHtcbiAgY29uc3RydWN0b3IocHVibGljIGRhdGE6IElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEpIHt9XG4gIGdldFN1cnZleURhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdldFN1cnZleSgpO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBwYW5lbCBkeW1hbmljIHF1ZXN0aW9uLiBZb3Ugc2V0dXAgdGhlIHRlbXBsYXRlIHBhbmVsLCBidXQgYWRkaW5nIGVsZW1lbnRzIChhbnkgcXVlc3Rpb24gb3IgYSBwYW5lbCkgYW5kIGFzc2lnbiBhIHRleHQgdG8gaXQncyB0aXRsZSwgYW5kIHRoaXMgcGFuZWwgd2lsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgb24gY3JlYXRpbmcgZHluYW1pYyBwYW5lbHMuIFRoZSBudW1iZXIgb2YgcGFuZWxzIGlzIGRlZmluZWQgYnkgcGFuZWxDb3VudCBwcm9wZXJ0eS5cbiAqIEFuIGVuZC11c2VyIG1heSBkeW5hbWljYWxseSBhZGQvcmVtb3ZlIHBhbmVscywgdW5sZXNzIHlvdSBmb3JiaWRkZW4gdGhpcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwgZXh0ZW5kcyBRdWVzdGlvblxuICBpbXBsZW1lbnRzIElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEge1xuICBwcml2YXRlIHRlbXBsYXRlVmFsdWU6IFBhbmVsTW9kZWw7XG4gIHByaXZhdGUgbG9hZGluZ1BhbmVsQ291bnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjaGFuZ2luZ1ZhbHVlUXVlc3Rpb246IFF1ZXN0aW9uO1xuICBwcml2YXRlIGN1cnJlbnRJbmRleFZhbHVlOiBudW1iZXIgPSAtMTtcblxuICByZW5kZXJNb2RlQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInBhbmVsc1wiKTtcbiAgICB0aGlzLnRlbXBsYXRlVmFsdWUgPSB0aGlzLmNyZWF0ZUFuZFNldHVwTmV3UGFuZWxPYmplY3QoKTtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcldpZHRoID0gXCIxMDAlXCI7XG4gICAgdGhpcy50ZW1wbGF0ZS5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnbiA9IHRoaXM7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50ZW1wbGF0ZS5hZGRFbGVtZW50Q2FsbGJhY2sgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICBzZWxmLmFkZE9uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2soZWxlbWVudCk7XG4gICAgICBzZWxmLnJlYnVpbGRQYW5lbHMoKTtcbiAgICB9O1xuICAgIHRoaXMudGVtcGxhdGUucmVtb3ZlRWxlbWVudENhbGxiYWNrID0gZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgc2VsZi5yZWJ1aWxkUGFuZWxzKCk7XG4gICAgfTtcblxuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb25maXJtRGVsZXRlVGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxBZGRUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbFJlbW92ZVRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsUHJldlRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsTmV4dFRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInBhbmVsc1N0YXRlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5zZXRQYW5lbHNTdGF0ZSgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzU2luZ2xlSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIHRoaXMuc2V0VGVtcGxhdGVQYW5lbFN1cnZleUltcGwoKTtcbiAgICB0aGlzLnNldFBhbmVsc1N1cnZleUltcGwoKTtcbiAgfVxuICBwcml2YXRlIGFzc2lnbk9uUHJvcGVydHlDaGFuZ2VkVG9UZW1wbGF0ZSgpIHtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnRlbXBsYXRlLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayhlbGVtZW50c1tpXSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkT25Qcm9wZXJ0eUNoYW5nZWRDYWxsYmFjayhlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAoPEJhc2U+KDxhbnk+ZWxlbWVudCkpLm9uUHJvcGVydHlDaGFuZ2VkLmFkZChmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICBzZWxmLm9uVGVtcGxhdGVFbGVtZW50UHJvcGVydHlDaGFuZ2VkKGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH0pO1xuICAgIGlmIChlbGVtZW50LmlzUGFuZWwpIHtcbiAgICAgICg8UGFuZWxNb2RlbD4oPGFueT5lbGVtZW50KSkuYWRkRWxlbWVudENhbGxiYWNrID0gZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICBzZWxmLmFkZE9uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2soZWxlbWVudCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBwcml2YXRlIG9uVGVtcGxhdGVFbGVtZW50UHJvcGVydHlDaGFuZ2VkKGVsZW1lbnQ6IGFueSwgb3B0aW9uczogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHwgdGhpcy5pc0Rlc2lnbk1vZGUgfHwgdGhpcy5wYW5lbHMubGVuZ3RoID09IDApXG4gICAgICByZXR1cm47XG4gICAgdmFyIHByb3BlcnR5ID0gU2VyaWFsaXplci5maW5kUHJvcGVydHkoZWxlbWVudC5nZXRUeXBlKCksIG9wdGlvbnMubmFtZSk7XG4gICAgaWYgKCFwcm9wZXJ0eSkgcmV0dXJuO1xuICAgIHZhciBwYW5lbHMgPSB0aGlzLnBhbmVscztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9uID0gcGFuZWxzW2ldLmdldFF1ZXN0aW9uQnlOYW1lKGVsZW1lbnQubmFtZSk7XG4gICAgICBpZiAoISFxdWVzdGlvbiAmJiAoPGFueT5xdWVzdGlvbilbb3B0aW9ucy5uYW1lXSAhPT0gb3B0aW9ucy5uZXdWYWx1ZSkge1xuICAgICAgICAoPGFueT5xdWVzdGlvbilbb3B0aW9ucy5uYW1lXSA9IG9wdGlvbnMubmV3VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicGFuZWxkeW5hbWljXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0NvbXBvc2l0ZVF1ZXN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBjbGVhck9uRGVsZXRpbmdDb250YWluZXIoKSB7XG4gICAgdGhpcy5wYW5lbHMuZm9yRWFjaCgocGFuZWwpID0+IHtcbiAgICAgIHBhbmVsLmNsZWFyT25EZWxldGluZ0NvbnRhaW5lcigpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5yZW1vdmVFbGVtZW50KGVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbC4gVGhpcyBwYW5lbCBpcyB1c2VkIGFzIGEgdGVtcGxhdGUgb24gY3JlYXRpZ24gZHluYW1pYyBwYW5lbHNcbiAgICogQHNlZSAgdGVtcGxhdGVFbGVtZW50c1xuICAgKiBAc2VlIHRlbXBsYXRlVGl0bGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHRlbXBsYXRlKCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldFBhbmVsKCk6IElQYW5lbCB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbCBlbGVtZW50cywgcXVlc3Rpb25zIGFuZCBwYW5lbHMuXG4gICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVFbGVtZW50cygpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmVsZW1lbnRzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgUGFuZWwgdGl0bGUgcHJvcGVydHkuXG4gICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLnRpdGxlO1xuICB9XG4gIHB1YmxpYyBzZXQgdGVtcGxhdGVUaXRsZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS50aXRsZSA9IG5ld1ZhbHVlO1xuICB9XG4gIGdldCBsb2NUZW1wbGF0ZVRpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5sb2NUaXRsZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIFBhbmVsIGRlc2NyaXB0aW9uIHByb3BlcnR5LlxuICAgKiBAc2VlICB0ZW1wbGF0ZUVsZW1lbnRzXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgdGVtcGxhdGVUaXRsZVxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZURlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuZGVzY3JpcHRpb247XG4gIH1cbiAgcHVibGljIHNldCB0ZW1wbGF0ZURlc2NyaXB0aW9uKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlLmRlc2NyaXB0aW9uID0gbmV3VmFsdWU7XG4gIH1cbiAgZ2V0IGxvY1RlbXBsYXRlRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmxvY0Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpdGVtcygpOiBBcnJheTxJU3VydmV5RGF0YT4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaCh0aGlzLnBhbmVsc1tpXS5kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogVGhlIGFycmF5IG9mIGR5bmFtaWMgcGFuZWxzIGNyZWF0ZWQgYmFzZWQgb24gcGFuZWwgdGVtcGxhdGVcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxzKCk6IEFycmF5PFBhbmVsTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFuZWxzXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgY3VycmVudCBhY3RpdmUgZHluYW1pY2FsIHBhbmVsIHdoZW4gdGhlIHJlbmRlck1vZGUgaXMgbm90IFwibGlzdFwiLiBJZiB0aGVyZSBpcyBubyBkeW1hbWljIHBhbmVsIChwYW5lbENvdW50ID0gMCkgb3IgcmVuZGVyTW9kZSBlcXVhbHMgXCJsaXN0XCIgaXQgcmV0dXJucyAtMSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgYSB2YWx1ZSBmcm9tIDAgdG8gcGFuZWxDb3VudCAtIDEuXG4gICAqIEBzZWUgY3VycmVudFBhbmVsXG4gICAqIEBzZWUgcGFuZWxzXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudEluZGV4KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaXNSZW5kZXJNb2RlTGlzdCkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIDA7XG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4VmFsdWUgPCAwICYmIHRoaXMucGFuZWxDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4VmFsdWUgPSAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50SW5kZXhWYWx1ZSA+PSB0aGlzLnBhbmVsQ291bnQpIHtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4VmFsdWUgPSB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXhWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbnRJbmRleCh2YWw6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleFZhbHVlICE9PSB2YWwpIHtcbiAgICAgIGlmICh2YWwgPj0gdGhpcy5wYW5lbENvdW50KSB2YWwgPSB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXhWYWx1ZSA9IHZhbDtcbiAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGFjdGl2ZSBkeW5hbWljYWwgcGFuZWwgd2hlbiB0aGUgcmVuZGVyTW9kZSBpcyBub3QgXCJsaXN0XCIuIElmIHRoZXJlIGlzIG5vIGR5bWFtaWMgcGFuZWwgKHBhbmVsQ291bnQgPSAwKSBvciByZW5kZXJNb2RlIGVxdWFscyBcImxpc3RcIiBpdCByZXR1cm5zIG51bGwuXG4gICAqIEBzZWUgY3VycmVuSW5kZXhcbiAgICogQHNlZSBwYW5lbHNcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50UGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5jdXJyZW50SW5kZXg7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnBhbmVscy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnBhbmVsc1tpbmRleF07XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBzaG93IGEgY29uZmlybWF0aW9uIGRpYWxvZyBvbiByZW1vdmluZyBhIHBhbmVsXG4gICAqIEBzZWUgQ29uZmlybURlbGV0ZVRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZmlybURlbGV0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29uZmlybURlbGV0ZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBjb25maXJtRGVsZXRlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbmZpcm1EZWxldGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGEgcXVlc3Rpb24gbmFtZSB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBwYW5lbCBhbmQgdGhlIGxpYnJhcnkgc2hvd3MgZHVwbGljYXRpb24gZXJyb3IsIGlmIHRoZXJlIGFyZSBzYW1lIHZhbHVlcyBpbiBkaWZmZXJlbnQgcGFuZWxzIG9mIHRoaXMgcXVlc3Rpb24uXG4gICAqIEBzZWUga2V5RHVwbGljYXRpb25FcnJvclxuICAgKi9cbiAgcHVibGljIGdldCBrZXlOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImtleU5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBrZXlOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwia2V5TmFtZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dCBzaG93aW5nIGluIHRoZSBjb25maXJtYXRpb24gZGVsZXRlIGRpYWxvZyBvbiByZW1vdmluZyBhIHBhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY29uZmlybURlbGV0ZVwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBjb25maXJtRGVsZXRlVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29uZmlybURlbGV0ZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jQ29uZmlybURlbGV0ZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkdXBsaWNhdGlvbiB2YWx1ZSBlcnJvciB0ZXh0LiBTZXQgaXQgdG8gc2hvdyB0aGUgdGV4dCBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdC5cbiAgICogQHNlZSBrZXlOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0IGtleUR1cGxpY2F0aW9uRXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBrZXlEdXBsaWNhdGlvbkVycm9yKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0tleUR1cGxpY2F0aW9uRXJyb3IoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHByZXZpb3VzIGJ1dHRvbiB0ZXh0LiBQcmV2aW91cyBidXR0b24gc2hvd3MgdGhlIHByZXZpb3VzIHBhbmVsLCBjaGFuZ2UgdGhlIGN1cnJlbnRQYW5lbCwgd2hlbiB0aGUgcmVuZGVyTW9kZSBkb2Vzbid0IGVxdWFsIHRvIFwibGlzdFwiLlxuICAgKiBAc2VlIGN1cnJlbnRQYW5lbFxuICAgKiBAc2VlIGN1cnJlbnRJbmRleFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxQcmV2VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFuZWxQcmV2VGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBhZ2VQcmV2VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbFByZXZUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbFByZXZUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1BhbmVsUHJldlRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxQcmV2VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IG5leHQgYnV0dG9uIHRleHQuIE5leHQgYnV0dG9uIHNob3dzIHRoZSBuZXh0IHBhbmVsLCBjaGFuZ2UgdGhlIGN1cnJlbnRQYW5lbCwgd2hlbiB0aGUgcmVuZGVyTW9kZSBkb2Vzbid0IGVxdWFsIHRvIFwibGlzdFwiLlxuICAgKiBAc2VlIGN1cnJlbnRQYW5lbFxuICAgKiBAc2VlIGN1cnJlbnRJbmRleFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxOZXh0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFuZWxOZXh0VGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInBhZ2VOZXh0VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbE5leHRUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbE5leHRUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1BhbmVsTmV4dFRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxOZXh0VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFkZCBwYW5lbCBidXR0b24gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxBZGRUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFuZWxBZGRUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiYWRkUGFuZWxcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxBZGRUZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsQWRkVGV4dFwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1BhbmVsQWRkVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbEFkZFRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiByZW1vdmUgcGFuZWwgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsUmVtb3ZlVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhbmVsUmVtb3ZlVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlbW92ZVBhbmVsXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsUmVtb3ZlVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxSZW1vdmVUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1BhbmVsUmVtb3ZlVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbFJlbW92ZVRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSByZW5kZXJNb2RlIGVxdWFscyB0byBcInByb2dyZXNzVG9wXCIgb3IgXCJwcm9ncmVzc1RvcEJvdHRvbVwiXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUHJvZ3Jlc3NUb3BTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnJlbmRlck1vZGUgPT0gXCJwcm9ncmVzc1RvcFwiIHx8IHRoaXMucmVuZGVyTW9kZSA9PSBcInByb2dyZXNzVG9wQm90dG9tXCJcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcmVuZGVyTW9kZSBlcXVhbHMgdG8gXCJwcm9ncmVzc0JvdHRvbVwiIG9yIFwicHJvZ3Jlc3NUb3BCb3R0b21cIlxuICAgKi9cbiAgcHVibGljIGdldCBpc1Byb2dyZXNzQm90dG9tU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZW5kZXJNb2RlID09IFwicHJvZ3Jlc3NCb3R0b21cIiB8fFxuICAgICAgdGhpcy5yZW5kZXJNb2RlID09IFwicHJvZ3Jlc3NUb3BCb3R0b21cIlxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIGN1cnJlbnRJbmRleCBpcyBtb3JlIHRoYW4gMC5cbiAgICogQHNlZSBjdXJyZW5JbmRleFxuICAgKiBAc2VlIGN1cnJlblBhbmVsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUHJldkJ1dHRvblNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEluZGV4ID4gMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gY3VycmVudEluZGV4IGlzIG1vcmUgdGhhbiBvciBlcXVhbCAwIGFuZCBsZXNzIHRoYW4gcGFuZWxDb3VudCAtIDEuXG4gICAqIEBzZWUgY3VycmVuSW5kZXhcbiAgICogQHNlZSBjdXJyZW5QYW5lbFxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNOZXh0QnV0dG9uU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXggPj0gMCAmJiB0aGlzLmN1cnJlbnRJbmRleCA8IHRoaXMucGFuZWxDb3VudCAtIDE7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHNob3dSYW5nZUluUHJvZ3Jlc3MgZXF1YWxzIHRvIHRydWUsIHJlbmRlck1vZGUgZG9lc24ndCBlcXVhbCB0byBcImxpc3RcIiBhbmQgcGFuZWxDb3VudCBpcyA+PSAyLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JhbmdlU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zaG93UmFuZ2VJblByb2dyZXNzICYmIHRoaXMuY3VycmVudEluZGV4ID49IDAgJiYgdGhpcy5wYW5lbENvdW50ID4gMVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRzSW5EZXNpZ24oaW5jbHVkZUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gaW5jbHVkZUhpZGRlbiA/IFt0aGlzLnRlbXBsYXRlXSA6IHRoaXMudGVtcGxhdGVFbGVtZW50cztcbiAgfVxuICBwcml2YXRlIGlzQWRkaW5nTmV3UGFuZWxzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgYWRkaW5nTmV3UGFuZWxzVmFsdWU6IGFueTtcbiAgcHJpdmF0ZSBpc05ld1BhbmVsc1ZhbHVlQ2hhbmdlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBwcmVwYXJlVmFsdWVGb3JQYW5lbENyZWF0aW5nKCkge1xuICAgIHRoaXMuYWRkaW5nTmV3UGFuZWxzVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIHRoaXMuaXNBZGRpbmdOZXdQYW5lbHMgPSB0cnVlO1xuICAgIHRoaXMuaXNOZXdQYW5lbHNWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgfVxuICBwcml2YXRlIHNldFZhbHVlQWZ0ZXJQYW5lbHNDcmVhdGluZygpIHtcbiAgICB0aGlzLmlzQWRkaW5nTmV3UGFuZWxzID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNOZXdQYW5lbHNWYWx1ZUNoYW5nZWQpIHtcbiAgICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IHRydWU7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5hZGRpbmdOZXdQYW5lbHNWYWx1ZTtcbiAgICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVDb3JlKCkge1xuICAgIHJldHVybiB0aGlzLmlzQWRkaW5nTmV3UGFuZWxzXG4gICAgICA/IHRoaXMuYWRkaW5nTmV3UGFuZWxzVmFsdWVcbiAgICAgIDogc3VwZXIuZ2V0VmFsdWVDb3JlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFZhbHVlQ29yZShuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNBZGRpbmdOZXdQYW5lbHMpIHtcbiAgICAgIHRoaXMuaXNOZXdQYW5lbHNWYWx1ZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgdGhpcy5hZGRpbmdOZXdQYW5lbHNWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5zZXRWYWx1ZUNvcmUobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gZ2V0L3NldCB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgcGFuZWxzLlxuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgbWluUGFuZWxDb3VudFxuICAgKiBAc2VlIG1heFBhbmVsQ291bnRcbiAgICogQHNlZSBhZGRQYW5lbFxuICAgKiBAc2VlIHJlbW92ZVBhbmVsXG4gICAqIEBzZWUgcmVtb3ZlUGFuZWxVSVxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHwgdGhpcy5pc0Rlc2lnbk1vZGVcbiAgICAgID8gdGhpcy5sb2FkaW5nUGFuZWxDb3VudFxuICAgICAgOiB0aGlzLnBhbmVscy5sZW5ndGg7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDApIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCB0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5sb2FkaW5nUGFuZWxDb3VudCA9IHZhbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCA9PSB0aGlzLnBhbmVscy5sZW5ndGggfHwgdGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZUJpbmRpbmdzKFwicGFuZWxDb3VudFwiLCB2YWwpO1xuICAgIHRoaXMucHJlcGFyZVZhbHVlRm9yUGFuZWxDcmVhdGluZygpO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnBhbmVsQ291bnQ7IGkgPCB2YWw7IGkrKykge1xuICAgICAgdmFyIHBhbmVsID0gdGhpcy5jcmVhdGVOZXdQYW5lbCgpO1xuICAgICAgdGhpcy5wYW5lbHMucHVzaChwYW5lbCk7XG4gICAgICBpZiAodGhpcy5yZW5kZXJNb2RlID09IFwibGlzdFwiICYmIHRoaXMucGFuZWxzU3RhdGUgIT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWxzU3RhdGUgPT09IFwiZXhwYW5kXCIpIHtcbiAgICAgICAgICBwYW5lbC5leHBhbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoISFwYW5lbC50aXRsZSkge1xuICAgICAgICAgICAgcGFuZWwuY29sbGFwc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhbCA8IHRoaXMucGFuZWxDb3VudCkgdGhpcy5wYW5lbHMuc3BsaWNlKHZhbCwgdGhpcy5wYW5lbENvdW50IC0gdmFsKTtcbiAgICB0aGlzLnNldFZhbHVlQWZ0ZXJQYW5lbHNDcmVhdGluZygpO1xuICAgIHRoaXMuc2V0VmFsdWVCYXNlZE9uUGFuZWxDb3VudCgpO1xuICAgIHRoaXMucmVSdW5Db25kaXRpb24oKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBhbGxvdyB0aGUgZW5kLXVzZXIgdG8gY29sbGFwc2UvZXhwYW5kIHRoZSBwYW5lbHMuIEl0IHdvcmtzIG9ubHkgaWYgdGhlIHJlbmRlck1vZGUgcHJvcGVydHkgZXF1YWxzIHRvIFwibGlzdFwiIGFuZCB0ZW1wbGF0ZVRpdGxlIHByb3BlcnR5IGlzIG5vdCBlbXB0eS4gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGF2YWlsYWJsZTpcbiAgICogPGJyLz4gZGVmYXVsdCAtIHRoZSBkZWZhdWx0IHZhbHVlLiBVc2VyIGNhbid0IGNvbGxhcHNlL2V4cGFuZCBwYW5lbHNcbiAgICogPGJyLz4gZXhwYW5kZWQgLSBVc2VyIGNhbiBjb2xsYXBzZS9leHBhbmQgcGFuZWxzIGFuZCBhbGwgcGFuZWxzIGFyZSBleHBhbmRlZCBieSBkZWZhdWx0XG4gICAqIDxici8+IGNvbGxhcHNlZCAtIFVzZXIgY2FuIGNvbGxhcHNlL2V4cGFuZCBwYW5lbHMgYW5kIGFsbCBwYW5lbHMgYXJlIGNvbGxhcHNlZCBieSBkZWZhdWx0XG4gICAqIDxici8+IGZpcnN0RXhwYW5kZWQgLSBVc2VyIGNhbiBjb2xsYXBzZS9leHBhbmQgcGFuZWxzLiBUaGUgZmlyc3QgcGFuZWwgaXMgZXhwYW5kZWQgYW5kIG90aGVycyBhcmUgY29sbGFwc2VkXG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKiBAc2VlIHRlbXBsYXRlVGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxzU3RhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFuZWxzU3RhdGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbHNTdGF0ZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhbmVsc1N0YXRlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRUZW1wbGF0ZVBhbmVsU3VydmV5SW1wbCgpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnNldFN1cnZleUltcGwoXG4gICAgICB0aGlzLmlzRGVzaWduTW9kZVxuICAgICAgICA/IHRoaXMuc3VydmV5SW1wbFxuICAgICAgICA6IG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY1RlbXBsYXRlU3VydmV5SW1wbCh0aGlzKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRQYW5lbHNTdXJ2ZXlJbXBsKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWxzW2ldO1xuICAgICAgaWYgKHBhbmVsID09IHRoaXMudGVtcGxhdGUpIGNvbnRpbnVlO1xuICAgICAgcGFuZWwuc2V0U3VydmV5SW1wbCg8UXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtPnBhbmVsLmRhdGEpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNldFBhbmVsc1N0YXRlKCkge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSB8fCB0aGlzLnJlbmRlck1vZGUgIT0gXCJsaXN0XCIgfHwgIXRoaXMudGVtcGxhdGVUaXRsZSlcbiAgICAgIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3RhdGUgPSB0aGlzLnBhbmVsc1N0YXRlO1xuICAgICAgaWYgKHN0YXRlID09PSBcImZpcnN0RXhwYW5kZWRcIikge1xuICAgICAgICBzdGF0ZSA9IGkgPT09IDAgPyBcImV4cGFuZGVkXCIgOiBcImNvbGxhcHNlZFwiO1xuICAgICAgfVxuICAgICAgdGhpcy5wYW5lbHNbaV0uc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZXRWYWx1ZUJhc2VkT25QYW5lbENvdW50KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWx1ZSB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHZhbHVlID0gW107XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PSB0aGlzLnBhbmVsQ291bnQpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gdmFsdWUubGVuZ3RoOyBpIDwgdGhpcy5wYW5lbENvdW50OyBpKyspIHZhbHVlLnB1c2goe30pO1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiB0aGlzLnBhbmVsQ291bnQpIHtcbiAgICAgIHZhbHVlLnNwbGljZSh0aGlzLnBhbmVsQ291bnQsIHZhbHVlLmxlbmd0aCAtIHRoaXMucGFuZWxDb3VudCk7XG4gICAgfVxuICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IHRydWU7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBwYW5lbCBjb3VudC4gQSB1c2VyIGNvdWxkIG5vdCBkZWxldGUgYSBwYW5lbCBpZiB0aGUgcGFuZWxDb3VudCBlcXVhbHMgdG8gbWluUGFuZWxDb3VudFxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBtYXhQYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pblBhbmVsQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluUGFuZWxDb3VudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblBhbmVsQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMCkgdmFsID0gMDtcbiAgICBpZiAodmFsID09IHRoaXMubWluUGFuZWxDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pblBhbmVsQ291bnRcIiwgdmFsKTtcbiAgICBpZiAodmFsID4gdGhpcy5tYXhQYW5lbENvdW50KSB0aGlzLm1heFBhbmVsQ291bnQgPSB2YWw7XG4gICAgaWYgKHRoaXMucGFuZWxDb3VudCA8IHZhbCkgdGhpcy5wYW5lbENvdW50ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBwYW5lbCBjb3VudC4gQSB1c2VyIGNvdWxkIG5vdCBhZGQgYSBwYW5lbCBpZiB0aGUgcGFuZWxDb3VudCBlcXVhbHMgdG8gbWF4UGFuZWxDb3VudFxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBtaW5QYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFBhbmVsQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgXCJtYXhQYW5lbENvdW50XCIsXG4gICAgICBzZXR0aW5ncy5wYW5lbE1heGltdW1QYW5lbENvdW50XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFBhbmVsQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDw9IDApIHJldHVybjtcbiAgICBpZiAodmFsID4gc2V0dGluZ3MucGFuZWxNYXhpbXVtUGFuZWxDb3VudClcbiAgICAgIHZhbCA9IHNldHRpbmdzLnBhbmVsTWF4aW11bVBhbmVsQ291bnQ7XG4gICAgaWYgKHZhbCA9PSB0aGlzLm1heFBhbmVsQ291bnQpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhQYW5lbENvdW50XCIsIHZhbCk7XG4gICAgaWYgKHZhbCA8IHRoaXMubWluUGFuZWxDb3VudCkgdGhpcy5taW5QYW5lbENvdW50ID0gdmFsO1xuICAgIGlmICh0aGlzLnBhbmVsQ291bnQgPiB2YWwpIHRoaXMucGFuZWxDb3VudCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgdG8gaGlkZSB0aGUgJ0FkZCBOZXcnIGJ1dHRvblxuICAgKiBAc2VlIGFsbG93UmVtb3ZlUGFuZWxcbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dBZGRQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dBZGRQYW5lbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93QWRkUGFuZWwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dBZGRQYW5lbFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBoaWRlIHRoZSAnUmVtb3ZlJyBidXR0b25cbiAgICogQHNlZSBhbGxvd0FkZFBhbmVsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93UmVtb3ZlUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93UmVtb3ZlUGFuZWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd1JlbW92ZVBhbmVsKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93UmVtb3ZlUGFuZWxcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgZGlmZmVyZW50IGZyb20gXCJkZWZhdWx0XCIgdG8gc2V0IHRoZSBzcGVjaWZpYyBxdWVzdGlvbiB0aXRsZSBsb2NhdGlvbiBmb3IgdGhlIHRlbXBsYXRlIHF1ZXN0aW9ucy5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICogQHNlZSBQYW5lbE1vZGVsQmFzZS5xdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVUaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRlbXBsYXRlVGl0bGVMb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRlbXBsYXRlVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGVtcGxhdGVUaXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzaG93L2hpZGUgdGhlIG51bWJlcnMgaW4gdGl0bGVzIGluIHF1ZXN0aW9ucyBpbnNpZGUgYSBkeW5hbWljIHBhbmVsLlxuICAgKiBCeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyBcIm9mZlwiLiBZb3UgbWF5IHNldCBpdCB0byBcIm9uUGFuZWxcIiBhbmQgdGhlIGZpcnN0IHF1ZXN0aW9uIGluc2lkZSBhIGR5bmFtaWMgcGFuZWwgd2lsbCBzdGFydCB3aXRoIDEgb3IgXCJvblN1cnZleVwiIHRvIGluY2x1ZGUgbmVzdGVkIHF1ZXN0aW9ucyBpbiBkeW1hbWljIHBhbmVscyBpbnRvIGdsb2JhbCBzdXJ2ZXkgcXVlc3Rpb24gbnVtYmVyaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UXVlc3Rpb25OdW1iZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCB2YWwpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLnZpc2libGUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVtb3ZlIGJ1dHRvbiByZWxhdGl2ZSB0byB0aGUgcGFuZWwuXG4gICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzIFwiYm90dG9tXCIuIFlvdSBtYXkgc2V0IGl0IHRvIFwicmlnaHRcIiBhbmQgcmVtb3ZlIGJ1dHRvbiB3aWxsIGFwcGVhciB0byB0aGUgcmlnaHQgb2YgdGhlIHBhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbFJlbW92ZUJ1dHRvbkxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhbmVsUmVtb3ZlQnV0dG9uTG9jYXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbFJlbW92ZUJ1dHRvbkxvY2F0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFuZWxSZW1vdmVCdXR0b25Mb2NhdGlvblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTaG93cyB0aGUgcmFuZ2UgZnJvbSAxIHRvIHBhbmVsQ291bnQgd2hlbiByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIuIFNldCB0byBmYWxzZSB0byBoaWRlIHRoaXMgZWxlbWVudC5cbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UmFuZ2VJblByb2dyZXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1JhbmdlSW5Qcm9ncmVzcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UmFuZ2VJblByb2dyZXNzXCIsIHZhbCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBwcm9wZXJ0eSBlcXVhbHMgdG8gXCJsaXN0XCIgYW5kIGFsbCBkeW5hbWljIHBhbmVscyBhcmUgcmVuZGVyZWQgb25lIGJ5IG9uZSBvbiB0aGUgcGFnZS4gWW91IG1heSBjaGFuZ2UgaXQgdG86IFwicHJvZ3Jlc3NUb3BcIiwgXCJwcm9ncmVzc0JvdHRvbVwiIG9yIFwicHJvZ3Jlc3NUb3BCb3R0b21cIiB0byByZW5kZXIgb25seSBvbmUgZHluYW1pYyBwYW5lbCBhdCBvbmNlLiBUaGUgcHJvZ3Jlc3MgYW5kIG5hdmlnYXRpb24gZWxlbWVudHMgY2FuIGJlIHJlbmRyZWQgb24gdG9wLCBib3R0b20gb3IgYm90aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVuZGVyTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJNb2RlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVuZGVyTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlck1vZGVcIiwgdmFsKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnJlbmRlck1vZGVDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiByZW5kZXJNb2RlIGVxdWFscyB0byBcImxpc3RcIi5cbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmVuZGVyTW9kZUxpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyTW9kZSA9PSBcImxpc3RcIjtcbiAgfVxuICBwdWJsaWMgc2V0VmlzaWJsZUluZGV4KHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHJldHVybiAwO1xuICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25TdXJ2ZXlcIiA/IHZhbHVlIDogMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY291bnRlciA9IHRoaXMuc2V0UGFuZWxWaXNpYmxlSW5kZXgoXG4gICAgICAgIHRoaXMucGFuZWxzW2ldLFxuICAgICAgICBzdGFydEluZGV4LFxuICAgICAgICB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgIT0gXCJvZmZcIlxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvblN1cnZleVwiKSB7XG4gICAgICAgIHN0YXJ0SW5kZXggKz0gY291bnRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIuc2V0VmlzaWJsZUluZGV4KHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPSBcIm9uU3VydmV5XCIgPyB2YWx1ZSA6IC0xKTtcbiAgICByZXR1cm4gdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzICE9IFwib25TdXJ2ZXlcIiA/IDEgOiBzdGFydEluZGV4IC0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBzZXRQYW5lbFZpc2libGVJbmRleChcbiAgICBwYW5lbDogUGFuZWxNb2RlbCxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHNob3dJbmRleDogYm9vbGVhblxuICApOiBudW1iZXIge1xuICAgIGlmICghc2hvd0luZGV4KSB7XG4gICAgICBwYW5lbC5zZXRWaXNpYmxlSW5kZXgoLTEpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBwYW5lbC5zZXRWaXNpYmxlSW5kZXgoaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIGFuIGVuZCB1c2VyIG1heSBhZGQgYSBuZXcgcGFuZWwuIFRoZSBxdWVzdGlvbiBpcyBub3QgcmVhZCBvbmx5IGFuZCBwYW5lbENvdW50IGxlc3MgdGhhbiBtYXhQYW5lbENvdW50XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBtYXhQYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhbkFkZFBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hbGxvd0FkZFBhbmVsICYmXG4gICAgICAhdGhpcy5pc1JlYWRPbmx5ICYmXG4gICAgICB0aGlzLnBhbmVsQ291bnQgPCB0aGlzLm1heFBhbmVsQ291bnRcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiBhbiBlbmQgdXNlciBtYXkgcmVtb3ZlIGEgcGFuZWwuIFRoZSBxdWVzdGlvbiBpcyBub3QgcmVhZCBvbmx5IGFuZCBwYW5lbENvdW50IGlzIG1vcmUgdGhhbiBtaW5QYW5lbENvdW50XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBtaW5QYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhblJlbW92ZVBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hbGxvd1JlbW92ZVBhbmVsICYmXG4gICAgICAhdGhpcy5pc1JlYWRPbmx5ICYmXG4gICAgICB0aGlzLnBhbmVsQ291bnQgPiB0aGlzLm1pblBhbmVsQ291bnRcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZWJ1aWxkUGFuZWxzKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5wcmVwYXJlVmFsdWVGb3JQYW5lbENyZWF0aW5nKCk7XG4gICAgdmFyIHBhbmVscyA9IFtdO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSh0aGlzLCB0aGlzLnRlbXBsYXRlKTtcbiAgICAgIHBhbmVscy5wdXNoKHRoaXMudGVtcGxhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxDb3VudDsgaSsrKSB7XG4gICAgICAgIHBhbmVscy5wdXNoKHRoaXMuY3JlYXRlTmV3UGFuZWwoKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGFuZWxzLnNwbGljZSgwLCB0aGlzLnBhbmVscy5sZW5ndGgsIC4uLnBhbmVscyk7XG4gICAgdGhpcy5zZXRWYWx1ZUFmdGVyUGFuZWxzQ3JlYXRpbmcoKTtcbiAgICB0aGlzLnNldFBhbmVsc1N0YXRlKCk7XG4gICAgdGhpcy5yZVJ1bkNvbmRpdGlvbigpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucGFuZWxDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIElmIGl0IGlzIG5vdCBlbXB0eSwgdGhlbiB0aGlzIHZhbHVlIGlzIHNldCB0byBldmVyeSBuZXcgcGFuZWwsIGluY2x1ZGluZyBwYW5lbHMgY3JlYXRlZCBpbml0aWFsbHksIHVubGVzcyB0aGUgZGVmYXVsdFZhbHVlIGlzIG5vdCBlbXB0eVxuICAgKiBAc2VlIGRlZmF1bHRWYWx1ZVxuICAgKiBAc2VlIGRlZmF1bHRWYWx1ZUZyb21MYXN0Um93XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRQYW5lbFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRQYW5lbFZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFBhbmVsVmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0UGFuZWxWYWx1ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSB0byBjb3B5IHRoZSB2YWx1ZSBpbnRvIG5ldyBhZGRlZCBwYW5lbCBmcm9tIHRoZSBsYXN0IHBhbmVsLiBJZiBkZWZhdWx0UGFuZWxWYWx1ZSBpcyBzZXQgYW5kIHRoaXMgcHJvcGVydHkgZXF1YWxzIHRvIHRydWUsXG4gICAqIHRoZW4gdGhlIHZhbHVlIGZvciBuZXcgYWRkZWQgcGFuZWwgaXMgbWVyZ2luZy5cbiAgICogQHNlZSBkZWZhdWx0VmFsdWVcbiAgICogQHNlZSBkZWZhdWx0UGFuZWxWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlRnJvbUxhc3RQYW5lbFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBpc0RlZmF1bHRWYWx1ZUVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBzdXBlci5pc0RlZmF1bHRWYWx1ZUVtcHR5KCkgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0UGFuZWxWYWx1ZSlcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWUoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0UGFuZWxWYWx1ZSkgfHxcbiAgICAgICF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRWYWx1ZSlcbiAgICApIHtcbiAgICAgIHN1cGVyLnNldERlZmF1bHRWYWx1ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpIHx8IHRoaXMucGFuZWxDb3VudCA9PSAwKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbHVlID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVsQ291bnQ7IGkrKykge1xuICAgICAgbmV3VmFsdWUucHVzaCh0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuaXNSb3dFbXB0eSh2YWxbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9ncmVzc0luZm8oKTogSVByb2dyZXNzSW5mbyB7XG4gICAgcmV0dXJuIFN1cnZleUVsZW1lbnQuZ2V0UHJvZ3Jlc3NJbmZvQnlFbGVtZW50cyhcbiAgICAgIHRoaXMucGFuZWxzLFxuICAgICAgdGhpcy5pc1JlcXVpcmVkXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGlzUm93RW1wdHkodmFsOiBhbnkpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIHZhbCkge1xuICAgICAgaWYgKHZhbC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgZHluYW1pYyBwYW5lbCBiYXNlZCBvbiB0aGUgdGVtcGxhdGUgUGFuZWwuIEl0IGNoZWNrcyBpZiBjYW5BZGRQYW5lbCByZXR1cm5zIHRydWUgYW5kIHRoZW4gY2FsbHMgYWRkUGFuZWwgbWV0aG9kLlxuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHBhbmVsc1xuICAgKiBAc2VlIGNhbkFkZFBhbmVsXG4gICAqL1xuICBwdWJsaWMgYWRkUGFuZWxVSSgpOiBQYW5lbE1vZGVsIHtcbiAgICBpZiAoIXRoaXMuY2FuQWRkUGFuZWwpIHJldHVybiBudWxsO1xuICAgIHZhciBuZXdQYW5lbCA9IHRoaXMuYWRkUGFuZWwoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJNb2RlID09PSBcImxpc3RcIiAmJiB0aGlzLnBhbmVsc1N0YXRlICE9PSBcImRlZmF1bHRcIikge1xuICAgICAgbmV3UGFuZWwuZXhwYW5kKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdQYW5lbDtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgbmV3IGR5bmFtaWMgcGFuZWwgYmFzZWQgb24gdGhlIHRlbXBsYXRlIFBhbmVsLlxuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHBhbmVsc1xuICAgKi9cbiAgcHVibGljIGFkZFBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHRoaXMucGFuZWxDb3VudCsrO1xuICAgIGlmICghdGhpcy5pc1JlbmRlck1vZGVMaXN0KSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMucGFuZWxDb3VudCAtIDE7XG4gICAgfVxuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgdmFyIGhhc01vZGlmaWVkID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhIW5ld1ZhbHVlICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmXG4gICAgICAgIG5ld1ZhbHVlLmxlbmd0aCA9PSB0aGlzLnBhbmVsQ291bnRcbiAgICAgICkge1xuICAgICAgICBoYXNNb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29weVZhbHVlKG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDFdLCB0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5kZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsICYmXG4gICAgICAhIW5ld1ZhbHVlICYmXG4gICAgICBBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSAmJlxuICAgICAgbmV3VmFsdWUubGVuZ3RoID4gMSAmJlxuICAgICAgbmV3VmFsdWUubGVuZ3RoID09IHRoaXMucGFuZWxDb3VudFxuICAgICkge1xuICAgICAgaGFzTW9kaWZpZWQgPSB0cnVlO1xuICAgICAgdGhpcy5jb3B5VmFsdWUoXG4gICAgICAgIG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDFdLFxuICAgICAgICBuZXdWYWx1ZVtuZXdWYWx1ZS5sZW5ndGggLSAyXVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGhhc01vZGlmaWVkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSkgdGhpcy5zdXJ2ZXkuZHluYW1pY1BhbmVsQWRkZWQodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxzW3RoaXMucGFuZWxDb3VudCAtIDFdO1xuICB9XG4gIHByaXZhdGUgY29weVZhbHVlKHNyYzogYW55LCBkZXN0OiBhbnkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGVzdCkge1xuICAgICAgc3JjW2tleV0gPSBkZXN0W2tleV07XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIHJlbW92ZVBhbmVsIGZ1bmN0aW9uLiBEbyBub3RoaW5nIGlzIGNhblJlbW92ZVBhbmVsIHJldHVybnMgZmFsc2UuIElmIGNvbmZpcm1EZWxldGUgc2V0IHRvIHRydWUsIGl0IHNob3dzIHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGZpcnN0LlxuICAgKiBAcGFyYW0gdmFsdWUgYSBwYW5lbCBvciBwYW5lbCBpbmRleFxuICAgKiBAc2VlIHJlbW92ZVBhbmVsXG4gICAqIEBzZWUgY29uZmlybURlbGV0ZVxuICAgKiBAc2VlIGNvbmZpcm1EZWxldGVUZXh0XG4gICAqIEBzZWUgY2FuUmVtb3ZlUGFuZWxcbiAgICpcbiAgICovXG4gIHB1YmxpYyByZW1vdmVQYW5lbFVJKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVtb3ZlUGFuZWwpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29uZmlybURlbGV0ZSB8fCBjb25maXJtQWN0aW9uKHRoaXMuY29uZmlybURlbGV0ZVRleHQpKSB7XG4gICAgICB0aGlzLnJlbW92ZVBhbmVsKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEdvZXMgdG8gdGhlIG5leHQgcGFuZWwgaW4gdGhlIFBhbmVsRHluYW1pY1xuICAgKlxuICAgKi9cbiAgcHVibGljIGdvVG9OZXh0UGFuZWwoKSB7XG4gICAgaWYgKHRoaXMucmVuZGVyTW9kZSAhPT0gXCJsaXN0XCIgJiYgdGhpcy5jdXJyZW50UGFuZWwuaGFzRXJyb3JzKCkpIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRJbmRleCsrO1xuICB9XG4gIC8qKlxuICAgKiBHb2VzIHRvIHRoZSBwcmV2aW91cyBwYW5lbCBpbiB0aGUgUGFuZWxEeW5hbWljXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ29Ub1ByZXZQYW5lbCgpIHtcbiAgICB0aGlzLmN1cnJlbnRJbmRleC0tO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgZHluYW1pYyBwYW5lbCBmcm9tIHRoZSBwYW5lbHMgYXJyYXkuXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHBhbmVsIG9yIHBhbmVsIGluZGV4XG4gICAqIEBzZWUgcGFuZWxzXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVQYW5lbCh2YWx1ZTogYW55KSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5nZXRQYW5lbEluZGV4KHZhbHVlKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFuZWxDb3VudCkgcmV0dXJuO1xuICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWxzW2luZGV4XTtcbiAgICB0aGlzLnBhbmVscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMudXBkYXRlQmluZGluZ3MoXCJwYW5lbENvdW50XCIsIHRoaXMucGFuZWxDb3VudCk7XG4gICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpbmRleCA+PSB2YWx1ZS5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkgPSB0cnVlO1xuICAgIHZhbHVlLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucGFuZWxDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5keW5hbWljUGFuZWxSZW1vdmVkKHRoaXMsIGluZGV4LCBwYW5lbCk7XG4gICAgdGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5ID0gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQYW5lbEluZGV4KHZhbDogYW55KTogbnVtYmVyIHtcbiAgICBpZiAoSGVscGVycy5pc051bWJlcih2YWwpKSByZXR1cm4gdmFsO1xuICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucGFuZWxzW2ldID09PSB2YWwgfHwgaXRlbXNbaV0gPT09IHZhbCkgcmV0dXJuIGk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5wYW5lbHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhbmVsc1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlc0luUGFuZWwoaSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhckVycm9ycygpIHtcbiAgICBzdXBlci5jbGVhckVycm9ycygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFuZWxzW2ldLmNsZWFyRXJyb3JzKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRRdWVzdGlvbkZyb21BcnJheShuYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBJUXVlc3Rpb24ge1xuICAgIGlmIChpbmRleCA+PSB0aGlzLnBhbmVsQ291bnQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnBhbmVsc1tpbmRleF0uZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBjbGVhckluY29ycmVjdFZhbHVlc0luUGFuZWwoaW5kZXg6IG51bWJlcikge1xuICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWxzW2luZGV4XTtcbiAgICBwYW5lbC5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIHZhciB2YWx1ZXMgPSAhIXZhbCAmJiBpbmRleCA8IHZhbC5sZW5ndGggPyB2YWxbaW5kZXhdIDogbnVsbDtcbiAgICBpZiAoIXZhbHVlcykgcmV0dXJuO1xuICAgIHZhciBpc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWVzKSB7XG4gICAgICBpZiAodGhpcy5nZXRTaGFyZWRRdWVzdGlvbkZyb21BcnJheShrZXksIGluZGV4KSkgY29udGludWU7XG4gICAgICB2YXIgcSA9IHBhbmVsLmdldFF1ZXN0aW9uQnlOYW1lKGtleSk7XG4gICAgICBpZiAoISFxKSBjb250aW51ZTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc2NvcnJlY3RWYWx1ZVdpdGhQb3N0UHJlZml4KHBhbmVsLCBrZXksIHNldHRpbmdzLmNvbW1lbnRQcmVmaXgpIHx8XG4gICAgICAgIHRoaXMuaXNjb3JyZWN0VmFsdWVXaXRoUG9zdFByZWZpeChcbiAgICAgICAgICBwYW5lbCxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgc2V0dGluZ3MubWF0cml4VG90YWxWYWx1ZVBvc3RGaXhcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGRlbGV0ZSB2YWx1ZXNba2V5XTtcbiAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChpc0NoYW5nZWQpIHtcbiAgICAgIHZhbFtpbmRleF0gPSB2YWx1ZXM7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzY29ycmVjdFZhbHVlV2l0aFBvc3RQcmVmaXgoXG4gICAgcGFuZWw6IFBhbmVsTW9kZWwsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgcG9zdFByZWZpeDogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChrZXkuaW5kZXhPZihwb3N0UHJlZml4KSAhPT0ga2V5Lmxlbmd0aCAtIHBvc3RQcmVmaXgubGVuZ3RoKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhIXBhbmVsLmdldFF1ZXN0aW9uQnlOYW1lKGtleS5zdWJzdHIoMCwga2V5LmluZGV4T2YocG9zdFByZWZpeCkpKTtcbiAgfVxuICBwdWJsaWMgZ2V0U2hhcmVkUXVlc3Rpb25Gcm9tQXJyYXkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhbmVsSW5kZXg6IG51bWJlclxuICApOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgJiYgISF0aGlzLnZhbHVlTmFtZVxuICAgICAgPyA8UXVlc3Rpb24+KFxuICAgICAgICAgIHRoaXMuc3VydmV5LmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWVGcm9tQXJyYXkoXG4gICAgICAgICAgICB0aGlzLnZhbHVlTmFtZSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBwYW5lbEluZGV4XG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIHZhciBoYXNDb250ZXh0ID0gISFjb250ZXh0XG4gICAgICA/IHRoaXMudGVtcGxhdGUucXVlc3Rpb25zLmluZGV4T2YoY29udGV4dCkgPiAtMVxuICAgICAgOiBmYWxzZTtcbiAgICB2YXIgcHJlZml4TmFtZSA9IHRoaXMuZ2V0VmFsdWVOYW1lKCkgKyBcIlswXS5cIjtcbiAgICB2YXIgcHJlZml4VGV4dCA9IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyBcIlswXS5cIjtcbiAgICB2YXIgcGFuZWxPYmpzID0gbmV3IEFycmF5PElDb25kaXRpb25PYmplY3Q+KCk7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMudGVtcGxhdGUucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0uYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChwYW5lbE9ianMsIGNvbnRleHQpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVsT2Jqcy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgbmFtZTogcHJlZml4TmFtZSArIHBhbmVsT2Jqc1tpXS5uYW1lLFxuICAgICAgICB0ZXh0OiBwcmVmaXhUZXh0ICsgcGFuZWxPYmpzW2ldLnRleHQsXG4gICAgICAgIHF1ZXN0aW9uOiBwYW5lbE9ianNbaV0ucXVlc3Rpb24sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxPYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYW5lbE9ianNbaV0ucXVlc3Rpb24gPT0gY29udGV4dCkgY29udGludWU7XG4gICAgICAgIG9iamVjdHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogXCJwYW5lbC5cIiArIHBhbmVsT2Jqc1tpXS5uYW1lLFxuICAgICAgICAgIHRleHQ6IFwicGFuZWwuXCIgKyBwYW5lbE9ianNbaV0udGV4dCxcbiAgICAgICAgICBxdWVzdGlvbjogcGFuZWxPYmpzW2ldLnF1ZXN0aW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24ob3BlcmF0b3IsIHBhdGgpO1xuICAgIHZhciBxdWVzdGlvbk5hbWUgPSBwYXRoO1xuICAgIHZhciBwb3MgPSBwYXRoLmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChwb3MgPiAtMSkge1xuICAgICAgcXVlc3Rpb25OYW1lID0gcGF0aC5zdWJzdHIoMCwgcG9zKTtcbiAgICAgIHBhdGggPSBwYXRoLnN1YnN0cihwb3MgKyAxKTtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy50ZW1wbGF0ZS5nZXRRdWVzdGlvbkJ5TmFtZShxdWVzdGlvbk5hbWUpO1xuICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiBxdWVzdGlvbi5nZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yLCBwYXRoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgdmFyIHJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgIHRoaXMudGVtcGxhdGUucmVhZE9ubHkgPSByZWFkT25seTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhbmVsc1tpXS5yZWFkT25seSA9IHJlYWRPbmx5O1xuICAgIH1cbiAgICBzdXBlci5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZWFkT25seSA9IHRoaXMuaXNSZWFkT25seTtcbiAgICB0aGlzLnRlbXBsYXRlLm9uU3VydmV5TG9hZCgpO1xuICAgIGlmICh0aGlzLmxvYWRpbmdQYW5lbENvdW50ID4gMCkge1xuICAgICAgdGhpcy5wYW5lbENvdW50ID0gdGhpcy5sb2FkaW5nUGFuZWxDb3VudDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLnJlYnVpbGRQYW5lbHMoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRQYW5lbHNTdXJ2ZXlJbXBsKCk7XG4gICAgdGhpcy5zZXRQYW5lbHNTdGF0ZSgpO1xuICAgIHRoaXMuYXNzaWduT25Qcm9wZXJ0eUNoYW5nZWRUb1RlbXBsYXRlKCk7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gIH1cbiAgcHVibGljIG9uRmlyc3RSZW5kZXJpbmcoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbHNbaV0ub25GaXJzdFJlbmRlcmluZygpO1xuICAgIH1cbiAgICBzdXBlci5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuUGFuZWxzQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJpdmF0ZSByZVJ1bkNvbmRpdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMucnVuQ29uZGl0aW9uKFxuICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKSxcbiAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuUGFuZWxzQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgdmFyIGNhY2hlZFZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIGNhY2hlZFZhbHVlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWVzKSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYW5lbFZhbHVlcyA9IHRoaXMuZ2V0UGFuZWxJdGVtRGF0YSh0aGlzLnBhbmVsc1tpXS5kYXRhKTtcbiAgICAgIC8vU2hvdWxkIGJlIHVuaXF1ZSBmb3IgZXZlcnkgcGFuZWwgZHVlIGFzeW5jIGV4cHJlc3Npb24gc3VwcG9ydFxuICAgICAgdmFyIG5ld1ZhbHVlcyA9IEhlbHBlcnMuY3JlYXRlQ29weShjYWNoZWRWYWx1ZXMpO1xuICAgICAgbmV3VmFsdWVzW1xuICAgICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICBdID0gcGFuZWxWYWx1ZXM7XG4gICAgICBuZXdWYWx1ZXNbUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkluZGV4VmFyaWFibGVOYW1lLnRvTG93ZXJDYXNlKCldID0gaTtcbiAgICAgIHRoaXMucGFuZWxzW2ldLnJ1bkNvbmRpdGlvbihuZXdWYWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlci5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhbmVsc1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICAgIHRoaXMucGFuZWxzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKFxuICAgICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBoYXNLZXlzRHVwbGljYXRlZChmaXJlQ2FsbGJhY2s6IGJvb2xlYW4sIHJlYzogYW55ID0gbnVsbCkge1xuICAgIHZhciBrZXlWYWx1ZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICB2YXIgcmVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyA9XG4gICAgICAgIHRoaXMuaXNWYWx1ZUR1cGxpY2F0ZWQodGhpcy5wYW5lbHNbaV0sIGtleVZhbHVlcywgcmVjLCBmaXJlQ2FsbGJhY2spIHx8XG4gICAgICAgIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVBhbmVsc0NvbnRhaW5zRXJyb3JzKCkge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uO1xuICAgIHZhciBwYXJlbnQgPSA8UGFuZWw+cXVlc3Rpb24ucGFyZW50O1xuICAgIHdoaWxlICghIXBhcmVudCkge1xuICAgICAgcGFyZW50LnVwZGF0ZUNvbnRhaW5zRXJyb3JzKCk7XG4gICAgICBwYXJlbnQgPSA8UGFuZWw+cGFyZW50LnBhcmVudDtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDb250YWluc0Vycm9ycygpO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBpZiAoISF0aGlzLmNoYW5naW5nVmFsdWVRdWVzdGlvbikge1xuICAgICAgdmFyIHJlcyA9IHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgICByZXMgPSB0aGlzLmhhc0tleXNEdXBsaWNhdGVkKGZpcmVDYWxsYmFjaywgcmVjKSB8fCByZXM7XG4gICAgICB0aGlzLnVwZGF0ZVBhbmVsc0NvbnRhaW5zRXJyb3JzKCk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZXJyb3NJblBhbmVscyA9IHRoaXMuaGFzRXJyb3JJblBhbmVscyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaykgfHwgZXJyb3NJblBhbmVscztcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5nZXRDb250YWluc0Vycm9ycygpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIHBhbmVscyA9IHRoaXMucGFuZWxzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGFuZWxzW2ldLmNvbnRhaW5zRXJyb3JzKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghc3VwZXIuZ2V0SXNBbnN3ZXJlZCgpKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHBhbmVscyA9IHRoaXMucGFuZWxzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmlzaWJsZVF1ZXN0aW9ucyA9IDxBcnJheTxhbnk+PltdO1xuICAgICAgcGFuZWxzW2ldLmFkZFF1ZXN0aW9uc1RvTGlzdCh2aXNpYmxlUXVlc3Rpb25zLCB0cnVlKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmlzaWJsZVF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoIXZpc2libGVRdWVzdGlvbnNbal0uaXNBbnN3ZXJlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhbmVsc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBxdWVzdGlvbnNbal0uY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLmNsZWFyVmFsdWVJZkludmlzaWJsZSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgIGlmIChzdXBlci5nZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCkpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhbmVsc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocXVlc3Rpb25zW2pdLmlzUnVubmluZ1ZhbGlkYXRvcnMpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciByZXN1bHQgPSBzdXBlci5nZXRBbGxFcnJvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5wYW5lbHNbaV0ucXVlc3Rpb25zO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBxdWVzdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IHF1ZXN0aW9uc1tqXS5nZXRBbGxFcnJvcnMoKTtcbiAgICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcbiAgICBpZiAoIXZhbHVlcyB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSByZXR1cm4gdmFsdWVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoICYmIGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWwgPSB2YWx1ZXNbaV07XG4gICAgICBpZiAoIXZhbCkgY29udGludWU7XG4gICAgICB2YWx1ZXNbaV0gPSB0aGlzLmdldFBhbmVsRGlzcGxheVZhbHVlKGksIHZhbCwga2V5c0FzVGV4dCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBwcml2YXRlIGdldFBhbmVsRGlzcGxheVZhbHVlKFxuICAgIHBhbmVsSW5kZXg6IG51bWJlcixcbiAgICB2YWw6IGFueSxcbiAgICBrZXlzQXNUZXh0OiBib29sZWFuXG4gICk6IGFueSB7XG4gICAgaWYgKCF2YWwpIHJldHVybiB2YWw7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbHNbcGFuZWxJbmRleF07XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgcXVlc3Rpb24gPSBwYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKGtleSk7XG4gICAgICBpZiAoIXF1ZXN0aW9uKSB7XG4gICAgICAgIHF1ZXN0aW9uID0gdGhpcy5nZXRTaGFyZWRRdWVzdGlvbkZyb21BcnJheShrZXksIHBhbmVsSW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcXVlc3Rpb24pIHtcbiAgICAgICAgdmFyIHFWYWx1ZSA9IHF1ZXN0aW9uLmdldERpc3BsYXlWYWx1ZShrZXlzQXNUZXh0LCB2YWxba2V5XSk7XG4gICAgICAgIHZhbFtrZXldID0gcVZhbHVlO1xuICAgICAgICBpZiAoa2V5c0FzVGV4dCAmJiAhIXF1ZXN0aW9uLnRpdGxlICYmIHF1ZXN0aW9uLnRpdGxlICE9PSBrZXkpIHtcbiAgICAgICAgICB2YWxbcXVlc3Rpb24udGl0bGVdID0gcVZhbHVlO1xuICAgICAgICAgIGRlbGV0ZSB2YWxba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJblBhbmVscyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4sIHJlYzogYW55KTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIHZhciBwYW5lbHMgPSB0aGlzLnBhbmVscztcbiAgICB2YXIga2V5VmFsdWVzOiBBcnJheTxhbnk+ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc2V0T25Db21wbGV0ZUFzeW5jSW5QYW5lbChwYW5lbHNbaV0pO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBubEVycm9yID0gcGFuZWxzW2ldLmhhc0Vycm9ycyhcbiAgICAgICAgZmlyZUNhbGxiYWNrLFxuICAgICAgICAhIXJlYyAmJiByZWMuZm9jdXNlT25GaXJzdEVycm9yLFxuICAgICAgICByZWNcbiAgICAgICk7XG4gICAgICBwbmxFcnJvciA9IHRoaXMuaXNWYWx1ZUR1cGxpY2F0ZWQocGFuZWxzW2ldLCBrZXlWYWx1ZXMsIHJlYykgfHwgcG5sRXJyb3I7XG4gICAgICBpZiAoIXRoaXMuaXNSZW5kZXJNb2RlTGlzdCAmJiBwbmxFcnJvciAmJiAhcmVzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gaTtcbiAgICAgIH1cbiAgICAgIHJlcyA9IHBubEVycm9yIHx8IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHNldE9uQ29tcGxldGVBc3luY0luUGFuZWwocGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gcGFuZWwucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0ub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMgPSAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMucmFpc2VPbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycygpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlRHVwbGljYXRlZChcbiAgICBwYW5lbDogUGFuZWxNb2RlbCxcbiAgICBrZXlWYWx1ZXM6IEFycmF5PGFueT4sXG4gICAgcmVjOiBhbnksXG4gICAgZmlyZUNhbGxiYWNrPzogYm9vbGVhblxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMua2V5TmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj5wYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKHRoaXMua2V5TmFtZSk7XG4gICAgaWYgKCFxdWVzdGlvbiB8fCBxdWVzdGlvbi5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsdWUgPSBxdWVzdGlvbi52YWx1ZTtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uICYmXG4gICAgICBxdWVzdGlvbiAhPSB0aGlzLmNoYW5naW5nVmFsdWVRdWVzdGlvblxuICAgICkge1xuICAgICAgcXVlc3Rpb24uaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgcmVjKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBrZXlWYWx1ZXNbaV0pIHtcbiAgICAgICAgcXVlc3Rpb24uYWRkRXJyb3IoXG4gICAgICAgICAgbmV3IEtleUR1cGxpY2F0aW9uRXJyb3IodGhpcy5rZXlEdXBsaWNhdGlvbkVycm9yLCB0aGlzKVxuICAgICAgICApO1xuICAgICAgICBpZiAoISFyZWMgJiYgIXJlYy5maXJzdEVycm9yUXVlc3Rpb24pIHtcbiAgICAgICAgICByZWMuZmlyc3RFcnJvclF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGtleVZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHZhciBwYW5lbCA9IHRoaXMuY3JlYXRlQW5kU2V0dXBOZXdQYW5lbE9iamVjdCgpO1xuICAgIHZhciBqc29uID0gdGhpcy50ZW1wbGF0ZS50b0pTT04oKTtcbiAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHBhbmVsKTtcbiAgICBwYW5lbC5yZW5kZXJXaWR0aCA9IFwiMTAwJVwiO1xuICAgIHBhbmVsLnVwZGF0ZUN1c3RvbVdpZGdldHMoKTtcbiAgICBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtKHRoaXMsIHBhbmVsKTtcbiAgICBwYW5lbC5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHBhbmVsLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLnNldFBhcmVudFF1ZXN0aW9uKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFuZWw7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUFuZFNldHVwTmV3UGFuZWxPYmplY3QoKTogUGFuZWxNb2RlbCB7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5jcmVhdGVOZXdQYW5lbE9iamVjdCgpO1xuICAgIHBhbmVsLmlzSW50ZXJhY3RpdmVEZXNpZ25FbGVtZW50ID0gZmFsc2U7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHBhbmVsLm9uR2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc2VsZi5nZXRUZW1wbGF0ZVF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpO1xuICAgIH07XG4gICAgcmV0dXJuIHBhbmVsO1xuICB9XG4gIHByaXZhdGUgZ2V0VGVtcGxhdGVRdWVzdGlvblRpdGxlTG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVUaXRsZUxvY2F0aW9uICE9IFwiZGVmYXVsdFwiXG4gICAgICA/IHRoaXMudGVtcGxhdGVUaXRsZUxvY2F0aW9uXG4gICAgICA6IHRoaXMuZ2V0VGl0bGVMb2NhdGlvbkNvcmUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFuZWxPYmplY3QoKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIFNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MoXCJwYW5lbFwiKTtcbiAgfVxuICBwcml2YXRlIHNldFBhbmVsQ291bnRCYXNlZE9uVmFsdWUoKSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSB8fCB0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIHZhciBuZXdQYW5lbENvdW50ID0gdmFsICYmIEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbC5sZW5ndGggOiAwO1xuICAgIGlmIChuZXdQYW5lbENvdW50ID09IDAgJiYgdGhpcy5sb2FkaW5nUGFuZWxDb3VudCA+IDApIHtcbiAgICAgIG5ld1BhbmVsQ291bnQgPSB0aGlzLmxvYWRpbmdQYW5lbENvdW50O1xuICAgIH1cbiAgICB0aGlzLnBhbmVsQ291bnQgPSBuZXdQYW5lbENvdW50O1xuICB9XG4gIHB1YmxpYyBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlLCBmYWxzZSk7XG4gICAgdGhpcy5zZXRQYW5lbENvdW50QmFzZWRPblZhbHVlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbFVwZGF0ZVZhbHVlRnJvbVN1cnZleSh0aGlzLnBhbmVsc1tpXSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlSXNBbnN3ZXJlZCgpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFuZWxTdXJ2ZXlWYWx1ZUNoYW5nZWQodGhpcy5wYW5lbHNbaV0pO1xuICAgIH1cbiAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXRWYWx1ZUJhc2VkT25QYW5lbENvdW50KCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcGFuZWxVcGRhdGVWYWx1ZUZyb21TdXJ2ZXkocGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gcGFuZWwucXVlc3Rpb25zO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldFBhbmVsSXRlbURhdGEocGFuZWwuZGF0YSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zW2ldO1xuICAgICAgcS51cGRhdGVWYWx1ZUZyb21TdXJ2ZXkodmFsdWVzW3EuZ2V0VmFsdWVOYW1lKCldKTtcbiAgICAgIHEudXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkoXG4gICAgICAgIHZhbHVlc1txLmdldFZhbHVlTmFtZSgpICsgc2V0dGluZ3MuY29tbWVudFByZWZpeF1cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcGFuZWxTdXJ2ZXlWYWx1ZUNoYW5nZWQocGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gcGFuZWwucXVlc3Rpb25zO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldFBhbmVsSXRlbURhdGEocGFuZWwuZGF0YSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zW2ldO1xuICAgICAgcS5vblN1cnZleVZhbHVlQ2hhbmdlZCh2YWx1ZXNbcS5nZXRWYWx1ZU5hbWUoKV0pO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25TZXREYXRhKCkge1xuICAgIHN1cGVyLm9uU2V0RGF0YSgpO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5zZXRUZW1wbGF0ZVBhbmVsU3VydmV5SW1wbCgpO1xuICAgICAgdGhpcy5yZWJ1aWxkUGFuZWxzKCk7XG4gICAgfVxuICB9XG4gIC8vSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YVxuICBnZXRJdGVtSW5kZXgoaXRlbTogSVN1cnZleURhdGEpOiBudW1iZXIge1xuICAgIHZhciByZXMgPSB0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgcmV0dXJuIHJlcyA+IC0xID8gcmVzIDogdGhpcy5pdGVtcy5sZW5ndGg7XG4gIH1cbiAgZ2V0UGFuZWxJdGVtRGF0YShpdGVtOiBJU3VydmV5RGF0YSk6IGFueSB7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICB2YXIgaW5kZXggPSBpdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIHZhciBxVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChpbmRleCA8IDAgJiYgQXJyYXkuaXNBcnJheShxVmFsdWUpICYmIHFWYWx1ZS5sZW5ndGggPiBpdGVtcy5sZW5ndGgpIHtcbiAgICAgIGluZGV4ID0gaXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4ge307XG4gICAgaWYgKCFxVmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocVZhbHVlKSB8fCBxVmFsdWUubGVuZ3RoIDw9IGluZGV4KSByZXR1cm4ge307XG4gICAgcmV0dXJuIHFWYWx1ZVtpbmRleF07XG4gIH1cbiAgcHJpdmF0ZSBpc1NldFBhbmVsSXRlbURhdGE6IEFycmF5PHN0cmluZz47XG4gIHNldFBhbmVsSXRlbURhdGEoaXRlbTogSVN1cnZleURhdGEsIG5hbWU6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc1NldFBhbmVsSXRlbURhdGEgJiYgdGhpcy5pc1NldFBhbmVsSXRlbURhdGEuaW5kZXhPZihuYW1lKSA+IC0xKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghdGhpcy5pc1NldFBhbmVsSXRlbURhdGEpIHRoaXMuaXNTZXRQYW5lbEl0ZW1EYXRhID0gW107XG4gICAgdGhpcy5pc1NldFBhbmVsSXRlbURhdGEucHVzaChuYW1lKTtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIHZhciBpbmRleCA9IGl0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4IDwgMCkgaW5kZXggPSBpdGVtcy5sZW5ndGg7XG4gICAgdmFyIHFWYWx1ZSA9IHRoaXMuZ2V0VW5iaW5kVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgaWYgKCFxVmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocVZhbHVlKSkge1xuICAgICAgcVZhbHVlID0gW107XG4gICAgfVxuICAgIGlmIChxVmFsdWUubGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICBmb3IgKHZhciBpID0gcVZhbHVlLmxlbmd0aDsgaSA8PSBpbmRleDsgaSsrKSB7XG4gICAgICAgIHFWYWx1ZS5wdXNoKHt9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFxVmFsdWVbaW5kZXhdKSBxVmFsdWVbaW5kZXhdID0ge307XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSB7XG4gICAgICBxVmFsdWVbaW5kZXhdW25hbWVdID0gdmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgcVZhbHVlW2luZGV4XVtuYW1lXTtcbiAgICB9XG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnBhbmVscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uID0gdGhpcy5wYW5lbHNbaW5kZXhdLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoXG4gICAgICAgIG5hbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSBxVmFsdWU7XG4gICAgdGhpcy5jaGFuZ2luZ1ZhbHVlUXVlc3Rpb24gPSBudWxsO1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHF1ZXN0aW9uOiB0aGlzLFxuICAgICAgICBwYW5lbDogKDxRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0+aXRlbSkucGFuZWwsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIGl0ZW1JbmRleDogaW5kZXgsXG4gICAgICAgIGl0ZW1WYWx1ZTogcVZhbHVlW2luZGV4XSxcbiAgICAgICAgdmFsdWU6IHZhbCxcbiAgICAgIH07XG4gICAgICB0aGlzLnN1cnZleS5keW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSB0aGlzLmlzU2V0UGFuZWxJdGVtRGF0YS5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLmlzU2V0UGFuZWxJdGVtRGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuICBnZXRSb290RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgfVxuICBwdWJsaWMgZ2V0UGxhaW5EYXRhKFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGluY2x1ZGVFbXB0eT86IGJvb2xlYW47XG4gICAgICBjYWxjdWxhdGlvbnM/OiBBcnJheTx7XG4gICAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgfSA9IHtcbiAgICAgIGluY2x1ZGVFbXB0eTogdHJ1ZSxcbiAgICB9XG4gICkge1xuICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IHN1cGVyLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICBpZiAoISFxdWVzdGlvblBsYWluRGF0YSkge1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuaXNOb2RlID0gdHJ1ZTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmRhdGEgPSB0aGlzLnBhbmVscy5tYXAoXG4gICAgICAgIChwYW5lbDogUGFuZWxNb2RlbCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHZhciBwYW5lbERhdGFJdGVtID0gPGFueT57XG4gICAgICAgICAgICBuYW1lOiBwYW5lbC5uYW1lIHx8IGluZGV4LFxuICAgICAgICAgICAgdGl0bGU6IHBhbmVsLnRpdGxlIHx8IFwiUGFuZWxcIixcbiAgICAgICAgICAgIHZhbHVlOiBwYW5lbC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgZGlzcGxheVZhbHVlOiBwYW5lbC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeSh2YWwpIDogdmFsLFxuICAgICAgICAgICAgaXNOb2RlOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogcGFuZWwucXVlc3Rpb25zXG4gICAgICAgICAgICAgIC5tYXAoKHF1ZXN0aW9uOiBRdWVzdGlvbikgPT4gcXVlc3Rpb24uZ2V0UGxhaW5EYXRhKG9wdGlvbnMpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChkOiBhbnkpID0+ICEhZCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICAob3B0aW9ucy5jYWxjdWxhdGlvbnMgfHwgW10pLmZvckVhY2goKGNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBwYW5lbERhdGFJdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV0gPSAoPGFueT5wYW5lbClbXG4gICAgICAgICAgICAgIGNhbGN1bGF0aW9uLnByb3BlcnR5TmFtZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcGFuZWxEYXRhSXRlbTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVFbGVtZW50Q3NzKHJlTmV3PzogYm9vbGVhbikge1xuICAgIHN1cGVyLnVwZGF0ZUVsZW1lbnRDc3MocmVOZXcpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IHRoaXMucGFuZWxzW2ldO1xuICAgICAgZWwudXBkYXRlRWxlbWVudENzcyhyZU5ldyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgcHJvZ3Jlc3NUZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIHJhbmdlTWF4ID0gdGhpcy5wYW5lbENvdW50O1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJwYW5lbER5bmFtaWNQcm9ncmVzc1RleHRcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLmN1cnJlbnRJbmRleCArIDEsIHJhbmdlTWF4KTtcbiAgfVxuICBwdWJsaWMgZ2V0UGFuZWxXcmFwcGVyQ3NzKCk6IHN0cmluZyB7XG4gICAgbGV0IGNzc0NsYXNzZXMgPSB0aGlzLmNzc0NsYXNzZXMucGFuZWxXcmFwcGVyO1xuICAgIGlmICh0aGlzLnBhbmVsUmVtb3ZlQnV0dG9uTG9jYXRpb24gPT09IFwicmlnaHRcIikge1xuICAgICAgY3NzQ2xhc3NlcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5wYW5lbFdyYXBwZXJJblJvdztcbiAgICB9XG4gICAgcmV0dXJuIGNzc0NsYXNzZXM7XG4gIH1cbiAgcHVibGljIGdldFBhbmVsUmVtb3ZlQnV0dG9uQ3NzKCk6IHN0cmluZyB7XG4gICAgbGV0IGNzc0NsYXNzZXMgPVxuICAgICAgdGhpcy5jc3NDbGFzc2VzLmJ1dHRvbiArIFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLmJ1dHRvblJlbW92ZTtcbiAgICBpZiAodGhpcy5wYW5lbFJlbW92ZUJ1dHRvbkxvY2F0aW9uID09PSBcInJpZ2h0XCIpIHtcbiAgICAgIGNzc0NsYXNzZXMgKz0gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuYnV0dG9uUmVtb3ZlUmlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBjc3NDbGFzc2VzO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicGFuZWxkeW5hbWljXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcInRlbXBsYXRlRWxlbWVudHNcIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJxdWVzdGlvbnNcIixcbiAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgaXNMaWdodFNlcmlhbGl6YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidGVtcGxhdGVUaXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZW1wbGF0ZVRpdGxlXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRlbXBsYXRlRGVzY3JpcHRpb246dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RlbXBsYXRlRGVzY3JpcHRpb25cIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJhbGxvd0FkZFBhbmVsOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJhbGxvd1JlbW92ZVBhbmVsOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGFuZWxDb3VudDpudW1iZXJcIixcbiAgICAgIGlzQmluZGFibGU6IHRydWUsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgICAgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJtaW5QYW5lbENvdW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4UGFuZWxDb3VudDpudW1iZXJcIixcbiAgICAgIGRlZmF1bHQ6IHNldHRpbmdzLnBhbmVsTWF4aW11bVBhbmVsQ291bnQsXG4gICAgfSxcbiAgICBcImRlZmF1bHRQYW5lbFZhbHVlOnBhbmVsdmFsdWVcIixcbiAgICBcImRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWw6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGFuZWxzU3RhdGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcImNvbGxhcHNlZFwiLCBcImV4cGFuZGVkXCIsIFwiZmlyc3RFeHBhbmRlZFwiXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJrZXlOYW1lXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NLZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiY29uZmlybURlbGV0ZTpib29sZWFuXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29uZmlybURlbGV0ZVRleHRcIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJwYW5lbEFkZFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsQWRkVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsUmVtb3ZlVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFuZWxSZW1vdmVUZXh0XCIgfSxcbiAgICB7IG5hbWU6IFwicGFuZWxQcmV2VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFuZWxQcmV2VGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsTmV4dFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsTmV4dFRleHRcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLFxuICAgICAgZGVmYXVsdDogXCJvZmZcIixcbiAgICAgIGNob2ljZXM6IFtcIm9mZlwiLCBcIm9uUGFuZWxcIiwgXCJvblN1cnZleVwiXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJzaG93UmFuZ2VJblByb2dyZXNzOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmVuZGVyTW9kZVwiLFxuICAgICAgZGVmYXVsdDogXCJsaXN0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJsaXN0XCIsIFwicHJvZ3Jlc3NUb3BcIiwgXCJwcm9ncmVzc0JvdHRvbVwiLCBcInByb2dyZXNzVG9wQm90dG9tXCJdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ0ZW1wbGF0ZVRpdGxlTG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIl0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhbmVsUmVtb3ZlQnV0dG9uTG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiYm90dG9tXCIsXG4gICAgICBjaG9pY2VzOiBbXCJib3R0b21cIiwgXCJyaWdodFwiXSxcbiAgICB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicGFuZWxkeW5hbWljXCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHJhZGlvZ3JvdXAgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyYWRpb2dyb3VwXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dElkICsgXCJfMFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHNlbGVjdGVkIGl0ZW0gaW4gdGhlIHJhZGlvIGdyb3VwLiBSZXR1cm5zIG51bGwgaWYgdGhlIHZhbHVlIGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlbGVjdGVkSXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCB0aGlzLnZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2hvdyBcImNsZWFyIGJ1dHRvblwiIGZsYWcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0NsZWFyQnV0dG9uXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dDbGVhckJ1dHRvbih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93Q2xlYXJCdXR0b25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNhblNob3dDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93Q2xlYXJCdXR0b24gJiYgIXRoaXMuaXNSZWFkT25seTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNsZWFyQnV0dG9uQ2FwdGlvbigpIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNsZWFyQ2FwdGlvblwiKTtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInJhZGlvZ3JvdXBcIixcbiAgW3sgbmFtZTogXCJzaG93Q2xlYXJCdXR0b246Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9XSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJjaGVja2JveGJhc2VcIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJyYWRpb2dyb3VwXCIsIChuYW1lKSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG4iLCJpbXBvcnQgU29ydGFibGVMaWIgZnJvbSBcInNvcnRhYmxlanNcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveE1vZGVsIH0gZnJvbSBcIi4vcXVlc3Rpb25fY2hlY2tib3hcIjtcbmltcG9ydCB7IElzTW9iaWxlIH0gZnJvbSBcIi4vdXRpbHMvaXMtbW9iaWxlXCI7XG5cbmNvbnN0IFNvcnRhYmxlID0gPGFueT5Tb3J0YWJsZUxpYjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHJhbmtpbmcgcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUmFua2luZ01vZGVsIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveE1vZGVsIHtcbiAgcHJpdmF0ZSBkb21Ob2RlOiBIVE1MRWxlbWVudCA9IG51bGw7XG4gIHByaXZhdGUgc29ydGFibGVJbnN0OiBhbnkgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyYW5raW5nXCI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSW5kZXRlcm1pbmF0ZSgpIHtcbiAgICByZXR1cm4gIXRoaXMudmFsdWUgfHwgdGhpcy52YWx1ZS5sZW5ndGggPT09IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJvb3RDbGFzcygpIHtcbiAgICBjb25zdCBjc3M6IGFueSA9IHRoaXMuY3NzQ2xhc3NlcztcbiAgICBpZiAoSXNNb2JpbGUpIHJldHVybiBjc3Mucm9vdCArIFwiIFwiICsgY3NzLnJvb3RNb2JpbGVNb2Q7XG4gICAgcmV0dXJuIGNzcy5yb290O1xuICB9XG5cbiAgcHVibGljIGdldE51bWJlckJ5SW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA/IFwiXFx1MjAxM1wiIDogaW5kZXggKyAxICsgXCJcIjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFua2luZ0Nob2ljZXMoKSB7XG4gICAgbGV0IHJlc3VsdDogSXRlbVZhbHVlW10gPSBbXTtcbiAgICBjb25zdCB2YWx1ZTogYW55ID0gdGhpcy52YWx1ZTtcbiAgICBjb25zdCB2aXNpYmxlQ2hvaWNlczogSXRlbVZhbHVlW10gPSB0aGlzLnJlbW92ZU90aGVyQ2hvaWNlRnJvbUNob2ljZXMoXG4gICAgICB0aGlzLnZpc2libGVDaG9pY2VzXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmlzSW5kZXRlcm1pbmF0ZSkge1xuICAgICAgcmVzdWx0ID0gIHZpc2libGVDaG9pY2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLm1lcmdlVmFsdWVBbmRWaXNpYmxlQ2hvaWNlcyh2YWx1ZSwgdmlzaWJsZUNob2ljZXMpO1xuICAgIH1cbiAgICBcbiAgICAvLyByYW5raW5nIHF1ZXN0aW9uIHdpdGggb25seSBvbmUgY2hvaWNlIGRvZXNuJ3QgbWFrZSBzZW5zZVxuICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAxKSByZXN1bHQgPSBbXTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU90aGVyQ2hvaWNlRnJvbUNob2ljZXMoY2hvaWNlczogSXRlbVZhbHVlW10pIHtcbiAgICBjb25zdCByZXN1bHQgPSBjaG9pY2VzO1xuICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChjaG9pY2UudmFsdWUgPT09IFwib3RoZXJcIikge1xuICAgICAgICByZXN1bHQuc3BsaWNlKGluZGV4LCAxKTsgLy8gcmVtb3ZlIG90aGVyIGNob2ljZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvL2Nyb3NzIGZyYW1ld29yayBpbml0aWFsaXphdGlvblxuICBwdWJsaWMgYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCEhZWwpIHtcbiAgICAgIHRoaXMuaW5pdFNvcnRhYmxlKGVsKTtcbiAgICB9XG4gICAgc3VwZXIuYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWwpO1xuICB9XG4gIC8vY3Jvc3MgZnJhbWV3b3JrIGRlc3Ryb3lcbiAgcHVibGljIGJlZm9yZURlc3Ryb3lRdWVzdGlvbkVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuc29ydGFibGVJbnN0KSB0aGlzLnNvcnRhYmxlSW5zdC5kZXN0cm95KCk7XG4gICAgc3VwZXIuYmVmb3JlRGVzdHJveVF1ZXN0aW9uRWxlbWVudChlbCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlS2V5ZG93biA9IChldmVudDogYW55KSA9PiB7XG4gICAgY29uc3Qga2V5OiBhbnkgPSBldmVudC5rZXk7XG4gICAgY29uc3QgYXJyYXk6IE5vZGVMaXN0T2Y8RWxlbWVudD4gPSB0aGlzLmRvbU5vZGUucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiLlwiICsgdGhpcy5jc3NDbGFzc2VzLml0ZW1cbiAgICApO1xuICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBbXS5pbmRleE9mLmNhbGwoYXJyYXksIGV2ZW50LnRhcmdldCk7XG5cbiAgICBpZiAoa2V5ID09PSBcIkFycm93VXBcIiAmJiBpbmRleCkge1xuICAgICAgdGhpcy5oYW5kbGVBcnJvd1VwKGluZGV4KTtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gXCJBcnJvd0Rvd25cIiAmJiBpbmRleCAhPT0gYXJyYXkubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5oYW5kbGVBcnJvd0Rvd24oaW5kZXgpO1xuICAgIH1cbiAgfTtcblxuICBwcm90ZWN0ZWQgc3VwcG9ydFNlbGVjdEFsbCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHN1cHBvcnROb25lKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHRvIG1ha2UgXCJjYXJyeSBmb3J3YXJkXCIgZmVhdHVyZSB3b3JrIHByb3Blcmx5IHdpdGggcmFua2luZ1xuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcblxuICAgIGlmICh0aGlzLmlzSW5kZXRlcm1pbmF0ZSkgcmV0dXJuO1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLnJhbmtpbmdDaG9pY2VzLm1hcChjaG9pY2UgPT4gY2hvaWNlLnZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VWYWx1ZUFuZFZpc2libGVDaG9pY2VzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgdmlzaWJsZUNob2ljZXM6IEFycmF5PEl0ZW1WYWx1ZT5cbiAgKSB7XG4gICAgY29uc3QgbGVuZ3RoOiBudW1iZXIgPSB2aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgbGV0IHJlc3VsdDogQXJyYXk8SXRlbVZhbHVlPiA9IFtdO1xuICAgIHJlc3VsdC5sZW5ndGggPSBsZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hvaWNlID0gdmlzaWJsZUNob2ljZXNbaV07XG4gICAgICBjb25zdCBpbmRleCA9IHZhbHVlLmluZGV4T2YoY2hvaWNlLnZhbHVlKTtcblxuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICByZXN1bHQuc3BsaWNlKGluZGV4LCAxLCBjaG9pY2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnNwbGljZShyZXN1bHQubGVuZ3RoIC0gMSwgMCwgY2hvaWNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcihjaG9pY2UgPT4gISFjaG9pY2UpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGluaXRTb3J0YWJsZShkb21Ob2RlOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghZG9tTm9kZSkgcmV0dXJuO1xuICAgIGNvbnN0IHNlbGY6IFF1ZXN0aW9uUmFua2luZ01vZGVsID0gdGhpcztcbiAgICBzZWxmLmRvbU5vZGUgPSBkb21Ob2RlO1xuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcblxuICAgIHNlbGYuc29ydGFibGVJbnN0ID0gbmV3IFNvcnRhYmxlKGRvbU5vZGUsIHtcbiAgICAgIGFuaW1hdGlvbjogMTAwLFxuICAgICAgZm9yY2VGYWxsYmFjazogdHJ1ZSxcbiAgICAgIGRlbGF5OiAyMDAsXG4gICAgICBkZWxheU9uVG91Y2hPbmx5OiB0cnVlLFxuICAgICAgaGFuZGxlOiBJc01vYmlsZVxuICAgICAgICA/IFwiLlwiICsgc2VsZi5jc3NDbGFzc2VzLml0ZW1JY29uQ29udGFpbmVyXG4gICAgICAgIDogXCIuXCIgKyBzZWxmLmNzc0NsYXNzZXMuaXRlbUNvbnRlbnQsXG4gICAgICBnaG9zdENsYXNzOiBzZWxmLmNzc0NsYXNzZXMuaXRlbUdob3N0TW9kLFxuICAgICAgZHJhZ0NsYXNzOiBzZWxmLmNzc0NsYXNzZXMuaXRlbURyYWdNb2QsXG4gICAgICBvblN0YXJ0KGV2dDogYW55KSB7XG4gICAgICAgICg8YW55PlNvcnRhYmxlLmdob3N0LnN0eWxlLm9wYWNpdHkpID0gMTtcbiAgICAgICAgZG9tTm9kZS5jbGFzc05hbWUgKz0gXCIgXCIgKyBzZWxmLmNzc0NsYXNzZXMucm9vdERyYWdNb2Q7XG4gICAgICAgIGlmIChzZWxmLmlzSW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICAgIHNlbGYuc2V0R2hvc3RUZXh0KGV2dC5vbGRJbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25FbmQoKSB7XG4gICAgICAgIGRvbU5vZGUuY2xhc3NOYW1lID0gZG9tTm9kZS5jbGFzc05hbWUucmVwbGFjZShcbiAgICAgICAgICBcIiBcIiArIHNlbGYuY3NzQ2xhc3Nlcy5yb290RHJhZ01vZCxcbiAgICAgICAgICBcIlwiXG4gICAgICAgICk7XG4gICAgICAgIHNlbGYuc2V0VmFsdWVGcm9tVUkoKTtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZShldnQ6IGFueSkge1xuICAgICAgICBpZiAoIXNlbGYuaXNJbmRldGVybWluYXRlKSBzZWxmLnN5bmNOdW1iZXJzKCk7XG4gICAgICAgIHNlbGYuc2V0R2hvc3RUZXh0KGV2dC5uZXdJbmRleCArIDEpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXJyb3dVcCA9IChpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgYXJyYXk6IHN0cmluZ1tdID0gdGhpcy5zb3J0YWJsZUluc3QudG9BcnJheSgpO1xuICAgIHRoaXMubW92ZUFycmF5SXRlbUJhY2soYXJyYXksIGluZGV4KTtcbiAgICB0aGlzLnNvcnRhYmxlSW5zdC5zb3J0KGFycmF5KTtcbiAgICB0aGlzLnN5bmNOdW1iZXJzKCk7XG4gICAgdGhpcy5zZXRWYWx1ZUZyb21VSSgpO1xuICAgIHRoaXMuZm9jdXNJdGVtKGluZGV4IC0gMSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVBcnJvd0Rvd24gPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGFycmF5OiBzdHJpbmdbXSA9IHRoaXMuc29ydGFibGVJbnN0LnRvQXJyYXkoKTtcbiAgICB0aGlzLm1vdmVBcnJheUl0ZW1Gb3J3YXJkKGFycmF5LCBpbmRleCk7XG4gICAgdGhpcy5zb3J0YWJsZUluc3Quc29ydChhcnJheSk7XG4gICAgdGhpcy5zeW5jTnVtYmVycygpO1xuICAgIHRoaXMuc2V0VmFsdWVGcm9tVUkoKTtcbiAgICB0aGlzLmZvY3VzSXRlbShpbmRleCArIDEpO1xuICB9O1xuXG4gIHByaXZhdGUgbW92ZUFycmF5SXRlbUJhY2sgPSAoYXJyYXk6IHN0cmluZ1tdLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgW2FycmF5W2luZGV4XSwgYXJyYXlbaW5kZXggLSAxXV0gPSBbYXJyYXlbaW5kZXggLSAxXSwgYXJyYXlbaW5kZXhdXTtcbiAgfTtcblxuICBwcml2YXRlIG1vdmVBcnJheUl0ZW1Gb3J3YXJkID0gKGFycmF5OiBzdHJpbmdbXSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIFthcnJheVtpbmRleF0sIGFycmF5W2luZGV4ICsgMV1dID0gW2FycmF5W2luZGV4ICsgMV0sIGFycmF5W2luZGV4XV07XG4gIH07XG5cbiAgcHJpdmF0ZSBmb2N1c0l0ZW0gPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGl0ZW1zTm9kZXM6IGFueSA9IHRoaXMuZG9tTm9kZS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCIuXCIgKyB0aGlzLmNzc0NsYXNzZXMuaXRlbVxuICAgICk7XG4gICAgaXRlbXNOb2Rlc1tpbmRleF0uZm9jdXMoKTtcbiAgfTtcblxuICBwcml2YXRlIHNldFZhbHVlRnJvbVVJID0gKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHRleHROb2RlcyA9IHRoaXMuZG9tTm9kZS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCIuXCIgKyB0aGlzLmNzc0NsYXNzZXMuY29udHJvbExhYmVsXG4gICAgKTtcbiAgICB0ZXh0Tm9kZXMuZm9yRWFjaCgodGV4dE5vZGU6IGFueSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlubmVyVGV4dDogc3RyaW5nID0gdGV4dE5vZGUuaW5uZXJUZXh0O1xuICAgICAgdGhpcy52aXNpYmxlQ2hvaWNlcy5mb3JFYWNoKCh2aXNpYmxlQ2hvaWNlOiBJdGVtVmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlubmVyVGV4dCA9PT0gdmlzaWJsZUNob2ljZS50ZXh0KSB7XG4gICAgICAgICAgdmFsdWUucHVzaCh2aXNpYmxlQ2hvaWNlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9O1xuXG4gIHByaXZhdGUgc3luY051bWJlcnMgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmRvbU5vZGUpIHJldHVybjtcbiAgICBjb25zdCBzZWxlY3Rvcjogc3RyaW5nID1cbiAgICAgIFwiLlwiICtcbiAgICAgIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtICtcbiAgICAgIFwiOm5vdCguXCIgK1xuICAgICAgdGhpcy5jc3NDbGFzc2VzLml0ZW1EcmFnTW9kICtcbiAgICAgIFwiKVwiICtcbiAgICAgIFwiIC5cIiArXG4gICAgICB0aGlzLmNzc0NsYXNzZXMuaXRlbUluZGV4O1xuXG4gICAgY29uc3QgaW5kZXhOb2RlczogTm9kZUxpc3RPZjxFbGVtZW50PiA9IHRoaXMuZG9tTm9kZS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgc2VsZWN0b3JcbiAgICApO1xuICAgIGluZGV4Tm9kZXMuZm9yRWFjaCgoaW5kZXhOb2RlOiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBpbmRleE5vZGUuaW5uZXJUZXh0ID0gdGhpcy5nZXROdW1iZXJCeUluZGV4KGluZGV4KTtcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIHNldEdob3N0VGV4dCA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpbmRleE5vZGVzOiBOb2RlTGlzdE9mPEVsZW1lbnQ+ID0gdGhpcy5kb21Ob2RlLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIi5cIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSW5kZXhcbiAgICApO1xuICAgIGNvbnN0IGdob3N0Tm9kZTogRWxlbWVudCA9IGluZGV4Tm9kZXNbaW5kZXhOb2Rlcy5sZW5ndGggLSAxXTtcbiAgICAoPGFueT5naG9zdE5vZGUpLmlubmVyVGV4dCA9IHRleHQ7XG4gIH07XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicmFua2luZ1wiLFxuICBbXG4gICAgeyBuYW1lOiBcImhhc090aGVyXCIsIHZpc2libGU6IGZhbHNlLCBpc1NlcmlhbGl6YWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwib3RoZXJUZXh0XCIsIHZpc2libGU6IGZhbHNlLCBpc1NlcmlhbGl6YWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwib3RoZXJFcnJvclRleHRcIiwgdmlzaWJsZTogZmFsc2UsIGlzU2VyaWFsaXphYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB2aXNpYmxlOiBmYWxzZSwgaXNTZXJpYWxpemFibGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImhhc05vbmVcIiwgdmlzaWJsZTogZmFsc2UsIGlzU2VyaWFsaXphYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJub25lVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSwgaXNTZXJpYWxpemFibGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImhhc1NlbGVjdEFsbFwiLCB2aXNpYmxlOiBmYWxzZSwgaXNTZXJpYWxpemFibGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInNlbGVjdEFsbFRleHRcIiwgdmlzaWJsZTogZmFsc2UsIGlzU2VyaWFsaXphYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIiwgdmlzaWJsZTogZmFsc2UsIGlzU2VyaWFsaXphYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJtYXhTZWxlY3RlZENob2ljZXNcIiwgdmlzaWJsZTogZmFsc2UsIGlzU2VyaWFsaXphYmxlOiBmYWxzZSB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUmFua2luZ01vZGVsKFwiXCIpO1xuICB9LFxuICBcImNoZWNrYm94XCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmFua2luZ1wiLCBuYW1lID0+IHtcbiAgY29uc3QgcTogUXVlc3Rpb25SYW5raW5nTW9kZWwgPSBuZXcgUXVlc3Rpb25SYW5raW5nTW9kZWwobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcbiIsImltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgcmF0aW5nIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYXRpbmdNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZXMoXCJyYXRlVmFsdWVzXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicmF0ZVZhbHVlc1wiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYucmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5vblByb3BlcnR5Q2hhbmdlZC5hZGQoZnVuY3Rpb24oc2VuZGVyOiBhbnksIG9wdGlvbnM6IGFueSkge1xuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zLm5hbWUgPT0gXCJyYXRlTWluXCIgfHxcbiAgICAgICAgb3B0aW9ucy5uYW1lID09IFwicmF0ZU1heFwiIHx8XG4gICAgICAgIG9wdGlvbnMubmFtZSA9PSBcInJhdGVTdGVwXCJcbiAgICAgICkge1xuICAgICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLnJhdGVWYWx1ZXNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIGxvY01pblJhdGVEZXNjcmlwdGlvblZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwibWluUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgdmFyIGxvY01heFJhdGVEZXNjcmlwdGlvblZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgbG9jTWluUmF0ZURlc2NyaXB0aW9uVmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dCA/IHRleHQgKyBcIiBcIiA6IHRleHQ7XG4gICAgfTtcbiAgICBsb2NNYXhSYXRlRGVzY3JpcHRpb25WYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiB0ZXh0ID8gXCIgXCIgKyB0ZXh0IDogdGV4dDtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcmF0ZSBpdGVtcy4gRXZlcnkgaXRlbSBoYXMgdmFsdWUgYW5kIHRleHQuIElmIHRleHQgaXMgZW1wdHksIHRoZSB2YWx1ZSBpcyByZW5kZXJlZC4gVGhlIGl0ZW0gdGV4dCBzdXBwb3J0cyBtYXJrZG93bi4gSWYgaXQgaXMgZW1wdHkgdGhlIGFycmF5IGlzIGdlbmVyYXRlZCBieSB1c2luZyByYXRlTWluLCByYXRlTWF4IGFuZCByYXRlU3RlcCBwcm9wZXJ0aWVzLlxuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlTWF4XG4gICAqIEBzZWUgcmF0ZVN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcmF0ZVZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZVZhbHVlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJhdGVWYWx1ZXModmFsOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZVZhbHVlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgcmF0ZSB2YWx1ZXMgaWYgcmF0ZVZhbHVlcyBhcnJheSBpcyBlbXB0eS4gSXQgaXMgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSByYXRpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuXG4gICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgKiBAc2VlIHJhdGVNYXhcbiAgICogQHNlZSByYXRlU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCByYXRlTWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVNaW5cIik7XG4gIH1cbiAgcHVibGljIHNldCByYXRlTWluKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHZhbCA+IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZVN0ZXApXG4gICAgICB2YWwgPSB0aGlzLnJhdGVNYXggLSB0aGlzLnJhdGVTdGVwO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVNaW5cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBsYXN0IHZhbHVlIGluIHRoZSByYXRpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuXG4gICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCByYXRlTWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVNYXhcIik7XG4gIH1cbiAgcHVibGljIHNldCByYXRlTWF4KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHZhbCA8IHRoaXMucmF0ZU1pbiArIHRoaXMucmF0ZVN0ZXApXG4gICAgICB2YWwgPSB0aGlzLnJhdGVNaW4gKyB0aGlzLnJhdGVTdGVwO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVNYXhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBzdGVwIHZhbHVlLiBUaGUgbnVtYmVyIG9mIHJhdGUgdmFsdWVzIGFyZSAocmF0ZU1heCAtIHJhdGVNaW4pIC8gcmF0ZVN0ZXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuXG4gICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlTWF4XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJhdGVTdGVwKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVTdGVwXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmF0ZVN0ZXAodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDw9IDApIHZhbCA9IDE7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHZhbCA+IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZU1pbilcbiAgICAgIHZhbCA9IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZU1pbjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyYXRlU3RlcFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciByZXMgPSBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUodGhpcy52aXNpYmxlUmF0ZVZhbHVlcywgdmFsdWUpO1xuICAgIHJldHVybiAhIXJlcyA/IHJlcyA6IHZhbHVlO1xuICB9XG4gIGdldCB2aXNpYmxlUmF0ZVZhbHVlcygpOiBJdGVtVmFsdWVbXSB7XG4gICAgaWYgKHRoaXMucmF0ZVZhbHVlcy5sZW5ndGggPiAwKSByZXR1cm4gdGhpcy5yYXRlVmFsdWVzO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLnJhdGVNaW47XG4gICAgdmFyIHN0ZXAgPSB0aGlzLnJhdGVTdGVwO1xuICAgIHdoaWxlIChcbiAgICAgIHZhbHVlIDw9IHRoaXMucmF0ZU1heCAmJlxuICAgICAgcmVzLmxlbmd0aCA8IHNldHRpbmdzLnJhdGluZ01heGltdW1SYXRlVmFsdWVDb3VudFxuICAgICkge1xuICAgICAgcmVzLnB1c2gobmV3IEl0ZW1WYWx1ZSh2YWx1ZSkpO1xuICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZSh2YWx1ZSArIHN0ZXAsIHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgY29ycmVjdFZhbHVlKHZhbHVlOiBudW1iZXIsIHN0ZXA6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmIChNYXRoLnJvdW5kKHZhbHVlKSA9PSB2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICAgIHZhciBmciA9IDA7XG4gICAgd2hpbGUgKE1hdGgucm91bmQoc3RlcCkgIT0gc3RlcCkge1xuICAgICAgc3RlcCAqPSAxMDtcbiAgICAgIGZyKys7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlLnRvRml4ZWQoZnIpKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJhdGluZ1wiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJZCArIFwiXzBcIjtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydENvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIG1pbmltdW0gKGZpcnN0KSBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5SYXRlRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtaW5SYXRlRGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW5SYXRlRGVzY3JpcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1pblJhdGVEZXNjcmlwdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NNaW5SYXRlRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibWluUmF0ZURlc2NyaXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgbWF4aW11bSAobGFzdCkgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4UmF0ZURlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibWF4UmF0ZURlc2NyaXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4UmF0ZURlc2NyaXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtYXhSYXRlRGVzY3JpcHRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTWF4UmF0ZURlc2NyaXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm1heFJhdGVEZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVUb0RhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLnJhdGVWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUodGhpcy5yYXRlVmFsdWVzLCB2YWwpO1xuICAgICAgcmV0dXJuICEhaXRlbSA/IGl0ZW0udmFsdWUgOiB2YWw7XG4gICAgfVxuICAgIHJldHVybiAhaXNOYU4odmFsKSA/IHBhcnNlRmxvYXQodmFsKSA6IHZhbDtcbiAgfVxuICAvKipcbiAgICogQ2xpY2sgdmFsdWUgYWdhaW4gdG8gY2xlYXIuXG4gICAqL1xuICBwdWJsaWMgc2V0VmFsdWVGcm9tQ2xpY2sodmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLnZhbHVlID09PSBwYXJzZUZsb2F0KHZhbHVlKSkge1xuICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldEl0ZW1DbGFzcyhpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICBjb25zdCBpdGVtQ3NzID0gdGhpcy5jc3NDbGFzc2VzLml0ZW07XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmNzc0NsYXNzZXMuc2VsZWN0ZWQ7XG4gICAgY29uc3QgZGlzYWJsZWQgPSB0aGlzLmNzc0NsYXNzZXMuaXRlbURpc2FibGVkO1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLnZhbHVlID09IGl0ZW0udmFsdWU7XG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuaXNSZWFkT25seSAmJiAhaXRlbS5pc0VuYWJsZWQ7XG4gICAgY29uc3QgYWxsb3dIb3ZlciA9XG4gICAgICAhaXNEaXNhYmxlZCAmJlxuICAgICAgIWlzU2VsZWN0ZWQgJiZcbiAgICAgICEoISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGUpO1xuICAgIGxldCByZXN1bHQgPSBpdGVtQ3NzO1xuICAgIGlmICh0aGlzLnZhbHVlID09IGl0ZW0udmFsdWUpIHtcbiAgICAgIHJlc3VsdCArPSBcIiBcIiArIHNlbGVjdGVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1JlYWRPbmx5KSB7XG4gICAgICByZXN1bHQgKz0gXCIgXCIgKyBkaXNhYmxlZDtcbiAgICB9XG4gICAgaWYgKGFsbG93SG92ZXIpIHtcbiAgICAgIHJlc3VsdCArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSG92ZXI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicmF0aW5nXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwiaGFzQ29tbWVudDpzd2l0Y2hcIiwgbGF5b3V0OiBcInJvd1wiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb21tZW50VGV4dFwiLFxuICAgICAgZGVwZW5kc09uOiBcImhhc0NvbW1lbnRcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIG9iai5oYXNDb21tZW50O1xuICAgICAgfSxcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb21tZW50VGV4dFwiLFxuICAgICAgbGF5b3V0OiBcInJvd1wiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyYXRlVmFsdWVzOml0ZW12YWx1ZVtdXCIsXG4gICAgICBiYXNlVmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob2ljZXNfSXRlbVwiKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IG5hbWU6IFwicmF0ZU1pbjpudW1iZXJcIiwgZGVmYXVsdDogMSB9LFxuICAgIHsgbmFtZTogXCJyYXRlTWF4Om51bWJlclwiLCBkZWZhdWx0OiA1IH0sXG4gICAgeyBuYW1lOiBcInJhdGVTdGVwOm51bWJlclwiLCBkZWZhdWx0OiAxLCBtaW5WYWx1ZTogMC4xIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtaW5SYXRlRGVzY3JpcHRpb25cIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJtaW5pbnVtUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTWluUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1heFJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgYWx0ZXJuYXRpdmVOYW1lOiBcIm1heGltdW1SYXRlRGVzY3JpcHRpb25cIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NNYXhSYXRlRGVzY3JpcHRpb25cIixcbiAgICB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUmF0aW5nTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmF0aW5nXCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25SYXRpbmdNb2RlbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgcHJvcGVydHksIFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgU2lnbmF0dXJlUGFkIGZyb20gXCJzaWduYXR1cmVfcGFkXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcblxudmFyIGRlZmF1bHRXaWR0aCA9IDMwMDtcbnZhciBkZWZhdWx0SGVpZ2h0ID0gMjAwO1xuXG5mdW5jdGlvbiByZXNpemVDYW52YXMoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkge1xuICB2YXIgY29udGV4dDogYW55ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgdmFyIGRldmljZVBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICB2YXIgYmFja2luZ1N0b3JlUmF0aW8gPVxuICAgIGNvbnRleHQud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGNvbnRleHQubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGNvbnRleHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgY29udGV4dC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGNvbnRleHQuYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIDE7XG5cbiAgdmFyIHJhdGlvID0gZGV2aWNlUGl4ZWxSYXRpbyAvIGJhY2tpbmdTdG9yZVJhdGlvO1xuXG4gIHZhciBvbGRXaWR0aCA9IGNhbnZhcy53aWR0aDtcbiAgdmFyIG9sZEhlaWdodCA9IGNhbnZhcy5oZWlnaHQ7XG5cbiAgY2FudmFzLndpZHRoID0gb2xkV2lkdGggKiByYXRpbztcbiAgY2FudmFzLmhlaWdodCA9IG9sZEhlaWdodCAqIHJhdGlvO1xuXG4gIGNhbnZhcy5zdHlsZS53aWR0aCA9IG9sZFdpZHRoICsgXCJweFwiO1xuICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gb2xkSGVpZ2h0ICsgXCJweFwiO1xuXG4gIGNvbnRleHQuc2NhbGUocmF0aW8sIHJhdGlvKTtcbn1cblxuLyoqXG4gKiBBIE1vZGVsIGZvciBzaWduYXR1cmUgcGFkIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBmYWxzZSB9KSBpc0RyYXdpbmdWYWx1ZTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGdldENzc1Jvb3QoY3NzQ2xhc3NlczogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgY2xhc3NlcyA9IHN1cGVyLmdldENzc1Jvb3QoY3NzQ2xhc3Nlcyk7XG4gICAgaWYgKFwiXCIgKyB0aGlzLndpZHRoID09PSBcIjMwMFwiKSB7XG4gICAgICBjbGFzc2VzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5zbWFsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlVmFsdWUoKSB7XG4gICAgaWYgKHRoaXMuc2lnbmF0dXJlUGFkKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuc2lnbmF0dXJlUGFkLnRvRGF0YVVSTCh0aGlzLmRhdGFGb3JtYXQpO1xuICAgICAgdGhpcy52YWx1ZSA9IGRhdGE7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzaWduYXR1cmVwYWRcIjtcbiAgfVxuICBwdWJsaWMgYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCEhZWwpIHtcbiAgICAgIHRoaXMuaW5pdFNpZ25hdHVyZVBhZChlbCk7XG4gICAgfVxuICAgIHN1cGVyLmFmdGVyUmVuZGVyUXVlc3Rpb25FbGVtZW50KGVsKTtcbiAgfVxuICBwdWJsaWMgYmVmb3JlRGVzdHJveVF1ZXN0aW9uRWxlbWVudChlbDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoISFlbCkge1xuICAgICAgdGhpcy5kZXN0cm95U2lnbmF0dXJlUGFkKGVsKTtcbiAgICB9XG4gIH1cblxuICBpbml0U2lnbmF0dXJlUGFkKGVsOiBIVE1MRWxlbWVudCkge1xuICAgIHZhciBjYW52YXM6IGFueSA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY2FudmFzXCIpWzBdO1xuICAgIHZhciBidXR0b25FbCA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYnV0dG9uXCIpWzBdO1xuICAgIHZhciBzaWduYXR1cmVQYWQgPSBuZXcgU2lnbmF0dXJlUGFkKGNhbnZhcywgeyBiYWNrZ3JvdW5kQ29sb3I6IFwiI2ZmZmZmZlwiIH0pO1xuICAgIGlmICh0aGlzLmlzSW5wdXRSZWFkT25seSkge1xuICAgICAgc2lnbmF0dXJlUGFkLm9mZigpO1xuICAgIH1cblxuICAgIGJ1dHRvbkVsLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICB0aGlzLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFsbG93Q2xlYXIgfHwgdGhpcy5pc0lucHV0UmVhZE9ubHkpIHtcbiAgICAgICAgc2lnbmF0dXJlUGFkLm9mZigpO1xuICAgICAgICBidXR0b25FbC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWduYXR1cmVQYWQub24oKTtcbiAgICAgICAgYnV0dG9uRWwuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2lnbmF0dXJlUGFkLnBlbkNvbG9yID0gdGhpcy5wZW5Db2xvcjtcbiAgICBzaWduYXR1cmVQYWQuYmFja2dyb3VuZENvbG9yID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgc2lnbmF0dXJlUGFkLm9uQmVnaW4gPSAoKSA9PiB7XG4gICAgICB0aGlzLmlzRHJhd2luZ1ZhbHVlID0gdHJ1ZTtcbiAgICAgIGNhbnZhcy5mb2N1cygpO1xuICAgIH07XG4gICAgc2lnbmF0dXJlUGFkLm9uRW5kID0gKCkgPT4ge1xuICAgICAgdGhpcy5pc0RyYXdpbmdWYWx1ZSA9IGZhbHNlO1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZSgpO1xuICAgIH07XG4gICAgdmFyIHVwZGF0ZVZhbHVlSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy52YWx1ZTtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHRoaXMud2lkdGggfHwgZGVmYXVsdFdpZHRoO1xuICAgICAgY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0IHx8IGRlZmF1bHRIZWlnaHQ7XG4gICAgICByZXNpemVDYW52YXMoY2FudmFzKTtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICBzaWduYXR1cmVQYWQuY2xlYXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ25hdHVyZVBhZC5mcm9tRGF0YVVSTChkYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMudmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSB1cGRhdGVWYWx1ZUhhbmRsZXI7XG4gICAgdXBkYXRlVmFsdWVIYW5kbGVyKCk7XG4gICAgdGhpcy5yZWFkT25seUNoYW5nZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2lnbmF0dXJlUGFkID0gc2lnbmF0dXJlUGFkO1xuICAgIHZhciBwcm9wZXJ0eUNoYW5nZWRIYW5kbGVyID0gKHNlbmRlcjogYW55LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLm5hbWUgPT09IFwid2lkdGhcIiB8fCBvcHRpb25zLm5hbWUgPT09IFwiaGVpZ2h0XCIpIHtcbiAgICAgICAgdXBkYXRlVmFsdWVIYW5kbGVyKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9uUHJvcGVydHlDaGFuZ2VkLmFkZChwcm9wZXJ0eUNoYW5nZWRIYW5kbGVyKTtcbiAgICB0aGlzLnNpZ25hdHVyZVBhZC5wcm9wZXJ0eUNoYW5nZWRIYW5kbGVyID0gcHJvcGVydHlDaGFuZ2VkSGFuZGxlcjtcbiAgfVxuICBkZXN0cm95U2lnbmF0dXJlUGFkKGVsOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICh0aGlzLnNpZ25hdHVyZVBhZCkge1xuICAgICAgdGhpcy5vblByb3BlcnR5Q2hhbmdlZC5yZW1vdmUodGhpcy5zaWduYXR1cmVQYWQucHJvcGVydHlDaGFuZ2VkSGFuZGxlcik7XG4gICAgICB0aGlzLnNpZ25hdHVyZVBhZC5vZmYoKTtcbiAgICB9XG4gICAgdGhpcy5yZWFkT25seUNoYW5nZWRDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5zaWduYXR1cmVQYWQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBzZXQgdGhlIHNwZWNpZmljIGRhdGFGb3JtYXQgZm9yIHRoZSBzaWduYXR1cmUgcGFkIGltYWdlIGRhdGEuXG4gICAqIGZvcm1hdHM6IFwiXCIgKGRlZmF1bHQpIC0gcG5nLCBcImltYWdlL2pwZWdcIiAtIGpwZWcsIFwiaW1hZ2Uvc3ZnK3htbFwiIC0gc3ZnXG4gICAqL1xuICBAcHJvcGVydHkoeyBkZWZhdWx0VmFsdWU6IFwiXCIgfSkgZGF0YUZvcm1hdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gc2V0IHRoZSBzcGVjaWZpYyB3aWR0aCBmb3IgdGhlIHNpZ25hdHVyZSBwYWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIsIDMwMCk7XG4gIH1cbiAgcHVibGljIHNldCB3aWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBzZXQgdGhlIHNwZWNpZmljIGhlaWdodCBmb3IgdGhlIHNpZ25hdHVyZSBwYWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIiwgMjAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhlaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhlaWdodFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gY2xlYXIgY29udGVudCBvZiB0aGUgc2lnbmF0dXJlIHBhZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dDbGVhcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dDbGVhclwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93Q2xlYXIodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dDbGVhclwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gc2V0IHBlbiBjb2xvciBmb3IgdGhlIHNpZ25hdHVyZSBwYWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBlbkNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBlbkNvbG9yXCIsIFwiIzFhYjM5NFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBlbkNvbG9yKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGVuQ29sb3JcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIHNldCBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgc2lnbmF0dXJlIHBhZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImJhY2tncm91bmRDb2xvclwiLCBcIiNmZmZmZmZcIik7XG4gIH1cbiAgcHVibGljIHNldCBiYWNrZ3JvdW5kQ29sb3IodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNsZWFyIHNpZ25hdHVyZSBidXR0b24gY2FwdGlvbi5cbiAgICovXG4gIGdldCBjbGVhckJ1dHRvbkNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNsZWFyQ2FwdGlvblwiKTtcbiAgfVxuXG4gIHB1YmxpYyBuZWVkU2hvd1BsYWNlaG9sZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc0RyYXdpbmdWYWx1ZSAmJiB0aGlzLmlzRW1wdHkoKTtcbiAgfVxuXG4gIGdldCBwbGFjZUhvbGRlclRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNpZ25hdHVyZVBsYWNlSG9sZGVyXCIpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwic2lnbmF0dXJlcGFkXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcIndpZHRoOm51bWJlclwiLFxuICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgZGVmYXVsdDogMzAwLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJoZWlnaHQ6bnVtYmVyXCIsXG4gICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICBkZWZhdWx0OiAyMDAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImFsbG93Q2xlYXI6Ym9vbGVhblwiLFxuICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGVuQ29sb3I6Y29sb3JcIixcbiAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgIGRlZmF1bHQ6IFwiIzFhYjM5NFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJiYWNrZ3JvdW5kQ29sb3I6Y29sb3JcIixcbiAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgIGRlZmF1bHQ6IFwiI2ZmZmZmZlwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJkYXRhRm9ybWF0XCIsXG4gICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICBkZWZhdWx0OiBcIlwiLFxuICAgICAgY2hvaWNlczogW1xuICAgICAgICB7IHZhbHVlOiBcIlwiLCB0ZXh0OiBcIlBOR1wiIH0sXG4gICAgICAgIHsgdmFsdWU6IFwiaW1hZ2UvanBlZ1wiLCB0ZXh0OiBcIkpQRUdcIiB9LFxuICAgICAgICB7IHZhbHVlOiBcImltYWdlL3N2Zyt4bWxcIiwgdGV4dDogXCJTVkdcIiB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJkZWZhdWx0VmFsdWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiY29ycmVjdEFuc3dlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwic2lnbmF0dXJlcGFkXCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbChuYW1lKTtcbn0pO1xuIiwiaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcsIExvY2FsaXphYmxlU3RyaW5ncyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBIZWxwZXJzLCBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBFbWFpbFZhbGlkYXRvciwgU3VydmV5VmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX3RleHRiYXNlXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYW4gaW5wdXQgdGV4dCBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uVGV4dE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25UZXh0QmFzZSB7XG4gIHByaXZhdGUgbG9jRGF0YUxpc3RWYWx1ZTogTG9jYWxpemFibGVTdHJpbmdzO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibWluRXJyb3JUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJtYXhFcnJvclRleHRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5sb2NEYXRhTGlzdFZhbHVlID0gbmV3IExvY2FsaXphYmxlU3RyaW5ncyh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJtaW5cIiwgXCJtYXhcIiwgXCJpbnB1dFR5cGVcIiwgXCJtaW5WYWx1ZUV4cHJlc3Npb25cIiwgXCJtYXhWYWx1ZUV4cHJlc3Npb25cIl0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0UmVuZGVyZWRNaW5NYXgoKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChbXCJpbnB1dFR5cGVcIiwgXCJzaXplXCJdLCAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUlucHV0U2l6ZSgpO1xuICAgICAgdGhpcy5jYWxjUmVuZGVyZWRQbGFjZUhvbGRlcigpO1xuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBpc1RleHRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gW1widGV4dFwiLCBcIm51bWJlclwiLCBcInBhc3N3b3JkXCJdLmluZGV4T2YodGhpcy5pbnB1dFR5cGUpID4gLTE7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICB0aGlzLnNldFJlbmRlcmVkTWluTWF4KCk7XG4gICAgdGhpcy51cGRhdGVJbnB1dFNpemUoKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGlucHV0IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbnB1dFR5cGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbnB1dFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICB2YWwgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodmFsID09IFwiZGF0ZXRpbWVfbG9jYWxcIikgdmFsID0gXCJkYXRldGltZS1sb2NhbFwiO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlucHV0VHlwZVwiLCB2YWwudG9Mb3dlckNhc2UoKSk7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLm1pbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMubWF4ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zdGVwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaWYgKCEhdGhpcy5taW5WYWx1ZUV4cHJlc3Npb24gfHwgISF0aGlzLm1heFZhbHVlRXhwcmVzc2lvbikge1xuICAgICAgdGhpcy5zZXRSZW5kZXJlZE1pbk1heCh2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+IHtcbiAgICB2YXIgdmFsaWRhdG9ycyA9IHN1cGVyLmdldFZhbGlkYXRvcnMoKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlucHV0VHlwZSA9PT0gXCJlbWFpbFwiICYmXG4gICAgICAhdGhpcy52YWxpZGF0b3JzLnNvbWUoKHYpID0+IHYuZ2V0VHlwZSgpID09PSBcImVtYWlsdmFsaWRhdG9yXCIpXG4gICAgKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2gobmV3IEVtYWlsVmFsaWRhdG9yKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgfVxuICBpc0xheW91dFR5cGVTdXBwb3J0ZWQobGF5b3V0VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGlucHV0IHNpemVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaXplXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2l6ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNpemVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVGV4dElucHV0KCkge1xuICAgIHJldHVybiAoXG4gICAgICBbXCJ0ZXh0XCIsIFwic2VhcmNoXCIsIFwidGVsXCIsIFwidXJsXCIsIFwiZW1haWxcIiwgXCJwYXNzd29yZFwiXS5pbmRleE9mKFxuICAgICAgICB0aGlzLmlucHV0VHlwZVxuICAgICAgKSA+IC0xXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbnB1dFNpemVcIiwgMCk7XG4gIH1cbiAgcHVibGljIGdldCBpbnB1dFdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlucHV0V2lkdGhcIik7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUlucHV0U2l6ZSgpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuaXNUZXh0SW5wdXQgJiYgdGhpcy5zaXplID4gMCA/IHRoaXMuc2l6ZSA6IDA7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1RleHRJbnB1dCAmJlxuICAgICAgc2l6ZSA8IDEgJiZcbiAgICAgIHRoaXMucGFyZW50ICYmXG4gICAgICAhISg8YW55PnRoaXMucGFyZW50KVtcIml0ZW1TaXplXCJdXG4gICAgKSB7XG4gICAgICBzaXplID0gKDxhbnk+dGhpcy5wYXJlbnQpW1wiaXRlbVNpemVcIl07XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlucHV0U2l6ZVwiLCBzaXplKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbnB1dFdpZHRoXCIsIHNpemUgPiAwID8gXCJhdXRvXCIgOiBcIlwiKTtcbiAgfVxuICAvKipcbiAgICogVGV4dCBhdXRvIGNvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGF1dG9Db21wbGV0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhdXRvQ29tcGxldGVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBhdXRvQ29tcGxldGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhdXRvQ29tcGxldGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1pbmltdW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbih2YWw6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzVmFsdWVFeHByZXNzaW9uKHZhbCkpIHtcbiAgICAgIHRoaXMubWluVmFsdWVFeHByZXNzaW9uID0gdmFsLnN1YnN0cigxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhcIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXgodmFsOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRXhwcmVzc2lvbih2YWwpKSB7XG4gICAgICB0aGlzLm1heFZhbHVlRXhwcmVzc2lvbiA9IHZhbC5zdWJzdHIoMSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSB2YWx1ZSB0aGF0IHlvdSBjYW4gc2V0dXAgYXMgZXhwcmVzc2lvbiwgZm9yIGV4YW1wbGUgdG9kYXkoLTEpID0geWVzdGVyZGF5O1xuICAgKi9cbiAgcHVibGljIGdldCBtaW5WYWx1ZUV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluVmFsdWVFeHByZXNzaW9uXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluVmFsdWVFeHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluVmFsdWVFeHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgeW91IGNhbiBzZXR1cCBhcyBleHByZXNzaW9uLCBmb3IgZXhhbXBsZSB0b2RheSgxKSA9IHRvbW9ycm93O1xuICAgKi9cbiAgcHVibGljIGdldCBtYXhWYWx1ZUV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4VmFsdWVFeHByZXNzaW9uXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VmFsdWVFeHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VmFsdWVFeHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJlZE1pbigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZE1pblwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlbmRlcmVkTWF4KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcmVkTWF4XCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0aGF0IHNob3dzIHdoZW4gdmFsdWUgaXMgbGVzcyB0aGFuIG1pbiBwcm9wZXJ0eS5cbiAgICogQHNlZSBtaW5cbiAgICogQHNlZSBtYXhFcnJvclRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgbWluRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJtaW5FcnJvclRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtaW5FcnJvclwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBtaW5FcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1pbkVycm9yVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NNaW5FcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibWluRXJyb3JUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0aGF0IHNob3dzIHdoZW4gdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1hbiBwcm9wZXJ0eS5cbiAgICogQHNlZSBtYXhcbiAgICogQHNlZSBtaW5FcnJvclRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4RXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJtYXhFcnJvclRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYXhFcnJvclwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1heEVycm9yVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NNYXhFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibWF4RXJyb3JUZXh0XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRvbmx5IHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGlucHV0VHlwZSBhbGxvd3MgdG8gc2V0IG1pbiBhbmQgbWF4IHByb3BlcnRpZXNcbiAgICogQHNlZSBpbnB1dFR5cGVcbiAgICogQHNlZSBtaW5cbiAgICogQHNlZSBtYXhcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNNaW5NYXhUeXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtaW5NYXhUeXBlcy5pbmRleE9mKHRoaXMuaW5wdXRUeXBlKSA+IC0xO1xuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKFxuICAgIGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+LFxuICAgIGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMsIGlzT25WYWx1ZUNoYW5nZWQpO1xuICAgIGlmIChpc09uVmFsdWVDaGFuZ2VkIHx8IHRoaXMuY2FuU2V0VmFsdWVUb1N1cnZleSgpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUxlc3NNaW4pIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBuZXcgQ3VzdG9tRXJyb3IoXG4gICAgICAgICAgdGhpcy5nZXRNaW5NYXhFcnJvclRleHQoXG4gICAgICAgICAgICB0aGlzLm1pbkVycm9yVGV4dCxcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FsY3VsYXRlZE1pbk1heCh0aGlzLnJlbmRlcmVkTWluKVxuICAgICAgICAgICksXG4gICAgICAgICAgdGhpc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ZhbHVlR3JlYXRlck1heCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG5ldyBDdXN0b21FcnJvcihcbiAgICAgICAgICB0aGlzLmdldE1pbk1heEVycm9yVGV4dChcbiAgICAgICAgICAgIHRoaXMubWF4RXJyb3JUZXh0LFxuICAgICAgICAgICAgdGhpcy5nZXRDYWxjdWxhdGVkTWluTWF4KHRoaXMucmVuZGVyZWRNYXgpXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0aGlzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjYW5TZXRWYWx1ZVRvU3VydmV5KCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc01pbk1heFR5cGUpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmlzVmFsdWVMZXNzTWluKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUdyZWF0ZXJNYXgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGdldE1pbk1heEVycm9yVGV4dChlcnJvclRleHQ6IHN0cmluZywgdmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIGVycm9yVGV4dDtcbiAgICByZXR1cm4gZXJyb3JUZXh0LnJlcGxhY2UoXCJ7MH1cIiwgdmFsdWUudG9TdHJpbmcoKSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNWYWx1ZUxlc3NNaW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLnJlbmRlcmVkTWluKSAmJlxuICAgICAgdGhpcy5nZXRDYWxjdWxhdGVkTWluTWF4KHRoaXMudmFsdWUpIDxcbiAgICAgICAgdGhpcy5nZXRDYWxjdWxhdGVkTWluTWF4KHRoaXMucmVuZGVyZWRNaW4pXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc1ZhbHVlR3JlYXRlck1heCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMucmVuZGVyZWRNYXgpICYmXG4gICAgICB0aGlzLmdldENhbGN1bGF0ZWRNaW5NYXgodGhpcy52YWx1ZSkgPlxuICAgICAgICB0aGlzLmdldENhbGN1bGF0ZWRNaW5NYXgodGhpcy5yZW5kZXJlZE1heClcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzRGF0ZUlucHV0VHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dFR5cGUgPT09IFwiZGF0ZVwiIHx8IHRoaXMuaW5wdXRUeXBlID09PSBcImRhdGV0aW1lLWxvY2FsXCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDYWxjdWxhdGVkTWluTWF4KG1pbk1heDogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkobWluTWF4KSkgcmV0dXJuIG1pbk1heDtcbiAgICByZXR1cm4gdGhpcy5pc0RhdGVJbnB1dFR5cGUgPyBuZXcgRGF0ZShtaW5NYXgpIDogbWluTWF4O1xuICB9XG4gIHByaXZhdGUgc2V0UmVuZGVyZWRNaW5NYXgoXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGwsXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4gPSBudWxsXG4gICkge1xuICAgIHRoaXMuc2V0VmFsdWVBbmRSdW5FeHByZXNzaW9uKFxuICAgICAgdGhpcy5taW5WYWx1ZUV4cHJlc3Npb24sXG4gICAgICB0aGlzLm1pbixcbiAgICAgICh2YWwpID0+IHtcbiAgICAgICAgaWYgKCF2YWwgJiYgdGhpcy5pc0RhdGVJbnB1dFR5cGUgJiYgISFzZXR0aW5ncy5taW5EYXRlKSB7XG4gICAgICAgICAgdmFsID0gc2V0dGluZ3MubWluRGF0ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZE1pblwiLCB2YWwpO1xuICAgICAgfSxcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXNcbiAgICApO1xuICAgIHRoaXMuc2V0VmFsdWVBbmRSdW5FeHByZXNzaW9uKFxuICAgICAgdGhpcy5tYXhWYWx1ZUV4cHJlc3Npb24sXG4gICAgICB0aGlzLm1heCxcbiAgICAgICh2YWwpID0+IHtcbiAgICAgICAgaWYgKCF2YWwgJiYgdGhpcy5pc0RhdGVJbnB1dFR5cGUpIHtcbiAgICAgICAgICB2YWwgPSAhIXNldHRpbmdzLm1heERhdGUgPyBzZXR0aW5ncy5tYXhEYXRlIDogXCIyOTk5LTEyLTMxXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRNYXhcIiwgdmFsKTtcbiAgICAgIH0sXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3RlcCB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzdGVwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0ZXBcIik7XG4gIH1cbiAgcHVibGljIHNldCBzdGVwKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RlcFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRTdGVwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuc3RlcCkgPyBcImFueVwiIDogdGhpcy5zdGVwO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiBbXCJkYXRlXCIsIFwiZGF0ZXRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiXS5pbmRleE9mKHRoaXMuaW5wdXRUeXBlKSA8IDA7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlRXJyb3IoKSB7XG4gICAgcmV0dXJuIFtcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcImRhdGV0aW1lLWxvY2FsXCJdLmluZGV4T2YodGhpcy5pbnB1dFR5cGUpIDwgMDtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcmVjb21tZW5kZWQgb3B0aW9ucyBhdmFpbGFibGUgdG8gY2hvb3NlLlxuICAgKi9cbiAgcHVibGljIGdldCBkYXRhTGlzdCgpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5sb2NEYXRhTGlzdC52YWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGRhdGFMaXN0KHZhbDogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMubG9jRGF0YUxpc3QudmFsdWUgPSB2YWw7XG4gIH1cbiAgZ2V0IGxvY0RhdGFMaXN0KCk6IExvY2FsaXphYmxlU3RyaW5ncyB7XG4gICAgcmV0dXJuIHRoaXMubG9jRGF0YUxpc3RWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRhdGFMaXN0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gIXRoaXMubG9jRGF0YUxpc3QuaXNFbXB0eSA/IHRoaXMuaWQgKyBcIl9kYXRhbGlzdFwiIDogXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUnVuVmFsaWRhdG9ycyhpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZXJyb3JzLmxlbmd0aCA+IDAgfHxcbiAgICAgICFpc09uVmFsdWVDaGFuZ2VkIHx8XG4gICAgICB0aGlzLnN1cHBvcnRHb05leHRQYWdlRXJyb3IoKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBuZXdWYWx1ZSA9IHRoaXMuY29ycmVjdFZhbHVlVHlwZShuZXdWYWx1ZSk7XG4gICAgc3VwZXIuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBjb3JyZWN0VmFsdWVUeXBlKG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICghbmV3VmFsdWUpIHJldHVybiBuZXdWYWx1ZTtcbiAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT0gXCJudW1iZXJcIiB8fCB0aGlzLmlucHV0VHlwZSA9PSBcInJhbmdlXCIpIHtcbiAgICAgIHJldHVybiBIZWxwZXJzLmlzTnVtYmVyKG5ld1ZhbHVlKSA/IHBhcnNlRmxvYXQobmV3VmFsdWUpIDogXCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRDb250cm9sQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjc3NDbGFzc2VzID0gdGhpcy5jc3NDbGFzc2VzO1xuICAgIGxldCByZXN1bHQgPVxuICAgICAgY3NzQ2xhc3Nlcy5yb290ICtcbiAgICAgICh0aGlzLmVycm9ycy5sZW5ndGggPiAwID8gXCIgXCIgKyBjc3NDbGFzc2VzLm9uRXJyb3IgOiBcIlwiKTtcbiAgICBpZiAodGhpcy5pc1JlYWRPbmx5KSB7XG4gICAgICByZXN1bHQgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLmNvbnRyb2xEaXNhYmxlZDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzUGxhY2VIb2xkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzUmVhZE9ubHkgJiYgdGhpcy5pbnB1dFR5cGUgIT09IFwicmFuZ2VcIjtcbiAgfVxufVxuXG5jb25zdCBtaW5NYXhUeXBlcyA9IFtcbiAgXCJudW1iZXJcIixcbiAgXCJyYW5nZVwiLFxuICBcImRhdGVcIixcbiAgXCJkYXRldGltZS1sb2NhbFwiLFxuICBcIm1vbnRoXCIsXG4gIFwidGltZVwiLFxuICBcIndlZWtcIixcbl07XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwidGV4dFwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJpbnB1dFR5cGVcIixcbiAgICAgIGRlZmF1bHQ6IFwidGV4dFwiLFxuICAgICAgY2hvaWNlczogW1xuICAgICAgICBcImNvbG9yXCIsXG4gICAgICAgIFwiZGF0ZVwiLFxuICAgICAgICBcImRhdGV0aW1lXCIsXG4gICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIixcbiAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICBcIm1vbnRoXCIsXG4gICAgICAgIFwibnVtYmVyXCIsXG4gICAgICAgIFwicGFzc3dvcmRcIixcbiAgICAgICAgXCJyYW5nZVwiLFxuICAgICAgICBcInRlbFwiLFxuICAgICAgICBcInRleHRcIixcbiAgICAgICAgXCJ0aW1lXCIsXG4gICAgICAgIFwidXJsXCIsXG4gICAgICAgIFwid2Vla1wiLFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwic2l6ZTpudW1iZXJcIixcbiAgICAgIG1pblZhbHVlOiAwLFxuICAgICAgZGVwZW5kc09uOiBcImlucHV0VHlwZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICBpZiAoIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gb2JqLmlzVGV4dElucHV0O1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidGV4dFVwZGF0ZU1vZGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcIm9uQmx1clwiLCBcIm9uVHlwaW5nXCJdLFxuICAgICAgZGVwZW5kc09uOiBcImlucHV0VHlwZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICBpZiAoIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gb2JqLmlzVGV4dElucHV0O1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiYXV0b0NvbXBsZXRlXCIsXG4gICAgICBkYXRhTGlzdDogW1xuICAgICAgICBcIm5hbWVcIixcbiAgICAgICAgXCJob25vcmlmaWMtcHJlZml4XCIsXG4gICAgICAgIFwiZ2l2ZW4tbmFtZVwiLFxuICAgICAgICBcImFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICBcImZhbWlseS1uYW1lXCIsXG4gICAgICAgIFwiaG9ub3JpZmljLXN1ZmZpeFwiLFxuICAgICAgICBcIm5pY2tuYW1lXCIsXG4gICAgICAgIFwib3JnYW5pemF0aW9uLXRpdGxlXCIsXG4gICAgICAgIFwidXNlcm5hbWVcIixcbiAgICAgICAgXCJuZXctcGFzc3dvcmRcIixcbiAgICAgICAgXCJjdXJyZW50LXBhc3N3b3JkXCIsXG4gICAgICAgIFwib3JnYW5pemF0aW9uXCIsXG4gICAgICAgIFwic3RyZWV0LWFkZHJlc3NcIixcbiAgICAgICAgXCJhZGRyZXNzLWxpbmUxXCIsXG4gICAgICAgIFwiYWRkcmVzcy1saW5lMlwiLFxuICAgICAgICBcImFkZHJlc3MtbGluZTNcIixcbiAgICAgICAgXCJhZGRyZXNzLWxldmVsNFwiLFxuICAgICAgICBcImFkZHJlc3MtbGV2ZWwzXCIsXG4gICAgICAgIFwiYWRkcmVzcy1sZXZlbDJcIixcbiAgICAgICAgXCJhZGRyZXNzLWxldmVsMVwiLFxuICAgICAgICBcImNvdW50cnlcIixcbiAgICAgICAgXCJjb3VudHJ5LW5hbWVcIixcbiAgICAgICAgXCJwb3N0YWwtY29kZVwiLFxuICAgICAgICBcImNjLW5hbWVcIixcbiAgICAgICAgXCJjYy1naXZlbi1uYW1lXCIsXG4gICAgICAgIFwiY2MtYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgIFwiY2MtZmFtaWx5LW5hbWVcIixcbiAgICAgICAgXCJjYy1udW1iZXJcIixcbiAgICAgICAgXCJjYy1leHBcIixcbiAgICAgICAgXCJjYy1leHAtbW9udGhcIixcbiAgICAgICAgXCJjYy1leHAteWVhclwiLFxuICAgICAgICBcImNjLWNzY1wiLFxuICAgICAgICBcImNjLXR5cGVcIixcbiAgICAgICAgXCJ0cmFuc2FjdGlvbi1jdXJyZW5jeVwiLFxuICAgICAgICBcInRyYW5zYWN0aW9uLWFtb3VudFwiLFxuICAgICAgICBcImxhbmd1YWdlXCIsXG4gICAgICAgIFwiYmRheVwiLFxuICAgICAgICBcImJkYXktZGF5XCIsXG4gICAgICAgIFwiYmRheS1tb250aFwiLFxuICAgICAgICBcImJkYXkteWVhclwiLFxuICAgICAgICBcInNleFwiLFxuICAgICAgICBcInVybFwiLFxuICAgICAgICBcInBob3RvXCIsXG4gICAgICAgIFwidGVsXCIsXG4gICAgICAgIFwidGVsLWNvdW50cnktY29kZVwiLFxuICAgICAgICBcInRlbC1uYXRpb25hbFwiLFxuICAgICAgICBcInRlbC1hcmVhLWNvZGVcIixcbiAgICAgICAgXCJ0ZWwtbG9jYWxcIixcbiAgICAgICAgXCJ0ZWwtbG9jYWwtcHJlZml4XCIsXG4gICAgICAgIFwidGVsLWxvY2FsLXN1ZmZpeFwiLFxuICAgICAgICBcInRlbC1leHRlbnNpb25cIixcbiAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICBcImltcHBcIixcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1pblwiLFxuICAgICAgZGVwZW5kc09uOiBcImlucHV0VHlwZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gISFvYmogJiYgb2JqLmlzTWluTWF4VHlwZTtcbiAgICAgIH0sXG4gICAgICBvblByb3BlcnR5RWRpdG9yVXBkYXRlOiBmdW5jdGlvbihvYmo6IGFueSwgcHJvcGVydHlFZGl0b3I6IGFueSkge1xuICAgICAgICBwcm9wZXJ0eUVkaXRvci5pbnB1dFR5cGUgPSBvYmouaW5wdXRUeXBlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4XCIsXG4gICAgICBkZXBlbmRzT246IFwiaW5wdXRUeXBlXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiAhIW9iaiAmJiBvYmouaXNNaW5NYXhUeXBlO1xuICAgICAgfSxcbiAgICAgIG9uUHJvcGVydHlFZGl0b3JVcGRhdGU6IGZ1bmN0aW9uKG9iajogYW55LCBwcm9wZXJ0eUVkaXRvcjogYW55KSB7XG4gICAgICAgIHByb3BlcnR5RWRpdG9yLmlucHV0VHlwZSA9IG9iai5pbnB1dFR5cGU7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtaW5WYWx1ZUV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgICAgY2F0ZWdvcnk6IFwibG9naWNcIixcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhb2JqICYmIG9iai5pc01pbk1heFR5cGU7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXhWYWx1ZUV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgICAgY2F0ZWdvcnk6IFwibG9naWNcIixcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhb2JqICYmIG9iai5pc01pbk1heFR5cGU7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtaW5FcnJvclRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NNaW5FcnJvclRleHRcIixcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhb2JqICYmIG9iai5pc01pbk1heFR5cGU7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXhFcnJvclRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NNYXhFcnJvclRleHRcIixcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhb2JqICYmIG9iai5pc01pbk1heFR5cGU7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJzdGVwOm51bWJlclwiLFxuICAgICAgZGVwZW5kc09uOiBcImlucHV0VHlwZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICBpZiAoIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gb2JqLmlucHV0VHlwZSA9PT0gXCJudW1iZXJcIjtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1heExlbmd0aDpudW1iZXJcIixcbiAgICAgIGRlZmF1bHQ6IC0xLFxuICAgICAgZGVwZW5kc09uOiBcImlucHV0VHlwZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICBpZiAoIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gb2JqLmlzVGV4dElucHV0O1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGxhY2VIb2xkZXJcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQbGFjZUhvbGRlclwiLFxuICAgICAgZGVwZW5kc09uOiBcImlucHV0VHlwZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICBpZiAoIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gb2JqLmlzVGV4dElucHV0O1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZGF0YUxpc3Q6c3RyaW5nW11cIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NEYXRhTGlzdFwiLFxuICAgICAgZGVwZW5kc09uOiBcImlucHV0VHlwZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICBpZiAoIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gb2JqLmlucHV0VHlwZSA9PT0gXCJ0ZXh0XCI7XG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwidGV4dGJhc2VcIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJ0ZXh0XCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0TW9kZWwobmFtZSk7XG59KTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbi8qKlxuICogQSBCYXNlIE1vZGVsIGZvciBhIGNvbW1lbnQgYW5kIHRleHQgcXVlc3Rpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblRleHRCYXNlIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGxhY2VIb2xkZXJcIiwgdGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVGV4dFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0ZXh0IGxlbmd0aC4gSWYgaXQgaXMgLTEsIGRlZmF1bCB2YWx1ZSwgdGhlbiB0aGUgc3VydmV5IG1heFRleHRMZW5ndGggcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICAgKiBJZiBpdCBpcyAwLCB0aGVuIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWRcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tYXhUZXh0TGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhMZW5ndGhcIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXhMZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhMZW5ndGhcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0TWF4TGVuZ3RoKCk6IGFueSB7XG4gICAgcmV0dXJuIEhlbHBlcnMuZ2V0TWF4TGVuZ3RoKFxuICAgICAgdGhpcy5tYXhMZW5ndGgsXG4gICAgICB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5Lm1heFRleHRMZW5ndGggOiAtMVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgaW5wdXQgcGxhY2UgaG9sZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBwbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBsYWNlSG9sZGVyXCIsIHZhbCk7XG4gICAgdGhpcy5jYWxjUmVuZGVyZWRQbGFjZUhvbGRlcigpO1xuICB9XG4gIGdldCBsb2NQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInRleHRiYXNlXCI7XG4gIH1cbiAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIuaXNFbXB0eSgpIHx8IHRoaXMudmFsdWUgPT09IFwiXCI7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIHRoYXQgc3BlY2lmaWVzIGhvdyB0aGUgcXVlc3Rpb24gdXBkYXRlcyBpdCdzIHZhbHVlLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICogLSBgZGVmYXVsdGAgLSBnZXQgdGhlIHZhbHVlIGZyb20gc3VydmV5LnRleHRVcGRhdGVNb2RlXG4gICAqIC0gYG9uQmx1cmAgLSB0aGUgdmFsdWUgaXMgdXBkYXRlZCBhZnRlciBhbiBpbnB1dCBsb3NlcyB0aGUgZm9jdXMuXG4gICAqIC0gYG9uVHlwaW5nYCAtIHVwZGF0ZSB0aGUgdmFsdWUgb2YgdGV4dCBxdWVzdGlvbnMsIFwidGV4dFwiIGFuZCBcImNvbW1lbnRcIiwgb24gZXZlcnkga2V5IHByZXNzLlxuICAgKlxuICAgKiBOb3RlLCB0aGF0IHNldHRpbmcgdG8gXCJvblR5cGluZ1wiIG1heSBsZWFkIHRvIGEgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24sIGluIGNhc2UgeW91IGhhdmUgbWFueSBleHByZXNzaW9ucyBpbiB0aGUgc3VydmV5LlxuICAgKiBAc2VlIHN1cnZleS50ZXh0VXBkYXRlTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCB0ZXh0VXBkYXRlTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0ZXh0VXBkYXRlTW9kZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRleHRVcGRhdGVNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGV4dFVwZGF0ZU1vZGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU3VydmV5SW5wdXRUZXh0VXBkYXRlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnRleHRVcGRhdGVNb2RlID09IFwiZGVmYXVsdFwiKVxuICAgICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5pc1VwZGF0ZVZhbHVlVGV4dE9uVHlwaW5nIDogZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMudGV4dFVwZGF0ZU1vZGUgPT0gXCJvblR5cGluZ1wiO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRQbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZFBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIHByb3RlY3RlZCBzZXRSZW5kZXJlZFBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRQbGFjZUhvbGRlclwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBvblJlYWRPbmx5Q2hhbmdlZCgpIHtcbiAgICBzdXBlci5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICAgIHRoaXMuY2FsY1JlbmRlcmVkUGxhY2VIb2xkZXIoKTtcbiAgfVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdGhpcy5jYWxjUmVuZGVyZWRQbGFjZUhvbGRlcigpO1xuICB9XG4gIHByb3RlY3RlZCBjYWxjUmVuZGVyZWRQbGFjZUhvbGRlcigpIHtcbiAgICB0aGlzLnNldFJlbmRlcmVkUGxhY2VIb2xkZXIoXG4gICAgICB0aGlzLmhhc1BsYWNlSG9sZGVyKCkgPyB0aGlzLnBsYWNlSG9sZGVyIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzUGxhY2VIb2xkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzUmVhZE9ubHk7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwidGV4dGJhc2VcIixcbiAgW10sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0QmFzZShcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSUVsZW1lbnQgfSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5cbi8vVE9ETyByZXBsYWNlIGNvbXBsZXRlbHkgd2l0aCBFbGVtZW50RmFjdG9yeVxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IFF1ZXN0aW9uRmFjdG9yeSA9IG5ldyBRdWVzdGlvbkZhY3RvcnkoKTtcbiAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdENob2ljZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hvaWNlc19JdGVtXCIpICsgXCIxXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hvaWNlc19JdGVtXCIpICsgXCIyXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hvaWNlc19JdGVtXCIpICsgXCIzXCIsXG4gICAgXTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldCBEZWZhdWx0Q29sdW1zKCk6IHN0cmluZ1tdIHtcbiAgICB2YXIgY29sTmFtZSA9IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYXRyaXhfY29sdW1uXCIpICsgXCIgXCI7XG4gICAgcmV0dXJuIFtjb2xOYW1lICsgXCIxXCIsIGNvbE5hbWUgKyBcIjJcIiwgY29sTmFtZSArIFwiM1wiXTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldCBEZWZhdWx0Um93cygpOiBzdHJpbmdbXSB7XG4gICAgdmFyIHJvd05hbWUgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWF0cml4X3Jvd1wiKSArIFwiIFwiO1xuICAgIHJldHVybiBbcm93TmFtZSArIFwiMVwiLCByb3dOYW1lICsgXCIyXCJdO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IERlZmF1bHRNdXRsaXBsZVRleHRJdGVtcygpOiBzdHJpbmdbXSB7XG4gICAgdmFyIGl0ZW1OYW1lID0gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm11bHRpcGxldGV4dF9pdGVtbmFtZVwiKTtcbiAgICByZXR1cm4gW2l0ZW1OYW1lICsgXCIxXCIsIGl0ZW1OYW1lICsgXCIyXCJdO1xuICB9XG4gIHByaXZhdGUgY3JlYXRvckhhc2g6IEhhc2hUYWJsZTwobmFtZTogc3RyaW5nKSA9PiBRdWVzdGlvbj4gPSB7fTtcblxuICBwdWJsaWMgcmVnaXN0ZXJRdWVzdGlvbihcbiAgICBxdWVzdGlvblR5cGU6IHN0cmluZyxcbiAgICBxdWVzdGlvbkNyZWF0b3I6IChuYW1lOiBzdHJpbmcpID0+IFF1ZXN0aW9uXG4gICkge1xuICAgIHRoaXMuY3JlYXRvckhhc2hbcXVlc3Rpb25UeXBlXSA9IHF1ZXN0aW9uQ3JlYXRvcjtcbiAgfVxuICBwdWJsaWMgdW5yZWdpc3RlckVsZW1lbnQoZWxlbWVudFR5cGU6IHN0cmluZykge1xuICAgIGRlbGV0ZSB0aGlzLmNyZWF0b3JIYXNoW2VsZW1lbnRUeXBlXTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5jcmVhdG9ySGFzaCA9IHt9O1xuICB9XG4gIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jcmVhdG9ySGFzaCkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gIH1cbiAgcHVibGljIGNyZWF0ZVF1ZXN0aW9uKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgdmFyIGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JIYXNoW3F1ZXN0aW9uVHlwZV07XG4gICAgaWYgKGNyZWF0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGNyZWF0b3IobmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRGYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogRWxlbWVudEZhY3RvcnkgPSBuZXcgRWxlbWVudEZhY3RvcnkoKTtcbiAgcHJpdmF0ZSBjcmVhdG9ySGFzaDogSGFzaFRhYmxlPChuYW1lOiBzdHJpbmcpID0+IElFbGVtZW50PiA9IHt9O1xuXG4gIHB1YmxpYyByZWdpc3RlckVsZW1lbnQoXG4gICAgZWxlbWVudFR5cGU6IHN0cmluZyxcbiAgICBlbGVtZW50Q3JlYXRvcjogKG5hbWU6IHN0cmluZykgPT4gSUVsZW1lbnRcbiAgKSB7XG4gICAgdGhpcy5jcmVhdG9ySGFzaFtlbGVtZW50VHlwZV0gPSBlbGVtZW50Q3JlYXRvcjtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5jcmVhdG9ySGFzaCA9IHt9O1xuICB9XG4gIHB1YmxpYyB1bnJlZ2lzdGVyRWxlbWVudChcbiAgICBlbGVtZW50VHlwZTogc3RyaW5nLFxuICAgIHJlbW92ZUZyb21TZXJpYWxpemVyOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgZGVsZXRlIHRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdO1xuICAgIFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS51bnJlZ2lzdGVyRWxlbWVudChlbGVtZW50VHlwZSk7XG4gICAgaWYgKHJlbW92ZUZyb21TZXJpYWxpemVyKSB7XG4gICAgICBTZXJpYWxpemVyLnJlbW92ZUNsYXNzKGVsZW1lbnRUeXBlKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldEFsbFR5cGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXN1bHQgPSBRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UuZ2V0QWxsVHlwZXMoKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jcmVhdG9ySGFzaCkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gIH1cbiAgcHVibGljIGNyZWF0ZUVsZW1lbnQoZWxlbWVudFR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogSUVsZW1lbnQge1xuICAgIHZhciBjcmVhdG9yID0gdGhpcy5jcmVhdG9ySGFzaFtlbGVtZW50VHlwZV07XG4gICAgaWYgKGNyZWF0b3IgPT0gbnVsbClcbiAgICAgIHJldHVybiBRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UuY3JlYXRlUXVlc3Rpb24oZWxlbWVudFR5cGUsIG5hbWUpO1xuICAgIHJldHVybiBjcmVhdG9yKG5hbWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBRdWVzdGlvbiwgSUNvbmRpdGlvbk9iamVjdCB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9zdXJ2ZXktZXJyb3JcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBub24gdmFsdWUgcXVlc3Rpb24uIFRoaXMgcXVlc3Rpb24gZG9lc24ndCBhZGQgYW55IG5ldyBmdW5jdGlvbmFsaXR5LiBJdCBoaWRlcyBzb21lIHByb3BlcnRpZXMsIGluY2x1ZGluZyB0aGUgdmFsdWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk5vblZhbHVlIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm5vbnZhbHVlXCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldFRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7fVxuICBwdWJsaWMgZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvcjogc3RyaW5nID0gbnVsbCwgcGF0aDogc3RyaW5nID0gbnVsbCk6IGFueSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibm9udmFsdWVcIixcbiAgW1xuICAgIHsgbmFtZTogXCJ0aXRsZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJ2YWx1ZU5hbWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiZW5hYmxlSWZcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiZGVmYXVsdFZhbHVlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImNvcnJlY3RBbnN3ZXJcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiaXNSZXF1aXJlZFwiLCB2aXNpYmxlOiBmYWxzZSwgaXNTZXJpYWxpemFibGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlYWRPbmx5XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlcXVpcmVkSWZcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidmFsaWRhdG9yc1wiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJ0aXRsZUxvY2F0aW9uXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInVzZURpc3BsYXlWYWx1ZXNJblRpdGxlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTm9uVmFsdWUoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcbiIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIFJlbmRlcmVyRmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IFJlbmRlcmVyRmFjdG9yeSA9IG5ldyBSZW5kZXJlckZhY3RvcnkoKTtcblxuICBwcml2YXRlIHJlbmRlcmVyc0hhc2g6IHtcbiAgICBbcXVlc3Rpb25UeXBlOiBzdHJpbmddOiB7IFtyZW5kZXJBczogc3RyaW5nXTogYW55IH07XG4gIH0gPSB7fTtcblxuICBwdWJsaWMgdW5yZWdpc3RlclJlbmRlcmVyKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCByZW5kZXJlckFzOiBzdHJpbmcpIHtcbiAgICBkZWxldGUgdGhpcy5yZW5kZXJlcnNIYXNoW3F1ZXN0aW9uVHlwZV1bcmVuZGVyZXJBc107XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJSZW5kZXJlcihcbiAgICBxdWVzdGlvblR5cGU6IHN0cmluZyxcbiAgICByZW5kZXJBczogc3RyaW5nLFxuICAgIHJlbmRlcmVyOiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyc0hhc2hbcXVlc3Rpb25UeXBlXSkge1xuICAgICAgdGhpcy5yZW5kZXJlcnNIYXNoW3F1ZXN0aW9uVHlwZV0gPSB7fTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJlcnNIYXNoW3F1ZXN0aW9uVHlwZV1bcmVuZGVyQXNdID0gcmVuZGVyZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVuZGVyZXIocXVlc3Rpb25UeXBlOiBzdHJpbmcsIHJlbmRlckFzOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMucmVuZGVyZXJzSGFzaFtxdWVzdGlvblR5cGVdICYmXG4gICAgICAgIHRoaXMucmVuZGVyZXJzSGFzaFtxdWVzdGlvblR5cGVdW3JlbmRlckFzXSkgfHxcbiAgICAgIFwiZGVmYXVsdFwiXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZW5kZXJlckJ5UXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZW5kZXJlcihxdWVzdGlvbi5nZXRUeXBlKCksIHF1ZXN0aW9uLnJlbmRlckFzKTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5yZW5kZXJlcnNIYXNoID0ge307XG4gIH1cbn1cbiIsIi8qKlxuICogR2xvYmFsIHN1cnZleSBzZXR0aW5nc1xuICovXG5leHBvcnQgdmFyIHNldHRpbmdzID0ge1xuICAvKipcbiAgICogVGhlIHByZWZpeCB0aGF0IHVzZXMgdG8gc3RvcmUgdGhlIHF1ZXN0aW9uIGNvbW1lbnQsIGFzIHtxdWVzdGlvbk5hbWV9ICsge2NvbW1lbnRQcmVmaXh9LlxuICAgKiBUaGUgZGVmYXVsdFxuICAgKi9cbiAgY29tbWVudFByZWZpeDogXCItQ29tbWVudFwiLFxuICAvKipcbiAgICogRW5jb2RlIHBhcmFtZXRlciBvbiBjYWxsaW5nIHJlc3RmdWwgd2ViIEFQSVxuICAgKi9cbiAgd2Vic2VydmljZUVuY29kZVBhcmFtZXRlcnM6IHRydWUsXG4gIC8qKlxuICAgKiBDYWNoZSB0aGUgcmVzdWx0IGZvciBjaG9pY2VzIGdldHRpbmcgZnJvbSB3ZWIgc2VydmljZXMuIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlLCB0byBkaXNhYmxlIHRoZSBjYWNoaW5nLlxuICAgKi9cbiAgdXNlQ2FjaGluZ0ZvckNob2ljZXNSZXN0ZnVsOiB0cnVlLFxuICBnZXQgdXNlQ2FjaGluZ0ZvckNob2ljZXNSZXN0ZnVsbCgpIHtcbiAgICByZXR1cm4gc2V0dGluZ3MudXNlQ2FjaGluZ0ZvckNob2ljZXNSZXN0ZnVsO1xuICB9LFxuICBzZXQgdXNlQ2FjaGluZ0ZvckNob2ljZXNSZXN0ZnVsbCh2YWw6IGJvb2xlYW4pIHtcbiAgICBzZXR0aW5ncy51c2VDYWNoaW5nRm9yQ2hvaWNlc1Jlc3RmdWwgPSB2YWw7XG4gIH0sXG4gIC8qKlxuICAgKiBTdXJ2ZXlKUyB3ZWIgc2VydmljZSBBUEkgdXJsXG4gICAqL1xuICBzdXJ2ZXlTZXJ2aWNlVXJsOiBcImh0dHBzOi8vYXBpLnN1cnZleWpzLmlvL3B1YmxpYy92MS9TdXJ2ZXlcIixcbiAgLyoqXG4gICAqIHNlcGFyYXRvciB0aGF0IGNhbiBhbGxvdyB0byBzZXQgdmFsdWUgYW5kIHRleHQgb2YgSXRlbVZhbHVlIG9iamVjdCBpbiBvbmUgc3RyaW5nIGFzOiBcInZhbHVlfHRleHRcIlxuICAgKi9cbiAgaXRlbVZhbHVlU2VwYXJhdG9yOiBcInxcIixcbiAgLyoqXG4gICAqIGRlZmF1bHQgbG9jYWxlIG5hbWUgZm9yIGxvY2FsaXphYmxlIHN0cmluZ3MgdGhhdCB1c2VzIGR1cmluZyBzZXJpYWxpemF0aW9uLCB7XCJkZWZhdWx0XCI6IFwiTXkgdGV4dFwiLCBcImRlXCI6IFwiTWVpbiBUZXh0XCJ9XG4gICAqL1xuICBkZWZhdWx0TG9jYWxlTmFtZTogXCJkZWZhdWx0XCIsXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJvdyBuYW1lIGZvciBtYXRyaXggKHNpbmdsZSBjaG9pY2UpXG4gICAqL1xuICBtYXRyaXhEZWZhdWx0Um93TmFtZTogXCJkZWZhdWx0XCIsXG4gIC8qKlxuICAgKiBEZWZhdWx0IGNlbGwgdHlwZSBmb3IgZHJvcGRvd24gYW5kIGR5bmFtaWMgbWF0cmljZXNcbiAgICovXG4gIG1hdHJpeERlZmF1bHRDZWxsVHlwZTogXCJkcm9wZG93blwiLFxuICAvKipcbiAgICogVG90YWwgdmFsdWUgcG9zdGZpeCBmb3IgZHJvcGRvd24gYW5kIGR5bmFtaWMgbWF0cmljZXMuIFRoZSB0b3RhbCB2YWx1ZSBzdG9yZXMgYXM6IHttYXRyaXhOYW1lfSArIHtwb3N0Zml4fVxuICAgKi9cbiAgbWF0cml4VG90YWxWYWx1ZVBvc3RGaXg6IFwiLXRvdGFsXCIsXG4gIC8qKlxuICAgKiBNYXhpbXVtIHJvdyBjb3VudCBpbiBkeW5hbWljIG1hdHJpeFxuICAgKi9cbiAgbWF0cml4TWF4aW11bVJvd0NvdW50OiAxMDAwLFxuICAvKipcbiAgICogTWF4aW11bSByb3dDb3VudCB0aGF0IHJldHVybnMgaW4gYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dCBmdW5jdGlvblxuICAgKi9cbiAgbWF0cml4TWF4Um93Q291bnRJbkNvbmRpdGlvbjogMSxcbiAgLyoqXG4gICAqIE1heGltdW0gcGFuZWwgY291bnQgaW4gZHluYW1pYyBwYW5lbFxuICAgKi9cbiAgcGFuZWxNYXhpbXVtUGFuZWxDb3VudDogMTAwLFxuICAvKipcbiAgICogTWF4aW11bSByYXRlIHZhbHVlIGNvdW50IGluIHJhdGluZyBxdWVzdGlvblxuICAgKi9cbiAgcmF0aW5nTWF4aW11bVJhdGVWYWx1ZUNvdW50OiAyMCxcbiAgLyoqXG4gICAqIERpc2FibGUgdGhlIHF1ZXN0aW9uIHdoaWxlIGNob2ljZXMgYXJlIGdldHRpbmcgZnJvbSB0aGUgd2ViIHNlcnZpY2VcbiAgICovXG4gIGRpc2FibGVPbkdldHRpbmdDaG9pY2VzRnJvbVdlYjogZmFsc2UsXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB0byBhbHdheXMgc2VyaWFsaXplIHRoZSBsb2NhbGl6YXRpb24gc3RyaW5nIGFzIG9iamVjdCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlIGZvciBkZWZhdWx0IGxvY2FsZS4gSW5zdGVhZCBvZiBzdHJpbmcgXCJNeVN0clwiIHNlcmlhbGl6ZSBhcyB7ZGVmYXVsdDogXCJNeVN0clwifVxuICAgKi9cbiAgc2VyaWFsaXplTG9jYWxpemFibGVTdHJpbmdBc09iamVjdDogZmFsc2UsXG4gIC8qKlxuICAgKiBTZXQgdG8gZmFsc2UgdG8gaGlkZSBlbXB0eSBwYWdlIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBpbiBkZXNpZ24gbW9kZVxuICAgKi9cbiAgYWxsb3dTaG93RW1wdHlUaXRsZUluRGVzaWduTW9kZTogdHJ1ZSxcbiAgLyoqXG4gICAqIFNldCB0byBmYWxzZSB0byBoaWRlIGVtcHR5IHBhZ2UgZGVzY3JpcHRpb24gaW4gZGVzaWduIG1vZGVcbiAgICovXG4gIGFsbG93U2hvd0VtcHR5RGVzY3JpcHRpb25JbkRlc2lnbk1vZGU6IHRydWUsXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIGV4ZWN1dGUgdGhlIGNvbXBsZXRlIHRyaWdnZXIgb24gdmFsdWUgY2hhbmdlIGluc3RlYWQgb2Ygb24gbmV4dCBwYWdlLlxuICAgKi9cbiAgZXhlY3V0ZUNvbXBsZXRlVHJpZ2dlck9uVmFsdWVDaGFuZ2VkOiBmYWxzZSxcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGV4ZWN1dGUgdGhlIHNraXAgdHJpZ2dlciBvbiBuZXh0IHBhZ2UgaW5zdGVhZCBvZiBvbiB2YWx1ZSBjaGFuZ2UuXG4gICAqL1xuICBleGVjdXRlU2tpcFRyaWdnZXJPblZhbHVlQ2hhbmdlZDogdHJ1ZSxcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSByZWFkT25seUNvbW1lbnRSZW5kZXJNb2RlOiBcInRleHRhcmVhXCIgKGRlZmF1bHQpIG9yIChkaXYpXG4gICAqL1xuICByZWFkT25seUNvbW1lbnRSZW5kZXJNb2RlOiBcInRleHRhcmVhXCIsXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uLCBzZXQgeW91ciBmdW5jdGlvbiwgaWYgeW91IHdhbnQgdG8gc2hvdyB5b3VyIG93biBkaWFsb2cgY29uZmlybSB3aW5kb3cgaW5zdGVhZCBvZiBzdGFuZGFyZCBicm93c2VyIHdpbmRvdy5cbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIGNvbmZpcm1BY3Rpb25GdW5jOiBmdW5jdGlvbihtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29uZmlybShtZXNzYWdlKTtcbiAgfSxcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbWluV2lkdGggY29uc3RyYWludFxuICAgKi9cbiAgbWluV2lkdGg6IFwiMzAwcHhcIixcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbWluV2lkdGggY29uc3RyYWludFxuICAgKi9cbiAgbWF4V2lkdGg6IFwiaW5pdGlhbFwiLFxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSB0ZWxscyBob3cgbWFueSB0aW1lcyBzdXJ2ZXkgcmUtcnVuIGV4cHJlc3Npb25zIG9uIHZhbHVlIGNoYW5nZXMgZHVyaW5nIGNvbmRpdGlvbiBydW5uaW5nLiBXZSBuZWVkIGl0IHRvIGF2b2lkIHJlY3Vyc2lvbnMgaW4gdGhlIGV4cHJlc3Npb25zXG4gICAqL1xuICBtYXhpbXVtQ29uZGl0aW9uUnVuQ291bnRPblZhbHVlQ2hhbmdlZDogMTAsXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHZpc2libGVJbmRleCBmb3IgcXVlc3Rpb24gd2l0aCB0aXRsZUxvY2F0aW9uID0gXCJoaWRkZW5cIiBpcyAtMSwgYW5kIHN1cnZleSBkb2Vzbid0IGNvdW50IHRoZXNlIHF1ZXN0aW9ucyB3aGVuIHNldCBxdWVzdGlvbnMgbnVtYmVycy5cbiAgICogU2V0IGl0IHRydWUsIGFuZCBhIHF1ZXN0aW9uIG5leHQgdG8gYSBxdWVzdGlvbiB3aXRoIGhpZGRlbiB0aXRsZSB3aWxsIGluY3JlYXNlIGl0J3MgbnVtYmVyLlxuICAgKi9cbiAgc2V0UXVlc3Rpb25WaXNpYmxlSW5kZXhGb3JIaWRkZW5UaXRsZTogZmFsc2UsXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHZpc2libGVJbmRleCBmb3IgcXVlc3Rpb24gd2l0aCBoaWRlTnVtYmVyID0gdHJ1ZSBpcyAtMSwgYW5kIHN1cnZleSBkb2Vzbid0IGNvdW50IHRoZXNlIHF1ZXN0aW9ucyB3aGVuIHNldCBxdWVzdGlvbnMgbnVtYmVycy5cbiAgICogU2V0IGl0IHRydWUsIGFuZCBhIHF1ZXN0aW9uIG5leHQgdG8gYSBxdWVzdGlvbiB3aXRoIGhpZGRlbiB0aXRsZSBudW1iZXIgd2lsbCBpbmNyZWFzZSBpdCdzIG51bWJlci5cbiAgICovXG4gIHNldFF1ZXN0aW9uVmlzaWJsZUluZGV4Rm9ySGlkZGVuTnVtYmVyOiBmYWxzZSxcbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgYWxsIHJvd3MgYXJlIHJlbmRlcmVkIG5vIG1hdHRlcnMgd2h3dGhlciB0aGV5IGFyZSB2aXNpYmxlLlxuICAgKiBTZXQgaXQgdHJ1ZSwgYW5kIHN1cnZleSBtYXJrdXAgcm93cyB3aWxsIGJlIHJlbmRlcmVkIG9ubHkgaWYgdGhleSBhcmUgdmlzaWJsZSBpbiB2aWV3cG9ydC5cbiAgICogVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1hbnRhbCBhbmQgbWlnaHQgZG8gbm90IHN1cHBvcnQgYWxsIHRoZSB1c2UgY2FzZXMuXG4gICAqL1xuICBsYXp5Um93c1JlbmRlcmluZzogZmFsc2UsXG4gIGxhenlSb3dzUmVuZGVyaW5nU3RhcnRSb3c6IDMsXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IGNoZWNrYm94IGFuZCByYWRpb2dyb3VwIGl0ZW1zIGFyZSBvcmRlcmVkIGluIHJvd3MuXG4gICAqIFNldCBpdCBcImNvbHVtblwiLCBhbmQgaXRlbXMgd2lsbCBiZSBvcmRlcmVkIGluIGNvbHVtbnMuXG4gICAqL1xuICBzaG93SXRlbXNJbk9yZGVyOiBcImRlZmF1bHRcIixcbiAgLyoqXG4gICAqIFN1cHBvcnRlZCB2YWxpZGF0b3JzIGJ5IHF1ZXN0aW9uIHR5cGVzLiBZb3UgY2FuIG1vZGlmeSB0aGlzIHZhcmlhYmxlIHRvIGFkZCB2YWxpZGF0b3JzIGZvciBuZXcgcXVlc3Rpb24gdHlwZXMgb3IgYWRkL3JlbW92ZSBmb3IgZXhpc3RpbmcgcXVlc3Rpb24gdHlwZXMuXG4gICAqL1xuICBzdXBwb3J0ZWRWYWxpZGF0b3JzOiB7XG4gICAgcXVlc3Rpb246IFtcImV4cHJlc3Npb25cIl0sXG4gICAgY29tbWVudDogW1widGV4dFwiLCBcInJlZ2V4XCJdLFxuICAgIHRleHQ6IFtcIm51bWVyaWNcIiwgXCJ0ZXh0XCIsIFwicmVnZXhcIiwgXCJlbWFpbFwiXSxcbiAgICBjaGVja2JveDogW1wiYW5zd2VyY291bnRcIl0sXG4gIH0sXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZhbHVlIGFzIHN0cmluZyBcInl5eXktbW0tZGRcIi4gdGV4dCBxdWVzdGlvbnMgd2l0aCBpbnB1dFR5cGUgXCJkYXRlXCIgd2lsbCBub3QgYWxsb3cgdG8gc2V0IHRvIHN1cnZleSBkYXRlIHRoYXQgbGVzcyB0aGFuIHRoaXMgdmFsdWVcbiAgICovXG4gIG1pbkRhdGU6IFwiXCIsXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZhbHVlIGFzIHN0cmluZyBcInl5eXktbW0tZGRcIi4gdGV4dCBxdWVzdGlvbnMgd2l0aCBpbnB1dFR5cGUgXCJkYXRlXCIgd2lsbCBub3QgYWxsb3cgdG8gc2V0IHRvIHN1cnZleSBkYXRlIHRoYXQgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWVcbiAgICovXG4gIG1heERhdGU6IFwiXCIsXG4gIHNob3dNb2RhbDogPFxuICAgIChcbiAgICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZyxcbiAgICAgIGRhdGE6IGFueSxcbiAgICAgIG9uQXBwbHk6ICgpID0+IGJvb2xlYW4sXG4gICAgICBvbkNhbmNlbD86ICgpID0+IHZvaWRcbiAgICApID0+IHZvaWRcbiAgPnVuZGVmaW5lZCxcbiAgc3VwcG9ydENyZWF0b3JWMjogZmFsc2UsXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSBsaXN0IG9mIGN1c3RvbSBpY29ucy5cbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmVwbGFjZSBTdXJ2ZXlKUyBkZWZhdWx0IGljb25zIChkaXNwbGF5ZWQgaW4gVUkgZWxlbWVudHMgb2YgU3VydmV5SlMgTGlicmFyeSBvciBDcmVhdG9yKSB3aXRoIHlvdXIgY3VzdG9tIGljb25zLlxuICAgKiBGb3IgZXZlcnkgZGVmYXVsdCBpY29uIHRvIHJlcGxhY2UsIGFkZCBhIGtleS92YWx1ZSBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdCBpY29uJ3MgbmFtZSBhcyBhIGtleSBhbmQgdGhlIG5hbWUgb2YgeW91ciBjdXN0b20gaWNvbiBhcyBhIHZhbHVlLlxuICAgKiBGb3IgZXhhbXBsZTogU3VydmV5LnNldHRpbmdzLmN1c3RvbUljb25zW1wiaWNvbi1yZWRvXCJdID0gXCJteS1vd24tcmVkby1pY29uXCJcbiAgICovXG4gIGN1c3RvbUljb25zOiB7fSxcbn07XG4iLCJpbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG5leHBvcnQgY2xhc3MgU3R5bGVzTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIFN1cnZleUpTU3R5bGVzU2hlZXRJZCA9IFwic3VydmV5anMtc3R5bGVzXCI7XG5cbiAgcHVibGljIHN0YXRpYyBTdHlsZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgLy8gXCIuc3ZfYm9vdHN0cmFwX2Nzc1wiOlxuICAgIC8vICAgXCJwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjRmNGY0XCIsXG4gICAgLy8gXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfY3VzdG9tX2hlYWRlclwiOlxuICAgIC8vICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDI3NXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlN2U3O1wiLFxuICAgIC8vIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X2NvbnRhaW5lclwiOlxuICAgIC8vICAgXCJtYXgtd2lkdGg6IDgwJTsgbWFyZ2luOiBhdXRvOyBwb3NpdGlvbjogcmVsYXRpdmU7IGNvbG9yOiAjNmQ3MDcyOyBwYWRkaW5nOiAwIDFlbTtcIixcbiAgICAvLyBcIi5zdl9ib290c3RyYXBfY3NzIC5wYW5lbC1ib2R5XCI6XG4gICAgLy8gICBcImJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBwYWRkaW5nOiAxZW0gMWVtIDVlbSAxZW07IGJvcmRlci10b3A6IDJweCBzb2xpZCBsaWdodGdyYXk7XCIsXG4gICAgXCIuc3ZfbWFpbiBzcGFuXCI6IFwid29yZC1icmVhazogYnJlYWstd29yZDtcIixcblxuICAgIFwiLnN2X21haW4gbGVnZW5kXCI6IFwiYm9yZGVyOiBub25lOyBtYXJnaW46IDA7XCIsXG5cbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xc3RuXCI6IFwicGFkZGluZzogMC41ZW0gMWVtIDEuNWVtIDFlbTtcIixcbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xY2JjIGlucHV0W3R5cGU9Y2hlY2tib3hdLCAuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcWNiYyBpbnB1dFt0eXBlPXJhZGlvXVwiOlxuICAgICAgXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBtYXJnaW4tdG9wOiAtMXB4XCIsXG4gICAgXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcXN0biBmaWVsZHNldFwiOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuICAgIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FzdG4gIC5zdl9xX2NoZWNrYm94X2lubGluZSwgLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FzdG4gLnN2X3FfcmFkaW9ncm91cF9pbmxpbmVcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuXG4gICAgXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy1jb250YWluZXIgXCI6XG4gICAgICBcInBvc2l0aW9uOiByZWxhdGl2ZTsgbWFyZ2luLXJpZ2h0OiAyNTBweDsgbWFyZ2luLWxlZnQ6IDQwcHg7IG1hcmdpbi10b3A6IDEwcHg7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfbGFiZWxcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lOyBwb3NpdGlvbjogc3RhdGljO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5jaGVja2JveFwiOlxuICAgICAgXCJtYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4O1wiLFxuXG4gICAgXCIuc3Zfcm93XCI6IFwiY2xlYXI6IGJvdGg7IG1pbi13aWR0aDozMDBweDtcIixcbiAgICBcIi5zdl9yb3cgLnN2X3FzdG5cIjogXCJmbG9hdDogbGVmdFwiLFxuICAgIFwiLnN2X3JvdyAuc3ZfcXN0bjpsYXN0LWNoaWxkXCI6IFwiZmxvYXQ6IG5vbmVcIixcbiAgICBcIi5zdl9xc3RuXCI6XG4gICAgICBcImRpc3BsYXk6IHZlcnRpY2FsLWFsaWduOiB0b3A7IG92ZXJmbG93OiBhdXRvOyBtaW4td2lkdGg6MzAwcHg7XCIsXG4gICAgXCIuc3ZfcF9jb250YWluZXJcIjogXCJkaXNwbGF5OiB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBtaW4td2lkdGg6MzAwcHg7XCIsXG5cbiAgICBcIi5zdl9xX3RpdGxlIC5zdl9xdWVzdGlvbl9pY29uXCI6IFwiZmxvYXQ6IHJpZ2h0OyBtYXJnaW4tcmlnaHQ6IDFlbTtcIixcbiAgICBcIi5zdl9xX3RpdGxlIC5zdl9xdWVzdGlvbl9pY29uOjpiZWZvcmVcIjpcbiAgICAgIFwiY29udGVudDogJyc7IGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7IGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsgcGFkZGluZzogMC41ZW07IGRpc3BsYXk6IGlubGluZS1ibG9jazsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqd2hMUzBnUjJWdVpYSmhkRzl5T2lCQlpHOWlaU0JKYkd4MWMzUnlZWFJ2Y2lBeU1pNHdMakVzSUZOV1J5QkZlSEJ2Y25RZ1VHeDFaeTFKYmlBdUlGTldSeUJXWlhKemFXOXVPaUEyTGpBd0lFSjFhV3hrSURBcElDQXRMVDROQ2p4emRtY2dkbVZ5YzJsdmJqMGlNUzR4SWlCcFpEMGlUR0Y1WlhKZk1TSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklpQjRiV3h1Y3pwNGJHbHVhejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TVRrNU9TOTRiR2x1YXlJZ2VEMGlNSEI0SWlCNVBTSXdjSGdpRFFvSklIWnBaWGRDYjNnOUlqQWdNQ0F4TUNBeE1DSWdjM1I1YkdVOUltVnVZV0pzWlMxaVlXTnJaM0p2ZFc1a09tNWxkeUF3SURBZ01UQWdNVEE3SWlCNGJXdzZjM0JoWTJVOUluQnlaWE5sY25abElqNE5Danh6ZEhsc1pTQjBlWEJsUFNKMFpYaDBMMk56Y3lJK0RRb0pMbk4wTUh0bWFXeHNPaU0yUkRjd056STdmUTBLUEM5emRIbHNaVDROQ2p4d2IyeDVaMjl1SUdOc1lYTnpQU0p6ZERBaUlIQnZhVzUwY3owaU1pd3lJREFzTkNBMUxEa2dNVEFzTkNBNExESWdOU3cxSUNJdlBnMEtQQzl6ZG1jK0RRbz0pO1wiLFxuICAgIFwiLnN2X3FfdGl0bGUgLnN2X3F1ZXN0aW9uX2ljb24uc3ZfZXhwYW5kZWQ6OmJlZm9yZVwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1wiLFxuICAgIFwiLnN2X3FibG4gLmNoZWNrYm94LW1hdGVyaWFsXCI6IFwibWFyZ2luLXJpZ2h0OiAzcHg7XCIsXG4gICAgXCIuc3ZfcWNieCAuY2hlY2tib3gtbWF0ZXJpYWxcIjogXCJtYXJnaW4tcmlnaHQ6IDVweDtcIixcbiAgICBcIi5zdl9xY2J4IC5jaGVja2JveCBsYWJlbFwiOiBcImp1c3RpZnktY29udGVudDogbGVmdDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FzdG4gLnJhZGlvIGxhYmVsXCI6IFwianVzdGlmeS1jb250ZW50OiBsZWZ0OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3ZfcV9pbWdzZWwgPiBsYWJlbCBpbWdcIjogXCJwb2ludGVyLWV2ZW50czogbm9uZTtcIixcbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbC5zdl9xX2ltYWdlcGlja2VyX2lubGluZVwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xc3RuIGxhYmVsLnN2X3FfbV9sYWJlbFwiOlxuICAgICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IG1hcmdpbjogMDsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlO1wiLFxuICAgIFwiLnN2X3FzdG4gdGRcIjogXCJwb3NpdGlvbjogcmVsYXRpdmU7XCIsXG4gICAgXCIuc3ZfcV9tdF9pdGVtX3ZhbHVlXCI6IFwiZmxvYXQ6IGxlZnQ7XCIsXG4gICAgJ1tkaXI9XCJydGxcIl0gLnN2X3FfbXRfaXRlbV92YWx1ZSc6IFwiZmxvYXQ6IHJpZ2h0O1wiLFxuICAgIFwiLnN2X3FzdG4uc3ZfcXN0bl9sZWZ0XCI6IFwibWFyZ2luLXRvcDogMC43NWVtO1wiLFxuICAgIFwiLnN2X3FzdG4gLnRpdGxlLWxlZnRcIjogXCJmbG9hdDogbGVmdDsgbWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgJ1tkaXI9XCJydGxcIl0gLnN2X3FzdG4gLnRpdGxlLWxlZnQnOiBcImZsb2F0OiByaWdodDsgbWFyZ2luLWxlZnQ6IDFlbTtcIixcbiAgICBcIi5zdl9xc3RuIC5jb250ZW50LWxlZnRcIjogXCJvdmVyZmxvdzogaGlkZGVuXCIsXG4gICAgXCIuc3ZfcV9yYWRpb2dyb3VwX2lubGluZSAuc3ZfcV9yYWRpb2dyb3VwX290aGVyXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FfY2hlY2tib3hfaW5saW5lIC5zdl9xX2NoZWNrYm94X290aGVyXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FfY2hlY2tib3hfaW5saW5lLCAuc3ZfcV9yYWRpb2dyb3VwX2lubGluZSwgLnN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lXCI6XG4gICAgICBcImxpbmUtaGVpZ2h0OiAyLjVlbTtcIixcbiAgICBcIi5mb3JtLWlubGluZSAuc3ZfcV9jaGVja2JveF9pbmxpbmU6bm90KDpsYXN0LWNoaWxkKVwiOiBcIm1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLmZvcm0taW5saW5lIC5zdl9xX3JhZGlvZ3JvdXBfaW5saW5lOm5vdCg6bGFzdC1jaGlsZClcIjpcbiAgICAgIFwibWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCIuc3ZfaW1nc2VsIC5zdl9xX2ltYWdlcGlja2VyX2lubGluZTpub3QoOmxhc3QtY2hpbGQpXCI6XG4gICAgICBcIm1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLnN2X3FzdG4gZmllbGRzZXRcIjogXCJib3JkZXI6IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ZpbGVfcGxhY2Vob2xkZXJcIjogXCJkaXNwbGF5Om5vbmVcIixcblxuICAgIFwiLnN2X3BfdGl0bGVcIjogXCJwYWRkaW5nLWxlZnQ6IDFlbTsgcGFkZGluZy1ib3R0b206IDAuM2VtO1wiLFxuICAgIFwiLnN2X3BfdGl0bGVfZXhwYW5kYWJsZVwiOiBcImN1cnNvcjogcG9pbnRlcjtcIixcbiAgICBcIi5zdl9xX3RpdGxlX2V4cGFuZGFibGVcIjogXCJjdXJzb3I6IHBvaW50ZXI7XCIsXG4gICAgXCIuc3ZfcF90aXRsZSAuc3ZfcGFuZWxfaWNvblwiOiBcImZsb2F0OiByaWdodDsgbWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCIuc3ZfcF90aXRsZSAuc3ZfcGFuZWxfaWNvbjo6YmVmb3JlXCI6XG4gICAgICBcImNvbnRlbnQ6ICcnOyBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7IHBhZGRpbmc6IDAuNWVtOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5DandoTFMwZ1IyVnVaWEpoZEc5eU9pQkJaRzlpWlNCSmJHeDFjM1J5WVhSdmNpQXlNaTR3TGpFc0lGTldSeUJGZUhCdmNuUWdVR3gxWnkxSmJpQXVJRk5XUnlCV1pYSnphVzl1T2lBMkxqQXdJRUoxYVd4a0lEQXBJQ0F0TFQ0TkNqeHpkbWNnZG1WeWMybHZiajBpTVM0eElpQnBaRDBpVEdGNVpYSmZNU0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUI0Yld4dWN6cDRiR2x1YXowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1UazVPUzk0YkdsdWF5SWdlRDBpTUhCNElpQjVQU0l3Y0hnaURRb0pJSFpwWlhkQ2IzZzlJakFnTUNBeE1DQXhNQ0lnYzNSNWJHVTlJbVZ1WVdKc1pTMWlZV05yWjNKdmRXNWtPbTVsZHlBd0lEQWdNVEFnTVRBN0lpQjRiV3c2YzNCaFkyVTlJbkJ5WlhObGNuWmxJajROQ2p4emRIbHNaU0IwZVhCbFBTSjBaWGgwTDJOemN5SStEUW9KTG5OME1IdG1hV3hzT2lNMlJEY3dOekk3ZlEwS1BDOXpkSGxzWlQ0TkNqeHdiMng1WjI5dUlHTnNZWE56UFNKemREQWlJSEJ2YVc1MGN6MGlNaXd5SURBc05DQTFMRGtnTVRBc05DQTRMRElnTlN3MUlDSXZQZzBLUEM5emRtYytEUW89KTtcIixcbiAgICBcIi5zdl9wX3RpdGxlIC5zdl9wYW5lbF9pY29uLnN2X2V4cGFuZGVkOjpiZWZvcmVcIjpcbiAgICAgIFwidHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcIixcbiAgICBcIi5zdl9wX2Zvb3RlclwiOiBcInBhZGRpbmctbGVmdDogMWVtOyBwYWRkaW5nLWJvdHRvbTogMWVtO3BhZGRpbmctdG9wOiAxZW07XCIsXG5cbiAgICBcIi5zdl9tYXRyaXhfY2VsbF9kZXRhaWxfYnV0dG9uXCI6IFwicG9zaXRpb246IHJlbGF0aXZlXCIsXG4gICAgXCIuc3ZfZGV0YWlsX3BhbmVsX2ljb25cIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogNTAlOyB0b3A6IDUwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHdpZHRoOiAxNHB4OyBoZWlnaHQ6IDE0cHg7XCIsXG4gICAgXCIuc3ZfZGV0YWlsX3BhbmVsX2ljb246OmJlZm9yZVwiOlxuICAgICAgXCJjb250ZW50OiAnJzsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOyB3aWR0aDogMTRweDsgaGVpZ2h0OiAxNHB4OyBkaXNwbGF5OiBibG9jazsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyUzRiUzRSUzQyEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgLS0lM0UlM0NzdmcgdmVyc2lvbj0nMS4xJyBpZD0nTGF5ZXJfMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgeD0nMHB4JyB5PScwcHgnIHZpZXdCb3g9JzAgMCAxNSAxNScgc3R5bGU9J2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTUgMTU7JyB4bWw6c3BhY2U9J3ByZXNlcnZlJyUzRSUzQ3N0eWxlIHR5cGU9J3RleHQvY3NzJyUzRSAuc3QwJTdCZmlsbDolMjNGRkZGRkY7JTdEJTBBJTNDL3N0eWxlJTNFJTNDcG9seWdvbiBjbGFzcz0nc3QwJyBwb2ludHM9JzE0LDUuNSAxMi42LDQuMSA3LjUsOS4xIDIuNCw0LjEgMSw1LjUgNy41LDEyICcvJTNFJTNDL3N2ZyUzRSUwQVxcXCIpO1wiLFxuICAgIFwiLnN2X2RldGFpbF9wYW5lbF9pY29uLnN2X2RldGFpbF9leHBhbmRlZDo6YmVmb3JlXCI6XG4gICAgICBcInRyYW5zZm9ybTogcm90YXRlKDBkZWcpXCIsXG4gICAgXCIuc3ZfbWF0cml4X2VtcHR5X3Jvd3Nfc2VjdGlvblwiOlxuICAgICAgXCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XCIsXG4gICAgXCIuc3ZfbWF0cml4X2VtcHR5X3Jvd3NfdGV4dFwiOiBcInBhZGRpbmc6MjBweFwiLFxuXG4gICAgXCIuc3ZfcV9maWxlID4gaW5wdXRbdHlwZT1maWxlXSwgLnN2X3FfZmlsZSA+IGJ1dHRvblwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcV9maWxlX3ByZXZpZXdcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7IHBhZGRpbmc6IDVweDsgbWFyZ2luLXRvcDogMTBweDtcIixcbiAgICBcIi5zdl9xX2ZpbGVfcHJldmlldyA+IGFcIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IHZlcnRpY2FsLWFsaWduOiB0b3A7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1wiLFxuICAgIFwiLnN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCI6IFwibGluZS1oZWlnaHQ6IG5vcm1hbDtcIixcbiAgICBcIi5zdl9xX2ZpbGVfcmVtb3ZlXCI6IFwiZGlzcGxheTogYmxvY2s7IGN1cnNvcjogcG9pbnRlcjtcIixcblxuICAgIFwiLnN2X3FfbV9jZWxsX3RleHRcIjogXCJjdXJzb3I6IHBvaW50ZXI7XCIsXG5cbiAgICBcIi5zdl9xX2RkX290aGVyXCI6IFwibWFyZ2luLXRvcDogMWVtO1wiLFxuICAgIFwiLnN2X3FfZGRfb3RoZXIgaW5wdXRcIjogXCJ3aWR0aDogMTAwJTtcIixcblxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sLTEsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2wtMVwiOlxuICAgICAgXCJ3aWR0aDogMTAwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtMiwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbC0yXCI6XG4gICAgICBcIndpZHRoOiBjYWxjKDUwJSAtIDFlbSk7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sLTMsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2wtM1wiOlxuICAgICAgXCJ3aWR0aDogY2FsYygzMy4zMzMzMyUgLSAxZW0pOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbC00LCAuc3YtcXVlc3Rpb24gLnN2LXEtY29sLTRcIjpcbiAgICAgIFwid2lkdGg6IGNhbGMoMjUlIC0gMWVtKTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtNSwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbC01XCI6XG4gICAgICBcIndpZHRoOiBjYWxjKDIwJSAtIDFlbSk7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tMSwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbHVtbi0xXCI6XG4gICAgICBcIndpZHRoOiAxMDAlOyBtYXgtd2lkdGg6IDEwMCU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sdW1uLTIsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2x1bW4tMlwiOlxuICAgICAgXCJtYXgtd2lkdGg6IDUwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tMywgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbHVtbi0zXCI6XG4gICAgICBcIm1heC13aWR0aDogMzMuMzMzMzMlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbHVtbi00LCAuc3YtcXVlc3Rpb24gLnN2LXEtY29sdW1uLTRcIjpcbiAgICAgIFwibWF4LXdpZHRoOiAyNSU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sdW1uLTUsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2x1bW4tNVwiOlxuICAgICAgXCJtYXgtd2lkdGg6IDIwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ZpbGVfaW5wdXRcIjogXCJjb2xvcjogdHJhbnNwYXJlbnQ7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbCBsYWJlbCA+IGRpdlwiOlxuICAgICAgXCJvdmVyZmxvdzogaGlkZGVuOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgcGFkZGluZzogNHB4OyBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7IGJvcmRlci1yYWRpdXM6IDRweDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdl9xX2ltZ3NlbCBsYWJlbCA+IGRpdiA+IGltZywgLnN2X3FzdG4gLnN2X3FfaW1nc2VsIGxhYmVsID4gZGl2ID4gZW1iZWRcIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7XCIsXG5cbiAgICBcIi5zdl9xc3RuIHRhYmxlIHRyIHRkIC5zdl9xX21fY2VsbF9sYWJlbFwiOlxuICAgICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDA7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDtcIixcblxuICAgIFwiZi1wYW5lbFwiOiBcInBhZGRpbmc6IDAuNWVtIDFlbTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBsaW5lLWhlaWdodDogMmVtO1wiLFxuXG4gICAgXCIuc3ZfcHJvZ3Jlc3NfYmFyID4gc3BhblwiOiBcIndoaXRlLXNwYWNlOiBub3dyYXA7XCIsXG5cbiAgICAvL3Byb2dyZXNzIGJ1dHRvbnNcbiAgICBcIi5zdl9wcm9ncmVzcy1idXR0b25zX19jb250YWluZXItY2VudGVyXCI6IFwidGV4dC1hbGlnbjogY2VudGVyO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2NvbnRhaW5lclwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtc2l6ZTowOyB3aWR0aDogMTAwJTsgbWF4LXdpZHRoOiAxMTAwcHg7IHdoaXRlLXNwYWNlOiBub3dyYXA7IG92ZXJmbG93OiBoaWRkZW47XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19faW1hZ2UtYnV0dG9uLWxlZnRcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBtYXJnaW4tdG9wOiAyMnB4OyBmb250LXNpemU6IDE0cHg7IHdpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IGN1cnNvcjogcG9pbnRlcjsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqd2hMUzBnUjJWdVpYSmhkRzl5T2lCQlpHOWlaU0JKYkd4MWMzUnlZWFJ2Y2lBeU1pNHdMakVzSUZOV1J5QkZlSEJ2Y25RZ1VHeDFaeTFKYmlBdUlGTldSeUJXWlhKemFXOXVPaUEyTGpBd0lFSjFhV3hrSURBcElDQXRMVDROQ2p4emRtY2dkbVZ5YzJsdmJqMGlNUzR4SWlCcFpEMGlUR0Y1WlhKZk1TSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklpQjRiV3h1Y3pwNGJHbHVhejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TVRrNU9TOTRiR2x1YXlJZ2VEMGlNSEI0SWlCNVBTSXdjSGdpRFFvSklIWnBaWGRDYjNnOUlqQWdNQ0F4TmlBeE5pSWdjM1I1YkdVOUltVnVZV0pzWlMxaVlXTnJaM0p2ZFc1a09tNWxkeUF3SURBZ01UWWdNVFk3SWlCNGJXdzZjM0JoWTJVOUluQnlaWE5sY25abElqNE5Danh3YjJ4NVoyOXVJSEJ2YVc1MGN6MGlNVEVzTVRJZ09Td3hOQ0F6TERnZ09Td3lJREV4TERRZ055dzRJQ0l2UGcwS1BDOXpkbWMrRFFvPSk7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19faW1hZ2UtYnV0dG9uLXJpZ2h0XCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDsgbWFyZ2luLXRvcDogMjJweDsgZm9udC1zaXplOiAxNHB4OyB3aWR0aDogMTZweDsgaGVpZ2h0OiAxNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5DandoTFMwZ1IyVnVaWEpoZEc5eU9pQkJaRzlpWlNCSmJHeDFjM1J5WVhSdmNpQXlNaTR3TGpFc0lGTldSeUJGZUhCdmNuUWdVR3gxWnkxSmJpQXVJRk5XUnlCV1pYSnphVzl1T2lBMkxqQXdJRUoxYVd4a0lEQXBJQ0F0TFQ0TkNqeHpkbWNnZG1WeWMybHZiajBpTVM0eElpQnBaRDBpVEdGNVpYSmZNU0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUI0Yld4dWN6cDRiR2x1YXowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1UazVPUzk0YkdsdWF5SWdlRDBpTUhCNElpQjVQU0l3Y0hnaURRb0pJSFpwWlhkQ2IzZzlJakFnTUNBeE5pQXhOaUlnYzNSNWJHVTlJbVZ1WVdKc1pTMWlZV05yWjNKdmRXNWtPbTVsZHlBd0lEQWdNVFlnTVRZN0lpQjRiV3c2YzNCaFkyVTlJbkJ5WlhObGNuWmxJajROQ2p4d2IyeDVaMjl1SUhCdmFXNTBjejBpTlN3MElEY3NNaUF4TXl3NElEY3NNVFFnTlN3eE1pQTVMRGdnSWk4K0RRbzhMM04yWno0TkNnPT0pO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2ltYWdlLWJ1dHRvbi0taGlkZGVuXCI6IFwidmlzaWJpbGl0eTogaGlkZGVuO1wiLFxuICAgIFwiLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtY29udGFpbmVyXCI6XG4gICAgICBcIm1heC13aWR0aDogY2FsYygxMDAlIC0gMzZweCk7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjtcIixcbiAgICBcIi5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0XCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IG1heC1jb250ZW50OyBwYWRkaW5nLWxlZnQ6IDI4cHg7IHBhZGRpbmctcmlnaHQ6IDI4cHg7IG1hcmdpbi10b3A6IDE0cHg7IG1hcmdpbi1ib3R0b206IDE0cHg7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaVwiOlxuICAgICAgXCJ3aWR0aDogMTM4cHg7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1mYW1pbHk6ICdTZWdvZSBVSScsICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IHBvc2l0aW9uOiByZWxhdGl2ZTsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaTpiZWZvcmVcIjpcbiAgICAgIFwid2lkdGg6IDI0cHg7IGhlaWdodDogMjRweDsgY29udGVudDogJyc7IGxpbmUtaGVpZ2h0OiAzMHB4OyBib3JkZXI6IDNweCBzb2xpZCAjOGRkOWNhOyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiAwIGF1dG8gMTBweCBhdXRvOyBib3JkZXItcmFkaXVzOiA1MCU7IGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyBiYWNrZ3JvdW5kLWNvbG9yOiAjOGRkOWNhOyBjdXJzb3I6IHBvaW50ZXI7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaTphZnRlclwiOlxuICAgICAgXCJ3aWR0aDogNzMlOyBoZWlnaHQ6IDNweDsgY29udGVudDogJyc7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgYmFja2dyb3VuZC1jb2xvcjogI2Q0ZDRkNDsgdG9wOiAxNXB4OyBsZWZ0OiAtMzYuNSU7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaTpmaXJzdC1jaGlsZDphZnRlclwiOiBcImNvbnRlbnQ6IG5vbmU7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCAuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fcGFnZS10aXRsZVwiOlxuICAgICAgXCJ3aWR0aDogMTAwJTsgb3ZlcmZsb3c6IGhpZGRlbjsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IHdoaXRlLXNwYWNlOiBub3dyYXA7IGNvbG9yOiAkdGV4dC1jb2xvcjsgZm9udC13ZWlnaHQ6IGJvbGQ7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCAuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fcGFnZS1kZXNjcmlwdGlvblwiOlxuICAgICAgXCJ3aWR0aDogMTAwJTsgb3ZlcmZsb3c6IGhpZGRlbjsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IHdoaXRlLXNwYWNlOiBub3dyYXA7IGNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0IGxpLnN2X3Byb2dyZXNzLWJ1dHRvbnNfX2xpc3QtZWxlbWVudC0tcGFzc2VkOmJlZm9yZVwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICMxYWIzOTQ7IGJhY2tncm91bmQtY29sb3I6ICMxYWIzOTQ7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaS5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLXBhc3NlZCArIGxpOmFmdGVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICM4ZGQ5Y2E7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaS5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLWN1cnJlbnQ6YmVmb3JlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogIzFhYjM5NDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaS5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLXBhc3NlZC5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLWN1cnJlbnQ6YmVmb3JlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogIzFhYjM5NDsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIsXG4gICAgXCIuc3ZfcHJvZ3Jlc3MtYnV0dG9uc19fbGlzdCBsaS5zdl9wcm9ncmVzcy1idXR0b25zX19saXN0LWVsZW1lbnQtLW5vbmNsaWNrYWJsZTpiZWZvcmVcIjpcbiAgICAgIFwiY3Vyc29yOiBub3QtYWxsb3dlZDtcIixcblxuICAgIC8vIHJhbmtpbmdcbiAgICBcIi5zdi1yYW5raW5nXCI6IFwib3V0bGluZTogbm9uZTtcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW1cIjpcbiAgICAgIFwiY3Vyc29yOiBwb2ludGVyOyBtYXJnaW4tYm90dG9tOiA1cHg7cG9zaXRpb246IHJlbGF0aXZlO1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbTpmb2N1cyAuc3YtcmFua2luZy1pdGVtX19pY29uLS1ob3ZlclwiOlxuICAgICAgXCJ2aXNpYmlsaXR5OiBoaWRkZW47XCIsXG4gICAgXCIuc3YtcmFua2luZy1pdGVtOmhvdmVyIC5zdi1yYW5raW5nLWl0ZW1fX2ljb24tLWhvdmVyXCI6XG4gICAgICBcInZpc2liaWxpdHk6IHZpc2libGU7XCIsXG4gICAgXCIuc3YtcXVlc3Rpb24tLWRpc2FibGVkIC5zdi1yYW5raW5nLWl0ZW06aG92ZXIgLnN2LXJhbmtpbmctaXRlbV9faWNvbi0taG92ZXJcIjpcbiAgICAgIFwidmlzaWJpbGl0eTogaGlkZGVuO1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbTpmb2N1c1wiOiBcIm91dGxpbmU6IG5vbmU7XCIsXG4gICAgXCIuc3YtcmFua2luZy1pdGVtOmZvY3VzIC5zdi1yYW5raW5nLWl0ZW1fX2ljb24tLWZvY3VzXCI6XG4gICAgICBcInZpc2liaWxpdHk6IHZpc2libGU7IHRvcDogMTVweDtcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW06Zm9jdXMgLnN2LXJhbmtpbmctaXRlbV9faW5kZXhcIjpcbiAgICAgIFwiYmFja2dyb3VuZDogd2hpdGU7IGJvcmRlcjogMnB4IHNvbGlkICMxOWIzOTQ7XCIsXG4gICAgXCIuc3YtcmFua2luZy1pdGVtX19jb250ZW50XCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jaztiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtwYWRkaW5nLXRvcDogNXB4O3BhZGRpbmctYm90dG9tOiA1cHg7cGFkZGluZy1sZWZ0OiAzNXB4O3BhZGRpbmctcmlnaHQ6IDEwcHg7IGJvcmRlci1yYWRpdXM6IDEwMHB4O1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbV9faWNvbi1jb250YWluZXJcIjpcbiAgICAgIFwicG9zaXRpb246IGFic29sdXRlO2xlZnQ6IDA7dG9wOiAwO2JvdHRvbTogMDt3aWR0aDogMzVweDtcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW1fX2ljb25cIjpcbiAgICAgIFwidmlzaWJpbGl0eTogaGlkZGVuO2xlZnQ6MTBweDt0b3A6MjBweDtmaWxsOiMxOWIzOTQ7cG9zaXRpb246IGFic29sdXRlO1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbV9faW5kZXhcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrO3BhZGRpbmc6IDEwcHggMTZweDtiYWNrZ3JvdW5kOiByZ2JhKDI1LCAxNzksIDE0OCwgMC4xKTtib3JkZXItcmFkaXVzOiAxMDBweDtib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsgbWFyZ2luLXJpZ2h0OiAxMHB4O1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbV9fdGV4dFwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW1fX2dob3N0XCI6XG4gICAgICBcImRpc3BsYXk6IG5vbmU7YmFja2dyb3VuZDogI2YzZjNmMztib3JkZXItcmFkaXVzOiAxMDBweDt3aWR0aDogMjAwcHg7aGVpZ2h0OiA1NXB4O3otaW5kZXg6IDE7cG9zaXRpb246IGFic29sdXRlO2xlZnQ6IDM1cHg7XCIsXG4gICAgXCIuc3YtcmFua2luZy1pdGVtLS1naG9zdCAuc3YtcmFua2luZy1pdGVtX19naG9zdFwiOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuICAgIFwiLnN2LXJhbmtpbmctaXRlbS0tZ2hvc3QgLnN2LXJhbmtpbmctaXRlbV9fY29udGVudFwiOiBcInZpc2liaWxpdHk6IGhpZGRlbjtcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW0tLWRyYWcgLnN2LXJhbmtpbmctaXRlbV9fY29udGVudFwiOlxuICAgICAgXCJib3gtc2hhZG93OiAwcHggOHB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjEpO2JvcmRlci1yYWRpdXM6IDEwMHB4O1wiLFxuICAgIFwiLnN2LXJhbmtpbmctLWRyYWcgLnN2LXJhbmtpbmctaXRlbTpob3ZlciAuc3YtcmFua2luZy1pdGVtX19pY29uXCI6XG4gICAgICBcInZpc2liaWxpdHk6IGhpZGRlbjtcIixcbiAgICBcIi5zdi1yYW5raW5nLWl0ZW0tLWRyYWcgLnN2LXJhbmtpbmctaXRlbV9faWNvbi0taG92ZXJcIjpcbiAgICAgIFwidmlzaWJpbGl0eTogdmlzaWJsZTtcIixcbiAgICBcIi5zdi1yYW5raW5nLS1tb2JpbGUgLnN2LXJhbmtpbmctaXRlbV9faWNvbi0taG92ZXJcIjpcbiAgICAgIFwidmlzaWJpbGl0eTp2aXNpYmxlOyBmaWxsOiM5ZjlmOWY7XCIsXG4gICAgXCIuc3YtcmFua2luZy0tbW9iaWxlLnN2LXJhbmtpbmctLWRyYWcgLnN2LXJhbmtpbmctaXRlbS0tZ2hvc3QgLnN2LXJhbmtpbmctaXRlbV9faWNvbi5zdi1yYW5raW5nLWl0ZW1fX2ljb24tLWhvdmVyXCI6XG4gICAgICBcInZpc2liaWxpdHk6aGlkZGVuO1wiLFxuXG4gICAgXCIuc3ZfcXN0biAuc3ZfcV9zZWxlY3RfY29sdW1uXCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDsgbWluLXdpZHRoOiAxMCU7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdl9xX3NlbGVjdF9jb2x1bW4gPiAqOm5vdCguc3ZfdGVjaG5pY2FsKVwiOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5zdl9ib2R5IC5zdl9wX3Jvb3QgLnN2X3FzdG4gLnN2X3Ffc2VsZWN0X2NvbHVtbiB0ZXh0YXJlYVwiOlxuICAgICAgXCJtYXJnaW4tbGVmdDogMDsgcGFkZGluZy1sZWZ0OiAwOyBsaW5lLWhlaWdodDogaW5pdGlhbDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1oaWRkZW5cIjogXCJkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtdmlzdWFsbHloaWRkZW5cIjpcbiAgICAgIFwicG9zaXRpb246IGFic29sdXRlOyBoZWlnaHQ6IDFweCAhaW1wb3J0YW50OyB3aWR0aDogMXB4ICFpbXBvcnRhbnQ7IG92ZXJmbG93OiBoaWRkZW47IGNsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTsgY2xpcDogcmVjdCgxcHgsIDFweCwgMXB4LCAxcHgpO1wiLFxuXG4gICAgLy8gcGFuZWxkeW5hbWljIHByb2dyZXNzXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NcIjpcbiAgICAgIFwiaGVpZ2h0OiAwLjE5ZW07IGJhY2tncm91bmQtY29sb3I6ICRoZWFkZXItYmFja2dyb3VuZC1jb2xvcjsgcG9zaXRpb246IHJlbGF0aXZlO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzX19iYXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGhlaWdodDogMTAwJTsgcG9zaXRpb246IHJlbGF0aXZlO1wiLFxuICAgIC8vIEVPIHBhbmVsZHluYW1pYyBwcm9ncmVzc1xuXG4gICAgLy8gcGFuZWxkeW5hbWljXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy1jb250YWluZXJcIjpcbiAgICAgIFwicG9zaXRpb246IHJlbGF0aXZlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiBjYWxjKDEwMCUgLSAyNTBweCk7IG1hcmdpbi10b3A6IDIwcHg7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19hZGQtYnRuXCI6IFwiZmxvYXQ6IHJpZ2h0O1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fYWRkLWJ0bi0tbGlzdC1tb2RlXCI6XG4gICAgICBcImZsb2F0OiBub25lOyBtYXJnaW4tdG9wOiAwO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcmVtb3ZlLWJ0blwiOiBcIm1hcmdpbi10b3A6IDEuMjVlbTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3JlbW92ZS1idG4tLXJpZ2h0XCI6XG4gICAgICBcIm1hcmdpbi10b3A6IDA7IG1hcmdpbi1sZWZ0OiAxLjI1ZW07XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0biwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIjpcbiAgICAgIFwiYm94LXNpemluZzogYm9yZGVyLWJveDsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBjdXJzb3I6IHBvaW50ZXI7IHdpZHRoOiAwLjdlbTsgdG9wOiAtMC4yOGVtOyBwb3NpdGlvbjogYWJzb2x1dGU7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0blwiOlxuICAgICAgXCJsZWZ0OiAtMS4zZW07IHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuIFwiOlxuICAgICAgXCJyaWdodDogLTEuM2VtOyB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4uc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi0tZGlzYWJsZWQsIC5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4tLWRpc2FibGVkXCI6XG4gICAgICBcImN1cnNvcjogYXV0bztcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIjpcbiAgICAgIFwiZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogMC44N2VtOyBtYXJnaW4tdG9wOiAwLjY5ZW07IG1hcmdpbi1sZWZ0OiA0ZW1cIixcbiAgICAvLyBFTyBwYW5lbGR5bmFtaWNcbiAgICAvL2Jvb2xlYW5cbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zd2l0Y2hcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3aWR0aDogNjNweDsgaGVpZ2h0OiAyNHB4OyBtYXJnaW4tcmlnaHQ6IDE3cHg7IG1hcmdpbi1sZWZ0OiAyMXB4OyBwYWRkaW5nOiAycHggM3B4OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBib3JkZXItcmFkaXVzOiAxMnB4OyBjdXJzb3I6IHBvaW50ZXI7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDIwcHg7IGhlaWdodDogMjBweDsgdHJhbnNpdGlvbi1kdXJhdGlvbjogLjRzOyB0cmFuc2l0aW9uLXByb3BlcnR5OiBtYXJnaW4tbGVmdDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiAxMDAlO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX2xhYmVsXCI6IFwidmVydGljYWwtYWxpZ246IG1pZGRsZTsgY3Vyc29yOiBwb2ludGVyO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4tLWluZGV0ZXJtaW5hdGUgIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwibWFyZ2luLWxlZnQ6IGNhbGMoNTAlIC0gMTBweCk7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0tY2hlY2tlZCAgLnN2LWJvb2xlYW5fX3NsaWRlclwiOlxuICAgICAgXCJtYXJnaW4tbGVmdDogY2FsYygxMDAlIC0gMjBweCk7XCIsXG4gICAgXCJbZGlyPSdydGwnXSAuc3YtYm9vbGVhbl9fbGFiZWwgXCI6IFwiZmxvYXQ6IHJpZ2h0O1wiLFxuICAgIFwiW2Rpcj0ncnRsJ10gLnN2LWJvb2xlYW4tLWluZGV0ZXJtaW5hdGUgLnN2LWJvb2xlYW5fX3NsaWRlclwiOlxuICAgICAgXCJtYXJnaW4tcmlnaHQ6IGNhbGMoNTAlIC0gMC42MjVlbSk7XCIsXG4gICAgXCJbZGlyPSdydGwnXSAuc3YtYm9vbGVhbi0tY2hlY2tlZCAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcIm1hcmdpbi1yaWdodDogY2FsYygxMDAlIC0gMS4yNWVtKTtcIixcbiAgICBcIltkaXI9J3J0bCddIC5zdi1ib29sZWFuX19zd2l0Y2hcIjogXCJmbG9hdDogcmlnaHQ7XCIsXG4gICAgXCJbc3R5bGUqPSdkaXJlY3Rpb246cnRsJ10gLnN2LWJvb2xlYW5fX2xhYmVsIFwiOiBcImZsb2F0OiByaWdodDtcIixcbiAgICBcIltzdHlsZSo9J2RpcmVjdGlvbjpydGwnXSAuc3YtYm9vbGVhbi0taW5kZXRlcm1pbmF0ZSAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcIm1hcmdpbi1yaWdodDogY2FsYyg1MCUgLSAwLjYyNWVtKTtcIixcbiAgICBcIltzdHlsZSo9J2RpcmVjdGlvbjpydGwnXSAuc3YtYm9vbGVhbi0tY2hlY2tlZCAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcIm1hcmdpbi1yaWdodDogY2FsYygxMDAlIC0gMS4yNWVtKTtcIixcbiAgICBcIltzdHlsZSo9J2RpcmVjdGlvbjpydGwnXSAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6IFwiZmxvYXQ6IHJpZ2h0O1wiLFxuXG4gICAgLy8gRU8gYm9vbGVhblxuICAgIFwiLnN2X21haW4gLnN2X3FfbnVtXCI6IFwiXCIsXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9udW0gKyBzcGFuXCI6IFwiXCIsXG5cbiAgICAvLyBTaWduYXR1cmVQYWRcbiAgICBcIi5zdl9tYWluIC5zanNfc3BfY29udGFpbmVyXCI6XG4gICAgICBcInBvc2l0aW9uOiByZWxhdGl2ZTsgYm94LXNpemluZzogY29udGVudC1ib3g7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX2NvbnRyb2xzXCI6IFwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAwOyBib3R0b206IDA7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX2NvbnRyb2xzID4gYnV0dG9uXCI6IFwidXNlci1zZWxlY3Q6IG5vbmU7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX2NvbnRhaW5lcj5kaXY+Y2FudmFzOmZvY3VzXCI6IFwib3V0bGluZTogbm9uZTtcIixcbiAgICBcIi5zdl9tYWluIC5zanNfc3BfcGxhY2Vob2xkZXJcIjpcbiAgICAgIFwiZGlzcGxheTogZmxleDsgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBwb3NpdGlvbjogYWJzb2x1dGU7IHotaW5kZXg6IDA7IHVzZXItc2VsZWN0OiBub25lOyBwb2ludGVyLWV2ZW50czogbm9uZTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTtcIixcblxuICAgIC8vIGxvZ29cbiAgICAvLyBcIi5zdl9tYWluIC5zdl9oZWFkZXJcIjogXCJ3aGl0ZS1zcGFjZTogbm93cmFwO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X2xvZ29cIjogXCJcIixcbiAgICBcIi5zdl9tYWluIC5zdi1sb2dvLS1sZWZ0XCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDsgbWFyZ2luLXJpZ2h0OiAyZW07XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtbG9nby0tcmlnaHRcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBtYXJnaW4tbGVmdDogMmVtOyBmbG9hdDogcmlnaHQ7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtbG9nby0tcmlnaHQrLnN2LWxvZ28tLXJpZ2h0LXRhaWxcIjogXCJjbGVhcjogYm90aDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1sb2dvLS10b3BcIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtbG9nby0tYm90dG9tXCI6XG4gICAgICBcImRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X2hlYWRlcl9fdGV4dFwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7IG1heC13aWR0aDogMTAwJVwiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3YtZXhwYW5kLWFjdGlvbjpiZWZvcmVcIjogYGNvbnRlbnQ6IFwiXCI7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQyUzRnhtbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCclM0YlM0UlM0MhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMS4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApIC0tJTNFJTNDc3ZnIHZlcnNpb249JzEuMScgaWQ9J0xheWVyXzEnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgeG1sbnM6eGxpbms9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnIHg9JzBweCcgeT0nMHB4JyB2aWV3Qm94PScwIDAgMTAgMTAnIHN0eWxlPSdlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDEwIDEwOycgeG1sOnNwYWNlPSdwcmVzZXJ2ZSclM0UlM0NzdHlsZSB0eXBlPSd0ZXh0L2NzcyclM0UgLnN0MCU3QmZpbGw6JTIzNDA0MDQwOyU3RCUwQSUzQy9zdHlsZSUzRSUzQ3BvbHlnb24gY2xhc3M9J3N0MCcgcG9pbnRzPScyLDIgMCw0IDUsOSAxMCw0IDgsMiA1LDUgJy8lM0UlM0Mvc3ZnJTNFJTBBXCIpOyBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyOyBoZWlnaHQ6IDEwcHg7IHdpZHRoOiAxMnB4OyBtYXJnaW46IGF1dG8gOHB4O2AsXG5cbiAgICBcIi5zdl9tYWluIC5zdi1leHBhbmQtYWN0aW9uLS1leHBhbmRlZDpiZWZvcmVcIjogYHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7YCxcblxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXJcIjogYGRpc3BsYXk6IGZsZXg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWxlZnQ6IGF1dG87IHBhZGRpbmc6IDAgMCAwIDE2cHg7IG92ZXJmbG93OiBoaWRkZW47IHdoaXRlLXNwYWNlOiBub3dyYXA7YCxcbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tYmFyLXNlcGFyYXRvclwiOiBgZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogMXB4OyBoZWlnaHQ6IDI0cHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IG1hcmdpbi1yaWdodDogMTZweDsgYmFja2dyb3VuZC1jb2xvcjogI2Q2ZDZkNjtgLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXItaXRlbVwiOiBgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOyAtbW96LWFwcGVhcmFuY2U6IG5vbmU7IGFwcGVhcmFuY2U6IG5vbmU7IGRpc3BsYXk6IGZsZXg7IGhlaWdodDogNDBweDsgcGFkZGluZzogOHB4OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBtYXJnaW4tcmlnaHQ6IDE2cHg7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogMnB4OyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgY3Vyc29yOiBwb2ludGVyOyBsaW5lLWhlaWdodDogMjRweDsgZm9udC1zaXplOiAxNnB4OyBvdmVyZmxvdy14OiBoaWRkZW47IHdoaXRlLXNwYWNlOiBub3dyYXA7IG1pbi13aWR0aDogYXV0bzsgZm9udC13ZWlnaHQ6IG5vcm1hbGAsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYWN0aW9uLWJhci1pdGVtX190aXRsZVwiOiBgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vd3JhcDtgLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXItaXRlbV9fdGl0bGUtLXdpdGgtaWNvblwiOiBgbWFyZ2luLWxlZnQ6IDhweDtgLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvblwiOiBgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjtgLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi0taGlkZGVuXCI6IFwiZGlzcGxheTogbm9uZTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tYmFyLWl0ZW1fX2ljb24gc3ZnXCI6IFwiZGlzcGxheTogYmxvY2s7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYWN0aW9uLWJhci1pdGVtOmFjdGl2ZVwiOiBcIm9wYWNpdHk6IDAuNTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tYmFyLWl0ZW06Zm9jdXNcIjogXCJvdXRsaW5lOiBub25lO1wiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3YtdGl0bGUtYWN0aW9uc1wiOiBcImRpc3BsYXk6IGZsZXg7YWxpZ24taXRlbXM6IGNlbnRlcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi10aXRsZS1hY3Rpb25zX190aXRsZVwiOlxuICAgICAgXCJmbGV4LXdyYXA6IHdyYXA7IG1heC13aWR0aDogOTAlOyBtaW4td2lkdGg6IDUwJTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi10aXRsZS1hY3Rpb25zX19iYXJcIjogXCJtaW4td2lkdGg6IDU2cHg7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3ZfbWF0cml4X2NlbGxfYWN0aW9ucyAuc3YtYWN0aW9uLWJhclwiOlxuICAgICAgXCJtYXJnaW4tbGVmdDogMDsgcGFkZGluZy1sZWZ0OiAwO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3Bfd3JhcHBlcl9pbl9yb3dcIjpcbiAgICAgIFwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIixcbiAgICBcIi5zdl9tYWluICAuc3ZfcF9yZW1vdmVfYnRuX3JpZ2h0XCI6IFwibWFyZ2luLWxlZnQ6IDFlbTtcIixcbiAgICAvL2J1dHRvbi1ncm91cFxuICAgIFwiLnN2X21haW4gLnN2LWJ1dHRvbi1ncm91cFwiOlxuICAgICAgXCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBmbGV4LWRpcmVjdGlvbjogcm93OyBmb250LXNpemU6IDE2cHg7IGhlaWdodDogNDhweDsgb3ZlcmZsb3c6IGF1dG87XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYnV0dG9uLWdyb3VwX19pdGVtXCI6XG4gICAgICBcImRpc3BsYXk6IGZsZXg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZsZXgtZGlyZWN0aW9uOiByb3c7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBhbGlnbi1pdGVtczogY2VudGVyOyB3aWR0aDogMTAwJTsgcGFkZGluZzogMTFweCAxNnB4OyBsaW5lLWhlaWdodDogMjRweDsgYm9yZGVyLXdpZHRoOiAxcHg7IGJvcmRlci1zdHlsZTogc29saWQ7IG91dGxpbmU6IG5vbmU7IGZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDQwMDsgY3Vyc29yOiBwb2ludGVyOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW06bm90KDpmaXJzdC1vZi10eXBlKVwiOiBcIm1hcmdpbi1sZWZ0OiAtMXB4O1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJ1dHRvbi1ncm91cF9faXRlbS1pY29uXCI6IFwiZGlzcGxheTogYmxvY2s7IGhlaWdodDogMjRweDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0tLXNlbGVjdGVkXCI6IFwiZm9udC13ZWlnaHQ6IDYwMDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0tZGVjb3JhdG9yXCI6XG4gICAgICBcImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCIsXG4gICAgXCIuc3ZfbWFpbiAgLnN2LWJ1dHRvbi1ncm91cF9faXRlbS1pY29uICsgLnN2LWJ1dHRvbi1ncm91cF9faXRlbS1jYXB0aW9uXCI6XG4gICAgICBcIm1hcmdpbi1sZWZ0OiA4cHg7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYnV0dG9uLWdyb3VwX19pdGVtLS1kaXNhYmxlZFwiOiBcImNvbG9yOiBjdXJzb3I6IGRlZmF1bHQ7XCIsXG4gICAgLy9lbyBidXR0b24tZ3JvdXBcbiAgICAvL3BvcHVwXG4gICAgXCJzdi1wb3B1cFwiOiBcImRpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogYWJzb2x1dGU7IHotaW5kZXg6IC0xO1wiLFxuICAgIFwiLnN2LXBvcHVwXCI6XG4gICAgICBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogMDsgdG9wOiAwOyB6LWluZGV4OiAxMDAwOyB3aWR0aDogMTAwdnc7IGhlaWdodDogMTAwdmg7IG91dGxpbmU6IG5vbmU7XCIsXG4gICAgXCIuc3YtcG9wdXAtLW1vZGFsXCI6XG4gICAgICBcImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiLFxuICAgIFwiLnN2LXBvcHVwLS1tb2RhbCAuc3YtcG9wdXBfX2NvbnRhaW5lclwiOlxuICAgICAgXCJwb3NpdGlvbjogc3RhdGljOyBmaWx0ZXI6IG5vbmU7IHBhZGRpbmc6IGNhbGMoNCAqIDhweCk7XCIsXG4gICAgXCIuc3YtcG9wdXBfX2NvbnRhaW5lclwiOlxuICAgICAgXCJwb3NpdGlvbjogYWJzb2x1dGU7IGZpbHRlcjogZHJvcC1zaGFkb3coMHB4IGNhbGMoMSAqIDhweCkgY2FsYygyICogOHB4KSByZ2JhKDAsIDAsIDAsIDAuMSkpOyBwYWRkaW5nOiBjYWxjKDEgKiA4cHgpIDA7IGJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA0cHg7XCIsXG4gICAgXCIuc3YtcG9wdXBfX3Njcm9sbGluZy1jb250ZW50XCI6XG4gICAgICBcIm1heC13aWR0aDogOTB2dzsgbWF4LWhlaWdodDogOTB2aDsgb3ZlcmZsb3c6IGF1dG87XCIsXG4gICAgXCIuc3YtcG9wdXBfX3Njcm9sbGluZy1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhclwiOlxuICAgICAgXCJoZWlnaHQ6IDZweDsgd2lkdGg6IDZweDsgYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMztcIixcbiAgICBcIi5zdi1wb3B1cF9fc2Nyb2xsaW5nLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iXCI6XG4gICAgICBcImJhY2tncm91bmQ6IHJnYmEoMjUsIDE3OSwgMTQ4LCAwLjEpO1wiLFxuICAgIFwiLnN2LXBvcHVwX19jb250ZW50XCI6IFwibWluLXdpZHRoOiAxMDAlO1wiLFxuICAgIFwiLnN2LXBvcHVwLS1zaG93LXBvaW50ZXIuc3YtcG9wdXAtLXRvcFwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygtMSAqIDhweCkpO1wiLFxuICAgIFwiLnN2LXBvcHVwLS1zaG93LXBvaW50ZXIuc3YtcG9wdXAtLXRvcCAuc3YtcG9wdXBfX3BvaW50ZXJcIjpcbiAgICAgIFwidHJhbnNmb3JtOiB0cmFuc2xhdGUoY2FsYygtMSAqIDhweCkpIHJvdGF0ZSgxODBkZWcpO1wiLFxuICAgIFwiLnN2LXBvcHVwLS1zaG93LXBvaW50ZXIuc3YtcG9wdXAtLWJvdHRvbVwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoY2FsYygxICogOHB4KSk7XCIsXG4gICAgXCIuc3YtcG9wdXAtLXNob3ctcG9pbnRlci5zdi1wb3B1cC0tYm90dG9tIC5zdi1wb3B1cF9fcG9pbnRlclwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZShjYWxjKC0xICogOHB4KSwgY2FsYygtMSAqIDhweCkpO1wiLFxuICAgIFwiLnN2LXBvcHVwLS1zaG93LXBvaW50ZXIuc3YtcG9wdXAtLXJpZ2h0XCI6XG4gICAgICBcInRyYW5zZm9ybTogdHJhbnNsYXRlKGNhbGMoMSAqIDhweCkpO1wiLFxuICAgIFwiLnN2LXBvcHVwLS1zaG93LXBvaW50ZXIuc3YtcG9wdXAtLXJpZ2h0IC5zdi1wb3B1cF9fcG9pbnRlclwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTJweCwgLTRweCkgcm90YXRlKC05MGRlZyk7XCIsXG4gICAgXCIuc3YtcG9wdXAtLXNob3ctcG9pbnRlci5zdi1wb3B1cC0tbGVmdFwiOlxuICAgICAgXCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZShjYWxjKC0xICogOHB4KSk7XCIsXG4gICAgXCIuc3YtcG9wdXAtLXNob3ctcG9pbnRlci5zdi1wb3B1cC0tbGVmdCAuc3YtcG9wdXBfX3BvaW50ZXJcIjpcbiAgICAgIFwidHJhbnNmb3JtOiB0cmFuc2xhdGUoLTRweCwgLTRweCkgcm90YXRlKDkwZGVnKTtcIixcbiAgICBcIi5zdi1wb3B1cF9fcG9pbnRlclwiOiBcImRpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogYWJzb2x1dGU7XCIsXG4gICAgXCIuc3YtcG9wdXBfX3BvaW50ZXI6YWZ0ZXJcIjpcbiAgICAgIFwiY29udGVudDogJyAnOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyLWxlZnQ6IGNhbGMoMSAqIDhweCkgc29saWQgdHJhbnNwYXJlbnQ7IGJvcmRlci1yaWdodDogY2FsYygxICogOHB4KSBzb2xpZCB0cmFuc3BhcmVudDsgYm9yZGVyLWJvdHRvbTogY2FsYygxICogOHB4KSBzb2xpZCB3aGl0ZTsgYWxpZ24tc2VsZjogY2VudGVyO1wiLFxuICAgIFwiLnN2LXBvcHVwX19mb290ZXJcIjogXCJkaXNwbGF5OiBmbGV4OyBtYXJnaW4tdG9wOiBjYWxjKDQgKiA4cHgpO1wiLFxuICAgIFwiLnN2LXBvcHVwX19mb290ZXItaXRlbTpmaXJzdC1jaGlsZFwiOiBcIm1hcmdpbi1sZWZ0OiBhdXRvO1wiLFxuICAgIFwiLnN2LXBvcHVwX19mb290ZXItaXRlbSArIC5zdi1wb3B1cF9fZm9vdGVyLWl0ZW1cIjpcbiAgICAgIFwibWFyZ2luLWxlZnQ6IGNhbGMoMSAqIDhweCk7XCIsXG4gICAgXCIuc3YtcG9wdXBfX2J1dHRvblwiOlxuICAgICAgXCJwYWRkaW5nOiBjYWxjKDIgKiA4cHgpIGNhbGMoNiAqIDhweCk7IGJhY2tncm91bmQ6ICNmZmY7IGJveC1zaGFkb3c6IDBweCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyOyBtYXJnaW46IDJweDsgZm9udC1mYW1pbHk6ICdTZWdvZSBVSScsICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiBjYWxjKDIgKiA4cHgpOyBsaW5lLWhlaWdodDogY2FsYygzICogOHB4KTsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzE5YjM5NDsgYm9yZGVyOiBub25lOyBvdXRsaW5lOiBub25lO1wiLFxuICAgIFwiLnN2LXBvcHVwX19idXR0b246aG92ZXJcIjogXCJib3gtc2hhZG93OiAwIDAgMCAycHggIzE5YjM5NDtcIixcbiAgICBcIi5zdi1wb3B1cF9fYnV0dG9uOmRpc2FibGVkXCI6XG4gICAgICBcImNvbG9yOiByZ2JhKDIyLCAyMiwgMjIsIDAuMTYpOyBjdXJzb3I6IGRlZmF1bHQ7XCIsXG4gICAgXCIuc3YtcG9wdXBfX2J1dHRvbjpkaXNhYmxlZDpob3ZlclwiOlxuICAgICAgXCJib3gtc2hhZG93OiAwcHggMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1wiLFxuICAgIFwiLnN2LXBvcHVwX19idXR0b24tLWFwcGx5XCI6IFwiYmFja2dyb3VuZC1jb2xvcjogIzE5YjM5NDsgY29sb3I6ICNmZmY7XCIsXG4gICAgXCIuc3YtcG9wdXBfX2J1dHRvbi0tYXBwbHk6ZGlzYWJsZWRcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzO1wiLFxuICAgIC8vZW8gcG9wdXBcbiAgICAvL2xpc3RcbiAgICBcIi5zdi1saXN0XCI6XG4gICAgICBcImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyBwYWRkaW5nOiAwOyBtYXJnaW46IDA7IGJhY2tncm91bmQ6ICNmZmZmZmY7IGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJzsgbGlzdC1zdHlsZS10eXBlOiBub25lO1wiLFxuICAgIFwiLnN2LWxpc3RfX2l0ZW1cIjpcbiAgICAgIFwid2lkdGg6IDEwMCU7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHBhZGRpbmc6IGNhbGMoMSAqIDhweCkgY2FsYygyICogOHB4KTsgY3Vyc29yOiBwb2ludGVyO1wiLFxuICAgIFwiLnN2LWxpc3RfX2l0ZW0taWNvblwiOlxuICAgICAgXCJmbG9hdDogbGVmdDsgd2lkdGg6IGNhbGMoMyAqIDhweCk7IGhlaWdodDogY2FsYygzICogOHB4KTsgbWFyZ2luLXJpZ2h0OiBjYWxjKDIgKiA4cHgpO1wiLFxuICAgIFwiLnN2LWxpc3RfX2l0ZW0taWNvbiBzdmdcIjogXCJkaXNwbGF5OiBibG9jaztcIixcbiAgICBcIi5zdi1saXN0X19pdGVtLWljb24gdXNlXCI6IFwiZmlsbDogIzkwOTA5MDtcIixcbiAgICBcIi5zdi1saXN0X19pdGVtOm5vdCguc3YtbGlzdF9faXRlbS0tc2VsZWN0ZWQpOmhvdmVyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMztcIixcbiAgICBcIi5zdi1saXN0X19pdGVtLS1zZWxlY3RlZFwiOiBcImJhY2tncm91bmQtY29sb3I6ICMxOWIzOTQ7IGNvbG9yOiAjZmZmO1wiLFxuICAgIFwiLnN2LWxpc3RfX2l0ZW0tLXNlbGVjdGVkIC5zdi1saXN0X19pdGVtLWljb24gdXNlXCI6IFwiZmlsbDogI2ZmZjtcIixcbiAgICBcIi5zdi1saXN0X19pdGVtLS1kaXNhYmxlZFwiOlxuICAgICAgXCJjb2xvcjogcmdiYSgyMiwgMjIsIDIyLCAwLjE2KTsgY3Vyc29yOiBkZWZhdWx0OyBwb2ludGVyLWV2ZW50czogbm9uZTtcIixcbiAgICBcIi5zdi1saXN0X19pdGVtIHNwYW5cIjogXCJ3aGl0ZS1zcGFjZTogbm93cmFwO1wiLFxuICAgIC8vZW8gbGlzdFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgTWVkaWE6IHsgW2tleTogc3RyaW5nXTogeyBtZWRpYTogc3RyaW5nOyBzdHlsZTogc3RyaW5nIH0gfSA9IHtcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0IC5zdi1xLWNvbC0xXCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X3FzdG4gZmllbGRzZXQgLnN2LXEtY29sLTJcIjoge1xuICAgICAgc3R5bGU6IFwid2lkdGg6IDEwMCU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldCAuc3YtcS1jb2wtM1wiOiB7XG4gICAgICBzdHlsZTogXCJ3aWR0aDogMTAwJTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0IC5zdi1xLWNvbC00XCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X3FzdG4gZmllbGRzZXQgLnN2LXEtY29sLTVcIjoge1xuICAgICAgc3R5bGU6IFwid2lkdGg6IDEwMCU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KVwiLFxuICAgIH0sXG5cbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAudGl0bGUtbGVmdFwiOiB7XG4gICAgICBzdHlsZTogXCJmbG9hdDogbm9uZTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gLnN2X3FfcmFkaW9ncm91cF9pbmxpbmUsIC5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC5zdl9xX2NoZWNrYm94X2lubGluZSwgLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gLnN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZVwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBibG9jaztcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGUgdGhlYWRcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogbm9uZTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGUgdGJvZHksIC5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnRhYmxlIHRyLCAuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZSB0ZFwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBibG9jaztcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGU6bm90KC5zdl9xX21hdHJpeCkgdGQ6YmVmb3JlXCI6IHtcbiAgICAgIHN0eWxlOiBcImNvbnRlbnQ6IGF0dHIodGl0bGUpO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS5zdl9xX21hdHJpeCB0ZDphZnRlclwiOiB7XG4gICAgICBzdHlsZTogXCJjb250ZW50OiBhdHRyKHRpdGxlKTsgcGFkZGluZy1sZWZ0OiAxZW1cIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gLnJhZGlvIGxhYmVsLCAuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAuY2hlY2tib3ggbGFiZWxcIjoge1xuICAgICAgc3R5bGU6IFwibGluZS1oZWlnaHQ6IDEycHg7IHZlcnRpY2FsLWFsaWduOiB0b3A7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9xc3RuIGxhYmVsLnN2X3FfbV9sYWJlbFwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBpbmxpbmU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jdXN0b21faGVhZGVyXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IG5vbmU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogMTMwMHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5zdl9oZWFkZXIgaDNcIjoge1xuICAgICAgc3R5bGU6IFwiZm9udC1zaXplOiAxLjVlbTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiAxMzAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnN2X2hlYWRlciBoMyBzcGFuXCI6IHtcbiAgICAgIHN0eWxlOiBcImZvbnQtc2l6ZTogMC43NWVtO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDcwMHB4KVwiLFxuICAgIH0sXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcF9jc3MgLnN2LXByb2dyZXNzX190ZXh0XCI6IHtcbiAgICAgIHN0eWxlOiBcIm1hcmdpbi1sZWZ0OiA4ZW07XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpXCIsXG4gICAgfSxcblxuICAgIFwiLnN2X3Jvd1wiOiB7XG4gICAgICBzdHlsZTogXCIgZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwO1wiLFxuICAgICAgbWVkaWE6IFwiQHN1cHBvcnRzIChkaXNwbGF5OiBmbGV4KVwiLFxuICAgIH0sXG5cbiAgICBcIi5zdi12dWUtcm93LWFkZGl0aW9uYWwtZGl2XCI6IHtcbiAgICAgIHN0eWxlOiBcIiBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGZsZXgtYmFzaXM6IDEwMCU7IHdpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQHN1cHBvcnRzIChkaXNwbGF5OiBmbGV4KVwiLFxuICAgIH0sXG5cbiAgICBcIi5zdi1yb3cgPiAuc3Ytcm93X19wYW5lbCwgLnN2LXJvd19fcXVlc3Rpb246bm90KDpsYXN0LWNoaWxkKVwiOiB7XG4gICAgICBzdHlsZTogXCJmbG9hdDogbGVmdDtcIixcbiAgICAgIG1lZGlhOlxuICAgICAgICBcIkBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKSwgKC1tcy1oaWdoLWNvbnRyYXN0OiBub25lKVwiLFxuICAgIH0sXG5cbiAgICBcIltkaXI9J3J0bCddLFtzdHlsZSo9J2RpcmVjdGlvbjpydGwnXSAuc3Ytcm93X19xdWVzdGlvbjpub3QoOmxhc3QtY2hpbGQpXCI6IHtcbiAgICAgIHN0eWxlOiBcImZsb2F0OiByaWdodDtcIixcbiAgICAgIG1lZGlhOlxuICAgICAgICBcIkBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKSwgKC1tcy1oaWdoLWNvbnRyYXN0OiBub25lKVwiLFxuICAgIH0sXG5cbiAgICBcIi5zdi1yb3cgPiAuc3Ytcm93X19wYW5lbCwgLnN2LXJvd19fcXVlc3Rpb25cIjoge1xuICAgICAgc3R5bGU6IFwid2lkdGg6IDEwMCUgIWltcG9ydGFudDsgcGFkZGluZy1yaWdodDogMCAhaW1wb3J0YW50O1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgVGhlbWVDb2xvcnM6IHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB9ID0ge1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmNGY0ZjRcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMxYWIzOTRcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMGFhMzg0XCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM2ZDcwNzJcIixcbiAgICAgIFwiJHRleHQtaW5wdXQtY29sb3JcIjogXCIjNmQ3MDcyXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjNmQ3MDcyXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIixcblxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGUtY29sb3JcIjogXCIjZGJkYmRiXCIsXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIixcbiAgICAgIFwiJGZvcmVncm91bmQtbGlnaHRcIjogXCIjOTA5MDkwXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWRpc2FibGVkXCI6IFwiIzE2MTYxNlwiLFxuICAgICAgXCIkYmFja2dyb3VuZC1kaW1cIjogXCIjZjNmM2YzXCIsXG4gICAgfSxcbiAgICBvcmFuZ2U6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmOGY4ZjhcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiNmNzgxMTlcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjZTc3MTA5XCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM0YTRhNGFcIixcbiAgICAgIFwiJHRleHQtaW5wdXQtY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjZjc4MTE5XCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIixcblxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGUtY29sb3JcIjogXCIjZGJkYmRiXCIsXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIixcbiAgICAgIFwiJGZvcmVncm91bmQtbGlnaHRcIjogXCIjOTA5MDkwXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWRpc2FibGVkXCI6IFwiIzE2MTYxNlwiLFxuICAgICAgXCIkYmFja2dyb3VuZC1kaW1cIjogXCIjZjNmM2YzXCIsXG4gICAgfSxcbiAgICBkYXJrYmx1ZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZDlkOGRkXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y2ZjdmMlwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzNjNGY2ZFwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiMyYzNmNWRcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkdGV4dC1pbnB1dC1jb2xvclwiOiBcIiM0YTRhNGFcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiM2ZDcwNzJcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiLFxuXG4gICAgICBcIiRwcm9ncmVzcy10ZXh0LWNvbG9yXCI6IFwiIzlkOWQ5ZFwiLFxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiLFxuICAgICAgXCIkZm9yZWdyb3VuZC1saWdodFwiOiBcIiM5MDkwOTBcIixcbiAgICAgIFwiJGZvcmVncm91bmQtZGlzYWJsZWRcIjogXCIjMTYxNjE2XCIsXG4gICAgICBcIiRiYWNrZ3JvdW5kLWRpbVwiOiBcIiNmM2YzZjNcIixcbiAgICB9LFxuICAgIGRhcmtyb3NlOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNkZGQyY2VcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjdlZmVkXCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjNjg2NTZlXCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzU4NTU1ZVwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiR0ZXh0LWlucHV0LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiIzZkNzA3MlwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWxpZ2h0XCI6IFwiIzkwOTA5MFwiLFxuICAgICAgXCIkZm9yZWdyb3VuZC1kaXNhYmxlZFwiOiBcIiMxNjE2MTZcIixcbiAgICAgIFwiJGJhY2tncm91bmQtZGltXCI6IFwiI2YzZjNmM1wiLFxuICAgIH0sXG4gICAgc3RvbmU6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2NkY2NkMlwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlZmVkZjRcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMwZjBmMzNcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMTkxOTU1XCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiMwZjBmMzNcIixcbiAgICAgIFwiJHRleHQtaW5wdXQtY29sb3JcIjogXCIjMGYwZjMzXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjMGYwZjMzXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIixcblxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGUtY29sb3JcIjogXCIjZGJkYmRiXCIsXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIixcbiAgICAgIFwiJGZvcmVncm91bmQtbGlnaHRcIjogXCIjOTA5MDkwXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWRpc2FibGVkXCI6IFwiIzE2MTYxNlwiLFxuICAgICAgXCIkYmFja2dyb3VuZC1kaW1cIjogXCIjZjNmM2YzXCIsXG4gICAgfSxcbiAgICB3aW50ZXI6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiIzgyYjhkYVwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNkYWUxZTdcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMzYzNiNDBcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMWUxZDIwXCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgIFwiJHRleHQtaW5wdXQtY29sb3JcIjogXCIjMDAwXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjMDAwXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIixcblxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIixcbiAgICAgIFwiJGZvcmVncm91bmQtbGlnaHRcIjogXCIjOTA5MDkwXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWRpc2FibGVkXCI6IFwiIzE2MTYxNlwiLFxuICAgICAgXCIkYmFja2dyb3VuZC1kaW1cIjogXCIjZjNmM2YzXCIsXG4gICAgfSxcbiAgICB3aW50ZXJzdG9uZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjMzIzMjMyXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y4ZjhmOFwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzVhYzhmYVwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiMwNmExZTdcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzAwMFwiLFxuICAgICAgXCIkdGV4dC1pbnB1dC1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiNmZmZcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiLFxuXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiLFxuICAgICAgXCIkZm9yZWdyb3VuZC1saWdodFwiOiBcIiM5MDkwOTBcIixcbiAgICAgIFwiJGZvcmVncm91bmQtZGlzYWJsZWRcIjogXCIjMTYxNjE2XCIsXG4gICAgICBcIiRiYWNrZ3JvdW5kLWRpbVwiOiBcIiNmM2YzZjNcIixcbiAgICB9LFxuICAgIG1vZGVybjoge1xuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMxYWIzOTRcIixcbiAgICAgIFwiJGFkZC1idXR0b24tY29sb3JcIjogXCIjMTk0OGIzXCIsXG4gICAgICBcIiRyZW1vdmUtYnV0dG9uLWNvbG9yXCI6IFwiI2ZmMTgwMFwiLFxuICAgICAgXCIkZGlzYWJsZS1jb2xvclwiOiBcIiNkYmRiZGJcIixcbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIixcbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2Q1MjkwMVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM0MDQwNDBcIixcbiAgICAgIFwiJGxpZ2h0LXRleHQtY29sb3JcIjogXCIjZmZmXCIsXG4gICAgICBcIiRidXR0b24tdGV4dC1jb2xvclwiOiBcIiNmZmZcIixcbiAgICAgIFwiJGNoZWNrbWFyay1jb2xvclwiOiBcIiNmZmZcIixcbiAgICAgIFwiJG1hdHJpeC10ZXh0LWNoZWNrZWQtY29sb3JcIjogXCIjZmZmXCIsXG5cbiAgICAgIFwiJHRleHQtaW5wdXQtY29sb3JcIjogXCIjNDA0MDQwXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmNGY0ZjRcIixcbiAgICAgIFwiJHRleHQtYm9yZGVyLWNvbG9yXCI6IFwiI2Q0ZDRkNFwiLFxuICAgICAgXCIkZGlzYWJsZWQtdGV4dC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwicmdiKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJGRyb3Bkb3duLWJvcmRlci1jb2xvclwiOiBcIiNkNGQ0ZDRcIixcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuICAgICAgXCIkYW5zd2VyLWJhY2tncm91bmQtY29sb3JcIjogXCJyZ2JhKDI2LCAxNzksIDE0OCwgMC4yKVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcInJnYmEoMjEzLCA0MSwgMSwgMC4yKVwiLFxuICAgICAgXCIkcmFkaW8tY2hlY2tlZC1jb2xvclwiOiBcIiM0MDQwNDBcIixcbiAgICAgIFwiJGNsZWFuLWJ1dHRvbi1jb2xvclwiOiBcIiMxOTQ4YjNcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZmZmZmZcIixcbiAgICAgIFwiJGZvcmVncm91bmQtbGlnaHRcIjogXCIjOTA5MDkwXCIsXG4gICAgICBcIiRmb3JlZ3JvdW5kLWRpc2FibGVkXCI6IFwiIzE2MTYxNlwiLFxuICAgICAgXCIkYmFja2dyb3VuZC1kaW1cIjogXCIjZjNmM2YzXCIsXG4gICAgfSxcbiAgICBib290c3RyYXA6IHtcbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjMThhNjg5XCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzQwNDA0MDtcIixcbiAgICAgIFwiJHRleHQtaW5wdXQtY29sb3JcIjogXCIjNDA0MDQwO1wiLFxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGUtY29sb3JcIjogXCIjZGJkYmRiXCIsXG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlN2U3ZTdcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiLFxuICAgICAgXCIkZm9yZWdyb3VuZC1saWdodFwiOiBcIiM5MDkwOTBcIixcbiAgICAgIFwiJGZvcmVncm91bmQtZGlzYWJsZWRcIjogXCIjMTYxNjE2XCIsXG4gICAgICBcIiRiYWNrZ3JvdW5kLWRpbVwiOiBcIiNmM2YzZjNcIixcbiAgICB9LFxuICAgIGJvb3RzdHJhcG1hdGVyaWFsOiB7XG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzE4YTY4OVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM0MDQwNDA7XCIsXG4gICAgICBcIiR0ZXh0LWlucHV0LWNvbG9yXCI6IFwiIzQwNDA0MDtcIixcbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgXCIkZm9yZWdyb3VuZC1saWdodFwiOiBcIiM5MDkwOTBcIixcbiAgICAgIFwiJGZvcmVncm91bmQtZGlzYWJsZWRcIjogXCIjMTYxNjE2XCIsXG4gICAgICBcIiRiYWNrZ3JvdW5kLWRpbVwiOiBcIiNmM2YzZjNcIixcbiAgICB9LFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgVGhlbWVDc3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgXCIuc3ZfZGVmYXVsdF9jc3NcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIGhyXCI6IFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXRbdHlwZT0nYnV0dG9uJ10sIC5zdl9kZWZhdWx0X2NzcyBidXR0b25cIjpcbiAgICAgIFwiY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIGlucHV0W3R5cGU9J2J1dHRvbiddOmhvdmVyLCAuc3ZfZGVmYXVsdF9jc3MgYnV0dG9uOmhvdmVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X2hlYWRlclwiOiBcImNvbG9yOiAkaGVhZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9jdXN0b21faGVhZGVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRoZWFkZXItYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfY29udGFpbmVyXCI6IFwiY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9ib2R5XCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7IGJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Byb2dyZXNzXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcHJvZ3Jlc3NfYmFyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcF9yb290ID4gLnN2X3Jvd1wiOiBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcF9yb290ID4gLnN2X3JvdzpudGgtY2hpbGQob2RkKVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wX3Jvb3QgPiAuc3Zfcm93Om50aC1jaGlsZChldmVuKVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX290aGVyIGlucHV0XCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1jb2xvcjsgLXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV90ZXh0X3Jvb3RcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyAtd2Via2l0LXRleHQtZmlsbC1jb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX2Ryb3Bkb3duX2NvbnRyb2xcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWlucHV0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSd0ZXh0J11cIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyAtd2Via2l0LXRleHQtZmlsbC1jb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHNlbGVjdFwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRleHRhcmVhXCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1pbnB1dC1jb2xvcjsgLXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6ICR0ZXh0LWlucHV0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dDpub3QoW3R5cGU9J2J1dHRvbiddKTpub3QoW3R5cGU9J3Jlc2V0J10pOm5vdChbdHlwZT0nc3VibWl0J10pOm5vdChbdHlwZT0naW1hZ2UnXSk6bm90KFt0eXBlPSdjaGVja2JveCddKTpub3QoW3R5cGU9J3JhZGlvJ10pXCI6XG4gICAgICBcImJvcmRlcjogMXB4IHNvbGlkICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtjb2xvcjogJHRleHQtaW5wdXQtY29sb3I7IC13ZWJraXQtdGV4dC1maWxsLWNvbG9yOiAkdGV4dC1pbnB1dC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dDpub3QoW3R5cGU9J2J1dHRvbiddKTpub3QoW3R5cGU9J3Jlc2V0J10pOm5vdChbdHlwZT0nc3VibWl0J10pOm5vdChbdHlwZT0naW1hZ2UnXSk6bm90KFt0eXBlPSdjaGVja2JveCddKTpub3QoW3R5cGU9J3JhZGlvJ10pOmZvY3VzXCI6XG4gICAgICBcImJvcmRlcjogMXB4IHNvbGlkICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9jb250YWluZXIgLnN2X2JvZHkgLnN2X3Bfcm9vdCAuc3ZfcSAuc3Zfc2VsZWN0X3dyYXBwZXIgLnN2X3FfZHJvcGRvd25fY29udHJvbCBcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX290aGVyIGlucHV0OmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV90ZXh0X3Jvb3Q6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX2Ryb3Bkb3duX2NvbnRyb2w6Zm9jdXNcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSd0ZXh0J106Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgICcuc3ZfZGVmYXVsdF9jc3MgLnN2X2NvbnRhaW5lciAuc3ZfYm9keSAuc3ZfcF9yb290IC5zdl9xIGlucHV0W3R5cGU9XCJyYWRpb1wiXTpmb2N1cywgLnN2X2RlZmF1bHRfY3NzIC5zdl9jb250YWluZXIgLnN2X2JvZHkgLnN2X3Bfcm9vdCAuc3ZfcSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Zm9jdXMnOlxuICAgICAgXCJvdXRsaW5lOiAxcHggZG90dGVkICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHNlbGVjdDpmb2N1c1wiOiBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGV4dGFyZWE6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3NlbGVjdF93cmFwcGVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3NlbGVjdF93cmFwcGVyOjpiZWZvcmVcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9yYXRpbmdfaXRlbS5hY3RpdmUgLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfcmF0aW5nX2l0ZW0gLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfcmF0aW5nX2l0ZW0gLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dDpob3ZlclwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGFibGUuc3ZfcV9tYXRyaXggdHJcIjogXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGFibGUuc3ZfcV9tYXRyaXhfZHJvcGRvd24gdHJcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRhYmxlLnN2X3FfbWF0cml4X2R5bmFtaWMgdHJcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfbV9jZWxsX3NlbGVjdGVkXCI6XG4gICAgICBcImNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X21haW4gLnN2X3FfZmlsZV9yZW1vdmU6aG92ZXJcIjogXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9maWxlX2Nob29zZV9idXR0b25cIjpcbiAgICAgIFwiY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3FfZmlsZV9jaG9vc2VfYnV0dG9uOmhvdmVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9pbWdzZWwuY2hlY2tlZCBsYWJlbD5kaXZcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvclwiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3BfZGVzY3JpcHRpb25cIjogXCJwYWRkaW5nLWxlZnQ6IDEuMjllbTtcIixcbiAgICAvL3Byb2dyZXNzIGJhclxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzX19iYXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcblxuICAgIC8vcGFuZWxkeW5hbWljXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLS1kaXNhYmxlZCwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4uc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi0tZGlzYWJsZWRcIjpcbiAgICAgIFwiZmlsbDogJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy10ZXh0XCI6IFwiY29sb3I6ICRwcm9ncmVzcy10ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4sIC5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuXCI6XG4gICAgICBcImZpbGw6ICR0ZXh0LWNvbG9yXCIsXG5cbiAgICAvL2Jvb2xlYW5cbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zd2l0Y2hcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zbGlkZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkc2xpZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiOiBcImNvbG9yOiAkZGlzYWJsZWQtbGFiZWwtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0tZGlzYWJsZWQgLnN2LWJvb2xlYW5fX3N3aXRjaFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZWQtc3dpdGNoLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4tLWRpc2FibGVkIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXNsaWRlci1jb2xvcjtcIixcbiAgICAvL2VvIGJvb2xlYW5cblxuICAgIC8vc2lnbmF0dXJlIHBhZFxuICAgIFwiLnN2X21haW4gLnNqc19zcF9jb250YWluZXJcIjogXCJib3JkZXI6IDFweCBkYXNoZWQgJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX3BsYWNlaG9sZGVyXCI6IFwiY29sb3I6ICRmb3JlZ3JvdW5kLWxpZ2h0O1wiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3ZfbWF0cml4X2RldGFpbF9yb3dcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogI2VkZWRlZDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICRoZWFkZXItYmFja2dyb3VuZC1jb2xvcjsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRoZWFkZXItYmFja2dyb3VuZC1jb2xvcjtcIixcblxuICAgIC8vYWN0aW9uLWJhclxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXItaXRlbVwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tYmFyLWl0ZW1fX2ljb24gdXNlXCI6IFwiZmlsbDogJGZvcmVncm91bmQtbGlnaHQ7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYWN0aW9uLWJhci1pdGVtOmhvdmVyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGJhY2tncm91bmQtZGltO1wiLFxuICAgIC8vZW8gYWN0aW9uLWJhclxuXG4gICAgLy9idXR0b24tZ3JvdXBcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0tLWhvdmVyOmhvdmVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kLWRpbTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0taWNvbiB1c2VcIjogXCJmaWxsOiAkZm9yZWdyb3VuZC1saWdodDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0tLXNlbGVjdGVkXCI6IFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJ1dHRvbi1ncm91cF9faXRlbS0tc2VsZWN0ZWQgLnN2LWJ1dHRvbi1ncm91cF9faXRlbS1pY29uIHVzZVwiOlxuICAgICAgXCJmaWxsOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW0tLWRpc2FibGVkXCI6IFwiY29sb3I6ICRmb3JlZ3JvdW5kLWRpc2FibGVkO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJ1dHRvbi1ncm91cF9faXRlbS0tZGlzYWJsZWQgLnN2LWJ1dHRvbi1ncm91cF9faXRlbS1pY29uIHVzZVwiOlxuICAgICAgXCJmaWxsOiAkZm9yZWdyb3VuZC1kaXNhYmxlZDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1idXR0b24tZ3JvdXBfX2l0ZW1cIjpcbiAgICAgIFwiYmFja2dyb3VuZDogJGJvZHktYmFja2dyb3VuZC1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuXG4gICAgLy9lbyBidXR0b24tZ3JvdXBcblxuICAgIFwiLnN2X21haW4gLnN2X3FzdG4gdGV4dGFyZWFcIjogXCJtYXgtd2lkdGg6IDEwMCVcIixcblxuICAgIFwiLnN2X21haW4gLnN2LW1hdHJpeGR5bmFtaWNfX2RyYWctaWNvblwiOiBcInBhZGRpbmctdG9wOjE0cHhcIixcbiAgICBcIi5zdl9tYWluIC5zdi1tYXRyaXhkeW5hbWljX19kcmFnLWljb246YWZ0ZXJcIjpcbiAgICAgIFwiY29udGVudDogJyAnOyBkaXNwbGF5OiBibG9jazsgaGVpZ2h0OiA0cHg7IHdpZHRoOiAxNnB4OyBib3JkZXI6IDFweCBzb2xpZCAkYm9yZGVyLWNvbG9yOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBib3JkZXItcmFkaXVzOiAxMHB4OyBjdXJzb3I6IG1vdmU7XCIsXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBtb2Rlcm5UaGVtZUNzczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAvLyBcIi5zdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYWRkLWJ1dHRvbi1jb2xvcjtcIixcbiAgICAvLyBcIi5zdi1wYW5lbGR5bmFtaWNfX3JlbW92ZS1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkcmVtb3ZlLWJ1dHRvbi1jb2xvcjtcIixcbiAgICBcIi5zdi1ib29sZWFuX19zd2l0Y2hcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1ib29sZWFuX19zbGlkZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkc2xpZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiOiBcImNvbG9yOiAkZGlzYWJsZWQtbGFiZWwtY29sb3I7XCIsXG4gICAgXCIuc3YtYm9vbGVhbi0tZGlzYWJsZWQgLnN2LWJvb2xlYW5fX3N3aXRjaFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZWQtc3dpdGNoLWNvbG9yO1wiLFxuICAgIFwiLnN2LWJvb2xlYW4tLWRpc2FibGVkIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXNsaWRlci1jb2xvcjtcIixcblxuICAgIFwiLnN2LWJ0blwiOiBcImNvbG9yOiAkYnV0dG9uLXRleHQtY29sb3I7XCIsXG4gICAgXCIuc3YtY2hlY2tib3hfX3N2Z1wiOiBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgZmlsbDogdHJhbnNwYXJlbnQ7XCIsXG4gICAgXCIuc3YtY2hlY2tib3gtLWFsbG93aG92ZXI6aG92ZXIgLnN2LWNoZWNrYm94X19zdmdcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGZpbGw6ICRjaGVja21hcmstY29sb3I7XCIsXG4gICAgXCIuc3YtY2hlY2tib3gtLWNoZWNrZWQgLnN2LWNoZWNrYm94X19zdmdcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGZpbGw6ICRjaGVja21hcmstY29sb3I7XCIsXG4gICAgXCIuc3YtY2hlY2tib3gtLWNoZWNrZWQuc3YtY2hlY2tib3gtLWRpc2FibGVkIC5zdi1jaGVja2JveF9fc3ZnXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlLWNvbG9yOyBmaWxsOiAkY2hlY2ttYXJrLWNvbG9yO1wiLFxuICAgIFwiLnN2LWNoZWNrYm94LS1kaXNhYmxlZCAuc3YtY2hlY2tib3hfX3N2Z1wiOiBcImJvcmRlci1jb2xvcjogJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc3YtY29tbWVudFwiOiBcImJvcmRlci1jb2xvcjogJHRleHQtYm9yZGVyLWNvbG9yOyBtYXgtd2lkdGg6IDEwMCU7XCIsXG4gICAgXCIuc3YtY29tbWVudDpmb2N1c1wiOiBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtY29tcGxldGVkcGFnZVwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2LWNvbnRhaW5lci1tb2Rlcm5cIjogXCJjb2xvcjogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3YtY29udGFpbmVyLW1vZGVybl9fdGl0bGVcIjogXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtZGVzY3JpcHRpb25cIjogXCJjb2xvcjogJGRpc2FibGVkLXRleHQtY29sb3I7XCIsXG4gICAgXCIuc3YtZHJvcGRvd25cIjogXCJib3JkZXItYm90dG9tOiAwLjA2ZW0gc29saWQgJHRleHQtYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2LWRyb3Bkb3duOmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkZHJvcGRvd24tYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2LWRyb3Bkb3duLS1lcnJvclwiOiBcImJvcmRlci1jb2xvcjogJGVycm9yLWNvbG9yOyBjb2xvcjogJGVycm9yLWNvbG9yO1wiLFxuICAgIFwiLnN2LWRyb3Bkb3duLS1lcnJvcjo6cGxhY2Vob2xkZXJcIjogXCJjb2xvcjogJGVycm9yLWNvbG9yO1wiLFxuICAgIFwiLnN2LWRyb3Bkb3duLS1lcnJvcjo6LW1zLWlucHV0LXBsYWNlaG9sZGVyXCI6IFwiY29sb3I6ICRlcnJvci1jb2xvcjtcIixcbiAgICBcIi5zdi1maWxlX19kZWNvcmF0b3JcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3YtZmlsZV9fY2xlYW4tYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJHJlbW92ZS1idXR0b24tY29sb3I7XCIsXG4gICAgXCIuc3YtZmlsZV9fY2hvb3NlLWJ0bjpub3QoLnN2LWZpbGVfX2Nob29zZS1idG4tLWRpc2FibGVkKVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYWRkLWJ1dHRvbi1jb2xvcjtcIixcbiAgICBcIi5zdi1maWxlX19jaG9vc2UtYnRuLS1kaXNhYmxlZFwiOiBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2LWZpbGVfX3JlbW92ZS1zdmdcIjogXCJmaWxsOiAjZmYxODAwO1wiLFxuICAgIFwiLnN2LWZpbGVfX3NpZ24gYVwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdi1mb290ZXJfX2NvbXBsZXRlLWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LWZvb3Rlcl9fbmV4dC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1mb290ZXJfX3ByZXYtYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtZm9vdGVyX19zdGFydC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1mb290ZXJfX3ByZXZpZXctYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtZm9vdGVyX19lZGl0LWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LWltYWdlcGlja2VyX19pdGVtLS1hbGxvd2hvdmVyOmhvdmVyIC5zdi1pbWFnZXBpY2tlcl9faW1hZ2VcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGJvcmRlci1jb2xvcjogJG1haW4taG92ZXItY29sb3I7XCIsXG4gICAgXCIuc3YtaW1hZ2VwaWNrZXJfX2l0ZW0tLWNoZWNrZWQgLnN2LWltYWdlcGlja2VyX19pbWFnZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1pbWFnZXBpY2tlcl9faXRlbS0tZGlzYWJsZWQuc3YtaW1hZ2VwaWNrZXJfX2l0ZW0tLWNoZWNrZWQgLnN2LWltYWdlcGlja2VyX19pbWFnZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdi1pdGVtX19jb250cm9sOmZvY3VzICsgLnN2LWl0ZW1fX2RlY29yYXRvclwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LW1hdHJpeF9fdGV4dC0tY2hlY2tlZFwiOlxuICAgICAgXCJjb2xvcjogJG1hdHJpeC10ZXh0LWNoZWNrZWQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LW1hdHJpeF9fdGV4dC0tZGlzYWJsZWQuc3YtbWF0cml4X190ZXh0LS1jaGVja2VkXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2LW1hdHJpeGR5bmFtaWNfX2FkZC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYWRkLWJ1dHRvbi1jb2xvcjtcIixcbiAgICBcIi5zdi1tYXRyaXhkeW5hbWljX19yZW1vdmUtYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJHJlbW92ZS1idXR0b24tY29sb3I7XCIsXG4gICAgXCIuc3YtbWF0cml4ZHluYW1pY19fZHJhZy1pY29uXCI6IFwicGFkZGluZy10b3A6MTZweFwiLFxuICAgIFwiLnN2LW1hdHJpeGR5bmFtaWNfX2RyYWctaWNvbjphZnRlclwiOlxuICAgICAgXCJjb250ZW50OiAnICc7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDRweDsgd2lkdGg6IDE2cHg7IGJvcmRlcjogMXB4IHNvbGlkICRib3JkZXItY29sb3I7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGN1cnNvcjogbW92ZTtcIixcbiAgICBcIi5zdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYWRkLWJ1dHRvbi1jb2xvcjtcIixcbiAgICBcIi5zdi1wYW5lbGR5bmFtaWNfX3JlbW92ZS1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkcmVtb3ZlLWJ1dHRvbi1jb2xvcjtcIixcbiAgICBcIi5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLCAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0blwiOlxuICAgICAgXCJmaWxsOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLS1kaXNhYmxlZCwgLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4tLWRpc2FibGVkXCI6XG4gICAgICBcImZpbGw6ICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiOiBcImNvbG9yOiAkcHJvZ3Jlc3MtdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdi1wcm9ncmVzc1wiOiBcImJhY2tncm91bmQtY29sb3I6ICRoZWFkZXItYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdi1wcm9ncmVzc19fYmFyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtcHJvZ3Jlc3NfX3RleHRcIjogXCJjb2xvcjogJHByb2dyZXNzLXRleHQtY29sb3I7XCIsXG4gICAgXCIuc3YtcXVlc3Rpb25fX2VyYm94XCI6IFwiY29sb3I6ICRlcnJvci1jb2xvcjtcIixcbiAgICBcIi5zdi1xdWVzdGlvbl9fdGl0bGUtLWFuc3dlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYW5zd2VyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3YtcXVlc3Rpb25fX3RpdGxlLS1lcnJvclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2LXBhbmVsX190aXRsZS0tZXJyb3JcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZXJyb3ItYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdi1yYWRpb19fc3ZnXCI6IFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yOyBmaWxsOiB0cmFuc3BhcmVudDtcIixcbiAgICBcIi5zdi1yYWRpby0tYWxsb3dob3Zlcjpob3ZlciAuc3YtcmFkaW9fX3N2Z1wiOiBcImZpbGw6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3YtcmFkaW8tLWNoZWNrZWQgLnN2LXJhZGlvX19zdmdcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkcmFkaW8tY2hlY2tlZC1jb2xvcjsgZmlsbDogJHJhZGlvLWNoZWNrZWQtY29sb3I7XCIsXG4gICAgXCIuc3YtcmFkaW8tLWRpc2FibGVkIC5zdi1yYWRpb19fc3ZnXCI6IFwiYm9yZGVyLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdi1yYWRpby0tZGlzYWJsZWQuc3YtcmFkaW8tLWNoZWNrZWQgLnN2LXJhZGlvX19zdmdcIjpcbiAgICAgIFwiZmlsbDogJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc3YtcmF0aW5nXCI6IFwiY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2LXJhdGluZyBpbnB1dDpmb2N1cyArIC5zdi1yYXRpbmdfX21pbi10ZXh0ICsgLnN2LXJhdGluZ19faXRlbS10ZXh0LCAuc3YtcmF0aW5nIGlucHV0OmZvY3VzICsgLnN2LXJhdGluZ19faXRlbS10ZXh0XCI6XG4gICAgICBcIm91dGxpbmUtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LXJhdGluZ19faXRlbS10ZXh0XCI6XG4gICAgICBcImNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgYm9yZGVyOiBzb2xpZCAwLjE4NzVlbSAkbWFpbi1ob3Zlci1jb2xvcjtcIixcbiAgICBcIi5zdi1yYXRpbmdfX2l0ZW0tdGV4dDpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3YtcmF0aW5nX19pdGVtLS1zZWxlY3RlZCAuc3YtcmF0aW5nX19pdGVtLXRleHRcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LXJhdGluZy0tZGlzYWJsZWQgLnN2LXJhdGluZ19faXRlbS10ZXh0XCI6XG4gICAgICBcImNvbG9yOiAkZGlzYWJsZS1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdi1yYXRpbmctLWRpc2FibGVkIC5zdi1yYXRpbmdfX2l0ZW0tdGV4dDpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcIixcbiAgICBcIi5zdi1yYXRpbmctLWRpc2FibGVkIC5zdi1yYXRpbmdfX2l0ZW0tdGV4dDpob3ZlciAuc3YtcmF0aW5nX19pdGVtLS1zZWxlY3RlZCAuc3YtcmF0aW5nX19pdGVtLXRleHRcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGUtY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiOjotd2Via2l0LXNjcm9sbGJhclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuICAgIFwiOjotd2Via2l0LXNjcm9sbGJhci10aHVtYlwiOiBcImJhY2tncm91bmQ6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LXNlbGVjdGJhc2VfX2NsZWFyLWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRjbGVhbi1idXR0b24tY29sb3I7XCIsXG4gICAgXCIuc3YtdGFibGVcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCRtYWluLWhvdmVyLWNvbG9yLCAwLjEpO1wiLFxuICAgIFwiLnN2LXRleHQ6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgICcuc3YtdGV4dFt0eXBlPVwiZGF0ZVwiXTo6LXdlYmtpdC1jYWxlbmRhci1waWNrZXItaW5kaWNhdG9yJzpcbiAgICAgIFwiY29sb3I6IHRyYW5zcGFyZW50OyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcIixcbiAgICBcIi5zdi10ZXh0LS1lcnJvclwiOiBcImNvbG9yOiAkZXJyb3ItY29sb3I7IGJvcmRlci1jb2xvcjogJGVycm9yLWNvbG9yO1wiLFxuICAgIFwiLnN2LXRleHQtLWVycm9yOjpwbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkZXJyb3ItY29sb3I7XCIsXG4gICAgXCIuc3YtdGV4dC0tZXJyb3I6Oi1tcy1wbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkZXJyb3ItY29sb3I7XCIsXG4gICAgXCIuc3YtdGV4dC0tZXJyb3I6LW1zLXBsYWNlaG9sZGVyXCI6IFwiY29sb3I6ICRlcnJvci1jb2xvcjtcIixcbiAgICBcImlucHV0LnN2LXRleHQsIHRleHRhcmVhLnN2LWNvbW1lbnQsIHNlbGVjdC5zdi1kcm9wZG93blwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtaW5wdXQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdi10ZXh0OjpwbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkdGV4dC1pbnB1dC1jb2xvcjtcIixcbiAgICBcIi5zdi10ZXh0OjotbXMtcGxhY2Vob2xkZXJcIjogXCJjb2xvcjogJHRleHQtaW5wdXQtY29sb3I7XCIsXG4gICAgXCIuc3YtdGV4dDotbXMtcGxhY2Vob2xkZXJcIjogXCJjb2xvcjogJHRleHQtaW5wdXQtY29sb3I7XCIsXG4gICAgXCIuc3YtdGFibGVfX3Jvdy0tZGV0YWlsXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIC8vc2lnbmF0dXJlIHBhZFxuICAgIFwiLnNqc19zcF9jb250YWluZXJcIjogXCJib3JkZXI6IDFweCBkYXNoZWQgJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc2pzX3NwX3BsYWNlaG9sZGVyXCI6IFwiY29sb3I6ICRmb3JlZ3JvdW5kLWxpZ2h0O1wiLFxuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgYm9vdHN0cmFwVGhlbWVDc3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9pbWdzZWwuY2hlY2tlZCBsYWJlbD5kaXZcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvclwiLFxuICAgIFwiLnN2X21haW4gLnN2X3BfZGVzY3JpcHRpb25cIjogXCJwYWRkaW5nLWxlZnQ6IDEuNjZlbTtcIixcbiAgICBcIi5zdl9tYWluIC5zdl9xc3RuX2Vycm9yX2JvdHRvbVwiOiBcIm1hcmdpbi10b3A6IDIwcHg7IG1hcmdpbi1ib3R0b206IDA7XCIsXG4gICAgXCIuc3ZfbWFpbiAucHJvZ3Jlc3NcIjogXCJ3aWR0aDogNjAlO1wiLFxuICAgIFwiLnN2X21haW4gLnByb2dyZXNzLWJhclwiOlxuICAgICAgXCJ3aWR0aDogYXV0bzsgbWFyZ2luLWxlZnQ6IDJweDsgbWFyZ2luLXJpZ2h0OiAycHg7XCIsXG4gICAgXCIuc3ZfbWFpbiAudGFibGU+dGJvZHk+dHI+dGRcIjogXCJtaW4td2lkdGg6IDkwcHg7XCIsXG4gICAgXCIuc3ZfbWFpbiBmLXBhbmVsIC5zdl9xc3RuXCI6IFwicGFkZGluZzogMDsgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcIixcblxuICAgIFwiLnN2X21haW4gLnN2X3FfaW1hZ2VcIjogXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3Zfcm93IC5zdl9xc3RuOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGRcIjpcbiAgICAgIFwiZmxleDogbm9uZSAhaW1wb3J0YW50O1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3JvdyAuc3ZfcF9jb250YWluZXI6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZFwiOlxuICAgICAgXCJmbGV4OiBub25lICFpbXBvcnRhbnQ7XCIsXG5cbiAgICAvL3Byb2dyZXNzIGJhclxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzX19iYXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcblxuICAgIC8vcGFuZWxkeW5hbWljXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLS1kaXNhYmxlZCwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4uc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi0tZGlzYWJsZWRcIjpcbiAgICAgIFwiZmlsbDogJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy10ZXh0XCI6IFwiY29sb3I6ICRwcm9ncmVzcy10ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4sIC5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuXCI6XG4gICAgICBcImZpbGw6ICR0ZXh0LWNvbG9yXCIsXG5cbiAgICAvL2Jvb2xlYW5cbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zd2l0Y2hcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zbGlkZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkc2xpZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiOiBcImNvbG9yOiAkZGlzYWJsZWQtbGFiZWwtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0tZGlzYWJsZWQgLnN2LWJvb2xlYW5fX3N3aXRjaFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZWQtc3dpdGNoLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4tLWRpc2FibGVkICAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlZC1zbGlkZXItY29sb3I7XCIsXG4gICAgLy9lbyBib29sZWFuXG5cbiAgICAvL3NpZ25hdHVyZSBwYWRcbiAgICBcIi5zdl9tYWluIC5zanNfc3BfY29udGFpbmVyXCI6IFwiYm9yZGVyOiAxcHggZGFzaGVkICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnNqc19zcF9wbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkZm9yZWdyb3VuZC1saWdodDtcIixcblxuICAgIFwiLnN2X21haW4gLnN2X21hdHJpeF9kZXRhaWxfcm93XCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICNlZGVkZWQ7IGJvcmRlci10b3A6IDFweCBzb2xpZCAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG5cbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tYmFyLWl0ZW1cIjogXCJjb2xvcjogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYWN0aW9uLWJhci1pdGVtX19pY29uIHVzZVwiOiBcImZpbGw6ICRmb3JlZ3JvdW5kLWxpZ2h0O1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXItaXRlbTpob3ZlclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kLWRpbTtcIixcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIGJvb3RzdHJhcG1hdGVyaWFsVGhlbWVDc3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmZvcm0tZ3JvdXAuaXMtZm9jdXNlZCAuZm9ybS1jb250cm9sXCI6XG4gICAgICBcImxpbmVhci1ncmFkaWVudCgwZGVnLCAkbWFpbi1jb2xvciAycHgsICRtYWluLWNvbG9yIDApLGxpbmVhci1ncmFkaWVudCgwZGVnLCAjRDJEMkQyIDFweCwgdHJhbnNwYXJlbnQgMCk7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnN2X3FzdG5cIjogXCJtYXJnaW4tYm90dG9tOiAxcmVtO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5zdl9xc3RuIGxhYmVsLnN2X3FfbV9sYWJlbFwiOlxuICAgICAgXCJoZWlnaHQ6IDEwMCU7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcV9pbWFnZVwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9tYWluIC5zdl9yb3cgLnN2X3FzdG46Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZFwiOlxuICAgICAgXCJmbGV4OiBub25lICFpbXBvcnRhbnQ7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3Zfcm93IC5zdl9wX2NvbnRhaW5lcjpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkXCI6XG4gICAgICBcImZsZXg6IG5vbmUgIWltcG9ydGFudDtcIixcblxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5jaGVja2JveCBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVja1wiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGxhYmVsLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVja1wiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5jaGVja2JveCBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVjazpiZWZvcmVcIjpcbiAgICAgIFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGxhYmVsLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVjazpiZWZvcmVcIjpcbiAgICAgIFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnJhZGlvIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2lyY2xlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwucmFkaW8taW5saW5lIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2lyY2xlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnJhZGlvIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2hlY2tcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwucmFkaW8taW5saW5lIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2hlY2tcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmJ0bi1kZWZhdWx0LmFjdGl2ZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmJ0bi1kZWZhdWx0OmFjdGl2ZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmJ0bi1zZWNvbmRhcnkuYWN0aXZlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yOyBjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLXNlY29uZGFyeTphY3RpdmVcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWRlZmF1bHRcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGlucHV0W3R5cGU9J2J1dHRvbiddLmJ0bi1wcmltYXJ5LCAuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgYnV0dG9uLmJ0bi1wcmltYXJ5XCI6XG4gICAgICBcImNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBpbnB1dFt0eXBlPSdidXR0b24nXS5idG4tcHJpbWFyeTpob3ZlciwgLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGJ1dHRvbi5idG4tcHJpbWFyeTpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdl9xX2ltZ3NlbC5jaGVja2VkIGxhYmVsPmRpdlwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnN2X3FfZmlsZV9yZW1vdmU6aG92ZXJcIjpcbiAgICAgIFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmZvcm0tZ3JvdXAgaW5wdXRbdHlwZT1maWxlXVwiOlxuICAgICAgXCJwb3NpdGlvbjogcmVsYXRpdmU7IG9wYWNpdHk6IDE7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnByb2dyZXNzXCI6IFwid2lkdGg6IDYwJTsgaGVpZ2h0OiAxLjVlbTtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAucHJvZ3Jlc3MtYmFyXCI6XG4gICAgICBcIndpZHRoOiBhdXRvOyBtYXJnaW4tbGVmdDogMnB4OyBtYXJnaW4tcmlnaHQ6IDJweDtcIixcblxuICAgIC8vcHJvZ3Jlc3MgYmFyXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NfX2JhclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgLy9wYW5lbGR5bmFtaWNcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4tLWRpc2FibGVkLCAuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuLS1kaXNhYmxlZFwiOlxuICAgICAgXCJmaWxsOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIjogXCJjb2xvcjogJHByb2dyZXNzLXRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0biwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIjpcbiAgICAgIFwiZmlsbDogJHRleHQtY29sb3JcIixcblxuICAgIC8vYm9vbGVhblxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4gLmNoZWNrYm94LWRlY29yYXRvclwiOiBcImRpc3BsYXk6IG5vbmU7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJHNsaWRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19sYWJlbC5zdi1ib29sZWFuX19sYWJlbC0tZGlzYWJsZWRcIjpcbiAgICAgIFwiY29sb3I6ICRkaXNhYmxlZC1sYWJlbC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19sYWJlbFwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuLS1kaXNhYmxlZCAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlZC1zd2l0Y2gtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0tZGlzYWJsZWQgIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXNsaWRlci1jb2xvcjtcIixcbiAgICAvL2VvIGJvb2xlYW5cbiAgICBcIi5zdl9tYWluIC5zdl9tYXRyaXhfZGV0YWlsX3Jvd1wiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlZGVkOyBib3JkZXItdG9wOiAxcHggc29saWQgJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuXG4gICAgLy9zaWduYXR1cmUgcGFkXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX2NvbnRhaW5lclwiOiBcImJvcmRlcjogMXB4IGRhc2hlZCAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zanNfc3BfcGxhY2Vob2xkZXJcIjogXCJjb2xvcjogJGZvcmVncm91bmQtbGlnaHQ7XCIsXG5cbiAgICBcIi5zdl9tYWluIC5zdi1hY3Rpb24tYmFyLWl0ZW1cIjogXCJjb2xvcjogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYWN0aW9uLWJhci1pdGVtX19pY29uIHVzZVwiOiBcImZpbGw6ICRmb3JlZ3JvdW5kLWxpZ2h0O1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWFjdGlvbi1iYXItaXRlbTpob3ZlclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRiYWNrZ3JvdW5kLWRpbTtcIixcbiAgfTtcblxuICBwcml2YXRlIHNoZWV0OiBDU1NTdHlsZVNoZWV0ID0gbnVsbDtcblxuICBzdGF0aWMgZmluZFNoZWV0KHN0eWxlU2hlZXRJZDogc3RyaW5nKTogYW55IHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgICEhZG9jdW1lbnQuc3R5bGVTaGVldHNbaV0ub3duZXJOb2RlICYmXG4gICAgICAgICg8YW55PmRvY3VtZW50KS5zdHlsZVNoZWV0c1tpXS5vd25lck5vZGVbXCJpZFwiXSA9PT0gc3R5bGVTaGVldElkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIDxDU1NTdHlsZVNoZWV0PmRvY3VtZW50LnN0eWxlU2hlZXRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVTaGVldChzdHlsZVNoZWV0SWQ6IHN0cmluZykge1xuICAgIGxldCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICBzdHlsZS5pZCA9IHN0eWxlU2hlZXRJZDtcbiAgICAvLyBBZGQgYSBtZWRpYSAoYW5kL29yIG1lZGlhIHF1ZXJ5KSBoZXJlIGlmIHlvdSdkIGxpa2UhXG4gICAgLy8gc3R5bGUuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgXCJzY3JlZW5cIilcbiAgICAvLyBzdHlsZS5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLCBcIm9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoIDogMTAyNHB4KVwiKVxuICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKTtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICByZXR1cm4gPENTU1N0eWxlU2hlZXQ+c3R5bGUuc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFwcGx5VGhlbWUoXG4gICAgdGhlbWVOYW1lOiBzdHJpbmcgPSBcImRlZmF1bHRcIixcbiAgICB0aGVtZVNlbGVjdG9yOiBzdHJpbmcgPSBcIi5zdl9tYWluXCJcbiAgKSB7XG4gICAgbGV0IFRoZW1lQ3NzOiBhbnk7XG5cbiAgICBpZiAodGhlbWVOYW1lID09PSBcIm1vZGVyblwiKSB0aGVtZVNlbGVjdG9yID0gXCIuc3Ytcm9vdC1tb2Rlcm4gXCI7XG5cbiAgICBpZiAoXG4gICAgICBbXCJib290c3RyYXBcIiwgXCJib290c3RyYXBtYXRlcmlhbFwiLCBcIm1vZGVyblwiXS5pbmRleE9mKHRoZW1lTmFtZSkgIT09IC0xXG4gICAgKSB7XG4gICAgICBUaGVtZUNzcyA9ICg8YW55PlN0eWxlc01hbmFnZXIpW3RoZW1lTmFtZSArIFwiVGhlbWVDc3NcIl07XG4gICAgICBzdXJ2ZXlDc3MuY3VycmVudFR5cGUgPSB0aGVtZU5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIFRoZW1lQ3NzID0gU3R5bGVzTWFuYWdlci5UaGVtZUNzcztcbiAgICAgIHN1cnZleUNzcy5jdXJyZW50VHlwZSA9IFwic3RhbmRhcmRcIjtcbiAgICB9XG5cbiAgICBpZiAoU3R5bGVzTWFuYWdlci5FbmFibGVkKSB7XG4gICAgICBsZXQgc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmZpbmRTaGVldCh0aGVtZU5hbWUgKyB0aGVtZVNlbGVjdG9yKTtcbiAgICAgIGlmICghc2hlZXQpIHtcbiAgICAgICAgc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmNyZWF0ZVNoZWV0KHRoZW1lTmFtZSArIHRoZW1lU2VsZWN0b3IpO1xuICAgICAgICBsZXQgdGhlbWUgPVxuICAgICAgICAgIFN0eWxlc01hbmFnZXIuVGhlbWVDb2xvcnNbdGhlbWVOYW1lXSB8fFxuICAgICAgICAgIFN0eWxlc01hbmFnZXIuVGhlbWVDb2xvcnNbXCJkZWZhdWx0XCJdO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKFRoZW1lQ3NzKS5mb3JFYWNoKChzZWxlY3RvcikgPT4ge1xuICAgICAgICAgIGxldCBjc3NSdWxlVGV4dCA9IFRoZW1lQ3NzW3NlbGVjdG9yXTtcbiAgICAgICAgICBPYmplY3Qua2V5cyh0aGVtZSkuZm9yRWFjaChcbiAgICAgICAgICAgIChjb2xvclZhcmlhYmxlTmFtZSkgPT5cbiAgICAgICAgICAgICAgKGNzc1J1bGVUZXh0ID0gY3NzUnVsZVRleHQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKFwiXFxcXFwiICsgY29sb3JWYXJpYWJsZU5hbWUsIFwiZ1wiKSxcbiAgICAgICAgICAgICAgICB0aGVtZVtjb2xvclZhcmlhYmxlTmFtZV1cbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzaGVldC5pbnNlcnRSdWxlKFxuICAgICAgICAgICAgICB0aGVtZVNlbGVjdG9yICsgc2VsZWN0b3IgKyBcIiB7IFwiICsgY3NzUnVsZVRleHQgKyBcIiB9XCIsXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBFbmFibGVkID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoU3R5bGVzTWFuYWdlci5FbmFibGVkKSB7XG4gICAgICB0aGlzLnNoZWV0ID0gU3R5bGVzTWFuYWdlci5maW5kU2hlZXQoU3R5bGVzTWFuYWdlci5TdXJ2ZXlKU1N0eWxlc1NoZWV0SWQpO1xuICAgICAgaWYgKCF0aGlzLnNoZWV0KSB7XG4gICAgICAgIHRoaXMuc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmNyZWF0ZVNoZWV0KFxuICAgICAgICAgIFN0eWxlc01hbmFnZXIuU3VydmV5SlNTdHlsZXNTaGVldElkXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVN0eWxlcyh0aGlzLnNoZWV0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVN0eWxlcyhzaGVldDogQ1NTU3R5bGVTaGVldCkge1xuICAgIGlmIChTdHlsZXNNYW5hZ2VyLkVuYWJsZWQpIHtcbiAgICAgIE9iamVjdC5rZXlzKFN0eWxlc01hbmFnZXIuU3R5bGVzKS5mb3JFYWNoKChzZWxlY3RvcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNoZWV0Lmluc2VydFJ1bGUoXG4gICAgICAgICAgICBzZWxlY3RvciArIFwiIHsgXCIgKyBTdHlsZXNNYW5hZ2VyLlN0eWxlc1tzZWxlY3Rvcl0gKyBcIiB9XCIsXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmtleXMoU3R5bGVzTWFuYWdlci5NZWRpYSkuZm9yRWFjaCgoc2VsZWN0b3IpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzaGVldC5pbnNlcnRSdWxlKFxuICAgICAgICAgICAgU3R5bGVzTWFuYWdlci5NZWRpYVtzZWxlY3Rvcl0ubWVkaWEgK1xuICAgICAgICAgICAgICBcIiB7IFwiICtcbiAgICAgICAgICAgICAgc2VsZWN0b3IgK1xuICAgICAgICAgICAgICBcIiB7IFwiICtcbiAgICAgICAgICAgICAgU3R5bGVzTWFuYWdlci5NZWRpYVtzZWxlY3Rvcl0uc3R5bGUgK1xuICAgICAgICAgICAgICBcIiB9IH1cIixcbiAgICAgICAgICAgIDBcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xyXG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcclxuaW1wb3J0IHsgUmVuZGVyZXJGYWN0b3J5IH0gZnJvbSBcIi4vcmVuZGVyZXJGYWN0b3J5XCI7XHJcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XHJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuL2FjdGlvbnMvYWN0aW9uXCI7XHJcbmltcG9ydCB7IEFkYXB0aXZlQWN0aW9uQ29udGFpbmVyIH0gZnJvbSBcIi4vYWN0aW9ucy9hZGFwdGl2ZS1jb250YWluZXJcIjtcclxuaW1wb3J0IHtcclxuICBJU3VydmV5RWxlbWVudCxcclxuICBJRWxlbWVudCxcclxuICBJUGFnZSxcclxuICBJUGFuZWwsXHJcbiAgSVByb2dyZXNzSW5mbyxcclxuICBJU3VydmV5LFxyXG4gIElTdXJ2ZXlEYXRhLFxyXG4gIElTdXJ2ZXlJbXBsLFxyXG4gIElUZXh0UHJvY2Vzc29yLFxyXG59IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL3N1cnZleS1lcnJvclwiO1xyXG5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3Mgb2YgU3VydmV5SlMgRWxlbWVudHMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgU3VydmV5RWxlbWVudCBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBJU3VydmV5RWxlbWVudCB7XHJcbiAgc3RhdGVDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UHJvZ3Jlc3NJbmZvQnlFbGVtZW50cyhcclxuICAgIGNoaWxkcmVuOiBBcnJheTxTdXJ2ZXlFbGVtZW50PixcclxuICAgIGlzUmVxdWlyZWQ6IGJvb2xlYW5cclxuICApOiBJUHJvZ3Jlc3NJbmZvIHtcclxuICAgIHZhciBpbmZvID0gQmFzZS5jcmVhdGVQcm9ncmVzc0luZm8oKTtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKCFjaGlsZHJlbltpXS5pc1Zpc2libGUpIGNvbnRpbnVlO1xyXG4gICAgICB2YXIgY2hpbGRJbmZvID0gY2hpbGRyZW5baV0uZ2V0UHJvZ3Jlc3NJbmZvKCk7XHJcbiAgICAgIGluZm8ucXVlc3Rpb25Db3VudCArPSBjaGlsZEluZm8ucXVlc3Rpb25Db3VudDtcclxuICAgICAgaW5mby5hbnN3ZXJlZFF1ZXN0aW9uQ291bnQgKz0gY2hpbGRJbmZvLmFuc3dlcmVkUXVlc3Rpb25Db3VudDtcclxuICAgICAgaW5mby5yZXF1aXJlZFF1ZXN0aW9uQ291bnQgKz0gY2hpbGRJbmZvLnJlcXVpcmVkUXVlc3Rpb25Db3VudDtcclxuICAgICAgaW5mby5yZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudCArPVxyXG4gICAgICAgIGNoaWxkSW5mby5yZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudDtcclxuICAgIH1cclxuICAgIGlmIChpc1JlcXVpcmVkICYmIGluZm8ucXVlc3Rpb25Db3VudCA+IDApIHtcclxuICAgICAgaWYgKGluZm8ucmVxdWlyZWRRdWVzdGlvbkNvdW50ID09IDApIGluZm8ucmVxdWlyZWRRdWVzdGlvbkNvdW50ID0gMTtcclxuICAgICAgaWYgKGluZm8uYW5zd2VyZWRRdWVzdGlvbkNvdW50ID4gMClcclxuICAgICAgICBpbmZvLnJlcXVpcmVkQW5zd2VyZWRRdWVzdGlvbkNvdW50ID0gMTtcclxuICAgIH1cclxuICAgIHJldHVybiBpbmZvO1xyXG4gIH1cclxuICBwcml2YXRlIHN1cnZleUltcGxWYWx1ZTogSVN1cnZleUltcGw7XHJcbiAgcHJpdmF0ZSBzdXJ2ZXlEYXRhVmFsdWU6IElTdXJ2ZXlEYXRhO1xyXG4gIHByaXZhdGUgc3VydmV5VmFsdWU6IElTdXJ2ZXk7XHJcbiAgcHJpdmF0ZSB0ZXh0UHJvY2Vzc29yVmFsdWU6IElUZXh0UHJvY2Vzc29yO1xyXG4gIHByaXZhdGUgc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ25WYWx1ZTogU3VydmV5RWxlbWVudCA9IHRoaXM7XHJcbiAgcHJpdmF0ZSBleHBhbmRBY3Rpb246IEFjdGlvbjtcclxuICBwdWJsaWMgcmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgU2Nyb2xsRWxlbWVudFRvVG9wKGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWVsZW1lbnRJZCB8fCB0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcclxuICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7XHJcbiAgICBpZiAoIWVsIHx8ICFlbC5zY3JvbGxJbnRvVmlldykgcmV0dXJuIGZhbHNlO1xyXG4gICAgdmFyIGVsZW1Ub3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XHJcbiAgICBpZiAoZWxlbVRvcCA8IDApIGVsLnNjcm9sbEludG9WaWV3KCk7XHJcbiAgICByZXR1cm4gZWxlbVRvcCA8IDA7XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgR2V0Rmlyc3ROb25UZXh0RWxlbWVudChcclxuICAgIGVsZW1lbnRzOiBhbnksXHJcbiAgICByZW1vdmVTcGFjZXM6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICkge1xyXG4gICAgaWYgKCFlbGVtZW50cyB8fCAhZWxlbWVudHMubGVuZ3RoIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGlmIChyZW1vdmVTcGFjZXMpIHtcclxuICAgICAgdmFyIHRFbCA9IGVsZW1lbnRzWzBdO1xyXG4gICAgICBpZiAodEVsLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHRFbC5kYXRhID0gXCJcIjtcclxuICAgICAgdEVsID0gZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV07XHJcbiAgICAgIGlmICh0RWwubm9kZU5hbWUgPT09IFwiI3RleHRcIikgdEVsLmRhdGEgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoZWxlbWVudHNbaV0ubm9kZU5hbWUgIT0gXCIjdGV4dFwiICYmIGVsZW1lbnRzW2ldLm5vZGVOYW1lICE9IFwiI2NvbW1lbnRcIilcclxuICAgICAgICByZXR1cm4gZWxlbWVudHNbaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgcHVibGljIHN0YXRpYyBGb2N1c0VsZW1lbnQoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICghZWxlbWVudElkIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgdmFyIHJlcyA9IFN1cnZleUVsZW1lbnQuZm9jdXNFbGVtZW50Q29yZShlbGVtZW50SWQpO1xyXG4gICAgaWYgKCFyZXMpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgU3VydmV5RWxlbWVudC5mb2N1c0VsZW1lbnRDb3JlKGVsZW1lbnRJZCk7XHJcbiAgICAgIH0sIDEwKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG4gIHByaXZhdGUgc3RhdGljIGZvY3VzRWxlbWVudENvcmUoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7XHJcbiAgICBpZiAoZWwpIHtcclxuICAgICAgZWwuZm9jdXMoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgQ3JlYXRlRGlzYWJsZWREZXNpZ25FbGVtZW50czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkaXNhYmxlRGVzaWduQWN0aW9uczogYm9vbGVhbiA9XHJcbiAgICBTdXJ2ZXlFbGVtZW50LkNyZWF0ZURpc2FibGVkRGVzaWduRWxlbWVudHM7XHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJlcnJvcnNcIik7XHJcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwidGl0bGVBY3Rpb25zXCIpO1xyXG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImlzUmVhZE9ubHlcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLm9uUmVhZE9ubHlDaGFuZ2VkKCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJlcnJvcnNcIiwgKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVFcnJvcnMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcclxuICAgIHN1cGVyLm9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcclxuICAgIGlmIChuYW1lID09PSBcInN0YXRlXCIpIHtcclxuICAgICAgaWYgKG9sZFZhbHVlID09PSBcImRlZmF1bHRcIiB8fCBuZXdWYWx1ZSA9PT0gXCJkZWZhdWx0XCIpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRpdGxlQWN0aW9ucygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXBkYXRlRXhwYW5kQWN0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuc3RhdGVDaGFuZ2VkQ2FsbGJhY2spIHRoaXMuc3RhdGVDaGFuZ2VkQ2FsbGJhY2soKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJjb2xsYXBzZWRcIiB0byByZW5kZXIgb25seSBQYW5lbCB0aXRsZSBhbmQgZXhwYW5kZWQgYnV0dG9uIGFuZCB0byBcImV4cGFuZGVkXCIgdG8gcmVuZGVyIHRoZSBjb2xsYXBzZWQgYnV0dG9uIGluIHRoZSBQYW5lbCBjYXB0aW9uXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBzdGF0ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0YXRlXCIpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHN0YXRlKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdGF0ZVwiLCB2YWwpO1xyXG4gICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZWQoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBub3RpZnlTdGF0ZUNoYW5nZWQoKSB7XHJcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcclxuICAgICAgdGhpcy5zdXJ2ZXkuZWxlbWVudENvbnRlbnRWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBFbGVtZW50IGlzIGluIHRoZSBjb2xsYXBzZWQgc3RhdGVcclxuICAgKiBAc2VlIHN0YXRlXHJcbiAgICogQHNlZSBjb2xsYXBzZVxyXG4gICAqIEBzZWUgaXNFeHBhbmRlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgaXNDb2xsYXBzZWQoKSB7XHJcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlID09IFwiY29sbGFwc2VkXCI7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgRWxlbWVudCBpcyBpbiB0aGUgZXhwYW5kZWQgc3RhdGVcclxuICAgKiBAc2VlIHN0YXRlXHJcbiAgICogQHNlZSBleHBhbmRcclxuICAgKiBAc2VlIGlzQ29sbGFwc2VkXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBpc0V4cGFuZGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdGUgPT0gXCJleHBhbmRlZFwiO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb2xsYXBzZSB0aGUgRWxlbWVudFxyXG4gICAqIEBzZWUgc3RhdGVcclxuICAgKi9cclxuICBwdWJsaWMgY29sbGFwc2UoKSB7XHJcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcclxuICAgIHRoaXMuc3RhdGUgPSBcImNvbGxhcHNlZFwiO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBFeHBhbmQgdGhlIEVsZW1lbnRcclxuICAgKiBAc2VlIHN0YXRlXHJcbiAgICovXHJcbiAgcHVibGljIGV4cGFuZCgpIHtcclxuICAgIHRoaXMuc3RhdGUgPSBcImV4cGFuZGVkXCI7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBlbGVtZW50J3Mgc3RhdGVcclxuICAgKiBAc2VlIHN0YXRlXHJcbiAgICovXHJcbiAgcHVibGljIHRvZ2dsZVN0YXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQpIHtcclxuICAgICAgdGhpcy5leHBhbmQoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7XHJcbiAgICAgIHRoaXMuY29sbGFwc2UoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaGFzU3RhdGVCdXR0b24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0V4cGFuZGVkIHx8IHRoaXMuaXNDb2xsYXBzZWQ7XHJcbiAgfVxyXG4gIHByaXZhdGUgdGl0bGVUb29sYmFyVmFsdWU6IEFkYXB0aXZlQWN0aW9uQ29udGFpbmVyO1xyXG4gIHB1YmxpYyBnZXRUaXRsZVRvb2xiYXIoKTogQWRhcHRpdmVBY3Rpb25Db250YWluZXIge1xyXG4gICAgaWYgKCF0aGlzLnRpdGxlVG9vbGJhclZhbHVlKSB7XHJcbiAgICAgIHRoaXMudGl0bGVUb29sYmFyVmFsdWUgPSBuZXcgQWRhcHRpdmVBY3Rpb25Db250YWluZXIoKTtcclxuICAgICAgdGhpcy50aXRsZVRvb2xiYXJWYWx1ZS5zZXRJdGVtcyh0aGlzLmdldFRpdGxlQWN0aW9ucygpKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnRpdGxlVG9vbGJhclZhbHVlO1xyXG4gIH1cclxuICBwcml2YXRlIHVwZGF0ZUV4cGFuZEFjdGlvbigpIHtcclxuICAgIGlmICghIXRoaXMuZXhwYW5kQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kQWN0aW9uLnZpc2libGUgPSB0aGlzLmlzRXhwYW5kZWQgfHwgdGhpcy5pc0NvbGxhcHNlZDtcclxuICAgICAgdGhpcy5leHBhbmRBY3Rpb24uaW5uZXJDc3MgPVxyXG4gICAgICAgIFwic3YtZXhwYW5kLWFjdGlvblwiICtcclxuICAgICAgICAodGhpcy5pc0V4cGFuZGVkID8gXCIgc3YtZXhwYW5kLWFjdGlvbi0tZXhwYW5kZWRcIiA6IFwiXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHRpdGxlQWN0aW9ucygpOiBBcnJheTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0aXRsZUFjdGlvbnNcIik7XHJcbiAgfVxyXG4gIHByaXZhdGUgaXNUaXRsZUFjdGlvblJlcXVlc3RlZDogYm9vbGVhbjtcclxuICBwdWJsaWMgZ2V0VGl0bGVBY3Rpb25zKCk6IEFycmF5PGFueT4ge1xyXG4gICAgaWYgKCF0aGlzLmlzVGl0bGVBY3Rpb25SZXF1ZXN0ZWQpIHtcclxuICAgICAgdGhpcy51cGRhdGVUaXRsZUFjdGlvbnMoKTtcclxuICAgICAgdGhpcy5pc1RpdGxlQWN0aW9uUmVxdWVzdGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnRpdGxlQWN0aW9ucztcclxuICB9XHJcbiAgcHJpdmF0ZSB1cGRhdGVUaXRsZUFjdGlvbnMoKSB7XHJcbiAgICB2YXIgYWN0aW9ucyA9IFtdO1xyXG4gICAgaWYgKHRoaXMuaGFzU3RhdGVCdXR0b24gJiYgIXRoaXMuZXhwYW5kQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kQWN0aW9uID0gbmV3IEFjdGlvbih7XHJcbiAgICAgICAgaWQ6IFwiZXhwYW5kLWNvbGxhcHNlLWFjdGlvblwiLFxyXG4gICAgICAgIHRpdGxlOiBcIlwiLFxyXG4gICAgICAgIGRpc2FibGVUYWJTdG9wOiB0cnVlLFxyXG4gICAgICAgIGFjdGlvbjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2dnbGVTdGF0ZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKCEhdGhpcy5leHBhbmRBY3Rpb24pIHtcclxuICAgICAgYWN0aW9ucy5wdXNoKHRoaXMuZXhwYW5kQWN0aW9uKTtcclxuICAgIH1cclxuICAgIGlmICghIXRoaXMuc3VydmV5KSB7XHJcbiAgICAgIGFjdGlvbnMgPSB0aGlzLnN1cnZleS5nZXRVcGRhdGVkRWxlbWVudFRpdGxlQWN0aW9ucyh0aGlzLCBhY3Rpb25zKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlRXhwYW5kQWN0aW9uKCk7XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0aXRsZUFjdGlvbnNcIiwgYWN0aW9ucyk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaGFzVGl0bGVBY3Rpb25zKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGl0bGVBY3Rpb25zKCkubGVuZ3RoID4gMDtcclxuICB9XHJcbiAgcHVibGljIGdldFRpdGxlQ29tcG9uZW50TmFtZSgpOiBzdHJpbmcge1xyXG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBSZW5kZXJlckZhY3RvcnkuSW5zdGFuY2UuZ2V0UmVuZGVyZXIoXHJcbiAgICAgIFwiZWxlbWVudFwiLFxyXG4gICAgICBcInRpdGxlLWFjdGlvbnNcIlxyXG4gICAgKTtcclxuICAgIGlmIChjb21wb25lbnROYW1lID09IFwiZGVmYXVsdFwiKSB7XHJcbiAgICAgIHJldHVybiBcInN2LWRlZmF1bHQtdGl0bGVcIjtcclxuICAgIH1cclxuICAgIHJldHVybiBjb21wb25lbnROYW1lO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IHRpdGxlVGFiSW5kZXgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlICE9PSBcImRlZmF1bHRcIiA/IDAgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgdGl0bGVBcmlhRXhwYW5kZWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gXCJkZWZhdWx0XCIpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gXCJleHBhbmRlZFwiO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcclxuICAgIHRoaXMuc3VydmV5SW1wbFZhbHVlID0gdmFsdWU7XHJcbiAgICBpZiAoIXRoaXMuc3VydmV5SW1wbFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuc2V0U3VydmV5Q29yZShudWxsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3VydmV5RGF0YVZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0U3VydmV5RGF0YSgpO1xyXG4gICAgICB0aGlzLnNldFN1cnZleUNvcmUodGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0U3VydmV5KCkpO1xyXG4gICAgICB0aGlzLnRleHRQcm9jZXNzb3JWYWx1ZSA9IHRoaXMuc3VydmV5SW1wbFZhbHVlLmdldFRleHRQcm9jZXNzb3IoKTtcclxuICAgICAgdGhpcy5vblNldERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXlJbXBsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3VydmV5SW1wbFZhbHVlO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGRhdGEoKTogSVN1cnZleURhdGEge1xyXG4gICAgcmV0dXJuIHRoaXMuc3VydmV5RGF0YVZhbHVlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBzdXJ2ZXkgb2JqZWN0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgc3VydmV5KCk6IElTdXJ2ZXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0U3VydmV5KCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRTdXJ2ZXkobGl2ZTogYm9vbGVhbiA9IGZhbHNlKTogSVN1cnZleSB7XHJcbiAgICBpZiAoISF0aGlzLnN1cnZleVZhbHVlKSByZXR1cm4gdGhpcy5zdXJ2ZXlWYWx1ZTtcclxuICAgIGlmICghIXRoaXMuc3VydmV5SW1wbFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuc2V0U3VydmV5Q29yZSh0aGlzLnN1cnZleUltcGxWYWx1ZS5nZXRTdXJ2ZXkoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlWYWx1ZTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIHNldFN1cnZleUNvcmUodmFsdWU6IElTdXJ2ZXkpIHtcclxuICAgIHRoaXMuc3VydmV5VmFsdWUgPSB2YWx1ZTtcclxuICAgIGlmICghIXRoaXMuc3VydmV5Q2hhbmdlZENhbGxiYWNrKSB7XHJcbiAgICAgIHRoaXMuc3VydmV5Q2hhbmdlZENhbGxiYWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gaW4gZGVzaWduIG1vZGUgcmlnaHQgbm93LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgaXNEZXNpZ25Nb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlO1xyXG4gIH1cclxuICBwdWJsaWMgaXNDb250ZW50RWxlbWVudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpc0VkaXRhYmxlVGVtcGxhdGVFbGVtZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGlzSW50ZXJhY3RpdmVEZXNpZ25FbGVtZW50OiBib29sZWFuID0gdHJ1ZTtcclxuICBwcm90ZWN0ZWQgZ2V0IGlzSW50ZXJuYWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0NvbnRlbnRFbGVtZW50O1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgICEhdGhpcy5zdXJ2ZXkgJiZcclxuICAgICAgdGhpcy5zdXJ2ZXkuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nICYmXHJcbiAgICAgICF0aGlzLmlzQ29udGVudEVsZW1lbnRcclxuICAgICk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgaXNSZWFkT25seSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gbWFrZSBhbiBlbGVtZW50IHF1ZXN0aW9uL3BhbmVsL3BhZ2UgcmVhZG9ubHkuXHJcbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxyXG4gICAqIEBzZWUgZW5hYmxlSWZcclxuICAgKiBAc2VlIGlzUmVhZE9ubHlcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlYWRPbmx5XCIsIGZhbHNlKTtcclxuICB9XHJcbiAgcHVibGljIHNldCByZWFkT25seSh2YWw6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLnJlYWRPbmx5ID09IHZhbCkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVhZE9ubHlcIiwgdmFsKTtcclxuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xyXG4gICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlYWRPbmx5XCIsIHRoaXMuaXNSZWFkT25seSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBvblJlYWRPbmx5Q2hhbmdlZCgpIHtcclxuICAgIGlmICghIXRoaXMucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2spIHtcclxuICAgICAgdGhpcy5yZWFkT25seUNoYW5nZWRDYWxsYmFjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwdWJsaWMgdXBkYXRlRWxlbWVudENzcyhyZU5ldz86IGJvb2xlYW4pIHt9XHJcbiAgcHJvdGVjdGVkIGdldElzTG9hZGluZ0Zyb21Kc29uKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHN1cGVyLmdldElzTG9hZGluZ0Zyb21Kc29uKCkpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkuaXNMb2FkaW5nRnJvbUpzb24gOiBmYWxzZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVGhpcyBpcyB0aGUgaWRlbnRpZmllciBvZiBhIHN1cnZleSBlbGVtZW50IC0gcXVlc3Rpb24gb3IgcGFuZWwuXHJcbiAgICogQHNlZSB2YWx1ZU5hbWVcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIsIFwiXCIpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcclxuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMubmFtZTtcclxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgdGhpcy5nZXRWYWxpZE5hbWUodmFsKSk7XHJcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgISFvbGRWYWx1ZSkge1xyXG4gICAgICB0aGlzLm9uTmFtZUNoYW5nZWQob2xkVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcm90ZWN0ZWQgZ2V0VmFsaWROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIG9uTmFtZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZykge31cclxuICBwcm90ZWN0ZWQgdXBkYXRlQmluZGluZ1ZhbHVlKHZhbHVlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAoXHJcbiAgICAgICEhdGhpcy5kYXRhICYmXHJcbiAgICAgICFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModmFsdWUsIHRoaXMuZGF0YS5nZXRWYWx1ZSh2YWx1ZU5hbWUpKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuZGF0YS5zZXRWYWx1ZSh2YWx1ZU5hbWUsIHZhbHVlLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRoZSBsaXN0IG9mIGVycm9ycy4gSXQgaXMgY3JlYXRlZCBieSBjYWxsaWcgaGFzRXJyb3JzIGZ1bmN0aW9uc1xyXG4gICAqIEBzZWUgaGFzRXJyb3JzXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBlcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcclxuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlcnJvcnNcIik7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgZXJyb3JzKHZhbDogQXJyYXk8U3VydmV5RXJyb3I+KSB7XHJcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJlcnJvcnNcIiwgdmFsKTtcclxuICB9XHJcbiAgQHByb3BlcnR5KHsgZGVmYXVsdFZhbHVlOiBmYWxzZSB9KSBoYXNWaXNpYmxlRXJyb3JzOiBib29sZWFuO1xyXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUVycm9ycygpIHtcclxuICAgIHZhciBjb3VudGVyID0gMDtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lcnJvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuZXJyb3JzW2ldLnZpc2libGUpIGNvdW50ZXIrKztcclxuICAgIH1cclxuICAgIHRoaXMuaGFzVmlzaWJsZUVycm9ycyA9IGNvdW50ZXIgPiAwO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgYSBxdWVzdGlvbiBvciBhIGNvbnRhaW5lciAocGFuZWwvcGFnZSkgb3IgdGhlaXIgY2hpZHJlbiBoYXZlIGFuIGVycm9yLlxyXG4gICAqIFRoZSB2YWx1ZSBjYW4gYmUgb3V0IG9mIGRhdGUuIGhhc0Vycm9ycyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZS5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IGNvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbnRhaW5zRXJyb3JzXCIsIGZhbHNlKTtcclxuICB9XHJcbiAgcHVibGljIHVwZGF0ZUNvbnRhaW5zRXJyb3JzKCkge1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29udGFpbnNFcnJvcnNcIiwgdGhpcy5nZXRDb250YWluc0Vycm9ycygpKTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElFbGVtZW50PiB7XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24oKTogU3VydmV5RWxlbWVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHNlbGVjdGVkRWxlbWVudEluRGVzaWduKHZhbDogU3VydmV5RWxlbWVudCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlID0gdmFsO1xyXG4gIH1cclxuICBwdWJsaWMgdXBkYXRlQ3VzdG9tV2lkZ2V0cygpIHt9XHJcblxyXG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7fVxyXG4gIHB1YmxpYyBvbkZpcnN0UmVuZGVyaW5nKCkge31cclxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XHJcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcclxuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHtcclxuICAgICAgdGhpcy5vblN1cnZleUxvYWQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIHNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgaXQgaXMgYSBwYWdlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgaXNQYWdlKCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgaXQgaXMgYSBwYW5lbC5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIHF1ZXN0aW9uLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgaXNRdWVzdGlvbigpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcHVibGljIGRlbGV0ZSgpIHt9XHJcbiAgcHJvdGVjdGVkIHJlbW92ZVNlbGZGcm9tTGlzdChsaXN0OiBBcnJheTxhbnk+KSB7XHJcbiAgICBpZiAoIWxpc3QgfHwgIUFycmF5LmlzQXJyYXkobGlzdCkpIHJldHVybjtcclxuICAgIHZhciBpbmRleCA9IGxpc3QuaW5kZXhPZih0aGlzKTtcclxuICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJvdGVjdGVkIGdldCB0ZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcclxuICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3JWYWx1ZTtcclxuICB9XHJcbiAgcHJvdGVjdGVkIGdldFByb2Nlc3NlZEh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghaHRtbCB8fCAhdGhpcy50ZXh0UHJvY2Vzc29yKSByZXR1cm4gaHRtbDtcclxuICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHQoaHRtbCwgdHJ1ZSk7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBvblNldERhdGEoKSB7fVxyXG4gIHB1YmxpYyBnZXQgcGFyZW50KCk6IElQYW5lbCB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIG51bGwpO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHBhcmVudCh2YWw6IElQYW5lbCkge1xyXG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIHZhbCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0UGFnZShwYXJlbnQ6IElQYW5lbCk6IElQYWdlIHtcclxuICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50LnBhcmVudCkgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcclxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmdldFR5cGUoKSA9PSBcInBhZ2VcIikgcmV0dXJuIDxJUGFnZT4oPGFueT5wYXJlbnQpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBtb3ZlVG9CYXNlKFxyXG4gICAgcGFyZW50OiBJUGFuZWwsXHJcbiAgICBjb250YWluZXI6IElQYW5lbCxcclxuICAgIGluc2VydEJlZm9yZTogYW55ID0gbnVsbFxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybiBmYWxzZTtcclxuICAgIHBhcmVudC5yZW1vdmVFbGVtZW50KDxJRWxlbWVudD4oPGFueT50aGlzKSk7XHJcbiAgICB2YXIgaW5kZXggPSAtMTtcclxuICAgIGlmIChIZWxwZXJzLmlzTnVtYmVyKGluc2VydEJlZm9yZSkpIHtcclxuICAgICAgaW5kZXggPSBwYXJzZUludChpbnNlcnRCZWZvcmUpO1xyXG4gICAgfVxyXG4gICAgaWYgKGluZGV4ID09IC0xICYmICEhaW5zZXJ0QmVmb3JlICYmICEhaW5zZXJ0QmVmb3JlLmdldFR5cGUpIHtcclxuICAgICAgaW5kZXggPSBjb250YWluZXIuaW5kZXhPZihpbnNlcnRCZWZvcmUpO1xyXG4gICAgfVxyXG4gICAgY29udGFpbmVyLmFkZEVsZW1lbnQoPElFbGVtZW50Pig8YW55PnRoaXMpLCBpbmRleCk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzZXRQYWdlKHBhcmVudDogSVBhbmVsLCB2YWw6IElQYWdlKSB7XHJcbiAgICB2YXIgb2xkUGFnZSA9IHRoaXMuZ2V0UGFnZShwYXJlbnQpO1xyXG4gICAgaWYgKG9sZFBhZ2UgPT09IHZhbCkgcmV0dXJuO1xyXG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUVsZW1lbnQoPElFbGVtZW50Pig8YW55PnRoaXMpKTtcclxuICAgIGlmICh2YWwpIHtcclxuICAgICAgdmFsLmFkZEVsZW1lbnQoPElFbGVtZW50Pig8YW55PnRoaXMpLCAtMSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBnZXRTZWFyY2hhYmxlTG9jS2V5cyhrZXlzOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICBrZXlzLnB1c2goXCJ0aXRsZVwiKTtcclxuICAgIGtleXMucHVzaChcImRlc2NyaXB0aW9uXCIpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBJU3VydmV5RXJyb3JPd25lciB9IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5RXJyb3Ige1xyXG4gIHByaXZhdGUgbG9jVGV4dFZhbHVlOiBMb2NhbGl6YWJsZVN0cmluZztcclxuICBwdWJsaWMgdmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgdGV4dDogc3RyaW5nID0gbnVsbCxcclxuICAgIHByb3RlY3RlZCBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGxcclxuICApIHt9XHJcbiAgcHVibGljIGdldCBsb2NUZXh0KCkge1xyXG4gICAgaWYgKCF0aGlzLmxvY1RleHRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmxvY1RleHRWYWx1ZSA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyh0aGlzLmVycm9yT3duZXIsIHRydWUpO1xyXG4gICAgICB0aGlzLmxvY1RleHRWYWx1ZS50ZXh0ID0gdGhpcy5nZXRUZXh0KCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0VmFsdWU7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXRUZXh0KCk6IHN0cmluZyB7XHJcbiAgICB2YXIgcmVzID0gdGhpcy50ZXh0O1xyXG4gICAgaWYgKCFyZXMpIHJlcyA9IHRoaXMuZ2V0RGVmYXVsdFRleHQoKTtcclxuICAgIGlmICghIXRoaXMuZXJyb3JPd25lcikge1xyXG4gICAgICByZXMgPSB0aGlzLmVycm9yT3duZXIuZ2V0RXJyb3JDdXN0b21UZXh0KHJlcywgdGhpcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gXCJiYXNlXCI7XHJcbiAgfVxyXG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEpzb25PYmplY3QsIEpzb25FcnJvciwgU2VyaWFsaXplciwgcHJvcGVydHkgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBCYXNlLCBFdmVudEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQge1xuICBJU3VydmV5LFxuICBJU3VydmV5RGF0YSxcbiAgSVN1cnZleUltcGwsXG4gIElUZXh0UHJvY2Vzc29yLFxuICBJUXVlc3Rpb24sXG4gIElQYW5lbCxcbiAgSUVsZW1lbnQsXG4gIElQYWdlLFxuICBJU3VydmV5RXJyb3JPd25lcixcbiAgSVN1cnZleUVsZW1lbnQsXG4gIElQcm9ncmVzc0luZm8sXG4gIElGaW5kRWxlbWVudCxcbn0gZnJvbSBcIi4vYmFzZS1pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4vc3VydmV5LWVsZW1lbnRcIjtcbmltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbmltcG9ydCB7IElTdXJ2ZXlUcmlnZ2VyT3duZXIsIFN1cnZleVRyaWdnZXIgfSBmcm9tIFwiLi90cmlnZ2VyXCI7XG5pbXBvcnQgeyBDYWxjdWxhdGVkVmFsdWUgfSBmcm9tIFwiLi9jYWxjdWxhdGVkVmFsdWVcIjtcbmltcG9ydCB7IFBhZ2VNb2RlbCB9IGZyb20gXCIuL3BhZ2VcIjtcbmltcG9ydCB7IFRleHRQcmVQcm9jZXNzb3IsIFRleHRQcmVQcm9jZXNzb3JWYWx1ZSB9IGZyb20gXCIuL3RleHRQcmVQcm9jZXNzb3JcIjtcbmltcG9ydCB7IFByb2Nlc3NWYWx1ZSB9IGZyb20gXCIuL2NvbmRpdGlvblByb2Nlc3NWYWx1ZVwiO1xuaW1wb3J0IHsgZHhTdXJ2ZXlTZXJ2aWNlIH0gZnJvbSBcIi4vZHhTdXJ2ZXlTZXJ2aWNlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgU3R5bGVzTWFuYWdlciB9IGZyb20gXCIuL3N0eWxlc21hbmFnZXJcIjtcbmltcG9ydCB7IFN1cnZleVRpbWVyIH0gZnJvbSBcIi4vc3VydmV5dGltZXJcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uU2VsZWN0QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbEJhc2UsIFF1ZXN0aW9uUm93TW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuaW1wb3J0IHtcbiAgSHRtbENvbmRpdGlvbkl0ZW0sXG4gIFVybENvbmRpdGlvbkl0ZW0sXG4gIEV4cHJlc3Npb25JdGVtLFxufSBmcm9tIFwiLi9leHByZXNzaW9uSXRlbXNcIjtcbmltcG9ydCB7IEV4cHJlc3Npb25SdW5uZXIsIENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcbmltcG9ydCB7IGdldFNpemUsIGlzTW9iaWxlLCBzY3JvbGxFbGVtZW50QnlDaGlsZElkIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vc3VydmV5LWVycm9yXCI7XG5pbXBvcnQgeyBJQWN0aW9uIH0gZnJvbSBcIi4vYWN0aW9ucy9hY3Rpb25cIjtcblxuLyoqXG4gKiBUaGUgYFN1cnZleWAgb2JqZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXJ2ZXksIFBhZ2VzLCBRdWVzdGlvbnMsIGZsb3cgbG9naWMgYW5kIGV0Yy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleU1vZGVsIGV4dGVuZHMgQmFzZVxuICBpbXBsZW1lbnRzXG4gICAgSVN1cnZleSxcbiAgICBJU3VydmV5RGF0YSxcbiAgICBJU3VydmV5SW1wbCxcbiAgICBJU3VydmV5VHJpZ2dlck93bmVyLFxuICAgIElTdXJ2ZXlFcnJvck93bmVyLFxuICAgIElMb2NhbGl6YWJsZU93bmVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUZW1wbGF0ZVJlbmRlcmVyQ29tcG9uZW50TmFtZTogc3RyaW5nID1cbiAgICBcInN2LXRlbXBsYXRlLXJlbmRlcmVyXCI7XG4gIFtpbmRleDogc3RyaW5nXTogYW55O1xuICBwcml2YXRlIHN0YXRpYyBzdHlsZXNNYW5hZ2VyOiBTdHlsZXNNYW5hZ2VyID0gbnVsbDtcbiAgcHVibGljIHN0YXRpYyBwbGF0Zm9ybTogc3RyaW5nID0gXCJ1bmtub3duXCI7XG4gIHB1YmxpYyBnZXQgcGxhdGZvcm1OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN1cnZleU1vZGVsLnBsYXRmb3JtO1xuICB9XG4gIC8qKlxuICAgKiBZb3UgY2FuIGRpc3BsYXkgYW4gYWRkaXRpb25hbCBmaWVsZCAoY29tbWVudCBmaWVsZCkgZm9yIHRoZSBtb3N0IG9mIHF1ZXN0aW9uczsgdXNlcnMgY2FuIGVudGVyIGFkZGl0aW9uYWwgY29tbWVudHMgdG8gdGhlaXIgcmVzcG9uc2UuXG4gICAqIFRoZSBjb21tZW50IGZpZWxkIGlucHV0IGlzIHNhdmVkIGFzIGAncXVlc3Rpb24gbmFtZScgKyAnY29tbWVudFByZWZpeCdgLlxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBRdWVzdGlvbi5oYXNDb21tZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1lbnRQcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2V0dGluZ3MuY29tbWVudFByZWZpeDtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbW1lbnRQcmVmaXgodmFsOiBzdHJpbmcpIHtcbiAgICBzZXR0aW5ncy5jb21tZW50UHJlZml4ID0gdmFsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY3VycmVudFBhZ2VWYWx1ZSgpOiBQYWdlTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjdXJyZW50UGFnZVZhbHVlXCIsIG51bGwpO1xuICB9XG4gIHByaXZhdGUgc2V0IGN1cnJlbnRQYWdlVmFsdWUodmFsOiBQYWdlTW9kZWwpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjdXJyZW50UGFnZVZhbHVlXCIsIHZhbCk7XG4gIH1cblxuICBwcml2YXRlIHZhbHVlc0hhc2g6IEhhc2hUYWJsZTxhbnk+ID0ge307XG4gIHByaXZhdGUgdmFyaWFibGVzSGFzaDogSGFzaFRhYmxlPGFueT4gPSB7fTtcbiAgcHJpdmF0ZSBlZGl0aW5nT2JqVmFsdWU6IEJhc2U7XG5cbiAgcHJpdmF0ZSBsb2NhbGVWYWx1ZTogc3RyaW5nID0gXCJcIjtcblxuICBwcml2YXRlIHRleHRQcmVQcm9jZXNzb3I6IFRleHRQcmVQcm9jZXNzb3I7XG4gIHByaXZhdGUgY29tcGxldGVkU3RhdGVWYWx1ZTogc3RyaW5nID0gXCJcIjtcbiAgcHJpdmF0ZSBjb21wbGV0ZWRTdGF0ZVRleHRWYWx1ZTogc3RyaW5nID0gXCJcIjtcblxuICBwcml2YXRlIGlzVGltZXJTdGFydGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8jcmVnaW9uIEV2ZW50IGRlY2xhcmF0aW9uc1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHRoZSBzdXJ2ZXkgaXMgY29tcGxldGVkIGFuZCB0aGUgYG9uQ29tcGxldGVgIGV2ZW50IGlzIGZpcmVkLiBZb3UgY2FuIHByZXZlbnQgdGhlIHN1cnZleSBmcm9tIGNvbXBsZXRpbmcgYnkgc2V0dGluZyBgb3B0aW9ucy5hbGxvd0NvbXBsZXRlYCB0byBgZmFsc2VgXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLmFsbG93Q29tcGxldGVgIC0gU3BlY2lmaWVzIHdoZXRoZXIgYSB1c2VyIGNhbiBjb21wbGV0ZSBhIHN1cnZleS4gU2V0IHRoaXMgcHJvcGVydHkgdG8gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBzdXJ2ZXkgZnJvbSBjb21wbGV0aW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAqIDxici8+IGBvcHRpb25zLmlzQ29tcGxldGVPblRyaWdnZXJgIC0gcmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaXMgY29tcGxldGluZyBvbiBcImNvbXBsZXRlXCIgdHJpZ2dlci5cbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgb25Db21wbGV0aW5nOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBhZnRlciBhIHVzZXIgY2xpY2tzIHRoZSAnQ29tcGxldGUnIGJ1dHRvbiBhbmQgZmluaXNoZXMgYSBzdXJ2ZXkuIFVzZSB0aGlzIGV2ZW50IHRvIHNlbmQgdGhlIHN1cnZleSBkYXRhIHRvIHlvdXIgd2ViIHNlcnZlci5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuc2hvd0RhdGFTYXZpbmcodGV4dClgIC0gY2FsbCB0aGlzIG1ldGhvZCB0byBzaG93IHRoYXQgdGhlIHN1cnZleSBpcyBzYXZpbmcgc3VydmV5IGRhdGEgb24geW91ciBzZXJ2ZXIuIFRoZSBgdGV4dGAgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNob3cgYSBjdXN0b20gbWVzc2FnZSBpbnN0ZWFkIG9mIGRlZmF1bHQuXG4gICAqIDxici8+IGBvcHRpb25zLnNob3dEYXRhU2F2aW5nRXJyb3IodGV4dClgIC0gY2FsbCB0aGlzIG1ldGhvZCB0byBzaG93IHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2F2aW5nIHRoZSBkYXRhIG9uIHlvdXIgc2VydmVyLiBJZiB5b3Ugd2FudCB0byBzaG93IGEgY3VzdG9tIGVycm9yLCB1c2UgYW4gb3B0aW9uYWwgYHRleHRgIHBhcmFtZXRlci5cbiAgICogPGJyLz4gYG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdTdWNjZXNzKHRleHQpYCAtIGNhbGwgdGhpcyBtZXRob2QgdG8gc2hvdyB0aGF0IHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgc2F2ZWQgb24gdGhlIHNlcnZlci5cbiAgICogPGJyLz4gYG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdDbGVhcmAgLSBjYWxsIHRoaXMgbWV0aG9kIHRvIGhpZGUgdGhlIHRleHQgYWJvdXQgdGhlIHNhdmluZyBwcm9ncmVzcy5cbiAgICogPGJyLz4gYG9wdGlvbnMuaXNDb21wbGV0ZU9uVHJpZ2dlcmAgLSByZXR1cm5zIHRydWUgaWYgdGhlIHN1cnZleSBpcyBjb21wbGV0ZWQgb24gXCJjb21wbGV0ZVwiIHRyaWdnZXIuXG4gICAqICBAc2VlIGRhdGFcbiAgICogQHNlZSBjbGVhckludmlzaWJsZVZhbHVlc1xuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICogQHNlZSBzdXJ2ZXlQb3N0SWRcbiAgICovXG4gIHB1YmxpYyBvbkNvbXBsZXRlOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgdGhlIHN1cnZleSBpcyBnb2luZyB0byBwcmV2aWV3IG1vZGUsIHN0YXRlIGVxdWFscyB0byBgcHJldmlld2AuIEl0IGhhcHBlbnMgd2hlbiBhIHVzZXIgY2xpY2sgb24gXCJQcmV2aWV3XCIgYnV0dG9uLiBJdCBzaG93cyB3aGVuIFwic2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZVwiIHByb2VwcnR5IGVxdWFscyB0byBcInNob3dBbGxRdWVzdGlvbnNcIiBvciBcInNob3dBbnN3ZXJlZFF1ZXN0aW9uc1wiLlxuICAgKiBZb3UgY2FuIHByZXZlbnQgc2hvd2luZyBpdCBieSBzZXR0aW5nIGFsbG93U2hvd1ByZXZpZXcgdG8gYGZhbHNlYC5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuYWxsb3dTaG93UHJldmlld2AgLSBTcGVjaWZpZXMgd2hldGhlciBhIHVzZXIgY2FuIHNlZSBhIHByZXZpZXcuIFNldCB0aGlzIHByb3BlcnR5IHRvIGBmYWxzZWAgdG8gcHJldmVudCBmcm9tIHNob3dpbmcgdGhlIHByZXZpZXcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICogQHNlZSBzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgb25TaG93aW5nUHJldmlldzogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgdXNlciBjbGlja3MgdGhlICdDb21wbGV0ZScgYnV0dG9uLiBUaGUgZXZlbnQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBVUkwgb3BlbmVkIGFmdGVyIGNvbXBsZXRpbmcgYSBzdXJ2ZXkuXG4gICAqIFNwZWNpZnkgdGhlIGBuYXZpZ2F0ZVRvVXJsYCBwcm9wZXJ0eSB0byBtYWtlIHN1cnZleSBuYXZpZ2F0ZSB0byBhbm90aGVyIHVybC5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMudXJsYCAtIFNwZWNpZmllcyBhIFVSTCBvcGVuZWQgYWZ0ZXIgY29tcGxldGluZyBhIHN1cnZleS4gU2V0IHRoaXMgcHJvcGVydHkgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIGNhbmNlbCB0aGUgbmF2aWdhdGlvbiBhbmQgc2hvdyB0aGUgY29tcGxldGVkIHN1cnZleSBwYWdlLlxuICAgKiBAc2VlIG5hdmlnYXRlVG9VcmxcbiAgICogQHNlZSBuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb25cbiAgICovXG4gIHB1YmxpYyBvbk5hdmlnYXRlVG9Vcmw6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIHRoZSBzdXJ2ZXkgY2hhbmdlZCBpdCdzIHN0YXRlIGZyb20gXCJzdGFydGluZ1wiIHRvIFwicnVubmluZ1wiLiBUaGUgXCJzdGFydGluZ1wiIHN0YXRlIG1lYW5zIHRoYXQgc3VydmV5IHNob3dzIHRoZSBzdGFydGVkIHBhZ2UuXG4gICAqIFRoZSBgZmlyc3RQYWdlSXNTdGFydGVkYCBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0IHRvIGB0cnVlYCwgaWYgeW91IHdhbnQgdG8gZGlzcGxheSBhIHN0YXJ0IHBhZ2UgaW4geW91ciBzdXJ2ZXkuIEluIHRoaXMgY2FzZSwgYW4gZW5kIHVzZXIgc2hvdWxkIGNsaWNrIHRoZSBcIlN0YXJ0XCIgYnV0dG9uIHRvIHN0YXJ0IHRoZSBzdXJ2ZXkuXG4gICAqIEBzZWUgZmlyc3RQYWdlSXNTdGFydGVkXG4gICAqL1xuICBwdWJsaWMgb25TdGFydGVkOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjbGlja2luZyB0aGUgJ05leHQnIGJ1dHRvbiBpZiB0aGUgYHNlbmRSZXN1bHRPblBhZ2VOZXh0YCBpcyBzZXQgdG8gYHRydWVgLiBZb3UgY2FuIHVzZSBpdCB0byBzYXZlIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cywgZm9yIGV4YW1wbGUsIGlmIHlvdXIgc3VydmV5IGlzIGxhcmdlIGVub3VnaC5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogQHNlZSBzZW5kUmVzdWx0T25QYWdlTmV4dFxuICAgKi9cbiAgcHVibGljIG9uUGFydGlhbFNlbmQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSB0aGUgY3VycmVudCBwYWdlIGNoYW5nZXMgdG8gYW5vdGhlciBwYWdlLiBUeXBpY2FsbHkgaXQgaGFwcGVucyB3aGVuIGEgdXNlciBjbGljayB0aGUgJ05leHQnIG9yICdQcmV2JyBidXR0b25zLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9uLm9sZEN1cnJlbnRQYWdlYCAtIHRoZSBwcmV2aW91cyBjdXJyZW50L2FjdGl2ZSBwYWdlLlxuICAgKiA8YnIvPiBgb3B0aW9uLm5ld0N1cnJlbnRQYWdlYCAtIGEgbmV3IGN1cnJlbnQvYWN0aXZlIHBhZ2UuXG4gICAqIDxici8+IGBvcHRpb24uYWxsb3dDaGFuZ2luZ2AgLSBzZXQgaXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIHRoZSBjdXJyZW50IHBhZ2UgY2hhbmdpbmcuIEl0IGlzIGB0cnVlYCBieSBkZWZhdWx0LlxuICAgKiA8YnIvPiBgb3B0aW9uLmlzTmV4dFBhZ2VgIC0gY29tbW9ubHkgbWVhbnMsIHRoYXQgZW5kLXVzZXIgcHJlc3MgdGhlIG5leHQgcGFnZSBidXR0b24uIEluIGdlbmVyYWwsIGl0IG1lYW5zIHRoYXQgb3B0aW9ucy5uZXdDdXJyZW50UGFnZSBpcyB0aGUgbmV4dCBwYWdlIGFmdGVyIG9wdGlvbnMub2xkQ3VycmVudFBhZ2VcbiAgICogPGJyLz4gYG9wdGlvbi5pc1ByZXZQYWdlYCAtIGNvbW1vbmx5IG1lYW5zLCB0aGF0IGVuZC11c2VyIHByZXNzIHRoZSBwcmV2aW91cyBwYWdlIGJ1dHRvbi4gSW4gZ2VuZXJhbCwgaXQgbWVhbnMgdGhhdCBvcHRpb25zLm5ld0N1cnJlbnRQYWdlIGlzIHRoZSBwcmV2aW91cyBwYWdlIGJlZm9yZSBvcHRpb25zLm9sZEN1cnJlbnRQYWdlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VcbiAgICogQHNlZSBjdXJyZW50UGFnZU5vXG4gICAqIEBzZWUgbmV4dFBhZ2VcbiAgICogQHNlZSBwcmV2UGFnZVxuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICogQHNlZSBvbkN1cnJlbnRQYWdlQ2hhbmdlZFxuICAgKiovXG4gIHB1YmxpYyBvbkN1cnJlbnRQYWdlQ2hhbmdpbmc6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSBjdXJyZW50IHBhZ2UgaGFzIGJlZW4gY2hhbmdlZCB0byBhbm90aGVyIHBhZ2UuIFR5cGljYWxseSBpdCBoYXBwZW5zIHdoZW4gYSB1c2VyIGNsaWNrIG9uICdOZXh0JyBvciAnUHJldicgYnV0dG9ucy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbi5vbGRDdXJyZW50UGFnZWAgLSBhIHByZXZpb3VzIGN1cnJlbnQvYWN0aXZlIHBhZ2UuXG4gICAqIDxici8+IGBvcHRpb24ubmV3Q3VycmVudFBhZ2VgIC0gYSBuZXcgY3VycmVudC9hY3RpdmUgcGFnZS5cbiAgICogPGJyLz4gYG9wdGlvbi5pc05leHRQYWdlYCAtIGNvbW1vbmx5IG1lYW5zLCB0aGF0IGVuZC11c2VyIHByZXNzIHRoZSBuZXh0IHBhZ2UgYnV0dG9uLiBJbiBnZW5lcmFsLCBpdCBtZWFucyB0aGF0IG9wdGlvbnMubmV3Q3VycmVudFBhZ2UgaXMgdGhlIG5leHQgcGFnZSBhZnRlciBvcHRpb25zLm9sZEN1cnJlbnRQYWdlXG4gICAqIDxici8+IGBvcHRpb24uaXNQcmV2UGFnZWAgLSBjb21tb25seSBtZWFucywgdGhhdCBlbmQtdXNlciBwcmVzcyB0aGUgcHJldmlvdXMgcGFnZSBidXR0b24uIEluIGdlbmVyYWwsIGl0IG1lYW5zIHRoYXQgb3B0aW9ucy5uZXdDdXJyZW50UGFnZSBpcyB0aGUgcHJldmlvdXMgcGFnZSBiZWZvcmUgb3B0aW9ucy5vbGRDdXJyZW50UGFnZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VOb1xuICAgKiBAc2VlIG5leHRQYWdlXG4gICAqIEBzZWUgcHJldlBhZ2VcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqIEBzZWUgb25DdXJyZW50UGFnZUNoYW5naW5nXG4gICAqL1xuICBwdWJsaWMgb25DdXJyZW50UGFnZUNoYW5nZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgdGhlIHF1ZXN0aW9uIHZhbHVlIChhbnN3ZXIpIGlzIGNoYW5nZWQuIEl0IGNhbiBiZSBkb25lIHZpYSBVSSBieSBhIHVzZXIgb3IgcHJvZ3JhbW1hdGljYWxseSBvbiBjYWxsaW5nIHRoZSBgc2V0VmFsdWVgIG1ldGhvZC5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSB0aGUgdmFsdWUgbmFtZSB0aGF0IGhhcyBiZWluZyBjaGFuZ2VkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIHdoaWNoIGBxdWVzdGlvbi5uYW1lYCBlcXVhbHMgdG8gdGhlIHZhbHVlIG5hbWUuIElmIHRoZXJlIGFyZSBzZXZlcmFsIHF1ZXN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUsIHRoZSBmaXJzdCBxdWVzdGlvbiBpcyB1c2VkLiBJZiB0aGVyZSBpcyBubyBzdWNoIHF1ZXN0aW9ucywgdGhlIGBvcHRpb25zLnF1ZXN0aW9uYCBpcyBudWxsLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5vbGRWYWx1ZWAgLSBhbiBvbGQsIHByZXZpb3VzIHZhbHVlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy52YWx1ZWAgLSBhIG5ldyB2YWx1ZS4gWW91IGNhbiBjaGFuZ2UgaXQuXG4gICAqIEBzZWUgc2V0VmFsdWVcbiAgICogQHNlZSBvblZhbHVlQ2hhbmdlZFxuICAgKi9cbiAgcHVibGljIG9uVmFsdWVDaGFuZ2luZzogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgcXVlc3Rpb24gdmFsdWUgKGkuZS4sIGFuc3dlcikgaGFzIGJlZW4gY2hhbmdlZC4gVGhlIHF1ZXN0aW9uIHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGluIFVJIChieSBhIHVzZXIpIG9yIHByb2dyYW1tYXRpY2FsbHkgKG9uIGNhbGxpbmcgYHNldFZhbHVlYCBtZXRob2QpLlxuICAgKiBVc2UgdGhlIGBvbkR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWRgIGFuZCBgb25NYXRyaXhDZWxsVmFsdWVDaGFuZ2VkYCBldmVudHMgdG8gaGFuZGxlIGNoYW5nZXMgaW4gYSBxdWVzdGlvbiBpbiB0aGUgUGFuZWwgRHluYW1pYyBhbmQgYSBjZWxsIHF1ZXN0aW9uIGluIG1hdHJpY2VzLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIHRoZSB2YWx1ZSBuYW1lIHRoYXQgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBxdWVzdGlvbiB3aGljaCBgcXVlc3Rpb24ubmFtZWAgZXF1YWxzIHRvIHRoZSB2YWx1ZSBuYW1lLiBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBxdWVzdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGUgZmlyc3QgcXVlc3Rpb24gaXMgdXNlZC4gSWYgdGhlcmUgaXMgbm8gc3VjaCBxdWVzdGlvbnMsIHRoZSBgb3B0aW9ucy5xdWVzdGlvbmAgaXMgYG51bGxgLlxuICAgKiA8YnIvPiBgb3B0aW9ucy52YWx1ZWAgLSBhIG5ldyB2YWx1ZS5cbiAgICogQHNlZSBzZXRWYWx1ZVxuICAgKiBAc2VlIG9uVmFsdWVDaGFuZ2luZ1xuICAgKiBAc2VlIG9uRHluYW1pY1BhbmVsSXRlbVZhbHVlQ2hhbmdlZFxuICAgKiBAc2VlIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZFxuICAgKi9cbiAgcHVibGljIG9uVmFsdWVDaGFuZ2VkOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIGEgcXVlc3Rpb24gdmlzaWJpbGl0eSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIHdoaWNoIHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSBhIHF1ZXN0aW9uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnZpc2libGVgIC0gYSBxdWVzdGlvbiBgdmlzaWJsZWAgYm9vbGVhbiB2YWx1ZS5cbiAgICogQHNlZSBRdWVzdGlvbi52aXNpYmlsZVxuICAgKiBAc2VlIFF1ZXN0aW9uLnZpc2liaWxlSWZcbiAgICovXG4gIHB1YmxpYyBvblZpc2libGVDaGFuZ2VkOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2hhbmdpbmcgYSBwYWdlIHZpc2liaWxpdHkuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnBhZ2VgIC0gYSBwYWdlIHdoaWNoIHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMudmlzaWJsZWAgLSBhIHBhZ2UgYHZpc2libGVgIGJvb2xlYW4gdmFsdWUuXG4gICAqIEBzZWUgUGFnZU1vZGVsLnZpc2liaWxlXG4gICAqIEBzZWUgUGFnZU1vZGVsLnZpc2liaWxlSWZcbiAgICovXG4gIHB1YmxpYyBvblBhZ2VWaXNpYmxlQ2hhbmdlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGNoYW5naW5nIGEgcGFuZWwgdmlzaWJpbGl0eS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFuZWxgIC0gYSBwYW5lbCB3aGljaCB2aXNpYmlsaXR5IGhhcyBiZWVuIGNoYW5nZWQuXG4gICAqIDxici8+IGBvcHRpb25zLnZpc2libGVgIC0gYSBwYW5lbCBgdmlzaWJsZWAgYm9vbGVhbiB2YWx1ZS5cbiAgICogQHNlZSBQYW5lbE1vZGVsLnZpc2liaWxlXG4gICAqIEBzZWUgUGFuZWxNb2RlbC52aXNpYmlsZUlmXG4gICAqL1xuICBwdWJsaWMgb25QYW5lbFZpc2libGVDaGFuZ2VkOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY3JlYXRpbmcgYSBuZXcgcXVlc3Rpb24uXG4gICAqIFVubGlrZSB0aGUgb25RdWVzdGlvbkFkZGVkIGV2ZW50LCB0aGlzIGV2ZW50IGNhbGxzIGZvciBhbGwgcXVlc3Rpb24gY3JlYXRlZCBpbiBzdXJ2ZXkgaW5jbHVkaW5nIGluc2lkZTogYSBwYWdlLCBwYW5lbCwgbWF0cml4IGNlbGwsIGR5bmFtaWMgcGFuZWwgYW5kIG11bHRpcGxlIHRleHQuXG4gICAqIG9yIGluc2lkZSBhIG1hdHJpeCBjZWxsIG9yIGl0IGNhbiBiZSBhIHRleHQgcXVlc3Rpb24gaW4gbXVsdGlwbGUgdGV4dCBpdGVtcyBvciBpbnNpZGUgYSBwYW5lbCBvZiBhIHBhbmVsIGR5bmFtaWMuXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdG8gc2V0IHVwIHByb3BlcnRpZXMgdG8gYSBxdWVzdGlvbiBiYXNlZCBvbiBpdCdzIHR5cGUgZm9yIGFsbCBxdWVzdGlvbnMsIHJlZ2FyZGxlc3Mgd2hlcmUgdGhleSBhcmUgbG9jYXRlZCwgb24gdGhlIHBhZ2Ugb3IgaW5zaWRlIGEgbWF0cml4IGNlbGwuXG4gICAqIFBsZWFzZSBub3RlOiBJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBldmVudCBmb3IgcXVlc3Rpb25zIGxvYWRlZCBmcm9tIEpTT04gdGhlbiB5b3UgaGF2ZSB0byBjcmVhdGUgc3VydmV5IHdpdGggZW1wdHkvbnVsbCBKU09OIHBhcmFtZXRlciwgYXNzaWduIHRoZSBldmVudCBhbmQgY2FsbCBzdXJ2ZXkuZnJvbUpTT04oeW91ckpTT04pIGZ1bmN0aW9uLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIG5ld2x5IGNyZWF0ZWQgcXVlc3Rpb24gb2JqZWN0LlxuICAgKiBAc2VlIFF1ZXN0aW9uXG4gICAqIEBzZWUgb25RdWVzdGlvbkFkZGVkXG4gICAqL1xuICBwdWJsaWMgb25RdWVzdGlvbkNyZWF0ZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBuZXcgcXVlc3Rpb24gaW50byBzdXJ2ZXkuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgbmV3bHkgYWRkZWQgcXVlc3Rpb24gb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIGEgcXVlc3Rpb24gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMuaW5kZXhgIC0gYW4gaW5kZXggb2YgdGhlIHF1ZXN0aW9uIGluIHRoZSBjb250YWluZXIgKHBhZ2Ugb3IgcGFuZWwpLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYXJlbnRQYW5lbGAgLSBhIGNvbnRhaW5lciB3aGVyZSBhIG5ldyBxdWVzdGlvbiBpcyBsb2NhdGVkLiBJdCBjYW4gYmUgYSBwYWdlIG9yIHBhbmVsLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb290UGFuZWxgIC0gdHlwaWNhbGx5LCBpdCBpcyBhIHBhZ2UuXG4gICAqIEBzZWUgUXVlc3Rpb25cbiAgICogQHNlZSBvblF1ZXN0aW9uQ3JlYXRlZFxuICAgKi9cbiAgcHVibGljIG9uUXVlc3Rpb25BZGRlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gcmVtb3ZpbmcgYSBxdWVzdGlvbiBmcm9tIHN1cnZleS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSByZW1vdmVkIHF1ZXN0aW9uIG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSBhIHF1ZXN0aW9uIG5hbWUuXG4gICAqIEBzZWUgUXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBvblF1ZXN0aW9uUmVtb3ZlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGFkZGluZyBhIHBhbmVsIGludG8gc3VydmV5LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYW5lbGAgLSBhIG5ld2x5IGFkZGVkIHBhbmVsIG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSBhIHBhbmVsIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLmluZGV4YCAtIGFuIGluZGV4IG9mIHRoZSBwYW5lbCBpbiB0aGUgY29udGFpbmVyIChhIHBhZ2Ugb3IgcGFuZWwpLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYXJlbnRQYW5lbGAgLSBhIGNvbnRhaW5lciAoYSBwYWdlIG9yIHBhbmVsKSB3aGVyZSBhIG5ldyBwYW5lbCBpcyBsb2NhdGVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb290UGFuZWxgIC0gYSByb290IGNvbnRhaW5lciwgdHlwaWNhbGx5IGl0IGlzIGEgcGFnZS5cbiAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25QYW5lbEFkZGVkOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiByZW1vdmluZyBhIHBhbmVsIGZyb20gc3VydmV5LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYW5lbGAgLSBhIHJlbW92ZWQgcGFuZWwgb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIGEgcGFuZWwgbmFtZS5cbiAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25QYW5lbFJlbW92ZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGFkZGluZyBhIHBhZ2UgaW50byBzdXJ2ZXkuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnBhZ2VgIC0gYSBuZXdseSBhZGRlZCBgcGFuZWxgIG9iamVjdC5cbiAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25QYWdlQWRkZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHZhbGlkYXRpbmcgdmFsdWUgaW4gYSBxdWVzdGlvbi4gWW91IGNhbiBzcGVjaWZ5IGEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgdXNpbmcgYG9wdGlvbnMuZXJyb3JgLiBUaGUgc3VydmV5IGJsb2NrcyBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkgb3IgZ29pbmcgdG8gdGhlIG5leHQgcGFnZSB3aGVuIHRoZSBlcnJvciBtZXNzYWdlcyBhcmUgZGlzcGxheWVkLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHZhbGlkYXRlZCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSBhIHF1ZXN0aW9uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIHRoZSBjdXJyZW50IHF1ZXN0aW9uIHZhbHVlIChhbnN3ZXIpLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lcnJvcmAgLSBhbiBlcnJvciBzdHJpbmcuIEl0IGlzIGVtcHR5IGJ5IGRlZmF1bHQuXG4gICAqIEBzZWUgb25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9uc1xuICAgKiBAc2VlIG9uU2V0dGluZ1F1ZXN0aW9uRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgb25WYWxpZGF0ZVF1ZXN0aW9uOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIGVycm9ycyBhcmUgYXNzaWduZWQgdG8gYSBxdWVzdGlvbi4gWW91IG1heSBhZGQvcmVtb3ZlL21vZGlmeSBlcnJvcnMgZm9yIGEgcXVlc3Rpb24uXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgdmFsaWRhdGVkIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lcnJvcnNgIC0gdGhlIGxpc3Qgb2YgZXJyb3JzLiBUaGUgbGlzdCBpcyBlbXB0eSBieSBkZWZhdWx0IGFuZCByZW1haW5zIGVtcHR5IGlmIGEgdmFsaWRhdGVkIHF1ZXN0aW9uIGhhcyBubyBlcnJvcnMuXG4gICAqIEBzZWUgb25WYWxpZGF0ZVF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25TZXR0aW5nUXVlc3Rpb25FcnJvcnM6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIHZhbGlkYXRlIGRhdGEgb24geW91ciBzZXJ2ZXIuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLmRhdGFgIC0gdGhlIHZhbHVlcyBvZiBhbGwgbm9uLWVtcHR5IHF1ZXN0aW9ucyBvbiB0aGUgY3VycmVudCBwYWdlLiBZb3UgY2FuIGdldCBhIHF1ZXN0aW9uIHZhbHVlIGFzIGBvcHRpb25zLmRhdGFbXCJteVF1ZXN0aW9uTmFtZVwiXWAuXG4gICAqIDxici8+IGBvcHRpb25zLmVycm9yc2AgLSBzZXQgeW91ciBlcnJvcnMgdG8gdGhpcyBvYmplY3QgYXM6IGBvcHRpb25zLmVycm9yc1tcIm15UXVlc3Rpb25OYW1lXCJdID0gXCJFcnJvciB0ZXh0XCI7YC4gSXQgd2lsbCBiZSBzaG93biBhcyBhIHF1ZXN0aW9uIGVycm9yLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jb21wbGV0ZSgpYCAtIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0ZWxsIHN1cnZleSB0aGF0IHlvdXIgc2VydmVyIGNhbGxiYWNrIGhhcyBiZWVuIHByb2Nlc3NlZC5cbiAgICogQHNlZSBvblZhbGlkYXRlUXVlc3Rpb25cbiAgICogQHNlZSBvblZhbGlkYXRlUGFuZWxcbiAgICovXG4gIHB1YmxpYyBvblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zOiBhbnkgPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gbW9kaWZ5IHRoZSBIVE1MIGJlZm9yZSByZW5kZXJpbmcsIGZvciBleGFtcGxlIEhUTUwgb24gYSBjb21wbGV0ZWQgcGFnZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuaHRtbGAgLSBhbiBIVE1MIHRoYXQgeW91IG1heSBjaGFuZ2UgYmVmb3JlIHRleHQgcHJvY2Vzc2luZyBhbmQgdGhlbiByZW5kZXJpbmcuXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbFxuICAgKiBAc2VlIGxvYWRpbmdIdG1sXG4gICAqIEBzZWUgUXVlc3Rpb25IdG1sTW9kZWwuaHRtbFxuICAgKi9cbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiB2YWxpZGF0aW5nIGEgcGFuZWwuIFNldCB5b3VyIGVycm9yIHRvIGBvcHRpb25zLmVycm9yYCBhbmQgc3VydmV5IHdpbGwgc2hvdyB0aGUgZXJyb3IgZm9yIHRoZSBwYW5lbCBhbmQgYmxvY2sgY29tcGxldGluZyB0aGUgc3VydmV5IG9yIGdvaW5nIHRvIHRoZSBuZXh0IHBhZ2UuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBwYW5lbCBuYW1lLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lcnJvcmAgLSBhbiBlcnJvciBzdHJpbmcuIEl0IGlzIGVtcHR5IGJ5IGRlZmF1bHQuXG4gICAqIEBzZWUgb25WYWxpZGF0ZVF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25WYWxpZGF0ZVBhbmVsOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGUgZXZlbnQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGVycm9yIHRleHQuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnRleHRgIC0gYW4gZXJyb3IgdGV4dC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZXJyb3JgIC0gYW4gaW5zdGFuY2Ugb2YgdGhlIGBTdXJ2ZXlFcnJvcmAgb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIHRoZSBlcnJvciBuYW1lLiBUaGUgZm9sbG93aW5nIGVycm9yIG5hbWVzIGFyZSBhdmFpbGFibGU6XG4gICAqIHJlcXVpcmVkLCByZXF1aXJlb25lYW5zd2VyLCByZXF1aXJlbnVtZXJpYywgZXhjZWVkc2l6ZSwgd2VicmVxdWVzdCwgd2VicmVxdWVzdGVtcHR5LCBvdGhlcmVtcHR5LFxuICAgKiB1cGxvYWRpbmdmaWxlLCByZXF1aXJlZGluYWxscm93c2Vycm9yLCBtaW5yb3djb3VudGVycm9yLCBrZXlkdXBsaWNhdGlvbmVycm9yLCBjdXN0b21cbiAgICovXG4gIHB1YmxpYyBvbkVycm9yQ3VzdG9tVGV4dDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVXNlIHRoZSB0aGlzIGV2ZW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHN1cnZleSBmaW5pc2hlZCB2YWxpZGF0ZSBxdWVzdGlvbnMgb24gdGhlIGN1cnJlbnQgcGFnZS4gSXQgY29tbW9ubHkgaGFwcGVucyB3aGVuIGEgdXNlciB0cnkgdG8gZ28gdG8gdGhlIG5leHQgcGFnZSBvciBjb21wbGV0ZSB0aGUgc3VydmV5XG4gICAqIG9wdGlvbnMucXVlc3Rpb25zIC0gdGhlIGxpc3Qgb2YgcXVlc3Rpb25zIHRoYXQgaGF2ZSBlcnJvcnNcbiAgICogb3B0aW9ucy5lcnJvcnMgLSB0aGUgbGlzdCBvZiBlcnJvcnNcbiAgICogb3B0aW9ucy5wYWdlIC0gdGhlIHBhZ2Ugd2hlcmUgcXVlc3Rpb24ocykgYXJlIGxvY2F0ZWRcbiAgICovXG4gIHB1YmxpYyBvblZhbGlkYXRlZEVycm9yc09uQ3VycmVudFBhZ2U6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIG1vZGlmeSB0aGUgSFRNTCBjb250ZW50IGJlZm9yZSByZW5kZXJpbmcsIGZvciBleGFtcGxlIGBjb21wbGV0ZUh0bWxgIG9yIGBsb2FkaW5nSHRtbGAuXG4gICAqIGBvcHRpb25zLmh0bWxgIC0gc3BlY2lmaWVzIHRoZSBtb2RpZmllZCBIVE1MIGNvbnRlbnQuXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbFxuICAgKiBAc2VlIGxvYWRpbmdIdG1sXG4gICAqL1xuICBwdWJsaWMgb25Qcm9jZXNzSHRtbDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjaGFuZ2UgdGhlIHF1ZXN0aW9uIHRpdGxlIGluIGNvZGUuIElmIHlvdSB3YW50IHRvIHJlbW92ZSBxdWVzdGlvbiBudW1iZXJpbmcgdGhlbiBzZXQgc2hvd1F1ZXN0aW9uTnVtYmVycyB0byBcIm9mZlwiLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy50aXRsZWAgLSBhIGNhbGN1bGF0ZWQgcXVlc3Rpb24gdGl0bGUsIGJhc2VkIG9uIHF1ZXN0aW9uIGB0aXRsZWAsIGBuYW1lYC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBxdWVzdGlvbiBvYmplY3QuXG4gICAqIEBzZWUgc2hvd1F1ZXN0aW9uTnVtYmVyc1xuICAgKiBAc2VlIHJlcXVpcmVkVGV4dFxuICAgKi9cbiAgcHVibGljIG9uR2V0UXVlc3Rpb25UaXRsZTogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gY2hhbmdlIHRoZSBxdWVzdGlvbiBubyBpbiBjb2RlLiBJZiB5b3Ugd2FudCB0byByZW1vdmUgcXVlc3Rpb24gbnVtYmVyaW5nIHRoZW4gc2V0IHNob3dRdWVzdGlvbk51bWJlcnMgdG8gXCJvZmZcIi5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMubm9gIC0gYSBjYWxjdWxhdGVkIHF1ZXN0aW9uIG5vLCBiYXNlZCBvbiBxdWVzdGlvbiBgdmlzaWJsZUluZGV4YCwgc3VydmV5IGAucXVlc3Rpb25TdGFydEluZGV4YCBwcm9wZXJ0aWVzLiBZb3UgY2FuIGNoYW5nZSBpdC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBxdWVzdGlvbiBvYmplY3QuXG4gICAqIEBzZWUgc2hvd1F1ZXN0aW9uTnVtYmVyc1xuICAgKiBAc2VlIHF1ZXN0aW9uU3RhcnRJbmRleFxuICAgKi9cbiAgcHVibGljIG9uR2V0UXVlc3Rpb25ObzogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjaGFuZ2UgdGhlIHByb2dyZXNzIHRleHQgaW4gY29kZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMudGV4dGAgLSBhIHByb2dyZXNzIHRleHQsIHRoYXQgU3VydmV5SlMgd2lsbCByZW5kZXIgaW4gcHJvZ3Jlc3MgYmFyLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbkNvdW50YCAtIGEgbnVtYmVyIG9mIHF1ZXN0aW9ucyB0aGF0IGhhdmUgaW5wdXQocykuIFdlIGRvIG5vdCBjb3VudCBodG1sIG9yIGV4cHJlc3Npb24gcXVlc3Rpb25zXG4gICAqIDxici8+IGBvcHRpb25zLmFuc3dlcmVkUXVlc3Rpb25Db3VudGAgLSBhIG51bWJlciBvZiBxdWVzdGlvbnMgdGhhdCBoYXZlIGlucHV0KHMpIGFuZCBhbiB1c2VyIGhhcyBhbnN3ZXJlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMucmVxdWlyZWRRdWVzdGlvbkNvdW50YCAtIGEgbnVtYmVyIG9mIHJlcXVpcmVkIHF1ZXN0aW9ucyB0aGF0IGhhdmUgaW5wdXQocykuIFdlIGRvIG5vdCBjb3VudCBodG1sIG9yIGV4cHJlc3Npb24gcXVlc3Rpb25zXG4gICAqIDxici8+IGBvcHRpb25zLnJlcXVpcmVkQW5zd2VyZWRRdWVzdGlvbkNvdW50YCAtIGEgbnVtYmVyIG9mIHJlcXVpcmVkIHF1ZXN0aW9ucyB0aGF0IGhhdmUgaW5wdXQocykgYW5kIGFuIHVzZXIgaGFzIGFuc3dlcmVkLlxuICAgKiAgQHNlZSBwcm9ncmVzc0JhclR5cGVcbiAgICovXG4gIHB1YmxpYyBvblByb2dyZXNzVGV4dDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8U3VydmV5TW9kZWw+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBwcm9jZXNzIHRoZSBtYXJrZG93biB0ZXh0LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lbGVtZW50YCAtIFN1cnZleUpTIGVsZW1lbnQgKGEgcXVlc3Rpb24sIHBhbmVsLCBwYWdlLCBvciBzdXJ2ZXkpIHdoZXJlIHRoZSBzdHJpbmcgaXMgZ29pbmcgdG8gYmUgcmVuZGVyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBwcm9wZXJ0eSBuYW1lIGlzIGdvaW5nIHRvIGJlIHJlbmRlcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy50ZXh0YCAtIGEgdGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHJlbmRlcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5odG1sYCAtIGFuIEhUTUwgY29udGVudC4gSXQgaXMgYG51bGxgIGJ5IGRlZmF1bHQuIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIEhUTUwgY29udGVudCByZW5kZXJlZCBpbnN0ZWFkIG9mIGBvcHRpb25zLnRleHRgLlxuICAgKi9cbiAgcHVibGljIG9uVGV4dE1hcmtkb3duOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIHNwZWNpdHkgcmVuZGVyIGNvbXBvbmVudCBuYW1lIHVzZWQgZm9yIHRleHQgcmVuZGVyaW5nLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lbGVtZW50YCAtIFN1cnZleUpTIGVsZW1lbnQgKGEgcXVlc3Rpb24sIHBhbmVsLCBwYWdlLCBvciBzdXJ2ZXkpIHdoZXJlIHRoZSBzdHJpbmcgaXMgZ29pbmcgdG8gYmUgcmVuZGVyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBwcm9wZXJ0eSBuYW1lIGlzIGdvaW5nIHRvIGJlIHJlbmRlcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yZW5kZXJBc2AgLSBhIGNvbXBvbmVudCBuYW1lIHVzZWQgZm9yIHRleHQgcmVuZGVyaW5nLlxuICAgKi9cbiAgcHVibGljIG9uVGV4dFJlbmRlckFzOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBmaXJlcyB3aGVuIGl0IGdldHMgcmVzcG9uc2UgZnJvbSB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2Ugb24gc2F2aW5nIHN1cnZleSByZXN1bHRzLiBVc2UgaXQgdG8gZmluZCBvdXQgaWYgdGhlIHJlc3VsdHMgaGF2ZSBiZWVuIHNhdmVkIHN1Y2Nlc3NmdWxseS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuc3VjY2Vzc2AgLSBpdCBpcyBgdHJ1ZWAgaWYgdGhlIHJlc3VsdHMgaGFzIGJlZW4gc2VudCB0byB0aGUgc2VydmljZSBzdWNjZXNzZnVsbHkuXG4gICAqIDxici8+IGBvcHRpb25zLnJlc3BvbnNlYCAtIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBvblNlbmRSZXN1bHQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVXNlIGl0IHRvIGdldCByZXN1bHRzIGFmdGVyIGNhbGxpbmcgdGhlIGBnZXRSZXN1bHRgIG1ldGhvZC4gSXQgcmV0dXJucyBhIHNpbXBsZSBhbmFseXRpY3MgZnJvbSBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuc3VjY2Vzc2AgLSBpdCBpcyBgdHJ1ZWAgaWYgdGhlIHJlc3VsdHMgd2VyZSBnb3QgZnJvbSB0aGUgc2VydmljZSBzdWNjZXNzZnVsbHkuXG4gICAqIDxici8+IGBvcHRpb25zLmRhdGFgIC0gdGhlIG9iamVjdCBge0Fuc3dlcnNDb3VudCwgUXVlc3Rpb25SZXN1bHQgOiB7fSB9YC4gYEFuc3dlcnNDb3VudGAgaXMgdGhlIG51bWJlciBvZiBwb3N0ZWQgc3VydmV5IHJlc3VsdHMuIGBRdWVzdGlvblJlc3VsdGAgaXMgYW4gb2JqZWN0IHdpdGggYWxsIHBvc3NpYmxlIHVuaXF1ZSBhbnN3ZXJzIHRvIHRoZSBxdWVzdGlvbiBhbmQgbnVtYmVyIG9mIHRoZXNlIGFuc3dlcnMuXG4gICAqIDxici8+IGBvcHRpb25zLmRhdGFMaXN0YCAtIGFuIGFycmF5IG9mIG9iamVjdHMgYHtuYW1lLCB2YWx1ZX1gLCB3aGVyZSBgbmFtZWAgaXMgYSB1bmlxdWUgdmFsdWUvYW5zd2VyIHRvIHRoZSBxdWVzdGlvbiBhbmQgYHZhbHVlYCBpcyBhIG51bWJlci9jb3VudCBvZiBzdWNoIGFuc3dlcnMuXG4gICAqIDxici8+IGBvcHRpb25zLnJlc3BvbnNlYCAtIHRoZSBzZXJ2ZXIgcmVzcG9uc2UuXG4gICAqIEBzZWUgZ2V0UmVzdWx0XG4gICAqL1xuICBwdWJsaWMgb25HZXRSZXN1bHQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHVwbG9hZGluZyB0aGUgZmlsZSBpbiBRdWVzdGlvbkZpbGUgd2hlbiBgc3RvcmVEYXRhQXNUZXh0YCBpcyBzZXQgdG8gYGZhbHNlYC4gVXNlIHRoaXMgZXZlbnQgdG8gY2hhbmdlIHRoZSB1cGxvYWRlZCBmaWxlIG5hbWUgb3IgdG8gcHJldmVudCBhIHBhcnRpY3VsYXIgZmlsZSBmcm9tIGJlaW5nIHVwbG9hZGVkLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSB0aGUgZmlsZSBxdWVzdGlvbiBpbnN0YW5jZS5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSB0aGUgcXVlc3Rpb24gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMuZmlsZXNgIC0gdGhlIEphdmFzY3JpcHQgRmlsZSBvYmplY3RzIGFycmF5IHRvIHVwbG9hZC5cbiAgICogPGJyLz4gYG9wdGlvbnMuY2FsbGJhY2tgIC0gYSBjYWxsYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdXBsb2FkIHN0YXR1cyBhbmQgdGhlIHVwZGxvYWRlZCBmaWxlIGNvbnRlbnQuXG4gICAqIEBzZWUgdXBsb2FkRmlsZXNcbiAgICogQHNlZSBRdWVzdGlvbkZpbGVNb2RlbC5zdG9yZURhdGFBc1RleHRcbiAgICogQHNlZSBvbkRvd25sb2FkRmlsZVxuICAgKiBAc2VlIG9uQ2xlYXJGaWxlc1xuICAgKiBAc2VlIFtWaWV3IEV4YW1wbGVzXShodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPXNpdGUlM0FodHRwcyUzQSUyRiUyRnN1cnZleWpzLmlvJTJGRXhhbXBsZXMlMkYrJTIyb25VcGxvYWRGaWxlcyUyMilcbiAgICovXG4gIHB1YmxpYyBvblVwbG9hZEZpbGVzOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBkb3dubG9hZGluZyBhIGZpbGUgaW4gUXVlc3Rpb25GaWxlLiBVc2UgdGhpcyBldmVudCB0byBwYXNzIHRoZSBmaWxlIHRvIGEgcHJldmlldy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSB0aGUgcXVlc3Rpb24gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29udGVudGAgLSB0aGUgZmlsZSBjb250ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5maWxlVmFsdWVgIC0gc2luZ2xlIGZpbGUgcXVlc3Rpb24gdmFsdWUuXG4gICAqIDxici8+IGBvcHRpb25zLmNhbGxiYWNrYCAtIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGRvd25sb2FkaW5nIHN0YXR1cyBhbmQgdGhlIGRvd25sb2FkZWQgZmlsZSBjb250ZW50LlxuICAgKiBAc2VlIGRvd25sb2FkRmlsZVxuICAgKiBAc2VlIG9uQ2xlYXJGaWxlc1xuICAgKiBAc2VlIG9uVXBsb2FkRmlsZXNcbiAgICogQHNlZSBbVmlldyBFeGFtcGxlc10oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT1zaXRlJTNBaHR0cHMlM0ElMkYlMkZzdXJ2ZXlqcy5pbyUyRkV4YW1wbGVzJTJGKyUyMm9uRG93bmxvYWRGaWxlJTIyKVxuICAgKi9cbiAgcHVibGljIG9uRG93bmxvYWRGaWxlOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgb24gY2xlYXJpbmcgdGhlIHZhbHVlIGluIGEgUXVlc3Rpb25GaWxlLiBVc2UgdGhpcyBldmVudCB0byByZW1vdmUgZmlsZXMgc3RvcmVkIG9uIHlvdXIgc2VydmVyLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgcXVlc3Rpb25gIC0gdGhlIHF1ZXN0aW9uIGluc3RhbmNlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIHRoZSBxdWVzdGlvbiBuYW1lLlxuICAgKiA8YnIvPiBgb3B0aW9ucy52YWx1ZWAgLSB0aGUgcXVlc3Rpb24gdmFsdWUuXG4gICAqIDxici8+IGBvcHRpb25zLmZpbGVOYW1lYCAtIGEgcmVtb3ZlZCBmaWxlJ3MgbmFtZSwgc2V0IGl0IHRvIGBudWxsYCB0byBjbGVhciBhbGwgZmlsZXMuXG4gICAqIDxici8+IGBvcHRpb25zLmNhbGxiYWNrYCAtIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBvcGVyYXRpb24gc3RhdHVzLlxuICAgKiBAc2VlIGNsZWFyRmlsZXNcbiAgICogQHNlZSBvbkRvd25sb2FkRmlsZVxuICAgKiBAc2VlIG9uVXBsb2FkRmlsZXNcbiAgICogQHNlZSBbVmlldyBFeGFtcGxlc10oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT1zaXRlJTNBaHR0cHMlM0ElMkYlMkZzdXJ2ZXlqcy5pbyUyRkV4YW1wbGVzJTJGKyUyMm9uQ2xlYXJGaWxlcyUyMilcbiAgICovXG4gIHB1YmxpYyBvbkNsZWFyRmlsZXM6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGNob2ljZXMgZm9yIHJhZGlvZ3JvdXAsIGNoZWNrYm94LCBhbmQgZHJvcGRvd24gaGFzIGJlZW4gbG9hZGVkIGZyb20gYSBSRVNUZnVsIHNlcnZpY2UgYW5kIGJlZm9yZSB0aGV5IGFyZSBhc3NpZ25lZCB0byBhIHF1ZXN0aW9uLlxuICAgKiBZb3UgbWF5IGNoYW5nZSB0aGUgY2hvaWNlcywgYmVmb3JlIHRoZXkgYXJlIGFzc2lnbmVkIG9yIGRpc2FibGUvZW5hYmxlZCBtYWtlIHZpc2libGUvaW52aXNpYmxlIHF1ZXN0aW9uLCBiYXNlZCBvbiBsb2FkZWQgcmVzdWx0cy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYHF1ZXN0aW9uYCAtIHRoZSBxdWVzdGlvbiB3aGVyZSBsb2FkZWQgY2hvaWNlcyBhcmUgZ29pbmcgdG8gYmUgYXNzaWduZWQuXG4gICAqIDxici8+IGBjaG9pY2VzYCAtIHRoZSBsb2FkZWQgY2hvaWNlcy4gWW91IGNhbiBjaGFuZ2UgdGhlIGxvYWRlZCBjaG9pY2VzIHRvIGJlZm9yZSB0aGV5IGFyZSBhc3NpZ25lZCB0byBxdWVzdGlvbi5cbiAgICogPGJyLz4gYHNlcnZlclJlc3VsdGAgLSBhIHJlc3VsdCB0aGF0IGNvbWVzIGZyb20gdGhlIHNlcnZlciBhcyBpdCBpcy5cbiAgICovXG4gIHB1YmxpYyBvbkxvYWRDaG9pY2VzRnJvbVNlcnZlcjogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIHN1cnZleSBpcyBsb2FkZWQgZnJvbSBhcGkuc3VydmV5anMuaW8gc2VydmljZS5cbiAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0byBwZXJmb3JtIG1hbmlwdWxhdGlvbiB3aXRoIHRoZSBzdXJ2ZXkgbW9kZWwgYWZ0ZXIgaXQgd2FzIGxvYWRlZCBmcm9tIHRoZSB3ZWIgc2VydmljZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogQHNlZSBzdXJ2ZXlJZFxuICAgKiBAc2VlIGxvYWRTdXJ2ZXlGcm9tU2VydmljZVxuICAgKi9cbiAgcHVibGljIG9uTG9hZGVkU3VydmV5RnJvbVNlcnZpY2U6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBwcm9jZXNzaW5nIHRoZSB0ZXh0IHdoZW4gaXQgZmluZHMgYSB0ZXh0IGluIGJyYWNrZXRzOiBge3NvbWV2YWx1ZX1gLiBCeSBkZWZhdWx0LCBpdCB1c2VzIHRoZSB2YWx1ZSBvZiBzdXJ2ZXkgcXVlc3Rpb24gdmFsdWVzIGFuZCB2YXJpYWJsZXMuXG4gICAqIEZvciBleGFtcGxlLCB5b3UgbWF5IHVzZSB0aGUgdGV4dCBwcm9jZXNzaW5nIGluIGxvYWRpbmcgY2hvaWNlcyBmcm9tIHRoZSB3ZWIuIElmIHlvdXIgYGNob2ljZXNCeVVybC51cmxgIGVxdWFscyB0byBcIlVybFRvU2VydmljZVRvR2V0QWxsQ2l0aWVzL3tjb3VudHJ5fS97c3RhdGV9XCIsXG4gICAqIHlvdSBtYXkgc2V0IG9uIHRoaXMgZXZlbnQgYG9wdGlvbnMudmFsdWVgIHRvIFwiYWxsXCIgb3IgZW1wdHkgc3RyaW5nIHdoZW4gdGhlIFwic3RhdGVcIiB2YWx1ZS9xdWVzdGlvbiBpcyBub24gc2VsZWN0ZWQgYnkgYSB1c2VyLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzaW5nIHZhbHVlLCBmb3IgZXhhbXBsZSwgXCJzdGF0ZVwiIGluIG91ciBleGFtcGxlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy52YWx1ZWAgLSB0aGUgdmFsdWUgb2YgdGhlIHByb2Nlc3NpbmcgdGV4dC5cbiAgICogPGJyLz4gYG9wdGlvbnMuaXNFeGlzdHNgIC0gYSBib29sZWFuIHZhbHVlLiBTZXQgaXQgdG8gYHRydWVgIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgYW5kIHNldCBpdCB0byBgZmFsc2VgIGlmIHlvdSBkb24ndC5cbiAgICovXG4gIHB1YmxpYyBvblByb2Nlc3NUZXh0VmFsdWU6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVuZGVyaW5nIGEgcXVlc3Rpb24uIFVzZSBpdCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBxdWVzdGlvbiBDU1MgY2xhc3Nlcy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBxdWVzdGlvbiBmb3Igd2hpY2ggeW91IGNhbiBjaGFuZ2UgdGhlIENTUyBjbGFzc2VzLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jc3NDbGFzc2VzYCAtIGFuIG9iamVjdCB3aXRoIENTUyBjbGFzc2VzLiBGb3IgZXhhbXBsZSBge3Jvb3Q6IFwidGFibGVcIiwgYnV0dG9uOiBcImJ1dHRvblwifWAuIFlvdSBjYW4gY2hhbmdlIHRoZW0gdG8geW91ciBvd24gQ1NTIGNsYXNzZXMuXG4gICAqL1xuICBwdWJsaWMgb25VcGRhdGVRdWVzdGlvbkNzc0NsYXNzZXM6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVuZGVyaW5nIGEgcGFuZWwuIFVzZSBpdCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBwYW5lbCBDU1MgY2xhc3Nlcy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFuZWxgIC0gYSBwYW5lbCBmb3Igd2hpY2ggeW91IGNhbiBjaGFuZ2UgdGhlIENTUyBjbGFzc2VzLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jc3NDbGFzc2VzYCAtIGFuIG9iamVjdCB3aXRoIENTUyBjbGFzc2VzLiBGb3IgZXhhbXBsZSBge3RpdGxlOiBcInN2X3BfdGl0bGVcIiwgZGVzY3JpcHRpb246IFwic21hbGxcIn1gLiBZb3UgY2FuIGNoYW5nZSB0aGVtIHRvIHlvdXIgb3duIENTUyBjbGFzc2VzLlxuICAgKi9cbiAgcHVibGljIG9uVXBkYXRlUGFuZWxDc3NDbGFzc2VzOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHJlbmRlcmluZyBhIHBhZ2UuIFVzZSBpdCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBwYWdlIENTUyBjbGFzc2VzLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYWdlYCAtIGEgcGFnZSBmb3Igd2hpY2ggeW91IGNhbiBjaGFuZ2UgdGhlIENTUyBjbGFzc2VzLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jc3NDbGFzc2VzYCAtIGFuIG9iamVjdCB3aXRoIENTUyBjbGFzc2VzLiBGb3IgZXhhbXBsZSBge3RpdGxlOiBcInN2X3BfdGl0bGVcIiwgZGVzY3JpcHRpb246IFwic21hbGxcIn1gLiBZb3UgY2FuIGNoYW5nZSB0aGVtIHRvIHlvdXIgb3duIENTUyBjbGFzc2VzLlxuICAgKi9cbiAgcHVibGljIG9uVXBkYXRlUGFnZUNzc0NsYXNzZXM6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBzdXJ2ZXkgaXMgcmVuZGVyZWQgaW4gRE9NLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5odG1sRWxlbWVudGAgLSBhIHJvb3QgSFRNTCBlbGVtZW50IGJvdW5kIHRvIHRoZSBzdXJ2ZXkgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXJTdXJ2ZXk6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBhIHBhZ2UgaXMgcmVuZGVyZWQgaW4gRE9NLiBVc2UgaXQgdG8gbW9kaWZ5IEhUTUwgZWxlbWVudHMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLmh0bWxFbGVtZW50YCAtIGFuIEhUTUwgZWxlbWVudCBib3VuZCB0byB0aGUgc3VydmV5IGhlYWRlciBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgb25BZnRlclJlbmRlckhlYWRlcjogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHJpZ2h0IGFmdGVyIGEgcGFnZSBpcyByZW5kZXJlZCBpbiBET00uIFVzZSBpdCB0byBtb2RpZnkgSFRNTCBlbGVtZW50cy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFnZWAgLSBhIHBhZ2Ugb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWQuIFR5cGljYWxseSB0aGUgY3VycmVudC9hY3RpdmUgcGFnZS5cbiAgICogPGJyLz4gYG9wdGlvbnMuaHRtbEVsZW1lbnRgIC0gYW4gSFRNTCBlbGVtZW50IGJvdW5kIHRvIHRoZSBwYWdlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyUGFnZTogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHJpZ2h0IGFmdGVyIGEgcXVlc3Rpb24gaXMgcmVuZGVyZWQgaW4gRE9NLiBVc2UgaXQgdG8gbW9kaWZ5IEhUTUwgZWxlbWVudHMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcXVlc3Rpb24gb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLmh0bWxFbGVtZW50YCAtIGFuIEhUTUwgZWxlbWVudCBib3VuZCB0byB0aGUgcXVlc3Rpb24gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXJRdWVzdGlvbjogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHJpZ2h0IGFmdGVyIGEgbm9uLWNvbXBvc2l0ZSBxdWVzdGlvbiAodGV4dCwgY29tbWVudCwgZHJvcGRvd24sIHJhZGlvZ3JvdXAsIGNoZWNrYm94KSBpcyByZW5kZXJlZCBpbiBET00uIFVzZSBpdCB0byBtb2RpZnkgSFRNTCBlbGVtZW50cy5cbiAgICogVGhpcyBldmVudCBpcyBub3QgZmlyZWQgZm9yIG1hdHJpY2VzLCBwYW5lbHMsIG11bHRpcGxlIHRleHQgYW5kIGltYWdlIHBpY2tlci5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBxdWVzdGlvbiBvYmplY3QgZm9yIHdoaWNoIHRoZSBldmVudCBpcyBmaXJlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMuaHRtbEVsZW1lbnRgIC0gYW4gSFRNTCBlbGVtZW50IGJvdW5kIHRvIHRoZSBxdWVzdGlvbiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgb25BZnRlclJlbmRlclF1ZXN0aW9uSW5wdXQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBhIHBhbmVsIGlzIHJlbmRlcmVkIGluIERPTS4gVXNlIGl0IHRvIG1vZGlmeSBIVE1MIGVsZW1lbnRzLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIGEgcGFuZWwgb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWRcbiAgICogPGJyLz4gYG9wdGlvbnMuaHRtbEVsZW1lbnRgIC0gYW4gSFRNTCBlbGVtZW50IGJvdW5kIHRvIHRoZSBwYW5lbCBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyUGFuZWw6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBuZXcgcm93IGluIE1hdHJpeCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gYSBuZXcgYWRkZWQgcm93LlxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwudmlzaWJsZVJvd3NcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeFJvd0FkZGVkOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIGFkZGluZyBhIG5ldyByb3cgaW4gTWF0cml4IER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBtYXRyaXggcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLmNhbkFkZFJvd2AgLSBzcGVjaWZpZXMgd2hldGhlciBhIG5ldyByb3cgY2FuIGJlIGFkZGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC52aXNpYmxlUm93c1xuICAgKi9cbiAgcHVibGljIG9uTWF0cml4QmVmb3JlUm93QWRkZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVtb3ZpbmcgYSByb3cgZnJvbSBNYXRyaXggRHluYW1pYyBxdWVzdGlvbi4gWW91IGNhbiBkaXNhYmxlIHJlbW92aW5nIGFuZCBjbGVhciB0aGUgZGF0YSBpbnN0ZWFkLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dJbmRleGAgLSBhIHJvdyBpbmRleC5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIGEgcm93IG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuYWxsb3dgIC0gYSBib29sZWFuIHByb3BlcnR5LiBTZXQgaXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIHRoZSByb3cgcmVtb3ZpbmcuXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBvbk1hdHJpeFJvd1JlbW92ZWRcbiAgICogQHNlZSBvbk1hdHJpeEFsbG93UmVtb3ZlUm93XG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhSb3dSZW1vdmluZzogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHJlbW92aW5nIGEgcm93IGZyb20gTWF0cml4IER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBtYXRyaXggcXVlc3Rpb25cbiAgICogPGJyLz4gYG9wdGlvbnMucm93SW5kZXhgIC0gYSByZW1vdmVkIHJvdyBpbmRleFxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gYSByZW1vdmVkIHJvdyBvYmplY3RcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsLnZpc2libGVSb3dzXG4gICAqIEBzZWUgb25NYXRyaXhSb3dSZW1vdmluZ1xuICAgKiBAc2VlIG9uTWF0cml4QWxsb3dSZW1vdmVSb3dcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeFJvd1JlbW92ZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVuZGVyaW5nIFwiUmVtb3ZlXCIgYnV0dG9uIGZvciByZW1vdmluZyBhIHJvdyBmcm9tIE1hdHJpeCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dJbmRleGAgLSBhIHJvdyBpbmRleC5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIGEgcm93IG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuYWxsb3dgIC0gYSBib29sZWFuIHByb3BlcnR5LiBTZXQgaXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIHRoZSByb3cgcmVtb3ZpbmcuXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBvbk1hdHJpeFJvd1JlbW92aW5nXG4gICAqIEBzZWUgb25NYXRyaXhSb3dSZW1vdmVkXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhBbGxvd1JlbW92ZVJvdzogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGZvciBldmVyeSBjZWxsIGNyZWF0ZWQgaW4gTWF0cml4IER5bmFtaWMgYW5kIE1hdHJpeCBEcm9wZG93biBxdWVzdGlvbnMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIHRoZSBtYXRyaXggcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLmNlbGxgIC0gdGhlIG1hdHJpeCBjZWxsLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jZWxsUXVlc3Rpb25gIC0gdGhlIHF1ZXN0aW9uL2VkaXRvciBpbiB0aGUgY2VsbC4gWW91IG1heSBjdXN0b21pemUgaXQsIGNoYW5nZSBpdCdzIHByb3BlcnRpZXMsIGxpa2UgY2hvaWNlcyBvciB2aXNpYmxlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dWYWx1ZWAgLSB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgcm93LiBUbyBhY2Nlc3MgYSBwYXJ0aWN1bGFyIGNvbHVtbidzIHZhbHVlIHdpdGhpbiB0aGUgY3VycmVudCByb3csIHVzZTogYG9wdGlvbnMucm93VmFsdWVbXCJjb2x1bW5WYWx1ZVwiXWAuXG4gICAqIDxici8+IGBvcHRpb25zLmNvbHVtbmAgLSB0aGUgbWF0cml4IGNvbHVtbiBvYmplY3QuXG4gICAqIDxici8+IGBvcHRpb25zLmNvbHVtbk5hbWVgIC0gdGhlIG1hdHJpeCBjb2x1bW4gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIHRoZSBtYXRyaXggcm93IG9iamVjdC5cbiAgICogQHNlZSBvbk1hdHJpeEJlZm9yZVJvd0FkZGVkXG4gICAqIEBzZWUgb25NYXRyaXhSb3dBZGRlZFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhDZWxsQ3JlYXRlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGZvciBldmVyeSBjZWxsIGFmdGVyIGlzIGhhcyBiZWVuIHJlbmRlcmVkIGluIERPTS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gdGhlIG1hdHJpeCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMuY2VsbGAgLSB0aGUgbWF0cml4IGNlbGwuXG4gICAqIDxici8+IGBvcHRpb25zLmNlbGxRdWVzdGlvbmAgLSB0aGUgcXVlc3Rpb24vZWRpdG9yIGluIHRoZSBjZWxsLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5odG1sRWxlbWVudGAgLSBhbiBIVE1MIGVsZW1lbnQgYm91bmQgdG8gdGhlIGBjZWxsUXVlc3Rpb25gIG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29sdW1uYCAtIHRoZSBtYXRyaXggY29sdW1uIG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIHRoZSBtYXRyaXggcm93IG9iamVjdC5cbiAgICogQHNlZSBvbk1hdHJpeENlbGxDcmVhdGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeEFmdGVyQ2VsbFJlbmRlcjogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gY2VsbCB2YWx1ZSBpcyBjaGFuZ2VkIGluIE1hdHJpeCBEeW5hbWljIGFuZCBNYXRyaXggRHJvcGRvd24gcXVlc3Rpb25zLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSB0aGUgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jb2x1bW5OYW1lYCAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIGEgbmV3IHZhbHVlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gdGhlIG1hdHJpeCByb3cgb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5nZXRDZWxsUXVlc3Rpb24oY29sdW1uTmFtZSlgIC0gdGhlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY2VsbCBxdWVzdGlvbiBieSBjb2x1bW4gbmFtZS5cbiAgICogQHNlZSBvbk1hdHJpeENlbGxWYWx1ZUNoYW5naW5nXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGNoYW5naW5nIGNlbGwgdmFsdWUgaW4gTWF0cml4IER5bmFtaWMgYW5kIE1hdHJpeCBEcm9wZG93biBxdWVzdGlvbnMuIFlvdSBtYXkgY2hhbmdlIHRoZSBgb3B0aW9ucy52YWx1ZWAgcHJvcGVydHkgdG8gY2hhbmdlIGEgY2VsbCB2YWx1ZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gdGhlIG1hdHJpeCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29sdW1uTmFtZWAgLSB0aGUgbWF0cml4IGNvbHVtbiBuYW1lLlxuICAgKiA8YnIvPiBgb3B0aW9ucy52YWx1ZWAgLSBhIG5ldyB2YWx1ZS5cbiAgICogPGJyLz4gYG9wdGlvbnMub2xkVmFsdWVgIC0gdGhlIG9sZCB2YWx1ZS5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIHRoZSBtYXRyaXggcm93IG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZ2V0Q2VsbFF1ZXN0aW9uKGNvbHVtbk5hbWUpYCAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBjZWxsIHF1ZXN0aW9uIGJ5IGNvbHVtbiBuYW1lLlxuICAgKiBAc2VlIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZFxuICAgKiBAc2VlIG9uTWF0cml4QmVmb3JlUm93QWRkZWRcbiAgICogQHNlZSBvbk1hdHJpeFJvd0FkZGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeENlbGxWYWx1ZUNoYW5naW5nOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiBNYXRyaXggRHluYW1pYyBhbmQgTWF0cml4IERyb3Bkb3duIHF1ZXN0aW9ucyB2YWxpZGF0ZSB0aGUgY2VsbCB2YWx1ZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZXJyb3JgIC0gYW4gZXJyb3Igc3RyaW5nLiBJdCBpcyBlbXB0eSBieSBkZWZhdWx0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSB0aGUgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jb2x1bW5OYW1lYCAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIGEgY2VsbCB2YWx1ZS5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIHRoZSBtYXRyaXggcm93IG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZ2V0Q2VsbFF1ZXN0aW9uKGNvbHVtbk5hbWUpYCAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNlbGwgcXVlc3Rpb24gYnkgY29sdW1uIG5hbWUuXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbFZhbGlkYXRlOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgbmV3IHBhbmVsIGluIFBhbmVsIER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcGFuZWwgcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIGFuIGFkZGVkIHBhbmVsLlxuICAgKiBAc2VlIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsLnBhbmVsc1xuICAgKi9cbiAgcHVibGljIG9uRHluYW1pY1BhbmVsQWRkZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiByZW1vdmluZyBhIHBhbmVsIGZyb20gUGFuZWwgRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBwYW5lbCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFuZWxJbmRleGAgLSBhIHJlbW92ZWQgcGFuZWwgaW5kZXguXG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIGEgcmVtb3ZlZCBwYW5lbC5cbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5wYW5lbHNcbiAgICovXG4gIHB1YmxpYyBvbkR5bmFtaWNQYW5lbFJlbW92ZWQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBldmVyeSBzZWNvbmQgaWYgdGhlIG1ldGhvZCBgc3RhcnRUaW1lcmAgaGFzIGJlZW4gY2FsbGVkLlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSB0aW1lU3BlbnRcbiAgICogQHNlZSBQYWdlLnRpbWVTcGVudFxuICAgKi9cbiAgcHVibGljIG9uVGltZXI6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBkaXNwbGF5aW5nIGEgbmV3IGluZm9ybWF0aW9uIGluIHRoZSBUaW1lciBQYW5lbC4gVXNlIGl0IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy50ZXh0YCAtIHRoZSB0aW1lciBwYW5lbCBpbmZvIHRleHQuXG4gICAqL1xuICBwdWJsaWMgb25UaW1lclBhbmVsSW5mb1RleHQ6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIGl0ZW0gdmFsdWUgaXMgY2hhbmdlZCBpbiBQYW5lbCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSB0aGUgcGFuZWwgcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIHRoZSBkeW5hbWljIHBhbmVsIGl0ZW0uXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gdGhlIGl0ZW0gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMudmFsdWVgIC0gYSBuZXcgdmFsdWUuXG4gICAqIDxici8+IGBvcHRpb25zLml0ZW1JbmRleGAgLSB0aGUgcGFuZWwgaXRlbSBpbmRleC5cbiAgICogPGJyLz4gYG9wdGlvbnMuaXRlbVZhbHVlYCAtIHRoZSBwYW5lbCBpdGVtIG9iamVjdC5cbiAgICogQHNlZSBvbkR5bmFtaWNQYW5lbEFkZGVkXG4gICAqIEBzZWUgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbFxuICAgKi9cbiAgcHVibGljIG9uRHluYW1pY1BhbmVsSXRlbVZhbHVlQ2hhbmdlZDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gZGVmaW5lLCB3aGV0aGVyIGFuIGFuc3dlciB0byBhIHF1ZXN0aW9uIGlzIGNvcnJlY3Qgb3Igbm90LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIG9uIHdoaWNoIHlvdSBoYXZlIHRvIGRlY2lkZSBpZiB0aGUgYW5zd2VyIGlzIGNvcnJlY3Qgb3Igbm90LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yZXN1bHRgIC0gcmV0dXJucyBgdHJ1ZWAsIGlmIGFuIGFuc3dlciBpcyBjb3JyZWN0LCBvciBgZmFsc2VgLCBpZiB0aGUgYW5zd2VyIGlzIG5vdCBjb3JyZWN0LiBVc2UgcXVlc3Rpb25zJyBgdmFsdWVgIGFuZCBgY29ycmVjdEFuc3dlcmAgcHJvcGVydGllcyB0byByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUuXG4gICAqIDxici8+IGBvcHRpb25zLmNvcnJlY3RBbnN3ZXJzYCAtIHlvdSBtYXkgY2hhbmdlIHRoZSBkZWZhdWx0IG51bWJlciBvZiBjb3JyZWN0IG9yIGluY29ycmVjdCBhbnN3ZXJzIGluIHRoZSBxdWVzdGlvbiwgZm9yIGV4YW1wbGUgZm9yIG1hdHJpeCwgd2hlcmUgZWFjaCByb3cgaXMgYSBxdWl6IHF1ZXN0aW9uLlxuICAgKiBAc2VlIFF1ZXN0aW9uLnZhbHVlXG4gICAqIEBzZWUgUXVlc3Rpb24uY29ycmVjdEFuc3dlclxuICAgKi9cbiAgcHVibGljIG9uSXNBbnN3ZXJDb3JyZWN0OiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjb250cm9sIGRyYWcmZHJvcCBvcGVyYXRpb25zIGR1cmluZyBkZXNpZ24gbW9kZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuYWxsb3dgIC0gc2V0IGl0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZSBkcmFnZ2luZy5cbiAgICogPGJyLz4gYG9wdGlvbnMudGFyZ2V0YCAtIGEgdGFyZ2V0IGVsZW1lbnQgdGhhdCBpcyBkcmFnZ2VkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5zb3VyY2VgIC0gYSBzb3VyY2UgZWxlbWVudC4gSXQgY2FuIGJlIGBudWxsYCwgaWYgaXQgaXMgYSBuZXcgZWxlbWVudCwgZHJhZ2dpbmcgZnJvbSB0b29sYm94LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYXJlbnRgIC0gYSBwYWdlIG9yIHBhbmVsIHdoZXJlIHRhcmdldCBlbGVtZW50IGlzIGRyYWdnaW5nLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5pbnNlcnRCZWZvcmVgIC0gYW4gZWxlbWVudCBiZWZvcmUgdGhlIHRhcmdldCBlbGVtZW50IGlzIGRyYWdnaW5nLiBJdCBjYW4gYmUgYG51bGxgIGlmIHBhcmVudCBjb250YWluZXIgKHBhZ2Ugb3IgcGFuZWwpIGlzIGVtcHR5IG9yIGRyYWdnaW5nIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIGxhc3QgZWxlbWVudCBpbiBhIGNvbnRhaW5lci5cbiAgICogPGJyLz4gYG9wdGlvbnMuaW5zZXJ0QWZ0ZXJgIC0gYW4gZWxlbWVudCBhZnRlciB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgZHJhZ2dpbmcuIEl0IGNhbiBiZSBgbnVsbGAgaWYgcGFyZW50IGNvbnRhaW5lciAocGFnZSBvciBwYW5lbCkgaXMgZW1wdHkgb3IgZHJhZ2dpbmcgZWxlbWVudCB0byB0aGUgZmlyc3QgcG9zaXRpb24gd2l0aGluIHRoZSBwYXJlbnQgY29udGFpbmVyLlxuICAgKiBAc2VlIHNldERlc2lnbk1vZGVcbiAgICogQHNlZSBpc0Rlc2lnbk1vZGVcbiAgICovXG4gIHB1YmxpYyBvbkRyYWdEcm9wQWxsb3c6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFN1cnZleU1vZGVsPigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gY29udHJvbCBzY3JvbGxpbmcgZWxlbWVudCB0byB0b3AuIFlvdSBjYW4gY2FuY2VsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGJ5IHNldHRpbmcgb3B0aW9ucy5jYW5jZWwgcHJvcGVydHkgdG8gdHJ1ZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZWxlbWVudGAgLSBhbiBlbGVtZW50IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2Nyb2xsZWQgb24gdG9wLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIHRoYXQgaXMgZ29pbmcgdG8gYmUgc2Nyb2xsZWQgb24gdG9wLiBJdCBjYW4gYmUgbnVsbCBpZiBvcHRpb25zLnBhZ2UgaXMgbm90IG51bGwuXG4gICAqIDxici8+IGBvcHRpb25zLnBhZ2VgIC0gYSBwYWdlIHRoYXQgaXMgZ29pbmcgdG8gYmUgc2Nyb2xsZWQgb24gdG9wLiBJdCBjYW4gYmUgbnVsbCBpZiBvcHRpb25zLnF1ZXN0aW9uIGlzIG5vdCBudWxsLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lbGVtZW50SWRgIC0gdGhlIHVuaXF1ZSBlbGVtZW50IERPTSBJZC5cbiAgICogPGJyLz4gYG9wdGlvbnMuY2FuY2VsYCAtIHNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gY2FuY2VsIHRoZSBkZWZhdWx0IHNjcm9sbGluZy5cbiAgICovXG4gIHB1YmxpYyBvblNjcm9sbGluZ0VsZW1lbnRUb1RvcDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuXG4gIHB1YmxpYyBvbkxvY2FsZUNoYW5nZWRFdmVudDogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjcmVhdGUvY3VzdG9taXplIGFjdGlvbnMgdG8gYmUgZGlzcGxheWVkIGluIGEgcXVlc3Rpb24ncyB0aXRsZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSBBIFtTdXJ2ZXldKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPVN1cnZleU1vZGVsKSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIEEgW1F1ZXN0aW9uXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1RdWVzdGlvbikgb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLnRpdGxlQWN0aW9uc2AgLSBBIGxpc3Qgb2YgYWN0aW9ucyAoW0lBY3Rpb25dKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPUlBY3Rpb24pIG9iamVjdHMpIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzc2VkIHF1ZXN0aW9uLlxuICAgKiBAc2VlIElBY3Rpb25cbiAgICogQHNlZSBRdWVzdGlvblxuICAgKi9cbiAgcHVibGljIG9uR2V0UXVlc3Rpb25UaXRsZUFjdGlvbnM6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGNyZWF0ZS9jdXN0b21pemUgYWN0aW9ucyB0byBiZSBkaXNwbGF5ZWQgaW4gYSBwYW5lbCdzIHRpdGxlLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIEEgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFuZWxgIC0gQSBwYW5lbCAoW1BhbmVsTW9kZWxdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPXBhbmVsbW9kZWwpIG9iamVjdCkgZm9yIHdoaWNoIHRoZSBldmVudCBpcyBmaXJlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMudGl0bGVBY3Rpb25zYCAtIEEgbGlzdCBvZiBhY3Rpb25zIChbSUFjdGlvbl0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnk/aWQ9SUFjdGlvbikgb2JqZWN0cykgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzZWQgcGFuZWwuXG4gICAqIEBzZWUgSUFjdGlvblxuICAgKiBAc2VlIFBhbmVsTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbkdldFBhbmVsVGl0bGVBY3Rpb25zOiBFdmVudEJhc2U8U3VydmV5TW9kZWw+ID0gdGhpcy5hZGRFdmVudDxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjcmVhdGUvY3VzdG9taXplIGFjdGlvbnMgdG8gYmUgZGlzcGxheWVkIGluIGEgcGFnZSdzIHRpdGxlLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIEEgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFnZWAgLSBBIHBhZ2UgKFtQYWdlTW9kZWxdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5P2lkPXBhZ2Vtb2RlbCkgb2JqZWN0KSBmb3Igd2hpY2ggdGhlIGV2ZW50IGlzIGZpcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy50aXRsZUFjdGlvbnNgIC0gQSBsaXN0IG9mIGFjdGlvbnMgKFtJQWN0aW9uXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1JQWN0aW9uKSBvYmplY3RzKSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3NlZCBwYWdlLlxuICAgKiBAc2VlIElBY3Rpb25cbiAgICogQHNlZSBQYWdlTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbkdldFBhZ2VUaXRsZUFjdGlvbnM6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGNyZWF0ZS9jdXN0b21pemUgYWN0aW9ucyB0byBiZSBkaXNwbGF5ZWQgaW4gYSBtYXRyaXggcXVlc3Rpb24ncyByb3cuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gQSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBBIG1hdHJpeCBxdWVzdGlvbiAoW1F1ZXN0aW9uTWF0cml4QmFzZU1vZGVsXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1xdWVzdGlvbm1hdHJpeGJhc2Vtb2RlbCkgb2JqZWN0KSBmb3Igd2hpY2ggdGhlIGV2ZW50IGlzIGZpcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gQSBtYXRyaXggcm93IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLmFjdGlvbnNgIC0gQSBsaXN0IG9mIGFjdGlvbnMgKFtJQWN0aW9uXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeT9pZD1JQWN0aW9uKSBvYmplY3RzKSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3NlZCBtYXRyaXggcXVlc3Rpb24gYW5kIHJvdy5cbiAgICogQHNlZSBJQWN0aW9uXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICAgKi9cbiAgcHVibGljIG9uR2V0TWF0cml4Um93QWN0aW9uczogRXZlbnRCYXNlPFN1cnZleU1vZGVsPiA9IHRoaXMuYWRkRXZlbnQ8XG4gICAgU3VydmV5TW9kZWxcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIHRoZSBzdXJ2ZXkgZWxlbWVudCBjb250ZW50IHdhcyBjb2xsYXBzZWQgb3IgZXhwYW5kZWQuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLmVsZW1lbnRgIC0gU3BlY2lmaWVzIHdoaWNoIHN1cnZleSBlbGVtZW50IGNvbnRlbnQgd2FzIGNvbGxhcHNlZCBvciBleHBhbmRlZC5cbiAgICogQHNlZSBvbkVsZW1lbnRDb250ZW50VmlzaWJpbGl0eUNoYW5nZWRcbiAgICovXG4gIHB1YmxpYyBvbkVsZW1lbnRDb250ZW50VmlzaWJpbGl0eUNoYW5nZWQ6IEV2ZW50QmFzZTxcbiAgICBTdXJ2ZXlNb2RlbFxuICA+ID0gdGhpcy5hZGRFdmVudDxTdXJ2ZXlNb2RlbD4oKTtcblxuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBleHByZXNzaW9uIHF1ZXN0aW9uIGNvbnZlcnQgaXQncyB2YWx1ZSBpbnRvIGRpc3BsYXkgdmFsdWUgZm9yIHJlbmRlcmluZy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gVGhlIGV4cHJlc3Npb24gcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIFRoZSBxdWVzdGlvbiB2YWx1ZS5cbiAgICogPGJyLz4gYG9wdGlvbnMuZGlzcGxheVZhbHVlYCAtIHRoZSBkaXNwbGF5IHZhbHVlIHRoYXQgeW91IGNhbiBjaGFuZ2UgYmVmb3JlIHJlbmRlcmluZy5cbiAgICovXG4gIHB1YmxpYyBvbkdldEV4cHJlc3Npb25EaXNwbGF5VmFsdWU6IEV2ZW50QmFzZTxTdXJ2ZXlNb2RlbD4gPSB0aGlzLmFkZEV2ZW50PFxuICAgIFN1cnZleU1vZGVsXG4gID4oKTtcblxuICAvLyNlbmRyZWdpb25cblxuICBjb25zdHJ1Y3Rvcihqc29uT2JqOiBhbnkgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBTdXJ2ZXlNb2RlbC5zdHlsZXNNYW5hZ2VyID0gbmV3IFN0eWxlc01hbmFnZXIoKTtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJkZXNjcmlwdGlvblwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibG9nb1wiLCB0aGlzLCBmYWxzZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbXBsZXRlZEh0bWxcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbXBsZXRlZEJlZm9yZUh0bWxcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImxvYWRpbmdIdG1sXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJzdGFydFN1cnZleVRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhZ2VQcmV2VGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFnZU5leHRUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZVRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInByZXZpZXdUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJlZGl0VGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIsIHRoaXMsIHRydWUpO1xuXG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yID0gbmV3IFRleHRQcmVQcm9jZXNzb3IoKTtcbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3Iub25Qcm9jZXNzID0gKHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKSA9PiB7XG4gICAgICB0aGlzLmdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcbiAgICAgIFwicGFnZXNcIixcbiAgICAgICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZG9PblBhZ2VBZGRlZCh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kb09uUGFnZVJlbW92ZWQodmFsdWUpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInRyaWdnZXJzXCIsICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICB2YWx1ZS5zZXRPd25lcih0aGlzKTtcbiAgICB9KTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwiY2FsY3VsYXRlZFZhbHVlc1wiLCAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgdmFsdWUuc2V0T3duZXIodGhpcyk7XG4gICAgfSk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcImNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvblwiLCAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgdmFsdWUubG9jT3duZXIgPSB0aGlzO1xuICAgIH0pO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb25cIiwgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIHZhbHVlLmxvY093bmVyID0gdGhpcztcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiZmlyc3RQYWdlSXNTdGFydGVkXCIsICgpID0+IHtcbiAgICAgIHRoaXMub25GaXJzdFBhZ2VJc1N0YXJ0ZWRDaGFuZ2VkKCk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcIm1vZGVcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5vbk1vZGVDaGFuZ2VkKCk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInByb2dyZXNzQmFyVHlwZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVByb2dyZXNzVGV4dCgpO1xuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCBcInJlcXVpcmVkVGV4dFwiLCBcInF1ZXN0aW9uVGl0bGVQYXR0ZXJuXCJdLFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc2V0VmlzaWJsZUluZGV4ZXMoKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMub25HZXRRdWVzdGlvbk5vLm9uQ2FsbGJhY2tzQ2hhbmdlZCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVzZXRWaXNpYmxlSW5kZXhlcygpO1xuICAgIH07XG4gICAgdGhpcy5vblByb2dyZXNzVGV4dC5vbkNhbGxiYWNrc0NoYW5nZWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVByb2dyZXNzVGV4dCgpO1xuICAgIH07XG4gICAgdGhpcy5vblRleHRNYXJrZG93bi5vbkNhbGxiYWNrc0NoYW5nZWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfTtcbiAgICB0aGlzLm9uR2V0UXVlc3Rpb25UaXRsZS5vbkNhbGxiYWNrc0NoYW5nZWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfTtcbiAgICB0aGlzLm9uQmVmb3JlQ3JlYXRpbmcoKTtcbiAgICBpZiAoanNvbk9iaikge1xuICAgICAgaWYgKHR5cGVvZiBqc29uT2JqID09PSBcInN0cmluZ1wiIHx8IGpzb25PYmogaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAganNvbk9iaiA9IEpTT04ucGFyc2UoanNvbk9iaiBhcyBzdHJpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKGpzb25PYmogJiYganNvbk9iai5jbGllbnRJZCkge1xuICAgICAgICB0aGlzLmNsaWVudElkID0ganNvbk9iai5jbGllbnRJZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZnJvbUpTT04oanNvbk9iaik7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXlJZCkge1xuICAgICAgICB0aGlzLmxvYWRTdXJ2ZXlGcm9tU2VydmljZSh0aGlzLnN1cnZleUlkLCB0aGlzLmNsaWVudElkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZXJyb3JzIG9uIGxvYWRpbmcgc3VydmV5IEpTT04uIElmIHRoZSBsaXN0IGlzIGVtcHR5IGFmdGVyIGxvYWRpbmcgYSBKU09OLCB0aGVuIHRoZSBKU09OIGlzIGNvcnJlY3QgYW5kIGhhcyBubyBlcnJvcnMuXG4gICAqIEBzZWUgSnNvbkVycm9yXG4gICAqL1xuICBwdWJsaWMganNvbkVycm9yczogQXJyYXk8SnNvbkVycm9yPiA9IG51bGw7XG5cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzdXJ2ZXlcIjtcbiAgfVxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAobmFtZSA9PT0gXCJxdWVzdGlvbnNPblBhZ2VNb2RlXCIpIHtcbiAgICAgIHRoaXMub25RdWVzdGlvbnNPblBhZ2VNb2RlQ2hhbmdlZChvbGRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBwYWdlcyBpbiB0aGUgc3VydmV5LCBpbmNsdWRpbmcgaW52aXNpYmxlIHBhZ2VzLlxuICAgKiBAc2VlIFBhZ2VNb2RlbFxuICAgKiBAc2VlIHZpc2libGVQYWdlc1xuICAgKi9cbiAgcHVibGljIGdldCBwYWdlcygpOiBBcnJheTxQYWdlTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFnZXNcIik7XG4gIH1cbiAgcHVibGljIGdldENzcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNzcztcbiAgfVxuICBwcml2YXRlIGNzc1ZhbHVlOiBhbnkgPSBudWxsO1xuICBwdWJsaWMgZ2V0IGNzcygpOiBhbnkge1xuICAgIGlmICghdGhpcy5jc3NWYWx1ZSkge1xuICAgICAgdGhpcy5jc3NWYWx1ZSA9IHt9O1xuICAgICAgdGhpcy5jb3B5Q3NzQ2xhc3Nlcyh0aGlzLmNzc1ZhbHVlLCBzdXJ2ZXlDc3MuZ2V0Q3NzKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jc3NWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGNzcyh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzKGZhbHNlKTtcbiAgICB0aGlzLm1lcmdlVmFsdWVzKHZhbHVlLCB0aGlzLmNzcyk7XG4gIH1cbiAgcHVibGljIGdldCBjc3NOYXZpZ2F0aW9uQ29tcGxldGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmF2aWdhdGlvbkNzcyhcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24sXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uLmNvbXBsZXRlXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25QcmV2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLmdldE5hdmlnYXRpb25Dc3MoXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uLFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5wcmV2aWV3XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25FZGl0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE5hdmlnYXRpb25Dc3MoXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uLFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5lZGl0XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25QcmV2KCkge1xuICAgIHJldHVybiB0aGlzLmdldE5hdmlnYXRpb25Dc3MoXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uLFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5wcmV2XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25TdGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXZpZ2F0aW9uQ3NzKFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbkJ1dHRvbixcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb24uc3RhcnRcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzTmF2aWdhdGlvbk5leHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmF2aWdhdGlvbkNzcyhcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24sXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uLm5leHRcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY29tcGxldGVkQ3NzKCkge1xuICAgIHZhciBjc3MgPSB0aGlzLmNzcztcbiAgICByZXR1cm4gY3NzLmJvZHkgKyBcIiBcIiArIGNzcy5jb21wbGV0ZWRQYWdlO1xuICB9XG4gIHByaXZhdGUgZ2V0TmF2aWdhdGlvbkNzcyhtYWluOiBzdHJpbmcsIGJ0bjogc3RyaW5nKSB7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgaWYgKG1haW4pIHJlcyA9IG1haW47XG4gICAgaWYgKGJ0bikgcmVzICs9IFwiIFwiICsgYnRuO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBsYXp5UmVuZGVyaW5nVmFsdWU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IGFsbCByb3dzIGFyZSByZW5kZXJlZCBubyBtYXR0ZXJzIGlmIHRoZXkgYXJlIHZpc2libGUgb3Igbm90LlxuICAgKiBTZXQgaXQgdHJ1ZSwgYW5kIHN1cnZleSBtYXJrdXAgcm93cyB3aWxsIGJlIHJlbmRlcmVkIG9ubHkgaWYgdGhleSBhcmUgdmlzaWJsZSBpbiB2aWV3cG9ydC5cbiAgICogVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1hbnRhbCBhbmQgbWlnaHQgZG8gbm90IHN1cHBvcnQgYWxsIHRoZSB1c2UgY2FzZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxhenlSZW5kZXJpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGF6eVJlbmRlcmluZ1ZhbHVlID09PSB0cnVlO1xuICB9XG4gIHB1YmxpYyBzZXQgbGF6eVJlbmRlcmluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmxhenlSZW5kZXJpbmdWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzTGF6eVJlbmRlcmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXp5UmVuZGVyaW5nIHx8IHNldHRpbmdzLmxhenlSb3dzUmVuZGVyaW5nO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlTGF6eVJlbmRlcmluZ1Jvd3NPblJlbW92aW5nRWxlbWVudHMoKSB7XG4gICAgaWYgKCF0aGlzLmlzTGF6eVJlbmRlcmluZykgcmV0dXJuO1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAoISFwYWdlKSB7XG4gICAgICBzY3JvbGxFbGVtZW50QnlDaGlsZElkKHBhZ2UuaWQpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgbGlzdCBvZiB0cmlnZ2VycyBpbiB0aGUgc3VydmV5LlxuICAgKiBAc2VlIFN1cnZleVRyaWdnZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgdHJpZ2dlcnMoKTogQXJyYXk8U3VydmV5VHJpZ2dlcj4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0cmlnZ2Vyc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRyaWdnZXJzKHZhbDogQXJyYXk8U3VydmV5VHJpZ2dlcj4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0cmlnZ2Vyc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBsaXN0IG9mIGNhbGN1bGF0ZWQgdmFsdWVzIGluIHRoZSBzdXJ2ZXkuXG4gICAqIEBzZWUgQ2FsY3VsYXRlZFZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhbGN1bGF0ZWRWYWx1ZXMoKTogQXJyYXk8Q2FsY3VsYXRlZFZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNhbGN1bGF0ZWRWYWx1ZXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBjYWxjdWxhdGVkVmFsdWVzKHZhbDogQXJyYXk8Q2FsY3VsYXRlZFZhbHVlPikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNhbGN1bGF0ZWRWYWx1ZXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGFuIGlkZW50aWZpZXIgb2YgYSBzdXJ2ZXkgbW9kZWwgbG9hZGVkIGZyb20gdGhlIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlLiBXaGVuIHNwZWNpZmllZCwgdGhlIHN1cnZleSBKU09OIGlzIGF1dG9tYXRpY2FsbHkgbG9hZGVkIGZyb20gW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UuXG4gICAqIEBzZWUgbG9hZFN1cnZleUZyb21TZXJ2aWNlXG4gICAqIEBzZWUgb25Mb2FkZWRTdXJ2ZXlGcm9tU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdXJ2ZXlJZFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1cnZleUlkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5SWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGFuIGlkZW50aWZpZXIgb2YgYSBzdXJ2ZXkgbW9kZWwgc2F2ZWQgdG8gdGhlIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlLiBXaGVuIHNwZWNpZmllZCwgdGhlIHN1cnZleSBkYXRhIGlzIGF1dG9tYXRpY2FsbHkgc2F2ZWQgdG8gdGhlIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlLlxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICogQHNlZSBzdXJ2ZXlTaG93RGF0YVNhdmluZ1xuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlQb3N0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5UG9zdElkXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3VydmV5UG9zdElkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5UG9zdElkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB1c2VyJ3MgaWRlbnRpZmllciAoZS5nLiwgZS1tYWlsIG9yIHVuaXF1ZSBjdXN0b21lciBpZCkgaW4geW91ciB3ZWIgYXBwbGljYXRpb24uXG4gICAqIElmIHlvdSBsb2FkIHN1cnZleSBvciBwb3N0IHN1cnZleSByZXN1bHRzIGZyb20vdG8gW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UsIHRoZW4gdGhlIGxpYnJhcnkgZG8gbm90IGFsbG93IHVzZXJzIHRvIHJ1biB0aGUgc2FtZSBzdXJ2ZXkgdGhlIHNlY29uZCB0aW1lLlxuICAgKiBPbiB0aGUgc2Vjb25kIHJ1biwgdGhlIHVzZXIgd2lsbCBzZWUgdGhlIHN1cnZleSBjb21wbGV0ZSBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBjbGllbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjbGllbnRJZFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsaWVudElkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2xpZW50SWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgY29va2llIG5hbWUgdXNlZCB0byBzYXZlIGluZm9ybWF0aW9uIGFib3V0IGNvbXBsZXRpbmcgdGhlIHN1cnZleS5cbiAgICogSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBlbXB0eSwgYmVmb3JlIHN0YXJ0aW5nIHRoZSBzdXJ2ZXksIHRoZSBTdXJ2ZXkgbGlicmFyeSBjaGVja3MgaWYgdGhlIGNvb2tpZSB3aXRoIHRoaXMgbmFtZSBleGlzdHMuXG4gICAqIElmIGl0IGlzIGB0cnVlYCwgdGhlIHN1cnZleSBnb2VzIHRvIGNvbXBsZXRlIG1vZGUgYW5kIGEgdXNlciBzZWVzIHRoZSBzdXJ2ZXkgY29tcGxldGUgcGFnZS4gT24gY29tcGxldGluZyB0aGUgc3VydmV5IHRoZSBjb29raWUgd2l0aCB0aGlzIG5hbWUgaXMgY3JlYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29va2llTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb29raWVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29va2llTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvb2tpZU5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdG8gc2F2ZSBzdXJ2ZXkgcmVzdWx0cyBvbiBjb21wbGV0aW5nIGV2ZXJ5IHBhZ2UuIElmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBzZXQgdG8gYHRydWVgLCB0aGUgYG9uUGFydGlhbFNlbmRgIGV2ZW50IGlzIGZpcmVkLlxuICAgKiBAc2VlIG9uUGFydGlhbFNlbmRcbiAgICogQHNlZSBjbGllbnRJZFxuICAgKi9cbiAgcHVibGljIGdldCBzZW5kUmVzdWx0T25QYWdlTmV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2VuZFJlc3VsdE9uUGFnZU5leHRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VuZFJlc3VsdE9uUGFnZU5leHQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2VuZFJlc3VsdE9uUGFnZU5leHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdG8gc2hvdyB0aGUgcHJvZ3Jlc3Mgb24gc2F2aW5nL3NlbmRpbmcgZGF0YSBpbnRvIHRoZSBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZS5cbiAgICogQHNlZSBzdXJ2ZXlQb3N0SWRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3VydmV5U2hvd0RhdGFTYXZpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVNob3dEYXRhU2F2aW5nXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1cnZleVNob3dEYXRhU2F2aW5nKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVNob3dEYXRhU2F2aW5nXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRoZSBmaXJzdCBpbnB1dCBpcyBmb2N1c2VkIG9uIHNob3dpbmcgYSBuZXh0IG9yIGEgcHJldmlvdXMgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRoZSBmaXJzdCBpbnB1dCBpcyBmb2N1c2VkIGlmIHRoZSBjdXJyZW50IHBhZ2UgaGFzIGVycm9ycy5cbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gYGZhbHNlYCAodGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRydWVgKSBpZiB5b3UgZG8gbm90IHdhbnQgdG8gYnJpbmcgdGhlIGZvY3VzIHRvIHRoZSBmaXJzdCBxdWVzdGlvbiB0aGF0IGhhcyBlcnJvciBvbiB0aGUgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZm9jdXNPbkZpcnN0RXJyb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImZvY3VzT25GaXJzdEVycm9yXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgZm9jdXNPbkZpcnN0RXJyb3IodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNPbkZpcnN0RXJyb3JcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBuYXZpZ2F0aW9uIGJ1dHRvbnMgcG9zaXRpb24uXG4gICAqIFBvc3NpYmxlIHZhbHVlczogJ2JvdHRvbScgKGRlZmF1bHQpLCAndG9wJywgJ2JvdGgnIGFuZCAnbm9uZScuIFNldCBpdCB0byAnbm9uZScgdG8gaGlkZSAnUHJldicsICdOZXh0JyBhbmQgJ0NvbXBsZXRlJyBidXR0b25zLlxuICAgKiBJdCBtYWtlcyBzZW5zZSBpZiB5b3UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhIGN1c3RvbSBuYXZpZ2F0aW9uLCBoYXZlIG9ubHkgYSBzaW5nbGUgcGFnZSwgb3IgdGhlIGBnb05leHRQYWdlQXV0b21hdGljYCBwcm9wZXJ0eSBpcyBzZXQgdG8gYHRydWVgLlxuICAgKiBAc2VlIGdvTmV4dFBhZ2VBdXRvbWF0aWNcbiAgICogQHNlZSBzaG93UHJldkJ1dHRvblxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TmF2aWdhdGlvbkJ1dHRvbnMoKTogc3RyaW5nIHwgYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd05hdmlnYXRpb25CdXR0b25zXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd05hdmlnYXRpb25CdXR0b25zKHZhbDogc3RyaW5nIHwgYW55KSB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsID0gXCJib3R0b21cIjtcbiAgICB9XG4gICAgaWYgKHZhbCA9PT0gZmFsc2UpIHtcbiAgICAgIHZhbCA9IFwibm9uZVwiO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93TmF2aWdhdGlvbkJ1dHRvbnNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdGhlIFN1cnZleSBkaXNwbGF5cyBcIlByZXZcIiBidXR0b24gaW4gaXRzIHBhZ2VzLiBTZXQgaXQgdG8gYGZhbHNlYCB0byBwcmV2ZW50IGVuZC11c2VycyBmcm9tIGdvaW5nIGJhY2sgdG8gdGhlaXIgYW5zd2Vycy5cbiAgICogQHNlZSBzaG93TmF2aWdhdGlvbkJ1dHRvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1ByZXZCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQcmV2QnV0dG9uXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1ByZXZCdXR0b24odmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1ByZXZCdXR0b25cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdGhlIFN1cnZleSBkaXNwbGF5cyBzdXJ2ZXkgdGl0bGUgaW4gaXRzIHBhZ2VzLiBTZXQgaXQgdG8gYGZhbHNlYCB0byBoaWRlIGEgc3VydmV5IHRpdGxlLlxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1RpdGxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUaXRsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0aGUgU3VydmV5IGRpc3BsYXlzIHBhZ2UgdGl0bGVzLiBTZXQgaXQgdG8gYGZhbHNlYCB0byBoaWRlIHBhZ2UgdGl0bGVzLlxuICAgKiBAc2VlIFBhZ2VNb2RlbC50aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UGFnZVRpdGxlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1BhZ2VUaXRsZXNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UGFnZVRpdGxlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZVRpdGxlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBPbiBmaW5pc2hpbmcgdGhlIHN1cnZleSB0aGUgY29tcGxldGUgcGFnZSBpcyBzaG93bi4gU2V0IHRoZSBwcm9wZXJ0eSB0byBgZmFsc2VgLCB0byBoaWRlIHRoZSBjb21wbGV0ZSBwYWdlLlxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqIEBzZWUgbmF2aWdhdGVUb1VybFxuICAgKi9cbiAgcHVibGljIGdldCBzaG93Q29tcGxldGVkUGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0NvbXBsZXRlZFBhZ2VcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93Q29tcGxldGVkUGFnZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93Q29tcGxldGVkUGFnZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBhIHVybCB5b3Ugd2FudCB0byBuYXZpZ2F0ZSBhZnRlciBhIHVzZXIgY29tcGxldGluZyB0aGUgc3VydmV5LlxuICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgYWZ0ZXIgY2FsbGluZyBvbkNvbXBsZXRlIGV2ZW50LiBJbiBjYXNlIGNhbGxpbmcgb3B0aW9ucy5zaG93RGF0YVNhdmluZyBjYWxsYmFjayBpbiBvbkNvbXBsZXRlIGV2ZW50LCBuYXZpZ2F0ZVRvVXJsIHdpbGwgYmUgdXNlZCBvbiBjYWxsaW5nIG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdTdWNjZXNzIGNhbGxiYWNrLlxuICAgKi9cbiAgcHVibGljIGdldCBuYXZpZ2F0ZVRvVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5hdmlnYXRlVG9VcmxcIik7XG4gIH1cbiAgcHVibGljIHNldCBuYXZpZ2F0ZVRvVXJsKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGVUb1VybFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBsaXN0IG9mIFVSTCBjb25kaXRpb24gaXRlbXMuIElmIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgaXRlbSByZXR1cm5zIGB0cnVlYCwgdGhlbiBzdXJ2ZXkgd2lsbCBuYXZpZ2F0ZSB0byB0aGUgaXRlbSBVUkwuXG4gICAqIEBzZWUgVXJsQ29uZGl0aW9uSXRlbVxuICAgKiBAc2VlIG5hdmlnYXRlVG9VcmxcbiAgICovXG4gIHB1YmxpYyBnZXQgbmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uKCk6IEFycmF5PFVybENvbmRpdGlvbkl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uKHZhbDogQXJyYXk8VXJsQ29uZGl0aW9uSXRlbT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb25cIiwgdmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROYXZpZ2F0ZVRvVXJsKCk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmdldEV4cHJlc3Npb25JdGVtT25SdW5Db25kaXRpb24oXG4gICAgICB0aGlzLm5hdmlnYXRlVG9VcmxPbkNvbmRpdGlvblxuICAgICk7XG4gICAgdmFyIHVybCA9ICEhaXRlbSA/ICg8VXJsQ29uZGl0aW9uSXRlbT5pdGVtKS51cmwgOiB0aGlzLm5hdmlnYXRlVG9Vcmw7XG4gICAgaWYgKCEhdXJsKSB7XG4gICAgICB1cmwgPSB0aGlzLnByb2Nlc3NUZXh0KHVybCwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvKCkge1xuICAgIHZhciB1cmwgPSB0aGlzLmdldE5hdmlnYXRlVG9VcmwoKTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgdXJsOiB1cmwgfTtcbiAgICB0aGlzLm9uTmF2aWdhdGVUb1VybC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIGlmICghb3B0aW9ucy51cmwgfHwgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhd2luZG93LmxvY2F0aW9uKVxuICAgICAgcmV0dXJuO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gb3B0aW9ucy51cmw7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgcmVxdWlyZWQgcXVlc3Rpb24gbWFyay4gVGhlIHJlcXVpcmVkIHF1ZXN0aW9uIG1hcmsgaXMgYSBjaGFyIG9yIHN0cmluZyB0aGF0IGlzIHJlbmRlcmVkIGluIHRoZSByZXF1aXJlZCBxdWVzdGlvbnMnIHRpdGxlcy5cbiAgICogQHNlZSBRdWVzdGlvbi50aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVxdWlyZWRUZXh0XCIsIFwiKlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlcXVpcmVkVGV4dFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0byBoaWRlIGFsbCByZXF1aXJlZCBlcnJvcnMuXG4gICAqL1xuICBwdWJsaWMgaGlkZVJlcXVpcmVkRXJyb3JzOiBib29sZWFuID0gZmFsc2U7XG4gIGJlZm9yZVNldHRpbmdRdWVzdGlvbkVycm9ycyhcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+XG4gICk6IHZvaWQge1xuICAgIHRoaXMubWFha2VSZXF1aXJlZEVycm9yc0ludmlzaWJnbGUoZXJyb3JzKTtcbiAgICB0aGlzLm9uU2V0dGluZ1F1ZXN0aW9uRXJyb3JzLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgZXJyb3JzOiBlcnJvcnMsXG4gICAgfSk7XG4gIH1cbiAgYmVmb3JlU2V0dGluZ1BhbmVsRXJyb3JzKHF1ZXN0aW9uOiBJUGFuZWwsIGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KTogdm9pZCB7XG4gICAgdGhpcy5tYWFrZVJlcXVpcmVkRXJyb3JzSW52aXNpYmdsZShlcnJvcnMpO1xuICB9XG4gIHByaXZhdGUgbWFha2VSZXF1aXJlZEVycm9yc0ludmlzaWJnbGUoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBpZiAoIXRoaXMuaGlkZVJlcXVpcmVkRXJyb3JzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlclR5cGUgPSBlcnJvcnNbaV0uZ2V0RXJyb3JUeXBlKCk7XG4gICAgICBpZiAoZXJUeXBlID09IFwicmVxdWlyZWRcIiB8fCBlclR5cGUgPT0gXCJyZXF1aXJlb25lYW5zd2VyXCIpIHtcbiAgICAgICAgZXJyb3JzW2ldLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZmlyc3QgcXVlc3Rpb24gaW5kZXguIFRoZSBmaXJzdCBxdWVzdGlvbiBpbmRleCBpcyAnMScgYnkgZGVmYXVsdC4gWW91IG1heSBzdGFydCBpdCBmcm9tICcxMDAnIG9yIGZyb20gJ0EnLCBieSBzZXR0aW5nICcxMDAnIG9yICdBJyB0byB0aGlzIHByb3BlcnR5LlxuICAgKiBZb3UgY2FuIHNldCB0aGUgc3RhcnQgaW5kZXggdG8gXCIoMSlcIiBvciBcIiMgQSlcIiBvciBcImEpXCIgdG8gcmVuZGVyIHF1ZXN0aW9uIG51bWJlciBhcyAoMSksICMgQSkgYW5kIGEpIGFjY29yZGluZ2x5LlxuICAgKiBAc2VlIFF1ZXN0aW9uLnRpdGxlXG4gICAqIEBzZWUgcmVxdWlyZWRUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uU3RhcnRJbmRleCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblN0YXJ0SW5kZXhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvblN0YXJ0SW5kZXgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblN0YXJ0SW5kZXhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdGhlIFwiT3RoZXJzXCIgb3B0aW9uIHRleHQgaXMgc3RvcmVkIGFzIHF1ZXN0aW9uIGNvbW1lbnQuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGVudGVyZWQgdGV4dCBpbiB0aGUgXCJPdGhlcnNcIiBpbnB1dCBpbiB0aGUgY2hlY2tib3gvcmFkaW9ncm91cC9kcm9wZG93biBpcyBzdG9yZWQgYXMgYFwicXVlc3Rpb24gbmFtZSBcIiArIFwiLUNvbW1lbnRcImAuIFRoZSB2YWx1ZSBpdHNlbGYgaXMgYFwicXVlc3Rpb24gbmFtZVwiOiBcIm90aGVyc1wiYC5cbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gYGZhbHNlYCwgdG8gc3RvcmUgdGhlIGVudGVyZWQgdGV4dCBkaXJlY3RseSBpbiB0aGUgYFwicXVlc3Rpb24gbmFtZVwiYCBrZXkuXG4gICAqIEBzZWUgY29tbWVudFByZWZpeFxuICAgKi9cbiAgcHVibGljIGdldCBzdG9yZU90aGVyc0FzQ29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzdG9yZU90aGVyc0FzQ29tbWVudCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRlZmF1bHQgbWF4aW11bSBsZW5ndGggZm9yIHF1ZXN0aW9ucyBsaWtlIHRleHQgYW5kIGNvbW1lbnQsIGluY2x1ZGluZyBtYXRyaXggY2VsbCBxdWVzdGlvbnMuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGAwYCwgdGhhdCBtZWFucyB0aGF0IHRoZSB0ZXh0IGFuZCBjb21tZW50IGhhdmUgdGhlIHNhbWUgbWF4IGxlbmd0aCBhcyB0aGUgc3RhbmRhcmQgSFRNTCBpbnB1dCAtIDUyNDI4OCBjaGFyYWN0ZXJzOiBodHRwczovL3d3dy53M3NjaG9vbHMuY29tL3RhZ3MvYXR0X2lucHV0X21heGxlbmd0aC5hc3AuXG4gICAqIEBzZWUgbWF4T3RoZXJzTGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFRleHRMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGV4dExlbmd0aFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFRleHRMZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUZXh0TGVuZ3RoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZGVmYXVsdCBtYXhpbXVtIGxlbmd0aCBmb3IgcXVlc3Rpb24gY29tbWVudHMgYW5kIG90aGVyc1xuICAgKlxuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgMGAsIHRoYXQgbWVhbnMgdGhhdCB0aGUgcXVlc3Rpb24gY29tbWVudHMgaGF2ZSB0aGUgc2FtZSBtYXggbGVuZ3RoIGFzIHRoZSBzdGFuZGFyZCBIVE1MIGlucHV0IC0gNTI0Mjg4IGNoYXJhY3RlcnM6IGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy9hdHRfaW5wdXRfbWF4bGVuZ3RoLmFzcC5cbiAgICogQHNlZSBRdWVzdGlvbi5oYXNDb21tZW50XG4gICAqIEBzZWUgUXVlc3Rpb24uaGFzT3RoZXJcbiAgICogQHNlZSBtYXhUZXh0TGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heE90aGVyc0xlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhPdGhlcnNMZW5ndGhcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhPdGhlcnNMZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhPdGhlcnNMZW5ndGhcIiwgdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNlcyB3aGV0aGVyIGEgdXNlciBjYW4gbmF2aWdhdGUgdGhlIG5leHQgcGFnZSBhdXRvbWF0aWNhbGx5IGFmdGVyIGFuc3dlcmluZyBhbGwgdGhlIHF1ZXN0aW9ucyBvbiBhIHBhZ2Ugd2l0aG91dCBwcmVzc2luZyB0aGUgXCJOZXh0XCIgYnV0dG9uLlxuICAgKiBUaGUgYXZhaWxhYmxlIG9wdGlvbnM6XG4gICAqXG4gICAqIC0gYHRydWVgIC0gbmF2aWdhdGUgdGhlIG5leHQgcGFnZSBhbmQgc3VibWl0IHN1cnZleSBkYXRhIGF1dG9tYXRpY2FsbHkuXG4gICAqIC0gYGF1dG9nb25leHRgIC0gbmF2aWdhdGUgdGhlIG5leHQgcGFnZSBhdXRvbWF0aWNhbGx5IGJ1dCBkbyBub3Qgc3VibWl0IHN1cnZleSBkYXRhLlxuICAgKiAtIGBmYWxzZWAgLSBkbyBub3QgbmF2aWdhdGUgdGhlIG5leHQgcGFnZSBhbmQgZG8gbm90IHN1Ym1pdCBzdXJ2ZXkgZGF0YSBhdXRvbWF0aWNhbGx5LlxuICAgKiBAc2VlIHNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgKi9cbiAgcHVibGljIGdldCBnb05leHRQYWdlQXV0b21hdGljKCk6IGJvb2xlYW4gfCBcImF1dG9nb25leHRcIiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImdvTmV4dFBhZ2VBdXRvbWF0aWNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZ29OZXh0UGFnZUF1dG9tYXRpYyh2YWw6IGJvb2xlYW4gfCBcImF1dG9nb25leHRcIikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImdvTmV4dFBhZ2VBdXRvbWF0aWNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgYSBzdXJ2ZXkgaXMgYXV0b21hdGljYWxseSBjb21wbGV0ZWQgd2hlbiBgZ29OZXh0UGFnZUF1dG9tYXRpYyA9IHRydWVgLiBTZXQgaXQgdG8gYGZhbHNlYCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc3VibWl0IHN1cnZleSBhdXRvbWF0aWNhbGx5IG9uIGNvbXBsZXRpbmcgdGhlIGxhc3Qgc3VydmV5IHBhZ2UuXG4gICAqIEBzZWUgZ29OZXh0UGFnZUF1dG9tYXRpY1xuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0NvbXBsZXRlU3VydmV5QXV0b21hdGljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd0NvbXBsZXRlU3VydmV5QXV0b21hdGljXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dDb21wbGV0ZVN1cnZleUF1dG9tYXRpYyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0NvbXBsZXRlU3VydmV5QXV0b21hdGljXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIHRoYXQgc3BlY2lmaWVzIGhvdyB0aGUgc3VydmV5IHZhbGlkYXRlcyB0aGUgcXVlc3Rpb24gYW5zd2Vycy5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYG9uTmV4dFBhZ2VgIChkZWZhdWx0KSAtIGNoZWNrIGVycm9ycyBvbiBuYXZpZ2F0aW5nIHRvIHRoZSBuZXh0IHBhZ2Ugb3Igb24gY29tcGxldGluZyB0aGUgc3VydmV5LlxuICAgKiAtIGBvblZhbHVlQ2hhbmdlZGAgLSBjaGVjayBlcnJvcnMgb24gZXZlcnkgcXVlc3Rpb24gdmFsdWUgKGkuZS4sIGFuc3dlcikgY2hhbmdpbmcuXG4gICAqIC0gYG9uVmFsdWVDaGFuZ2luZ2AgLSBjaGVjayBlcnJvcnMgYmVmb3JlIHNldHRpbmcgdmFsdWUgaW50byBzdXJ2ZXkuIElmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGVuIHN1cnZleSBkYXRhIGlzIG5vdCBjaGFuZ2VkLCBidXQgcXVlc3Rpb24gdmFsdWUgd2lsbCBiZSBrZWVwZWQuXG4gICAqIC0gYG9uQ29tcGxldGVgIC0gdG8gdmFsaWRhdGUgYWxsIHZpc2libGUgcXVlc3Rpb25zIG9uIGNvbXBsZXRlIGJ1dHRvbiBjbGljay4gSWYgdGhlcmUgYXJlIGVycm9ycyBvbiBwcmV2aW91cyBwYWdlcywgdGhlbiB0aGUgcGFnZSB3aXRoIHRoZSBmaXJzdCBlcnJvciBiZWNvbWVzIHRoZSBjdXJyZW50LlxuICAgKi9cbiAgcHVibGljIGdldCBjaGVja0Vycm9yc01vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hlY2tFcnJvcnNNb2RlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hlY2tFcnJvcnNNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hlY2tFcnJvcnNNb2RlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIHRoYXQgc3BlY2lmaWVzIGhvdyB0aGUgc3VydmV5IHVwZGF0ZXMgaXRzIHF1ZXN0aW9ucycgdGV4dCB2YWx1ZXMuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKlxuICAgKiAtIGBvbkJsdXJgIChkZWZhdWx0KSAtIHRoZSB2YWx1ZSBpcyB1cGRhdGVkIGFmdGVyIGFuIGlucHV0IGxvc2VzIHRoZSBmb2N1cy5cbiAgICogLSBgb25UeXBpbmdgIC0gdXBkYXRlIHRoZSB2YWx1ZSBvZiB0ZXh0IHF1ZXN0aW9ucywgXCJ0ZXh0XCIgYW5kIFwiY29tbWVudFwiLCBvbiBldmVyeSBrZXkgcHJlc3MuXG4gICAqXG4gICAqIE5vdGUsIHRoYXQgc2V0dGluZyB0byBcIm9uVHlwaW5nXCIgbWF5IGxlYWQgdG8gYSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiwgaW4gY2FzZSB5b3UgaGF2ZSBtYW55IGV4cHJlc3Npb25zIGluIHRoZSBzdXJ2ZXkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRleHRVcGRhdGVNb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRleHRVcGRhdGVNb2RlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dFVwZGF0ZU1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0ZXh0VXBkYXRlTW9kZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyBob3cgdGhlIGludmlzaWJsZSBkYXRhIGlzIGluY2x1ZGVkIGluIHN1cnZleSBkYXRhLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgbm9uZWAgLSBpbmNsdWRlIHRoZSBpbnZpc2libGUgdmFsdWVzIGludG8gdGhlIHN1cnZleSBkYXRhLlxuICAgKiAtIGBvbkhpZGRlbmAgLSBjbGVhciB0aGUgcXVlc3Rpb24gdmFsdWUgd2hlbiBpdCBiZWNvbWVzIGludmlzaWJsZS4gSWYgYSBxdWVzdGlvbiBoYXMgdmFsdWUgYW5kIGl0IHdhcyBpbnZpc2libGUgaW5pdGlhbGx5IHRoZW4gc3VydmV5IGNsZWFycyB0aGUgdmFsdWUgb24gY29tcGxldGluZy5cbiAgICogLSBgb25IaWRkZW5Db250YWluZXJgIC0gY2xlYXIgdGhlIHF1ZXN0aW9uIHZhbHVlIHdoZW4gaXQgb3IgaXRzIHBhcmVudCAocGFnZSBvciBwYW5lbCkgYmVjb21lcyBpbnZpc2libGUuIElmIGEgcXVlc3Rpb24gaGFzIHZhbHVlIGFuZCBpdCB3YXMgaW52aXNpYmxlIGluaXRpYWxseSB0aGVuIHN1cnZleSBjbGVhcnMgdGhlIHZhbHVlIG9uIGNvbXBsZXRpbmcuXG4gICAqIC0gYG9uQ29tcGxldGVgIChkZWZhdWx0KSAtIGNsZWFyIGludmlzaWJsZSBxdWVzdGlvbiB2YWx1ZXMgb24gc3VydmV5IGNvbXBsZXRlLiBJbiB0aGlzIGNhc2UsIHRoZSBpbnZpc2libGUgcXVlc3Rpb25zIHdpbGwgbm90IGJlIHN0b3JlZCBvbiB0aGUgc2VydmVyLlxuICAgKiBAc2VlIFF1ZXN0aW9uLnZpc2libGVcbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNsZWFySW52aXNpYmxlVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNsZWFySW52aXNpYmxlVmFsdWVzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2xlYXJJbnZpc2libGVWYWx1ZXModmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB2YWwgPSBcIm9uQ29tcGxldGVcIjtcbiAgICBpZiAodmFsID09PSBmYWxzZSkgdmFsID0gXCJub25lXCI7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHJlbW92ZSBhbGwgcXVlc3Rpb24gdmFsdWVzIGZyb20gdGhlIHN1cnZleSwgdGhhdCBlbmQtdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyLlxuICAgKiBGb3IgZXhhbXBsZSB0aGUgdmFsdWUgdGhhdCBkb2Vzbid0IGV4aXN0cyBpbiBhIHJhZGlvZ3JvdXAvZHJvcGRvd24vY2hlY2tib3ggY2hvaWNlcyBvciBtYXRyaXggcm93cy9jb2x1bW5zLlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNsZWFyIHZhbHVlcyBmb3IgaW52aXNpYmxlIHF1ZXN0aW9ucyBvciB2YWx1ZXMgdGhhdCBkb2Vzbid0IGFzc29jaWF0ZWQgd2l0aCBxdWVzdGlvbnMuXG4gICAqIEluIGZhY3QgdGhpcyBmdW5jdGlvbiBqdXN0IGNhbGwgY2xlYXJJbmNvcnJlY3RWYWx1ZXMgZnVuY3Rpb24gb2YgYWxsIHF1ZXN0aW9ucyBpbiB0aGUgc3VydmV5XG4gICAqIEBwYXJhbSByZW1vdmVOb25FeGlzaW5nUm9vdEtleXMgLSBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSB0byByZW1vdmUga2V5cyBmcm9tIHN1cnZleS5kYXRhIHRoYXQgZG9lc24ndCBoYXZlIGNvcnJlc3BvbmRlZCBxdWVzdGlvbnMgYW5kIGNhbGN1bGF0ZWQgdmFsdWVzXG4gICAqIEBzZWUgUXVlc3Rpb24uY2xlYXJJbmNvcnJlY3RWYWx1ZXNcbiAgICogQHNlZSBQYWdlLmNsZWFySW5jb3JyZWN0VmFsdWVzXG4gICAqIEBzZWUgUGFuZWwuY2xlYXJJbmNvcnJlY3RWYWx1ZXNcbiAgICovXG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcyhyZW1vdmVOb25FeGlzaW5nUm9vdEtleXM6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgIH1cbiAgICBpZiAoIXJlbW92ZU5vbkV4aXNpbmdSb290S2V5cykgcmV0dXJuO1xuICAgIHZhciBkYXRhID0gdGhpcy5kYXRhO1xuICAgIHZhciBoYXNDaGFuZ2VzID0gZmFsc2U7XG4gICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgIGlmICghIXRoaXMuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZShrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc2NvcnJlY3RWYWx1ZVdpdGhQb3N0UHJlZml4KGtleSwgc2V0dGluZ3MuY29tbWVudFByZWZpeCkgfHxcbiAgICAgICAgdGhpcy5pc2NvcnJlY3RWYWx1ZVdpdGhQb3N0UHJlZml4KGtleSwgc2V0dGluZ3MubWF0cml4VG90YWxWYWx1ZVBvc3RGaXgpXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdmFyIGNhbGNWYWx1ZSA9IHRoaXMuZ2V0Q2FsY3VsYXRlZFZhbHVlQnlOYW1lKGtleSk7XG4gICAgICBpZiAoISFjYWxjVmFsdWUgJiYgY2FsY1ZhbHVlLmluY2x1ZGVJbnRvUmVzdWx0KSBjb250aW51ZTtcbiAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgZGVsZXRlIGRhdGFba2V5XTtcbiAgICB9XG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNjb3JyZWN0VmFsdWVXaXRoUG9zdFByZWZpeChcbiAgICBrZXk6IHN0cmluZyxcbiAgICBwb3N0UHJlZml4OiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKGtleS5pbmRleE9mKHBvc3RQcmVmaXgpICE9PSBrZXkubGVuZ3RoIC0gcG9zdFByZWZpeC5sZW5ndGgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKFxuICAgICAga2V5LnN1YnN0cigwLCBrZXkuaW5kZXhPZihwb3N0UHJlZml4KSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc3VydmV5IGxvY2FsZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXQgaXMgZW1wdHksIHRoaXMgbWVhbnMgdGhlICdlbicgbG9jYWxlIGlzIHVzZWQuXG4gICAqIFlvdSBjYW4gc2V0IGl0IHRvICdkZScgLSBHZXJtYW4sICdmcicgLSBGcmVuY2ggYW5kIHNvIG9uLiBUaGUgbGlicmFyeSBoYXMgYnVpbHQtaW4gbG9jYWxpemF0aW9uIGZvciBzZXZlcmFsIGxhbmd1YWdlcy4gVGhlIGxpYnJhcnkgaGFzIGEgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydCBhcyB3ZWxsLlxuICAgKi9cbiAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGVWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgc3VydmV5TG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUgPSB2YWx1ZTtcbiAgICB0aGlzLmxvY2FsZVZhbHVlID0gc3VydmV5TG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGU7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibG9jYWxlXCIsIHRoaXMubG9jYWxlVmFsdWUpO1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHRoaXMubG9jYWxlQ2hhbmdlZCgpO1xuICAgIHRoaXMub25Mb2NhbGVDaGFuZ2VkRXZlbnQuZmlyZSh0aGlzLCB2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgbG9jYWxlcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBzdXJ2ZXkncyB0cmFuc2xhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXRVc2VkTG9jYWxlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgbG9jcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgdGhpcy5hZGRVc2VkTG9jYWxlcyhsb2NzKTtcbiAgICAvL1JlcGxhY2UgdGhlIGRlZmF1bHQgbG9jYWxlIHdpdGggdGhlIHJlYWwgb25lXG4gICAgdmFyIGluZGV4ID0gbG9jcy5pbmRleE9mKFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdmFyIGRlZmF1bHRMb2MgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZTtcbiAgICAgIC8vUmVtb3ZlIHRoZSBkZWZhdWx0TG9jXG4gICAgICB2YXIgZGVmSW5kZXggPSBsb2NzLmluZGV4T2YoZGVmYXVsdExvYyk7XG4gICAgICBpZiAoZGVmSW5kZXggPiAtMSkge1xuICAgICAgICBsb2NzLnNwbGljZShkZWZJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBpbmRleCA9IGxvY3MuaW5kZXhPZihcImRlZmF1bHRcIik7XG4gICAgICBsb2NzW2luZGV4XSA9IGRlZmF1bHRMb2M7XG4gICAgfVxuICAgIHJldHVybiBsb2NzO1xuICB9XG4gIHB1YmxpYyBsb2NhbGVDaGFuZ2VkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5sb2NhbGVDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIC8vSUxvY2FsaXphYmxlT3duZXJcbiAgZ2V0TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZTtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICAvL0RvIG5vdCBzZXQgY3VycmVudCBwYWdlIGlmIGl0IGlzIG5vdCBzZXQgeWV0LlxuICAgIC8vQXQgZmlyc3Qgd2UgZG8gbm90IG5lZWQgdGhpcywgYXQgc2Vjb25kIGl0IGNyZWF0ZXMgaXNzdWVzIHdpdGggVnVlIENMSSBwcm9qZWN0c1xuICAgIC8vTW9yZSBpbmZvcm1hdGlvbiBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc3VydmV5anMvc3VydmV5LWxpYnJhcnkvaXNzdWVzLzI1OTlcbiAgICBpZiAoIXRoaXMuY3VycmVudFBhZ2VWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3NUZXh0KCk7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmFjdGl2ZVBhZ2U7XG4gICAgaWYgKCEhcGFnZSkge1xuICAgICAgcGFnZS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFN1cnZleU1hcmtkb3duSHRtbCh0aGlzLCB0ZXh0LCBuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0UmVuZGVyZXIobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZW5kZXJlckZvclN0cmluZyh0aGlzLCBuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0UmVuZGVyZXJGb3JTdHJpbmcoZWxlbWVudDogQmFzZSwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZW5kZXJBcyA9IHRoaXMuZ2V0QnVpbHRJblJlbmRlcmVyRm9yU3RyaW5nKGVsZW1lbnQsIG5hbWUpO1xuICAgIHZhciBvcHRpb25zID0geyBlbGVtZW50OiBlbGVtZW50LCBuYW1lOiBuYW1lLCByZW5kZXJBczogcmVuZGVyQXMgfTtcbiAgICB0aGlzLm9uVGV4dFJlbmRlckFzLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMucmVuZGVyQXM7XG4gIH1cbiAgZ2V0RXhwcmVzc2lvbkRpc3BsYXlWYWx1ZShcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIHZhbHVlOiBhbnksXG4gICAgZGlzcGxheVZhbHVlOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZGlzcGxheVZhbHVlOiBkaXNwbGF5VmFsdWUsXG4gICAgfTtcbiAgICB0aGlzLm9uR2V0RXhwcmVzc2lvbkRpc3BsYXlWYWx1ZS5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmRpc3BsYXlWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGdldEJ1aWx0SW5SZW5kZXJlckZvclN0cmluZyhlbGVtZW50OiBCYXNlLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIExvY2FsaXphYmxlU3RyaW5nLmVkaXRhYmxlUmVuZGVyZXI7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dCh0ZXh0LCB0cnVlKTtcbiAgfVxuICBnZXRMb2NTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhzdHIpO1xuICB9XG4gIC8vSVN1cnZleUVycm9yT3duZXJcbiAgZ2V0RXJyb3JDdXN0b21UZXh0KHRleHQ6IHN0cmluZywgZXJyb3I6IFN1cnZleUVycm9yKTogc3RyaW5nIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHRleHQ6IHRleHQsXG4gICAgICBuYW1lOiBlcnJvci5nZXRFcnJvclR5cGUoKSxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9O1xuICAgIHRoaXMub25FcnJvckN1c3RvbVRleHQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy50ZXh0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gdGhlcmUgYXJlIG5vIGFueSB2aXNpYmxlIHBhZ2VzIGFuZCBxdWVzdGlvbmEuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVtcHR5U3VydmV5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcImVtcHR5U3VydmV5XCIpO1xuICB9XG5cbiAgLy8jcmVnaW9uIFRpdGxlL0hlYWRlciBvcHRpb25zXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBzdXJ2ZXkgdGl0bGUuXG4gICAqIEBzZWUgZGVzY3JpcHRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHN1cnZleSBkZXNjcmlwdGlvbi4gVGhlIHN1cnZleSBkZXNjcmlwdGlvbiBpcyBkaXNwbGF5ZWQgdW5kZXIgYSBzdXJ2ZXkgdGl0bGUuXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImRlc2NyaXB0aW9uXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHN1cnZleSBsb2dvLlxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvZ28oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsb2dvXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9nbyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsb2dvXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jTG9nbygpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJsb2dvXCIpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBzdXJ2ZXkgbG9nbyB3aWR0aC5cbiAgICogQHNlZSBsb2dvXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvZ29XaWR0aCgpOiBhbnkge1xuICAgIHZhciB3aWR0aCA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImxvZ29XaWR0aFwiKTtcbiAgICByZXR1cm4gZ2V0U2l6ZSh3aWR0aCk7XG4gIH1cbiAgcHVibGljIHNldCBsb2dvV2lkdGgodmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImxvZ29XaWR0aFwiLCB2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHN1cnZleSBsb2dvIGhlaWdodC5cbiAgICogQHNlZSBsb2dvXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvZ29IZWlnaHQoKTogYW55IHtcbiAgICB2YXIgaGVpZ2h0ID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibG9nb0hlaWdodFwiKTtcbiAgICByZXR1cm4gZ2V0U2l6ZShoZWlnaHQpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9nb0hlaWdodCh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibG9nb0hlaWdodFwiLCB2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHN1cnZleSBsb2dvIHBvc2l0aW9uLlxuICAgKiBAc2VlIGxvZ29cbiAgICovXG4gIHB1YmxpYyBnZXQgbG9nb1Bvc2l0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImxvZ29Qb3NpdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvZ29Qb3NpdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibG9nb1Bvc2l0aW9uXCIsIHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0xvZ28oKSB7XG4gICAgcmV0dXJuICEhdGhpcy5sb2dvICYmIHRoaXMubG9nb1Bvc2l0aW9uICE9PSBcIm5vbmVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzTG9nb0JlZm9yZSgpIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZW5kZXJlZEhhc0xvZ28gJiZcbiAgICAgICh0aGlzLmxvZ29Qb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5sb2dvUG9zaXRpb24gPT09IFwidG9wXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzTG9nb0FmdGVyKCkge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIHRoaXMucmVuZGVyZWRIYXNMb2dvO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnJlbmRlcmVkSGFzTG9nbyAmJlxuICAgICAgKHRoaXMubG9nb1Bvc2l0aW9uID09PSBcInJpZ2h0XCIgfHwgdGhpcy5sb2dvUG9zaXRpb24gPT09IFwiYm90dG9tXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvZ29DbGFzc05hbWVzKCk6IHN0cmluZyB7XG4gICAgdmFyIGxvZ29DbGFzc2VzOiB7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICBsZWZ0OiBcInN2LWxvZ28tLWxlZnRcIixcbiAgICAgIHJpZ2h0OiBcInN2LWxvZ28tLXJpZ2h0XCIsXG4gICAgICB0b3A6IFwic3YtbG9nby0tdG9wXCIsXG4gICAgICBib3R0b206IFwic3YtbG9nby0tYm90dG9tXCIsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5jc3MubG9nbyArIFwiIFwiICsgbG9nb0NsYXNzZXNbdGhpcy5sb2dvUG9zaXRpb25dO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRIYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiB0aGlzLmlzUHJvcGVydHlWaXNpYmxlKFwidGl0bGVcIik7XG4gICAgcmV0dXJuICF0aGlzLmxvY1RpdGxlLmlzRW1wdHkgJiYgdGhpcy5zaG93VGl0bGU7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJlZEhhc0xvZ28oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gdGhpcy5pc1Byb3BlcnR5VmlzaWJsZShcImxvZ29cIik7XG4gICAgcmV0dXJuIHRoaXMuaGFzTG9nbztcbiAgfVxuICBwdWJsaWMgZ2V0IHJlbmRlcmVkSGFzSGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVkSGFzVGl0bGUgfHwgdGhpcy5yZW5kZXJlZEhhc0xvZ287XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsb2dvIGZpdCBtb2RlLlxuICAgKiBAc2VlIGxvZ29cbiAgICovXG4gIHB1YmxpYyBnZXQgbG9nb0ZpdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJsb2dvRml0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9nb0ZpdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImxvZ29GaXRcIiwgdmFsKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBwcml2YXRlIF9pc01vYmlsZSA9IGZhbHNlO1xuICBwdWJsaWMgc2V0SXNNb2JpbGUobmV3VmFsID0gdHJ1ZSkge1xuICAgIHRoaXMuX2lzTW9iaWxlID0gbmV3VmFsO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzTW9iaWxlKCkge1xuICAgIHJldHVybiBpc01vYmlsZSgpIHx8IHRoaXMuX2lzTW9iaWxlO1xuICB9XG4gIHB1YmxpYyBnZXQgdGl0bGVNYXhXaWR0aCgpOiBzdHJpbmcge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmlzTW9iaWxlICYmXG4gICAgICAhdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5sb2dvKSAmJlxuICAgICAgIXNldHRpbmdzLnN1cHBvcnRDcmVhdG9yVjJcbiAgICApIHtcbiAgICAgIHZhciBsb2dvV2lkdGggPSB0aGlzLmxvZ29XaWR0aDtcbiAgICAgIGlmICh0aGlzLmxvZ29Qb3NpdGlvbiA9PT0gXCJsZWZ0XCIgfHwgdGhpcy5sb2dvUG9zaXRpb24gPT09IFwicmlnaHRcIikge1xuICAgICAgICByZXR1cm4gXCJjYWxjKDEwMCUgLSA1cHggLSAyZW0gLSBcIiArIGxvZ29XaWR0aCArIFwiKVwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBIVE1MIGNvbnRlbnQgZGlzcGxheWVkIG9uIHRoZSBjb21wbGV0ZSBwYWdlLiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgY29tcGxldGUgcGFnZSB0ZXh0LlxuICAgKiBAc2VlIHNob3dDb21wbGV0ZWRQYWdlXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRIdG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGxldGVkSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jQ29tcGxldGVkSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRIdG1sXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBIVE1MIGNvbmRpdGlvbiBpdGVtcy4gSWYgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBpdGVtIHJldHVybnMgYHRydWVgLCB0aGVuIGEgc3VydmV5IHdpbGwgdXNlIHRoaXMgaXRlbSBIVE1MIGluc3RlYWQgb2YgYGNvbXBsZXRlZEh0bWxgLlxuICAgKiBAc2VlIEh0bWxDb25kaXRpb25JdGVtXG4gICAqIEBzZWUgY29tcGxldGVIdG1sXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbigpOiBBcnJheTxIdG1sQ29uZGl0aW9uSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBjb21wbGV0ZWRIdG1sT25Db25kaXRpb24odmFsOiBBcnJheTxIdG1sQ29uZGl0aW9uSXRlbT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBhIGdpdmVuIGV4cHJlc3Npb24gYW5kIHJldHVybnMgYSByZXN1bHQgdmFsdWUuXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgcnVuRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghZXhwcmVzc2lvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uUnVubmVyKGV4cHJlc3Npb24pLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGEgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgcmV0dXJucyBgdHJ1ZWAgb3IgYGZhbHNlYC5cbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICovXG4gIHB1YmxpYyBydW5Db25kaXRpb24oZXhwcmVzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFleHByZXNzaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb25SdW5uZXIoZXhwcmVzc2lvbikucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgLyoqXG4gICAqIFJ1biBhbGwgdHJpZ2dlcnMgdGhhdCBwZXJmb3JtcyBvbiB2YWx1ZSBjaGFuZ2VkIGFuZCBub3Qgb24gbW92aW5nIHRvIHRoZSBuZXh0IHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgcnVuVHJpZ2dlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja1RyaWdnZXJzKHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKSwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRDb21wbGV0ZWRIdG1sKCk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmdldEV4cHJlc3Npb25JdGVtT25SdW5Db25kaXRpb24oXG4gICAgICB0aGlzLmNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvblxuICAgICk7XG4gICAgcmV0dXJuICEhaXRlbSA/ICg8SHRtbENvbmRpdGlvbkl0ZW0+aXRlbSkuaHRtbCA6IHRoaXMuY29tcGxldGVkSHRtbDtcbiAgfVxuICBwcml2YXRlIGdldEV4cHJlc3Npb25JdGVtT25SdW5Db25kaXRpb24oXG4gICAgaXRlbXM6IEFycmF5PEV4cHJlc3Npb25JdGVtPlxuICApOiBFeHByZXNzaW9uSXRlbSB7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXRlbXNbaV0ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcykpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSFRNTCBjb250ZW50IGRpc3BsYXllZCB0byBhbiBlbmQgdXNlciB0aGF0IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgc3VydmV5LlxuICAgKiBAc2VlIGNsaWVudElkXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEJlZm9yZUh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGxldGVkQmVmb3JlSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jQ29tcGxldGVkQmVmb3JlSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgSFRNTCB0aGF0IHNob3dzIG9uIGxvYWRpbmcgc3VydmV5IEpzb24gZnJvbSB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UuXG4gICAqIEBzZWUgc3VydmV5SWRcbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9hZGluZ0h0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsb2FkaW5nSHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvYWRpbmdIdG1sKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxvYWRpbmdIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jTG9hZGluZ0h0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibG9hZGluZ0h0bWxcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgJ1N0YXJ0JyBidXR0b24gY2FwdGlvbi5cbiAgICogVGhlICdTdGFydCcgYnV0dG9uIGlzIHNob3duIG9uIHRoZSBzdGFydGVkIHBhZ2UuIFNldCB0aGUgYGZpcnN0UGFnZUlzU3RhcnRlZGAgcHJvcGVydHkgdG8gYHRydWVgLCB0byBkaXNwbGF5IHRoZSBzdGFydGVkIHBhZ2UuXG4gICAqIEBzZWUgZmlyc3RQYWdlSXNTdGFydGVkXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXJ0U3VydmV5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwic3RhcnRTdXJ2ZXlUZXh0XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInN0YXJ0U3VydmV5VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBzdGFydFN1cnZleVRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwic3RhcnRTdXJ2ZXlUZXh0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jU3RhcnRTdXJ2ZXlUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInN0YXJ0U3VydmV5VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSAnUHJldicgYnV0dG9uIGNhcHRpb24uXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2VQcmV2VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFnZVByZXZUZXh0XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInBhZ2VQcmV2VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlUHJldlRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZVByZXZUZXh0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jUGFnZVByZXZUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhZ2VQcmV2VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSAnTmV4dCcgYnV0dG9uIGNhcHRpb24uXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2VOZXh0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFnZU5leHRUZXh0XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInBhZ2VOZXh0VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlTmV4dFRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZU5leHRUZXh0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jUGFnZU5leHRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhZ2VOZXh0VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogIEdldHMgb3Igc2V0cyB0aGUgJ0NvbXBsZXRlJyBidXR0b24gY2FwdGlvbi5cbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tcGxldGVUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJjb21wbGV0ZVRleHRcIixcbiAgICAgIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGVUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbXBsZXRlVGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZVRleHRcIiwgbmV3VmFsdWUpO1xuICB9XG4gIGdldCBsb2NDb21wbGV0ZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiAgR2V0cyBvciBzZXRzIHRoZSAnUHJldmlldycgYnV0dG9uIGNhcHRpb24uXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqIEBzZWUgc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZVxuICAgKiBAc2VlIGVkaXRUZXh0XG4gICAqIEBzZWUgc2hvd1ByZXZpZXdcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJldmlld1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInByZXZpZXdUZXh0XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInByZXZpZXdUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHByZXZpZXdUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInByZXZpZXdUZXh0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jUHJldmlld1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicHJldmlld1RleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqICBHZXRzIG9yIHNldHMgdGhlICdFZGl0JyBidXR0b24gY2FwdGlvbi5cbiAgICogQHNlZSBsb2NhbGVcbiAgICogQHNlZSBzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXG4gICAqIEBzZWUgcHJldmlld1RleHRcbiAgICogQHNlZSBjYW5jZWxQcmV2aWV3XG4gICAqL1xuICBwdWJsaWMgZ2V0IGVkaXRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJlZGl0VGV4dFwiLFxuICAgICAgdGhpcy5nZXRMb2NTdHJpbmcoXCJlZGl0VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBlZGl0VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJlZGl0VGV4dFwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0VkaXRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImVkaXRUZXh0XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcGF0dGVybiBmb3IgcXVlc3Rpb24gdGl0bGUuIERlZmF1bHQgaXMgXCJudW1UaXRsZVJlcXVpcmVcIiwgMS4gV2hhdCBpcyB5b3VyIG5hbWU/ICosXG4gICAqIFlvdSBjYW4gc2V0IGl0IHRvIG51bVJlcXVpcmVUaXRsZTogMS4gKiBXaGF0IGlzIHlvdXIgbmFtZT9cbiAgICogWW91IGNhbiBzZXQgaXQgdG8gcmVxdWlyZU51bVRpdGxlOiAqIDEuIFdoYXQgaXMgeW91ciBuYW1lP1xuICAgKiBZb3UgY2FuIHNldCBpdCB0byBudW1UaXRsZSAocmVtb3ZlIHJlcXVpcmUgc3ltYm9sIGNvbXBsZXRlbHkpOiAxLiBXaGF0IGlzIHlvdXIgbmFtZT9cbiAgICogQHNlZSBRdWVzdGlvbk1vZGVsLnRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVQYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVQYXR0ZXJuXCIsIFwibnVtVGl0bGVSZXF1aXJlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25UaXRsZVBhdHRlcm4odmFsOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICB2YWwgIT09IFwibnVtUmVxdWlyZVRpdGxlXCIgJiZcbiAgICAgIHZhbCAhPT0gXCJyZXF1aXJlTnVtVGl0bGVcIiAmJlxuICAgICAgdmFsICE9IFwibnVtVGl0bGVcIlxuICAgICkge1xuICAgICAgdmFsID0gXCJudW1UaXRsZVJlcXVpcmVcIjtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZVBhdHRlcm5cIiwgdmFsKTtcbiAgfVxuICBnZXRRdWVzdGlvblRpdGxlUGF0dGVybk9wdGlvbnMoKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgdmFyIHRpdGxlID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJxdWVzdGlvblRpdGxlUGF0dGVyblRleHRcIik7XG4gICAgdmFyIG51bSA9ICEhdGhpcy5xdWVzdGlvblN0YXJ0SW5kZXggPyB0aGlzLnF1ZXN0aW9uU3RhcnRJbmRleCA6IFwiMS5cIjtcbiAgICByZXMucHVzaCh7XG4gICAgICB2YWx1ZTogXCJudW1UaXRsZVJlcXVpcmVcIixcbiAgICAgIHRleHQ6IG51bSArIFwiIFwiICsgdGl0bGUgKyBcIiBcIiArIHRoaXMucmVxdWlyZWRUZXh0LFxuICAgIH0pO1xuICAgIHJlcy5wdXNoKHtcbiAgICAgIHZhbHVlOiBcIm51bVJlcXVpcmVUaXRsZVwiLFxuICAgICAgdGV4dDogbnVtICsgXCIgXCIgKyB0aGlzLnJlcXVpcmVkVGV4dCArIFwiIFwiICsgdGl0bGUsXG4gICAgfSk7XG4gICAgcmVzLnB1c2goe1xuICAgICAgdmFsdWU6IFwicmVxdWlyZU51bVRpdGxlXCIsXG4gICAgICB0ZXh0OiB0aGlzLnJlcXVpcmVkVGV4dCArIFwiIFwiICsgbnVtICsgXCIgXCIgKyB0aXRsZSxcbiAgICB9KTtcbiAgICByZXMucHVzaCh7XG4gICAgICB2YWx1ZTogXCJudW1UaXRsZVwiLFxuICAgICAgdGV4dDogbnVtICsgXCIgXCIgKyB0aXRsZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBxdWVzdGlvbiB0aXRsZSB0ZW1wbGF0ZS4gT2Jzb2xldGUsIHBsZWFzZSB1c2UgcXVlc3Rpb25UaXRsZVBhdHRlcm5cbiAgICogQHNlZSBRdWVzdGlvbk1vZGVsLnRpdGxlXG4gICAqIEBzZWUgcXVlc3Rpb25UaXRsZVBhdHRlcm5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25UaXRsZVRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25UaXRsZVRlbXBsYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLCB2YWx1ZSk7XG4gICAgdGhpcy5xdWVzdGlvblRpdGxlUGF0dGVybiA9IHRoaXMuZ2V0TmV3VGl0bGVQYXR0ZXJuKHZhbHVlKTtcbiAgICB0aGlzLnF1ZXN0aW9uU3RhcnRJbmRleCA9IHRoaXMuZ2V0TmV3UXVlc3Rpb25UaXRsZUVsZW1lbnQoXG4gICAgICB2YWx1ZSxcbiAgICAgIFwibm9cIixcbiAgICAgIHRoaXMucXVlc3Rpb25TdGFydEluZGV4LFxuICAgICAgXCIxXCJcbiAgICApO1xuICAgIHRoaXMucmVxdWlyZWRUZXh0ID0gdGhpcy5nZXROZXdRdWVzdGlvblRpdGxlRWxlbWVudChcbiAgICAgIHZhbHVlLFxuICAgICAgXCJyZXF1aXJlXCIsXG4gICAgICB0aGlzLnJlcXVpcmVkVGV4dCxcbiAgICAgIFwiKlwiXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldE5ld1RpdGxlUGF0dGVybih0ZW1wbGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoISF0ZW1wbGF0ZSkge1xuICAgICAgdmFyIHN0cnMgPSBbXTtcbiAgICAgIHdoaWxlICh0ZW1wbGF0ZS5pbmRleE9mKFwie1wiKSA+IC0xKSB7XG4gICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuc3Vic3RyKHRlbXBsYXRlLmluZGV4T2YoXCJ7XCIpICsgMSk7XG4gICAgICAgIHZhciBpbmQgPSB0ZW1wbGF0ZS5pbmRleE9mKFwifVwiKTtcbiAgICAgICAgaWYgKGluZCA8IDApIGJyZWFrO1xuICAgICAgICBzdHJzLnB1c2godGVtcGxhdGUuc3Vic3RyKDAsIGluZCkpO1xuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnN1YnN0cihpbmQgKyAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKHN0cnNbMF0gPT0gXCJyZXF1aXJlXCIpIHJldHVybiBcInJlcXVpcmVOdW1UaXRsZVwiO1xuICAgICAgICBpZiAoc3Ryc1sxXSA9PSBcInJlcXVpcmVcIiAmJiBzdHJzLmxlbmd0aCA9PSAzKSByZXR1cm4gXCJudW1SZXF1aXJlVGl0bGVcIjtcbiAgICAgICAgaWYgKHN0cnMuaW5kZXhPZihcInJlcXVpcmVcIikgPCAwKSByZXR1cm4gXCJudW1UaXRsZVwiO1xuICAgICAgfVxuICAgICAgaWYgKHN0cnMubGVuZ3RoID09IDEgJiYgc3Ryc1swXSA9PSBcInRpdGxlXCIpIHtcbiAgICAgICAgcmV0dXJuIFwibnVtVGl0bGVcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwibnVtVGl0bGVSZXF1aXJlXCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXROZXdRdWVzdGlvblRpdGxlRWxlbWVudChcbiAgICB0ZW1wbGF0ZTogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjdXJyZW50VmFsdWU6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIG5hbWUgPSBcIntcIiArIG5hbWUgKyBcIn1cIjtcbiAgICBpZiAoIXRlbXBsYXRlIHx8IHRlbXBsYXRlLmluZGV4T2YobmFtZSkgPCAwKSByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgIHZhciBpbmQgPSB0ZW1wbGF0ZS5pbmRleE9mKG5hbWUpO1xuICAgIHZhciBwcmVmaXggPSBcIlwiO1xuICAgIHZhciBwb3N0Zml4ID0gXCJcIjtcbiAgICB2YXIgaSA9IGluZCAtIDE7XG4gICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAodGVtcGxhdGVbaV0gPT0gXCJ9XCIpIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoaSA8IGluZCAtIDEpIHtcbiAgICAgIHByZWZpeCA9IHRlbXBsYXRlLnN1YnN0cihpICsgMSwgaW5kIC0gaSAtIDEpO1xuICAgIH1cbiAgICBpbmQgKz0gbmFtZS5sZW5ndGg7XG4gICAgaSA9IGluZDtcbiAgICBmb3IgKDsgaSA8IHRlbXBsYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGVtcGxhdGVbaV0gPT0gXCJ7XCIpIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoaSA+IGluZCkge1xuICAgICAgcG9zdGZpeCA9IHRlbXBsYXRlLnN1YnN0cihpbmQsIGkgLSBpbmQpO1xuICAgIH1cbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IHByZWZpeC5sZW5ndGggJiYgcHJlZml4LmNoYXJDb2RlQXQoaSkgPCAzMykgaSsrO1xuICAgIHByZWZpeCA9IHByZWZpeC5zdWJzdHIoaSk7XG4gICAgaSA9IHBvc3RmaXgubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoaSA+PSAwICYmIHBvc3RmaXguY2hhckNvZGVBdChpKSA8IDMzKSBpLS07XG4gICAgcG9zdGZpeCA9IHBvc3RmaXguc3Vic3RyKDAsIGkgKyAxKTtcbiAgICBpZiAoIXByZWZpeCAmJiAhcG9zdGZpeCkgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB2YXIgdmFsdWUgPSAhIWN1cnJlbnRWYWx1ZSA/IGN1cnJlbnRWYWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbiAgICByZXR1cm4gcHJlZml4ICsgdmFsdWUgKyBwb3N0Zml4O1xuICB9XG4gIGdldCBsb2NRdWVzdGlvblRpdGxlVGVtcGxhdGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIpO1xuICB9XG4gIGdldFVwZGF0ZWRRdWVzdGlvblRpdGxlKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9uR2V0UXVlc3Rpb25UaXRsZS5pc0VtcHR5KSByZXR1cm4gdGl0bGU7XG4gICAgdmFyIG9wdGlvbnMgPSB7IHF1ZXN0aW9uOiBxdWVzdGlvbiwgdGl0bGU6IHRpdGxlIH07XG4gICAgdGhpcy5vbkdldFF1ZXN0aW9uVGl0bGUuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy50aXRsZTtcbiAgfVxuICBnZXRVcGRhdGVkUXVlc3Rpb25ObyhxdWVzdGlvbjogSVF1ZXN0aW9uLCBubzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vbkdldFF1ZXN0aW9uTm8uaXNFbXB0eSkgcmV0dXJuIG5vO1xuICAgIHZhciBvcHRpb25zID0geyBxdWVzdGlvbjogcXVlc3Rpb24sIG5vOiBubyB9O1xuICAgIHRoaXMub25HZXRRdWVzdGlvbk5vLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMubm87XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRoZSBzdXJ2ZXkgZGlzcGxheXMgcGFnZSBudW1iZXJzIG9uIHBhZ2VzIHRpdGxlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1BhZ2VOdW1iZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZU51bWJlcnNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1BhZ2VOdW1iZXJzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnNob3dQYWdlTnVtYmVycykgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQYWdlTnVtYmVyc1wiLCB2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyBob3cgdGhlIHF1ZXN0aW9uIG51bWJlcnMgYXJlIGRpc3BsYXllZC5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYG9uYCAtIGRpc3BsYXkgcXVlc3Rpb24gbnVtYmVyc1xuICAgKiAtIGBvbnBhZ2VgIC0gZGlzcGxheSBxdWVzdGlvbiBudW1iZXJzLCBzdGFydCBudW1iZXJpbmcgb24gZXZlcnkgcGFnZVxuICAgKiAtIGBvZmZgIC0gdHVybiBvZmYgdGhlIG51bWJlcmluZyBmb3IgcXVlc3Rpb25zIHRpdGxlc1xuICAgKi9cbiAgcHVibGljIGdldCBzaG93UXVlc3Rpb25OdW1iZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsdWUgPSB2YWx1ZSA9PT0gXCJvbnBhZ2VcIiA/IFwib25QYWdlXCIgOiB2YWx1ZTtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycykgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIiwgdmFsdWUpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzdXJ2ZXkgcHJvZ3Jlc3MgYmFyIHBvc2l0aW9uLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgb2ZmYCAoZGVmYXVsdCkgLSBkb24ndCBzaG93IHByb2dyZXNzIGJhclxuICAgKiAtIGB0b3BgIC0gc2hvdyBwcm9ncmVzcyBiYXIgaW4gdGhlIHRvcFxuICAgKiAtIGBib3R0b21gIC0gc2hvdyBwcm9ncmVzcyBiYXIgaW4gdGhlIGJvdHRvbVxuICAgKiAtIGBib3RoYCAtIHNob3cgcHJvZ3Jlc3MgYmFyIGluIGJvdGggc2lkZXM6IHRvcCBhbmQgYm90dG9tLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UHJvZ3Jlc3NCYXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1Byb2dyZXNzQmFyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1Byb2dyZXNzQmFyKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UHJvZ3Jlc3NCYXJcIiwgbmV3VmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdHlwZSBvZiBpbmZvIGluIHRoZSBwcm9ncmVzcyBiYXIuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKlxuICAgKiAtIGBwYWdlc2AgKGRlZmF1bHQpLFxuICAgKiAtIGBxdWVzdGlvbnNgLFxuICAgKiAtIGByZXF1aXJlZFF1ZXN0aW9uc2AsXG4gICAqIC0gYGNvcnJlY3RRdWVzdGlvbnNgLFxuICAgKiAtIGBidXR0b25zYFxuICAgKi9cbiAgcHVibGljIGdldCBwcm9ncmVzc0JhclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicHJvZ3Jlc3NCYXJUeXBlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHJvZ3Jlc3NCYXJUeXBlKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAobmV3VmFsdWUgPT09IFwiY29ycmVjdHF1ZXN0aW9uXCIpIG5ld1ZhbHVlID0gXCJjb3JyZWN0UXVlc3Rpb25cIjtcbiAgICBpZiAobmV3VmFsdWUgPT09IFwicmVxdWlyZWRxdWVzdGlvblwiKSBuZXdWYWx1ZSA9IFwicmVxdWlyZWRRdWVzdGlvblwiO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInByb2dyZXNzQmFyVHlwZVwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBpc1Nob3dQcm9ncmVzc0Jhck9uVG9wKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jYW5TaG93UHJvcmVzQmFyKCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwidG9wXCIgfHwgdGhpcy5zaG93UHJvZ3Jlc3NCYXIgPT09IFwiYm90aFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJvZ3Jlc3NCYXJPbkJvdHRvbSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY2FuU2hvd1Byb3Jlc0JhcigpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1Byb2dyZXNzQmFyID09PSBcImJvdHRvbVwiIHx8IHRoaXMuc2hvd1Byb2dyZXNzQmFyID09PSBcImJvdGhcIjtcbiAgfVxuICBwcml2YXRlIGNhblNob3dQcm9yZXNCYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLmlzU2hvd2luZ1ByZXZpZXcgfHxcbiAgICAgIHRoaXMuc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZSAhPSBcInNob3dBbGxRdWVzdGlvbnNcIlxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQvSFRNTCB0aGF0IGlzIHJlbmRlcmVkIGFzIGEgc3VydmV5IHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm9jZXNzZWRUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUaXRsZS5yZW5kZXJlZEh0bWw7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgcXVlc3Rpb24gdGl0bGUgbG9jYXRpb24uXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKlxuICAgKiAtIGBib3R0b21gIC0gc2hvdyBhIHF1ZXN0aW9uIHRpdGxlIHRvIGJvdHRvbVxuICAgKiAtIGBsZWZ0YCAtIHNob3cgYSBxdWVzdGlvbiB0aXRsZSB0byBsZWZ0XG4gICAqIC0gYHRvcGAgLSBzaG93IGEgcXVlc3Rpb24gdGl0bGUgdG8gdG9wLlxuICAgKlxuICAgKiA+IFNvbWUgcXVlc3Rpb25zLCBmb3IgZXhhbXBsZSBtYXRyaXhlcywgZG8gbm90IHN1cHBvcnQgJ2xlZnQnIHZhbHVlLiBUaGUgdGl0bGUgZm9yIHRoZW0gd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHRvcC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzKHRydWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlRWxlbWVudENzcyhyZU5ldz86IGJvb2xlYW4pIHtcbiAgICB2YXIgcGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYWdlc1tpXS51cGRhdGVFbGVtZW50Q3NzKHJlTmV3KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZXJyb3IgbWVzc2FnZSBwb3NpdGlvbi5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYHRvcGAgLSB0byBzaG93IHF1ZXN0aW9uIGVycm9yKHMpIG92ZXIgdGhlIHF1ZXN0aW9uLFxuICAgKiAtIGBib3R0b21gIC0gdG8gc2hvdyBxdWVzdGlvbiBlcnJvcihzKSB1bmRlciB0aGUgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uRXJyb3JMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbkVycm9yTG9jYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uRXJyb3JMb2NhdGlvblwiLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBxdWVzdGlvbiBkZXNjcmlwdGlvbiBwb3NpdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYHVuZGVyVGl0bGVgLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgdW5kZXJUaXRsZWAgLSBzaG93IHF1ZXN0aW9uIGRlc2NyaXB0aW9uIHVuZGVyIHRoZSBxdWVzdGlvbiB0aXRsZSxcbiAgICogLSBgdW5kZXJJbnB1dGAgLSBzaG93IHF1ZXN0aW9uIGRlc2NyaXB0aW9uIHVuZGVyIHRoZSBxdWVzdGlvbiBpbnB1dCBpbnN0ZWFkIG9mIHF1ZXN0aW9uIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvbkRlc2NyaXB0aW9uTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbkRlc2NyaXB0aW9uTG9jYXRpb25cIiwgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHN1cnZleSBlZGl0IG1vZGUuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKlxuICAgKiAtIGBlZGl0YCAoZGVmYXVsdCkgLSBtYWtlIGEgc3VydmV5IGVkaXRhYmxlLFxuICAgKiAtIGBkaXNwbGF5YCAtIG1ha2UgYSBzdXJ2ZXkgcmVhZC1vbmx5LlxuICAgKi9cbiAgcHVibGljIGdldCBtb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBtb2RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbHVlID09IHRoaXMubW9kZSkgcmV0dXJuO1xuICAgIGlmICh2YWx1ZSAhPSBcImVkaXRcIiAmJiB2YWx1ZSAhPSBcImRpc3BsYXlcIikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1vZGVcIiwgdmFsdWUpO1xuICB9XG4gIHByaXZhdGUgb25Nb2RlQ2hhbmdlZCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5wYWdlc1tpXTtcbiAgICAgIHBhZ2Uuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVhZE9ubHlcIiwgcGFnZS5pc1JlYWRPbmx5KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhbiBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIHN1cnZleSByZXN1bHRzL2RhdGEuIFlvdSBjYW4gc2V0IGl0IGRpcmVjdGx5IGFzIGB7ICdxdWVzdGlvbiBuYW1lJzogcXVlc3Rpb25WYWx1ZSwgLi4uIH1gXG4gICAqXG4gICAqID4gSWYgeW91IHNldCB0aGUgYGRhdGFgIHByb3BlcnR5IGFmdGVyIGNyZWF0aW5nIHRoZSBzdXJ2ZXksIHlvdSBtYXkgbmVlZCB0byBzZXQgdGhlIGBjdXJyZW50UGFnZU5vYCB0byBgMGAsIGlmIHlvdSBhcmUgdXNpbmcgYHZpc2libGVJZmAgcHJvcGVydGllcyBmb3IgcXVlc3Rpb25zL3BhZ2VzL3BhbmVscyB0byBlbnN1cmUgdGhhdCB5b3UgYXJlIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IHBhZ2UuXG4gICAqIEBzZWUgc2V0VmFsdWVcbiAgICogQHNlZSBnZXRWYWx1ZVxuICAgKiBAc2VlIG1lcmdlRGF0YVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlTm9cbiAgICovXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIHZhciBrZXlzID0gdGhpcy5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhciBkYXRhVmFsdWUgPSB0aGlzLmdldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBrZXkpO1xuICAgICAgaWYgKGRhdGFWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gZGF0YVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNldENhbGN1YXRlZFZhbHVlc0ludG9SZXN1bHQocmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBzZXQgZGF0YShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlc0hhc2ggPSB7fTtcbiAgICB0aGlzLnNldERhdGFDb3JlKGRhdGEpO1xuICB9XG4gIC8qKlxuICAgKiBNZXJnZSB0aGUgdmFsdWVzIGludG8gc3VydmV5LmRhdGEuIEl0IHdvcmtzIGFzIHN1cnZleS5kYXRhLCBleGNlcHQgaXQgZG9lc24ndCBjbGVhbiB0aGUgZXhpc3RpbmcgZGF0YSwgYnV0IG92ZXJyaWRlcyB0aGVtLlxuICAgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIG1lcmdlLiBJdCBzaG91bGQgYmUgYW4gb2JqZWN0IHtrZXlWYWx1ZTogVmFsdWUsIC4uLn1cbiAgICogQHNlZSBkYXRhXG4gICAqIEBzZWUgc2V0VmFsdWVcbiAgICovXG4gIHB1YmxpYyBtZXJnZURhdGEoZGF0YTogYW55KSB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm47XG4gICAgdGhpcy5zZXREYXRhQ29yZShkYXRhKTtcbiAgfVxuICBwdWJsaWMgc2V0RGF0YUNvcmUoZGF0YTogYW55KSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICAgIHRoaXMuc2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGtleSwgZGF0YVtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVBbGxRdWVzdGlvbnNWYWx1ZSgpO1xuICAgIHRoaXMubm90aWZ5QWxsUXVlc3Rpb25zT25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKFwiXCIpO1xuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdGluZ09iaigpOiBCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nT2JqVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBvbkVkaXRpbmdPYmpQcm9wZXJ0eUNoYW5nZWQ6IChzZW5kZXI6IEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gdm9pZDtcbiAgcHVibGljIHNldCBlZGl0aW5nT2JqKHZhbDogQmFzZSkge1xuICAgIGlmICh0aGlzLmVkaXRpbmdPYmogPT0gdmFsKSByZXR1cm47XG4gICAgaWYgKCEhdGhpcy5lZGl0aW5nT2JqKSB7XG4gICAgICB0aGlzLmVkaXRpbmdPYmoub25Qcm9wZXJ0eUNoYW5nZWQucmVtb3ZlKFxuICAgICAgICB0aGlzLm9uRWRpdGluZ09ialByb3BlcnR5Q2hhbmdlZFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5lZGl0aW5nT2JqVmFsdWUgPSB2YWw7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkgcmV0dXJuO1xuICAgIGlmICghdmFsKSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHF1ZXN0aW9uc1tpXS51bmJpbmRWYWx1ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISF0aGlzLmVkaXRpbmdPYmopIHtcbiAgICAgIHRoaXMuc2V0RGF0YUNvcmUoe30pO1xuICAgICAgdGhpcy5vbkVkaXRpbmdPYmpQcm9wZXJ0eUNoYW5nZWQgPSAoc2VuZGVyOiBCYXNlLCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFTZXJpYWxpemVyLmhhc09yaWdpbmFsUHJvcGVydHkodGhpcy5lZGl0aW5nT2JqLCBvcHRpb25zLm5hbWUpKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy51cGRhdGVPblNldFZhbHVlKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5uZXdWYWx1ZSwgb3B0aW9ucy5vbGRWYWx1ZSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0aW5nT2JqLm9uUHJvcGVydHlDaGFuZ2VkLmFkZCh0aGlzLm9uRWRpdGluZ09ialByb3BlcnR5Q2hhbmdlZCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaXNFZGl0aW5nU3VydmV5RWxlbWVudCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmVkaXRpbmdPYmo7XG4gIH1cbiAgcHJpdmF0ZSBzZXRDYWxjdWF0ZWRWYWx1ZXNJbnRvUmVzdWx0KHJlc3VsdDogYW55KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjYWxWYWx1ZSA9IHRoaXMuY2FsY3VsYXRlZFZhbHVlc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgY2FsVmFsdWUuaW5jbHVkZUludG9SZXN1bHQgJiZcbiAgICAgICAgISFjYWxWYWx1ZS5uYW1lICYmXG4gICAgICAgIHRoaXMuZ2V0VmFyaWFibGUoY2FsVmFsdWUubmFtZSkgIT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIHJlc3VsdFtjYWxWYWx1ZS5uYW1lXSA9IHRoaXMuZ2V0VmFyaWFibGUoY2FsVmFsdWUubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRhdGE7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgc3VydmV5IHJlc3VsdCBkYXRhIGFzIGFuIGFycmF5IG9mIHBsYWluIG9iamVjdHM6IHdpdGggcXVlc3Rpb24gYHRpdGxlYCwgYG5hbWVgLCBgdmFsdWVgLCBhbmQgYGRpc3BsYXlWYWx1ZWAuXG4gICAqXG4gICAqIEZvciBjb21wbGV4IHF1ZXN0aW9ucyAobGlrZSBtYXRyaXgsIGV0Yy4pIGBpc05vZGVgIGZsYWcgaXMgc2V0IHRvIGB0cnVlYCBhbmQgZGF0YSBjb250YWlucyBhcnJheSBvZiBuZXN0ZWQgb2JqZWN0cyAocm93cykuXG4gICAqXG4gICAqIFNldCBgb3B0aW9ucy5pbmNsdWRlRW1wdHlgIHRvIGBmYWxzZWAgaWYgeW91IHdhbnQgdG8gc2tpcCBlbXB0eSBhbnN3ZXJzLlxuICAgKi9cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZVF1ZXN0aW9uVHlwZXM/OiBib29sZWFuO1xuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWUsXG4gICAgICBpbmNsdWRlUXVlc3Rpb25UeXBlczogZmFsc2UsXG4gICAgfVxuICApIHtcbiAgICB2YXIgcmVzdWx0OiBBcnJheTxhbnk+ID0gW107XG4gICAgdGhpcy5nZXRBbGxRdWVzdGlvbnMoKS5mb3JFYWNoKChxdWVzdGlvbikgPT4ge1xuICAgICAgdmFyIHJlc3VsdEl0ZW0gPSAoPFF1ZXN0aW9uPnF1ZXN0aW9uKS5nZXRQbGFpbkRhdGEob3B0aW9ucyk7XG4gICAgICBpZiAoISFyZXN1bHRJdGVtKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHJlc3VsdEl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZ2V0RmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICB2YXIgdmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy52YXJpYWJsZXNIYXNoKSB2YWx1ZXNba2V5XSA9IHRoaXMudmFyaWFibGVzSGFzaFtrZXldO1xuICAgIHRoaXMuYWRkQ2FsY3VsYXRlZFZhbHVlc0ludG9GaWx0ZXJlZFZhbHVlcyh2YWx1ZXMpO1xuICAgIHZhciBrZXlzID0gdGhpcy5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhbHVlc1trZXldID0gdGhpcy5nZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBwcml2YXRlIGFkZENhbGN1bGF0ZWRWYWx1ZXNJbnRvRmlsdGVyZWRWYWx1ZXModmFsdWVzOiB7XG4gICAgW2luZGV4OiBzdHJpbmddOiBhbnk7XG4gIH0pIHtcbiAgICB2YXIgY2FjbFZhbHVlcyA9IHRoaXMuY2FsY3VsYXRlZFZhbHVlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhY2xWYWx1ZXMubGVuZ3RoOyBpKyspXG4gICAgICB2YWx1ZXNbY2FjbFZhbHVlc1tpXS5uYW1lXSA9IGNhY2xWYWx1ZXNbaV0udmFsdWU7XG4gIH1cbiAgZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHsgc3VydmV5OiB0aGlzIH07XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZXNLZXlzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGlmICghdGhpcy5lZGl0aW5nT2JqKSByZXR1cm4gT2JqZWN0LmtleXModGhpcy52YWx1ZXNIYXNoKTtcbiAgICB2YXIgcHJvcHMgPSBTZXJpYWxpemVyLmdldFByb3BlcnRpZXNCeU9iaih0aGlzLmVkaXRpbmdPYmopO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChwcm9wc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgaWYgKCEhdGhpcy5lZGl0aW5nT2JqKVxuICAgICAgcmV0dXJuIFNlcmlhbGl6ZXIuZ2V0T2JqUHJvcGVydHlWYWx1ZSh0aGlzLmVkaXRpbmdPYmosIGtleSk7XG4gICAgcmV0dXJuIHZhbHVlc0hhc2hba2V5XTtcbiAgfVxuICBwdWJsaWMgc2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5lZGl0aW5nT2JqKSB7XG4gICAgICBTZXJpYWxpemVyLnNldE9ialByb3BlcnR5VmFsdWUodGhpcy5lZGl0aW5nT2JqLCBrZXksIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWVzSGFzaFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBkZWxldGVEYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoISF0aGlzLmVkaXRpbmdPYmopIHtcbiAgICAgICg8YW55PnRoaXMuZWRpdGluZ09iailba2V5XSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZXNIYXNoW2tleV07XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBjb21tZW50cyBmcm9tIHRoZSBkYXRhLlxuICAgKiBAc2VlIGRhdGFcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tbWVudHMoKTogYW55IHtcbiAgICB2YXIgcmVzdWx0OiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy5jb21tZW50UHJlZml4KSA+IDApIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmdldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB2aXNpYmxlIHBhZ2VzLiBJZiBhbGwgcGFnZXMgYXJlIHZpc2libGUsIHRoZW4gdGhpcyBwcm9wZXJ0eSByZXR1cm5zIHRoZSBzYW1lIGxpc3QgYXMgdGhlIGBwYWdlc2AgcHJvcGVydHkuXG4gICAqIEBzZWUgcGFnZXNcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJsZVxuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVBhZ2VzKCk6IEFycmF5PFBhZ2VNb2RlbD4ge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIHRoaXMucGFnZXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxQYWdlTW9kZWw+KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wYWdlc1tpXS5pc1Zpc2libGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5wYWdlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzdXJ2ZXkgY29udGFpbnMgbm8gcGFnZXMuIFRoZSBzdXJ2ZXkgaXMgZW1wdHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXMubGVuZ3RoID09IDA7XG4gIH1cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQuIFVzZSB0aGUgYHBhZ2VDb3VudGAgcHJvcGVydHkgaW5zdGVhZC5cbiAgICovXG4gIGdldCBQYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlQ291bnQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1cnZleSBwYWdlIGNvdW50LlxuICAgKiBAc2VlIHZpc2libGVQYWdlQ291bnRcbiAgICogQHNlZSBwYWdlc1xuICAgKi9cbiAgcHVibGljIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlcy5sZW5ndGg7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBudW1iZXIgb2YgdmlzaWJsZSBwYWdlcyB3aXRoaW4gdGhlIHN1cnZleS5cbiAgICogQHNlZSBwYWdlQ291bnRcbiAgICogQHNlZSB2aXNpYmxlUGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVQYWdlcy5sZW5ndGg7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YXJ0ZWQgcGFnZS4gVGhpcyBwcm9wZXJ0eSB3b3JrcyBpZiB0aGUgYGZpcnN0UGFnZUlzU3RhcnRlZGAgcHJvcGVydHkgaXMgc2V0IHRvIGB0cnVlYC5cbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRlZFBhZ2UoKTogUGFnZU1vZGVsIHtcbiAgICB2YXIgcGFnZSA9XG4gICAgICB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCAmJiB0aGlzLnBhZ2VzLmxlbmd0aCA+IDAgPyB0aGlzLnBhZ2VzWzBdIDogbnVsbDtcbiAgICBpZiAoISFwYWdlKSB7XG4gICAgICBwYWdlLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICAgIHBhZ2Uuc2V0V2FzU2hvd24odHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBwYWdlO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGN1cnJlbnQgc3VydmV5IHBhZ2UuIElmIGEgc3VydmV5IGlzIHJlbmRlcmVkLCB0aGVuIHRoaXMgcHJvcGVydHkgcmV0dXJucyBhIHBhZ2UgdGhhdCBhIHVzZXIgY2FuIHNlZS9lZGl0LlxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50UGFnZSgpOiBhbnkge1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZVZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmICh2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlVmFsdWUpIDwgMCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRoaXMub25Db250YWluc1BhZ2VDYWxsYmFjayB8fFxuICAgICAgICAgICF0aGlzLm9uQ29udGFpbnNQYWdlQ2FsbGJhY2sodGhpcy5jdXJyZW50UGFnZVZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZVZhbHVlID09IG51bGwgJiYgdlBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB2UGFnZXNbMF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjdXJyZW50UGFnZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgbmV3UGFnZSA9IHRoaXMuZ2V0UGFnZUJ5T2JqZWN0KHZhbHVlKTtcbiAgICBpZiAoISF2YWx1ZSAmJiAhbmV3UGFnZSkgcmV0dXJuO1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICBpZiAobmV3UGFnZSAhPSBudWxsICYmIHZQYWdlcy5pbmRleE9mKG5ld1BhZ2UpIDwgMCkgcmV0dXJuO1xuICAgIGlmIChuZXdQYWdlID09IHRoaXMuY3VycmVudFBhZ2VWYWx1ZSkgcmV0dXJuO1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuY3VycmVudFBhZ2VWYWx1ZTtcbiAgICBpZiAoIXRoaXMuY3VycmVudFBhZ2VDaGFuZ2luZyhuZXdQYWdlLCBvbGRWYWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRQYWdlVmFsdWUgPSBuZXdQYWdlO1xuICAgIGlmICghIW5ld1BhZ2UpIHtcbiAgICAgIG5ld1BhZ2Uub25GaXJzdFJlbmRlcmluZygpO1xuICAgICAgbmV3UGFnZS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgICBuZXdQYWdlLnNldFdhc1Nob3duKHRydWUpO1xuICAgIH1cbiAgICB0aGlzLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgdGhpcy5jdXJyZW50UGFnZUNoYW5nZWQobmV3UGFnZSwgb2xkVmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50UGFnZSwgdW5sZXNzIHRoZSBzdGFydGVkIHBhZ2UgaXMgc2hvd2luZy4gSW4gdGhpcyBjYXNlIHJldHVybnMgdGhlIHN0YXJ0ZWQgcGFnZS5cbiAgICogQHNlZSBjdXJyZW50UGFnZVxuICAgKiBAc2VlIGZpcnN0UGFnZUlzU3RhcnRlZFxuICAgKiBAc2VlIHN0YXJ0ZWRQYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFjdGl2ZVBhZ2UoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5pc1N0YXJ0ZWRTdGF0ZSAmJiB0aGlzLnN0YXJ0ZWRQYWdlXG4gICAgICA/IHRoaXMuc3RhcnRlZFBhZ2VcbiAgICAgIDogdGhpcy5jdXJyZW50UGFnZTtcbiAgfVxuICBwcml2YXRlIGdldFBhZ2VCeU9iamVjdCh2YWx1ZTogYW55KTogUGFnZU1vZGVsIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodmFsdWUuZ2V0VHlwZSAmJiB2YWx1ZS5nZXRUeXBlKCkgPT0gXCJwYWdlXCIpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFnZUJ5TmFtZShTdHJpbmcodmFsdWUpKTtcbiAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgdmFyIGluZGV4ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gdlBhZ2VzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdlBhZ2VzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgY3VycmVudCBwYWdlIGluIHRoZSB2aXNpYmxlIHBhZ2VzIGFycmF5LlxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50UGFnZU5vKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSk7XG4gIH1cbiAgcHVibGljIHNldCBjdXJyZW50UGFnZU5vKHZhbHVlOiBudW1iZXIpIHtcbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+PSB2UGFnZXMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHZQYWdlc1t2YWx1ZV07XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgcXVlc3Rpb24gZGlzcGxheSBvcmRlci4gVXNlIHRoaXMgcHJvcGVydHkgdG8gcmFuZG9taXplIHF1ZXN0aW9ucy4gWW91IGNhbiByYW5kb21pemUgcXVlc3Rpb25zIG9uIGEgc3BlY2lmaWMgcGFnZS5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYHJhbmRvbWAgLSByYW5kb21pemUgcXVlc3Rpb25zXG4gICAqIC0gYGluaXRpYWxgIC0ga2VlcCBxdWVzdGlvbnMgaW4gdGhlIHNhbWUgb3JkZXIsIGFzIGluIGEgc3VydmV5IG1vZGVsLlxuICAgKiBAc2VlIFN1cnZleVBhZ2UucXVlc3Rpb25zT3JkZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zT3JkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uc09yZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25zT3JkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbnNPcmRlclwiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGlucHV0IGZvY3VzIHRvIHRoZSBmaXJzdCBxdWVzdGlvbiB3aXRoIHRoZSBpbnB1dCBmaWVsZC5cbiAgICovXG4gIHB1YmxpYyBmb2N1c0ZpcnN0UXVlc3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNGb2N1c2luZ1F1ZXN0aW9uKSByZXR1cm47XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmFjdGl2ZVBhZ2U7XG4gICAgaWYgKHBhZ2UpIHtcbiAgICAgIHBhZ2Uuc2Nyb2xsVG9Ub3AoKTtcbiAgICAgIHBhZ2UuZm9jdXNGaXJzdFF1ZXN0aW9uKCk7XG4gICAgfVxuICB9XG4gIHNjcm9sbFRvVG9wT25QYWdlQ2hhbmdlKCkge1xuICAgIHZhciBwYWdlID0gdGhpcy5hY3RpdmVQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuO1xuICAgIHBhZ2Uuc2Nyb2xsVG9Ub3AoKTtcbiAgICBpZiAodGhpcy5mb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWMgJiYgIXRoaXMuaXNGb2N1c2luZ1F1ZXN0aW9uKSB7XG4gICAgICBwYWdlLmZvY3VzRmlyc3RRdWVzdGlvbigpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdXJ2ZXkgc3RhdGU6XG4gICAqXG4gICAqIC0gYGxvYWRpbmdgIC0gdGhlIHN1cnZleSBpcyBiZWluZyBsb2FkZWQgZnJvbSBKU09OLFxuICAgKiAtIGBlbXB0eWAgLSB0aGVyZSBpcyBub3RoaW5nIHRvIGRpc3BsYXkgaW4gdGhlIGN1cnJlbnQgc3VydmV5LFxuICAgKiAtIGBzdGFydGluZ2AgLSB0aGUgc3VydmV5J3Mgc3RhcnQgcGFnZSBpcyBkaXNwbGF5ZWQsXG4gICAqIC0gYHJ1bm5pbmdgIC0gYSByZXNwb25kZW50IGlzIGFuc3dlcmluZyBzdXJ2ZXkgcXVlc3Rpb25zIHJpZ2h0IG5vdyxcbiAgICogLSBgcHJldmlld2AgLSBhIHJlc3BvbmRlbnQgaXMgcHJldmlld2luZyBhbnN3ZXJlZCBxdWVzdGlvbnMgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIHN1cnZleSAoc2VlIFtleGFtcGxlXShodHRwczovL3N1cnZleWpzLmlvL0V4YW1wbGVzL0xpYnJhcnk/aWQ9c3VydmV5LXNob3dwcmV2aWV3KSksXG4gICAqIC0gYGNvbXBsZXRlZGAgLSBhIHJlc3BvbmRlbnQgaGFzIGNvbXBsZXRlZCB0aGUgc3VydmV5IGFuZCBzdWJtaXR0ZWQgdGhlIHJlc3VsdHMuXG4gICAqXG4gICAqIERldGFpbHM6IFtQcmV2aWV3IFN0YXRlXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeSNzdGF0ZXMpXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nKSByZXR1cm4gXCJsb2FkaW5nXCI7XG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWQpIHJldHVybiBcImNvbXBsZXRlZFwiO1xuICAgIGlmICh0aGlzLmlzQ29tcGxldGVkQmVmb3JlKSByZXR1cm4gXCJjb21wbGV0ZWRiZWZvcmVcIjtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc0Rlc2lnbk1vZGUgJiZcbiAgICAgIHRoaXMuaXNFZGl0TW9kZSAmJlxuICAgICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSAmJlxuICAgICAgdGhpcy5zdGFydGVkUGFnZVxuICAgIClcbiAgICAgIHJldHVybiBcInN0YXJ0aW5nXCI7XG4gICAgaWYgKHRoaXMuaXNTaG93aW5nUHJldmlldykgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgPyBcInByZXZpZXdcIiA6IFwiZW1wdHlcIjtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZSA/IFwicnVubmluZ1wiIDogXCJlbXB0eVwiO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzQ29tcGxldGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0NvbXBsZXRlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgaXNDb21wbGV0ZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNDb21wbGV0ZWRcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc1Nob3dpbmdQcmV2aWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1Nob3dpbmdQcmV2aWV3XCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc1Nob3dpbmdQcmV2aWV3KHZhbDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmlzU2hvd2luZ1ByZXZpZXcgPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNTaG93aW5nUHJldmlld1wiLCB2YWwpO1xuICAgIHRoaXMub25TaG93aW5nUHJldmlld0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc1N0YXJ0ZWRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNTdGFydGVkU3RhdGVcIiwgZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgc2V0IGlzU3RhcnRlZFN0YXRlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzU3RhcnRlZFN0YXRlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNDb21wbGV0ZWRCZWZvcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzQ29tcGxldGVkQmVmb3JlXCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc0NvbXBsZXRlZEJlZm9yZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0NvbXBsZXRlZEJlZm9yZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNMb2FkaW5nXCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc0xvYWRpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNMb2FkaW5nXCIsIHZhbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZFN0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVkU3RhdGVWYWx1ZTtcbiAgfVxuICBnZXQgY29tcGxldGVkU3RhdGVUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVkU3RhdGVUZXh0VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENvbXBsZXRlZFN0YXRlKHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuY29tcGxldGVkU3RhdGVWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgaWYgKHZhbHVlID09IFwic2F2aW5nXCIpIHRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInNhdmluZ0RhdGFcIik7XG4gICAgICBpZiAodmFsdWUgPT0gXCJlcnJvclwiKSB0ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJzYXZpbmdEYXRhRXJyb3JcIik7XG4gICAgICBpZiAodmFsdWUgPT0gXCJzdWNjZXNzXCIpIHRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInNhdmluZ0RhdGFTdWNjZXNzXCIpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlID0gdGV4dDtcbiAgfVxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBzdXJ2ZXkgZGF0YSBhbmQgc3RhdGUuIElmIHRoZSBzdXJ2ZXkgaGFzIGEgYGNvbXBsZXRlZGAgc3RhdGUsIGl0IHdpbGwgZ2V0IGEgYHJ1bm5pbmdgIHN0YXRlLlxuICAgKiBAcGFyYW0gY2xlYXJEYXRhIGNsZWFyIHRoZSBkYXRhXG4gICAqIEBwYXJhbSBnb3RvRmlyc3RQYWdlIG1ha2UgdGhlIGZpcnN0IHBhZ2UgYXMgYSBjdXJyZW50IHBhZ2UuXG4gICAqIEBzZWUgZGF0YVxuICAgKiBAc2VlIHN0YXRlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VcbiAgICovXG4gIHB1YmxpYyBjbGVhcihjbGVhckRhdGE6IGJvb2xlYW4gPSB0cnVlLCBnb3RvRmlyc3RQYWdlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChjbGVhckRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgICB0aGlzLnZhcmlhYmxlc0hhc2ggPSB7fTtcbiAgICB9XG4gICAgdGhpcy50aW1lU3BlbnQgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS50aW1lU3BlbnQgPSAwO1xuICAgICAgdGhpcy5wYWdlc1tpXS5zZXRXYXNTaG93bihmYWxzZSk7XG4gICAgICB0aGlzLnBhZ2VzW2ldLnBhc3NlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmlzQ29tcGxldGVkID0gZmFsc2U7XG4gICAgdGhpcy5pc0NvbXBsZXRlZEJlZm9yZSA9IGZhbHNlO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSA9IHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkO1xuICAgIGlmIChnb3RvRmlyc3RQYWdlICYmIHRoaXMudmlzaWJsZVBhZ2VDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnZpc2libGVQYWdlc1swXTtcbiAgICB9XG4gICAgaWYgKGNsZWFyRGF0YSkge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZXNXaXRoRGVmYXVsdHMoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIG1lcmdlVmFsdWVzKHNyYzogYW55LCBkZXN0OiBhbnkpIHtcbiAgICBpZiAoIWRlc3QgfHwgIXNyYykgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgZGVzdCAhPT0gXCJvYmplY3RcIikgcmV0dXJuO1xuICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHNyY1trZXldO1xuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoIWRlc3Rba2V5XSkgZGVzdFtrZXldID0ge307XG4gICAgICAgIHRoaXMubWVyZ2VWYWx1ZXModmFsdWUsIGRlc3Rba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWYWx1ZXNXaXRoRGVmYXVsdHMoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMuaXNMb2FkaW5nKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5wYWdlc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBxdWVzdGlvbnNbal0udXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1c3RvbVdpZGdldHMocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgaWYgKCFwYWdlKSByZXR1cm47XG4gICAgcGFnZS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGN1cnJlbnRQYWdlQ2hhbmdpbmcobmV3VmFsdWU6IFBhZ2VNb2RlbCwgb2xkVmFsdWU6IFBhZ2VNb2RlbCkge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgb2xkQ3VycmVudFBhZ2U6IG9sZFZhbHVlLFxuICAgICAgbmV3Q3VycmVudFBhZ2U6IG5ld1ZhbHVlLFxuICAgICAgYWxsb3dDaGFuZ2luZzogdHJ1ZSxcbiAgICAgIGlzTmV4dFBhZ2U6IHRoaXMuaXNOZXh0UGFnZShuZXdWYWx1ZSwgb2xkVmFsdWUpLFxuICAgICAgaXNQcmV2UGFnZTogdGhpcy5pc1ByZXZQYWdlKG5ld1ZhbHVlLCBvbGRWYWx1ZSksXG4gICAgfTtcbiAgICB0aGlzLm9uQ3VycmVudFBhZ2VDaGFuZ2luZy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93Q2hhbmdpbmc7XG4gIH1cbiAgcHJvdGVjdGVkIGN1cnJlbnRQYWdlQ2hhbmdlZChuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKSB7XG4gICAgY29uc3QgaXNOZXh0UGFnZTogYm9vbGVhbiA9IHRoaXMuaXNOZXh0UGFnZShuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgIGlmIChpc05leHRQYWdlKSB7XG4gICAgICBvbGRWYWx1ZS5wYXNzZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLm9uQ3VycmVudFBhZ2VDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgb2xkQ3VycmVudFBhZ2U6IG9sZFZhbHVlLFxuICAgICAgbmV3Q3VycmVudFBhZ2U6IG5ld1ZhbHVlLFxuICAgICAgaXNOZXh0UGFnZTogaXNOZXh0UGFnZSxcbiAgICAgIGlzUHJldlBhZ2U6IHRoaXMuaXNQcmV2UGFnZShuZXdWYWx1ZSwgb2xkVmFsdWUpLFxuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgaXNOZXh0UGFnZShuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKTogYm9vbGVhbiB7XG4gICAgaWYgKCFuZXdWYWx1ZSB8fCAhb2xkVmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gbmV3VmFsdWUudmlzaWJsZUluZGV4ID09IG9sZFZhbHVlLnZpc2libGVJbmRleCArIDE7XG4gIH1cbiAgcHJpdmF0ZSBpc1ByZXZQYWdlKG5ld1ZhbHVlOiBQYWdlTW9kZWwsIG9sZFZhbHVlOiBQYWdlTW9kZWwpOiBib29sZWFuIHtcbiAgICBpZiAoIW5ld1ZhbHVlIHx8ICFvbGRWYWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBuZXdWYWx1ZS52aXNpYmxlSW5kZXggKyAxID09IG9sZFZhbHVlLnZpc2libGVJbmRleDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJvZ3Jlc3MgdGhhdCBhIHVzZXIgbWFkZSB3aGlsZSBnb2luZyB0aHJvdWdoIHRoZSBzdXJ2ZXkuXG4gICAqIEl0IGRlcGVuZHMgZnJvbSBwcm9ncmVzc0JhclR5cGUgcHJvcGVydHlcbiAgICogQHNlZSBwcm9ncmVzc0JhclR5cGVcbiAgICogQHNlZSBwcm9ncmVzc1ZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0UHJvZ3Jlc3MoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gMDtcbiAgICBpZiAodGhpcy5wcm9ncmVzc0JhclR5cGUgIT09IFwicGFnZXNcIikge1xuICAgICAgdmFyIGluZm8gPSB0aGlzLmdldFByb2dyZXNzSW5mbygpO1xuICAgICAgaWYgKHRoaXMucHJvZ3Jlc3NCYXJUeXBlID09PSBcInJlcXVpcmVkUXVlc3Rpb25zXCIpIHtcbiAgICAgICAgcmV0dXJuIGluZm8ucmVxdWlyZWRRdWVzdGlvbkNvdW50ID4gMVxuICAgICAgICAgID8gTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAoaW5mby5yZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudCAqIDEwMCkgL1xuICAgICAgICAgICAgICAgIGluZm8ucmVxdWlyZWRRdWVzdGlvbkNvdW50XG4gICAgICAgICAgICApXG4gICAgICAgICAgOiAxMDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5mby5xdWVzdGlvbkNvdW50ID4gMVxuICAgICAgICA/IE1hdGguY2VpbCgoaW5mby5hbnN3ZXJlZFF1ZXN0aW9uQ291bnQgKiAxMDApIC8gaW5mby5xdWVzdGlvbkNvdW50KVxuICAgICAgICA6IDEwMDtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSArIDE7XG4gICAgcmV0dXJuIE1hdGguY2VpbCgoaW5kZXggKiAxMDApIC8gdGhpcy52aXNpYmxlUGFnZUNvdW50KTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJvZ3Jlc3MgdGhhdCBhIHVzZXIgbWFkZSB3aGlsZSBnb2luZyB0aHJvdWdoIHRoZSBzdXJ2ZXkuXG4gICAqIEl0IGRlcGVuZHMgZnJvbSBwcm9ncmVzc0JhclR5cGUgcHJvcGVydHlcbiAgICogQHNlZSBwcm9ncmVzc0JhclR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvZ3Jlc3NWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwcm9ncmVzc1ZhbHVlXCIsIDApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBuYXZpZ2F0aW9uIGJ1dHRvbnMgKGkuZS4sICdQcmV2JywgJ05leHQnLCBvciAnQ29tcGxldGUnIGFuZCAnUHJldmlldycpIHBvc2l0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIFwibm9uZVwiO1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAoIXBhZ2UpIHJldHVybiBcIm5vbmVcIjtcbiAgICBpZiAocGFnZS5uYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkgPT09IFwic2hvd1wiKSB7XG4gICAgICByZXR1cm4gXCJib3R0b21cIjtcbiAgICB9XG4gICAgaWYgKHBhZ2UubmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5ID09PSBcImhpZGVcIikge1xuICAgICAgcmV0dXJuIFwibm9uZVwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaG93TmF2aWdhdGlvbkJ1dHRvbnM7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmF2aWdhdGlvbiBidXR0b25zIChpLmUuLCAnUHJldicsICdOZXh0Jywgb3IgJ0NvbXBsZXRlJyBhbmQgJ1ByZXZpZXcnKSBhcmUgc2hvd3Mgb24gdG9wLlxuICAgKi9cbiAgcHVibGljIGdldCBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZ09uVG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldElzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nT24oXCJ0b3BcIik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmF2aWdhdGlvbiBidXR0b25zIChpLmUuLCAnUHJldicsICdOZXh0Jywgb3IgJ0NvbXBsZXRlJyBhbmQgJ1ByZXZpZXcnKSBhcmUgc2hvd3Mgb24gYm90dG9tLlxuICAgKi9cbiAgcHVibGljIGdldCBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZ09uQm90dG9tKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldElzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nT24oXCJib3R0b21cIik7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJc05hdmlnYXRpb25CdXR0b25zU2hvd2luZ09uKGJ1dHRvblBvc2l0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gdGhpcy5pc05hdmlnYXRpb25CdXR0b25zU2hvd2luZztcbiAgICByZXR1cm4gcmVzID09IFwiYm90aFwiIHx8IHJlcyA9PSBidXR0b25Qb3NpdGlvbjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN1cnZleSBpcyBpbiBlZGl0IG1vZGUuXG4gICAqIEBzZWUgbW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0VkaXRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gXCJlZGl0XCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0NvbXBsZXRlQnV0dG9uVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc0VkaXRNb2RlICYmXG4gICAgICAoIXRoaXMuaXNTaG93UHJldmlld0JlZm9yZUNvbXBsZXRlIHx8IHRoaXMuc3RhdGUgPT0gXCJwcmV2aWV3XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUHJldmlld0J1dHRvblZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNFZGl0TW9kZSAmJlxuICAgICAgdGhpcy5pc1Nob3dQcmV2aWV3QmVmb3JlQ29tcGxldGUgJiZcbiAgICAgIHRoaXMuc3RhdGUgPT0gXCJydW5uaW5nXCJcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDYW5jZWxQcmV2aWV3QnV0dG9uVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc0VkaXRNb2RlICYmXG4gICAgICB0aGlzLmlzU2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZSAmJlxuICAgICAgdGhpcy5zdGF0ZSA9PSBcInByZXZpZXdcIlxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzdXJ2ZXkgaXMgaW4gZGlzcGxheSBtb2RlIG9yIGluIHByZXZpZXcgbW9kZS5cbiAgICogQHNlZSBtb2RlXG4gICAqIEBzZWUgc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0Rpc3BsYXlNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gXCJkaXNwbGF5XCIgfHwgdGhpcy5zdGF0ZSA9PSBcInByZXZpZXdcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVXBkYXRlVmFsdWVUZXh0T25UeXBpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFVwZGF0ZU1vZGUgPT0gXCJvblR5cGluZ1wiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3VydmV5IGlzIGluIGRlc2lnbiBtb2RlLiBJdCBpcyB1c2VkIGJ5IFN1cnZleUpTIEVkaXRvci5cbiAgICogQHNlZSBzZXREZXNpZ25Nb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRGVzaWduTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNEZXNpZ25Nb2RlO1xuICB9XG4gIHByaXZhdGUgX2lzRGVzaWduTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0cyB0aGUgc3VydmV5IGludG8gZGVzaWduIG1vZGUuXG4gICAqIEBwYXJhbSB2YWx1ZSB1c2UgdHJ1ZSB0byBzZXQgdGhlIHN1cnZleSBpbnRvIHRoZSBkZXNpZ24gbW9kZS5cbiAgICovXG4gIHB1YmxpYyBzZXREZXNpZ25Nb2RlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEZXNpZ25Nb2RlID0gdmFsdWU7XG4gICAgdGhpcy5vblF1ZXN0aW9uc09uUGFnZU1vZGVDaGFuZ2VkKFwic3RhbmRhcmRcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRvIHNob3cgYWxsIGVsZW1lbnRzIGluIHRoZSBzdXJ2ZXksIHJlZ2FyZGxlc3MgdGhlaXIgdmlzaWJpbGl0eS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd0ludmlzaWJsZUVsZW1lbnRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93SW52aXNpYmxlRWxlbWVudHNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0ludmlzaWJsZUVsZW1lbnRzKHZhbDogYm9vbGVhbikge1xuICAgIHZhciB2aXNQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dJbnZpc2libGVFbGVtZW50c1wiLCB2YWwpO1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gICAgdGhpcy51cGRhdGVBbGxFbGVtZW50c1Zpc2liaWxpdHkodmlzUGFnZXMpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQWxsRWxlbWVudHNWaXNpYmlsaXR5KHZpc1BhZ2VzOiBBcnJheTxQYWdlTW9kZWw+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICBwYWdlLnVwZGF0ZUVsZW1lbnRWaXNpYmlsaXR5KCk7XG4gICAgICBpZiAodmlzUGFnZXMuaW5kZXhPZihwYWdlKSA+IC0xICE9IHBhZ2UuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMub25QYWdlVmlzaWJsZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICB2aXNpYmxlOiBwYWdlLmlzVmlzaWJsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRGVzaWduTW9kZSB8fCB0aGlzLnNob3dJbnZpc2libGVFbGVtZW50cztcbiAgfVxuICBwdWJsaWMgZ2V0IGFyZUVtcHR5RWxlbWVudHNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNTaG93aW5nUHJldmlldyAmJlxuICAgICAgdGhpcy5zaG93UHJldmlld0JlZm9yZUNvbXBsZXRlID09IFwic2hvd0Fuc3dlcmVkUXVlc3Rpb25zXCJcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCwgaWYgYSB1c2VyIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgc3VydmV5IGluIHRoaXMgYnJvd3NlciBhbmQgdGhlcmUgaXMgYSBjb29raWUgYWJvdXQgaXQuIFN1cnZleSBnb2VzIHRvIGBjb21wbGV0ZWRgIHN0YXRlIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYC5cbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqIEBzZWUgc2V0Q29va2llXG4gICAqIEBzZWUgZGVsZXRlQ29va2llXG4gICAqIEBzZWUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzQ29va2llKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jb29raWVOYW1lIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llO1xuICAgIHJldHVybiBjb29raWVzICYmIGNvb2tpZXMuaW5kZXhPZih0aGlzLmNvb2tpZU5hbWUgKyBcIj10cnVlXCIpID4gLTE7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgY29va2llIHdpdGggYGNvb2tpZU5hbWVgIGluIHVzZXIncyBicm93c2VyLiBJdCBpcyBkb25lIGF1dG9tYXRpY2FsbHkgb24gc3VydmV5IGNvbXBsZXRlIGlmIHRoZSBgY29va2llTmFtZWAgcHJvcGVydHkgdmFsdWUgaXMgbm90IGVtcHR5LlxuICAgKiBAc2VlIGNvb2tpZU5hbWVcbiAgICogQHNlZSBoYXNDb29raWVcbiAgICogQHNlZSBkZWxldGVDb29raWVcbiAgICovXG4gIHB1YmxpYyBzZXRDb29raWUoKSB7XG4gICAgaWYgKCF0aGlzLmNvb2tpZU5hbWUgfHwgdHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgZG9jdW1lbnQuY29va2llID1cbiAgICAgIHRoaXMuY29va2llTmFtZSArIFwiPXRydWU7IGV4cGlyZXM9RnJpLCAzMSBEZWMgOTk5OSAwOjA6MCBHTVRcIjtcbiAgfVxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgY29va2llIHdpdGggYGNvb2tpZU5hbWVgIGZyb20gdGhlIGJyb3dzZXIuXG4gICAqIEBzZWUgY29va2llTmFtZVxuICAgKiBAc2VlIGhhc0Nvb2tpZVxuICAgKiBAc2VlIHNldENvb2tpZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUNvb2tpZSgpIHtcbiAgICBpZiAoIXRoaXMuY29va2llTmFtZSkgcmV0dXJuO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IHRoaXMuY29va2llTmFtZSArIFwiPTtcIjtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdGhlIHN1cnZleSBtdXN0IGlnbm9yZSB2YWxpZGF0aW9uIGxpa2UgcmVxdWlyZWQgcXVlc3Rpb25zIGFuZCBvdGhlcnMsIG9uIGBuZXh0UGFnZWAgYW5kIGBjb21wbGV0ZUxhc3RQYWdlYCBmdW5jdGlvbiBjYWxscy4gVGhlIGRlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICogQHNlZSBuZXh0UGFnZVxuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICogQHNlZSBtb2RlXG4gICAqL1xuICBwdWJsaWMgaWdub3JlVmFsaWRhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogTmF2aWdhdGVzIHVzZXIgdG8gdGhlIG5leHQgcGFnZS5cbiAgICpcbiAgICogUmV0dXJucyBgZmFsc2VgIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gICAqXG4gICAqIC0gaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBwYWdlLlxuICAgKiAtIGlmIHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgZXJyb3JzIChmb3IgZXhhbXBsZSwgYSByZXF1aXJlZCBxdWVzdGlvbiBpcyBlbXB0eSkuXG4gICAqIEBzZWUgaXNDdXJyZW50UGFnZUhhc0Vycm9yc1xuICAgKiBAc2VlIHByZXZQYWdlXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKi9cbiAgcHVibGljIG5leHRQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzTGFzdFBhZ2UpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kb0N1cnJlbnRQYWdlQ29tcGxldGUoZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JzT25OYXZpZ2F0ZShkb0NvbXBsZXRlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaWdub3JlVmFsaWRhdGlvbiB8fCAhdGhpcy5pc0VkaXRNb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGZ1bmMgPSAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoIWhhc0Vycm9ycykge1xuICAgICAgICB0aGlzLmRvQ3VycmVudFBhZ2VDb21wbGV0ZUNvcmUoZG9Db21wbGV0ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodGhpcy5jaGVja0Vycm9yc01vZGUgPT09IFwib25Db21wbGV0ZVwiKSB7XG4gICAgICBpZiAoIXRoaXMuaXNMYXN0UGFnZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuaGFzRXJyb3JzKHRydWUsIHRydWUsIGZ1bmMpICE9PSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaGFzQ3VycmVudFBhZ2VFcnJvcnMoZnVuYykgIT09IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgYXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zOiBBcnJheTxRdWVzdGlvbj47XG4gIHByaXZhdGUgY2hlY2tGb3JBc3luY1F1ZXN0aW9uVmFsaWRhdGlvbihcbiAgICBxdWVzdGlvbnM6IEFycmF5PFF1ZXN0aW9uPixcbiAgICBmdW5jOiAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB2b2lkXG4gICk6IGJvb2xlYW4ge1xuICAgIHRoaXMuY2xlYXJBc3luY1ZhbGlkYXRpb25RdWVzaXRvbnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHF1ZXN0aW9uc1tpXS5pc1J1bm5pbmdWYWxpZGF0b3JzKSB7XG4gICAgICAgIHF1ZXN0aW9uc1tpXS5vbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycyA9IChoYXNFcnJvcnM6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICB0aGlzLm9uQ29tcGxldGVkQXN5bmNRdWVzdGlvblZhbGlkYXRvcnMoZnVuYywgaGFzRXJyb3JzKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hc3luY1ZhbGlkYXRpb25RdWVzaXRvbnMucHVzaChxdWVzdGlvbnNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3luY1ZhbGlkYXRpb25RdWVzaXRvbnMubGVuZ3RoID4gMDtcbiAgfVxuICBwcml2YXRlIGNsZWFyQXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zKCkge1xuICAgIGlmICghIXRoaXMuYXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zKSB7XG4gICAgICB2YXIgYXN5blF1ZXN0aW9ucyA9IHRoaXMuYXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhc3luUXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFzeW5RdWVzdGlvbnNbaV0ub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucyA9IFtdO1xuICB9XG4gIHByaXZhdGUgb25Db21wbGV0ZWRBc3luY1F1ZXN0aW9uVmFsaWRhdG9ycyhcbiAgICBmdW5jOiAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB2b2lkLFxuICAgIGhhc0Vycm9yczogYm9vbGVhblxuICApIHtcbiAgICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgICB0aGlzLmNsZWFyQXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zKCk7XG4gICAgICBmdW5jKHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgYXN5blF1ZXN0aW9ucyA9IHRoaXMuYXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN5blF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFzeW5RdWVzdGlvbnNbaV0uaXNSdW5uaW5nVmFsaWRhdG9ycykgcmV0dXJuO1xuICAgIH1cbiAgICBmdW5jKGZhbHNlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAsIGlmIHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgZXJyb3JzLCBmb3IgZXhhbXBsZSwgdGhlIHJlcXVpcmVkIHF1ZXN0aW9uIGlzIGVtcHR5IG9yIGEgcXVlc3Rpb24gdmFsaWRhdGlvbiBpcyBmYWlsZWQuXG4gICAqIEBzZWUgbmV4dFBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNDdXJyZW50UGFnZUhhc0Vycm9ycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0lzQ3VycmVudFBhZ2VIYXNFcnJvcnMoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAsIGlmIHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgYW55IGVycm9yLiBJZiB0aGVyZSBpcyBhbiBhc3luYyBmdW5jdGlvbiBpbiBhbiBleHByZXNzaW9uLCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBgdW5kZWZpbmVkYCB2YWx1ZS5cbiAgICogSW4gdGhpcyBjYXNlLCB5b3Ugc2hvdWxkIHVzZSBgb25Bc3luY1ZhbGlkYXRpb25gIHBhcmFtZXRlciwgd2hpY2ggaXMgYSBjYWxsYmFjayBmdW5jdGlvbjogKGhhc0Vycm9yczogYm9vbGVhbikgPT4gdm9pZFxuICAgKiBAcGFyYW0gb25Bc3luY1ZhbGlkYXRpb24gdXNlIHRoaXMgcGFyYW1ldGVyIGlmIHlvdSB1c2UgYXN5bmMgZnVuY3Rpb25zIGluIHlvdXIgZXhwcmVzc2lvbnMuIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCBoYXNFcnJvcnMgdmFsdWUgZXF1YWxzIHRvIGB0cnVlYCBvciBgZmFsc2VgLlxuICAgKiBAc2VlIGhhc1BhZ2VFcnJvcnNcbiAgICogQHNlZSBoYXNFcnJvcnNcbiAgICogQHNlZSBjdXJyZW50UGFnZVxuICAgKi9cbiAgcHVibGljIGhhc0N1cnJlbnRQYWdlRXJyb3JzKFxuICAgIG9uQXN5bmNWYWxpZGF0aW9uPzogKGhhc0Vycm9yczogYm9vbGVhbikgPT4gdm9pZFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNQYWdlRXJyb3JzKHVuZGVmaW5lZCwgb25Bc3luY1ZhbGlkYXRpb24pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCwgaWYgYSBwYWdlIGNvbnRhaW5zIGFuIGVycm9yLiBJZiB0aGVyZSBpcyBhbiBhc3luYyBmdW5jdGlvbiBpbiBhbiBleHByZXNzaW9uLCB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBgdW5kZWZpbmVkYCB2YWx1ZS5cbiAgICogSW4gdGhpcyBjYXNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgc2Vjb25kIGBvbkFzeW5jVmFsaWRhdGlvbmAgcGFyYW1ldGVyLCAgd2hpY2ggaXMgYSBjYWxsYmFjayBmdW5jdGlvbjogKGhhc0Vycm9yczogYm9vbGVhbikgPT4gdm9pZFxuICAgKiBAcGFyYW0gcGFnZSB0aGUgcGFnZSB0aGF0IHlvdSB3YW50IHRvIHZhbGlkYXRlLiBJZiB0aGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCB0aGVuIHRoZSBgYWN0aXZlUGFnZWAgaXMgdXNpbmdcbiAgICogQHBhcmFtIG9uQXN5bmNWYWxpZGF0aW9uIHVzZSB0aGlzIHBhcmFtZXRlciBpZiB5b3UgdXNlIGFzeW5jIGZ1bmN0aW9ucyBpbiB5b3VyIGV4cHJlc3Npb25zLiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggaGFzRXJyb3JzIHZhbHVlIGVxdWFscyB0byBgdHJ1ZWAgb3IgYGZhbHNlYC5cbiAgICogQHNlZSBoYXNDdXJyZW50UGFnZUVycm9yc1xuICAgKiBAc2VlIGhhc0Vycm9yc1xuICAgKiBAc2VlIGFjdGl2ZVBhZ2VcbiAgICogQHNlZSBjdXJyZW50UGFnZVxuICAgKi9cbiAgcHVibGljIGhhc1BhZ2VFcnJvcnMoXG4gICAgcGFnZT86IFBhZ2VNb2RlbCxcbiAgICBvbkFzeW5jVmFsaWRhdGlvbj86IChoYXNFcnJvcnM6IGJvb2xlYW4pID0+IHZvaWRcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFwYWdlKSB7XG4gICAgICBwYWdlID0gdGhpcy5hY3RpdmVQYWdlO1xuICAgIH1cbiAgICBpZiAoIXBhZ2UpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5jaGVja0lzUGFnZUhhc0Vycm9ycyhwYWdlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFvbkFzeW5jVmFsaWRhdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmNoZWNrRm9yQXN5bmNRdWVzdGlvblZhbGlkYXRpb24oXG4gICAgICBwYWdlLnF1ZXN0aW9ucyxcbiAgICAgIChoYXNFcnJvcnM6IGJvb2xlYW4pID0+IG9uQXN5bmNWYWxpZGF0aW9uKGhhc0Vycm9ycylcbiAgICApXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAsIGlmIGFueSBvZiB0aGUgc3VydmV5IHBhZ2VzIGNvbnRhaW5zIGVycm9ycy4gSWYgdGhlcmUgaXMgYW4gYXN5bmMgZnVuY3Rpb24gaW4gYW4gZXhwcmVzc2lvbiwgdGhlbiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAgdmFsdWUuXG4gICAqIEluIHRoaXMgY2FzZSwgeW91IHNob3VsZCB1c2UgIHRoZSB0aGlyZCBgb25Bc3luY1ZhbGlkYXRpb25gIHBhcmFtZXRlciwgd2hpY2ggaXMgYSBjYWxsYmFjayBmdW5jdGlvbjogKGhhc0Vycm9yczogYm9vbGVhbikgPT4gdm9pZFxuICAgKiBAcGFyYW0gZmlyZUNhbGxiYWNrIHNldCBpdCB0byBgdHJ1ZWAsIHRvIHNob3cgZXJyb3JzIGluIFVJLlxuICAgKiBAcGFyYW0gZm9jdXNPbkZpcnN0RXJyb3Igc2V0IGl0IHRvIGB0cnVlYCB0byBmb2N1cyBvbiB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBkb2Vzbid0IHBhc3MgdGhlIHZhbGlkYXRpb24gYW5kIG1ha2UgdGhlIHBhZ2UsIHdoZXJlIHRoZSBxdWVzdGlvbiBpcyBsb2NhdGVkLCB0aGUgY3VycmVudC5cbiAgICogQHBhcmFtIG9uQXN5bmNWYWxpZGF0aW9uIHVzZSB0aGlzIHBhcmFtZXRlciBpZiB5b3UgdXNlIGFzeW5jIGZ1bmN0aW9ucyBpbiB5b3VyIGV4cHJlc3Npb25zLiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggaGFzRXJyb3JzIHZhbHVlIGVxdWFscyB0byBgdHJ1ZWAgb3IgYGZhbHNlYC5cbiAgICogQHNlZSBoYXNDdXJyZW50UGFnZUVycm9yc1xuICAgKiBAc2VlIGhhc1BhZ2VFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSxcbiAgICBmb2N1c09uRmlyc3RFcnJvcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIG9uQXN5bmNWYWxpZGF0aW9uPzogKGhhc0Vycm9yczogYm9vbGVhbikgPT4gdm9pZFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoISFvbkFzeW5jVmFsaWRhdGlvbikge1xuICAgICAgZmlyZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIHZpc1BhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgdmFyIGZpcnN0RXJyb3JQYWdlID0gbnVsbDtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZpc1BhZ2VzW2ldLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIGZhbHNlKSkge1xuICAgICAgICBpZiAoIWZpcnN0RXJyb3JQYWdlKSBmaXJzdEVycm9yUGFnZSA9IHZpc1BhZ2VzW2ldO1xuICAgICAgICByZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm9jdXNPbkZpcnN0RXJyb3IgJiYgISFmaXJzdEVycm9yUGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IGZpcnN0RXJyb3JQYWdlO1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IGZpcnN0RXJyb3JQYWdlLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChxdWVzdGlvbnNbaV0uZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBxdWVzdGlvbnNbaV0uZm9jdXModHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlcyB8fCAhb25Bc3luY1ZhbGlkYXRpb24pIHJldHVybiByZXM7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tGb3JBc3luY1F1ZXN0aW9uVmFsaWRhdGlvbihcbiAgICAgIHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCksXG4gICAgICAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiBvbkFzeW5jVmFsaWRhdGlvbihoYXNFcnJvcnMpXG4gICAgKVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHN1cnZleSBlbGVtZW50cyAocGFnZXMsIHBhbmVscywgYW5kIHF1ZXN0aW9ucykgaGF2ZSB1bmlxdWUgcXVlc3Rpb24gbmFtZXMuXG4gICAqIFlvdSBjYW4gY2hlY2sgZm9yIHVuaXF1ZSBuYW1lcyBmb3IgaW5kaXZpZHVhbCBwYWdlIGFuZCBwYW5lbCAoYW5kIGFsbCB0aGVpciBlbGVtZW50cykgb3IgYSBxdWVzdGlvbi5cbiAgICogSWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGEgc3VydmV5IGNoZWNrcyB0aGF0IGFsbCBpdHMgZWxlbWVudHMgaGF2ZSB1bmlxdWUgbmFtZXMuXG4gICAqIEBwYXJhbSBlbGVtZW50IHBhZ2UsIHBhbmVsIG9yIHF1ZXN0aW9uLCBpdCBpcyBgbnVsbGAgYnkgZGVmYXVsdCwgdGhhdCBtZWFucyBhbGwgc3VydmV5IGVsZW1lbnRzIHdpbGwgYmUgY2hlY2tlZFxuICAgKi9cbiAgcHVibGljIGVuc3VyZVVuaXF1ZU5hbWVzKGVsZW1lbnQ6IElTdXJ2ZXlFbGVtZW50ID0gbnVsbCkge1xuICAgIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmVuc3VyZVVuaXF1ZU5hbWUodGhpcy5wYWdlc1tpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5zdXJlVW5pcXVlTmFtZShlbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVVbmlxdWVOYW1lKGVsZW1lbnQ6IElTdXJ2ZXlFbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQuaXNQYWdlKSB7XG4gICAgICB0aGlzLmVuc3VyZVVuaXF1ZVBhZ2VOYW1lKGVsZW1lbnQpO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICB0aGlzLmVuc3VyZVVuaXF1ZVBhbmVsTmFtZShlbGVtZW50KTtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQuaXNQYWdlIHx8IGVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgdmFyIGVsZW1lbnRzID0gKDxJUGFuZWw+ZWxlbWVudCkuZWxlbWVudHM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlVW5pcXVlTmFtZXMoZWxlbWVudHNbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuc3VyZVVuaXF1ZVF1ZXN0aW9uTmFtZShlbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVVbmlxdWVQYWdlTmFtZShlbGVtZW50OiBJU3VydmV5RWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLmVuc3VyZVVuaXF1ZUVsZW1lbnROYW1lKFxuICAgICAgZWxlbWVudCxcbiAgICAgIChuYW1lOiBzdHJpbmcpOiBJU3VydmV5RWxlbWVudCA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhZ2VCeU5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGVuc3VyZVVuaXF1ZVBhbmVsTmFtZShlbGVtZW50OiBJU3VydmV5RWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLmVuc3VyZVVuaXF1ZUVsZW1lbnROYW1lKFxuICAgICAgZWxlbWVudCxcbiAgICAgIChuYW1lOiBzdHJpbmcpOiBJU3VydmV5RWxlbWVudCA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhbmVsQnlOYW1lKG5hbWUpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVVbmlxdWVRdWVzdGlvbk5hbWUoZWxlbWVudDogSVN1cnZleUVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5lbnN1cmVVbmlxdWVFbGVtZW50TmFtZShcbiAgICAgIGVsZW1lbnQsXG4gICAgICAobmFtZTogc3RyaW5nKTogSVN1cnZleUVsZW1lbnQgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByaXZhdGUgZW5zdXJlVW5pcXVlRWxlbWVudE5hbWUoXG4gICAgZWxlbWVudDogSVN1cnZleUVsZW1lbnQsXG4gICAgZ2V0RWxlbWVudEJ5TmFtZTogKG5hbWU6IHN0cmluZykgPT4gSVN1cnZleUVsZW1lbnRcbiAgKSB7XG4gICAgdmFyIGV4aXN0aW5nRWxlbWVudCA9IGdldEVsZW1lbnRCeU5hbWUoZWxlbWVudC5uYW1lKTtcbiAgICBpZiAoIWV4aXN0aW5nRWxlbWVudCB8fCBleGlzdGluZ0VsZW1lbnQgPT0gZWxlbWVudCkgcmV0dXJuO1xuICAgIHZhciBuZXdOYW1lID0gdGhpcy5nZXROZXdOYW1lKGVsZW1lbnQubmFtZSk7XG4gICAgd2hpbGUgKCEhZ2V0RWxlbWVudEJ5TmFtZShuZXdOYW1lKSkge1xuICAgICAgdmFyIG5ld05hbWUgPSB0aGlzLmdldE5ld05hbWUoZWxlbWVudC5uYW1lKTtcbiAgICB9XG4gICAgZWxlbWVudC5uYW1lID0gbmV3TmFtZTtcbiAgfVxuICBwcml2YXRlIGdldE5ld05hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcG9zID0gbmFtZS5sZW5ndGg7XG4gICAgd2hpbGUgKHBvcyA+IDAgJiYgbmFtZVtwb3MgLSAxXSA+PSBcIjBcIiAmJiBuYW1lW3BvcyAtIDFdIDw9IFwiOVwiKSB7XG4gICAgICBwb3MtLTtcbiAgICB9XG4gICAgdmFyIGJhc2UgPSBuYW1lLnN1YnN0cigwLCBwb3MpO1xuICAgIHZhciBudW0gPSAwO1xuICAgIGlmIChwb3MgPCBuYW1lLmxlbmd0aCkge1xuICAgICAgbnVtID0gcGFyc2VJbnQobmFtZS5zdWJzdHIocG9zKSk7XG4gICAgfVxuICAgIG51bSsrO1xuICAgIHJldHVybiBiYXNlICsgbnVtO1xuICB9XG4gIHByaXZhdGUgY2hlY2tJc0N1cnJlbnRQYWdlSGFzRXJyb3JzKFxuICAgIGlzRm9jdXNlT25GaXJzdEVycm9yOiBib29sZWFuID0gdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrSXNQYWdlSGFzRXJyb3JzKHRoaXMuYWN0aXZlUGFnZSwgaXNGb2N1c2VPbkZpcnN0RXJyb3IpO1xuICB9XG4gIHByaXZhdGUgY2hlY2tJc1BhZ2VIYXNFcnJvcnMoXG4gICAgcGFnZTogUGFnZU1vZGVsLFxuICAgIGlzRm9jdXNlT25GaXJzdEVycm9yOiBib29sZWFuID0gdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0ZvY3VzZU9uRmlyc3RFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpc0ZvY3VzZU9uRmlyc3RFcnJvciA9IHRoaXMuZm9jdXNPbkZpcnN0RXJyb3I7XG4gICAgfVxuICAgIGlmICghcGFnZSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIHJlcyA9IHBhZ2UuaGFzRXJyb3JzKHRydWUsIGlzRm9jdXNlT25GaXJzdEVycm9yKTtcbiAgICB0aGlzLmZpcmVWYWxpZGF0ZWRFcnJvcnNPblBhZ2UocGFnZSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGZpcmVWYWxpZGF0ZWRFcnJvcnNPblBhZ2UocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgaWYgKHRoaXMub25WYWxpZGF0ZWRFcnJvcnNPbkN1cnJlbnRQYWdlLmlzRW1wdHkgfHwgIXBhZ2UpIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zT25QYWdlID0gcGFnZS5xdWVzdGlvbnM7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IG5ldyBBcnJheTxRdWVzdGlvbj4oKTtcbiAgICB2YXIgZXJyb3JzID0gbmV3IEFycmF5PFN1cnZleUVycm9yPigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zT25QYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHF1ZXN0aW9uc09uUGFnZVtpXTtcbiAgICAgIGlmIChxLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHF1ZXN0aW9ucy5wdXNoKHEpO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHEuZXJyb3JzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2gocS5lcnJvcnNbal0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25WYWxpZGF0ZWRFcnJvcnNPbkN1cnJlbnRQYWdlLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb25zOiBxdWVzdGlvbnMsXG4gICAgICBlcnJvcnM6IGVycm9ycyxcbiAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB1c2VyIHRvIGEgcHJldmlvdXMgcGFnZS4gSWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3QgcGFnZSwgYHByZXZQYWdlYCByZXR1cm5zIGBmYWxzZWAuIGBwcmV2UGFnZWAgZG9lcyBub3QgcGVyZm9ybSBhbnkgY2hlY2tzLCByZXF1aXJlZCBxdWVzdGlvbnMgY2FuIGJlIGVtcHR5LlxuICAgKiBAc2VlIGlzRmlyc3RQYWdlXG4gICAqL1xuICBwdWJsaWMgcHJldlBhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdFBhZ2UpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnJlc2V0TmF2aWdhdGlvbkJ1dHRvbigpO1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICB2YXIgaW5kZXggPSB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdlBhZ2VzW2luZGV4IC0gMV07XG4gIH1cbiAgLyoqXG4gICAqIENvbXBsZXRlcyB0aGUgc3VydmV5LCBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBsYXN0IG9uZS4gSXQgcmV0dXJucyBgZmFsc2VgIGlmIHRoZSBsYXN0IHBhZ2UgaGFzIGVycm9ycy5cbiAgICogSWYgdGhlIGxhc3QgcGFnZSBoYXMgbm8gZXJyb3JzLCBgY29tcGxldGVMYXN0UGFnZWAgY2FsbHMgYGRvQ29tcGxldGVgIGFuZCByZXR1cm5zIGB0cnVlYC5cbiAgICogQHNlZSBpc0N1cnJlbnRQYWdlSGFzRXJyb3JzXG4gICAqIEBzZWUgbmV4dFBhZ2VcbiAgICogQHNlZSBkb0NvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgY29tcGxldGVMYXN0UGFnZSgpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gdGhpcy5kb0N1cnJlbnRQYWdlQ29tcGxldGUodHJ1ZSk7XG4gICAgaWYgKHJlcykge1xuICAgICAgdGhpcy5jYW5jZWxQcmV2aWV3KCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBpc05hdmlnYXRpb25CdXR0b25QcmVzc2VkOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBuYXZpZ2F0aW9uTW91c2VEb3duKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuaXNOYXZpZ2F0aW9uQnV0dG9uUHJlc3NlZCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSByZXNldE5hdmlnYXRpb25CdXR0b24oKSB7XG4gICAgdGhpcy5pc05hdmlnYXRpb25CdXR0b25QcmVzc2VkID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFNob3dzIHByZXZpZXcgZm9yIHRoZSBzdXJ2ZXkuIFN3aXRjaGVzIHRoZSBzdXJ2ZXkgdG8gdGhlIFwicHJldmlld1wiIHN0YXRlLlxuICAgKlxuICAgKiBEZXRhaWxzOiBbUHJldmlldyBTdGF0ZV0oaHR0cHM6Ly9zdXJ2ZXlqcy5pby9Eb2N1bWVudGF0aW9uL0xpYnJhcnkjc3RhdGVzLXByZXZpZXcpXG4gICAqIEBzZWUgc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZVxuICAgKiBAc2VlIGNhbmNlbFByZXZpZXdcbiAgICogQHNlZSBzdGF0ZVxuICAgKiBAc2VlIHByZXZpZXdUZXh0XG4gICAqIEBzZWUgZWRpdFRleHRcbiAgICovXG4gIHB1YmxpYyBzaG93UHJldmlldygpOiBib29sZWFuIHtcbiAgICB0aGlzLnJlc2V0TmF2aWdhdGlvbkJ1dHRvbigpO1xuICAgIGlmICh0aGlzLmhhc0Vycm9yc09uTmF2aWdhdGUodHJ1ZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5kb1NlcnZlclZhbGlkYXRpb24odHJ1ZSwgdHJ1ZSkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgYWxsb3dTaG93UHJldmlldzogdHJ1ZSB9O1xuICAgIHRoaXMub25TaG93aW5nUHJldmlldy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHRoaXMuaXNTaG93aW5nUHJldmlldyA9IG9wdGlvbnMuYWxsb3dTaG93UHJldmlldztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogQ2FuY2VscyBwcmV2aWV3IGFuZCBzd2l0Y2hlcyBiYWNrIHRvIHRoZSBcInJ1bm5pbmdcIiBzdGF0ZS5cbiAgICpcbiAgICogRGV0YWlsczogW1ByZXZpZXcgU3RhdGVdKGh0dHBzOi8vc3VydmV5anMuaW8vRG9jdW1lbnRhdGlvbi9MaWJyYXJ5I3N0YXRlcy1wcmV2aWV3KVxuICAgKiBAcGFyYW0gY3VyUGFnZSAtIEEgbmV3IGN1cnJlbnQgcGFnZS4gSWYgdGhlIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgdGhlbiB0aGUgbGFzdCBwYWdlIGJlY29tZXMgdGhlIGN1cnJlbnQuXG4gICAqIEBzZWUgc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZVxuICAgKiBAc2VlIHNob3dQcmV2aWV3XG4gICAqIEBzZWUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBjYW5jZWxQcmV2aWV3KGN1clBhZ2U6IGFueSA9IG51bGwpIHtcbiAgICBpZiAoIXRoaXMuaXNTaG93aW5nUHJldmlldykgcmV0dXJuO1xuICAgIHRoaXMuaXNTaG93aW5nUHJldmlldyA9IGZhbHNlO1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShjdXJQYWdlKSAmJiB0aGlzLnZpc2libGVQYWdlQ291bnQgPiAwKSB7XG4gICAgICBjdXJQYWdlID0gdGhpcy52aXNpYmxlUGFnZUNvdW50IC0gMTtcbiAgICB9XG4gICAgaWYgKGN1clBhZ2UgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBjdXJQYWdlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2FuY2VsUHJldmlld0J5UGFnZShwYW5lbDogSVBhbmVsKTogYW55IHtcbiAgICB0aGlzLmNhbmNlbFByZXZpZXcoKDxhbnk+cGFuZWwpW1wib3JpZ2luYWxQYWdlXCJdKTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9DdXJyZW50UGFnZUNvbXBsZXRlKGRvQ29tcGxldGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkYXRpbmdPblNlcnZlcikgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMucmVzZXROYXZpZ2F0aW9uQnV0dG9uKCk7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3JzT25OYXZpZ2F0ZShkb0NvbXBsZXRlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmRvQ3VycmVudFBhZ2VDb21wbGV0ZUNvcmUoZG9Db21wbGV0ZSk7XG4gIH1cbiAgcHJpdmF0ZSBkb0N1cnJlbnRQYWdlQ29tcGxldGVDb3JlKGRvQ29tcGxldGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kb1NlcnZlclZhbGlkYXRpb24oZG9Db21wbGV0ZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZG9Db21wbGV0ZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZS5wYXNzZWQgPSB0cnVlO1xuICAgICAgdGhpcy5kb0NvbXBsZXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9OZXh0UGFnZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogT2Jzb2xldGUuIFVzZSB0aGUgYHF1ZXN0aW9uc09uUGFnZU1vZGVgIHByb3BlcnR5IGluc3RlYWQuXG4gICAqIEBzZWUgcXVlc3Rpb25zT25QYWdlTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBpc1NpbmdsZVBhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25zT25QYWdlTW9kZSA9PSBcInNpbmdsZVBhZ2VcIjtcbiAgfVxuICBwdWJsaWMgc2V0IGlzU2luZ2xlUGFnZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnF1ZXN0aW9uc09uUGFnZU1vZGUgPSB2YWwgPyBcInNpbmdsZVBhZ2VcIiA6IFwic3RhbmRhcmRcIjtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgdGhhdCBzcGVjaWZpZXMgaG93IHRoZSBzdXJ2ZXkgY29tYmluZXMgcXVlc3Rpb25zLCBwYW5lbHMsIGFuZCBwYWdlcy5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYHNpbmdsZVBhZ2VgIC0gY29tYmluZSBhbGwgc3VydmV5IHBhZ2VzIGluIGEgc2luZ2xlIHBhZ2UuIFBhZ2VzIHdpbGwgYmUgY29udmVydGVkIHRvIHBhbmVscy5cbiAgICogLSBgcXVlc3Rpb25QZXJQYWdlYCAtIHNob3cgb25lIHF1ZXN0aW9uIHBlciBwYWdlLiBTdXJ2ZXkgd2lsbCBjcmVhdGUgYSBzZXBhcmF0ZSBwYWdlIGZvciBldmVyeSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zT25QYWdlTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbnNPblBhZ2VNb2RlXCIsIFwic3RhbmRhcmRcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbnNPblBhZ2VNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT25QYWdlTW9kZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0aGUgZmlyc3Qgc3VydmV5IHBhZ2UgaXMgYSBzdGFydCBwYWdlLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBgdHJ1ZWAsIHRvIG1ha2UgdGhlIGZpcnN0IHBhZ2UgYSBzdGFydGluZyBwYWdlLlxuICAgKiBBbiBlbmQgdXNlciBjYW5ub3QgbmF2aWdhdGUgdG8gdGhlIHN0YXJ0IHBhZ2UgYW5kIHRoZSBzdGFydCBwYWdlIGRvZXMgbm90IGFmZmVjdCBhIHN1cnZleSBwcm9ncmVzcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZmlyc3RQYWdlSXNTdGFydGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmaXJzdFBhZ2VJc1N0YXJ0ZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZmlyc3RQYWdlSXNTdGFydGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImZpcnN0UGFnZUlzU3RhcnRlZFwiLCB2YWwpO1xuICB9XG4gIGlzUGFnZVN0YXJ0ZWQocGFnZTogSVBhZ2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgJiYgdGhpcy5wYWdlcy5sZW5ndGggPiAwICYmIHRoaXMucGFnZXNbMF0gPT09IHBhZ2VcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcInNob3dBbGxRdWVzdGlvbnNcIiBvciBcInNob3dBbnN3ZXJlZFF1ZXN0aW9uc1wiIHRvIGFsbG93IHJlc3BvbmRlbnRzIHRvIHByZXZpZXcgYW5zd2VycyBiZWZvcmUgc3VibWl0dGluZyB0aGUgc3VydmV5IHJlc3VsdHMuXG4gICAqXG4gICAqIERldGFpbHM6IFtQcmV2aWV3IFN0YXRlXShodHRwczovL3N1cnZleWpzLmlvL0RvY3VtZW50YXRpb24vTGlicmFyeSNzdGF0ZXMtcHJldmlldylcbiAgICogRXhhbXBsZTogW1Nob3cgUHJldmlldyBCZWZvcmUgQ29tcGxldGVdKGh0dHBzOi8vc3VydmV5anMuaW8vRXhhbXBsZXMvTGlicmFyeT9pZD1zdXJ2ZXktc2hvd3ByZXZpZXcpXG4gICAqIEBzZWUgc2hvd1ByZXZpZXdcbiAgICogQHNlZSBjYW5jZWxQcmV2aWV3XG4gICAqIEBzZWUgc3RhdGVcbiAgICogQHNlZSBwcmV2aWV3VGV4dFxuICAgKiBAc2VlIGVkaXRUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZVwiLCBcIm5vUHJldmlld1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc1Nob3dQcmV2aWV3QmVmb3JlQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgdmFyIHByZXZpZXcgPSB0aGlzLnNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGU7XG4gICAgcmV0dXJuIHByZXZpZXcgPT0gXCJzaG93QWxsUXVlc3Rpb25zXCIgfHwgcHJldmlldyA9PSBcInNob3dBbnN3ZXJlZFF1ZXN0aW9uc1wiO1xuICB9XG4gIHByb3RlY3RlZCBvbkZpcnN0UGFnZUlzU3RhcnRlZENoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMucGFnZXMubGVuZ3RoID09IDApIHJldHVybjtcbiAgICB0aGlzLmlzU3RhcnRlZFN0YXRlID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQ7XG4gICAgdGhpcy5wYWdlVmlzaWJpbGl0eUNoYW5nZWQodGhpcy5wYWdlc1swXSwgIXRoaXMuZmlyc3RQYWdlSXNTdGFydGVkKTtcbiAgfVxuICBwcml2YXRlIHJ1bm5pbmdQYWdlczogYW55O1xuICBwcml2YXRlIG9uU2hvd2luZ1ByZXZpZXdDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzU2hvd2luZ1ByZXZpZXcpIHtcbiAgICAgIHRoaXMucnVubmluZ1BhZ2VzID0gdGhpcy5wYWdlcy5zbGljZSgwLCB0aGlzLnBhZ2VzLmxlbmd0aCk7XG4gICAgICB0aGlzLnNldHVwUGFnZXNGb3JQYWdlTW9kZXModHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnJ1bm5pbmdQYWdlcykge1xuICAgICAgICB0aGlzLnJlc3RvcmVPcmlnaW9uYWxQYWdlcyh0aGlzLnJ1bm5pbmdQYWdlcyk7XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bm5pbmdQYWdlcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gICAgdGhpcy51cGRhdGVBbGxFbGVtZW50c1Zpc2liaWxpdHkodGhpcy5wYWdlcyk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMuY3VycmVudFBhZ2VObyA9IDA7XG4gIH1cbiAgcHJpdmF0ZSBvcmlnaW9uYWxQYWdlczogYW55O1xuICBwcm90ZWN0ZWQgb25RdWVzdGlvbnNPblBhZ2VNb2RlQ2hhbmdlZChvbGRWYWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaXNTaG93aW5nUHJldmlldykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uc09uUGFnZU1vZGUgPT0gXCJzdGFuZGFyZFwiIHx8IHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICBpZiAodGhpcy5vcmlnaW9uYWxQYWdlcykge1xuICAgICAgICB0aGlzLnJlc3RvcmVPcmlnaW9uYWxQYWdlcyh0aGlzLm9yaWdpb25hbFBhZ2VzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3JpZ2lvbmFsUGFnZXMgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghb2xkVmFsdWUgfHwgb2xkVmFsdWUgPT0gXCJzdGFuZGFyZFwiKSB7XG4gICAgICAgIHRoaXMub3JpZ2lvbmFsUGFnZXMgPSB0aGlzLnBhZ2VzLnNsaWNlKDAsIHRoaXMucGFnZXMubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0dXBQYWdlc0ZvclBhZ2VNb2Rlcyh0aGlzLmlzU2luZ2xlUGFnZSk7XG4gICAgfVxuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICBwcml2YXRlIHJlc3RvcmVPcmlnaW9uYWxQYWdlcyhvcmlnaW5hbFBhZ2VzOiBBcnJheTxQYWdlTW9kZWw+KSB7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc0NsZWFyKCk7XG4gICAgdGhpcy5wYWdlcy5zcGxpY2UoMCwgdGhpcy5wYWdlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JpZ2luYWxQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlcy5wdXNoKG9yaWdpbmFsUGFnZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNldHVwUGFnZXNGb3JQYWdlTW9kZXMoaXNTaW5nbGVQYWdlOiBib29sZWFuKSB7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc0NsZWFyKCk7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCA/IDEgOiAwO1xuICAgIHN1cGVyLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdmFyIG5ld1BhZ2VzID0gdGhpcy5jcmVhdGVQYWdlc0ZvclF1ZXN0aW9uT25QYWdlTW9kZShcbiAgICAgIGlzU2luZ2xlUGFnZSxcbiAgICAgIHN0YXJ0SW5kZXhcbiAgICApO1xuICAgIHZhciBkZWxldGVkTGVuID0gdGhpcy5wYWdlcy5sZW5ndGggLSBzdGFydEluZGV4O1xuICAgIHRoaXMucGFnZXMuc3BsaWNlKHN0YXJ0SW5kZXgsIGRlbGV0ZWRMZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXMucHVzaChuZXdQYWdlc1tpXSk7XG4gICAgfVxuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld1BhZ2VzW2ldLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgICAgbmV3UGFnZXNbaV0uc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5kb0VsZW1lbnRzT25Mb2FkKCk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVQYWdlc0ZvclF1ZXN0aW9uT25QYWdlTW9kZShcbiAgICBpc1NpbmdsZVBhZ2U6IGJvb2xlYW4sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyXG4gICk6IEFycmF5PFBhZ2VNb2RlbD4ge1xuICAgIGlmIChpc1NpbmdsZVBhZ2UpIHtcbiAgICAgIHJldHVybiBbdGhpcy5jcmVhdGVTaW5nbGVQYWdlKHN0YXJ0SW5kZXgpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFnZXNGb3JFdmVyeVF1ZXN0aW9uKHN0YXJ0SW5kZXgpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlU2luZ2xlUGFnZShzdGFydEluZGV4OiBudW1iZXIpOiBQYWdlTW9kZWwge1xuICAgIHZhciBzaW5nbGUgPSB0aGlzLmNyZWF0ZU5ld1BhZ2UoXCJhbGxcIik7XG4gICAgc2luZ2xlLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICB2YXIgcGFuZWwgPSBTZXJpYWxpemVyLmNyZWF0ZUNsYXNzKFwicGFuZWxcIik7XG4gICAgICBwYW5lbC5vcmlnaW5hbFBhZ2UgPSBwYWdlO1xuICAgICAgc2luZ2xlLmFkZFBhbmVsKHBhbmVsKTtcbiAgICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QocGFnZSk7XG4gICAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHBhbmVsKTtcbiAgICAgIGlmICghdGhpcy5zaG93UGFnZVRpdGxlcykge1xuICAgICAgICBwYW5lbC50aXRsZSA9IFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaW5nbGU7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVQYWdlc0ZvckV2ZXJ5UXVlc3Rpb24oc3RhcnRJbmRleDogbnVtYmVyKTogQXJyYXk8UGFnZU1vZGVsPiB7XG4gICAgdmFyIHJlczogQXJyYXk8UGFnZU1vZGVsPiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG9yaWdpbmFsUGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICAvLyBJbml0aWFsaXplIHJhbmRvbWl6YXRpb25cbiAgICAgIG9yaWdpbmFsUGFnZS5zZXRXYXNTaG93bih0cnVlKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb3JpZ2luYWxQYWdlLmVsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbEVsZW1lbnQgPSBvcmlnaW5hbFBhZ2UuZWxlbWVudHNbal07XG4gICAgICAgIHZhciBlbGVtZW50ID0gU2VyaWFsaXplci5jcmVhdGVDbGFzcyhvcmlnaW5hbEVsZW1lbnQuZ2V0VHlwZSgpKTtcbiAgICAgICAgaWYgKCFlbGVtZW50KSBjb250aW51ZTtcbiAgICAgICAgdmFyIGpzb25PYmogPSBuZXcgSnNvbk9iamVjdCgpO1xuICAgICAgICAvL0Rlc2VyaWFsaXplIHBhZ2UgcHJvcGVydGllcyBvbmx5LCBleGNsdWRpbmcgZWxlbWVudHNcbiAgICAgICAganNvbk9iai5saWdodFNlcmlhbGl6aW5nID0gdHJ1ZTtcbiAgICAgICAgdmFyIHBhZ2VKc29uID0ganNvbk9iai50b0pzb25PYmplY3Qob3JpZ2luYWxQYWdlKTtcblxuICAgICAgICB2YXIgcGFnZSA9IDxQYWdlTW9kZWw+U2VyaWFsaXplci5jcmVhdGVDbGFzcyhvcmlnaW5hbFBhZ2UuZ2V0VHlwZSgpKTtcbiAgICAgICAgcGFnZS5mcm9tSlNPTihwYWdlSnNvbik7XG4gICAgICAgIHBhZ2UubmFtZSA9IFwicGFnZVwiICsgKHJlcy5sZW5ndGggKyAxKTtcbiAgICAgICAgcGFnZS5zZXRTdXJ2ZXlJbXBsKHRoaXMpO1xuICAgICAgICByZXMucHVzaChwYWdlKTtcbiAgICAgICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdChvcmlnaW5hbEVsZW1lbnQpO1xuICAgICAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIGVsZW1lbnQpO1xuICAgICAgICBwYWdlLmFkZEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcGFnZS5xdWVzdGlvbnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQWRkZWQocGFnZS5xdWVzdGlvbnNba10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBvbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRmlyc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLnZpc2libGVQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpID09IDA7XG4gIH1cbiAgcHVibGljIGdldCBpc1Nob3dQcmV2QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzRmlyc3RQYWdlIHx8ICF0aGlzLnNob3dQcmV2QnV0dG9uKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLnZpc2libGVQYWdlc1t0aGlzLmN1cnJlbnRQYWdlTm8gLSAxXTtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlTWF4VGltZVRvRmluaXNoKHBhZ2UpIDw9IDA7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBsYXN0IG9uZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNMYXN0UGFnZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgcmV0dXJuIHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpID09IHZQYWdlcy5sZW5ndGggLSAxO1xuICB9XG4gIC8qKlxuICAgKiBDb21wbGV0ZXMgdGhlIHN1cnZleS5cbiAgICpcbiAgICogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdGFza3M6XG4gICAqXG4gICAqIC0gd3JpdGVzIGNvb2tpZSBpZiB0aGUgYGNvb2tpZU5hbWVgIHByb3BlcnR5IGlzIG5vdCBlbXB0eVxuICAgKiAtIHNldHMgdGhlIHN1cnZleSBpbnRvIGBjb21wbGV0ZWRgIHN0YXRlXG4gICAqIC0gZmlyZXMgdGhlIGBvbkNvbXBsZXRlYCBldmVudFxuICAgKiAtIGNhbGxzIGBzZW5kUmVzdWx0YCBmdW5jdGlvbi5cbiAgICpcbiAgICogQ2FsbGluZyB0aGUgYGRvQ29tcGxldGVgIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gYW55IHZhbGlkYXRpb24sIHVubGlrZSB0aGUgYGNvbXBsZXRlTGFzdFBhZ2VgIGZ1bmN0aW9uLlxuICAgKiBJdCBjYWxscyBgbmF2aWdhdGVUb1VybGAgYWZ0ZXIgY2FsbGluZyBgb25Db21wbGV0ZWAgZXZlbnQuXG4gICAqIEluIGNhc2UgY2FsbGluZyBgb3B0aW9ucy5zaG93RGF0YVNhdmluZ2AgY2FsbGJhY2sgaW4gdGhlIGBvbkNvbXBsZXRlYCBldmVudCwgYG5hdmlnYXRlVG9VcmxgIGlzIHVzZWQgb24gY2FsbGluZyBgb3B0aW9ucy5zaG93RGF0YVNhdmluZ1N1Y2Nlc3NgIGNhbGxiYWNrLlxuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqIEBzZWUgc3RhdGVcbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqIEBzZWUgc3VydmV5UG9zdElkXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKiBAc2VlIG5hdmlnYXRlVG9VcmxcbiAgICogQHNlZSBuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb25cbiAgICovXG4gIHB1YmxpYyBkb0NvbXBsZXRlKGlzQ29tcGxldGVPblRyaWdnZXI6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHZhciBvbkNvbXBsZXRpbmdPcHRpb25zID0ge1xuICAgICAgYWxsb3dDb21wbGV0ZTogdHJ1ZSxcbiAgICAgIGlzQ29tcGxldGVPblRyaWdnZXI6IGlzQ29tcGxldGVPblRyaWdnZXIsXG4gICAgfTtcbiAgICB0aGlzLm9uQ29tcGxldGluZy5maXJlKHRoaXMsIG9uQ29tcGxldGluZ09wdGlvbnMpO1xuICAgIGlmICghb25Db21wbGV0aW5nT3B0aW9ucy5hbGxvd0NvbXBsZXRlKSByZXR1cm47XG4gICAgbGV0IHByZXZpb3VzQ29va2llID0gdGhpcy5oYXNDb29raWU7XG4gICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgICB0aGlzLnNldENvbXBsZXRlZCgpO1xuICAgIHRoaXMuY2xlYXJVbnVzZWRWYWx1ZXMoKTtcbiAgICB0aGlzLnNldENvb2tpZSgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgc2F2aW5nRGF0YVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB2YXIgb25Db21wbGV0ZU9wdGlvbnMgPSB7XG4gICAgICBpc0NvbXBsZXRlT25UcmlnZ2VyOiBpc0NvbXBsZXRlT25UcmlnZ2VyLFxuICAgICAgc2hvd0RhdGFTYXZpbmc6IGZ1bmN0aW9uKHRleHQ6IHN0cmluZykge1xuICAgICAgICBzYXZpbmdEYXRhU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJzYXZpbmdcIiwgdGV4dCk7XG4gICAgICB9LFxuICAgICAgc2hvd0RhdGFTYXZpbmdFcnJvcjogZnVuY3Rpb24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJlcnJvclwiLCB0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBzaG93RGF0YVNhdmluZ1N1Y2Nlc3M6IGZ1bmN0aW9uKHRleHQ6IHN0cmluZykge1xuICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwic3VjY2Vzc1wiLCB0ZXh0KTtcbiAgICAgICAgc2VsZi5uYXZpZ2F0ZVRvKCk7XG4gICAgICB9LFxuICAgICAgc2hvd0RhdGFTYXZpbmdDbGVhcjogZnVuY3Rpb24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJcIiwgXCJcIik7XG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5vbkNvbXBsZXRlLmZpcmUodGhpcywgb25Db21wbGV0ZU9wdGlvbnMpO1xuICAgIGlmICghcHJldmlvdXNDb29raWUgJiYgdGhpcy5zdXJ2ZXlQb3N0SWQpIHtcbiAgICAgIHRoaXMuc2VuZFJlc3VsdCgpO1xuICAgIH1cbiAgICBpZiAoIXNhdmluZ0RhdGFTdGFydGVkKSB7XG4gICAgICB0aGlzLm5hdmlnYXRlVG8oKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgc3VydmV5LiBDaGFuZ2VzIHRoZSBzdXJ2ZXkgbW9kZSBmcm9tIFwic3RhcnRpbmdcIiB0byBcInJ1bm5pbmdcIi4gQ2FsbCB0aGlzIGZ1bmN0aW9uIGlmIHlvdXIgc3VydmV5IGhhcyBhIHN0YXJ0IHBhZ2UsIG90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy5cbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyBzdGFydCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZmlyc3RQYWdlSXNTdGFydGVkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuY2hlY2tJc1BhZ2VIYXNFcnJvcnModGhpcy5zdGFydGVkUGFnZSwgdHJ1ZSkpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLmlzU3RhcnRlZFN0YXRlID0gZmFsc2U7XG4gICAgdGhpcy5zdGFydFRpbWVyRnJvbVVJKCk7XG4gICAgdGhpcy5vblN0YXJ0ZWQuZmlyZSh0aGlzLCB7fSk7XG4gICAgaWYgKCEhdGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBxdWVzdGlvbiB2YWx1ZXMgb24gdGhlIGN1cnJlbnQgcGFnZSBhcmUgdmFsaWRhdGluZyBvbiB0aGUgc2VydmVyIGF0IHRoZSBjdXJyZW50IG1vbWVudC5cbiAgICogQHNlZSBvblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmFsaWRhdGluZ09uU2VydmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1ZhbGlkYXRpbmdPblNlcnZlclwiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRJc1ZhbGlkYXRpbmdPblNlcnZlcih2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsID09IHRoaXMuaXNWYWxpZGF0aW5nT25TZXJ2ZXIpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1ZhbGlkYXRpbmdPblNlcnZlclwiLCB2YWwpO1xuICAgIHRoaXMub25Jc1ZhbGlkYXRpbmdPblNlcnZlckNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Jc1ZhbGlkYXRpbmdPblNlcnZlckNoYW5nZWQoKSB7fVxuICBwcm90ZWN0ZWQgZG9TZXJ2ZXJWYWxpZGF0aW9uKFxuICAgIGRvQ29tcGxldGU6IGJvb2xlYW4sXG4gICAgaXNQcmV2aWV3OiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucyB8fFxuICAgICAgdGhpcy5vblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zLmlzRW1wdHlcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFkb0NvbXBsZXRlICYmIHRoaXMuY2hlY2tFcnJvcnNNb2RlID09PSBcIm9uQ29tcGxldGVcIikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGRhdGE6IDx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+e30sXG4gICAgICBlcnJvcnM6IHt9LFxuICAgICAgc3VydmV5OiB0aGlzLFxuICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmNvbXBsZXRlU2VydmVyVmFsaWRhdGlvbihvcHRpb25zLCBpc1ByZXZpZXcpO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGlmIChkb0NvbXBsZXRlICYmIHRoaXMuY2hlY2tFcnJvcnNNb2RlID09PSBcIm9uQ29tcGxldGVcIikge1xuICAgICAgb3B0aW9ucy5kYXRhID0gdGhpcy5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5hY3RpdmVQYWdlLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgICAgaWYgKCFxdWVzdGlvbi52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZShxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKSk7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpKVxuICAgICAgICAgIG9wdGlvbnMuZGF0YVtxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXRJc1ZhbGlkYXRpbmdPblNlcnZlcih0cnVlKTtcblxuICAgIGlmICh0eXBlb2YgdGhpcy5vblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBjb21wbGV0ZVNlcnZlclZhbGlkYXRpb24ob3B0aW9uczogYW55LCBpc1ByZXZpZXc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldElzVmFsaWRhdGluZ09uU2VydmVyKGZhbHNlKTtcbiAgICBpZiAoIW9wdGlvbnMgJiYgIW9wdGlvbnMuc3VydmV5KSByZXR1cm47XG4gICAgdmFyIHNlbGYgPSBvcHRpb25zLnN1cnZleTtcbiAgICB2YXIgaGFzRXJyb3JzID0gZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMuZXJyb3JzKSB7XG4gICAgICB2YXIgaGFzVG9Gb2N1cyA9IHRoaXMuZm9jdXNPbkZpcnN0RXJyb3I7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIG9wdGlvbnMuZXJyb3JzKSB7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IHNlbGYuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgICAgIGlmIChxdWVzdGlvbiAmJiBxdWVzdGlvbltcImVycm9yc1wiXSkge1xuICAgICAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICAgICAgcXVlc3Rpb24uYWRkRXJyb3IobmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3JzW25hbWVdLCB0aGlzKSk7XG4gICAgICAgICAgaWYgKGhhc1RvRm9jdXMpIHtcbiAgICAgICAgICAgIGhhc1RvRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghIXF1ZXN0aW9uLnBhZ2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHF1ZXN0aW9uLnBhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWVzdGlvbi5mb2N1cyh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZmlyZVZhbGlkYXRlZEVycm9yc09uUGFnZSh0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICB9XG4gICAgaWYgKCFoYXNFcnJvcnMpIHtcbiAgICAgIGlmIChpc1ByZXZpZXcpIHtcbiAgICAgICAgdGhpcy5pc1Nob3dpbmdQcmV2aWV3ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzZWxmLmlzTGFzdFBhZ2UpIHNlbGYuZG9Db21wbGV0ZSgpO1xuICAgICAgICBlbHNlIHNlbGYuZG9OZXh0UGFnZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZG9OZXh0UGFnZSgpIHtcbiAgICB2YXIgY3VyUGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgdGhpcy5jaGVja09uUGFnZVRyaWdnZXJzKCk7XG4gICAgaWYgKCF0aGlzLmlzQ29tcGxldGVkKSB7XG4gICAgICBpZiAodGhpcy5zZW5kUmVzdWx0T25QYWdlTmV4dCkge1xuICAgICAgICB0aGlzLnNlbmRSZXN1bHQodGhpcy5zdXJ2ZXlQb3N0SWQsIHRoaXMuY2xpZW50SWQsIHRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKGN1clBhZ2UgPT09IHRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgICAgICB2YXIgaW5kZXggPSB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHZQYWdlc1tpbmRleCArIDFdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRvQ29tcGxldGUodHJ1ZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXRDb21wbGV0ZWQoKSB7XG4gICAgdGhpcy5pc0NvbXBsZXRlZCA9IHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIEhUTUwgY29udGVudCBmb3IgdGhlIGNvbXBsZXRlIHBhZ2UuXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbFxuICAgKi9cbiAgcHVibGljIGdldCBwcm9jZXNzZWRDb21wbGV0ZWRIdG1sKCk6IHN0cmluZyB7XG4gICAgdmFyIGh0bWwgPSB0aGlzLnJlbmRlcmVkQ29tcGxldGVkSHRtbDtcbiAgICBpZiAoaHRtbCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0h0bWwoaHRtbCk7XG4gICAgfVxuICAgIHJldHVybiBcIjxoMz5cIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGluZ1N1cnZleVwiKSArIFwiPC9oMz5cIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgSFRNTCBjb250ZW50LCB0aGF0IGlzIHNob3duIHRvIGEgdXNlciB0aGF0IGhhZCBjb21wbGV0ZWQgdGhlIHN1cnZleSBiZWZvcmUuXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbFxuICAgKiBAc2VlIGNvb2tpZU5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkQ29tcGxldGVkQmVmb3JlSHRtbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNvbXBsZXRlZEJlZm9yZUh0bWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdG1sKHRoaXMuY29tcGxldGVkQmVmb3JlSHRtbCk7XG4gICAgfVxuICAgIHJldHVybiBcIjxoMz5cIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGluZ1N1cnZleUJlZm9yZVwiKSArIFwiPC9oMz5cIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgSFRNTCBjb250ZW50LCB0aGF0IGlzIHNob3dzIHdoZW4gYSBzdXJ2ZXkgbG9hZHMgdGhlIHN1cnZleSBKU09OLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm9jZXNzZWRMb2FkaW5nSHRtbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmxvYWRpbmdIdG1sKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSHRtbCh0aGlzLmxvYWRpbmdIdG1sKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiPGgzPlwiICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJsb2FkaW5nU3VydmV5XCIpICsgXCI8L2gzPlwiO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9ncmVzc0luZm8oKTogSVByb2dyZXNzSW5mbyB7XG4gICAgdmFyIHBhZ2VzID0gdGhpcy5pc0Rlc2lnbk1vZGUgPyB0aGlzLnBhZ2VzIDogdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgcmV0dXJuIFN1cnZleUVsZW1lbnQuZ2V0UHJvZ3Jlc3NJbmZvQnlFbGVtZW50cyhwYWdlcywgZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgY3VycmVudCBwcm9ncmVzcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvZ3Jlc3NUZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInByb2dyZXNzVGV4dFwiLCBcIlwiKTtcbiAgICBpZiAoIXJlcykge1xuICAgICAgdGhpcy51cGRhdGVQcm9ncmVzc1RleHQoKTtcbiAgICAgIHJlcyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInByb2dyZXNzVGV4dFwiLCBcIlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGlzQ2FsY3VsYXRpbmdQcm9ncmVzc1RleHQgPSBmYWxzZTtcbiAgcHVibGljIHVwZGF0ZVByb2dyZXNzVGV4dChvblZhbHVlQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuaXNDYWxjdWxhdGluZ1Byb2dyZXNzVGV4dCkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgIG9uVmFsdWVDaGFuZ2VkICYmXG4gICAgICB0aGlzLnByb2dyZXNzQmFyVHlwZSA9PSBcInBhZ2VzXCIgJiZcbiAgICAgIHRoaXMub25Qcm9ncmVzc1RleHQuaXNFbXB0eVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmlzQ2FsY3VsYXRpbmdQcm9ncmVzc1RleHQgPSB0cnVlO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInByb2dyZXNzVGV4dFwiLCB0aGlzLmdldFByb2dyZXNzVGV4dCgpKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwcm9ncmVzc1ZhbHVlXCIsIHRoaXMuZ2V0UHJvZ3Jlc3MoKSk7XG4gICAgdGhpcy5pc0NhbGN1bGF0aW5nUHJvZ3Jlc3NUZXh0ID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldFByb2dyZXNzVGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5pc0Rlc2lnbk1vZGUgJiYgdGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICBhbnN3ZXJlZFF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICByZXF1aXJlZFF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICByZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudDogMCxcbiAgICAgIHRleHQ6IFwiXCIsXG4gICAgfTtcbiAgICB2YXIgdHlwZSA9IHRoaXMucHJvZ3Jlc3NCYXJUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdHlwZSA9PT0gXCJxdWVzdGlvbnNcIiB8fFxuICAgICAgdHlwZSA9PT0gXCJyZXF1aXJlZHF1ZXN0aW9uc1wiIHx8XG4gICAgICB0eXBlID09PSBcImNvcnJlY3RxdWVzdGlvbnNcIiB8fFxuICAgICAgIXRoaXMub25Qcm9ncmVzc1RleHQuaXNFbXB0eVxuICAgICkge1xuICAgICAgdmFyIGluZm8gPSB0aGlzLmdldFByb2dyZXNzSW5mbygpO1xuICAgICAgb3B0aW9ucy5xdWVzdGlvbkNvdW50ID0gaW5mby5xdWVzdGlvbkNvdW50O1xuICAgICAgb3B0aW9ucy5hbnN3ZXJlZFF1ZXN0aW9uQ291bnQgPSBpbmZvLmFuc3dlcmVkUXVlc3Rpb25Db3VudDtcbiAgICAgIG9wdGlvbnMucmVxdWlyZWRRdWVzdGlvbkNvdW50ID0gaW5mby5yZXF1aXJlZFF1ZXN0aW9uQ291bnQ7XG4gICAgICBvcHRpb25zLnJlcXVpcmVkQW5zd2VyZWRRdWVzdGlvbkNvdW50ID1cbiAgICAgICAgaW5mby5yZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudDtcbiAgICB9XG5cbiAgICBvcHRpb25zLnRleHQgPSB0aGlzLmdldFByb2dyZXNzVGV4dENvcmUob3B0aW9ucyk7XG4gICAgdGhpcy5vblByb2dyZXNzVGV4dC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnRleHQ7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9ncmVzc1RleHRDb3JlKGluZm86IElQcm9ncmVzc0luZm8pOiBzdHJpbmcge1xuICAgIHZhciB0eXBlID0gdGhpcy5wcm9ncmVzc0JhclR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodHlwZSA9PT0gXCJxdWVzdGlvbnNcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicXVlc3Rpb25zUHJvZ3Jlc3NUZXh0XCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICBpbmZvLmFuc3dlcmVkUXVlc3Rpb25Db3VudCxcbiAgICAgICAgaW5mby5xdWVzdGlvbkNvdW50XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJyZXF1aXJlZHF1ZXN0aW9uc1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJxdWVzdGlvbnNQcm9ncmVzc1RleHRcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgIGluZm8ucmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnQsXG4gICAgICAgIGluZm8ucmVxdWlyZWRRdWVzdGlvbkNvdW50XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJjb3JyZWN0cXVlc3Rpb25zXCIpIHtcbiAgICAgIHZhciBjb3JyZWN0QW5zd2Vyc0NvdW50ID0gdGhpcy5nZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudCgpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicXVlc3Rpb25zUHJvZ3Jlc3NUZXh0XCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICBjb3JyZWN0QW5zd2Vyc0NvdW50LFxuICAgICAgICBpbmZvLnF1ZXN0aW9uQ291bnRcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciB2UGFnZXMgPSB0aGlzLmlzRGVzaWduTW9kZSA/IHRoaXMucGFnZXMgOiB0aGlzLnZpc2libGVQYWdlcztcbiAgICB2YXIgaW5kZXggPSB0aGlzLmlzRGVzaWduTW9kZSA/IDEgOiB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSArIDE7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicHJvZ3Jlc3NUZXh0XCIpW1wiZm9ybWF0XCJdKGluZGV4LCB2UGFnZXMubGVuZ3RoKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWZ0ZXJSZW5kZXJTdXJ2ZXkoaHRtbEVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMub25BZnRlclJlbmRlclN1cnZleS5maXJlKHRoaXMsIHtcbiAgICAgIHN1cnZleTogdGhpcyxcbiAgICAgIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudCxcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMocXVlc3Rpb246IElRdWVzdGlvbiwgY3NzQ2xhc3NlczogYW55KSB7XG4gICAgdGhpcy5vblVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3Nlcy5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIGNzc0NsYXNzZXM6IGNzc0NsYXNzZXMsXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlUGFuZWxDc3NDbGFzc2VzKHBhbmVsOiBJUGFuZWwsIGNzc0NsYXNzZXM6IGFueSkge1xuICAgIHRoaXMub25VcGRhdGVQYW5lbENzc0NsYXNzZXMuZmlyZSh0aGlzLCB7XG4gICAgICBwYW5lbDogcGFuZWwsXG4gICAgICBjc3NDbGFzc2VzOiBjc3NDbGFzc2VzLFxuICAgIH0pO1xuICB9XG4gIHVwZGF0ZVBhZ2VDc3NDbGFzc2VzKHBhZ2U6IElQYWdlLCBjc3NDbGFzc2VzOiBhbnkpIHtcbiAgICB0aGlzLm9uVXBkYXRlUGFnZUNzc0NsYXNzZXMuZmlyZSh0aGlzLCB7XG4gICAgICBwYWdlOiBwYWdlLFxuICAgICAgY3NzQ2xhc3NlczogY3NzQ2xhc3NlcyxcbiAgICB9KTtcbiAgfVxuICBhZnRlclJlbmRlclBhZ2UoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMub25BZnRlclJlbmRlclBhZ2UuaXNFbXB0eSkgcmV0dXJuO1xuICAgIHRoaXMub25BZnRlclJlbmRlclBhZ2UuZmlyZSh0aGlzLCB7XG4gICAgICBwYWdlOiB0aGlzLmFjdGl2ZVBhZ2UsXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnQsXG4gICAgfSk7XG4gIH1cbiAgYWZ0ZXJSZW5kZXJIZWFkZXIoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMub25BZnRlclJlbmRlckhlYWRlci5pc0VtcHR5KSByZXR1cm47XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVySGVhZGVyLmZpcmUodGhpcywge1xuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50LFxuICAgIH0pO1xuICB9XG4gIGFmdGVyUmVuZGVyUXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbiwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyUXVlc3Rpb24uZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnQsXG4gICAgfSk7XG4gIH1cbiAgYWZ0ZXJSZW5kZXJRdWVzdGlvbklucHV0KHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGlmICh0aGlzLm9uQWZ0ZXJSZW5kZXJRdWVzdGlvbklucHV0LmlzRW1wdHkpIHJldHVybjtcbiAgICBsZXQgaWQgPSAoPFF1ZXN0aW9uPnF1ZXN0aW9uKS5pbnB1dElkO1xuICAgIGlmICghIWlkICYmIGh0bWxFbGVtZW50LmlkICE9PSBpZCAmJiB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGxldCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgIGlmICghIWVsKSB7XG4gICAgICAgIGh0bWxFbGVtZW50ID0gZWw7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25BZnRlclJlbmRlclF1ZXN0aW9uSW5wdXQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBodG1sRWxlbWVudDogaHRtbEVsZW1lbnQsXG4gICAgfSk7XG4gIH1cbiAgYWZ0ZXJSZW5kZXJQYW5lbChwYW5lbDogSUVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMub25BZnRlclJlbmRlclBhbmVsLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50LFxuICAgIH0pO1xuICB9XG4gIG1hdHJpeEJlZm9yZVJvd0FkZGVkKG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMub25NYXRyaXhCZWZvcmVSb3dBZGRlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG1hdHJpeFJvd0FkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHJvdzogYW55KSB7XG4gICAgdGhpcy5vbk1hdHJpeFJvd0FkZGVkLmZpcmUodGhpcywgeyBxdWVzdGlvbjogcXVlc3Rpb24sIHJvdzogcm93IH0pO1xuICB9XG4gIGdldFF1ZXN0aW9uQnlWYWx1ZU5hbWVGcm9tQXJyYXkoXG4gICAgdmFsdWVOYW1lOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKTogSVF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZSh2YWx1ZU5hbWUpO1xuICAgIGlmICghcXVlc3Rpb25zKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXMgPSBxdWVzdGlvbnNbaV0uZ2V0UXVlc3Rpb25Gcm9tQXJyYXkobmFtZSwgaW5kZXgpO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBtYXRyaXhSb3dSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHJvd0luZGV4OiBudW1iZXIsIHJvdzogYW55KSB7XG4gICAgdGhpcy5vbk1hdHJpeFJvd1JlbW92ZWQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICByb3c6IHJvdyxcbiAgICB9KTtcbiAgfVxuICBtYXRyaXhSb3dSZW1vdmluZyhxdWVzdGlvbjogSVF1ZXN0aW9uLCByb3dJbmRleDogbnVtYmVyLCByb3c6IGFueSk6IGJvb2xlYW4ge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgcm93OiByb3csXG4gICAgICBhbGxvdzogdHJ1ZSxcbiAgICB9O1xuICAgIHRoaXMub25NYXRyaXhSb3dSZW1vdmluZy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93O1xuICB9XG4gIG1hdHJpeEFsbG93UmVtb3ZlUm93KFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICByb3c6IGFueVxuICApOiBib29sZWFuIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHJvd0luZGV4OiByb3dJbmRleCxcbiAgICAgIHJvdzogcm93LFxuICAgICAgYWxsb3c6IHRydWUsXG4gICAgfTtcbiAgICB0aGlzLm9uTWF0cml4QWxsb3dSZW1vdmVSb3cuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5hbGxvdztcbiAgfVxuICBtYXRyaXhDZWxsQ3JlYXRlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpIHtcbiAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgdGhpcy5vbk1hdHJpeENlbGxDcmVhdGVkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgbWF0cml4QWZ0ZXJDZWxsUmVuZGVyKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4QWZ0ZXJDZWxsUmVuZGVyLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgbWF0cml4Q2VsbFZhbHVlQ2hhbmdlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpIHtcbiAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgdGhpcy5vbk1hdHJpeENlbGxWYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhDZWxsVmFsdWVDaGFuZ2luZyhxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpIHtcbiAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgdGhpcy5vbk1hdHJpeENlbGxWYWx1ZUNoYW5naW5nLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgZ2V0IGlzVmFsaWRhdGVPblZhbHVlQ2hhbmdpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tFcnJvcnNNb2RlID09PSBcIm9uVmFsdWVDaGFuZ2luZ1wiO1xuICB9XG4gIG1hdHJpeENlbGxWYWxpZGF0ZShxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpOiBTdXJ2ZXlFcnJvciB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25NYXRyaXhDZWxsVmFsaWRhdGUuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5lcnJvciA/IG5ldyBDdXN0b21FcnJvcihvcHRpb25zLmVycm9yLCB0aGlzKSA6IG51bGw7XG4gIH1cbiAgZHluYW1pY1BhbmVsQWRkZWQocXVlc3Rpb246IElRdWVzdGlvbikge1xuICAgIGlmICh0aGlzLm9uRHluYW1pY1BhbmVsQWRkZWQuaXNFbXB0eSkgcmV0dXJuO1xuICAgIHZhciBwYW5lbHMgPSAoPGFueT5xdWVzdGlvbikucGFuZWxzO1xuICAgIHZhciBwYW5lbCA9IHBhbmVsc1twYW5lbHMubGVuZ3RoIC0gMV07XG4gICAgdGhpcy5vbkR5bmFtaWNQYW5lbEFkZGVkLmZpcmUodGhpcywgeyBxdWVzdGlvbjogcXVlc3Rpb24sIHBhbmVsOiBwYW5lbCB9KTtcbiAgfVxuICBkeW5hbWljUGFuZWxSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHBhbmVsSW5kZXg6IG51bWJlciwgcGFuZWw6IElQYW5lbCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSAhIXBhbmVsID8gKDxQYW5lbE1vZGVsQmFzZT5wYW5lbCkucXVlc3Rpb25zIDogW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhck9uRGVsZXRpbmdDb250YWluZXIoKTtcbiAgICB9XG4gICAgdGhpcy5vbkR5bmFtaWNQYW5lbFJlbW92ZWQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBwYW5lbEluZGV4OiBwYW5lbEluZGV4LFxuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgIH0pO1xuICB9XG4gIGR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25EeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgZHJhZ0FuZERyb3BBbGxvdyhvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgICBvcHRpb25zLmFsbG93ID0gdHJ1ZTtcbiAgICB0aGlzLm9uRHJhZ0Ryb3BBbGxvdy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93O1xuICB9XG4gIGVsZW1lbnRDb250ZW50VmlzaWJpbGl0eUNoYW5nZWQoZWxlbWVudDogSVN1cnZleUVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZVZhbHVlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlVmFsdWUuZW5zdXJlUm93c1Zpc2liaWxpdHkoKTtcbiAgICB9XG4gICAgdGhpcy5vbkVsZW1lbnRDb250ZW50VmlzaWJpbGl0eUNoYW5nZWQuZmlyZSh0aGlzLCB7IGVsZW1lbnQgfSk7XG4gIH1cblxuICBnZXRVcGRhdGVkRWxlbWVudFRpdGxlQWN0aW9ucyhcbiAgICBlbGVtZW50OiBJU3VydmV5RWxlbWVudCxcbiAgICB0aXRsZUFjdGlvbnM6IEFycmF5PElBY3Rpb24+XG4gICk6IEFycmF5PElBY3Rpb24+IHtcbiAgICBpZiAoZWxlbWVudC5pc1BhZ2UpXG4gICAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVkUGFnZVRpdGxlQWN0aW9ucyhlbGVtZW50LCB0aXRsZUFjdGlvbnMpO1xuICAgIGlmIChlbGVtZW50LmlzUGFuZWwpXG4gICAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVkUGFuZWxUaXRsZUFjdGlvbnMoZWxlbWVudCwgdGl0bGVBY3Rpb25zKTtcbiAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVkUXVlc3Rpb25UaXRsZUFjdGlvbnMoZWxlbWVudCwgdGl0bGVBY3Rpb25zKTtcbiAgfVxuICBwcml2YXRlIGdldFVwZGF0ZWRRdWVzdGlvblRpdGxlQWN0aW9ucyhcbiAgICBxdWVzdGlvbjogSVN1cnZleUVsZW1lbnQsXG4gICAgdGl0bGVBY3Rpb25zOiBBcnJheTxJQWN0aW9uPlxuICApIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHRpdGxlQWN0aW9uczogdGl0bGVBY3Rpb25zLFxuICAgIH07XG4gICAgdGhpcy5vbkdldFF1ZXN0aW9uVGl0bGVBY3Rpb25zLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMudGl0bGVBY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVcGRhdGVkUGFuZWxUaXRsZUFjdGlvbnMoXG4gICAgcGFuZWw6IElTdXJ2ZXlFbGVtZW50LFxuICAgIHRpdGxlQWN0aW9uczogQXJyYXk8SUFjdGlvbj5cbiAgKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBwYW5lbDogcGFuZWwsXG4gICAgICB0aXRsZUFjdGlvbnM6IHRpdGxlQWN0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMub25HZXRQYW5lbFRpdGxlQWN0aW9ucy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnRpdGxlQWN0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXBkYXRlZFBhZ2VUaXRsZUFjdGlvbnMoXG4gICAgcGFnZTogSVN1cnZleUVsZW1lbnQsXG4gICAgdGl0bGVBY3Rpb25zOiBBcnJheTxJQWN0aW9uPlxuICApIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICB0aXRsZUFjdGlvbnM6IHRpdGxlQWN0aW9ucyxcbiAgICB9O1xuICAgIHRoaXMub25HZXRQYWdlVGl0bGVBY3Rpb25zLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMudGl0bGVBY3Rpb25zO1xuICB9XG5cbiAgZ2V0VXBkYXRlZE1hdHJpeFJvd0FjdGlvbnMoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICByb3c6IGFueSxcbiAgICBhY3Rpb25zOiBBcnJheTxJQWN0aW9uPlxuICApIHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIGFjdGlvbnM6IGFjdGlvbnMsXG4gICAgICByb3c6IHJvdyxcbiAgICB9O1xuICAgIHRoaXMub25HZXRNYXRyaXhSb3dBY3Rpb25zLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuYWN0aW9ucztcbiAgfVxuXG4gIHNjcm9sbEVsZW1lbnRUb1RvcChcbiAgICBlbGVtZW50OiBJU3VydmV5RWxlbWVudCxcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIHBhZ2U6IElQYWdlLFxuICAgIGlkOiBzdHJpbmdcbiAgKTogYW55IHtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBwYWdlOiBwYWdlLFxuICAgICAgZWxlbWVudElkOiBpZCxcbiAgICAgIGNhbmNlbDogZmFsc2UsXG4gICAgfTtcbiAgICB0aGlzLm9uU2Nyb2xsaW5nRWxlbWVudFRvVG9wLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLmNhbmNlbCkge1xuICAgICAgU3VydmV5RWxlbWVudC5TY3JvbGxFbGVtZW50VG9Ub3Aob3B0aW9ucy5lbGVtZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWRzIGEgZmlsZSB0byBzZXJ2ZXIuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiBhIGZpbGUgcXVlc3Rpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBuYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gZmlsZXMgZmlsZXMgdG8gdXBsb2FkXG4gICAqIEBwYXJhbSB1cGxvYWRpbmdDYWxsYmFjayBhIGNhbGwgYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIHN0YXR1cyBvbiB1cGxvYWRpbmcgdGhlIGZpbGVzXG4gICAqL1xuICBwdWJsaWMgdXBsb2FkRmlsZXMoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZmlsZXM6IEZpbGVbXSxcbiAgICB1cGxvYWRpbmdDYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApIHtcbiAgICBpZiAodGhpcy5vblVwbG9hZEZpbGVzLmlzRW1wdHkpIHtcbiAgICAgIHVwbG9hZGluZ0NhbGxiYWNrKFwiZXJyb3JcIiwgZmlsZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uVXBsb2FkRmlsZXMuZmlyZSh0aGlzLCB7XG4gICAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgZmlsZXM6IGZpbGVzIHx8IFtdLFxuICAgICAgICBjYWxsYmFjazogdXBsb2FkaW5nQ2FsbGJhY2ssXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3VydmV5UG9zdElkKSB7XG4gICAgICB0aGlzLnVwbG9hZEZpbGVzQ29yZShuYW1lLCBmaWxlcywgdXBsb2FkaW5nQ2FsbGJhY2spO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRG93bmxvYWRzIGEgZmlsZSBmcm9tIHNlcnZlclxuICAgKiBAcGFyYW0gbmFtZSBhIHF1ZXN0aW9uIG5hbWVcbiAgICogQHBhcmFtIGZpbGVWYWx1ZSBhIHNpbmdsZSBmaWxlIHF1ZXN0aW9uIHZhbHVlXG4gICAqIEBwYXJhbSBjYWxsYmFjayBhIGNhbGwgYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIHN0YXR1cyBvbiBkb3dubG9hZGluZyB0aGUgZmlsZSBhbmQgdGhlIGRvd25sb2FkZWQgZmlsZSBjb250ZW50XG4gICAqL1xuICBwdWJsaWMgZG93bmxvYWRGaWxlKFxuICAgIHF1ZXN0aW9uTmFtZTogc3RyaW5nLFxuICAgIGZpbGVWYWx1ZTogYW55LFxuICAgIGNhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gYW55XG4gICkge1xuICAgIGlmICh0aGlzLm9uRG93bmxvYWRGaWxlLmlzRW1wdHkpIHtcbiAgICAgICEhY2FsbGJhY2sgJiYgY2FsbGJhY2soXCJzdWNjZXNzXCIsIGZpbGVWYWx1ZS5jb250ZW50IHx8IGZpbGVWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMub25Eb3dubG9hZEZpbGUuZmlyZSh0aGlzLCB7XG4gICAgICBuYW1lOiBxdWVzdGlvbk5hbWUsXG4gICAgICBjb250ZW50OiBmaWxlVmFsdWUuY29udGVudCB8fCBmaWxlVmFsdWUsXG4gICAgICBmaWxlVmFsdWU6IGZpbGVWYWx1ZSxcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ2xlYXJzIGZpbGVzIGZyb20gc2VydmVyLlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gcXVlc3Rpb25cbiAgICogQHBhcmFtIG5hbWUgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgZmlsZSBxdWVzdGlvbiB2YWx1ZVxuICAgKiBAcGFyYW0gY2FsbGJhY2sgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3RhdHVzIG9mIHRoZSBjbGVhcmluZyBvcGVyYXRpb25cbiAgICovXG4gIHB1YmxpYyBjbGVhckZpbGVzKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnksXG4gICAgZmlsZU5hbWU6IHN0cmluZyxcbiAgICBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApIHtcbiAgICBpZiAodGhpcy5vbkNsZWFyRmlsZXMuaXNFbXB0eSkge1xuICAgICAgISFjYWxsYmFjayAmJiBjYWxsYmFjayhcInN1Y2Nlc3NcIiwgdmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLm9uQ2xlYXJGaWxlcy5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBmaWxlTmFtZTogZmlsZU5hbWUsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlQ2hvaWNlc0Zyb21TZXJ2ZXIoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBjaG9pY2VzOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHNlcnZlclJlc3VsdDogYW55XG4gICk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgY2hvaWNlczogY2hvaWNlcyxcbiAgICAgIHNlcnZlclJlc3VsdDogc2VydmVyUmVzdWx0LFxuICAgIH07XG4gICAgdGhpcy5vbkxvYWRDaG9pY2VzRnJvbVNlcnZlci5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmNob2ljZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlU3VydmV5U2VydmljZSgpOiBkeFN1cnZleVNlcnZpY2Uge1xuICAgIHJldHVybiBuZXcgZHhTdXJ2ZXlTZXJ2aWNlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwbG9hZEZpbGVzQ29yZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZmlsZXM6IEZpbGVbXSxcbiAgICB1cGxvYWRpbmdDYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApIHtcbiAgICB2YXIgcmVzcG9uc2VzOiBBcnJheTxhbnk+ID0gW107XG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgaWYgKHVwbG9hZGluZ0NhbGxiYWNrKSB1cGxvYWRpbmdDYWxsYmFjayhcInVwbG9hZGluZ1wiLCBmaWxlKTtcbiAgICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLnNlbmRGaWxlKFxuICAgICAgICB0aGlzLnN1cnZleVBvc3RJZCxcbiAgICAgICAgZmlsZSxcbiAgICAgICAgKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2goeyBjb250ZW50OiByZXNwb25zZSwgZmlsZTogZmlsZSB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZXMubGVuZ3RoID09PSBmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgaWYgKHVwbG9hZGluZ0NhbGxiYWNrKSB1cGxvYWRpbmdDYWxsYmFjayhcInN1Y2Nlc3NcIiwgcmVzcG9uc2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHVwbG9hZGluZ0NhbGxiYWNrKVxuICAgICAgICAgICAgICB1cGxvYWRpbmdDYWxsYmFjayhcImVycm9yXCIsIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIGdldFBhZ2UoaW5kZXg6IG51bWJlcik6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXNbaW5kZXhdO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGFuIGV4aXN0aW5nIHBhZ2UgdG8gdGhlIHN1cnZleS5cbiAgICogQHBhcmFtIHBhZ2UgYSBuZXdseSBhZGRlZCBwYWdlXG4gICAqIEBwYXJhbSBpbmRleCAtIGEgcGFnZSBpbmRleCB0byB3aGVyZSBpbnNlcnQgYSBwYWdlLiBJdCBpcyAtMSBieSBkZWZhdWx0IGFuZCB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIGludG8gdGhlIGVuZC5cbiAgICogQHNlZSBhZGROZXdQYWdlXG4gICAqL1xuICBwdWJsaWMgYWRkUGFnZShwYWdlOiBQYWdlTW9kZWwsIGluZGV4OiBudW1iZXIgPSAtMSkge1xuICAgIGlmIChwYWdlID09IG51bGwpIHJldHVybjtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFnZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnBhZ2VzLnB1c2gocGFnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZXMuc3BsaWNlKGluZGV4LCAwLCBwYWdlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGFnZSBhbmQgYWRkcyBpdCB0byBhIHN1cnZleS4gR2VuZXJhdGVzIGEgbmV3IG5hbWUgaWYgdGhlIGBuYW1lYCBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZC5cbiAgICogQHBhcmFtIG5hbWUgYSBwYWdlIG5hbWVcbiAgICogQHBhcmFtIGluZGV4IC0gYSBwYWdlIGluZGV4IHRvIHdoZXJlIGluc2VydCBhIG5ldyBwYWdlLiBJdCBpcyAtMSBieSBkZWZhdWx0IGFuZCB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIGludG8gdGhlIGVuZC5cbiAgICogQHNlZSBhZGRQYWdlXG4gICAqL1xuICBwdWJsaWMgYWRkTmV3UGFnZShuYW1lOiBzdHJpbmcgPSBudWxsLCBpbmRleDogbnVtYmVyID0gLTEpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3JlYXRlTmV3UGFnZShuYW1lKTtcbiAgICB0aGlzLmFkZFBhZ2UocGFnZSwgaW5kZXgpO1xuICAgIHJldHVybiBwYWdlO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcGFnZSBmcm9tIGEgc3VydmV5LlxuICAgKiBAcGFyYW0gcGFnZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhZ2UocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5wYWdlcy5pbmRleE9mKHBhZ2UpO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcbiAgICB0aGlzLnBhZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSA9PSBwYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlcy5sZW5ndGggPiAwID8gdGhpcy5wYWdlc1swXSA6IG51bGw7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcXVlc3Rpb24gYnkgaXRzIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlOYW1lKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBRdWVzdGlvbiB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICB2YXIgaGFzaDogSGFzaFRhYmxlPGFueT4gPSAhIWNhc2VJbnNlbnNpdGl2ZVxuICAgICAgPyB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzSW5zZW5zaXRpdmVcbiAgICAgIDogdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcztcbiAgICB2YXIgcmVzID0gaGFzaFtuYW1lXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlc1swXTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHF1ZXN0aW9uIGJ5IGl0cyB2YWx1ZSBuYW1lXG4gICAqIEBwYXJhbSB2YWx1ZU5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBjYXNlSW5zZW5zaXRpdmVcbiAgICogQHNlZSBnZXRRdWVzdGlvbkJ5TmFtZVxuICAgKiBAc2VlIGdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lXG4gICAqIEBzZWUgUXVlc3Rpb24udmFsdWVOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZShcbiAgICB2YWx1ZU5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUXVlc3Rpb24ge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lKHZhbHVlTmFtZSwgY2FzZUluc2Vuc2l0aXZlKTtcbiAgICByZXR1cm4gISFyZXMgPyByZXNbMF0gOiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBxdWVzdGlvbnMgYnkgdGhlaXIgdmFsdWVOYW1lLiBuYW1lIHByb3BlcnR5IGlzIHVzZWQgaWYgdmFsdWVOYW1lIHByb3BlcnR5IGlzIGVtcHR5LlxuICAgKiBAcGFyYW0gdmFsdWVOYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeU5hbWVcbiAgICogQHNlZSBnZXRRdWVzdGlvbkJ5VmFsdWVOYW1lXG4gICAqIEBzZWUgUXVlc3Rpb24udmFsdWVOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWUoXG4gICAgdmFsdWVOYW1lOiBzdHJpbmcsXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8UXVlc3Rpb24+IHtcbiAgICB2YXIgaGFzaDogSGFzaFRhYmxlPGFueT4gPSAhIWNhc2VJbnNlbnNpdGl2ZVxuICAgICAgPyB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXNJbnNlbnNpdGl2ZVxuICAgICAgOiB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXM7XG4gICAgdmFyIHJlcyA9IGhhc2hbdmFsdWVOYW1lXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0Q2FsY3VsYXRlZFZhbHVlQnlOYW1lKG5hbWU6IHN0cmluZyk6IENhbGN1bGF0ZWRWYWx1ZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09IHRoaXMuY2FsY3VsYXRlZFZhbHVlc1tpXS5uYW1lKVxuICAgICAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVkVmFsdWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogR2V0cyBhIGxpc3Qgb2YgcXVlc3Rpb25zIGJ5IHRoZWlyIG5hbWVzLlxuICAgKiBAcGFyYW0gbmFtZXMgYW4gYXJyYXkgb2YgcXVlc3Rpb24gbmFtZXNcbiAgICogQHBhcmFtIGNhc2VJbnNlbnNpdGl2ZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uc0J5TmFtZXMoXG4gICAgbmFtZXM6IHN0cmluZ1tdLFxuICAgIGNhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IElRdWVzdGlvbltdIHtcbiAgICB2YXIgcmVzdWx0OiBJUXVlc3Rpb25bXSA9IFtdO1xuICAgIGlmICghbmFtZXMpIHJldHVybiByZXN1bHQ7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW5hbWVzW2ldKSBjb250aW51ZTtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZXNbaV0sIGNhc2VJbnNlbnNpdGl2ZSk7XG4gICAgICBpZiAocXVlc3Rpb24pIHJlc3VsdC5wdXNoKHF1ZXN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHBhZ2Ugb24gd2hpY2ggYW4gZWxlbWVudCAocXVlc3Rpb24gb3IgcGFuZWwpIGlzIHBsYWNlZC5cbiAgICogQHBhcmFtIGVsZW1lbnQgUXVlc3Rpb24gb3IgUGFuZWxcbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlQnlFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogUGFnZU1vZGVsIHtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgaWYgKHBhZ2UuY29udGFpbnNFbGVtZW50KGVsZW1lbnQpKSByZXR1cm4gcGFnZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYWdlIG9uIHdoaWNoIGEgcXVlc3Rpb24gaXMgbG9jYXRlZC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFnZUJ5UXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbik6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZUJ5RWxlbWVudChxdWVzdGlvbik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYWdlIGJ5IGl0J3MgbmFtZS5cbiAgICogQHBhcmFtIG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlQnlOYW1lKG5hbWU6IHN0cmluZyk6IFBhZ2VNb2RlbCB7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnBhZ2VzW2ldLm5hbWUgPT0gbmFtZSkgcmV0dXJuIHRoaXMucGFnZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBwYWdlcyBieSB0aGVpciBuYW1lcy5cbiAgICogQHBhcmFtIG5hbWVzIGEgbGlzdCBvZiBwYWdlIG5hbWVzXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFnZXNCeU5hbWVzKG5hbWVzOiBzdHJpbmdbXSk6IFBhZ2VNb2RlbFtdIHtcbiAgICB2YXIgcmVzdWx0OiBQYWdlTW9kZWxbXSA9IFtdO1xuICAgIGlmICghbmFtZXMpIHJldHVybiByZXN1bHQ7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW5hbWVzW2ldKSBjb250aW51ZTtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5nZXRQYWdlQnlOYW1lKG5hbWVzW2ldKTtcbiAgICAgIGlmIChwYWdlKSByZXN1bHQucHVzaChwYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHF1ZXN0aW9ucyBpbiBhIHN1cnZleS5cbiAgICogQHBhcmFtIHZpc2libGVPbmx5IHNldCBpdCBgdHJ1ZWAsIGlmIHlvdSB3YW50IHRvIGdldCBvbmx5IHZpc2libGUgcXVlc3Rpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsUXVlc3Rpb25zKFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxRdWVzdGlvbj4oKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5hZGRRdWVzdGlvbnNUb0xpc3QoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgdmlzaWJsZU9ubHksXG4gICAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgcXVpeiBxdWVzdGlvbnMuIEFsbCB2aXNpYmxlIHF1ZXN0aW9ucyB0aGF0IGhhcyBpbnB1dChzKSB3aWRnZXRzLlxuICAgKiBAc2VlIGdldFF1aXpRdWVzdGlvbkNvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0UXVpelF1ZXN0aW9ucygpOiBBcnJheTxJUXVlc3Rpb24+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PElRdWVzdGlvbj4oKTtcbiAgICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkID8gMSA6IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMucGFnZXNbaV0uaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhZ2VzW2ldLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBxID0gcXVlc3Rpb25zW2pdO1xuICAgICAgICBpZiAocS5xdWl6UXVlc3Rpb25Db3VudCA+IDApIHtcbiAgICAgICAgICByZXN1bHQucHVzaChxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcGFuZWwgYnkgaXRzIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIGEgcGFuZWwgbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeU5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRQYW5lbEJ5TmFtZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2VcbiAgKTogSVBhbmVsIHtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5nZXRBbGxQYW5lbHMoKTtcbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYW5lbE5hbWUgPSBwYW5lbHNbaV0ubmFtZTtcbiAgICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpIHBhbmVsTmFtZSA9IHBhbmVsTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHBhbmVsTmFtZSA9PSBuYW1lKSByZXR1cm4gcGFuZWxzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHN1cnZleSdzIHBhbmVscy5cbiAgICovXG4gIHB1YmxpYyBnZXRBbGxQYW5lbHMoXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8SVBhbmVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUGFuZWw+KCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uYWRkUGFuZWxzSW50b0xpc3QocmVzdWx0LCB2aXNpYmxlT25seSwgaW5jbHVkaW5nRGVzaWduVGltZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgcGFnZSwgYnV0IGRvIG5vdCBhZGQgaXQgaW50byB0aGUgc3VydmV5LlxuICAgKiBZb3UgY2FuIHVzZSBhZGRQYWdlKHBhZ2UpIGZ1bmN0aW9uIHRvIGFkZCBpdCBpbnRvIHN1cnZleSBsYXRlci5cbiAgICogQHNlZSBhZGRQYWdlXG4gICAqIEBzZWUgYWRkTmV3UGFnZVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZU5ld1BhZ2UobmFtZTogc3RyaW5nKTogUGFnZU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFBhZ2VNb2RlbChuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgcXVlc3Rpb25PblZhbHVlQ2hhbmdpbmcodmFsdWVOYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLm9uVmFsdWVDaGFuZ2luZy5pc0VtcHR5KSByZXR1cm4gbmV3VmFsdWU7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBuYW1lOiB2YWx1ZU5hbWUsXG4gICAgICBxdWVzdGlvbjogdGhpcy5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKHZhbHVlTmFtZSksXG4gICAgICB2YWx1ZTogdGhpcy5nZXRVbmJpbmRWYWx1ZShuZXdWYWx1ZSksXG4gICAgICBvbGRWYWx1ZTogdGhpcy5nZXRWYWx1ZSh2YWx1ZU5hbWUpLFxuICAgIH07XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdpbmcuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlUXVlc3Rpb25WYWx1ZSh2YWx1ZU5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWUodmFsdWVOYW1lKTtcbiAgICBpZiAoISFxdWVzdGlvbnMpIHtcbiAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHFWYWx1ZSA9IHF1ZXN0aW9uc1tpXS52YWx1ZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChxVmFsdWUgPT09IG5ld1ZhbHVlICYmIEFycmF5LmlzQXJyYXkocVZhbHVlKSAmJiAhIXRoaXMuZWRpdGluZ09iaikgfHxcbiAgICAgICAgICAhdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHFWYWx1ZSwgbmV3VmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgIHF1ZXN0aW9uc1tpXS51cGRhdGVWYWx1ZUZyb21TdXJ2ZXkobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2hlY2tRdWVzdGlvbkVycm9yT25WYWx1ZUNoYW5nZWQocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNOYXZpZ2F0aW9uQnV0dG9uUHJlc3NlZCAmJlxuICAgICAgKHRoaXMuY2hlY2tFcnJvcnNNb2RlID09PSBcIm9uVmFsdWVDaGFuZ2VkXCIgfHxcbiAgICAgICAgcXVlc3Rpb24uZ2V0QWxsRXJyb3JzKCkubGVuZ3RoID4gMClcbiAgICApIHtcbiAgICAgIHRoaXMuY2hlY2tRdWVzdGlvbkVycm9yT25WYWx1ZUNoYW5nZWRDb3JlKHF1ZXN0aW9uKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjaGVja1F1ZXN0aW9uRXJyb3JPblZhbHVlQ2hhbmdlZENvcmUocXVlc3Rpb246IFF1ZXN0aW9uKTogYm9vbGVhbiB7XG4gICAgdmFyIG9sZEVycm9yQ291bnQgPSBxdWVzdGlvbi5nZXRBbGxFcnJvcnMoKS5sZW5ndGg7XG4gICAgdmFyIHJlcyA9IHF1ZXN0aW9uLmhhc0Vycm9ycyh0cnVlLCB7XG4gICAgICBpc09uVmFsdWVDaGFuZ2VkOiAhdGhpcy5pc1ZhbGlkYXRlT25WYWx1ZUNoYW5naW5nLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICEhcXVlc3Rpb24ucGFnZSAmJlxuICAgICAgKG9sZEVycm9yQ291bnQgPiAwIHx8IHF1ZXN0aW9uLmdldEFsbEVycm9ycygpLmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICB0aGlzLmZpcmVWYWxpZGF0ZWRFcnJvcnNPblBhZ2UoPFBhZ2VNb2RlbD5xdWVzdGlvbi5wYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGNoZWNrRXJyb3JzT25WYWx1ZUNoYW5naW5nKFxuICAgIHZhbHVlTmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZSh2YWx1ZU5hbWUpO1xuICAgIGlmICghcXVlc3Rpb25zKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKCF0aGlzLmlzVHdvVmFsdWVFcXVhbHMocS52YWx1ZUZvclN1cnZleSwgbmV3VmFsdWUpKSB7XG4gICAgICAgIHEudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNoZWNrUXVlc3Rpb25FcnJvck9uVmFsdWVDaGFuZ2VkQ29yZShxKSkgcmVzID0gdHJ1ZTtcbiAgICAgIHJlcyA9IHJlcyB8fCBxLmVycm9ycy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBub3RpZnlRdWVzdGlvbk9uVmFsdWVDaGFuZ2VkKHZhbHVlTmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZSh2YWx1ZU5hbWUpO1xuICAgIGlmICghIXF1ZXN0aW9ucykge1xuICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XG4gICAgICAgIHRoaXMuY2hlY2tRdWVzdGlvbkVycm9yT25WYWx1ZUNoYW5nZWQocXVlc3Rpb24pO1xuICAgICAgICBxdWVzdGlvbi5vblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgICAgbmFtZTogdmFsdWVOYW1lLFxuICAgICAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgICBuYW1lOiB2YWx1ZU5hbWUsXG4gICAgICAgIHF1ZXN0aW9uOiBudWxsLFxuICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5jaGVja0JpbmRpbmdzKHZhbHVlTmFtZSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKHZhbHVlTmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9PT0gXCJwcm9jZXNzaW5nXCIpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmdDb25kaXRpb25zKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbk5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVBbGxRdWVzdGlvbnNWYWx1ZSgpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IDxRdWVzdGlvbj5xdWVzdGlvbnNbaV07XG4gICAgICB2YXIgdmFsTmFtZSA9IHEuZ2V0VmFsdWVOYW1lKCk7XG4gICAgICBxLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh0aGlzLmdldFZhbHVlKHZhbE5hbWUpKTtcbiAgICAgIGlmIChxLnJlcXVpcmVVcGRhdGVDb21tZW50VmFsdWUpIHtcbiAgICAgICAgcS51cGRhdGVDb21tZW50RnJvbVN1cnZleSh0aGlzLmdldENvbW1lbnQodmFsTmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIG5vdGlmeUFsbFF1ZXN0aW9uc09uVmFsdWVDaGFuZ2VkKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5vblN1cnZleVZhbHVlQ2hhbmdlZChcbiAgICAgICAgdGhpcy5nZXRWYWx1ZShxdWVzdGlvbnNbaV0uZ2V0VmFsdWVOYW1lKCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNoZWNrT25QYWdlVHJpZ2dlcnMoKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0Q3VycmVudFBhZ2VRdWVzdGlvbnModHJ1ZSk7XG4gICAgdmFyIHZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIHZhciBuYW1lID0gcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCk7XG4gICAgICB2YWx1ZXNbbmFtZV0gPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmFkZENhbGN1bGF0ZWRWYWx1ZXNJbnRvRmlsdGVyZWRWYWx1ZXModmFsdWVzKTtcbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnModmFsdWVzLCB0cnVlKTtcbiAgfVxuICBwcml2YXRlIGdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKFxuICAgIGluY2x1ZGVJbnZzaWJsZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgdmFyIHJlc3VsdDogQXJyYXk8UXVlc3Rpb24+ID0gW107XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuIHJlc3VsdDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2UucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBwYWdlLnF1ZXN0aW9uc1tpXTtcbiAgICAgIGlmICgoIWluY2x1ZGVJbnZzaWJsZSAmJiAhcXVlc3Rpb24udmlzaWJsZSkgfHwgIXF1ZXN0aW9uLm5hbWUpIGNvbnRpbnVlO1xuICAgICAgcmVzdWx0LnB1c2gocXVlc3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgaXNUcmlnZ2VySXNSdW5uaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgdHJpZ2dlclZhbHVlczogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSB0cmlnZ2VyS2V5czogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBjaGVja1RyaWdnZXJzKGtleTogYW55LCBpc09uTmV4dFBhZ2U6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlZCB8fCB0aGlzLnRyaWdnZXJzLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNUcmlnZ2VySXNSdW5uaW5nKSB7XG4gICAgICB0aGlzLnRyaWdnZXJWYWx1ZXMgPSB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCk7XG4gICAgICBmb3IgKHZhciBrIGluIGtleSkge1xuICAgICAgICB0aGlzLnRyaWdnZXJLZXlzW2tdID0ga2V5W2tdO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzVHJpZ2dlcklzUnVubmluZyA9IHRydWU7XG4gICAgdGhpcy50cmlnZ2VyS2V5cyA9IGtleTtcbiAgICB0aGlzLnRyaWdnZXJWYWx1ZXMgPSB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdHJpZ2dlciA9IHRoaXMudHJpZ2dlcnNbaV07XG4gICAgICBpZiAodHJpZ2dlci5pc09uTmV4dFBhZ2UgPT0gaXNPbk5leHRQYWdlKSB7XG4gICAgICAgIHRyaWdnZXIuY2hlY2tFeHByZXNzaW9uKFxuICAgICAgICAgIHRoaXMudHJpZ2dlcktleXMsXG4gICAgICAgICAgdGhpcy50cmlnZ2VyVmFsdWVzLFxuICAgICAgICAgIHByb3BlcnRpZXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pc1RyaWdnZXJJc1J1bm5pbmcgPSBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGRvRWxlbWVudHNPbkxvYWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLm9uU3VydmV5TG9hZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNvbmRpdGlvblZhbHVlczogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBnZXQgaXNSdW5uaW5nQ29uZGl0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbmRpdGlvblZhbHVlcztcbiAgfVxuICBwcml2YXRlIGlzVmFsdWVDaGFuZ2VkT25SdW5uaW5nQ29uZGl0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgY29uZGl0aW9uUnVubmVyQ291bnRlcjogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBjb25kaXRpb25VcGRhdGVWaXNpYmxlSW5kZXhlczogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGNvbmRpdGlvbk5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9ucygpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzQ29tcGxldGVkIHx8XG4gICAgICB0aGlzLmlzRW5kTG9hZGluZ0Zyb21Kc29uID09PSBcInByb2Nlc3NpbmdcIiB8fFxuICAgICAgdGhpcy5pc1J1bm5pbmdDb25kaXRpb25zXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuY29uZGl0aW9uVmFsdWVzID0gdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgICB2YXIgb2xkQ3VycmVudFBhZ2VJbmRleCA9IHRoaXMucGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlVmFsdWUpO1xuICAgIHRoaXMucnVuQ29uZGl0aW9uc0NvcmUocHJvcGVydGllcyk7XG4gICAgdGhpcy5jaGVja0lmTmV3UGFnZXNCZWNvbWVWaXNpYmxlKG9sZEN1cnJlbnRQYWdlSW5kZXgpO1xuICAgIHRoaXMuY29uZGl0aW9uVmFsdWVzID0gbnVsbDtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzVmFsdWVDaGFuZ2VkT25SdW5uaW5nQ29uZGl0aW9uICYmXG4gICAgICB0aGlzLmNvbmRpdGlvblJ1bm5lckNvdW50ZXIgPFxuICAgICAgICBzZXR0aW5ncy5tYXhpbXVtQ29uZGl0aW9uUnVuQ291bnRPblZhbHVlQ2hhbmdlZFxuICAgICkge1xuICAgICAgdGhpcy5pc1ZhbHVlQ2hhbmdlZE9uUnVubmluZ0NvbmRpdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5jb25kaXRpb25SdW5uZXJDb3VudGVyKys7XG4gICAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc1ZhbHVlQ2hhbmdlZE9uUnVubmluZ0NvbmRpdGlvbiA9IGZhbHNlO1xuICAgICAgdGhpcy5jb25kaXRpb25SdW5uZXJDb3VudGVyID0gMDtcbiAgICAgIGlmICh0aGlzLmNvbmRpdGlvblVwZGF0ZVZpc2libGVJbmRleGVzKSB7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uVXBkYXRlVmlzaWJsZUluZGV4ZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29uZGl0aW9uTm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5jb25kaXRpb25Ob3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKFwiXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbk9uVmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmlzUnVubmluZ0NvbmRpdGlvbnMpIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uVmFsdWVzW25hbWVdID0gdmFsdWU7XG4gICAgICB0aGlzLmlzVmFsdWVDaGFuZ2VkT25SdW5uaW5nQ29uZGl0aW9uID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9uc0NvcmUocHJvcGVydGllczogYW55KSB7XG4gICAgdmFyIHBhZ2VzID0gdGhpcy5wYWdlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FsY3VsYXRlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jYWxjdWxhdGVkVmFsdWVzW2ldLnJlc2V0Q2FsY3VsYXRpb24oKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlZFZhbHVlc1tpXS5kb0NhbGN1bGF0aW9uKFxuICAgICAgICB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXMsXG4gICAgICAgIHRoaXMuY29uZGl0aW9uVmFsdWVzLFxuICAgICAgICBwcm9wZXJ0aWVzXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYWdlc1tpXS5ydW5Db25kaXRpb24odGhpcy5jb25kaXRpb25WYWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNoZWNrSWZOZXdQYWdlc0JlY29tZVZpc2libGUob2xkQ3VycmVudFBhZ2VJbmRleDogbnVtYmVyKSB7XG4gICAgdmFyIG5ld0N1cnJlbnRQYWdlSW5kZXggPSB0aGlzLnBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZVZhbHVlKTtcbiAgICBpZiAobmV3Q3VycmVudFBhZ2VJbmRleCA8PSBvbGRDdXJyZW50UGFnZUluZGV4ICsgMSkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSBvbGRDdXJyZW50UGFnZUluZGV4ICsgMTsgaSA8IG5ld0N1cnJlbnRQYWdlSW5kZXg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucGFnZXNbaV0uaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNlbmRzIGEgc3VydmV5IHJlc3VsdCB0byB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UuXG4gICAqIEBwYXJhbSBwb3N0SWQgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UgcG9zdElkXG4gICAqIEBwYXJhbSBjbGllbnRJZCBUeXBpY2FsbHkgYSBjdXN0b21lciBlLW1haWwgb3IgYW4gaWRlbnRpZmllclxuICAgKiBAcGFyYW0gaXNQYXJ0aWFsQ29tcGxldGVkIFNldCBpdCB0byBgdHJ1ZWAgaWYgdGhlIHN1cnZleSBpcyBub3QgY29tcGxldGVkIHlldCBhbmQgdGhlIHJlc3VsdHMgYXJlIGludGVybWVkaWF0ZVxuICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgKiBAc2VlIGNsaWVudElkXG4gICAqL1xuICBwdWJsaWMgc2VuZFJlc3VsdChcbiAgICBwb3N0SWQ6IHN0cmluZyA9IG51bGwsXG4gICAgY2xpZW50SWQ6IHN0cmluZyA9IG51bGwsXG4gICAgaXNQYXJ0aWFsQ29tcGxldGVkOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHJldHVybjtcbiAgICBpZiAoaXNQYXJ0aWFsQ29tcGxldGVkICYmIHRoaXMub25QYXJ0aWFsU2VuZCkge1xuICAgICAgdGhpcy5vblBhcnRpYWxTZW5kLmZpcmUodGhpcywgbnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKCFwb3N0SWQgJiYgdGhpcy5zdXJ2ZXlQb3N0SWQpIHtcbiAgICAgIHBvc3RJZCA9IHRoaXMuc3VydmV5UG9zdElkO1xuICAgIH1cbiAgICBpZiAoIXBvc3RJZCkgcmV0dXJuO1xuICAgIGlmIChjbGllbnRJZCkge1xuICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkO1xuICAgIH1cbiAgICBpZiAoaXNQYXJ0aWFsQ29tcGxldGVkICYmICF0aGlzLmNsaWVudElkKSByZXR1cm47XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLnN1cnZleVNob3dEYXRhU2F2aW5nKSB7XG4gICAgICB0aGlzLnNldENvbXBsZXRlZFN0YXRlKFwic2F2aW5nXCIsIFwiXCIpO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5zZW5kUmVzdWx0KFxuICAgICAgcG9zdElkLFxuICAgICAgdGhpcy5kYXRhLFxuICAgICAgZnVuY3Rpb24oc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSwgcmVxdWVzdDogYW55KSB7XG4gICAgICAgIGlmIChzZWxmLnN1cnZleVNob3dEYXRhU2F2aW5nKSB7XG4gICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJzdWNjZXNzXCIsIFwiXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwiZXJyb3JcIiwgcmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZWxmLm9uU2VuZFJlc3VsdC5maXJlKHNlbGYsIHtcbiAgICAgICAgICBzdWNjZXNzOiBzdWNjZXNzLFxuICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0LFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0aGlzLmNsaWVudElkLFxuICAgICAgaXNQYXJ0aWFsQ29tcGxldGVkXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbHMgdGhlIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlIGFuZCwgb24gY2FsbGJhY2ssIGZpcmVzIHRoZSBgb25HZXRSZXN1bHRgIGV2ZW50IHdpdGggYWxsIGFuc3dlcnMgdGhhdCB5b3VyIHVzZXJzIG1hZGUgZm9yIGEgcXVlc3Rpb24uXG4gICAqIEBwYXJhbSByZXN1bHRJZCBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZSByZXN1bHRJZFxuICAgKiBAcGFyYW0gbmFtZSBUaGUgcXVlc3Rpb24gbmFtZVxuICAgKiBAc2VlIG9uR2V0UmVzdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0UmVzdWx0KHJlc3VsdElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5nZXRSZXN1bHQocmVzdWx0SWQsIG5hbWUsIGZ1bmN0aW9uKFxuICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgIGRhdGE6IGFueSxcbiAgICAgIGRhdGFMaXN0OiBhbnlbXSxcbiAgICAgIHJlc3BvbnNlOiBhbnlcbiAgICApIHtcbiAgICAgIHNlbGYub25HZXRSZXN1bHQuZmlyZShzZWxmLCB7XG4gICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3MsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGRhdGFMaXN0OiBkYXRhTGlzdCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBzdXJ2ZXkgSlNPTiBmcm9tIHRoZSBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZS5cbiAgICogSWYgYGNsaWVudElkYCBpcyBub3QgYG51bGxgIGFuZCBhIHVzZXIgaGFkIGNvbXBsZXRlZCBhIHN1cnZleSBiZWZvcmUsIHRoZSBzdXJ2ZXkgc3dpdGNoZXMgdG8gYGNvbXBsZXRlZGJlZm9yZWAgc3RhdGUuXG4gICAqIEBwYXJhbSBzdXJ2ZXlJZCBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZSBzdXJ2ZXlJZFxuICAgKiBAcGFyYW0gY2xpZW50SWQgdXNlcnMnIGluZGVudGlmaWVyLCBmb3IgZXhhbXBsZSBhbiBlLW1haWwgb3IgYSB1bmlxdWUgY3VzdG9tZXIgaWQgaW4geW91ciB3ZWIgYXBwbGljYXRpb24uXG4gICAqIEBzZWUgc3RhdGVcbiAgICogQHNlZSBvbkxvYWRlZFN1cnZleUZyb21TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgbG9hZFN1cnZleUZyb21TZXJ2aWNlKFxuICAgIHN1cnZleUlkOiBzdHJpbmcgPSBudWxsLFxuICAgIGNsaWVuZElkOiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIGlmIChzdXJ2ZXlJZCkge1xuICAgICAgdGhpcy5zdXJ2ZXlJZCA9IHN1cnZleUlkO1xuICAgIH1cbiAgICBpZiAoY2xpZW5kSWQpIHtcbiAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbmRJZDtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLm9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCk7XG4gICAgaWYgKGNsaWVuZElkKSB7XG4gICAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5nZXRTdXJ2ZXlKc29uQW5kSXNDb21wbGV0ZWQoXG4gICAgICAgIHRoaXMuc3VydmV5SWQsXG4gICAgICAgIHRoaXMuY2xpZW50SWQsXG4gICAgICAgIGZ1bmN0aW9uKFxuICAgICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgICAganNvbjogc3RyaW5nLFxuICAgICAgICAgIGlzQ29tcGxldGVkOiBzdHJpbmcsXG4gICAgICAgICAgcmVzcG9uc2U6IGFueVxuICAgICAgICApIHtcbiAgICAgICAgICBzZWxmLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICBzZWxmLmlzQ29tcGxldGVkQmVmb3JlID0gaXNDb21wbGV0ZWQgPT0gXCJjb21wbGV0ZWRcIjtcbiAgICAgICAgICAgIHNlbGYubG9hZFN1cnZleUZyb21TZXJ2aWNlSnNvbihqc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLmxvYWRTdXJ2ZXkodGhpcy5zdXJ2ZXlJZCwgZnVuY3Rpb24oXG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICAgIHJlc3VsdDogc3RyaW5nLFxuICAgICAgICByZXNwb25zZTogYW55XG4gICAgICApIHtcbiAgICAgICAgc2VsZi5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICBzZWxmLmxvYWRTdXJ2ZXlGcm9tU2VydmljZUpzb24ocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgbG9hZFN1cnZleUZyb21TZXJ2aWNlSnNvbihqc29uOiBhbnkpIHtcbiAgICBpZiAoIWpzb24pIHJldHVybjtcbiAgICB0aGlzLmZyb21KU09OKGpzb24pO1xuICAgIHRoaXMubm90aWZ5QWxsUXVlc3Rpb25zT25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLm9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCk7XG4gICAgdGhpcy5vbkxvYWRlZFN1cnZleUZyb21TZXJ2aWNlLmZpcmUodGhpcywge30pO1xuICB9XG4gIHByb3RlY3RlZCBvbkxvYWRpbmdTdXJ2ZXlGcm9tU2VydmljZSgpIHt9XG4gIHByb3RlY3RlZCBvbkxvYWRTdXJ2ZXlGcm9tU2VydmljZSgpIHt9XG4gIHByaXZhdGUgcmVzZXRWaXNpYmxlSW5kZXhlcygpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnModHJ1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5zZXRWaXNpYmxlSW5kZXgoLTEpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlSW5kZXhlcygpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCAhIXRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzUnVubmluZ0NvbmRpdGlvbnMgJiZcbiAgICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZC5pc0VtcHR5ICYmXG4gICAgICB0aGlzLm9uUGFnZVZpc2libGVDaGFuZ2VkLmlzRW1wdHlcbiAgICApIHtcbiAgICAgIC8vUnVuIHVwZGF0ZSB2aXNpYmxlIGluZGV4IG9ubHkgb25lIHRpbWUgb24gZmluaXNoaW5nIHJ1bm5pbmcgY29uZGl0aW9uc1xuICAgICAgdGhpcy5jb25kaXRpb25VcGRhdGVWaXNpYmxlSW5kZXhlcyA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXBkYXRlUGFnZVZpc2libGVJbmRleGVzKHRoaXMuc2hvd1BhZ2VOdW1iZXJzKTtcbiAgICBpZiAodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25QYWdlXCIpIHtcbiAgICAgIHZhciB2aXNQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2aXNQYWdlc1tpXS5zZXRWaXNpYmxlSW5kZXgoMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9uXCIgPyAwIDogLTE7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW5kZXggKz0gdGhpcy5wYWdlc1tpXS5zZXRWaXNpYmxlSW5kZXgoaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVByb2dyZXNzVGV4dCh0cnVlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVBhZ2VWaXNpYmxlSW5kZXhlcyhzaG93SW5kZXg6IGJvb2xlYW4pIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlzUGFnZVZpc2libGUgPSB0aGlzLnBhZ2VzW2ldLmlzVmlzaWJsZTtcbiAgICAgIHRoaXMucGFnZXNbaV0udmlzaWJsZUluZGV4ID0gaXNQYWdlVmlzaWJsZSA/IGluZGV4KysgOiAtMTtcbiAgICAgIHRoaXMucGFnZXNbaV0ubnVtID1cbiAgICAgICAgc2hvd0luZGV4ICYmIGlzUGFnZVZpc2libGUgPyB0aGlzLnBhZ2VzW2ldLnZpc2libGVJbmRleCArIDEgOiAtMTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGZyb21KU09OKGpzb246IGFueSkge1xuICAgIGlmICghanNvbikgcmV0dXJuO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNDbGVhcigpO1xuICAgIHRoaXMuanNvbkVycm9ycyA9IG51bGw7XG4gICAgdmFyIGpzb25Db252ZXJ0ZXIgPSBuZXcgSnNvbk9iamVjdCgpO1xuICAgIGpzb25Db252ZXJ0ZXIudG9PYmplY3QoanNvbiwgdGhpcyk7XG4gICAgaWYgKGpzb25Db252ZXJ0ZXIuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuanNvbkVycm9ycyA9IGpzb25Db252ZXJ0ZXIuZXJyb3JzO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0SnNvbk9iamVjdChqc29uT2JqOiBhbnkpIHtcbiAgICB0aGlzLmZyb21KU09OKGpzb25PYmopO1xuICB9XG4gIHByaXZhdGUgaXNFbmRMb2FkaW5nRnJvbUpzb246IHN0cmluZyA9IG51bGw7XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICB0aGlzLmlzRW5kTG9hZGluZ0Zyb21Kc29uID0gXCJwcm9jZXNzaW5nXCI7XG4gICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSA9IHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkO1xuICAgIHRoaXMub25RdWVzdGlvbnNPblBhZ2VNb2RlQ2hhbmdlZChcInN0YW5kYXJkXCIpO1xuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIGlmICh0aGlzLmhhc0Nvb2tpZSkge1xuICAgICAgdGhpcy5kb0NvbXBsZXRlKCk7XG4gICAgfVxuICAgIHRoaXMuZG9FbGVtZW50c09uTG9hZCgpO1xuICAgIHRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gPSBcImNvbmRpdGlvbnNcIjtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKFwiXCIpO1xuICAgIHRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gPSBudWxsO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CZWZvcmVDcmVhdGluZygpIHt9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge31cbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzLmdldFByb2Nlc3NlZFRleHRWYWx1ZUNvcmUodGV4dFZhbHVlKTtcbiAgICBpZiAoIXRoaXMub25Qcm9jZXNzVGV4dFZhbHVlLmlzRW1wdHkpIHtcbiAgICAgIHZhciB3YXNFbXB0eSA9IHRoaXMuaXNWYWx1ZUVtcHR5KHRleHRWYWx1ZS52YWx1ZSk7XG4gICAgICB0aGlzLm9uUHJvY2Vzc1RleHRWYWx1ZS5maXJlKHRoaXMsIHRleHRWYWx1ZSk7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPVxuICAgICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgfHwgKHdhc0VtcHR5ICYmICF0aGlzLmlzVmFsdWVFbXB0eSh0ZXh0VmFsdWUudmFsdWUpKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWVDb3JlKHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKTogdm9pZCB7XG4gICAgdmFyIG5hbWUgPSB0ZXh0VmFsdWUubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIGlmIChbXCJub1wiLCBcInJlcXVpcmVcIiwgXCJ0aXRsZVwiXS5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJwYWdlbm9cIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHBhZ2UgIT0gbnVsbCA/IHRoaXMudmlzaWJsZVBhZ2VzLmluZGV4T2YocGFnZSkgKyAxIDogMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwicGFnZWNvdW50XCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLnZpc2libGVQYWdlQ291bnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImxvY2FsZVwiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gISF0aGlzLmxvY2FsZVxuICAgICAgICA/IHRoaXMubG9jYWxlXG4gICAgICAgIDogc3VydmV5TG9jYWxpemF0aW9uLmRlZmF1bHRMb2NhbGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImNvcnJlY3RlZGFuc3dlcnNcIiB8fCBuYW1lID09PSBcImNvcnJlY3RlZGFuc3dlcmNvdW50XCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLmdldENvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImluY29ycmVjdGVkYW5zd2Vyc1wiIHx8IG5hbWUgPT09IFwiaW5jb3JyZWN0ZWRhbnN3ZXJjb3VudFwiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdGhpcy5nZXRJbkNvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcInF1ZXN0aW9uY291bnRcIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMuZ2V0UXVpelF1ZXN0aW9uQ291bnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHZhcmlhYmxlID0gdGhpcy5nZXRWYXJpYWJsZShuYW1lKTtcbiAgICBpZiAodmFyaWFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHZhcmlhYmxlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldEZpcnN0TmFtZShuYW1lKTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB2YXIgZmlyc3ROYW1lID0gcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIG5hbWUgPSBmaXJzdE5hbWUgKyBuYW1lLnN1YnN0cihmaXJzdE5hbWUubGVuZ3RoKTtcbiAgICAgIG5hbWUgPSBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgdmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICAgIHZhbHVlc1tmaXJzdE5hbWVdID0gdGV4dFZhbHVlLnJldHVybkRpc3BsYXlWYWx1ZVxuICAgICAgICA/IHF1ZXN0aW9uLmdldERpc3BsYXlWYWx1ZShmYWxzZSwgdW5kZWZpbmVkKVxuICAgICAgICA6IHF1ZXN0aW9uLnZhbHVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldFZhbHVlKG5hbWUsIHZhbHVlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUodGV4dFZhbHVlLm5hbWUpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0Rmlyc3ROYW1lKG5hbWU6IHN0cmluZyk6IElRdWVzdGlvbiB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcXVlc3Rpb247XG4gICAgZG8ge1xuICAgICAgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUobmFtZSwgdHJ1ZSk7XG4gICAgICBuYW1lID0gdGhpcy5yZWR1Y2VGaXJzdE5hbWUobmFtZSk7XG4gICAgfSB3aGlsZSAoIXF1ZXN0aW9uICYmICEhbmFtZSk7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG4gIHByaXZhdGUgcmVkdWNlRmlyc3ROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHBvczEgPSBuYW1lLmxhc3RJbmRleE9mKFwiLlwiKTtcbiAgICB2YXIgcG9zMiA9IG5hbWUubGFzdEluZGV4T2YoXCJbXCIpO1xuICAgIGlmIChwb3MxIDwgMCAmJiBwb3MyIDwgMCkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHBvcyA9IE1hdGgubWF4KHBvczEsIHBvczIpO1xuICAgIHJldHVybiBuYW1lLnN1YnN0cigwLCBwb3MpO1xuICB9XG4gIHByaXZhdGUgY2xlYXJVbnVzZWRWYWx1ZXMoKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLmNsZWFyVW51c2VkVmFsdWVzKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNsZWFySW52aXNpYmxlVmFsdWVzICE9IFwibm9uZVwiKSB7XG4gICAgICB0aGlzLmNsZWFySW52aXNpYmxlUXVlc3Rpb25WYWx1ZXMoKTtcbiAgICB9XG4gIH1cbiAgaGFzVmlzaWJsZVF1ZXN0aW9uQnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZSh2YWx1ZU5hbWUpO1xuICAgIGlmICghcXVlc3Rpb25zKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHF1ZXN0aW9uc1tpXS5pc1Zpc2libGUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcXVlc3Rpb25Db3VudEJ5VmFsdWVOYW1lKHZhbHVlTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZSh2YWx1ZU5hbWUpO1xuICAgIHJldHVybiAhIXF1ZXN0aW9ucyA/IHF1ZXN0aW9ucy5sZW5ndGggOiAwO1xuICB9XG4gIHByaXZhdGUgY2xlYXJJbnZpc2libGVRdWVzdGlvblZhbHVlcygpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0uY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdmFyaWFibGUgdmFsdWUuIFZhcmlhYmxlLCB1bmxpa2UgdmFsdWVzLCBhcmUgbm90IHN0b3JlZCBpbiB0aGUgc3VydmV5IHJlc3VsdHMuXG4gICAqIEBwYXJhbSBuYW1lIEEgdmFyaWFibGUgbmFtZVxuICAgKiBAc2VlIFNldFZhcmlhYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlcyA9IHRoaXMudmFyaWFibGVzSGFzaFtuYW1lXTtcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHJlcykpIHJldHVybiByZXM7XG4gICAgaWYgKG5hbWUuaW5kZXhPZihcIi5cIikgPiAtMSB8fCBuYW1lLmluZGV4T2YoXCJbXCIpID4gLTEpIHtcbiAgICAgIGlmIChuZXcgUHJvY2Vzc1ZhbHVlKCkuaGFzVmFsdWUobmFtZSwgdGhpcy52YXJpYWJsZXNIYXNoKSlcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZShuYW1lLCB0aGlzLnZhcmlhYmxlc0hhc2gpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIGEgdmFyaWFibGUgdmFsdWUuIFZhcmlhYmxlLCB1bmxpa2UgdmFsdWVzLCBhcmUgbm90IHN0b3JlZCBpbiB0aGUgc3VydmV5IHJlc3VsdHMuXG4gICAqIEBwYXJhbSBuYW1lIEEgdmFyaWFibGUgbmFtZVxuICAgKiBAcGFyYW0gbmV3VmFsdWUgQSB2YXJpYWJsZSBuZXcgdmFsdWVcbiAgICogQHNlZSBHZXRWYXJpYWJsZVxuICAgKi9cbiAgcHVibGljIHNldFZhcmlhYmxlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy52YXJpYWJsZXNIYXNoW25hbWVdID0gbmV3VmFsdWU7XG4gICAgdGhpcy5ub3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZChuYW1lKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbk9uVmFsdWVDaGFuZ2VkKG5hbWUsIG5ld1ZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbGwgdmFyaWFibGVzIGluIHRoZSBzdXJ2ZXkuIFVzZSBzZXRWYXJpYWJsZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgdmFyaWFibGUuXG4gICAqIEBzZWUgZ2V0VmFyaWFibGVcbiAgICogQHNlZSBzZXRWYXJpYWJsZVxuICAgKi9cbiAgcHVibGljIGdldFZhcmlhYmxlTmFtZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhcmlhYmxlc0hhc2gpIHtcbiAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLy9JU3VydmV5IGRhdGFcbiAgcHJvdGVjdGVkIGdldFVuYmluZFZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICghIXRoaXMuZWRpdGluZ09iaikgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHF1ZXN0aW9uIHZhbHVlIChhbnN3ZXIpIGJ5IGEgcXVlc3Rpb24ncyBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSBBIHF1ZXN0aW9uIG5hbWVcbiAgICogQHNlZSBkYXRhXG4gICAqIEBzZWUgc2V0VmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghbmFtZSB8fCBuYW1lLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBuYW1lKTtcbiAgICByZXR1cm4gdGhpcy5nZXRVbmJpbmRWYWx1ZSh2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgYSBxdWVzdGlvbiB2YWx1ZSAoYW5zd2VyKS4gSXQgcnVucyBhbGwgdHJpZ2dlcnMgYW5kIGNvbmRpdGlvbnMgKGB2aXNpYmxlSWZgIHByb3BlcnRpZXMpLlxuICAgKlxuICAgKiBHb2VzIHRvIHRoZSBuZXh0IHBhZ2UgaWYgYGdvTmV4dFBhZ2VBdXRvbWF0aWNgIGlzIGB0cnVlYCBhbmQgYWxsIHF1ZXN0aW9ucyBvbiB0aGUgY3VycmVudCBwYWdlIGFyZSBhbnN3ZXJlZCBjb3JyZWN0bHkuXG4gICAqIEBwYXJhbSBuYW1lIEEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gbmV3VmFsdWUgQSBuZXcgcXVlc3Rpb24gdmFsdWVcbiAgICogQHNlZSBkYXRhXG4gICAqIEBzZWUgZ2V0VmFsdWVcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJsZUlmXG4gICAqIEBzZWUgUXVlc3Rpb24udmlzaWJsZUlmXG4gICAqIEBzZWUgZ29OZXh0UGFnZUF1dG9tYXRpY1xuICAgKi9cbiAgcHVibGljIHNldFZhbHVlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdRdWVzdGlvblZhbHVlOiBhbnksXG4gICAgbG9jTm90aWZpY2F0aW9uOiBhbnkgPSBmYWxzZSxcbiAgICBhbGxvd05vdGlmeVZhbHVlQ2hhbmdlZDogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdmFyIG5ld1ZhbHVlID0gbmV3UXVlc3Rpb25WYWx1ZTtcbiAgICBpZiAoYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQpIHtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy5xdWVzdGlvbk9uVmFsdWVDaGFuZ2luZyhuYW1lLCBuZXdRdWVzdGlvblZhbHVlKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1ZhbGlkYXRlT25WYWx1ZUNoYW5naW5nICYmXG4gICAgICB0aGlzLmNoZWNrRXJyb3JzT25WYWx1ZUNoYW5naW5nKG5hbWUsIG5ld1ZhbHVlKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5lZGl0aW5nT2JqICYmXG4gICAgICB0aGlzLmlzVmFsdWVFcXVhbChuYW1lLCBuZXdWYWx1ZSkgJiZcbiAgICAgIHRoaXMuaXNUd29WYWx1ZUVxdWFscyhuZXdWYWx1ZSwgbmV3UXVlc3Rpb25WYWx1ZSlcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZShuYW1lKTtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkobmV3VmFsdWUpKSB7XG4gICAgICB0aGlzLmRlbGV0ZURhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWUgPSB0aGlzLmdldFVuYmluZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgIHRoaXMuc2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVPblNldFZhbHVlKFxuICAgICAgbmFtZSxcbiAgICAgIG5ld1ZhbHVlLFxuICAgICAgb2xkVmFsdWUsXG4gICAgICBsb2NOb3RpZmljYXRpb24sXG4gICAgICBhbGxvd05vdGlmeVZhbHVlQ2hhbmdlZFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVPblNldFZhbHVlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogYW55LFxuICAgIG9sZFZhbHVlOiBhbnksXG4gICAgbG9jTm90aWZpY2F0aW9uOiBhbnkgPSBmYWxzZSxcbiAgICBhbGxvd05vdGlmeVZhbHVlQ2hhbmdlZDogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy51cGRhdGVRdWVzdGlvblZhbHVlKG5hbWUsIG5ld1ZhbHVlKTtcbiAgICBpZiAobG9jTm90aWZpY2F0aW9uID09PSB0cnVlIHx8IHRoaXMuaXNEaXNwb3NlZCkgcmV0dXJuO1xuICAgIHZhciB0cmlnZ2VyS2V5czogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgdHJpZ2dlcktleXNbbmFtZV0gPSB7IG5ld1ZhbHVlOiBuZXdWYWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlIH07XG4gICAgdGhpcy5ydW5Db25kaXRpb25PblZhbHVlQ2hhbmdlZChuYW1lLCBuZXdWYWx1ZSk7XG4gICAgdGhpcy5jaGVja1RyaWdnZXJzKHRyaWdnZXJLZXlzLCBmYWxzZSk7XG4gICAgaWYgKGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkKVxuICAgICAgdGhpcy5ub3RpZnlRdWVzdGlvbk9uVmFsdWVDaGFuZ2VkKG5hbWUsIG5ld1ZhbHVlKTtcbiAgICBpZiAobG9jTm90aWZpY2F0aW9uICE9PSBcInRleHRcIikge1xuICAgICAgdGhpcy50cnlHb05leHRQYWdlQXV0b21hdGljKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVByb2dyZXNzVGV4dCh0cnVlKTtcbiAgfVxuICBwcml2YXRlIGlzVmFsdWVFcXVhbChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAobmV3VmFsdWUgPT09IFwiXCIgfHwgbmV3VmFsdWUgPT09IHVuZGVmaW5lZCkgbmV3VmFsdWUgPSBudWxsO1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUobmFtZSk7XG4gICAgaWYgKG9sZFZhbHVlID09PSBcIlwiIHx8IG9sZFZhbHVlID09PSB1bmRlZmluZWQpIG9sZFZhbHVlID0gbnVsbDtcbiAgICBpZiAobmV3VmFsdWUgPT09IG51bGwgfHwgb2xkVmFsdWUgPT09IG51bGwpIHJldHVybiBuZXdWYWx1ZSA9PT0gb2xkVmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuaXNUd29WYWx1ZUVxdWFscyhuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBkb09uUGFnZUFkZGVkKHBhZ2U6IFBhZ2VNb2RlbCkge1xuICAgIHBhZ2Uuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICBpZiAoIXBhZ2UubmFtZSkgcGFnZS5uYW1lID0gdGhpcy5nZW5lcmF0ZU5ld05hbWUodGhpcy5wYWdlcywgXCJwYWdlXCIpO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNQYW5lbEFkZGVkKHBhZ2UpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHtcbiAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3NUZXh0KCk7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0geyBwYWdlOiBwYWdlIH07XG4gICAgdGhpcy5vblBhZ2VBZGRlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIHByb3RlY3RlZCBkb09uUGFnZVJlbW92ZWQocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgcGFnZS5zZXRTdXJ2ZXlJbXBsKG51bGwpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHtcbiAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3NUZXh0KCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlTGF6eVJlbmRlcmluZ1Jvd3NPblJlbW92aW5nRWxlbWVudHMoKTtcbiAgfVxuICBwcml2YXRlIGdlbmVyYXRlTmV3TmFtZShlbGVtZW50czogQXJyYXk8YW55PiwgYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIGtleXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIGtleXNbZWxlbWVudHNbaV1bXCJuYW1lXCJdXSA9IHRydWU7XG4gICAgdmFyIGluZGV4ID0gMTtcbiAgICB3aGlsZSAoa2V5c1tiYXNlTmFtZSArIGluZGV4XSkgaW5kZXgrKztcbiAgICByZXR1cm4gYmFzZU5hbWUgKyBpbmRleDtcbiAgfVxuICBwcm90ZWN0ZWQgdHJ5R29OZXh0UGFnZUF1dG9tYXRpYyhuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgICF0aGlzLmdvTmV4dFBhZ2VBdXRvbWF0aWMgfHxcbiAgICAgICF0aGlzLmN1cnJlbnRQYWdlXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj50aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUobmFtZSk7XG4gICAgaWYgKFxuICAgICAgIXF1ZXN0aW9uIHx8XG4gICAgICAoISFxdWVzdGlvbiAmJlxuICAgICAgICAoIXF1ZXN0aW9uLnZpc2libGUgfHwgIXF1ZXN0aW9uLnN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkpKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAocXVlc3Rpb24uaGFzRXJyb3JzKGZhbHNlKSAmJiAhcXVlc3Rpb24uc3VwcG9ydEdvTmV4dFBhZ2VFcnJvcigpKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0Q3VycmVudFBhZ2VRdWVzdGlvbnMoKTtcbiAgICBpZiAocXVlc3Rpb25zLmluZGV4T2YocXVlc3Rpb24pIDwgMCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmhhc0lucHV0ICYmIHF1ZXN0aW9uc1tpXS5pc0VtcHR5KCkpIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNoZWNrSXNDdXJyZW50UGFnZUhhc0Vycm9ycyhmYWxzZSkpIHtcbiAgICAgIGlmICghdGhpcy5pc0xhc3RQYWdlKSB7XG4gICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmdvTmV4dFBhZ2VBdXRvbWF0aWMgPT09IHRydWUgJiZcbiAgICAgICAgICB0aGlzLmFsbG93Q29tcGxldGVTdXJ2ZXlBdXRvbWF0aWNcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZUxhc3RQYWdlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbW1lbnQgdmFsdWUuXG4gICAqIEBwYXJhbSBuYW1lIEEgY29tbWVudCdzIG5hbWUuXG4gICAqIEBzZWUgc2V0Q29tbWVudFxuICAgKi9cbiAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhW25hbWUgKyB0aGlzLmNvbW1lbnRQcmVmaXhdO1xuICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gXCJcIjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIGEgY29tbWVudCB2YWx1ZS5cbiAgICogQHBhcmFtIG5hbWUgQSBjb21tZW50IG5hbWUuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSBBIG5ldyBjb21tZW50IHZhbHVlLlxuICAgKiBAc2VlIGdldENvbW1lbnRcbiAgICovXG4gIHB1YmxpYyBzZXRDb21tZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogc3RyaW5nLFxuICAgIGxvY05vdGlmaWNhdGlvbjogYW55ID0gZmFsc2VcbiAgKSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgbmV3VmFsdWUgPSBcIlwiO1xuICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIHRoaXMuZ2V0Q29tbWVudChuYW1lKSkpIHJldHVybjtcbiAgICB2YXIgY29tbWVudE5hbWUgPSBuYW1lICsgdGhpcy5jb21tZW50UHJlZml4O1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlRGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGNvbW1lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwgY29tbWVudE5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWUobmFtZSk7XG4gICAgaWYgKCEhcXVlc3Rpb25zKSB7XG4gICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHF1ZXN0aW9uc1tpXS51cGRhdGVDb21tZW50RnJvbVN1cnZleShuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMuY2hlY2tRdWVzdGlvbkVycm9yT25WYWx1ZUNoYW5nZWQocXVlc3Rpb25zW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxvY05vdGlmaWNhdGlvbiAhPT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHRoaXMudHJ5R29OZXh0UGFnZUF1dG9tYXRpYyhuYW1lKTtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIG5hbWU6IGNvbW1lbnROYW1lLFxuICAgICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVtb3ZlcyBhIHZhbHVlIGZyb20gdGhlIHN1cnZleSByZXN1bHRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUuIFR5cGljYWxseSBpdCBpcyBhIHF1ZXN0aW9uIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJWYWx1ZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFZhbHVlKG5hbWUsIG51bGwpO1xuICAgIHRoaXMuc2V0Q29tbWVudChuYW1lLCBudWxsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdG8gY2xlYXIgdmFsdWUgb24gZGlzYWJsZSBpdGVtcyBpbiBjaGVja2JveCwgZHJvcGRvd24gYW5kIHJhZGlvZ3JvdXAgcXVlc3Rpb25zLlxuICAgKiBCeSBkZWZhdWx0LCB2YWx1ZXMgYXJlIG5vdCBjbGVhcmVkIG9uIGRpc2FibGVkIHRoZSBjb3JyZXNwb25kZWQgaXRlbXMuIFRoaXMgcHJvcGVydHkgaXMgbm90IHBlcnNpc3RlZCBpbiBzdXJ2ZXkgSlNPTiBhbmQgeW91IGhhdmUgdG8gc2V0IGl0IGluIGNvZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNsZWFyVmFsdWVPbkRpc2FibGVJdGVtcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsZWFyVmFsdWVPbkRpc2FibGVJdGVtcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjbGVhclZhbHVlT25EaXNhYmxlSXRlbXNcIiwgdmFsKTtcbiAgfVxuICBnZXQgaXNDbGVhclZhbHVlT25IaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2xlYXJJbnZpc2libGVWYWx1ZXMgPT0gXCJvbkhpZGRlblwiIHx8XG4gICAgICB0aGlzLmlzQ2xlYXJWYWx1ZU9uSGlkZGVuQ29udGFpbmVyXG4gICAgKTtcbiAgfVxuICBnZXQgaXNDbGVhclZhbHVlT25IaWRkZW5Db250YWluZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2xlYXJJbnZpc2libGVWYWx1ZXMgPT0gXCJvbkhpZGRlbkNvbnRhaW5lclwiICYmXG4gICAgICAhdGhpcy5pc1Nob3dpbmdQcmV2aWV3ICYmXG4gICAgICAhdGhpcy5ydW5uaW5nUGFnZXNcbiAgICApO1xuICB9XG4gIHF1ZXN0aW9uVmlzaWJpbGl0eUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgbmFtZTogcXVlc3Rpb24ubmFtZSxcbiAgICAgIHZpc2libGU6IG5ld1ZhbHVlLFxuICAgIH0pO1xuICB9XG4gIHBhZ2VWaXNpYmlsaXR5Q2hhbmdlZChwYWdlOiBJUGFnZSwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIGlmIChuZXdWYWx1ZSAmJiAhdGhpcy5jdXJyZW50UGFnZVZhbHVlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlVmFsdWUgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblBhZ2VWaXNpYmxlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICB2aXNpYmxlOiBuZXdWYWx1ZSxcbiAgICB9KTtcbiAgfVxuICBwYW5lbFZpc2liaWxpdHlDaGFuZ2VkKHBhbmVsOiBJUGFuZWwsIG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYW5lbFZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgdmlzaWJsZTogbmV3VmFsdWUsXG4gICAgfSk7XG4gIH1cbiAgcXVlc3Rpb25DcmVhdGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBhbnkge1xuICAgIHRoaXMub25RdWVzdGlvbkNyZWF0ZWQuZmlyZSh0aGlzLCB7IHF1ZXN0aW9uOiBxdWVzdGlvbiB9KTtcbiAgfVxuICBxdWVzdGlvbkFkZGVkKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYXJlbnRQYW5lbDogYW55LFxuICAgIHJvb3RQYW5lbDogYW55XG4gICkge1xuICAgIGlmICghcXVlc3Rpb24ubmFtZSkge1xuICAgICAgcXVlc3Rpb24ubmFtZSA9IHRoaXMuZ2VuZXJhdGVOZXdOYW1lKFxuICAgICAgICB0aGlzLmdldEFsbFF1ZXN0aW9ucyhmYWxzZSwgdHJ1ZSksXG4gICAgICAgIFwicXVlc3Rpb25cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKDxRdWVzdGlvbj5xdWVzdGlvbikucGFnZSkge1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlc0FkZGVkKDxRdWVzdGlvbj5xdWVzdGlvbik7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUXVlc3Rpb25BZGRlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBwYXJlbnRQYW5lbDogcGFyZW50UGFuZWwsXG4gICAgICByb290UGFuZWw6IHJvb3RQYW5lbCxcbiAgICB9KTtcbiAgfVxuICBxdWVzdGlvblJlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbikge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNSZW1vdmVkKFxuICAgICAgPFF1ZXN0aW9uPnF1ZXN0aW9uLFxuICAgICAgcXVlc3Rpb24ubmFtZSxcbiAgICAgIHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblF1ZXN0aW9uUmVtb3ZlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVMYXp5UmVuZGVyaW5nUm93c09uUmVtb3ZpbmdFbGVtZW50cygpO1xuICB9XG4gIHF1ZXN0aW9uUmVuYW1lZChcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIG9sZE5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZU5hbWU6IHN0cmluZ1xuICApOiBhbnkge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNSZW1vdmVkKDxRdWVzdGlvbj5xdWVzdGlvbiwgb2xkTmFtZSwgb2xkVmFsdWVOYW1lKTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQWRkZWQoPFF1ZXN0aW9uPnF1ZXN0aW9uKTtcbiAgfVxuICBwcml2YXRlIHF1ZXN0aW9uSGFzaGVzID0ge1xuICAgIG5hbWVzOiB7fSxcbiAgICBuYW1lc0luc2Vuc2l0aXZlOiB7fSxcbiAgICB2YWx1ZU5hbWVzOiB7fSxcbiAgICB2YWx1ZU5hbWVzSW5zZW5zaXRpdmU6IHt9LFxuICB9O1xuICBwcml2YXRlIHF1ZXN0aW9uSGFzaGVzQ2xlYXIoKSB7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcyA9IHt9O1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXNJbnNlbnNpdGl2ZSA9IHt9O1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lcyA9IHt9O1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lc0luc2Vuc2l0aXZlID0ge307XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hlc1BhbmVsQWRkZWQocGFuZWw6IFBhbmVsTW9kZWxCYXNlKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gcGFuZWwucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzQWRkZWQocXVlc3Rpb25zW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hlc0FkZGVkKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoQWRkZWRDb3JlKFxuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcyxcbiAgICAgIHF1ZXN0aW9uLFxuICAgICAgcXVlc3Rpb24ubmFtZVxuICAgICk7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hBZGRlZENvcmUoXG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzSW5zZW5zaXRpdmUsXG4gICAgICBxdWVzdGlvbixcbiAgICAgIHF1ZXN0aW9uLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hBZGRlZENvcmUoXG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLnZhbHVlTmFtZXMsXG4gICAgICBxdWVzdGlvbixcbiAgICAgIHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpXG4gICAgKTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaEFkZGVkQ29yZShcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lc0luc2Vuc2l0aXZlLFxuICAgICAgcXVlc3Rpb24sXG4gICAgICBxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKS50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHF1ZXN0aW9uSGFzaGVzUmVtb3ZlZChcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlTmFtZTogc3RyaW5nXG4gICkge1xuICAgIGlmICghIW5hbWUpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUodGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcywgcXVlc3Rpb24sIG5hbWUpO1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hSZW1vdmVkQ29yZShcbiAgICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lc0luc2Vuc2l0aXZlLFxuICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgbmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISF2YWx1ZU5hbWUpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUoXG4gICAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lcyxcbiAgICAgICAgcXVlc3Rpb24sXG4gICAgICAgIHZhbHVlTmFtZVxuICAgICAgKTtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoUmVtb3ZlZENvcmUoXG4gICAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lc0luc2Vuc2l0aXZlLFxuICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgdmFsdWVOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoQWRkZWRDb3JlKGhhc2g6IGFueSwgcXVlc3Rpb246IFF1ZXN0aW9uLCBuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgcmVzID0gaGFzaFtuYW1lXTtcbiAgICBpZiAoISFyZXMpIHtcbiAgICAgIHZhciByZXMgPSBoYXNoW25hbWVdO1xuICAgICAgaWYgKHJlcy5pbmRleE9mKHF1ZXN0aW9uKSA8IDApIHtcbiAgICAgICAgcmVzLnB1c2gocXVlc3Rpb24pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYXNoW25hbWVdID0gW3F1ZXN0aW9uXTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hSZW1vdmVkQ29yZShoYXNoOiBhbnksIHF1ZXN0aW9uOiBRdWVzdGlvbiwgbmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHJlcyA9IGhhc2hbbmFtZV07XG4gICAgaWYgKCFyZXMpIHJldHVybjtcbiAgICB2YXIgaW5kZXggPSByZXMuaW5kZXhPZihxdWVzdGlvbik7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICBpZiAocmVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBkZWxldGUgaGFzaFtuYW1lXTtcbiAgICB9XG4gIH1cbiAgcGFuZWxBZGRlZChwYW5lbDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIsIHBhcmVudFBhbmVsOiBhbnksIHJvb3RQYW5lbDogYW55KSB7XG4gICAgaWYgKCFwYW5lbC5uYW1lKSB7XG4gICAgICBwYW5lbC5uYW1lID0gdGhpcy5nZW5lcmF0ZU5ld05hbWUoXG4gICAgICAgIHRoaXMuZ2V0QWxsUGFuZWxzKGZhbHNlLCB0cnVlKSxcbiAgICAgICAgXCJwYW5lbFwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzUGFuZWxBZGRlZCg8UGFuZWxNb2RlbEJhc2U+KDxhbnk+cGFuZWwpKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblBhbmVsQWRkZWQuZmlyZSh0aGlzLCB7XG4gICAgICBwYW5lbDogcGFuZWwsXG4gICAgICBuYW1lOiBwYW5lbC5uYW1lLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgcGFyZW50UGFuZWw6IHBhcmVudFBhbmVsLFxuICAgICAgcm9vdFBhbmVsOiByb290UGFuZWwsXG4gICAgfSk7XG4gIH1cbiAgcGFuZWxSZW1vdmVkKHBhbmVsOiBJRWxlbWVudCkge1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUGFuZWxSZW1vdmVkLmZpcmUodGhpcywgeyBwYW5lbDogcGFuZWwsIG5hbWU6IHBhbmVsLm5hbWUgfSk7XG4gICAgdGhpcy51cGRhdGVMYXp5UmVuZGVyaW5nUm93c09uUmVtb3ZpbmdFbGVtZW50cygpO1xuICB9XG4gIHZhbGlkYXRlUXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbik6IFN1cnZleUVycm9yIHtcbiAgICBpZiAodGhpcy5vblZhbGlkYXRlUXVlc3Rpb24uaXNFbXB0eSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBuYW1lOiBxdWVzdGlvbi5uYW1lLFxuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgdmFsdWU6IHF1ZXN0aW9uLnZhbHVlLFxuICAgICAgZXJyb3I6IDxhbnk+bnVsbCxcbiAgICB9O1xuICAgIHRoaXMub25WYWxpZGF0ZVF1ZXN0aW9uLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXJyb3IgPyBuZXcgQ3VzdG9tRXJyb3Iob3B0aW9ucy5lcnJvciwgdGhpcykgOiBudWxsO1xuICB9XG4gIHZhbGlkYXRlUGFuZWwocGFuZWw6IElQYW5lbCk6IFN1cnZleUVycm9yIHtcbiAgICBpZiAodGhpcy5vblZhbGlkYXRlUGFuZWwuaXNFbXB0eSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBuYW1lOiBwYW5lbC5uYW1lLFxuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgZXJyb3I6IDxhbnk+bnVsbCxcbiAgICB9O1xuICAgIHRoaXMub25WYWxpZGF0ZVBhbmVsLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXJyb3IgPyBuZXcgQ3VzdG9tRXJyb3Iob3B0aW9ucy5lcnJvciwgdGhpcykgOiBudWxsO1xuICB9XG4gIHByb2Nlc3NIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IGh0bWw6IGh0bWwgfTtcbiAgICB0aGlzLm9uUHJvY2Vzc0h0bWwuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dChvcHRpb25zLmh0bWwsIHRydWUpO1xuICB9XG4gIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dEV4KHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSwgZmFsc2UpLnRleHQ7XG4gIH1cbiAgcHJvY2Vzc1RleHRFeChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuLFxuICAgIGRvRW5jb2Rpbmc6IGJvb2xlYW5cbiAgKTogYW55IHtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgdGV4dDogdGhpcy5wcm9jZXNzVGV4dENvcmUodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBkb0VuY29kaW5nKSxcbiAgICAgIGhhc0FsbFZhbHVlc09uTGFzdFJ1bjogdHJ1ZSxcbiAgICB9O1xuICAgIHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IuaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBwcm9jZXNzVGV4dENvcmUoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbixcbiAgICBkb0VuY29kaW5nOiBib29sZWFuID0gZmFsc2VcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiB0ZXh0O1xuICAgIHJldHVybiB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2Vzcyh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUsIGRvRW5jb2RpbmcpO1xuICB9XG4gIGdldFN1cnZleU1hcmtkb3duSHRtbChlbGVtZW50OiBCYXNlLCB0ZXh0OiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgdGV4dDogdGV4dCxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICBodG1sOiA8YW55Pm51bGwsXG4gICAgfTtcbiAgICB0aGlzLm9uVGV4dE1hcmtkb3duLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuaHRtbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBhbW91bnQgb2YgY29ycmVjdGVkIHF1aXogYW5zd2Vycy5cbiAgICovXG4gIHB1YmxpYyBnZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldENvcnJlY3RlZEFuc3dlckNvdW50Q29yZSh0cnVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBxdWl6IHF1ZXN0aW9uIG51bWJlci4gSXQgbWF5IGJlIGRpZmZlcmVudCBmcm9tIGBnZXRRdWl6UXVlc3Rpb25zLmxlbmd0aGAgYmVjYXVzZSBzb21lIHdpZGdldHMgbGlrZSBtYXRyaXggbWF5IGhhdmUgc2V2ZXJhbCBxdWVzdGlvbnMuXG4gICAqIEBzZWUgZ2V0UXVpelF1ZXN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldFF1aXpRdWVzdGlvbkNvdW50KCk6IG51bWJlciB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVpelF1ZXN0aW9ucygpO1xuICAgIHZhciByZXMgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMgKz0gKDxRdWVzdGlvbj5xdWVzdGlvbnNbaV0pLnF1aXpRdWVzdGlvbkNvdW50O1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFtb3VudCBvZiBpbmNvcnJlY3QgcXVpeiBhbnN3ZXJzLlxuICAgKi9cbiAgcHVibGljIGdldEluQ29ycmVjdGVkQW5zd2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudENvcmUoZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnRDb3JlKGlzQ29ycmVjdDogYm9vbGVhbik6IG51bWJlciB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVpelF1ZXN0aW9ucygpO1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHF1ZXN0aW9uOiA8SVF1ZXN0aW9uPm51bGwsXG4gICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgY29ycmVjdEFuc3dlcnM6IDAsXG4gICAgICBpbmNvcnJlY3RBbnN3ZXJzOiAwLFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gPFF1ZXN0aW9uPnF1ZXN0aW9uc1tpXTtcbiAgICAgIHZhciBxdWl6UXVlc3Rpb25Db3VudCA9IHEucXVpelF1ZXN0aW9uQ291bnQ7XG4gICAgICBvcHRpb25zLnF1ZXN0aW9uID0gcTtcbiAgICAgIG9wdGlvbnMuY29ycmVjdEFuc3dlcnMgPSBxLmNvcnJlY3RBbnN3ZXJDb3VudDtcbiAgICAgIG9wdGlvbnMuaW5jb3JyZWN0QW5zd2VycyA9IHF1aXpRdWVzdGlvbkNvdW50IC0gb3B0aW9ucy5jb3JyZWN0QW5zd2VycztcbiAgICAgIG9wdGlvbnMucmVzdWx0ID0gb3B0aW9ucy5xdWVzdGlvbi5pc0Fuc3dlckNvcnJlY3QoKTtcbiAgICAgIHRoaXMub25Jc0Fuc3dlckNvcnJlY3QuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICAgIGlmIChpc0NvcnJlY3QpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucmVzdWx0IHx8IG9wdGlvbnMuY29ycmVjdEFuc3dlcnMgPCBxdWl6UXVlc3Rpb25Db3VudCkge1xuICAgICAgICAgIHZhciBhZGRDb3VudCA9IG9wdGlvbnMuY29ycmVjdEFuc3dlcnM7XG4gICAgICAgICAgaWYgKGFkZENvdW50ID09IDAgJiYgb3B0aW9ucy5yZXN1bHQpIGFkZENvdW50ID0gMTtcbiAgICAgICAgICBjb3VudGVyICs9IGFkZENvdW50O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIW9wdGlvbnMucmVzdWx0IHx8IG9wdGlvbnMuaW5jb3JyZWN0QW5zd2VycyA8IHF1aXpRdWVzdGlvbkNvdW50KSB7XG4gICAgICAgICAgY291bnRlciArPSBvcHRpb25zLmluY29ycmVjdEFuc3dlcnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH1cbiAgZ2V0Q29ycmVjdGVkQW5zd2VycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldENvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gIH1cbiAgZ2V0SW5Db3JyZWN0ZWRBbnN3ZXJzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW5Db3JyZWN0ZWRBbnN3ZXJDb3VudCgpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSB0aW1lciBwYW5lbCBwb3NpdGlvbi4gVGhlIHRpbWVyIHBhbmVsIGRpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IGhvdyBtdWNoIHRpbWUgYW4gZW5kIHVzZXIgc3BlbmRzIG9uIGEgc3VydmV5L3BhZ2UuXG4gICAqXG4gICAqIFRoZSBhdmFpbGFibGUgb3B0aW9uczpcbiAgICogLSBgdG9wYCAtIGRpc3BsYXkgdGltZXIgcGFuZWwgaW4gdGhlIHRvcC5cbiAgICogLSBgYm90dG9tYCAtIGRpc3BsYXkgdGltZXIgcGFuZWwgaW4gdGhlIGJvdHRvbS5cbiAgICogLSBgbm9uZWAgLSBkbyBub3QgZGlzcGxheSBhIHRpbWVyIHBhbmVsLlxuICAgKlxuICAgKiBJZiB0aGUgdmFsdWUgaXMgbm90IGVxdWFsIHRvICdub25lJywgdGhlIHN1cnZleSBjYWxscyB0aGUgYHN0YXJ0VGltZXIoKWAgbWV0aG9kIG9uIHN1cnZleSByZW5kZXJpbmcuXG4gICAqIEBzZWUgc2hvd1RpbWVyUGFuZWxNb2RlXG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIHN0b3BUaW1lclxuICAgKi9cbiAgcHVibGljIGdldCBzaG93VGltZXJQYW5lbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbFwiLCBcIm5vbmVcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VGltZXJQYW5lbCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUaW1lclBhbmVsXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc1RpbWVyUGFuZWxTaG93aW5nT25Ub3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUaW1lclN0YXJ0ZWQgJiYgdGhpcy5zaG93VGltZXJQYW5lbCA9PSBcInRvcFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNUaW1lclBhbmVsU2hvd2luZ09uQm90dG9tKCkge1xuICAgIHJldHVybiB0aGlzLmlzVGltZXJTdGFydGVkICYmIHRoaXMuc2hvd1RpbWVyUGFuZWwgPT0gXCJib3R0b21cIjtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXQgYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSB0aW1lciBkaXNwbGF5cyBpbmZvcm1hdGlvbiBmb3IgdGhlIHBhZ2Ugb3IgZm9yIHRoZSBlbnRpcmUgc3VydmV5LlxuICAgKlxuICAgKiBUaGUgYXZhaWxhYmxlIG9wdGlvbnM6XG4gICAqXG4gICAqIC0gYHBhZ2VgIC0gc2hvdyB0aW1lciBpbmZvcm1hdGlvbiBmb3IgcGFnZVxuICAgKiAtIGBzdXJ2ZXlgIC0gc2hvdyB0aW1lciBpbmZvcm1hdGlvbiBmb3Igc3VydmV5XG4gICAqXG4gICAqIFVzZSB0aGUgYG9uVGltZXJQYW5lbEluZm9UZXh0YCBldmVudCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogQHNlZSBzaG93VGltZXJQYW5lbFxuICAgKiBAc2VlIG9uVGltZXJQYW5lbEluZm9UZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dUaW1lclBhbmVsTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbE1vZGVcIiwgXCJhbGxcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VGltZXJQYW5lbE1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbE1vZGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRpbWVySW5mb1RleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgdGV4dDogdGhpcy5nZXRUaW1lckluZm9UZXh0KCkgfTtcbiAgICB0aGlzLm9uVGltZXJQYW5lbEluZm9UZXh0LmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgdmFyIGxvYyA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyh0aGlzLCB0cnVlKTtcbiAgICBsb2MudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICByZXR1cm4gbG9jLnRleHRPckh0bWw7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUaW1lckluZm9UZXh0KCkge1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAoIXBhZ2UpIHJldHVybiBcIlwiO1xuICAgIHZhciBwYWdlU3BlbnQgPSB0aGlzLmdldERpc3BsYXlUaW1lKHBhZ2UudGltZVNwZW50KTtcbiAgICB2YXIgc3VydmV5U3BlbnQgPSB0aGlzLmdldERpc3BsYXlUaW1lKHRoaXMudGltZVNwZW50KTtcbiAgICB2YXIgcGFnZUxpbWl0U2VjID0gdGhpcy5nZXRQYWdlTWF4VGltZVRvRmluaXNoKHBhZ2UpO1xuICAgIHZhciBwYWdlTGltaXQgPSB0aGlzLmdldERpc3BsYXlUaW1lKHBhZ2VMaW1pdFNlYyk7XG4gICAgdmFyIHN1cnZleUxpbWl0ID0gdGhpcy5nZXREaXNwbGF5VGltZSh0aGlzLm1heFRpbWVUb0ZpbmlzaCk7XG4gICAgaWYgKHRoaXMuc2hvd1RpbWVyUGFuZWxNb2RlID09IFwicGFnZVwiKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGltZXJJbmZvUGFnZVRleHQocGFnZSwgcGFnZVNwZW50LCBwYWdlTGltaXQpO1xuICAgIGlmICh0aGlzLnNob3dUaW1lclBhbmVsTW9kZSA9PSBcInN1cnZleVwiKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGltZXJJbmZvU3VydmV5VGV4dChzdXJ2ZXlTcGVudCwgc3VydmV5TGltaXQpO1xuICAgIGlmICh0aGlzLnNob3dUaW1lclBhbmVsTW9kZSA9PSBcImFsbFwiKSB7XG4gICAgICBpZiAocGFnZUxpbWl0U2VjIDw9IDAgJiYgdGhpcy5tYXhUaW1lVG9GaW5pc2ggPD0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lclNwZW50QWxsXCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICAgIHBhZ2VTcGVudCxcbiAgICAgICAgICBzdXJ2ZXlTcGVudFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBhZ2VMaW1pdFNlYyA+IDAgJiYgdGhpcy5tYXhUaW1lVG9GaW5pc2ggPiAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyTGltaXRBbGxcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgcGFnZVNwZW50LFxuICAgICAgICAgIHBhZ2VMaW1pdCxcbiAgICAgICAgICBzdXJ2ZXlTcGVudCxcbiAgICAgICAgICBzdXJ2ZXlMaW1pdFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbGV0IHBhZ2VUZXh0ID0gdGhpcy5nZXRUaW1lckluZm9QYWdlVGV4dChwYWdlLCBwYWdlU3BlbnQsIHBhZ2VMaW1pdCk7XG4gICAgICBsZXQgc3VydmV5VGV4dCA9IHRoaXMuZ2V0VGltZXJJbmZvU3VydmV5VGV4dChzdXJ2ZXlTcGVudCwgc3VydmV5TGltaXQpO1xuICAgICAgcmV0dXJuIHBhZ2VUZXh0ICsgXCIgXCIgKyBzdXJ2ZXlUZXh0O1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcml2YXRlIGdldFRpbWVySW5mb1BhZ2VUZXh0KFxuICAgIHBhZ2U6IFBhZ2VNb2RlbCxcbiAgICBwYWdlU3BlbnQ6IHN0cmluZyxcbiAgICBwYWdlTGltaXQ6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZSkgPiAwXG4gICAgICA/IHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJMaW1pdFBhZ2VcIilbXCJmb3JtYXRcIl0ocGFnZVNwZW50LCBwYWdlTGltaXQpXG4gICAgICA6IHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJTcGVudFBhZ2VcIilbXCJmb3JtYXRcIl0ocGFnZVNwZW50LCBwYWdlTGltaXQpO1xuICB9XG4gIHByaXZhdGUgZ2V0VGltZXJJbmZvU3VydmV5VGV4dChcbiAgICBzdXJ2ZXlTcGVudDogc3RyaW5nLFxuICAgIHN1cnZleUxpbWl0OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tYXhUaW1lVG9GaW5pc2ggPiAwXG4gICAgICA/IHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJMaW1pdFN1cnZleVwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgICBzdXJ2ZXlTcGVudCxcbiAgICAgICAgICBzdXJ2ZXlMaW1pdFxuICAgICAgICApXG4gICAgICA6IHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJTcGVudFN1cnZleVwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgICBzdXJ2ZXlTcGVudCxcbiAgICAgICAgICBzdXJ2ZXlMaW1pdFxuICAgICAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0RGlzcGxheVRpbWUodmFsOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHZhciBtaW4gPSBNYXRoLmZsb29yKHZhbCAvIDYwKTtcbiAgICB2YXIgc2VjID0gdmFsICUgNjA7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgaWYgKG1pbiA+IDApIHtcbiAgICAgIHJlcyArPSBtaW4gKyBcIiBcIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJNaW5cIik7XG4gICAgfVxuICAgIGlmIChyZXMgJiYgc2VjID09IDApIHJldHVybiByZXM7XG4gICAgaWYgKHJlcykgcmVzICs9IFwiIFwiO1xuICAgIHJldHVybiByZXMgKyBzZWMgKyBcIiBcIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJTZWNcIik7XG4gIH1cbiAgcHJpdmF0ZSB0aW1lckZ1bmM6IGFueSA9IG51bGw7XG4gIC8qKlxuICAgKiBTdGFydHMgYSB0aW1lciB0aGF0IHdpbGwgY2FsY3VsYXRlIGhvdyBtdWNoIHRpbWUgZW5kLXVzZXIgc3BlbmRzIG9uIHRoZSBzdXJ2ZXkgb3Igb24gcGFnZXMuXG4gICAqIEBzZWUgc3RvcFRpbWVyXG4gICAqIEBzZWUgdGltZVNwZW50XG4gICAqL1xuICBwdWJsaWMgc3RhcnRUaW1lcigpIHtcbiAgICBpZiAodGhpcy5pc1RpbWVyU3RhcnRlZCB8fCB0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRpbWVyRnVuYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5kb1RpbWVyKCk7XG4gICAgfTtcbiAgICB0aGlzLmlzVGltZXJTdGFydGVkID0gdHJ1ZTtcbiAgICBTdXJ2ZXlUaW1lci5pbnN0YW5jZS5zdGFydCh0aGlzLnRpbWVyRnVuYyk7XG4gIH1cbiAgc3RhcnRUaW1lckZyb21VSSgpIHtcbiAgICBpZiAodGhpcy5zaG93VGltZXJQYW5lbCAhPSBcIm5vbmVcIiAmJiB0aGlzLnN0YXRlID09PSBcInJ1bm5pbmdcIikge1xuICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgdGltZXIuXG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIHRpbWVTcGVudFxuICAgKi9cbiAgcHVibGljIHN0b3BUaW1lcigpIHtcbiAgICBpZiAoIXRoaXMuaXNUaW1lclN0YXJ0ZWQpIHJldHVybjtcbiAgICB0aGlzLmlzVGltZXJTdGFydGVkID0gZmFsc2U7XG4gICAgU3VydmV5VGltZXIuaW5zdGFuY2Uuc3RvcCh0aGlzLnRpbWVyRnVuYyk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRpbWUgaW4gc2Vjb25kcyBhbiBlbmQgdXNlciBzcGVuZHMgb24gdGhlIHN1cnZleVxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBQYWdlTW9kZWwudGltZVNwZW50XG4gICAqL1xuICBwdWJsaWMgdGltZVNwZW50ID0gMDtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4aW11bSB0aW1lIGluIHNlY29uZHMgdGhhdCBlbmQgdXNlciBoYXMgdG8gY29tcGxldGUgYSBzdXJ2ZXkuIElmIHRoZSB2YWx1ZSBpcyAwIG9yIGxlc3MsIGFuIGVuZCB1c2VyIGhhcyBubyB0aW1lIGxpbWl0IHRvIGZpbmlzaCBhIHN1cnZleS5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgbWF4VGltZVRvRmluaXNoUGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBtYXhUaW1lVG9GaW5pc2goKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VGltZVRvRmluaXNoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4aW11bSB0aW1lIGluIHNlY29uZHMgdGhhdCBlbmQgdXNlciBoYXMgdG8gY29tcGxldGUgYSBwYWdlIGluIHRoZSBzdXJ2ZXkuIElmIHRoZSB2YWx1ZSBpcyAwIG9yIGxlc3MsIGFuIGVuZCB1c2VyIGhhcyBubyB0aW1lIGxpbWl0LlxuICAgKlxuICAgKiBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgdmFsdWUgZm9yIGV2ZXJ5IHBhZ2UuXG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIG1heFRpbWVUb0ZpbmlzaFxuICAgKiBAc2VlIFBhZ2VNb2RlbC5tYXhUaW1lVG9GaW5pc2hcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4VGltZVRvRmluaXNoUGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hQYWdlXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VGltZVRvRmluaXNoUGFnZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFRpbWVUb0ZpbmlzaFBhZ2VcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgaWYgKCFwYWdlIHx8IHBhZ2UubWF4VGltZVRvRmluaXNoIDwgMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHBhZ2UubWF4VGltZVRvRmluaXNoID4gMFxuICAgICAgPyBwYWdlLm1heFRpbWVUb0ZpbmlzaFxuICAgICAgOiB0aGlzLm1heFRpbWVUb0ZpbmlzaFBhZ2U7XG4gIH1cbiAgcHJvdGVjdGVkIGRvVGltZXIoKSB7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmIChwYWdlKSB7XG4gICAgICBwYWdlLnRpbWVTcGVudCA9IHBhZ2UudGltZVNwZW50ICsgMTtcbiAgICB9XG4gICAgdGhpcy50aW1lU3BlbnQgPSB0aGlzLnRpbWVTcGVudCArIDE7XG4gICAgdGhpcy5vblRpbWVyLmZpcmUodGhpcywge30pO1xuICAgIGlmICh0aGlzLm1heFRpbWVUb0ZpbmlzaCA+IDAgJiYgdGhpcy5tYXhUaW1lVG9GaW5pc2ggPT0gdGhpcy50aW1lU3BlbnQpIHtcbiAgICAgIHRoaXMuY29tcGxldGVMYXN0UGFnZSgpO1xuICAgIH1cbiAgICBpZiAocGFnZSkge1xuICAgICAgdmFyIHBhZ2VMaW1pdCA9IHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKTtcbiAgICAgIGlmIChwYWdlTGltaXQgPiAwICYmIHBhZ2VMaW1pdCA9PSBwYWdlLnRpbWVTcGVudCkge1xuICAgICAgICBpZiAodGhpcy5pc0xhc3RQYWdlKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZUxhc3RQYWdlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaW5TdXJ2ZXkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy9JU3VydmV5SW1wbGVtZW50b3JcbiAgZ2V0U3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8vSVN1cnZleVRyaWdnZXJPd25lclxuICBnZXRPYmplY3RzKHBhZ2VzOiBzdHJpbmdbXSwgcXVlc3Rpb25zOiBzdHJpbmdbXSk6IGFueVtdIHtcbiAgICB2YXIgcmVzdWx0OiBhbnlbXSA9IFtdO1xuICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHJlc3VsdCwgdGhpcy5nZXRQYWdlc0J5TmFtZXMocGFnZXMpKTtcbiAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyZXN1bHQsIHRoaXMuZ2V0UXVlc3Rpb25zQnlOYW1lcyhxdWVzdGlvbnMpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHNldFRyaWdnZXJWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGlzVmFyaWFibGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICBpZiAoaXNWYXJpYWJsZSkge1xuICAgICAgdGhpcy5zZXRWYXJpYWJsZShuYW1lLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgICBpZiAoISFxdWVzdGlvbikge1xuICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHByb2Nlc3NvciA9IG5ldyBQcm9jZXNzVmFsdWUoKTtcbiAgICAgICAgdmFyIGZpcnN0TmFtZSA9IHByb2Nlc3Nvci5nZXRGaXJzdE5hbWUobmFtZSk7XG4gICAgICAgIGlmIChmaXJzdE5hbWUgPT0gbmFtZSkge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUobmFtZSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShmaXJzdE5hbWUpKSByZXR1cm47XG4gICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldFVuYmluZFZhbHVlKHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKSk7XG4gICAgICAgICAgcHJvY2Vzc29yLnNldFZhbHVlKGRhdGEsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlKGZpcnN0TmFtZSwgZGF0YVtmaXJzdE5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb3B5VHJpZ2dlclZhbHVlKG5hbWU6IHN0cmluZywgZnJvbU5hbWU6IHN0cmluZykge1xuICAgIGlmICghbmFtZSB8fCAhZnJvbU5hbWUpIHJldHVybjtcbiAgICB2YXIgcHJvY2Vzc29yID0gbmV3IFByb2Nlc3NWYWx1ZSgpO1xuICAgIHZhciB2YWx1ZSA9IHByb2Nlc3Nvci5nZXRWYWx1ZShmcm9tTmFtZSwgdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpKTtcbiAgICB0aGlzLnNldFRyaWdnZXJWYWx1ZShuYW1lLCB2YWx1ZSwgZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgaXNGb2N1c2luZ1F1ZXN0aW9uOiBib29sZWFuO1xuICBmb2N1c1F1ZXN0aW9uKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSwgdHJ1ZSk7XG4gICAgaWYgKCFxdWVzdGlvbiB8fCAhcXVlc3Rpb24uaXNWaXNpYmxlIHx8ICFxdWVzdGlvbi5wYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5pc0ZvY3VzaW5nUXVlc3Rpb24gPSB0cnVlO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSA8UGFnZU1vZGVsPnF1ZXN0aW9uLnBhZ2U7XG4gICAgcXVlc3Rpb24uZm9jdXMoKTtcbiAgICB0aGlzLmlzRm9jdXNpbmdRdWVzdGlvbiA9IGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXRFbGVtZW50V3JhcHBlckNvbXBvbmVudE5hbWUoZWxlbWVudDogYW55LCByZWFzb24/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChyZWFzb24gPT09IFwibG9nby1pbWFnZVwiKSB7XG4gICAgICByZXR1cm4gXCJzdi1sb2dvLWltYWdlXCI7XG4gICAgfVxuICAgIHJldHVybiBTdXJ2ZXlNb2RlbC5UZW1wbGF0ZVJlbmRlcmVyQ29tcG9uZW50TmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0Um93V3JhcHBlckNvbXBvbmVudE5hbWUocm93OiBRdWVzdGlvblJvd01vZGVsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3VydmV5TW9kZWwuVGVtcGxhdGVSZW5kZXJlckNvbXBvbmVudE5hbWU7XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50RGF0YShlbGVtZW50OiBhbnksIHJlYXNvbj86IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbiAgcHVibGljIGdldFJvd1dyYXBwZXJDb21wb25lbnREYXRhKHJvdzogUXVlc3Rpb25Sb3dNb2RlbCk6IGFueSB7XG4gICAgcmV0dXJuIHJvdztcbiAgfVxuICBwdWJsaWMgZ2V0SXRlbVZhbHVlV3JhcHBlckNvbXBvbmVudE5hbWUoXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvblNlbGVjdEJhc2VcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3VydmV5TW9kZWwuVGVtcGxhdGVSZW5kZXJlckNvbXBvbmVudE5hbWU7XG4gIH1cbiAgcHVibGljIGdldEl0ZW1WYWx1ZVdyYXBwZXJDb21wb25lbnREYXRhKFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBxdWVzdGlvbjogUXVlc3Rpb25TZWxlY3RCYXNlXG4gICk6IGFueSB7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cbiAgcHVibGljIGdldE1hdHJpeENlbGxUZW1wbGF0ZURhdGEoY2VsbDogYW55KSB7XG4gICAgcmV0dXJuIGNlbGwucXVlc3Rpb247XG4gIH1cbiAgcHVibGljIHNlYXJjaFRleHQodGV4dDogc3RyaW5nKTogQXJyYXk8SUZpbmRFbGVtZW50PiB7XG4gICAgaWYgKCEhdGV4dCkgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcmVzOiBBcnJheTxJRmluZEVsZW1lbnQ+ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLnNlYXJjaFRleHQodGV4dCwgcmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGRpc3Bvc2Ugc3VydmV5IG1vZGVsIHByb3Blcmx5LlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIHRoaXMuZWRpdGluZ09iaiA9IG51bGw7XG4gICAgaWYgKCF0aGlzLnBhZ2VzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5wYWdlcy5zcGxpY2UoMCwgdGhpcy5wYWdlcy5sZW5ndGgpO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBudWxsO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXCJzdXJ2ZXlcIiwgW1xuICB7XG4gICAgbmFtZTogXCJsb2NhbGVcIixcbiAgICBjaG9pY2VzOiAoKSA9PiB7XG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldExvY2FsZXModHJ1ZSk7XG4gICAgfSxcbiAgICBvbkdldFZhbHVlOiAob2JqOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgcmV0dXJuIG9iai5sb2NhbGUgPT0gc3VydmV5TG9jYWxpemF0aW9uLmRlZmF1bHRMb2NhbGUgPyBudWxsIDogb2JqLmxvY2FsZTtcbiAgICB9LFxuICB9LFxuICB7IG5hbWU6IFwidGl0bGVcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIsIGRlcGVuZHNPbjogXCJsb2NhbGVcIiB9LFxuICB7XG4gICAgbmFtZTogXCJkZXNjcmlwdGlvbjp0ZXh0XCIsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0Rlc2NyaXB0aW9uXCIsXG4gICAgZGVwZW5kc09uOiBcImxvY2FsZVwiLFxuICB9LFxuICB7IG5hbWU6IFwibG9nb1wiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTG9nb1wiIH0sXG4gIHsgbmFtZTogXCJsb2dvV2lkdGhcIiwgZGVmYXVsdDogXCIzMDBweFwiLCBtaW5WYWx1ZTogMCB9LFxuICB7IG5hbWU6IFwibG9nb0hlaWdodFwiLCBkZWZhdWx0OiBcIjIwMHB4XCIsIG1pblZhbHVlOiAwIH0sXG4gIHtcbiAgICBuYW1lOiBcImxvZ29GaXRcIixcbiAgICBkZWZhdWx0OiBcImNvbnRhaW5cIixcbiAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwiY29udGFpblwiLCBcImNvdmVyXCIsIFwiZmlsbFwiXSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwibG9nb1Bvc2l0aW9uXCIsXG4gICAgZGVmYXVsdDogXCJsZWZ0XCIsXG4gICAgY2hvaWNlczogW1wibm9uZVwiLCBcImxlZnRcIiwgXCJyaWdodFwiLCBcInRvcFwiLCBcImJvdHRvbVwiXSxcbiAgfSxcbiAgeyBuYW1lOiBcImZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYzpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcImZvY3VzT25GaXJzdEVycm9yOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwiY29tcGxldGVkSHRtbDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb21wbGV0ZWRIdG1sXCIgfSxcbiAge1xuICAgIG5hbWU6IFwiY29tcGxldGVkQmVmb3JlSHRtbDpodG1sXCIsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbXBsZXRlZEJlZm9yZUh0bWxcIixcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uOmh0bWxjb25kaXRpb25zXCIsXG4gICAgY2xhc3NOYW1lOiBcImh0bWxjb25kaXRpb25pdGVtXCIsXG4gIH0sXG4gIHsgbmFtZTogXCJsb2FkaW5nSHRtbDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMb2FkaW5nSHRtbFwiIH0sXG4gIHsgbmFtZTogXCJwYWdlczpzdXJ2ZXlwYWdlc1wiLCBjbGFzc05hbWU6IFwicGFnZVwiIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uc1wiLFxuICAgIGFsdGVybmF0aXZlTmFtZTogXCJlbGVtZW50c1wiLFxuICAgIGJhc2VDbGFzc05hbWU6IFwicXVlc3Rpb25cIixcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBpc0xpZ2h0U2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICBvbkdldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSk6IGFueSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIG9uU2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55LCB2YWx1ZTogYW55LCBqc29uQ29udmVydGVyOiBhbnkpIHtcbiAgICAgIHZhciBwYWdlID0gb2JqLmFkZE5ld1BhZ2UoXCJcIik7XG4gICAgICBqc29uQ29udmVydGVyLnRvT2JqZWN0KHsgcXVlc3Rpb25zOiB2YWx1ZSB9LCBwYWdlKTtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJ0cmlnZ2Vyczp0cmlnZ2Vyc1wiLFxuICAgIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dHJpZ2dlclwiLFxuICAgIGNsYXNzTmFtZVBhcnQ6IFwidHJpZ2dlclwiLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJjYWxjdWxhdGVkVmFsdWVzOmNhbGN1bGF0ZWR2YWx1ZXNcIixcbiAgICBjbGFzc05hbWU6IFwiY2FsY3VsYXRlZHZhbHVlXCIsXG4gIH0sXG4gIHsgbmFtZTogXCJzdXJ2ZXlJZFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICB7IG5hbWU6IFwic3VydmV5UG9zdElkXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIHsgbmFtZTogXCJzdXJ2ZXlTaG93RGF0YVNhdmluZzpib29sZWFuXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIFwiY29va2llTmFtZVwiLFxuICBcInNlbmRSZXN1bHRPblBhZ2VOZXh0OmJvb2xlYW5cIixcbiAge1xuICAgIG5hbWU6IFwic2hvd05hdmlnYXRpb25CdXR0b25zXCIsXG4gICAgZGVmYXVsdDogXCJib3R0b21cIixcbiAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwiYm90aFwiXSxcbiAgfSxcbiAgeyBuYW1lOiBcInNob3dQcmV2QnV0dG9uOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwic2hvd1RpdGxlOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwic2hvd1BhZ2VUaXRsZXM6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJzaG93Q29tcGxldGVkUGFnZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgXCJuYXZpZ2F0ZVRvVXJsXCIsXG4gIHtcbiAgICBuYW1lOiBcIm5hdmlnYXRlVG9VcmxPbkNvbmRpdGlvbjp1cmxjb25kaXRpb25zXCIsXG4gICAgY2xhc3NOYW1lOiBcInVybGNvbmRpdGlvbml0ZW1cIixcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25zT3JkZXJcIixcbiAgICBkZWZhdWx0OiBcImluaXRpYWxcIixcbiAgICBjaG9pY2VzOiBbXCJpbml0aWFsXCIsIFwicmFuZG9tXCJdLFxuICB9LFxuICBcInNob3dQYWdlTnVtYmVyczpib29sZWFuXCIsXG4gIHtcbiAgICBuYW1lOiBcInNob3dRdWVzdGlvbk51bWJlcnNcIixcbiAgICBkZWZhdWx0OiBcIm9uXCIsXG4gICAgY2hvaWNlczogW1wib25cIiwgXCJvblBhZ2VcIiwgXCJvZmZcIl0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLFxuICAgIGRlZmF1bHQ6IFwidG9wXCIsXG4gICAgY2hvaWNlczogW1widG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiXSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uXCIsXG4gICAgZGVmYXVsdDogXCJ1bmRlclRpdGxlXCIsXG4gICAgY2hvaWNlczogW1widW5kZXJJbnB1dFwiLCBcInVuZGVyVGl0bGVcIl0sXG4gIH0sXG4gIHsgbmFtZTogXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIiwgZGVmYXVsdDogXCJ0b3BcIiwgY2hvaWNlczogW1widG9wXCIsIFwiYm90dG9tXCJdIH0sXG4gIHtcbiAgICBuYW1lOiBcInNob3dQcm9ncmVzc0JhclwiLFxuICAgIGRlZmF1bHQ6IFwib2ZmXCIsXG4gICAgY2hvaWNlczogW1wib2ZmXCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwiYm90aFwiXSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwicHJvZ3Jlc3NCYXJUeXBlXCIsXG4gICAgZGVmYXVsdDogXCJwYWdlc1wiLFxuICAgIGNob2ljZXM6IFtcbiAgICAgIFwicGFnZXNcIixcbiAgICAgIFwicXVlc3Rpb25zXCIsXG4gICAgICBcInJlcXVpcmVkUXVlc3Rpb25zXCIsXG4gICAgICBcImNvcnJlY3RRdWVzdGlvbnNcIixcbiAgICAgIFwiYnV0dG9uc1wiLFxuICAgIF0sXG4gIH0sXG4gIHsgbmFtZTogXCJtb2RlXCIsIGRlZmF1bHQ6IFwiZWRpdFwiLCBjaG9pY2VzOiBbXCJlZGl0XCIsIFwiZGlzcGxheVwiXSB9LFxuICB7IG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnQ6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJtYXhUZXh0TGVuZ3RoOm51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICB7IG5hbWU6IFwibWF4T3RoZXJzTGVuZ3RoOm51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICBcImdvTmV4dFBhZ2VBdXRvbWF0aWM6Ym9vbGVhblwiLFxuICB7XG4gICAgbmFtZTogXCJjbGVhckludmlzaWJsZVZhbHVlc1wiLFxuICAgIGRlZmF1bHQ6IFwib25Db21wbGV0ZVwiLFxuICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJvbkNvbXBsZXRlXCIsIFwib25IaWRkZW5cIiwgXCJvbkhpZGRlbkNvbnRhaW5lclwiXSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiY2hlY2tFcnJvcnNNb2RlXCIsXG4gICAgZGVmYXVsdDogXCJvbk5leHRQYWdlXCIsXG4gICAgY2hvaWNlczogW1wib25OZXh0UGFnZVwiLCBcIm9uVmFsdWVDaGFuZ2VkXCIsIFwib25WYWx1ZUNoYW5naW5nXCIsIFwib25Db21wbGV0ZVwiXSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwidGV4dFVwZGF0ZU1vZGVcIixcbiAgICBkZWZhdWx0OiBcIm9uQmx1clwiLFxuICAgIGNob2ljZXM6IFtcIm9uQmx1clwiLCBcIm9uVHlwaW5nXCJdLFxuICB9LFxuICB7IG5hbWU6IFwic3RhcnRTdXJ2ZXlUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NTdGFydFN1cnZleVRleHRcIiB9LFxuICB7IG5hbWU6IFwicGFnZVByZXZUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYWdlUHJldlRleHRcIiB9LFxuICB7IG5hbWU6IFwicGFnZU5leHRUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYWdlTmV4dFRleHRcIiB9LFxuICB7IG5hbWU6IFwiY29tcGxldGVUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb21wbGV0ZVRleHRcIiB9LFxuICB7IG5hbWU6IFwicHJldmlld1RleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1ByZXZpZXdUZXh0XCIgfSxcbiAgeyBuYW1lOiBcImVkaXRUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NFZGl0VGV4dFwiIH0sXG4gIHsgbmFtZTogXCJyZXF1aXJlZFRleHRcIiwgZGVmYXVsdDogXCIqXCIgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25TdGFydEluZGV4XCIsXG4gICAgZGVwZW5kc09uOiBbXCJzaG93UXVlc3Rpb25OdW1iZXJzXCJdLFxuICAgIHZpc2libGVJZjogZnVuY3Rpb24oc3VydmV5OiBhbnkpIHtcbiAgICAgIHJldHVybiAhc3VydmV5IHx8IHN1cnZleS5zaG93UXVlc3Rpb25OdW1iZXJzICE9PSBcIm9mZlwiO1xuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uVGl0bGVQYXR0ZXJuXCIsXG4gICAgZGVmYXVsdDogXCJudW1UaXRsZVJlcXVpcmVcIixcbiAgICBkZXBlbmRzT246IFtcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCBcInJlcXVpcmVkVGV4dFwiXSxcbiAgICBjaG9pY2VzOiAob2JqOiBhbnkpID0+IHtcbiAgICAgIGlmICghb2JqKSByZXR1cm4gW107XG4gICAgICByZXR1cm4gb2JqLmdldFF1ZXN0aW9uVGl0bGVQYXR0ZXJuT3B0aW9ucygpO1xuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGlzU2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIsXG4gIH0sXG4gIHsgbmFtZTogXCJmaXJzdFBhZ2VJc1N0YXJ0ZWQ6Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9LFxuICB7XG4gICAgbmFtZTogXCJpc1NpbmdsZVBhZ2U6Ym9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGlzU2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25zT25QYWdlTW9kZVwiLFxuICAgIGRlZmF1bHQ6IFwic3RhbmRhcmRcIixcbiAgICBjaG9pY2VzOiBbXCJzaW5nbGVQYWdlXCIsIFwic3RhbmRhcmRcIiwgXCJxdWVzdGlvblBlclBhZ2VcIl0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGVcIixcbiAgICBkZWZhdWx0OiBcIm5vUHJldmlld1wiLFxuICAgIGNob2ljZXM6IFtcIm5vUHJldmlld1wiLCBcInNob3dBbGxRdWVzdGlvbnNcIiwgXCJzaG93QW5zd2VyZWRRdWVzdGlvbnNcIl0sXG4gIH0sXG4gIHsgbmFtZTogXCJtYXhUaW1lVG9GaW5pc2g6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIG1pblZhbHVlOiAwIH0sXG4gIHsgbmFtZTogXCJtYXhUaW1lVG9GaW5pc2hQYWdlOm51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICB7XG4gICAgbmFtZTogXCJzaG93VGltZXJQYW5lbFwiLFxuICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJ0b3BcIiwgXCJib3R0b21cIl0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInNob3dUaW1lclBhbmVsTW9kZVwiLFxuICAgIGRlZmF1bHQ6IFwiYWxsXCIsXG4gICAgY2hvaWNlczogW1wiYWxsXCIsIFwicGFnZVwiLCBcInN1cnZleVwiXSxcbiAgfSxcbl0pO1xuIiwiaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tICcuL3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQcm9ncmVzc0J1dHRvbnNNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3VydmV5OiBTdXJ2ZXlNb2RlbCkge1xuICB9XG4gIHB1YmxpYyBpc0xpc3RFbGVtZW50Q2xpY2thYmxlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5Lm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnMgfHxcbiAgICAgIHRoaXMuc3VydmV5Lm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnMuaXNFbXB0eSB8fFxuICAgICAgdGhpcy5zdXJ2ZXkuY2hlY2tFcnJvcnNNb2RlID09PSBcIm9uQ29tcGxldGVcIikge1xuICAgICAgcmV0dXJuIHRydWU7ICAgIFxuICAgIH1cbiAgICByZXR1cm4gaW5kZXggPD0gdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2VObyArIDE7XG4gIH1cbiAgcHVibGljIGdldExpc3RFbGVtZW50Q3NzKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChpbmRleCA+PSB0aGlzLnN1cnZleS52aXNpYmxlUGFnZXMubGVuZ3RoKSByZXR1cm47XG4gICAgbGV0IGVsZW1lbnRDc3M6IHN0cmluZyA9IHRoaXMuc3VydmV5LnZpc2libGVQYWdlc1tpbmRleF0ucGFzc2VkID9cbiAgICAgIHRoaXMuc3VydmV5LmNzcy5wcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudFBhc3NlZCA6IFwiXCI7XG4gICAgaWYgKHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlTm8gPT09IGluZGV4KSB7XG4gICAgICBlbGVtZW50Q3NzICs9IGVsZW1lbnRDc3MgIT09IFwiXCIgPyBcIiBcIiA6IFwiXCI7XG4gICAgICBlbGVtZW50Q3NzICs9IHRoaXMuc3VydmV5LmNzcy5wcm9ncmVzc0J1dHRvbnNMaXN0RWxlbWVudEN1cnJlbnQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0xpc3RFbGVtZW50Q2xpY2thYmxlKGluZGV4KSkge1xuICAgICAgZWxlbWVudENzcyArPSBlbGVtZW50Q3NzICE9PSBcIlwiID8gXCIgXCIgOiBcIlwiO1xuICAgICAgZWxlbWVudENzcyArPSB0aGlzLnN1cnZleS5jc3MucHJvZ3Jlc3NCdXR0b25zTGlzdEVsZW1lbnROb25DbGlja2FibGU7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50Q3NzO1xuICB9XG4gIHB1YmxpYyBjbGlja0xpc3RFbGVtZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgaWYgKGluZGV4IDwgdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2VObykge1xuICAgICAgdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2VObyA9IGluZGV4O1xuICAgIH1cbiAgICBlbHNlIGlmIChpbmRleCA+IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlTm8pIHtcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlTm87IGkgPCBpbmRleDsgaSsrKSB7XG4gICAgICAgIGlmICghdGhpcy5zdXJ2ZXkubmV4dFBhZ2UoKSkgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBlbmdsaXNoU3RyaW5ncyB9IGZyb20gXCIuL2xvY2FsaXphdGlvbi9lbmdsaXNoXCI7XG5cbmV4cG9ydCB2YXIgc3VydmV5TG9jYWxpemF0aW9uID0ge1xuICBjdXJyZW50TG9jYWxlVmFsdWU6IFwiXCIsXG4gIGRlZmF1bHRMb2NhbGVWYWx1ZTogXCJlblwiLFxuICBsb2NhbGVzOiA8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pnt9LFxuICBsb2NhbGVOYW1lczogPHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfT57fSxcbiAgc3VwcG9ydGVkTG9jYWxlczogPEFycmF5PGFueT4+W10sXG4gIGdldCBjdXJyZW50TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9PT0gdGhpcy5kZWZhdWx0TG9jYWxlVmFsdWVcbiAgICAgID8gXCJcIlxuICAgICAgOiB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZTtcbiAgfSxcbiAgc2V0IGN1cnJlbnRMb2NhbGUodmFsOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsID09PSBcImN6XCIpIHZhbCA9IFwiY3NcIjtcbiAgICB0aGlzLmN1cnJlbnRMb2NhbGVWYWx1ZSA9IHZhbDtcbiAgfSxcbiAgZ2V0IGRlZmF1bHRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlO1xuICB9LFxuICBzZXQgZGVmYXVsdExvY2FsZSh2YWw6IHN0cmluZykge1xuICAgIGlmICh2YWwgPT09IFwiY3pcIikgdmFsID0gXCJjc1wiO1xuICAgIHRoaXMuZGVmYXVsdExvY2FsZVZhbHVlID0gdmFsO1xuICB9LFxuICBnZXRMb2NhbGVTdHJpbmdzKGxvYzogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGVzW2xvY107XG4gIH0sXG4gIGdldEN1cnJlbnRTdHJpbmdzKCk6IGFueSB7XG4gICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudExvY2FsZVxuICAgICAgPyB0aGlzLmxvY2FsZXNbdGhpcy5jdXJyZW50TG9jYWxlXVxuICAgICAgOiB0aGlzLmxvY2FsZXNbdGhpcy5kZWZhdWx0TG9jYWxlXTtcbiAgICBpZiAoIWxvYykgbG9jID0gdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgcmV0dXJuIGxvYztcbiAgfSxcbiAgZ2V0U3RyaW5nOiBmdW5jdGlvbiAoc3RyTmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIGxvYyA9IHRoaXMuZ2V0Q3VycmVudFN0cmluZ3MoKTtcbiAgICBpZiAoIWxvY1tzdHJOYW1lXSkgbG9jID0gdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgdmFyIHJlc3VsdCA9IGxvY1tzdHJOYW1lXTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMubG9jYWxlc1tcImVuXCJdW3N0ck5hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LFxuICBnZXRMb2NhbGVzOiBmdW5jdGlvbiAocmVtb3ZlRGVmYXVsdExvYzogYm9vbGVhbiA9IGZhbHNlKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHJlcy5wdXNoKFwiXCIpO1xuICAgIHZhciBsb2NzID0gdGhpcy5sb2NhbGVzO1xuICAgIGlmICh0aGlzLnN1cHBvcnRlZExvY2FsZXMgJiYgdGhpcy5zdXBwb3J0ZWRMb2NhbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvY3MgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdXBwb3J0ZWRMb2NhbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxvY3NbdGhpcy5zdXBwb3J0ZWRMb2NhbGVzW2ldXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiBsb2NzKSB7XG4gICAgICBpZiAocmVtb3ZlRGVmYXVsdExvYyAmJiBrZXkgPT0gdGhpcy5kZWZhdWx0TG9jYWxlKSBjb250aW51ZTtcbiAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHZhciBsb2NOYW1lID0gKGxvYzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIGlmICghbG9jKSByZXR1cm4gXCJcIjtcbiAgICAgIHZhciByZXMgPSAoPGFueT5zdXJ2ZXlMb2NhbGl6YXRpb24pLmxvY2FsZU5hbWVzW2xvY107XG4gICAgICBpZiAoIXJlcykgcmVzID0gbG9jO1xuICAgICAgcmV0dXJuIHJlcy50b0xvd2VyQ2FzZSgpO1xuICAgIH07XG4gICAgcmVzLnNvcnQoKGEsIGIpOiBudW1iZXIgPT4ge1xuICAgICAgdmFyIHN0cjEgPSBsb2NOYW1lKGEpO1xuICAgICAgdmFyIHN0cjIgPSBsb2NOYW1lKGIpO1xuICAgICAgaWYgKHN0cjEgPT09IHN0cjIpIHJldHVybiAwO1xuICAgICAgcmV0dXJuIHN0cjEgPCBzdHIyID8gLTEgOiAxO1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH0sXG59O1xuXG5leHBvcnQgdmFyIHN1cnZleVN0cmluZ3MgPSBlbmdsaXNoU3RyaW5ncztcbig8YW55PnN1cnZleUxvY2FsaXphdGlvbikubG9jYWxlc1tcImVuXCJdID0gZW5nbGlzaFN0cmluZ3M7XG4oPGFueT5zdXJ2ZXlMb2NhbGl6YXRpb24pLmxvY2FsZU5hbWVzW1wiZW5cIl0gPSBcImVuZ2xpc2hcIjtcbiIsImltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuL3N1cnZleVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgc3VydmV5IHJ1bm5pbmcgaW4gdGhlIFdpbmRvdy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVdpbmRvd01vZGVsIGV4dGVuZHMgQmFzZSB7XG4gIHB1YmxpYyBzdGF0aWMgc3VydmV5RWxlbWVudE5hbWUgPSBcIndpbmRvd1N1cnZleUpTXCI7XG4gIHN1cnZleVZhbHVlOiBTdXJ2ZXlNb2RlbDtcbiAgd2luZG93RWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XG5cbiAgdGVtcGxhdGVWYWx1ZTogc3RyaW5nO1xuICBleHBhbmRlZENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgc2hvd2luZ0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY2xvc2VXaW5kb3dPbkNvbXBsZXRlQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoanNvbk9iajogYW55LCBpbml0aWFsTW9kZWw6IFN1cnZleU1vZGVsID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKGluaXRpYWxNb2RlbCkge1xuICAgICAgdGhpcy5zdXJ2ZXlWYWx1ZSA9IGluaXRpYWxNb2RlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdXJ2ZXlWYWx1ZSA9IHRoaXMuY3JlYXRlU3VydmV5KGpzb25PYmopO1xuICAgIH1cbiAgICB0aGlzLnN1cnZleVZhbHVlLnNob3dUaXRsZSA9IGZhbHNlO1xuICAgIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgZG9jdW1lbnQpIHtcbiAgICAgIHRoaXMud2luZG93RWxlbWVudCA9IDxIVE1MRGl2RWxlbWVudD5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIH1cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5zdXJ2ZXkub25Db21wbGV0ZS5hZGQoZnVuY3Rpb24gKHN1cnZleSwgb3B0aW9ucykge1xuICAgICAgc2VsZi5vblN1cnZleUNvbXBsZXRlKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ3aW5kb3dcIjtcbiAgfVxuICAvKipcbiAgICogQSBzdXJ2ZXkgb2JqZWN0LlxuICAgKiBAc2VlIFN1cnZleU1vZGVsXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN1cnZleSgpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5VmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHZhbHVlIHRvIG5lZ2F0aXZlIHZhbHVlLCBmb3IgZXhhbXBsZSAtMSwgdG8gYXZvaWQgY2xvc2luZyB0aGUgd2luZG93IG9uIGNvbXBsZXRpbmcgdGhlIHN1cnZleS4gTGVhdmUgaXQgZXF1YWxzIHRvIDAgKGRlZmF1bHQgdmFsdWUpIHRvIGNsb3NlIHRoZSB3aW5kb3cgaW1tZWRpYXRlbHksIG9yIHNldCBpdCB0byAzLCA1LCAxMCwgLi4uIHRvIGNsb3NlIHRoZSB3aW5kb3cgaW4gMywgNSwgMTAgc2Vjb25kcy5cbiAgICovXG4gIHB1YmxpYyBjbG9zZU9uQ29tcGxldGVUaW1lb3V0OiBudW1iZXIgPSAwO1xuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHNob3dpbmcuIFNldCBpdCB0byB0cnVlIHRvIHNob3cgdGhlIHdpbmRvdyBhbmQgZmFsc2UgdG8gaGlkZSBpdC5cbiAgICogQHNlZSBzaG93XG4gICAqIEBzZWUgaGlkZVxuICAgKi9cbiAgcHVibGljIGdldCBpc1Nob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzU2hvd2luZ1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc1Nob3dpbmcodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuaXNTaG93aW5nID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzU2hvd2luZ1wiLCB2YWwpO1xuICAgIGlmICh0aGlzLnNob3dpbmdDaGFuZ2VkQ2FsbGJhY2spIHRoaXMuc2hvd2luZ0NoYW5nZWRDYWxsYmFjaygpO1xuICB9XG4gIC8qKlxuICAgKiBTaG93IHRoZSB3aW5kb3dcbiAgICogQHNlZSBoaWRlXG4gICAqIEBzZWUgaXNTaG93aW5nXG4gICAqL1xuICBwdWJsaWMgc2hvdygpIHtcbiAgICB0aGlzLmlzU2hvd2luZyA9IHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEhpZGUgdGhlIHdpbmRvd1xuICAgKiBAc2VlIHNob3dcbiAgICogQHNlZSBpc1Nob3dpbmdcbiAgICovXG4gIHB1YmxpYyBoaWRlKCkge1xuICAgIHRoaXMuaXNTaG93aW5nID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIGV4cGFuZGVkLiBTZXQgaXQgdG8gdHJ1ZSB0byBleHBhbmQgdGhlIHdpbmRvdyBvciBmYWxzZSB0byBjb2xsYXBzZSBpdC5cbiAgICogQHNlZSBleHBhbmRcbiAgICogQHNlZSBjb2xsYXBzZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0V4cGFuZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0V4cGFuZGVkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzRXhwYW5kZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNFeHBhbmRlZFwiLCB2YWwpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB0aGlzLmV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrKVxuICAgICAgdGhpcy5leHBhbmRlZENoYW5nZWRDYWxsYmFjaygpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgd2luZG93IGFuZCBzdXJ2ZXkgdGl0bGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LnRpdGxlO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc3VydmV5LnRpdGxlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubG9jVGl0bGU7XG4gIH1cbiAgLyoqXG4gICAqIEV4cGFuZCB0aGUgd2luZG93IHRvIHNob3cgdGhlIHN1cnZleS5cbiAgICovXG4gIHB1YmxpYyBleHBhbmQoKSB7XG4gICAgdGhpcy5leHBhbmRjb2xsYXBzZSh0cnVlKTtcbiAgfVxuICAvKipcbiAgICogQ29sbGFwc2UgdGhlIHdpbmRvdyBhbmQgc2hvdyBzdXJ2ZXkgdGl0bGUgb25seS5cbiAgICovXG4gIHB1YmxpYyBjb2xsYXBzZSgpIHtcbiAgICB0aGlzLmV4cGFuZGNvbGxhcHNlKGZhbHNlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlU3VydmV5KGpzb25PYmo6IGFueSk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleU1vZGVsKGpzb25PYmopO1xuICB9XG4gIHByb3RlY3RlZCBleHBhbmRjb2xsYXBzZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuaXNFeHBhbmRlZCA9IHZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBvblN1cnZleUNvbXBsZXRlKCkge1xuICAgIGlmICh0aGlzLmNsb3NlT25Db21wbGV0ZVRpbWVvdXQgPCAwKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY2xvc2VPbkNvbXBsZXRlVGltZW91dCA9PSAwKSB7XG4gICAgICB0aGlzLmNsb3NlV2luZG93T25Db21wbGV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgdGltZXJJZDogYW55ID0gbnVsbDtcbiAgICAgIHZhciBmdW5jID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmNsb3NlV2luZG93T25Db21wbGV0ZSgpO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRpbWVySWQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGltZXJJZCA9XG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICA/IHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jLCB0aGlzLmNsb3NlT25Db21wbGV0ZVRpbWVvdXQgKiAxMDAwKVxuICAgICAgICAgIDogMDtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNsb3NlV2luZG93T25Db21wbGV0ZSgpIHtcbiAgICBpZiAoISF0aGlzLmNsb3NlV2luZG93T25Db21wbGV0ZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNsb3NlV2luZG93T25Db21wbGV0ZUNhbGxiYWNrKCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBFdmVudCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuZXhwb3J0IHZhciBzdXJ2ZXlUaW1lckZ1bmN0aW9ucyA9IHtcbiAgc2V0VGltZW91dDogZnVuY3Rpb24gKGZ1bmM6ICgpID0+IGFueSk6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiAwO1xuICAgIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jLCAxMDAwKTtcbiAgfSxcbiAgY2xlYXJUaW1lb3V0OiBmdW5jdGlvbiAodGltZXJJZDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICB9LFxufTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVRpbWVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VWYWx1ZTogU3VydmV5VGltZXIgPSBudWxsO1xuICBwdWJsaWMgc3RhdGljIGdldCBpbnN0YW5jZSgpIHtcbiAgICBpZiAoIVN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUpIHtcbiAgICAgIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUgPSBuZXcgU3VydmV5VGltZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBsaXN0ZW5lckNvdW50ZXIgPSAwO1xuICBwcml2YXRlIHRpbWVySWQgPSAtMTtcbiAgcHVibGljIG9uVGltZXI6IEV2ZW50PCgpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoKSA9PiBhbnksIGFueT4oKTtcbiAgcHVibGljIHN0YXJ0KGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLmFkZChmdW5jKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGltZXJJZCA8IDApIHtcbiAgICAgIHRoaXMudGltZXJJZCA9IHN1cnZleVRpbWVyRnVuY3Rpb25zLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRvVGltZXIoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmxpc3RlbmVyQ291bnRlcisrO1xuICB9XG4gIHB1YmxpYyBzdG9wKGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLnJlbW92ZShmdW5jKTtcbiAgICB9XG4gICAgdGhpcy5saXN0ZW5lckNvdW50ZXItLTtcbiAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50ZXIgPT0gMCAmJiB0aGlzLnRpbWVySWQgPiAtMSkge1xuICAgICAgc3VydmV5VGltZXJGdW5jdGlvbnMuY2xlYXJUaW1lb3V0KHRoaXMudGltZXJJZCk7XG4gICAgICB0aGlzLnRpbWVySWQgPSAtMTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGRvVGltZXIoKSB7XG4gICAgaWYgKHRoaXMudGltZXJJZCA8IDApIHJldHVybjtcbiAgICB0aGlzLm9uVGltZXIuZmlyZSh0aGlzLCB7fSk7XG4gICAgdGhpcy50aW1lcklkID0gc3VydmV5VGltZXJGdW5jdGlvbnMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRvVGltZXIoKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFBhbmVsTW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuaW1wb3J0IHsgSVN1cnZleSwgSVRleHRQcm9jZXNzb3IgfSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IFByb2Nlc3NWYWx1ZSB9IGZyb20gXCIuL2NvbmRpdGlvblByb2Nlc3NWYWx1ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGV4dFByZVByb2Nlc3Nvckl0ZW0ge1xuICBwdWJsaWMgc3RhcnQ6IG51bWJlcjtcbiAgcHVibGljIGVuZDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVGV4dFByZVByb2Nlc3NvclZhbHVlIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuaXNFeGlzdHMgPSBmYWxzZTtcbiAgICB0aGlzLmNhblByb2Nlc3MgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyB2YWx1ZTogYW55O1xuICBwdWJsaWMgaXNFeGlzdHM6IGJvb2xlYW47XG4gIHB1YmxpYyBjYW5Qcm9jZXNzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgVGV4dFByZVByb2Nlc3NvciB7XG4gIHByaXZhdGUgaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWU6IGJvb2xlYW47XG4gIHB1YmxpYyBvblByb2Nlc3M6ICh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IoKSB7fVxuICBwdWJsaWMgcHJvY2VzcyhcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuID0gZmFsc2UsXG4gICAgZG9FbmNvZGluZzogYm9vbGVhbiA9IGZhbHNlXG4gICk6IHN0cmluZyB7XG4gICAgdGhpcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZSA9IHRydWU7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICBpZiAoIXRoaXMub25Qcm9jZXNzKSByZXR1cm4gdGV4dDtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKHRleHQpO1xuICAgIGZvciAodmFyIGkgPSBpdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgIHZhciBuYW1lID0gdGhpcy5nZXROYW1lKHRleHQuc3Vic3RyaW5nKGl0ZW0uc3RhcnQgKyAxLCBpdGVtLmVuZCkpO1xuICAgICAgaWYgKCFuYW1lKSBjb250aW51ZTtcbiAgICAgIHZhciB0ZXh0VmFsdWUgPSBuZXcgVGV4dFByZVByb2Nlc3NvclZhbHVlKG5hbWUsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgICB0aGlzLm9uUHJvY2Vzcyh0ZXh0VmFsdWUpO1xuICAgICAgaWYgKCF0ZXh0VmFsdWUuaXNFeGlzdHMpIHtcbiAgICAgICAgaWYgKHRleHRWYWx1ZS5jYW5Qcm9jZXNzKSB7XG4gICAgICAgICAgdGhpcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRleHRWYWx1ZS52YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHJlcGxhY2VkVmFsdWUgPSAhSGVscGVycy5pc1ZhbHVlRW1wdHkodGV4dFZhbHVlLnZhbHVlKVxuICAgICAgICA/IHRleHRWYWx1ZS52YWx1ZVxuICAgICAgICA6IFwiXCI7XG4gICAgICBpZiAoZG9FbmNvZGluZykge1xuICAgICAgICByZXBsYWNlZFZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlcGxhY2VkVmFsdWUpO1xuICAgICAgfVxuICAgICAgdGV4dCA9XG4gICAgICAgIHRleHQuc3Vic3RyKDAsIGl0ZW0uc3RhcnQpICsgcmVwbGFjZWRWYWx1ZSArIHRleHQuc3Vic3RyKGl0ZW0uZW5kICsgMSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHB1YmxpYyBwcm9jZXNzVmFsdWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhblxuICApOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUge1xuICAgIHZhciB0ZXh0VmFsdWUgPSBuZXcgVGV4dFByZVByb2Nlc3NvclZhbHVlKG5hbWUsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgaWYgKCEhdGhpcy5vblByb2Nlc3MpIHtcbiAgICAgIHRoaXMub25Qcm9jZXNzKHRleHRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0VmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBoYXNBbGxWYWx1ZXNPbkxhc3RSdW4oKSB7XG4gICAgcmV0dXJuICEhdGhpcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW5WYWx1ZTtcbiAgfVxuICBwcml2YXRlIGdldEl0ZW1zKHRleHQ6IHN0cmluZyk6IEFycmF5PFRleHRQcmVQcm9jZXNzb3JJdGVtPiB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdmFyIGxlbmd0aCA9IHRleHQubGVuZ3RoO1xuICAgIHZhciBzdGFydCA9IC0xO1xuICAgIHZhciBjaCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgY2ggPSB0ZXh0W2ldO1xuICAgICAgaWYgKGNoID09IFwie1wiKSBzdGFydCA9IGk7XG4gICAgICBpZiAoY2ggPT0gXCJ9XCIpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID4gLTEpIHtcbiAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBUZXh0UHJlUHJvY2Vzc29ySXRlbSgpO1xuICAgICAgICAgIGl0ZW0uc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICBpdGVtLmVuZCA9IGk7XG4gICAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydCA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG4gICAgcmV0dXJuIG5hbWUudHJpbSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblRleHRQcm9jZXNzb3IgaW1wbGVtZW50cyBJVGV4dFByb2Nlc3NvciB7XG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHZhcmlhYmxlTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yID0gbmV3IFRleHRQcmVQcm9jZXNzb3IoKTtcbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3Iub25Qcm9jZXNzID0gKHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKSA9PiB7XG4gICAgICB0aGlzLmdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWUpO1xuICAgIH07XG4gIH1cbiAgcHVibGljIHByb2Nlc3NWYWx1ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuXG4gICk6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzVmFsdWUobmFtZSwgcmV0dXJuRGlzcGxheVZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLnBhbmVsID8gdGhpcy5wYW5lbC5nZXRWYWx1ZSgpIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiAhIXRoaXMucGFuZWxcbiAgICAgID8gPFF1ZXN0aW9uPnRoaXMucGFuZWwuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZShuYW1lKVxuICAgICAgOiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBvbkN1c3RvbVByb2Nlc3NUZXh0KHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vSVRleHRQcm9jZXNzb3JcbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpIHtcbiAgICBpZiAoIXRleHRWYWx1ZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLm9uQ3VzdG9tUHJvY2Vzc1RleHQodGV4dFZhbHVlKSkgcmV0dXJuO1xuICAgIHZhciBmaXJzdE5hbWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0Rmlyc3ROYW1lKHRleHRWYWx1ZS5uYW1lKTtcbiAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSBmaXJzdE5hbWUgPT0gdGhpcy52YXJpYWJsZU5hbWU7XG4gICAgdGV4dFZhbHVlLmNhblByb2Nlc3MgPSB0ZXh0VmFsdWUuaXNFeGlzdHM7XG4gICAgaWYgKCF0ZXh0VmFsdWUuY2FuUHJvY2VzcykgcmV0dXJuO1xuICAgIC8vbmFtZSBzaG91bGQgc3RhcnQgd2l0aCB0aGUgdmFyaWFibGUgbmFtZVxuICAgIHRleHRWYWx1ZS5uYW1lID0gdGV4dFZhbHVlLm5hbWUucmVwbGFjZSh0aGlzLnZhcmlhYmxlTmFtZSArIFwiLlwiLCBcIlwiKTtcbiAgICB2YXIgZmlyc3ROYW1lID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldEZpcnN0TmFtZSh0ZXh0VmFsdWUubmFtZSk7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShmaXJzdE5hbWUpO1xuICAgIHZhciB2YWx1ZXMgPSB7fTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgICg8YW55PnZhbHVlcylbZmlyc3ROYW1lXSA9IHRleHRWYWx1ZS5yZXR1cm5EaXNwbGF5VmFsdWVcbiAgICAgICAgPyBxdWVzdGlvbi5kaXNwbGF5VmFsdWVcbiAgICAgICAgOiBxdWVzdGlvbi52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFsbFZhbHVlcyA9ICEhdGhpcy5wYW5lbCA/IHRoaXMuZ2V0VmFsdWVzKCkgOiBudWxsO1xuICAgICAgaWYgKGFsbFZhbHVlcykge1xuICAgICAgICAoPGFueT52YWx1ZXMpW2ZpcnN0TmFtZV0gPSBhbGxWYWx1ZXNbZmlyc3ROYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGV4dFZhbHVlLnZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldFZhbHVlKHRleHRWYWx1ZS5uYW1lLCB2YWx1ZXMpO1xuICB9XG4gIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB0ZXh0ID0gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLnByb2Nlc3ModGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKTtcbiAgICB2YXIgc3VydmV5ID0gdGhpcy5zdXJ2ZXk7XG4gICAgcmV0dXJuIHN1cnZleSA/IHN1cnZleS5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpIDogdGV4dDtcbiAgfVxuICBwcm9jZXNzVGV4dEV4KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogYW55IHtcbiAgICB0ZXh0ID0gdGhpcy5wcm9jZXNzVGV4dCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgIHZhciBoYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IuaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHZhciByZXMgPSB7IGhhc0FsbFZhbHVlc09uTGFzdFJ1bjogdHJ1ZSwgdGV4dDogdGV4dCB9O1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgcmVzID0gdGhpcy5zdXJ2ZXkucHJvY2Vzc1RleHRFeCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUsIGZhbHNlKTtcbiAgICB9XG4gICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biA9XG4gICAgICByZXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuICYmIGhhc0FsbFZhbHVlc09uTGFzdFJ1bjtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSVN1cnZleSB9IGZyb20gXCIuL2Jhc2UtaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciwgRXhwcmVzc2lvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IE9wZXJhbmRNYWtlciB9IGZyb20gXCIuL2V4cHJlc3Npb25zL2V4cHJlc3Npb25zXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGFsbCB0cmlnZ2Vycy5cbiAqIEEgdHJpZ2dlciBjYWxscyBhIG1ldGhvZCB3aGVuIHRoZSBleHByZXNzaW9uIGNoYW5nZSB0aGUgcmVzdWx0OiBmcm9tIGZhbHNlIHRvIHRydWUgb3IgZnJvbSB0cnVlIHRvIGZhbHNlLlxuICogUGxlYXNlIG5vdGUsIGl0IHJ1bnMgb25seSBvbmUgY2hhbmdpbmcgdGhlIGV4cHJlc3Npb24gcmVzdWx0LlxuICovXG5leHBvcnQgY2xhc3MgVHJpZ2dlciBleHRlbmRzIEJhc2Uge1xuICBzdGF0aWMgb3BlcmF0b3JzVmFsdWU6IEhhc2hUYWJsZTxGdW5jdGlvbj4gPSBudWxsO1xuICBzdGF0aWMgZ2V0IG9wZXJhdG9ycygpIHtcbiAgICBpZiAoVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZSAhPSBudWxsKSByZXR1cm4gVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZTtcbiAgICBUcmlnZ2VyLm9wZXJhdG9yc1ZhbHVlID0ge1xuICAgICAgZW1wdHk6IGZ1bmN0aW9uKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gIXZhbHVlO1xuICAgICAgfSxcbiAgICAgIG5vdGVtcHR5OiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhdmFsdWU7XG4gICAgICB9LFxuICAgICAgZXF1YWw6IGZ1bmN0aW9uKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT0gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBub3RlcXVhbDogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPSBleHBlY3RlZFZhbHVlO1xuICAgICAgfSxcbiAgICAgIGNvbnRhaW5zOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlW1wiaW5kZXhPZlwiXSAmJiB2YWx1ZS5pbmRleE9mKGV4cGVjdGVkVmFsdWUpID4gLTE7XG4gICAgICB9LFxuICAgICAgbm90Y29udGFpbnM6IGZ1bmN0aW9uKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICF2YWx1ZSB8fCAhdmFsdWVbXCJpbmRleE9mXCJdIHx8IHZhbHVlLmluZGV4T2YoZXhwZWN0ZWRWYWx1ZSkgPT0gLTFcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBncmVhdGVyOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID4gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBsZXNzOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIDwgZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBncmVhdGVyb3JlcXVhbDogZnVuY3Rpb24odmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA+PSBleHBlY3RlZFZhbHVlO1xuICAgICAgfSxcbiAgICAgIGxlc3NvcmVxdWFsOiBmdW5jdGlvbih2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIDw9IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIFRyaWdnZXIub3BlcmF0b3JzVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBjb25kaXRpb25SdW5uZXI6IENvbmRpdGlvblJ1bm5lcjtcbiAgcHJpdmF0ZSB1c2VkTmFtZXM6IEFycmF5PHN0cmluZz47XG4gIHByaXZhdGUgaGFzRnVuY3Rpb246IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy51c2VkTmFtZXMgPSBbXTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wib3BlcmF0b3JcIiwgXCJ2YWx1ZVwiLCBcIm5hbWVcIl0sXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5vbGRQcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImV4cHJlc3Npb25cIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uRXhwcmVzc2lvbkNoYW5nZWQoKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInRyaWdnZXJiYXNlXCI7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0VHlwZSgpLnJlcGxhY2UoXCJ0cmlnZ2VyXCIsIFwiXCIpO1xuICAgIHZhciBleHAgPSAhIXRoaXMuZXhwcmVzc2lvbiA/IHRoaXMuZXhwcmVzc2lvbiA6IHRoaXMuYnVpbGRFeHByZXNzaW9uKCk7XG4gICAgaWYgKGV4cCkge1xuICAgICAgcmVzICs9IFwiLCBcIiArIGV4cDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm9wZXJhdG9yXCIsIFwiZXF1YWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBvcGVyYXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIVRyaWdnZXIub3BlcmF0b3JzW3ZhbHVlXSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm9wZXJhdG9yXCIsIHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlXCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgdmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgY2hlY2tFeHByZXNzaW9uKFxuICAgIGtleXM6IGFueSxcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApIHtcbiAgICBpZiAoIXRoaXMuaXNDaGVja1JlcXVpcmVkKGtleXMpKSByZXR1cm47XG4gICAgaWYgKCEhdGhpcy5jb25kaXRpb25SdW5uZXIpIHtcbiAgICAgIHRoaXMucGVyZm9ybSh2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2hlY2sodmFsdWU6IGFueSkge1xuICAgIHZhciB0cmlnZ2VyUmVzdWx0ID0gVHJpZ2dlci5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0odmFsdWUsIHRoaXMudmFsdWUpO1xuICAgIGlmICh0cmlnZ2VyUmVzdWx0KSB7XG4gICAgICB0aGlzLm9uU3VjY2Vzcyh7fSwgbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25GYWlsdXJlKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcGVyZm9ybSh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnRyaWdnZXJSZXN1bHQocmVzLCB2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH07XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJpdmF0ZSB0cmlnZ2VyUmVzdWx0KFxuICAgIHJlczogYm9vbGVhbixcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmIChyZXMpIHtcbiAgICAgIHRoaXMub25TdWNjZXNzKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25GYWlsdXJlKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHt9XG4gIHByb3RlY3RlZCBvbkZhaWx1cmUoKSB7fVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdGhpcy5vbGRQcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgb2xkUHJvcGVydGllc0NoYW5nZWQoKSB7XG4gICAgdGhpcy5vbkV4cHJlc3Npb25DaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSBvbkV4cHJlc3Npb25DaGFuZ2VkKCkge1xuICAgIHRoaXMudXNlZE5hbWVzID0gW107XG4gICAgdGhpcy5oYXNGdW5jdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyID0gbnVsbDtcbiAgfVxuICBwdWJsaWMgYnVpbGRFeHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLm5hbWUpIHJldHVybiBcIlwiO1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLnZhbHVlKSAmJiB0aGlzLmlzUmVxdWlyZVZhbHVlKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gKFxuICAgICAgXCJ7XCIgK1xuICAgICAgdGhpcy5uYW1lICtcbiAgICAgIFwifSBcIiArXG4gICAgICB0aGlzLm9wZXJhdG9yICtcbiAgICAgIFwiIFwiICtcbiAgICAgIE9wZXJhbmRNYWtlci50b09wZXJhbmRTdHJpbmcodGhpcy52YWx1ZSlcbiAgICApO1xuICB9XG4gIHByaXZhdGUgaXNDaGVja1JlcXVpcmVkKGtleXM6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICgha2V5cykgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuYnVpbGRVc2VkTmFtZXMoKTtcbiAgICBpZiAodGhpcy5oYXNGdW5jdGlvbiA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIHByb2Nlc3NWYWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudXNlZE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IHRoaXMudXNlZE5hbWVzW2ldO1xuICAgICAgaWYgKGtleXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHJldHVybiB0cnVlO1xuICAgICAgdmFyIGZpcnN0TmFtZSA9IHByb2Nlc3NWYWx1ZS5nZXRGaXJzdE5hbWUobmFtZSk7XG4gICAgICBpZiAoIWtleXMuaGFzT3duUHJvcGVydHkoZmlyc3ROYW1lKSkgY29udGludWU7XG4gICAgICBpZiAobmFtZSA9PSBmaXJzdE5hbWUpIHJldHVybiB0cnVlO1xuICAgICAgdmFyIGtleVZhbHVlID0ga2V5c1tmaXJzdE5hbWVdO1xuICAgICAgaWYgKGtleVZhbHVlID09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoXG4gICAgICAgICFrZXlWYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIm9sZFZhbHVlXCIpIHx8XG4gICAgICAgICFrZXlWYWx1ZS5oYXNPd25Qcm9wZXJ0eShcIm5ld1ZhbHVlXCIpXG4gICAgICApXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgdmFyIHY6IGFueSA9IHt9O1xuICAgICAgdltmaXJzdE5hbWVdID0ga2V5VmFsdWVbXCJvbGRWYWx1ZVwiXTtcbiAgICAgIHZhciBvbGRWYWx1ZSA9IHByb2Nlc3NWYWx1ZS5nZXRWYWx1ZShuYW1lLCB2KTtcbiAgICAgIHZbZmlyc3ROYW1lXSA9IGtleVZhbHVlW1wibmV3VmFsdWVcIl07XG4gICAgICB2YXIgbmV3VmFsdWUgPSBwcm9jZXNzVmFsdWUuZ2V0VmFsdWUobmFtZSwgdik7XG4gICAgICByZXR1cm4gIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFVzZWROYW1lcygpIHtcbiAgICBpZiAoISF0aGlzLmNvbmRpdGlvblJ1bm5lcikgcmV0dXJuO1xuICAgIHZhciBleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uO1xuICAgIGlmICghZXhwcmVzc2lvbikge1xuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMuYnVpbGRFeHByZXNzaW9uKCk7XG4gICAgfVxuICAgIGlmICghZXhwcmVzc2lvbikgcmV0dXJuO1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcihleHByZXNzaW9uKTtcbiAgICB0aGlzLmhhc0Z1bmN0aW9uID0gdGhpcy5jb25kaXRpb25SdW5uZXIuaGFzRnVuY3Rpb24oKTtcbiAgICB0aGlzLnVzZWROYW1lcyA9IHRoaXMuY29uZGl0aW9uUnVubmVyLmdldFZhcmlhYmxlcygpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzUmVxdWlyZVZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yICE9PSBcImVtcHR5XCIgJiYgdGhpcy5vcGVyYXRvciAhPSBcIm5vdGVtcHR5XCI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5VHJpZ2dlck93bmVyIHtcbiAgZ2V0T2JqZWN0cyhwYWdlczogc3RyaW5nW10sIHF1ZXN0aW9uczogc3RyaW5nW10pOiBhbnlbXTtcbiAgc2V0Q29tcGxldGVkKCk6IGFueTtcbiAgc2V0VHJpZ2dlclZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgaXNWYXJpYWJsZTogYm9vbGVhbik6IGFueTtcbiAgY29weVRyaWdnZXJWYWx1ZShuYW1lOiBzdHJpbmcsIGZyb21OYW1lOiBzdHJpbmcpOiBhbnk7XG4gIGZvY3VzUXVlc3Rpb24obmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJdCBleHRlbmRzIHRoZSBUcmlnZ2VyIGJhc2UgY2xhc3MgYW5kIGFkZCBwcm9wZXJ0aWVzIHJlcXVpcmVkIGZvciBTdXJ2ZXlKUyBjbGFzc2VzLlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlciBleHRlbmRzIFRyaWdnZXIge1xuICBwcm90ZWN0ZWQgb3duZXJWYWx1ZTogSVN1cnZleVRyaWdnZXJPd25lciA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldCBvd25lcigpOiBJU3VydmV5VHJpZ2dlck93bmVyIHtcbiAgICByZXR1cm4gdGhpcy5vd25lclZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXRPd25lcihvd25lcjogSVN1cnZleVRyaWdnZXJPd25lcikge1xuICAgIHRoaXMub3duZXJWYWx1ZSA9IG93bmVyO1xuICB9XG4gIHB1YmxpYyBnZXRTdXJ2ZXkobGl2ZTogYm9vbGVhbiA9IGZhbHNlKTogSVN1cnZleSB7XG4gICAgcmV0dXJuICEhdGhpcy5vd25lciAmJiAhISg8YW55PnRoaXMub3duZXIpW1wiZ2V0U3VydmV5XCJdXG4gICAgICA/ICg8YW55PnRoaXMub3duZXIpLmdldFN1cnZleSgpXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldCBpc09uTmV4dFBhZ2UoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCBpdCBtYWtlcyBxdWVzdGlvbnMvcGFnZXMgdmlzaWJsZS5cbiAqIE9odGVyd2lzZSBpdCBtYWtlcyB0aGVtIGludmlzaWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJWaXNpYmxlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gIHB1YmxpYyBwYWdlczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIHF1ZXN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInZpc2libGV0cmlnZ2VyXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHRoaXMub25UcmlnZ2VyKHRoaXMub25JdGVtU3VjY2Vzcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uRmFpbHVyZSgpIHtcbiAgICB0aGlzLm9uVHJpZ2dlcih0aGlzLm9uSXRlbUZhaWx1cmUpO1xuICB9XG4gIHByaXZhdGUgb25UcmlnZ2VyKGZ1bmM6IEZ1bmN0aW9uKSB7XG4gICAgaWYgKCF0aGlzLm93bmVyKSByZXR1cm47XG4gICAgdmFyIG9iamVjdHMgPSB0aGlzLm93bmVyLmdldE9iamVjdHModGhpcy5wYWdlcywgdGhpcy5xdWVzdGlvbnMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgZnVuYyhvYmplY3RzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXRlbVN1Y2Nlc3MoaXRlbTogYW55KSB7XG4gICAgaXRlbS52aXNpYmxlID0gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25JdGVtRmFpbHVyZShpdGVtOiBhbnkpIHtcbiAgICBpdGVtLnZpc2libGUgPSBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgaXQgY29tcGxldGVzIHRoZSBzdXJ2ZXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyQ29tcGxldGUgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNvbXBsZXRldHJpZ2dlclwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNPbk5leHRQYWdlKCkge1xuICAgIHJldHVybiAhc2V0dGluZ3MuZXhlY3V0ZUNvbXBsZXRlVHJpZ2dlck9uVmFsdWVDaGFuZ2VkO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAodGhpcy5vd25lcikgdGhpcy5vd25lci5zZXRDb21wbGV0ZWQoKTtcbiAgfVxufVxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlIHZhbHVlIGZyb20gcHJvcGVydHkgKipzZXRWYWx1ZSoqIHdpbGwgYmUgc2V0IHRvICoqc2V0VG9OYW1lKipcbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJTZXRWYWx1ZSBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic2V0dmFsdWV0cmlnZ2VyXCI7XG4gIH1cbiAgcHVibGljIGdldCBzZXRUb05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2V0VG9OYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2V0VG9OYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2V0VG9OYW1lXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBzZXRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzZXRWYWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNldFZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2V0VmFsdWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmFyaWFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzVmFyaWFibGVcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNWYXJpYWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1ZhcmlhYmxlXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghdGhpcy5zZXRUb05hbWUgfHwgIXRoaXMub3duZXIpIHJldHVybjtcbiAgICB0aGlzLm93bmVyLnNldFRyaWdnZXJWYWx1ZSh0aGlzLnNldFRvTmFtZSwgdGhpcy5zZXRWYWx1ZSwgdGhpcy5pc1ZhcmlhYmxlKTtcbiAgfVxufVxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlIHN1cnZleSBnbyB0byBxdWVzdGlvbiAqKmdvdG9OYW1lKiogYW5kIGZvY3VzIGl0LlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlclNraXAgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNraXB0cmlnZ2VyXCI7XG4gIH1cbiAgcHVibGljIGdldCBnb3RvTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJnb3RvTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGdvdG9OYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZ290b05hbWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzT25OZXh0UGFnZSgpIHtcbiAgICByZXR1cm4gIXNldHRpbmdzLmV4ZWN1dGVTa2lwVHJpZ2dlck9uVmFsdWVDaGFuZ2VkO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAoIXRoaXMuZ290b05hbWUgfHwgIXRoaXMub3duZXIpIHJldHVybjtcbiAgICB0aGlzLm93bmVyLmZvY3VzUXVlc3Rpb24odGhpcy5nb3RvTmFtZSk7XG4gIH1cbn1cbi8qKlxuICogSWYgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIHRoZSAqKnJ1bkV4cHJlc3Npb24qKiB3aWxsIGJlIHJ1bi4gSWYgKipzZXRUb05hbWUqKiBwcm9wZXJ0eSBpcyBub3QgZW1wdHkgdGhlbiB0aGUgcmVzdWx0IG9mICoqcnVuRXhwcmVzc2lvbioqIHdpbGwgYmUgc2V0IHRvIGl0LlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlclJ1bkV4cHJlc3Npb24gZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJ1bmV4cHJlc3Npb250cmlnZ2VyXCI7XG4gIH1cbiAgcHVibGljIGdldCBzZXRUb05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2V0VG9OYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2V0VG9OYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2V0VG9OYW1lXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBydW5FeHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJ1bkV4cHJlc3Npb25cIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBydW5FeHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicnVuRXhwcmVzc2lvblwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAoIXRoaXMub3duZXIgfHwgIXRoaXMucnVuRXhwcmVzc2lvbikgcmV0dXJuO1xuICAgIHZhciBleHByZXNzaW9uID0gbmV3IEV4cHJlc3Npb25SdW5uZXIodGhpcy5ydW5FeHByZXNzaW9uKTtcbiAgICBpZiAoZXhwcmVzc2lvbi5jYW5SdW4pIHtcbiAgICAgIGV4cHJlc3Npb24ub25SdW5Db21wbGV0ZSA9IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5vbkNvbXBsZXRlUnVuRXhwcmVzc2lvbihyZXMpO1xuICAgICAgfTtcbiAgICAgIGV4cHJlc3Npb24ucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgb25Db21wbGV0ZVJ1bkV4cHJlc3Npb24obmV3VmFsdWU6IGFueSkge1xuICAgIGlmICghIXRoaXMuc2V0VG9OYW1lICYmIG5ld1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub3duZXIuc2V0VHJpZ2dlclZhbHVlKHRoaXMuc2V0VG9OYW1lLCBuZXdWYWx1ZSwgZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCB0aGUgdmFsdWUgZnJvbSBxdWVzdGlvbiAqKmZyb21OYW1lKiogd2lsbCBiZSBzZXQgaW50byAqKnNldFRvTmFtZSoqLlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlckNvcHlWYWx1ZSBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2V0VG9OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNldFRvTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNldFRvTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNldFRvTmFtZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgZnJvbU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZnJvbU5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBmcm9tTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImZyb21OYW1lXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb3B5dmFsdWV0cmlnZ2VyXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghdGhpcy5zZXRUb05hbWUgfHwgIXRoaXMub3duZXIpIHJldHVybjtcbiAgICB0aGlzLm93bmVyLmNvcHlUcmlnZ2VyVmFsdWUodGhpcy5zZXRUb05hbWUsIHRoaXMuZnJvbU5hbWUpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXCJ0cmlnZ2VyXCIsIFtcbiAgeyBuYW1lOiBcIm9wZXJhdG9yXCIsIGRlZmF1bHQ6IFwiZXF1YWxcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgeyBuYW1lOiBcInZhbHVlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIFwiZXhwcmVzc2lvbjpjb25kaXRpb25cIixcbl0pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJzdXJ2ZXl0cmlnZ2VyXCIsXG4gIFt7IG5hbWU6IFwibmFtZVwiLCB2aXNpYmxlOiBmYWxzZSB9XSxcbiAgbnVsbCxcbiAgXCJ0cmlnZ2VyXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInZpc2libGV0cmlnZ2VyXCIsXG4gIFtcInBhZ2VzOnBhZ2VzXCIsIFwicXVlc3Rpb25zOnF1ZXN0aW9uc1wiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlUcmlnZ2VyVmlzaWJsZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY29tcGxldGV0cmlnZ2VyXCIsXG4gIFtdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJDb21wbGV0ZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwic2V0dmFsdWV0cmlnZ2VyXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwiIXNldFRvTmFtZTpxdWVzdGlvbnZhbHVlXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInNldFZhbHVlOnRyaWdnZXJ2YWx1ZVwiLFxuICAgICAgZGVwZW5kc09uOiBcInNldFRvTmFtZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gISFvYmogJiYgISFvYmpbXCJzZXRUb05hbWVcIl07XG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImlzVmFyaWFibGU6Ym9vbGVhblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJTZXRWYWx1ZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY29weXZhbHVldHJpZ2dlclwiLFxuICBbeyBuYW1lOiBcIiFzZXRUb05hbWU6cXVlc3Rpb252YWx1ZVwiIH0sIHsgbmFtZTogXCIhZnJvbU5hbWU6cXVlc3Rpb252YWx1ZVwiIH1dLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJDb3B5VmFsdWUoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl0cmlnZ2VyXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInNraXB0cmlnZ2VyXCIsXG4gIFt7IG5hbWU6IFwiIWdvdG9OYW1lOnF1ZXN0aW9uXCIgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgU3VydmV5VHJpZ2dlclNraXAoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl0cmlnZ2VyXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInJ1bmV4cHJlc3Npb250cmlnZ2VyXCIsXG4gIFt7IG5hbWU6IFwic2V0VG9OYW1lOnF1ZXN0aW9udmFsdWVcIiB9LCBcInJ1bkV4cHJlc3Npb246ZXhwcmVzc2lvblwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXlUcmlnZ2VyUnVuRXhwcmVzc2lvbigpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcbiIsImxldCBfaXNNb2JpbGUgPSBmYWxzZTtcbmxldCB2ZW5kb3IgPSBudWxsO1xuXG5pZiAoXG4gIHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBuYXZpZ2F0b3IgJiZcbiAgd2luZG93XG4pIHtcbiAgdmVuZG9yID0gbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCBuYXZpZ2F0b3IudmVuZG9yIHx8ICg8YW55PndpbmRvdykub3BlcmE7XG59XG5cbihmdW5jdGlvbiAoYTogYW55KSB7XG4gIGlmICghYSkgcmV0dXJuO1xuICBpZiAoXG4gICAgLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWluby9pLnRlc3QoXG4gICAgICBhXG4gICAgKSB8fFxuICAgIC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzXFwtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFxcLW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxid1xcLShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtXFwtfGNlbGx8Y2h0bXxjbGRjfGNtZFxcLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkY1xcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XFwtZCl8ZWwoNDl8YWkpfGVtKGwyfHVsKXxlcihpY3xrMCl8ZXNsOHxleihbNC03XTB8b3N8d2F8emUpfGZldGN8Zmx5KFxcLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZlxcLTV8Z1xcLW1vfGdvKFxcLnd8b2QpfGdyKGFkfHVuKXxoYWllfGhjaXR8aGRcXC0obXxwfHQpfGhlaVxcLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzXFwtY3xodChjKFxcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcXC0oMjB8Z298bWEpfGkyMzB8aWFjKCB8XFwtfFxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcXC8pfGtsb258a3B0IHxrd2NcXC18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8XFwtW2Etd10pfGxpYnd8bHlueHxtMVxcLXd8bTNnYXxtNTBcXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXFwtY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoXFwtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSlcXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFxcLShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwblxcLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdFxcLWd8cWFcXC1hfHFjKDA3fDEyfDIxfDMyfDYwfFxcLVsyLTddfGlcXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XFwvfHNhKGdlfG1hfG1tfG1zfG55fHZhKXxzYygwMXxoXFwtfG9vfHBcXC0pfHNka1xcL3xzZShjKFxcLXwwfDEpfDQ3fG1jfG5kfHJpKXxzZ2hcXC18c2hhcnxzaWUoXFwtfG0pfHNrXFwtMHxzbCg0NXxpZCl8c20oYWx8YXJ8YjN8aXR8dDUpfHNvKGZ0fG55KXxzcCgwMXxoXFwtfHZcXC18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2xcXC18dGRnXFwtfHRlbChpfG0pfHRpbVxcLXx0XFwtbW98dG8ocGx8c2gpfHRzKDcwfG1cXC18bTN8bTUpfHR4XFwtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118XFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcXC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXNcXC18eW91cnx6ZXRvfHp0ZVxcLS9pLnRlc3QoXG4gICAgICBhLnN1YnN0cigwLCA0KVxuICAgIClcbiAgKVxuICAgIF9pc01vYmlsZSA9IHRydWU7XG59KSh2ZW5kb3IpO1xuXG5leHBvcnQgY29uc3QgSXNNb2JpbGUgPSBfaXNNb2JpbGU7XG4iLCJleHBvcnQgdHlwZSBWZXJ0aWNhbFBvc2l0aW9uID0gXCJ0b3BcIiB8IFwiYm90dG9tXCIgfCBcIm1pZGRsZVwiO1xuZXhwb3J0IHR5cGUgSG9yaXpvbnRhbFBvc2l0aW9uID0gXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcImNlbnRlclwiO1xuZXhwb3J0IGludGVyZmFjZSBJUG9zaXRpb24ge1xuICBsZWZ0PzogbnVtYmVyIHwgc3RyaW5nO1xuICB0b3A/OiBudW1iZXIgfCBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU51bWJlclBvc2l0aW9uIGV4dGVuZHMgSVBvc2l0aW9uIHtcbiAgbGVmdD86IG51bWJlcjtcbiAgdG9wPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTaXplIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBQb3B1cFV0aWxzIHtcbiAgcHVibGljIHN0YXRpYyBjYWxjdWxhdGVQb3NpdGlvbihcbiAgICB0YXJnZXRSZWN0OiBDbGllbnRSZWN0LFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgdmVydGljYWxQb3NpdGlvbjogVmVydGljYWxQb3NpdGlvbixcbiAgICBob3Jpem9udGFsUG9zaXRpb246IEhvcml6b250YWxQb3NpdGlvbixcbiAgICBzaG93UG9pbnRlcjogYm9vbGVhblxuICApOiBJTnVtYmVyUG9zaXRpb24ge1xuICAgIGlmIChob3Jpem9udGFsUG9zaXRpb24gPT0gXCJjZW50ZXJcIilcbiAgICAgIHZhciBsZWZ0ID0gKHRhcmdldFJlY3QubGVmdCArIHRhcmdldFJlY3QucmlnaHQgLSB3aWR0aCkgLyAyO1xuICAgIGVsc2UgaWYgKGhvcml6b250YWxQb3NpdGlvbiA9PSBcImxlZnRcIikgbGVmdCA9IHRhcmdldFJlY3QubGVmdCAtIHdpZHRoO1xuICAgIGVsc2UgbGVmdCA9IHRhcmdldFJlY3QucmlnaHQ7XG5cbiAgICBpZiAodmVydGljYWxQb3NpdGlvbiA9PSBcIm1pZGRsZVwiKVxuICAgICAgdmFyIHRvcCA9ICh0YXJnZXRSZWN0LnRvcCArIHRhcmdldFJlY3QuYm90dG9tIC0gaGVpZ2h0KSAvIDI7XG4gICAgZWxzZSBpZiAodmVydGljYWxQb3NpdGlvbiA9PSBcInRvcFwiKSB0b3AgPSB0YXJnZXRSZWN0LnRvcCAtIGhlaWdodDtcbiAgICBlbHNlIHRvcCA9IHRhcmdldFJlY3QuYm90dG9tO1xuXG4gICAgaWYgKHNob3dQb2ludGVyKSB7XG4gICAgICBpZiAoaG9yaXpvbnRhbFBvc2l0aW9uICE9IFwiY2VudGVyXCIgJiYgdmVydGljYWxQb3NpdGlvbiAhPSBcIm1pZGRsZVwiKSB7XG4gICAgICAgIGlmICh2ZXJ0aWNhbFBvc2l0aW9uID09IFwidG9wXCIpIHtcbiAgICAgICAgICB0b3AgPSB0b3AgKyB0YXJnZXRSZWN0LmhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b3AgPSB0b3AgLSB0YXJnZXRSZWN0LmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGxlZnQ6IE1hdGgucm91bmQobGVmdCksIHRvcDogTWF0aC5yb3VuZCh0b3ApIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVZlcnRpY2FsRGltZW5zaW9ucyhcbiAgICB0b3A6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICB3aW5kb3dIZWlnaHQ6IG51bWJlclxuICApIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0b3AgPCAwKSB7XG4gICAgICByZXN1bHQgPSB7IGhlaWdodDogaGVpZ2h0ICsgdG9wLCB0b3A6IDAgfTtcbiAgICB9IGVsc2UgaWYgKGhlaWdodCArIHRvcCA+IHdpbmRvd0hlaWdodCkge1xuICAgICAgcmVzdWx0ID0geyBoZWlnaHQ6IHdpbmRvd0hlaWdodCAtIHRvcCwgdG9wOiB0b3AgfTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlVmVydGljYWxQb3NpdGlvbihcbiAgICB0YXJnZXRSZWN0OiBDbGllbnRSZWN0LFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIHZlcnRpY2FsUG9zaXRpb246IFZlcnRpY2FsUG9zaXRpb24sXG4gICAgc2hvd1BvaW50ZXI6IGJvb2xlYW4sXG4gICAgd2luZG93SGVpZ2h0OiBudW1iZXJcbiAgKTogVmVydGljYWxQb3NpdGlvbiB7XG4gICAgbGV0IGRlbHRhVG9wID1cbiAgICAgIGhlaWdodCAtICh0YXJnZXRSZWN0LnRvcCArIChzaG93UG9pbnRlciA/IHRhcmdldFJlY3QuaGVpZ2h0IDogMCkpO1xuICAgIGxldCBkZWx0YUJvdHRvbSA9XG4gICAgICBoZWlnaHQgK1xuICAgICAgdGFyZ2V0UmVjdC5ib3R0b20gLVxuICAgICAgKHNob3dQb2ludGVyID8gdGFyZ2V0UmVjdC5oZWlnaHQgOiAwKSAtXG4gICAgICB3aW5kb3dIZWlnaHQ7XG4gICAgaWYgKGRlbHRhVG9wID4gMCAmJiBkZWx0YUJvdHRvbSA8PSAwICYmIHZlcnRpY2FsUG9zaXRpb24gPT0gXCJ0b3BcIikge1xuICAgICAgdmVydGljYWxQb3NpdGlvbiA9IFwiYm90dG9tXCI7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGRlbHRhQm90dG9tID4gMCAmJlxuICAgICAgZGVsdGFUb3AgPD0gMCAmJlxuICAgICAgdmVydGljYWxQb3NpdGlvbiA9PSBcImJvdHRvbVwiXG4gICAgKSB7XG4gICAgICB2ZXJ0aWNhbFBvc2l0aW9uID0gXCJ0b3BcIjtcbiAgICB9IGVsc2UgaWYgKGRlbHRhQm90dG9tID4gMCAmJiBkZWx0YVRvcCA+IDApIHtcbiAgICAgIHZlcnRpY2FsUG9zaXRpb24gPSBkZWx0YVRvcCA8IGRlbHRhQm90dG9tID8gXCJ0b3BcIiA6IFwiYm90dG9tXCI7XG4gICAgfVxuICAgIHJldHVybiB2ZXJ0aWNhbFBvc2l0aW9uO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjYWxjdWxhdGVQb3B1cERpcmVjdGlvbihcbiAgICB2ZXJ0aWNhbFBvc2l0aW9uOiBWZXJ0aWNhbFBvc2l0aW9uLFxuICAgIGhvcml6b250YWxQb3NpdGlvbjogSG9yaXpvbnRhbFBvc2l0aW9uXG4gICkge1xuICAgIHZhciBwb3B1cERpcmVjdGlvbjogc3RyaW5nO1xuICAgIGlmIChob3Jpem9udGFsUG9zaXRpb24gPT0gXCJjZW50ZXJcIiAmJiB2ZXJ0aWNhbFBvc2l0aW9uICE9IFwibWlkZGxlXCIpIHtcbiAgICAgIHBvcHVwRGlyZWN0aW9uID0gdmVydGljYWxQb3NpdGlvbjtcbiAgICB9IGVsc2UgaWYgKGhvcml6b250YWxQb3NpdGlvbiAhPSBcImNlbnRlclwiKSB7XG4gICAgICBwb3B1cERpcmVjdGlvbiA9IGhvcml6b250YWxQb3NpdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHBvcHVwRGlyZWN0aW9uO1xuICB9XG5cbiAgLy9jYWxsZWQgd2hlbiBzaG93UG9pbnRlciAgaXMgdHJ1ZVxuICBwdWJsaWMgc3RhdGljIGNhbGN1bGF0ZVBvaW50ZXJUYXJnZXQoXG4gICAgdGFyZ2V0UmVjdDogQ2xpZW50UmVjdCxcbiAgICB0b3A6IG51bWJlcixcbiAgICBsZWZ0OiBudW1iZXIsXG4gICAgdmVydGljYWxQb3NpdGlvbjogVmVydGljYWxQb3NpdGlvbixcbiAgICBob3Jpem9udGFsUG9zaXRpb246IEhvcml6b250YWxQb3NpdGlvblxuICApIHtcbiAgICB2YXIgdGFyZ2V0UG9zOiBJTnVtYmVyUG9zaXRpb24gPSB7fTtcbiAgICBpZiAoaG9yaXpvbnRhbFBvc2l0aW9uICE9IFwiY2VudGVyXCIpIHtcbiAgICAgIHRhcmdldFBvcy50b3AgPSB0YXJnZXRSZWN0LnRvcCArIHRhcmdldFJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgIHRhcmdldFBvcy5sZWZ0ID0gdGFyZ2V0UmVjdFtob3Jpem9udGFsUG9zaXRpb25dO1xuICAgIH0gZWxzZSBpZiAodmVydGljYWxQb3NpdGlvbiAhPSBcIm1pZGRsZVwiKSB7XG4gICAgICB0YXJnZXRQb3MudG9wID0gdGFyZ2V0UmVjdFt2ZXJ0aWNhbFBvc2l0aW9uXTtcbiAgICAgIHRhcmdldFBvcy5sZWZ0ID0gdGFyZ2V0UmVjdC5sZWZ0ICsgdGFyZ2V0UmVjdC53aWR0aCAvIDI7XG4gICAgfVxuICAgIHRhcmdldFBvcy5sZWZ0ID0gTWF0aC5yb3VuZCh0YXJnZXRQb3MubGVmdCAtIGxlZnQpO1xuICAgIHRhcmdldFBvcy50b3AgPSBNYXRoLnJvdW5kKHRhcmdldFBvcy50b3AgLSB0b3ApO1xuICAgIHJldHVybiB0YXJnZXRQb3M7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFkYXB0aXZlQWN0aW9uQ29udGFpbmVyIH0gZnJvbSBcIi4uL2FjdGlvbnMvYWRhcHRpdmUtY29udGFpbmVyXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25cIjtcblxuaW50ZXJmYWNlIElEaW1lbnNpb25zIHtcbiAgc2Nyb2xsOiBudW1iZXI7XG4gIG9mZnNldDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzcG9uc2l2aXR5TWFuYWdlciB7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIGlzSW5pbGl6ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG1pbkRpbWVuc2lvbkNvbnN0ID0gNTY7XG4gIHNlcGFyYXRvclNpemUgPSAxNztcblxuICBwdWJsaWMgZ2V0Q29tcHV0ZWRTdHlsZTogKFxuICAgIGVsdDogRWxlbWVudFxuICApID0+IENTU1N0eWxlRGVjbGFyYXRpb24gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZS5iaW5kKHdpbmRvdyk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQsXG4gICAgcHJpdmF0ZSBtb2RlbDogQWRhcHRpdmVBY3Rpb25Db250YWluZXIsXG4gICAgcHJpdmF0ZSBpdGVtc1NlbGVjdG9yOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBkb3RzSXRlbVNpemU6IG51bWJlciA9IDQ4XG4gICkge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKF8pID0+IHRoaXMucHJvY2VzcygpKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5jb250YWluZXIucGFyZW50RWxlbWVudCk7XG4gIH1cblxuICBnZXQgaXRlbXMoKTogQXJyYXk8QWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuYWN0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udmlzaWJsZSAhPT0gZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldERpbWVuc2lvbnMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBJRGltZW5zaW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbDogZWxlbWVudC5zY3JvbGxXaWR0aCxcbiAgICAgIG9mZnNldDogZWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEF2YWlsYWJsZVNwYWNlKCk6IG51bWJlciB7XG4gICAgY29uc3Qgc3R5bGU6IENTU1N0eWxlRGVjbGFyYXRpb24gPSB0aGlzLmdldENvbXB1dGVkU3R5bGUodGhpcy5jb250YWluZXIpO1xuICAgIGxldCBzcGFjZSA9IHRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoO1xuICAgIGlmIChzdHlsZS5ib3hTaXppbmcgPT09IFwiYm9yZGVyLWJveFwiKSB7XG4gICAgICBzcGFjZSAtPSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ1JpZ2h0KTtcbiAgICB9XG4gICAgcmV0dXJuIHNwYWNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbGNJdGVtU2l6ZShpdGVtOiBIVE1MRGl2RWxlbWVudCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGl0ZW0ub2Zmc2V0V2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGNhbGNJdGVtc1NpemVzKCkge1xuICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLm1vZGVsLmFjdGlvbnM7XG4gICAgdGhpcy5jb250YWluZXJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuaXRlbXNTZWxlY3RvcilcbiAgICAgIC5mb3JFYWNoKChpdGVtOiBIVE1MRGl2RWxlbWVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBsZXQgY3VycmVudEFjdGlvbiA9IGFjdGlvbnNbaW5kZXhdO1xuICAgICAgICBjdXJyZW50QWN0aW9uLm1heERpbWVuc2lvbiA9IHRoaXMuY2FsY0l0ZW1TaXplKGl0ZW0pO1xuICAgICAgICBjdXJyZW50QWN0aW9uLm1pbkRpbWVuc2lvbiA9IGN1cnJlbnRBY3Rpb24uY2FuU2hyaW5rXG4gICAgICAgICAgPyB0aGlzLm1pbkRpbWVuc2lvbkNvbnN0ICtcbiAgICAgICAgICAgIChjdXJyZW50QWN0aW9uLm5lZWRTZXBhcmF0b3IgPyB0aGlzLnNlcGFyYXRvclNpemUgOiAwKVxuICAgICAgICAgIDogY3VycmVudEFjdGlvbi5tYXhEaW1lbnNpb247XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmlzaWJsZUl0ZW1zQ291bnQoc2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBpdGVtc1NpemVzOiBudW1iZXJbXSA9IHRoaXMuaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLm1pbkRpbWVuc2lvbik7XG4gICAgbGV0IGN1cnJTaXplOiBudW1iZXIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXNTaXplcy5sZW5ndGg7IGkrKykge1xuICAgICAgY3VyclNpemUgKz0gaXRlbXNTaXplc1tpXTtcbiAgICAgIGlmIChjdXJyU2l6ZSA+IHNpemUpIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gaTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSXRlbU1vZGUoZGltZW5zaW9uOiBudW1iZXIsIG1pblNpemU6IG51bWJlciwgbWF4U2l6ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIGZvciAobGV0IGluZGV4ID0gaXRlbXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgICAgaWYgKG1pblNpemUgPD0gZGltZW5zaW9uICYmIGRpbWVuc2lvbiA8IG1heFNpemUpIHtcbiAgICAgICAgbWF4U2l6ZSAtPSBpdGVtc1tpbmRleF0ubWF4RGltZW5zaW9uIC0gaXRlbXNbaW5kZXhdLm1pbkRpbWVuc2lvbjtcbiAgICAgICAgaXRlbXNbaW5kZXhdLm1vZGUgPSBcInNtYWxsXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtc1tpbmRleF0ubW9kZSA9IFwibGFyZ2VcIjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZml0KGRpbWVuc2lvbjogbnVtYmVyKSB7XG4gICAgaWYgKGRpbWVuc2lvbiA8PSAwKSByZXR1cm47XG5cbiAgICB0aGlzLm1vZGVsLnJlbW92ZURvdHNCdXR0b24oKTtcbiAgICBsZXQgbWluU2l6ZSA9IDA7XG4gICAgbGV0IG1heFNpemUgPSAwO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcztcblxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIG1pblNpemUgKz0gaXRlbS5taW5EaW1lbnNpb247XG4gICAgICBtYXhTaXplICs9IGl0ZW0ubWF4RGltZW5zaW9uO1xuICAgIH0pO1xuXG4gICAgaWYgKGRpbWVuc2lvbiA+PSBtYXhTaXplKSB7XG4gICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5tb2RlID0gXCJsYXJnZVwiKSk7XG4gICAgfSBlbHNlIGlmIChkaW1lbnNpb24gPCBtaW5TaXplKSB7XG4gICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5tb2RlID0gXCJzbWFsbFwiKSk7XG4gICAgICB0aGlzLm1vZGVsLnNob3dGaXJzdE4oXG4gICAgICAgIHRoaXMuZ2V0VmlzaWJsZUl0ZW1zQ291bnQoZGltZW5zaW9uIC0gdGhpcy5kb3RzSXRlbVNpemUpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUl0ZW1Nb2RlKGRpbWVuc2lvbiwgbWluU2l6ZSwgbWF4U2l6ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0luaWxpemVkKSB7XG4gICAgICB0aGlzLmNhbGNJdGVtc1NpemVzKCk7XG4gICAgICB0aGlzLmlzSW5pbGl6ZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmZpdCh0aGlzLmdldEF2YWlsYWJsZVNwYWNlKCkpO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZlcnRpY2FsUmVzcG9uc2l2aXR5TWFuYWdlciBleHRlbmRzIFJlc3BvbnNpdml0eU1hbmFnZXIge1xuICBwcm90ZWN0ZWQgbWluRGltZW5zaW9uQ29uc3QgPSA0MDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50LFxuICAgIG1vZGVsOiBBZGFwdGl2ZUFjdGlvbkNvbnRhaW5lcixcbiAgICBpdGVtc1NlbGVjdG9yOiBzdHJpbmcsXG4gICAgZG90c0l0ZW1TaXplPzogbnVtYmVyXG4gICkge1xuICAgIHN1cGVyKGNvbnRhaW5lciwgbW9kZWwsIGl0ZW1zU2VsZWN0b3IsIGRvdHNJdGVtU2l6ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RGltZW5zaW9ucygpOiBJRGltZW5zaW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbDogdGhpcy5jb250YWluZXIuc2Nyb2xsSGVpZ2h0LFxuICAgICAgb2Zmc2V0OiB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBdmFpbGFibGVTcGFjZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IHN0eWxlOiBDU1NTdHlsZURlY2xhcmF0aW9uID0gdGhpcy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuY29udGFpbmVyKTtcbiAgICBsZXQgc3BhY2U6IG51bWJlciA9IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDtcbiAgICBpZiAoc3R5bGUuYm94U2l6aW5nID09PSBcImJvcmRlci1ib3hcIikge1xuICAgICAgc3BhY2UgLT0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ0JvdHRvbSk7XG4gICAgfVxuICAgIHJldHVybiBzcGFjZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjYWxjSXRlbVNpemUoaXRlbTogSFRNTERpdkVsZW1lbnQpOiBudW1iZXIge1xuICAgIHJldHVybiBpdGVtLm9mZnNldEhlaWdodDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi8uLi9zZXR0aW5nc1wiO1xuZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zKGE6IGFueSwgYjogYW55KSB7XG4gIGNvbnN0IHJlZ0V4U3RyaXAwOiBSZWdFeHAgPSAvKFxcLjArKSskLztcbiAgY29uc3Qgc2VnbWVudHNBOiBzdHJpbmdbXSA9IGEucmVwbGFjZShyZWdFeFN0cmlwMCwgXCJcIikuc3BsaXQoXCIuXCIpO1xuICBjb25zdCBzZWdtZW50c0I6IHN0cmluZ1tdID0gYi5yZXBsYWNlKHJlZ0V4U3RyaXAwLCBcIlwiKS5zcGxpdChcIi5cIik7XG4gIGNvbnN0IGxlbjogbnVtYmVyID0gTWF0aC5taW4oc2VnbWVudHNBLmxlbmd0aCwgc2VnbWVudHNCLmxlbmd0aCk7XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IGRpZmY6IG51bWJlciA9XG4gICAgICBwYXJzZUludChzZWdtZW50c0FbaV0sIDEwKSAtIHBhcnNlSW50KHNlZ21lbnRzQltpXSwgMTApO1xuICAgIGlmIChkaWZmKSB7XG4gICAgICByZXR1cm4gZGlmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlZ21lbnRzQS5sZW5ndGggLSBzZWdtZW50c0IubGVuZ3RoO1xufVxuZnVuY3Rpb24gY29uZmlybUFjdGlvbihtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCEhc2V0dGluZ3MgJiYgISFzZXR0aW5ncy5jb25maXJtQWN0aW9uRnVuYylcbiAgICByZXR1cm4gc2V0dGluZ3MuY29uZmlybUFjdGlvbkZ1bmMobWVzc2FnZSk7XG4gIHJldHVybiBjb25maXJtKG1lc3NhZ2UpO1xufVxuZnVuY3Rpb24gZGV0ZWN0SUVCcm93c2VyKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB1YTogc3RyaW5nID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gIGNvbnN0IG9sZEllOiBudW1iZXIgPSB1YS5pbmRleE9mKFwiTVNJRSBcIik7XG4gIGNvbnN0IGVsZXZlbkllOiBudW1iZXIgPSB1YS5pbmRleE9mKFwiVHJpZGVudC9cIik7XG4gIHJldHVybiBvbGRJZSA+IC0xIHx8IGVsZXZlbkllID4gLTE7XG59XG5mdW5jdGlvbiBkZXRlY3RJRU9yRWRnZSgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiAoPGFueT5kZXRlY3RJRU9yRWRnZSkuaXNJRU9yRWRnZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNvbnN0IHVhOiBzdHJpbmcgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICBjb25zdCBtc2llOiBudW1iZXIgPSB1YS5pbmRleE9mKFwiTVNJRSBcIik7XG4gICAgY29uc3QgdHJpZGVudDogbnVtYmVyID0gdWEuaW5kZXhPZihcIlRyaWRlbnQvXCIpO1xuICAgIGNvbnN0IGVkZ2U6IG51bWJlciA9IHVhLmluZGV4T2YoXCJFZGdlL1wiKTtcbiAgICAoPGFueT5kZXRlY3RJRU9yRWRnZSkuaXNJRU9yRWRnZSA9IGVkZ2UgPiAwIHx8IHRyaWRlbnQgPiAwIHx8IG1zaWUgPiAwO1xuICB9XG4gIHJldHVybiAoPGFueT5kZXRlY3RJRU9yRWRnZSkuaXNJRU9yRWRnZTtcbn1cbmZ1bmN0aW9uIGxvYWRGaWxlRnJvbUJhc2U2NChiNjREYXRhOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBieXRlU3RyaW5nOiBzdHJpbmcgPSBhdG9iKGI2NERhdGEuc3BsaXQoXCIsXCIpWzFdKTtcblxuICAgIC8vIHNlcGFyYXRlIG91dCB0aGUgbWltZSBjb21wb25lbnRcbiAgICBjb25zdCBtaW1lU3RyaW5nOiBzdHJpbmcgPSBiNjREYXRhXG4gICAgICAuc3BsaXQoXCIsXCIpWzBdXG4gICAgICAuc3BsaXQoXCI6XCIpWzFdXG4gICAgICAuc3BsaXQoXCI7XCIpWzBdO1xuXG4gICAgLy8gd3JpdGUgdGhlIGJ5dGVzIG9mIHRoZSBzdHJpbmcgdG8gYW4gQXJyYXlCdWZmZXJcbiAgICBjb25zdCBhYjogQXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xuICAgIGNvbnN0IGlhOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYWIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZVN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgaWFbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIC8vIHdyaXRlIHRoZSBBcnJheUJ1ZmZlciB0byBhIGJsb2IsIGFuZCB5b3UncmUgZG9uZVxuICAgIGNvbnN0IGJiOiBCbG9iID0gbmV3IEJsb2IoW2FiXSwgeyB0eXBlOiBtaW1lU3RyaW5nIH0pO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgIHdpbmRvdy5uYXZpZ2F0b3IgJiZcbiAgICAgIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYlxuICAgICkge1xuICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJiLCBmaWxlTmFtZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHt9XG59XG5mdW5jdGlvbiBpc01vYmlsZSgpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cub3JpZW50YXRpb24gIT09IFwidW5kZWZpbmVkXCJcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50VmlzaWJsZShcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIHRocmVzaG9sZDogbnVtYmVyID0gMFxuKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZWxlbWVudFJlY3Q6IERPTVJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB2aWV3SGVpZ2h0OiBudW1iZXIgPSBNYXRoLm1heChcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LFxuICAgIHdpbmRvdy5pbm5lckhlaWdodFxuICApO1xuICBjb25zdCB0b3BXaW46IG51bWJlciA9IC10aHJlc2hvbGQ7XG4gIGNvbnN0IGJvdHRvbVdpbjogbnVtYmVyID0gdmlld0hlaWdodCArIHRocmVzaG9sZDtcbiAgY29uc3QgdG9wRWw6IG51bWJlciA9IGVsZW1lbnRSZWN0LnRvcDtcbiAgY29uc3QgYm90dG9tRWw6IG51bWJlciA9IGVsZW1lbnRSZWN0LmJvdHRvbTtcblxuICBjb25zdCBtYXhUb3A6IG51bWJlciA9IE1hdGgubWF4KHRvcFdpbiwgdG9wRWwpO1xuICBjb25zdCBtaW5Cb3R0b206IG51bWJlciA9IE1hdGgubWluKGJvdHRvbVdpbiwgYm90dG9tRWwpO1xuICByZXR1cm4gbWF4VG9wIDw9IG1pbkJvdHRvbTtcbn1cblxuZnVuY3Rpb24gZmluZFNjcm9sbGFibGVQYXJlbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cbiAgaWYgKFxuICAgIGVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZWxlbWVudC5jbGllbnRIZWlnaHQgJiZcbiAgICAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5vdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHxcbiAgICAgIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkub3ZlcmZsb3dZID09PSBcImF1dG9cIilcbiAgKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbmRTY3JvbGxhYmxlUGFyZW50KGVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2Nyb2xsRWxlbWVudEJ5Q2hpbGRJZChpZDogc3RyaW5nKSB7XG4gIGlmICghZG9jdW1lbnQpIHJldHVybjtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGlmICghZWwpIHJldHVybjtcbiAgY29uc3Qgc2Nyb2xsYWJsZUVsID0gZmluZFNjcm9sbGFibGVQYXJlbnQoZWwpO1xuICBpZiAoISFzY3JvbGxhYmxlRWwpIHtcbiAgICBzY3JvbGxhYmxlRWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJzY3JvbGxcIikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEljb25OYW1lRnJvbVByb3h5KGljb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWljb25OYW1lKSByZXR1cm4gaWNvbk5hbWU7XG4gIHZhciBwcm94eU5hbWUgPSAoPGFueT5zZXR0aW5ncy5jdXN0b21JY29ucylbaWNvbk5hbWVdO1xuICByZXR1cm4gISFwcm94eU5hbWUgPyBwcm94eU5hbWUgOiBpY29uTmFtZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ZnKFxuICBzaXplOiBudW1iZXIsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBpY29uTmFtZTogc3RyaW5nLFxuICBzdmdFbGVtOiBhbnlcbikge1xuICBzdmdFbGVtLnN0eWxlLndpZHRoID0gKHNpemUgfHwgd2lkdGggfHwgMTYpICsgXCJweFwiO1xuICBzdmdFbGVtLnN0eWxlLmhlaWdodCA9IChzaXplIHx8IGhlaWdodCB8fCAxNikgKyBcInB4XCI7XG4gIGNvbnN0IG5vZGU6IGFueSA9IHN2Z0VsZW0uY2hpbGROb2Rlc1swXTtcbiAgY29uc3QgcmVhbEljb25OYW1lID0gZ2V0SWNvbk5hbWVGcm9tUHJveHkoaWNvbk5hbWUpO1xuICBub2RlLnNldEF0dHJpYnV0ZU5TKFxuICAgIFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICAgIFwieGxpbms6aHJlZlwiLFxuICAgIFwiI1wiICsgcmVhbEljb25OYW1lXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXA8VD4odmFsdWU6IFQgfCAoKCkgPT4gVCkpOiBUIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoPCgpID0+IFQ+dmFsdWUpKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpemUodmFsdWU6IGFueSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIFwiXCIgKyB2YWx1ZSArIFwicHhcIjtcbiAgfVxuICBpZiAoISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxhc3RTeW1ib2w6IHN0cmluZyA9IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdO1xuICAgIGlmICgobGFzdFN5bWJvbCA+PSBcIjBcIiAmJiBsYXN0U3ltYm9sIDw9IFwiOVwiKSB8fCBsYXN0U3ltYm9sID09IFwiLlwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBudW06IG51bWJlciA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICByZXR1cm4gXCJcIiArIG51bSArIFwicHhcIjtcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBkb0tleTJDbGljayhldjogYW55KSB7XG4gIHZhciBlbDogYW55ID0gZXYudGFyZ2V0O1xuICBpZiAoIWVsKSByZXR1cm47XG4gIHZhciBjaGFyID0gZXYud2hpY2ggfHwgZXYua2V5Q29kZTtcbiAgaWYgKGNoYXIgPT09IDEzIHx8IGNoYXIgPT09IDMyKSB7XG4gICAgaWYgKGVsLmNsaWNrKSBlbC5jbGljaygpO1xuICB9IGVsc2UgaWYgKGNoYXIgPT09IDI3KSB7XG4gICAgaWYgKGVsLmJsdXIpIGVsLmJsdXIoKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIGNvbmZpcm1BY3Rpb24sXG4gIGRldGVjdElFT3JFZGdlLFxuICBkZXRlY3RJRUJyb3dzZXIsXG4gIGxvYWRGaWxlRnJvbUJhc2U2NCxcbiAgaXNNb2JpbGUsXG4gIGlzRWxlbWVudFZpc2libGUsXG4gIGZpbmRTY3JvbGxhYmxlUGFyZW50LFxuICBzY3JvbGxFbGVtZW50QnlDaGlsZElkLFxuICBjcmVhdGVTdmcsXG4gIGRvS2V5MkNsaWNrLFxuICBnZXRJY29uTmFtZUZyb21Qcm94eSxcbn07XG4iLCJpbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSVN1cnZleUVycm9yT3duZXIsIElTdXJ2ZXkgfSBmcm9tIFwiLi9iYXNlLWludGVyZmFjZXNcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vc3VydmV5LWVycm9yXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciwgUmVxdXJlTnVtZXJpY0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlc3VsdCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB2YWx1ZTogYW55LCBwdWJsaWMgZXJyb3I6IFN1cnZleUVycm9yID0gbnVsbCkge31cbn1cbi8qKlxuICogQmFzZSBTdXJ2ZXlKUyB2YWxpZGF0b3IgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlIHtcbiAgcHVibGljIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyO1xuICBwdWJsaWMgb25Bc3luY0NvbXBsZXRlZDogKHJlc3VsdDogVmFsaWRhdG9yUmVzdWx0KSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ0ZXh0XCIsIHRoaXMsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBnZXRTdXJ2ZXkobGl2ZTogYm9vbGVhbiA9IGZhbHNlKTogSVN1cnZleSB7XG4gICAgcmV0dXJuICEhdGhpcy5lcnJvck93bmVyICYmICEhKDxhbnk+dGhpcy5lcnJvck93bmVyKVtcImdldFN1cnZleVwiXVxuICAgICAgPyAoPGFueT50aGlzLmVycm9yT3duZXIpLmdldFN1cnZleSgpXG4gICAgICA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRleHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGV4dFwiLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBpc1ZhbGlkYXRlQWxsVmFsdWVzKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBnZXQgbG9jVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0ZXh0XCIpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFcnJvclRleHQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50ZXh0KSByZXR1cm4gdGhpcy50ZXh0O1xuICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRFcnJvclRleHQobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldCBpc1J1bm5pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBc3luYygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5lcnJvck93bmVyID8gdGhpcy5lcnJvck93bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMuZXJyb3JPd25lclxuICAgICAgPyB0aGlzLmVycm9yT3duZXIuZ2V0TWFya2Rvd25IdG1sKHRleHQsIG5hbWUpXG4gICAgICA6IG51bGw7XG4gIH1cbiAgZ2V0UmVuZGVyZXIobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmVycm9yT3duZXIgPyB0aGlzLmVycm9yT3duZXIuZ2V0UmVuZGVyZXIobmFtZSkgOiBudWxsO1xuICB9XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmVycm9yT3duZXIgPyB0aGlzLmVycm9yT3duZXIuZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0KSA6IHRleHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUN1c3RvbUVycm9yKG5hbWU6IHN0cmluZyk6IFN1cnZleUVycm9yIHtcbiAgICByZXR1cm4gbmV3IEN1c3RvbUVycm9yKHRoaXMuZ2V0RXJyb3JUZXh0KG5hbWUpLCB0aGlzLmVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFR5cGUoKS5yZXBsYWNlKFwidmFsaWRhdG9yXCIsIFwiXCIpO1xuICAgIGlmICghIXRoaXMudGV4dCkge1xuICAgICAgcmVzICs9IFwiLCBcIiArIHRoaXMudGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBJVmFsaWRhdG9yT3duZXIge1xuICBnZXRWYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj47XG4gIHZhbGlkYXRlZFZhbHVlOiBhbnk7XG4gIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZztcbiAgZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCk6IGFueTtcbiAgZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpOiBhbnk7XG59XG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yUnVubmVyIHtcbiAgcHJpdmF0ZSBhc3luY1ZhbGlkYXRvcnM6IEFycmF5PFN1cnZleVZhbGlkYXRvcj47XG4gIHB1YmxpYyBvbkFzeW5jQ29tcGxldGVkOiAoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pID0+IHZvaWQ7XG4gIHB1YmxpYyBydW4ob3duZXI6IElWYWxpZGF0b3JPd25lcik6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBudWxsO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gbnVsbDtcbiAgICB0aGlzLnByZXBhcmVBc3luY1ZhbGlkYXRvcnMoKTtcbiAgICB2YXIgYXN5bmNSZXN1bHRzOiBBcnJheTxTdXJ2ZXlFcnJvcj4gPSBbXTtcbiAgICB2YXIgdmFsaWRhdG9ycyA9IG93bmVyLmdldFZhbGlkYXRvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWxpZGF0b3IgPSB2YWxpZGF0b3JzW2ldO1xuICAgICAgaWYgKCF2YWx1ZXMgJiYgdmFsaWRhdG9yLmlzVmFsaWRhdGVBbGxWYWx1ZXMpIHtcbiAgICAgICAgdmFsdWVzID0gb3duZXIuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCk7XG4gICAgICAgIHByb3BlcnRpZXMgPSBvd25lci5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgICB9XG4gICAgICBpZiAodmFsaWRhdG9yLmlzQXN5bmMpIHtcbiAgICAgICAgdGhpcy5hc3luY1ZhbGlkYXRvcnMucHVzaCh2YWxpZGF0b3IpO1xuICAgICAgICB2YWxpZGF0b3Iub25Bc3luY0NvbXBsZXRlZCA9IChyZXN1bHQ6IFZhbGlkYXRvclJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmICghIXJlc3VsdCAmJiAhIXJlc3VsdC5lcnJvcikgYXN5bmNSZXN1bHRzLnB1c2gocmVzdWx0LmVycm9yKTtcbiAgICAgICAgICBpZiAoIXRoaXMub25Bc3luY0NvbXBsZXRlZCkgcmV0dXJuO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hc3luY1ZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFzeW5jVmFsaWRhdG9yc1tpXS5pc1J1bm5pbmcpIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vbkFzeW5jQ29tcGxldGVkKGFzeW5jUmVzdWx0cyk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHZhbGlkYXRvcnMgPSBvd25lci5nZXRWYWxpZGF0b3JzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsaWRhdG9yID0gdmFsaWRhdG9yc1tpXTtcblxuICAgICAgdmFyIHZhbGlkYXRvclJlc3VsdCA9IHZhbGlkYXRvci52YWxpZGF0ZShcbiAgICAgICAgb3duZXIudmFsaWRhdGVkVmFsdWUsXG4gICAgICAgIG93bmVyLmdldFZhbGlkYXRvclRpdGxlKCksXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgcHJvcGVydGllc1xuICAgICAgKTtcbiAgICAgIGlmICghIXZhbGlkYXRvclJlc3VsdCAmJiAhIXZhbGlkYXRvclJlc3VsdC5lcnJvcikge1xuICAgICAgICByZXMucHVzaCh2YWxpZGF0b3JSZXN1bHQuZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5hc3luY1ZhbGlkYXRvcnMubGVuZ3RoID09IDAgJiYgISF0aGlzLm9uQXN5bmNDb21wbGV0ZWQpXG4gICAgICB0aGlzLm9uQXN5bmNDb21wbGV0ZWQoW10pO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBwcmVwYXJlQXN5bmNWYWxpZGF0b3JzKCkge1xuICAgIGlmICghIXRoaXMuYXN5bmNWYWxpZGF0b3JzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXN5bmNWYWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYXN5bmNWYWxpZGF0b3JzW2ldLm9uQXN5bmNDb21wbGV0ZWQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFzeW5jVmFsaWRhdG9ycyA9IFtdO1xuICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIG51bWVyaWMgdmFsdWVzLlxuICovXG5leHBvcnQgY2xhc3MgTnVtZXJpY1ZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1pblZhbHVlOiBudW1iZXIgPSBudWxsLCBtYXhWYWx1ZTogbnVtYmVyID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5taW5WYWx1ZSA9IG1pblZhbHVlO1xuICAgIHRoaXMubWF4VmFsdWUgPSBtYXhWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm51bWVyaWN2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCFIZWxwZXJzLmlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIG5ldyBSZXF1cmVOdW1lcmljRXJyb3IobnVsbCwgdGhpcy5lcnJvck93bmVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQocGFyc2VGbG9hdCh2YWx1ZSkpO1xuICAgIGlmICh0aGlzLm1pblZhbHVlICE9PSBudWxsICYmIHRoaXMubWluVmFsdWUgPiByZXN1bHQudmFsdWUpIHtcbiAgICAgIHJlc3VsdC5lcnJvciA9IHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhWYWx1ZSAhPT0gbnVsbCAmJiB0aGlzLm1heFZhbHVlIDwgcmVzdWx0LnZhbHVlKSB7XG4gICAgICByZXN1bHQuZXJyb3IgPSB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiA/IG51bGwgOiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHZOYW1lID0gbmFtZSA/IG5hbWUgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidmFsdWVcIik7XG4gICAgaWYgKHRoaXMubWluVmFsdWUgIT09IG51bGwgJiYgdGhpcy5tYXhWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwibnVtZXJpY01pbk1heFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odk5hbWUsIHRoaXMubWluVmFsdWUsIHRoaXMubWF4VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgICAgLmdldFN0cmluZyhcIm51bWVyaWNNaW5cIilcbiAgICAgICAgICBbXCJmb3JtYXRcIl0odk5hbWUsIHRoaXMubWluVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwibnVtZXJpY01heFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odk5hbWUsIHRoaXMubWF4VmFsdWUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhlIG1pblZhbHVlIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5WYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5WYWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblZhbHVlKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluVmFsdWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heFZhbHVlIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhWYWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFZhbHVlKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VmFsdWVcIiwgdmFsKTtcbiAgfVxufVxuLyoqXG4gKiBWYWxpZGF0ZSB0ZXh0IHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRleHRWYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtaW5MZW5ndGg6IG51bWJlciA9IDAsXG4gICAgbWF4TGVuZ3RoOiBudW1iZXIgPSAwLFxuICAgIGFsbG93RGlnaXRzID0gdHJ1ZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWluTGVuZ3RoID0gbWluTGVuZ3RoO1xuICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xuICAgIHRoaXMuYWxsb3dEaWdpdHMgPSBhbGxvd0RpZ2l0cztcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInRleHR2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLmFsbG93RGlnaXRzKSB7XG4gICAgICB2YXIgcmVnID0gL15bQS1aYS16XFxzXSokLztcbiAgICAgIGlmICghcmVnLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KG51bGwsIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5taW5MZW5ndGggPiAwICYmIHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChudWxsLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4TGVuZ3RoID4gMCAmJiB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQobnVsbCwgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1pbkxlbmd0aCA+IDAgJiYgdGhpcy5tYXhMZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwidGV4dE1pbk1heExlbmd0aFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5MZW5ndGgsIHRoaXMubWF4TGVuZ3RoKTtcbiAgICBpZiAodGhpcy5taW5MZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwidGV4dE1pbkxlbmd0aFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5MZW5ndGgpO1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJ0ZXh0TWF4TGVuZ3RoXCIpXG4gICAgICBbXCJmb3JtYXRcIl0odGhpcy5tYXhMZW5ndGgpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluTGVuZ3RoIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5MZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluTGVuZ3RoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluTGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWluTGVuZ3RoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhMZW5ndGggcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhMZW5ndGhcIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXhMZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhMZW5ndGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGFsbG93RGlnaXRzIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0RpZ2l0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dEaWdpdHNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0RpZ2l0cyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0RpZ2l0c1wiLCB2YWwpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBbnN3ZXJDb3VudFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1pbkNvdW50OiBudW1iZXIgPSBudWxsLCBtYXhDb3VudDogbnVtYmVyID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5taW5Db3VudCA9IG1pbkNvdW50O1xuICAgIHRoaXMubWF4Q291bnQgPSBtYXhDb3VudDtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImFuc3dlcmNvdW50dmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgbmFtZTogc3RyaW5nID0gbnVsbCxcbiAgICB2YWx1ZXM6IGFueSA9IG51bGwsXG4gICAgcHJvcGVydGllczogYW55ID0gbnVsbFxuICApOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmNvbnN0cnVjdG9yICE9IEFycmF5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgY291bnQgPSB2YWx1ZS5sZW5ndGg7XG4gICAgaWYgKGNvdW50ID09IDApIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLm1pbkNvdW50ICYmIGNvdW50IDwgdGhpcy5taW5Db3VudCkge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IoXG4gICAgICAgICAgc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgICAgICAuZ2V0U3RyaW5nKFwibWluU2VsZWN0RXJyb3JcIilcbiAgICAgICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pbkNvdW50KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhDb3VudCAmJiBjb3VudCA+IHRoaXMubWF4Q291bnQpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KFxuICAgICAgICBudWxsLFxuICAgICAgICB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKFxuICAgICAgICAgIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAgICAgLmdldFN0cmluZyhcIm1heFNlbGVjdEVycm9yXCIpXG4gICAgICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5tYXhDb3VudClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5Db3VudCBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWluQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluQ291bnRcIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW5Db3VudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbkNvdW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhDb3VudCBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4Q291bnRcIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXhDb3VudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heENvdW50XCIsIHZhbCk7XG4gIH1cbn1cbi8qKlxuICogVXNlIGl0IHRvIHZhbGlkYXRlIHRoZSB0ZXh0IGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWdleFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKHJlZ2V4OiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlZ2V4ID0gcmVnZXg7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZWdleHZhbGlkYXRvclwiO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgdmFsdWVzOiBhbnkgPSBudWxsLFxuICAgIHByb3BlcnRpZXM6IGFueSA9IG51bGxcbiAgKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMucmVnZXggfHwgdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKHRoaXMucmVnZXgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5oYXNFcnJvcihyZSwgdmFsdWVbaV0sIG5hbWUpO1xuICAgICAgICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYXNFcnJvcihyZSwgdmFsdWUsIG5hbWUpO1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3IocmU6IFJlZ0V4cCwgdmFsdWU6IGFueSwgbmFtZTogc3RyaW5nKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAocmUudGVzdCh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KHZhbHVlLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHJlZ2V4IHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCByZWdleCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZWdleFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlZ2V4KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVnZXhcIiwgdmFsKTtcbiAgfVxufVxuLyoqXG4gKiBWYWxpZGF0ZSBlLW1haWwgYWRkcmVzcyBpbiB0aGUgdGV4dCBpbnB1dFxuICovXG5leHBvcnQgY2xhc3MgRW1haWxWYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBwcml2YXRlIHJlID0gL14oKFtePD4oKVxcW1xcXVxcLiw7Olxcc0BcXFwiXSsoXFwuW148PigpXFxbXFxdXFwuLDs6XFxzQFxcXCJdKykqKXwoXFxcIi4rXFxcIikpQCgoW148PigpPVtcXF1cXC4sOzpcXHNAXFxcIl0rXFwuKStbXjw+KCk9W1xcXVxcLiw7Olxcc0BcXFwiXXsyLH0pJC9pO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZW1haWx2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMucmUudGVzdCh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KHZhbHVlLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEVycm9yVGV4dChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImludmFsaWRFbWFpbFwiKTtcbiAgfVxufVxuXG4vKipcbiAqIFNob3cgZXJyb3IgaWYgZXhwcmVzc2lvbiByZXR1cm5zIGZhbHNlXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uVmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSBjb25kaXRpb25SdW5uZXI6IENvbmRpdGlvblJ1bm5lciA9IG51bGw7XG4gIHByaXZhdGUgaXNSdW5uaW5nVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImV4cHJlc3Npb252YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmFsaWRhdGVBbGxWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBpc0FzeW5jKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5lbnN1cmVDb25kaXRpb25SdW5uZXIoKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmNvbmRpdGlvblJ1bm5lci5pc0FzeW5jO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSdW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUnVubmluZ1ZhbHVlO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgdmFsdWVzOiBhbnkgPSBudWxsLFxuICAgIHByb3BlcnRpZXM6IGFueSA9IG51bGxcbiAgKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuZW5zdXJlQ29uZGl0aW9uUnVubmVyKCkpIHJldHVybiBudWxsO1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzKSA9PiB7XG4gICAgICB0aGlzLmlzUnVubmluZ1ZhbHVlID0gZmFsc2U7XG4gICAgICBpZiAoISF0aGlzLm9uQXN5bmNDb21wbGV0ZWQpIHtcbiAgICAgICAgdGhpcy5vbkFzeW5jQ29tcGxldGVkKHRoaXMuZ2VuZXJhdGVFcnJvcihyZXMsIHZhbHVlLCBuYW1lKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmlzUnVubmluZ1ZhbHVlID0gdHJ1ZTtcbiAgICB2YXIgcmVzID0gdGhpcy5jb25kaXRpb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaWYgKHRoaXMuY29uZGl0aW9uUnVubmVyLmlzQXN5bmMpIHJldHVybiBudWxsO1xuICAgIHRoaXMuaXNSdW5uaW5nVmFsdWUgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUVycm9yKHJlcywgdmFsdWUsIG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZUVycm9yKHJlczogYm9vbGVhbiwgdmFsdWU6IGFueSwgbmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KHZhbHVlLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcImludmFsaWRFeHByZXNzaW9uXCIpXG4gICAgICBbXCJmb3JtYXRcIl0odGhpcy5leHByZXNzaW9uKTtcbiAgfVxuICBwcm90ZWN0ZWQgZW5zdXJlQ29uZGl0aW9uUnVubmVyKCk6IGJvb2xlYW4ge1xuICAgIGlmICghIXRoaXMuY29uZGl0aW9uUnVubmVyKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghdGhpcy5leHByZXNzaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBleHByZXNzaW9uIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCB2YWwpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXCJzdXJ2ZXl2YWxpZGF0b3JcIiwgW1xuICB7IG5hbWU6IFwidGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGV4dFwiIH0sXG5dKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibnVtZXJpY3ZhbGlkYXRvclwiLFxuICBbXCJtaW5WYWx1ZTpudW1iZXJcIiwgXCJtYXhWYWx1ZTpudW1iZXJcIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgTnVtZXJpY1ZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJ0ZXh0dmFsaWRhdG9yXCIsXG4gIFtcIm1pbkxlbmd0aDpudW1iZXJcIiwgXCJtYXhMZW5ndGg6bnVtYmVyXCIsIFwiYWxsb3dEaWdpdHM6Ym9vbGVhblwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0VmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImFuc3dlcmNvdW50dmFsaWRhdG9yXCIsXG4gIFtcIm1pbkNvdW50Om51bWJlclwiLCBcIm1heENvdW50Om51bWJlclwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBBbnN3ZXJDb3VudFZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJyZWdleHZhbGlkYXRvclwiLFxuICBbXCJyZWdleFwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdleFZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJlbWFpbHZhbGlkYXRvclwiLFxuICBbXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBFbWFpbFZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImV4cHJlc3Npb252YWxpZGF0b3JcIixcbiAgW1wiZXhwcmVzc2lvbjpjb25kaXRpb25cIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2tub2Nrb3V0X187Il0sInNvdXJjZVJvb3QiOiIifQ==\n\n//# sourceURL=webpack:///./node_modules/survey-knockout/survey.ko.js?"); + +/***/ }), + +/***/ "./node_modules/surveyjs-widgets/surveyjs-widgets.js": +/*!***********************************************************!*\ + !*** ./node_modules/surveyjs-widgets/surveyjs-widgets.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory(__webpack_require__(/*! inputmask */ \"./node_modules/inputmask/dist/inputmask.js\"), __webpack_require__(/*! nouislider */ \"./node_modules/nouislider/distribute/nouislider.js\"), __webpack_require__(/*! sortablejs */ \"./node_modules/sortablejs/modular/sortable.esm.js\"), __webpack_require__(/*! bootstrap-slider */ \"./node_modules/bootstrap-slider/dist/bootstrap-slider.js\"));\n\telse {}\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_3__, __WEBPACK_EXTERNAL_MODULE_7__, __WEBPACK_EXTERNAL_MODULE_10__, __WEBPACK_EXTERNAL_MODULE_15__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 21);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\nfunction escValue(val) {\n if (typeof val === \"string\") {\n return (val || \"\").replace(/(['])/g, \"\\\\$1\");\n }\n return val;\n}\n\nfunction init(Survey, $) {\n $ = $ || window.$;\n var widget = {\n className: \"iradio_square-blue\",\n checkboxClass: \"iradio_square-blue\",\n radioClass: \"iradio_square-blue\",\n name: \"icheck\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.iCheck;\n },\n isFit: function (question) {\n var t = question.getType();\n return t === \"radiogroup\" || t === \"checkbox\" || t === \"matrix\";\n },\n isDefaultRender: true,\n afterRender: function (question, el) {\n var rootWidget = this;\n var $el = $(el);\n\n $el.find(\".sv-item__decorator\").hide();\n\n $el.find(\"input\").data({\n iCheck: undefined,\n });\n function getIndexByValue(arr, value) {\n if (!Array.isArray(arr)) return -1;\n for (var i = 0; i < arr.length; i++) {\n if (arr[i] == value) return i;\n if (!!arr[i] && arr[i].toString().toLowerCase() == value) return i;\n }\n return -1;\n }\n var frozeUpdating = false;\n var makeChoicesICheck = function () {\n var inputs = $el.find(\"input\");\n inputs.iCheck({\n checkboxClass:\n question.checkboxClass ||\n rootWidget.checkboxClass ||\n rootWidget.className,\n radioClass:\n question.radioClass ||\n rootWidget.radioClass ||\n rootWidget.className,\n });\n inputs.on(\"ifChecked\", function (event) {\n if (frozeUpdating) return;\n if (question.getType() === \"matrix\") {\n question.generatedVisibleRows.forEach(function (row, index, rows) {\n if (row.fullName === event.target.name) {\n row.value = event.target.value;\n }\n });\n } else if (question.getType() === \"checkbox\") {\n var oldValue = question.value || [];\n var index = getIndexByValue(oldValue, event.target.value);\n if (index === -1) {\n question.value = oldValue.concat([event.target.value]);\n }\n } else {\n question.value = event.target.value;\n }\n });\n\n inputs.on(\"ifUnchecked\", function (event) {\n if (frozeUpdating) return;\n if (question.getType() === \"checkbox\") {\n var oldValue = (question.value || []).slice();\n var index = getIndexByValue(oldValue, event.target.value);\n if (index >= 0) {\n oldValue.splice(index, 1);\n question.value = oldValue;\n }\n }\n });\n };\n function uncheckIcheck(cEl) {\n cEl.iCheck(\"uncheck\");\n cEl[0].parentElement.classList.remove(\"checked\");\n }\n var select = function () {\n frozeUpdating = true;\n if (question.getType() !== \"matrix\") {\n var values = question.value;\n if (!Array.isArray(values)) {\n values = [values];\n }\n if (question.getType() == \"checkbox\") {\n var qValue = question.value;\n question.visibleChoices.forEach(function (item) {\n var inEl = $el.find(\n \"input[value='\" + escValue(item.value) + \"']\"\n );\n if (!inEl) return;\n var isChecked = getIndexByValue(qValue, item.value) > -1;\n if (isChecked) {\n inEl.iCheck(\"check\");\n } else {\n var cEl = inEl[0];\n var wasChecked = !!cEl[\"checked\"];\n if (wasChecked) {\n inEl.removeAttr(\"checked\");\n if (!inEl.parent().hasClass(\"checked\"))\n setTimeout(function () {\n uncheckIcheck(inEl);\n });\n else uncheckIcheck(inEl);\n }\n }\n });\n } else {\n values.forEach(function (value) {\n $el\n .find(\"input[value='\" + escValue(value) + \"']\")\n .iCheck(\"check\");\n });\n }\n } else {\n question.generatedVisibleRows.forEach(function (row, index, rows) {\n if (row.value) {\n $(el)\n .find(\n \"input[name='\" +\n row.fullName +\n \"'][value='\" +\n escValue(row.value) +\n \"']\"\n )\n .iCheck(\"check\");\n }\n });\n }\n frozeUpdating = false;\n };\n makeChoicesICheck();\n\n question.visibleChoicesChangedCallback = function () {\n makeChoicesICheck();\n $el.find(\".sv-item__decorator\").hide();\n };\n question.valueChangedCallback = select;\n select();\n },\n willUnmount: function (question, el) {\n var $el = $(el);\n $el.find(\"input\").iCheck(\"destroy\");\n question.visibleChoicesChangedCallback = null;\n },\n };\n\n Survey.JsonObject.metaData.addProperty(\"radiogroup\", {\n name: \"radioClass\",\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"checkbox\", {\n name: \"checkboxClass\",\n category: \"general\",\n });\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"type\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\nfunction init(Survey, $) {\n $ = $ || window.$;\n var widget = {\n activatedBy: \"property\",\n name: \"select2\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.select2;\n },\n isFit: function (question) {\n if (widget.activatedBy == \"property\")\n return (\n question[\"renderAs\"] === \"select2\" &&\n question.getType() === \"dropdown\"\n );\n if (widget.activatedBy == \"type\")\n return question.getType() === \"dropdown\";\n if (widget.activatedBy == \"customtype\")\n return question.getType() === \"select2\";\n return false;\n },\n activatedByChanged: function (activatedBy) {\n if (!this.widgetIsLoaded()) return;\n widget.activatedBy = activatedBy;\n Survey.JsonObject.metaData.removeProperty(\"dropdown\", \"renderAs\");\n if (activatedBy == \"property\") {\n Survey.JsonObject.metaData.addProperty(\"dropdown\", {\n name: \"renderAs\",\n category: \"general\",\n default: \"default\",\n choices: [\"select2\", \"default\"],\n });\n Survey.JsonObject.metaData.addProperty(\"dropdown\", {\n dependsOn: \"renderAs\",\n category: \"general\",\n name: \"select2Config\",\n visibleIf: function (obj) {\n return obj.renderAs == \"select2\";\n },\n });\n }\n if (activatedBy == \"customtype\") {\n Survey.JsonObject.metaData.addClass(\"select2\", [], null, \"dropdown\");\n Survey.JsonObject.metaData.addProperty(\"select2\", {\n name: \"select2Config\",\n category: \"general\",\n default: null,\n });\n }\n },\n htmlTemplate:\n \"
\",\n afterRender: function (question, el) {\n var select2Config = question.select2Config;\n var settings =\n select2Config && typeof select2Config == \"string\"\n ? JSON.parse(select2Config)\n : select2Config;\n if (!settings) settings = {};\n var $el = $(el).is(\"select\") ? $(el) : $(el).find(\"select\");\n var $otherElement = $(el).find(\"textarea\");\n $otherElement.addClass(question.cssClasses.other);\n $otherElement.bind(\"input propertychange\", function () {\n if (isSettingValue) return;\n question.comment = $otherElement.val();\n });\n\n var updateComment = function () {\n $otherElement.val(question.comment);\n if (question.isOtherSelected) {\n $otherElement.show();\n } else {\n $otherElement.hide();\n }\n };\n var isSettingValue = false;\n var updateValueHandler = function () {\n if (isSettingValue) return;\n isSettingValue = true;\n if ($el.find('option[value=\"' + (question.value || \"\") + '\"]').length) {\n $el.val(question.value).trigger(\"change\");\n } else {\n if (\n question.value !== null &&\n question.value !== undefined &&\n !question.isOtherSelected\n ) {\n var newOption = new Option(\n question.value, //TODO if question value is object then need to improve\n question.value,\n true,\n true\n );\n $el.append(newOption).trigger(\"change\");\n }\n }\n updateComment();\n isSettingValue = false;\n };\n var updateChoices = function () {\n $el.select2().empty();\n if (!settings.placeholder && question.showOptionsCaption) {\n settings.placeholder = question.optionsCaption;\n settings.allowClear = true;\n }\n if (!settings.theme) {\n settings.theme = \"classic\";\n }\n settings.disabled = question.isReadOnly;\n if (settings.ajax) {\n $el.select2(settings);\n question.keepIncorrectValues = true;\n } else {\n var data = [];\n if (!!settings.placeholder || question.showOptionsCaption) {\n data.push({ id: \"\", text: \"\" });\n }\n settings.data = data.concat(\n question.visibleChoices.map(function (choice) {\n return {\n id: choice.value,\n text: choice.text,\n };\n })\n );\n question.clearIncorrectValues();\n $el.select2(settings);\n }\n // fixed width accrording to https://stackoverflow.com/questions/45276778/select2-not-responsive-width-larger-than-container\n if (!!el.querySelector(\".select2\")) {\n el.querySelector(\".select2\").style.width = \"100%\";\n }\n if (!!el.nextElementSibling) {\n el.nextElementSibling.style.marginBottom = \"1px\";\n }\n updateValueHandler();\n };\n\n $otherElement.prop(\"disabled\", question.isReadOnly);\n question.readOnlyChangedCallback = function () {\n $el.prop(\"disabled\", question.isReadOnly);\n $otherElement.prop(\"disabled\", question.isReadOnly);\n };\n\n question.registerFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n function () {\n updateChoices();\n }\n );\n updateChoices();\n $el.on(\"change\", function (e) {\n setTimeout(function () {\n question.renderedValue = e.target.value;\n updateComment();\n }, 1);\n });\n $el.on(\"select2:select\", function (e) {\n setTimeout(function () {\n question.renderedValue = e.target.value;\n updateComment();\n }, 1);\n });\n $el.on(\"select2:opening\", function (e) {\n if ($(this).data(\"unselecting\")) {\n $(this).removeData(\"unselecting\");\n e.preventDefault();\n }\n });\n $el.on(\"select2:unselecting\", function (e) {\n $(this).data(\"unselecting\", true);\n setTimeout(function () {\n question.renderedValue = null;\n updateComment();\n }, 1);\n });\n question.valueChangedCallback = updateValueHandler;\n updateValueHandler();\n },\n willUnmount: function (question, el) {\n question.readOnlyChangedCallback = null;\n question.valueChangedCallback = null;\n var $select2 = $(el).find(\"select\");\n if (!!$select2.data(\"select2\")) {\n $select2\n .off(\"select2:select\")\n .off(\"select2:unselecting\")\n .off(\"select2:opening\")\n .select2(\"destroy\");\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget);\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_inputmask__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_inputmask___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_inputmask__);\n\n\nfunction init(Survey) {\n var widget = {\n name: \"maskedit\",\n numericGroupSeparator: \",\",\n numericAutoGroup: true,\n numericDigits: 2,\n numericDigitsOptional: false,\n numericPlaceholder: \"0\",\n autoUnmask: true,\n clearIncomplete: true,\n widgetIsLoaded: function () {\n return typeof __WEBPACK_IMPORTED_MODULE_0_inputmask___default.a != \"undefined\";\n },\n isFit: function (question) {\n if (question.getType() == \"multipletext\") return true;\n return (\n question.getType() == \"text\" &&\n (question.inputMask != \"none\" || question.inputFormat)\n );\n },\n isDefaultRender: true,\n activatedByChanged: function (activatedBy) {\n if (Survey.JsonObject.metaData.findProperty(\"text\", \"inputMask\")) return;\n var properties = [\n {\n name: \"autoUnmask:boolean\",\n category: \"general\",\n default: true,\n },\n {\n name: \"clearIncomplete:boolean\",\n category: \"general\",\n default: true,\n },\n { name: \"inputFormat\", category: \"general\" },\n {\n name: \"inputMask\",\n category: \"general\",\n default: \"none\",\n choices: [\n \"none\",\n \"datetime\",\n \"currency\",\n \"decimal\",\n \"email\",\n \"phone\",\n \"ip\",\n ],\n },\n {\n name: \"numericDigits\",\n category: \"general\",\n visible: false,\n },\n {\n name: \"options\",\n category: \"general\",\n visible: false,\n },\n {\n name: \"prefix\",\n category: \"general\",\n visible: false,\n },\n {\n name: \"suffix\",\n category: \"general\",\n visible: false,\n },\n ];\n Survey.JsonObject.metaData.addProperties(\"text\", properties);\n Survey.JsonObject.metaData.addProperties(\n \"matrixdropdowncolumn\",\n properties\n );\n Survey.JsonObject.metaData.addProperties(\"multipletextitem\", properties);\n },\n applyInputMask: function (surveyElement, el) {\n var rootWidget = this;\n var mask =\n surveyElement.inputMask !== \"none\"\n ? surveyElement.inputMask\n : surveyElement.inputFormat;\n var options = {};\n if (typeof surveyElement.options === \"object\") {\n for (var option in surveyElement.options) {\n options[option] = surveyElement.options[option];\n }\n }\n options.autoUnmask = typeof surveyElement.autoUnmask !== \"undefined\"\n ? surveyElement.autoUnmask\n : rootWidget.autoUnmask;\n options.clearIncomplete = typeof surveyElement.clearIncomplete !== \"undefined\"\n ? surveyElement.clearIncomplete\n : rootWidget.clearIncomplete;\n if (surveyElement.inputMask !== \"none\") {\n options.inputFormat = surveyElement.inputFormat;\n }\n if (\n surveyElement.inputMask === \"currency\" ||\n surveyElement.inputMask === \"decimal\"\n ) {\n options.groupSeparator = rootWidget.numericGroupSeparator;\n options.autoGroup = rootWidget.numericAutoGroup;\n }\n if (surveyElement.inputMask === \"currency\") {\n options.digits = surveyElement.numericDigits || rootWidget.numericDigits;\n options.digitsOptional = rootWidget.numericDigitsOptional;\n options.prefix = surveyElement.prefix || \"\";\n options.suffix = surveyElement.suffix || \"\";\n options.placeholder = rootWidget.numericPlaceholder;\n }\n // if (surveyElement.inputMask == \"datetime\") {\n // mask = surveyElement.inputFormat;\n // }\n if (surveyElement.inputMask === \"phone\" && !!surveyElement.inputFormat) {\n mask = surveyElement.inputFormat;\n }\n\n __WEBPACK_IMPORTED_MODULE_0_inputmask___default()(mask, options).mask(el);\n\n el.onblur = function () {\n if (!el.inputmask) return;\n if (surveyElement.value === el.inputmask.getemptymask()) {\n surveyElement.value = \"\";\n }\n };\n\n var customWidgetData =\n surveyElement.getType() === \"multipletextitem\"\n ? surveyElement.editorValue.customWidgetData\n : surveyElement.customWidgetData;\n el.oninput = function () {\n customWidgetData.isNeedRender = true;\n };\n\n var pushValueHandler = function () {\n if (!el.inputmask) return;\n if (el.inputmask.isComplete()) {\n surveyElement.value = options.autoUnmask\n ? el.inputmask.unmaskedvalue()\n : el.value;\n } else {\n surveyElement.value = null;\n }\n };\n el.onfocusout = el.onchange = pushValueHandler;\n\n var updateHandler = function () {\n el.value =\n surveyElement.value === undefined || surveyElement.value === null\n ? \"\"\n : surveyElement.value;\n };\n surveyElement.valueChangedCallback = updateHandler;\n updateHandler();\n },\n afterRender: function (question, el) {\n if (question.getType() != \"multipletext\") {\n var input = el.querySelector(\"input\") || el;\n this.applyInputMask(question, input);\n } else {\n for (var i = 0; i < question.items.length; i++) {\n var item = question.items[i];\n if (item.inputMask != \"none\" || item.inputFormat) {\n var input = el.querySelector(\"#\" + item.editor.inputId);\n if (input) {\n this.applyInputMask(item, input);\n }\n }\n }\n }\n },\n willUnmount: function (question, el) {\n var input = el.querySelector(\"input\") || el;\n if (!!input && !!input.inputmask) {\n input.inputmask.remove();\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget);\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_3__;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\nfunction init(Survey, $) {\n $ = $ || window.$;\n var widget = {\n name: \"barrating\",\n title: \"Bar rating\",\n iconName: \"icon-barrating\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.barrating;\n },\n defaultJSON: { choices: [1, 2, 3, 4, 5] },\n isFit: function (question) {\n return question.getType() === \"barrating\";\n },\n isDefaultRender: true,\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"barrating\",\n [\n { name: \"hasOther\", visible: false },\n { name: \"otherText\", visible: false },\n { name: \"optionsCaption\", visible: false },\n { name: \"otherErrorText\", visible: false },\n { name: \"storeOthersAsComment\", visible: false },\n { name: \"renderAs\", visible: false },\n { name: \"select2Config\", visible: false },\n ],\n null,\n \"dropdown\"\n );\n Survey.JsonObject.metaData.addProperty(\"barrating\", {\n name: \"showValues:boolean\",\n default: false,\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"barrating\", {\n name: \"ratingTheme\",\n category: \"general\",\n default: \"css-stars\",\n choices: [\n \"fontawesome-stars\",\n \"css-stars\",\n \"bars-pill\",\n \"bars-1to10\",\n \"bars-movie\",\n \"bars-reversed\",\n \"bars-horizontal\",\n \"fontawesome-stars-o\",\n ],\n });\n },\n afterRender: function (question, el) {\n var $customSelect;\n var $questionInput;\n var contentContainer = $(el).is(\"select\")\n ? $(el).parent().parent()[0]\n : $(el).parent()[0];\n var renderCustomSelect = function () {\n $customSelect = $(\"\");\n question.visibleChoices.forEach(function (choice) {\n $customSelect.append(\n ''.format(choice.value, choice.text)\n );\n });\n $questionInput = $(contentContainer).find(\n '[id=\"{0}\"]'.format(question.inputId)\n );\n\n $questionInput.css(\"display\", \"none\");\n $questionInput.after($customSelect);\n $customSelect[0].selectedIndex = -1;\n };\n var removeCustomSelect = function () {\n $questionInput.css(\"display\", \"\");\n $customSelect.barrating(\"destroy\");\n $customSelect.remove();\n };\n var renderBarrating = function () {\n $customSelect.barrating(\"show\", {\n theme: question.ratingTheme,\n initialRating: question.value,\n showValues: question.showValues,\n showSelectedRating: false,\n readonly: question.isReadOnly,\n onSelect: function (value, text) {\n valueChangingByWidget = true;\n question.value = value;\n valueChangingByWidget = false;\n },\n });\n };\n renderCustomSelect();\n renderBarrating();\n if (!!$customSelect.parents()[0])\n $customSelect.parents()[0].style.marginBottom = \"3px\";\n var valueChangingByWidget = false;\n\n question.valueChangedCallback = function () {\n if (\n !valueChangingByWidget &&\n $(contentContainer).find(\"select.sv-widget-select\")[0].value !==\n question.value\n ) {\n $(contentContainer)\n .find(\"select.sv-widget-select\")\n .barrating(\"set\", question.value);\n }\n };\n question.__barratingOnPropertyChangedCallback = function (\n sender,\n options\n ) {\n if (options.name == \"ratingTheme\") {\n $customSelect.barrating(\"destroy\");\n renderBarrating();\n }\n };\n question.onPropertyChanged.add(\n question.__barratingOnPropertyChangedCallback\n );\n question.readOnlyChangedCallback = function () {\n removeCustomSelect();\n renderCustomSelect();\n renderBarrating();\n };\n question.visibleChoicesChangedCallback = function () {\n renderBarrating();\n };\n },\n willUnmount: function (question, el) {\n var $contentContainer = $(el).is(\"select\")\n ? $(el).parent().parent()\n : $(el).parent();\n var $el = $contentContainer.find(\"select.sv-widget-select\");\n $el.barrating(\"destroy\");\n $el.remove();\n question.valueChangedCallback = undefined;\n question.onPropertyChanged.remove(\n question.__barratingOnPropertyChangedCallback\n );\n question.__barratingOnPropertyChangedCallback = undefined;\n },\n pdfQuestionType: \"dropdown\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\nfunction init(Survey, $) {\n $ = $ || window.$;\n if (\n !!$ &&\n !$.fn.bootstrapDP &&\n !!$.fn.datepicker &&\n !!$.fn.datepicker.noConflict\n ) {\n $.fn.bootstrapDP = $.fn.datepicker.noConflict();\n if (!$.fn.datepicker) {\n $.fn.datepicker = $.fn.bootstrapDP;\n }\n }\n var widget = {\n name: \"datepicker\",\n title: \"Date picker\",\n iconName: \"icon-datepicker\",\n widgetIsLoaded: function () {\n return !!$ && !!$.fn.datepicker && !$.fn.datepicker.noConflict;\n },\n isFit: function (question) {\n return question.getType() === \"datepicker\";\n },\n htmlTemplate: \"\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"datepicker\",\n [\n { name: \"inputType\", visible: false },\n { name: \"inputFormat\", visible: false },\n { name: \"inputMask\", visible: false },\n ],\n null,\n \"text\"\n );\n Survey.JsonObject.metaData.addProperty(\"datepicker\", {\n name: \"dateFormat\",\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"datepicker\", {\n name: \"config\",\n category: \"general\",\n visible: false,\n default: null,\n });\n Survey.JsonObject.metaData.addProperty(\"datepicker\", {\n name: \"maxDate\",\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"datepicker\", {\n name: \"minDate\",\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n $el.addClass(question.css.text.root);\n var isSelecting = false;\n var config = $.extend(true, {}, question.config || {});\n if (!!question.placeHolder) {\n $el.attr(\"placeholder\", question.placeHolder);\n }\n if (config.dateFormat === undefined) {\n config.dateFormat = !!question.dateFormat\n ? question.dateFormat\n : undefined;\n }\n if (config.option === undefined) {\n config.option = {\n minDate: null,\n maxDate: null,\n };\n }\n if (!!question.minDate) {\n config.minDate = question.minDate;\n }\n if (!!question.maxDate) {\n config.maxDate = question.maxDate;\n }\n if (!!question.renderedMin) {\n config.minDate = question.renderedMin;\n }\n if (!!question.renderedMax) {\n config.maxDate = question.renderedMax;\n }\n config.disabled = question.isReadOnly;\n if (config.onSelect === undefined) {\n config.onSelect = function (dateText) {\n isSelecting = true;\n question.value = dateText;\n isSelecting = false;\n this.fixFocusIE = true;\n };\n }\n config.fixFocusIE = false;\n config.onClose = function (dateText, inst) {\n this.fixFocusIE = true;\n };\n config.beforeShow = function (input, inst) {\n var result = !!navigator.userAgent.match(/Trident\\/7\\./)\n ? !this.fixFocusIE\n : true;\n this.fixFocusIE = false;\n return result;\n };\n var pickerWidget = $el.datepicker(config);\n\n $el.keyup(function (e) {\n if (e.keyCode == 8 || e.keyCode == 46) {\n $.datepicker._clearDate(this);\n }\n });\n\n question.readOnlyChangedCallback = function () {\n $el.datepicker(\"option\", \"disabled\", question.isReadOnly);\n };\n function updateDate() {\n if (question.value) {\n pickerWidget.datepicker(\"setDate\", question.value);\n } else {\n pickerWidget.datepicker(\"setDate\", null);\n }\n }\n question.registerFunctionOnPropertyValueChanged(\n \"dateFormat\",\n function () {\n question.dateFormat &&\n pickerWidget.datepicker(\n \"option\",\n \"dateFormat\",\n question.dateFormat\n );\n updateDate();\n }\n );\n question.valueChangedCallback = function () {\n if (!isSelecting) {\n updateDate();\n $el.blur();\n }\n };\n question.valueChangedCallback();\n },\n willUnmount: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n $el.datepicker(\"destroy\");\n },\n pdfQuestionType: \"text\",\n };\n\n Survey.matrixDropdownColumnTypes.datepicker = { properties: [\"placeHolder\"] };\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_nouislider__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_nouislider___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_nouislider__);\n\n\nfunction init(Survey) {\n var widget = {\n name: \"nouislider\",\n title: \"noUiSlider\",\n iconName: \"icon-nouislider\",\n widgetIsLoaded: function () {\n return typeof __WEBPACK_IMPORTED_MODULE_0_nouislider___default.a != \"undefined\";\n },\n isFit: function (question) {\n return question.getType() === \"nouislider\";\n },\n htmlTemplate:\n \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\"nouislider\", [], null, \"empty\");\n Survey.JsonObject.metaData.addProperties(\"nouislider\", [\n {\n name: \"step:number\",\n category: \"slider\",\n categoryIndex: 1,\n default: 1,\n },\n {\n name: \"rangeMin:number\",\n category: \"slider\",\n default: 0,\n },\n {\n name: \"rangeMax:number\",\n category: \"slider\",\n default: 100,\n },\n {\n name: \"pipsMode\",\n category: \"slider\",\n default: \"positions\",\n },\n {\n name: \"pipsValues:itemvalues\",\n category: \"slider\",\n default: [0, 25, 50, 75, 100],\n },\n {\n name: \"pipsText:itemvalues\",\n category: \"slider\",\n default: [0, 25, 50, 75, 100],\n },\n {\n name: \"pipsDensity:number\",\n category: \"slider\",\n default: 5,\n },\n {\n name: \"orientation\",\n category: \"slider\",\n default: \"horizontal\",\n choices: [\"horizontal\", \"vertical\"]\n },\n {\n name: \"direction:string\",\n category: \"slider\",\n default: \"ltr\",\n },\n {\n name: \"tooltips:boolean\",\n category: \"slider\",\n default: true,\n },\n ]);\n },\n afterRender: function (question, el) {\n el.style.paddingBottom = \"19px\";\n el.style.paddingLeft = \"20px\";\n el.style.paddingRight = \"20px\";\n el.style.paddingTop = \"44px\";\n el = el.children[0];\n el.style.marginBottom = \"60px\";\n if (question.orientation === \"vertical\") {\n el.style.height = \"250px\";\n }\n var slider = __WEBPACK_IMPORTED_MODULE_0_nouislider___default.a.create(el, {\n start: question.value || (question.rangeMin + question.rangeMax) / 2,\n connect: [true, false],\n step: question.step,\n tooltips: question.tooltips,\n pips: {\n mode: question.pipsMode || \"positions\",\n values: question.pipsValues.map(function (pVal) {\n var pipValue = pVal;\n if (pVal.value !== undefined) {\n pipValue = pVal.value;\n }\n return parseInt(pipValue);\n }),\n density: question.pipsDensity || 5,\n format: {\n to: function (pVal) {\n var pipText = pVal;\n question.pipsText.map(function (el) {\n if (el.text !== undefined && pVal === el.value) {\n pipText = el.text;\n }\n });\n return pipText;\n },\n },\n },\n range: {\n min: question.rangeMin,\n max: question.rangeMax,\n },\n orientation: question.orientation,\n direction: question.direction,\n });\n slider.on(\"change\", function () {\n question.value = Number(slider.get());\n });\n var updateValueHandler = function () {\n slider.set(question.value);\n };\n if (question.isReadOnly) {\n el.setAttribute(\"disabled\", true);\n }\n updateValueHandler();\n question.noUiSlider = slider;\n question.valueChangedCallback = updateValueHandler;\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n el.setAttribute(\"disabled\", true);\n } else {\n el.removeAttribute(\"disabled\");\n }\n };\n },\n willUnmount: function (question, el) {\n if (!!question.noUiSlider) {\n question.noUiSlider.destroy();\n question.noUiSlider = null;\n }\n question.readOnlyChangedCallback = null;\n },\n pdfRender: function (_, options) {\n if (options.question.getType() === \"nouislider\") {\n var point = options.module.SurveyHelper.createPoint(\n options.module.SurveyHelper.mergeRects.apply(null, options.bricks)\n );\n point.xLeft += options.controller.unitWidth;\n point.yTop +=\n options.controller.unitHeight *\n options.module.FlatQuestion.CONTENT_GAP_VERT_SCALE;\n var rect = options.module.SurveyHelper.createTextFieldRect(\n point,\n options.controller\n );\n var textboxBrick = new options.module.TextFieldBrick(\n options.question,\n options.controller,\n rect,\n true,\n options.question.id,\n options.question.value || options.question.defaultValue || \"\",\n \"\",\n options.question.isReadOnly,\n false,\n \"text\"\n );\n options.bricks.push(textboxBrick);\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_7__;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\nfunction init(Survey, $) {\n $ = $ || window.$;\n var widget = {\n name: \"tagbox\",\n title: \"Tag box\",\n iconName: \"icon-tagbox\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.select2;\n },\n defaultJSON: {\n choices: [\"Item 1\", \"Item 2\", \"Item 3\"],\n },\n htmlTemplate:\n \"
\",\n isFit: function (question) {\n return question.getType() === \"tagbox\";\n },\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"tagbox\",\n [\n { name: \"hasOther:boolean\", visible: false },\n { name: \"hasSelectAll:boolean\", visible: false },\n { name: \"hasNone:boolean\", visible: false },\n { name: \"otherText\", visible: false },\n { name: \"selectAllText\", visible: false },\n { name: \"noneText\", visible: false },\n ],\n null,\n \"checkbox\"\n );\n Survey.JsonObject.metaData.addProperty(\"tagbox\", {\n name: \"select2Config\",\n category: \"general\",\n default: null,\n });\n Survey.JsonObject.metaData.addProperty(\"tagbox\", {\n name: \"placeholder\",\n category: \"general\",\n default: \"\",\n });\n Survey.JsonObject.metaData.addProperty(\"tagbox\", {\n name: \"allowAddNewTag:boolean\",\n category: \"general\",\n default: false,\n });\n Survey.matrixDropdownColumnTypes.tagbox = {\n properties: [\n \"choices\",\n \"choicesOrder\",\n \"choicesByUrl\",\n \"optionsCaption\",\n \"otherText\",\n \"choicesVisibleIf\",\n ],\n };\n },\n fixStyles: function (el) {\n el.parentElement.querySelector(\".select2-search__field\").style.border =\n \"none\";\n },\n afterRender: function (question, el) {\n var self = this;\n var select2Config = question.select2Config;\n var settings =\n select2Config && typeof select2Config == \"string\"\n ? JSON.parse(select2Config)\n : select2Config;\n var $el = $(el).is(\"select\") ? $(el) : $(el).find(\"select\");\n\n self.willUnmount(question, el);\n\n if (!settings) settings = {};\n settings.placeholder = question.placeholder;\n settings.tags = question.allowAddNewTag;\n settings.disabled = question.isReadOnly;\n settings.theme = \"classic\";\n if (!!question.maxSelectedChoices) {\n settings.maximumSelectionLength = question.maxSelectedChoices;\n }\n\n $el.select2(settings);\n\n var $otherElement = $(el).find(\"textarea\");\n if (\n !!question.survey &&\n !!question.survey.css &&\n !!question.survey.css.checkbox\n ) {\n $otherElement.addClass(question.survey.css.checkbox.other);\n }\n $otherElement.placeholder = question.otherPlaceHolder;\n $otherElement.bind(\"input propertychange\", function () {\n question.comment = $otherElement.val();\n });\n var updateComment = function () {\n $otherElement.val(question.comment);\n if (question.isOtherSelected) {\n $otherElement.show();\n } else {\n $otherElement.hide();\n }\n };\n\n self.fixStyles(el);\n var question;\n var updateValueHandler = function () {\n if (question.hasSelectAll && question.isAllSelected) {\n $el\n .val([question.selectAllItemValue.value].concat(question.value))\n .trigger(\"change\");\n } else {\n $el.val(question.value).trigger(\"change\");\n }\n self.fixStyles(el);\n updateComment();\n };\n var updateChoices = function () {\n $el.select2().empty();\n if (settings.ajax) {\n $el.select2(settings);\n } else {\n settings.data = question.visibleChoices.map(function (choice) {\n return {\n id: choice.value,\n text: choice.text,\n };\n });\n $el.select2(settings);\n }\n updateValueHandler();\n };\n var isAllItemSelected = function (value) {\n return (\n question.hasSelectAll && value === question.selectAllItemValue.value\n );\n };\n question._propertyValueChangedFnSelect2 = function () {\n updateChoices();\n };\n\n $otherElement.prop(\"disabled\", question.isReadOnly);\n question.readOnlyChangedCallback = function () {\n $el.prop(\"disabled\", question.isReadOnly);\n $otherElement.prop(\"disabled\", question.isReadOnly);\n };\n question.registerFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n question._propertyValueChangedFnSelect2\n );\n question.valueChangedCallback = updateValueHandler;\n $el.on(\"select2:select\", function (e) {\n if (isAllItemSelected(e.params.data.id)) {\n question.selectAll();\n } else {\n question.value = (question.value || []).concat(e.params.data.id);\n }\n updateComment();\n });\n $el.on(\"select2:unselect\", function (e) {\n var index = (question.value || []).indexOf(e.params.data.id);\n if (isAllItemSelected(e.params.data.id)) {\n question.clearValue();\n } else if (index !== -1) {\n var val = [].concat(question.value);\n val.splice(index, 1);\n question.value = val;\n }\n updateComment();\n });\n updateChoices();\n },\n willUnmount: function (question, el) {\n if (!question._propertyValueChangedFnSelect2) return;\n\n var $select2 = $(el).find(\"select\");\n if (!!$select2.data(\"select2\")) {\n $select2.off(\"select2:select\").select2(\"destroy\");\n }\n question.readOnlyChangedCallback = null;\n question.valueChangedCallback = null;\n question.unRegisterFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n question._propertyValueChangedFnSelect2\n );\n question._propertyValueChangedFnSelect2 = undefined;\n },\n pdfQuestionType: \"checkbox\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_sortablejs__ = __webpack_require__(10);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_sortablejs___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_sortablejs__);\n\n\nfunction init(Survey) {\n var widget = {\n name: \"sortablelist\",\n title: \"Sortable list\",\n iconName: \"icon-sortablejs\",\n widgetIsLoaded: function () {\n return typeof __WEBPACK_IMPORTED_MODULE_0_sortablejs___default.a != \"undefined\";\n },\n defaultJSON: { choices: [\"Item 1\", \"Item 2\", \"Item 3\"] },\n rootStyle: \"width:100%:\",\n areaStyle:\n \"border: 1px solid #1ab394; width:100%; min-height:50px; margin-top:10px;\",\n itemStyle: \"background-color:#1ab394;color:#fff;margin:5px;padding:10px;\",\n isFit: function (question) {\n return question.getType() === \"sortablelist\";\n },\n htmlTemplate: \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"sortablelist\",\n [\n { name: \"hasOther\", visible: false },\n { name: \"storeOthersAsComment\", visible: false },\n { name: \"hasNone\", visible: false },\n { name: \"renderAs\", visible: false },\n { name: \"checkboxClass\", visible: false },\n { name: \"hasSelectAll\", visible: false },\n { name: \"noneText\", visible: false },\n { name: \"selectAllText\", visible: false },\n ],\n null,\n \"checkbox\"\n );\n Survey.JsonObject.metaData.addProperty(\"sortablelist\", {\n name: \"emptyText\",\n default: \"Move items here.\",\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"sortablelist\", {\n name: \"useDefaultTheme:switch\",\n default: true,\n category: \"general\",\n });\n Survey.JsonObject.metaData.addProperty(\"sortablelist\", {\n name: \"maxAnswersCount:number\",\n default: -1,\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n var self = this;\n\n if (!question.useDefaultTheme) {\n self.rootStyle = \"\";\n self.itemStyle = \"\";\n self.areaStyle = \"\";\n }\n el.style.cssText = self.rootStyle;\n el.className = \"sjs-sortablejs-root\";\n var source, result;\n var resultEl = document.createElement(\"div\");\n var emptyEl = document.createElement(\"span\");\n var sourceEl = document.createElement(\"div\");\n\n resultEl.style.cssText = self.areaStyle;\n resultEl.style.boxSizing = \"border-box\";\n resultEl.className = \"sjs-sortablejs-result\";\n\n emptyEl.innerHTML = question.emptyText;\n resultEl.appendChild(emptyEl);\n\n sourceEl.style.cssText = self.areaStyle;\n sourceEl.style.boxSizing = \"border-box\";\n sourceEl.className = \"sjs-sortablejs-source\";\n el.appendChild(resultEl);\n el.appendChild(sourceEl);\n var hasValueInResults = function (val) {\n var res = question.value;\n if (!Array.isArray(res)) return false;\n for (var i = 0; i < res.length; i++) {\n if (res[i] == val) return true;\n }\n return false;\n };\n var addChoiceToWidget = function (choice, inResults) {\n var srcEl = inResults ? resultEl : sourceEl;\n var newEl = document.createElement(\"div\");\n newEl.className = \"sjs-sortablejs-item\";\n newEl.style.cssText = self.itemStyle;\n newEl.innerText = choice.text;\n newEl.dataset[\"value\"] = choice.value;\n srcEl.appendChild(newEl);\n choice.onPropertyChanged.add(function (sender, options) {\n newEl.innerText = sender.text;\n });\n };\n var getChoicesNotInResults = function () {\n var res = [];\n question.visibleChoices.forEach(function (choice) {\n if (!hasValueInResults(choice.value)) {\n res.push(choice);\n }\n });\n return res;\n };\n var getChoicesInResults = function () {\n var res = [];\n var val = question.value;\n if (!Array.isArray(val)) return res;\n for (var i = 0; i < val.length; i++) {\n var item = Survey.ItemValue.getItemByValue(\n question.visibleChoices,\n val[i]\n );\n if (!!item) {\n res.push(item);\n }\n }\n return res;\n };\n var isUpdatingQuestionValue = false;\n var updateValueHandler = function () {\n if (isUpdatingQuestionValue) return;\n resultEl.innerHTML = \"\";\n resultEl.appendChild(emptyEl);\n sourceEl.innerHTML = \"\";\n var notInResults = getChoicesNotInResults();\n var inResults = getChoicesInResults();\n emptyEl.style.display = inResults.length > 0 ? \"none\" : \"\";\n inResults.forEach(function (choice) {\n addChoiceToWidget(choice, true);\n });\n notInResults.forEach(function (choice) {\n addChoiceToWidget(choice, false);\n });\n };\n result = question.resultEl = __WEBPACK_IMPORTED_MODULE_0_sortablejs___default.a.create(resultEl, {\n animation: 150,\n disabled: question.isReadOnly,\n group: {\n name: question.name,\n put: function (to, from) {\n return (\n to.options.group && from.options.group && to.options.group.name === from.options.group.name &&\n (question.maxAnswersCount < 0 ||\n to.el.children.length <= question.maxAnswersCount)\n );\n },\n },\n onSort: function (evt) {\n var result = [];\n if (resultEl.children.length === 1) {\n emptyEl.style.display = \"\";\n } else {\n emptyEl.style.display = \"none\";\n for (var i = 0; i < resultEl.children.length; i++) {\n if (typeof resultEl.children[i].dataset.value === \"undefined\")\n continue;\n result.push(resultEl.children[i].dataset.value);\n }\n }\n isUpdatingQuestionValue = true;\n question.value = result;\n isUpdatingQuestionValue = false;\n },\n });\n source = question.sourceEl = __WEBPACK_IMPORTED_MODULE_0_sortablejs___default.a.create(sourceEl, {\n animation: 150,\n disabled: question.isReadOnly,\n group: question.name,\n });\n question.valueChangedCallback = updateValueHandler;\n question.onPropertyChanged.add(function (sender, options) {\n if (options.name == \"emptyText\") {\n emptyEl.innerHTML = question.emptyText;\n }\n });\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n result.options.disabled = true;\n source.options.disabled = true;\n } else {\n result.options.disabled = false;\n source.options.disabled = false;\n }\n };\n question.registerFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n updateValueHandler\n );\n updateValueHandler();\n },\n willUnmount: function (question, el) {\n question.resultEl.destroy();\n question.sourceEl.destroy();\n question.readOnlyChangedCallback = null;\n },\n pdfQuestionType: \"checkbox\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_10__;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\nfunction init(Survey) {\n var widget = {\n name: \"editor\",\n title: \"Editor\",\n iconName: \"icon-editor\",\n widgetIsLoaded: function () {\n return typeof CKEDITOR != \"undefined\";\n },\n isFit: function (question) {\n return question.getType() === \"editor\";\n },\n htmlTemplate:\n \"\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\"editor\", [], null, \"empty\");\n Survey.JsonObject.metaData.addProperty(\"editor\", {\n name: \"height\",\n default: 300,\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n var name = question.inputId;\n CKEDITOR.editorConfig = function (config) {\n config.language = \"es\";\n config.height = question.height;\n config.toolbarCanCollapse = true;\n };\n el.name = name;\n\n if (CKEDITOR.instances[name]) {\n CKEDITOR.instances[name].removeAllListeners();\n CKEDITOR.remove(CKEDITOR.instances[name]);\n }\n\n var editor = CKEDITOR.replace(el);\n CKEDITOR.instances[name].config.readOnly = question.isReadOnly;\n\n var isValueChanging = false;\n var updateValueHandler = function () {\n if (isValueChanging || typeof question.value === \"undefined\") return;\n editor.setData(question.value);\n };\n editor.on(\"change\", function () {\n isValueChanging = true;\n question.value = editor.getData();\n isValueChanging = false;\n });\n\n question.valueChangedCallback = updateValueHandler;\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n editor.setReadOnly(true);\n } else {\n editor.setReadOnly(false);\n }\n };\n updateValueHandler();\n },\n willUnmount: function (question, el) {\n question.readOnlyChangedCallback = null;\n CKEDITOR.instances[question.inputId].destroy(false);\n },\n pdfRender: function (survey, options) {\n if (options.question.getType() === \"editor\") {\n const loc = new Survey.LocalizableString(survey, true);\n loc.text = options.question.value || options.question.defaultValue;\n options.question[\"locHtml\"] = loc;\n if (\n options.question.renderAs === \"standard\" ||\n options.question.renderAs === \"image\"\n ) {\n options.question[\"renderAs\"] = options.question.renderAs;\n } else options.question[\"renderAs\"] = \"auto\";\n const flatHtml = options.repository.create(\n survey,\n options.question,\n options.controller,\n \"html\"\n );\n return new Promise(function (resolve) {\n flatHtml.generateFlats(options.point).then(function (htmlBricks) {\n options.bricks = htmlBricks;\n resolve();\n });\n });\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\nfunction init(Survey, $) {\n $ = $ || window.$;\n var widget = {\n name: \"autocomplete\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.easyAutocomplete;\n },\n isFit: function (question) {\n return question.getType() === \"text\";\n },\n isDefaultRender: true,\n activatedByChanged: function (activatedBy) {\n if (\n Survey.JsonObject.metaData.findProperty(\"text\", \"choices\") !== null ||\n Survey.JsonObject.metaData.findProperty(\"text\", \"choicesByUrl\") !== null\n ) {\n return;\n }\n Survey.JsonObject.metaData.addProperty(\"text\", {\n name: \"choices:itemvalues\",\n category: \"choices\",\n categoryIndex: 1,\n });\n Survey.JsonObject.metaData.addProperty(\"text\", {\n name: \"choicesByUrl:restfull\",\n className: \"ChoicesRestfull\",\n category: \"choicesByUrl\",\n categoryIndex: 2,\n });\n Survey.JsonObject.metaData.addProperty(\"text\", {\n name: \"config\",\n category: \"general\",\n default: null,\n });\n Array.prototype.push.apply(\n Survey.matrixDropdownColumnTypes.text.properties,\n [\"choices\", \"choicesOrder\", \"choicesByUrl\", \"otherText\"]\n );\n },\n afterRender: function (question, el) {\n var $el = $(el).is(\"input\") ? $(el) : $(el).find(\"input\");\n\n var getCssSelectorFromClassesString = function (classesString) {\n if (!classesString) return \"\";\n var cssSelector = classesString.replace(/(^\\s*)|(\\s+)/g, \".\"); // replace whitespaces with '.'\n return cssSelector;\n };\n\n var questionRootClasses = getCssSelectorFromClassesString(\n question.cssRoot\n );\n\n var questionRoot = $el.parents(questionRootClasses)[0];\n if (!!questionRootClasses && !!questionRoot) {\n questionRoot.style.overflow = \"visible\";\n }\n\n var config = question.config;\n var options =\n config && typeof config == \"string\" ? JSON.parse(config) : config;\n if (!options) options = {};\n\n options.data = (question.choices || []).map(function (item) {\n return item.text;\n });\n if (options.adjustWidth === undefined) {\n options.adjustWidth = false;\n }\n if (!options.list) {\n options.list = {\n sort: {\n enabled: true,\n },\n match: {\n enabled: true,\n },\n onSelectItemEvent: function() {\n var selectedData = $el.getSelectedItemData();\n question.value = selectedData;\n }\n };\n }\n if (!options.placeholder) {\n options.placeholder = question.placeholder;\n }\n\n if (!!question.choicesByUrl) {\n options.url = function (phrase) {\n return question.choicesByUrl.url;\n };\n options.getValue = question.choicesByUrl.valueName;\n // options.ajaxSettings = {\n // dataType: \"jsonp\"\n // };\n }\n $el.easyAutocomplete(options);\n\n $el[0].oninput = function () {\n question.customWidgetData.isNeedRender = true;\n };\n var updateHandler = function () {\n $el[0].value =\n typeof question.value === \"undefined\" ? \"\" : question.value;\n };\n question.valueChangedCallback = updateHandler;\n updateHandler();\n },\n willUnmount: function (question, el) {\n // var $el = $(el).find(\"input\");\n // $el.autocomplete(\"destroy\");\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"type\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\nfunction init(Survey) {\n var widget = {\n settings: {\n supportedTypes: [\"radiogroup\", \"checkbox\", \"boolean\"],\n radiogroup: {\n rootClass: \"pretty p-default p-round\",\n inputType: \"radio\",\n states: [{ stateClass: \"state p-success\", addOn: \"\" }],\n },\n checkbox: {\n rootClass: \"pretty p-default\",\n inputType: \"checkbox\",\n states: [{ stateClass: \"state p-success\", addOn: \"\" }],\n },\n boolean: {\n rootClass: \"pretty p-icon p-default p-has-indeterminate\",\n inputType: \"checkbox\",\n states: [\n { stateClass: \"state p-success\", addOn: \"\" },\n {\n stateClass: \"state p-success p-is-indeterminate\",\n iconClass: \"icon mdi mdi-minus\",\n addOn: \"\",\n },\n ],\n },\n },\n name: \"pretty-checkbox\",\n activatedBy: \"property\",\n widgetIsLoaded: function () {\n return true;\n },\n htmlTemplate: \"
\",\n isFit: function (question) {\n var isFitByType =\n widget.settings.supportedTypes.indexOf(question.getType()) !== -1;\n\n if (widget.activatedBy === \"property\") {\n return question[\"renderAs\"] === \"prettycheckbox\" && isFitByType;\n } else if (widget.activatedBy === \"type\") {\n return isFitByType;\n }\n\n return false;\n },\n activatedByChanged: function (value) {\n if (this.widgetIsLoaded()) {\n widget.activatedBy = value;\n widget.settings.supportedTypes.forEach(function (supportedType) {\n Survey.JsonObject.metaData.removeProperty(supportedType, \"renderAs\");\n\n if (value === \"property\") {\n Survey.JsonObject.metaData.addProperty(supportedType, {\n name: \"renderAs\",\n category: \"general\",\n default: \"default\",\n choices: [\"default\", \"prettycheckbox\"],\n });\n }\n });\n }\n },\n isDefaultRender: false,\n afterRender: function (question, element) {\n var itemInputs = {};\n var questionType = question.getType();\n var options = this.settings[questionType];\n var checkboxType = questionType === \"checkbox\";\n var radiogroupType = questionType === \"radiogroup\";\n var booleanType = questionType === \"boolean\";\n\n var inChangeHandler = false;\n var changeHandler = function (event) {\n inChangeHandler = true;\n try {\n var target = arguments[0].target;\n var targetValue = target.value;\n var targetChecked = target.checked;\n\n if (checkboxType) {\n var questionValue = question.createValueCopy() || [];\n var valueIndex = questionValue.indexOf(targetValue);\n if (targetChecked) {\n if (valueIndex === -1) {\n questionValue.push(targetValue);\n }\n } else {\n if (valueIndex !== -1) {\n questionValue.splice(valueIndex, 1);\n }\n }\n\n question.value = questionValue;\n } else if (radiogroupType) {\n question.value = targetValue;\n } else {\n question.value = targetChecked;\n }\n } finally {\n inChangeHandler = false;\n }\n };\n\n var itemWidth =\n question.colCount > 0 ? 100 / question.colCount + \"%\" : \"\";\n\n var choices = booleanType\n ? [{ locText: question.locTitle, value: !!question.value }]\n : question.visibleChoices;\n choices.forEach(function (choiceItem, index) {\n var input = document.createElement(\"input\");\n input.type = options.inputType;\n input.name = question.name + (checkboxType ? \"\" + index : \"\");\n input.onchange = changeHandler;\n input.value = choiceItem.value;\n\n if (booleanType && question.value === null) {\n input.indeterminate = question.defaultValue === \"indeterminate\";\n }\n\n var controlRoot = document.createElement(\"div\");\n controlRoot.className = options.rootClass;\n controlRoot.appendChild(input);\n\n options.states.forEach(function (state) {\n var stateRoot = document.createElement(\"div\");\n stateRoot.className = state.stateClass;\n if (!!state.iconClass) {\n var icon = document.createElement(\"i\");\n icon.className = state.iconClass;\n stateRoot.appendChild(icon);\n }\n\n var label = document.createElement(\"label\");\n if (choiceItem.locText.hasHtml) {\n label.innerHTML = choiceItem.locText.html;\n } else {\n label.textContent = choiceItem.locText.renderedText;\n }\n stateRoot.appendChild(label);\n\n controlRoot.appendChild(stateRoot);\n if (!!state.addOn) {\n stateRoot.insertAdjacentHTML(\"afterbegin\", state.addOn);\n }\n });\n\n var itemRoot = document.createElement(\"div\");\n itemRoot.className = \"sv_cw_pretty_checkbox_\" + questionType;\n itemRoot.style.display = \"inline-block\";\n itemRoot.style.width = itemWidth;\n itemRoot.appendChild(controlRoot);\n\n element.appendChild(itemRoot);\n\n itemInputs[choiceItem.value] = input;\n });\n\n var updateValueHandler = function (newValue) {\n if (!inChangeHandler) {\n var checkedItems = newValue || [];\n if (radiogroupType || booleanType) {\n checkedItems = [newValue && newValue.toString()];\n }\n\n Object.values(itemInputs).forEach(function (inputItem) {\n if (checkedItems.indexOf(inputItem.value) !== -1) {\n inputItem.setAttribute(\"checked\", undefined);\n } else {\n inputItem.removeAttribute(\"checked\");\n }\n });\n }\n };\n var readOnlyHandler = function () {\n Object.values(itemInputs).forEach(function (inputItem) {\n if (question.isReadOnly) {\n inputItem.setAttribute(\"disabled\", true);\n } else {\n inputItem.removeAttribute(\"disabled\");\n }\n });\n };\n\n question.valueChangedCallback = updateValueHandler;\n question.readOnlyChangedCallback = readOnlyHandler;\n updateValueHandler(question.value);\n readOnlyHandler();\n },\n willUnmount: function (question, el) {\n question.valueChangedCallback = undefined;\n question.readOnlyChangedCallback = undefined;\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"property\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\nvar Slider = __webpack_require__(15);\n\nfunction init(Survey) {\n var widget = {\n name: \"bootstrapslider\",\n title: \"Bootstrap Slider\",\n iconName: \"icon-bootstrap-slider\",\n widgetIsLoaded: function () {\n return typeof Slider !== \"undefined\";\n },\n isFit: function (question) {\n return question.getType() === \"bootstrapslider\";\n },\n htmlTemplate: \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\"bootstrapslider\", [], null, \"empty\");\n Survey.JsonObject.metaData.addProperties(\"bootstrapslider\", [\n {\n name: \"step:number\",\n default: 1,\n category: \"general\",\n },\n {\n name: \"rangeMin:number\",\n default: 0,\n category: \"general\",\n },\n {\n name: \"rangeMax:number\",\n default: 100,\n category: \"general\",\n },\n {\n name: \"orientation\",\n default: \"horizontal\",\n choices: [\"horizontal\", \"vertical\"],\n category: \"general\"\n },\n ]);\n Survey.JsonObject.metaData.addProperty(\"bootstrapslider\", {\n name: \"config\",\n default: null,\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n el.style.paddingTop = \"20px\";\n el.style.paddingBottom = \"17px\";\n el.style.paddingLeft = \"10px\";\n var inputEl = document.createElement(\"input\");\n inputEl.id = question.id;\n inputEl.type = \"text\";\n inputEl.setAttribute(\"data-slider-id\", question.name + \"_\" + question.id);\n inputEl.setAttribute(\"data-slider-min\", question.rangeMin);\n inputEl.setAttribute(\"data-slider-max\", question.rangeMax);\n inputEl.setAttribute(\"data-slider-step\", question.step);\n if(question.orientation == \"vertical\") {\n inputEl.setAttribute(\"data-slider-orientation\", \"vertical\");\n }\n inputEl.setAttribute(\"data-slider-step\", question.step);\n inputEl.setAttribute(\n \"data-slider-value\",\n question.value || question.rangeMin\n );\n el.appendChild(inputEl);\n\n var config = question.config || {};\n\n if (config.id === undefined) {\n config.id = question.name + \"_\" + question.id;\n }\n\n if (config.min === undefined) {\n config.min = question.rangeMin;\n }\n\n if (config.max === undefined) {\n config.max = question.rangeMax;\n }\n\n if (config.step === undefined) {\n config.step = question.step;\n }\n\n if (config.enabled === undefined) {\n config.enabled = !question.isReadOnly;\n }\n\n if (config.value === undefined) {\n config.value = question.value || question.rangeMin;\n }\n\n var slider = new Slider(inputEl, config);\n\n slider.on(\"change\", function (valueObj) {\n question.value = slider.getValue();\n });\n var updateValueHandler = function () {\n slider.setValue(question.value || question.rangeMin);\n };\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n slider.disable();\n } else {\n slider.enable();\n }\n };\n question.bootstrapSlider = slider;\n question.valueChangedCallback = updateValueHandler;\n },\n willUnmount: function (question, el) {\n question.bootstrapSlider && question.bootstrapSlider.destroy();\n question.bootstrapSlider = null;\n question.readOnlyChangedCallback = null;\n },\n pdfRender: function (_, options) {\n if (options.question.getType() === \"bootstrapslider\") {\n var point = options.module.SurveyHelper.createPoint(\n options.module.SurveyHelper.mergeRects.apply(null, options.bricks)\n );\n point.xLeft += options.controller.unitWidth;\n point.yTop +=\n options.controller.unitHeight *\n options.module.FlatQuestion.CONTENT_GAP_VERT_SCALE;\n var rect = options.module.SurveyHelper.createTextFieldRect(\n point,\n options.controller\n );\n var textboxBrick = new options.module.TextFieldBrick(\n options.question,\n options.controller,\n rect,\n true,\n options.question.id,\n (\n options.question.value ||\n options.question.defaultValue ||\n \"\"\n ).toString(),\n \"\",\n options.question.isReadOnly,\n false,\n \"text\"\n );\n options.bricks.push(textboxBrick);\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_15__;\n\n/***/ }),\n/* 16 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_recordrtc__ = __webpack_require__(17);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_recordrtc___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_recordrtc__);\n\n\nfunction init(Survey) {\n var widget = {\n name: \"microphone\",\n title: \"Microphone\",\n iconName: \"icon-microphone\",\n widgetIsLoaded: function() {\n return typeof __WEBPACK_IMPORTED_MODULE_0_recordrtc___default.a != \"undefined\";\n },\n isFit: function(question) {\n return question.getType() === \"microphone\";\n },\n htmlTemplate:\n \"
\" +\n \"\" +\n \" \" +\n \" \" +\n \"
\",\n activatedByChanged: function(activatedBy) {\n Survey.JsonObject.metaData.addClass(\"microphone\", [], null, \"empty\");\n },\n\n afterRender: function(question, el) {\n var rootWidget = this;\n var buttonStartEl = el.getElementsByTagName(\"button\")[0];\n var buttonStopEl = el.getElementsByTagName(\"button\")[1];\n var audioEl = el.getElementsByTagName(\"audio\")[0];\n\n ////////// RecordRTC logic\n\n var successCallback = function(stream) {\n var options = {\n type: \"audio\",\n mimeType: \"audio/webm\",\n audioBitsPerSecond: 44100,\n sampleRate: 44100,\n bufferSize: 16384,\n numberOfAudioChannels: 1\n };\n console.log(\"successCallback\");\n question.survey.mystream = stream;\n question.survey.recordRTC = __WEBPACK_IMPORTED_MODULE_0_recordrtc___default()(\n question.survey.mystream,\n options\n );\n if (typeof question.survey.recordRTC != \"undefined\") {\n console.log(\"startRecording\");\n question.survey.recordRTC.startRecording();\n }\n };\n\n var errorCallback = function() {\n alert(\"No microphone\");\n question.survey.recordRTC = undefined;\n question.survey.mystream = undefined;\n };\n\n var processAudio = function(audioVideoWebMURL) {\n console.log(\"processAudio\");\n var recordedBlob = question.survey.recordRTC.getBlob();\n\n var fileReader = new FileReader();\n fileReader.onload = function(event) {\n var dataUri = event.target.result;\n console.log(\"dataUri: \" + dataUri);\n question.value = dataUri;\n audioEl.src = dataUri;\n\n console.log(\"cleaning\");\n question.survey.recordRTC = undefined;\n question.survey.mystream = undefined;\n };\n fileReader.readAsDataURL(recordedBlob);\n };\n\n var startRecording = function() {\n // erase previous data\n question.value = undefined;\n\n // if recorder open on another question\t- try to stop recording\n if (typeof question.survey.recordRTC != \"undefined\") {\n question.survey.recordRTC.stopRecording(doNothingHandler);\n if (typeof question.survey.mystream != \"undefined\") {\n question.survey.mystream.getAudioTracks().forEach(function(track) {\n track.stop();\n });\n }\n }\n\n var mediaConstraints = {\n video: false,\n audio: true\n };\n\n navigator.mediaDevices\n .getUserMedia(mediaConstraints)\n .then(successCallback.bind(this), errorCallback.bind(this));\n };\n\n var stopRecording = function() {\n console.log(\"stopRecording\");\n if (typeof question.survey.recordRTC != \"undefined\") {\n question.survey.recordRTC.stopRecording(processAudio.bind(this));\n if (typeof question.survey.mystream != \"undefined\") {\n question.survey.mystream.getAudioTracks().forEach(function(track) {\n track.stop();\n });\n }\n }\n };\n\n ////////////// end RTC logic //////////////////\n\n if (!question.isReadOnly) {\n buttonStartEl.onclick = startRecording;\n } else {\n buttonStartEl.parentNode.removeChild(buttonStartEl);\n }\n\n if (!question.isReadOnly) {\n buttonStopEl.onclick = stopRecording;\n } else {\n buttonStopEl.parentNode.removeChild(buttonStopEl);\n }\n\n audioEl.src = question.value;\n\n var updateValueHandler = function() {};\n\n var doNothingHandler = function() {};\n\n question.valueChangedCallback = updateValueHandler;\n updateValueHandler();\n },\n willUnmount: function(question, el) {\n console.log(\"unmount microphone no record \");\n if (typeof question.survey.recordRTC != \"undefined\") {\n question.survey.recordRTC.stopRecording(doNothingHandler);\n if (typeof question.survey.mystream != \"undefined\") {\n question.survey.mystream.getAudioTracks().forEach(function(track) {\n track.stop();\n });\n }\n question.value = undefined;\n question.survey.recordRTC = undefined;\n question.survey.mystream = undefined;\n }\n }\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global, process) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;\r\n\r\n// Last time updated: 2020-02-26 1:11:47 PM UTC\r\n\r\n// ________________\r\n// RecordRTC v5.5.9\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/RecordRTC\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\n// ____________\r\n// RecordRTC.js\r\n\r\n/**\r\n * {@link https://github.com/muaz-khan/RecordRTC|RecordRTC} is a WebRTC JavaScript library for audio/video as well as screen activity recording. It supports Chrome, Firefox, Opera, Android, and Microsoft Edge. Platforms: Linux, Mac and Windows. \r\n * @summary Record audio, video or screen inside the browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTC\r\n * @class\r\n * @example\r\n * var recorder = RecordRTC(mediaStream or [arrayOfMediaStream], {\r\n * type: 'video', // audio or video or gif or canvas\r\n * recorderType: MediaStreamRecorder || CanvasRecorder || StereoAudioRecorder || Etc\r\n * });\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, desiredSampRate: 16000, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction RecordRTC(mediaStream, config) {\r\n if (!mediaStream) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n config = config || {\r\n type: 'video'\r\n };\r\n\r\n config = new RecordRTCConfiguration(mediaStream, config);\r\n\r\n // a reference to user's recordRTC object\r\n var self = this;\r\n\r\n function startRecording(config2) {\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC version: ', self.version);\r\n }\r\n\r\n if (!!config2) {\r\n // allow users to set options using startRecording method\r\n // config2 is similar to main \"config\" object (second parameter over RecordRTC constructor)\r\n config = new RecordRTCConfiguration(mediaStream, config2);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('started recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n return self;\r\n }\r\n\r\n initRecorder(function() {\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n });\r\n\r\n return self;\r\n }\r\n\r\n function initRecorder(initCallback) {\r\n if (initCallback) {\r\n config.initCallback = function() {\r\n initCallback();\r\n initCallback = config.initCallback = null; // recorder.initRecorder should be call-backed once.\r\n };\r\n }\r\n\r\n var Recorder = new GetRecorderType(mediaStream, config);\r\n\r\n mediaRecorder = new Recorder(mediaStream, config);\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (!config.disableLogs) {\r\n console.log('Initialized recorderType:', mediaRecorder.constructor.name, 'for output-type:', config.type);\r\n }\r\n }\r\n\r\n function stopRecording(callback) {\r\n callback = callback || function() {};\r\n\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state === 'paused') {\r\n self.resumeRecording();\r\n\r\n setTimeout(function() {\r\n stopRecording(callback);\r\n }, 1);\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording' && !config.disableLogs) {\r\n console.warn('Recording state should be: \"recording\", however current state is: ', self.state);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Stopped recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (config.type !== 'gif') {\r\n mediaRecorder.stop(_callback);\r\n } else {\r\n mediaRecorder.stop();\r\n _callback();\r\n }\r\n\r\n setState('stopped');\r\n\r\n function _callback(__blob) {\r\n if (!mediaRecorder) {\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, '');\r\n } else {\r\n callback('');\r\n }\r\n return;\r\n }\r\n\r\n Object.keys(mediaRecorder).forEach(function(key) {\r\n if (typeof mediaRecorder[key] === 'function') {\r\n return;\r\n }\r\n\r\n self[key] = mediaRecorder[key];\r\n });\r\n\r\n var blob = mediaRecorder.blob;\r\n\r\n if (!blob) {\r\n if (__blob) {\r\n mediaRecorder.blob = blob = __blob;\r\n } else {\r\n throw 'Recording failed.';\r\n }\r\n }\r\n\r\n if (blob && !config.disableLogs) {\r\n console.log(blob.type, '->', bytesToSize(blob.size));\r\n }\r\n\r\n if (callback) {\r\n var url;\r\n\r\n try {\r\n url = URL.createObjectURL(blob);\r\n } catch (e) {}\r\n\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, url);\r\n } else {\r\n callback(url);\r\n }\r\n }\r\n\r\n if (!config.autoWriteToDisk) {\r\n return;\r\n }\r\n\r\n getDataURL(function(dataURL) {\r\n var parameter = {};\r\n parameter[config.type + 'Blob'] = dataURL;\r\n DiskStorage.Store(parameter);\r\n });\r\n }\r\n }\r\n\r\n function pauseRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to pause the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('paused');\r\n\r\n mediaRecorder.pause();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Paused recording.');\r\n }\r\n }\r\n\r\n function resumeRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'paused') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to resume the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('recording');\r\n\r\n // not all libs have this method yet\r\n mediaRecorder.resume();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Resumed recording.');\r\n }\r\n }\r\n\r\n function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n }\r\n\r\n function getDataURL(callback, _mediaRecorder) {\r\n if (!callback) {\r\n throw 'Pass a callback function over getDataURL.';\r\n }\r\n\r\n var blob = _mediaRecorder ? _mediaRecorder.blob : (mediaRecorder || {}).blob;\r\n\r\n if (!blob) {\r\n if (!config.disableLogs) {\r\n console.warn('Blob encoder did not finish its job yet.');\r\n }\r\n\r\n setTimeout(function() {\r\n getDataURL(callback, _mediaRecorder);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (typeof Worker !== 'undefined' && !navigator.mozGetUserMedia) {\r\n var webWorker = processInWebWorker(readFile);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback(event.target.result);\r\n };\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n try {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n } catch (e) {}\r\n }\r\n }\r\n\r\n function handleRecordingDuration(counter) {\r\n counter = counter || 0;\r\n\r\n if (self.state === 'paused') {\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (self.state === 'stopped') {\r\n return;\r\n }\r\n\r\n if (counter >= self.recordingDuration) {\r\n stopRecording(self.onRecordingStopped);\r\n return;\r\n }\r\n\r\n counter += 1000; // 1-second\r\n\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n }\r\n\r\n function setState(state) {\r\n if (!self) {\r\n return;\r\n }\r\n\r\n self.state = state;\r\n\r\n if (typeof self.onStateChanged.call === 'function') {\r\n self.onStateChanged.call(self, state);\r\n } else {\r\n self.onStateChanged(state);\r\n }\r\n }\r\n\r\n var WARNING = 'It seems that recorder is destroyed or \"startRecording\" is not invoked for ' + config.type + ' recorder.';\r\n\r\n function warningLog() {\r\n if (config.disableLogs === true) {\r\n return;\r\n }\r\n\r\n console.warn(WARNING);\r\n }\r\n\r\n var mediaRecorder;\r\n\r\n var returnObject = {\r\n /**\r\n * This method starts the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var recorder = RecordRTC(mediaStream, {\r\n * type: 'video'\r\n * });\r\n * recorder.startRecording();\r\n */\r\n startRecording: startRecording,\r\n\r\n /**\r\n * This method stops the recording. It is strongly recommended to get \"blob\" or \"URI\" inside the callback to make sure all recorders finished their job.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * // use either \"this\" or \"recorder\" object; both are identical\r\n * video.src = this.toURL();\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n stopRecording: stopRecording,\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Firefox is unable to pause the recording. Fix it.\r\n * @example\r\n * recorder.pauseRecording(); // pause the recording\r\n * recorder.resumeRecording(); // resume again\r\n */\r\n pauseRecording: pauseRecording,\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.pauseRecording(); // first of all, pause the recording\r\n * recorder.resumeRecording(); // now resume it\r\n */\r\n resumeRecording: resumeRecording,\r\n\r\n /**\r\n * This method initializes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * recorder.initRecorder();\r\n */\r\n initRecorder: initRecorder,\r\n\r\n /**\r\n * Ask RecordRTC to auto-stop the recording after 5 minutes.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var fiveMinutes = 5 * 1000 * 60;\r\n * recorder.setRecordingDuration(fiveMinutes, function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n * \r\n * // or otherwise\r\n * recorder.setRecordingDuration(fiveMinutes).onRecordingStopped(function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n */\r\n setRecordingDuration: function(recordingDuration, callback) {\r\n if (typeof recordingDuration === 'undefined') {\r\n throw 'recordingDuration is required.';\r\n }\r\n\r\n if (typeof recordingDuration !== 'number') {\r\n throw 'recordingDuration must be a number.';\r\n }\r\n\r\n self.recordingDuration = recordingDuration;\r\n self.onRecordingStopped = callback || function() {};\r\n\r\n return {\r\n onRecordingStopped: function(callback) {\r\n self.onRecordingStopped = callback;\r\n }\r\n };\r\n },\r\n\r\n /**\r\n * This method can be used to clear/reset all the recorded data.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Figure out the difference between \"reset\" and \"clearRecordedData\" methods.\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n clearRecordedData: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n mediaRecorder.clearRecordedData();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Cleared old recorded data.');\r\n }\r\n },\r\n\r\n /**\r\n * Get the recorded blob. Use this method inside the \"stopRecording\" callback.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.getBlob();\r\n *\r\n * var file = new File([blob], 'filename.webm', {\r\n * type: 'video/webm'\r\n * });\r\n *\r\n * var formData = new FormData();\r\n * formData.append('file', file); // upload \"File\" object rather than a \"Blob\"\r\n * uploadToServer(formData);\r\n * });\r\n * @returns {Blob} Returns recorded data as \"Blob\" object.\r\n */\r\n getBlob: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return mediaRecorder.blob;\r\n },\r\n\r\n /**\r\n * Get data-URI instead of Blob.\r\n * @param {function} callback - Callback to get the Data-URI.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * recorder.getDataURL(function(dataURI) {\r\n * video.src = dataURI;\r\n * });\r\n * });\r\n */\r\n getDataURL: getDataURL,\r\n\r\n /**\r\n * Get virtual/temporary URL. Usage of this URL is limited to current tab.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * video.src = this.toURL();\r\n * });\r\n * @returns {String} Returns a virtual/temporary URL for the recorded \"Blob\".\r\n */\r\n toURL: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return URL.createObjectURL(mediaRecorder.blob);\r\n },\r\n\r\n /**\r\n * Get internal recording object (i.e. internal module) e.g. MutliStreamRecorder, MediaStreamRecorder, StereoAudioRecorder or WhammyRecorder etc.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var internalRecorder = recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n getInternalRecorder: function() {\r\n return mediaRecorder;\r\n },\r\n\r\n /**\r\n * Invoke save-as dialog to save the recorded blob into your disk.\r\n * @param {string} fileName - Set your own file name.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * this.save('file-name');\r\n *\r\n * // or manually:\r\n * invokeSaveAsDialog(this.getBlob(), 'filename.webm');\r\n * });\r\n */\r\n save: function(fileName) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n invokeSaveAsDialog(mediaRecorder.blob, fileName);\r\n },\r\n\r\n /**\r\n * This method gets a blob from indexed-DB storage.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.getFromDisk(function(dataURL) {\r\n * video.src = dataURL;\r\n * });\r\n */\r\n getFromDisk: function(callback) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n RecordRTC.getFromDisk(config.type, callback);\r\n },\r\n\r\n /**\r\n * This method appends an array of webp images to the recorded video-blob. It takes an \"array\" object.\r\n * @type {Array.}\r\n * @param {Array} arrayOfWebPImages - Array of webp images.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * var arrayOfWebPImages = [];\r\n * arrayOfWebPImages.push({\r\n * duration: index,\r\n * image: 'data:image/webp;base64,...'\r\n * });\r\n * recorder.setAdvertisementArray(arrayOfWebPImages);\r\n */\r\n setAdvertisementArray: function(arrayOfWebPImages) {\r\n config.advertisement = [];\r\n\r\n var length = arrayOfWebPImages.length;\r\n for (var i = 0; i < length; i++) {\r\n config.advertisement.push({\r\n duration: i,\r\n image: arrayOfWebPImages[i]\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * It is equivalent to \"recorder.getBlob()\" method. Usage of \"getBlob\" is recommended, though.\r\n * @property {Blob} blob - Recorded Blob can be accessed using this property.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.blob;\r\n *\r\n * // below one is recommended\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n blob: null,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} bufferSize - Buffer-size used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used this buffer-size: ' + this.bufferSize);\r\n * });\r\n */\r\n bufferSize: 0,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} sampleRate - Sample-rates used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used these sample-rates: ' + this.sampleRate);\r\n * });\r\n */\r\n sampleRate: 0,\r\n\r\n /**\r\n * {recorderType:StereoAudioRecorder} returns ArrayBuffer object.\r\n * @property {ArrayBuffer} buffer - Audio ArrayBuffer, supported only in Chrome.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var arrayBuffer = this.buffer;\r\n * alert(arrayBuffer.byteLength);\r\n * });\r\n */\r\n buffer: null,\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.reset();\r\n * recorder.startRecording();\r\n */\r\n reset: function() {\r\n if (self.state === 'recording' && !config.disableLogs) {\r\n console.warn('Stop an active recorder.');\r\n }\r\n\r\n if (mediaRecorder && typeof mediaRecorder.clearRecordedData === 'function') {\r\n mediaRecorder.clearRecordedData();\r\n }\r\n mediaRecorder = null;\r\n setState('inactive');\r\n self.blob = null;\r\n },\r\n\r\n /**\r\n * This method is called whenever recorder's state changes. Use this as an \"event\".\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.onStateChanged = function(state) {\r\n * console.log('Recorder state: ', state);\r\n * };\r\n */\r\n onStateChanged: function(state) {\r\n if (!config.disableLogs) {\r\n console.log('Recorder state changed:', state);\r\n }\r\n },\r\n\r\n /**\r\n * A recorder can have inactive, recording, paused or stopped states.\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * // this looper function will keep you updated about the recorder's states.\r\n * (function looper() {\r\n * document.querySelector('h1').innerHTML = 'Recorder\\'s state is: ' + recorder.state;\r\n * if(recorder.state === 'stopped') return; // ignore+stop\r\n * setTimeout(looper, 1000); // update after every 3-seconds\r\n * })();\r\n * recorder.startRecording();\r\n */\r\n state: 'inactive',\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n getState: function() {\r\n return self.state;\r\n },\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n destroy: function() {\r\n var disableLogsCache = config.disableLogs;\r\n\r\n config = {\r\n disableLogs: true\r\n };\r\n self.reset();\r\n setState('destroyed');\r\n returnObject = self = null;\r\n\r\n if (Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor.close();\r\n Storage.AudioContextConstructor = null;\r\n }\r\n\r\n config.disableLogs = disableLogsCache;\r\n\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC is destroyed.');\r\n }\r\n },\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n version: '5.5.9'\r\n };\r\n\r\n if (!this) {\r\n self = returnObject;\r\n return returnObject;\r\n }\r\n\r\n // if someone wants to use RecordRTC with the \"new\" keyword.\r\n for (var prop in returnObject) {\r\n this[prop] = returnObject[prop];\r\n }\r\n\r\n self = this;\r\n\r\n return returnObject;\r\n}\r\n\r\nRecordRTC.version = '5.5.9';\r\n\r\nif (true /* && !!module.exports*/ ) {\r\n module.exports = RecordRTC;\r\n}\r\n\r\nif (true) {\r\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\r\n return RecordRTC;\r\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n}\n\r\nRecordRTC.getFromDisk = function(type, callback) {\r\n if (!callback) {\r\n throw 'callback is mandatory.';\r\n }\r\n\r\n console.log('Getting recorded ' + (type === 'all' ? 'blobs' : type + ' blob ') + ' from disk!');\r\n DiskStorage.Fetch(function(dataURL, _type) {\r\n if (type !== 'all' && _type === type + 'Blob' && callback) {\r\n callback(dataURL);\r\n }\r\n\r\n if (type === 'all' && callback) {\r\n callback(dataURL, _type.replace('Blob', ''));\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * RecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nRecordRTC.writeToDisk = function(options) {\r\n console.log('Writing recorded blob(s) to disk!');\r\n options = options || {};\r\n if (options.audio && options.video && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.video) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.video && options.gif) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL\r\n });\r\n });\r\n } else if (options.video) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n } else if (options.gif) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n }\r\n};\n\r\n// __________________________\r\n// RecordRTC-Configuration.js\r\n\r\n/**\r\n * {@link RecordRTCConfiguration} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It configures the 2nd parameter passed over {@link RecordRTC} and returns a valid \"config\" object.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCConfiguration\r\n * @class\r\n * @example\r\n * var options = RecordRTCConfiguration(mediaStream, options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, getNativeBlob:true, etc.}\r\n */\r\n\r\nfunction RecordRTCConfiguration(mediaStream, config) {\r\n if (!config.recorderType && !config.type) {\r\n if (!!config.audio && !!config.video) {\r\n config.type = 'video';\r\n } else if (!!config.audio && !config.video) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n if (config.recorderType && !config.type) {\r\n if (config.recorderType === WhammyRecorder || config.recorderType === CanvasRecorder || (typeof WebAssemblyRecorder !== 'undefined' && config.recorderType === WebAssemblyRecorder)) {\r\n config.type = 'video';\r\n } else if (config.recorderType === GifRecorder) {\r\n config.type = 'gif';\r\n } else if (config.recorderType === StereoAudioRecorder) {\r\n config.type = 'audio';\r\n } else if (config.recorderType === MediaStreamRecorder) {\r\n if (getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (!getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (getTracks(mediaStream, 'audio').length && !getTracks(mediaStream, 'video').length) {\r\n config.type = 'audio';\r\n } else {\r\n // config.type = 'UnKnown';\r\n }\r\n }\r\n }\r\n\r\n if (typeof MediaStreamRecorder !== 'undefined' && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (!config.mimeType) {\r\n config.mimeType = 'video/webm';\r\n }\r\n\r\n if (!config.type) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n\r\n if (!config.bitsPerSecond) {\r\n // config.bitsPerSecond = 128000;\r\n }\r\n }\r\n\r\n // consider default type=audio\r\n if (!config.type) {\r\n if (config.mimeType) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n if (!config.type) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n return config;\r\n}\n\r\n// __________________\r\n// GetRecorderType.js\r\n\r\n/**\r\n * {@link GetRecorderType} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It returns best recorder-type available for your browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GetRecorderType\r\n * @class\r\n * @example\r\n * var RecorderType = GetRecorderType(options);\r\n * var recorder = new RecorderType(options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction GetRecorderType(mediaStream, config) {\r\n var recorder;\r\n\r\n // StereoAudioRecorder can work with all three: Edge, Firefox and Chrome\r\n // todo: detect if it is Edge, then auto use: StereoAudioRecorder\r\n if (isChrome || isEdge || isOpera) {\r\n // Media Stream Recording API has not been implemented in chrome yet;\r\n // That's why using WebAudio API to record stereo audio in WAV format\r\n recorder = StereoAudioRecorder;\r\n }\r\n\r\n if (typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype && !isChrome) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n // video recorder (in WebM format)\r\n if (config.type === 'video' && (isChrome || isOpera)) {\r\n recorder = WhammyRecorder;\r\n\r\n if (typeof WebAssemblyRecorder !== 'undefined' && typeof ReadableStream !== 'undefined') {\r\n recorder = WebAssemblyRecorder;\r\n }\r\n }\r\n\r\n // video recorder (in Gif format)\r\n if (config.type === 'gif') {\r\n recorder = GifRecorder;\r\n }\r\n\r\n // html2canvas recording!\r\n if (config.type === 'canvas') {\r\n recorder = CanvasRecorder;\r\n }\r\n\r\n if (isMediaRecorderCompatible() && recorder !== CanvasRecorder && recorder !== GifRecorder && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (getTracks(mediaStream, 'video').length || getTracks(mediaStream, 'audio').length) {\r\n // audio-only recording\r\n if (config.type === 'audio') {\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('audio/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n // else recorder = StereoAudioRecorder;\r\n } else {\r\n // video or screen tracks\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('video/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (mediaStream instanceof Array && mediaStream.length) {\r\n recorder = MultiStreamRecorder;\r\n }\r\n\r\n if (config.recorderType) {\r\n recorder = config.recorderType;\r\n }\r\n\r\n if (!config.disableLogs && !!recorder && !!recorder.name) {\r\n console.log('Using recorderType:', recorder.name || recorder.constructor.name);\r\n }\r\n\r\n if (!recorder && isSafari) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n return recorder;\r\n}\n\r\n// _____________\r\n// MRecordRTC.js\r\n\r\n/**\r\n * MRecordRTC runs on top of {@link RecordRTC} to bring multiple recordings in a single place, by providing simple API.\r\n * @summary MRecordRTC stands for \"Multiple-RecordRTC\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MRecordRTC\r\n * @class\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.addStream(MediaStream);\r\n * recorder.mediaType = {\r\n * audio: true, // or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif: true // or GifRecorder\r\n * };\r\n * // mimeType is optional and should be set only in advance cases.\r\n * recorder.mimeType = {\r\n * audio: 'audio/wav',\r\n * video: 'video/webm',\r\n * gif: 'image/gif'\r\n * };\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC/tree/master/MRecordRTC|MRecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction MRecordRTC(mediaStream) {\r\n\r\n /**\r\n * This method attaches MediaStream object to {@link MRecordRTC}.\r\n * @param {MediaStream} mediaStream - A MediaStream object, either fetched using getUserMedia API, or generated using captureStreamUntilEnded or WebAudio API.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.addStream(MediaStream);\r\n */\r\n this.addStream = function(_mediaStream) {\r\n if (_mediaStream) {\r\n mediaStream = _mediaStream;\r\n }\r\n };\r\n\r\n /**\r\n * This property can be used to set the recording type e.g. audio, or video, or gif, or canvas.\r\n * @property {object} mediaType - {audio: true, video: true, gif: true}\r\n * @memberof MRecordRTC\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.mediaType = {\r\n * audio: true, // TRUE or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // TRUE or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif : true // TRUE or GifRecorder\r\n * };\r\n */\r\n this.mediaType = {\r\n audio: true,\r\n video: true\r\n };\r\n\r\n /**\r\n * This method starts recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.startRecording();\r\n */\r\n this.startRecording = function() {\r\n var mediaType = this.mediaType;\r\n var recorderType;\r\n var mimeType = this.mimeType || {\r\n audio: null,\r\n video: null,\r\n gif: null\r\n };\r\n\r\n if (typeof mediaType.audio !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'audio').length) {\r\n mediaType.audio = false;\r\n }\r\n\r\n if (typeof mediaType.video !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.video = false;\r\n }\r\n\r\n if (typeof mediaType.gif !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.gif = false;\r\n }\r\n\r\n if (!mediaType.audio && !mediaType.video && !mediaType.gif) {\r\n throw 'MediaStream must have either audio or video tracks.';\r\n }\r\n\r\n if (!!mediaType.audio) {\r\n recorderType = null;\r\n if (typeof mediaType.audio === 'function') {\r\n recorderType = mediaType.audio;\r\n }\r\n\r\n this.audioRecorder = new RecordRTC(mediaStream, {\r\n type: 'audio',\r\n bufferSize: this.bufferSize,\r\n sampleRate: this.sampleRate,\r\n numberOfAudioChannels: this.numberOfAudioChannels || 2,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.audio,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp\r\n });\r\n\r\n if (!mediaType.video) {\r\n this.audioRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.video) {\r\n recorderType = null;\r\n if (typeof mediaType.video === 'function') {\r\n recorderType = mediaType.video;\r\n }\r\n\r\n var newStream = mediaStream;\r\n\r\n if (isMediaRecorderCompatible() && !!mediaType.audio && typeof mediaType.audio === 'function') {\r\n var videoTrack = getTracks(mediaStream, 'video')[0];\r\n\r\n if (isFirefox) {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n\r\n if (recorderType && recorderType === WhammyRecorder) {\r\n // Firefox does NOT supports webp-encoding yet\r\n // But Firefox do supports WebAssemblyRecorder\r\n recorderType = MediaStreamRecorder;\r\n }\r\n } else {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n }\r\n }\r\n\r\n this.videoRecorder = new RecordRTC(newStream, {\r\n type: 'video',\r\n video: this.video,\r\n canvas: this.canvas,\r\n frameInterval: this.frameInterval || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.video,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp,\r\n workerPath: this.workerPath,\r\n webAssemblyPath: this.webAssemblyPath,\r\n frameRate: this.frameRate, // used by WebAssemblyRecorder; values: usually 30; accepts any.\r\n bitrate: this.bitrate // used by WebAssemblyRecorder; values: 0 to 1000+\r\n });\r\n\r\n if (!mediaType.audio) {\r\n this.videoRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.audio && !!mediaType.video) {\r\n var self = this;\r\n\r\n var isSingleRecorder = isMediaRecorderCompatible() === true;\r\n\r\n if (mediaType.audio instanceof StereoAudioRecorder && !!mediaType.video) {\r\n isSingleRecorder = false;\r\n } else if (mediaType.audio !== true && mediaType.video !== true && mediaType.audio !== mediaType.video) {\r\n isSingleRecorder = false;\r\n }\r\n\r\n if (isSingleRecorder === true) {\r\n self.audioRecorder = null;\r\n self.videoRecorder.startRecording();\r\n } else {\r\n self.videoRecorder.initRecorder(function() {\r\n self.audioRecorder.initRecorder(function() {\r\n // Both recorders are ready to record things accurately\r\n self.videoRecorder.startRecording();\r\n self.audioRecorder.startRecording();\r\n });\r\n });\r\n }\r\n }\r\n\r\n if (!!mediaType.gif) {\r\n recorderType = null;\r\n if (typeof mediaType.gif === 'function') {\r\n recorderType = mediaType.gif;\r\n }\r\n this.gifRecorder = new RecordRTC(mediaStream, {\r\n type: 'gif',\r\n frameRate: this.frameRate || 200,\r\n quality: this.quality || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.gif\r\n });\r\n this.gifRecorder.startRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording.\r\n * @param {function} callback - Callback function is invoked when all encoders finished their jobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.stopRecording(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n */\r\n this.stopRecording = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (this.audioRecorder) {\r\n this.audioRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'audio');\r\n });\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'video');\r\n });\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'gif');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.pauseRecording();\r\n */\r\n this.pauseRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.pauseRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.pauseRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.pauseRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.resumeRecording();\r\n */\r\n this.resumeRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.resumeRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.resumeRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.resumeRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs.\r\n * @param {function} callback - All recorded blobs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getBlob(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n * // or\r\n * var audioBlob = recorder.getBlob().audio;\r\n * var videoBlob = recorder.getBlob().video;\r\n */\r\n this.getBlob = function(callback) {\r\n var output = {};\r\n\r\n if (this.audioRecorder) {\r\n output.audio = this.audioRecorder.getBlob();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n output.video = this.videoRecorder.getBlob();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n output.gif = this.gifRecorder.getBlob();\r\n }\r\n\r\n if (callback) {\r\n callback(output);\r\n }\r\n\r\n return output;\r\n };\r\n\r\n /**\r\n * Destroy all recorder instances.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n this.destroy = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.destroy();\r\n this.audioRecorder = null;\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.destroy();\r\n this.videoRecorder = null;\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.destroy();\r\n this.gifRecorder = null;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs' DataURLs.\r\n * @param {function} callback - All recorded blobs' DataURLs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getDataURL(function(recording){\r\n * var audioDataURL = recording.audio;\r\n * var videoDataURL = recording.video;\r\n * var gifDataURL = recording.gif;\r\n * });\r\n */\r\n this.getDataURL = function(callback) {\r\n this.getBlob(function(blob) {\r\n if (blob.audio && blob.video) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n audio: _audioDataURL,\r\n video: _videoDataURL\r\n });\r\n });\r\n });\r\n } else if (blob.audio) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n callback({\r\n audio: _audioDataURL\r\n });\r\n });\r\n } else if (blob.video) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n video: _videoDataURL\r\n });\r\n });\r\n }\r\n });\r\n\r\n function getDataURL(blob, callback00) {\r\n if (typeof Worker !== 'undefined') {\r\n var webWorker = processInWebWorker(function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n });\r\n\r\n webWorker.onmessage = function(event) {\r\n callback00(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback00(event.target.result);\r\n };\r\n }\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n var url;\r\n if (typeof URL !== 'undefined') {\r\n url = URL;\r\n } else if (typeof webkitURL !== 'undefined') {\r\n url = webkitURL;\r\n } else {\r\n throw 'Neither URL nor webkitURL detected.';\r\n }\r\n url.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to ask {@link MRecordRTC} to write all recorded blobs into IndexedDB storage.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.writeToDisk();\r\n */\r\n this.writeToDisk = function() {\r\n RecordRTC.writeToDisk({\r\n audio: this.audioRecorder,\r\n video: this.videoRecorder,\r\n gif: this.gifRecorder\r\n });\r\n };\r\n\r\n /**\r\n * This method can be used to invoke a save-as dialog for all recorded blobs.\r\n * @param {object} args - {audio: 'audio-name', video: 'video-name', gif: 'gif-name'}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.save({\r\n * audio: 'audio-file-name',\r\n * video: 'video-file-name',\r\n * gif : 'gif-file-name'\r\n * });\r\n */\r\n this.save = function(args) {\r\n args = args || {\r\n audio: true,\r\n video: true,\r\n gif: true\r\n };\r\n\r\n if (!!args.audio && this.audioRecorder) {\r\n this.audioRecorder.save(typeof args.audio === 'string' ? args.audio : '');\r\n }\r\n\r\n if (!!args.video && this.videoRecorder) {\r\n this.videoRecorder.save(typeof args.video === 'string' ? args.video : '');\r\n }\r\n if (!!args.gif && this.gifRecorder) {\r\n this.gifRecorder.save(typeof args.gif === 'string' ? args.gif : '');\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * This method can be used to get all recorded blobs from IndexedDB storage.\r\n * @param {string} type - 'all' or 'audio' or 'video' or 'gif'\r\n * @param {function} callback - Callback function to get all stored blobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.getFromDisk('all', function(dataURL, type){\r\n * if(type === 'audio') { }\r\n * if(type === 'video') { }\r\n * if(type === 'gif') { }\r\n * });\r\n */\r\nMRecordRTC.getFromDisk = RecordRTC.getFromDisk;\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nMRecordRTC.writeToDisk = RecordRTC.writeToDisk;\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MRecordRTC = MRecordRTC;\r\n}\n\r\nvar browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n(function(that) {\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n})(typeof global !== 'undefined' ? global : null);\n\r\n// _____________________________\r\n// Cross-Browser-Declarations.js\r\n\r\n// animation-frame used in WebM recording\r\n\r\n/*jshint -W079 */\r\nvar requestAnimationFrame = window.requestAnimationFrame;\r\nif (typeof requestAnimationFrame === 'undefined') {\r\n if (typeof webkitRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = webkitRequestAnimationFrame;\r\n } else if (typeof mozRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = mozRequestAnimationFrame;\r\n } else if (typeof msRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = msRequestAnimationFrame;\r\n } else if (typeof requestAnimationFrame === 'undefined') {\r\n // via: https://gist.github.com/paulirish/1579671\r\n var lastTime = 0;\r\n\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = function(callback, element) {\r\n var currTime = new Date().getTime();\r\n var timeToCall = Math.max(0, 16 - (currTime - lastTime));\r\n var id = setTimeout(function() {\r\n callback(currTime + timeToCall);\r\n }, timeToCall);\r\n lastTime = currTime + timeToCall;\r\n return id;\r\n };\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar cancelAnimationFrame = window.cancelAnimationFrame;\r\nif (typeof cancelAnimationFrame === 'undefined') {\r\n if (typeof webkitCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = webkitCancelAnimationFrame;\r\n } else if (typeof mozCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = mozCancelAnimationFrame;\r\n } else if (typeof msCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = msCancelAnimationFrame;\r\n } else if (typeof cancelAnimationFrame === 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = function(id) {\r\n clearTimeout(id);\r\n };\r\n }\r\n}\r\n\r\n// WebAudio API representer\r\nvar AudioContext = window.AudioContext;\r\n\r\nif (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar URL = window.URL;\r\n\r\nif (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n}\r\n\r\nif (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n}\r\n\r\nvar isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveBlob || !!navigator.msSaveOrOpenBlob);\r\nvar isOpera = !!window.opera || navigator.userAgent.indexOf('OPR/') !== -1;\r\nvar isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1 && ('netscape' in window) && / rv:/.test(navigator.userAgent);\r\nvar isChrome = (!isOpera && !isEdge && !!navigator.webkitGetUserMedia) || isElectron() || navigator.userAgent.toLowerCase().indexOf('chrome/') !== -1;\r\n\r\nvar isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n\r\nif (isSafari && !isChrome && navigator.userAgent.indexOf('CriOS') !== -1) {\r\n isSafari = false;\r\n isChrome = true;\r\n}\r\n\r\nvar MediaStream = window.MediaStream;\r\n\r\nif (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n}\r\n\r\n/*global MediaStream:true */\r\nif (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n}\r\n\r\n// below function via: http://goo.gl/B3ae8c\r\n/**\r\n * Return human-readable file size.\r\n * @param {number} bytes - Pass bytes and get formatted string.\r\n * @returns {string} - formatted string\r\n * @example\r\n * bytesToSize(1024*1024*5) === '5 GB'\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction bytesToSize(bytes) {\r\n var k = 1000;\r\n var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n if (bytes === 0) {\r\n return '0 Bytes';\r\n }\r\n var i = parseInt(Math.floor(Math.log(bytes) / Math.log(k)), 10);\r\n return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object. This parameter is required.\r\n * @param {string} fileName - Optional file name e.g. \"Recorded-Video.webm\"\r\n * @example\r\n * invokeSaveAsDialog(blob or file, [optional] fileName);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction invokeSaveAsDialog(file, fileName) {\r\n if (!file) {\r\n throw 'Blob object is required.';\r\n }\r\n\r\n if (!file.type) {\r\n try {\r\n file.type = 'video/webm';\r\n } catch (e) {}\r\n }\r\n\r\n var fileExtension = (file.type || 'video/webm').split('/')[1];\r\n\r\n if (fileName && fileName.indexOf('.') !== -1) {\r\n var splitted = fileName.split('.');\r\n fileName = splitted[0];\r\n fileExtension = splitted[1];\r\n }\r\n\r\n var fileFullName = (fileName || (Math.round(Math.random() * 9999999999) + 888888888)) + '.' + fileExtension;\r\n\r\n if (typeof navigator.msSaveOrOpenBlob !== 'undefined') {\r\n return navigator.msSaveOrOpenBlob(file, fileFullName);\r\n } else if (typeof navigator.msSaveBlob !== 'undefined') {\r\n return navigator.msSaveBlob(file, fileFullName);\r\n }\r\n\r\n var hyperlink = document.createElement('a');\r\n hyperlink.href = URL.createObjectURL(file);\r\n hyperlink.download = fileFullName;\r\n\r\n hyperlink.style = 'display:none;opacity:0;color:transparent;';\r\n (document.body || document.documentElement).appendChild(hyperlink);\r\n\r\n if (typeof hyperlink.click === 'function') {\r\n hyperlink.click();\r\n } else {\r\n hyperlink.target = '_blank';\r\n hyperlink.dispatchEvent(new MouseEvent('click', {\r\n view: window,\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n }\r\n\r\n URL.revokeObjectURL(hyperlink.href);\r\n}\r\n\r\n/**\r\n * from: https://github.com/cheton/is-electron/blob/master/index.js\r\n **/\r\nfunction isElectron() {\r\n // Renderer process\r\n if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {\r\n return true;\r\n }\r\n\r\n // Main process\r\n if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) {\r\n return true;\r\n }\r\n\r\n // Detect the user agent when the `nodeIntegration` option is set to true\r\n if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getTracks(stream, kind) {\r\n if (!stream || !stream.getTracks) {\r\n return [];\r\n }\r\n\r\n return stream.getTracks().filter(function(t) {\r\n return t.kind === (kind || 'audio');\r\n });\r\n}\r\n\r\nfunction setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object.\r\n * @param {function} callback - Callback function.\r\n * @example\r\n * getSeekableBlob(blob or file, callback);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction getSeekableBlob(inputBlob, callback) {\r\n // EBML.js copyrights goes to: https://github.com/legokichi/ts-ebml\r\n if (typeof EBML === 'undefined') {\r\n throw new Error('Please link: https://www.webrtc-experiment.com/EBML.js');\r\n }\r\n\r\n var reader = new EBML.Reader();\r\n var decoder = new EBML.Decoder();\r\n var tools = EBML.tools;\r\n\r\n var fileReader = new FileReader();\r\n fileReader.onload = function(e) {\r\n var ebmlElms = decoder.decode(this.result);\r\n ebmlElms.forEach(function(element) {\r\n reader.read(element);\r\n });\r\n reader.stop();\r\n var refinedMetadataBuf = tools.makeMetadataSeekable(reader.metadatas, reader.duration, reader.cues);\r\n var body = this.result.slice(reader.metadataSize);\r\n var newBlob = new Blob([refinedMetadataBuf, body], {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(newBlob);\r\n };\r\n fileReader.readAsArrayBuffer(inputBlob);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.invokeSaveAsDialog = invokeSaveAsDialog;\r\n RecordRTC.getTracks = getTracks;\r\n RecordRTC.getSeekableBlob = getSeekableBlob;\r\n RecordRTC.bytesToSize = bytesToSize;\r\n RecordRTC.isElectron = isElectron;\r\n}\n\r\n// __________ (used to handle stuff like http://goo.gl/xmE5eg) issue #129\r\n// Storage.js\r\n\r\n/**\r\n * Storage is a standalone object used by {@link RecordRTC} to store reusable objects e.g. \"new AudioContext\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * Storage.AudioContext === webkitAudioContext\r\n * @property {webkitAudioContext} AudioContext - Keeps a reference to AudioContext object.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Storage = {};\r\n\r\nif (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n} else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Storage = Storage;\r\n}\n\r\nfunction isMediaRecorderCompatible() {\r\n if (isFirefox || isSafari || isEdge) {\r\n return true;\r\n }\r\n\r\n var nVer = navigator.appVersion;\r\n var nAgt = navigator.userAgent;\r\n var fullVersion = '' + parseFloat(navigator.appVersion);\r\n var majorVersion = parseInt(navigator.appVersion, 10);\r\n var nameOffset, verOffset, ix;\r\n\r\n if (isChrome || isOpera) {\r\n verOffset = nAgt.indexOf('Chrome');\r\n fullVersion = nAgt.substring(verOffset + 7);\r\n }\r\n\r\n // trim the fullVersion string at semicolon/space if present\r\n if ((ix = fullVersion.indexOf(';')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n if ((ix = fullVersion.indexOf(' ')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n majorVersion = parseInt('' + fullVersion, 10);\r\n\r\n if (isNaN(majorVersion)) {\r\n fullVersion = '' + parseFloat(navigator.appVersion);\r\n majorVersion = parseInt(navigator.appVersion, 10);\r\n }\r\n\r\n return majorVersion >= 49;\r\n}\n\r\n// ______________________\r\n// MediaStreamRecorder.js\r\n\r\n/**\r\n * MediaStreamRecorder is an abstraction layer for {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}. It is used by {@link RecordRTC} to record MediaStream(s) in both Chrome and Firefox.\r\n * @summary Runs top over {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://github.com/muaz-khan|Muaz Khan}\r\n * @typedef MediaStreamRecorder\r\n * @class\r\n * @example\r\n * var config = {\r\n * mimeType: 'video/webm', // vp8, vp9, h264, mkv, opus/vorbis\r\n * audioBitsPerSecond : 256 * 8 * 1024,\r\n * videoBitsPerSecond : 256 * 8 * 1024,\r\n * bitsPerSecond: 256 * 8 * 1024, // if this is provided, skip above two\r\n * checkForInactiveTracks: true,\r\n * timeSlice: 1000, // concatenate intervals based blobs\r\n * ondataavailable: function() {} // get intervals based blobs\r\n * }\r\n * var recorder = new MediaStreamRecorder(mediaStream, config);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs:true, initCallback: function, mimeType: \"video/webm\", timeSlice: 1000}\r\n * @throws Will throw an error if first argument \"MediaStream\" is missing. Also throws error if \"MediaRecorder API\" are not supported by the browser.\r\n */\r\n\r\nfunction MediaStreamRecorder(mediaStream, config) {\r\n var self = this;\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n if (typeof MediaRecorder === 'undefined') {\r\n throw 'Your browser does not support the Media Recorder API. Please try other modules e.g. WhammyRecorder or StereoAudioRecorder.';\r\n }\r\n\r\n config = config || {\r\n // bitsPerSecond: 256 * 8 * 1024,\r\n mimeType: 'video/webm'\r\n };\r\n\r\n if (config.type === 'audio') {\r\n if (getTracks(mediaStream, 'video').length && getTracks(mediaStream, 'audio').length) {\r\n var stream;\r\n if (!!navigator.mozGetUserMedia) {\r\n stream = new MediaStream();\r\n stream.addTrack(getTracks(mediaStream, 'audio')[0]);\r\n } else {\r\n // webkitMediaStream\r\n stream = new MediaStream(getTracks(mediaStream, 'audio'));\r\n }\r\n mediaStream = stream;\r\n }\r\n\r\n if (!config.mimeType || config.mimeType.toString().toLowerCase().indexOf('audio') === -1) {\r\n config.mimeType = isChrome ? 'audio/webm' : 'audio/ogg';\r\n }\r\n\r\n if (config.mimeType && config.mimeType.toString().toLowerCase() !== 'audio/ogg' && !!navigator.mozGetUserMedia) {\r\n // forcing better codecs on Firefox (via #166)\r\n config.mimeType = 'audio/ogg';\r\n }\r\n }\r\n\r\n var arrayOfBlobs = [];\r\n\r\n /**\r\n * This method returns array of blobs. Use only with \"timeSlice\". Its useful to preview recording anytime, without using the \"stop\" method.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var arrayOfBlobs = recorder.getArrayOfBlobs();\r\n * @returns {Array} Returns array of recorded blobs.\r\n */\r\n this.getArrayOfBlobs = function() {\r\n return arrayOfBlobs;\r\n };\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // set defaults\r\n self.blob = null;\r\n self.clearRecordedData();\r\n self.timestamps = [];\r\n allStates = [];\r\n arrayOfBlobs = [];\r\n\r\n var recorderHints = config;\r\n\r\n if (!config.disableLogs) {\r\n console.log('Passing following config over MediaRecorder API.', recorderHints);\r\n }\r\n\r\n if (mediaRecorder) {\r\n // mandatory to make sure Firefox doesn't fails to record streams 3-4 times without reloading the page.\r\n mediaRecorder = null;\r\n }\r\n\r\n if (isChrome && !isMediaRecorderCompatible()) {\r\n // to support video-only recording on stable\r\n recorderHints = 'video/vp8';\r\n }\r\n\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && recorderHints.mimeType) {\r\n if (!MediaRecorder.isTypeSupported(recorderHints.mimeType)) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n\r\n recorderHints.mimeType = config.type === 'audio' ? 'audio/webm' : 'video/webm';\r\n }\r\n }\r\n\r\n // using MediaRecorder API here\r\n try {\r\n mediaRecorder = new MediaRecorder(mediaStream, recorderHints);\r\n\r\n // reset\r\n config.mimeType = recorderHints.mimeType;\r\n } catch (e) {\r\n // chrome-based fallback\r\n mediaRecorder = new MediaRecorder(mediaStream);\r\n }\r\n\r\n // old hack?\r\n if (recorderHints.mimeType && !MediaRecorder.isTypeSupported && 'canRecordMimeType' in mediaRecorder && mediaRecorder.canRecordMimeType(recorderHints.mimeType) === false) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n }\r\n\r\n // Dispatching OnDataAvailable Handler\r\n mediaRecorder.ondataavailable = function(e) {\r\n if (e.data) {\r\n allStates.push('ondataavailable: ' + bytesToSize(e.data.size));\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n if (e.data && e.data.size && e.data.size > 100) {\r\n arrayOfBlobs.push(e.data);\r\n updateTimeStamp();\r\n\r\n if (typeof config.ondataavailable === 'function') {\r\n // intervals based blobs\r\n var blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n config.ondataavailable(blob);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (!e.data || !e.data.size || e.data.size < 100 || self.blob) {\r\n // make sure that stopRecording always getting fired\r\n // even if there is invalid data\r\n if (self.recordingCallback) {\r\n self.recordingCallback(new Blob([], {\r\n type: getMimeType(recorderHints)\r\n }));\r\n self.recordingCallback = null;\r\n }\r\n return;\r\n }\r\n\r\n self.blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n\r\n if (self.recordingCallback) {\r\n self.recordingCallback(self.blob);\r\n self.recordingCallback = null;\r\n }\r\n };\r\n\r\n mediaRecorder.onstart = function() {\r\n allStates.push('started');\r\n };\r\n\r\n mediaRecorder.onpause = function() {\r\n allStates.push('paused');\r\n };\r\n\r\n mediaRecorder.onresume = function() {\r\n allStates.push('resumed');\r\n };\r\n\r\n mediaRecorder.onstop = function() {\r\n allStates.push('stopped');\r\n };\r\n\r\n mediaRecorder.onerror = function(error) {\r\n if (!error) {\r\n return;\r\n }\r\n\r\n if (!error.name) {\r\n error.name = 'UnknownError';\r\n }\r\n\r\n allStates.push('error: ' + error);\r\n\r\n if (!config.disableLogs) {\r\n // via: https://w3c.github.io/mediacapture-record/MediaRecorder.html#exception-summary\r\n if (error.name.toString().toLowerCase().indexOf('invalidstate') !== -1) {\r\n console.error('The MediaRecorder is not in a state in which the proposed operation is allowed to be executed.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('notsupported') !== -1) {\r\n console.error('MIME type (', recorderHints.mimeType, ') is not supported.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('security') !== -1) {\r\n console.error('MediaRecorder security error', error);\r\n }\r\n\r\n // older code below\r\n else if (error.name === 'OutOfMemory') {\r\n console.error('The UA has exhaused the available memory. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'IllegalStreamModification') {\r\n console.error('A modification to the stream has occurred that makes it impossible to continue recording. An example would be the addition of a Track while recording is occurring. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'OtherRecordingError') {\r\n console.error('Used for an fatal error other than those listed above. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'GenericError') {\r\n console.error('The UA cannot provide the codec or recording option that has been requested.', error);\r\n } else {\r\n console.error('MediaRecorder Error', error);\r\n }\r\n }\r\n\r\n (function(looper) {\r\n if (!self.manuallyStopped && mediaRecorder && mediaRecorder.state === 'inactive') {\r\n delete config.timeslice;\r\n\r\n // 10 minutes, enough?\r\n mediaRecorder.start(10 * 60 * 1000);\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000);\r\n })();\r\n\r\n if (mediaRecorder.state !== 'inactive' && mediaRecorder.state !== 'stopped') {\r\n mediaRecorder.stop();\r\n }\r\n };\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n updateTimeStamp();\r\n mediaRecorder.start(config.timeSlice);\r\n } else {\r\n // default is 60 minutes; enough?\r\n // use config => {timeSlice: 1000} otherwise\r\n\r\n mediaRecorder.start(3.6e+6);\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback(); // old code\r\n }\r\n };\r\n\r\n /**\r\n * @property {Array} timestamps - Array of time stamps\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * console.log(recorder.timestamps);\r\n */\r\n this.timestamps = [];\r\n\r\n function updateTimeStamp() {\r\n self.timestamps.push(new Date().getTime());\r\n\r\n if (typeof config.onTimeStamp === 'function') {\r\n config.onTimeStamp(self.timestamps[self.timestamps.length - 1], self.timestamps);\r\n }\r\n }\r\n\r\n function getMimeType(secondObject) {\r\n if (mediaRecorder && mediaRecorder.mimeType) {\r\n return mediaRecorder.mimeType;\r\n }\r\n\r\n return secondObject.mimeType || 'video/webm';\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n self.manuallyStopped = true; // used inside the mediaRecorder.onerror\r\n\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.recordingCallback = callback;\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.stop();\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n setTimeout(function() {\r\n self.blob = new Blob(arrayOfBlobs, {\r\n type: getMimeType(config)\r\n });\r\n\r\n self.recordingCallback(self.blob);\r\n }, 100);\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'paused') {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder && mediaRecorder.state === 'recording') {\r\n self.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n arrayOfBlobs = [];\r\n mediaRecorder = null;\r\n self.timestamps = [];\r\n }\r\n\r\n // Reference to \"MediaRecorder\" object\r\n var mediaRecorder;\r\n\r\n /**\r\n * Access to native MediaRecorder API\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @instance\r\n * @example\r\n * var internal = recorder.getInternalRecorder();\r\n * internal.ondataavailable = function() {}; // override\r\n * internal.stream, internal.onpause, internal.onstop, etc.\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n this.getInternalRecorder = function() {\r\n return mediaRecorder;\r\n };\r\n\r\n function isMediaStreamActive() {\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n\r\n\r\n /**\r\n * Get MediaRecorder readonly state.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n if (!mediaRecorder) {\r\n return 'inactive';\r\n }\r\n\r\n return mediaRecorder.state || 'inactive';\r\n };\r\n\r\n // list of all recording states\r\n var allStates = [];\r\n\r\n /**\r\n * Get MediaRecorder all recording states.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getAllStates();\r\n * @returns {Array} Returns all recording states\r\n */\r\n this.getAllStates = function() {\r\n return allStates;\r\n };\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = false; // disable to minimize CPU usage\r\n }\r\n\r\n var self = this;\r\n\r\n // this method checks if media stream is stopped\r\n // or if any track is ended.\r\n (function looper() {\r\n if (!mediaRecorder || config.checkForInactiveTracks === false) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n self.stop();\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000); // check every second\r\n })();\r\n\r\n // for debugging\r\n this.name = 'MediaStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MediaStreamRecorder = MediaStreamRecorder;\r\n}\n\r\n// source code from: http://typedarray.org/wp-content/projects/WebAudioRecorder/script.js\r\n// https://github.com/mattdiamond/Recorderjs#license-mit\r\n// ______________________\r\n// StereoAudioRecorder.js\r\n\r\n/**\r\n * StereoAudioRecorder is a standalone class used by {@link RecordRTC} to bring \"stereo\" audio-recording in chrome.\r\n * @summary JavaScript standalone object for stereo audio recording.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef StereoAudioRecorder\r\n * @class\r\n * @example\r\n * var recorder = new StereoAudioRecorder(MediaStream, {\r\n * sampleRate: 44100,\r\n * bufferSize: 4096\r\n * });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {sampleRate: 44100, bufferSize: 4096, numberOfAudioChannels: 1, etc.}\r\n */\r\n\r\nfunction StereoAudioRecorder(mediaStream, config) {\r\n if (!getTracks(mediaStream, 'audio').length) {\r\n throw 'Your stream has no audio tracks.';\r\n }\r\n\r\n config = config || {};\r\n\r\n var self = this;\r\n\r\n // variables\r\n var leftchannel = [];\r\n var rightchannel = [];\r\n var recording = false;\r\n var recordingLength = 0;\r\n var jsAudioNode;\r\n\r\n var numberOfAudioChannels = 2;\r\n\r\n /**\r\n * Set sample rates such as 8K or 16K. Reference: http://stackoverflow.com/a/28977136/552182\r\n * @property {number} desiredSampRate - Desired Bits per sample * 1000\r\n * @memberof StereoAudioRecorder\r\n * @instance\r\n * @example\r\n * var recorder = StereoAudioRecorder(mediaStream, {\r\n * desiredSampRate: 16 * 1000 // bits-per-sample * 1000\r\n * });\r\n */\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n // backward compatibility\r\n if (config.leftChannel === true) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (config.numberOfAudioChannels === 1) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (!numberOfAudioChannels || numberOfAudioChannels < 1) {\r\n numberOfAudioChannels = 2;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('StereoAudioRecorder is set to record number of channels: ' + numberOfAudioChannels);\r\n }\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = true;\r\n }\r\n\r\n function isMediaStreamActive() {\r\n if (config.checkForInactiveTracks === false) {\r\n // always return \"true\"\r\n return true;\r\n }\r\n\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n resetVariables();\r\n\r\n isAudioProcessStarted = isPaused = false;\r\n recording = true;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n looper();\r\n }\r\n };\r\n\r\n function mergeLeftRightBuffers(config, callback) {\r\n function mergeAudioBuffers(config, cb) {\r\n var numberOfAudioChannels = config.numberOfAudioChannels;\r\n\r\n // todo: \"slice(0)\" --- is it causes loop? Should be removed?\r\n var leftBuffers = config.leftBuffers.slice(0);\r\n var rightBuffers = config.rightBuffers.slice(0);\r\n var sampleRate = config.sampleRate;\r\n var internalInterleavedLength = config.internalInterleavedLength;\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n rightBuffers = mergeBuffers(rightBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n rightBuffers = interpolateArray(rightBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n // set sample rate as desired sample rate\r\n if (desiredSampRate) {\r\n sampleRate = desiredSampRate;\r\n }\r\n\r\n // for changing the sampling rate, reference:\r\n // http://stackoverflow.com/a/28977136/552182\r\n function interpolateArray(data, newSampleRate, oldSampleRate) {\r\n var fitCount = Math.round(data.length * (newSampleRate / oldSampleRate));\r\n var newData = [];\r\n var springFactor = Number((data.length - 1) / (fitCount - 1));\r\n newData[0] = data[0];\r\n for (var i = 1; i < fitCount - 1; i++) {\r\n var tmp = i * springFactor;\r\n var before = Number(Math.floor(tmp)).toFixed();\r\n var after = Number(Math.ceil(tmp)).toFixed();\r\n var atPoint = tmp - before;\r\n newData[i] = linearInterpolate(data[before], data[after], atPoint);\r\n }\r\n newData[fitCount - 1] = data[data.length - 1];\r\n return newData;\r\n }\r\n\r\n function linearInterpolate(before, after, atPoint) {\r\n return before + (after - before) * atPoint;\r\n }\r\n\r\n function mergeBuffers(channelBuffer, rLength) {\r\n var result = new Float64Array(rLength);\r\n var offset = 0;\r\n var lng = channelBuffer.length;\r\n\r\n for (var i = 0; i < lng; i++) {\r\n var buffer = channelBuffer[i];\r\n result.set(buffer, offset);\r\n offset += buffer.length;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function interleave(leftChannel, rightChannel) {\r\n var length = leftChannel.length + rightChannel.length;\r\n\r\n var result = new Float64Array(length);\r\n\r\n var inputIndex = 0;\r\n\r\n for (var index = 0; index < length;) {\r\n result[index++] = leftChannel[inputIndex];\r\n result[index++] = rightChannel[inputIndex];\r\n inputIndex++;\r\n }\r\n return result;\r\n }\r\n\r\n function writeUTFBytes(view, offset, string) {\r\n var lng = string.length;\r\n for (var i = 0; i < lng; i++) {\r\n view.setUint8(offset + i, string.charCodeAt(i));\r\n }\r\n }\r\n\r\n // interleave both channels together\r\n var interleaved;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n interleaved = interleave(leftBuffers, rightBuffers);\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n interleaved = leftBuffers;\r\n }\r\n\r\n var interleavedLength = interleaved.length;\r\n\r\n // create wav file\r\n var resultingBufferLength = 44 + interleavedLength * 2;\r\n\r\n var buffer = new ArrayBuffer(resultingBufferLength);\r\n\r\n var view = new DataView(buffer);\r\n\r\n // RIFF chunk descriptor/identifier \r\n writeUTFBytes(view, 0, 'RIFF');\r\n\r\n // RIFF chunk length\r\n // changed \"44\" to \"36\" via #401\r\n view.setUint32(4, 36 + interleavedLength * 2, true);\r\n\r\n // RIFF type \r\n writeUTFBytes(view, 8, 'WAVE');\r\n\r\n // format chunk identifier \r\n // FMT sub-chunk\r\n writeUTFBytes(view, 12, 'fmt ');\r\n\r\n // format chunk length \r\n view.setUint32(16, 16, true);\r\n\r\n // sample format (raw)\r\n view.setUint16(20, 1, true);\r\n\r\n // stereo (2 channels)\r\n view.setUint16(22, numberOfAudioChannels, true);\r\n\r\n // sample rate \r\n view.setUint32(24, sampleRate, true);\r\n\r\n // byte rate (sample rate * block align)\r\n view.setUint32(28, sampleRate * 2, true);\r\n\r\n // block align (channel count * bytes per sample) \r\n view.setUint16(32, numberOfAudioChannels * 2, true);\r\n\r\n // bits per sample \r\n view.setUint16(34, 16, true);\r\n\r\n // data sub-chunk\r\n // data chunk identifier \r\n writeUTFBytes(view, 36, 'data');\r\n\r\n // data chunk length \r\n view.setUint32(40, interleavedLength * 2, true);\r\n\r\n // write the PCM samples\r\n var lng = interleavedLength;\r\n var index = 44;\r\n var volume = 1;\r\n for (var i = 0; i < lng; i++) {\r\n view.setInt16(index, interleaved[i] * (0x7FFF * volume), true);\r\n index += 2;\r\n }\r\n\r\n if (cb) {\r\n return cb({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n postMessage({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n if (config.noWorker) {\r\n mergeAudioBuffers(config, function(data) {\r\n callback(data.buffer, data.view);\r\n });\r\n return;\r\n }\r\n\r\n\r\n var webWorker = processInWebWorker(mergeAudioBuffers);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data.buffer, event.data.view);\r\n\r\n // release memory\r\n URL.revokeObjectURL(webWorker.workerURL);\r\n\r\n // kill webworker (or Chrome will kill your page after ~25 calls)\r\n webWorker.terminate();\r\n };\r\n\r\n webWorker.postMessage(config);\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var workerURL = URL.createObjectURL(new Blob([_function.toString(),\r\n ';this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(workerURL);\r\n worker.workerURL = workerURL;\r\n return worker;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n // stop recording\r\n recording = false;\r\n\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: recordingLength,\r\n leftBuffers: leftchannel,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : rightchannel,\r\n noWorker: config.noWorker\r\n }, function(buffer, view) {\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n self.blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n\r\n /**\r\n * @property {ArrayBuffer} buffer - The recorded buffer object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var buffer = recorder.buffer;\r\n * });\r\n */\r\n self.buffer = new ArrayBuffer(view.buffer.byteLength);\r\n\r\n /**\r\n * @property {DataView} view - The recorded data-view object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var view = recorder.view;\r\n * });\r\n */\r\n self.view = view;\r\n\r\n self.sampleRate = desiredSampRate || sampleRate;\r\n self.bufferSize = bufferSize;\r\n\r\n // recorded audio length\r\n self.length = recordingLength;\r\n\r\n isAudioProcessStarted = false;\r\n\r\n if (callback) {\r\n callback(self.blob);\r\n }\r\n });\r\n };\r\n\r\n if (typeof RecordRTC.Storage === 'undefined') {\r\n RecordRTC.Storage = {\r\n AudioContextConstructor: null,\r\n AudioContext: window.AudioContext || window.webkitAudioContext\r\n };\r\n }\r\n\r\n if (!RecordRTC.Storage.AudioContextConstructor || RecordRTC.Storage.AudioContextConstructor.state === 'closed') {\r\n RecordRTC.Storage.AudioContextConstructor = new RecordRTC.Storage.AudioContext();\r\n }\r\n\r\n var context = RecordRTC.Storage.AudioContextConstructor;\r\n\r\n // creates an audio node from the microphone incoming stream\r\n var audioInput = context.createMediaStreamSource(mediaStream);\r\n\r\n var legalBufferValues = [0, 256, 512, 1024, 2048, 4096, 8192, 16384];\r\n\r\n /**\r\n * From the spec: This value controls how frequently the audioprocess event is\r\n * dispatched and how many sample-frames need to be processed each call.\r\n * Lower values for buffer size will result in a lower (better) latency.\r\n * Higher values will be necessary to avoid audio breakup and glitches\r\n * The size of the buffer (in sample-frames) which needs to\r\n * be processed each time onprocessaudio is called.\r\n * Legal values are (256, 512, 1024, 2048, 4096, 8192, 16384).\r\n * @property {number} bufferSize - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * bufferSize: 4096\r\n * });\r\n */\r\n\r\n // \"0\" means, let chrome decide the most accurate buffer-size for current platform.\r\n var bufferSize = typeof config.bufferSize === 'undefined' ? 4096 : config.bufferSize;\r\n\r\n if (legalBufferValues.indexOf(bufferSize) === -1) {\r\n if (!config.disableLogs) {\r\n console.log('Legal values for buffer-size are ' + JSON.stringify(legalBufferValues, null, '\\t'));\r\n }\r\n }\r\n\r\n if (context.createJavaScriptNode) {\r\n jsAudioNode = context.createJavaScriptNode(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else if (context.createScriptProcessor) {\r\n jsAudioNode = context.createScriptProcessor(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else {\r\n throw 'WebAudio API has no support on this browser.';\r\n }\r\n\r\n // connect the stream to the script processor\r\n audioInput.connect(jsAudioNode);\r\n\r\n if (!config.bufferSize) {\r\n bufferSize = jsAudioNode.bufferSize; // device buffer-size\r\n }\r\n\r\n /**\r\n * The sample rate (in sample-frames per second) at which the\r\n * AudioContext handles audio. It is assumed that all AudioNodes\r\n * in the context run at this rate. In making this assumption,\r\n * sample-rate converters or \"varispeed\" processors are not supported\r\n * in real-time processing.\r\n * The sampleRate parameter describes the sample-rate of the\r\n * linear PCM audio data in the buffer in sample-frames per second.\r\n * An implementation must support sample-rates in at least\r\n * the range 22050 to 96000.\r\n * @property {number} sampleRate - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * sampleRate: 44100\r\n * });\r\n */\r\n var sampleRate = typeof config.sampleRate !== 'undefined' ? config.sampleRate : context.sampleRate || 44100;\r\n\r\n if (sampleRate < 22050 || sampleRate > 96000) {\r\n // Ref: http://stackoverflow.com/a/26303918/552182\r\n if (!config.disableLogs) {\r\n console.log('sample-rate must be under range 22050 and 96000.');\r\n }\r\n }\r\n\r\n if (!config.disableLogs) {\r\n if (config.desiredSampRate) {\r\n console.log('Desired sample-rate: ' + config.desiredSampRate);\r\n }\r\n }\r\n\r\n var isPaused = false;\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n if (!recording) {\r\n if (!config.disableLogs) {\r\n console.log('Seems recording has been restarted.');\r\n }\r\n this.record();\r\n return;\r\n }\r\n\r\n isPaused = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n config.checkForInactiveTracks = false;\r\n\r\n if (recording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function resetVariables() {\r\n leftchannel = [];\r\n rightchannel = [];\r\n recordingLength = 0;\r\n isAudioProcessStarted = false;\r\n recording = false;\r\n isPaused = false;\r\n context = null;\r\n\r\n self.leftchannel = leftchannel;\r\n self.rightchannel = rightchannel;\r\n self.numberOfAudioChannels = numberOfAudioChannels;\r\n self.desiredSampRate = desiredSampRate;\r\n self.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n }\r\n\r\n function clearRecordedDataCB() {\r\n if (jsAudioNode) {\r\n jsAudioNode.onaudioprocess = null;\r\n jsAudioNode.disconnect();\r\n jsAudioNode = null;\r\n }\r\n\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n\r\n resetVariables();\r\n }\r\n\r\n // for debugging\r\n this.name = 'StereoAudioRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var isAudioProcessStarted = false;\r\n\r\n function onAudioProcessDataAvailable(e) {\r\n if (isPaused) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n jsAudioNode.disconnect();\r\n recording = false;\r\n }\r\n\r\n if (!recording) {\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n return;\r\n }\r\n\r\n /**\r\n * This method is called on \"onaudioprocess\" event's first invocation.\r\n * @method {function} onAudioProcessStarted\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.onAudioProcessStarted: function() { };\r\n */\r\n if (!isAudioProcessStarted) {\r\n isAudioProcessStarted = true;\r\n if (config.onAudioProcessStarted) {\r\n config.onAudioProcessStarted();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n }\r\n\r\n var left = e.inputBuffer.getChannelData(0);\r\n\r\n // we clone the samples\r\n var chLeft = new Float32Array(left);\r\n leftchannel.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n var right = e.inputBuffer.getChannelData(1);\r\n var chRight = new Float32Array(right);\r\n rightchannel.push(chRight);\r\n }\r\n\r\n recordingLength += bufferSize;\r\n\r\n // export raw PCM\r\n self.recordingLength = recordingLength;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n intervalsBasedBuffers.recordingLength += bufferSize;\r\n intervalsBasedBuffers.left.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n intervalsBasedBuffers.right.push(chRight);\r\n }\r\n }\r\n }\r\n\r\n jsAudioNode.onaudioprocess = onAudioProcessDataAvailable;\r\n\r\n // to prevent self audio to be connected with speakers\r\n if (context.createMediaStreamDestination) {\r\n jsAudioNode.connect(context.createMediaStreamDestination());\r\n } else {\r\n jsAudioNode.connect(context.destination);\r\n }\r\n\r\n // export raw PCM\r\n this.leftchannel = leftchannel;\r\n this.rightchannel = rightchannel;\r\n this.numberOfAudioChannels = numberOfAudioChannels;\r\n this.desiredSampRate = desiredSampRate;\r\n this.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n // helper for intervals based blobs\r\n var intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n\r\n // this looper is used to support intervals based blobs (via timeSlice+ondataavailable)\r\n function looper() {\r\n if (!recording || typeof config.ondataavailable !== 'function' || typeof config.timeSlice === 'undefined') {\r\n return;\r\n }\r\n\r\n if (intervalsBasedBuffers.left.length) {\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: intervalsBasedBuffers.recordingLength,\r\n leftBuffers: intervalsBasedBuffers.left,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : intervalsBasedBuffers.right\r\n }, function(buffer, view) {\r\n var blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n config.ondataavailable(blob);\r\n\r\n setTimeout(looper, config.timeSlice);\r\n });\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n } else {\r\n setTimeout(looper, config.timeSlice);\r\n }\r\n }\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.StereoAudioRecorder = StereoAudioRecorder;\r\n}\r\n\r\n// _________________\r\n// CanvasRecorder.js\r\n\r\n/**\r\n * CanvasRecorder is a standalone class used by {@link RecordRTC} to bring HTML5-Canvas recording into video WebM. It uses HTML2Canvas library and runs top over {@link Whammy}.\r\n * @summary HTML2Canvas recording into video WebM.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef CanvasRecorder\r\n * @class\r\n * @example\r\n * var recorder = new CanvasRecorder(htmlElement, { disableLogs: true, useWhammyRecorder: true });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {HTMLElement} htmlElement - querySelector/getElementById/getElementsByTagName[0]/etc.\r\n * @param {object} config - {disableLogs:true, initCallback: function}\r\n */\r\n\r\nfunction CanvasRecorder(htmlElement, config) {\r\n if (typeof html2canvas === 'undefined') {\r\n throw 'Please link: https://www.webrtc-experiment.com/screenshot.js';\r\n }\r\n\r\n config = config || {};\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n // via DetectRTC.js\r\n var isCanvasSupportsStreamCapturing = false;\r\n ['captureStream', 'mozCaptureStream', 'webkitCaptureStream'].forEach(function(item) {\r\n if (item in document.createElement('canvas')) {\r\n isCanvasSupportsStreamCapturing = true;\r\n }\r\n });\r\n\r\n var _isChrome = (!!window.webkitRTCPeerConnection || !!window.webkitGetUserMedia) && !!window.chrome;\r\n\r\n var chromeVersion = 50;\r\n var matchArray = navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\r\n if (_isChrome && matchArray && matchArray[2]) {\r\n chromeVersion = parseInt(matchArray[2], 10);\r\n }\r\n\r\n if (_isChrome && chromeVersion < 52) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n if (config.useWhammyRecorder) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n var globalCanvas, mediaStreamRecorder;\r\n\r\n if (isCanvasSupportsStreamCapturing) {\r\n if (!config.disableLogs) {\r\n console.log('Your browser supports both MediRecorder API and canvas.captureStream!');\r\n }\r\n\r\n if (htmlElement instanceof HTMLCanvasElement) {\r\n globalCanvas = htmlElement;\r\n } else if (htmlElement instanceof CanvasRenderingContext2D) {\r\n globalCanvas = htmlElement.canvas;\r\n } else {\r\n throw 'Please pass either HTMLCanvasElement or CanvasRenderingContext2D.';\r\n }\r\n } else if (!!navigator.mozGetUserMedia) {\r\n if (!config.disableLogs) {\r\n console.error('Canvas recording is NOT supported in Firefox.');\r\n }\r\n }\r\n\r\n var isRecording;\r\n\r\n /**\r\n * This method records Canvas.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n isRecording = true;\r\n\r\n if (isCanvasSupportsStreamCapturing && !config.useWhammyRecorder) {\r\n // CanvasCaptureMediaStream\r\n var canvasMediaStream;\r\n if ('captureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.captureStream(25); // 25 FPS\r\n } else if ('mozCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.mozCaptureStream(25);\r\n } else if ('webkitCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.webkitCaptureStream(25);\r\n }\r\n\r\n try {\r\n var mdStream = new MediaStream();\r\n mdStream.addTrack(getTracks(canvasMediaStream, 'video')[0]);\r\n canvasMediaStream = mdStream;\r\n } catch (e) {}\r\n\r\n if (!canvasMediaStream) {\r\n throw 'captureStream API are NOT available.';\r\n }\r\n\r\n // Note: Jan 18, 2016 status is that, \r\n // Firefox MediaRecorder API can't record CanvasCaptureMediaStream object.\r\n mediaStreamRecorder = new MediaStreamRecorder(canvasMediaStream, {\r\n mimeType: config.mimeType || 'video/webm'\r\n });\r\n mediaStreamRecorder.record();\r\n } else {\r\n whammy.frames = [];\r\n lastTime = new Date().getTime();\r\n drawCanvasFrame();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n this.getWebPImages = function(callback) {\r\n if (htmlElement.nodeName.toLowerCase() !== 'canvas') {\r\n callback();\r\n return;\r\n }\r\n\r\n var framesLength = whammy.frames.length;\r\n whammy.frames.forEach(function(frame, idx) {\r\n var framesRemaining = framesLength - idx;\r\n if (!config.disableLogs) {\r\n console.log(framesRemaining + '/' + framesLength + ' frames remaining');\r\n }\r\n\r\n if (config.onEncodingCallback) {\r\n config.onEncodingCallback(framesRemaining, framesLength);\r\n }\r\n\r\n var webp = frame.image.toDataURL('image/webp', 1);\r\n whammy.frames[idx].image = webp;\r\n });\r\n\r\n if (!config.disableLogs) {\r\n console.log('Generating WebM');\r\n }\r\n\r\n callback();\r\n };\r\n\r\n /**\r\n * This method stops recording Canvas.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n isRecording = false;\r\n\r\n var that = this;\r\n\r\n if (isCanvasSupportsStreamCapturing && mediaStreamRecorder) {\r\n mediaStreamRecorder.stop(callback);\r\n return;\r\n }\r\n\r\n this.getWebPImages(function() {\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n if (!config.disableLogs) {\r\n console.log('Recording finished!');\r\n }\r\n\r\n that.blob = blob;\r\n\r\n if (that.blob.forEach) {\r\n that.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(that.blob);\r\n }\r\n\r\n whammy.frames = [];\r\n });\r\n });\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.pause();\r\n return;\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.resume();\r\n return;\r\n }\r\n\r\n if (!isRecording) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (isRecording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isRecording = false;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'CanvasRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n function cloneCanvas() {\r\n //create a new canvas\r\n var newCanvas = document.createElement('canvas');\r\n var context = newCanvas.getContext('2d');\r\n\r\n //set dimensions\r\n newCanvas.width = htmlElement.width;\r\n newCanvas.height = htmlElement.height;\r\n\r\n //apply the old canvas to the new one\r\n context.drawImage(htmlElement, 0, 0);\r\n\r\n //return the new canvas\r\n return newCanvas;\r\n }\r\n\r\n function drawCanvasFrame() {\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawCanvasFrame, 500);\r\n }\r\n\r\n if (htmlElement.nodeName.toLowerCase() === 'canvas') {\r\n var duration = new Date().getTime() - lastTime;\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: cloneCanvas(),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n return;\r\n }\r\n\r\n html2canvas(htmlElement, {\r\n grabMouse: typeof config.showMousePointer === 'undefined' || config.showMousePointer,\r\n onrendered: function(canvas) {\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: canvas.toDataURL('image/webp', 1),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n }\r\n });\r\n }\r\n\r\n var lastTime = new Date().getTime();\r\n\r\n var whammy = new Whammy.Video(100);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.CanvasRecorder = CanvasRecorder;\r\n}\n\r\n// _________________\r\n// WhammyRecorder.js\r\n\r\n/**\r\n * WhammyRecorder is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It runs top over {@link Whammy}.\r\n * @summary Video recording feature in Chrome.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WhammyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WhammyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs: true, initCallback: function, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction WhammyRecorder(mediaStream, config) {\r\n\r\n config = config || {};\r\n\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Using frames-interval:', config.frameInterval);\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (!config.width) {\r\n config.width = 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n context = canvas.getContext('2d');\r\n\r\n // setting defaults\r\n if (config.video && config.video instanceof HTMLVideoElement) {\r\n video = config.video.cloneNode();\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n } else {\r\n video = document.createElement('video');\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.onloadedmetadata = function() { // \"onloadedmetadata\" may NOT work in FF?\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n video.width = config.video.width;\r\n video.height = config.video.height;\r\n }\r\n\r\n video.muted = true;\r\n video.play();\r\n\r\n lastTime = new Date().getTime();\r\n whammy = new Whammy.Video();\r\n\r\n if (!config.disableLogs) {\r\n console.log('canvas resolutions', canvas.width, '*', canvas.height);\r\n console.log('video width/height', video.width || canvas.width, '*', video.height || canvas.height);\r\n }\r\n\r\n drawFrames(config.frameInterval);\r\n };\r\n\r\n /**\r\n * Draw and push frames to Whammy\r\n * @param {integer} frameInterval - set minimum interval (in milliseconds) between each time we push a frame to Whammy\r\n */\r\n function drawFrames(frameInterval) {\r\n frameInterval = typeof frameInterval !== 'undefined' ? frameInterval : 10;\r\n\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawFrames, 100);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n if (video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n whammy.frames.push({\r\n duration: duration,\r\n image: canvas.toDataURL('image/webp')\r\n });\r\n\r\n if (!isStopDrawing) {\r\n setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n }\r\n\r\n function asyncLoop(o) {\r\n var i = -1,\r\n length = o.length;\r\n\r\n (function loop() {\r\n i++;\r\n if (i === length) {\r\n o.callback();\r\n return;\r\n }\r\n\r\n // \"setTimeout\" added by Jim McLeod\r\n setTimeout(function() {\r\n o.functionToLoop(loop, i);\r\n }, 1);\r\n })();\r\n }\r\n\r\n\r\n /**\r\n * remove black frames from the beginning to the specified frame\r\n * @param {Array} _frames - array of frames to be checked\r\n * @param {number} _framesToCheck - number of frame until check will be executed (-1 - will drop all frames until frame not matched will be found)\r\n * @param {number} _pixTolerance - 0 - very strict (only black pixel color) ; 1 - all\r\n * @param {number} _frameTolerance - 0 - very strict (only black frame color) ; 1 - all\r\n * @returns {Array} - array of frames\r\n */\r\n // pull#293 by @volodalexey\r\n function dropBlackFrames(_frames, _framesToCheck, _pixTolerance, _frameTolerance, callback) {\r\n var localCanvas = document.createElement('canvas');\r\n localCanvas.width = canvas.width;\r\n localCanvas.height = canvas.height;\r\n var context2d = localCanvas.getContext('2d');\r\n var resultFrames = [];\r\n\r\n var checkUntilNotBlack = _framesToCheck === -1;\r\n var endCheckFrame = (_framesToCheck && _framesToCheck > 0 && _framesToCheck <= _frames.length) ?\r\n _framesToCheck : _frames.length;\r\n var sampleColor = {\r\n r: 0,\r\n g: 0,\r\n b: 0\r\n };\r\n var maxColorDifference = Math.sqrt(\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2)\r\n );\r\n var pixTolerance = _pixTolerance && _pixTolerance >= 0 && _pixTolerance <= 1 ? _pixTolerance : 0;\r\n var frameTolerance = _frameTolerance && _frameTolerance >= 0 && _frameTolerance <= 1 ? _frameTolerance : 0;\r\n var doNotCheckNext = false;\r\n\r\n asyncLoop({\r\n length: endCheckFrame,\r\n functionToLoop: function(loop, f) {\r\n var matchPixCount, endPixCheck, maxPixCount;\r\n\r\n var finishImage = function() {\r\n if (!doNotCheckNext && maxPixCount - matchPixCount <= maxPixCount * frameTolerance) {\r\n // console.log('removed black frame : ' + f + ' ; frame duration ' + _frames[f].duration);\r\n } else {\r\n // console.log('frame is passed : ' + f);\r\n if (checkUntilNotBlack) {\r\n doNotCheckNext = true;\r\n }\r\n resultFrames.push(_frames[f]);\r\n }\r\n loop();\r\n };\r\n\r\n if (!doNotCheckNext) {\r\n var image = new Image();\r\n image.onload = function() {\r\n context2d.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n var imageData = context2d.getImageData(0, 0, canvas.width, canvas.height);\r\n matchPixCount = 0;\r\n endPixCheck = imageData.data.length;\r\n maxPixCount = imageData.data.length / 4;\r\n\r\n for (var pix = 0; pix < endPixCheck; pix += 4) {\r\n var currentColor = {\r\n r: imageData.data[pix],\r\n g: imageData.data[pix + 1],\r\n b: imageData.data[pix + 2]\r\n };\r\n var colorDifference = Math.sqrt(\r\n Math.pow(currentColor.r - sampleColor.r, 2) +\r\n Math.pow(currentColor.g - sampleColor.g, 2) +\r\n Math.pow(currentColor.b - sampleColor.b, 2)\r\n );\r\n // difference in color it is difference in color vectors (r1,g1,b1) <=> (r2,g2,b2)\r\n if (colorDifference <= maxColorDifference * pixTolerance) {\r\n matchPixCount++;\r\n }\r\n }\r\n finishImage();\r\n };\r\n image.src = _frames[f].image;\r\n } else {\r\n finishImage();\r\n }\r\n },\r\n callback: function() {\r\n resultFrames = resultFrames.concat(_frames.slice(endCheckFrame));\r\n\r\n if (resultFrames.length <= 0) {\r\n // at least one last frame should be available for next manipulation\r\n // if total duration of all frames will be < 1000 than ffmpeg doesn't work well...\r\n resultFrames.push(_frames[_frames.length - 1]);\r\n }\r\n callback(resultFrames);\r\n }\r\n });\r\n }\r\n\r\n var isStopDrawing = false;\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n isStopDrawing = true;\r\n\r\n var _this = this;\r\n // analyse of all frames takes some time!\r\n setTimeout(function() {\r\n // e.g. dropBlackFrames(frames, 10, 1, 1) - will cut all 10 frames\r\n // e.g. dropBlackFrames(frames, 10, 0.5, 0.5) - will analyse 10 frames\r\n // e.g. dropBlackFrames(frames, 10) === dropBlackFrames(frames, 10, 0, 0) - will analyse 10 frames with strict black color\r\n dropBlackFrames(whammy.frames, -1, null, null, function(frames) {\r\n whammy.frames = frames;\r\n\r\n // to display advertisement images!\r\n if (config.advertisement && config.advertisement.length) {\r\n whammy.frames = config.advertisement.concat(whammy.frames);\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n _this.blob = blob;\r\n\r\n if (_this.blob.forEach) {\r\n _this.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(_this.blob);\r\n }\r\n });\r\n });\r\n }, 10);\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (isStopDrawing) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (!isStopDrawing) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isStopDrawing = true;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'WhammyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n var video;\r\n var lastTime;\r\n var whammy;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WhammyRecorder = WhammyRecorder;\r\n}\n\r\n// https://github.com/antimatter15/whammy/blob/master/LICENSE\r\n// _________\r\n// Whammy.js\r\n\r\n// todo: Firefox now supports webp for webm containers!\r\n// their MediaRecorder implementation works well!\r\n// should we provide an option to record via Whammy.js or MediaRecorder API is a better solution?\r\n\r\n/**\r\n * Whammy is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It is written by {@link https://github.com/antimatter15|antimatter15}\r\n * @summary A real time javascript webm encoder based on a canvas hack.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef Whammy\r\n * @class\r\n * @example\r\n * var recorder = new Whammy().Video(15);\r\n * recorder.add(context || canvas || dataURL);\r\n * var output = recorder.compile();\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Whammy = (function() {\r\n // a more abstract-ish API\r\n\r\n function WhammyVideo(duration) {\r\n this.frames = [];\r\n this.duration = duration || 1;\r\n this.quality = 0.8;\r\n }\r\n\r\n /**\r\n * Pass Canvas or Context or image/webp(string) to {@link Whammy} encoder.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.add(canvas || context || 'image/webp');\r\n * @param {string} frame - Canvas || Context || image/webp\r\n * @param {number} duration - Stick a duration (in milliseconds)\r\n */\r\n WhammyVideo.prototype.add = function(frame, duration) {\r\n if ('canvas' in frame) { //CanvasRenderingContext2D\r\n frame = frame.canvas;\r\n }\r\n\r\n if ('toDataURL' in frame) {\r\n frame = frame.toDataURL('image/webp', this.quality);\r\n }\r\n\r\n if (!(/^data:image\\/webp;base64,/ig).test(frame)) {\r\n throw 'Input must be formatted properly as a base64 encoded DataURI of type image/webp';\r\n }\r\n this.frames.push({\r\n image: frame,\r\n duration: duration || this.duration\r\n });\r\n };\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n\r\n function whammyInWebWorker(frames) {\r\n function ArrayToWebM(frames) {\r\n var info = checkFrames(frames);\r\n if (!info) {\r\n return [];\r\n }\r\n\r\n var clusterMaxDuration = 30000;\r\n\r\n var EBML = [{\r\n 'id': 0x1a45dfa3, // EBML\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0x4286 // EBMLVersion\r\n }, {\r\n 'data': 1,\r\n 'id': 0x42f7 // EBMLReadVersion\r\n }, {\r\n 'data': 4,\r\n 'id': 0x42f2 // EBMLMaxIDLength\r\n }, {\r\n 'data': 8,\r\n 'id': 0x42f3 // EBMLMaxSizeLength\r\n }, {\r\n 'data': 'webm',\r\n 'id': 0x4282 // DocType\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4287 // DocTypeVersion\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4285 // DocTypeReadVersion\r\n }]\r\n }, {\r\n 'id': 0x18538067, // Segment\r\n 'data': [{\r\n 'id': 0x1549a966, // Info\r\n 'data': [{\r\n 'data': 1e6, //do things in millisecs (num of nanosecs for duration scale)\r\n 'id': 0x2ad7b1 // TimecodeScale\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x4d80 // MuxingApp\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x5741 // WritingApp\r\n }, {\r\n 'data': doubleToString(info.duration),\r\n 'id': 0x4489 // Duration\r\n }]\r\n }, {\r\n 'id': 0x1654ae6b, // Tracks\r\n 'data': [{\r\n 'id': 0xae, // TrackEntry\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0xd7 // TrackNumber\r\n }, {\r\n 'data': 1,\r\n 'id': 0x73c5 // TrackUID\r\n }, {\r\n 'data': 0,\r\n 'id': 0x9c // FlagLacing\r\n }, {\r\n 'data': 'und',\r\n 'id': 0x22b59c // Language\r\n }, {\r\n 'data': 'V_VP8',\r\n 'id': 0x86 // CodecID\r\n }, {\r\n 'data': 'VP8',\r\n 'id': 0x258688 // CodecName\r\n }, {\r\n 'data': 1,\r\n 'id': 0x83 // TrackType\r\n }, {\r\n 'id': 0xe0, // Video\r\n 'data': [{\r\n 'data': info.width,\r\n 'id': 0xb0 // PixelWidth\r\n }, {\r\n 'data': info.height,\r\n 'id': 0xba // PixelHeight\r\n }]\r\n }]\r\n }]\r\n }]\r\n }];\r\n\r\n //Generate clusters (max duration)\r\n var frameNumber = 0;\r\n var clusterTimecode = 0;\r\n while (frameNumber < frames.length) {\r\n\r\n var clusterFrames = [];\r\n var clusterDuration = 0;\r\n do {\r\n clusterFrames.push(frames[frameNumber]);\r\n clusterDuration += frames[frameNumber].duration;\r\n frameNumber++;\r\n } while (frameNumber < frames.length && clusterDuration < clusterMaxDuration);\r\n\r\n var clusterCounter = 0;\r\n var cluster = {\r\n 'id': 0x1f43b675, // Cluster\r\n 'data': getClusterData(clusterTimecode, clusterCounter, clusterFrames)\r\n }; //Add cluster to segment\r\n EBML[1].data.push(cluster);\r\n clusterTimecode += clusterDuration;\r\n }\r\n\r\n return generateEBML(EBML);\r\n }\r\n\r\n function getClusterData(clusterTimecode, clusterCounter, clusterFrames) {\r\n return [{\r\n 'data': clusterTimecode,\r\n 'id': 0xe7 // Timecode\r\n }].concat(clusterFrames.map(function(webp) {\r\n var block = makeSimpleBlock({\r\n discardable: 0,\r\n frame: webp.data.slice(4),\r\n invisible: 0,\r\n keyframe: 1,\r\n lacing: 0,\r\n trackNum: 1,\r\n timecode: Math.round(clusterCounter)\r\n });\r\n clusterCounter += webp.duration;\r\n return {\r\n data: block,\r\n id: 0xa3\r\n };\r\n }));\r\n }\r\n\r\n // sums the lengths of all the frames and gets the duration\r\n\r\n function checkFrames(frames) {\r\n if (!frames[0]) {\r\n postMessage({\r\n error: 'Something went wrong. Maybe WebP format is not supported in the current browser.'\r\n });\r\n return;\r\n }\r\n\r\n var width = frames[0].width,\r\n height = frames[0].height,\r\n duration = frames[0].duration;\r\n\r\n for (var i = 1; i < frames.length; i++) {\r\n duration += frames[i].duration;\r\n }\r\n return {\r\n duration: duration,\r\n width: width,\r\n height: height\r\n };\r\n }\r\n\r\n function numToBuffer(num) {\r\n var parts = [];\r\n while (num > 0) {\r\n parts.push(num & 0xff);\r\n num = num >> 8;\r\n }\r\n return new Uint8Array(parts.reverse());\r\n }\r\n\r\n function strToBuffer(str) {\r\n return new Uint8Array(str.split('').map(function(e) {\r\n return e.charCodeAt(0);\r\n }));\r\n }\r\n\r\n function bitsToBuffer(bits) {\r\n var data = [];\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data.push(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return new Uint8Array(data);\r\n }\r\n\r\n function generateEBML(json) {\r\n var ebml = [];\r\n for (var i = 0; i < json.length; i++) {\r\n var data = json[i].data;\r\n\r\n if (typeof data === 'object') {\r\n data = generateEBML(data);\r\n }\r\n\r\n if (typeof data === 'number') {\r\n data = bitsToBuffer(data.toString(2));\r\n }\r\n\r\n if (typeof data === 'string') {\r\n data = strToBuffer(data);\r\n }\r\n\r\n var len = data.size || data.byteLength || data.length;\r\n var zeroes = Math.ceil(Math.ceil(Math.log(len) / Math.log(2)) / 8);\r\n var sizeToString = len.toString(2);\r\n var padded = (new Array((zeroes * 7 + 7 + 1) - sizeToString.length)).join('0') + sizeToString;\r\n var size = (new Array(zeroes)).join('0') + '1' + padded;\r\n\r\n ebml.push(numToBuffer(json[i].id));\r\n ebml.push(bitsToBuffer(size));\r\n ebml.push(data);\r\n }\r\n\r\n return new Blob(ebml, {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n function toBinStrOld(bits) {\r\n var data = '';\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data += String.fromCharCode(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return data;\r\n }\r\n\r\n function makeSimpleBlock(data) {\r\n var flags = 0;\r\n\r\n if (data.keyframe) {\r\n flags |= 128;\r\n }\r\n\r\n if (data.invisible) {\r\n flags |= 8;\r\n }\r\n\r\n if (data.lacing) {\r\n flags |= (data.lacing << 1);\r\n }\r\n\r\n if (data.discardable) {\r\n flags |= 1;\r\n }\r\n\r\n if (data.trackNum > 127) {\r\n throw 'TrackNumber > 127 not supported';\r\n }\r\n\r\n var out = [data.trackNum | 0x80, data.timecode >> 8, data.timecode & 0xff, flags].map(function(e) {\r\n return String.fromCharCode(e);\r\n }).join('') + data.frame;\r\n\r\n return out;\r\n }\r\n\r\n function parseWebP(riff) {\r\n var VP8 = riff.RIFF[0].WEBP[0];\r\n\r\n var frameStart = VP8.indexOf('\\x9d\\x01\\x2a'); // A VP8 keyframe starts with the 0x9d012a header\r\n for (var i = 0, c = []; i < 4; i++) {\r\n c[i] = VP8.charCodeAt(frameStart + 3 + i);\r\n }\r\n\r\n var width, height, tmp;\r\n\r\n //the code below is literally copied verbatim from the bitstream spec\r\n tmp = (c[1] << 8) | c[0];\r\n width = tmp & 0x3FFF;\r\n tmp = (c[3] << 8) | c[2];\r\n height = tmp & 0x3FFF;\r\n return {\r\n width: width,\r\n height: height,\r\n data: VP8,\r\n riff: riff\r\n };\r\n }\r\n\r\n function getStrLength(string, offset) {\r\n return parseInt(string.substr(offset + 4, 4).split('').map(function(i) {\r\n var unpadded = i.charCodeAt(0).toString(2);\r\n return (new Array(8 - unpadded.length + 1)).join('0') + unpadded;\r\n }).join(''), 2);\r\n }\r\n\r\n function parseRIFF(string) {\r\n var offset = 0;\r\n var chunks = {};\r\n\r\n while (offset < string.length) {\r\n var id = string.substr(offset, 4);\r\n var len = getStrLength(string, offset);\r\n var data = string.substr(offset + 4 + 4, len);\r\n offset += 4 + 4 + len;\r\n chunks[id] = chunks[id] || [];\r\n\r\n if (id === 'RIFF' || id === 'LIST') {\r\n chunks[id].push(parseRIFF(data));\r\n } else {\r\n chunks[id].push(data);\r\n }\r\n }\r\n return chunks;\r\n }\r\n\r\n function doubleToString(num) {\r\n return [].slice.call(\r\n new Uint8Array((new Float64Array([num])).buffer), 0).map(function(e) {\r\n return String.fromCharCode(e);\r\n }).reverse().join('');\r\n }\r\n\r\n var webm = new ArrayToWebM(frames.map(function(frame) {\r\n var webp = parseWebP(parseRIFF(atob(frame.image.slice(23))));\r\n webp.duration = frame.duration;\r\n return webp;\r\n }));\r\n\r\n postMessage(webm);\r\n }\r\n\r\n /**\r\n * Encodes frames in WebM container. It uses WebWorkinvoke to invoke 'ArrayToWebM' method.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.compile(function(blob) {\r\n * // blob.size - blob.type\r\n * });\r\n */\r\n WhammyVideo.prototype.compile = function(callback) {\r\n var webWorker = processInWebWorker(whammyInWebWorker);\r\n\r\n webWorker.onmessage = function(event) {\r\n if (event.data.error) {\r\n console.error(event.data.error);\r\n return;\r\n }\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(this.frames);\r\n };\r\n\r\n return {\r\n /**\r\n * A more abstract-ish API.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * @param {?number} speed - 0.8\r\n * @param {?number} quality - 100\r\n */\r\n Video: WhammyVideo\r\n };\r\n})();\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Whammy = Whammy;\r\n}\n\r\n// ______________ (indexed-db)\r\n// DiskStorage.js\r\n\r\n/**\r\n * DiskStorage is a standalone object used by {@link RecordRTC} to store recorded blobs in IndexedDB storage.\r\n * @summary Writing blobs into IndexedDB.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n * // DiskStorage.dataStoreName = 'recordRTC';\r\n * // DiskStorage.onError = function(error) { };\r\n * @property {function} init - This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @property {function} Fetch - This method fetches stored blobs from IndexedDB.\r\n * @property {function} Store - This method stores blobs in IndexedDB.\r\n * @property {function} onError - This function is invoked for any known/unknown error.\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\n\r\nvar DiskStorage = {\r\n /**\r\n * This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.init();\r\n */\r\n init: function() {\r\n var self = this;\r\n\r\n if (typeof indexedDB === 'undefined' || typeof indexedDB.open === 'undefined') {\r\n console.error('IndexedDB API are not available in this browser.');\r\n return;\r\n }\r\n\r\n var dbVersion = 1;\r\n var dbName = this.dbName || location.href.replace(/\\/|:|#|%|\\.|\\[|\\]/g, ''),\r\n db;\r\n var request = indexedDB.open(dbName, dbVersion);\r\n\r\n function createObjectStore(dataBase) {\r\n dataBase.createObjectStore(self.dataStoreName);\r\n }\r\n\r\n function putInDB() {\r\n var transaction = db.transaction([self.dataStoreName], 'readwrite');\r\n\r\n if (self.videoBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.videoBlob, 'videoBlob');\r\n }\r\n\r\n if (self.gifBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.gifBlob, 'gifBlob');\r\n }\r\n\r\n if (self.audioBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.audioBlob, 'audioBlob');\r\n }\r\n\r\n function getFromStore(portionName) {\r\n transaction.objectStore(self.dataStoreName).get(portionName).onsuccess = function(event) {\r\n if (self.callback) {\r\n self.callback(event.target.result, portionName);\r\n }\r\n };\r\n }\r\n\r\n getFromStore('audioBlob');\r\n getFromStore('videoBlob');\r\n getFromStore('gifBlob');\r\n }\r\n\r\n request.onerror = self.onError;\r\n\r\n request.onsuccess = function() {\r\n db = request.result;\r\n db.onerror = self.onError;\r\n\r\n if (db.setVersion) {\r\n if (db.version !== dbVersion) {\r\n var setVersion = db.setVersion(dbVersion);\r\n setVersion.onsuccess = function() {\r\n createObjectStore(db);\r\n putInDB();\r\n };\r\n } else {\r\n putInDB();\r\n }\r\n } else {\r\n putInDB();\r\n }\r\n };\r\n request.onupgradeneeded = function(event) {\r\n createObjectStore(event.target.result);\r\n };\r\n },\r\n /**\r\n * This method fetches stored blobs from IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n */\r\n Fetch: function(callback) {\r\n this.callback = callback;\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This method stores blobs in IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n */\r\n Store: function(config) {\r\n this.audioBlob = config.audioBlob;\r\n this.videoBlob = config.videoBlob;\r\n this.gifBlob = config.gifBlob;\r\n\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This function is invoked for any known/unknown error.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.onError = function(error){\r\n * alerot( JSON.stringify(error) );\r\n * };\r\n */\r\n onError: function(error) {\r\n console.error(JSON.stringify(error, null, '\\t'));\r\n },\r\n\r\n /**\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.dataStoreName = 'recordRTC';\r\n */\r\n dataStoreName: 'recordRTC',\r\n dbName: null\r\n};\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.DiskStorage = DiskStorage;\r\n}\n\r\n// ______________\r\n// GifRecorder.js\r\n\r\n/**\r\n * GifRecorder is standalone calss used by {@link RecordRTC} to record video or canvas into animated gif.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GifRecorder\r\n * @class\r\n * @example\r\n * var recorder = new GifRecorder(mediaStream || canvas || context, { onGifPreview: function, onGifRecordingStarted: function, width: 1280, height: 720, frameRate: 200, quality: 10 });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object or HTMLCanvasElement or CanvasRenderingContext2D.\r\n * @param {object} config - {disableLogs:true, initCallback: function, width: 320, height: 240, frameRate: 200, quality: 10}\r\n */\r\n\r\nfunction GifRecorder(mediaStream, config) {\r\n if (typeof GIFEncoder === 'undefined') {\r\n var script = document.createElement('script');\r\n script.src = 'https://www.webrtc-experiment.com/gif-recorder.js';\r\n (document.body || document.documentElement).appendChild(script);\r\n }\r\n\r\n config = config || {};\r\n\r\n var isHTMLObject = mediaStream instanceof CanvasRenderingContext2D || mediaStream instanceof HTMLCanvasElement;\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (typeof GIFEncoder === 'undefined') {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isLoadedMetaData) {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isHTMLObject) {\r\n if (!config.width) {\r\n config.width = video.offsetWidth || 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = video.offsetHeight || 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n video.width = config.video.width || 320;\r\n video.height = config.video.height || 240;\r\n }\r\n\r\n // external library to record as GIF images\r\n gifEncoder = new GIFEncoder();\r\n\r\n // void setRepeat(int iter) \r\n // Sets the number of times the set of GIF frames should be played. \r\n // Default is 1; 0 means play indefinitely.\r\n gifEncoder.setRepeat(0);\r\n\r\n // void setFrameRate(Number fps) \r\n // Sets frame rate in frames per second. \r\n // Equivalent to setDelay(1000/fps).\r\n // Using \"setDelay\" instead of \"setFrameRate\"\r\n gifEncoder.setDelay(config.frameRate || 200);\r\n\r\n // void setQuality(int quality) \r\n // Sets quality of color quantization (conversion of images to the \r\n // maximum 256 colors allowed by the GIF specification). \r\n // Lower values (minimum = 1) produce better colors, \r\n // but slow processing significantly. 10 is the default, \r\n // and produces good color mapping at reasonable speeds. \r\n // Values greater than 20 do not yield significant improvements in speed.\r\n gifEncoder.setQuality(config.quality || 10);\r\n\r\n // Boolean start() \r\n // This writes the GIF Header and returns false if it fails.\r\n gifEncoder.start();\r\n\r\n if (typeof config.onGifRecordingStarted === 'function') {\r\n config.onGifRecordingStarted();\r\n }\r\n\r\n startTime = Date.now();\r\n\r\n function drawVideoFrame(time) {\r\n if (self.clearedRecordedData === true) {\r\n return;\r\n }\r\n\r\n if (isPausedRecording) {\r\n return setTimeout(function() {\r\n drawVideoFrame(time);\r\n }, 100);\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (typeof lastFrameTime === undefined) {\r\n lastFrameTime = time;\r\n }\r\n\r\n // ~10 fps\r\n if (time - lastFrameTime < 90) {\r\n return;\r\n }\r\n\r\n if (!isHTMLObject && video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n if (!isHTMLObject) {\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n if (config.onGifPreview) {\r\n config.onGifPreview(canvas.toDataURL('image/png'));\r\n }\r\n\r\n gifEncoder.addFrame(context);\r\n lastFrameTime = time;\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (lastAnimationFrame) {\r\n cancelAnimationFrame(lastAnimationFrame);\r\n }\r\n\r\n endTime = Date.now();\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = new Blob([new Uint8Array(gifEncoder.stream().bin)], {\r\n type: 'image/gif'\r\n });\r\n\r\n callback(this.blob);\r\n\r\n // bug: find a way to clear old recorded blobs\r\n gifEncoder.stream().bin = [];\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n self.clearedRecordedData = true;\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n if (gifEncoder) {\r\n gifEncoder.stream().bin = [];\r\n }\r\n }\r\n\r\n // for debugging\r\n this.name = 'GifRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n if (isHTMLObject) {\r\n if (mediaStream instanceof CanvasRenderingContext2D) {\r\n context = mediaStream;\r\n canvas = context.canvas;\r\n } else if (mediaStream instanceof HTMLCanvasElement) {\r\n context = mediaStream.getContext('2d');\r\n canvas = mediaStream;\r\n }\r\n }\r\n\r\n var isLoadedMetaData = true;\r\n\r\n if (!isHTMLObject) {\r\n var video = document.createElement('video');\r\n video.muted = true;\r\n video.autoplay = true;\r\n video.playsInline = true;\r\n\r\n isLoadedMetaData = false;\r\n video.onloadedmetadata = function() {\r\n isLoadedMetaData = true;\r\n };\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.play();\r\n }\r\n\r\n var lastAnimationFrame = null;\r\n var startTime, endTime, lastFrameTime;\r\n\r\n var gifEncoder;\r\n\r\n var self = this;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.GifRecorder = GifRecorder;\r\n}\n\r\n// Last time updated: 2019-06-21 4:09:42 AM UTC\r\n\r\n// ________________________\r\n// MultiStreamsMixer v1.2.2\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/MultiStreamsMixer\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\nfunction MultiStreamsMixer(arrayOfMediaStreams, elementClass) {\r\n\r\n var browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n (function(that) {\r\n if (typeof RecordRTC !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n })(typeof global !== 'undefined' ? global : null);\r\n\r\n // requires: chrome://flags/#enable-experimental-web-platform-features\r\n\r\n elementClass = elementClass || 'multi-streams-mixer';\r\n\r\n var videos = [];\r\n var isStopDrawingFrames = false;\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n canvas.style.opacity = 0;\r\n canvas.style.position = 'absolute';\r\n canvas.style.zIndex = -1;\r\n canvas.style.top = '-1000em';\r\n canvas.style.left = '-1000em';\r\n canvas.className = elementClass;\r\n (document.body || document.documentElement).appendChild(canvas);\r\n\r\n this.disableLogs = false;\r\n this.frameInterval = 10;\r\n\r\n this.width = 360;\r\n this.height = 240;\r\n\r\n // use gain node to prevent echo\r\n this.useGainNode = true;\r\n\r\n var self = this;\r\n\r\n // _____________________________\r\n // Cross-Browser-Declarations.js\r\n\r\n // WebAudio API representer\r\n var AudioContext = window.AudioContext;\r\n\r\n if (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n }\r\n\r\n /*jshint -W079 */\r\n var URL = window.URL;\r\n\r\n if (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n }\r\n\r\n if (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n }\r\n\r\n var MediaStream = window.MediaStream;\r\n\r\n if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n }\r\n\r\n /*global MediaStream:true */\r\n if (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n }\r\n\r\n var Storage = {};\r\n\r\n if (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n } else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n }\r\n\r\n function setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n }\r\n\r\n this.startDrawingFrames = function() {\r\n drawVideosToCanvas();\r\n };\r\n\r\n function drawVideosToCanvas() {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var videosLength = videos.length;\r\n\r\n var fullcanvas = false;\r\n var remaining = [];\r\n videos.forEach(function(video) {\r\n if (!video.stream) {\r\n video.stream = {};\r\n }\r\n\r\n if (video.stream.fullcanvas) {\r\n fullcanvas = video;\r\n } else {\r\n // todo: video.stream.active or video.stream.live to fix blank frames issues?\r\n remaining.push(video);\r\n }\r\n });\r\n\r\n if (fullcanvas) {\r\n canvas.width = fullcanvas.stream.width;\r\n canvas.height = fullcanvas.stream.height;\r\n } else if (remaining.length) {\r\n canvas.width = videosLength > 1 ? remaining[0].width * 2 : remaining[0].width;\r\n\r\n var height = 1;\r\n if (videosLength === 3 || videosLength === 4) {\r\n height = 2;\r\n }\r\n if (videosLength === 5 || videosLength === 6) {\r\n height = 3;\r\n }\r\n if (videosLength === 7 || videosLength === 8) {\r\n height = 4;\r\n }\r\n if (videosLength === 9 || videosLength === 10) {\r\n height = 5;\r\n }\r\n canvas.height = remaining[0].height * height;\r\n } else {\r\n canvas.width = self.width || 360;\r\n canvas.height = self.height || 240;\r\n }\r\n\r\n if (fullcanvas && fullcanvas instanceof HTMLVideoElement) {\r\n drawImage(fullcanvas);\r\n }\r\n\r\n remaining.forEach(function(video, idx) {\r\n drawImage(video, idx);\r\n });\r\n\r\n setTimeout(drawVideosToCanvas, self.frameInterval);\r\n }\r\n\r\n function drawImage(video, idx) {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var x = 0;\r\n var y = 0;\r\n var width = video.width;\r\n var height = video.height;\r\n\r\n if (idx === 1) {\r\n x = video.width;\r\n }\r\n\r\n if (idx === 2) {\r\n y = video.height;\r\n }\r\n\r\n if (idx === 3) {\r\n x = video.width;\r\n y = video.height;\r\n }\r\n\r\n if (idx === 4) {\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 5) {\r\n x = video.width;\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 6) {\r\n y = video.height * 3;\r\n }\r\n\r\n if (idx === 7) {\r\n x = video.width;\r\n y = video.height * 3;\r\n }\r\n\r\n if (typeof video.stream.left !== 'undefined') {\r\n x = video.stream.left;\r\n }\r\n\r\n if (typeof video.stream.top !== 'undefined') {\r\n y = video.stream.top;\r\n }\r\n\r\n if (typeof video.stream.width !== 'undefined') {\r\n width = video.stream.width;\r\n }\r\n\r\n if (typeof video.stream.height !== 'undefined') {\r\n height = video.stream.height;\r\n }\r\n\r\n context.drawImage(video, x, y, width, height);\r\n\r\n if (typeof video.stream.onRender === 'function') {\r\n video.stream.onRender(context, x, y, width, height, idx);\r\n }\r\n }\r\n\r\n function getMixedStream() {\r\n isStopDrawingFrames = false;\r\n var mixedVideoStream = getMixedVideoStream();\r\n\r\n var mixedAudioStream = getMixedAudioStream();\r\n if (mixedAudioStream) {\r\n mixedAudioStream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).forEach(function(track) {\r\n mixedVideoStream.addTrack(track);\r\n });\r\n }\r\n\r\n var fullcanvas;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (stream.fullcanvas) {\r\n fullcanvas = true;\r\n }\r\n });\r\n\r\n // mixedVideoStream.prototype.appendStreams = appendStreams;\r\n // mixedVideoStream.prototype.resetVideoStreams = resetVideoStreams;\r\n // mixedVideoStream.prototype.clearRecordedData = clearRecordedData;\r\n\r\n return mixedVideoStream;\r\n }\r\n\r\n function getMixedVideoStream() {\r\n resetVideoStreams();\r\n\r\n var capturedStream;\r\n\r\n if ('captureStream' in canvas) {\r\n capturedStream = canvas.captureStream();\r\n } else if ('mozCaptureStream' in canvas) {\r\n capturedStream = canvas.mozCaptureStream();\r\n } else if (!self.disableLogs) {\r\n console.error('Upgrade to latest Chrome or otherwise enable this flag: chrome://flags/#enable-experimental-web-platform-features');\r\n }\r\n\r\n var videoStream = new MediaStream();\r\n\r\n capturedStream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).forEach(function(track) {\r\n videoStream.addTrack(track);\r\n });\r\n\r\n canvas.stream = videoStream;\r\n\r\n return videoStream;\r\n }\r\n\r\n function getMixedAudioStream() {\r\n // via: @pehrsons\r\n if (!Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor = new Storage.AudioContext();\r\n }\r\n\r\n self.audioContext = Storage.AudioContextConstructor;\r\n\r\n self.audioSources = [];\r\n\r\n if (self.useGainNode === true) {\r\n self.gainNode = self.audioContext.createGain();\r\n self.gainNode.connect(self.audioContext.destination);\r\n self.gainNode.gain.value = 0; // don't hear self\r\n }\r\n\r\n var audioTracksLength = 0;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n return;\r\n }\r\n\r\n audioTracksLength++;\r\n\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n\r\n if (self.useGainNode === true) {\r\n audioSource.connect(self.gainNode);\r\n }\r\n\r\n self.audioSources.push(audioSource);\r\n });\r\n\r\n if (!audioTracksLength) {\r\n // because \"self.audioContext\" is not initialized\r\n // that's why we've to ignore rest of the code\r\n return;\r\n }\r\n\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n self.audioSources.forEach(function(audioSource) {\r\n audioSource.connect(self.audioDestination);\r\n });\r\n return self.audioDestination.stream;\r\n }\r\n\r\n function getVideo(stream) {\r\n var video = document.createElement('video');\r\n\r\n setSrcObject(stream, video);\r\n\r\n video.className = elementClass;\r\n\r\n video.muted = true;\r\n video.volume = 0;\r\n\r\n video.width = stream.width || self.width || 360;\r\n video.height = stream.height || self.height || 240;\r\n\r\n video.play();\r\n\r\n return video;\r\n }\r\n\r\n this.appendStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n streams.forEach(function(stream) {\r\n var newStream = new MediaStream();\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n\r\n newStream.addTrack(stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n })[0]);\r\n }\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n audioSource.connect(self.audioDestination);\r\n\r\n newStream.addTrack(self.audioDestination.stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n })[0]);\r\n }\r\n\r\n arrayOfMediaStreams.push(newStream);\r\n });\r\n };\r\n\r\n this.releaseStreams = function() {\r\n videos = [];\r\n isStopDrawingFrames = true;\r\n\r\n if (self.gainNode) {\r\n self.gainNode.disconnect();\r\n self.gainNode = null;\r\n }\r\n\r\n if (self.audioSources.length) {\r\n self.audioSources.forEach(function(source) {\r\n source.disconnect();\r\n });\r\n self.audioSources = [];\r\n }\r\n\r\n if (self.audioDestination) {\r\n self.audioDestination.disconnect();\r\n self.audioDestination = null;\r\n }\r\n\r\n if (self.audioContext) {\r\n self.audioContext.close();\r\n }\r\n\r\n self.audioContext = null;\r\n\r\n context.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (canvas.stream) {\r\n canvas.stream.stop();\r\n canvas.stream = null;\r\n }\r\n };\r\n\r\n this.resetVideoStreams = function(streams) {\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n resetVideoStreams(streams);\r\n };\r\n\r\n function resetVideoStreams(streams) {\r\n videos = [];\r\n streams = streams || arrayOfMediaStreams;\r\n\r\n // via: @adrian-ber\r\n streams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n return;\r\n }\r\n\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n });\r\n }\r\n\r\n // for debugging\r\n this.name = 'MultiStreamsMixer';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n this.getMixedStream = getMixedStream;\r\n\r\n}\r\n\r\nif (typeof RecordRTC === 'undefined') {\r\n if (true /* && !!module.exports*/ ) {\r\n module.exports = MultiStreamsMixer;\r\n }\r\n\r\n if (true) {\r\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\r\n return MultiStreamsMixer;\r\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n }\r\n}\n\r\n// ______________________\r\n// MultiStreamRecorder.js\r\n\r\n/*\r\n * Video conference recording, using captureStream API along with WebAudio and Canvas2D API.\r\n */\r\n\r\n/**\r\n * MultiStreamRecorder can record multiple videos in single container.\r\n * @summary Multi-videos recorder.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MultiStreamRecorder\r\n * @class\r\n * @example\r\n * var options = {\r\n * mimeType: 'video/webm'\r\n * }\r\n * var recorder = new MultiStreamRecorder(ArrayOfMediaStreams, options);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams.\r\n * @param {object} config - {disableLogs:true, frameInterval: 1, mimeType: \"video/webm\"}\r\n */\r\n\r\nfunction MultiStreamRecorder(arrayOfMediaStreams, options) {\r\n arrayOfMediaStreams = arrayOfMediaStreams || [];\r\n var self = this;\r\n\r\n var mixer;\r\n var mediaRecorder;\r\n\r\n options = options || {\r\n elementClass: 'multi-streams-mixer',\r\n mimeType: 'video/webm',\r\n video: {\r\n width: 360,\r\n height: 240\r\n }\r\n };\r\n\r\n if (!options.frameInterval) {\r\n options.frameInterval = 10;\r\n }\r\n\r\n if (!options.video) {\r\n options.video = {};\r\n }\r\n\r\n if (!options.video.width) {\r\n options.video.width = 360;\r\n }\r\n\r\n if (!options.video.height) {\r\n options.video.height = 240;\r\n }\r\n\r\n /**\r\n * This method records all MediaStreams.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // github/muaz-khan/MultiStreamsMixer\r\n mixer = new MultiStreamsMixer(arrayOfMediaStreams, options.elementClass || 'multi-streams-mixer');\r\n\r\n if (getAllVideoTracks().length) {\r\n mixer.frameInterval = options.frameInterval || 10;\r\n mixer.width = options.video.width || 360;\r\n mixer.height = options.video.height || 240;\r\n mixer.startDrawingFrames();\r\n }\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n\r\n // record using MediaRecorder API\r\n mediaRecorder = new MediaStreamRecorder(mixer.getMixedStream(), options);\r\n mediaRecorder.record();\r\n };\r\n\r\n function getAllVideoTracks() {\r\n var tracks = [];\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n getTracks(stream, 'video').forEach(function(track) {\r\n tracks.push(track);\r\n });\r\n });\r\n return tracks;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n mediaRecorder.stop(function(blob) {\r\n self.blob = blob;\r\n\r\n callback(blob);\r\n\r\n self.clearRecordedData();\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder = null;\r\n }\r\n\r\n if (mixer) {\r\n mixer.releaseStreams();\r\n mixer = null;\r\n }\r\n };\r\n\r\n /**\r\n * Add extra media-streams to existing recordings.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.addStreams([newAudioStream, newVideoStream]);\r\n */\r\n this.addStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n arrayOfMediaStreams.concat(streams);\r\n\r\n if (!mediaRecorder || !mixer) {\r\n return;\r\n }\r\n\r\n mixer.appendStreams(streams);\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n };\r\n\r\n /**\r\n * Reset videos during live recording. Replace old videos e.g. replace cameras with full-screen.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.resetVideoStreams([newVideo1, newVideo2]);\r\n */\r\n this.resetVideoStreams = function(streams) {\r\n if (!mixer) {\r\n return;\r\n }\r\n\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n mixer.resetVideoStreams(streams);\r\n };\r\n\r\n /**\r\n * Returns MultiStreamsMixer\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * let mixer = recorder.getMixer();\r\n * mixer.appendStreams([newStream]);\r\n */\r\n this.getMixer = function() {\r\n return mixer;\r\n };\r\n\r\n // for debugging\r\n this.name = 'MultiStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MultiStreamRecorder = MultiStreamRecorder;\r\n}\n\r\n// _____________________\r\n// RecordRTC.promises.js\r\n\r\n/**\r\n * RecordRTCPromisesHandler adds promises support in {@link RecordRTC}. Try a {@link https://github.com/muaz-khan/RecordRTC/blob/master/simple-demos/RecordRTCPromisesHandler.html|demo here}\r\n * @summary Promises for {@link RecordRTC}\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCPromisesHandler\r\n * @class\r\n * @example\r\n * var recorder = new RecordRTCPromisesHandler(mediaStream, options);\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n * // Note: You can access all RecordRTC API using \"recorder.recordRTC\" e.g. \r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n * recorder.recordRTC.setRecordingDuration(5000);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n * @throws Will throw an error if \"new\" keyword is not used to initiate \"RecordRTCPromisesHandler\". Also throws error if first argument \"MediaStream\" is missing.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction RecordRTCPromisesHandler(mediaStream, options) {\r\n if (!this) {\r\n throw 'Use \"new RecordRTCPromisesHandler()\"';\r\n }\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n var self = this;\r\n\r\n /**\r\n * @property {Blob} blob - Access/reach the native {@link RecordRTC} object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internal = recorder.recordRTC.getInternalRecorder();\r\n * alert(internal instanceof MediaStreamRecorder);\r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n */\r\n self.recordRTC = new RecordRTC(mediaStream, options);\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.startRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.startRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method stops the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * var blob = recorder.getBlob();\r\n * }).catch(errorCB);\r\n */\r\n this.stopRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.stopRecording(function(url) {\r\n self.blob = self.recordRTC.getBlob();\r\n\r\n if (!self.blob || !self.blob.size) {\r\n reject('Empty blob.', self.blob);\r\n return;\r\n }\r\n\r\n resolve(url);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.pauseRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.pauseRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.pauseRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.resumeRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.resumeRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.resumeRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns data-url for the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getDataURL().then(function(dataURL) {\r\n * window.open(dataURL);\r\n * }).catch(errorCB);;\r\n * }).catch(errorCB);\r\n */\r\n this.getDataURL = function(callback) {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.getDataURL(function(dataURL) {\r\n resolve(dataURL);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getBlob().then(function(blob) {})\r\n * }).catch(errorCB);\r\n */\r\n this.getBlob = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getBlob());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the internal recording object.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internalRecorder = await recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} \r\n */\r\n this.getInternalRecorder = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getInternalRecorder());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.reset();\r\n * recorder.startRecording(); // record again\r\n */\r\n this.reset = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.reset());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.destroy().then(successCB).catch(errorCB);\r\n */\r\n this.destroy = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.destroy());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let state = await recorder.getState();\r\n * // or\r\n * recorder.getState().then(state => { console.log(state); })\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getState());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.stopRecording();\r\n * let blob = recorder.getBlob(); // or \"recorder.recordRTC.blob\"\r\n * invokeSaveAsDialog(blob);\r\n */\r\n this.blob = null;\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTCPromisesHandler\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n this.version = '5.5.9';\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.RecordRTCPromisesHandler = RecordRTCPromisesHandler;\r\n}\n\r\n// ______________________\r\n// WebAssemblyRecorder.js\r\n\r\n/**\r\n * WebAssemblyRecorder lets you create webm videos in JavaScript via WebAssembly. The library consumes raw RGBA32 buffers (4 bytes per pixel) and turns them into a webm video with the given framerate and quality. This makes it compatible out-of-the-box with ImageData from a CANVAS. With realtime mode you can also use webm-wasm for streaming webm videos.\r\n * @summary Video recording feature in Chrome, Firefox and maybe Edge.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WebAssemblyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WebAssemblyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {webAssemblyPath:'webm-wasm.wasm',workerPath: 'webm-worker.js', frameRate: 30, width: 1920, height: 1080, bitrate: 1024}\r\n */\r\nfunction WebAssemblyRecorder(stream, config) {\r\n // based on: github.com/GoogleChromeLabs/webm-wasm\r\n\r\n if (typeof ReadableStream === 'undefined' || typeof WritableStream === 'undefined') {\r\n // because it fixes readable/writable streams issues\r\n console.error('Following polyfill is strongly recommended: https://unpkg.com/@mattiasbuelens/web-streams-polyfill/dist/polyfill.min.js');\r\n }\r\n\r\n config = config || {};\r\n\r\n config.width = config.width || 640;\r\n config.height = config.height || 480;\r\n config.frameRate = config.frameRate || 30;\r\n config.bitrate = config.bitrate || 1200;\r\n\r\n function createBufferURL(buffer, type) {\r\n return URL.createObjectURL(new Blob([buffer], {\r\n type: type || ''\r\n }));\r\n }\r\n\r\n function cameraStream() {\r\n return new ReadableStream({\r\n start: function(controller) {\r\n var cvs = document.createElement('canvas');\r\n var video = document.createElement('video');\r\n video.srcObject = stream;\r\n video.onplaying = function() {\r\n cvs.width = config.width;\r\n cvs.height = config.height;\r\n var ctx = cvs.getContext('2d');\r\n var frameTimeout = 1000 / config.frameRate;\r\n setTimeout(function f() {\r\n ctx.drawImage(video, 0, 0);\r\n controller.enqueue(\r\n ctx.getImageData(0, 0, config.width, config.height)\r\n );\r\n setTimeout(f, frameTimeout);\r\n }, frameTimeout);\r\n };\r\n video.play();\r\n }\r\n });\r\n }\r\n\r\n var worker;\r\n\r\n function startRecording(stream, buffer) {\r\n if (!config.workerPath && !buffer) {\r\n // is it safe to use @latest ?\r\n fetch(\r\n 'https://unpkg.com/webm-wasm@latest/dist/webm-worker.js'\r\n ).then(function(r) {\r\n r.arrayBuffer().then(function(buffer) {\r\n startRecording(stream, buffer);\r\n });\r\n });\r\n return;\r\n }\r\n\r\n if (!config.workerPath && buffer instanceof ArrayBuffer) {\r\n var blob = new Blob([buffer], {\r\n type: 'text/javascript'\r\n });\r\n config.workerPath = URL.createObjectURL(blob);\r\n }\r\n\r\n if (!config.workerPath) {\r\n console.error('workerPath parameter is missing.');\r\n }\r\n\r\n worker = new Worker(config.workerPath);\r\n\r\n worker.postMessage(config.webAssemblyPath || 'https://unpkg.com/webm-wasm@latest/dist/webm-wasm.wasm');\r\n worker.addEventListener('message', function(event) {\r\n if (event.data === 'READY') {\r\n worker.postMessage({\r\n width: config.width,\r\n height: config.height,\r\n bitrate: config.bitrate || 1200,\r\n timebaseDen: config.frameRate || 30,\r\n realtime: true\r\n });\r\n\r\n cameraStream().pipeTo(new WritableStream({\r\n write: function(image) {\r\n if (!worker) {\r\n return;\r\n }\r\n\r\n worker.postMessage(image.data.buffer, [image.data.buffer]);\r\n }\r\n }));\r\n } else if (!!event.data) {\r\n if (!isPaused) {\r\n arrayOfBuffers.push(event.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n startRecording(stream);\r\n\r\n if (typeof config.initCallback === 'function') {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n var isPaused;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPaused = false;\r\n };\r\n\r\n function terminate() {\r\n if (!worker) {\r\n return;\r\n }\r\n\r\n worker.postMessage(null);\r\n worker.terminate();\r\n worker = null;\r\n }\r\n\r\n var arrayOfBuffers = [];\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n terminate();\r\n\r\n this.blob = new Blob(arrayOfBuffers, {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(this.blob);\r\n };\r\n\r\n // for debugging\r\n this.name = 'WebAssemblyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n\r\n // todo: if recording-ON then STOP it first\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WebAssemblyRecorder = WebAssemblyRecorder;\r\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(18), __webpack_require__(19)))\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports) {\n\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\nfunction init(Survey, $) {\n $ = $ || window.$;\n\n var widget = {\n name: \"emotionsratings\",\n title: \"Emotions Ratings\",\n iconName: \"icon-emotionsratings\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.emotionsRating;\n },\n defaultJSON: {\n choices: [1, 2, 3, 4, 5],\n },\n isFit: function (question) {\n return question.getType() === \"emotionsratings\";\n },\n isDefaultRender: false,\n htmlTemplate: \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"emotionsratings\",\n [\n {\n name: \"hasOther\",\n visible: false,\n },\n {\n name: \"otherText\",\n visible: false,\n },\n {\n name: \"optionsCaption\",\n visible: false,\n },\n {\n name: \"otherErrorText\",\n visible: false,\n },\n {\n name: \"storeOthersAsComment\",\n visible: false,\n },\n {\n name: \"renderAs\",\n visible: false,\n },\n ],\n null,\n \"dropdown\"\n );\n Survey.JsonObject.metaData.addProperties(\"emotionsratings\", [\n {\n name: \"emotions:itemvalues\",\n category: \"emotions\",\n categoryIndex: 1,\n default: [\"angry\", \"disappointed\", \"meh\", \"happy\", \"inLove\"],\n },\n {\n name: \"emotionSize:number\",\n category: \"emotions\",\n default: 30,\n },\n {\n name: \"emotionsCount:number\",\n category: \"emotions\",\n default: 5,\n },\n {\n name: \"bgEmotion\",\n category: \"emotions\",\n default: \"happy\",\n },\n {\n name: \"emotionColor\",\n category: \"emotions\",\n default: \"#FF0066\",\n },\n ]);\n },\n afterRender: function (question, el) {\n var emotions = (question.emotions || []).map(function (item) {\n return item.value;\n });\n if (emotions.length === 0) {\n emotions = [\"angry\", \"disappointed\", \"meh\", \"happy\", \"inLove\"];\n }\n var options = {\n emotionSize: question.emotionSize,\n bgEmotion: question.bgEmotion,\n emotions: emotions,\n initialRating: question.value,\n color: question.emotionColor,\n count: question.emotionsCount,\n onUpdate: function (value) {\n question.value = value;\n },\n };\n initWidget();\n\n question.valueChangedCallback = initWidget;\n question.readOnlyChangedCallback = initWidget;\n\n function initWidget() {\n el.innerHTML = \"
\";\n $(el).off();\n options.initialRating = question.value || 0;\n options.disabled = question.isReadOnly;\n $(el).find(\"div\").emotionsRating(options);\n }\n },\n willUnmount: function (question, el) {\n el.innerHTML = null;\n $(el).off();\n question.readOnlyChangedCallback = null;\n question.valueChangedCallback = null;\n },\n pdfQuestionType: \"dropdown\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (init);\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__icheck_js__ = __webpack_require__(0);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"icheck\", function() { return __WEBPACK_IMPORTED_MODULE_0__icheck_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__select2_js__ = __webpack_require__(1);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"select2\", function() { return __WEBPACK_IMPORTED_MODULE_1__select2_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__inputmask_js__ = __webpack_require__(2);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"inputmask\", function() { return __WEBPACK_IMPORTED_MODULE_2__inputmask_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jquery_bar_rating_js__ = __webpack_require__(4);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"jquerybarrating\", function() { return __WEBPACK_IMPORTED_MODULE_3__jquery_bar_rating_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jquery_ui_datepicker_js__ = __webpack_require__(5);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"jqueryuidatepicker\", function() { return __WEBPACK_IMPORTED_MODULE_4__jquery_ui_datepicker_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__nouislider_js__ = __webpack_require__(6);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"nouislider\", function() { return __WEBPACK_IMPORTED_MODULE_5__nouislider_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__select2_tagbox_js__ = __webpack_require__(8);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"select2tagbox\", function() { return __WEBPACK_IMPORTED_MODULE_6__select2_tagbox_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__sortablejs_js__ = __webpack_require__(9);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"sortablejs\", function() { return __WEBPACK_IMPORTED_MODULE_7__sortablejs_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__ck_editor_js__ = __webpack_require__(11);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"ckeditor\", function() { return __WEBPACK_IMPORTED_MODULE_8__ck_editor_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__easy_autocomplete_js__ = __webpack_require__(12);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"autocomplete\", function() { return __WEBPACK_IMPORTED_MODULE_9__easy_autocomplete_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__pretty_checkbox_js__ = __webpack_require__(13);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"prettycheckbox\", function() { return __WEBPACK_IMPORTED_MODULE_10__pretty_checkbox_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__bootstrap_slider_js__ = __webpack_require__(14);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"bootstrapslider\", function() { return __WEBPACK_IMPORTED_MODULE_11__bootstrap_slider_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__microphone_js__ = __webpack_require__(16);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"microphone\", function() { return __WEBPACK_IMPORTED_MODULE_12__microphone_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__emotionsratings_js__ = __webpack_require__(20);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"emotionsratings\", function() { return __WEBPACK_IMPORTED_MODULE_13__emotionsratings_js__[\"default\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__bootstrapdatepicker_js__ = __webpack_require__(22);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"bootstrapdatepicker\", function() { return __WEBPACK_IMPORTED_MODULE_14__bootstrapdatepicker_js__[\"a\"]; });\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/***/ }),\n/* 22 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nfunction init(Survey, $) {\n $ = $ || window.$;\n\n if (\n !!$ &&\n !$.fn.bootstrapDP &&\n !!$.fn.datepicker &&\n !!$.fn.datepicker.noConflict\n ) {\n $.fn.bootstrapDP = $.fn.datepicker.noConflict();\n if (!$.fn.datepicker) {\n $.fn.datepicker = $.fn.bootstrapDP;\n }\n }\n var widget = {\n name: \"bootstrapdatepicker\",\n title: \"Date picker\",\n iconName: \"icon-datepicker\",\n widgetIsLoaded: function () {\n return !!$ && !!$.fn.bootstrapDP;\n },\n isFit: function (question) {\n return question.getType() === \"bootstrapdatepicker\";\n },\n htmlTemplate:\n \"\",\n activatedByChanged: function (activatedBy) {\n Survey.JsonObject.metaData.addClass(\n \"bootstrapdatepicker\",\n [\n { name: \"inputType\", visible: false },\n { name: \"inputFormat\", visible: false },\n { name: \"inputMask\", visible: false },\n ],\n null,\n \"text\"\n );\n Survey.JsonObject.metaData.addProperties(\"bootstrapdatepicker\", [\n {\n // Can take a string or an Object.\n // https://bootstrap-datepicker.readthedocs.io/en/latest/options.html#format\n name: \"dateFormat\",\n category: \"general\",\n default: \"mm/dd/yyyy\",\n },\n {\n // Can take a Date or a string\n // https://bootstrap-datepicker.readthedocs.io/en/latest/options.html#options\n name: \"startDate\",\n category: \"general\",\n default: \"\",\n },\n {\n // Can take a Date or a string\n // https://bootstrap-datepicker.readthedocs.io/en/latest/options.html#options\n name: \"endDate\",\n category: \"general\",\n default: \"\",\n },\n {\n name: \"todayHighlight:boolean\",\n category: \"general\",\n default: true,\n },\n {\n name: \"weekStart:number\",\n category: \"general\",\n default: 0,\n },\n {\n name: \"clearBtn:boolean\",\n category: \"general\",\n default: false,\n },\n {\n name: \"autoClose:boolean\",\n category: \"general\",\n default: true,\n },\n {\n name: \"daysOfWeekHighlighted:string\",\n category: \"general\",\n default: \"\",\n },\n {\n name: \"disableTouchKeyboard:boolean\",\n category: \"general\",\n default: true,\n },\n ]);\n },\n afterRender: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n\n var pickerWidget = $el\n .bootstrapDP({\n enableOnReadonly: false,\n format: question.dateFormat,\n startDate: !!question.startDate\n ? question.startDate\n : question.renderedMin,\n endDate: !!question.endDate ? question.endDate : question.renderedMax,\n todayHighlight: question.todayHighlight,\n weekStart: question.weekStart,\n clearBtn: question.clearBtn,\n autoclose: question.autoClose,\n daysOfWeekHighlighted: question.daysOfWeekHighlighted,\n disableTouchKeyboard: question.disableTouchKeyboard,\n })\n .on(\"change\", function (e) {\n var newDate = pickerWidget.bootstrapDP(\"getUTCDate\");\n var newValue = newDate && newDate.toUTCString();\n if (question.value != newValue) {\n question.value = newValue;\n }\n });\n\n question.valueChangedCallback = function () {\n pickerWidget.bootstrapDP(\n \"setUTCDate\",\n !!question.value ? new Date(question.value) : \"\"\n );\n };\n question.valueChangedCallback();\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n $el.prop(\"readonly\", true);\n } else {\n $el.removeAttr(\"readonly\");\n }\n };\n question.readOnlyChangedCallback();\n },\n willUnmount: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n $el.bootstrapDP(\"destroy\");\n question.readOnlyChangedCallback = undefined;\n question.valueChangedCallback = undefined;\n },\n pdfQuestionType: \"text\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (init);\n\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBjYmVhYjMyM2U0M2E3MDUzMDI5NSIsIndlYnBhY2s6Ly8vLi9zcmMvaWNoZWNrLmpzIiwid2VicGFjazovLy8uL3NyYy9zZWxlY3QyLmpzIiwid2VicGFjazovLy8uL3NyYy9pbnB1dG1hc2suanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIklucHV0bWFza1wiLFwiY29tbW9uanMyXCI6XCJpbnB1dG1hc2tcIixcImNvbW1vbmpzXCI6XCJpbnB1dG1hc2tcIixcImFtZFwiOlwiaW5wdXRtYXNrXCJ9Iiwid2VicGFjazovLy8uL3NyYy9qcXVlcnktYmFyLXJhdGluZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvanF1ZXJ5LXVpLWRhdGVwaWNrZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL25vdWlzbGlkZXIuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIm5vVWlTbGlkZXJcIixcImNvbW1vbmpzMlwiOlwibm91aXNsaWRlclwiLFwiY29tbW9uanNcIjpcIm5vdWlzbGlkZXJcIixcImFtZFwiOlwibm91aXNsaWRlclwifSIsIndlYnBhY2s6Ly8vLi9zcmMvc2VsZWN0Mi10YWdib3guanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NvcnRhYmxlanMuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIlNvcnRhYmxlXCIsXCJjb21tb25qczJcIjpcInNvcnRhYmxlanNcIixcImNvbW1vbmpzXCI6XCJzb3J0YWJsZWpzXCIsXCJhbWRcIjpcInNvcnRhYmxlanNcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL2NrLWVkaXRvci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvZWFzeS1hdXRvY29tcGxldGUuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3ByZXR0eS1jaGVja2JveC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYm9vdHN0cmFwLXNsaWRlci5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiU2xpZGVyXCIsXCJjb21tb25qczJcIjpcImJvb3RzdHJhcC1zbGlkZXJcIixcImNvbW1vbmpzXCI6XCJib290c3RyYXAtc2xpZGVyXCIsXCJhbWRcIjpcImJvb3RzdHJhcC1zbGlkZXJcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL21pY3JvcGhvbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlY29yZHJ0Yy9SZWNvcmRSVEMuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL3NyYy9lbW90aW9uc3JhdGluZ3MuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleWpzLXdpZGdldHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Jvb3RzdHJhcGRhdGVwaWNrZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87UUNWQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7O1FBRUE7UUFDQTs7Ozs7Ozs7QUM3REE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSx1QkFBdUIsZ0JBQWdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRWUsbUVBQUksRUFBQzs7Ozs7Ozs7QUM1S3BCO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSx1QkFBdUIsbUJBQW1CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVlLG1FQUFJLEVBQUM7Ozs7Ozs7O0FDdk1wQjtBQUFBO0FBQUE7QUFBa0M7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaURBQVM7QUFDN0IsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFNBQVMsMkNBQTJDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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MkM7QUFDdEQsV0FBVywrQ0FBK0M7QUFDMUQsV0FBVywwQ0FBMEM7QUFDckQsV0FBVyxvQ0FBb0M7QUFDL0MsV0FBVyx3Q0FBd0M7QUFDbkQsV0FBVyxtQ0FBbUM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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QUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRWUsbUVBQUksRUFBQzs7Ozs7Ozs7QUNqR3BCO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFZSxtRUFBSSxFQUFDOzs7Ozs7OztBQ3hIcEI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwyQ0FBMkM7QUFDN0QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwyQ0FBMkM7QUFDN0QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVywyQ0FBMkM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZLHNEQUFzRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFZSxtRUFBSSxFQUFDOzs7Ozs7OztBQzFNcEI7QUFBQSxhQUFhLG1CQUFPLENBQUMsRUFBa0I7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFD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Q0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUE7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLHVDQUF1QztBQUN2Qyx3Q0FBd0M7QUFDeEMsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEZBQTRGO0FBQzVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxh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O0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVTs7Ozs7Ozs7QUN2THRDO0FBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFZSxtRUFBSSxFQUFDOzs7Ozs7OztBQzlIcEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBZ0Q7QUFDRTtBQUNJO0FBQ2M7QUFDTTtBQUNsQjtBQUNPO0FBQ1A7QUFDSDtBQUNZO0FBQ0E7QUFDRTtBQUNYO0FBQ1U7QUFDUTs7Ozs7Ozs7QUNkMUU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxvRkFBb0Y7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9DQUFvQztBQUMvQyxXQUFXLHNDQUFzQztBQUNqRCxXQUFXLG9DQUFvQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRWUsNkRBQUksRUFBQyIsImZpbGUiOiJzdXJ2ZXlqcy13aWRnZXRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiaW5wdXRtYXNrXCIpLCByZXF1aXJlKFwibm91aXNsaWRlclwiKSwgcmVxdWlyZShcInNvcnRhYmxlanNcIiksIHJlcXVpcmUoXCJib290c3RyYXAtc2xpZGVyXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwic3VydmV5anMtd2lkZ2V0c1wiLCBbXCJpbnB1dG1hc2tcIiwgXCJub3Vpc2xpZGVyXCIsIFwic29ydGFibGVqc1wiLCBcImJvb3RzdHJhcC1zbGlkZXJcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic3VydmV5anMtd2lkZ2V0c1wiXSA9IGZhY3RvcnkocmVxdWlyZShcImlucHV0bWFza1wiKSwgcmVxdWlyZShcIm5vdWlzbGlkZXJcIiksIHJlcXVpcmUoXCJzb3J0YWJsZWpzXCIpLCByZXF1aXJlKFwiYm9vdHN0cmFwLXNsaWRlclwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wic3VydmV5anMtd2lkZ2V0c1wiXSA9IGZhY3Rvcnkocm9vdFtcIklucHV0bWFza1wiXSwgcm9vdFtcIm5vVWlTbGlkZXJcIl0sIHJvb3RbXCJTb3J0YWJsZVwiXSwgcm9vdFtcIlNsaWRlclwiXSk7XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8zX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfN19fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzEwX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMTVfXykge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAyMSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgY2JlYWIzMjNlNDNhNzA1MzAyOTUiLCJmdW5jdGlvbiBlc2NWYWx1ZSh2YWwpIHtcbiAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gKHZhbCB8fCBcIlwiKS5yZXBsYWNlKC8oWyddKS9nLCBcIlxcXFwkMVwiKTtcbiAgfVxuICByZXR1cm4gdmFsO1xufVxuXG5mdW5jdGlvbiBpbml0KFN1cnZleSwgJCkge1xuICAkID0gJCB8fCB3aW5kb3cuJDtcbiAgdmFyIHdpZGdldCA9IHtcbiAgICBjbGFzc05hbWU6IFwiaXJhZGlvX3NxdWFyZS1ibHVlXCIsXG4gICAgY2hlY2tib3hDbGFzczogXCJpcmFkaW9fc3F1YXJlLWJsdWVcIixcbiAgICByYWRpb0NsYXNzOiBcImlyYWRpb19zcXVhcmUtYmx1ZVwiLFxuICAgIG5hbWU6IFwiaWNoZWNrXCIsXG4gICAgd2lkZ2V0SXNMb2FkZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgJCA9PSBcImZ1bmN0aW9uXCIgJiYgISEkLmZuLmlDaGVjaztcbiAgICB9LFxuICAgIGlzRml0OiBmdW5jdGlvbiAocXVlc3Rpb24pIHtcbiAgICAgIHZhciB0ID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgICAgcmV0dXJuIHQgPT09IFwicmFkaW9ncm91cFwiIHx8IHQgPT09IFwiY2hlY2tib3hcIiB8fCB0ID09PSBcIm1hdHJpeFwiO1xuICAgIH0sXG4gICAgaXNEZWZhdWx0UmVuZGVyOiB0cnVlLFxuICAgIGFmdGVyUmVuZGVyOiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgcm9vdFdpZGdldCA9IHRoaXM7XG4gICAgICB2YXIgJGVsID0gJChlbCk7XG5cbiAgICAgICRlbC5maW5kKFwiLnN2LWl0ZW1fX2RlY29yYXRvclwiKS5oaWRlKCk7XG5cbiAgICAgICRlbC5maW5kKFwiaW5wdXRcIikuZGF0YSh7XG4gICAgICAgIGlDaGVjazogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBmdW5jdGlvbiBnZXRJbmRleEJ5VmFsdWUoYXJyLCB2YWx1ZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIC0xO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChhcnJbaV0gPT0gdmFsdWUpIHJldHVybiBpO1xuICAgICAgICAgIGlmICghIWFycltpXSAmJiBhcnJbaV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IHZhbHVlKSByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgZnJvemVVcGRhdGluZyA9IGZhbHNlO1xuICAgICAgdmFyIG1ha2VDaG9pY2VzSUNoZWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5wdXRzID0gJGVsLmZpbmQoXCJpbnB1dFwiKTtcbiAgICAgICAgaW5wdXRzLmlDaGVjayh7XG4gICAgICAgICAgY2hlY2tib3hDbGFzczpcbiAgICAgICAgICAgIHF1ZXN0aW9uLmNoZWNrYm94Q2xhc3MgfHxcbiAgICAgICAgICAgIHJvb3RXaWRnZXQuY2hlY2tib3hDbGFzcyB8fFxuICAgICAgICAgICAgcm9vdFdpZGdldC5jbGFzc05hbWUsXG4gICAgICAgICAgcmFkaW9DbGFzczpcbiAgICAgICAgICAgIHF1ZXN0aW9uLnJhZGlvQ2xhc3MgfHxcbiAgICAgICAgICAgIHJvb3RXaWRnZXQucmFkaW9DbGFzcyB8fFxuICAgICAgICAgICAgcm9vdFdpZGdldC5jbGFzc05hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpbnB1dHMub24oXCJpZkNoZWNrZWRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKGZyb3plVXBkYXRpbmcpIHJldHVybjtcbiAgICAgICAgICBpZiAocXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcIm1hdHJpeFwiKSB7XG4gICAgICAgICAgICBxdWVzdGlvbi5nZW5lcmF0ZWRWaXNpYmxlUm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGluZGV4LCByb3dzKSB7XG4gICAgICAgICAgICAgIGlmIChyb3cuZnVsbE5hbWUgPT09IGV2ZW50LnRhcmdldC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgcm93LnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBxdWVzdGlvbi52YWx1ZSB8fCBbXTtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlWYWx1ZShvbGRWYWx1ZSwgZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgcXVlc3Rpb24udmFsdWUgPSBvbGRWYWx1ZS5jb25jYXQoW2V2ZW50LnRhcmdldC52YWx1ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlucHV0cy5vbihcImlmVW5jaGVja2VkXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGlmIChmcm96ZVVwZGF0aW5nKSByZXR1cm47XG4gICAgICAgICAgaWYgKHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSAocXVlc3Rpb24udmFsdWUgfHwgW10pLnNsaWNlKCk7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5VmFsdWUob2xkVmFsdWUsIGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBvbGRWYWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IG9sZFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gdW5jaGVja0ljaGVjayhjRWwpIHtcbiAgICAgICAgY0VsLmlDaGVjayhcInVuY2hlY2tcIik7XG4gICAgICAgIGNFbFswXS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJjaGVja2VkXCIpO1xuICAgICAgfVxuICAgICAgdmFyIHNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnJvemVVcGRhdGluZyA9IHRydWU7XG4gICAgICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgIT09IFwibWF0cml4XCIpIHtcbiAgICAgICAgICB2YXIgdmFsdWVzID0gcXVlc3Rpb24udmFsdWU7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVlc3Rpb24uZ2V0VHlwZSgpID09IFwiY2hlY2tib3hcIikge1xuICAgICAgICAgICAgdmFyIHFWYWx1ZSA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgICAgICAgICAgcXVlc3Rpb24udmlzaWJsZUNob2ljZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICB2YXIgaW5FbCA9ICRlbC5maW5kKFxuICAgICAgICAgICAgICAgIFwiaW5wdXRbdmFsdWU9J1wiICsgZXNjVmFsdWUoaXRlbS52YWx1ZSkgKyBcIiddXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKCFpbkVsKSByZXR1cm47XG4gICAgICAgICAgICAgIHZhciBpc0NoZWNrZWQgPSBnZXRJbmRleEJ5VmFsdWUocVZhbHVlLCBpdGVtLnZhbHVlKSA+IC0xO1xuICAgICAgICAgICAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgaW5FbC5pQ2hlY2soXCJjaGVja1wiKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgY0VsID0gaW5FbFswXTtcbiAgICAgICAgICAgICAgICB2YXIgd2FzQ2hlY2tlZCA9ICEhY0VsW1wiY2hlY2tlZFwiXTtcbiAgICAgICAgICAgICAgICBpZiAod2FzQ2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgaW5FbC5yZW1vdmVBdHRyKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgICAgICAgIGlmICghaW5FbC5wYXJlbnQoKS5oYXNDbGFzcyhcImNoZWNrZWRcIikpXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgIHVuY2hlY2tJY2hlY2soaW5FbCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgZWxzZSB1bmNoZWNrSWNoZWNrKGluRWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAkZWxcbiAgICAgICAgICAgICAgICAuZmluZChcImlucHV0W3ZhbHVlPSdcIiArIGVzY1ZhbHVlKHZhbHVlKSArIFwiJ11cIilcbiAgICAgICAgICAgICAgICAuaUNoZWNrKFwiY2hlY2tcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcXVlc3Rpb24uZ2VuZXJhdGVkVmlzaWJsZVJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93LCBpbmRleCwgcm93cykge1xuICAgICAgICAgICAgaWYgKHJvdy52YWx1ZSkge1xuICAgICAgICAgICAgICAkKGVsKVxuICAgICAgICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgICAgICAgXCJpbnB1dFtuYW1lPSdcIiArXG4gICAgICAgICAgICAgICAgICAgIHJvdy5mdWxsTmFtZSArXG4gICAgICAgICAgICAgICAgICAgIFwiJ11bdmFsdWU9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgZXNjVmFsdWUocm93LnZhbHVlKSArXG4gICAgICAgICAgICAgICAgICAgIFwiJ11cIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuaUNoZWNrKFwiY2hlY2tcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnJvemVVcGRhdGluZyA9IGZhbHNlO1xuICAgICAgfTtcbiAgICAgIG1ha2VDaG9pY2VzSUNoZWNrKCk7XG5cbiAgICAgIHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBtYWtlQ2hvaWNlc0lDaGVjaygpO1xuICAgICAgICAkZWwuZmluZChcIi5zdi1pdGVtX19kZWNvcmF0b3JcIikuaGlkZSgpO1xuICAgICAgfTtcbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gc2VsZWN0O1xuICAgICAgc2VsZWN0KCk7XG4gICAgfSxcbiAgICB3aWxsVW5tb3VudDogZnVuY3Rpb24gKHF1ZXN0aW9uLCBlbCkge1xuICAgICAgdmFyICRlbCA9ICQoZWwpO1xuICAgICAgJGVsLmZpbmQoXCJpbnB1dFwiKS5pQ2hlY2soXCJkZXN0cm95XCIpO1xuICAgICAgcXVlc3Rpb24udmlzaWJsZUNob2ljZXNDaGFuZ2VkQ2FsbGJhY2sgPSBudWxsO1xuICAgIH0sXG4gIH07XG5cbiAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydHkoXCJyYWRpb2dyb3VwXCIsIHtcbiAgICBuYW1lOiBcInJhZGlvQ2xhc3NcIixcbiAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gIH0pO1xuICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0eShcImNoZWNrYm94XCIsIHtcbiAgICBuYW1lOiBcImNoZWNrYm94Q2xhc3NcIixcbiAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gIH0pO1xuICBTdXJ2ZXkuQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbi5JbnN0YW5jZS5hZGRDdXN0b21XaWRnZXQod2lkZ2V0LCBcInR5cGVcIik7XG59XG5cbmlmICh0eXBlb2YgU3VydmV5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIGluaXQoU3VydmV5LCB3aW5kb3cuJCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9pY2hlY2suanNcbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDExIiwiZnVuY3Rpb24gaW5pdChTdXJ2ZXksICQpIHtcbiAgJCA9ICQgfHwgd2luZG93LiQ7XG4gIHZhciB3aWRnZXQgPSB7XG4gICAgYWN0aXZhdGVkQnk6IFwicHJvcGVydHlcIixcbiAgICBuYW1lOiBcInNlbGVjdDJcIixcbiAgICB3aWRnZXRJc0xvYWRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiAkID09IFwiZnVuY3Rpb25cIiAmJiAhISQuZm4uc2VsZWN0MjtcbiAgICB9LFxuICAgIGlzRml0OiBmdW5jdGlvbiAocXVlc3Rpb24pIHtcbiAgICAgIGlmICh3aWRnZXQuYWN0aXZhdGVkQnkgPT0gXCJwcm9wZXJ0eVwiKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHF1ZXN0aW9uW1wicmVuZGVyQXNcIl0gPT09IFwic2VsZWN0MlwiICYmXG4gICAgICAgICAgcXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcImRyb3Bkb3duXCJcbiAgICAgICAgKTtcbiAgICAgIGlmICh3aWRnZXQuYWN0aXZhdGVkQnkgPT0gXCJ0eXBlXCIpXG4gICAgICAgIHJldHVybiBxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwiZHJvcGRvd25cIjtcbiAgICAgIGlmICh3aWRnZXQuYWN0aXZhdGVkQnkgPT0gXCJjdXN0b210eXBlXCIpXG4gICAgICAgIHJldHVybiBxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwic2VsZWN0MlwiO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgYWN0aXZhdGVkQnlDaGFuZ2VkOiBmdW5jdGlvbiAoYWN0aXZhdGVkQnkpIHtcbiAgICAgIGlmICghdGhpcy53aWRnZXRJc0xvYWRlZCgpKSByZXR1cm47XG4gICAgICB3aWRnZXQuYWN0aXZhdGVkQnkgPSBhY3RpdmF0ZWRCeTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLnJlbW92ZVByb3BlcnR5KFwiZHJvcGRvd25cIiwgXCJyZW5kZXJBc1wiKTtcbiAgICAgIGlmIChhY3RpdmF0ZWRCeSA9PSBcInByb3BlcnR5XCIpIHtcbiAgICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydHkoXCJkcm9wZG93blwiLCB7XG4gICAgICAgICAgbmFtZTogXCJyZW5kZXJBc1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgICAgICBjaG9pY2VzOiBbXCJzZWxlY3QyXCIsIFwiZGVmYXVsdFwiXSxcbiAgICAgICAgfSk7XG4gICAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwiZHJvcGRvd25cIiwge1xuICAgICAgICAgIGRlcGVuZHNPbjogXCJyZW5kZXJBc1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgICBuYW1lOiBcInNlbGVjdDJDb25maWdcIixcbiAgICAgICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBvYmoucmVuZGVyQXMgPT0gXCJzZWxlY3QyXCI7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYWN0aXZhdGVkQnkgPT0gXCJjdXN0b210eXBlXCIpIHtcbiAgICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJzZWxlY3QyXCIsIFtdLCBudWxsLCBcImRyb3Bkb3duXCIpO1xuICAgICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0eShcInNlbGVjdDJcIiwge1xuICAgICAgICAgIG5hbWU6IFwic2VsZWN0MkNvbmZpZ1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGh0bWxUZW1wbGF0ZTpcbiAgICAgIFwiPGRpdj48c2VsZWN0IHN0eWxlPSd3aWR0aDogMTAwJTsnPjwvc2VsZWN0Pjx0ZXh0YXJlYT48L3RleHRhcmVhPjwvZGl2PlwiLFxuICAgIGFmdGVyUmVuZGVyOiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgc2VsZWN0MkNvbmZpZyA9IHF1ZXN0aW9uLnNlbGVjdDJDb25maWc7XG4gICAgICB2YXIgc2V0dGluZ3MgPVxuICAgICAgICBzZWxlY3QyQ29uZmlnICYmIHR5cGVvZiBzZWxlY3QyQ29uZmlnID09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IEpTT04ucGFyc2Uoc2VsZWN0MkNvbmZpZylcbiAgICAgICAgICA6IHNlbGVjdDJDb25maWc7XG4gICAgICBpZiAoIXNldHRpbmdzKSBzZXR0aW5ncyA9IHt9O1xuICAgICAgdmFyICRlbCA9ICQoZWwpLmlzKFwic2VsZWN0XCIpID8gJChlbCkgOiAkKGVsKS5maW5kKFwic2VsZWN0XCIpO1xuICAgICAgdmFyICRvdGhlckVsZW1lbnQgPSAkKGVsKS5maW5kKFwidGV4dGFyZWFcIik7XG4gICAgICAkb3RoZXJFbGVtZW50LmFkZENsYXNzKHF1ZXN0aW9uLmNzc0NsYXNzZXMub3RoZXIpO1xuICAgICAgJG90aGVyRWxlbWVudC5iaW5kKFwiaW5wdXQgcHJvcGVydHljaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNTZXR0aW5nVmFsdWUpIHJldHVybjtcbiAgICAgICAgcXVlc3Rpb24uY29tbWVudCA9ICRvdGhlckVsZW1lbnQudmFsKCk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIHVwZGF0ZUNvbW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRvdGhlckVsZW1lbnQudmFsKHF1ZXN0aW9uLmNvbW1lbnQpO1xuICAgICAgICBpZiAocXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkKSB7XG4gICAgICAgICAgJG90aGVyRWxlbWVudC5zaG93KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJG90aGVyRWxlbWVudC5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgaXNTZXR0aW5nVmFsdWUgPSBmYWxzZTtcbiAgICAgIHZhciB1cGRhdGVWYWx1ZUhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc1NldHRpbmdWYWx1ZSkgcmV0dXJuO1xuICAgICAgICBpc1NldHRpbmdWYWx1ZSA9IHRydWU7XG4gICAgICAgIGlmICgkZWwuZmluZCgnb3B0aW9uW3ZhbHVlPVwiJyArIChxdWVzdGlvbi52YWx1ZSB8fCBcIlwiKSArICdcIl0nKS5sZW5ndGgpIHtcbiAgICAgICAgICAkZWwudmFsKHF1ZXN0aW9uLnZhbHVlKS50cmlnZ2VyKFwiY2hhbmdlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHF1ZXN0aW9uLnZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICBxdWVzdGlvbi52YWx1ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhcXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB2YXIgbmV3T3B0aW9uID0gbmV3IE9wdGlvbihcbiAgICAgICAgICAgICAgcXVlc3Rpb24udmFsdWUsIC8vVE9ETyBpZiBxdWVzdGlvbiB2YWx1ZSBpcyBvYmplY3QgdGhlbiBuZWVkIHRvIGltcHJvdmVcbiAgICAgICAgICAgICAgcXVlc3Rpb24udmFsdWUsXG4gICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkZWwuYXBwZW5kKG5ld09wdGlvbikudHJpZ2dlcihcImNoYW5nZVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlQ29tbWVudCgpO1xuICAgICAgICBpc1NldHRpbmdWYWx1ZSA9IGZhbHNlO1xuICAgICAgfTtcbiAgICAgIHZhciB1cGRhdGVDaG9pY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkZWwuc2VsZWN0MigpLmVtcHR5KCk7XG4gICAgICAgIGlmICghc2V0dGluZ3MucGxhY2Vob2xkZXIgJiYgcXVlc3Rpb24uc2hvd09wdGlvbnNDYXB0aW9uKSB7XG4gICAgICAgICAgc2V0dGluZ3MucGxhY2Vob2xkZXIgPSBxdWVzdGlvbi5vcHRpb25zQ2FwdGlvbjtcbiAgICAgICAgICBzZXR0aW5ncy5hbGxvd0NsZWFyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNldHRpbmdzLnRoZW1lKSB7XG4gICAgICAgICAgc2V0dGluZ3MudGhlbWUgPSBcImNsYXNzaWNcIjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy5kaXNhYmxlZCA9IHF1ZXN0aW9uLmlzUmVhZE9ubHk7XG4gICAgICAgIGlmIChzZXR0aW5ncy5hamF4KSB7XG4gICAgICAgICAgJGVsLnNlbGVjdDIoc2V0dGluZ3MpO1xuICAgICAgICAgIHF1ZXN0aW9uLmtlZXBJbmNvcnJlY3RWYWx1ZXMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBkYXRhID0gW107XG4gICAgICAgICAgaWYgKCEhc2V0dGluZ3MucGxhY2Vob2xkZXIgfHwgcXVlc3Rpb24uc2hvd09wdGlvbnNDYXB0aW9uKSB7XG4gICAgICAgICAgICBkYXRhLnB1c2goeyBpZDogXCJcIiwgdGV4dDogXCJcIiB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0dGluZ3MuZGF0YSA9IGRhdGEuY29uY2F0KFxuICAgICAgICAgICAgcXVlc3Rpb24udmlzaWJsZUNob2ljZXMubWFwKGZ1bmN0aW9uIChjaG9pY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZDogY2hvaWNlLnZhbHVlLFxuICAgICAgICAgICAgICAgIHRleHQ6IGNob2ljZS50ZXh0LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHF1ZXN0aW9uLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgICAgICAgJGVsLnNlbGVjdDIoc2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpeGVkIHdpZHRoIGFjY3JvcmRpbmcgdG8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDUyNzY3Nzgvc2VsZWN0Mi1ub3QtcmVzcG9uc2l2ZS13aWR0aC1sYXJnZXItdGhhbi1jb250YWluZXJcbiAgICAgICAgaWYgKCEhZWwucXVlcnlTZWxlY3RvcihcIi5zZWxlY3QyXCIpKSB7XG4gICAgICAgICAgZWwucXVlcnlTZWxlY3RvcihcIi5zZWxlY3QyXCIpLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhZWwubmV4dEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAgICAgZWwubmV4dEVsZW1lbnRTaWJsaW5nLnN0eWxlLm1hcmdpbkJvdHRvbSA9IFwiMXB4XCI7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlVmFsdWVIYW5kbGVyKCk7XG4gICAgICB9O1xuXG4gICAgICAkb3RoZXJFbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiLCBxdWVzdGlvbi5pc1JlYWRPbmx5KTtcbiAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkZWwucHJvcChcImRpc2FibGVkXCIsIHF1ZXN0aW9uLmlzUmVhZE9ubHkpO1xuICAgICAgICAkb3RoZXJFbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiLCBxdWVzdGlvbi5pc1JlYWRPbmx5KTtcbiAgICAgIH07XG5cbiAgICAgIHF1ZXN0aW9uLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgICAgICBcInZpc2libGVDaG9pY2VzXCIsXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB1cGRhdGVDaG9pY2VzKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB1cGRhdGVDaG9pY2VzKCk7XG4gICAgICAkZWwub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcXVlc3Rpb24ucmVuZGVyZWRWYWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgIHVwZGF0ZUNvbW1lbnQoKTtcbiAgICAgICAgfSwgMSk7XG4gICAgICB9KTtcbiAgICAgICRlbC5vbihcInNlbGVjdDI6c2VsZWN0XCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHF1ZXN0aW9uLnJlbmRlcmVkVmFsdWUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICB1cGRhdGVDb21tZW50KCk7XG4gICAgICAgIH0sIDEpO1xuICAgICAgfSk7XG4gICAgICAkZWwub24oXCJzZWxlY3QyOm9wZW5pbmdcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCQodGhpcykuZGF0YShcInVuc2VsZWN0aW5nXCIpKSB7XG4gICAgICAgICAgJCh0aGlzKS5yZW1vdmVEYXRhKFwidW5zZWxlY3RpbmdcIik7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgICRlbC5vbihcInNlbGVjdDI6dW5zZWxlY3RpbmdcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgJCh0aGlzKS5kYXRhKFwidW5zZWxlY3RpbmdcIiwgdHJ1ZSk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHF1ZXN0aW9uLnJlbmRlcmVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZUNvbW1lbnQoKTtcbiAgICAgICAgfSwgMSk7XG4gICAgICB9KTtcbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gdXBkYXRlVmFsdWVIYW5kbGVyO1xuICAgICAgdXBkYXRlVmFsdWVIYW5kbGVyKCk7XG4gICAgfSxcbiAgICB3aWxsVW5tb3VudDogZnVuY3Rpb24gKHF1ZXN0aW9uLCBlbCkge1xuICAgICAgcXVlc3Rpb24ucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2sgPSBudWxsO1xuICAgICAgcXVlc3Rpb24udmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSBudWxsO1xuICAgICAgdmFyICRzZWxlY3QyID0gJChlbCkuZmluZChcInNlbGVjdFwiKTtcbiAgICAgIGlmICghISRzZWxlY3QyLmRhdGEoXCJzZWxlY3QyXCIpKSB7XG4gICAgICAgICRzZWxlY3QyXG4gICAgICAgICAgLm9mZihcInNlbGVjdDI6c2VsZWN0XCIpXG4gICAgICAgICAgLm9mZihcInNlbGVjdDI6dW5zZWxlY3RpbmdcIilcbiAgICAgICAgICAub2ZmKFwic2VsZWN0MjpvcGVuaW5nXCIpXG4gICAgICAgICAgLnNlbGVjdDIoXCJkZXN0cm95XCIpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgU3VydmV5LkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldCk7XG59XG5cbmlmICh0eXBlb2YgU3VydmV5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIGluaXQoU3VydmV5LCB3aW5kb3cuJCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9zZWxlY3QyLmpzXG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCA2IiwiaW1wb3J0IElucHV0bWFzayBmcm9tIFwiaW5wdXRtYXNrXCI7XG5cbmZ1bmN0aW9uIGluaXQoU3VydmV5KSB7XG4gIHZhciB3aWRnZXQgPSB7XG4gICAgbmFtZTogXCJtYXNrZWRpdFwiLFxuICAgIG51bWVyaWNHcm91cFNlcGFyYXRvcjogXCIsXCIsXG4gICAgbnVtZXJpY0F1dG9Hcm91cDogdHJ1ZSxcbiAgICBudW1lcmljRGlnaXRzOiAyLFxuICAgIG51bWVyaWNEaWdpdHNPcHRpb25hbDogZmFsc2UsXG4gICAgbnVtZXJpY1BsYWNlaG9sZGVyOiBcIjBcIixcbiAgICBhdXRvVW5tYXNrOiB0cnVlLFxuICAgIGNsZWFySW5jb21wbGV0ZTogdHJ1ZSxcbiAgICB3aWRnZXRJc0xvYWRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBJbnB1dG1hc2sgIT0gXCJ1bmRlZmluZWRcIjtcbiAgICB9LFxuICAgIGlzRml0OiBmdW5jdGlvbiAocXVlc3Rpb24pIHtcbiAgICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgPT0gXCJtdWx0aXBsZXRleHRcIikgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBxdWVzdGlvbi5nZXRUeXBlKCkgPT0gXCJ0ZXh0XCIgJiZcbiAgICAgICAgKHF1ZXN0aW9uLmlucHV0TWFzayAhPSBcIm5vbmVcIiB8fCBxdWVzdGlvbi5pbnB1dEZvcm1hdClcbiAgICAgICk7XG4gICAgfSxcbiAgICBpc0RlZmF1bHRSZW5kZXI6IHRydWUsXG4gICAgYWN0aXZhdGVkQnlDaGFuZ2VkOiBmdW5jdGlvbiAoYWN0aXZhdGVkQnkpIHtcbiAgICAgIGlmIChTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5maW5kUHJvcGVydHkoXCJ0ZXh0XCIsIFwiaW5wdXRNYXNrXCIpKSByZXR1cm47XG4gICAgICB2YXIgcHJvcGVydGllcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiYXV0b1VubWFzazpib29sZWFuXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImNsZWFySW5jb21wbGV0ZTpib29sZWFuXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHsgbmFtZTogXCJpbnB1dEZvcm1hdFwiLCBjYXRlZ29yeTogXCJnZW5lcmFsXCIgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiaW5wdXRNYXNrXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICAgIFwibm9uZVwiLFxuICAgICAgICAgICAgXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgXCJjdXJyZW5jeVwiLFxuICAgICAgICAgICAgXCJkZWNpbWFsXCIsXG4gICAgICAgICAgICBcImVtYWlsXCIsXG4gICAgICAgICAgICBcInBob25lXCIsXG4gICAgICAgICAgICBcImlwXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwibnVtZXJpY0RpZ2l0c1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwib3B0aW9uc1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicHJlZml4XCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJzdWZmaXhcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydGllcyhcInRleHRcIiwgcHJvcGVydGllcyk7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0aWVzKFxuICAgICAgICBcIm1hdHJpeGRyb3Bkb3duY29sdW1uXCIsXG4gICAgICAgIHByb3BlcnRpZXNcbiAgICAgICk7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0aWVzKFwibXVsdGlwbGV0ZXh0aXRlbVwiLCBwcm9wZXJ0aWVzKTtcbiAgICB9LFxuICAgIGFwcGx5SW5wdXRNYXNrOiBmdW5jdGlvbiAoc3VydmV5RWxlbWVudCwgZWwpIHtcbiAgICAgIHZhciByb290V2lkZ2V0ID0gdGhpcztcbiAgICAgIHZhciBtYXNrID1cbiAgICAgICAgc3VydmV5RWxlbWVudC5pbnB1dE1hc2sgIT09IFwibm9uZVwiXG4gICAgICAgICAgPyBzdXJ2ZXlFbGVtZW50LmlucHV0TWFza1xuICAgICAgICAgIDogc3VydmV5RWxlbWVudC5pbnB1dEZvcm1hdDtcbiAgICAgIHZhciBvcHRpb25zID0ge307XG4gICAgICBpZiAodHlwZW9mIHN1cnZleUVsZW1lbnQub3B0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBmb3IgKHZhciBvcHRpb24gaW4gc3VydmV5RWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgb3B0aW9uc1tvcHRpb25dID0gc3VydmV5RWxlbWVudC5vcHRpb25zW29wdGlvbl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9wdGlvbnMuYXV0b1VubWFzayA9IHR5cGVvZiBzdXJ2ZXlFbGVtZW50LmF1dG9Vbm1hc2sgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBzdXJ2ZXlFbGVtZW50LmF1dG9Vbm1hc2tcbiAgICAgICAgOiByb290V2lkZ2V0LmF1dG9Vbm1hc2s7XG4gICAgICBvcHRpb25zLmNsZWFySW5jb21wbGV0ZSA9IHR5cGVvZiBzdXJ2ZXlFbGVtZW50LmNsZWFySW5jb21wbGV0ZSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IHN1cnZleUVsZW1lbnQuY2xlYXJJbmNvbXBsZXRlXG4gICAgICAgIDogcm9vdFdpZGdldC5jbGVhckluY29tcGxldGU7XG4gICAgICBpZiAoc3VydmV5RWxlbWVudC5pbnB1dE1hc2sgIT09IFwibm9uZVwiKSB7XG4gICAgICAgIG9wdGlvbnMuaW5wdXRGb3JtYXQgPSBzdXJ2ZXlFbGVtZW50LmlucHV0Rm9ybWF0O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBzdXJ2ZXlFbGVtZW50LmlucHV0TWFzayA9PT0gXCJjdXJyZW5jeVwiIHx8XG4gICAgICAgIHN1cnZleUVsZW1lbnQuaW5wdXRNYXNrID09PSBcImRlY2ltYWxcIlxuICAgICAgKSB7XG4gICAgICAgIG9wdGlvbnMuZ3JvdXBTZXBhcmF0b3IgPSByb290V2lkZ2V0Lm51bWVyaWNHcm91cFNlcGFyYXRvcjtcbiAgICAgICAgb3B0aW9ucy5hdXRvR3JvdXAgPSByb290V2lkZ2V0Lm51bWVyaWNBdXRvR3JvdXA7XG4gICAgICB9XG4gICAgICBpZiAoc3VydmV5RWxlbWVudC5pbnB1dE1hc2sgPT09IFwiY3VycmVuY3lcIikge1xuICAgICAgICBvcHRpb25zLmRpZ2l0cyA9IHN1cnZleUVsZW1lbnQubnVtZXJpY0RpZ2l0cyB8fCByb290V2lkZ2V0Lm51bWVyaWNEaWdpdHM7XG4gICAgICAgIG9wdGlvbnMuZGlnaXRzT3B0aW9uYWwgPSByb290V2lkZ2V0Lm51bWVyaWNEaWdpdHNPcHRpb25hbDtcbiAgICAgICAgb3B0aW9ucy5wcmVmaXggPSBzdXJ2ZXlFbGVtZW50LnByZWZpeCB8fCBcIlwiO1xuICAgICAgICBvcHRpb25zLnN1ZmZpeCA9IHN1cnZleUVsZW1lbnQuc3VmZml4IHx8IFwiXCI7XG4gICAgICAgIG9wdGlvbnMucGxhY2Vob2xkZXIgPSByb290V2lkZ2V0Lm51bWVyaWNQbGFjZWhvbGRlcjtcbiAgICAgIH1cbiAgICAgIC8vIGlmIChzdXJ2ZXlFbGVtZW50LmlucHV0TWFzayA9PSBcImRhdGV0aW1lXCIpIHtcbiAgICAgIC8vICAgbWFzayA9IHN1cnZleUVsZW1lbnQuaW5wdXRGb3JtYXQ7XG4gICAgICAvLyB9XG4gICAgICBpZiAoc3VydmV5RWxlbWVudC5pbnB1dE1hc2sgPT09IFwicGhvbmVcIiAmJiAhIXN1cnZleUVsZW1lbnQuaW5wdXRGb3JtYXQpIHtcbiAgICAgICAgbWFzayA9IHN1cnZleUVsZW1lbnQuaW5wdXRGb3JtYXQ7XG4gICAgICB9XG5cbiAgICAgIElucHV0bWFzayhtYXNrLCBvcHRpb25zKS5tYXNrKGVsKTtcblxuICAgICAgZWwub25ibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWVsLmlucHV0bWFzaykgcmV0dXJuO1xuICAgICAgICBpZiAoc3VydmV5RWxlbWVudC52YWx1ZSA9PT0gZWwuaW5wdXRtYXNrLmdldGVtcHR5bWFzaygpKSB7XG4gICAgICAgICAgc3VydmV5RWxlbWVudC52YWx1ZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZhciBjdXN0b21XaWRnZXREYXRhID1cbiAgICAgICAgc3VydmV5RWxlbWVudC5nZXRUeXBlKCkgPT09IFwibXVsdGlwbGV0ZXh0aXRlbVwiXG4gICAgICAgICAgPyBzdXJ2ZXlFbGVtZW50LmVkaXRvclZhbHVlLmN1c3RvbVdpZGdldERhdGFcbiAgICAgICAgICA6IHN1cnZleUVsZW1lbnQuY3VzdG9tV2lkZ2V0RGF0YTtcbiAgICAgIGVsLm9uaW5wdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1c3RvbVdpZGdldERhdGEuaXNOZWVkUmVuZGVyID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBwdXNoVmFsdWVIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWVsLmlucHV0bWFzaykgcmV0dXJuO1xuICAgICAgICBpZiAoZWwuaW5wdXRtYXNrLmlzQ29tcGxldGUoKSkge1xuICAgICAgICAgIHN1cnZleUVsZW1lbnQudmFsdWUgPSBvcHRpb25zLmF1dG9Vbm1hc2tcbiAgICAgICAgICAgID8gZWwuaW5wdXRtYXNrLnVubWFza2VkdmFsdWUoKVxuICAgICAgICAgICAgOiBlbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdXJ2ZXlFbGVtZW50LnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGVsLm9uZm9jdXNvdXQgPSBlbC5vbmNoYW5nZSA9IHB1c2hWYWx1ZUhhbmRsZXI7XG5cbiAgICAgIHZhciB1cGRhdGVIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBlbC52YWx1ZSA9XG4gICAgICAgICAgc3VydmV5RWxlbWVudC52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHN1cnZleUVsZW1lbnQudmFsdWUgPT09IG51bGxcbiAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgOiBzdXJ2ZXlFbGVtZW50LnZhbHVlO1xuICAgICAgfTtcbiAgICAgIHN1cnZleUVsZW1lbnQudmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSB1cGRhdGVIYW5kbGVyO1xuICAgICAgdXBkYXRlSGFuZGxlcigpO1xuICAgIH0sXG4gICAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgIT0gXCJtdWx0aXBsZXRleHRcIikge1xuICAgICAgICB2YXIgaW5wdXQgPSBlbC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikgfHwgZWw7XG4gICAgICAgIHRoaXMuYXBwbHlJbnB1dE1hc2socXVlc3Rpb24sIGlucHV0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb24uaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgaXRlbSA9IHF1ZXN0aW9uLml0ZW1zW2ldO1xuICAgICAgICAgIGlmIChpdGVtLmlucHV0TWFzayAhPSBcIm5vbmVcIiB8fCBpdGVtLmlucHV0Rm9ybWF0KSB7XG4gICAgICAgICAgICB2YXIgaW5wdXQgPSBlbC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgaXRlbS5lZGl0b3IuaW5wdXRJZCk7XG4gICAgICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgdGhpcy5hcHBseUlucHV0TWFzayhpdGVtLCBpbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB3aWxsVW5tb3VudDogZnVuY3Rpb24gKHF1ZXN0aW9uLCBlbCkge1xuICAgICAgdmFyIGlucHV0ID0gZWwucXVlcnlTZWxlY3RvcihcImlucHV0XCIpIHx8IGVsO1xuICAgICAgaWYgKCEhaW5wdXQgJiYgISFpbnB1dC5pbnB1dG1hc2spIHtcbiAgICAgICAgaW5wdXQuaW5wdXRtYXNrLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgU3VydmV5LkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldCk7XG59XG5cbmlmICh0eXBlb2YgU3VydmV5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIGluaXQoU3VydmV5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5pdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2lucHV0bWFzay5qc1xuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgNCIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8zX187XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wicm9vdFwiOlwiSW5wdXRtYXNrXCIsXCJjb21tb25qczJcIjpcImlucHV0bWFza1wiLFwiY29tbW9uanNcIjpcImlucHV0bWFza1wiLFwiYW1kXCI6XCJpbnB1dG1hc2tcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDQiLCJmdW5jdGlvbiBpbml0KFN1cnZleSwgJCkge1xuICAkID0gJCB8fCB3aW5kb3cuJDtcbiAgdmFyIHdpZGdldCA9IHtcbiAgICBuYW1lOiBcImJhcnJhdGluZ1wiLFxuICAgIHRpdGxlOiBcIkJhciByYXRpbmdcIixcbiAgICBpY29uTmFtZTogXCJpY29uLWJhcnJhdGluZ1wiLFxuICAgIHdpZGdldElzTG9hZGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdHlwZW9mICQgPT0gXCJmdW5jdGlvblwiICYmICEhJC5mbi5iYXJyYXRpbmc7XG4gICAgfSxcbiAgICBkZWZhdWx0SlNPTjogeyBjaG9pY2VzOiBbMSwgMiwgMywgNCwgNV0gfSxcbiAgICBpc0ZpdDogZnVuY3Rpb24gKHF1ZXN0aW9uKSB7XG4gICAgICByZXR1cm4gcXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcImJhcnJhdGluZ1wiO1xuICAgIH0sXG4gICAgaXNEZWZhdWx0UmVuZGVyOiB0cnVlLFxuICAgIGFjdGl2YXRlZEJ5Q2hhbmdlZDogZnVuY3Rpb24gKGFjdGl2YXRlZEJ5KSB7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgICAgICAgXCJiYXJyYXRpbmdcIixcbiAgICAgICAgW1xuICAgICAgICAgIHsgbmFtZTogXCJoYXNPdGhlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogXCJvdGhlclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwib3RoZXJFcnJvclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwicmVuZGVyQXNcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwic2VsZWN0MkNvbmZpZ1wiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICBdLFxuICAgICAgICBudWxsLFxuICAgICAgICBcImRyb3Bkb3duXCJcbiAgICAgICk7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0eShcImJhcnJhdGluZ1wiLCB7XG4gICAgICAgIG5hbWU6IFwic2hvd1ZhbHVlczpib29sZWFuXCIsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICB9KTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwiYmFycmF0aW5nXCIsIHtcbiAgICAgICAgbmFtZTogXCJyYXRpbmdUaGVtZVwiLFxuICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgIGRlZmF1bHQ6IFwiY3NzLXN0YXJzXCIsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICBcImZvbnRhd2Vzb21lLXN0YXJzXCIsXG4gICAgICAgICAgXCJjc3Mtc3RhcnNcIixcbiAgICAgICAgICBcImJhcnMtcGlsbFwiLFxuICAgICAgICAgIFwiYmFycy0xdG8xMFwiLFxuICAgICAgICAgIFwiYmFycy1tb3ZpZVwiLFxuICAgICAgICAgIFwiYmFycy1yZXZlcnNlZFwiLFxuICAgICAgICAgIFwiYmFycy1ob3Jpem9udGFsXCIsXG4gICAgICAgICAgXCJmb250YXdlc29tZS1zdGFycy1vXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGFmdGVyUmVuZGVyOiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgJGN1c3RvbVNlbGVjdDtcbiAgICAgIHZhciAkcXVlc3Rpb25JbnB1dDtcbiAgICAgIHZhciBjb250ZW50Q29udGFpbmVyID0gJChlbCkuaXMoXCJzZWxlY3RcIilcbiAgICAgICAgPyAkKGVsKS5wYXJlbnQoKS5wYXJlbnQoKVswXVxuICAgICAgICA6ICQoZWwpLnBhcmVudCgpWzBdO1xuICAgICAgdmFyIHJlbmRlckN1c3RvbVNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJGN1c3RvbVNlbGVjdCA9ICQoXCI8c2VsZWN0IGNsYXNzPSdzdi13aWRnZXQtc2VsZWN0Jz48L3NlbGVjdD5cIik7XG4gICAgICAgIHF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmZvckVhY2goZnVuY3Rpb24gKGNob2ljZSkge1xuICAgICAgICAgICRjdXN0b21TZWxlY3QuYXBwZW5kKFxuICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9XCJ7MH1cIj57MX08L29wdGlvbj4nLmZvcm1hdChjaG9pY2UudmFsdWUsIGNob2ljZS50ZXh0KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICAkcXVlc3Rpb25JbnB1dCA9ICQoY29udGVudENvbnRhaW5lcikuZmluZChcbiAgICAgICAgICAnW2lkPVwiezB9XCJdJy5mb3JtYXQocXVlc3Rpb24uaW5wdXRJZClcbiAgICAgICAgKTtcblxuICAgICAgICAkcXVlc3Rpb25JbnB1dC5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcbiAgICAgICAgJHF1ZXN0aW9uSW5wdXQuYWZ0ZXIoJGN1c3RvbVNlbGVjdCk7XG4gICAgICAgICRjdXN0b21TZWxlY3RbMF0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuICAgICAgfTtcbiAgICAgIHZhciByZW1vdmVDdXN0b21TZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRxdWVzdGlvbklucHV0LmNzcyhcImRpc3BsYXlcIiwgXCJcIik7XG4gICAgICAgICRjdXN0b21TZWxlY3QuYmFycmF0aW5nKFwiZGVzdHJveVwiKTtcbiAgICAgICAgJGN1c3RvbVNlbGVjdC5yZW1vdmUoKTtcbiAgICAgIH07XG4gICAgICB2YXIgcmVuZGVyQmFycmF0aW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkY3VzdG9tU2VsZWN0LmJhcnJhdGluZyhcInNob3dcIiwge1xuICAgICAgICAgIHRoZW1lOiBxdWVzdGlvbi5yYXRpbmdUaGVtZSxcbiAgICAgICAgICBpbml0aWFsUmF0aW5nOiBxdWVzdGlvbi52YWx1ZSxcbiAgICAgICAgICBzaG93VmFsdWVzOiBxdWVzdGlvbi5zaG93VmFsdWVzLFxuICAgICAgICAgIHNob3dTZWxlY3RlZFJhdGluZzogZmFsc2UsXG4gICAgICAgICAgcmVhZG9ubHk6IHF1ZXN0aW9uLmlzUmVhZE9ubHksXG4gICAgICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uICh2YWx1ZSwgdGV4dCkge1xuICAgICAgICAgICAgdmFsdWVDaGFuZ2luZ0J5V2lkZ2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHF1ZXN0aW9uLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB2YWx1ZUNoYW5naW5nQnlXaWRnZXQgPSBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICByZW5kZXJDdXN0b21TZWxlY3QoKTtcbiAgICAgIHJlbmRlckJhcnJhdGluZygpO1xuICAgICAgaWYgKCEhJGN1c3RvbVNlbGVjdC5wYXJlbnRzKClbMF0pXG4gICAgICAgICRjdXN0b21TZWxlY3QucGFyZW50cygpWzBdLnN0eWxlLm1hcmdpbkJvdHRvbSA9IFwiM3B4XCI7XG4gICAgICB2YXIgdmFsdWVDaGFuZ2luZ0J5V2lkZ2V0ID0gZmFsc2U7XG5cbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXZhbHVlQ2hhbmdpbmdCeVdpZGdldCAmJlxuICAgICAgICAgICQoY29udGVudENvbnRhaW5lcikuZmluZChcInNlbGVjdC5zdi13aWRnZXQtc2VsZWN0XCIpWzBdLnZhbHVlICE9PVxuICAgICAgICAgICAgcXVlc3Rpb24udmFsdWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgJChjb250ZW50Q29udGFpbmVyKVxuICAgICAgICAgICAgLmZpbmQoXCJzZWxlY3Quc3Ytd2lkZ2V0LXNlbGVjdFwiKVxuICAgICAgICAgICAgLmJhcnJhdGluZyhcInNldFwiLCBxdWVzdGlvbi52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBxdWVzdGlvbi5fX2JhcnJhdGluZ09uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoXG4gICAgICAgIHNlbmRlcixcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChvcHRpb25zLm5hbWUgPT0gXCJyYXRpbmdUaGVtZVwiKSB7XG4gICAgICAgICAgJGN1c3RvbVNlbGVjdC5iYXJyYXRpbmcoXCJkZXN0cm95XCIpO1xuICAgICAgICAgIHJlbmRlckJhcnJhdGluZygpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcXVlc3Rpb24ub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKFxuICAgICAgICBxdWVzdGlvbi5fX2JhcnJhdGluZ09uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2tcbiAgICAgICk7XG4gICAgICBxdWVzdGlvbi5yZWFkT25seUNoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVtb3ZlQ3VzdG9tU2VsZWN0KCk7XG4gICAgICAgIHJlbmRlckN1c3RvbVNlbGVjdCgpO1xuICAgICAgICByZW5kZXJCYXJyYXRpbmcoKTtcbiAgICAgIH07XG4gICAgICBxdWVzdGlvbi52aXNpYmxlQ2hvaWNlc0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVuZGVyQmFycmF0aW5nKCk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgd2lsbFVubW91bnQ6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIHZhciAkY29udGVudENvbnRhaW5lciA9ICQoZWwpLmlzKFwic2VsZWN0XCIpXG4gICAgICAgID8gJChlbCkucGFyZW50KCkucGFyZW50KClcbiAgICAgICAgOiAkKGVsKS5wYXJlbnQoKTtcbiAgICAgIHZhciAkZWwgPSAkY29udGVudENvbnRhaW5lci5maW5kKFwic2VsZWN0LnN2LXdpZGdldC1zZWxlY3RcIik7XG4gICAgICAkZWwuYmFycmF0aW5nKFwiZGVzdHJveVwiKTtcbiAgICAgICRlbC5yZW1vdmUoKTtcbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgcXVlc3Rpb24ub25Qcm9wZXJ0eUNoYW5nZWQucmVtb3ZlKFxuICAgICAgICBxdWVzdGlvbi5fX2JhcnJhdGluZ09uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2tcbiAgICAgICk7XG4gICAgICBxdWVzdGlvbi5fX2JhcnJhdGluZ09uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICBwZGZRdWVzdGlvblR5cGU6IFwiZHJvcGRvd25cIixcbiAgfTtcblxuICBTdXJ2ZXkuQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbi5JbnN0YW5jZS5hZGRDdXN0b21XaWRnZXQod2lkZ2V0LCBcImN1c3RvbXR5cGVcIik7XG59XG5cbmlmICh0eXBlb2YgU3VydmV5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIGluaXQoU3VydmV5LCB3aW5kb3cuJCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9qcXVlcnktYmFyLXJhdGluZy5qc1xuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMTAiLCJmdW5jdGlvbiBpbml0KFN1cnZleSwgJCkge1xuICAkID0gJCB8fCB3aW5kb3cuJDtcbiAgaWYgKFxuICAgICEhJCAmJlxuICAgICEkLmZuLmJvb3RzdHJhcERQICYmXG4gICAgISEkLmZuLmRhdGVwaWNrZXIgJiZcbiAgICAhISQuZm4uZGF0ZXBpY2tlci5ub0NvbmZsaWN0XG4gICkge1xuICAgICQuZm4uYm9vdHN0cmFwRFAgPSAkLmZuLmRhdGVwaWNrZXIubm9Db25mbGljdCgpO1xuICAgIGlmICghJC5mbi5kYXRlcGlja2VyKSB7XG4gICAgICAkLmZuLmRhdGVwaWNrZXIgPSAkLmZuLmJvb3RzdHJhcERQO1xuICAgIH1cbiAgfVxuICB2YXIgd2lkZ2V0ID0ge1xuICAgIG5hbWU6IFwiZGF0ZXBpY2tlclwiLFxuICAgIHRpdGxlOiBcIkRhdGUgcGlja2VyXCIsXG4gICAgaWNvbk5hbWU6IFwiaWNvbi1kYXRlcGlja2VyXCIsXG4gICAgd2lkZ2V0SXNMb2FkZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhISQgJiYgISEkLmZuLmRhdGVwaWNrZXIgJiYgISQuZm4uZGF0ZXBpY2tlci5ub0NvbmZsaWN0O1xuICAgIH0sXG4gICAgaXNGaXQ6IGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJkYXRlcGlja2VyXCI7XG4gICAgfSxcbiAgICBodG1sVGVtcGxhdGU6IFwiPGlucHV0IGNsYXNzPSdmb3JtLWNvbnRyb2wgd2lkZ2V0LWRhdGVwaWNrZXInIHR5cGU9J3RleHQnPlwiLFxuICAgIGFjdGl2YXRlZEJ5Q2hhbmdlZDogZnVuY3Rpb24gKGFjdGl2YXRlZEJ5KSB7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgICAgICAgXCJkYXRlcGlja2VyXCIsXG4gICAgICAgIFtcbiAgICAgICAgICB7IG5hbWU6IFwiaW5wdXRUeXBlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgICAgeyBuYW1lOiBcImlucHV0Rm9ybWF0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgICAgeyBuYW1lOiBcImlucHV0TWFza1wiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICBdLFxuICAgICAgICBudWxsLFxuICAgICAgICBcInRleHRcIlxuICAgICAgKTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwiZGF0ZXBpY2tlclwiLCB7XG4gICAgICAgIG5hbWU6IFwiZGF0ZUZvcm1hdFwiLFxuICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICB9KTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwiZGF0ZXBpY2tlclwiLCB7XG4gICAgICAgIG5hbWU6IFwiY29uZmlnXCIsXG4gICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9KTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwiZGF0ZXBpY2tlclwiLCB7XG4gICAgICAgIG5hbWU6IFwibWF4RGF0ZVwiLFxuICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICB9KTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwiZGF0ZXBpY2tlclwiLCB7XG4gICAgICAgIG5hbWU6IFwibWluRGF0ZVwiLFxuICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGFmdGVyUmVuZGVyOiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgJGVsID0gJChlbCkuaXMoXCIud2lkZ2V0LWRhdGVwaWNrZXJcIilcbiAgICAgICAgPyAkKGVsKVxuICAgICAgICA6ICQoZWwpLmZpbmQoXCIud2lkZ2V0LWRhdGVwaWNrZXJcIik7XG4gICAgICAkZWwuYWRkQ2xhc3MocXVlc3Rpb24uY3NzLnRleHQucm9vdCk7XG4gICAgICB2YXIgaXNTZWxlY3RpbmcgPSBmYWxzZTtcbiAgICAgIHZhciBjb25maWcgPSAkLmV4dGVuZCh0cnVlLCB7fSwgcXVlc3Rpb24uY29uZmlnIHx8IHt9KTtcbiAgICAgIGlmICghIXF1ZXN0aW9uLnBsYWNlSG9sZGVyKSB7XG4gICAgICAgICRlbC5hdHRyKFwicGxhY2Vob2xkZXJcIiwgcXVlc3Rpb24ucGxhY2VIb2xkZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kYXRlRm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uZmlnLmRhdGVGb3JtYXQgPSAhIXF1ZXN0aW9uLmRhdGVGb3JtYXRcbiAgICAgICAgICA/IHF1ZXN0aW9uLmRhdGVGb3JtYXRcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcub3B0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uZmlnLm9wdGlvbiA9IHtcbiAgICAgICAgICBtaW5EYXRlOiBudWxsLFxuICAgICAgICAgIG1heERhdGU6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoISFxdWVzdGlvbi5taW5EYXRlKSB7XG4gICAgICAgIGNvbmZpZy5taW5EYXRlID0gcXVlc3Rpb24ubWluRGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmICghIXF1ZXN0aW9uLm1heERhdGUpIHtcbiAgICAgICAgY29uZmlnLm1heERhdGUgPSBxdWVzdGlvbi5tYXhEYXRlO1xuICAgICAgfVxuICAgICAgaWYgKCEhcXVlc3Rpb24ucmVuZGVyZWRNaW4pIHtcbiAgICAgICAgY29uZmlnLm1pbkRhdGUgPSBxdWVzdGlvbi5yZW5kZXJlZE1pbjtcbiAgICAgIH1cbiAgICAgIGlmICghIXF1ZXN0aW9uLnJlbmRlcmVkTWF4KSB7XG4gICAgICAgIGNvbmZpZy5tYXhEYXRlID0gcXVlc3Rpb24ucmVuZGVyZWRNYXg7XG4gICAgICB9XG4gICAgICBjb25maWcuZGlzYWJsZWQgPSBxdWVzdGlvbi5pc1JlYWRPbmx5O1xuICAgICAgaWYgKGNvbmZpZy5vblNlbGVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbmZpZy5vblNlbGVjdCA9IGZ1bmN0aW9uIChkYXRlVGV4dCkge1xuICAgICAgICAgIGlzU2VsZWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IGRhdGVUZXh0O1xuICAgICAgICAgIGlzU2VsZWN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5maXhGb2N1c0lFID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbmZpZy5maXhGb2N1c0lFID0gZmFsc2U7XG4gICAgICBjb25maWcub25DbG9zZSA9IGZ1bmN0aW9uIChkYXRlVGV4dCwgaW5zdCkge1xuICAgICAgICB0aGlzLmZpeEZvY3VzSUUgPSB0cnVlO1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5iZWZvcmVTaG93ID0gZnVuY3Rpb24gKGlucHV0LCBpbnN0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAhIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1RyaWRlbnRcXC83XFwuLylcbiAgICAgICAgICA/ICF0aGlzLmZpeEZvY3VzSUVcbiAgICAgICAgICA6IHRydWU7XG4gICAgICAgIHRoaXMuZml4Rm9jdXNJRSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIHZhciBwaWNrZXJXaWRnZXQgPSAkZWwuZGF0ZXBpY2tlcihjb25maWcpO1xuXG4gICAgICAkZWwua2V5dXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PSA4IHx8IGUua2V5Q29kZSA9PSA0Nikge1xuICAgICAgICAgICQuZGF0ZXBpY2tlci5fY2xlYXJEYXRlKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcXVlc3Rpb24ucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRlbC5kYXRlcGlja2VyKFwib3B0aW9uXCIsIFwiZGlzYWJsZWRcIiwgcXVlc3Rpb24uaXNSZWFkT25seSk7XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gdXBkYXRlRGF0ZSgpIHtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgcGlja2VyV2lkZ2V0LmRhdGVwaWNrZXIoXCJzZXREYXRlXCIsIHF1ZXN0aW9uLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwaWNrZXJXaWRnZXQuZGF0ZXBpY2tlcihcInNldERhdGVcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1ZXN0aW9uLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgICAgICBcImRhdGVGb3JtYXRcIixcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHF1ZXN0aW9uLmRhdGVGb3JtYXQgJiZcbiAgICAgICAgICAgIHBpY2tlcldpZGdldC5kYXRlcGlja2VyKFxuICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICBcImRhdGVGb3JtYXRcIixcbiAgICAgICAgICAgICAgcXVlc3Rpb24uZGF0ZUZvcm1hdFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVEYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBxdWVzdGlvbi52YWx1ZUNoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFpc1NlbGVjdGluZykge1xuICAgICAgICAgIHVwZGF0ZURhdGUoKTtcbiAgICAgICAgICAkZWwuYmx1cigpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcXVlc3Rpb24udmFsdWVDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICB9LFxuICAgIHdpbGxVbm1vdW50OiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgJGVsID0gJChlbCkuaXMoXCIud2lkZ2V0LWRhdGVwaWNrZXJcIilcbiAgICAgICAgPyAkKGVsKVxuICAgICAgICA6ICQoZWwpLmZpbmQoXCIud2lkZ2V0LWRhdGVwaWNrZXJcIik7XG4gICAgICAkZWwuZGF0ZXBpY2tlcihcImRlc3Ryb3lcIik7XG4gICAgfSxcbiAgICBwZGZRdWVzdGlvblR5cGU6IFwidGV4dFwiLFxuICB9O1xuXG4gIFN1cnZleS5tYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzLmRhdGVwaWNrZXIgPSB7IHByb3BlcnRpZXM6IFtcInBsYWNlSG9sZGVyXCJdIH07XG4gIFN1cnZleS5DdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmFkZEN1c3RvbVdpZGdldCh3aWRnZXQsIFwiY3VzdG9tdHlwZVwiKTtcbn1cblxuaWYgKHR5cGVvZiBTdXJ2ZXkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgaW5pdChTdXJ2ZXksIHdpbmRvdy4kKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5pdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2pxdWVyeS11aS1kYXRlcGlja2VyLmpzXG4vLyBtb2R1bGUgaWQgPSA1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCA5IiwiaW1wb3J0IG5vVWlTbGlkZXIgZnJvbSBcIm5vdWlzbGlkZXJcIjtcblxuZnVuY3Rpb24gaW5pdChTdXJ2ZXkpIHtcbiAgdmFyIHdpZGdldCA9IHtcbiAgICBuYW1lOiBcIm5vdWlzbGlkZXJcIixcbiAgICB0aXRsZTogXCJub1VpU2xpZGVyXCIsXG4gICAgaWNvbk5hbWU6IFwiaWNvbi1ub3Vpc2xpZGVyXCIsXG4gICAgd2lkZ2V0SXNMb2FkZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygbm9VaVNsaWRlciAhPSBcInVuZGVmaW5lZFwiO1xuICAgIH0sXG4gICAgaXNGaXQ6IGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJub3Vpc2xpZGVyXCI7XG4gICAgfSxcbiAgICBodG1sVGVtcGxhdGU6XG4gICAgICBcIjxkaXY+PGRpdj48L2Rpdj48L2Rpdj5cIixcbiAgICBhY3RpdmF0ZWRCeUNoYW5nZWQ6IGZ1bmN0aW9uIChhY3RpdmF0ZWRCeSkge1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJub3Vpc2xpZGVyXCIsIFtdLCBudWxsLCBcImVtcHR5XCIpO1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydGllcyhcIm5vdWlzbGlkZXJcIiwgW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJzdGVwOm51bWJlclwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcInNsaWRlclwiLFxuICAgICAgICAgIGNhdGVnb3J5SW5kZXg6IDEsXG4gICAgICAgICAgZGVmYXVsdDogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicmFuZ2VNaW46bnVtYmVyXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicmFuZ2VNYXg6bnVtYmVyXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMTAwLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJwaXBzTW9kZVwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcInNsaWRlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwicG9zaXRpb25zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInBpcHNWYWx1ZXM6aXRlbXZhbHVlc1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcInNsaWRlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFswLCAyNSwgNTAsIDc1LCAxMDBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJwaXBzVGV4dDppdGVtdmFsdWVzXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogWzAsIDI1LCA1MCwgNzUsIDEwMF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInBpcHNEZW5zaXR5Om51bWJlclwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcInNsaWRlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIm9yaWVudGF0aW9uXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJob3Jpem9udGFsXCIsXG4gICAgICAgICAgY2hvaWNlczogW1wiaG9yaXpvbnRhbFwiLCBcInZlcnRpY2FsXCJdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImRpcmVjdGlvbjpzdHJpbmdcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJzbGlkZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiBcImx0clwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b29sdGlwczpib29sZWFuXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwic2xpZGVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0sXG4gICAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBcIjE5cHhcIjtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdMZWZ0ID0gXCIyMHB4XCI7XG4gICAgICBlbC5zdHlsZS5wYWRkaW5nUmlnaHQgPSBcIjIwcHhcIjtcbiAgICAgIGVsLnN0eWxlLnBhZGRpbmdUb3AgPSBcIjQ0cHhcIjtcbiAgICAgIGVsID0gZWwuY2hpbGRyZW5bMF07XG4gICAgICBlbC5zdHlsZS5tYXJnaW5Cb3R0b20gPSBcIjYwcHhcIjtcbiAgICAgIGlmIChxdWVzdGlvbi5vcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiKSB7XG4gICAgICAgIGVsLnN0eWxlLmhlaWdodCA9IFwiMjUwcHhcIjtcbiAgICAgIH1cbiAgICAgIHZhciBzbGlkZXIgPSBub1VpU2xpZGVyLmNyZWF0ZShlbCwge1xuICAgICAgICBzdGFydDogcXVlc3Rpb24udmFsdWUgfHwgKHF1ZXN0aW9uLnJhbmdlTWluICsgcXVlc3Rpb24ucmFuZ2VNYXgpIC8gMixcbiAgICAgICAgY29ubmVjdDogW3RydWUsIGZhbHNlXSxcbiAgICAgICAgc3RlcDogcXVlc3Rpb24uc3RlcCxcbiAgICAgICAgdG9vbHRpcHM6IHF1ZXN0aW9uLnRvb2x0aXBzLFxuICAgICAgICBwaXBzOiB7XG4gICAgICAgICAgbW9kZTogcXVlc3Rpb24ucGlwc01vZGUgfHwgXCJwb3NpdGlvbnNcIixcbiAgICAgICAgICB2YWx1ZXM6IHF1ZXN0aW9uLnBpcHNWYWx1ZXMubWFwKGZ1bmN0aW9uIChwVmFsKSB7XG4gICAgICAgICAgICB2YXIgcGlwVmFsdWUgPSBwVmFsO1xuICAgICAgICAgICAgaWYgKHBWYWwudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBwaXBWYWx1ZSA9IHBWYWwudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQocGlwVmFsdWUpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGRlbnNpdHk6IHF1ZXN0aW9uLnBpcHNEZW5zaXR5IHx8IDUsXG4gICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICB0bzogZnVuY3Rpb24gKHBWYWwpIHtcbiAgICAgICAgICAgICAgdmFyIHBpcFRleHQgPSBwVmFsO1xuICAgICAgICAgICAgICBxdWVzdGlvbi5waXBzVGV4dC5tYXAoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsLnRleHQgIT09IHVuZGVmaW5lZCAmJiBwVmFsID09PSBlbC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgcGlwVGV4dCA9IGVsLnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHBpcFRleHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgbWluOiBxdWVzdGlvbi5yYW5nZU1pbixcbiAgICAgICAgICBtYXg6IHF1ZXN0aW9uLnJhbmdlTWF4LFxuICAgICAgICB9LFxuICAgICAgICBvcmllbnRhdGlvbjogcXVlc3Rpb24ub3JpZW50YXRpb24sXG4gICAgICAgIGRpcmVjdGlvbjogcXVlc3Rpb24uZGlyZWN0aW9uLFxuICAgICAgfSk7XG4gICAgICBzbGlkZXIub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IE51bWJlcihzbGlkZXIuZ2V0KCkpO1xuICAgICAgfSk7XG4gICAgICB2YXIgdXBkYXRlVmFsdWVIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzbGlkZXIuc2V0KHF1ZXN0aW9uLnZhbHVlKTtcbiAgICAgIH07XG4gICAgICBpZiAocXVlc3Rpb24uaXNSZWFkT25seSkge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZVZhbHVlSGFuZGxlcigpO1xuICAgICAgcXVlc3Rpb24ubm9VaVNsaWRlciA9IHNsaWRlcjtcbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gdXBkYXRlVmFsdWVIYW5kbGVyO1xuICAgICAgcXVlc3Rpb24ucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc1JlYWRPbmx5KSB7XG4gICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICB3aWxsVW5tb3VudDogZnVuY3Rpb24gKHF1ZXN0aW9uLCBlbCkge1xuICAgICAgaWYgKCEhcXVlc3Rpb24ubm9VaVNsaWRlcikge1xuICAgICAgICBxdWVzdGlvbi5ub1VpU2xpZGVyLmRlc3Ryb3koKTtcbiAgICAgICAgcXVlc3Rpb24ubm9VaVNsaWRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICBxdWVzdGlvbi5yZWFkT25seUNoYW5nZWRDYWxsYmFjayA9IG51bGw7XG4gICAgfSxcbiAgICBwZGZSZW5kZXI6IGZ1bmN0aW9uIChfLCBvcHRpb25zKSB7XG4gICAgICBpZiAob3B0aW9ucy5xdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwibm91aXNsaWRlclwiKSB7XG4gICAgICAgIHZhciBwb2ludCA9IG9wdGlvbnMubW9kdWxlLlN1cnZleUhlbHBlci5jcmVhdGVQb2ludChcbiAgICAgICAgICBvcHRpb25zLm1vZHVsZS5TdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cy5hcHBseShudWxsLCBvcHRpb25zLmJyaWNrcylcbiAgICAgICAgKTtcbiAgICAgICAgcG9pbnQueExlZnQgKz0gb3B0aW9ucy5jb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgcG9pbnQueVRvcCArPVxuICAgICAgICAgIG9wdGlvbnMuY29udHJvbGxlci51bml0SGVpZ2h0ICpcbiAgICAgICAgICBvcHRpb25zLm1vZHVsZS5GbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRTtcbiAgICAgICAgdmFyIHJlY3QgPSBvcHRpb25zLm1vZHVsZS5TdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZpZWxkUmVjdChcbiAgICAgICAgICBwb2ludCxcbiAgICAgICAgICBvcHRpb25zLmNvbnRyb2xsZXJcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIHRleHRib3hCcmljayA9IG5ldyBvcHRpb25zLm1vZHVsZS5UZXh0RmllbGRCcmljayhcbiAgICAgICAgICBvcHRpb25zLnF1ZXN0aW9uLFxuICAgICAgICAgIG9wdGlvbnMuY29udHJvbGxlcixcbiAgICAgICAgICByZWN0LFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgb3B0aW9ucy5xdWVzdGlvbi5pZCxcbiAgICAgICAgICBvcHRpb25zLnF1ZXN0aW9uLnZhbHVlIHx8IG9wdGlvbnMucXVlc3Rpb24uZGVmYXVsdFZhbHVlIHx8IFwiXCIsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgICBvcHRpb25zLnF1ZXN0aW9uLmlzUmVhZE9ubHksXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgXCJ0ZXh0XCJcbiAgICAgICAgKTtcbiAgICAgICAgb3B0aW9ucy5icmlja3MucHVzaCh0ZXh0Ym94QnJpY2spO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgU3VydmV5LkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldCwgXCJjdXN0b210eXBlXCIpO1xufVxuXG5pZiAodHlwZW9mIFN1cnZleSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICBpbml0KFN1cnZleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9ub3Vpc2xpZGVyLmpzXG4vLyBtb2R1bGUgaWQgPSA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCAzIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzdfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJub1VpU2xpZGVyXCIsXCJjb21tb25qczJcIjpcIm5vdWlzbGlkZXJcIixcImNvbW1vbmpzXCI6XCJub3Vpc2xpZGVyXCIsXCJhbWRcIjpcIm5vdWlzbGlkZXJcIn1cbi8vIG1vZHVsZSBpZCA9IDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDMiLCJmdW5jdGlvbiBpbml0KFN1cnZleSwgJCkge1xuICAkID0gJCB8fCB3aW5kb3cuJDtcbiAgdmFyIHdpZGdldCA9IHtcbiAgICBuYW1lOiBcInRhZ2JveFwiLFxuICAgIHRpdGxlOiBcIlRhZyBib3hcIixcbiAgICBpY29uTmFtZTogXCJpY29uLXRhZ2JveFwiLFxuICAgIHdpZGdldElzTG9hZGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdHlwZW9mICQgPT0gXCJmdW5jdGlvblwiICYmICEhJC5mbi5zZWxlY3QyO1xuICAgIH0sXG4gICAgZGVmYXVsdEpTT046IHtcbiAgICAgIGNob2ljZXM6IFtcIkl0ZW0gMVwiLCBcIkl0ZW0gMlwiLCBcIkl0ZW0gM1wiXSxcbiAgICB9LFxuICAgIGh0bWxUZW1wbGF0ZTpcbiAgICAgIFwiPGRpdj48c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZScgc3R5bGU9J3dpZHRoOiAxMDAlOyc+PC9zZWxlY3Q+PHRleHRhcmVhPjwvdGV4dGFyZWE+PC9kaXY+XCIsXG4gICAgaXNGaXQ6IGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJ0YWdib3hcIjtcbiAgICB9LFxuICAgIGFjdGl2YXRlZEJ5Q2hhbmdlZDogZnVuY3Rpb24gKGFjdGl2YXRlZEJ5KSB7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgICAgICAgXCJ0YWdib3hcIixcbiAgICAgICAgW1xuICAgICAgICAgIHsgbmFtZTogXCJoYXNPdGhlcjpib29sZWFuXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgICAgeyBuYW1lOiBcImhhc1NlbGVjdEFsbDpib29sZWFuXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgICAgeyBuYW1lOiBcImhhc05vbmU6Ym9vbGVhblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogXCJvdGhlclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwic2VsZWN0QWxsVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogXCJub25lVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICBdLFxuICAgICAgICBudWxsLFxuICAgICAgICBcImNoZWNrYm94XCJcbiAgICAgICk7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0eShcInRhZ2JveFwiLCB7XG4gICAgICAgIG5hbWU6IFwic2VsZWN0MkNvbmZpZ1wiLFxuICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICB9KTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwidGFnYm94XCIsIHtcbiAgICAgICAgbmFtZTogXCJwbGFjZWhvbGRlclwiLFxuICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgIGRlZmF1bHQ6IFwiXCIsXG4gICAgICB9KTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwidGFnYm94XCIsIHtcbiAgICAgICAgbmFtZTogXCJhbGxvd0FkZE5ld1RhZzpib29sZWFuXCIsXG4gICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIFN1cnZleS5tYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzLnRhZ2JveCA9IHtcbiAgICAgICAgcHJvcGVydGllczogW1xuICAgICAgICAgIFwiY2hvaWNlc1wiLFxuICAgICAgICAgIFwiY2hvaWNlc09yZGVyXCIsXG4gICAgICAgICAgXCJjaG9pY2VzQnlVcmxcIixcbiAgICAgICAgICBcIm9wdGlvbnNDYXB0aW9uXCIsXG4gICAgICAgICAgXCJvdGhlclRleHRcIixcbiAgICAgICAgICBcImNob2ljZXNWaXNpYmxlSWZcIixcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBmaXhTdHlsZXM6IGZ1bmN0aW9uIChlbCkge1xuICAgICAgZWwucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnNlbGVjdDItc2VhcmNoX19maWVsZFwiKS5zdHlsZS5ib3JkZXIgPVxuICAgICAgICBcIm5vbmVcIjtcbiAgICB9LFxuICAgIGFmdGVyUmVuZGVyOiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc2VsZWN0MkNvbmZpZyA9IHF1ZXN0aW9uLnNlbGVjdDJDb25maWc7XG4gICAgICB2YXIgc2V0dGluZ3MgPVxuICAgICAgICBzZWxlY3QyQ29uZmlnICYmIHR5cGVvZiBzZWxlY3QyQ29uZmlnID09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IEpTT04ucGFyc2Uoc2VsZWN0MkNvbmZpZylcbiAgICAgICAgICA6IHNlbGVjdDJDb25maWc7XG4gICAgICB2YXIgJGVsID0gJChlbCkuaXMoXCJzZWxlY3RcIikgPyAkKGVsKSA6ICQoZWwpLmZpbmQoXCJzZWxlY3RcIik7XG5cbiAgICAgIHNlbGYud2lsbFVubW91bnQocXVlc3Rpb24sIGVsKTtcblxuICAgICAgaWYgKCFzZXR0aW5ncykgc2V0dGluZ3MgPSB7fTtcbiAgICAgIHNldHRpbmdzLnBsYWNlaG9sZGVyID0gcXVlc3Rpb24ucGxhY2Vob2xkZXI7XG4gICAgICBzZXR0aW5ncy50YWdzID0gcXVlc3Rpb24uYWxsb3dBZGROZXdUYWc7XG4gICAgICBzZXR0aW5ncy5kaXNhYmxlZCA9IHF1ZXN0aW9uLmlzUmVhZE9ubHk7XG4gICAgICBzZXR0aW5ncy50aGVtZSA9IFwiY2xhc3NpY1wiO1xuICAgICAgaWYgKCEhcXVlc3Rpb24ubWF4U2VsZWN0ZWRDaG9pY2VzKSB7XG4gICAgICAgIHNldHRpbmdzLm1heGltdW1TZWxlY3Rpb25MZW5ndGggPSBxdWVzdGlvbi5tYXhTZWxlY3RlZENob2ljZXM7XG4gICAgICB9XG5cbiAgICAgICRlbC5zZWxlY3QyKHNldHRpbmdzKTtcblxuICAgICAgdmFyICRvdGhlckVsZW1lbnQgPSAkKGVsKS5maW5kKFwidGV4dGFyZWFcIik7XG4gICAgICBpZiAoXG4gICAgICAgICEhcXVlc3Rpb24uc3VydmV5ICYmXG4gICAgICAgICEhcXVlc3Rpb24uc3VydmV5LmNzcyAmJlxuICAgICAgICAhIXF1ZXN0aW9uLnN1cnZleS5jc3MuY2hlY2tib3hcbiAgICAgICkge1xuICAgICAgICAkb3RoZXJFbGVtZW50LmFkZENsYXNzKHF1ZXN0aW9uLnN1cnZleS5jc3MuY2hlY2tib3gub3RoZXIpO1xuICAgICAgfVxuICAgICAgJG90aGVyRWxlbWVudC5wbGFjZWhvbGRlciA9IHF1ZXN0aW9uLm90aGVyUGxhY2VIb2xkZXI7XG4gICAgICAkb3RoZXJFbGVtZW50LmJpbmQoXCJpbnB1dCBwcm9wZXJ0eWNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHF1ZXN0aW9uLmNvbW1lbnQgPSAkb3RoZXJFbGVtZW50LnZhbCgpO1xuICAgICAgfSk7XG4gICAgICB2YXIgdXBkYXRlQ29tbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJG90aGVyRWxlbWVudC52YWwocXVlc3Rpb24uY29tbWVudCk7XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQpIHtcbiAgICAgICAgICAkb3RoZXJFbGVtZW50LnNob3coKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkb3RoZXJFbGVtZW50LmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgc2VsZi5maXhTdHlsZXMoZWwpO1xuICAgICAgdmFyIHF1ZXN0aW9uO1xuICAgICAgdmFyIHVwZGF0ZVZhbHVlSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmhhc1NlbGVjdEFsbCAmJiBxdWVzdGlvbi5pc0FsbFNlbGVjdGVkKSB7XG4gICAgICAgICAgJGVsXG4gICAgICAgICAgICAudmFsKFtxdWVzdGlvbi5zZWxlY3RBbGxJdGVtVmFsdWUudmFsdWVdLmNvbmNhdChxdWVzdGlvbi52YWx1ZSkpXG4gICAgICAgICAgICAudHJpZ2dlcihcImNoYW5nZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkZWwudmFsKHF1ZXN0aW9uLnZhbHVlKS50cmlnZ2VyKFwiY2hhbmdlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuZml4U3R5bGVzKGVsKTtcbiAgICAgICAgdXBkYXRlQ29tbWVudCgpO1xuICAgICAgfTtcbiAgICAgIHZhciB1cGRhdGVDaG9pY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAkZWwuc2VsZWN0MigpLmVtcHR5KCk7XG4gICAgICAgIGlmIChzZXR0aW5ncy5hamF4KSB7XG4gICAgICAgICAgJGVsLnNlbGVjdDIoc2V0dGluZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldHRpbmdzLmRhdGEgPSBxdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5tYXAoZnVuY3Rpb24gKGNob2ljZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWQ6IGNob2ljZS52YWx1ZSxcbiAgICAgICAgICAgICAgdGV4dDogY2hvaWNlLnRleHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgICRlbC5zZWxlY3QyKHNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVWYWx1ZUhhbmRsZXIoKTtcbiAgICAgIH07XG4gICAgICB2YXIgaXNBbGxJdGVtU2VsZWN0ZWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBxdWVzdGlvbi5oYXNTZWxlY3RBbGwgJiYgdmFsdWUgPT09IHF1ZXN0aW9uLnNlbGVjdEFsbEl0ZW1WYWx1ZS52YWx1ZVxuICAgICAgICApO1xuICAgICAgfTtcbiAgICAgIHF1ZXN0aW9uLl9wcm9wZXJ0eVZhbHVlQ2hhbmdlZEZuU2VsZWN0MiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdXBkYXRlQ2hvaWNlcygpO1xuICAgICAgfTtcblxuICAgICAgJG90aGVyRWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiwgcXVlc3Rpb24uaXNSZWFkT25seSk7XG4gICAgICBxdWVzdGlvbi5yZWFkT25seUNoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJGVsLnByb3AoXCJkaXNhYmxlZFwiLCBxdWVzdGlvbi5pc1JlYWRPbmx5KTtcbiAgICAgICAgJG90aGVyRWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiwgcXVlc3Rpb24uaXNSZWFkT25seSk7XG4gICAgICB9O1xuICAgICAgcXVlc3Rpb24ucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICAgIFwidmlzaWJsZUNob2ljZXNcIixcbiAgICAgICAgcXVlc3Rpb24uX3Byb3BlcnR5VmFsdWVDaGFuZ2VkRm5TZWxlY3QyXG4gICAgICApO1xuICAgICAgcXVlc3Rpb24udmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSB1cGRhdGVWYWx1ZUhhbmRsZXI7XG4gICAgICAkZWwub24oXCJzZWxlY3QyOnNlbGVjdFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoaXNBbGxJdGVtU2VsZWN0ZWQoZS5wYXJhbXMuZGF0YS5pZCkpIHtcbiAgICAgICAgICBxdWVzdGlvbi5zZWxlY3RBbGwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IChxdWVzdGlvbi52YWx1ZSB8fCBbXSkuY29uY2F0KGUucGFyYW1zLmRhdGEuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNvbW1lbnQoKTtcbiAgICAgIH0pO1xuICAgICAgJGVsLm9uKFwic2VsZWN0Mjp1bnNlbGVjdFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgaW5kZXggPSAocXVlc3Rpb24udmFsdWUgfHwgW10pLmluZGV4T2YoZS5wYXJhbXMuZGF0YS5pZCk7XG4gICAgICAgIGlmIChpc0FsbEl0ZW1TZWxlY3RlZChlLnBhcmFtcy5kYXRhLmlkKSkge1xuICAgICAgICAgIHF1ZXN0aW9uLmNsZWFyVmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICB2YXIgdmFsID0gW10uY29uY2F0KHF1ZXN0aW9uLnZhbHVlKTtcbiAgICAgICAgICB2YWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDb21tZW50KCk7XG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZUNob2ljZXMoKTtcbiAgICB9LFxuICAgIHdpbGxVbm1vdW50OiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICBpZiAoIXF1ZXN0aW9uLl9wcm9wZXJ0eVZhbHVlQ2hhbmdlZEZuU2VsZWN0MikgcmV0dXJuO1xuXG4gICAgICB2YXIgJHNlbGVjdDIgPSAkKGVsKS5maW5kKFwic2VsZWN0XCIpO1xuICAgICAgaWYgKCEhJHNlbGVjdDIuZGF0YShcInNlbGVjdDJcIikpIHtcbiAgICAgICAgJHNlbGVjdDIub2ZmKFwic2VsZWN0MjpzZWxlY3RcIikuc2VsZWN0MihcImRlc3Ryb3lcIik7XG4gICAgICB9XG4gICAgICBxdWVzdGlvbi5yZWFkT25seUNoYW5nZWRDYWxsYmFjayA9IG51bGw7XG4gICAgICBxdWVzdGlvbi52YWx1ZUNoYW5nZWRDYWxsYmFjayA9IG51bGw7XG4gICAgICBxdWVzdGlvbi51blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgICAgICBcInZpc2libGVDaG9pY2VzXCIsXG4gICAgICAgIHF1ZXN0aW9uLl9wcm9wZXJ0eVZhbHVlQ2hhbmdlZEZuU2VsZWN0MlxuICAgICAgKTtcbiAgICAgIHF1ZXN0aW9uLl9wcm9wZXJ0eVZhbHVlQ2hhbmdlZEZuU2VsZWN0MiA9IHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIHBkZlF1ZXN0aW9uVHlwZTogXCJjaGVja2JveFwiLFxuICB9O1xuXG4gIFN1cnZleS5DdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmFkZEN1c3RvbVdpZGdldCh3aWRnZXQsIFwiY3VzdG9tdHlwZVwiKTtcbn1cblxuaWYgKHR5cGVvZiBTdXJ2ZXkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgaW5pdChTdXJ2ZXksIHdpbmRvdy4kKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5pdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL3NlbGVjdDItdGFnYm94LmpzXG4vLyBtb2R1bGUgaWQgPSA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCA3IiwiaW1wb3J0IFNvcnRhYmxlIGZyb20gXCJzb3J0YWJsZWpzXCI7XG5cbmZ1bmN0aW9uIGluaXQoU3VydmV5KSB7XG4gIHZhciB3aWRnZXQgPSB7XG4gICAgbmFtZTogXCJzb3J0YWJsZWxpc3RcIixcbiAgICB0aXRsZTogXCJTb3J0YWJsZSBsaXN0XCIsXG4gICAgaWNvbk5hbWU6IFwiaWNvbi1zb3J0YWJsZWpzXCIsXG4gICAgd2lkZ2V0SXNMb2FkZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgU29ydGFibGUgIT0gXCJ1bmRlZmluZWRcIjtcbiAgICB9LFxuICAgIGRlZmF1bHRKU09OOiB7IGNob2ljZXM6IFtcIkl0ZW0gMVwiLCBcIkl0ZW0gMlwiLCBcIkl0ZW0gM1wiXSB9LFxuICAgIHJvb3RTdHlsZTogXCJ3aWR0aDoxMDAlOlwiLFxuICAgIGFyZWFTdHlsZTpcbiAgICAgIFwiYm9yZGVyOiAxcHggc29saWQgIzFhYjM5NDsgd2lkdGg6MTAwJTsgbWluLWhlaWdodDo1MHB4OyBtYXJnaW4tdG9wOjEwcHg7XCIsXG4gICAgaXRlbVN0eWxlOiBcImJhY2tncm91bmQtY29sb3I6IzFhYjM5NDtjb2xvcjojZmZmO21hcmdpbjo1cHg7cGFkZGluZzoxMHB4O1wiLFxuICAgIGlzRml0OiBmdW5jdGlvbiAocXVlc3Rpb24pIHtcbiAgICAgIHJldHVybiBxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwic29ydGFibGVsaXN0XCI7XG4gICAgfSxcbiAgICBodG1sVGVtcGxhdGU6IFwiPGRpdj48L2Rpdj5cIixcbiAgICBhY3RpdmF0ZWRCeUNoYW5nZWQ6IGZ1bmN0aW9uIChhY3RpdmF0ZWRCeSkge1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gICAgICAgIFwic29ydGFibGVsaXN0XCIsXG4gICAgICAgIFtcbiAgICAgICAgICB7IG5hbWU6IFwiaGFzT3RoZXJcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwic3RvcmVPdGhlcnNBc0NvbW1lbnRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwiaGFzTm9uZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogXCJyZW5kZXJBc1wiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogXCJjaGVja2JveENsYXNzXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgICAgeyBuYW1lOiBcImhhc1NlbGVjdEFsbFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogXCJub25lVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgICAgICAgIHsgbmFtZTogXCJzZWxlY3RBbGxUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIFwiY2hlY2tib3hcIlxuICAgICAgKTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwic29ydGFibGVsaXN0XCIsIHtcbiAgICAgICAgbmFtZTogXCJlbXB0eVRleHRcIixcbiAgICAgICAgZGVmYXVsdDogXCJNb3ZlIGl0ZW1zIGhlcmUuXCIsXG4gICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgIH0pO1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydHkoXCJzb3J0YWJsZWxpc3RcIiwge1xuICAgICAgICBuYW1lOiBcInVzZURlZmF1bHRUaGVtZTpzd2l0Y2hcIixcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgfSk7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0eShcInNvcnRhYmxlbGlzdFwiLCB7XG4gICAgICAgIG5hbWU6IFwibWF4QW5zd2Vyc0NvdW50Om51bWJlclwiLFxuICAgICAgICBkZWZhdWx0OiAtMSxcbiAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBhZnRlclJlbmRlcjogZnVuY3Rpb24gKHF1ZXN0aW9uLCBlbCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoIXF1ZXN0aW9uLnVzZURlZmF1bHRUaGVtZSkge1xuICAgICAgICBzZWxmLnJvb3RTdHlsZSA9IFwiXCI7XG4gICAgICAgIHNlbGYuaXRlbVN0eWxlID0gXCJcIjtcbiAgICAgICAgc2VsZi5hcmVhU3R5bGUgPSBcIlwiO1xuICAgICAgfVxuICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9IHNlbGYucm9vdFN0eWxlO1xuICAgICAgZWwuY2xhc3NOYW1lID0gXCJzanMtc29ydGFibGVqcy1yb290XCI7XG4gICAgICB2YXIgc291cmNlLCByZXN1bHQ7XG4gICAgICB2YXIgcmVzdWx0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdmFyIGVtcHR5RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgIHZhciBzb3VyY2VFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICAgIHJlc3VsdEVsLnN0eWxlLmNzc1RleHQgPSBzZWxmLmFyZWFTdHlsZTtcbiAgICAgIHJlc3VsdEVsLnN0eWxlLmJveFNpemluZyA9IFwiYm9yZGVyLWJveFwiO1xuICAgICAgcmVzdWx0RWwuY2xhc3NOYW1lID0gXCJzanMtc29ydGFibGVqcy1yZXN1bHRcIjtcblxuICAgICAgZW1wdHlFbC5pbm5lckhUTUwgPSBxdWVzdGlvbi5lbXB0eVRleHQ7XG4gICAgICByZXN1bHRFbC5hcHBlbmRDaGlsZChlbXB0eUVsKTtcblxuICAgICAgc291cmNlRWwuc3R5bGUuY3NzVGV4dCA9IHNlbGYuYXJlYVN0eWxlO1xuICAgICAgc291cmNlRWwuc3R5bGUuYm94U2l6aW5nID0gXCJib3JkZXItYm94XCI7XG4gICAgICBzb3VyY2VFbC5jbGFzc05hbWUgPSBcInNqcy1zb3J0YWJsZWpzLXNvdXJjZVwiO1xuICAgICAgZWwuYXBwZW5kQ2hpbGQocmVzdWx0RWwpO1xuICAgICAgZWwuYXBwZW5kQ2hpbGQoc291cmNlRWwpO1xuICAgICAgdmFyIGhhc1ZhbHVlSW5SZXN1bHRzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB2YXIgcmVzID0gcXVlc3Rpb24udmFsdWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZXMpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHJlc1tpXSA9PSB2YWwpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH07XG4gICAgICB2YXIgYWRkQ2hvaWNlVG9XaWRnZXQgPSBmdW5jdGlvbiAoY2hvaWNlLCBpblJlc3VsdHMpIHtcbiAgICAgICAgdmFyIHNyY0VsID0gaW5SZXN1bHRzID8gcmVzdWx0RWwgOiBzb3VyY2VFbDtcbiAgICAgICAgdmFyIG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgbmV3RWwuY2xhc3NOYW1lID0gXCJzanMtc29ydGFibGVqcy1pdGVtXCI7XG4gICAgICAgIG5ld0VsLnN0eWxlLmNzc1RleHQgPSBzZWxmLml0ZW1TdHlsZTtcbiAgICAgICAgbmV3RWwuaW5uZXJUZXh0ID0gY2hvaWNlLnRleHQ7XG4gICAgICAgIG5ld0VsLmRhdGFzZXRbXCJ2YWx1ZVwiXSA9IGNob2ljZS52YWx1ZTtcbiAgICAgICAgc3JjRWwuYXBwZW5kQ2hpbGQobmV3RWwpO1xuICAgICAgICBjaG9pY2Uub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKGZ1bmN0aW9uIChzZW5kZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgICBuZXdFbC5pbm5lclRleHQgPSBzZW5kZXIudGV4dDtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgdmFyIGdldENob2ljZXNOb3RJblJlc3VsdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgICAgcXVlc3Rpb24udmlzaWJsZUNob2ljZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hvaWNlKSB7XG4gICAgICAgICAgaWYgKCFoYXNWYWx1ZUluUmVzdWx0cyhjaG9pY2UudmFsdWUpKSB7XG4gICAgICAgICAgICByZXMucHVzaChjaG9pY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9O1xuICAgICAgdmFyIGdldENob2ljZXNJblJlc3VsdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgICAgdmFyIHZhbCA9IHF1ZXN0aW9uLnZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHJlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgaXRlbSA9IFN1cnZleS5JdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUoXG4gICAgICAgICAgICBxdWVzdGlvbi52aXNpYmxlQ2hvaWNlcyxcbiAgICAgICAgICAgIHZhbFtpXVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCEhaXRlbSkge1xuICAgICAgICAgICAgcmVzLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9O1xuICAgICAgdmFyIGlzVXBkYXRpbmdRdWVzdGlvblZhbHVlID0gZmFsc2U7XG4gICAgICB2YXIgdXBkYXRlVmFsdWVIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNVcGRhdGluZ1F1ZXN0aW9uVmFsdWUpIHJldHVybjtcbiAgICAgICAgcmVzdWx0RWwuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgcmVzdWx0RWwuYXBwZW5kQ2hpbGQoZW1wdHlFbCk7XG4gICAgICAgIHNvdXJjZUVsLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIHZhciBub3RJblJlc3VsdHMgPSBnZXRDaG9pY2VzTm90SW5SZXN1bHRzKCk7XG4gICAgICAgIHZhciBpblJlc3VsdHMgPSBnZXRDaG9pY2VzSW5SZXN1bHRzKCk7XG4gICAgICAgIGVtcHR5RWwuc3R5bGUuZGlzcGxheSA9IGluUmVzdWx0cy5sZW5ndGggPiAwID8gXCJub25lXCIgOiBcIlwiO1xuICAgICAgICBpblJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAoY2hvaWNlKSB7XG4gICAgICAgICAgYWRkQ2hvaWNlVG9XaWRnZXQoY2hvaWNlLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG5vdEluUmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChjaG9pY2UpIHtcbiAgICAgICAgICBhZGRDaG9pY2VUb1dpZGdldChjaG9pY2UsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgcmVzdWx0ID0gcXVlc3Rpb24ucmVzdWx0RWwgPSBTb3J0YWJsZS5jcmVhdGUocmVzdWx0RWwsIHtcbiAgICAgICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgICAgIGRpc2FibGVkOiBxdWVzdGlvbi5pc1JlYWRPbmx5LFxuICAgICAgICBncm91cDoge1xuICAgICAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICAgICAgcHV0OiBmdW5jdGlvbiAodG8sIGZyb20pIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIHRvLm9wdGlvbnMuZ3JvdXAgJiYgZnJvbS5vcHRpb25zLmdyb3VwICYmIHRvLm9wdGlvbnMuZ3JvdXAubmFtZSA9PT0gZnJvbS5vcHRpb25zLmdyb3VwLm5hbWUgJiZcbiAgICAgICAgICAgICAgKHF1ZXN0aW9uLm1heEFuc3dlcnNDb3VudCA8IDAgfHxcbiAgICAgICAgICAgICAgdG8uZWwuY2hpbGRyZW4ubGVuZ3RoIDw9IHF1ZXN0aW9uLm1heEFuc3dlcnNDb3VudClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgb25Tb3J0OiBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgIGlmIChyZXN1bHRFbC5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGVtcHR5RWwuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVtcHR5RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRFbC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdEVsLmNoaWxkcmVuW2ldLmRhdGFzZXQudmFsdWUgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJlc3VsdEVsLmNoaWxkcmVuW2ldLmRhdGFzZXQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpc1VwZGF0aW5nUXVlc3Rpb25WYWx1ZSA9IHRydWU7XG4gICAgICAgICAgcXVlc3Rpb24udmFsdWUgPSByZXN1bHQ7XG4gICAgICAgICAgaXNVcGRhdGluZ1F1ZXN0aW9uVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgc291cmNlID0gcXVlc3Rpb24uc291cmNlRWwgPSBTb3J0YWJsZS5jcmVhdGUoc291cmNlRWwsIHtcbiAgICAgICAgYW5pbWF0aW9uOiAxNTAsXG4gICAgICAgIGRpc2FibGVkOiBxdWVzdGlvbi5pc1JlYWRPbmx5LFxuICAgICAgICBncm91cDogcXVlc3Rpb24ubmFtZSxcbiAgICAgIH0pO1xuICAgICAgcXVlc3Rpb24udmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSB1cGRhdGVWYWx1ZUhhbmRsZXI7XG4gICAgICBxdWVzdGlvbi5vblByb3BlcnR5Q2hhbmdlZC5hZGQoZnVuY3Rpb24gKHNlbmRlciwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucy5uYW1lID09IFwiZW1wdHlUZXh0XCIpIHtcbiAgICAgICAgICBlbXB0eUVsLmlubmVySFRNTCA9IHF1ZXN0aW9uLmVtcHR5VGV4dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBxdWVzdGlvbi5yZWFkT25seUNoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICByZXN1bHQub3B0aW9ucy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgc291cmNlLm9wdGlvbnMuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5vcHRpb25zLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgc291cmNlLm9wdGlvbnMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHF1ZXN0aW9uLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgICAgICBcInZpc2libGVDaG9pY2VzXCIsXG4gICAgICAgIHVwZGF0ZVZhbHVlSGFuZGxlclxuICAgICAgKTtcbiAgICAgIHVwZGF0ZVZhbHVlSGFuZGxlcigpO1xuICAgIH0sXG4gICAgd2lsbFVubW91bnQ6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIHF1ZXN0aW9uLnJlc3VsdEVsLmRlc3Ryb3koKTtcbiAgICAgIHF1ZXN0aW9uLnNvdXJjZUVsLmRlc3Ryb3koKTtcbiAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrID0gbnVsbDtcbiAgICB9LFxuICAgIHBkZlF1ZXN0aW9uVHlwZTogXCJjaGVja2JveFwiLFxuICB9O1xuXG4gIFN1cnZleS5DdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmFkZEN1c3RvbVdpZGdldCh3aWRnZXQsIFwiY3VzdG9tdHlwZVwiKTtcbn1cblxuaWYgKHR5cGVvZiBTdXJ2ZXkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgaW5pdChTdXJ2ZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvc29ydGFibGVqcy5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xMF9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIlNvcnRhYmxlXCIsXCJjb21tb25qczJcIjpcInNvcnRhYmxlanNcIixcImNvbW1vbmpzXCI6XCJzb3J0YWJsZWpzXCIsXCJhbWRcIjpcInNvcnRhYmxlanNcIn1cbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAyIiwiZnVuY3Rpb24gaW5pdChTdXJ2ZXkpIHtcbiAgdmFyIHdpZGdldCA9IHtcbiAgICBuYW1lOiBcImVkaXRvclwiLFxuICAgIHRpdGxlOiBcIkVkaXRvclwiLFxuICAgIGljb25OYW1lOiBcImljb24tZWRpdG9yXCIsXG4gICAgd2lkZ2V0SXNMb2FkZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgQ0tFRElUT1IgIT0gXCJ1bmRlZmluZWRcIjtcbiAgICB9LFxuICAgIGlzRml0OiBmdW5jdGlvbiAocXVlc3Rpb24pIHtcbiAgICAgIHJldHVybiBxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwiZWRpdG9yXCI7XG4gICAgfSxcbiAgICBodG1sVGVtcGxhdGU6XG4gICAgICBcIjx0ZXh0YXJlYSByb3dzPScxMCcgY29scz0nODAnIHN0eWxlOiB7d2lkdGg6JzEwMCUnfT48L3RleHRhcmVhPlwiLFxuICAgIGFjdGl2YXRlZEJ5Q2hhbmdlZDogZnVuY3Rpb24gKGFjdGl2YXRlZEJ5KSB7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcImVkaXRvclwiLCBbXSwgbnVsbCwgXCJlbXB0eVwiKTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwiZWRpdG9yXCIsIHtcbiAgICAgICAgbmFtZTogXCJoZWlnaHRcIixcbiAgICAgICAgZGVmYXVsdDogMzAwLFxuICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIGFmdGVyUmVuZGVyOiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgbmFtZSA9IHF1ZXN0aW9uLmlucHV0SWQ7XG4gICAgICBDS0VESVRPUi5lZGl0b3JDb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5sYW5ndWFnZSA9IFwiZXNcIjtcbiAgICAgICAgY29uZmlnLmhlaWdodCA9IHF1ZXN0aW9uLmhlaWdodDtcbiAgICAgICAgY29uZmlnLnRvb2xiYXJDYW5Db2xsYXBzZSA9IHRydWU7XG4gICAgICB9O1xuICAgICAgZWwubmFtZSA9IG5hbWU7XG5cbiAgICAgIGlmIChDS0VESVRPUi5pbnN0YW5jZXNbbmFtZV0pIHtcbiAgICAgICAgQ0tFRElUT1IuaW5zdGFuY2VzW25hbWVdLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICBDS0VESVRPUi5yZW1vdmUoQ0tFRElUT1IuaW5zdGFuY2VzW25hbWVdKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVkaXRvciA9IENLRURJVE9SLnJlcGxhY2UoZWwpO1xuICAgICAgQ0tFRElUT1IuaW5zdGFuY2VzW25hbWVdLmNvbmZpZy5yZWFkT25seSA9IHF1ZXN0aW9uLmlzUmVhZE9ubHk7XG5cbiAgICAgIHZhciBpc1ZhbHVlQ2hhbmdpbmcgPSBmYWxzZTtcbiAgICAgIHZhciB1cGRhdGVWYWx1ZUhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc1ZhbHVlQ2hhbmdpbmcgfHwgdHlwZW9mIHF1ZXN0aW9uLnZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgICAgIGVkaXRvci5zZXREYXRhKHF1ZXN0aW9uLnZhbHVlKTtcbiAgICAgIH07XG4gICAgICBlZGl0b3Iub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpc1ZhbHVlQ2hhbmdpbmcgPSB0cnVlO1xuICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IGVkaXRvci5nZXREYXRhKCk7XG4gICAgICAgIGlzVmFsdWVDaGFuZ2luZyA9IGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gdXBkYXRlVmFsdWVIYW5kbGVyO1xuICAgICAgcXVlc3Rpb24ucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc1JlYWRPbmx5KSB7XG4gICAgICAgICAgZWRpdG9yLnNldFJlYWRPbmx5KHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVkaXRvci5zZXRSZWFkT25seShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB1cGRhdGVWYWx1ZUhhbmRsZXIoKTtcbiAgICB9LFxuICAgIHdpbGxVbm1vdW50OiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICBxdWVzdGlvbi5yZWFkT25seUNoYW5nZWRDYWxsYmFjayA9IG51bGw7XG4gICAgICBDS0VESVRPUi5pbnN0YW5jZXNbcXVlc3Rpb24uaW5wdXRJZF0uZGVzdHJveShmYWxzZSk7XG4gICAgfSxcbiAgICBwZGZSZW5kZXI6IGZ1bmN0aW9uIChzdXJ2ZXksIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zLnF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJlZGl0b3JcIikge1xuICAgICAgICBjb25zdCBsb2MgPSBuZXcgU3VydmV5LkxvY2FsaXphYmxlU3RyaW5nKHN1cnZleSwgdHJ1ZSk7XG4gICAgICAgIGxvYy50ZXh0ID0gb3B0aW9ucy5xdWVzdGlvbi52YWx1ZSB8fCBvcHRpb25zLnF1ZXN0aW9uLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgb3B0aW9ucy5xdWVzdGlvbltcImxvY0h0bWxcIl0gPSBsb2M7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBvcHRpb25zLnF1ZXN0aW9uLnJlbmRlckFzID09PSBcInN0YW5kYXJkXCIgfHxcbiAgICAgICAgICBvcHRpb25zLnF1ZXN0aW9uLnJlbmRlckFzID09PSBcImltYWdlXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgb3B0aW9ucy5xdWVzdGlvbltcInJlbmRlckFzXCJdID0gb3B0aW9ucy5xdWVzdGlvbi5yZW5kZXJBcztcbiAgICAgICAgfSBlbHNlIG9wdGlvbnMucXVlc3Rpb25bXCJyZW5kZXJBc1wiXSA9IFwiYXV0b1wiO1xuICAgICAgICBjb25zdCBmbGF0SHRtbCA9IG9wdGlvbnMucmVwb3NpdG9yeS5jcmVhdGUoXG4gICAgICAgICAgc3VydmV5LFxuICAgICAgICAgIG9wdGlvbnMucXVlc3Rpb24sXG4gICAgICAgICAgb3B0aW9ucy5jb250cm9sbGVyLFxuICAgICAgICAgIFwiaHRtbFwiXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGZsYXRIdG1sLmdlbmVyYXRlRmxhdHMob3B0aW9ucy5wb2ludCkudGhlbihmdW5jdGlvbiAoaHRtbEJyaWNrcykge1xuICAgICAgICAgICAgb3B0aW9ucy5icmlja3MgPSBodG1sQnJpY2tzO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIFN1cnZleS5DdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmFkZEN1c3RvbVdpZGdldCh3aWRnZXQsIFwiY3VzdG9tdHlwZVwiKTtcbn1cblxuaWYgKHR5cGVvZiBTdXJ2ZXkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgaW5pdChTdXJ2ZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvY2stZWRpdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAxMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMTQiLCJmdW5jdGlvbiBpbml0KFN1cnZleSwgJCkge1xuICAkID0gJCB8fCB3aW5kb3cuJDtcbiAgdmFyIHdpZGdldCA9IHtcbiAgICBuYW1lOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgIHdpZGdldElzTG9hZGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdHlwZW9mICQgPT0gXCJmdW5jdGlvblwiICYmICEhJC5mbi5lYXN5QXV0b2NvbXBsZXRlO1xuICAgIH0sXG4gICAgaXNGaXQ6IGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJ0ZXh0XCI7XG4gICAgfSxcbiAgICBpc0RlZmF1bHRSZW5kZXI6IHRydWUsXG4gICAgYWN0aXZhdGVkQnlDaGFuZ2VkOiBmdW5jdGlvbiAoYWN0aXZhdGVkQnkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuZmluZFByb3BlcnR5KFwidGV4dFwiLCBcImNob2ljZXNcIikgIT09IG51bGwgfHxcbiAgICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuZmluZFByb3BlcnR5KFwidGV4dFwiLCBcImNob2ljZXNCeVVybFwiKSAhPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwidGV4dFwiLCB7XG4gICAgICAgIG5hbWU6IFwiY2hvaWNlczppdGVtdmFsdWVzXCIsXG4gICAgICAgIGNhdGVnb3J5OiBcImNob2ljZXNcIixcbiAgICAgICAgY2F0ZWdvcnlJbmRleDogMSxcbiAgICAgIH0pO1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydHkoXCJ0ZXh0XCIsIHtcbiAgICAgICAgbmFtZTogXCJjaG9pY2VzQnlVcmw6cmVzdGZ1bGxcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNob2ljZXNSZXN0ZnVsbFwiLFxuICAgICAgICBjYXRlZ29yeTogXCJjaG9pY2VzQnlVcmxcIixcbiAgICAgICAgY2F0ZWdvcnlJbmRleDogMixcbiAgICAgIH0pO1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydHkoXCJ0ZXh0XCIsIHtcbiAgICAgICAgbmFtZTogXCJjb25maWdcIixcbiAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgfSk7XG4gICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShcbiAgICAgICAgU3VydmV5Lm1hdHJpeERyb3Bkb3duQ29sdW1uVHlwZXMudGV4dC5wcm9wZXJ0aWVzLFxuICAgICAgICBbXCJjaG9pY2VzXCIsIFwiY2hvaWNlc09yZGVyXCIsIFwiY2hvaWNlc0J5VXJsXCIsIFwib3RoZXJUZXh0XCJdXG4gICAgICApO1xuICAgIH0sXG4gICAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIHZhciAkZWwgPSAkKGVsKS5pcyhcImlucHV0XCIpID8gJChlbCkgOiAkKGVsKS5maW5kKFwiaW5wdXRcIik7XG5cbiAgICAgIHZhciBnZXRDc3NTZWxlY3RvckZyb21DbGFzc2VzU3RyaW5nID0gZnVuY3Rpb24gKGNsYXNzZXNTdHJpbmcpIHtcbiAgICAgICAgaWYgKCFjbGFzc2VzU3RyaW5nKSByZXR1cm4gXCJcIjtcbiAgICAgICAgdmFyIGNzc1NlbGVjdG9yID0gY2xhc3Nlc1N0cmluZy5yZXBsYWNlKC8oXlxccyopfChcXHMrKS9nLCBcIi5cIik7IC8vIHJlcGxhY2Ugd2hpdGVzcGFjZXMgd2l0aCAnLidcbiAgICAgICAgcmV0dXJuIGNzc1NlbGVjdG9yO1xuICAgICAgfTtcblxuICAgICAgdmFyIHF1ZXN0aW9uUm9vdENsYXNzZXMgPSBnZXRDc3NTZWxlY3RvckZyb21DbGFzc2VzU3RyaW5nKFxuICAgICAgICBxdWVzdGlvbi5jc3NSb290XG4gICAgICApO1xuXG4gICAgICB2YXIgcXVlc3Rpb25Sb290ID0gJGVsLnBhcmVudHMocXVlc3Rpb25Sb290Q2xhc3NlcylbMF07XG4gICAgICBpZiAoISFxdWVzdGlvblJvb3RDbGFzc2VzICYmICEhcXVlc3Rpb25Sb290KSB7XG4gICAgICAgIHF1ZXN0aW9uUm9vdC5zdHlsZS5vdmVyZmxvdyA9IFwidmlzaWJsZVwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29uZmlnID0gcXVlc3Rpb24uY29uZmlnO1xuICAgICAgdmFyIG9wdGlvbnMgPVxuICAgICAgICBjb25maWcgJiYgdHlwZW9mIGNvbmZpZyA9PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShjb25maWcpIDogY29uZmlnO1xuICAgICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG5cbiAgICAgIG9wdGlvbnMuZGF0YSA9IChxdWVzdGlvbi5jaG9pY2VzIHx8IFtdKS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0udGV4dDtcbiAgICAgIH0pO1xuICAgICAgaWYgKG9wdGlvbnMuYWRqdXN0V2lkdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHRpb25zLmFkanVzdFdpZHRoID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIW9wdGlvbnMubGlzdCkge1xuICAgICAgICBvcHRpb25zLmxpc3QgPSB7XG4gICAgICAgICAgc29ydDoge1xuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1hdGNoOiB7XG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25TZWxlY3RJdGVtRXZlbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGVkRGF0YSA9ICRlbC5nZXRTZWxlY3RlZEl0ZW1EYXRhKCk7XG4gICAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoIW9wdGlvbnMucGxhY2Vob2xkZXIpIHtcbiAgICAgICAgb3B0aW9ucy5wbGFjZWhvbGRlciA9IHF1ZXN0aW9uLnBsYWNlaG9sZGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoISFxdWVzdGlvbi5jaG9pY2VzQnlVcmwpIHtcbiAgICAgICAgb3B0aW9ucy51cmwgPSBmdW5jdGlvbiAocGhyYXNlKSB7XG4gICAgICAgICAgcmV0dXJuIHF1ZXN0aW9uLmNob2ljZXNCeVVybC51cmw7XG4gICAgICAgIH07XG4gICAgICAgIG9wdGlvbnMuZ2V0VmFsdWUgPSBxdWVzdGlvbi5jaG9pY2VzQnlVcmwudmFsdWVOYW1lO1xuICAgICAgICAvLyBvcHRpb25zLmFqYXhTZXR0aW5ncyA9IHtcbiAgICAgICAgLy8gICBkYXRhVHlwZTogXCJqc29ucFwiXG4gICAgICAgIC8vIH07XG4gICAgICB9XG4gICAgICAkZWwuZWFzeUF1dG9jb21wbGV0ZShvcHRpb25zKTtcblxuICAgICAgJGVsWzBdLm9uaW5wdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHF1ZXN0aW9uLmN1c3RvbVdpZGdldERhdGEuaXNOZWVkUmVuZGVyID0gdHJ1ZTtcbiAgICAgIH07XG4gICAgICB2YXIgdXBkYXRlSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJGVsWzBdLnZhbHVlID1cbiAgICAgICAgICB0eXBlb2YgcXVlc3Rpb24udmFsdWUgPT09IFwidW5kZWZpbmVkXCIgPyBcIlwiIDogcXVlc3Rpb24udmFsdWU7XG4gICAgICB9O1xuICAgICAgcXVlc3Rpb24udmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSB1cGRhdGVIYW5kbGVyO1xuICAgICAgdXBkYXRlSGFuZGxlcigpO1xuICAgIH0sXG4gICAgd2lsbFVubW91bnQ6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIC8vIHZhciAkZWwgPSAkKGVsKS5maW5kKFwiaW5wdXRcIik7XG4gICAgICAvLyAkZWwuYXV0b2NvbXBsZXRlKFwiZGVzdHJveVwiKTtcbiAgICB9LFxuICB9O1xuXG4gIFN1cnZleS5DdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmFkZEN1c3RvbVdpZGdldCh3aWRnZXQsIFwidHlwZVwiKTtcbn1cblxuaWYgKHR5cGVvZiBTdXJ2ZXkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgaW5pdChTdXJ2ZXksIHdpbmRvdy4kKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5pdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2Vhc3ktYXV0b2NvbXBsZXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMTMiLCJmdW5jdGlvbiBpbml0KFN1cnZleSkge1xuICB2YXIgd2lkZ2V0ID0ge1xuICAgIHNldHRpbmdzOiB7XG4gICAgICBzdXBwb3J0ZWRUeXBlczogW1wicmFkaW9ncm91cFwiLCBcImNoZWNrYm94XCIsIFwiYm9vbGVhblwiXSxcbiAgICAgIHJhZGlvZ3JvdXA6IHtcbiAgICAgICAgcm9vdENsYXNzOiBcInByZXR0eSBwLWRlZmF1bHQgcC1yb3VuZFwiLFxuICAgICAgICBpbnB1dFR5cGU6IFwicmFkaW9cIixcbiAgICAgICAgc3RhdGVzOiBbeyBzdGF0ZUNsYXNzOiBcInN0YXRlIHAtc3VjY2Vzc1wiLCBhZGRPbjogXCJcIiB9XSxcbiAgICAgIH0sXG4gICAgICBjaGVja2JveDoge1xuICAgICAgICByb290Q2xhc3M6IFwicHJldHR5IHAtZGVmYXVsdFwiLFxuICAgICAgICBpbnB1dFR5cGU6IFwiY2hlY2tib3hcIixcbiAgICAgICAgc3RhdGVzOiBbeyBzdGF0ZUNsYXNzOiBcInN0YXRlIHAtc3VjY2Vzc1wiLCBhZGRPbjogXCJcIiB9XSxcbiAgICAgIH0sXG4gICAgICBib29sZWFuOiB7XG4gICAgICAgIHJvb3RDbGFzczogXCJwcmV0dHkgcC1pY29uIHAtZGVmYXVsdCBwLWhhcy1pbmRldGVybWluYXRlXCIsXG4gICAgICAgIGlucHV0VHlwZTogXCJjaGVja2JveFwiLFxuICAgICAgICBzdGF0ZXM6IFtcbiAgICAgICAgICB7IHN0YXRlQ2xhc3M6IFwic3RhdGUgcC1zdWNjZXNzXCIsIGFkZE9uOiBcIlwiIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdGVDbGFzczogXCJzdGF0ZSBwLXN1Y2Nlc3MgcC1pcy1pbmRldGVybWluYXRlXCIsXG4gICAgICAgICAgICBpY29uQ2xhc3M6IFwiaWNvbiBtZGkgbWRpLW1pbnVzXCIsXG4gICAgICAgICAgICBhZGRPbjogXCJcIixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIG5hbWU6IFwicHJldHR5LWNoZWNrYm94XCIsXG4gICAgYWN0aXZhdGVkQnk6IFwicHJvcGVydHlcIixcbiAgICB3aWRnZXRJc0xvYWRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBodG1sVGVtcGxhdGU6IFwiPGZpZWxkc2V0PjwvZmllbGRzZXQ+XCIsXG4gICAgaXNGaXQ6IGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgdmFyIGlzRml0QnlUeXBlID1cbiAgICAgICAgd2lkZ2V0LnNldHRpbmdzLnN1cHBvcnRlZFR5cGVzLmluZGV4T2YocXVlc3Rpb24uZ2V0VHlwZSgpKSAhPT0gLTE7XG5cbiAgICAgIGlmICh3aWRnZXQuYWN0aXZhdGVkQnkgPT09IFwicHJvcGVydHlcIikge1xuICAgICAgICByZXR1cm4gcXVlc3Rpb25bXCJyZW5kZXJBc1wiXSA9PT0gXCJwcmV0dHljaGVja2JveFwiICYmIGlzRml0QnlUeXBlO1xuICAgICAgfSBlbHNlIGlmICh3aWRnZXQuYWN0aXZhdGVkQnkgPT09IFwidHlwZVwiKSB7XG4gICAgICAgIHJldHVybiBpc0ZpdEJ5VHlwZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgYWN0aXZhdGVkQnlDaGFuZ2VkOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLndpZGdldElzTG9hZGVkKCkpIHtcbiAgICAgICAgd2lkZ2V0LmFjdGl2YXRlZEJ5ID0gdmFsdWU7XG4gICAgICAgIHdpZGdldC5zZXR0aW5ncy5zdXBwb3J0ZWRUeXBlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdXBwb3J0ZWRUeXBlKSB7XG4gICAgICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEucmVtb3ZlUHJvcGVydHkoc3VwcG9ydGVkVHlwZSwgXCJyZW5kZXJBc1wiKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJwcm9wZXJ0eVwiKSB7XG4gICAgICAgICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0eShzdXBwb3J0ZWRUeXBlLCB7XG4gICAgICAgICAgICAgIG5hbWU6IFwicmVuZGVyQXNcIixcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICAgICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgICAgICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInByZXR0eWNoZWNrYm94XCJdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGlzRGVmYXVsdFJlbmRlcjogZmFsc2UsXG4gICAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWxlbWVudCkge1xuICAgICAgdmFyIGl0ZW1JbnB1dHMgPSB7fTtcbiAgICAgIHZhciBxdWVzdGlvblR5cGUgPSBxdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMuc2V0dGluZ3NbcXVlc3Rpb25UeXBlXTtcbiAgICAgIHZhciBjaGVja2JveFR5cGUgPSBxdWVzdGlvblR5cGUgPT09IFwiY2hlY2tib3hcIjtcbiAgICAgIHZhciByYWRpb2dyb3VwVHlwZSA9IHF1ZXN0aW9uVHlwZSA9PT0gXCJyYWRpb2dyb3VwXCI7XG4gICAgICB2YXIgYm9vbGVhblR5cGUgPSBxdWVzdGlvblR5cGUgPT09IFwiYm9vbGVhblwiO1xuXG4gICAgICB2YXIgaW5DaGFuZ2VIYW5kbGVyID0gZmFsc2U7XG4gICAgICB2YXIgY2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpbkNoYW5nZUhhbmRsZXIgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciB0YXJnZXQgPSBhcmd1bWVudHNbMF0udGFyZ2V0O1xuICAgICAgICAgIHZhciB0YXJnZXRWYWx1ZSA9IHRhcmdldC52YWx1ZTtcbiAgICAgICAgICB2YXIgdGFyZ2V0Q2hlY2tlZCA9IHRhcmdldC5jaGVja2VkO1xuXG4gICAgICAgICAgaWYgKGNoZWNrYm94VHlwZSkge1xuICAgICAgICAgICAgdmFyIHF1ZXN0aW9uVmFsdWUgPSBxdWVzdGlvbi5jcmVhdGVWYWx1ZUNvcHkoKSB8fCBbXTtcbiAgICAgICAgICAgIHZhciB2YWx1ZUluZGV4ID0gcXVlc3Rpb25WYWx1ZS5pbmRleE9mKHRhcmdldFZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0YXJnZXRDaGVja2VkKSB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZUluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHF1ZXN0aW9uVmFsdWUucHVzaCh0YXJnZXRWYWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHF1ZXN0aW9uVmFsdWUuc3BsaWNlKHZhbHVlSW5kZXgsIDEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHF1ZXN0aW9uLnZhbHVlID0gcXVlc3Rpb25WYWx1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJhZGlvZ3JvdXBUeXBlKSB7XG4gICAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IHRhcmdldFZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IHRhcmdldENoZWNrZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGluQ2hhbmdlSGFuZGxlciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgaXRlbVdpZHRoID1cbiAgICAgICAgcXVlc3Rpb24uY29sQ291bnQgPiAwID8gMTAwIC8gcXVlc3Rpb24uY29sQ291bnQgKyBcIiVcIiA6IFwiXCI7XG5cbiAgICAgIHZhciBjaG9pY2VzID0gYm9vbGVhblR5cGVcbiAgICAgICAgPyBbeyBsb2NUZXh0OiBxdWVzdGlvbi5sb2NUaXRsZSwgdmFsdWU6ICEhcXVlc3Rpb24udmFsdWUgfV1cbiAgICAgICAgOiBxdWVzdGlvbi52aXNpYmxlQ2hvaWNlcztcbiAgICAgIGNob2ljZXMuZm9yRWFjaChmdW5jdGlvbiAoY2hvaWNlSXRlbSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBpbnB1dC50eXBlID0gb3B0aW9ucy5pbnB1dFR5cGU7XG4gICAgICAgIGlucHV0Lm5hbWUgPSBxdWVzdGlvbi5uYW1lICsgKGNoZWNrYm94VHlwZSA/IFwiXCIgKyBpbmRleCA6IFwiXCIpO1xuICAgICAgICBpbnB1dC5vbmNoYW5nZSA9IGNoYW5nZUhhbmRsZXI7XG4gICAgICAgIGlucHV0LnZhbHVlID0gY2hvaWNlSXRlbS52YWx1ZTtcblxuICAgICAgICBpZiAoYm9vbGVhblR5cGUgJiYgcXVlc3Rpb24udmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBpbnB1dC5pbmRldGVybWluYXRlID0gcXVlc3Rpb24uZGVmYXVsdFZhbHVlID09PSBcImluZGV0ZXJtaW5hdGVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb250cm9sUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGNvbnRyb2xSb290LmNsYXNzTmFtZSA9IG9wdGlvbnMucm9vdENsYXNzO1xuICAgICAgICBjb250cm9sUm9vdC5hcHBlbmRDaGlsZChpbnB1dCk7XG5cbiAgICAgICAgb3B0aW9ucy5zdGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgICB2YXIgc3RhdGVSb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICBzdGF0ZVJvb3QuY2xhc3NOYW1lID0gc3RhdGUuc3RhdGVDbGFzcztcbiAgICAgICAgICBpZiAoISFzdGF0ZS5pY29uQ2xhc3MpIHtcbiAgICAgICAgICAgIHZhciBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlcIik7XG4gICAgICAgICAgICBpY29uLmNsYXNzTmFtZSA9IHN0YXRlLmljb25DbGFzcztcbiAgICAgICAgICAgIHN0YXRlUm9vdC5hcHBlbmRDaGlsZChpY29uKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gICAgICAgICAgaWYgKGNob2ljZUl0ZW0ubG9jVGV4dC5oYXNIdG1sKSB7XG4gICAgICAgICAgICBsYWJlbC5pbm5lckhUTUwgPSBjaG9pY2VJdGVtLmxvY1RleHQuaHRtbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBjaG9pY2VJdGVtLmxvY1RleHQucmVuZGVyZWRUZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZVJvb3QuYXBwZW5kQ2hpbGQobGFiZWwpO1xuXG4gICAgICAgICAgY29udHJvbFJvb3QuYXBwZW5kQ2hpbGQoc3RhdGVSb290KTtcbiAgICAgICAgICBpZiAoISFzdGF0ZS5hZGRPbikge1xuICAgICAgICAgICAgc3RhdGVSb290Lmluc2VydEFkamFjZW50SFRNTChcImFmdGVyYmVnaW5cIiwgc3RhdGUuYWRkT24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGl0ZW1Sb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgaXRlbVJvb3QuY2xhc3NOYW1lID0gXCJzdl9jd19wcmV0dHlfY2hlY2tib3hfXCIgKyBxdWVzdGlvblR5cGU7XG4gICAgICAgIGl0ZW1Sb290LnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuICAgICAgICBpdGVtUm9vdC5zdHlsZS53aWR0aCA9IGl0ZW1XaWR0aDtcbiAgICAgICAgaXRlbVJvb3QuYXBwZW5kQ2hpbGQoY29udHJvbFJvb3QpO1xuXG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbVJvb3QpO1xuXG4gICAgICAgIGl0ZW1JbnB1dHNbY2hvaWNlSXRlbS52YWx1ZV0gPSBpbnB1dDtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgdXBkYXRlVmFsdWVIYW5kbGVyID0gZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgIGlmICghaW5DaGFuZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgdmFyIGNoZWNrZWRJdGVtcyA9IG5ld1ZhbHVlIHx8IFtdO1xuICAgICAgICAgIGlmIChyYWRpb2dyb3VwVHlwZSB8fCBib29sZWFuVHlwZSkge1xuICAgICAgICAgICAgY2hlY2tlZEl0ZW1zID0gW25ld1ZhbHVlICYmIG5ld1ZhbHVlLnRvU3RyaW5nKCldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIE9iamVjdC52YWx1ZXMoaXRlbUlucHV0cykuZm9yRWFjaChmdW5jdGlvbiAoaW5wdXRJdGVtKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tlZEl0ZW1zLmluZGV4T2YoaW5wdXRJdGVtLnZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgaW5wdXRJdGVtLnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlucHV0SXRlbS5yZW1vdmVBdHRyaWJ1dGUoXCJjaGVja2VkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIHJlYWRPbmx5SGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhpdGVtSW5wdXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChpbnB1dEl0ZW0pIHtcbiAgICAgICAgICBpZiAocXVlc3Rpb24uaXNSZWFkT25seSkge1xuICAgICAgICAgICAgaW5wdXRJdGVtLnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dEl0ZW0ucmVtb3ZlQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gdXBkYXRlVmFsdWVIYW5kbGVyO1xuICAgICAgcXVlc3Rpb24ucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2sgPSByZWFkT25seUhhbmRsZXI7XG4gICAgICB1cGRhdGVWYWx1ZUhhbmRsZXIocXVlc3Rpb24udmFsdWUpO1xuICAgICAgcmVhZE9ubHlIYW5kbGVyKCk7XG4gICAgfSxcbiAgICB3aWxsVW5tb3VudDogZnVuY3Rpb24gKHF1ZXN0aW9uLCBlbCkge1xuICAgICAgcXVlc3Rpb24udmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICBxdWVzdGlvbi5yZWFkT25seUNoYW5nZWRDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9O1xuXG4gIFN1cnZleS5DdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmFkZEN1c3RvbVdpZGdldCh3aWRnZXQsIFwicHJvcGVydHlcIik7XG59XG5cbmlmICh0eXBlb2YgU3VydmV5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIGluaXQoU3VydmV5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5pdDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL3ByZXR0eS1jaGVja2JveC5qc1xuLy8gbW9kdWxlIGlkID0gMTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDgiLCJ2YXIgU2xpZGVyID0gcmVxdWlyZShcImJvb3RzdHJhcC1zbGlkZXJcIik7XG5cbmZ1bmN0aW9uIGluaXQoU3VydmV5KSB7XG4gIHZhciB3aWRnZXQgPSB7XG4gICAgbmFtZTogXCJib290c3RyYXBzbGlkZXJcIixcbiAgICB0aXRsZTogXCJCb290c3RyYXAgU2xpZGVyXCIsXG4gICAgaWNvbk5hbWU6IFwiaWNvbi1ib290c3RyYXAtc2xpZGVyXCIsXG4gICAgd2lkZ2V0SXNMb2FkZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgU2xpZGVyICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIH0sXG4gICAgaXNGaXQ6IGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJib290c3RyYXBzbGlkZXJcIjtcbiAgICB9LFxuICAgIGh0bWxUZW1wbGF0ZTogXCI8ZGl2PjwvZGl2PlwiLFxuICAgIGFjdGl2YXRlZEJ5Q2hhbmdlZDogZnVuY3Rpb24gKGFjdGl2YXRlZEJ5KSB7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcImJvb3RzdHJhcHNsaWRlclwiLCBbXSwgbnVsbCwgXCJlbXB0eVwiKTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnRpZXMoXCJib290c3RyYXBzbGlkZXJcIiwgW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJzdGVwOm51bWJlclwiLFxuICAgICAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyYW5nZU1pbjpudW1iZXJcIixcbiAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicmFuZ2VNYXg6bnVtYmVyXCIsXG4gICAgICAgICAgZGVmYXVsdDogMTAwLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwib3JpZW50YXRpb25cIixcbiAgICAgICAgICBkZWZhdWx0OiBcImhvcml6b250YWxcIixcbiAgICAgICAgICBjaG9pY2VzOiBbXCJob3Jpem9udGFsXCIsIFwidmVydGljYWxcIl0sXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZFByb3BlcnR5KFwiYm9vdHN0cmFwc2xpZGVyXCIsIHtcbiAgICAgICAgbmFtZTogXCJjb25maWdcIixcbiAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBhZnRlclJlbmRlcjogZnVuY3Rpb24gKHF1ZXN0aW9uLCBlbCkge1xuICAgICAgZWwuc3R5bGUucGFkZGluZ1RvcCA9IFwiMjBweFwiO1xuICAgICAgZWwuc3R5bGUucGFkZGluZ0JvdHRvbSA9IFwiMTdweFwiO1xuICAgICAgZWwuc3R5bGUucGFkZGluZ0xlZnQgPSBcIjEwcHhcIjtcbiAgICAgIHZhciBpbnB1dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgaW5wdXRFbC5pZCA9IHF1ZXN0aW9uLmlkO1xuICAgICAgaW5wdXRFbC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICBpbnB1dEVsLnNldEF0dHJpYnV0ZShcImRhdGEtc2xpZGVyLWlkXCIsIHF1ZXN0aW9uLm5hbWUgKyBcIl9cIiArIHF1ZXN0aW9uLmlkKTtcbiAgICAgIGlucHV0RWwuc2V0QXR0cmlidXRlKFwiZGF0YS1zbGlkZXItbWluXCIsIHF1ZXN0aW9uLnJhbmdlTWluKTtcbiAgICAgIGlucHV0RWwuc2V0QXR0cmlidXRlKFwiZGF0YS1zbGlkZXItbWF4XCIsIHF1ZXN0aW9uLnJhbmdlTWF4KTtcbiAgICAgIGlucHV0RWwuc2V0QXR0cmlidXRlKFwiZGF0YS1zbGlkZXItc3RlcFwiLCBxdWVzdGlvbi5zdGVwKTtcbiAgICAgIGlmKHF1ZXN0aW9uLm9yaWVudGF0aW9uID09IFwidmVydGljYWxcIikge1xuICAgICAgICBpbnB1dEVsLnNldEF0dHJpYnV0ZShcImRhdGEtc2xpZGVyLW9yaWVudGF0aW9uXCIsIFwidmVydGljYWxcIik7XG4gICAgICB9XG4gICAgICBpbnB1dEVsLnNldEF0dHJpYnV0ZShcImRhdGEtc2xpZGVyLXN0ZXBcIiwgcXVlc3Rpb24uc3RlcCk7XG4gICAgICBpbnB1dEVsLnNldEF0dHJpYnV0ZShcbiAgICAgICAgXCJkYXRhLXNsaWRlci12YWx1ZVwiLFxuICAgICAgICBxdWVzdGlvbi52YWx1ZSB8fCBxdWVzdGlvbi5yYW5nZU1pblxuICAgICAgKTtcbiAgICAgIGVsLmFwcGVuZENoaWxkKGlucHV0RWwpO1xuXG4gICAgICB2YXIgY29uZmlnID0gcXVlc3Rpb24uY29uZmlnIHx8IHt9O1xuXG4gICAgICBpZiAoY29uZmlnLmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uZmlnLmlkID0gcXVlc3Rpb24ubmFtZSArIFwiX1wiICsgcXVlc3Rpb24uaWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcubWluID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uZmlnLm1pbiA9IHF1ZXN0aW9uLnJhbmdlTWluO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm1heCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbmZpZy5tYXggPSBxdWVzdGlvbi5yYW5nZU1heDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5zdGVwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uZmlnLnN0ZXAgPSBxdWVzdGlvbi5zdGVwO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLmVuYWJsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25maWcuZW5hYmxlZCA9ICFxdWVzdGlvbi5pc1JlYWRPbmx5O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uZmlnLnZhbHVlID0gcXVlc3Rpb24udmFsdWUgfHwgcXVlc3Rpb24ucmFuZ2VNaW47XG4gICAgICB9XG5cbiAgICAgIHZhciBzbGlkZXIgPSBuZXcgU2xpZGVyKGlucHV0RWwsIGNvbmZpZyk7XG5cbiAgICAgIHNsaWRlci5vbihcImNoYW5nZVwiLCBmdW5jdGlvbiAodmFsdWVPYmopIHtcbiAgICAgICAgcXVlc3Rpb24udmFsdWUgPSBzbGlkZXIuZ2V0VmFsdWUoKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHVwZGF0ZVZhbHVlSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2xpZGVyLnNldFZhbHVlKHF1ZXN0aW9uLnZhbHVlIHx8IHF1ZXN0aW9uLnJhbmdlTWluKTtcbiAgICAgIH07XG4gICAgICBxdWVzdGlvbi5yZWFkT25seUNoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICBzbGlkZXIuZGlzYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNsaWRlci5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHF1ZXN0aW9uLmJvb3RzdHJhcFNsaWRlciA9IHNsaWRlcjtcbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gdXBkYXRlVmFsdWVIYW5kbGVyO1xuICAgIH0sXG4gICAgd2lsbFVubW91bnQ6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHtcbiAgICAgIHF1ZXN0aW9uLmJvb3RzdHJhcFNsaWRlciAmJiBxdWVzdGlvbi5ib290c3RyYXBTbGlkZXIuZGVzdHJveSgpO1xuICAgICAgcXVlc3Rpb24uYm9vdHN0cmFwU2xpZGVyID0gbnVsbDtcbiAgICAgIHF1ZXN0aW9uLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrID0gbnVsbDtcbiAgICB9LFxuICAgIHBkZlJlbmRlcjogZnVuY3Rpb24gKF8sIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zLnF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJib290c3RyYXBzbGlkZXJcIikge1xuICAgICAgICB2YXIgcG9pbnQgPSBvcHRpb25zLm1vZHVsZS5TdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoXG4gICAgICAgICAgb3B0aW9ucy5tb2R1bGUuU3VydmV5SGVscGVyLm1lcmdlUmVjdHMuYXBwbHkobnVsbCwgb3B0aW9ucy5icmlja3MpXG4gICAgICAgICk7XG4gICAgICAgIHBvaW50LnhMZWZ0ICs9IG9wdGlvbnMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgIHBvaW50LnlUb3AgKz1cbiAgICAgICAgICBvcHRpb25zLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqXG4gICAgICAgICAgb3B0aW9ucy5tb2R1bGUuRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEU7XG4gICAgICAgIHZhciByZWN0ID0gb3B0aW9ucy5tb2R1bGUuU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3QoXG4gICAgICAgICAgcG9pbnQsXG4gICAgICAgICAgb3B0aW9ucy5jb250cm9sbGVyXG4gICAgICAgICk7XG4gICAgICAgIHZhciB0ZXh0Ym94QnJpY2sgPSBuZXcgb3B0aW9ucy5tb2R1bGUuVGV4dEZpZWxkQnJpY2soXG4gICAgICAgICAgb3B0aW9ucy5xdWVzdGlvbixcbiAgICAgICAgICBvcHRpb25zLmNvbnRyb2xsZXIsXG4gICAgICAgICAgcmVjdCxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIG9wdGlvbnMucXVlc3Rpb24uaWQsXG4gICAgICAgICAgKFxuICAgICAgICAgICAgb3B0aW9ucy5xdWVzdGlvbi52YWx1ZSB8fFxuICAgICAgICAgICAgb3B0aW9ucy5xdWVzdGlvbi5kZWZhdWx0VmFsdWUgfHxcbiAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICApLnRvU3RyaW5nKCksXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgICBvcHRpb25zLnF1ZXN0aW9uLmlzUmVhZE9ubHksXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgXCJ0ZXh0XCJcbiAgICAgICAgKTtcbiAgICAgICAgb3B0aW9ucy5icmlja3MucHVzaCh0ZXh0Ym94QnJpY2spO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgU3VydmV5LkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldCwgXCJjdXN0b210eXBlXCIpO1xufVxuXG5pZiAodHlwZW9mIFN1cnZleSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICBpbml0KFN1cnZleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9ib290c3RyYXAtc2xpZGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAgNSIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xNV9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIlNsaWRlclwiLFwiY29tbW9uanMyXCI6XCJib290c3RyYXAtc2xpZGVyXCIsXCJjb21tb25qc1wiOlwiYm9vdHN0cmFwLXNsaWRlclwiLFwiYW1kXCI6XCJib290c3RyYXAtc2xpZGVyXCJ9XG4vLyBtb2R1bGUgaWQgPSAxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgNSIsImltcG9ydCBSZWNvcmRSVEMgZnJvbSBcInJlY29yZHJ0Y1wiO1xuXG5mdW5jdGlvbiBpbml0KFN1cnZleSkge1xuICB2YXIgd2lkZ2V0ID0ge1xuICAgIG5hbWU6IFwibWljcm9waG9uZVwiLFxuICAgIHRpdGxlOiBcIk1pY3JvcGhvbmVcIixcbiAgICBpY29uTmFtZTogXCJpY29uLW1pY3JvcGhvbmVcIixcbiAgICB3aWRnZXRJc0xvYWRlZDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIFJlY29yZFJUQyAhPSBcInVuZGVmaW5lZFwiO1xuICAgIH0sXG4gICAgaXNGaXQ6IGZ1bmN0aW9uKHF1ZXN0aW9uKSB7XG4gICAgICByZXR1cm4gcXVlc3Rpb24uZ2V0VHlwZSgpID09PSBcIm1pY3JvcGhvbmVcIjtcbiAgICB9LFxuICAgIGh0bWxUZW1wbGF0ZTpcbiAgICAgIFwiPGRpdiBzdHlsZT0naGVpZ2h0OiAzOXB4Jz5cIiArXG4gICAgICBcIjxidXR0b24gdHlwZT0nYnV0dG9uJyAgdGl0bGU9J1JlY29yZCcgc3R5bGU9J3ZlcnRpY2FsLWFsaWduOiB0b3A7IG1hcmdpbi10b3A6IDNweCcgPjxpIGNsYXNzPSdmYSBmYS1taWNyb3Bob25lJyBhcmlhLWhpZGRlbj0ndHJ1ZSc+PC9pPjwvYnV0dG9uPlwiICtcbiAgICAgIFwiJm5ic3A7PGJ1dHRvbiB0eXBlPSdidXR0b24nIHRpdGxlPSdTYXZlJyBzdHlsZT0ndmVydGljYWwtYWxpZ246IHRvcDsgbWFyZ2luLXRvcDogM3B4Jz48aSBjbGFzcz0nZmEgZmEtY2xvdWQnIGFyaWEtaGlkZGVuPSd0cnVlJyA+PC9pPjwvYnV0dG9uPlwiICtcbiAgICAgIFwiJm5ic3A7PGF1ZGlvIHN0eWxlPSdcIiArXG4gICAgICBcInZlcnRpY2FsLWFsaWduOiB0b3A7XCIgK1xuICAgICAgXCJtYXJnaW4tbGVmdDogMTBweDtcIiArXG4gICAgICBcImhlaWdodDozNXB4O1wiICtcbiAgICAgIFwiLW1vei1ib3gtc2hhZG93OiAycHggMnB4IDRweCAwcHggIzAwNjc3MztcIiArXG4gICAgICBcIi13ZWJraXQtYm94LXNoYWRvdzogIDJweCAycHggNHB4IDBweCAjMDA2NzczO1wiICtcbiAgICAgIFwiYm94LXNoYWRvdzogMnB4IDJweCA0cHggMHB4ICMwMDY3NzM7XCIgK1xuICAgICAgXCInIFwiICtcbiAgICAgIFwiY29udHJvbHM9J3RydWUnID5cIiArXG4gICAgICBcIjwvYXVkaW8+XCIgK1xuICAgICAgXCI8L2Rpdj5cIixcbiAgICBhY3RpdmF0ZWRCeUNoYW5nZWQ6IGZ1bmN0aW9uKGFjdGl2YXRlZEJ5KSB7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcIm1pY3JvcGhvbmVcIiwgW10sIG51bGwsIFwiZW1wdHlcIik7XG4gICAgfSxcblxuICAgIGFmdGVyUmVuZGVyOiBmdW5jdGlvbihxdWVzdGlvbiwgZWwpIHtcbiAgICAgIHZhciByb290V2lkZ2V0ID0gdGhpcztcbiAgICAgIHZhciBidXR0b25TdGFydEVsID0gZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJidXR0b25cIilbMF07XG4gICAgICB2YXIgYnV0dG9uU3RvcEVsID0gZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJidXR0b25cIilbMV07XG4gICAgICB2YXIgYXVkaW9FbCA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYXVkaW9cIilbMF07XG5cbiAgICAgIC8vLy8vLy8vLy8gIFJlY29yZFJUQyBsb2dpY1xuXG4gICAgICB2YXIgc3VjY2Vzc0NhbGxiYWNrID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgIHR5cGU6IFwiYXVkaW9cIixcbiAgICAgICAgICBtaW1lVHlwZTogXCJhdWRpby93ZWJtXCIsXG4gICAgICAgICAgYXVkaW9CaXRzUGVyU2Vjb25kOiA0NDEwMCxcbiAgICAgICAgICBzYW1wbGVSYXRlOiA0NDEwMCxcbiAgICAgICAgICBidWZmZXJTaXplOiAxNjM4NCxcbiAgICAgICAgICBudW1iZXJPZkF1ZGlvQ2hhbm5lbHM6IDFcbiAgICAgICAgfTtcbiAgICAgICAgY29uc29sZS5sb2coXCJzdWNjZXNzQ2FsbGJhY2tcIik7XG4gICAgICAgIHF1ZXN0aW9uLnN1cnZleS5teXN0cmVhbSA9IHN0cmVhbTtcbiAgICAgICAgcXVlc3Rpb24uc3VydmV5LnJlY29yZFJUQyA9IFJlY29yZFJUQyhcbiAgICAgICAgICBxdWVzdGlvbi5zdXJ2ZXkubXlzdHJlYW0sXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXN0aW9uLnN1cnZleS5yZWNvcmRSVEMgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwic3RhcnRSZWNvcmRpbmdcIik7XG4gICAgICAgICAgcXVlc3Rpb24uc3VydmV5LnJlY29yZFJUQy5zdGFydFJlY29yZGluZygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBhbGVydChcIk5vIG1pY3JvcGhvbmVcIik7XG4gICAgICAgIHF1ZXN0aW9uLnN1cnZleS5yZWNvcmRSVEMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHF1ZXN0aW9uLnN1cnZleS5teXN0cmVhbSA9IHVuZGVmaW5lZDtcbiAgICAgIH07XG5cbiAgICAgIHZhciBwcm9jZXNzQXVkaW8gPSBmdW5jdGlvbihhdWRpb1ZpZGVvV2ViTVVSTCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcInByb2Nlc3NBdWRpb1wiKTtcbiAgICAgICAgdmFyIHJlY29yZGVkQmxvYiA9IHF1ZXN0aW9uLnN1cnZleS5yZWNvcmRSVEMuZ2V0QmxvYigpO1xuXG4gICAgICAgIHZhciBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHZhciBkYXRhVXJpID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImRhdGFVcmk6IFwiICsgZGF0YVVyaSk7XG4gICAgICAgICAgcXVlc3Rpb24udmFsdWUgPSBkYXRhVXJpO1xuICAgICAgICAgIGF1ZGlvRWwuc3JjID0gZGF0YVVyaTtcblxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2xlYW5pbmdcIik7XG4gICAgICAgICAgcXVlc3Rpb24uc3VydmV5LnJlY29yZFJUQyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBxdWVzdGlvbi5zdXJ2ZXkubXlzdHJlYW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChyZWNvcmRlZEJsb2IpO1xuICAgICAgfTtcblxuICAgICAgdmFyIHN0YXJ0UmVjb3JkaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGVyYXNlIHByZXZpb3VzIGRhdGFcbiAgICAgICAgcXVlc3Rpb24udmFsdWUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gaWYgcmVjb3JkZXIgb3BlbiBvbiBhbm90aGVyIHF1ZXN0aW9uXHQtIHRyeSB0byBzdG9wIHJlY29yZGluZ1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXN0aW9uLnN1cnZleS5yZWNvcmRSVEMgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHF1ZXN0aW9uLnN1cnZleS5yZWNvcmRSVEMuc3RvcFJlY29yZGluZyhkb05vdGhpbmdIYW5kbGVyKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHF1ZXN0aW9uLnN1cnZleS5teXN0cmVhbSAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBxdWVzdGlvbi5zdXJ2ZXkubXlzdHJlYW0uZ2V0QXVkaW9UcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrKSB7XG4gICAgICAgICAgICAgIHRyYWNrLnN0b3AoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtZWRpYUNvbnN0cmFpbnRzID0ge1xuICAgICAgICAgIHZpZGVvOiBmYWxzZSxcbiAgICAgICAgICBhdWRpbzogdHJ1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIG5hdmlnYXRvci5tZWRpYURldmljZXNcbiAgICAgICAgICAuZ2V0VXNlck1lZGlhKG1lZGlhQ29uc3RyYWludHMpXG4gICAgICAgICAgLnRoZW4oc3VjY2Vzc0NhbGxiYWNrLmJpbmQodGhpcyksIGVycm9yQ2FsbGJhY2suYmluZCh0aGlzKSk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgc3RvcFJlY29yZGluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcInN0b3BSZWNvcmRpbmdcIik7XG4gICAgICAgIGlmICh0eXBlb2YgcXVlc3Rpb24uc3VydmV5LnJlY29yZFJUQyAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgcXVlc3Rpb24uc3VydmV5LnJlY29yZFJUQy5zdG9wUmVjb3JkaW5nKHByb2Nlc3NBdWRpby5iaW5kKHRoaXMpKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHF1ZXN0aW9uLnN1cnZleS5teXN0cmVhbSAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBxdWVzdGlvbi5zdXJ2ZXkubXlzdHJlYW0uZ2V0QXVkaW9UcmFja3MoKS5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrKSB7XG4gICAgICAgICAgICAgIHRyYWNrLnN0b3AoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8vLy8vLy8vLy8vLy8gIGVuZCBSVEMgbG9naWMgLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgIGlmICghcXVlc3Rpb24uaXNSZWFkT25seSkge1xuICAgICAgICBidXR0b25TdGFydEVsLm9uY2xpY2sgPSBzdGFydFJlY29yZGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1dHRvblN0YXJ0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChidXR0b25TdGFydEVsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFxdWVzdGlvbi5pc1JlYWRPbmx5KSB7XG4gICAgICAgIGJ1dHRvblN0b3BFbC5vbmNsaWNrID0gc3RvcFJlY29yZGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1dHRvblN0b3BFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJ1dHRvblN0b3BFbCk7XG4gICAgICB9XG5cbiAgICAgIGF1ZGlvRWwuc3JjID0gcXVlc3Rpb24udmFsdWU7XG5cbiAgICAgIHZhciB1cGRhdGVWYWx1ZUhhbmRsZXIgPSBmdW5jdGlvbigpIHt9O1xuXG4gICAgICB2YXIgZG9Ob3RoaW5nSGFuZGxlciA9IGZ1bmN0aW9uKCkge307XG5cbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gdXBkYXRlVmFsdWVIYW5kbGVyO1xuICAgICAgdXBkYXRlVmFsdWVIYW5kbGVyKCk7XG4gICAgfSxcbiAgICB3aWxsVW5tb3VudDogZnVuY3Rpb24ocXVlc3Rpb24sIGVsKSB7XG4gICAgICBjb25zb2xlLmxvZyhcInVubW91bnQgbWljcm9waG9uZSBubyByZWNvcmQgXCIpO1xuICAgICAgaWYgKHR5cGVvZiBxdWVzdGlvbi5zdXJ2ZXkucmVjb3JkUlRDICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcXVlc3Rpb24uc3VydmV5LnJlY29yZFJUQy5zdG9wUmVjb3JkaW5nKGRvTm90aGluZ0hhbmRsZXIpO1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXN0aW9uLnN1cnZleS5teXN0cmVhbSAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgcXVlc3Rpb24uc3VydmV5Lm15c3RyZWFtLmdldEF1ZGlvVHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbih0cmFjaykge1xuICAgICAgICAgICAgdHJhY2suc3RvcCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHF1ZXN0aW9uLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBxdWVzdGlvbi5zdXJ2ZXkucmVjb3JkUlRDID0gdW5kZWZpbmVkO1xuICAgICAgICBxdWVzdGlvbi5zdXJ2ZXkubXlzdHJlYW0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIFN1cnZleS5DdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmFkZEN1c3RvbVdpZGdldCh3aWRnZXQsIFwiY3VzdG9tdHlwZVwiKTtcbn1cblxuaWYgKHR5cGVvZiBTdXJ2ZXkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgaW5pdChTdXJ2ZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvbWljcm9waG9uZS5qc1xuLy8gbW9kdWxlIGlkID0gMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIndXNlIHN0cmljdCc7XHJcblxyXG4vLyBMYXN0IHRpbWUgdXBkYXRlZDogMjAyMC0wMi0yNiAxOjExOjQ3IFBNIFVUQ1xyXG5cclxuLy8gX19fX19fX19fX19fX19fX1xyXG4vLyBSZWNvcmRSVEMgdjUuNS45XHJcblxyXG4vLyBPcGVuLVNvdXJjZWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9tdWF6LWtoYW4vUmVjb3JkUlRDXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBNdWF6IEtoYW4gICAgIC0gd3d3Lk11YXpLaGFuLmNvbVxyXG4vLyBNSVQgTGljZW5zZSAgIC0gd3d3LldlYlJUQy1FeHBlcmltZW50LmNvbS9saWNlbmNlXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vLyBfX19fX19fX19fX19cclxuLy8gUmVjb3JkUlRDLmpzXHJcblxyXG4vKipcclxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tdWF6LWtoYW4vUmVjb3JkUlRDfFJlY29yZFJUQ30gaXMgYSBXZWJSVEMgSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBhdWRpby92aWRlbyBhcyB3ZWxsIGFzIHNjcmVlbiBhY3Rpdml0eSByZWNvcmRpbmcuIEl0IHN1cHBvcnRzIENocm9tZSwgRmlyZWZveCwgT3BlcmEsIEFuZHJvaWQsIGFuZCBNaWNyb3NvZnQgRWRnZS4gUGxhdGZvcm1zOiBMaW51eCwgTWFjIGFuZCBXaW5kb3dzLiBcclxuICogQHN1bW1hcnkgUmVjb3JkIGF1ZGlvLCB2aWRlbyBvciBzY3JlZW4gaW5zaWRlIHRoZSBicm93c2VyLlxyXG4gKiBAbGljZW5zZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEMvYmxvYi9tYXN0ZXIvTElDRU5TRXxNSVR9XHJcbiAqIEBhdXRob3Ige0BsaW5rIGh0dHBzOi8vTXVhektoYW4uY29tfE11YXogS2hhbn1cclxuICogQHR5cGVkZWYgUmVjb3JkUlRDXHJcbiAqIEBjbGFzc1xyXG4gKiBAZXhhbXBsZVxyXG4gKiB2YXIgcmVjb3JkZXIgPSBSZWNvcmRSVEMobWVkaWFTdHJlYW0gb3IgW2FycmF5T2ZNZWRpYVN0cmVhbV0sIHtcclxuICogICAgIHR5cGU6ICd2aWRlbycsIC8vIGF1ZGlvIG9yIHZpZGVvIG9yIGdpZiBvciBjYW52YXNcclxuICogICAgIHJlY29yZGVyVHlwZTogTWVkaWFTdHJlYW1SZWNvcmRlciB8fCBDYW52YXNSZWNvcmRlciB8fCBTdGVyZW9BdWRpb1JlY29yZGVyIHx8IEV0Y1xyXG4gKiB9KTtcclxuICogcmVjb3JkZXIuc3RhcnRSZWNvcmRpbmcoKTtcclxuICogQHNlZSBGb3IgZnVydGhlciBpbmZvcm1hdGlvbjpcclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEN8UmVjb3JkUlRDIFNvdXJjZSBDb2RlfVxyXG4gKiBAcGFyYW0ge01lZGlhU3RyZWFtfSBtZWRpYVN0cmVhbSAtIFNpbmdsZSBtZWRpYS1zdHJlYW0gb2JqZWN0LCBhcnJheSBvZiBtZWRpYS1zdHJlYW1zLCBodG1sLWNhbnZhcy1lbGVtZW50LCBldGMuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSB7dHlwZTpcInZpZGVvXCIsIHJlY29yZGVyVHlwZTogTWVkaWFTdHJlYW1SZWNvcmRlciwgZGlzYWJsZUxvZ3M6IHRydWUsIG51bWJlck9mQXVkaW9DaGFubmVsczogMSwgYnVmZmVyU2l6ZTogMCwgc2FtcGxlUmF0ZTogMCwgZGVzaXJlZFNhbXBSYXRlOiAxNjAwMCwgdmlkZW86IEhUTUxWaWRlb0VsZW1lbnQsIGV0Yy59XHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gUmVjb3JkUlRDKG1lZGlhU3RyZWFtLCBjb25maWcpIHtcclxuICAgIGlmICghbWVkaWFTdHJlYW0pIHtcclxuICAgICAgICB0aHJvdyAnRmlyc3QgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLic7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlnID0gY29uZmlnIHx8IHtcclxuICAgICAgICB0eXBlOiAndmlkZW8nXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbmZpZyA9IG5ldyBSZWNvcmRSVENDb25maWd1cmF0aW9uKG1lZGlhU3RyZWFtLCBjb25maWcpO1xyXG5cclxuICAgIC8vIGEgcmVmZXJlbmNlIHRvIHVzZXIncyByZWNvcmRSVEMgb2JqZWN0XHJcbiAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgZnVuY3Rpb24gc3RhcnRSZWNvcmRpbmcoY29uZmlnMikge1xyXG4gICAgICAgIGlmICghY29uZmlnLmRpc2FibGVMb2dzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZWNvcmRSVEMgdmVyc2lvbjogJywgc2VsZi52ZXJzaW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghIWNvbmZpZzIpIHtcclxuICAgICAgICAgICAgLy8gYWxsb3cgdXNlcnMgdG8gc2V0IG9wdGlvbnMgdXNpbmcgc3RhcnRSZWNvcmRpbmcgbWV0aG9kXHJcbiAgICAgICAgICAgIC8vIGNvbmZpZzIgaXMgc2ltaWxhciB0byBtYWluIFwiY29uZmlnXCIgb2JqZWN0IChzZWNvbmQgcGFyYW1ldGVyIG92ZXIgUmVjb3JkUlRDIGNvbnN0cnVjdG9yKVxyXG4gICAgICAgICAgICBjb25maWcgPSBuZXcgUmVjb3JkUlRDQ29uZmlndXJhdGlvbihtZWRpYVN0cmVhbSwgY29uZmlnMik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnc3RhcnRlZCByZWNvcmRpbmcgJyArIGNvbmZpZy50eXBlICsgJyBzdHJlYW0uJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWVkaWFSZWNvcmRlcikge1xyXG4gICAgICAgICAgICBtZWRpYVJlY29yZGVyLmNsZWFyUmVjb3JkZWREYXRhKCk7XHJcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIucmVjb3JkKCk7XHJcblxyXG4gICAgICAgICAgICBzZXRTdGF0ZSgncmVjb3JkaW5nJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZi5yZWNvcmRpbmdEdXJhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVjb3JkaW5nRHVyYXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGluaXRSZWNvcmRlcihmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGYucmVjb3JkaW5nRHVyYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGhhbmRsZVJlY29yZGluZ0R1cmF0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlbGY7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaW5pdFJlY29yZGVyKGluaXRDYWxsYmFjaykge1xyXG4gICAgICAgIGlmIChpbml0Q2FsbGJhY2spIHtcclxuICAgICAgICAgICAgY29uZmlnLmluaXRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgaW5pdENhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICBpbml0Q2FsbGJhY2sgPSBjb25maWcuaW5pdENhbGxiYWNrID0gbnVsbDsgLy8gcmVjb3JkZXIuaW5pdFJlY29yZGVyIHNob3VsZCBiZSBjYWxsLWJhY2tlZCBvbmNlLlxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIFJlY29yZGVyID0gbmV3IEdldFJlY29yZGVyVHlwZShtZWRpYVN0cmVhbSwgY29uZmlnKTtcclxuXHJcbiAgICAgICAgbWVkaWFSZWNvcmRlciA9IG5ldyBSZWNvcmRlcihtZWRpYVN0cmVhbSwgY29uZmlnKTtcclxuICAgICAgICBtZWRpYVJlY29yZGVyLnJlY29yZCgpO1xyXG5cclxuICAgICAgICBzZXRTdGF0ZSgncmVjb3JkaW5nJyk7XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLmRpc2FibGVMb2dzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdJbml0aWFsaXplZCByZWNvcmRlclR5cGU6JywgbWVkaWFSZWNvcmRlci5jb25zdHJ1Y3Rvci5uYW1lLCAnZm9yIG91dHB1dC10eXBlOicsIGNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc3RvcFJlY29yZGluZyhjYWxsYmFjaykge1xyXG4gICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcclxuXHJcbiAgICAgICAgaWYgKCFtZWRpYVJlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIHdhcm5pbmdMb2coKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUgPT09ICdwYXVzZWQnKSB7XHJcbiAgICAgICAgICAgIHNlbGYucmVzdW1lUmVjb3JkaW5nKCk7XHJcblxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgc3RvcFJlY29yZGluZyhjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH0sIDEpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gJ3JlY29yZGluZycgJiYgIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlY29yZGluZyBzdGF0ZSBzaG91bGQgYmU6IFwicmVjb3JkaW5nXCIsIGhvd2V2ZXIgY3VycmVudCBzdGF0ZSBpczogJywgc2VsZi5zdGF0ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU3RvcHBlZCByZWNvcmRpbmcgJyArIGNvbmZpZy50eXBlICsgJyBzdHJlYW0uJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29uZmlnLnR5cGUgIT09ICdnaWYnKSB7XHJcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIuc3RvcChfY2FsbGJhY2spO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIuc3RvcCgpO1xyXG4gICAgICAgICAgICBfY2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFN0YXRlKCdzdG9wcGVkJyk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIF9jYWxsYmFjayhfX2Jsb2IpIHtcclxuICAgICAgICAgICAgaWYgKCFtZWRpYVJlY29yZGVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrLmNhbGwgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHNlbGYsICcnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soJycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtZWRpYVJlY29yZGVyKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZWRpYVJlY29yZGVyW2tleV0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc2VsZltrZXldID0gbWVkaWFSZWNvcmRlcltrZXldO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciBibG9iID0gbWVkaWFSZWNvcmRlci5ibG9iO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFibG9iKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoX19ibG9iKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVkaWFSZWNvcmRlci5ibG9iID0gYmxvYiA9IF9fYmxvYjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ1JlY29yZGluZyBmYWlsZWQuJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJsb2IgJiYgIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYmxvYi50eXBlLCAnLT4nLCBieXRlc1RvU2l6ZShibG9iLnNpemUpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdXJsO1xyXG5cclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjay5jYWxsID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChzZWxmLCB1cmwpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh1cmwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5hdXRvV3JpdGVUb0Rpc2spIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZ2V0RGF0YVVSTChmdW5jdGlvbihkYXRhVVJMKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcGFyYW1ldGVyID0ge307XHJcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJbY29uZmlnLnR5cGUgKyAnQmxvYiddID0gZGF0YVVSTDtcclxuICAgICAgICAgICAgICAgIERpc2tTdG9yYWdlLlN0b3JlKHBhcmFtZXRlcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwYXVzZVJlY29yZGluZygpIHtcclxuICAgICAgICBpZiAoIW1lZGlhUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgd2FybmluZ0xvZygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gJ3JlY29yZGluZycpIHtcclxuICAgICAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZUxvZ3MpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignVW5hYmxlIHRvIHBhdXNlIHRoZSByZWNvcmRpbmcuIFJlY29yZGluZyBzdGF0ZTogJywgc2VsZi5zdGF0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0U3RhdGUoJ3BhdXNlZCcpO1xyXG5cclxuICAgICAgICBtZWRpYVJlY29yZGVyLnBhdXNlKCk7XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLmRpc2FibGVMb2dzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdQYXVzZWQgcmVjb3JkaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZXN1bWVSZWNvcmRpbmcoKSB7XHJcbiAgICAgICAgaWYgKCFtZWRpYVJlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIHdhcm5pbmdMb2coKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUgIT09ICdwYXVzZWQnKSB7XHJcbiAgICAgICAgICAgIGlmICghY29uZmlnLmRpc2FibGVMb2dzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byByZXN1bWUgdGhlIHJlY29yZGluZy4gUmVjb3JkaW5nIHN0YXRlOiAnLCBzZWxmLnN0YXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRTdGF0ZSgncmVjb3JkaW5nJyk7XHJcblxyXG4gICAgICAgIC8vIG5vdCBhbGwgbGlicyBoYXZlIHRoaXMgbWV0aG9kIHlldFxyXG4gICAgICAgIG1lZGlhUmVjb3JkZXIucmVzdW1lKCk7XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLmRpc2FibGVMb2dzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bWVkIHJlY29yZGluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVhZEZpbGUoX2Jsb2IpIHtcclxuICAgICAgICBwb3N0TWVzc2FnZShuZXcgRmlsZVJlYWRlclN5bmMoKS5yZWFkQXNEYXRhVVJMKF9ibG9iKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0RGF0YVVSTChjYWxsYmFjaywgX21lZGlhUmVjb3JkZXIpIHtcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIHRocm93ICdQYXNzIGEgY2FsbGJhY2sgZnVuY3Rpb24gb3ZlciBnZXREYXRhVVJMLic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgYmxvYiA9IF9tZWRpYVJlY29yZGVyID8gX21lZGlhUmVjb3JkZXIuYmxvYiA6IChtZWRpYVJlY29yZGVyIHx8IHt9KS5ibG9iO1xyXG5cclxuICAgICAgICBpZiAoIWJsb2IpIHtcclxuICAgICAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZUxvZ3MpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQmxvYiBlbmNvZGVyIGRpZCBub3QgZmluaXNoIGl0cyBqb2IgeWV0LicpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgZ2V0RGF0YVVSTChjYWxsYmFjaywgX21lZGlhUmVjb3JkZXIpO1xyXG4gICAgICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBXb3JrZXIgIT09ICd1bmRlZmluZWQnICYmICFuYXZpZ2F0b3IubW96R2V0VXNlck1lZGlhKSB7XHJcbiAgICAgICAgICAgIHZhciB3ZWJXb3JrZXIgPSBwcm9jZXNzSW5XZWJXb3JrZXIocmVhZEZpbGUpO1xyXG5cclxuICAgICAgICAgICAgd2ViV29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhldmVudC5kYXRhKTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHdlYldvcmtlci5wb3N0TWVzc2FnZShibG9iKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XHJcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQudGFyZ2V0LnJlc3VsdCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzSW5XZWJXb3JrZXIoX2Z1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYmxvYiA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW19mdW5jdGlvbi50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgICAgICd0aGlzLm9ubWVzc2FnZSA9ICBmdW5jdGlvbiAoZWVlKSB7JyArIF9mdW5jdGlvbi5uYW1lICsgJyhlZWUuZGF0YSk7fSdcclxuICAgICAgICAgICAgICAgIF0sIHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCdcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlcihibG9iKTtcclxuICAgICAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBoYW5kbGVSZWNvcmRpbmdEdXJhdGlvbihjb3VudGVyKSB7XHJcbiAgICAgICAgY291bnRlciA9IGNvdW50ZXIgfHwgMDtcclxuXHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUgPT09ICdwYXVzZWQnKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVSZWNvcmRpbmdEdXJhdGlvbihjb3VudGVyKTtcclxuICAgICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlID09PSAnc3RvcHBlZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvdW50ZXIgPj0gc2VsZi5yZWNvcmRpbmdEdXJhdGlvbikge1xyXG4gICAgICAgICAgICBzdG9wUmVjb3JkaW5nKHNlbGYub25SZWNvcmRpbmdTdG9wcGVkKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY291bnRlciArPSAxMDAwOyAvLyAxLXNlY29uZFxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBoYW5kbGVSZWNvcmRpbmdEdXJhdGlvbihjb3VudGVyKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRTdGF0ZShzdGF0ZSkge1xyXG4gICAgICAgIGlmICghc2VsZikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGU7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZi5vblN0YXRlQ2hhbmdlZC5jYWxsID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHNlbGYub25TdGF0ZUNoYW5nZWQuY2FsbChzZWxmLCBzdGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZi5vblN0YXRlQ2hhbmdlZChzdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBXQVJOSU5HID0gJ0l0IHNlZW1zIHRoYXQgcmVjb3JkZXIgaXMgZGVzdHJveWVkIG9yIFwic3RhcnRSZWNvcmRpbmdcIiBpcyBub3QgaW52b2tlZCBmb3IgJyArIGNvbmZpZy50eXBlICsgJyByZWNvcmRlci4nO1xyXG5cclxuICAgIGZ1bmN0aW9uIHdhcm5pbmdMb2coKSB7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5kaXNhYmxlTG9ncyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zb2xlLndhcm4oV0FSTklORyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIG1lZGlhUmVjb3JkZXI7XHJcblxyXG4gICAgdmFyIHJldHVybk9iamVjdCA9IHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBzdGFydHMgdGhlIHJlY29yZGluZy5cclxuICAgICAgICAgKiBAbWV0aG9kXHJcbiAgICAgICAgICogQG1lbWJlcm9mIFJlY29yZFJUQ1xyXG4gICAgICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICogdmFyIHJlY29yZGVyID0gUmVjb3JkUlRDKG1lZGlhU3RyZWFtLCB7XHJcbiAgICAgICAgICogICAgIHR5cGU6ICd2aWRlbydcclxuICAgICAgICAgKiB9KTtcclxuICAgICAgICAgKiByZWNvcmRlci5zdGFydFJlY29yZGluZygpO1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN0YXJ0UmVjb3JkaW5nOiBzdGFydFJlY29yZGluZyxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhpcyBtZXRob2Qgc3RvcHMgdGhlIHJlY29yZGluZy4gSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gZ2V0IFwiYmxvYlwiIG9yIFwiVVJJXCIgaW5zaWRlIHRoZSBjYWxsYmFjayB0byBtYWtlIHN1cmUgYWxsIHJlY29yZGVycyBmaW5pc2hlZCB0aGVpciBqb2IuXHJcbiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byBnZXQgdGhlIHJlY29yZGVkIGJsb2IuXHJcbiAgICAgICAgICogQG1ldGhvZFxyXG4gICAgICAgICAqIEBtZW1iZXJvZiBSZWNvcmRSVENcclxuICAgICAgICAgKiBAaW5zdGFuY2VcclxuICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAqIHJlY29yZGVyLnN0b3BSZWNvcmRpbmcoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICogICAgIC8vIHVzZSBlaXRoZXIgXCJ0aGlzXCIgb3IgXCJyZWNvcmRlclwiIG9iamVjdDsgYm90aCBhcmUgaWRlbnRpY2FsXHJcbiAgICAgICAgICogICAgIHZpZGVvLnNyYyA9IHRoaXMudG9VUkwoKTtcclxuICAgICAgICAgKiAgICAgdmFyIGJsb2IgPSB0aGlzLmdldEJsb2IoKTtcclxuICAgICAgICAgKiB9KTtcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdG9wUmVjb3JkaW5nOiBzdG9wUmVjb3JkaW5nLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBwYXVzZXMgdGhlIHJlY29yZGluZy4gWW91IGNhbiByZXN1bWUgcmVjb3JkaW5nIHVzaW5nIFwicmVzdW1lUmVjb3JkaW5nXCIgbWV0aG9kLlxyXG4gICAgICAgICAqIEBtZXRob2RcclxuICAgICAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDXHJcbiAgICAgICAgICogQGluc3RhbmNlXHJcbiAgICAgICAgICogQHRvZG8gRmlyZWZveCBpcyB1bmFibGUgdG8gcGF1c2UgdGhlIHJlY29yZGluZy4gRml4IGl0LlxyXG4gICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICogcmVjb3JkZXIucGF1c2VSZWNvcmRpbmcoKTsgIC8vIHBhdXNlIHRoZSByZWNvcmRpbmdcclxuICAgICAgICAgKiByZWNvcmRlci5yZXN1bWVSZWNvcmRpbmcoKTsgLy8gcmVzdW1lIGFnYWluXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcGF1c2VSZWNvcmRpbmc6IHBhdXNlUmVjb3JkaW5nLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXN1bWVzIHRoZSByZWNvcmRpbmcuXHJcbiAgICAgICAgICogQG1ldGhvZFxyXG4gICAgICAgICAqIEBtZW1iZXJvZiBSZWNvcmRSVENcclxuICAgICAgICAgKiBAaW5zdGFuY2VcclxuICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAqIHJlY29yZGVyLnBhdXNlUmVjb3JkaW5nKCk7ICAvLyBmaXJzdCBvZiBhbGwsIHBhdXNlIHRoZSByZWNvcmRpbmdcclxuICAgICAgICAgKiByZWNvcmRlci5yZXN1bWVSZWNvcmRpbmcoKTsgLy8gbm93IHJlc3VtZSBpdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJlc3VtZVJlY29yZGluZzogcmVzdW1lUmVjb3JkaW5nLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgcmVjb3JkaW5nLlxyXG4gICAgICAgICAqIEBtZXRob2RcclxuICAgICAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDXHJcbiAgICAgICAgICogQGluc3RhbmNlXHJcbiAgICAgICAgICogQHRvZG8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGRlcHJlY2F0ZWQuXHJcbiAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgKiByZWNvcmRlci5pbml0UmVjb3JkZXIoKTtcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbml0UmVjb3JkZXI6IGluaXRSZWNvcmRlcixcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQXNrIFJlY29yZFJUQyB0byBhdXRvLXN0b3AgdGhlIHJlY29yZGluZyBhZnRlciA1IG1pbnV0ZXMuXHJcbiAgICAgICAgICogQG1ldGhvZFxyXG4gICAgICAgICAqIEBtZW1iZXJvZiBSZWNvcmRSVENcclxuICAgICAgICAgKiBAaW5zdGFuY2VcclxuICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAqIHZhciBmaXZlTWludXRlcyA9IDUgKiAxMDAwICogNjA7XHJcbiAgICAgICAgICogcmVjb3JkZXIuc2V0UmVjb3JkaW5nRHVyYXRpb24oZml2ZU1pbnV0ZXMsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAqICAgIHZhciBibG9iID0gdGhpcy5nZXRCbG9iKCk7XHJcbiAgICAgICAgICogICAgdmlkZW8uc3JjID0gdGhpcy50b1VSTCgpO1xyXG4gICAgICAgICAqIH0pO1xyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIC8vIG9yIG90aGVyd2lzZVxyXG4gICAgICAgICAqIHJlY29yZGVyLnNldFJlY29yZGluZ0R1cmF0aW9uKGZpdmVNaW51dGVzKS5vblJlY29yZGluZ1N0b3BwZWQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICogICAgdmFyIGJsb2IgPSB0aGlzLmdldEJsb2IoKTtcclxuICAgICAgICAgKiAgICB2aWRlby5zcmMgPSB0aGlzLnRvVVJMKCk7XHJcbiAgICAgICAgICogfSk7XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2V0UmVjb3JkaW5nRHVyYXRpb246IGZ1bmN0aW9uKHJlY29yZGluZ0R1cmF0aW9uLCBjYWxsYmFjaykge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY29yZGluZ0R1cmF0aW9uID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgJ3JlY29yZGluZ0R1cmF0aW9uIGlzIHJlcXVpcmVkLic7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjb3JkaW5nRHVyYXRpb24gIT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyAncmVjb3JkaW5nRHVyYXRpb24gbXVzdCBiZSBhIG51bWJlci4nO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWxmLnJlY29yZGluZ0R1cmF0aW9uID0gcmVjb3JkaW5nRHVyYXRpb247XHJcbiAgICAgICAgICAgIHNlbGYub25SZWNvcmRpbmdTdG9wcGVkID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBvblJlY29yZGluZ1N0b3BwZWQ6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vblJlY29yZGluZ1N0b3BwZWQgPSBjYWxsYmFjaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjbGVhci9yZXNldCBhbGwgdGhlIHJlY29yZGVkIGRhdGEuXHJcbiAgICAgICAgICogQG1ldGhvZFxyXG4gICAgICAgICAqIEBtZW1iZXJvZiBSZWNvcmRSVENcclxuICAgICAgICAgKiBAaW5zdGFuY2VcclxuICAgICAgICAgKiBAdG9kbyBGaWd1cmUgb3V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gXCJyZXNldFwiIGFuZCBcImNsZWFyUmVjb3JkZWREYXRhXCIgbWV0aG9kcy5cclxuICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAqIHJlY29yZGVyLmNsZWFyUmVjb3JkZWREYXRhKCk7XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xlYXJSZWNvcmRlZERhdGE6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAoIW1lZGlhUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgICAgIHdhcm5pbmdMb2coKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbWVkaWFSZWNvcmRlci5jbGVhclJlY29yZGVkRGF0YSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZUxvZ3MpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDbGVhcmVkIG9sZCByZWNvcmRlZCBkYXRhLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogR2V0IHRoZSByZWNvcmRlZCBibG9iLiBVc2UgdGhpcyBtZXRob2QgaW5zaWRlIHRoZSBcInN0b3BSZWNvcmRpbmdcIiBjYWxsYmFjay5cclxuICAgICAgICAgKiBAbWV0aG9kXHJcbiAgICAgICAgICogQG1lbWJlcm9mIFJlY29yZFJUQ1xyXG4gICAgICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICogcmVjb3JkZXIuc3RvcFJlY29yZGluZyhmdW5jdGlvbigpIHtcclxuICAgICAgICAgKiAgICAgdmFyIGJsb2IgPSB0aGlzLmdldEJsb2IoKTtcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqICAgICB2YXIgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgJ2ZpbGVuYW1lLndlYm0nLCB7XHJcbiAgICAgICAgICogICAgICAgICB0eXBlOiAndmlkZW8vd2VibSdcclxuICAgICAgICAgKiAgICAgfSk7XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiAgICAgdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgICAgICogICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUpOyAvLyB1cGxvYWQgXCJGaWxlXCIgb2JqZWN0IHJhdGhlciB0aGFuIGEgXCJCbG9iXCJcclxuICAgICAgICAgKiAgICAgdXBsb2FkVG9TZXJ2ZXIoZm9ybURhdGEpO1xyXG4gICAgICAgICAqIH0pO1xyXG4gICAgICAgICAqIEByZXR1cm5zIHtCbG9ifSBSZXR1cm5zIHJlY29yZGVkIGRhdGEgYXMgXCJCbG9iXCIgb2JqZWN0LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldEJsb2I6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAoIW1lZGlhUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgICAgIHdhcm5pbmdMb2coKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG1lZGlhUmVjb3JkZXIuYmxvYjtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBHZXQgZGF0YS1VUkkgaW5zdGVhZCBvZiBCbG9iLlxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gZ2V0IHRoZSBEYXRhLVVSSS5cclxuICAgICAgICAgKiBAbWV0aG9kXHJcbiAgICAgICAgICogQG1lbWJlcm9mIFJlY29yZFJUQ1xyXG4gICAgICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICogcmVjb3JkZXIuc3RvcFJlY29yZGluZyhmdW5jdGlvbigpIHtcclxuICAgICAgICAgKiAgICAgcmVjb3JkZXIuZ2V0RGF0YVVSTChmdW5jdGlvbihkYXRhVVJJKSB7XHJcbiAgICAgICAgICogICAgICAgICB2aWRlby5zcmMgPSBkYXRhVVJJO1xyXG4gICAgICAgICAqICAgICB9KTtcclxuICAgICAgICAgKiB9KTtcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXREYXRhVVJMOiBnZXREYXRhVVJMLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBHZXQgdmlydHVhbC90ZW1wb3JhcnkgVVJMLiBVc2FnZSBvZiB0aGlzIFVSTCBpcyBsaW1pdGVkIHRvIGN1cnJlbnQgdGFiLlxyXG4gICAgICAgICAqIEBtZXRob2RcclxuICAgICAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDXHJcbiAgICAgICAgICogQGluc3RhbmNlXHJcbiAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgKiByZWNvcmRlci5zdG9wUmVjb3JkaW5nKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAqICAgICB2aWRlby5zcmMgPSB0aGlzLnRvVVJMKCk7XHJcbiAgICAgICAgICogfSk7XHJcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gUmV0dXJucyBhIHZpcnR1YWwvdGVtcG9yYXJ5IFVSTCBmb3IgdGhlIHJlY29yZGVkIFwiQmxvYlwiLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRvVVJMOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgaWYgKCFtZWRpYVJlY29yZGVyKSB7XHJcbiAgICAgICAgICAgICAgICB3YXJuaW5nTG9nKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKG1lZGlhUmVjb3JkZXIuYmxvYik7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogR2V0IGludGVybmFsIHJlY29yZGluZyBvYmplY3QgKGkuZS4gaW50ZXJuYWwgbW9kdWxlKSBlLmcuIE11dGxpU3RyZWFtUmVjb3JkZXIsIE1lZGlhU3RyZWFtUmVjb3JkZXIsIFN0ZXJlb0F1ZGlvUmVjb3JkZXIgb3IgV2hhbW15UmVjb3JkZXIgZXRjLlxyXG4gICAgICAgICAqIEBtZXRob2RcclxuICAgICAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDXHJcbiAgICAgICAgICogQGluc3RhbmNlXHJcbiAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgKiB2YXIgaW50ZXJuYWxSZWNvcmRlciA9IHJlY29yZGVyLmdldEludGVybmFsUmVjb3JkZXIoKTtcclxuICAgICAgICAgKiBpZihpbnRlcm5hbFJlY29yZGVyIGluc3RhbmNlb2YgTXVsdGlTdHJlYW1SZWNvcmRlcikge1xyXG4gICAgICAgICAqICAgICBpbnRlcm5hbFJlY29yZGVyLmFkZFN0cmVhbXMoW25ld0F1ZGlvU3RyZWFtXSk7XHJcbiAgICAgICAgICogICAgIGludGVybmFsUmVjb3JkZXIucmVzZXRWaWRlb1N0cmVhbXMoW3NjcmVlblN0cmVhbV0pO1xyXG4gICAgICAgICAqIH1cclxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGludGVybmFsIHJlY29yZGluZyBvYmplY3QuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0SW50ZXJuYWxSZWNvcmRlcjogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtZWRpYVJlY29yZGVyO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEludm9rZSBzYXZlLWFzIGRpYWxvZyB0byBzYXZlIHRoZSByZWNvcmRlZCBibG9iIGludG8geW91ciBkaXNrLlxyXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlTmFtZSAtIFNldCB5b3VyIG93biBmaWxlIG5hbWUuXHJcbiAgICAgICAgICogQG1ldGhvZFxyXG4gICAgICAgICAqIEBtZW1iZXJvZiBSZWNvcmRSVENcclxuICAgICAgICAgKiBAaW5zdGFuY2VcclxuICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAqIHJlY29yZGVyLnN0b3BSZWNvcmRpbmcoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICogICAgIHRoaXMuc2F2ZSgnZmlsZS1uYW1lJyk7XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiAgICAgLy8gb3IgbWFudWFsbHk6XHJcbiAgICAgICAgICogICAgIGludm9rZVNhdmVBc0RpYWxvZyh0aGlzLmdldEJsb2IoKSwgJ2ZpbGVuYW1lLndlYm0nKTtcclxuICAgICAgICAgKiB9KTtcclxuICAgICAgICAgKi9cclxuICAgICAgICBzYXZlOiBmdW5jdGlvbihmaWxlTmFtZSkge1xyXG4gICAgICAgICAgICBpZiAoIW1lZGlhUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgICAgIHdhcm5pbmdMb2coKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaW52b2tlU2F2ZUFzRGlhbG9nKG1lZGlhUmVjb3JkZXIuYmxvYiwgZmlsZU5hbWUpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGdldHMgYSBibG9iIGZyb20gaW5kZXhlZC1EQiBzdG9yYWdlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gZ2V0IHRoZSByZWNvcmRlZCBibG9iLlxyXG4gICAgICAgICAqIEBtZXRob2RcclxuICAgICAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDXHJcbiAgICAgICAgICogQGluc3RhbmNlXHJcbiAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgKiByZWNvcmRlci5nZXRGcm9tRGlzayhmdW5jdGlvbihkYXRhVVJMKSB7XHJcbiAgICAgICAgICogICAgIHZpZGVvLnNyYyA9IGRhdGFVUkw7XHJcbiAgICAgICAgICogfSk7XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0RnJvbURpc2s6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGlmICghbWVkaWFSZWNvcmRlcikge1xyXG4gICAgICAgICAgICAgICAgd2FybmluZ0xvZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBSZWNvcmRSVEMuZ2V0RnJvbURpc2soY29uZmlnLnR5cGUsIGNhbGxiYWNrKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIGFuIGFycmF5IG9mIHdlYnAgaW1hZ2VzIHRvIHRoZSByZWNvcmRlZCB2aWRlby1ibG9iLiBJdCB0YWtlcyBhbiBcImFycmF5XCIgb2JqZWN0LlxyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheS48QXJyYXk+fVxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5T2ZXZWJQSW1hZ2VzIC0gQXJyYXkgb2Ygd2VicCBpbWFnZXMuXHJcbiAgICAgICAgICogQG1ldGhvZFxyXG4gICAgICAgICAqIEBtZW1iZXJvZiBSZWNvcmRSVENcclxuICAgICAgICAgKiBAaW5zdGFuY2VcclxuICAgICAgICAgKiBAdG9kbyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgZGVwcmVjYXRlZC5cclxuICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAqIHZhciBhcnJheU9mV2ViUEltYWdlcyA9IFtdO1xyXG4gICAgICAgICAqIGFycmF5T2ZXZWJQSW1hZ2VzLnB1c2goe1xyXG4gICAgICAgICAqICAgICBkdXJhdGlvbjogaW5kZXgsXHJcbiAgICAgICAgICogICAgIGltYWdlOiAnZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCwuLi4nXHJcbiAgICAgICAgICogfSk7XHJcbiAgICAgICAgICogcmVjb3JkZXIuc2V0QWR2ZXJ0aXNlbWVudEFycmF5KGFycmF5T2ZXZWJQSW1hZ2VzKTtcclxuICAgICAgICAgKi9cclxuICAgICAgICBzZXRBZHZlcnRpc2VtZW50QXJyYXk6IGZ1bmN0aW9uKGFycmF5T2ZXZWJQSW1hZ2VzKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5hZHZlcnRpc2VtZW50ID0gW107XHJcblxyXG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXlPZldlYlBJbWFnZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcuYWR2ZXJ0aXNlbWVudC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogaSxcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogYXJyYXlPZldlYlBJbWFnZXNbaV1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSXQgaXMgZXF1aXZhbGVudCB0byA8Y29kZSBjbGFzcz1cInN0clwiPlwicmVjb3JkZXIuZ2V0QmxvYigpXCI8L2NvZGU+IG1ldGhvZC4gVXNhZ2Ugb2YgXCJnZXRCbG9iXCIgaXMgcmVjb21tZW5kZWQsIHRob3VnaC5cclxuICAgICAgICAgKiBAcHJvcGVydHkge0Jsb2J9IGJsb2IgLSBSZWNvcmRlZCBCbG9iIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyB0aGlzIHByb3BlcnR5LlxyXG4gICAgICAgICAqIEBtZW1iZXJvZiBSZWNvcmRSVENcclxuICAgICAgICAgKiBAaW5zdGFuY2VcclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAqIHJlY29yZGVyLnN0b3BSZWNvcmRpbmcoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICogICAgIHZhciBibG9iID0gdGhpcy5ibG9iO1xyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogICAgIC8vIGJlbG93IG9uZSBpcyByZWNvbW1lbmRlZFxyXG4gICAgICAgICAqICAgICB2YXIgYmxvYiA9IHRoaXMuZ2V0QmxvYigpO1xyXG4gICAgICAgICAqIH0pO1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGJsb2I6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoaXMgd29ya3Mgb25seSB3aXRoIHtyZWNvcmRlclR5cGU6U3RlcmVvQXVkaW9SZWNvcmRlcn0uIFVzZSB0aGlzIHByb3BlcnR5IG9uIFwic3RvcFJlY29yZGluZ1wiIHRvIHZlcmlmeSB0aGUgZW5jb2RlcidzIHNhbXBsZS1yYXRlcy5cclxuICAgICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gYnVmZmVyU2l6ZSAtIEJ1ZmZlci1zaXplIHVzZWQgdG8gZW5jb2RlIHRoZSBXQVYgY29udGFpbmVyXHJcbiAgICAgICAgICogQG1lbWJlcm9mIFJlY29yZFJUQ1xyXG4gICAgICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICogcmVjb3JkZXIuc3RvcFJlY29yZGluZyhmdW5jdGlvbigpIHtcclxuICAgICAgICAgKiAgICAgYWxlcnQoJ1JlY29yZGVyIHVzZWQgdGhpcyBidWZmZXItc2l6ZTogJyArIHRoaXMuYnVmZmVyU2l6ZSk7XHJcbiAgICAgICAgICogfSk7XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYnVmZmVyU2l6ZTogMCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhpcyB3b3JrcyBvbmx5IHdpdGgge3JlY29yZGVyVHlwZTpTdGVyZW9BdWRpb1JlY29yZGVyfS4gVXNlIHRoaXMgcHJvcGVydHkgb24gXCJzdG9wUmVjb3JkaW5nXCIgdG8gdmVyaWZ5IHRoZSBlbmNvZGVyJ3Mgc2FtcGxlLXJhdGVzLlxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzYW1wbGVSYXRlIC0gU2FtcGxlLXJhdGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBXQVYgY29udGFpbmVyXHJcbiAgICAgICAgICogQG1lbWJlcm9mIFJlY29yZFJUQ1xyXG4gICAgICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICogcmVjb3JkZXIuc3RvcFJlY29yZGluZyhmdW5jdGlvbigpIHtcclxuICAgICAgICAgKiAgICAgYWxlcnQoJ1JlY29yZGVyIHVzZWQgdGhlc2Ugc2FtcGxlLXJhdGVzOiAnICsgdGhpcy5zYW1wbGVSYXRlKTtcclxuICAgICAgICAgKiB9KTtcclxuICAgICAgICAgKi9cclxuICAgICAgICBzYW1wbGVSYXRlOiAwLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB7cmVjb3JkZXJUeXBlOlN0ZXJlb0F1ZGlvUmVjb3JkZXJ9IHJldHVybnMgQXJyYXlCdWZmZXIgb2JqZWN0LlxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlciAtIEF1ZGlvIEFycmF5QnVmZmVyLCBzdXBwb3J0ZWQgb25seSBpbiBDaHJvbWUuXHJcbiAgICAgICAgICogQG1lbWJlcm9mIFJlY29yZFJUQ1xyXG4gICAgICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICogcmVjb3JkZXIuc3RvcFJlY29yZGluZyhmdW5jdGlvbigpIHtcclxuICAgICAgICAgKiAgICAgdmFyIGFycmF5QnVmZmVyID0gdGhpcy5idWZmZXI7XHJcbiAgICAgICAgICogICAgIGFsZXJ0KGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgICAqIH0pO1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGJ1ZmZlcjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhpcyBtZXRob2QgcmVzZXRzIHRoZSByZWNvcmRlci4gU28gdGhhdCB5b3UgY2FuIHJldXNlIHNpbmdsZSByZWNvcmRlciBpbnN0YW5jZSBtYW55IHRpbWVzLlxyXG4gICAgICAgICAqIEBtZXRob2RcclxuICAgICAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDXHJcbiAgICAgICAgICogQGluc3RhbmNlXHJcbiAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgKiByZWNvcmRlci5yZXNldCgpO1xyXG4gICAgICAgICAqIHJlY29yZGVyLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gJ3JlY29yZGluZycgJiYgIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdTdG9wIGFuIGFjdGl2ZSByZWNvcmRlci4nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG1lZGlhUmVjb3JkZXIgJiYgdHlwZW9mIG1lZGlhUmVjb3JkZXIuY2xlYXJSZWNvcmRlZERhdGEgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIuY2xlYXJSZWNvcmRlZERhdGEoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtZWRpYVJlY29yZGVyID0gbnVsbDtcclxuICAgICAgICAgICAgc2V0U3RhdGUoJ2luYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIHNlbGYuYmxvYiA9IG51bGw7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHJlY29yZGVyJ3Mgc3RhdGUgY2hhbmdlcy4gVXNlIHRoaXMgYXMgYW4gXCJldmVudFwiLlxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBzdGF0ZSAtIEEgcmVjb3JkZXIncyBzdGF0ZSBjYW4gYmU6IHJlY29yZGluZywgcGF1c2VkLCBzdG9wcGVkIG9yIGluYWN0aXZlLlxyXG4gICAgICAgICAqIEBtZXRob2RcclxuICAgICAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDXHJcbiAgICAgICAgICogQGluc3RhbmNlXHJcbiAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgKiByZWNvcmRlci5vblN0YXRlQ2hhbmdlZCA9IGZ1bmN0aW9uKHN0YXRlKSB7XHJcbiAgICAgICAgICogICAgIGNvbnNvbGUubG9nKCdSZWNvcmRlciBzdGF0ZTogJywgc3RhdGUpO1xyXG4gICAgICAgICAqIH07XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb25TdGF0ZUNoYW5nZWQ6IGZ1bmN0aW9uKHN0YXRlKSB7XHJcbiAgICAgICAgICAgIGlmICghY29uZmlnLmRpc2FibGVMb2dzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUmVjb3JkZXIgc3RhdGUgY2hhbmdlZDonLCBzdGF0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHJlY29yZGVyIGNhbiBoYXZlIGluYWN0aXZlLCByZWNvcmRpbmcsIHBhdXNlZCBvciBzdG9wcGVkIHN0YXRlcy5cclxuICAgICAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gc3RhdGUgLSBBIHJlY29yZGVyJ3Mgc3RhdGUgY2FuIGJlOiByZWNvcmRpbmcsIHBhdXNlZCwgc3RvcHBlZCBvciBpbmFjdGl2ZS5cclxuICAgICAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDXHJcbiAgICAgICAgICogQHN0YXRpY1xyXG4gICAgICAgICAqIEByZWFkb25seVxyXG4gICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICogLy8gdGhpcyBsb29wZXIgZnVuY3Rpb24gd2lsbCBrZWVwIHlvdSB1cGRhdGVkIGFib3V0IHRoZSByZWNvcmRlcidzIHN0YXRlcy5cclxuICAgICAgICAgKiAoZnVuY3Rpb24gbG9vcGVyKCkge1xyXG4gICAgICAgICAqICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoMScpLmlubmVySFRNTCA9ICdSZWNvcmRlclxcJ3Mgc3RhdGUgaXM6ICcgKyByZWNvcmRlci5zdGF0ZTtcclxuICAgICAgICAgKiAgICAgaWYocmVjb3JkZXIuc3RhdGUgPT09ICdzdG9wcGVkJykgcmV0dXJuOyAvLyBpZ25vcmUrc3RvcFxyXG4gICAgICAgICAqICAgICBzZXRUaW1lb3V0KGxvb3BlciwgMTAwMCk7IC8vIHVwZGF0ZSBhZnRlciBldmVyeSAzLXNlY29uZHNcclxuICAgICAgICAgKiB9KSgpO1xyXG4gICAgICAgICAqIHJlY29yZGVyLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc3RhdGU6ICdpbmFjdGl2ZScsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdldCByZWNvcmRlcidzIHJlYWRvbmx5IHN0YXRlLlxyXG4gICAgICAgICAqIEBtZXRob2RcclxuICAgICAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDXHJcbiAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgKiB2YXIgc3RhdGUgPSByZWNvcmRlci5nZXRTdGF0ZSgpO1xyXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFJldHVybnMgcmVjb3JkaW5nIHN0YXRlLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldFN0YXRlOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGVzdHJveSBSZWNvcmRSVEMgaW5zdGFuY2UuIENsZWFyIGFsbCByZWNvcmRlcnMgYW5kIG9iamVjdHMuXHJcbiAgICAgICAgICogQG1ldGhvZFxyXG4gICAgICAgICAqIEBtZW1iZXJvZiBSZWNvcmRSVENcclxuICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAqIHJlY29yZGVyLmRlc3Ryb3koKTtcclxuICAgICAgICAgKi9cclxuICAgICAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdmFyIGRpc2FibGVMb2dzQ2FjaGUgPSBjb25maWcuZGlzYWJsZUxvZ3M7XHJcblxyXG4gICAgICAgICAgICBjb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlTG9nczogdHJ1ZVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBzZWxmLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHNldFN0YXRlKCdkZXN0cm95ZWQnKTtcclxuICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gc2VsZiA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoU3RvcmFnZS5BdWRpb0NvbnRleHRDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAgICAgU3RvcmFnZS5BdWRpb0NvbnRleHRDb25zdHJ1Y3Rvci5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgU3RvcmFnZS5BdWRpb0NvbnRleHRDb25zdHJ1Y3RvciA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbmZpZy5kaXNhYmxlTG9ncyA9IGRpc2FibGVMb2dzQ2FjaGU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY29yZFJUQyBpcyBkZXN0cm95ZWQuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZWNvcmRSVEMgdmVyc2lvbiBudW1iZXJcclxuICAgICAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gdmVyc2lvbiAtIFJlbGVhc2UgdmVyc2lvbiBudW1iZXIuXHJcbiAgICAgICAgICogQG1lbWJlcm9mIFJlY29yZFJUQ1xyXG4gICAgICAgICAqIEBzdGF0aWNcclxuICAgICAgICAgKiBAcmVhZG9ubHlcclxuICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAqIGFsZXJ0KHJlY29yZGVyLnZlcnNpb24pO1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHZlcnNpb246ICc1LjUuOSdcclxuICAgIH07XHJcblxyXG4gICAgaWYgKCF0aGlzKSB7XHJcbiAgICAgICAgc2VsZiA9IHJldHVybk9iamVjdDtcclxuICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHNvbWVvbmUgd2FudHMgdG8gdXNlIFJlY29yZFJUQyB3aXRoIHRoZSBcIm5ld1wiIGtleXdvcmQuXHJcbiAgICBmb3IgKHZhciBwcm9wIGluIHJldHVybk9iamVjdCkge1xyXG4gICAgICAgIHRoaXNbcHJvcF0gPSByZXR1cm5PYmplY3RbcHJvcF07XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIHJldHVybk9iamVjdDtcclxufVxyXG5cclxuUmVjb3JkUlRDLnZlcnNpb24gPSAnNS41LjknO1xyXG5cclxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnIC8qICYmICEhbW9kdWxlLmV4cG9ydHMqLyApIHtcclxuICAgIG1vZHVsZS5leHBvcnRzID0gUmVjb3JkUlRDO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICBkZWZpbmUoJ1JlY29yZFJUQycsIFtdLCBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gUmVjb3JkUlRDO1xyXG4gICAgfSk7XHJcbn1cblxyXG5SZWNvcmRSVEMuZ2V0RnJvbURpc2sgPSBmdW5jdGlvbih0eXBlLCBjYWxsYmFjaykge1xyXG4gICAgaWYgKCFjYWxsYmFjaykge1xyXG4gICAgICAgIHRocm93ICdjYWxsYmFjayBpcyBtYW5kYXRvcnkuJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZygnR2V0dGluZyByZWNvcmRlZCAnICsgKHR5cGUgPT09ICdhbGwnID8gJ2Jsb2JzJyA6IHR5cGUgKyAnIGJsb2IgJykgKyAnIGZyb20gZGlzayEnKTtcclxuICAgIERpc2tTdG9yYWdlLkZldGNoKGZ1bmN0aW9uKGRhdGFVUkwsIF90eXBlKSB7XHJcbiAgICAgICAgaWYgKHR5cGUgIT09ICdhbGwnICYmIF90eXBlID09PSB0eXBlICsgJ0Jsb2InICYmIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGRhdGFVUkwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdhbGwnICYmIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGRhdGFVUkwsIF90eXBlLnJlcGxhY2UoJ0Jsb2InLCAnJykpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHN0b3JlIHJlY29yZGVkIGJsb2JzIGludG8gSW5kZXhlZERCIHN0b3JhZ2UuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0ge2F1ZGlvOiBCbG9iLCB2aWRlbzogQmxvYiwgZ2lmOiBCbG9ifVxyXG4gKiBAbWV0aG9kXHJcbiAqIEBtZW1iZXJvZiBSZWNvcmRSVENcclxuICogQGV4YW1wbGVcclxuICogUmVjb3JkUlRDLndyaXRlVG9EaXNrKHtcclxuICogICAgIGF1ZGlvOiBhdWRpb0Jsb2IsXHJcbiAqICAgICB2aWRlbzogdmlkZW9CbG9iLFxyXG4gKiAgICAgZ2lmICA6IGdpZkJsb2JcclxuICogfSk7XHJcbiAqL1xyXG5SZWNvcmRSVEMud3JpdGVUb0Rpc2sgPSBmdW5jdGlvbihvcHRpb25zKSB7XHJcbiAgICBjb25zb2xlLmxvZygnV3JpdGluZyByZWNvcmRlZCBibG9iKHMpIHRvIGRpc2shJyk7XHJcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuICAgIGlmIChvcHRpb25zLmF1ZGlvICYmIG9wdGlvbnMudmlkZW8gJiYgb3B0aW9ucy5naWYpIHtcclxuICAgICAgICBvcHRpb25zLmF1ZGlvLmdldERhdGFVUkwoZnVuY3Rpb24oYXVkaW9EYXRhVVJMKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMudmlkZW8uZ2V0RGF0YVVSTChmdW5jdGlvbih2aWRlb0RhdGFVUkwpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2lmLmdldERhdGFVUkwoZnVuY3Rpb24oZ2lmRGF0YVVSTCkge1xyXG4gICAgICAgICAgICAgICAgICAgIERpc2tTdG9yYWdlLlN0b3JlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9CbG9iOiBhdWRpb0RhdGFVUkwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvQmxvYjogdmlkZW9EYXRhVVJMLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnaWZCbG9iOiBnaWZEYXRhVVJMXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuYXVkaW8gJiYgb3B0aW9ucy52aWRlbykge1xyXG4gICAgICAgIG9wdGlvbnMuYXVkaW8uZ2V0RGF0YVVSTChmdW5jdGlvbihhdWRpb0RhdGFVUkwpIHtcclxuICAgICAgICAgICAgb3B0aW9ucy52aWRlby5nZXREYXRhVVJMKGZ1bmN0aW9uKHZpZGVvRGF0YVVSTCkge1xyXG4gICAgICAgICAgICAgICAgRGlza1N0b3JhZ2UuU3RvcmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIGF1ZGlvQmxvYjogYXVkaW9EYXRhVVJMLFxyXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvQmxvYjogdmlkZW9EYXRhVVJMXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuYXVkaW8gJiYgb3B0aW9ucy5naWYpIHtcclxuICAgICAgICBvcHRpb25zLmF1ZGlvLmdldERhdGFVUkwoZnVuY3Rpb24oYXVkaW9EYXRhVVJMKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuZ2lmLmdldERhdGFVUkwoZnVuY3Rpb24oZ2lmRGF0YVVSTCkge1xyXG4gICAgICAgICAgICAgICAgRGlza1N0b3JhZ2UuU3RvcmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIGF1ZGlvQmxvYjogYXVkaW9EYXRhVVJMLFxyXG4gICAgICAgICAgICAgICAgICAgIGdpZkJsb2I6IGdpZkRhdGFVUkxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy52aWRlbyAmJiBvcHRpb25zLmdpZikge1xyXG4gICAgICAgIG9wdGlvbnMudmlkZW8uZ2V0RGF0YVVSTChmdW5jdGlvbih2aWRlb0RhdGFVUkwpIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5naWYuZ2V0RGF0YVVSTChmdW5jdGlvbihnaWZEYXRhVVJMKSB7XHJcbiAgICAgICAgICAgICAgICBEaXNrU3RvcmFnZS5TdG9yZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9CbG9iOiB2aWRlb0RhdGFVUkwsXHJcbiAgICAgICAgICAgICAgICAgICAgZ2lmQmxvYjogZ2lmRGF0YVVSTFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmF1ZGlvKSB7XHJcbiAgICAgICAgb3B0aW9ucy5hdWRpby5nZXREYXRhVVJMKGZ1bmN0aW9uKGF1ZGlvRGF0YVVSTCkge1xyXG4gICAgICAgICAgICBEaXNrU3RvcmFnZS5TdG9yZSh7XHJcbiAgICAgICAgICAgICAgICBhdWRpb0Jsb2I6IGF1ZGlvRGF0YVVSTFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy52aWRlbykge1xyXG4gICAgICAgIG9wdGlvbnMudmlkZW8uZ2V0RGF0YVVSTChmdW5jdGlvbih2aWRlb0RhdGFVUkwpIHtcclxuICAgICAgICAgICAgRGlza1N0b3JhZ2UuU3RvcmUoe1xyXG4gICAgICAgICAgICAgICAgdmlkZW9CbG9iOiB2aWRlb0RhdGFVUkxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZ2lmKSB7XHJcbiAgICAgICAgb3B0aW9ucy5naWYuZ2V0RGF0YVVSTChmdW5jdGlvbihnaWZEYXRhVVJMKSB7XHJcbiAgICAgICAgICAgIERpc2tTdG9yYWdlLlN0b3JlKHtcclxuICAgICAgICAgICAgICAgIGdpZkJsb2I6IGdpZkRhdGFVUkxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn07XG5cclxuLy8gX19fX19fX19fX19fX19fX19fX19fX19fX19cclxuLy8gUmVjb3JkUlRDLUNvbmZpZ3VyYXRpb24uanNcclxuXHJcbi8qKlxyXG4gKiB7QGxpbmsgUmVjb3JkUlRDQ29uZmlndXJhdGlvbn0gaXMgYW4gaW5uZXIvcHJpdmF0ZSBoZWxwZXIgZm9yIHtAbGluayBSZWNvcmRSVEN9LlxyXG4gKiBAc3VtbWFyeSBJdCBjb25maWd1cmVzIHRoZSAybmQgcGFyYW1ldGVyIHBhc3NlZCBvdmVyIHtAbGluayBSZWNvcmRSVEN9IGFuZCByZXR1cm5zIGEgdmFsaWQgXCJjb25maWdcIiBvYmplY3QuXHJcbiAqIEBsaWNlbnNlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQy9ibG9iL21hc3Rlci9MSUNFTlNFfE1JVH1cclxuICogQGF1dGhvciB7QGxpbmsgaHR0cHM6Ly9NdWF6S2hhbi5jb218TXVheiBLaGFufVxyXG4gKiBAdHlwZWRlZiBSZWNvcmRSVENDb25maWd1cmF0aW9uXHJcbiAqIEBjbGFzc1xyXG4gKiBAZXhhbXBsZVxyXG4gKiB2YXIgb3B0aW9ucyA9IFJlY29yZFJUQ0NvbmZpZ3VyYXRpb24obWVkaWFTdHJlYW0sIG9wdGlvbnMpO1xyXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQ3xSZWNvcmRSVEMgU291cmNlIENvZGV9XHJcbiAqIEBwYXJhbSB7TWVkaWFTdHJlYW19IG1lZGlhU3RyZWFtIC0gTWVkaWFTdHJlYW0gb2JqZWN0IGZldGNoZWQgdXNpbmcgZ2V0VXNlck1lZGlhIEFQSSBvciBnZW5lcmF0ZWQgdXNpbmcgY2FwdHVyZVN0cmVhbVVudGlsRW5kZWQgb3IgV2ViQXVkaW8gQVBJLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0ge3R5cGU6XCJ2aWRlb1wiLCBkaXNhYmxlTG9nczogdHJ1ZSwgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzOiAxLCBidWZmZXJTaXplOiAwLCBzYW1wbGVSYXRlOiAwLCB2aWRlbzogSFRNTFZpZGVvRWxlbWVudCwgZ2V0TmF0aXZlQmxvYjp0cnVlLCBldGMufVxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIFJlY29yZFJUQ0NvbmZpZ3VyYXRpb24obWVkaWFTdHJlYW0sIGNvbmZpZykge1xyXG4gICAgaWYgKCFjb25maWcucmVjb3JkZXJUeXBlICYmICFjb25maWcudHlwZSkge1xyXG4gICAgICAgIGlmICghIWNvbmZpZy5hdWRpbyAmJiAhIWNvbmZpZy52aWRlbykge1xyXG4gICAgICAgICAgICBjb25maWcudHlwZSA9ICd2aWRlbyc7XHJcbiAgICAgICAgfSBlbHNlIGlmICghIWNvbmZpZy5hdWRpbyAmJiAhY29uZmlnLnZpZGVvKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gJ2F1ZGlvJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5yZWNvcmRlclR5cGUgJiYgIWNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5yZWNvcmRlclR5cGUgPT09IFdoYW1teVJlY29yZGVyIHx8IGNvbmZpZy5yZWNvcmRlclR5cGUgPT09IENhbnZhc1JlY29yZGVyIHx8ICh0eXBlb2YgV2ViQXNzZW1ibHlSZWNvcmRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uZmlnLnJlY29yZGVyVHlwZSA9PT0gV2ViQXNzZW1ibHlSZWNvcmRlcikpIHtcclxuICAgICAgICAgICAgY29uZmlnLnR5cGUgPSAndmlkZW8nO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnJlY29yZGVyVHlwZSA9PT0gR2lmUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgY29uZmlnLnR5cGUgPSAnZ2lmJztcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5yZWNvcmRlclR5cGUgPT09IFN0ZXJlb0F1ZGlvUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgY29uZmlnLnR5cGUgPSAnYXVkaW8nO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnJlY29yZGVyVHlwZSA9PT0gTWVkaWFTdHJlYW1SZWNvcmRlcikge1xyXG4gICAgICAgICAgICBpZiAoZ2V0VHJhY2tzKG1lZGlhU3RyZWFtLCAnYXVkaW8nKS5sZW5ndGggJiYgZ2V0VHJhY2tzKG1lZGlhU3RyZWFtLCAndmlkZW8nKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID0gJ3ZpZGVvJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghZ2V0VHJhY2tzKG1lZGlhU3RyZWFtLCAnYXVkaW8nKS5sZW5ndGggJiYgZ2V0VHJhY2tzKG1lZGlhU3RyZWFtLCAndmlkZW8nKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID0gJ3ZpZGVvJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRUcmFja3MobWVkaWFTdHJlYW0sICdhdWRpbycpLmxlbmd0aCAmJiAhZ2V0VHJhY2tzKG1lZGlhU3RyZWFtLCAndmlkZW8nKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID0gJ2F1ZGlvJztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbmZpZy50eXBlID0gJ1VuS25vd24nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgTWVkaWFTdHJlYW1SZWNvcmRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIE1lZGlhUmVjb3JkZXIgIT09ICd1bmRlZmluZWQnICYmICdyZXF1ZXN0RGF0YScgaW4gTWVkaWFSZWNvcmRlci5wcm90b3R5cGUpIHtcclxuICAgICAgICBpZiAoIWNvbmZpZy5taW1lVHlwZSkge1xyXG4gICAgICAgICAgICBjb25maWcubWltZVR5cGUgPSAndmlkZW8vd2VibSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gY29uZmlnLm1pbWVUeXBlLnNwbGl0KCcvJylbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNvbmZpZy5iaXRzUGVyU2Vjb25kKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbmZpZy5iaXRzUGVyU2Vjb25kID0gMTI4MDAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBjb25zaWRlciBkZWZhdWx0IHR5cGU9YXVkaW9cclxuICAgIGlmICghY29uZmlnLnR5cGUpIHtcclxuICAgICAgICBpZiAoY29uZmlnLm1pbWVUeXBlKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy50eXBlID0gY29uZmlnLm1pbWVUeXBlLnNwbGl0KCcvJylbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY29uZmlnLnR5cGUgPSAnYXVkaW8nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29uZmlnO1xyXG59XG5cclxuLy8gX19fX19fX19fX19fX19fX19fXHJcbi8vIEdldFJlY29yZGVyVHlwZS5qc1xyXG5cclxuLyoqXHJcbiAqIHtAbGluayBHZXRSZWNvcmRlclR5cGV9IGlzIGFuIGlubmVyL3ByaXZhdGUgaGVscGVyIGZvciB7QGxpbmsgUmVjb3JkUlRDfS5cclxuICogQHN1bW1hcnkgSXQgcmV0dXJucyBiZXN0IHJlY29yZGVyLXR5cGUgYXZhaWxhYmxlIGZvciB5b3VyIGJyb3dzZXIuXHJcbiAqIEBsaWNlbnNlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQy9ibG9iL21hc3Rlci9MSUNFTlNFfE1JVH1cclxuICogQGF1dGhvciB7QGxpbmsgaHR0cHM6Ly9NdWF6S2hhbi5jb218TXVheiBLaGFufVxyXG4gKiBAdHlwZWRlZiBHZXRSZWNvcmRlclR5cGVcclxuICogQGNsYXNzXHJcbiAqIEBleGFtcGxlXHJcbiAqIHZhciBSZWNvcmRlclR5cGUgPSBHZXRSZWNvcmRlclR5cGUob3B0aW9ucyk7XHJcbiAqIHZhciByZWNvcmRlciA9IG5ldyBSZWNvcmRlclR5cGUob3B0aW9ucyk7XHJcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tdWF6LWtoYW4vUmVjb3JkUlRDfFJlY29yZFJUQyBTb3VyY2UgQ29kZX1cclxuICogQHBhcmFtIHtNZWRpYVN0cmVhbX0gbWVkaWFTdHJlYW0gLSBNZWRpYVN0cmVhbSBvYmplY3QgZmV0Y2hlZCB1c2luZyBnZXRVc2VyTWVkaWEgQVBJIG9yIGdlbmVyYXRlZCB1c2luZyBjYXB0dXJlU3RyZWFtVW50aWxFbmRlZCBvciBXZWJBdWRpbyBBUEkuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSB7dHlwZTpcInZpZGVvXCIsIGRpc2FibGVMb2dzOiB0cnVlLCBudW1iZXJPZkF1ZGlvQ2hhbm5lbHM6IDEsIGJ1ZmZlclNpemU6IDAsIHNhbXBsZVJhdGU6IDAsIHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50LCBldGMufVxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIEdldFJlY29yZGVyVHlwZShtZWRpYVN0cmVhbSwgY29uZmlnKSB7XHJcbiAgICB2YXIgcmVjb3JkZXI7XHJcblxyXG4gICAgLy8gU3RlcmVvQXVkaW9SZWNvcmRlciBjYW4gd29yayB3aXRoIGFsbCB0aHJlZTogRWRnZSwgRmlyZWZveCBhbmQgQ2hyb21lXHJcbiAgICAvLyB0b2RvOiBkZXRlY3QgaWYgaXQgaXMgRWRnZSwgdGhlbiBhdXRvIHVzZTogU3RlcmVvQXVkaW9SZWNvcmRlclxyXG4gICAgaWYgKGlzQ2hyb21lIHx8IGlzRWRnZSB8fCBpc09wZXJhKSB7XHJcbiAgICAgICAgLy8gTWVkaWEgU3RyZWFtIFJlY29yZGluZyBBUEkgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIGluIGNocm9tZSB5ZXQ7XHJcbiAgICAgICAgLy8gVGhhdCdzIHdoeSB1c2luZyBXZWJBdWRpbyBBUEkgdG8gcmVjb3JkIHN0ZXJlbyBhdWRpbyBpbiBXQVYgZm9ybWF0XHJcbiAgICAgICAgcmVjb3JkZXIgPSBTdGVyZW9BdWRpb1JlY29yZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgTWVkaWFSZWNvcmRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgJ3JlcXVlc3REYXRhJyBpbiBNZWRpYVJlY29yZGVyLnByb3RvdHlwZSAmJiAhaXNDaHJvbWUpIHtcclxuICAgICAgICByZWNvcmRlciA9IE1lZGlhU3RyZWFtUmVjb3JkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdmlkZW8gcmVjb3JkZXIgKGluIFdlYk0gZm9ybWF0KVxyXG4gICAgaWYgKGNvbmZpZy50eXBlID09PSAndmlkZW8nICYmIChpc0Nocm9tZSB8fCBpc09wZXJhKSkge1xyXG4gICAgICAgIHJlY29yZGVyID0gV2hhbW15UmVjb3JkZXI7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgV2ViQXNzZW1ibHlSZWNvcmRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFJlYWRhYmxlU3RyZWFtICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZWNvcmRlciA9IFdlYkFzc2VtYmx5UmVjb3JkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHZpZGVvIHJlY29yZGVyIChpbiBHaWYgZm9ybWF0KVxyXG4gICAgaWYgKGNvbmZpZy50eXBlID09PSAnZ2lmJykge1xyXG4gICAgICAgIHJlY29yZGVyID0gR2lmUmVjb3JkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaHRtbDJjYW52YXMgcmVjb3JkaW5nIVxyXG4gICAgaWYgKGNvbmZpZy50eXBlID09PSAnY2FudmFzJykge1xyXG4gICAgICAgIHJlY29yZGVyID0gQ2FudmFzUmVjb3JkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzTWVkaWFSZWNvcmRlckNvbXBhdGlibGUoKSAmJiByZWNvcmRlciAhPT0gQ2FudmFzUmVjb3JkZXIgJiYgcmVjb3JkZXIgIT09IEdpZlJlY29yZGVyICYmIHR5cGVvZiBNZWRpYVJlY29yZGVyICE9PSAndW5kZWZpbmVkJyAmJiAncmVxdWVzdERhdGEnIGluIE1lZGlhUmVjb3JkZXIucHJvdG90eXBlKSB7XHJcbiAgICAgICAgaWYgKGdldFRyYWNrcyhtZWRpYVN0cmVhbSwgJ3ZpZGVvJykubGVuZ3RoIHx8IGdldFRyYWNrcyhtZWRpYVN0cmVhbSwgJ2F1ZGlvJykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIC8vIGF1ZGlvLW9ubHkgcmVjb3JkaW5nXHJcbiAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gJ2F1ZGlvJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBNZWRpYVJlY29yZGVyLmlzVHlwZVN1cHBvcnRlZCA9PT0gJ2Z1bmN0aW9uJyAmJiBNZWRpYVJlY29yZGVyLmlzVHlwZVN1cHBvcnRlZCgnYXVkaW8vd2VibScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkZXIgPSBNZWRpYVN0cmVhbVJlY29yZGVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gZWxzZSByZWNvcmRlciA9IFN0ZXJlb0F1ZGlvUmVjb3JkZXI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB2aWRlbyBvciBzY3JlZW4gdHJhY2tzXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIE1lZGlhUmVjb3JkZXIuaXNUeXBlU3VwcG9ydGVkID09PSAnZnVuY3Rpb24nICYmIE1lZGlhUmVjb3JkZXIuaXNUeXBlU3VwcG9ydGVkKCd2aWRlby93ZWJtJykpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWNvcmRlciA9IE1lZGlhU3RyZWFtUmVjb3JkZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1lZGlhU3RyZWFtIGluc3RhbmNlb2YgQXJyYXkgJiYgbWVkaWFTdHJlYW0ubGVuZ3RoKSB7XHJcbiAgICAgICAgcmVjb3JkZXIgPSBNdWx0aVN0cmVhbVJlY29yZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25maWcucmVjb3JkZXJUeXBlKSB7XHJcbiAgICAgICAgcmVjb3JkZXIgPSBjb25maWcucmVjb3JkZXJUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29uZmlnLmRpc2FibGVMb2dzICYmICEhcmVjb3JkZXIgJiYgISFyZWNvcmRlci5uYW1lKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1VzaW5nIHJlY29yZGVyVHlwZTonLCByZWNvcmRlci5uYW1lIHx8IHJlY29yZGVyLmNvbnN0cnVjdG9yLm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcmVjb3JkZXIgJiYgaXNTYWZhcmkpIHtcclxuICAgICAgICByZWNvcmRlciA9IE1lZGlhU3RyZWFtUmVjb3JkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlY29yZGVyO1xyXG59XG5cclxuLy8gX19fX19fX19fX19fX1xyXG4vLyBNUmVjb3JkUlRDLmpzXHJcblxyXG4vKipcclxuICogTVJlY29yZFJUQyBydW5zIG9uIHRvcCBvZiB7QGxpbmsgUmVjb3JkUlRDfSB0byBicmluZyBtdWx0aXBsZSByZWNvcmRpbmdzIGluIGEgc2luZ2xlIHBsYWNlLCBieSBwcm92aWRpbmcgc2ltcGxlIEFQSS5cclxuICogQHN1bW1hcnkgTVJlY29yZFJUQyBzdGFuZHMgZm9yIFwiTXVsdGlwbGUtUmVjb3JkUlRDXCIuXHJcbiAqIEBsaWNlbnNlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQy9ibG9iL21hc3Rlci9MSUNFTlNFfE1JVH1cclxuICogQGF1dGhvciB7QGxpbmsgaHR0cHM6Ly9NdWF6S2hhbi5jb218TXVheiBLaGFufVxyXG4gKiBAdHlwZWRlZiBNUmVjb3JkUlRDXHJcbiAqIEBjbGFzc1xyXG4gKiBAZXhhbXBsZVxyXG4gKiB2YXIgcmVjb3JkZXIgPSBuZXcgTVJlY29yZFJUQygpO1xyXG4gKiByZWNvcmRlci5hZGRTdHJlYW0oTWVkaWFTdHJlYW0pO1xyXG4gKiByZWNvcmRlci5tZWRpYVR5cGUgPSB7XHJcbiAqICAgICBhdWRpbzogdHJ1ZSwgLy8gb3IgU3RlcmVvQXVkaW9SZWNvcmRlciBvciBNZWRpYVN0cmVhbVJlY29yZGVyXHJcbiAqICAgICB2aWRlbzogdHJ1ZSwgLy8gb3IgV2hhbW15UmVjb3JkZXIgb3IgTWVkaWFTdHJlYW1SZWNvcmRlciBvciBXZWJBc3NlbWJseVJlY29yZGVyIG9yIENhbnZhc1JlY29yZGVyXHJcbiAqICAgICBnaWY6IHRydWUgICAgLy8gb3IgR2lmUmVjb3JkZXJcclxuICogfTtcclxuICogLy8gbWltZVR5cGUgaXMgb3B0aW9uYWwgYW5kIHNob3VsZCBiZSBzZXQgb25seSBpbiBhZHZhbmNlIGNhc2VzLlxyXG4gKiByZWNvcmRlci5taW1lVHlwZSA9IHtcclxuICogICAgIGF1ZGlvOiAnYXVkaW8vd2F2JyxcclxuICogICAgIHZpZGVvOiAndmlkZW8vd2VibScsXHJcbiAqICAgICBnaWY6ICAgJ2ltYWdlL2dpZidcclxuICogfTtcclxuICogcmVjb3JkZXIuc3RhcnRSZWNvcmRpbmcoKTtcclxuICogQHNlZSBGb3IgZnVydGhlciBpbmZvcm1hdGlvbjpcclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEMvdHJlZS9tYXN0ZXIvTVJlY29yZFJUQ3xNUmVjb3JkUlRDIFNvdXJjZSBDb2RlfVxyXG4gKiBAcGFyYW0ge01lZGlhU3RyZWFtfSBtZWRpYVN0cmVhbSAtIE1lZGlhU3RyZWFtIG9iamVjdCBmZXRjaGVkIHVzaW5nIGdldFVzZXJNZWRpYSBBUEkgb3IgZ2VuZXJhdGVkIHVzaW5nIGNhcHR1cmVTdHJlYW1VbnRpbEVuZGVkIG9yIFdlYkF1ZGlvIEFQSS5cclxuICogQHJlcXVpcmVzIHtAbGluayBSZWNvcmRSVEN9XHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gTVJlY29yZFJUQyhtZWRpYVN0cmVhbSkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgYXR0YWNoZXMgTWVkaWFTdHJlYW0gb2JqZWN0IHRvIHtAbGluayBNUmVjb3JkUlRDfS5cclxuICAgICAqIEBwYXJhbSB7TWVkaWFTdHJlYW19IG1lZGlhU3RyZWFtIC0gQSBNZWRpYVN0cmVhbSBvYmplY3QsIGVpdGhlciBmZXRjaGVkIHVzaW5nIGdldFVzZXJNZWRpYSBBUEksIG9yIGdlbmVyYXRlZCB1c2luZyBjYXB0dXJlU3RyZWFtVW50aWxFbmRlZCBvciBXZWJBdWRpbyBBUEkuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgTVJlY29yZFJUQ1xyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLmFkZFN0cmVhbShNZWRpYVN0cmVhbSk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMuYWRkU3RyZWFtID0gZnVuY3Rpb24oX21lZGlhU3RyZWFtKSB7XHJcbiAgICAgICAgaWYgKF9tZWRpYVN0cmVhbSkge1xyXG4gICAgICAgICAgICBtZWRpYVN0cmVhbSA9IF9tZWRpYVN0cmVhbTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHJlY29yZGluZyB0eXBlIGUuZy4gYXVkaW8sIG9yIHZpZGVvLCBvciBnaWYsIG9yIGNhbnZhcy5cclxuICAgICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBtZWRpYVR5cGUgLSB7YXVkaW86IHRydWUsIHZpZGVvOiB0cnVlLCBnaWY6IHRydWV9XHJcbiAgICAgKiBAbWVtYmVyb2YgTVJlY29yZFJUQ1xyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHZhciByZWNvcmRlciA9IG5ldyBNUmVjb3JkUlRDKCk7XHJcbiAgICAgKiByZWNvcmRlci5tZWRpYVR5cGUgPSB7XHJcbiAgICAgKiAgICAgYXVkaW86IHRydWUsIC8vIFRSVUUgb3IgU3RlcmVvQXVkaW9SZWNvcmRlciBvciBNZWRpYVN0cmVhbVJlY29yZGVyXHJcbiAgICAgKiAgICAgdmlkZW86IHRydWUsIC8vIFRSVUUgb3IgV2hhbW15UmVjb3JkZXIgb3IgTWVkaWFTdHJlYW1SZWNvcmRlciBvciBXZWJBc3NlbWJseVJlY29yZGVyIG9yIENhbnZhc1JlY29yZGVyXHJcbiAgICAgKiAgICAgZ2lmICA6IHRydWUgIC8vIFRSVUUgb3IgR2lmUmVjb3JkZXJcclxuICAgICAqIH07XHJcbiAgICAgKi9cclxuICAgIHRoaXMubWVkaWFUeXBlID0ge1xyXG4gICAgICAgIGF1ZGlvOiB0cnVlLFxyXG4gICAgICAgIHZpZGVvOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2Qgc3RhcnRzIHJlY29yZGluZy5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNUmVjb3JkUlRDXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5zdGFydFJlY29yZGluZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBtZWRpYVR5cGUgPSB0aGlzLm1lZGlhVHlwZTtcclxuICAgICAgICB2YXIgcmVjb3JkZXJUeXBlO1xyXG4gICAgICAgIHZhciBtaW1lVHlwZSA9IHRoaXMubWltZVR5cGUgfHwge1xyXG4gICAgICAgICAgICBhdWRpbzogbnVsbCxcclxuICAgICAgICAgICAgdmlkZW86IG51bGwsXHJcbiAgICAgICAgICAgIGdpZjogbnVsbFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgbWVkaWFUeXBlLmF1ZGlvICE9PSAnZnVuY3Rpb24nICYmIGlzTWVkaWFSZWNvcmRlckNvbXBhdGlibGUoKSAmJiAhZ2V0VHJhY2tzKG1lZGlhU3RyZWFtLCAnYXVkaW8nKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbWVkaWFUeXBlLmF1ZGlvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIG1lZGlhVHlwZS52aWRlbyAhPT0gJ2Z1bmN0aW9uJyAmJiBpc01lZGlhUmVjb3JkZXJDb21wYXRpYmxlKCkgJiYgIWdldFRyYWNrcyhtZWRpYVN0cmVhbSwgJ3ZpZGVvJykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIG1lZGlhVHlwZS52aWRlbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBtZWRpYVR5cGUuZ2lmICE9PSAnZnVuY3Rpb24nICYmIGlzTWVkaWFSZWNvcmRlckNvbXBhdGlibGUoKSAmJiAhZ2V0VHJhY2tzKG1lZGlhU3RyZWFtLCAndmlkZW8nKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgbWVkaWFUeXBlLmdpZiA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFtZWRpYVR5cGUuYXVkaW8gJiYgIW1lZGlhVHlwZS52aWRlbyAmJiAhbWVkaWFUeXBlLmdpZikge1xyXG4gICAgICAgICAgICB0aHJvdyAnTWVkaWFTdHJlYW0gbXVzdCBoYXZlIGVpdGhlciBhdWRpbyBvciB2aWRlbyB0cmFja3MuJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghIW1lZGlhVHlwZS5hdWRpbykge1xyXG4gICAgICAgICAgICByZWNvcmRlclR5cGUgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG1lZGlhVHlwZS5hdWRpbyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgcmVjb3JkZXJUeXBlID0gbWVkaWFUeXBlLmF1ZGlvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmF1ZGlvUmVjb3JkZXIgPSBuZXcgUmVjb3JkUlRDKG1lZGlhU3RyZWFtLCB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXVkaW8nLFxyXG4gICAgICAgICAgICAgICAgYnVmZmVyU2l6ZTogdGhpcy5idWZmZXJTaXplLFxyXG4gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTogdGhpcy5zYW1wbGVSYXRlLFxyXG4gICAgICAgICAgICAgICAgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzOiB0aGlzLm51bWJlck9mQXVkaW9DaGFubmVscyB8fCAyLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZUxvZ3M6IHRoaXMuZGlzYWJsZUxvZ3MsXHJcbiAgICAgICAgICAgICAgICByZWNvcmRlclR5cGU6IHJlY29yZGVyVHlwZSxcclxuICAgICAgICAgICAgICAgIG1pbWVUeXBlOiBtaW1lVHlwZS5hdWRpbyxcclxuICAgICAgICAgICAgICAgIHRpbWVTbGljZTogdGhpcy50aW1lU2xpY2UsXHJcbiAgICAgICAgICAgICAgICBvblRpbWVTdGFtcDogdGhpcy5vblRpbWVTdGFtcFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghbWVkaWFUeXBlLnZpZGVvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvUmVjb3JkZXIuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCEhbWVkaWFUeXBlLnZpZGVvKSB7XHJcbiAgICAgICAgICAgIHJlY29yZGVyVHlwZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVkaWFUeXBlLnZpZGVvID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICByZWNvcmRlclR5cGUgPSBtZWRpYVR5cGUudmlkZW87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBuZXdTdHJlYW0gPSBtZWRpYVN0cmVhbTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc01lZGlhUmVjb3JkZXJDb21wYXRpYmxlKCkgJiYgISFtZWRpYVR5cGUuYXVkaW8gJiYgdHlwZW9mIG1lZGlhVHlwZS5hdWRpbyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZpZGVvVHJhY2sgPSBnZXRUcmFja3MobWVkaWFTdHJlYW0sICd2aWRlbycpWzBdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpc0ZpcmVmb3gpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0oKTtcclxuICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0uYWRkVHJhY2sodmlkZW9UcmFjayk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmRlclR5cGUgJiYgcmVjb3JkZXJUeXBlID09PSBXaGFtbXlSZWNvcmRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJlZm94IGRvZXMgTk9UIHN1cHBvcnRzIHdlYnAtZW5jb2RpbmcgeWV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1dCBGaXJlZm94IGRvIHN1cHBvcnRzIFdlYkFzc2VtYmx5UmVjb3JkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkZXJUeXBlID0gTWVkaWFTdHJlYW1SZWNvcmRlcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBNZWRpYVN0cmVhbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS5hZGRUcmFjayh2aWRlb1RyYWNrKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy52aWRlb1JlY29yZGVyID0gbmV3IFJlY29yZFJUQyhuZXdTdHJlYW0sIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICd2aWRlbycsXHJcbiAgICAgICAgICAgICAgICB2aWRlbzogdGhpcy52aWRlbyxcclxuICAgICAgICAgICAgICAgIGNhbnZhczogdGhpcy5jYW52YXMsXHJcbiAgICAgICAgICAgICAgICBmcmFtZUludGVydmFsOiB0aGlzLmZyYW1lSW50ZXJ2YWwgfHwgMTAsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlTG9nczogdGhpcy5kaXNhYmxlTG9ncyxcclxuICAgICAgICAgICAgICAgIHJlY29yZGVyVHlwZTogcmVjb3JkZXJUeXBlLFxyXG4gICAgICAgICAgICAgICAgbWltZVR5cGU6IG1pbWVUeXBlLnZpZGVvLFxyXG4gICAgICAgICAgICAgICAgdGltZVNsaWNlOiB0aGlzLnRpbWVTbGljZSxcclxuICAgICAgICAgICAgICAgIG9uVGltZVN0YW1wOiB0aGlzLm9uVGltZVN0YW1wLFxyXG4gICAgICAgICAgICAgICAgd29ya2VyUGF0aDogdGhpcy53b3JrZXJQYXRoLFxyXG4gICAgICAgICAgICAgICAgd2ViQXNzZW1ibHlQYXRoOiB0aGlzLndlYkFzc2VtYmx5UGF0aCxcclxuICAgICAgICAgICAgICAgIGZyYW1lUmF0ZTogdGhpcy5mcmFtZVJhdGUsIC8vIHVzZWQgYnkgV2ViQXNzZW1ibHlSZWNvcmRlcjsgdmFsdWVzOiB1c3VhbGx5IDMwOyBhY2NlcHRzIGFueS5cclxuICAgICAgICAgICAgICAgIGJpdHJhdGU6IHRoaXMuYml0cmF0ZSAvLyB1c2VkIGJ5IFdlYkFzc2VtYmx5UmVjb3JkZXI7IHZhbHVlczogMCB0byAxMDAwK1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghbWVkaWFUeXBlLmF1ZGlvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvUmVjb3JkZXIuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCEhbWVkaWFUeXBlLmF1ZGlvICYmICEhbWVkaWFUeXBlLnZpZGVvKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgICAgIHZhciBpc1NpbmdsZVJlY29yZGVyID0gaXNNZWRpYVJlY29yZGVyQ29tcGF0aWJsZSgpID09PSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1lZGlhVHlwZS5hdWRpbyBpbnN0YW5jZW9mIFN0ZXJlb0F1ZGlvUmVjb3JkZXIgJiYgISFtZWRpYVR5cGUudmlkZW8pIHtcclxuICAgICAgICAgICAgICAgIGlzU2luZ2xlUmVjb3JkZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUuYXVkaW8gIT09IHRydWUgJiYgbWVkaWFUeXBlLnZpZGVvICE9PSB0cnVlICYmIG1lZGlhVHlwZS5hdWRpbyAhPT0gbWVkaWFUeXBlLnZpZGVvKSB7XHJcbiAgICAgICAgICAgICAgICBpc1NpbmdsZVJlY29yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpc1NpbmdsZVJlY29yZGVyID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmF1ZGlvUmVjb3JkZXIgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgc2VsZi52aWRlb1JlY29yZGVyLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnZpZGVvUmVjb3JkZXIuaW5pdFJlY29yZGVyKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuYXVkaW9SZWNvcmRlci5pbml0UmVjb3JkZXIoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggcmVjb3JkZXJzIGFyZSByZWFkeSB0byByZWNvcmQgdGhpbmdzIGFjY3VyYXRlbHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52aWRlb1JlY29yZGVyLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXVkaW9SZWNvcmRlci5zdGFydFJlY29yZGluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghIW1lZGlhVHlwZS5naWYpIHtcclxuICAgICAgICAgICAgcmVjb3JkZXJUeXBlID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZWRpYVR5cGUuZ2lmID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICByZWNvcmRlclR5cGUgPSBtZWRpYVR5cGUuZ2lmO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZ2lmUmVjb3JkZXIgPSBuZXcgUmVjb3JkUlRDKG1lZGlhU3RyZWFtLCB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZ2lmJyxcclxuICAgICAgICAgICAgICAgIGZyYW1lUmF0ZTogdGhpcy5mcmFtZVJhdGUgfHwgMjAwLFxyXG4gICAgICAgICAgICAgICAgcXVhbGl0eTogdGhpcy5xdWFsaXR5IHx8IDEwLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZUxvZ3M6IHRoaXMuZGlzYWJsZUxvZ3MsXHJcbiAgICAgICAgICAgICAgICByZWNvcmRlclR5cGU6IHJlY29yZGVyVHlwZSxcclxuICAgICAgICAgICAgICAgIG1pbWVUeXBlOiBtaW1lVHlwZS5naWZcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2lmUmVjb3JkZXIuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2Qgc3RvcHMgcmVjb3JkaW5nLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbiBpcyBpbnZva2VkIHdoZW4gYWxsIGVuY29kZXJzIGZpbmlzaGVkIHRoZWlyIGpvYnMuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgTVJlY29yZFJUQ1xyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnN0b3BSZWNvcmRpbmcoZnVuY3Rpb24ocmVjb3JkaW5nKXtcclxuICAgICAqICAgICB2YXIgYXVkaW9CbG9iID0gcmVjb3JkaW5nLmF1ZGlvO1xyXG4gICAgICogICAgIHZhciB2aWRlb0Jsb2IgPSByZWNvcmRpbmcudmlkZW87XHJcbiAgICAgKiAgICAgdmFyIGdpZkJsb2IgICA9IHJlY29yZGluZy5naWY7XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5zdG9wUmVjb3JkaW5nID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmF1ZGlvUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5hdWRpb1JlY29yZGVyLnN0b3BSZWNvcmRpbmcoZnVuY3Rpb24oYmxvYlVSTCkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soYmxvYlVSTCwgJ2F1ZGlvJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudmlkZW9SZWNvcmRlcikge1xyXG4gICAgICAgICAgICB0aGlzLnZpZGVvUmVjb3JkZXIuc3RvcFJlY29yZGluZyhmdW5jdGlvbihibG9iVVJMKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhibG9iVVJMLCAndmlkZW8nKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5naWZSZWNvcmRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmdpZlJlY29yZGVyLnN0b3BSZWNvcmRpbmcoZnVuY3Rpb24oYmxvYlVSTCkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soYmxvYlVSTCwgJ2dpZicpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcGF1c2VzIHJlY29yZGluZy5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNUmVjb3JkUlRDXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIucGF1c2VSZWNvcmRpbmcoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5wYXVzZVJlY29yZGluZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmF1ZGlvUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5hdWRpb1JlY29yZGVyLnBhdXNlUmVjb3JkaW5nKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy52aWRlb1JlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlkZW9SZWNvcmRlci5wYXVzZVJlY29yZGluZygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2lmUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5naWZSZWNvcmRlci5wYXVzZVJlY29yZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCByZXN1bWVzIHJlY29yZGluZy5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNUmVjb3JkUlRDXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIucmVzdW1lUmVjb3JkaW5nKCk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMucmVzdW1lUmVjb3JkaW5nID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXVkaW9SZWNvcmRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmF1ZGlvUmVjb3JkZXIucmVzdW1lUmVjb3JkaW5nKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy52aWRlb1JlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlkZW9SZWNvcmRlci5yZXN1bWVSZWNvcmRpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdpZlJlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2lmUmVjb3JkZXIucmVzdW1lUmVjb3JkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIG1hbnVhbGx5IGdldCBhbGwgcmVjb3JkZWQgYmxvYnMuXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEFsbCByZWNvcmRlZCBibG9icyBhcmUgcGFzc2VkIGJhY2sgdG8gdGhlIFwiY2FsbGJhY2tcIiBmdW5jdGlvbi5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNUmVjb3JkUlRDXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuZ2V0QmxvYihmdW5jdGlvbihyZWNvcmRpbmcpe1xyXG4gICAgICogICAgIHZhciBhdWRpb0Jsb2IgPSByZWNvcmRpbmcuYXVkaW87XHJcbiAgICAgKiAgICAgdmFyIHZpZGVvQmxvYiA9IHJlY29yZGluZy52aWRlbztcclxuICAgICAqICAgICB2YXIgZ2lmQmxvYiAgID0gcmVjb3JkaW5nLmdpZjtcclxuICAgICAqIH0pO1xyXG4gICAgICogLy8gb3JcclxuICAgICAqIHZhciBhdWRpb0Jsb2IgPSByZWNvcmRlci5nZXRCbG9iKCkuYXVkaW87XHJcbiAgICAgKiB2YXIgdmlkZW9CbG9iID0gcmVjb3JkZXIuZ2V0QmxvYigpLnZpZGVvO1xyXG4gICAgICovXHJcbiAgICB0aGlzLmdldEJsb2IgPSBmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgICAgIHZhciBvdXRwdXQgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXVkaW9SZWNvcmRlcikge1xyXG4gICAgICAgICAgICBvdXRwdXQuYXVkaW8gPSB0aGlzLmF1ZGlvUmVjb3JkZXIuZ2V0QmxvYigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudmlkZW9SZWNvcmRlcikge1xyXG4gICAgICAgICAgICBvdXRwdXQudmlkZW8gPSB0aGlzLnZpZGVvUmVjb3JkZXIuZ2V0QmxvYigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2lmUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgb3V0cHV0LmdpZiA9IHRoaXMuZ2lmUmVjb3JkZXIuZ2V0QmxvYigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKG91dHB1dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3kgYWxsIHJlY29yZGVyIGluc3RhbmNlcy5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNUmVjb3JkUlRDXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuZGVzdHJveSgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5hdWRpb1JlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXVkaW9SZWNvcmRlci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYXVkaW9SZWNvcmRlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy52aWRlb1JlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlkZW9SZWNvcmRlci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMudmlkZW9SZWNvcmRlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5naWZSZWNvcmRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmdpZlJlY29yZGVyLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5naWZSZWNvcmRlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIG1hbnVhbGx5IGdldCBhbGwgcmVjb3JkZWQgYmxvYnMnIERhdGFVUkxzLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBBbGwgcmVjb3JkZWQgYmxvYnMnIERhdGFVUkxzIGFyZSBwYXNzZWQgYmFjayB0byB0aGUgXCJjYWxsYmFja1wiIGZ1bmN0aW9uLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIE1SZWNvcmRSVENcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5nZXREYXRhVVJMKGZ1bmN0aW9uKHJlY29yZGluZyl7XHJcbiAgICAgKiAgICAgdmFyIGF1ZGlvRGF0YVVSTCA9IHJlY29yZGluZy5hdWRpbztcclxuICAgICAqICAgICB2YXIgdmlkZW9EYXRhVVJMID0gcmVjb3JkaW5nLnZpZGVvO1xyXG4gICAgICogICAgIHZhciBnaWZEYXRhVVJMICAgPSByZWNvcmRpbmcuZ2lmO1xyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMuZ2V0RGF0YVVSTCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5nZXRCbG9iKGZ1bmN0aW9uKGJsb2IpIHtcclxuICAgICAgICAgICAgaWYgKGJsb2IuYXVkaW8gJiYgYmxvYi52aWRlbykge1xyXG4gICAgICAgICAgICAgICAgZ2V0RGF0YVVSTChibG9iLmF1ZGlvLCBmdW5jdGlvbihfYXVkaW9EYXRhVVJMKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0RGF0YVVSTChibG9iLnZpZGVvLCBmdW5jdGlvbihfdmlkZW9EYXRhVVJMKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvOiBfYXVkaW9EYXRhVVJMLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW86IF92aWRlb0RhdGFVUkxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChibG9iLmF1ZGlvKSB7XHJcbiAgICAgICAgICAgICAgICBnZXREYXRhVVJMKGJsb2IuYXVkaW8sIGZ1bmN0aW9uKF9hdWRpb0RhdGFVUkwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvOiBfYXVkaW9EYXRhVVJMXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChibG9iLnZpZGVvKSB7XHJcbiAgICAgICAgICAgICAgICBnZXREYXRhVVJMKGJsb2IudmlkZW8sIGZ1bmN0aW9uKF92aWRlb0RhdGFVUkwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvOiBfdmlkZW9EYXRhVVJMXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXREYXRhVVJMKGJsb2IsIGNhbGxiYWNrMDApIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBXb3JrZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgd2ViV29ya2VyID0gcHJvY2Vzc0luV2ViV29ya2VyKGZ1bmN0aW9uIHJlYWRGaWxlKF9ibG9iKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2UobmV3IEZpbGVSZWFkZXJTeW5jKCkucmVhZEFzRGF0YVVSTChfYmxvYikpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgd2ViV29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2swMChldmVudC5kYXRhKTtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgd2ViV29ya2VyLnBvc3RNZXNzYWdlKGJsb2IpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrMDAoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzSW5XZWJXb3JrZXIoX2Z1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIHZhciBibG9iID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbX2Z1bmN0aW9uLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICAndGhpcy5vbm1lc3NhZ2UgPSAgZnVuY3Rpb24gKGVlZSkgeycgKyBfZnVuY3Rpb24ubmFtZSArICcoZWVlLmRhdGEpO30nXHJcbiAgICAgICAgICAgIF0sIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0J1xyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlcihibG9iKTtcclxuICAgICAgICAgICAgdmFyIHVybDtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBVUkwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICB1cmwgPSBVUkw7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdlYmtpdFVSTCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIHVybCA9IHdlYmtpdFVSTDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93ICdOZWl0aGVyIFVSTCBub3Igd2Via2l0VVJMIGRldGVjdGVkLic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdXJsLnJldm9rZU9iamVjdFVSTChibG9iKTtcclxuICAgICAgICAgICAgcmV0dXJuIHdvcmtlcjtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gYXNrIHtAbGluayBNUmVjb3JkUlRDfSB0byB3cml0ZSBhbGwgcmVjb3JkZWQgYmxvYnMgaW50byBJbmRleGVkREIgc3RvcmFnZS5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNUmVjb3JkUlRDXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIud3JpdGVUb0Rpc2soKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy53cml0ZVRvRGlzayA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIFJlY29yZFJUQy53cml0ZVRvRGlzayh7XHJcbiAgICAgICAgICAgIGF1ZGlvOiB0aGlzLmF1ZGlvUmVjb3JkZXIsXHJcbiAgICAgICAgICAgIHZpZGVvOiB0aGlzLnZpZGVvUmVjb3JkZXIsXHJcbiAgICAgICAgICAgIGdpZjogdGhpcy5naWZSZWNvcmRlclxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGludm9rZSBhIHNhdmUtYXMgZGlhbG9nIGZvciBhbGwgcmVjb3JkZWQgYmxvYnMuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIHthdWRpbzogJ2F1ZGlvLW5hbWUnLCB2aWRlbzogJ3ZpZGVvLW5hbWUnLCBnaWY6ICdnaWYtbmFtZSd9XHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgTVJlY29yZFJUQ1xyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnNhdmUoe1xyXG4gICAgICogICAgIGF1ZGlvOiAnYXVkaW8tZmlsZS1uYW1lJyxcclxuICAgICAqICAgICB2aWRlbzogJ3ZpZGVvLWZpbGUtbmFtZScsXHJcbiAgICAgKiAgICAgZ2lmICA6ICdnaWYtZmlsZS1uYW1lJ1xyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMuc2F2ZSA9IGZ1bmN0aW9uKGFyZ3MpIHtcclxuICAgICAgICBhcmdzID0gYXJncyB8fCB7XHJcbiAgICAgICAgICAgIGF1ZGlvOiB0cnVlLFxyXG4gICAgICAgICAgICB2aWRlbzogdHJ1ZSxcclxuICAgICAgICAgICAgZ2lmOiB0cnVlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKCEhYXJncy5hdWRpbyAmJiB0aGlzLmF1ZGlvUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5hdWRpb1JlY29yZGVyLnNhdmUodHlwZW9mIGFyZ3MuYXVkaW8gPT09ICdzdHJpbmcnID8gYXJncy5hdWRpbyA6ICcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghIWFyZ3MudmlkZW8gJiYgdGhpcy52aWRlb1JlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlkZW9SZWNvcmRlci5zYXZlKHR5cGVvZiBhcmdzLnZpZGVvID09PSAnc3RyaW5nJyA/IGFyZ3MudmlkZW8gOiAnJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghIWFyZ3MuZ2lmICYmIHRoaXMuZ2lmUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5naWZSZWNvcmRlci5zYXZlKHR5cGVvZiBhcmdzLmdpZiA9PT0gJ3N0cmluZycgPyBhcmdzLmdpZiA6ICcnKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZ2V0IGFsbCByZWNvcmRlZCBibG9icyBmcm9tIEluZGV4ZWREQiBzdG9yYWdlLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtICdhbGwnIG9yICdhdWRpbycgb3IgJ3ZpZGVvJyBvciAnZ2lmJ1xyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGdldCBhbGwgc3RvcmVkIGJsb2JzLlxyXG4gKiBAbWV0aG9kXHJcbiAqIEBtZW1iZXJvZiBNUmVjb3JkUlRDXHJcbiAqIEBleGFtcGxlXHJcbiAqIE1SZWNvcmRSVEMuZ2V0RnJvbURpc2soJ2FsbCcsIGZ1bmN0aW9uKGRhdGFVUkwsIHR5cGUpe1xyXG4gKiAgICAgaWYodHlwZSA9PT0gJ2F1ZGlvJykgeyB9XHJcbiAqICAgICBpZih0eXBlID09PSAndmlkZW8nKSB7IH1cclxuICogICAgIGlmKHR5cGUgPT09ICdnaWYnKSAgIHsgfVxyXG4gKiB9KTtcclxuICovXHJcbk1SZWNvcmRSVEMuZ2V0RnJvbURpc2sgPSBSZWNvcmRSVEMuZ2V0RnJvbURpc2s7XHJcblxyXG4vKipcclxuICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc3RvcmUgcmVjb3JkZWQgYmxvYnMgaW50byBJbmRleGVkREIgc3RvcmFnZS5cclxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSB7YXVkaW86IEJsb2IsIHZpZGVvOiBCbG9iLCBnaWY6IEJsb2J9XHJcbiAqIEBtZXRob2RcclxuICogQG1lbWJlcm9mIE1SZWNvcmRSVENcclxuICogQGV4YW1wbGVcclxuICogTVJlY29yZFJUQy53cml0ZVRvRGlzayh7XHJcbiAqICAgICBhdWRpbzogYXVkaW9CbG9iLFxyXG4gKiAgICAgdmlkZW86IHZpZGVvQmxvYixcclxuICogICAgIGdpZiAgOiBnaWZCbG9iXHJcbiAqIH0pO1xyXG4gKi9cclxuTVJlY29yZFJUQy53cml0ZVRvRGlzayA9IFJlY29yZFJUQy53cml0ZVRvRGlzaztcclxuXHJcbmlmICh0eXBlb2YgUmVjb3JkUlRDICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgUmVjb3JkUlRDLk1SZWNvcmRSVEMgPSBNUmVjb3JkUlRDO1xyXG59XG5cclxudmFyIGJyb3dzZXJGYWtlVXNlckFnZW50ID0gJ0Zha2UvNS4wIChGYWtlT1MpIEFwcGxlV2ViS2l0LzEyMyAoS0hUTUwsIGxpa2UgR2Vja28pIEZha2UvMTIuMy40NTY3Ljg5IEZha2UvMTIzLjQ1JztcclxuXHJcbihmdW5jdGlvbih0aGF0KSB7XHJcbiAgICBpZiAoIXRoYXQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBnbG9iYWwubmF2aWdhdG9yID0ge1xyXG4gICAgICAgIHVzZXJBZ2VudDogYnJvd3NlckZha2VVc2VyQWdlbnQsXHJcbiAgICAgICAgZ2V0VXNlck1lZGlhOiBmdW5jdGlvbigpIHt9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmICghZ2xvYmFsLmNvbnNvbGUpIHtcclxuICAgICAgICBnbG9iYWwuY29uc29sZSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsLmNvbnNvbGUubG9nID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZ2xvYmFsLmNvbnNvbGUuZXJyb3IgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgZ2xvYmFsLmNvbnNvbGUuZXJyb3IgPSBnbG9iYWwuY29uc29sZS5sb2cgPSBnbG9iYWwuY29uc29sZS5sb2cgfHwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGFyZ3VtZW50cyk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8qZ2xvYmFsIGRvY3VtZW50OnRydWUgKi9cclxuICAgICAgICB0aGF0LmRvY3VtZW50ID0ge1xyXG4gICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQ6IHtcclxuICAgICAgICAgICAgICAgIGFwcGVuZENoaWxkOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50ID0gZG9jdW1lbnQuY2FwdHVyZVN0cmVhbSA9IGRvY3VtZW50Lm1vekNhcHR1cmVTdHJlYW0gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdmFyIG9iaiA9IHtcclxuICAgICAgICAgICAgICAgIGdldENvbnRleHQ6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcGxheTogZnVuY3Rpb24oKSB7fSxcclxuICAgICAgICAgICAgICAgIHBhdXNlOiBmdW5jdGlvbigpIHt9LFxyXG4gICAgICAgICAgICAgICAgZHJhd0ltYWdlOiBmdW5jdGlvbigpIHt9LFxyXG4gICAgICAgICAgICAgICAgdG9EYXRhVVJMOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHt9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhhdC5IVE1MVmlkZW9FbGVtZW50ID0gZnVuY3Rpb24oKSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8qZ2xvYmFsIGxvY2F0aW9uOnRydWUgKi9cclxuICAgICAgICB0aGF0LmxvY2F0aW9uID0ge1xyXG4gICAgICAgICAgICBwcm90b2NvbDogJ2ZpbGU6JyxcclxuICAgICAgICAgICAgaHJlZjogJycsXHJcbiAgICAgICAgICAgIGhhc2g6ICcnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHNjcmVlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvKmdsb2JhbCBzY3JlZW46dHJ1ZSAqL1xyXG4gICAgICAgIHRoYXQuc2NyZWVuID0ge1xyXG4gICAgICAgICAgICB3aWR0aDogMCxcclxuICAgICAgICAgICAgaGVpZ2h0OiAwXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvKmdsb2JhbCBzY3JlZW46dHJ1ZSAqL1xyXG4gICAgICAgIHRoYXQuVVJMID0ge1xyXG4gICAgICAgICAgICBjcmVhdGVPYmplY3RVUkw6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICByZXZva2VPYmplY3RVUkw6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKmdsb2JhbCB3aW5kb3c6dHJ1ZSAqL1xyXG4gICAgdGhhdC53aW5kb3cgPSBnbG9iYWw7XHJcbn0pKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogbnVsbCk7XG5cclxuLy8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cclxuLy8gQ3Jvc3MtQnJvd3Nlci1EZWNsYXJhdGlvbnMuanNcclxuXHJcbi8vIGFuaW1hdGlvbi1mcmFtZSB1c2VkIGluIFdlYk0gcmVjb3JkaW5nXHJcblxyXG4vKmpzaGludCAtVzA3OSAqL1xyXG52YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTtcclxuaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICBpZiAodHlwZW9mIHdlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvKmdsb2JhbCByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6dHJ1ZSAqL1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1velJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvKmdsb2JhbCByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6dHJ1ZSAqL1xyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IG1velJlcXVlc3RBbmltYXRpb25GcmFtZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8qZ2xvYmFsIHJlcXVlc3RBbmltYXRpb25GcmFtZTp0cnVlICovXHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gbXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gdmlhOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9wYXVsaXJpc2gvMTU3OTY3MVxyXG4gICAgICAgIHZhciBsYXN0VGltZSA9IDA7XHJcblxyXG4gICAgICAgIC8qZ2xvYmFsIHJlcXVlc3RBbmltYXRpb25GcmFtZTp0cnVlICovXHJcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24oY2FsbGJhY2ssIGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdmFyIGN1cnJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIHZhciB0aW1lVG9DYWxsID0gTWF0aC5tYXgoMCwgMTYgLSAoY3VyclRpbWUgLSBsYXN0VGltZSkpO1xyXG4gICAgICAgICAgICB2YXIgaWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soY3VyclRpbWUgKyB0aW1lVG9DYWxsKTtcclxuICAgICAgICAgICAgfSwgdGltZVRvQ2FsbCk7XHJcbiAgICAgICAgICAgIGxhc3RUaW1lID0gY3VyclRpbWUgKyB0aW1lVG9DYWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5cclxuLypqc2hpbnQgLVcwNzkgKi9cclxudmFyIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lO1xyXG5pZiAodHlwZW9mIGNhbmNlbEFuaW1hdGlvbkZyYW1lID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgaWYgKHR5cGVvZiB3ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvKmdsb2JhbCBjYW5jZWxBbmltYXRpb25GcmFtZTp0cnVlICovXHJcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSB3ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vekNhbmNlbEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8qZ2xvYmFsIGNhbmNlbEFuaW1hdGlvbkZyYW1lOnRydWUgKi9cclxuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSA9IG1vekNhbmNlbEFuaW1hdGlvbkZyYW1lO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbXNDYW5jZWxBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvKmdsb2JhbCBjYW5jZWxBbmltYXRpb25GcmFtZTp0cnVlICovXHJcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBtc0NhbmNlbEFuaW1hdGlvbkZyYW1lO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLypnbG9iYWwgY2FuY2VsQW5pbWF0aW9uRnJhbWU6dHJ1ZSAqL1xyXG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24oaWQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBXZWJBdWRpbyBBUEkgcmVwcmVzZW50ZXJcclxudmFyIEF1ZGlvQ29udGV4dCA9IHdpbmRvdy5BdWRpb0NvbnRleHQ7XHJcblxyXG5pZiAodHlwZW9mIEF1ZGlvQ29udGV4dCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIGlmICh0eXBlb2Ygd2Via2l0QXVkaW9Db250ZXh0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8qZ2xvYmFsIEF1ZGlvQ29udGV4dDp0cnVlICovXHJcbiAgICAgICAgQXVkaW9Db250ZXh0ID0gd2Via2l0QXVkaW9Db250ZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgbW96QXVkaW9Db250ZXh0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIC8qZ2xvYmFsIEF1ZGlvQ29udGV4dDp0cnVlICovXHJcbiAgICAgICAgQXVkaW9Db250ZXh0ID0gbW96QXVkaW9Db250ZXh0O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKmpzaGludCAtVzA3OSAqL1xyXG52YXIgVVJMID0gd2luZG93LlVSTDtcclxuXHJcbmlmICh0eXBlb2YgVVJMID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2Via2l0VVJMICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgLypnbG9iYWwgVVJMOnRydWUgKi9cclxuICAgIFVSTCA9IHdlYmtpdFVSTDtcclxufVxyXG5cclxuaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhID09PSAndW5kZWZpbmVkJykgeyAvLyBtYXliZSB3aW5kb3cubmF2aWdhdG9yP1xyXG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIG5hdmlnYXRvci5nZXRVc2VyTWVkaWEgPSBuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yLm1vekdldFVzZXJNZWRpYSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhID0gbmF2aWdhdG9yLm1vekdldFVzZXJNZWRpYTtcclxuICAgIH1cclxufVxyXG5cclxudmFyIGlzRWRnZSA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWRnZScpICE9PSAtMSAmJiAoISFuYXZpZ2F0b3IubXNTYXZlQmxvYiB8fCAhIW5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKTtcclxudmFyIGlzT3BlcmEgPSAhIXdpbmRvdy5vcGVyYSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ09QUi8nKSAhPT0gLTE7XHJcbnZhciBpc0ZpcmVmb3ggPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpID4gLTEgJiYgKCduZXRzY2FwZScgaW4gd2luZG93KSAmJiAvIHJ2Oi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcclxudmFyIGlzQ2hyb21lID0gKCFpc09wZXJhICYmICFpc0VkZ2UgJiYgISFuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhKSB8fCBpc0VsZWN0cm9uKCkgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2Nocm9tZS8nKSAhPT0gLTE7XHJcblxyXG52YXIgaXNTYWZhcmkgPSAvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xyXG5cclxuaWYgKGlzU2FmYXJpICYmICFpc0Nocm9tZSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0NyaU9TJykgIT09IC0xKSB7XHJcbiAgICBpc1NhZmFyaSA9IGZhbHNlO1xyXG4gICAgaXNDaHJvbWUgPSB0cnVlO1xyXG59XHJcblxyXG52YXIgTWVkaWFTdHJlYW0gPSB3aW5kb3cuTWVkaWFTdHJlYW07XHJcblxyXG5pZiAodHlwZW9mIE1lZGlhU3RyZWFtID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2Via2l0TWVkaWFTdHJlYW0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICBNZWRpYVN0cmVhbSA9IHdlYmtpdE1lZGlhU3RyZWFtO1xyXG59XHJcblxyXG4vKmdsb2JhbCBNZWRpYVN0cmVhbTp0cnVlICovXHJcbmlmICh0eXBlb2YgTWVkaWFTdHJlYW0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAvLyBvdmVycmlkZSBcInN0b3BcIiBtZXRob2QgZm9yIGFsbCBicm93c2Vyc1xyXG4gICAgaWYgKHR5cGVvZiBNZWRpYVN0cmVhbS5wcm90b3R5cGUuc3RvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBNZWRpYVN0cmVhbS5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB0aGlzLmdldFRyYWNrcygpLmZvckVhY2goZnVuY3Rpb24odHJhY2spIHtcclxuICAgICAgICAgICAgICAgIHRyYWNrLnN0b3AoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gYmVsb3cgZnVuY3Rpb24gdmlhOiBodHRwOi8vZ29vLmdsL0IzYWU4Y1xyXG4vKipcclxuICogUmV0dXJuIGh1bWFuLXJlYWRhYmxlIGZpbGUgc2l6ZS5cclxuICogQHBhcmFtIHtudW1iZXJ9IGJ5dGVzIC0gUGFzcyBieXRlcyBhbmQgZ2V0IGZvcm1hdHRlZCBzdHJpbmcuXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gZm9ybWF0dGVkIHN0cmluZ1xyXG4gKiBAZXhhbXBsZVxyXG4gKiBieXRlc1RvU2l6ZSgxMDI0KjEwMjQqNSkgPT09ICc1IEdCJ1xyXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQ3xSZWNvcmRSVEMgU291cmNlIENvZGV9XHJcbiAqL1xyXG5mdW5jdGlvbiBieXRlc1RvU2l6ZShieXRlcykge1xyXG4gICAgdmFyIGsgPSAxMDAwO1xyXG4gICAgdmFyIHNpemVzID0gWydCeXRlcycsICdLQicsICdNQicsICdHQicsICdUQiddO1xyXG4gICAgaWYgKGJ5dGVzID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuICcwIEJ5dGVzJztcclxuICAgIH1cclxuICAgIHZhciBpID0gcGFyc2VJbnQoTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSksIDEwKTtcclxuICAgIHJldHVybiAoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9QcmVjaXNpb24oMykgKyAnICcgKyBzaXplc1tpXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7QmxvYn0gZmlsZSAtIEZpbGUgb3IgQmxvYiBvYmplY3QuIFRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWUgLSBPcHRpb25hbCBmaWxlIG5hbWUgZS5nLiBcIlJlY29yZGVkLVZpZGVvLndlYm1cIlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBpbnZva2VTYXZlQXNEaWFsb2coYmxvYiBvciBmaWxlLCBbb3B0aW9uYWxdIGZpbGVOYW1lKTtcclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEN8UmVjb3JkUlRDIFNvdXJjZSBDb2RlfVxyXG4gKi9cclxuZnVuY3Rpb24gaW52b2tlU2F2ZUFzRGlhbG9nKGZpbGUsIGZpbGVOYW1lKSB7XHJcbiAgICBpZiAoIWZpbGUpIHtcclxuICAgICAgICB0aHJvdyAnQmxvYiBvYmplY3QgaXMgcmVxdWlyZWQuJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZpbGUudHlwZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZpbGUudHlwZSA9ICd2aWRlby93ZWJtJztcclxuICAgICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBmaWxlRXh0ZW5zaW9uID0gKGZpbGUudHlwZSB8fCAndmlkZW8vd2VibScpLnNwbGl0KCcvJylbMV07XHJcblxyXG4gICAgaWYgKGZpbGVOYW1lICYmIGZpbGVOYW1lLmluZGV4T2YoJy4nKSAhPT0gLTEpIHtcclxuICAgICAgICB2YXIgc3BsaXR0ZWQgPSBmaWxlTmFtZS5zcGxpdCgnLicpO1xyXG4gICAgICAgIGZpbGVOYW1lID0gc3BsaXR0ZWRbMF07XHJcbiAgICAgICAgZmlsZUV4dGVuc2lvbiA9IHNwbGl0dGVkWzFdO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBmaWxlRnVsbE5hbWUgPSAoZmlsZU5hbWUgfHwgKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDk5OTk5OTk5OTkpICsgODg4ODg4ODg4KSkgKyAnLicgKyBmaWxlRXh0ZW5zaW9uO1xyXG5cclxuICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGZpbGUsIGZpbGVGdWxsTmFtZSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBuYXZpZ2F0b3IubXNTYXZlQmxvYiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLm1zU2F2ZUJsb2IoZmlsZSwgZmlsZUZ1bGxOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgaHlwZXJsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgaHlwZXJsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xyXG4gICAgaHlwZXJsaW5rLmRvd25sb2FkID0gZmlsZUZ1bGxOYW1lO1xyXG5cclxuICAgIGh5cGVybGluay5zdHlsZSA9ICdkaXNwbGF5Om5vbmU7b3BhY2l0eTowO2NvbG9yOnRyYW5zcGFyZW50Oyc7XHJcbiAgICAoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKGh5cGVybGluayk7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBoeXBlcmxpbmsuY2xpY2sgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBoeXBlcmxpbmsuY2xpY2soKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaHlwZXJsaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgICAgIGh5cGVybGluay5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycsIHtcclxuICAgICAgICAgICAgdmlldzogd2luZG93LFxyXG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIFVSTC5yZXZva2VPYmplY3RVUkwoaHlwZXJsaW5rLmhyZWYpO1xyXG59XHJcblxyXG4vKipcclxuICogZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2NoZXRvbi9pcy1lbGVjdHJvbi9ibG9iL21hc3Rlci9pbmRleC5qc1xyXG4gKiovXHJcbmZ1bmN0aW9uIGlzRWxlY3Ryb24oKSB7XHJcbiAgICAvLyBSZW5kZXJlciBwcm9jZXNzXHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5wcm9jZXNzID09PSAnb2JqZWN0JyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTWFpbiBwcm9jZXNzXHJcbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09PSAnb2JqZWN0JyAmJiAhIXByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24pIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZXRlY3QgdGhlIHVzZXIgYWdlbnQgd2hlbiB0aGUgYG5vZGVJbnRlZ3JhdGlvbmAgb3B0aW9uIGlzIHNldCB0byB0cnVlXHJcbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG5hdmlnYXRvci51c2VyQWdlbnQgPT09ICdzdHJpbmcnICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWxlY3Ryb24nKSA+PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRUcmFja3Moc3RyZWFtLCBraW5kKSB7XHJcbiAgICBpZiAoIXN0cmVhbSB8fCAhc3RyZWFtLmdldFRyYWNrcykge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RyZWFtLmdldFRyYWNrcygpLmZpbHRlcihmdW5jdGlvbih0KSB7XHJcbiAgICAgICAgcmV0dXJuIHQua2luZCA9PT0gKGtpbmQgfHwgJ2F1ZGlvJyk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0U3JjT2JqZWN0KHN0cmVhbSwgZWxlbWVudCkge1xyXG4gICAgaWYgKCdzcmNPYmplY3QnIGluIGVsZW1lbnQpIHtcclxuICAgICAgICBlbGVtZW50LnNyY09iamVjdCA9IHN0cmVhbTtcclxuICAgIH0gZWxzZSBpZiAoJ21velNyY09iamVjdCcgaW4gZWxlbWVudCkge1xyXG4gICAgICAgIGVsZW1lbnQubW96U3JjT2JqZWN0ID0gc3RyZWFtO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBlbGVtZW50LnNyY09iamVjdCA9IHN0cmVhbTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7QmxvYn0gZmlsZSAtIEZpbGUgb3IgQmxvYiBvYmplY3QuXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAqIEBleGFtcGxlXHJcbiAqIGdldFNlZWthYmxlQmxvYihibG9iIG9yIGZpbGUsIGNhbGxiYWNrKTtcclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEN8UmVjb3JkUlRDIFNvdXJjZSBDb2RlfVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0U2Vla2FibGVCbG9iKGlucHV0QmxvYiwgY2FsbGJhY2spIHtcclxuICAgIC8vIEVCTUwuanMgY29weXJpZ2h0cyBnb2VzIHRvOiBodHRwczovL2dpdGh1Yi5jb20vbGVnb2tpY2hpL3RzLWVibWxcclxuICAgIGlmICh0eXBlb2YgRUJNTCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBsaW5rOiBodHRwczovL3d3dy53ZWJydGMtZXhwZXJpbWVudC5jb20vRUJNTC5qcycpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByZWFkZXIgPSBuZXcgRUJNTC5SZWFkZXIoKTtcclxuICAgIHZhciBkZWNvZGVyID0gbmV3IEVCTUwuRGVjb2RlcigpO1xyXG4gICAgdmFyIHRvb2xzID0gRUJNTC50b29scztcclxuXHJcbiAgICB2YXIgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICB2YXIgZWJtbEVsbXMgPSBkZWNvZGVyLmRlY29kZSh0aGlzLnJlc3VsdCk7XHJcbiAgICAgICAgZWJtbEVsbXMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJlYWRlci5yZWFkKGVsZW1lbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJlYWRlci5zdG9wKCk7XHJcbiAgICAgICAgdmFyIHJlZmluZWRNZXRhZGF0YUJ1ZiA9IHRvb2xzLm1ha2VNZXRhZGF0YVNlZWthYmxlKHJlYWRlci5tZXRhZGF0YXMsIHJlYWRlci5kdXJhdGlvbiwgcmVhZGVyLmN1ZXMpO1xyXG4gICAgICAgIHZhciBib2R5ID0gdGhpcy5yZXN1bHQuc2xpY2UocmVhZGVyLm1ldGFkYXRhU2l6ZSk7XHJcbiAgICAgICAgdmFyIG5ld0Jsb2IgPSBuZXcgQmxvYihbcmVmaW5lZE1ldGFkYXRhQnVmLCBib2R5XSwge1xyXG4gICAgICAgICAgICB0eXBlOiAndmlkZW8vd2VibSdcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY2FsbGJhY2sobmV3QmxvYik7XHJcbiAgICB9O1xyXG4gICAgZmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpbnB1dEJsb2IpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIFJlY29yZFJUQyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIFJlY29yZFJUQy5pbnZva2VTYXZlQXNEaWFsb2cgPSBpbnZva2VTYXZlQXNEaWFsb2c7XHJcbiAgICBSZWNvcmRSVEMuZ2V0VHJhY2tzID0gZ2V0VHJhY2tzO1xyXG4gICAgUmVjb3JkUlRDLmdldFNlZWthYmxlQmxvYiA9IGdldFNlZWthYmxlQmxvYjtcclxuICAgIFJlY29yZFJUQy5ieXRlc1RvU2l6ZSA9IGJ5dGVzVG9TaXplO1xyXG4gICAgUmVjb3JkUlRDLmlzRWxlY3Ryb24gPSBpc0VsZWN0cm9uO1xyXG59XG5cclxuLy8gX19fX19fX19fXyAodXNlZCB0byBoYW5kbGUgc3R1ZmYgbGlrZSBodHRwOi8vZ29vLmdsL3htRTVlZykgaXNzdWUgIzEyOVxyXG4vLyBTdG9yYWdlLmpzXHJcblxyXG4vKipcclxuICogU3RvcmFnZSBpcyBhIHN0YW5kYWxvbmUgb2JqZWN0IHVzZWQgYnkge0BsaW5rIFJlY29yZFJUQ30gdG8gc3RvcmUgcmV1c2FibGUgb2JqZWN0cyBlLmcuIFwibmV3IEF1ZGlvQ29udGV4dFwiLlxyXG4gKiBAbGljZW5zZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEMvYmxvYi9tYXN0ZXIvTElDRU5TRXxNSVR9XHJcbiAqIEBhdXRob3Ige0BsaW5rIGh0dHBzOi8vTXVhektoYW4uY29tfE11YXogS2hhbn1cclxuICogQGV4YW1wbGVcclxuICogU3RvcmFnZS5BdWRpb0NvbnRleHQgPT09IHdlYmtpdEF1ZGlvQ29udGV4dFxyXG4gKiBAcHJvcGVydHkge3dlYmtpdEF1ZGlvQ29udGV4dH0gQXVkaW9Db250ZXh0IC0gS2VlcHMgYSByZWZlcmVuY2UgdG8gQXVkaW9Db250ZXh0IG9iamVjdC5cclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEN8UmVjb3JkUlRDIFNvdXJjZSBDb2RlfVxyXG4gKi9cclxuXHJcbnZhciBTdG9yYWdlID0ge307XHJcblxyXG5pZiAodHlwZW9mIEF1ZGlvQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIFN0b3JhZ2UuQXVkaW9Db250ZXh0ID0gQXVkaW9Db250ZXh0O1xyXG59IGVsc2UgaWYgKHR5cGVvZiB3ZWJraXRBdWRpb0NvbnRleHQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICBTdG9yYWdlLkF1ZGlvQ29udGV4dCA9IHdlYmtpdEF1ZGlvQ29udGV4dDtcclxufVxyXG5cclxuaWYgKHR5cGVvZiBSZWNvcmRSVEMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICBSZWNvcmRSVEMuU3RvcmFnZSA9IFN0b3JhZ2U7XHJcbn1cblxyXG5mdW5jdGlvbiBpc01lZGlhUmVjb3JkZXJDb21wYXRpYmxlKCkge1xyXG4gICAgaWYgKGlzRmlyZWZveCB8fCBpc1NhZmFyaSB8fCBpc0VkZ2UpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgblZlciA9IG5hdmlnYXRvci5hcHBWZXJzaW9uO1xyXG4gICAgdmFyIG5BZ3QgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xyXG4gICAgdmFyIGZ1bGxWZXJzaW9uID0gJycgKyBwYXJzZUZsb2F0KG5hdmlnYXRvci5hcHBWZXJzaW9uKTtcclxuICAgIHZhciBtYWpvclZlcnNpb24gPSBwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbiwgMTApO1xyXG4gICAgdmFyIG5hbWVPZmZzZXQsIHZlck9mZnNldCwgaXg7XHJcblxyXG4gICAgaWYgKGlzQ2hyb21lIHx8IGlzT3BlcmEpIHtcclxuICAgICAgICB2ZXJPZmZzZXQgPSBuQWd0LmluZGV4T2YoJ0Nocm9tZScpO1xyXG4gICAgICAgIGZ1bGxWZXJzaW9uID0gbkFndC5zdWJzdHJpbmcodmVyT2Zmc2V0ICsgNyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdHJpbSB0aGUgZnVsbFZlcnNpb24gc3RyaW5nIGF0IHNlbWljb2xvbi9zcGFjZSBpZiBwcmVzZW50XHJcbiAgICBpZiAoKGl4ID0gZnVsbFZlcnNpb24uaW5kZXhPZignOycpKSAhPT0gLTEpIHtcclxuICAgICAgICBmdWxsVmVyc2lvbiA9IGZ1bGxWZXJzaW9uLnN1YnN0cmluZygwLCBpeCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKChpeCA9IGZ1bGxWZXJzaW9uLmluZGV4T2YoJyAnKSkgIT09IC0xKSB7XHJcbiAgICAgICAgZnVsbFZlcnNpb24gPSBmdWxsVmVyc2lvbi5zdWJzdHJpbmcoMCwgaXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG1ham9yVmVyc2lvbiA9IHBhcnNlSW50KCcnICsgZnVsbFZlcnNpb24sIDEwKTtcclxuXHJcbiAgICBpZiAoaXNOYU4obWFqb3JWZXJzaW9uKSkge1xyXG4gICAgICAgIGZ1bGxWZXJzaW9uID0gJycgKyBwYXJzZUZsb2F0KG5hdmlnYXRvci5hcHBWZXJzaW9uKTtcclxuICAgICAgICBtYWpvclZlcnNpb24gPSBwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbiwgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtYWpvclZlcnNpb24gPj0gNDk7XHJcbn1cblxyXG4vLyBfX19fX19fX19fX19fX19fX19fX19fXHJcbi8vIE1lZGlhU3RyZWFtUmVjb3JkZXIuanNcclxuXHJcbi8qKlxyXG4gKiBNZWRpYVN0cmVhbVJlY29yZGVyIGlzIGFuIGFic3RyYWN0aW9uIGxheWVyIGZvciB7QGxpbmsgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL21lZGlhY2FwdHVyZS1yZWNvcmQvTWVkaWFSZWNvcmRlci5odG1sfE1lZGlhUmVjb3JkZXIgQVBJfS4gSXQgaXMgdXNlZCBieSB7QGxpbmsgUmVjb3JkUlRDfSB0byByZWNvcmQgTWVkaWFTdHJlYW0ocykgaW4gYm90aCBDaHJvbWUgYW5kIEZpcmVmb3guXHJcbiAqIEBzdW1tYXJ5IFJ1bnMgdG9wIG92ZXIge0BsaW5rIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9tZWRpYWNhcHR1cmUtcmVjb3JkL01lZGlhUmVjb3JkZXIuaHRtbHxNZWRpYVJlY29yZGVyIEFQSX0uXHJcbiAqIEBsaWNlbnNlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQy9ibG9iL21hc3Rlci9MSUNFTlNFfE1JVH1cclxuICogQGF1dGhvciB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbnxNdWF6IEtoYW59XHJcbiAqIEB0eXBlZGVmIE1lZGlhU3RyZWFtUmVjb3JkZXJcclxuICogQGNsYXNzXHJcbiAqIEBleGFtcGxlXHJcbiAqIHZhciBjb25maWcgPSB7XHJcbiAqICAgICBtaW1lVHlwZTogJ3ZpZGVvL3dlYm0nLCAvLyB2cDgsIHZwOSwgaDI2NCwgbWt2LCBvcHVzL3ZvcmJpc1xyXG4gKiAgICAgYXVkaW9CaXRzUGVyU2Vjb25kIDogMjU2ICogOCAqIDEwMjQsXHJcbiAqICAgICB2aWRlb0JpdHNQZXJTZWNvbmQgOiAyNTYgKiA4ICogMTAyNCxcclxuICogICAgIGJpdHNQZXJTZWNvbmQ6IDI1NiAqIDggKiAxMDI0LCAgLy8gaWYgdGhpcyBpcyBwcm92aWRlZCwgc2tpcCBhYm92ZSB0d29cclxuICogICAgIGNoZWNrRm9ySW5hY3RpdmVUcmFja3M6IHRydWUsXHJcbiAqICAgICB0aW1lU2xpY2U6IDEwMDAsIC8vIGNvbmNhdGVuYXRlIGludGVydmFscyBiYXNlZCBibG9ic1xyXG4gKiAgICAgb25kYXRhYXZhaWxhYmxlOiBmdW5jdGlvbigpIHt9IC8vIGdldCBpbnRlcnZhbHMgYmFzZWQgYmxvYnNcclxuICogfVxyXG4gKiB2YXIgcmVjb3JkZXIgPSBuZXcgTWVkaWFTdHJlYW1SZWNvcmRlcihtZWRpYVN0cmVhbSwgY29uZmlnKTtcclxuICogcmVjb3JkZXIucmVjb3JkKCk7XHJcbiAqIHJlY29yZGVyLnN0b3AoZnVuY3Rpb24oYmxvYikge1xyXG4gKiAgICAgdmlkZW8uc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICpcclxuICogICAgIC8vIG9yXHJcbiAqICAgICB2YXIgYmxvYiA9IHJlY29yZGVyLmJsb2I7XHJcbiAqIH0pO1xyXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQ3xSZWNvcmRSVEMgU291cmNlIENvZGV9XHJcbiAqIEBwYXJhbSB7TWVkaWFTdHJlYW19IG1lZGlhU3RyZWFtIC0gTWVkaWFTdHJlYW0gb2JqZWN0IGZldGNoZWQgdXNpbmcgZ2V0VXNlck1lZGlhIEFQSSBvciBnZW5lcmF0ZWQgdXNpbmcgY2FwdHVyZVN0cmVhbVVudGlsRW5kZWQgb3IgV2ViQXVkaW8gQVBJLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0ge2Rpc2FibGVMb2dzOnRydWUsIGluaXRDYWxsYmFjazogZnVuY3Rpb24sIG1pbWVUeXBlOiBcInZpZGVvL3dlYm1cIiwgdGltZVNsaWNlOiAxMDAwfVxyXG4gKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgZmlyc3QgYXJndW1lbnQgXCJNZWRpYVN0cmVhbVwiIGlzIG1pc3NpbmcuIEFsc28gdGhyb3dzIGVycm9yIGlmIFwiTWVkaWFSZWNvcmRlciBBUElcIiBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci5cclxuICovXHJcblxyXG5mdW5jdGlvbiBNZWRpYVN0cmVhbVJlY29yZGVyKG1lZGlhU3RyZWFtLCBjb25maWcpIHtcclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICBpZiAodHlwZW9mIG1lZGlhU3RyZWFtID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRocm93ICdGaXJzdCBhcmd1bWVudCBcIk1lZGlhU3RyZWFtXCIgaXMgcmVxdWlyZWQuJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIE1lZGlhUmVjb3JkZXIgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhyb3cgJ1lvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBNZWRpYSBSZWNvcmRlciBBUEkuIFBsZWFzZSB0cnkgb3RoZXIgbW9kdWxlcyBlLmcuIFdoYW1teVJlY29yZGVyIG9yIFN0ZXJlb0F1ZGlvUmVjb3JkZXIuJztcclxuICAgIH1cclxuXHJcbiAgICBjb25maWcgPSBjb25maWcgfHwge1xyXG4gICAgICAgIC8vIGJpdHNQZXJTZWNvbmQ6IDI1NiAqIDggKiAxMDI0LFxyXG4gICAgICAgIG1pbWVUeXBlOiAndmlkZW8vd2VibSdcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGNvbmZpZy50eXBlID09PSAnYXVkaW8nKSB7XHJcbiAgICAgICAgaWYgKGdldFRyYWNrcyhtZWRpYVN0cmVhbSwgJ3ZpZGVvJykubGVuZ3RoICYmIGdldFRyYWNrcyhtZWRpYVN0cmVhbSwgJ2F1ZGlvJykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHZhciBzdHJlYW07XHJcbiAgICAgICAgICAgIGlmICghIW5hdmlnYXRvci5tb3pHZXRVc2VyTWVkaWEpIHtcclxuICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBNZWRpYVN0cmVhbSgpO1xyXG4gICAgICAgICAgICAgICAgc3RyZWFtLmFkZFRyYWNrKGdldFRyYWNrcyhtZWRpYVN0cmVhbSwgJ2F1ZGlvJylbMF0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gd2Via2l0TWVkaWFTdHJlYW1cclxuICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBNZWRpYVN0cmVhbShnZXRUcmFja3MobWVkaWFTdHJlYW0sICdhdWRpbycpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBtZWRpYVN0cmVhbSA9IHN0cmVhbTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLm1pbWVUeXBlIHx8IGNvbmZpZy5taW1lVHlwZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignYXVkaW8nKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgY29uZmlnLm1pbWVUeXBlID0gaXNDaHJvbWUgPyAnYXVkaW8vd2VibScgOiAnYXVkaW8vb2dnJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb25maWcubWltZVR5cGUgJiYgY29uZmlnLm1pbWVUeXBlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSAhPT0gJ2F1ZGlvL29nZycgJiYgISFuYXZpZ2F0b3IubW96R2V0VXNlck1lZGlhKSB7XHJcbiAgICAgICAgICAgIC8vIGZvcmNpbmcgYmV0dGVyIGNvZGVjcyBvbiBGaXJlZm94ICh2aWEgIzE2NilcclxuICAgICAgICAgICAgY29uZmlnLm1pbWVUeXBlID0gJ2F1ZGlvL29nZyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBhcnJheU9mQmxvYnMgPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYXJyYXkgb2YgYmxvYnMuIFVzZSBvbmx5IHdpdGggXCJ0aW1lU2xpY2VcIi4gSXRzIHVzZWZ1bCB0byBwcmV2aWV3IHJlY29yZGluZyBhbnl0aW1lLCB3aXRob3V0IHVzaW5nIHRoZSBcInN0b3BcIiBtZXRob2QuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVkaWFTdHJlYW1SZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHZhciBhcnJheU9mQmxvYnMgPSByZWNvcmRlci5nZXRBcnJheU9mQmxvYnMoKTtcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBhcnJheSBvZiByZWNvcmRlZCBibG9icy5cclxuICAgICAqL1xyXG4gICAgdGhpcy5nZXRBcnJheU9mQmxvYnMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gYXJyYXlPZkJsb2JzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlY29yZHMgTWVkaWFTdHJlYW0uXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVkaWFTdHJlYW1SZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnJlY29yZCgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnJlY29yZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIC8vIHNldCBkZWZhdWx0c1xyXG4gICAgICAgIHNlbGYuYmxvYiA9IG51bGw7XHJcbiAgICAgICAgc2VsZi5jbGVhclJlY29yZGVkRGF0YSgpO1xyXG4gICAgICAgIHNlbGYudGltZXN0YW1wcyA9IFtdO1xyXG4gICAgICAgIGFsbFN0YXRlcyA9IFtdO1xyXG4gICAgICAgIGFycmF5T2ZCbG9icyA9IFtdO1xyXG5cclxuICAgICAgICB2YXIgcmVjb3JkZXJIaW50cyA9IGNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZUxvZ3MpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1Bhc3NpbmcgZm9sbG93aW5nIGNvbmZpZyBvdmVyIE1lZGlhUmVjb3JkZXIgQVBJLicsIHJlY29yZGVySGludHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1lZGlhUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgLy8gbWFuZGF0b3J5IHRvIG1ha2Ugc3VyZSBGaXJlZm94IGRvZXNuJ3QgZmFpbHMgdG8gcmVjb3JkIHN0cmVhbXMgMy00IHRpbWVzIHdpdGhvdXQgcmVsb2FkaW5nIHRoZSBwYWdlLlxyXG4gICAgICAgICAgICBtZWRpYVJlY29yZGVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpc0Nocm9tZSAmJiAhaXNNZWRpYVJlY29yZGVyQ29tcGF0aWJsZSgpKSB7XHJcbiAgICAgICAgICAgIC8vIHRvIHN1cHBvcnQgdmlkZW8tb25seSByZWNvcmRpbmcgb24gc3RhYmxlXHJcbiAgICAgICAgICAgIHJlY29yZGVySGludHMgPSAndmlkZW8vdnA4JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgTWVkaWFSZWNvcmRlci5pc1R5cGVTdXBwb3J0ZWQgPT09ICdmdW5jdGlvbicgJiYgcmVjb3JkZXJIaW50cy5taW1lVHlwZSkge1xyXG4gICAgICAgICAgICBpZiAoIU1lZGlhUmVjb3JkZXIuaXNUeXBlU3VwcG9ydGVkKHJlY29yZGVySGludHMubWltZVR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTWVkaWFSZWNvcmRlciBBUEkgc2VlbXMgdW5hYmxlIHRvIHJlY29yZCBtaW1lVHlwZTonLCByZWNvcmRlckhpbnRzLm1pbWVUeXBlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZWNvcmRlckhpbnRzLm1pbWVUeXBlID0gY29uZmlnLnR5cGUgPT09ICdhdWRpbycgPyAnYXVkaW8vd2VibScgOiAndmlkZW8vd2VibSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHVzaW5nIE1lZGlhUmVjb3JkZXIgQVBJIGhlcmVcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBtZWRpYVJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIobWVkaWFTdHJlYW0sIHJlY29yZGVySGludHMpO1xyXG5cclxuICAgICAgICAgICAgLy8gcmVzZXRcclxuICAgICAgICAgICAgY29uZmlnLm1pbWVUeXBlID0gcmVjb3JkZXJIaW50cy5taW1lVHlwZTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIGNocm9tZS1iYXNlZCBmYWxsYmFja1xyXG4gICAgICAgICAgICBtZWRpYVJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIobWVkaWFTdHJlYW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gb2xkIGhhY2s/XHJcbiAgICAgICAgaWYgKHJlY29yZGVySGludHMubWltZVR5cGUgJiYgIU1lZGlhUmVjb3JkZXIuaXNUeXBlU3VwcG9ydGVkICYmICdjYW5SZWNvcmRNaW1lVHlwZScgaW4gbWVkaWFSZWNvcmRlciAmJiBtZWRpYVJlY29yZGVyLmNhblJlY29yZE1pbWVUeXBlKHJlY29yZGVySGludHMubWltZVR5cGUpID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNZWRpYVJlY29yZGVyIEFQSSBzZWVtcyB1bmFibGUgdG8gcmVjb3JkIG1pbWVUeXBlOicsIHJlY29yZGVySGludHMubWltZVR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEaXNwYXRjaGluZyBPbkRhdGFBdmFpbGFibGUgSGFuZGxlclxyXG4gICAgICAgIG1lZGlhUmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICBpZiAoZS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBhbGxTdGF0ZXMucHVzaCgnb25kYXRhYXZhaWxhYmxlOiAnICsgYnl0ZXNUb1NpemUoZS5kYXRhLnNpemUpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcudGltZVNsaWNlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUuZGF0YSAmJiBlLmRhdGEuc2l6ZSAmJiBlLmRhdGEuc2l6ZSA+IDEwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFycmF5T2ZCbG9icy5wdXNoKGUuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGltZVN0YW1wKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9uZGF0YWF2YWlsYWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcnZhbHMgYmFzZWQgYmxvYnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJsb2IgPSBjb25maWcuZ2V0TmF0aXZlQmxvYiA/IGUuZGF0YSA6IG5ldyBCbG9iKFtlLmRhdGFdLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBnZXRNaW1lVHlwZShyZWNvcmRlckhpbnRzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9uZGF0YWF2YWlsYWJsZShibG9iKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghZS5kYXRhIHx8ICFlLmRhdGEuc2l6ZSB8fCBlLmRhdGEuc2l6ZSA8IDEwMCB8fCBzZWxmLmJsb2IpIHtcclxuICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHN0b3BSZWNvcmRpbmcgYWx3YXlzIGdldHRpbmcgZmlyZWRcclxuICAgICAgICAgICAgICAgIC8vIGV2ZW4gaWYgdGhlcmUgaXMgaW52YWxpZCBkYXRhXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5yZWNvcmRpbmdDYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkaW5nQ2FsbGJhY2sobmV3IEJsb2IoW10sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZ2V0TWltZVR5cGUocmVjb3JkZXJIaW50cylcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNvcmRpbmdDYWxsYmFjayA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNlbGYuYmxvYiA9IGNvbmZpZy5nZXROYXRpdmVCbG9iID8gZS5kYXRhIDogbmV3IEJsb2IoW2UuZGF0YV0sIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGdldE1pbWVUeXBlKHJlY29yZGVySGludHMpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGYucmVjb3JkaW5nQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkaW5nQ2FsbGJhY2soc2VsZi5ibG9iKTtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkaW5nQ2FsbGJhY2sgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbWVkaWFSZWNvcmRlci5vbnN0YXJ0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGFsbFN0YXRlcy5wdXNoKCdzdGFydGVkJyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbWVkaWFSZWNvcmRlci5vbnBhdXNlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGFsbFN0YXRlcy5wdXNoKCdwYXVzZWQnKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBtZWRpYVJlY29yZGVyLm9ucmVzdW1lID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGFsbFN0YXRlcy5wdXNoKCdyZXN1bWVkJyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbWVkaWFSZWNvcmRlci5vbnN0b3AgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgYWxsU3RhdGVzLnB1c2goJ3N0b3BwZWQnKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBtZWRpYVJlY29yZGVyLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xyXG4gICAgICAgICAgICBpZiAoIWVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghZXJyb3IubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdVbmtub3duRXJyb3InO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhbGxTdGF0ZXMucHVzaCgnZXJyb3I6ICcgKyBlcnJvcik7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgICAgICAgICAgLy8gdmlhOiBodHRwczovL3czYy5naXRodWIuaW8vbWVkaWFjYXB0dXJlLXJlY29yZC9NZWRpYVJlY29yZGVyLmh0bWwjZXhjZXB0aW9uLXN1bW1hcnlcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5uYW1lLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdpbnZhbGlkc3RhdGUnKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgTWVkaWFSZWNvcmRlciBpcyBub3QgaW4gYSBzdGF0ZSBpbiB3aGljaCB0aGUgcHJvcG9zZWQgb3BlcmF0aW9uIGlzIGFsbG93ZWQgdG8gYmUgZXhlY3V0ZWQuJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5uYW1lLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdub3RzdXBwb3J0ZWQnKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdNSU1FIHR5cGUgKCcsIHJlY29yZGVySGludHMubWltZVR5cGUsICcpIGlzIG5vdCBzdXBwb3J0ZWQuJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5uYW1lLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdzZWN1cml0eScpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ01lZGlhUmVjb3JkZXIgc2VjdXJpdHkgZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gb2xkZXIgY29kZSBiZWxvd1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gJ091dE9mTWVtb3J5Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBVQSBoYXMgZXhoYXVzZWQgdGhlIGF2YWlsYWJsZSBtZW1vcnkuIFVzZXIgYWdlbnRzIFNIT1VMRCBwcm92aWRlIGFzIG11Y2ggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSBpbiB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUuJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnSWxsZWdhbFN0cmVhbU1vZGlmaWNhdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBIG1vZGlmaWNhdGlvbiB0byB0aGUgc3RyZWFtIGhhcyBvY2N1cnJlZCB0aGF0IG1ha2VzIGl0IGltcG9zc2libGUgdG8gY29udGludWUgcmVjb3JkaW5nLiBBbiBleGFtcGxlIHdvdWxkIGJlIHRoZSBhZGRpdGlvbiBvZiBhIFRyYWNrIHdoaWxlIHJlY29yZGluZyBpcyBvY2N1cnJpbmcuIFVzZXIgYWdlbnRzIFNIT1VMRCBwcm92aWRlIGFzIG11Y2ggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSBpbiB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUuJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5uYW1lID09PSAnT3RoZXJSZWNvcmRpbmdFcnJvcicpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVc2VkIGZvciBhbiBmYXRhbCBlcnJvciBvdGhlciB0aGFuIHRob3NlIGxpc3RlZCBhYm92ZS4gVXNlciBhZ2VudHMgU0hPVUxEIHByb3ZpZGUgYXMgbXVjaCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIGluIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZS4nLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yLm5hbWUgPT09ICdHZW5lcmljRXJyb3InKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGhlIFVBIGNhbm5vdCBwcm92aWRlIHRoZSBjb2RlYyBvciByZWNvcmRpbmcgb3B0aW9uIHRoYXQgaGFzIGJlZW4gcmVxdWVzdGVkLicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignTWVkaWFSZWNvcmRlciBFcnJvcicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgKGZ1bmN0aW9uKGxvb3Blcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxmLm1hbnVhbGx5U3RvcHBlZCAmJiBtZWRpYVJlY29yZGVyICYmIG1lZGlhUmVjb3JkZXIuc3RhdGUgPT09ICdpbmFjdGl2ZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgY29uZmlnLnRpbWVzbGljZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gMTAgbWludXRlcywgZW5vdWdoP1xyXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIuc3RhcnQoMTAgKiA2MCAqIDEwMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGxvb3BlciwgMTAwMCk7XHJcbiAgICAgICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobWVkaWFSZWNvcmRlci5zdGF0ZSAhPT0gJ2luYWN0aXZlJyAmJiBtZWRpYVJlY29yZGVyLnN0YXRlICE9PSAnc3RvcHBlZCcpIHtcclxuICAgICAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIuc3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcudGltZVNsaWNlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICB1cGRhdGVUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgbWVkaWFSZWNvcmRlci5zdGFydChjb25maWcudGltZVNsaWNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBkZWZhdWx0IGlzIDYwIG1pbnV0ZXM7IGVub3VnaD9cclxuICAgICAgICAgICAgLy8gdXNlIGNvbmZpZyA9PiB7dGltZVNsaWNlOiAxMDAwfSBvdGhlcndpc2VcclxuXHJcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIuc3RhcnQoMy42ZSs2KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuaW5pdENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5pbml0Q2FsbGJhY2soKTsgLy8gb2xkIGNvZGVcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHByb3BlcnR5IHtBcnJheX0gdGltZXN0YW1wcyAtIEFycmF5IG9mIHRpbWUgc3RhbXBzXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVkaWFTdHJlYW1SZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGNvbnNvbGUubG9nKHJlY29yZGVyLnRpbWVzdGFtcHMpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnRpbWVzdGFtcHMgPSBbXTtcclxuXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVUaW1lU3RhbXAoKSB7XHJcbiAgICAgICAgc2VsZi50aW1lc3RhbXBzLnB1c2gobmV3IERhdGUoKS5nZXRUaW1lKCkpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vblRpbWVTdGFtcCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjb25maWcub25UaW1lU3RhbXAoc2VsZi50aW1lc3RhbXBzW3NlbGYudGltZXN0YW1wcy5sZW5ndGggLSAxXSwgc2VsZi50aW1lc3RhbXBzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0TWltZVR5cGUoc2Vjb25kT2JqZWN0KSB7XHJcbiAgICAgICAgaWYgKG1lZGlhUmVjb3JkZXIgJiYgbWVkaWFSZWNvcmRlci5taW1lVHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbWVkaWFSZWNvcmRlci5taW1lVHlwZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZWNvbmRPYmplY3QubWltZVR5cGUgfHwgJ3ZpZGVvL3dlYm0nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2Qgc3RvcHMgcmVjb3JkaW5nIE1lZGlhU3RyZWFtLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbiwgdGhhdCBpcyB1c2VkIHRvIHBhc3MgcmVjb3JkZWQgYmxvYiBiYWNrIHRvIHRoZSBjYWxsZWUuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVkaWFTdHJlYW1SZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnN0b3AoZnVuY3Rpb24oYmxvYikge1xyXG4gICAgICogICAgIHZpZGVvLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5zdG9wID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XHJcblxyXG4gICAgICAgIHNlbGYubWFudWFsbHlTdG9wcGVkID0gdHJ1ZTsgLy8gdXNlZCBpbnNpZGUgdGhlIG1lZGlhUmVjb3JkZXIub25lcnJvclxyXG5cclxuICAgICAgICBpZiAoIW1lZGlhUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yZWNvcmRpbmdDYWxsYmFjayA9IGNhbGxiYWNrO1xyXG5cclxuICAgICAgICBpZiAobWVkaWFSZWNvcmRlci5zdGF0ZSA9PT0gJ3JlY29yZGluZycpIHtcclxuICAgICAgICAgICAgbWVkaWFSZWNvcmRlci5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy50aW1lU2xpY2UgPT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmJsb2IgPSBuZXcgQmxvYihhcnJheU9mQmxvYnMsIHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBnZXRNaW1lVHlwZShjb25maWcpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlY29yZGluZ0NhbGxiYWNrKHNlbGYuYmxvYik7XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHBhdXNlcyB0aGUgcmVjb3JkaW5nIHByb2Nlc3MuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVkaWFTdHJlYW1SZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnBhdXNlKCk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMucGF1c2UgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAoIW1lZGlhUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1lZGlhUmVjb3JkZXIuc3RhdGUgPT09ICdyZWNvcmRpbmcnKSB7XHJcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIucGF1c2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcmVzdW1lcyB0aGUgcmVjb3JkaW5nIHByb2Nlc3MuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVkaWFTdHJlYW1SZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnJlc3VtZSgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmICghbWVkaWFSZWNvcmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWVkaWFSZWNvcmRlci5zdGF0ZSA9PT0gJ3BhdXNlZCcpIHtcclxuICAgICAgICAgICAgbWVkaWFSZWNvcmRlci5yZXN1bWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcmVzZXRzIGN1cnJlbnRseSByZWNvcmRlZCBkYXRhLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIE1lZGlhU3RyZWFtUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5jbGVhclJlY29yZGVkRGF0YSgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLmNsZWFyUmVjb3JkZWREYXRhID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKG1lZGlhUmVjb3JkZXIgJiYgbWVkaWFSZWNvcmRlci5zdGF0ZSA9PT0gJ3JlY29yZGluZycpIHtcclxuICAgICAgICAgICAgc2VsZi5zdG9wKGNsZWFyUmVjb3JkZWREYXRhQ0IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2xlYXJSZWNvcmRlZERhdGFDQigpO1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhclJlY29yZGVkRGF0YUNCKCkge1xyXG4gICAgICAgIGFycmF5T2ZCbG9icyA9IFtdO1xyXG4gICAgICAgIG1lZGlhUmVjb3JkZXIgPSBudWxsO1xyXG4gICAgICAgIHNlbGYudGltZXN0YW1wcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlZmVyZW5jZSB0byBcIk1lZGlhUmVjb3JkZXJcIiBvYmplY3RcclxuICAgIHZhciBtZWRpYVJlY29yZGVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWNjZXNzIHRvIG5hdGl2ZSBNZWRpYVJlY29yZGVyIEFQSVxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIE1lZGlhU3RyZWFtUmVjb3JkZXJcclxuICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHZhciBpbnRlcm5hbCA9IHJlY29yZGVyLmdldEludGVybmFsUmVjb3JkZXIoKTtcclxuICAgICAqIGludGVybmFsLm9uZGF0YWF2YWlsYWJsZSA9IGZ1bmN0aW9uKCkge307IC8vIG92ZXJyaWRlXHJcbiAgICAgKiBpbnRlcm5hbC5zdHJlYW0sIGludGVybmFsLm9ucGF1c2UsIGludGVybmFsLm9uc3RvcCwgZXRjLlxyXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBpbnRlcm5hbCByZWNvcmRpbmcgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICB0aGlzLmdldEludGVybmFsUmVjb3JkZXIgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gbWVkaWFSZWNvcmRlcjtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gaXNNZWRpYVN0cmVhbUFjdGl2ZSgpIHtcclxuICAgICAgICBpZiAoJ2FjdGl2ZScgaW4gbWVkaWFTdHJlYW0pIHtcclxuICAgICAgICAgICAgaWYgKCFtZWRpYVN0cmVhbS5hY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoJ2VuZGVkJyBpbiBtZWRpYVN0cmVhbSkgeyAvLyBvbGQgaGFja1xyXG4gICAgICAgICAgICBpZiAobWVkaWFTdHJlYW0uZW5kZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwcm9wZXJ0eSB7QmxvYn0gYmxvYiAtIFJlY29yZGVkIGRhdGEgYXMgXCJCbG9iXCIgb2JqZWN0LlxyXG4gICAgICogQG1lbWJlcm9mIE1lZGlhU3RyZWFtUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5zdG9wKGZ1bmN0aW9uKCkge1xyXG4gICAgICogICAgIHZhciBibG9iID0gcmVjb3JkZXIuYmxvYjtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICB0aGlzLmJsb2IgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBNZWRpYVJlY29yZGVyIHJlYWRvbmx5IHN0YXRlLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIE1lZGlhU3RyZWFtUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB2YXIgc3RhdGUgPSByZWNvcmRlci5nZXRTdGF0ZSgpO1xyXG4gICAgICogQHJldHVybnMge1N0cmluZ30gUmV0dXJucyByZWNvcmRpbmcgc3RhdGUuXHJcbiAgICAgKi9cclxuICAgIHRoaXMuZ2V0U3RhdGUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAoIW1lZGlhUmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdpbmFjdGl2ZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWVkaWFSZWNvcmRlci5zdGF0ZSB8fCAnaW5hY3RpdmUnO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBsaXN0IG9mIGFsbCByZWNvcmRpbmcgc3RhdGVzXHJcbiAgICB2YXIgYWxsU3RhdGVzID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgTWVkaWFSZWNvcmRlciBhbGwgcmVjb3JkaW5nIHN0YXRlcy5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNZWRpYVN0cmVhbVJlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdmFyIHN0YXRlID0gcmVjb3JkZXIuZ2V0QWxsU3RhdGVzKCk7XHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYWxsIHJlY29yZGluZyBzdGF0ZXNcclxuICAgICAqL1xyXG4gICAgdGhpcy5nZXRBbGxTdGF0ZXMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gYWxsU3RhdGVzO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBpZiBhbnkgVHJhY2sgd2l0aGluIHRoZSBNZWRpYVN0cmVhbSBpcyBtdXRlZCBvciBub3QgZW5hYmxlZCBhdCBhbnkgdGltZSwgXHJcbiAgICAvLyB0aGUgYnJvd3NlciB3aWxsIG9ubHkgcmVjb3JkIGJsYWNrIGZyYW1lcyBcclxuICAgIC8vIG9yIHNpbGVuY2Ugc2luY2UgdGhhdCBpcyB0aGUgY29udGVudCBwcm9kdWNlZCBieSB0aGUgVHJhY2tcclxuICAgIC8vIHNvIHdlIG5lZWQgdG8gc3RvcFJlY29yZGluZyBhcyBzb29uIGFzIGFueSBzaW5nbGUgdHJhY2sgZW5kcy5cclxuICAgIGlmICh0eXBlb2YgY29uZmlnLmNoZWNrRm9ySW5hY3RpdmVUcmFja3MgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgY29uZmlnLmNoZWNrRm9ySW5hY3RpdmVUcmFja3MgPSBmYWxzZTsgLy8gZGlzYWJsZSB0byBtaW5pbWl6ZSBDUFUgdXNhZ2VcclxuICAgIH1cclxuXHJcbiAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgLy8gdGhpcyBtZXRob2QgY2hlY2tzIGlmIG1lZGlhIHN0cmVhbSBpcyBzdG9wcGVkXHJcbiAgICAvLyBvciBpZiBhbnkgdHJhY2sgaXMgZW5kZWQuXHJcbiAgICAoZnVuY3Rpb24gbG9vcGVyKCkge1xyXG4gICAgICAgIGlmICghbWVkaWFSZWNvcmRlciB8fCBjb25maWcuY2hlY2tGb3JJbmFjdGl2ZVRyYWNrcyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlzTWVkaWFTdHJlYW1BY3RpdmUoKSA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZUxvZ3MpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNZWRpYVN0cmVhbSBzZWVtcyBzdG9wcGVkLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlbGYuc3RvcCgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KGxvb3BlciwgMTAwMCk7IC8vIGNoZWNrIGV2ZXJ5IHNlY29uZFxyXG4gICAgfSkoKTtcclxuXHJcbiAgICAvLyBmb3IgZGVidWdnaW5nXHJcbiAgICB0aGlzLm5hbWUgPSAnTWVkaWFTdHJlYW1SZWNvcmRlcic7XHJcbiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcclxuICAgIH07XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgUmVjb3JkUlRDICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgUmVjb3JkUlRDLk1lZGlhU3RyZWFtUmVjb3JkZXIgPSBNZWRpYVN0cmVhbVJlY29yZGVyO1xyXG59XG5cclxuLy8gc291cmNlIGNvZGUgZnJvbTogaHR0cDovL3R5cGVkYXJyYXkub3JnL3dwLWNvbnRlbnQvcHJvamVjdHMvV2ViQXVkaW9SZWNvcmRlci9zY3JpcHQuanNcclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hdHRkaWFtb25kL1JlY29yZGVyanMjbGljZW5zZS1taXRcclxuLy8gX19fX19fX19fX19fX19fX19fX19fX1xyXG4vLyBTdGVyZW9BdWRpb1JlY29yZGVyLmpzXHJcblxyXG4vKipcclxuICogU3RlcmVvQXVkaW9SZWNvcmRlciBpcyBhIHN0YW5kYWxvbmUgY2xhc3MgdXNlZCBieSB7QGxpbmsgUmVjb3JkUlRDfSB0byBicmluZyBcInN0ZXJlb1wiIGF1ZGlvLXJlY29yZGluZyBpbiBjaHJvbWUuXHJcbiAqIEBzdW1tYXJ5IEphdmFTY3JpcHQgc3RhbmRhbG9uZSBvYmplY3QgZm9yIHN0ZXJlbyBhdWRpbyByZWNvcmRpbmcuXHJcbiAqIEBsaWNlbnNlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQy9ibG9iL21hc3Rlci9MSUNFTlNFfE1JVH1cclxuICogQGF1dGhvciB7QGxpbmsgaHR0cHM6Ly9NdWF6S2hhbi5jb218TXVheiBLaGFufVxyXG4gKiBAdHlwZWRlZiBTdGVyZW9BdWRpb1JlY29yZGVyXHJcbiAqIEBjbGFzc1xyXG4gKiBAZXhhbXBsZVxyXG4gKiB2YXIgcmVjb3JkZXIgPSBuZXcgU3RlcmVvQXVkaW9SZWNvcmRlcihNZWRpYVN0cmVhbSwge1xyXG4gKiAgICAgc2FtcGxlUmF0ZTogNDQxMDAsXHJcbiAqICAgICBidWZmZXJTaXplOiA0MDk2XHJcbiAqIH0pO1xyXG4gKiByZWNvcmRlci5yZWNvcmQoKTtcclxuICogcmVjb3JkZXIuc3RvcChmdW5jdGlvbihibG9iKSB7XHJcbiAqICAgICB2aWRlby5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gKiB9KTtcclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEN8UmVjb3JkUlRDIFNvdXJjZSBDb2RlfVxyXG4gKiBAcGFyYW0ge01lZGlhU3RyZWFtfSBtZWRpYVN0cmVhbSAtIE1lZGlhU3RyZWFtIG9iamVjdCBmZXRjaGVkIHVzaW5nIGdldFVzZXJNZWRpYSBBUEkgb3IgZ2VuZXJhdGVkIHVzaW5nIGNhcHR1cmVTdHJlYW1VbnRpbEVuZGVkIG9yIFdlYkF1ZGlvIEFQSS5cclxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIHtzYW1wbGVSYXRlOiA0NDEwMCwgYnVmZmVyU2l6ZTogNDA5NiwgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzOiAxLCBldGMufVxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIFN0ZXJlb0F1ZGlvUmVjb3JkZXIobWVkaWFTdHJlYW0sIGNvbmZpZykge1xyXG4gICAgaWYgKCFnZXRUcmFja3MobWVkaWFTdHJlYW0sICdhdWRpbycpLmxlbmd0aCkge1xyXG4gICAgICAgIHRocm93ICdZb3VyIHN0cmVhbSBoYXMgbm8gYXVkaW8gdHJhY2tzLic7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xyXG5cclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAvLyB2YXJpYWJsZXNcclxuICAgIHZhciBsZWZ0Y2hhbm5lbCA9IFtdO1xyXG4gICAgdmFyIHJpZ2h0Y2hhbm5lbCA9IFtdO1xyXG4gICAgdmFyIHJlY29yZGluZyA9IGZhbHNlO1xyXG4gICAgdmFyIHJlY29yZGluZ0xlbmd0aCA9IDA7XHJcbiAgICB2YXIganNBdWRpb05vZGU7XHJcblxyXG4gICAgdmFyIG51bWJlck9mQXVkaW9DaGFubmVscyA9IDI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgc2FtcGxlIHJhdGVzIHN1Y2ggYXMgOEsgb3IgMTZLLiBSZWZlcmVuY2U6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI4OTc3MTM2LzU1MjE4MlxyXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGRlc2lyZWRTYW1wUmF0ZSAtIERlc2lyZWQgQml0cyBwZXIgc2FtcGxlICogMTAwMFxyXG4gICAgICogQG1lbWJlcm9mIFN0ZXJlb0F1ZGlvUmVjb3JkZXJcclxuICAgICAqIEBpbnN0YW5jZVxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHZhciByZWNvcmRlciA9IFN0ZXJlb0F1ZGlvUmVjb3JkZXIobWVkaWFTdHJlYW0sIHtcclxuICAgICAqICAgZGVzaXJlZFNhbXBSYXRlOiAxNiAqIDEwMDAgLy8gYml0cy1wZXItc2FtcGxlICogMTAwMFxyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuICAgIHZhciBkZXNpcmVkU2FtcFJhdGUgPSBjb25maWcuZGVzaXJlZFNhbXBSYXRlO1xyXG5cclxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcclxuICAgIGlmIChjb25maWcubGVmdENoYW5uZWwgPT09IHRydWUpIHtcclxuICAgICAgICBudW1iZXJPZkF1ZGlvQ2hhbm5lbHMgPSAxO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25maWcubnVtYmVyT2ZBdWRpb0NoYW5uZWxzID09PSAxKSB7XHJcbiAgICAgICAgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzID0gMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIW51bWJlck9mQXVkaW9DaGFubmVscyB8fCBudW1iZXJPZkF1ZGlvQ2hhbm5lbHMgPCAxKSB7XHJcbiAgICAgICAgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzID0gMjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdTdGVyZW9BdWRpb1JlY29yZGVyIGlzIHNldCB0byByZWNvcmQgbnVtYmVyIG9mIGNoYW5uZWxzOiAnICsgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBhbnkgVHJhY2sgd2l0aGluIHRoZSBNZWRpYVN0cmVhbSBpcyBtdXRlZCBvciBub3QgZW5hYmxlZCBhdCBhbnkgdGltZSwgXHJcbiAgICAvLyB0aGUgYnJvd3NlciB3aWxsIG9ubHkgcmVjb3JkIGJsYWNrIGZyYW1lcyBcclxuICAgIC8vIG9yIHNpbGVuY2Ugc2luY2UgdGhhdCBpcyB0aGUgY29udGVudCBwcm9kdWNlZCBieSB0aGUgVHJhY2tcclxuICAgIC8vIHNvIHdlIG5lZWQgdG8gc3RvcFJlY29yZGluZyBhcyBzb29uIGFzIGFueSBzaW5nbGUgdHJhY2sgZW5kcy5cclxuICAgIGlmICh0eXBlb2YgY29uZmlnLmNoZWNrRm9ySW5hY3RpdmVUcmFja3MgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgY29uZmlnLmNoZWNrRm9ySW5hY3RpdmVUcmFja3MgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGlzTWVkaWFTdHJlYW1BY3RpdmUoKSB7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5jaGVja0ZvckluYWN0aXZlVHJhY2tzID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAvLyBhbHdheXMgcmV0dXJuIFwidHJ1ZVwiXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCdhY3RpdmUnIGluIG1lZGlhU3RyZWFtKSB7XHJcbiAgICAgICAgICAgIGlmICghbWVkaWFTdHJlYW0uYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKCdlbmRlZCcgaW4gbWVkaWFTdHJlYW0pIHsgLy8gb2xkIGhhY2tcclxuICAgICAgICAgICAgaWYgKG1lZGlhU3RyZWFtLmVuZGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCByZWNvcmRzIE1lZGlhU3RyZWFtLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIFN0ZXJlb0F1ZGlvUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5yZWNvcmQoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5yZWNvcmQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAoaXNNZWRpYVN0cmVhbUFjdGl2ZSgpID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aHJvdyAnUGxlYXNlIG1ha2Ugc3VyZSBNZWRpYVN0cmVhbSBpcyBhY3RpdmUuJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlc2V0VmFyaWFibGVzKCk7XHJcblxyXG4gICAgICAgIGlzQXVkaW9Qcm9jZXNzU3RhcnRlZCA9IGlzUGF1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgcmVjb3JkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcudGltZVNsaWNlICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICBsb29wZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIG1lcmdlTGVmdFJpZ2h0QnVmZmVycyhjb25maWcsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgZnVuY3Rpb24gbWVyZ2VBdWRpb0J1ZmZlcnMoY29uZmlnLCBjYikge1xyXG4gICAgICAgICAgICB2YXIgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzID0gY29uZmlnLm51bWJlck9mQXVkaW9DaGFubmVscztcclxuXHJcbiAgICAgICAgICAgIC8vIHRvZG86IFwic2xpY2UoMClcIiAtLS0gaXMgaXQgY2F1c2VzIGxvb3A/IFNob3VsZCBiZSByZW1vdmVkP1xyXG4gICAgICAgICAgICB2YXIgbGVmdEJ1ZmZlcnMgPSBjb25maWcubGVmdEJ1ZmZlcnMuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgIHZhciByaWdodEJ1ZmZlcnMgPSBjb25maWcucmlnaHRCdWZmZXJzLnNsaWNlKDApO1xyXG4gICAgICAgICAgICB2YXIgc2FtcGxlUmF0ZSA9IGNvbmZpZy5zYW1wbGVSYXRlO1xyXG4gICAgICAgICAgICB2YXIgaW50ZXJuYWxJbnRlcmxlYXZlZExlbmd0aCA9IGNvbmZpZy5pbnRlcm5hbEludGVybGVhdmVkTGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgZGVzaXJlZFNhbXBSYXRlID0gY29uZmlnLmRlc2lyZWRTYW1wUmF0ZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChudW1iZXJPZkF1ZGlvQ2hhbm5lbHMgPT09IDIpIHtcclxuICAgICAgICAgICAgICAgIGxlZnRCdWZmZXJzID0gbWVyZ2VCdWZmZXJzKGxlZnRCdWZmZXJzLCBpbnRlcm5hbEludGVybGVhdmVkTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIHJpZ2h0QnVmZmVycyA9IG1lcmdlQnVmZmVycyhyaWdodEJ1ZmZlcnMsIGludGVybmFsSW50ZXJsZWF2ZWRMZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkZXNpcmVkU2FtcFJhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0QnVmZmVycyA9IGludGVycG9sYXRlQXJyYXkobGVmdEJ1ZmZlcnMsIGRlc2lyZWRTYW1wUmF0ZSwgc2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRCdWZmZXJzID0gaW50ZXJwb2xhdGVBcnJheShyaWdodEJ1ZmZlcnMsIGRlc2lyZWRTYW1wUmF0ZSwgc2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChudW1iZXJPZkF1ZGlvQ2hhbm5lbHMgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGxlZnRCdWZmZXJzID0gbWVyZ2VCdWZmZXJzKGxlZnRCdWZmZXJzLCBpbnRlcm5hbEludGVybGVhdmVkTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZGVzaXJlZFNhbXBSYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEJ1ZmZlcnMgPSBpbnRlcnBvbGF0ZUFycmF5KGxlZnRCdWZmZXJzLCBkZXNpcmVkU2FtcFJhdGUsIHNhbXBsZVJhdGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgc2FtcGxlIHJhdGUgYXMgZGVzaXJlZCBzYW1wbGUgcmF0ZVxyXG4gICAgICAgICAgICBpZiAoZGVzaXJlZFNhbXBSYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBzYW1wbGVSYXRlID0gZGVzaXJlZFNhbXBSYXRlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBmb3IgY2hhbmdpbmcgdGhlIHNhbXBsaW5nIHJhdGUsIHJlZmVyZW5jZTpcclxuICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjg5NzcxMzYvNTUyMTgyXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGludGVycG9sYXRlQXJyYXkoZGF0YSwgbmV3U2FtcGxlUmF0ZSwgb2xkU2FtcGxlUmF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpdENvdW50ID0gTWF0aC5yb3VuZChkYXRhLmxlbmd0aCAqIChuZXdTYW1wbGVSYXRlIC8gb2xkU2FtcGxlUmF0ZSkpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSBbXTtcclxuICAgICAgICAgICAgICAgIHZhciBzcHJpbmdGYWN0b3IgPSBOdW1iZXIoKGRhdGEubGVuZ3RoIC0gMSkgLyAoZml0Q291bnQgLSAxKSk7XHJcbiAgICAgICAgICAgICAgICBuZXdEYXRhWzBdID0gZGF0YVswXTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgZml0Q291bnQgLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0gaSAqIHNwcmluZ0ZhY3RvcjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYmVmb3JlID0gTnVtYmVyKE1hdGguZmxvb3IodG1wKSkudG9GaXhlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhZnRlciA9IE51bWJlcihNYXRoLmNlaWwodG1wKSkudG9GaXhlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhdFBvaW50ID0gdG1wIC0gYmVmb3JlO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0RhdGFbaV0gPSBsaW5lYXJJbnRlcnBvbGF0ZShkYXRhW2JlZm9yZV0sIGRhdGFbYWZ0ZXJdLCBhdFBvaW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG5ld0RhdGFbZml0Q291bnQgLSAxXSA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXdEYXRhO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBsaW5lYXJJbnRlcnBvbGF0ZShiZWZvcmUsIGFmdGVyLCBhdFBvaW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYmVmb3JlICsgKGFmdGVyIC0gYmVmb3JlKSAqIGF0UG9pbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIG1lcmdlQnVmZmVycyhjaGFubmVsQnVmZmVyLCByTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEZsb2F0NjRBcnJheShyTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxuZyA9IGNoYW5uZWxCdWZmZXIubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG5nOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gY2hhbm5lbEJ1ZmZlcltpXTtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGJ1ZmZlciwgb2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYnVmZmVyLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBpbnRlcmxlYXZlKGxlZnRDaGFubmVsLCByaWdodENoYW5uZWwpIHtcclxuICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSBsZWZ0Q2hhbm5lbC5sZW5ndGggKyByaWdodENoYW5uZWwubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgRmxvYXQ2NEFycmF5KGxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGlucHV0SW5kZXggPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4KytdID0gbGVmdENoYW5uZWxbaW5wdXRJbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4KytdID0gcmlnaHRDaGFubmVsW2lucHV0SW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHdyaXRlVVRGQnl0ZXModmlldywgb2Zmc2V0LCBzdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgIHZhciBsbmcgPSBzdHJpbmcubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsbmc7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDgob2Zmc2V0ICsgaSwgc3RyaW5nLmNoYXJDb2RlQXQoaSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBpbnRlcmxlYXZlIGJvdGggY2hhbm5lbHMgdG9nZXRoZXJcclxuICAgICAgICAgICAgdmFyIGludGVybGVhdmVkO1xyXG5cclxuICAgICAgICAgICAgaWYgKG51bWJlck9mQXVkaW9DaGFubmVscyA9PT0gMikge1xyXG4gICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlKGxlZnRCdWZmZXJzLCByaWdodEJ1ZmZlcnMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobnVtYmVyT2ZBdWRpb0NoYW5uZWxzID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZCA9IGxlZnRCdWZmZXJzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgaW50ZXJsZWF2ZWRMZW5ndGggPSBpbnRlcmxlYXZlZC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAvLyBjcmVhdGUgd2F2IGZpbGVcclxuICAgICAgICAgICAgdmFyIHJlc3VsdGluZ0J1ZmZlckxlbmd0aCA9IDQ0ICsgaW50ZXJsZWF2ZWRMZW5ndGggKiAyO1xyXG5cclxuICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihyZXN1bHRpbmdCdWZmZXJMZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJJRkYgY2h1bmsgZGVzY3JpcHRvci9pZGVudGlmaWVyIFxyXG4gICAgICAgICAgICB3cml0ZVVURkJ5dGVzKHZpZXcsIDAsICdSSUZGJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBSSUZGIGNodW5rIGxlbmd0aFxyXG4gICAgICAgICAgICAvLyBjaGFuZ2VkIFwiNDRcIiB0byBcIjM2XCIgdmlhICM0MDFcclxuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoNCwgMzYgKyBpbnRlcmxlYXZlZExlbmd0aCAqIDIsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgLy8gUklGRiB0eXBlIFxyXG4gICAgICAgICAgICB3cml0ZVVURkJ5dGVzKHZpZXcsIDgsICdXQVZFJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBmb3JtYXQgY2h1bmsgaWRlbnRpZmllciBcclxuICAgICAgICAgICAgLy8gRk1UIHN1Yi1jaHVua1xyXG4gICAgICAgICAgICB3cml0ZVVURkJ5dGVzKHZpZXcsIDEyLCAnZm10ICcpO1xyXG5cclxuICAgICAgICAgICAgLy8gZm9ybWF0IGNodW5rIGxlbmd0aCBcclxuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoMTYsIDE2LCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNhbXBsZSBmb3JtYXQgKHJhdylcclxuICAgICAgICAgICAgdmlldy5zZXRVaW50MTYoMjAsIDEsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgLy8gc3RlcmVvICgyIGNoYW5uZWxzKVxyXG4gICAgICAgICAgICB2aWV3LnNldFVpbnQxNigyMiwgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNhbXBsZSByYXRlIFxyXG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMigyNCwgc2FtcGxlUmF0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBieXRlIHJhdGUgKHNhbXBsZSByYXRlICogYmxvY2sgYWxpZ24pXHJcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKDI4LCBzYW1wbGVSYXRlICogMiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBibG9jayBhbGlnbiAoY2hhbm5lbCBjb3VudCAqIGJ5dGVzIHBlciBzYW1wbGUpIFxyXG4gICAgICAgICAgICB2aWV3LnNldFVpbnQxNigzMiwgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzICogMiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBiaXRzIHBlciBzYW1wbGUgXHJcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDE2KDM0LCAxNiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBkYXRhIHN1Yi1jaHVua1xyXG4gICAgICAgICAgICAvLyBkYXRhIGNodW5rIGlkZW50aWZpZXIgXHJcbiAgICAgICAgICAgIHdyaXRlVVRGQnl0ZXModmlldywgMzYsICdkYXRhJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBkYXRhIGNodW5rIGxlbmd0aCBcclxuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoNDAsIGludGVybGVhdmVkTGVuZ3RoICogMiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyB3cml0ZSB0aGUgUENNIHNhbXBsZXNcclxuICAgICAgICAgICAgdmFyIGxuZyA9IGludGVybGVhdmVkTGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgaW5kZXggPSA0NDtcclxuICAgICAgICAgICAgdmFyIHZvbHVtZSA9IDE7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG5nOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZpZXcuc2V0SW50MTYoaW5kZXgsIGludGVybGVhdmVkW2ldICogKDB4N0ZGRiAqIHZvbHVtZSksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2Ioe1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogYnVmZmVyLFxyXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IHZpZXdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBwb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICBidWZmZXI6IGJ1ZmZlcixcclxuICAgICAgICAgICAgICAgIHZpZXc6IHZpZXdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29uZmlnLm5vV29ya2VyKSB7XHJcbiAgICAgICAgICAgIG1lcmdlQXVkaW9CdWZmZXJzKGNvbmZpZywgZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YS5idWZmZXIsIGRhdGEudmlldyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgdmFyIHdlYldvcmtlciA9IHByb2Nlc3NJbldlYldvcmtlcihtZXJnZUF1ZGlvQnVmZmVycyk7XHJcblxyXG4gICAgICAgIHdlYldvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhldmVudC5kYXRhLmJ1ZmZlciwgZXZlbnQuZGF0YS52aWV3KTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlbGVhc2UgbWVtb3J5XHJcbiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwod2ViV29ya2VyLndvcmtlclVSTCk7XHJcblxyXG4gICAgICAgICAgICAvLyBraWxsIHdlYndvcmtlciAob3IgQ2hyb21lIHdpbGwga2lsbCB5b3VyIHBhZ2UgYWZ0ZXIgfjI1IGNhbGxzKVxyXG4gICAgICAgICAgICB3ZWJXb3JrZXIudGVybWluYXRlKCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgd2ViV29ya2VyLnBvc3RNZXNzYWdlKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0luV2ViV29ya2VyKF9mdW5jdGlvbikge1xyXG4gICAgICAgIHZhciB3b3JrZXJVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtfZnVuY3Rpb24udG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgJzt0aGlzLm9ubWVzc2FnZSA9ICBmdW5jdGlvbiAoZWVlKSB7JyArIF9mdW5jdGlvbi5uYW1lICsgJyhlZWUuZGF0YSk7fSdcclxuICAgICAgICBdLCB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0J1xyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVVJMKTtcclxuICAgICAgICB3b3JrZXIud29ya2VyVVJMID0gd29ya2VyVVJMO1xyXG4gICAgICAgIHJldHVybiB3b3JrZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBzdG9wcyByZWNvcmRpbmcgTWVkaWFTdHJlYW0uXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLCB0aGF0IGlzIHVzZWQgdG8gcGFzcyByZWNvcmRlZCBibG9iIGJhY2sgdG8gdGhlIGNhbGxlZS5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBTdGVyZW9BdWRpb1JlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuc3RvcChmdW5jdGlvbihibG9iKSB7XHJcbiAgICAgKiAgICAgdmlkZW8uc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcclxuXHJcbiAgICAgICAgLy8gc3RvcCByZWNvcmRpbmdcclxuICAgICAgICByZWNvcmRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgbWVyZ2VMZWZ0UmlnaHRCdWZmZXJzKHtcclxuICAgICAgICAgICAgZGVzaXJlZFNhbXBSYXRlOiBkZXNpcmVkU2FtcFJhdGUsXHJcbiAgICAgICAgICAgIHNhbXBsZVJhdGU6IHNhbXBsZVJhdGUsXHJcbiAgICAgICAgICAgIG51bWJlck9mQXVkaW9DaGFubmVsczogbnVtYmVyT2ZBdWRpb0NoYW5uZWxzLFxyXG4gICAgICAgICAgICBpbnRlcm5hbEludGVybGVhdmVkTGVuZ3RoOiByZWNvcmRpbmdMZW5ndGgsXHJcbiAgICAgICAgICAgIGxlZnRCdWZmZXJzOiBsZWZ0Y2hhbm5lbCxcclxuICAgICAgICAgICAgcmlnaHRCdWZmZXJzOiBudW1iZXJPZkF1ZGlvQ2hhbm5lbHMgPT09IDEgPyBbXSA6IHJpZ2h0Y2hhbm5lbCxcclxuICAgICAgICAgICAgbm9Xb3JrZXI6IGNvbmZpZy5ub1dvcmtlclxyXG4gICAgICAgIH0sIGZ1bmN0aW9uKGJ1ZmZlciwgdmlldykge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtCbG9ifSBibG9iIC0gVGhlIHJlY29yZGVkIGJsb2Igb2JqZWN0LlxyXG4gICAgICAgICAgICAgKiBAbWVtYmVyb2YgU3RlcmVvQXVkaW9SZWNvcmRlclxyXG4gICAgICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAgICAgKiByZWNvcmRlci5zdG9wKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAqICAgICB2YXIgYmxvYiA9IHJlY29yZGVyLmJsb2I7XHJcbiAgICAgICAgICAgICAqIH0pO1xyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgc2VsZi5ibG9iID0gbmV3IEJsb2IoW3ZpZXddLCB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXVkaW8vd2F2J1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge0FycmF5QnVmZmVyfSBidWZmZXIgLSBUaGUgcmVjb3JkZWQgYnVmZmVyIG9iamVjdC5cclxuICAgICAgICAgICAgICogQG1lbWJlcm9mIFN0ZXJlb0F1ZGlvUmVjb3JkZXJcclxuICAgICAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgICAgICogcmVjb3JkZXIuc3RvcChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgKiAgICAgdmFyIGJ1ZmZlciA9IHJlY29yZGVyLmJ1ZmZlcjtcclxuICAgICAgICAgICAgICogfSk7XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcih2aWV3LmJ1ZmZlci5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBAcHJvcGVydHkge0RhdGFWaWV3fSB2aWV3IC0gVGhlIHJlY29yZGVkIGRhdGEtdmlldyBvYmplY3QuXHJcbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBTdGVyZW9BdWRpb1JlY29yZGVyXHJcbiAgICAgICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICAgICAqIHJlY29yZGVyLnN0b3AoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICogICAgIHZhciB2aWV3ID0gcmVjb3JkZXIudmlldztcclxuICAgICAgICAgICAgICogfSk7XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBzZWxmLnZpZXcgPSB2aWV3O1xyXG5cclxuICAgICAgICAgICAgc2VsZi5zYW1wbGVSYXRlID0gZGVzaXJlZFNhbXBSYXRlIHx8IHNhbXBsZVJhdGU7XHJcbiAgICAgICAgICAgIHNlbGYuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7XHJcblxyXG4gICAgICAgICAgICAvLyByZWNvcmRlZCBhdWRpbyBsZW5ndGhcclxuICAgICAgICAgICAgc2VsZi5sZW5ndGggPSByZWNvcmRpbmdMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBpc0F1ZGlvUHJvY2Vzc1N0YXJ0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soc2VsZi5ibG9iKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodHlwZW9mIFJlY29yZFJUQy5TdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIFJlY29yZFJUQy5TdG9yYWdlID0ge1xyXG4gICAgICAgICAgICBBdWRpb0NvbnRleHRDb25zdHJ1Y3RvcjogbnVsbCxcclxuICAgICAgICAgICAgQXVkaW9Db250ZXh0OiB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghUmVjb3JkUlRDLlN0b3JhZ2UuQXVkaW9Db250ZXh0Q29uc3RydWN0b3IgfHwgUmVjb3JkUlRDLlN0b3JhZ2UuQXVkaW9Db250ZXh0Q29uc3RydWN0b3Iuc3RhdGUgPT09ICdjbG9zZWQnKSB7XHJcbiAgICAgICAgUmVjb3JkUlRDLlN0b3JhZ2UuQXVkaW9Db250ZXh0Q29uc3RydWN0b3IgPSBuZXcgUmVjb3JkUlRDLlN0b3JhZ2UuQXVkaW9Db250ZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGNvbnRleHQgPSBSZWNvcmRSVEMuU3RvcmFnZS5BdWRpb0NvbnRleHRDb25zdHJ1Y3RvcjtcclxuXHJcbiAgICAvLyBjcmVhdGVzIGFuIGF1ZGlvIG5vZGUgZnJvbSB0aGUgbWljcm9waG9uZSBpbmNvbWluZyBzdHJlYW1cclxuICAgIHZhciBhdWRpb0lucHV0ID0gY29udGV4dC5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZShtZWRpYVN0cmVhbSk7XHJcblxyXG4gICAgdmFyIGxlZ2FsQnVmZmVyVmFsdWVzID0gWzAsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCA0MDk2LCA4MTkyLCAxNjM4NF07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGcm9tIHRoZSBzcGVjOiBUaGlzIHZhbHVlIGNvbnRyb2xzIGhvdyBmcmVxdWVudGx5IHRoZSBhdWRpb3Byb2Nlc3MgZXZlbnQgaXNcclxuICAgICAqIGRpc3BhdGNoZWQgYW5kIGhvdyBtYW55IHNhbXBsZS1mcmFtZXMgbmVlZCB0byBiZSBwcm9jZXNzZWQgZWFjaCBjYWxsLlxyXG4gICAgICogTG93ZXIgdmFsdWVzIGZvciBidWZmZXIgc2l6ZSB3aWxsIHJlc3VsdCBpbiBhIGxvd2VyIChiZXR0ZXIpIGxhdGVuY3kuXHJcbiAgICAgKiBIaWdoZXIgdmFsdWVzIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIGF2b2lkIGF1ZGlvIGJyZWFrdXAgYW5kIGdsaXRjaGVzXHJcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIChpbiBzYW1wbGUtZnJhbWVzKSB3aGljaCBuZWVkcyB0b1xyXG4gICAgICogYmUgcHJvY2Vzc2VkIGVhY2ggdGltZSBvbnByb2Nlc3NhdWRpbyBpcyBjYWxsZWQuXHJcbiAgICAgKiBMZWdhbCB2YWx1ZXMgYXJlICgyNTYsIDUxMiwgMTAyNCwgMjA0OCwgNDA5NiwgODE5MiwgMTYzODQpLlxyXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJ1ZmZlclNpemUgLSBCdWZmZXItc2l6ZSBmb3IgaG93IGZyZXF1ZW50bHkgdGhlIGF1ZGlvcHJvY2VzcyBldmVudCBpcyBkaXNwYXRjaGVkLlxyXG4gICAgICogQG1lbWJlcm9mIFN0ZXJlb0F1ZGlvUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlciA9IG5ldyBTdGVyZW9BdWRpb1JlY29yZGVyKG1lZGlhU3RyZWFtLCB7XHJcbiAgICAgKiAgICAgYnVmZmVyU2l6ZTogNDA5NlxyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuXHJcbiAgICAvLyBcIjBcIiBtZWFucywgbGV0IGNocm9tZSBkZWNpZGUgdGhlIG1vc3QgYWNjdXJhdGUgYnVmZmVyLXNpemUgZm9yIGN1cnJlbnQgcGxhdGZvcm0uXHJcbiAgICB2YXIgYnVmZmVyU2l6ZSA9IHR5cGVvZiBjb25maWcuYnVmZmVyU2l6ZSA9PT0gJ3VuZGVmaW5lZCcgPyA0MDk2IDogY29uZmlnLmJ1ZmZlclNpemU7XHJcblxyXG4gICAgaWYgKGxlZ2FsQnVmZmVyVmFsdWVzLmluZGV4T2YoYnVmZmVyU2l6ZSkgPT09IC0xKSB7XHJcbiAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZUxvZ3MpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0xlZ2FsIHZhbHVlcyBmb3IgYnVmZmVyLXNpemUgYXJlICcgKyBKU09OLnN0cmluZ2lmeShsZWdhbEJ1ZmZlclZhbHVlcywgbnVsbCwgJ1xcdCcpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbnRleHQuY3JlYXRlSmF2YVNjcmlwdE5vZGUpIHtcclxuICAgICAgICBqc0F1ZGlvTm9kZSA9IGNvbnRleHQuY3JlYXRlSmF2YVNjcmlwdE5vZGUoYnVmZmVyU2l6ZSwgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzLCBudW1iZXJPZkF1ZGlvQ2hhbm5lbHMpO1xyXG4gICAgfSBlbHNlIGlmIChjb250ZXh0LmNyZWF0ZVNjcmlwdFByb2Nlc3Nvcikge1xyXG4gICAgICAgIGpzQXVkaW9Ob2RlID0gY29udGV4dC5jcmVhdGVTY3JpcHRQcm9jZXNzb3IoYnVmZmVyU2l6ZSwgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzLCBudW1iZXJPZkF1ZGlvQ2hhbm5lbHMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyAnV2ViQXVkaW8gQVBJIGhhcyBubyBzdXBwb3J0IG9uIHRoaXMgYnJvd3Nlci4nO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbm5lY3QgdGhlIHN0cmVhbSB0byB0aGUgc2NyaXB0IHByb2Nlc3NvclxyXG4gICAgYXVkaW9JbnB1dC5jb25uZWN0KGpzQXVkaW9Ob2RlKTtcclxuXHJcbiAgICBpZiAoIWNvbmZpZy5idWZmZXJTaXplKSB7XHJcbiAgICAgICAgYnVmZmVyU2l6ZSA9IGpzQXVkaW9Ob2RlLmJ1ZmZlclNpemU7IC8vIGRldmljZSBidWZmZXItc2l6ZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNhbXBsZSByYXRlIChpbiBzYW1wbGUtZnJhbWVzIHBlciBzZWNvbmQpIGF0IHdoaWNoIHRoZVxyXG4gICAgICogQXVkaW9Db250ZXh0IGhhbmRsZXMgYXVkaW8uIEl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgQXVkaW9Ob2Rlc1xyXG4gICAgICogaW4gdGhlIGNvbnRleHQgcnVuIGF0IHRoaXMgcmF0ZS4gSW4gbWFraW5nIHRoaXMgYXNzdW1wdGlvbixcclxuICAgICAqIHNhbXBsZS1yYXRlIGNvbnZlcnRlcnMgb3IgXCJ2YXJpc3BlZWRcIiBwcm9jZXNzb3JzIGFyZSBub3Qgc3VwcG9ydGVkXHJcbiAgICAgKiBpbiByZWFsLXRpbWUgcHJvY2Vzc2luZy5cclxuICAgICAqIFRoZSBzYW1wbGVSYXRlIHBhcmFtZXRlciBkZXNjcmliZXMgdGhlIHNhbXBsZS1yYXRlIG9mIHRoZVxyXG4gICAgICogbGluZWFyIFBDTSBhdWRpbyBkYXRhIGluIHRoZSBidWZmZXIgaW4gc2FtcGxlLWZyYW1lcyBwZXIgc2Vjb25kLlxyXG4gICAgICogQW4gaW1wbGVtZW50YXRpb24gbXVzdCBzdXBwb3J0IHNhbXBsZS1yYXRlcyBpbiBhdCBsZWFzdFxyXG4gICAgICogdGhlIHJhbmdlIDIyMDUwIHRvIDk2MDAwLlxyXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNhbXBsZVJhdGUgLSBCdWZmZXItc2l6ZSBmb3IgaG93IGZyZXF1ZW50bHkgdGhlIGF1ZGlvcHJvY2VzcyBldmVudCBpcyBkaXNwYXRjaGVkLlxyXG4gICAgICogQG1lbWJlcm9mIFN0ZXJlb0F1ZGlvUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlciA9IG5ldyBTdGVyZW9BdWRpb1JlY29yZGVyKG1lZGlhU3RyZWFtLCB7XHJcbiAgICAgKiAgICAgc2FtcGxlUmF0ZTogNDQxMDBcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICB2YXIgc2FtcGxlUmF0ZSA9IHR5cGVvZiBjb25maWcuc2FtcGxlUmF0ZSAhPT0gJ3VuZGVmaW5lZCcgPyBjb25maWcuc2FtcGxlUmF0ZSA6IGNvbnRleHQuc2FtcGxlUmF0ZSB8fCA0NDEwMDtcclxuXHJcbiAgICBpZiAoc2FtcGxlUmF0ZSA8IDIyMDUwIHx8IHNhbXBsZVJhdGUgPiA5NjAwMCkge1xyXG4gICAgICAgIC8vIFJlZjogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjYzMDM5MTgvNTUyMTgyXHJcbiAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZUxvZ3MpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3NhbXBsZS1yYXRlIG11c3QgYmUgdW5kZXIgcmFuZ2UgMjIwNTAgYW5kIDk2MDAwLicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgIGlmIChjb25maWcuZGVzaXJlZFNhbXBSYXRlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZXNpcmVkIHNhbXBsZS1yYXRlOiAnICsgY29uZmlnLmRlc2lyZWRTYW1wUmF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBpc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBwYXVzZXMgdGhlIHJlY29yZGluZyBwcm9jZXNzLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIFN0ZXJlb0F1ZGlvUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5wYXVzZSgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnBhdXNlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaXNQYXVzZWQgPSB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlc3VtZXMgdGhlIHJlY29yZGluZyBwcm9jZXNzLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIFN0ZXJlb0F1ZGlvUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5yZXN1bWUoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5yZXN1bWUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAoaXNNZWRpYVN0cmVhbUFjdGl2ZSgpID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aHJvdyAnUGxlYXNlIG1ha2Ugc3VyZSBNZWRpYVN0cmVhbSBpcyBhY3RpdmUuJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcmVjb3JkaW5nKSB7XHJcbiAgICAgICAgICAgIGlmICghY29uZmlnLmRpc2FibGVMb2dzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU2VlbXMgcmVjb3JkaW5nIGhhcyBiZWVuIHJlc3RhcnRlZC4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlY29yZCgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlc2V0cyBjdXJyZW50bHkgcmVjb3JkZWQgZGF0YS5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBTdGVyZW9BdWRpb1JlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuY2xlYXJSZWNvcmRlZERhdGEoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5jbGVhclJlY29yZGVkRGF0YSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGNvbmZpZy5jaGVja0ZvckluYWN0aXZlVHJhY2tzID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChyZWNvcmRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5zdG9wKGNsZWFyUmVjb3JkZWREYXRhQ0IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2xlYXJSZWNvcmRlZERhdGFDQigpO1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiByZXNldFZhcmlhYmxlcygpIHtcclxuICAgICAgICBsZWZ0Y2hhbm5lbCA9IFtdO1xyXG4gICAgICAgIHJpZ2h0Y2hhbm5lbCA9IFtdO1xyXG4gICAgICAgIHJlY29yZGluZ0xlbmd0aCA9IDA7XHJcbiAgICAgICAgaXNBdWRpb1Byb2Nlc3NTdGFydGVkID0gZmFsc2U7XHJcbiAgICAgICAgcmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICBjb250ZXh0ID0gbnVsbDtcclxuXHJcbiAgICAgICAgc2VsZi5sZWZ0Y2hhbm5lbCA9IGxlZnRjaGFubmVsO1xyXG4gICAgICAgIHNlbGYucmlnaHRjaGFubmVsID0gcmlnaHRjaGFubmVsO1xyXG4gICAgICAgIHNlbGYubnVtYmVyT2ZBdWRpb0NoYW5uZWxzID0gbnVtYmVyT2ZBdWRpb0NoYW5uZWxzO1xyXG4gICAgICAgIHNlbGYuZGVzaXJlZFNhbXBSYXRlID0gZGVzaXJlZFNhbXBSYXRlO1xyXG4gICAgICAgIHNlbGYuc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7XHJcbiAgICAgICAgc2VsZi5yZWNvcmRpbmdMZW5ndGggPSByZWNvcmRpbmdMZW5ndGg7XHJcblxyXG4gICAgICAgIGludGVydmFsc0Jhc2VkQnVmZmVycyA9IHtcclxuICAgICAgICAgICAgbGVmdDogW10sXHJcbiAgICAgICAgICAgIHJpZ2h0OiBbXSxcclxuICAgICAgICAgICAgcmVjb3JkaW5nTGVuZ3RoOiAwXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhclJlY29yZGVkRGF0YUNCKCkge1xyXG4gICAgICAgIGlmIChqc0F1ZGlvTm9kZSkge1xyXG4gICAgICAgICAgICBqc0F1ZGlvTm9kZS5vbmF1ZGlvcHJvY2VzcyA9IG51bGw7XHJcbiAgICAgICAgICAgIGpzQXVkaW9Ob2RlLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAganNBdWRpb05vZGUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGF1ZGlvSW5wdXQpIHtcclxuICAgICAgICAgICAgYXVkaW9JbnB1dC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIGF1ZGlvSW5wdXQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVzZXRWYXJpYWJsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmb3IgZGVidWdnaW5nXHJcbiAgICB0aGlzLm5hbWUgPSAnU3RlcmVvQXVkaW9SZWNvcmRlcic7XHJcbiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcclxuICAgIH07XHJcblxyXG4gICAgdmFyIGlzQXVkaW9Qcm9jZXNzU3RhcnRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGZ1bmN0aW9uIG9uQXVkaW9Qcm9jZXNzRGF0YUF2YWlsYWJsZShlKSB7XHJcbiAgICAgICAgaWYgKGlzUGF1c2VkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpc01lZGlhU3RyZWFtQWN0aXZlKCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmICghY29uZmlnLmRpc2FibGVMb2dzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTWVkaWFTdHJlYW0gc2VlbXMgc3RvcHBlZC4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBqc0F1ZGlvTm9kZS5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHJlY29yZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFyZWNvcmRpbmcpIHtcclxuICAgICAgICAgICAgaWYgKGF1ZGlvSW5wdXQpIHtcclxuICAgICAgICAgICAgICAgIGF1ZGlvSW5wdXQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgYXVkaW9JbnB1dCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIFwib25hdWRpb3Byb2Nlc3NcIiBldmVudCdzIGZpcnN0IGludm9jYXRpb24uXHJcbiAgICAgICAgICogQG1ldGhvZCB7ZnVuY3Rpb259IG9uQXVkaW9Qcm9jZXNzU3RhcnRlZFxyXG4gICAgICAgICAqIEBtZW1iZXJvZiBTdGVyZW9BdWRpb1JlY29yZGVyXHJcbiAgICAgICAgICogQGV4YW1wbGVcclxuICAgICAgICAgKiByZWNvcmRlci5vbkF1ZGlvUHJvY2Vzc1N0YXJ0ZWQ6IGZ1bmN0aW9uKCkgeyB9O1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICghaXNBdWRpb1Byb2Nlc3NTdGFydGVkKSB7XHJcbiAgICAgICAgICAgIGlzQXVkaW9Qcm9jZXNzU3RhcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChjb25maWcub25BdWRpb1Byb2Nlc3NTdGFydGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcub25BdWRpb1Byb2Nlc3NTdGFydGVkKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb25maWcuaW5pdENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcuaW5pdENhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBsZWZ0ID0gZS5pbnB1dEJ1ZmZlci5nZXRDaGFubmVsRGF0YSgwKTtcclxuXHJcbiAgICAgICAgLy8gd2UgY2xvbmUgdGhlIHNhbXBsZXNcclxuICAgICAgICB2YXIgY2hMZWZ0ID0gbmV3IEZsb2F0MzJBcnJheShsZWZ0KTtcclxuICAgICAgICBsZWZ0Y2hhbm5lbC5wdXNoKGNoTGVmdCk7XHJcblxyXG4gICAgICAgIGlmIChudW1iZXJPZkF1ZGlvQ2hhbm5lbHMgPT09IDIpIHtcclxuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gZS5pbnB1dEJ1ZmZlci5nZXRDaGFubmVsRGF0YSgxKTtcclxuICAgICAgICAgICAgdmFyIGNoUmlnaHQgPSBuZXcgRmxvYXQzMkFycmF5KHJpZ2h0KTtcclxuICAgICAgICAgICAgcmlnaHRjaGFubmVsLnB1c2goY2hSaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZWNvcmRpbmdMZW5ndGggKz0gYnVmZmVyU2l6ZTtcclxuXHJcbiAgICAgICAgLy8gZXhwb3J0IHJhdyBQQ01cclxuICAgICAgICBzZWxmLnJlY29yZGluZ0xlbmd0aCA9IHJlY29yZGluZ0xlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcudGltZVNsaWNlICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICBpbnRlcnZhbHNCYXNlZEJ1ZmZlcnMucmVjb3JkaW5nTGVuZ3RoICs9IGJ1ZmZlclNpemU7XHJcbiAgICAgICAgICAgIGludGVydmFsc0Jhc2VkQnVmZmVycy5sZWZ0LnB1c2goY2hMZWZ0KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChudW1iZXJPZkF1ZGlvQ2hhbm5lbHMgPT09IDIpIHtcclxuICAgICAgICAgICAgICAgIGludGVydmFsc0Jhc2VkQnVmZmVycy5yaWdodC5wdXNoKGNoUmlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGpzQXVkaW9Ob2RlLm9uYXVkaW9wcm9jZXNzID0gb25BdWRpb1Byb2Nlc3NEYXRhQXZhaWxhYmxlO1xyXG5cclxuICAgIC8vIHRvIHByZXZlbnQgc2VsZiBhdWRpbyB0byBiZSBjb25uZWN0ZWQgd2l0aCBzcGVha2Vyc1xyXG4gICAgaWYgKGNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1EZXN0aW5hdGlvbikge1xyXG4gICAgICAgIGpzQXVkaW9Ob2RlLmNvbm5lY3QoY29udGV4dC5jcmVhdGVNZWRpYVN0cmVhbURlc3RpbmF0aW9uKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBqc0F1ZGlvTm9kZS5jb25uZWN0KGNvbnRleHQuZGVzdGluYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGV4cG9ydCByYXcgUENNXHJcbiAgICB0aGlzLmxlZnRjaGFubmVsID0gbGVmdGNoYW5uZWw7XHJcbiAgICB0aGlzLnJpZ2h0Y2hhbm5lbCA9IHJpZ2h0Y2hhbm5lbDtcclxuICAgIHRoaXMubnVtYmVyT2ZBdWRpb0NoYW5uZWxzID0gbnVtYmVyT2ZBdWRpb0NoYW5uZWxzO1xyXG4gICAgdGhpcy5kZXNpcmVkU2FtcFJhdGUgPSBkZXNpcmVkU2FtcFJhdGU7XHJcbiAgICB0aGlzLnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlO1xyXG4gICAgc2VsZi5yZWNvcmRpbmdMZW5ndGggPSByZWNvcmRpbmdMZW5ndGg7XHJcblxyXG4gICAgLy8gaGVscGVyIGZvciBpbnRlcnZhbHMgYmFzZWQgYmxvYnNcclxuICAgIHZhciBpbnRlcnZhbHNCYXNlZEJ1ZmZlcnMgPSB7XHJcbiAgICAgICAgbGVmdDogW10sXHJcbiAgICAgICAgcmlnaHQ6IFtdLFxyXG4gICAgICAgIHJlY29yZGluZ0xlbmd0aDogMFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyB0aGlzIGxvb3BlciBpcyB1c2VkIHRvIHN1cHBvcnQgaW50ZXJ2YWxzIGJhc2VkIGJsb2JzICh2aWEgdGltZVNsaWNlK29uZGF0YWF2YWlsYWJsZSlcclxuICAgIGZ1bmN0aW9uIGxvb3BlcigpIHtcclxuICAgICAgICBpZiAoIXJlY29yZGluZyB8fCB0eXBlb2YgY29uZmlnLm9uZGF0YWF2YWlsYWJsZSAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgY29uZmlnLnRpbWVTbGljZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGludGVydmFsc0Jhc2VkQnVmZmVycy5sZWZ0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBtZXJnZUxlZnRSaWdodEJ1ZmZlcnMoe1xyXG4gICAgICAgICAgICAgICAgZGVzaXJlZFNhbXBSYXRlOiBkZXNpcmVkU2FtcFJhdGUsXHJcbiAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiBzYW1wbGVSYXRlLFxyXG4gICAgICAgICAgICAgICAgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzOiBudW1iZXJPZkF1ZGlvQ2hhbm5lbHMsXHJcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEludGVybGVhdmVkTGVuZ3RoOiBpbnRlcnZhbHNCYXNlZEJ1ZmZlcnMucmVjb3JkaW5nTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgbGVmdEJ1ZmZlcnM6IGludGVydmFsc0Jhc2VkQnVmZmVycy5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgcmlnaHRCdWZmZXJzOiBudW1iZXJPZkF1ZGlvQ2hhbm5lbHMgPT09IDEgPyBbXSA6IGludGVydmFsc0Jhc2VkQnVmZmVycy5yaWdodFxyXG4gICAgICAgICAgICB9LCBmdW5jdGlvbihidWZmZXIsIHZpZXcpIHtcclxuICAgICAgICAgICAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW3ZpZXddLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2F1ZGlvL3dhdidcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLm9uZGF0YWF2YWlsYWJsZShibG9iKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGxvb3BlciwgY29uZmlnLnRpbWVTbGljZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaW50ZXJ2YWxzQmFzZWRCdWZmZXJzID0ge1xyXG4gICAgICAgICAgICAgICAgbGVmdDogW10sXHJcbiAgICAgICAgICAgICAgICByaWdodDogW10sXHJcbiAgICAgICAgICAgICAgICByZWNvcmRpbmdMZW5ndGg6IDBcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGxvb3BlciwgY29uZmlnLnRpbWVTbGljZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5pZiAodHlwZW9mIFJlY29yZFJUQyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIFJlY29yZFJUQy5TdGVyZW9BdWRpb1JlY29yZGVyID0gU3RlcmVvQXVkaW9SZWNvcmRlcjtcclxufVxyXG5cclxuLy8gX19fX19fX19fX19fX19fX19cclxuLy8gQ2FudmFzUmVjb3JkZXIuanNcclxuXHJcbi8qKlxyXG4gKiBDYW52YXNSZWNvcmRlciBpcyBhIHN0YW5kYWxvbmUgY2xhc3MgdXNlZCBieSB7QGxpbmsgUmVjb3JkUlRDfSB0byBicmluZyBIVE1MNS1DYW52YXMgcmVjb3JkaW5nIGludG8gdmlkZW8gV2ViTS4gSXQgdXNlcyBIVE1MMkNhbnZhcyBsaWJyYXJ5IGFuZCBydW5zIHRvcCBvdmVyIHtAbGluayBXaGFtbXl9LlxyXG4gKiBAc3VtbWFyeSBIVE1MMkNhbnZhcyByZWNvcmRpbmcgaW50byB2aWRlbyBXZWJNLlxyXG4gKiBAbGljZW5zZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEMvYmxvYi9tYXN0ZXIvTElDRU5TRXxNSVR9XHJcbiAqIEBhdXRob3Ige0BsaW5rIGh0dHBzOi8vTXVhektoYW4uY29tfE11YXogS2hhbn1cclxuICogQHR5cGVkZWYgQ2FudmFzUmVjb3JkZXJcclxuICogQGNsYXNzXHJcbiAqIEBleGFtcGxlXHJcbiAqIHZhciByZWNvcmRlciA9IG5ldyBDYW52YXNSZWNvcmRlcihodG1sRWxlbWVudCwgeyBkaXNhYmxlTG9nczogdHJ1ZSwgdXNlV2hhbW15UmVjb3JkZXI6IHRydWUgfSk7XHJcbiAqIHJlY29yZGVyLnJlY29yZCgpO1xyXG4gKiByZWNvcmRlci5zdG9wKGZ1bmN0aW9uKGJsb2IpIHtcclxuICogICAgIHZpZGVvLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAqIH0pO1xyXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQ3xSZWNvcmRSVEMgU291cmNlIENvZGV9XHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGh0bWxFbGVtZW50IC0gcXVlcnlTZWxlY3Rvci9nZXRFbGVtZW50QnlJZC9nZXRFbGVtZW50c0J5VGFnTmFtZVswXS9ldGMuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSB7ZGlzYWJsZUxvZ3M6dHJ1ZSwgaW5pdENhbGxiYWNrOiBmdW5jdGlvbn1cclxuICovXHJcblxyXG5mdW5jdGlvbiBDYW52YXNSZWNvcmRlcihodG1sRWxlbWVudCwgY29uZmlnKSB7XHJcbiAgICBpZiAodHlwZW9mIGh0bWwyY2FudmFzID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRocm93ICdQbGVhc2UgbGluazogaHR0cHM6Ly93d3cud2VicnRjLWV4cGVyaW1lbnQuY29tL3NjcmVlbnNob3QuanMnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcclxuICAgIGlmICghY29uZmlnLmZyYW1lSW50ZXJ2YWwpIHtcclxuICAgICAgICBjb25maWcuZnJhbWVJbnRlcnZhbCA9IDEwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHZpYSBEZXRlY3RSVEMuanNcclxuICAgIHZhciBpc0NhbnZhc1N1cHBvcnRzU3RyZWFtQ2FwdHVyaW5nID0gZmFsc2U7XHJcbiAgICBbJ2NhcHR1cmVTdHJlYW0nLCAnbW96Q2FwdHVyZVN0cmVhbScsICd3ZWJraXRDYXB0dXJlU3RyZWFtJ10uZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0gaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykpIHtcclxuICAgICAgICAgICAgaXNDYW52YXNTdXBwb3J0c1N0cmVhbUNhcHR1cmluZyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdmFyIF9pc0Nocm9tZSA9ICghIXdpbmRvdy53ZWJraXRSVENQZWVyQ29ubmVjdGlvbiB8fCAhIXdpbmRvdy53ZWJraXRHZXRVc2VyTWVkaWEpICYmICEhd2luZG93LmNocm9tZTtcclxuXHJcbiAgICB2YXIgY2hyb21lVmVyc2lvbiA9IDUwO1xyXG4gICAgdmFyIG1hdGNoQXJyYXkgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbShlfGl1bSlcXC8oWzAtOV0rKVxcLi8pO1xyXG4gICAgaWYgKF9pc0Nocm9tZSAmJiBtYXRjaEFycmF5ICYmIG1hdGNoQXJyYXlbMl0pIHtcclxuICAgICAgICBjaHJvbWVWZXJzaW9uID0gcGFyc2VJbnQobWF0Y2hBcnJheVsyXSwgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChfaXNDaHJvbWUgJiYgY2hyb21lVmVyc2lvbiA8IDUyKSB7XHJcbiAgICAgICAgaXNDYW52YXNTdXBwb3J0c1N0cmVhbUNhcHR1cmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25maWcudXNlV2hhbW15UmVjb3JkZXIpIHtcclxuICAgICAgICBpc0NhbnZhc1N1cHBvcnRzU3RyZWFtQ2FwdHVyaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGdsb2JhbENhbnZhcywgbWVkaWFTdHJlYW1SZWNvcmRlcjtcclxuXHJcbiAgICBpZiAoaXNDYW52YXNTdXBwb3J0c1N0cmVhbUNhcHR1cmluZykge1xyXG4gICAgICAgIGlmICghY29uZmlnLmRpc2FibGVMb2dzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdZb3VyIGJyb3dzZXIgc3VwcG9ydHMgYm90aCBNZWRpUmVjb3JkZXIgQVBJIGFuZCBjYW52YXMuY2FwdHVyZVN0cmVhbSEnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChodG1sRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGdsb2JhbENhbnZhcyA9IGh0bWxFbGVtZW50O1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaHRtbEVsZW1lbnQgaW5zdGFuY2VvZiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpIHtcclxuICAgICAgICAgICAgZ2xvYmFsQ2FudmFzID0gaHRtbEVsZW1lbnQuY2FudmFzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93ICdQbGVhc2UgcGFzcyBlaXRoZXIgSFRNTENhbnZhc0VsZW1lbnQgb3IgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELic7XHJcbiAgICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICghIW5hdmlnYXRvci5tb3pHZXRVc2VyTWVkaWEpIHtcclxuICAgICAgICBpZiAoIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDYW52YXMgcmVjb3JkaW5nIGlzIE5PVCBzdXBwb3J0ZWQgaW4gRmlyZWZveC4nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGlzUmVjb3JkaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcmVjb3JkcyBDYW52YXMuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgQ2FudmFzUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5yZWNvcmQoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5yZWNvcmQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpc1JlY29yZGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmIChpc0NhbnZhc1N1cHBvcnRzU3RyZWFtQ2FwdHVyaW5nICYmICFjb25maWcudXNlV2hhbW15UmVjb3JkZXIpIHtcclxuICAgICAgICAgICAgLy8gQ2FudmFzQ2FwdHVyZU1lZGlhU3RyZWFtXHJcbiAgICAgICAgICAgIHZhciBjYW52YXNNZWRpYVN0cmVhbTtcclxuICAgICAgICAgICAgaWYgKCdjYXB0dXJlU3RyZWFtJyBpbiBnbG9iYWxDYW52YXMpIHtcclxuICAgICAgICAgICAgICAgIGNhbnZhc01lZGlhU3RyZWFtID0gZ2xvYmFsQ2FudmFzLmNhcHR1cmVTdHJlYW0oMjUpOyAvLyAyNSBGUFNcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgnbW96Q2FwdHVyZVN0cmVhbScgaW4gZ2xvYmFsQ2FudmFzKSB7XHJcbiAgICAgICAgICAgICAgICBjYW52YXNNZWRpYVN0cmVhbSA9IGdsb2JhbENhbnZhcy5tb3pDYXB0dXJlU3RyZWFtKDI1KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgnd2Via2l0Q2FwdHVyZVN0cmVhbScgaW4gZ2xvYmFsQ2FudmFzKSB7XHJcbiAgICAgICAgICAgICAgICBjYW52YXNNZWRpYVN0cmVhbSA9IGdsb2JhbENhbnZhcy53ZWJraXRDYXB0dXJlU3RyZWFtKDI1KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHZhciBtZFN0cmVhbSA9IG5ldyBNZWRpYVN0cmVhbSgpO1xyXG4gICAgICAgICAgICAgICAgbWRTdHJlYW0uYWRkVHJhY2soZ2V0VHJhY2tzKGNhbnZhc01lZGlhU3RyZWFtLCAndmlkZW8nKVswXSk7XHJcbiAgICAgICAgICAgICAgICBjYW52YXNNZWRpYVN0cmVhbSA9IG1kU3RyZWFtO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxyXG5cclxuICAgICAgICAgICAgaWYgKCFjYW52YXNNZWRpYVN0cmVhbSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgJ2NhcHR1cmVTdHJlYW0gQVBJIGFyZSBOT1QgYXZhaWxhYmxlLic7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE5vdGU6IEphbiAxOCwgMjAxNiBzdGF0dXMgaXMgdGhhdCwgXHJcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggTWVkaWFSZWNvcmRlciBBUEkgY2FuJ3QgcmVjb3JkIENhbnZhc0NhcHR1cmVNZWRpYVN0cmVhbSBvYmplY3QuXHJcbiAgICAgICAgICAgIG1lZGlhU3RyZWFtUmVjb3JkZXIgPSBuZXcgTWVkaWFTdHJlYW1SZWNvcmRlcihjYW52YXNNZWRpYVN0cmVhbSwge1xyXG4gICAgICAgICAgICAgICAgbWltZVR5cGU6IGNvbmZpZy5taW1lVHlwZSB8fCAndmlkZW8vd2VibSdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG1lZGlhU3RyZWFtUmVjb3JkZXIucmVjb3JkKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2hhbW15LmZyYW1lcyA9IFtdO1xyXG4gICAgICAgICAgICBsYXN0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBkcmF3Q2FudmFzRnJhbWUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuaW5pdENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5pbml0Q2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ2V0V2ViUEltYWdlcyA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKGh0bWxFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdjYW52YXMnKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmcmFtZXNMZW5ndGggPSB3aGFtbXkuZnJhbWVzLmxlbmd0aDtcclxuICAgICAgICB3aGFtbXkuZnJhbWVzLmZvckVhY2goZnVuY3Rpb24oZnJhbWUsIGlkeCkge1xyXG4gICAgICAgICAgICB2YXIgZnJhbWVzUmVtYWluaW5nID0gZnJhbWVzTGVuZ3RoIC0gaWR4O1xyXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZnJhbWVzUmVtYWluaW5nICsgJy8nICsgZnJhbWVzTGVuZ3RoICsgJyBmcmFtZXMgcmVtYWluaW5nJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb25maWcub25FbmNvZGluZ0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcub25FbmNvZGluZ0NhbGxiYWNrKGZyYW1lc1JlbWFpbmluZywgZnJhbWVzTGVuZ3RoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHdlYnAgPSBmcmFtZS5pbWFnZS50b0RhdGFVUkwoJ2ltYWdlL3dlYnAnLCAxKTtcclxuICAgICAgICAgICAgd2hhbW15LmZyYW1lc1tpZHhdLmltYWdlID0gd2VicDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZUxvZ3MpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0dlbmVyYXRpbmcgV2ViTScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FsbGJhY2soKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBzdG9wcyByZWNvcmRpbmcgQ2FudmFzLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbiwgdGhhdCBpcyB1c2VkIHRvIHBhc3MgcmVjb3JkZWQgYmxvYiBiYWNrIHRvIHRoZSBjYWxsZWUuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgQ2FudmFzUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5zdG9wKGZ1bmN0aW9uKGJsb2IpIHtcclxuICAgICAqICAgICB2aWRlby5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMuc3RvcCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaXNSZWNvcmRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAoaXNDYW52YXNTdXBwb3J0c1N0cmVhbUNhcHR1cmluZyAmJiBtZWRpYVN0cmVhbVJlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIG1lZGlhU3RyZWFtUmVjb3JkZXIuc3RvcChjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0V2ViUEltYWdlcyhmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEBwcm9wZXJ0eSB7QmxvYn0gYmxvYiAtIFJlY29yZGVkIGZyYW1lcyBpbiB2aWRlby93ZWJtIGJsb2IuXHJcbiAgICAgICAgICAgICAqIEBtZW1iZXJvZiBDYW52YXNSZWNvcmRlclxyXG4gICAgICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAgICAgKiByZWNvcmRlci5zdG9wKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgKiAgICAgdmFyIGJsb2IgPSByZWNvcmRlci5ibG9iO1xyXG4gICAgICAgICAgICAgKiB9KTtcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHdoYW1teS5jb21waWxlKGZ1bmN0aW9uKGJsb2IpIHtcclxuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmRpc2FibGVMb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY29yZGluZyBmaW5pc2hlZCEnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGF0LmJsb2IgPSBibG9iO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGF0LmJsb2IuZm9yRWFjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuYmxvYiA9IG5ldyBCbG9iKFtdLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2aWRlby93ZWJtJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRoYXQuYmxvYik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgd2hhbW15LmZyYW1lcyA9IFtdO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgdmFyIGlzUGF1c2VkUmVjb3JkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBwYXVzZXMgdGhlIHJlY29yZGluZyBwcm9jZXNzLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIENhbnZhc1JlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIucGF1c2UoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5wYXVzZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlzUGF1c2VkUmVjb3JkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKG1lZGlhU3RyZWFtUmVjb3JkZXIgaW5zdGFuY2VvZiBNZWRpYVN0cmVhbVJlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIG1lZGlhU3RyZWFtUmVjb3JkZXIucGF1c2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCByZXN1bWVzIHRoZSByZWNvcmRpbmcgcHJvY2Vzcy5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBDYW52YXNSZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnJlc3VtZSgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlzUGF1c2VkUmVjb3JkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChtZWRpYVN0cmVhbVJlY29yZGVyIGluc3RhbmNlb2YgTWVkaWFTdHJlYW1SZWNvcmRlcikge1xyXG4gICAgICAgICAgICBtZWRpYVN0cmVhbVJlY29yZGVyLnJlc3VtZSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWlzUmVjb3JkaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb3JkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlc2V0cyBjdXJyZW50bHkgcmVjb3JkZWQgZGF0YS5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBDYW52YXNSZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLmNsZWFyUmVjb3JkZWREYXRhKCk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMuY2xlYXJSZWNvcmRlZERhdGEgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAoaXNSZWNvcmRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5zdG9wKGNsZWFyUmVjb3JkZWREYXRhQ0IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjbGVhclJlY29yZGVkRGF0YUNCKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyUmVjb3JkZWREYXRhQ0IoKSB7XHJcbiAgICAgICAgd2hhbW15LmZyYW1lcyA9IFtdO1xyXG4gICAgICAgIGlzUmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaXNQYXVzZWRSZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmb3IgZGVidWdnaW5nXHJcbiAgICB0aGlzLm5hbWUgPSAnQ2FudmFzUmVjb3JkZXInO1xyXG4gICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGNsb25lQ2FudmFzKCkge1xyXG4gICAgICAgIC8vY3JlYXRlIGEgbmV3IGNhbnZhc1xyXG4gICAgICAgIHZhciBuZXdDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICB2YXIgY29udGV4dCA9IG5ld0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgICAvL3NldCBkaW1lbnNpb25zXHJcbiAgICAgICAgbmV3Q2FudmFzLndpZHRoID0gaHRtbEVsZW1lbnQud2lkdGg7XHJcbiAgICAgICAgbmV3Q2FudmFzLmhlaWdodCA9IGh0bWxFbGVtZW50LmhlaWdodDtcclxuXHJcbiAgICAgICAgLy9hcHBseSB0aGUgb2xkIGNhbnZhcyB0byB0aGUgbmV3IG9uZVxyXG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGh0bWxFbGVtZW50LCAwLCAwKTtcclxuXHJcbiAgICAgICAgLy9yZXR1cm4gdGhlIG5ldyBjYW52YXNcclxuICAgICAgICByZXR1cm4gbmV3Q2FudmFzO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGRyYXdDYW52YXNGcmFtZSgpIHtcclxuICAgICAgICBpZiAoaXNQYXVzZWRSZWNvcmRpbmcpIHtcclxuICAgICAgICAgICAgbGFzdFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZHJhd0NhbnZhc0ZyYW1lLCA1MDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGh0bWxFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYW52YXMnKSB7XHJcbiAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbGFzdFRpbWU7XHJcbiAgICAgICAgICAgIC8vIHZpYSAjMjA2LCBieSBKYWNrIGkuZS4gQFNleW1vdXJyXHJcbiAgICAgICAgICAgIGxhc3RUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgICAgICAgICB3aGFtbXkuZnJhbWVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgaW1hZ2U6IGNsb25lQ2FudmFzKCksXHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNSZWNvcmRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZHJhd0NhbnZhc0ZyYW1lLCBjb25maWcuZnJhbWVJbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaHRtbDJjYW52YXMoaHRtbEVsZW1lbnQsIHtcclxuICAgICAgICAgICAgZ3JhYk1vdXNlOiB0eXBlb2YgY29uZmlnLnNob3dNb3VzZVBvaW50ZXIgPT09ICd1bmRlZmluZWQnIHx8IGNvbmZpZy5zaG93TW91c2VQb2ludGVyLFxyXG4gICAgICAgICAgICBvbnJlbmRlcmVkOiBmdW5jdGlvbihjYW52YXMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbGFzdFRpbWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWR1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZHJhd0NhbnZhc0ZyYW1lLCBjb25maWcuZnJhbWVJbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gdmlhICMyMDYsIGJ5IEphY2sgaS5lLiBAU2V5bW91cnJcclxuICAgICAgICAgICAgICAgIGxhc3RUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgd2hhbW15LmZyYW1lcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2Uvd2VicCcsIDEpLFxyXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGlzUmVjb3JkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChkcmF3Q2FudmFzRnJhbWUsIGNvbmZpZy5mcmFtZUludGVydmFsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBsYXN0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG5cclxuICAgIHZhciB3aGFtbXkgPSBuZXcgV2hhbW15LlZpZGVvKDEwMCk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgUmVjb3JkUlRDICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgUmVjb3JkUlRDLkNhbnZhc1JlY29yZGVyID0gQ2FudmFzUmVjb3JkZXI7XHJcbn1cblxyXG4vLyBfX19fX19fX19fX19fX19fX1xyXG4vLyBXaGFtbXlSZWNvcmRlci5qc1xyXG5cclxuLyoqXHJcbiAqIFdoYW1teVJlY29yZGVyIGlzIGEgc3RhbmRhbG9uZSBjbGFzcyB1c2VkIGJ5IHtAbGluayBSZWNvcmRSVEN9IHRvIGJyaW5nIHZpZGVvIHJlY29yZGluZyBpbiBDaHJvbWUuIEl0IHJ1bnMgdG9wIG92ZXIge0BsaW5rIFdoYW1teX0uXHJcbiAqIEBzdW1tYXJ5IFZpZGVvIHJlY29yZGluZyBmZWF0dXJlIGluIENocm9tZS5cclxuICogQGxpY2Vuc2Uge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tdWF6LWtoYW4vUmVjb3JkUlRDL2Jsb2IvbWFzdGVyL0xJQ0VOU0V8TUlUfVxyXG4gKiBAYXV0aG9yIHtAbGluayBodHRwczovL011YXpLaGFuLmNvbXxNdWF6IEtoYW59XHJcbiAqIEB0eXBlZGVmIFdoYW1teVJlY29yZGVyXHJcbiAqIEBjbGFzc1xyXG4gKiBAZXhhbXBsZVxyXG4gKiB2YXIgcmVjb3JkZXIgPSBuZXcgV2hhbW15UmVjb3JkZXIobWVkaWFTdHJlYW0pO1xyXG4gKiByZWNvcmRlci5yZWNvcmQoKTtcclxuICogcmVjb3JkZXIuc3RvcChmdW5jdGlvbihibG9iKSB7XHJcbiAqICAgICB2aWRlby5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gKiB9KTtcclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEN8UmVjb3JkUlRDIFNvdXJjZSBDb2RlfVxyXG4gKiBAcGFyYW0ge01lZGlhU3RyZWFtfSBtZWRpYVN0cmVhbSAtIE1lZGlhU3RyZWFtIG9iamVjdCBmZXRjaGVkIHVzaW5nIGdldFVzZXJNZWRpYSBBUEkgb3IgZ2VuZXJhdGVkIHVzaW5nIGNhcHR1cmVTdHJlYW1VbnRpbEVuZGVkIG9yIFdlYkF1ZGlvIEFQSS5cclxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIHtkaXNhYmxlTG9nczogdHJ1ZSwgaW5pdENhbGxiYWNrOiBmdW5jdGlvbiwgdmlkZW86IEhUTUxWaWRlb0VsZW1lbnQsIGV0Yy59XHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gV2hhbW15UmVjb3JkZXIobWVkaWFTdHJlYW0sIGNvbmZpZykge1xyXG5cclxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcclxuXHJcbiAgICBpZiAoIWNvbmZpZy5mcmFtZUludGVydmFsKSB7XHJcbiAgICAgICAgY29uZmlnLmZyYW1lSW50ZXJ2YWwgPSAxMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNvbmZpZy5kaXNhYmxlTG9ncykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdVc2luZyBmcmFtZXMtaW50ZXJ2YWw6JywgY29uZmlnLmZyYW1lSW50ZXJ2YWwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcmVjb3JkcyB2aWRlby5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBXaGFtbXlSZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnJlY29yZCgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnJlY29yZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmICghY29uZmlnLndpZHRoKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy53aWR0aCA9IDMyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY29uZmlnLmhlaWdodCkge1xyXG4gICAgICAgICAgICBjb25maWcuaGVpZ2h0ID0gMjQwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjb25maWcudmlkZW8pIHtcclxuICAgICAgICAgICAgY29uZmlnLnZpZGVvID0ge1xyXG4gICAgICAgICAgICAgICAgd2lkdGg6IGNvbmZpZy53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogY29uZmlnLmhlaWdodFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjb25maWcuY2FudmFzKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5jYW52YXMgPSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogY29uZmlnLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBjb25maWcuaGVpZ2h0XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYW52YXMud2lkdGggPSBjb25maWcuY2FudmFzLndpZHRoIHx8IDMyMDtcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gY29uZmlnLmNhbnZhcy5oZWlnaHQgfHwgMjQwO1xyXG5cclxuICAgICAgICBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gICAgICAgIC8vIHNldHRpbmcgZGVmYXVsdHNcclxuICAgICAgICBpZiAoY29uZmlnLnZpZGVvICYmIGNvbmZpZy52aWRlbyBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgdmlkZW8gPSBjb25maWcudmlkZW8uY2xvbmVOb2RlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZmlnLmluaXRDYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLmluaXRDYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xyXG5cclxuICAgICAgICAgICAgc2V0U3JjT2JqZWN0KG1lZGlhU3RyZWFtLCB2aWRlbyk7XHJcblxyXG4gICAgICAgICAgICB2aWRlby5vbmxvYWRlZG1ldGFkYXRhID0gZnVuY3Rpb24oKSB7IC8vIFwib25sb2FkZWRtZXRhZGF0YVwiIG1heSBOT1Qgd29yayBpbiBGRj9cclxuICAgICAgICAgICAgICAgIGlmIChjb25maWcuaW5pdENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmluaXRDYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdmlkZW8ud2lkdGggPSBjb25maWcudmlkZW8ud2lkdGg7XHJcbiAgICAgICAgICAgIHZpZGVvLmhlaWdodCA9IGNvbmZpZy52aWRlby5oZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2aWRlby5tdXRlZCA9IHRydWU7XHJcbiAgICAgICAgdmlkZW8ucGxheSgpO1xyXG5cclxuICAgICAgICBsYXN0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgIHdoYW1teSA9IG5ldyBXaGFtbXkuVmlkZW8oKTtcclxuXHJcbiAgICAgICAgaWYgKCFjb25maWcuZGlzYWJsZUxvZ3MpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2NhbnZhcyByZXNvbHV0aW9ucycsIGNhbnZhcy53aWR0aCwgJyonLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3ZpZGVvIHdpZHRoL2hlaWdodCcsIHZpZGVvLndpZHRoIHx8IGNhbnZhcy53aWR0aCwgJyonLCB2aWRlby5oZWlnaHQgfHwgY2FudmFzLmhlaWdodCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkcmF3RnJhbWVzKGNvbmZpZy5mcmFtZUludGVydmFsKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEcmF3IGFuZCBwdXNoIGZyYW1lcyB0byBXaGFtbXlcclxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gZnJhbWVJbnRlcnZhbCAtIHNldCBtaW5pbXVtIGludGVydmFsIChpbiBtaWxsaXNlY29uZHMpIGJldHdlZW4gZWFjaCB0aW1lIHdlIHB1c2ggYSBmcmFtZSB0byBXaGFtbXlcclxuICAgICAqL1xyXG4gICAgZnVuY3Rpb24gZHJhd0ZyYW1lcyhmcmFtZUludGVydmFsKSB7XHJcbiAgICAgICAgZnJhbWVJbnRlcnZhbCA9IHR5cGVvZiBmcmFtZUludGVydmFsICE9PSAndW5kZWZpbmVkJyA/IGZyYW1lSW50ZXJ2YWwgOiAxMDtcclxuXHJcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBsYXN0VGltZTtcclxuICAgICAgICBpZiAoIWR1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGRyYXdGcmFtZXMsIGZyYW1lSW50ZXJ2YWwsIGZyYW1lSW50ZXJ2YWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlzUGF1c2VkUmVjb3JkaW5nKSB7XHJcbiAgICAgICAgICAgIGxhc3RUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGRyYXdGcmFtZXMsIDEwMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB2aWEgIzIwNiwgYnkgSmFjayBpLmUuIEBTZXltb3VyclxyXG4gICAgICAgIGxhc3RUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgICAgIGlmICh2aWRlby5wYXVzZWQpIHtcclxuICAgICAgICAgICAgLy8gdmlhOiBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1dlYlJUQy1FeHBlcmltZW50L3B1bGwvMzE2XHJcbiAgICAgICAgICAgIC8vIFR3ZWFrIGZvciBBbmRyb2lkIENocm9tZVxyXG4gICAgICAgICAgICB2aWRlby5wbGF5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgICAgICB3aGFtbXkuZnJhbWVzLnB1c2goe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXHJcbiAgICAgICAgICAgIGltYWdlOiBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS93ZWJwJylcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFpc1N0b3BEcmF3aW5nKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZHJhd0ZyYW1lcywgZnJhbWVJbnRlcnZhbCwgZnJhbWVJbnRlcnZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGFzeW5jTG9vcChvKSB7XHJcbiAgICAgICAgdmFyIGkgPSAtMSxcclxuICAgICAgICAgICAgbGVuZ3RoID0gby5sZW5ndGg7XHJcblxyXG4gICAgICAgIChmdW5jdGlvbiBsb29wKCkge1xyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIGlmIChpID09PSBsZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIG8uY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gXCJzZXRUaW1lb3V0XCIgYWRkZWQgYnkgSmltIE1jTGVvZFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgby5mdW5jdGlvblRvTG9vcChsb29wLCBpKTtcclxuICAgICAgICAgICAgfSwgMSk7XHJcbiAgICAgICAgfSkoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZW1vdmUgYmxhY2sgZnJhbWVzIGZyb20gdGhlIGJlZ2lubmluZyB0byB0aGUgc3BlY2lmaWVkIGZyYW1lXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBfZnJhbWVzIC0gYXJyYXkgb2YgZnJhbWVzIHRvIGJlIGNoZWNrZWRcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBfZnJhbWVzVG9DaGVjayAtIG51bWJlciBvZiBmcmFtZSB1bnRpbCBjaGVjayB3aWxsIGJlIGV4ZWN1dGVkICgtMSAtIHdpbGwgZHJvcCBhbGwgZnJhbWVzIHVudGlsIGZyYW1lIG5vdCBtYXRjaGVkIHdpbGwgYmUgZm91bmQpXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gX3BpeFRvbGVyYW5jZSAtIDAgLSB2ZXJ5IHN0cmljdCAob25seSBibGFjayBwaXhlbCBjb2xvcikgOyAxIC0gYWxsXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gX2ZyYW1lVG9sZXJhbmNlIC0gMCAtIHZlcnkgc3RyaWN0IChvbmx5IGJsYWNrIGZyYW1lIGNvbG9yKSA7IDEgLSBhbGxcclxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gLSBhcnJheSBvZiBmcmFtZXNcclxuICAgICAqL1xyXG4gICAgLy8gcHVsbCMyOTMgYnkgQHZvbG9kYWxleGV5XHJcbiAgICBmdW5jdGlvbiBkcm9wQmxhY2tGcmFtZXMoX2ZyYW1lcywgX2ZyYW1lc1RvQ2hlY2ssIF9waXhUb2xlcmFuY2UsIF9mcmFtZVRvbGVyYW5jZSwgY2FsbGJhY2spIHtcclxuICAgICAgICB2YXIgbG9jYWxDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICBsb2NhbENhbnZhcy53aWR0aCA9IGNhbnZhcy53aWR0aDtcclxuICAgICAgICBsb2NhbENhbnZhcy5oZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xyXG4gICAgICAgIHZhciBjb250ZXh0MmQgPSBsb2NhbENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAgIHZhciByZXN1bHRGcmFtZXMgPSBbXTtcclxuXHJcbiAgICAgICAgdmFyIGNoZWNrVW50aWxOb3RCbGFjayA9IF9mcmFtZXNUb0NoZWNrID09PSAtMTtcclxuICAgICAgICB2YXIgZW5kQ2hlY2tGcmFtZSA9IChfZnJhbWVzVG9DaGVjayAmJiBfZnJhbWVzVG9DaGVjayA+IDAgJiYgX2ZyYW1lc1RvQ2hlY2sgPD0gX2ZyYW1lcy5sZW5ndGgpID9cclxuICAgICAgICAgICAgX2ZyYW1lc1RvQ2hlY2sgOiBfZnJhbWVzLmxlbmd0aDtcclxuICAgICAgICB2YXIgc2FtcGxlQ29sb3IgPSB7XHJcbiAgICAgICAgICAgIHI6IDAsXHJcbiAgICAgICAgICAgIGc6IDAsXHJcbiAgICAgICAgICAgIGI6IDBcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBtYXhDb2xvckRpZmZlcmVuY2UgPSBNYXRoLnNxcnQoXHJcbiAgICAgICAgICAgIE1hdGgucG93KDI1NSwgMikgK1xyXG4gICAgICAgICAgICBNYXRoLnBvdygyNTUsIDIpICtcclxuICAgICAgICAgICAgTWF0aC5wb3coMjU1LCAyKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdmFyIHBpeFRvbGVyYW5jZSA9IF9waXhUb2xlcmFuY2UgJiYgX3BpeFRvbGVyYW5jZSA+PSAwICYmIF9waXhUb2xlcmFuY2UgPD0gMSA/IF9waXhUb2xlcmFuY2UgOiAwO1xyXG4gICAgICAgIHZhciBmcmFtZVRvbGVyYW5jZSA9IF9mcmFtZVRvbGVyYW5jZSAmJiBfZnJhbWVUb2xlcmFuY2UgPj0gMCAmJiBfZnJhbWVUb2xlcmFuY2UgPD0gMSA/IF9mcmFtZVRvbGVyYW5jZSA6IDA7XHJcbiAgICAgICAgdmFyIGRvTm90Q2hlY2tOZXh0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGFzeW5jTG9vcCh7XHJcbiAgICAgICAgICAgIGxlbmd0aDogZW5kQ2hlY2tGcmFtZSxcclxuICAgICAgICAgICAgZnVuY3Rpb25Ub0xvb3A6IGZ1bmN0aW9uKGxvb3AsIGYpIHtcclxuICAgICAgICAgICAgICAgIHZhciBtYXRjaFBpeENvdW50LCBlbmRQaXhDaGVjaywgbWF4UGl4Q291bnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGZpbmlzaEltYWdlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkb05vdENoZWNrTmV4dCAmJiBtYXhQaXhDb3VudCAtIG1hdGNoUGl4Q291bnQgPD0gbWF4UGl4Q291bnQgKiBmcmFtZVRvbGVyYW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygncmVtb3ZlZCBibGFjayBmcmFtZSA6ICcgKyBmICsgJyA7IGZyYW1lIGR1cmF0aW9uICcgKyBfZnJhbWVzW2ZdLmR1cmF0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnZnJhbWUgaXMgcGFzc2VkIDogJyArIGYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tVbnRpbE5vdEJsYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb05vdENoZWNrTmV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RnJhbWVzLnB1c2goX2ZyYW1lc1tmXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFkb05vdENoZWNrTmV4dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0MmQuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW1hZ2VEYXRhID0gY29udGV4dDJkLmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFBpeENvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kUGl4Q2hlY2sgPSBpbWFnZURhdGEuZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFBpeENvdW50ID0gaW1hZ2VEYXRhLmRhdGEubGVuZ3RoIC8gNDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHBpeCA9IDA7IHBpeCA8IGVuZFBpeENoZWNrOyBwaXggKz0gNCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRDb2xvciA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByOiBpbWFnZURhdGEuZGF0YVtwaXhdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGc6IGltYWdlRGF0YS5kYXRhW3BpeCArIDFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IGltYWdlRGF0YS5kYXRhW3BpeCArIDJdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yRGlmZmVyZW5jZSA9IE1hdGguc3FydChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyhjdXJyZW50Q29sb3IuciAtIHNhbXBsZUNvbG9yLnIsIDIpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyhjdXJyZW50Q29sb3IuZyAtIHNhbXBsZUNvbG9yLmcsIDIpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyhjdXJyZW50Q29sb3IuYiAtIHNhbXBsZUNvbG9yLmIsIDIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW5jZSBpbiBjb2xvciBpdCBpcyBkaWZmZXJlbmNlIGluIGNvbG9yIHZlY3RvcnMgKHIxLGcxLGIxKSA8PT4gKHIyLGcyLGIyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yRGlmZmVyZW5jZSA8PSBtYXhDb2xvckRpZmZlcmVuY2UgKiBwaXhUb2xlcmFuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFBpeENvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoSW1hZ2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlLnNyYyA9IF9mcmFtZXNbZl0uaW1hZ2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaEltYWdlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdEZyYW1lcyA9IHJlc3VsdEZyYW1lcy5jb25jYXQoX2ZyYW1lcy5zbGljZShlbmRDaGVja0ZyYW1lKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdEZyYW1lcy5sZW5ndGggPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGF0IGxlYXN0IG9uZSBsYXN0IGZyYW1lIHNob3VsZCBiZSBhdmFpbGFibGUgZm9yIG5leHQgbWFuaXB1bGF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdG90YWwgZHVyYXRpb24gb2YgYWxsIGZyYW1lcyB3aWxsIGJlIDwgMTAwMCB0aGFuIGZmbXBlZyBkb2Vzbid0IHdvcmsgd2VsbC4uLlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdEZyYW1lcy5wdXNoKF9mcmFtZXNbX2ZyYW1lcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXN1bHRGcmFtZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGlzU3RvcERyYXdpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHN0b3BzIHJlY29yZGluZyB2aWRlby5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24sIHRoYXQgaXMgdXNlZCB0byBwYXNzIHJlY29yZGVkIGJsb2IgYmFjayB0byB0aGUgY2FsbGVlLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIFdoYW1teVJlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuc3RvcChmdW5jdGlvbihibG9iKSB7XHJcbiAgICAgKiAgICAgdmlkZW8uc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcclxuXHJcbiAgICAgICAgaXNTdG9wRHJhd2luZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy8gYW5hbHlzZSBvZiBhbGwgZnJhbWVzIHRha2VzIHNvbWUgdGltZSFcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAvLyBlLmcuIGRyb3BCbGFja0ZyYW1lcyhmcmFtZXMsIDEwLCAxLCAxKSAtIHdpbGwgY3V0IGFsbCAxMCBmcmFtZXNcclxuICAgICAgICAgICAgLy8gZS5nLiBkcm9wQmxhY2tGcmFtZXMoZnJhbWVzLCAxMCwgMC41LCAwLjUpIC0gd2lsbCBhbmFseXNlIDEwIGZyYW1lc1xyXG4gICAgICAgICAgICAvLyBlLmcuIGRyb3BCbGFja0ZyYW1lcyhmcmFtZXMsIDEwKSA9PT0gZHJvcEJsYWNrRnJhbWVzKGZyYW1lcywgMTAsIDAsIDApIC0gd2lsbCBhbmFseXNlIDEwIGZyYW1lcyB3aXRoIHN0cmljdCBibGFjayBjb2xvclxyXG4gICAgICAgICAgICBkcm9wQmxhY2tGcmFtZXMod2hhbW15LmZyYW1lcywgLTEsIG51bGwsIG51bGwsIGZ1bmN0aW9uKGZyYW1lcykge1xyXG4gICAgICAgICAgICAgICAgd2hhbW15LmZyYW1lcyA9IGZyYW1lcztcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB0byBkaXNwbGF5IGFkdmVydGlzZW1lbnQgaW1hZ2VzIVxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hZHZlcnRpc2VtZW50ICYmIGNvbmZpZy5hZHZlcnRpc2VtZW50Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdoYW1teS5mcmFtZXMgPSBjb25maWcuYWR2ZXJ0aXNlbWVudC5jb25jYXQod2hhbW15LmZyYW1lcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBAcHJvcGVydHkge0Jsb2J9IGJsb2IgLSBSZWNvcmRlZCBmcmFtZXMgaW4gdmlkZW8vd2VibSBibG9iLlxyXG4gICAgICAgICAgICAgICAgICogQG1lbWJlcm9mIFdoYW1teVJlY29yZGVyXHJcbiAgICAgICAgICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAgICAgICAgICogcmVjb3JkZXIuc3RvcChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAqICAgICB2YXIgYmxvYiA9IHJlY29yZGVyLmJsb2I7XHJcbiAgICAgICAgICAgICAgICAgKiB9KTtcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgd2hhbW15LmNvbXBpbGUoZnVuY3Rpb24oYmxvYikge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmJsb2IgPSBibG9iO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuYmxvYi5mb3JFYWNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmJsb2IgPSBuZXcgQmxvYihbXSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZpZGVvL3dlYm0nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKF90aGlzLmJsb2IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LCAxMCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHZhciBpc1BhdXNlZFJlY29yZGluZyA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcGF1c2VzIHRoZSByZWNvcmRpbmcgcHJvY2Vzcy5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBXaGFtbXlSZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnBhdXNlKCk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMucGF1c2UgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpc1BhdXNlZFJlY29yZGluZyA9IHRydWU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcmVzdW1lcyB0aGUgcmVjb3JkaW5nIHByb2Nlc3MuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgV2hhbW15UmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5yZXN1bWUoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5yZXN1bWUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpc1BhdXNlZFJlY29yZGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoaXNTdG9wRHJhd2luZykge1xyXG4gICAgICAgICAgICB0aGlzLnJlY29yZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCByZXNldHMgY3VycmVudGx5IHJlY29yZGVkIGRhdGEuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgV2hhbW15UmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5jbGVhclJlY29yZGVkRGF0YSgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLmNsZWFyUmVjb3JkZWREYXRhID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKCFpc1N0b3BEcmF3aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcChjbGVhclJlY29yZGVkRGF0YUNCKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2xlYXJSZWNvcmRlZERhdGFDQigpO1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBjbGVhclJlY29yZGVkRGF0YUNCKCkge1xyXG4gICAgICAgIHdoYW1teS5mcmFtZXMgPSBbXTtcclxuICAgICAgICBpc1N0b3BEcmF3aW5nID0gdHJ1ZTtcclxuICAgICAgICBpc1BhdXNlZFJlY29yZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZvciBkZWJ1Z2dpbmdcclxuICAgIHRoaXMubmFtZSA9ICdXaGFtbXlSZWNvcmRlcic7XHJcbiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcclxuICAgIH07XHJcblxyXG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICB2YXIgdmlkZW87XHJcbiAgICB2YXIgbGFzdFRpbWU7XHJcbiAgICB2YXIgd2hhbW15O1xyXG59XHJcblxyXG5pZiAodHlwZW9mIFJlY29yZFJUQyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIFJlY29yZFJUQy5XaGFtbXlSZWNvcmRlciA9IFdoYW1teVJlY29yZGVyO1xyXG59XG5cclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudGltYXR0ZXIxNS93aGFtbXkvYmxvYi9tYXN0ZXIvTElDRU5TRVxyXG4vLyBfX19fX19fX19cclxuLy8gV2hhbW15LmpzXHJcblxyXG4vLyB0b2RvOiBGaXJlZm94IG5vdyBzdXBwb3J0cyB3ZWJwIGZvciB3ZWJtIGNvbnRhaW5lcnMhXHJcbi8vIHRoZWlyIE1lZGlhUmVjb3JkZXIgaW1wbGVtZW50YXRpb24gd29ya3Mgd2VsbCFcclxuLy8gc2hvdWxkIHdlIHByb3ZpZGUgYW4gb3B0aW9uIHRvIHJlY29yZCB2aWEgV2hhbW15LmpzIG9yIE1lZGlhUmVjb3JkZXIgQVBJIGlzIGEgYmV0dGVyIHNvbHV0aW9uP1xyXG5cclxuLyoqXHJcbiAqIFdoYW1teSBpcyBhIHN0YW5kYWxvbmUgY2xhc3MgdXNlZCBieSB7QGxpbmsgUmVjb3JkUlRDfSB0byBicmluZyB2aWRlbyByZWNvcmRpbmcgaW4gQ2hyb21lLiBJdCBpcyB3cml0dGVuIGJ5IHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYW50aW1hdHRlcjE1fGFudGltYXR0ZXIxNX1cclxuICogQHN1bW1hcnkgQSByZWFsIHRpbWUgamF2YXNjcmlwdCB3ZWJtIGVuY29kZXIgYmFzZWQgb24gYSBjYW52YXMgaGFjay5cclxuICogQGxpY2Vuc2Uge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tdWF6LWtoYW4vUmVjb3JkUlRDL2Jsb2IvbWFzdGVyL0xJQ0VOU0V8TUlUfVxyXG4gKiBAYXV0aG9yIHtAbGluayBodHRwczovL011YXpLaGFuLmNvbXxNdWF6IEtoYW59XHJcbiAqIEB0eXBlZGVmIFdoYW1teVxyXG4gKiBAY2xhc3NcclxuICogQGV4YW1wbGVcclxuICogdmFyIHJlY29yZGVyID0gbmV3IFdoYW1teSgpLlZpZGVvKDE1KTtcclxuICogcmVjb3JkZXIuYWRkKGNvbnRleHQgfHwgY2FudmFzIHx8IGRhdGFVUkwpO1xyXG4gKiB2YXIgb3V0cHV0ID0gcmVjb3JkZXIuY29tcGlsZSgpO1xyXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQ3xSZWNvcmRSVEMgU291cmNlIENvZGV9XHJcbiAqL1xyXG5cclxudmFyIFdoYW1teSA9IChmdW5jdGlvbigpIHtcclxuICAgIC8vIGEgbW9yZSBhYnN0cmFjdC1pc2ggQVBJXHJcblxyXG4gICAgZnVuY3Rpb24gV2hhbW15VmlkZW8oZHVyYXRpb24pIHtcclxuICAgICAgICB0aGlzLmZyYW1lcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbiB8fCAxO1xyXG4gICAgICAgIHRoaXMucXVhbGl0eSA9IDAuODtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhc3MgQ2FudmFzIG9yIENvbnRleHQgb3IgaW1hZ2Uvd2VicChzdHJpbmcpIHRvIHtAbGluayBXaGFtbXl9IGVuY29kZXIuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgV2hhbW15XHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIgPSBuZXcgV2hhbW15KCkuVmlkZW8oMC44LCAxMDApO1xyXG4gICAgICogcmVjb3JkZXIuYWRkKGNhbnZhcyB8fCBjb250ZXh0IHx8ICdpbWFnZS93ZWJwJyk7XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJhbWUgLSBDYW52YXMgfHwgQ29udGV4dCB8fCBpbWFnZS93ZWJwXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gLSBTdGljayBhIGR1cmF0aW9uIChpbiBtaWxsaXNlY29uZHMpXHJcbiAgICAgKi9cclxuICAgIFdoYW1teVZpZGVvLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihmcmFtZSwgZHVyYXRpb24pIHtcclxuICAgICAgICBpZiAoJ2NhbnZhcycgaW4gZnJhbWUpIHsgLy9DYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcclxuICAgICAgICAgICAgZnJhbWUgPSBmcmFtZS5jYW52YXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoJ3RvRGF0YVVSTCcgaW4gZnJhbWUpIHtcclxuICAgICAgICAgICAgZnJhbWUgPSBmcmFtZS50b0RhdGFVUkwoJ2ltYWdlL3dlYnAnLCB0aGlzLnF1YWxpdHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCEoL15kYXRhOmltYWdlXFwvd2VicDtiYXNlNjQsL2lnKS50ZXN0KGZyYW1lKSkge1xyXG4gICAgICAgICAgICB0aHJvdyAnSW5wdXQgbXVzdCBiZSBmb3JtYXR0ZWQgcHJvcGVybHkgYXMgYSBiYXNlNjQgZW5jb2RlZCBEYXRhVVJJIG9mIHR5cGUgaW1hZ2Uvd2VicCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZnJhbWVzLnB1c2goe1xyXG4gICAgICAgICAgICBpbWFnZTogZnJhbWUsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbiB8fCB0aGlzLmR1cmF0aW9uXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIHByb2Nlc3NJbldlYldvcmtlcihfZnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgYmxvYiA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW19mdW5jdGlvbi50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAndGhpcy5vbm1lc3NhZ2UgPSAgZnVuY3Rpb24gKGVlZSkgeycgKyBfZnVuY3Rpb24ubmFtZSArICcoZWVlLmRhdGEpO30nXHJcbiAgICAgICAgXSwge1xyXG4gICAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCdcclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKGJsb2IpO1xyXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgcmV0dXJuIHdvcmtlcjtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB3aGFtbXlJbldlYldvcmtlcihmcmFtZXMpIHtcclxuICAgICAgICBmdW5jdGlvbiBBcnJheVRvV2ViTShmcmFtZXMpIHtcclxuICAgICAgICAgICAgdmFyIGluZm8gPSBjaGVja0ZyYW1lcyhmcmFtZXMpO1xyXG4gICAgICAgICAgICBpZiAoIWluZm8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGNsdXN0ZXJNYXhEdXJhdGlvbiA9IDMwMDAwO1xyXG5cclxuICAgICAgICAgICAgdmFyIEVCTUwgPSBbe1xyXG4gICAgICAgICAgICAgICAgJ2lkJzogMHgxYTQ1ZGZhMywgLy8gRUJNTFxyXG4gICAgICAgICAgICAgICAgJ2RhdGEnOiBbe1xyXG4gICAgICAgICAgICAgICAgICAgICdkYXRhJzogMSxcclxuICAgICAgICAgICAgICAgICAgICAnaWQnOiAweDQyODYgLy8gRUJNTFZlcnNpb25cclxuICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAnZGF0YSc6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHg0MmY3IC8vIEVCTUxSZWFkVmVyc2lvblxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICdkYXRhJzogNCxcclxuICAgICAgICAgICAgICAgICAgICAnaWQnOiAweDQyZjIgLy8gRUJNTE1heElETGVuZ3RoXHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiA4LFxyXG4gICAgICAgICAgICAgICAgICAgICdpZCc6IDB4NDJmMyAvLyBFQk1MTWF4U2l6ZUxlbmd0aFxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICdkYXRhJzogJ3dlYm0nLFxyXG4gICAgICAgICAgICAgICAgICAgICdpZCc6IDB4NDI4MiAvLyBEb2NUeXBlXHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgICdpZCc6IDB4NDI4NyAvLyBEb2NUeXBlVmVyc2lvblxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICdkYXRhJzogMixcclxuICAgICAgICAgICAgICAgICAgICAnaWQnOiAweDQyODUgLy8gRG9jVHlwZVJlYWRWZXJzaW9uXHJcbiAgICAgICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAnaWQnOiAweDE4NTM4MDY3LCAvLyBTZWdtZW50XHJcbiAgICAgICAgICAgICAgICAnZGF0YSc6IFt7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHgxNTQ5YTk2NiwgLy8gSW5mb1xyXG4gICAgICAgICAgICAgICAgICAgICdkYXRhJzogW3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiAxZTYsIC8vZG8gdGhpbmdzIGluIG1pbGxpc2VjcyAobnVtIG9mIG5hbm9zZWNzIGZvciBkdXJhdGlvbiBzY2FsZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHgyYWQ3YjEgLy8gVGltZWNvZGVTY2FsZVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiAnd2hhbW15JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHg0ZDgwIC8vIE11eGluZ0FwcFxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiAnd2hhbW15JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHg1NzQxIC8vIFdyaXRpbmdBcHBcclxuICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJzogZG91YmxlVG9TdHJpbmcoaW5mby5kdXJhdGlvbiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IDB4NDQ4OSAvLyBEdXJhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHgxNjU0YWU2YiwgLy8gVHJhY2tzXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiBbe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAweGFlLCAvLyBUcmFja0VudHJ5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJzogW3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJzogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IDB4ZDcgLy8gVHJhY2tOdW1iZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHg3M2M1IC8vIFRyYWNrVUlEXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJzogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IDB4OWMgLy8gRmxhZ0xhY2luZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGF0YSc6ICd1bmQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHgyMmI1OWMgLy8gTGFuZ3VhZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiAnVl9WUDgnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHg4NiAvLyBDb2RlY0lEXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJzogJ1ZQOCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAweDI1ODY4OCAvLyBDb2RlY05hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHg4MyAvLyBUcmFja1R5cGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHhlMCwgLy8gVmlkZW9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJzogW3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGF0YSc6IGluZm8ud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHhiMCAvLyBQaXhlbFdpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiBpbmZvLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAweGJhIC8vIFBpeGVsSGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICAgICAgICAgIH1dXHJcbiAgICAgICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICB9XTtcclxuXHJcbiAgICAgICAgICAgIC8vR2VuZXJhdGUgY2x1c3RlcnMgKG1heCBkdXJhdGlvbilcclxuICAgICAgICAgICAgdmFyIGZyYW1lTnVtYmVyID0gMDtcclxuICAgICAgICAgICAgdmFyIGNsdXN0ZXJUaW1lY29kZSA9IDA7XHJcbiAgICAgICAgICAgIHdoaWxlIChmcmFtZU51bWJlciA8IGZyYW1lcy5sZW5ndGgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgY2x1c3RlckZyYW1lcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNsdXN0ZXJEdXJhdGlvbiA9IDA7XHJcbiAgICAgICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2x1c3RlckZyYW1lcy5wdXNoKGZyYW1lc1tmcmFtZU51bWJlcl0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJEdXJhdGlvbiArPSBmcmFtZXNbZnJhbWVOdW1iZXJdLmR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKys7XHJcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChmcmFtZU51bWJlciA8IGZyYW1lcy5sZW5ndGggJiYgY2x1c3RlckR1cmF0aW9uIDwgY2x1c3Rlck1heER1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgY2x1c3RlckNvdW50ZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNsdXN0ZXIgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2lkJzogMHgxZjQzYjY3NSwgLy8gQ2x1c3RlclxyXG4gICAgICAgICAgICAgICAgICAgICdkYXRhJzogZ2V0Q2x1c3RlckRhdGEoY2x1c3RlclRpbWVjb2RlLCBjbHVzdGVyQ291bnRlciwgY2x1c3RlckZyYW1lcylcclxuICAgICAgICAgICAgICAgIH07IC8vQWRkIGNsdXN0ZXIgdG8gc2VnbWVudFxyXG4gICAgICAgICAgICAgICAgRUJNTFsxXS5kYXRhLnB1c2goY2x1c3Rlcik7XHJcbiAgICAgICAgICAgICAgICBjbHVzdGVyVGltZWNvZGUgKz0gY2x1c3RlckR1cmF0aW9uO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVFQk1MKEVCTUwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZ2V0Q2x1c3RlckRhdGEoY2x1c3RlclRpbWVjb2RlLCBjbHVzdGVyQ291bnRlciwgY2x1c3RlckZyYW1lcykge1xyXG4gICAgICAgICAgICByZXR1cm4gW3tcclxuICAgICAgICAgICAgICAgICdkYXRhJzogY2x1c3RlclRpbWVjb2RlLFxyXG4gICAgICAgICAgICAgICAgJ2lkJzogMHhlNyAvLyBUaW1lY29kZVxyXG4gICAgICAgICAgICB9XS5jb25jYXQoY2x1c3RlckZyYW1lcy5tYXAoZnVuY3Rpb24od2VicCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJsb2NrID0gbWFrZVNpbXBsZUJsb2NrKHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNjYXJkYWJsZTogMCxcclxuICAgICAgICAgICAgICAgICAgICBmcmFtZTogd2VicC5kYXRhLnNsaWNlKDQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGludmlzaWJsZTogMCxcclxuICAgICAgICAgICAgICAgICAgICBrZXlmcmFtZTogMSxcclxuICAgICAgICAgICAgICAgICAgICBsYWNpbmc6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tOdW06IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZWNvZGU6IE1hdGgucm91bmQoY2x1c3RlckNvdW50ZXIpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNsdXN0ZXJDb3VudGVyICs9IHdlYnAuZHVyYXRpb247XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkOiAweGEzXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzdW1zIHRoZSBsZW5ndGhzIG9mIGFsbCB0aGUgZnJhbWVzIGFuZCBnZXRzIHRoZSBkdXJhdGlvblxyXG5cclxuICAgICAgICBmdW5jdGlvbiBjaGVja0ZyYW1lcyhmcmFtZXMpIHtcclxuICAgICAgICAgICAgaWYgKCFmcmFtZXNbMF0pIHtcclxuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBNYXliZSBXZWJQIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IGJyb3dzZXIuJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IGZyYW1lc1swXS53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IGZyYW1lc1swXS5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGZyYW1lc1swXS5kdXJhdGlvbjtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgZnJhbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiArPSBmcmFtZXNbaV0uZHVyYXRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBudW1Ub0J1ZmZlcihudW0pIHtcclxuICAgICAgICAgICAgdmFyIHBhcnRzID0gW107XHJcbiAgICAgICAgICAgIHdoaWxlIChudW0gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKG51bSAmIDB4ZmYpO1xyXG4gICAgICAgICAgICAgICAgbnVtID0gbnVtID4+IDg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHBhcnRzLnJldmVyc2UoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBzdHJUb0J1ZmZlcihzdHIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHN0ci5zcGxpdCgnJykubWFwKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlLmNoYXJDb2RlQXQoMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGJpdHNUb0J1ZmZlcihiaXRzKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gW107XHJcbiAgICAgICAgICAgIHZhciBwYWQgPSAoYml0cy5sZW5ndGggJSA4KSA/IChuZXcgQXJyYXkoMSArIDggLSAoYml0cy5sZW5ndGggJSA4KSkpLmpvaW4oJzAnKSA6ICcnO1xyXG4gICAgICAgICAgICBiaXRzID0gcGFkICsgYml0cztcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaXRzLmxlbmd0aDsgaSArPSA4KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2gocGFyc2VJbnQoYml0cy5zdWJzdHIoaSwgOCksIDIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZUVCTUwoanNvbikge1xyXG4gICAgICAgICAgICB2YXIgZWJtbCA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRhID0ganNvbltpXS5kYXRhO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gZ2VuZXJhdGVFQk1MKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYml0c1RvQnVmZmVyKGRhdGEudG9TdHJpbmcoMikpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3RyVG9CdWZmZXIoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IGRhdGEuc2l6ZSB8fCBkYXRhLmJ5dGVMZW5ndGggfHwgZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB2YXIgemVyb2VzID0gTWF0aC5jZWlsKE1hdGguY2VpbChNYXRoLmxvZyhsZW4pIC8gTWF0aC5sb2coMikpIC8gOCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZVRvU3RyaW5nID0gbGVuLnRvU3RyaW5nKDIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHBhZGRlZCA9IChuZXcgQXJyYXkoKHplcm9lcyAqIDcgKyA3ICsgMSkgLSBzaXplVG9TdHJpbmcubGVuZ3RoKSkuam9pbignMCcpICsgc2l6ZVRvU3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSAobmV3IEFycmF5KHplcm9lcykpLmpvaW4oJzAnKSArICcxJyArIHBhZGRlZDtcclxuXHJcbiAgICAgICAgICAgICAgICBlYm1sLnB1c2gobnVtVG9CdWZmZXIoanNvbltpXS5pZCkpO1xyXG4gICAgICAgICAgICAgICAgZWJtbC5wdXNoKGJpdHNUb0J1ZmZlcihzaXplKSk7XHJcbiAgICAgICAgICAgICAgICBlYm1sLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYihlYm1sLCB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAndmlkZW8vd2VibSdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiB0b0JpblN0ck9sZChiaXRzKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gJyc7XHJcbiAgICAgICAgICAgIHZhciBwYWQgPSAoYml0cy5sZW5ndGggJSA4KSA/IChuZXcgQXJyYXkoMSArIDggLSAoYml0cy5sZW5ndGggJSA4KSkpLmpvaW4oJzAnKSA6ICcnO1xyXG4gICAgICAgICAgICBiaXRzID0gcGFkICsgYml0cztcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaXRzLmxlbmd0aDsgaSArPSA4KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoYml0cy5zdWJzdHIoaSwgOCksIDIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIG1ha2VTaW1wbGVCbG9jayhkYXRhKSB7XHJcbiAgICAgICAgICAgIHZhciBmbGFncyA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YS5rZXlmcmFtZSkge1xyXG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMTI4O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YS5pbnZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIGZsYWdzIHw9IDg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhLmxhY2luZykge1xyXG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gKGRhdGEubGFjaW5nIDw8IDEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YS5kaXNjYXJkYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGEudHJhY2tOdW0gPiAxMjcpIHtcclxuICAgICAgICAgICAgICAgIHRocm93ICdUcmFja051bWJlciA+IDEyNyBub3Qgc3VwcG9ydGVkJztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIG91dCA9IFtkYXRhLnRyYWNrTnVtIHwgMHg4MCwgZGF0YS50aW1lY29kZSA+PiA4LCBkYXRhLnRpbWVjb2RlICYgMHhmZiwgZmxhZ3NdLm1hcChmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlKTtcclxuICAgICAgICAgICAgfSkuam9pbignJykgKyBkYXRhLmZyYW1lO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG91dDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHBhcnNlV2ViUChyaWZmKSB7XHJcbiAgICAgICAgICAgIHZhciBWUDggPSByaWZmLlJJRkZbMF0uV0VCUFswXTtcclxuXHJcbiAgICAgICAgICAgIHZhciBmcmFtZVN0YXJ0ID0gVlA4LmluZGV4T2YoJ1xceDlkXFx4MDFcXHgyYScpOyAvLyBBIFZQOCBrZXlmcmFtZSBzdGFydHMgd2l0aCB0aGUgMHg5ZDAxMmEgaGVhZGVyXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBjID0gW107IGkgPCA0OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNbaV0gPSBWUDguY2hhckNvZGVBdChmcmFtZVN0YXJ0ICsgMyArIGkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgd2lkdGgsIGhlaWdodCwgdG1wO1xyXG5cclxuICAgICAgICAgICAgLy90aGUgY29kZSBiZWxvdyBpcyBsaXRlcmFsbHkgY29waWVkIHZlcmJhdGltIGZyb20gdGhlIGJpdHN0cmVhbSBzcGVjXHJcbiAgICAgICAgICAgIHRtcCA9IChjWzFdIDw8IDgpIHwgY1swXTtcclxuICAgICAgICAgICAgd2lkdGggPSB0bXAgJiAweDNGRkY7XHJcbiAgICAgICAgICAgIHRtcCA9IChjWzNdIDw8IDgpIHwgY1syXTtcclxuICAgICAgICAgICAgaGVpZ2h0ID0gdG1wICYgMHgzRkZGO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBWUDgsXHJcbiAgICAgICAgICAgICAgICByaWZmOiByaWZmXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBnZXRTdHJMZW5ndGgoc3RyaW5nLCBvZmZzZXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHN0cmluZy5zdWJzdHIob2Zmc2V0ICsgNCwgNCkuc3BsaXQoJycpLm1hcChmdW5jdGlvbihpKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdW5wYWRkZWQgPSBpLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBcnJheSg4IC0gdW5wYWRkZWQubGVuZ3RoICsgMSkpLmpvaW4oJzAnKSArIHVucGFkZGVkO1xyXG4gICAgICAgICAgICB9KS5qb2luKCcnKSwgMik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBwYXJzZVJJRkYoc3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICB2YXIgY2h1bmtzID0ge307XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAob2Zmc2V0IDwgc3RyaW5nLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGlkID0gc3RyaW5nLnN1YnN0cihvZmZzZXQsIDQpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IGdldFN0ckxlbmd0aChzdHJpbmcsIG9mZnNldCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHN0cmluZy5zdWJzdHIob2Zmc2V0ICsgNCArIDQsIGxlbik7XHJcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNCArIDQgKyBsZW47XHJcbiAgICAgICAgICAgICAgICBjaHVua3NbaWRdID0gY2h1bmtzW2lkXSB8fCBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaWQgPT09ICdSSUZGJyB8fCBpZCA9PT0gJ0xJU1QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzW2lkXS5wdXNoKHBhcnNlUklGRihkYXRhKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNodW5rc1tpZF0ucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY2h1bmtzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZnVuY3Rpb24gZG91YmxlVG9TdHJpbmcobnVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXS5zbGljZS5jYWxsKFxyXG4gICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoKG5ldyBGbG9hdDY0QXJyYXkoW251bV0pKS5idWZmZXIpLCAwKS5tYXAoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZSk7XHJcbiAgICAgICAgICAgIH0pLnJldmVyc2UoKS5qb2luKCcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB3ZWJtID0gbmV3IEFycmF5VG9XZWJNKGZyYW1lcy5tYXAoZnVuY3Rpb24oZnJhbWUpIHtcclxuICAgICAgICAgICAgdmFyIHdlYnAgPSBwYXJzZVdlYlAocGFyc2VSSUZGKGF0b2IoZnJhbWUuaW1hZ2Uuc2xpY2UoMjMpKSkpO1xyXG4gICAgICAgICAgICB3ZWJwLmR1cmF0aW9uID0gZnJhbWUuZHVyYXRpb247XHJcbiAgICAgICAgICAgIHJldHVybiB3ZWJwO1xyXG4gICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgcG9zdE1lc3NhZ2Uod2VibSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmNvZGVzIGZyYW1lcyBpbiBXZWJNIGNvbnRhaW5lci4gSXQgdXNlcyBXZWJXb3JraW52b2tlIHRvIGludm9rZSAnQXJyYXlUb1dlYk0nIG1ldGhvZC5cclxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24sIHRoYXQgaXMgdXNlZCB0byBwYXNzIHJlY29yZGVkIGJsb2IgYmFjayB0byB0aGUgY2FsbGVlLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIFdoYW1teVxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyID0gbmV3IFdoYW1teSgpLlZpZGVvKDAuOCwgMTAwKTtcclxuICAgICAqIHJlY29yZGVyLmNvbXBpbGUoZnVuY3Rpb24oYmxvYikge1xyXG4gICAgICogICAgLy8gYmxvYi5zaXplIC0gYmxvYi50eXBlXHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgV2hhbW15VmlkZW8ucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgICAgIHZhciB3ZWJXb3JrZXIgPSBwcm9jZXNzSW5XZWJXb3JrZXIod2hhbW15SW5XZWJXb3JrZXIpO1xyXG5cclxuICAgICAgICB3ZWJXb3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXZlbnQuZGF0YS5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgd2ViV29ya2VyLnBvc3RNZXNzYWdlKHRoaXMuZnJhbWVzKTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIG1vcmUgYWJzdHJhY3QtaXNoIEFQSS5cclxuICAgICAgICAgKiBAbWV0aG9kXHJcbiAgICAgICAgICogQG1lbWJlcm9mIFdoYW1teVxyXG4gICAgICAgICAqIEBleGFtcGxlXHJcbiAgICAgICAgICogcmVjb3JkZXIgPSBuZXcgV2hhbW15KCkuVmlkZW8oMC44LCAxMDApO1xyXG4gICAgICAgICAqIEBwYXJhbSB7P251bWJlcn0gc3BlZWQgLSAwLjhcclxuICAgICAgICAgKiBAcGFyYW0gez9udW1iZXJ9IHF1YWxpdHkgLSAxMDBcclxuICAgICAgICAgKi9cclxuICAgICAgICBWaWRlbzogV2hhbW15VmlkZW9cclxuICAgIH07XHJcbn0pKCk7XHJcblxyXG5pZiAodHlwZW9mIFJlY29yZFJUQyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIFJlY29yZFJUQy5XaGFtbXkgPSBXaGFtbXk7XHJcbn1cblxyXG4vLyBfX19fX19fX19fX19fXyAoaW5kZXhlZC1kYilcclxuLy8gRGlza1N0b3JhZ2UuanNcclxuXHJcbi8qKlxyXG4gKiBEaXNrU3RvcmFnZSBpcyBhIHN0YW5kYWxvbmUgb2JqZWN0IHVzZWQgYnkge0BsaW5rIFJlY29yZFJUQ30gdG8gc3RvcmUgcmVjb3JkZWQgYmxvYnMgaW4gSW5kZXhlZERCIHN0b3JhZ2UuXHJcbiAqIEBzdW1tYXJ5IFdyaXRpbmcgYmxvYnMgaW50byBJbmRleGVkREIuXHJcbiAqIEBsaWNlbnNlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQy9ibG9iL21hc3Rlci9MSUNFTlNFfE1JVH1cclxuICogQGF1dGhvciB7QGxpbmsgaHR0cHM6Ly9NdWF6S2hhbi5jb218TXVheiBLaGFufVxyXG4gKiBAZXhhbXBsZVxyXG4gKiBEaXNrU3RvcmFnZS5TdG9yZSh7XHJcbiAqICAgICBhdWRpb0Jsb2I6IHlvdXJBdWRpb0Jsb2IsXHJcbiAqICAgICB2aWRlb0Jsb2I6IHlvdXJWaWRlb0Jsb2IsXHJcbiAqICAgICBnaWZCbG9iICA6IHlvdXJHaWZCbG9iXHJcbiAqIH0pO1xyXG4gKiBEaXNrU3RvcmFnZS5GZXRjaChmdW5jdGlvbihkYXRhVVJMLCB0eXBlKSB7XHJcbiAqICAgICBpZih0eXBlID09PSAnYXVkaW9CbG9iJykgeyB9XHJcbiAqICAgICBpZih0eXBlID09PSAndmlkZW9CbG9iJykgeyB9XHJcbiAqICAgICBpZih0eXBlID09PSAnZ2lmQmxvYicpICAgeyB9XHJcbiAqIH0pO1xyXG4gKiAvLyBEaXNrU3RvcmFnZS5kYXRhU3RvcmVOYW1lID0gJ3JlY29yZFJUQyc7XHJcbiAqIC8vIERpc2tTdG9yYWdlLm9uRXJyb3IgPSBmdW5jdGlvbihlcnJvcikgeyB9O1xyXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBpbml0IC0gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25jZSB0byBpbml0aWFsaXplIEluZGV4ZWREQiBPYmplY3RTdG9yZS4gVGhvdWdoLCBpdCBpcyBhdXRvLXVzZWQgaW50ZXJuYWxseS5cclxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gRmV0Y2ggLSBUaGlzIG1ldGhvZCBmZXRjaGVzIHN0b3JlZCBibG9icyBmcm9tIEluZGV4ZWREQi5cclxuICogQHByb3BlcnR5IHtmdW5jdGlvbn0gU3RvcmUgLSBUaGlzIG1ldGhvZCBzdG9yZXMgYmxvYnMgaW4gSW5kZXhlZERCLlxyXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBvbkVycm9yIC0gVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZvciBhbnkga25vd24vdW5rbm93biBlcnJvci5cclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFTdG9yZU5hbWUgLSBOYW1lIG9mIHRoZSBPYmplY3RTdG9yZSBjcmVhdGVkIGluIEluZGV4ZWREQiBzdG9yYWdlLlxyXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQ3xSZWNvcmRSVEMgU291cmNlIENvZGV9XHJcbiAqL1xyXG5cclxuXHJcbnZhciBEaXNrU3RvcmFnZSA9IHtcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25jZSB0byBpbml0aWFsaXplIEluZGV4ZWREQiBPYmplY3RTdG9yZS4gVGhvdWdoLCBpdCBpcyBhdXRvLXVzZWQgaW50ZXJuYWxseS5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBEaXNrU3RvcmFnZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogRGlza1N0b3JhZ2UuaW5pdCgpO1xyXG4gICAgICovXHJcbiAgICBpbml0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgaW5kZXhlZERCID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgaW5kZXhlZERCLm9wZW4gPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0luZGV4ZWREQiBBUEkgYXJlIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBicm93c2VyLicpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZGJWZXJzaW9uID0gMTtcclxuICAgICAgICB2YXIgZGJOYW1lID0gdGhpcy5kYk5hbWUgfHwgbG9jYXRpb24uaHJlZi5yZXBsYWNlKC9cXC98OnwjfCV8XFwufFxcW3xcXF0vZywgJycpLFxyXG4gICAgICAgICAgICBkYjtcclxuICAgICAgICB2YXIgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKGRiTmFtZSwgZGJWZXJzaW9uKTtcclxuXHJcbiAgICAgICAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0U3RvcmUoZGF0YUJhc2UpIHtcclxuICAgICAgICAgICAgZGF0YUJhc2UuY3JlYXRlT2JqZWN0U3RvcmUoc2VsZi5kYXRhU3RvcmVOYW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHB1dEluREIoKSB7XHJcbiAgICAgICAgICAgIHZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKFtzZWxmLmRhdGFTdG9yZU5hbWVdLCAncmVhZHdyaXRlJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZi52aWRlb0Jsb2IpIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHNlbGYuZGF0YVN0b3JlTmFtZSkucHV0KHNlbGYudmlkZW9CbG9iLCAndmlkZW9CbG9iJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxmLmdpZkJsb2IpIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHNlbGYuZGF0YVN0b3JlTmFtZSkucHV0KHNlbGYuZ2lmQmxvYiwgJ2dpZkJsb2InKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGYuYXVkaW9CbG9iKSB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzZWxmLmRhdGFTdG9yZU5hbWUpLnB1dChzZWxmLmF1ZGlvQmxvYiwgJ2F1ZGlvQmxvYicpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRGcm9tU3RvcmUocG9ydGlvbk5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHNlbGYuZGF0YVN0b3JlTmFtZSkuZ2V0KHBvcnRpb25OYW1lKS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2soZXZlbnQudGFyZ2V0LnJlc3VsdCwgcG9ydGlvbk5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdldEZyb21TdG9yZSgnYXVkaW9CbG9iJyk7XHJcbiAgICAgICAgICAgIGdldEZyb21TdG9yZSgndmlkZW9CbG9iJyk7XHJcbiAgICAgICAgICAgIGdldEZyb21TdG9yZSgnZ2lmQmxvYicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gc2VsZi5vbkVycm9yO1xyXG5cclxuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBkYiA9IHJlcXVlc3QucmVzdWx0O1xyXG4gICAgICAgICAgICBkYi5vbmVycm9yID0gc2VsZi5vbkVycm9yO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRiLnNldFZlcnNpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYi52ZXJzaW9uICE9PSBkYlZlcnNpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2V0VmVyc2lvbiA9IGRiLnNldFZlcnNpb24oZGJWZXJzaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRWZXJzaW9uLm9uc3VjY2VzcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVPYmplY3RTdG9yZShkYik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dEluREIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwdXRJbkRCKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwdXRJbkRCKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgY3JlYXRlT2JqZWN0U3RvcmUoZXZlbnQudGFyZ2V0LnJlc3VsdCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgc3RvcmVkIGJsb2JzIGZyb20gSW5kZXhlZERCLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIERpc2tTdG9yYWdlXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBEaXNrU3RvcmFnZS5GZXRjaChmdW5jdGlvbihkYXRhVVJMLCB0eXBlKSB7XHJcbiAgICAgKiAgICAgaWYodHlwZSA9PT0gJ2F1ZGlvQmxvYicpIHsgfVxyXG4gICAgICogICAgIGlmKHR5cGUgPT09ICd2aWRlb0Jsb2InKSB7IH1cclxuICAgICAqICAgICBpZih0eXBlID09PSAnZ2lmQmxvYicpICAgeyB9XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgRmV0Y2g6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuaW5pdCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHN0b3JlcyBibG9icyBpbiBJbmRleGVkREIuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgRGlza1N0b3JhZ2VcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIERpc2tTdG9yYWdlLlN0b3JlKHtcclxuICAgICAqICAgICBhdWRpb0Jsb2I6IHlvdXJBdWRpb0Jsb2IsXHJcbiAgICAgKiAgICAgdmlkZW9CbG9iOiB5b3VyVmlkZW9CbG9iLFxyXG4gICAgICogICAgIGdpZkJsb2IgIDogeW91ckdpZkJsb2JcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBTdG9yZTogZnVuY3Rpb24oY29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5hdWRpb0Jsb2IgPSBjb25maWcuYXVkaW9CbG9iO1xyXG4gICAgICAgIHRoaXMudmlkZW9CbG9iID0gY29uZmlnLnZpZGVvQmxvYjtcclxuICAgICAgICB0aGlzLmdpZkJsb2IgPSBjb25maWcuZ2lmQmxvYjtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZvciBhbnkga25vd24vdW5rbm93biBlcnJvci5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBEaXNrU3RvcmFnZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogRGlza1N0b3JhZ2Uub25FcnJvciA9IGZ1bmN0aW9uKGVycm9yKXtcclxuICAgICAqICAgICBhbGVyb3QoIEpTT04uc3RyaW5naWZ5KGVycm9yKSApO1xyXG4gICAgICogfTtcclxuICAgICAqL1xyXG4gICAgb25FcnJvcjogZnVuY3Rpb24oZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KGVycm9yLCBudWxsLCAnXFx0JykpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhU3RvcmVOYW1lIC0gTmFtZSBvZiB0aGUgT2JqZWN0U3RvcmUgY3JlYXRlZCBpbiBJbmRleGVkREIgc3RvcmFnZS5cclxuICAgICAqIEBtZW1iZXJvZiBEaXNrU3RvcmFnZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogRGlza1N0b3JhZ2UuZGF0YVN0b3JlTmFtZSA9ICdyZWNvcmRSVEMnO1xyXG4gICAgICovXHJcbiAgICBkYXRhU3RvcmVOYW1lOiAncmVjb3JkUlRDJyxcclxuICAgIGRiTmFtZTogbnVsbFxyXG59O1xyXG5cclxuaWYgKHR5cGVvZiBSZWNvcmRSVEMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICBSZWNvcmRSVEMuRGlza1N0b3JhZ2UgPSBEaXNrU3RvcmFnZTtcclxufVxuXHJcbi8vIF9fX19fX19fX19fX19fXHJcbi8vIEdpZlJlY29yZGVyLmpzXHJcblxyXG4vKipcclxuICogR2lmUmVjb3JkZXIgaXMgc3RhbmRhbG9uZSBjYWxzcyB1c2VkIGJ5IHtAbGluayBSZWNvcmRSVEN9IHRvIHJlY29yZCB2aWRlbyBvciBjYW52YXMgaW50byBhbmltYXRlZCBnaWYuXHJcbiAqIEBsaWNlbnNlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQy9ibG9iL21hc3Rlci9MSUNFTlNFfE1JVH1cclxuICogQGF1dGhvciB7QGxpbmsgaHR0cHM6Ly9NdWF6S2hhbi5jb218TXVheiBLaGFufVxyXG4gKiBAdHlwZWRlZiBHaWZSZWNvcmRlclxyXG4gKiBAY2xhc3NcclxuICogQGV4YW1wbGVcclxuICogdmFyIHJlY29yZGVyID0gbmV3IEdpZlJlY29yZGVyKG1lZGlhU3RyZWFtIHx8IGNhbnZhcyB8fCBjb250ZXh0LCB7IG9uR2lmUHJldmlldzogZnVuY3Rpb24sIG9uR2lmUmVjb3JkaW5nU3RhcnRlZDogZnVuY3Rpb24sIHdpZHRoOiAxMjgwLCBoZWlnaHQ6IDcyMCwgZnJhbWVSYXRlOiAyMDAsIHF1YWxpdHk6IDEwIH0pO1xyXG4gKiByZWNvcmRlci5yZWNvcmQoKTtcclxuICogcmVjb3JkZXIuc3RvcChmdW5jdGlvbihibG9iKSB7XHJcbiAqICAgICBpbWcuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICogfSk7XHJcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tdWF6LWtoYW4vUmVjb3JkUlRDfFJlY29yZFJUQyBTb3VyY2UgQ29kZX1cclxuICogQHBhcmFtIHtNZWRpYVN0cmVhbX0gbWVkaWFTdHJlYW0gLSBNZWRpYVN0cmVhbSBvYmplY3Qgb3IgSFRNTENhbnZhc0VsZW1lbnQgb3IgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0ge2Rpc2FibGVMb2dzOnRydWUsIGluaXRDYWxsYmFjazogZnVuY3Rpb24sIHdpZHRoOiAzMjAsIGhlaWdodDogMjQwLCBmcmFtZVJhdGU6IDIwMCwgcXVhbGl0eTogMTB9XHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gR2lmUmVjb3JkZXIobWVkaWFTdHJlYW0sIGNvbmZpZykge1xyXG4gICAgaWYgKHR5cGVvZiBHSUZFbmNvZGVyID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgICBzY3JpcHQuc3JjID0gJ2h0dHBzOi8vd3d3LndlYnJ0Yy1leHBlcmltZW50LmNvbS9naWYtcmVjb3JkZXIuanMnO1xyXG4gICAgICAgIChkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25maWcgPSBjb25maWcgfHwge307XHJcblxyXG4gICAgdmFyIGlzSFRNTE9iamVjdCA9IG1lZGlhU3RyZWFtIGluc3RhbmNlb2YgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHx8IG1lZGlhU3RyZWFtIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCByZWNvcmRzIE1lZGlhU3RyZWFtLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIEdpZlJlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIucmVjb3JkKCk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMucmVjb3JkID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBHSUZFbmNvZGVyID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHNlbGYucmVjb3JkLCAxMDAwKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFpc0xvYWRlZE1ldGFEYXRhKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoc2VsZi5yZWNvcmQsIDEwMDApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWlzSFRNTE9iamVjdCkge1xyXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy53aWR0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLndpZHRoID0gdmlkZW8ub2Zmc2V0V2lkdGggfHwgMzIwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5oZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5oZWlnaHQgPSB2aWRlby5vZmZzZXRIZWlnaHQgfHwgMjQwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy52aWRlbykge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLnZpZGVvID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBjb25maWcud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjb25maWcuaGVpZ2h0XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5jYW52YXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5jYW52YXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNvbmZpZy53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbmZpZy5oZWlnaHRcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGNvbmZpZy5jYW52YXMud2lkdGggfHwgMzIwO1xyXG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gY29uZmlnLmNhbnZhcy5oZWlnaHQgfHwgMjQwO1xyXG5cclxuICAgICAgICAgICAgdmlkZW8ud2lkdGggPSBjb25maWcudmlkZW8ud2lkdGggfHwgMzIwO1xyXG4gICAgICAgICAgICB2aWRlby5oZWlnaHQgPSBjb25maWcudmlkZW8uaGVpZ2h0IHx8IDI0MDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGV4dGVybmFsIGxpYnJhcnkgdG8gcmVjb3JkIGFzIEdJRiBpbWFnZXNcclxuICAgICAgICBnaWZFbmNvZGVyID0gbmV3IEdJRkVuY29kZXIoKTtcclxuXHJcbiAgICAgICAgLy8gdm9pZCBzZXRSZXBlYXQoaW50IGl0ZXIpIFxyXG4gICAgICAgIC8vIFNldHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc2V0IG9mIEdJRiBmcmFtZXMgc2hvdWxkIGJlIHBsYXllZC4gXHJcbiAgICAgICAgLy8gRGVmYXVsdCBpcyAxOyAwIG1lYW5zIHBsYXkgaW5kZWZpbml0ZWx5LlxyXG4gICAgICAgIGdpZkVuY29kZXIuc2V0UmVwZWF0KDApO1xyXG5cclxuICAgICAgICAvLyB2b2lkIHNldEZyYW1lUmF0ZShOdW1iZXIgZnBzKSBcclxuICAgICAgICAvLyBTZXRzIGZyYW1lIHJhdGUgaW4gZnJhbWVzIHBlciBzZWNvbmQuIFxyXG4gICAgICAgIC8vIEVxdWl2YWxlbnQgdG8gc2V0RGVsYXkoMTAwMC9mcHMpLlxyXG4gICAgICAgIC8vIFVzaW5nIFwic2V0RGVsYXlcIiBpbnN0ZWFkIG9mIFwic2V0RnJhbWVSYXRlXCJcclxuICAgICAgICBnaWZFbmNvZGVyLnNldERlbGF5KGNvbmZpZy5mcmFtZVJhdGUgfHwgMjAwKTtcclxuXHJcbiAgICAgICAgLy8gdm9pZCBzZXRRdWFsaXR5KGludCBxdWFsaXR5KSBcclxuICAgICAgICAvLyBTZXRzIHF1YWxpdHkgb2YgY29sb3IgcXVhbnRpemF0aW9uIChjb252ZXJzaW9uIG9mIGltYWdlcyB0byB0aGUgXHJcbiAgICAgICAgLy8gbWF4aW11bSAyNTYgY29sb3JzIGFsbG93ZWQgYnkgdGhlIEdJRiBzcGVjaWZpY2F0aW9uKS4gXHJcbiAgICAgICAgLy8gTG93ZXIgdmFsdWVzIChtaW5pbXVtID0gMSkgcHJvZHVjZSBiZXR0ZXIgY29sb3JzLCBcclxuICAgICAgICAvLyBidXQgc2xvdyBwcm9jZXNzaW5nIHNpZ25pZmljYW50bHkuIDEwIGlzIHRoZSBkZWZhdWx0LCBcclxuICAgICAgICAvLyBhbmQgcHJvZHVjZXMgZ29vZCBjb2xvciBtYXBwaW5nIGF0IHJlYXNvbmFibGUgc3BlZWRzLiBcclxuICAgICAgICAvLyBWYWx1ZXMgZ3JlYXRlciB0aGFuIDIwIGRvIG5vdCB5aWVsZCBzaWduaWZpY2FudCBpbXByb3ZlbWVudHMgaW4gc3BlZWQuXHJcbiAgICAgICAgZ2lmRW5jb2Rlci5zZXRRdWFsaXR5KGNvbmZpZy5xdWFsaXR5IHx8IDEwKTtcclxuXHJcbiAgICAgICAgLy8gQm9vbGVhbiBzdGFydCgpIFxyXG4gICAgICAgIC8vIFRoaXMgd3JpdGVzIHRoZSBHSUYgSGVhZGVyIGFuZCByZXR1cm5zIGZhbHNlIGlmIGl0IGZhaWxzLlxyXG4gICAgICAgIGdpZkVuY29kZXIuc3RhcnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub25HaWZSZWNvcmRpbmdTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5vbkdpZlJlY29yZGluZ1N0YXJ0ZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGRyYXdWaWRlb0ZyYW1lKHRpbWUpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGYuY2xlYXJlZFJlY29yZGVkRGF0YSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNQYXVzZWRSZWNvcmRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRyYXdWaWRlb0ZyYW1lKHRpbWUpO1xyXG4gICAgICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGFzdEFuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRyYXdWaWRlb0ZyYW1lKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGFzdEZyYW1lVGltZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0RnJhbWVUaW1lID0gdGltZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gfjEwIGZwc1xyXG4gICAgICAgICAgICBpZiAodGltZSAtIGxhc3RGcmFtZVRpbWUgPCA5MCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzSFRNTE9iamVjdCAmJiB2aWRlby5wYXVzZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIHZpYTogaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9XZWJSVEMtRXhwZXJpbWVudC9wdWxsLzMxNlxyXG4gICAgICAgICAgICAgICAgLy8gVHdlYWsgZm9yIEFuZHJvaWQgQ2hyb21lXHJcbiAgICAgICAgICAgICAgICB2aWRlby5wbGF5KCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghaXNIVE1MT2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZy5vbkdpZlByZXZpZXcpIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5vbkdpZlByZXZpZXcoY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJykpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBnaWZFbmNvZGVyLmFkZEZyYW1lKGNvbnRleHQpO1xyXG4gICAgICAgICAgICBsYXN0RnJhbWVUaW1lID0gdGltZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxhc3RBbmltYXRpb25GcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShkcmF3VmlkZW9GcmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChjb25maWcuaW5pdENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZy5pbml0Q2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2Qgc3RvcHMgcmVjb3JkaW5nIE1lZGlhU3RyZWFtLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbiwgdGhhdCBpcyB1c2VkIHRvIHBhc3MgcmVjb3JkZWQgYmxvYiBiYWNrIHRvIHRoZSBjYWxsZWUuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgR2lmUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5zdG9wKGZ1bmN0aW9uKGJsb2IpIHtcclxuICAgICAqICAgICBpbWcuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcclxuXHJcbiAgICAgICAgaWYgKGxhc3RBbmltYXRpb25GcmFtZSkge1xyXG4gICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShsYXN0QW5pbWF0aW9uRnJhbWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZW5kVGltZSA9IERhdGUubm93KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7QmxvYn0gYmxvYiAtIFRoZSByZWNvcmRlZCBibG9iIG9iamVjdC5cclxuICAgICAgICAgKiBAbWVtYmVyb2YgR2lmUmVjb3JkZXJcclxuICAgICAgICAgKiBAZXhhbXBsZVxyXG4gICAgICAgICAqIHJlY29yZGVyLnN0b3AoZnVuY3Rpb24oKXtcclxuICAgICAgICAgKiAgICAgdmFyIGJsb2IgPSByZWNvcmRlci5ibG9iO1xyXG4gICAgICAgICAqIH0pO1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuYmxvYiA9IG5ldyBCbG9iKFtuZXcgVWludDhBcnJheShnaWZFbmNvZGVyLnN0cmVhbSgpLmJpbildLCB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZS9naWYnXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNhbGxiYWNrKHRoaXMuYmxvYik7XHJcblxyXG4gICAgICAgIC8vIGJ1ZzogZmluZCBhIHdheSB0byBjbGVhciBvbGQgcmVjb3JkZWQgYmxvYnNcclxuICAgICAgICBnaWZFbmNvZGVyLnN0cmVhbSgpLmJpbiA9IFtdO1xyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgaXNQYXVzZWRSZWNvcmRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHBhdXNlcyB0aGUgcmVjb3JkaW5nIHByb2Nlc3MuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgR2lmUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5wYXVzZSgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnBhdXNlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaXNQYXVzZWRSZWNvcmRpbmcgPSB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlc3VtZXMgdGhlIHJlY29yZGluZyBwcm9jZXNzLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIEdpZlJlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIucmVzdW1lKCk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMucmVzdW1lID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaXNQYXVzZWRSZWNvcmRpbmcgPSBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCByZXNldHMgY3VycmVudGx5IHJlY29yZGVkIGRhdGEuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgR2lmUmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5jbGVhclJlY29yZGVkRGF0YSgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLmNsZWFyUmVjb3JkZWREYXRhID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgc2VsZi5jbGVhcmVkUmVjb3JkZWREYXRhID0gdHJ1ZTtcclxuICAgICAgICBjbGVhclJlY29yZGVkRGF0YUNCKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyUmVjb3JkZWREYXRhQ0IoKSB7XHJcbiAgICAgICAgaWYgKGdpZkVuY29kZXIpIHtcclxuICAgICAgICAgICAgZ2lmRW5jb2Rlci5zdHJlYW0oKS5iaW4gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZm9yIGRlYnVnZ2luZ1xyXG4gICAgdGhpcy5uYW1lID0gJ0dpZlJlY29yZGVyJztcclxuICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgIGlmIChpc0hUTUxPYmplY3QpIHtcclxuICAgICAgICBpZiAobWVkaWFTdHJlYW0gaW5zdGFuY2VvZiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQpIHtcclxuICAgICAgICAgICAgY29udGV4dCA9IG1lZGlhU3RyZWFtO1xyXG4gICAgICAgICAgICBjYW52YXMgPSBjb250ZXh0LmNhbnZhcztcclxuICAgICAgICB9IGVsc2UgaWYgKG1lZGlhU3RyZWFtIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29udGV4dCA9IG1lZGlhU3RyZWFtLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgICAgIGNhbnZhcyA9IG1lZGlhU3RyZWFtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgaXNMb2FkZWRNZXRhRGF0YSA9IHRydWU7XHJcblxyXG4gICAgaWYgKCFpc0hUTUxPYmplY3QpIHtcclxuICAgICAgICB2YXIgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xyXG4gICAgICAgIHZpZGVvLm11dGVkID0gdHJ1ZTtcclxuICAgICAgICB2aWRlby5hdXRvcGxheSA9IHRydWU7XHJcbiAgICAgICAgdmlkZW8ucGxheXNJbmxpbmUgPSB0cnVlO1xyXG5cclxuICAgICAgICBpc0xvYWRlZE1ldGFEYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdmlkZW8ub25sb2FkZWRtZXRhZGF0YSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpc0xvYWRlZE1ldGFEYXRhID0gdHJ1ZTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzZXRTcmNPYmplY3QobWVkaWFTdHJlYW0sIHZpZGVvKTtcclxuXHJcbiAgICAgICAgdmlkZW8ucGxheSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBsYXN0QW5pbWF0aW9uRnJhbWUgPSBudWxsO1xyXG4gICAgdmFyIHN0YXJ0VGltZSwgZW5kVGltZSwgbGFzdEZyYW1lVGltZTtcclxuXHJcbiAgICB2YXIgZ2lmRW5jb2RlcjtcclxuXHJcbiAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgUmVjb3JkUlRDICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgUmVjb3JkUlRDLkdpZlJlY29yZGVyID0gR2lmUmVjb3JkZXI7XHJcbn1cblxyXG4vLyBMYXN0IHRpbWUgdXBkYXRlZDogMjAxOS0wNi0yMSA0OjA5OjQyIEFNIFVUQ1xyXG5cclxuLy8gX19fX19fX19fX19fX19fX19fX19fX19fXHJcbi8vIE11bHRpU3RyZWFtc01peGVyIHYxLjIuMlxyXG5cclxuLy8gT3Blbi1Tb3VyY2VkOiBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL011bHRpU3RyZWFtc01peGVyXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBNdWF6IEtoYW4gICAgIC0gd3d3Lk11YXpLaGFuLmNvbVxyXG4vLyBNSVQgTGljZW5zZSAgIC0gd3d3LldlYlJUQy1FeHBlcmltZW50LmNvbS9saWNlbmNlXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5mdW5jdGlvbiBNdWx0aVN0cmVhbXNNaXhlcihhcnJheU9mTWVkaWFTdHJlYW1zLCBlbGVtZW50Q2xhc3MpIHtcclxuXHJcbiAgICB2YXIgYnJvd3NlckZha2VVc2VyQWdlbnQgPSAnRmFrZS81LjAgKEZha2VPUykgQXBwbGVXZWJLaXQvMTIzIChLSFRNTCwgbGlrZSBHZWNrbykgRmFrZS8xMi4zLjQ1NjcuODkgRmFrZS8xMjMuNDUnO1xyXG5cclxuICAgIChmdW5jdGlvbih0aGF0KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBSZWNvcmRSVEMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhhdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWwgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdsb2JhbC5uYXZpZ2F0b3IgPSB7XHJcbiAgICAgICAgICAgIHVzZXJBZ2VudDogYnJvd3NlckZha2VVc2VyQWdlbnQsXHJcbiAgICAgICAgICAgIGdldFVzZXJNZWRpYTogZnVuY3Rpb24oKSB7fVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICghZ2xvYmFsLmNvbnNvbGUpIHtcclxuICAgICAgICAgICAgZ2xvYmFsLmNvbnNvbGUgPSB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsLmNvbnNvbGUubG9nID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZ2xvYmFsLmNvbnNvbGUuZXJyb3IgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5jb25zb2xlLmVycm9yID0gZ2xvYmFsLmNvbnNvbGUubG9nID0gZ2xvYmFsLmNvbnNvbGUubG9nIHx8IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIC8qZ2xvYmFsIGRvY3VtZW50OnRydWUgKi9cclxuICAgICAgICAgICAgdGhhdC5kb2N1bWVudCA9IHtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZENoaWxkOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgPSBkb2N1bWVudC5jYXB0dXJlU3RyZWFtID0gZG9jdW1lbnQubW96Q2FwdHVyZVN0cmVhbSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9iaiA9IHtcclxuICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHBsYXk6IGZ1bmN0aW9uKCkge30sXHJcbiAgICAgICAgICAgICAgICAgICAgcGF1c2U6IGZ1bmN0aW9uKCkge30sXHJcbiAgICAgICAgICAgICAgICAgICAgZHJhd0ltYWdlOiBmdW5jdGlvbigpIHt9LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvRGF0YVVSTDogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiB7fVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGF0LkhUTUxWaWRlb0VsZW1lbnQgPSBmdW5jdGlvbigpIHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgLypnbG9iYWwgbG9jYXRpb246dHJ1ZSAqL1xyXG4gICAgICAgICAgICB0aGF0LmxvY2F0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgcHJvdG9jb2w6ICdmaWxlOicsXHJcbiAgICAgICAgICAgICAgICBocmVmOiAnJyxcclxuICAgICAgICAgICAgICAgIGhhc2g6ICcnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHNjcmVlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgLypnbG9iYWwgc2NyZWVuOnRydWUgKi9cclxuICAgICAgICAgICAgdGhhdC5zY3JlZW4gPSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogMFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBVUkwgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIC8qZ2xvYmFsIHNjcmVlbjp0cnVlICovXHJcbiAgICAgICAgICAgIHRoYXQuVVJMID0ge1xyXG4gICAgICAgICAgICAgICAgY3JlYXRlT2JqZWN0VVJMOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgcmV2b2tlT2JqZWN0VVJMOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKmdsb2JhbCB3aW5kb3c6dHJ1ZSAqL1xyXG4gICAgICAgIHRoYXQud2luZG93ID0gZ2xvYmFsO1xyXG4gICAgfSkodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiBudWxsKTtcclxuXHJcbiAgICAvLyByZXF1aXJlczogY2hyb21lOi8vZmxhZ3MvI2VuYWJsZS1leHBlcmltZW50YWwtd2ViLXBsYXRmb3JtLWZlYXR1cmVzXHJcblxyXG4gICAgZWxlbWVudENsYXNzID0gZWxlbWVudENsYXNzIHx8ICdtdWx0aS1zdHJlYW1zLW1peGVyJztcclxuXHJcbiAgICB2YXIgdmlkZW9zID0gW107XHJcbiAgICB2YXIgaXNTdG9wRHJhd2luZ0ZyYW1lcyA9IGZhbHNlO1xyXG5cclxuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICBjYW52YXMuc3R5bGUub3BhY2l0eSA9IDA7XHJcbiAgICBjYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgY2FudmFzLnN0eWxlLnpJbmRleCA9IC0xO1xyXG4gICAgY2FudmFzLnN0eWxlLnRvcCA9ICctMTAwMGVtJztcclxuICAgIGNhbnZhcy5zdHlsZS5sZWZ0ID0gJy0xMDAwZW0nO1xyXG4gICAgY2FudmFzLmNsYXNzTmFtZSA9IGVsZW1lbnRDbGFzcztcclxuICAgIChkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcclxuXHJcbiAgICB0aGlzLmRpc2FibGVMb2dzID0gZmFsc2U7XHJcbiAgICB0aGlzLmZyYW1lSW50ZXJ2YWwgPSAxMDtcclxuXHJcbiAgICB0aGlzLndpZHRoID0gMzYwO1xyXG4gICAgdGhpcy5oZWlnaHQgPSAyNDA7XHJcblxyXG4gICAgLy8gdXNlIGdhaW4gbm9kZSB0byBwcmV2ZW50IGVjaG9cclxuICAgIHRoaXMudXNlR2Fpbk5vZGUgPSB0cnVlO1xyXG5cclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAvLyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX1xyXG4gICAgLy8gQ3Jvc3MtQnJvd3Nlci1EZWNsYXJhdGlvbnMuanNcclxuXHJcbiAgICAvLyBXZWJBdWRpbyBBUEkgcmVwcmVzZW50ZXJcclxuICAgIHZhciBBdWRpb0NvbnRleHQgPSB3aW5kb3cuQXVkaW9Db250ZXh0O1xyXG5cclxuICAgIGlmICh0eXBlb2YgQXVkaW9Db250ZXh0ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2Via2l0QXVkaW9Db250ZXh0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAvKmdsb2JhbCBBdWRpb0NvbnRleHQ6dHJ1ZSAqL1xyXG4gICAgICAgICAgICBBdWRpb0NvbnRleHQgPSB3ZWJraXRBdWRpb0NvbnRleHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIG1vekF1ZGlvQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgLypnbG9iYWwgQXVkaW9Db250ZXh0OnRydWUgKi9cclxuICAgICAgICAgICAgQXVkaW9Db250ZXh0ID0gbW96QXVkaW9Db250ZXh0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKmpzaGludCAtVzA3OSAqL1xyXG4gICAgdmFyIFVSTCA9IHdpbmRvdy5VUkw7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3ZWJraXRVUkwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLypnbG9iYWwgVVJMOnRydWUgKi9cclxuICAgICAgICBVUkwgPSB3ZWJraXRVUkw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0VXNlck1lZGlhID09PSAndW5kZWZpbmVkJykgeyAvLyBtYXliZSB3aW5kb3cubmF2aWdhdG9yP1xyXG4gICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgbmF2aWdhdG9yLmdldFVzZXJNZWRpYSA9IG5hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIG5hdmlnYXRvci5tb3pHZXRVc2VyTWVkaWEgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIG5hdmlnYXRvci5nZXRVc2VyTWVkaWEgPSBuYXZpZ2F0b3IubW96R2V0VXNlck1lZGlhO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgTWVkaWFTdHJlYW0gPSB3aW5kb3cuTWVkaWFTdHJlYW07XHJcblxyXG4gICAgaWYgKHR5cGVvZiBNZWRpYVN0cmVhbSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdlYmtpdE1lZGlhU3RyZWFtICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIE1lZGlhU3RyZWFtID0gd2Via2l0TWVkaWFTdHJlYW07XHJcbiAgICB9XHJcblxyXG4gICAgLypnbG9iYWwgTWVkaWFTdHJlYW06dHJ1ZSAqL1xyXG4gICAgaWYgKHR5cGVvZiBNZWRpYVN0cmVhbSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvLyBvdmVycmlkZSBcInN0b3BcIiBtZXRob2QgZm9yIGFsbCBicm93c2Vyc1xyXG4gICAgICAgIGlmICh0eXBlb2YgTWVkaWFTdHJlYW0ucHJvdG90eXBlLnN0b3AgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIE1lZGlhU3RyZWFtLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRyYWNrcygpLmZvckVhY2goZnVuY3Rpb24odHJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFjay5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIFN0b3JhZ2UgPSB7fTtcclxuXHJcbiAgICBpZiAodHlwZW9mIEF1ZGlvQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBTdG9yYWdlLkF1ZGlvQ29udGV4dCA9IEF1ZGlvQ29udGV4dDtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHdlYmtpdEF1ZGlvQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBTdG9yYWdlLkF1ZGlvQ29udGV4dCA9IHdlYmtpdEF1ZGlvQ29udGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRTcmNPYmplY3Qoc3RyZWFtLCBlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCdzcmNPYmplY3QnIGluIGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5zcmNPYmplY3QgPSBzdHJlYW07XHJcbiAgICAgICAgfSBlbHNlIGlmICgnbW96U3JjT2JqZWN0JyBpbiBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQubW96U3JjT2JqZWN0ID0gc3RyZWFtO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuc3JjT2JqZWN0ID0gc3RyZWFtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0YXJ0RHJhd2luZ0ZyYW1lcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGRyYXdWaWRlb3NUb0NhbnZhcygpO1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBkcmF3VmlkZW9zVG9DYW52YXMoKSB7XHJcbiAgICAgICAgaWYgKGlzU3RvcERyYXdpbmdGcmFtZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHZpZGVvc0xlbmd0aCA9IHZpZGVvcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHZhciBmdWxsY2FudmFzID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIHJlbWFpbmluZyA9IFtdO1xyXG4gICAgICAgIHZpZGVvcy5mb3JFYWNoKGZ1bmN0aW9uKHZpZGVvKSB7XHJcbiAgICAgICAgICAgIGlmICghdmlkZW8uc3RyZWFtKSB7XHJcbiAgICAgICAgICAgICAgICB2aWRlby5zdHJlYW0gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHZpZGVvLnN0cmVhbS5mdWxsY2FudmFzKSB7XHJcbiAgICAgICAgICAgICAgICBmdWxsY2FudmFzID0gdmlkZW87XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0b2RvOiB2aWRlby5zdHJlYW0uYWN0aXZlIG9yIHZpZGVvLnN0cmVhbS5saXZlIHRvIGZpeCBibGFuayBmcmFtZXMgaXNzdWVzP1xyXG4gICAgICAgICAgICAgICAgcmVtYWluaW5nLnB1c2godmlkZW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChmdWxsY2FudmFzKSB7XHJcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGZ1bGxjYW52YXMuc3RyZWFtLndpZHRoO1xyXG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gZnVsbGNhbnZhcy5zdHJlYW0uaGVpZ2h0O1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSB2aWRlb3NMZW5ndGggPiAxID8gcmVtYWluaW5nWzBdLndpZHRoICogMiA6IHJlbWFpbmluZ1swXS53aWR0aDtcclxuXHJcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSAxO1xyXG4gICAgICAgICAgICBpZiAodmlkZW9zTGVuZ3RoID09PSAzIHx8IHZpZGVvc0xlbmd0aCA9PT0gNCkge1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmlkZW9zTGVuZ3RoID09PSA1IHx8IHZpZGVvc0xlbmd0aCA9PT0gNikge1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gMztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmlkZW9zTGVuZ3RoID09PSA3IHx8IHZpZGVvc0xlbmd0aCA9PT0gOCkge1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gNDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmlkZW9zTGVuZ3RoID09PSA5IHx8IHZpZGVvc0xlbmd0aCA9PT0gMTApIHtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IDU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IHJlbWFpbmluZ1swXS5oZWlnaHQgKiBoZWlnaHQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gc2VsZi53aWR0aCB8fCAzNjA7XHJcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBzZWxmLmhlaWdodCB8fCAyNDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZnVsbGNhbnZhcyAmJiBmdWxsY2FudmFzIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkge1xyXG4gICAgICAgICAgICBkcmF3SW1hZ2UoZnVsbGNhbnZhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZW1haW5pbmcuZm9yRWFjaChmdW5jdGlvbih2aWRlbywgaWR4KSB7XHJcbiAgICAgICAgICAgIGRyYXdJbWFnZSh2aWRlbywgaWR4KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dChkcmF3VmlkZW9zVG9DYW52YXMsIHNlbGYuZnJhbWVJbnRlcnZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZHJhd0ltYWdlKHZpZGVvLCBpZHgpIHtcclxuICAgICAgICBpZiAoaXNTdG9wRHJhd2luZ0ZyYW1lcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgeCA9IDA7XHJcbiAgICAgICAgdmFyIHkgPSAwO1xyXG4gICAgICAgIHZhciB3aWR0aCA9IHZpZGVvLndpZHRoO1xyXG4gICAgICAgIHZhciBoZWlnaHQgPSB2aWRlby5oZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmIChpZHggPT09IDEpIHtcclxuICAgICAgICAgICAgeCA9IHZpZGVvLndpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkeCA9PT0gMikge1xyXG4gICAgICAgICAgICB5ID0gdmlkZW8uaGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkeCA9PT0gMykge1xyXG4gICAgICAgICAgICB4ID0gdmlkZW8ud2lkdGg7XHJcbiAgICAgICAgICAgIHkgPSB2aWRlby5oZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWR4ID09PSA0KSB7XHJcbiAgICAgICAgICAgIHkgPSB2aWRlby5oZWlnaHQgKiAyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkeCA9PT0gNSkge1xyXG4gICAgICAgICAgICB4ID0gdmlkZW8ud2lkdGg7XHJcbiAgICAgICAgICAgIHkgPSB2aWRlby5oZWlnaHQgKiAyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkeCA9PT0gNikge1xyXG4gICAgICAgICAgICB5ID0gdmlkZW8uaGVpZ2h0ICogMztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZHggPT09IDcpIHtcclxuICAgICAgICAgICAgeCA9IHZpZGVvLndpZHRoO1xyXG4gICAgICAgICAgICB5ID0gdmlkZW8uaGVpZ2h0ICogMztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdmlkZW8uc3RyZWFtLmxlZnQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHggPSB2aWRlby5zdHJlYW0ubGVmdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdmlkZW8uc3RyZWFtLnRvcCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgeSA9IHZpZGVvLnN0cmVhbS50b3A7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHZpZGVvLnN0cmVhbS53aWR0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgd2lkdGggPSB2aWRlby5zdHJlYW0ud2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHZpZGVvLnN0cmVhbS5oZWlnaHQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IHZpZGVvLnN0cmVhbS5oZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZSh2aWRlbywgeCwgeSwgd2lkdGgsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdmlkZW8uc3RyZWFtLm9uUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHZpZGVvLnN0cmVhbS5vblJlbmRlcihjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBpZHgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRNaXhlZFN0cmVhbSgpIHtcclxuICAgICAgICBpc1N0b3BEcmF3aW5nRnJhbWVzID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIG1peGVkVmlkZW9TdHJlYW0gPSBnZXRNaXhlZFZpZGVvU3RyZWFtKCk7XHJcblxyXG4gICAgICAgIHZhciBtaXhlZEF1ZGlvU3RyZWFtID0gZ2V0TWl4ZWRBdWRpb1N0cmVhbSgpO1xyXG4gICAgICAgIGlmIChtaXhlZEF1ZGlvU3RyZWFtKSB7XHJcbiAgICAgICAgICAgIG1peGVkQXVkaW9TdHJlYW0uZ2V0VHJhY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0LmtpbmQgPT09ICdhdWRpbyc7XHJcbiAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24odHJhY2spIHtcclxuICAgICAgICAgICAgICAgIG1peGVkVmlkZW9TdHJlYW0uYWRkVHJhY2sodHJhY2spO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBmdWxsY2FudmFzO1xyXG4gICAgICAgIGFycmF5T2ZNZWRpYVN0cmVhbXMuZm9yRWFjaChmdW5jdGlvbihzdHJlYW0pIHtcclxuICAgICAgICAgICAgaWYgKHN0cmVhbS5mdWxsY2FudmFzKSB7XHJcbiAgICAgICAgICAgICAgICBmdWxsY2FudmFzID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBtaXhlZFZpZGVvU3RyZWFtLnByb3RvdHlwZS5hcHBlbmRTdHJlYW1zID0gYXBwZW5kU3RyZWFtcztcclxuICAgICAgICAvLyBtaXhlZFZpZGVvU3RyZWFtLnByb3RvdHlwZS5yZXNldFZpZGVvU3RyZWFtcyA9IHJlc2V0VmlkZW9TdHJlYW1zO1xyXG4gICAgICAgIC8vIG1peGVkVmlkZW9TdHJlYW0ucHJvdG90eXBlLmNsZWFyUmVjb3JkZWREYXRhID0gY2xlYXJSZWNvcmRlZERhdGE7XHJcblxyXG4gICAgICAgIHJldHVybiBtaXhlZFZpZGVvU3RyZWFtO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldE1peGVkVmlkZW9TdHJlYW0oKSB7XHJcbiAgICAgICAgcmVzZXRWaWRlb1N0cmVhbXMoKTtcclxuXHJcbiAgICAgICAgdmFyIGNhcHR1cmVkU3RyZWFtO1xyXG5cclxuICAgICAgICBpZiAoJ2NhcHR1cmVTdHJlYW0nIGluIGNhbnZhcykge1xyXG4gICAgICAgICAgICBjYXB0dXJlZFN0cmVhbSA9IGNhbnZhcy5jYXB0dXJlU3RyZWFtKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICgnbW96Q2FwdHVyZVN0cmVhbScgaW4gY2FudmFzKSB7XHJcbiAgICAgICAgICAgIGNhcHR1cmVkU3RyZWFtID0gY2FudmFzLm1vekNhcHR1cmVTdHJlYW0oKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCFzZWxmLmRpc2FibGVMb2dzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VwZ3JhZGUgdG8gbGF0ZXN0IENocm9tZSBvciBvdGhlcndpc2UgZW5hYmxlIHRoaXMgZmxhZzogY2hyb21lOi8vZmxhZ3MvI2VuYWJsZS1leHBlcmltZW50YWwtd2ViLXBsYXRmb3JtLWZlYXR1cmVzJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgdmlkZW9TdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0oKTtcclxuXHJcbiAgICAgICAgY2FwdHVyZWRTdHJlYW0uZ2V0VHJhY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHQua2luZCA9PT0gJ3ZpZGVvJztcclxuICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrKSB7XHJcbiAgICAgICAgICAgIHZpZGVvU3RyZWFtLmFkZFRyYWNrKHRyYWNrKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY2FudmFzLnN0cmVhbSA9IHZpZGVvU3RyZWFtO1xyXG5cclxuICAgICAgICByZXR1cm4gdmlkZW9TdHJlYW07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0TWl4ZWRBdWRpb1N0cmVhbSgpIHtcclxuICAgICAgICAvLyB2aWE6IEBwZWhyc29uc1xyXG4gICAgICAgIGlmICghU3RvcmFnZS5BdWRpb0NvbnRleHRDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICBTdG9yYWdlLkF1ZGlvQ29udGV4dENvbnN0cnVjdG9yID0gbmV3IFN0b3JhZ2UuQXVkaW9Db250ZXh0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxmLmF1ZGlvQ29udGV4dCA9IFN0b3JhZ2UuQXVkaW9Db250ZXh0Q29uc3RydWN0b3I7XHJcblxyXG4gICAgICAgIHNlbGYuYXVkaW9Tb3VyY2VzID0gW107XHJcblxyXG4gICAgICAgIGlmIChzZWxmLnVzZUdhaW5Ob2RlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHNlbGYuZ2Fpbk5vZGUgPSBzZWxmLmF1ZGlvQ29udGV4dC5jcmVhdGVHYWluKCk7XHJcbiAgICAgICAgICAgIHNlbGYuZ2Fpbk5vZGUuY29ubmVjdChzZWxmLmF1ZGlvQ29udGV4dC5kZXN0aW5hdGlvbik7XHJcbiAgICAgICAgICAgIHNlbGYuZ2Fpbk5vZGUuZ2Fpbi52YWx1ZSA9IDA7IC8vIGRvbid0IGhlYXIgc2VsZlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGF1ZGlvVHJhY2tzTGVuZ3RoID0gMDtcclxuICAgICAgICBhcnJheU9mTWVkaWFTdHJlYW1zLmZvckVhY2goZnVuY3Rpb24oc3RyZWFtKSB7XHJcbiAgICAgICAgICAgIGlmICghc3RyZWFtLmdldFRyYWNrcygpLmZpbHRlcihmdW5jdGlvbih0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQua2luZCA9PT0gJ2F1ZGlvJztcclxuICAgICAgICAgICAgICAgIH0pLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhdWRpb1RyYWNrc0xlbmd0aCsrO1xyXG5cclxuICAgICAgICAgICAgdmFyIGF1ZGlvU291cmNlID0gc2VsZi5hdWRpb0NvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2Uoc3RyZWFtKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxmLnVzZUdhaW5Ob2RlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBhdWRpb1NvdXJjZS5jb25uZWN0KHNlbGYuZ2Fpbk5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWxmLmF1ZGlvU291cmNlcy5wdXNoKGF1ZGlvU291cmNlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFhdWRpb1RyYWNrc0xlbmd0aCkge1xyXG4gICAgICAgICAgICAvLyBiZWNhdXNlIFwic2VsZi5hdWRpb0NvbnRleHRcIiBpcyBub3QgaW5pdGlhbGl6ZWRcclxuICAgICAgICAgICAgLy8gdGhhdCdzIHdoeSB3ZSd2ZSB0byBpZ25vcmUgcmVzdCBvZiB0aGUgY29kZVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxmLmF1ZGlvRGVzdGluYXRpb24gPSBzZWxmLmF1ZGlvQ29udGV4dC5jcmVhdGVNZWRpYVN0cmVhbURlc3RpbmF0aW9uKCk7XHJcbiAgICAgICAgc2VsZi5hdWRpb1NvdXJjZXMuZm9yRWFjaChmdW5jdGlvbihhdWRpb1NvdXJjZSkge1xyXG4gICAgICAgICAgICBhdWRpb1NvdXJjZS5jb25uZWN0KHNlbGYuYXVkaW9EZXN0aW5hdGlvbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHNlbGYuYXVkaW9EZXN0aW5hdGlvbi5zdHJlYW07XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0VmlkZW8oc3RyZWFtKSB7XHJcbiAgICAgICAgdmFyIHZpZGVvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcclxuXHJcbiAgICAgICAgc2V0U3JjT2JqZWN0KHN0cmVhbSwgdmlkZW8pO1xyXG5cclxuICAgICAgICB2aWRlby5jbGFzc05hbWUgPSBlbGVtZW50Q2xhc3M7XHJcblxyXG4gICAgICAgIHZpZGVvLm11dGVkID0gdHJ1ZTtcclxuICAgICAgICB2aWRlby52b2x1bWUgPSAwO1xyXG5cclxuICAgICAgICB2aWRlby53aWR0aCA9IHN0cmVhbS53aWR0aCB8fCBzZWxmLndpZHRoIHx8IDM2MDtcclxuICAgICAgICB2aWRlby5oZWlnaHQgPSBzdHJlYW0uaGVpZ2h0IHx8IHNlbGYuaGVpZ2h0IHx8IDI0MDtcclxuXHJcbiAgICAgICAgdmlkZW8ucGxheSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gdmlkZW87XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcHBlbmRTdHJlYW1zID0gZnVuY3Rpb24oc3RyZWFtcykge1xyXG4gICAgICAgIGlmICghc3RyZWFtcykge1xyXG4gICAgICAgICAgICB0aHJvdyAnRmlyc3QgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShzdHJlYW1zIGluc3RhbmNlb2YgQXJyYXkpKSB7XHJcbiAgICAgICAgICAgIHN0cmVhbXMgPSBbc3RyZWFtc107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdHJlYW1zLmZvckVhY2goZnVuY3Rpb24oc3RyZWFtKSB7XHJcbiAgICAgICAgICAgIHZhciBuZXdTdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0oKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdHJlYW0uZ2V0VHJhY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5raW5kID09PSAndmlkZW8nO1xyXG4gICAgICAgICAgICAgICAgfSkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmlkZW8gPSBnZXRWaWRlbyhzdHJlYW0pO1xyXG4gICAgICAgICAgICAgICAgdmlkZW8uc3RyZWFtID0gc3RyZWFtO1xyXG4gICAgICAgICAgICAgICAgdmlkZW9zLnB1c2godmlkZW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIG5ld1N0cmVhbS5hZGRUcmFjayhzdHJlYW0uZ2V0VHJhY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5raW5kID09PSAndmlkZW8nO1xyXG4gICAgICAgICAgICAgICAgfSlbMF0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc3RyZWFtLmdldFRyYWNrcygpLmZpbHRlcihmdW5jdGlvbih0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQua2luZCA9PT0gJ2F1ZGlvJztcclxuICAgICAgICAgICAgICAgIH0pLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGF1ZGlvU291cmNlID0gc2VsZi5hdWRpb0NvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2Uoc3RyZWFtKTtcclxuICAgICAgICAgICAgICAgIHNlbGYuYXVkaW9EZXN0aW5hdGlvbiA9IHNlbGYuYXVkaW9Db250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtRGVzdGluYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlLmNvbm5lY3Qoc2VsZi5hdWRpb0Rlc3RpbmF0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBuZXdTdHJlYW0uYWRkVHJhY2soc2VsZi5hdWRpb0Rlc3RpbmF0aW9uLnN0cmVhbS5nZXRUcmFja3MoKS5maWx0ZXIoZnVuY3Rpb24odCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmtpbmQgPT09ICdhdWRpbyc7XHJcbiAgICAgICAgICAgICAgICB9KVswXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGFycmF5T2ZNZWRpYVN0cmVhbXMucHVzaChuZXdTdHJlYW0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnJlbGVhc2VTdHJlYW1zID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmlkZW9zID0gW107XHJcbiAgICAgICAgaXNTdG9wRHJhd2luZ0ZyYW1lcyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmIChzZWxmLmdhaW5Ob2RlKSB7XHJcbiAgICAgICAgICAgIHNlbGYuZ2Fpbk5vZGUuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICBzZWxmLmdhaW5Ob2RlID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWxmLmF1ZGlvU291cmNlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgc2VsZi5hdWRpb1NvdXJjZXMuZm9yRWFjaChmdW5jdGlvbihzb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzZWxmLmF1ZGlvU291cmNlcyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlbGYuYXVkaW9EZXN0aW5hdGlvbikge1xyXG4gICAgICAgICAgICBzZWxmLmF1ZGlvRGVzdGluYXRpb24uZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICBzZWxmLmF1ZGlvRGVzdGluYXRpb24gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlbGYuYXVkaW9Db250ZXh0KSB7XHJcbiAgICAgICAgICAgIHNlbGYuYXVkaW9Db250ZXh0LmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxmLmF1ZGlvQ29udGV4dCA9IG51bGw7XHJcblxyXG4gICAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XHJcblxyXG4gICAgICAgIGlmIChjYW52YXMuc3RyZWFtKSB7XHJcbiAgICAgICAgICAgIGNhbnZhcy5zdHJlYW0uc3RvcCgpO1xyXG4gICAgICAgICAgICBjYW52YXMuc3RyZWFtID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMucmVzZXRWaWRlb1N0cmVhbXMgPSBmdW5jdGlvbihzdHJlYW1zKSB7XHJcbiAgICAgICAgaWYgKHN0cmVhbXMgJiYgIShzdHJlYW1zIGluc3RhbmNlb2YgQXJyYXkpKSB7XHJcbiAgICAgICAgICAgIHN0cmVhbXMgPSBbc3RyZWFtc107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXNldFZpZGVvU3RyZWFtcyhzdHJlYW1zKTtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gcmVzZXRWaWRlb1N0cmVhbXMoc3RyZWFtcykge1xyXG4gICAgICAgIHZpZGVvcyA9IFtdO1xyXG4gICAgICAgIHN0cmVhbXMgPSBzdHJlYW1zIHx8IGFycmF5T2ZNZWRpYVN0cmVhbXM7XHJcblxyXG4gICAgICAgIC8vIHZpYTogQGFkcmlhbi1iZXJcclxuICAgICAgICBzdHJlYW1zLmZvckVhY2goZnVuY3Rpb24oc3RyZWFtKSB7XHJcbiAgICAgICAgICAgIGlmICghc3RyZWFtLmdldFRyYWNrcygpLmZpbHRlcihmdW5jdGlvbih0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQua2luZCA9PT0gJ3ZpZGVvJztcclxuICAgICAgICAgICAgICAgIH0pLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgdmlkZW8gPSBnZXRWaWRlbyhzdHJlYW0pO1xyXG4gICAgICAgICAgICB2aWRlby5zdHJlYW0gPSBzdHJlYW07XHJcbiAgICAgICAgICAgIHZpZGVvcy5wdXNoKHZpZGVvKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmb3IgZGVidWdnaW5nXHJcbiAgICB0aGlzLm5hbWUgPSAnTXVsdGlTdHJlYW1zTWl4ZXInO1xyXG4gICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuZ2V0TWl4ZWRTdHJlYW0gPSBnZXRNaXhlZFN0cmVhbTtcclxuXHJcbn1cclxuXHJcbmlmICh0eXBlb2YgUmVjb3JkUlRDID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnIC8qICYmICEhbW9kdWxlLmV4cG9ydHMqLyApIHtcclxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IE11bHRpU3RyZWFtc01peGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcclxuICAgICAgICBkZWZpbmUoJ011bHRpU3RyZWFtc01peGVyJywgW10sIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTXVsdGlTdHJlYW1zTWl4ZXI7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cblxyXG4vLyBfX19fX19fX19fX19fX19fX19fX19fXHJcbi8vIE11bHRpU3RyZWFtUmVjb3JkZXIuanNcclxuXHJcbi8qXHJcbiAqIFZpZGVvIGNvbmZlcmVuY2UgcmVjb3JkaW5nLCB1c2luZyBjYXB0dXJlU3RyZWFtIEFQSSBhbG9uZyB3aXRoIFdlYkF1ZGlvIGFuZCBDYW52YXMyRCBBUEkuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIE11bHRpU3RyZWFtUmVjb3JkZXIgY2FuIHJlY29yZCBtdWx0aXBsZSB2aWRlb3MgaW4gc2luZ2xlIGNvbnRhaW5lci5cclxuICogQHN1bW1hcnkgTXVsdGktdmlkZW9zIHJlY29yZGVyLlxyXG4gKiBAbGljZW5zZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEMvYmxvYi9tYXN0ZXIvTElDRU5TRXxNSVR9XHJcbiAqIEBhdXRob3Ige0BsaW5rIGh0dHBzOi8vTXVhektoYW4uY29tfE11YXogS2hhbn1cclxuICogQHR5cGVkZWYgTXVsdGlTdHJlYW1SZWNvcmRlclxyXG4gKiBAY2xhc3NcclxuICogQGV4YW1wbGVcclxuICogdmFyIG9wdGlvbnMgPSB7XHJcbiAqICAgICBtaW1lVHlwZTogJ3ZpZGVvL3dlYm0nXHJcbiAqIH1cclxuICogdmFyIHJlY29yZGVyID0gbmV3IE11bHRpU3RyZWFtUmVjb3JkZXIoQXJyYXlPZk1lZGlhU3RyZWFtcywgb3B0aW9ucyk7XHJcbiAqIHJlY29yZGVyLnJlY29yZCgpO1xyXG4gKiByZWNvcmRlci5zdG9wKGZ1bmN0aW9uKGJsb2IpIHtcclxuICogICAgIHZpZGVvLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAqXHJcbiAqICAgICAvLyBvclxyXG4gKiAgICAgdmFyIGJsb2IgPSByZWNvcmRlci5ibG9iO1xyXG4gKiB9KTtcclxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL211YXota2hhbi9SZWNvcmRSVEN8UmVjb3JkUlRDIFNvdXJjZSBDb2RlfVxyXG4gKiBAcGFyYW0ge01lZGlhU3RyZWFtc30gbWVkaWFTdHJlYW1zIC0gQXJyYXkgb2YgTWVkaWFTdHJlYW1zLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0ge2Rpc2FibGVMb2dzOnRydWUsIGZyYW1lSW50ZXJ2YWw6IDEsIG1pbWVUeXBlOiBcInZpZGVvL3dlYm1cIn1cclxuICovXHJcblxyXG5mdW5jdGlvbiBNdWx0aVN0cmVhbVJlY29yZGVyKGFycmF5T2ZNZWRpYVN0cmVhbXMsIG9wdGlvbnMpIHtcclxuICAgIGFycmF5T2ZNZWRpYVN0cmVhbXMgPSBhcnJheU9mTWVkaWFTdHJlYW1zIHx8IFtdO1xyXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xyXG5cclxuICAgIHZhciBtaXhlcjtcclxuICAgIHZhciBtZWRpYVJlY29yZGVyO1xyXG5cclxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHtcclxuICAgICAgICBlbGVtZW50Q2xhc3M6ICdtdWx0aS1zdHJlYW1zLW1peGVyJyxcclxuICAgICAgICBtaW1lVHlwZTogJ3ZpZGVvL3dlYm0nLFxyXG4gICAgICAgIHZpZGVvOiB7XHJcbiAgICAgICAgICAgIHdpZHRoOiAzNjAsXHJcbiAgICAgICAgICAgIGhlaWdodDogMjQwXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoIW9wdGlvbnMuZnJhbWVJbnRlcnZhbCkge1xyXG4gICAgICAgIG9wdGlvbnMuZnJhbWVJbnRlcnZhbCA9IDEwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghb3B0aW9ucy52aWRlbykge1xyXG4gICAgICAgIG9wdGlvbnMudmlkZW8gPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIW9wdGlvbnMudmlkZW8ud2lkdGgpIHtcclxuICAgICAgICBvcHRpb25zLnZpZGVvLndpZHRoID0gMzYwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghb3B0aW9ucy52aWRlby5oZWlnaHQpIHtcclxuICAgICAgICBvcHRpb25zLnZpZGVvLmhlaWdodCA9IDI0MDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlY29yZHMgYWxsIE1lZGlhU3RyZWFtcy5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNdWx0aVN0cmVhbVJlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIucmVjb3JkKCk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMucmVjb3JkID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgLy8gZ2l0aHViL211YXota2hhbi9NdWx0aVN0cmVhbXNNaXhlclxyXG4gICAgICAgIG1peGVyID0gbmV3IE11bHRpU3RyZWFtc01peGVyKGFycmF5T2ZNZWRpYVN0cmVhbXMsIG9wdGlvbnMuZWxlbWVudENsYXNzIHx8ICdtdWx0aS1zdHJlYW1zLW1peGVyJyk7XHJcblxyXG4gICAgICAgIGlmIChnZXRBbGxWaWRlb1RyYWNrcygpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBtaXhlci5mcmFtZUludGVydmFsID0gb3B0aW9ucy5mcmFtZUludGVydmFsIHx8IDEwO1xyXG4gICAgICAgICAgICBtaXhlci53aWR0aCA9IG9wdGlvbnMudmlkZW8ud2lkdGggfHwgMzYwO1xyXG4gICAgICAgICAgICBtaXhlci5oZWlnaHQgPSBvcHRpb25zLnZpZGVvLmhlaWdodCB8fCAyNDA7XHJcbiAgICAgICAgICAgIG1peGVyLnN0YXJ0RHJhd2luZ0ZyYW1lcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMucHJldmlld1N0cmVhbSAmJiB0eXBlb2Ygb3B0aW9ucy5wcmV2aWV3U3RyZWFtID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMucHJldmlld1N0cmVhbShtaXhlci5nZXRNaXhlZFN0cmVhbSgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJlY29yZCB1c2luZyBNZWRpYVJlY29yZGVyIEFQSVxyXG4gICAgICAgIG1lZGlhUmVjb3JkZXIgPSBuZXcgTWVkaWFTdHJlYW1SZWNvcmRlcihtaXhlci5nZXRNaXhlZFN0cmVhbSgpLCBvcHRpb25zKTtcclxuICAgICAgICBtZWRpYVJlY29yZGVyLnJlY29yZCgpO1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBnZXRBbGxWaWRlb1RyYWNrcygpIHtcclxuICAgICAgICB2YXIgdHJhY2tzID0gW107XHJcbiAgICAgICAgYXJyYXlPZk1lZGlhU3RyZWFtcy5mb3JFYWNoKGZ1bmN0aW9uKHN0cmVhbSkge1xyXG4gICAgICAgICAgICBnZXRUcmFja3Moc3RyZWFtLCAndmlkZW8nKS5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrKSB7XHJcbiAgICAgICAgICAgICAgICB0cmFja3MucHVzaCh0cmFjayk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0cmFja3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBzdG9wcyByZWNvcmRpbmcgTWVkaWFTdHJlYW0uXHJcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLCB0aGF0IGlzIHVzZWQgdG8gcGFzcyByZWNvcmRlZCBibG9iIGJhY2sgdG8gdGhlIGNhbGxlZS5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNdWx0aVN0cmVhbVJlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuc3RvcChmdW5jdGlvbihibG9iKSB7XHJcbiAgICAgKiAgICAgdmlkZW8uc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnN0b3AgPSBmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gICAgICAgIGlmICghbWVkaWFSZWNvcmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBtZWRpYVJlY29yZGVyLnN0b3AoZnVuY3Rpb24oYmxvYikge1xyXG4gICAgICAgICAgICBzZWxmLmJsb2IgPSBibG9iO1xyXG5cclxuICAgICAgICAgICAgY2FsbGJhY2soYmxvYik7XHJcblxyXG4gICAgICAgICAgICBzZWxmLmNsZWFyUmVjb3JkZWREYXRhKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcGF1c2VzIHRoZSByZWNvcmRpbmcgcHJvY2Vzcy5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNdWx0aVN0cmVhbVJlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIucGF1c2UoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5wYXVzZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChtZWRpYVJlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIucGF1c2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcmVzdW1lcyB0aGUgcmVjb3JkaW5nIHByb2Nlc3MuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgTXVsdGlTdHJlYW1SZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnJlc3VtZSgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChtZWRpYVJlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIucmVzdW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlc2V0cyBjdXJyZW50bHkgcmVjb3JkZWQgZGF0YS5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNdWx0aVN0cmVhbVJlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuY2xlYXJSZWNvcmRlZERhdGEoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5jbGVhclJlY29yZGVkRGF0YSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChtZWRpYVJlY29yZGVyKSB7XHJcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIuY2xlYXJSZWNvcmRlZERhdGEoKTtcclxuICAgICAgICAgICAgbWVkaWFSZWNvcmRlciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobWl4ZXIpIHtcclxuICAgICAgICAgICAgbWl4ZXIucmVsZWFzZVN0cmVhbXMoKTtcclxuICAgICAgICAgICAgbWl4ZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgZXh0cmEgbWVkaWEtc3RyZWFtcyB0byBleGlzdGluZyByZWNvcmRpbmdzLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIE11bHRpU3RyZWFtUmVjb3JkZXJcclxuICAgICAqIEBwYXJhbSB7TWVkaWFTdHJlYW1zfSBtZWRpYVN0cmVhbXMgLSBBcnJheSBvZiBNZWRpYVN0cmVhbXNcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5hZGRTdHJlYW1zKFtuZXdBdWRpb1N0cmVhbSwgbmV3VmlkZW9TdHJlYW1dKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5hZGRTdHJlYW1zID0gZnVuY3Rpb24oc3RyZWFtcykge1xyXG4gICAgICAgIGlmICghc3RyZWFtcykge1xyXG4gICAgICAgICAgICB0aHJvdyAnRmlyc3QgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShzdHJlYW1zIGluc3RhbmNlb2YgQXJyYXkpKSB7XHJcbiAgICAgICAgICAgIHN0cmVhbXMgPSBbc3RyZWFtc107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhcnJheU9mTWVkaWFTdHJlYW1zLmNvbmNhdChzdHJlYW1zKTtcclxuXHJcbiAgICAgICAgaWYgKCFtZWRpYVJlY29yZGVyIHx8ICFtaXhlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBtaXhlci5hcHBlbmRTdHJlYW1zKHN0cmVhbXMpO1xyXG5cclxuICAgICAgICBpZiAob3B0aW9ucy5wcmV2aWV3U3RyZWFtICYmIHR5cGVvZiBvcHRpb25zLnByZXZpZXdTdHJlYW0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgb3B0aW9ucy5wcmV2aWV3U3RyZWFtKG1peGVyLmdldE1peGVkU3RyZWFtKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXNldCB2aWRlb3MgZHVyaW5nIGxpdmUgcmVjb3JkaW5nLiBSZXBsYWNlIG9sZCB2aWRlb3MgZS5nLiByZXBsYWNlIGNhbWVyYXMgd2l0aCBmdWxsLXNjcmVlbi5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNdWx0aVN0cmVhbVJlY29yZGVyXHJcbiAgICAgKiBAcGFyYW0ge01lZGlhU3RyZWFtc30gbWVkaWFTdHJlYW1zIC0gQXJyYXkgb2YgTWVkaWFTdHJlYW1zXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIucmVzZXRWaWRlb1N0cmVhbXMoW25ld1ZpZGVvMSwgbmV3VmlkZW8yXSk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMucmVzZXRWaWRlb1N0cmVhbXMgPSBmdW5jdGlvbihzdHJlYW1zKSB7XHJcbiAgICAgICAgaWYgKCFtaXhlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RyZWFtcyAmJiAhKHN0cmVhbXMgaW5zdGFuY2VvZiBBcnJheSkpIHtcclxuICAgICAgICAgICAgc3RyZWFtcyA9IFtzdHJlYW1zXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG1peGVyLnJlc2V0VmlkZW9TdHJlYW1zKHN0cmVhbXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgTXVsdGlTdHJlYW1zTWl4ZXJcclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBNdWx0aVN0cmVhbVJlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogbGV0IG1peGVyID0gcmVjb3JkZXIuZ2V0TWl4ZXIoKTtcclxuICAgICAqIG1peGVyLmFwcGVuZFN0cmVhbXMoW25ld1N0cmVhbV0pO1xyXG4gICAgICovXHJcbiAgICB0aGlzLmdldE1peGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIG1peGVyO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBmb3IgZGVidWdnaW5nXHJcbiAgICB0aGlzLm5hbWUgPSAnTXVsdGlTdHJlYW1SZWNvcmRlcic7XHJcbiAgICB0aGlzLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcclxuICAgIH07XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgUmVjb3JkUlRDICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgUmVjb3JkUlRDLk11bHRpU3RyZWFtUmVjb3JkZXIgPSBNdWx0aVN0cmVhbVJlY29yZGVyO1xyXG59XG5cclxuLy8gX19fX19fX19fX19fX19fX19fX19fXHJcbi8vIFJlY29yZFJUQy5wcm9taXNlcy5qc1xyXG5cclxuLyoqXHJcbiAqIFJlY29yZFJUQ1Byb21pc2VzSGFuZGxlciBhZGRzIHByb21pc2VzIHN1cHBvcnQgaW4ge0BsaW5rIFJlY29yZFJUQ30uIFRyeSBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQy9ibG9iL21hc3Rlci9zaW1wbGUtZGVtb3MvUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyLmh0bWx8ZGVtbyBoZXJlfVxyXG4gKiBAc3VtbWFyeSBQcm9taXNlcyBmb3Ige0BsaW5rIFJlY29yZFJUQ31cclxuICogQGxpY2Vuc2Uge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tdWF6LWtoYW4vUmVjb3JkUlRDL2Jsb2IvbWFzdGVyL0xJQ0VOU0V8TUlUfVxyXG4gKiBAYXV0aG9yIHtAbGluayBodHRwczovL011YXpLaGFuLmNvbXxNdWF6IEtoYW59XHJcbiAqIEB0eXBlZGVmIFJlY29yZFJUQ1Byb21pc2VzSGFuZGxlclxyXG4gKiBAY2xhc3NcclxuICogQGV4YW1wbGVcclxuICogdmFyIHJlY29yZGVyID0gbmV3IFJlY29yZFJUQ1Byb21pc2VzSGFuZGxlcihtZWRpYVN0cmVhbSwgb3B0aW9ucyk7XHJcbiAqIHJlY29yZGVyLnN0YXJ0UmVjb3JkaW5nKClcclxuICogICAgICAgICAudGhlbihzdWNjZXNzQ0IpXHJcbiAqICAgICAgICAgLmNhdGNoKGVycm9yQ0IpO1xyXG4gKiAvLyBOb3RlOiBZb3UgY2FuIGFjY2VzcyBhbGwgUmVjb3JkUlRDIEFQSSB1c2luZyBcInJlY29yZGVyLnJlY29yZFJUQ1wiIGUuZy4gXHJcbiAqIHJlY29yZGVyLnJlY29yZFJUQy5vblN0YXRlQ2hhbmdlZCA9IGZ1bmN0aW9uKHN0YXRlKSB7fTtcclxuICogcmVjb3JkZXIucmVjb3JkUlRDLnNldFJlY29yZGluZ0R1cmF0aW9uKDUwMDApO1xyXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQ3xSZWNvcmRSVEMgU291cmNlIENvZGV9XHJcbiAqIEBwYXJhbSB7TWVkaWFTdHJlYW19IG1lZGlhU3RyZWFtIC0gU2luZ2xlIG1lZGlhLXN0cmVhbSBvYmplY3QsIGFycmF5IG9mIG1lZGlhLXN0cmVhbXMsIGh0bWwtY2FudmFzLWVsZW1lbnQsIGV0Yy5cclxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyAtIHt0eXBlOlwidmlkZW9cIiwgcmVjb3JkZXJUeXBlOiBNZWRpYVN0cmVhbVJlY29yZGVyLCBkaXNhYmxlTG9nczogdHJ1ZSwgbnVtYmVyT2ZBdWRpb0NoYW5uZWxzOiAxLCBidWZmZXJTaXplOiAwLCBzYW1wbGVSYXRlOiAwLCB2aWRlbzogSFRNTFZpZGVvRWxlbWVudCwgZXRjLn1cclxuICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIFwibmV3XCIga2V5d29yZCBpcyBub3QgdXNlZCB0byBpbml0aWF0ZSBcIlJlY29yZFJUQ1Byb21pc2VzSGFuZGxlclwiLiBBbHNvIHRocm93cyBlcnJvciBpZiBmaXJzdCBhcmd1bWVudCBcIk1lZGlhU3RyZWFtXCIgaXMgbWlzc2luZy5cclxuICogQHJlcXVpcmVzIHtAbGluayBSZWNvcmRSVEN9XHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyKG1lZGlhU3RyZWFtLCBvcHRpb25zKSB7XHJcbiAgICBpZiAoIXRoaXMpIHtcclxuICAgICAgICB0aHJvdyAnVXNlIFwibmV3IFJlY29yZFJUQ1Byb21pc2VzSGFuZGxlcigpXCInO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgbWVkaWFTdHJlYW0gPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgdGhyb3cgJ0ZpcnN0IGFyZ3VtZW50IFwiTWVkaWFTdHJlYW1cIiBpcyByZXF1aXJlZC4nO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwcm9wZXJ0eSB7QmxvYn0gYmxvYiAtIEFjY2Vzcy9yZWFjaCB0aGUgbmF0aXZlIHtAbGluayBSZWNvcmRSVEN9IG9iamVjdC5cclxuICAgICAqIEBtZW1iZXJvZiBSZWNvcmRSVENQcm9taXNlc0hhbmRsZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBsZXQgaW50ZXJuYWwgPSByZWNvcmRlci5yZWNvcmRSVEMuZ2V0SW50ZXJuYWxSZWNvcmRlcigpO1xyXG4gICAgICogYWxlcnQoaW50ZXJuYWwgaW5zdGFuY2VvZiBNZWRpYVN0cmVhbVJlY29yZGVyKTtcclxuICAgICAqIHJlY29yZGVyLnJlY29yZFJUQy5vblN0YXRlQ2hhbmdlZCA9IGZ1bmN0aW9uKHN0YXRlKSB7fTtcclxuICAgICAqL1xyXG4gICAgc2VsZi5yZWNvcmRSVEMgPSBuZXcgUmVjb3JkUlRDKG1lZGlhU3RyZWFtLCBvcHRpb25zKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlY29yZHMgTWVkaWFTdHJlYW0uXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuc3RhcnRSZWNvcmRpbmcoKVxyXG4gICAgICogICAgICAgICAudGhlbihzdWNjZXNzQ0IpXHJcbiAgICAgKiAgICAgICAgIC5jYXRjaChlcnJvckNCKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5zdGFydFJlY29yZGluZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkUlRDLnN0YXJ0UmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHN0b3BzIHRoZSByZWNvcmRpbmcuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuc3RvcFJlY29yZGluZygpLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgKiAgICAgdmFyIGJsb2IgPSByZWNvcmRlci5nZXRCbG9iKCk7XHJcbiAgICAgKiB9KS5jYXRjaChlcnJvckNCKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5zdG9wUmVjb3JkaW5nID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yZWNvcmRSVEMuc3RvcFJlY29yZGluZyhmdW5jdGlvbih1cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmJsb2IgPSBzZWxmLnJlY29yZFJUQy5nZXRCbG9iKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5ibG9iIHx8ICFzZWxmLmJsb2Iuc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0VtcHR5IGJsb2IuJywgc2VsZi5ibG9iKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh1cmwpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHBhdXNlcyB0aGUgcmVjb3JkaW5nLiBZb3UgY2FuIHJlc3VtZSByZWNvcmRpbmcgdXNpbmcgXCJyZXN1bWVSZWNvcmRpbmdcIiBtZXRob2QuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIucGF1c2VSZWNvcmRpbmcoKVxyXG4gICAgICogICAgICAgICAudGhlbihzdWNjZXNzQ0IpXHJcbiAgICAgKiAgICAgICAgIC5jYXRjaChlcnJvckNCKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5wYXVzZVJlY29yZGluZyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkUlRDLnBhdXNlUmVjb3JkaW5nKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlc3VtZXMgdGhlIHJlY29yZGluZy5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBSZWNvcmRSVENQcm9taXNlc0hhbmRsZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5yZXN1bWVSZWNvcmRpbmcoKVxyXG4gICAgICogICAgICAgICAudGhlbihzdWNjZXNzQ0IpXHJcbiAgICAgKiAgICAgICAgIC5jYXRjaChlcnJvckNCKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5yZXN1bWVSZWNvcmRpbmcgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlY29yZFJUQy5yZXN1bWVSZWNvcmRpbmcoKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBkYXRhLXVybCBmb3IgdGhlIHJlY29yZGVkIGJsb2IuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuc3RvcFJlY29yZGluZygpLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgKiAgICAgcmVjb3JkZXIuZ2V0RGF0YVVSTCgpLnRoZW4oZnVuY3Rpb24oZGF0YVVSTCkge1xyXG4gICAgICogICAgICAgICB3aW5kb3cub3BlbihkYXRhVVJMKTtcclxuICAgICAqICAgICB9KS5jYXRjaChlcnJvckNCKTs7XHJcbiAgICAgKiB9KS5jYXRjaChlcnJvckNCKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5nZXREYXRhVVJMID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJlY29yZFJUQy5nZXREYXRhVVJMKGZ1bmN0aW9uKGRhdGFVUkwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGFVUkwpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlY29yZGVkIGJsb2IuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuc3RvcFJlY29yZGluZygpLnRoZW4oZnVuY3Rpb24oKSB7XHJcbiAgICAgKiAgICAgcmVjb3JkZXIuZ2V0QmxvYigpLnRoZW4oZnVuY3Rpb24oYmxvYikge30pXHJcbiAgICAgKiB9KS5jYXRjaChlcnJvckNCKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5nZXRCbG9iID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShzZWxmLnJlY29yZFJUQy5nZXRCbG9iKCkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbnRlcm5hbCByZWNvcmRpbmcgb2JqZWN0LlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIFJlY29yZFJUQ1Byb21pc2VzSGFuZGxlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGxldCBpbnRlcm5hbFJlY29yZGVyID0gYXdhaXQgcmVjb3JkZXIuZ2V0SW50ZXJuYWxSZWNvcmRlcigpO1xyXG4gICAgICogaWYoaW50ZXJuYWxSZWNvcmRlciBpbnN0YW5jZW9mIE11bHRpU3RyZWFtUmVjb3JkZXIpIHtcclxuICAgICAqICAgICBpbnRlcm5hbFJlY29yZGVyLmFkZFN0cmVhbXMoW25ld0F1ZGlvU3RyZWFtXSk7XHJcbiAgICAgKiAgICAgaW50ZXJuYWxSZWNvcmRlci5yZXNldFZpZGVvU3RyZWFtcyhbc2NyZWVuU3RyZWFtXSk7XHJcbiAgICAgKiB9XHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBcclxuICAgICAqL1xyXG4gICAgdGhpcy5nZXRJbnRlcm5hbFJlY29yZGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShzZWxmLnJlY29yZFJUQy5nZXRJbnRlcm5hbFJlY29yZGVyKCkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCByZXNldHMgdGhlIHJlY29yZGVyLiBTbyB0aGF0IHlvdSBjYW4gcmV1c2Ugc2luZ2xlIHJlY29yZGVyIGluc3RhbmNlIG1hbnkgdGltZXMuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYXdhaXQgcmVjb3JkZXIucmVzZXQoKTtcclxuICAgICAqIHJlY29yZGVyLnN0YXJ0UmVjb3JkaW5nKCk7IC8vIHJlY29yZCBhZ2FpblxyXG4gICAgICovXHJcbiAgICB0aGlzLnJlc2V0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShzZWxmLnJlY29yZFJUQy5yZXNldCgpKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveSBSZWNvcmRSVEMgaW5zdGFuY2UuIENsZWFyIGFsbCByZWNvcmRlcnMgYW5kIG9iamVjdHMuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuZGVzdHJveSgpLnRoZW4oc3VjY2Vzc0NCKS5jYXRjaChlcnJvckNCKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShzZWxmLnJlY29yZFJUQy5kZXN0cm95KCkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgcmVjb3JkZXIncyByZWFkb25seSBzdGF0ZS5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBSZWNvcmRSVENQcm9taXNlc0hhbmRsZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBsZXQgc3RhdGUgPSBhd2FpdCByZWNvcmRlci5nZXRTdGF0ZSgpO1xyXG4gICAgICogLy8gb3JcclxuICAgICAqIHJlY29yZGVyLmdldFN0YXRlKCkudGhlbihzdGF0ZSA9PiB7IGNvbnNvbGUubG9nKHN0YXRlKTsgfSlcclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFJldHVybnMgcmVjb3JkaW5nIHN0YXRlLlxyXG4gICAgICovXHJcbiAgICB0aGlzLmdldFN0YXRlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShzZWxmLnJlY29yZFJUQy5nZXRTdGF0ZSgpKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHByb3BlcnR5IHtCbG9ifSBibG9iIC0gUmVjb3JkZWQgZGF0YSBhcyBcIkJsb2JcIiBvYmplY3QuXHJcbiAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogYXdhaXQgcmVjb3JkZXIuc3RvcFJlY29yZGluZygpO1xyXG4gICAgICogbGV0IGJsb2IgPSByZWNvcmRlci5nZXRCbG9iKCk7IC8vIG9yIFwicmVjb3JkZXIucmVjb3JkUlRDLmJsb2JcIlxyXG4gICAgICogaW52b2tlU2F2ZUFzRGlhbG9nKGJsb2IpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLmJsb2IgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjb3JkUlRDIHZlcnNpb24gbnVtYmVyXHJcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gdmVyc2lvbiAtIFJlbGVhc2UgdmVyc2lvbiBudW1iZXIuXHJcbiAgICAgKiBAbWVtYmVyb2YgUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyXHJcbiAgICAgKiBAc3RhdGljXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiBhbGVydChyZWNvcmRlci52ZXJzaW9uKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy52ZXJzaW9uID0gJzUuNS45JztcclxufVxyXG5cclxuaWYgKHR5cGVvZiBSZWNvcmRSVEMgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICBSZWNvcmRSVEMuUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyID0gUmVjb3JkUlRDUHJvbWlzZXNIYW5kbGVyO1xyXG59XG5cclxuLy8gX19fX19fX19fX19fX19fX19fX19fX1xyXG4vLyBXZWJBc3NlbWJseVJlY29yZGVyLmpzXHJcblxyXG4vKipcclxuICogV2ViQXNzZW1ibHlSZWNvcmRlciBsZXRzIHlvdSBjcmVhdGUgd2VibSB2aWRlb3MgaW4gSmF2YVNjcmlwdCB2aWEgV2ViQXNzZW1ibHkuIFRoZSBsaWJyYXJ5IGNvbnN1bWVzIHJhdyBSR0JBMzIgYnVmZmVycyAoNCBieXRlcyBwZXIgcGl4ZWwpIGFuZCB0dXJucyB0aGVtIGludG8gYSB3ZWJtIHZpZGVvIHdpdGggdGhlIGdpdmVuIGZyYW1lcmF0ZSBhbmQgcXVhbGl0eS4gVGhpcyBtYWtlcyBpdCBjb21wYXRpYmxlIG91dC1vZi10aGUtYm94IHdpdGggSW1hZ2VEYXRhIGZyb20gYSBDQU5WQVMuIFdpdGggcmVhbHRpbWUgbW9kZSB5b3UgY2FuIGFsc28gdXNlIHdlYm0td2FzbSBmb3Igc3RyZWFtaW5nIHdlYm0gdmlkZW9zLlxyXG4gKiBAc3VtbWFyeSBWaWRlbyByZWNvcmRpbmcgZmVhdHVyZSBpbiBDaHJvbWUsIEZpcmVmb3ggYW5kIG1heWJlIEVkZ2UuXHJcbiAqIEBsaWNlbnNlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQy9ibG9iL21hc3Rlci9MSUNFTlNFfE1JVH1cclxuICogQGF1dGhvciB7QGxpbmsgaHR0cHM6Ly9NdWF6S2hhbi5jb218TXVheiBLaGFufVxyXG4gKiBAdHlwZWRlZiBXZWJBc3NlbWJseVJlY29yZGVyXHJcbiAqIEBjbGFzc1xyXG4gKiBAZXhhbXBsZVxyXG4gKiB2YXIgcmVjb3JkZXIgPSBuZXcgV2ViQXNzZW1ibHlSZWNvcmRlcihtZWRpYVN0cmVhbSk7XHJcbiAqIHJlY29yZGVyLnJlY29yZCgpO1xyXG4gKiByZWNvcmRlci5zdG9wKGZ1bmN0aW9uKGJsb2IpIHtcclxuICogICAgIHZpZGVvLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAqIH0pO1xyXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbXVhei1raGFuL1JlY29yZFJUQ3xSZWNvcmRSVEMgU291cmNlIENvZGV9XHJcbiAqIEBwYXJhbSB7TWVkaWFTdHJlYW19IG1lZGlhU3RyZWFtIC0gTWVkaWFTdHJlYW0gb2JqZWN0IGZldGNoZWQgdXNpbmcgZ2V0VXNlck1lZGlhIEFQSSBvciBnZW5lcmF0ZWQgdXNpbmcgY2FwdHVyZVN0cmVhbVVudGlsRW5kZWQgb3IgV2ViQXVkaW8gQVBJLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0ge3dlYkFzc2VtYmx5UGF0aDond2VibS13YXNtLndhc20nLHdvcmtlclBhdGg6ICd3ZWJtLXdvcmtlci5qcycsIGZyYW1lUmF0ZTogMzAsIHdpZHRoOiAxOTIwLCBoZWlnaHQ6IDEwODAsIGJpdHJhdGU6IDEwMjR9XHJcbiAqL1xyXG5mdW5jdGlvbiBXZWJBc3NlbWJseVJlY29yZGVyKHN0cmVhbSwgY29uZmlnKSB7XHJcbiAgICAvLyBiYXNlZCBvbjogZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWVMYWJzL3dlYm0td2FzbVxyXG5cclxuICAgIGlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBXcml0YWJsZVN0cmVhbSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAvLyBiZWNhdXNlIGl0IGZpeGVzIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbXMgaXNzdWVzXHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9sbG93aW5nIHBvbHlmaWxsIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkOiBodHRwczovL3VucGtnLmNvbS9AbWF0dGlhc2J1ZWxlbnMvd2ViLXN0cmVhbXMtcG9seWZpbGwvZGlzdC9wb2x5ZmlsbC5taW4uanMnKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25maWcgPSBjb25maWcgfHwge307XHJcblxyXG4gICAgY29uZmlnLndpZHRoID0gY29uZmlnLndpZHRoIHx8IDY0MDtcclxuICAgIGNvbmZpZy5oZWlnaHQgPSBjb25maWcuaGVpZ2h0IHx8IDQ4MDtcclxuICAgIGNvbmZpZy5mcmFtZVJhdGUgPSBjb25maWcuZnJhbWVSYXRlIHx8IDMwO1xyXG4gICAgY29uZmlnLmJpdHJhdGUgPSBjb25maWcuYml0cmF0ZSB8fCAxMjAwO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlclVSTChidWZmZXIsIHR5cGUpIHtcclxuICAgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbYnVmZmVyXSwge1xyXG4gICAgICAgICAgICB0eXBlOiB0eXBlIHx8ICcnXHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNhbWVyYVN0cmVhbSgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcclxuICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjdnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICAgICAgICAgIHZhciB2aWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XHJcbiAgICAgICAgICAgICAgICB2aWRlby5zcmNPYmplY3QgPSBzdHJlYW07XHJcbiAgICAgICAgICAgICAgICB2aWRlby5vbnBsYXlpbmcgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICBjdnMud2lkdGggPSBjb25maWcud2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgY3ZzLmhlaWdodCA9IGNvbmZpZy5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN0eCA9IGN2cy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBmcmFtZVRpbWVvdXQgPSAxMDAwIC8gY29uZmlnLmZyYW1lUmF0ZTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uIGYoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UodmlkZW8sIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGNvbmZpZy53aWR0aCwgY29uZmlnLmhlaWdodClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmLCBmcmFtZVRpbWVvdXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIGZyYW1lVGltZW91dCk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdmlkZW8ucGxheSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHdvcmtlcjtcclxuXHJcbiAgICBmdW5jdGlvbiBzdGFydFJlY29yZGluZyhzdHJlYW0sIGJ1ZmZlcikge1xyXG4gICAgICAgIGlmICghY29uZmlnLndvcmtlclBhdGggJiYgIWJ1ZmZlcikge1xyXG4gICAgICAgICAgICAvLyBpcyBpdCBzYWZlIHRvIHVzZSBAbGF0ZXN0ID9cclxuICAgICAgICAgICAgZmV0Y2goXHJcbiAgICAgICAgICAgICAgICAnaHR0cHM6Ly91bnBrZy5jb20vd2VibS13YXNtQGxhdGVzdC9kaXN0L3dlYm0td29ya2VyLmpzJ1xyXG4gICAgICAgICAgICApLnRoZW4oZnVuY3Rpb24ocikge1xyXG4gICAgICAgICAgICAgICAgci5hcnJheUJ1ZmZlcigpLnRoZW4oZnVuY3Rpb24oYnVmZmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRSZWNvcmRpbmcoc3RyZWFtLCBidWZmZXIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNvbmZpZy53b3JrZXJQYXRoICYmIGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25maWcud29ya2VyUGF0aCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNvbmZpZy53b3JrZXJQYXRoKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3dvcmtlclBhdGggcGFyYW1ldGVyIGlzIG1pc3NpbmcuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3b3JrZXIgPSBuZXcgV29ya2VyKGNvbmZpZy53b3JrZXJQYXRoKTtcclxuXHJcbiAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKGNvbmZpZy53ZWJBc3NlbWJseVBhdGggfHwgJ2h0dHBzOi8vdW5wa2cuY29tL3dlYm0td2FzbUBsYXRlc3QvZGlzdC93ZWJtLXdhc20ud2FzbScpO1xyXG4gICAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEgPT09ICdSRUFEWScpIHtcclxuICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNvbmZpZy53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbmZpZy5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgYml0cmF0ZTogY29uZmlnLmJpdHJhdGUgfHwgMTIwMCxcclxuICAgICAgICAgICAgICAgICAgICB0aW1lYmFzZURlbjogY29uZmlnLmZyYW1lUmF0ZSB8fCAzMCxcclxuICAgICAgICAgICAgICAgICAgICByZWFsdGltZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FtZXJhU3RyZWFtKCkucGlwZVRvKG5ldyBXcml0YWJsZVN0cmVhbSh7XHJcbiAgICAgICAgICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKGltYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShpbWFnZS5kYXRhLmJ1ZmZlciwgW2ltYWdlLmRhdGEuYnVmZmVyXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCEhZXZlbnQuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpc1BhdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFycmF5T2ZCdWZmZXJzLnB1c2goZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlY29yZHMgdmlkZW8uXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgV2ViQXNzZW1ibHlSZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnJlY29yZCgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnJlY29yZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGFycmF5T2ZCdWZmZXJzID0gW107XHJcbiAgICAgICAgaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmJsb2IgPSBudWxsO1xyXG4gICAgICAgIHN0YXJ0UmVjb3JkaW5nKHN0cmVhbSk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLmluaXRDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjb25maWcuaW5pdENhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgaXNQYXVzZWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBwYXVzZXMgdGhlIHJlY29yZGluZyBwcm9jZXNzLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIFdlYkFzc2VtYmx5UmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5wYXVzZSgpO1xyXG4gICAgICovXHJcbiAgICB0aGlzLnBhdXNlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaXNQYXVzZWQgPSB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlc3VtZXMgdGhlIHJlY29yZGluZyBwcm9jZXNzLlxyXG4gICAgICogQG1ldGhvZFxyXG4gICAgICogQG1lbWJlcm9mIFdlYkFzc2VtYmx5UmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5yZXN1bWUoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5yZXN1bWUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpc1BhdXNlZCA9IGZhbHNlO1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiB0ZXJtaW5hdGUoKSB7XHJcbiAgICAgICAgaWYgKCF3b3JrZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKG51bGwpO1xyXG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcclxuICAgICAgICB3b3JrZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBhcnJheU9mQnVmZmVycyA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2Qgc3RvcHMgcmVjb3JkaW5nIHZpZGVvLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbiwgdGhhdCBpcyB1c2VkIHRvIHBhc3MgcmVjb3JkZWQgYmxvYiBiYWNrIHRvIHRoZSBjYWxsZWUuXHJcbiAgICAgKiBAbWV0aG9kXHJcbiAgICAgKiBAbWVtYmVyb2YgV2ViQXNzZW1ibHlSZWNvcmRlclxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHJlY29yZGVyLnN0b3AoZnVuY3Rpb24oYmxvYikge1xyXG4gICAgICogICAgIHZpZGVvLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5zdG9wID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuICAgICAgICB0ZXJtaW5hdGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5ibG9iID0gbmV3IEJsb2IoYXJyYXlPZkJ1ZmZlcnMsIHtcclxuICAgICAgICAgICAgdHlwZTogJ3ZpZGVvL3dlYm0nXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNhbGxiYWNrKHRoaXMuYmxvYik7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIGZvciBkZWJ1Z2dpbmdcclxuICAgIHRoaXMubmFtZSA9ICdXZWJBc3NlbWJseVJlY29yZGVyJztcclxuICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIHJlc2V0cyBjdXJyZW50bHkgcmVjb3JkZWQgZGF0YS5cclxuICAgICAqIEBtZXRob2RcclxuICAgICAqIEBtZW1iZXJvZiBXZWJBc3NlbWJseVJlY29yZGVyXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogcmVjb3JkZXIuY2xlYXJSZWNvcmRlZERhdGEoKTtcclxuICAgICAqL1xyXG4gICAgdGhpcy5jbGVhclJlY29yZGVkRGF0YSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGFycmF5T2ZCdWZmZXJzID0gW107XHJcbiAgICAgICAgaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmJsb2IgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyB0b2RvOiBpZiByZWNvcmRpbmctT04gdGhlbiBTVE9QIGl0IGZpcnN0XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHByb3BlcnR5IHtCbG9ifSBibG9iIC0gVGhlIHJlY29yZGVkIGJsb2Igb2JqZWN0LlxyXG4gICAgICogQG1lbWJlcm9mIFdlYkFzc2VtYmx5UmVjb3JkZXJcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiByZWNvcmRlci5zdG9wKGZ1bmN0aW9uKCl7XHJcbiAgICAgKiAgICAgdmFyIGJsb2IgPSByZWNvcmRlci5ibG9iO1xyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuICAgIHRoaXMuYmxvYiA9IG51bGw7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgUmVjb3JkUlRDICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgUmVjb3JkUlRDLldlYkFzc2VtYmx5UmVjb3JkZXIgPSBXZWJBc3NlbWJseVJlY29yZGVyO1xyXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9yZWNvcmRydGMvUmVjb3JkUlRDLmpzXG4vLyBtb2R1bGUgaWQgPSAxN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsInZhciBnO1xyXG5cclxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcclxuZyA9IChmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gdGhpcztcclxufSkoKTtcclxuXHJcbnRyeSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXHJcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcclxufSBjYXRjaChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxyXG5cdFx0ZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAxOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSIsImZ1bmN0aW9uIGluaXQoU3VydmV5LCAkKSB7XG4gICQgPSAkIHx8IHdpbmRvdy4kO1xuXG4gIHZhciB3aWRnZXQgPSB7XG4gICAgbmFtZTogXCJlbW90aW9uc3JhdGluZ3NcIixcbiAgICB0aXRsZTogXCJFbW90aW9ucyBSYXRpbmdzXCIsXG4gICAgaWNvbk5hbWU6IFwiaWNvbi1lbW90aW9uc3JhdGluZ3NcIixcbiAgICB3aWRnZXRJc0xvYWRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiAkID09IFwiZnVuY3Rpb25cIiAmJiAhISQuZm4uZW1vdGlvbnNSYXRpbmc7XG4gICAgfSxcbiAgICBkZWZhdWx0SlNPTjoge1xuICAgICAgY2hvaWNlczogWzEsIDIsIDMsIDQsIDVdLFxuICAgIH0sXG4gICAgaXNGaXQ6IGZ1bmN0aW9uIChxdWVzdGlvbikge1xuICAgICAgcmV0dXJuIHF1ZXN0aW9uLmdldFR5cGUoKSA9PT0gXCJlbW90aW9uc3JhdGluZ3NcIjtcbiAgICB9LFxuICAgIGlzRGVmYXVsdFJlbmRlcjogZmFsc2UsXG4gICAgaHRtbFRlbXBsYXRlOiBcIjxkaXYgc3R5bGU9J2hlaWdodDogMzNweCc+PC9kaXY+XCIsXG4gICAgYWN0aXZhdGVkQnlDaGFuZ2VkOiBmdW5jdGlvbiAoYWN0aXZhdGVkQnkpIHtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICAgICAgICBcImVtb3Rpb25zcmF0aW5nc1wiLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJoYXNPdGhlclwiLFxuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcIm90aGVyVGV4dFwiLFxuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcIm9wdGlvbnNDYXB0aW9uXCIsXG4gICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwib3RoZXJFcnJvclRleHRcIixcbiAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLFxuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInJlbmRlckFzXCIsXG4gICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBudWxsLFxuICAgICAgICBcImRyb3Bkb3duXCJcbiAgICAgICk7XG4gICAgICBTdXJ2ZXkuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRQcm9wZXJ0aWVzKFwiZW1vdGlvbnNyYXRpbmdzXCIsIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiZW1vdGlvbnM6aXRlbXZhbHVlc1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImVtb3Rpb25zXCIsXG4gICAgICAgICAgY2F0ZWdvcnlJbmRleDogMSxcbiAgICAgICAgICBkZWZhdWx0OiBbXCJhbmdyeVwiLCBcImRpc2FwcG9pbnRlZFwiLCBcIm1laFwiLCBcImhhcHB5XCIsIFwiaW5Mb3ZlXCJdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJlbW90aW9uU2l6ZTpudW1iZXJcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJlbW90aW9uc1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IDMwLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJlbW90aW9uc0NvdW50Om51bWJlclwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImVtb3Rpb25zXCIsXG4gICAgICAgICAgZGVmYXVsdDogNSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiYmdFbW90aW9uXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZW1vdGlvbnNcIixcbiAgICAgICAgICBkZWZhdWx0OiBcImhhcHB5XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImVtb3Rpb25Db2xvclwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImVtb3Rpb25zXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCIjRkYwMDY2XCIsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9LFxuICAgIGFmdGVyUmVuZGVyOiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgZW1vdGlvbnMgPSAocXVlc3Rpb24uZW1vdGlvbnMgfHwgW10pLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGVtb3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBlbW90aW9ucyA9IFtcImFuZ3J5XCIsIFwiZGlzYXBwb2ludGVkXCIsIFwibWVoXCIsIFwiaGFwcHlcIiwgXCJpbkxvdmVcIl07XG4gICAgICB9XG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgZW1vdGlvblNpemU6IHF1ZXN0aW9uLmVtb3Rpb25TaXplLFxuICAgICAgICBiZ0Vtb3Rpb246IHF1ZXN0aW9uLmJnRW1vdGlvbixcbiAgICAgICAgZW1vdGlvbnM6IGVtb3Rpb25zLFxuICAgICAgICBpbml0aWFsUmF0aW5nOiBxdWVzdGlvbi52YWx1ZSxcbiAgICAgICAgY29sb3I6IHF1ZXN0aW9uLmVtb3Rpb25Db2xvcixcbiAgICAgICAgY291bnQ6IHF1ZXN0aW9uLmVtb3Rpb25zQ291bnQsXG4gICAgICAgIG9uVXBkYXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGluaXRXaWRnZXQoKTtcblxuICAgICAgcXVlc3Rpb24udmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSBpbml0V2lkZ2V0O1xuICAgICAgcXVlc3Rpb24ucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2sgPSBpbml0V2lkZ2V0O1xuXG4gICAgICBmdW5jdGlvbiBpbml0V2lkZ2V0KCkge1xuICAgICAgICBlbC5pbm5lckhUTUwgPSBcIjxkaXY+PC9kaXY+XCI7XG4gICAgICAgICQoZWwpLm9mZigpO1xuICAgICAgICBvcHRpb25zLmluaXRpYWxSYXRpbmcgPSBxdWVzdGlvbi52YWx1ZSB8fCAwO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVkID0gcXVlc3Rpb24uaXNSZWFkT25seTtcbiAgICAgICAgJChlbCkuZmluZChcImRpdlwiKS5lbW90aW9uc1JhdGluZyhvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHdpbGxVbm1vdW50OiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSBudWxsO1xuICAgICAgJChlbCkub2ZmKCk7XG4gICAgICBxdWVzdGlvbi5yZWFkT25seUNoYW5nZWRDYWxsYmFjayA9IG51bGw7XG4gICAgICBxdWVzdGlvbi52YWx1ZUNoYW5nZWRDYWxsYmFjayA9IG51bGw7XG4gICAgfSxcbiAgICBwZGZRdWVzdGlvblR5cGU6IFwiZHJvcGRvd25cIixcbiAgfTtcblxuICBTdXJ2ZXkuQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbi5JbnN0YW5jZS5hZGRDdXN0b21XaWRnZXQod2lkZ2V0LCBcImN1c3RvbXR5cGVcIik7XG59XG5cbmlmICh0eXBlb2YgU3VydmV5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIGluaXQoU3VydmV5LCB3aW5kb3cuJCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9lbW90aW9uc3JhdGluZ3MuanNcbi8vIG1vZHVsZSBpZCA9IDIwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxMiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgaWNoZWNrIH0gZnJvbSBcIi4vaWNoZWNrLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHNlbGVjdDIgfSBmcm9tIFwiLi9zZWxlY3QyLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlucHV0bWFzayB9IGZyb20gXCIuL2lucHV0bWFzay5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBqcXVlcnliYXJyYXRpbmcgfSBmcm9tIFwiLi9qcXVlcnktYmFyLXJhdGluZy5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBqcXVlcnl1aWRhdGVwaWNrZXIgfSBmcm9tIFwiLi9qcXVlcnktdWktZGF0ZXBpY2tlci5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBub3Vpc2xpZGVyIH0gZnJvbSBcIi4vbm91aXNsaWRlci5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzZWxlY3QydGFnYm94IH0gZnJvbSBcIi4vc2VsZWN0Mi10YWdib3guanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydGFibGVqcyB9IGZyb20gXCIuL3NvcnRhYmxlanMuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2tlZGl0b3IgfSBmcm9tIFwiLi9jay1lZGl0b3IuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXV0b2NvbXBsZXRlIH0gZnJvbSBcIi4vZWFzeS1hdXRvY29tcGxldGUuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJldHR5Y2hlY2tib3ggfSBmcm9tIFwiLi9wcmV0dHktY2hlY2tib3guanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYm9vdHN0cmFwc2xpZGVyIH0gZnJvbSBcIi4vYm9vdHN0cmFwLXNsaWRlci5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtaWNyb3Bob25lIH0gZnJvbSBcIi4vbWljcm9waG9uZS5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlbW90aW9uc3JhdGluZ3MgfSBmcm9tIFwiLi9lbW90aW9uc3JhdGluZ3MuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYm9vdHN0cmFwZGF0ZXBpY2tlciB9IGZyb20gXCIuL2Jvb3RzdHJhcGRhdGVwaWNrZXIuanNcIjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL3N1cnZleWpzLXdpZGdldHMuanNcbi8vIG1vZHVsZSBpZCA9IDIxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImZ1bmN0aW9uIGluaXQoU3VydmV5LCAkKSB7XG4gICQgPSAkIHx8IHdpbmRvdy4kO1xuXG4gIGlmIChcbiAgICAhISQgJiZcbiAgICAhJC5mbi5ib290c3RyYXBEUCAmJlxuICAgICEhJC5mbi5kYXRlcGlja2VyICYmXG4gICAgISEkLmZuLmRhdGVwaWNrZXIubm9Db25mbGljdFxuICApIHtcbiAgICAkLmZuLmJvb3RzdHJhcERQID0gJC5mbi5kYXRlcGlja2VyLm5vQ29uZmxpY3QoKTtcbiAgICBpZiAoISQuZm4uZGF0ZXBpY2tlcikge1xuICAgICAgJC5mbi5kYXRlcGlja2VyID0gJC5mbi5ib290c3RyYXBEUDtcbiAgICB9XG4gIH1cbiAgdmFyIHdpZGdldCA9IHtcbiAgICBuYW1lOiBcImJvb3RzdHJhcGRhdGVwaWNrZXJcIixcbiAgICB0aXRsZTogXCJEYXRlIHBpY2tlclwiLFxuICAgIGljb25OYW1lOiBcImljb24tZGF0ZXBpY2tlclwiLFxuICAgIHdpZGdldElzTG9hZGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gISEkICYmICEhJC5mbi5ib290c3RyYXBEUDtcbiAgICB9LFxuICAgIGlzRml0OiBmdW5jdGlvbiAocXVlc3Rpb24pIHtcbiAgICAgIHJldHVybiBxdWVzdGlvbi5nZXRUeXBlKCkgPT09IFwiYm9vdHN0cmFwZGF0ZXBpY2tlclwiO1xuICAgIH0sXG4gICAgaHRtbFRlbXBsYXRlOlxuICAgICAgXCI8aW5wdXQgY2xhc3M9J2Zvcm0tY29udHJvbCB3aWRnZXQtZGF0ZXBpY2tlcicgdHlwZT0ndGV4dCcgc3R5bGU9J3dpZHRoOiAxMDAlOyc+XCIsXG4gICAgYWN0aXZhdGVkQnlDaGFuZ2VkOiBmdW5jdGlvbiAoYWN0aXZhdGVkQnkpIHtcbiAgICAgIFN1cnZleS5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICAgICAgICBcImJvb3RzdHJhcGRhdGVwaWNrZXJcIixcbiAgICAgICAgW1xuICAgICAgICAgIHsgbmFtZTogXCJpbnB1dFR5cGVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwiaW5wdXRGb3JtYXRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICAgICAgICB7IG5hbWU6IFwiaW5wdXRNYXNrXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIFwidGV4dFwiXG4gICAgICApO1xuICAgICAgU3VydmV5Lkpzb25PYmplY3QubWV0YURhdGEuYWRkUHJvcGVydGllcyhcImJvb3RzdHJhcGRhdGVwaWNrZXJcIiwgW1xuICAgICAgICB7XG4gICAgICAgICAgLy8gQ2FuIHRha2UgYSBzdHJpbmcgb3IgYW4gT2JqZWN0LlxuICAgICAgICAgIC8vIGh0dHBzOi8vYm9vdHN0cmFwLWRhdGVwaWNrZXIucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L29wdGlvbnMuaHRtbCNmb3JtYXRcbiAgICAgICAgICBuYW1lOiBcImRhdGVGb3JtYXRcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJtbS9kZC95eXl5XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBDYW4gdGFrZSBhIERhdGUgb3IgYSBzdHJpbmdcbiAgICAgICAgICAvLyBodHRwczovL2Jvb3RzdHJhcC1kYXRlcGlja2VyLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9vcHRpb25zLmh0bWwjb3B0aW9uc1xuICAgICAgICAgIG5hbWU6IFwic3RhcnREYXRlXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBDYW4gdGFrZSBhIERhdGUgb3IgYSBzdHJpbmdcbiAgICAgICAgICAvLyBodHRwczovL2Jvb3RzdHJhcC1kYXRlcGlja2VyLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9vcHRpb25zLmh0bWwjb3B0aW9uc1xuICAgICAgICAgIG5hbWU6IFwiZW5kRGF0ZVwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgICBkZWZhdWx0OiBcIlwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJ0b2RheUhpZ2hsaWdodDpib29sZWFuXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIndlZWtTdGFydDpudW1iZXJcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiY2xlYXJCdG46Ym9vbGVhblwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiYXV0b0Nsb3NlOmJvb2xlYW5cIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiZGF5c09mV2Vla0hpZ2hsaWdodGVkOnN0cmluZ1wiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgICBkZWZhdWx0OiBcIlwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkaXNhYmxlVG91Y2hLZXlib2FyZDpib29sZWFuXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9LFxuICAgIGFmdGVyUmVuZGVyOiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgJGVsID0gJChlbCkuaXMoXCIud2lkZ2V0LWRhdGVwaWNrZXJcIilcbiAgICAgICAgPyAkKGVsKVxuICAgICAgICA6ICQoZWwpLmZpbmQoXCIud2lkZ2V0LWRhdGVwaWNrZXJcIik7XG5cbiAgICAgIHZhciBwaWNrZXJXaWRnZXQgPSAkZWxcbiAgICAgICAgLmJvb3RzdHJhcERQKHtcbiAgICAgICAgICBlbmFibGVPblJlYWRvbmx5OiBmYWxzZSxcbiAgICAgICAgICBmb3JtYXQ6IHF1ZXN0aW9uLmRhdGVGb3JtYXQsXG4gICAgICAgICAgc3RhcnREYXRlOiAhIXF1ZXN0aW9uLnN0YXJ0RGF0ZVxuICAgICAgICAgICAgPyBxdWVzdGlvbi5zdGFydERhdGVcbiAgICAgICAgICAgIDogcXVlc3Rpb24ucmVuZGVyZWRNaW4sXG4gICAgICAgICAgZW5kRGF0ZTogISFxdWVzdGlvbi5lbmREYXRlID8gcXVlc3Rpb24uZW5kRGF0ZSA6IHF1ZXN0aW9uLnJlbmRlcmVkTWF4LFxuICAgICAgICAgIHRvZGF5SGlnaGxpZ2h0OiBxdWVzdGlvbi50b2RheUhpZ2hsaWdodCxcbiAgICAgICAgICB3ZWVrU3RhcnQ6IHF1ZXN0aW9uLndlZWtTdGFydCxcbiAgICAgICAgICBjbGVhckJ0bjogcXVlc3Rpb24uY2xlYXJCdG4sXG4gICAgICAgICAgYXV0b2Nsb3NlOiBxdWVzdGlvbi5hdXRvQ2xvc2UsXG4gICAgICAgICAgZGF5c09mV2Vla0hpZ2hsaWdodGVkOiBxdWVzdGlvbi5kYXlzT2ZXZWVrSGlnaGxpZ2h0ZWQsXG4gICAgICAgICAgZGlzYWJsZVRvdWNoS2V5Ym9hcmQ6IHF1ZXN0aW9uLmRpc2FibGVUb3VjaEtleWJvYXJkLFxuICAgICAgICB9KVxuICAgICAgICAub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB2YXIgbmV3RGF0ZSA9IHBpY2tlcldpZGdldC5ib290c3RyYXBEUChcImdldFVUQ0RhdGVcIik7XG4gICAgICAgICAgdmFyIG5ld1ZhbHVlID0gbmV3RGF0ZSAmJiBuZXdEYXRlLnRvVVRDU3RyaW5nKCk7XG4gICAgICAgICAgaWYgKHF1ZXN0aW9uLnZhbHVlICE9IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBxdWVzdGlvbi52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBwaWNrZXJXaWRnZXQuYm9vdHN0cmFwRFAoXG4gICAgICAgICAgXCJzZXRVVENEYXRlXCIsXG4gICAgICAgICAgISFxdWVzdGlvbi52YWx1ZSA/IG5ldyBEYXRlKHF1ZXN0aW9uLnZhbHVlKSA6IFwiXCJcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICBxdWVzdGlvbi52YWx1ZUNoYW5nZWRDYWxsYmFjaygpO1xuICAgICAgcXVlc3Rpb24ucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc1JlYWRPbmx5KSB7XG4gICAgICAgICAgJGVsLnByb3AoXCJyZWFkb25seVwiLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkZWwucmVtb3ZlQXR0cihcInJlYWRvbmx5XCIpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcXVlc3Rpb24ucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICB9LFxuICAgIHdpbGxVbm1vdW50OiBmdW5jdGlvbiAocXVlc3Rpb24sIGVsKSB7XG4gICAgICB2YXIgJGVsID0gJChlbCkuaXMoXCIud2lkZ2V0LWRhdGVwaWNrZXJcIilcbiAgICAgICAgPyAkKGVsKVxuICAgICAgICA6ICQoZWwpLmZpbmQoXCIud2lkZ2V0LWRhdGVwaWNrZXJcIik7XG4gICAgICAkZWwuYm9vdHN0cmFwRFAoXCJkZXN0cm95XCIpO1xuICAgICAgcXVlc3Rpb24ucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICBxdWVzdGlvbi52YWx1ZUNoYW5nZWRDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIHBkZlF1ZXN0aW9uVHlwZTogXCJ0ZXh0XCIsXG4gIH07XG5cbiAgU3VydmV5LkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldCwgXCJjdXN0b210eXBlXCIpO1xufVxuXG5pZiAodHlwZW9mIFN1cnZleSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICBpbml0KFN1cnZleSwgd2luZG93LiQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbml0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvYm9vdHN0cmFwZGF0ZXBpY2tlci5qc1xuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==\n\n//# sourceURL=webpack:///./node_modules/surveyjs-widgets/surveyjs-widgets.js?"); + +/***/ }), + +/***/ "./node_modules/webpack/buildin/global.js": +/*!***********************************!*\ + !*** (webpack)/buildin/global.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n//# sourceURL=webpack:///(webpack)/buildin/global.js?"); + +/***/ }), + +/***/ 0: +/*!**************************************************!*\ + !*** multi babel-polyfill ./NewForm/newForm.jsx ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +eval("__webpack_require__(/*! babel-polyfill */\"./node_modules/babel-polyfill/lib/index.js\");\nmodule.exports = __webpack_require__(/*! ./NewForm/newForm.jsx */\"./NewForm/newForm.jsx\");\n\n\n//# sourceURL=webpack:///multi_babel-polyfill_./NewForm/newForm.jsx?"); + +/***/ }) + +/******/ }); \ No newline at end of file diff --git a/Workers/Resgrid.Workers.Console/Commands/AuditQueueProcessorCommand.cs b/Workers/Resgrid.Workers.Console/Commands/AuditQueueProcessorCommand.cs new file mode 100644 index 00000000..f35145e2 --- /dev/null +++ b/Workers/Resgrid.Workers.Console/Commands/AuditQueueProcessorCommand.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using Quidjibo.Attributes; +using Quidjibo.Commands; + +namespace Resgrid.Workers.Console.Commands +{ + public class AuditQueueProcessorCommand : IQuidjiboCommand + { + public int Id { get; } + public Guid? CorrelationId { get; set; } + public Dictionary Metadata { get; set; } + + public AuditQueueProcessorCommand(int id) + { + Id = id; + } + } +} diff --git a/Workers/Resgrid.Workers.Console/Commands/DispatchScheduledCallsCommand.cs b/Workers/Resgrid.Workers.Console/Commands/DispatchScheduledCallsCommand.cs new file mode 100644 index 00000000..c69a4888 --- /dev/null +++ b/Workers/Resgrid.Workers.Console/Commands/DispatchScheduledCallsCommand.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using Quidjibo.Attributes; +using Quidjibo.Commands; + +namespace Resgrid.Workers.Console.Commands +{ + public class DispatchScheduledCallsCommand : IQuidjiboCommand + { + public int Id { get; } + public Guid? CorrelationId { get; set; } + public Dictionary Metadata { get; set; } + + public DispatchScheduledCallsCommand(int id) + { + Id = id; + } + } +} diff --git a/Workers/Resgrid.Workers.Console/Commands/OidcMaintenanceCommand.cs b/Workers/Resgrid.Workers.Console/Commands/OidcMaintenanceCommand.cs new file mode 100644 index 00000000..8d32e9b4 --- /dev/null +++ b/Workers/Resgrid.Workers.Console/Commands/OidcMaintenanceCommand.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using Quidjibo.Commands; + +namespace Resgrid.Workers.Console.Commands +{ + public class OidcMaintenanceCommand : IQuidjiboCommand + { + public int Id { get; } + public Guid? CorrelationId { get; set; } + public Dictionary Metadata { get; set; } + + public OidcMaintenanceCommand(int id) + { + Id = id; + } + } +} diff --git a/Workers/Resgrid.Workers.Console/Dockerfile b/Workers/Resgrid.Workers.Console/Dockerfile index 53154c86..3da24ccf 100644 --- a/Workers/Resgrid.Workers.Console/Dockerfile +++ b/Workers/Resgrid.Workers.Console/Dockerfile @@ -1,9 +1,12 @@ #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. +ARG BUILD_VERSION=3.5.0 -FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base +FROM mcr.microsoft.com/dotnet/runtime:6.0.1-bullseye-slim-amd64 AS base +ARG BUILD_VERSION WORKDIR /app -FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build +FROM mcr.microsoft.com/dotnet/sdk:6.0.101-bullseye-slim-amd64 AS build +ARG BUILD_VERSION WORKDIR /src COPY ["Workers/Resgrid.Workers.Console/Resgrid.Workers.Console.csproj", "Workers/Resgrid.Workers.Console/"] @@ -20,21 +23,25 @@ COPY ["Repositories/Resgrid.Repositories.DataRepository/Resgrid.Repositories.Dat COPY ["Providers/Resgrid.Providers.Number/Resgrid.Providers.Number.csproj", "Providers/Resgrid.Providers.Number/"] COPY ["Providers/Resgrid.Providers.Firebase/Resgrid.Providers.Firebase.csproj", "Providers/Resgrid.Providers.Firebase/"] COPY ["Providers/Resgrid.Providers.Email/Resgrid.Providers.Email.csproj", "Providers/Resgrid.Providers.Email/"] -COPY ["Providers/Resgrid.Providers.Audio/Resgrid.Providers.Audio.csproj", "Providers/Resgrid.Providers.Audio/"] COPY ["Providers/Resgrid.Providers.Marketing/Resgrid.Providers.Marketing.csproj", "Providers/Resgrid.Providers.Marketing/"] COPY ["Providers/Resgrid.Providers.Pdf/Resgrid.Providers.Pdf.csproj", "Providers/Resgrid.Providers.Pdf/"] COPY ["Providers/Resgrid.Providers.Claims/Resgrid.Providers.Claims.csproj", "Providers/Resgrid.Providers.Claims/"] COPY ["Workers/Resgrid.Workers.Framework/Resgrid.Workers.Framework.csproj", "Workers/Resgrid.Workers.Framework/"] COPY ["Providers/Resgrid.Providers.Migrations/Resgrid.Providers.Migrations.csproj", "Providers/Resgrid.Providers.Migrations/"] +COPY ["Providers/Resgrid.Providers.Voip/Resgrid.Providers.Voip.csproj", "Providers/Resgrid.Providers.Voip/"] RUN dotnet restore "Workers/Resgrid.Workers.Console/Resgrid.Workers.Console.csproj" COPY . . WORKDIR "/src/Workers/Resgrid.Workers.Console" -RUN dotnet build "Resgrid.Workers.Console.csproj" -c Release -o /app/build FROM build AS publish -RUN dotnet publish "Resgrid.Workers.Console.csproj" -c Release -o /app/publish +ARG BUILD_VERSION +RUN dotnet publish "Resgrid.Workers.Console.csproj" -c Release -o /app/publish -p:Version=${BUILD_VERSION} FROM base AS final +## Add the wait script to the image +ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.9.0/wait wait +RUN chmod +x wait + WORKDIR /app ## START - INSTALL WKHTMLTOPDF @@ -57,4 +64,4 @@ RUN set -xe \ COPY --from=publish /app/publish . -ENTRYPOINT ["dotnet", "Resgrid.Workers.Console.dll"] +ENTRYPOINT ["sh", "-c", "./wait && dotnet Resgrid.Workers.Console.dll"] diff --git a/Workers/Resgrid.Workers.Console/Program.cs b/Workers/Resgrid.Workers.Console/Program.cs index 4d67c0e6..8a3c9520 100644 --- a/Workers/Resgrid.Workers.Console/Program.cs +++ b/Workers/Resgrid.Workers.Console/Program.cs @@ -65,11 +65,10 @@ static async Task Main(string[] args) { services.AddSingleton(); } - else - { - services.AddSingleton(); - services.AddSingleton(); - } + + services.AddSingleton(); + services.AddSingleton(); + }) .ConfigureLogging((hostingContext, logging) => { logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); @@ -84,12 +83,14 @@ private static void Prime() System.Console.WriteLine("Initializing Dependencies..."); if (!String.IsNullOrWhiteSpace(Configuration["DOTNET_RUNNING_IN_CONTAINER"])) - ConfigProcessor.LoadAndProcessConfig(ConfigurationManager.AppSettings["ConfigPath"]); + ConfigProcessor.LoadAndProcessConfig(System.Configuration.ConfigurationManager.AppSettings["ConfigPath"]); SetConnectionString(); Bootstrapper.Initialize(); + Resgrid.Framework.Logging.Initialize(ExternalErrorConfig.ExternalErrorServiceUrlForWebjobs); + var eventAggragator = Bootstrapper.GetKernel().Resolve(); var outbound = Bootstrapper.GetKernel().Resolve(); var coreEventService = Bootstrapper.GetKernel().Resolve(); @@ -97,9 +98,9 @@ private static void Prime() SerializerHelper.WarmUpProtobufSerializer(); if (Resgrid.Config.PaymentProviderConfig.IsTestMode) - StripeConfiguration.SetApiKey(Resgrid.Config.PaymentProviderConfig.TestApiKey); + StripeConfiguration.ApiKey = Resgrid.Config.PaymentProviderConfig.TestApiKey; else - StripeConfiguration.SetApiKey(Resgrid.Config.PaymentProviderConfig.ProductionApiKey); + StripeConfiguration.ApiKey = Resgrid.Config.PaymentProviderConfig.ProductionApiKey; System.Console.WriteLine("Finished Initializing Dependencies."); } @@ -119,7 +120,7 @@ private static void LoadConfiguration(string[] args) private static void SetConnectionString() { - var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); + var config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings"); //var test = Configuration["ConnectionStrings:ResgridContext"]; @@ -132,7 +133,7 @@ private static void SetConnectionString() connectionStringsSection.ConnectionStrings.Add(new ConnectionStringSettings("ResgridContext", DataConfig.ConnectionString)); config.Save(); - ConfigurationManager.RefreshSection("connectionStrings"); + System.Configuration.ConfigurationManager.RefreshSection("connectionStrings"); } } @@ -303,6 +304,12 @@ await client.ScheduleAsync("Status Schedule", new Commands.StatusScheduleCommand(11), Cron.MinuteIntervals(5), stoppingToken); + + _logger.Log(LogLevel.Information, "Scheduling Dispatch Scheduled Calls"); + await client.ScheduleAsync("Scheduled Calls", + new Commands.StatusScheduleCommand(12), + Cron.MinuteIntervals(5), + stoppingToken); } else { @@ -383,7 +390,7 @@ private static IServiceProvider CreateServices() // Add SQL Server support to FluentMigrator .AddSqlServer() // Set the connection string - .WithGlobalConnectionString(ConfigurationManager.ConnectionStrings["ResgridContext"].ConnectionString) + .WithGlobalConnectionString(System.Configuration.ConfigurationManager.ConnectionStrings["ResgridContext"].ConnectionString) // Define the assembly containing the migrations .ScanIn(typeof(M0001_InitialMigration).Assembly).For.Migrations().For.EmbeddedResources()) // Enable logging to console in the FluentMigrator way diff --git a/Workers/Resgrid.Workers.Console/Resgrid.Workers.Console.csproj b/Workers/Resgrid.Workers.Console/Resgrid.Workers.Console.csproj index 48a51f20..69bb77a8 100644 --- a/Workers/Resgrid.Workers.Console/Resgrid.Workers.Console.csproj +++ b/Workers/Resgrid.Workers.Console/Resgrid.Workers.Console.csproj @@ -1,7 +1,7 @@  Exe - netcoreapp3.1 + net6.0 Linux ..\.. Debug;Release;Docker @@ -19,18 +19,18 @@ - - - - - - - - - - - - + + + + + + + + + + + + @@ -42,7 +42,6 @@ - @@ -54,6 +53,7 @@ + diff --git a/Workers/Resgrid.Workers.Console/Tasks/AuditQueuesProcessorTask.cs b/Workers/Resgrid.Workers.Console/Tasks/AuditQueuesProcessorTask.cs new file mode 100644 index 00000000..7c9622e0 --- /dev/null +++ b/Workers/Resgrid.Workers.Console/Tasks/AuditQueuesProcessorTask.cs @@ -0,0 +1,52 @@ +using Microsoft.Extensions.Logging; +using Quidjibo.Handlers; +using Quidjibo.Misc; +using Resgrid.Model; +using Resgrid.Model.Events; +using Resgrid.Providers.Bus.Rabbit; +using Resgrid.Workers.Console.Commands; +using Resgrid.Workers.Framework.Logic; +using System.Threading; +using System.Threading.Tasks; + +namespace Resgrid.Workers.Console.Tasks +{ + public class AuditQueuesProcessorTask : IQuidjiboHandler + { + private bool _running = true; + public string Name => "Audit Queue Processor"; + public int Priority => 1; + public ILogger _logger; + + public AuditQueuesProcessorTask(ILogger logger) + { + _logger = logger; + } + + public async Task ProcessAsync(AuditQueueProcessorCommand command, IQuidjiboProgress progress, CancellationToken cancellationToken) + { + if (progress != null) + progress.Report(1, $"Starting the {Name} Task"); + + RabbitInboundQueueProvider queue = new RabbitInboundQueueProvider(); + queue.AuditEventQueueReceived += OnAuditEventQueueReceived; + + await queue.Start(); + + while (!cancellationToken.IsCancellationRequested) + { + Thread.Sleep(500); + } + + if (progress != null) + progress.Report(100, $"Finishing the {Name} Task"); + } + + private async Task OnAuditEventQueueReceived(AuditEvent auditEvent) + { + _logger.LogInformation($"{Name}: Audit Queue Received with an id of {auditEvent.EventId}, starting processing..."); + await AuditQueueLogic.ProcessAuditQueueItem(auditEvent); + _logger.LogInformation($"{Name}: Finished processing of Payment queue item with an id of {auditEvent.EventId}."); + } + } +} diff --git a/Workers/Resgrid.Workers.Console/Tasks/CalendarNotificationTask.cs b/Workers/Resgrid.Workers.Console/Tasks/CalendarNotificationTask.cs index 1515aa9d..d0066dcc 100644 --- a/Workers/Resgrid.Workers.Console/Tasks/CalendarNotificationTask.cs +++ b/Workers/Resgrid.Workers.Console/Tasks/CalendarNotificationTask.cs @@ -62,7 +62,7 @@ public async Task ProcessAsync(CalendarNotificationCommand command, IQuidjiboPro } else { - progress.Report(6, "CalendarNotification::No Calendar Items to Notify"); + //progress.Report(6, "CalendarNotification::No Calendar Items to Notify"); } //}, cancellationToken); diff --git a/Workers/Resgrid.Workers.Console/Tasks/DispatchScheduledCallsTask.cs b/Workers/Resgrid.Workers.Console/Tasks/DispatchScheduledCallsTask.cs new file mode 100644 index 00000000..9281d526 --- /dev/null +++ b/Workers/Resgrid.Workers.Console/Tasks/DispatchScheduledCallsTask.cs @@ -0,0 +1,68 @@ +using Autofac; +using Microsoft.Extensions.Logging; +using Quidjibo.Handlers; +using Quidjibo.Misc; +using Resgrid.Model.Queue; +using Resgrid.Model.Services; +using Resgrid.Workers.Console.Commands; +using Resgrid.Workers.Framework; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace Resgrid.Workers.Console.Tasks +{ + public class DispatchScheduledCallsTask : IQuidjiboHandler + { + public string Name => "Dispatch Scheduled Calls"; + public int Priority => 1; + public ILogger _logger; + + public DispatchScheduledCallsTask(ILogger logger) + { + _logger = logger; + } + + public async Task ProcessAsync(DispatchScheduledCallsCommand command, IQuidjiboProgress progress, CancellationToken cancellationToken) + { + try + { + progress.Report(1, $"Starting the {Name} Task"); + + IUserProfileService _userProfileService = null; + var callsService = Bootstrapper.GetKernel().Resolve(); + var queueService = Bootstrapper.GetKernel().Resolve(); + + var pendingCalls = await callsService.GetAllNonDispatchedScheduledCallsWithinDateRange(DateTime.UtcNow.AddMinutes(-5), DateTime.UtcNow.AddMinutes(5)); + + if (pendingCalls != null && pendingCalls.Any()) + { + foreach (var call in pendingCalls) + { + var cqi = new CallQueueItem(); + cqi.Call = await callsService.PopulateCallData(call, true, false, false, true, true, true, true); + + if (cqi.Call.Dispatches != null && cqi.Call.Dispatches.Any()) + cqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(cqi.Call.Dispatches.Select(x => x.UserId).ToList()); + + var result = await queueService.EnqueueCallBroadcastAsync(cqi, cancellationToken); + + if (result) + { + call.HasBeenDispatched = true; + await callsService.SaveCallAsync(call); + } + } + } + + progress.Report(100, $"Finishing the {Name} Task"); + } + catch (Exception ex) + { + Resgrid.Framework.Logging.LogException(ex); + _logger.LogError(ex.ToString()); + } + } + } +} diff --git a/Workers/Resgrid.Workers.Console/Tasks/OidcMaintenanceTask.cs b/Workers/Resgrid.Workers.Console/Tasks/OidcMaintenanceTask.cs new file mode 100644 index 00000000..88376e42 --- /dev/null +++ b/Workers/Resgrid.Workers.Console/Tasks/OidcMaintenanceTask.cs @@ -0,0 +1,61 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Quidjibo.Handlers; +using Quidjibo.Misc; +using Resgrid.Workers.Console.Commands; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Resgrid.Workers.Console.Tasks +{ + public class OidcMaintenanceTask : IQuidjiboHandler + { + public string Name => "OIDC Maintenance"; + public int Priority => 1; + public ILogger _logger; + + public OidcMaintenanceTask(ILogger logger) + { + _logger = logger; + } + + public async Task ProcessAsync(OidcMaintenanceCommand command, IQuidjiboProgress progress, CancellationToken cancellationToken) + { + try + { + progress.Report(1, $"Starting the {Name} Task"); + + + + progress.Report(100, $"Finishing the {Name} Task"); + } + catch (Exception ex) + { + Resgrid.Framework.Logging.LogException(ex); + _logger.LogError(ex.ToString()); + } + } + + ///// + ///// Configure the dependency injection services + ///// + //private static IServiceProvider CreateServices() + //{ + // return new ServiceCollection() + // .AddOpenIddict() + // // Register the OpenIddict core components. + // .AddCore(options => + // { + // // Configure OpenIddict to use the Entity Framework Core stores and models. + // // Note: call ReplaceDefaultEntities() to replace the default OpenIddict entities. + // options.UseEntityFrameworkCore() + // .UseDbContext() + // .ReplaceDefaultEntities(); + + // // Enable Quartz.NET integration. + // //options.UseQuartz(); + // }); + //} + } +} diff --git a/Workers/Resgrid.Workers.Console/Tasks/QueuesProcessorTask.cs b/Workers/Resgrid.Workers.Console/Tasks/QueuesProcessorTask.cs index f08d8e50..fa17569c 100644 --- a/Workers/Resgrid.Workers.Console/Tasks/QueuesProcessorTask.cs +++ b/Workers/Resgrid.Workers.Console/Tasks/QueuesProcessorTask.cs @@ -2,6 +2,7 @@ using Quidjibo.Handlers; using Quidjibo.Misc; using Resgrid.Model; +using Resgrid.Model.Events; using Resgrid.Model.Queue; using Resgrid.Providers.Bus.Rabbit; using Resgrid.Workers.Console.Commands; @@ -39,6 +40,7 @@ public async Task ProcessAsync(QueuesProcessorCommand command, IQuidjiboProgress queue.ShiftNotificationQueueReceived += OnShiftNotificationQueueReceived; queue.CqrsEventQueueReceived += OnCqrsEventQueueReceived; queue.PaymentEventQueueReceived += OnPaymentEventQueueReceived; + queue.AuditEventQueueReceived += OnAuditEventQueueReceived; await queue.Start(); @@ -47,15 +49,6 @@ public async Task ProcessAsync(QueuesProcessorCommand command, IQuidjiboProgress Thread.Sleep(500); } - //await Task.Factory.StartNew(() => - //{ - // // Keep alive - // while (_running) - // { - // Thread.Sleep(1000); - // } - //}, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Default); - if (progress != null) progress.Report(100, $"Finishing the {Name} Task"); } @@ -108,5 +101,12 @@ private async Task OnPaymentEventQueueReceived(CqrsEvent cqrs) await PaymentQueueLogic.ProcessPaymentQueueItem(cqrs); _logger.LogInformation($"{Name}: Finished processing of Payment queue item with type of {cqrs.Type}."); } + + private async Task OnAuditEventQueueReceived(AuditEvent auditEvent) + { + _logger.LogInformation($"{Name}: Audit Queue Received with an id of {auditEvent.EventId}, starting processing..."); + await AuditQueueLogic.ProcessAuditQueueItem(auditEvent); + _logger.LogInformation($"{Name}: Finished processing of Audit queue item with an id of {auditEvent.EventId}."); + } } } diff --git a/Workers/Resgrid.Workers.Console/Tasks/TrainingNotiferTask.cs b/Workers/Resgrid.Workers.Console/Tasks/TrainingNotiferTask.cs index 268eaae3..93931cf9 100644 --- a/Workers/Resgrid.Workers.Console/Tasks/TrainingNotiferTask.cs +++ b/Workers/Resgrid.Workers.Console/Tasks/TrainingNotiferTask.cs @@ -47,7 +47,7 @@ public async Task ProcessAsync(TrainingNotiferCommand command, IQuidjiboProgress var qi = new TrainingNotifierQueueItem(); qi.Training = training; - progress.Report(3, "TrainingNotifer::Processing Training Notification: " + qi.Training.TrainingId); + //progress.Report(3, "TrainingNotifer::Processing Training Notification: " + qi.Training.TrainingId); var result = await logic.Process(qi); if (result.Item1) diff --git a/Workers/Resgrid.Workers.Framework/Backend/Guardian/GuardianCommand.cs b/Workers/Resgrid.Workers.Framework/Backend/Guardian/GuardianCommand.cs deleted file mode 100644 index e1ca70b8..00000000 --- a/Workers/Resgrid.Workers.Framework/Backend/Guardian/GuardianCommand.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Threading.Tasks; -using Resgrid.Model; -using Resgrid.Model.Services; - -namespace Resgrid.Workers.Framework.Backend -{ - public class GuardianCommand : ICommand - { - private readonly IJobsService _jobsService; - - public GuardianCommand(IJobsService jobsService) - { - _jobsService = jobsService; - - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(GuardianQueueItem item) - { - if (item != null && item.Job != null) - { - if (item.Job.LastCheckTimestamp.HasValue && (item.Job.DoRestart.HasValue == false || item.Job.DoRestart == false)) - { - if (item.Job.LastCheckTimestamp.Value.AddSeconds(item.Job.CheckInterval * 3.5) < DateTime.UtcNow) - { - await _jobsService.MarkJobForResetAsync((JobTypes)item.Job.JobType); - } - } - } - - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Backend/Guardian/GuardianQueue.cs b/Workers/Resgrid.Workers.Framework/Backend/Guardian/GuardianQueue.cs deleted file mode 100644 index 42fc0f8b..00000000 --- a/Workers/Resgrid.Workers.Framework/Backend/Guardian/GuardianQueue.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Services; - -namespace Resgrid.Workers.Framework.Backend -{ - public class GuardianQueue : IQueue - { - private static bool _cleared; - private static object _lock; - private static bool _isLocked; - private static Queue _queue; - - private readonly IJobsService _jobsService; - - public GuardianQueue(IJobsService jobsService) - { - _jobsService = jobsService; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - Clear(); - - var t1 = new Task(async () => - { - try - { - var items = await _jobsService.GetAllBatchJobsAsync(); - - foreach (var i in items) - { - GuardianQueueItem cqi = new GuardianQueueItem(); - cqi.Job = i; - - _queue.Enqueue(cqi); - } - - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - } - }); - - t1.Start(); - } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - - _queue.Clear(); - - return _cleared; - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void AddItem(GuardianQueueItem item) - { - _queue.Enqueue(item); - } - - public GuardianQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - await _jobsService.SetJobAsCheckedAsync(JobTypes.Guardian); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(1000); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Backend/Guardian/GuardianQueueItem.cs b/Workers/Resgrid.Workers.Framework/Backend/Guardian/GuardianQueueItem.cs deleted file mode 100644 index 81fba6fb..00000000 --- a/Workers/Resgrid.Workers.Framework/Backend/Guardian/GuardianQueueItem.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Resgrid.Model; - -namespace Resgrid.Workers.Framework.Backend -{ - public class GuardianQueueItem : QueueItem - { - public Job Job { get; set; } - } -} \ No newline at end of file diff --git a/Workers/Resgrid.Workers.Framework/Backend/Heartbeat/HeartbeatCommand.cs b/Workers/Resgrid.Workers.Framework/Backend/Heartbeat/HeartbeatCommand.cs deleted file mode 100644 index 757d427a..00000000 --- a/Workers/Resgrid.Workers.Framework/Backend/Heartbeat/HeartbeatCommand.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Threading.Tasks; -using Autofac; -using Newtonsoft.Json; -using Resgrid.Model; -using Resgrid.Model.Services; - -namespace Resgrid.Workers.Framework.Backend.Heartbeat -{ - public class HeartbeatCommand : ICommand - { - private IJobsService _jobsService; - private IDistributionListsService _distributionListsService; - - public HeartbeatCommand(/*IJobsService jobsService, IDistributionListsService distributionListsService*/) - { - //_jobsService = jobsService; - //_distributionListsService = distributionListsService; - - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(HeartbeatQueueItem item) - { - _jobsService = Bootstrapper.GetKernel().Resolve(); - await _jobsService.SetJobAsCheckedAsync(JobTypes.Heartbeat); - - if (item != null) - { - _distributionListsService = Bootstrapper.GetKernel().Resolve(); - - if (item.Type == HeartbeatTypes.Worker) - { - dynamic dynamicData = JsonConvert.DeserializeObject(item.Data); - - await _jobsService.SetJobAsCheckedAsync((JobTypes)int.Parse(dynamicData.WorkerType.ToString()), DateTime.Parse(dynamicData.TimeStamp.ToString())); - } - else if (item.Type == HeartbeatTypes.DListCheck) - { - dynamic dynamicData = JsonConvert.DeserializeObject(item.Data); - - var dlist = await _distributionListsService.GetDistributionListByIdAsync(int.Parse(dynamicData.ListId.ToString())); - - dlist.IsFailure = bool.Parse(dynamicData.IsFailure.ToString()); - dlist.ErrorMessage = dynamicData.ErrorMessage.ToString(); - dlist.LastCheck = DateTime.Parse(dynamicData.TimeStamp.ToString()); - - await _distributionListsService.SaveDistributionListOnlyAsync(dlist); - } - } - - _jobsService = null; - _distributionListsService = null; - - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Backend/Heartbeat/HeartbeatQueue.cs b/Workers/Resgrid.Workers.Framework/Backend/Heartbeat/HeartbeatQueue.cs deleted file mode 100644 index f2164ffc..00000000 --- a/Workers/Resgrid.Workers.Framework/Backend/Heartbeat/HeartbeatQueue.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Azure.ServiceBus; -using Microsoft.Azure.ServiceBus.InteropExtensions; -using Resgrid.Framework; -using Resgrid.Model; -using Message = Microsoft.Azure.ServiceBus.Message; - -namespace Resgrid.Workers.Framework.Backend.Heartbeat -{ - public class HeartbeatQueue : IQueue - { - private bool _cleared; - private object _lock; - private bool _isLocked; - private static Queue _queue; - - public HeartbeatQueue() - { - _queue = new Queue(); - _cleared = false; - - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - - var t1 = new Task(() => - { - try - { - Message message = null; - while (message != null) - { - try - { - var queueItem = new HeartbeatQueueItem(); - - if (message.UserProperties["Type"] != null) - queueItem.Type = (HeartbeatTypes) int.Parse(message.UserProperties["Type"].ToString()); - - //if (message.Properties["Timestamp"] != null) - // queueItem.Timestamp = DateTime.Parse(message.Properties["Timestamp"].ToString()); - - try - { - queueItem.Data = message.GetBody(); - _queue.Enqueue(queueItem); - - // Remove message from subscription - //message.Complete(); - } - catch (System.ServiceModel.FaultException) - { - message = null; - } - catch (TimeoutException) - { - message = null; - } - catch (MessageLockLostException) - { - } - catch (InvalidOperationException) - { - //message.Complete(); - } - } - catch (MessageLockLostException) - { - } - catch (Exception ex) - { - Logging.LogException(ex); - - // Indicate a problem, unlock message in subscription - //message.Abandon(); - } - } - } - finally - { - _isLocked = false; - _cleared = false; - } - }); - - t1.Start(); - } - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - _queue.Clear(); - - return _cleared; - } - - public void AddItem(HeartbeatQueueItem item) - { - _queue.Enqueue(item); - } - - public HeartbeatQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(500); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Backend/Heartbeat/HeartbeatQueueItem.cs b/Workers/Resgrid.Workers.Framework/Backend/Heartbeat/HeartbeatQueueItem.cs deleted file mode 100644 index 46c02121..00000000 --- a/Workers/Resgrid.Workers.Framework/Backend/Heartbeat/HeartbeatQueueItem.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using Resgrid.Model; - -namespace Resgrid.Workers.Framework.Backend.Heartbeat -{ - public class HeartbeatQueueItem : QueueItem - { - public HeartbeatTypes Type { get; set; } - //public DateTime Timestamp { get; set; } - public string Data { get; set; } - } -} \ No newline at end of file diff --git a/Workers/Resgrid.Workers.Framework/Backend/Scout/ScoutCommand.cs b/Workers/Resgrid.Workers.Framework/Backend/Scout/ScoutCommand.cs deleted file mode 100644 index d20d735b..00000000 --- a/Workers/Resgrid.Workers.Framework/Backend/Scout/ScoutCommand.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.Net; -using System.Text; -using System.Threading.Tasks; -using Resgrid.Model; -using Resgrid.Model.Services; -using RestSharp; - -namespace Resgrid.Workers.Framework.Backend.Scout -{ - internal class StatusResult - { - /// - /// The UserId GUID/UUID for the user status being return - /// - public string UserId { get; set; } - - /// - /// The full name of the user for the status being returned - /// - public string Name { get; set; } - - /// - /// The current action/status type for the user - /// - public ActionTypes ActionType { get; set; } - - /// - /// The current staffing level (state) type for the user - /// - public UserStateTypes StateType { get; set; } - - /// - /// The timestamp of the last state/staffing level. This is converted UTC to the departments, or users, TimeZone. - /// - public DateTime StateTimestamp { get; set; } - - /// - /// The current action/status destination id for the user - /// - public string DestinationId { get; set; } - - /// - /// The current action/status destination name for the user - /// - public string DestinationName { get; set; } - - /// - /// The timestamp of the last action. This is converted UTC to the departments, or users, TimeZone. - /// - public DateTime Timestamp { get; set; } - } - - internal class StatusInput - { - /// - /// UserId (GUID/UUID) of the User to set. This field will be ignored if the input is used on a - /// function that is setting status for the current user. - /// - public string UserId { get; set; } - - /// - /// The ActionType/Status of the user to set for the user. - /// - public ActionTypes ActionType { get; set; } - - public int RespondingTo { get; set; } - - public string Geolocation { get; set; } - } - - public class ScoutCommand : ICommand - { - private readonly IEmailService _emailService; - private readonly IJobsService _jobsService; - - public ScoutCommand(IEmailService emailService, IJobsService jobsService) - { - _emailService = emailService; - _jobsService = jobsService; - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(ScoutQueueItem item) - { - var client = new RestClient(Config.SystemBehaviorConfig.ResgridApiBaseUrl); - - var setStatusRequest = new RestRequest("api/v2/Status/SetCurrentStatus", Method.POST); - var getStatusRequest = new RestRequest("api/v2/Status/GetCurrentStatus", Method.GET); - - var rnd = new Random(); - var type = (ActionTypes)rnd.Next(0, 3); - - var statusInput = new StatusInput(); - statusInput.ActionType = type; - setStatusRequest.AddObject(statusInput); - - var setStatusResponse = client.Execute(setStatusRequest); - var getStatusResponse = client.Execute(getStatusRequest); - - if (setStatusResponse.StatusCode != HttpStatusCode.Created) - { - var systemNotificaiton = new EmailNotification(); - systemNotificaiton.Body = "Scout Failure! Was not able to set a user status via the API. Please check and/or restart the Resgrid API Cloud Service instances and ensure Azure is running properly and not suffering from a service outtage."; - systemNotificaiton.From = "systemcheck@resgrid.com"; - systemNotificaiton.Name = "Api Scout"; - systemNotificaiton.Subject = string.Format("[RGSYS] Api Scout Failure: {0}", DateTime.UtcNow); - - _emailService.Notify(systemNotificaiton); - await _jobsService.SetJobAsCheckedAsync(JobTypes.Scout); - - return true; - } - - if (string.IsNullOrWhiteSpace(getStatusResponse.Content) || getStatusResponse.Data == null || getStatusResponse.Data.ActionType != type) - { - var systemNotificaiton = new EmailNotification(); - systemNotificaiton.Body = "Scout Failure! Did not receive content back from the Resgrid API or did not recieve the correct ActionType back. Please check and/or restart the Resgrid API Cloud Service instances and ensure Azure is running properly and not suffering from a service outtage."; - systemNotificaiton.From = "systemcheck@resgrid.com"; - systemNotificaiton.Name = "Api Scout"; - systemNotificaiton.Subject = string.Format("[RGSYS] Api Scout Failure: {0}", DateTime.UtcNow); - - _emailService.Notify(systemNotificaiton); - await _jobsService.SetJobAsCheckedAsync(JobTypes.Scout); - - return true; - } - - if (setStatusResponse.Content.Contains("Authorization has been denied for this request") || getStatusResponse.Content.Contains("Authorization has been denied for this request")) - { - var systemNotificaiton = new EmailNotification(); - systemNotificaiton.Body = "Scout Failure! Recieved an unauthroized response from the Resgrid API. Please check and/or restart the Resgrid API Cloud Service instances and ensure Azure is running properly and not suffering from a service outtage."; - systemNotificaiton.From = "systemcheck@resgrid.com"; - systemNotificaiton.Name = "Api Scout"; - systemNotificaiton.Subject = string.Format("[RGSYS] Api Scout Failure: {0}", DateTime.UtcNow); - - _emailService.Notify(systemNotificaiton); - - return true; - } - - await _jobsService.SetJobAsCheckedAsync(JobTypes.Scout); - - return false; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Backend/Scout/ScoutQueue.cs b/Workers/Resgrid.Workers.Framework/Backend/Scout/ScoutQueue.cs deleted file mode 100644 index 01983fbf..00000000 --- a/Workers/Resgrid.Workers.Framework/Backend/Scout/ScoutQueue.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Resgrid.Model; -using Resgrid.Model.Services; - -namespace Resgrid.Workers.Framework.Backend.Scout -{ - public class ScoutQueue : IQueue - { - private static bool _cleared; - private static object _lock; - private static bool _isLocked; - private static Queue _queue; - private readonly IJobsService _jobsService; - - public ScoutQueue(IJobsService jobsService) - { - _jobsService = jobsService; - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - Clear(); - - var item = new ScoutQueueItem(); - item.DepartmentId = 1; - item.Username = "TestUser"; - item.DepartmentCode = "XXXX"; - - _queue.Enqueue(item); - - _isLocked = false; - _cleared = false; - } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - - _queue.Clear(); - - return _cleared; - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void AddItem(ScoutQueueItem item) - { - _queue.Enqueue(item); - } - - public ScoutQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - await _jobsService.SetJobAsCheckedAsync(JobTypes.Scout); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(250); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Backend/Scout/ScoutQueueItem.cs b/Workers/Resgrid.Workers.Framework/Backend/Scout/ScoutQueueItem.cs deleted file mode 100644 index dfd8ac39..00000000 --- a/Workers/Resgrid.Workers.Framework/Backend/Scout/ScoutQueueItem.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Resgrid.Model; - -namespace Resgrid.Workers.Framework.Backend.Scout -{ - public class ScoutQueueItem : QueueItem - { - public int DepartmentId { get; set; } - public string Username { get; set; } - public string DepartmentCode { get; set; } - } -} \ No newline at end of file diff --git a/Workers/Resgrid.Workers.Framework/Bootstrapper.cs b/Workers/Resgrid.Workers.Framework/Bootstrapper.cs index b4cee4ae..8e63980b 100644 --- a/Workers/Resgrid.Workers.Framework/Bootstrapper.cs +++ b/Workers/Resgrid.Workers.Framework/Bootstrapper.cs @@ -4,7 +4,6 @@ using CommonServiceLocator; using Microsoft.Extensions.DependencyInjection; using Resgrid.Providers.AddressVerification; -using Resgrid.Providers.Audio; using Resgrid.Providers.Bus; using Resgrid.Providers.Bus.Rabbit; using Resgrid.Providers.Cache; @@ -14,6 +13,7 @@ using Resgrid.Providers.Marketing; using Resgrid.Providers.NumberProvider; using Resgrid.Providers.PdfProvider; +using Resgrid.Providers.Voip; using Resgrid.Repositories.DataRepository; using Resgrid.Services; @@ -44,8 +44,8 @@ public static void Initialize() builder.RegisterModule(new CacheProviderModule()); builder.RegisterModule(new MarketingModule()); builder.RegisterModule(new PdfProviderModule()); - builder.RegisterModule(new AudioProviderModule()); builder.RegisterModule(new FirebaseProviderModule()); + builder.RegisterModule(new VoipProviderModule()); _container = builder.Build(); diff --git a/Workers/Resgrid.Workers.Framework/Logic/AuditQueueLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/AuditQueueLogic.cs new file mode 100644 index 00000000..bf4caeb6 --- /dev/null +++ b/Workers/Resgrid.Workers.Framework/Logic/AuditQueueLogic.cs @@ -0,0 +1,190 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Autofac; +using Resgrid.Framework; +using Resgrid.Model; +using Resgrid.Model.Services; +using Newtonsoft.Json; +using Resgrid.Model.Events; +using Resgrid.Model.Repositories; +using KellermanSoftware.CompareNetObjects; +using Resgrid.Model.Identity; + +namespace Resgrid.Workers.Framework.Logic +{ + public class AuditQueueLogic + { + public static async Task ProcessAuditQueueItem(AuditEvent auditEvent, CancellationToken cancellationToken = default(CancellationToken)) + { + bool success = true; + + if (auditEvent != null) + { + try + { + var auditLogsRepository = Bootstrapper.GetKernel().Resolve(); + var userProfileService = Bootstrapper.GetKernel().Resolve(); + + var profile = await userProfileService.GetProfileByUserIdAsync(auditEvent.UserId); + + var auditLog = new AuditLog(); + auditLog.DepartmentId = auditEvent.DepartmentId; + auditLog.UserId = auditEvent.UserId; + auditLog.LogType = (int)auditEvent.Type; + + switch (auditEvent.Type) + { + case AuditLogTypes.DepartmentSettingsChanged: + auditLog.Message = string.Format("{0} updated the department settings", profile.FullName.AsFirstNameLastName); + var compareLogic = new CompareLogic(); + var departmentSettingsChangedBefore = JsonConvert.DeserializeObject(auditEvent.Before); + var departmentSettingsChangedAfter = JsonConvert.DeserializeObject(auditEvent.After); + ComparisonResult auditCompareResult = compareLogic.Compare(departmentSettingsChangedBefore, departmentSettingsChangedAfter); + auditLog.Data = auditCompareResult.DifferencesString; + break; + case AuditLogTypes.UserAdded: + if (!String.IsNullOrWhiteSpace(auditEvent.After)) + { + var userAddedIdentityUser = JsonConvert.DeserializeObject(auditEvent.After); + var newProfile = await userProfileService.GetProfileByUserIdAsync(userAddedIdentityUser.UserId); + auditLog.Message = string.Format("{0} added new user {1}", profile.FullName.AsFirstNameLastName, newProfile.FullName.AsFirstNameLastName); + + auditLog.Data = $"New UserId: {newProfile.UserId}"; + } + break; + case AuditLogTypes.UserRemoved: + + if (!String.IsNullOrWhiteSpace(auditEvent.Before)) + { + var userRemovedIdentityUser = JsonConvert.DeserializeObject(auditEvent.Before); + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} removed user {userRemovedIdentityUser.FullName.AsFirstNameLastName}"; + auditLog.Data = "No Data"; + } + + break; + case AuditLogTypes.GroupAdded: + if (!String.IsNullOrWhiteSpace(auditEvent.After)) + { + var groupAddedGroup = JsonConvert.DeserializeObject(auditEvent.After); + if (groupAddedGroup.Type.HasValue && groupAddedGroup.Type.Value == (int)DepartmentGroupTypes.Station) + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} added station group {groupAddedGroup.Name}"; + else + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} added organizational group {groupAddedGroup.Name}"; + + auditLog.Data = $"GroupId: {groupAddedGroup.DepartmentGroupId}"; + } + break; + case AuditLogTypes.GroupRemoved: + if (!String.IsNullOrWhiteSpace(auditEvent.Before)) + { + var groupRemovedGroup = JsonConvert.DeserializeObject(auditEvent.Before); + auditLog.Message = string.Format("{0} removed group {1}", profile.FullName.AsFirstNameLastName, groupRemovedGroup.Name); + auditLog.Data = "No Data"; + } + break; + case AuditLogTypes.GroupChanged: + if (!String.IsNullOrWhiteSpace(auditEvent.Before) && !String.IsNullOrWhiteSpace(auditEvent.After)) + { + var groupUpdatedBeforeGroup = JsonConvert.DeserializeObject(auditEvent.Before); + var groupUpdatedAfterGroup = JsonConvert.DeserializeObject(auditEvent.After); + + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated group {groupUpdatedAfterGroup.Name}"; + var compareLogicGroup = new CompareLogic(); + + ComparisonResult resultGroup = compareLogicGroup.Compare(groupUpdatedBeforeGroup, groupUpdatedAfterGroup); + auditLog.Data = resultGroup.DifferencesString; + } + break; + case AuditLogTypes.UnitAdded: + if (!String.IsNullOrWhiteSpace(auditEvent.After)) + { + var unitedAddedUnit = JsonConvert.DeserializeObject(auditEvent.After); + auditLog.Message = string.Format("{0} added unit {1}", profile.FullName.AsFirstNameLastName, unitedAddedUnit.Name); + auditLog.Data = $"UnitId: {unitedAddedUnit.UnitId}"; + } + break; + case AuditLogTypes.UnitRemoved: + if (!String.IsNullOrWhiteSpace(auditEvent.Before)) + { + var unitedRemovedUnit = JsonConvert.DeserializeObject(auditEvent.Before); + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} removed unit {unitedRemovedUnit.Name}"; + auditLog.Data = "No Data"; + } + break; + case AuditLogTypes.UnitChanged: + if (!String.IsNullOrWhiteSpace(auditEvent.Before) && !String.IsNullOrWhiteSpace(auditEvent.After)) + { + var unitUpdatedBeforeUnit = JsonConvert.DeserializeObject(auditEvent.Before); + var unitUpdatedAfterUnit = JsonConvert.DeserializeObject(auditEvent.After); + + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated unit {unitUpdatedAfterUnit.Name}"; + + var compareLogicUnit = new CompareLogic(); + ComparisonResult resultUnit = compareLogicUnit.Compare(unitUpdatedBeforeUnit, unitUpdatedAfterUnit); + auditLog.Data = resultUnit.DifferencesString; + } + break; + case AuditLogTypes.ProfileUpdated: + if (!String.IsNullOrWhiteSpace(auditEvent.Before) && !String.IsNullOrWhiteSpace(auditEvent.After)) + { + var profileUpdatedBeforeProfile = JsonConvert.DeserializeObject(auditEvent.Before); + var profileUpdatedAfterProfile = JsonConvert.DeserializeObject(auditEvent.After); + + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated the profile for {profileUpdatedBeforeProfile.FullName.AsFirstNameLastName}"; + + var compareLogicProfile = new CompareLogic(); + ComparisonResult resultProfile = compareLogicProfile.Compare(profileUpdatedBeforeProfile, profileUpdatedAfterProfile); + auditLog.Data = resultProfile.DifferencesString; + } + break; + case AuditLogTypes.PermissionsChanged: + if (!String.IsNullOrWhiteSpace(auditEvent.Before) && !String.IsNullOrWhiteSpace(auditEvent.After)) + { + var updatePermissionBefore = JsonConvert.DeserializeObject(auditEvent.Before); + var updatePermissionAfter = JsonConvert.DeserializeObject(auditEvent.After); + + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated the department permissions"; + + var compareLogicProfile = new CompareLogic(); + ComparisonResult resultProfile = compareLogicProfile.Compare(updatePermissionBefore, updatePermissionAfter); + auditLog.Data = resultProfile.DifferencesString; + } + break; + case AuditLogTypes.SubscriptionUpdated: + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} changed (upgrade or downgrade) the active subscription of department id {auditEvent.DepartmentId}"; + auditLog.Data = "No Data"; + break; + case AuditLogTypes.SubscriptionBillingInfoUpdated: + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated the subscription billing information for department id {auditEvent.DepartmentId}"; + auditLog.Data = "No Data"; + break; + case AuditLogTypes.SubscriptionCancelled: + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} canceled the active subscription of department id {auditEvent.DepartmentId}"; + auditLog.Data = "No Data"; + break; + case AuditLogTypes.SubscriptionCreated: + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} created a new active subscription for department id {auditEvent.DepartmentId}"; + auditLog.Data = "No Data"; + break; + } + + if (String.IsNullOrWhiteSpace(auditLog.Data)) + auditLog.Data = "No Data"; + + if (!String.IsNullOrWhiteSpace(auditLog.Message)) + { + auditLog.LoggedOn = DateTime.UtcNow; + await auditLogsRepository.SaveOrUpdateAsync(auditLog, cancellationToken); + } + } + catch (Exception ex) + { + Logging.LogException(ex); + } + } + + return success; + } + } +} diff --git a/Workers/Resgrid.Workers.Framework/Logic/BroadcastMessageLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/BroadcastMessageLogic.cs index b58d64ec..db9c7f6f 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/BroadcastMessageLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/BroadcastMessageLogic.cs @@ -1,131 +1,15 @@ using System; using System.Linq; -using System.Threading; using System.Threading.Tasks; using Autofac; -using Microsoft.Azure.ServiceBus; -using Microsoft.Azure.ServiceBus.InteropExtensions; -using Resgrid.Framework; -using Resgrid.Model; using Resgrid.Model.Queue; using Resgrid.Model.Services; -using Newtonsoft.Json; -using Message = Microsoft.Azure.ServiceBus.Message; using System.Collections.Generic; namespace Resgrid.Workers.Framework.Logic { public class BroadcastMessageLogic { - private IQueueService _queueService; - private QueueClient _client = null; - - public BroadcastMessageLogic() - { - while (_client == null) - { - try - { - _client = new QueueClient(Config.ServiceBusConfig.AzureQueueMessageConnectionString, Config.ServiceBusConfig.MessageBroadcastQueueName); - } - catch (TimeoutException) { } - } - } - - public async Task Process(MessageQueueItem item) - { - bool success = true; - - if (Config.SystemBehaviorConfig.IsAzure) - { - var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler) - { - MaxConcurrentCalls = 1, - AutoComplete = false - }; - - // Register the function that will process messages - _client.RegisterMessageHandler(ProcessQueueMessage, messageHandlerOptions); - - //await ProcessQueueMessage(_client.ReceiveAsync()); - } - else - { - return await ProcessMessageQueueItem(item); - } - - _queueService = null; - return false; - } - - public async Task> ProcessQueueMessage(Message message, CancellationToken token) - { - bool success = true; - string result = ""; - - if (message != null) - { - MessageQueueItem mqi = null; - - try - { - var body = message.GetBody(); - - if (!String.IsNullOrWhiteSpace(body)) - { - try - { - mqi = ObjectSerialization.Deserialize(body); - } - catch (Exception ex) - { - success = false; - result = "Unable to parse message body Exception: " + ex.ToString(); - //message.Complete(); - await _client.CompleteAsync(message.SystemProperties.LockToken); - } - - await ProcessMessageQueueItem(mqi); - } - - try - { - if (success) - await _client.CompleteAsync(message.SystemProperties.LockToken); - //message.Complete(); - } - catch (MessageLockLostException) - { - - } - } - catch (Exception ex) - { - result = ex.ToString(); - - if (mqi != null) - { - ex.Data.Add("DepartmentId", mqi.DepartmentId); - - if (mqi.Message != null) - { - ex.Data.Add("MessageId", mqi.Message.MessageId); - ex.Data.Add("SendingUserId", mqi.Message.SendingUserId); - ex.Data.Add("RecievingUserId", mqi.Message.ReceivingUserId); - } - } - - ex.Data.Add("MQI", JsonConvert.SerializeObject(mqi)); - - Logging.LogException(ex); - await _client.AbandonAsync(message.SystemProperties.LockToken); - //message.Abandon(); - } - } - - return new Tuple(success, result); - } - public static async Task ProcessMessageQueueItem(MessageQueueItem mqi) { var _communicationService = Bootstrapper.GetKernel().Resolve(); @@ -209,16 +93,5 @@ public static async Task ProcessMessageQueueItem(MessageQueueItem mqi) _communicationService = null; return true; } - - static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs) - { - //Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}."); - //var context = exceptionReceivedEventArgs.ExceptionReceivedContext; - //Console.WriteLine("Exception context for troubleshooting:"); - //Console.WriteLine($"- Endpoint: {context.Endpoint}"); - //Console.WriteLine($"- Entity Path: {context.EntityPath}"); - //Console.WriteLine($"- Executing Action: {context.Action}"); - return Task.CompletedTask; - } } } diff --git a/Workers/Resgrid.Workers.Framework/Logic/CalendarNotifierLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/CalendarNotifierLogic.cs index 02216f26..dedb509e 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/CalendarNotifierLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/CalendarNotifierLogic.cs @@ -52,10 +52,13 @@ public async Task> Process(CalendarNotifierQueueItem item) else message = $"on {adjustedDateTime.ToShortDateString()} - {adjustedDateTime.ToShortTimeString()} at {item.CalendarItem.Location}"; - foreach (var person in item.CalendarItem.Attendees) + if (ConfigHelper.CanTransmit(department.DepartmentId)) { - var profile = profiles.FirstOrDefault(x => x.UserId == person.UserId); - await _communicationService.SendNotificationAsync(person.UserId, item.CalendarItem.DepartmentId, message, departmentNumber, title, profile); + foreach (var person in item.CalendarItem.Attendees) + { + var profile = profiles.FirstOrDefault(x => x.UserId == person.UserId); + await _communicationService.SendNotificationAsync(person.UserId, item.CalendarItem.DepartmentId, message, departmentNumber, title, profile); + } } } catch (Exception ex) @@ -86,32 +89,35 @@ public async Task> Process(CalendarNotifierQueueItem item) else message = $"on {adjustedDateTime.ToShortDateString()} - {adjustedDateTime.ToShortTimeString()} at {item.CalendarItem.Location}"; - if (items.Any(x => x.StartsWith("D:"))) + if (ConfigHelper.CanTransmit(department.DepartmentId)) { - // Notify the entire department - foreach (var profile in profiles) + if (items.Any(x => x.StartsWith("D:"))) { - await _communicationService.SendNotificationAsync(profile.Key, item.CalendarItem.DepartmentId, message, departmentNumber, title, profile.Value); + // Notify the entire department + foreach (var profile in profiles) + { + await _communicationService.SendNotificationAsync(profile.Key, item.CalendarItem.DepartmentId, message, departmentNumber, title, profile.Value); + } } - } - else - { - var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(item.CalendarItem.DepartmentId); - foreach (var val in items) + else { - int groupId = 0; - if (int.TryParse(val.Replace("G:", ""), out groupId)) + var groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(item.CalendarItem.DepartmentId); + foreach (var val in items) { - var group = groups.FirstOrDefault(x => x.DepartmentGroupId == groupId); - - if (group != null) + int groupId = 0; + if (int.TryParse(val.Replace("G:", ""), out groupId)) { - foreach (var member in group.Members) + var group = groups.FirstOrDefault(x => x.DepartmentGroupId == groupId); + + if (group != null) { - if (profiles.ContainsKey(member.UserId)) - await _communicationService.SendNotificationAsync(member.UserId, item.CalendarItem.DepartmentId, message, departmentNumber, title, profiles[member.UserId]); - else - await _communicationService.SendNotificationAsync(member.UserId, item.CalendarItem.DepartmentId, message, departmentNumber, title, null); + foreach (var member in group.Members) + { + if (profiles.ContainsKey(member.UserId)) + await _communicationService.SendNotificationAsync(member.UserId, item.CalendarItem.DepartmentId, message, departmentNumber, title, profiles[member.UserId]); + else + await _communicationService.SendNotificationAsync(member.UserId, item.CalendarItem.DepartmentId, message, departmentNumber, title, null); + } } } } diff --git a/Workers/Resgrid.Workers.Framework/Logic/CallBroadcast.cs b/Workers/Resgrid.Workers.Framework/Logic/CallBroadcast.cs index ad5bf49b..10b10a34 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/CallBroadcast.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/CallBroadcast.cs @@ -2,26 +2,19 @@ using System.Collections.Generic; using System.Linq; using System.Net.Sockets; -using System.Threading; using System.Threading.Tasks; using Autofac; -using Microsoft.Azure.ServiceBus; -using Microsoft.Azure.ServiceBus.InteropExtensions; using Newtonsoft.Json; using Resgrid.Framework; using Resgrid.Model; using Resgrid.Model.Providers; using Resgrid.Model.Queue; using Resgrid.Model.Services; -using Message = Microsoft.Azure.ServiceBus.Message; namespace Resgrid.Workers.Framework.Logic { public class BroadcastCallLogic { - private IQueueService _queueService; - private QueueClient _client = null; - private static ICommunicationService _communicationService; private static ICallsService _callsService; private static IUserProfileService _userProfilesService; @@ -30,120 +23,6 @@ public class BroadcastCallLogic private static IPersonnelRolesService _rolesService; private static IPrinterProvider _printerProvider; - public BroadcastCallLogic() - { - while (_client == null) - { - try - { - //_client = QueueClient.CreateFromConnectionString(Config.ServiceBusConfig.AzureQueueConnectionString, Config.ServiceBusConfig.CallBroadcastQueueName); - - _client = new QueueClient(Config.ServiceBusConfig.AzureQueueConnectionString, Config.ServiceBusConfig.CallBroadcastQueueName); - } - catch (TimeoutException) { } - } - } - - public async Task Process(CallQueueItem item) - { - bool success = true; - - if (Config.SystemBehaviorConfig.IsAzure) - { - //ProcessQueueMessage(_client.Receive()); - - var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler) - { - MaxConcurrentCalls = 1, - AutoComplete = false - }; - - // Register the function that will process messages - _client.RegisterMessageHandler(ProcessQueueMessage, messageHandlerOptions); - } - else - { - return await ProcessCallQueueItem(item); - } - - _queueService = null; - - return false; - } - - public async Task> ProcessQueueMessage(Message message, CancellationToken token) - { - bool success = true; - string result = ""; - - if (message != null) - { - try - { - var body = message.GetBody(); - - if (!String.IsNullOrWhiteSpace(body)) - { - CallQueueItem cqi = null; - try - { - cqi = ObjectSerialization.Deserialize(body); - } - catch (Exception ex) - { - success = false; - result = "Unable to parse message body Exception: " + ex.ToString(); - //message.DeadLetter(); - await _client.DeadLetterAsync(message.SystemProperties.LockToken); - } - - if (cqi != null && cqi.Call != null && cqi.Call.HasAnyDispatches()) - { - try - { - await ProcessCallQueueItem(cqi); - } - catch (Exception ex) - { - Logging.LogException(ex); - //message.Abandon(); - await _client.DeadLetterAsync(message.SystemProperties.LockToken); - - success = false; - result = ex.ToString(); - } - } - } - else - { - success = false; - result = "Message body is null or empty"; - } - - try - { - //message.Complete(); - await _client.CompleteAsync(message.SystemProperties.LockToken); - } - catch (MessageLockLostException) - { - - } - } - catch (Exception ex) - { - success = false; - result = ex.ToString(); - - Logging.LogException(ex); - //message.Abandon(); - await _client.DeadLetterAsync(message.SystemProperties.LockToken); - } - } - - return new Tuple(success, result); - } - public static async Task ProcessCallQueueItem(CallQueueItem cqi) { try @@ -405,16 +284,5 @@ public static async Task ProcessCallQueueItem(CallQueueItem cqi) return true; } - - static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs) - { - //Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}."); - //var context = exceptionReceivedEventArgs.ExceptionReceivedContext; - //Console.WriteLine("Exception context for troubleshooting:"); - //Console.WriteLine($"- Endpoint: {context.Endpoint}"); - //Console.WriteLine($"- Entity Path: {context.EntityPath}"); - //Console.WriteLine($"- Executing Action: {context.Action}"); - return Task.CompletedTask; - } } } diff --git a/Workers/Resgrid.Workers.Framework/Logic/DistributionListEmailImporterLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/DistributionListEmailImporterLogic.cs index 64249fd0..d862b14a 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/DistributionListEmailImporterLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/DistributionListEmailImporterLogic.cs @@ -51,7 +51,7 @@ public async Task> Process(DistributionListQueueItem item) membership = _usersService.GetMembershipByUserId(member.UserId); if (membership != null && !String.IsNullOrWhiteSpace(membership.Email)) - _emailService.SendDistributionListEmail(email, membership.Email, item.List.Name, $"Resgrid ({item.List.Name}) List", $"{item.List.EmailAddress}@{Config.InboundEmailConfig.ListsDomain}"); + await _emailService.SendDistributionListEmail(email, membership.Email, item.List.Name, $"Resgrid ({item.List.Name}) List", $"{item.List.EmailAddress}@{Config.InboundEmailConfig.ListsDomain}"); } } } diff --git a/Workers/Resgrid.Workers.Framework/Logic/DistributionListLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/DistributionListLogic.cs index 21a83465..fe9898cb 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/DistributionListLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/DistributionListLogic.cs @@ -2,116 +2,17 @@ using System.Linq; using Autofac; using Resgrid.Framework; -using Resgrid.Model; using Resgrid.Model.Queue; using Resgrid.Model.Services; using System.Web; using MimeKit; using System.IO; -using System.Threading; using System.Threading.Tasks; -using Microsoft.Azure.ServiceBus; -using Microsoft.Azure.ServiceBus.InteropExtensions; -using Message = Microsoft.Azure.ServiceBus.Message; namespace Resgrid.Workers.Framework.Logic { public class DistributionListLogic { - private IQueueService _queueService; - private QueueClient _client = null; - - public DistributionListLogic() - { - while (_client == null) - { - try - { - //_client = QueueClient.CreateFromConnectionString(Config.ServiceBusConfig.AzureQueueEmailConnectionString, Config.ServiceBusConfig.EmailBroadcastQueueName); - _client = new QueueClient(Config.ServiceBusConfig.AzureQueueEmailConnectionString, Config.ServiceBusConfig.EmailBroadcastQueueName); - } - catch (TimeoutException) { } - } - } - - public async Task Process(DistributionListQueueItem item) - { - bool success = true; - - if (Config.SystemBehaviorConfig.IsAzure) - { - //ProcessQueueMessage(_client.Receive()); - - var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler) - { - MaxConcurrentCalls = 1, - AutoComplete = false - }; - - // Register the function that will process messages - _client.RegisterMessageHandler(ProcessQueueMessage, messageHandlerOptions); - } - else - { - return await ProcessDistributionListQueueItem(item); - } - - _queueService = null; - return false; - } - - public async Task> ProcessQueueMessage(Message message, CancellationToken token) - { - bool success = true; - string result = ""; - - if (message != null) - { - try - { - var body = message.GetBody(); - - if (!String.IsNullOrWhiteSpace(body)) - { - DistributionListQueueItem dlqi = null; - try - { - dlqi = ObjectSerialization.Deserialize(body); - } - catch (Exception ex) - { - success = false; - result = "Unable to parse message body Exception: " + ex.ToString(); - //message.Complete(); - await _client.CompleteAsync(message.SystemProperties.LockToken); - } - - await ProcessDistributionListQueueItem(dlqi); - } - - try - { - if (success) - await _client.CompleteAsync(message.SystemProperties.LockToken); - //message.Complete(); - } - catch (MessageLockLostException) - { - - } - } - catch (Exception ex) - { - result = ex.ToString(); - Logging.LogException(ex); - //message.Abandon(); - await _client.DeadLetterAsync(message.SystemProperties.LockToken); - } - } - - return new Tuple(success, result); - } - public static async Task ProcessDistributionListQueueItem(DistributionListQueueItem dlqi) { var emailService = Bootstrapper.GetKernel().Resolve(); @@ -152,7 +53,7 @@ public static async Task ProcessDistributionListQueueItem(DistributionList // create an image attachment for the file located at path var attachment = new MimePart(file.FileType) { - ContentObject = new ContentObject(new MemoryStream(file.Data), ContentEncoding.Default), + Content = new MimeContent(new MemoryStream(file.Data), ContentEncoding.Default), ContentDisposition = new ContentDisposition(ContentDisposition.Attachment), ContentTransferEncoding = ContentEncoding.Base64, FileName = file.FileName @@ -163,7 +64,7 @@ public static async Task ProcessDistributionListQueueItem(DistributionList //mailMessage.Attachments.Add(file.Data, file.FileName, file.ContentId, file.FileType, // new HeaderCollection(), NewAttachmentOptions.None, MailTransferEncoding.None); - fileService.DeleteFileAsync(file); + await fileService.DeleteFileAsync(file); } } } @@ -181,7 +82,7 @@ public static async Task ProcessDistributionListQueueItem(DistributionList var user = dlqi.Users.FirstOrDefault(x => x.UserId == member.UserId); if (user != null && !String.IsNullOrWhiteSpace(user.Email)) - emailService.SendDistributionListEmail(mailMessage, user.Email, dlqi.List.Name, dlqi.List.Name, $"{dlqi.List.EmailAddress}@lists.resgrid.com"); + await emailService.SendDistributionListEmail(mailMessage, user.Email, dlqi.List.Name, dlqi.List.Name, $"{dlqi.List.EmailAddress}@lists.resgrid.com"); } catch (Exception ex) { @@ -196,16 +97,5 @@ public static async Task ProcessDistributionListQueueItem(DistributionList return true; } - - static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs) - { - //Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}."); - //var context = exceptionReceivedEventArgs.ExceptionReceivedContext; - //Console.WriteLine("Exception context for troubleshooting:"); - //Console.WriteLine($"- Endpoint: {context.Endpoint}"); - //Console.WriteLine($"- Entity Path: {context.EntityPath}"); - //Console.WriteLine($"- Executing Action: {context.Action}"); - return Task.CompletedTask; - } } } diff --git a/Workers/Resgrid.Workers.Framework/Logic/MaintenanceLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/MaintenanceLogic.cs index 89a56450..98ad8a06 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/MaintenanceLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/MaintenanceLogic.cs @@ -4,7 +4,6 @@ using Autofac; using Resgrid.Model; using Resgrid.Model.Repositories; -using Message = Microsoft.Azure.ServiceBus.Message; namespace Resgrid.Workers.Framework.Logic { diff --git a/Workers/Resgrid.Workers.Framework/Logic/NotificationBroadcastLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/NotificationBroadcastLogic.cs index 4046c6ba..672f3fef 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/NotificationBroadcastLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/NotificationBroadcastLogic.cs @@ -6,113 +6,13 @@ using Resgrid.Workers.Framework.Workers.Notification; using System; using System.Collections.Generic; -using System.Threading; using System.Threading.Tasks; using Autofac; -using Microsoft.Azure.ServiceBus; -using Microsoft.Azure.ServiceBus.InteropExtensions; -using Message = Microsoft.Azure.ServiceBus.Message; namespace Resgrid.Workers.Framework.Logic { public class NotificationBroadcastLogic { - private QueueClient _client = null; - - public NotificationBroadcastLogic() - { - while (_client == null) - { - try - { - //_client = QueueClient.CreateFromConnectionString(Config.ServiceBusConfig.AzureQueueNotificationConnectionString, Config.ServiceBusConfig.NotificaitonBroadcastQueueName); - _client = new QueueClient(Config.ServiceBusConfig.AzureQueueNotificationConnectionString, Config.ServiceBusConfig.NotificaitonBroadcastQueueName); - } - catch (TimeoutException) { } - } - } - - public async Task Process(NotificationItem item) - { - if (Config.SystemBehaviorConfig.IsAzure) - { - var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler) - { - MaxConcurrentCalls = 1, - AutoComplete = false - }; - - // Register the function that will process messages - _client.RegisterMessageHandler(ProcessQueueMessage, messageHandlerOptions); - - //ProcessQueueMessage(_client.Receive()); - } - else - { - return await ProcessNotificationItem(item, Guid.NewGuid().ToString(), ""); - } - - return false; - } - - public async Task> ProcessQueueMessage(Message message, CancellationToken token) - { - bool success = true; - string result = ""; - - if (message != null) - { - try - { - var body = message.GetBody(); - - if (!String.IsNullOrWhiteSpace(body)) - { - NotificationItem ni = null; - try - { - ni = ObjectSerialization.Deserialize(body); - } - catch (Exception ex) - { - success = false; - result = "Unable to parse message body Exception: " + ex.ToString(); - //message.DeadLetter(); - await _client.DeadLetterAsync(message.SystemProperties.LockToken); - } - - await ProcessNotificationItem(ni, message.MessageId, body); - } - else - { - success = false; - result = "Message body is null or empty"; - } - - try - { - //message.Complete(); - await _client.CompleteAsync(message.SystemProperties.LockToken); - } - catch (MessageLockLostException) - { - - } - } - catch (Exception ex) - { - success = false; - result = ex.ToString(); - - Logging.LogException(ex); - //message.Abandon(); - await _client.AbandonAsync(message.SystemProperties.LockToken); - } - } - - return new Tuple(success, result); - } - public static async Task ProcessNotificationItem(NotificationItem ni, string messageId, string body) { if (ni != null) @@ -130,45 +30,48 @@ public static async Task ProcessNotificationItem(NotificationItem ni, stri else item.DepartmentId = await _notificationService.GetDepartmentIdForTypeAsync(ni); - item.Type = (EventTypes)ni.Type; - item.Value = ni.Value; - item.MessageId = messageId; + if (ConfigHelper.CanTransmit(item.DepartmentId)) + { + item.Type = (EventTypes)ni.Type; + item.Value = ni.Value; + item.MessageId = messageId; - if (!String.IsNullOrWhiteSpace(body)) - item.Data = body; - else - item.Data = ObjectSerialization.Serialize(ni); + if (!String.IsNullOrWhiteSpace(body)) + item.Data = body; + else + item.Data = ObjectSerialization.Serialize(ni); - item.ItemId = ni.ItemId; + item.ItemId = ni.ItemId; - var queueItem = new NotificationQueueItem(); - queueItem.Department = await _departmentsService.GetDepartmentByIdAsync(item.DepartmentId, false); - queueItem.DepartmentTextNumber = await _departmentSettingsService.GetTextToCallNumberForDepartmentAsync(item.DepartmentId); - queueItem.NotificationSettings = await _notificationService.GetNotificationsByDepartmentAsync(item.DepartmentId); - queueItem.Profiles = await _userProfileService.GetAllProfilesForDepartmentAsync(item.DepartmentId); + var queueItem = new NotificationQueueItem(); + queueItem.Department = await _departmentsService.GetDepartmentByIdAsync(item.DepartmentId, false); + queueItem.DepartmentTextNumber = await _departmentSettingsService.GetTextToCallNumberForDepartmentAsync(item.DepartmentId); + queueItem.NotificationSettings = await _notificationService.GetNotificationsByDepartmentAsync(item.DepartmentId); + queueItem.Profiles = await _userProfileService.GetAllProfilesForDepartmentAsync(item.DepartmentId); - queueItem.Notifications = new List(); - queueItem.Notifications.Add(item); + queueItem.Notifications = new List(); + queueItem.Notifications.Add(item); - var notificaitons = await _notificationService.ProcessNotificationsAsync(queueItem.Notifications, queueItem.NotificationSettings); - if (notificaitons != null) - { - foreach (var notification in notificaitons) + var notificaitons = await _notificationService.ProcessNotificationsAsync(queueItem.Notifications, queueItem.NotificationSettings); + if (notificaitons != null) { - var text = await _notificationService.GetMessageForTypeAsync(notification); - - if (!String.IsNullOrWhiteSpace(text)) + foreach (var notification in notificaitons) { - foreach (var user in notification.Users) + var text = await _notificationService.GetMessageForTypeAsync(notification); + + if (!String.IsNullOrWhiteSpace(text)) { - if (queueItem.Profiles.ContainsKey(user)) + foreach (var user in notification.Users) { - var profile = queueItem.Profiles[user]; + if (queueItem.Profiles.ContainsKey(user)) + { + var profile = queueItem.Profiles[user]; - if (!_notificationService.AllowToSendViaSms(notification.Type)) - profile.SendNotificationSms = false; + if (!_notificationService.AllowToSendViaSms(notification.Type)) + profile.SendNotificationSms = false; - await _communicationService.SendNotificationAsync(user, notification.DepartmentId, text, queueItem.DepartmentTextNumber, "Notification", profile); + await _communicationService.SendNotificationAsync(user, notification.DepartmentId, text, queueItem.DepartmentTextNumber, "Notification", profile); + } } } } @@ -184,16 +87,5 @@ public static async Task ProcessNotificationItem(NotificationItem ni, stri return true; } - - static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs) - { - //Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}."); - //var context = exceptionReceivedEventArgs.ExceptionReceivedContext; - //Console.WriteLine("Exception context for troubleshooting:"); - //Console.WriteLine($"- Endpoint: {context.Endpoint}"); - //Console.WriteLine($"- Entity Path: {context.EntityPath}"); - //Console.WriteLine($"- Executing Action: {context.Action}"); - return Task.CompletedTask; - } } } diff --git a/Workers/Resgrid.Workers.Framework/Logic/PaymentQueueLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/PaymentQueueLogic.cs index 3e46a6ec..c05e385a 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/PaymentQueueLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/PaymentQueueLogic.cs @@ -1,105 +1,17 @@ using System; -using System.Threading; using System.Threading.Tasks; using Autofac; -using Microsoft.Azure.ServiceBus; -using Microsoft.Azure.ServiceBus.InteropExtensions; using Resgrid.Framework; using Resgrid.Model; -using Resgrid.Model.Queue; using Resgrid.Model.Services; using Stripe; using Newtonsoft.Json; using Stripe.Checkout; -using Message = Microsoft.Azure.ServiceBus.Message; namespace Resgrid.Workers.Framework.Logic { public class PaymentQueueLogic { - private QueueClient _client = null; - - public PaymentQueueLogic() - { - while (_client == null) - { - try - { - //_client = QueueClient.CreateFromConnectionString(Config.ServiceBusConfig.AzureQueueSystemConnectionString, Config.ServiceBusConfig.PaymentQueueName); - _client = new QueueClient(Config.ServiceBusConfig.AzureQueueSystemConnectionString, Config.ServiceBusConfig.PaymentQueueName); - } - catch (TimeoutException) { } - } - } - - public void Process(SystemQueueItem item) - { - var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler) - { - MaxConcurrentCalls = 1, - AutoComplete = false - }; - - // Register the function that will process messages - _client.RegisterMessageHandler(ProcessQueueMessage, messageHandlerOptions); - - //ProcessQueueMessage(_client.Receive()); - } - - public async Task> ProcessQueueMessage(Message message, CancellationToken token) - { - bool success = true; - string result = ""; - - if (message != null) - { - try - { - var body = message.GetBody(); - - if (!String.IsNullOrWhiteSpace(body)) - { - CqrsEvent qi = null; - try - { - qi = ObjectSerialization.Deserialize(body); - } - catch (Exception ex) - { - success = false; - result = "Unable to parse message body Exception: " + ex.ToString(); - //message.Complete(); - await _client.CompleteAsync(message.SystemProperties.LockToken); - } - - success = await ProcessPaymentQueueItem(qi); - } - - try - { - if (success) - await _client.CompleteAsync(message.SystemProperties.LockToken); - //message.Complete(); - } - catch (MessageLockLostException) - { - } - } - catch (Exception ex) - { - Logging.LogException(ex); - Logging.SendExceptionEmail(ex, "PaymentQueueLogic"); - - await _client.AbandonAsync(message.SystemProperties.LockToken); - //message.Abandon(); - success = false; - result = ex.ToString(); - } - } - - return new Tuple(success, result); - } - public static async Task ProcessPaymentQueueItem(CqrsEvent qi) { bool success = true; @@ -195,16 +107,5 @@ public static async Task ProcessPaymentQueueItem(CqrsEvent qi) return success; } - - static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs) - { - //Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}."); - //var context = exceptionReceivedEventArgs.ExceptionReceivedContext; - //Console.WriteLine("Exception context for troubleshooting:"); - //Console.WriteLine($"- Endpoint: {context.Endpoint}"); - //Console.WriteLine($"- Entity Path: {context.EntityPath}"); - //Console.WriteLine($"- Executing Action: {context.Action}"); - return Task.CompletedTask; - } } } diff --git a/Workers/Resgrid.Workers.Framework/Logic/ReportDeliveryLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/ReportDeliveryLogic.cs index dbca058f..337cb90a 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/ReportDeliveryLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/ReportDeliveryLogic.cs @@ -34,37 +34,40 @@ public async Task> Process(ReportDeliveryQueueItem item) { try { - var client = new RestClient(Config.SystemBehaviorConfig.ResgridBaseUrl); - var request = new RestRequest("User/Reports/InternalRunReport", Method.GET); - request.AddParameter("type", item.ScheduledTask.Data); - request.AddParameter("departmentId", item.Department.DepartmentId); + if (ConfigHelper.CanTransmit(item.Department.DepartmentId)) + { + var client = new RestClient(Config.SystemBehaviorConfig.ResgridBaseUrl); + var request = new RestRequest("User/Reports/InternalRunReport", Method.Get); + request.AddParameter("type", item.ScheduledTask.Data); + request.AddParameter("departmentId", item.Department.DepartmentId); - var response = client.Execute(request); + var response = await client.ExecuteAsync(request); - if (!string.IsNullOrWhiteSpace(response.Content)) - { - //var content = - // response.Content.Replace( - // "", ""); + if (!string.IsNullOrWhiteSpace(response.Content)) + { + //var content = + // response.Content.Replace( + // "", ""); + + Regex rRemScript = new Regex(@"]*>[\s\S]*?"); + var content = rRemScript.Replace(response.Content, ""); - Regex rRemScript = new Regex(@"]*>[\s\S]*?"); - var content = rRemScript.Replace(response.Content, ""); + var systemNotificaiton = new EmailNotification(); + systemNotificaiton.Subject = string.Format("{0} Report for {1} ", ((ReportTypes)int.Parse(item.ScheduledTask.Data)), DateTime.UtcNow.TimeConverter(item.Department)); - var systemNotificaiton = new EmailNotification(); - systemNotificaiton.Subject = string.Format("{0} Report for {1} ", ((ReportTypes)int.Parse(item.ScheduledTask.Data)), DateTime.UtcNow.TimeConverter(item.Department)); + string fileName = string.Format("{0}Report_{1}.pdf", ((ReportTypes)int.Parse(item.ScheduledTask.Data)), + DateTime.UtcNow.TimeConverter(item.Department)); - string fileName = string.Format("{0}Report_{1}.pdf", ((ReportTypes)int.Parse(item.ScheduledTask.Data)), - DateTime.UtcNow.TimeConverter(item.Department)); + fileName = fileName.Replace(" ", "_"); + fileName = fileName.Replace("/", ""); + fileName = fileName.Replace(":", ""); - fileName = fileName.Replace(" ", "_"); - fileName = fileName.Replace("/", ""); - fileName = fileName.Replace(":", ""); - - systemNotificaiton.To = item.Email; - systemNotificaiton.AttachmentName = fileName; - systemNotificaiton.AttachmentData = _pdfProvider.ConvertHtmlToPdf(content); + systemNotificaiton.To = item.Email; + systemNotificaiton.AttachmentName = fileName; + systemNotificaiton.AttachmentData = _pdfProvider.ConvertHtmlToPdf(content); - _emailService.SendReportDeliveryEmail(systemNotificaiton); + await _emailService.SendReportDeliveryEmail(systemNotificaiton); + } } } catch (Exception ex) diff --git a/Workers/Resgrid.Workers.Framework/Logic/ShiftNotificationLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/ShiftNotificationLogic.cs index b071a0ee..5dacebb9 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/ShiftNotificationLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/ShiftNotificationLogic.cs @@ -1,109 +1,15 @@ -using Resgrid.Framework; -using Resgrid.Model; +using Resgrid.Model; using Resgrid.Model.Queue; using Resgrid.Model.Services; using System; using System.Linq; -using System.Threading; using System.Threading.Tasks; using Autofac; -using Microsoft.Azure.ServiceBus; -using Microsoft.Azure.ServiceBus.InteropExtensions; -using Message = Microsoft.Azure.ServiceBus.Message; namespace Resgrid.Workers.Framework.Logic { public class ShiftNotificationLogic { - private QueueClient _client = null; - - public ShiftNotificationLogic() - { - while (_client == null) - { - try - { - //_client = QueueClient.CreateFromConnectionString(Config.ServiceBusConfig.AzureQueueShiftsConnectionString, Config.ServiceBusConfig.ShiftNotificationsQueueName); - _client = new QueueClient(Config.ServiceBusConfig.AzureQueueShiftsConnectionString, Config.ServiceBusConfig.ShiftNotificationsQueueName); - } - catch (TimeoutException) { } - } - } - - public void Process(ShiftQueueItem item) - { - if (Config.SystemBehaviorConfig.IsAzure) - { - //ProcessQueueMessage(_client.Receive()); - - var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler) - { - MaxConcurrentCalls = 1, - AutoComplete = false - }; - - // Register the function that will process messages - _client.RegisterMessageHandler(ProcessQueueMessage, messageHandlerOptions); - } - else - { - ProcessShiftQueueItem(item); - } - } - - public async Task> ProcessQueueMessage(Message message, CancellationToken token) - { - bool success = true; - string result = ""; - - if (message != null) - { - try - { - var body = message.GetBody(); - - if (!String.IsNullOrWhiteSpace(body)) - { - ShiftQueueItem sqi = null; - try - { - sqi = ObjectSerialization.Deserialize(body); - } - catch (Exception ex) - { - success = false; - result = "Unable to parse message body Exception: " + ex.ToString(); - await _client.CompleteAsync(message.SystemProperties.LockToken); - //message.Complete(); - } - - ProcessShiftQueueItem(sqi); - } - - try - { - if (success) - await _client.CompleteAsync(message.SystemProperties.LockToken); - //message.Complete(); - } - catch (MessageLockLostException) - { - - } - } - catch (Exception ex) - { - Logging.LogException(ex); - await _client.AbandonAsync(message.SystemProperties.LockToken); - //message.Abandon(); - success = false; - result = ex.ToString(); - } - } - - return new Tuple(success, result); - } - public static async Task ProcessShiftQueueItem(ShiftQueueItem sqi) { if (sqi != null) @@ -122,7 +28,7 @@ public static async Task ProcessShiftQueueItem(ShiftQueueItem sqi) foreach (var user in tradeRequest.Users) { UserProfile profile = userProfiles.FirstOrDefault(x => x.UserId == user.UserId); - _communicationService.SendNotificationAsync(user.UserId, tradeRequest.SourceShiftSignup.Shift.DepartmentId, text, sqi.DepartmentNumber, + await _communicationService.SendNotificationAsync(user.UserId, tradeRequest.SourceShiftSignup.Shift.DepartmentId, text, sqi.DepartmentNumber, tradeRequest.SourceShiftSignup.Shift.Name, profile); } } @@ -209,16 +115,5 @@ await _communicationService.SendNotificationAsync(proposedUserProfile.UserId, tr return true; } - - static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs) - { - //Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}."); - //var context = exceptionReceivedEventArgs.ExceptionReceivedContext; - //Console.WriteLine("Exception context for troubleshooting:"); - //Console.WriteLine($"- Endpoint: {context.Endpoint}"); - //Console.WriteLine($"- Entity Path: {context.EntityPath}"); - //Console.WriteLine($"- Executing Action: {context.Action}"); - return Task.CompletedTask; - } } } diff --git a/Workers/Resgrid.Workers.Framework/Logic/ShiftNotifierLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/ShiftNotifierLogic.cs index b0483b79..5f385401 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/ShiftNotifierLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/ShiftNotifierLogic.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Threading.Tasks; using Autofac; +using Resgrid.Framework; namespace Resgrid.Workers.Framework.Logic { @@ -31,47 +32,50 @@ public async Task> Process(ShiftNotifierQueueItem item) var text = _shiftsService.GenerateShiftNotificationText(item.Shift); string departmentNumber = await _departmentSettingsService.GetTextToCallNumberForDepartmentAsync(item.Shift.DepartmentId); - if (item.Shift.Personnel != null) + if (ConfigHelper.CanTransmit(item.Shift.DepartmentId)) { - foreach (var person in item.Shift.Personnel) + if (item.Shift.Personnel != null) { - UserProfile profile = item.Profiles.FirstOrDefault(x => x.UserId == person.UserId); - await _communicationService.SendNotificationAsync(person.UserId, item.Shift.DepartmentId, text, departmentNumber, - item.Shift.Name, profile); + foreach (var person in item.Shift.Personnel) + { + UserProfile profile = item.Profiles.FirstOrDefault(x => x.UserId == person.UserId); + await _communicationService.SendNotificationAsync(person.UserId, item.Shift.DepartmentId, text, departmentNumber, + item.Shift.Name, profile); + } } - } - if (item.Signups != null) - { - foreach (var signup in item.Signups) + if (item.Signups != null) { - if (signup.Trade != null && signup.Trade.IsTradeComplete()) + foreach (var signup in item.Signups) { - if (!String.IsNullOrWhiteSpace(signup.Trade.UserId)) - { - UserProfile profile = item.Profiles.FirstOrDefault(x => x.UserId == signup.Trade.UserId); - await _communicationService.SendNotificationAsync(signup.Trade.UserId, item.Shift.DepartmentId, text, departmentNumber, - item.Shift.Name, profile); - } - else if (signup.GetTradeType() == ShiftTradeTypes.Source) + if (signup.Trade != null && signup.Trade.IsTradeComplete()) { - UserProfile profile = item.Profiles.FirstOrDefault(x => x.UserId == signup.Trade.TargetShiftSignup.UserId); - await _communicationService.SendNotificationAsync(signup.Trade.TargetShiftSignup.UserId, item.Shift.DepartmentId, text, departmentNumber, - item.Shift.Name, profile); + if (!String.IsNullOrWhiteSpace(signup.Trade.UserId)) + { + UserProfile profile = item.Profiles.FirstOrDefault(x => x.UserId == signup.Trade.UserId); + await _communicationService.SendNotificationAsync(signup.Trade.UserId, item.Shift.DepartmentId, text, departmentNumber, + item.Shift.Name, profile); + } + else if (signup.GetTradeType() == ShiftTradeTypes.Source) + { + UserProfile profile = item.Profiles.FirstOrDefault(x => x.UserId == signup.Trade.TargetShiftSignup.UserId); + await _communicationService.SendNotificationAsync(signup.Trade.TargetShiftSignup.UserId, item.Shift.DepartmentId, text, departmentNumber, + item.Shift.Name, profile); + } + else if (signup.GetTradeType() == ShiftTradeTypes.Target) + { + UserProfile profile = item.Profiles.FirstOrDefault(x => x.UserId == signup.Trade.SourceShiftSignup.UserId); + await _communicationService.SendNotificationAsync(signup.Trade.SourceShiftSignup.UserId, item.Shift.DepartmentId, text, departmentNumber, + item.Shift.Name, profile); + } } - else if (signup.GetTradeType() == ShiftTradeTypes.Target) + else { - UserProfile profile = item.Profiles.FirstOrDefault(x => x.UserId == signup.Trade.SourceShiftSignup.UserId); - await _communicationService.SendNotificationAsync(signup.Trade.SourceShiftSignup.UserId, item.Shift.DepartmentId, text, departmentNumber, + UserProfile profile = item.Profiles.FirstOrDefault(x => x.UserId == signup.UserId); + await _communicationService.SendNotificationAsync(signup.UserId, item.Shift.DepartmentId, text, departmentNumber, item.Shift.Name, profile); } } - else - { - UserProfile profile = item.Profiles.FirstOrDefault(x => x.UserId == signup.UserId); - await _communicationService.SendNotificationAsync(signup.UserId, item.Shift.DepartmentId, text, departmentNumber, - item.Shift.Name, profile); - } } } } diff --git a/Workers/Resgrid.Workers.Framework/Logic/SystemQueueLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/SystemQueueLogic.cs index c795a566..7b265965 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/SystemQueueLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/SystemQueueLogic.cs @@ -2,7 +2,6 @@ using Autofac; using Resgrid.Framework; using Resgrid.Model; -using Resgrid.Model.Queue; using Resgrid.Model.Services; using Stripe; using Resgrid.Model.Repositories; @@ -13,98 +12,14 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using Microsoft.Azure.ServiceBus; -using Microsoft.Azure.ServiceBus.InteropExtensions; using Resgrid.Model.Providers; using Newtonsoft.Json; using Stripe.Checkout; -using Message = Microsoft.Azure.ServiceBus.Message; namespace Resgrid.Workers.Framework.Logic { public class SystemQueueLogic { - private QueueClient _client = null; - - public SystemQueueLogic() - { - while (_client == null) - { - try - { - //_client = QueueClient.CreateFromConnectionString(Config.ServiceBusConfig.AzureQueueSystemConnectionString, Config.ServiceBusConfig.SystemQueueName); - _client = new QueueClient(Config.ServiceBusConfig.AzureQueueSystemConnectionString, Config.ServiceBusConfig.SystemQueueName); - } - catch (TimeoutException) { } - } - } - - public void Process(SystemQueueItem item) - { - //ProcessQueueMessage(_client.Receive()); - - var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler) - { - MaxConcurrentCalls = 1, - AutoComplete = false - }; - - // Register the function that will process messages - _client.RegisterMessageHandler(ProcessQueueMessage, messageHandlerOptions); - } - - public async Task> ProcessQueueMessage(Message message, CancellationToken token) - { - bool success = true; - string result = ""; - - if (message != null) - { - try - { - var body = message.GetBody(); - - if (!String.IsNullOrWhiteSpace(body)) - { - CqrsEvent qi = null; - try - { - qi = ObjectSerialization.Deserialize(body); - } - catch (Exception ex) - { - success = false; - result = "Unable to parse message body Exception: " + ex.ToString(); - //message.Complete(); - await _client.CompleteAsync(message.SystemProperties.LockToken); - } - - success = await ProcessSystemQueueItem(qi); - } - - try - { - if (success) - await _client.CompleteAsync(message.SystemProperties.LockToken); - //message.Complete(); - } - catch (MessageLockLostException) - { - } - } - catch (Exception ex) - { - Logging.LogException(ex); - await _client.AbandonAsync(message.SystemProperties.LockToken); - //message.Abandon(); - success = false; - result = ex.ToString(); - } - } - - return new Tuple(success, result); - } - public static async Task ProcessSystemQueueItem(CqrsEvent qi, CancellationToken cancellationToken = default(CancellationToken)) { bool success = true; @@ -169,28 +84,30 @@ public async Task> ProcessQueueMessage(Message message, Canc try { unitData = ObjectSerialization.Deserialize(qi.Data); - } - catch (Exception ex) - { + if (unitData != null) + { + PushUri pushUri = new PushUri(); + pushUri.PushUriId = unitData.PushUriId; + pushUri.UserId = unitData.UserId; + pushUri.PlatformType = unitData.PlatformType; + pushUri.PushLocation = unitData.PushLocation; + pushUri.DepartmentId = unitData.DepartmentId; + pushUri.UnitId = unitData.UnitId; + pushUri.DeviceId = unitData.DeviceId; + pushUri.Uuid = unitData.Uuid; + + var pushService = Bootstrapper.GetKernel().Resolve(); + + await pushService.UnRegisterUnit(pushUri); + var unitResult = await pushService.RegisterUnit(pushUri); + + pushService = null; + } } - - if (unitData != null) + catch (Exception ex) { - PushUri pushUri = new PushUri(); - pushUri.PushUriId = unitData.PushUriId; - pushUri.UserId = unitData.UserId; - pushUri.PlatformType = unitData.PlatformType; - pushUri.PushLocation = unitData.PushLocation; - pushUri.DepartmentId = unitData.DepartmentId; - pushUri.UnitId = unitData.UnitId; - pushUri.DeviceId = unitData.DeviceId; - pushUri.Uuid = unitData.Uuid; - - var pushService = Bootstrapper.GetKernel().Resolve(); - var unitResult = await pushService.RegisterUnit(pushUri); - pushService = null; } break; case CqrsEventTypes.StripeChargeSucceeded: @@ -376,7 +293,7 @@ public async Task> ProcessQueueMessage(Message message, Canc if (!String.IsNullOrEmpty(call.Address)) callAddress = call.Address; - else if (!String.IsNullOrEmpty(call.GeoLocationData)) + else if (!String.IsNullOrEmpty(call.GeoLocationData) && call.GeoLocationData.Length > 1) { string[] points = call.GeoLocationData.Split(char.Parse(",")); @@ -425,13 +342,16 @@ public async Task> ProcessQueueMessage(Message message, Canc case AuditLogTypes.DepartmentSettingsChanged: auditLog.Message = string.Format("{0} updated the department settings", profile.FullName.AsFirstNameLastName); var compareLogic = new CompareLogic(); - ComparisonResult auditCompareResult = compareLogic.Compare(auditEvent.Before, auditEvent.After); + var departmentSettingsChangedBefore = JsonConvert.DeserializeObject(auditEvent.Before); + var departmentSettingsChangedAfter = JsonConvert.DeserializeObject(auditEvent.After); + ComparisonResult auditCompareResult = compareLogic.Compare(departmentSettingsChangedBefore, departmentSettingsChangedAfter); auditLog.Data = auditCompareResult.DifferencesString; break; case AuditLogTypes.UserAdded: - if (auditEvent.After != null && auditEvent.After.GetType().BaseType == typeof(IdentityUser)) + if (!String.IsNullOrWhiteSpace(auditEvent.After)) { - var newProfile = await userProfileService.GetProfileByUserIdAsync(((IdentityUser)auditEvent.After).UserId); + var userAddedIdentityUser = JsonConvert.DeserializeObject(auditEvent.After); + var newProfile = await userProfileService.GetProfileByUserIdAsync(userAddedIdentityUser.UserId); auditLog.Message = string.Format("{0} added new user {1}", profile.FullName.AsFirstNameLastName, newProfile.FullName.AsFirstNameLastName); auditLog.Data = $"New UserId: {newProfile.UserId}"; @@ -439,83 +359,99 @@ public async Task> ProcessQueueMessage(Message message, Canc break; case AuditLogTypes.UserRemoved: - if (auditEvent.Before != null && auditEvent.Before.GetType() == typeof(UserProfile)) + if (!String.IsNullOrWhiteSpace(auditEvent.Before)) { - auditLog.Message = $"{profile.FullName.AsFirstNameLastName} removed user {(((UserProfile)auditEvent.Before).FullName.AsFirstNameLastName)}"; + var userRemovedIdentityUser = JsonConvert.DeserializeObject(auditEvent.Before); + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} removed user {userRemovedIdentityUser.FullName.AsFirstNameLastName}"; auditLog.Data = "No Data"; } break; case AuditLogTypes.GroupAdded: - if (auditEvent.After != null && auditEvent.After.GetType() == typeof(DepartmentGroup)) + if (!String.IsNullOrWhiteSpace(auditEvent.After)) { - if (((DepartmentGroup)auditEvent.After).Type.HasValue && ((DepartmentGroup)auditEvent.After).Type.Value == (int)DepartmentGroupTypes.Station) - auditLog.Message = $"{profile.FullName.AsFirstNameLastName} added station group {((DepartmentGroup)auditEvent.After).Name}"; + var groupAddedGroup = JsonConvert.DeserializeObject(auditEvent.After); + if (groupAddedGroup.Type.HasValue && groupAddedGroup.Type.Value == (int)DepartmentGroupTypes.Station) + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} added station group {groupAddedGroup.Name}"; else - auditLog.Message = $"{profile.FullName.AsFirstNameLastName} added organizational group {((DepartmentGroup)auditEvent.After).Name}"; + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} added organizational group {groupAddedGroup.Name}"; - auditLog.Data = $"GroupId: {((DepartmentGroup)auditEvent.After).DepartmentGroupId}"; + auditLog.Data = $"GroupId: {groupAddedGroup.DepartmentGroupId}"; } break; case AuditLogTypes.GroupRemoved: - if (auditEvent.Before != null && auditEvent.Before.GetType() == typeof(DepartmentGroup)) + if (!String.IsNullOrWhiteSpace(auditEvent.Before)) { - auditLog.Message = string.Format("{0} removed group {1}", profile.FullName.AsFirstNameLastName, ((DepartmentGroup)auditEvent.Before).Name); + var groupRemovedGroup = JsonConvert.DeserializeObject(auditEvent.Before); + auditLog.Message = string.Format("{0} removed group {1}", profile.FullName.AsFirstNameLastName, groupRemovedGroup.Name); auditLog.Data = "No Data"; } break; case AuditLogTypes.GroupChanged: - if (auditEvent.Before != null && auditEvent.Before.GetType() == typeof(DepartmentGroup) && auditEvent.After != null && - auditEvent.After.GetType() == typeof(DepartmentGroup)) + if (!String.IsNullOrWhiteSpace(auditEvent.Before) && !String.IsNullOrWhiteSpace(auditEvent.After)) { - auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated group {((DepartmentGroup)auditEvent.After).Name}"; + var groupUpdatedBeforeGroup = JsonConvert.DeserializeObject(auditEvent.Before); + var groupUpdatedAfterGroup = JsonConvert.DeserializeObject(auditEvent.After); + + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated group {groupUpdatedAfterGroup.Name}"; var compareLogicGroup = new CompareLogic(); - ComparisonResult resultGroup = compareLogicGroup.Compare(auditEvent.Before, auditEvent.After); + ComparisonResult resultGroup = compareLogicGroup.Compare(groupUpdatedBeforeGroup, groupUpdatedAfterGroup); auditLog.Data = resultGroup.DifferencesString; } break; case AuditLogTypes.UnitAdded: - if (auditEvent.After != null && auditEvent.After.GetType() == typeof(Unit)) + if (!String.IsNullOrWhiteSpace(auditEvent.After)) { - auditLog.Message = string.Format("{0} added unit {1}", profile.FullName.AsFirstNameLastName, ((Unit)auditEvent.After).Name); - auditLog.Data = $"UnitId: {((Unit)auditEvent.After).UnitId}"; + var unitedAddedUnit = JsonConvert.DeserializeObject(auditEvent.After); + auditLog.Message = string.Format("{0} added unit {1}", profile.FullName.AsFirstNameLastName, unitedAddedUnit.Name); + auditLog.Data = $"UnitId: {unitedAddedUnit.UnitId}"; } break; case AuditLogTypes.UnitRemoved: - if (auditEvent.Before != null && auditEvent.Before.GetType() == typeof(Unit)) + if (!String.IsNullOrWhiteSpace(auditEvent.Before)) { - auditLog.Message = $"{profile.FullName.AsFirstNameLastName} removed unit {((Unit)auditEvent.Before).Name}"; + var unitedRemovedUnit = JsonConvert.DeserializeObject(auditEvent.Before); + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} removed unit {unitedRemovedUnit.Name}"; auditLog.Data = "No Data"; } break; case AuditLogTypes.UnitChanged: - if (auditEvent.Before != null && auditEvent.Before.GetType() == typeof(Unit) && auditEvent.After != null && auditEvent.After.GetType() == typeof(Unit)) + if (!String.IsNullOrWhiteSpace(auditEvent.Before) && !String.IsNullOrWhiteSpace(auditEvent.After)) { - auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated unit {((Unit)auditEvent.After).Name}"; + var unitUpdatedBeforeUnit = JsonConvert.DeserializeObject(auditEvent.Before); + var unitUpdatedAfterUnit = JsonConvert.DeserializeObject(auditEvent.After); + + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated unit {unitUpdatedAfterUnit.Name}"; var compareLogicUnit = new CompareLogic(); - ComparisonResult resultUnit = compareLogicUnit.Compare(auditEvent.Before, auditEvent.After); + ComparisonResult resultUnit = compareLogicUnit.Compare(unitUpdatedBeforeUnit, unitUpdatedAfterUnit); auditLog.Data = resultUnit.DifferencesString; } break; case AuditLogTypes.ProfileUpdated: - if (auditEvent.Before != null && auditEvent.Before.GetType() == typeof(UserProfile) && auditEvent.After != null && auditEvent.After.GetType() == typeof(UserProfile)) + if (!String.IsNullOrWhiteSpace(auditEvent.Before) && !String.IsNullOrWhiteSpace(auditEvent.After)) { - auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated the profile for {((UserProfile)auditEvent.After).FullName.AsFirstNameLastName}"; + var profileUpdatedBeforeProfile = JsonConvert.DeserializeObject(auditEvent.Before); + var profileUpdatedAfterProfile = JsonConvert.DeserializeObject(auditEvent.After); + + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated the profile for {profileUpdatedBeforeProfile.FullName.AsFirstNameLastName}"; var compareLogicProfile = new CompareLogic(); - ComparisonResult resultProfile = compareLogicProfile.Compare(auditEvent.Before, auditEvent.After); + ComparisonResult resultProfile = compareLogicProfile.Compare(profileUpdatedBeforeProfile, profileUpdatedAfterProfile); auditLog.Data = resultProfile.DifferencesString; } break; case AuditLogTypes.PermissionsChanged: - if (auditEvent.Before != null && auditEvent.Before.GetType() == typeof(Permission) && auditEvent.After != null && auditEvent.After.GetType() == typeof(Permission)) + if (!String.IsNullOrWhiteSpace(auditEvent.Before) && !String.IsNullOrWhiteSpace(auditEvent.After)) { + var updatePermissionBefore = JsonConvert.DeserializeObject(auditEvent.Before); + var updatePermissionAfter = JsonConvert.DeserializeObject(auditEvent.After); + auditLog.Message = $"{profile.FullName.AsFirstNameLastName} updated the department permissions"; var compareLogicProfile = new CompareLogic(); - ComparisonResult resultProfile = compareLogicProfile.Compare(auditEvent.Before, auditEvent.After); + ComparisonResult resultProfile = compareLogicProfile.Compare(updatePermissionBefore, updatePermissionAfter); auditLog.Data = resultProfile.DifferencesString; } break; @@ -574,16 +510,5 @@ public async Task> ProcessQueueMessage(Message message, Canc return success; } - - static Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs) - { - //Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}."); - //var context = exceptionReceivedEventArgs.ExceptionReceivedContext; - //Console.WriteLine("Exception context for troubleshooting:"); - //Console.WriteLine($"- Endpoint: {context.Endpoint}"); - //Console.WriteLine($"- Entity Path: {context.EntityPath}"); - //Console.WriteLine($"- Executing Action: {context.Action}"); - return Task.CompletedTask; - } } } diff --git a/Workers/Resgrid.Workers.Framework/Logic/TrainingNotifierLogic.cs b/Workers/Resgrid.Workers.Framework/Logic/TrainingNotifierLogic.cs index c718165e..ef6f9eff 100644 --- a/Workers/Resgrid.Workers.Framework/Logic/TrainingNotifierLogic.cs +++ b/Workers/Resgrid.Workers.Framework/Logic/TrainingNotifierLogic.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading.Tasks; using Autofac; +using Resgrid.Framework; namespace Resgrid.Workers.Framework.Logic { @@ -34,29 +35,32 @@ public async Task> Process(TrainingNotifierQueueItem item) var profiles = await _userProfileService.GetSelectedUserProfilesAsync(item.Training.Users.Select(x => x.UserId).ToList()); var departmentNumber = await _departmentSettingsService.GetTextToCallNumberForDepartmentAsync(item.Training.DepartmentId); - if (!item.Training.Notified.HasValue) + if (ConfigHelper.CanTransmit(item.Training.DepartmentId)) { - if (item.Training.ToBeCompletedBy.HasValue) - message = string.Format("New Training ({0}) due on {1}", item.Training.Name, - item.Training.ToBeCompletedBy.Value.ToShortDateString()); - else - message = string.Format("New Training ({0}) assigned to you", item.Training.Name); + if (!item.Training.Notified.HasValue) + { + if (item.Training.ToBeCompletedBy.HasValue) + message = string.Format("New Training ({0}) due on {1}", item.Training.Name, + item.Training.ToBeCompletedBy.Value.ToShortDateString()); + else + message = string.Format("New Training ({0}) assigned to you", item.Training.Name); - title = "New Training Notice"; - } - else - { - message = string.Format("Training ({0}) is due tomorrow", item.Training.Name); - } + title = "New Training Notice"; + } + else + { + message = string.Format("Training ({0}) is due tomorrow", item.Training.Name); + } - foreach (var person in item.Training.Users) - { - var profile = profiles.FirstOrDefault(x => x.UserId == person.UserId); + foreach (var person in item.Training.Users) + { + var profile = profiles.FirstOrDefault(x => x.UserId == person.UserId); - if (!item.Training.Notified.HasValue || !person.Complete) - await _communicationService.SendNotificationAsync(person.UserId, item.Training.DepartmentId, message, departmentNumber, title, profile); + if (!item.Training.Notified.HasValue || !person.Complete) + await _communicationService.SendNotificationAsync(person.UserId, item.Training.DepartmentId, message, departmentNumber, title, profile); - title = "Training Due Notice"; + title = "Training Due Notice"; + } } await _trainingService.MarkAsNotifiedAsync(item.Training.TrainingId); diff --git a/Workers/Resgrid.Workers.Framework/Resgrid.Workers.Framework.csproj b/Workers/Resgrid.Workers.Framework/Resgrid.Workers.Framework.csproj index 0fa73ca5..c2c85b50 100644 --- a/Workers/Resgrid.Workers.Framework/Resgrid.Workers.Framework.csproj +++ b/Workers/Resgrid.Workers.Framework/Resgrid.Workers.Framework.csproj @@ -1,15 +1,14 @@ - + - netstandard2.0 + netstandard2.1 Debug;Release;Docker - - - - + + + @@ -18,7 +17,6 @@ - @@ -30,6 +28,7 @@ + diff --git a/Workers/Resgrid.Workers.Framework/WorkerFrameworkModule.cs b/Workers/Resgrid.Workers.Framework/WorkerFrameworkModule.cs index ef495ada..2fe404e6 100644 --- a/Workers/Resgrid.Workers.Framework/WorkerFrameworkModule.cs +++ b/Workers/Resgrid.Workers.Framework/WorkerFrameworkModule.cs @@ -1,13 +1,4 @@ using Autofac; -using Resgrid.Workers.Framework.Backend; -using Resgrid.Workers.Framework.Backend.Heartbeat; -using Resgrid.Workers.Framework.Backend.Scout; -using Resgrid.Workers.Framework.Workers.DistributionList; -using Resgrid.Workers.Framework.Workers.MessageBroadcast; -using Resgrid.Workers.Framework.Workers.Notification; -using Resgrid.Workers.Framework.Workers.ReportDelivery; -using Resgrid.Workers.Framework.Workers.ShiftNotifier; -using Resgrid.Workers.Framework.Workers.TrainingNotifier; namespace Resgrid.Workers.Framework { @@ -15,45 +6,7 @@ public class WorkerFrameworkModule : Module { protected override void Load(ContainerBuilder builder) { - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); - - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); } } } diff --git a/Workers/Resgrid.Workers.Framework/Workers/CalendarNotifier/CalendarNotifierCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/CalendarNotifier/CalendarNotifierCommand.cs deleted file mode 100644 index 74b78060..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/CalendarNotifier/CalendarNotifierCommand.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework.Workers.CalendarNotifier -{ - public class CalendarNotifierCommand : ICommand - { - public CalendarNotifierCommand() - { - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(CalendarNotifierQueueItem item) - { - var logic = new CalendarNotifierLogic(); - await logic.Process(item); - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/CalendarNotifier/CalendarNotifierQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/CalendarNotifier/CalendarNotifierQueue.cs deleted file mode 100644 index 299655da..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/CalendarNotifier/CalendarNotifierQueue.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Autofac; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Providers; -using Resgrid.Model.Services; -using Resgrid.Providers.Bus; - -namespace Resgrid.Workers.Framework.Workers.CalendarNotifier -{ - public class CalendarNotifierQueue : IQueue - { - private bool _cleared; - private object _lock; - private bool _isLocked; - private static Queue _queue; - - private ICalendarService _calendarService; - private readonly IEventAggregator _eventAggregator; - - public CalendarNotifierQueue(IEventAggregator eventAggregator) - { - _eventAggregator = eventAggregator; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - - _calendarService = Bootstrapper.GetKernel().Resolve(); - - var t1 = new Task(async () => - { - try - { - var calendarItems = await _calendarService.GetCalendarItemsToNotifyAsync(DateTime.UtcNow); - - if (calendarItems != null) - { - foreach (var calendarItem in calendarItems) - { - var qi = new CalendarNotifierQueueItem(); - qi.CalendarItem = calendarItem; - - _queue.Enqueue(qi); - } - } - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _calendarService = null; - } - }); - - t1.Start(); - } - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - _queue.Clear(); - - return _cleared; - } - - public void AddItem(CalendarNotifierQueueItem item) - { - _queue.Enqueue(item); - } - - public CalendarNotifierQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.CalendarNotifier, Timestamp = DateTime.UtcNow}); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(1000); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/CallBroadcast/CallBroadcastCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/CallBroadcast/CallBroadcastCommand.cs deleted file mode 100644 index 855211a4..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/CallBroadcast/CallBroadcastCommand.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Model.Queue; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework -{ - public class CallBroadcastCommand : ICommand - { - private BroadcastCallLogic _broadcastCallLogic; - - public CallBroadcastCommand() - { - _broadcastCallLogic = new BroadcastCallLogic(); - - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(CallQueueItem item) - { - await _broadcastCallLogic.Process(item); - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/CallBroadcast/CallQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/CallBroadcast/CallQueue.cs deleted file mode 100644 index f900d991..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/CallBroadcast/CallQueue.cs +++ /dev/null @@ -1,176 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Autofac; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Providers; -using Resgrid.Model.Queue; -using Resgrid.Model.Services; -using Resgrid.Providers.Bus; - -namespace Resgrid.Workers.Framework -{ - public class CallQueue : IQueue - { - private bool _cleared; - private object _lock; - private bool _isLocked; - private static Queue _queue; - - private ICallsService _callsService; - private IQueueService _queueService; - private readonly IEventAggregator _eventAggregator; - private IUserProfileService _userProfileService; - - public CallQueue(/*ICallsService callsService, IQueueService queueService, IJobsService jobsService, IUserProfileService userProfileService, */IEventAggregator eventAggregator) - { - //_callsService = callsService; - //_queueService = queueService; - //_userProfileService = userProfileService; - _eventAggregator = eventAggregator; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - - Task t1 = new Task(async () => - { - try - { - if (Config.SystemBehaviorConfig.IsAzure) - { - _queue.Enqueue(new CallQueueItem()); - } - else - { - _callsService = Bootstrapper.GetKernel().Resolve(); - _queueService = Bootstrapper.GetKernel().Resolve(); - _userProfileService = Bootstrapper.GetKernel().Resolve(); - - var items = await _queueService.DequeueAsync(QueueTypes.CallBroadcast); - - foreach (var i in items) - { - var cqi = new CallQueueItem(); - cqi.QueueItem = i; - cqi.Call = await _callsService.GetCallByIdAsync(int.Parse(i.SourceId)); - cqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(cqi.Call.Dispatches.Select(x => x.UserId).ToList()); - - _queue.Enqueue(cqi); - } - } - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _callsService = null; - _queueService = null; - _userProfileService = null; - } - }); - - t1.Start(); - } - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - - _queue.Clear(); - - if (!Config.SystemBehaviorConfig.IsAzure) - { - try - { - _queueService = Bootstrapper.GetKernel().Resolve(); - - var queueItems = _queue.Select(x => x.QueueItem).ToList(); - await _queueService.RequeueAllAsync(queueItems); - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _queueService = null; - } - } - - return true; - } - - public void AddItem(CallQueueItem item) - { - _queue.Enqueue(item); - } - - public CallQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.Broadcast, Timestamp = DateTime.UtcNow }); - - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(100); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/CallEmail/CallEmailCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/CallEmail/CallEmailCommand.cs deleted file mode 100644 index bb04bca6..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/CallEmail/CallEmailCommand.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework -{ - public class CallEmailCommand : ICommand - { - public CallEmailCommand() - { - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(CallEmailQueueItem item) - { - var logic = new CallEmailImporterLogic(); - await logic.Process(item); - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/CallEmail/CallEmailQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/CallEmail/CallEmailQueue.cs deleted file mode 100644 index 8257ee93..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/CallEmail/CallEmailQueue.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Autofac; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Providers; -using Resgrid.Model.Services; -using Resgrid.Providers.Bus; - -namespace Resgrid.Workers.Framework -{ - public class CallEmailQueue : IQueue - { - private bool _cleared; - private bool _isLocked; - private static Queue _queue; - - private IDepartmentsService _departmentsService; - private readonly IEventAggregator _eventAggregator; - - public CallEmailQueue(/*IDepartmentsService departmentsService, */IEventAggregator eventAggregator) - { - //_departmentsService = departmentsService; - _eventAggregator = eventAggregator; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - Clear(); - - _departmentsService = Bootstrapper.GetKernel().Resolve(); - - var task = new Task(async () => - { - try - { - var items = await _departmentsService.GetAllDepartmentEmailSettingsAsync(); - - foreach (var i in items) - { - var cqi = new CallEmailQueueItem(); - cqi.EmailSettings = i; - - _queue.Enqueue(cqi); - } - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _departmentsService = null; - } - }); - - task.Start(); - } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - - _queue.Clear(); - - return _cleared; - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void AddItem(CallEmailQueueItem item) - { - _queue.Enqueue(item); - } - - public CallEmailQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.CallEmail, Timestamp = DateTime.UtcNow }); - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - if (_queue.Count <= 0) - PopulateQueue(); - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/CallPrune/CallPruneQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/CallPrune/CallPruneQueue.cs deleted file mode 100644 index 43f18158..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/CallPrune/CallPruneQueue.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Autofac; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Providers; -using Resgrid.Model.Services; -using Resgrid.Providers.Bus; - -namespace Resgrid.Workers.Framework -{ - public class CallPruneQueue : IQueue - { - private bool _cleared; - private bool _isLocked; - private static Queue _queue; - - private IDepartmentsService _departmentsService; - private readonly IEventAggregator _eventAggregator; - - public CallPruneQueue(IEventAggregator eventAggregator) - { - _eventAggregator = eventAggregator; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - Clear(); - - _departmentsService = Bootstrapper.GetKernel().Resolve(); - - var t1 = new Task(async () => - { - try - { - var items = await _departmentsService.GetAllDepartmentCallPruningsAsync(); - - foreach (var i in items) - { - var item = new CallPruneQueueItem(); - item.PruneSettings = i; - - _queue.Enqueue(item); - } - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _departmentsService = null; - } - }); - - t1.Start(); - } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - - var items = _queue.AsEnumerable(); - _queue.Clear(); - - return _cleared; - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void AddItem(CallPruneQueueItem item) - { - _queue.Enqueue(item); - } - - public CallPruneQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.CallPrune, Timestamp = DateTime.UtcNow }); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(1000); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/CallPrune/CallPruningCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/CallPrune/CallPruningCommand.cs deleted file mode 100644 index 97a51681..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/CallPrune/CallPruningCommand.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework -{ - public class CallPruningCommand : ICommand - { - public CallPruningCommand() - { - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(CallPruneQueueItem item) - { - var logic = new CallPruneLogic(); - await logic.Process(item); - - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/DistributionList/DistributionListCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/DistributionList/DistributionListCommand.cs deleted file mode 100644 index ce780313..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/DistributionList/DistributionListCommand.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework.Workers.DistributionList -{ - public class DistributionListCommand : ICommand - { - public DistributionListCommand() - { - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(DistributionListQueueItem item) - { - var logic = new DistributionListEmailImporterLogic(); - await logic.Process(item); - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/DistributionList/DistributionListQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/DistributionList/DistributionListQueue.cs deleted file mode 100644 index 7974a875..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/DistributionList/DistributionListQueue.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Autofac; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Providers; -using Resgrid.Model.Services; -using Resgrid.Providers.Bus; - -namespace Resgrid.Workers.Framework.Workers.DistributionList -{ - public class DistributionListQueue : IQueue - { - private bool _cleared; - private bool _isLocked; - private static Queue _queue; - - private IDistributionListsService _distributionListsService; - private readonly IEventAggregator _eventAggregator; - - public DistributionListQueue(/*IDistributionListsService distributionListsService, */IEventAggregator eventAggregator) - { - //_distributionListsService = distributionListsService; - _eventAggregator = eventAggregator; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - Clear(); - - _distributionListsService = Bootstrapper.GetKernel().Resolve(); - - var t1 = new Task(async () => - { - try - { - var items = await _distributionListsService.GetAllActiveDistributionListsAsync(); - - foreach (var i in items) - { - var qi = new DistributionListQueueItem(); - qi.List = i; - - _queue.Enqueue(qi); - } - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _distributionListsService = null; - } - }); - - t1.Start(); - } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - - _queue.Clear(); - - return _cleared; - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void AddItem(DistributionListQueueItem item) - { - _queue.Enqueue(item); - } - - public DistributionListQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - List items = new List(); - - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.DistributionList, Timestamp = DateTime.UtcNow }); - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - if (_queue.Count <= 0) - PopulateQueue(); - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/Maintenance/MaintenanceCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/Maintenance/MaintenanceCommand.cs deleted file mode 100644 index 12f0cbfe..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/Maintenance/MaintenanceCommand.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework.Workers.Maintenance -{ - public class MaintenanceCommand : ICommand - { - public MaintenanceCommand() - { - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(MaintenanceQueueItem item) - { - var logic = new MaintenanceLogic(); - logic.FixMissingUserProfiles(); - logic.FixMissingUserNames(); - logic.CleanUpCallDispatchAudio(); - - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/MessageBroadcast/MessageBroadcastCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/MessageBroadcast/MessageBroadcastCommand.cs deleted file mode 100644 index 87588799..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/MessageBroadcast/MessageBroadcastCommand.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Model.Queue; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework.Workers.MessageBroadcast -{ - public class MessageBroadcastCommand : ICommand - { - private BroadcastMessageLogic _roadcastMessageLogic; - - public MessageBroadcastCommand() - { - _roadcastMessageLogic = new BroadcastMessageLogic(); - - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(MessageQueueItem item) - { - await _roadcastMessageLogic.Process(item); - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/MessageBroadcast/MessageQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/MessageBroadcast/MessageQueue.cs deleted file mode 100644 index e21a5424..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/MessageBroadcast/MessageQueue.cs +++ /dev/null @@ -1,184 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Autofac; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Providers; -using Resgrid.Model.Queue; -using Resgrid.Model.Services; -using Resgrid.Providers.Bus; - -namespace Resgrid.Workers.Framework.Workers.MessageBroadcast -{ - public class MessageQueue : IQueue - { - private bool _cleared; - private object _lock; - private bool _isLocked; - private static Queue _queue; - - private IMessageService _messageService; - private IQueueService _queueService; - private readonly IEventAggregator _eventAggregator; - private IUserProfileService _userProfileService; - - public MessageQueue(/*IMessageService messageService, IQueueService queueService, IUserProfileService userProfileService, */IEventAggregator eventAggregator) - { - //_messageService = messageService; - //_queueService = queueService; - _eventAggregator = eventAggregator; - //_userProfileService = userProfileService; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - - var t1 = new Task(async () => - { - try - { - if (Config.SystemBehaviorConfig.IsAzure) - { - _queue.Enqueue(new MessageQueueItem()); - } - else - { - _messageService = Bootstrapper.GetKernel().Resolve(); - _queueService = Bootstrapper.GetKernel().Resolve(); - _userProfileService = Bootstrapper.GetKernel().Resolve(); - - var items = await _queueService.DequeueAsync(QueueTypes.MessageBroadcast); - - foreach (var i in items) - { - var cqi = new MessageQueueItem(); - cqi.QueueItem = i; - cqi.Message = await _messageService.GetMessageByIdAsync(int.Parse(i.SourceId)); - - var users = new List(); - - if (!String.IsNullOrWhiteSpace(cqi.Message.ReceivingUserId)) - users.Add(cqi.Message.ReceivingUserId); - - if (!String.IsNullOrWhiteSpace(cqi.Message.SendingUserId)) - users.Add(cqi.Message.SendingUserId); - - cqi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(users); - - _queue.Enqueue(cqi); - } - } - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _messageService = null; - _queueService = null; - _userProfileService = null; - } - }); - - t1.Start(); - } - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - - _queue.Clear(); - - if (!Config.SystemBehaviorConfig.IsAzure) - { - try - { - _queueService = Bootstrapper.GetKernel().Resolve(); - - var queueItems = _queue.Select(x => x.QueueItem).ToList(); - await _queueService.RequeueAllAsync(queueItems); - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _queueService = null; - } - } - - return true; - } - - public void AddItem(MessageQueueItem item) - { - _queue.Enqueue(item); - } - - public MessageQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.MessageBroadcast, Timestamp = DateTime.UtcNow }); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(1000); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/Notification/NotificationCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/Notification/NotificationCommand.cs deleted file mode 100644 index f5679dd2..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/Notification/NotificationCommand.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Threading.Tasks; -using Autofac; -using Resgrid.Model.Services; - -namespace Resgrid.Workers.Framework.Workers.Notification -{ - public class NotificationCommand : ICommand - { - private INotificationService _notificationService; - private ICommunicationService _communicationService; - - public NotificationCommand() - { - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(NotificationQueueItem item) - { - if (item != null && item.Department != null && item.Notifications.Count > 0 && item.NotificationSettings.Count > 0) - { - _notificationService = Bootstrapper.GetKernel().Resolve(); - _communicationService = Bootstrapper.GetKernel().Resolve(); - - var notificaitons = await _notificationService.ProcessNotificationsAsync(item.Notifications, item.NotificationSettings); - - if (notificaitons != null) - { - foreach (var notification in notificaitons) - { - var text = await _notificationService.GetMessageForTypeAsync(notification); - - if (!String.IsNullOrWhiteSpace(text)) - { - foreach (var user in notification.Users) - { - if (item.Profiles.ContainsKey(user)) - { - var profile = item.Profiles[user]; - - if (!_notificationService.AllowToSendViaSms(notification.Type)) - profile.SendNotificationSms = false; - - await _communicationService.SendNotificationAsync(user, notification.DepartmentId, text, item.DepartmentTextNumber, - "Notification", profile); - } - else - await _communicationService.SendNotificationAsync(user, notification.DepartmentId, text, item.DepartmentTextNumber); - } - } - } - } - } - - _notificationService = null; - _communicationService = null; - - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/Notification/NotificationQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/Notification/NotificationQueue.cs deleted file mode 100644 index 5fbedf1d..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/Notification/NotificationQueue.cs +++ /dev/null @@ -1,197 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Autofac; -using Microsoft.Azure.ServiceBus.InteropExtensions; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Providers; -using Resgrid.Model.Services; -using Resgrid.Providers.Bus; -using Message = Microsoft.Azure.ServiceBus.Message; - -namespace Resgrid.Workers.Framework.Workers.Notification -{ - public class NotificationQueue : IQueue - { - private bool _cleared; - private object _lock; - private bool _isLocked; - private static Queue _queue; - - private IDepartmentsService _departmentsService; - private INotificationService _notificationService; - private readonly IEventAggregator _eventAggregator; - private IUserProfileService _userProfileService; - private IDepartmentSettingsService _departmentSettingsService; - - public NotificationQueue(IEventAggregator eventAggregator) - { - _eventAggregator = eventAggregator; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - - _departmentsService = Bootstrapper.GetKernel().Resolve(); - _notificationService = Bootstrapper.GetKernel().Resolve(); - _userProfileService = Bootstrapper.GetKernel().Resolve(); - _departmentSettingsService = Bootstrapper.GetKernel().Resolve(); - - var t1 = new Task(async () => - { - try - { - var allNotifications = await _notificationService.GetAllAsync(); - var items = new List(); - - Message message = null; - while (message != null) - { - try - { - var item = new ProcessedNotification(); - - if (message.UserProperties["DepartmentId"] != null) - item.DepartmentId = int.Parse(message.UserProperties["DepartmentId"].ToString()); - - if (message.UserProperties["Type"] != null) - item.Type = (EventTypes) message.UserProperties["Type"]; - - if (message.UserProperties["Value"] != null) - item.Value = message.UserProperties["Value"].ToString(); - - item.MessageId = message.MessageId; - - try - { - item.Data = message.GetBody(); - items.Add(item); - - // Remove message from subscription - //message.Complete(); - } - catch (InvalidOperationException) - { - //message.Complete(); - } - } - catch (Exception ex) - { - Logging.LogException(ex); - - // Indicate a problem, unlock message in subscription - //message.Abandon(); - } - } - - var groupedItems = from i in items - group i by i.DepartmentId - into itemGroup - orderby itemGroup.Key - select itemGroup; - - foreach (var group in groupedItems) - { - var queueItem = new NotificationQueueItem(); - queueItem.Department = await _departmentsService.GetDepartmentByIdAsync(group.Key, false); - queueItem.DepartmentTextNumber = await _departmentSettingsService.GetTextToCallNumberForDepartmentAsync(group.Key); - queueItem.NotificationSettings = allNotifications.Where(x => x.DepartmentId == group.Key).ToList(); - queueItem.Notifications = group.ToList(); - queueItem.Profiles = await _userProfileService.GetAllProfilesForDepartmentAsync(group.Key); - - _queue.Enqueue(queueItem); - } - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _departmentsService = null; - _notificationService = null; - _userProfileService = null; - _departmentSettingsService = null; - } - }); - - t1.Start(); - } - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - _queue.Clear(); - return _cleared; - } - - public void AddItem(NotificationQueueItem item) - { - _queue.Enqueue(item); - } - - public NotificationQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.Notification, Timestamp = DateTime.UtcNow }); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(1000); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/ReportDelivery/ReportDeliveryCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/ReportDelivery/ReportDeliveryCommand.cs deleted file mode 100644 index 227dfed2..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/ReportDelivery/ReportDeliveryCommand.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework.Workers.ReportDelivery -{ - public class ReportDeliveryCommand : ICommand - { - public ReportDeliveryCommand() - { - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(ReportDeliveryQueueItem item) - { - var logic = new ReportDeliveryLogic(); - await logic.Process(item); - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/ReportDelivery/ReportDeliveryQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/ReportDelivery/ReportDeliveryQueue.cs deleted file mode 100644 index 821c641e..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/ReportDelivery/ReportDeliveryQueue.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Autofac; -using Microsoft.Azure.Amqp.Serialization; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Helpers; -using Resgrid.Model.Providers; -using Resgrid.Model.Services; -using Resgrid.Providers.Bus; - -namespace Resgrid.Workers.Framework.Workers.ReportDelivery -{ - public class ReportDeliveryQueue : IQueue - { - private bool _cleared; - private object _lock; - private bool _isLocked; - private static Queue _queue; - - private IDepartmentsService _departmentsService; - private IScheduledTasksService _scheduledTasksService; - private IUsersService _usersService; - private readonly IEventAggregator _eventAggregator; - - public ReportDeliveryQueue(/*IDepartmentsService departmentsService, IScheduledTasksService scheduledTasksService, IUsersService usersService, */IEventAggregator eventAggregator) - { - //_departmentsService = departmentsService; - //_scheduledTasksService = scheduledTasksService; - //_usersService = usersService; - _eventAggregator = eventAggregator; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - - _departmentsService = Bootstrapper.GetKernel().Resolve(); - _scheduledTasksService = Bootstrapper.GetKernel().Resolve(); - _usersService = Bootstrapper.GetKernel().Resolve(); - - Task t1 = new Task(async () => - { - try - { - var allItems = await _scheduledTasksService.GetUpcomingScheduledTasksAsync(); - - Dictionary departments = new Dictionary(); - foreach (var item in allItems) - { - if (!departments.ContainsKey(item.DepartmentId)) - departments.Add(item.DepartmentId, await _departmentsService.GetDepartmentByIdAsync(item.DepartmentId)); - } - - // TODO: There is a bug here, might not have st.DepartmentId if it's old - // Filter only the past items and ones that are 5 minutes 30 seconds in the future - var items = from st in allItems - let department = departments[st.DepartmentId] - let email = _usersService.GetMembershipByUserId(st.UserId).Email - let runTime = st.WhenShouldJobBeRun(TimeConverterHelper.TimeConverter(DateTime.UtcNow, department)) - where - st.TaskType == (int) TaskTypes.ReportDelivery && runTime.HasValue && - runTime.Value >= TimeConverterHelper.TimeConverter(DateTime.UtcNow, department) && - runTime.Value <= TimeConverterHelper.TimeConverter(DateTime.UtcNow, department).AddMinutes(5).AddSeconds(30) - select new - { - ScheduledTask = st, - Department = department, - Email = email - }; - - foreach (var i in items) - { - var qi = new ReportDeliveryQueueItem(); - qi.ScheduledTask = i.ScheduledTask; - qi.Department = i.Department; - qi.Email = i.Email; - - _queue.Enqueue(qi); - } - - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _departmentsService = null; - _scheduledTasksService = null; - _usersService = null; - } - - }); - - t1.Start(); - } - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - _queue.Clear(); - return _cleared; - } - - public void AddItem(ReportDeliveryQueueItem item) - { - _queue.Enqueue(item); - } - - public ReportDeliveryQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.ReportDelivery, Timestamp = DateTime.UtcNow }); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(1000); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/ShiftNotifier/ShiftNotifierCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/ShiftNotifier/ShiftNotifierCommand.cs deleted file mode 100644 index ffabad06..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/ShiftNotifier/ShiftNotifierCommand.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework.Workers.ShiftNotifier -{ - public class ShiftNotifierCommand : ICommand - { - public ShiftNotifierCommand() - { - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(ShiftNotifierQueueItem item) - { - var logic = new ShiftNotifierLogic(); - await logic.Process(item); - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/ShiftNotifier/ShiftNotifierQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/ShiftNotifier/ShiftNotifierQueue.cs deleted file mode 100644 index 7ae4f8c8..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/ShiftNotifier/ShiftNotifierQueue.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Autofac; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Providers; -using Resgrid.Model.Services; -using Resgrid.Providers.Bus; - -namespace Resgrid.Workers.Framework.Workers.ShiftNotifier -{ - public class ShiftNotifierQueue : IQueue - { - private bool _cleared; - private object _lock; - private bool _isLocked; - private static Queue _queue; - - private IShiftsService _shiftsService; - private IUserProfileService _userProfileService; - private readonly IEventAggregator _eventAggregator; - - public ShiftNotifierQueue(/*IShiftsService shiftsService, IUserProfileService userProfileService, */IEventAggregator eventAggregator) - { - //_shiftsService = shiftsService; - //_userProfileService = userProfileService; - _eventAggregator = eventAggregator; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - - _shiftsService = Bootstrapper.GetKernel().Resolve(); - _userProfileService = Bootstrapper.GetKernel().Resolve(); - - var t1 = new Task(async () => - { - try - { - var shifts = await _shiftsService.GetShiftsStartingNextDayAsync(DateTime.UtcNow); - - foreach (var shift in shifts) - { - var qi = new ShiftNotifierQueueItem(); - - if (shift.Personnel != null && shift.Personnel.Any()) - qi.Profiles = await _userProfileService.GetSelectedUserProfilesAsync(shift.Personnel.Select(x => x.UserId).ToList()); - - qi.Day = shift.GetShiftDayforDateTime(DateTime.UtcNow.AddDays(1)); - if (qi.Day != null) - { - if (qi.Profiles == null) - qi.Profiles = new List(); - - qi.Signups = await _shiftsService.GetShiftSignpsForShiftDayAsync(qi.Day.ShiftDayId); - - if (qi.Signups != null && qi.Signups.Any()) - { - qi.Profiles.AddRange(await _userProfileService.GetSelectedUserProfilesAsync(qi.Signups.Select(x => x.UserId).ToList())); - - var users = new List(); - foreach (var signup in qi.Signups) - { - if (signup.Trade != null) - { - if (!String.IsNullOrWhiteSpace(signup.Trade.UserId)) - users.Add(signup.Trade.UserId); - else if (signup.Trade.TargetShiftSignup != null) - users.Add(signup.Trade.TargetShiftSignup.UserId); - } - } - - if (users.Any()) - qi.Profiles.AddRange(await _userProfileService.GetSelectedUserProfilesAsync(users)); - } - } - - qi.Shift = shift; - - _queue.Enqueue(qi); - } - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _shiftsService = null; - _userProfileService = null; - } - }); - - t1.Start(); - } - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - _queue.Clear(); - - return _cleared; - } - - public void AddItem(ShiftNotifierQueueItem item) - { - _queue.Enqueue(item); - } - - public ShiftNotifierQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.ShiftNotifier, Timestamp = DateTime.UtcNow }); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(1000); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/StaffingSchedule/StaffingScheduleCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/StaffingSchedule/StaffingScheduleCommand.cs deleted file mode 100644 index d6535f64..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/StaffingSchedule/StaffingScheduleCommand.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework -{ - public class StaffingScheduleCommand : ICommand - { - public StaffingScheduleCommand() - { - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(StaffingScheduleQueueItem item) - { - var logic = new StaffingScheduleLogic(); - await logic.Process(item); - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/StaffingSchedule/StaffingScheduleQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/StaffingSchedule/StaffingScheduleQueue.cs deleted file mode 100644 index fe21cc26..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/StaffingSchedule/StaffingScheduleQueue.cs +++ /dev/null @@ -1,167 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Autofac; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Helpers; -using Resgrid.Model.Providers; -using Resgrid.Model.Services; -using Resgrid.Providers.Bus; - -namespace Resgrid.Workers.Framework -{ - public class StaffingScheduleQueue : IQueue - { - private bool _cleared; - private object _lock; - private bool _isLocked; - private static Queue _queue; - - private IDepartmentsService _departmentsService; - private IScheduledTasksService _scheduledTasksService; - private readonly IEventAggregator _eventAggregator; - - public StaffingScheduleQueue(/*IDepartmentsService departmentsService, IScheduledTasksService scheduledTasksService, */IEventAggregator eventAggregator) - { - //_departmentsService = departmentsService; - //_scheduledTasksService = scheduledTasksService; - _eventAggregator = eventAggregator; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - Logging.LogTrace("StaffingJob: Entering PopulateQueue"); - - if (!_isLocked) - { - _isLocked = true; - _departmentsService = Bootstrapper.GetKernel().Resolve(); - _scheduledTasksService = Bootstrapper.GetKernel().Resolve(); - - var t1 = new Task(async () => - { - try - { - var allItems = await _scheduledTasksService.GetUpcomingScheduledTasksAsync(); - Logging.LogTrace(string.Format("StaffingJob: Analyzing {0} schedule tasks", allItems.Count)); - - Dictionary departments = new Dictionary(); - foreach (var item in allItems) - { - if (!departments.ContainsKey(item.DepartmentId)) - departments.Add(item.DepartmentId, await _departmentsService.GetDepartmentByIdAsync(item.DepartmentId)); - } - - // TODO: Prob a bug here as st.DepartmentId can be null - // Filter only the past items and ones that are 5 minutes 30 seconds in the future - var items = from st in allItems - let department = departments[st.DepartmentId] - let runTime = st.WhenShouldJobBeRun(TimeConverterHelper.TimeConverter(DateTime.UtcNow, department)) - where - (st.TaskType == (int) TaskTypes.DepartmentStaffingReset || st.TaskType == (int) TaskTypes.UserStaffingLevel) && - runTime.HasValue && runTime.Value >= TimeConverterHelper.TimeConverter(DateTime.UtcNow, department) && - runTime.Value <= TimeConverterHelper.TimeConverter(DateTime.UtcNow, department).AddMinutes(5).AddSeconds(30) - select new - { - ScheduledTask = st, - Department = department - }; - - foreach (var i in items) - { - var qi = new StaffingScheduleQueueItem(); - qi.ScheduledTask = i.ScheduledTask; - qi.Department = i.Department; - - _queue.Enqueue(qi); - } - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _departmentsService = null; - _scheduledTasksService = null; - } - }, TaskCreationOptions.LongRunning); - - t1.Start(); - } - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - _queue.Clear(); - - return _cleared; - } - - public void AddItem(StaffingScheduleQueueItem item) - { - _queue.Enqueue(item); - } - - public StaffingScheduleQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.StaffingChange, Timestamp = DateTime.UtcNow }); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(1000); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/StatusSchedule/StatusScheduleCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/StatusSchedule/StatusScheduleCommand.cs deleted file mode 100644 index 14db7bf4..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/StatusSchedule/StatusScheduleCommand.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework -{ - public class StatusScheduleCommand : ICommand - { - public StatusScheduleCommand() - { - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(StatusScheduleQueueItem item) - { - var logic = new StatusScheduleLogic(); - await logic.Process(item); - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/StatusSchedule/StatusScheduleQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/StatusSchedule/StatusScheduleQueue.cs deleted file mode 100644 index 74ba7126..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/StatusSchedule/StatusScheduleQueue.cs +++ /dev/null @@ -1,166 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Autofac; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Helpers; -using Resgrid.Model.Providers; -using Resgrid.Model.Services; - -namespace Resgrid.Workers.Framework -{ - public class StatusScheduleQueue : IQueue - { - private bool _cleared; - private object _lock; - private bool _isLocked; - private static Queue _queue; - - private IDepartmentsService _departmentsService; - private IScheduledTasksService _scheduledTasksService; - private readonly IEventAggregator _eventAggregator; - - public StatusScheduleQueue(/*IDepartmentsService departmentsService, IScheduledTasksService scheduledTasksService, */IEventAggregator eventAggregator) - { - //_departmentsService = departmentsService; - //_scheduledTasksService = scheduledTasksService; - _eventAggregator = eventAggregator; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - Logging.LogTrace("StatusJob: Entering PopulateQueue"); - - if (!_isLocked) - { - _isLocked = true; - _departmentsService = Bootstrapper.GetKernel().Resolve(); - _scheduledTasksService = Bootstrapper.GetKernel().Resolve(); - - var t1 = new Task(async () => - { - try - { - var allItems = await _scheduledTasksService.GetUpcomingScheduledTasksAsync(); - Logging.LogTrace(string.Format("StatusJob: Analyzing {0} schedule tasks", allItems.Count)); - - Dictionary departments = new Dictionary(); - foreach (var item in allItems) - { - if (!departments.ContainsKey(item.DepartmentId)) - departments.Add(item.DepartmentId, await _departmentsService.GetDepartmentByIdAsync(item.DepartmentId)); - } - - // TODO: Prob a bug here as st.DepartmentId can be null - // Filter only the past items and ones that are 5 minutes 30 seconds in the future - var items = from st in allItems - let department = departments[st.DepartmentId] - let runTime = st.WhenShouldJobBeRun(TimeConverterHelper.TimeConverter(DateTime.UtcNow, department)) - where - (st.TaskType == (int) TaskTypes.DepartmentStaffingReset || st.TaskType == (int) TaskTypes.UserStaffingLevel) && - runTime.HasValue && runTime.Value >= TimeConverterHelper.TimeConverter(DateTime.UtcNow, department) && - runTime.Value <= TimeConverterHelper.TimeConverter(DateTime.UtcNow, department).AddMinutes(5).AddSeconds(30) - select new - { - ScheduledTask = st, - Department = department - }; - - foreach (var i in items) - { - var qi = new StatusScheduleQueueItem(); - qi.ScheduledTask = i.ScheduledTask; - qi.Department = i.Department; - - _queue.Enqueue(qi); - } - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _departmentsService = null; - _scheduledTasksService = null; - } - }, TaskCreationOptions.LongRunning); - - t1.Start(); - } - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - _queue.Clear(); - - return _cleared; - } - - public void AddItem(StatusScheduleQueueItem item) - { - _queue.Enqueue(item); - } - - public StatusScheduleQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.StatusChange, Timestamp = DateTime.UtcNow }); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(1000); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/TrainingNotifier/TrainingNotifierCommand.cs b/Workers/Resgrid.Workers.Framework/Workers/TrainingNotifier/TrainingNotifierCommand.cs deleted file mode 100644 index 8d79e077..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/TrainingNotifier/TrainingNotifierCommand.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Threading.Tasks; -using Resgrid.Workers.Framework.Logic; - -namespace Resgrid.Workers.Framework.Workers.TrainingNotifier -{ - public class TrainingNotifierCommand : ICommand - { - public TrainingNotifierCommand() - { - Continue = true; - } - - public bool Continue { get; set; } - - public async Task Run(TrainingNotifierQueueItem item) - { - var logic = new TrainingNotifierLogic(); - await logic.Process(item); - return true; - } - } -} diff --git a/Workers/Resgrid.Workers.Framework/Workers/TrainingNotifier/TrainingNotifierQueue.cs b/Workers/Resgrid.Workers.Framework/Workers/TrainingNotifier/TrainingNotifierQueue.cs deleted file mode 100644 index 854f33ef..00000000 --- a/Workers/Resgrid.Workers.Framework/Workers/TrainingNotifier/TrainingNotifierQueue.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Autofac; -using Resgrid.Framework; -using Resgrid.Model; -using Resgrid.Model.Events; -using Resgrid.Model.Providers; -using Resgrid.Model.Services; -using Resgrid.Providers.Bus; - -namespace Resgrid.Workers.Framework.Workers.TrainingNotifier -{ - public class TrainingNotifierQueue : IQueue - { - private bool _cleared; - private object _lock; - private bool _isLocked; - private static Queue _queue; - - private ITrainingService _trainingService; - private readonly IEventAggregator _eventAggregator; - - public TrainingNotifierQueue(/*ITrainingService trainingService, */IEventAggregator eventAggregator) - { - //_trainingService = trainingService; - _eventAggregator = eventAggregator; - - _queue = new Queue(); - _cleared = false; - } - - public void PopulateQueue() - { - if (!_isLocked) - { - _isLocked = true; - - _trainingService = Bootstrapper.GetKernel().Resolve(); - - var t1 = new Task(async () => - { - try - { - var trainings = await _trainingService.GetTrainingsToNotifyAsync(DateTime.UtcNow); - - if (trainings != null) - { - foreach (var training in trainings) - { - var qi = new TrainingNotifierQueueItem(); - qi.Training = training; - - _queue.Enqueue(qi); - } - } - } - catch (Exception ex) - { - Logging.LogException(ex); - } - finally - { - _isLocked = false; - _cleared = false; - - _trainingService = null; - } - }); - - t1.Start(); - } - } - - public bool IsLocked - { - get { return _isLocked; } - } - - public void EnsureExist() - { - if (_queue == null) - _queue = new Queue(); - } - - public async Task Clear() - { - _cleared = true; - _queue.Clear(); - - return _cleared; - } - - public void AddItem(TrainingNotifierQueueItem item) - { - _queue.Enqueue(item); - } - - public TrainingNotifierQueueItem GetItem() - { - var item = _queue.Dequeue(); - - if (item == null) - PopulateQueue(); - - return item; - } - - public async Task> GetItems(int maxItemsToReturn) - { - var items = new List(); - - _eventAggregator.SendMessage(new WorkerHeartbeatEvent() { WorkerType = (int)JobTypes.TrainingNotifier, Timestamp = DateTime.UtcNow}); - - if (_queue.Count <= 0) - PopulateQueue(); - - while (_isLocked) - { - Thread.Sleep(1000); - } - - int count = 0; - if (_queue.Count < maxItemsToReturn) - count = _queue.Count; - else - count = maxItemsToReturn; - - for (int i = 0; i < count; i++) - { - if (_queue.Count > 0) - items.Add(_queue.Dequeue()); - } - - return items.AsEnumerable(); - } - } -} diff --git a/appveyor.yml b/appveyor.yml index 630e323b..1adc6445 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,7 +5,7 @@ pull_requests: skip_tags: true image: - - Visual Studio 2019 + - Visual Studio 2022 configuration: - Debug diff --git a/docker-compose.override.yml b/docker-compose.override.yml deleted file mode 100644 index a34b196a..00000000 --- a/docker-compose.override.yml +++ /dev/null @@ -1,22 +0,0 @@ -version: '3.4' - -services: - resgrid.webcore: - environment: - - ASPNETCORE_ENVIRONMENT=Production - - ASPNETCORE_URLS=http://+:80 - ports: - - "80" - volumes: - - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro - - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro - - resgrid.web.servicescore: - environment: - - ASPNETCORE_ENVIRONMENT=Production - - ASPNETCORE_URLS=http://+:80 - ports: - - "80" - volumes: - - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro - - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 991ba232..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: '3.4' - -services: - resgrid.webcore: - image: ${DOCKER_REGISTRY-}resgridwebcore - build: - context: . - dockerfile: Web/Resgrid.WebCore/Dockerfile - - resgrid.web.servicescore: - image: ${DOCKER_REGISTRY-}resgridwebservices - build: - context: . - dockerfile: Web/Resgrid.Web.ServicesCore/Dockerfile - - resgrid.workers.console: - image: ${DOCKER_REGISTRY-}resgridworkersconsole - build: - context: . - dockerfile: Workers/Resgrid.Workers.Console/Dockerfile diff --git a/docker-resgrid.env b/docker-resgrid.env deleted file mode 100644 index 7f6a97a9..00000000 --- a/docker-resgrid.env +++ /dev/null @@ -1,7 +0,0 @@ -RESGRID__CacheConfig__RedisConnectionString=x.x.x.x:6379,Password=,allowAdmin=True -RESGRID__DataConfig__ConnectionString=Server=x.x.x.x;Database=Resgrid;User Id=resgrid_app;Password=;MultipleActiveResultSets=True; -RESGRID__ServiceBusConfig__RabbbitPassword=**** -RESGRID__ServiceBusConfig__RabbitHostname=x.x.x.x -RESGRID__ServiceBusConfig__RabbitUsername=resgrid -RESGRID__SystemBehaviorConfig__ResgridApiBaseUrl=http://domain.example:81 -RESGRID__SystemBehaviorConfig__ResgridBaseUrl=http://domain.example:80 diff --git a/docs/source/installation/index.rst b/docs/source/installation/index.rst index 26a34d2b..5099e26a 100644 --- a/docs/source/installation/index.rst +++ b/docs/source/installation/index.rst @@ -4,12 +4,6 @@ Installation In this section we will go over all the steps needed to get Resgrid running on your own environment. -.. important:: Resgrid requires working **RabbitMQ**, **Redis** and **SQL** servers, more info in :ref:`installation_prerequisites` below and currently only runs on Microsoft Windows operating systems - -This documentation is for installation of Resgrid from compile source. If you want to install Resgrid from Docker containers please review that section instead. - - - .. _requirements: Requirements Notice @@ -18,7 +12,7 @@ Requirements Notice It is highly recommended that Resgrid is installed and setup by an IT Professional. There is a large amount of system configuration, tweaking and setup that is required to be done before you install Resgrid. Below is a list of technologies that you should have skilled professionals available to you or requisite knowledge before installing Resgrid. Resgrid does not provide support or configuration guidance for those systems outside of the minimum needed to get the system functional. The steps outlined below will get the system in a bare minimum functional state to ensure it's working on your enviroment, to be production ready will reqire more effort then is outlined in this documentation. * Windows or Linux -* Docker, Kubernetes, Rancher, K8s +* Docker, Kubernetes * SQL Server or PostgreSQL * DNS, hostname mapping, proxy configuration * RabbitMQ @@ -27,445 +21,97 @@ It is highly recommended that Resgrid is installed and setup by an IT Profession * Mail Server SMTP, POP3 * Firewall and system hardning -.. _installation_prerequisites: - -Prerequisites & Dependencies -**************************** - -`Resgrid `_ requires Microsoft .Net Core 3.1. and running on a Windows environment, Windows Server is recommended but not required. - -.. note:: Please ensure your Windows system is up to date with all Windows and Microsoft updates before installing the Resgrid System. - -The following server dependencies need to be installed, configured and functional: - -* `.Net Core 3.1 `_ Runtime for your architecture x86 or x64 -* `Erlang `_, needed for RabbitMQ -* `RabbitMQ Server `_, version 3.6.0 or newer -* `Redis Server `_, version 6.0.0 or newer -* `Microsoft SQL Server `_, version 12.0 (SQL 2014) or newer -* `Microsoft IIS `_ version installed on Windows 8 or newer or Windows Server 2012 or newer -* `Elastic ELK `_ 6.6.0 or newer -* SMTP Server for sending email - -.. note:: Any correctly configured SMTP server will work if it's local or not. If you have an SMTP server provided by your ISP or provider that will also work. For non-server Windows installations (i.e. Windows Home or Professional) we recommended `hMailServer `_. - -RabbitMQ -======================= - -To install RabbitMQ follow the `Windows Installation `_ guide. Ensure your firewall is configured to allow the ports listed in that guide through. It is also recommend you `enable the management UI `_ for RabbitMQ. - -.. note:: RabbitMQ requires Erlang to be installed. You can download the `Windows installer `_ at their website. - -You will need to grant Erl and Epmd access to the network if your using the Windows firewall. - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/RabbitMQFirewall.png - :width: 1100 - :alt: Firewall Options for Erl and Epmd - -Once RabbitMQ is installed and setup, and the Admin console is installed you will need to create the following user: - - | Username: resgrid - | Password: resgrid! - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/RabbitMQUserSetup.png - :width: 1100 - :alt: RabbitMQ User setup - -Once the user is setup you need to edit the "/" virtual host and grant permissions to that user to virtual host and topics. - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/RabbitMQVHost.png - :width: 1100 - :alt: RabbitMQ Virtual Host - -You'll want .*, for all regexp values for both Virtual Host and Topic Permissions. - -.. warning:: Once your system is setup and you've verified it working we highly creating a new username and password for Resgrid to use for RabbitMQ. - -Redis -======================= - -Redis is an standalone, resilient in memory data store that Redis uses to cache data that is shared across multiple servers. Redis is an optional dependency but is highly recommended for production installations of Resgrid. Redis does not run well on Windows and thus needs to be installed a Unix or Linux based system. You can get `Redis Server `_ from their website. Version 4.0 or newer is recommended. +.. _system_requirements: -Redis for Windows is not natively supported. To run on Windows you will need to install and configure WSL 2 and install and run Redis on that. - -`How to Install WSL 2 on Windows Server 2019 `_ - -Once you have WSL 2 installed and running with an Ubuntu 18.04 instance that's been upgraded you will need to install Redis server onto it. - - | sudo apt-get install redis-server - -When that command is done you can run the following to ensure that the cli got installed. - - | redis-cli -v - -For good measure, restart the redis-server to ensure that the service is running. - - | sudo service redis-server restart - -You can execute the following commands to test Redis server. - - | $ redis-cli - | 127.0.0.1:6379> set user:1 "Jane" - | 127.0.0.1:6379> get user:1 - | "Jane" - -You will need to ensure WSL is running when you run Resgrid, so open up a command prompt and type in 'wsl' to start up your installed Linux distro and verify that Redis is running. - -Elastic ELK -======================= - -To install ELK from Elastic follow the `Elasticsearch MSI Installer `_ and the Kilbana `Install Instructions `_. You don't need Logstash as Resgrid can log directly to Elasticsearch. When installing Elasticsearch ensure it's port is externally accessible. - -Microsoft IIS -======================= - -Installing Microsoft IIS (Webserver) will differ based on what version of Windows you are using; for example Windows 8 or Windows Server 2016. For you specific version of Windows - -.. list-table:: IIS Options - :header-rows: 1 - - * - Section - - Sub Section - - Option - * - Web Management Tools - - - - IIS Management Console - * - World Wide Web Services - - Application Development Features - - .Net Extensibility 3.5 - * - World Wide Web Services - - Application Development Features - - .Net Extensibility 4.7 - * - World Wide Web Services - - Application Development Features - - ASP.NET 3.5 - * - World Wide Web Services - - Application Development Features - - ASP.NET 4.7 - * - World Wide Web Services - - Application Development Features - - ISAPI Extensions - * - World Wide Web Services - - Application Development Features - - ISAPI Filters - * - World Wide Web Services - - Application Development Features - - WebSockets Protocol - * - World Wide Web Services - - Common HTTP Features - - Default Document - * - World Wide Web Services - - Common HTTP Features - - HTTP Errors - * - World Wide Web Services - - Common HTTP Features - - HTTP Redirection - * - World Wide Web Services - - Common HTTP Features - - Static Content - * - World Wide Web Services - - Performance Features - - Dynamic Content Compression - * - World Wide Web Services - - Performance Features - - Static Content Compression - * - World Wide Web Services - - Security - - Basic Authentication - * - World Wide Web Services - - Security - - IP Security - -.. note:: Depending on the requirements of your web server, environment and other factors your installed IIS options may be different. Resgrid requires at a minimum the .NET Extensibility and ASP.NET Options to run minimally. - -Install .Net Core -**************************** -Once you have IIS Installed you need to install .Net Core 3.1 and the .Net Core 3.1 IIS Hosting bundle. You can download the bundle here `.Net Core 3.1 Hosting Bundle `_. - -Install Resgrid +System Requirements **************************** -Download the latest stable release from the `Resgrid Core Github Releases `_ page. Pre-release or Beta versions will also be available for download but should not be used in production systems. Instead should only be used for testing or evaluating new features or functionality. - -Once you've download the release package extract the zip folder to your computer. It will reveal the directory structure in the table below. - -.. list-table:: Resgrid Folder Structure - :header-rows: 1 - - * - Folder - - Description - * - Api - - Resgrid.Services API web application that will need to be exposed via IIS - * - Config - - Contains the ResgridConfig.json document to configure the Resgrid system - * - Tools - - Various tools, both UI and CLI to interact with Resgrid from the server - * - Web - - The primary Resgrid web application that will need to be exposed via IIS - * - Workers - - Backend workers to enable processing of async and scheduled tasks +The all-in-one docker installation is suitable for a deparment of around 50 personnel on a machine with 32GB of RAM, 500GB of storage and a 8 logical processors. But depending on call volume or user ineraction patterns may require more. -The default installation location for Resgrid is C:\\Resgrid, with the Api, Config, Tools, Web and Workers folder underneath that. So the full path to the config file is C:\\Resgrid\\Config\\ResgridConfig.json. You can install Resgrid wherever you want, but you will need to update each application's config file (app.config, web.config or appsettings.json) with the correct path to the ResgridConfig.json file. +We do not recommend that mission critial systems be installed on a single machine. Resgrid is split into multiple containers to allow for multiple machines to be used. -Create a new folder on your C:\\ Drive called "Resgrid" and copy the above 5 folders, that you extracted from the zip downloaded from Github, into that directory. +A mission-critial production environment will require a minimum of 10 servers: +* 2 Load Balanced Web servers +* 2 Load Balanced API servers +* 1 Microsoft Sql Server +* 1 Worker server +* 1 Events server +* 1 Redis server +* 1 RabbitMQ server +* 1 Elasticsearch server (ELK) -Setup Hosts File -======================= +Sizing of these servers will depend on your departments amount of users and call volume. -Run Notepad as Administrator, open up the hosts file in the following directory 'C:\\Windows\\System32\\drivers\\etc' and add the following lines at the bottom. - - | 127.0.0.1 resgrid.local - | 127.0.0.1 resgridapi.local - | 127.0.0.1 rgdevinfaserver.local - | 127.0.0.1 rgdevserver - | 127.0.0.1 rgdevinfaserver - -This will allow you to access locally on the box using the above domain names. If you have your own names you can use those in the IIS configuration below. If you already have the entries into your hosts file you do not need to add them again. - -.. note:: If you are installing Resgrid components on multiple systems (i.e. web server boxes, api boxes, database server, etc) replace '127.0.0.1' with the static IP address of the server where those components are installed. +.. _installation_prerequisites: -Database Installation +Prerequisites & Dependencies **************************** -You will need to install and configure Microsoft SQL Server you can find tutorials online an example of one is `from tutorialpoint `_. You will need SQL Server and SQL Management Studio which can be `downloaded from Microsoft `_. - -Microsoft SQL Server -======================= +To run the Resgrid containers you will need the following: -.. important:: Resgrid only supports SQL Server 2014 or newer and we recommend SQL 2016 SP1 or newer. A server collation of "SQL_Latin1_General_CP1_CI_AS" is also required. +* Docker +Install `Docker `, either using a native package or Docker Desktop. -For the most basic SQL Server installation you will need "Database Engine Services" and "Management Tools". If Management Tools isn't available for your SQL Install. +.. note:: All Resgrid container images are based on Linux, users of Docker for Windows will need to ensure that `Docker is using Linux containers `. -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/SQLServerOptions1.png - :width: 800 - :alt: SQL Install Options 1 +* A minimum of 24GB RAM assigned to Docker -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/SQLServerOptions2.png - :width: 800 - :alt: SQL Install Options 2 + With Docker for Mac, the amount of RAM dedicated to Docker can be set using the UI: see `How to increase docker-machine memory Mac `. -SQL Server can be installed as a "Default Instance" or "Named Instance" the standard way Resgrid is configured out of the box is a locally installed Default Instance of SQL Server. If you are installing SQL Server on another server then the Resgrid applications or you are configuring SQL to be a Named Instance you will need to modify the ResgridConfig.json which is located in the Config directory of the Resgrid installation folder. Default location is C:\\Resgrid\\Config\\. + In Docker Desktop for Windows, `use the *Advanced* tab to adjust limits on resources available to Docker `. -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/SQLServerInstance.png - :width: 800 - :alt: SQL Instance Setup +* A limit on mmap counts equal to 262,144 or more + + On Linux, use `sysctl vm.max_map_count` on the host to view the current value, and see `Elasticsearch's documentation on virtual memory ` for guidance on how to change this value. Note that the limits **must be changed on the host**; they cannot be changed from within a container. -During the installation of SQL Server you will need to set the collation for the SQL server. Resgrid requires "SQL_Latin1_General_CP1_CI_AS", but this can also be set at the Database level if this SQL Server is shared. + If using Docker for Mac, then you will need to start the container with the `MAX_MAP_COUNT` environment variable (set to at least 262144 (using e.g. `docker`'s `-e` option) to make it sets the limits on mmap counts at start-up time. -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/SQLServerCollation.png - :width: 800 - :alt: SQL Server SQL_Latin1_General_CP1_CI_AS Collation +* Docker Compose +Install `Docker Compose ` -For Resgrid you will need to use the Mixed Mode Authentication setting, this allows SQL server to use it's own internal account in addition to Windows or Domain accounts. Specify any password you wish in the "Enter password" and "Confirm password" boxes (they need to match) this will be your admin or system admin sql password. Also Add Current User to the SQL Server administrators list on this view. - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/SQLServerAuth.png - :width: 800 - :alt: SQL Server SQL_Latin1_General_CP1_CI_AS Collation - -.. note:: If your using a Named SQL server instance, i.e. any SQL instance that's not the default instance and your are supplying the named instance name in the ResgridConfig.json file you will need to use double back slash's in between the server and SQL instance name. For example if you have a named SQL instance SQL2014 on the locally installed SQL server you need to specify the DataSource as "(local)\\\\SQL2014" with 2 backslashes "\\" in between the server and instance names. - -Database Creation -======================= - -Once you have Microsoft SQL and Microsoft SQL Management Studio installed; open up Microsoft SQL Management studio, connect to your SQL Server and create an empty database called Resgrid. - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/SQLDatabase.png - :width: 800 - :alt: Database Creation 1 - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/SQLDatabaseOptions.png - :width: 800 - :alt: Database Creation 2 - -You will also need to create a 'ResgridWorkers' database as well with the same options as the Resgrid database. - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/SQLDatabaseWorkers.png - :width: 800 - :alt: Database Workers Creation - -Once the databases are created you will need to create a new SQL user for Resgrid to connect to the 2 databases on this SQL Server. You will be using the "SQL Server authentication" mode for this user. - - | Login Name: resgrid_app - | Password: resgrid123 - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/SQLServerRGUser.png - :width: 800 - :alt: Database User Setup - -Uncheck "Enforce password expiration" and "User must change password at next login" options on this view. Once you have that setup, click the "User Mapping" page in the upper left hand corner of this window. - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/SQLServerRGUser2.png - :width: 800 - :alt: Database User Setup 2 - -Check the checkbox next to "Resgrid" database and then select the "db_owner" database role for this user. Do the same for the "ResgridWorkers" database as well. - -.. warning:: Once your system is setup and you've verified it working we highly creating a new SQL user with a custom Login name and password to secure your installation. Your SQL Server should also not be directly connected to the internet or have any SQL ports directly accessible over the Internet. Review Microsoft's guidance for securing your SQL Server `Securing SQL Server `_ - -SQL Server Network Configuration -======================= - -Resgrid uses TCP/IP based connections to connect to the SQL Server database. By default most installations of SQL Server have TCP/IP disabled by default. To enable, you need to start up the "SQL Server Configuration Manager" application and enable the TCP/IP protocol for the SQL Server Network Configuration. - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/SQLServerNetworkConfig.png - :width: 600 - :alt: SQL Configuration Manager - -Note, you will need to restart the system, or at a minimum the SQL Server instance (MSSQLSERVER), for the above change to take effect. If the TCP/IP protocol is already enabled for your install SQL Server instance you can continue without making any changes. - -Install or Update Resgrid Schema -======================= - -Open up the Windows Command Prompt (cmd) and type: - - cd C:\\Resgrid\\Tools\\ - -your command prompt should now read "C:\\Resgrid\\Tools>". You can now type the following command into the command prompt: - - Resgrid.Console.exe dbupdate - -That will start the Resgrid Database Update process and either Update or Install your Resgrid database. If everything worked correctly you should see close to the following output: - - C:\\Resgrid\\Tools>Resgrid.Console.exe dbupdate - Resgrid Console - ----------------------------------------- - Starting the Resgrid Database Update Process - Please Wait... - Completed updating the Resgrid Database! - - - C:\\Resgrid\\Tools> - -This will be run when your upgrading your Resgrid installation as well. If you installed (unzipped and copied) Resgrid to another path other then C:\\Resgrid ensure you are opening the command prompt to that directory instead of C:\\Resgrid. - -Windows User Creation -**************************** - -You will need to create a local Windows User and grant that user access to the Resgrid directory and all sub-directories. Open Computer Management (or any tool where you can add a new local user) and create a new user. In the example below we used the username 'resgrid' for this user and set a password that meeting the local security policy. - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/WindowsUserCreation1.png - :width: 600 - :alt: Windows Create User 1 - -Ensure this account's password won't expire automatically and doesn't need to be reset at first login. - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/WindowsUserCreation2.png - :width: 600 - :alt: Windows Create User 2 +* Open Ports 5151 through 5165 +* SMTP Server for sending email -Once the user has been created navigate to the location of where you extracted the Resgrid zip file, C:\\Resgrid by default. Right click the Resgrid folder, select Properties, select the Security tab and then click edit. You'll want to add the user you created above to this directory and give it "Full Control". +.. note:: Any correctly configured SMTP server will work if it's local or not. If you have an SMTP server provided by your ISP or provider that will also work. -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/WindowsSetDirectoryPerms.png - :width: 600 - :alt: Windows Create User 2 +.. _docker_compose: -IIS Installation +Docker Compose Setup **************************** -Run the 'Internet Information Services (IIS) Manager' and expand the top server node and the Sites node in the tree view on the left hand side. If you don't have 2 sites called 'resgrid' and 'resgridapi' you will need to add those sites. Right click the Sites folder and select "Add Website" - -.. list-table:: Resgrid Web Website Options - :header-rows: 1 - - * - Option - - Value - * - Site name - - resgrid - * - Physical path - - C:\\Resgrid\\Web - * - Binding Type - - https (Select from the drop-down) - * - Host name - - resgrid.local - * - SSL certificate - - *Select Any* - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/IISSetup.png - :width: 600 - :alt: IIS Site Setup - -Click the "Connect As" button and supply the credentials for the Windows Local user you created in the section above. - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/IISSetupConntectAs.png - :width: 600 - :alt: IIS Site Connect As +Download and Extract Package +================ -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/IISSetupConntectAs2.png - :width: 600 - :alt: IIS Site Connect As 2 +Download the resgrid.tgz Asset file from the latest `Resgrid GitHub Release `:: - You can press the "Test Settings" button and both options should be green. + wget https://github.com/Resgrid/Core/releases/download/vXX.XX.XX/resgrid.tgz - .. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/IISSetupConntectAsTest.png - :width: 600 - :alt: IIS Site Connect As Test +.. note:: Esnure you replace vXX.XX.XX in that url to the version number of the Github release you are trying to download. - If one or both of those options in the "Test Settings" are not green, there is an access issue reading the directory on disk. You'll need to reset the permissions on the folder and all sub-folders and ensure the correct user is given access. +Extract the tgz package file:: -.. list-table:: Resgrid API Website Options - :header-rows: 1 + tar -xvzf resgrid.tgz - * - Option - - Value - * - Site name - - resgridapi - * - Physical path - - C:\\Resgrid\\Api - * - Host name: - - resgridapi.local +You should now have a folder called resgrid in your current directory. -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/IISSetupAPI.png - :width: 800 - :alt: IIS API Site Setup +Setting Enviorment Variables +================ -Click the "Connect As" button and supply the credentials for the Windows Local user you created in the section above. - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/IISSetupConntectAs.png - :width: 600 - :alt: IIS Site Connect As - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/IISSetupConntectAs2.png - :width: 600 - :alt: IIS Site Connect As 2 - - You can press the "Test Settings" button and both options should be green. - - .. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/IISSetupConntectAsTest.png - :width: 600 - :alt: IIS Site Connect As Test - - If one or both of those options in the "Test Settings" are not green, there is an access issue reading the directory on disk. You'll need to reset the permissions on the folder and all sub-folders and ensure the correct user is given access. - -Your IIS Server should look like this for the Websites and Application Pools views: - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/IISOverview.png - :width: 800 - :alt: IIS Overview - -.. image:: https://raw.githubusercontent.com/resgrid/core/master/misc/images/IISApps.png - :width: 800 - :alt: IIS Application Pools - -.. important:: If you don't have a valid SSL certificate you can create a self-signed certificate by using `these instructions `_. You cannot use a self-signed certificate for the resgridapi IIS website as self-signed certificated will be rejected by the applications. We *HIGHLY* recommend you get valid SSL Certificates from a trusted vender and have both the resgrid and resgridapi protected by those. - -.. note:: If you are using a Self Signed or Development SSL certificate you will get a Certificate Warning using any modern web browser. If your url is pointing to localhost,127.0.0.1,resgrid.local or resgridapi.local it is safe to proceed to the website and bypass that certificate error. We do not recommend doing that on public websites. - -.. warning:: The above IIS configuration is to give you a started place to access the Resgrid Application and API locally, it not a valid configuration for an externally exposed service. You will need to harden your IIS installation, setup SSL, reduce permissions and grant least privlige users (in addition to other steps) to expore Resgrid externally. - -Running the Workers -**************************** +Resgrid's docker containers are configured using enviorment variables defined in the ``resgrid.env`` file within the resgrid folder. Edit this file and configure the variables as needed for your enviorment. Please pay speical attention to the the (required) variables. -Resgrid uses a worker application(s) to do back end, out of band processing. The worker must be work for automated processes to function and for operations like dispatching to work correctly. +Run the Docker Compose +================ +Once you have setup the enviorment variables you can now run the docker compose file.:: -Open up the Windows Command Prompt (cmd) and type: + docker-compose up - cd C:\\Resgrid\\Workers\\ +That will run the ineractive version of the containers, Crtl+C will stop the containers. -Your command prompt should now read "C:\\Resgrid\\Workers>". You can now type the following command into the command prompt: +If you want to run the containers in the background, use the `-d` option:: - Resgrid.Workers.Console.exe run + docker-compose up -d -Like the command prompt running Redis you need to leave this window open to keep the workers process active. +The Resgrid system will take about 5 minutes to start up fully, this is due to the startup order of the containers. The last container to startup will be the `web` container, once that one is ready, you can now access the system. Important Note About Support **************************** @@ -475,5 +121,5 @@ Resgrid is a complex system that can scale from a single instance to dozens of s Initial Web Login **************************** -Once you have completed the steps above you will be able to log into the web applications user interface. Open up a web browser and navigate to https://resgrid.local, you will then be prompted by the login screen. Your default administrator credentials are **admin/changeme1234**. Once you log into the system it's recommended that you change your admin password from the Edit Profile page by clicking on the Administrator name in the upper left hand corner. +Once you have completed the steps above you will be able to log into the web applications user interface. Open up a web browser and navigate to http://localhost:5151, you will then be prompted by the login screen. Your default administrator credentials are **admin/changeme1234**. Once you log into the system it's recommended that you change your admin password from the Edit Profile page by clicking on the Administrator name in the upper left hand corner.